]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.41pre3 2.3.41pre3
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:30:25 +0000 (15:30 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:30:25 +0000 (15:30 -0500)
102 files changed:
Documentation/Configure.help
Documentation/usb/ibmcam.txt
Documentation/usb/ov511.txt
Documentation/usb/scanner-hp-sane.txt
Documentation/usb/scanner.txt
Documentation/usb/usb-serial.txt
arch/i386/Makefile
arch/i386/config.in
arch/i386/kernel/apm.c
arch/i386/mm/init.c
arch/sparc/config.in
arch/sparc/kernel/ebus.c
arch/sparc/kernel/ioport.c
arch/sparc/kernel/pcic.c
arch/sparc/kernel/sys_sunos.c
drivers/block/Config.in
drivers/block/alim15x3.c
drivers/block/hpt366.c
drivers/block/ide-disk.c
drivers/block/ide-pci.c
drivers/block/ide-probe.c
drivers/block/ide-tape.c
drivers/block/ide.c
drivers/block/paride/Config.in
drivers/block/piix.c
drivers/cdrom/Config.in
drivers/cdrom/cdrom.c
drivers/char/Config.in
drivers/char/ftape/Config.in
drivers/net/wan/Config.in
drivers/parport/procfs.c
drivers/pci/compat.c
drivers/pci/gen-devlist.c
drivers/pci/pci.c
drivers/pci/proc.c
drivers/sbus/audio/amd7930.c
drivers/sbus/char/Makefile
drivers/sbus/char/uctrl.c
drivers/sbus/char/vfc_i2c.c
drivers/scsi/3w-xxxx.c [new file with mode: 0644]
drivers/scsi/3w-xxxx.h [new file with mode: 0644]
drivers/scsi/53c7xx.c
drivers/scsi/Config.in
drivers/scsi/Makefile
drivers/scsi/hosts.c
drivers/sgi/char/graphics.c
drivers/sgi/char/shmiq.c
drivers/usb/Config.in
drivers/usb/bitstream.h [deleted file]
drivers/usb/dabfirmware.h [new file with mode: 0644]
drivers/usb/firmware.h [deleted file]
drivers/usb/graphire.c
drivers/usb/hid.c
drivers/usb/ibmcam.c
drivers/usb/ibmcam.h
drivers/usb/mousedev.c
drivers/usb/ov511.c
drivers/usb/scanner.c
drivers/usb/scanner.h [new file with mode: 0644]
drivers/usb/uhci-debug.h
drivers/usb/usb-core.c
drivers/usb/usb-debug.c
drivers/usb/usb-ohci.c
drivers/usb/usb-serial.c
drivers/usb/usb-uhci.c
drivers/usb/usb-uhci.h
drivers/usb/usb.c
drivers/usb/usb.h
drivers/usb/usb_scsi.c
drivers/usb/usb_scsi.h
drivers/usb/usb_scsi_debug.c
drivers/usb/usbkbd.c
drivers/usb/usbmouse.c
drivers/video/Config.in
drivers/video/fbcon.c
drivers/video/skeletonfb.c
fs/Config.in
fs/block_dev.c
fs/devices.c
fs/ncpfs/mmap.c
fs/nfs/write.c
fs/partitions/Config.in
fs/partitions/check.c
fs/select.c
fs/super.c
include/asm-sparc/io.h
include/asm-sparc/irq.h
include/asm-sparc/pci.h
include/linux/fs.h
include/linux/hdreg.h
include/linux/hfs_sysdep.h
include/linux/isapnp.h
include/linux/kdev_t.h
include/linux/pci.h
include/linux/smp.h
ipc/shm.c
kernel/sched.c
kernel/sysctl.c
mm/filemap.c
net/irda/af_irda.c
net/packet/af_packet.c
net/sunrpc/xprt.c

index 8ee3e46007668140c9f55b6ce58e2f94834af3be..2eca295c52aaa42503ffdadcbce7279f76c51b4c 100644 (file)
@@ -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
 ###
index e668dfc71adf51272a44623739191967c5bce7a9..4d7ab56ebf12669b2eb49ad57d3702d854f0993e 100644 (file)
@@ -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:
 
index 3a73afc0dcdc90294ae9999dcd1c59de2cd6e337..fe84f11df461af16fb454c9deba7a77e3b269ec7 100644 (file)
@@ -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)
 
