From c4887c5f3f0a4419cad707f08d086ae87c630c40 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:30:25 -0500 Subject: [PATCH] Import 2.3.41pre3 --- Documentation/Configure.help | 20 + Documentation/usb/ibmcam.txt | 13 +- Documentation/usb/ov511.txt | 10 +- Documentation/usb/scanner-hp-sane.txt | 21 +- Documentation/usb/scanner.txt | 133 +- Documentation/usb/usb-serial.txt | 14 +- arch/i386/Makefile | 11 +- arch/i386/config.in | 6 +- arch/i386/kernel/apm.c | 17 +- arch/i386/mm/init.c | 2 +- arch/sparc/config.in | 3 +- arch/sparc/kernel/ebus.c | 100 +- arch/sparc/kernel/ioport.c | 11 +- arch/sparc/kernel/pcic.c | 163 +- arch/sparc/kernel/sys_sunos.c | 4 +- drivers/block/Config.in | 21 +- drivers/block/alim15x3.c | 4 + drivers/block/hpt366.c | 28 +- drivers/block/ide-disk.c | 2 +- drivers/block/ide-pci.c | 89 +- drivers/block/ide-probe.c | 1 + drivers/block/ide-tape.c | 29 +- drivers/block/ide.c | 17 +- drivers/block/paride/Config.in | 11 + drivers/block/piix.c | 104 +- drivers/cdrom/Config.in | 4 +- drivers/cdrom/cdrom.c | 2 + drivers/char/Config.in | 4 +- drivers/char/ftape/Config.in | 8 +- drivers/net/wan/Config.in | 2 +- drivers/parport/procfs.c | 2 +- drivers/pci/compat.c | 4 +- drivers/pci/gen-devlist.c | 2 +- drivers/pci/pci.c | 20 +- drivers/pci/proc.c | 26 +- drivers/sbus/audio/amd7930.c | 6 +- drivers/sbus/char/Makefile | 7 + drivers/sbus/char/uctrl.c | 4 +- drivers/sbus/char/vfc_i2c.c | 2 +- drivers/scsi/3w-xxxx.c | 2308 ++++++++++++++++++ drivers/scsi/3w-xxxx.h | 418 ++++ drivers/scsi/53c7xx.c | 1 - drivers/scsi/Config.in | 20 +- drivers/scsi/Makefile | 8 + drivers/scsi/hosts.c | 8 + drivers/sgi/char/graphics.c | 10 +- drivers/sgi/char/shmiq.c | 10 +- drivers/usb/Config.in | 7 +- drivers/usb/bitstream.h | 1508 ------------ drivers/usb/dabfirmware.h | 1408 +++++++++++ drivers/usb/firmware.h | 3213 ------------------------- drivers/usb/graphire.c | 20 +- drivers/usb/hid.c | 30 +- drivers/usb/ibmcam.c | 320 ++- drivers/usb/ibmcam.h | 10 + drivers/usb/mousedev.c | 45 +- drivers/usb/ov511.c | 34 +- drivers/usb/scanner.c | 400 ++- drivers/usb/scanner.h | 55 + drivers/usb/uhci-debug.h | 56 +- drivers/usb/usb-core.c | 2 +- drivers/usb/usb-debug.c | 18 - drivers/usb/usb-ohci.c | 5 +- drivers/usb/usb-serial.c | 33 +- drivers/usb/usb-uhci.c | 226 +- drivers/usb/usb-uhci.h | 3 +- drivers/usb/usb.c | 28 +- drivers/usb/usb.h | 39 +- drivers/usb/usb_scsi.c | 1398 ++++++----- drivers/usb/usb_scsi.h | 82 +- drivers/usb/usb_scsi_debug.c | 146 +- drivers/usb/usbkbd.c | 3 +- drivers/usb/usbmouse.c | 3 +- drivers/video/Config.in | 9 +- drivers/video/fbcon.c | 2 +- drivers/video/skeletonfb.c | 3 +- fs/Config.in | 82 +- fs/block_dev.c | 2 +- fs/devices.c | 4 +- fs/ncpfs/mmap.c | 12 +- fs/nfs/write.c | 4 +- fs/partitions/Config.in | 18 +- fs/partitions/check.c | 1 - fs/select.c | 130 +- fs/super.c | 2 +- include/asm-sparc/io.h | 11 +- include/asm-sparc/irq.h | 3 +- include/asm-sparc/pci.h | 3 + include/linux/fs.h | 6 +- include/linux/hdreg.h | 1 + include/linux/hfs_sysdep.h | 2 +- include/linux/isapnp.h | 2 +- include/linux/kdev_t.h | 2 +- include/linux/pci.h | 12 +- include/linux/smp.h | 1 + ipc/shm.c | 13 +- kernel/sched.c | 2 +- kernel/sysctl.c | 2 +- mm/filemap.c | 23 +- net/irda/af_irda.c | 2 +- net/packet/af_packet.c | 11 +- net/sunrpc/xprt.c | 2 +- 102 files changed, 6708 insertions(+), 6461 deletions(-) create mode 100644 drivers/scsi/3w-xxxx.c create mode 100644 drivers/scsi/3w-xxxx.h delete mode 100644 drivers/usb/bitstream.h create mode 100644 drivers/usb/dabfirmware.h delete mode 100644 drivers/usb/firmware.h create mode 100644 drivers/usb/scanner.h diff --git a/Documentation/Configure.help b/Documentation/Configure.help index 8ee3e4600766..2eca295c52aa 100644 --- a/Documentation/Configure.help +++ b/Documentation/Configure.help @@ -8001,6 +8001,21 @@ CONFIG_INPUT_MOUSEDEV_MIX into one misc device. If you say N, you'll have a separate device for each your USB mouse. +Support for digitizers +CONFIG_INPUT_MOUSEDEV_DIGITIZER + Use this if you have a digitizer that doesn't emulate a mouse + itself, and want to use it as a mouse. + +Horizontal screen resolution +CONFIG_INPUT_MOUSEDEV_SCREEN_X + For the mouse emulation to be correct, the mousedev driver needs + to know the screen resolution you are using (in X). + +Vertical screen resolution +CONFIG_INPUT_MOUSEDEV_SCREEN_Y + For the mouse emulation to be correct, the mousedev driver needs + to know the screen resolution you are using (in X). + Joystick support CONFIG_INPUT_JOYDEV Say Y here if you want your USB HID joystick or gamepad to be @@ -11827,6 +11842,11 @@ CONFIG_SUN_MOSTEK_RTC Say Y here unless you are building a special purpose kernel. +JavaStation OS Flash SIMM (EXPERIMENTAL) +CONFIG_SUN_JSFLASH + This option enables a driver for JavaStation OS Flash driver. + Say N unless you want to boot from your Flash SIMM. + #Siemens SAB82532 serial support #CONFIG_SAB82532 ### diff --git a/Documentation/usb/ibmcam.txt b/Documentation/usb/ibmcam.txt index e668dfc71adf..4d7ab56ebf12 100644 --- a/Documentation/usb/ibmcam.txt +++ b/Documentation/usb/ibmcam.txt @@ -27,7 +27,7 @@ it is manufactured by Xirlink. See http://www.xirlink.com WHAT YOU NEED: -- A camera +- An IBM C-it camera - A Linux box with USB support (2.3/2.4 or 2.2 w/backport) @@ -94,7 +94,7 @@ flags This is a bit mask, and you can combine any number of Will work with xawtv, will not with xrealproducer. Default is not set. - FLAGS_MONOCHROME 2 Forces monochrome (b/w) mode. + FLAGS_MONOCHROME 2 Activates monochrome (b/w) mode. FLAGS_DISPLAY_HINTS 4 Shows colored pixels which have magic meaning to developers. FLAGS_OVERLAY_STATS 8 Shows tiny numbers on screen, @@ -152,13 +152,12 @@ WHAT NEEDS TO BE DONE: - On occasion camera produces negative image (funny colors.) Workaround: reload the driver module. Reason: [1]. - The button on the camera is not used. I don't know how to get to it. -- The LED on the camera goes off after video init. [1] -- I2O interface does not read what camera reports back. Actually, it - reads it, but I don't know what returned data means. If camera fails - at some initialization stage then something should be done, and I don't - do that because I don't even know that some command failed. +- Camera reports its status back to the driver; however I don't know + what returned data means. If camera fails at some initialization + stage then something should be done, and I don't do that because + I don't even know that some command failed. CREDITS: diff --git a/Documentation/usb/ov511.txt b/Documentation/usb/ov511.txt index 3a73afc0dcdc..fe84f11df461 100644 --- a/Documentation/usb/ov511.txt +++ b/Documentation/usb/ov511.txt @@ -11,10 +11,6 @@ This is a preliminary version of my OV511 Linux device driver. Currently, it can grab a frame in color (YUV420) at 640x480 or 320x240 using either vidcat or xawtv. Other utilities may work but have not yet been tested. -NOTE: 320x240 does not work reliably for me, and causes complete system crashes. - I recommend not using it until a later version, and if you do, run "sync" - first. - SUPPORTED CAMERAS: ________________________________________________________ Manufacturer | Model | Custom ID | Status @@ -24,6 +20,7 @@ D-Link | DSB-C300 | 3 | Working Creative Labs | WebCam 3 | 21 | Working Lifeview | RoboCam | 100 | Untested AverMedia | InterCam Elite | 102 | Working +MediaForte | MV300 | 112 | Untested -------------------------------------------------------- Any camera using the OV511 and the OV7610 CCD should work with this driver. The @@ -39,7 +36,8 @@ WHAT YOU NEED: http://www.ovt.com/omniusbp.html - A Video4Linux compatible frame grabber program (I recommend vidcat and xawtv) - (see: http://www.exploits.org/v4l/ ) + 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 HOW TO USE IT: @@ -83,7 +81,7 @@ directory: Now you should be able to run xawtv. Right click for the options dialog. WORKING FEATURES: - o Color streaming/capture at 640x480 (reliably) and 320x240 (unreliably) + o Color streaming/capture at 640x480 and 320x240 o YUV420 color o Setting/getting of saturation, contrast and brightness (no color yet) diff --git a/Documentation/usb/scanner-hp-sane.txt b/Documentation/usb/scanner-hp-sane.txt index 220bbb290055..a1cbcd1b4391 100644 --- a/Documentation/usb/scanner-hp-sane.txt +++ b/Documentation/usb/scanner-hp-sane.txt @@ -1,8 +1,10 @@ -Oct. 19, 1999 +Copyright (C) 1999, 2000 David E. Nelson + +Jan. 22, 2000 CHANGES -- Ammended for Linux-2.3.22+ +- Amended for Linux-2.3.40 INTRODUCTION @@ -11,23 +13,26 @@ This document will hopefully provide enough info on how to get SANE working with a Hewlett Packard USB capable scanner using the USB interface. The majority of HP Scanners support the Scanner Control Language (SCL) which is both published by HP and supported by SANE. -The only HP Scanner that I'm aware of that does not support SCL is the -4200C. All other HP scanners with USB interfaces should work (4100C, -5200C, 6200C, and 6300C). Of course as HP releases new scanners this -information may change. +The only HP Scanners that I'm aware of that do not support SCL are the +4200C and the 3300C. All other HP scanners with USB interfaces should +work (4100C, 5200C, 6200C, and 6300C). Of course as HP releases new +scanners this information may change. REQUIREMENTS In order to get this running you'll need USB support in your kernel in -addition to USB Scanner support. Please refer to README.scanner -for issues pertaining to Linux USB and USB Scanner support. +addition to USB Scanner support. Please refer to scanner.txt for +issues pertaining to Linux USB and USB Scanner support. An installed version of SANE which is available from http://www.mostang.com/sane/. Testing has been performed using version SANE-1.0.1. For instructions on building and installing SANE, refer to the various README files within the SANE distribution. +The latest SANE HP backend available from http://www.kirchgessner.net. +At the time of this writing, version 0.83 was available. + OK, I'VE INSTALLED SANE. SO WHAT DO I DO NOW? diff --git a/Documentation/usb/scanner.txt b/Documentation/usb/scanner.txt index 4b5de2be8f26..19303508582f 100644 --- a/Documentation/usb/scanner.txt +++ b/Documentation/usb/scanner.txt @@ -1,8 +1,10 @@ -Oct 19, 1999 +Copyright (C) 1999, 2000 David E. Nelson + +Jan. 22, 2000 CHANGES -- Ammended for linux-2.3.22+ +- Amended for linux-2.3.40 - Appended hp_scan.c to end of this README - Removed most references to HP @@ -12,49 +14,63 @@ OVERVIEW This README will address issues regarding how to configure the kernel to access a USB scanner. Although the driver was originally conceived for USB HP scanners, it's general enough so that it can be used with -other scanners. Also, one can now pass the USB Vendor and -Product ID's using module parameters for unknown scanners. Refer to -the document README.scanner_hp_sane for guidance on how to configure -SANE to use a USB HP Scanner. +other scanners. Also, one can now pass the USB Vendor and Product +ID's using module parameters for unknown scanners. Refer to the +document scanner_hp_sane.txt for guidance on how to configure SANE to +use a USB HP Scanner. ADDITIONAL INFORMATION http://www.linux-usb.org/ -http://www.dynamine.net/linux-usb/HOWTO/ REQUIREMENTS A host with a USB port. Ideally, either a UHCI (Intel) or OHCI (Compaq and others) hardware port should work. However, I've only -been able to really use an OHCI controller. I did have access to a -system with a UHCI controller but some very limited testing did not -produce satisfactory results. Luke Ordelmans - has reported success using the UHCI host -controller with kernel 2.3.18 and a ChainTech motherboard. Here -lately I've been having better success with the ohci-hcd driver. But -since Linux USB support is still in a state of constant development -that may change at a later date. I am confident that eventually all -the host contollers will perform without incident. +been able to really use an OHCI controller. At the time of this +writing, both uhci and ohci work with scanner.c *except* for the HP +4100C which only works with ohci. This problem is being investigated. -A Linux kernel with USB support (preferably linux-2.3.18+) +A Linux development kernel (2.3.x) with USB support enabled or a +backported version to linux-2.2.x. See http://www.linux-usb.org for +more information on accomplishing this. -A Linux kernel with USB Scanner support. +A Linux kernel with USB Scanner support enabled. +'lspci' which is only needed to determine the type of USB hardware +available in your machine. CONFIGURATION -Using `make menuconfig` or your prefered method for configuring the -kernel, select 'Support for USB', 'OHCI/OHCI-HCD/UHCI' depending on -your hardware, 'USB hub support', and 'USB Scanner support'. Compile -and install the modules (you may need to execute `depmod -a` to update -the module dependencies). Testing was performed only as modules, -YMMV. +Using `lspci -v`, determine the type of USB hardware available. + + If you see something like: + + USB Controller: ...... + Flags: ..... + I/O ports at .... + + Then you have a UHCI based controller. + + If you see something like: + + USB Controller: ..... + Flags: .... + Memory at ..... + + Then you have a OHCI based controller. + +Using `make menuconfig` or your preferred method for configuring the +kernel, select 'Support for USB', 'OHCI/UHCI' depending on your +hardware (determined from the steps above), 'USB Scanner support', and +'Preliminary USB device filesystem'. Compile and install the modules +(you may need to execute `depmod -a` to update the module +dependencies). Testing was performed only as modules, YMMV. Add a device for the USB scanner: - linux-2.3.22 and above: `mknod /dev/usbscanner c 180 48` - linux-2.3.21 and below: `mknod /dev/usbscanner c 16 1` + `mknod /dev/usbscanner c 180 48` Set appropriate permissions for /dev/usbscanner (don't forget about group and world permissions). Both read and write permissions are @@ -66,36 +82,71 @@ Load the appropriate modules (if compiled as modules): modprobe usb-ohci modprobe scanner - OHCI-HCD: - modprobe usb-ohci-hcd - modprobe hub - modprobe scanner - UHCI: modprobe usb-uhci - modprobe hub (don't know if this is required or not) modprobe scanner That's it. SANE should now be able to access the device. There is a small test program (hp_scan.c -- appended below) that can be used to test the scanner device if it's an HP scanner that supports -SCL. Its purpose is to test the driver without having to -retrieve/configure SANE. Hp_scan.c will scan the entire bed and put -the output into a file called 'out.dat' in the current directory. The -data in the file is raw data so it's not very useful for imaging. +SCL (Scanner Control Language). Known HP scanner that support SCL are +the 4100, 5200, 6200, the 6300 -- note that the 4200 is *not* +supported since it does not understand SCL; it's also strongly +suspected that the 3300 is not SCL compliant. Hp_scan.c's purpose is +to test the driver without having to retrieve/configure SANE. +Hp_scan.c will scan the entire bed and put the output into a file +called 'out.dat' in the current directory. The data in the file is +raw data so it's not very useful for imaging. + + +SUPPORTED SCANNERS + +NOTE: Just because a product is listed here does not mean that +applications exist that support the product. It's in the hopes that +this will allow developers a means to produce applications that will +support the listed USB products. + +At the time of this writing, the following scanners were supported by +scanner.c: + + Hewlett Packard + + 3300, 4100, 4200, 5200, 6200, 6300, PhotoSmart S20 + + AGFA + + SnapScan 1212U + + Umax + + Astra 2000U + + Seiko/Epson + + Perfection 636, Perfection 1200U + + Mustek + + 1200 CU + + User Specified. See MODULE PARAMETERS for details. MODULE PARAMETERS -If you have a device that wish to experiment with or try using this -driver with, but the Vendor and Product ID's are not coded in, don't -despair. If the driver was compiled as a module, you can pass options -to the driver. Simply add 'options scanner vendor=0x#### +If you have a device that you wish to experiment with or try using +this driver with, but the Vendor and Product ID's are not coded in, +don't despair. If the driver was compiled as a module, you can pass +options to the driver. Simply add 'options scanner vendor=0x#### product=0x****' to the conf.modules/modules.conf file replacing the #'s and the *'s with the correct ID's. The ID's can be retrieved from the messages file or using `cat /proc/bus/usb/devices` if USB /proc -support was selected during kernel configuration. +support was selected during kernel configuration. In later kernels +(2.3.38+), a new filesystem was introduced, usbdevfs. To mount the +filesystem, issue the command `mount -t usbdevfs /proc/bus/usb +/proc/bus/usb`. You can then issue ` cat /proc/bus/usb/devices` to +extract USB device information. BUGS diff --git a/Documentation/usb/usb-serial.txt b/Documentation/usb/usb-serial.txt index e046ae2e5cfc..e9e94510b9a1 100644 --- a/Documentation/usb/usb-serial.txt +++ b/Documentation/usb/usb-serial.txt @@ -59,14 +59,12 @@ Current status: possible. The driver cleans up properly when the device is removed, or the connection is canceled on the Visor. - I write _should_ because communication does not seem to work properly at - this time. I am in contact with the developers at HandSpring and am - working at getting this to work properly. - - There is a webpage for this portion of the driver at - http://milosch.net/visor/ and a project set up with mailing lists for - it at : - http://sourceforge.net/project/?group_id=1404 + When the device is connected, try talking to it on the second port + (this is usually /dev/ttyUSB1 if you do not have any other usb-serial + devices in the system.) + + There is a webpage and mailing lists for this portion of the driver at: + http://usbvisor.sourceforge.net/ Belkin single port serial converter diff --git a/arch/i386/Makefile b/arch/i386/Makefile index 37b2371a0bcf..4ba71ba06236 100644 --- a/arch/i386/Makefile +++ b/arch/i386/Makefile @@ -22,7 +22,10 @@ LDFLAGS=-e stext LINKFLAGS =-T $(TOPDIR)/arch/i386/vmlinux.lds $(LDFLAGS) CFLAGS_PIPE := -pipe -CFLAGS_NSR := -fno-strength-reduce + +# only work around strength reduction bug(s) on older gcc versions +CFLAGS_NSR := $(shell if $(CC) -march=i486 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo ""; else echo "-fno-strength-reduce"; fi) + CFLAGS := $(CFLAGS) $(CFLAGS_PIPE) $(CFLAGS_NSR) # prevent gcc from keeping the stack 16 byte aligned @@ -57,6 +60,12 @@ CFLAGS += $(shell if $(CC) -march=i686 -S -o /dev/null -xc /dev/null >/dev/null AFLAGS := $(AFLAGS) -DCPU=686 endif +ifdef CONFIG_MK6 +CFLAGS := $(CFLAGS) -DCPU=586 +CFLAGS += $(shell if $(CC) -march=k6 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=k6"; fi) +AFLAGS := $(AFLAGS) -DCPU=586 +endif + ifdef CONFIG_MK7 CFLAGS := $(CFLAGS) -DCPU=686 -march=pentiumpro -mpentiumpro -malign-functions=4 -fschedule-insns2 -mwide-multiply -fexpensive-optimizations CFLAGS += $(shell if $(CC) -march=i686 -S -o /dev/null -xc /dev/null >/dev/null 2>&1; then echo "-march=i686"; fi) diff --git a/arch/i386/config.in b/arch/i386/config.in index a32b43c65cca..00a1b42d3a5c 100644 --- a/arch/i386/config.in +++ b/arch/i386/config.in @@ -20,8 +20,9 @@ choice 'Processor family' \ "386 CONFIG_M386 \ 486/Cx486 CONFIG_M486 \ 586/K5/5x86/6x86 CONFIG_M586 \ - Pentium/K6/TSC CONFIG_M586TSC \ + Pentium/TSC CONFIG_M586TSC \ PPro/6x86MX CONFIG_M686 \ + K6-I/II/II CONFIG_MK6 \ Athlon CONFIG_MK7" PPro # # Define implied options from the CPU selection here @@ -39,6 +40,9 @@ if [ "$CONFIG_M686" = "y" ]; then define_bool CONFIG_X86_GOOD_APIC y define_bool CONFIG_X86_PGE y fi +if [ "$CONFIG_MK6" = "y" ]; then + define_bool CONFIG_X86_TSC y +fi if [ "$CONFIG_MK7" = "y" ]; then define_bool CONFIG_X86_TSC y define_bool CONFIG_X86_GOOD_APIC y diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c index 8f3d24645f85..daa7226cdd38 100644 --- a/arch/i386/kernel/apm.c +++ b/arch/i386/kernel/apm.c @@ -1413,18 +1413,11 @@ static int __init apm_setup(char *str) __setup("apm=", apm_setup); static struct file_operations apm_bios_fops = { - NULL, /* lseek */ - do_read, - NULL, /* write */ - NULL, /* readdir */ - do_poll, - do_ioctl, - NULL, /* mmap */ - do_open, - NULL, /* flush */ - do_release, - NULL, /* fsync */ - NULL /* fasync */ + read: do_read, + poll: do_poll, + ioctl: do_ioctl, + open: do_open, + release: do_release, }; static struct miscdevice apm_device = { diff --git a/arch/i386/mm/init.c b/arch/i386/mm/init.c index b20ddc2d520d..70520b99d93e 100644 --- a/arch/i386/mm/init.c +++ b/arch/i386/mm/init.c @@ -196,7 +196,7 @@ void __init kmap_init(void) kmap_prot = PAGE_KERNEL; } -#endif +#endif /* CONFIG_HIGHMEM */ void show_mem(void) { diff --git a/arch/sparc/config.in b/arch/sparc/config.in index 31e126f3342d..8d3562e37e4d 100644 --- a/arch/sparc/config.in +++ b/arch/sparc/config.in @@ -1,4 +1,4 @@ -# $Id: config.in,v 1.80 2000/01/14 07:12:30 davem Exp $ +# $Id: config.in,v 1.81 2000/01/22 05:14:44 zaitcev Exp $ # For a description of the syntax of this configuration file, # see the Configure script. # @@ -37,7 +37,6 @@ else mainmenu_option next_comment comment 'Console drivers' bool 'PROM console' CONFIG_PROM_CONSOLE - bool 'Support Frame buffer devices' CONFIG_FB source drivers/video/Config.in endmenu diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index c1ef01be30ab..c9972ab1671c 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c @@ -1,4 +1,4 @@ -/* $Id: ebus.c,v 1.8 1999/11/27 22:40:38 zaitcev Exp $ +/* $Id: ebus.c,v 1.9 2000/01/22 07:35:25 zaitcev Exp $ * ebus.c: PCI to EBus bridge device. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -22,14 +22,6 @@ #include #include -#undef PROM_DEBUG - -#if 0 /* separate from PROM_DEBUG for the sake of PROLL */ -#define dprintk prom_printf -#else -#define dprintk printk -#endif - struct linux_ebus *ebus_chain = 0; #ifdef CONFIG_SUN_OPENPROMIO @@ -51,11 +43,62 @@ extern int envctrl_init(void); /* We are together with pcic.c under CONFIG_PCI. */ extern unsigned int pcic_pin_to_irq(unsigned int, char *name); +/* + * IRQ Blacklist + * Here we list PROMs and systems that are known to supply crap as IRQ numbers. + */ +struct ebus_device_irq { + char *name; + unsigned int pin; +}; + +struct ebus_system_entry { + char *esname; + struct ebus_device_irq *ipt; +}; + +static struct ebus_device_irq je1_1[] = { + { "8042", 3 }, + { "SUNW,CS4231", 0 }, + { "parallel", 0 }, + { "se", 2 }, + { 0, 0 } +}; + +/* + * Gleb's JE1 supplied reasonable pin numbers, but mine did not (OBP 2.32). + * Blacklist the sucker... Note that Gleb's system will work. + */ +static struct ebus_system_entry ebus_blacklist[] = { + { "SUNW,JavaEngine1", je1_1 }, + { 0, 0 } +}; + +static struct ebus_device_irq *ebus_blackp = NULL; + +/* + */ static inline unsigned long ebus_alloc(size_t size) { return (unsigned long)kmalloc(size, GFP_ATOMIC); } +/* + */ +int __init ebus_blacklist_irq(char *name) +{ + struct ebus_device_irq *dp; + + if ((dp = ebus_blackp) != NULL) { + for (; dp->name != NULL; dp++) { + if (strcmp(name, dp->name) == 0) { + return pcic_pin_to_irq(dp->pin, name); + } + } + } + return 0; +} + void __init fill_ebus_child(int node, struct linux_prom_registers *preg, struct linux_ebus_child *dev) { @@ -81,14 +124,10 @@ void __init fill_ebus_child(int node, struct linux_prom_registers *preg, dev->resource[i].start = dev->parent->resource[regs[i]].start; /* XXX resource */ } - /* - * Houston, we have a problem... - * Sometimes PROM supplies absolutely meaningless properties. - * Still, we take what it gives since we have nothing better. - * Children of ebus may be wired on any input pin of PCIC. - */ - len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs)); - if ((len == -1) || (len == 0)) { + if ((dev->irqs[0] = ebus_blacklist_irq(dev->prom_name)) != 0) { + dev->num_irqs = 1; + } else if ((len = prom_getproperty(node, "interrupts", + (char *)&irqs, sizeof(irqs)) == -1) || (len == 0)) { dev->num_irqs = 0; dev->irqs[0] = 0; if (dev->parent->num_irqs != 0) { @@ -177,8 +216,10 @@ void __init fill_ebus_device(int node, struct linux_ebus_device *dev) dev->resource[i].start = baseaddr; /* XXX Unaligned */ } - len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs)); - if ((len == -1) || (len == 0)) { + if ((dev->irqs[0] = ebus_blacklist_irq(dev->prom_name)) != 0) { + dev->num_irqs = 1; + } else if ((len = prom_getproperty(node, "interrupts", + (char *)&irqs, sizeof(irqs)) == -1) || (len == 0)) { dev->num_irqs = 0; if ((dev->irqs[0] = dev->bus->self->irq) != 0) { dev->num_irqs = 1; @@ -226,6 +267,7 @@ void __init ebus_init(void) struct linux_pbm_info *pbm; struct linux_ebus_device *dev; struct linux_ebus *ebus; + struct ebus_system_entry *sp; struct pci_dev *pdev; struct pcidev_cookie *cookie; char lbuf[128]; @@ -238,11 +280,16 @@ void __init ebus_init(void) if (!pci_present()) return; + prom_getstring(prom_root_node, "name", lbuf, sizeof(lbuf)); + for (sp = ebus_blacklist; sp->esname != NULL; sp++) { + if (strcmp(lbuf, sp->esname) == 0) { + ebus_blackp = sp->ipt; + break; + } + } + pdev = pci_find_device(PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_EBUS, 0); if (!pdev) { -#ifdef PROM_DEBUG - dprintk("ebus: No EBus's found.\n"); -#endif return; } cookie = pdev->sysdata; @@ -253,9 +300,6 @@ void __init ebus_init(void) ebus->next = 0; while (ebusnd) { -#ifdef PROM_DEBUG - dprintk("ebus%d:", num_ebus); -#endif prom_getstring(ebusnd, "name", lbuf, sizeof(lbuf)); ebus->prom_node = ebusnd; @@ -284,13 +328,7 @@ void __init ebus_init(void) addr = regs[reg].phys_lo; *base++ = addr; -#ifdef PROM_DEBUG - dprintk(" %lx[%x]", addr, regs[reg].size_lo); -#endif } -#ifdef PROM_DEBUG - dprintk("\n"); -#endif nd = prom_getchild(ebusnd); if (!nd) diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index e2b6b1ae4fdc..06dba1c225b2 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -1,4 +1,4 @@ -/* $Id: ioport.c,v 1.28 1999/12/27 06:08:28 anton Exp $ +/* $Id: ioport.c,v 1.29 2000/01/22 07:35:25 zaitcev Exp $ * ioport.c: Simple io mapping allocator. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -203,6 +203,7 @@ static void *_sparc_alloc_io(unsigned int busno, unsigned long phys, tlen = strlen(name); tack = kmalloc(sizeof (struct resource) + tlen + 1, GFP_KERNEL); if (tack == NULL) return NULL; + memset(tack, 0, sizeof(struct resource)); res = (struct resource *) tack; tack += sizeof (struct resource); } @@ -285,6 +286,8 @@ void sbus_set_sbus64(struct sbus_dev *sdev, int x) { * Allocate a chunk of memory suitable for DMA. * Typically devices use them for control blocks. * CPU may access them without any explicit flushing. + * + * XXX Some clever people know that sdev is not used and supply NULL. Watch. */ void *sbus_alloc_consistant(struct sbus_dev *sdev, long len, u32 *dma_addrp) { @@ -319,17 +322,18 @@ void *sbus_alloc_consistant(struct sbus_dev *sdev, long len, u32 *dma_addrp) printk("sbus_alloc_consistant: no core\n"); return NULL; } + memset((char*)res, 0, sizeof(struct resource)); if (allocate_resource(&sparc_dvma, res, len_total, sparc_dvma.start, sparc_dvma.end, PAGE_SIZE, NULL, NULL) != 0) { - printk("sbus_alloc_consistant: cannot occupy 0x%lx", len); + printk("sbus_alloc_consistant: cannot occupy 0x%lx", len_total); free_pages(va, order); kfree(res); return NULL; } *dma_addrp = res->start; - mmu_map_dma_area(va, res->start, len); + mmu_map_dma_area(va, res->start, len_total); /* * "Official" or "natural" address of pages we got is va. @@ -403,6 +407,7 @@ u32 sbus_map_single(struct sbus_dev *sdev, void *va, long len) printk("sbus_map_single: no core\n"); return 0; } + memset((char*)res, 0, sizeof(struct resource)); res->name = va; if (allocate_resource(&sparc_dvma, res, len_total, diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index 94847460be7a..b504e2412306 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c @@ -1,4 +1,4 @@ -/* $Id: pcic.c,v 1.11 1999/11/25 05:22:05 zaitcev Exp $ +/* $Id: pcic.c,v 1.12 2000/01/22 07:35:25 zaitcev Exp $ * pcic.c: Sparc/PCI controller support * * Copyright (C) 1998 V. Roganov and G. Raiko @@ -84,8 +84,6 @@ unsigned int pcic_pin_to_irq(unsigned int pin, char *name); * Once we know the map we take device configuration address and * find PCIC pin number where INT line goes. Then we may either program * preferred irq into the PCIC or supply the preexisting irq to the device. - * - * XXX Entries for JE-1 are completely bogus. Gleb, Vladimir, please fill them. */ struct pcic_ca2irq { unsigned char busno; /* PCI bus number */ @@ -102,14 +100,28 @@ struct pcic_sn2list { }; /* - * XXX JE-1 is a little known beast. - * One rumor has the map this way: pin 0 - parallel, audio; - * pin 1 - Ethernet; pin 2 - su; pin 3 - PS/2 kbd and mouse. - * All other comparable systems tie serial and keyboard together, - * so we do not code this rumor just yet. + * JavaEngine-1 apparently has different versions. + * + * According to communications with Sun folks, for P2 build 501-4628-03: + * pin 0 - parallel, audio; + * pin 1 - Ethernet; + * pin 2 - su; + * pin 3 - PS/2 kbd and mouse. + * + * OEM manual (805-1486): + * pin 0: Ethernet + * pin 1: All EBus + * pin 2: IGA (unused) + * pin 3: Not connected + * OEM manual says that 501-4628 & 501-4811 are the same thing, + * only the latter has NAND flash in place. + * + * So far unofficial Sun wins over the OEM manual. Poor OEMs... */ -static struct pcic_ca2irq pcic_i_je1[] = { +static struct pcic_ca2irq pcic_i_je1a[] = { /* 501-4811-03 */ + { 0, 0x00, 2, 12, 0 }, /* EBus: hogs all */ { 0, 0x01, 1, 6, 1 }, /* Happy Meal */ + { 0, 0x80, 0, 7, 0 }, /* IGA (unused) */ }; /* XXX JS-E entry is incomplete - PCI Slot 2 address (pin 7)? */ @@ -159,7 +171,7 @@ static struct pcic_ca2irq pcic_i_jk[] = { { name, map, sizeof(map)/sizeof(struct pcic_ca2irq) } static struct pcic_sn2list pcic_known_sysnames[] = { - SN2L_INIT("JE-1-name", pcic_i_je1), /* XXX Gleb, put name here, pls */ + SN2L_INIT("SUNW,JavaEngine1", pcic_i_je1a), /* JE1, PROM 2.32 */ SN2L_INIT("SUNW,JS-E", pcic_i_jse), /* PROLL JavaStation-E */ SN2L_INIT("SUNW,SPARCengine-6", pcic_i_se6), /* SPARCengine-6/CP-1200 */ SN2L_INIT("SUNW,JS-NC", pcic_i_jk), /* PROLL JavaStation-NC */ @@ -602,11 +614,19 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node) p->irq, dev->device, dev->vendor); dev->irq = p->irq; - ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_HI); - ivec &= ~(0xF << ((p->pin - 4) << 2)); - ivec |= p->irq << ((p->pin - 4) << 2); - writew(ivec, pcic->pcic_regs+PCI_INT_SELECT_HI); - } + i = p->pin; + if (i >= 4) { + ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_HI); + ivec &= ~(0xF << ((i - 4) << 2)); + ivec |= p->irq << ((i - 4) << 2); + writew(ivec, pcic->pcic_regs+PCI_INT_SELECT_HI); + } else { + ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_LO); + ivec &= ~(0xF << (i << 2)); + ivec |= p->irq << (i << 2); + writew(ivec, pcic->pcic_regs+PCI_INT_SELECT_LO); + } + } return; } @@ -616,7 +636,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node) */ void __init pcibios_fixup_bus(struct pci_bus *bus) { - struct pci_dev *dev; + struct list_head *walk; int i, has_io, has_mem; unsigned short cmd; struct linux_pcic *pcic; @@ -638,7 +658,10 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) return; } - for (dev = bus->devices; dev; dev = dev->sibling) { + walk = &bus->devices; + for (walk = walk->next; walk != &bus->devices; walk = walk->next) { + struct pci_dev *dev = pci_dev_b(walk); + /* * Comment from i386 branch: * There are buggy BIOSes that forget to enable I/O and memory @@ -831,6 +854,46 @@ char * __init pcibios_setup(char *str) return str; } +/* + */ +void pcibios_update_resource(struct pci_dev *pdev, struct resource *res1, + struct resource *res2, int index) +{ +} + +#if 0 +void pcibios_update_irq(struct pci_dev *pdev, int irq) +{ +} + +unsigned long resource_fixup(struct pci_dev *pdev, struct resource *res, + unsigned long start, unsigned long size) +{ + return start; +} + +void pcibios_fixup_pbus_ranges(struct pci_bus *pbus, + struct pbus_set_ranges_data *pranges) +{ +} +#endif + +void pcibios_align_resource(void *data, struct resource *res, unsigned long size) +{ +} + +#if 0 +int pci_assign_resource(struct pci_dev *dev, int i) +{ + return -ENOSYS; /* :-)... actually implement this soon */ +} +#endif + +int pcibios_enable_device(struct pci_dev *pdev) +{ + return 0; +} + /* * NMI */ @@ -1017,4 +1080,70 @@ int pcibios_assign_resource(struct pci_dev *pdev, int resource) return -ENXIO; } +/* + * This probably belongs here rather than ioport.c because + * we do not want this crud linked into SBus kernels. + * Also, think for a moment about likes of floppy.c that + * include architecture specific parts. They may want to redefine ins/outs. + * + * We do not use horroble macroses here because we want to + * advance pointer by sizeof(size). + */ +void outsb(unsigned long addr, const void *src, unsigned long count) { + while (count) { + count -= 1; + writeb(*(const char *)src, addr); + src += 1; + addr += 1; + } +} + +void outsw(unsigned long addr, const void *src, unsigned long count) { + while (count) { + count -= 2; + writew(*(const short *)src, addr); + src += 2; + addr += 2; + } +} + +void outsl(unsigned long addr, const void *src, unsigned long count) { + while (count) { + count -= 4; + writel(*(const long *)src, addr); + src += 4; + addr += 4; + } +} + +void insb(unsigned long addr, void *dst, unsigned long count) { + while (count) { + count -= 1; + *(unsigned char *)dst = readb(addr); + dst += 1; + addr += 1; + } +} + +void insw(unsigned long addr, void *dst, unsigned long count) { + while (count) { + count -= 2; + *(unsigned short *)dst = readw(addr); + dst += 2; + addr += 2; + } +} + +void insl(unsigned long addr, void *dst, unsigned long count) { + while (count) { + count -= 4; + /* + * XXX I am sure we are in for an unaligned trap here. + */ + *(unsigned long *)dst = readl(addr); + dst += 4; + addr += 4; + } +} + #endif diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index c0155e65b47a..704bf83ff915 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c @@ -1,4 +1,4 @@ -/* $Id: sys_sunos.c,v 1.110 2000/01/21 11:38:40 jj Exp $ +/* $Id: sys_sunos.c,v 1.111 2000/01/22 05:17:55 anton Exp $ * sys_sunos.c: SunOS specific syscall compatibility support. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -605,7 +605,7 @@ asmlinkage int sunos_nosys(void) info.si_signo = SIGSYS; info.si_errno = 0; info.si_code = __SI_FAULT|0x100; - info.si_addr = (void *)regs->tpc; + info.si_addr = (void *)regs->pc; info.si_trapno = regs->u_regs[UREG_G1]; send_sig_info(SIGSYS, &info, current); if (cnt++ < 4) { diff --git a/drivers/block/Config.in b/drivers/block/Config.in index e27fb0109daf..5634cc488ac8 100644 --- a/drivers/block/Config.in +++ b/drivers/block/Config.in @@ -59,18 +59,20 @@ else if [ "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" -a "$CONFIG_BLK_DEV_AEC6210" = "y" ]; then bool ' AEC6210 Tuning support (EXPERIMENTAL)' CONFIG_BLK_DEV_AEC6210_TUNING fi + if [ "$CONFIG_BLK_DEV_IDEDMA_PCI" = "y" ]; then + bool ' ALI M15x3 chipset support' CONFIG_BLK_DEV_ALI15X3 + if [ "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" ]; then + bool ' AMD Viper support (EXPERIMENTAL)' CONFIG_BLK_DEV_AMD7409 + fi + fi bool ' CMD64X chipset support' CONFIG_BLK_DEV_CMD64X - if [ "$CONFIG_BLK_DEV_CMD64X" = "y" -a "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" ]; then + if [ "$CONFIG_BLK_DEV_CMD64X" = "y" -a "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" ]; then bool ' CMD64X chipset RAID support (EXPERIMENTAL) (WIP)' CONFIG_BLK_DEV_CMD64X_RAID fi if [ "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" ]; then bool ' CY82C693 chipset support (EXPERIMENTAL)' CONFIG_BLK_DEV_CY82C693 fi if [ "$CONFIG_BLK_DEV_IDEDMA_PCI" = "y" ]; then - bool ' ALI M15x3 chipset support' CONFIG_BLK_DEV_ALI15X3 - if [ "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" ]; then - bool ' AMD Viper support (EXPERIMENTAL)' CONFIG_BLK_DEV_AMD7409 - fi bool ' HPT34X chipset support' CONFIG_BLK_DEV_HPT34X if [ "$CONFIG_IDEDMA_PCI_EXPERIMENTAL" = "y" -a "$CONFIG_BLK_DEV_HPT34X" = "y" ]; then bool ' HPT34X DMA support (EXPERIMENTAL)' CONFIG_BLK_DEV_HPT34X_DMA @@ -218,15 +220,6 @@ if [ "$CONFIG_PCI" = "y" ]; then tristate 'Mylex DAC960/DAC1100 PCI RAID Controller support' CONFIG_BLK_DEV_DAC960 fi -# PARIDE doesn't need PARPORT, but if PARPORT is configured as a module, -# PARIDE must also be a module. The bogus CONFIG_PARIDE_PARPORT option -# controls the choices given to the user ... - -if [ "$CONFIG_PARPORT" = "y" -o "$CONFIG_PARPORT" = "n" ]; then - define_tristate CONFIG_PARIDE_PARPORT y -else - define_tristate CONFIG_PARIDE_PARPORT m -fi dep_tristate 'Parallel port IDE device support' CONFIG_PARIDE $CONFIG_PARIDE_PARPORT if [ "$CONFIG_PARIDE" = "y" -o "$CONFIG_PARIDE" = "m" ]; then source drivers/block/paride/Config.in diff --git a/drivers/block/alim15x3.c b/drivers/block/alim15x3.c index 7cecae978234..4b9b28e3b157 100644 --- a/drivers/block/alim15x3.c +++ b/drivers/block/alim15x3.c @@ -411,7 +411,11 @@ static byte ali15x3_can_ultra (ide_drive_t *drive) { struct hd_driveid *id = drive->id; +#if 0 + if (m5229_revision < 0x20) { +#else if (m5229_revision <= 0x20) { +#endif return 0; } else if ((m5229_revision < 0xC2) && ((drive->media!=ide_disk) || diff --git a/drivers/block/hpt366.c b/drivers/block/hpt366.c index 1b497fecce6b..65c695183445 100644 --- a/drivers/block/hpt366.c +++ b/drivers/block/hpt366.c @@ -30,7 +30,6 @@ #include "ide_modes.h" const char *bad_ata66_4[] = { - "QUANTUM FIREBALLP KA9.1", "WDC AC310200R", NULL }; @@ -423,30 +422,17 @@ no_dma_set: int hpt366_dmaproc (ide_dma_action_t func, ide_drive_t *drive) { + byte reg50h = 0; + switch (func) { case ide_dma_check: return config_drive_xfer_rate(drive); + case ide_dma_lostirq: + pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, ®50h); + pci_write_config_byte(HWIF(drive)->pci_dev, 0x50, reg50h|0x03); + pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, ®50h); + /* ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL); */ case ide_dma_timeout: - /* ide_do_reset(drive); */ - - if (0) { - byte reg50h = 0, reg52h = 0; - (void) ide_dmaproc(ide_dma_off_quietly, drive); - pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, ®50h); - pci_read_config_byte(HWIF(drive)->pci_dev, 0x52, ®52h); - printk("%s: (ide_dma_timeout) reg52h=0x%02x\n", drive->name, reg52h); - if (reg52h & 0x04) { - pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, ®50h); - pci_write_config_byte(HWIF(drive)->pci_dev, 0x50, reg50h|0xff); - pci_write_config_byte(HWIF(drive)->pci_dev, 0x50, reg50h); - } - pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, ®50h); - pci_read_config_byte(HWIF(drive)->pci_dev, 0x52, ®52h); - printk("%s: (ide_dma_timeout) reg50h=0x%02x reg52h=0x%02x :: again\n", drive->name, reg50h, reg52h); - (void) ide_dmaproc(ide_dma_on, drive); - if (reg52h & 0x04) - (void) ide_dmaproc(ide_dma_off, drive); - } break; default: break; diff --git a/drivers/block/ide-disk.c b/drivers/block/ide-disk.c index 14952a049cd2..1209aa82a2d3 100644 --- a/drivers/block/ide-disk.c +++ b/drivers/block/ide-disk.c @@ -572,7 +572,7 @@ static void idedisk_pre_reset (ide_drive_t *drive) drive->special.b.recalibrate = 1; if (OK_TO_RESET_CONTROLLER) drive->mult_count = 0; - if (!drive->keep_settings) + if (!drive->keep_settings && !drive->using_dma) drive->mult_req = 0; if (drive->mult_req != drive->mult_count) drive->special.b.set_multmode = 1; diff --git a/drivers/block/ide-pci.c b/drivers/block/ide-pci.c index 6ee45c49dff0..7f429eff238c 100644 --- a/drivers/block/ide-pci.c +++ b/drivers/block/ide-pci.c @@ -29,8 +29,8 @@ #define DEVID_PIIXb ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371FB_1}) #define DEVID_PIIX3 ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_1}) #define DEVID_PIIX4 ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB}) -#define DEVID_PIIX4E ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_1}) -#define DEVID_PIIX4U ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_1}) +#define DEVID_PIIX4E ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_1}) +#define DEVID_PIIX4U ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_1}) #define DEVID_VIA_IDE ((ide_pci_devid_t){PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561}) #define DEVID_VP_IDE ((ide_pci_devid_t){PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1}) #define DEVID_PDC20246 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20246}) @@ -696,70 +696,45 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, ide_pci_devic * ide_scan_pcibus() gets invoked at boot time from ide.c. * It finds all PCI IDE controllers and calls ide_setup_pci_device for them. */ -void __init ide_forward_scan_pcibus (void) +void __init ide_scan_pcidev (struct pci_dev *dev) { - struct pci_dev *dev; ide_pci_devid_t devid; ide_pci_device_t *d; - pci_for_each_dev(dev) { - devid.vid = dev->vendor; - devid.did = dev->device; - for (d = ide_pci_chipsets; d->devid.vid && !IDE_PCI_DEVID_EQ(d->devid, devid); ++d); - if (d->init_hwif == IDE_IGNORE) - printk("%s: ignored by ide_scan_pci_device() (uses own driver)\n", d->name); - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_OPTI621V) && !(PCI_FUNC(dev->devfn) & 1)) - continue; /* OPTI Viper-M uses same devid for functions 0 and 1 */ - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_CY82C693) && (!(PCI_FUNC(dev->devfn) & 1) || !((dev->class >> 8) == PCI_CLASS_STORAGE_IDE))) - continue; /* CY82C693 is more than only a IDE controller */ - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_UM8886A) && !(PCI_FUNC(dev->devfn) & 1)) - continue; /* UM8886A/BF pair */ - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_HPT366)) - hpt366_device_order_fixup(dev, d); - else if (!IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL) || (dev->class >> 8) == PCI_CLASS_STORAGE_IDE) { - if (IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL)) - printk("%s: unknown IDE controller on PCI bus %02x device %02x, VID=%04x, DID=%04x\n", - d->name, dev->bus->number, dev->devfn, devid.vid, devid.did); - else - printk("%s: IDE controller on PCI bus %02x dev %02x\n", d->name, dev->bus->number, dev->devfn); - ide_setup_pci_device(dev, d); - } + devid.vid = dev->vendor; + devid.did = dev->device; + for (d = ide_pci_chipsets; d->devid.vid && !IDE_PCI_DEVID_EQ(d->devid, devid); ++d); + if (d->init_hwif == IDE_IGNORE) + printk("%s: ignored by ide_scan_pci_device() (uses own driver)\n", d->name); + else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_OPTI621V) && !(PCI_FUNC(dev->devfn) & 1)) + return; + else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_CY82C693) && (!(PCI_FUNC(dev->devfn) & 1) || !((dev->class >> 8) == PCI_CLASS_STORAGE_IDE))) + return; /* CY82C693 is more than only a IDE controller */ + else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_UM8886A) && !(PCI_FUNC(dev->devfn) & 1)) + return; /* UM8886A/BF pair */ + else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_HPT366)) + hpt366_device_order_fixup(dev, d); + else if (!IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL) || (dev->class >> 8) == PCI_CLASS_STORAGE_IDE) { + if (IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL)) + printk("%s: unknown IDE controller on PCI bus %02x device %02x, VID=%04x, DID=%04x\n", + d->name, dev->bus->number, dev->devfn, devid.vid, devid.did); + else + printk("%s: IDE controller on PCI bus %02x dev %02x\n", d->name, dev->bus->number, dev->devfn); + ide_setup_pci_device(dev, d); } } -void __init ide_reverse_scan_pcibus (void) +void __init ide_scan_pcibus (int scan_direction) { - struct pci_dev *dev; - ide_pci_devid_t devid; - ide_pci_device_t *d; + struct pci_dev *dev; - pci_for_each_dev_reverse(dev) { - devid.vid = dev->vendor; - devid.did = dev->device; - for (d = ide_pci_chipsets; d->devid.vid && !IDE_PCI_DEVID_EQ(d->devid, devid); ++d); - if (d->init_hwif == IDE_IGNORE) - printk("%s: ignored by ide_scan_pci_device() (uses own driver)\n", d->name); - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_OPTI621V) && !(PCI_FUNC(dev->devfn) & 1)) - continue; /* OPTI Viper-M uses same devid for functions 0 and 1 */ - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_CY82C693) && (!(PCI_FUNC(dev->devfn) & 1) || !((dev->class >> 8) == PCI_CLASS_STORAGE_IDE))) - continue; /* CY82C693 is more than only a IDE controller */ - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_UM8886A) && !(PCI_FUNC(dev->devfn) & 1)) - continue; /* UM8886A/BF pair */ - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_HPT366)) - hpt366_device_order_fixup(dev, d); - else if (!IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL) || (dev->class >> 8) == PCI_CLASS_STORAGE_IDE) { - if (IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL)) - printk("%s: unknown IDE controller on PCI bus %02x device %02x, VID=%04x, DID=%04x\n", - d->name, dev->bus->number, dev->devfn, devid.vid, devid.did); - else - printk("%s: IDE controller on PCI bus %02x dev %02x\n", d->name, dev->bus->number, dev->devfn); - ide_setup_pci_device(dev, d); + if (!scan_direction) { + pci_for_each_dev(dev) { + ide_scan_pcidev(dev); + } + } else { + pci_for_each_dev_reverse(dev) { + ide_scan_pcidev(dev); } } } - -void __init ide_scan_pcibus (int scan_direction) -{ - if (!scan_direction) ide_forward_scan_pcibus(); - else ide_reverse_scan_pcibus(); -} diff --git a/drivers/block/ide-probe.c b/drivers/block/ide-probe.c index efb4705f3018..1c6f19eba24d 100644 --- a/drivers/block/ide-probe.c +++ b/drivers/block/ide-probe.c @@ -285,6 +285,7 @@ static int do_probe (ide_drive_t *drive, byte cmd) drive->name, drive->present, drive->media, (cmd == WIN_IDENTIFY) ? "ATA" : "ATAPI"); #endif + ide_delay_50ms(); /* needed for some systems (e.g. crw9624 as drive0 with disk as slave) */ SELECT_DRIVE(hwif,drive); ide_delay_50ms(); if (IN_BYTE(IDE_SELECT_REG) != drive->select.all && !drive->present) { diff --git a/drivers/block/ide-tape.c b/drivers/block/ide-tape.c index 429888f3269e..beaf1226690d 100644 --- a/drivers/block/ide-tape.c +++ b/drivers/block/ide-tape.c @@ -384,7 +384,7 @@ * sharing a (fast) ATA-2 disk with any (slow) new ATAPI device. */ -#define IDETAPE_VERSION "1.16e" +#define IDETAPE_VERSION "1.16f" #include #include @@ -409,6 +409,9 @@ #include #include + +#define NO_LONGER_REQUIRE (1) + /* * OnStream support */ @@ -1735,7 +1738,7 @@ static void idetape_end_request (byte uptodate, ide_hwgroup_t *hwgroup) aux = stage->aux; p = stage->bh->b_data; if (ntohl(aux->logical_blk_num) < 11300 && ntohl(aux->logical_blk_num) > 11100) - printk(KERN_INFO "ide-tape: finished writing logical blk %lu (data %x %x %x %x)\n", ntohl(aux->logical_blk_num), *p++, *p++, *p++, *p++); + printk(KERN_INFO "ide-tape: finished writing logical blk %u (data %x %x %x %x)\n", ntohl(aux->logical_blk_num), *p++, *p++, *p++, *p++); } } #endif @@ -2851,7 +2854,7 @@ static void idetape_add_stage_tail (ide_drive_t *drive,idetape_stage_t *stage) /* * Initialize the OnStream AUX */ -static void idetape_init_stage(ide_drive_t *drive, idetape_stage_t *stage, int frame_type, int logical_blk_num) +static void idetape_init_stage (ide_drive_t *drive, idetape_stage_t *stage, int frame_type, int logical_blk_num) { idetape_tape_t *tape = drive->driver_data; os_aux_t *aux = stage->aux; @@ -2965,7 +2968,7 @@ static ide_startstop_t idetape_read_position_callback (ide_drive_t *drive) } else { #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 2) - printk (KERN_INFO "ide-tape: Block Location - %lu\n", ntohl (result->first_block)); + printk (KERN_INFO "ide-tape: Block Location - %u\n", ntohl (result->first_block)); #endif /* IDETAPE_DEBUG_LOG */ tape->partition = result->partition; tape->first_frame_position = ntohl (result->first_block); @@ -3358,7 +3361,7 @@ static void idetape_onstream_write_error_recovery (ide_drive_t *drive) unsigned int block; if (tape->onstream_write_error == 1) { - printk(KERN_ERR "ide-tape: %s: detected physical bad block at %lu\n", tape->name, ntohl(tape->sense.information)); + printk(KERN_ERR "ide-tape: %s: detected physical bad block at %u\n", tape->name, ntohl(tape->sense.information)); block = ntohl(tape->sense.information) + 80; idetape_update_stats(drive); printk(KERN_ERR "ide-tape: %s: relocating %d buffered logical blocks to physical block %u\n", tape->name, tape->cur_frames, block); @@ -3490,7 +3493,7 @@ static int idetape_verify_stage (ide_drive_t *drive, idetape_stage_t *stage, int return 0; } if (ntohl(aux->format_id) != 0) { - printk(KERN_INFO "ide-tape: %s: skipping frame, format_id %lu\n", tape->name, ntohl(aux->format_id)); + printk(KERN_INFO "ide-tape: %s: skipping frame, format_id %u\n", tape->name, ntohl(aux->format_id)); return 0; } if (memcmp(aux->application_sig, tape->application_sig, 4) != 0) { @@ -3514,7 +3517,7 @@ static int idetape_verify_stage (ide_drive_t *drive, idetape_stage_t *stage, int return 0; } if (ntohs(par->wrt_pass_cntr) != tape->wrt_pass_cntr) { - printk(KERN_INFO "ide-tape: %s: skipping frame, wrt_pass_cntr %d (expected %d)(logical_blk_num %lu)\n", tape->name, ntohs(par->wrt_pass_cntr), tape->wrt_pass_cntr, ntohl(aux->logical_blk_num)); + printk(KERN_INFO "ide-tape: %s: skipping frame, wrt_pass_cntr %d (expected %d)(logical_blk_num %u)\n", tape->name, ntohs(par->wrt_pass_cntr), tape->wrt_pass_cntr, ntohl(aux->logical_blk_num)); return 0; } if (aux->frame_seq_num != aux->logical_blk_num) { @@ -3523,7 +3526,7 @@ static int idetape_verify_stage (ide_drive_t *drive, idetape_stage_t *stage, int } if (logical_blk_num != -1 && ntohl(aux->logical_blk_num) != logical_blk_num) { if (!quiet) - printk(KERN_INFO "ide-tape: %s: skipping frame, logical_blk_num %lu (expected %d)\n", tape->name, ntohl(aux->logical_blk_num), logical_blk_num); + printk(KERN_INFO "ide-tape: %s: skipping frame, logical_blk_num %u (expected %d)\n", tape->name, ntohl(aux->logical_blk_num), logical_blk_num); return 0; } if (aux->frame_type == OS_FRAME_TYPE_MARKER) { @@ -4492,7 +4495,8 @@ static void __idetape_write_header (ide_drive_t *drive, int block, int cnt) idetape_position_tape(drive, block, 0, 0); memset(&header, 0, sizeof(header)); strcpy(header.ident_str, "ADR_SEQ"); - header.major_rev = header.minor_rev = 2; + header.major_rev = 1; + header.minor_rev = 2; header.par_num = 1; header.partition.partition_num = OS_DATA_PARTITION; header.partition.par_desc_ver = OS_PARTITION_VERSION; @@ -5113,7 +5117,11 @@ static int idetape_analyze_headers (ide_drive_t *drive) for (block = 5; block < 10; block++) if (__idetape_analyze_headers(drive, block)) goto ok; +#if 0 + for (block = 0xbae; block < 0xbb8; block++) +#else for (block = 0xbae; block < 0xbb3; block++) +#endif if (__idetape_analyze_headers(drive, block)) goto ok; printk(KERN_ERR "ide-tape: %s: failed to find valid ADRL header\n", tape->name); @@ -5866,8 +5874,7 @@ int idetape_init (void) ide_register_module (&idetape_module); MOD_DEC_USE_COUNT; #if ONSTREAM_DEBUG - if (tape->debug_level >= 6) - printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in idetape_init\n"); + printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in idetape_init\n"); #endif return 0; } diff --git a/drivers/block/ide.c b/drivers/block/ide.c index 873f57cc9147..396369651345 100644 --- a/drivers/block/ide.c +++ b/drivers/block/ide.c @@ -655,14 +655,17 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) static void pre_reset (ide_drive_t *drive) { + if (drive->driver != NULL) + DRIVER(drive)->pre_reset(drive); + if (!drive->keep_settings) { - drive->unmask = 0; - drive->io_32bit = 0; - if (drive->using_dma) + if (drive->using_dma) { (void) HWIF(drive)->dmaproc(ide_dma_off, drive); + } else { + drive->unmask = 0; + drive->io_32bit = 0; + } } - if (drive->driver != NULL) - DRIVER(drive)->pre_reset(drive); } /* @@ -901,7 +904,7 @@ ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat) try_to_flush_leftover_data(drive); } if (GET_STAT() & (BUSY_STAT|DRQ_STAT)) - rq->errors |= ERROR_RESET; /* Mmmm.. timing problem */ + OUT_BYTE(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG); /* force an abort */ if (rq->errors >= ERROR_MAX) { if (drive->driver != NULL) @@ -1825,7 +1828,7 @@ static void ide_init_module (int type) revalidate_drives(); #ifdef CONFIG_KMOD if (!found && type == IDE_PROBE_MODULE) - (void) request_module("ide-probe"); + (void) request_module("ide-probe-mod"); #endif /* CONFIG_KMOD */ } diff --git a/drivers/block/paride/Config.in b/drivers/block/paride/Config.in index 8d4dc17426e6..28ef310f49df 100644 --- a/drivers/block/paride/Config.in +++ b/drivers/block/paride/Config.in @@ -1,6 +1,17 @@ # # PARIDE configuration # + +# PARIDE doesn't need PARPORT, but if PARPORT is configured as a module, +# PARIDE must also be a module. The bogus CONFIG_PARIDE_PARPORT option +# controls the choices given to the user ... + +if [ "$CONFIG_PARPORT" = "y" -o "$CONFIG_PARPORT" = "n" ]; then + define_tristate CONFIG_PARIDE_PARPORT y +else + define_tristate CONFIG_PARIDE_PARPORT m +fi + comment 'Parallel IDE high-level drivers' dep_tristate ' Parallel port IDE disks' CONFIG_PARIDE_PD $CONFIG_PARIDE dep_tristate ' Parallel port ATAPI CD-ROMs' CONFIG_PARIDE_PCD $CONFIG_PARIDE diff --git a/drivers/block/piix.c b/drivers/block/piix.c index b8ffb5a4b16d..64cf45853a09 100644 --- a/drivers/block/piix.c +++ b/drivers/block/piix.c @@ -33,11 +33,16 @@ * * 4a 84|21 hdb|hda * 4b 84|21 hdd|hdc - * - * 00|00 udma 0 - * 01|01 udma 1 - * 10|10 udma 2 - * 11|11 reserved + * + * ata-33/82371AB + * ata-33/82371EB + * ata-33/82801AB ata-66/82801AA + * 00|00 udma 0 00|00 reserved + * 01|01 udma 1 01|01 udma 3 + * 10|10 udma 2 10|10 udma 4 + * 11|11 reserved 11|11 reserved + * + * 54 8421|8421 ata66 drive|ata66 enable * * pci_read_config_word(HWIF(drive)->pci_dev, 0x40, ®40); * pci_read_config_word(HWIF(drive)->pci_dev, 0x42, ®42); @@ -195,71 +200,78 @@ static int piix_config_drive_for_dma (ide_drive_t *drive) struct pci_dev *dev = hwif->pci_dev; int sitre; - short reg4042, reg44, reg48, reg4a; + short reg4042, reg44, reg48, reg4a, reg54; byte speed; - int u_speed; byte maslave = hwif->channel ? 0x42 : 0x40; byte udma_66 = ((id->hw_config & 0x2000) && (hwif->udma_four)) ? 1 : 0; int ultra = ((dev->device == PCI_DEVICE_ID_INTEL_82371AB) || - (dev->device == PCI_DEVICE_ID_INTEL_82801AA_1)) ? 1 : 0; - int ultra66 = (dev->device == PCI_DEVICE_ID_INTEL_82801AB_1) ? 1 : 0; + (dev->device == PCI_DEVICE_ID_INTEL_82801AB_1)) ? 1 : 0; + int ultra66 = (dev->device == PCI_DEVICE_ID_INTEL_82801AA_1) ? 1 : 0; int drive_number = ((hwif->channel ? 2 : 0) + (drive->select.b.unit & 0x01)); int a_speed = 2 << (drive_number * 4); int u_flag = 1 << drive_number; + int u_speed = 0; pci_read_config_word(dev, maslave, ®4042); - sitre = (reg4042 & 0x4000) ? 1 : 0; + sitre = (reg4042 & 0x4000) ? 1 : 0; pci_read_config_word(dev, 0x44, ®44); pci_read_config_word(dev, 0x48, ®48); pci_read_config_word(dev, 0x4a, ®4a); + pci_read_config_word(dev, 0x54, ®54); - if (id->dma_ultra && (ultra)) { - if (!(reg48 & u_flag)) { - pci_write_config_word(dev, 0x48, reg48|u_flag); - } - } else { - if (reg48 & u_flag) { - pci_write_config_word(dev, 0x48, reg48 & ~u_flag); - } - } - - if (((id->dma_ultra & 0x0010) || (id->dma_ultra & 0x0008) || (id->dma_ultra & 0x0004)) && (ultra)) { + if ((id->dma_ultra & 0x0010) && (ultra)) { + u_speed = 2 << (drive_number * 4); + speed = ((udma_66) && (ultra66)) ? XFER_UDMA_4 : XFER_UDMA_2; + } else if ((id->dma_ultra & 0x0008) && (ultra)) { + u_speed = 1 << (drive_number * 4); + speed = ((udma_66) && (ultra66)) ? XFER_UDMA_3 : XFER_UDMA_1; + } else if ((id->dma_ultra & 0x0004) && (ultra)) { u_speed = 2 << (drive_number * 4); - if (!(reg4a & u_speed)) { - pci_write_config_word(dev, 0x4a, reg4a|u_speed); - } speed = XFER_UDMA_2; } else if ((id->dma_ultra & 0x0002) && (ultra)) { u_speed = 1 << (drive_number * 4); - if (!(reg4a & u_speed)) { - pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); - pci_write_config_word(dev, 0x4a, reg4a|u_speed); - } speed = XFER_UDMA_1; } else if ((id->dma_ultra & 0x0001) && (ultra)) { u_speed = 0 << (drive_number * 4); - if (!(reg4a & u_speed)) { - pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); - pci_write_config_word(dev, 0x4a, reg4a|u_speed); - } speed = XFER_UDMA_0; } else if (id->dma_mword & 0x0004) { - if (reg4a & a_speed) - pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); speed = XFER_MW_DMA_2; } else if (id->dma_mword & 0x0002) { - if (reg4a & a_speed) - pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); speed = XFER_MW_DMA_1; } else if (id->dma_1word & 0x0004) { - if (reg4a & a_speed) - pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); speed = XFER_SW_DMA_2; } else { speed = XFER_PIO_0 + ide_get_best_pio_mode(drive, 255, 5, NULL); } + /* + * This is !@#$% ugly and stupid............. + * But ugly harware generates ugly code......... + */ + if (speed >= XFER_UDMA_0) { + if (!(reg48 & u_flag)) + pci_write_config_word(dev, 0x48, reg48|u_flag); + if (!(reg4a & u_speed)) { + pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); + pci_write_config_word(dev, 0x4a, reg4a|u_speed); + } + if ((speed > XFER_UDMA_2) && (!(reg54 & u_flag))) { + pci_write_config_word(dev, 0x54, reg54|u_flag); + } else { + pci_write_config_word(dev, 0x54, reg54 & ~u_flag); + } + } + + if (speed < XFER_UDMA_0) { + if (reg48 & u_flag) + pci_write_config_word(dev, 0x48, reg48 & ~u_flag); + if (reg4a & a_speed) + pci_write_config_word(dev, 0x4a, reg4a & ~a_speed); + if (reg54 & u_flag) + pci_write_config_word(dev, 0x54, reg54 & ~u_flag); + } + piix_tune_drive(drive, piix_dma_2_pio(speed)); (void) ide_config_drive_speed(drive, speed); @@ -301,11 +313,21 @@ unsigned int __init pci_init_piix (struct pci_dev *dev, const char *name) return 0; } +/* + * Sheesh, someone at Intel needs to go read the ATA-4/5 T13 standards. + * It does not specify device detection, but channel!!! + * You determine later if bit 13 of word93 is set... + */ unsigned int __init ata66_piix (ide_hwif_t *hwif) { - if (0) - return 1; - return 0; + byte reg54h = 0, reg55h = 0, ata66 = 0; + byte mask = hwif->channel ? 0x0c : 0x03; + + pci_read_config_byte(hwif->pci_dev, 0x54, ®54h); + pci_read_config_byte(hwif->pci_dev, 0x55, ®55h); + ata66 = (reg54h & mask) ? 0 : 1; + + return ata66; } void __init ide_init_piix (ide_hwif_t *hwif) diff --git a/drivers/cdrom/Config.in b/drivers/cdrom/Config.in index 31210596db0f..7ffbfb958d4e 100644 --- a/drivers/cdrom/Config.in +++ b/drivers/cdrom/Config.in @@ -7,9 +7,9 @@ tristate ' Matsushita/Panasonic/Creative, Longshine, TEAC CDROM support' CONFIG if [ "$CONFIG_SBPCD" = "y" ]; then bool ' Matsushita/Panasonic, ... second CDROM controller support' CONFIG_SBPCD2 if [ "$CONFIG_SBPCD2" = "y" ]; then - bool ' Matsushita/Panasonic, ... third CDROM controller support' CONFIG_SBPCD3 + bool ' Matsushita/Panasonic, ... third CDROM controller support' CONFIG_SBPCD3 if [ "$CONFIG_SBPCD3" = "y" ]; then - bool ' Matsushita/Panasonic, ... fourth CDROM controller support' CONFIG_SBPCD4 + bool ' Matsushita/Panasonic, ... fourth CDROM controller support' CONFIG_SBPCD4 fi fi fi diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index f7d15edadbb4..bfac3e1d04f1 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -227,6 +227,8 @@ #include #include #include +#include + #include #include #include diff --git a/drivers/char/Config.in b/drivers/char/Config.in index 1bffec23dc61..42cbaab55571 100644 --- a/drivers/char/Config.in +++ b/drivers/char/Config.in @@ -33,8 +33,8 @@ if [ "$CONFIG_SERIAL_NONSTANDARD" = "y" ]; then tristate ' Digiboard PC/Xx Support' CONFIG_DIGI fi tristate ' Hayes ESP serial port support' CONFIG_ESPSERIAL - tristate 'Moxa Intellio support' CONFIG_MOXA_INTELLIO - tristate 'Moxa SmartIO support' CONFIG_MOXA_SMARTIO + tristate ' Moxa Intellio support' CONFIG_MOXA_INTELLIO + tristate ' Moxa SmartIO support' CONFIG_MOXA_SMARTIO if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then dep_tristate ' Multi-Tech multiport card support (EXPERIMENTAL)' CONFIG_ISI m fi diff --git a/drivers/char/ftape/Config.in b/drivers/char/ftape/Config.in index 817bf5cd29c8..179f5ba0741a 100644 --- a/drivers/char/ftape/Config.in +++ b/drivers/char/ftape/Config.in @@ -34,5 +34,9 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then int ' Default FIFO threshold (EXPERIMENTAL)' CONFIG_FT_FDC_THR 8 int ' Maximal data rate to use (EXPERIMENTAL)' CONFIG_FT_FDC_MAX_RATE 2000 fi -comment 'ONLY for DEC Alpha architectures' -int ' CPU clock frequency of your DEC Alpha' CONFIG_FT_ALPHA_CLOCK 0 + +if [ "$ARCH" = "alpha" ]; then + int ' CPU clock frequency of your DEC Alpha' CONFIG_FT_ALPHA_CLOCK 0 +else + define_int CONFIG_FT_ALPHA_CLOCK 0 +fi diff --git a/drivers/net/wan/Config.in b/drivers/net/wan/Config.in index 503854a0f9aa..a4c13c4244dc 100644 --- a/drivers/net/wan/Config.in +++ b/drivers/net/wan/Config.in @@ -34,7 +34,7 @@ if [ "$CONFIG_WAN" = "y" ]; then if [ "$CONFIG_WAN_ROUTER_DRIVERS" = "y" ]; then dep_tristate ' Sangoma WANPIPE(tm) multiprotocol cards' CONFIG_VENDOR_SANGOMA $CONFIG_WAN_ROUTER_DRIVERS if [ "$CONFIG_VENDOR_SANGOMA" != "n" ]; then - int 'Maximum number of cards' CONFIG_WANPIPE_CARDS 1 + int ' Maximum number of cards' CONFIG_WANPIPE_CARDS 1 bool ' WANPIPE X.25 support' CONFIG_WANPIPE_X25 bool ' WANPIPE Frame Relay support' CONFIG_WANPIPE_FR bool ' WANPIPE PPP support' CONFIG_WANPIPE_PPP diff --git a/drivers/parport/procfs.c b/drivers/parport/procfs.c index 29a3a7e2932a..07b30b009046 100644 --- a/drivers/parport/procfs.c +++ b/drivers/parport/procfs.c @@ -224,7 +224,7 @@ static const struct parport_sysctl_table parport_sysctl_template = { #endif /* IEEE 1284 support */ {0} }, - { {DEV_PARPORT_DEVICES_ACTIVE, "active", NULL, 0, 444, NULL, + { {DEV_PARPORT_DEVICES_ACTIVE, "active", NULL, 0, 0444, NULL, &do_active_device }, {0}}, { PARPORT_PORT_DIR(NULL), {0}}, { PARPORT_PARPORT_DIR(NULL), {0}}, diff --git a/drivers/pci/compat.c b/drivers/pci/compat.c index b59da50412f7..ce058cc0e7c3 100644 --- a/drivers/pci/compat.c +++ b/drivers/pci/compat.c @@ -19,7 +19,7 @@ pcibios_present(void) int pcibios_find_class(unsigned int class, unsigned short index, unsigned char *bus, unsigned char *devfn) { - struct pci_dev *dev = NULL; + const struct pci_dev *dev = NULL; int cnt = 0; while ((dev = pci_find_class(class, dev))) @@ -36,7 +36,7 @@ int pcibios_find_device(unsigned short vendor, unsigned short device, unsigned short index, unsigned char *bus, unsigned char *devfn) { - struct pci_dev *dev = NULL; + const struct pci_dev *dev = NULL; int cnt = 0; while ((dev = pci_find_device(vendor, device, dev))) diff --git a/drivers/pci/gen-devlist.c b/drivers/pci/gen-devlist.c index 9337d80b0cb8..ed0bcba16efa 100644 --- a/drivers/pci/gen-devlist.c +++ b/drivers/pci/gen-devlist.c @@ -8,7 +8,7 @@ #include static void -pq(FILE *f, char *c) +pq(FILE *f, const char *c) { while (*c) { if (*c == '"') diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index f109cef46832..8bfdc818a8fa 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -47,7 +47,7 @@ pci_find_slot(unsigned int bus, unsigned int devfn) struct pci_dev * pci_find_subsys(unsigned int vendor, unsigned int device, unsigned int ss_vendor, unsigned int ss_device, - struct pci_dev *from) + const struct pci_dev *from) { struct list_head *n = from ? from->global_list.next : pci_devices.next; @@ -65,14 +65,14 @@ pci_find_subsys(unsigned int vendor, unsigned int device, struct pci_dev * -pci_find_device(unsigned int vendor, unsigned int device, struct pci_dev *from) +pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *from) { return pci_find_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from); } struct pci_dev * -pci_find_class(unsigned int class, struct pci_dev *from) +pci_find_class(unsigned int class, const struct pci_dev *from) { struct list_head *n = from ? from->global_list.next : pci_devices.next; @@ -116,9 +116,9 @@ pci_find_capability(struct pci_dev *dev, int cap) * it should be allocated from. */ struct resource * -pci_find_parent_resource(struct pci_dev *dev, struct resource *res) +pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) { - struct pci_bus *bus = dev->bus; + const struct pci_bus *bus = dev->bus; int i; struct resource *best = NULL; @@ -203,7 +203,7 @@ pci_enable_device(struct pci_dev *dev) static LIST_HEAD(pci_drivers); const struct pci_device_id * -pci_match_device(const struct pci_device_id *ids, struct pci_dev *dev) +pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev) { while (ids->vendor || ids->subvendor || ids->class_mask) { if ((ids->vendor == PCI_ANY_ID || ids->vendor == dev->vendor) && @@ -315,7 +315,7 @@ static struct pci_driver pci_compat_driver = { }; struct pci_driver * -pci_dev_driver(struct pci_dev *dev) +pci_dev_driver(const struct pci_dev *dev) { if (dev->driver) return dev->driver; @@ -902,12 +902,12 @@ static unsigned int __init pci_do_scan_bus(struct pci_bus *bus) return max; } -static int __init pci_bus_exists(struct list_head *list, int nr) +static int __init pci_bus_exists(const struct list_head *list, int nr) { - struct list_head *l; + const struct list_head *l; for(l=list->next; l != list; l = l->next) { - struct pci_bus *b = pci_bus_b(l); + const struct pci_bus *b = pci_bus_b(l); if (b->number == nr || pci_bus_exists(&b->children, nr)) return 1; } diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index b687d6122951..36c3be081581 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c @@ -43,8 +43,8 @@ proc_bus_pci_lseek(struct file *file, loff_t off, int whence) static ssize_t proc_bus_pci_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) { - struct inode *ino = file->f_dentry->d_inode; - struct proc_dir_entry *dp = ino->u.generic_ip; + const struct inode *ino = file->f_dentry->d_inode; + const struct proc_dir_entry *dp = ino->u.generic_ip; struct pci_dev *dev = dp->data; int pos = *ppos; int cnt, size; @@ -125,8 +125,8 @@ proc_bus_pci_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) static ssize_t proc_bus_pci_write(struct file *file, const char *buf, size_t nbytes, loff_t *ppos) { - struct inode *ino = file->f_dentry->d_inode; - struct proc_dir_entry *dp = ino->u.generic_ip; + const struct inode *ino = file->f_dentry->d_inode; + const struct proc_dir_entry *dp = ino->u.generic_ip; struct pci_dev *dev = dp->data; int pos = *ppos; int cnt; @@ -192,17 +192,9 @@ proc_bus_pci_write(struct file *file, const char *buf, size_t nbytes, loff_t *pp } static struct file_operations proc_bus_pci_operations = { - proc_bus_pci_lseek, - proc_bus_pci_read, - proc_bus_pci_write, - NULL, /* readdir */ - NULL, /* poll */ - NULL, /* ioctl */ - NULL, /* mmap */ - NULL, /* no special open code */ - NULL, /* flush */ - NULL, /* no special release code */ - NULL /* can't fsync */ + llseek: proc_bus_pci_lseek, + read: proc_bus_pci_read, + write: proc_bus_pci_write, }; static struct inode_operations proc_bus_pci_inode_operations = { @@ -218,13 +210,13 @@ static struct inode_operations proc_bus_pci_inode_operations = { static int get_pci_dev_info(char *buf, char **start, off_t pos, int count) { - struct pci_dev *dev; + const struct pci_dev *dev; off_t at = 0; int len, i, cnt; cnt = 0; pci_for_each_dev(dev) { - struct pci_driver *drv = pci_dev_driver(dev); + const struct pci_driver *drv = pci_dev_driver(dev); len = sprintf(buf, "%02x%02x\t%04x%04x\t%x", dev->bus->number, dev->devfn, diff --git a/drivers/sbus/audio/amd7930.c b/drivers/sbus/audio/amd7930.c index 1cb739719a07..f3f593bce38d 100644 --- a/drivers/sbus/audio/amd7930.c +++ b/drivers/sbus/audio/amd7930.c @@ -1,4 +1,4 @@ -/* $Id: amd7930.c,v 1.23 1999/11/19 09:55:58 davem Exp $ +/* $Id: amd7930.c,v 1.24 2000/01/22 05:10:27 anton Exp $ * drivers/sbus/audio/amd7930.c * * Copyright (C) 1996,1997 Thomas K. Dyas (tdyas@eden.rutgers.edu) @@ -1375,7 +1375,7 @@ static int amd7930_bopen(int dev, unsigned int chan, /* Enable B channel transmit */ sbus_writeb(AMR_LIU_LMR1, info->regs + CR); tmp = sbus_readb(info->regs + DR); - tmp |= AM_LIU_LMR1_B1_ENBL + chan; + tmp |= AM_LIU_LMR1_B1_ENABL + chan; sbus_writeb(tmp, info->regs + DR); /* Enable B channel interrupts */ @@ -1701,7 +1701,7 @@ int __init amd7930_init(void) continue; if (amd7930_attach(&drivers[num_drivers], - sdev->prom_node, sdev->my_bus, sdev) == 0) + sdev->prom_node, sdev->bus, sdev) == 0) num_drivers++; } } diff --git a/drivers/sbus/char/Makefile b/drivers/sbus/char/Makefile index 9a4a59fe6ff6..4a88efda31b3 100644 --- a/drivers/sbus/char/Makefile +++ b/drivers/sbus/char/Makefile @@ -103,6 +103,13 @@ else endif endif +ifeq ($(CONFIG_SUN_JSFLASH),y) +O_OBJS += jsflash.o +endif +ifeq ($(CONFIG_SUN_JSFLASH),m) +M_OBJS += jsflash.o +endif + include $(TOPDIR)/Rules.make sunkbdmap.o: sunkeymap.c diff --git a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c index f46cffe1bc59..6d9decaf33f2 100644 --- a/drivers/sbus/char/uctrl.c +++ b/drivers/sbus/char/uctrl.c @@ -1,4 +1,4 @@ -/* $Id: uctrl.c,v 1.5 1999/12/15 15:48:24 davem Exp $ +/* $Id: uctrl.c,v 1.6 2000/01/22 05:22:07 anton Exp $ * uctrl.c: TS102 Microcontroller interface on Tadpole Sparcbook 3 * * Copyright 1999 Derrick J Brashear (shadow@dementia.org) @@ -380,7 +380,7 @@ void uctrl_get_external_status() #ifdef MODULE int init_module(void) #else -int __init uctrl_init(void) +int __init ts102_uctrl_init(void) #endif { struct uctrl_driver *driver = &drv; diff --git a/drivers/sbus/char/vfc_i2c.c b/drivers/sbus/char/vfc_i2c.c index 2538c935fe0b..6731caa78f3b 100644 --- a/drivers/sbus/char/vfc_i2c.c +++ b/drivers/sbus/char/vfc_i2c.c @@ -115,7 +115,7 @@ int vfc_i2c_reset_bus(struct vfc_dev *dev) { VFC_I2C_DEBUG_PRINTK((KERN_DEBUG "vfc%d: Resetting the i2c bus\n", dev->instance)); - if(dev == NULl) + if(dev == NULL) return -EINVAL; if(dev->regs == NULL) return -EINVAL; diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c new file mode 100644 index 000000000000..abf9e906caf4 --- /dev/null +++ b/drivers/scsi/3w-xxxx.c @@ -0,0 +1,2308 @@ +/* + 3w-xxxx.c -- 3ware Storage Controller device driver for Linux. + + Written By: Adam Radford + Copyright (C) 1999-2000 3ware Inc. + + Kernel compatablity By: Andre Hedrick + Non-Copyright (C) 2000 Andre Hedrick + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + NO WARRANTY + THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT + LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is + solely responsible for determining the appropriateness of using and + distributing the Program and assumes all risks associated with its + exercise of rights under this Agreement, including but not limited to + the risks and costs of program errors, damage to or loss of data, + programs or equipment, and unavailability or interruption of operations. + + DISCLAIMER OF LIABILITY + NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED + HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Bugs/Comments/Suggestions should be mailed to: + linux@3ware.com + + For more information, goto: + http://www.3ware.com +*/ + +/* Convert Linux Version, Patch-level, Sub-level to LINUX_VERSION_CODE. */ +#define TW_LINUX_VERSION(V, P, S) (((V) * 65536) + ((P) * 256) + (S)) + +#include + +#ifndef LINUX_VERSION_CODE +#include +#endif /* LINUX_VERSION_CODE */ + +#ifdef MODULE +#include +#include +char kernel_version[] = UTS_RELEASE; +MODULE_AUTHOR ("3ware Inc."); +MODULE_DESCRIPTION ("3ware Storage Controller Linux Driver"); +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) +#include +#endif +#include +#include +#include +#include +#if LINUX_VERSION_CODE < TW_LINUX_VERSION(2,3,0) +#include +#endif + +#define __3W_C /* let 3w-xxxx.h know it is use */ + +#ifdef MODULE +#include "/usr/src/linux/drivers/scsi/sd.h" +#include "/usr/src/linux/drivers/scsi/scsi.h" +#include "/usr/src/linux/drivers/scsi/hosts.h" +#else +#include "sd.h" +#include "scsi.h" +#include "hosts.h" +#endif + +#include "3w-xxxx.h" + +static int tw_copy_info(TW_Info *info, char *fmt, ...); +static void tw_copy_mem_info(TW_Info *info, char *data, int len); +static void tw_interrupt(int irq, void *dev_instance, struct pt_regs *regs); + +#if LINUX_VERSION_CODE < TW_LINUX_VERSION(2,3,8) +/* We will eventually need to be added to proc_fs.h */ +struct proc_dir_entry tw_scsi_proc_entry = { +#if !defined(PROC_SCSI_3W_XXXX) + PROC_SCSI_IDESCSI, +#else + PROC_SCSI_3W_XXXX, +#endif + 7, "3w-xxxx", + S_IFDIR | S_IRUGO | S_IXUGO, 2 +}; +#endif + +/* Globals */ +char *tw_driver_version="0.4.001"; +TW_Device_Extension *tw_device_extension_list[TW_MAX_SLOT]; +int tw_device_extension_count = 0; + +/* Functions */ + +/* This function will complete an aen request from the isr */ +int tw_aen_complete(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Param *param; + unsigned short aen, aen_code; + + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_complete(): Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + aen = *(unsigned short *)(param->data); + aen_code = (aen & 0x0ff); + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_complete(): Queue'd code 0x%x\n", aen_code); + /* Now queue the code */ + tw_dev->aen_queue[tw_dev->aen_tail] = aen_code; + if (tw_dev->aen_tail == TW_Q_LENGTH - 1) { + tw_dev->aen_tail = TW_Q_START; + } else { + tw_dev->aen_tail = tw_dev->aen_tail + 1; + } + if (tw_dev->aen_head == tw_dev->aen_tail) { + if (tw_dev->aen_head == TW_Q_LENGTH - 1) { + tw_dev->aen_head = TW_Q_START; + } else { + tw_dev->aen_head = tw_dev->aen_head + 1; + } + } + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + + return 0; +} /* End tw_aen_complete() */ + +/* This function will drain the aen queue after a soft reset */ +int tw_aen_drain_queue(TW_Device_Extension *tw_dev) +{ + TW_Command *command_packet; + TW_Param *param; + int tries = 0; + int request_id = 0; + u32 command_que_value = 0, command_que_addr; + u32 status_reg_value = 0, status_reg_addr; + u32 param_value; + TW_Response_Queue response_queue; + u32 response_que_addr; + unsigned short aen; + unsigned short aen_code; + int finished = 0; + int first_reset = 0; + int queue = 0; + int imax, i; + int found = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue()\n"); + + command_que_addr = tw_dev->registers.command_que_addr; + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + if (tw_poll_status(tw_dev, TW_STATUS_ATTENTION_INTERRUPT, 15)) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): No attention interrupt for card %d\n", tw_dev->host->host_no); + return 1; + } + + /* Initialize command packet */ + if (tw_dev->command_packet_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad command packet virtual address.\n"); + return 1; + } + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad command packet physical address.\n"); + return 1; + } + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 0x401; /* AEN table */ + param->parameter_id = 2; /* Unit code */ + param->parameter_size_bytes = 2; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad alignment physical address.\n"); + return 1; + } + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + imax = TW_POLL_MAX_RETRIES; + + /* Now drain the controller's aen queue */ + do { + /* Post command packet */ + outl(command_que_value, command_que_addr); + + /* Now poll for completion */ + for (i=0;istatus != 0) { + if (command_packet->flags != TW_AEN_TABLE_UNDEFINED) { + /* Bad response */ + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Bad response, flags = 0x%x.\n", command_packet->flags); + return 1; + } else { + /* We know this is a 3w-1x00, and doesn't support aen's */ + return 0; + } + } + + /* Now check the aen */ + aen = *(unsigned short *)(param->data); + aen_code = (aen & 0x0ff); + queue = 0; + switch (aen_code) { + case TW_AEN_QUEUE_EMPTY: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_QUEUE_EMPTY.\n"); + if (first_reset != 1) { + continue; + } else { + finished = 1; + } + break; + case TW_AEN_SOFT_RESET: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_SOFT_RESET.\n"); + if (first_reset == 0) { + first_reset = 1; + } else { + queue = 1; + } + break; + case TW_AEN_DEGRADED_MIRROR: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_DEGRADED_MIRROR.\n"); + queue = 1; + break; + case TW_AEN_CONTROLLER_ERROR: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_CONTROLLER_ERROR.\n"); + queue = 1; + break; + case TW_AEN_REBUILD_FAIL: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_REBUILD_FAIL.\n"); + queue = 1; + break; + case TW_AEN_REBUILD_DONE: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_REBUILD_DONE.\n"); + queue = 1; + break; + case TW_AEN_QUEUE_FULL: + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_drain_queue(): Found TW_AEN_QUEUE_FULL.\n"); + queue = 1; + break; + default: + dprintk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Unknown AEN code 0x%x.\n", aen_code); + queue = 1; + } + + /* Now put the aen on the aen_queue */ + if (queue == 1) { + tw_dev->aen_queue[tw_dev->aen_tail] = aen_code; + if (tw_dev->aen_tail == TW_Q_LENGTH - 1) { + tw_dev->aen_tail = TW_Q_START; + } else { + tw_dev->aen_tail = tw_dev->aen_tail + 1; + } + if (tw_dev->aen_head == tw_dev->aen_tail) { + if (tw_dev->aen_head == TW_Q_LENGTH - 1) { + tw_dev->aen_head = TW_Q_START; + } else { + tw_dev->aen_head = tw_dev->aen_head + 1; + } + } + } + found = 1; + break; + } + } + if (found == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Response never received.\n"); + return 1; + } + tries++; + } while ((tries < TW_MAX_AEN_TRIES) && (finished == 0)); + + if (tries >=TW_MAX_AEN_TRIES) { + printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Aen queue error.\n"); + return 1; + } + + return 0; +} /* End tw_aen_drain_queue() */ + +/* This function will read the aen queue from the isr */ +int tw_aen_read_queue(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Command *command_packet; + TW_Param *param; + u32 command_que_value = 0, command_que_addr; + u32 status_reg_value = 0, status_reg_addr; + u32 param_value = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_aen_read_queue()\n"); + command_que_addr = tw_dev->registers.command_que_addr; + status_reg_addr = tw_dev->registers.status_reg_addr; + + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Unexpected bits.\n"); + return 1; + } + if (tw_dev->command_packet_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad command packet virtual address.\n"); + return 1; + } + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad command packet physical address.\n"); + return 1; + } + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 0x401; /* AEN table */ + param->parameter_id = 2; /* Unit code */ + param->parameter_size_bytes = 2; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Bad alignment physical address.\n"); + return 1; + } + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + /* Now post the command packet */ + if ((status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL) == 0) { + dprintk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Post succeeded.\n"); + tw_dev->srb[request_id] = 0; /* Flag internal command */ + tw_dev->state[request_id] = TW_S_POSTED; + outl(command_que_value, command_que_addr); + } else { + printk(KERN_WARNING "3w-xxxx: tw_aen_read_queue(): Post failed, will retry.\n"); + return 1; + } + + return 0; +} /* End tw_aen_read_queue() */ + +/* This function will allocate memory and check if it is 16 d-word aligned */ +int tw_allocate_memory(TW_Device_Extension *tw_dev, int request_id, int size, int which) +{ + u32 *virt_addr; + + dprintk(KERN_NOTICE "3w-xxxx: tw_allocate_memory()\n"); + + if (which == 0) { + /* Allocate command packet memory */ + virt_addr = kmalloc(size, GFP_ATOMIC); + if (virt_addr == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() failed.\n"); + return 1; + } + if ((u32)virt_addr % TW_ALIGNMENT) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned address.\n"); + return 1; + } + tw_dev->command_packet_virtual_address[request_id] = virt_addr; + tw_dev->command_packet_physical_address[request_id] = + virt_to_bus(virt_addr); + } else { + /* Allocate generic buffer */ + virt_addr = kmalloc(size, GFP_ATOMIC); + if (virt_addr == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): kmalloc() failed.\n"); + return 1; + } + if ((u32)virt_addr % TW_ALIGNMENT) { + printk(KERN_WARNING "3w-xxxx: tw_allocate_memory(): Found unaligned address.\n"); + return 1; + } + tw_dev->alignment_virtual_address[request_id] = virt_addr; + tw_dev->alignment_physical_address[request_id] = virt_to_bus(virt_addr); + } + return 0; +} /* End tw_allocate_memory() */ + +/* This function will check the status register for unexpected bits */ +int tw_check_bits(u32 status_reg_value) +{ + if ((status_reg_value & TW_STATUS_EXPECTED_BITS) != TW_STATUS_EXPECTED_BITS) { + printk(KERN_WARNING "3w-xxxx: tw_check_bits(): No expected bits (0x%x).\n", status_reg_value); + return 1; + } + if ((status_reg_value & TW_STATUS_UNEXPECTED_BITS) != 0) { + printk(KERN_WARNING "3w-xxxx: tw_check_bits(): Found unexpected bits (0x%x).\n", status_reg_value); + return 1; + } + + return 0; +} /* End tw_check_bits() */ + +/* This function will report controller error status */ +int tw_check_errors(TW_Device_Extension *tw_dev) +{ + u32 status_reg_addr, status_reg_value; + + status_reg_addr = tw_dev->registers.status_reg_addr; + status_reg_value = inl(status_reg_addr); + + if (TW_STATUS_ERRORS(status_reg_value) || tw_check_bits(status_reg_value)) + return 1; + + return 0; +} /* End tw_check_errors() */ + +/* This function will clear the attention interrupt */ +void tw_clear_attention_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_CLEAR_ATTENTION_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_clear_attention_interrupt() */ + +/* This function will clear the host interrupt */ +void tw_clear_host_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_CLEAR_HOST_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_clear_host_interrupt() */ + +/* This function is called by tw_scsi_proc_info */ +static int tw_copy_info(TW_Info *info, char *fmt, ...) +{ + va_list args; + char buf[81]; + int len; + + va_start(args, fmt); + len = vsprintf(buf, fmt, args); + va_end(args); + tw_copy_mem_info(info, buf, len); + return len; +} /* End tw_copy_info() */ + +/* This function is called by tw_scsi_proc_info */ +static void tw_copy_mem_info(TW_Info *info, char *data, int len) +{ + if (info->position + len > info->length) + len = info->length - info->position; + + if (info->position + len < info->offset) { + info->position += len; + return; + } + if (info->position < info->offset) { + data += (info->offset - info->position); + len -= (info->offset - info->position); + } + if (len > 0) { + memcpy(info->buffer + info->position, data, len); + info->position += len; + } +} /* End tw_copy_mem_info() */ + +/* This function will disable interrupts on the controller */ +void tw_disable_interrupts(TW_Device_Extension *tw_dev) +{ + u32 control_reg_value, control_reg_addr; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_DISABLE_INTERRUPTS; + outl(control_reg_value, control_reg_addr); +} /* End tw_disable_interrupts() */ + +/* This function will empty the response que */ +int tw_empty_response_que(TW_Device_Extension *tw_dev) +{ + u32 status_reg_addr, status_reg_value; + u32 response_que_addr, response_que_value; + + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + status_reg_value = inl(status_reg_addr); + + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_empty_response_queue(): Unexpected bits 1.\n"); + return 1; + } + + while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) { + response_que_value = inl(response_que_addr); + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_empty_response_queue(): Unexpected bits 2.\n"); + return 1; + } + } + return 0; +} /* End tw_empty_response_que() */ + +/* This function will enable interrupts on the controller */ +void tw_enable_interrupts(TW_Device_Extension *tw_dev) +{ + u32 control_reg_value, control_reg_addr; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = (TW_CONTROL_CLEAR_ATTENTION_INTERRUPT | + TW_CONTROL_UNMASK_RESPONSE_INTERRUPT | + TW_CONTROL_ENABLE_INTERRUPTS); + outl(control_reg_value, control_reg_addr); +} /* End tw_enable_interrupts() */ + +/* This function will find and initialize all cards */ +int tw_findcards(Scsi_Host_Template *tw_host) +{ + int numcards = 0, tries = 0, error = 0; + struct Scsi_Host *host; + TW_Device_Extension *tw_dev; + TW_Device_Extension *tw_dev2; +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + struct pci_dev *tw_pci_dev = NULL; +#else + struct pci_dev *tw_pci_dev = pci_devices; +#endif + u32 status_reg_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_findcards()\n"); + while ((tw_pci_dev = pci_find_device(TW_VENDOR_ID, TW_DEVICE_ID, tw_pci_dev))) { + /* Prepare temporary device extension */ + tw_dev=(TW_Device_Extension *)kmalloc(sizeof(TW_Device_Extension), GFP_ATOMIC); + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): kmalloc() failed for card %d.\n", numcards); + continue; + } + memset(tw_dev, 0, sizeof(TW_Device_Extension)); + + error = tw_initialize_device_extension(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't initialize device extension for card %d.\n", numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Calculate the cards register addresses */ +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + tw_dev->registers.base_addr = tw_pci_dev->resource[0].start; + tw_dev->registers.control_reg_addr = (tw_pci_dev->resource[0].start & ~15); + tw_dev->registers.status_reg_addr = ((tw_pci_dev->resource[0].start & ~15) + 0x4); + tw_dev->registers.command_que_addr = ((tw_pci_dev->resource[0].start & ~15) + 0x8); + tw_dev->registers.response_que_addr = ((tw_pci_dev->resource[0].start & ~15) + 0xC); +#else + tw_dev->registers.base_addr = tw_pci_dev->base_address[0]; + tw_dev->registers.control_reg_addr = (tw_pci_dev->base_address[0] & ~15); + tw_dev->registers.status_reg_addr = ((tw_pci_dev->base_address[0] & ~15) + 0x4); + tw_dev->registers.command_que_addr = ((tw_pci_dev->base_address[0] & ~15) + 0x8); + tw_dev->registers.response_que_addr = ((tw_pci_dev->base_address[0] & ~15) + 0xC); +#endif + /* Save pci_dev struct to device extension */ + tw_dev->tw_pci_dev = tw_pci_dev; + + /* Poll status register for 60 secs for 'Controller Ready' flag */ + if (tw_poll_status(tw_dev, TW_STATUS_MICROCONTROLLER_READY, 60)) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Microcontroller not ready for card %d.\n", numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Disable interrupts on the card */ + tw_disable_interrupts(tw_dev); + + while (tries < TW_MAX_RESET_TRIES) { + /* Do soft reset */ + tw_soft_reset(tw_dev); + + error = tw_aen_drain_queue(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): No attention interrupt for card %d.\n", numcards); + tries++; + continue; + } + + /* Check for controller errors */ + if (tw_check_errors(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Controller errors found, soft resetting card %d.\n", numcards); + tries++; + continue; + } + + /* Empty the response queue */ + error = tw_empty_response_que(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't empty response queue for card %d.\n", numcards); + tries++; + continue; + } + + /* Now the controller is in a good state */ + break; + } + + if (tries >= TW_MAX_RESET_TRIES) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Controller error or no attention interrupt: giving up for card %d.\n", numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Make sure that io region isn't already taken */ +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + if (check_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE)) { +#else + if (check_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE)) { +#endif + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't get io range 0x%lx-0x%lx for card %d.\n", +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + (tw_dev->tw_pci_dev->resource[0].start & ~15), + (tw_dev->tw_pci_dev->resource[0].start & ~15) + +#else + (tw_dev->tw_pci_dev->base_address[0] & ~15), + (tw_dev->tw_pci_dev->base_address[0] & ~15) + +#endif + TW_IO_ADDRESS_RANGE, numcards); + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Reserve the io address space */ +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + request_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE, TW_DEVICE_NAME); +#else + request_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE, TW_DEVICE_NAME); +#endif + error = tw_initialize_units(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't initialize units for card %d.\n", numcards); +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + release_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE); +#else + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE); +#endif + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + error = tw_initconnection(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Couldn't initconnection for card %d.\n", numcards); +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + release_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE); +#else + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE); +#endif + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Calculate max cmds per lun */ + if (tw_dev->num_units > 0) + tw_host->cmd_per_lun = (TW_Q_LENGTH-2)/tw_dev->num_units; + + /* Register the card with the kernel SCSI layer */ + host = scsi_register(tw_host, sizeof(TW_Device_Extension)); + + status_reg_value = inl(tw_dev->registers.status_reg_addr); + + dprintk(KERN_NOTICE "scsi%d : Found a 3ware Storage Controller at 0x%x, IRQ: %d P-chip: %d.%d\n", host->host_no, +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + (u32)(tw_pci_dev->resource[0].start & ~15), tw_pci_dev->irq, +#else + (u32)(tw_pci_dev->base_address[0] & ~15), tw_pci_dev->irq, +#endif + (status_reg_value & TW_STATUS_MAJOR_VERSION_MASK) >> 28, + (status_reg_value & TW_STATUS_MINOR_VERSION_MASK) >> 24); + + if (host->hostdata) { + tw_dev2 = (TW_Device_Extension *)host->hostdata; + memcpy(tw_dev2, tw_dev, sizeof(TW_Device_Extension)); + tw_device_extension_list[tw_device_extension_count] = tw_dev2; + numcards++; + tw_device_extension_count = numcards; + tw_dev2->host = host; + } else { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Bad scsi host data for card %d.\n", numcards-1); + scsi_unregister(host); +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + release_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE); +#else + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE); +#endif + tw_free_device_extension(tw_dev); + kfree(tw_dev); + continue; + } + + /* Re-enable interrupts on the card */ + tw_enable_interrupts(tw_dev2); + + /* Now setup the interrupt handler */ + error = tw_setup_irq(tw_dev2); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_findcards(): Error requesting irq for card %d.\n", numcards-1); + scsi_unregister(host); +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + release_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE); +#else + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE); +#endif + + tw_free_device_extension(tw_dev); + kfree(tw_dev); + numcards--; + continue; + } + + /* Free the temporary device extension */ + if (tw_dev) + kfree(tw_dev); + } + + if (numcards == 0) + printk(KERN_WARNING "3w-xxxx: tw_findcards(): No cards found.\n"); + + return numcards; +} /* End tw_findcards() */ + +/* This function will free up device extension resources */ +void tw_free_device_extension(TW_Device_Extension *tw_dev) +{ + int i, imax; + imax = TW_Q_LENGTH; + + dprintk(KERN_NOTICE "3w-xxxx: tw_free_device_extension()\n"); + /* Free command packet and generic buffer memory */ + for (i=0;icommand_packet_virtual_address[i]) + kfree(tw_dev->command_packet_virtual_address[i]); + + if (tw_dev->alignment_virtual_address[i]) + kfree(tw_dev->alignment_virtual_address[i]); + } +} /* End tw_free_device_extension() */ + +/* This function will send an initconnection command to controller */ +int tw_initconnection(TW_Device_Extension *tw_dev) +{ + u32 command_que_addr, command_que_value; + u32 status_reg_addr, status_reg_value; + u32 response_que_addr; + TW_Command *command_packet; + TW_Response_Queue response_queue; + int request_id = 0; + int i = 0; + int imax = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_initconnection()\n"); + command_que_addr = tw_dev->registers.command_que_addr; + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + /* Initialize InitConnection command packet */ + if (tw_dev->command_packet_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Bad command packet virtual address.\n"); + return 1; + } + + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_INIT_CONNECTION; + command_packet->byte0.sgl_offset = 0x0; + command_packet->size = TW_INIT_COMMAND_PACKET_SIZE; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0x0; + command_packet->byte3.host_id = 0x0; + command_packet->status = 0x0; + command_packet->flags = 0x0; + command_packet->byte6.message_credits = TW_INIT_MESSAGE_CREDITS; + command_packet->byte8.init_connection.response_queue_pointer = 0x0; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Bad command packet physical address.\n"); + return 1; + } + + /* Send command packet to the board */ + outl(command_que_value, command_que_addr); + + /* Poll for completion */ + imax = TW_POLL_MAX_RETRIES; + for (i=0;istatus != 0) { + /* bad response */ + printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Bad response, flags = 0x%x.\n", command_packet->flags); + return 1; + } + break; /* Response was okay, so we exit */ + } + } + return 0; +} /* End tw_initconnection() */ + +/* This function will initialize the fields of a device extension */ +int tw_initialize_device_extension(TW_Device_Extension *tw_dev) +{ + int i, imax; + + dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_device_extension()\n"); + imax = TW_Q_LENGTH; + + for (i=0; icommand_packet_virtual_address[i] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_device_extension(): Bad command packet virtual address.\n"); + return 1; + } + memset(tw_dev->command_packet_virtual_address[i], 0, sizeof(TW_Sector)); + + /* Initialize generic buffer */ + tw_allocate_memory(tw_dev, i, sizeof(TW_Sector), 1); + if (tw_dev->alignment_virtual_address[i] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_device_extension(): Bad alignment virtual address.\n"); + return 1; + } + memset(tw_dev->alignment_virtual_address[i], 0, sizeof(TW_Sector)); + + tw_dev->free_queue[i] = i; + tw_dev->state[i] = TW_S_INITIAL; + tw_dev->ioctl_size[i] = 0; + tw_dev->aen_queue[i] = 0; + } + + for (i=0;iis_unit_present[i] = 0; + + tw_dev->num_units = 0; + tw_dev->num_aborts = 0; + tw_dev->num_resets = 0; + tw_dev->free_head = TW_Q_START; + tw_dev->free_tail = TW_Q_LENGTH - 1; + tw_dev->posted_request_count = 0; + tw_dev->max_posted_request_count = 0; + tw_dev->max_sgl_entries = 0; + tw_dev->sgl_entries = 0; + tw_dev->host = NULL; + tw_dev->pending_head = TW_Q_START; + tw_dev->pending_tail = TW_Q_START; + tw_dev->aen_head = 0; + tw_dev->aen_tail = 0; + tw_dev->sector_count = 0; + tw_dev->max_sector_count = 0; + spin_lock_init(&tw_dev->tw_lock); +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + tw_dev->flags = 0; +#endif + return 0; +} /* End tw_initialize_device_extension() */ + +/* This function will get unit info from the controller */ +int tw_initialize_units(TW_Device_Extension *tw_dev) +{ + int found = 0; + unsigned char request_id = 0; + TW_Command *command_packet; + TW_Param *param; + int i, imax, num_units = 0; + u32 status_reg_addr, status_reg_value; + u32 command_que_addr, command_que_value; + u32 response_que_addr; + TW_Response_Queue response_queue; + u32 param_value; + unsigned char *is_unit_present; + + dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_units()\n"); + + status_reg_addr = tw_dev->registers.status_reg_addr; + command_que_addr = tw_dev->registers.command_que_addr; + response_que_addr = tw_dev->registers.response_que_addr; + + /* Setup the command packet */ + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad command packet virtual address.\n"); + return 1; + } + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.block_count = 1; + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 3; /* unit summary table */ + param->parameter_id = 3; /* unitstatus parameter */ + param->parameter_size_bytes = TW_MAX_UNITS; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad alignment physical address.\n"); + return 1; + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + /* Post the command packet to the board */ + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad command packet physical address.\n"); + return 1; + } + outl(command_que_value, command_que_addr); + + /* Poll for completion */ + imax = TW_POLL_MAX_RETRIES; + for(i=0; istatus != 0) { + /* bad response */ + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Bad response, flags = 0x%x.\n", command_packet->flags); + return 1; + } + found = 1; + break; + } + } + if (found == 0) { + /* response never received */ + printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): No response.\n"); + return 1; + } + + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + is_unit_present = (unsigned char *)&(param->data[0]); + + /* Show all units present */ + imax = TW_MAX_UNITS; + for(i=0; iis_unit_present[i] = FALSE; + } else { + dprintk(KERN_NOTICE "3w-xxxx: tw_initialize_units(): Unit %d found.\n", i); + tw_dev->is_unit_present[i] = TRUE; + num_units++; + } + } + tw_dev->num_units = num_units; + + if (num_units == 0) { + printk(KERN_NOTICE "3w-xxxx: tw_initialize_units(): No units found.\n"); + return 1; + } + + return 0; +} /* End tw_initialize_units() */ + +/* This function is the interrupt service routine */ +static void tw_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +{ + int request_id; + u32 status_reg_addr, status_reg_value; + u32 response_que_addr; + TW_Device_Extension *tw_dev = (TW_Device_Extension *)dev_instance; + TW_Response_Queue response_que; + int error = 0; + int do_response_interrupt=0; + int do_attention_interrupt=0; + int do_host_interrupt=0; + int do_command_interrupt=0; + int flags = 0; + int flags2 = 0; + TW_Command *command_packet; +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + if (test_and_set_bit(TW_IN_INTR, &tw_dev->flags)) + return; +#endif + spin_lock_irqsave(&io_request_lock, flags); + + if (tw_dev->tw_pci_dev->irq == irq) { + spin_lock_irqsave(&tw_dev->tw_lock, flags2); + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt()\n"); + + /* Read the registers */ + status_reg_addr = tw_dev->registers.status_reg_addr; + response_que_addr = tw_dev->registers.response_que_addr; + status_reg_value = inl(status_reg_addr); + + /* Check which interrupt */ + if (status_reg_value & TW_STATUS_HOST_INTERRUPT) + do_host_interrupt=1; + if (status_reg_value & TW_STATUS_ATTENTION_INTERRUPT) + do_attention_interrupt=1; + if (status_reg_value & TW_STATUS_COMMAND_INTERRUPT) + do_command_interrupt=1; + if (status_reg_value & TW_STATUS_RESPONSE_INTERRUPT) + do_response_interrupt=1; + + /* Handle host interrupt */ + if (do_host_interrupt) { + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Received host interrupt.\n"); + tw_clear_host_interrupt(tw_dev); + } + + /* Handle attention interrupt */ + if (do_attention_interrupt) { + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Received attention interrupt.\n"); + tw_state_request_start(tw_dev, &request_id); + error = tw_aen_read_queue(tw_dev, request_id); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Error reading aen queue.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + } else { + dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Clearing attention interrupt.\n"); + tw_clear_attention_interrupt(tw_dev); + } + } + + /* Handle command interrupt */ + if (do_command_interrupt) { + /* Drain as many pending commands as we can */ + while (tw_dev->pending_request_count > 0) { + request_id = tw_dev->pending_queue[tw_dev->pending_head]; + if (tw_dev->state[request_id] != TW_S_PENDING) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Found request id that wasn't pending.\n"); + break; + } + if (tw_post_command_packet(tw_dev, request_id)==0) { + if (tw_dev->pending_head == TW_Q_LENGTH-1) { + tw_dev->pending_head = TW_Q_START; + } else { + tw_dev->pending_head = tw_dev->pending_head + 1; + } + tw_dev->pending_request_count--; + } else { + break; + } + } + /* If there are no more pending requests, we mask command interrupt */ + if (tw_dev->pending_request_count == 0) + tw_mask_command_interrupt(tw_dev); + } + + /* Handle response interrupt */ + if (do_response_interrupt) { + /* Drain the response queue from the board */ + while ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) { + response_que.value = inl(response_que_addr); + request_id = response_que.u.response_id; + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet->status != 0) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Bad response, flags = 0x%x.\n", command_packet->flags); + } + if (tw_dev->state[request_id] != TW_S_POSTED) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Received a request id (%d) (opcode = 0x%x) that wasn't posted.\n", request_id, command_packet->byte0.opcode); + } + error = 0; + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): Response queue request id: %d.\n", request_id); + /* Check for internal command */ + if (tw_dev->srb[request_id] == 0) { + dprintk(KERN_WARNING "3w-xxxx: tw_interrupt(): Found internally posted command.\n"); + error = tw_aen_complete(tw_dev, request_id); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Error completing aen.\n"); + } + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unexpected bits.\n"); + } + } else { + switch (tw_dev->srb[request_id]->cmnd[0]) { + case READ_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_10\n"); + case READ_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_6\n"); + break; + case WRITE_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught WRITE_10\n"); + case WRITE_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught WRITE_6\n"); + break; + case INQUIRY: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught INQUIRY\n"); + error = tw_scsiop_inquiry_complete(tw_dev, request_id); + break; + case READ_CAPACITY: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught READ_CAPACITY\n"); + error = tw_scsiop_read_capacity_complete(tw_dev, request_id); + break; + case TW_IOCTL: + dprintk(KERN_NOTICE "3w-xxxx: tw_interrupt(): caught TW_IOCTL\n"); + error = tw_ioctl_complete(tw_dev, request_id); + break; + default: + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unknown scsi opcode: 0x%x.\n", tw_dev->srb[request_id]->cmnd[0]); + tw_dev->srb[request_id]->result = (DID_BAD_TARGET << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + } + if (error) { + /* Tell scsi layer there was an error */ + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Scsi Error.\n"); + tw_dev->srb[request_id]->result = (DID_ERROR << 16); + } else { + /* Tell scsi layer command was a success */ + tw_dev->srb[request_id]->result = (DID_OK << 16); + } + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->posted_request_count--; + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + status_reg_value = inl(status_reg_addr); + if (tw_check_bits(status_reg_value)) { + printk(KERN_WARNING "3w-xxxx: tw_interrupt(): Unexpected bits.\n"); + } + } + } + } + spin_unlock_irqrestore(&tw_dev->tw_lock, flags2); + } + spin_unlock_irqrestore(&io_request_lock, flags); +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + clear_bit(TW_IN_INTR, &tw_dev->flags); +#endif +} /* End tw_interrupt() */ + +/* This function handles ioctls from userspace to the driver */ +int tw_ioctl(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char opcode; + int bufflen; + TW_Param *param; + TW_Command *command_packet; + u32 param_value; + TW_Ioctl *ioctl = NULL; + int tw_aen_code; + + ioctl = (TW_Ioctl *)tw_dev->srb[request_id]->request_buffer; + if (ioctl == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl(): Request buffer NULL.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + bufflen = tw_dev->srb[request_id]->request_bufflen; + + /* Initialize command packet */ + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + printk(KERN_WARNING "3w-xxxx: twioctl(): Bad command packet virtual address.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + memset(command_packet, 0, sizeof(TW_Sector)); + + /* Initialize param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl(): Bad alignment virtual address.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + + dprintk(KERN_NOTICE "opcode = %d table_id = %d parameter_id = %d parameter_size_bytes = %d\n", ioctl->opcode, ioctl->table_id, ioctl->parameter_id,, ioctl->parameter_size_bytes); + opcode = ioctl->opcode; + + switch (opcode) { + case TW_OP_NOP: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_NOP.\n"); + command_packet->byte0.opcode = TW_OP_NOP; + break; + case TW_OP_GET_PARAM: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_GET_PARAM.\n"); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + param->table_id = ioctl->table_id; + param->parameter_id = ioctl->parameter_id; + param->parameter_size_bytes = ioctl->parameter_size_bytes; + tw_dev->ioctl_size[request_id] = ioctl->parameter_size_bytes; + dprintk(KERN_NOTICE "table_id = %d parameter_id = %d parameter_size_bytes %d\n", param->table_id, param->parameter_id, param->parameter_size_bytes); + break; + case TW_OP_SET_PARAM: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_SET_PARAM: table_id = %d, parameter_id = %d, parameter_size_bytes = %d.\n", + ioctl->table_id, ioctl->parameter_id, ioctl->parameter_size_bytes); + command_packet->byte0.opcode = TW_OP_SET_PARAM; + param->table_id = ioctl->table_id; + param->parameter_id = ioctl->parameter_id; + param->parameter_size_bytes = ioctl->parameter_size_bytes; + memcpy(param->data, ioctl->data, ioctl->parameter_size_bytes); + break; + case TW_OP_AEN_LISTEN: + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): caught TW_OP_AEN_LISTEN.\n"); + if (tw_dev->aen_head == tw_dev->aen_tail) { + /* aen queue empty */ + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): Aen queue empty.\n"); + tw_aen_code = TW_AEN_QUEUE_EMPTY; + memcpy(tw_dev->srb[request_id]->request_buffer, &tw_aen_code, ioctl->parameter_size_bytes); + } else { + /* Copy aen queue entry to request buffer */ + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl(): Returning aen 0x%x\n", tw_dev->aen_queue[tw_dev->aen_head]); + tw_aen_code = tw_dev->aen_queue[tw_dev->aen_head]; + memcpy(tw_dev->srb[request_id]->request_buffer, &tw_aen_code, ioctl->parameter_size_bytes); + if (tw_dev->aen_head == TW_Q_LENGTH - 1) { + tw_dev->aen_head = TW_Q_START; + } else { + tw_dev->aen_head = tw_dev->aen_head + 1; + } + } + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + default: + printk(KERN_WARNING "3w-xxxx: Unknown ioctl 0x%x.\n", opcode); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + return 0; + } + + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl(): Bad alignment physical address.\n"); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + + /* Now try to post the command to the board */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_ioctl() */ + +/* This function is called by the isr to complete ioctl requests */ +int tw_ioctl_complete(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char *param_data; + unsigned char *buff; + TW_Param *param; + + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl_complete()\n"); + buff = tw_dev->srb[request_id]->request_buffer; + if (buff == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_ioctl_complete(): Request buffer NULL.\n"); + return 1; + } + dprintk(KERN_NOTICE "3w-xxxx: tw_ioctl_complete(): Request_bufflen = %d\n", tw_dev->srb[request_id]->request_bufflen); + memset(buff, 0, tw_dev->srb[request_id]->request_bufflen); + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + if (param == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): Bad alignment virtual address.\n"); + return 1; + } + param_data = &(param->data[0]); + + memcpy(buff, param_data, tw_dev->ioctl_size[request_id]); + + return 0; +} /* End tw_ioctl_complete() */ + +/* This function will mask the command interrupt */ +void tw_mask_command_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_MASK_COMMAND_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_mask_command_interrupt() */ + +/* This function will poll the status register for a flag */ +int tw_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds) +{ + u32 status_reg_addr, status_reg_value; + struct timeval before, timeout; + + status_reg_addr = tw_dev->registers.status_reg_addr; + do_gettimeofday(&before); + status_reg_value = inl(status_reg_addr); + + while ((status_reg_value & flag) != flag) { + status_reg_value = inl(status_reg_addr); + do_gettimeofday(&timeout); + if (before.tv_sec + seconds < timeout.tv_sec) { + printk(KERN_WARNING "3w-xxxx: tw_poll_status(): Flag 0x%x not found.\n", flag); + return 1; + } + mdelay(1); + } + return 0; +} /* End tw_poll_status() */ + +/* This function will attempt to post a command packet to the board */ +int tw_post_command_packet(TW_Device_Extension *tw_dev, int request_id) +{ + u32 status_reg_addr, status_reg_value; + u32 command_que_addr, command_que_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_post_command_packet()\n"); + command_que_addr = tw_dev->registers.command_que_addr; + command_que_value = tw_dev->command_packet_physical_address[request_id]; + status_reg_addr = tw_dev->registers.status_reg_addr; + status_reg_value = inl(status_reg_addr); + + if (tw_check_bits(status_reg_value)) + printk(KERN_WARNING "3w-xxxx: tw_post_command_packet(): Unexpected bits.\n"); + + if ((status_reg_value & TW_STATUS_COMMAND_QUEUE_FULL) == 0) { + /* We successfully posted the command packet */ + outl(command_que_value, command_que_addr); + tw_dev->state[request_id] = TW_S_POSTED; + tw_dev->posted_request_count++; + if (tw_dev->posted_request_count > tw_dev->max_posted_request_count) { + tw_dev->max_posted_request_count = tw_dev->posted_request_count; + } + } else { + /* Couldn't post the command packet, so we do it in the isr */ + if (tw_dev->state[request_id] != TW_S_PENDING) { + tw_dev->state[request_id] = TW_S_PENDING; + tw_dev->pending_request_count++; + if (tw_dev->pending_request_count > tw_dev->max_pending_request_count) { + tw_dev->max_pending_request_count = tw_dev->pending_request_count; + } + tw_dev->pending_queue[tw_dev->pending_tail] = request_id; + if (tw_dev->pending_tail == TW_Q_LENGTH-1) { + tw_dev->pending_tail = TW_Q_START; + } else { + tw_dev->pending_tail = tw_dev->pending_tail + 1; + } + } + tw_unmask_command_interrupt(tw_dev); + return 1; + } + return 0; +} /* End tw_post_command_packet() */ + +/* This function will reset a device extension */ +int tw_reset_device_extension(TW_Device_Extension *tw_dev) +{ + int imax = 0; + int i = 0; + Scsi_Cmnd *srb; + + dprintk(KERN_NOTICE "3w-xxxx: tw_reset_device_extension()\n"); + imax = TW_Q_LENGTH; + + if (tw_reset_sequence(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_reset_device_extension(): Reset sequence failed for card %d.\n", tw_dev->host->host_no); + return 1; + } + + /* Abort all requests that are in progress */ + for (i=0;istate[i] != TW_S_FINISHED) && + (tw_dev->state[i] != TW_S_INITIAL) && + (tw_dev->state[i] != TW_S_COMPLETED)) { + srb = tw_dev->srb[i]; + srb->result = (DID_RESET << 16); + tw_dev->srb[i]->scsi_done(tw_dev->srb[i]); + } + } + + /* Reset queues and counts */ + for (i=0;ifree_queue[i] = i; + tw_dev->state[i] = TW_S_INITIAL; + } + tw_dev->free_head = TW_Q_START; + tw_dev->free_tail = TW_Q_LENGTH - 1; + tw_dev->posted_request_count = 0; + tw_dev->pending_request_count = 0; + tw_dev->pending_head = TW_Q_START; + tw_dev->pending_tail = TW_Q_START; + + return 0; +} /* End tw_reset_device_extension() */ + +/* This function will reset a controller */ +int tw_reset_sequence(TW_Device_Extension *tw_dev) +{ + int error = 0; + int tries = 0; + + /* Disable interrupts */ + tw_disable_interrupts(tw_dev); + + /* Reset the board */ + while (tries < TW_MAX_RESET_TRIES) { + tw_soft_reset(tw_dev); + + error = tw_aen_drain_queue(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): No attention interrupt for card %d.\n", tw_dev->host->host_no); + tries++; + continue; + } + + /* Check for controller errors */ + if (tw_check_errors(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Controller errors found, soft resetting card %d.\n", tw_dev->host->host_no); + tries++; + continue; + } + + /* Empty the response queue again */ + error = tw_empty_response_que(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Couldn't empty response queue for card %d.\n", tw_dev->host->host_no); + tries++; + continue; + } + + /* Now the controller is in a good state */ + break; + } + + if (tries >= TW_MAX_RESET_TRIES) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Controller error or no attention interrupt: giving up for card %d.\n", tw_dev->host->host_no); + return 1; + } + + error = tw_initconnection(tw_dev); + if (error) { + printk(KERN_WARNING "3w-xxxx: tw_reset_sequence(): Couldn't initconnection for card %d.\n", tw_dev->host->host_no); + return 1; + } + + /* Re-enable interrupts */ + tw_enable_interrupts(tw_dev); + + return 0; +} /* End tw_reset_sequence() */ + +/* This funciton returns unit geometry in cylinders/heads/sectors */ +int tw_scsi_biosparam(Disk *disk, kdev_t dev, int geom[]) +{ + int heads, sectors, cylinders; + TW_Device_Extension *tw_dev; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam()\n"); + tw_dev = (TW_Device_Extension *)disk->device->host->hostdata; + + heads = 64; + sectors = 32; + cylinders = disk->capacity / (heads * sectors); + + if (disk->capacity >= 0x200000) { + heads = 255; + sectors = 63; + cylinders = disk->capacity / (heads * sectors); + } + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_biosparam(): heads = %d, sectors = %d, cylinders = %d\n", heads, sectors, cylinders); + geom[0] = heads; + geom[1] = sectors; + geom[2] = cylinders; + + return 0; +} /* End tw_scsi_biosparam() */ + +/* This function will find and initialize any cards */ +int tw_scsi_detect(Scsi_Host_Template *tw_host) +{ + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_detect()\n"); + + /* Check if the kernel has PCI interface compiled in */ + if (!pci_present()) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_detect(): No pci interface present.\n"); + return 0; + } + + return(tw_findcards(tw_host)); +} /* End tw_scsi_detect() */ + +/* This is the new scsi eh abort function */ +int tw_scsi_eh_abort(Scsi_Cmnd *SCpnt) +{ + TW_Device_Extension *tw_dev=NULL; + int i = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_eh_abort()\n"); + + if (!SCpnt) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Invalid Scsi_Cmnd.\n"); + return (FAILED); + } + + tw_dev = (TW_Device_Extension *)SCpnt->host->hostdata; + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Invalid device extension.\n"); + return (FAILED); + } + + spin_lock(&tw_dev->tw_lock); + tw_dev->num_aborts++; + + /* If the command hasn't been posted yet, we can do the abort */ + for (i=0;isrb[i] == SCpnt) { + if (tw_dev->state[i] == TW_S_STARTED) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Abort succeeded for started Scsi_Cmnd 0x%x\n", (u32)tw_dev->srb[i]); + tw_dev->state[i] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, i); + spin_unlock(&tw_dev->tw_lock); + return (SUCCESS); + } + if (tw_dev->state[i] == TW_S_PENDING) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Abort succeeded for pending Scsi_Cmnd 0x%x\n", (u32)tw_dev->srb[i]); + if (tw_dev->pending_head == TW_Q_LENGTH-1) { + tw_dev->pending_head = TW_Q_START; + } else { + tw_dev->pending_head = tw_dev->pending_head + 1; + } + tw_dev->pending_request_count--; + tw_dev->state[i] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, i); + spin_unlock(&tw_dev->tw_lock); + return (SUCCESS); + } + } + } + + /* If the command has already been posted, we have to reset the card */ + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Abort failed for unknown Scsi_Cmnd 0x%x, resetting card %d.\n", (u32)SCpnt, tw_dev->host->host_no); + + if (tw_reset_device_extension(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_abort(): Reset failed for card %d.\n", tw_dev->host->host_no); + spin_unlock(&tw_dev->tw_lock); + return (FAILED); + } + spin_unlock(&tw_dev->tw_lock); + + return (SUCCESS); +} /* End tw_scsi_eh_abort() */ + +/* This is the new scsi eh reset function */ +int tw_scsi_eh_reset(Scsi_Cmnd *SCpnt) +{ + TW_Device_Extension *tw_dev=NULL; + int flags = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_eh_reset()\n"); + + if (!SCpnt) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Invalid Scsi_Cmnd.\n"); + return (FAILED); + } + + tw_dev = (TW_Device_Extension *)SCpnt->host->hostdata; + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Invalid device extension.\n"); + return (FAILED); + } + + spin_lock_irqsave(&tw_dev->tw_lock, flags); + tw_dev->num_resets++; + + /* Now reset the card and some of the device extension data */ + if (tw_reset_device_extension(tw_dev)) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Reset failed for card %d.\n", tw_dev->host->host_no); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return (FAILED); + } + printk(KERN_WARNING "3w-xxxx: tw_scsi_eh_reset(): Reset succeeded for card %d.\n", tw_dev->host->host_no); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + + return (SUCCESS); +} /* End tw_scsi_eh_reset() */ + +/* This function handles input and output from /proc/scsi/3w-xxxx/x */ +int tw_scsi_proc_info(char *buffer, char **start, off_t offset, int length, int hostno, int inout) +{ + TW_Device_Extension *tw_dev = NULL; + TW_Info info; + int i; + int j; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_proc_info()\n"); + + /* Find the correct device extension */ + for (i=0;ihost->host_no == hostno) + tw_dev = tw_device_extension_list[i]; + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_proc_info(): Couldn't locate device extension.\n"); + return (-EINVAL); + } + + info.buffer = buffer; + info.length = length; + info.offset = offset; + info.position = 0; + + if (inout) { + /* Write */ + if (strncmp(buffer, "debug", 5) == 0) { + printk(KERN_INFO "3w-xxxx: Posted commands:\n"); + for (j=0;jstate[j] == TW_S_POSTED) { + TW_Command *command = (TW_Command *)tw_dev->command_packet_virtual_address[j]; + printk(KERN_INFO "3w-xxxx: Request_id: %d\n", j); + printk(KERN_INFO "Opcode: 0x%x\n", command->byte0.opcode); + printk(KERN_INFO "Block_count: 0x%x\n", command->byte6.block_count); + printk(KERN_INFO "LBA: 0x%x\n", (u32)command->byte8.io.lba); + printk(KERN_INFO "Physical command packet addr: 0x%x\n", tw_dev->command_packet_physical_address[j]); + printk(KERN_INFO "Scsi_Cmnd: 0x%x\n", (u32)tw_dev->srb[j]); + } + } + printk(KERN_INFO "3w-xxxx: Free_head: %3d\n", tw_dev->free_head); + printk(KERN_INFO "3w-xxxx: Free_tail: %3d\n", tw_dev->free_tail); + } + return length; + } else { + /* Read */ + if (start) { + *start = buffer; + } + tw_copy_info(&info, "scsi%d: 3ware Storage Controller\n", hostno); + tw_copy_info(&info, "Driver version: %s\n", tw_driver_version); + tw_copy_info(&info, "Current commands posted: %3d\n", tw_dev->posted_request_count); + tw_copy_info(&info, "Max commands posted: %3d\n", tw_dev->max_posted_request_count); + tw_copy_info(&info, "Current pending commands: %3d\n", tw_dev->pending_request_count); + tw_copy_info(&info, "Max pending commands: %3d\n", tw_dev->max_pending_request_count); + tw_copy_info(&info, "Last sgl length: %3d\n", tw_dev->sgl_entries); + tw_copy_info(&info, "Max sgl length: %3d\n", tw_dev->max_sgl_entries); + tw_copy_info(&info, "Last sector count: %3d\n", tw_dev->sector_count); + tw_copy_info(&info, "Max sector count: %3d\n", tw_dev->max_sector_count); + tw_copy_info(&info, "Resets: %3d\n", tw_dev->num_resets); + tw_copy_info(&info, "Aborts: %3d\n", tw_dev->num_aborts); + } + if (info.position > info.offset) { + return (info.position - info.offset); + } else { + return 0; + } +} /* End tw_scsi_proc_info() */ + +/* This is the main scsi queue function to handle scsi opcodes */ +int tw_scsi_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) +{ + unsigned char *command = SCpnt->cmnd; + int request_id = 0; + int error = 0; + int flags = 0; + TW_Device_Extension *tw_dev = (TW_Device_Extension *)SCpnt->host->hostdata; + + spin_lock_irqsave(&tw_dev->tw_lock, flags); + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue()\n"); + + /* Skip scsi command if it isn't for us */ + if ((tw_dev->is_unit_present[SCpnt->target] == FALSE) || (SCpnt->lun != 0)) { + SCpnt->result = (DID_BAD_TARGET << 16); + done(SCpnt); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return 0; + } + if (done == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_queue(): Invalid done function.\n"); + SCpnt->result = (DID_ERROR << 16); + done(SCpnt); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return 0; + } + if (tw_dev == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsi_queue(): Invalid device extension.\n"); + SCpnt->result = (DID_ERROR << 16); + done(SCpnt); + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + return 0; + } + + /* Save done function into Scsi_Cmnd struct */ + SCpnt->scsi_done = done; + + /* Queue the command and get a request id */ + tw_state_request_start(tw_dev, &request_id); + + /* Save the scsi command for use by the ISR */ + tw_dev->srb[request_id] = SCpnt; + + switch (*command) { + case READ_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_10.\n"); + case READ_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_6.\n"); + case WRITE_10: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught WRITE_10.\n"); + case WRITE_6: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught WRITE_6.\n"); + error = tw_scsiop_read_write(tw_dev, request_id); + break; + case TEST_UNIT_READY: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught TEST_UNIT_READY.\n"); + error = tw_scsiop_test_unit_ready(tw_dev, request_id); + break; + case INQUIRY: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught INQUIRY.\n"); + error = tw_scsiop_inquiry(tw_dev, request_id); + break; + case READ_CAPACITY: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught READ_CAPACITY.\n"); + error = tw_scsiop_read_capacity(tw_dev, request_id); + break; + case TW_IOCTL: + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): caught TW_SCSI_IOCTL.\n"); + error = tw_ioctl(tw_dev, request_id); + break; + default: + printk(KERN_NOTICE "3w-xxxx: tw_scsi_queue(): Unknown scsi opcode: 0x%x\n", *command); + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + SCpnt->result = (DID_BAD_TARGET << 16); + done(SCpnt); + } + if (error) { + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + SCpnt->result = (DID_ERROR << 16); + done(SCpnt); + } + spin_unlock_irqrestore(&tw_dev->tw_lock, flags); + + return 0; +} /* End tw_scsi_queue() */ + +/* This function will release the resources on an rmmod call */ +int tw_scsi_release(struct Scsi_Host *tw_host) +{ + TW_Device_Extension *tw_dev; + tw_dev = (TW_Device_Extension *)tw_host->hostdata; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsi_release()\n"); + + /* Free up the IO region */ +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + release_region((tw_dev->tw_pci_dev->resource[0].start & ~15), TW_IO_ADDRESS_RANGE); +#else + release_region((tw_dev->tw_pci_dev->base_address[0] & ~15), TW_IO_ADDRESS_RANGE); +#endif + + /* Free up the IRQ */ + free_irq(tw_dev->tw_pci_dev->irq, tw_dev); + + /* Free up device extension resources */ + tw_free_device_extension(tw_dev); + + /* Tell kernel scsi-layer we are gone */ + scsi_unregister(tw_host); + + return 0; +} /* End tw_scsi_release() */ + +/* This function handles scsi inquiry commands */ +int tw_scsiop_inquiry(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Param *param; + TW_Command *command_packet; + u32 command_que_value, command_que_addr; + u32 param_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry()\n"); + + /* Initialize command packet */ + command_que_addr = tw_dev->registers.command_que_addr; + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad command packet virtual address.\n"); + return 1; + } + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = 0; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.parameter_count = 1; + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = 3; /* unit summary table */ + param->parameter_id = 3; /* unitsstatus parameter */ + param->parameter_size_bytes = TW_MAX_UNITS; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad alignment physical address.\n"); + return 1; + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry(): Bad command packet physical address.\n"); + return 1; + } + + /* Now try to post the command packet */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_scsiop_inquiry() */ + +/* This function is called by the isr to complete an inquiry command */ +int tw_scsiop_inquiry_complete(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char *is_unit_present; + unsigned char *request_buffer; + int i; + TW_Param *param; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry_complete()\n"); + + /* Fill request buffer */ + if (tw_dev->srb[request_id]->request_buffer == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry_complete(): Request buffer NULL.\n"); + return 1; + } + request_buffer = tw_dev->srb[request_id]->request_buffer; + memset(request_buffer, 0, tw_dev->srb[request_id]->request_bufflen); + request_buffer[0] = TYPE_DISK; /* Peripheral device type */ + request_buffer[1] = 0; /* Device type modifier */ + request_buffer[2] = 0; /* No ansi/iso compliance */ + request_buffer[4] = 31; /* Additional length */ + memcpy(&request_buffer[8], "3ware ", 8); /* Vendor ID */ + memcpy(&request_buffer[16], "3w-xxxx ", 16); /* Product ID */ + memcpy(&request_buffer[32], tw_driver_version, 3); + + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + if (param == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_inquiry_complete(): Bad alignment virtual address.\n"); + return 1; + } + is_unit_present = &(param->data[0]); + + for (i=0 ; iis_unit_present[i] = FALSE; + } else { + tw_dev->is_unit_present[i] = TRUE; + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_inquiry_complete: Unit %d found.\n", i); + } + } + + return 0; +} /* End tw_scsiop_inquiry_complete() */ + +/* This function handles scsi read_capacity commands */ +int tw_scsiop_read_capacity(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Param *param; + TW_Command *command_packet; + u32 command_que_addr, command_que_value; + u32 param_value; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity()\n"); + + /* Initialize command packet */ + command_que_addr = tw_dev->registers.command_que_addr; + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + + if (command_packet == NULL) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad command packet virtual address.\n"); + return 1; + } + memset(command_packet, 0, sizeof(TW_Sector)); + command_packet->byte0.opcode = TW_OP_GET_PARAM; + command_packet->byte0.sgl_offset = 2; + command_packet->size = 4; + command_packet->request_id = request_id; + command_packet->byte3.unit = tw_dev->srb[request_id]->target; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + command_packet->byte6.block_count = 1; + + /* Now setup the param */ + if (tw_dev->alignment_virtual_address[request_id] == NULL) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad alignment virtual address.\n"); + return 1; + } + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + memset(param, 0, sizeof(TW_Sector)); + param->table_id = TW_UNIT_INFORMATION_TABLE_BASE + + tw_dev->srb[request_id]->target; + param->parameter_id = 4; /* unitcapacity parameter */ + param->parameter_size_bytes = 4; + param_value = tw_dev->alignment_physical_address[request_id]; + if (param_value == 0) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad alignment physical address.\n"); + return 1; + } + + command_packet->byte8.param.sgl[0].address = param_value; + command_packet->byte8.param.sgl[0].length = sizeof(TW_Sector); + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity(): Bad command packet physical address.\n"); + return 1; + } + + /* Now try to post the command to the board */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_scsiop_read_capacity() */ + +/* This function is called by the isr to complete a readcapacity command */ +int tw_scsiop_read_capacity_complete(TW_Device_Extension *tw_dev, int request_id) +{ + unsigned char *param_data; + u32 capacity; + char *buff; + TW_Param *param; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity_complete()\n"); + + buff = tw_dev->srb[request_id]->request_buffer; + if (buff == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): Request buffer NULL.\n"); + return 1; + } + memset(buff, 0, tw_dev->srb[request_id]->request_bufflen); + param = (TW_Param *)tw_dev->alignment_virtual_address[request_id]; + if (param == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_capacity_complete(): Bad alignment virtual address.\n"); + return 1; + } + param_data = &(param->data[0]); + + capacity = (param_data[3] << 24) | (param_data[2] << 16) | + (param_data[1] << 8) | param_data[0]; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_capacity_complete(): Capacity = 0x%x.\n", capacity); + + /* Number of LBA's */ + buff[0] = (capacity >> 24); + buff[1] = (capacity >> 16) & 0xff; + buff[2] = (capacity >> 8) & 0xff; + buff[3] = capacity & 0xff; + + /* Block size in bytes (512) */ + buff[4] = (TW_BLOCK_SIZE >> 24); + buff[5] = (TW_BLOCK_SIZE >> 16) & 0xff; + buff[6] = (TW_BLOCK_SIZE >> 8) & 0xff; + buff[7] = TW_BLOCK_SIZE & 0xff; + + return 0; +} /* End tw_scsiop_read_capacity_complete() */ + +/* This function handles scsi read or write commands */ +int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id) +{ + TW_Command *command_packet; + u32 command_que_addr, command_que_value = 0; + u32 lba = 0x0, num_sectors = 0x0; + int i; + Scsi_Cmnd *srb; + struct scatterlist *sglist; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write()\n"); + + if (tw_dev->srb[request_id]->request_buffer == NULL) { + printk(KERN_WARNING "3w-xxxx: tw_scsiop_read_write(): Request buffer NULL.\n"); + return 1; + } + sglist = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; + srb = tw_dev->srb[request_id]; + + /* Initialize command packet */ + command_que_addr = tw_dev->registers.command_que_addr; + command_packet = (TW_Command *)tw_dev->command_packet_virtual_address[request_id]; + if (command_packet == NULL) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): Bad command packet virtual address.\n"); + return 1; + } + + if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == READ_10) { + command_packet->byte0.opcode = TW_OP_READ; + } else { + command_packet->byte0.opcode = TW_OP_WRITE; + } + + command_packet->byte0.sgl_offset = 3; + command_packet->size = 5; + command_packet->request_id = request_id; + command_packet->byte3.unit = srb->target; + command_packet->byte3.host_id = 0; + command_packet->status = 0; + command_packet->flags = 0; + + if (srb->cmnd[0] == READ_6 || srb->cmnd[0] == WRITE_6) { + lba = ((u32)srb->cmnd[1] << 16) | ((u32)srb->cmnd[2] << 8) | (u32)srb->cmnd[3]; + num_sectors = (u32)srb->cmnd[4]; + } else { + lba = ((u32)srb->cmnd[2] << 24) | ((u32)srb->cmnd[3] << 16) | + ((u32)srb->cmnd[4] << 8) | (u32)srb->cmnd[5]; + num_sectors = (u32)srb->cmnd[8] | ((u32)srb->cmnd[7] << 8); + } + + /* Update sector statistic */ + tw_dev->sector_count = num_sectors; + if (tw_dev->sector_count > tw_dev->max_sector_count) + tw_dev->max_sector_count = tw_dev->sector_count; + + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): lba = 0x%x num_sectors = 0x%x\n", lba, num_sectors); + command_packet->byte8.io.lba = lba; + command_packet->byte6.block_count = num_sectors; + + /* Do this if there are no sg list entries */ + if (tw_dev->srb[request_id]->use_sg == 0) { + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_read_write(): SG = 0\n"); + command_packet->byte8.io.sgl[0].address = virt_to_bus(tw_dev->srb[request_id]->request_buffer); + command_packet->byte8.io.sgl[0].length = tw_dev->srb[request_id]->request_bufflen; + } + + /* Do this if we have multiple sg list entries */ + if (tw_dev->srb[request_id]->use_sg > 0) { + for (i=0;isrb[request_id]->use_sg; i++) { + command_packet->byte8.io.sgl[i].address = virt_to_bus(sglist[i].address); + command_packet->byte8.io.sgl[i].length = sglist[i].length; + command_packet->size+=2; + } + if (tw_dev->srb[request_id]->use_sg > 1) + command_packet->size-=2; + } + + /* Update SG statistics */ + tw_dev->sgl_entries = tw_dev->srb[request_id]->use_sg; + if (tw_dev->sgl_entries > tw_dev->max_sgl_entries) + tw_dev->max_sgl_entries = tw_dev->sgl_entries; + + command_que_value = tw_dev->command_packet_physical_address[request_id]; + if (command_que_value == 0) { + dprintk(KERN_WARNING "3w-xxxx: tw_scsiop_read_write(): Bad command packet physical address.\n"); + return 1; + } + + /* Now try to post the command to the board */ + tw_post_command_packet(tw_dev, request_id); + + return 0; +} /* End tw_scsiop_read_write() */ + +/* This function will handle test unit ready scsi command */ +int tw_scsiop_test_unit_ready(TW_Device_Extension *tw_dev, int request_id) +{ + dprintk(KERN_NOTICE "3w-xxxx: tw_scsiop_test_unit_ready()\n"); + + /* Tell the scsi layer were done */ + tw_dev->state[request_id] = TW_S_COMPLETED; + tw_state_request_finish(tw_dev, request_id); + tw_dev->srb[request_id]->result = (DID_OK << 16); + tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]); + + return 0; +} /* End tw_scsiop_test_unit_ready() */ + +/* This function will setup the interrupt handler */ +int tw_setup_irq(TW_Device_Extension *tw_dev) +{ + char *device = TW_DEVICE_NAME; + int error; + + dprintk(KERN_NOTICE "3w-xxxx: tw_setup_irq()\n"); + error = request_irq(tw_dev->tw_pci_dev->irq, tw_interrupt, SA_SHIRQ, device, tw_dev); + + if (error < 0) { + printk(KERN_WARNING "3w-xxxx: tw_setup_irq(): Error requesting IRQ: %d for card %d.\n", tw_dev->tw_pci_dev->irq, tw_dev->host->host_no); + return 1; + } + return 0; +} /* End tw_setup_irq() */ + +/* This function will soft reset the controller */ +void tw_soft_reset(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = ( TW_CONTROL_ISSUE_SOFT_RESET | + TW_CONTROL_CLEAR_HOST_INTERRUPT | + TW_CONTROL_CLEAR_ATTENTION_INTERRUPT | + TW_CONTROL_MASK_COMMAND_INTERRUPT | + TW_CONTROL_MASK_RESPONSE_INTERRUPT | + TW_CONTROL_CLEAR_ERROR_STATUS | + TW_CONTROL_DISABLE_INTERRUPTS); + outl(control_reg_value, control_reg_addr); +} /* End tw_soft_reset() */ + +/* This function will free a request_id */ +int tw_state_request_finish(TW_Device_Extension *tw_dev, int request_id) +{ + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_finish()\n"); + + do { + if (tw_dev->free_tail == TW_Q_LENGTH-1) { + tw_dev->free_tail = TW_Q_START; + } else { + tw_dev->free_tail = tw_dev->free_tail + 1; + } + } while ((tw_dev->state[tw_dev->free_queue[tw_dev->free_tail]] != TW_S_COMPLETED)); + + tw_dev->free_queue[tw_dev->free_tail] = request_id; + + tw_dev->state[request_id] = TW_S_FINISHED; + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_finish(): Freeing request_id %d\n", request_id); + + return 0; +} /* End tw_state_request_finish() */ + +/* This function will assign an available request_id */ +int tw_state_request_start(TW_Device_Extension *tw_dev, int *request_id) +{ + int id = 0; + + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_start()\n"); + + /* Obtain next free request_id */ + do { + if (tw_dev->free_head == TW_Q_LENGTH - 1) { + tw_dev->free_head = TW_Q_START; + } else { + tw_dev->free_head = tw_dev->free_head + 1; + } + } while ((tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == TW_S_STARTED) || + (tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == TW_S_POSTED) || + (tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == TW_S_PENDING) || + (tw_dev->state[tw_dev->free_queue[tw_dev->free_head]] == TW_S_COMPLETED)); + + id = tw_dev->free_queue[tw_dev->free_head]; + + if (tw_dev->free_head == TW_Q_LENGTH - 1) { + tw_dev->free_head = TW_Q_START; + } else { + tw_dev->free_head = tw_dev->free_head + 1; + } + + dprintk(KERN_NOTICE "3w-xxxx: tw_state_request_start(): id = %d.\n", id); + *request_id = id; + tw_dev->state[id] = TW_S_STARTED; + + return 0; +} /* End tw_state_request_start() */ + +/* This function will unmask the command interrupt on the controller */ +void tw_unmask_command_interrupt(TW_Device_Extension *tw_dev) +{ + u32 control_reg_addr, control_reg_value; + + control_reg_addr = tw_dev->registers.control_reg_addr; + control_reg_value = TW_CONTROL_UNMASK_COMMAND_INTERRUPT; + outl(control_reg_value, control_reg_addr); +} /* End tw_unmask_command_interrupt() */ + +/* Now get things going */ +#ifdef MODULE +Scsi_Host_Template driver_template = TWXXXX; +#include "/usr/src/linux/drivers/scsi/scsi_module.c" +#endif diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h new file mode 100644 index 000000000000..ee643dfcdddc --- /dev/null +++ b/drivers/scsi/3w-xxxx.h @@ -0,0 +1,418 @@ +/* + 3w-xxxx.h -- 3ware Storage Controller device driver for Linux. + + Written By: Adam Radford + Copyright (C) 1999 3ware Inc. + + Kernel compatablity By: Andre Hedrick + Non-Copyright (C) 2000 Andre Hedrick + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + NO WARRANTY + THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT + LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is + solely responsible for determining the appropriateness of using and + distributing the Program and assumes all risks associated with its + exercise of rights under this Agreement, including but not limited to + the risks and costs of program errors, damage to or loss of data, + programs or equipment, and unavailability or interruption of operations. + + DISCLAIMER OF LIABILITY + NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED + HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Bugs/Comments/Suggestions should be mailed to: + linux@3ware.com + + For more information, goto: + http://www.3ware.com +*/ + +#ifndef _3W_XXXX_H +#define _3W_XXXX_H + +/* Convert Linux Version, Patch-level, Sub-level to LINUX_VERSION_CODE. */ +#define TW_LINUX_VERSION(V, P, S) (((V) * 65536) + ((P) * 256) + (S)) + +#ifndef LINUX_VERSION_CODE +#include +#endif /* LINUX_VERSION_CODE */ + +#include +#include + +/* Control register bit definitions */ +#define TW_CONTROL_CLEAR_HOST_INTERRUPT 0x00080000 +#define TW_CONTROL_CLEAR_ATTENTION_INTERRUPT 0x00040000 +#define TW_CONTROL_MASK_COMMAND_INTERRUPT 0x00020000 +#define TW_CONTROL_MASK_RESPONSE_INTERRUPT 0x00010000 +#define TW_CONTROL_UNMASK_COMMAND_INTERRUPT 0x00008000 +#define TW_CONTROL_UNMASK_RESPONSE_INTERRUPT 0x00004000 +#define TW_CONTROL_CLEAR_ERROR_STATUS 0x00000200 +#define TW_CONTROL_ISSUE_SOFT_RESET 0x00000100 +#define TW_CONTROL_ENABLE_INTERRUPTS 0x00000080 +#define TW_CONTROL_DISABLE_INTERRUPTS 0x00000040 +#define TW_CONTROL_ISSUE_HOST_INTERRUPT 0x00000020 + +/* Status register bit definitions */ +#define TW_STATUS_MAJOR_VERSION_MASK 0xF0000000 +#define TW_STATUS_MINOR_VERSION_MASK 0x0F000000 +#define TW_STATUS_PCI_PARITY_ERROR 0x00800000 +#define TW_STATUS_QUEUE_ERROR 0x00400000 +#define TW_STATUS_MICROCONTROLLER_ERROR 0x00200000 +#define TW_STATUS_PCI_ABORT 0x00100000 +#define TW_STATUS_HOST_INTERRUPT 0x00080000 +#define TW_STATUS_ATTENTION_INTERRUPT 0x00040000 +#define TW_STATUS_COMMAND_INTERRUPT 0x00020000 +#define TW_STATUS_RESPONSE_INTERRUPT 0x00010000 +#define TW_STATUS_COMMAND_QUEUE_FULL 0x00008000 +#define TW_STATUS_RESPONSE_QUEUE_EMPTY 0x00004000 +#define TW_STATUS_MICROCONTROLLER_READY 0x00002000 +#define TW_STATUS_COMMAND_QUEUE_EMPTY 0x00001000 +#define TW_STATUS_ALL_INTERRUPTS 0x000F0000 +#define TW_STATUS_CLEARABLE_BITS 0x00D00000 +#define TW_STATUS_EXPECTED_BITS 0x00002000 +#define TW_STATUS_UNEXPECTED_BITS 0x00F80000 + +/* RESPONSE QUEUE BIT DEFINITIONS */ +#define TW_RESPONSE_ID_MASK 0x00000FF0 + +/* PCI related defines */ +#define TW_IO_ADDRESS_RANGE 0xD +#define TW_DEVICE_NAME "3ware Storage Controller" +#define TW_VENDOR_ID (0x13C1) /* 3ware */ +#define TW_DEVICE_ID (0x1000) /* Storage Controller */ + +/* Command packet opcodes */ +#define TW_OP_NOP 0x0 +#define TW_OP_INIT_CONNECTION 0x1 +#define TW_OP_READ 0x2 +#define TW_OP_WRITE 0x3 +#define TW_OP_VERIFY 0x4 +#define TW_OP_GET_PARAM 0x12 +#define TW_OP_SET_PARAM 0x13 +#define TW_OP_SECTOR_INFO 0x1a +#define TW_OP_AEN_LISTEN 0x1c + +/* Asynchronous Event Notification (AEN) Codes */ +#define TW_AEN_QUEUE_EMPTY 0x0000 +#define TW_AEN_SOFT_RESET 0x0001 +#define TW_AEN_DEGRADED_MIRROR 0x0002 +#define TW_AEN_CONTROLLER_ERROR 0x0003 +#define TW_AEN_REBUILD_FAIL 0x0004 +#define TW_AEN_REBUILD_DONE 0x0005 +#define TW_AEN_QUEUE_FULL 0x00ff +#define TW_AEN_TABLE_UNDEFINED 0x15 + +/* Misc defines */ +#define TW_ALIGNMENT 0x200 /* 16 D-WORDS */ +#define TW_MAX_UNITS 16 +#define TW_COMMAND_ALIGNMENT_MASK 0x1ff +#define TW_INIT_MESSAGE_CREDITS 0x100 +#define TW_INIT_COMMAND_PACKET_SIZE 0x3 +#define TW_POLL_MAX_RETRIES 10000 +#define TW_MAX_SGL_LENGTH 62 +#define TW_Q_LENGTH 256 +#define TW_Q_START 0 +#define TW_MAX_SLOT 32 +#define TW_MAX_PCI_BUSES 255 +#define TW_MAX_RESET_TRIES 3 +#define TW_UNIT_INFORMATION_TABLE_BASE 0x300 +#define TW_MAX_CMDS_PER_LUN (TW_Q_LENGTH-2)/TW_MAX_UNITS +#define TW_BLOCK_SIZE 0x200 /* 512-byte blocks */ +#define TW_IOCTL 0x80 +#define TW_MAX_AEN_TRIES 100 + +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) +#define TW_IN_INTR 1 +#endif #endif /* version > v2.3.39 */ + +#ifndef MAJOR_NR +#define MAJOR_NR 8 /* SCSI */ +#endif + +/* Macros */ +#define TW_STATUS_ERRORS(x) \ + (((x & TW_STATUS_PCI_ABORT) || \ + (x & TW_STATUS_PCI_PARITY_ERROR) || \ + (x & TW_STATUS_QUEUE_ERROR) || \ + (x & TW_STATUS_MICROCONTROLLER_ERROR)) && \ + (x & TW_STATUS_MICROCONTROLLER_READY)) + +#ifdef TW_DEBUG +#define dprintk(msg...) printk(msg) +#else +#define dprintk(msg...) do { } while(0); +#endif + +#if LINUX_VERSION_CODE < TW_LINUX_VERSION(2,3,28) +extern struct proc_dir_entry tw_scsi_proc_entry; +#endif /* version < v2.3.28 */ + +/* Scatter Gather List Entry */ +typedef struct TAG_TW_SG_Entry { + unsigned long address; + unsigned long length; +} TW_SG_Entry; + +typedef unsigned char TW_Sector[512]; + +/* Command Packet */ +typedef struct TW_Command { + /* First DWORD */ + struct { + unsigned char opcode:5; + unsigned char sgl_offset:3; + } byte0; + unsigned char size; + unsigned char request_id; + struct { + unsigned char unit:4; + unsigned char host_id:4; + } byte3; + /* Second DWORD */ + unsigned char status; + unsigned char flags; + union { + unsigned short block_count; + unsigned short parameter_count; + unsigned short message_credits; + } byte6; + union { + struct { + unsigned long lba; + TW_SG_Entry sgl[TW_MAX_SGL_LENGTH]; + unsigned long padding; /* pad to 512 bytes */ + } io; + struct { + TW_SG_Entry sgl[TW_MAX_SGL_LENGTH]; + unsigned long padding[2]; + } param; + struct { + unsigned long response_queue_pointer; + unsigned long padding[125]; + } init_connection; + struct { + char version[504]; + } ioctl_miniport_version; + } byte8; +} TW_Command; + +typedef struct TAG_TW_Ioctl { + int buffer; + unsigned char opcode; + unsigned short table_id; + unsigned char parameter_id; + unsigned char parameter_size_bytes; + unsigned char data[1]; +} TW_Ioctl; + +/* GetParam descriptor */ +typedef struct { + unsigned short table_id; + unsigned char parameter_id; + unsigned char parameter_size_bytes; + unsigned char data[1]; +} TW_Param, *PTW_Param; + +/* Response queue */ +typedef union TAG_TW_Response_Queue { + struct { + u32 undefined_1: 4; + u32 response_id: 8; + u32 undefined_2: 20; + } u; + u32 value; +} TW_Response_Queue; + +typedef struct TAG_TW_Registers { + u32 base_addr; + u32 control_reg_addr; + u32 status_reg_addr; + u32 command_que_addr; + u32 response_que_addr; +} TW_Registers; + +typedef struct TAG_TW_Info { + char *buffer; + int length; + int offset; + int position; +} TW_Info; + +typedef enum TAG_TW_Cmd_State { + TW_S_INITIAL, /* Initial state */ + TW_S_STARTED, /* Id in use */ + TW_S_POSTED, /* Posted to the controller */ + TW_S_PENDING, /* Waiting to be posted in isr */ + TW_S_COMPLETED, /* Completed by isr */ + TW_S_FINISHED, /* I/O completely done */ +} TW_Cmd_State; + +typedef struct TAG_TW_Device_Extension { + TW_Registers registers; + u32 *alignment_virtual_address[TW_Q_LENGTH]; + u32 alignment_physical_address[TW_Q_LENGTH]; + int is_unit_present[TW_MAX_UNITS]; + int num_units; + u32 *command_packet_virtual_address[TW_Q_LENGTH]; + u32 command_packet_physical_address[TW_Q_LENGTH]; + struct pci_dev *tw_pci_dev; + Scsi_Cmnd *srb[TW_Q_LENGTH]; + unsigned char free_queue[TW_Q_LENGTH]; + unsigned char free_head; + unsigned char free_tail; + unsigned char pending_queue[TW_Q_LENGTH]; + unsigned char pending_head; + unsigned char pending_tail; + TW_Cmd_State state[TW_Q_LENGTH]; + u32 posted_request_count; + u32 max_posted_request_count; + u32 request_count_marked_pending; + u32 pending_request_count; + u32 max_pending_request_count; + u32 max_sgl_entries; + u32 sgl_entries; + u32 num_aborts; + u32 num_resets; + u32 sector_count; + u32 max_sector_count; + struct Scsi_Host *host; + spinlock_t tw_lock; + unsigned char ioctl_size[TW_Q_LENGTH]; + unsigned short aen_queue[TW_Q_LENGTH]; + unsigned char aen_head; + unsigned char aen_tail; +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) + u32 flags; +#endif +} TW_Device_Extension; + +/* Function prototypes */ +int tw_aen_complete(TW_Device_Extension *tw_dev, int request_id); +int tw_aen_drain_queue(TW_Device_Extension *tw_dev); +int tw_aen_read_queue(TW_Device_Extension *tw_dev, int request_id); +int tw_allocate_memory(TW_Device_Extension *tw_dev, int request_id, int size, int which); +int tw_check_bits(u32 status_reg_value); +int tw_check_errors(TW_Device_Extension *tw_dev); +void tw_clear_attention_interrupt(TW_Device_Extension *tw_dev); +void tw_clear_host_interrupt(TW_Device_Extension *tw_dev); +void tw_disable_interrupts(TW_Device_Extension *tw_dev); +int tw_empty_response_que(TW_Device_Extension *tw_dev); +void tw_enable_interrupts(TW_Device_Extension *tw_dev); +int tw_findcards(Scsi_Host_Template *tw_host); +void tw_free_device_extension(TW_Device_Extension *tw_dev); +int tw_initconnection(TW_Device_Extension *tw_dev); +int tw_initialize_device_extension(TW_Device_Extension *tw_dev); +int tw_initialize_units(TW_Device_Extension *tw_dev); +int tw_ioctl(TW_Device_Extension *tw_dev, int request_id); +int tw_ioctl_complete(TW_Device_Extension *tw_dev, int request_id); +void tw_mask_command_interrupt(TW_Device_Extension *tw_dev); +int tw_poll_status(TW_Device_Extension *tw_dev, u32 flag, int seconds); +int tw_post_command_packet(TW_Device_Extension *tw_dev, int request_id); +int tw_reset_device_extension(TW_Device_Extension *tw_dev); +int tw_reset_sequence(TW_Device_Extension *tw_dev); +int tw_scsi_biosparam(Disk *disk, kdev_t dev, int geom[]); +int tw_scsi_detect(Scsi_Host_Template *tw_host); +int tw_scsi_eh_abort(Scsi_Cmnd *SCpnt); +int tw_scsi_eh_reset(Scsi_Cmnd *SCpnt); +int tw_scsi_proc_info(char *buffer, char **start, off_t offset, int length, int inode, int inout); +int tw_scsi_queue(Scsi_Cmnd *cmd, void (*done) (Scsi_Cmnd *)); +int tw_scsi_release(struct Scsi_Host *tw_host); +int tw_scsiop_inquiry(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_inquiry_complete(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_read_capacity(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_read_capacity_complete(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_read_write(TW_Device_Extension *tw_dev, int request_id); +int tw_scsiop_test_unit_ready(TW_Device_Extension *tw_dev, int request_id); +int tw_setup_irq(TW_Device_Extension *tw_dev); +void tw_soft_reset(TW_Device_Extension *tw_dev); +int tw_state_request_finish(TW_Device_Extension *tw_dev,int request_id); +int tw_state_request_start(TW_Device_Extension *tw_dev, int *request_id); +void tw_unmask_command_interrupt(TW_Device_Extension *tw_dev); + +#ifdef HOSTS_C +#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39) +/* Scsi_Host_Template Initializer */ +#define TWXXXX { \ + next : NULL, \ + module : NULL, \ + proc_name : "3w-xxxx", \ + proc_info : tw_scsi_proc_info, \ + name : "3ware Storage Controller", \ + detect : tw_scsi_detect, \ + release : tw_scsi_release, \ + info : NULL, \ + ioctl : NULL, \ + command : NULL, \ + queuecommand : tw_scsi_queue, \ + eh_strategy_handler : NULL, \ + eh_abort_handler : tw_scsi_eh_abort, \ + eh_device_reset_handler : NULL, \ + eh_bus_reset_handler : NULL, \ + eh_host_reset_handler : tw_scsi_eh_reset, \ + abort : NULL, \ + reset : NULL, \ + slave_attach : NULL, \ + bios_param : tw_scsi_biosparam, \ + can_queue : TW_Q_LENGTH, \ + this_id: -1, \ + sg_tablesize : TW_MAX_SGL_LENGTH, \ + cmd_per_lun: TW_MAX_CMDS_PER_LUN, \ + present : 0, \ + unchecked_isa_dma : 0, \ + use_clustering : ENABLE_CLUSTERING, \ + use_new_eh_code : 1, \ + emulated : 1 \ +} +#else /* version < v2.2.?? */ +#define TWXXXX { \ + next : NULL, \ + module : NULL, \ + proc_dir : &tw_scsi_proc_entry, \ + proc_info : tw_scsi_proc_info, \ + name : "3ware Storage Controller", \ + detect : tw_scsi_detect, \ + release : tw_scsi_release, \ + info : NULL, \ + ioctl : NULL, \ + command : NULL, \ + queuecommand : tw_scsi_queue, \ + eh_strategy_handler : NULL, \ + eh_abort_handler : tw_scsi_eh_abort, \ + eh_device_reset_handler : NULL, \ + abort : NULL, \ + reset : NULL, \ + slave_attach : NULL, \ + bios_param : tw_scsi_biosparam, \ + can_queue : TW_Q_LENGTH, \ + this_id: -1, \ + sg_tablesize : TW_MAX_SGL_LENGTH, \ + cmd_per_lun: TW_MAX_CMDS_PER_LUN, \ + present : 0, \ + unchecked_isa_dma : 0, \ + use_clustering : ENABLE_CLUSTERING, \ + use_new_eh_code : 1 \ +} +#endif /* version < v2.2.?? */ +#endif /* HOSTS_C */ +#endif /* _3W_XXXX_H */ diff --git a/drivers/scsi/53c7xx.c b/drivers/scsi/53c7xx.c index 2fbbe449bebc..a5e0ca0a263c 100644 --- a/drivers/scsi/53c7xx.c +++ b/drivers/scsi/53c7xx.c @@ -245,7 +245,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/scsi/Config.in b/drivers/scsi/Config.in index d83913442563..a1a82d96fe97 100644 --- a/drivers/scsi/Config.in +++ b/drivers/scsi/Config.in @@ -30,9 +30,9 @@ dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $CONFIG_SCSI dep_tristate 'Adaptec AIC7xxx support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI if [ "$CONFIG_SCSI_AIC7XXX" != "n" ]; then bool ' Enable Tagged Command Queueing (TCQ) by default' CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT - int 'Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8 + int ' Maximum number of TCQ commands per device' CONFIG_AIC7XXX_CMDS_PER_DEVICE 8 bool ' Collect statistics to report in /proc' CONFIG_AIC7XXX_PROC_STATS - int 'Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5 + int ' Delay in seconds after SCSI bus reset' CONFIG_AIC7XXX_RESET_DELAY 5 fi dep_tristate 'IBM ServeRAID support' CONFIG_SCSI_IPS $CONFIG_SCSI dep_tristate 'AdvanSys SCSI support' CONFIG_SCSI_ADVANSYS $CONFIG_SCSI @@ -49,7 +49,7 @@ dep_tristate 'EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) supp if [ "$CONFIG_SCSI_EATA" != "n" ]; then bool ' enable tagged command queueing' CONFIG_SCSI_EATA_TAGGED_QUEUE bool ' enable elevator sorting' CONFIG_SCSI_EATA_LINKED_COMMANDS - int 'maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16 + int ' maximum number of queued commands' CONFIG_SCSI_EATA_MAX_TAGS 16 fi dep_tristate 'EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support' CONFIG_SCSI_EATA_DMA $CONFIG_SCSI dep_tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO $CONFIG_SCSI @@ -92,9 +92,9 @@ if [ "$CONFIG_PCI" = "y" -a "$CONFIG_SCSI_NCR53C7xx" != "y" ]; then dep_tristate 'NCR53C8XX SCSI support' CONFIG_SCSI_NCR53C8XX $CONFIG_SCSI dep_tristate 'SYM53C8XX SCSI support' CONFIG_SCSI_SYM53C8XX $CONFIG_SCSI if [ "$CONFIG_SCSI_NCR53C8XX" != "n" -o "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then - int 'default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8 - int 'maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32 - int 'synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20 + int ' default tagged command queue depth' CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS 8 + int ' maximum number of queued commands' CONFIG_SCSI_NCR53C8XX_MAX_TAGS 32 + int ' synchronous transfers frequency in MHz' CONFIG_SCSI_NCR53C8XX_SYNC 20 bool ' enable profiling' CONFIG_SCSI_NCR53C8XX_PROFILE bool ' use normal IO' CONFIG_SCSI_NCR53C8XX_IOMAPPED if [ "$CONFIG_SCSI_SYM53C8XX" != "n" ]; then @@ -138,7 +138,7 @@ dep_tristate 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 $CONFIG_SCS dep_tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F $CONFIG_SCSI if [ "$CONFIG_SCSI_U14_34F" != "n" ]; then bool ' enable elevator sorting' CONFIG_SCSI_U14_34F_LINKED_COMMANDS - int 'maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8 + int ' maximum number of queued commands' CONFIG_SCSI_U14_34F_MAX_TAGS 8 fi dep_tristate 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR $CONFIG_SCSI # @@ -155,7 +155,7 @@ fi if [ "$CONFIG_PPC" = "y" ]; then dep_tristate 'MESH (Power Mac internal SCSI) support' CONFIG_SCSI_MESH $CONFIG_SCSI if [ "$CONFIG_SCSI_MESH" != "n" ]; then - int 'maximum synchronous transfer rate (MB/s) (0 = async)' CONFIG_SCSI_MESH_SYNC_RATE 5 + int ' maximum synchronous transfer rate (MB/s) (0 = async)' CONFIG_SCSI_MESH_SYNC_RATE 5 fi dep_tristate '53C94 (Power Mac external SCSI) support' CONFIG_SCSI_MAC53C94 $CONFIG_SCSI fi @@ -165,4 +165,8 @@ fi if [ "$CONFIG_MIPS_JAZZ" = "y" ]; then bool 'MIPS JAZZ FAS216 SCSI support' CONFIG_JAZZ_ESP fi +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + dep_tristate '3Ware Hardware ATA-RAID support (EXPERIMENTAL)' CONFIG_BLK_DEV_3W_XXXX_RAID $CONFIG_SCSI +fi + endmenu diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 9d8c7ac2b9c6..17a94c26c6b1 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -675,6 +675,14 @@ ifeq ($(CONFIG_SUN3X_ESP),y) L_OBJS += NCR53C9x.o sun3x_esp.o endif +ifeq ($(CONFIG_BLK_DEV_3W_XXXX_RAID),y) +L_OBJS += 3w-xxxx.o +else + ifeq ($(CONFIG_BLK_DEV_3W_XXXX_RAID),m) + M_OBJS += 3w-xxxx.o + endif +endif + include $(TOPDIR)/Rules.make 53c8xx_d.h: 53c7,8xx.scr script_asm.pl diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 95a132498cc4..ee952d0afffa 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -347,6 +347,10 @@ #include "../net/fc/iph5526_scsi.h" #endif +#ifdef CONFIG_BLK_DEV_3W_XXXX_RAID +#include "3w-xxxx.h" +#endif + /* * Moved ppa driver to the end of the probe list * since it is a removable host adapter. @@ -625,6 +629,10 @@ static Scsi_Host_Template builtin_scsi_hosts[] = #ifdef CONFIG_IPHASE5526 IPH5526_SCSI_FC, #endif +#ifdef CONFIG_BLK_DEV_3W_XXXX_RAID + TWXXXX, +#endif + /* "Removable host adapters" below this line (Parallel Port/USB/other) */ #ifdef CONFIG_SCSI_PPA PPA, diff --git a/drivers/sgi/char/graphics.c b/drivers/sgi/char/graphics.c index 2fb28fe4335f..7c68774c421e 100644 --- a/drivers/sgi/char/graphics.c +++ b/drivers/sgi/char/graphics.c @@ -254,15 +254,7 @@ sgi_graphics_nopage (struct vm_area_struct *vma, unsigned long address, int */ static struct vm_operations_struct graphics_mmap = { - NULL, /* no special mmap-open */ - NULL, /* no special mmap-close */ - NULL, /* no special mmap-unmap */ - NULL, /* no special mmap-protect */ - NULL, /* no special mmap-sync */ - NULL, /* no special mmap-advise */ - sgi_graphics_nopage, /* our magic no-page fault handler */ - NULL, /* no special mmap-wppage */ - NULL /* no special mmap-swapout */ + nopage: sgi_graphics_nopage, /* our magic no-page fault handler */ }; int diff --git a/drivers/sgi/char/shmiq.c b/drivers/sgi/char/shmiq.c index 0b5311057f2b..0b1965b6f5dd 100644 --- a/drivers/sgi/char/shmiq.c +++ b/drivers/sgi/char/shmiq.c @@ -296,15 +296,7 @@ shmiq_nopage (struct vm_area_struct *vma, unsigned long address, int write_acces } static struct vm_operations_struct qcntl_mmap = { - NULL, /* no special mmap-open */ - NULL, /* no special mmap-close */ - NULL, /* no special mmap-unmap */ - NULL, /* no special mmap-protect */ - NULL, /* no special mmap-sync */ - NULL, /* no special mmap-advise */ - shmiq_nopage, /* our magic no-page fault handler */ - NULL, /* no special mmap-wppage */ - NULL /* no special mmap-swapout */ + nopage: shmiq_nopage, /* our magic no-page fault handler */ }; static int diff --git a/drivers/usb/Config.in b/drivers/usb/Config.in index 215fc53a464c..5963bc5fd3ee 100644 --- a/drivers/usb/Config.in +++ b/drivers/usb/Config.in @@ -49,7 +49,12 @@ comment 'USB HID' dep_tristate ' Keyboard support' CONFIG_INPUT_KEYBDEV $CONFIG_USB dep_tristate ' Mouse support' CONFIG_INPUT_MOUSEDEV $CONFIG_USB if [ "$CONFIG_INPUT_MOUSEDEV" != "n" ]; then - bool ' Mix all mice into one device' CONFIG_INPUT_MOUSEDEV_MIX + bool ' Mix all mice into one device' CONFIG_INPUT_MOUSEDEV_MIX + bool ' Support for digitizers' CONFIG_INPUT_MOUSEDEV_DIGITIZER + if [ "$CONFIG_INPUT_MOUSEDEV_DIGITIZER" != "n" ]; then + int ' Horizontal screen resolution' CONFIG_INPUT_MOUSEDEV_SCREEN_X 1024 + int ' Vertical screen resolution' CONFIG_INPUT_MOUSEDEV_SCREEN_Y 768 + fi fi dep_tristate ' Joystick support' CONFIG_INPUT_JOYDEV $CONFIG_USB dep_tristate ' Event interface support' CONFIG_INPUT_EVDEV $CONFIG_USB diff --git a/drivers/usb/bitstream.h b/drivers/usb/bitstream.h deleted file mode 100644 index 5d272b1307df..000000000000 --- a/drivers/usb/bitstream.h +++ /dev/null @@ -1,1508 +0,0 @@ -static unsigned char bitstream[] = { -0x00,0x09,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0, -0x0F,0xF0,0x00,0x00,0x01,0x61,0x00,0x0D, -0x64,0x61,0x62,0x75,0x73,0x62,0x74,0x72, -0x2E,0x6E,0x63,0x64,0x00,0x62,0x00,0x0B, -0x73,0x31,0x30,0x78,0x6C,0x76,0x71,0x31, -0x30,0x30,0x00,0x63,0x00,0x0B,0x31,0x39, -0x39,0x39,0x2F,0x30,0x39,0x2F,0x32,0x34, -0x00,0x64,0x00,0x09,0x31,0x30,0x3A,0x34, -0x32,0x3A,0x34,0x36,0x00,0x65,0x00,0x00, -0x2E,0xC0,0xFF,0x20,0x17,0x5F,0x9F,0x5B, -0xFE,0xFB,0xBB,0xB7,0xBB,0xBB,0xFB,0xBF, -0xAF,0xEF,0xFB,0xDF,0xB7,0xFB,0xFB,0x7F, -0xBF,0xB7,0xEF,0xF2,0xFF,0xFB,0xFE,0xFF, -0xFF,0xEF,0xFF,0xFE,0xFF,0xBF,0xFF,0xFF, -0xFF,0xFF,0xAF,0xFF,0xFA,0xFF,0xFF,0xFF, -0xC9,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFB,0xFF,0xA3,0xFF,0xFB, -0xFE,0xFF,0xBF,0xEF,0xE3,0xFE,0xFF,0xBF, -0xE3,0xFE,0xFF,0xBF,0x6F,0xFB,0xF6,0xFF, -0xBF,0xFF,0x47,0xFF,0xFF,0x9F,0xEE,0xF9, -0xFE,0xCF,0x9F,0xEF,0xFB,0xCF,0x9B,0xEE, -0xF8,0xFE,0xEF,0x8F,0xEE,0xFB,0xFE,0x0B, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xBF,0xFF,0xFF,0xFB,0xFF,0xFF, -0xBF,0xFF,0xFF,0xFC,0x17,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F, -0xFF,0xFF,0xFB,0xFF,0xFF,0x7F,0xFF,0xFF, -0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x5F,0xFF, -0xFF,0xFD,0xFF,0xFF,0xDB,0xFF,0xFD,0xFF, -0x77,0xFF,0xFD,0xFF,0xFF,0xDF,0xFE,0xFD, -0xFF,0xFF,0xF2,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1, -0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF, -0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0x67,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF, -0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0x2F,0xFF, -0xF3,0xFD,0xFF,0x7F,0xDE,0xF7,0xFD,0xFF, -0x7F,0xF7,0x7D,0xFF,0x7F,0xDF,0xF7,0xBD, -0xFF,0x7F,0xFF,0x1F,0xFF,0xEF,0xFB,0xFE, -0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xEF,0xFB, -0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF, -0x3F,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F, -0x9F,0xE7,0xFA,0x7F,0x9F,0xE7,0xF9,0xFE, -0x7F,0x9F,0xE7,0xFF,0xFC,0x7F,0xBF,0xBF, -0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xB7, -0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFF,0xE0,0xFD,0xF9,0xFE,0x7F,0x9F,0xE7, -0xF9,0xFE,0x7F,0x9D,0xF9,0xFE,0x7D,0x9D, -0xE7,0xF9,0xFE,0x7F,0x9F,0xED,0xED,0xFF, -0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F, -0xDF,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF, -0x7F,0xDF,0xFF,0x9B,0xFF,0xEF,0xFB,0xFE, -0xFB,0xBF,0xEF,0xBB,0xFE,0xFF,0xAF,0xBB, -0xBE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF, -0xB7,0xBF,0xDB,0xF6,0xBD,0xBF,0x6B,0xDB, -0xF6,0xF9,0xBF,0x5B,0xD6,0xF9,0xBF,0x6F, -0xDB,0xF6,0xFD,0xBF,0xFF,0x0E,0xFF,0xFF, -0xFF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0x7F, -0xF7,0xBD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xDF,0x9F,0xFF,0xFF,0xFF,0xFE,0xFF, -0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0x77,0xFF, -0xFB,0xFB,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F, -0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xF4,0x7F,0xFF,0xFE,0xFD, -0xBE,0xFF,0xDF,0xFE,0xFF,0xFF,0xEF,0x7F, -0xFF,0xCF,0xFF,0xCF,0xFF,0xFF,0xFF,0xDF, -0xE6,0xFF,0xFF,0x7F,0xDF,0xF7,0xDD,0x7F, -0x7F,0xDF,0xF7,0xFF,0x7F,0xDF,0xD7,0xFD, -0xFF,0x7F,0xDF,0xF7,0xFF,0xCD,0xFF,0xF2, -0xFF,0xFF,0x4F,0x7F,0xF4,0xFF,0xFF,0xFF, -0xE7,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xBB,0xFF,0xEF,0xFF,0xFE,0xFF, -0xFF,0xFF,0xEF,0xFF,0xFF,0xEF,0xFF,0xFB, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x65, -0xEF,0xFF,0xFF,0x7F,0xFF,0xFD,0xEF,0xFF, -0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFE,0xCF,0xDF,0xFE,0xFF, -0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFE,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xBF,0xFF, -0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xEF,0xEB,0xFF,0xFE,0xBF,0xFF, -0xEB,0xFF,0xFC,0x7F,0xFF,0xFF,0xFF,0xEE, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF, -0xD6,0xFF,0xFD,0xBF,0xFF,0xFB,0xFF,0xFE, -0xFD,0xFF,0xFF,0xFD,0xEF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xDE,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0x7F,0xBF, -0xFF,0x5F,0xDF,0xFF,0xFF,0xBF,0x77,0xFF, -0xFF,0xFF,0x7F,0xD7,0xFF,0xFF,0xFF,0xFF, -0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xDF,0xEF, -0xFF,0xFF,0xFE,0xFB,0xFF,0xFF,0xDF,0xBF, -0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xB7,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xAF,0x7F,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xDF,0xBF,0xDF,0xF3,0xFD,0xFB,0xFF,0x5B, -0xFD,0xFF,0xBF,0xEF,0xF7,0xFF,0xFF,0x7D, -0xFF,0xFF,0xFF,0xFF,0xF8,0x3B,0xFF,0xBF, -0x6F,0xFF,0xFE,0xFF,0xBF,0xFF,0xEB,0x7D, -0xFF,0xEF,0xFB,0xFE,0xFF,0xFF,0xFF,0xFF, -0xFF,0xF2,0x7F,0xFC,0xFF,0x3F,0xDF,0xED, -0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0x5F,0xF7, -0xB5,0xFF,0xEF,0xFF,0xFF,0xFF,0xE0,0x3F, -0x9F,0x9E,0xFF,0xFF,0xEF,0xFF,0xDF,0xFF, -0xBF,0x5F,0xBF,0xCF,0xF3,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0x69,0xAF,0x33,0xFD,0xFF, -0xFB,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0x7F, -0xD9,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xF5, -0xA3,0xDF,0x6E,0xDE,0xFF,0xFF,0xBD,0xFF, -0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xE7,0xFD, -0xFF,0xFF,0xFF,0xF9,0xEF,0xC6,0xFE,0xB7, -0xAD,0xE5,0xF9,0xFF,0xFF,0xFF,0xCF,0xFF, -0xFF,0xFF,0xCD,0xFB,0x7F,0xFF,0xFF,0xFF, -0xF9,0xF6,0x0F,0xDF,0xEC,0xCF,0x7F,0xFF, -0xFB,0x7F,0xFF,0xFF,0xFF,0xFD,0xFF,0xFE, -0xF9,0xFD,0x7F,0xFF,0x7F,0xFF,0xF9,0x5B, -0xFF,0x73,0xDC,0xFD,0x7B,0xDF,0xFF,0xFF, -0xFF,0x7B,0xFF,0xFF,0xF7,0x53,0xD6,0xFF, -0xFF,0xFF,0xFF,0xD8,0x9F,0xFE,0xFF,0xEF, -0x7F,0xEE,0xFF,0xFF,0xFF,0xFB,0xED,0xED, -0xFD,0xFF,0xFE,0xFF,0xFF,0xFB,0x7F,0xFF, -0xE2,0x7F,0xFF,0x6F,0xD8,0x57,0xF7,0xFF, -0xFF,0xFF,0xDF,0xFF,0xE8,0xFF,0xFF,0xFD, -0xFF,0xFF,0xFC,0x7F,0xFF,0xE4,0xFF,0xFB, -0xEF,0xFB,0xFE,0xDF,0xB7,0xED,0xFF,0xFE, -0xDF,0x7F,0xFF,0xFE,0x7F,0xB7,0xFF,0xFF, -0xFF,0xFF,0x89,0xFF,0xFF,0xCF,0xF3,0xFE, -0x7F,0xFF,0xEF,0xFF,0xFE,0x7E,0x7F,0xFB, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF1, -0xFF,0xEB,0x7A,0xD5,0xBF,0x6F,0xDB,0xBE, -0xFD,0xB7,0xD8,0xF6,0xE5,0xBF,0x6F,0xFB, -0xFE,0xF5,0xBD,0x7E,0x06,0xFF,0xDF,0xF7, -0xFB,0xF6,0xFF,0x3F,0xFF,0xDB,0xFF,0xFF, -0x6F,0xFB,0xF7,0xFF,0xFF,0xFF,0xFB,0xFE, -0xF7,0xAF,0xFF,0xB7,0xED,0xEF,0xF7,0xFE, -0xFF,0xFF,0xDF,0xFF,0xFE,0xFF,0xEF,0xFF, -0xFF,0xFF,0xFF,0xBF,0xF7,0xFC,0x1F,0xEE, -0xFB,0xFE,0xBD,0xFF,0x7F,0x5F,0xD7,0xFD, -0xFB,0x43,0xFF,0xFF,0xFD,0xFF,0x5F,0xFF, -0xF7,0xFF,0xF9,0x3F,0xFF,0xCF,0xF3,0xFD, -0xF7,0x7E,0xEF,0xA7,0xF9,0xFE,0x8F,0xA7, -0xE9,0xF3,0x7E,0x9F,0xFB,0xF8,0xFF,0xFF, -0x3F,0xFD,0x7F,0x5F,0xDF,0xFD,0xFF,0xFF, -0x5F,0xFF,0xFD,0x5F,0xFF,0xFF,0x7F,0xFD, -0x7F,0xFD,0x9F,0xFF,0xE0,0xFF,0xFA,0xF8, -0xBE,0x6F,0x9F,0xE6,0xF8,0xBE,0x3F,0x9A, -0xF9,0xBE,0x6F,0x9F,0xE2,0xF9,0xFE,0x6F, -0x9F,0xF9,0xFF,0xF5,0xFD,0x7F,0xCF,0xDF, -0xFD,0xFD,0x7F,0xFF,0xF5,0xFF,0xFF,0xFF, -0xF7,0xF5,0xFD,0x0F,0xDB,0xFF,0xD3,0xFF, -0xEB,0xFA,0xFF,0xFF,0xBF,0xFF,0xFA,0xFF, -0xFF,0xCB,0xFB,0xFE,0xFF,0xFF,0xEB,0xFA, -0xFE,0xFF,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF, -0xBF,0xFF,0xDF,0xF5,0xFF,0xFF,0xD7,0xFF, -0xFF,0xFF,0xDF,0xD7,0xF5,0xFF,0x7F,0xFE, -0x4F,0xFF,0xFD,0xFF,0x7F,0x7F,0xFF,0xAD, -0xEB,0xFB,0xFF,0xAD,0xFF,0xFF,0xFF,0xFF, -0xAF,0xEB,0xFB,0xFF,0xFC,0x0D,0xFF,0xFF, -0xDF,0xD2,0xFD,0xFF,0xFF,0xFD,0xF6,0xFF, -0xFF,0x7F,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF, -0xFF,0xFB,0x3F,0x7D,0xEB,0x32,0xFE,0xBF, -0x2F,0xEB,0xFA,0xAE,0xBD,0xE0,0xFA,0x7E, -0xBF,0xAD,0xEB,0xFA,0xFE,0xBF,0xF5,0x7F, -0xFF,0xDE,0xFE,0xE3,0xFB,0xFF,0xFF,0xFF, -0xDF,0xEF,0x4F,0xDF,0xFF,0x7F,0xDF,0xFF, -0xF7,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xEF, -0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xDF, -0xED,0xFB,0xDF,0xFF,0xBF,0xFF,0xFF,0xFF, -0x81,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF, -0xFF,0xFF,0xFE,0xDD,0xFE,0xEF,0xFD,0xFF, -0xFF,0xFB,0xFE,0xF7,0xFF,0x93,0xFD,0xFB, -0x7E,0xFF,0xFE,0x87,0xE9,0xFF,0x7F,0xB3, -0x9F,0xFE,0xFE,0xFF,0xAF,0xFD,0xFE,0x7E, -0x3F,0xFE,0x67,0xFF,0xFF,0xF7,0xFF,0xFF, -0xFC,0xF7,0xDF,0xFD,0xFF,0x7F,0xFF,0xFF, -0x7F,0x6D,0xFF,0xFF,0xFE,0xFF,0xFF,0x2F, -0xFF,0xBF,0xFF,0xFF,0xEE,0xFF,0xBE,0xFF, -0xFF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF, -0xEF,0xFF,0xFF,0xFA,0x5F,0xFF,0xFF,0xFB, -0xFF,0xFF,0xEF,0xFF,0xFB,0xFE,0xFD,0xFF, -0xFE,0xFF,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF, -0xFE,0xBF,0xDF,0xFF,0xFB,0xFF,0xFF,0xF7, -0xFC,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F, -0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0x7F,0xFF, -0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF, -0xF3,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF, -0xFF,0xDF,0xE2,0xFF,0xFF,0xFB,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFB,0xE7,0xFF,0xFD, -0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xED, -0xEF,0xFD,0xFF,0xFF,0xDF,0xD7,0xF5,0xFD, -0x7F,0x5D,0xFD,0xFF,0x7F,0xDF,0x97,0xF4, -0xFD,0x7B,0x5F,0xFF,0xC9,0xFF,0xFB,0xFE, -0xFF,0xBF,0xFF,0x5F,0xFF,0xFF,0xF7,0xFF, -0xEF,0xFD,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xF7,0xFF,0xD7,0xFD,0x7D,0x7F,0xFF, -0xFF,0xFF,0xFF,0xEF,0xDF,0xF7,0xFD,0xFF, -0xBB,0xFF,0xFF,0x7F,0xFF,0xFE,0xE3,0xFF, -0xF9,0xFE,0x7F,0xBF,0xEF,0xFB,0xFE,0xFF, -0xBF,0xF9,0xFE,0xFF,0x9F,0xEF,0xF9,0xFE, -0xFF,0xBF,0xF3,0xDA,0xFF,0x37,0xCD,0xF3, -0x7C,0xDF,0x37,0xCD,0xF3,0x7F,0x37,0xCD, -0xF3,0x7C,0xDF,0x37,0xCC,0xF3,0x7F,0x5A, -0xBD,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFD, -0xBF,0x6F,0xDE,0xFD,0xBF,0x6F,0xDB,0xF6, -0xFD,0xBF,0x6F,0xFE,0xF1,0x6F,0xEB,0x7A, -0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7,0xAF, -0x7A,0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7, -0xFF,0x7E,0xFF,0xFE,0xCD,0xB3,0x6C,0xDB, -0x36,0xCD,0xB3,0x6C,0xDE,0xCD,0xB3,0x6C, -0xDB,0x36,0xCD,0xB3,0x6C,0xDF,0xC9,0xBF, -0xF7,0xBD,0xEF,0x7A,0x9E,0xA7,0xA9,0xEA, -0x7A,0xB7,0xBD,0xEA,0x7B,0xDE,0xA7,0xBD, -0xCA,0x72,0x8D,0x91,0xFF,0xEF,0xFB,0xFE, -0xFF,0xBF,0xEF,0xFB,0xFE,0xF7,0xEF,0xFB, -0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFE, -0x87,0xFF,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6, -0xFD,0xBF,0x6F,0xF6,0xFD,0xBF,0x6F,0xDB, -0xF6,0xFD,0xBF,0x6F,0xFE,0x4F,0xFF,0xBF, -0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB,0xEF, -0xBE,0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB, -0xEF,0xFC,0x5F,0xFF,0xFF,0xFF,0x3F,0xCF, -0xF3,0xFC,0xFF,0x3F,0xCF,0xFC,0xFF,0x3F, -0xCF,0xF3,0xFC,0xFF,0x3F,0xCF,0xFD,0x9F, -0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF, -0xEB,0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF, -0xAF,0xEB,0xFF,0xE1,0x6F,0xFD,0xFF,0x7F, -0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFD,0xFF, -0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF, -0x7A,0xBF,0xFB,0xFE,0xDF,0xB7,0xED,0xFB, -0x7E,0xDF,0xB7,0xFB,0x7E,0xDF,0xB7,0xED, -0xFB,0x7E,0xDF,0xB7,0xFF,0xC9,0xFF,0xFF, -0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEE, -0xFB,0xFE,0xBB,0xFF,0xFE,0xFF,0xBF,0xEF, -0xFB,0xFE,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF, -0xEF,0xFB,0xFE,0xFF,0x3F,0xCF,0xFF,0xE7, -0xFE,0xFF,0xF5,0xFD,0x77,0x5D,0xD7,0x35, -0xDD,0x77,0xD7,0xF5,0xCD,0x7B,0x5D,0xD7, -0xF5,0xDD,0x77,0xFE,0x27,0xFF,0xFF,0x8B, -0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9,0xAF, -0x8B,0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9, -0xFE,0x1F,0xFF,0x5F,0xD7,0xF5,0xFD,0x7F, -0x5F,0xD7,0xF5,0xFF,0x5F,0xD7,0xF5,0xFD, -0x7F,0x5F,0xD7,0xF5,0xFF,0xFA,0x3F,0xFE, -0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xEB, -0xEC,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF, -0xEB,0xFF,0xFE,0x7F,0xFD,0x7F,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6, -0xFF,0xFA,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF, -0xF7,0xFC,0xFF,0xDF,0xF7,0xFD,0xFF,0x7F, -0xDF,0xF7,0xFD,0xFF,0xF5,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0x02,0xFF,0xFE,0xBF,0xAB,0xEB,0xFA, -0xBE,0xBF,0x23,0xEB,0xDE,0x1F,0xAF,0xEA, -0xFA,0xFE,0xAF,0xAF,0xEB,0xFD,0x97,0xFF, -0xF3,0xFC,0x7B,0x1F,0xCF,0xF1,0xFC,0x7F, -0x1F,0xF1,0xFC,0x77,0x1F,0xCD,0xF1,0xFC, -0xFF,0x1F,0xFE,0x87,0xFF,0xAF,0xEF,0xFA, -0xFE,0xFF,0xAF,0xEF,0xFA,0xFD,0xBF,0x2B, -0xFB,0x7E,0xBF,0xBF,0xEB,0xFB,0xFB,0xFB, -0xDF,0xFF,0xFB,0xF7,0xFF,0xFF,0x7F,0xF7, -0xF7,0xFF,0xFD,0xDF,0xFE,0xFC,0xDF,0xFF, -0xDF,0xFF,0xFD,0xFF,0xDA,0xBF,0xFF,0xBB, -0xEF,0xFB,0xF9,0xFF,0xBE,0xEF,0xFB,0xFB, -0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFF,0xF7,0x7F,0xFD,0xD7,0xFF,0xFF,0x7F, -0xFF,0xFF,0xFF,0xFE,0xF7,0xFF,0xFE,0xFF, -0xF7,0xFF,0xFF,0x7F,0xFF,0xFF,0xEC,0xFF, -0xFF,0xFE,0xDF,0xBF,0xFF,0xFB,0xFE,0xFF, -0xBB,0x68,0xAE,0x1F,0xAE,0xFB,0xFB,0xFF, -0xFF,0xBF,0xFF,0xD5,0xFF,0x7F,0xFF,0xFF, -0xF7,0xFE,0xFE,0xFF,0xBF,0xEF,0x9F,0xFD, -0x7F,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF,0xFF, -0xBB,0xF7,0xBF,0xFF,0xFF,0xFF,0xFF,0xDF, -0xFF,0xBF,0xFB,0xFF,0xFF,0xFF,0xDE,0x3F, -0xFF,0xFF,0xFF,0xFF,0xFF,0xA7,0xFF,0xFF, -0xFF,0xFF,0xEF,0xFF,0x7F,0xFB,0xFD,0xFB, -0x7F,0xFF,0xFF,0xFF,0xFF,0xCF,0xF3,0x7C, -0xFF,0x7F,0x8D,0x7F,0xFF,0xFF,0xFF,0xFF, -0xFB,0xFF,0xF7,0xFB,0xFE,0xFD,0xFF,0xFF, -0xFF,0xFF,0xF7,0xFD,0xFF,0x7F,0xFD,0x1F, -0xFD,0xFF,0xFF,0xFF,0xFF,0xBF,0xDF,0xFF, -0xFF,0xFE,0x5C,0xFF,0x6D,0xFF,0x7F,0xAB, -0xE7,0xF1,0xFF,0xFD,0x9F,0xFF,0xFF,0xAD, -0xEB,0x7A,0x3F,0x1F,0xFF,0xFF,0xFE,0xBF, -0xAF,0xF3,0xDE,0xF5,0xFF,0x8F,0xFB,0xDF, -0xE6,0x7F,0xFF,0xDF,0xF3,0xFD,0xFF,0x7E, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xF7,0xF3, -0x7F,0xDF,0xF7,0xEF,0xFF,0xF6,0x3F,0x9F, -0xDF,0xFF,0xFF,0xEE,0xFF,0xFF,0xEF,0xFB, -0xFF,0xFF,0xF9,0xFB,0xFE,0x4F,0xBF,0xEF, -0xBB,0xFF,0x69,0xAF,0xAF,0xFC,0xFF,0x3F, -0xDD,0xFF,0xFC,0xBF,0x8F,0xFF,0xFD,0xF3, -0xBF,0xED,0x9E,0xFC,0xBF,0x6F,0xF5,0xD3, -0xDF,0xFF,0xDB,0xD6,0xF5,0xEF,0xFD,0xFE, -0xFF,0xB9,0xFF,0x1F,0xD2,0xA9,0xAF,0xFF, -0xDB,0xF7,0xBF,0xEF,0x46,0xFF,0xFF,0xAD, -0xEB,0x7A,0xDF,0xEF,0xF7,0xFF,0x7F,0xF7, -0x9F,0xED,0xFF,0x7F,0xFF,0xAD,0xEB,0x7F, -0xF5,0x6F,0xFF,0xFD,0xFB,0xD6,0xF4,0xF7, -0xFB,0xF9,0x7E,0x7F,0xFF,0x5F,0xC2,0xFE, -0xBF,0xFD,0xFB,0x33,0xDF,0xF9,0x5B,0xFF, -0xFF,0xDD,0x67,0x7D,0xCF,0xEF,0xDB,0xEC, -0xFF,0x77,0xDD,0xF7,0xFD,0xFF,0xFF,0xDE, -0xA7,0xBF,0xD4,0x9F,0xFF,0xFF,0xBF,0xEF, -0xFE,0xFF,0xDF,0xEF,0xBB,0xFF,0xFF,0xEF, -0xEB,0xFA,0xFF,0xEF,0xBD,0xFB,0xFF,0xE2, -0x7F,0xFF,0xDF,0xDF,0xF7,0xFD,0xBF,0xBB, -0x73,0xF7,0xFD,0x7F,0xDF,0xDE,0xF7,0xBF, -0xEA,0xDB,0xF6,0xFF,0xD6,0xFF,0xFF,0x66, -0xFF,0xBE,0xFF,0xBF,0x6B,0xD9,0xF6,0xDF, -0xFF,0xFB,0x7E,0x7F,0xB7,0x7E,0xFF,0xFE, -0xFF,0xCD,0xFF,0xFE,0x7F,0xFF,0xFC,0xFD, -0x3F,0xFB,0xFB,0xF7,0xFF,0xFF,0xFB,0xF6, -0x7D,0xFE,0x7F,0xFF,0xFC,0xFF,0xB9,0xFF, -0xF9,0xFA,0xFE,0xBF,0xAF,0x5B,0xD6,0xED, -0xAD,0x7B,0xF6,0xF9,0xBF,0xEF,0xF8,0xFA, -0xFE,0xBF,0xFE,0xE6,0xFF,0xFF,0xF7,0xFD, -0xFF,0x7F,0xBF,0xEF,0xF3,0xFF,0xFF,0x6F, -0xF7,0xFE,0xFF,0xFF,0xF7,0xFD,0xFE,0xF7, -0xEF,0xFF,0xFB,0xEF,0xFB,0x7E,0xDE,0xFE, -0xFF,0xBF,0xFF,0xFE,0xFF,0xFF,0xFB,0xFF, -0xFF,0xEF,0xFB,0x6F,0xFC,0x1F,0xFE,0xE7, -0xFF,0xFF,0xFF,0xEF,0xFF,0xD3,0xB4,0xBB, -0xFF,0xFF,0xFD,0xBF,0x6F,0xE3,0xFE,0xFF, -0xBF,0xFC,0xBF,0xF7,0xCF,0xF7,0xFD,0xFF, -0x2F,0xDF,0xAB,0xEA,0xFF,0xDF,0xE7,0xEA, -0x9A,0xAF,0xEF,0xFB,0xFE,0xFF,0xF5,0x3F, -0xFD,0x7E,0xFF,0xD7,0xF5,0xFB,0xFF,0xFD, -0xF7,0xFF,0x7F,0xFE,0xF7,0xFD,0xFF,0xD7, -0xFF,0xD7,0x7F,0xEE,0x7F,0xFA,0x79,0xFE, -0x2F,0x8B,0xE6,0xF9,0xFE,0x3F,0x9E,0xF9, -0xBE,0x2F,0x0B,0xE7,0xF9,0xFE,0x2F,0x9F, -0xFD,0xFF,0xFE,0x7D,0x7F,0x5F,0xD7,0xFF, -0xFF,0x7F,0xFF,0xFD,0xFF,0x7F,0x5F,0x97, -0xFF,0xFD,0x7F,0x5F,0xFF,0xE3,0xFF,0xFF, -0xFA,0xFE,0xBF,0xAF,0xFB,0xFB,0xFF,0xFF, -0xCF,0xEB,0xFE,0xBF,0xAF,0xFF,0xFA,0xFE, -0xBF,0xFF,0x87,0xFF,0xFF,0xF5,0xFF,0xFF, -0xFF,0xFF,0xFD,0xFF,0x7F,0xFF,0xFF,0xFF, -0xFB,0xFF,0xFF,0xF5,0xFF,0xFF,0xFE,0x0F, -0xFF,0xFD,0xEB,0xFF,0xFF,0xF7,0xFF,0xEF, -0x7B,0xDF,0xFE,0xFF,0xFF,0xDF,0xF7,0xFD, -0xEB,0x7F,0xDF,0xFF,0x5F,0xFF,0xFF,0xFF, -0xFF,0xFD,0xBF,0xFF,0x7E,0xFA,0xBF,0xC7, -0xDB,0xF7,0xBD,0x3F,0xFB,0xFF,0xF6,0xFF, -0xFA,0xAF,0xFF,0xEB,0xFA,0xFE,0x3F,0x2F, -0xEA,0xFA,0x3E,0xAD,0xC9,0xBA,0xF6,0xAD, -0xAF,0xEB,0xFA,0xF6,0xBF,0xFE,0x7F,0xFF, -0xFF,0xFD,0xFF,0xF1,0x7F,0x3F,0xCF,0xF1, -0xEF,0xFF,0x7F,0xFF,0xBC,0xDF,0xDF,0xF7, -0xDD,0xFF,0xE0,0x7F,0xFF,0xFF,0xFE,0xFF, -0xFA,0xEC,0xBB,0x7F,0x5F,0xFF,0xFB,0xEC, -0xFF,0xEF,0xB7,0xFF,0xF7,0xFF,0xFF,0xB5, -0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xEE,0xDF, -0x5F,0xDF,0xDE,0xFF,0xAE,0xE7,0x77,0xFF, -0xFF,0xDF,0xF7,0xFF,0xE3,0xFF,0xFA,0xBB, -0xFE,0xFF,0xAF,0xFD,0xFB,0xFE,0xBF,0xAB, -0xF9,0xFE,0xFF,0xBF,0x7F,0xBF,0xFE,0xBD, -0xFE,0xD7,0xFF,0x9F,0xFD,0xFF,0xBE,0xEF, -0xFF,0xEE,0xFD,0xBB,0x5B,0xEF,0xFF,0x7F, -0xEF,0xFF,0xEF,0xFF,0x7F,0xFF,0x4F,0xFF, -0xEF,0xFB,0xBC,0xFC,0xFF,0xFF,0xFF,0xFE, -0xFE,0xFD,0xFA,0xFE,0xFB,0xFF,0xFD,0xF3, -0xFB,0xFF,0xF8,0x5F,0xFF,0xFF,0xD7,0xF5, -0xFD,0xDF,0xEF,0xFF,0xF3,0xDC,0x5F,0xCE, -0xF5,0xBD,0xFF,0xFF,0xD7,0xFF,0xFF,0xF9, -0x3F,0xFF,0xDF,0xF7,0xFF,0xFE,0xFF,0xFD, -0xFF,0xFB,0xFF,0xF7,0xB9,0x7D,0xFE,0xDF, -0xFF,0xFF,0xFF,0xFF,0xF9,0x7F,0xFF,0xFE, -0xFF,0xFF,0x7F,0xFF,0xFE,0xFF,0xFF,0xF7, -0xF6,0xFF,0xBF,0xF1,0xF8,0xFF,0xFF,0xFF, -0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF, -0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF, -0x9B,0xFB,0x7F,0xFF,0xFF,0xFF,0xC1,0xFF, -0xDF,0xFF,0x3F,0x5F,0xD7,0xBF,0xEF,0xBB, -0xDE,0xEE,0xFF,0x7F,0xDF,0xFF,0xFE,0xF5, -0x7F,0xDF,0xFF,0x99,0xFF,0xFF,0xFA,0xFF, -0xBF,0xFD,0xEB,0x7A,0xFF,0xB7,0xFE,0xFE, -0xFF,0xFF,0xEF,0xFF,0xFF,0xFD,0xBF,0xFF, -0x97,0xFF,0xFD,0xF7,0xFF,0x7F,0xF7,0xFF, -0xFF,0xFD,0x5F,0xFE,0xF3,0xF9,0xDF,0xDF, -0xFF,0xFF,0xFC,0xFF,0xFF,0x83,0xFF,0xFF, -0xFE,0xFF,0x9E,0xEC,0xFB,0xEE,0xFF,0x9F, -0xBF,0xEF,0xFF,0xFE,0xED,0x7B,0xFF,0xFF, -0xFF,0xF1,0x5A,0xFF,0xFF,0xFD,0xFF,0x7C, -0x69,0x3B,0xDF,0xFF,0x7F,0x1F,0xDF,0xFF, -0xFD,0xBA,0xFF,0xFF,0xFB,0xFF,0x5B,0xBD, -0xFF,0xFF,0xFF,0xFF,0xD7,0xB6,0xED,0xE9, -0xFF,0xD6,0xBD,0x6F,0x5F,0xFB,0xFF,0xEF, -0xFF,0x5F,0xFE,0xF6,0x6F,0xFF,0xFF,0xFF, -0xFF,0xF7,0xEB,0x7A,0xDF,0xFF,0x9F,0x7F, -0x7F,0xFF,0xB7,0xFF,0xFF,0xFE,0xDF,0xFF, -0x6C,0xFF,0xFB,0xFF,0xBB,0x6F,0xEB,0xFE, -0xCC,0xF7,0xA5,0xFA,0x5C,0xF5,0x75,0xBB, -0xB7,0xDF,0xFE,0x6F,0x5F,0xC5,0xBF,0xFD, -0x7B,0xFE,0xFF,0x95,0xE7,0x29,0xCF,0x4F, -0xF5,0x91,0xEE,0x6B,0xDF,0xEF,0xFD,0x54, -0xF5,0xBD,0xB1,0xFF,0xEF,0xEE,0xFB,0xBE, -0xBF,0xAF,0xFE,0xDE,0xBD,0x6F,0xDA,0xF2, -0xFF,0xAF,0xBE,0xFF,0xFF,0xFD,0x7E,0xA7, -0xFF,0xF7,0xFF,0xBF,0xEF,0x7B,0xF6,0xFD, -0xBD,0x4A,0xF2,0x85,0x85,0xBF,0x5B,0xFE, -0xB5,0xFD,0xFA,0xFF,0x4F,0xFF,0xFE,0xDF, -0xFF,0xED,0xFF,0xBF,0xFF,0xBF,0x7F,0xFE, -0xFF,0xB7,0x6D,0xFF,0xF7,0xBF,0xBF,0xEF, -0xFD,0x1F,0xFF,0xFE,0x7D,0xFF,0x67,0xFF, -0xFF,0xFF,0x3F,0x7F,0xFE,0xBF,0xFF,0xE7, -0xDF,0xE7,0xFF,0xEF,0x6B,0xFC,0x1F,0xFF, -0xBF,0xEF,0xFB,0xFE,0xDE,0xBF,0xAF,0xFA, -0xFF,0xB6,0xEF,0xF9,0xFE,0xFF,0x8F,0xEF, -0xDB,0xEF,0xAB,0x6F,0xFB,0xFE,0xFF,0xFF, -0xEF,0xFD,0xFF,0x7F,0xFF,0xFF,0xDE,0xFF, -0xFF,0xEF,0xFF,0xFF,0xFF,0x3F,0xFF,0x6C, -0xFF,0xBF,0xFB,0xFF,0xFE,0xFF,0xFB,0xFE, -0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xBF,0xFF, -0xFF,0xFE,0xFB,0xFF,0xD5,0x7F,0xFF,0xFF, -0xEF,0xFB,0xFF,0xFF,0xBF,0xEF,0x43,0xB5, -0xFD,0x6F,0xCF,0xD6,0xBE,0x3F,0x7F,0xDB, -0xFE,0xC3,0xFF,0xFD,0xFF,0xAF,0xEB,0xFB, -0xFC,0xFF,0x3E,0xEF,0xE8,0xFA,0xBD,0xCD, -0xAA,0xFE,0xFE,0x7D,0xCF,0xFF,0xB7,0xFF, -0xF7,0xFF,0xFF,0xFF,0xFD,0xFF,0x75,0xCD, -0x52,0xD7,0xFD,0xFB,0xF7,0xDD,0xFB,0xEF, -0xEB,0xFF,0xFF,0x4F,0xFF,0xBF,0x9F,0xE7, -0xF9,0xFC,0x7F,0x8B,0xC3,0xF9,0xAF,0x8F, -0xE7,0xE9,0xBE,0x7F,0x9F,0xE6,0xF9,0xFC, -0x5F,0xFF,0xFF,0xF7,0xFD,0xFF,0x7A,0x5F, -0xD7,0xED,0xFF,0xFF,0xD7,0xFF,0xDD,0x7F, -0xE7,0xFF,0xFC,0xFF,0xFC,0x3F,0xFF,0xFF, -0xFF,0xFB,0xFF,0xFE,0xBF,0xAF,0xFF,0xFD, -0xFF,0xEF,0xFF,0xEB,0xFF,0xFF,0xFF,0xFF, -0xFF,0xF7,0x7F,0xFF,0x7F,0xDF,0xFF,0xFD, -0xFD,0x7F,0xFE,0xF7,0xFD,0x7F,0xDF,0xFF, -0xFD,0xFF,0xFF,0xDF,0xFB,0xFF,0xEE,0xFF, -0xFB,0xFF,0xF7,0xFD,0xFF,0x7A,0xDF,0xF5, -0xFD,0xFA,0xDF,0xF7,0xFC,0xFF,0x7F,0xDF, -0xBF,0xED,0xFF,0xC9,0xFF,0xDF,0xFF,0xBF, -0x2F,0xFB,0xFF,0xBC,0xAD,0xFF,0xF7,0xFF, -0xFF,0xEF,0xD3,0xFF,0x7D,0xBF,0x6F,0xFF, -0xFA,0xFF,0xFE,0xBF,0xAE,0xEA,0xFA,0xBE, -0xAD,0xA5,0xEB,0xCE,0xBF,0xA7,0xEB,0x5A, -0xDE,0xBD,0xAF,0x6B,0xFD,0x57,0xFF,0xFF, -0xF4,0x7F,0x1F,0x7F,0xFD,0xFF,0x7F,0x36, -0xF0,0xDF,0x79,0xFF,0xFF,0xFF,0xF7,0xFD, -0xBF,0xFF,0x87,0xFF,0xFB,0xF3,0xFC,0xFF, -0xFF,0xFF,0xFF,0x7E,0xFF,0xBF,0xDF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xF8,0x9F, -0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFD, -0xF7,0xFC,0xBD,0xFF,0xFE,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFB,0xF9,0xBF,0xFF,0xFF,0xEB, -0xE2,0xFE,0xFF,0xBF,0xEF,0xA9,0xBA,0x2F, -0xEB,0xF9,0xFE,0x77,0xDF,0xF7,0xFF,0xFF, -0xF9,0x7F,0xFF,0xFF,0x7F,0xEF,0xD7,0xFF, -0xFD,0xFF,0xFB,0xF5,0xFF,0xBF,0x6F,0xDF, -0xFF,0xFF,0xFD,0xFF,0xFF,0xF0,0xFF,0xFF, -0xFF,0x3F,0xCF,0xFF,0xBA,0xEE,0x9B,0xBF, -0xEE,0xD7,0xFE,0xCD,0xEF,0xFF,0xDF,0xBF, -0xFF,0xFF,0xC5,0xFF,0xFF,0xFD,0x7F,0x4F, -0xFD,0xF6,0xD9,0xFF,0x4F,0xD6,0xFD,0xBF, -0x6E,0xFF,0xFF,0xF4,0x7F,0xFF,0x7F,0x8B, -0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xF9,0xFE, -0x37,0xFF,0xD9,0xFB,0xF5,0xAF,0xFD,0xFF, -0xFF,0xFB,0xFF,0xFF,0x07,0xFF,0xFF,0xFF, -0xFB,0xF7,0xFF,0xFD,0xFF,0x7C,0xFA,0x7E, -0x4F,0xFC,0xDF,0x1D,0xC7,0xFF,0xFF,0xFF, -0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0xFD,0xFB, -0xFF,0xFF,0xFE,0xFE,0xFC,0xFF,0x7F,0x7F, -0xBF,0xEF,0xFE,0xFF,0xFF,0xFF,0x5F,0xFD, -0xFF,0xFF,0xFF,0xFD,0x6F,0x5A,0xD7,0x7B, -0xBE,0x5F,0xFE,0x39,0xFF,0xF7,0xFF,0xF7, -0xFD,0xFE,0xAA,0x1F,0xFF,0xFF,0xFF,0xFF, -0xFE,0xFE,0xAB,0xAF,0xFD,0xFE,0xBF,0xFF, -0xF7,0xFF,0x7F,0xFE,0x8F,0xE3,0xFB,0xEE, -0x7F,0xFF,0xFF,0xFF,0xFF,0xEB,0xFB,0xFF, -0xFD,0xBF,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFB,0xE4,0x3F,0xFF,0xDF, -0xFF,0xFF,0xFF,0xFF,0xF3,0xEF,0xBB,0xFB, -0xBF,0xEF,0xBB,0xFF,0xD7,0xBF,0xFF,0xFF, -0xFF,0x29,0xAF,0xF7,0xFF,0xFF,0xFB,0xFF, -0xFB,0xE6,0xFF,0x0F,0xFB,0x3F,0xDF,0x0F, -0xFF,0xAF,0xFF,0xFF,0xFF,0xF5,0xC3,0xDF, -0x5F,0xFF,0xFF,0xFF,0xFE,0x6B,0xCA,0xBE, -0xBC,0xFF,0x9F,0xF2,0xBF,0xFF,0xFE,0xFA, -0xFF,0xFF,0xEF,0x16,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFC,0xDF,0x97,0xFD,0x79,0xFF,0x37, -0xE7,0x7F,0xFF,0xFF,0xB5,0xFF,0xFF,0xF6, -0x2F,0xFF,0xFD,0xFB,0xFE,0xFF,0xFF,0xFD, -0x5F,0x57,0x5F,0xFF,0xDB,0x52,0xDF,0xFF, -0xFD,0xBF,0xFF,0xFF,0xFC,0xDB,0xFF,0x7B, -0xB5,0xFD,0x7F,0xFF,0x71,0x9C,0x6E,0xFF, -0xF6,0x35,0xA5,0x9B,0xFF,0xFF,0xFD,0xFF, -0xFF,0xDB,0x9E,0x7F,0xFE,0xEF,0xFB,0xFF, -0xFF,0xBD,0xEF,0xFF,0xDE,0xB7,0xF9,0x4B, -0xFF,0xF5,0xEF,0xFF,0xFF,0xFF,0xE8,0x7E, -0xFF,0xEA,0xDF,0xF7,0xFF,0xFD,0x69,0x5B, -0xFC,0x9F,0xEF,0x78,0xD6,0xFF,0xEB,0xEF, -0xFF,0xFF,0xFF,0xE8,0xFF,0xFF,0xED,0xFF, -0xFF,0xFF,0xFF,0xE3,0xF9,0xF6,0xBF,0xFF, -0xFF,0xFE,0xDF,0xFF,0x7F,0xFF,0xFF,0xFF, -0xD1,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF, -0xE7,0xF9,0xFF,0xBF,0x7F,0xD9,0xFF,0xFD, -0xFE,0x7F,0xFF,0xFE,0xFF,0xF9,0xFF,0xFB, -0xD6,0xDF,0xBF,0xEF,0x5B,0xD6,0xFF,0xBF, -0xFB,0xF6,0xFF,0xBF,0xEF,0xF8,0xF6,0xDD, -0xBE,0xFE,0x16,0xFF,0xBF,0xEF,0xFF,0xFE, -0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0x6F,0xFB, -0xFF,0xFF,0xFF,0x6F,0xF3,0xFF,0xF7,0xEF, -0xFB,0xFF,0xBF,0xFF,0xEF,0xFE,0xFF,0xBF, -0xFF,0xFF,0xFF,0xBE,0xBF,0xFF,0xEF,0xFF, -0x7F,0xEF,0xFF,0xFD,0x17,0xFB,0x7B,0xFF, -0xFF,0xFD,0x7F,0xDB,0xF6,0xF4,0x7F,0xFA, -0xFE,0xF5,0xBF,0xEB,0xE3,0xF7,0xFF,0xFF, -0xE9,0xBF,0xFF,0xAF,0xF7,0xFD,0xF3,0x7E, -0x8F,0xA3,0xEA,0xFF,0xCB,0xF3,0xEE,0xFF, -0xBF,0xEF,0xF7,0xF9,0xFF,0xFE,0x7F,0xFF, -0xFF,0xFF,0xFF,0xF5,0xFB,0xF6,0xFF,0xF5, -0x2F,0xFE,0xFB,0xD7,0xBF,0xFF,0xBE,0xDF, -0x9F,0xFF,0xF0,0xFF,0xFF,0xF9,0xFE,0x7F, -0x8F,0xA3,0xF8,0xFE,0x6F,0x9F,0xF9,0xF6, -0x2F,0x9F,0xE7,0xF9,0xFE,0x2F,0x9F,0xE1, -0xFF,0xFF,0xFF,0x7F,0xDF,0xF7,0xF5,0xFD, -0x7F,0x7F,0xF5,0xFF,0x9F,0x5F,0xFB,0xFE, -0xFF,0x7F,0xFF,0xFF,0xCB,0xFF,0xFF,0xFB, -0xFE,0xFF,0xBF,0xAF,0xFB,0xFE,0xFF,0xDF, -0xFE,0xFE,0xBF,0xF7,0xFF,0xFF,0xFF,0xFF, -0xFF,0xC7,0xFF,0xFF,0xFD,0xFF,0x7F,0xDD, -0xF7,0xFD,0xFF,0xFF,0xD7,0xFF,0xFD,0x7F, -0xFF,0xFB,0xFD,0xFF,0xFF,0xFE,0xEF,0x7F, -0xFD,0xEF,0xFB,0xFE,0xFB,0xFD,0xFF,0x7F, -0xDF,0xFD,0xFF,0x7A,0xDF,0xF7,0xFD,0xFF, -0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xD3,0xF7, -0xFF,0xFF,0x6F,0xDB,0xFF,0xFF,0xEF,0xCB, -0xF4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, -0x29,0xFF,0xE8,0xDA,0x76,0x9F,0xAF,0x6A, -0xDA,0xFE,0x35,0xEB,0xDA,0xD6,0xBF,0xAB, -0xEB,0x7A,0xDE,0xBF,0xD7,0x7F,0xFF,0xFE, -0xFF,0xBF,0xEF,0xFD,0xDF,0x77,0xBF,0xFD, -0x37,0xEF,0xFF,0xEF,0xFF,0x3F,0xFF,0xFF, -0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xF7,0x7E, -0xDF,0xFF,0xFF,0xFF,0xFA,0xB7,0x7F,0xFF, -0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0x89,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0x9F,0xFB,0xFF,0xFF,0xFF,0xE7,0xFF, -0xFF,0xFF,0xFF,0xAA,0xFF,0xAB,0xFB,0xFA, -0xEF,0xBF,0xFF,0xDF,0xFA,0x7B,0xB9,0xFE, -0xFE,0xFF,0xFD,0xFF,0xF7,0xFE,0x3F,0xFF, -0xB7,0xFF,0xF7,0xEE,0xFF,0x7F,0xEF,0xFF, -0xFF,0x7F,0xFF,0x1F,0xFB,0xFF,0xBF,0xFB, -0xFE,0xFF,0xBD,0xFF,0xFF,0x2F,0xFF,0xBF, -0xFF,0x7F,0xDF,0xFA,0xFF,0xFF,0xFC,0xEE, -0xF5,0xF3,0xBE,0xFB,0x0F,0xEF,0xF3,0xBE, -0xEF,0xFC,0x5F,0xFF,0x5A,0xFF,0xF7,0xDF, -0xFF,0xFF,0xFE,0xD5,0xFC,0x5F,0xFB,0xF2, -0xFF,0xFF,0x2F,0xBB,0xF3,0xFF,0xFF,0xBF, -0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, -0xBF,0xFF,0xFF,0xFD,0x7B,0xFF,0xDF,0xB9, -0xFF,0xFB,0xFF,0xD8,0x7F,0xFF,0xFF,0xFF, -0xFB,0xFF,0xFC,0x7F,0x1F,0xBF,0xE0,0xDF, -0xF7,0xEF,0xFF,0xFD,0x7F,0xFE,0xDF,0xFF, -0xE0,0xFF,0xFF,0xFD,0xEF,0xFB,0xFF,0xFE, -0xF7,0xDF,0xFF,0xEB,0x5F,0xFF,0xF7,0xFF, -0xFF,0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0xFD, -0xFF,0xFF,0xFF,0xF7,0xFD,0xFF,0x3B,0xDC, -0xFD,0x6D,0x7B,0x5F,0x57,0xF5,0xFD,0x7F, -0x5F,0xFF,0xB1,0xFF,0xEB,0xFF,0xFF,0xFF, -0xFB,0xFB,0xFE,0xFF,0xBF,0xFB,0xBE,0xFF, -0xBF,0xEF,0xFB,0xFE,0xFF,0xAF,0xFE,0xF7, -0xDF,0xDF,0xFF,0xFF,0xFF,0x7F,0xCF,0xF3, -0xF8,0xFF,0xD7,0xFB,0xFF,0x5F,0xBF,0xF7, -0xFB,0xFF,0x7F,0xFE,0x23,0xFF,0xFF,0xFE, -0x7F,0xF3,0xFF,0xFB,0xFE,0xFF,0xFF,0xF3, -0xFF,0xFF,0xF5,0xF9,0xFF,0x3F,0xFF,0xFF, -0xF0,0x9A,0xFF,0xBE,0x7F,0xFF,0xFC,0xF9, -0xFF,0xFD,0xAF,0xEB,0xFE,0xBF,0xFF,0xCF, -0xF3,0xFE,0x7F,0xFF,0xFF,0x5B,0xBD,0xFF, -0xBC,0xEB,0xFF,0xD7,0xD4,0xAF,0xAF,0xFD, -0xFF,0xCF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7, -0xFD,0xFE,0xFF,0x6F,0xFF,0xFB,0xFF,0xFF, -0xFF,0xFD,0x7F,0x5E,0xFD,0xBF,0xDB,0xF6, -0xFD,0xBF,0x6F,0xFB,0xEE,0xFD,0xFF,0x7A, -0xFF,0xFA,0xFB,0xFF,0x3F,0xFB,0xB7,0x5F, -0xD6,0xF7,0x1F,0x71,0xDC,0x77,0x1D,0xC7, -0x31,0xDC,0x77,0xDF,0xF9,0xBF,0xF5,0x5B, -0xF4,0xD7,0x9D,0xAE,0xFF,0xBF,0xFD,0xBF, -0xDB,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFE, -0x3D,0x81,0xFF,0xEB,0xFE,0xFE,0xFE,0xFF, -0xEB,0x7A,0xDF,0x7D,0x77,0x7D,0xF5,0x79, -0xDF,0x57,0xDD,0xF5,0x7D,0x7E,0xE6,0xFF, -0xD6,0x3F,0xBF,0x7F,0xFF,0xD4,0xF5,0x3F, -0xBF,0xFB,0xBE,0xEF,0xB3,0xEE,0xFB,0x9E, -0xEF,0xBB,0xFE,0x8B,0xFF,0xFE,0xDF,0xB7, -0xED,0xFF,0xF7,0xFD,0xFE,0xFF,0xEF,0xBB, -0xEE,0xFF,0xBE,0xEF,0xBB,0xEE,0xEB,0xFC, -0x1F,0xFF,0xFF,0xFD,0xFF,0xE7,0xFF,0xF7, -0xFD,0xFF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFE,0xFF,0xBF,0xEB,0xFA,0x1F,0xFF,0xB7, -0xEF,0x5B,0xFE,0xFF,0xAF,0xEB,0xDD,0xE7, -0xDE,0x77,0x9D,0xE7,0x79,0xDE,0x77,0x9D, -0xBF,0xE6,0x6F,0xFF,0xFE,0xFF,0xBF,0xEF, -0xFB,0xFE,0xFD,0xBF,0x6F,0xF6,0xFD,0xBF, -0x6F,0xDB,0xF6,0xFD,0xBF,0xFF,0x7E,0xFF, -0xFF,0xFB,0xFE,0xFE,0xFF,0xEF,0xFB,0xFD, -0xEF,0x7E,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7, -0xBD,0xEF,0xFF,0xD5,0xFF,0xBF,0xFF,0xEF, -0xFE,0xFF,0xFC,0x3F,0x0F,0xE7,0xFE,0x7F, -0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFE, -0xF3,0xFF,0xFE,0xDF,0xAD,0xDF,0x67,0xEE, -0xFB,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFE,0xFF,0xBF,0xEF,0xFF,0x23,0xFF,0xFF, -0xFF,0xFF,0x7F,0xFF,0xF3,0xBC,0xDB,0xFE, -0xFB,0xFF,0xFB,0xBE,0xF7,0xFB,0xFF,0x7F, -0xDF,0xFF,0xCF,0xFB,0xFF,0x9F,0xE3,0xF9, -0xBE,0x3F,0x8F,0xE7,0x79,0xFF,0x9D,0xE7, -0xF9,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x5F, -0xFF,0xCF,0xF7,0xFF,0xFF,0xFF,0xDF,0xF7, -0xFE,0x7F,0xE7,0xF9,0xFE,0x7F,0xFF,0xFF, -0xFB,0xFE,0xFF,0xFF,0xBF,0xFF,0xBF,0xBF, -0xFF,0xFE,0xFF,0xBF,0xEF,0xFF,0xFD,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFD,0xFF, -0xFF,0x3F,0xFF,0xBF,0xFF,0xF7,0xFF,0xFF, -0x7F,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xE8,0xEF,0xFF, -0x5F,0xF7,0xBF,0xF9,0xFE,0xDF,0xB7,0xFD, -0xFF,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7, -0xFD,0xFF,0xDD,0xFF,0xF2,0xFF,0xBF,0xFF, -0xFF,0xBF,0xFF,0xFF,0x2F,0xF2,0xFF,0xBF, -0x2F,0x7B,0xD2,0xF7,0xBF,0x2F,0xFF,0xBB, -0xFF,0xEE,0x8F,0xAF,0xEB,0xFA,0xFE,0x3F, -0xA7,0x69,0xCE,0x8F,0xA4,0xEA,0xFA,0xEE, -0xB7,0xAE,0xEB,0xFD,0xC7,0xFF,0xF7,0xF7, -0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3E,0xF3, -0x74,0xFF,0x3F,0x4F,0xFF,0xE7,0xFF,0x3F, -0xFE,0xA7,0xFF,0xFF,0xDF,0xF7,0xB7,0xFF, -0xF7,0xFF,0xBA,0xEF,0x37,0xEB,0xFB,0xFE, -0xBF,0xFB,0xFE,0xF3,0xFF,0xF9,0xDF,0xFF, -0xBF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF, -0xFD,0xDF,0xFF,0xFD,0xFF,0xFF,0xFB,0xFE, -0xFD,0xFF,0xFB,0xBF,0xFE,0x3F,0xED,0xFF, -0xDF,0xBE,0x3D,0xA7,0xFB,0xFA,0x3F,0xE6, -0xE1,0xFE,0xFE,0x3F,0xEF,0xE3,0xDF,0xF5, -0x7F,0xFE,0xFF,0x7E,0xFF,0xFF,0xFF,0xFF, -0xEF,0x6F,0xF6,0xFF,0x7D,0xEF,0xD7,0xDE, -0xFF,0x7D,0xEF,0xFF,0xF2,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0x7B,0xDE,0xFB,0xE6,0xEE, -0xEF,0x37,0x6E,0xF3,0x7E,0xEB,0x37,0xEF, -0xFF,0xC1,0xFF,0xFE,0xFF,0xF7,0xEF,0xFF, -0xFF,0xFF,0xBF,0x3F,0xD2,0xDF,0xBF,0x2F, -0x7B,0xE2,0xFF,0xFE,0x3B,0xBD,0xDB,0xFF, -0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE, -0xFF,0xFB,0xFF,0xFF,0xBF,0xFF,0xFB,0xDF, -0xFF,0xBF,0xFF,0xB7,0xFF,0xFF,0xBF,0xEF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF, -0x7F,0xFF,0x1F,0xEF,0xF1,0xFD,0xFF,0xF6, -0xAF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF, -0xFF,0xFF,0xFE,0x9F,0xFF,0xFF,0xFF,0x77, -0xEF,0xF7,0xFB,0xFF,0xFE,0x5F,0xFF,0xFF, -0xBF,0xCF,0xFB,0xF7,0xDD,0xF7,0xF5,0xFF, -0x5F,0xD5,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5, -0xFF,0xFB,0x0F,0xFF,0xFF,0xA9,0xEA,0x7A, -0xFF,0xAF,0x8F,0xFE,0xDF,0xAF,0xEF,0xFB, -0xFE,0xFF,0xBF,0xEF,0xFB,0xDF,0xE5,0x5F, -0xFF,0xFF,0xFF,0xFF,0xFF,0xBD,0x57,0xFF, -0xFF,0x6F,0x77,0xBF,0xF7,0xFB,0xFF,0x7F, -0xBF,0xF7,0xFF,0xFC,0xBF,0xFF,0x9F,0xFF, -0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF,0x1F, -0xCF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xFB, -0x65,0xAF,0xF3,0x7C,0xFF,0x3F,0xDF,0xFF, -0xFD,0xE9,0xFE,0x7F,0xE7,0xFF,0xFE,0x7F, -0xFF,0xFF,0xFF,0xFF,0xFD,0xE3,0xDF,0xFB, -0xDB,0xF6,0xFD,0xEF,0x5B,0xFB,0xFF,0xDF, -0xFC,0xFF,0x3F,0xDF,0xF3,0xFD,0xFF,0x7F, -0xDF,0xEF,0x66,0xFF,0xDF,0xAD,0xEB,0x7A, -0xDE,0xF7,0xF7,0xE7,0xD9,0xFD,0x9F,0x67, -0xD9,0xF6,0x7D,0x9F,0xE7,0xDF,0xF5,0x47, -0xFD,0x65,0x5B,0xD6,0xF4,0xFE,0xFF,0xEF, -0xFF,0x6D,0xF6,0xDD,0xB7,0x6D,0xDB,0x76, -0xDC,0xB7,0x7D,0xFA,0x9B,0xF6,0x6D,0x9D, -0x67,0x59,0xDF,0xF7,0xDD,0xFF,0xEB,0xFE, -0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xE3, -0xD1,0x9F,0xFF,0xBD,0xBF,0xEF,0xFE,0xF7, -0xBF,0xBF,0xF7,0xD7,0x7F,0xDD,0xF7,0x9D, -0xDF,0x7F,0xDF,0xF7,0xFF,0xE0,0x7F,0xFD, -0xC1,0xDF,0xF7,0xFD,0xC7,0x7F,0x7F,0xFB, -0xFF,0xBB,0xEC,0xFB,0x3E,0xFF,0xBF,0xEC, -0xFB,0xFF,0xD8,0x7F,0xBF,0x6C,0xFF,0xBE, -0xFF,0xBF,0xED,0xFF,0xEF,0xFE,0xFB,0xBF, -0xEF,0xFB,0xFE,0xFF,0xBF,0xEE,0xFF,0xC5, -0xFF,0xAF,0x6F,0xFF,0xFC,0xFD,0x3F,0xE7, -0xFF,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF, -0xEF,0xFB,0xFE,0xBF,0x89,0xFE,0xFA,0xBA, -0xFE,0xBF,0xAF,0xFB,0xF6,0xF5,0xD9,0x7D, -0x97,0x65,0xD9,0x74,0x5D,0x97,0x65,0xD3, -0xFE,0xD6,0xFF,0xBF,0xF7,0xFD,0xFF,0x7F, -0xBF,0xCF,0xFB,0xFE,0xFF,0xEF,0xFB,0xFE, -0xFF,0xBF,0xEF,0xFB,0xFF,0xF6,0x8F,0xFB, -0xFF,0xEF,0xFB,0x7E,0xDB,0xFE,0xFF,0xBE, -0xEF,0xEE,0xFB,0xBE,0xEF,0xBB,0xEE,0xFB, -0xBE,0xFF,0xFF,0xDF,0xFF,0x43,0xFF,0xFF, -0xFB,0xEF,0x5F,0xB7,0xFE,0x7F,0xE7,0xF9, -0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xF9, -0xBF,0xFE,0xAF,0x77,0xFD,0xFF,0x2F,0xAF, -0xA7,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF, -0xEF,0xFB,0xFE,0xFF,0xF1,0x7F,0xEF,0xDF, -0xFF,0x97,0xF5,0xEF,0xFF,0xDF,0xFF,0xFF, -0xBF,0xFF,0xBF,0xFF,0xFF,0xFE,0xFF,0xFF, -0xFF,0xE0,0xFF,0xFF,0xF9,0xFE,0x2F,0x8B, -0xE3,0xF8,0xBE,0x77,0x9F,0xF9,0xDA,0x77, -0x9D,0xE7,0x79,0xDE,0x77,0x9F,0xDD,0xFF, -0xFD,0xFD,0x7F,0x5F,0xD7,0xFD,0xFF,0x7F, -0xE7,0xFE,0x7F,0x97,0xE7,0xFB,0xFE,0xFF, -0xBF,0xEF,0xFF,0xAB,0xFF,0xEF,0xFA,0xFE, -0xBF,0xAF,0xFF,0xFA,0xFF,0xFF,0xDF,0xFF, -0xFB,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF, -0x67,0xFF,0xF7,0xF5,0xFF,0xFF,0xFF,0xDF, -0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xBD, -0xEB,0xFF,0xFF,0xF7,0xAD,0xEB,0xFF,0xDF, -0xFD,0xFF,0x3F,0xDF,0xF7,0xFD,0xFF,0x7F, -0xDF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0xFD, -0xBF,0xFF,0xCB,0xF4,0xFF,0x7F,0xD3,0xF7, -0xFD,0x3F,0x7F,0xD3,0xF7,0xFF,0xFC,0x3F, -0xFF,0xEA,0xFA,0xBE,0xAF,0xAB,0xEB,0xBA, -0xF4,0x95,0x6B,0x52,0xD4,0xAD,0x2F,0x4A, -0xD2,0xF6,0xBF,0xD2,0x7F,0xF7,0x3F,0xFF, -0xFF,0xF3,0x7F,0xFF,0xFF,0xF7,0xFF,0xBA, -0xDF,0xFB,0xFD,0xFF,0xBF,0xFF,0xFB,0xFF, -0xF8,0x7F,0xEA,0xFF,0xFE,0xFE,0xDF,0xFF, -0xF7,0xFF,0x7F,0xBB,0xFF,0xFF,0xBF,0xDF, -0xFB,0xFF,0xFF,0xBF,0xFF,0xB1,0x7F,0xFF, -0xFB,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF, -0xCF,0xFE,0xFF,0xFF,0xEF,0xFF,0xF7,0xFF, -0xFF,0xFF,0xF1,0xFF,0x69,0xBE,0xFA,0xBF, -0xAF,0xE2,0xFF,0xFE,0xFD,0xAF,0xF3,0xFE, -0xFF,0xBF,0xEF,0xFB,0xFC,0xFF,0xFF,0x07, -0xFD,0x95,0xDB,0xDF,0x7F,0xDF,0xAF,0xFF, -0xF7,0xAF,0x36,0xFE,0xBF,0x65,0xEB,0xF6, -0xFE,0x9F,0x6F,0xFE,0x07,0xFF,0xCF,0xFF, -0xF8,0xFE,0xFF,0xCF,0xFF,0xF6,0xFA,0xE7, -0xFB,0xFE,0xFF,0xBB,0xED,0xF9,0xFF,0xFF, -0xFF,0x5F,0xFF,0xFF,0xFF,0x75,0xFF,0xEF, -0x7E,0xFD,0xE0,0xE8,0x5E,0xD3,0xE5,0xF9, -0x3E,0x5F,0xD7,0xF7,0xFF,0xFA,0x2F,0xFB, -0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0x7F, -0x7F,0xD7,0xF5,0x7D,0x5F,0x57,0xD5,0xF5, -0xEF,0xFF,0xF3,0x7F,0xFC,0x7F,0xFF,0xC7, -0xF1,0xFF,0xFF,0x1F,0xCF,0xB0,0xFF,0x3F, -0xCF,0xF3,0xFC,0xFF,0x3F,0xCE,0xFF,0xE4, -0xFF,0xDF,0x7F,0xFE,0xF7,0xBB,0xFF,0xFF, -0xDF,0xEF,0xEE,0xFF,0xBF,0xEF,0xFB,0xFE, -0xBF,0xBF,0xEF,0xFF,0xD1,0xFF,0xFF,0xFF, -0xFD,0xFB,0xFF,0xFD,0xFF,0xFB,0x9F,0xE9, -0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xBF, -0xFF,0xB3,0xFF,0xFF,0xF7,0xFF,0xFF,0xAF, -0xF7,0xFF,0xB6,0x3F,0xEB,0xFA,0xFE,0xBF, -0xAF,0xEB,0xFA,0xFE,0xBF,0xFE,0xA7,0xFF, -0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF, -0xFE,0x9F,0xF7,0xF9,0xFF,0x7F,0x9F,0xE7, -0xFF,0xFF,0xFE,0xAF,0x6F,0xFF,0xFF,0xFF, -0x9F,0xFF,0xDF,0xFF,0x7D,0x5F,0xDD,0xFF, -0xFB,0xBF,0xE7,0xBB,0xFF,0xFB,0xDF,0x6D, -0x5F,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xEB,0xF7,0xFF,0xE7,0xEF,0xF7,0xFF,0xFF, -0x7F,0xFF,0xF7,0xFF,0xFC,0x8F,0xFF,0xEF, -0xFD,0xFE,0xFF,0xBE,0xF4,0xF2,0x7D,0xD7, -0xCF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xCF,0x6B,0xFF,0xBF,0x3F,0xFB,0xF2, -0xFC,0x7F,0xEB,0xFF,0x9F,0xFA,0xFF,0xFF, -0x3F,0xFF,0xF3,0xFF,0xFF,0xFD,0x70,0xF7, -0xFF,0xFF,0xBF,0xFF,0xFB,0xD7,0xFE,0xF5, -0x77,0xFF,0x15,0xDD,0x77,0xFD,0xFF,0x7F, -0xDF,0xF7,0xFB,0xCD,0xBF,0xFF,0xFD,0xFF, -0xFF,0xDF,0x37,0xCD,0xF9,0xEC,0xFE,0xEF, -0xBB,0xF4,0xFB,0x3F,0x4F,0xB3,0xFF,0xFD, -0xCB,0xFF,0xE9,0x7E,0x54,0x9F,0xE5,0x4B, -0xB7,0xFF,0xDD,0x7D,0xC7,0x71,0xDD,0x77, -0x5D,0xD7,0x75,0xCD,0x7F,0xD6,0xFF,0xD3, -0xF6,0xF9,0x3F,0x6D,0x95,0xAF,0x7F,0xFE, -0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFE,0xF6,0xC7,0xFF,0xAD,0x7B,0xCA,0xFF, -0xBF,0xBF,0xEF,0xFD,0xE3,0xDF,0xB7,0xED, -0xFB,0x7E,0xDF,0x37,0xED,0xE3,0xFB,0xDF, -0xFF,0x52,0x5C,0x15,0xFD,0xCF,0x7F,0xDF, -0xFE,0xEF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEC, -0x7B,0xFE,0xFF,0xFE,0x3E,0x7F,0xDA,0xF7, -0xFD,0xFF,0x7F,0xFF,0xFF,0xFB,0xEF,0xBB, -0x6F,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF, -0xF7,0x7D,0xFF,0xD8,0xFF,0xFD,0xBF,0x7F, -0xFB,0xFF,0xFF,0x9F,0xFB,0xFE,0x7F,0x9F, -0xE7,0xF9,0xFE,0x7F,0x9F,0xEA,0x7F,0xF6, -0xBF,0xBD,0x6A,0x5A,0xF6,0xE5,0xBF,0x77, -0x5F,0x6D,0xDD,0x77,0x5D,0xD7,0x75,0xDD, -0x77,0xFF,0xA5,0xBF,0xCF,0xFB,0xFF,0xFF, -0xBF,0xCF,0xFB,0xFD,0xFF,0xBF,0xF3,0xFE, -0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD,0xAB, -0xFF,0xBF,0xBF,0xFF,0xFB,0xFF,0x7F,0xEF, -0xFF,0xBE,0xFB,0xEE,0xFB,0xBE,0xEF,0xBB, -0xEE,0xFB,0xBF,0xFF,0xB5,0xFF,0xD0,0xBC, -0xFD,0x2F,0x4B,0xF7,0xFF,0xFF,0x9F,0xF9, -0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x9F, -0xFA,0x8F,0xFD,0xAB,0xFA,0xDA,0xBF,0xAF, -0xB3,0xFD,0xFF,0xBF,0xFB,0xFE,0xFF,0xBF, -0xEF,0xFB,0xFE,0xF7,0xBF,0xFF,0x9F,0xFF, -0x77,0xF7,0xBD,0xFD,0x77,0xDF,0xFF,0x7E, -0xDF,0xED,0xBB,0xFE,0xFF,0xBE,0xEF,0xFB, -0xFE,0xFF,0xFA,0x3F,0xFF,0xBE,0x6F,0x8F, -0xE6,0xF9,0xFE,0x7F,0x9F,0xC7,0xFE,0x7F, -0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFB, -0x7F,0xFF,0x7F,0xCF,0xFF,0xFD,0xFF,0xFF, -0xDF,0xFB,0xAF,0xBF,0xEF,0xFF,0xFE,0xFF, -0x9F,0xEF,0xFB,0xFF,0xFC,0xFF,0xFB,0xFE, -0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xF7, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xF5,0xFF,0xFF,0xFF,0x3F,0xDF,0xF7, -0xFF,0xFF,0x7F,0xEF,0xFE,0xFF,0xBF,0xFF, -0xFB,0xFF,0xFF,0xBF,0xEF,0xFF,0xB3,0x7F, -0xFF,0x7B,0x5E,0xF7,0xFD,0xFF,0x7B,0x7F, -0xF7,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F, -0xDF,0xF7,0xFF,0x17,0xFF,0xFF,0xFF,0x7F, -0xFF,0xFF,0xDD,0xF6,0xFC,0xBF,0xCB,0xF2, -0xBC,0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xFE, -0x8F,0xFF,0xFA,0x7E,0xBF,0xA7,0xEB,0xDA, -0xFC,0xBF,0xAF,0x7A,0xFE,0xBF,0xAF,0xEA, -0xFA,0xFE,0xBF,0xAF,0xF4,0xDF,0xFE,0xFF, -0xF3,0x3C,0x7F,0x3E,0xFF,0xCF,0xF8,0xBF, -0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xE7,0xE8, -0xFF,0xFC,0x9F,0xFF,0xFF,0xCF,0xEB,0xB3, -0xE7,0xFB,0x7B,0xF3,0xFE,0xFF,0xCF,0xDB, -0xFB,0xFB,0xBF,0x6F,0x6F,0xDF,0xEC,0x7F, -0xFF,0xFF,0xF7,0xFD,0xFD,0xFF,0xFF,0xFF, -0xFF,0xB2,0xBF,0xFF,0xDE,0xFD,0xBD,0xEF, -0xFB,0xF6,0xDF,0xEA,0xE7,0xDB,0xFE,0xBB, -0xFF,0xEB,0xFB,0xBF,0x9F,0x8F,0xE8,0xFE, -0x3F,0x8F,0xA3,0xF8,0xFE,0x3F,0x8F,0xFF, -0xF8,0x7E,0xFD,0xFD,0x7F,0xFF,0xFB,0xCD, -0xFF,0xFD,0xFF,0x5F,0xEF,0xFD,0xFF,0xFF, -0xDF,0xF7,0xFD,0xFF,0xBE,0x90,0xFF,0xFF, -0xEE,0xFF,0x3F,0xBF,0xF3,0xBB,0xFE,0xB7, -0xAB,0xFA,0xFE,0xAF,0xAD,0xEA,0xFA,0xDE, -0xAB,0xFF,0x63,0xFF,0xFE,0xF2,0xFF,0xB3, -0xFF,0xDF,0xEE,0x7D,0xFF,0x03,0xF1,0xF4, -0x3F,0x1F,0xC3,0xF1,0xEC,0x7F,0xFE,0x6F, -0xFF,0xFB,0xFB,0xFF,0x9F,0xFF,0xBF,0xFF, -0x7B,0x5F,0xFD,0xFF,0xDF,0xF7,0xFD,0xFD, -0x7F,0x7F,0xDF,0xFE,0xCF,0xFB,0xFF,0xFF, -0xAF,0xFB,0xFF,0x1F,0xEF,0xA5,0xFD,0xBF, -0xDF,0xFB,0x7D,0xFF,0xBF,0xDF,0xFB,0xFF, -0xFD,0x3B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, -0xAF,0xF3,0xFF,0xFB,0x7F,0xBF,0xD7,0xFB, -0xBF,0x7F,0xBB,0xF7,0xFF,0xF8,0x7F,0xFF, -0xFA,0x5F,0xD7,0xFF,0xDF,0x7F,0xEF,0xFF, -0xFF,0x7F,0xDB,0xF7,0xFD,0xFF,0x7F,0xDF, -0xB7,0xFB,0xEC,0xFF,0xFF,0xF7,0xBF,0xEF, -0xFD,0xFC,0xFB,0xFF,0xEF,0xF0,0xFE,0x3F, -0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xEF,0x8D, -0xFF,0xFF,0xEF,0x7F,0xBF,0xFF,0xFB,0xFF, -0xDB,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xEF,0xD8,0xFF,0x2E,0x7F, -0xBE,0xEF,0xFE,0x6E,0xFF,0xBF,0xF9,0xFF, -0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFC,0x66,0xBE,0x47,0xF3,0x7F,0xDF,0xFE, -0x87,0x9F,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x6F,0x7C, -0xFB,0x4F,0xD2,0xFF,0xFD,0x2B,0xFE,0xFF, -0xFF,0xFD,0x5F,0xD7,0xD5,0xF5,0x7D,0xFF, -0xFF,0xFF,0xBF,0x9B,0xFF,0xFF,0xDF,0xB7, -0xFF,0xFF,0xDF,0xFF,0x3F,0xCF,0xFE,0x7F, -0xBF,0xEF,0xFB,0xFC,0xFF,0x3F,0xFF,0xD9, -0xBF,0xFE,0x97,0xEC,0x8F,0xB7,0xFE,0x9B, -0x7D,0xFD,0xB7,0xDD,0x77,0x1D,0xC7,0x71, -0xDD,0x77,0x5D,0xD7,0xF3,0x6F,0xFD,0x3F, -0x73,0xDD,0xAF,0xFD,0x7A,0xFF,0xFF,0xAF, -0xFE,0xFD,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF, -0xEF,0x66,0x7F,0xFF,0xFF,0xBF,0xBF,0xFF, -0xFB,0xFF,0xF7,0xDF,0xFD,0xFB,0x7D,0xDF, -0xB7,0xCD,0xF3,0x7C,0x5F,0x3F,0x91,0x3F, -0xFF,0x3D,0xEF,0x7B,0xFF,0xFC,0xFF,0xCA, -0xEF,0xFE,0xFF,0xBD,0xEF,0xFB,0x1E,0xE7, -0xBB,0xEC,0x7F,0xB3,0xFF,0xFD,0x9F,0xFF, -0xFF,0xFE,0xFF,0xFF,0x7F,0xBF,0xFB,0xFE, -0xFF,0xBF,0xEF,0xFB,0xEE,0xFB,0xBF,0xDF, -0x67,0xFF,0xFF,0xBF,0xEF,0xDB,0xFF,0xBC, -0xFE,0x7F,0xFB,0xFF,0x9F,0xEF,0xF9,0xFE, -0x7F,0x9F,0xE7,0xF9,0xFE,0x87,0xFF,0xEE, -0xFB,0xBE,0xE5,0xBF,0xEF,0xF9,0xD7,0x65, -0xF7,0xDD,0xE7,0x7D,0xDF,0x77,0x5D,0xD7, -0x7F,0xF8,0x9B,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFF,0xFF,0xBF,0xEF,0xFB,0xFF,0x7F,0xCF, -0xF3,0xFC,0xFF,0xBF,0xEF,0xFF,0xDB,0x3F, -0xEF,0xFB,0xFE,0xFF,0xDF,0xFF,0xFE,0xFB, -0xBB,0xEF,0xBF,0xEF,0xBB,0xEE,0xFB,0xBE, -0xEF,0xBB,0xFF,0xFC,0x7F,0xFD,0x3B,0x5B, -0xD6,0xE5,0xFD,0x4F,0xC3,0xFB,0xFF,0xBF, -0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF, -0xB4,0xFF,0xFA,0xBC,0x8F,0xB2,0xE9,0xD2, -0x2E,0xCF,0xFB,0xFF,0xBF,0xEF,0xFB,0xFE, -0xFF,0xBF,0xEF,0xFB,0xFF,0xEC,0xFF,0xFD, -0xFD,0x7F,0xDF,0xF7,0xE4,0xDF,0x5F,0xFF, -0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xC3,0xFF,0xEF,0xE6,0xF8,0xFE, -0x3F,0x8B,0x83,0xF9,0xFE,0x7F,0xE7,0xF9, -0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x17, -0xFD,0xFF,0xFF,0xFF,0x7F,0x5F,0xF7,0x2C, -0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xE7,0xF9, -0xFE,0x7F,0x9F,0xFE,0x2F,0xFF,0xFF,0xEF, -0xFF,0xFE,0xBF,0xEF,0xAD,0xFF,0xFF,0x7F, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFE,0xDF,0xFF,0xDF,0xFF,0xFD,0xFD,0x7F, -0xDF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0x3F,0xFE, -0xF7,0xFD,0xEF,0x7A,0xFF,0xB1,0xBD,0xFF, -0x7F,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD, -0xFF,0x7F,0xF3,0x27,0xFF,0xDF,0xFF,0xDD, -0xFF,0xFC,0x9B,0xFF,0xCB,0xFC,0xBF,0x2F, -0xCB,0xF2,0xFC,0xBF,0x2F,0xC9,0xFF,0xDE, -0xFF,0xDF,0xAF,0xEB,0xDA,0xFE,0xBB,0xAF, -0xEB,0xF8,0xF7,0xAF,0xE8,0xFA,0xFE,0xBF, -0xAF,0xEB,0xF2,0xFF,0xFD,0xFF,0xFF,0xEF, -0xBD,0xD7,0xBF,0xFF,0xFF,0xDE,0x8F,0xB8, -0xDE,0x37,0x8D,0xA3,0x78,0xDA,0x3F,0x8F, -0xFF,0xA1,0xFF,0xFF,0xFB,0xFB,0xFF,0xFF, -0xFF,0xFF,0xA7,0xBD,0xFB,0x76,0xFD,0xBF, -0xEF,0xDB,0xFE,0xBB,0xBF,0xFE,0x27,0x7F, -0xFF,0xFE,0xFE,0xFD,0xF5,0xFF,0xEF,0xF5, -0xDF,0x1F,0xE7,0xFD,0xFF,0x7F,0xDF,0xF7, -0xFD,0xFF,0xFF,0xCD,0xFD,0xAE,0xFF,0xFA, -0x3E,0x3F,0xAB,0xFD,0xF8,0x7E,0x8F,0xE3, -0xF8,0xFE,0x3E,0x8F,0xE3,0xF8,0xFF,0xFE, -0x1F,0xEF,0xDF,0xBF,0xFE,0xDE,0xDF,0xD9, -0xFF,0xDF,0xBC,0xFF,0xFF,0x7F,0xFF,0xEF, -0xFD,0x7F,0xDF,0xF7,0xF9,0x3F,0xFE,0xFF, -0xFF,0x6F,0xFE,0xDE,0xBF,0xF7,0xED,0xEA, -0xFD,0x8F,0x83,0xF8,0xEA,0x3F,0x8F,0xEF, -0xFF,0xF4,0x7F,0xFF,0xEF,0xEF,0x7B,0xF3, -0xF1,0x5F,0xFF,0xFF,0xF1,0x3B,0x7F,0xDF, -0xF7,0xFD,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF, -0xFF,0xFF,0xF7,0xFF,0x6F,0xFF,0x7F,0xFF, -0xFF,0xF7,0xDE,0xF7,0xBF,0xEF,0xFB,0xF7, -0xFD,0xFF,0xFF,0xF5,0xFA,0xFF,0xFF,0xFB, -0xE7,0xFF,0xF3,0xF8,0x7F,0xF3,0xDF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xEF, -0xBB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, -0xFF,0x7F,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xCF,0xFF,0x37,0xFF,0xFF, -0x7F,0xDF,0x77,0x5D,0xE7,0xFC,0xFF,0xBF, -0xF7,0xF5,0xFB,0xFF,0xFF,0xD7,0xF5,0xFB, -0xFF,0xFF,0x45,0xFD,0x7F,0xEA,0xFD,0xBE, -0xBF,0xDF,0xF7,0xFF,0xFF,0xDB,0xFB,0xFE, -0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0xFB,0x5F, -0x7F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFE,0xFF,0xEF,0xFD,0xFF,0x7F,0xDF, -0xFF,0xEF,0xFB,0xF8,0x0F,0xF3,0xFF,0xF9, -0x2E,0xFB,0xFE,0xFC,0xF3,0xEF,0xFF,0xFF, -0xBF,0xFF,0xFB,0xE7,0xFF,0xFE,0x7E,0xFF, -0xC0,0x6B,0xCF,0xFF,0x34,0xDF,0xF1,0xFD, -0xFF,0xEF,0xFF,0xFF,0xFF,0xDF,0xF7,0xFD, -0xCF,0x7F,0x9C,0xFD,0xFD,0x6C,0xF7,0xFF, -0xF6,0xFD,0xEB,0x2B,0x9F,0xFF,0xFC,0xFE, -0x7E,0xFF,0xFF,0xFF,0xFF,0xD7,0xF3,0xF7, -0xFF,0xFB,0xE1,0xBF,0xFF,0xEB,0x7A,0xDE, -0xD7,0xFB,0xFF,0xF9,0xFE,0xFF,0xFF,0xF3, -0xDE,0x7F,0xFD,0xE7,0x7F,0xFF,0xFD,0xBB, -0xFF,0xFF,0x7E,0xCC,0xF6,0xAF,0x5F,0x7F, -0xFE,0xF4,0x7D,0xF7,0xFD,0xBB,0x6E,0xDB, -0xB7,0xFF,0xF7,0xDF,0x66,0xFF,0xFF,0xF7, -0x3D,0xCF,0xDE,0xBD,0xFF,0xFF,0xDE,0xDB, -0x8D,0xF7,0x7E,0xDF,0xB7,0xEF,0x7F,0xFF, -0xF6,0x87,0xFF,0xFF,0xEF,0xFE,0xDE,0xBF, -0xFF,0xFF,0xFF,0xBB,0xEF,0xFD,0xFF,0x7B, -0xDE,0xF7,0x3F,0xFF,0xBF,0xFB,0xDB,0xFF, -0xF2,0xB6,0xFD,0xBD,0x7F,0xE7,0xFF,0xFF, -0xFF,0x6F,0xF7,0xFF,0xFF,0xFF,0xFE,0x77, -0xFF,0xBF,0xF8,0xAF,0xFF,0xDF,0xBF,0xFF, -0xBF,0x7F,0xFB,0xFF,0xFF,0xFF,0xDB,0xFE, -0xFF,0xBF,0xFF,0xFA,0xFF,0xFD,0xFF,0xF6, -0x7F,0xFF,0x9F,0xFF,0xFF,0x3F,0xEF,0xF8, -0xEE,0x7E,0x9F,0xBA,0xFE,0xBF,0x8F,0xEF, -0xFE,0xFE,0xF9,0xFF,0xFA,0x7F,0xFE,0x7E, -0xBF,0xAF,0xFB,0x96,0xFD,0x9F,0xEF,0x5E, -0x65,0xBE,0xEF,0x5B,0xB6,0xFF,0xBE,0xE3, -0xFF,0xB5,0xBF,0xFF,0xFD,0xFF,0x7F,0xFF, -0xEF,0xDF,0xFE,0xFF,0xBF,0xFB,0xFE,0xFF, -0xBF,0xCF,0xFF,0xFF,0xFF,0xFD,0x9B,0xFF, -0xFE,0xFB,0xFE,0xDF,0xFF,0x7F,0xFF,0xF7, -0xFE,0xFF,0xDF,0xFB,0xFB,0xFE,0xFF,0xFF, -0xFF,0xFF,0xFF,0xB7,0xFE,0xFA,0xFF,0xAB, -0xEF,0xFF,0xFD,0xB5,0x7B,0x7F,0xFB,0xF7, -0xFD,0xFF,0xFF,0xDD,0xFF,0xEF,0x8F,0xFF, -0x2F,0xFF,0xFB,0x7C,0xFF,0x3F,0xDF,0x73, -0xEB,0xFE,0x3F,0xFF,0xEF,0xFB,0xFE,0xFF, -0xEF,0xFD,0xFF,0xBF,0xFD,0x0F,0xFF,0xFF, -0xFF,0xF5,0xF9,0xFF,0x7F,0xD7,0xFD,0xFF, -0xDF,0xFF,0xF7,0xFB,0xFF,0x7F,0xBF,0xFF, -0xFF,0xF0,0x9F,0xFF,0xFE,0x7F,0x8B,0xE3, -0xF9,0xDE,0x27,0x9B,0xE6,0xBE,0x7F,0x9B, -0xC3,0xF8,0xDE,0x7F,0x9D,0xE7,0xFE,0x7F, -0xFF,0xFF,0x5F,0xD7,0xFF,0xFF,0xFF,0x4F, -0xFB,0xFF,0xFF,0x7F,0xFF,0xAF,0xFF,0x9F, -0x7F,0xFB,0xFF,0xE8,0xFF,0xFF,0xFE,0xBF, -0xAF,0xFF,0xFF,0xFE,0xBF,0xEF,0xF7,0xFF, -0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF, -0xFC,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF, -0xFD,0x3F,0xCF,0xFF,0xFF,0xFF,0xFF,0xF7, -0xFF,0xFD,0x7F,0xFF,0xFF,0x93,0xFF,0xFF, -0x7A,0xDF,0xF7,0xFF,0xFF,0x7B,0x7F,0xB7, -0xEF,0xFF,0xFF,0xFD,0xBF,0xFD,0xFB,0xFF, -0xF7,0xFF,0xD7,0xFF,0xFF,0xFF,0xFC,0x9F, -0x6F,0xCB,0xFF,0xF4,0xBB,0xDF,0xD6,0xFD, -0xBF,0x2F,0xD3,0xF7,0xFF,0xDF,0xFF,0xCF, -0xFF,0xFA,0xBE,0xBD,0xAF,0x6A,0xDA,0xBE, -0xBB,0xAB,0x3A,0xBE,0x2D,0xAE,0xEB,0xDA, -0xF6,0x3F,0xAD,0xF5,0xDD,0xFF,0xCF,0xF1, -0xFF,0xF9,0x7F,0xFF,0x73,0xFE,0xFF,0xCF, -0xC3,0xF4,0xF7,0x2F,0xF3,0xFF,0xFC,0xFF, -0x7C,0x1F,0xFF,0x3F,0x4F,0xFF,0x7E,0xFF, -0xEF,0xBD,0xF6,0xFE,0xFF,0x2B,0xEF,0xDC, -0xFB,0xFD,0xFF,0xFB,0xFF,0xEA,0x7B,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFB,0xF7,0xDF,0xFF, -0xE3,0x7D,0xFF,0xB7,0xFF,0xBF,0xFF,0xFF, -0xDF,0xFF,0xF8,0xFF,0xBF,0xFF,0xBF,0xEB, -0xE7,0xFA,0xFE,0x3D,0xBF,0xE9,0xFC,0xBF, -0xFF,0xFA,0xFB,0xFE,0xFF,0xFF,0xFF,0xD9, -0xFF,0xFF,0xFF,0xF6,0x7F,0xFF,0xF6,0x7D, -0xFF,0xDF,0xCF,0xFD,0xBF,0xFB,0xEF,0x7E, -0xFF,0x7F,0xFF,0xFF,0xD3,0xFF,0xFD,0xFB, -0xFF,0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xBF, -0xFE,0xFF,0xF7,0xEF,0xFF,0xFF,0xFF,0xFB, -0xFF,0x87,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF, -0x7B,0xFE,0xFF,0xFE,0x3B,0xF7,0xF7,0xFF, -0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF, -0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7, -0xFF,0xFF,0xAD,0xFF,0xFE,0xF7,0xFF,0xFF, -0x5F,0xFF,0xFF,0xDF,0xFF,0xFD,0xFF,0xF5, -0xFF,0xDF,0xFF,0xBD,0xFF,0xE9,0xFF,0xC7, -0xF3,0xFF,0xFF,0xF7,0xFF,0xF3,0xFF,0xF8, -0x3B,0xFF,0xFF,0x7B,0xDF,0xBF,0xFB,0xEF, -0xFB,0xFF,0xFB,0xF7,0xF7,0xBB,0xFF,0xFF, -0xFF,0xFF,0xFB,0xFF,0xFE,0x7F,0xF3,0x7F, -0x5E,0xB7,0xBF,0xFD,0x7F,0xFF,0xF9,0x7F, -0xFB,0xFF,0xEB,0xFD,0x7F,0x7F,0xFF,0xEF, -0xFB,0xE0,0x3F,0xFE,0xBF,0xBF,0xDF,0xFF, -0x7E,0xFF,0xF7,0xFF,0xFF,0xFE,0xBF,0xFF, -0xDB,0x78,0xFF,0xFF,0xFF,0xEE,0xA1,0xBF, -0xF5,0xDE,0xFB,0xF7,0xFF,0xFB,0xFF,0xFF, -0xFF,0xFF,0xFB,0xFF,0xFF,0xD7,0xFF,0xFF, -0xFF,0xFF,0xEF,0xF0,0xFF,0xFF,0xFF,0xF3, -0xF7,0xFF,0xEF,0xFF,0xE7,0xCF,0xFF,0xFB, -0xFF,0xEF,0xFF,0xFF,0x9F,0x9F,0xEF,0xFC, -0x16,0xBF,0xFE,0xF3,0xE4,0xFF,0xFF,0xC6, -0xFF,0xE7,0xFF,0xFF,0xFD,0xFF,0xBF,0xFF, -0xFF,0x3F,0xFF,0xBF,0xD6,0xAF,0x7F,0xFE, -0x6B,0x7E,0x7F,0xFF,0xAF,0xFF,0xFF,0xBF, -0xFF,0x5F,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF, -0xFF,0xBD,0xDB,0xFF,0xFE,0x5F,0xF2,0xFF, -0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xEF,0x7F,0xFF,0xFF,0xFF,0xFF,0xDE,0xBF, -0xFF,0xFF,0xEF,0xFB,0x77,0xFE,0xBD,0x7F, -0x5F,0xFF,0xFF,0xFF,0xDF,0x6F,0xED,0xFF, -0xFD,0xFF,0x7F,0xFD,0x6F,0xFF,0xFF,0x77, -0xDA,0xCF,0xFD,0x5F,0xFF,0xBF,0xFF,0xFF, -0xDF,0x7F,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF, -0x66,0x7F,0xFF,0xFE,0xBF,0xE7,0xBF,0xFA, -0xFF,0xFE,0xFF,0xFF,0xFF,0xDF,0xFF,0x59, -0xEF,0xFF,0xEF,0xFB,0x7F,0x89,0xFF,0xFF, -0xE9,0xFF,0x6F,0xFF,0xF5,0xFF,0xFF,0xFF, -0xFF,0xFF,0x7F,0xF2,0xF7,0xFF,0xFF,0xEF, -0xF8,0x7F,0xFB,0xFF,0xFD,0xFF,0xFF,0xD9, -0xFF,0xEF,0xBB,0xFF,0xFF,0xFF,0xBF,0xEF, -0xDE,0xFF,0xFF,0x9F,0x7F,0xDF,0xFF,0xF7, -0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xAF, -0xFF,0xFF,0xF7,0x3F,0xEB,0x9F,0xFE,0x7F, -0x9E,0x7F,0x9F,0xFE,0x87,0xFF,0xED,0xDB, -0x56,0xFF,0xBF,0xAF,0x0B,0xD2,0xFF,0xEF, -0xDB,0x6E,0x7D,0xBD,0x6F,0xF8,0xFE,0x3F, -0xFA,0x5B,0xFF,0xFD,0xBF,0xEF,0xFF,0xBF, -0x6F,0xDB,0xE6,0xFF,0xFF,0x3F,0xFF,0xDF, -0xFE,0xFF,0xFF,0xFF,0xFF,0xDA,0x3F,0xFF, -0xFB,0xFE,0xFE,0xFF,0xFF,0xDF,0xF7,0xBD, -0xFF,0xFD,0xFF,0xFE,0xFF,0xFB,0xFF,0xFF, -0xFF,0xFF,0xF1,0x5F,0xFD,0x9F,0xDF,0xFD, -0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,0xFF,0x76, -0xFA,0xFF,0xFF,0x7F,0xE3,0xF8,0xFF,0xAE, -0xFF,0xFB,0x7E,0x9D,0x73,0xFF,0xFA,0x7F, -0xDF,0xFF,0xFF,0x7F,0xFF,0xFB,0xCD,0xFF, -0x7F,0xEF,0xFB,0xFF,0xFD,0xFF,0xF7,0x7F, -0x7F,0xEF,0xFF,0xED,0xFF,0xFF,0xFF,0xB5, -0xFF,0xBF,0xFF,0xBF,0xFD,0xEF,0xDB,0xF7, -0xFF,0x93,0xFF,0xEF,0xE2,0xF9,0xBE,0x7F, -0x8B,0xE7,0xF9,0xFE,0x6B,0xE7,0xF9,0xFE, -0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x47,0xFF, -0xFF,0xFD,0xFF,0x9F,0xFF,0xD7,0xFF,0xFF, -0xFF,0xFF,0xF5,0xFF,0x9F,0xFF,0xF7,0xFE, -0xFF,0xBF,0xFE,0x6F,0xFF,0xFF,0xFB,0xFF, -0xFF,0xFF,0xAF,0xFF,0xFF,0xFF,0x7F,0xFB, -0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, -0xDF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xDF, -0xFF,0xFF,0xFF,0x5F,0xFF,0xFF,0xFF,0xFF, -0x5F,0xFB,0xFE,0xFF,0xF8,0x37,0xFF,0xFF, -0xEF,0xFF,0x7F,0xFE,0xBF,0xFF,0xFF,0xFE, -0xBF,0xFF,0xFF,0x7F,0xFF,0xBF,0xFD,0xFF, -0x7F,0xFA,0x7F,0xFF,0xFF,0x6F,0xFF,0xFF, -0x7D,0xFF,0xCF,0xFF,0xFF,0xFF,0x4F,0xFF, -0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0xBF, -0xFF,0xAE,0xEB,0xFA,0xFE,0xBB,0xAD,0xEB, -0xFA,0xF7,0xAF,0x6B,0xFA,0xF6,0xBF,0x25, -0xE9,0xF2,0x7F,0x45,0xFF,0xFF,0xFD,0xF7, -0xF7,0xBF,0xFF,0xDF,0xFF,0xFF,0xBF,0xFB, -0xFF,0xDF,0xF3,0xFF,0xF7,0x3F,0xCF,0xFF, -0xA1,0xFF,0xFF,0xBF,0xE7,0xFF,0xFF,0x7F, -0xFF,0x3D,0xFF,0xFF,0xFF,0xF7,0xFF,0x2F, -0xFF,0xFB,0xF5,0x7F,0xFE,0x57,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7, -0x3F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,0xFE, -0xF7,0xEE,0xAF,0xFE,0xEE,0xE7,0xFA,0xFF, -0xFE,0x9D,0xF9,0x5E,0xFE,0xFF,0xEB,0xFF, -0xFF,0xDF,0xA7,0xFF,0xFF,0xFF,0xFC,0xDB, -0xFF,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF, -0xFB,0xFD,0xFF,0xDB,0xFF,0xFF,0xFF,0xEF, -0xFF,0xFF,0xFF,0xFD,0xBF,0xFE,0xBF,0xFF, -0x6F,0x7F,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF, -0xF7,0xFF,0xBF,0xDE,0xF7,0xFF,0xFF,0xFF, -0xFA,0x7F,0xFD,0xBF,0x5F,0xFF,0xFF,0xBF, -0xFF,0xED,0xFF,0xF7,0xBF,0xFF,0xFF,0xEF, -0xFF,0xDF,0xFF,0xFF,0xFF,0xE6,0xFF,0xFB, -0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEB,0xFF, -0xFD,0xFF,0xF5,0xFF,0xF6,0x7F,0xDF,0xBD, -0xCF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF, -0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3, -0xFF,0xEE,0xBF,0xFF,0x7D,0xEF,0xFE,0xFF, -0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFE, -0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xB5,0xAE, -0xFF,0xFF,0xB6,0xFE,0xBF,0xFF,0xFF,0xBF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0x27,0xFF,0xEF,0xFE,0x7F,0xDF,0xFF, -0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFD,0xFF,0xF7,0xF9,0x9F,0xFF, -0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F, -0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0x0F,0xFF,0xE7,0xBF,0xFE, -0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFC,0xBF, -0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xC4, -0x6B,0xFF,0x29,0x1F,0xFB,0xAF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xEF,0x1B,0xFE,0xFF,0xFC, -0x6F,0xFF,0xFF,0xFD,0x6A,0xF7,0xD7,0xF5, -0xBF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFE,0xBF,0xFF,0xFF,0xFA,0xFF,0xFF,0xF7, -0xFB,0xDD,0xBF,0xFF,0xE7,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x7F,0xFF, -0xFF,0xF5,0xFF,0xFF,0xF7,0xFD,0xB3,0xEF, -0xFD,0x7E,0x5D,0xFF,0xFD,0xFF,0xFF,0xFF, -0xFD,0x7F,0xD2,0xF5,0xFB,0x7E,0xCB,0xB7, -0xFF,0xFF,0xFF,0xC6,0xFF,0xFD,0xEE,0x63, -0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xFD,0x65, -0x5B,0xDF,0xFF,0xD5,0xFF,0xFF,0xFF,0xF6, -0xE7,0xBF,0xF7,0xA9,0xFF,0xFF,0xED,0xFF, -0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFF,0xFF, -0xAF,0xFF,0xFF,0xFF,0xF8,0x1B,0xFF,0xE3, -0xD0,0xBF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF, -0xFF,0xD7,0xFF,0xFF,0xFF,0x5F,0xFF,0xFF, -0xFF,0xFF,0xAF,0xFF,0xDB,0x76,0xBF,0xFF, -0x7F,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF, -0xFB,0xFE,0xFF,0xFF,0xFF,0xBF,0xF2,0x7F, -0xFF,0x9F,0xFE,0xBD,0xFE,0x7F,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xF7,0x3F,0xEC,0x7F,0xF6,0x95,0xBB, -0xEF,0xF8,0xFE,0xFC,0xBF,0x2F,0xDA,0xFC, -0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xEF,0xFF, -0xA9,0xBF,0xCF,0xFB,0xFF,0xFF,0xFF,0xFE, -0xDD,0xB7,0x6D,0xF6,0xD9,0xB6,0x6D,0x9B, -0x76,0xD9,0xBF,0xFB,0xFD,0xA3,0xFF,0xBF, -0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xDF, -0xFD,0xEF,0x7B,0xDE,0xF7,0xFD,0xEF,0x7F, -0xFF,0xFF,0x05,0xFF,0xFA,0xFE,0x7F,0xEF, -0xE3,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF, -0xFF,0x5F,0xFF,0xFF,0xFD,0x7F,0xFB,0xAF, -0xFF,0x63,0xC8,0xFF,0xBF,0xEF,0xFF,0xFF, -0xFA,0x7F,0xFF,0xFF,0xFF,0xFE,0x9F,0xF7, -0xFF,0xFA,0xBF,0xFE,0x9F,0xFB,0x7F,0xFF, -0xFF,0xEF,0xD7,0xFF,0xFF,0xF5,0xFF,0xFF, -0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xBF,0xFF, -0xF9,0xBF,0xFF,0xBE,0x27,0x9F,0xE7,0xF9, -0xFE,0x7F,0x8B,0xE7,0xFE,0x7F,0x9F,0xE2, -0xF9,0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF, -0xFF,0xFF,0xFB,0xFE,0xFF,0xFF,0xFF,0xD7, -0xFF,0xFF,0xFF,0xFF,0xF5,0xFF,0xFF,0xFF, -0xD7,0xFF,0xFA,0xFF,0xFE,0xFF,0xFF,0xFF, -0xFD,0xFF,0xFF,0xFF,0xAF,0xF7,0xFF,0xFF, -0xFF,0xEB,0xFF,0xFF,0xFF,0xAF,0xFF,0xC4, -0xFF,0xF7,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, -0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xD7,0xFF, -0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFB,0x7A, -0xDF,0xF7,0xFD,0xFF,0xFF,0xFE,0xBF,0xFF, -0xFF,0x7F,0xFF,0xAF,0xFF,0xFF,0xFF,0xF7, -0xEF,0xE3,0xFF,0xDD,0xD2,0xFF,0xDF,0xFF, -0xFF,0xF2,0xFC,0xBF,0xCB,0xF6,0xFD,0xBF, -0x2F,0xCB,0xFF,0x7F,0xDF,0xDE,0xAF,0xFF, -0xDA,0xEE,0xBF,0xAF,0xE9,0xFA,0xF4,0xBD, -0xAF,0x5A,0xAE,0xBB,0xAB,0x6B,0xDA,0xDE, -0xBF,0xAD,0xD7,0x5E,0xFF,0xFF,0xBF,0xFC, -0xFF,0xDF,0xFD,0xFF,0xFF,0xFF,0xFF,0xDF, -0xF7,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFA, -0x1F,0xFF,0xFE,0xFB,0xEF,0xBF,0xFD,0xFF, -0xFD,0xBD,0x77,0xFF,0xFF,0xFF,0xFF,0x9D, -0xEF,0xFF,0xFF,0xFF,0xEF,0x7D,0xFF,0xFB, -0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, -0xBF,0xE4,0xFB,0xFF,0xFE,0x3F,0xFE,0xFF, -0xFF,0xFF,0xFF,0xAF,0xEA,0xFE,0xBF,0xAF, -0xEB,0xFA,0xFE,0xFF,0xFF,0xFF,0x55,0xF6, -0xFF,0xFE,0xF7,0xFF,0x7F,0xFF,0xEB,0xF7, -0x5F,0xC5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF, -0x6F,0xFB,0xFF,0x8A,0xFF,0xFF,0xFF,0xFF, -0xEB,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0xBF, -0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF, -0x77,0xDF,0xFB,0xFF,0xFD,0x7F,0xEF,0xFF, -0xFF,0xFF,0xBF,0x7F,0xFF,0xDF,0xBF,0xFF, -0xFB,0xFF,0xFF,0xFF,0xFE,0xEF,0xDF,0xFF, -0xFE,0xFF,0x9F,0xEF,0x7D,0xFF,0xF7,0xFF, -0x7F,0xFF,0xFF,0xDF,0xF7,0xFD,0xFF,0xEF, -0xDF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB, -0xFD,0xFF,0xBF,0xDF,0xD1,0xFF,0xF8,0x3B, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0x7E,0xDB,0xFD,0xFF,0x77,0xDB,0xB7,0x7D, -0xBF,0xFB,0xFF,0xF8,0x7F,0xED,0x7B,0x5E, -0xFF,0xFE,0xFF,0xFF,0x4F,0xD7,0xFD,0x7F, -0xDF,0xD7,0xF5,0xFF,0x7F,0xFF,0xFF,0xFF, -0xF2,0x3F,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF, -0xFF,0xBF,0xEF,0xFE,0xFF,0x3B,0xEE,0xFF, -0xFC,0xEF,0xFF,0xFF,0xFF,0x85,0xFF,0xFD, -0xFE,0xFF,0xF5,0xFF,0xFF,0xFE,0xFF,0xDF, -0xFB,0xFF,0x5F,0xBF,0xFF,0xFD,0xFF,0xFF, -0xFF,0xFF,0xA8,0xFF,0xFF,0x9F,0x9E,0xFF, -0xFF,0xFF,0x7F,0xF3,0xFF,0xFF,0xCF,0xFF, -0xF7,0xFD,0xFF,0x7F,0xFF,0xFF,0xFC,0x16, -0xBF,0xCF,0xA3,0xE5,0xEF,0x7F,0xFF,0xF3, -0xE4,0xFF,0xCF,0x93,0xFC,0xFF,0x3F,0xCF, -0xFF,0xFF,0xFF,0xD6,0x0F,0x7D,0xBF,0x6E, -0xFB,0xF4,0xFC,0xAF,0x6D,0xDB,0x77,0xB7, -0x6D,0xDB,0xF6,0xFD,0xBF,0xFF,0xFF,0xFF, -0xBF,0x9B,0xFA,0xDE,0xB7,0xB7,0xED,0xF9, -0x7E,0xB7,0xAC,0xEB,0xD6,0xB3,0xAD,0xEB, -0x7A,0xDF,0xFF,0xFF,0xFF,0xD8,0xBF,0xFF, -0xB7,0xED,0x9F,0x6F,0xDD,0xF7,0x68,0xDB, -0x37,0xB3,0x6C,0xDB,0x36,0xCD,0xB3,0x7F, -0xFF,0x7F,0xF5,0x6F,0xFD,0xEF,0x79,0x3D, -0xF7,0x93,0xE4,0x7A,0x9E,0xAD,0xEA,0x7A, -0x9E,0xF7,0xBD,0xEF,0xFF,0xFF,0xFF,0x76, -0x7F,0xFB,0xC6,0xFF,0xBB,0xEF,0xDA,0xFE, -0xFD,0xBF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, -0xFF,0xFF,0xFB,0xFF,0xA5,0xFF,0xFD,0xAB, -0x6F,0x78,0xDE,0x17,0x8F,0x79,0xDF,0xFD, -0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xFF,0xFB, -0xFF,0xFB,0xFF,0xEF,0xFB,0xEF,0xFB,0xFE, -0xFF,0xBB,0xDA,0xF3,0xEF,0x3B,0xCE,0xF3, -0xBC,0xEF,0x3F,0xCF,0xDF,0xFF,0xB7,0xFF, -0xFF,0xFF,0xCF,0x73,0xFF,0xBF,0xEF,0xFF, -0xF3,0xFF,0x3F,0xCF,0xF3,0xFC,0xFF,0x3D, -0xCF,0x9F,0xFE,0x07,0xFF,0xAF,0xEB,0xFE, -0xFD,0xBF,0xEF,0xEB,0xFA,0xFF,0xAF,0xEB, -0xFA,0xFE,0xBF,0xAF,0xFB,0xFE,0x3F,0xFB, -0x9B,0xFF,0x7F,0xDF,0xFF,0xF3,0xFE,0xFF, -0xDE,0xF7,0xBF,0x7B,0xDE,0xF7,0xBD,0xEF, -0x7B,0xFE,0xFF,0xFF,0xDF,0x3F,0xFE,0xFF, -0xB7,0xFF,0xEF,0xF7,0xFF,0xBF,0xED,0xFE, -0xDF,0xB7,0xED,0xFB,0x7E,0xDF,0xFF,0xFF, -0xFF,0xFD,0x5F,0xEF,0xEB,0xFA,0xFE,0xF5, -0xBF,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFE,0xF8,0xFF,0xA8,0xFF, -0xFF,0xBF,0xEF,0xFB,0x6A,0xFB,0xB7,0xEF, -0xFB,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF, -0xEF,0xFB,0xFF,0xE0,0xFF,0xFF,0xFD,0x7F, -0x5C,0xD7,0x7D,0xDF,0xF3,0x5C,0xF5,0xCD, -0x73,0x5E,0xD7,0xB5,0xFD,0x7F,0xEF,0xFF, -0xDB,0xFF,0xFF,0xE2,0xF8,0xBE,0x2F,0x8F, -0xE7,0xF8,0xBE,0x6B,0xE2,0xF8,0xBE,0x2F, -0x8B,0xE2,0xF9,0xFE,0x7F,0xE7,0xFF,0xD7, -0xF5,0xFD,0x7F,0xFF,0xF7,0xF5,0xFD,0x7F, -0xD7,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF, -0xFF,0xFF,0x8F,0xFF,0xAF,0xEB,0xFA,0xFF, -0xFF,0xBF,0xEB,0xFA,0xFF,0x2F,0xEB,0xFA, -0xFE,0xBF,0xAF,0xEB,0xFF,0xFF,0xFE,0x5F, -0xFF,0x5F,0xFF,0xFF,0xFD,0xFF,0xFF,0xD7, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xBF,0xFE,0xB7,0xFD, -0xFF,0x7E,0xDF,0xF7,0xAD,0xFF,0x7F,0xF7, -0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F, -0xF6,0x7F,0xFF,0xFF,0xFF,0xDB,0xF6,0xFC, -0xAF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xBF,0xFF, -0xAF,0xEB,0xFA,0xF6,0xAB,0x8F,0xEB,0xFA, -0xF7,0xA5,0xEB,0xFA,0xBE,0xBF,0xAF,0xEB, -0xFA,0xFF,0x6D,0xFF,0xFF,0x7F,0xDF,0x33, -0xDD,0xFF,0x7F,0xFE,0xF7,0xFC,0x7F,0xFB, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9, -0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xDF, -0xFF,0xFF,0xEF,0xEF,0xFD,0xFF,0x7F,0xFF, -0xFF,0xFF,0xFF,0xFE,0xA7,0xFF,0xFF,0xFF, -0x77,0xDF,0xF7,0xFD,0x9F,0x7F,0xFE,0x77, -0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xAF,0xBF,0xAF,0xFF,0xF9,0xBE,0xBF, -0x8F,0xFB,0xFE,0xFE,0xEF,0xFB,0xFE,0xFF, -0xBF,0xEF,0xFB,0xFF,0xFF,0xFD,0xDF,0x6F, -0xEF,0xFF,0x7F,0xFF,0xBF,0xBF,0xDF,0xFF, -0xFC,0xFF,0xDF,0xF7,0xFD,0xEF,0x7F,0xDF, -0xFF,0xFF,0xFF,0x3F,0xF6,0xFF,0xCF,0xFF, -0xDB,0xFB,0xF7,0xFF,0xEB,0x7A,0xFF,0xFF, -0xFF,0xBF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFE, -0x6D,0xFD,0xFF,0x5F,0xFB,0xFF,0xFF,0xF7, -0xFF,0x5F,0xF5,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFB,0xFF, -0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xE7,0xF6, -0xBF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF, -0xFF,0xC9,0xFF,0xFF,0xFF,0xBD,0xFF,0xBF, -0xAF,0xEF,0xEF,0x3F,0xD1,0xFC,0x7F,0xFB, -0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xFF, -0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0x77,0xFF, -0xDF,0xB7,0xFD,0xF7,0xFD,0xF7,0xFF,0xFF, -0xFF,0xFF,0xFF,0x57,0xFF,0xF7,0xA5,0xFD, -0x3F,0xDF,0xBF,0xBF,0xFE,0x7F,0xFF,0xFF, -0xFF,0xDF,0xFA,0xFD,0xFF,0xFF,0xFF,0xFE, -0x87,0xFF,0xE9,0xFF,0xFE,0xEF,0xBF,0xEF, -0xFE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFA,0x9F,0xFF,0x3F, -0xFF,0xFD,0xFD,0x57,0xDF,0xFD,0xF3,0xFF, -0xDF,0xFD,0xFF,0x5F,0xDF,0xF5,0xFD,0xFF, -0xFF,0xF9,0x8F,0xFF,0xFF,0xFF,0xEE,0x7F, -0xFF,0xFF,0xBF,0x5E,0xFE,0xEC,0xFB,0x3F, -0x7F,0x9F,0xEF,0xF9,0xFF,0xFF,0xCD,0x6B, -0xFF,0xFF,0xFF,0xC5,0xF3,0xFC,0xFA,0x38, -0xFF,0xAF,0x3F,0xEE,0x7F,0x9F,0xFF,0xD9, -0xFF,0xFF,0xFD,0x7A,0xF7,0xFF,0xF3,0xFF, -0xAF,0x6F,0xDB,0xF2,0xB9,0xE9,0xFB,0xFF, -0xFF,0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xFB, -0xC5,0xBF,0xFF,0xEF,0xFF,0x5E,0xB7,0xAD, -0xCD,0x79,0x7C,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFD,0x93,0xFF,0xEF, -0xEA,0xFE,0xBF,0xEF,0x5B,0xD2,0xCD,0xF5, -0x6D,0x77,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF, -0xFF,0xFF,0x66,0xFF,0xD5,0x65,0x7D,0x5F, -0x75,0x9D,0x65,0x7F,0xD6,0xFB,0x4F,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xC7, -0xFF,0xBF,0xEF,0xFA,0xFE,0xFF,0xBF,0xEB, -0xFF,0xDF,0xFF,0x7E,0xFF,0xFF,0xEF,0xFD, -0x7E,0xD7,0xFF,0x78,0xDF,0xFF,0x5F,0xDF, -0xF5,0xBF,0x7F,0xDF,0xC5,0xFF,0x3F,0xF6, -0x7E,0xFF,0x0F,0xEF,0xF2,0x3E,0xBF,0xFF, -0xFB,0x3F,0xFF,0xFB,0x7F,0xFF,0xB3,0xFE, -0xFB,0xF6,0xFD,0xFF,0xDA,0xF7,0xFD,0xFF, -0x7F,0xDF,0xF7,0xBF,0xFF,0xFA,0x7F,0xFF, -0xFF,0xFF,0xFF,0x9F,0xFF,0xF3,0xDC,0xF9, -0xBF,0xCE,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7, -0xFF,0xFF,0xE2,0x7F,0xFE,0xFF,0xBF,0xEF, -0xEB,0xFA,0xFF,0x9F,0x67,0x1E,0xFF,0x8F, -0xE7,0xF8,0xFE,0x7F,0x8F,0xEF,0xFF,0xBD, -0xBF,0xFF,0xFB,0xFF,0xFF,0xDF,0xF7,0xFF, -0xFC,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFD,0xB3,0xFF,0xFF,0xEF, -0xFF,0xFF,0xBF,0xED,0xFF,0xFB,0xEE,0xFE, -0xFF,0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF, -0xFF,0xB5,0xFF,0xB7,0xFD,0xFD,0x6E,0xFF, -0xFF,0xFE,0xFD,0x2F,0xD8,0xFE,0xBF,0x8F, -0xEB,0xF9,0xFE,0x3F,0xFF,0xFA,0xCF,0xFF, -0xE7,0xD9,0xFA,0xBF,0xDF,0x77,0xFC,0xFB, -0x3F,0xAB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFE, -0xFF,0xFF,0xEE,0x1F,0xFF,0xDF,0xF7,0xFF, -0xFF,0xFF,0x5F,0x97,0x35,0xBF,0x5E,0xFE, -0xBF,0xEF,0xFF,0xF7,0xFD,0xFF,0xFF,0xFA, -0xBF,0xFF,0xBE,0x6F,0x9F,0xE7,0xF8,0xBE, -0x2F,0x8B,0x66,0x94,0x7D,0x9D,0xE7,0xF9, -0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF,0xFF, -0xFF,0xF7,0xF5,0xFD,0x7F,0x5F,0xFB,0xFD, -0x9E,0xFF,0xFB,0xFE,0xFF,0xFF,0xEF,0xFF, -0xFF,0xA0,0xFF,0xFF,0xFF,0xBF,0xEF,0xEB, -0xFA,0xFE,0xBF,0xB7,0xF7,0xF7,0xFF,0xFF, -0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF, -0xFD,0xFF,0xFF,0xFF,0xD7,0xFF,0xFF,0xFF, -0x7F,0xF5,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, -0xBF,0xFF,0xFF,0xAB,0xFE,0xFB,0xFE,0xFF, -0xF7,0xAF,0xFF,0xFF,0xDE,0xF7,0xEB,0x5F, -0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,0xFF, -0xB3,0xFF,0xC9,0xFE,0xFF,0xFF,0xFF,0xFF, -0xD6,0xFF,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFC,0x8F,0xFF,0xBA, -0xBE,0xBF,0xAF,0xEB,0x78,0xFE,0xB7,0xAD, -0x3A,0xFE,0xB7,0xAF,0xEB,0x7A,0xFE,0xBF, -0xAF,0xFF,0x9F,0xFF,0xFF,0xDF,0xFC,0xFF, -0xFF,0xFE,0xC3,0xFE,0xFF,0xFF,0x33,0xFC, -0xFF,0xBF,0xDF,0xF3,0xFF,0xFF,0xBB,0x9F, -0xFF,0xFF,0xFF,0xEB,0xDF,0xFF,0xFF,0xAF, -0xF7,0x6F,0xF9,0xBF,0xEF,0xFD,0xFF,0xFF, -0xFF,0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF, -0xFB,0xFF,0xFF,0xBF,0xFD,0xFB,0xF7,0xFF, -0xDF,0xF7,0xFF,0xFE,0xEF,0x5F,0xBD,0xFF, -0xFA,0xFF,0xF8,0xFF,0xBF,0xAF,0xFB,0xFE, -0xFE,0x3F,0xEF,0xE8,0xFF,0xDF,0xF3,0xFD, -0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xFB, -0xFD,0xFF,0xAF,0xFF,0xFF,0xFE,0xFE,0xBF, -0xDB,0xFF,0xFF,0xFF,0xBF,0xFF,0xDF,0xFF, -0xFD,0xFF,0xCB,0xFF,0xFF,0xFF,0xFF,0xFF, -0xBF,0x6F,0xFF,0x7F,0xB7,0xB3,0xFF,0xFF, -0xDF,0xFF,0xFB,0xEF,0xFF,0xFF,0xFF,0x07, -0xFF,0xFB,0xFF,0xFF,0xFF,0xED,0xFF,0xF5, -0x7C,0xFF,0x7F,0xFE,0xFF,0xFF,0xEF,0xCF, -0xFF,0xFB,0xFF,0xFF,0x2F,0xFF,0xFF,0xFF, -0xFF,0xF3,0xFF,0xFB,0xFF,0xFE,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF, -0xFD,0x1B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFE,0x7C,0xFF,0xFF,0xFF,0xFF, -0xEF,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0x7F, -0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, -0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xDF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xFE, -0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xEF,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xEF,0xFA,0xB5,0xFF,0xFF,0xFF, -0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xDF,0xFB, -0xFC,0xFF,0xFF,0xFE,0xFF,0x7F,0xDF,0xBF, -0xFF,0xCB,0xBF,0xF9,0xFE,0x7F,0x9F,0xE7, -0xF9,0xFE,0x7F,0x97,0xE1,0xFE,0x79,0x9F, -0xE7,0xFD,0xFE,0x7F,0xDF,0xFE,0x37,0xFF, -0xFB,0xDE,0xDE,0xBD,0xEF,0xF3,0xFE,0xFB, -0xAF,0xEB,0xFE,0xFF,0xFF,0xCF,0xFF,0xFE, -0xFF,0xBF,0xFF,0x8F,0xFF,0xEF,0xFB,0xFE, -0xFF,0xBF,0xE7,0xF9,0x5E,0x7F,0xEF,0xFB, -0xDA,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD, -0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF, -0xFF,0xFF,0x7F,0xFF,0xFF,0xF7,0xFB,0x7F, -0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xFF,0xBF, -0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0x7B,0x7F, -0xBF,0xEF,0xFB,0xFE,0xFF,0xB5,0xEF,0xFB, -0xBF,0xFA,0x7F,0xFC,0xFF,0x3F,0xCF,0xF3, -0xFC,0xFF,0x3F,0xCF,0xBC,0xFF,0x3F,0xEF, -0xF3,0xFC,0xFE,0x3F,0xCF,0xFF,0xEE,0xEF, -0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0x6A,0xD7, -0xB7,0xFB,0xF8,0xFF,0xB7,0xEF,0xBA,0xFE, -0xFF,0xBF,0x7F,0xE9,0xFF,0xF9,0x7E,0x5F, -0x97,0xE5,0xF9,0xFE,0x7F,0xBF,0xF9,0x7E, -0x5F,0x9F,0xE5,0xFB,0xFE,0x5F,0xB7,0xFF, -0xA3,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7, -0xFD,0xFF,0x5E,0xF7,0x7D,0xFF,0x77,0xDF, -0xF7,0xFD,0xFF,0x7F,0xFF,0xD7,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFD,0xDF,0xFB,0x7F, -0xFF,0xFF,0xEF,0xFF,0xFE,0xFB,0xFF,0xFF, -0xBF,0xFE,0x8F,0xFF,0xDF,0xF7,0xFD,0xFD, -0x7F,0xDF,0xF7,0xFD,0x3E,0xDF,0xF5,0xBD, -0xFF,0x7F,0xDF,0xF7,0xFD,0xF7,0xFF,0x9F, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFD,0xFF,0xBE,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFD,0x3F,0xFF,0xDF,0xF7, -0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xCF, -0x77,0xFC,0xFF,0x5F,0xDF,0xF7,0xFD,0xFF, -0xF4,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFD,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xED,0xFB,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xE9,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFB,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF, -0xBF,0x3F,0xFB,0xFF,0xFF,0xFF,0xFB,0xF3, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xF7, -0xFF,0xFF,0xFF,0xFF,0x17,0xFF,0xFF,0xFF, -0xDF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF, -0xDF,0xDF,0xFF,0xFD,0xFF,0xFF,0xDF,0xF7, -0xFF,0x4F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD, -0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x9F,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, -0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF, -0xFF,0xFF,0x7A,0x3F,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2, -0x7F,0xFF,0xFB,0xFE,0xFF,0xBF,0xEF,0xF8, -0xFE,0xFF,0xBF,0xFB,0xFE,0xFF,0x8F,0xEC, -0xFB,0xFE,0xFF,0xBF,0xF8,0xF7,0xFE,0xFF, -0xBF,0xEF,0xFB,0xFE,0xFD,0xBF,0xCF,0xEC, -0xFF,0x3F,0xEF,0xDB,0xF8,0xFF,0xBF,0xCF, -0xFF,0xF9,0xFF,0xFF,0xBF,0xFF,0xFB,0xFF, -0xFF,0xFF,0xEF,0xFB,0xDF,0xFF,0xFF,0xFF, -0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xBB,0xFF, -0xEF,0xFB,0xFE,0xEF,0xBF,0xEE,0xEB,0xFB, -0xFE,0xFF,0xEF,0xFE,0xEE,0xBF,0xFE,0xEB, -0xFF,0xEF,0xFF,0x17,0xFF,0x7E,0xEB,0xBB, -0xFE,0xBF,0xBE,0xFB,0xEF,0x5B,0xF7,0xBD, -0xFB,0xCF,0xBF,0xBF,0xBB,0xFB,0x7E,0xCC, -0xEF,0xFF -}; diff --git a/drivers/usb/dabfirmware.h b/drivers/usb/dabfirmware.h new file mode 100644 index 000000000000..d14d803566a3 --- /dev/null +++ b/drivers/usb/dabfirmware.h @@ -0,0 +1,1408 @@ +/* + * dabdata.h - dab usb firmware and bitstream data + */ + +static INTEL_HEX_RECORD firmware[] = { + +{ 2, 0x0000, 0, {0x21,0x57} }, +{ 3, 0x0003, 0, {0x02,0x01,0x66} }, +{ 3, 0x000b, 0, {0x02,0x01,0x66} }, +{ 3, 0x0013, 0, {0x02,0x01,0x66} }, +{ 3, 0x001b, 0, {0x02,0x01,0x66} }, +{ 3, 0x0023, 0, {0x02,0x01,0x66} }, +{ 3, 0x002b, 0, {0x02,0x01,0x66} }, +{ 3, 0x0033, 0, {0x02,0x03,0x0f} }, +{ 3, 0x003b, 0, {0x02,0x01,0x66} }, +{ 3, 0x0043, 0, {0x02,0x01,0x00} }, +{ 3, 0x004b, 0, {0x02,0x01,0x66} }, +{ 3, 0x0053, 0, {0x02,0x01,0x66} }, +{ 3, 0x005b, 0, {0x02,0x04,0xbd} }, +{ 3, 0x0063, 0, {0x02,0x01,0x67} }, +{ 3, 0x0100, 0, {0x02,0x0c,0x5a} }, +{ 3, 0x0104, 0, {0x02,0x01,0xed} }, +{ 3, 0x0108, 0, {0x02,0x02,0x51} }, +{ 3, 0x010c, 0, {0x02,0x02,0x7c} }, +{ 3, 0x0110, 0, {0x02,0x02,0xe4} }, +{ 1, 0x0114, 0, {0x32} }, +{ 1, 0x0118, 0, {0x32} }, +{ 3, 0x011c, 0, {0x02,0x05,0xfd} }, +{ 3, 0x0120, 0, {0x02,0x00,0x00} }, +{ 3, 0x0124, 0, {0x02,0x00,0x00} }, +{ 3, 0x0128, 0, {0x02,0x04,0x3c} }, +{ 3, 0x012c, 0, {0x02,0x04,0x6a} }, +{ 3, 0x0130, 0, {0x02,0x00,0x00} }, +{ 3, 0x0134, 0, {0x02,0x00,0x00} }, +{ 3, 0x0138, 0, {0x02,0x00,0x00} }, +{ 3, 0x013c, 0, {0x02,0x00,0x00} }, +{ 3, 0x0140, 0, {0x02,0x00,0x00} }, +{ 3, 0x0144, 0, {0x02,0x00,0x00} }, +{ 3, 0x0148, 0, {0x02,0x00,0x00} }, +{ 3, 0x014c, 0, {0x02,0x00,0x00} }, +{ 3, 0x0150, 0, {0x02,0x00,0x00} }, +{ 3, 0x0154, 0, {0x02,0x00,0x00} }, +{ 10, 0x0157, 0, {0x75,0x81,0x7f,0xe5,0x82,0x60,0x03,0x02,0x01,0x61} }, +{ 5, 0x0161, 0, {0x12,0x07,0x6f,0x21,0x64} }, +{ 1, 0x0166, 0, {0x32} }, +{ 14, 0x0167, 0, {0xc0,0xd0,0xc0,0x86,0xc0,0x82,0xc0,0x83,0xc0,0xe0,0x90,0x7f,0x97,0xe0} }, +{ 14, 0x0175, 0, {0x44,0x80,0xf0,0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} }, +{ 14, 0x0183, 0, {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} }, +{ 14, 0x0191, 0, {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x90,0x7f,0x97,0xe0} }, +{ 3, 0x019f, 0, {0x55,0x7f,0xf0} }, +{ 14, 0x01a2, 0, {0x90,0x7f,0x9a,0xe0,0x30,0xe4,0x23,0x90,0x7f,0x68,0xf0,0xf0,0xf0,0xf0} }, +{ 14, 0x01b0, 0, {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} }, +{ 14, 0x01be, 0, {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} }, +{ 14, 0x01cc, 0, {0xe5,0xd8,0xc2,0xe3,0xf5,0xd8,0xd0,0xe0,0xd0,0x83,0xd0,0x82,0xd0,0x86} }, +{ 3, 0x01da, 0, {0xd0,0xd0,0x32} }, +{ 8, 0x01dd, 0, {0x75,0x86,0x00,0x90,0xff,0xc3,0x7c,0x05} }, +{ 7, 0x01e5, 0, {0xa3,0xe5,0x82,0x45,0x83,0x70,0xf9} }, +{ 1, 0x01ec, 0, {0x22} }, +{ 14, 0x01ed, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0xd0} }, +{ 14, 0x01fb, 0, {0x75,0xd0,0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91} }, +{ 13, 0x0209, 0, {0x90,0x88,0x00,0xe0,0xf5,0x41,0x90,0x7f,0xab,0x74,0x02,0xf0,0x90} }, +{ 9, 0x0216, 0, {0x7f,0xab,0x74,0x02,0xf0,0xe5,0x32,0x60,0x21} }, +{ 4, 0x021f, 0, {0x7a,0x00,0x7b,0x00} }, +{ 11, 0x0223, 0, {0xc3,0xea,0x94,0x18,0xeb,0x64,0x80,0x94,0x80,0x50,0x12} }, +{ 14, 0x022e, 0, {0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x0a,0xba,0x00} }, +{ 2, 0x023c, 0, {0x01,0x0b} }, +{ 2, 0x023e, 0, {0x80,0xe3} }, +{ 2, 0x0240, 0, {0xd0,0x86} }, +{ 14, 0x0242, 0, {0xd0,0xd0,0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0} }, +{ 1, 0x0250, 0, {0x32} }, +{ 14, 0x0251, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 14, 0x025f, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74} }, +{ 4, 0x026d, 0, {0x04,0xf0,0xd0,0x86} }, +{ 11, 0x0271, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x027c, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} }, +{ 14, 0x028a, 0, {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} }, +{ 13, 0x0298, 0, {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90} }, +{ 12, 0x02a5, 0, {0x7f,0xab,0x74,0x08,0xf0,0x75,0x6e,0x00,0x75,0x6f,0x02,0x12} }, +{ 6, 0x02b1, 0, {0x11,0x44,0x75,0x70,0x39,0x75} }, +{ 6, 0x02b7, 0, {0x71,0x0c,0x75,0x72,0x02,0x12} }, +{ 12, 0x02bd, 0, {0x11,0x75,0x90,0x7f,0xd6,0xe4,0xf0,0x75,0xd8,0x20,0xd0,0x86} }, +{ 14, 0x02c9, 0, {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} }, +{ 13, 0x02d7, 0, {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x02e4, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 14, 0x02f2, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74} }, +{ 4, 0x0300, 0, {0x10,0xf0,0xd0,0x86} }, +{ 11, 0x0304, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x030f, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} }, +{ 14, 0x031d, 0, {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} }, +{ 12, 0x032b, 0, {0x00,0xc0,0x86,0x75,0x86,0x00,0x75,0x6e,0x00,0x75,0x6f,0x02} }, +{ 7, 0x0337, 0, {0x12,0x11,0x44,0x75,0x70,0x40,0x75} }, +{ 6, 0x033e, 0, {0x71,0x0c,0x75,0x72,0x02,0x12} }, +{ 14, 0x0344, 0, {0x11,0x75,0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0} }, +{ 5, 0x0352, 0, {0x75,0xd8,0x10,0xd0,0x86} }, +{ 14, 0x0357, 0, {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} }, +{ 13, 0x0365, 0, {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 13, 0x0372, 0, {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12} }, +{ 12, 0x037f, 0, {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x42,0xf0,0x12,0x10,0x1b,0x90} }, +{ 13, 0x038b, 0, {0x7f,0xa6,0xe5,0x43,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40} }, +{ 1, 0x0398, 0, {0xf0} }, +{ 1, 0x0399, 0, {0x22} }, +{ 13, 0x039a, 0, {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12} }, +{ 12, 0x03a7, 0, {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x44,0xf0,0x12,0x10,0x1b,0x90} }, +{ 12, 0x03b3, 0, {0x7f,0xa6,0xe5,0x45,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0xe5} }, +{ 11, 0x03bf, 0, {0x46,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40,0xf0} }, +{ 1, 0x03ca, 0, {0x22} }, +{ 10, 0x03cb, 0, {0x75,0x44,0x02,0x75,0x45,0x00,0x75,0x46,0x00,0x12} }, +{ 9, 0x03d5, 0, {0x03,0x9a,0x75,0x42,0x03,0x75,0x43,0x00,0x12} }, +{ 2, 0x03de, 0, {0x03,0x72} }, +{ 1, 0x03e0, 0, {0x22} }, +{ 12, 0x03e1, 0, {0x90,0x88,0x00,0xe5,0x36,0xf0,0x90,0x88,0x00,0x74,0x10,0x25} }, +{ 9, 0x03ed, 0, {0x36,0xf0,0x12,0x01,0xdd,0x75,0x42,0x01,0x75} }, +{ 9, 0x03f6, 0, {0x43,0x18,0x12,0x03,0x72,0x75,0x44,0x02,0x75} }, +{ 9, 0x03ff, 0,{0x45,0x00,0x75,0x46,0x00,0x12,0x03,0x9a,0x75} }, +{ 8, 0x0408, 0,{0x42,0x03,0x75,0x43,0x44,0x12,0x03,0x72} }, +{ 1, 0x0410, 0,{0x22} }, +{ 14, 0x0411, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 14, 0x041f, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74} }, +{ 4, 0x042d, 0, {0x02,0xf0,0xd0,0x86} }, +{ 11, 0x0431, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x043c, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 14, 0x044a, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xa9,0x74} }, +{ 7, 0x0458, 0, {0x04,0xf0,0x75,0x30,0x01,0xd0,0x86} }, +{ 11, 0x045f, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x046a, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 14, 0x0478, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74} }, +{ 7, 0x0486, 0, {0x04,0xf0,0x75,0x31,0x01,0xd0,0x86} }, +{ 11, 0x048d, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x0498, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 12, 0x04a6, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe5,0xf5,0x91,0xd0,0x86} }, +{ 11, 0x04b2, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x04bd, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} }, +{ 12, 0x04cb, 0, {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe7,0xf5,0x91,0xd0,0x86} }, +{ 11, 0x04d7, 0, {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 12, 0x04e2, 0, {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x20,0x90,0x7f,0x96,0xe4,0xf0} }, +{ 1, 0x04ee, 0, {0x22} }, +{ 7, 0x04ef, 0, {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x21} }, +{ 1, 0x04f6, 0, {0x22} }, +{ 14, 0x04f7, 0, {0x90,0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xe0,0xfb,0x74,0x80,0x2a,0xfa} }, +{ 14, 0x0505, 0, {0x74,0x80,0x2b,0xfb,0xea,0x03,0x03,0x54,0x3f,0xfc,0xea,0xc4,0x23,0x54} }, +{ 14, 0x0513, 0, {0x1f,0xfa,0x2c,0xfa,0xeb,0x03,0x03,0x54,0x3f,0xfc,0xeb,0xc4,0x23,0x54} }, +{ 11, 0x0521, 0, {0x1f,0xfb,0x2c,0xfb,0x90,0x17,0x0a,0xe0,0xfc,0x60,0x02} }, +{ 2, 0x052c, 0, {0x7a,0x00} }, +{ 7, 0x052e, 0, {0x90,0x17,0x0c,0xe0,0xfc,0x60,0x02} }, +{ 2, 0x0535, 0, {0x7b,0x00} }, +{ 11, 0x0537, 0, {0xea,0x2b,0xfc,0xc3,0x13,0xf5,0x3a,0x75,0x44,0x02,0x8b} }, +{ 7, 0x0542, 0, {0x45,0x8a,0x46,0x12,0x03,0x9a,0x75} }, +{ 9, 0x0549, 0, {0x6e,0x08,0x75,0x6f,0x00,0x12,0x11,0x44,0x75} }, +{ 4, 0x0552, 0, {0x70,0x47,0x75,0x71} }, +{ 8, 0x0556, 0, {0x0c,0x75,0x72,0x02,0x12,0x11,0x75,0x85} }, +{ 5, 0x055e, 0, {0x3a,0x73,0x12,0x11,0xa0} }, +{ 1, 0x0563, 0, {0x22} }, +{ 14, 0x0564, 0, {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90} }, +{ 14, 0x0572, 0, {0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xef,0xe0,0xfc} }, +{ 14, 0x0580, 0, {0x33,0x95,0xe0,0xfd,0x8c,0x05,0x7c,0x00,0x90,0x7f,0xee,0xe0,0xfe,0x33} }, +{ 14, 0x058e, 0, {0x95,0xe0,0xff,0xec,0x2e,0xfc,0xed,0x3f,0xfd,0x90,0x7f,0xe9,0xe0,0xfe} }, +{ 5, 0x059c, 0, {0xbe,0x01,0x02,0x80,0x03} }, +{ 3, 0x05a1, 0, {0x02,0x05,0xf9} }, +{ 6, 0x05a4, 0, {0xbc,0x01,0x21,0xbd,0x00,0x1e} }, +{ 14, 0x05aa, 0, {0xea,0xc4,0x03,0x54,0xf8,0xfc,0xeb,0x25,0xe0,0xfd,0x2c,0x24,0x00,0xfc} }, +{ 14, 0x05b8, 0, {0xe4,0x34,0x17,0xfd,0x90,0x7e,0xc0,0xe0,0xfe,0x8c,0x82,0x8d,0x83,0xf0} }, +{ 2, 0x05c6, 0, {0x80,0x31} }, +{ 14, 0x05c8, 0, {0xea,0xc4,0x03,0x54,0xf8,0xfa,0xeb,0x25,0xe0,0xfb,0x2a,0xfa,0x24,0x00} }, +{ 14, 0x05d6, 0, {0xfb,0xe4,0x34,0x17,0xfc,0x90,0x7e,0xc0,0xe0,0xfd,0x8b,0x82,0x8c,0x83} }, +{ 14, 0x05e4, 0, {0xf0,0x74,0x01,0x2a,0x24,0x00,0xfa,0xe4,0x34,0x17,0xfb,0x90,0x7e,0xc1} }, +{ 7, 0x05f2, 0, {0xe0,0xfc,0x8a,0x82,0x8b,0x83,0xf0} }, +{ 3, 0x05f9, 0, {0x75,0x38,0x01} }, +{ 1, 0x05fc, 0, {0x22} }, +{ 14, 0x05fd, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} }, +{ 14, 0x060b, 0, {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} }, +{ 13, 0x0619, 0, {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90} }, +{ 13, 0x0626, 0, {0x7f,0xaa,0x74,0x01,0xf0,0x12,0x05,0x64,0x75,0x37,0x00,0xd0,0x86} }, +{ 14, 0x0633, 0, {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} }, +{ 13, 0x0641, 0, {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 14, 0x064e, 0, {0x90,0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xee,0xe0} }, +{ 14, 0x065c, 0, {0xfc,0x33,0x95,0xe0,0xfd,0x90,0x7f,0x96,0xe0,0xfe,0x90,0x7f,0x96,0x74} }, +{ 14, 0x066a, 0, {0x80,0x65,0x06,0xf0,0x90,0x7f,0x00,0x74,0x01,0xf0,0xea,0xc4,0x03,0x54} }, +{ 14, 0x0678, 0, {0xf8,0xfe,0xeb,0x25,0xe0,0xfb,0x2e,0xfe,0x24,0x00,0xfb,0xe4,0x34,0x17} }, +{ 14, 0x0686, 0, {0xff,0x8b,0x82,0x8f,0x83,0xe0,0xfb,0x74,0x01,0x2e,0x24,0x00,0xfe,0xe4} }, +{ 14, 0x0694, 0, {0x34,0x17,0xff,0x8e,0x82,0x8f,0x83,0xe0,0xfe,0x90,0x7f,0xe9,0xe0,0xff} }, +{ 3, 0x06a2, 0, {0xbf,0x81,0x0a} }, +{ 10, 0x06a5, 0, {0x90,0x7f,0x00,0xeb,0xf0,0x90,0x7f,0x01,0xee,0xf0} }, +{ 8, 0x06af, 0, {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x82,0x1a} }, +{ 3, 0x06b7, 0, {0xba,0x01,0x0c} }, +{ 12, 0x06ba, 0, {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b} }, +{ 11, 0x06c6, 0, {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0xb5,0xf0} }, +{ 8, 0x06d1, 0, {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x83,0x1b} }, +{ 3, 0x06d9, 0, {0xba,0x01,0x0d} }, +{ 13, 0x06dc, 0, {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b} }, +{ 11, 0x06e9, 0, {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0x12,0xf0} }, +{ 8, 0x06f4, 0, {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x84,0x1c} }, +{ 3, 0x06fc, 0, {0xba,0x01,0x0d} }, +{ 13, 0x06ff, 0, {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0c} }, +{ 12, 0x070c, 0, {0x90,0x7f,0x00,0x74,0x80,0xf0,0x90,0x7f,0x01,0x74,0x01,0xf0} }, +{ 5, 0x0718, 0, {0x90,0x7f,0xb5,0xec,0xf0} }, +{ 1, 0x071d, 0, {0x22} }, +{ 12, 0x071e, 0, {0x75,0x36,0x0d,0x90,0x88,0x00,0x74,0x1d,0xf0,0x75,0x6b,0x80} }, +{ 10, 0x072a, 0, {0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75} }, +{ 9, 0x0734, 0, {0x6c,0x0f,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75} }, +{ 9, 0x073d, 0, {0x6c,0x06,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75} }, +{ 7, 0x0746, 0, {0x6c,0x01,0x12,0x10,0xe2,0x7a,0x00} }, +{ 3, 0x074d, 0, {0xba,0xff,0x00} }, +{ 2, 0x0750, 0, {0x50,0x0a} }, +{ 10, 0x0752, 0, {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1} }, +{ 10, 0x075c, 0, {0x75,0x6b,0x80,0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75} }, +{ 8, 0x0766, 0, {0x6b,0x80,0x75,0x6c,0x0f,0x12,0x10,0xe2} }, +{ 1, 0x076e, 0, {0x22} }, +{ 14, 0x076f, 0, {0x90,0x7f,0xa1,0xe4,0xf0,0x90,0x7f,0xaf,0x74,0x01,0xf0,0x90,0x7f,0x92} }, +{ 14, 0x077d, 0, {0x74,0x02,0xf0,0x75,0x8e,0x31,0x75,0x89,0x21,0x75,0x88,0x00,0x75,0xc8} }, +{ 14, 0x078b, 0, {0x00,0x75,0x8d,0x40,0x75,0x98,0x40,0x75,0xc0,0x40,0x75,0x87,0x00,0x75} }, +{ 9, 0x0799, 0, {0x20,0x00,0x75,0x21,0x00,0x75,0x22,0x00,0x75} }, +{ 5, 0x07a2, 0, {0x23,0x00,0x75,0x47,0x00} }, +{ 7, 0x07a7, 0, {0xc3,0xe5,0x47,0x94,0x20,0x50,0x11} }, +{ 13, 0x07ae, 0, {0xe5,0x47,0x24,0x00,0xf5,0x82,0xe4,0x34,0x17,0xf5,0x83,0xe4,0xf0} }, +{ 4, 0x07bb, 0, {0x05,0x47,0x80,0xe8} }, +{ 9, 0x07bf, 0, {0xe4,0xf5,0x40,0xf5,0x3f,0xe4,0xf5,0x3c,0xf5} }, +{ 7, 0x07c8, 0, {0x3b,0xe4,0xf5,0x3e,0xf5,0x3d,0x75} }, +{ 11, 0x07cf, 0, {0x32,0x00,0x75,0x37,0x00,0x75,0x39,0x00,0x90,0x7f,0x93} }, +{ 14, 0x07da, 0, {0x74,0x3c,0xf0,0x90,0x7f,0x9c,0x74,0xff,0xf0,0x90,0x7f,0x96,0x74,0x80} }, +{ 14, 0x07e8, 0, {0xf0,0x90,0x7f,0x94,0x74,0x70,0xf0,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90} }, +{ 14, 0x07f6, 0, {0x7f,0x97,0xe4,0xf0,0x90,0x7f,0x95,0x74,0xc2,0xf0,0x90,0x7f,0x98,0x74} }, +{ 14, 0x0804, 0, {0x28,0xf0,0x90,0x7f,0x9e,0x74,0x28,0xf0,0x90,0x7f,0xf0,0xe4,0xf0,0x90} }, +{ 14, 0x0812, 0, {0x7f,0xf1,0xe4,0xf0,0x90,0x7f,0xf2,0xe4,0xf0,0x90,0x7f,0xf3,0xe4,0xf0} }, +{ 14, 0x0820, 0, {0x90,0x7f,0xf4,0xe4,0xf0,0x90,0x7f,0xf5,0xe4,0xf0,0x90,0x7f,0xf6,0xe4} }, +{ 14, 0x082e, 0, {0xf0,0x90,0x7f,0xf7,0xe4,0xf0,0x90,0x7f,0xf8,0xe4,0xf0,0x90,0x7f,0xf9} }, +{ 14, 0x083c, 0, {0x74,0x38,0xf0,0x90,0x7f,0xfa,0x74,0xa0,0xf0,0x90,0x7f,0xfb,0x74,0xa0} }, +{ 14, 0x084a, 0, {0xf0,0x90,0x7f,0xfc,0x74,0xa0,0xf0,0x90,0x7f,0xfd,0x74,0xa0,0xf0,0x90} }, +{ 14, 0x0858, 0, {0x7f,0xfe,0x74,0xa0,0xf0,0x90,0x7f,0xff,0x74,0xa0,0xf0,0x90,0x7f,0xe0} }, +{ 14, 0x0866, 0, {0x74,0x03,0xf0,0x90,0x7f,0xe1,0x74,0x01,0xf0,0x90,0x7f,0xdd,0x74,0x80} }, +{ 11, 0x0874, 0, {0xf0,0x12,0x12,0x43,0x12,0x07,0x1e,0x7a,0x00,0x7b,0x00} }, +{ 9, 0x087f, 0, {0xc3,0xea,0x94,0x1e,0xeb,0x94,0x00,0x50,0x17} }, +{ 12, 0x0888, 0, {0x90,0x88,0x00,0xe0,0xf5,0x47,0x90,0x88,0x0b,0xe0,0xf5,0x47} }, +{ 9, 0x0894, 0, {0x90,0x7f,0x68,0xf0,0x0a,0xba,0x00,0x01,0x0b} }, +{ 2, 0x089d, 0, {0x80,0xe0} }, +{ 12, 0x089f, 0, {0x12,0x03,0xe1,0x90,0x7f,0xd6,0xe4,0xf0,0x7a,0x00,0x7b,0x00} }, +{ 13, 0x08ab, 0, {0x8a,0x04,0x8b,0x05,0xc3,0xea,0x94,0xe0,0xeb,0x94,0x2e,0x50,0x1a} }, +{ 14, 0x08b8, 0, {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0} }, +{ 10, 0x08c6, 0, {0x04,0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b} }, +{ 2, 0x08d0, 0, {0x80,0xd9} }, +{ 13, 0x08d2, 0, {0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0,0x90} }, +{ 14, 0x08df, 0, {0x7f,0xde,0x74,0x05,0xf0,0x90,0x7f,0xdf,0x74,0x05,0xf0,0x90,0x7f,0xac} }, +{ 14, 0x08ed, 0, {0xe4,0xf0,0x90,0x7f,0xad,0x74,0x05,0xf0,0x75,0xa8,0x80,0x75,0xf8,0x10} }, +{ 13, 0x08fb, 0, {0x90,0x7f,0xae,0x74,0x0b,0xf0,0x90,0x7f,0xe2,0x74,0x88,0xf0,0x90} }, +{ 12, 0x0908, 0, {0x7f,0xab,0x74,0x08,0xf0,0x75,0xe8,0x11,0x75,0x32,0x01,0x75} }, +{ 12, 0x0914, 0, {0x31,0x00,0x75,0x30,0x00,0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7} }, +{ 10, 0x0920, 0, {0xd0,0x05,0xd0,0x04,0x75,0x34,0x00,0x75,0x35,0x01} }, +{ 13, 0x092a, 0, {0x90,0x7f,0xae,0x74,0x03,0xf0,0x8c,0x02,0xba,0x00,0x02,0x80,0x03} }, +{ 3, 0x0937, 0, {0x02,0x0a,0x3f} }, +{ 12, 0x093a, 0, {0x85,0x33,0x34,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90,0x7f,0x97} }, +{ 14, 0x0946, 0, {0x74,0x08,0xf0,0x90,0x7f,0x9d,0x74,0x88,0xf0,0x90,0x7f,0x9a,0xe0,0xfa} }, +{ 12, 0x0954, 0, {0x74,0x05,0x5a,0xf5,0x33,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90} }, +{ 13, 0x0960, 0, {0x7f,0x97,0x74,0x02,0xf0,0x90,0x7f,0x9d,0x74,0x82,0xf0,0xe5,0x33} }, +{ 13, 0x096d, 0, {0x25,0xe0,0xfa,0x90,0x7f,0x9a,0xe0,0x54,0x05,0xfb,0x4a,0xf5,0x33} }, +{ 2, 0x097a, 0, {0x60,0x0c} }, +{ 12, 0x097c, 0, {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x4a,0xf0} }, +{ 11, 0x0988, 0, {0x75,0x6e,0x00,0x75,0x6f,0x00,0xc0,0x04,0xc0,0x05,0x12} }, +{ 14, 0x0993, 0, {0x11,0x44,0xd0,0x05,0xd0,0x04,0x90,0x17,0x13,0xe0,0xfa,0x74,0x80,0x2a} }, +{ 6, 0x09a1, 0, {0xfa,0xe5,0x33,0xb4,0x04,0x29} }, +{ 3, 0x09a7, 0, {0xba,0xa0,0x00} }, +{ 2, 0x09aa, 0, {0x50,0x24} }, +{ 13, 0x09ac, 0, {0x90,0x17,0x13,0xe0,0x04,0xfb,0x0b,0x90,0x17,0x13,0xeb,0xf0,0x90} }, +{ 14, 0x09b9, 0, {0x17,0x13,0xe0,0xfb,0x90,0x17,0x15,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05} }, +{ 9, 0x09c7, 0, {0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02} }, +{ 5, 0x09d0, 0, {0xe5,0x33,0xb4,0x02,0x26} }, +{ 6, 0x09d5, 0, {0xc3,0x74,0x04,0x9a,0x50,0x20} }, +{ 13, 0x09db, 0, {0x90,0x17,0x13,0xe0,0xfa,0x1a,0x1a,0x90,0x17,0x13,0xea,0xf0,0x90} }, +{ 13, 0x09e8, 0, {0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xf0,0xc0,0x04,0xc0,0x05,0x12} }, +{ 6, 0x09f5, 0, {0x04,0xf7,0xd0,0x05,0xd0,0x04} }, +{ 5, 0x09fb, 0, {0xe5,0x33,0xb4,0x08,0x1d} }, +{ 4, 0x0a00, 0, {0xe5,0x34,0x70,0x19} }, +{ 10, 0x0a04, 0, {0x74,0x01,0x25,0x35,0x54,0x0f,0xf5,0x35,0x85,0x35} }, +{ 12, 0x0a0e, 0, {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0} }, +{ 3, 0x0a1a, 0, {0x05,0xd0,0x04} }, +{ 5, 0x0a1d, 0, {0xe5,0x33,0xb4,0x01,0x1d} }, +{ 4, 0x0a22, 0, {0xe5,0x34,0x70,0x19} }, +{ 10, 0x0a26, 0, {0xe5,0x35,0x24,0xff,0x54,0x0f,0xf5,0x35,0x85,0x35} }, +{ 12, 0x0a30, 0, {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0} }, +{ 3, 0x0a3c, 0, {0x05,0xd0,0x04} }, +{ 14, 0x0a3f, 0, {0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0,0x04,0x90,0x7f,0x96} }, +{ 14, 0x0a4d, 0, {0xe0,0xfa,0x90,0x7f,0x96,0x74,0x7f,0x5a,0xf0,0x90,0x7f,0x97,0x74,0x08} }, +{ 10, 0x0a5b, 0, {0xf0,0xc3,0xec,0x94,0x00,0xed,0x94,0x02,0x40,0x08} }, +{ 8, 0x0a65, 0, {0x90,0x7f,0x96,0xe0,0xfa,0x20,0xe6,0x08} }, +{ 8, 0x0a6d, 0, {0xc3,0xe4,0x9c,0x74,0x08,0x9d,0x50,0x13} }, +{ 14, 0x0a75, 0, {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x40,0x65,0x02,0xf0,0x7c} }, +{ 5, 0x0a83, 0, {0x00,0x7d,0x00,0x80,0x05} }, +{ 5, 0x0a88, 0, {0x0c,0xbc,0x00,0x01,0x0d} }, +{ 5, 0x0a8d, 0, {0xe5,0x38,0xb4,0x01,0x0e} }, +{ 13, 0x0a92, 0, {0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0x75,0x38} }, +{ 1, 0x0a9f, 0, {0x00} }, +{ 7, 0x0aa0, 0, {0xe5,0x31,0x70,0x03,0x02,0x09,0x2a} }, +{ 10, 0x0aa7, 0, {0x90,0x7f,0xc9,0xe0,0xfa,0x70,0x03,0x02,0x0c,0x2d} }, +{ 14, 0x0ab1, 0, {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90} }, +{ 9, 0x0abf, 0, {0x7d,0xc0,0xe0,0xfa,0xba,0x2c,0x02,0x80,0x03} }, +{ 3, 0x0ac8, 0, {0x02,0x0b,0x36} }, +{ 5, 0x0acb, 0, {0x75,0x32,0x00,0x7b,0x00} }, +{ 3, 0x0ad0, 0, {0xbb,0x64,0x00} }, +{ 2, 0x0ad3, 0, {0x50,0x1c} }, +{ 14, 0x0ad5, 0, {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0} }, +{ 13, 0x0ae3, 0, {0x04,0xd0,0x03,0xd0,0x02,0x90,0x88,0x0f,0xe0,0xf5,0x47,0x0b,0x80} }, +{ 1, 0x0af0, 0, {0xdf} }, +{ 13, 0x0af1, 0, {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x07,0x1e,0x12,0x03,0xe1,0x12} }, +{ 12, 0x0afe, 0, {0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x75,0x6e,0x00,0x75} }, +{ 13, 0x0b0a, 0, {0x6f,0x01,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0x44,0xd0,0x05} }, +{ 9, 0x0b17, 0, {0xd0,0x04,0xd0,0x02,0x75,0x70,0x4d,0x75,0x71} }, +{ 11, 0x0b20, 0, {0x0c,0x75,0x72,0x02,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12} }, +{ 11, 0x0b2b, 0, {0x11,0x75,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x02,0x0c,0x2d} }, +{ 3, 0x0b36, 0, {0xba,0x2a,0x3b} }, +{ 13, 0x0b39, 0, {0x90,0x7f,0x98,0x74,0x20,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12} }, +{ 14, 0x0b46, 0, {0x01,0xdd,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x90,0x7f,0x98,0x74,0x28,0xf0} }, +{ 2, 0x0b54, 0, {0x7b,0x00} }, +{ 3, 0x0b56, 0, {0xbb,0x0a,0x00} }, +{ 5, 0x0b59, 0, {0x40,0x03,0x02,0x0c,0x2d} }, +{ 14, 0x0b5e, 0, {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0} }, +{ 8, 0x0b6c, 0, {0x04,0xd0,0x03,0xd0,0x02,0x0b,0x80,0xe2} }, +{ 3, 0x0b74, 0, {0xba,0x2b,0x1a} }, +{ 8, 0x0b77, 0, {0x90,0x7f,0xc9,0xe0,0xfb,0xbb,0x40,0x12} }, +{ 14, 0x0b7f, 0, {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x12,0x05,0xd0,0x05,0xd0,0x04,0xd0} }, +{ 4, 0x0b8d, 0, {0x02,0x02,0x0c,0x2d} }, +{ 3, 0x0b91, 0, {0xba,0x10,0x1f} }, +{ 14, 0x0b94, 0, {0x90,0x7f,0x96,0xe0,0xfb,0x90,0x7f,0x96,0x74,0x80,0x65,0x03,0xf0,0xc0} }, +{ 14, 0x0ba2, 0, {0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x3d,0xd0,0x05,0xd0,0x04,0xd0,0x02} }, +{ 3, 0x0bb0, 0, {0x02,0x0c,0x2d} }, +{ 3, 0x0bb3, 0, {0xba,0x11,0x12} }, +{ 14, 0x0bb6, 0, {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x6a,0xd0,0x05,0xd0,0x04,0xd0} }, +{ 4, 0x0bc4, 0, {0x02,0x02,0x0c,0x2d} }, +{ 3, 0x0bc8, 0, {0xba,0x12,0x12} }, +{ 14, 0x0bcb, 0, {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x8f,0xd0,0x05,0xd0,0x04,0xd0} }, +{ 4, 0x0bd9, 0, {0x02,0x02,0x0c,0x2d} }, +{ 3, 0x0bdd, 0, {0xba,0x13,0x0b} }, +{ 11, 0x0be0, 0, {0x90,0x7d,0xc1,0xe0,0xfb,0x90,0x88,0x00,0xf0,0x80,0x42} }, +{ 3, 0x0beb, 0, {0xba,0x14,0x11} }, +{ 14, 0x0bee, 0, {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0xdd,0xd0,0x05,0xd0,0x04,0xd0} }, +{ 3, 0x0bfc, 0, {0x02,0x80,0x2e} }, +{ 3, 0x0bff, 0, {0xba,0x15,0x1d} }, +{ 12, 0x0c02, 0, {0x90,0x7d,0xc1,0xe0,0xf5,0x75,0x90,0x7d,0xc2,0xe0,0xf5,0x76} }, +{ 14, 0x0c0e, 0, {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0,0x05,0xd0,0x04,0xd0} }, +{ 3, 0x0c1c, 0, {0x02,0x80,0x0e} }, +{ 3, 0x0c1f, 0, {0xba,0x16,0x0b} }, +{ 11, 0x0c22, 0, {0xc0,0x04,0xc0,0x05,0x12,0x13,0xa3,0xd0,0x05,0xd0,0x04} }, +{ 11, 0x0c2d, 0, {0x90,0x7f,0xc9,0xe4,0xf0,0x75,0x31,0x00,0x02,0x09,0x2a} }, +{ 1, 0x0c38, 0, {0x22} }, +{ 7, 0x0c39, 0, {0x53,0x55,0x50,0x45,0x4e,0x44,0x00} }, +{ 7, 0x0c40, 0, {0x52,0x45,0x53,0x55,0x4d,0x45,0x00} }, +{ 6, 0x0c47, 0, {0x20,0x56,0x6f,0x6c,0x20,0x00} }, +{ 13, 0x0c4d, 0, {0x44,0x41,0x42,0x55,0x53,0x42,0x20,0x76,0x31,0x2e,0x30,0x30,0x00} }, +{ 14, 0x0c5a, 0, {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} }, +{ 14, 0x0c68, 0, {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} }, +{ 13, 0x0c76, 0, {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90} }, +{ 14, 0x0c83, 0, {0x7f,0xab,0x74,0x01,0xf0,0x90,0x7f,0xe8,0xe0,0xfa,0x90,0x7f,0xe9,0xe0} }, +{ 6, 0x0c91, 0, {0xfb,0xbb,0x00,0x02,0x80,0x03} }, +{ 3, 0x0c97, 0, {0x02,0x0d,0x38} }, +{ 3, 0x0c9a, 0, {0xba,0x80,0x14} }, +{ 14, 0x0c9d, 0, {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5} }, +{ 6, 0x0cab, 0, {0x74,0x02,0xf0,0x02,0x0e,0xcd} }, +{ 5, 0x0cb1, 0, {0xba,0x82,0x02,0x80,0x03} }, +{ 3, 0x0cb6, 0, {0x02,0x0d,0x1d} }, +{ 8, 0x0cb9, 0, {0x90,0x7f,0xec,0xe0,0xfc,0xbc,0x01,0x00} }, +{ 2, 0x0cc1, 0, {0x40,0x21} }, +{ 6, 0x0cc3, 0, {0xc3,0x74,0x07,0x9c,0x40,0x1b} }, +{ 14, 0x0cc9, 0, {0xec,0x24,0xff,0x25,0xe0,0xfd,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x7f,0xf5} }, +{ 13, 0x0cd7, 0, {0x83,0xe0,0xfd,0x53,0x05,0x01,0x90,0x7f,0x00,0xed,0xf0,0x80,0x2b} }, +{ 3, 0x0ce4, 0, {0xbc,0x81,0x00} }, +{ 2, 0x0ce7, 0, {0x40,0x21} }, +{ 6, 0x0ce9, 0, {0xc3,0x74,0x87,0x9c,0x40,0x1b} }, +{ 14, 0x0cef, 0, {0xec,0x24,0x7f,0x25,0xe0,0xfc,0x24,0xb6,0xf5,0x82,0xe4,0x34,0x7f,0xf5} }, +{ 13, 0x0cfd, 0, {0x83,0xe0,0xfc,0x53,0x04,0x01,0x90,0x7f,0x00,0xec,0xf0,0x80,0x05} }, +{ 5, 0x0d0a, 0, {0x90,0x7f,0x00,0xe4,0xf0} }, +{ 14, 0x0d0f, 0, {0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x02,0x0e,0xcd} }, +{ 5, 0x0d1d, 0, {0xba,0x81,0x02,0x80,0x03} }, +{ 3, 0x0d22, 0, {0x02,0x0e,0xc5} }, +{ 14, 0x0d25, 0, {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74} }, +{ 5, 0x0d33, 0, {0x02,0xf0,0x02,0x0e,0xcd} }, +{ 3, 0x0d38, 0, {0xbb,0x01,0x2d} }, +{ 6, 0x0d3b, 0, {0xba,0x00,0x03,0x02,0x0e,0xcd} }, +{ 3, 0x0d41, 0, {0xba,0x02,0x11} }, +{ 13, 0x0d44, 0, {0x75,0x59,0x00,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0} }, +{ 4, 0x0d51, 0, {0x02,0x02,0x0e,0xcd} }, +{ 5, 0x0d55, 0, {0xba,0x21,0x02,0x80,0x03} }, +{ 3, 0x0d5a, 0, {0x02,0x0e,0xcd} }, +{ 11, 0x0d5d, 0, {0x75,0x37,0x01,0x90,0x7f,0xc5,0xe4,0xf0,0x02,0x0e,0xcd} }, +{ 3, 0x0d68, 0, {0xbb,0x03,0x1f} }, +{ 6, 0x0d6b, 0, {0xba,0x00,0x03,0x02,0x0e,0xcd} }, +{ 5, 0x0d71, 0, {0xba,0x02,0x02,0x80,0x03} }, +{ 3, 0x0d76, 0, {0x02,0x0e,0xcd} }, +{ 13, 0x0d79, 0, {0x75,0x59,0x01,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0} }, +{ 4, 0x0d86, 0, {0x02,0x02,0x0e,0xcd} }, +{ 3, 0x0d8a, 0, {0xbb,0x06,0x54} }, +{ 5, 0x0d8d, 0, {0xba,0x80,0x02,0x80,0x03} }, +{ 3, 0x0d92, 0, {0x02,0x0e,0xc5} }, +{ 8, 0x0d95, 0, {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x01,0x15} }, +{ 12, 0x0d9d, 0, {0x7c,0xfb,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee} }, +{ 9, 0x0da9, 0, {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd} }, +{ 10, 0x0db2, 0, {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x02,0x02,0x80,0x03} }, +{ 3, 0x0dbc, 0, {0x02,0x0e,0xc5} }, +{ 10, 0x0dbf, 0, {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x02,0x80,0x03} }, +{ 3, 0x0dc9, 0, {0x02,0x0e,0xc5} }, +{ 12, 0x0dcc, 0, {0x7c,0x3b,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee} }, +{ 9, 0x0dd8, 0, {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd} }, +{ 6, 0x0de1, 0, {0xbb,0x07,0x03,0x02,0x0e,0xc5} }, +{ 3, 0x0de7, 0, {0xbb,0x08,0x10} }, +{ 13, 0x0dea, 0, {0xac,0x48,0x90,0x7f,0x00,0xec,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0} }, +{ 3, 0x0df7, 0, {0x02,0x0e,0xcd} }, +{ 3, 0x0dfa, 0, {0xbb,0x09,0x31} }, +{ 5, 0x0dfd, 0, {0xba,0x00,0x02,0x80,0x03} }, +{ 3, 0x0e02, 0, {0x02,0x0e,0xc5} }, +{ 14, 0x0e05, 0, {0x90,0x7f,0xea,0xe0,0xfc,0xc3,0x74,0x01,0x9c,0x50,0x03,0x02,0x0e,0xc5} }, +{ 8, 0x0e13, 0, {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x0a} }, +{ 10, 0x0e1b, 0, {0x90,0x17,0x21,0xe4,0xf0,0x90,0x17,0x22,0xe4,0xf0} }, +{ 9, 0x0e25, 0, {0x90,0x7f,0xea,0xe0,0xf5,0x48,0x02,0x0e,0xcd} }, +{ 3, 0x0e2e, 0, {0xbb,0x0a,0x27} }, +{ 5, 0x0e31, 0, {0xba,0x81,0x02,0x80,0x03} }, +{ 3, 0x0e36, 0, {0x02,0x0e,0xc5} }, +{ 14, 0x0e39, 0, {0x90,0x7f,0xec,0xe0,0xfa,0x24,0x20,0xfa,0xe4,0x34,0x17,0xfc,0x8a,0x82} }, +{ 14, 0x0e47, 0, {0x8c,0x83,0xe0,0xfa,0x90,0x7f,0x00,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0} }, +{ 3, 0x0e55, 0, {0x02,0x0e,0xcd} }, +{ 5, 0x0e58, 0, {0xbb,0x0b,0x02,0x80,0x03} }, +{ 3, 0x0e5d, 0, {0x02,0x0e,0xa9} }, +{ 13, 0x0e60, 0, {0x90,0x17,0x20,0xe4,0xf0,0x90,0x7f,0xec,0xe0,0xfa,0xba,0x01,0x1a} }, +{ 8, 0x0e6d, 0, {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x12} }, +{ 14, 0x0e75, 0, {0x90,0x7f,0xea,0xe0,0xfa,0x90,0x17,0x21,0xf0,0xc0,0x03,0x12,0x04,0xe2} }, +{ 4, 0x0e83, 0, {0xd0,0x03,0x80,0x46} }, +{ 8, 0x0e87, 0, {0x90,0x7f,0xec,0xe0,0xfa,0xba,0x02,0x3e} }, +{ 8, 0x0e8f, 0, {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x36} }, +{ 13, 0x0e97, 0, {0xc0,0x03,0x12,0x04,0xef,0xd0,0x03,0x90,0x7f,0xea,0xe0,0xfa,0x90} }, +{ 5, 0x0ea4, 0, {0x17,0x22,0xf0,0x80,0x24} }, +{ 5, 0x0ea9, 0, {0xbb,0x12,0x02,0x80,0x17} }, +{ 5, 0x0eae, 0, {0xbb,0x81,0x02,0x80,0x0d} }, +{ 5, 0x0eb3, 0, {0xbb,0x83,0x02,0x80,0x08} }, +{ 5, 0x0eb8, 0, {0xbb,0x82,0x02,0x80,0x03} }, +{ 3, 0x0ebd, 0, {0xbb,0x84,0x05} }, +{ 5, 0x0ec0, 0, {0x12,0x06,0x4e,0x80,0x08} }, +{ 8, 0x0ec5, 0, {0x90,0x7f,0xb4,0x74,0x03,0xf0,0x80,0x06} }, +{ 6, 0x0ecd, 0, {0x90,0x7f,0xb4,0x74,0x02,0xf0} }, +{ 2, 0x0ed3, 0, {0xd0,0x86} }, +{ 14, 0x0ed5, 0, {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} }, +{ 13, 0x0ee3, 0, {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} }, +{ 11, 0x0ef0, 0, {0x90,0x7f,0xec,0xe0,0xf5,0x5a,0xc3,0x94,0x01,0x40,0x1d} }, +{ 7, 0x0efb, 0, {0xc3,0x74,0x07,0x95,0x5a,0x40,0x16} }, +{ 13, 0x0f02, 0, {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xc6,0xf5,0x82,0xe4,0x34} }, +{ 9, 0x0f0f, 0, {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0,0x80,0x22} }, +{ 7, 0x0f18, 0, {0xc3,0xe5,0x5a,0x94,0x81,0x40,0x1b} }, +{ 7, 0x0f1f, 0, {0xc3,0x74,0x87,0x95,0x5a,0x40,0x14} }, +{ 13, 0x0f26, 0, {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xb6,0xf5,0x82,0xe4,0x34} }, +{ 7, 0x0f33, 0, {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0} }, +{ 1, 0x0f3a, 0, {0x22} }, +{ 14, 0x0f3b, 0, {0x09,0x02,0xba,0x00,0x03,0x01,0x00,0x40,0x00,0x09,0x04,0x00,0x00,0x00} }, +{ 14, 0x0f49, 0, {0x01,0x01,0x00,0x00,0x09,0x24,0x01,0x00,0x01,0x3d,0x00,0x01,0x01,0x0c} }, +{ 14, 0x0f57, 0, {0x24,0x02,0x01,0x10,0x07,0x00,0x02,0x03,0x00,0x00,0x00,0x0d,0x24,0x06} }, +{ 14, 0x0f65, 0, {0x03,0x01,0x02,0x15,0x00,0x03,0x00,0x03,0x00,0x00,0x09,0x24,0x03,0x02} }, +{ 14, 0x0f73, 0, {0x01,0x01,0x00,0x01,0x00,0x09,0x24,0x03,0x04,0x02,0x03,0x00,0x03,0x00} }, +{ 14, 0x0f81, 0, {0x09,0x24,0x03,0x05,0x03,0x06,0x00,0x01,0x00,0x09,0x04,0x01,0x00,0x00} }, +{ 14, 0x0f8f, 0, {0x01,0x02,0x00,0x00,0x09,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00,0x07} }, +{ 14, 0x0f9d, 0, {0x24,0x01,0x02,0x01,0x01,0x00,0x0b,0x24,0x02,0x01,0x02,0x02,0x10,0x01} }, +{ 14, 0x0fab, 0, {0x80,0xbb,0x00,0x09,0x05,0x88,0x05,0x00,0x01,0x01,0x00,0x00,0x07,0x25} }, +{ 14, 0x0fb9, 0, {0x01,0x00,0x00,0x00,0x00,0x09,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00} }, +{ 14, 0x0fc7, 0, {0x07,0x05,0x82,0x02,0x40,0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00} }, +{ 14, 0x0fd5, 0, {0x09,0x04,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x07,0x05,0x82,0x02,0x40} }, +{ 14, 0x0fe3, 0, {0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00,0x09,0x05,0x89,0x05,0xa0} }, +{ 10, 0x0ff1, 0, {0x01,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00} }, +{ 14, 0x0ffb, 0, {0x12,0x01,0x00,0x01,0x00,0x00,0x00,0x40,0x47,0x05,0x99,0x99,0x00,0x01} }, +{ 14, 0x1009, 0, {0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0xba} }, +{ 4, 0x1017, 0, {0x00,0x03,0x01,0x00} }, +{ 2, 0x101b, 0, {0x7a,0x00} }, +{ 3, 0x101d, 0, {0xba,0x05,0x00} }, +{ 2, 0x1020, 0, {0x50,0x17} }, +{ 8, 0x1022, 0, {0x90,0x7f,0xa5,0xe0,0xfb,0x30,0xe0,0x05} }, +{ 5, 0x102a, 0, {0x90,0x00,0x01,0x80,0x0d} }, +{ 10, 0x102f, 0, {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xe4} }, +{ 3, 0x1039, 0, {0x90,0x00,0x01} }, +{ 1, 0x103c, 0, {0x22} }, +{ 14, 0x103d, 0, {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0x00,0x7d} }, +{ 4, 0x104b, 0, {0x7e,0xeb,0x60,0x12} }, +{ 14, 0x104f, 0, {0x89,0x82,0x8a,0x83,0xe0,0xa3,0xa9,0x82,0xaa,0x83,0x8c,0x82,0x8d,0x83} }, +{ 4, 0x105d, 0, {0xf0,0x0c,0xdb,0xee} }, +{ 8, 0x1061, 0, {0x90,0x7d,0xc3,0xe0,0x90,0x7f,0xb9,0xf0} }, +{ 1, 0x1069, 0, {0x22} }, +{ 14, 0x106a, 0, {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0xc4,0x7d} }, +{ 4, 0x1078, 0, {0x7d,0xeb,0x60,0xe5} }, +{ 14, 0x107c, 0, {0x8c,0x82,0x8d,0x83,0xe0,0x0c,0x89,0x82,0x8a,0x83,0xf0,0xa3,0xa9,0x82} }, +{ 4, 0x108a, 0, {0xaa,0x83,0xdb,0xee} }, +{ 1, 0x108e, 0, {0x22} }, +{ 14, 0x108f, 0, {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x05,0x86,0x90,0x7d,0xc1,0xe0,0x05,0x86} }, +{ 14, 0x109d, 0, {0xa3,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0x05,0x86,0xa3,0xa3,0xe0,0xf9} }, +{ 5, 0x10ab, 0, {0x60,0x16,0xa3,0x05,0x86} }, +{ 13, 0x10b0, 0, {0x90,0x7f,0xa6,0x05,0x86,0xe0,0xa3,0x05,0x86,0xf0,0xc0,0x01,0x12} }, +{ 6, 0x10bd, 0, {0x10,0x1b,0xd0,0x01,0xd9,0xed} }, +{ 6, 0x10c3, 0, {0x90,0x7f,0xa5,0x74,0x40,0xf0} }, +{ 1, 0x10c9, 0, {0x22} }, +{ 8, 0x10ca, 0, {0x90,0x88,0x02,0x74,0x01,0xf0,0x7a,0x00} }, +{ 3, 0x10d2, 0, {0xba,0xff,0x00} }, +{ 2, 0x10d5, 0, {0x50,0x0a} }, +{ 10, 0x10d7, 0, {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1} }, +{ 1, 0x10e1, 0, {0x22} }, +{ 5, 0x10e2, 0, {0xe5,0x6b,0xb4,0xc0,0x08} }, +{ 8, 0x10e7, 0, {0x90,0x88,0x03,0xe5,0x6c,0xf0,0x80,0x06} }, +{ 6, 0x10ef, 0, {0x90,0x88,0x02,0xe5,0x6c,0xf0} }, +{ 4, 0x10f5, 0, {0x7a,0x00,0x7b,0x00} }, +{ 11, 0x10f9, 0, {0xc3,0xea,0x94,0x32,0xeb,0x64,0x80,0x94,0x80,0x50,0x07} }, +{ 5, 0x1104, 0, {0x0a,0xba,0x00,0x01,0x0b} }, +{ 2, 0x1109, 0, {0x80,0xee} }, +{ 1, 0x110b, 0, {0x22} }, +{ 10, 0x110c, 0, {0x90,0x88,0x03,0xe5,0x6d,0xf0,0x05,0x39,0x7a,0x00} }, +{ 3, 0x1116, 0, {0xba,0x28,0x00} }, +{ 2, 0x1119, 0, {0x50,0x03} }, +{ 3, 0x111b, 0, {0x0a,0x80,0xf8} }, +{ 5, 0x111e, 0, {0xe5,0x39,0xb4,0x10,0x08} }, +{ 8, 0x1123, 0, {0x90,0x88,0x02,0x74,0xc0,0xf0,0x80,0x0e} }, +{ 5, 0x112b, 0, {0xe5,0x39,0xb4,0x20,0x09} }, +{ 9, 0x1130, 0, {0x90,0x88,0x02,0x74,0x80,0xf0,0x75,0x39,0x00} }, +{ 2, 0x1139, 0, {0x7a,0x00} }, +{ 3, 0x113b, 0, {0xba,0x28,0x00} }, +{ 2, 0x113e, 0, {0x50,0x03} }, +{ 3, 0x1140, 0, {0x0a,0x80,0xf8} }, +{ 1, 0x1143, 0, {0x22} }, +{ 4, 0x1144, 0, {0xe5,0x6f,0x60,0x02} }, +{ 2, 0x1148, 0, {0x80,0x07} }, +{ 7, 0x114a, 0, {0x7a,0x00,0x75,0x39,0x00,0x80,0x05} }, +{ 5, 0x1151, 0, {0x7a,0x40,0x75,0x39,0x10} }, +{ 9, 0x1156, 0, {0xe5,0x6e,0x2a,0xfa,0xe5,0x6e,0x25,0x39,0xf5} }, +{ 10, 0x115f, 0, {0x39,0x90,0x88,0x02,0x74,0x80,0x2a,0xf0,0x7a,0x00} }, +{ 8, 0x1169, 0, {0xc3,0xea,0x64,0x80,0x94,0xa8,0x50,0x03} }, +{ 3, 0x1171, 0, {0x0a,0x80,0xf5} }, +{ 1, 0x1174, 0, {0x22} }, +{ 6, 0x1175, 0, {0xaa,0x70,0xab,0x71,0xac,0x72} }, +{ 12, 0x117b, 0, {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x12,0x14,0xee,0xfd,0x60,0x18} }, +{ 13, 0x1187, 0, {0x8d,0x6d,0xc0,0x02,0xc0,0x03,0xc0,0x04,0x12,0x11,0x0c,0xd0,0x04} }, +{ 9, 0x1194, 0, {0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b} }, +{ 2, 0x119d, 0, {0x80,0xdc} }, +{ 1, 0x119f, 0, {0x22} }, +{ 13, 0x11a0, 0, {0xe5,0x73,0xc4,0x54,0x0f,0xfa,0x53,0x02,0x0f,0xc3,0x74,0x09,0x9a} }, +{ 2, 0x11ad, 0, {0x50,0x06} }, +{ 6, 0x11af, 0, {0x74,0x37,0x2a,0xfb,0x80,0x04} }, +{ 4, 0x11b5, 0, {0x74,0x30,0x2a,0xfb} }, +{ 12, 0x11b9, 0, {0x8b,0x6d,0xc0,0x03,0x12,0x11,0x0c,0xd0,0x03,0xaa,0x73,0x53} }, +{ 8, 0x11c5, 0, {0x02,0x0f,0xc3,0x74,0x09,0x9a,0x50,0x06} }, +{ 6, 0x11cd, 0, {0x74,0x37,0x2a,0xfb,0x80,0x04} }, +{ 4, 0x11d3, 0, {0x74,0x30,0x2a,0xfb} }, +{ 5, 0x11d7, 0, {0x8b,0x6d,0x12,0x11,0x0c} }, +{ 1, 0x11dc, 0, {0x22} }, +{ 7, 0x11dd, 0, {0x90,0x7d,0xc3,0xe0,0xfa,0x60,0x0f} }, +{ 12, 0x11e4, 0, {0x90,0x7d,0xc1,0xe0,0xf5,0x6e,0x90,0x7d,0xc2,0xe0,0xf5,0x6f} }, +{ 3, 0x11f0, 0, {0x12,0x11,0x44} }, +{ 12, 0x11f3, 0, {0x90,0x7d,0xff,0xe4,0xf0,0x75,0x70,0xc4,0x75,0x71,0x7d,0x75} }, +{ 5, 0x11ff, 0, {0x72,0x01,0x12,0x11,0x75} }, +{ 1, 0x1204, 0, {0x22} }, +{ 2, 0x1205, 0, {0x7a,0x04} }, +{ 3, 0x1207, 0, {0xba,0x40,0x00} }, +{ 2, 0x120a, 0, {0x50,0x36} }, +{ 14, 0x120c, 0, {0xea,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfb,0x7c,0x00} }, +{ 3, 0x121a, 0, {0xbc,0x08,0x00} }, +{ 2, 0x121d, 0, {0x50,0x20} }, +{ 6, 0x121f, 0, {0x8b,0x05,0xed,0x30,0xe7,0x0b} }, +{ 11, 0x1225, 0, {0x90,0x7f,0x96,0x74,0x42,0xf0,0x74,0xc3,0xf0,0x80,0x08} }, +{ 8, 0x1230, 0, {0x90,0x7f,0x96,0xe4,0xf0,0x74,0x81,0xf0} }, +{ 7, 0x1238, 0, {0xeb,0x25,0xe0,0xfb,0x0c,0x80,0xdb} }, +{ 3, 0x123f, 0, {0x0a,0x80,0xc5} }, +{ 1, 0x1242, 0, {0x22} }, +{ 4, 0x1243, 0, {0x7a,0x00,0x7b,0xef} }, +{ 3, 0x1247, 0, {0xba,0x10,0x00} }, +{ 2, 0x124a, 0, {0x50,0x20} }, +{ 14, 0x124c, 0, {0x74,0x11,0x2b,0xfb,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0x8c,0x82,0x8d} }, +{ 14, 0x125a, 0, {0x83,0xe4,0xf0,0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe4} }, +{ 4, 0x1268, 0, {0xf0,0x0a,0x80,0xdb} }, +{ 1, 0x126c, 0, {0x22} }, +{ 14, 0x126d, 0, {0x74,0xf8,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} }, +{ 14, 0x127b, 0, {0x74,0xf9,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} }, +{ 14, 0x1289, 0, {0x74,0xfa,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} }, +{ 14, 0x1297, 0, {0x74,0xfb,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} }, +{ 14, 0x12a5, 0, {0x74,0xff,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} }, +{ 1, 0x12b3, 0, {0x22} }, +{ 14, 0x12b4, 0, {0x12,0x03,0xcb,0x12,0x12,0x6d,0x7a,0xc0,0x7b,0x87,0x7c,0x01,0x74,0x01} }, +{ 14, 0x12c2, 0, {0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74} }, +{ 14, 0x12d0, 0, {0x01,0x12,0x14,0xbf,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e} }, +{ 14, 0x12de, 0, {0x83,0x8f,0xf0,0x74,0x06,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b} }, +{ 14, 0x12ec, 0, {0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74} }, +{ 14, 0x12fa, 0, {0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0} }, +{ 14, 0x1308, 0, {0x74,0x0b,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07} }, +{ 14, 0x1316, 0, {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74,0x08,0x12,0x14,0xbf,0x74,0x01,0x2d} }, +{ 14, 0x1324, 0, {0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x01} }, +{ 14, 0x1332, 0, {0x12,0x14,0xbf,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83} }, +{ 14, 0x1340, 0, {0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74,0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f} }, +{ 14, 0x134e, 0, {0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x03,0x12,0x14,0xbf,0x7d,0x00} }, +{ 3, 0x135c, 0, {0xbd,0x06,0x00} }, +{ 2, 0x135f, 0, {0x50,0x12} }, +{ 11, 0x1361, 0, {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x0a,0xba,0x00,0x01,0x0b} }, +{ 7, 0x136c, 0, {0xe4,0x12,0x14,0xbf,0x0d,0x80,0xe9} }, +{ 13, 0x1373, 0, {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe5,0x74,0x12,0x14,0xbf,0x74,0xf9} }, +{ 14, 0x1380, 0, {0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x0f,0xf0,0x74} }, +{ 14, 0x138e, 0, {0xfe,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x01,0xf0} }, +{ 6, 0x139c, 0, {0x12,0x03,0xe1,0x12,0x04,0xf7} }, +{ 1, 0x13a2, 0, {0x22} }, +{ 13, 0x13a3, 0, {0x90,0x7d,0xc1,0xe0,0xfa,0x24,0x00,0xfb,0xe4,0x34,0x19,0xfc,0x90} }, +{ 14, 0x13b0, 0, {0x7d,0xc2,0xe0,0xfd,0x8b,0x82,0x8c,0x83,0xf0,0x75,0xf0,0x11,0xea,0xa4} }, +{ 3, 0x13be, 0, {0xfa,0x7b,0x00} }, +{ 3, 0x13c1, 0, {0xbb,0x10,0x00} }, +{ 2, 0x13c4, 0, {0x50,0x24} }, +{ 14, 0x13c6, 0, {0xea,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0xeb,0x2c,0xfc,0xe4,0x3d,0xfd} }, +{ 14, 0x13d4, 0, {0x74,0x04,0x2b,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfe} }, +{ 8, 0x13e2, 0, {0x8c,0x82,0x8d,0x83,0xf0,0x0b,0x80,0xd7} }, +{ 14, 0x13ea, 0, {0xea,0x24,0x00,0xfa,0xe4,0x34,0x18,0xfb,0x74,0x10,0x2a,0xf5,0x82,0xe4} }, +{ 5, 0x13f8, 0, {0x3b,0xf5,0x83,0xe4,0xf0} }, +{ 1, 0x13fd, 0, {0x22} }, +{ 4, 0x13fe, 0, {0xe5,0x76,0x60,0x02} }, +{ 2, 0x1402, 0, {0x80,0x16} }, +{ 12, 0x1404, 0, {0x74,0x0f,0x55,0x75,0xfa,0x8a,0x75,0x24,0x00,0xf5,0x82,0xe4} }, +{ 10, 0x1410, 0, {0x34,0x19,0xf5,0x83,0xe0,0xf5,0x74,0x12,0x12,0xb4} }, +{ 10, 0x141a, 0, {0x12,0x10,0xca,0x75,0x6e,0x00,0x75,0x6f,0x00,0x12} }, +{ 6, 0x1424, 0, {0x11,0x44,0x75,0x70,0xb9,0x75} }, +{ 6, 0x142a, 0, {0x71,0x14,0x75,0x72,0x02,0x12} }, +{ 11, 0x1430, 0, {0x11,0x75,0xe5,0x76,0xb4,0x02,0x04,0x74,0x01,0x80,0x01} }, +{ 1, 0x143b, 0, {0xe4} }, +{ 3, 0x143c, 0, {0xfa,0x70,0x0f} }, +{ 12, 0x143f, 0, {0x74,0x01,0x25,0x75,0xf5,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0} }, +{ 3, 0x144b, 0, {0x02,0x80,0x0a} }, +{ 10, 0x144e, 0, {0x85,0x75,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0,0x02} }, +{ 12, 0x1458, 0, {0x75,0x6e,0x00,0x75,0x6f,0x01,0xc0,0x02,0x12,0x11,0x44,0xd0} }, +{ 4, 0x1464, 0, {0x02,0xea,0x70,0x1a} }, +{ 13, 0x1468, 0, {0x75,0xf0,0x11,0xe5,0x75,0xa4,0xfa,0x24,0x00,0xfa,0xe4,0x34,0x18} }, +{ 9, 0x1475, 0, {0xfb,0x8a,0x70,0x8b,0x71,0x75,0x72,0x01,0x12} }, +{ 4, 0x147e, 0, {0x11,0x75,0x80,0x36} }, +{ 2, 0x1482, 0, {0x7a,0x00} }, +{ 3, 0x1484, 0, {0xba,0x10,0x00} }, +{ 2, 0x1487, 0, {0x50,0x2f} }, +{ 13, 0x1489, 0, {0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe0,0xfb,0xe5} }, +{ 4, 0x1496, 0, {0x75,0xb5,0x03,0x1b} }, +{ 14, 0x149a, 0, {0x75,0xf0,0x11,0xea,0xa4,0xfb,0x24,0x00,0xfb,0xe4,0x34,0x18,0xfc,0x8b} }, +{ 9, 0x14a8, 0, {0x70,0x8c,0x71,0x75,0x72,0x01,0xc0,0x02,0x12} }, +{ 4, 0x14b1, 0, {0x11,0x75,0xd0,0x02} }, +{ 3, 0x14b5, 0, {0x0a,0x80,0xcc} }, +{ 1, 0x14b8, 0, {0x22} }, +{ 6, 0x14b9, 0, {0x50,0x72,0x6f,0x67,0x20,0x00} }, +{ 14, 0x14bf, 0, {0xc8,0xc0,0xe0,0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0b,0x14,0x60,0x0f,0x14} }, +{ 7, 0x14cd, 0, {0x60,0x11,0x14,0x60,0x12,0x80,0x15} }, +{ 7, 0x14d4, 0, {0xd0,0xe0,0xa8,0x82,0xf6,0x80,0x0e} }, +{ 5, 0x14db, 0, {0xd0,0xe0,0xf0,0x80,0x09} }, +{ 4, 0x14e0, 0, {0xd0,0xe0,0x80,0x05} }, +{ 5, 0x14e4, 0, {0xd0,0xe0,0xa8,0x82,0xf2} }, +{ 4, 0x14e9, 0, {0xc8,0xd0,0xe0,0xc8} }, +{ 1, 0x14ed, 0, {0x22} }, +{ 14, 0x14ee, 0, {0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0d,0x14,0x60,0x0f,0x14,0x60,0x0f,0x14} }, +{ 6, 0x14fc, 0, {0x60,0x10,0x74,0xff,0x80,0x0f} }, +{ 5, 0x1502, 0, {0xa8,0x82,0xe6,0x80,0x0a} }, +{ 3, 0x1507, 0, {0xe0,0x80,0x07} }, +{ 4, 0x150a, 0, {0xe4,0x93,0x80,0x03} }, +{ 3, 0x150e, 0, {0xa8,0x82,0xe2} }, +{ 4, 0x1511, 0, {0xf8,0xd0,0xe0,0xc8} }, +{ 1, 0x1515, 0, {0x22} }, +{ 0, 0x0000, 1, {0} } + +}; + +static unsigned char bitstream[] = { + +0x00,0x09,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0, 0x0F,0xF0,0x00,0x00,0x01,0x61,0x00,0x0D, +0x64,0x61,0x62,0x75,0x73,0x62,0x74,0x72, 0x2E,0x6E,0x63,0x64,0x00,0x62,0x00,0x0B, +0x73,0x31,0x30,0x78,0x6C,0x76,0x71,0x31, 0x30,0x30,0x00,0x63,0x00,0x0B,0x31,0x39, +0x39,0x39,0x2F,0x30,0x39,0x2F,0x32,0x34, 0x00,0x64,0x00,0x09,0x31,0x30,0x3A,0x34, +0x32,0x3A,0x34,0x36,0x00,0x65,0x00,0x00, 0x2E,0xC0,0xFF,0x20,0x17,0x5F,0x9F,0x5B, +0xFE,0xFB,0xBB,0xB7,0xBB,0xBB,0xFB,0xBF, 0xAF,0xEF,0xFB,0xDF,0xB7,0xFB,0xFB,0x7F, +0xBF,0xB7,0xEF,0xF2,0xFF,0xFB,0xFE,0xFF, 0xFF,0xEF,0xFF,0xFE,0xFF,0xBF,0xFF,0xFF, +0xFF,0xFF,0xAF,0xFF,0xFA,0xFF,0xFF,0xFF, 0xC9,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFB,0xFF,0xA3,0xFF,0xFB, +0xFE,0xFF,0xBF,0xEF,0xE3,0xFE,0xFF,0xBF, 0xE3,0xFE,0xFF,0xBF,0x6F,0xFB,0xF6,0xFF, +0xBF,0xFF,0x47,0xFF,0xFF,0x9F,0xEE,0xF9, 0xFE,0xCF,0x9F,0xEF,0xFB,0xCF,0x9B,0xEE, +0xF8,0xFE,0xEF,0x8F,0xEE,0xFB,0xFE,0x0B, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xBF,0xFF,0xFF,0xFB,0xFF,0xFF, 0xBF,0xFF,0xFF,0xFC,0x17,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F, 0xFF,0xFF,0xFB,0xFF,0xFF,0x7F,0xFF,0xFF, +0xFC,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x5F,0xFF, 0xFF,0xFD,0xFF,0xFF,0xDB,0xFF,0xFD,0xFF, +0x77,0xFF,0xFD,0xFF,0xFF,0xDF,0xFE,0xFD, 0xFF,0xFF,0xF2,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1, +0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xE3,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF, +0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x67,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x7F,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF, 0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0x2F,0xFF, +0xF3,0xFD,0xFF,0x7F,0xDE,0xF7,0xFD,0xFF, 0x7F,0xF7,0x7D,0xFF,0x7F,0xDF,0xF7,0xBD, +0xFF,0x7F,0xFF,0x1F,0xFF,0xEF,0xFB,0xFE, 0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xEF,0xFB, +0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF, 0x3F,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F, +0x9F,0xE7,0xFA,0x7F,0x9F,0xE7,0xF9,0xFE, 0x7F,0x9F,0xE7,0xFF,0xFC,0x7F,0xBF,0xBF, +0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xB7, 0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, +0xFF,0xE0,0xFD,0xF9,0xFE,0x7F,0x9F,0xE7, 0xF9,0xFE,0x7F,0x9D,0xF9,0xFE,0x7D,0x9D, +0xE7,0xF9,0xFE,0x7F,0x9F,0xED,0xED,0xFF, 0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F, +0xDF,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF, 0x7F,0xDF,0xFF,0x9B,0xFF,0xEF,0xFB,0xFE, +0xFB,0xBF,0xEF,0xBB,0xFE,0xFF,0xAF,0xBB, 0xBE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFF, +0xB7,0xBF,0xDB,0xF6,0xBD,0xBF,0x6B,0xDB, 0xF6,0xF9,0xBF,0x5B,0xD6,0xF9,0xBF,0x6F, +0xDB,0xF6,0xFD,0xBF,0xFF,0x0E,0xFF,0xFF, 0xFF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0x7F, +0xF7,0xBD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xDF,0x9F,0xFF,0xFF,0xFF,0xFE,0xFF, +0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0x77,0xFF, 0xFB,0xFB,0xFF,0xFF,0xFF,0xFF,0xF8,0x3F, +0xFF,0xFD,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xF4,0x7F,0xFF,0xFE,0xFD, 0xBE,0xFF,0xDF,0xFE,0xFF,0xFF,0xEF,0x7F, +0xFF,0xCF,0xFF,0xCF,0xFF,0xFF,0xFF,0xDF, 0xE6,0xFF,0xFF,0x7F,0xDF,0xF7,0xDD,0x7F, +0x7F,0xDF,0xF7,0xFF,0x7F,0xDF,0xD7,0xFD, 0xFF,0x7F,0xDF,0xF7,0xFF,0xCD,0xFF,0xF2, +0xFF,0xFF,0x4F,0x7F,0xF4,0xFF,0xFF,0xFF, 0xE7,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xBB,0xFF,0xEF,0xFF,0xFE,0xFF, 0xFF,0xFF,0xEF,0xFF,0xFF,0xEF,0xFF,0xFB, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x65, 0xEF,0xFF,0xFF,0x7F,0xFF,0xFD,0xEF,0xFF, +0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFE,0xCF,0xDF,0xFE,0xFF, +0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xF3,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFE,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xBF,0xFF, 0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xEF,0xEB,0xFF,0xFE,0xBF,0xFF, 0xEB,0xFF,0xFC,0x7F,0xFF,0xFF,0xFF,0xEE, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF, 0xD6,0xFF,0xFD,0xBF,0xFF,0xFB,0xFF,0xFE, +0xFD,0xFF,0xFF,0xFD,0xEF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xDE,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0x7F,0xBF, 0xFF,0x5F,0xDF,0xFF,0xFF,0xBF,0x77,0xFF, +0xFF,0xFF,0x7F,0xD7,0xFF,0xFF,0xFF,0xFF, 0xFF,0xC3,0xFF,0xFF,0xFF,0xFF,0xDF,0xEF, +0xFF,0xFF,0xFE,0xFB,0xFF,0xFF,0xDF,0xBF, 0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xB7,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xAF,0x7F,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xDF,0xBF,0xDF,0xF3,0xFD,0xFB,0xFF,0x5B, +0xFD,0xFF,0xBF,0xEF,0xF7,0xFF,0xFF,0x7D, 0xFF,0xFF,0xFF,0xFF,0xF8,0x3B,0xFF,0xBF, +0x6F,0xFF,0xFE,0xFF,0xBF,0xFF,0xEB,0x7D, 0xFF,0xEF,0xFB,0xFE,0xFF,0xFF,0xFF,0xFF, +0xFF,0xF2,0x7F,0xFC,0xFF,0x3F,0xDF,0xED, 0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0x5F,0xF7, +0xB5,0xFF,0xEF,0xFF,0xFF,0xFF,0xE0,0x3F, 0x9F,0x9E,0xFF,0xFF,0xEF,0xFF,0xDF,0xFF, +0xBF,0x5F,0xBF,0xCF,0xF3,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x69,0xAF,0x33,0xFD,0xFF, +0xFB,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF,0x7F, 0xD9,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xF5, +0xA3,0xDF,0x6E,0xDE,0xFF,0xFF,0xBD,0xFF, 0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xE7,0xFD, +0xFF,0xFF,0xFF,0xF9,0xEF,0xC6,0xFE,0xB7, 0xAD,0xE5,0xF9,0xFF,0xFF,0xFF,0xCF,0xFF, +0xFF,0xFF,0xCD,0xFB,0x7F,0xFF,0xFF,0xFF, 0xF9,0xF6,0x0F,0xDF,0xEC,0xCF,0x7F,0xFF, +0xFB,0x7F,0xFF,0xFF,0xFF,0xFD,0xFF,0xFE, 0xF9,0xFD,0x7F,0xFF,0x7F,0xFF,0xF9,0x5B, +0xFF,0x73,0xDC,0xFD,0x7B,0xDF,0xFF,0xFF, 0xFF,0x7B,0xFF,0xFF,0xF7,0x53,0xD6,0xFF, +0xFF,0xFF,0xFF,0xD8,0x9F,0xFE,0xFF,0xEF, 0x7F,0xEE,0xFF,0xFF,0xFF,0xFB,0xED,0xED, +0xFD,0xFF,0xFE,0xFF,0xFF,0xFB,0x7F,0xFF, 0xE2,0x7F,0xFF,0x6F,0xD8,0x57,0xF7,0xFF, +0xFF,0xFF,0xDF,0xFF,0xE8,0xFF,0xFF,0xFD, 0xFF,0xFF,0xFC,0x7F,0xFF,0xE4,0xFF,0xFB, +0xEF,0xFB,0xFE,0xDF,0xB7,0xED,0xFF,0xFE, 0xDF,0x7F,0xFF,0xFE,0x7F,0xB7,0xFF,0xFF, +0xFF,0xFF,0x89,0xFF,0xFF,0xCF,0xF3,0xFE, 0x7F,0xFF,0xEF,0xFF,0xFE,0x7E,0x7F,0xFB, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF1, 0xFF,0xEB,0x7A,0xD5,0xBF,0x6F,0xDB,0xBE, +0xFD,0xB7,0xD8,0xF6,0xE5,0xBF,0x6F,0xFB, 0xFE,0xF5,0xBD,0x7E,0x06,0xFF,0xDF,0xF7, +0xFB,0xF6,0xFF,0x3F,0xFF,0xDB,0xFF,0xFF, 0x6F,0xFB,0xF7,0xFF,0xFF,0xFF,0xFB,0xFE, +0xF7,0xAF,0xFF,0xB7,0xED,0xEF,0xF7,0xFE, 0xFF,0xFF,0xDF,0xFF,0xFE,0xFF,0xEF,0xFF, +0xFF,0xFF,0xFF,0xBF,0xF7,0xFC,0x1F,0xEE, 0xFB,0xFE,0xBD,0xFF,0x7F,0x5F,0xD7,0xFD, +0xFB,0x43,0xFF,0xFF,0xFD,0xFF,0x5F,0xFF, 0xF7,0xFF,0xF9,0x3F,0xFF,0xCF,0xF3,0xFD, +0xF7,0x7E,0xEF,0xA7,0xF9,0xFE,0x8F,0xA7, 0xE9,0xF3,0x7E,0x9F,0xFB,0xF8,0xFF,0xFF, +0x3F,0xFD,0x7F,0x5F,0xDF,0xFD,0xFF,0xFF, 0x5F,0xFF,0xFD,0x5F,0xFF,0xFF,0x7F,0xFD, +0x7F,0xFD,0x9F,0xFF,0xE0,0xFF,0xFA,0xF8, 0xBE,0x6F,0x9F,0xE6,0xF8,0xBE,0x3F,0x9A, +0xF9,0xBE,0x6F,0x9F,0xE2,0xF9,0xFE,0x6F, 0x9F,0xF9,0xFF,0xF5,0xFD,0x7F,0xCF,0xDF, +0xFD,0xFD,0x7F,0xFF,0xF5,0xFF,0xFF,0xFF, 0xF7,0xF5,0xFD,0x0F,0xDB,0xFF,0xD3,0xFF, +0xEB,0xFA,0xFF,0xFF,0xBF,0xFF,0xFA,0xFF, 0xFF,0xCB,0xFB,0xFE,0xFF,0xFF,0xEB,0xFA, +0xFE,0xFF,0xFF,0xB7,0xFF,0xFF,0xFF,0xFF, 0xBF,0xFF,0xDF,0xF5,0xFF,0xFF,0xD7,0xFF, +0xFF,0xFF,0xDF,0xD7,0xF5,0xFF,0x7F,0xFE, 0x4F,0xFF,0xFD,0xFF,0x7F,0x7F,0xFF,0xAD, +0xEB,0xFB,0xFF,0xAD,0xFF,0xFF,0xFF,0xFF, 0xAF,0xEB,0xFB,0xFF,0xFC,0x0D,0xFF,0xFF, +0xDF,0xD2,0xFD,0xFF,0xFF,0xFD,0xF6,0xFF, 0xFF,0x7F,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF, +0xFF,0xFB,0x3F,0x7D,0xEB,0x32,0xFE,0xBF, 0x2F,0xEB,0xFA,0xAE,0xBD,0xE0,0xFA,0x7E, +0xBF,0xAD,0xEB,0xFA,0xFE,0xBF,0xF5,0x7F, 0xFF,0xDE,0xFE,0xE3,0xFB,0xFF,0xFF,0xFF, +0xDF,0xEF,0x4F,0xDF,0xFF,0x7F,0xDF,0xFF, 0xF7,0xFF,0xFF,0xF8,0x7F,0xFF,0xFF,0xEF, +0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xDF, 0xED,0xFB,0xDF,0xFF,0xBF,0xFF,0xFF,0xFF, +0x81,0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF, 0xFF,0xFF,0xFE,0xDD,0xFE,0xEF,0xFD,0xFF, +0xFF,0xFB,0xFE,0xF7,0xFF,0x93,0xFD,0xFB, 0x7E,0xFF,0xFE,0x87,0xE9,0xFF,0x7F,0xB3, +0x9F,0xFE,0xFE,0xFF,0xAF,0xFD,0xFE,0x7E, 0x3F,0xFE,0x67,0xFF,0xFF,0xF7,0xFF,0xFF, +0xFC,0xF7,0xDF,0xFD,0xFF,0x7F,0xFF,0xFF, 0x7F,0x6D,0xFF,0xFF,0xFE,0xFF,0xFF,0x2F, +0xFF,0xBF,0xFF,0xFF,0xEE,0xFF,0xBE,0xFF, 0xFF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF, +0xEF,0xFF,0xFF,0xFA,0x5F,0xFF,0xFF,0xFB, 0xFF,0xFF,0xEF,0xFF,0xFB,0xFE,0xFD,0xFF, +0xFE,0xFF,0xFB,0xFF,0xFF,0xFF,0x7F,0xFF, 0xFE,0xBF,0xDF,0xFF,0xFB,0xFF,0xFF,0xF7, +0xFC,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F, 0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0x7F,0xFF, +0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF, 0xF3,0xFF,0xFF,0xFF,0xEF,0xFB,0xFF,0xFF, +0xFF,0xDF,0xE2,0xFF,0xFF,0xFB,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFB,0xE7,0xFF,0xFD, +0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xED, 0xEF,0xFD,0xFF,0xFF,0xDF,0xD7,0xF5,0xFD, +0x7F,0x5D,0xFD,0xFF,0x7F,0xDF,0x97,0xF4, 0xFD,0x7B,0x5F,0xFF,0xC9,0xFF,0xFB,0xFE, +0xFF,0xBF,0xFF,0x5F,0xFF,0xFF,0xF7,0xFF, 0xEF,0xFD,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xF7,0xFF,0xD7,0xFD,0x7D,0x7F,0xFF, 0xFF,0xFF,0xFF,0xEF,0xDF,0xF7,0xFD,0xFF, +0xBB,0xFF,0xFF,0x7F,0xFF,0xFE,0xE3,0xFF, 0xF9,0xFE,0x7F,0xBF,0xEF,0xFB,0xFE,0xFF, +0xBF,0xF9,0xFE,0xFF,0x9F,0xEF,0xF9,0xFE, 0xFF,0xBF,0xF3,0xDA,0xFF,0x37,0xCD,0xF3, +0x7C,0xDF,0x37,0xCD,0xF3,0x7F,0x37,0xCD, 0xF3,0x7C,0xDF,0x37,0xCC,0xF3,0x7F,0x5A, +0xBD,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFD, 0xBF,0x6F,0xDE,0xFD,0xBF,0x6F,0xDB,0xF6, +0xFD,0xBF,0x6F,0xFE,0xF1,0x6F,0xEB,0x7A, 0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7,0xAF, +0x7A,0xDE,0xB7,0xAD,0xEB,0x7A,0xDE,0xB7, 0xFF,0x7E,0xFF,0xFE,0xCD,0xB3,0x6C,0xDB, +0x36,0xCD,0xB3,0x6C,0xDE,0xCD,0xB3,0x6C, 0xDB,0x36,0xCD,0xB3,0x6C,0xDF,0xC9,0xBF, +0xF7,0xBD,0xEF,0x7A,0x9E,0xA7,0xA9,0xEA, 0x7A,0xB7,0xBD,0xEA,0x7B,0xDE,0xA7,0xBD, +0xCA,0x72,0x8D,0x91,0xFF,0xEF,0xFB,0xFE, 0xFF,0xBF,0xEF,0xFB,0xFE,0xF7,0xEF,0xFB, +0xFE,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFE, 0x87,0xFF,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6, +0xFD,0xBF,0x6F,0xF6,0xFD,0xBF,0x6F,0xDB, 0xF6,0xFD,0xBF,0x6F,0xFE,0x4F,0xFF,0xBF, +0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB,0xEF, 0xBE,0xEF,0xBB,0xEE,0xFB,0xBE,0xEF,0xBB, +0xEF,0xFC,0x5F,0xFF,0xFF,0xFF,0x3F,0xCF, 0xF3,0xFC,0xFF,0x3F,0xCF,0xFC,0xFF,0x3F, +0xCF,0xF3,0xFC,0xFF,0x3F,0xCF,0xFD,0x9F, 0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF, +0xEB,0xFE,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF, 0xAF,0xEB,0xFF,0xE1,0x6F,0xFD,0xFF,0x7F, +0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFD,0xFF, 0x7F,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF, +0x7A,0xBF,0xFB,0xFE,0xDF,0xB7,0xED,0xFB, 0x7E,0xDF,0xB7,0xFB,0x7E,0xDF,0xB7,0xED, +0xFB,0x7E,0xDF,0xB7,0xFF,0xC9,0xFF,0xFF, 0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, +0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEE, 0xFB,0xFE,0xBB,0xFF,0xFE,0xFF,0xBF,0xEF, +0xFB,0xFE,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF, 0xEF,0xFB,0xFE,0xFF,0x3F,0xCF,0xFF,0xE7, +0xFE,0xFF,0xF5,0xFD,0x77,0x5D,0xD7,0x35, 0xDD,0x77,0xD7,0xF5,0xCD,0x7B,0x5D,0xD7, +0xF5,0xDD,0x77,0xFE,0x27,0xFF,0xFF,0x8B, 0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9,0xAF, +0x8B,0xE2,0xF8,0xBE,0x2F,0x8B,0xE2,0xF9, 0xFE,0x1F,0xFF,0x5F,0xD7,0xF5,0xFD,0x7F, +0x5F,0xD7,0xF5,0xFF,0x5F,0xD7,0xF5,0xFD, 0x7F,0x5F,0xD7,0xF5,0xFF,0xFA,0x3F,0xFE, +0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xEB, 0xEC,0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF, +0xEB,0xFF,0xFE,0x7F,0xFD,0x7F,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6, 0xFF,0xFA,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF, +0xF7,0xFC,0xFF,0xDF,0xF7,0xFD,0xFF,0x7F, 0xDF,0xF7,0xFD,0xFF,0xF5,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0x02,0xFF,0xFE,0xBF,0xAB,0xEB,0xFA, 0xBE,0xBF,0x23,0xEB,0xDE,0x1F,0xAF,0xEA, +0xFA,0xFE,0xAF,0xAF,0xEB,0xFD,0x97,0xFF, 0xF3,0xFC,0x7B,0x1F,0xCF,0xF1,0xFC,0x7F, +0x1F,0xF1,0xFC,0x77,0x1F,0xCD,0xF1,0xFC, 0xFF,0x1F,0xFE,0x87,0xFF,0xAF,0xEF,0xFA, +0xFE,0xFF,0xAF,0xEF,0xFA,0xFD,0xBF,0x2B, 0xFB,0x7E,0xBF,0xBF,0xEB,0xFB,0xFB,0xFB, +0xDF,0xFF,0xFB,0xF7,0xFF,0xFF,0x7F,0xF7, 0xF7,0xFF,0xFD,0xDF,0xFE,0xFC,0xDF,0xFF, +0xDF,0xFF,0xFD,0xFF,0xDA,0xBF,0xFF,0xBB, 0xEF,0xFB,0xF9,0xFF,0xBE,0xEF,0xFB,0xFB, +0xBF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, 0xFF,0xF7,0x7F,0xFD,0xD7,0xFF,0xFF,0x7F, +0xFF,0xFF,0xFF,0xFE,0xF7,0xFF,0xFE,0xFF, 0xF7,0xFF,0xFF,0x7F,0xFF,0xFF,0xEC,0xFF, +0xFF,0xFE,0xDF,0xBF,0xFF,0xFB,0xFE,0xFF, 0xBB,0x68,0xAE,0x1F,0xAE,0xFB,0xFB,0xFF, +0xFF,0xBF,0xFF,0xD5,0xFF,0x7F,0xFF,0xFF, 0xF7,0xFE,0xFE,0xFF,0xBF,0xEF,0x9F,0xFD, +0x7F,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF,0xFF, 0xBB,0xF7,0xBF,0xFF,0xFF,0xFF,0xFF,0xDF, +0xFF,0xBF,0xFB,0xFF,0xFF,0xFF,0xDE,0x3F, 0xFF,0xFF,0xFF,0xFF,0xFF,0xA7,0xFF,0xFF, +0xFF,0xFF,0xEF,0xFF,0x7F,0xFB,0xFD,0xFB, 0x7F,0xFF,0xFF,0xFF,0xFF,0xCF,0xF3,0x7C, +0xFF,0x7F,0x8D,0x7F,0xFF,0xFF,0xFF,0xFF, 0xFB,0xFF,0xF7,0xFB,0xFE,0xFD,0xFF,0xFF, +0xFF,0xFF,0xF7,0xFD,0xFF,0x7F,0xFD,0x1F, 0xFD,0xFF,0xFF,0xFF,0xFF,0xBF,0xDF,0xFF, +0xFF,0xFE,0x5C,0xFF,0x6D,0xFF,0x7F,0xAB, 0xE7,0xF1,0xFF,0xFD,0x9F,0xFF,0xFF,0xAD, +0xEB,0x7A,0x3F,0x1F,0xFF,0xFF,0xFE,0xBF, 0xAF,0xF3,0xDE,0xF5,0xFF,0x8F,0xFB,0xDF, +0xE6,0x7F,0xFF,0xDF,0xF3,0xFD,0xFF,0x7E, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xF7,0xF3, +0x7F,0xDF,0xF7,0xEF,0xFF,0xF6,0x3F,0x9F, 0xDF,0xFF,0xFF,0xEE,0xFF,0xFF,0xEF,0xFB, +0xFF,0xFF,0xF9,0xFB,0xFE,0x4F,0xBF,0xEF, 0xBB,0xFF,0x69,0xAF,0xAF,0xFC,0xFF,0x3F, +0xDD,0xFF,0xFC,0xBF,0x8F,0xFF,0xFD,0xF3, 0xBF,0xED,0x9E,0xFC,0xBF,0x6F,0xF5,0xD3, +0xDF,0xFF,0xDB,0xD6,0xF5,0xEF,0xFD,0xFE, 0xFF,0xB9,0xFF,0x1F,0xD2,0xA9,0xAF,0xFF, +0xDB,0xF7,0xBF,0xEF,0x46,0xFF,0xFF,0xAD, 0xEB,0x7A,0xDF,0xEF,0xF7,0xFF,0x7F,0xF7, +0x9F,0xED,0xFF,0x7F,0xFF,0xAD,0xEB,0x7F, 0xF5,0x6F,0xFF,0xFD,0xFB,0xD6,0xF4,0xF7, +0xFB,0xF9,0x7E,0x7F,0xFF,0x5F,0xC2,0xFE, 0xBF,0xFD,0xFB,0x33,0xDF,0xF9,0x5B,0xFF, +0xFF,0xDD,0x67,0x7D,0xCF,0xEF,0xDB,0xEC, 0xFF,0x77,0xDD,0xF7,0xFD,0xFF,0xFF,0xDE, +0xA7,0xBF,0xD4,0x9F,0xFF,0xFF,0xBF,0xEF, 0xFE,0xFF,0xDF,0xEF,0xBB,0xFF,0xFF,0xEF, +0xEB,0xFA,0xFF,0xEF,0xBD,0xFB,0xFF,0xE2, 0x7F,0xFF,0xDF,0xDF,0xF7,0xFD,0xBF,0xBB, +0x73,0xF7,0xFD,0x7F,0xDF,0xDE,0xF7,0xBF, 0xEA,0xDB,0xF6,0xFF,0xD6,0xFF,0xFF,0x66, +0xFF,0xBE,0xFF,0xBF,0x6B,0xD9,0xF6,0xDF, 0xFF,0xFB,0x7E,0x7F,0xB7,0x7E,0xFF,0xFE, +0xFF,0xCD,0xFF,0xFE,0x7F,0xFF,0xFC,0xFD, 0x3F,0xFB,0xFB,0xF7,0xFF,0xFF,0xFB,0xF6, +0x7D,0xFE,0x7F,0xFF,0xFC,0xFF,0xB9,0xFF, 0xF9,0xFA,0xFE,0xBF,0xAF,0x5B,0xD6,0xED, +0xAD,0x7B,0xF6,0xF9,0xBF,0xEF,0xF8,0xFA, 0xFE,0xBF,0xFE,0xE6,0xFF,0xFF,0xF7,0xFD, +0xFF,0x7F,0xBF,0xEF,0xF3,0xFF,0xFF,0x6F, 0xF7,0xFE,0xFF,0xFF,0xF7,0xFD,0xFE,0xF7, +0xEF,0xFF,0xFB,0xEF,0xFB,0x7E,0xDE,0xFE, 0xFF,0xBF,0xFF,0xFE,0xFF,0xFF,0xFB,0xFF, +0xFF,0xEF,0xFB,0x6F,0xFC,0x1F,0xFE,0xE7, 0xFF,0xFF,0xFF,0xEF,0xFF,0xD3,0xB4,0xBB, +0xFF,0xFF,0xFD,0xBF,0x6F,0xE3,0xFE,0xFF, 0xBF,0xFC,0xBF,0xF7,0xCF,0xF7,0xFD,0xFF, +0x2F,0xDF,0xAB,0xEA,0xFF,0xDF,0xE7,0xEA, 0x9A,0xAF,0xEF,0xFB,0xFE,0xFF,0xF5,0x3F, +0xFD,0x7E,0xFF,0xD7,0xF5,0xFB,0xFF,0xFD, 0xF7,0xFF,0x7F,0xFE,0xF7,0xFD,0xFF,0xD7, +0xFF,0xD7,0x7F,0xEE,0x7F,0xFA,0x79,0xFE, 0x2F,0x8B,0xE6,0xF9,0xFE,0x3F,0x9E,0xF9, +0xBE,0x2F,0x0B,0xE7,0xF9,0xFE,0x2F,0x9F, 0xFD,0xFF,0xFE,0x7D,0x7F,0x5F,0xD7,0xFF, +0xFF,0x7F,0xFF,0xFD,0xFF,0x7F,0x5F,0x97, 0xFF,0xFD,0x7F,0x5F,0xFF,0xE3,0xFF,0xFF, +0xFA,0xFE,0xBF,0xAF,0xFB,0xFB,0xFF,0xFF, 0xCF,0xEB,0xFE,0xBF,0xAF,0xFF,0xFA,0xFE, +0xBF,0xFF,0x87,0xFF,0xFF,0xF5,0xFF,0xFF, 0xFF,0xFF,0xFD,0xFF,0x7F,0xFF,0xFF,0xFF, +0xFB,0xFF,0xFF,0xF5,0xFF,0xFF,0xFE,0x0F, 0xFF,0xFD,0xEB,0xFF,0xFF,0xF7,0xFF,0xEF, +0x7B,0xDF,0xFE,0xFF,0xFF,0xDF,0xF7,0xFD, 0xEB,0x7F,0xDF,0xFF,0x5F,0xFF,0xFF,0xFF, +0xFF,0xFD,0xBF,0xFF,0x7E,0xFA,0xBF,0xC7, 0xDB,0xF7,0xBD,0x3F,0xFB,0xFF,0xF6,0xFF, +0xFA,0xAF,0xFF,0xEB,0xFA,0xFE,0x3F,0x2F, 0xEA,0xFA,0x3E,0xAD,0xC9,0xBA,0xF6,0xAD, +0xAF,0xEB,0xFA,0xF6,0xBF,0xFE,0x7F,0xFF, 0xFF,0xFD,0xFF,0xF1,0x7F,0x3F,0xCF,0xF1, +0xEF,0xFF,0x7F,0xFF,0xBC,0xDF,0xDF,0xF7, 0xDD,0xFF,0xE0,0x7F,0xFF,0xFF,0xFE,0xFF, +0xFA,0xEC,0xBB,0x7F,0x5F,0xFF,0xFB,0xEC, 0xFF,0xEF,0xB7,0xFF,0xF7,0xFF,0xFF,0xB5, +0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xEE,0xDF, 0x5F,0xDF,0xDE,0xFF,0xAE,0xE7,0x77,0xFF, +0xFF,0xDF,0xF7,0xFF,0xE3,0xFF,0xFA,0xBB, 0xFE,0xFF,0xAF,0xFD,0xFB,0xFE,0xBF,0xAB, +0xF9,0xFE,0xFF,0xBF,0x7F,0xBF,0xFE,0xBD, 0xFE,0xD7,0xFF,0x9F,0xFD,0xFF,0xBE,0xEF, +0xFF,0xEE,0xFD,0xBB,0x5B,0xEF,0xFF,0x7F, 0xEF,0xFF,0xEF,0xFF,0x7F,0xFF,0x4F,0xFF, +0xEF,0xFB,0xBC,0xFC,0xFF,0xFF,0xFF,0xFE, 0xFE,0xFD,0xFA,0xFE,0xFB,0xFF,0xFD,0xF3, +0xFB,0xFF,0xF8,0x5F,0xFF,0xFF,0xD7,0xF5, 0xFD,0xDF,0xEF,0xFF,0xF3,0xDC,0x5F,0xCE, +0xF5,0xBD,0xFF,0xFF,0xD7,0xFF,0xFF,0xF9, 0x3F,0xFF,0xDF,0xF7,0xFF,0xFE,0xFF,0xFD, +0xFF,0xFB,0xFF,0xF7,0xB9,0x7D,0xFE,0xDF, 0xFF,0xFF,0xFF,0xFF,0xF9,0x7F,0xFF,0xFE, +0xFF,0xFF,0x7F,0xFF,0xFE,0xFF,0xFF,0xF7, 0xF6,0xFF,0xBF,0xF1,0xF8,0xFF,0xFF,0xFF, +0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF, 0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF, +0x9B,0xFB,0x7F,0xFF,0xFF,0xFF,0xC1,0xFF, 0xDF,0xFF,0x3F,0x5F,0xD7,0xBF,0xEF,0xBB, +0xDE,0xEE,0xFF,0x7F,0xDF,0xFF,0xFE,0xF5, 0x7F,0xDF,0xFF,0x99,0xFF,0xFF,0xFA,0xFF, +0xBF,0xFD,0xEB,0x7A,0xFF,0xB7,0xFE,0xFE, 0xFF,0xFF,0xEF,0xFF,0xFF,0xFD,0xBF,0xFF, +0x97,0xFF,0xFD,0xF7,0xFF,0x7F,0xF7,0xFF, 0xFF,0xFD,0x5F,0xFE,0xF3,0xF9,0xDF,0xDF, +0xFF,0xFF,0xFC,0xFF,0xFF,0x83,0xFF,0xFF, 0xFE,0xFF,0x9E,0xEC,0xFB,0xEE,0xFF,0x9F, +0xBF,0xEF,0xFF,0xFE,0xED,0x7B,0xFF,0xFF, 0xFF,0xF1,0x5A,0xFF,0xFF,0xFD,0xFF,0x7C, +0x69,0x3B,0xDF,0xFF,0x7F,0x1F,0xDF,0xFF, 0xFD,0xBA,0xFF,0xFF,0xFB,0xFF,0x5B,0xBD, +0xFF,0xFF,0xFF,0xFF,0xD7,0xB6,0xED,0xE9, 0xFF,0xD6,0xBD,0x6F,0x5F,0xFB,0xFF,0xEF, +0xFF,0x5F,0xFE,0xF6,0x6F,0xFF,0xFF,0xFF, 0xFF,0xF7,0xEB,0x7A,0xDF,0xFF,0x9F,0x7F, +0x7F,0xFF,0xB7,0xFF,0xFF,0xFE,0xDF,0xFF, 0x6C,0xFF,0xFB,0xFF,0xBB,0x6F,0xEB,0xFE, +0xCC,0xF7,0xA5,0xFA,0x5C,0xF5,0x75,0xBB, 0xB7,0xDF,0xFE,0x6F,0x5F,0xC5,0xBF,0xFD, +0x7B,0xFE,0xFF,0x95,0xE7,0x29,0xCF,0x4F, 0xF5,0x91,0xEE,0x6B,0xDF,0xEF,0xFD,0x54, +0xF5,0xBD,0xB1,0xFF,0xEF,0xEE,0xFB,0xBE, 0xBF,0xAF,0xFE,0xDE,0xBD,0x6F,0xDA,0xF2, +0xFF,0xAF,0xBE,0xFF,0xFF,0xFD,0x7E,0xA7, 0xFF,0xF7,0xFF,0xBF,0xEF,0x7B,0xF6,0xFD, +0xBD,0x4A,0xF2,0x85,0x85,0xBF,0x5B,0xFE, 0xB5,0xFD,0xFA,0xFF,0x4F,0xFF,0xFE,0xDF, +0xFF,0xED,0xFF,0xBF,0xFF,0xBF,0x7F,0xFE, 0xFF,0xB7,0x6D,0xFF,0xF7,0xBF,0xBF,0xEF, +0xFD,0x1F,0xFF,0xFE,0x7D,0xFF,0x67,0xFF, 0xFF,0xFF,0x3F,0x7F,0xFE,0xBF,0xFF,0xE7, +0xDF,0xE7,0xFF,0xEF,0x6B,0xFC,0x1F,0xFF, 0xBF,0xEF,0xFB,0xFE,0xDE,0xBF,0xAF,0xFA, +0xFF,0xB6,0xEF,0xF9,0xFE,0xFF,0x8F,0xEF, 0xDB,0xEF,0xAB,0x6F,0xFB,0xFE,0xFF,0xFF, +0xEF,0xFD,0xFF,0x7F,0xFF,0xFF,0xDE,0xFF, 0xFF,0xEF,0xFF,0xFF,0xFF,0x3F,0xFF,0x6C, +0xFF,0xBF,0xFB,0xFF,0xFE,0xFF,0xFB,0xFE, 0xDF,0xFF,0xFF,0xEF,0xFF,0xFF,0xBF,0xFF, +0xFF,0xFE,0xFB,0xFF,0xD5,0x7F,0xFF,0xFF, 0xEF,0xFB,0xFF,0xFF,0xBF,0xEF,0x43,0xB5, +0xFD,0x6F,0xCF,0xD6,0xBE,0x3F,0x7F,0xDB, 0xFE,0xC3,0xFF,0xFD,0xFF,0xAF,0xEB,0xFB, +0xFC,0xFF,0x3E,0xEF,0xE8,0xFA,0xBD,0xCD, 0xAA,0xFE,0xFE,0x7D,0xCF,0xFF,0xB7,0xFF, +0xF7,0xFF,0xFF,0xFF,0xFD,0xFF,0x75,0xCD, 0x52,0xD7,0xFD,0xFB,0xF7,0xDD,0xFB,0xEF, +0xEB,0xFF,0xFF,0x4F,0xFF,0xBF,0x9F,0xE7, 0xF9,0xFC,0x7F,0x8B,0xC3,0xF9,0xAF,0x8F, +0xE7,0xE9,0xBE,0x7F,0x9F,0xE6,0xF9,0xFC, 0x5F,0xFF,0xFF,0xF7,0xFD,0xFF,0x7A,0x5F, +0xD7,0xED,0xFF,0xFF,0xD7,0xFF,0xDD,0x7F, 0xE7,0xFF,0xFC,0xFF,0xFC,0x3F,0xFF,0xFF, +0xFF,0xFB,0xFF,0xFE,0xBF,0xAF,0xFF,0xFD, 0xFF,0xEF,0xFF,0xEB,0xFF,0xFF,0xFF,0xFF, +0xFF,0xF7,0x7F,0xFF,0x7F,0xDF,0xFF,0xFD, 0xFD,0x7F,0xFE,0xF7,0xFD,0x7F,0xDF,0xFF, +0xFD,0xFF,0xFF,0xDF,0xFB,0xFF,0xEE,0xFF, 0xFB,0xFF,0xF7,0xFD,0xFF,0x7A,0xDF,0xF5, +0xFD,0xFA,0xDF,0xF7,0xFC,0xFF,0x7F,0xDF, 0xBF,0xED,0xFF,0xC9,0xFF,0xDF,0xFF,0xBF, +0x2F,0xFB,0xFF,0xBC,0xAD,0xFF,0xF7,0xFF, 0xFF,0xEF,0xD3,0xFF,0x7D,0xBF,0x6F,0xFF, +0xFA,0xFF,0xFE,0xBF,0xAE,0xEA,0xFA,0xBE, 0xAD,0xA5,0xEB,0xCE,0xBF,0xA7,0xEB,0x5A, +0xDE,0xBD,0xAF,0x6B,0xFD,0x57,0xFF,0xFF, 0xF4,0x7F,0x1F,0x7F,0xFD,0xFF,0x7F,0x36, +0xF0,0xDF,0x79,0xFF,0xFF,0xFF,0xF7,0xFD, 0xBF,0xFF,0x87,0xFF,0xFB,0xF3,0xFC,0xFF, +0xFF,0xFF,0xFF,0x7E,0xFF,0xBF,0xDF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xF8,0x9F, +0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFD, 0xF7,0xFC,0xBD,0xFF,0xFE,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFB,0xF9,0xBF,0xFF,0xFF,0xEB, 0xE2,0xFE,0xFF,0xBF,0xEF,0xA9,0xBA,0x2F, +0xEB,0xF9,0xFE,0x77,0xDF,0xF7,0xFF,0xFF, 0xF9,0x7F,0xFF,0xFF,0x7F,0xEF,0xD7,0xFF, +0xFD,0xFF,0xFB,0xF5,0xFF,0xBF,0x6F,0xDF, 0xFF,0xFF,0xFD,0xFF,0xFF,0xF0,0xFF,0xFF, +0xFF,0x3F,0xCF,0xFF,0xBA,0xEE,0x9B,0xBF, 0xEE,0xD7,0xFE,0xCD,0xEF,0xFF,0xDF,0xBF, +0xFF,0xFF,0xC5,0xFF,0xFF,0xFD,0x7F,0x4F, 0xFD,0xF6,0xD9,0xFF,0x4F,0xD6,0xFD,0xBF, +0x6E,0xFF,0xFF,0xF4,0x7F,0xFF,0x7F,0x8B, 0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xF9,0xFE, +0x37,0xFF,0xD9,0xFB,0xF5,0xAF,0xFD,0xFF, 0xFF,0xFB,0xFF,0xFF,0x07,0xFF,0xFF,0xFF, +0xFB,0xF7,0xFF,0xFD,0xFF,0x7C,0xFA,0x7E, 0x4F,0xFC,0xDF,0x1D,0xC7,0xFF,0xFF,0xFF, +0xFF,0xAE,0xFF,0xFF,0xFF,0xFF,0xFD,0xFB, 0xFF,0xFF,0xFE,0xFE,0xFC,0xFF,0x7F,0x7F, +0xBF,0xEF,0xFE,0xFF,0xFF,0xFF,0x5F,0xFD, 0xFF,0xFF,0xFF,0xFD,0x6F,0x5A,0xD7,0x7B, +0xBE,0x5F,0xFE,0x39,0xFF,0xF7,0xFF,0xF7, 0xFD,0xFE,0xAA,0x1F,0xFF,0xFF,0xFF,0xFF, +0xFE,0xFE,0xAB,0xAF,0xFD,0xFE,0xBF,0xFF, 0xF7,0xFF,0x7F,0xFE,0x8F,0xE3,0xFB,0xEE, +0x7F,0xFF,0xFF,0xFF,0xFF,0xEB,0xFB,0xFF, 0xFD,0xBF,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFB,0xE4,0x3F,0xFF,0xDF, 0xFF,0xFF,0xFF,0xFF,0xF3,0xEF,0xBB,0xFB, +0xBF,0xEF,0xBB,0xFF,0xD7,0xBF,0xFF,0xFF, 0xFF,0x29,0xAF,0xF7,0xFF,0xFF,0xFB,0xFF, +0xFB,0xE6,0xFF,0x0F,0xFB,0x3F,0xDF,0x0F, 0xFF,0xAF,0xFF,0xFF,0xFF,0xF5,0xC3,0xDF, +0x5F,0xFF,0xFF,0xFF,0xFE,0x6B,0xCA,0xBE, 0xBC,0xFF,0x9F,0xF2,0xBF,0xFF,0xFE,0xFA, +0xFF,0xFF,0xEF,0x16,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFC,0xDF,0x97,0xFD,0x79,0xFF,0x37, +0xE7,0x7F,0xFF,0xFF,0xB5,0xFF,0xFF,0xF6, 0x2F,0xFF,0xFD,0xFB,0xFE,0xFF,0xFF,0xFD, +0x5F,0x57,0x5F,0xFF,0xDB,0x52,0xDF,0xFF, 0xFD,0xBF,0xFF,0xFF,0xFC,0xDB,0xFF,0x7B, +0xB5,0xFD,0x7F,0xFF,0x71,0x9C,0x6E,0xFF, 0xF6,0x35,0xA5,0x9B,0xFF,0xFF,0xFD,0xFF, +0xFF,0xDB,0x9E,0x7F,0xFE,0xEF,0xFB,0xFF, 0xFF,0xBD,0xEF,0xFF,0xDE,0xB7,0xF9,0x4B, +0xFF,0xF5,0xEF,0xFF,0xFF,0xFF,0xE8,0x7E, 0xFF,0xEA,0xDF,0xF7,0xFF,0xFD,0x69,0x5B, +0xFC,0x9F,0xEF,0x78,0xD6,0xFF,0xEB,0xEF, 0xFF,0xFF,0xFF,0xE8,0xFF,0xFF,0xED,0xFF, +0xFF,0xFF,0xFF,0xE3,0xF9,0xF6,0xBF,0xFF, 0xFF,0xFE,0xDF,0xFF,0x7F,0xFF,0xFF,0xFF, +0xD1,0xFF,0xFF,0xE7,0xFF,0xFF,0xFF,0xFF, 0xE7,0xF9,0xFF,0xBF,0x7F,0xD9,0xFF,0xFD, +0xFE,0x7F,0xFF,0xFE,0xFF,0xF9,0xFF,0xFB, 0xD6,0xDF,0xBF,0xEF,0x5B,0xD6,0xFF,0xBF, +0xFB,0xF6,0xFF,0xBF,0xEF,0xF8,0xF6,0xDD, 0xBE,0xFE,0x16,0xFF,0xBF,0xEF,0xFF,0xFE, +0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0x6F,0xFB, 0xFF,0xFF,0xFF,0x6F,0xF3,0xFF,0xF7,0xEF, +0xFB,0xFF,0xBF,0xFF,0xEF,0xFE,0xFF,0xBF, 0xFF,0xFF,0xFF,0xBE,0xBF,0xFF,0xEF,0xFF, +0x7F,0xEF,0xFF,0xFD,0x17,0xFB,0x7B,0xFF, 0xFF,0xFD,0x7F,0xDB,0xF6,0xF4,0x7F,0xFA, +0xFE,0xF5,0xBF,0xEB,0xE3,0xF7,0xFF,0xFF, 0xE9,0xBF,0xFF,0xAF,0xF7,0xFD,0xF3,0x7E, +0x8F,0xA3,0xEA,0xFF,0xCB,0xF3,0xEE,0xFF, 0xBF,0xEF,0xF7,0xF9,0xFF,0xFE,0x7F,0xFF, +0xFF,0xFF,0xFF,0xF5,0xFB,0xF6,0xFF,0xF5, 0x2F,0xFE,0xFB,0xD7,0xBF,0xFF,0xBE,0xDF, +0x9F,0xFF,0xF0,0xFF,0xFF,0xF9,0xFE,0x7F, 0x8F,0xA3,0xF8,0xFE,0x6F,0x9F,0xF9,0xF6, +0x2F,0x9F,0xE7,0xF9,0xFE,0x2F,0x9F,0xE1, 0xFF,0xFF,0xFF,0x7F,0xDF,0xF7,0xF5,0xFD, +0x7F,0x7F,0xF5,0xFF,0x9F,0x5F,0xFB,0xFE, 0xFF,0x7F,0xFF,0xFF,0xCB,0xFF,0xFF,0xFB, +0xFE,0xFF,0xBF,0xAF,0xFB,0xFE,0xFF,0xDF, 0xFE,0xFE,0xBF,0xF7,0xFF,0xFF,0xFF,0xFF, +0xFF,0xC7,0xFF,0xFF,0xFD,0xFF,0x7F,0xDD, 0xF7,0xFD,0xFF,0xFF,0xD7,0xFF,0xFD,0x7F, +0xFF,0xFB,0xFD,0xFF,0xFF,0xFE,0xEF,0x7F, 0xFD,0xEF,0xFB,0xFE,0xFB,0xFD,0xFF,0x7F, +0xDF,0xFD,0xFF,0x7A,0xDF,0xF7,0xFD,0xFF, 0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xD3,0xF7, +0xFF,0xFF,0x6F,0xDB,0xFF,0xFF,0xEF,0xCB, 0xF4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, +0x29,0xFF,0xE8,0xDA,0x76,0x9F,0xAF,0x6A, 0xDA,0xFE,0x35,0xEB,0xDA,0xD6,0xBF,0xAB, +0xEB,0x7A,0xDE,0xBF,0xD7,0x7F,0xFF,0xFE, 0xFF,0xBF,0xEF,0xFD,0xDF,0x77,0xBF,0xFD, +0x37,0xEF,0xFF,0xEF,0xFF,0x3F,0xFF,0xFF, 0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xF7,0x7E, +0xDF,0xFF,0xFF,0xFF,0xFA,0xB7,0x7F,0xFF, 0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0x89,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0x9F,0xFB,0xFF,0xFF,0xFF,0xE7,0xFF, +0xFF,0xFF,0xFF,0xAA,0xFF,0xAB,0xFB,0xFA, 0xEF,0xBF,0xFF,0xDF,0xFA,0x7B,0xB9,0xFE, +0xFE,0xFF,0xFD,0xFF,0xF7,0xFE,0x3F,0xFF, 0xB7,0xFF,0xF7,0xEE,0xFF,0x7F,0xEF,0xFF, +0xFF,0x7F,0xFF,0x1F,0xFB,0xFF,0xBF,0xFB, 0xFE,0xFF,0xBD,0xFF,0xFF,0x2F,0xFF,0xBF, +0xFF,0x7F,0xDF,0xFA,0xFF,0xFF,0xFC,0xEE, 0xF5,0xF3,0xBE,0xFB,0x0F,0xEF,0xF3,0xBE, +0xEF,0xFC,0x5F,0xFF,0x5A,0xFF,0xF7,0xDF, 0xFF,0xFF,0xFE,0xD5,0xFC,0x5F,0xFB,0xF2, +0xFF,0xFF,0x2F,0xBB,0xF3,0xFF,0xFF,0xBF, 0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, +0xBF,0xFF,0xFF,0xFD,0x7B,0xFF,0xDF,0xB9, 0xFF,0xFB,0xFF,0xD8,0x7F,0xFF,0xFF,0xFF, +0xFB,0xFF,0xFC,0x7F,0x1F,0xBF,0xE0,0xDF, 0xF7,0xEF,0xFF,0xFD,0x7F,0xFE,0xDF,0xFF, +0xE0,0xFF,0xFF,0xFD,0xEF,0xFB,0xFF,0xFE, 0xF7,0xDF,0xFF,0xEB,0x5F,0xFF,0xF7,0xFF, +0xFF,0xFF,0xFF,0xBF,0xFF,0xFD,0xFF,0xFD, 0xFF,0xFF,0xFF,0xF7,0xFD,0xFF,0x3B,0xDC, +0xFD,0x6D,0x7B,0x5F,0x57,0xF5,0xFD,0x7F, 0x5F,0xFF,0xB1,0xFF,0xEB,0xFF,0xFF,0xFF, +0xFB,0xFB,0xFE,0xFF,0xBF,0xFB,0xBE,0xFF, 0xBF,0xEF,0xFB,0xFE,0xFF,0xAF,0xFE,0xF7, +0xDF,0xDF,0xFF,0xFF,0xFF,0x7F,0xCF,0xF3, 0xF8,0xFF,0xD7,0xFB,0xFF,0x5F,0xBF,0xF7, +0xFB,0xFF,0x7F,0xFE,0x23,0xFF,0xFF,0xFE, 0x7F,0xF3,0xFF,0xFB,0xFE,0xFF,0xFF,0xF3, +0xFF,0xFF,0xF5,0xF9,0xFF,0x3F,0xFF,0xFF, 0xF0,0x9A,0xFF,0xBE,0x7F,0xFF,0xFC,0xF9, +0xFF,0xFD,0xAF,0xEB,0xFE,0xBF,0xFF,0xCF, 0xF3,0xFE,0x7F,0xFF,0xFF,0x5B,0xBD,0xFF, +0xBC,0xEB,0xFF,0xD7,0xD4,0xAF,0xAF,0xFD, 0xFF,0xCF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7, +0xFD,0xFE,0xFF,0x6F,0xFF,0xFB,0xFF,0xFF, 0xFF,0xFD,0x7F,0x5E,0xFD,0xBF,0xDB,0xF6, +0xFD,0xBF,0x6F,0xFB,0xEE,0xFD,0xFF,0x7A, 0xFF,0xFA,0xFB,0xFF,0x3F,0xFB,0xB7,0x5F, +0xD6,0xF7,0x1F,0x71,0xDC,0x77,0x1D,0xC7, 0x31,0xDC,0x77,0xDF,0xF9,0xBF,0xF5,0x5B, +0xF4,0xD7,0x9D,0xAE,0xFF,0xBF,0xFD,0xBF, 0xDB,0xF6,0xFD,0xBF,0x6F,0xDB,0xF6,0xFE, +0x3D,0x81,0xFF,0xEB,0xFE,0xFE,0xFE,0xFF, 0xEB,0x7A,0xDF,0x7D,0x77,0x7D,0xF5,0x79, +0xDF,0x57,0xDD,0xF5,0x7D,0x7E,0xE6,0xFF, 0xD6,0x3F,0xBF,0x7F,0xFF,0xD4,0xF5,0x3F, +0xBF,0xFB,0xBE,0xEF,0xB3,0xEE,0xFB,0x9E, 0xEF,0xBB,0xFE,0x8B,0xFF,0xFE,0xDF,0xB7, +0xED,0xFF,0xF7,0xFD,0xFE,0xFF,0xEF,0xBB, 0xEE,0xFF,0xBE,0xEF,0xBB,0xEE,0xEB,0xFC, +0x1F,0xFF,0xFF,0xFD,0xFF,0xE7,0xFF,0xF7, 0xFD,0xFF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB, +0xFE,0xFF,0xBF,0xEB,0xFA,0x1F,0xFF,0xB7, 0xEF,0x5B,0xFE,0xFF,0xAF,0xEB,0xDD,0xE7, +0xDE,0x77,0x9D,0xE7,0x79,0xDE,0x77,0x9D, 0xBF,0xE6,0x6F,0xFF,0xFE,0xFF,0xBF,0xEF, +0xFB,0xFE,0xFD,0xBF,0x6F,0xF6,0xFD,0xBF, 0x6F,0xDB,0xF6,0xFD,0xBF,0xFF,0x7E,0xFF, +0xFF,0xFB,0xFE,0xFE,0xFF,0xEF,0xFB,0xFD, 0xEF,0x7E,0xF7,0xBD,0xEF,0x7B,0xDE,0xF7, +0xBD,0xEF,0xFF,0xD5,0xFF,0xBF,0xFF,0xEF, 0xFE,0xFF,0xFC,0x3F,0x0F,0xE7,0xFE,0x7F, +0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFE, 0xF3,0xFF,0xFE,0xDF,0xAD,0xDF,0x67,0xEE, +0xFB,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF,0xFB, 0xFE,0xFF,0xBF,0xEF,0xFF,0x23,0xFF,0xFF, +0xFF,0xFF,0x7F,0xFF,0xF3,0xBC,0xDB,0xFE, 0xFB,0xFF,0xFB,0xBE,0xF7,0xFB,0xFF,0x7F, +0xDF,0xFF,0xCF,0xFB,0xFF,0x9F,0xE3,0xF9, 0xBE,0x3F,0x8F,0xE7,0x79,0xFF,0x9D,0xE7, +0xF9,0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x5F, 0xFF,0xCF,0xF7,0xFF,0xFF,0xFF,0xDF,0xF7, +0xFE,0x7F,0xE7,0xF9,0xFE,0x7F,0xFF,0xFF, 0xFB,0xFE,0xFF,0xFF,0xBF,0xFF,0xBF,0xBF, +0xFF,0xFE,0xFF,0xBF,0xEF,0xFF,0xFD,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFD,0xFF, +0xFF,0x3F,0xFF,0xBF,0xFF,0xF7,0xFF,0xFF, 0x7F,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xE8,0xEF,0xFF, 0x5F,0xF7,0xBF,0xF9,0xFE,0xDF,0xB7,0xFD, +0xFF,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7, 0xFD,0xFF,0xDD,0xFF,0xF2,0xFF,0xBF,0xFF, +0xFF,0xBF,0xFF,0xFF,0x2F,0xF2,0xFF,0xBF, 0x2F,0x7B,0xD2,0xF7,0xBF,0x2F,0xFF,0xBB, +0xFF,0xEE,0x8F,0xAF,0xEB,0xFA,0xFE,0x3F, 0xA7,0x69,0xCE,0x8F,0xA4,0xEA,0xFA,0xEE, +0xB7,0xAE,0xEB,0xFD,0xC7,0xFF,0xF7,0xF7, 0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0x3E,0xF3, +0x74,0xFF,0x3F,0x4F,0xFF,0xE7,0xFF,0x3F, 0xFE,0xA7,0xFF,0xFF,0xDF,0xF7,0xB7,0xFF, +0xF7,0xFF,0xBA,0xEF,0x37,0xEB,0xFB,0xFE, 0xBF,0xFB,0xFE,0xF3,0xFF,0xF9,0xDF,0xFF, +0xBF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF, 0xFD,0xDF,0xFF,0xFD,0xFF,0xFF,0xFB,0xFE, +0xFD,0xFF,0xFB,0xBF,0xFE,0x3F,0xED,0xFF, 0xDF,0xBE,0x3D,0xA7,0xFB,0xFA,0x3F,0xE6, +0xE1,0xFE,0xFE,0x3F,0xEF,0xE3,0xDF,0xF5, 0x7F,0xFE,0xFF,0x7E,0xFF,0xFF,0xFF,0xFF, +0xEF,0x6F,0xF6,0xFF,0x7D,0xEF,0xD7,0xDE, 0xFF,0x7D,0xEF,0xFF,0xF2,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0x7B,0xDE,0xFB,0xE6,0xEE, 0xEF,0x37,0x6E,0xF3,0x7E,0xEB,0x37,0xEF, +0xFF,0xC1,0xFF,0xFE,0xFF,0xF7,0xEF,0xFF, 0xFF,0xFF,0xBF,0x3F,0xD2,0xDF,0xBF,0x2F, +0x7B,0xE2,0xFF,0xFE,0x3B,0xBD,0xDB,0xFF, 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE, +0xFF,0xFB,0xFF,0xFF,0xBF,0xFF,0xFB,0xDF, 0xFF,0xBF,0xFF,0xB7,0xFF,0xFF,0xBF,0xEF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF, 0x7F,0xFF,0x1F,0xEF,0xF1,0xFD,0xFF,0xF6, +0xAF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF, 0xFF,0xFF,0xFE,0x9F,0xFF,0xFF,0xFF,0x77, +0xEF,0xF7,0xFB,0xFF,0xFE,0x5F,0xFF,0xFF, 0xBF,0xCF,0xFB,0xF7,0xDD,0xF7,0xF5,0xFF, +0x5F,0xD5,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5, 0xFF,0xFB,0x0F,0xFF,0xFF,0xA9,0xEA,0x7A, +0xFF,0xAF,0x8F,0xFE,0xDF,0xAF,0xEF,0xFB, 0xFE,0xFF,0xBF,0xEF,0xFB,0xDF,0xE5,0x5F, +0xFF,0xFF,0xFF,0xFF,0xFF,0xBD,0x57,0xFF, 0xFF,0x6F,0x77,0xBF,0xF7,0xFB,0xFF,0x7F, +0xBF,0xF7,0xFF,0xFC,0xBF,0xFF,0x9F,0xFF, 0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF,0x1F, +0xCF,0xFF,0xFC,0xFF,0xFF,0xFF,0xFF,0xFB, 0x65,0xAF,0xF3,0x7C,0xFF,0x3F,0xDF,0xFF, +0xFD,0xE9,0xFE,0x7F,0xE7,0xFF,0xFE,0x7F, 0xFF,0xFF,0xFF,0xFF,0xFD,0xE3,0xDF,0xFB, +0xDB,0xF6,0xFD,0xEF,0x5B,0xFB,0xFF,0xDF, 0xFC,0xFF,0x3F,0xDF,0xF3,0xFD,0xFF,0x7F, +0xDF,0xEF,0x66,0xFF,0xDF,0xAD,0xEB,0x7A, 0xDE,0xF7,0xF7,0xE7,0xD9,0xFD,0x9F,0x67, +0xD9,0xF6,0x7D,0x9F,0xE7,0xDF,0xF5,0x47, 0xFD,0x65,0x5B,0xD6,0xF4,0xFE,0xFF,0xEF, +0xFF,0x6D,0xF6,0xDD,0xB7,0x6D,0xDB,0x76, 0xDC,0xB7,0x7D,0xFA,0x9B,0xF6,0x6D,0x9D, +0x67,0x59,0xDF,0xF7,0xDD,0xFF,0xEB,0xFE, 0xBF,0xAF,0xEB,0xFA,0xFE,0xBF,0xAF,0xE3, +0xD1,0x9F,0xFF,0xBD,0xBF,0xEF,0xFE,0xF7, 0xBF,0xBF,0xF7,0xD7,0x7F,0xDD,0xF7,0x9D, +0xDF,0x7F,0xDF,0xF7,0xFF,0xE0,0x7F,0xFD, 0xC1,0xDF,0xF7,0xFD,0xC7,0x7F,0x7F,0xFB, +0xFF,0xBB,0xEC,0xFB,0x3E,0xFF,0xBF,0xEC, 0xFB,0xFF,0xD8,0x7F,0xBF,0x6C,0xFF,0xBE, +0xFF,0xBF,0xED,0xFF,0xEF,0xFE,0xFB,0xBF, 0xEF,0xFB,0xFE,0xFF,0xBF,0xEE,0xFF,0xC5, +0xFF,0xAF,0x6F,0xFF,0xFC,0xFD,0x3F,0xE7, 0xFF,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF, +0xEF,0xFB,0xFE,0xBF,0x89,0xFE,0xFA,0xBA, 0xFE,0xBF,0xAF,0xFB,0xF6,0xF5,0xD9,0x7D, +0x97,0x65,0xD9,0x74,0x5D,0x97,0x65,0xD3, 0xFE,0xD6,0xFF,0xBF,0xF7,0xFD,0xFF,0x7F, +0xBF,0xCF,0xFB,0xFE,0xFF,0xEF,0xFB,0xFE, 0xFF,0xBF,0xEF,0xFB,0xFF,0xF6,0x8F,0xFB, +0xFF,0xEF,0xFB,0x7E,0xDB,0xFE,0xFF,0xBE, 0xEF,0xEE,0xFB,0xBE,0xEF,0xBB,0xEE,0xFB, +0xBE,0xFF,0xFF,0xDF,0xFF,0x43,0xFF,0xFF, 0xFB,0xEF,0x5F,0xB7,0xFE,0x7F,0xE7,0xF9, +0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xF9, 0xBF,0xFE,0xAF,0x77,0xFD,0xFF,0x2F,0xAF, +0xA7,0xFE,0xFF,0xEF,0xFB,0xFE,0xFF,0xBF, 0xEF,0xFB,0xFE,0xFF,0xF1,0x7F,0xEF,0xDF, +0xFF,0x97,0xF5,0xEF,0xFF,0xDF,0xFF,0xFF, 0xBF,0xFF,0xBF,0xFF,0xFF,0xFE,0xFF,0xFF, +0xFF,0xE0,0xFF,0xFF,0xF9,0xFE,0x2F,0x8B, 0xE3,0xF8,0xBE,0x77,0x9F,0xF9,0xDA,0x77, +0x9D,0xE7,0x79,0xDE,0x77,0x9F,0xDD,0xFF, 0xFD,0xFD,0x7F,0x5F,0xD7,0xFD,0xFF,0x7F, +0xE7,0xFE,0x7F,0x97,0xE7,0xFB,0xFE,0xFF, 0xBF,0xEF,0xFF,0xAB,0xFF,0xEF,0xFA,0xFE, +0xBF,0xAF,0xFF,0xFA,0xFF,0xFF,0xDF,0xFF, 0xFB,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF, +0x67,0xFF,0xF7,0xF5,0xFF,0xFF,0xFF,0xDF, 0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xBD, 0xEB,0xFF,0xFF,0xF7,0xAD,0xEB,0xFF,0xDF, +0xFD,0xFF,0x3F,0xDF,0xF7,0xFD,0xFF,0x7F, 0xDF,0xFF,0x5F,0xFF,0xF7,0xFF,0xFF,0xFD, +0xBF,0xFF,0xCB,0xF4,0xFF,0x7F,0xD3,0xF7, 0xFD,0x3F,0x7F,0xD3,0xF7,0xFF,0xFC,0x3F, +0xFF,0xEA,0xFA,0xBE,0xAF,0xAB,0xEB,0xBA, 0xF4,0x95,0x6B,0x52,0xD4,0xAD,0x2F,0x4A, +0xD2,0xF6,0xBF,0xD2,0x7F,0xF7,0x3F,0xFF, 0xFF,0xF3,0x7F,0xFF,0xFF,0xF7,0xFF,0xBA, +0xDF,0xFB,0xFD,0xFF,0xBF,0xFF,0xFB,0xFF, 0xF8,0x7F,0xEA,0xFF,0xFE,0xFE,0xDF,0xFF, +0xF7,0xFF,0x7F,0xBB,0xFF,0xFF,0xBF,0xDF, 0xFB,0xFF,0xFF,0xBF,0xFF,0xB1,0x7F,0xFF, +0xFB,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBF, 0xCF,0xFE,0xFF,0xFF,0xEF,0xFF,0xF7,0xFF, +0xFF,0xFF,0xF1,0xFF,0x69,0xBE,0xFA,0xBF, 0xAF,0xE2,0xFF,0xFE,0xFD,0xAF,0xF3,0xFE, +0xFF,0xBF,0xEF,0xFB,0xFC,0xFF,0xFF,0x07, 0xFD,0x95,0xDB,0xDF,0x7F,0xDF,0xAF,0xFF, +0xF7,0xAF,0x36,0xFE,0xBF,0x65,0xEB,0xF6, 0xFE,0x9F,0x6F,0xFE,0x07,0xFF,0xCF,0xFF, +0xF8,0xFE,0xFF,0xCF,0xFF,0xF6,0xFA,0xE7, 0xFB,0xFE,0xFF,0xBB,0xED,0xF9,0xFF,0xFF, +0xFF,0x5F,0xFF,0xFF,0xFF,0x75,0xFF,0xEF, 0x7E,0xFD,0xE0,0xE8,0x5E,0xD3,0xE5,0xF9, +0x3E,0x5F,0xD7,0xF7,0xFF,0xFA,0x2F,0xFB, 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0x7F, +0x7F,0xD7,0xF5,0x7D,0x5F,0x57,0xD5,0xF5, 0xEF,0xFF,0xF3,0x7F,0xFC,0x7F,0xFF,0xC7, +0xF1,0xFF,0xFF,0x1F,0xCF,0xB0,0xFF,0x3F, 0xCF,0xF3,0xFC,0xFF,0x3F,0xCE,0xFF,0xE4, +0xFF,0xDF,0x7F,0xFE,0xF7,0xBB,0xFF,0xFF, 0xDF,0xEF,0xEE,0xFF,0xBF,0xEF,0xFB,0xFE, +0xBF,0xBF,0xEF,0xFF,0xD1,0xFF,0xFF,0xFF, 0xFD,0xFB,0xFF,0xFD,0xFF,0xFB,0x9F,0xE9, +0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0xBF, 0xFF,0xB3,0xFF,0xFF,0xF7,0xFF,0xFF,0xAF, +0xF7,0xFF,0xB6,0x3F,0xEB,0xFA,0xFE,0xBF, 0xAF,0xEB,0xFA,0xFE,0xBF,0xFE,0xA7,0xFF, +0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF, 0xFE,0x9F,0xF7,0xF9,0xFF,0x7F,0x9F,0xE7, +0xFF,0xFF,0xFE,0xAF,0x6F,0xFF,0xFF,0xFF, 0x9F,0xFF,0xDF,0xFF,0x7D,0x5F,0xDD,0xFF, +0xFB,0xBF,0xE7,0xBB,0xFF,0xFB,0xDF,0x6D, 0x5F,0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xEB,0xF7,0xFF,0xE7,0xEF,0xF7,0xFF,0xFF, 0x7F,0xFF,0xF7,0xFF,0xFC,0x8F,0xFF,0xEF, +0xFD,0xFE,0xFF,0xBE,0xF4,0xF2,0x7D,0xD7, 0xCF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xCF,0x6B,0xFF,0xBF,0x3F,0xFB,0xF2, 0xFC,0x7F,0xEB,0xFF,0x9F,0xFA,0xFF,0xFF, +0x3F,0xFF,0xF3,0xFF,0xFF,0xFD,0x70,0xF7, 0xFF,0xFF,0xBF,0xFF,0xFB,0xD7,0xFE,0xF5, +0x77,0xFF,0x15,0xDD,0x77,0xFD,0xFF,0x7F, 0xDF,0xF7,0xFB,0xCD,0xBF,0xFF,0xFD,0xFF, +0xFF,0xDF,0x37,0xCD,0xF9,0xEC,0xFE,0xEF, 0xBB,0xF4,0xFB,0x3F,0x4F,0xB3,0xFF,0xFD, +0xCB,0xFF,0xE9,0x7E,0x54,0x9F,0xE5,0x4B, 0xB7,0xFF,0xDD,0x7D,0xC7,0x71,0xDD,0x77, +0x5D,0xD7,0x75,0xCD,0x7F,0xD6,0xFF,0xD3, 0xF6,0xF9,0x3F,0x6D,0x95,0xAF,0x7F,0xFE, +0xFF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, 0xFE,0xF6,0xC7,0xFF,0xAD,0x7B,0xCA,0xFF, +0xBF,0xBF,0xEF,0xFD,0xE3,0xDF,0xB7,0xED, 0xFB,0x7E,0xDF,0x37,0xED,0xE3,0xFB,0xDF, +0xFF,0x52,0x5C,0x15,0xFD,0xCF,0x7F,0xDF, 0xFE,0xEF,0xEF,0xFB,0xFE,0xFF,0xBF,0xEC, +0x7B,0xFE,0xFF,0xFE,0x3E,0x7F,0xDA,0xF7, 0xFD,0xFF,0x7F,0xFF,0xFF,0xFB,0xEF,0xBB, +0x6F,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF, 0xF7,0x7D,0xFF,0xD8,0xFF,0xFD,0xBF,0x7F, +0xFB,0xFF,0xFF,0x9F,0xFB,0xFE,0x7F,0x9F, 0xE7,0xF9,0xFE,0x7F,0x9F,0xEA,0x7F,0xF6, +0xBF,0xBD,0x6A,0x5A,0xF6,0xE5,0xBF,0x77, 0x5F,0x6D,0xDD,0x77,0x5D,0xD7,0x75,0xDD, +0x77,0xFF,0xA5,0xBF,0xCF,0xFB,0xFF,0xFF, 0xBF,0xCF,0xFB,0xFD,0xFF,0xBF,0xF3,0xFE, +0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD,0xAB, 0xFF,0xBF,0xBF,0xFF,0xFB,0xFF,0x7F,0xEF, +0xFF,0xBE,0xFB,0xEE,0xFB,0xBE,0xEF,0xBB, 0xEE,0xFB,0xBF,0xFF,0xB5,0xFF,0xD0,0xBC, +0xFD,0x2F,0x4B,0xF7,0xFF,0xFF,0x9F,0xF9, 0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x9F, +0xFA,0x8F,0xFD,0xAB,0xFA,0xDA,0xBF,0xAF, 0xB3,0xFD,0xFF,0xBF,0xFB,0xFE,0xFF,0xBF, +0xEF,0xFB,0xFE,0xF7,0xBF,0xFF,0x9F,0xFF, 0x77,0xF7,0xBD,0xFD,0x77,0xDF,0xFF,0x7E, +0xDF,0xED,0xBB,0xFE,0xFF,0xBE,0xEF,0xFB, 0xFE,0xFF,0xFA,0x3F,0xFF,0xBE,0x6F,0x8F, +0xE6,0xF9,0xFE,0x7F,0x9F,0xC7,0xFE,0x7F, 0x9F,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7,0xFB, +0x7F,0xFF,0x7F,0xCF,0xFF,0xFD,0xFF,0xFF, 0xDF,0xFB,0xAF,0xBF,0xEF,0xFF,0xFE,0xFF, +0x9F,0xEF,0xFB,0xFF,0xFC,0xFF,0xFB,0xFE, 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xF7, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xF5,0xFF,0xFF,0xFF,0x3F,0xDF,0xF7, +0xFF,0xFF,0x7F,0xEF,0xFE,0xFF,0xBF,0xFF, 0xFB,0xFF,0xFF,0xBF,0xEF,0xFF,0xB3,0x7F, +0xFF,0x7B,0x5E,0xF7,0xFD,0xFF,0x7B,0x7F, 0xF7,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F, +0xDF,0xF7,0xFF,0x17,0xFF,0xFF,0xFF,0x7F, 0xFF,0xFF,0xDD,0xF6,0xFC,0xBF,0xCB,0xF2, +0xBC,0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xFE, 0x8F,0xFF,0xFA,0x7E,0xBF,0xA7,0xEB,0xDA, +0xFC,0xBF,0xAF,0x7A,0xFE,0xBF,0xAF,0xEA, 0xFA,0xFE,0xBF,0xAF,0xF4,0xDF,0xFE,0xFF, +0xF3,0x3C,0x7F,0x3E,0xFF,0xCF,0xF8,0xBF, 0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xE7,0xE8, +0xFF,0xFC,0x9F,0xFF,0xFF,0xCF,0xEB,0xB3, 0xE7,0xFB,0x7B,0xF3,0xFE,0xFF,0xCF,0xDB, +0xFB,0xFB,0xBF,0x6F,0x6F,0xDF,0xEC,0x7F, 0xFF,0xFF,0xF7,0xFD,0xFD,0xFF,0xFF,0xFF, +0xFF,0xB2,0xBF,0xFF,0xDE,0xFD,0xBD,0xEF, 0xFB,0xF6,0xDF,0xEA,0xE7,0xDB,0xFE,0xBB, +0xFF,0xEB,0xFB,0xBF,0x9F,0x8F,0xE8,0xFE, 0x3F,0x8F,0xA3,0xF8,0xFE,0x3F,0x8F,0xFF, +0xF8,0x7E,0xFD,0xFD,0x7F,0xFF,0xFB,0xCD, 0xFF,0xFD,0xFF,0x5F,0xEF,0xFD,0xFF,0xFF, +0xDF,0xF7,0xFD,0xFF,0xBE,0x90,0xFF,0xFF, 0xEE,0xFF,0x3F,0xBF,0xF3,0xBB,0xFE,0xB7, +0xAB,0xFA,0xFE,0xAF,0xAD,0xEA,0xFA,0xDE, 0xAB,0xFF,0x63,0xFF,0xFE,0xF2,0xFF,0xB3, +0xFF,0xDF,0xEE,0x7D,0xFF,0x03,0xF1,0xF4, 0x3F,0x1F,0xC3,0xF1,0xEC,0x7F,0xFE,0x6F, +0xFF,0xFB,0xFB,0xFF,0x9F,0xFF,0xBF,0xFF, 0x7B,0x5F,0xFD,0xFF,0xDF,0xF7,0xFD,0xFD, +0x7F,0x7F,0xDF,0xFE,0xCF,0xFB,0xFF,0xFF, 0xAF,0xFB,0xFF,0x1F,0xEF,0xA5,0xFD,0xBF, +0xDF,0xFB,0x7D,0xFF,0xBF,0xDF,0xFB,0xFF, 0xFD,0x3B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, +0xAF,0xF3,0xFF,0xFB,0x7F,0xBF,0xD7,0xFB, 0xBF,0x7F,0xBB,0xF7,0xFF,0xF8,0x7F,0xFF, +0xFA,0x5F,0xD7,0xFF,0xDF,0x7F,0xEF,0xFF, 0xFF,0x7F,0xDB,0xF7,0xFD,0xFF,0x7F,0xDF, +0xB7,0xFB,0xEC,0xFF,0xFF,0xF7,0xBF,0xEF, 0xFD,0xFC,0xFB,0xFF,0xEF,0xF0,0xFE,0x3F, +0x8F,0xE3,0xF8,0xFE,0x3F,0x8F,0xEF,0x8D, 0xFF,0xFF,0xEF,0x7F,0xBF,0xFF,0xFB,0xFF, +0xDB,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xEF,0xD8,0xFF,0x2E,0x7F, +0xBE,0xEF,0xFE,0x6E,0xFF,0xBF,0xF9,0xFF, 0xFF,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFC,0x66,0xBE,0x47,0xF3,0x7F,0xDF,0xFE, 0x87,0x9F,0xFF,0xFF,0xFF,0xFF,0xE7,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x6F,0x7C, 0xFB,0x4F,0xD2,0xFF,0xFD,0x2B,0xFE,0xFF, +0xFF,0xFD,0x5F,0xD7,0xD5,0xF5,0x7D,0xFF, 0xFF,0xFF,0xBF,0x9B,0xFF,0xFF,0xDF,0xB7, +0xFF,0xFF,0xDF,0xFF,0x3F,0xCF,0xFE,0x7F, 0xBF,0xEF,0xFB,0xFC,0xFF,0x3F,0xFF,0xD9, +0xBF,0xFE,0x97,0xEC,0x8F,0xB7,0xFE,0x9B, 0x7D,0xFD,0xB7,0xDD,0x77,0x1D,0xC7,0x71, +0xDD,0x77,0x5D,0xD7,0xF3,0x6F,0xFD,0x3F, 0x73,0xDD,0xAF,0xFD,0x7A,0xFF,0xFF,0xAF, +0xFE,0xFD,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF, 0xEF,0x66,0x7F,0xFF,0xFF,0xBF,0xBF,0xFF, +0xFB,0xFF,0xF7,0xDF,0xFD,0xFB,0x7D,0xDF, 0xB7,0xCD,0xF3,0x7C,0x5F,0x3F,0x91,0x3F, +0xFF,0x3D,0xEF,0x7B,0xFF,0xFC,0xFF,0xCA, 0xEF,0xFE,0xFF,0xBD,0xEF,0xFB,0x1E,0xE7, +0xBB,0xEC,0x7F,0xB3,0xFF,0xFD,0x9F,0xFF, 0xFF,0xFE,0xFF,0xFF,0x7F,0xBF,0xFB,0xFE, +0xFF,0xBF,0xEF,0xFB,0xEE,0xFB,0xBF,0xDF, 0x67,0xFF,0xFF,0xBF,0xEF,0xDB,0xFF,0xBC, +0xFE,0x7F,0xFB,0xFF,0x9F,0xEF,0xF9,0xFE, 0x7F,0x9F,0xE7,0xF9,0xFE,0x87,0xFF,0xEE, +0xFB,0xBE,0xE5,0xBF,0xEF,0xF9,0xD7,0x65, 0xF7,0xDD,0xE7,0x7D,0xDF,0x77,0x5D,0xD7, +0x7F,0xF8,0x9B,0xFE,0xFF,0xBF,0xEF,0xFB, 0xFF,0xFF,0xBF,0xEF,0xFB,0xFF,0x7F,0xCF, +0xF3,0xFC,0xFF,0xBF,0xEF,0xFF,0xDB,0x3F, 0xEF,0xFB,0xFE,0xFF,0xDF,0xFF,0xFE,0xFB, +0xBB,0xEF,0xBF,0xEF,0xBB,0xEE,0xFB,0xBE, 0xEF,0xBB,0xFF,0xFC,0x7F,0xFD,0x3B,0x5B, +0xD6,0xE5,0xFD,0x4F,0xC3,0xFB,0xFF,0xBF, 0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFF, +0xB4,0xFF,0xFA,0xBC,0x8F,0xB2,0xE9,0xD2, 0x2E,0xCF,0xFB,0xFF,0xBF,0xEF,0xFB,0xFE, +0xFF,0xBF,0xEF,0xFB,0xFF,0xEC,0xFF,0xFD, 0xFD,0x7F,0xDF,0xF7,0xE4,0xDF,0x5F,0xFF, +0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xC3,0xFF,0xEF,0xE6,0xF8,0xFE, +0x3F,0x8B,0x83,0xF9,0xFE,0x7F,0xE7,0xF9, 0xFE,0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x17, +0xFD,0xFF,0xFF,0xFF,0x7F,0x5F,0xF7,0x2C, 0xFF,0xFF,0xFF,0xFE,0x7F,0xFF,0xE7,0xF9, +0xFE,0x7F,0x9F,0xFE,0x2F,0xFF,0xFF,0xEF, 0xFF,0xFE,0xBF,0xEF,0xAD,0xFF,0xFF,0x7F, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFE,0xDF,0xFF,0xDF,0xFF,0xFD,0xFD,0x7F, +0xDF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0x3F,0xFE, +0xF7,0xFD,0xEF,0x7A,0xFF,0xB1,0xBD,0xFF, 0x7F,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7,0xFD, +0xFF,0x7F,0xF3,0x27,0xFF,0xDF,0xFF,0xDD, 0xFF,0xFC,0x9B,0xFF,0xCB,0xFC,0xBF,0x2F, +0xCB,0xF2,0xFC,0xBF,0x2F,0xC9,0xFF,0xDE, 0xFF,0xDF,0xAF,0xEB,0xDA,0xFE,0xBB,0xAF, +0xEB,0xF8,0xF7,0xAF,0xE8,0xFA,0xFE,0xBF, 0xAF,0xEB,0xF2,0xFF,0xFD,0xFF,0xFF,0xEF, +0xBD,0xD7,0xBF,0xFF,0xFF,0xDE,0x8F,0xB8, 0xDE,0x37,0x8D,0xA3,0x78,0xDA,0x3F,0x8F, +0xFF,0xA1,0xFF,0xFF,0xFB,0xFB,0xFF,0xFF, 0xFF,0xFF,0xA7,0xBD,0xFB,0x76,0xFD,0xBF, +0xEF,0xDB,0xFE,0xBB,0xBF,0xFE,0x27,0x7F, 0xFF,0xFE,0xFE,0xFD,0xF5,0xFF,0xEF,0xF5, +0xDF,0x1F,0xE7,0xFD,0xFF,0x7F,0xDF,0xF7, 0xFD,0xFF,0xFF,0xCD,0xFD,0xAE,0xFF,0xFA, +0x3E,0x3F,0xAB,0xFD,0xF8,0x7E,0x8F,0xE3, 0xF8,0xFE,0x3E,0x8F,0xE3,0xF8,0xFF,0xFE, +0x1F,0xEF,0xDF,0xBF,0xFE,0xDE,0xDF,0xD9, 0xFF,0xDF,0xBC,0xFF,0xFF,0x7F,0xFF,0xEF, +0xFD,0x7F,0xDF,0xF7,0xF9,0x3F,0xFE,0xFF, 0xFF,0x6F,0xFE,0xDE,0xBF,0xF7,0xED,0xEA, +0xFD,0x8F,0x83,0xF8,0xEA,0x3F,0x8F,0xEF, 0xFF,0xF4,0x7F,0xFF,0xEF,0xEF,0x7B,0xF3, +0xF1,0x5F,0xFF,0xFF,0xF1,0x3B,0x7F,0xDF, 0xF7,0xFD,0xFF,0xFF,0xFF,0xFF,0xE0,0xFF, +0xFF,0xFF,0xF7,0xFF,0x6F,0xFF,0x7F,0xFF, 0xFF,0xF7,0xDE,0xF7,0xBF,0xEF,0xFB,0xF7, +0xFD,0xFF,0xFF,0xF5,0xFA,0xFF,0xFF,0xFB, 0xE7,0xFF,0xF3,0xF8,0x7F,0xF3,0xDF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xEF, 0xBB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, +0xFF,0x7F,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xCF,0xFF,0x37,0xFF,0xFF, +0x7F,0xDF,0x77,0x5D,0xE7,0xFC,0xFF,0xBF, 0xF7,0xF5,0xFB,0xFF,0xFF,0xD7,0xF5,0xFB, +0xFF,0xFF,0x45,0xFD,0x7F,0xEA,0xFD,0xBE, 0xBF,0xDF,0xF7,0xFF,0xFF,0xDB,0xFB,0xFE, +0xFF,0xBF,0xEF,0xFF,0xFF,0xFF,0xFB,0x5F, 0x7F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFE,0xFF,0xEF,0xFD,0xFF,0x7F,0xDF, 0xFF,0xEF,0xFB,0xF8,0x0F,0xF3,0xFF,0xF9, +0x2E,0xFB,0xFE,0xFC,0xF3,0xEF,0xFF,0xFF, 0xBF,0xFF,0xFB,0xE7,0xFF,0xFE,0x7E,0xFF, +0xC0,0x6B,0xCF,0xFF,0x34,0xDF,0xF1,0xFD, 0xFF,0xEF,0xFF,0xFF,0xFF,0xDF,0xF7,0xFD, +0xCF,0x7F,0x9C,0xFD,0xFD,0x6C,0xF7,0xFF, 0xF6,0xFD,0xEB,0x2B,0x9F,0xFF,0xFC,0xFE, +0x7E,0xFF,0xFF,0xFF,0xFF,0xD7,0xF3,0xF7, 0xFF,0xFB,0xE1,0xBF,0xFF,0xEB,0x7A,0xDE, +0xD7,0xFB,0xFF,0xF9,0xFE,0xFF,0xFF,0xF3, 0xDE,0x7F,0xFD,0xE7,0x7F,0xFF,0xFD,0xBB, +0xFF,0xFF,0x7E,0xCC,0xF6,0xAF,0x5F,0x7F, 0xFE,0xF4,0x7D,0xF7,0xFD,0xBB,0x6E,0xDB, +0xB7,0xFF,0xF7,0xDF,0x66,0xFF,0xFF,0xF7, 0x3D,0xCF,0xDE,0xBD,0xFF,0xFF,0xDE,0xDB, +0x8D,0xF7,0x7E,0xDF,0xB7,0xEF,0x7F,0xFF, 0xF6,0x87,0xFF,0xFF,0xEF,0xFE,0xDE,0xBF, +0xFF,0xFF,0xFF,0xBB,0xEF,0xFD,0xFF,0x7B, 0xDE,0xF7,0x3F,0xFF,0xBF,0xFB,0xDB,0xFF, +0xF2,0xB6,0xFD,0xBD,0x7F,0xE7,0xFF,0xFF, 0xFF,0x6F,0xF7,0xFF,0xFF,0xFF,0xFE,0x77, +0xFF,0xBF,0xF8,0xAF,0xFF,0xDF,0xBF,0xFF, 0xBF,0x7F,0xFB,0xFF,0xFF,0xFF,0xDB,0xFE, +0xFF,0xBF,0xFF,0xFA,0xFF,0xFD,0xFF,0xF6, 0x7F,0xFF,0x9F,0xFF,0xFF,0x3F,0xEF,0xF8, +0xEE,0x7E,0x9F,0xBA,0xFE,0xBF,0x8F,0xEF, 0xFE,0xFE,0xF9,0xFF,0xFA,0x7F,0xFE,0x7E, +0xBF,0xAF,0xFB,0x96,0xFD,0x9F,0xEF,0x5E, 0x65,0xBE,0xEF,0x5B,0xB6,0xFF,0xBE,0xE3, +0xFF,0xB5,0xBF,0xFF,0xFD,0xFF,0x7F,0xFF, 0xEF,0xDF,0xFE,0xFF,0xBF,0xFB,0xFE,0xFF, +0xBF,0xCF,0xFF,0xFF,0xFF,0xFD,0x9B,0xFF, 0xFE,0xFB,0xFE,0xDF,0xFF,0x7F,0xFF,0xF7, +0xFE,0xFF,0xDF,0xFB,0xFB,0xFE,0xFF,0xFF, 0xFF,0xFF,0xFF,0xB7,0xFE,0xFA,0xFF,0xAB, +0xEF,0xFF,0xFD,0xB5,0x7B,0x7F,0xFB,0xF7, 0xFD,0xFF,0xFF,0xDD,0xFF,0xEF,0x8F,0xFF, +0x2F,0xFF,0xFB,0x7C,0xFF,0x3F,0xDF,0x73, 0xEB,0xFE,0x3F,0xFF,0xEF,0xFB,0xFE,0xFF, +0xEF,0xFD,0xFF,0xBF,0xFD,0x0F,0xFF,0xFF, 0xFF,0xF5,0xF9,0xFF,0x7F,0xD7,0xFD,0xFF, +0xDF,0xFF,0xF7,0xFB,0xFF,0x7F,0xBF,0xFF, 0xFF,0xF0,0x9F,0xFF,0xFE,0x7F,0x8B,0xE3, +0xF9,0xDE,0x27,0x9B,0xE6,0xBE,0x7F,0x9B, 0xC3,0xF8,0xDE,0x7F,0x9D,0xE7,0xFE,0x7F, +0xFF,0xFF,0x5F,0xD7,0xFF,0xFF,0xFF,0x4F, 0xFB,0xFF,0xFF,0x7F,0xFF,0xAF,0xFF,0x9F, +0x7F,0xFB,0xFF,0xE8,0xFF,0xFF,0xFE,0xBF, 0xAF,0xFF,0xFF,0xFE,0xBF,0xEF,0xF7,0xFF, +0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF, 0xFC,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF, +0xFD,0x3F,0xCF,0xFF,0xFF,0xFF,0xFF,0xF7, 0xFF,0xFD,0x7F,0xFF,0xFF,0x93,0xFF,0xFF, +0x7A,0xDF,0xF7,0xFF,0xFF,0x7B,0x7F,0xB7, 0xEF,0xFF,0xFF,0xFD,0xBF,0xFD,0xFB,0xFF, +0xF7,0xFF,0xD7,0xFF,0xFF,0xFF,0xFC,0x9F, 0x6F,0xCB,0xFF,0xF4,0xBB,0xDF,0xD6,0xFD, +0xBF,0x2F,0xD3,0xF7,0xFF,0xDF,0xFF,0xCF, 0xFF,0xFA,0xBE,0xBD,0xAF,0x6A,0xDA,0xBE, +0xBB,0xAB,0x3A,0xBE,0x2D,0xAE,0xEB,0xDA, 0xF6,0x3F,0xAD,0xF5,0xDD,0xFF,0xCF,0xF1, +0xFF,0xF9,0x7F,0xFF,0x73,0xFE,0xFF,0xCF, 0xC3,0xF4,0xF7,0x2F,0xF3,0xFF,0xFC,0xFF, +0x7C,0x1F,0xFF,0x3F,0x4F,0xFF,0x7E,0xFF, 0xEF,0xBD,0xF6,0xFE,0xFF,0x2B,0xEF,0xDC, +0xFB,0xFD,0xFF,0xFB,0xFF,0xEA,0x7B,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFB,0xF7,0xDF,0xFF, +0xE3,0x7D,0xFF,0xB7,0xFF,0xBF,0xFF,0xFF, 0xDF,0xFF,0xF8,0xFF,0xBF,0xFF,0xBF,0xEB, +0xE7,0xFA,0xFE,0x3D,0xBF,0xE9,0xFC,0xBF, 0xFF,0xFA,0xFB,0xFE,0xFF,0xFF,0xFF,0xD9, +0xFF,0xFF,0xFF,0xF6,0x7F,0xFF,0xF6,0x7D, 0xFF,0xDF,0xCF,0xFD,0xBF,0xFB,0xEF,0x7E, +0xFF,0x7F,0xFF,0xFF,0xD3,0xFF,0xFD,0xFB, 0xFF,0xFB,0xFF,0xFF,0xFF,0xEF,0xFF,0xBF, +0xFE,0xFF,0xF7,0xEF,0xFF,0xFF,0xFF,0xFB, 0xFF,0x87,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF, +0x7B,0xFE,0xFF,0xFE,0x3B,0xF7,0xF7,0xFF, 0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF, +0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xF7, 0xFF,0xFF,0xAD,0xFF,0xFE,0xF7,0xFF,0xFF, +0x5F,0xFF,0xFF,0xDF,0xFF,0xFD,0xFF,0xF5, 0xFF,0xDF,0xFF,0xBD,0xFF,0xE9,0xFF,0xC7, +0xF3,0xFF,0xFF,0xF7,0xFF,0xF3,0xFF,0xF8, 0x3B,0xFF,0xFF,0x7B,0xDF,0xBF,0xFB,0xEF, +0xFB,0xFF,0xFB,0xF7,0xF7,0xBB,0xFF,0xFF, 0xFF,0xFF,0xFB,0xFF,0xFE,0x7F,0xF3,0x7F, +0x5E,0xB7,0xBF,0xFD,0x7F,0xFF,0xF9,0x7F, 0xFB,0xFF,0xEB,0xFD,0x7F,0x7F,0xFF,0xEF, +0xFB,0xE0,0x3F,0xFE,0xBF,0xBF,0xDF,0xFF, 0x7E,0xFF,0xF7,0xFF,0xFF,0xFE,0xBF,0xFF, +0xDB,0x78,0xFF,0xFF,0xFF,0xEE,0xA1,0xBF, 0xF5,0xDE,0xFB,0xF7,0xFF,0xFB,0xFF,0xFF, +0xFF,0xFF,0xFB,0xFF,0xFF,0xD7,0xFF,0xFF, 0xFF,0xFF,0xEF,0xF0,0xFF,0xFF,0xFF,0xF3, +0xF7,0xFF,0xEF,0xFF,0xE7,0xCF,0xFF,0xFB, 0xFF,0xEF,0xFF,0xFF,0x9F,0x9F,0xEF,0xFC, +0x16,0xBF,0xFE,0xF3,0xE4,0xFF,0xFF,0xC6, 0xFF,0xE7,0xFF,0xFF,0xFD,0xFF,0xBF,0xFF, +0xFF,0x3F,0xFF,0xBF,0xD6,0xAF,0x7F,0xFE, 0x6B,0x7E,0x7F,0xFF,0xAF,0xFF,0xFF,0xBF, +0xFF,0x5F,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF, 0xFF,0xBD,0xDB,0xFF,0xFE,0x5F,0xF2,0xFF, +0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xEF,0x7F,0xFF,0xFF,0xFF,0xFF,0xDE,0xBF, +0xFF,0xFF,0xEF,0xFB,0x77,0xFE,0xBD,0x7F, 0x5F,0xFF,0xFF,0xFF,0xDF,0x6F,0xED,0xFF, +0xFD,0xFF,0x7F,0xFD,0x6F,0xFF,0xFF,0x77, 0xDA,0xCF,0xFD,0x5F,0xFF,0xBF,0xFF,0xFF, +0xDF,0x7F,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF, 0x66,0x7F,0xFF,0xFE,0xBF,0xE7,0xBF,0xFA, +0xFF,0xFE,0xFF,0xFF,0xFF,0xDF,0xFF,0x59, 0xEF,0xFF,0xEF,0xFB,0x7F,0x89,0xFF,0xFF, +0xE9,0xFF,0x6F,0xFF,0xF5,0xFF,0xFF,0xFF, 0xFF,0xFF,0x7F,0xF2,0xF7,0xFF,0xFF,0xEF, +0xF8,0x7F,0xFB,0xFF,0xFD,0xFF,0xFF,0xD9, 0xFF,0xEF,0xBB,0xFF,0xFF,0xFF,0xBF,0xEF, +0xDE,0xFF,0xFF,0x9F,0x7F,0xDF,0xFF,0xF7, 0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF,0xAF, +0xFF,0xFF,0xF7,0x3F,0xEB,0x9F,0xFE,0x7F, 0x9E,0x7F,0x9F,0xFE,0x87,0xFF,0xED,0xDB, +0x56,0xFF,0xBF,0xAF,0x0B,0xD2,0xFF,0xEF, 0xDB,0x6E,0x7D,0xBD,0x6F,0xF8,0xFE,0x3F, +0xFA,0x5B,0xFF,0xFD,0xBF,0xEF,0xFF,0xBF, 0x6F,0xDB,0xE6,0xFF,0xFF,0x3F,0xFF,0xDF, +0xFE,0xFF,0xFF,0xFF,0xFF,0xDA,0x3F,0xFF, 0xFB,0xFE,0xFE,0xFF,0xFF,0xDF,0xF7,0xBD, +0xFF,0xFD,0xFF,0xFE,0xFF,0xFB,0xFF,0xFF, 0xFF,0xFF,0xF1,0x5F,0xFD,0x9F,0xDF,0xFD, +0xFF,0xFD,0x7F,0xFF,0xFF,0xFF,0xFF,0x76, 0xFA,0xFF,0xFF,0x7F,0xE3,0xF8,0xFF,0xAE, +0xFF,0xFB,0x7E,0x9D,0x73,0xFF,0xFA,0x7F, 0xDF,0xFF,0xFF,0x7F,0xFF,0xFB,0xCD,0xFF, +0x7F,0xEF,0xFB,0xFF,0xFD,0xFF,0xF7,0x7F, 0x7F,0xEF,0xFF,0xED,0xFF,0xFF,0xFF,0xB5, +0xFF,0xBF,0xFF,0xBF,0xFD,0xEF,0xDB,0xF7, 0xFF,0x93,0xFF,0xEF,0xE2,0xF9,0xBE,0x7F, +0x8B,0xE7,0xF9,0xFE,0x6B,0xE7,0xF9,0xFE, 0x7F,0x9F,0xE7,0xF9,0xFE,0x7F,0x47,0xFF, +0xFF,0xFD,0xFF,0x9F,0xFF,0xD7,0xFF,0xFF, 0xFF,0xFF,0xF5,0xFF,0x9F,0xFF,0xF7,0xFE, +0xFF,0xBF,0xFE,0x6F,0xFF,0xFF,0xFB,0xFF, 0xFF,0xFF,0xAF,0xFF,0xFF,0xFF,0x7F,0xFB, +0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, 0xDF,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xDF, +0xFF,0xFF,0xFF,0x5F,0xFF,0xFF,0xFF,0xFF, 0x5F,0xFB,0xFE,0xFF,0xF8,0x37,0xFF,0xFF, +0xEF,0xFF,0x7F,0xFE,0xBF,0xFF,0xFF,0xFE, 0xBF,0xFF,0xFF,0x7F,0xFF,0xBF,0xFD,0xFF, +0x7F,0xFA,0x7F,0xFF,0xFF,0x6F,0xFF,0xFF, 0x7D,0xFF,0xCF,0xFF,0xFF,0xFF,0x4F,0xFF, +0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFA,0xBF, 0xFF,0xAE,0xEB,0xFA,0xFE,0xBB,0xAD,0xEB, +0xFA,0xF7,0xAF,0x6B,0xFA,0xF6,0xBF,0x25, 0xE9,0xF2,0x7F,0x45,0xFF,0xFF,0xFD,0xF7, +0xF7,0xBF,0xFF,0xDF,0xFF,0xFF,0xBF,0xFB, 0xFF,0xDF,0xF3,0xFF,0xF7,0x3F,0xCF,0xFF, +0xA1,0xFF,0xFF,0xBF,0xE7,0xFF,0xFF,0x7F, 0xFF,0x3D,0xFF,0xFF,0xFF,0xF7,0xFF,0x2F, +0xFF,0xFB,0xF5,0x7F,0xFE,0x57,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7, +0x3F,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD,0xFE, 0xF7,0xEE,0xAF,0xFE,0xEE,0xE7,0xFA,0xFF, +0xFE,0x9D,0xF9,0x5E,0xFE,0xFF,0xEB,0xFF, 0xFF,0xDF,0xA7,0xFF,0xFF,0xFF,0xFC,0xDB, +0xFF,0xFF,0xFF,0x7E,0xFB,0xFF,0xFF,0xEF, 0xFB,0xFD,0xFF,0xDB,0xFF,0xFF,0xFF,0xEF, +0xFF,0xFF,0xFF,0xFD,0xBF,0xFE,0xBF,0xFF, 0x6F,0x7F,0xFF,0xF7,0xFF,0xFF,0xF9,0xFF, +0xF7,0xFF,0xBF,0xDE,0xF7,0xFF,0xFF,0xFF, 0xFA,0x7F,0xFD,0xBF,0x5F,0xFF,0xFF,0xBF, +0xFF,0xED,0xFF,0xF7,0xBF,0xFF,0xFF,0xEF, 0xFF,0xDF,0xFF,0xFF,0xFF,0xE6,0xFF,0xFB, +0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEB,0xFF, +0xFD,0xFF,0xF5,0xFF,0xF6,0x7F,0xDF,0xBD, 0xCF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFF,0xFF, +0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3, 0xFF,0xEE,0xBF,0xFF,0x7D,0xEF,0xFE,0xFF, +0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xFF,0xFF,0xFF,0xFF,0xE7,0xFF,0xB5,0xAE, +0xFF,0xFF,0xB6,0xFE,0xBF,0xFF,0xFF,0xBF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0x27,0xFF,0xEF,0xFE,0x7F,0xDF,0xFF, 0x7E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFD,0xFF,0xF7,0xF9,0x9F,0xFF, 0x5F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F, +0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0x0F,0xFF,0xE7,0xBF,0xFE, +0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFC,0xBF, 0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xC4, +0x6B,0xFF,0x29,0x1F,0xFB,0xAF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xEF,0x1B,0xFE,0xFF,0xFC, +0x6F,0xFF,0xFF,0xFD,0x6A,0xF7,0xD7,0xF5, 0xBF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFE,0xBF,0xFF,0xFF,0xFA,0xFF,0xFF,0xF7, 0xFB,0xDD,0xBF,0xFF,0xE7,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0x7F,0xFF, 0xFF,0xF5,0xFF,0xFF,0xF7,0xFD,0xB3,0xEF, +0xFD,0x7E,0x5D,0xFF,0xFD,0xFF,0xFF,0xFF, 0xFD,0x7F,0xD2,0xF5,0xFB,0x7E,0xCB,0xB7, +0xFF,0xFF,0xFF,0xC6,0xFF,0xFD,0xEE,0x63, 0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xFD,0x65, +0x5B,0xDF,0xFF,0xD5,0xFF,0xFF,0xFF,0xF6, 0xE7,0xBF,0xF7,0xA9,0xFF,0xFF,0xED,0xFF, +0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFF,0xFF, 0xAF,0xFF,0xFF,0xFF,0xF8,0x1B,0xFF,0xE3, +0xD0,0xBF,0xFF,0xE1,0xFF,0xFF,0xFF,0xFF, 0xFF,0xD7,0xFF,0xFF,0xFF,0x5F,0xFF,0xFF, +0xFF,0xFF,0xAF,0xFF,0xDB,0x76,0xBF,0xFF, 0x7F,0xFF,0xBF,0xEF,0xFE,0xFF,0xBF,0xEF, +0xFB,0xFE,0xFF,0xFF,0xFF,0xBF,0xF2,0x7F, 0xFF,0x9F,0xFE,0xBD,0xFE,0x7F,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xF7,0x3F,0xEC,0x7F,0xF6,0x95,0xBB, +0xEF,0xF8,0xFE,0xFC,0xBF,0x2F,0xDA,0xFC, 0xBF,0x2F,0xCB,0xF2,0xFC,0xBF,0xEF,0xFF, +0xA9,0xBF,0xCF,0xFB,0xFF,0xFF,0xFF,0xFE, 0xDD,0xB7,0x6D,0xF6,0xD9,0xB6,0x6D,0x9B, +0x76,0xD9,0xBF,0xFB,0xFD,0xA3,0xFF,0xBF, 0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0x7F,0xDF, +0xFD,0xEF,0x7B,0xDE,0xF7,0xFD,0xEF,0x7F, 0xFF,0xFF,0x05,0xFF,0xFA,0xFE,0x7F,0xEF, +0xE3,0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xFF, 0xFF,0x5F,0xFF,0xFF,0xFD,0x7F,0xFB,0xAF, +0xFF,0x63,0xC8,0xFF,0xBF,0xEF,0xFF,0xFF, 0xFA,0x7F,0xFF,0xFF,0xFF,0xFE,0x9F,0xF7, +0xFF,0xFA,0xBF,0xFE,0x9F,0xFB,0x7F,0xFF, 0xFF,0xEF,0xD7,0xFF,0xFF,0xF5,0xFF,0xFF, +0xFF,0xFF,0xFD,0x7F,0xFF,0xFF,0xBF,0xFF, 0xF9,0xBF,0xFF,0xBE,0x27,0x9F,0xE7,0xF9, +0xFE,0x7F,0x8B,0xE7,0xFE,0x7F,0x9F,0xE2, 0xF9,0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF, +0xFF,0xFF,0xFB,0xFE,0xFF,0xFF,0xFF,0xD7, 0xFF,0xFF,0xFF,0xFF,0xF5,0xFF,0xFF,0xFF, +0xD7,0xFF,0xFA,0xFF,0xFE,0xFF,0xFF,0xFF, 0xFD,0xFF,0xFF,0xFF,0xAF,0xF7,0xFF,0xFF, +0xFF,0xEB,0xFF,0xFF,0xFF,0xAF,0xFF,0xC4, 0xFF,0xF7,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, +0xFF,0x5F,0xFF,0xFF,0xFF,0xFF,0xD7,0xFF, 0xFF,0xFF,0xFF,0xFF,0xEB,0xFF,0xFB,0x7A, +0xDF,0xF7,0xFD,0xFF,0xFF,0xFE,0xBF,0xFF, 0xFF,0x7F,0xFF,0xAF,0xFF,0xFF,0xFF,0xF7, +0xEF,0xE3,0xFF,0xDD,0xD2,0xFF,0xDF,0xFF, 0xFF,0xF2,0xFC,0xBF,0xCB,0xF6,0xFD,0xBF, +0x2F,0xCB,0xFF,0x7F,0xDF,0xDE,0xAF,0xFF, 0xDA,0xEE,0xBF,0xAF,0xE9,0xFA,0xF4,0xBD, +0xAF,0x5A,0xAE,0xBB,0xAB,0x6B,0xDA,0xDE, 0xBF,0xAD,0xD7,0x5E,0xFF,0xFF,0xBF,0xFC, +0xFF,0xDF,0xFD,0xFF,0xFF,0xFF,0xFF,0xDF, 0xF7,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFA, +0x1F,0xFF,0xFE,0xFB,0xEF,0xBF,0xFD,0xFF, 0xFD,0xBD,0x77,0xFF,0xFF,0xFF,0xFF,0x9D, +0xEF,0xFF,0xFF,0xFF,0xEF,0x7D,0xFF,0xFB, 0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, 0xBF,0xE4,0xFB,0xFF,0xFE,0x3F,0xFE,0xFF, +0xFF,0xFF,0xFF,0xAF,0xEA,0xFE,0xBF,0xAF, 0xEB,0xFA,0xFE,0xFF,0xFF,0xFF,0x55,0xF6, +0xFF,0xFE,0xF7,0xFF,0x7F,0xFF,0xEB,0xF7, 0x5F,0xC5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF, +0x6F,0xFB,0xFF,0x8A,0xFF,0xFF,0xFF,0xFF, 0xEB,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0xBF, +0xEF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF, 0x77,0xDF,0xFB,0xFF,0xFD,0x7F,0xEF,0xFF, +0xFF,0xFF,0xBF,0x7F,0xFF,0xDF,0xBF,0xFF, 0xFB,0xFF,0xFF,0xFF,0xFE,0xEF,0xDF,0xFF, +0xFE,0xFF,0x9F,0xEF,0x7D,0xFF,0xF7,0xFF, 0x7F,0xFF,0xFF,0xDF,0xF7,0xFD,0xFF,0xEF, +0xDF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFB, +0xFD,0xFF,0xBF,0xDF,0xD1,0xFF,0xF8,0x3B, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x7E,0xDB,0xFD,0xFF,0x77,0xDB,0xB7,0x7D, 0xBF,0xFB,0xFF,0xF8,0x7F,0xED,0x7B,0x5E, +0xFF,0xFE,0xFF,0xFF,0x4F,0xD7,0xFD,0x7F, 0xDF,0xD7,0xF5,0xFF,0x7F,0xFF,0xFF,0xFF, +0xF2,0x3F,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF, 0xFF,0xBF,0xEF,0xFE,0xFF,0x3B,0xEE,0xFF, +0xFC,0xEF,0xFF,0xFF,0xFF,0x85,0xFF,0xFD, 0xFE,0xFF,0xF5,0xFF,0xFF,0xFE,0xFF,0xDF, +0xFB,0xFF,0x5F,0xBF,0xFF,0xFD,0xFF,0xFF, 0xFF,0xFF,0xA8,0xFF,0xFF,0x9F,0x9E,0xFF, +0xFF,0xFF,0x7F,0xF3,0xFF,0xFF,0xCF,0xFF, 0xF7,0xFD,0xFF,0x7F,0xFF,0xFF,0xFC,0x16, +0xBF,0xCF,0xA3,0xE5,0xEF,0x7F,0xFF,0xF3, 0xE4,0xFF,0xCF,0x93,0xFC,0xFF,0x3F,0xCF, +0xFF,0xFF,0xFF,0xD6,0x0F,0x7D,0xBF,0x6E, 0xFB,0xF4,0xFC,0xAF,0x6D,0xDB,0x77,0xB7, +0x6D,0xDB,0xF6,0xFD,0xBF,0xFF,0xFF,0xFF, 0xBF,0x9B,0xFA,0xDE,0xB7,0xB7,0xED,0xF9, +0x7E,0xB7,0xAC,0xEB,0xD6,0xB3,0xAD,0xEB, 0x7A,0xDF,0xFF,0xFF,0xFF,0xD8,0xBF,0xFF, +0xB7,0xED,0x9F,0x6F,0xDD,0xF7,0x68,0xDB, 0x37,0xB3,0x6C,0xDB,0x36,0xCD,0xB3,0x7F, +0xFF,0x7F,0xF5,0x6F,0xFD,0xEF,0x79,0x3D, 0xF7,0x93,0xE4,0x7A,0x9E,0xAD,0xEA,0x7A, +0x9E,0xF7,0xBD,0xEF,0xFF,0xFF,0xFF,0x76, 0x7F,0xFB,0xC6,0xFF,0xBB,0xEF,0xDA,0xFE, +0xFD,0xBF,0xFB,0xFE,0xFF,0xBF,0xEF,0xFB, 0xFF,0xFF,0xFB,0xFF,0xA5,0xFF,0xFD,0xAB, +0x6F,0x78,0xDE,0x17,0x8F,0x79,0xDF,0xFD, 0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xFF,0xFB, +0xFF,0xFB,0xFF,0xEF,0xFB,0xEF,0xFB,0xFE, 0xFF,0xBB,0xDA,0xF3,0xEF,0x3B,0xCE,0xF3, +0xBC,0xEF,0x3F,0xCF,0xDF,0xFF,0xB7,0xFF, 0xFF,0xFF,0xCF,0x73,0xFF,0xBF,0xEF,0xFF, +0xF3,0xFF,0x3F,0xCF,0xF3,0xFC,0xFF,0x3D, 0xCF,0x9F,0xFE,0x07,0xFF,0xAF,0xEB,0xFE, +0xFD,0xBF,0xEF,0xEB,0xFA,0xFF,0xAF,0xEB, 0xFA,0xFE,0xBF,0xAF,0xFB,0xFE,0x3F,0xFB, +0x9B,0xFF,0x7F,0xDF,0xFF,0xF3,0xFE,0xFF, 0xDE,0xF7,0xBF,0x7B,0xDE,0xF7,0xBD,0xEF, +0x7B,0xFE,0xFF,0xFF,0xDF,0x3F,0xFE,0xFF, 0xB7,0xFF,0xEF,0xF7,0xFF,0xBF,0xED,0xFE, +0xDF,0xB7,0xED,0xFB,0x7E,0xDF,0xFF,0xFF, 0xFF,0xFD,0x5F,0xEF,0xEB,0xFA,0xFE,0xF5, +0xBF,0x6F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFE,0xF8,0xFF,0xA8,0xFF, +0xFF,0xBF,0xEF,0xFB,0x6A,0xFB,0xB7,0xEF, 0xFB,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xBF, +0xEF,0xFB,0xFF,0xE0,0xFF,0xFF,0xFD,0x7F, 0x5C,0xD7,0x7D,0xDF,0xF3,0x5C,0xF5,0xCD, +0x73,0x5E,0xD7,0xB5,0xFD,0x7F,0xEF,0xFF, 0xDB,0xFF,0xFF,0xE2,0xF8,0xBE,0x2F,0x8F, +0xE7,0xF8,0xBE,0x6B,0xE2,0xF8,0xBE,0x2F, 0x8B,0xE2,0xF9,0xFE,0x7F,0xE7,0xFF,0xD7, +0xF5,0xFD,0x7F,0xFF,0xF7,0xF5,0xFD,0x7F, 0xD7,0xF5,0xFD,0x7F,0x5F,0xD7,0xF5,0xFF, +0xFF,0xFF,0x8F,0xFF,0xAF,0xEB,0xFA,0xFF, 0xFF,0xBF,0xEB,0xFA,0xFF,0x2F,0xEB,0xFA, +0xFE,0xBF,0xAF,0xEB,0xFF,0xFF,0xFE,0x5F, 0xFF,0x5F,0xFF,0xFF,0xFD,0xFF,0xFF,0xD7, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xBF,0xFE,0xB7,0xFD, +0xFF,0x7E,0xDF,0xF7,0xAD,0xFF,0x7F,0xF7, 0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0x7F, +0xF6,0x7F,0xFF,0xFF,0xFF,0xDB,0xF6,0xFC, 0xAF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xEC,0xBF,0xFF, 0xAF,0xEB,0xFA,0xF6,0xAB,0x8F,0xEB,0xFA, +0xF7,0xA5,0xEB,0xFA,0xBE,0xBF,0xAF,0xEB, 0xFA,0xFF,0x6D,0xFF,0xFF,0x7F,0xDF,0x33, +0xDD,0xFF,0x7F,0xFE,0xF7,0xFC,0x7F,0xFB, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA9, +0xFF,0xFD,0xFF,0xFF,0xFE,0xFF,0xFF,0xDF, 0xFF,0xFF,0xEF,0xEF,0xFD,0xFF,0x7F,0xFF, +0xFF,0xFF,0xFF,0xFE,0xA7,0xFF,0xFF,0xFF, 0x77,0xDF,0xF7,0xFD,0x9F,0x7F,0xFE,0x77, +0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xAF,0xBF,0xAF,0xFF,0xF9,0xBE,0xBF, +0x8F,0xFB,0xFE,0xFE,0xEF,0xFB,0xFE,0xFF, 0xBF,0xEF,0xFB,0xFF,0xFF,0xFD,0xDF,0x6F, +0xEF,0xFF,0x7F,0xFF,0xBF,0xBF,0xDF,0xFF, 0xFC,0xFF,0xDF,0xF7,0xFD,0xEF,0x7F,0xDF, +0xFF,0xFF,0xFF,0x3F,0xF6,0xFF,0xCF,0xFF, 0xDB,0xFB,0xF7,0xFF,0xEB,0x7A,0xFF,0xFF, +0xFF,0xBF,0xEF,0xFB,0xFF,0xFF,0xFF,0xFE, 0x6D,0xFD,0xFF,0x5F,0xFB,0xFF,0xFF,0xF7, +0xFF,0x5F,0xF5,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFB,0xFF, +0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xE7,0xF6, 0xBF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF, +0xFF,0xC9,0xFF,0xFF,0xFF,0xBD,0xFF,0xBF, 0xAF,0xEF,0xEF,0x3F,0xD1,0xFC,0x7F,0xFB, +0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xE3,0xFF, 0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0x77,0xFF, +0xDF,0xB7,0xFD,0xF7,0xFD,0xF7,0xFF,0xFF, 0xFF,0xFF,0xFF,0x57,0xFF,0xF7,0xA5,0xFD, +0x3F,0xDF,0xBF,0xBF,0xFE,0x7F,0xFF,0xFF, 0xFF,0xDF,0xFA,0xFD,0xFF,0xFF,0xFF,0xFE, +0x87,0xFF,0xE9,0xFF,0xFE,0xEF,0xBF,0xEF, 0xFE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFA,0x9F,0xFF,0x3F, 0xFF,0xFD,0xFD,0x57,0xDF,0xFD,0xF3,0xFF, +0xDF,0xFD,0xFF,0x5F,0xDF,0xF5,0xFD,0xFF, 0xFF,0xF9,0x8F,0xFF,0xFF,0xFF,0xEE,0x7F, +0xFF,0xFF,0xBF,0x5E,0xFE,0xEC,0xFB,0x3F, 0x7F,0x9F,0xEF,0xF9,0xFF,0xFF,0xCD,0x6B, +0xFF,0xFF,0xFF,0xC5,0xF3,0xFC,0xFA,0x38, 0xFF,0xAF,0x3F,0xEE,0x7F,0x9F,0xFF,0xD9, +0xFF,0xFF,0xFD,0x7A,0xF7,0xFF,0xF3,0xFF, 0xAF,0x6F,0xDB,0xF2,0xB9,0xE9,0xFB,0xFF, +0xFF,0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xFB, 0xC5,0xBF,0xFF,0xEF,0xFF,0x5E,0xB7,0xAD, +0xCD,0x79,0x7C,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFD,0x93,0xFF,0xEF, +0xEA,0xFE,0xBF,0xEF,0x5B,0xD2,0xCD,0xF5, 0x6D,0x77,0xDF,0xF7,0xFD,0xFF,0x7F,0xDF, +0xFF,0xFF,0x66,0xFF,0xD5,0x65,0x7D,0x5F, 0x75,0x9D,0x65,0x7F,0xD6,0xFB,0x4F,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xC7, 0xFF,0xBF,0xEF,0xFA,0xFE,0xFF,0xBF,0xEB, +0xFF,0xDF,0xFF,0x7E,0xFF,0xFF,0xEF,0xFD, 0x7E,0xD7,0xFF,0x78,0xDF,0xFF,0x5F,0xDF, +0xF5,0xBF,0x7F,0xDF,0xC5,0xFF,0x3F,0xF6, 0x7E,0xFF,0x0F,0xEF,0xF2,0x3E,0xBF,0xFF, +0xFB,0x3F,0xFF,0xFB,0x7F,0xFF,0xB3,0xFE, 0xFB,0xF6,0xFD,0xFF,0xDA,0xF7,0xFD,0xFF, +0x7F,0xDF,0xF7,0xBF,0xFF,0xFA,0x7F,0xFF, 0xFF,0xFF,0xFF,0x9F,0xFF,0xF3,0xDC,0xF9, +0xBF,0xCE,0xE7,0xF9,0xFE,0x7F,0x9F,0xE7, 0xFF,0xFF,0xE2,0x7F,0xFE,0xFF,0xBF,0xEF, +0xEB,0xFA,0xFF,0x9F,0x67,0x1E,0xFF,0x8F, 0xE7,0xF8,0xFE,0x7F,0x8F,0xEF,0xFF,0xBD, +0xBF,0xFF,0xFB,0xFF,0xFF,0xDF,0xF7,0xFF, 0xFC,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFD,0xB3,0xFF,0xFF,0xEF, 0xFF,0xFF,0xBF,0xED,0xFF,0xFB,0xEE,0xFE, +0xFF,0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xFF, 0xFF,0xB5,0xFF,0xB7,0xFD,0xFD,0x6E,0xFF, +0xFF,0xFE,0xFD,0x2F,0xD8,0xFE,0xBF,0x8F, 0xEB,0xF9,0xFE,0x3F,0xFF,0xFA,0xCF,0xFF, +0xE7,0xD9,0xFA,0xBF,0xDF,0x77,0xFC,0xFB, 0x3F,0xAB,0xFE,0xFF,0xBF,0xEF,0xFB,0xFE, +0xFF,0xFF,0xEE,0x1F,0xFF,0xDF,0xF7,0xFF, 0xFF,0xFF,0x5F,0x97,0x35,0xBF,0x5E,0xFE, +0xBF,0xEF,0xFF,0xF7,0xFD,0xFF,0xFF,0xFA, 0xBF,0xFF,0xBE,0x6F,0x9F,0xE7,0xF8,0xBE, +0x2F,0x8B,0x66,0x94,0x7D,0x9D,0xE7,0xF9, 0xFE,0x7F,0x9F,0xE7,0xF1,0x7F,0xFF,0xFF, +0xFF,0xF7,0xF5,0xFD,0x7F,0x5F,0xFB,0xFD, 0x9E,0xFF,0xFB,0xFE,0xFF,0xFF,0xEF,0xFF, +0xFF,0xA0,0xFF,0xFF,0xFF,0xBF,0xEF,0xEB, 0xFA,0xFE,0xBF,0xB7,0xF7,0xF7,0xFF,0xFF, +0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD,0xFF, 0xFD,0xFF,0xFF,0xFF,0xD7,0xFF,0xFF,0xFF, +0x7F,0xF5,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, 0xBF,0xFF,0xFF,0xAB,0xFE,0xFB,0xFE,0xFF, +0xF7,0xAF,0xFF,0xFF,0xDE,0xF7,0xEB,0x5F, 0xDF,0xF7,0xFD,0xFF,0x7F,0xDF,0xFF,0xFF, +0xB3,0xFF,0xC9,0xFE,0xFF,0xFF,0xFF,0xFF, 0xD6,0xFF,0xFF,0xCB,0xFF,0xFF,0xDF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFC,0x8F,0xFF,0xBA, 0xBE,0xBF,0xAF,0xEB,0x78,0xFE,0xB7,0xAD, +0x3A,0xFE,0xB7,0xAF,0xEB,0x7A,0xFE,0xBF, 0xAF,0xFF,0x9F,0xFF,0xFF,0xDF,0xFC,0xFF, +0xFF,0xFE,0xC3,0xFE,0xFF,0xFF,0x33,0xFC, 0xFF,0xBF,0xDF,0xF3,0xFF,0xFF,0xBB,0x9F, +0xFF,0xFF,0xFF,0xEB,0xDF,0xFF,0xFF,0xAF, 0xF7,0x6F,0xF9,0xBF,0xEF,0xFD,0xFF,0xFF, +0xFF,0xFF,0xFF,0xE3,0x7F,0xFF,0xFF,0xFF, 0xFB,0xFF,0xFF,0xBF,0xFD,0xFB,0xF7,0xFF, +0xDF,0xF7,0xFF,0xFE,0xEF,0x5F,0xBD,0xFF, 0xFA,0xFF,0xF8,0xFF,0xBF,0xAF,0xFB,0xFE, +0xFE,0x3F,0xEF,0xE8,0xFF,0xDF,0xF3,0xFD, 0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xFB, +0xFD,0xFF,0xAF,0xFF,0xFF,0xFE,0xFE,0xBF, 0xDB,0xFF,0xFF,0xFF,0xBF,0xFF,0xDF,0xFF, +0xFD,0xFF,0xCB,0xFF,0xFF,0xFF,0xFF,0xFF, 0xBF,0x6F,0xFF,0x7F,0xB7,0xB3,0xFF,0xFF, +0xDF,0xFF,0xFB,0xEF,0xFF,0xFF,0xFF,0x07, 0xFF,0xFB,0xFF,0xFF,0xFF,0xED,0xFF,0xF5, +0x7C,0xFF,0x7F,0xFE,0xFF,0xFF,0xEF,0xCF, 0xFF,0xFB,0xFF,0xFF,0x2F,0xFF,0xFF,0xFF, +0xFF,0xF3,0xFF,0xFB,0xFF,0xFE,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF, +0xFD,0x1B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0x7C,0xFF,0xFF,0xFF,0xFF, +0xEF,0xFF,0xFF,0xFF,0xFF,0xFB,0xBF,0x7F, 0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, 0xFF,0xFF,0xF0,0x7F,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xDF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xBF,0xFE, +0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xEF,0xFE,0xFF,0xBF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xEF,0xFA,0xB5,0xFF,0xFF,0xFF, 0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xDF,0xFB, +0xFC,0xFF,0xFF,0xFE,0xFF,0x7F,0xDF,0xBF, 0xFF,0xCB,0xBF,0xF9,0xFE,0x7F,0x9F,0xE7, +0xF9,0xFE,0x7F,0x97,0xE1,0xFE,0x79,0x9F, 0xE7,0xFD,0xFE,0x7F,0xDF,0xFE,0x37,0xFF, +0xFB,0xDE,0xDE,0xBD,0xEF,0xF3,0xFE,0xFB, 0xAF,0xEB,0xFE,0xFF,0xFF,0xCF,0xFF,0xFE, +0xFF,0xBF,0xFF,0x8F,0xFF,0xEF,0xFB,0xFE, 0xFF,0xBF,0xE7,0xF9,0x5E,0x7F,0xEF,0xFB, +0xDA,0xFF,0xBF,0xEF,0xFB,0xFE,0xFF,0xFD, 0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF, +0xFF,0xFF,0x7F,0xFF,0xFF,0xF7,0xFB,0x7F, 0xFF,0xFF,0xFF,0xFF,0xFC,0x3F,0xFF,0xBF, +0xEF,0xFB,0xFE,0xFF,0xBF,0xEF,0x7B,0x7F, 0xBF,0xEF,0xFB,0xFE,0xFF,0xB5,0xEF,0xFB, +0xBF,0xFA,0x7F,0xFC,0xFF,0x3F,0xCF,0xF3, 0xFC,0xFF,0x3F,0xCF,0xBC,0xFF,0x3F,0xEF, +0xF3,0xFC,0xFE,0x3F,0xCF,0xFF,0xEE,0xEF, 0xFB,0xFE,0xFF,0xBF,0xEF,0xFB,0x6A,0xD7, +0xB7,0xFB,0xF8,0xFF,0xB7,0xEF,0xBA,0xFE, 0xFF,0xBF,0x7F,0xE9,0xFF,0xF9,0x7E,0x5F, +0x97,0xE5,0xF9,0xFE,0x7F,0xBF,0xF9,0x7E, 0x5F,0x9F,0xE5,0xFB,0xFE,0x5F,0xB7,0xFF, +0xA3,0xFF,0xF7,0xFD,0xFF,0x7F,0xDF,0xF7, 0xFD,0xFF,0x5E,0xF7,0x7D,0xFF,0x77,0xDF, +0xF7,0xFD,0xFF,0x7F,0xFF,0xD7,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFD,0xDF,0xFB,0x7F, +0xFF,0xFF,0xEF,0xFF,0xFE,0xFB,0xFF,0xFF, 0xBF,0xFE,0x8F,0xFF,0xDF,0xF7,0xFD,0xFD, +0x7F,0xDF,0xF7,0xFD,0x3E,0xDF,0xF5,0xBD, 0xFF,0x7F,0xDF,0xF7,0xFD,0xF7,0xFF,0x9F, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFD,0xFF,0xBE,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFD,0x3F,0xFF,0xDF,0xF7, 0xFD,0xFF,0x7F,0xDF,0xF7,0xFD,0xFF,0xCF, +0x77,0xFC,0xFF,0x5F,0xDF,0xF7,0xFD,0xFF, 0xF4,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFD,0xFF,0xFF,0xFF,0xEE,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xED,0xFB,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xE9,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFB,0xFF,0xFF,0xFF,0xD3,0xFF,0xFF, +0xBF,0x3F,0xFB,0xFF,0xFF,0xFF,0xFB,0xF3, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xF7, 0xFF,0xFF,0xFF,0xFF,0x17,0xFF,0xFF,0xFF, +0xDF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF, 0xDF,0xDF,0xFF,0xFD,0xFF,0xFF,0xDF,0xF7, +0xFF,0x4F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFD, +0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x9F,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF, 0xFF,0xFF,0x7A,0x3F,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2, +0x7F,0xFF,0xFB,0xFE,0xFF,0xBF,0xEF,0xF8, 0xFE,0xFF,0xBF,0xFB,0xFE,0xFF,0x8F,0xEC, +0xFB,0xFE,0xFF,0xBF,0xF8,0xF7,0xFE,0xFF, 0xBF,0xEF,0xFB,0xFE,0xFD,0xBF,0xCF,0xEC, +0xFF,0x3F,0xEF,0xDB,0xF8,0xFF,0xBF,0xCF, 0xFF,0xF9,0xFF,0xFF,0xBF,0xFF,0xFB,0xFF, +0xFF,0xFF,0xEF,0xFB,0xDF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xBB,0xFF, +0xEF,0xFB,0xFE,0xEF,0xBF,0xEE,0xEB,0xFB, 0xFE,0xFF,0xEF,0xFE,0xEE,0xBF,0xFE,0xEB, +0xFF,0xEF,0xFF,0x17,0xFF,0x7E,0xEB,0xBB, 0xFE,0xBF,0xBE,0xFB,0xEF,0x5B,0xF7,0xBD, +0xFB,0xCF,0xBF,0xBF,0xBB,0xFB,0x7E,0xCC, 0xEF,0xFF + +}; diff --git a/drivers/usb/firmware.h b/drivers/usb/firmware.h deleted file mode 100644 index a742558fbef5..000000000000 --- a/drivers/usb/firmware.h +++ /dev/null @@ -1,3213 +0,0 @@ -//$Id: firmware.h,v 1.1 1999/12/17 08:55:05 fliegl Exp $ -static INTEL_HEX_RECORD firmware[] = { -{ 2, - 0x0, - 0, - {0x21,0x57} -}, -{ 3, - 0x3, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0xb, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x13, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x1b, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x23, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x2b, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x33, - 0, - {0x02,0x03,0x0f} -}, -{ 3, - 0x3b, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x43, - 0, - {0x02,0x01,0x00} -}, -{ 3, - 0x4b, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x53, - 0, - {0x02,0x01,0x66} -}, -{ 3, - 0x5b, - 0, - {0x02,0x04,0xbd} -}, -{ 3, - 0x63, - 0, - {0x02,0x01,0x67} -}, -{ 3, - 0x100, - 0, - {0x02,0x0c,0x5a} -}, -{ 3, - 0x104, - 0, - {0x02,0x01,0xed} -}, -{ 3, - 0x108, - 0, - {0x02,0x02,0x51} -}, -{ 3, - 0x10c, - 0, - {0x02,0x02,0x7c} -}, -{ 3, - 0x110, - 0, - {0x02,0x02,0xe4} -}, -{ 1, - 0x114, - 0, - {0x32} -}, -{ 1, - 0x118, - 0, - {0x32} -}, -{ 3, - 0x11c, - 0, - {0x02,0x05,0xfd} -}, -{ 3, - 0x120, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x124, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x128, - 0, - {0x02,0x04,0x3c} -}, -{ 3, - 0x12c, - 0, - {0x02,0x04,0x6a} -}, -{ 3, - 0x130, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x134, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x138, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x13c, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x140, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x144, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x148, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x14c, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x150, - 0, - {0x02,0x00,0x00} -}, -{ 3, - 0x154, - 0, - {0x02,0x00,0x00} -}, -{ 10, - 0x157, - 0, - {0x75,0x81,0x7f,0xe5,0x82,0x60,0x03,0x02,0x01,0x61} -}, -{ 5, - 0x161, - 0, - {0x12,0x07,0x6f,0x21,0x64} -}, -{ 1, - 0x166, - 0, - {0x32} -}, -{ 14, - 0x167, - 0, - {0xc0,0xd0,0xc0,0x86,0xc0,0x82,0xc0,0x83,0xc0,0xe0,0x90,0x7f,0x97,0xe0} -}, -{ 14, - 0x175, - 0, - {0x44,0x80,0xf0,0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} -}, -{ 14, - 0x183, - 0, - {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} -}, -{ 14, - 0x191, - 0, - {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x90,0x7f,0x97,0xe0} -}, -{ 3, - 0x19f, - 0, - {0x55,0x7f,0xf0} -}, -{ 14, - 0x1a2, - 0, - {0x90,0x7f,0x9a,0xe0,0x30,0xe4,0x23,0x90,0x7f,0x68,0xf0,0xf0,0xf0,0xf0} -}, -{ 14, - 0x1b0, - 0, - {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} -}, -{ 14, - 0x1be, - 0, - {0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0} -}, -{ 14, - 0x1cc, - 0, - {0xe5,0xd8,0xc2,0xe3,0xf5,0xd8,0xd0,0xe0,0xd0,0x83,0xd0,0x82,0xd0,0x86} -}, -{ 3, - 0x1da, - 0, - {0xd0,0xd0,0x32} -}, -{ 8, - 0x1dd, - 0, - {0x75,0x86,0x00,0x90,0xff,0xc3,0x7c,0x05} -}, -{ 7, - 0x1e5, - 0, - {0xa3,0xe5,0x82,0x45,0x83,0x70,0xf9} -}, -{ 1, - 0x1ec, - 0, - {0x22} -}, -{ 14, - 0x1ed, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0xd0} -}, -{ 14, - 0x1fb, - 0, - {0x75,0xd0,0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91} -}, -{ 13, - 0x209, - 0, - {0x90,0x88,0x00,0xe0,0xf5,0x41,0x90,0x7f,0xab,0x74,0x02,0xf0,0x90} -}, -{ 9, - 0x216, - 0, - {0x7f,0xab,0x74,0x02,0xf0,0xe5,0x32,0x60,0x21} -}, -{ 4, - 0x21f, - 0, - {0x7a,0x00,0x7b,0x00} -}, -{ 11, - 0x223, - 0, - {0xc3,0xea,0x94,0x18,0xeb,0x64,0x80,0x94,0x80,0x50,0x12} -}, -{ 14, - 0x22e, - 0, - {0x90,0x7f,0x69,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0x0a,0xba,0x00} -}, -{ 2, - 0x23c, - 0, - {0x01,0x0b} -}, -{ 2, - 0x23e, - 0, - {0x80,0xe3} -}, -{ 2, - 0x240, - 0, - {0xd0,0x86} -}, -{ 14, - 0x242, - 0, - {0xd0,0xd0,0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0} -}, -{ 1, - 0x250, - 0, - {0x32} -}, -{ 14, - 0x251, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 14, - 0x25f, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74} -}, -{ 4, - 0x26d, - 0, - {0x04,0xf0,0xd0,0x86} -}, -{ 11, - 0x271, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x27c, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} -}, -{ 14, - 0x28a, - 0, - {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} -}, -{ 13, - 0x298, - 0, - {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90} -}, -{ 12, - 0x2a5, - 0, - {0x7f,0xab,0x74,0x08,0xf0,0x75,0x6e,0x00,0x75,0x6f,0x02,0x12} -}, -{ 6, - 0x2b1, - 0, - {0x11,0x44,0x75,0x70,0x39,0x75} -}, -{ 6, - 0x2b7, - 0, - {0x71,0x0c,0x75,0x72,0x02,0x12} -}, -{ 12, - 0x2bd, - 0, - {0x11,0x75,0x90,0x7f,0xd6,0xe4,0xf0,0x75,0xd8,0x20,0xd0,0x86} -}, -{ 14, - 0x2c9, - 0, - {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} -}, -{ 13, - 0x2d7, - 0, - {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x2e4, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 14, - 0x2f2, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xab,0x74} -}, -{ 4, - 0x300, - 0, - {0x10,0xf0,0xd0,0x86} -}, -{ 11, - 0x304, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x30f, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} -}, -{ 14, - 0x31d, - 0, - {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} -}, -{ 12, - 0x32b, - 0, - {0x00,0xc0,0x86,0x75,0x86,0x00,0x75,0x6e,0x00,0x75,0x6f,0x02} -}, -{ 7, - 0x337, - 0, - {0x12,0x11,0x44,0x75,0x70,0x40,0x75} -}, -{ 6, - 0x33e, - 0, - {0x71,0x0c,0x75,0x72,0x02,0x12} -}, -{ 14, - 0x344, - 0, - {0x11,0x75,0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0} -}, -{ 5, - 0x352, - 0, - {0x75,0xd8,0x10,0xd0,0x86} -}, -{ 14, - 0x357, - 0, - {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} -}, -{ 13, - 0x365, - 0, - {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 13, - 0x372, - 0, - {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12} -}, -{ 12, - 0x37f, - 0, - {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x42,0xf0,0x12,0x10,0x1b,0x90} -}, -{ 13, - 0x38b, - 0, - {0x7f,0xa6,0xe5,0x43,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40} -}, -{ 1, - 0x398, - 0, - {0xf0} -}, -{ 1, - 0x399, - 0, - {0x22} -}, -{ 13, - 0x39a, - 0, - {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x90,0x7f,0xa6,0x74,0x9a,0xf0,0x12} -}, -{ 12, - 0x3a7, - 0, - {0x10,0x1b,0x90,0x7f,0xa6,0xe5,0x44,0xf0,0x12,0x10,0x1b,0x90} -}, -{ 12, - 0x3b3, - 0, - {0x7f,0xa6,0xe5,0x45,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0xe5} -}, -{ 11, - 0x3bf, - 0, - {0x46,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa5,0x74,0x40,0xf0} -}, -{ 1, - 0x3ca, - 0, - {0x22} -}, -{ 10, - 0x3cb, - 0, - {0x75,0x44,0x02,0x75,0x45,0x00,0x75,0x46,0x00,0x12} -}, -{ 9, - 0x3d5, - 0, - {0x03,0x9a,0x75,0x42,0x03,0x75,0x43,0x00,0x12} -}, -{ 2, - 0x3de, - 0, - {0x03,0x72} -}, -{ 1, - 0x3e0, - 0, - {0x22} -}, -{ 12, - 0x3e1, - 0, - {0x90,0x88,0x00,0xe5,0x36,0xf0,0x90,0x88,0x00,0x74,0x10,0x25} -}, -{ 9, - 0x3ed, - 0, - {0x36,0xf0,0x12,0x01,0xdd,0x75,0x42,0x01,0x75} -}, -{ 9, - 0x3f6, - 0, - {0x43,0x18,0x12,0x03,0x72,0x75,0x44,0x02,0x75} -}, -{ 9, - 0x3ff, - 0, - {0x45,0x00,0x75,0x46,0x00,0x12,0x03,0x9a,0x75} -}, -{ 8, - 0x408, - 0, - {0x42,0x03,0x75,0x43,0x44,0x12,0x03,0x72} -}, -{ 1, - 0x410, - 0, - {0x22} -}, -{ 14, - 0x411, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 14, - 0x41f, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74} -}, -{ 4, - 0x42d, - 0, - {0x02,0xf0,0xd0,0x86} -}, -{ 11, - 0x431, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x43c, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 14, - 0x44a, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xa9,0x74} -}, -{ 7, - 0x458, - 0, - {0x04,0xf0,0x75,0x30,0x01,0xd0,0x86} -}, -{ 11, - 0x45f, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x46a, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 14, - 0x478, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90,0x7f,0xaa,0x74} -}, -{ 7, - 0x486, - 0, - {0x04,0xf0,0x75,0x31,0x01,0xd0,0x86} -}, -{ 11, - 0x48d, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x498, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 12, - 0x4a6, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe5,0xf5,0x91,0xd0,0x86} -}, -{ 11, - 0x4b2, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x4bd, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0x75,0xd0,0x00,0xc0} -}, -{ 12, - 0x4cb, - 0, - {0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe7,0xf5,0x91,0xd0,0x86} -}, -{ 11, - 0x4d7, - 0, - {0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 12, - 0x4e2, - 0, - {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x20,0x90,0x7f,0x96,0xe4,0xf0} -}, -{ 1, - 0x4ee, - 0, - {0x22} -}, -{ 7, - 0x4ef, - 0, - {0x90,0x7f,0xea,0xe0,0xfa,0x8a,0x21} -}, -{ 1, - 0x4f6, - 0, - {0x22} -}, -{ 14, - 0x4f7, - 0, - {0x90,0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xe0,0xfb,0x74,0x80,0x2a,0xfa} -}, -{ 14, - 0x505, - 0, - {0x74,0x80,0x2b,0xfb,0xea,0x03,0x03,0x54,0x3f,0xfc,0xea,0xc4,0x23,0x54} -}, -{ 14, - 0x513, - 0, - {0x1f,0xfa,0x2c,0xfa,0xeb,0x03,0x03,0x54,0x3f,0xfc,0xeb,0xc4,0x23,0x54} -}, -{ 11, - 0x521, - 0, - {0x1f,0xfb,0x2c,0xfb,0x90,0x17,0x0a,0xe0,0xfc,0x60,0x02} -}, -{ 2, - 0x52c, - 0, - {0x7a,0x00} -}, -{ 7, - 0x52e, - 0, - {0x90,0x17,0x0c,0xe0,0xfc,0x60,0x02} -}, -{ 2, - 0x535, - 0, - {0x7b,0x00} -}, -{ 11, - 0x537, - 0, - {0xea,0x2b,0xfc,0xc3,0x13,0xf5,0x3a,0x75,0x44,0x02,0x8b} -}, -{ 7, - 0x542, - 0, - {0x45,0x8a,0x46,0x12,0x03,0x9a,0x75} -}, -{ 9, - 0x549, - 0, - {0x6e,0x08,0x75,0x6f,0x00,0x12,0x11,0x44,0x75} -}, -{ 4, - 0x552, - 0, - {0x70,0x47,0x75,0x71} -}, -{ 8, - 0x556, - 0, - {0x0c,0x75,0x72,0x02,0x12,0x11,0x75,0x85} -}, -{ 5, - 0x55e, - 0, - {0x3a,0x73,0x12,0x11,0xa0} -}, -{ 1, - 0x563, - 0, - {0x22} -}, -{ 14, - 0x564, - 0, - {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90} -}, -{ 14, - 0x572, - 0, - {0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xef,0xe0,0xfc} -}, -{ 14, - 0x580, - 0, - {0x33,0x95,0xe0,0xfd,0x8c,0x05,0x7c,0x00,0x90,0x7f,0xee,0xe0,0xfe,0x33} -}, -{ 14, - 0x58e, - 0, - {0x95,0xe0,0xff,0xec,0x2e,0xfc,0xed,0x3f,0xfd,0x90,0x7f,0xe9,0xe0,0xfe} -}, -{ 5, - 0x59c, - 0, - {0xbe,0x01,0x02,0x80,0x03} -}, -{ 3, - 0x5a1, - 0, - {0x02,0x05,0xf9} -}, -{ 6, - 0x5a4, - 0, - {0xbc,0x01,0x21,0xbd,0x00,0x1e} -}, -{ 14, - 0x5aa, - 0, - {0xea,0xc4,0x03,0x54,0xf8,0xfc,0xeb,0x25,0xe0,0xfd,0x2c,0x24,0x00,0xfc} -}, -{ 14, - 0x5b8, - 0, - {0xe4,0x34,0x17,0xfd,0x90,0x7e,0xc0,0xe0,0xfe,0x8c,0x82,0x8d,0x83,0xf0} -}, -{ 2, - 0x5c6, - 0, - {0x80,0x31} -}, -{ 14, - 0x5c8, - 0, - {0xea,0xc4,0x03,0x54,0xf8,0xfa,0xeb,0x25,0xe0,0xfb,0x2a,0xfa,0x24,0x00} -}, -{ 14, - 0x5d6, - 0, - {0xfb,0xe4,0x34,0x17,0xfc,0x90,0x7e,0xc0,0xe0,0xfd,0x8b,0x82,0x8c,0x83} -}, -{ 14, - 0x5e4, - 0, - {0xf0,0x74,0x01,0x2a,0x24,0x00,0xfa,0xe4,0x34,0x17,0xfb,0x90,0x7e,0xc1} -}, -{ 7, - 0x5f2, - 0, - {0xe0,0xfc,0x8a,0x82,0x8b,0x83,0xf0} -}, -{ 3, - 0x5f9, - 0, - {0x75,0x38,0x01} -}, -{ 1, - 0x5fc, - 0, - {0x22} -}, -{ 14, - 0x5fd, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} -}, -{ 14, - 0x60b, - 0, - {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} -}, -{ 13, - 0x619, - 0, - {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90} -}, -{ 13, - 0x626, - 0, - {0x7f,0xaa,0x74,0x01,0xf0,0x12,0x05,0x64,0x75,0x37,0x00,0xd0,0x86} -}, -{ 14, - 0x633, - 0, - {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} -}, -{ 13, - 0x641, - 0, - {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 14, - 0x64e, - 0, - {0x90,0x7f,0xeb,0xe0,0xfa,0x90,0x7f,0xea,0xe0,0xfb,0x90,0x7f,0xee,0xe0} -}, -{ 14, - 0x65c, - 0, - {0xfc,0x33,0x95,0xe0,0xfd,0x90,0x7f,0x96,0xe0,0xfe,0x90,0x7f,0x96,0x74} -}, -{ 14, - 0x66a, - 0, - {0x80,0x65,0x06,0xf0,0x90,0x7f,0x00,0x74,0x01,0xf0,0xea,0xc4,0x03,0x54} -}, -{ 14, - 0x678, - 0, - {0xf8,0xfe,0xeb,0x25,0xe0,0xfb,0x2e,0xfe,0x24,0x00,0xfb,0xe4,0x34,0x17} -}, -{ 14, - 0x686, - 0, - {0xff,0x8b,0x82,0x8f,0x83,0xe0,0xfb,0x74,0x01,0x2e,0x24,0x00,0xfe,0xe4} -}, -{ 14, - 0x694, - 0, - {0x34,0x17,0xff,0x8e,0x82,0x8f,0x83,0xe0,0xfe,0x90,0x7f,0xe9,0xe0,0xff} -}, -{ 3, - 0x6a2, - 0, - {0xbf,0x81,0x0a} -}, -{ 10, - 0x6a5, - 0, - {0x90,0x7f,0x00,0xeb,0xf0,0x90,0x7f,0x01,0xee,0xf0} -}, -{ 8, - 0x6af, - 0, - {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x82,0x1a} -}, -{ 3, - 0x6b7, - 0, - {0xba,0x01,0x0c} -}, -{ 12, - 0x6ba, - 0, - {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b} -}, -{ 11, - 0x6c6, - 0, - {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0xb5,0xf0} -}, -{ 8, - 0x6d1, - 0, - {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x83,0x1b} -}, -{ 3, - 0x6d9, - 0, - {0xba,0x01,0x0d} -}, -{ 13, - 0x6dc, - 0, - {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0b} -}, -{ 11, - 0x6e9, - 0, - {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0x74,0x12,0xf0} -}, -{ 8, - 0x6f4, - 0, - {0x90,0x7f,0xe9,0xe0,0xfb,0xbb,0x84,0x1c} -}, -{ 3, - 0x6fc, - 0, - {0xba,0x01,0x0d} -}, -{ 13, - 0x6ff, - 0, - {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x80,0x0c} -}, -{ 12, - 0x70c, - 0, - {0x90,0x7f,0x00,0x74,0x80,0xf0,0x90,0x7f,0x01,0x74,0x01,0xf0} -}, -{ 5, - 0x718, - 0, - {0x90,0x7f,0xb5,0xec,0xf0} -}, -{ 1, - 0x71d, - 0, - {0x22} -}, -{ 12, - 0x71e, - 0, - {0x75,0x36,0x0d,0x90,0x88,0x00,0x74,0x1d,0xf0,0x75,0x6b,0x80} -}, -{ 10, - 0x72a, - 0, - {0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75} -}, -{ 9, - 0x734, - 0, - {0x6c,0x0f,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75} -}, -{ 9, - 0x73d, - 0, - {0x6c,0x06,0x12,0x10,0xe2,0x75,0x6b,0x80,0x75} -}, -{ 7, - 0x746, - 0, - {0x6c,0x01,0x12,0x10,0xe2,0x7a,0x00} -}, -{ 3, - 0x74d, - 0, - {0xba,0xff,0x00} -}, -{ 2, - 0x750, - 0, - {0x50,0x0a} -}, -{ 10, - 0x752, - 0, - {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1} -}, -{ 10, - 0x75c, - 0, - {0x75,0x6b,0x80,0x75,0x6c,0x3c,0x12,0x10,0xe2,0x75} -}, -{ 8, - 0x766, - 0, - {0x6b,0x80,0x75,0x6c,0x0f,0x12,0x10,0xe2} -}, -{ 1, - 0x76e, - 0, - {0x22} -}, -{ 14, - 0x76f, - 0, - {0x90,0x7f,0xa1,0xe4,0xf0,0x90,0x7f,0xaf,0x74,0x01,0xf0,0x90,0x7f,0x92} -}, -{ 14, - 0x77d, - 0, - {0x74,0x02,0xf0,0x75,0x8e,0x31,0x75,0x89,0x21,0x75,0x88,0x00,0x75,0xc8} -}, -{ 14, - 0x78b, - 0, - {0x00,0x75,0x8d,0x40,0x75,0x98,0x40,0x75,0xc0,0x40,0x75,0x87,0x00,0x75} -}, -{ 9, - 0x799, - 0, - {0x20,0x00,0x75,0x21,0x00,0x75,0x22,0x00,0x75} -}, -{ 5, - 0x7a2, - 0, - {0x23,0x00,0x75,0x47,0x00} -}, -{ 7, - 0x7a7, - 0, - {0xc3,0xe5,0x47,0x94,0x20,0x50,0x11} -}, -{ 13, - 0x7ae, - 0, - {0xe5,0x47,0x24,0x00,0xf5,0x82,0xe4,0x34,0x17,0xf5,0x83,0xe4,0xf0} -}, -{ 4, - 0x7bb, - 0, - {0x05,0x47,0x80,0xe8} -}, -{ 9, - 0x7bf, - 0, - {0xe4,0xf5,0x40,0xf5,0x3f,0xe4,0xf5,0x3c,0xf5} -}, -{ 7, - 0x7c8, - 0, - {0x3b,0xe4,0xf5,0x3e,0xf5,0x3d,0x75} -}, -{ 11, - 0x7cf, - 0, - {0x32,0x00,0x75,0x37,0x00,0x75,0x39,0x00,0x90,0x7f,0x93} -}, -{ 14, - 0x7da, - 0, - {0x74,0x3c,0xf0,0x90,0x7f,0x9c,0x74,0xff,0xf0,0x90,0x7f,0x96,0x74,0x80} -}, -{ 14, - 0x7e8, - 0, - {0xf0,0x90,0x7f,0x94,0x74,0x70,0xf0,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90} -}, -{ 14, - 0x7f6, - 0, - {0x7f,0x97,0xe4,0xf0,0x90,0x7f,0x95,0x74,0xc2,0xf0,0x90,0x7f,0x98,0x74} -}, -{ 14, - 0x804, - 0, - {0x28,0xf0,0x90,0x7f,0x9e,0x74,0x28,0xf0,0x90,0x7f,0xf0,0xe4,0xf0,0x90} -}, -{ 14, - 0x812, - 0, - {0x7f,0xf1,0xe4,0xf0,0x90,0x7f,0xf2,0xe4,0xf0,0x90,0x7f,0xf3,0xe4,0xf0} -}, -{ 14, - 0x820, - 0, - {0x90,0x7f,0xf4,0xe4,0xf0,0x90,0x7f,0xf5,0xe4,0xf0,0x90,0x7f,0xf6,0xe4} -}, -{ 14, - 0x82e, - 0, - {0xf0,0x90,0x7f,0xf7,0xe4,0xf0,0x90,0x7f,0xf8,0xe4,0xf0,0x90,0x7f,0xf9} -}, -{ 14, - 0x83c, - 0, - {0x74,0x38,0xf0,0x90,0x7f,0xfa,0x74,0xa0,0xf0,0x90,0x7f,0xfb,0x74,0xa0} -}, -{ 14, - 0x84a, - 0, - {0xf0,0x90,0x7f,0xfc,0x74,0xa0,0xf0,0x90,0x7f,0xfd,0x74,0xa0,0xf0,0x90} -}, -{ 14, - 0x858, - 0, - {0x7f,0xfe,0x74,0xa0,0xf0,0x90,0x7f,0xff,0x74,0xa0,0xf0,0x90,0x7f,0xe0} -}, -{ 14, - 0x866, - 0, - {0x74,0x03,0xf0,0x90,0x7f,0xe1,0x74,0x01,0xf0,0x90,0x7f,0xdd,0x74,0x80} -}, -{ 11, - 0x874, - 0, - {0xf0,0x12,0x12,0x43,0x12,0x07,0x1e,0x7a,0x00,0x7b,0x00} -}, -{ 9, - 0x87f, - 0, - {0xc3,0xea,0x94,0x1e,0xeb,0x94,0x00,0x50,0x17} -}, -{ 12, - 0x888, - 0, - {0x90,0x88,0x00,0xe0,0xf5,0x47,0x90,0x88,0x0b,0xe0,0xf5,0x47} -}, -{ 9, - 0x894, - 0, - {0x90,0x7f,0x68,0xf0,0x0a,0xba,0x00,0x01,0x0b} -}, -{ 2, - 0x89d, - 0, - {0x80,0xe0} -}, -{ 12, - 0x89f, - 0, - {0x12,0x03,0xe1,0x90,0x7f,0xd6,0xe4,0xf0,0x7a,0x00,0x7b,0x00} -}, -{ 13, - 0x8ab, - 0, - {0x8a,0x04,0x8b,0x05,0xc3,0xea,0x94,0xe0,0xeb,0x94,0x2e,0x50,0x1a} -}, -{ 14, - 0x8b8, - 0, - {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0} -}, -{ 10, - 0x8c6, - 0, - {0x04,0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b} -}, -{ 2, - 0x8d0, - 0, - {0x80,0xd9} -}, -{ 13, - 0x8d2, - 0, - {0x90,0x7f,0xd6,0x74,0x02,0xf0,0x90,0x7f,0xd6,0x74,0x06,0xf0,0x90} -}, -{ 14, - 0x8df, - 0, - {0x7f,0xde,0x74,0x05,0xf0,0x90,0x7f,0xdf,0x74,0x05,0xf0,0x90,0x7f,0xac} -}, -{ 14, - 0x8ed, - 0, - {0xe4,0xf0,0x90,0x7f,0xad,0x74,0x05,0xf0,0x75,0xa8,0x80,0x75,0xf8,0x10} -}, -{ 13, - 0x8fb, - 0, - {0x90,0x7f,0xae,0x74,0x0b,0xf0,0x90,0x7f,0xe2,0x74,0x88,0xf0,0x90} -}, -{ 12, - 0x908, - 0, - {0x7f,0xab,0x74,0x08,0xf0,0x75,0xe8,0x11,0x75,0x32,0x01,0x75} -}, -{ 12, - 0x914, - 0, - {0x31,0x00,0x75,0x30,0x00,0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7} -}, -{ 10, - 0x920, - 0, - {0xd0,0x05,0xd0,0x04,0x75,0x34,0x00,0x75,0x35,0x01} -}, -{ 13, - 0x92a, - 0, - {0x90,0x7f,0xae,0x74,0x03,0xf0,0x8c,0x02,0xba,0x00,0x02,0x80,0x03} -}, -{ 3, - 0x937, - 0, - {0x02,0x0a,0x3f} -}, -{ 12, - 0x93a, - 0, - {0x85,0x33,0x34,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90,0x7f,0x97} -}, -{ 14, - 0x946, - 0, - {0x74,0x08,0xf0,0x90,0x7f,0x9d,0x74,0x88,0xf0,0x90,0x7f,0x9a,0xe0,0xfa} -}, -{ 12, - 0x954, - 0, - {0x74,0x05,0x5a,0xf5,0x33,0x90,0x7f,0x9d,0x74,0x8f,0xf0,0x90} -}, -{ 13, - 0x960, - 0, - {0x7f,0x97,0x74,0x02,0xf0,0x90,0x7f,0x9d,0x74,0x82,0xf0,0xe5,0x33} -}, -{ 13, - 0x96d, - 0, - {0x25,0xe0,0xfa,0x90,0x7f,0x9a,0xe0,0x54,0x05,0xfb,0x4a,0xf5,0x33} -}, -{ 2, - 0x97a, - 0, - {0x60,0x0c} -}, -{ 12, - 0x97c, - 0, - {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x4a,0xf0} -}, -{ 11, - 0x988, - 0, - {0x75,0x6e,0x00,0x75,0x6f,0x00,0xc0,0x04,0xc0,0x05,0x12} -}, -{ 14, - 0x993, - 0, - {0x11,0x44,0xd0,0x05,0xd0,0x04,0x90,0x17,0x13,0xe0,0xfa,0x74,0x80,0x2a} -}, -{ 6, - 0x9a1, - 0, - {0xfa,0xe5,0x33,0xb4,0x04,0x29} -}, -{ 3, - 0x9a7, - 0, - {0xba,0xa0,0x00} -}, -{ 2, - 0x9aa, - 0, - {0x50,0x24} -}, -{ 13, - 0x9ac, - 0, - {0x90,0x17,0x13,0xe0,0x04,0xfb,0x0b,0x90,0x17,0x13,0xeb,0xf0,0x90} -}, -{ 14, - 0x9b9, - 0, - {0x17,0x13,0xe0,0xfb,0x90,0x17,0x15,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05} -}, -{ 9, - 0x9c7, - 0, - {0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02} -}, -{ 5, - 0x9d0, - 0, - {0xe5,0x33,0xb4,0x02,0x26} -}, -{ 6, - 0x9d5, - 0, - {0xc3,0x74,0x04,0x9a,0x50,0x20} -}, -{ 13, - 0x9db, - 0, - {0x90,0x17,0x13,0xe0,0xfa,0x1a,0x1a,0x90,0x17,0x13,0xea,0xf0,0x90} -}, -{ 13, - 0x9e8, - 0, - {0x17,0x13,0xe0,0xfa,0x90,0x17,0x15,0xf0,0xc0,0x04,0xc0,0x05,0x12} -}, -{ 6, - 0x9f5, - 0, - {0x04,0xf7,0xd0,0x05,0xd0,0x04} -}, -{ 5, - 0x9fb, - 0, - {0xe5,0x33,0xb4,0x08,0x1d} -}, -{ 4, - 0xa00, - 0, - {0xe5,0x34,0x70,0x19} -}, -{ 10, - 0xa04, - 0, - {0x74,0x01,0x25,0x35,0x54,0x0f,0xf5,0x35,0x85,0x35} -}, -{ 12, - 0xa0e, - 0, - {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0} -}, -{ 3, - 0xa1a, - 0, - {0x05,0xd0,0x04} -}, -{ 5, - 0xa1d, - 0, - {0xe5,0x33,0xb4,0x01,0x1d} -}, -{ 4, - 0xa22, - 0, - {0xe5,0x34,0x70,0x19} -}, -{ 10, - 0xa26, - 0, - {0xe5,0x35,0x24,0xff,0x54,0x0f,0xf5,0x35,0x85,0x35} -}, -{ 12, - 0xa30, - 0, - {0x75,0x75,0x76,0x00,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0} -}, -{ 3, - 0xa3c, - 0, - {0x05,0xd0,0x04} -}, -{ 14, - 0xa3f, - 0, - {0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0,0x04,0x90,0x7f,0x96} -}, -{ 14, - 0xa4d, - 0, - {0xe0,0xfa,0x90,0x7f,0x96,0x74,0x7f,0x5a,0xf0,0x90,0x7f,0x97,0x74,0x08} -}, -{ 10, - 0xa5b, - 0, - {0xf0,0xc3,0xec,0x94,0x00,0xed,0x94,0x02,0x40,0x08} -}, -{ 8, - 0xa65, - 0, - {0x90,0x7f,0x96,0xe0,0xfa,0x20,0xe6,0x08} -}, -{ 8, - 0xa6d, - 0, - {0xc3,0xe4,0x9c,0x74,0x08,0x9d,0x50,0x13} -}, -{ 14, - 0xa75, - 0, - {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x40,0x65,0x02,0xf0,0x7c} -}, -{ 5, - 0xa83, - 0, - {0x00,0x7d,0x00,0x80,0x05} -}, -{ 5, - 0xa88, - 0, - {0x0c,0xbc,0x00,0x01,0x0d} -}, -{ 5, - 0xa8d, - 0, - {0xe5,0x38,0xb4,0x01,0x0e} -}, -{ 13, - 0xa92, - 0, - {0xc0,0x04,0xc0,0x05,0x12,0x04,0xf7,0xd0,0x05,0xd0,0x04,0x75,0x38} -}, -{ 1, - 0xa9f, - 0, - {0x00} -}, -{ 7, - 0xaa0, - 0, - {0xe5,0x31,0x70,0x03,0x02,0x09,0x2a} -}, -{ 10, - 0xaa7, - 0, - {0x90,0x7f,0xc9,0xe0,0xfa,0x70,0x03,0x02,0x0c,0x2d} -}, -{ 14, - 0xab1, - 0, - {0x90,0x7f,0x96,0xe0,0xfa,0x90,0x7f,0x96,0x74,0x80,0x65,0x02,0xf0,0x90} -}, -{ 9, - 0xabf, - 0, - {0x7d,0xc0,0xe0,0xfa,0xba,0x2c,0x02,0x80,0x03} -}, -{ 3, - 0xac8, - 0, - {0x02,0x0b,0x36} -}, -{ 5, - 0xacb, - 0, - {0x75,0x32,0x00,0x7b,0x00} -}, -{ 3, - 0xad0, - 0, - {0xbb,0x64,0x00} -}, -{ 2, - 0xad3, - 0, - {0x50,0x1c} -}, -{ 14, - 0xad5, - 0, - {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0} -}, -{ 13, - 0xae3, - 0, - {0x04,0xd0,0x03,0xd0,0x02,0x90,0x88,0x0f,0xe0,0xf5,0x47,0x0b,0x80} -}, -{ 1, - 0xaf0, - 0, - {0xdf} -}, -{ 13, - 0xaf1, - 0, - {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x07,0x1e,0x12,0x03,0xe1,0x12} -}, -{ 12, - 0xafe, - 0, - {0x04,0xf7,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x75,0x6e,0x00,0x75} -}, -{ 13, - 0xb0a, - 0, - {0x6f,0x01,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0x44,0xd0,0x05} -}, -{ 9, - 0xb17, - 0, - {0xd0,0x04,0xd0,0x02,0x75,0x70,0x4d,0x75,0x71} -}, -{ 11, - 0xb20, - 0, - {0x0c,0x75,0x72,0x02,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12} -}, -{ 11, - 0xb2b, - 0, - {0x11,0x75,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x02,0x0c,0x2d} -}, -{ 3, - 0xb36, - 0, - {0xba,0x2a,0x3b} -}, -{ 13, - 0xb39, - 0, - {0x90,0x7f,0x98,0x74,0x20,0xf0,0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12} -}, -{ 14, - 0xb46, - 0, - {0x01,0xdd,0xd0,0x05,0xd0,0x04,0xd0,0x02,0x90,0x7f,0x98,0x74,0x28,0xf0} -}, -{ 2, - 0xb54, - 0, - {0x7b,0x00} -}, -{ 3, - 0xb56, - 0, - {0xbb,0x0a,0x00} -}, -{ 5, - 0xb59, - 0, - {0x40,0x03,0x02,0x0c,0x2d} -}, -{ 14, - 0xb5e, - 0, - {0xc0,0x02,0xc0,0x03,0xc0,0x04,0xc0,0x05,0x12,0x01,0xdd,0xd0,0x05,0xd0} -}, -{ 8, - 0xb6c, - 0, - {0x04,0xd0,0x03,0xd0,0x02,0x0b,0x80,0xe2} -}, -{ 3, - 0xb74, - 0, - {0xba,0x2b,0x1a} -}, -{ 8, - 0xb77, - 0, - {0x90,0x7f,0xc9,0xe0,0xfb,0xbb,0x40,0x12} -}, -{ 14, - 0xb7f, - 0, - {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x12,0x05,0xd0,0x05,0xd0,0x04,0xd0} -}, -{ 4, - 0xb8d, - 0, - {0x02,0x02,0x0c,0x2d} -}, -{ 3, - 0xb91, - 0, - {0xba,0x10,0x1f} -}, -{ 14, - 0xb94, - 0, - {0x90,0x7f,0x96,0xe0,0xfb,0x90,0x7f,0x96,0x74,0x80,0x65,0x03,0xf0,0xc0} -}, -{ 14, - 0xba2, - 0, - {0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x3d,0xd0,0x05,0xd0,0x04,0xd0,0x02} -}, -{ 3, - 0xbb0, - 0, - {0x02,0x0c,0x2d} -}, -{ 3, - 0xbb3, - 0, - {0xba,0x11,0x12} -}, -{ 14, - 0xbb6, - 0, - {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x6a,0xd0,0x05,0xd0,0x04,0xd0} -}, -{ 4, - 0xbc4, - 0, - {0x02,0x02,0x0c,0x2d} -}, -{ 3, - 0xbc8, - 0, - {0xba,0x12,0x12} -}, -{ 14, - 0xbcb, - 0, - {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x10,0x8f,0xd0,0x05,0xd0,0x04,0xd0} -}, -{ 4, - 0xbd9, - 0, - {0x02,0x02,0x0c,0x2d} -}, -{ 3, - 0xbdd, - 0, - {0xba,0x13,0x0b} -}, -{ 11, - 0xbe0, - 0, - {0x90,0x7d,0xc1,0xe0,0xfb,0x90,0x88,0x00,0xf0,0x80,0x42} -}, -{ 3, - 0xbeb, - 0, - {0xba,0x14,0x11} -}, -{ 14, - 0xbee, - 0, - {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x11,0xdd,0xd0,0x05,0xd0,0x04,0xd0} -}, -{ 3, - 0xbfc, - 0, - {0x02,0x80,0x2e} -}, -{ 3, - 0xbff, - 0, - {0xba,0x15,0x1d} -}, -{ 12, - 0xc02, - 0, - {0x90,0x7d,0xc1,0xe0,0xf5,0x75,0x90,0x7d,0xc2,0xe0,0xf5,0x76} -}, -{ 14, - 0xc0e, - 0, - {0xc0,0x02,0xc0,0x04,0xc0,0x05,0x12,0x13,0xfe,0xd0,0x05,0xd0,0x04,0xd0} -}, -{ 3, - 0xc1c, - 0, - {0x02,0x80,0x0e} -}, -{ 3, - 0xc1f, - 0, - {0xba,0x16,0x0b} -}, -{ 11, - 0xc22, - 0, - {0xc0,0x04,0xc0,0x05,0x12,0x13,0xa3,0xd0,0x05,0xd0,0x04} -}, -{ 11, - 0xc2d, - 0, - {0x90,0x7f,0xc9,0xe4,0xf0,0x75,0x31,0x00,0x02,0x09,0x2a} -}, -{ 1, - 0xc38, - 0, - {0x22} -}, -{ 7, - 0xc39, - 0, - {0x53,0x55,0x50,0x45,0x4e,0x44,0x00} -}, -{ 7, - 0xc40, - 0, - {0x52,0x45,0x53,0x55,0x4d,0x45,0x00} -}, -{ 6, - 0xc47, - 0, - {0x20,0x56,0x6f,0x6c,0x20,0x00} -}, -{ 13, - 0xc4d, - 0, - {0x44,0x41,0x42,0x55,0x53,0x42,0x20,0x76,0x31,0x2e,0x30,0x30,0x00} -}, -{ 14, - 0xc5a, - 0, - {0xc0,0xe0,0xc0,0xf0,0xc0,0x82,0xc0,0x83,0xc0,0x02,0xc0,0x03,0xc0,0x04} -}, -{ 14, - 0xc68, - 0, - {0xc0,0x05,0xc0,0x06,0xc0,0x07,0xc0,0x00,0xc0,0x01,0xc0,0xd0,0x75,0xd0} -}, -{ 13, - 0xc76, - 0, - {0x00,0xc0,0x86,0x75,0x86,0x00,0xe5,0x91,0xc2,0xe4,0xf5,0x91,0x90} -}, -{ 14, - 0xc83, - 0, - {0x7f,0xab,0x74,0x01,0xf0,0x90,0x7f,0xe8,0xe0,0xfa,0x90,0x7f,0xe9,0xe0} -}, -{ 6, - 0xc91, - 0, - {0xfb,0xbb,0x00,0x02,0x80,0x03} -}, -{ 3, - 0xc97, - 0, - {0x02,0x0d,0x38} -}, -{ 3, - 0xc9a, - 0, - {0xba,0x80,0x14} -}, -{ 14, - 0xc9d, - 0, - {0x90,0x7f,0x00,0x74,0x01,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5} -}, -{ 6, - 0xcab, - 0, - {0x74,0x02,0xf0,0x02,0x0e,0xcd} -}, -{ 5, - 0xcb1, - 0, - {0xba,0x82,0x02,0x80,0x03} -}, -{ 3, - 0xcb6, - 0, - {0x02,0x0d,0x1d} -}, -{ 8, - 0xcb9, - 0, - {0x90,0x7f,0xec,0xe0,0xfc,0xbc,0x01,0x00} -}, -{ 2, - 0xcc1, - 0, - {0x40,0x21} -}, -{ 6, - 0xcc3, - 0, - {0xc3,0x74,0x07,0x9c,0x40,0x1b} -}, -{ 14, - 0xcc9, - 0, - {0xec,0x24,0xff,0x25,0xe0,0xfd,0x24,0xc6,0xf5,0x82,0xe4,0x34,0x7f,0xf5} -}, -{ 13, - 0xcd7, - 0, - {0x83,0xe0,0xfd,0x53,0x05,0x01,0x90,0x7f,0x00,0xed,0xf0,0x80,0x2b} -}, -{ 3, - 0xce4, - 0, - {0xbc,0x81,0x00} -}, -{ 2, - 0xce7, - 0, - {0x40,0x21} -}, -{ 6, - 0xce9, - 0, - {0xc3,0x74,0x87,0x9c,0x40,0x1b} -}, -{ 14, - 0xcef, - 0, - {0xec,0x24,0x7f,0x25,0xe0,0xfc,0x24,0xb6,0xf5,0x82,0xe4,0x34,0x7f,0xf5} -}, -{ 13, - 0xcfd, - 0, - {0x83,0xe0,0xfc,0x53,0x04,0x01,0x90,0x7f,0x00,0xec,0xf0,0x80,0x05} -}, -{ 5, - 0xd0a, - 0, - {0x90,0x7f,0x00,0xe4,0xf0} -}, -{ 14, - 0xd0f, - 0, - {0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x02,0x0e,0xcd} -}, -{ 5, - 0xd1d, - 0, - {0xba,0x81,0x02,0x80,0x03} -}, -{ 3, - 0xd22, - 0, - {0x02,0x0e,0xc5} -}, -{ 14, - 0xd25, - 0, - {0x90,0x7f,0x00,0xe4,0xf0,0x90,0x7f,0x01,0xe4,0xf0,0x90,0x7f,0xb5,0x74} -}, -{ 5, - 0xd33, - 0, - {0x02,0xf0,0x02,0x0e,0xcd} -}, -{ 3, - 0xd38, - 0, - {0xbb,0x01,0x2d} -}, -{ 6, - 0xd3b, - 0, - {0xba,0x00,0x03,0x02,0x0e,0xcd} -}, -{ 3, - 0xd41, - 0, - {0xba,0x02,0x11} -}, -{ 13, - 0xd44, - 0, - {0x75,0x59,0x00,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0} -}, -{ 4, - 0xd51, - 0, - {0x02,0x02,0x0e,0xcd} -}, -{ 5, - 0xd55, - 0, - {0xba,0x21,0x02,0x80,0x03} -}, -{ 3, - 0xd5a, - 0, - {0x02,0x0e,0xcd} -}, -{ 11, - 0xd5d, - 0, - {0x75,0x37,0x01,0x90,0x7f,0xc5,0xe4,0xf0,0x02,0x0e,0xcd} -}, -{ 3, - 0xd68, - 0, - {0xbb,0x03,0x1f} -}, -{ 6, - 0xd6b, - 0, - {0xba,0x00,0x03,0x02,0x0e,0xcd} -}, -{ 5, - 0xd71, - 0, - {0xba,0x02,0x02,0x80,0x03} -}, -{ 3, - 0xd76, - 0, - {0x02,0x0e,0xcd} -}, -{ 13, - 0xd79, - 0, - {0x75,0x59,0x01,0xc0,0x02,0xc0,0x03,0x12,0x0e,0xf0,0xd0,0x03,0xd0} -}, -{ 4, - 0xd86, - 0, - {0x02,0x02,0x0e,0xcd} -}, -{ 3, - 0xd8a, - 0, - {0xbb,0x06,0x54} -}, -{ 5, - 0xd8d, - 0, - {0xba,0x80,0x02,0x80,0x03} -}, -{ 3, - 0xd92, - 0, - {0x02,0x0e,0xc5} -}, -{ 8, - 0xd95, - 0, - {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x01,0x15} -}, -{ 12, - 0xd9d, - 0, - {0x7c,0xfb,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee} -}, -{ 9, - 0xda9, - 0, - {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd} -}, -{ 10, - 0xdb2, - 0, - {0x90,0x7f,0xeb,0xe0,0xfc,0xbc,0x02,0x02,0x80,0x03} -}, -{ 3, - 0xdbc, - 0, - {0x02,0x0e,0xc5} -}, -{ 10, - 0xdbf, - 0, - {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x02,0x80,0x03} -}, -{ 3, - 0xdc9, - 0, - {0x02,0x0e,0xc5} -}, -{ 12, - 0xdcc, - 0, - {0x7c,0x3b,0x7d,0x0f,0x8d,0x06,0x7f,0x00,0x90,0x7f,0xd4,0xee} -}, -{ 9, - 0xdd8, - 0, - {0xf0,0x90,0x7f,0xd5,0xec,0xf0,0x02,0x0e,0xcd} -}, -{ 6, - 0xde1, - 0, - {0xbb,0x07,0x03,0x02,0x0e,0xc5} -}, -{ 3, - 0xde7, - 0, - {0xbb,0x08,0x10} -}, -{ 13, - 0xdea, - 0, - {0xac,0x48,0x90,0x7f,0x00,0xec,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0} -}, -{ 3, - 0xdf7, - 0, - {0x02,0x0e,0xcd} -}, -{ 3, - 0xdfa, - 0, - {0xbb,0x09,0x31} -}, -{ 5, - 0xdfd, - 0, - {0xba,0x00,0x02,0x80,0x03} -}, -{ 3, - 0xe02, - 0, - {0x02,0x0e,0xc5} -}, -{ 14, - 0xe05, - 0, - {0x90,0x7f,0xea,0xe0,0xfc,0xc3,0x74,0x01,0x9c,0x50,0x03,0x02,0x0e,0xc5} -}, -{ 8, - 0xe13, - 0, - {0x90,0x7f,0xea,0xe0,0xfc,0xbc,0x00,0x0a} -}, -{ 10, - 0xe1b, - 0, - {0x90,0x17,0x21,0xe4,0xf0,0x90,0x17,0x22,0xe4,0xf0} -}, -{ 9, - 0xe25, - 0, - {0x90,0x7f,0xea,0xe0,0xf5,0x48,0x02,0x0e,0xcd} -}, -{ 3, - 0xe2e, - 0, - {0xbb,0x0a,0x27} -}, -{ 5, - 0xe31, - 0, - {0xba,0x81,0x02,0x80,0x03} -}, -{ 3, - 0xe36, - 0, - {0x02,0x0e,0xc5} -}, -{ 14, - 0xe39, - 0, - {0x90,0x7f,0xec,0xe0,0xfa,0x24,0x20,0xfa,0xe4,0x34,0x17,0xfc,0x8a,0x82} -}, -{ 14, - 0xe47, - 0, - {0x8c,0x83,0xe0,0xfa,0x90,0x7f,0x00,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0} -}, -{ 3, - 0xe55, - 0, - {0x02,0x0e,0xcd} -}, -{ 5, - 0xe58, - 0, - {0xbb,0x0b,0x02,0x80,0x03} -}, -{ 3, - 0xe5d, - 0, - {0x02,0x0e,0xa9} -}, -{ 13, - 0xe60, - 0, - {0x90,0x17,0x20,0xe4,0xf0,0x90,0x7f,0xec,0xe0,0xfa,0xba,0x01,0x1a} -}, -{ 8, - 0xe6d, - 0, - {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x12} -}, -{ 14, - 0xe75, - 0, - {0x90,0x7f,0xea,0xe0,0xfa,0x90,0x17,0x21,0xf0,0xc0,0x03,0x12,0x04,0xe2} -}, -{ 4, - 0xe83, - 0, - {0xd0,0x03,0x80,0x46} -}, -{ 8, - 0xe87, - 0, - {0x90,0x7f,0xec,0xe0,0xfa,0xba,0x02,0x3e} -}, -{ 8, - 0xe8f, - 0, - {0x90,0x7f,0xed,0xe0,0xfa,0xba,0x00,0x36} -}, -{ 13, - 0xe97, - 0, - {0xc0,0x03,0x12,0x04,0xef,0xd0,0x03,0x90,0x7f,0xea,0xe0,0xfa,0x90} -}, -{ 5, - 0xea4, - 0, - {0x17,0x22,0xf0,0x80,0x24} -}, -{ 5, - 0xea9, - 0, - {0xbb,0x12,0x02,0x80,0x17} -}, -{ 5, - 0xeae, - 0, - {0xbb,0x81,0x02,0x80,0x0d} -}, -{ 5, - 0xeb3, - 0, - {0xbb,0x83,0x02,0x80,0x08} -}, -{ 5, - 0xeb8, - 0, - {0xbb,0x82,0x02,0x80,0x03} -}, -{ 3, - 0xebd, - 0, - {0xbb,0x84,0x05} -}, -{ 5, - 0xec0, - 0, - {0x12,0x06,0x4e,0x80,0x08} -}, -{ 8, - 0xec5, - 0, - {0x90,0x7f,0xb4,0x74,0x03,0xf0,0x80,0x06} -}, -{ 6, - 0xecd, - 0, - {0x90,0x7f,0xb4,0x74,0x02,0xf0} -}, -{ 2, - 0xed3, - 0, - {0xd0,0x86} -}, -{ 14, - 0xed5, - 0, - {0xd0,0xd0,0xd0,0x01,0xd0,0x00,0xd0,0x07,0xd0,0x06,0xd0,0x05,0xd0,0x04} -}, -{ 13, - 0xee3, - 0, - {0xd0,0x03,0xd0,0x02,0xd0,0x83,0xd0,0x82,0xd0,0xf0,0xd0,0xe0,0x32} -}, -{ 11, - 0xef0, - 0, - {0x90,0x7f,0xec,0xe0,0xf5,0x5a,0xc3,0x94,0x01,0x40,0x1d} -}, -{ 7, - 0xefb, - 0, - {0xc3,0x74,0x07,0x95,0x5a,0x40,0x16} -}, -{ 13, - 0xf02, - 0, - {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xc6,0xf5,0x82,0xe4,0x34} -}, -{ 9, - 0xf0f, - 0, - {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0,0x80,0x22} -}, -{ 7, - 0xf18, - 0, - {0xc3,0xe5,0x5a,0x94,0x81,0x40,0x1b} -}, -{ 7, - 0xf1f, - 0, - {0xc3,0x74,0x87,0x95,0x5a,0x40,0x14} -}, -{ 13, - 0xf26, - 0, - {0xe5,0x5a,0x24,0xff,0x25,0xe0,0xfa,0x24,0xb6,0xf5,0x82,0xe4,0x34} -}, -{ 7, - 0xf33, - 0, - {0x7f,0xf5,0x83,0xaa,0x59,0xea,0xf0} -}, -{ 1, - 0xf3a, - 0, - {0x22} -}, -{ 14, - 0xf3b, - 0, - {0x09,0x02,0xba,0x00,0x03,0x01,0x00,0x40,0x00,0x09,0x04,0x00,0x00,0x00} -}, -{ 14, - 0xf49, - 0, - {0x01,0x01,0x00,0x00,0x09,0x24,0x01,0x00,0x01,0x3d,0x00,0x01,0x01,0x0c} -}, -{ 14, - 0xf57, - 0, - {0x24,0x02,0x01,0x10,0x07,0x00,0x02,0x03,0x00,0x00,0x00,0x0d,0x24,0x06} -}, -{ 14, - 0xf65, - 0, - {0x03,0x01,0x02,0x15,0x00,0x03,0x00,0x03,0x00,0x00,0x09,0x24,0x03,0x02} -}, -{ 14, - 0xf73, - 0, - {0x01,0x01,0x00,0x01,0x00,0x09,0x24,0x03,0x04,0x02,0x03,0x00,0x03,0x00} -}, -{ 14, - 0xf81, - 0, - {0x09,0x24,0x03,0x05,0x03,0x06,0x00,0x01,0x00,0x09,0x04,0x01,0x00,0x00} -}, -{ 14, - 0xf8f, - 0, - {0x01,0x02,0x00,0x00,0x09,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00,0x07} -}, -{ 14, - 0xf9d, - 0, - {0x24,0x01,0x02,0x01,0x01,0x00,0x0b,0x24,0x02,0x01,0x02,0x02,0x10,0x01} -}, -{ 14, - 0xfab, - 0, - {0x80,0xbb,0x00,0x09,0x05,0x88,0x05,0x00,0x01,0x01,0x00,0x00,0x07,0x25} -}, -{ 14, - 0xfb9, - 0, - {0x01,0x00,0x00,0x00,0x00,0x09,0x04,0x02,0x00,0x02,0x00,0x00,0x00,0x00} -}, -{ 14, - 0xfc7, - 0, - {0x07,0x05,0x82,0x02,0x40,0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00} -}, -{ 14, - 0xfd5, - 0, - {0x09,0x04,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x07,0x05,0x82,0x02,0x40} -}, -{ 14, - 0xfe3, - 0, - {0x00,0x00,0x07,0x05,0x02,0x02,0x40,0x00,0x00,0x09,0x05,0x89,0x05,0xa0} -}, -{ 10, - 0xff1, - 0, - {0x01,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00} -}, -{ 14, - 0xffb, - 0, - {0x12,0x01,0x00,0x01,0x00,0x00,0x00,0x40,0x47,0x05,0x99,0x99,0x00,0x01} -}, -{ 14, - 0x1009, - 0, - {0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x02,0xba} -}, -{ 4, - 0x1017, - 0, - {0x00,0x03,0x01,0x00} -}, -{ 2, - 0x101b, - 0, - {0x7a,0x00} -}, -{ 3, - 0x101d, - 0, - {0xba,0x05,0x00} -}, -{ 2, - 0x1020, - 0, - {0x50,0x17} -}, -{ 8, - 0x1022, - 0, - {0x90,0x7f,0xa5,0xe0,0xfb,0x30,0xe0,0x05} -}, -{ 5, - 0x102a, - 0, - {0x90,0x00,0x01,0x80,0x0d} -}, -{ 10, - 0x102f, - 0, - {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xe4} -}, -{ 3, - 0x1039, - 0, - {0x90,0x00,0x01} -}, -{ 1, - 0x103c, - 0, - {0x22} -}, -{ 14, - 0x103d, - 0, - {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0x00,0x7d} -}, -{ 4, - 0x104b, - 0, - {0x7e,0xeb,0x60,0x12} -}, -{ 14, - 0x104f, - 0, - {0x89,0x82,0x8a,0x83,0xe0,0xa3,0xa9,0x82,0xaa,0x83,0x8c,0x82,0x8d,0x83} -}, -{ 4, - 0x105d, - 0, - {0xf0,0x0c,0xdb,0xee} -}, -{ 8, - 0x1061, - 0, - {0x90,0x7d,0xc3,0xe0,0x90,0x7f,0xb9,0xf0} -}, -{ 1, - 0x1069, - 0, - {0x22} -}, -{ 14, - 0x106a, - 0, - {0x90,0x7d,0xc1,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3,0xe0,0xfb,0x7c,0xc4,0x7d} -}, -{ 4, - 0x1078, - 0, - {0x7d,0xeb,0x60,0xe5} -}, -{ 14, - 0x107c, - 0, - {0x8c,0x82,0x8d,0x83,0xe0,0x0c,0x89,0x82,0x8a,0x83,0xf0,0xa3,0xa9,0x82} -}, -{ 4, - 0x108a, - 0, - {0xaa,0x83,0xdb,0xee} -}, -{ 1, - 0x108e, - 0, - {0x22} -}, -{ 14, - 0x108f, - 0, - {0x90,0x7f,0xa5,0x74,0x80,0xf0,0x05,0x86,0x90,0x7d,0xc1,0xe0,0x05,0x86} -}, -{ 14, - 0x109d, - 0, - {0xa3,0xf0,0x12,0x10,0x1b,0x90,0x7f,0xa6,0x05,0x86,0xa3,0xa3,0xe0,0xf9} -}, -{ 5, - 0x10ab, - 0, - {0x60,0x16,0xa3,0x05,0x86} -}, -{ 13, - 0x10b0, - 0, - {0x90,0x7f,0xa6,0x05,0x86,0xe0,0xa3,0x05,0x86,0xf0,0xc0,0x01,0x12} -}, -{ 6, - 0x10bd, - 0, - {0x10,0x1b,0xd0,0x01,0xd9,0xed} -}, -{ 6, - 0x10c3, - 0, - {0x90,0x7f,0xa5,0x74,0x40,0xf0} -}, -{ 1, - 0x10c9, - 0, - {0x22} -}, -{ 8, - 0x10ca, - 0, - {0x90,0x88,0x02,0x74,0x01,0xf0,0x7a,0x00} -}, -{ 3, - 0x10d2, - 0, - {0xba,0xff,0x00} -}, -{ 2, - 0x10d5, - 0, - {0x50,0x0a} -}, -{ 10, - 0x10d7, - 0, - {0xc0,0x02,0x12,0x01,0xdd,0xd0,0x02,0x0a,0x80,0xf1} -}, -{ 1, - 0x10e1, - 0, - {0x22} -}, -{ 5, - 0x10e2, - 0, - {0xe5,0x6b,0xb4,0xc0,0x08} -}, -{ 8, - 0x10e7, - 0, - {0x90,0x88,0x03,0xe5,0x6c,0xf0,0x80,0x06} -}, -{ 6, - 0x10ef, - 0, - {0x90,0x88,0x02,0xe5,0x6c,0xf0} -}, -{ 4, - 0x10f5, - 0, - {0x7a,0x00,0x7b,0x00} -}, -{ 11, - 0x10f9, - 0, - {0xc3,0xea,0x94,0x32,0xeb,0x64,0x80,0x94,0x80,0x50,0x07} -}, -{ 5, - 0x1104, - 0, - {0x0a,0xba,0x00,0x01,0x0b} -}, -{ 2, - 0x1109, - 0, - {0x80,0xee} -}, -{ 1, - 0x110b, - 0, - {0x22} -}, -{ 10, - 0x110c, - 0, - {0x90,0x88,0x03,0xe5,0x6d,0xf0,0x05,0x39,0x7a,0x00} -}, -{ 3, - 0x1116, - 0, - {0xba,0x28,0x00} -}, -{ 2, - 0x1119, - 0, - {0x50,0x03} -}, -{ 3, - 0x111b, - 0, - {0x0a,0x80,0xf8} -}, -{ 5, - 0x111e, - 0, - {0xe5,0x39,0xb4,0x10,0x08} -}, -{ 8, - 0x1123, - 0, - {0x90,0x88,0x02,0x74,0xc0,0xf0,0x80,0x0e} -}, -{ 5, - 0x112b, - 0, - {0xe5,0x39,0xb4,0x20,0x09} -}, -{ 9, - 0x1130, - 0, - {0x90,0x88,0x02,0x74,0x80,0xf0,0x75,0x39,0x00} -}, -{ 2, - 0x1139, - 0, - {0x7a,0x00} -}, -{ 3, - 0x113b, - 0, - {0xba,0x28,0x00} -}, -{ 2, - 0x113e, - 0, - {0x50,0x03} -}, -{ 3, - 0x1140, - 0, - {0x0a,0x80,0xf8} -}, -{ 1, - 0x1143, - 0, - {0x22} -}, -{ 4, - 0x1144, - 0, - {0xe5,0x6f,0x60,0x02} -}, -{ 2, - 0x1148, - 0, - {0x80,0x07} -}, -{ 7, - 0x114a, - 0, - {0x7a,0x00,0x75,0x39,0x00,0x80,0x05} -}, -{ 5, - 0x1151, - 0, - {0x7a,0x40,0x75,0x39,0x10} -}, -{ 9, - 0x1156, - 0, - {0xe5,0x6e,0x2a,0xfa,0xe5,0x6e,0x25,0x39,0xf5} -}, -{ 10, - 0x115f, - 0, - {0x39,0x90,0x88,0x02,0x74,0x80,0x2a,0xf0,0x7a,0x00} -}, -{ 8, - 0x1169, - 0, - {0xc3,0xea,0x64,0x80,0x94,0xa8,0x50,0x03} -}, -{ 3, - 0x1171, - 0, - {0x0a,0x80,0xf5} -}, -{ 1, - 0x1174, - 0, - {0x22} -}, -{ 6, - 0x1175, - 0, - {0xaa,0x70,0xab,0x71,0xac,0x72} -}, -{ 12, - 0x117b, - 0, - {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x12,0x14,0xee,0xfd,0x60,0x18} -}, -{ 13, - 0x1187, - 0, - {0x8d,0x6d,0xc0,0x02,0xc0,0x03,0xc0,0x04,0x12,0x11,0x0c,0xd0,0x04} -}, -{ 9, - 0x1194, - 0, - {0xd0,0x03,0xd0,0x02,0x0a,0xba,0x00,0x01,0x0b} -}, -{ 2, - 0x119d, - 0, - {0x80,0xdc} -}, -{ 1, - 0x119f, - 0, - {0x22} -}, -{ 13, - 0x11a0, - 0, - {0xe5,0x73,0xc4,0x54,0x0f,0xfa,0x53,0x02,0x0f,0xc3,0x74,0x09,0x9a} -}, -{ 2, - 0x11ad, - 0, - {0x50,0x06} -}, -{ 6, - 0x11af, - 0, - {0x74,0x37,0x2a,0xfb,0x80,0x04} -}, -{ 4, - 0x11b5, - 0, - {0x74,0x30,0x2a,0xfb} -}, -{ 12, - 0x11b9, - 0, - {0x8b,0x6d,0xc0,0x03,0x12,0x11,0x0c,0xd0,0x03,0xaa,0x73,0x53} -}, -{ 8, - 0x11c5, - 0, - {0x02,0x0f,0xc3,0x74,0x09,0x9a,0x50,0x06} -}, -{ 6, - 0x11cd, - 0, - {0x74,0x37,0x2a,0xfb,0x80,0x04} -}, -{ 4, - 0x11d3, - 0, - {0x74,0x30,0x2a,0xfb} -}, -{ 5, - 0x11d7, - 0, - {0x8b,0x6d,0x12,0x11,0x0c} -}, -{ 1, - 0x11dc, - 0, - {0x22} -}, -{ 7, - 0x11dd, - 0, - {0x90,0x7d,0xc3,0xe0,0xfa,0x60,0x0f} -}, -{ 12, - 0x11e4, - 0, - {0x90,0x7d,0xc1,0xe0,0xf5,0x6e,0x90,0x7d,0xc2,0xe0,0xf5,0x6f} -}, -{ 3, - 0x11f0, - 0, - {0x12,0x11,0x44} -}, -{ 12, - 0x11f3, - 0, - {0x90,0x7d,0xff,0xe4,0xf0,0x75,0x70,0xc4,0x75,0x71,0x7d,0x75} -}, -{ 5, - 0x11ff, - 0, - {0x72,0x01,0x12,0x11,0x75} -}, -{ 1, - 0x1204, - 0, - {0x22} -}, -{ 2, - 0x1205, - 0, - {0x7a,0x04} -}, -{ 3, - 0x1207, - 0, - {0xba,0x40,0x00} -}, -{ 2, - 0x120a, - 0, - {0x50,0x36} -}, -{ 14, - 0x120c, - 0, - {0xea,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfb,0x7c,0x00} -}, -{ 3, - 0x121a, - 0, - {0xbc,0x08,0x00} -}, -{ 2, - 0x121d, - 0, - {0x50,0x20} -}, -{ 6, - 0x121f, - 0, - {0x8b,0x05,0xed,0x30,0xe7,0x0b} -}, -{ 11, - 0x1225, - 0, - {0x90,0x7f,0x96,0x74,0x42,0xf0,0x74,0xc3,0xf0,0x80,0x08} -}, -{ 8, - 0x1230, - 0, - {0x90,0x7f,0x96,0xe4,0xf0,0x74,0x81,0xf0} -}, -{ 7, - 0x1238, - 0, - {0xeb,0x25,0xe0,0xfb,0x0c,0x80,0xdb} -}, -{ 3, - 0x123f, - 0, - {0x0a,0x80,0xc5} -}, -{ 1, - 0x1242, - 0, - {0x22} -}, -{ 4, - 0x1243, - 0, - {0x7a,0x00,0x7b,0xef} -}, -{ 3, - 0x1247, - 0, - {0xba,0x10,0x00} -}, -{ 2, - 0x124a, - 0, - {0x50,0x20} -}, -{ 14, - 0x124c, - 0, - {0x74,0x11,0x2b,0xfb,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0x8c,0x82,0x8d} -}, -{ 14, - 0x125a, - 0, - {0x83,0xe4,0xf0,0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe4} -}, -{ 4, - 0x1268, - 0, - {0xf0,0x0a,0x80,0xdb} -}, -{ 1, - 0x126c, - 0, - {0x22} -}, -{ 14, - 0x126d, - 0, - {0x74,0xf8,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} -}, -{ 14, - 0x127b, - 0, - {0x74,0xf9,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} -}, -{ 14, - 0x1289, - 0, - {0x74,0xfa,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} -}, -{ 14, - 0x1297, - 0, - {0x74,0xfb,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} -}, -{ 14, - 0x12a5, - 0, - {0x74,0xff,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0xe4,0xf0} -}, -{ 1, - 0x12b3, - 0, - {0x22} -}, -{ 14, - 0x12b4, - 0, - {0x12,0x03,0xcb,0x12,0x12,0x6d,0x7a,0xc0,0x7b,0x87,0x7c,0x01,0x74,0x01} -}, -{ 14, - 0x12c2, - 0, - {0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74} -}, -{ 14, - 0x12d0, - 0, - {0x01,0x12,0x14,0xbf,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e} -}, -{ 14, - 0x12de, - 0, - {0x83,0x8f,0xf0,0x74,0x06,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b} -}, -{ 14, - 0x12ec, - 0, - {0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74} -}, -{ 14, - 0x12fa, - 0, - {0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0} -}, -{ 14, - 0x1308, - 0, - {0x74,0x0b,0x12,0x14,0xbf,0x74,0x01,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07} -}, -{ 14, - 0x1316, - 0, - {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x74,0x08,0x12,0x14,0xbf,0x74,0x01,0x2d} -}, -{ 14, - 0x1324, - 0, - {0xfa,0xe4,0x3e,0xfb,0x8f,0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x01} -}, -{ 14, - 0x1332, - 0, - {0x12,0x14,0xbf,0x2a,0xfd,0xe4,0x3b,0xfe,0x8c,0x07,0x8a,0x82,0x8b,0x83} -}, -{ 14, - 0x1340, - 0, - {0x8c,0xf0,0xe4,0x12,0x14,0xbf,0x74,0x01,0x2d,0xfa,0xe4,0x3e,0xfb,0x8f} -}, -{ 14, - 0x134e, - 0, - {0x04,0x8d,0x82,0x8e,0x83,0x8f,0xf0,0x74,0x03,0x12,0x14,0xbf,0x7d,0x00} -}, -{ 3, - 0x135c, - 0, - {0xbd,0x06,0x00} -}, -{ 2, - 0x135f, - 0, - {0x50,0x12} -}, -{ 11, - 0x1361, - 0, - {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0x0a,0xba,0x00,0x01,0x0b} -}, -{ 7, - 0x136c, - 0, - {0xe4,0x12,0x14,0xbf,0x0d,0x80,0xe9} -}, -{ 13, - 0x1373, - 0, - {0x8a,0x82,0x8b,0x83,0x8c,0xf0,0xe5,0x74,0x12,0x14,0xbf,0x74,0xf9} -}, -{ 14, - 0x1380, - 0, - {0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x0f,0xf0,0x74} -}, -{ 14, - 0x138e, - 0, - {0xfe,0x24,0x00,0xf5,0x82,0x74,0x03,0x34,0x84,0xf5,0x83,0x74,0x01,0xf0} -}, -{ 6, - 0x139c, - 0, - {0x12,0x03,0xe1,0x12,0x04,0xf7} -}, -{ 1, - 0x13a2, - 0, - {0x22} -}, -{ 13, - 0x13a3, - 0, - {0x90,0x7d,0xc1,0xe0,0xfa,0x24,0x00,0xfb,0xe4,0x34,0x19,0xfc,0x90} -}, -{ 14, - 0x13b0, - 0, - {0x7d,0xc2,0xe0,0xfd,0x8b,0x82,0x8c,0x83,0xf0,0x75,0xf0,0x11,0xea,0xa4} -}, -{ 3, - 0x13be, - 0, - {0xfa,0x7b,0x00} -}, -{ 3, - 0x13c1, - 0, - {0xbb,0x10,0x00} -}, -{ 2, - 0x13c4, - 0, - {0x50,0x24} -}, -{ 14, - 0x13c6, - 0, - {0xea,0x24,0x00,0xfc,0xe4,0x34,0x18,0xfd,0xeb,0x2c,0xfc,0xe4,0x3d,0xfd} -}, -{ 14, - 0x13d4, - 0, - {0x74,0x04,0x2b,0x24,0xc0,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe0,0xfe} -}, -{ 8, - 0x13e2, - 0, - {0x8c,0x82,0x8d,0x83,0xf0,0x0b,0x80,0xd7} -}, -{ 14, - 0x13ea, - 0, - {0xea,0x24,0x00,0xfa,0xe4,0x34,0x18,0xfb,0x74,0x10,0x2a,0xf5,0x82,0xe4} -}, -{ 5, - 0x13f8, - 0, - {0x3b,0xf5,0x83,0xe4,0xf0} -}, -{ 1, - 0x13fd, - 0, - {0x22} -}, -{ 4, - 0x13fe, - 0, - {0xe5,0x76,0x60,0x02} -}, -{ 2, - 0x1402, - 0, - {0x80,0x16} -}, -{ 12, - 0x1404, - 0, - {0x74,0x0f,0x55,0x75,0xfa,0x8a,0x75,0x24,0x00,0xf5,0x82,0xe4} -}, -{ 10, - 0x1410, - 0, - {0x34,0x19,0xf5,0x83,0xe0,0xf5,0x74,0x12,0x12,0xb4} -}, -{ 10, - 0x141a, - 0, - {0x12,0x10,0xca,0x75,0x6e,0x00,0x75,0x6f,0x00,0x12} -}, -{ 6, - 0x1424, - 0, - {0x11,0x44,0x75,0x70,0xb9,0x75} -}, -{ 6, - 0x142a, - 0, - {0x71,0x14,0x75,0x72,0x02,0x12} -}, -{ 11, - 0x1430, - 0, - {0x11,0x75,0xe5,0x76,0xb4,0x02,0x04,0x74,0x01,0x80,0x01} -}, -{ 1, - 0x143b, - 0, - {0xe4} -}, -{ 3, - 0x143c, - 0, - {0xfa,0x70,0x0f} -}, -{ 12, - 0x143f, - 0, - {0x74,0x01,0x25,0x75,0xf5,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0} -}, -{ 3, - 0x144b, - 0, - {0x02,0x80,0x0a} -}, -{ 10, - 0x144e, - 0, - {0x85,0x75,0x73,0xc0,0x02,0x12,0x11,0xa0,0xd0,0x02} -}, -{ 12, - 0x1458, - 0, - {0x75,0x6e,0x00,0x75,0x6f,0x01,0xc0,0x02,0x12,0x11,0x44,0xd0} -}, -{ 4, - 0x1464, - 0, - {0x02,0xea,0x70,0x1a} -}, -{ 13, - 0x1468, - 0, - {0x75,0xf0,0x11,0xe5,0x75,0xa4,0xfa,0x24,0x00,0xfa,0xe4,0x34,0x18} -}, -{ 9, - 0x1475, - 0, - {0xfb,0x8a,0x70,0x8b,0x71,0x75,0x72,0x01,0x12} -}, -{ 4, - 0x147e, - 0, - {0x11,0x75,0x80,0x36} -}, -{ 2, - 0x1482, - 0, - {0x7a,0x00} -}, -{ 3, - 0x1484, - 0, - {0xba,0x10,0x00} -}, -{ 2, - 0x1487, - 0, - {0x50,0x2f} -}, -{ 13, - 0x1489, - 0, - {0xea,0x24,0x00,0xf5,0x82,0xe4,0x34,0x19,0xf5,0x83,0xe0,0xfb,0xe5} -}, -{ 4, - 0x1496, - 0, - {0x75,0xb5,0x03,0x1b} -}, -{ 14, - 0x149a, - 0, - {0x75,0xf0,0x11,0xea,0xa4,0xfb,0x24,0x00,0xfb,0xe4,0x34,0x18,0xfc,0x8b} -}, -{ 9, - 0x14a8, - 0, - {0x70,0x8c,0x71,0x75,0x72,0x01,0xc0,0x02,0x12} -}, -{ 4, - 0x14b1, - 0, - {0x11,0x75,0xd0,0x02} -}, -{ 3, - 0x14b5, - 0, - {0x0a,0x80,0xcc} -}, -{ 1, - 0x14b8, - 0, - {0x22} -}, -{ 6, - 0x14b9, - 0, - {0x50,0x72,0x6f,0x67,0x20,0x00} -}, -{ 14, - 0x14bf, - 0, - {0xc8,0xc0,0xe0,0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0b,0x14,0x60,0x0f,0x14} -}, -{ 7, - 0x14cd, - 0, - {0x60,0x11,0x14,0x60,0x12,0x80,0x15} -}, -{ 7, - 0x14d4, - 0, - {0xd0,0xe0,0xa8,0x82,0xf6,0x80,0x0e} -}, -{ 5, - 0x14db, - 0, - {0xd0,0xe0,0xf0,0x80,0x09} -}, -{ 4, - 0x14e0, - 0, - {0xd0,0xe0,0x80,0x05} -}, -{ 5, - 0x14e4, - 0, - {0xd0,0xe0,0xa8,0x82,0xf2} -}, -{ 4, - 0x14e9, - 0, - {0xc8,0xd0,0xe0,0xc8} -}, -{ 1, - 0x14ed, - 0, - {0x22} -}, -{ 14, - 0x14ee, - 0, - {0xc8,0xc0,0xe0,0xe5,0xf0,0x60,0x0d,0x14,0x60,0x0f,0x14,0x60,0x0f,0x14} -}, -{ 6, - 0x14fc, - 0, - {0x60,0x10,0x74,0xff,0x80,0x0f} -}, -{ 5, - 0x1502, - 0, - {0xa8,0x82,0xe6,0x80,0x0a} -}, -{ 3, - 0x1507, - 0, - {0xe0,0x80,0x07} -}, -{ 4, - 0x150a, - 0, - {0xe4,0x93,0x80,0x03} -}, -{ 3, - 0x150e, - 0, - {0xa8,0x82,0xe2} -}, -{ 4, - 0x1511, - 0, - {0xf8,0xd0,0xe0,0xc8} -}, -{ 1, - 0x1515, - 0, - {0x22} -}, -{ 0, - 0x0, - 1, - {0} -} -}; diff --git a/drivers/usb/graphire.c b/drivers/usb/graphire.c index 3214c997f72f..8921c7db8fce 100644 --- a/drivers/usb/graphire.c +++ b/drivers/usb/graphire.c @@ -62,6 +62,12 @@ MODULE_AUTHOR("Vojtech Pavlik "); * byte 7: pen presure high bits / mouse distance * * There are also two single-byte feature reports (2 and 3). + * + * Resolution: + * X: 0 - 10206 + * Y: 0 - 7422 + * + * (0,0) is upper left corner */ #define USB_VENDOR_ID_WACOM 0x056a @@ -84,8 +90,10 @@ static void graphire_irq(struct urb *urb) if (data[0] != 2) dbg("received unknown report #%d", data[0]); - input_report_abs(dev, ABS_X, data[2] | ((__u32)data[3] << 8)); - input_report_abs(dev, ABS_Y, data[4] | ((__u32)data[5] << 8)); + if ( data[1] & 0x80 ) { + input_report_abs(dev, ABS_X, data[2] | ((__u32)data[3] << 8)); + input_report_abs(dev, ABS_Y, 7422 - (data[4] | ((__u32)data[5] << 8))); + } switch ((data[1] >> 5) & 3) { @@ -106,7 +114,7 @@ static void graphire_irq(struct urb *urb) break; case 2: /* Mouse */ - input_report_key(dev, BTN_TOOL_MOUSE, data[7] > 27); + input_report_key(dev, BTN_TOOL_MOUSE, data[7] > 24); input_report_key(dev, BTN_LEFT, !!(data[1] & 0x01)); input_report_key(dev, BTN_RIGHT, !!(data[1] & 0x02)); input_report_key(dev, BTN_MIDDLE, !!(data[1] & 0x04)); @@ -137,9 +145,9 @@ static void *graphire_probe(struct usb_device *dev, unsigned int ifnum) graphire->dev.relbit[0] |= BIT(REL_WHEEL); graphire->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) | BIT(ABS_DISTANCE); - graphire->dev.absmax[ABS_X] = 10000; - graphire->dev.absmax[ABS_Y] = 7500; - graphire->dev.absmax[ABS_PRESSURE] = 500; + graphire->dev.absmax[ABS_X] = 10206; + graphire->dev.absmax[ABS_Y] = 7422; + graphire->dev.absmax[ABS_PRESSURE] = 511; graphire->dev.absmax[ABS_DISTANCE] = 32; FILL_INT_URB(&graphire->irq, dev, usb_rcvintpipe(dev, endpoint->bEndpointAddress), diff --git a/drivers/usb/hid.c b/drivers/usb/hid.c index b3937357a49a..28c4cc507d26 100644 --- a/drivers/usb/hid.c +++ b/drivers/usb/hid.c @@ -1005,7 +1005,7 @@ static void hid_irq(struct urb *urb) static void hid_read_report(struct hid_device *hid, struct hid_report *report) { #if 0 - int rlen = ((report->size - 1) >> 3) + 1 + hid->report_enum[HID_INPUT_REPORT].numbered; + int rlen = ((report->size - 1) >> 3) + 1; char rdata[rlen]; struct urb urb; int read, j; @@ -1019,7 +1019,7 @@ static void hid_read_report(struct hid_device *hid, struct hid_report *report) dbg("getting report type %d id %d len %d", report->type + 1, report->id, rlen); - if ((read = usb_get_report(hid->dev, report->type + 1, report->id, hid->ifnum, rdata, rlen)) != rlen) { + if ((read = usb_get_report(hid->dev, hid->ifnum, report->type + 1, report->id, rdata, rlen)) != rlen) { dbg("reading report failed rlen %d read %d", rlen, read); #ifdef DEBUG printk(KERN_DEBUG __FILE__ ": report = "); @@ -1059,13 +1059,6 @@ static void hid_output_field(struct hid_field *field, __u8 *data) void hid_output_report(struct hid_report *report, __u8 *data) { unsigned n; - -#if 0 - /* skip the ID if we have a single report */ - if (report->device->report_enum[report->type].numbered) - *data++ = report->id; -#endif - for (n = 0; n < report->maxfield; n++) hid_output_field(report->field[n], data); }; @@ -1188,7 +1181,7 @@ static void hid_init_input(struct hid_device *hid) hid_configure_usage(hid, report->field[i], report->field[i]->usage + j); if (k == HID_INPUT_REPORT) { - usb_set_idle(hid->dev, 0, report->id); + usb_set_idle(hid->dev, hid->ifnum, report->id, 0); hid_read_report(hid, report); } } @@ -1197,7 +1190,7 @@ static void hid_init_input(struct hid_device *hid) static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum) { - struct usb_interface_descriptor *interface = &dev->actconfig->interface[ifnum].altsetting[0]; + struct usb_interface_descriptor *interface = dev->actconfig->interface[ifnum].altsetting + 0; struct hid_descriptor *hdesc; struct hid_device *hid; unsigned rsize = 0; @@ -1224,7 +1217,7 @@ static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum) { __u8 rdesc[rsize]; - if ((n = usb_get_class_descriptor(dev, USB_DT_REPORT, 0, ifnum, rdesc, rsize)) < 0) { + if ((n = usb_get_class_descriptor(dev, interface->bInterfaceNumber, USB_DT_REPORT, 0, rdesc, rsize)) < 0) { dbg("reading report descriptor failed"); return NULL; } @@ -1272,19 +1265,22 @@ static struct hid_device *usb_hid_configure(struct usb_device *dev, int ifnum) return NULL; } + hid->version = hdesc->bcdHID; + hid->country = hdesc->bCountryCode; + hid->dev = dev; + hid->ifnum = interface->bInterfaceNumber; + hid->dr.requesttype = USB_TYPE_CLASS | USB_RECIP_INTERFACE; hid->dr.request = USB_REQ_SET_REPORT; hid->dr.value = 0x200; - hid->dr.index = interface->bInterfaceNumber; + hid->dr.index = hid->ifnum; hid->dr.length = 1; FILL_CONTROL_URB(&hid->urbout, dev, usb_sndctrlpipe(dev, 0), (void*) &hid->dr, hid->bufout, 1, hid_ctrl, hid); - hid->version = hdesc->bcdHID; - hid->country = hdesc->bCountryCode; - hid->dev = dev; - hid->ifnum = ifnum; + if (interface->bInterfaceSubClass == 1) + usb_set_protocol(dev, hid->ifnum, 1); return hid; } diff --git a/drivers/usb/ibmcam.c b/drivers/usb/ibmcam.c index 4e809d08d573..2e9d43fa8dd5 100644 --- a/drivers/usb/ibmcam.c +++ b/drivers/usb/ibmcam.c @@ -112,7 +112,10 @@ MODULE_PARM(init_contrast, "i"); MODULE_PARM(init_color, "i"); MODULE_PARM(init_hue, "i"); -/* Still mysterious i2o commands */ +MODULE_AUTHOR ("module author"); +MODULE_DESCRIPTION ("IBM/Xirlink C-it USB Camera Driver for Linux (c) 2000"); + +/* Still mysterious i2c commands */ static const unsigned short unknown_88 = 0x0088; static const unsigned short unknown_89 = 0x0089; static const unsigned short bright_3x[3] = { 0x0031, 0x0032, 0x0033 }; @@ -1034,7 +1037,7 @@ static int usb_ibmcam_veio( * real_fps = 3 + (fps_code * 4.5) * * History: - * 1/18/99 Created. + * 1/18/00 Created. */ static int usb_ibmcam_calculate_fps(void) { @@ -1142,7 +1145,7 @@ static void usb_ibmcam_PacketFormat2(struct usb_device *dev, unsigned char fkey, * TODO: we probably don't need to send the setup 5 times... * * History: - * 1/2/99 Created. + * 1/2/00 Created. */ static void usb_ibmcam_adjust_contrast(struct usb_ibmcam *ibmcam) { @@ -1171,7 +1174,7 @@ static void usb_ibmcam_adjust_contrast(struct usb_ibmcam *ibmcam) * Low lighting forces slower FPS. Lighting is set as a module parameter. * * History: - * 1/5/99 Created. + * 1/5/00 Created. */ static void usb_ibmcam_change_lighting_conditions(struct usb_ibmcam *ibmcam) { @@ -1234,32 +1237,21 @@ static void usb_ibmcam_adjust_picture(struct usb_ibmcam *ibmcam) usb_ibmcam_set_brightness(ibmcam); } -static void usb_ibmcam_setup_before_if1(struct usb_device *dev) -{ - switch (videosize) { - case VIDEOSIZE_128x96: - case VIDEOSIZE_176x144: - usb_ibmcam_veio(dev, 1, 0x00, 0x0100); - usb_ibmcam_veio(dev, 0, 0x01, 0x0100); - usb_ibmcam_veio(dev, 0, 0x01, 0x0108); - break; - case VIDEOSIZE_352x288: - usb_ibmcam_veio(dev, 1, 0x00, 0x0100); - usb_ibmcam_veio(dev, 0, 0x01, 0x0100); - usb_ibmcam_veio(dev, 1, 0x00, 0x0100); - usb_ibmcam_veio(dev, 0, 0x81, 0x0100); - usb_ibmcam_veio(dev, 1, 0x00, 0x0100); - usb_ibmcam_veio(dev, 0, 0x01, 0x0100); - usb_ibmcam_veio(dev, 0, 0x01, 0x0108); - break; - } -} - -static void usb_ibmcam_setup_before_if2(struct usb_device *dev) +static int usb_ibmcam_setup(struct usb_ibmcam *ibmcam) { + struct usb_device *dev = ibmcam->dev; const int ntries = 5; int i; + usb_ibmcam_veio(dev, 1, 0, 0x128); + usb_ibmcam_veio(dev, 1, 0x00, 0x0100); + usb_ibmcam_veio(dev, 0, 0x01, 0x0100); /* LED On */ + usb_ibmcam_veio(dev, 1, 0x00, 0x0100); + usb_ibmcam_veio(dev, 0, 0x81, 0x0100); /* LED Off */ + usb_ibmcam_veio(dev, 1, 0x00, 0x0100); + usb_ibmcam_veio(dev, 0, 0x01, 0x0100); /* LED On */ + usb_ibmcam_veio(dev, 0, 0x01, 0x0108); + usb_ibmcam_veio(dev, 0, 0x03, 0x0112); usb_ibmcam_veio(dev, 1, 0x00, 0x0115); usb_ibmcam_veio(dev, 0, 0x06, 0x0115); @@ -1440,19 +1432,33 @@ static void usb_ibmcam_setup_before_if2(struct usb_device *dev) usb_ibmcam_veio(dev, 0, 0xf6, 0x0107); break; } + return 0; /* TODO: return actual completion status! */ } +/* + * usb_ibmcam_setup_after_video_if() + * + * This code adds finishing touches to the video data interface. + * Here we configure the frame rate and turn on the LED. + */ static void usb_ibmcam_setup_after_video_if(struct usb_device *dev) { unsigned short internal_frame_rate; RESTRICT_TO_RANGE(framerate, FRAMERATE_MIN, FRAMERATE_MAX); internal_frame_rate = FRAMERATE_MAX - framerate; /* 0=Fast 6=Slow */ + usb_ibmcam_veio(dev, 0, 0x01, 0x0100); /* LED On */ usb_ibmcam_veio(dev, 0, internal_frame_rate, 0x0111); usb_ibmcam_veio(dev, 0, 0x01, 0x0114); usb_ibmcam_veio(dev, 0, 0xc0, 0x010c); } +/* + * usb_ibmcam_setup_video_stop() + * + * This code tells camera to stop streaming. The interface remains + * configured and bandwidth - claimed. + */ static void usb_ibmcam_setup_video_stop(struct usb_device *dev) { usb_ibmcam_veio(dev, 0, 0x00, 0x010c); @@ -1462,7 +1468,7 @@ static void usb_ibmcam_setup_video_stop(struct usb_device *dev) usb_ibmcam_veio(dev, 0, 0x00, 0x010c); usb_ibmcam_send_FF_04_02(dev); usb_ibmcam_veio(dev, 1, 0x00, 0x0100); - usb_ibmcam_veio(dev, 0, 0x81, 0x0100); + usb_ibmcam_veio(dev, 0, 0x81, 0x0100); /* LED Off */ } /* @@ -1564,29 +1570,36 @@ static int ibmcam_init_isoc(struct usb_ibmcam *ibmcam) return 0; } +/* + * ibmcam_stop_isoc() + * + * This procedure stops streaming and deallocates URBs. Then it + * activates zero-bandwidth alt. setting of the video interface. + * + * History: + * 1/22/00 Corrected order of actions to work after surprise removal. + */ static void ibmcam_stop_isoc(struct usb_ibmcam *ibmcam) { if (!ibmcam->streaming) return; - usb_ibmcam_setup_video_stop(ibmcam->dev); - - /* Set packet size to 0 */ - if (usb_set_interface(ibmcam->dev, 2, 0) < 0) { - printk(KERN_ERR "usb_set_interface error\n"); - return /* -EINVAL */; - } - /* Unschedule all of the iso td's */ usb_unlink_urb(ibmcam->sbuf[1].urb); usb_unlink_urb(ibmcam->sbuf[0].urb); - // printk(KERN_DEBUG "streaming=0\n"); + /* printk(KERN_DEBUG "streaming=0\n"); */ ibmcam->streaming = 0; /* Delete them all */ usb_free_urb(ibmcam->sbuf[1].urb); usb_free_urb(ibmcam->sbuf[0].urb); + + usb_ibmcam_setup_video_stop(ibmcam->dev); + + /* Set packet size to 0 */ + if (usb_set_interface(ibmcam->dev, 2, 0) < 0) + printk(KERN_ERR "usb_set_interface error\n"); } static int ibmcam_new_frame(struct usb_ibmcam *ibmcam, int framenum) @@ -1645,90 +1658,127 @@ static int ibmcam_new_frame(struct usb_ibmcam *ibmcam, int framenum) return 0; } -/* Video 4 Linux API */ +/* + * ibmcam_open() + * + * This is part of Video 4 Linux API. The driver can be opened by one + * client only (checks internal counter 'ibmcam->user'). The procedure + * then allocates buffers needed for video processing. + * + * History: + * 1/22/00 Rewrote, moved scratch buffer allocation here. Now the + * camera is also initialized here (once per connect), at + * expense of V4L client (it waits on open() call). + */ static int ibmcam_open(struct video_device *dev, int flags) { - int err = -EBUSY; struct usb_ibmcam *ibmcam = (struct usb_ibmcam *)dev; - - if (ibmcam->remove_pending) - return -EFAULT; + const int nbuffers = 2; + const int sb_size = FRAMES_PER_DESC * ibmcam->iso_packet_len; + int i, err = 0; down(&ibmcam->lock); - if (ibmcam->user) - goto out_unlock; - - ibmcam->frame[0].grabstate = FRAME_UNUSED; - ibmcam->frame[1].grabstate = FRAME_UNUSED; - - err = -ENOMEM; - - /* Allocate memory for the frame buffers */ - ibmcam->fbuf = rvmalloc(2 * MAX_FRAME_SIZE); - if (!ibmcam->fbuf) - goto open_err_ret; - - ibmcam->frame[0].data = ibmcam->fbuf; - ibmcam->frame[1].data = ibmcam->fbuf + MAX_FRAME_SIZE; - - ibmcam->sbuf[0].data = kmalloc (FRAMES_PER_DESC * ibmcam->iso_packet_len, GFP_KERNEL); - if (!ibmcam->sbuf[0].data) - goto open_err_on0; - - ibmcam->sbuf[1].data = kmalloc (FRAMES_PER_DESC * ibmcam->iso_packet_len, GFP_KERNEL); - if (!ibmcam->sbuf[1].data) - goto open_err_on1; - - /* Set default sizes in case IOCTL (VIDIOCMCAPTURE) is not used - * (using read() instead). */ - ibmcam->frame[0].width = imgwidth; - ibmcam->frame[0].height = imgheight; - ibmcam->frame[0].bytes_read = 0; - ibmcam->frame[1].width = imgwidth; - ibmcam->frame[1].height = imgheight; - ibmcam->frame[1].bytes_read = 0; - - err = ibmcam_init_isoc(ibmcam); - if (err) - goto open_err_on2; - - ibmcam->user++; - up(&ibmcam->lock); - - MOD_INC_USE_COUNT; - return 0; + if (ibmcam->user) + err = -EBUSY; + else { + /* Clean pointers so we know if we allocated something */ + for (i=0; i < nbuffers; i++) + ibmcam->sbuf[i].data = NULL; + + /* Allocate memory for the frame buffers */ + ibmcam->fbuf_size = nbuffers * MAX_FRAME_SIZE; + ibmcam->fbuf = rvmalloc(ibmcam->fbuf_size); + ibmcam->scratch = kmalloc(scratchbufsize, GFP_KERNEL); + ibmcam->scratchlen = 0; + if ((ibmcam->fbuf == NULL) || (ibmcam->scratch == NULL)) + err = -ENOMEM; + else { + /* Allocate all buffers */ + for (i=0; i < nbuffers; i++) { + ibmcam->frame[i].grabstate = FRAME_UNUSED; + ibmcam->frame[i].data = ibmcam->fbuf + i*MAX_FRAME_SIZE; + + ibmcam->sbuf[i].data = kmalloc(sb_size, GFP_KERNEL); + if (ibmcam->sbuf[i].data == NULL) { + err = -ENOMEM; + break; + } + /* + * Set default sizes in case IOCTL (VIDIOCMCAPTURE) + * is not used (using read() instead). + */ + ibmcam->frame[i].width = imgwidth; + ibmcam->frame[i].height = imgheight; + ibmcam->frame[i].bytes_read = 0; + } + } + if (err) { + /* Have to free all that memory */ + if (ibmcam->fbuf != NULL) { + rvfree(ibmcam->fbuf, ibmcam->fbuf_size); + ibmcam->fbuf = NULL; + } + if (ibmcam->scratch != NULL) { + kfree(ibmcam->scratch); + ibmcam->scratch = NULL; + } + for (i=0; i < nbuffers; i++) { + if (ibmcam->sbuf[i].data != NULL) { + kfree (ibmcam->sbuf[i].data); + ibmcam->sbuf[i].data = NULL; + } + } + } + } -open_err_on2: - kfree (ibmcam->sbuf[1].data); -open_err_on1: - kfree (ibmcam->sbuf[0].data); -open_err_on0: - rvfree(ibmcam->fbuf, 2 * MAX_FRAME_SIZE); -open_err_ret: - return err; + /* If so far no errors then we shall start the camera */ + if (!err) { + err = ibmcam_init_isoc(ibmcam); + if (!err) { + /* Send init sequence only once, it's large! */ + if (!ibmcam->initialized) { + err = usb_ibmcam_setup(ibmcam); + if (!err) + ibmcam->initialized = 1; + } + if (!err) { + ibmcam->user++; + MOD_INC_USE_COUNT; + } + } + } -out_unlock: up(&ibmcam->lock); return err; } +/* + * ibmcam_close() + * + * This is part of Video 4 Linux API. The procedure + * stops streaming and deallocates all buffers that were earlier + * allocated in ibmcam_open(). + * + * History: + * 1/22/00 Moved scratch buffer deallocation here. + */ static void ibmcam_close(struct video_device *dev) { struct usb_ibmcam *ibmcam = (struct usb_ibmcam *)dev; down(&ibmcam->lock); - ibmcam->user--; - - MOD_DEC_USE_COUNT; ibmcam_stop_isoc(ibmcam); - rvfree(ibmcam->fbuf, 2 * MAX_FRAME_SIZE); - + rvfree(ibmcam->fbuf, ibmcam->fbuf_size); + kfree(ibmcam->scratch); kfree(ibmcam->sbuf[1].data); kfree(ibmcam->sbuf[0].data); + ibmcam->user--; + MOD_DEC_USE_COUNT; + up(&ibmcam->lock); } @@ -1742,6 +1792,14 @@ static long ibmcam_write(struct video_device *dev, const char *buf, unsigned lon return -EINVAL; } +/* + * ibmcam_ioctl() + * + * This is part of Video 4 Linux API. The procedure handles ioctl() calls. + * + * History: + * 1/22/00 Corrected VIDIOCSPICT to reject unsupported settings. + */ static int ibmcam_ioctl(struct video_device *dev, unsigned int cmd, void *arg) { struct usb_ibmcam *ibmcam = (struct usb_ibmcam *)dev; @@ -1784,8 +1842,18 @@ static int ibmcam_ioctl(struct video_device *dev, unsigned int cmd, void *arg) } case VIDIOCSPICT: { - if (copy_from_user(&ibmcam->vpic, arg, sizeof(ibmcam->vpic))) + struct video_picture tmp; + /* + * Use temporary 'video_picture' structure to preserve our + * own settings (such as color depth, palette) that we + * aren't allowing everyone (V4L client) to change. + */ + if (copy_from_user(&tmp, arg, sizeof(tmp))) return -EFAULT; + ibmcam->vpic.brightness = tmp.brightness; + ibmcam->vpic.hue = tmp.hue; + ibmcam->vpic.colour = tmp.colour; + ibmcam->vpic.contrast = tmp.contrast; usb_ibmcam_adjust_picture(ibmcam); return 0; } @@ -2131,6 +2199,15 @@ static void usb_ibmcam_configure_video(struct usb_ibmcam *ibmcam) strcpy(ibmcam->vchan.name, "Camera"); } +/* + * usb_ibmcam_probe() + * + * This procedure queries device descriptor and accepts the interface + * if it looks like IBM C-it camera. + * + * History: + * 1/22/00 Moved camera init code to ibmcam_open() + */ static void *usb_ibmcam_probe(struct usb_device *dev, unsigned int ifnum) { struct usb_ibmcam *ibmcam = NULL; @@ -2167,20 +2244,9 @@ static void *usb_ibmcam_probe(struct usb_device *dev, unsigned int ifnum) interface = &dev->actconfig->interface[ifnum].altsetting[0]; ibmcam->iface = interface->bInterfaceNumber; ibmcam->video_endp = 0x82; - ibmcam->scratch = kmalloc(scratchbufsize, GFP_KERNEL); - if (ibmcam->scratch == NULL) { - printk(KERN_ERR "couldn't kmalloc ibmcam->scratch\n"); - kfree(ibmcam); - return NULL; - } init_waitqueue_head (&ibmcam->remove_ok); ibmcam->iso_packet_len = 1014; - /* Camera setup */ - usb_ibmcam_veio(dev, 1, 0, 0x128); - usb_ibmcam_setup_before_if1(dev); - usb_ibmcam_setup_before_if2(dev); - memcpy(&ibmcam->vdev, &ibmcam_template, sizeof(ibmcam_template)); usb_ibmcam_configure_video(ibmcam); @@ -2201,31 +2267,53 @@ static void *usb_ibmcam_probe(struct usb_device *dev, unsigned int ifnum) return ibmcam; } +/* + * usb_ibmcam_disconnect() + * + * This procedure stops all driver activity, deallocates interface-private + * structure (pointed by 'ptr') and after that driver should be removable + * with no ill consequences. + * + * TODO: This code behaves badly on surprise removal! + * + * History: + * 1/22/00 Added polling of MOD_IN_USE to delay removal until all users gone. + */ static void usb_ibmcam_disconnect(struct usb_device *dev, void *ptr) { static const char proc[] = "usb_ibmcam_disconnect"; struct usb_ibmcam *ibmcam = (struct usb_ibmcam *) ptr; + wait_queue_head_t wq; /* Wait here until removal is safe */ if (debug > 0) printk(KERN_DEBUG "%s(%p,%p.)\n", proc, dev, ptr); - ibmcam->remove_pending = 1; - /* Now all ISO data will be ignored */ + init_waitqueue_head(&wq); + ibmcam->remove_pending = 1; /* Now all ISO data will be ignored */ /* At this time we ask to cancel outstanding URBs */ ibmcam_stop_isoc(ibmcam); - /* sleep_on(&s->remove_ok); */ - /* Now it should be safe to remove */ - + if (MOD_IN_USE) { + printk(KERN_INFO "%s: In use, disconnect pending.\n", proc); + while (MOD_IN_USE) + interruptible_sleep_on_timeout (&wq, HZ); + printk(KERN_INFO "%s: Released, wait.\n", proc); +// interruptible_sleep_on_timeout (&wq, HZ*10); + } video_unregister_device(&ibmcam->vdev); + printk(KERN_INFO "%s: Video dereg'd, wait.\n", proc); +// interruptible_sleep_on_timeout (&wq, HZ*10); /* Free the memory */ if (debug > 0) printk(KERN_DEBUG "%s: freeing ibmcam=%p\n", proc, ibmcam); - if (ibmcam->scratch != NULL) - kfree(ibmcam->scratch); kfree(ibmcam); + + printk(KERN_INFO "%s: Memory freed, wait.\n", proc); +// interruptible_sleep_on_timeout (&wq, HZ*10); + + printk(KERN_INFO "IBM USB camera disconnected.\n"); } static struct usb_driver ibmcam_driver = { diff --git a/drivers/usb/ibmcam.h b/drivers/usb/ibmcam.h index 8dd6edadf52c..6eb1d99ba6eb 100644 --- a/drivers/usb/ibmcam.h +++ b/drivers/usb/ibmcam.h @@ -111,6 +111,14 @@ mr = LIMIT_RGB(mm_r); \ } +/* Debugging aid */ +#define IBMCAM_SAY_AND_WAIT(what) { \ + wait_queue_head_t wq; \ + init_waitqueue_head(&wq); \ + printk(KERN_INFO "Say: %s\n", what); \ + interruptible_sleep_on_timeout (&wq, HZ*3); \ +} + enum { STATE_SCANNING, /* Scanning for header */ STATE_LINES, /* Parsing lines */ @@ -164,12 +172,14 @@ struct usb_ibmcam { struct semaphore lock; int user; /* user count for exclusive use */ + int initialized; /* Had we already sent init sequence? */ int streaming; /* Are we streaming Isochronous? */ int grabbing; /* Are we grabbing? */ int compress; /* Should the next frame be compressed? */ char *fbuf; /* Videodev buffer area */ + int fbuf_size; /* Videodev buffer size */ int curframe; struct ibmcam_frame frame[IBMCAM_NUMFRAMES]; /* Double buffering */ diff --git a/drivers/usb/mousedev.c b/drivers/usb/mousedev.c index 8bcecdb83599..95623c9862cb 100644 --- a/drivers/usb/mousedev.c +++ b/drivers/usb/mousedev.c @@ -38,6 +38,13 @@ #include #include +#ifndef CONFIG_MOUSEDEV_SCREEN_X +#define CONFIG_MOUSEDEV_SCREEN_X 1024 +#endif +#ifndef CONFIG_MOUSEDEV_SCREEN_Y +#define CONFIG_MOUSEDEV_SCREEN_Y 768 +#endif + struct mousedev { char name[32]; int used; @@ -52,9 +59,9 @@ struct mousedev_list { struct mousedev *mousedev; struct mousedev_list *next; int dx, dy, dz, oldx, oldy; - unsigned char ps2[6]; + char ps2[6]; unsigned long buttons; - unsigned char ready, inrange, buffer, bufsiz; + unsigned char ready, buffer, bufsiz; unsigned char mode, genseq, impseq; }; @@ -75,7 +82,7 @@ static void mousedev_event(struct input_handle *handle, unsigned int type, unsig { struct mousedev *mousedev = handle->private; struct mousedev_list *list = mousedev->list; - int index; + int index, size; while (list) { switch (type) { @@ -84,18 +91,17 @@ static void mousedev_event(struct input_handle *handle, unsigned int type, unsig return; switch (code) { case ABS_X: - if (list->inrange) list->dx += (value - list->oldx) * 2000 / - (handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X]); - list->oldx = value; + size = handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X]; + list->dx += (value * CONFIG_MOUSEDEV_SCREEN_X - list->oldx) / size; + list->oldx += list->dx * size; break; case ABS_Y: - if (list->inrange) list->dy += (value - list->oldy) * 2000 / - (handle->dev->absmax[ABS_X] - handle->dev->absmin[ABS_X]); - list->oldy = value; + size = handle->dev->absmax[ABS_Y] - handle->dev->absmin[ABS_Y]; + list->dy += (value * CONFIG_MOUSEDEV_SCREEN_Y - list->oldy) / size; + list->oldy += list->dy * size; break; } break; - case EV_REL: switch (code) { case REL_X: list->dx += value; break; @@ -106,20 +112,20 @@ static void mousedev_event(struct input_handle *handle, unsigned int type, unsig case EV_KEY: switch (code) { + case BTN_0: case BTN_TOUCH: case BTN_LEFT: index = 0; break; + case BTN_4: case BTN_EXTRA: if (list->mode > 1) { index = 4; break; } case BTN_STYLUS: + case BTN_1: case BTN_RIGHT: index = 1; break; + case BTN_3: case BTN_SIDE: if (list->mode > 1) { index = 3; break; } + case BTN_2: case BTN_STYLUS2: case BTN_MIDDLE: index = 2; break; - default: - if (code >= BTN_TOOL_PEN && code <= BTN_TOOL_MOUSE) { - list->inrange = value; - return; - } - index = 0; + default: return; } switch (value) { case 0: clear_bit(index, &list->buttons); break; @@ -211,7 +217,8 @@ static void mousedev_packet(struct mousedev_list *list, unsigned char off) list->ps2[off] = 0x08 | ((list->dx < 0) << 4) | ((list->dy < 0) << 5) | (list->buttons & 0x07); list->ps2[off + 1] = (list->dx > 127 ? 127 : (list->dx < -127 ? -127 : list->dx)); list->ps2[off + 2] = (list->dy > 127 ? 127 : (list->dy < -127 ? -127 : list->dy)); - list->dx = list->dy = 0; + list->dx -= list->ps2[off + 1]; + list->dy -= list->ps2[off + 2]; list->bufsiz = off + 3; if (list->mode > 1) @@ -220,9 +227,9 @@ static void mousedev_packet(struct mousedev_list *list, unsigned char off) if (list->mode) { list->ps2[off + 3] = (list->dz > 127 ? 127 : (list->dz < -127 ? -127 : list->dz)); list->bufsiz++; - list->dz = 0; + list->dz -= list->ps2[off + 3]; } - list->ready = 0; + if (!list->dx && !list->dy && (!list->mode || !list->dz)) list->ready = 0; list->buffer = list->bufsiz; } diff --git a/drivers/usb/ov511.c b/drivers/usb/ov511.c index c26f96132675..6ec72d5023a0 100644 --- a/drivers/usb/ov511.c +++ b/drivers/usb/ov511.c @@ -1,6 +1,6 @@ /* * OmniVision OV511 Camera-to-USB Bridge Driver - * Copyright 1999 Mark W. McClelland + * Copyright 1999/2000 Mark W. McClelland * * Based on the Linux CPiA driver. * @@ -11,7 +11,7 @@ * DEBUG - Debugging code. * FIXME - Something that is broken or needs improvement. * - * Version: 1.05 + * Version: 1.06 * * Please see the file: linux/Documentation/usb/ov511.txt * and the website at: http://people.delphi.com/mmcclelland/linux/ @@ -533,7 +533,7 @@ static int ov511_mode_init_regs(struct usb_ov511 *ov511, ov511_i2c_write(dev, 0x20, 0x1c); ov511_i2c_write(dev, 0x24, 0x2e); /* 10 */ ov511_i2c_write(dev, 0x25, 0x7c); /* 8a */ - ov511_i2c_write(dev, 0x26, 0x70); + ov511_i2c_write(dev, 0x26, 0x00); /* was 0x70 */ ov511_i2c_write(dev, 0x28, 0x24); /* 24 */ ov511_i2c_write(dev, 0x2b, 0xac); ov511_i2c_write(dev, 0x2c, 0xfe); @@ -737,20 +737,16 @@ static int ov511_move_data(struct usb_ov511 *ov511, urb_t *urb) int aPackNum[10]; struct ov511_frame *frame; - if (ov511->curframe == -1) { - return 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; - + urb->iso_frame_desc[i].actual_length = 0; + urb->iso_frame_desc[i].status = 0; cdata = urb->transfer_buffer + urb->iso_frame_desc[i].offset; - if (!n) continue; - aPackNum[i] = n ? cdata[992] : -1; + if (!n || ov511->curframe == -1) continue; if (st) PDEBUG("data error: [%d] len=%d, status=%d", i, n, st); @@ -767,14 +763,27 @@ static int ov511_move_data(struct usb_ov511 *ov511, urb_t *urb) #endif if (frame->scanstate == STATE_LINES) { + int iFrameNext; if (waitqueue_active(&frame->wq)) { #if 0 PDEBUG("About to wake up waiting processes"); #endif frame->grabstate = FRAME_DONE; - ov511->curframe = -1; wake_up_interruptible(&frame->wq); } + /* If next frame is ready or grabbing, point to it */ + iFrameNext = (ov511->curframe + 1) % OV511_NUMFRAMES; + if (ov511->frame[iFrameNext].grabstate== FRAME_READY || + ov511->frame[iFrameNext].grabstate== FRAME_GRABBING) { + ov511->curframe = iFrameNext; + frame->scanstate = STATE_SCANNING; + } else { +#if 0 + PDEBUG("Frame not ready? state = %d", + ov511->frame[iFrameNext].grabstate); +#endif + ov511->curframe = -1; + } } } @@ -1624,6 +1633,9 @@ static void* ov511_probe(struct usb_device *dev, unsigned int ifnum) case 102: printk("ov511: Camera is a AverMedia InterCam Elite\n"); break; + case 112: + printk("ov511: Camera is a MediaForte MV300\n"); + break; default: err("Specific camera type (%d) not recognized", rc); err("Please contact mmcclelland@delphi.com to request"); diff --git a/drivers/usb/scanner.c b/drivers/usb/scanner.c index 97399bc2df4a..5b403d55cffe 100644 --- a/drivers/usb/scanner.c +++ b/drivers/usb/scanner.c @@ -1,7 +1,11 @@ /* -*- linux-c -*- */ /* - * Driver for USB Scanners (linux-2.3.33) + * Driver for USB Scanners (linux-2.3.41) + * + * Copyright (C) 1999, 2000 David E. Nelson + * + * Portions may be copyright Brad Keryan and Michael Gee. * * David E. Nelson (dnelson@jump.net) * @@ -19,9 +23,10 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * Based upon mouse.c (Brad Keryan) and printer.c (Michael Gee). + * Originally based upon mouse.c (Brad Keryan) and printer.c (Michael Gee). * * History + * * 0.1 8/31/1999 * * Developed/tested using linux-2.3.15 with minor ohci.c changes to @@ -30,18 +35,18 @@ * testing was performed with uhci but I was unable to get it to * work. Initial relase to the linux-usb development effort. * + * * 0.2 10/16/1999 * - * FIXED: * - Device can't be opened unless a scanner is plugged into the USB. * - Finally settled on a reasonable value for the I/O buffer's. * - Cleaned up write_scanner() * - Disabled read/write stats * - A little more code cleanup * + * * 0.3 10/18/1999 * - * FIXED: * - Device registration changed to reflect new device * allocation/registration for linux-2.3.22+. * - Adopted David Brownell's technique for @@ -52,19 +57,21 @@ * - Added user specified verdor:product USB ID's which can be passed * as module parameters. * + * * 0.3.1 - * FIXED: + * * - Applied patches for linux-2.3.25. * - Error number reporting changed to reflect negative return codes. * + * * 0.3.2 - * FIXED: + * * - Applied patches for linux-2.3.26 to scanner_init(). * - Debug read/write stats now report values as signed decimal. * * * 0.3.3 - * FIXED: + * * - Updated the bulk_msg() calls to usb usb_bulk_msg(). * - Added a small delay in the write_scanner() method to aid in * avoiding NULL data reads on HP scanners. We'll see how this works. @@ -75,13 +82,42 @@ * - kfree()'d the pointer after using usb_string() as documented in * linux-usb-api.txt. * - Added usb_set_configuration(). It got lost in version 0.3 -- ack! - * - Added the HP 5200C USB Vendor/Product ID's + * - Added the HP 5200C USB Vendor/Product ID's. + * + * + * 0.3.4 + * + * - Added Greg K-H's patch for better handling of + * Product/Vendor detection. + * - The driver now autoconfigures its endpoints including interrupt + * endpoints if one is detected. The concept was originally based + * upon David Brownell's method. + * - Added some Seiko/Epson ID's. Thanks to Karl Heinz + * Kremer . + * - Added some preliminary ioctl() calls for the PV8630 which is used + * by the HP4200. The ioctl()'s still have to be registered. Thanks + * to Adrian Perez Jorge . + * - Moved/migrated stuff to scanner.h + * - Removed the usb_set_configuration() since this is handled by + * the usb_new_device() routine in usb.c. + * - Added the HP 3300C. Thanks to Bruce Tenison. + * - Changed user specified vendor/product id so that root hub doesn't + * get falsely attached to. Thanks to Greg K-H. + * - Added some Mustek ID's. Thanks to Gernot Hoyler + * . + * - Modified the usb_string() reporting. See kfree() comment above. + * - Added Umax Astra 2000U. Thanks to Doug Alcorn. + * - Updated the printk()'s to use the info/warn/dbg macros. + * - Updated usb_bulk_msg() argument types to correct gcc warnings. + * * * TODO + * * - Simultaneous multiple device attachment - * - ioctl()'s ? + * * * Thanks to: + * * - All the folks on the linux-usb list who put up with me. :) This * has been a great learning experience for me. * - To Linus Torvalds for this great OS. @@ -90,58 +126,28 @@ * - And anybody else who chimed in with reports and suggestions. * * Performance: + * * System: Pentium 120, 80 MB RAM, OHCI, Linux 2.3.23, HP 4100C USB Scanner * 300 dpi scan of the entire bed * 24 Bit Color ~ 70 secs - 3.6 Mbit/sec * 8 Bit Gray ~ 17 secs - 4.2 Mbit/sec * */ -#include -#include -#include -#include -#include -#include - -#undef DEBUG /* Enable to print results of read/write_scanner() calls */ -#undef RD_DATA_DUMP /* Enable to dump data - limited to 24 bytes */ -#undef WR_DATA_DUMP - -#include "usb.h" - -#define IBUF_SIZE 32768 -#define OBUF_SIZE 4096 - -struct hpscan_usb_data { - struct usb_device *hpscan_dev; - int isopen; /* Not zero if the device is open */ - int present; /* Device is present on the bus */ - char *obuf, *ibuf; /* transfer buffers */ - char iep, oep; /* I/O Endpoints */ -}; - -static struct hpscan_usb_data hpscan; - -MODULE_AUTHOR("David E. Nelson, dnelson@jump.net, http://www.jump.net/~dnelson"); -MODULE_DESCRIPTION("USB Scanner Driver"); - -static __u16 vendor=0x05f9, product=0xffff; -MODULE_PARM(vendor, "i"); -MODULE_PARM_DESC(vendor, "User specified USB idVendor"); - -MODULE_PARM(product, "i"); -MODULE_PARM_DESC(product, "User specified USB idProduct"); +#include "scanner.h" static int open_scanner(struct inode * inode, struct file * file) { struct hpscan_usb_data *hps = &hpscan; + struct usb_device *dev; - if (!hps->present) { + dev = hps->hpscan_dev; + + if (!dev) { return -ENODEV; } - if (!hps->hpscan_dev) { + if (!hps->present) { return -ENODEV; } @@ -173,18 +179,18 @@ write_scanner(struct file * file, const char * buffer, size_t count, loff_t *ppos) { struct hpscan_usb_data *hps = &hpscan; - - unsigned long copy_size; - unsigned long bytes_written = 0; - unsigned long partial; - + struct usb_device *dev; + + ssize_t bytes_written = 0; ssize_t ret = 0; + int copy_size; + int partial; int result = 0; char *obuf = hps->obuf; - set_current_state(TASK_INTERRUPTIBLE); + dev = hps->hpscan_dev; while (count > 0) { @@ -200,8 +206,8 @@ write_scanner(struct file * file, const char * buffer, break; } - result = usb_bulk_msg(hps->hpscan_dev,usb_sndbulkpipe(hps->hpscan_dev, hps->oep), obuf, copy_size, &partial, 30*HZ); - dbg("write stats: result:%d copy_size:%lu partial:%lu", (int)result, copy_size, partial); + result = usb_bulk_msg(dev,usb_sndbulkpipe(dev, hps->bulk_out_ep), obuf, copy_size, &partial, 60*HZ); + dbg("write stats: result:%d copy_size:%d partial:%d", result, copy_size, partial); if (result == USB_ST_TIMEOUT) { /* NAK -- shouldn't happen */ warn("write_scanner: NAK recieved."); @@ -217,7 +223,7 @@ write_scanner(struct file * file, const char * buffer, if (partial) { unsigned char cnt, cnt_max; cnt_max = (partial > 24) ? 24 : partial; - printk(KERN_DEBUG __FILE__ ": dump: "); + printk(KERN_DEBUG "dump: "); for (cnt=0; cnt < cnt_max; cnt++) { printk("%X ", obuf[cnt]); } @@ -239,8 +245,7 @@ write_scanner(struct file * file, const char * buffer, break; } } -// mdelay(5); - set_current_state(TASK_RUNNING); + mdelay(5); return ret ? ret : bytes_written; } @@ -249,18 +254,19 @@ read_scanner(struct file * file, char * buffer, size_t count, loff_t *ppos) { struct hpscan_usb_data *hps = &hpscan; + struct usb_device *dev; ssize_t read_count, ret = 0; - unsigned long partial; - + int partial; int this_read; int result; char *ibuf = hps->ibuf; + dev = hps->hpscan_dev; + read_count = 0; - set_current_state(TASK_INTERRUPTIBLE); while (count) { if (signal_pending(current)) { @@ -270,8 +276,8 @@ read_scanner(struct file * file, char * buffer, this_read = (count > IBUF_SIZE) ? IBUF_SIZE : count; - result = usb_bulk_msg(hps->hpscan_dev, usb_rcvbulkpipe(hps->hpscan_dev, hps->iep), ibuf, this_read, &partial, 60*HZ); - dbg("read stats: result:%d this_read:%u partial:%lu", (int)result, this_read, partial); + result = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, hps->bulk_in_ep), ibuf, this_read, &partial, 60*HZ); + dbg("read stats: result:%d this_read:%d partial:%d", result, this_read, partial); if (result == USB_ST_TIMEOUT) { /* NAK -- shouldn't happen */ warn("read_scanner: NAK received"); @@ -287,7 +293,7 @@ read_scanner(struct file * file, char * buffer, if (partial) { unsigned char cnt, cnt_max; cnt_max = (partial > 24) ? 24 : partial; - printk(KERN_DEBUG __FILE__ ": dump: "); + printk(KERN_DEBUG "dump: "); for (cnt=0; cnt < cnt_max; cnt++) { printk("%X ", ibuf[cnt]); } @@ -313,7 +319,6 @@ read_scanner(struct file * file, char * buffer, buffer += this_read; } } - set_current_state(TASK_RUNNING); return ret ? ret : read_count; } @@ -321,103 +326,181 @@ static void * probe_scanner(struct usb_device *dev, unsigned int ifnum) { struct hpscan_usb_data *hps = &hpscan; + struct usb_interface_descriptor *interface; struct usb_endpoint_descriptor *endpoint; + + int ep_cnt; char *ident; + char valid_device = 0; + char have_bulk_in, have_bulk_out, have_intr; hps->present = 0; - if (vendor != 0 || product != 0) - info("USB Scanner Vendor:Product - %x:%x\n", vendor, product); + if (vendor != -1 && product != -1) { + info("probe_scanner: User specified USB scanner -- Vendor:Product - %x:%x", vendor, product); + } + +/* + * 1. Check Vendor/Product + * 2. Determine/Assign Bulk Endpoints + * 3. Determine/Assign Intr Endpoint + */ -/* There doesn't seem to be an imaging class defined in the USB +/* + * There doesn't seem to be an imaging class defined in the USB * Spec. (yet). If there is, HP isn't following it and it doesn't * look like anybody else is either. Therefore, we have to test the - * Vendor and Product ID's to see what we have. This makes this - * driver a high maintenance driver since it has to be updated with - * each release of a product. Also, other scanners may be able to use - * this driver but again, their Vendor and Product ID's must be added. + * Vendor and Product ID's to see what we have. Also, other scanners + * may be able to use this driver by specifying both vendor and + * product ID's as options to the scanner module in conf.modules. * * NOTE: Just because a product is supported here does not mean that * applications exist that support the product. It's in the hopes * that this will allow developers a means to produce applications * that will support USB products. * - * Until we detect a device which is pleasing, we silently punt. - * */ + * Until we detect a device which is pleasing, we silently punt. */ + + do { + if (dev->descriptor.idVendor == 0x03f0) { /* Hewlett Packard */ + if (dev->descriptor.idProduct == 0x0205 || /* 3300C */ + dev->descriptor.idProduct == 0x0101 || /* 4100C */ + dev->descriptor.idProduct == 0x0105 || /* 4200C */ + dev->descriptor.idProduct == 0x0202 || /* PhotoSmart S20 */ + dev->descriptor.idProduct == 0x0401 || /* 5200C */ + dev->descriptor.idProduct == 0x0201 || /* 6200C */ + dev->descriptor.idProduct == 0x0601) { /* 6300C */ + valid_device = 1; + break; + } + } + + if (dev->descriptor.idVendor == 0x06bd && /* AGFA */ + dev->descriptor.idProduct == 0x0001) { /* SnapScan 1212U */ + valid_device = 1; + break; + } + + if (dev->descriptor.idVendor == 0x1606 && /* Umax */ + dev->descriptor.idProduct == 0x0030) { /* Astra 2000U */ + valid_device = 1; + break; + } + + if (dev->descriptor.idVendor == 0x04b8) { /* Seiko/Epson Corp. */ + if (dev->descriptor.idProduct == 0x0101 || /* Perfection 636 */ + dev->descriptor.idProduct == 0x0104) { /* Perfection 1200U */ + valid_device = 1; + break; + } + } - if (dev->descriptor.idVendor != 0x03f0 && /* Hewlett Packard */ - dev->descriptor.idVendor != 0x06bd && /* AGFA */ - dev->descriptor.idVendor != 0x1606 && /* UMAX */ - dev->descriptor.idVendor != vendor ) { /* User specified */ + if (dev->descriptor.idVendor == 0x055f) { /* Mustek */ + if (dev->descriptor.idProduct == 0x0001) { /* 1200 CU */ + valid_device = 1; + break; + } + } + + if (dev->descriptor.idVendor == vendor && /* User specified */ + dev->descriptor.idProduct == product) { /* User specified */ + valid_device = 1; + break; + } + } while (0); + + if (!valid_device) return NULL; - } - if (dev->descriptor.idProduct != 0x0101 && /* HP 4100C */ - dev->descriptor.idProduct != 0x0102 && /* HP 4200C & PhotoSmart S20? */ - dev->descriptor.idProduct != 0x0202 && /* HP 5100C */ - dev->descriptor.idProduct != 0x0401 && /* HP 5200C */ - dev->descriptor.idProduct != 0x0201 && /* HP 6200C */ - dev->descriptor.idProduct != 0x0601 && /* HP 6300C */ - dev->descriptor.idProduct != 0x0001 && /* AGFA SnapScan 1212U */ - dev->descriptor.idProduct != 0x0030 && /* Umax 2000U */ - dev->descriptor.idProduct != product) { /* User specified */ + +/* + * After this point we can be a little noisy about what we are trying to + * configure. + */ + + if (dev->descriptor.bNumConfigurations != 1) { + info("probe_scanner: Only one configuration is supported."); return NULL; } -/* After this point we can be a little noisy about what we are trying to - * configure. */ - - if (dev->descriptor.bNumConfigurations != 1 || - dev->config[0].bNumInterfaces != 1) { - dbg("probe_scanner: only simple configurations supported"); + if (dev->config[0].bNumInterfaces != 1) { + info("probe_scanner: Only one interface is supported."); return NULL; } - endpoint = dev->config[0].interface[0].altsetting[0].endpoint; + interface = dev->config[0].interface[0].altsetting; + endpoint = interface[0].endpoint; + +/* + * Start checking for two bulk endpoints OR two bulk endpoints *and* one + * interrupt endpoint. If we have an interrupt endpoint go ahead and + * setup the handler. FIXME: This is a future enhancement... + */ + - if (endpoint[0].bmAttributes != USB_ENDPOINT_XFER_BULK - || endpoint [1].bmAttributes != USB_ENDPOINT_XFER_BULK) { - dbg("probe_scanner: invalid bulk endpoints"); + dbg("probe_scanner: Number of Endpoints: %d", (int) interface->bNumEndpoints); + + if ((interface->bNumEndpoints != 2) && (interface->bNumEndpoints != 3)) { + info("probe_scanner: Only two or three endpoints supported."); return NULL; } - if (usb_set_configuration(dev, dev->config[0].bConfigurationValue)) { - dbg("probe_scanner: failed usb_set_configuration"); - hps->hpscan_dev = NULL; - return NULL; - } + ep_cnt = have_bulk_in = have_bulk_out = have_intr = 0; -/* By the time we get here, we should be dealing with a fairly simple - * device that supports at least two bulk endpoints on endpoints 1 and - * 2. - * - * We determine the bulk endpoints so that the read_*() and write_*() - * procedures can recv/send data to the correct endpoint. - * */ + while (ep_cnt < interface->bNumEndpoints) { - hps->iep = hps->oep = 0; + if (!have_bulk_in && IS_EP_BULK_IN(endpoint[ep_cnt])) { + have_bulk_in = 1; + hps->bulk_in_ep = ep_cnt + 1; + ep_cnt++; + dbg("probe_scanner: bulk_in_ep: %d", (int)hps->bulk_in_ep); + continue; + } + + if (!have_bulk_out && IS_EP_BULK_OUT(endpoint[ep_cnt])) { + have_bulk_out = 1; + hps->bulk_out_ep = ep_cnt + 1; + ep_cnt++; + dbg("probe_scanner: bulk_out_ep: %d", (int)hps->bulk_out_ep); + continue; + } - if ((endpoint[0].bEndpointAddress & 0x80) == 0x80) { - hps->iep = endpoint[0].bEndpointAddress & 0x7f; - } else { - hps->oep = endpoint[0].bEndpointAddress; + if (!have_intr && IS_EP_INTR(endpoint[ep_cnt])) { + have_intr = 1; + hps->intr_ep = ep_cnt + 1; + ep_cnt++; + dbg("probe_scanner: intr_ep: %d", (int)hps->intr_ep); + continue; + } + info("probe_scanner: Undetected endpoint. Notify the maintainer."); + return NULL; /* Shouldn't ever get here unless we have something weird */ } - if ((endpoint[1].bEndpointAddress & 0x80) == 0x80) { - hps->iep = endpoint[1].bEndpointAddress & 0x7f; - } else { - hps->oep = endpoint[1].bEndpointAddress; + switch(interface->bNumEndpoints) { + case 2: + if (!have_bulk_in || !have_bulk_out) { + info("probe_scanner: Two bulk endpoints required."); + return NULL; + } + break; + case 3: + if (!have_bulk_in || !have_bulk_out || !have_intr) { + info("probe_scanner: Two bulk endpoints and one interrupt endpoint required."); + return NULL; + } + break; + default: + info("probe_scanner: Endpoint determination failed. Notify the maintainer."); + return NULL; } ident = kmalloc(256, GFP_KERNEL); - if (ident) { - usb_string(dev, dev->descriptor.iProduct, ident, 256); - info("USB Scanner (%s) found at address %d", ident, dev->devnum); - kfree(ident); - } - - dbg("probe_scanner: using bulk endpoints - In: %x Out: %x", hps->iep, hps->oep); + if (ident) { + usb_string(dev, dev->descriptor.iProduct, ident, 256); + info("USB Scanner (%s) found at address %d", ident, dev->devnum); + kfree(ident); + } hps->present = 1; hps->hpscan_dev = dev; @@ -449,6 +532,71 @@ disconnect_scanner(struct usb_device *dev, void *ptr) hps->present = 0; } +static int +ioctl_scanner(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct hpscan_usb_data *hps = &hpscan; + struct usb_device *dev; + + int result; + + dev = hps->hpscan_dev; + + switch (cmd) + { + case PV8630_RECEIVE : + { + struct { + unsigned char data; + __u16 value; + __u16 index; + } args; + + if (copy_from_user(&args, (void *)arg, sizeof(args))) + return -EFAULT; + + result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x0, + USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN, + args.value, args.index, &args.data, 1, HZ); + + dbg("ioctl_scanner recv: args.data:%x args.value:%x args.index:%x", + args.data, args.value, args.index); + + if (copy_to_user((void *)arg, &args, sizeof(args))) + return -EFAULT; + + dbg("ioctl_scanner recv: result:%d", result); + + return result; + } + case PV8630_SEND : + { + struct { + __u16 value; + __u16 index; + } args; + + if (copy_from_user(&args, (void *)arg, sizeof(args))) + return -EFAULT; + + dbg("ioctl_scanner send: args.value:%x args.index:%x", args.value, args.index); + + result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 0x1 /* Vendor Specific bRequest */, + USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_OUT /* 0x40 */, + args.value, args.index, NULL, 0, HZ); + + dbg("ioctl_scanner send: result:%d", result); + + + return result; + } + default: + return -ENOIOCTLCMD; + } + return 0; +} + static struct file_operations usb_scanner_fops = { NULL, /* seek */ @@ -456,7 +604,7 @@ file_operations usb_scanner_fops = { write_scanner, NULL, /* readdir */ NULL, /* poll */ - NULL, /* ioctl */ + ioctl_scanner, /* ioctl */ NULL, /* mmap */ open_scanner, NULL, /* flush */ diff --git a/drivers/usb/scanner.h b/drivers/usb/scanner.h new file mode 100644 index 000000000000..996eb7f59a02 --- /dev/null +++ b/drivers/usb/scanner.h @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include +#include +#include + +// #define DEBUG + +#include "usb.h" + +// #define RD_DATA_DUMP /* Enable to dump data - limited to 24 bytes */ +// #define WR_DATA_DUMP /* DEBUG does not have to be defined. */ + +#define IS_EP_BULK(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_BULK ? 1 : 0) +#define IS_EP_BULK_IN(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) +#define IS_EP_BULK_OUT(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) +#define IS_EP_INTR(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_INT ? 1 : 0) + +#ifdef DEBUG +#define SCN_DEBUG(X) X +#else +#define SCN_DEBUG(X) +#endif + +#define IBUF_SIZE 32768 +#define OBUF_SIZE 4096 + + +/* FIXME: These are NOT registered ioctls()'s */ + +#define PV8630_RECEIVE 69 +#define PV8630_SEND 70 + +struct hpscan_usb_data { + struct usb_device *hpscan_dev; + int isopen; /* Not zero if the device is open */ + int present; /* Device is present on the bus */ + char *obuf, *ibuf; /* transfer buffers */ + char bulk_in_ep, bulk_out_ep, intr_ep; /* Endpoint assignments */ + char *button; /* Front panel button buffer */ +}; + +static struct hpscan_usb_data hpscan; + +MODULE_AUTHOR("David E. Nelson, dnelson@jump.net, http://www.jump.net/~dnelson"); +MODULE_DESCRIPTION("USB Scanner Driver"); + +static __s32 vendor=-1, product=-1; +MODULE_PARM(vendor, "i"); +MODULE_PARM_DESC(vendor, "User specified USB idVendor"); + +MODULE_PARM(product, "i"); +MODULE_PARM_DESC(product, "User specified USB idProduct"); diff --git a/drivers/usb/uhci-debug.h b/drivers/usb/uhci-debug.h index b4a64413553b..73d16937a2d2 100644 --- a/drivers/usb/uhci-debug.h +++ b/drivers/usb/uhci-debug.h @@ -3,30 +3,30 @@ static void uhci_show_qh (puhci_desc_t qh) { if (qh->type != QH_TYPE) { - printk (KERN_DEBUG MODSTR "qh has not QH_TYPE\n"); + dbg("qh has not QH_TYPE"); return; } - printk (KERN_DEBUG MODSTR "uhci_show_qh %p (%08lX):\n", qh, virt_to_bus (qh)); + dbg("uhci_show_qh %p (%08lX):", qh, virt_to_bus (qh)); if (qh->hw.qh.head & UHCI_PTR_TERM) - printk (KERN_DEBUG MODSTR "Head Terminate\n"); + dbg("Head Terminate"); else { if (qh->hw.qh.head & UHCI_PTR_QH) - printk (KERN_DEBUG MODSTR "Head points to QH\n"); + dbg("Head points to QH"); else - printk (KERN_DEBUG MODSTR "Head points to TD\n"); + dbg("Head points to TD"); - printk (KERN_DEBUG MODSTR "head: %08X\n", qh->hw.qh.head & ~UHCI_PTR_BITS); + dbg("head: %08X", qh->hw.qh.head & ~UHCI_PTR_BITS); } if (qh->hw.qh.element & UHCI_PTR_TERM) - printk (KERN_DEBUG MODSTR "Element Terminate\n"); + dbg("Element Terminate"); else { if (qh->hw.qh.element & UHCI_PTR_QH) - printk (KERN_DEBUG MODSTR "Element points to QH\n"); + dbg("Element points to QH"); else - printk (KERN_DEBUG MODSTR "Element points to TD\n"); - printk (KERN_DEBUG MODSTR "element: %08X\n", qh->hw.qh.element & ~UHCI_PTR_BITS); + dbg("Element points to TD"); + dbg("element: %08X", qh->hw.qh.element & ~UHCI_PTR_BITS); } } #endif @@ -34,7 +34,7 @@ static void uhci_show_qh (puhci_desc_t qh) static void uhci_show_td (puhci_desc_t td) { char *spid; - printk (KERN_DEBUG MODSTR "uhci_show_td %p (%08lX) ", td, virt_to_bus (td)); + warn("uhci_show_td %p (%08lX) ", td, virt_to_bus (td)); switch (td->hw.td.info & 0xff) { case USB_PID_SETUP: @@ -51,7 +51,7 @@ static void uhci_show_td (puhci_desc_t td) break; } - printk ("MaxLen=%02x DT%d EndPt=%x Dev=%x, PID=%x(%s) (buf=%08x)\n", + warn("MaxLen=%02x DT%d EndPt=%x Dev=%x, PID=%x(%s) (buf=%08x)", td->hw.td.info >> 21, ((td->hw.td.info >> 19) & 1), (td->hw.td.info >> 15) & 15, @@ -60,7 +60,7 @@ static void uhci_show_td (puhci_desc_t td) spid, td->hw.td.buffer); - printk (KERN_DEBUG MODSTR "Len=%02x e%d %s%s%s%s%s%s%s%s%s%s\n", + warn("Len=%02x e%d %s%s%s%s%s%s%s%s%s%s", td->hw.td.status & 0x7ff, ((td->hw.td.status >> 27) & 3), (td->hw.td.status & TD_CTRL_SPD) ? "SPD " : "", @@ -76,14 +76,14 @@ static void uhci_show_td (puhci_desc_t td) ); #if 1 if (td->hw.td.link & UHCI_PTR_TERM) - printk (KERN_DEBUG MODSTR "Link Terminate\n"); + warn("Link Terminate"); else { if (td->hw.td.link & UHCI_PTR_QH) - printk (KERN_DEBUG MODSTR "%s, link points to QH @ %08x\n", + warn("%s, link points to QH @ %08x", (td->hw.td.link & UHCI_PTR_DEPTH ? "Depth first" : " Breadth first"), td->hw.td.link & ~UHCI_PTR_BITS); else - printk (KERN_DEBUG MODSTR "%s, link points to TD @ %08x \n", + warn("%s, link points to TD @ %08x", (td->hw.td.link & UHCI_PTR_DEPTH ? "Depth first" : " Breadth first"), td->hw.td.link & ~UHCI_PTR_BITS); } @@ -92,7 +92,7 @@ static void uhci_show_td (puhci_desc_t td) #ifdef DEBUG static void uhci_show_td_queue (puhci_desc_t td) { - printk (KERN_DEBUG MODSTR "uhci_show_td_queue %p (%08lX):\n", td, virt_to_bus (td)); + dbg("uhci_show_td_queue %p (%08lX):", td, virt_to_bus (td)); while (1) { uhci_show_td (td); if (td->hw.td.link & UHCI_PTR_TERM) @@ -102,7 +102,7 @@ static void uhci_show_td_queue (puhci_desc_t td) if (td != bus_to_virt (td->hw.td.link & ~UHCI_PTR_BITS)) td = bus_to_virt (td->hw.td.link & ~UHCI_PTR_BITS); else { - printk (KERN_DEBUG MODSTR "td points to itself!\n"); + dbg("td points to itself!"); break; } // schedule(); @@ -111,12 +111,12 @@ static void uhci_show_td_queue (puhci_desc_t td) static void uhci_show_queue (puhci_desc_t qh) { - printk (KERN_DEBUG MODSTR "uhci_show_queue %p:\n", qh); + dbg("uhci_show_queue %p:", qh); while (1) { uhci_show_qh (qh); if (qh->hw.qh.element & UHCI_PTR_QH) - printk (KERN_DEBUG MODSTR "Warning: qh->element points to qh!\n"); + dbg("Warning: qh->element points to qh!"); else if (!(qh->hw.qh.element & UHCI_PTR_TERM)) uhci_show_td_queue (bus_to_virt (qh->hw.qh.element & ~UHCI_PTR_BITS)); @@ -126,7 +126,7 @@ static void uhci_show_queue (puhci_desc_t qh) if (qh != bus_to_virt (qh->hw.qh.head & ~UHCI_PTR_BITS)) qh = bus_to_virt (qh->hw.qh.head & ~UHCI_PTR_BITS); else { - printk (KERN_DEBUG MODSTR "qh points to itself!\n"); + dbg("qh points to itself!"); break; } } @@ -134,7 +134,7 @@ static void uhci_show_queue (puhci_desc_t qh) static void uhci_show_sc (int port, unsigned short status) { - printk (" stat%d = %04x %s%s%s%s%s%s%s%s\n", + dbg(" stat%d = %04x %s%s%s%s%s%s%s%s", port, status, (status & USBPORTSC_SUSP) ? "PortSuspend " : "", @@ -164,7 +164,7 @@ void uhci_show_status (puhci_t s) portsc1 = inw (io_addr + 16); portsc2 = inw (io_addr + 18); - printk (" usbcmd = %04x %s%s%s%s%s%s%s%s\n", + dbg(" usbcmd = %04x %s%s%s%s%s%s%s%s", usbcmd, (usbcmd & USBCMD_MAXP) ? "Maxp64 " : "Maxp32 ", (usbcmd & USBCMD_CF) ? "CF " : "", @@ -175,7 +175,7 @@ void uhci_show_status (puhci_t s) (usbcmd & USBCMD_HCRESET) ? "HCRESET " : "", (usbcmd & USBCMD_RS) ? "RS " : ""); - printk (" usbstat = %04x %s%s%s%s%s%s\n", + dbg(" usbstat = %04x %s%s%s%s%s%s", usbstat, (usbstat & USBSTS_HCH) ? "HCHalted " : "", (usbstat & USBSTS_HCPE) ? "HostControllerProcessError " : "", @@ -184,11 +184,11 @@ void uhci_show_status (puhci_t s) (usbstat & USBSTS_ERROR) ? "USBError " : "", (usbstat & USBSTS_USBINT) ? "USBINT " : ""); - printk (" usbint = %04x\n", usbint); - printk (" usbfrnum = (%d)%03x\n", (usbfrnum >> 10) & 1, + dbg(" usbint = %04x", usbint); + dbg(" usbfrnum = (%d)%03x", (usbfrnum >> 10) & 1, 0xfff & (4 * (unsigned int) usbfrnum)); - printk (" flbaseadd = %08x\n", flbaseadd); - printk (" sof = %02x\n", sof); + dbg(" flbaseadd = %08x", flbaseadd); + dbg(" sof = %02x", sof); uhci_show_sc (1, portsc1); uhci_show_sc (2, portsc2); } diff --git a/drivers/usb/usb-core.c b/drivers/usb/usb-core.c index fd211b1c445b..5dfd3c3ddce6 100644 --- a/drivers/usb/usb-core.c +++ b/drivers/usb/usb-core.c @@ -132,7 +132,7 @@ int usb_init(void) #ifdef CONFIG_USB_UHCI uhci_init(); #endif -#ifdef CONFIG_USB_OHCI_HCD +#ifdef CONFIG_USB_OHCI ohci_hcd_init(); #endif #endif diff --git a/drivers/usb/usb-debug.c b/drivers/usb/usb-debug.c index 925b3e2440c0..5d560264d6c6 100644 --- a/drivers/usb/usb-debug.c +++ b/drivers/usb/usb-debug.c @@ -137,24 +137,6 @@ void usb_show_interface_descriptor(struct usb_interface_descriptor *desc) printk(" iInterface = %02x\n", desc->iInterface); } -void usb_show_hid_descriptor(struct usb_hid_descriptor * desc) -{ - int i; - - printk(" HID:\n"); - printk(" HID version %x.%02x\n", desc->bcdHID >> 8, desc->bcdHID & 0xff); - printk(" bLength = %4d\n", desc->bLength); - printk(" bDescriptorType = %02x\n", desc->bDescriptorType); - printk(" bCountryCode = %02x\n", desc->bCountryCode); - printk(" bNumDescriptors = %02x\n", desc->bNumDescriptors); - - for (i=0; ibNumDescriptors; i++) { - printk(" %d:\n", i); - printk(" bDescriptorType = %02x\n", desc->desc[i].bDescriptorType); - printk(" wDescriptorLength = %04x\n", desc->desc[i].wDescriptorLength); - } -} - void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *desc) { char *LengthCommentString = (desc->bLength == diff --git a/drivers/usb/usb-ohci.c b/drivers/usb/usb-ohci.c index 26037497fcec..509c49903dbd 100644 --- a/drivers/usb/usb-ohci.c +++ b/drivers/usb/usb-ohci.c @@ -1050,11 +1050,10 @@ static void dl_done_list (ohci_t * ohci, td_t * td_list) } } else { if (tdBE != 0) { - dlen = (bus_to_virt (tdBE) - urb->transfer_buffer + 1); if (td_list->hwCBP == 0) - urb->actual_length += dlen; + urb->actual_length = bus_to_virt (tdBE) - urb->transfer_buffer + 1; else - urb->actual_length += (bus_to_virt(tdCBP) - urb->transfer_buffer); + urb->actual_length = bus_to_virt (tdCBP) - urb->transfer_buffer; } } } diff --git a/drivers/usb/usb-serial.c b/drivers/usb/usb-serial.c index 8b00c45be9e5..748634382780 100644 --- a/drivers/usb/usb-serial.c +++ b/drivers/usb/usb-serial.c @@ -14,6 +14,11 @@ * * See Documentation/usb/usb-serial.txt for more information on using this driver * + * (01/23/2000) gkh + * Fixed problem of crash when trying to open a port that didn't have a + * device assigned to it. Made the minor node finding a little smarter, + * now it looks to find a continous space for the new device. + * * (01/21/2000) gkh * Fixed bug in visor_startup with patch from Miles Lott (milos@insync.net) * Fixed get_serial_by_minor which was all messed up for multi port @@ -464,7 +469,8 @@ static struct usb_serial *get_serial_by_minor (int minor) static struct usb_serial *get_free_serial (int num_ports, int *minor) { struct usb_serial *serial = NULL; - int i; + int i, j; + int good_spot; dbg("get_free_serial %d", num_ports); @@ -472,6 +478,14 @@ static struct usb_serial *get_free_serial (int num_ports, int *minor) for (i = 0; i < SERIAL_TTY_MINORS; ++i) { if (serial_table[i]) continue; + + good_spot = 1; + for (j = 0; j < num_ports-1; ++j) + if (serial_table[i+j]) + good_spot = 0; + if (good_spot == 0) + continue; + if (!(serial = kmalloc(sizeof(struct usb_serial), GFP_KERNEL))) { err("Out of memory"); return NULL; @@ -480,7 +494,7 @@ static struct usb_serial *get_free_serial (int num_ports, int *minor) serial_table[i] = serial; *minor = i; dbg("minor base = %d", *minor); - for (i = *minor+1; (i < num_ports) && (i < SERIAL_TTY_MINORS); ++i) + for (i = *minor+1; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i) serial_table[i] = SERIAL_PTR_EMPTY; return (serial); } @@ -583,15 +597,20 @@ static int serial_open (struct tty_struct *tty, struct file * filp) static void serial_close(struct tty_struct *tty, struct file * filp) { struct usb_serial *serial = (struct usb_serial *) tty->driver_data; - int port = MINOR(tty->device) - serial->minor; + int port; + + dbg("serial_close"); - dbg("serial_close port %d", port); - - /* do some sanity checking that we really have a device present */ if (!serial) { dbg("serial == NULL!"); return; } + + port = MINOR(tty->device) - serial->minor; + + dbg("serial_close port %d", port); + + /* do some sanity checking that we really have a device present */ if (!serial->type) { dbg("serial->type == NULL!"); return; @@ -1446,6 +1465,7 @@ static void usb_serial_disconnect(struct usb_device *dev, void *ptr) usb_unlink_urb (&serial->write_urb[i]); usb_unlink_urb (&serial->read_urb[i]); serial->active[i] = 0; + serial_table[serial->minor + i] = NULL; } /* free up any memory that we allocated */ @@ -1463,7 +1483,6 @@ static void usb_serial_disconnect(struct usb_device *dev, void *ptr) info("%s converter now disconnected from ttyUSB%d", serial->type->name, serial->minor + i); } - serial_table[serial->minor] = NULL; kfree (serial); } else { diff --git a/drivers/usb/usb-uhci.c b/drivers/usb/usb-uhci.c index 9a883f143764..3fe469699aa6 100644 --- a/drivers/usb/usb-uhci.c +++ b/drivers/usb/usb-uhci.c @@ -15,11 +15,6 @@ * $Id: usb-uhci.c,v 1.169 2000/01/20 19:50:11 acher Exp $ */ - -#ifndef EXPORT_SYMTAB -#define EXPORT_SYMTAB -#endif - #include #include #include @@ -39,45 +34,38 @@ #include #include +/* This enables debug printks */ +//#define DEBUG +/* This enables all symbols to be exported, to ease debugging oopses */ +#define DEBUG_SYMBOLS +/* This enables an extra UHCI slab for memory debugging */ +//#define DEBUG_SLAB + #include "usb.h" #include "usb-uhci.h" - -//#define DEBUG #include "uhci-debug.h" -#ifdef dbg - #undef dbg -#endif -#undef DEBUG -#ifdef DEBUG -#define dbg(format, arg...) printk(format, ## arg) -#else -#define dbg(format, arg...) -#endif - -// Please leave the following intact, it makes debugging -// (esp. after an hard oops crash) a lot easier! -#define _static //static - - #ifdef CONFIG_APM #include static int handle_apm_event (apm_event_t event); #endif -/* We added an UHCI_SLAB slab support just for debugging purposes. In real - life this compile option is NOT recommended, because slab caches are not - suitable for modules. -*/ +#ifdef DEBUG_SYMBOLS +#define _static +#ifndef EXPORT_SYMTAB +#define EXPORT_SYMTAB +#endif +#else +#define _static static +#endif -// #define _UHCI_SLAB -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB static kmem_cache_t *uhci_desc_kmem; static kmem_cache_t *urb_priv_kmem; #endif -static int rh_submit_urb (purb_t purb); -static int rh_unlink_urb (purb_t purb); +_static int rh_submit_urb (purb_t purb); +_static int rh_unlink_urb (purb_t purb); static puhci_t devs = NULL; /* used by userspace UHCI data structure dumper */ @@ -114,7 +102,7 @@ _static void dequeue_urb (puhci_t s, struct list_head *p, int do_lock) /*-------------------------------------------------------------------*/ _static int alloc_td (puhci_desc_t * new, int flags) { -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB *new= kmem_cache_alloc(uhci_desc_kmem, in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL); #else *new = (uhci_desc_t *) kmalloc (sizeof (uhci_desc_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL); @@ -216,7 +204,7 @@ _static int unlink_td (puhci_t s, puhci_desc_t element) /*-------------------------------------------------------------------*/ _static int delete_desc (puhci_desc_t element) { -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB kmem_cache_free(uhci_desc_kmem, element); #else kfree (element); @@ -227,7 +215,7 @@ _static int delete_desc (puhci_desc_t element) // Allocates qh element _static int alloc_qh (puhci_desc_t * new) { -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB *new= kmem_cache_alloc(uhci_desc_kmem, in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL); #else *new = (uhci_desc_t *) kmalloc (sizeof (uhci_desc_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL); @@ -243,7 +231,7 @@ _static int alloc_qh (puhci_desc_t * new) INIT_LIST_HEAD (&(*new)->horizontal); INIT_LIST_HEAD (&(*new)->vertical); - dbg (KERN_DEBUG MODSTR "Allocated qh @ %p\n", *new); + dbg("Allocated qh @ %p", *new); return 0; } @@ -318,7 +306,7 @@ _static int delete_qh (puhci_t s, puhci_desc_t qh) return 0; } /*-------------------------------------------------------------------*/ -void clean_td_chain (puhci_desc_t td) +_static void clean_td_chain (puhci_desc_t td) { struct list_head *p; puhci_desc_t td1; @@ -340,7 +328,7 @@ _static void cleanup_skel (puhci_t s) unsigned int n; puhci_desc_t td; - printk (KERN_DEBUG MODSTR "Cleanup_skel\n"); + dbg("cleanup_skel"); for (n = 0; n < 8; n++) { td = s->int_chain[n]; @@ -378,7 +366,7 @@ _static void cleanup_skel (puhci_t s) if (s->chain_end) kfree (s->chain_end); } - printk (KERN_DEBUG MODSTR "Cleanup_skel finished\n"); + dbg("cleanup_skel finished"); } /*-------------------------------------------------------------------*/ // allocates framelist and qh-skeletons @@ -388,7 +376,7 @@ _static int init_skel (puhci_t s) int n, ret; puhci_desc_t qh, td; - dbg (KERN_DEBUG MODSTR "init_skel\n"); + dbg("init_skel"); s->framelist = (__u32 *) get_free_page (GFP_KERNEL); @@ -397,7 +385,7 @@ _static int init_skel (puhci_t s) memset (s->framelist, 0, 4096); - dbg (KERN_DEBUG MODSTR "allocating iso desc pointer list\n"); + dbg("allocating iso desc pointer list"); s->iso_td = (puhci_desc_t *) kmalloc (1024 * sizeof (puhci_desc_t), GFP_KERNEL); if (!s->iso_td) @@ -407,7 +395,7 @@ _static int init_skel (puhci_t s) s->bulk_chain = NULL; s->chain_end = NULL; - dbg (KERN_DEBUG MODSTR "allocating iso descs\n"); + dbg("allocating iso descs"); for (n = 0; n < 1024; n++) { // allocate skeleton iso/irq-tds ret = alloc_td (&td, 0); @@ -417,7 +405,7 @@ _static int init_skel (puhci_t s) s->framelist[n] = ((__u32) virt_to_bus (td)); } - dbg (KERN_DEBUG MODSTR "allocating qh: chain_end\n"); + dbg("allocating qh: chain_end"); ret = alloc_qh (&qh); if (ret) @@ -425,7 +413,7 @@ _static int init_skel (puhci_t s) s->chain_end = qh; - dbg (KERN_DEBUG MODSTR "allocating qh: bulk_chain\n"); + dbg("allocating qh: bulk_chain"); ret = alloc_qh (&qh); if (ret) @@ -433,7 +421,7 @@ _static int init_skel (puhci_t s) insert_qh (s, s->chain_end, qh, 0); s->bulk_chain = qh; - dbg (KERN_DEBUG MODSTR "allocating qh: control_chain\n"); + dbg("allocating qh: control_chain"); ret = alloc_qh (&qh); if (ret) @@ -444,7 +432,7 @@ _static int init_skel (puhci_t s) for (n = 0; n < 8; n++) s->int_chain[n] = 0; - dbg (KERN_DEBUG MODSTR "Allocating skeleton INT-TDs\n"); + dbg("allocating skeleton INT-TDs"); for (n = 0; n < 8; n++) { puhci_desc_t td; @@ -461,12 +449,12 @@ _static int init_skel (puhci_t s) } } - dbg (KERN_DEBUG MODSTR "Linking skeleton INT-TDs\n"); + dbg("Linking skeleton INT-TDs"); for (n = 0; n < 1024; n++) { // link all iso-tds to the interrupt chains int m, o; - dbg("framelist[%i]=%x\n",n,s->framelist[n]); + dbg("framelist[%i]=%x",n,s->framelist[n]); if ((n&127)==127) ((puhci_desc_t) s->iso_td[n])->hw.td.link = virt_to_bus(s->int_chain[0]); else { @@ -481,7 +469,7 @@ _static int init_skel (puhci_t s) mb(); //uhci_show_queue(s->control_chain); - dbg (KERN_DEBUG MODSTR "init_skel exit\n"); + dbg("init_skel exit"); return 0; // OK init_skel_cleanup: @@ -511,7 +499,7 @@ _static int uhci_submit_control_urb (purb_t purb) unsigned long len, bytesrequested; char *data; - dbg (KERN_DEBUG MODSTR "uhci_submit_control start\n"); + dbg("uhci_submit_control start"); alloc_qh (&qh); // alloc qh for this request if (!qh) @@ -544,7 +532,7 @@ _static int uhci_submit_control_urb (purb_t purb) insert_td (s, qh, td, 0); // queue 'setup stage'-td in qh #if 0 - printk ("SETUP to pipe %x: %x %x %x %x %x %x %x %x\n", purb->pipe, + dbg("SETUP to pipe %x: %x %x %x %x %x %x %x %x", purb->pipe, purb->setup_packet[0], purb->setup_packet[1], purb->setup_packet[2], purb->setup_packet[3], purb->setup_packet[4], purb->setup_packet[5], purb->setup_packet[6], purb->setup_packet[7]); //uhci_show_td(td); @@ -617,7 +605,7 @@ _static int uhci_submit_control_urb (purb_t purb) insert_qh (s, s->bulk_chain, qh, 0); // insert before bulk chain //uhci_show_queue(qh); - dbg (KERN_DEBUG MODSTR "uhci_submit_control end\n"); + dbg("uhci_submit_control end"); return 0; } /*-------------------------------------------------------------------*/ @@ -656,7 +644,7 @@ _static int uhci_submit_bulk_urb (purb_t purb) /* Build the TDs for the bulk request */ len = purb->transfer_buffer_length; data = purb->transfer_buffer; - dbg (KERN_DEBUG MODSTR "uhci_submit_bulk_urb: pipe %x, len %d\n", pipe, len); + dbg("uhci_submit_bulk_urb: pipe %x, len %d", pipe, len); while (len > 0) { int pktsze = len; @@ -682,7 +670,7 @@ _static int uhci_submit_bulk_urb (purb_t purb) if (!len) td->hw.td.status |= TD_CTRL_IOC; // last one generates INT - //dbg("insert td %p, len %i\n",td,pktsze); + //dbg("insert td %p, len %i",td,pktsze); insert_td (s, qh, td, UHCI_PTR_DEPTH); @@ -698,7 +686,7 @@ _static int uhci_submit_bulk_urb (purb_t purb) insert_qh (s, s->chain_end, qh, 0); // insert before end marker //uhci_show_queue(s->bulk_chain); - dbg (KERN_DEBUG MODSTR "uhci_submit_bulk_urb: exit\n"); + dbg("uhci_submit_bulk_urb: exit"); return 0; } /*-------------------------------------------------------------------*/ @@ -726,7 +714,7 @@ _static int uhci_unlink_urb (purb_t purb) spin_lock_irqsave (&s->unlink_urb_lock, flags); // do not allow interrupts } - //dbg("unlink_urb called %p\n",purb); + //dbg("unlink_urb called %p",purb); if (purb->status == USB_ST_URB_PENDING) { // URB probably still in work purb_priv = purb->hcpriv; @@ -771,13 +759,13 @@ _static int uhci_unlink_urb (purb_t purb) } -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB kmem_cache_free(urb_priv_kmem, purb->hcpriv); #else kfree (purb->hcpriv); #endif if (purb->complete) { - dbg (KERN_DEBUG MODSTR "unlink_urb: calling completion\n"); + dbg("unlink_urb: calling completion"); purb->complete ((struct urb *) purb); usb_dec_dev_use (purb->dev); } @@ -853,8 +841,8 @@ _static int iso_find_start (purb_t purb) purb->start_frame = stop_limit; //seamless linkage if (((now - purb->start_frame) & 1023) <= (unsigned) purb->number_of_packets) { - printk (KERN_DEBUG MODSTR "iso_find_start: warning, ASAP gap, should not happen\n"); - printk (KERN_DEBUG MODSTR "iso_find_start: now %u start_frame %u number_of_packets %u pipe 0x%08x\n", + dbg("iso_find_start: warning, ASAP gap, should not happen"); + dbg("iso_find_start: now %u start_frame %u number_of_packets %u pipe 0x%08x", now, purb->start_frame, purb->number_of_packets, purb->pipe); // The following code is only for debugging purposes... #if 0 @@ -872,7 +860,7 @@ _static int iso_find_start (purb_t purb) u = list_entry (p, urb_t, urb_list); if (purb->dev != u->dev) continue; - printk (KERN_DEBUG MODSTR "urb: pipe 0x%08x status %d start_frame %u number_of_packets %u\n", + dbg("urb: pipe 0x%08x status %d start_frame %u number_of_packets %u", u->pipe, u->status, u->start_frame, u->number_of_packets); if (!usb_pipeisoc (u->pipe)) continue; @@ -891,7 +879,7 @@ _static int iso_find_start (purb_t purb) else { purb->start_frame &= 1023; if (((now - purb->start_frame) & 1023) < (unsigned) purb->number_of_packets) { - printk (KERN_DEBUG MODSTR "iso_find_start: now between start_frame and end\n"); + dbg("iso_find_start: now between start_frame and end"); return -EAGAIN; } } @@ -902,7 +890,7 @@ _static int iso_find_start (purb_t purb) if (((purb->start_frame - start_limit) & 1023) < queued_size || ((purb->start_frame + purb->number_of_packets - 1 - start_limit) & 1023) < queued_size) { - printk (KERN_DEBUG MODSTR "iso_find_start: start_frame %u number_of_packets %u start_limit %u stop_limit %u\n", + dbg("iso_find_start: start_frame %u number_of_packets %u start_limit %u stop_limit %u", purb->start_frame, purb->number_of_packets, start_limit, stop_limit); return -EAGAIN; } @@ -925,7 +913,7 @@ _static int uhci_submit_int_urb (purb_t purb) int info; unsigned int pipe = purb->pipe; - //printk("SUBMIT INT\n"); + //dbg("SUBMIT INT"); if (purb->interval < 0 || purb->interval >= 256) return -EINVAL; @@ -942,7 +930,7 @@ _static int uhci_submit_int_urb (purb_t purb) } nint--; } - dbg(KERN_INFO "Rounded interval to %i, chain %i\n", purb->interval, nint); + dbg("Rounded interval to %i, chain %i", purb->interval, nint); now = UHCI_GET_CURRENT_FRAME (s) & 1023; purb->start_frame = now; // remember start frame, just in case... @@ -1016,14 +1004,14 @@ _static int uhci_submit_iso_urb (purb_t purb) // First try to get all TDs for (n = 0; n < purb->number_of_packets; n++) { - dbg (KERN_DEBUG MODSTR "n:%d purb->iso_frame_desc[n].length:%d\n", n, purb->iso_frame_desc[n].length); + dbg("n:%d purb->iso_frame_desc[n].length:%d", n, purb->iso_frame_desc[n].length); if (!purb->iso_frame_desc[n].length) { // allows ISO striping by setting length to zero in iso_descriptor tdm[n] = 0; continue; } if(purb->iso_frame_desc[n].length > maxsze) { - printk(KERN_ERR MODSTR"submit_iso: purb->iso_frame_desc[%d].length(%d)>%d",n , purb->iso_frame_desc[n].length, maxsze); + err("submit_iso: purb->iso_frame_desc[%d].length(%d)>%d",n , purb->iso_frame_desc[n].length, maxsze); tdm[n] = 0; continue; } @@ -1070,7 +1058,7 @@ _static int uhci_submit_iso_urb (purb_t purb) } kfree (tdm); - dbg ("ISO-INT# %i, start %i, now %i\n", purb->number_of_packets, purb->start_frame, UHCI_GET_CURRENT_FRAME (s) & 1023); + dbg("ISO-INT# %i, start %i, now %i", purb->number_of_packets, purb->start_frame, UHCI_GET_CURRENT_FRAME (s) & 1023); ret = 0; err: @@ -1086,11 +1074,11 @@ _static int search_dev_ep (puhci_t s, purb_t purb) purb_t tmp; unsigned int mask = usb_pipecontrol(purb->pipe) ? (~USB_DIR_IN) : (~0); - dbg (KERN_DEBUG MODSTR "search_dev_ep:\n"); + dbg("search_dev_ep:"); spin_lock_irqsave (&s->urb_list_lock, flags); for (; p != &s->urb_list; p = p->next) { tmp = list_entry (p, urb_t, urb_list); - dbg (KERN_DEBUG MODSTR "urb: %p\n", tmp); + dbg("urb: %p", tmp); // we can accept this urb if it is not queued at this time // or if non-iso transfer requests should be scheduled for the same device and pipe if ((!usb_pipeisoc(purb->pipe) && tmp->dev == purb->dev && !((tmp->pipe ^ purb->pipe) & mask)) || @@ -1113,7 +1101,7 @@ _static int uhci_submit_urb (purb_t purb) return -ENODEV; s = (puhci_t) purb->dev->bus->hcpriv; - //printk( MODSTR"submit_urb: %p type %d\n",purb,usb_pipetype(purb->pipe)); + //dbg("submit_urb: %p type %d",purb,usb_pipetype(purb->pipe)); if (usb_pipedevice (purb->pipe) == s->rh.devnum) return rh_submit_urb (purb); /* virtual root hub */ @@ -1126,7 +1114,7 @@ _static int uhci_submit_urb (purb_t purb) } -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB purb_priv = kmem_cache_alloc(urb_priv_kmem, in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL); #else purb_priv = kmalloc (sizeof (urb_priv_t), in_interrupt ()? GFP_ATOMIC : GFP_KERNEL); @@ -1139,7 +1127,7 @@ _static int uhci_submit_urb (purb_t purb) purb->hcpriv = purb_priv; INIT_LIST_HEAD (&purb_priv->desc_list); purb_priv->short_control_packet=0; - dbg (KERN_DEBUG MODSTR "submit_urb: scheduling %p\n", purb); + dbg("submit_urb: scheduling %p", purb); switch (usb_pipetype (purb->pipe)) { case PIPE_ISOCHRONOUS: @@ -1159,11 +1147,11 @@ _static int uhci_submit_urb (purb_t purb) ret = -EINVAL; } - dbg (KERN_DEBUG MODSTR "submit_urb: scheduled with ret: %d\n", ret); + dbg("submit_urb: scheduled with ret: %d", ret); if (ret != USB_ST_NOERROR) { usb_dec_dev_use (purb->dev); -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB kmem_cache_free(urb_priv_kmem, purb_priv); #else kfree (purb_priv); @@ -1173,7 +1161,7 @@ _static int uhci_submit_urb (purb_t purb) /* purb->status = USB_ST_URB_PENDING; queue_urb (s, &purb->urb_list,1); - dbg (KERN_DEBUG MODSTR "submit_urb: exit\n"); + dbg("submit_urb: exit"); */ return 0; } @@ -1274,7 +1262,7 @@ _static int rh_send_irq (purb_t purb) purb->status = USB_ST_NOERROR; if ((data > 0) && (uhci->rh.send != 0)) { - dbg (KERN_DEBUG MODSTR "Root-Hub INT complete: port1: %x port2: %x data: %x\n", + dbg("Root-Hub INT complete: port1: %x port2: %x data: %x", inw (io_addr + USBPORTSC1), inw (io_addr + USBPORTSC2), data); purb->complete (purb); @@ -1361,7 +1349,7 @@ _static int rh_submit_urb (purb_t purb) __u16 wLength; if (usb_pipetype (pipe) == PIPE_INTERRUPT) { - dbg (KERN_DEBUG MODSTR "Root-Hub submit IRQ: every %d ms\n", purb->interval); + dbg("Root-Hub submit IRQ: every %d ms", purb->interval); uhci->rh.urb = purb; uhci->rh.send = 1; uhci->rh.interval = purb->interval; @@ -1379,7 +1367,7 @@ _static int rh_submit_urb (purb_t purb) for (i = 0; i < 8; i++) uhci->rh.c_p_r[i] = 0; - dbg(KERN_DEBUG MODSTR "Root-Hub: adr: %2x cmd(%1x): %04x %04x %04x %04x\n", + dbg("Root-Hub: adr: %2x cmd(%1x): %04x %04x %04x %04x", uhci->rh.devnum, 8, bmRType_bReq, wValue, wIndex, wLength); switch (bmRType_bReq) { @@ -1519,7 +1507,7 @@ _static int rh_submit_urb (purb_t purb) } - printk (KERN_DEBUG MODSTR "Root-Hub stat port1: %x port2: %x \n", + dbg("Root-Hub stat port1: %x port2: %x", inw (io_addr + USBPORTSC1), inw (io_addr + USBPORTSC2)); purb->actual_length = len; @@ -1534,15 +1522,13 @@ _static int rh_unlink_urb (purb_t purb) { puhci_t uhci = purb->dev->bus->hcpriv; - dbg (KERN_DEBUG MODSTR "Root-Hub unlink IRQ\n"); + dbg("Root-Hub unlink IRQ"); uhci->rh.send = 0; del_timer (&uhci->rh.rh_int_timer); return 0; } /*-------------------------------------------------------------------*/ -#define UHCI_DEBUG - /* * Map status to standard result codes * @@ -1634,7 +1620,7 @@ _static int process_transfer (puhci_t s, purb_t purb) int actual_length; int status = USB_ST_NOERROR; - dbg (KERN_DEBUG MODSTR "process_transfer: urb contains bulk/control request\n"); + dbg("process_transfer: urb contains bulk/control request"); /* if the status phase has been retriggered and the @@ -1685,7 +1671,7 @@ _static int process_transfer (puhci_t s, purb_t purb) if ( (actual_length < maxlength)) { if (purb->transfer_flags & USB_DISABLE_SPD) { ret = USB_ST_SHORT_PACKET; // treat as real error - printk (KERN_DEBUG MODSTR "process_transfer: SPD!!\n"); + dbg("process_transfer: SPD!!"); break; // exit after this TD because SP was detected } @@ -1694,7 +1680,7 @@ _static int process_transfer (puhci_t s, purb_t purb) if (uhci_packetid(last_desc->hw.td.info) == USB_PID_OUT) { qh->hw.qh.element = virt_to_bus (last_desc); // re-trigger status stage - printk(KERN_DEBUG MODSTR "uhci: short packet during control transfer, retrigger status stage @ %p\n",last_desc); + dbg("short packet during control transfer, retrigger status stage @ %p",last_desc); uhci_show_td (desc); uhci_show_td (last_desc); purb_priv->short_control_packet=1; @@ -1707,7 +1693,7 @@ _static int process_transfer (puhci_t s, purb_t purb) } data_toggle = uhci_toggle (desc->hw.td.info); - //printk(KERN_DEBUG MODSTR"process_transfer: len:%d status:%x mapped:%x toggle:%d\n", actual_length, desc->hw.td.status,status, data_toggle); + //dbg("process_transfer: len:%d status:%x mapped:%x toggle:%d", actual_length, desc->hw.td.status,status, data_toggle); } usb_settoggle (purb->dev, usb_pipeendpoint (purb->pipe), usb_pipeout (purb->pipe), !data_toggle); @@ -1720,7 +1706,7 @@ _static int process_transfer (puhci_t s, purb_t purb) status & TD_CTRL_ACTIVE && status & TD_CTRL_NAK ) { - printk("APS WORKAROUND\n"); + dbg("APS WORKAROUND"); ret=0; status=0; } @@ -1730,14 +1716,14 @@ _static int process_transfer (puhci_t s, purb_t purb) purb->status = status; - dbg(KERN_DEBUG MODSTR"process_transfer: urb %p, wanted len %d, len %d status %x err %d\n", + dbg("process_transfer: urb %p, wanted len %d, len %d status %x err %d", purb,purb->transfer_buffer_length,purb->actual_length, purb->status, purb->error_count); - //dbg(KERN_DEBUG MODSTR"process_transfer: exit\n"); + //dbg("process_transfer: exit"); #if 0 if (purb->actual_length){ char *uu; uu=purb->transfer_buffer; - dbg(KERN_DEBUG MODSTR"%x %x %x %x %x %x %x %x\n", + dbg("%x %x %x %x %x %x %x %x", *uu,*(uu+1),*(uu+2),*(uu+3),*(uu+4),*(uu+5),*(uu+6),*(uu+7)); } #endif @@ -1754,7 +1740,7 @@ _static int process_interrupt (puhci_t s, purb_t purb) int actual_length; int status = USB_ST_NOERROR; - //printk(KERN_DEBUG MODSTR"urb contains interrupt request\n"); + //dbg("urb contains interrupt request"); for (i = 0; p != &purb_priv->desc_list; p = p->next, i++) // Maybe we allow more than one TD later ;-) { @@ -1762,7 +1748,7 @@ _static int process_interrupt (puhci_t s, purb_t purb) if (desc->hw.td.status & TD_CTRL_ACTIVE) { // do not process active TDs - //printk("TD ACT Status @%p %08x\n",desc,desc->hw.td.status); + //dbg("TD ACT Status @%p %08x",desc,desc->hw.td.status); break; } @@ -1794,7 +1780,7 @@ _static int process_interrupt (puhci_t s, purb_t purb) recycle: if (purb->complete) { - //printk (KERN_DEBUG MODSTR "process_interrupt: calling completion, status %i\n",status); + //dbg("process_interrupt: calling completion, status %i",status); purb->status = status; purb->complete ((struct urb *) purb); purb->status = USB_ST_URB_PENDING; @@ -1832,7 +1818,7 @@ _static int process_iso (puhci_t s, purb_t purb) struct list_head *p = purb_priv->desc_list.next; puhci_desc_t desc = list_entry (purb_priv->desc_list.prev, uhci_desc_t, desc_list); - dbg ( /*KERN_DEBUG */ MODSTR "urb contains iso request\n"); + dbg("urb contains iso request"); if (desc->hw.td.status & TD_CTRL_ACTIVE) return USB_ST_PARTIAL_ERROR; // last TD not finished @@ -1847,7 +1833,7 @@ _static int process_iso (puhci_t s, purb_t purb) if (desc->hw.td.status & TD_CTRL_ACTIVE) { // means we have completed the last TD, but not the TDs before desc->hw.td.status &= ~TD_CTRL_ACTIVE; - printk (KERN_DEBUG MODSTR "TD still active (%x)- grrr. paranoia!\n", desc->hw.td.status); + dbg("TD still active (%x)- grrr. paranoia!", desc->hw.td.status); ret = USB_ST_PARTIAL_ERROR; purb->iso_frame_desc[i].status = ret; unlink_td (s, desc); @@ -1858,14 +1844,14 @@ _static int process_iso (puhci_t s, purb_t purb) unlink_td (s, desc); if (purb->number_of_packets <= i) { - dbg (KERN_DEBUG MODSTR "purb->number_of_packets (%d)<=(%d)\n", purb->number_of_packets, i); + dbg("purb->number_of_packets (%d)<=(%d)", purb->number_of_packets, i); ret = USB_ST_URB_INVALID_ERROR; goto err; } if (purb->iso_frame_desc[i].offset + purb->transfer_buffer != bus_to_virt (desc->hw.td.buffer)) { // Hm, something really weird is going on - dbg (KERN_DEBUG MODSTR "Pointer Paranoia: %p!=%p\n", purb->iso_frame_desc[i].offset + purb->transfer_buffer, bus_to_virt (desc->hw.td.buffer)); + dbg("Pointer Paranoia: %p!=%p", purb->iso_frame_desc[i].offset + purb->transfer_buffer, bus_to_virt (desc->hw.td.buffer)); ret = USB_ST_URB_INVALID_ERROR; purb->iso_frame_desc[i].status = ret; goto err; @@ -1880,13 +1866,13 @@ _static int process_iso (puhci_t s, purb_t purb) purb->error_count++; purb->status = purb->iso_frame_desc[i].status; } - dbg (KERN_DEBUG MODSTR "process_iso: len:%d status:%x\n", + dbg("process_iso: len:%d status:%x", purb->iso_frame_desc[i].length, purb->iso_frame_desc[i].status); delete_desc (desc); list_del (p); } - dbg ( /*KERN_DEBUG */ MODSTR "process_iso: exit %i (%d)\n", i, ret); + dbg("process_iso: exit %i (%d)", i, ret); return ret; } @@ -1898,7 +1884,7 @@ _static int process_urb (puhci_t s, struct list_head *p) spin_lock(&s->urb_list_lock); purb=list_entry (p, urb_t, urb_list); - dbg ( /*KERN_DEBUG */ MODSTR "found queued urb: %p\n", purb); + dbg("found queued urb: %p", purb); switch (usb_pipetype (purb->pipe)) { case PIPE_CONTROL: @@ -1917,10 +1903,10 @@ _static int process_urb (puhci_t s, struct list_head *p) if (purb->status != USB_ST_URB_PENDING) { int proceed = 0; - dbg ( /*KERN_DEBUG */ MODSTR "dequeued urb: %p\n", purb); + dbg("dequeued urb: %p", purb); dequeue_urb (s, p, 1); -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB kmem_cache_free(urb_priv_kmem, purb->hcpriv); #else kfree (purb->hcpriv); @@ -1945,7 +1931,7 @@ _static int process_urb (puhci_t s, struct list_head *p) // In case you need the current URB status for your completion handler if (purb->complete && (!proceed || (purb->transfer_flags & USB_URB_EARLY_COMPLETE))) { - dbg (KERN_DEBUG MODSTR "process_transfer: calling early completion\n"); + dbg("process_transfer: calling early completion"); purb->complete ((struct urb *) purb); if (!proceed && is_ring && (purb->status != USB_ST_URB_KILLED)) uhci_submit_urb (purb); @@ -1963,7 +1949,7 @@ _static int process_urb (puhci_t s, struct list_head *p) while (tmp != NULL && tmp != purb->next); // submit until we reach NULL or our own pointer or submit fails if (purb->complete && !(purb->transfer_flags & USB_URB_EARLY_COMPLETE)) { - dbg ( /*KERN_DEBUG */ MODSTR "process_transfer: calling completion\n"); + dbg("process_transfer: calling completion"); purb->complete ((struct urb *) purb); } } @@ -1991,10 +1977,10 @@ _static void uhci_interrupt (int irq, void *__uhci, struct pt_regs *regs) if (!status) /* shared interrupt, not mine */ return; - dbg ("interrupt\n"); + dbg("interrupt"); if (status != 1) { - printk (KERN_DEBUG MODSTR "interrupt, status %x\n", status); + warn("interrupt, status %x", status); // remove host controller halted state if ((status&0x20) && (s->running)) { @@ -2031,7 +2017,7 @@ _static void uhci_interrupt (int irq, void *__uhci, struct pt_regs *regs) #ifdef __alpha mb (); // ? #endif - dbg ("done\n\n\n"); + dbg("done\n\n"); } _static void reset_hc (puhci_t s) @@ -2061,7 +2047,7 @@ _static void start_hc (puhci_t s) while (inw (io_addr + USBCMD) & USBCMD_HCRESET) { if (!--timeout) { - printk (KERN_ERR MODSTR "USBCMD_HCRESET timed out!\n"); + err("USBCMD_HCRESET timed out!"); break; } } @@ -2155,17 +2141,17 @@ _static int __init alloc_uhci (int irq, unsigned int io_addr, unsigned int io_si unsigned int portstatus; portstatus = inw (io_addr + 0x10 + (s->maxports * 2)); - printk ("port %i, adr %x status %x\n", s->maxports, + dbg("port %i, adr %x status %x", s->maxports, io_addr + 0x10 + (s->maxports * 2), portstatus); if (!(portstatus & 0x0080)) break; } - dbg (KERN_DEBUG MODSTR "Detected %d ports\n", s->maxports); + dbg("Detected %d ports", s->maxports); /* This is experimental so anything less than 2 or greater than 8 is */ /* something weird and we'll ignore it */ if (s->maxports < 2 || s->maxports > 8) { - dbg (KERN_DEBUG "Port count misdetected, forcing to 2 ports\n"); + dbg("Port count misdetected, forcing to 2 ports"); s->maxports = 2; } @@ -2184,7 +2170,7 @@ _static int __init alloc_uhci (int irq, unsigned int io_addr, unsigned int io_si start_hc (s); if (request_irq (irq, uhci_interrupt, SA_SHIRQ, MODNAME, s)) { - printk(MODSTR KERN_ERR"request_irq %d failed!\n",irq); + err("request_irq %d failed!",irq); usb_free_bus (bus); reset_hc (s); release_region (s->io_addr, s->io_size); @@ -2242,12 +2228,12 @@ _static int handle_apm_event (apm_event_t event) { static int down = 0; puhci_t s = devs; - printk ("handle_apm_event(%d)\n", event); + dbg("handle_apm_event(%d)", event); switch (event) { case APM_SYS_SUSPEND: case APM_USER_SUSPEND: if (down) { - dbg (KERN_DEBUG MODSTR "received extra suspend event\n"); + dbg("received extra suspend event"); break; } while (s) { @@ -2259,7 +2245,7 @@ _static int handle_apm_event (apm_event_t event) case APM_NORMAL_RESUME: case APM_CRITICAL_RESUME: if (!down) { - dbg (KERN_DEBUG MODSTR "received bogus resume event\n"); + dbg("received bogus resume event"); break; } down = 0; @@ -2280,7 +2266,7 @@ int __init uhci_init (void) u8 type; int i=0; -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB char *slabname=kmalloc(16, GFP_KERNEL); if(!slabname) @@ -2290,7 +2276,7 @@ int __init uhci_init (void) uhci_desc_kmem = kmem_cache_create(slabname, sizeof(uhci_desc_t), 0, SLAB_HWCACHE_ALIGN, NULL, NULL); if(!uhci_desc_kmem) { - printk(KERN_ERR MODSTR"kmem_cache_create for uhci_desc failed (out of memory)\n"); + err("kmem_cache_create for uhci_desc failed (out of memory)"); return -ENOMEM; } @@ -2303,11 +2289,11 @@ int __init uhci_init (void) urb_priv_kmem = kmem_cache_create(slabname, sizeof(urb_priv_t), 0, SLAB_HWCACHE_ALIGN, NULL, NULL); if(!urb_priv_kmem) { - printk(KERN_ERR MODSTR"kmem_cache_create for urb_priv_t failed (out of memory)\n"); + err("kmem_cache_create for urb_priv_t failed (out of memory)"); return -ENOMEM; } #endif - printk (KERN_INFO MODSTR VERSTR "\n"); + info(VERSTR); for (;;) { dev = pci_find_class (PCI_CLASS_SERIAL_USB << 8, dev); @@ -2324,7 +2310,7 @@ int __init uhci_init (void) #endif if(!dev->irq) { - printk(KERN_ERR MODSTR"Found UHCI device with no IRQ assigned. Check BIOS settings!\n"); + err("Found UHCI device with no IRQ assigned. Check BIOS settings!"); continue; } @@ -2350,7 +2336,7 @@ void __exit uhci_cleanup (void) devs = devs->next; uhci_cleanup_dev(s); } -#ifdef _UHCI_SLAB +#ifdef DEBUG_SLAB kmem_cache_shrink(uhci_desc_kmem); kmem_cache_shrink(urb_priv_kmem); #endif diff --git a/drivers/usb/usb-uhci.h b/drivers/usb/usb-uhci.h index a228794468d8..2afef1cf1899 100644 --- a/drivers/usb/usb-uhci.h +++ b/drivers/usb/usb-uhci.h @@ -5,8 +5,7 @@ $Id: usb-uhci.h,v 1.31 2000/01/15 22:02:30 acher Exp $ */ #define MODNAME "usb-uhci" -#define MODSTR MODNAME": " -#define VERSTR "version v0.9 time " __TIME__ " " __DATE__ +#define VERSTR "version v1.169 time " __TIME__ " " __DATE__ /* Command register */ #define USBCMD 0 diff --git a/drivers/usb/usb.c b/drivers/usb/usb.c index 7b582b3037d9..c4db289f2339 100644 --- a/drivers/usb/usb.c +++ b/drivers/usb/usb.c @@ -661,8 +661,6 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *usb_request_bulk(struct usb_device *dev, unsigned int pipe, usb_device_irq handler, void *data, int len, void *dev_id) { urb_t *urb; - DECLARE_WAITQUEUE(wait, current); - DECLARE_WAIT_QUEUE_HEAD(wqh); api_wrapper_data *awd; if (!(urb=usb_alloc_urb(0))) @@ -1302,12 +1300,12 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char return result; } -int usb_get_class_descriptor(struct usb_device *dev, unsigned char type, - unsigned char id, unsigned char index, void *buf, int size) +int usb_get_class_descriptor(struct usb_device *dev, int ifnum, + unsigned char type, unsigned char id, void *buf, int size) { return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN, - (type << 8) + id, index, buf, size, HZ * GET_TIMEOUT); + (type << 8) + id, ifnum, buf, size, HZ * GET_TIMEOUT); } int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size) @@ -1336,31 +1334,31 @@ int usb_get_status(struct usb_device *dev, int type, int target, void *data) USB_REQ_GET_STATUS, USB_DIR_IN | type, 0, target, data, 2, HZ * GET_TIMEOUT); } -int usb_get_protocol(struct usb_device *dev) +int usb_get_protocol(struct usb_device *dev, int ifnum) { unsigned char type; int ret; if ((ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_PROTOCOL, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, - 0, 1, &type, 1, HZ * GET_TIMEOUT)) < 0) + 0, ifnum, &type, 1, HZ * GET_TIMEOUT)) < 0) return ret; return type; } -int usb_set_protocol(struct usb_device *dev, int protocol) +int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol) { return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_PROTOCOL, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - protocol, 1, NULL, 0, HZ * SET_TIMEOUT); + protocol, ifnum, NULL, 0, HZ * SET_TIMEOUT); } -int usb_set_idle(struct usb_device *dev, int duration, int report_id) +int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id) { return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - (duration << 8) | report_id, 1, NULL, 0, HZ * SET_TIMEOUT); + (duration << 8) | report_id, ifnum, NULL, 0, HZ * SET_TIMEOUT); } static void usb_set_maxpacket(struct usb_device *dev) @@ -1482,18 +1480,18 @@ int usb_set_configuration(struct usb_device *dev, int configuration) return 0; } -int usb_get_report(struct usb_device *dev, unsigned char type, unsigned char id, unsigned char index, void *buf, int size) +int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size) { return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), USB_REQ_GET_REPORT, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, - (type << 8) + id, index, buf, size, HZ * GET_TIMEOUT); + (type << 8) + id, ifnum, buf, size, HZ * GET_TIMEOUT); } -int usb_set_report(struct usb_device *dev, unsigned char type, unsigned char id, unsigned char index, void *buf, int size) +int usb_set_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size) { return usb_control_msg(dev, usb_sndctrlpipe(dev, 0), USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - (type << 8) + id, index, buf, size, HZ); + (type << 8) + id, ifnum, buf, size, HZ); } int usb_get_configuration(struct usb_device *dev) diff --git a/drivers/usb/usb.h b/drivers/usb/usb.h index b51d4234c728..dcfe65c586ac 100644 --- a/drivers/usb/usb.h +++ b/drivers/usb/usb.h @@ -270,23 +270,6 @@ struct usb_endpoint_descriptor { int extralen; } __attribute__ ((packed)); -/* HID descriptor */ -struct usb_hid_class_descriptor { - __u8 bDescriptorType; - __u16 wDescriptorLength; -} __attribute__ ((packed)); - - -struct usb_hid_descriptor { - __u8 bLength; - __u8 bDescriptorType; - __u16 bcdHID; - __u8 bCountryCode; - __u8 bNumDescriptors; - - struct usb_hid_class_descriptor desc[1]; -} __attribute__ ((packed)); - /* Interface descriptor */ struct usb_interface_descriptor { __u8 bLength; @@ -685,20 +668,20 @@ int usb_new_device(struct usb_device *dev); int usb_set_address(struct usb_device *dev); int usb_get_descriptor(struct usb_device *dev, unsigned char desctype, unsigned char descindex, void *buf, int size); -int usb_get_class_descriptor(struct usb_device *dev, unsigned char desctype, - unsigned char descindex, unsigned char ifnum, void *buf, int size); +int usb_get_class_descriptor(struct usb_device *dev, int ifnum, unsigned char desctype, + unsigned char descindex, void *buf, int size); int usb_get_device_descriptor(struct usb_device *dev); int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr); -int usb_get_status (struct usb_device *dev, int type, int target, void *data); -int usb_get_protocol(struct usb_device *dev); -int usb_set_protocol(struct usb_device *dev, int protocol); -int usb_set_interface(struct usb_device *dev, int interface, int alternate); -int usb_set_idle(struct usb_device *dev, int duration, int report_id); +int usb_get_status(struct usb_device *dev, int type, int target, void *data); +int usb_get_protocol(struct usb_device *dev, int ifnum); +int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol); +int usb_set_interface(struct usb_device *dev, int ifnum, int alternate); +int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id); int usb_set_configuration(struct usb_device *dev, int configuration); -int usb_get_report(struct usb_device *dev, unsigned char type, - unsigned char id, unsigned char index, void *buf, int size); -int usb_set_report(struct usb_device *dev, unsigned char type, - unsigned char id, unsigned char index, void *buf, int size); +int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, + unsigned char id, void *buf, int size); +int usb_set_report(struct usb_device *dev, int ifnum, unsigned char type, + unsigned char id, void *buf, int size); int usb_string(struct usb_device *dev, int index, char *buf, size_t size); int usb_clear_halt(struct usb_device *dev, int pipe); diff --git a/drivers/usb/usb_scsi.c b/drivers/usb/usb_scsi.c index 04474cb93098..c72467c6a697 100644 --- a/drivers/usb/usb_scsi.c +++ b/drivers/usb/usb_scsi.c @@ -17,8 +17,6 @@ * Also, for certain devices, the interrupt endpoint is used to convey * status of a command. * - * Basically, this stuff is WEIRD!! - * */ #include @@ -59,36 +57,41 @@ static int my_host_number; int usb_stor_debug = 1; +struct us_data; + +typedef int (*trans_cmnd)(Scsi_Cmnd*, struct us_data*); +typedef int (*trans_reset)(struct us_data*); +typedef void (*proto_cmnd)(Scsi_Cmnd*, struct us_data*); + struct us_data { - struct us_data *next; /* next device */ - struct usb_device *pusb_dev; - unsigned int flags; /* from filter initially */ - __u8 ifnum; /* interface number */ - __u8 ep_in; /* in endpoint */ - __u8 ep_out; /* out ....... */ - __u8 ep_int; /* interrupt . */ - __u8 subclass; /* as in overview */ - __u8 protocol; /* .............. */ - __u8 attention_done; /* force attn on first cmd */ - int (*pop)(Scsi_Cmnd *); /* protocol specific do cmd */ - int (*pop_reset)(struct us_data *); /* ........... device reset */ - GUID(guid); /* unique dev id */ - struct Scsi_Host *host; /* our dummy host data */ - Scsi_Host_Template *htmplt; /* own host template */ - int host_number; /* to find us */ - int host_no; /* allocated by scsi */ - int fixedlength; /* expand commands */ - Scsi_Cmnd *srb; /* current srb */ - int action; /* what to do */ - wait_queue_head_t waitq; /* thread waits */ - wait_queue_head_t ip_waitq; /* for CBI interrupts */ - __u16 ip_data; /* interrupt data */ - int ip_wanted; /* needed */ - int pid; /* control thread */ - struct semaphore *notify; /* wait for thread to begin */ - void *irq_handle; /* for USB int requests */ - unsigned int irqpipe; /* pipe for release_irq */ - int mode_xlate; /* trans MODE_6 to _10? */ + struct us_data *next; /* next device */ + struct usb_device *pusb_dev; /* this usb_device */ + unsigned int flags; /* from filter initially */ + __u8 ifnum; /* interface number */ + __u8 ep_in; /* in endpoint */ + __u8 ep_out; /* out ....... */ + __u8 ep_int; /* interrupt . */ + __u8 subclass; /* as in overview */ + __u8 protocol; /* .............. */ + __u8 attention_done; /* force attn on first cmd */ + trans_cmnd transport; /* protocol specific do cmd */ + trans_reset transport_reset; /* .......... device reset */ + proto_cmnd proto_handler; /* protocol handler */ + GUID(guid); /* unique dev id */ + struct Scsi_Host *host; /* our dummy host data */ + Scsi_Host_Template *htmplt; /* own host template */ + int host_number; /* to find us */ + int host_no; /* allocated by scsi */ + Scsi_Cmnd *srb; /* current srb */ + int action; /* what to do */ + wait_queue_head_t waitq; /* thread waits */ + wait_queue_head_t ip_waitq; /* for CBI interrupts */ + __u16 ip_data; /* interrupt data */ + int ip_wanted; /* needed */ + int pid; /* control thread */ + struct semaphore *notify; /* wait for thread to begin */ + void *irq_handle; /* for USB int requests */ + unsigned int irqpipe; /* pipe for release_irq */ }; /* @@ -116,82 +119,91 @@ static struct usb_driver storage_driver = { * Data transfer routines ***********************************************************************/ -/* transfer one buffer (breaking into packets if necessary) */ +/* Transfer one buffer (breaking into packets if necessary) + * Note that this function is necessary because if the device NAKs, we + * need to know that information directly + * + * FIXME: is the above true? Or will the URB status show ETIMEDOUT after + * retrying several times allready? Perhaps this is the way we should + * be going anyway? + */ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length) { - int max_size = usb_maxpacket(us->pusb_dev, pipe, usb_pipeout(pipe)) * 16; + int max_size; int this_xfer; int result; - unsigned long partial; - int maxtry = 100; + int partial; + int maxtry; - /* while we have data to transfer */ + /* determine the maximum packet size for these transfers */ + max_size = usb_maxpacket(us->pusb_dev, + pipe, usb_pipeout(pipe)) * 16; + + /* while we have data left to transfer */ while (length) { /* calculate how long this will be -- maximum or a remainder */ this_xfer = length > max_size ? max_size : length; length -= this_xfer; + /* FIXME: this number is totally outrageous. We need to pick + * a better (smaller) number). + */ + + /* setup the retry counter */ + maxtry = 100; + + /* set up the transfer loop */ do { /* transfer the data */ - US_DEBUGP("Bulk xfer %x(%d)\n", (unsigned int)buf, this_xfer); + US_DEBUGP("Bulk xfer 0x%x(%d) try #%d\n", + (unsigned int)buf, this_xfer, 101 - maxtry); result = usb_bulk_msg(us->pusb_dev, pipe, buf, this_xfer, &partial, HZ*5); - US_DEBUGP("bulk_msg returned %d xferred %lu/%d\n", + US_DEBUGP("bulk_msg returned %d xferred %d/%d\n", result, partial, this_xfer); /* if we stall, we need to clear it before we go on */ - if (result == USB_ST_STALL) { - US_DEBUGP("clearing endpoint halt for pipe %x\n", pipe); - usb_clear_halt(us->pusb_dev,pipe); + if (result == -EPIPE) { + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); + usb_clear_halt(us->pusb_dev, pipe); } - /* we want to retry if the device reported NAK */ - if (result == USB_ST_TIMEOUT) { - - /* if our try counter reaches 0, bail out */ - if (!maxtry--) - break; + /* update to show what data was transferred */ + this_xfer -= partial; + buf += partial; - /* otherwise, we did transmit some data, and we update pointers */ - this_xfer -= partial; - buf += partial; + /* NAK - we retry a few times */ + if (result == -ETIMEDOUT) { - } else if (!result && partial != this_xfer) { - /* result is an error, not a NAK, and short data - assume end */ - result = USB_ST_DATAUNDERRUN; - break; - - } else if (result == USB_ST_STALL && us->protocol == US_PR_CB) { - /* for CB devices, a stall isn't fatal? */ + US_DEBUGP("us_one_transfer: device NAKed\n"); /* if our try counter reaches 0, bail out */ if (!maxtry--) - break; + return -ETIMEDOUT; - this_xfer -= partial; - buf += partial; - } + /* just continue the while loop */ + continue; + } + + /* other errors (besides NAK) -- we just bail out*/ + if (result != 0) { + US_DEBUGP("us_one_transfer: device returned error %d\n", result); + return result; + } /* continue until this transfer is done */ } while ( this_xfer ); - - /* if we have some nonzero result, we return it here */ - if (result) - return result; - - /* otherwise, we advance the buf pointer - * note that the code above doesn't advance the pointer if all - * goes well - */ - buf += this_xfer; } /* if we get here, we're done and successful */ return 0; } +static unsigned int us_transfer_length(Scsi_Cmnd *srb); + /* transfer one SCSI command, using scatter-gather if requested */ +/* FIXME: what do the return codes here mean? */ static int us_transfer(Scsi_Cmnd *srb, int dir_in) { struct us_data *us = (struct us_data *)srb->host_scribble; @@ -200,6 +212,8 @@ static int us_transfer(Scsi_Cmnd *srb, int dir_in) unsigned int pipe = dir_in ? usb_rcvbulkpipe(us->pusb_dev, us->ep_in) : usb_sndbulkpipe(us->pusb_dev, us->ep_out); + /* FIXME: stop transferring data at us_transfer_length(), not + * bufflen */ if (srb->use_sg) { struct scatterlist *sg = (struct scatterlist *) srb->request_buffer; @@ -210,10 +224,10 @@ static int us_transfer(Scsi_Cmnd *srb, int dir_in) } } else - result = us_one_transfer(us, pipe, - srb->request_buffer, srb->request_bufflen); + result = us_one_transfer(us, pipe, srb->request_buffer, + us_transfer_length(srb)); - if (result) + if (result < 0) US_DEBUGP("us_transfer returning error %d\n", result); return result; } @@ -236,6 +250,15 @@ static unsigned int us_transfer_length(Scsi_Cmnd *srb) case TEST_UNIT_READY: return 0; + case REQUEST_SENSE: + case INQUIRY: + case MODE_SENSE: + return srb->cmnd[4]; + + case LOG_SENSE: + case MODE_SENSE_10: + return (srb->cmnd[7] << 8) + srb->cmnd[8]; + default: break; } @@ -252,6 +275,491 @@ static unsigned int us_transfer_length(Scsi_Cmnd *srb) return srb->request_bufflen; } +/*********************************************************************** + * Protocol routines + ***********************************************************************/ + +static int CB_transport(Scsi_Cmnd *srb, struct us_data *us); +static int Bulk_transport(Scsi_Cmnd *srb, struct us_data *us); + +static void ufi_command(Scsi_Cmnd *srb, struct us_data *us) +{ + int old_cmnd = 0; + + /* fix some commands -- this is a form of mode translation + * UFI devices only accept 12 byte long commands + * + * NOTE: This only works because a Scsi_Cmnd struct field contains + * a unsigned char cmnd[12], so we know we have storage available + */ + + /* set command length to 12 bytes (this affects the transport layer) */ + srb->cmd_len = 12; + + /* determine the correct (or minimum) data length for these commands */ + switch (us->srb->cmnd[0]) { + + /* for INQUIRY, UFI devices only ever return 36 bytes */ + case INQUIRY: + us->srb->cmnd[4] = 36; + break; + + /* change MODE_SENSE/MODE_SELECT from 6 to 10 byte commands */ + case MODE_SENSE: + case MODE_SELECT: + /* save the command so we can tell what it was */ + old_cmnd = srb->cmnd[0]; + + srb->cmnd[11] = 0; + srb->cmnd[10] = 0; + srb->cmnd[9] = 0; + + /* if we're sending data, we send all. If getting data, + * get the minimum */ + if (srb->cmnd[0] == MODE_SELECT) + srb->cmnd[8] = srb->cmnd[4]; + else + srb->cmnd[8] = 8; + + srb->cmnd[7] = 0; + srb->cmnd[6] = 0; + srb->cmnd[5] = 0; + srb->cmnd[4] = 0; + srb->cmnd[3] = 0; + srb->cmnd[2] = srb->cmnd[2]; + srb->cmnd[1] = srb->cmnd[1]; + srb->cmnd[0] = srb->cmnd[0] | 0x40; + break; + + /* again, for MODE_SENSE_10, we get the minimum (8) */ + case MODE_SENSE_10: + us->srb->cmnd[7] = 0; + us->srb->cmnd[8] = 8; + break; + + /* for REQUEST_SENSE, UFI devices only ever return 18 bytes */ + case REQUEST_SENSE: + us->srb->cmnd[4] = 18; + break; + + /* change READ_6/WRITE_6 to READ_10/WRITE_10, which + * are UFI commands */ + case WRITE_6: + case READ_6: + srb->cmnd[11] = 0; + srb->cmnd[10] = 0; + srb->cmnd[9] = 0; + srb->cmnd[8] = srb->cmnd[4]; + srb->cmnd[7] = 0; + srb->cmnd[6] = 0; + srb->cmnd[5] = srb->cmnd[3]; + srb->cmnd[4] = srb->cmnd[2]; + srb->cmnd[3] = srb->cmnd[1] & 0x1F; + srb->cmnd[2] = 0; + srb->cmnd[1] = srb->cmnd[1] & 0xE0; + srb->cmnd[0] = srb->cmnd[0] | 0x20; + break; + } /* end switch on cmnd[0] */ + + /* send the command to the transport layer */ + us->srb->result = us->transport(srb, us); + + /* if we have an error, we're going to do a + * REQUEST_SENSE automatically */ + + /* FIXME: we should only do this for device + * errors, not system errors */ + if (us->srb->result) { + int temp_result; + int count; + void* old_request_buffer; + + US_DEBUGP("Command FAILED: Issuing auto-REQUEST_SENSE\n"); + + /* set the result so the higher layers expect this data */ + us->srb->result = CHECK_CONDITION; + + us->srb->cmnd[0] = REQUEST_SENSE; + us->srb->cmnd[1] = 0; + us->srb->cmnd[2] = 0; + us->srb->cmnd[3] = 0; + us->srb->cmnd[4] = 18; + us->srb->cmnd[5] = 0; + + /* set the buffer length for transfer */ + old_request_buffer = us->srb->request_buffer; + us->srb->request_bufflen = 18; + us->srb->request_buffer = kmalloc(18, GFP_KERNEL); + + /* FIXME: what if this command fails? */ + temp_result = us->transport(us->srb, us); + US_DEBUGP("-- Result from auto-sense is %d\n", temp_result); + + /* copy the data from the request buffer to the sense buffer */ + for(count = 0; count < 18; count++) + us->srb->sense_buffer[count] = + ((unsigned char *)(us->srb->request_buffer))[count]; + + US_DEBUGP("-- sense key: 0x%x, ASC: 0x%x, ASCQ: 0x%x\n", + us->srb->sense_buffer[2] & 0xf, + us->srb->sense_buffer[12], us->srb->sense_buffer[13]); + + /* we're done here */ + kfree(us->srb->request_buffer); + us->srb->request_buffer = old_request_buffer; + return; + } + + /* FIXME: if we need to send more data, or recieve data, we should + * do it here. Then, we can do status handling here also. + * + * This includes MODE_SENSE from above + */ + if (old_cmnd == MODE_SENSE) { + unsigned char *dta = (unsigned char *)us->srb->request_buffer; + + /* calculate the new length */ + int length = (dta[0] << 8) + dta[1] + 2; + + /* copy the available data length into the structure */ + us->srb->cmnd[7] = length >> 8; + us->srb->cmnd[8] = length & 0xFF; + + /* send the command to the transport layer */ + us->srb->result = us->transport(srb, us); + + /* FIXME: this assumes that the 2nd attempt is always + * successful convert MODE_SENSE_10 return data format + * to MODE_SENSE_6 format */ + dta[0] = dta[1]; /* data len */ + dta[1] = dta[2]; /* med type */ + dta[2] = dta[3]; /* dev-spec prm */ + dta[3] = dta[7]; /* block desc len */ + printk (KERN_DEBUG USB_STORAGE + "new MODE_SENSE_6 data = %.2X %.2X %.2X %.2X\n", + dta[0], dta[1], dta[2], dta[3]); + } + + /* FIXME: if this was a TEST_UNIT_READY, and we get a NOT READY/ + * LOGICAL DRIVE NOT READY then we do a START_STOP, and retry + */ + + /* FIXME: here is where we need to fix-up the return data from + * an INQUIRY command to show ANSI SCSI rev 2 + */ + + /* FIXME: The rest of this is bogus. usb_control_msg() will only + * return an error if we've really honked things up. If it just + * needs a START_STOP, then we'll get some data back via + * REQUEST_SENSE -- either way, this belongs at a higher level + */ + +#if 0 + /* For UFI, if this is the first time we've sent this TEST_UNIT_READY + * command, we can try again + */ + if (!done_start && (us->subclass == US_SC_UFI) + && (cmd[0] == TEST_UNIT_READY) && (result < 0)) { + + /* as per spec try a start command, wait and retry */ + wait_ms(100); + + done_start++; + memset(cmd, 0, sizeof(cmd)); + cmd[0] = START_STOP; + cmd[4] = 1; /* start */ + + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_CBI_ADSC, + USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, us->ifnum, + cmd, 12, HZ*5); + US_DEBUGP("Next usb_control_msg returns %d\n", result); + + /* allow another retry */ + retry++; + continue; + } +#endif +} + +static void transparent_scsi_command(Scsi_Cmnd *srb, struct us_data *us) +{ + unsigned int savelen = us->srb->request_bufflen; + unsigned int saveallocation = 0; + +#if 0 + /* force attention on first command */ + if (!us->attention_done) { + if (us->srb->cmnd[0] == REQUEST_SENSE) { + US_DEBUGP("forcing unit attention\n"); + us->attention_done = 1; + + if (us->srb->result == USB_STOR_TRANSPORT_GOOD) { + unsigned char *p = (unsigned char *)us->srb->request_buffer; + + if ((p[2] & 0x0f) != UNIT_ATTENTION) { + p[2] = UNIT_ATTENTION; + p[12] = 0x29; /* power on, reset or bus-reset */ + p[13] = 0; + } /* if ((p[2] & 0x0f) != UNIT_ATTENTION) */ + } /* if (us->srb->result == USB_STORE_TRANSPORT_GOOD) */ + } + } /* if (!us->attention_done) */ +#endif + + /* If the command has a variable-length payload, then we do them + * in two steps -- first we do the minimum, then we recalculate + * then length, and re-issue the command + * + * we use savelen to remember how much buffer we really have + * we use savealloction to remember how much was really requested + */ + + /* FIXME: remove savelen based on mods to us_transfer_length() */ + switch (us->srb->cmnd[0]) { + case REQUEST_SENSE: + if (us->srb->request_bufflen > 18) + us->srb->request_bufflen = 18; + else + break; + saveallocation = us->srb->cmnd[4]; + us->srb->cmnd[4] = 18; + break; + + case INQUIRY: + if (us->srb->request_bufflen > 36) + us->srb->request_bufflen = 36; + else + break; + saveallocation = us->srb->cmnd[4]; + us->srb->cmnd[4] = 36; + break; + + case MODE_SENSE: + if (us->srb->request_bufflen > 4) + us->srb->request_bufflen = 4; + else + break; + saveallocation = us->srb->cmnd[4]; + us->srb->cmnd[4] = 4; + break; + + case LOG_SENSE: + case MODE_SENSE_10: + if (us->srb->request_bufflen > 8) + us->srb->request_bufflen = 8; + else + break; + saveallocation = (us->srb->cmnd[7] << 8) | us->srb->cmnd[8]; + us->srb->cmnd[7] = 0; + us->srb->cmnd[8] = 8; + break; + + default: + break; + } /* end switch on cmnd[0] */ + + /* This code supports devices which do not support {READ|WRITE}_6 + * Apparently, neither Windows or MacOS will use these commands, + * so some devices do not support them + */ + if (us->flags & US_FL_MODE_XLATE) { + + /* translate READ_6 to READ_10 */ + if (us->srb->cmnd[0] == 0x08) { + + /* get the control */ + us->srb->cmnd[9] = us->srb->cmnd[5]; + + /* get the length */ + us->srb->cmnd[8] = us->srb->cmnd[6]; + us->srb->cmnd[7] = 0; + + /* set the reserved area to 0 */ + us->srb->cmnd[6] = 0; + + /* get LBA */ + us->srb->cmnd[5] = us->srb->cmnd[3]; + us->srb->cmnd[4] = us->srb->cmnd[2]; + us->srb->cmnd[3] = 0; + us->srb->cmnd[2] = 0; + + /* LUN and other info in cmnd[1] can stay */ + + /* fix command code */ + us->srb->cmnd[0] = 0x28; + + US_DEBUGP("Changing READ_6 to READ_10\n"); + US_DEBUG(us_show_command(us->srb)); + } + + /* translate WRITE_6 to WRITE_10 */ + if (us->srb->cmnd[0] == 0x0A) { + + /* get the control */ + us->srb->cmnd[9] = us->srb->cmnd[5]; + + /* get the length */ + us->srb->cmnd[8] = us->srb->cmnd[4]; + us->srb->cmnd[7] = 0; + + /* set the reserved area to 0 */ + us->srb->cmnd[6] = 0; + + /* get LBA */ + us->srb->cmnd[5] = us->srb->cmnd[3]; + us->srb->cmnd[4] = us->srb->cmnd[2]; + us->srb->cmnd[3] = 0; + us->srb->cmnd[2] = 0; + + /* LUN and other info in cmnd[1] can stay */ + + /* fix command code */ + us->srb->cmnd[0] = 0x2A; + + US_DEBUGP("Changing WRITE_6 to WRITE_10\n"); + US_DEBUG(us_show_command(us->srb)); + } + } /* end if (us->flags & US_FL_MODE_XLATE) */ + + /* send the command to the transport layer */ + us->srb->result = us->transport(us->srb, us); + + /* if we have an error, we're going to do a REQUEST_SENSE + * automatically */ + /* FIXME: we should only do this for device errors, not + * system errors */ + if (us->srb->result) { + int temp_result; + int count; + void* old_request_buffer; + + US_DEBUGP("Command FAILED: Issuing auto-REQUEST_SENSE\n"); + + /* set the result so the higher layers expect this data */ + us->srb->result = CHECK_CONDITION; + + us->srb->cmnd[0] = REQUEST_SENSE; + us->srb->cmnd[1] = 0; + us->srb->cmnd[2] = 0; + us->srb->cmnd[3] = 0; + us->srb->cmnd[4] = 18; + us->srb->cmnd[5] = 0; + + /* set the buffer length for transfer */ + old_request_buffer = us->srb->request_buffer; + us->srb->request_bufflen = 18; + us->srb->request_buffer = kmalloc(18, GFP_KERNEL); + + /* FIXME: what if this command fails? */ + temp_result = us->transport(us->srb, us); + US_DEBUGP("-- Result from auto-sense is %d\n", temp_result); + + /* copy the data from the request buffer to the sense buffer */ + for(count = 0; count < 18; count++) + us->srb->sense_buffer[count] = + ((unsigned char *)(us->srb->request_buffer))[count]; + + US_DEBUGP("-- sense key: 0x%x, ASC: 0x%x, ASCQ: 0x%x\n", + us->srb->sense_buffer[2] & 0xf, + us->srb->sense_buffer[12], us->srb->sense_buffer[13]); + + /* we're done here */ + kfree(us->srb->request_buffer); + us->srb->request_buffer = old_request_buffer; + return; + } + + if (savelen != us->srb->request_bufflen) { + unsigned char *p = (unsigned char *)us->srb->request_buffer; + unsigned int length = 0; + + /* set correct length and retry */ + switch (us->srb->cmnd[0]) { + + /* FIXME: we should try to get all the sense data */ + case REQUEST_SENSE: + /* simply return 18 bytes */ + p[7] = 10; + length = us->srb->request_bufflen; + break; + + case INQUIRY: + length = p[4] + 5 > savelen ? savelen : p[4] + 5; + us->srb->cmnd[4] = length; + break; + + case MODE_SENSE: + US_DEBUGP("MODE_SENSE Mode data length is %d\n", p[0]); + length = p[0] + 1 > savelen ? savelen : p[0] + 1; + us->srb->cmnd[4] = length; + break; + + case LOG_SENSE: + length = ((p[2] << 8) + p[3]) + 4 > savelen ? savelen : ((p[2] << 8) + p[3]) + 4; + us->srb->cmnd[7] = length >> 8; + us->srb->cmnd[8] = length; + break; + + case MODE_SENSE_10: + US_DEBUGP("MODE_SENSE_10 Mode data length is %d\n", + (p[0] << 8) + p[1]); + length = ((p[0] << 8) + p[1]) + 6 > savelen ? savelen : ((p[0] << 8) + p[1]) + 6; + us->srb->cmnd[7] = length >> 8; + us->srb->cmnd[8] = length; + break; + } /* end switch on cmnd[0] */ + + US_DEBUGP("Old/New length = %d/%d\n", + savelen, length); + + /* issue the new command */ + /* FIXME: this assumes that the second attempt is + * always successful */ + if (us->srb->request_bufflen != length) { + US_DEBUGP("redoing cmd with len=%d\n", length); + us->srb->request_bufflen = length; + us->srb->result = us->transport(us->srb, us); + } + + /* reset back to original values */ + us->srb->request_bufflen = savelen; + + /* fix data as necessary */ + switch (us->srb->cmnd[0]) { + case INQUIRY: + if ((((unsigned char*)us->srb->request_buffer)[2] & 0x7) == 0) { + US_DEBUGP("Fixing INQUIRY data, setting SCSI rev to 2\n"); + ((unsigned char*)us->srb->request_buffer)[2] |= 2; + } + /* FALL THROUGH */ + case REQUEST_SENSE: + case MODE_SENSE: + if (us->srb->use_sg == 0 && length > 0) { + int i; + printk(KERN_DEBUG "Data is"); + for (i = 0; i < 32 && i < length; ++i) + printk(" %.2x", ((unsigned char *)us->srb->request_buffer)[i]); + if (i < length) + printk(" ..."); + printk("\n"); + } + + /* FIXME: is this really necessary? */ + us->srb->cmnd[4] = saveallocation; + break; + + case LOG_SENSE: + case MODE_SENSE_10: + /* FIXME: is this really necessary? */ + us->srb->cmnd[7] = saveallocation >> 8; + us->srb->cmnd[8] = saveallocation; + break; + } /* end switch on cmnd[0] */ + } /* if good command */ +} + /*********************************************************************** * Transport routines ***********************************************************************/ @@ -260,30 +768,41 @@ static int CBI_irq(int state, void *buffer, int len, void *dev_id) { struct us_data *us = (struct us_data *)dev_id; - US_DEBUGP("CBI_irq() called!!\n"); + US_DEBUGP("USB IRQ recieved for device on host %d\n", us->host_no); + /* save the data for interpretation later */ if (state != USB_ST_REMOVED) { us->ip_data = le16_to_cpup((__u16 *)buffer); - US_DEBUGP("Interrupt Status %x\n", us->ip_data); + US_DEBUGP("Interrupt Status 0x%x\n", us->ip_data); } + /* was this a wanted interrupt? */ if (us->ip_wanted) { us->ip_wanted = 0; wake_up(&us->ip_waitq); + } else { + US_DEBUGP("ERROR: Unwanted interrupt received!\n"); } - /* this return code is truly meaningless */ + /* This return code is truly meaningless -- and I mean truly. It gets + * ignored by other layers. It used to indicate if we wanted to get + * another interrupt or disable the interrupt callback + */ return 0; } -static int pop_CB_reset(struct us_data *us) +/* FIXME: this reset function doesn't really reset the port, and it + * should. Actually it should probably do what it's doing here, and + * reset the port physically + */ +static int CB_reset(struct us_data *us) { unsigned char cmd[12]; int result; - US_DEBUGP("pop_CB_reset\n"); + US_DEBUGP("CB_reset\n"); - memset(cmd, -1, sizeof(cmd)); + memset(cmd, 0xFF, sizeof(cmd)); cmd[0] = SEND_DIAGNOSTIC; cmd[1] = 4; result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), @@ -291,104 +810,71 @@ static int pop_CB_reset(struct us_data *us) 0, us->ifnum, cmd, sizeof(cmd), HZ*5); /* long wait for reset */ - schedule_timeout(HZ*6); - US_DEBUGP("pop_CB_reset: clearing endpoint halt\n"); + US_DEBUGP("CB_reset: clearing endpoint halt\n"); usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_in)); - usb_clear_halt(us->pusb_dev, usb_sndbulkpipe(us->pusb_dev, us->ep_out)); + usb_clear_halt(us->pusb_dev, usb_rcvbulkpipe(us->pusb_dev, us->ep_out)); - US_DEBUGP("pop_CB_reset done\n"); + US_DEBUGP("CB_reset done\n"); return 0; } -static int pop_CB_command(Scsi_Cmnd *srb) +static int pop_CB_status(Scsi_Cmnd *srb); + +/* FIXME: we also need a CBI_command which sets up the completion + * interrupt, and waits for it + */ +static int CB_transport(Scsi_Cmnd *srb, struct us_data *us) { - struct us_data *us = (struct us_data *)srb->host_scribble; - unsigned char cmd[16]; int result; - int retry = 5; - int done_start = 0; - /* we'll try this up to 5 times? */ - while (retry--) { - if (us->flags & US_FL_FIXED_COMMAND) { - memset(cmd, 0, us->fixedlength); - - /* fix some commands */ - - switch (srb->cmnd[0]) { - case WRITE_6: - case READ_6: - cmd[0] = srb->cmnd[0] | 0x20; - cmd[1] = srb->cmnd[1] & 0xE0; - cmd[2] = 0; - cmd[3] = srb->cmnd[1] & 0x1F; - cmd[4] = srb->cmnd[2]; - cmd[5] = srb->cmnd[3]; - cmd[8] = srb->cmnd[4]; - break; + US_DEBUGP("CBI gets a command:\n"); + US_DEBUG(us_show_command(srb)); - case MODE_SENSE: - case MODE_SELECT: - us->mode_xlate = (srb->cmnd[0] == MODE_SENSE); - cmd[0] = srb->cmnd[0] | 0x40; - cmd[1] = srb->cmnd[1]; - cmd[2] = srb->cmnd[2]; - cmd[8] = srb->cmnd[4]; - break; + /* FIXME: we aren't setting the ip_wanted indicator early enough, which + * causes some commands to never complete. This hangs the driver. + */ - default: - us->mode_xlate = 0; - memcpy(cmd, srb->cmnd, srb->cmd_len); - break; - } /* switch */ - - result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), - US_CBI_ADSC, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - 0, us->ifnum, - cmd, us->fixedlength, HZ*5); - US_DEBUGP("First usb_control_msg returns %d\n", result); - - /* For UFI, if this is the first time we've sent this TEST_UNIT_READY - * command, we can try again - */ - if (!done_start && (us->subclass == US_SC_UFI) - && (cmd[0] == TEST_UNIT_READY) && (result < 0)) { - - /* as per spec try a start command, wait and retry */ - wait_ms(100); - - done_start++; - memset(cmd, 0, sizeof(cmd)); - cmd[0] = START_STOP; - cmd[4] = 1; /* start */ - - result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), - US_CBI_ADSC, - USB_TYPE_CLASS | USB_RECIP_INTERFACE, - 0, us->ifnum, - cmd, us->fixedlength, HZ*5); - US_DEBUGP("Next usb_control_msg returns %d\n", result); + /* let's send the command via the control pipe */ + result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), + US_CBI_ADSC, USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, us->ifnum, + srb->cmnd, srb->cmd_len, HZ*5); - /* allow another retry */ - retry++; - continue; - } - } else { /* !US_FL_FIXED_COMMAND */ - result = usb_control_msg(us->pusb_dev, usb_sndctrlpipe(us->pusb_dev,0), - US_CBI_ADSC, USB_TYPE_CLASS | USB_RECIP_INTERFACE, - 0, us->ifnum, - srb->cmnd, srb->cmd_len, HZ*5); + /* check the return code for the command */ + if (result < 0) { + US_DEBUGP("Call to usb_control_msg() returned %d\n", result); + + /* a stall is a fatal condition from the device */ + if (result == -EPIPE) { + US_DEBUGP("-- Stall on control pipe detected. Clearing\n"); + + US_DEBUGP("-- Return from usb_clear_halt() is %d\n", + usb_clear_halt(us->pusb_dev, + usb_sndctrlpipe(us->pusb_dev, 0))); + return USB_STOR_TRANSPORT_ERROR; } - - /* return an answer if we've got one */ - if (/*result != USB_ST_STALL &&*/ result != USB_ST_TIMEOUT) - return result; + + /* FIXME: we need to handle NAKs here */ + return USB_STOR_TRANSPORT_ERROR; } - /* all done -- return our status */ - return result; + /* transfer the data payload for this command, if one exists*/ + if (us_transfer_length(srb)) { + result = us_transfer(srb, US_DIRECTION(srb->cmnd[0])); + US_DEBUGP("CBI attempted to transfer data, result is 0x%x\n", result); + + /* FIXME: what do the return codes from us_transfer mean? */ + if ((result < 0) && + (result != USB_ST_DATAUNDERRUN) && + (result != USB_ST_STALL)) { + return DID_ERROR << 16; + } + } /* if (us_transfer_length(srb)) */ + + /* get status and return it */ + return pop_CB_status(srb); } /* @@ -402,7 +888,7 @@ static int pop_CB_status(Scsi_Cmnd *srb) __u8 status[2]; int retry = 5; - US_DEBUGP("pop_CB_status, proto=%x\n", us->protocol); + US_DEBUGP("pop_CB_status, proto=0x%x\n", us->protocol); switch (us->protocol) { case US_PR_CB: /* get from control */ @@ -419,14 +905,15 @@ static int pop_CB_status(Scsi_Cmnd *srb) US_DEBUGP("Bad AP status request %d\n", result); return DID_ABORT << 16; } - US_DEBUGP("Got AP status %x %x\n", status[0], status[1]); + US_DEBUGP("Got AP status 0x%x 0x%x\n", status[0], status[1]); if (srb->cmnd[0] != REQUEST_SENSE && srb->cmnd[0] != INQUIRY && ( (status[0] & ~3) || status[1])) return (DID_OK << 16) | 2; else - return DID_OK << 16; + return USB_STOR_TRANSPORT_GOOD; break; + /* FIXME: this should be in a separate function */ case US_PR_CBI: /* get from interrupt pipe */ @@ -434,84 +921,45 @@ static int pop_CB_status(Scsi_Cmnd *srb) us->ip_wanted = 1; /* go to sleep until we get this interrup */ + /* FIXME: this should be changed to use a timeout */ sleep_on(&us->ip_waitq); - - /* NO! We don't release this IRQ. We just re-use the handler - usb_release_irq(us->pusb_dev, us->irq_handle, us->irqpipe); - us->irq_handle = NULL; - */ - + if (us->ip_wanted) { US_DEBUGP("Did not get interrupt on CBI\n"); us->ip_wanted = 0; - return DID_ABORT << 16; + return USB_STOR_TRANSPORT_ERROR; } + + US_DEBUGP("Got interrupt data 0x%x\n", us->ip_data); - US_DEBUGP("Got interrupt data %x\n", us->ip_data); - - /* sort out what it means */ - + /* UFI gives us ASC and ASCQ, like a request sense */ + /* FIXME: is this right? do REQUEST_SENSE and INQUIRY need special + * case handling? + */ if (us->subclass == US_SC_UFI) { - /* gives us asc and ascq, as per request sense */ - if (srb->cmnd[0] == REQUEST_SENSE || srb->cmnd[0] == INQUIRY) - return DID_OK << 16; + return USB_STOR_TRANSPORT_GOOD; else - return (DID_OK << 16) + ((us->ip_data & 0xff) ? 2 : 0); + if (us->ip_data) + return USB_STOR_TRANSPORT_FAILED; + else + return USB_STOR_TRANSPORT_GOOD; } - if (us->ip_data & 0xff) { - US_DEBUGP("Bad CBI interrupt data %x\n", us->ip_data); - return DID_ABORT << 16; - } - return (DID_OK << 16) + ((us->ip_data & 0x300) ? 2 : 0); - } - return DID_ERROR << 16; -} - -/* Protocol command handlers */ - -static int pop_CBI(Scsi_Cmnd *srb) -{ - int result; - - US_DEBUGP("CBI gets a command:\n"); - US_DEBUG(us_show_command(srb)); - /* run the command */ - if ((result = pop_CB_command(srb)) < 0) { - US_DEBUGP("Call to pop_CB_command returned %d\n", result); - if (result == USB_ST_STALL || result == USB_ST_TIMEOUT) { - return (DID_OK << 16) | 2; - } - return DID_ERROR << 16; - } - - /* transfer the data */ - if (us_transfer_length(srb)) { - result = us_transfer(srb, US_DIRECTION(srb->cmnd[0])); - if ((result < 0) && - (result != USB_ST_DATAUNDERRUN) && - (result != USB_ST_STALL)) { - US_DEBUGP("CBI attempted to transfer data, result is %x\n", result); - return DID_ERROR << 16; - } -#if 0 - else if (result == USB_ST_DATAUNDERRUN) { - return DID_OK << 16; + /* otherwise, we interpret the data normally */ + switch (us->ip_data) { + case 0x0001: + return USB_STOR_TRANSPORT_GOOD; + case 0x0002: + return USB_STOR_TRANSPORT_FAILED; + default: + return USB_STOR_TRANSPORT_ERROR; } - } else { - if (!result) { - return DID_OK << 16; - } -#endif } - - /* get status */ - return pop_CB_status(srb); } -static int pop_Bulk_reset(struct us_data *us) +static int Bulk_reset(struct us_data *us) { int result; @@ -525,7 +973,6 @@ static int pop_Bulk_reset(struct us_data *us) usb_clear_halt(us->pusb_dev, usb_sndbulkpipe(us->pusb_dev, us->ep_out)); /* long wait for reset */ - schedule_timeout(HZ*6); return result; @@ -533,103 +980,131 @@ static int pop_Bulk_reset(struct us_data *us) /* * The bulk only protocol handler. - * Uses the in and out endpoints to transfer commands and data (nasty) + * Uses the in and out endpoints to transfer commands and data */ -static int pop_Bulk(Scsi_Cmnd *srb) +static int Bulk_transport(Scsi_Cmnd *srb, struct us_data *us) { - struct us_data *us = (struct us_data *)srb->host_scribble; struct bulk_cb_wrap bcb; struct bulk_cs_wrap bcs; int result; - unsigned long partial; - int stall; + int pipe; + int partial; /* set up the command wrapper */ - bcb.Signature = US_BULK_CB_SIGN; - bcb.DataTransferLength = us_transfer_length(srb);; + bcb.DataTransferLength = us_transfer_length(srb); bcb.Flags = US_DIRECTION(srb->cmnd[0]) << 7; bcb.Tag = srb->serial_number; bcb.Lun = 0; + bcb.Length = srb->cmd_len; + + /* construct the pipe handle */ + pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out); + + /* copy the command payload */ memset(bcb.CDB, 0, sizeof(bcb.CDB)); - memcpy(bcb.CDB, srb->cmnd, srb->cmd_len); - if (us->flags & US_FL_FIXED_COMMAND) { - bcb.Length = us->fixedlength; - } else { - bcb.Length = srb->cmd_len; - } + memcpy(bcb.CDB, srb->cmnd, bcb.Length); /* send it to out endpoint */ - - US_DEBUGP("Bulk command S %x T %x L %d F %d CL %d\n", + US_DEBUGP("Bulk command S 0x%x T 0x%x L %d F %d CL %d\n", bcb.Signature, bcb.Tag, bcb.DataTransferLength, bcb.Flags, bcb.Length); - result = usb_bulk_msg(us->pusb_dev, - usb_sndbulkpipe(us->pusb_dev, us->ep_out), &bcb, + result = usb_bulk_msg(us->pusb_dev, pipe, &bcb, US_BULK_CB_WRAP_LEN, &partial, HZ*5); - if (result) { - US_DEBUGP("Bulk command result %x\n", result); - return DID_ABORT << 16; - } + US_DEBUGP("Bulk command transfer result 0x%x\n", result); - //return DID_BAD_TARGET << 16; - /* send/receive data */ - - if (bcb.DataTransferLength) { - result = us_transfer(srb, bcb.Flags); - if (result && result != USB_ST_DATAUNDERRUN && result != USB_ST_STALL) { - US_DEBUGP("Bulk transfer result %x\n", result); - return DID_ABORT << 16; + /* if we stall, we need to clear it before we go on */ + if (result == -EPIPE) { + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); + usb_clear_halt(us->pusb_dev, pipe); + } + + /* if the command transfered well, then we go to the data stage */ + /* FIXME: Regardless of the status of the data stage, we go on to the + * status stage. Note that this implies that if a command is + * partially successful, we rely on the device reporting an error + * the CSW. The spec says that the device may just decide to short us. + */ + if (result == 0) { + /* send/receive data payload, if there is any */ + if (bcb.DataTransferLength) { + result = us_transfer(srb, bcb.Flags); + US_DEBUGP("Bulk data transfer result 0x%x\n", result); +#if 0 + if ((result < 0) && (result != USB_ST_DATAUNDERRUN) + && (result != USB_ST_STALL)) { + US_DEBUGP("Bulk data transfer result 0x%x\n", result); + return DID_ABORT << 16; + } +#endif } } - /* get status */ + /* See flow chart on pg 15 of the Bulk Only Transport spec for + * an explanation of how this code works. + */ + + /* construct the pipe handle */ + pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in); + + /* get CSW for device status */ + result = usb_bulk_msg(us->pusb_dev, pipe, &bcs, + US_BULK_CS_WRAP_LEN, &partial, HZ*5); + + /* did the attempt to read the CSW fail? */ + if (result == -EPIPE) { + US_DEBUGP("clearing endpoint halt for pipe 0x%x\n", pipe); + usb_clear_halt(us->pusb_dev, pipe); - stall = 0; - do { - result = usb_bulk_msg(us->pusb_dev, - usb_rcvbulkpipe(us->pusb_dev, us->ep_in), &bcs, + /* get the status again */ + result = usb_bulk_msg(us->pusb_dev, pipe, &bcs, US_BULK_CS_WRAP_LEN, &partial, HZ*5); - if (result == USB_ST_STALL || result == USB_ST_TIMEOUT) - stall++; - else - break; - } while ( stall < 3); - if (result && result != USB_ST_DATAUNDERRUN) { - US_DEBUGP("Bulk status result = %x\n", result); + + /* if it fails again, we need a reset and return an error*/ + if (result == -EPIPE) { + Bulk_reset(us); + return (DID_ABORT << 16); + } + } + + /* if we still have a failure at this point, we're in trouble */ + if (result) { + US_DEBUGP("Bulk status result = 0x%x\n", result); return DID_ABORT << 16; } /* check bulk status */ - - US_DEBUGP("Bulk status S %x T %x R %d V %x\n", + US_DEBUGP("Bulk status S 0x%x T 0x%x R %d V 0x%x\n", bcs.Signature, bcs.Tag, bcs.Residue, bcs.Status); if (bcs.Signature != US_BULK_CS_SIGN || bcs.Tag != bcb.Tag || - bcs.Status > US_BULK_STAT_PHASE) { + bcs.Status > US_BULK_STAT_PHASE || partial != 13) { US_DEBUGP("Bulk logical error\n"); return DID_ABORT << 16; } - /* We need to fix some of this status handling. */ + /* based on the status code, we report good or bad */ switch (bcs.Status) { case US_BULK_STAT_OK: - return DID_OK << 16; - - case US_BULK_STAT_FAIL: - /* check for underrun - dont report */ + /* if there is residue, we really didn't finish the command */ if (bcs.Residue) + return DID_ERROR << 16; + else return DID_OK << 16; - //pop_Bulk_reset(us); - break; + + case US_BULK_STAT_FAIL: + return DID_ERROR << 16; case US_BULK_STAT_PHASE: + Bulk_reset(us); return DID_ERROR << 16; } - return (DID_OK << 16) | 2; /* check sense required */ + return DID_OK << 16; /* check sense required */ } -/* Host functions */ +/*********************************************************************** + * Host functions + ***********************************************************************/ /* detect adapter (always true ) */ static int us_detect(struct SHT *sht) @@ -716,6 +1191,7 @@ static int us_queuecommand( Scsi_Cmnd *srb , void (*done)(Scsi_Cmnd *)) return 0; } +/* FIXME: This doesn't actually abort anything */ static int us_abort( Scsi_Cmnd *srb ) { return 0; @@ -723,13 +1199,14 @@ static int us_abort( Scsi_Cmnd *srb ) static int us_bus_reset( Scsi_Cmnd *srb ) { - struct us_data *us = (struct us_data *)srb->host->hostdata[0]; + // struct us_data *us = (struct us_data *)srb->host->hostdata[0]; US_DEBUGP("Bus reset requested\n"); - us->pop_reset(us); + // us->transport_reset(us); return SUCCESS; } +/* FIXME: This doesn't actually reset anything */ static int us_host_reset( Scsi_Cmnd *srb ) { return 0; @@ -766,29 +1243,28 @@ int usb_stor_proc_info (char *buffer, char **start, off_t offset, return length; /* print the controler name */ - SPRINTF ("Host scsi%d: usb-scsi\n", hostno); + SPRINTF ("Host scsi%d: usb-storage\n", hostno); /* print product and vendor strings */ tmp_ptr = kmalloc(256, GFP_KERNEL); if (!us->pusb_dev || !tmp_ptr) { - SPRINTF("Vendor: Unknown Vendor\n"); - SPRINTF("Product: Unknown Product\n"); + SPRINTF(" Vendor: Unknown Vendor\n"); + SPRINTF(" Product: Unknown Product\n"); } else { - SPRINTF("Vendor: "); + SPRINTF(" Vendor: "); if (usb_string(us->pusb_dev, us->pusb_dev->descriptor.iManufacturer, tmp_ptr, 256) > 0) SPRINTF("%s\n", tmp_ptr); else SPRINTF("Unknown Vendor\n"); - SPRINTF("Product: "); + SPRINTF(" Product: "); if (usb_string(us->pusb_dev, us->pusb_dev->descriptor.iProduct, tmp_ptr, 256) > 0) SPRINTF("%s\n", tmp_ptr); else - SPRINTF("Unknown Vendor\n"); + SPRINTF("Unknown Product\n"); } - kfree(tmp_ptr); - SPRINTF("Protocol: "); + SPRINTF(" Protocol: "); switch (us->protocol) { case US_PR_CB: SPRINTF("Control/Bulk\n"); @@ -808,7 +1284,7 @@ int usb_stor_proc_info (char *buffer, char **start, off_t offset, } /* show the GUID of the device */ - SPRINTF("GUID: " GUID_FORMAT "\n", GUID_ARGS(us->guid)); + SPRINTF(" GUID: " GUID_FORMAT "\n", GUID_ARGS(us->guid)); /* * Calculate start of next buffer, and return value. @@ -850,11 +1326,11 @@ static Scsi_Host_Template my_host_template = { NULL, /* bios_param */ 1, /* can_queue */ -1, /* this_id */ - SG_ALL, /* sg_tablesize */ + SG_ALL, /* sg_tablesize */ 1, /* cmd_per_lun */ 0, /* present */ - FALSE, /* unchecked_isa_dma */ - FALSE, /* use_clustering */ + FALSE, /* unchecked_isa_dma */ + FALSE, /* use_clustering */ TRUE, /* use_new_eh_code */ TRUE /* emulated */ }; @@ -865,7 +1341,7 @@ static unsigned char sense_notready[] = { 0x02, /* not ready */ 0x00, 0x00, - 10, /* additional length */ + 0x0a, /* additional length */ 0x00, 0x00, 0x00, @@ -906,254 +1382,57 @@ static int usb_stor_control_thread(void * __us) action = us->action; us->action = 0; + /* FIXME: we need to examine placment of break; and + * scsi_done() calls */ + switch (action) { case US_ACT_COMMAND: + /* bad device */ if (us->srb->target || us->srb->lun) { - /* bad device */ - US_DEBUGP( "Bad device number (%d/%d) or dev %x\n", + US_DEBUGP( "Bad device number (%d/%d) or dev 0x%x\n", us->srb->target, us->srb->lun, (unsigned int)us->pusb_dev); us->srb->result = DID_BAD_TARGET << 16; - } else if (!us->pusb_dev) { - /* our device has gone - pretend not ready */ + us->srb->scsi_done(us->srb); + us->srb = NULL; + break; + } + /* our device has gone - pretend not ready */ + /* FIXME: we also need to handle INQUIRY here, + * probably */ + if (!us->pusb_dev) { if (us->srb->cmnd[0] == REQUEST_SENSE) { - memcpy(us->srb->request_buffer, sense_notready, sizeof(sense_notready)); + memcpy(us->srb->request_buffer, sense_notready, + sizeof(sense_notready)); us->srb->result = DID_OK << 16; } else { us->srb->result = (DID_OK << 16) | 2; } - } else { - US_DEBUG(us_show_command(us->srb)); - if (us->srb->cmnd[0] == START_STOP && - us->pusb_dev->descriptor.idProduct == 0x0001 && - us->pusb_dev->descriptor.idVendor == 0x04e6) - us->srb->result = DID_OK << 16; - else { - unsigned int savelen = us->srb->request_bufflen; - unsigned int saveallocation = 0; - - /* check for variable length - do properly if so */ - switch (us->srb->cmnd[0]) { - case REQUEST_SENSE: - if (us->srb->request_bufflen > 18) - us->srb->request_bufflen = 18; - else - break; - saveallocation = us->srb->cmnd[4]; - us->srb->cmnd[4] = 18; - break; - - case INQUIRY: - if (us->srb->request_bufflen > 36) - us->srb->request_bufflen = 36; - else - break; - saveallocation = us->srb->cmnd[4]; - us->srb->cmnd[4] = 36; - break; - - case MODE_SENSE: - if (us->srb->request_bufflen > 4) - us->srb->request_bufflen = 4; - else - break; - saveallocation = us->srb->cmnd[4]; - us->srb->cmnd[4] = 4; - break; - - case LOG_SENSE: - case MODE_SENSE_10: - if (us->srb->request_bufflen > 8) - us->srb->request_bufflen = 8; - else - break; - saveallocation = (us->srb->cmnd[7] << 8) | us->srb->cmnd[8]; - us->srb->cmnd[7] = 0; - us->srb->cmnd[8] = 8; - break; - - default: - break; - } /* end switch on cmnd[0] */ - -#if 0 - /* translate READ_6 to READ_10 */ - if (us->srb->cmnd[0] == 0x08) { - - /* get the control */ - us->srb->cmnd[9] = us->srb->cmnd[5]; - - /* get the length */ - us->srb->cmnd[8] = us->srb->cmnd[6]; - us->srb->cmnd[7] = 0; - - /* set the reserved area to 0 */ - us->srb->cmnd[6] = 0; - - /* get LBA */ - us->srb->cmnd[5] = us->srb->cmnd[3]; - us->srb->cmnd[4] = us->srb->cmnd[2]; - us->srb->cmnd[3] = 0; - us->srb->cmnd[2] = 0; - - /* LUN and other info in cmnd[1] can stay */ - - /* fix command code */ - us->srb->cmnd[0] = 0x28; - - US_DEBUGP("Changing READ_6 to READ_10\n"); - US_DEBUG(us_show_command(us->srb)); - } - - /* translate WRITE_6 to WRITE_10 */ - if (us->srb->cmnd[0] == 0x0A) { - - /* get the control */ - us->srb->cmnd[9] = us->srb->cmnd[5]; - - /* get the length */ - us->srb->cmnd[8] = us->srb->cmnd[4]; - us->srb->cmnd[7] = 0; - - /* set the reserved area to 0 */ - us->srb->cmnd[6] = 0; - - /* get LBA */ - us->srb->cmnd[5] = us->srb->cmnd[3]; - us->srb->cmnd[4] = us->srb->cmnd[2]; - us->srb->cmnd[3] = 0; - us->srb->cmnd[2] = 0; - - /* LUN and other info in cmnd[1] can stay */ - - /* fix command code */ - us->srb->cmnd[0] = 0x2A; - - US_DEBUGP("Changing WRITE_6 to WRITE_10\n"); - US_DEBUG(us_show_command(us->srb)); - } -#endif + us->srb->scsi_done(us->srb); + us->srb = NULL; + break; + } - /* let's do the command */ - us->srb->result = us->pop(us->srb); - - if (savelen != us->srb->request_bufflen && - us->srb->result == (DID_OK << 16)) { - unsigned char *p = (unsigned char *)us->srb->request_buffer; - unsigned int length = 0; - - /* set correct length and retry */ - switch (us->srb->cmnd[0]) { - case REQUEST_SENSE: - /* simply return 18 bytes */ - p[7] = 10; - length = us->srb->request_bufflen; - break; - - case INQUIRY: - length = p[4] + 5 > savelen ? savelen : p[4] + 5; - us->srb->cmnd[4] = length; - break; - - case MODE_SENSE: - US_DEBUGP("MODE_SENSE Mode data length is %d\n", p[0]); - length = p[0] + 1 > savelen ? savelen : p[0] + 1; - us->srb->cmnd[4] = length; - break; - - case LOG_SENSE: - length = ((p[2] << 8) + p[3]) + 4 > savelen ? savelen : ((p[2] << 8) + p[3]) + 4; - us->srb->cmnd[7] = length >> 8; - us->srb->cmnd[8] = length; - break; - - case MODE_SENSE_10: - US_DEBUGP("MODE_SENSE_10 Mode data length is %d\n", - (p[0] << 8) + p[1]); - length = ((p[0] << 8) + p[1]) + 6 > savelen ? savelen : ((p[0] << 8) + p[1]) + 6; - us->srb->cmnd[7] = length >> 8; - us->srb->cmnd[8] = length; - break; - } /* end switch on cmnd[0] */ - - US_DEBUGP("Old/New length = %d/%d\n", - savelen, length); - - if (us->srb->request_bufflen != length) { - US_DEBUGP("redoing cmd with len=%d\n", length); - us->srb->request_bufflen = length; - us->srb->result = us->pop(us->srb); - } - /* reset back to original values */ - - us->srb->request_bufflen = savelen; - switch (us->srb->cmnd[0]) { - case INQUIRY: - if ((((unsigned char*)us->srb->request_buffer)[2] & 0x7) == 0) { - US_DEBUGP("Fixing INQUIRY data, setting SCSI rev to 2\n"); - ((unsigned char*)us->srb->request_buffer)[2] |= 2; - } - /* FALL THROUGH */ - case REQUEST_SENSE: - case MODE_SENSE: - if (us->srb->use_sg == 0 && length > 0) { - int i; - printk(KERN_DEBUG "Data is"); - for (i = 0; i < 32 && i < length; ++i) - printk(" %.2x", ((unsigned char *)us->srb->request_buffer)[i]); - if (i < length) - printk(" ..."); - printk("\n"); - } - us->srb->cmnd[4] = saveallocation; - if (us->mode_xlate) { - /* convert MODE_SENSE_10 return data - * format to MODE_SENSE_6 format */ - unsigned char *dta = (unsigned char *)us->srb->request_buffer; - dta[0] = dta[1]; /* data len */ - dta[1] = dta[2]; /* med type */ - dta[2] = dta[3]; /* dev-spec prm */ - dta[3] = dta[7]; /* block desc len */ - printk (KERN_DEBUG USB_SCSI "new MODE_SENSE_6 data = %.2X %.2X %.2X %.2X\n", - dta[0], dta[1], dta[2], dta[3]); - } - break; - - case LOG_SENSE: - case MODE_SENSE_10: - us->srb->cmnd[7] = saveallocation >> 8; - us->srb->cmnd[8] = saveallocation; - break; - } /* end switch on cmnd[0] */ - } - /* force attention on first command */ - if (!us->attention_done) { - US_DEBUGP("forcing unit attention\n"); - if (us->srb->cmnd[0] == REQUEST_SENSE) { - if (us->srb->result == (DID_OK << 16)) { - unsigned char *p = (unsigned char *)us->srb->request_buffer; - - us->attention_done = 1; - if ((p[2] & 0x0f) != UNIT_ATTENTION) { - p[2] = UNIT_ATTENTION; - p[12] = 0x29; /* power on, reset or bus-reset */ - p[13] = 0; - } - } - } else if (us->srb->cmnd[0] != INQUIRY && - us->srb->result == (DID_OK << 16)) { - us->srb->result |= 2; /* force check condition */ - } - } - } + /* we've got a command, let's do it! */ + US_DEBUG(us_show_command(us->srb)); + + /* FIXME: this is to support Shuttle E-USB bridges, it + * appears */ + if (us->srb->cmnd[0] == START_STOP && + us->pusb_dev->descriptor.idProduct == 0x0001 && + us->pusb_dev->descriptor.idVendor == 0x04e6) + us->srb->result = DID_OK << 16; + else { + us->proto_handler(us->srb, us); } - US_DEBUGP("scsi cmd done, result=%x\n", us->srb->result); + + US_DEBUGP("scsi cmd done, result=0x%x\n", us->srb->result); us->srb->scsi_done(us->srb); us->srb = NULL; break; - + case US_ACT_ABORT: break; @@ -1167,7 +1446,7 @@ static int usb_stor_control_thread(void * __us) break; } /* end switch on action */ - + if (signal_pending(current)) { /* sending SIGUSR1 makes us print out some info */ spin_lock_irq(¤t->sigmask_lock); @@ -1176,17 +1455,20 @@ static int usb_stor_control_thread(void * __us) if (signr == SIGUSR2) { usb_stor_debug = !usb_stor_debug; - printk(USB_SCSI "debug toggle = %d\n", usb_stor_debug); + printk(USB_STORAGE "debug toggle = %d\n", usb_stor_debug); } else { break; /* exit the loop on any other signal */ } } } - + // MOD_DEC_USE_COUNT; printk("usb_stor_control_thread exiting\n"); + /* FIXME: this is a hack to allow for debugging */ + // scsi_unregister_module(MODULE_SCSI_HA, us->htmplt); + return 0; } @@ -1197,7 +1479,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) int i; char mf[32]; /* manufacturer */ char prod[32]; /* product */ - char serial[32]; /* serial number */ + char serial[32]; /* serial number */ struct us_data *ss = NULL; unsigned int flags = 0; GUID(guid); /* Global Unique Identifier */ @@ -1213,7 +1495,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) usb_string(dev, dev->descriptor.iManufacturer, mf, sizeof(mf)); usb_string(dev, dev->descriptor.iProduct, prod, sizeof(prod)); usb_string(dev, dev->descriptor.iSerialNumber, serial, sizeof(serial)); - + /* let's examine the device now */ /* We make an exception for the shuttle E-USB */ @@ -1236,8 +1518,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) if (dev->descriptor.iSerialNumber && serial[0]) { /* If we have a serial number, and it's a non-NULL string */ make_guid(guid, dev->descriptor.idVendor, - dev->descriptor.idProduct, - serial); + dev->descriptor.idProduct, serial); } else { /* We don't have a serial number, so we use 0 */ make_guid(guid, dev->descriptor.idVendor, @@ -1260,7 +1541,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) if (!ss) { if ((ss = (struct us_data *)kmalloc(sizeof(*ss), GFP_KERNEL)) == NULL) { - printk(KERN_WARNING USB_SCSI "Out of memory\n"); + printk(KERN_WARNING USB_STORAGE "Out of memory\n"); return NULL; } memset(ss, 0, sizeof(struct us_data)); @@ -1285,24 +1566,24 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) } /* set the handler pointers based on the protocol */ - US_DEBUGP("Protocol: "); + US_DEBUGP("Transport: "); switch (ss->protocol) { case US_PR_CB: US_DEBUGPX("Control/Bulk\n"); - ss->pop = pop_CBI; - ss->pop_reset = pop_CB_reset; + ss->transport = CB_transport; + ss->transport_reset = CB_reset; break; case US_PR_CBI: US_DEBUGPX("Control/Bulk/Interrupt\n"); - ss->pop = pop_CBI; - ss->pop_reset = pop_CB_reset; + ss->transport = CB_transport; + ss->transport_reset = CB_reset; break; case US_PR_BULK: US_DEBUGPX("Bulk\n"); - ss->pop = pop_Bulk; - ss->pop_reset = pop_Bulk_reset; + ss->transport = Bulk_transport; + ss->transport_reset = Bulk_reset; break; default: @@ -1363,7 +1644,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) memcpy(ss->guid, guid, sizeof(guid)); /* set class specific stuff */ - US_DEBUGP("SubClass: "); + US_DEBUGP("Protocol: "); switch (ss->subclass) { case US_SC_RBC: US_DEBUGPX("Reduced Block Commands\n"); @@ -1379,18 +1660,16 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) case US_SC_8070: US_DEBUGPX("8070\n"); - ss->flags |= US_FL_FIXED_COMMAND; - ss->fixedlength = 12; break; case US_SC_SCSI: US_DEBUGPX("Transparent SCSI\n"); + ss->proto_handler = transparent_scsi_command; break; case US_SC_UFI: US_DEBUGPX("UFI\n"); - ss->flags |= US_FL_FIXED_COMMAND; - ss->fixedlength = 12; + ss->proto_handler = ufi_command; break; default: @@ -1398,11 +1677,23 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) break; } + /* We only handle certain protocols. Currently, these are + *the only ones that devices use. + */ + if ((ss->subclass != US_SC_SCSI) && (ss->subclass != US_SC_UFI)) { + US_DEBUGP("Sorry, we do not support that protocol yet.\n"); + US_DEBUGP("If you have a device which uses one of the unsupported\n"); + US_DEBUGP("protocols, please contact mdharm-usb@one-eyed-alien.net\n"); + + kfree(ss); + return NULL; + } + /* Allocate memory for the SCSI Host Template */ if ((htmplt = (Scsi_Host_Template *) kmalloc(sizeof(*ss->htmplt), GFP_KERNEL)) == NULL ) { - printk(KERN_WARNING USB_SCSI "Out of memory\n"); + printk(KERN_WARNING USB_STORAGE "Out of memory\n"); kfree(ss); return NULL; @@ -1430,7 +1721,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) 1, 0xC0, 0, ss->ifnum, qstat, 2, HZ*5); - US_DEBUGP("C0 status %x %x\n", qstat[0], qstat[1]); + US_DEBUGP("C0 status 0x%x 0x%x\n", qstat[0], qstat[1]); init_waitqueue_head(&ss->ip_waitq); ss->irqpipe = usb_rcvintpipe(ss->pusb_dev, ss->ep_int); result = usb_request_irq(ss->pusb_dev, ss->irqpipe, CBI_irq, @@ -1467,7 +1758,7 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) ss->pid = kernel_thread(usb_stor_control_thread, ss, CLONE_FS | CLONE_FILES | CLONE_SIGHAND); if (ss->pid < 0) { - printk(KERN_WARNING USB_SCSI "Unable to start control thread\n"); + printk(KERN_WARNING USB_STORAGE "Unable to start control thread\n"); kfree(htmplt); kfree(ss); @@ -1479,19 +1770,17 @@ static void * storage_probe(struct usb_device *dev, unsigned int ifnum) } /* now register - our detect function will be called */ - scsi_register_module(MODULE_SCSI_HA, htmplt); /* put us in the list */ - prev = (struct us_data *)&us_list; while (prev->next) prev = prev->next; prev->next = ss; } - printk(KERN_WARNING "WARNING: USB SCSI data integrity not assured\n"); - printk(KERN_INFO "USB SCSI device found at address %d\n", dev->devnum); + printk(KERN_INFO "WARNING: USB Mass Storage data integrity not assured\n"); + printk(KERN_INFO "USB Mass Storage device found at %d\n", dev->devnum); return ss; } @@ -1517,10 +1806,11 @@ int usb_stor_init(void) { // MOD_INC_USE_COUNT; + /* register the driver, return -1 if error */ if (usb_register(&storage_driver) < 0) return -1; - printk(KERN_INFO "USB SCSI support registered.\n"); + printk(KERN_INFO "USB Mass Storage support registered.\n"); return 0; } diff --git a/drivers/usb/usb_scsi.h b/drivers/usb/usb_scsi.h index 3e1feb78333f..8fe3e9a44dcc 100644 --- a/drivers/usb/usb_scsi.h +++ b/drivers/usb/usb_scsi.h @@ -1,25 +1,19 @@ /* Driver for USB SCSI - include file * - * (C) Michael Gee (michael@linuxspecific.com) 1999 - * - * This driver is schizoid - it makes a USB scanner appear as both a SCSI device - * and a character device. The latter is only available if the device has an - * interrupt endpoint, and is used specifically to receive interrupt events. - * - * In order to support various 'strange' scanners, this module supports plug-in - * device-specific filter modules, which can do their own thing when required. + * (c) 1999 Michael Gee (michael@linuxspecific.com) + * (c) 1999, 2000 Matthew Dharm (mdharm-usb@one-eyed-alien.net) * */ #include -#define USB_SCSI "usbscsi: " +#define USB_STORAGE "usb-storage: " extern int usb_stor_debug; #ifdef CONFIG_USB_SCSI_DEBUG void us_show_command(Scsi_Cmnd *srb); -#define US_DEBUGP(x...) { if(usb_stor_debug) printk( KERN_DEBUG USB_SCSI ## x ); } +#define US_DEBUGP(x...) { if(usb_stor_debug) printk( KERN_DEBUG USB_STORAGE ## x ); } #define US_DEBUGPX(x...) { if(usb_stor_debug) printk( ## x ); } #define US_DEBUG(x) { if(usb_stor_debug) x; } #else @@ -53,14 +47,15 @@ extern unsigned char us_direction[256/8]; * Bulk only data structures (Zip 100, for example) */ +/* command block wrapper */ struct bulk_cb_wrap { - __u32 Signature; /* contains 'USBC' */ - __u32 Tag; /* unique per command id */ - __u32 DataTransferLength; /* size of data */ - __u8 Flags; /* direction in bit 0 */ - __u8 Lun; /* LUN normally 0 */ - __u8 Length; /* of of the CDB */ - __u8 CDB[16]; /* max command */ + __u32 Signature; /* contains 'USBC' */ + __u32 Tag; /* unique per command id */ + __u32 DataTransferLength; /* size of data */ + __u8 Flags; /* direction in bit 0 */ + __u8 Lun; /* LUN normally 0 */ + __u8 Length; /* of of the CDB */ + __u8 CDB[16]; /* max command */ }; #define US_BULK_CB_WRAP_LEN 31 @@ -68,12 +63,13 @@ struct bulk_cb_wrap { #define US_BULK_FLAG_IN 1 #define US_BULK_FLAG_OUT 0 +/* command status wrapper */ struct bulk_cs_wrap { - __u32 Signature; /* should = 'USBS' */ - __u32 Tag; /* same as original command */ - __u32 Residue; /* amount not transferred */ - __u8 Status; /* see below */ - __u8 Filler[18]; + __u32 Signature; /* should = 'USBS' */ + __u32 Tag; /* same as original command */ + __u32 Residue; /* amount not transferred */ + __u8 Status; /* see below */ + __u8 Filler[18]; }; #define US_BULK_CS_WRAP_LEN 31 @@ -87,24 +83,22 @@ struct bulk_cs_wrap { #define US_BULK_RESET_HARD 0 /* - * CBI style + * Transport return codes */ -#define US_CBI_ADSC 0 +#define USB_STOR_TRANSPORT_GOOD 0 /* Transport good, command good */ +#define USB_STOR_TRANSPORT_FAILED 1 /* Transport good, command failed */ +#define USB_STOR_TRANSPORT_ERROR 2 /* Transport bad (i.e. device dead */ /* - * Filter device definitions + * CBI style */ -struct usb_scsi_filter { - struct usb_scsi_filter * next; /* usb_scsi driver only */ - char *name; /* not really required */ +#define US_CBI_ADSC 0 - unsigned int flags; /* Filter flags */ - void * (* probe) (struct usb_device *, char *, char *, char *); /* probe device */ - void (* release)(void *); /* device gone */ - int (* command)(void *, Scsi_Cmnd *); /* all commands */ -}; +/* + * GUID definitions + */ #define GUID(x) __u32 x[3] #define GUID_EQUAL(x, y) (x[0] == y[0] && x[1] == y[1] && x[2] == y[2]) @@ -122,25 +116,15 @@ static inline void make_guid( __u32 *pg, __u16 vendor, __u16 product, char *seri pg[1] |= pg[2] >> 28; pg[2] <<= 4; if (*serial >= 'a') - *serial -= 'a' - 'A'; + *serial -= 'a' - 'A'; pg[2] |= (*serial <= '9' && *serial >= '0') ? *serial - '0' - : *serial - 'A' + 10; + : *serial - 'A' + 10; serial++; } } /* Flag definitions */ -#define US_FL_IP_STATUS 0x00000001 /* status uses interrupt */ -#define US_FL_FIXED_COMMAND 0x00000002 /* expand commands to fixed size */ - -/* - * Called by filters to register/unregister the mini driver - * - * WARNING - the supplied probe function may be called before exiting this fn - */ -int usb_scsi_register(struct usb_scsi_filter *); -void usb_scsi_deregister(struct usb_scsi_filter *); - -#ifdef CONFIG_USB_HP4100 -int hp4100_init(void); -#endif +#define US_FL_IP_STATUS 0x00000001 /* status uses interrupt */ +#define US_FL_FIXED_COMMAND 0x00000002 /* expand commands to fixed size */ +#define US_FL_MODE_XLATE 0x00000004 /* translate _6 to _10 comands for + Win/MacOS compatibility */ diff --git a/drivers/usb/usb_scsi_debug.c b/drivers/usb/usb_scsi_debug.c index d29622cad44a..fc4e83917d13 100644 --- a/drivers/usb/usb_scsi_debug.c +++ b/drivers/usb/usb_scsi_debug.c @@ -26,77 +26,79 @@ void us_show_command(Scsi_Cmnd *srb) { - char *what = NULL; + char *what = NULL; - switch (srb->cmnd[0]) { - case TEST_UNIT_READY: what = "TEST_UNIT_READY"; break; - case REZERO_UNIT: what = "REZERO_UNIT"; break; - case REQUEST_SENSE: what = "REQUEST_SENSE"; break; - case FORMAT_UNIT: what = "FORMAT_UNIT"; break; - case READ_BLOCK_LIMITS: what = "READ_BLOCK_LIMITS"; break; - case REASSIGN_BLOCKS: what = "REASSIGN_BLOCKS"; break; - case READ_6: what = "READ_6"; break; - case WRITE_6: what = "WRITE_6"; break; - case SEEK_6: what = "SEEK_6"; break; - case READ_REVERSE: what = "READ_REVERSE"; break; - case WRITE_FILEMARKS: what = "WRITE_FILEMARKS"; break; - case SPACE: what = "SPACE"; break; - case INQUIRY: what = "INQUIRY"; break; - case RECOVER_BUFFERED_DATA: what = "RECOVER_BUFFERED_DATA"; break; - case MODE_SELECT: what = "MODE_SELECT"; break; - case RESERVE: what = "RESERVE"; break; - case RELEASE: what = "RELEASE"; break; - case COPY: what = "COPY"; break; - case ERASE: what = "ERASE"; break; - case MODE_SENSE: what = "MODE_SENSE"; break; - case START_STOP: what = "START_STOP"; break; - case RECEIVE_DIAGNOSTIC: what = "RECEIVE_DIAGNOSTIC"; break; - case SEND_DIAGNOSTIC: what = "SEND_DIAGNOSTIC"; break; - case ALLOW_MEDIUM_REMOVAL: what = "ALLOW_MEDIUM_REMOVAL"; break; - case SET_WINDOW: what = "SET_WINDOW"; break; - case READ_CAPACITY: what = "READ_CAPACITY"; break; - case READ_10: what = "READ_10"; break; - case WRITE_10: what = "WRITE_10"; break; - case SEEK_10: what = "SEEK_10"; break; - case WRITE_VERIFY: what = "WRITE_VERIFY"; break; - case VERIFY: what = "VERIFY"; break; - case SEARCH_HIGH: what = "SEARCH_HIGH"; break; - case SEARCH_EQUAL: what = "SEARCH_EQUAL"; break; - case SEARCH_LOW: what = "SEARCH_LOW"; break; - case SET_LIMITS: what = "SET_LIMITS"; break; - case READ_POSITION: what = "READ_POSITION"; break; - case SYNCHRONIZE_CACHE: what = "SYNCHRONIZE_CACHE"; break; - case LOCK_UNLOCK_CACHE: what = "LOCK_UNLOCK_CACHE"; break; - case READ_DEFECT_DATA: what = "READ_DEFECT_DATA"; break; - case MEDIUM_SCAN: what = "MEDIUM_SCAN"; break; - case COMPARE: what = "COMPARE"; break; - case COPY_VERIFY: what = "COPY_VERIFY"; break; - case WRITE_BUFFER: what = "WRITE_BUFFER"; break; - case READ_BUFFER: what = "READ_BUFFER"; break; - case UPDATE_BLOCK: what = "UPDATE_BLOCK"; break; - case READ_LONG: what = "READ_LONG"; break; - case WRITE_LONG: what = "WRITE_LONG"; break; - case CHANGE_DEFINITION: what = "CHANGE_DEFINITION"; break; - case WRITE_SAME: what = "WRITE_SAME"; break; - case READ_TOC: what = "READ_TOC"; break; - case LOG_SELECT: what = "LOG_SELECT"; break; - case LOG_SENSE: what = "LOG_SENSE"; break; - case MODE_SELECT_10: what = "MODE_SELECT_10"; break; - case MODE_SENSE_10: what = "MODE_SENSE_10"; break; - case MOVE_MEDIUM: what = "MOVE_MEDIUM"; break; - case READ_12: what = "READ_12"; break; - case WRITE_12: what = "WRITE_12"; break; - case WRITE_VERIFY_12: what = "WRITE_VERIFY_12"; break; - case SEARCH_HIGH_12: what = "SEARCH_HIGH_12"; break; - case SEARCH_EQUAL_12: what = "SEARCH_EQUAL_12"; break; - case SEARCH_LOW_12: what = "SEARCH_LOW_12"; break; - case READ_ELEMENT_STATUS: what = "READ_ELEMENT_STATUS"; break; - case SEND_VOLUME_TAG: what = "SEND_VOLUME_TAG"; break; - case WRITE_LONG_2: what = "WRITE_LONG_2"; break; - default: break; - } - printk(KERN_DEBUG USB_SCSI "Command %s (%d bytes)\n", what, srb->cmd_len); - printk(KERN_DEBUG USB_SCSI " %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", - srb->cmnd[0], srb->cmnd[1], srb->cmnd[2], srb->cmnd[3], srb->cmnd[4], srb->cmnd[5], - srb->cmnd[6], srb->cmnd[7], srb->cmnd[8], srb->cmnd[9]); + switch (srb->cmnd[0]) { + case TEST_UNIT_READY: what = "TEST_UNIT_READY"; break; + case REZERO_UNIT: what = "REZERO_UNIT"; break; + case REQUEST_SENSE: what = "REQUEST_SENSE"; break; + case FORMAT_UNIT: what = "FORMAT_UNIT"; break; + case READ_BLOCK_LIMITS: what = "READ_BLOCK_LIMITS"; break; + case REASSIGN_BLOCKS: what = "REASSIGN_BLOCKS"; break; + case READ_6: what = "READ_6"; break; + case WRITE_6: what = "WRITE_6"; break; + case SEEK_6: what = "SEEK_6"; break; + case READ_REVERSE: what = "READ_REVERSE"; break; + case WRITE_FILEMARKS: what = "WRITE_FILEMARKS"; break; + case SPACE: what = "SPACE"; break; + case INQUIRY: what = "INQUIRY"; break; + case RECOVER_BUFFERED_DATA: what = "RECOVER_BUFFERED_DATA"; break; + case MODE_SELECT: what = "MODE_SELECT"; break; + case RESERVE: what = "RESERVE"; break; + case RELEASE: what = "RELEASE"; break; + case COPY: what = "COPY"; break; + case ERASE: what = "ERASE"; break; + case MODE_SENSE: what = "MODE_SENSE"; break; + case START_STOP: what = "START_STOP"; break; + case RECEIVE_DIAGNOSTIC: what = "RECEIVE_DIAGNOSTIC"; break; + case SEND_DIAGNOSTIC: what = "SEND_DIAGNOSTIC"; break; + case ALLOW_MEDIUM_REMOVAL: what = "ALLOW_MEDIUM_REMOVAL"; break; + case SET_WINDOW: what = "SET_WINDOW"; break; + case READ_CAPACITY: what = "READ_CAPACITY"; break; + case READ_10: what = "READ_10"; break; + case WRITE_10: what = "WRITE_10"; break; + case SEEK_10: what = "SEEK_10"; break; + case WRITE_VERIFY: what = "WRITE_VERIFY"; break; + case VERIFY: what = "VERIFY"; break; + case SEARCH_HIGH: what = "SEARCH_HIGH"; break; + case SEARCH_EQUAL: what = "SEARCH_EQUAL"; break; + case SEARCH_LOW: what = "SEARCH_LOW"; break; + case SET_LIMITS: what = "SET_LIMITS"; break; + case READ_POSITION: what = "READ_POSITION"; break; + case SYNCHRONIZE_CACHE: what = "SYNCHRONIZE_CACHE"; break; + case LOCK_UNLOCK_CACHE: what = "LOCK_UNLOCK_CACHE"; break; + case READ_DEFECT_DATA: what = "READ_DEFECT_DATA"; break; + case MEDIUM_SCAN: what = "MEDIUM_SCAN"; break; + case COMPARE: what = "COMPARE"; break; + case COPY_VERIFY: what = "COPY_VERIFY"; break; + case WRITE_BUFFER: what = "WRITE_BUFFER"; break; + case READ_BUFFER: what = "READ_BUFFER"; break; + case UPDATE_BLOCK: what = "UPDATE_BLOCK"; break; + case READ_LONG: what = "READ_LONG"; break; + case WRITE_LONG: what = "WRITE_LONG"; break; + case CHANGE_DEFINITION: what = "CHANGE_DEFINITION"; break; + case WRITE_SAME: what = "WRITE_SAME"; break; + case READ_TOC: what = "READ_TOC"; break; + case LOG_SELECT: what = "LOG_SELECT"; break; + case LOG_SENSE: what = "LOG_SENSE"; break; + case MODE_SELECT_10: what = "MODE_SELECT_10"; break; + case MODE_SENSE_10: what = "MODE_SENSE_10"; break; + case MOVE_MEDIUM: what = "MOVE_MEDIUM"; break; + case READ_12: what = "READ_12"; break; + case WRITE_12: what = "WRITE_12"; break; + case WRITE_VERIFY_12: what = "WRITE_VERIFY_12"; break; + case SEARCH_HIGH_12: what = "SEARCH_HIGH_12"; break; + case SEARCH_EQUAL_12: what = "SEARCH_EQUAL_12"; break; + case SEARCH_LOW_12: what = "SEARCH_LOW_12"; break; + case READ_ELEMENT_STATUS: what = "READ_ELEMENT_STATUS"; break; + case SEND_VOLUME_TAG: what = "SEND_VOLUME_TAG"; break; + case WRITE_LONG_2: what = "WRITE_LONG_2"; break; + default: break; + } + printk(KERN_DEBUG USB_STORAGE + "Command %s (%d bytes)\n", what, srb->cmd_len); + printk(KERN_DEBUG USB_STORAGE + " %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + srb->cmnd[0], srb->cmnd[1], srb->cmnd[2], srb->cmnd[3], srb->cmnd[4], srb->cmnd[5], + srb->cmnd[6], srb->cmnd[7], srb->cmnd[8], srb->cmnd[9]); } diff --git a/drivers/usb/usbkbd.c b/drivers/usb/usbkbd.c index 26de45a3827c..c6803f943592 100644 --- a/drivers/usb/usbkbd.c +++ b/drivers/usb/usbkbd.c @@ -142,7 +142,8 @@ static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum) if (!(endpoint->bEndpointAddress & 0x80)) return NULL; if ((endpoint->bmAttributes & 3) != 3) return NULL; - usb_set_protocol(dev, 0); + usb_set_protocol(dev, interface->bInterfaceNumber, 0); + usb_set_idle(dev, interface->bInterfaceNumber, 0, 0); if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) return NULL; memset(kbd, 0, sizeof(struct usb_kbd)); diff --git a/drivers/usb/usbmouse.c b/drivers/usb/usbmouse.c index e4145d0956f7..7276ca6703fb 100644 --- a/drivers/usb/usbmouse.c +++ b/drivers/usb/usbmouse.c @@ -83,8 +83,9 @@ static void *usb_mouse_probe(struct usb_device *dev, unsigned int ifnum) if ((endpoint->bmAttributes & 3) != 3) return NULL; #ifndef USBMOUSE_EXTRA - usb_set_protocol(dev, 0); + usb_set_protocol(dev, interface->bInterfaceNumber, 0); #endif + usb_set_idle(dev, interface->bInterfaceNumber, 0, 0); if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL))) return NULL; memset(mouse, 0, sizeof(struct usb_mouse)); diff --git a/drivers/video/Config.in b/drivers/video/Config.in index d8591ef17026..2ccc8d4bedd4 100644 --- a/drivers/video/Config.in +++ b/drivers/video/Config.in @@ -240,7 +240,7 @@ if [ "$CONFIG_FB" = "y" ]; then "$CONFIG_FB_VIRGE" = "m" -o "$CONFIG_FB_CYBER" = "m" -o \ "$CONFIG_FB_VALKYRIE" = "m" -o "$CONFIG_FB_PLATINUM" = "m" -o \ "$CONFIG_FB_CT65550" = "m" -o "$CONFIG_FB_MATROX" = "m" -o \ - "$CONFIG_FB_PM2" = "y" -o "$CONFIG_FB_SGIVW" = "m" -o \ + "$CONFIG_FB_PM2" = "m" -o "$CONFIG_FB_SGIVW" = "m" -o \ "$CONFIG_FB_CYBER2000" = "m" ]; then define_tristate CONFIG_FBCON_CFB16 m fi @@ -316,13 +316,6 @@ if [ "$CONFIG_FB" = "y" ]; then define_tristate CONFIG_FBCON_VGA_PLANES m fi fi - if [ "$CONFIG_FB_MDA" = "y" -o "$CONFIG_FB_VGA" = "y" ]; then - define_tristate CONFIG_FBCON_VGA y - else - if [ "$CONFIG_FB_MDA" = "m" -o "$CONFIG_FB_VGA" = "m" ]; then - define_tristate CONFIG_FBCON_VGA m - fi - fi fi bool ' Support only 8 pixels wide fonts' CONFIG_FBCON_FONTWIDTH8_ONLY if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then diff --git a/drivers/video/fbcon.c b/drivers/video/fbcon.c index a788430855c8..02f50a4978e6 100644 --- a/drivers/video/fbcon.c +++ b/drivers/video/fbcon.c @@ -237,7 +237,7 @@ static void cursor_timer_handler(unsigned long dev_addr) fbcon_vbl_handler(0, NULL, NULL); cursor_timer.expires = jiffies+HZ/50; cursor_timer.data = 0; - cursor_timer.next = cursor_timer.next = NULL; + cursor_timer.next = cursor_timer.prev = NULL; add_timer(&cursor_timer); } diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c index 2eb7962f8651..5201bf1faa0d 100644 --- a/drivers/video/skeletonfb.c +++ b/drivers/video/skeletonfb.c @@ -287,7 +287,8 @@ static void xxx_set_disp(const void *par, struct display *disp, struct fbgen_hwswitch xxx_switch = { xxx_detect, xxx_encode_fix, xxx_decode_var, xxx_encode_var, xxx_get_par, - xxx_set_par, xxx_getcolreg, xxx_setcolreg, xxx_blank, xxx_dispsw + xxx_set_par, xxx_getcolreg, xxx_setcolreg, xxx_pan_display, xxx_blank, + xxx_set_disp }; diff --git a/fs/Config.in b/fs/Config.in index daad6d182563..f0259787b721 100644 --- a/fs/Config.in +++ b/fs/Config.in @@ -8,28 +8,24 @@ bool 'Quota support' CONFIG_QUOTA tristate 'Kernel automounter support' CONFIG_AUTOFS_FS -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'ADFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_ADFS_FS -fi +dep_tristate 'ADFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_ADFS_FS $CONFIG_EXPERIMENTAL + tristate 'Amiga FFS filesystem support' CONFIG_AFFS_FS -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'Apple Macintosh filesystem support (EXPERIMENTAL)' CONFIG_HFS_FS - tristate 'BFS filesystem (read only) support (EXPERIMENTAL)' CONFIG_BFS_FS - if [ "$CONFIG_BFS_FS" != "n" ]; then - bool ' BFS filesystem write support (DANGEROUS)' CONFIG_BFS_FS_WRITE - fi -fi + +dep_tristate 'Apple Macintosh filesystem support (EXPERIMENTAL)' CONFIG_HFS_FS $CONFIG_EXPERIMENTAL + +dep_tristate 'BFS filesystem (read only) support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL +dep_bool ' BFS filesystem write support (DANGEROUS)' CONFIG_BFS_FS_WRITE $CONFIG_BFS_FS + # msdos filesystems tristate 'DOS FAT fs support' CONFIG_FAT_FS dep_tristate ' MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS dep_tristate ' UMSDOS: Unix-like filesystem on top of standard MSDOS fs' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS dep_tristate ' VFAT (Windows-95) fs support' CONFIG_VFAT_FS $CONFIG_FAT_FS - -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'EFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_EFS_FS -fi +dep_tristate 'EFS filesystem support (read only) (EXPERIMENTAL)' CONFIG_EFS_FS $CONFIG_EXPERIMENTAL tristate 'Compressed ROM filessytem support' CONFIG_CRAMFS + tristate 'ISO 9660 CDROM filesystem support' CONFIG_ISO9660_FS if [ "$CONFIG_ISO9660_FS" != "n" ]; then bool ' Microsoft Joliet CDROM extensions' CONFIG_JOLIET @@ -39,39 +35,35 @@ else fi tristate 'Minix fs support' CONFIG_MINIX_FS + tristate 'NTFS filesystem support (read only)' CONFIG_NTFS_FS -if [ "$CONFIG_NTFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool ' NTFS write support (DANGEROUS)' CONFIG_NTFS_RW -fi +dep_bool ' NTFS write support (DANGEROUS)' CONFIG_NTFS_RW $CONFIG_NTFS_FS $CONFIG_EXPERIMENTAL + tristate 'OS/2 HPFS filesystem support' CONFIG_HPFS_FS + bool '/proc filesystem support' CONFIG_PROC_FS -if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then - # It compiles as a module for testing only. It should not be used - # as a module in general. If we make this "tristate", a bunch of people - # who don't know what they are doing turn it on and complain when it - # breaks. - bool '/dev/pts filesystem for Unix98 PTYs' CONFIG_DEVPTS_FS -fi -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - tristate 'QNX4 filesystem support (read only) (EXPERIMENTAL)' CONFIG_QNX4FS_FS - if [ "$CONFIG_QNX4FS_FS" != "n" ]; then - bool ' QNX4FS write support (DANGEROUS)' CONFIG_QNX4FS_RW - fi -fi + +# It compiles as a module for testing only. It should not be used +# as a module in general. If we make this "tristate", a bunch of people +# who don't know what they are doing turn it on and complain when it +# breaks. +dep_bool '/dev/pts filesystem for Unix98 PTYs' CONFIG_DEVPTS_FS $CONFIG_UNIX98_PTYS + +dep_tristate 'QNX4 filesystem support (read only) (EXPERIMENTAL)' CONFIG_QNX4FS_FS $CONFIG_EXPERIMENTAL +dep_bool ' QNX4FS write support (DANGEROUS)' CONFIG_QNX4FS_RW $CONFIG_QNX4FS_FS + tristate 'ROM filesystem support' CONFIG_ROMFS_FS + tristate 'Second extended fs support' CONFIG_EXT2_FS + tristate 'System V and Coherent filesystem support' CONFIG_SYSV_FS -if [ "$CONFIG_SYSV_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool ' SYSV filesystem write support (DANGEROUS)' CONFIG_SYSV_FS_WRITE -fi +dep_bool ' SYSV filesystem write support (DANGEROUS)' CONFIG_SYSV_FS_WRITE $CONFIG_SYSV_FS $CONFIG_EXPERIMENTAL + tristate 'UDF filesystem support (read only)' CONFIG_UDF_FS -if [ "$CONFIG_UDF_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool ' UDF write support (DANGEROUS)' CONFIG_UDF_RW -fi +dep_bool ' UDF write support (DANGEROUS)' CONFIG_UDF_RW $CONFIG_UDF_FS $CONFIG_EXPERIMENTAL + tristate 'UFS filesystem support (read only)' CONFIG_UFS_FS -if [ "$CONFIG_UFS_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool ' UFS filesystem write support (DANGEROUS)' CONFIG_UFS_FS_WRITE -fi +dep_bool ' UFS filesystem write support (DANGEROUS)' CONFIG_UFS_FS_WRITE $CONFIG_UFS_FS $CONFIG_EXPERIMENTAL if [ "$CONFIG_NET" = "y" ]; then @@ -81,16 +73,12 @@ comment 'Network File Systems' if [ "$CONFIG_INET" = "y" ]; then tristate 'Coda filesystem support (advanced network fs)' CONFIG_CODA_FS + tristate 'NFS filesystem support' CONFIG_NFS_FS - if [ "$CONFIG_NFS_FS" = "y" -a "$CONFIG_IP_PNP" = "y" ]; then - bool ' Root file system on NFS' CONFIG_ROOT_NFS - fi + dep_bool ' Root file system on NFS' CONFIG_ROOT_NFS $CONFIG_NFS_FS $CONFIG_IP_PNP + tristate 'NFS server support' CONFIG_NFSD - if [ "$CONFIG_NFSD" != "n" ]; then - if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - bool ' Provide NFSv3 server support (EXPERIMENTAL)' CONFIG_NFSD_V3 - fi - fi + dep_bool ' Provide NFSv3 server support (EXPERIMENTAL)' CONFIG_NFSD_V3 $CONFIG_NFSD $CONFIG_EXPERIMENTAL if [ "$CONFIG_NFS_FS" = "y" -o "$CONFIG_NFSD" = "y" ]; then define_tristate CONFIG_SUNRPC y diff --git a/fs/block_dev.c b/fs/block_dev.c index 0e34b95bd588..47362da04278 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -652,7 +652,7 @@ struct inode_operations blkdev_inode_operations = { &def_blk_fops, /* default file operations */ }; -char * bdevname(kdev_t dev) +const char * bdevname(kdev_t dev) { static char buffer[32]; const char * name = blkdevs[MAJOR(dev)].name; diff --git a/fs/devices.c b/fs/devices.c index 3efb5822a525..36e15475a2ca 100644 --- a/fs/devices.c +++ b/fs/devices.c @@ -168,14 +168,14 @@ static struct inode_operations chrdev_inode_operations = { * Print device name (in decimal, hexadecimal or symbolic) * Note: returns pointer to static data! */ -char * kdevname(kdev_t dev) +const char * kdevname(kdev_t dev) { static char buffer[32]; sprintf(buffer, "%02x:%02x", MAJOR(dev), MINOR(dev)); return buffer; } -char * cdevname(kdev_t dev) +const char * cdevname(kdev_t dev) { static char buffer[32]; const char * name = chrdevs[MAJOR(dev)].name; diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c index 806c05d6e21f..752ae1e1e2fb 100644 --- a/fs/ncpfs/mmap.c +++ b/fs/ncpfs/mmap.c @@ -92,17 +92,9 @@ static struct page* ncp_file_mmap_nopage(struct vm_area_struct *area, return page; } -struct vm_operations_struct ncp_file_mmap = +static struct vm_operations_struct ncp_file_mmap = { - NULL, /* open */ - NULL, /* close */ - NULL, /* unmap */ - NULL, /* protect */ - NULL, /* sync */ - NULL, /* advise */ - ncp_file_mmap_nopage, /* nopage */ - NULL, /* wppage */ - NULL /* swapout */ + nopage: ncp_file_mmap_nopage, }; diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 9f58b4171890..09a16b302212 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -416,7 +416,9 @@ wait_on_write_request(struct nfs_wreq *req) int nfs_writepage(struct dentry * dentry, struct page *page) { - return nfs_writepage_sync(dentry, dentry->d_inode, page, 0, PAGE_SIZE); + int result = nfs_writepage_sync(dentry, dentry->d_inode, page, 0, PAGE_SIZE); + if ( result == PAGE_SIZE) return 0; + return result; } /* diff --git a/fs/partitions/Config.in b/fs/partitions/Config.in index 7abc9efdf143..d978f2c389ac 100644 --- a/fs/partitions/Config.in +++ b/fs/partitions/Config.in @@ -21,6 +21,8 @@ if [ "$CONFIG_PARTITION_ADVANCED" = "y" ]; then bool ' Solaris (x86) partition table support' CONFIG_SOLARIS_X86_PARTITION bool ' Unixware slices support' CONFIG_UNIXWARE_DISKLABEL fi + bool 'SGI partition support' CONFIG_SGI_PARTITION + bool 'Sun partition tables support' CONFIG_SUN_PARTITION else if [ "$ARCH" = "alpha" ]; then define_bool CONFIG_OSF_PARTITION y @@ -46,14 +48,10 @@ else if [ "$CONFIG_ATARI" = "y" ]; then define_bool CONFIG_ATARI_PARTITION y fi -fi -if [ "$CONFIG_SGI" != "y" ]; then - bool 'SGI partition support' CONFIG_SGI_PARTITION -else - define_bool CONFIG_SGI_PARTITION y -fi -if [ "$ARCH" != "sparc" -a "$ARCH" != "sparc64" ]; then - bool 'Sun partition tables support' CONFIG_SUN_PARTITION -else - define_bool CONFIG_SUN_PARTITION y + if [ "$CONFIG_SGI" = "y" ]; then + define_bool CONFIG_SGI_PARTITION y + fi + if [ "$ARCH" = "sparc" -o "$ARCH" = "sparc64" ]; then + define_bool CONFIG_SUN_PARTITION y + fi fi diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 78ebb20abd99..25a6090dbf41 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -276,7 +276,6 @@ static void check_partition(struct gendisk *hd, kdev_t dev, int first_part_minor void register_disk(struct gendisk *gdev, kdev_t dev, unsigned minors, struct block_device_operations *ops, long size) { - unsigned first = (unsigned)dev; if (!gdev) return; grok_partitions(gdev, MINOR(dev)>>gdev->minor_shift, minors, size); diff --git a/fs/select.c b/fs/select.c index 674cfdaa2816..b664d3e819ae 100644 --- a/fs/select.c +++ b/fs/select.c @@ -8,6 +8,10 @@ * COFF/ELF binary emulation. If the process has the STICKY_TIMEOUTS * flag set in its personality we do *not* modify the given timeout * parameter to reflect time remaining. + * + * 24 January 2000 + * Changed sys_poll()/do_poll() to use PAGE_SIZE chunk-based allocation + * of fds to overcome nfds < 16390 descriptors limit (Tigran Aivazian). */ #include @@ -328,39 +332,48 @@ out_nofds: return ret; } -static int do_poll(unsigned int nfds, struct pollfd *fds, poll_table *wait, - long timeout) +#define POLLFD_PER_PAGE ((PAGE_SIZE) / sizeof(struct pollfd)) + +static void do_pollfd(struct pollfd * fdp, poll_table * wait, int *count) +{ + int fd; + unsigned int mask; + + mask = 0; + fd = fdp->fd; + if (fd >= 0) { + struct file * file = fget(fd); + mask = POLLNVAL; + if (file != NULL) { + mask = DEFAULT_POLLMASK; + if (file->f_op && file->f_op->poll) + mask = file->f_op->poll(file, wait); + mask &= fdp->events | POLLERR | POLLHUP; + fput(file); + } + if (mask) { + wait = NULL; + (*count)++; + } + } + fdp->revents = mask; +} + +static int do_poll(unsigned int nfds, unsigned int nchunks, unsigned int nleft, + struct pollfd *fds[], poll_table *wait, long timeout) { int count = 0; for (;;) { - unsigned int j; - struct pollfd * fdpnt; + unsigned int i, j; set_current_state(TASK_INTERRUPTIBLE); - for (fdpnt = fds, j = 0; j < nfds; j++, fdpnt++) { - int fd; - unsigned int mask; - - mask = 0; - fd = fdpnt->fd; - if (fd >= 0) { - struct file * file = fget(fd); - mask = POLLNVAL; - if (file != NULL) { - mask = DEFAULT_POLLMASK; - if (file->f_op && file->f_op->poll) - mask = file->f_op->poll(file, wait); - mask &= fdpnt->events | POLLERR | POLLHUP; - fput(file); - } - if (mask) { - wait = NULL; - count++; - } - } - fdpnt->revents = mask; - } + for (i=0; i < nchunks; i++) + for (j = 0; j < POLLFD_PER_PAGE; j++) + do_pollfd(fds[i] + j, wait, &count); + if (nleft) + for (j = 0; j < nleft; j++) + do_pollfd(fds[nchunks] + j, wait, &count); wait = NULL; if (count || !timeout || signal_pending(current)) @@ -373,18 +386,17 @@ static int do_poll(unsigned int nfds, struct pollfd *fds, poll_table *wait, asmlinkage long sys_poll(struct pollfd * ufds, unsigned int nfds, long timeout) { - int i, fdcount, err, size; - struct pollfd * fds, *fds1; + int i, j, fdcount, err; + struct pollfd **fds; poll_table *wait_table = NULL, *wait = NULL; + int nchunks, nleft; - lock_kernel(); /* Do a sanity check on nfds ... */ - err = -EINVAL; if (nfds > current->files->max_fds) - goto out; + return -EINVAL; if (timeout) { - /* Carefula about overflow in the intermediate values */ + /* Careful about overflow in the intermediate values */ if ((unsigned long) timeout < MAX_SCHEDULE_TIMEOUT / HZ) timeout = (unsigned long)(timeout*HZ+999)/1000+1; else /* Negative or overflow */ @@ -402,32 +414,62 @@ asmlinkage long sys_poll(struct pollfd * ufds, unsigned int nfds, long timeout) wait = wait_table; } - size = nfds * sizeof(struct pollfd); - fds = (struct pollfd *) kmalloc(size, GFP_KERNEL); - if (!fds) + fds = (struct pollfd **)kmalloc( + (1 + (nfds - 1) / POLLFD_PER_PAGE) * sizeof(struct pollfd *), + GFP_KERNEL); + if (fds == NULL) goto out; + nchunks = 0; + nleft = nfds; + while (nleft > POLLFD_PER_PAGE) { /* allocate complete PAGE_SIZE chunks */ + fds[nchunks] = (struct pollfd *)__get_free_page(GFP_KERNEL); + if (fds[nchunks] == NULL) + goto out_fds; + nchunks++; + nleft -= POLLFD_PER_PAGE; + } + if (nleft) { /* allocate last PAGE_SIZE chunk, only nleft elements used */ + fds[nchunks] = (struct pollfd *)__get_free_page(GFP_KERNEL); + if (fds[nchunks] == NULL) + goto out_fds; + } + err = -EFAULT; - if (copy_from_user(fds, ufds, size)) - goto out_fds; + for (i=0; i < nchunks; i++) + if (copy_from_user(fds[i], ufds + i*POLLFD_PER_PAGE, PAGE_SIZE)) + goto out_fds1; + if (nleft) { + if (copy_from_user(fds[nchunks], ufds + nchunks*POLLFD_PER_PAGE, + nleft * sizeof(struct pollfd))) + goto out_fds1; + } - fdcount = do_poll(nfds, fds, wait, timeout); + lock_kernel(); + fdcount = do_poll(nfds, nchunks, nleft, fds, wait, timeout); + unlock_kernel(); /* OK, now copy the revents fields back to user space. */ - fds1 = fds; - for(i=0; i < (int)nfds; i++, ufds++, fds1++) { - __put_user(fds1->revents, &ufds->revents); - } + for(i=0; i < nchunks; i++) + for (j=0; j < POLLFD_PER_PAGE; j++, ufds++) + __put_user((fds[i] + j)->revents, &ufds->revents); + if (nleft) + for (j=0; j < nleft; j++, ufds++) + __put_user((fds[nchunks] + j)->revents, &ufds->revents); err = fdcount; if (!fdcount && signal_pending(current)) err = -EINTR; +out_fds1: + if (nleft) + free_page((unsigned long)(fds[nchunks])); out_fds: + for (i=0; i < nchunks; i++) + free_page((unsigned long)(fds[i])); kfree(fds); out: if (wait) free_wait(wait_table); - unlock_kernel(); return err; } diff --git a/fs/super.c b/fs/super.c index 889938116121..86985cfa5573 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1272,7 +1272,7 @@ int __init change_root(kdev_t new_root_dev,const char *put_old) } return 0; } - printk(KERN_ERR "error %d\n",PTR_ERR(bdev)); + printk(KERN_ERR "error %ld\n",PTR_ERR(bdev)); return error; } remove_vfsmnt(old_root_dev); diff --git a/include/asm-sparc/io.h b/include/asm-sparc/io.h index 80fa5caa6e9b..71610a59fc2d 100644 --- a/include/asm-sparc/io.h +++ b/include/asm-sparc/io.h @@ -1,5 +1,5 @@ /* - * $Id: io.h,v 1.24 1999/12/20 04:58:40 davem Exp $ + * $Id: io.h,v 1.25 2000/01/22 07:35:46 zaitcev Exp $ */ #ifndef __SPARC_IO_H #define __SPARC_IO_H @@ -12,7 +12,7 @@ #include #define virt_to_bus virt_to_phys - +#define bus_to_virt phys_to_virt extern __inline__ unsigned flip_dword (unsigned d) { return ((d&0xff)<<24) | (((d>>8)&0xff)<<16) | (((d>>16)&0xff)<<8)| ((d>>24)&0xff); @@ -78,6 +78,13 @@ extern __inline__ void writel(unsigned int b, unsigned long addr) { #define outl(b, addr) writel(b, addr) #define outb_p(b, addr) writeb(b, addr) +extern void outsb(unsigned long addr, const void *src, unsigned long cnt); +extern void outsw(unsigned long addr, const void *src, unsigned long cnt); +extern void outsl(unsigned long addr, const void *src, unsigned long cnt); +extern void insb(unsigned long addr, void *dst, unsigned long count); +extern void insw(unsigned long addr, void *dst, unsigned long count); +extern void insl(unsigned long addr, void *dst, unsigned long count); + #define IO_SPACE_LIMIT 0xffffffff /* diff --git a/include/asm-sparc/irq.h b/include/asm-sparc/irq.h index 05c3374fa287..b7ea7009103c 100644 --- a/include/asm-sparc/irq.h +++ b/include/asm-sparc/irq.h @@ -1,4 +1,4 @@ -/* $Id: irq.h,v 1.27 1999/08/14 03:52:02 anton Exp $ +/* $Id: irq.h,v 1.28 2000/01/22 06:06:58 zaitcev Exp $ * irq.h: IRQ registers on the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -49,6 +49,7 @@ BTFIXUPDEF_CALL(void, clear_clock_irq, void) BTFIXUPDEF_CALL(void, clear_profile_irq, int) BTFIXUPDEF_CALL(void, load_profile_irq, int, unsigned int) +#define disable_irq_nosync disable_irq #define disable_irq(irq) BTFIXUP_CALL(disable_irq)(irq) #define enable_irq(irq) BTFIXUP_CALL(enable_irq)(irq) #define disable_pil_irq(irq) BTFIXUP_CALL(disable_pil_irq)(irq) diff --git a/include/asm-sparc/pci.h b/include/asm-sparc/pci.h index 17c8ce462fe8..f30a5bcc2cf8 100644 --- a/include/asm-sparc/pci.h +++ b/include/asm-sparc/pci.h @@ -7,4 +7,7 @@ */ #define pcibios_assign_all_busses() 0 +#define PCIBIOS_MIN_IO 0UL +#define PCIBIOS_MIN_MEM 0UL + #endif /* __SPARC_PCI_H */ diff --git a/include/linux/fs.h b/include/linux/fs.h index 0046b3f7e019..1aa8cb5c42a9 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -783,9 +783,9 @@ extern int register_chrdev(unsigned int, const char *, struct file_operations *) extern int unregister_chrdev(unsigned int, const char *); extern int chrdev_open(struct inode *, struct file *); extern struct file_operations def_chr_fops; -extern char * bdevname(kdev_t); -extern char * cdevname(kdev_t); -extern char * kdevname(kdev_t); +extern const char * bdevname(kdev_t); +extern const char * cdevname(kdev_t); +extern const char * kdevname(kdev_t); extern void init_special_inode(struct inode *, umode_t, int); extern struct inode_operations fifo_inode_operations; diff --git a/include/linux/hdreg.h b/include/linux/hdreg.h index a2f08879c61c..fcac3cd06965 100644 --- a/include/linux/hdreg.h +++ b/include/linux/hdreg.h @@ -49,6 +49,7 @@ #define WIN_SEEK 0x70 #define WIN_DIAGNOSE 0x90 #define WIN_SPECIFY 0x91 /* set drive geometry translation */ +#define WIN_IDLEIMMEDIATE 0xE1 /* force drive to become "ready" */ #define WIN_SETIDLE1 0xE3 #define WIN_SETIDLE2 0x97 diff --git a/include/linux/hfs_sysdep.h b/include/linux/hfs_sysdep.h index c3b866f25e86..5172139ec384 100644 --- a/include/linux/hfs_sysdep.h +++ b/include/linux/hfs_sysdep.h @@ -121,7 +121,7 @@ extern inline void hfs_mdb_dirty(hfs_sysmdb sys_mdb) { sys_mdb->s_dirt = 1; } -extern inline char *hfs_mdb_name(hfs_sysmdb sys_mdb) { +extern inline const char *hfs_mdb_name(hfs_sysmdb sys_mdb) { return kdevname(sys_mdb->s_dev); } diff --git a/include/linux/isapnp.h b/include/linux/isapnp.h index 5a074285e348..7a52a7c4d709 100644 --- a/include/linux/isapnp.h +++ b/include/linux/isapnp.h @@ -128,7 +128,7 @@ struct isapnp_resources { struct isapnp_resources *next; /* next resource */ }; -#if defined(CONFIG_ISAPNP) || defined(CONFIG_ISAPNP_MODULE) +#if defined(CONFIG_ISAPNP) || (defined(CONFIG_ISAPNP_MODULE) && defined(MODULE)) #define __ISAPNP__ diff --git a/include/linux/kdev_t.h b/include/linux/kdev_t.h index a06cdb9ed193..aeee1fbee0c7 100644 --- a/include/linux/kdev_t.h +++ b/include/linux/kdev_t.h @@ -73,7 +73,7 @@ typedef unsigned short kdev_t; #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi)) #define B_FREE 0xffff /* yuk */ -extern char * kdevname(kdev_t); /* note: returns pointer to static data! */ +extern const char * kdevname(kdev_t); /* note: returns pointer to static data! */ /* As long as device numbers in the outside world have 16 bits only, diff --git a/include/linux/pci.h b/include/linux/pci.h index 3c51b15e7880..ddf634a21059 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -462,16 +462,16 @@ int pci_proc_detach_device(struct pci_dev *dev); void pci_name_device(struct pci_dev *dev); char *pci_class_name(u32 class); void pci_read_bridge_bases(struct pci_bus *child); -struct resource *pci_find_parent_resource(struct pci_dev *dev, struct resource *res); +struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res); int pci_setup_device(struct pci_dev * dev); /* Generic PCI functions exported to card drivers */ -struct pci_dev *pci_find_device (unsigned int vendor, unsigned int device, struct pci_dev *from); +struct pci_dev *pci_find_device (unsigned int vendor, unsigned int device, const struct pci_dev *from); struct pci_dev *pci_find_subsys (unsigned int vendor, unsigned int device, unsigned int ss_vendor, unsigned int ss_device, - struct pci_dev *from); -struct pci_dev *pci_find_class (unsigned int class, struct pci_dev *from); + const struct pci_dev *from); +struct pci_dev *pci_find_class (unsigned int class, const struct pci_dev *from); struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn); int pci_find_capability (struct pci_dev *dev, int cap); @@ -526,8 +526,8 @@ int pci_register_driver(struct pci_driver *); void pci_unregister_driver(struct pci_driver *); void pci_insert_device(struct pci_dev *, struct pci_bus *); void pci_remove_device(struct pci_dev *); -struct pci_driver *pci_dev_driver(struct pci_dev *); -const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, struct pci_dev *dev); +struct pci_driver *pci_dev_driver(const struct pci_dev *); +const struct pci_device_id *pci_match_device(const struct pci_device_id *ids, const struct pci_dev *dev); /* * If the system does not have PCI, clearly these return errors. Define diff --git a/include/linux/smp.h b/include/linux/smp.h index 2c6771a4fcbd..5f8a10198d91 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -80,6 +80,7 @@ extern volatile int smp_msg_id; #define smp_threads_ready 1 #define kernel_lock() #define cpu_logical_map(cpu) 0 +#define cpu_number_map(cpu) 0 #define smp_call_function(func,info,retry,wait) ({ 0; }) #endif diff --git a/ipc/shm.c b/ipc/shm.c index 8b4976195619..1b38554507ea 100644 --- a/ipc/shm.c +++ b/ipc/shm.c @@ -584,15 +584,10 @@ out_unlock: */ static struct vm_operations_struct shm_vm_ops = { - shm_open, /* open - callback for a new vm-area open */ - shm_close, /* close - callback for when the vm-area is released */ - NULL, /* no need to sync pages at unmap */ - NULL, /* protect */ - NULL, /* sync */ - NULL, /* advise */ - shm_nopage, /* nopage */ - NULL, /* wppage */ - shm_swapout /* swapout */ + open: shm_open, /* open - callback for a new vm-area open */ + close: shm_close, /* close - callback for when the vm-area is released */ + nopage: shm_nopage, + swapout: shm_swapout, }; /* Insert shmd into the list shp->attaches */ diff --git a/kernel/sched.c b/kernel/sched.c index 09817384fed5..ce72ecc7b31d 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -477,7 +477,7 @@ handle_bh_back: goto move_rr_last; move_rr_back: - switch (prev->state) { + switch (prev->state & ~TASK_EXCLUSIVE) { case TASK_INTERRUPTIBLE: if (signal_pending(prev)) { prev->state = TASK_RUNNING; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index fd4970e582eb..edb9d4863784 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -43,7 +43,7 @@ extern int sysctl_overcommit_memory; extern int max_threads; extern int nr_queued_signals, max_queued_signals; -/* this is needed for the proc_dointvec_minmax for overflow UID and GID */ +/* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */ static int maxolduid = 65535; static int minolduid = 0; diff --git a/mm/filemap.c b/mm/filemap.c index 63a50b7e624c..2ef86555525c 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1627,15 +1627,10 @@ static void filemap_unmap(struct vm_area_struct *vma, unsigned long start, size_ * backing-store for swapping.. */ static struct vm_operations_struct file_shared_mmap = { - NULL, /* no special open */ - NULL, /* no special close */ - filemap_unmap, /* unmap - we need to sync the pages */ - NULL, /* no special protect */ - filemap_sync, /* sync */ - NULL, /* advise */ - filemap_nopage, /* nopage */ - NULL, /* wppage */ - filemap_swapout /* swapout */ + unmap: filemap_unmap, /* unmap - we need to sync the pages */ + sync: filemap_sync, + nopage: filemap_nopage, + swapout: filemap_swapout, }; /* @@ -1645,15 +1640,7 @@ static struct vm_operations_struct file_shared_mmap = { * know they can't ever get write permissions..) */ static struct vm_operations_struct file_private_mmap = { - NULL, /* open */ - NULL, /* close */ - NULL, /* unmap */ - NULL, /* protect */ - NULL, /* sync */ - NULL, /* advise */ - filemap_nopage, /* nopage */ - NULL, /* wppage */ - NULL /* swapout */ + nopage: filemap_nopage, }; /* This is used for a general mmap of a disk file */ diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 8bea0ce9860c..bed8c5cc2fa8 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c @@ -1522,7 +1522,7 @@ static unsigned int irda_poll(struct file * file, struct socket *sock, * we set writable also when the other side has shut down the * connection. This prevents stuck sockets. */ - if (sk->sndbuf - (int)atomic_read(&sk->wmem_alloc) >= MIN_WRITE_SPACE) + if (sk->sndbuf - (int)atomic_read(&sk->wmem_alloc) >= SOCK_MIN_WRITE_SPACE) mask |= POLLOUT | POLLWRNORM | POLLWRBAND; return mask; diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index b18f0f86ebe7..4377a14786fd 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -1532,15 +1532,8 @@ static void packet_mm_close(struct vm_area_struct *vma) } static struct vm_operations_struct packet_mmap_ops = { - packet_mm_open, /* open */ - packet_mm_close, /* close */ - NULL, /* unmap */ - NULL, /* no special protect */ - NULL, /* sync */ - NULL, /* advise */ - NULL, /* nopage */ - NULL, /* wppage */ - NULL /* swapout */ + open: packet_mm_open, + close: packet_mm_close, }; static void free_pg_vec(unsigned long *pg_vec, unsigned order, unsigned len) diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 521152396265..459de5e7fde6 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -816,7 +816,7 @@ static void do_rpciod_tcp_dispatcher(void) { struct rpc_xprt *xprt; - int result; + int result = 0; dprintk("rpciod_tcp_dispatcher: Queue Running\n"); -- 2.39.5