index 220bbb2900554428f5625cdb3095c263bf09760f..a1cbcd1b4391d2a68c65c04db4a3aa59ee7392a1 100644 (file)
@@ -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?
 
index 4b5de2be8f2611732e88646b24376e0d97ba54b8..19303508582f1398d5cb0f278f30bc752f9f0f95 100644 (file)
@@ -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
-<postbus@ordelmans.demon.nl> 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
index e046ae2e5cfcdd47ccab0677c783e82eb2af1f18..e9e94510b9a16efe2a06d5c9b720d817e77b89f1 100644 (file)
@@ -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
index 37b2371a0bcf125e3664935079f5ad881dd3cbe1..4ba71ba062365243258dfbaae0af63453e61a4e2 100644 (file)
@@ -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)
index a32b43c65cca22ecaad957906453494d0c983bd7..00a1b42d3a5c971a023924912a48d9ab2ede527b 100644 (file)
@@ -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
index 8f3d24645f85b16b23cbe6954802ec74b37d6437..daa7226cdd3835cb44e6a5a570adea04d8ae7911 100644 (file)
@@ -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 = {
index b20ddc2d520da213f72d3e4b7f55fecab8e74561..70520b99d93e87703a3123260b146179f7291d03 100644 (file)
@@ -196,7 +196,7 @@ void __init kmap_init(void)
 
        kmap_prot = PAGE_KERNEL;
 }
-#endif
+#endif /* CONFIG_HIGHMEM */
 
 void show_mem(void)
 {
index 31e126f3342d117ead4e93b00c90d64b2f15b4ab..8d3562e37e4dee63c7928651f7f59125bb71304b 100644 (file)
@@ -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
 
index c1ef01be30abab0d46c2fb2cc6042d33d572c394..c9972ab1671c88b10bcd1636f7d3d0f7b6c58b8a 100644 (file)
@@ -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)
 #include <asm/oplib.h>
 #include <asm/bpp.h>
 
-#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)
index e2b6b1ae4fdcaffe93ae82421ff413014510809a..06dba1c225b269f81ff6089e328a1e881b5adba6 100644 (file)
@@ -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,
index 94847460be7a98098d169ea4b1a769e2f2f958bb..b504e2412306d5cd56069412ff50bf40987ac9ad 100644 (file)
@@ -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
index c0155e65b47a39e9eaf375d584ba28f2af7af55c..704bf83ff915d77953deb117a875283001e3444b 100644 (file)
@@ -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) {
index e27fb0109daf162e1295002007c1753df9ba0276..5634cc488ac8bcd21d9c78333ec7a1f98bd41469 100644 (file)
@@ -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
index 7cecae978234eb10497bff8c4ab9561b9de5d613..4b9b28e3b15744104d7d31fa1260c5e2ffbcb76c 100644 (file)
@@ -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) ||
index 1b497fecce6be9b6c53d1785e304eb6d03e40ca6..65c6951834459d303940f5513c6ad67b7c0ad146 100644 (file)
@@ -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, &reg50h);
+                       pci_write_config_byte(HWIF(drive)->pci_dev, 0x50, reg50h|0x03);
+                       pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, &reg50h);
+                       /* 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, &reg50h);
-                               pci_read_config_byte(HWIF(drive)->pci_dev, 0x52, &reg52h);
-                               printk("%s: (ide_dma_timeout) reg52h=0x%02x\n", drive->name, reg52h);
-                               if (reg52h & 0x04) {
-                                       pci_read_config_byte(HWIF(drive)->pci_dev, 0x50, &reg50h);
-                                       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, &reg50h);
-                               pci_read_config_byte(HWIF(drive)->pci_dev, 0x52, &reg52h);
-                               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;
index 14952a049cd2a324bfacf6ef6ef28b655c585efd..1209aa82a2d33257b8b5fe3d396103e8c08e396e 100644 (file)
@@ -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;
index 6ee45c49dff018d960d73ccc077a873f4d15f1d8..7f429eff238c3561740d90a4f2cd3b330d61b811 100644 (file)
@@ -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();
-}
index efb4705f3018ba511a253ea7b345f071ed451063..1c6f19eba24d5191e5b37035a4ae42c3339b237c 100644 (file)
@@ -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) {
index 429888f3269e0201c219d7445dc949cd89e58222..beaf1226690d6daabb2a73600f1cffd2ac8a8de6 100644 (file)
  *             sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
  */
 
-#define IDETAPE_VERSION "1.16e"
+#define IDETAPE_VERSION "1.16f"
 
 #include <linux/config.h>
 #include <linux/module.h>
 #include <asm/unaligned.h>
 #include <asm/bitops.h>
 
+
+#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;
        }
index 873f57cc9147f39294e981e1436936f662995509..396369651345ce2ab19dabfe7378ee17fcd3eaad 100644 (file)
@@ -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 */
 }
 
index 8d4dc17426e6b9412bc7629623ead3cafc9c1e68..28ef310f49dfce03276bd0e749515f91cbe69f5a 100644 (file)
@@ -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
index b8ffb5a4b16da5013a319fd3692865187c797edb..64cf45853a096b6954cb2caf85c5a64aa0da68f2 100644 (file)
  *
  * 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, &reg40);
  * pci_read_config_word(HWIF(drive)->pci_dev, 0x42, &reg42);
@@ -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, &reg4042);
-       sitre =  (reg4042 & 0x4000) ? 1 : 0;
+       sitre = (reg4042 & 0x4000) ? 1 : 0;
        pci_read_config_word(dev, 0x44, &reg44);
        pci_read_config_word(dev, 0x48, &reg48);
        pci_read_config_word(dev, 0x4a, &reg4a);
+       pci_read_config_word(dev, 0x54, &reg54);
 
-       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, &reg54h);
+       pci_read_config_byte(hwif->pci_dev, 0x55, &reg55h);
+       ata66 = (reg54h & mask) ? 0 : 1;
+
+       return ata66;
 }
 
 void __init ide_init_piix (ide_hwif_t *hwif)
index 31210596db0f82b0da9b72becbf5a57ee9d4ae2b..7ffbfb958d4e39e6a37822e8363b1f8a75678b75 100644 (file)
@@ -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
index f7d15edadbb4fc647f32cb6b12d362b5095ffc6c..bfac3e1d04f13d9a9d58a1be205082d508604b04 100644 (file)
 #include <linux/sysctl.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
+#include <linux/blkdev.h>
+
 #include <asm/fcntl.h>
 #include <asm/segment.h>
 #include <asm/uaccess.h>
index 1bffec23dc61ddb51c62ce8310b24ff48971be67..42cbaab5557149b82662067a7ef95f15fea6717a 100644 (file)
@@ -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
index 817bf5cd29c8eba9aed43c85ae2f23f4e4e086ec..179f5ba0741add316c301666e81ea3c48c6b303e 100644 (file)
@@ -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
index 503854a0f9aa2dbab280a36a23d873804ed2d914..a4c13c4244dc66c847e0b204fde941a4ce189d87 100644 (file)
@@ -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
index 29a3a7e2932a6c5b6c2cdc345e087cfb0b72d2e3..07b30b009046581e04e3df834828c3415e7944a4 100644 (file)
@@ -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}},
index b59da50412f74189bd3d491d2f6eb296d2b4274d..ce058cc0e7c358a0d7e9fa5d59f21e5291c90a33 100644 (file)
@@ -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)))
index 9337d80b0cb8d2d6b12f1373563f806ec1425932..ed0bcba16efa83de64080a0803dbe0128e4e139f 100644 (file)
@@ -8,7 +8,7 @@
 #include <string.h>
 
 static void
-pq(FILE *f, char *c)
+pq(FILE *f, const char *c)
 {
        while (*c) {
                if (*c == '"')
index f109cef468322bb63cb7bafabbe11ea984b13194..8bfdc818a8faa61f59821461632bf948be1d6f56 100644 (file)
@@ -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;
        }
index b687d612295141c99aed17560b3399bd1b69480b..36c3be081581d67c9d8537efad13c6cf528205cb 100644 (file)
@@ -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,
index 1cb739719a071b8c9a7fa50d04d83be4b5c61557..f3f593bce38d91c2738e2f4c9f5d28dae4517a57 100644 (file)
@@ -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++;
                }
        }
index 9a4a59fe6ff6c94288018149d6034fbd7412ebaf..4a88efda31b3eafb9285b59d98731e09216367fc 100644 (file)
@@ -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
index f46cffe1bc599c933dcaa738f7fc0ed4f94d384a..6d9decaf33f2ff0a0947211627bb1e39342d4b46 100644 (file)
@@ -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;
index 2538c935fe0b26fe60aa253714355899f1e874bf..6731caa78f3b719ee16267e715f7868e506e6a73 100644 (file)
@@ -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 (file)
index 0000000..abf9e90
--- /dev/null
@@ -0,0 +1,2308 @@
+/* 
+   3w-xxxx.c -- 3ware Storage Controller device driver for Linux.
+
+   Written By: Adam Radford <linux@3ware.com>
+   Copyright (C) 1999-2000 3ware Inc.
+
+   Kernel compatablity By:     Andre Hedrick <andre@suse.com>
+   Non-Copyright (C) 2000      Andre Hedrick <andre@suse.com>
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; version 2 of the License.
+
+   This program is distributed in the hope that it will be useful,           
+   but WITHOUT ANY WARRANTY; without even the implied warranty of            
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
+   GNU General Public License for more details.                              
+
+   NO WARRANTY                                                               
+   THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        
+   CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      
+   LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      
+   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    
+   solely responsible for determining the appropriateness of using and       
+   distributing the Program and assumes all risks associated with its        
+   exercise of rights under this Agreement, including but not limited to     
+   the risks and costs of program errors, damage to or loss of data,         
+   programs or equipment, and unavailability or interruption of operations.  
+
+   DISCLAIMER OF LIABILITY                                                   
+   NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   
+   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        
+   DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   
+   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     
+   TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    
+   USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  
+   HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             
+
+   You should have received a copy of the GNU General Public License         
+   along with this program; if not, write to the Free Software               
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+
+   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 <linux/config.h>
+
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif /* LINUX_VERSION_CODE */
+
+#ifdef MODULE
+#include <linux/modversions.h>
+#include <linux/module.h>
+char kernel_version[] = UTS_RELEASE;
+MODULE_AUTHOR ("3ware Inc.");
+MODULE_DESCRIPTION ("3ware Storage Controller Linux Driver");
+#endif
+
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/time.h>
+#include <linux/proc_fs.h>
+#include <linux/sched.h>
+#include <linux/ioport.h>
+#include <linux/blk.h>
+#include <linux/hdreg.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <linux/smp.h>
+#if LINUX_VERSION_CODE > TW_LINUX_VERSION(2,3,39)
+#include <linux/spinlock.h>
+#endif
+#include <asm/errno.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+#if LINUX_VERSION_CODE < TW_LINUX_VERSION(2,3,0)
+#include <asm/spinlock.h>
+#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;i<imax;i++) {
+                       mdelay(10);
+                       status_reg_value = inl(status_reg_addr);
+                       if (tw_check_bits(status_reg_value)) {
+                               printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Unexpected bits.\n");
+                               return 1;
+                       }
+                       if ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
+                               response_queue.value = inl(response_que_addr);
+                               request_id = (unsigned char)response_queue.u.response_id;
+    
+                               if (request_id != 0) {
+                                       /* Unexpected request id */
+                                       printk(KERN_WARNING "3w-xxxx: tw_aen_drain_queue(): Unexpected request id.\n");
+                                       return 1;
+                               }
+       
+                               if (command_packet->status != 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;i<imax;i++) {
+               if (tw_dev->command_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;i<imax;i++) {
+               mdelay(10);
+               status_reg_value = inl(status_reg_addr);
+               if (tw_check_bits(status_reg_value)) {
+                       printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Unexpected bits.\n");
+                       return 1;
+               }
+               if ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
+                       response_queue.value = inl(response_que_addr);
+                       request_id = (unsigned char)response_queue.u.response_id;
+                       if (request_id != 0) {
+                               /* unexpected request id */
+                               printk(KERN_WARNING "3w-xxxx: tw_initconnection(): Unexpected request id.\n");
+                               return 1;
+                       }
+                       if (command_packet->status != 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; i<imax; i++) {
+               /* Initialize command packet buffers */
+               tw_allocate_memory(tw_dev, i, sizeof(TW_Sector), 0);
+               if (tw_dev->command_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;i<TW_MAX_UNITS;i++)
+               tw_dev->is_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; i<imax; i++) {
+               mdelay(10);
+               status_reg_value = inl(status_reg_addr);
+               if (tw_check_bits(status_reg_value)) {
+                       printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Unexpected bits.\n");
+                       return 1;
+               }
+               if ((status_reg_value & TW_STATUS_RESPONSE_QUEUE_EMPTY) == 0) {
+                       response_queue.value = inl(response_que_addr);
+                       request_id = (unsigned char)response_queue.u.response_id;
+                       if (request_id != 0) {
+                               /* unexpected request id */
+                               printk(KERN_WARNING "3w-xxxx: tw_initialize_units(): Unexpected request id.\n");
+                               return 1;
+                       }
+                       if (command_packet->status != 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; i<imax; i++) {
+               if (is_unit_present[i] == 0) {
+                       tw_dev->is_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;i<imax;i++) {
+               if ((tw_dev->state[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;i<imax;i++) {
+               tw_dev->free_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;i<TW_Q_LENGTH;i++) {
+               if (tw_dev->srb[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;i<tw_device_extension_count;i++) 
+               if (tw_device_extension_list[i]->host->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;j<TW_Q_LENGTH;j++) {
+                               if (tw_dev->state[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 ; i<TW_MAX_UNITS; i++) {
+               if (is_unit_present[i] == 0) {
+                       tw_dev->is_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;i<tw_dev->srb[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 (file)
index 0000000..ee643df
--- /dev/null
@@ -0,0 +1,418 @@
+/* 
+   3w-xxxx.h -- 3ware Storage Controller device driver for Linux.
+   
+   Written By: Adam Radford <linux@3ware.com>
+   Copyright (C) 1999 3ware Inc.
+
+   Kernel compatablity By:     Andre Hedrick <andre@suse.com>
+   Non-Copyright (C) 2000      Andre Hedrick <andre@suse.com>
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; version 2 of the License.
+
+   This program is distributed in the hope that it will be useful,           
+   but WITHOUT ANY WARRANTY; without even the implied warranty of            
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             
+   GNU General Public License for more details.                              
+
+   NO WARRANTY                                                               
+   THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR        
+   CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT      
+   LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,      
+   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is    
+   solely responsible for determining the appropriateness of using and       
+   distributing the Program and assumes all risks associated with its        
+   exercise of rights under this Agreement, including but not limited to     
+   the risks and costs of program errors, damage to or loss of data,         
+   programs or equipment, and unavailability or interruption of operations.  
+
+   DISCLAIMER OF LIABILITY                                                   
+   NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY   
+   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        
+   DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND   
+   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     
+   TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE    
+   USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED  
+   HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES             
+
+   You should have received a copy of the GNU General Public License         
+   along with this program; if not, write to the Free Software               
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+
+   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 <linux/version.h>
+#endif /* LINUX_VERSION_CODE */
+
+#include <linux/types.h>
+#include <linux/kdev_t.h>
+
+/* 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 */
index 2fbbe449bebcf3fab0e37fa78c00a1f3f8ebef04..a5e0ca0a263c04d0f2e2250042730ce6d8134c85 100644 (file)
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
-#include <linux/proc_fs.h>
 #include <linux/string.h>
 #include <linux/malloc.h>
 #include <linux/vmalloc.h>
index d83913442563d711d033472da936cb81afba34f0..a1a82d96fe97acfd8a0f384b1b884bfcce8e870b 100644 (file)
@@ -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
index 9d8c7ac2b9c6a84401504f8c187dbb5cf5a98b14..17a94c26c6b10e31a73f835e52dc6163076a51fb 100644 (file)
@@ -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
index 95a132498cc4db7c95d564d3d16a1dcc73d1f95e..ee952d0afffa2080b17fcda8fbeb7f4d08950306 100644 (file)
 #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,
index 2fb28fe4335f786d4342f35555bb4a41547ab53d..7c68774c421e6b493e14881c50579922399217ea 100644 (file)
@@ -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
index 0b5311057f2bd99eca9c08580e084533b321ccc9..0b1965b6f5dd7bb1974f14701bbcc70358e2372f 100644 (file)
@@ -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
index 215fc53a464c3c6ba79b5526fb2049962ae3a760..5963bc5fd3ee161a26bc46abcba5ab5b87fb63f7 100644 (file)
@@ -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 (file)
index 5d272b1..0000000
+++ /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 (file)
index 0000000..d14d803
--- /dev/null
@@ -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 (file)
index a742558..0000000
+++ /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}
-}
-};
index 3214c997f72f4c3d2a79c018b7b80f882da18e97..8921c7db8fceedf1008eed5825336cf88c7ce6b8 100644 (file)
@@ -62,6 +62,12 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
  * 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),
index b3937357a49ab2fc55167fc0b44da9206db61a82..28c4cc507d26f3fe991ae7f6c66a11bf3da8940e 100644 (file)
@@ -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;
 }
index 4e809d08d573667b7abfe643a59688f6b6350574..2e9d43fa8dd59d2ddd1da383704cae85b80ed6ba 100644 (file)
@@ -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 = {
index 8dd6edadf52c40a45dbacb573f1f43f545bafcc6..6eb1d99ba6eb990eec0516c6d9b01db6b7a43eb6 100644 (file)
     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 */
index 8bcecdb8359986ec6e3e366852a433ccdbf64605..95623c9862cb8d98fc4bf7cc4e9192544f0890f8 100644 (file)
 #include <linux/input.h>
 #include <linux/config.h>
 
+#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;
 }
 
index c26f96132675fabf2ef51715b63f81927849bbca..6ec72d5023a025051be202c6b1703bd2e699080e 100644 (file)
@@ -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");
index 97399bc2df4aae9fd0b435a8869fe16df8551a42..5b403d55cffeae5984b0ae9fb068e2be07c2f933 100644 (file)
@@ -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)
  * 
  * 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
  *    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 <david-b@pacbell.net> technique for 
  *    - 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.
  *    - 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 <greg@kroah.com> 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 <khk@khk.net>.
+ *    - 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 <adrianpj@easynews.com>.
+ *    - 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 
+ *      <Dr.Hoyler@t-online.de>.
+ *    - 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.
  *    - 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 <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <asm/uaccess.h>
-#include <linux/malloc.h>
-#include <linux/delay.h>
-
-#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 (file)
index 0000000..996eb7f
--- /dev/null
@@ -0,0 +1,55 @@
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <asm/uaccess.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/ioctl.h>
+
+// #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");
index b4a64413553bad0393e7e39b7b71bb9532d212f8..73d16937a2d2bcf8bde1491bb6c7e3034125ecb2 100644 (file)
@@ -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);
 }
index fd211b1c445b7153840a43d8cad9be86673466ea..5dfd3c3ddce6caa104bca86ba3b692d192d91c01 100644 (file)
@@ -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
index 925b3e2440c03160c86325b6464a9770f8f120b5..5d560264d6c6e33049d79399e4302ba72207e56c 100644 (file)
@@ -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; i<desc->bNumDescriptors; 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 ==
index 26037497fcec85de28435b6bf871e683147798bd..509c49903dbd8a328c36089df95caf38ca7e69bb 100644 (file)
@@ -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;
                            }
                        }
                }
index 8b00c45be9e5ab61399eb160e6df9263b01769e5..748634382780f9a42f2f6841343073811647077c 100644 (file)
  *
  * 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 {
index 9a883f143764f1ab67f3002a21536cd7ee651e9b..3fe469699aa6e99c4c40839a7d9249c857848ba6 100644 (file)
  * $Id: usb-uhci.c,v 1.169 2000/01/20 19:50:11 acher Exp $
  */
 
-
-#ifndef EXPORT_SYMTAB
-#define EXPORT_SYMTAB
-#endif
-
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <asm/irq.h>
 #include <asm/system.h>
 
+/* 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 <linux/apm_bios.h>
 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
index a228794468d8ec45ae9a1164d3913c3a4e4b3ff8..2afef1cf18990415f2c10843edad8ce1aa66505d 100644 (file)
@@ -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
index 7b582b3037d9371d6313c043fae0e65fbc59f911..c4db289f23390173db61261a6687607415c7d46f 100644 (file)
@@ -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)
index b51d4234c7280b264ffae0bb065069b9f4b848a1..dcfe65c586acd94ea66a2916e286576ffada95fa 100644 (file)
@@ -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);
 
index 04474cb930986495c1f39e7b9540a336a51a80e8..c72467c6a697667beb4a40cbd42f11db3ca9bf70 100644 (file)
@@ -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 <linux/module.h>
@@ -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(&current->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;
 }
 
index 3e1feb78333fa266413dd9a4f97fee4f8a6bfb20..8fe3e9a44dcc60fb2b3c38462fa534a16253b431 100644 (file)
@@ -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 <linux/config.h>
 
-#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 */
index d29622cad44a08ec043ff7df956dde7f31c5705e..fc4e83917d13e15a9ee5d74d472c10b1a5a34333 100644 (file)
 
 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]);
 }
index 26de45a3827c9531ec02dac5421c63f5e5e7b85b..c6803f943592a2a49c913ab9077398b4e9c0bb3b 100644 (file)
@@ -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));
index e4145d0956f782909120047acdb43f6378b07364..7276ca6703fbd919d9cd0569fd198528b3c6d431 100644 (file)
@@ -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));
index d8591ef17026ff29fc5a80d90965a6d91535daa2..2ccc8d4bedd42898f6f4231d4d94041a4d2b81e5 100644 (file)
@@ -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
index a788430855c84d2f81b53da81d58f5e2c91ce8a5..02f50a4978e6c103791f0b1b8bbff691a0beacd7 100644 (file)
@@ -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);
 }
 
index 2eb7962f8651ac14719dcaa789b2473940d6ee79..5201bf1faa0d54e8ae109797f8015a496731c7af 100644 (file)
@@ -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
 };
 
 
index daad6d182563a2c964b168473db6a37db0d52a64..f0259787b7212e3a0b127ce0428f975319fca5fb 100644 (file)
@@ -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
index 0e34b95bd58853907f2478b0cb0820aeb1960432..47362da042789d31807f2c16bb69c70d8a2b56cb 100644 (file)
@@ -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;
index 3efb5822a5257c98c33795bab5caf8d627c68026..36e15475a2ca3d0b3c78d0968d1a94c049249297 100644 (file)
@@ -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;
index 806c05d6e21f4b356cb9a741530e749127a97c56..752ae1e1e2fbcb3d41c14f59e10b030409c6a32b 100644 (file)
@@ -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,
 };
 
 
index 9f58b4171890b0671186e27e7e82e006fb777767..09a16b302212d6be29deb5c382c5245e95b23a8d 100644 (file)
@@ -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; 
 }
 
 /*
index 7abc9efdf143b22f300caf50f63b8d665c586ac2..d978f2c389ac261dbdd51c53c2821ee8873455e3 100644 (file)
@@ -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
index 78ebb20abd99bf075cf7cdb1aae0e2d580fbacc9..25a6090dbf41ad13395806cb2cb7547ec731dbcd 100644 (file)
@@ -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);
index 674cfdaa28168e992267d19e5ae948cce80ca715..b664d3e819ae9c188206f2c58beb67e7938e1419 100644 (file)
@@ -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 <linux/malloc.h>
@@ -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;
 }
index 8899381161216f377034b53c1eea069a66691caf..86985cfa557346cd1f4dd9906f3290224779b3b7 100644 (file)
@@ -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);
index 80fa5caa6e9b8e6b9666601fb3a1dc64a09bbb0e..71610a59fc2d0c05f130ec8c6500a8b7ac69843a 100644 (file)
@@ -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 <asm/system.h>
 
 #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
 
 /*
index 05c3374fa28785ad0b0884c42207ecbd458a2e3d..b7ea7009103c711b8c5a57f01d220f76b5f0eaa4 100644 (file)
@@ -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)
index 17c8ce462fe8d8ee6120018e34bcf4b701bff1ab..f30a5bcc2cf833dfb601993ffa1d822ba82dea33 100644 (file)
@@ -7,4 +7,7 @@
  */
 #define pcibios_assign_all_busses()    0
 
+#define PCIBIOS_MIN_IO         0UL
+#define PCIBIOS_MIN_MEM                0UL
+
 #endif /* __SPARC_PCI_H */
index 0046b3f7e019306007ecf8a414ff97dcf0d093f9..1aa8cb5c42a97a7cb6ad25f22dd7d7a0f5c85d6e 100644 (file)
@@ -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;
index a2f08879c61ce7e4ddcff374d2fe87e8de33a379..fcac3cd0696552287dd5a55e68d52d9ff8031cc5 100644 (file)
@@ -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
 
index c3b866f25e86462b099ec4d44aa19765ff9d2a06..5172139ec384f45c8a9be2c64fcc4de729bea78d 100644 (file)
@@ -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);
 }
 
index 5a074285e34841b08e4245c37ba97941b5b6672e..7a52a7c4d709af8f512672ac8e2a78bb7f68380c 100644 (file)
@@ -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__
 
index a06cdb9ed193223241267b164584926d92bd3f97..aeee1fbee0c7cab764553ede85fb0adec909403b 100644 (file)
@@ -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,
index 3c51b15e788005f9f7fd12290af5907317dcadc4..ddf634a2105944d302fbb0f441e8bb2b3770ff05 100644 (file)
@@ -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
index 2c6771a4fcbd21c0c0a6c231ef1cc416f65519f2..5f8a10198d91b9b559d0da57d4e27b5fdf85086c 100644 (file)
@@ -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
index 8b497619561973c112455c27f25d9637423cf2c8..1b38554507ea9f60754e3d543a5728b01b7c3adf 100644 (file)
--- 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 */
index 09817384fed5e9b29f0fa9ed3d151260987ab335..ce72ecc7b31d74c716f1b92cde5aa885094f5a86 100644 (file)
@@ -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;
index fd4970e582eb8ba4b01f186c9790c3b1d50c6248..edb9d4863784d1ba33ae3497f03d1ab923504de9 100644 (file)
@@ -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;
 
index 63a50b7e624c22702aa3de0a79a026e97300dc1b..2ef86555525c6c22690488c085284bf2fe16abe2 100644 (file)
@@ -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 */
index 8bea0ce9860c5d9f98452375f055ca7f43b4f2e6..bed8c5cc2fa8df9332b955de4170b29668db5fbe 100644 (file)
@@ -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;
index b18f0f86ebe733cedb5d1014961589aed81f79ce..4377a14786fd446f8f11a7d9b51e618780cc8807 100644 (file)
@@ -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)
index 521152396265d0a9f5ce23d46f951e9fa00616cb..459de5e7fde621ade5ba2d3b5b9725d5efb45947 100644 (file)
@@ -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");