]> git.neil.brown.name Git - history.git/commitdiff
Linux 2.2.16pre6 2.2.16pre6
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 23 Nov 2007 20:21:23 +0000 (15:21 -0500)
committerAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 23 Nov 2007 20:21:23 +0000 (15:21 -0500)
o VM fixes (Rik van Riel)
o TCP and other net fixes (Dave Miller)
o Identify Intel cascade cpus (Dragan Stancevic)
o Sparc and sparc driver cleanness fixes (Dave Miller)
o Kill unused slhc_init stuff (Paul Gortmaker)
o Backport modprobe fixes from 2.3.x (Keith Owens)
o cmpci fixes (midi out, spdif) (Daisuke Nagano)
o Legacy mode Yamaha PCI audio driver (Daisuke Nagano)
o French translation has moved (Pierre Tane)
o Fix memory scribble in ip_masq (Andi Kleen)
o Mention iso8859-14 in docs (Andrzej Krzysztofowicz)
o Fix string handling in xconfig (Andrzej Krzysztofowicz)
o Updated 3c59x driver (Andrew Morton)
o Fix make xconfig and old tk (Andrzej Krzysztofowicz)
o Olympic driver fixes for PPC (Mike Phillips)
o Bring capabilities closer to POSIX spec (Andrew Morgan)
| Note. This subtly changes cap_bset behaviour

66 files changed:
Documentation/Configure.help
Documentation/sound/ChangeLog.ymfsb [new file with mode: 0644]
Documentation/sound/README.ymfsb [new file with mode: 0644]
Documentation/sound/TODO.ymfsb [new file with mode: 0644]
Makefile
arch/arm/config.in
arch/i386/kernel/setup.c
arch/ppc/config.in
arch/sparc64/defconfig
arch/sparc64/kernel/ioctl32.c
arch/sparc64/kernel/psycho.c
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/unaligned.c
arch/sparc64/mm/ultra.S
drivers/net/3c59x.c
drivers/net/olympic.c
drivers/net/olympic.h
drivers/net/slhc.c
drivers/sbus/audio/audio.c
drivers/sbus/char/envctrl.c
drivers/sbus/char/sab82532.c
drivers/sbus/char/su.c
drivers/sbus/char/sunmouse.c
drivers/sbus/char/zs.c
drivers/scsi/esp.c
drivers/scsi/esp.h
drivers/scsi/hosts.h
drivers/scsi/scsi.c
drivers/scsi/sym53c8xx_defs.h
drivers/sound/724hwmcode.h [new file with mode: 0644]
drivers/sound/Config.in
drivers/sound/Hwmcode.h [new file with mode: 0644]
drivers/sound/Makefile
drivers/sound/cmpci.c
drivers/sound/sound_core.c
drivers/sound/ymf_sb.c [new file with mode: 0644]
drivers/video/atyfb.c
fs/exec.c
include/asm-sparc/audioio.h
include/asm-sparc/head.h
include/asm-sparc64/audioio.h
include/asm-sparc64/envctrl.h
include/asm-sparc64/string.h
include/linux/capability.h
include/net/slhc.h [deleted file]
kernel/capability.c
kernel/kmod.c
kernel/sysctl.c
mm/filemap.c
mm/page_alloc.c
mm/vmscan.c
net/core/dev.c
net/ipv4/arp.c
net/ipv4/icmp.c
net/ipv4/ip_masq_mod.c
net/ipv4/syncookies.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_timer.c
net/ipv4/udp.c
net/unix/af_unix.c
p_sg2136_sg2137 [deleted file]
scripts/header.tk
scripts/tkgen.c
scripts/tkparse.c

index 780ba39ce2bae6edcbd788e3b30aa0b6e9e47798..d398861283f64effcf9c380e60e55ab9d4bde8f0 100644 (file)
@@ -9,8 +9,8 @@
 #     http://jf.gee.kyoto-u.ac.jp/JF/JF-ftp/euc/Configure.help.euc
 #   - Russian, by kaf@linux.nevod.perm.su, at
 #     http://nevod.perm.su/service/linux/doc/kernel/Configure.help
-#   - French, by David Bourgin (dbourgin@wsc.com), at
-#     http://www.linux-kheops.com/traduc/kernels/
+#   - French, by Pierre Tane (tanep@bigfoot.com), at
+#     http://www.traduc.org/kernelfr
 #   - Spanish, by Carlos Perelló Marín (fperllo@ehome.encis.es), at
 #     http://visar.csustan.edu/~carlos/
 #   - Italian, by Alessandro Rubini (rubini@linux.it), at
@@ -7980,9 +7980,9 @@ CONFIG_NLS_DEFAULT
   values are cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860,
   cp861, cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932, cp936,
   cp949, cp950, iso8859-1, iso8859-2, iso8859-3, iso8859-4, iso8859-5,
-  iso8859-6, iso8859-7, iso8859-8, iso8859-9, iso8859-15, koi8-r. 
-  If you specify a wrong value, it will use the build-in NLS; compatible
-  with iso8859-1.
+  iso8859-6, iso8859-7, iso8859-8, iso8859-9, iso8859-14, iso8859-15, 
+  koi8-r.  If you specify a wrong value, it will use the built-in NLS; 
+  compatible with iso8859-1.
 
   If unsure, specify it as "cp437".
 
diff --git a/Documentation/sound/ChangeLog.ymfsb b/Documentation/sound/ChangeLog.ymfsb
new file mode 100644 (file)
index 0000000..11fede8
--- /dev/null
@@ -0,0 +1,19 @@
+Sun May 21 15:14:37 2000  Daisuke Nagano  <breeze.nagano@nifty.ne.jp>
+
+       * ymf_sb.c: Add 'master_vol' module parameter to change
+       'PCM out Vol" of AC'97.
+       Should I support AC'97 mixer by implementing original mixer
+       codes... ?
+
+       * ymf_sb.c: remove native UART401 support. External MIDI port
+       should be supported by sb_midi driver.
+
+       *ymf_sb.c: add support for SPDIF OUT. Module parameter
+       'spdif_out' is now available.
+
+
+Tue May 16 19:29:29 2000  Daisuke Nagano  <breeze.nagano@nifty.ne.jp>
+
+       * ymf_sb.c (checkCodec): add a little delays for reset devices.
+       
+       * ymf_sb.c (readRegWord): fixed addressing bug.
diff --git a/Documentation/sound/README.ymfsb b/Documentation/sound/README.ymfsb
new file mode 100644 (file)
index 0000000..816f506
--- /dev/null
@@ -0,0 +1,143 @@
+Legacy audio driver for YMF7xx PCI cards.
+
+
+FIRST OF ALL
+============
+
+  This code references YAMAHA's sample codes and data sheets.
+  I respect and thank for all people they made open the informations
+  about YMF7xx cards.
+
+  And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s
+  VIA 82Cxxx driver (via82cxxx.c). I also respect him.
+
+
+DISCLIMER
+=========
+
+ This driver is currently at early ALPHA stage. It may cause serious
+ damage to your computer when used.
+ PLEASE USE IT AT YOUR OWN RISK.
+
+
+ABOUT THIS DRIVER
+=================
+
+  This code enables you to use your YMF724[A-F], YMF740[A-C], YMF744, YMF754
+ cards. When enabled, your card acts as "SoundBlaster Pro" compatible card.
+ It can only play 22.05kHz / 8bit / Stereo samples, control external MIDI
+ port.
+ If you want to use your card as recent "16-bit" card, you should wait for
+ Alsa (or OSS) driver. Ofcource you can write native PCI driver for your
+ cards :)
+
+
+INSTALL
+=======
+
+  This codes currently requires YAMAHA's header file: Hwmcode.h and
+ 724hwmcode.c
+ It can be found at alsa's ftp (or mirror) sites. 
+
+   ftp://ftp.alsa-project.org/pub/manuals/yamaha/pci/
+
+ Hwmcode.h is contained in 754smpls.zip available at above URL.
+
+
+  To compile driver module, extract source archive and place above headers
+ in the directory.
+ And type 'make'. When it goes well, you will get ymfsb.o. 
+ Copy it to /lib/modules/<kernel_version>/misc/ and do 'depmod -a'.
+ Before modprobe, insert following line in /etc/modules.conf:
+
+  # /etc/modules.conf
+  options sb support=1
+
+
+USAGE
+=====
+
+ # modprobe ymfsb
+
+
+OPTIONS FOR MODULE
+==================
+
+  io           : SB base address     (0x220, 0x240, 0x260, 0x280)
+  synth_io     : OPL3 base address   (0x388, 0x398, 0x3a0, 0x3a8)
+  dma          : DMA number          (0,1,3)
+  master_volume: AC'97 PCM out Vol   (0-100)
+  spdif_out    : SPDIF-out flag      (0:disable 1:enable)
+
+ These options will change in future...
+
+
+TODO
+====
+
+ TOO LOT.
+ Ofcource we have not to satisfy such a poor code like this :-<
+
+
+FREQUENCY
+=========
+
+  When playing sounds via this driver, you will hear its pitch is slightly
+ lower than original sounds. Since this driver recognizes your card acts
+ with 21.739kHz sample rates rather than 22.050kHz (I think it must be
+ hardware restriction). So many players become tone deafness.
+ To prevent this, you should express some options to your sound player
+ that specify correct sample frequency. For example, to play your MP3 file
+ correctly with mpg123, specify the frequency like following:
+
+  %  mpg123 -r 21739 foo.mp3
+
+ Ofcource it potentially contains sample-rate-conversion, and may destroy
+ your sound. But you must remember that this card currently only handle
+ samples up to 21.739kHz B-(
+
+
+SPDIF OUT
+=========
+
+  With installing modules with option 'spdif_out=1', you can enjoy your
+ sounds from SPDIF-out of your card (if it had).
+ Its Fs is fixed to 48kHz (It never means the sample frequency become 
+ up to 48kHz. All sounds via SPDIF-out also 22kHz samples). So your
+ digital-in capable components has to be able to handle 48kHz Fs.
+
+
+COPYING
+=======
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+AVAILABILITY
+============
+
+ The latest version of this driver may be available at:
+
+   http://member.nifty.ne.jp/Breeze/linux/index.html
+
+ When the native DS-XG driver is available (from alsa, OSS, or else),
+ this code will have to be expired.
+
+
+AUTHOR
+======
+
+ Daisuke Nagano <breeze.nagano@nifty.ne.jp>
+
diff --git a/Documentation/sound/TODO.ymfsb b/Documentation/sound/TODO.ymfsb
new file mode 100644 (file)
index 0000000..b234486
--- /dev/null
@@ -0,0 +1,7 @@
+YMF_SB driver
+
+TODO:
+ * support for multiple cards
+   (set the different SB_IO,MPU_IO,OPL_IO for each cards)
+
+ * support for OPL (dmfm) : There will be no demand... :-<
index 8f662659e7a5461dc4b986a3ec9d6a4a75802da6..7ce820a98945140c9e1122274230bffd36c373f5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 2
 SUBLEVEL = 16
-EXTRAVERSION = pre5
+EXTRAVERSION = pre6
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
 
index 332239262d1be0d0819d28be549c7885fde9ecaf..ed7135a307a6cfeb754044f0a3b3b0971601ef2b 100644 (file)
@@ -132,7 +132,7 @@ fi
 if [ "$CONFIG_ARCH_EBSA285" = "y" -o \
      "$CONFIG_ARCH_EBSA110" = "y" -o \
      "$CONFIG_ARCH_VNC" = "y" ]; then
-  string 'Initial kernel command string' CONFIG_CMDLINE
+  string 'Initial kernel command string' CONFIG_CMDLINE ""
 fi
 endmenu
 
index 026f71db4d89ff274d1cd9ff72bfee12d360ec0f..e5313252849e5077b1faf1ecf2a004d30a46e9b3 100644 (file)
  *
  *     Improved Intel cache detection.
  *     Dave Jones <dave@powertweak.com>, October 1999
+ *
+ *     Added proper Cascades CPU and L2 cache detection for Cascades
+ *     and 8-way type cache happy bunch from Intel:^)
+ *     Dragan Stancevic <visitor@valinux.com>, May 2000
  */
 
 /*
@@ -770,8 +774,8 @@ static struct cpu_model_info cpu_models[] __initdata = {
        { X86_VENDOR_INTEL,     6,
          { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", 
            NULL, "Pentium II (Deschutes)", "Mobile Pentium II", 
-           "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL, NULL, 
-           NULL, NULL, NULL, NULL, NULL }},
+           "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL,
+           "Pentium III (Cascades)", NULL, NULL, NULL, NULL, NULL }},
        { X86_VENDOR_AMD,       4,
          { NULL, NULL, NULL, "486 DX/2", NULL, NULL, NULL, "486 DX/2-WB",
            "486 DX/4", "486 DX/4-WB", NULL, NULL, NULL, NULL, "Am5x86-WT",
@@ -847,24 +851,26 @@ __initfunc(void identify_cpu(struct cpuinfo_x86 *c))
                                c->x86_cache_size = 0;
                                break;
 
-                       case 0x41:
+                       case 0x41: /* 4-way 128 */
                                c->x86_cache_size = 128;
                                break;
 
-                       case 0x42:
-                       case 0x82: /*Detect 256-Kbyte cache on Coppermine*/ 
+                       case 0x42: /* 4-way 256 */
+                       case 0x82: /* 8-way 256 */
                                c->x86_cache_size = 256;
                                break;
 
-                       case 0x43:
+                       case 0x43: /* 4-way 512 */
                                c->x86_cache_size = 512;
                                break;
 
-                       case 0x44:
+                       case 0x44: /* 4-way 1024 */
+                       case 0x84: /* 8-way 1024 */
                                c->x86_cache_size = 1024;
                                break;
 
-                       case 0x45:
+                       case 0x45: /* 4-way 2048 */
+                       case 0x85: /* 8-way 2048 */
                                c->x86_cache_size = 2048;
                                break;
 
index 97cf3a68d20094716a5a8804d1748f13cef23e94..8f24011b0abf6808475fcc516661de3ed01cc8ca 100644 (file)
@@ -96,7 +96,7 @@ bool 'Support for Motorola Hot Swap' CONFIG_MOTOROLA_HOTSWAP
 if [ "$CONFIG_PREP" = "y" -o "$CONFIG_ALL_PPC" = "y" ]; then
   bool 'PReP bootloader kernel arguments' CONFIG_CMDLINE_BOOL y
   if [ "$CONFIG_CMDLINE_BOOL" = "y" ] ; then
-    string 'Initial kernel command string' CONFIG_CMDLINE console=ttyS0,9600 console=tty0 root=/dev/sda2
+    string 'Initial kernel command string' CONFIG_CMDLINE "console=ttyS0,9600 console=tty0 root=/dev/sda2"
   fi
 fi
 
index 116d1c753c5d490ceb2571a6f55ec399e3fcf19a..5dd9dd1515b168d037bba32bd69543345fe3c224 100644 (file)
@@ -336,6 +336,7 @@ CONFIG_NLS=y
 #
 # Native Language Support
 #
+CONFIG_NLS_DEFAULT="cp437"
 # CONFIG_NLS_CODEPAGE_437 is not set
 # CONFIG_NLS_CODEPAGE_737 is not set
 # CONFIG_NLS_CODEPAGE_775 is not set
@@ -352,6 +353,10 @@ CONFIG_NLS=y
 # CONFIG_NLS_CODEPAGE_866 is not set
 # CONFIG_NLS_CODEPAGE_869 is not set
 # CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
 # CONFIG_NLS_ISO8859_1 is not set
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
index 13110a0e57e20ba9f160b8201aba73e64fc5a1cf..f56e8f60b1d69fcb751e0ca8ba1b1fbf1e35c57b 100644 (file)
@@ -1,8 +1,10 @@
-/* $Id: ioctl32.c,v 1.62.2.9 2000/01/15 04:40:57 davem Exp $
+/* $Id: ioctl32.c,v 1.62.2.12 2000/05/27 04:46:26 davem Exp $
  * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
  *
  * Copyright (C) 1997  Jakub Jelinek  (jj@sunsite.mff.cuni.cz)
  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
+ * Copyright (C) 2000  Vinh Truong (vinh.truong@eng.sun.com)
+ *              --- VT: add commands for envctrl driver in sys32_ioctl()
  *
  * These routines maintain argument size conversion between 32bit and 64bit
  * ioctls.
@@ -2168,8 +2170,16 @@ asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
        /* Little p (/dev/rtc, /dev/envctrl, etc.) */
        case RTCGET:
        case RTCSET:
-       case I2CIOCSADR:
-       case I2CIOCGADR:
+       case ENVCTRL_RD_WARNING_TEMPERATURE:
+       case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
+       case ENVCTRL_RD_CPU_TEMPERATURE:
+       case ENVCTRL_RD_FAN_STATUS:
+       case ENVCTRL_RD_VOLTAGE_STATUS:
+       case ENVCTRL_RD_SCSI_TEMPERATURE:
+       case ENVCTRL_RD_ETHERNET_TEMPERATURE:
+       case ENVCTRL_RD_MTHRBD_TEMPERATURE:
+       case ENVCTRL_RD_CPU_VOLTAGE:
+
 
        /* Little m */
        case MTIOCTOP:
@@ -2224,6 +2234,25 @@ asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
        case SG_EMULATED_HOST:
        case SG_SET_TRANSFORM:
        case SG_GET_TRANSFORM:
+       case SG_SET_RESERVED_SIZE:
+       case SG_GET_RESERVED_SIZE:
+       case SG_GET_SCSI_ID:
+       case SG_SET_FORCE_LOW_DMA:
+       case SG_GET_LOW_DMA:
+       case SG_SET_FORCE_PACK_ID:
+       case SG_GET_PACK_ID:
+       case SG_GET_NUM_WAITING:
+       case SG_SET_DEBUG:
+       case SG_GET_SG_TABLESIZE:
+       case SG_GET_MERGE_FD:
+       case SG_SET_MERGE_FD:
+       case SG_GET_COMMAND_Q:
+       case SG_SET_COMMAND_Q:
+       case SG_GET_UNDERRUN_FLAG:
+       case SG_SET_UNDERRUN_FLAG:
+       case SG_GET_VERSION_NUM:
+       case SG_NEXT_CMD_LEN:
+       case SG_SCSI_RESET:
 
        /* PPP stuff */
        case PPPIOCGFLAGS:
index 7d261302bc9a16b538027e9ca3c51236ad42063c..07bafd543c06bf948fed381e3fed24a33ddf8f0b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: psycho.c,v 1.85.2.5 1999/10/28 02:28:38 davem Exp $
+/* $Id: psycho.c,v 1.85.2.9 2000/05/01 06:33:49 davem Exp $
  * psycho.c: Ultra/AX U2P PCI controller support.
  *
  * Copyright (C) 1997 David S. Miller (davem@caipfs.rutgers.edu)
@@ -936,6 +936,28 @@ static void __init sabre_cookie_fillin(struct linux_psycho *sabre)
        }
 }
 
+/* Older versions of OBP on PCI systems encode 64-bit MEM
+ * space assignments incorrectly, this fixes them up.
+ */
+static void __init fixup_obp_assignments(struct linux_prom_pci_registers *aregs, int numa)
+{
+       int i;
+
+       for (i = 0; i < numa; i++) {
+               struct linux_prom_pci_registers *ap;
+               int space;
+
+               ap = &aregs[i];
+               space = ap->phys_hi >> 24;
+               if ((space & 0x3) == 2 &&
+                   (space & 0x4) != 0) {
+                       ap->phys_hi &= ~(0x7 << 24);
+                       ap->phys_hi |= 0x3 << 24;
+               }
+       }
+}
+
+
 /* Walk PROM device tree under PBM, looking for 'assigned-address'
  * properties, and recording them in pci_vma's linked in via
  * PBM->assignments.
@@ -990,6 +1012,8 @@ static void __init assignment_process(struct linux_pbm_info *pbm, int node)
                numa = (err / sizeof(struct linux_prom_pci_registers));
        }
 
+       fixup_obp_assignments(&aregs[0], numa);
+
        for(iter = 0; iter < numa; iter++) {
                struct linux_prom_pci_registers *ap = &aregs[iter];
                struct pci_vma *vp;
@@ -1158,15 +1182,6 @@ static void __init fixup_regs(struct pci_dev *pdev,
                                       pdev->bus->number, pdev->devfn,
                                       pdev->vendor, pdev->device);
                        continue;
-               } else if(bustype == 3) {
-                       /* XXX add support for this... */
-                       printk("%s %02x.%02x [%04x,%04x]: "
-                              "Warning, ignoring 64-bit PCI memory space, "
-                              "tell Eddie C. Dost (ecd@skynet.be).\n",
-                              __FUNCTION__,
-                              pdev->bus->number, pdev->devfn,
-                              pdev->vendor, pdev->device);
-                       continue;
                }
 
                bsreg = (pregs[preg].phys_hi & 0xff);
@@ -1242,6 +1257,14 @@ static void __init fixup_regs(struct pci_dev *pdev,
                        pdev->base_address[brindex] |= 1;
                        IO_seen = 1;
                } else {
+                       /* Preserve type bits. */
+                       if (bustype == 0x3) {
+                               /* 64-bit */
+                               pdev->base_address[brindex] |= 4;
+                       } else if (bustype == 0x2) {
+                               /* below 1M */
+                               pdev->base_address[brindex] |= 2;
+                       }
                        MEM_seen = 1;
                }
        }
@@ -1260,8 +1283,13 @@ static void __init fixup_regs(struct pci_dev *pdev,
                        ridx = ((breg - PCI_BASE_ADDRESS_0) >> 2);
                        base = (unsigned int)pdev->base_address[ridx];
 
-                       if(pdev->base_address[ridx] > PAGE_OFFSET)
+                       if(pdev->base_address[ridx] > PAGE_OFFSET) {
+                               if (((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) &&
+                                   ((base & PCI_BASE_ADDRESS_MEM_TYPE_MASK)
+                                    == PCI_BASE_ADDRESS_MEM_TYPE_64))
+                                       breg += 4;
                                continue;
+                       }
 
                        io = (base & PCI_BASE_ADDRESS_SPACE)==PCI_BASE_ADDRESS_SPACE_IO;
                        base &= ~((io ?
@@ -1653,9 +1681,11 @@ static int __init pbm_intmap_match(struct linux_pbm_info *pbm,
                return 0;
        }
        /*
-        * Underneath a bridge, use register of parent bridge.
+        * Underneath a bridge, use register of parent bridge
+        * closest to the PBM.
         */
        if (pdev->bus->number != pbm->pci_first_busno) {
+               struct pci_dev *pwalk;
                struct pcidev_cookie *pcp;
                int node, offset;
                char prom_name[64];
@@ -1663,7 +1693,13 @@ static int __init pbm_intmap_match(struct linux_pbm_info *pbm,
 #ifdef FIXUP_IRQ_DEBUG
                dprintf("UnderBridge, ");
 #endif
-               pcp = pdev->bus->self->sysdata;
+
+               pwalk = pdev->bus->self;
+               while (pwalk->bus &&
+                      pwalk->bus->number != pbm->pci_first_busno)
+                       pwalk = pwalk->bus->self;
+
+               pcp = pwalk->sysdata;
                if (!pcp) {
 #ifdef FIXUP_IRQ_DEBUG
                        dprintf("No bus PCP\n");
@@ -1874,6 +1910,8 @@ static void __init fixup_doit(struct pci_dev *pdev,
        else
                numaa = (err / sizeof(struct linux_prom_pci_registers));
 
+       fixup_obp_assignments(&assigned[0], numaa);
+
        /* First, scan and fixup base registers. */
        fixup_regs(pdev, pbm, pregs, nregs, &assigned[0], numaa);
 
index 8ef3cc45a96d2f247e57d67436858e05f320f063..9a5e5cec0b9ca98c6d5b2e358faf6d98586311a5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: sparc64_ksyms.c,v 1.58.2.3 1999/09/22 17:07:00 jj Exp $
+/* $Id: sparc64_ksyms.c,v 1.58.2.7 2000/05/27 04:46:26 davem Exp $
  * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support.
  *
  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -81,6 +81,7 @@ extern int svr4_setcontext(svr4_ucontext_t *uc, struct pt_regs *regs);
 extern int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
 extern int sys32_ioctl(unsigned int fd, unsigned int cmd, u32 arg);
 extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *);
+extern void VISenter(void);
                 
 extern void bcopy (const char *, char *, int);
 extern int __ashrdi3(int, int);
@@ -109,10 +110,10 @@ extern unsigned long phys_base;
  */
 
 #define EXPORT_SYMBOL_PRIVATE(sym)                             \
-extern int __sparc_priv_ ## sym (int) __asm__("__" ## #sym);   \
+extern int __sparc_priv_ ## sym (int) __asm__("__" #sym);      \
 const struct module_symbol __export_priv_##sym                 \
 __attribute__((section("__ksymtab"))) =                                \
-{ (unsigned long) &__sparc_priv_ ## sym, "__" ## #sym }
+{ (unsigned long) &__sparc_priv_ ## sym, "__" #sym }
 
 /* used by various drivers */
 #ifdef __SMP__
@@ -298,6 +299,9 @@ EXPORT_SYMBOL(sparc64_valid_addr_bitmap);
  * and will always be 'void __ret_efault(void)'.
  */
 EXPORT_SYMBOL_NOVERS(__ret_efault);
+/* VISenter is defined in assembly as well.
+ */
+EXPORT_SYMBOL_NOVERS(VISenter);
 
 /* No version information on these, as gcc produces such symbols. */
 EXPORT_SYMBOL_NOVERS(memcmp);
index f4599bbdbac0c06c12b0abb64ab658824df31b44..054315c2401ffca0dec6d5eb4317196118a7ad30 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: unaligned.c,v 1.15 1999/04/03 11:36:21 anton Exp $
+/* $Id: unaligned.c,v 1.15.2.2 2000/04/03 23:22:37 davem Exp $
  * unaligned.c: Unaligned load/store trap handling with special
  *              cases for the kernel to do them more quickly.
  *
@@ -587,9 +587,19 @@ void handle_ld_nf(u32 insn, struct pt_regs *regs)
                                
        maybe_flush_windows(0, 0, rd, from_kernel);
        reg = fetch_reg_addr(rd, regs);
-       if ((insn & 0x780000) == 0x180000)
-               reg[1] = 0;
-       reg[0] = 0;
+       if (from_kernel || rd < 16) {
+               reg[0] = 0;
+               if ((insn & 0x780000) == 0x180000)
+                       reg[1] = 0;
+       } else if (current->tss.flags & SPARC_FLAG_32BIT) {
+               put_user(0, (int *)reg);
+               if ((insn & 0x780000) == 0x180000)
+                       put_user(0, ((int *)reg) + 1);
+       } else {
+               put_user(0, reg);
+               if ((insn & 0x780000) == 0x180000)
+                       put_user(0, reg + 1);
+       }
        advance(regs);
 }
 
index 9fa1421373b46deb78807d0ce152a9a55f798745..655a7161cd4abd6d26d8971aace1620970a2336c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: ultra.S,v 1.32.2.3 2000/03/03 23:50:46 davem Exp $
+/* $Id: ultra.S,v 1.32.2.4 2000/05/05 18:50:48 davem Exp $
  * ultra.S: Don't expand these all over the place...
  *
  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -37,7 +37,7 @@ __flush_tlb_range: /* %o0=(ctx&0x3ff), %o1=start&PAGE_MASK, %o2=SECONDARY_CONTEX
                    */
 #define TLB_MAGIC      207 /* Students, do you know how I calculated this?  -DaveM */
 /*IC3*/        cmp             %o5, %o4
-       be,pt           %xcc, __flush_tlb_page
+       bleu,pt         %xcc, __flush_tlb_page
         srlx           %o5, 13, %g5
        cmp             %g5, TLB_MAGIC
        bgeu,pn         %icc, __flush_tlb_range_constant_time
index 58ea3207097a16f9a37cb1eb1f60adefe0f5c511..821b72f3e88aa0492b6d159d5314ab7908a541d0 100644 (file)
     - Tell it that 3c905C has NWAY
     - Fix handling of SetStatusEnd in 'Too much work..' code, as
       per 2.3.99's 3c575_cb (Dave Hinds).  Added vp->deferred for this.
+
+    24May00 <2.2.16-pre4> andrewm
+    - Replace union wn3_config with BFINS/BFEXT manipulation for
+      sparc64 (Pete Zaitcev, Peter Jones)
+    - Use insl_ns/outsl_ns for __powerpc__ (Andreas Tobler)
+    - In vortex_error, do_tx_reset and vortex_tx_timeout(Vortex): clear
+      tbusy and force a BH rerun to better recover from errors.
+
     - See http://www.uow.edu.au/~andrewm/linux/#3c59x-2.2 for more details.
 */
 
 static char *version =
-"3c59x.c:v0.99H 19May00 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n";
+"3c59x.c:v0.99H 27May00 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n";
 
 /* "Knobs" that adjust features and parameters. */
 /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
@@ -401,15 +409,21 @@ enum Window2 {                    /* Window 2. */
 enum Window3 {                 /* Window 3: MAC/config bits. */
        Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
 };
-union wn3_config {
-       int i;
-       struct w3_config_fields {
-               unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
-               int pad8:8;
-               unsigned int ram_split:2, pad18:2, xcvr:4, autoselect:1;
-               int pad24:7;
-       } u;
-};
+
+#define BFEXT(value, offset, bitcount)  \
+    ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1))
+
+#define BFINS(lhs, rhs, offset, bitcount)                      \
+    (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) |      \
+        (((rhs) & ((1 << (bitcount)) - 1)) << (offset)))
+
+#define RAM_SIZE(v)            BFEXT(v, 0, 3)
+#define RAM_WIDTH(v)   BFEXT(v, 3, 1)
+#define RAM_SPEED(v)   BFEXT(v, 4, 2)
+#define ROM_SIZE(v)            BFEXT(v, 6, 2)
+#define RAM_SPLIT(v)   BFEXT(v, 16, 2)
+#define XCVR(v)                        BFEXT(v, 20, 4)
+#define AUTOSELECT(v)  BFEXT(v, 24, 1)
 
 enum Window4 {         /* Window 4: Xcvr/media bits. */
        Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,
@@ -946,24 +960,24 @@ static struct device *vortex_probe1(int pci_bus, int pci_devfn,
 
        {
                char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
-               union wn3_config config;
+               unsigned int config;
                EL3WINDOW(3);
                vp->available_media = inw(ioaddr + Wn3_Options);
                if ((vp->available_media & 0xff) == 0)          /* Broken 3c916 */
                        vp->available_media = 0x40;
-               config.i = inl(ioaddr + Wn3_Config);
+               config = inl(ioaddr + Wn3_Config);
                if (vortex_debug > 1)
                        printk(KERN_DEBUG "  Internal config register is %4.4x, "
-                                  "transceivers %#x.\n", config.i, inw(ioaddr + Wn3_Options));
+                                  "transceivers %#x.\n", config, inw(ioaddr + Wn3_Options));
                printk(KERN_INFO "  %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
-                          8 << config.u.ram_size,
-                          config.u.ram_width ? "word" : "byte",
-                          ram_split[config.u.ram_split],
-                          config.u.autoselect ? "autoselect/" : "",
-                          config.u.xcvr > XCVR_ExtMII ? "<invalid transceiver>" :
-                          media_tbl[config.u.xcvr].name);
-               vp->default_media = config.u.xcvr;
-               vp->autoselect = config.u.autoselect;
+                          8 << RAM_SIZE(config),
+                          RAM_WIDTH(config) ? "word" : "byte",
+                          ram_split[RAM_SPLIT(config)],
+                          AUTOSELECT(config) ? "autoselect/" : "",
+                          XCVR(config) > XCVR_ExtMII ? "<invalid transceiver>" :
+                          media_tbl[XCVR(config)].name);
+               vp->default_media = XCVR(config);
+               vp->autoselect = AUTOSELECT(config);
        }
 
        if (vp->media_override != 7) {
@@ -1031,12 +1045,12 @@ vortex_open(struct device *dev)
 {
        long ioaddr = dev->base_addr;
        struct vortex_private *vp = (struct vortex_private *)dev->priv;
-       union wn3_config config;
+       unsigned int config;
        int i;
 
        /* Before initializing select the active media port. */
        EL3WINDOW(3);
-       config.i = inl(ioaddr + Wn3_Config);
+       config = inl(ioaddr + Wn3_Config);
 
        if (vp->media_override != 7) {
                if (vortex_debug > 1)
@@ -1065,8 +1079,8 @@ vortex_open(struct device *dev)
                           dev->name, media_tbl[dev->if_port].name);
 
        vp->full_duplex = vp->force_fd;
-       config.u.xcvr = dev->if_port;
-       outl(config.i, ioaddr + Wn3_Config);
+       config = BFINS(config, dev->if_port, 20, 4);
+       outl(config, ioaddr + Wn3_Config);
 
        if (dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
                int mii_reg1, mii_reg5;
@@ -1092,7 +1106,7 @@ vortex_open(struct device *dev)
 
        if (vortex_debug > 1) {
                printk(KERN_DEBUG "%s: vortex_open() InternalConfig %8.8x.\n",
-                       dev->name, config.i);
+                       dev->name, config);
        }
 
        outw(TxReset, ioaddr + EL3_CMD);
@@ -1286,7 +1300,7 @@ static void vortex_timer(unsigned long data)
                ok = 1;
        }
        if ( ! ok) {
-               union wn3_config config;
+               unsigned int config;
 
                do {
                        dev->if_port = media_tbl[dev->if_port].next;
@@ -1308,9 +1322,9 @@ static void vortex_timer(unsigned long data)
                         media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media);
 
                EL3WINDOW(3);
-               config.i = inl(ioaddr + Wn3_Config);
-               config.u.xcvr = dev->if_port;
-               outl(config.i, ioaddr + Wn3_Config);
+               config = inl(ioaddr + Wn3_Config);
+               config = BFINS(config, dev->if_port, 20, 4);
+               outl(config, ioaddr + Wn3_Config);
 
                outw(dev->if_port == XCVR_10base2 ? StartCoax : StopCoax,
                         ioaddr + EL3_CMD);
@@ -1396,9 +1410,9 @@ static void vortex_tx_timeout(struct device *dev)
                outw(DownUnstall, ioaddr + EL3_CMD);
        } else {
                vp->stats.tx_dropped++;
-               clear_bit(0, (void *)&dev->tbusy);
+               clear_bit(0, (void*)&dev->tbusy);
        }
-       
+
        /* Issue Tx Enable */
        outw(TxEnable, ioaddr + EL3_CMD);
        dev->trans_start = jiffies;
@@ -1495,6 +1509,9 @@ vortex_error(struct device *dev, int status)
                        if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
                                break;
                outw(TxEnable, ioaddr + EL3_CMD);
+               clear_bit(0, (void*)&dev->tbusy);
+               if (!vp->full_bus_master_tx)
+                       mark_bh(NET_BH);
        }
 
 }
@@ -1523,7 +1540,11 @@ vortex_start_xmit(struct sk_buff *skb, struct device *dev)
                /* dev->tbusy will be cleared at the DMADone interrupt. */
        } else {
                /* ... and the packet rounded to a doubleword. */
+#ifdef __powerpc__
+               outsl_ns(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
+#else
                outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
+#endif
                DEV_FREE_SKB(skb);
                if (inw(ioaddr + TxFree) > 1536) {
                        clear_bit(0, (void*)&dev->tbusy);
@@ -1787,8 +1808,13 @@ static int vortex_rx(struct device *dev)
                                        while (inw(ioaddr + Wn7_MasterStatus) & 0x8000)
                                                ;
                                } else {
+#ifdef __powerpc__
+                                       insl_ns(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
+                                                (pkt_len + 3) >> 2);
+#else
                                        insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
                                                 (pkt_len + 3) >> 2);
+#endif
                                }
                                outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
                                skb->protocol = eth_type_trans(skb, dev);
index 2281e57b667c538ac753f35be76cdba5d5d3b680..939f9ae0463270efeab700e1129133285f43bdfa 100644 (file)
  *            Merged into the kernel code 
  *
  *  3/10/00 - Enabled FDX and fixed bugs produced thereafter.
- *           Put in smp code 
+ *           Put in smp code
+ *
+ *  5/20/00 - Changes to handle Olympic on LinuxPPC. Endian changes.
+ *            The odd thing about the changes is that the fix for
+ *            endian issues with the big-endian data in the arb, asb...
+ *            was to always swab() the bytes, no matter what CPU.
+ *            That's because the read[wl]() functions always swap the
+ *            bytes on the way in on PPC.
+ *            Fixing the hardware descriptors was another matter,
+ *            because they weren't going through read[wl](), there all
+ *            the results had to be in memory in le32 values. kdaaker
+ *
  *  To Do:
  *
  *  If Problems do Occur
@@ -164,7 +175,15 @@ __initfunc(static int olympic_scan(struct device *dev))
        if (pci_present()) {
 
                while((pci_device=pci_find_device(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, pci_device))) {
-
+                       u16 pci_command;
+
+                       /* PCI Spec 2.1 states that it is either the driver or PCI card's
+                        * responsibility to set the PCI Master Enable Bit if needed.
+                        * (From Mark Stockton <marks@schooner.sys.hou.compaq.com>)
+                        */
+                       pci_read_config_word(pci_device, PCI_COMMAND, &pci_command);
+                       pci_command |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY;
+                       pci_write_config_word(pci_device, PCI_COMMAND, pci_command);
                        pci_set_master(pci_device);
 
                        /* Check to see if io has been allocated, if so, we've already done this card,
@@ -314,14 +333,14 @@ __initfunc(static int olympic_init(struct device *dev))
                return -1;
        }
 
-       uaa_addr=ntohs(readw(init_srb+8));
+       uaa_addr=swab16(readw(init_srb+8));
 
 #if OLYMPIC_DEBUG
        printk("UAA resides at %x\n",uaa_addr);
 #endif
 
-       writel(uaa_addr,olympic_mmio+LAPA);
-       adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800));
+       writel(uaa_addr, olympic_mmio+LAPA);
+       adapter_addr = olympic_priv->olympic_lap + (uaa_addr & (~0xf800));
 
 #if OLYMPIC_DEBUG
        printk("adapter address: %02x:%02x:%02x:%02x:%02x:%02x\n",
@@ -331,8 +350,8 @@ __initfunc(static int olympic_init(struct device *dev))
 
        memcpy_fromio(&dev->dev_addr[0], adapter_addr,6);
 
-       olympic_priv->olympic_addr_table_addr = ntohs(readw(init_srb + 12)) 
-       olympic_priv->olympic_parms_addr      = ntohs(readw(init_srb + 14)) 
+       olympic_priv->olympic_addr_table_addr = swab16(readw(init_srb + 12))
+       olympic_priv->olympic_parms_addr = swab16(readw(init_srb + 14))
 
        return 0;
 
@@ -394,9 +413,9 @@ static int olympic_open(struct device *dev)
                /* If Network Monitor, instruct card to copy MAC frames through the ARB */
 
 #if OLYMPIC_NETWORK_MONITOR
-               writew(ntohs(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON),init_srb+8);
+               writew(swab16(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON), init_srb+8);
 #else
-               writew(ntohs(OPEN_ADAPTER_ENABLE_FDX),init_srb+8);
+               writew(swab16(OPEN_ADAPTER_ENABLE_FDX), init_srb+8);
 #endif         
 
                if (olympic_priv->olympic_laa[0]) {
@@ -430,7 +449,7 @@ static int olympic_open(struct device *dev)
 #if OLYMPIC_DEBUG
                printk("init_srb(%p): ",init_srb);
                for(i=0;i<20;i++)
-                       printk("%x ",readb(init_srb+i));
+                       printk("%02x ",readb(init_srb+i));
                printk("\n");
 #endif
                
@@ -489,10 +508,10 @@ static int olympic_open(struct device *dev)
        if (olympic_priv->olympic_message_level) 
                printk(KERN_INFO "%s: Opened in %d Mbps mode\n",dev->name, olympic_priv->olympic_ring_speed);
 
-       olympic_priv->asb=ntohs(readw(init_srb+8));
-       olympic_priv->srb=ntohs(readw(init_srb+10));
-       olympic_priv->arb=ntohs(readw(init_srb+12));
-       olympic_priv->trb=ntohs(readw(init_srb+16));
+       olympic_priv->asb = swab16(readw(init_srb+8));
+       olympic_priv->srb = swab16(readw(init_srb+10));
+       olympic_priv->arb = swab16(readw(init_srb+12));
+       olympic_priv->trb = swab16(readw(init_srb+16));
 
        olympic_priv->olympic_receive_options = 0x01 ; 
        olympic_priv->olympic_copy_all_options = 0 ; 
@@ -513,8 +532,8 @@ static int olympic_open(struct device *dev)
 
                skb->dev = dev;
 
-               olympic_priv->olympic_rx_ring[i].buffer=virt_to_bus(skb->data);
-               olympic_priv->olympic_rx_ring[i].res_length = olympic_priv->pkt_buf_sz 
+               olympic_priv->olympic_rx_ring[i].buffer = cpu_to_le32(virt_to_bus(skb->data));
+               olympic_priv->olympic_rx_ring[i].res_length = cpu_to_le32(olympic_priv->pkt_buf_sz)
                olympic_priv->rx_ring_skb[i]=skb;
        }
 
@@ -524,17 +543,17 @@ static int olympic_open(struct device *dev)
                return -EIO;
        }
 
-       writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXDESCQ);
-       writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]),olympic_mmio+RXCDA);
-       writew(i,olympic_mmio+RXDESCQCNT);
+       writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]), olympic_mmio+RXDESCQ);
+       writel(virt_to_bus(&olympic_priv->olympic_rx_ring[0]), olympic_mmio+RXCDA);
+       writew(i, olympic_mmio+RXDESCQCNT);
                
-       writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXSTATQ);
-       writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]),olympic_mmio+RXCSA);
+       writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]), olympic_mmio+RXSTATQ);
+       writel(virt_to_bus(&olympic_priv->olympic_rx_status_ring[0]), olympic_mmio+RXCSA);
        
-       olympic_priv->rx_ring_last_received=OLYMPIC_RX_RING_SIZE-1;     /* last processed rx status */
-       olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE-1;  
+       olympic_priv->rx_ring_last_received = OLYMPIC_RX_RING_SIZE - 1; /* last processed rx status */
+       olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE - 1;  
 
-       writew(i,olympic_mmio+RXSTATQCNT);
+       writew(i, olympic_mmio+RXSTATQCNT);
 
 #if OLYMPIC_DEBUG 
        printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
@@ -563,9 +582,9 @@ static int olympic_open(struct device *dev)
                olympic_priv->olympic_tx_ring[i].buffer=0xdeadbeef;
 
        olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE;
-       writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXDESCQ_1);
-       writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]),olympic_mmio+TXCDA_1);
-       writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXDESCQCNT_1);
+       writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]), olympic_mmio+TXDESCQ_1);
+       writel(virt_to_bus(&olympic_priv->olympic_tx_ring[0]), olympic_mmio+TXCDA_1);
+       writew(OLYMPIC_TX_RING_SIZE, olympic_mmio+TXDESCQCNT_1);
        
        writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXSTATQ_1);
        writel(virt_to_bus(&olympic_priv->olympic_tx_status_ring[0]),olympic_mmio+TXCSA_1);
@@ -642,34 +661,35 @@ static void olympic_rx(struct device *dev)
        rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ; 
  
        while (rx_status->status_buffercnt) { 
+                __u32 l_status_buffercnt;
 
                olympic_priv->rx_status_last_received++ ;
                olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1);
 #if OLYMPIC_DEBUG
                printk(" stat_ring addr: %x \n", &(olympic_priv->olympic_rx_status_ring[olympic_priv->rx_status_last_received]) ); 
-               printk("rx status: %x rx len: %x \n",rx_status->status_buffercnt,rx_status->fragmentcnt_framelen);      
+               printk("rx status: %x rx len: %x \n", le32_to_cpu(rx_status->status_buffercnt), le32_to_cpu(rx_status->fragmentcnt_framelen));
 #endif
-               length=rx_status->fragmentcnt_framelen & 0xffff;
-               buffer_cnt = rx_status->status_buffercnt & 0xffff 
+               length = le32_to_cpu(rx_status->fragmentcnt_framelen) & 0xffff;
+               buffer_cnt = le32_to_cpu(rx_status->status_buffercnt) & 0xffff
                i = buffer_cnt ; /* Need buffer_cnt later for rxenq update */ 
-               frag_len = rx_status->fragmentcnt_framelen >> 16 
+               frag_len = le32_to_cpu(rx_status->fragmentcnt_framelen) >> 16
 
 #if OLYMPIC_DEBUG 
-               printk("length: %x, frag_len: %x, buffer_cnt: %x\n",length,frag_len,buffer_cnt);
+               printk("length: %x, frag_len: %x, buffer_cnt: %x\n", length, frag_len, buffer_cnt);
 #endif
-
-               if(rx_status->status_buffercnt & 0xC0000000) {
-                       if (rx_status->status_buffercnt & 0x3B000000) {
+                l_status_buffercnt = le32_to_cpu(rx_status->status_buffercnt);
+               if(l_status_buffercnt & 0xC0000000) {
+                       if (l_status_buffercnt & 0x3B000000) {
                                if (olympic_priv->olympic_message_level) {
-                                       if (rx_status->status_buffercnt & (1<<29))  /* Rx Frame Truncated */
+                                       if (l_status_buffercnt & (1<<29))  /* Rx Frame Truncated */
                                                printk(KERN_WARNING "%s: Rx Frame Truncated \n",dev->name);
-                                       if (rx_status->status_buffercnt & (1<<28)) /*Rx receive overrun */
+                                       if (l_status_buffercnt & (1<<28)) /*Rx receive overrun */
                                                printk(KERN_WARNING "%s: Rx Frame Receive overrun \n",dev->name);
-                                       if (rx_status->status_buffercnt & (1<<27)) /* No receive buffers */
+                                       if (l_status_buffercnt & (1<<27)) /* No receive buffers */
                                                printk(KERN_WARNING "%s: No receive buffers \n",dev->name);
-                                       if (rx_status->status_buffercnt & (1<<25)) /* Receive frame error detect */
+                                       if (l_status_buffercnt & (1<<25)) /* Receive frame error detect */
                                                printk(KERN_WARNING "%s: Receive frame error detect \n",dev->name);
-                                       if (rx_status->status_buffercnt & (1<<24)) /* Received Error Detect */
+                                       if (l_status_buffercnt & (1<<24)) /* Received Error Detect */
                                                printk(KERN_WARNING "%s: Received Error Detect \n",dev->name);
                                } 
                                olympic_priv->rx_ring_last_received += i ; 
@@ -705,8 +725,8 @@ static void olympic_rx(struct device *dev)
                                                skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ; 
                                                skb_put(skb2,length);
                                                skb2->protocol = tr_type_trans(skb2,dev);
-                                               olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer=virt_to_bus(skb->data);
-                                               olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = olympic_priv->pkt_buf_sz 
+                                               olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer = cpu_to_le32(virt_to_bus(skb->data));
+                                               olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length = cpu_to_le32(olympic_priv->pkt_buf_sz)
                                                olympic_priv->rx_ring_skb[rx_ring_last_received] = skb ; 
                                                netif_rx(skb2) ; 
                                        } else {
@@ -715,8 +735,8 @@ static void olympic_rx(struct device *dev)
                                                        olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
                                                        rx_ring_last_received = olympic_priv->rx_ring_last_received ; 
                                                        rx_desc = &(olympic_priv->olympic_rx_ring[rx_ring_last_received]);
-                                                       cpy_length = (i == 1 ? frag_len : rx_desc->res_length); 
-                                                       memcpy(skb_put(skb, cpy_length), bus_to_virt(rx_desc->buffer), cpy_length) ; 
+                                                       cpy_length = (i == 1 ? frag_len : le32_to_cpu(rx_desc->res_length)); 
+                                                       memcpy(skb_put(skb, cpy_length), bus_to_virt(le32_to_cpu(rx_desc->buffer)), cpy_length) ; 
                                                } while (--i) ; 
                
                                                skb->protocol = tr_type_trans(skb,dev);
@@ -852,8 +872,8 @@ static int olympic_xmit(struct sk_buff *skb, struct device *dev)
        spin_lock_irqsave(&olympic_priv->olympic_lock, flags) ; 
 
        if(olympic_priv->free_tx_ring_entries) {
-               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer=virt_to_bus(skb->data);
-               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length=skb->len | (0x80000000);
+               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer = cpu_to_le32(virt_to_bus(skb->data));
+               olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length = cpu_to_le32(skb->len | (0x80000000));
                olympic_priv->tx_ring_skb[olympic_priv->tx_ring_free]=skb;
                olympic_priv->free_tx_ring_entries--;
 
@@ -1240,9 +1260,9 @@ static void olympic_arb_cmd(struct device *dev)
        if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */
 
                header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */  
-               frame_len = ntohs(readw(arb_block + 10)) ; 
+               frame_len = swab16(readw(arb_block + 10)) ; 
 
-               buff_off = ntohs(readw(arb_block + 6)) ;
+               buff_off = swab16(readw(arb_block + 6)) ;
                
                buf_ptr = olympic_priv->olympic_lap + buff_off ; 
 
@@ -1264,7 +1284,7 @@ static void olympic_arb_cmd(struct device *dev)
 
                do {
                        frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; 
-                       buffer_len = ntohs(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); 
+                       buffer_len = swab16(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); 
                        memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ;
                        next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next)); 
 
@@ -1301,12 +1321,12 @@ static void olympic_arb_cmd(struct device *dev)
 
                writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
                
-               olympic_priv->asb_queued = 2 
+               olympic_priv->asb_queued = 2; 
        
-               return ;        
+               return        
                
        } else if (readb(arb_block) == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */
-               lan_status = ntohs(readw(arb_block+6)) ;
+               lan_status = swab16(readw(arb_block+6)) ;
                fdx_prot_error = readb(arb_block+8) ; 
                
                /* Issue ARB Free */
@@ -1572,9 +1592,9 @@ static int sprintf_info(char *buffer, struct device *dev)
          readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+3),
          readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+4),
          readb(opt+offsetof(struct olympic_parameters_table, poll_addr)+5),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, att_code))));
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, att_code))));
 
        size += sprintf(buffer+size, "%6s: Source Address    : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
          dev->name) ; 
@@ -1587,20 +1607,20 @@ static int sprintf_info(char *buffer, struct device *dev)
          readb(opt+offsetof(struct olympic_parameters_table, source_addr)+3),
          readb(opt+offsetof(struct olympic_parameters_table, source_addr)+4),
          readb(opt+offsetof(struct olympic_parameters_table, source_addr)+5),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, major_vector))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, lan_status))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, local_ring))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, mon_error))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, frame_correl))));
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, major_vector))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, lan_status))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, local_ring))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, mon_error))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, frame_correl))));
 
        size += sprintf(buffer+size, "%6s: Beacon Details :  Tx  :  Rx  : NAUN Node Address : NAUN Node Phys : \n",
          dev->name) ; 
 
        size += sprintf(buffer+size, "%6s:                :  %02x  :  %02x  : %02x:%02x:%02x:%02x:%02x:%02x : %02x:%02x:%02x:%02x    : \n",
          dev->name,
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
-         ntohs(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
+         swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
          readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)),
          readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+1),
          readb(opt+offsetof(struct olympic_parameters_table, beacon_naun)+2),
index 1faa955397b9d80d6702fcaca2fb5d9185190653..6e5b136a88e17c1ba65fb9cbe0388837a5b8b165 100644 (file)
 
 /* Olympic data structures */
 
+/* xxxx These structures are all little endian in hardware. */
+
 struct olympic_tx_desc {
        __u32 buffer;
        __u32 status_length;
@@ -218,13 +220,15 @@ struct olympic_tx_status {
 
 struct olympic_rx_desc {
        __u32 buffer;
-       __u32 res_length 
+       __u32 res_length; 
 };
 
 struct olympic_rx_status {
        __u32 fragmentcnt_framelen;
        __u32 status_buffercnt;
 };
+/* xxxx END These structures are all little endian in hardware. */
+/* xxxx There may be more, but I'm pretty sure about these */
 
 struct mac_receive_buffer {
        __u16 next ; 
@@ -236,10 +240,10 @@ struct mac_receive_buffer {
 
 struct olympic_private {
        
-       __u16 srb;
-       __u16 trb;
-       __u16 arb;
-       __u16 asb;
+       __u16 srb;      /* be16 */
+       __u16 trb;      /* be16 */
+       __u16 arb;      /* be16 */
+       __u16 asb;      /* be16 */
 
        __u8 *olympic_mmio;
        __u8 *olympic_lap;
index 0082f762b222fec5cc646519376a36540a48c730..735751dde392478a6ea34ffcb608f21fb05ed244 100644 (file)
@@ -78,7 +78,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/mm.h>
-#include <linux/init.h>
 #include <net/checksum.h>
 #include <net/slhc_vj.h>
 #include <asm/unaligned.h>
@@ -752,12 +751,6 @@ void cleanup_module(void)
        return;
 }
 
-#else /* MODULE */
-
-__initfunc(void slhc_install(void))
-{
-}
-
 #endif /* MODULE */
 #else /* CONFIG_INET */
 
index e6da60429b71e93bcbc751f96cc6c3783a535576..588ec526719ed41b74a0158a42551ba25cf46641 100644 (file)
@@ -122,6 +122,7 @@ int register_sparcaudio_driver(struct sparcaudio_driver *drv, int duplex)
         init_waitqueue_head(&drv->output_write_wait);
         init_waitqueue_head(&drv->output_drain_wait);
         init_waitqueue_head(&drv->input_read_wait);
+        init_waitqueue_head(&drv->poll_wait);
 #endif
 
         drv->num_output_buffers = 8;
@@ -310,6 +311,7 @@ void sparcaudio_output_done(struct sparcaudio_driver * drv, int status)
   if ((status & 1) || ((drv->output_count + drv->playing_count) 
                        < drv->num_output_buffers)) {
     wake_up_interruptible(&drv->output_write_wait);
+    wake_up_interruptible(&drv->poll_wait);
   }
 
   /* If the output queue is empty, shut down the driver. */
@@ -323,6 +325,7 @@ void sparcaudio_output_done(struct sparcaudio_driver * drv, int status)
     /* Wake up any waiting writers or syncers and return. */
     wake_up_interruptible(&drv->output_write_wait);
     wake_up_interruptible(&drv->output_drain_wait);
+    wake_up_interruptible(&drv->poll_wait);
     return;
   }
 
@@ -344,6 +347,7 @@ void sparcaudio_input_done(struct sparcaudio_driver * drv, int status)
     drv->ops->start_input(drv, drv->input_buffers[drv->input_front],
                          drv->input_buffer_size);
     wake_up_interruptible(&drv->input_read_wait);
+    wake_up_interruptible(&drv->poll_wait);
     return;
   } 
 
@@ -379,6 +383,7 @@ void sparcaudio_input_done(struct sparcaudio_driver * drv, int status)
 
   /* Wake up any tasks that are waiting. */
   wake_up_interruptible(&drv->input_read_wait);
+  wake_up_interruptible(&drv->poll_wait);
 }
 
 
@@ -401,14 +406,14 @@ static int sparcaudio_select(struct inode * inode, struct file * file,
       dprintk(("read ready: c%d o%d\n", drv->input_count, drv->input_offset));
       return 1;
     }
-    select_wait(&drv->input_read_wait, wait);
+    select_wait(&drv->poll_wait, wait);
     break;
   case SEL_OUT:
     dprintk(("sel out: c%d o%d p%d\n", drv->output_count, drv->output_offset, drv->playing_count));
     if ((drv->output_count + drv->playing_count) < (drv->num_output_buffers)) {
       return 1;
     }
-    select_wait(&drv->output_write_wait, wait);
+    select_wait(&drv->poll_wait, wait);
     break;
   case SEL_EX:
     break;
@@ -424,8 +429,7 @@ static unsigned int sparcaudio_poll(struct file *file, poll_table * wait)
   struct sparcaudio_driver *drv = drivers[(MINOR(inode->i_rdev) >>
                                            SPARCAUDIO_DEVICE_SHIFT)];
 
-  poll_wait(file, &drv->input_read_wait, wait);
-  poll_wait(file, &drv->output_write_wait, wait);
+  poll_wait(file, &drv->poll_wait, wait);
   if (((!file->f_flags & O_NONBLOCK) && drv->input_count) ||
       (drv->input_size > drv->buffer_size)) {
     mask |= POLLIN | POLLRDNORM;
@@ -509,6 +513,7 @@ static ssize_t sparcaudio_read(struct file * file, char *buf,
      */
     if (drv->duplex == 2) {
       wake_up_interruptible(&drv->output_write_wait);
+      wake_up_interruptible(&drv->poll_wait);
     }
   }
 
@@ -1188,6 +1193,7 @@ static int sparcaudio_ioctl(struct inode * inode, struct file * file,
                sparcaudio_sync_output(drv);
                if (drv->output_active) {
                  wake_up_interruptible(&drv->output_write_wait);
+                 wake_up_interruptible(&drv->poll_wait);
                  drv->ops->stop_output(drv);
                }
                drv->output_offset = 0;
@@ -1204,6 +1210,7 @@ static int sparcaudio_ioctl(struct inode * inode, struct file * file,
                ((unsigned int)arg == FLUSHRW)) {
              if (drv->input_active && (file->f_mode & FMODE_READ)) {
                wake_up_interruptible(&drv->input_read_wait);
+               wake_up_interruptible(&drv->poll_wait);
                drv->ops->stop_input(drv);
                drv->input_active = 0;
                drv->input_front = 0;
@@ -1236,6 +1243,7 @@ static int sparcaudio_ioctl(struct inode * inode, struct file * file,
          case AUDIO_FLUSH:
            if (drv->output_active && (file->f_mode & FMODE_WRITE)) {
              wake_up_interruptible(&drv->output_write_wait);
+             wake_up_interruptible(&drv->poll_wait);
              drv->ops->stop_output(drv);
              drv->output_active = 0;
              drv->output_front = 0;
@@ -1248,6 +1256,7 @@ static int sparcaudio_ioctl(struct inode * inode, struct file * file,
            }
            if (drv->input_active && (file->f_mode & FMODE_READ)) {
              wake_up_interruptible(&drv->input_read_wait);
+             wake_up_interruptible(&drv->poll_wait);
              drv->ops->stop_input(drv);
              drv->input_active = 0;
              drv->input_front = 0;
index fbc93415db049ef90b1c6d3317e8fd8da55a87a7..4fc640297b004a7e96605de826aba138701402b7 100644 (file)
@@ -1,7 +1,17 @@
-/* $Id: envctrl.c,v 1.9 1998/11/06 07:38:20 ecd Exp $
+/* $Id: envctrl.c,v 1.9.2.1 2000/05/02 04:23:33 davem Exp $
  * envctrl.c: Temperature and Fan monitoring on Machines providing it.
  *
  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
+ * Copyright (C) 2000  Vinh Truong    (vinh.truong@eng.sun.com)
+ * VT - The implementation is to support Sun Microelectronics (SME) platform
+ *      environment monitoring.  SME platforms use pcf8584 as the i2c bus 
+ *      controller to access pcf8591 (8-bit A/D and D/A converter) and 
+ *      pcf8571 (256 x 8-bit static low-voltage RAM with I2C-bus interface).
+ *      At board level, it follows SME Firmware I2C Specification. Reference:
+ *     http://www-eu2.semiconductors.com/pip/PCF8584P
+ *     http://www-eu2.semiconductors.com/pip/PCF8574AP
+ *     http://www-eu2.semiconductors.com/pip/PCF8591P
+ * 
  */
 
 #include <linux/config.h>
@@ -12,6 +22,8 @@
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/miscdevice.h>
+#include <linux/mm.h>
+#include <linux/malloc.h>
 
 #include <asm/ebus.h>
 #include <asm/uaccess.h>
 
 #define ENVCTRL_MINOR  162
 
-
 #undef DEBUG_BUS_SCAN
 
-
 #define PCF8584_ADDRESS        0x55
 
 #define CONTROL_PIN    0x80
 #define CLK_8          0x18
 #define CLK_12         0x1c
 
+#define OBD_SEND_START 0xc5    /* value to generate I2c_bus START condition */
+#define OBD_SEND_STOP  0xc3    /* value to generate I2c_bus STOP condition */
 
-#define I2C_WRITE      0x00
-#define I2C_READ       0x01
+/* Monitor type of i2c child device.
+ * Firmware definitions.
+ */
+#define PCF8584_MAX_CHANNELS            8
+#define PCF8584_FANSTAT_TYPE            3  /* fan status monitor */
+#define PCF8584_VOLTAGE_TYPE            2  /* voltage monitor    */
+#define PCF8584_TEMP_TYPE              1  /* temperature monitor*/
 
-struct pcf8584_reg
-{
-       __volatile__ unsigned char data;
-       __volatile__ unsigned char csr;
-};
+/* Monitor type of i2c child device.
+ * Driver definitions.
+ */
+#define ENVCTRL_NOMON                  0
+#define ENVCTRL_CPUTEMP_MON            1    /* cpu temperature monitor */
+#define ENVCTRL_CPUVOLTAGE_MON         2    /* voltage monitor         */
+#define ENVCTRL_FANSTAT_MON            3    /* fan status monitor      */
+#define ENVCTRL_ETHERTEMP_MON          4    /* ethernet temperarture */
+                                            /* monitor                     */
+#define ENVCTRL_VOLTAGESTAT_MON                5    /* voltage status monitor  */
+#define ENVCTRL_MTHRBDTEMP_MON         6    /* motherboard temperature */
+#define ENVCTRL_SCSITEMP_MON           7    /* scsi temperarture */
+
+/* Child device type.
+ * Driver definitions.
+ */
+#define I2C_ADC                                0    /* pcf8591 */
+#define I2C_GPIO                       1    /* pcf8571 */
 
-static struct pcf8584_reg *i2c;
+/* Data read from child device may need to decode
+ * through a data table and a scale.
+ * Translation type as defined by firmware.
+ */
+#define ENVCTRL_TRANSLATE_NO           0
+#define ENVCTRL_TRANSLATE_PARTIAL      1
+#define ENVCTRL_TRANSLATE_COMBINED     2
+#define ENVCTRL_TRANSLATE_FULL         3     /* table[data] */
+#define ENVCTRL_TRANSLATE_SCALE                4     /* table[data]/scale */
+
+/* Driver miscellaneous definitions. */
+#define ENVCTRL_MAX_CPU                        4
+#define CHANNEL_DESC_SZ                        256
+
+struct pcf8584_reg {
+        unsigned char data;
+        unsigned char csr;
+};
 
+/* Each child device can be monitored by up to PCF8584_MAX_CHANNELS.
+ * Property of a port or channel as defined by the firmware.
+ */
+struct pcf8584_channel {
+        unsigned char chnl_no;
+        unsigned char io_direction;
+        unsigned char type;
+        unsigned char last;
+};
 
-#ifdef DEBUG_BUS_SCAN
-struct i2c_addr_map {
-       unsigned char addr;
-       unsigned char mask;
-       char *name;
+/* Each child device may have one or more tables of bytes to help decode
+ * data. Table property as defined by the firmware.
+ */ 
+struct pcf8584_tblprop {
+        unsigned int type;
+        unsigned int scale;  
+        unsigned int offset; /* offset from the beginning of the table */
+        unsigned int size;
 };
 
-static struct i2c_addr_map devmap[] = {
-       { 0x38, 0x78, "PCF8574A" },
-       { 0x20, 0x78, "TDA8444" },
-       { 0x48, 0x78, "PCF8591" },
+/* i2c child */
+struct i2c_child_t {
+       /* Either ADC or GPIO. */
+       unsigned char i2ctype;
+        unsigned long addr;    
+        struct pcf8584_channel chnl_array[PCF8584_MAX_CHANNELS];
+
+       /* Channel info. */ 
+       unsigned int total_chnls;       /* Number of monitor channels. */
+       unsigned char fan_mask;         /* Byte mask for fan status channels. */
+       unsigned char voltage_mask;     /* Byte mask for voltage status channels. */
+        struct pcf8584_tblprop tblprop_array[PCF8584_MAX_CHANNELS];
+
+       /* Properties of all monitor channels. */
+       unsigned int total_tbls;        /* Number of monitor tables. */
+        char *tables;                  /* Pointer to table(s). */
+       char chnls_desc[CHANNEL_DESC_SZ]; /* Channel description. */
+       char mon_type[PCF8584_MAX_CHANNELS];
 };
-#define NR_DEVMAP (sizeof(devmap) / sizeof(devmap[0]))
-#endif
 
-static __inline__ int
-PUT_DATA(__volatile__ unsigned char *data, char *buffer, int user)
+static struct pcf8584_reg *i2c = NULL;
+static struct i2c_child_t i2c_childlist[ENVCTRL_MAX_CPU*2];
+static unsigned char chnls_mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
+static unsigned int warning_temperature = 0;
+static unsigned int shutdown_temperature = 0;
+static char read_cpu;
+
+/* Forward declarations. */
+static struct i2c_child_t *envctrl_get_i2c_child(unsigned char);
+
+/* Function description: Read a byte from an i2c controller register.
+ * Return: A byte from the passed in address.
+ */
+static inline unsigned char envctrl_readb(unsigned char *p)
 {
-       if (user) {
-               if (put_user(*data, buffer))
-                       return -EFAULT;
-       } else {
-               *buffer = *data;
-       }
-       return 0;
+       unsigned char result;
+
+       __asm__ __volatile__("lduba [%1] %2, %0"
+                            : "=r" (result)
+                            : "r" (p), "i" (ASI_PHYS_BYPASS_EC_E));
+       return result;
 }
 
-static __inline__ int
-GET_DATA(__volatile__ unsigned char *data, const char *buffer, int user)
+/* Function description: Write a byte to an i2c controller register.
+ * Return: Nothing.
+ */
+static inline void envctrl_writeb(unsigned char val, unsigned char *p)
 {
-       if (user) {
-               if (get_user(*data, buffer))
-                       return -EFAULT;
-       } else {
-               *data = *buffer;
-       }
-       return 0;
+       __asm__ __volatile__("stba %0, [%1] %2"
+                            : /* no outputs */
+                            : "r" (val), "r" (p), "i" (ASI_PHYS_BYPASS_EC_E));
 }
 
-static int
-i2c_read(unsigned char dev, char *buffer, int len, int user)
+/* Function Description: Test the PIN bit (Pending Interrupt Not) 
+ *                      to test when serial transmission is completed .
+ * Return : None.
+ */
+static void envtrl_i2c_test_pin(void)
 {
-       unsigned char dummy;
-       unsigned char stat;
-       int error = -ENODEV;
-       int count = 0;
-
-       i2c->data = (dev << 1) | I2C_READ;
+       int limit = 1000000;
 
-       while (!(i2c->csr & STATUS_BB))
+       while (--limit > 0) {
+               if(!(envctrl_readb(&i2c->csr) & STATUS_PIN)) 
+                       break;
                udelay(1);
+       } 
 
-       i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STA | CONTROL_ACK;
+       if (limit <= 0)
+               printk(KERN_INFO "envctrl: Pin status will not clear.\n");
+}
 
-       do {
+/* Function Description: Test busy bit.
+ * Return : None.
+ */
+static void envctrl_i2c_test_bb(void)
+{
+       int limit = 1000000;
+
+       while (--limit > 0) {
+               /* Busy bit 0 means busy. */
+               if (envctrl_readb(&i2c->csr) & STATUS_BB)
+                       break;
                udelay(1);
-               while ((stat = i2c->csr) & STATUS_PIN)
-                       udelay(1);
+       } 
 
-               if (stat & STATUS_LRB)
-                       goto stop;
+       if (limit <= 0)
+               printk(KERN_INFO "envctrl: Busy bit will not clear.\n");
+}
 
-               error = 0;
-               if (len == 0) {
-                       count--;
-                       break;
-               }
+/* Function Description: Send the adress for a read access.
+ * Return : 0 if not acknowledged, otherwise acknowledged.
+ */
+static int envctrl_i2c_read_addr(unsigned char addr)
+{
+       envctrl_i2c_test_bb();
 
-               if (count == (len - 1))
-                       break;
+       /* Load address. */
+       envctrl_writeb(addr + 1, &i2c->data);
 
-               if (count++ > 0) {
-                       error = PUT_DATA(&i2c->data, buffer++, user);
-                       if (error)
-                               break;
-               } else
-                       dummy = i2c->data;
-       } while (1);
-
-       i2c->csr = CONTROL_ES0;
-       if (!error && (count++ > 0))
-               error = PUT_DATA(&i2c->data, buffer++, user);
-       else
-               dummy = i2c->data;
-
-       udelay(1);
-       while ((stat = i2c->csr) & STATUS_PIN)
-               udelay(1);
+       envctrl_i2c_test_bb();
 
-stop:
-       i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STO | CONTROL_ACK;
-       if (!error && (count++ > 0))
-               error = PUT_DATA(&i2c->data, buffer++, user);
-       else
-               dummy = i2c->data;
+       envctrl_writeb(OBD_SEND_START, &i2c->csr);
 
-       if (error)
-               return error;
-       return count - 1;
+       /* Wait for PIN. */
+       envtrl_i2c_test_pin();
+
+       /* CSR 0 means acknowledged. */
+       if (!(envctrl_readb(&i2c->csr) & STATUS_LRB)) {
+               return envctrl_readb(&i2c->data);
+       } else {
+               envctrl_writeb(OBD_SEND_STOP, &i2c->csr);
+               return 0;
+       }
 }
 
-static int
-i2c_write(unsigned char dev, const char *buffer, int len, int user)
+/* Function Description: Send the adress for write mode.  
+ * Return : None.
+ */
+static void envctrl_i2c_write_addr(unsigned char addr)
 {
-       int error = -ENODEV;
-       int count = 0;
+       envctrl_i2c_test_bb();
+       envctrl_writeb(addr, &i2c->data);
 
-       while (!(i2c->csr & STATUS_BB))
-               udelay(1);
+       /* Generate Start condition. */
+       envctrl_writeb(OBD_SEND_START, &i2c->csr);
+}
 
-       i2c->data = (dev << 1) | I2C_WRITE;
-       i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STA | CONTROL_ACK;
+/* Function Description: Read 1 byte of data from addr 
+ *                      set by envctrl_i2c_read_addr() 
+ * Return : Data from address set by envctrl_i2c_read_addr().
+ */
+static unsigned char envctrl_i2c_read_data(void)
+{
+       envtrl_i2c_test_pin();
+       envctrl_writeb(CONTROL_ES0, &i2c->csr);  /* Send neg ack. */
+       return envctrl_readb(&i2c->data);
+}
 
-       do {
-               unsigned char stat;
+/* Function Description: Instruct the device which port to read data from.  
+ * Return : None.
+ */
+static void envctrl_i2c_write_data(unsigned char port)
+{
+       envtrl_i2c_test_pin();
+       envctrl_writeb(port, &i2c->data);
+}
 
-               udelay(1);
-               while ((stat = i2c->csr) & STATUS_PIN)
-                       udelay(1);
+/* Function Description: Generate Stop condition after last byte is sent.
+ * Return : None.
+ */
+static void envctrl_i2c_stop(void)
+{
+       envtrl_i2c_test_pin();
+       envctrl_writeb(OBD_SEND_STOP, &i2c->csr);
+}
 
-               if (stat & STATUS_LRB)
-                       break;
+/* Function Description: Read adc device.
+ * Return : Data at address and port.
+ */
+static unsigned char envctrl_i2c_read_8591(unsigned char addr, unsigned char port)
+{
+       /* Send address. */
+       envctrl_i2c_write_addr(addr);
 
-               error = count;
-               if (count == len)
-                       break;
+       /* Setup port to read. */
+       envctrl_i2c_write_data(port);
+       envctrl_i2c_stop();
 
-               error = GET_DATA(&i2c->data, buffer++, user);
-               if (error)
-                       break;
+       /* Read port. */
+       envctrl_i2c_read_addr(addr);
 
-               count++;
-       } while (1);
+       /* Do a single byte read and send stop. */
+       envctrl_i2c_read_data();
+       envctrl_i2c_stop();
 
-       i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_STO | CONTROL_ACK;
-       return error;
+       return envctrl_readb(&i2c->data);
 }
 
-__initfunc(static int i2c_scan_bus(void))
+/* Function Description: Read gpio device.
+ * Return : Data at address.
+ */
+static unsigned char envctrl_i2c_read_8574(unsigned char addr)
 {
-       unsigned char dev;
-       int count = 0;
-
-       for (dev = 1; dev < 128; dev++) {
-               if (i2c_read(dev, 0, 0, 0) == 0) {
-#ifdef DEBUG_BUS_SCAN
-                       int i;
-                       for (i = 0; i < NR_DEVMAP; i++)
-                               if ((dev & devmap[i].mask) == devmap[i].addr)
-                                       break;
-                       printk("envctrl: i2c device at %02x: %s\n", dev,
-                              i < NR_DEVMAP ? devmap[i].name : "unknown");
-#endif
-                       count++;
+       unsigned char rd;
+
+       envctrl_i2c_read_addr(addr);
+
+       /* Do a single byte read and send stop. */
+       rd = envctrl_i2c_read_data();
+       envctrl_i2c_stop();
+
+       return rd;
+}
+
+/* Function Description: Decode data read from an adc device using firmware
+ *                       table.
+ * Return: Number of read bytes. Data is stored in bufdata in ascii format.
+ */
+static int envctrl_i2c_data_translate(unsigned char data, int translate_type,
+                                     int scale, char *tbl, char *bufdata)
+{
+       int len = 0;
+
+       switch (translate_type) {
+       case ENVCTRL_TRANSLATE_NO:
+               /* No decode necessary. */
+               len = 1;
+               bufdata[0] = data;
+               break;
+
+       case ENVCTRL_TRANSLATE_FULL:
+               /* Decode this way: data = table[data]. */
+               len = 1;
+               bufdata[0] = tbl[data];
+               break;
+
+       case ENVCTRL_TRANSLATE_SCALE:
+               /* Decode this way: data = table[data]/scale */
+               sprintf(bufdata,"%d ", (tbl[data] * 10) / (scale));
+               len = strlen(bufdata);
+               bufdata[len - 1] = bufdata[len - 2];
+               bufdata[len - 2] = '.';
+               break;
+
+       default:
+               break;
+       };
+
+       return len;
+}
+
+/* Function Description: Read cpu-related data such as cpu temperature, voltage.
+ * Return: Number of read bytes. Data is stored in bufdata in ascii format.
+ */
+static int envctrl_read_cpu_info(struct i2c_child_t *pchild,
+                                char mon_type, unsigned char *bufdata)
+{
+       unsigned char data;
+       int i;
+       char *tbl, j = -1;
+
+       /* Find the right monitor type and channel. */
+       for (i = 0; i< PCF8584_MAX_CHANNELS; i++) {
+               if (pchild->mon_type[i] == mon_type) {
+                       if (++j == read_cpu) {
+                               break;
+                       }
                }
        }
-       if (!count) {
-               printk("%s: no devices found\n", __FUNCTION__);
-               return -ENODEV;
+
+       if (j != read_cpu)
+               return 0;
+
+        /* Read data from address and port. */
+       data = envctrl_i2c_read_8591((unsigned char)pchild->addr,
+                                    (unsigned char)pchild->chnl_array[i].chnl_no);
+
+       /* Find decoding table. */
+       tbl = pchild->tables + pchild->tblprop_array[i].offset;
+
+       return envctrl_i2c_data_translate(data, pchild->tblprop_array[i].type,
+                                         pchild->tblprop_array[i].scale,
+                                         tbl, bufdata);
+}
+
+/* Function Description: Read noncpu-related data such as motherboard 
+ *                       temperature.
+ * Return: Number of read bytes. Data is stored in bufdata in ascii format.
+ */
+static int envctrl_read_noncpu_info(struct i2c_child_t *pchild,
+                                   char mon_type, unsigned char *bufdata)
+{
+       unsigned char data;
+       int i;
+       char *tbl = NULL;
+
+       for (i = 0; i< PCF8584_MAX_CHANNELS; i++) {
+               if (pchild->mon_type[i] == mon_type) {
+                       break;
+               }
        }
-       return 0;
+
+       if (i >= PCF8584_MAX_CHANNELS)
+               return 0;
+
+        /* Read data from address and port. */
+       data = envctrl_i2c_read_8591((unsigned char)pchild->addr,
+                                    (unsigned char)pchild->chnl_array[i].chnl_no);
+
+       /* Find decoding table. */
+       tbl = pchild->tables + pchild->tblprop_array[i].offset;
+
+       return envctrl_i2c_data_translate(data, pchild->tblprop_array[i].type,
+                                         pchild->tblprop_array[i].scale,
+                                         tbl, bufdata);
 }
 
-static loff_t
-envctrl_llseek(struct file *file, loff_t offset, int type)
+/* Function Description: Read fan status.
+ * Return : Always 1 byte. Status stored in bufdata.
+ */
+static int envctrl_i2c_fan_status(struct i2c_child_t *pchild,
+                                 unsigned char data,
+                                 char *bufdata)
 {
-       return -ESPIPE;
+       unsigned char tmp, ret = 0;
+       int i, j = 0;
+
+       tmp = data & pchild->fan_mask;
+
+       if (tmp == pchild->fan_mask) {
+               /* All bits are on. All fans are functioning. */
+               ret = ENVCTRL_ALL_FANS_GOOD;
+       } else if (tmp == 0) {
+               /* No bits are on. No fans are functioning. */
+               ret = ENVCTRL_ALL_FANS_BAD;
+       } else {
+               /* Go through all channels, mark 'on' the matched bits.
+                * Notice that fan_mask may have discontiguous bits but
+                * return mask are always contiguous. For example if we
+                * monitor 4 fans at channels 0,1,2,4, the return mask
+                * should be 00010000 if only fan at channel 4 is working.
+                */
+               for (i = 0; i < PCF8584_MAX_CHANNELS;i++) {
+                       if (pchild->fan_mask & chnls_mask[i]) {
+                               if (!(chnls_mask[i] & tmp)) {
+                                       ret |= chnls_mask[j];
+                               }
+                               j++;
+                       }
+               }
+       }
+
+       bufdata[0] = ret;
+       return 1;
 }
 
-static ssize_t
-envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos)
+/* Function Description: Read voltage and power supply status.
+ * Return : Always 1 byte. Status stored in bufdata.
+ */
+static unsigned char envctrl_i2c_voltage_status(struct i2c_child_t *pchild,
+                                               unsigned char data,
+                                               char *bufdata)
 {
-       unsigned long addr = (unsigned long)file->private_data;
+       unsigned char tmp, ret = 0;
+       int i, j = 0;
+
+       tmp = data & pchild->voltage_mask;
+
+       /* Two channels are used to monitor voltage and power supply. */
+       if (tmp == pchild->voltage_mask) {
+               /* All bits are on. Voltage and power supply are okay. */
+               ret = ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD;
+       } else if (tmp == 0) {
+               /* All bits are off. Voltage and power supply are bad */
+               ret = ENVCTRL_VOLTAGE_POWERSUPPLY_BAD;
+       } else {
+               /* Either voltage or power supply has problem. */
+               for (i = 0; i < PCF8584_MAX_CHANNELS; i++) {
+                       if (pchild->voltage_mask & chnls_mask[i]) {
+                               j++;
+
+                               /* Break out when there is a mismatch. */
+                               if (!(chnls_mask[i] & tmp))
+                                       break; 
+                       }
+               }
+
+               /* Make a wish that hardware will always use the
+                * first channel for voltage and the second for
+                * power supply.
+                */
+               if (j == 1)
+                       ret = ENVCTRL_VOLTAGE_BAD;
+               else
+                       ret = ENVCTRL_POWERSUPPLY_BAD;
+       }
 
-       return i2c_read(addr, buf, count, 1);
+       bufdata[0] = ret;
+       return 1;
 }
 
+/* Function Description: Read a byte from /dev/envctrl. Mapped to user read().
+ * Return: Number of read bytes. 0 for error.
+ */
 static ssize_t
-envctrl_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
+envctrl_read(struct file *file, char *buf, size_t count, loff_t *ppos)
 {
-       unsigned long addr = (unsigned long)file->private_data;
-
-       return i2c_write(addr, buf, count, 1);
+       struct i2c_child_t *pchild;
+       unsigned char data[10];
+       int ret = 0;
+
+       /* Get the type of read as decided in ioctl() call.
+        * Find the appropriate i2c child.
+        * Get the data and put back to the user buffer.
+        */
+
+       switch ((int)(long)file->private_data) {
+       case ENVCTRL_RD_WARNING_TEMPERATURE:
+               if (warning_temperature == 0)
+                       return 0;
+
+               data[0] = (unsigned char)(warning_temperature);
+               ret = 1;
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
+               if (shutdown_temperature == 0)
+                       return 0;
+
+               data[0] = (unsigned char)(shutdown_temperature);
+               ret = 1;
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_MTHRBD_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_MTHRBDTEMP_MON)))
+                       return 0;
+               ret = envctrl_read_noncpu_info(pchild, ENVCTRL_MTHRBDTEMP_MON, data);
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_CPU_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUTEMP_MON)))
+                       return 0;
+               ret = envctrl_read_cpu_info(pchild, ENVCTRL_CPUTEMP_MON, data);
+
+               /* Reset cpu to the default cpu0. */
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_CPU_VOLTAGE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_CPUVOLTAGE_MON)))
+                       return 0;
+               ret = envctrl_read_cpu_info(pchild, ENVCTRL_CPUVOLTAGE_MON, data);
+
+               /* Reset cpu to the default cpu0. */
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_SCSI_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_SCSITEMP_MON)))
+                       return 0;
+               ret = envctrl_read_noncpu_info(pchild, ENVCTRL_SCSITEMP_MON, data);
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_ETHERNET_TEMPERATURE:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_ETHERTEMP_MON)))
+                       return 0;
+               ret = envctrl_read_noncpu_info(pchild, ENVCTRL_ETHERTEMP_MON, data);
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_FAN_STATUS:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_FANSTAT_MON)))
+                       return 0;
+               data[0] = envctrl_i2c_read_8574(pchild->addr);
+               ret = envctrl_i2c_fan_status(pchild,data[0], data);
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       case ENVCTRL_RD_VOLTAGE_STATUS:
+               if (!(pchild = envctrl_get_i2c_child(ENVCTRL_VOLTAGESTAT_MON)))
+                       return 0;
+               data[0] = envctrl_i2c_read_8574(pchild->addr);
+               ret = envctrl_i2c_voltage_status(pchild, data[0], data);
+               copy_to_user((unsigned char*)buf, data, ret);
+               break;
+
+       default:
+               break;
+
+       };
+
+       return ret;
 }
 
+/* Function Description: Command what to read.  Mapped to user ioctl().
+ * Return: Gives 0 for implemented commands, -EINVAL otherwise.
+ */
 static int
 envctrl_ioctl(struct inode *inode, struct file *file,
              unsigned int cmd, unsigned long arg)
 {
-       unsigned long data;
-       int addr;
+       char *infobuf;
 
        switch (cmd) {
-               case I2CIOCSADR:
-                       if (get_user(addr, (int *)arg))
-                               return -EFAULT;
-                       data = addr & 0x7f;
-                       file->private_data = (void *)data;
-                       break;
-               case I2CIOCGADR:
-                       addr = (unsigned long)file->private_data;
-                       if (put_user(addr, (int *)arg))
-                               return -EFAULT;
-                       break;
-               default:
-                       return -EINVAL;
-       }
+       case ENVCTRL_RD_WARNING_TEMPERATURE:
+       case ENVCTRL_RD_SHUTDOWN_TEMPERATURE:
+       case ENVCTRL_RD_MTHRBD_TEMPERATURE:
+       case ENVCTRL_RD_FAN_STATUS:
+       case ENVCTRL_RD_VOLTAGE_STATUS:
+       case ENVCTRL_RD_ETHERNET_TEMPERATURE:
+       case ENVCTRL_RD_SCSI_TEMPERATURE:
+               file->private_data = (void *)(long)cmd;
+               break;
+
+       case ENVCTRL_RD_CPU_TEMPERATURE:
+       case ENVCTRL_RD_CPU_VOLTAGE:
+               /* Check to see if application passes in any cpu number,
+                * the default is cpu0.
+                */
+               infobuf = (char *) arg;
+               if (infobuf == NULL) {
+                       read_cpu = 0;
+               }else {
+                       get_user(read_cpu, infobuf);
+               }
+
+               /* Save the command for use when reading. */
+               file->private_data = (void *)(long)cmd;
+               break;
+
+       default:
+               return -EINVAL;
+       };
+
        return 0;
 }
 
+/* Function Description: open device. Mapped to user open().
+ * Return: Always 0.
+ */
 static int
 envctrl_open(struct inode *inode, struct file *file)
 {
@@ -288,6 +668,9 @@ envctrl_open(struct inode *inode, struct file *file)
        return 0;
 }
 
+/* Function Description: Open device. Mapped to user close().
+ * Return: Always 0.
+ */
 static int
 envctrl_release(struct inode *inode, struct file *file)
 {
@@ -296,11 +679,11 @@ envctrl_release(struct inode *inode, struct file *file)
 }
 
 static struct file_operations envctrl_fops = {
-       envctrl_llseek,
+       NULL,
        envctrl_read,
-       envctrl_write,
+       NULL,
        NULL,           /* readdir */
-       NULL,           /* poll */      
+       NULL,           /* poll */
        envctrl_ioctl,
        NULL,           /* mmap */
        envctrl_open,
@@ -314,6 +697,189 @@ static struct miscdevice envctrl_dev = {
        &envctrl_fops
 };
 
+/* Function Description: Set monitor type based on firmware description.
+ * Return: None.
+ */
+static void envctrl_set_mon(struct i2c_child_t *pchild,
+                           char *chnl_desc,
+                           int chnl_no)
+{
+       /* Firmware only has temperature type.  It does not distinguish
+        * different kinds of temperatures.  We use channel description
+        * to disinguish them.
+        */
+       if (!(strcmp(chnl_desc,"temp,cpu")) ||
+           !(strcmp(chnl_desc,"temp,cpu0")) ||
+           !(strcmp(chnl_desc,"temp,cpu1")) ||
+           !(strcmp(chnl_desc,"temp,cpu2")) ||
+           !(strcmp(chnl_desc,"temp,cpu3")))
+               pchild->mon_type[chnl_no] = ENVCTRL_CPUTEMP_MON;
+
+       if (!(strcmp(chnl_desc,"vddcore,cpu0")) ||
+           !(strcmp(chnl_desc,"vddcore,cpu1")) ||
+           !(strcmp(chnl_desc,"vddcore,cpu2")) ||
+           !(strcmp(chnl_desc,"vddcore,cpu3")))
+               pchild->mon_type[chnl_no] = ENVCTRL_CPUVOLTAGE_MON;
+
+       if (!(strcmp(chnl_desc,"temp,motherboard")))
+               pchild->mon_type[chnl_no] = ENVCTRL_MTHRBDTEMP_MON;
+
+       if (!(strcmp(chnl_desc,"temp,scsi")))
+               pchild->mon_type[chnl_no] = ENVCTRL_SCSITEMP_MON;
+
+       if (!(strcmp(chnl_desc,"temp,ethernet")))
+               pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON;
+
+       if (!(strcmp(chnl_desc,"temp,ethernet")))
+               pchild->mon_type[chnl_no] = ENVCTRL_ETHERTEMP_MON;
+}
+
+/* Function Description: Initialize monitor channel with channel desc,
+ *                       decoding tables, monitor type, optional properties.
+ * Return: None.
+ */
+static void envctrl_init_adc(struct i2c_child_t *pchild, int node)
+{
+       char chnls_desc[CHANNEL_DESC_SZ];
+       int i, len, j = 0;
+       char *ptr;
+
+       /* Firmware describe channels into a stream separated by a '\0'.
+        * Replace all '\0' with a space.
+        */
+        len = prom_getproperty(node, "channels-description", chnls_desc,
+                              CHANNEL_DESC_SZ);
+        for (i = 0; i < len; i++) {
+                if (chnls_desc[i] == '\0')
+                        chnls_desc[i] = ' ';
+        }
+
+       ptr = strtok(chnls_desc, " ");
+       while (ptr != NULL) {
+               envctrl_set_mon(pchild, ptr, j);
+               ptr = strtok(NULL, " ");
+               j++;
+       }
+
+       /* Get optional properties. */
+        len = prom_getproperty(node, "warning-temp", (char *)&warning_temperature,
+                              sizeof(warning_temperature));
+        len = prom_getproperty(node, "shutdown-temp", (char *)&shutdown_temperature,
+                              sizeof(shutdown_temperature));
+}
+
+/* Function Description: Initialize child device monitoring fan status.
+ * Return: None.
+ */
+static void envctrl_init_fanstat(struct i2c_child_t *pchild)
+{
+       int i;
+
+       /* Go through all channels and set up the mask. */
+       for (i = 0; i < pchild->total_chnls; i++)
+               pchild->fan_mask |= chnls_mask[(pchild->chnl_array[i]).chnl_no];
+
+       /* We only need to know if this child has fan status monitored.
+        * We dont care which channels since we have the mask already.
+        */
+       pchild->mon_type[0] = ENVCTRL_FANSTAT_MON;
+}
+
+/* Initialize child device monitoring voltage status. */
+static void envctrl_init_voltage_status(struct i2c_child_t *pchild)
+{
+       int i;
+
+       /* Go through all channels and set up the mask. */
+       for (i = 0; i < pchild->total_chnls; i++)
+               pchild->voltage_mask |= chnls_mask[(pchild->chnl_array[i]).chnl_no];
+
+       /* We only need to know if this child has voltage status monitored.
+        * We dont care which channels since we have the mask already.
+        */
+       pchild->mon_type[0] = ENVCTRL_VOLTAGESTAT_MON;
+}
+
+/* Function Description: Initialize i2c child device.
+ * Return: None.
+ */
+static void envctrl_init_i2c_child(struct linux_ebus_child *edev_child,
+                                  struct i2c_child_t *pchild)
+{
+       int node, len, i, tbls_size = 0;
+
+       node = edev_child->prom_node;
+
+       /* Get device address. */
+       len = prom_getproperty(node, "reg", (char *)&(pchild->addr), sizeof(pchild->addr));
+
+       /* Get tables property.  Read firmware temperature tables. */
+       len = prom_getproperty(node, "translation", (char *)pchild->tblprop_array,
+                              PCF8584_MAX_CHANNELS*sizeof(struct pcf8584_tblprop));
+       if (len > 0) {
+                pchild->total_tbls = len / sizeof(struct pcf8584_tblprop);
+               for (i = 0; i < pchild->total_tbls; i++) {
+                       if ((pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset) > tbls_size) {
+                               tbls_size = pchild->tblprop_array[i].size + pchild->tblprop_array[i].offset;
+                       }
+               }
+
+                pchild->tables = kmalloc(tbls_size, GFP_KERNEL);
+                len = prom_getproperty(node, "tables", (char *)pchild->tables, tbls_size);
+                if (len <= 0) {
+                       printk("envctrl: Failed to get table.\n");
+                       return;
+               }
+       }
+
+       /* Get the monitor channels. */
+       len = prom_getproperty(node, "channels-in-use", (char *)pchild->chnl_array,
+                              PCF8584_MAX_CHANNELS*sizeof(struct pcf8584_channel));
+       pchild->total_chnls = len / sizeof(struct pcf8584_channel);
+
+       for (i = 0; i < pchild->total_chnls; i++) {
+               switch (pchild->chnl_array[i].type) {
+               case PCF8584_TEMP_TYPE:
+                       envctrl_init_adc(pchild, node);
+                       break;
+
+               case PCF8584_FANSTAT_TYPE:
+                       envctrl_init_fanstat(pchild);
+                       i = pchild->total_chnls;
+                       break;
+
+               case PCF8584_VOLTAGE_TYPE:
+                       if (pchild->i2ctype == I2C_ADC) {
+                               envctrl_init_adc(pchild,node);
+                       } else {
+                               envctrl_init_voltage_status(pchild);
+                       }
+                       i = pchild->total_chnls;
+                       break;
+
+               default:
+                       break;
+               };
+       }
+}
+
+/* Function Description: Search the child device list for a device.
+ * Return : The i2c child if found. NULL otherwise.
+ */
+static struct i2c_child_t *envctrl_get_i2c_child(unsigned char mon_type)
+{
+       int i, j;
+
+       for (i = 0; i < ENVCTRL_MAX_CPU*2; i++) {
+               for (j = 0; j < PCF8584_MAX_CHANNELS; j++) {
+                       if ( i2c_childlist[i].mon_type[j] == mon_type) {
+                               return (struct i2c_child_t*)(&(i2c_childlist[i]));
+                       }
+               }
+       }
+       return NULL;
+}
+
 #ifdef MODULE
 int init_module(void)
 #else
@@ -321,61 +887,77 @@ __initfunc(int envctrl_init(void))
 #endif
 {
 #ifdef CONFIG_PCI
-       struct linux_ebus *ebus;
-       struct linux_ebus_device *edev = 0;
-       int err;
-
+       struct linux_ebus *ebus = NULL;
+       struct linux_ebus_device *edev = NULL;
+       struct linux_ebus_child *edev_child = NULL;
+       int i = 0;
+
+       /* Traverse through ebus and ebus device list for i2c device and
+        * adc and gpio nodes.
+        */
        for_each_ebus(ebus) {
                for_each_ebusdev(edev, ebus) {
-                       if (!strcmp(edev->prom_name, "SUNW,envctrl"))
-                               goto ebus_done;
-                       if (!strcmp(edev->prom_name, "SUNW,rasctrl"))
-                               goto ebus_done;
+                       if (!strcmp(edev->prom_name, "i2c")) {
+                               /* In the 2.3.x version we can replace this with just
+                                * an "ioremap()" call, kill envctrl_{readb,writeb}() and
+                                * replace such calls with just a normal {readb,writeb}(). -DaveM
+                                */
+                               i2c = (struct pcf8584_reg *) __pa(edev->base_address[0]);
+                               for_each_edevchild(edev, edev_child) {
+                                       if (!strcmp("gpio", edev_child->prom_name)) {
+                                               i2c_childlist[i].i2ctype = I2C_GPIO;
+                                               envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++]));
+                                       }
+                                       if (!strcmp("adc", edev_child->prom_name)) {
+                                               i2c_childlist[i].i2ctype = I2C_ADC;
+                                               envctrl_init_i2c_child(edev_child, &(i2c_childlist[i++]));
+                                       }
+                               }
+                               goto done;
+                       }
                }
        }
-ebus_done:
-       if (!edev) {
-               printk("%s: ebus device not found\n", __FUNCTION__);
-               return -ENODEV;
-       }
 
-       if (check_region(edev->base_address[0], sizeof(*i2c))) {
-               printk("%s: Can't get region %lx, %d\n",
-                      __FUNCTION__, edev->base_address[0], (int)sizeof(*i2c));
+done:
+       if (!edev) {
+               printk("envctrl: I2C device not found.\n");
                return -ENODEV;
        }
 
-       i2c = (struct pcf8584_reg *)edev->base_address[0];
+       /* Set device address. */
+       envctrl_writeb(CONTROL_PIN, &i2c->csr);
+       envctrl_writeb(PCF8584_ADDRESS, &i2c->data);
 
-       request_region((unsigned long)i2c, sizeof(*i2c), "i2c");
+       /* Set system clock and SCL frequencies. */ 
+       envctrl_writeb(CONTROL_PIN | CONTROL_ES1, &i2c->csr);
+       envctrl_writeb(CLK_4_43 | BUS_CLK_90, &i2c->data);
 
-       i2c->csr = CONTROL_PIN;
-       i2c->data = PCF8584_ADDRESS;
-       i2c->csr = CONTROL_PIN | CONTROL_ES1;
-       i2c->data = CLK_4_43 | BUS_CLK_90;
-       i2c->csr = CONTROL_PIN | CONTROL_ES0 | CONTROL_ACK;
-       mdelay(10);
+       /* Enable serial interface. */
+       envctrl_writeb(CONTROL_PIN | CONTROL_ES0 | CONTROL_ACK, &i2c->csr);
+       udelay(200);
 
+       /* Register the device as a minor miscellaneous device. */
        if (misc_register(&envctrl_dev)) {
-               printk("%s: unable to get misc minor %d\n",
-                      __FUNCTION__, envctrl_dev.minor);
-               release_region((unsigned long)i2c, sizeof(*i2c));
+               printk("envctrl: Unable to get misc minor %d\n",
+                      envctrl_dev.minor);
        }
 
-       err = i2c_scan_bus();
-       if (err)
-               release_region((unsigned long)i2c, sizeof(*i2c));
-       return err;
+       return 0;
 #else
        return -ENODEV;
 #endif
 }
 
-
 #ifdef MODULE
 void cleanup_module(void)
 {
+       int i;
+
        misc_deregister(&envctrl_dev);
-       release_region((unsigned long)i2c, sizeof(*i2c));
+
+       for (i = 0; i < ENVCTRL_MAX_CPU * 2; i++) {
+               if (i2c_childlist[i].tables)
+                       kfree(i2c_childlist[i].tables);
+       }
 }
 #endif
index b4c0659b11d1db5afaf7a73a1dc4937ea01d83b5..c1b8131b82ee0352669688264cf8231bed589a38 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: sab82532.c,v 1.30.2.2 1999/10/12 14:11:20 davem Exp $
+/* $Id: sab82532.c,v 1.30.2.4 2000/05/27 04:46:34 davem Exp $
  * sab82532.c: ASYNC Driver for the SIEMENS SAB82532 DUSCC.
  *
  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
@@ -2146,7 +2146,7 @@ sab82532_kgdb_hook(int line))
 
 __initfunc(static inline void show_serial_version(void))
 {
-       char *revision = "$Revision: 1.30.2.2 $";
+       char *revision = "$Revision: 1.30.2.4 $";
        char *version, *p;
 
        version = strchr(revision, ' ');
index 319c6a50a396a35433548b08008da9e84292a848..7a19ea21401147c08e16c3e38a18d3e5e3df8cc7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: su.c,v 1.18.2.5 1999/10/14 08:44:35 davem Exp $
+/* $Id: su.c,v 1.18.2.7 2000/05/27 04:46:34 davem Exp $
  * su.c: Small serial driver for keyboard/mouse interface on sparc32/PCI
  *
  * Copyright (C) 1997  Eddie C. Dost  (ecd@skynet.be)
@@ -2226,7 +2226,7 @@ done:
  */
 __initfunc(static __inline__ void show_su_version(void))
 {
-       char *revision = "$Revision: 1.18.2.5 $";
+       char *revision = "$Revision: 1.18.2.7 $";
        char *version, *p;
 
        version = strchr(revision, ' ');
index b14e124f8af9b8e10b91f9ff76856963ea417e3a..a97d21f0a89eb988c1fb759511381005c887640a 100644 (file)
@@ -524,13 +524,14 @@ sun_mouse_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsig
                /* This is a buggy application doing termios on the mouse driver */
                /* we ignore it.  I keep this check here so that we will notice   */
                /* future mouse vuid ioctls */
-               break;
+               return -ENOTTY;
+
                
        default:
 #ifdef DEBUG
                printk ("[MOUSE-ioctl: %8.8x]\n", cmd);
 #endif
-               return -1;
+               return -EINVAL;
        }
        return 0;
 }
index 0e76085debddf5058fac0febba633e9b3401060a..e254b7c0b7201d8c6234896af8e1773dd8cb4887 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zs.c,v 1.41.2.5 2000/01/21 01:05:47 davem Exp $
+/* $Id: zs.c,v 1.41.2.6 2000/04/17 05:46:05 davem Exp $
  * zs.c: Zilog serial port driver for the Sparc.
  *
  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -1857,7 +1857,7 @@ int zs_open(struct tty_struct *tty, struct file * filp)
 
 static void show_serial_version(void)
 {
-       char *revision = "$Revision: 1.41.2.5 $";
+       char *revision = "$Revision: 1.41.2.6 $";
        char *version, *p;
 
        version = strchr(revision, ' ');
index c427810e9cb5f025b032cef6c9a41981987f7e50..fadf90d2ae1638f8bcf1edae9bc6c526293591d2 100644 (file)
@@ -4316,6 +4316,13 @@ static void esp_intr(int irq, void *dev_id, struct pt_regs *pregs)
 }
 #endif
 
+int esp_revoke(Scsi_Device* SDptr)
+{
+       struct Sparc_ESP *esp = (struct Sparc_ESP *) SDptr->host->hostdata;
+       esp->targets_present &= ~(1 << SDptr->id);
+       return 0;
+}
+
 #ifdef MODULE
 Scsi_Host_Template driver_template = SCSI_SPARC_ESP;
 
index 50a45a58337f3cfb9889c9e11a0fbba8a2f498c9..9d484bb11916c018f7fc8b0ae9884fc1189256ad 100644 (file)
@@ -413,6 +413,7 @@ extern int esp_abort(Scsi_Cmnd *);
 extern int esp_reset(Scsi_Cmnd *, unsigned int);
 extern int esp_proc_info(char *buffer, char **start, off_t offset, int length,
                         int hostno, int inout);
+extern int esp_revoke(Scsi_Device* SDptr);
 
 extern struct proc_dir_entry proc_scsi_esp;
 
@@ -421,6 +422,7 @@ extern struct proc_dir_entry proc_scsi_esp;
                proc_info:      &esp_proc_info,                 \
                name:           "Sun ESP 100/100a/200",         \
                detect:         esp_detect,                     \
+               revoke:         esp_revoke,                     \
                info:           esp_info,                       \
                command:        esp_command,                    \
                queuecommand:   esp_queue,                      \
index 4ffe8e136045634eda009587054c9c883b4bff37..799f00c3a4a80bb44554cd46e07879d27163f486 100644 (file)
@@ -96,6 +96,8 @@ typedef struct        SHT
      */
     int (* detect)(struct SHT *);
 
+    int (*revoke)(Scsi_Device *);
+
     /* Used with loadable modules to unload the host structures.  Note:
      * there is a default action built into the modules code which may
      * be sufficient for most host adapters.  Thus you may not have to supply
index fc01ed729a04d01ac17dd3d5a30c538d8e1ce15f..e25f282ef4a740a5479e7530f217bc702a28a5b7 100644 (file)
@@ -2500,6 +2500,8 @@ int scsi_proc_info(char *buffer, char **start, off_t offset, int length,
              * Nobody is using this device any more.
              * Free all of the command structures.
              */
+           if (HBA_ptr->hostt->revoke)
+                   HBA_ptr->hostt->revoke(scd);
             for(SCpnt=scd->device_queue; SCpnt; SCpnt = scd->device_queue)
             {
                 scd->device_queue = SCpnt->next;
index c1e43efec1a719afc0c58feca20fa9ed9fc986a8..530b44c6a2db67d0cd73895d7c08572cd2772ca1 100644 (file)
 #undef SCSI_NCR_IOMAPPED
 #endif
 
+/*
+ * Should we enable DAC cycles on this platform?
+ * Until further investigation we do not enable it
+ * anywhere at the moment.
+ */
+#undef SCSI_NCR_USE_64BIT_DAC
+
 /*
  * Sync transfer frequency at startup.
  * Allow from 5Mhz to 40Mhz default 20 Mhz.
diff --git a/drivers/sound/724hwmcode.h b/drivers/sound/724hwmcode.h
new file mode 100644 (file)
index 0000000..54e7033
--- /dev/null
@@ -0,0 +1,1575 @@
+//=============================================================================
+// Copyright (c) 1997-1999     Yamaha Corporation.     All Rights Reserved.
+//
+//     Title:
+//             hwmcode.c
+//     Desc:
+//             micro-code for CTRL & DSP
+//=============================================================================
+#ifndef _HWMCODE_
+#define _HWMCODE_
+
+static unsigned long int       DspInst[] = {
+       0x00000081, 0x000001a4, 0x0000000a, 0x0000002f,
+       0x00080253, 0x01800317, 0x0000407b, 0x0000843f,
+       0x0001483c, 0x0001943c, 0x0005d83c, 0x00001c3c,
+       0x0000c07b, 0x00050c3f, 0x0121503c, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000
+};
+
+static unsigned long int       CntrlInst[] = {
+       0x000007, 0x240007, 0x0C0007, 0x1C0007,
+       0x060007, 0x700002, 0x000020, 0x030040,
+       0x007104, 0x004286, 0x030040, 0x000F0D,
+       0x000810, 0x20043A, 0x000282, 0x00020D,
+       0x000810, 0x20043A, 0x001282, 0x200E82,
+       0x001A82, 0x032D0D, 0x000810, 0x10043A,
+       0x02D38D, 0x000810, 0x18043A, 0x00010D,
+       0x020015, 0x0000FD, 0x000020, 0x038860,
+       0x039060, 0x038060, 0x038040, 0x038040,
+       0x038040, 0x018040, 0x000A7D, 0x038040,
+       0x038040, 0x018040, 0x200402, 0x000882,
+       0x08001A, 0x000904, 0x015986, 0x000007,
+       0x260007, 0x000007, 0x000007, 0x018A06,
+       0x000007, 0x030C8D, 0x000810, 0x18043A,
+       0x260007, 0x00087D, 0x018042, 0x00160A,
+       0x04A206, 0x000007, 0x00218D, 0x000810,
+       0x08043A, 0x21C206, 0x000007, 0x0007FD,
+       0x018042, 0x08000A, 0x000904, 0x029386,
+       0x000195, 0x090D04, 0x000007, 0x000820,
+       0x0000F5, 0x000B7D, 0x01F060, 0x0000FD,
+       0x032206, 0x018040, 0x000A7D, 0x038042,
+       0x13804A, 0x18000A, 0x001820, 0x059060,
+       0x058860, 0x018040, 0x0000FD, 0x018042,
+       0x70000A, 0x000115, 0x071144, 0x032386,
+       0x030000, 0x007020, 0x034A06, 0x018040,
+       0x00348D, 0x000810, 0x08043A, 0x21EA06,
+       0x000007, 0x02D38D, 0x000810, 0x18043A,
+       0x018206, 0x000007, 0x240007, 0x000F8D,
+       0x000810, 0x00163A, 0x002402, 0x005C02,
+       0x0028FD, 0x000020, 0x018040, 0x08000D,
+       0x000815, 0x510984, 0x000007, 0x00004D,
+       0x000E5D, 0x000E02, 0x00418D, 0x000810,
+       0x08043A, 0x2C8A06, 0x000007, 0x00008D,
+       0x000924, 0x000F02, 0x00458D, 0x000810,
+       0x08043A, 0x2C8A06, 0x000007, 0x00387D,
+       0x018042, 0x08000A, 0x001015, 0x010984,
+       0x018386, 0x000007, 0x01AA06, 0x000007,
+       0x0008FD, 0x018042, 0x18000A, 0x001904,
+       0x218086, 0x280007, 0x001810, 0x28043A,
+       0x280C02, 0x00000D, 0x000810, 0x28143A,
+       0x08808D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00020D, 0x189904, 0x000007,
+       0x00402D, 0x0000BD, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x055A86, 0x000007,
+       0x000100, 0x000A20, 0x00047D, 0x018040,
+       0x018042, 0x20000A, 0x003015, 0x012144,
+       0x034986, 0x000007, 0x002104, 0x034986,
+       0x000007, 0x000F8D, 0x000810, 0x280C3A,
+       0x023944, 0x06C986, 0x000007, 0x001810,
+       0x28043A, 0x08810D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x002810, 0x78003A,
+       0x00688D, 0x000810, 0x08043A, 0x288A06,
+       0x000007, 0x00400D, 0x001015, 0x189904,
+       0x292904, 0x393904, 0x000007, 0x060206,
+       0x000007, 0x0004F5, 0x00007D, 0x000020,
+       0x00008D, 0x010860, 0x018040, 0x00047D,
+       0x038042, 0x21804A, 0x18000A, 0x021944,
+       0x215886, 0x000007, 0x004075, 0x71F104,
+       0x000007, 0x010042, 0x28000A, 0x002904,
+       0x212086, 0x000007, 0x003C0D, 0x30A904,
+       0x000007, 0x00077D, 0x018042, 0x08000A,
+       0x000904, 0x07DA86, 0x00057D, 0x002820,
+       0x03B060, 0x07F206, 0x018040, 0x003020,
+       0x03A860, 0x018040, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x07FA86, 0x000007,
+       0x00057D, 0x018042, 0x28040A, 0x000E8D,
+       0x000810, 0x280C3A, 0x00000D, 0x000810,
+       0x28143A, 0x09000D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x003DFD, 0x000020,
+       0x018040, 0x00107D, 0x008D8D, 0x000810,
+       0x08043A, 0x288A06, 0x000007, 0x000815,
+       0x08001A, 0x010984, 0x095186, 0x00137D,
+       0x200500, 0x280F20, 0x338F60, 0x3B8F60,
+       0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
+       0x038A60, 0x018040, 0x007FBD, 0x383DC4,
+       0x000007, 0x001A7D, 0x001375, 0x018042,
+       0x09004A, 0x10000A, 0x0B8D04, 0x139504,
+       0x000007, 0x000820, 0x019060, 0x001104,
+       0x212086, 0x010040, 0x0017FD, 0x018042,
+       0x08000A, 0x000904, 0x212286, 0x000007,
+       0x00197D, 0x038042, 0x09804A, 0x10000A,
+       0x000924, 0x001664, 0x0011FD, 0x038042,
+       0x2B804A, 0x19804A, 0x00008D, 0x218944,
+       0x000007, 0x002244, 0x0AE186, 0x000007,
+       0x001A64, 0x002A24, 0x00197D, 0x080102,
+       0x100122, 0x000820, 0x039060, 0x018040,
+       0x003DFD, 0x00008D, 0x000820, 0x018040,
+       0x001375, 0x001A7D, 0x010042, 0x09804A,
+       0x10000A, 0x00021D, 0x0189E4, 0x2992E4,
+       0x309144, 0x000007, 0x00060D, 0x000A15,
+       0x000C1D, 0x001025, 0x00A9E4, 0x012BE4,
+       0x000464, 0x01B3E4, 0x0232E4, 0x000464,
+       0x000464, 0x000464, 0x000464, 0x00040D,
+       0x08B1C4, 0x000007, 0x000820, 0x000BF5,
+       0x030040, 0x00197D, 0x038042, 0x09804A,
+       0x000A24, 0x08000A, 0x080E64, 0x000007,
+       0x100122, 0x000820, 0x031060, 0x010040,
+       0x0064AC, 0x00027D, 0x000020, 0x018040,
+       0x00107D, 0x018042, 0x0011FD, 0x3B804A,
+       0x09804A, 0x20000A, 0x000095, 0x1A1144,
+       0x00A144, 0x0D2086, 0x00040D, 0x00B984,
+       0x0D2186, 0x0018FD, 0x018042, 0x0010FD,
+       0x09804A, 0x28000A, 0x000095, 0x010924,
+       0x002A64, 0x0D1186, 0x000007, 0x002904,
+       0x0D2286, 0x000007, 0x0D2A06, 0x080002,
+       0x00008D, 0x00387D, 0x000820, 0x018040,
+       0x00127D, 0x018042, 0x10000A, 0x003904,
+       0x0DD186, 0x00080D, 0x7FFFB5, 0x00B984,
+       0x0DA186, 0x000025, 0x0E7A06, 0x00002D,
+       0x000015, 0x00082D, 0x02C78D, 0x000820,
+       0x0EC206, 0x00000D, 0x7F8035, 0x00B984,
+       0x0E7186, 0x400025, 0x00008D, 0x110944,
+       0x000007, 0x00018D, 0x109504, 0x000007,
+       0x009164, 0x000424, 0x000424, 0x000424,
+       0x100102, 0x280002, 0x02C68D, 0x000820,
+       0x0EC206, 0x00018D, 0x00042D, 0x00008D,
+       0x109504, 0x000007, 0x00020D, 0x109184,
+       0x000007, 0x02C70D, 0x000820, 0x00008D,
+       0x0038FD, 0x018040, 0x003BFD, 0x001020,
+       0x03A860, 0x000815, 0x313184, 0x212184,
+       0x000007, 0x03B060, 0x03A060, 0x018040,
+       0x0022FD, 0x000095, 0x010924, 0x000424,
+       0x000424, 0x001264, 0x100102, 0x000820,
+       0x039060, 0x018040, 0x001924, 0x00FB8D,
+       0x00397D, 0x000820, 0x058040, 0x038042,
+       0x09844A, 0x000606, 0x08040A, 0x000424,
+       0x000424, 0x00117D, 0x018042, 0x08000A,
+       0x000A24, 0x280502, 0x280C02, 0x09800D,
+       0x000820, 0x0002FD, 0x018040, 0x200007,
+       0x0022FD, 0x018042, 0x08000A, 0x000095,
+       0x280DC4, 0x011924, 0x00197D, 0x018042,
+       0x0011FD, 0x09804A, 0x10000A, 0x0000B5,
+       0x113144, 0x0A8D04, 0x000007, 0x080A44,
+       0x129504, 0x000007, 0x0023FD, 0x001020,
+       0x038040, 0x101244, 0x000007, 0x000820,
+       0x039060, 0x018040, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x10FA86, 0x000007,
+       0x003BFD, 0x000100, 0x000A10, 0x0B807A,
+       0x13804A, 0x090984, 0x000007, 0x000095,
+       0x013D04, 0x118086, 0x10000A, 0x100002,
+       0x090984, 0x000007, 0x038042, 0x11804A,
+       0x090D04, 0x000007, 0x10000A, 0x090D84,
+       0x000007, 0x00257D, 0x000820, 0x018040,
+       0x00010D, 0x000810, 0x28143A, 0x00127D,
+       0x018042, 0x20000A, 0x00197D, 0x018042,
+       0x00117D, 0x31804A, 0x10000A, 0x003124,
+       0x01280D, 0x00397D, 0x000820, 0x058040,
+       0x038042, 0x09844A, 0x000606, 0x08040A,
+       0x300102, 0x003124, 0x000424, 0x000424,
+       0x001224, 0x280502, 0x001A4C, 0x130186,
+       0x700002, 0x00002D, 0x030000, 0x00387D,
+       0x018042, 0x10000A, 0x132A06, 0x002124,
+       0x0000AD, 0x100002, 0x00010D, 0x000924,
+       0x006B24, 0x01368D, 0x00397D, 0x000820,
+       0x058040, 0x038042, 0x09844A, 0x000606,
+       0x08040A, 0x003264, 0x00008D, 0x000A24,
+       0x001020, 0x00227D, 0x018040, 0x013C0D,
+       0x000810, 0x08043A, 0x29D206, 0x000007,
+       0x002820, 0x00207D, 0x018040, 0x00117D,
+       0x038042, 0x13804A, 0x33800A, 0x00387D,
+       0x018042, 0x08000A, 0x000904, 0x163A86,
+       0x000007, 0x00008D, 0x030964, 0x01478D,
+       0x00397D, 0x000820, 0x058040, 0x038042,
+       0x09844A, 0x000606, 0x08040A, 0x380102,
+       0x000424, 0x000424, 0x001224, 0x0002FD,
+       0x018042, 0x08000A, 0x000904, 0x14A286,
+       0x000007, 0x280502, 0x001A4C, 0x163986,
+       0x000007, 0x032164, 0x00632C, 0x003DFD,
+       0x018042, 0x08000A, 0x000095, 0x090904,
+       0x000007, 0x000820, 0x001A4C, 0x156186,
+       0x018040, 0x030000, 0x157A06, 0x002124,
+       0x00010D, 0x000924, 0x006B24, 0x015B8D,
+       0x00397D, 0x000820, 0x058040, 0x038042,
+       0x09844A, 0x000606, 0x08040A, 0x003A64,
+       0x000095, 0x001224, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x15DA86, 0x000007,
+       0x01628D, 0x000810, 0x08043A, 0x29D206,
+       0x000007, 0x14D206, 0x000007, 0x007020,
+       0x08010A, 0x10012A, 0x0020FD, 0x038860,
+       0x039060, 0x018040, 0x00227D, 0x018042,
+       0x003DFD, 0x08000A, 0x31844A, 0x000904,
+       0x16D886, 0x18008B, 0x00008D, 0x189904,
+       0x00312C, 0x17AA06, 0x000007, 0x00324C,
+       0x173386, 0x000007, 0x001904, 0x173086,
+       0x000007, 0x000095, 0x199144, 0x00222C,
+       0x003124, 0x00636C, 0x000E3D, 0x001375,
+       0x000BFD, 0x010042, 0x09804A, 0x10000A,
+       0x038AEC, 0x0393EC, 0x00224C, 0x17A986,
+       0x000007, 0x00008D, 0x189904, 0x00226C,
+       0x00322C, 0x30050A, 0x301DAB, 0x002083,
+       0x0018FD, 0x018042, 0x08000A, 0x018924,
+       0x300502, 0x001083, 0x001875, 0x010042,
+       0x10000A, 0x00008D, 0x010924, 0x001375,
+       0x330542, 0x330CCB, 0x332CCB, 0x3334CB,
+       0x333CCB, 0x3344CB, 0x334CCB, 0x3354CB,
+       0x305C8B, 0x006083, 0x0002F5, 0x010042,
+       0x08000A, 0x000904, 0x187A86, 0x000007,
+       0x001E2D, 0x0005FD, 0x018042, 0x08000A,
+       0x028924, 0x280502, 0x00060D, 0x000810,
+       0x280C3A, 0x00008D, 0x000810, 0x28143A,
+       0x0A808D, 0x000820, 0x0002F5, 0x010040,
+       0x220007, 0x001275, 0x030042, 0x21004A,
+       0x00008D, 0x1A0944, 0x000007, 0x01980D,
+       0x000810, 0x08043A, 0x2B2206, 0x000007,
+       0x0001F5, 0x030042, 0x0D004A, 0x10000A,
+       0x089144, 0x000007, 0x000820, 0x010040,
+       0x0025F5, 0x0A3144, 0x000007, 0x000820,
+       0x032860, 0x030040, 0x00217D, 0x038042,
+       0x0B804A, 0x10000A, 0x000820, 0x031060,
+       0x030040, 0x00008D, 0x000124, 0x00012C,
+       0x000E64, 0x001A64, 0x00636C, 0x08010A,
+       0x10012A, 0x000820, 0x031060, 0x030040,
+       0x0020FD, 0x018042, 0x08000A, 0x00227D,
+       0x018042, 0x10000A, 0x000820, 0x031060,
+       0x030040, 0x00197D, 0x018042, 0x08000A,
+       0x0022FD, 0x038042, 0x10000A, 0x000820,
+       0x031060, 0x030040, 0x090D04, 0x000007,
+       0x000820, 0x030040, 0x038042, 0x0B804A,
+       0x10000A, 0x000820, 0x031060, 0x030040,
+       0x038042, 0x13804A, 0x19804A, 0x110D04,
+       0x198D04, 0x000007, 0x08000A, 0x001020,
+       0x031860, 0x030860, 0x030040, 0x00008D,
+       0x0B0944, 0x000007, 0x000820, 0x010040,
+       0x0005F5, 0x030042, 0x08000A, 0x000820,
+       0x010040, 0x0000F5, 0x010042, 0x08000A,
+       0x000904, 0x1C6086, 0x001E75, 0x030042,
+       0x01044A, 0x000C0A, 0x1C7206, 0x000007,
+       0x000402, 0x000C02, 0x00177D, 0x001AF5,
+       0x018042, 0x03144A, 0x031C4A, 0x03244A,
+       0x032C4A, 0x03344A, 0x033C4A, 0x03444A,
+       0x004C0A, 0x00043D, 0x0013F5, 0x001AFD,
+       0x030042, 0x0B004A, 0x1B804A, 0x13804A,
+       0x20000A, 0x089144, 0x19A144, 0x0389E4,
+       0x0399EC, 0x005502, 0x005D0A, 0x030042,
+       0x0B004A, 0x1B804A, 0x13804A, 0x20000A,
+       0x089144, 0x19A144, 0x0389E4, 0x0399EC,
+       0x006502, 0x006D0A, 0x030042, 0x0B004A,
+       0x19004A, 0x2B804A, 0x13804A, 0x21804A,
+       0x30000A, 0x089144, 0x19A144, 0x2AB144,
+       0x0389E4, 0x0399EC, 0x007502, 0x007D0A,
+       0x03A9E4, 0x000702, 0x00107D, 0x000415,
+       0x018042, 0x08000A, 0x0109E4, 0x000F02,
+       0x002AF5, 0x0019FD, 0x010042, 0x09804A,
+       0x10000A, 0x000934, 0x001674, 0x0029F5,
+       0x010042, 0x10000A, 0x00917C, 0x002075,
+       0x010042, 0x08000A, 0x000904, 0x1ED286,
+       0x0026F5, 0x0027F5, 0x030042, 0x09004A,
+       0x10000A, 0x000A3C, 0x00167C, 0x001A75,
+       0x000BFD, 0x010042, 0x51804A, 0x48000A,
+       0x160007, 0x001075, 0x010042, 0x282C0A,
+       0x281D12, 0x282512, 0x001F32, 0x1E0007,
+       0x0E0007, 0x001975, 0x010042, 0x002DF5,
+       0x0D004A, 0x10000A, 0x009144, 0x1FB286,
+       0x010042, 0x28340A, 0x000E5D, 0x00008D,
+       0x000375, 0x000820, 0x010040, 0x05D2F4,
+       0x54D104, 0x00735C, 0x205386, 0x000007,
+       0x0C0007, 0x080007, 0x0A0007, 0x02040D,
+       0x000810, 0x08043A, 0x332206, 0x000007,
+       0x205A06, 0x000007, 0x080007, 0x002275,
+       0x010042, 0x20000A, 0x002104, 0x212086,
+       0x001E2D, 0x0002F5, 0x010042, 0x08000A,
+       0x000904, 0x209286, 0x000007, 0x002010,
+       0x30043A, 0x00057D, 0x0180C3, 0x08000A,
+       0x028924, 0x280502, 0x280C02, 0x0A810D,
+       0x000820, 0x0002F5, 0x010040, 0x220007,
+       0x0004FD, 0x018042, 0x70000A, 0x030000,
+       0x007020, 0x06FA06, 0x018040, 0x02180D,
+       0x000810, 0x08043A, 0x2B2206, 0x000007,
+       0x0002FD, 0x018042, 0x08000A, 0x000904,
+       0x218A86, 0x000007, 0x01F206, 0x000007,
+       0x000875, 0x0009FD, 0x00010D, 0x220A06,
+       0x000295, 0x000B75, 0x00097D, 0x00000D,
+       0x000515, 0x010042, 0x18000A, 0x001904,
+       0x287886, 0x0006F5, 0x001020, 0x010040,
+       0x0004F5, 0x000820, 0x010040, 0x000775,
+       0x010042, 0x09804A, 0x10000A, 0x001124,
+       0x000904, 0x22BA86, 0x000815, 0x080102,
+       0x101204, 0x22DA06, 0x000575, 0x081204,
+       0x000007, 0x100102, 0x000575, 0x000425,
+       0x021124, 0x100102, 0x000820, 0x031060,
+       0x010040, 0x001924, 0x287886, 0x00008D,
+       0x000464, 0x009D04, 0x278886, 0x180102,
+       0x000575, 0x010042, 0x28040A, 0x00018D,
+       0x000924, 0x280D02, 0x00000D, 0x000924,
+       0x281502, 0x10000D, 0x000820, 0x0002F5,
+       0x010040, 0x200007, 0x001175, 0x0002FD,
+       0x018042, 0x08000A, 0x000904, 0x23C286,
+       0x000007, 0x000100, 0x080B20, 0x130B60,
+       0x1B0B60, 0x030A60, 0x010040, 0x050042,
+       0x3D004A, 0x35004A, 0x2D004A, 0x20000A,
+       0x0006F5, 0x010042, 0x28140A, 0x0004F5,
+       0x010042, 0x08000A, 0x000315, 0x010D04,
+       0x24CA86, 0x004015, 0x000095, 0x010D04,
+       0x24B886, 0x100022, 0x10002A, 0x24E206,
+       0x000007, 0x333104, 0x2AA904, 0x000007,
+       0x032124, 0x280502, 0x001124, 0x000424,
+       0x000424, 0x003224, 0x00292C, 0x00636C,
+       0x25F386, 0x000007, 0x02B164, 0x000464,
+       0x000464, 0x00008D, 0x000A64, 0x280D02,
+       0x10008D, 0x000820, 0x0002F5, 0x010040,
+       0x220007, 0x00008D, 0x38B904, 0x000007,
+       0x03296C, 0x30010A, 0x0002F5, 0x010042,
+       0x08000A, 0x000904, 0x25BA86, 0x000007,
+       0x02312C, 0x28050A, 0x00008D, 0x01096C,
+       0x280D0A, 0x10010D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x001124, 0x000424,
+       0x000424, 0x003224, 0x300102, 0x032944,
+       0x267A86, 0x000007, 0x300002, 0x0004F5,
+       0x010042, 0x08000A, 0x000315, 0x010D04,
+       0x26C086, 0x003124, 0x000464, 0x300102,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x26CA86, 0x000007, 0x003124, 0x300502,
+       0x003924, 0x300583, 0x000883, 0x0005F5,
+       0x010042, 0x28040A, 0x00008D, 0x008124,
+       0x280D02, 0x00008D, 0x008124, 0x281502,
+       0x10018D, 0x000820, 0x0002F5, 0x010040,
+       0x220007, 0x001025, 0x000575, 0x030042,
+       0x09004A, 0x10000A, 0x0A0904, 0x121104,
+       0x000007, 0x001020, 0x050860, 0x050040,
+       0x0006FD, 0x018042, 0x09004A, 0x10000A,
+       0x0000A5, 0x0A0904, 0x121104, 0x000007,
+       0x000820, 0x019060, 0x010040, 0x0002F5,
+       0x010042, 0x08000A, 0x000904, 0x284286,
+       0x000007, 0x230A06, 0x000007, 0x000606,
+       0x000007, 0x0002F5, 0x010042, 0x08000A,
+       0x000904, 0x289286, 0x000007, 0x000100,
+       0x080B20, 0x138B60, 0x1B8B60, 0x238B60,
+       0x2B8B60, 0x338B60, 0x3B8B60, 0x438B60,
+       0x4B8B60, 0x538B60, 0x5B8B60, 0x638B60,
+       0x6B8B60, 0x738B60, 0x7B8B60, 0x038F60,
+       0x0B8F60, 0x138F60, 0x1B8F60, 0x238F60,
+       0x2B8F60, 0x338F60, 0x3B8F60, 0x438F60,
+       0x4B8F60, 0x538F60, 0x5B8F60, 0x638F60,
+       0x6B8F60, 0x738F60, 0x7B8F60, 0x038A60,
+       0x000606, 0x018040, 0x00008D, 0x000A64,
+       0x280D02, 0x000A24, 0x00027D, 0x018042,
+       0x10000A, 0x001224, 0x0003FD, 0x018042,
+       0x08000A, 0x000904, 0x2A8286, 0x000007,
+       0x00018D, 0x000A24, 0x000464, 0x000464,
+       0x080102, 0x000924, 0x000424, 0x000424,
+       0x100102, 0x02000D, 0x009144, 0x2AD986,
+       0x000007, 0x0001FD, 0x018042, 0x08000A,
+       0x000A44, 0x2ABB86, 0x018042, 0x0A000D,
+       0x000820, 0x0002FD, 0x018040, 0x200007,
+       0x00027D, 0x001020, 0x000606, 0x018040,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x2B2A86, 0x000007, 0x00037D, 0x018042,
+       0x08000A, 0x000904, 0x2B5A86, 0x000007,
+       0x000075, 0x002E7D, 0x010042, 0x0B804A,
+       0x000020, 0x000904, 0x000686, 0x010040,
+       0x31844A, 0x30048B, 0x000883, 0x00008D,
+       0x000810, 0x28143A, 0x00008D, 0x000810,
+       0x280C3A, 0x000675, 0x010042, 0x08000A,
+       0x003815, 0x010924, 0x280502, 0x0B000D,
+       0x000820, 0x0002F5, 0x010040, 0x000606,
+       0x220007, 0x000464, 0x000464, 0x000606,
+       0x000007, 0x000134, 0x007F8D, 0x00093C,
+       0x281D12, 0x282512, 0x001F32, 0x0E0007,
+       0x00010D, 0x00037D, 0x000820, 0x018040,
+       0x05D2F4, 0x000007, 0x080007, 0x00037D,
+       0x018042, 0x08000A, 0x000904, 0x2D0286,
+       0x000007, 0x000606, 0x000007, 0x000007,
+       0x000012, 0x100007, 0x320007, 0x600007,
+       0x100080, 0x48001A, 0x004904, 0x2D6186,
+       0x000007, 0x001210, 0x58003A, 0x000145,
+       0x5C5D04, 0x000007, 0x000080, 0x48001A,
+       0x004904, 0x2DB186, 0x000007, 0x001210,
+       0x50003A, 0x005904, 0x2E0886, 0x000045,
+       0x0000C5, 0x7FFFF5, 0x7FFF7D, 0x07D524,
+       0x004224, 0x500102, 0x200502, 0x000082,
+       0x40001A, 0x004104, 0x2E3986, 0x000007,
+       0x003865, 0x40001A, 0x004020, 0x00104D,
+       0x04C184, 0x301B86, 0x000040, 0x040007,
+       0x000165, 0x000145, 0x004020, 0x000040,
+       0x000765, 0x080080, 0x40001A, 0x004104,
+       0x2EC986, 0x000007, 0x001210, 0x40003A,
+       0x004104, 0x2F2286, 0x00004D, 0x0000CD,
+       0x004810, 0x20043A, 0x000882, 0x40001A,
+       0x004104, 0x2F3186, 0x000007, 0x004820,
+       0x005904, 0x300886, 0x000040, 0x0007E5,
+       0x200480, 0x2816A0, 0x3216E0, 0x3A16E0,
+       0x4216E0, 0x021260, 0x000040, 0x000032,
+       0x400075, 0x00007D, 0x07D574, 0x200512,
+       0x000082, 0x40001A, 0x004104, 0x2FE186,
+       0x000007, 0x037206, 0x640007, 0x060007,
+       0x0000E5, 0x000020, 0x000040, 0x000A65,
+       0x000020, 0x020040, 0x020040, 0x000040,
+       0x000165, 0x000042, 0x70000A, 0x007104,
+       0x30A286, 0x000007, 0x018206, 0x640007,
+       0x050000, 0x007020, 0x000040, 0x037206,
+       0x640007, 0x000007, 0x00306D, 0x028860,
+       0x029060, 0x08000A, 0x028860, 0x008040,
+       0x100012, 0x00100D, 0x009184, 0x314186,
+       0x000E0D, 0x009184, 0x325186, 0x000007,
+       0x300007, 0x001020, 0x003B6D, 0x008040,
+       0x000080, 0x08001A, 0x000904, 0x316186,
+       0x000007, 0x001220, 0x000DED, 0x008040,
+       0x008042, 0x10000A, 0x40000D, 0x109544,
+       0x000007, 0x001020, 0x000DED, 0x008040,
+       0x008042, 0x20040A, 0x000082, 0x08001A,
+       0x000904, 0x31F186, 0x000007, 0x003B6D,
+       0x008042, 0x08000A, 0x000E15, 0x010984,
+       0x329B86, 0x600007, 0x08001A, 0x000C15,
+       0x010984, 0x328386, 0x000020, 0x1A0007,
+       0x0002ED, 0x008040, 0x620007, 0x00306D,
+       0x028042, 0x0A804A, 0x000820, 0x0A804A,
+       0x000606, 0x10804A, 0x000007, 0x282512,
+       0x001F32, 0x05D2F4, 0x54D104, 0x00735C,
+       0x000786, 0x000007, 0x0C0007, 0x0A0007,
+       0x1C0007, 0x003465, 0x020040, 0x004820,
+       0x025060, 0x40000A, 0x024060, 0x000040,
+       0x454944, 0x000007, 0x004020, 0x003AE5,
+       0x000040, 0x0028E5, 0x000042, 0x48000A,
+       0x004904, 0x386886, 0x002C65, 0x000042,
+       0x40000A, 0x0000D5, 0x454104, 0x000007,
+       0x000655, 0x054504, 0x34F286, 0x0001D5,
+       0x054504, 0x34F086, 0x002B65, 0x000042,
+       0x003AE5, 0x50004A, 0x40000A, 0x45C3D4,
+       0x000007, 0x454504, 0x000007, 0x0000CD,
+       0x444944, 0x000007, 0x454504, 0x000007,
+       0x00014D, 0x554944, 0x000007, 0x045144,
+       0x34E986, 0x002C65, 0x000042, 0x48000A,
+       0x4CD104, 0x000007, 0x04C144, 0x34F386,
+       0x000007, 0x160007, 0x002CE5, 0x040042,
+       0x40000A, 0x004020, 0x000040, 0x002965,
+       0x000042, 0x40000A, 0x004104, 0x356086,
+       0x000007, 0x002402, 0x36A206, 0x005C02,
+       0x0025E5, 0x000042, 0x40000A, 0x004274,
+       0x002AE5, 0x000042, 0x40000A, 0x004274,
+       0x500112, 0x0029E5, 0x000042, 0x40000A,
+       0x004234, 0x454104, 0x000007, 0x004020,
+       0x000040, 0x003EE5, 0x000020, 0x000040,
+       0x002DE5, 0x400152, 0x50000A, 0x045144,
+       0x364A86, 0x0000C5, 0x003EE5, 0x004020,
+       0x000040, 0x002BE5, 0x000042, 0x40000A,
+       0x404254, 0x000007, 0x002AE5, 0x004020,
+       0x000040, 0x500132, 0x040134, 0x005674,
+       0x0029E5, 0x020042, 0x42000A, 0x000042,
+       0x50000A, 0x05417C, 0x0028E5, 0x000042,
+       0x48000A, 0x0000C5, 0x4CC144, 0x371086,
+       0x0026E5, 0x0027E5, 0x020042, 0x40004A,
+       0x50000A, 0x00423C, 0x00567C, 0x0028E5,
+       0x004820, 0x000040, 0x281D12, 0x282512,
+       0x001F72, 0x002965, 0x000042, 0x40000A,
+       0x004104, 0x37AA86, 0x0E0007, 0x160007,
+       0x1E0007, 0x003EE5, 0x000042, 0x40000A,
+       0x004104, 0x37E886, 0x002D65, 0x000042,
+       0x28340A, 0x003465, 0x020042, 0x42004A,
+       0x004020, 0x4A004A, 0x50004A, 0x05D2F4,
+       0x54D104, 0x00735C, 0x385186, 0x000007,
+       0x000606, 0x080007, 0x0C0007, 0x080007,
+       0x0A0007, 0x0001E5, 0x020045, 0x004020,
+       0x000060, 0x000365, 0x000040, 0x002E65,
+       0x001A20, 0x0A1A60, 0x000040, 0x003465,
+       0x020042, 0x42004A, 0x004020, 0x4A004A,
+       0x000606, 0x50004A, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000
+};
+
+// --------------------------------------------
+//  DS-1E Controller InstructionRAM Code
+//     1999/06/21
+//     Buf441 slot is Enabled.
+// --------------------------------------------
+// 04/09\81@creat
+// 04/12  stop nise fix
+// 06/21\81@WorkingOff timming
+static unsigned long int       CntrlInst1E[] = {
+       0x000007, 0x240007, 0x0C0007, 0x1C0007,
+       0x060007, 0x700002, 0x000020, 0x030040,
+       0x007104, 0x004286, 0x030040, 0x000F0D,
+       0x000810, 0x20043A, 0x000282, 0x00020D,
+       0x000810, 0x20043A, 0x001282, 0x200E82,
+       0x00800D, 0x000810, 0x20043A, 0x001A82,
+       0x03460D, 0x000810, 0x10043A, 0x02EC0D,
+       0x000810, 0x18043A, 0x00010D, 0x020015,
+       0x0000FD, 0x000020, 0x038860, 0x039060,
+       0x038060, 0x038040, 0x038040, 0x038040,
+       0x018040, 0x000A7D, 0x038040, 0x038040,
+       0x018040, 0x200402, 0x000882, 0x08001A,
+       0x000904, 0x017186, 0x000007, 0x260007,
+       0x400007, 0x000007, 0x03258D, 0x000810,
+       0x18043A, 0x260007, 0x284402, 0x00087D,
+       0x018042, 0x00160A, 0x05A206, 0x000007,
+       0x440007, 0x00230D, 0x000810, 0x08043A,
+       0x22FA06, 0x000007, 0x0007FD, 0x018042,
+       0x08000A, 0x000904, 0x02AB86, 0x000195,
+       0x090D04, 0x000007, 0x000820, 0x0000F5,
+       0x000B7D, 0x01F060, 0x0000FD, 0x033A06,
+       0x018040, 0x000A7D, 0x038042, 0x13804A,
+       0x18000A, 0x001820, 0x059060, 0x058860,
+       0x018040, 0x0000FD, 0x018042, 0x70000A,
+       0x000115, 0x071144, 0x033B86, 0x030000,
+       0x007020, 0x036206, 0x018040, 0x00360D,
+       0x000810, 0x08043A, 0x232206, 0x000007,
+       0x02EC0D, 0x000810, 0x18043A, 0x019A06,
+       0x000007, 0x240007, 0x000F8D, 0x000810,
+       0x00163A, 0x002402, 0x005C02, 0x0028FD,
+       0x000020, 0x018040, 0x08000D, 0x000815,
+       0x510984, 0x000007, 0x00004D, 0x000E5D,
+       0x000E02, 0x00430D, 0x000810, 0x08043A,
+       0x2E1206, 0x000007, 0x00008D, 0x000924,
+       0x000F02, 0x00470D, 0x000810, 0x08043A,
+       0x2E1206, 0x000007, 0x480480, 0x001210,
+       0x28043A, 0x00778D, 0x000810, 0x280C3A,
+       0x00068D, 0x000810, 0x28143A, 0x284402,
+       0x03258D, 0x000810, 0x18043A, 0x07FF8D,
+       0x000820, 0x0002FD, 0x018040, 0x260007,
+       0x200007, 0x0002FD, 0x018042, 0x08000A,
+       0x000904, 0x051286, 0x000007, 0x240007,
+       0x02EC0D, 0x000810, 0x18043A, 0x00387D,
+       0x018042, 0x08000A, 0x001015, 0x010984,
+       0x019B86, 0x000007, 0x01B206, 0x000007,
+       0x0008FD, 0x018042, 0x18000A, 0x001904,
+       0x22B886, 0x280007, 0x001810, 0x28043A,
+       0x280C02, 0x00000D, 0x000810, 0x28143A,
+       0x08808D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00020D, 0x189904, 0x000007,
+       0x00402D, 0x0000BD, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x065A86, 0x000007,
+       0x000100, 0x000A20, 0x00047D, 0x018040,
+       0x018042, 0x20000A, 0x003015, 0x012144,
+       0x036186, 0x000007, 0x002104, 0x036186,
+       0x000007, 0x000F8D, 0x000810, 0x280C3A,
+       0x023944, 0x07C986, 0x000007, 0x001810,
+       0x28043A, 0x08810D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x002810, 0x78003A,
+       0x00788D, 0x000810, 0x08043A, 0x2A1206,
+       0x000007, 0x00400D, 0x001015, 0x189904,
+       0x292904, 0x393904, 0x000007, 0x070206,
+       0x000007, 0x0004F5, 0x00007D, 0x000020,
+       0x00008D, 0x010860, 0x018040, 0x00047D,
+       0x038042, 0x21804A, 0x18000A, 0x021944,
+       0x229086, 0x000007, 0x004075, 0x71F104,
+       0x000007, 0x010042, 0x28000A, 0x002904,
+       0x225886, 0x000007, 0x003C0D, 0x30A904,
+       0x000007, 0x00077D, 0x018042, 0x08000A,
+       0x000904, 0x08DA86, 0x00057D, 0x002820,
+       0x03B060, 0x08F206, 0x018040, 0x003020,
+       0x03A860, 0x018040, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x08FA86, 0x000007,
+       0x00057D, 0x018042, 0x28040A, 0x000E8D,
+       0x000810, 0x280C3A, 0x00000D, 0x000810,
+       0x28143A, 0x09000D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x003DFD, 0x000020,
+       0x018040, 0x00107D, 0x009D8D, 0x000810,
+       0x08043A, 0x2A1206, 0x000007, 0x000815,
+       0x08001A, 0x010984, 0x0A5186, 0x00137D,
+       0x200500, 0x280F20, 0x338F60, 0x3B8F60,
+       0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
+       0x038A60, 0x018040, 0x00107D, 0x018042,
+       0x08000A, 0x000215, 0x010984, 0x3A8186,
+       0x000007, 0x007FBD, 0x383DC4, 0x000007,
+       0x001A7D, 0x001375, 0x018042, 0x09004A,
+       0x10000A, 0x0B8D04, 0x139504, 0x000007,
+       0x000820, 0x019060, 0x001104, 0x225886,
+       0x010040, 0x0017FD, 0x018042, 0x08000A,
+       0x000904, 0x225A86, 0x000007, 0x00197D,
+       0x038042, 0x09804A, 0x10000A, 0x000924,
+       0x001664, 0x0011FD, 0x038042, 0x2B804A,
+       0x19804A, 0x00008D, 0x218944, 0x000007,
+       0x002244, 0x0C1986, 0x000007, 0x001A64,
+       0x002A24, 0x00197D, 0x080102, 0x100122,
+       0x000820, 0x039060, 0x018040, 0x003DFD,
+       0x00008D, 0x000820, 0x018040, 0x001375,
+       0x001A7D, 0x010042, 0x09804A, 0x10000A,
+       0x00021D, 0x0189E4, 0x2992E4, 0x309144,
+       0x000007, 0x00060D, 0x000A15, 0x000C1D,
+       0x001025, 0x00A9E4, 0x012BE4, 0x000464,
+       0x01B3E4, 0x0232E4, 0x000464, 0x000464,
+       0x000464, 0x000464, 0x00040D, 0x08B1C4,
+       0x000007, 0x000820, 0x000BF5, 0x030040,
+       0x00197D, 0x038042, 0x09804A, 0x000A24,
+       0x08000A, 0x080E64, 0x000007, 0x100122,
+       0x000820, 0x031060, 0x010040, 0x0064AC,
+       0x00027D, 0x000020, 0x018040, 0x00107D,
+       0x018042, 0x0011FD, 0x3B804A, 0x09804A,
+       0x20000A, 0x000095, 0x1A1144, 0x00A144,
+       0x0E5886, 0x00040D, 0x00B984, 0x0E5986,
+       0x0018FD, 0x018042, 0x0010FD, 0x09804A,
+       0x28000A, 0x000095, 0x010924, 0x002A64,
+       0x0E4986, 0x000007, 0x002904, 0x0E5A86,
+       0x000007, 0x0E6206, 0x080002, 0x00008D,
+       0x00387D, 0x000820, 0x018040, 0x00127D,
+       0x018042, 0x10000A, 0x003904, 0x0F0986,
+       0x00080D, 0x7FFFB5, 0x00B984, 0x0ED986,
+       0x000025, 0x0FB206, 0x00002D, 0x000015,
+       0x00082D, 0x02E00D, 0x000820, 0x0FFA06,
+       0x00000D, 0x7F8035, 0x00B984, 0x0FA986,
+       0x400025, 0x00008D, 0x110944, 0x000007,
+       0x00018D, 0x109504, 0x000007, 0x009164,
+       0x000424, 0x000424, 0x000424, 0x100102,
+       0x280002, 0x02DF0D, 0x000820, 0x0FFA06,
+       0x00018D, 0x00042D, 0x00008D, 0x109504,
+       0x000007, 0x00020D, 0x109184, 0x000007,
+       0x02DF8D, 0x000820, 0x00008D, 0x0038FD,
+       0x018040, 0x003BFD, 0x001020, 0x03A860,
+       0x000815, 0x313184, 0x212184, 0x000007,
+       0x03B060, 0x03A060, 0x018040, 0x0022FD,
+       0x000095, 0x010924, 0x000424, 0x000424,
+       0x001264, 0x100102, 0x000820, 0x039060,
+       0x018040, 0x001924, 0x010F0D, 0x00397D,
+       0x000820, 0x058040, 0x038042, 0x09844A,
+       0x000606, 0x08040A, 0x000424, 0x000424,
+       0x00117D, 0x018042, 0x08000A, 0x000A24,
+       0x280502, 0x280C02, 0x09800D, 0x000820,
+       0x0002FD, 0x018040, 0x200007, 0x0022FD,
+       0x018042, 0x08000A, 0x000095, 0x280DC4,
+       0x011924, 0x00197D, 0x018042, 0x0011FD,
+       0x09804A, 0x10000A, 0x0000B5, 0x113144,
+       0x0A8D04, 0x000007, 0x080A44, 0x129504,
+       0x000007, 0x0023FD, 0x001020, 0x038040,
+       0x101244, 0x000007, 0x000820, 0x039060,
+       0x018040, 0x0002FD, 0x018042, 0x08000A,
+       0x000904, 0x123286, 0x000007, 0x003BFD,
+       0x000100, 0x000A10, 0x0B807A, 0x13804A,
+       0x090984, 0x000007, 0x000095, 0x013D04,
+       0x12B886, 0x10000A, 0x100002, 0x090984,
+       0x000007, 0x038042, 0x11804A, 0x090D04,
+       0x000007, 0x10000A, 0x090D84, 0x000007,
+       0x00257D, 0x000820, 0x018040, 0x00010D,
+       0x000810, 0x28143A, 0x00127D, 0x018042,
+       0x20000A, 0x00197D, 0x018042, 0x00117D,
+       0x31804A, 0x10000A, 0x003124, 0x013B8D,
+       0x00397D, 0x000820, 0x058040, 0x038042,
+       0x09844A, 0x000606, 0x08040A, 0x300102,
+       0x003124, 0x000424, 0x000424, 0x001224,
+       0x280502, 0x001A4C, 0x143986, 0x700002,
+       0x00002D, 0x030000, 0x00387D, 0x018042,
+       0x10000A, 0x146206, 0x002124, 0x0000AD,
+       0x100002, 0x00010D, 0x000924, 0x006B24,
+       0x014A0D, 0x00397D, 0x000820, 0x058040,
+       0x038042, 0x09844A, 0x000606, 0x08040A,
+       0x003264, 0x00008D, 0x000A24, 0x001020,
+       0x00227D, 0x018040, 0x014F8D, 0x000810,
+       0x08043A, 0x2B5A06, 0x000007, 0x002820,
+       0x00207D, 0x018040, 0x00117D, 0x038042,
+       0x13804A, 0x33800A, 0x00387D, 0x018042,
+       0x08000A, 0x000904, 0x177286, 0x000007,
+       0x00008D, 0x030964, 0x015B0D, 0x00397D,
+       0x000820, 0x058040, 0x038042, 0x09844A,
+       0x000606, 0x08040A, 0x380102, 0x000424,
+       0x000424, 0x001224, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x15DA86, 0x000007,
+       0x280502, 0x001A4C, 0x177186, 0x000007,
+       0x032164, 0x00632C, 0x003DFD, 0x018042,
+       0x08000A, 0x000095, 0x090904, 0x000007,
+       0x000820, 0x001A4C, 0x169986, 0x018040,
+       0x030000, 0x16B206, 0x002124, 0x00010D,
+       0x000924, 0x006B24, 0x016F0D, 0x00397D,
+       0x000820, 0x058040, 0x038042, 0x09844A,
+       0x000606, 0x08040A, 0x003A64, 0x000095,
+       0x001224, 0x0002FD, 0x018042, 0x08000A,
+       0x000904, 0x171286, 0x000007, 0x01760D,
+       0x000810, 0x08043A, 0x2B5A06, 0x000007,
+       0x160A06, 0x000007, 0x007020, 0x08010A,
+       0x10012A, 0x0020FD, 0x038860, 0x039060,
+       0x018040, 0x00227D, 0x018042, 0x003DFD,
+       0x08000A, 0x31844A, 0x000904, 0x181086,
+       0x18008B, 0x00008D, 0x189904, 0x00312C,
+       0x18E206, 0x000007, 0x00324C, 0x186B86,
+       0x000007, 0x001904, 0x186886, 0x000007,
+       0x000095, 0x199144, 0x00222C, 0x003124,
+       0x00636C, 0x000E3D, 0x001375, 0x000BFD,
+       0x010042, 0x09804A, 0x10000A, 0x038AEC,
+       0x0393EC, 0x00224C, 0x18E186, 0x000007,
+       0x00008D, 0x189904, 0x00226C, 0x00322C,
+       0x30050A, 0x301DAB, 0x002083, 0x0018FD,
+       0x018042, 0x08000A, 0x018924, 0x300502,
+       0x001083, 0x001875, 0x010042, 0x10000A,
+       0x00008D, 0x010924, 0x001375, 0x330542,
+       0x330CCB, 0x332CCB, 0x3334CB, 0x333CCB,
+       0x3344CB, 0x334CCB, 0x3354CB, 0x305C8B,
+       0x006083, 0x0002F5, 0x010042, 0x08000A,
+       0x000904, 0x19B286, 0x000007, 0x001E2D,
+       0x0005FD, 0x018042, 0x08000A, 0x028924,
+       0x280502, 0x00060D, 0x000810, 0x280C3A,
+       0x00008D, 0x000810, 0x28143A, 0x0A808D,
+       0x000820, 0x0002F5, 0x010040, 0x220007,
+       0x001275, 0x030042, 0x21004A, 0x00008D,
+       0x1A0944, 0x000007, 0x01AB8D, 0x000810,
+       0x08043A, 0x2CAA06, 0x000007, 0x0001F5,
+       0x030042, 0x0D004A, 0x10000A, 0x089144,
+       0x000007, 0x000820, 0x010040, 0x0025F5,
+       0x0A3144, 0x000007, 0x000820, 0x032860,
+       0x030040, 0x00217D, 0x038042, 0x0B804A,
+       0x10000A, 0x000820, 0x031060, 0x030040,
+       0x00008D, 0x000124, 0x00012C, 0x000E64,
+       0x001A64, 0x00636C, 0x08010A, 0x10012A,
+       0x000820, 0x031060, 0x030040, 0x0020FD,
+       0x018042, 0x08000A, 0x00227D, 0x018042,
+       0x10000A, 0x000820, 0x031060, 0x030040,
+       0x00197D, 0x018042, 0x08000A, 0x0022FD,
+       0x038042, 0x10000A, 0x000820, 0x031060,
+       0x030040, 0x090D04, 0x000007, 0x000820,
+       0x030040, 0x038042, 0x0B804A, 0x10000A,
+       0x000820, 0x031060, 0x030040, 0x038042,
+       0x13804A, 0x19804A, 0x110D04, 0x198D04,
+       0x000007, 0x08000A, 0x001020, 0x031860,
+       0x030860, 0x030040, 0x00008D, 0x0B0944,
+       0x000007, 0x000820, 0x010040, 0x0005F5,
+       0x030042, 0x08000A, 0x000820, 0x010040,
+       0x0000F5, 0x010042, 0x08000A, 0x000904,
+       0x1D9886, 0x001E75, 0x030042, 0x01044A,
+       0x000C0A, 0x1DAA06, 0x000007, 0x000402,
+       0x000C02, 0x00177D, 0x001AF5, 0x018042,
+       0x03144A, 0x031C4A, 0x03244A, 0x032C4A,
+       0x03344A, 0x033C4A, 0x03444A, 0x004C0A,
+       0x00043D, 0x0013F5, 0x001AFD, 0x030042,
+       0x0B004A, 0x1B804A, 0x13804A, 0x20000A,
+       0x089144, 0x19A144, 0x0389E4, 0x0399EC,
+       0x005502, 0x005D0A, 0x030042, 0x0B004A,
+       0x1B804A, 0x13804A, 0x20000A, 0x089144,
+       0x19A144, 0x0389E4, 0x0399EC, 0x006502,
+       0x006D0A, 0x030042, 0x0B004A, 0x19004A,
+       0x2B804A, 0x13804A, 0x21804A, 0x30000A,
+       0x089144, 0x19A144, 0x2AB144, 0x0389E4,
+       0x0399EC, 0x007502, 0x007D0A, 0x03A9E4,
+       0x000702, 0x00107D, 0x000415, 0x018042,
+       0x08000A, 0x0109E4, 0x000F02, 0x002AF5,
+       0x0019FD, 0x010042, 0x09804A, 0x10000A,
+       0x000934, 0x001674, 0x0029F5, 0x010042,
+       0x10000A, 0x00917C, 0x002075, 0x010042,
+       0x08000A, 0x000904, 0x200A86, 0x0026F5,
+       0x0027F5, 0x030042, 0x09004A, 0x10000A,
+       0x000A3C, 0x00167C, 0x001A75, 0x000BFD,
+       0x010042, 0x51804A, 0x48000A, 0x160007,
+       0x001075, 0x010042, 0x282C0A, 0x281D12,
+       0x282512, 0x001F32, 0x1E0007, 0x0E0007,
+       0x001975, 0x010042, 0x002DF5, 0x0D004A,
+       0x10000A, 0x009144, 0x20EA86, 0x010042,
+       0x28340A, 0x000E5D, 0x00008D, 0x000375,
+       0x000820, 0x010040, 0x05D2F4, 0x54D104,
+       0x00735C, 0x218B86, 0x000007, 0x0C0007,
+       0x080007, 0x0A0007, 0x02178D, 0x000810,
+       0x08043A, 0x34B206, 0x000007, 0x219206,
+       0x000007, 0x080007, 0x002275, 0x010042,
+       0x20000A, 0x002104, 0x225886, 0x001E2D,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x21CA86, 0x000007, 0x002010, 0x30043A,
+       0x00057D, 0x0180C3, 0x08000A, 0x028924,
+       0x280502, 0x280C02, 0x0A810D, 0x000820,
+       0x0002F5, 0x010040, 0x220007, 0x0004FD,
+       0x018042, 0x70000A, 0x030000, 0x007020,
+       0x07FA06, 0x018040, 0x022B8D, 0x000810,
+       0x08043A, 0x2CAA06, 0x000007, 0x0002FD,
+       0x018042, 0x08000A, 0x000904, 0x22C286,
+       0x000007, 0x020206, 0x000007, 0x000875,
+       0x0009FD, 0x00010D, 0x234206, 0x000295,
+       0x000B75, 0x00097D, 0x00000D, 0x000515,
+       0x010042, 0x18000A, 0x001904, 0x2A0086,
+       0x0006F5, 0x001020, 0x010040, 0x0004F5,
+       0x000820, 0x010040, 0x000775, 0x010042,
+       0x09804A, 0x10000A, 0x001124, 0x000904,
+       0x23F286, 0x000815, 0x080102, 0x101204,
+       0x241206, 0x000575, 0x081204, 0x000007,
+       0x100102, 0x000575, 0x000425, 0x021124,
+       0x100102, 0x000820, 0x031060, 0x010040,
+       0x001924, 0x2A0086, 0x00008D, 0x000464,
+       0x009D04, 0x291086, 0x180102, 0x000575,
+       0x010042, 0x28040A, 0x00018D, 0x000924,
+       0x280D02, 0x00000D, 0x000924, 0x281502,
+       0x10000D, 0x000820, 0x0002F5, 0x010040,
+       0x200007, 0x001175, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x24FA86, 0x000007,
+       0x000100, 0x080B20, 0x130B60, 0x1B0B60,
+       0x030A60, 0x010040, 0x050042, 0x3D004A,
+       0x35004A, 0x2D004A, 0x20000A, 0x0006F5,
+       0x010042, 0x28140A, 0x0004F5, 0x010042,
+       0x08000A, 0x000315, 0x010D04, 0x260286,
+       0x004015, 0x000095, 0x010D04, 0x25F086,
+       0x100022, 0x10002A, 0x261A06, 0x000007,
+       0x333104, 0x2AA904, 0x000007, 0x032124,
+       0x280502, 0x284402, 0x001124, 0x400102,
+       0x000424, 0x000424, 0x003224, 0x00292C,
+       0x00636C, 0x277386, 0x000007, 0x02B164,
+       0x000464, 0x000464, 0x00008D, 0x000A64,
+       0x280D02, 0x10008D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x00008D, 0x38B904,
+       0x000007, 0x03296C, 0x30010A, 0x0002F5,
+       0x010042, 0x08000A, 0x000904, 0x270286,
+       0x000007, 0x00212C, 0x28050A, 0x00316C,
+       0x00046C, 0x00046C, 0x28450A, 0x001124,
+       0x006B64, 0x100102, 0x00008D, 0x01096C,
+       0x280D0A, 0x10010D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x004124, 0x000424,
+       0x000424, 0x003224, 0x300102, 0x032944,
+       0x27FA86, 0x000007, 0x300002, 0x0004F5,
+       0x010042, 0x08000A, 0x000315, 0x010D04,
+       0x284086, 0x003124, 0x000464, 0x300102,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x284A86, 0x000007, 0x284402, 0x003124,
+       0x300502, 0x003924, 0x300583, 0x000883,
+       0x0005F5, 0x010042, 0x28040A, 0x00008D,
+       0x008124, 0x280D02, 0x00008D, 0x008124,
+       0x281502, 0x10018D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x001025, 0x000575,
+       0x030042, 0x09004A, 0x10000A, 0x0A0904,
+       0x121104, 0x000007, 0x001020, 0x050860,
+       0x050040, 0x0006FD, 0x018042, 0x09004A,
+       0x10000A, 0x0000A5, 0x0A0904, 0x121104,
+       0x000007, 0x000820, 0x019060, 0x010040,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x29CA86, 0x000007, 0x244206, 0x000007,
+       0x000606, 0x000007, 0x0002F5, 0x010042,
+       0x08000A, 0x000904, 0x2A1A86, 0x000007,
+       0x000100, 0x080B20, 0x138B60, 0x1B8B60,
+       0x238B60, 0x2B8B60, 0x338B60, 0x3B8B60,
+       0x438B60, 0x4B8B60, 0x538B60, 0x5B8B60,
+       0x638B60, 0x6B8B60, 0x738B60, 0x7B8B60,
+       0x038F60, 0x0B8F60, 0x138F60, 0x1B8F60,
+       0x238F60, 0x2B8F60, 0x338F60, 0x3B8F60,
+       0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
+       0x638F60, 0x6B8F60, 0x738F60, 0x7B8F60,
+       0x038A60, 0x000606, 0x018040, 0x00008D,
+       0x000A64, 0x280D02, 0x000A24, 0x00027D,
+       0x018042, 0x10000A, 0x001224, 0x0003FD,
+       0x018042, 0x08000A, 0x000904, 0x2C0A86,
+       0x000007, 0x00018D, 0x000A24, 0x000464,
+       0x000464, 0x080102, 0x000924, 0x000424,
+       0x000424, 0x100102, 0x02000D, 0x009144,
+       0x2C6186, 0x000007, 0x0001FD, 0x018042,
+       0x08000A, 0x000A44, 0x2C4386, 0x018042,
+       0x0A000D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00027D, 0x001020, 0x000606,
+       0x018040, 0x0002F5, 0x010042, 0x08000A,
+       0x000904, 0x2CB286, 0x000007, 0x00037D,
+       0x018042, 0x08000A, 0x000904, 0x2CE286,
+       0x000007, 0x000075, 0x002E7D, 0x010042,
+       0x0B804A, 0x000020, 0x000904, 0x000686,
+       0x010040, 0x31844A, 0x30048B, 0x000883,
+       0x00008D, 0x000810, 0x28143A, 0x00008D,
+       0x000810, 0x280C3A, 0x000675, 0x010042,
+       0x08000A, 0x003815, 0x010924, 0x280502,
+       0x0B000D, 0x000820, 0x0002F5, 0x010040,
+       0x000606, 0x220007, 0x000464, 0x000464,
+       0x000606, 0x000007, 0x000134, 0x007F8D,
+       0x00093C, 0x281D12, 0x282512, 0x001F32,
+       0x0E0007, 0x00010D, 0x00037D, 0x000820,
+       0x018040, 0x05D2F4, 0x000007, 0x080007,
+       0x00037D, 0x018042, 0x08000A, 0x000904,
+       0x2E8A86, 0x000007, 0x000606, 0x000007,
+       0x000007, 0x000012, 0x100007, 0x320007,
+       0x600007, 0x460007, 0x100080, 0x48001A,
+       0x004904, 0x2EF186, 0x000007, 0x001210,
+       0x58003A, 0x000145, 0x5C5D04, 0x000007,
+       0x000080, 0x48001A, 0x004904, 0x2F4186,
+       0x000007, 0x001210, 0x50003A, 0x005904,
+       0x2F9886, 0x000045, 0x0000C5, 0x7FFFF5,
+       0x7FFF7D, 0x07D524, 0x004224, 0x500102,
+       0x200502, 0x000082, 0x40001A, 0x004104,
+       0x2FC986, 0x000007, 0x003865, 0x40001A,
+       0x004020, 0x00104D, 0x04C184, 0x31AB86,
+       0x000040, 0x040007, 0x000165, 0x000145,
+       0x004020, 0x000040, 0x000765, 0x080080,
+       0x40001A, 0x004104, 0x305986, 0x000007,
+       0x001210, 0x40003A, 0x004104, 0x30B286,
+       0x00004D, 0x0000CD, 0x004810, 0x20043A,
+       0x000882, 0x40001A, 0x004104, 0x30C186,
+       0x000007, 0x004820, 0x005904, 0x319886,
+       0x000040, 0x0007E5, 0x200480, 0x2816A0,
+       0x3216E0, 0x3A16E0, 0x4216E0, 0x021260,
+       0x000040, 0x000032, 0x400075, 0x00007D,
+       0x07D574, 0x200512, 0x000082, 0x40001A,
+       0x004104, 0x317186, 0x000007, 0x038A06,
+       0x640007, 0x0000E5, 0x000020, 0x000040,
+       0x000A65, 0x000020, 0x020040, 0x020040,
+       0x000040, 0x000165, 0x000042, 0x70000A,
+       0x007104, 0x323286, 0x000007, 0x060007,
+       0x019A06, 0x640007, 0x050000, 0x007020,
+       0x000040, 0x038A06, 0x640007, 0x000007,
+       0x00306D, 0x028860, 0x029060, 0x08000A,
+       0x028860, 0x008040, 0x100012, 0x00100D,
+       0x009184, 0x32D186, 0x000E0D, 0x009184,
+       0x33E186, 0x000007, 0x300007, 0x001020,
+       0x003B6D, 0x008040, 0x000080, 0x08001A,
+       0x000904, 0x32F186, 0x000007, 0x001220,
+       0x000DED, 0x008040, 0x008042, 0x10000A,
+       0x40000D, 0x109544, 0x000007, 0x001020,
+       0x000DED, 0x008040, 0x008042, 0x20040A,
+       0x000082, 0x08001A, 0x000904, 0x338186,
+       0x000007, 0x003B6D, 0x008042, 0x08000A,
+       0x000E15, 0x010984, 0x342B86, 0x600007,
+       0x08001A, 0x000C15, 0x010984, 0x341386,
+       0x000020, 0x1A0007, 0x0002ED, 0x008040,
+       0x620007, 0x00306D, 0x028042, 0x0A804A,
+       0x000820, 0x0A804A, 0x000606, 0x10804A,
+       0x000007, 0x282512, 0x001F32, 0x05D2F4,
+       0x54D104, 0x00735C, 0x000786, 0x000007,
+       0x0C0007, 0x0A0007, 0x1C0007, 0x003465,
+       0x020040, 0x004820, 0x025060, 0x40000A,
+       0x024060, 0x000040, 0x454944, 0x000007,
+       0x004020, 0x003AE5, 0x000040, 0x0028E5,
+       0x000042, 0x48000A, 0x004904, 0x39F886,
+       0x002C65, 0x000042, 0x40000A, 0x0000D5,
+       0x454104, 0x000007, 0x000655, 0x054504,
+       0x368286, 0x0001D5, 0x054504, 0x368086,
+       0x002B65, 0x000042, 0x003AE5, 0x50004A,
+       0x40000A, 0x45C3D4, 0x000007, 0x454504,
+       0x000007, 0x0000CD, 0x444944, 0x000007,
+       0x454504, 0x000007, 0x00014D, 0x554944,
+       0x000007, 0x045144, 0x367986, 0x002C65,
+       0x000042, 0x48000A, 0x4CD104, 0x000007,
+       0x04C144, 0x368386, 0x000007, 0x160007,
+       0x002CE5, 0x040042, 0x40000A, 0x004020,
+       0x000040, 0x002965, 0x000042, 0x40000A,
+       0x004104, 0x36F086, 0x000007, 0x002402,
+       0x383206, 0x005C02, 0x0025E5, 0x000042,
+       0x40000A, 0x004274, 0x002AE5, 0x000042,
+       0x40000A, 0x004274, 0x500112, 0x0029E5,
+       0x000042, 0x40000A, 0x004234, 0x454104,
+       0x000007, 0x004020, 0x000040, 0x003EE5,
+       0x000020, 0x000040, 0x002DE5, 0x400152,
+       0x50000A, 0x045144, 0x37DA86, 0x0000C5,
+       0x003EE5, 0x004020, 0x000040, 0x002BE5,
+       0x000042, 0x40000A, 0x404254, 0x000007,
+       0x002AE5, 0x004020, 0x000040, 0x500132,
+       0x040134, 0x005674, 0x0029E5, 0x020042,
+       0x42000A, 0x000042, 0x50000A, 0x05417C,
+       0x0028E5, 0x000042, 0x48000A, 0x0000C5,
+       0x4CC144, 0x38A086, 0x0026E5, 0x0027E5,
+       0x020042, 0x40004A, 0x50000A, 0x00423C,
+       0x00567C, 0x0028E5, 0x004820, 0x000040,
+       0x281D12, 0x282512, 0x001F72, 0x002965,
+       0x000042, 0x40000A, 0x004104, 0x393A86,
+       0x0E0007, 0x160007, 0x1E0007, 0x003EE5,
+       0x000042, 0x40000A, 0x004104, 0x397886,
+       0x002D65, 0x000042, 0x28340A, 0x003465,
+       0x020042, 0x42004A, 0x004020, 0x4A004A,
+       0x50004A, 0x05D2F4, 0x54D104, 0x00735C,
+       0x39E186, 0x000007, 0x000606, 0x080007,
+       0x0C0007, 0x080007, 0x0A0007, 0x0001E5,
+       0x020045, 0x004020, 0x000060, 0x000365,
+       0x000040, 0x002E65, 0x001A20, 0x0A1A60,
+       0x000040, 0x003465, 0x020042, 0x42004A,
+       0x004020, 0x4A004A, 0x000606, 0x50004A,
+       0x0017FD, 0x018042, 0x08000A, 0x000904,
+       0x225A86, 0x000007, 0x00107D, 0x018042,
+       0x0011FD, 0x33804A, 0x19804A, 0x20000A,
+       0x000095, 0x2A1144, 0x01A144, 0x3B9086,
+       0x00040D, 0x00B184, 0x3B9186, 0x0018FD,
+       0x018042, 0x0010FD, 0x09804A, 0x38000A,
+       0x000095, 0x010924, 0x003A64, 0x3B8186,
+       0x000007, 0x003904, 0x3B9286, 0x000007,
+       0x3B9A06, 0x00000D, 0x00008D, 0x000820,
+       0x00387D, 0x018040, 0x700002, 0x00117D,
+       0x018042, 0x00197D, 0x29804A, 0x30000A,
+       0x380002, 0x003124, 0x000424, 0x000424,
+       0x002A24, 0x280502, 0x00068D, 0x000810,
+       0x28143A, 0x00750D, 0x00B124, 0x002264,
+       0x3D0386, 0x284402, 0x000810, 0x280C3A,
+       0x0B800D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00758D, 0x00B124, 0x100102,
+       0x012144, 0x3E4986, 0x001810, 0x10003A,
+       0x00387D, 0x018042, 0x08000A, 0x000904,
+       0x3E4886, 0x030000, 0x3E4A06, 0x0000BD,
+       0x00008D, 0x023164, 0x000A64, 0x280D02,
+       0x0B808D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00387D, 0x018042, 0x08000A,
+       0x000904, 0x3E3286, 0x030000, 0x0002FD,
+       0x018042, 0x08000A, 0x000904, 0x3D8286,
+       0x000007, 0x002810, 0x28043A, 0x00750D,
+       0x030924, 0x002264, 0x280D02, 0x02316C,
+       0x28450A, 0x0B810D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x00008D, 0x000A24,
+       0x3E4A06, 0x100102, 0x001810, 0x10003A,
+       0x0000BD, 0x003810, 0x30043A, 0x00187D,
+       0x018042, 0x0018FD, 0x09804A, 0x20000A,
+       0x0000AD, 0x028924, 0x07212C, 0x001010,
+       0x300583, 0x300D8B, 0x3014BB, 0x301C83,
+       0x002083, 0x00137D, 0x038042, 0x33844A,
+       0x33ACCB, 0x33B4CB, 0x33BCCB, 0x33C4CB,
+       0x33CCCB, 0x33D4CB, 0x305C8B, 0x006083,
+       0x001E0D, 0x0005FD, 0x018042, 0x20000A,
+       0x020924, 0x00068D, 0x00A96C, 0x00009D,
+       0x0002FD, 0x018042, 0x08000A, 0x000904,
+       0x3F6A86, 0x000007, 0x280502, 0x280D0A,
+       0x284402, 0x001810, 0x28143A, 0x0C008D,
+       0x000820, 0x0002FD, 0x018040, 0x220007,
+       0x003904, 0x225886, 0x001E0D, 0x00057D,
+       0x018042, 0x20000A, 0x020924, 0x0000A5,
+       0x0002FD, 0x018042, 0x08000A, 0x000904,
+       0x402A86, 0x000007, 0x280502, 0x280C02,
+       0x002010, 0x28143A, 0x0C010D, 0x000820,
+       0x0002FD, 0x018040, 0x225A06, 0x220007,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000
+};
+
+#endif //_HWMCODE_
+
+
index 4fa725f1aa002e4cdd8a1a694d7d6f206b4f6f57..a713d648ae3111dd28ee7629cf3ed1e9584dfbed 100644 (file)
@@ -307,6 +307,7 @@ if [ "$CONFIG_SOUND_OSS" = "y" -o "$CONFIG_SOUND_OSS" = "m" ]; then
   fi
   
   dep_tristate 'NM256AV/NM256ZX audio support' CONFIG_SOUND_NM256 $CONFIG_SOUND_OSS
+  dep_tristate 'Yamaha PCI legacy mode support' CONFIG_SOUND_YMPCI $CONFIG_SOUND_OSS
 
   # Additional low level drivers.
   
diff --git a/drivers/sound/Hwmcode.h b/drivers/sound/Hwmcode.h
new file mode 100644 (file)
index 0000000..2a3c1eb
--- /dev/null
@@ -0,0 +1,804 @@
+//=============================================================================
+// Copyright (c) 1997  Yamaha Corporation.     All Rights Reserved.
+//
+//     Title:
+//             hwmcode.c
+//     Desc:
+//             micro-code for CTRL & DSP
+//     HISTORY:
+//             April 03, 1997:         1st try by M. Mukojima
+//=============================================================================
+#define        YDSXG_DSPLENGTH                         0x0080
+#define        YDSXG_CTRLLENGTH                        0x3000
+
+
+static unsigned long int       gdwDSPCode[YDSXG_DSPLENGTH >> 2] = {
+       0x00000081, 0x000001a4, 0x0000000a, 0x0000002f,
+       0x00080253, 0x01800317, 0x0000407b, 0x0000843f,
+       0x0001483c, 0x0001943c, 0x0005d83c, 0x00001c3c,
+       0x0000c07b, 0x00050c3f, 0x0121503c, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000,
+       0x00000000, 0x00000000, 0x00000000, 0x00000000
+};
+
+
+// --------------------------------------------
+//  DS-1E Controller InstructionRAM Code
+//     1999/06/21
+//     Buf441 slot is Enabled.
+// --------------------------------------------
+// 04/09\81@creat
+// 04/12  stop nise fix
+// 06/21\81@WorkingOff timming
+static unsigned long   gdwCtrl1eCode[YDSXG_CTRLLENGTH >> 2] = {
+       0x000007, 0x240007, 0x0C0007, 0x1C0007,
+       0x060007, 0x700002, 0x000020, 0x030040,
+       0x007104, 0x004286, 0x030040, 0x000F0D,
+       0x000810, 0x20043A, 0x000282, 0x00020D,
+       0x000810, 0x20043A, 0x001282, 0x200E82,
+       0x00800D, 0x000810, 0x20043A, 0x001A82,
+       0x03460D, 0x000810, 0x10043A, 0x02EC0D,
+       0x000810, 0x18043A, 0x00010D, 0x020015,
+       0x0000FD, 0x000020, 0x038860, 0x039060,
+       0x038060, 0x038040, 0x038040, 0x038040,
+       0x018040, 0x000A7D, 0x038040, 0x038040,
+       0x018040, 0x200402, 0x000882, 0x08001A,
+       0x000904, 0x017186, 0x000007, 0x260007,
+       0x400007, 0x000007, 0x03258D, 0x000810,
+       0x18043A, 0x260007, 0x284402, 0x00087D,
+       0x018042, 0x00160A, 0x05A206, 0x000007,
+       0x440007, 0x00230D, 0x000810, 0x08043A,
+       0x22FA06, 0x000007, 0x0007FD, 0x018042,
+       0x08000A, 0x000904, 0x02AB86, 0x000195,
+       0x090D04, 0x000007, 0x000820, 0x0000F5,
+       0x000B7D, 0x01F060, 0x0000FD, 0x033A06,
+       0x018040, 0x000A7D, 0x038042, 0x13804A,
+       0x18000A, 0x001820, 0x059060, 0x058860,
+       0x018040, 0x0000FD, 0x018042, 0x70000A,
+       0x000115, 0x071144, 0x033B86, 0x030000,
+       0x007020, 0x036206, 0x018040, 0x00360D,
+       0x000810, 0x08043A, 0x232206, 0x000007,
+       0x02EC0D, 0x000810, 0x18043A, 0x019A06,
+       0x000007, 0x240007, 0x000F8D, 0x000810,
+       0x00163A, 0x002402, 0x005C02, 0x0028FD,
+       0x000020, 0x018040, 0x08000D, 0x000815,
+       0x510984, 0x000007, 0x00004D, 0x000E5D,
+       0x000E02, 0x00430D, 0x000810, 0x08043A,
+       0x2E1206, 0x000007, 0x00008D, 0x000924,
+       0x000F02, 0x00470D, 0x000810, 0x08043A,
+       0x2E1206, 0x000007, 0x480480, 0x001210,
+       0x28043A, 0x00778D, 0x000810, 0x280C3A,
+       0x00068D, 0x000810, 0x28143A, 0x284402,
+       0x03258D, 0x000810, 0x18043A, 0x07FF8D,
+       0x000820, 0x0002FD, 0x018040, 0x260007,
+       0x200007, 0x0002FD, 0x018042, 0x08000A,
+       0x000904, 0x051286, 0x000007, 0x240007,
+       0x02EC0D, 0x000810, 0x18043A, 0x00387D,
+       0x018042, 0x08000A, 0x001015, 0x010984,
+       0x019B86, 0x000007, 0x01B206, 0x000007,
+       0x0008FD, 0x018042, 0x18000A, 0x001904,
+       0x22B886, 0x280007, 0x001810, 0x28043A,
+       0x280C02, 0x00000D, 0x000810, 0x28143A,
+       0x08808D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00020D, 0x189904, 0x000007,
+       0x00402D, 0x0000BD, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x065A86, 0x000007,
+       0x000100, 0x000A20, 0x00047D, 0x018040,
+       0x018042, 0x20000A, 0x003015, 0x012144,
+       0x036186, 0x000007, 0x002104, 0x036186,
+       0x000007, 0x000F8D, 0x000810, 0x280C3A,
+       0x023944, 0x07C986, 0x000007, 0x001810,
+       0x28043A, 0x08810D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x002810, 0x78003A,
+       0x00788D, 0x000810, 0x08043A, 0x2A1206,
+       0x000007, 0x00400D, 0x001015, 0x189904,
+       0x292904, 0x393904, 0x000007, 0x070206,
+       0x000007, 0x0004F5, 0x00007D, 0x000020,
+       0x00008D, 0x010860, 0x018040, 0x00047D,
+       0x038042, 0x21804A, 0x18000A, 0x021944,
+       0x229086, 0x000007, 0x004075, 0x71F104,
+       0x000007, 0x010042, 0x28000A, 0x002904,
+       0x225886, 0x000007, 0x003C0D, 0x30A904,
+       0x000007, 0x00077D, 0x018042, 0x08000A,
+       0x000904, 0x08DA86, 0x00057D, 0x002820,
+       0x03B060, 0x08F206, 0x018040, 0x003020,
+       0x03A860, 0x018040, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x08FA86, 0x000007,
+       0x00057D, 0x018042, 0x28040A, 0x000E8D,
+       0x000810, 0x280C3A, 0x00000D, 0x000810,
+       0x28143A, 0x09000D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x003DFD, 0x000020,
+       0x018040, 0x00107D, 0x009D8D, 0x000810,
+       0x08043A, 0x2A1206, 0x000007, 0x000815,
+       0x08001A, 0x010984, 0x0A5186, 0x00137D,
+       0x200500, 0x280F20, 0x338F60, 0x3B8F60,
+       0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
+       0x038A60, 0x018040, 0x00107D, 0x018042,
+       0x08000A, 0x000215, 0x010984, 0x3A8186,
+       0x000007, 0x007FBD, 0x383DC4, 0x000007,
+       0x001A7D, 0x001375, 0x018042, 0x09004A,
+       0x10000A, 0x0B8D04, 0x139504, 0x000007,
+       0x000820, 0x019060, 0x001104, 0x225886,
+       0x010040, 0x0017FD, 0x018042, 0x08000A,
+       0x000904, 0x225A86, 0x000007, 0x00197D,
+       0x038042, 0x09804A, 0x10000A, 0x000924,
+       0x001664, 0x0011FD, 0x038042, 0x2B804A,
+       0x19804A, 0x00008D, 0x218944, 0x000007,
+       0x002244, 0x0C1986, 0x000007, 0x001A64,
+       0x002A24, 0x00197D, 0x080102, 0x100122,
+       0x000820, 0x039060, 0x018040, 0x003DFD,
+       0x00008D, 0x000820, 0x018040, 0x001375,
+       0x001A7D, 0x010042, 0x09804A, 0x10000A,
+       0x00021D, 0x0189E4, 0x2992E4, 0x309144,
+       0x000007, 0x00060D, 0x000A15, 0x000C1D,
+       0x001025, 0x00A9E4, 0x012BE4, 0x000464,
+       0x01B3E4, 0x0232E4, 0x000464, 0x000464,
+       0x000464, 0x000464, 0x00040D, 0x08B1C4,
+       0x000007, 0x000820, 0x000BF5, 0x030040,
+       0x00197D, 0x038042, 0x09804A, 0x000A24,
+       0x08000A, 0x080E64, 0x000007, 0x100122,
+       0x000820, 0x031060, 0x010040, 0x0064AC,
+       0x00027D, 0x000020, 0x018040, 0x00107D,
+       0x018042, 0x0011FD, 0x3B804A, 0x09804A,
+       0x20000A, 0x000095, 0x1A1144, 0x00A144,
+       0x0E5886, 0x00040D, 0x00B984, 0x0E5986,
+       0x0018FD, 0x018042, 0x0010FD, 0x09804A,
+       0x28000A, 0x000095, 0x010924, 0x002A64,
+       0x0E4986, 0x000007, 0x002904, 0x0E5A86,
+       0x000007, 0x0E6206, 0x080002, 0x00008D,
+       0x00387D, 0x000820, 0x018040, 0x00127D,
+       0x018042, 0x10000A, 0x003904, 0x0F0986,
+       0x00080D, 0x7FFFB5, 0x00B984, 0x0ED986,
+       0x000025, 0x0FB206, 0x00002D, 0x000015,
+       0x00082D, 0x02E00D, 0x000820, 0x0FFA06,
+       0x00000D, 0x7F8035, 0x00B984, 0x0FA986,
+       0x400025, 0x00008D, 0x110944, 0x000007,
+       0x00018D, 0x109504, 0x000007, 0x009164,
+       0x000424, 0x000424, 0x000424, 0x100102,
+       0x280002, 0x02DF0D, 0x000820, 0x0FFA06,
+       0x00018D, 0x00042D, 0x00008D, 0x109504,
+       0x000007, 0x00020D, 0x109184, 0x000007,
+       0x02DF8D, 0x000820, 0x00008D, 0x0038FD,
+       0x018040, 0x003BFD, 0x001020, 0x03A860,
+       0x000815, 0x313184, 0x212184, 0x000007,
+       0x03B060, 0x03A060, 0x018040, 0x0022FD,
+       0x000095, 0x010924, 0x000424, 0x000424,
+       0x001264, 0x100102, 0x000820, 0x039060,
+       0x018040, 0x001924, 0x010F0D, 0x00397D,
+       0x000820, 0x058040, 0x038042, 0x09844A,
+       0x000606, 0x08040A, 0x000424, 0x000424,
+       0x00117D, 0x018042, 0x08000A, 0x000A24,
+       0x280502, 0x280C02, 0x09800D, 0x000820,
+       0x0002FD, 0x018040, 0x200007, 0x0022FD,
+       0x018042, 0x08000A, 0x000095, 0x280DC4,
+       0x011924, 0x00197D, 0x018042, 0x0011FD,
+       0x09804A, 0x10000A, 0x0000B5, 0x113144,
+       0x0A8D04, 0x000007, 0x080A44, 0x129504,
+       0x000007, 0x0023FD, 0x001020, 0x038040,
+       0x101244, 0x000007, 0x000820, 0x039060,
+       0x018040, 0x0002FD, 0x018042, 0x08000A,
+       0x000904, 0x123286, 0x000007, 0x003BFD,
+       0x000100, 0x000A10, 0x0B807A, 0x13804A,
+       0x090984, 0x000007, 0x000095, 0x013D04,
+       0x12B886, 0x10000A, 0x100002, 0x090984,
+       0x000007, 0x038042, 0x11804A, 0x090D04,
+       0x000007, 0x10000A, 0x090D84, 0x000007,
+       0x00257D, 0x000820, 0x018040, 0x00010D,
+       0x000810, 0x28143A, 0x00127D, 0x018042,
+       0x20000A, 0x00197D, 0x018042, 0x00117D,
+       0x31804A, 0x10000A, 0x003124, 0x013B8D,
+       0x00397D, 0x000820, 0x058040, 0x038042,
+       0x09844A, 0x000606, 0x08040A, 0x300102,
+       0x003124, 0x000424, 0x000424, 0x001224,
+       0x280502, 0x001A4C, 0x143986, 0x700002,
+       0x00002D, 0x030000, 0x00387D, 0x018042,
+       0x10000A, 0x146206, 0x002124, 0x0000AD,
+       0x100002, 0x00010D, 0x000924, 0x006B24,
+       0x014A0D, 0x00397D, 0x000820, 0x058040,
+       0x038042, 0x09844A, 0x000606, 0x08040A,
+       0x003264, 0x00008D, 0x000A24, 0x001020,
+       0x00227D, 0x018040, 0x014F8D, 0x000810,
+       0x08043A, 0x2B5A06, 0x000007, 0x002820,
+       0x00207D, 0x018040, 0x00117D, 0x038042,
+       0x13804A, 0x33800A, 0x00387D, 0x018042,
+       0x08000A, 0x000904, 0x177286, 0x000007,
+       0x00008D, 0x030964, 0x015B0D, 0x00397D,
+       0x000820, 0x058040, 0x038042, 0x09844A,
+       0x000606, 0x08040A, 0x380102, 0x000424,
+       0x000424, 0x001224, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x15DA86, 0x000007,
+       0x280502, 0x001A4C, 0x177186, 0x000007,
+       0x032164, 0x00632C, 0x003DFD, 0x018042,
+       0x08000A, 0x000095, 0x090904, 0x000007,
+       0x000820, 0x001A4C, 0x169986, 0x018040,
+       0x030000, 0x16B206, 0x002124, 0x00010D,
+       0x000924, 0x006B24, 0x016F0D, 0x00397D,
+       0x000820, 0x058040, 0x038042, 0x09844A,
+       0x000606, 0x08040A, 0x003A64, 0x000095,
+       0x001224, 0x0002FD, 0x018042, 0x08000A,
+       0x000904, 0x171286, 0x000007, 0x01760D,
+       0x000810, 0x08043A, 0x2B5A06, 0x000007,
+       0x160A06, 0x000007, 0x007020, 0x08010A,
+       0x10012A, 0x0020FD, 0x038860, 0x039060,
+       0x018040, 0x00227D, 0x018042, 0x003DFD,
+       0x08000A, 0x31844A, 0x000904, 0x181086,
+       0x18008B, 0x00008D, 0x189904, 0x00312C,
+       0x18E206, 0x000007, 0x00324C, 0x186B86,
+       0x000007, 0x001904, 0x186886, 0x000007,
+       0x000095, 0x199144, 0x00222C, 0x003124,
+       0x00636C, 0x000E3D, 0x001375, 0x000BFD,
+       0x010042, 0x09804A, 0x10000A, 0x038AEC,
+       0x0393EC, 0x00224C, 0x18E186, 0x000007,
+       0x00008D, 0x189904, 0x00226C, 0x00322C,
+       0x30050A, 0x301DAB, 0x002083, 0x0018FD,
+       0x018042, 0x08000A, 0x018924, 0x300502,
+       0x001083, 0x001875, 0x010042, 0x10000A,
+       0x00008D, 0x010924, 0x001375, 0x330542,
+       0x330CCB, 0x332CCB, 0x3334CB, 0x333CCB,
+       0x3344CB, 0x334CCB, 0x3354CB, 0x305C8B,
+       0x006083, 0x0002F5, 0x010042, 0x08000A,
+       0x000904, 0x19B286, 0x000007, 0x001E2D,
+       0x0005FD, 0x018042, 0x08000A, 0x028924,
+       0x280502, 0x00060D, 0x000810, 0x280C3A,
+       0x00008D, 0x000810, 0x28143A, 0x0A808D,
+       0x000820, 0x0002F5, 0x010040, 0x220007,
+       0x001275, 0x030042, 0x21004A, 0x00008D,
+       0x1A0944, 0x000007, 0x01AB8D, 0x000810,
+       0x08043A, 0x2CAA06, 0x000007, 0x0001F5,
+       0x030042, 0x0D004A, 0x10000A, 0x089144,
+       0x000007, 0x000820, 0x010040, 0x0025F5,
+       0x0A3144, 0x000007, 0x000820, 0x032860,
+       0x030040, 0x00217D, 0x038042, 0x0B804A,
+       0x10000A, 0x000820, 0x031060, 0x030040,
+       0x00008D, 0x000124, 0x00012C, 0x000E64,
+       0x001A64, 0x00636C, 0x08010A, 0x10012A,
+       0x000820, 0x031060, 0x030040, 0x0020FD,
+       0x018042, 0x08000A, 0x00227D, 0x018042,
+       0x10000A, 0x000820, 0x031060, 0x030040,
+       0x00197D, 0x018042, 0x08000A, 0x0022FD,
+       0x038042, 0x10000A, 0x000820, 0x031060,
+       0x030040, 0x090D04, 0x000007, 0x000820,
+       0x030040, 0x038042, 0x0B804A, 0x10000A,
+       0x000820, 0x031060, 0x030040, 0x038042,
+       0x13804A, 0x19804A, 0x110D04, 0x198D04,
+       0x000007, 0x08000A, 0x001020, 0x031860,
+       0x030860, 0x030040, 0x00008D, 0x0B0944,
+       0x000007, 0x000820, 0x010040, 0x0005F5,
+       0x030042, 0x08000A, 0x000820, 0x010040,
+       0x0000F5, 0x010042, 0x08000A, 0x000904,
+       0x1D9886, 0x001E75, 0x030042, 0x01044A,
+       0x000C0A, 0x1DAA06, 0x000007, 0x000402,
+       0x000C02, 0x00177D, 0x001AF5, 0x018042,
+       0x03144A, 0x031C4A, 0x03244A, 0x032C4A,
+       0x03344A, 0x033C4A, 0x03444A, 0x004C0A,
+       0x00043D, 0x0013F5, 0x001AFD, 0x030042,
+       0x0B004A, 0x1B804A, 0x13804A, 0x20000A,
+       0x089144, 0x19A144, 0x0389E4, 0x0399EC,
+       0x005502, 0x005D0A, 0x030042, 0x0B004A,
+       0x1B804A, 0x13804A, 0x20000A, 0x089144,
+       0x19A144, 0x0389E4, 0x0399EC, 0x006502,
+       0x006D0A, 0x030042, 0x0B004A, 0x19004A,
+       0x2B804A, 0x13804A, 0x21804A, 0x30000A,
+       0x089144, 0x19A144, 0x2AB144, 0x0389E4,
+       0x0399EC, 0x007502, 0x007D0A, 0x03A9E4,
+       0x000702, 0x00107D, 0x000415, 0x018042,
+       0x08000A, 0x0109E4, 0x000F02, 0x002AF5,
+       0x0019FD, 0x010042, 0x09804A, 0x10000A,
+       0x000934, 0x001674, 0x0029F5, 0x010042,
+       0x10000A, 0x00917C, 0x002075, 0x010042,
+       0x08000A, 0x000904, 0x200A86, 0x0026F5,
+       0x0027F5, 0x030042, 0x09004A, 0x10000A,
+       0x000A3C, 0x00167C, 0x001A75, 0x000BFD,
+       0x010042, 0x51804A, 0x48000A, 0x160007,
+       0x001075, 0x010042, 0x282C0A, 0x281D12,
+       0x282512, 0x001F32, 0x1E0007, 0x0E0007,
+       0x001975, 0x010042, 0x002DF5, 0x0D004A,
+       0x10000A, 0x009144, 0x20EA86, 0x010042,
+       0x28340A, 0x000E5D, 0x00008D, 0x000375,
+       0x000820, 0x010040, 0x05D2F4, 0x54D104,
+       0x00735C, 0x218B86, 0x000007, 0x0C0007,
+       0x080007, 0x0A0007, 0x02178D, 0x000810,
+       0x08043A, 0x34B206, 0x000007, 0x219206,
+       0x000007, 0x080007, 0x002275, 0x010042,
+       0x20000A, 0x002104, 0x225886, 0x001E2D,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x21CA86, 0x000007, 0x002010, 0x30043A,
+       0x00057D, 0x0180C3, 0x08000A, 0x028924,
+       0x280502, 0x280C02, 0x0A810D, 0x000820,
+       0x0002F5, 0x010040, 0x220007, 0x0004FD,
+       0x018042, 0x70000A, 0x030000, 0x007020,
+       0x07FA06, 0x018040, 0x022B8D, 0x000810,
+       0x08043A, 0x2CAA06, 0x000007, 0x0002FD,
+       0x018042, 0x08000A, 0x000904, 0x22C286,
+       0x000007, 0x020206, 0x000007, 0x000875,
+       0x0009FD, 0x00010D, 0x234206, 0x000295,
+       0x000B75, 0x00097D, 0x00000D, 0x000515,
+       0x010042, 0x18000A, 0x001904, 0x2A0086,
+       0x0006F5, 0x001020, 0x010040, 0x0004F5,
+       0x000820, 0x010040, 0x000775, 0x010042,
+       0x09804A, 0x10000A, 0x001124, 0x000904,
+       0x23F286, 0x000815, 0x080102, 0x101204,
+       0x241206, 0x000575, 0x081204, 0x000007,
+       0x100102, 0x000575, 0x000425, 0x021124,
+       0x100102, 0x000820, 0x031060, 0x010040,
+       0x001924, 0x2A0086, 0x00008D, 0x000464,
+       0x009D04, 0x291086, 0x180102, 0x000575,
+       0x010042, 0x28040A, 0x00018D, 0x000924,
+       0x280D02, 0x00000D, 0x000924, 0x281502,
+       0x10000D, 0x000820, 0x0002F5, 0x010040,
+       0x200007, 0x001175, 0x0002FD, 0x018042,
+       0x08000A, 0x000904, 0x24FA86, 0x000007,
+       0x000100, 0x080B20, 0x130B60, 0x1B0B60,
+       0x030A60, 0x010040, 0x050042, 0x3D004A,
+       0x35004A, 0x2D004A, 0x20000A, 0x0006F5,
+       0x010042, 0x28140A, 0x0004F5, 0x010042,
+       0x08000A, 0x000315, 0x010D04, 0x260286,
+       0x004015, 0x000095, 0x010D04, 0x25F086,
+       0x100022, 0x10002A, 0x261A06, 0x000007,
+       0x333104, 0x2AA904, 0x000007, 0x032124,
+       0x280502, 0x284402, 0x001124, 0x400102,
+       0x000424, 0x000424, 0x003224, 0x00292C,
+       0x00636C, 0x277386, 0x000007, 0x02B164,
+       0x000464, 0x000464, 0x00008D, 0x000A64,
+       0x280D02, 0x10008D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x00008D, 0x38B904,
+       0x000007, 0x03296C, 0x30010A, 0x0002F5,
+       0x010042, 0x08000A, 0x000904, 0x270286,
+       0x000007, 0x00212C, 0x28050A, 0x00316C,
+       0x00046C, 0x00046C, 0x28450A, 0x001124,
+       0x006B64, 0x100102, 0x00008D, 0x01096C,
+       0x280D0A, 0x10010D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x004124, 0x000424,
+       0x000424, 0x003224, 0x300102, 0x032944,
+       0x27FA86, 0x000007, 0x300002, 0x0004F5,
+       0x010042, 0x08000A, 0x000315, 0x010D04,
+       0x284086, 0x003124, 0x000464, 0x300102,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x284A86, 0x000007, 0x284402, 0x003124,
+       0x300502, 0x003924, 0x300583, 0x000883,
+       0x0005F5, 0x010042, 0x28040A, 0x00008D,
+       0x008124, 0x280D02, 0x00008D, 0x008124,
+       0x281502, 0x10018D, 0x000820, 0x0002F5,
+       0x010040, 0x220007, 0x001025, 0x000575,
+       0x030042, 0x09004A, 0x10000A, 0x0A0904,
+       0x121104, 0x000007, 0x001020, 0x050860,
+       0x050040, 0x0006FD, 0x018042, 0x09004A,
+       0x10000A, 0x0000A5, 0x0A0904, 0x121104,
+       0x000007, 0x000820, 0x019060, 0x010040,
+       0x0002F5, 0x010042, 0x08000A, 0x000904,
+       0x29CA86, 0x000007, 0x244206, 0x000007,
+       0x000606, 0x000007, 0x0002F5, 0x010042,
+       0x08000A, 0x000904, 0x2A1A86, 0x000007,
+       0x000100, 0x080B20, 0x138B60, 0x1B8B60,
+       0x238B60, 0x2B8B60, 0x338B60, 0x3B8B60,
+       0x438B60, 0x4B8B60, 0x538B60, 0x5B8B60,
+       0x638B60, 0x6B8B60, 0x738B60, 0x7B8B60,
+       0x038F60, 0x0B8F60, 0x138F60, 0x1B8F60,
+       0x238F60, 0x2B8F60, 0x338F60, 0x3B8F60,
+       0x438F60, 0x4B8F60, 0x538F60, 0x5B8F60,
+       0x638F60, 0x6B8F60, 0x738F60, 0x7B8F60,
+       0x038A60, 0x000606, 0x018040, 0x00008D,
+       0x000A64, 0x280D02, 0x000A24, 0x00027D,
+       0x018042, 0x10000A, 0x001224, 0x0003FD,
+       0x018042, 0x08000A, 0x000904, 0x2C0A86,
+       0x000007, 0x00018D, 0x000A24, 0x000464,
+       0x000464, 0x080102, 0x000924, 0x000424,
+       0x000424, 0x100102, 0x02000D, 0x009144,
+       0x2C6186, 0x000007, 0x0001FD, 0x018042,
+       0x08000A, 0x000A44, 0x2C4386, 0x018042,
+       0x0A000D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00027D, 0x001020, 0x000606,
+       0x018040, 0x0002F5, 0x010042, 0x08000A,
+       0x000904, 0x2CB286, 0x000007, 0x00037D,
+       0x018042, 0x08000A, 0x000904, 0x2CE286,
+       0x000007, 0x000075, 0x002E7D, 0x010042,
+       0x0B804A, 0x000020, 0x000904, 0x000686,
+       0x010040, 0x31844A, 0x30048B, 0x000883,
+       0x00008D, 0x000810, 0x28143A, 0x00008D,
+       0x000810, 0x280C3A, 0x000675, 0x010042,
+       0x08000A, 0x003815, 0x010924, 0x280502,
+       0x0B000D, 0x000820, 0x0002F5, 0x010040,
+       0x000606, 0x220007, 0x000464, 0x000464,
+       0x000606, 0x000007, 0x000134, 0x007F8D,
+       0x00093C, 0x281D12, 0x282512, 0x001F32,
+       0x0E0007, 0x00010D, 0x00037D, 0x000820,
+       0x018040, 0x05D2F4, 0x000007, 0x080007,
+       0x00037D, 0x018042, 0x08000A, 0x000904,
+       0x2E8A86, 0x000007, 0x000606, 0x000007,
+       0x000007, 0x000012, 0x100007, 0x320007,
+       0x600007, 0x460007, 0x100080, 0x48001A,
+       0x004904, 0x2EF186, 0x000007, 0x001210,
+       0x58003A, 0x000145, 0x5C5D04, 0x000007,
+       0x000080, 0x48001A, 0x004904, 0x2F4186,
+       0x000007, 0x001210, 0x50003A, 0x005904,
+       0x2F9886, 0x000045, 0x0000C5, 0x7FFFF5,
+       0x7FFF7D, 0x07D524, 0x004224, 0x500102,
+       0x200502, 0x000082, 0x40001A, 0x004104,
+       0x2FC986, 0x000007, 0x003865, 0x40001A,
+       0x004020, 0x00104D, 0x04C184, 0x31AB86,
+       0x000040, 0x040007, 0x000165, 0x000145,
+       0x004020, 0x000040, 0x000765, 0x080080,
+       0x40001A, 0x004104, 0x305986, 0x000007,
+       0x001210, 0x40003A, 0x004104, 0x30B286,
+       0x00004D, 0x0000CD, 0x004810, 0x20043A,
+       0x000882, 0x40001A, 0x004104, 0x30C186,
+       0x000007, 0x004820, 0x005904, 0x319886,
+       0x000040, 0x0007E5, 0x200480, 0x2816A0,
+       0x3216E0, 0x3A16E0, 0x4216E0, 0x021260,
+       0x000040, 0x000032, 0x400075, 0x00007D,
+       0x07D574, 0x200512, 0x000082, 0x40001A,
+       0x004104, 0x317186, 0x000007, 0x038A06,
+       0x640007, 0x0000E5, 0x000020, 0x000040,
+       0x000A65, 0x000020, 0x020040, 0x020040,
+       0x000040, 0x000165, 0x000042, 0x70000A,
+       0x007104, 0x323286, 0x000007, 0x060007,
+       0x019A06, 0x640007, 0x050000, 0x007020,
+       0x000040, 0x038A06, 0x640007, 0x000007,
+       0x00306D, 0x028860, 0x029060, 0x08000A,
+       0x028860, 0x008040, 0x100012, 0x00100D,
+       0x009184, 0x32D186, 0x000E0D, 0x009184,
+       0x33E186, 0x000007, 0x300007, 0x001020,
+       0x003B6D, 0x008040, 0x000080, 0x08001A,
+       0x000904, 0x32F186, 0x000007, 0x001220,
+       0x000DED, 0x008040, 0x008042, 0x10000A,
+       0x40000D, 0x109544, 0x000007, 0x001020,
+       0x000DED, 0x008040, 0x008042, 0x20040A,
+       0x000082, 0x08001A, 0x000904, 0x338186,
+       0x000007, 0x003B6D, 0x008042, 0x08000A,
+       0x000E15, 0x010984, 0x342B86, 0x600007,
+       0x08001A, 0x000C15, 0x010984, 0x341386,
+       0x000020, 0x1A0007, 0x0002ED, 0x008040,
+       0x620007, 0x00306D, 0x028042, 0x0A804A,
+       0x000820, 0x0A804A, 0x000606, 0x10804A,
+       0x000007, 0x282512, 0x001F32, 0x05D2F4,
+       0x54D104, 0x00735C, 0x000786, 0x000007,
+       0x0C0007, 0x0A0007, 0x1C0007, 0x003465,
+       0x020040, 0x004820, 0x025060, 0x40000A,
+       0x024060, 0x000040, 0x454944, 0x000007,
+       0x004020, 0x003AE5, 0x000040, 0x0028E5,
+       0x000042, 0x48000A, 0x004904, 0x39F886,
+       0x002C65, 0x000042, 0x40000A, 0x0000D5,
+       0x454104, 0x000007, 0x000655, 0x054504,
+       0x368286, 0x0001D5, 0x054504, 0x368086,
+       0x002B65, 0x000042, 0x003AE5, 0x50004A,
+       0x40000A, 0x45C3D4, 0x000007, 0x454504,
+       0x000007, 0x0000CD, 0x444944, 0x000007,
+       0x454504, 0x000007, 0x00014D, 0x554944,
+       0x000007, 0x045144, 0x367986, 0x002C65,
+       0x000042, 0x48000A, 0x4CD104, 0x000007,
+       0x04C144, 0x368386, 0x000007, 0x160007,
+       0x002CE5, 0x040042, 0x40000A, 0x004020,
+       0x000040, 0x002965, 0x000042, 0x40000A,
+       0x004104, 0x36F086, 0x000007, 0x002402,
+       0x383206, 0x005C02, 0x0025E5, 0x000042,
+       0x40000A, 0x004274, 0x002AE5, 0x000042,
+       0x40000A, 0x004274, 0x500112, 0x0029E5,
+       0x000042, 0x40000A, 0x004234, 0x454104,
+       0x000007, 0x004020, 0x000040, 0x003EE5,
+       0x000020, 0x000040, 0x002DE5, 0x400152,
+       0x50000A, 0x045144, 0x37DA86, 0x0000C5,
+       0x003EE5, 0x004020, 0x000040, 0x002BE5,
+       0x000042, 0x40000A, 0x404254, 0x000007,
+       0x002AE5, 0x004020, 0x000040, 0x500132,
+       0x040134, 0x005674, 0x0029E5, 0x020042,
+       0x42000A, 0x000042, 0x50000A, 0x05417C,
+       0x0028E5, 0x000042, 0x48000A, 0x0000C5,
+       0x4CC144, 0x38A086, 0x0026E5, 0x0027E5,
+       0x020042, 0x40004A, 0x50000A, 0x00423C,
+       0x00567C, 0x0028E5, 0x004820, 0x000040,
+       0x281D12, 0x282512, 0x001F72, 0x002965,
+       0x000042, 0x40000A, 0x004104, 0x393A86,
+       0x0E0007, 0x160007, 0x1E0007, 0x003EE5,
+       0x000042, 0x40000A, 0x004104, 0x397886,
+       0x002D65, 0x000042, 0x28340A, 0x003465,
+       0x020042, 0x42004A, 0x004020, 0x4A004A,
+       0x50004A, 0x05D2F4, 0x54D104, 0x00735C,
+       0x39E186, 0x000007, 0x000606, 0x080007,
+       0x0C0007, 0x080007, 0x0A0007, 0x0001E5,
+       0x020045, 0x004020, 0x000060, 0x000365,
+       0x000040, 0x002E65, 0x001A20, 0x0A1A60,
+       0x000040, 0x003465, 0x020042, 0x42004A,
+       0x004020, 0x4A004A, 0x000606, 0x50004A,
+       0x0017FD, 0x018042, 0x08000A, 0x000904,
+       0x225A86, 0x000007, 0x00107D, 0x018042,
+       0x0011FD, 0x33804A, 0x19804A, 0x20000A,
+       0x000095, 0x2A1144, 0x01A144, 0x3B9086,
+       0x00040D, 0x00B184, 0x3B9186, 0x0018FD,
+       0x018042, 0x0010FD, 0x09804A, 0x38000A,
+       0x000095, 0x010924, 0x003A64, 0x3B8186,
+       0x000007, 0x003904, 0x3B9286, 0x000007,
+       0x3B9A06, 0x00000D, 0x00008D, 0x000820,
+       0x00387D, 0x018040, 0x700002, 0x00117D,
+       0x018042, 0x00197D, 0x29804A, 0x30000A,
+       0x380002, 0x003124, 0x000424, 0x000424,
+       0x002A24, 0x280502, 0x00068D, 0x000810,
+       0x28143A, 0x00750D, 0x00B124, 0x002264,
+       0x3D0386, 0x284402, 0x000810, 0x280C3A,
+       0x0B800D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00758D, 0x00B124, 0x100102,
+       0x012144, 0x3E4986, 0x001810, 0x10003A,
+       0x00387D, 0x018042, 0x08000A, 0x000904,
+       0x3E4886, 0x030000, 0x3E4A06, 0x0000BD,
+       0x00008D, 0x023164, 0x000A64, 0x280D02,
+       0x0B808D, 0x000820, 0x0002FD, 0x018040,
+       0x200007, 0x00387D, 0x018042, 0x08000A,
+       0x000904, 0x3E3286, 0x030000, 0x0002FD,
+       0x018042, 0x08000A, 0x000904, 0x3D8286,
+       0x000007, 0x002810, 0x28043A, 0x00750D,
+       0x030924, 0x002264, 0x280D02, 0x02316C,
+       0x28450A, 0x0B810D, 0x000820, 0x0002FD,
+       0x018040, 0x200007, 0x00008D, 0x000A24,
+       0x3E4A06, 0x100102, 0x001810, 0x10003A,
+       0x0000BD, 0x003810, 0x30043A, 0x00187D,
+       0x018042, 0x0018FD, 0x09804A, 0x20000A,
+       0x0000AD, 0x028924, 0x07212C, 0x001010,
+       0x300583, 0x300D8B, 0x3014BB, 0x301C83,
+       0x002083, 0x00137D, 0x038042, 0x33844A,
+       0x33ACCB, 0x33B4CB, 0x33BCCB, 0x33C4CB,
+       0x33CCCB, 0x33D4CB, 0x305C8B, 0x006083,
+       0x001E0D, 0x0005FD, 0x018042, 0x20000A,
+       0x020924, 0x00068D, 0x00A96C, 0x00009D,
+       0x0002FD, 0x018042, 0x08000A, 0x000904,
+       0x3F6A86, 0x000007, 0x280502, 0x280D0A,
+       0x284402, 0x001810, 0x28143A, 0x0C008D,
+       0x000820, 0x0002FD, 0x018040, 0x220007,
+       0x003904, 0x225886, 0x001E0D, 0x00057D,
+       0x018042, 0x20000A, 0x020924, 0x0000A5,
+       0x0002FD, 0x018042, 0x08000A, 0x000904,
+       0x402A86, 0x000007, 0x280502, 0x280C02,
+       0x002010, 0x28143A, 0x0C010D, 0x000820,
+       0x0002FD, 0x018040, 0x225A06, 0x220007,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000,
+       0x000000, 0x000000, 0x000000, 0x000000
+};
index c3f1f34b64f34329e41599a94823e560db29d261..1b1751ad865008cef7c0e2a8490907701f13870e 100644 (file)
@@ -54,6 +54,7 @@ obj-$(CONFIG_SOUND_CS4232)    += uart401.o
 obj-$(CONFIG_SOUND_GUS)                += gus.o ad1848.o
 obj-$(CONFIG_SOUND_MAD16)      += mad16.o ad1848.o sb.o uart401.o
 obj-$(CONFIG_SOUND_VIA82CXXX)  += via82cxxx.o sb.o uart401.o 
+obj-$(CONFIG_SOUND_YMPCI)      += ymf_sb.o sb.o uart401.o ac97_codec.o
 obj-$(CONFIG_SOUND_MAUI)       += maui.o mpu401.o
 obj-$(CONFIG_SOUND_MPU401)     += mpu401.o
 obj-$(CONFIG_SOUND_MSNDCLAS)   += msnd.o msnd_classic.o
index 23c6e77ecd65885f29013211e17ea497fa20b25b..0c050c7b5358de5ef755c67cacadd42f743958d0 100644 (file)
@@ -489,6 +489,44 @@ static void set_dac_rate(struct cm_state *s, unsigned rate)
                }
        }
        s->ratedac = rate;
+       if ( !(inb(s->iobase+CODEC_CMI_FUNCTRL1)&0x80) ) {
+               int functrl1;
+               outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) & ~0x80, s->iobase + CODEC_CMI_FUNCTRL1);
+               if ( rate == 44100 || rate == 48000 ) {
+                       functrl1 = inb(s->iobase + 0x16);
+                       functrl1 |=  0x80;  /* enable XSPDIF/OUT */
+                       outb(functrl1, s->iobase + 0x16);
+                       functrl1 = inb(s->iobase + 0x16);
+                       functrl1 |=  0x20;  /* enable DAC2SPDO */
+                       outb(functrl1, s->iobase + 0x16);
+                       functrl1 = inb(s->iobase + 0x19);
+                       if ( rate == 44100 )
+                               functrl1 &= ~0x80;  /* 0:44.1/ 1:48kHz */
+                       else
+                               functrl1 |=  0x80;  /* 0:44.1/ 1:48kHz */
+                       outb(functrl1, s->iobase + 0x19);
+                       functrl1 = inb(s->iobase + 0x05);
+                       functrl1 |=  0x01;  /* SPDIF out */
+                       outb(functrl1, s->iobase + 0x05);
+                       functrl1 = inb(s->iobase + 0x24);
+                       functrl1 &=  ~0x01;  /* SPDIF in to DAC*/
+                       outb(functrl1, s->iobase + 0x24);
+               }
+               else {
+                       functrl1 = inb(s->iobase + 0x16);
+                       functrl1 &= ~0x80;  /* disable XSPDIF/OUT */
+                       outb(functrl1, s->iobase + 0x16);
+                       functrl1 = inb(s->iobase + 0x16);
+                       functrl1 &= ~0x20;  /* disable DAC2SPDO */
+                       outb(functrl1, s->iobase + 0x16);
+                       functrl1 = inb(s->iobase + 0x05);
+                       functrl1 &= ~0x01;  /* disable SPDIF out */
+                       outb(functrl1, s->iobase + 0x05);
+                       functrl1 = inb(s->iobase + 0x24);
+                       functrl1 &=  ~0x01;  /* SPDIF in to DAC*/
+                       outb(functrl1, s->iobase + 0x24);
+               }
+       }
        freq <<= 2;
        spin_lock_irqsave(&s->lock, flags);
        val = inb(s->iobase + CODEC_CMI_FUNCTRL1 + 1) & ~0x1c; 
@@ -781,6 +819,7 @@ static void cm_handle_midi(struct cm_state *s)
 {
        unsigned char ch;
        int wake;
+       int timeout;
 
        wake = 0;
        while (!(inb(s->iomidi+1) & 0x80)) {
@@ -797,6 +836,13 @@ static void cm_handle_midi(struct cm_state *s)
                wake_up(&s->midi.iwait);
                wake_up(&s->midi.pollwait);
        }
+       for (timeout = 120000; timeout > 0 && (inb(s->iomidi+1)&0x40); timeout--);
+/*
+       if((inb(s->iomidi+1) & 0x40)) {
+                 printk(KERN_WARNING "cmpci: UART Timeout - Device not responding\n");
+                 return;
+       }
+*/
        wake = 0;
        while (!(inb(s->iomidi+1) & 0x40) && s->midi.ocnt > 0) {
                outb(s->midi.obuf[s->midi.ord], s->iomidi);
@@ -837,7 +883,7 @@ static void cm_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                outb(intstat | 2, s->iobase + CODEC_CMI_INT_HLDCLR + 2);
        }
        cm_update_ptr(s);
-       cm_handle_midi(s);
+       /*cm_handle_midi(s);*/
        spin_unlock(&s->lock);
 }
 
@@ -2310,7 +2356,10 @@ static int       rear_out = 0;
 MODULE_PARM(spdif_loop, "i");
 MODULE_PARM(four_ch, "i");
 MODULE_PARM(rear_out, "i");
-
+int mpu_io = 0;
+int synth_io = 0;
+MODULE_PARM(mpu_io, "i");
+MODULE_PARM(synth_io, "i");
 int  __init init_module(void)
 #else
 #ifdef CONFIG_SOUND_CMPCI_SPDIFLOOP
@@ -2387,8 +2436,36 @@ int __init init_cmpci(void)
                s->open_sem = MUTEX;
                s->magic = CM_MAGIC;
                s->iobase = pcidev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK;
-               s->iosynth = 0x388;
-               s->iomidi = 0x330;
+               switch (synth_io) {
+               case 0x3c8:
+                       s->iosynth = 0x3c8;
+                       break;
+               case 0x3e0:
+                       s->iosynth = 0x3e0;
+                       break;
+               case 0x3e8:
+                       s->iosynth = 0x3e8;
+                       break;
+               case 0x388:
+               default:
+                       s->iosynth = 0x388;
+                       break;
+               }
+               switch (mpu_io) {
+               case 0x300:
+                       s->iomidi = 0x300;
+                       break;
+               case 0x310:
+                       s->iomidi = 0x310;
+                       break;
+               case 0x320:
+                       s->iomidi = 0x320;
+                       break;
+               case 0x330:
+               default:
+                       s->iomidi = 0x330;
+                       break;
+               }
                if (s->iobase == 0)
                        continue;
                s->irq = pcidev->irq;
@@ -2405,8 +2482,21 @@ int __init init_cmpci(void)
                else
                {
                        request_region(s->iomidi, CM_EXTENT_MIDI, "cmpci Midi");
-                       /* set IO based at 0x330 */
-                       outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60, s->iobase + CODEC_CMI_LEGACY_CTRL + 3);
+                       /* set IO based at specified address */
+                       switch (s->iomidi) {
+                       case 0x300:
+                               outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) | 0x60, s->iobase + CODEC_CMI_LEGACY_CTRL + 3);
+                               break;
+                       case 0x310:
+                               outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60) | 0x40, s->iobase + CODEC_CMI_LEGACY_CTRL + 3);
+                               break;
+                       case 0x320:
+                               outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60) | 0x20, s->iobase + CODEC_CMI_LEGACY_CTRL + 3);
+                               break;
+                       default: /* 0x330 */
+                               outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x60, s->iobase + CODEC_CMI_LEGACY_CTRL + 3);
+                               break;
+                       }
                }
                if (check_region(s->iosynth, CM_EXTENT_SYNTH)) {
                        printk(KERN_WARNING "cmpci: io ports %#x-%#x in use, synth disabled.\n", s->iosynth, s->iosynth+CM_EXTENT_SYNTH-1);
@@ -2417,6 +2507,22 @@ int __init init_cmpci(void)
                        request_region(s->iosynth, CM_EXTENT_SYNTH, "cmpci FM");
                        /* enable FM */
                        outb(inb(s->iobase + CODEC_CMI_MISC_CTRL + 2) | 8, s->iobase + CODEC_CMI_MISC_CTRL);
+
+                       /* set IO base at specified address */
+                       switch (s->iosynth) {
+                       case 0x3e8:
+                               outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) | 0x03, s->iobase + CODEC_CMI_LEGACY_CTRL+3);
+                               break;
+                               case 0x3e0:
+                               outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x03) | 0x02, s->iobase + CODEC_CMI_LEGACY_CTRL+3);
+                               break;
+                       case 0x3c8:
+                               outb((inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x03) | 0x01, s->iobase + CODEC_CMI_LEGACY_CTRL+3);
+                               break;
+                       default: /* 0x388 */
+                               outb(inb(s->iobase + CODEC_CMI_LEGACY_CTRL + 3) & ~0x03, s->iobase + CODEC_CMI_LEGACY_CTRL+3);
+                               break;
+                       }
                }
                /* initialize codec registers */
                outb(0, s->iobase + CODEC_CMI_INT_HLDCLR + 2);  /* disable ints */
@@ -2463,8 +2569,10 @@ int __init init_cmpci(void)
                                outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) | 0x80, s->iobase + CODEC_CMI_FUNCTRL1);
                                printk(KERN_INFO "cmpci: Enable SPDIF loop\n");
                        }
-                       else
+                       else {
                                outb(inb(s->iobase + CODEC_CMI_FUNCTRL1) & ~0x80, s->iobase + CODEC_CMI_FUNCTRL1);
+                       }
+
                        /* enable 4 channels mode */
                        if (four_ch)
                        {
index 2f870a1807af8873415db0e7320e95566997e9b3..59bc49ba86d479fae7082ae6066897b32a35a1f9 100644 (file)
@@ -76,6 +76,9 @@ extern int msnd_pinnacle_init(void);
 #ifdef CONFIG_SOUND_ESSSOLO1
 extern int init_solo1(void);
 #endif
+#ifdef CONFIG_SOUND_YMPCI
+extern init_ymf7xxsb_module();
+#endif
 
 /*
  *     Low level list operator. Scan the ordered list, find a hole and
@@ -430,6 +433,9 @@ int soundcore_init(void)
 #endif
 #ifdef CONFIG_SOUND_ICH
        i810_probe();
+#endif
+#ifdef CONFIG_SOUND_YMPCI
+       init_ymf7xxsb_module();
 #endif
        return 0;
 }
diff --git a/drivers/sound/ymf_sb.c b/drivers/sound/ymf_sb.c
new file mode 100644 (file)
index 0000000..7bb2e57
--- /dev/null
@@ -0,0 +1,892 @@
+/*
+  Legacy audio driver for YMF724, 740, 744, 754 series.
+  Copyright 2000 Daisuke Nagano <breeze.nagano@nifty.ne.jp>
+
+  Based on the VIA 82Cxxx driver by Jeff Garzik <jgarzik@pobox.com>
+
+  Distribued under the GNU PUBLIC LICENSE (GPL) Version 2.
+  See the "COPYING" file distributed with kernel source tree for more info.
+
+  -------------------------------------------------------------------------
+
+  It only supports SBPro compatible function of YMF7xx series s.t.
+    * 22.05kHz, 8-bit and stereo sample
+    * OPL3-compatible FM synthesizer
+    * MPU-401 compatible "external" MIDI interface
+
+  Because of hardware specification, only 4 cards on a machine can 
+  be handled. This driver supports 4 cards with one driver.
+ */
+
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+
+#include "sound_config.h"
+#include "soundmodule.h"
+#include "sb.h"
+#include "ac97.h"
+
+#include "724hwmcode.h"
+#include "Hwmcode.h"
+
+#undef YMF_DEBUG
+#define SUPPORT_UART401_MIDI 1
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef SOUND_LOCK
+#define SOUND_LOCK do {} while (0)
+#define SOUND_LOCK_END do {} while (0)
+#endif
+
+#ifndef PCI_VENDOR_ID_YAMAHA
+#define PCI_VENDOR_ID_YAMAHA  0x1073
+#endif
+#ifndef PCI_DEVICE_ID_YMF724
+#define PCI_DEVICE_ID_YMF724  0x0004
+#endif
+#ifndef PCI_DEVICE_ID_YMF740
+#define PCI_DEVICE_ID_YMF740  0x000A
+#endif
+#ifndef PCI_DEVICE_ID_YMF740C
+#define PCI_DEVICE_ID_YMF740C 0x000C
+#endif
+#ifndef PCI_DEVICE_ID_YMF724F
+#define PCI_DEVICE_ID_YMF724F 0x000D
+#endif
+#ifndef PCI_DEVICE_ID_YMF744
+#define PCI_DEVICE_ID_YMF744  0x0010
+#endif
+#ifndef PCI_DEVICE_ID_YMF754
+#define PCI_DEVICE_ID_YMF754  0x0012
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#define YMFSB_RESET_DELAY               5
+
+#define YMFSB_REGSIZE                   0x8000
+
+#define YMFSB_AC97TIMEOUT               2000
+
+#define        YMFSB_WORKBITTIMEOUT            250000
+
+#define        YMFSB_DSPLENGTH                 0x0080
+#define        YMFSB_CTRLLENGTH                0x3000
+
+#define YMFSB_PCIR_VENDORID             0x00
+#define YMFSB_PCIR_DEVICEID             0x02
+#define YMFSB_PCIR_CMD                  0x04
+#define YMFSB_PCIR_REVISIONID           0x08
+#define YMFSB_PCIR_BASEADDR             0x10
+#define YMFSB_PCIR_IRQ                  0x3c
+
+#define        YMFSB_PCIR_LEGCTRL              0x40
+#define        YMFSB_PCIR_ELEGCTRL             0x42
+#define        YMFSB_PCIR_DSXGCTRL             0x48
+#define YMFSB_PCIR_OPLADR               0x60
+#define YMFSB_PCIR_SBADR                0x62
+#define YMFSB_PCIR_MPUADR               0x64
+
+#define        YMFSB_INTFLAG                   0x0004
+#define        YMFSB_ACTIVITY                  0x0006
+#define        YMFSB_GLOBALCTRL                0x0008
+#define        YMFSB_ZVCTRL                    0x000A
+#define        YMFSB_TIMERCTRL                 0x0010
+#define        YMFSB_TIMERCOUNT                0x0012
+#define        YMFSB_SPDIFOUTCTRL              0x0018
+#define        YMFSB_SPDIFOUTSTATUS            0x001C
+#define        YMFSB_EEPROMCTRL                0x0020
+#define        YMFSB_SPDIFINCTRL               0x0034
+#define        YMFSB_SPDIFINSTATUS             0x0038
+#define        YMFSB_DSPPROGRAMDL              0x0048
+#define        YMFSB_DLCNTRL                   0x004C
+#define        YMFSB_GPIOININTFLAG             0x0050
+#define        YMFSB_GPIOININTENABLE           0x0052
+#define        YMFSB_GPIOINSTATUS              0x0054
+#define        YMFSB_GPIOOUTCTRL               0x0056
+#define        YMFSB_GPIOFUNCENABLE            0x0058
+#define        YMFSB_GPIOTYPECONFIG            0x005A
+#define        YMFSB_AC97CMDDATA               0x0060
+#define        YMFSB_AC97CMDADR                0x0062
+#define        YMFSB_PRISTATUSDATA             0x0064
+#define        YMFSB_PRISTATUSADR              0x0066
+#define        YMFSB_SECSTATUSDATA             0x0068
+#define        YMFSB_SECSTATUSADR              0x006A
+#define        YMFSB_SECCONFIG                 0x0070
+#define        YMFSB_LEGACYOUTVOL              0x0080
+#define        YMFSB_LEGACYOUTVOLL             0x0080
+#define        YMFSB_LEGACYOUTVOLR             0x0082
+#define        YMFSB_NATIVEDACOUTVOL           0x0084
+#define        YMFSB_NATIVEDACOUTVOLL          0x0084
+#define        YMFSB_NATIVEDACOUTVOLR          0x0086
+#define        YMFSB_SPDIFOUTVOL               0x0088
+#define        YMFSB_SPDIFOUTVOLL              0x0088
+#define        YMFSB_SPDIFOUTVOLR              0x008A
+#define        YMFSB_AC3OUTVOL                 0x008C
+#define        YMFSB_AC3OUTVOLL                0x008C
+#define        YMFSB_AC3OUTVOLR                0x008E
+#define        YMFSB_PRIADCOUTVOL              0x0090
+#define        YMFSB_PRIADCOUTVOLL             0x0090
+#define        YMFSB_PRIADCOUTVOLR             0x0092
+#define        YMFSB_LEGACYLOOPVOL             0x0094
+#define        YMFSB_LEGACYLOOPVOLL            0x0094
+#define        YMFSB_LEGACYLOOPVOLR            0x0096
+#define        YMFSB_NATIVEDACLOOPVOL          0x0098
+#define        YMFSB_NATIVEDACLOOPVOLL         0x0098
+#define        YMFSB_NATIVEDACLOOPVOLR         0x009A
+#define        YMFSB_SPDIFLOOPVOL              0x009C
+#define        YMFSB_SPDIFLOOPVOLL             0x009E
+#define        YMFSB_SPDIFLOOPVOLR             0x009E
+#define        YMFSB_AC3LOOPVOL                0x00A0
+#define        YMFSB_AC3LOOPVOLL               0x00A0
+#define        YMFSB_AC3LOOPVOLR               0x00A2
+#define        YMFSB_PRIADCLOOPVOL             0x00A4
+#define        YMFSB_PRIADCLOOPVOLL            0x00A4
+#define        YMFSB_PRIADCLOOPVOLR            0x00A6
+#define        YMFSB_NATIVEADCINVOL            0x00A8
+#define        YMFSB_NATIVEADCINVOLL           0x00A8
+#define        YMFSB_NATIVEADCINVOLR           0x00AA
+#define        YMFSB_NATIVEDACINVOL            0x00AC
+#define        YMFSB_NATIVEDACINVOLL           0x00AC
+#define        YMFSB_NATIVEDACINVOLR           0x00AE
+#define        YMFSB_BUF441OUTVOL              0x00B0
+#define        YMFSB_BUF441OUTVOLL             0x00B0
+#define        YMFSB_BUF441OUTVOLR             0x00B2
+#define        YMFSB_BUF441LOOPVOL             0x00B4
+#define        YMFSB_BUF441LOOPVOLL            0x00B4
+#define        YMFSB_BUF441LOOPVOLR            0x00B6
+#define        YMFSB_SPDIFOUTVOL2              0x00B8
+#define        YMFSB_SPDIFOUTVOL2L             0x00B8
+#define        YMFSB_SPDIFOUTVOL2R             0x00BA
+#define        YMFSB_SPDIFLOOPVOL2             0x00BC
+#define        YMFSB_SPDIFLOOPVOL2L            0x00BC
+#define        YMFSB_SPDIFLOOPVOL2R            0x00BE
+#define        YMFSB_ADCSLOTSR                 0x00C0
+#define        YMFSB_RECSLOTSR                 0x00C4
+#define        YMFSB_ADCFORMAT                 0x00C8
+#define        YMFSB_RECFORMAT                 0x00CC
+#define        YMFSB_P44SLOTSR                 0x00D0
+#define        YMFSB_STATUS                    0x0100
+#define        YMFSB_CTRLSELECT                0x0104
+#define        YMFSB_MODE                      0x0108
+#define        YMFSB_SAMPLECOUNT               0x010C
+#define        YMFSB_NUMOFSAMPLES              0x0110
+#define        YMFSB_CONFIG                    0x0114
+#define        YMFSB_PLAYCTRLSIZE              0x0140
+#define        YMFSB_RECCTRLSIZE               0x0144
+#define        YMFSB_EFFCTRLSIZE               0x0148
+#define        YMFSB_WORKSIZE                  0x014C
+#define        YMFSB_MAPOFREC                  0x0150
+#define        YMFSB_MAPOFEFFECT               0x0154
+#define        YMFSB_PLAYCTRLBASE              0x0158
+#define        YMFSB_RECCTRLBASE               0x015C
+#define        YMFSB_EFFCTRLBASE               0x0160
+#define        YMFSB_WORKBASE                  0x0164
+#define        YMFSB_DSPINSTRAM                0x1000
+#define        YMFSB_CTRLINSTRAM               0x4000
+
+
+/* ---------------------------------------------------------------------- */
+
+#define MAX_CARDS      4
+
+#define PFX            "ymf_sb: "
+
+#define YMFSB_VERSION  "0.0.3"
+#define YMFSB_CARD_NAME        "YMF7xx Legacy Audio driver " YMFSB_VERSION
+
+#ifdef SUPPORT_UART401_MIDI
+#if 0
+# define ymf7xxsb_probe_midi probe_uart401
+# define ymf7xxsb_attach_midi attach_uart401
+# define ymf7xxsb_unload_midi unload_uart401
+#else
+# define ymf7xxsb_probe_midi probe_sbmpu
+# define ymf7xxsb_attach_midi attach_sbmpu
+# define ymf7xxsb_unload_midi unload_sbmpu
+#endif
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static struct address_info     sb_data[MAX_CARDS];
+static struct address_info     opl3_data[MAX_CARDS];
+#ifdef SUPPORT_UART401_MIDI
+static struct address_info     mpu_data[MAX_CARDS];
+#endif
+static unsigned                        cards = 0;
+static unsigned short          *ymfbase[MAX_CARDS];
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef MODULE
+#ifdef SUPPORT_UART401_MIDI
+static int mpu_io   = 0;
+#endif
+static int synth_io = 0;
+static int io       = 0;
+static int dma      = 0;
+static int master_vol = -1;
+static int spdif_out = 0;
+#ifdef SUPPORT_UART401_MIDI
+MODULE_PARM(mpu_io, "i");
+#endif
+MODULE_PARM(synth_io, "i");
+MODULE_PARM(io,"i");
+MODULE_PARM(dma,"i");
+MODULE_PARM(master_vol,"i");
+MODULE_PARM(spdif_out,"i");
+#else
+#ifdef SUPPORT_UART401_MIDI
+static int mpu_io     = 0x330;
+#endif
+static int synth_io   = 0x388;
+static int io         = 0x220;
+static int dma        = 1;
+static int master_vol = 80;
+static int spdif_out  = 0;
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int readRegWord( int adr ) {
+
+       if (ymfbase[cards]==NULL) return 0;
+
+       /* printk(KERN_INFO PFX "readRegWord(%p)\n",ymfbase[cards]+adr/2); */
+       return readw(ymfbase[cards]+adr/2);
+}
+
+static void writeRegWord( int adr, int val ) {
+
+       if (ymfbase[cards]==NULL) return;
+
+       writew((unsigned short)(val&0xffff), ymfbase[cards] + adr/2);
+
+       return;
+}
+
+static int readRegDWord( int adr ) {
+
+       if (ymfbase[cards]==NULL) return 0;
+
+       return (readl(ymfbase[cards]+adr/2));
+}
+
+static void writeRegDWord( int adr, int val ) {
+
+       if (ymfbase[cards]==NULL) return;
+
+       writel((unsigned int)(val&0xffffffff), ymfbase[cards]+adr/2);
+
+       return;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int checkPrimaryBusy( void )
+{
+       int timeout=0;
+
+       while ( timeout++ < YMFSB_AC97TIMEOUT )
+       {
+               if ( (readRegWord(YMFSB_PRISTATUSADR) & 0x8000) == 0x0000 )
+                       return 0;
+       }
+       return -1;
+}
+
+static int writeAc97( int adr, unsigned short val )
+{
+
+       if ( adr > 0x7f || adr < 0x00 ) return -1;
+
+       if ( checkPrimaryBusy() ) return -1;
+
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "AC97 0x%0x = 0x%0x\n",adr,val);
+#endif
+
+       writeRegWord( YMFSB_AC97CMDADR,  0x0000 | adr );
+       writeRegWord( YMFSB_AC97CMDDATA, val );
+
+       return 0;
+}
+
+static int checkCodec( struct pci_dev *pcidev )
+{
+       u8 tmp8;
+
+       pci_read_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, &tmp8);
+       if ( tmp8 & 0x03 ) {
+               pci_write_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, tmp8&0xfc);
+               mdelay(YMFSB_RESET_DELAY);
+               pci_write_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, tmp8|0x03);
+               mdelay(YMFSB_RESET_DELAY);
+               pci_write_config_byte(pcidev, YMFSB_PCIR_DSXGCTRL, tmp8&0xfc);
+               mdelay(YMFSB_RESET_DELAY);
+       }
+
+       if ( checkPrimaryBusy() ) return -1;
+
+       return 0;
+}
+
+static int setupLegacyIO( struct pci_dev *pcidev )
+{
+       int v;
+       int sbio=0x220,mpuio=0x330,oplio=0x388,dma=0;
+
+       switch(sb_data[cards].io_base) {
+       case 0x220:
+               sbio = 0;
+               break;
+       case 0x240:
+               sbio = 1;
+               break;
+       case 0x260:
+               sbio = 2;
+               break;
+       case 0x280:
+               sbio = 3;
+               break;
+       default:
+               return -1;
+               break;
+       }
+#ifdef YMF_DEBUG
+       printk(PFX "set SBPro I/O at 0x%x\n",sb_data[cards].io_base);
+#endif
+
+#ifdef SUPPORT_UART401_MIDI
+       switch(mpu_data[cards].io_base) {
+       case 0x330:
+               mpuio = 0;
+               break;
+       case 0x300:
+               mpuio = 1;
+               break;
+       case 0x332:
+               mpuio = 2;
+               break;
+       case 0x334:
+               mpuio = 3;
+               break;
+       default:
+               mpuio = 0;
+               break;
+       }
+# ifdef YMF_DEBUG
+       printk(PFX "set MPU401 I/O at 0x%x\n",mpu_data[cards].io_base);
+# endif
+#endif
+
+       switch(opl3_data[cards].io_base) {
+       case 0x388:
+               oplio = 0;
+               break;
+       case 0x398:
+               oplio = 1;
+               break;
+       case 0x3a0:
+               oplio = 2;
+               break;
+       case 0x3a8:
+               oplio = 3;
+               break;
+       default:
+               return -1;
+               break;
+       }
+#ifdef YMF_DEBUG
+       printk(PFX "set OPL3 I/O at 0x%x\n",opl3_data[cards].io_base);
+#endif
+
+       dma = sb_data[cards].dma;
+#ifdef YMF_DEBUG
+       printk(PFX "set DMA address at 0x%x\n",sb_data[cards].dma);
+#endif
+
+       v = 0x0000 | ((dma<<6)&0x03) | 0x003f;
+       pci_write_config_word(pcidev, YMFSB_PCIR_LEGCTRL, v);
+#ifdef YMF_DEBUG
+       printk(PFX "LEGCTRL: 0x%x\n",v);
+#endif
+       switch( pcidev->device ) {
+       case PCI_DEVICE_ID_YMF724:
+       case PCI_DEVICE_ID_YMF740:
+       case PCI_DEVICE_ID_YMF724F:
+       case PCI_DEVICE_ID_YMF740C:
+               v = 0x8800 | ((mpuio<<4)&0x03) | ((sbio<<2)&0x03) | (oplio&0x03);
+               pci_write_config_word(pcidev, YMFSB_PCIR_ELEGCTRL, v);
+#ifdef YMF_DEBUG
+               printk(PFX "ELEGCTRL: 0x%x\n",v);
+#endif
+               break;
+
+       case PCI_DEVICE_ID_YMF744:
+       case PCI_DEVICE_ID_YMF754:
+               v = 0x8800;
+               pci_write_config_word(pcidev, YMFSB_PCIR_ELEGCTRL, v);
+#ifdef YMF_DEBUG
+               printk(PFX "ELEGCTRL: 0x%x\n",v);
+#endif
+               pci_write_config_word(pcidev, YMFSB_PCIR_OPLADR, oplio);
+               pci_write_config_word(pcidev, YMFSB_PCIR_SBADR,  sbio);
+               pci_write_config_word(pcidev, YMFSB_PCIR_MPUADR, mpuio);
+               break;
+
+       default:
+               printk(KERN_ERR PFX "Invalid device ID: %d\n",pcidev->device);
+               return -1;
+               break;
+       }
+
+       return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void enableDSP( void )
+{
+       writeRegDWord( YMFSB_CONFIG, 0x00000001 );
+       return;
+}
+
+static void disableDSP( void )
+{
+       int val;
+       int i;
+
+       val = readRegDWord( YMFSB_CONFIG );
+       if ( val ) {
+               writeRegDWord( YMFSB_CONFIG, 0 );
+       }
+
+       i=0;
+       while( ++i < YMFSB_WORKBITTIMEOUT ) {
+               val = readRegDWord(YMFSB_STATUS);
+               if ( (val & 0x00000002) == 0x00000000 ) break;
+       }
+
+       return;
+}
+
+static int setupInstruction( struct pci_dev *pcidev )
+{
+       int i;
+       int val;
+
+       writeRegDWord( YMFSB_NATIVEDACOUTVOL, 0 ); /* mute dac */
+       disableDSP();
+
+       writeRegDWord( YMFSB_MODE, 0x00010000 );
+
+       /* DS-XG Software Reset */
+       writeRegDWord( YMFSB_MODE,         0x00000000 );
+       writeRegDWord( YMFSB_MAPOFREC,     0x00000000 );
+       writeRegDWord( YMFSB_MAPOFEFFECT,  0x00000000 );
+       writeRegDWord( YMFSB_PLAYCTRLBASE, 0x00000000 );
+       writeRegDWord( YMFSB_RECCTRLBASE,  0x00000000 );
+       writeRegDWord( YMFSB_EFFCTRLBASE,  0x00000000 );
+
+       val = readRegWord( YMFSB_GLOBALCTRL );
+       writeRegWord( YMFSB_GLOBALCTRL, (val&~0x0007) );
+
+       switch( pcidev->device ) {
+       case PCI_DEVICE_ID_YMF724:
+       case PCI_DEVICE_ID_YMF740:
+               /* setup DSP instruction code */
+               for ( i=0 ; i<YMFSB_DSPLENGTH ; i+=4 ) {
+                       writeRegDWord( YMFSB_DSPINSTRAM+i, DspInst[i>>2] );
+               }
+
+               /* setup Control instruction code */
+               for ( i=0 ; i<YMFSB_CTRLLENGTH ; i+=4 ) {
+                       writeRegDWord( YMFSB_CTRLINSTRAM+i, CntrlInst[i>>2] );
+               }
+               break;
+
+       case PCI_DEVICE_ID_YMF724F:
+       case PCI_DEVICE_ID_YMF740C:
+               /* setup DSP instruction code */
+               for ( i=0 ; i<YMFSB_DSPLENGTH ; i+=4 ) {
+                       writeRegDWord( YMFSB_DSPINSTRAM+i, DspInst[i>>2] );
+               }
+
+               /* setup Control instruction code */
+       
+               for ( i=0 ; i<YMFSB_CTRLLENGTH ; i+=4 ) {
+                       writeRegDWord( YMFSB_CTRLINSTRAM+i, CntrlInst1E[i>>2] );
+               }
+               break;
+
+       case PCI_DEVICE_ID_YMF744:
+       case PCI_DEVICE_ID_YMF754:
+               /* setup DSP instruction code */
+               for ( i=0 ; i<YMFSB_DSPLENGTH ; i+=4 ) {
+                       writeRegDWord( YMFSB_DSPINSTRAM+i, gdwDSPCode[i>>2] );
+               }
+
+               /* setup Control instruction code */
+
+               for ( i=0 ; i<YMFSB_CTRLLENGTH ; i+=4 ) {
+                       writeRegDWord( YMFSB_CTRLINSTRAM+i, gdwCtrl1eCode[i>>2] );
+               }
+               break;
+       default:
+               return -1;
+       }
+
+       enableDSP();
+
+       return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int __init ymf7xx_init(struct pci_dev *pcidev)
+{
+       unsigned short v;
+
+       /* Read hardware information */
+#ifdef YMF_DEBUG
+       unsigned int   dv;
+       pci_read_config_word(pcidev, YMFSB_PCIR_VENDORID, &v);
+       printk(KERN_INFO PFX "Vendor ID = 0x%x\n",v);
+       pci_read_config_word(pcidev, YMFSB_PCIR_DEVICEID, &v);
+       printk(KERN_INFO PFX "Device ID = 0x%x\n",v);
+       pci_read_config_word(pcidev, YMFSB_PCIR_REVISIONID, &v);
+       printk(KERN_INFO PFX "Revision ID = 0x%x\n",v&0xff);
+       pci_read_config_dword(pcidev, YMFSB_PCIR_BASEADDR, &dv);
+       printk(KERN_INFO PFX "Base address = 0x%x\n",dv);
+       pci_read_config_word(pcidev, YMFSB_PCIR_IRQ, &v);
+       printk(KERN_INFO PFX "IRQ line = 0x%x\n",v&0xff);
+#endif
+
+       /* enables memory space access / bus mastering */
+       pci_read_config_word(pcidev, YMFSB_PCIR_CMD, &v);
+       pci_write_config_word(pcidev, YMFSB_PCIR_CMD, v|0x06);
+
+       /* check codec */
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "check codec...\n");
+#endif
+       if (checkCodec(pcidev)) return -1;
+
+       /* setup legacy I/O */
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "setup legacy I/O...\n");
+#endif
+       if (setupLegacyIO(pcidev)) return -1;
+       
+       /* setup instruction code */    
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "setup instructions...\n");
+#endif
+       if (setupInstruction(pcidev)) return -1;
+
+       /* AC'97 setup */       
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "setup AC'97...\n");
+#endif
+       if ( writeAc97(AC97_RESET            ,0x0000) )  /* Reset */
+               return -1;
+       if ( writeAc97(AC97_MASTER_VOL_STEREO,0x0000) )  /* Master Volume */
+               return -1;
+
+       v = 31*(100-master_vol)/100;
+       v = (v<<8 | v)&0x7fff;
+       if ( writeAc97(AC97_PCMOUT_VOL       ,v     ) )  /* PCM out Volume */
+               return -1;
+
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "setup Legacy Volume...\n");
+#endif
+       /* Legacy Audio Output Volume L & R ch */
+       writeRegDWord( YMFSB_LEGACYOUTVOL, 0x3fff3fff );
+
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "setup SPDIF output control...\n");
+#endif
+       /* SPDIF Output control */
+       v = spdif_out != 0 ? 0x0001 : 0x0000;
+       writeRegWord( YMFSB_SPDIFOUTCTRL, v );
+       /* no copyright protection, 
+          sample-rate converted,
+          re-recorded software comercially available (the 1st generation),
+          original */
+       writeRegWord( YMFSB_SPDIFOUTSTATUS, 0x9a04 );
+
+       return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void __init ymf7xxsb_attach_sb(struct address_info *hw_config)
+{
+#ifdef SUPPORT_UART401_MIDI
+//     hw_config->driver_use_1 |= SB_NO_MIDI;
+#endif
+       if(!sb_dsp_init(hw_config))
+               hw_config->slots[0] = -1;
+}
+
+static int __init ymf7xxsb_probe_sb(struct address_info *hw_config)
+{
+       if (check_region(hw_config->io_base, 16))
+       {
+               printk(KERN_DEBUG PFX "SBPro port 0x%x is already in use\n",
+                      hw_config->io_base);
+               return 0;
+       }
+//     return sb_dsp_detect(hw_config, 0, 0);
+       return sb_dsp_detect(hw_config, SB_PCI_YAMAHA, 0);
+}
+
+
+static void ymf7xxsb_unload_sb(struct address_info *hw_config, int unload_mpu)
+{
+       if(hw_config->slots[0]!=-1)
+               sb_dsp_unload(hw_config, unload_mpu);
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int __init ymf7xxsb_install (struct pci_dev *pcidev)
+{
+       struct {
+               unsigned short deviceid;
+               char           *devicename;
+       } devicetable[] = 
+       {
+               { PCI_DEVICE_ID_YMF724,  "YMF724A-E" },
+               { PCI_DEVICE_ID_YMF724F, "YMF724F" },
+               { PCI_DEVICE_ID_YMF740,  "YMF740A-B" },
+               { PCI_DEVICE_ID_YMF740C, "YMF740C" },
+               { PCI_DEVICE_ID_YMF744,  "YMF744" },
+               { PCI_DEVICE_ID_YMF754,  "YMF754" },
+       };
+
+       char            *devicename = "unknown";
+       int             i;
+       unsigned long   iobase;
+
+       if ( pcidev->irq == 0 ) return -1;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,13)
+       iobase = pcidev->base_address[0]&PCI_BASE_ADDRESS_MEM_MASK;
+#else
+       iobase = pcidev->resource[0].start&PCI_BASE_ADDRESS_MEM_MASK;
+#endif
+       if ( iobase == 0x00000000 ) return -1;
+
+       for ( i=0 ; i<sizeof(devicetable) / sizeof(devicetable[0]); i++ )
+       {
+               if (devicetable[i].deviceid == pcidev->device)
+               {
+                       devicename = devicetable[i].devicename;
+                       break;
+               }
+       }
+
+       /* remap memory mapped I/O onto kernel virtual memory */
+       if ( (ymfbase[cards] = ioremap_nocache(iobase, YMFSB_REGSIZE)) == 0 )
+       {
+               printk(KERN_ERR PFX "ioremap (0x%lx) returns zero\n", iobase);
+               return -1;
+       }
+       printk(KERN_INFO PFX "found %s at 0x%lx\n", devicename, iobase);
+#ifdef YMF_DEBUG
+       printk(KERN_INFO PFX "remappling to 0x%p\n", ymfbase[cards]);
+#endif
+
+       memset (&sb_data[cards], 0, sizeof (struct address_info));
+       memset (&opl3_data[cards], 0, sizeof (struct address_info));
+#ifdef SUPPORT_UART401_MIDI
+       memset (&mpu_data[cards], 0, sizeof (struct address_info));
+#endif
+
+       sb_data[cards].name   = YMFSB_CARD_NAME;
+       opl3_data[cards].name = YMFSB_CARD_NAME;
+#ifdef SUPPORT_UART401_MIDI
+       mpu_data[cards].name  = YMFSB_CARD_NAME;
+#endif
+
+       sb_data[cards].card_subtype = MDL_YMPCI;
+
+       if ( io == 0 ) io      = 0x220;
+       sb_data[cards].io_base = io;
+       sb_data[cards].irq     = pcidev->irq;
+       sb_data[cards].dma     = dma;
+
+       if ( synth_io == 0 ) synth_io = 0x388;
+       opl3_data[cards].io_base = synth_io;
+       opl3_data[cards].irq     = -1;
+
+#ifdef SUPPORT_UART401_MIDI
+       if ( mpu_io == 0 ) mpu_io = 0x330;
+       mpu_data[cards].io_base = mpu_io;
+       mpu_data[cards].irq     = -1;
+#endif
+
+       if ( ymf7xx_init(pcidev) ) {
+               printk (KERN_ERR PFX
+                       "Cannot initialize %s, aborting\n",
+                       devicename);
+               return -1;
+       }
+
+       /* register legacy SoundBlaster Pro */
+       if (!ymf7xxsb_probe_sb(&sb_data[cards])) {
+               printk (KERN_ERR PFX
+                       "SB probe at 0x%X failed, aborting\n",
+                       io);
+               return -1;
+       }
+       ymf7xxsb_attach_sb (&sb_data[cards]);
+
+#ifdef SUPPORT_UART401_MIDI
+       /* register legacy MIDI */
+       if ( mpu_io > 0 && 0)
+       {
+               if (!ymf7xxsb_probe_midi (&mpu_data[cards])) {
+                       printk (KERN_ERR PFX
+                               "MIDI probe @ 0x%X failed, aborting\n",
+                               mpu_io);
+                       ymf7xxsb_unload_sb (&sb_data[cards], 0);
+                       return -1;
+               }
+               ymf7xxsb_attach_midi (&mpu_data[cards]);
+       }
+#endif
+
+       /* register legacy OPL3 */
+
+       cards++;        
+       return 0;
+}
+
+static int __init probe_ymf7xxsb (void)
+{
+       struct pci_dev *pcidev = NULL;
+       int i;
+
+       for (i=0 ; i<MAX_CARDS ; i++ )
+               ymfbase[i] = NULL;
+
+       while ( pcidev == NULL && (
+              (pcidev = pci_find_device (PCI_VENDOR_ID_YAMAHA,
+                                         PCI_DEVICE_ID_YMF724, pcidev)) ||
+              (pcidev = pci_find_device (PCI_VENDOR_ID_YAMAHA,
+                                         PCI_DEVICE_ID_YMF724F,pcidev)) ||
+              (pcidev = pci_find_device (PCI_VENDOR_ID_YAMAHA,
+                                         PCI_DEVICE_ID_YMF740, pcidev)) ||
+              (pcidev = pci_find_device (PCI_VENDOR_ID_YAMAHA,
+                                         PCI_DEVICE_ID_YMF740C,pcidev)) ||
+              (pcidev = pci_find_device (PCI_VENDOR_ID_YAMAHA,
+                                         PCI_DEVICE_ID_YMF744, pcidev)) ||
+              (pcidev = pci_find_device (PCI_VENDOR_ID_YAMAHA,
+                                         PCI_DEVICE_ID_YMF754, pcidev)))) {
+                 if (ymf7xxsb_install (pcidev) != 0) {
+                         printk (KERN_ERR PFX "audio init failed\n");
+                         return -1;
+                 }
+
+                 if (cards == MAX_CARDS) {
+                         printk (KERN_DEBUG PFX "maximum number of cards reached\n");
+                         break;
+                 }
+       }
+
+       return 0;
+}
+
+static void free_iomaps( void )
+{
+       int i;
+
+       for ( i=0 ; i<MAX_CARDS ; i++ ) {
+               if ( ymfbase[i]!=NULL )
+                       iounmap(ymfbase[i]);
+       }
+
+       return;
+}
+
+static int __init init_ymf7xxsb_module(void)
+{
+       if ( master_vol < 0 ) master_vol  = 50;
+       if ( master_vol > 100 ) master_vol = 100;
+
+       if (!pci_present ()) {
+               printk (KERN_DEBUG PFX "PCI not present, exiting\n");
+               return -ENODEV;
+       }
+
+       if (probe_ymf7xxsb() != 0) {
+               printk(KERN_ERR PFX "probe failed, aborting\n");
+               /* XXX unload cards registered so far, if any */
+               free_iomaps();
+               return -ENODEV;
+       }
+
+       if (cards == 0) {
+               printk(KERN_DEBUG PFX "No chips found, aborting\n");
+               free_iomaps();
+               return -ENODEV;
+       }
+
+       printk (KERN_INFO PFX YMFSB_CARD_NAME " loaded\n");
+       
+       /*
+        *      Binds us to the sound subsystem 
+        */
+       SOUND_LOCK;
+       return 0;
+}
+
+static void cleanup_ymf7xxsb_module(void)
+{
+       int i;
+       
+       for (i = 0; i < cards; i++) {
+#ifdef SUPPORT_UART401_MIDI
+               ymf7xxsb_unload_sb (&sb_data[i], 0);
+               ymf7xxsb_unload_midi (&mpu_data[i]);
+#else
+               ymf7xxsb_unload_sb (&sb_data[i], 1);
+#endif
+       }
+
+       free_iomaps();
+
+       /*
+        *      Final clean up with the sound layer
+        */
+       SOUND_LOCK_END;
+}
+
+#ifdef MODULE
+
+MODULE_AUTHOR("Daisuke Nagano, breeze.nagano@nifty.ne.jp");
+MODULE_DESCRIPTION("YMF7xx Legacy Audio Driver");
+
+int init_module(void)
+{
+       return init_ymf7xxsb_module();
+}
+
+void cleanup_module(void)
+{
+       cleanup_ymf7xxsb_module();
+}
+
+#endif
index e0f111b50bd1ac14f77d9487ab881cb2c7ce7b15..a338588ae8a2b8ba75c1342fb777a8d8e1624fa5 100644 (file)
@@ -1,4 +1,4 @@
-/*  $Id: atyfb.c,v 1.106.2.7 1999/11/19 00:12:29 davem Exp $
+/*  $Id: atyfb.c,v 1.106.2.8 2000/04/28 04:40:09 davem Exp $
  *  linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64
  *
  *     Copyright (C) 1997-1998  Geert Uytterhoeven
@@ -2875,8 +2875,13 @@ __initfunc(void atyfb_init(void))
                pci_read_config_dword(pdev, breg, &size);
                pci_write_config_dword(pdev, breg, pbase);
 
-               if (io)
-                       size &= ~1;
+               if (io) {
+                       size &= PCI_BASE_ADDRESS_IO_MASK;
+                       base &= PCI_BASE_ADDRESS_IO_MASK;
+               } else {
+                       size &= PCI_BASE_ADDRESS_MEM_MASK;
+                       base &= PCI_BASE_ADDRESS_MEM_MASK;
+               }
                size = ~(size) + 1;
 
                /*
index d5ce75e61a9333807c66ccea6bfdd98156d5bff3..ff6d02705a45f198c70ec2fa9c7bdb2491505454 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -613,21 +613,18 @@ int prepare_binprm(struct linux_binprm *bprm)
        cap_clear(bprm->cap_effective);
 
        /*  To support inheritance of root-permissions and suid-root
-         *  executables under compatibility mode, we raise the
-         *  effective and inherited bitmasks of the executable file
-         *  (translation: we set the executable "capability dumb" and
-         *  set the allowed set to maximum). We don't set any forced
-         *  bits.
+         *  executables under compatibility mode, we raise all three
+         *  capability sets for the file.
          *
          *  If only the real uid is 0, we only raise the inheritable
-         *  bitmask of the executable file (translation: we set the
-         *  allowed set to maximum and the application to "capability
-         *  smart"). 
+         *  and permitted sets of the executable file.
          */
 
        if (!issecure(SECURE_NOROOT)) {
-               if (bprm->e_uid == 0 || current->uid == 0)
+               if (bprm->e_uid == 0 || current->uid == 0) {
                        cap_set_full(bprm->cap_inheritable);
+                       cap_set_full(bprm->cap_permitted);
+               }
                if (bprm->e_uid == 0) 
                        cap_set_full(bprm->cap_effective);
        }
@@ -638,10 +635,12 @@ int prepare_binprm(struct linux_binprm *bprm)
          * privilege does not go against other system constraints.
          * The new Permitted set is defined below -- see (***). */
        {
-               kernel_cap_t working =
-                       cap_combine(bprm->cap_permitted,
-                                   cap_intersect(bprm->cap_inheritable,
-                                                 current->cap_inheritable));
+               kernel_cap_t permitted, working;
+
+               permitted = cap_intersect(bprm->cap_permitted, cap_bset);
+               working = cap_intersect(bprm->cap_inheritable,
+                                       current->cap_inheritable);
+               working = cap_combine(permitted, working);
                if (!cap_issubset(working, current->cap_permitted)) {
                        cap_raised = 1;
                }
@@ -674,26 +673,29 @@ int prepare_binprm(struct linux_binprm *bprm)
  * The formula used for evolving capabilities is:
  *
  *       pI' = pI
- * (***) pP' = fP | (fI & pI)
+ * (***) pP' = (fP & X) | (fI & pI)
  *       pE' = pP' & fE          [NB. fE is 0 or ~0]
  *
  * I=Inheritable, P=Permitted, E=Effective // p=process, f=file
- * ' indicates post-exec().
+ * ' indicates post-exec(), and X is the global 'cap_bset'.
  */
 
 void compute_creds(struct linux_binprm *bprm) 
 {
-       int new_permitted = cap_t(bprm->cap_permitted) |
-               (cap_t(bprm->cap_inheritable) & 
-                cap_t(current->cap_inheritable));
+       kernel_cap_t new_permitted, working;
+
+       new_permitted = cap_intersect(bprm->cap_permitted, cap_bset);
+       working = cap_intersect(bprm->cap_inheritable,
+                               current->cap_inheritable);
+       new_permitted = cap_combine(new_permitted, working);
 
        /* For init, we want to retain the capabilities set
          * in the init_task struct. Thus we skip the usual
          * capability rules */
        if (current->pid != 1) {
-               cap_t(current->cap_permitted) = new_permitted;
-               cap_t(current->cap_effective) = new_permitted & 
-                                               cap_t(bprm->cap_effective);
+               current->cap_permitted = new_permitted;
+               current->cap_effective =
+                       cap_intersect(new_permitted, bprm->cap_effective);
        }
        
         /* AUD: Audit candidate if current->cap_effective is set */
index ca5e06538c1662f2118625223aaa587b87466f25..f784d8392338bd88509ba0807dae10d8db570db2 100644 (file)
@@ -298,6 +298,9 @@ struct sparcaudio_driver
         int input_count, input_active, recording_count;
         struct wait_queue *input_read_wait;
 
+       /* Select/poll waiters. */
+       struct wait_queue *poll_wait;
+
         /* Hack to make it look like we support variable size buffers. */
         int buffer_size;
 };
index 9067b97a5cf401ec4b7c4671e0951ab90723b61a..2396647512cabbfb00e8b492c78b7db12d063de2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: head.h,v 1.36.2.2 1999/12/01 23:55:47 davem Exp $ */
+/* $Id: head.h,v 1.36.2.3 2000/05/26 22:19:39 ecd Exp $ */
 #ifndef __SPARC_HEAD_H
 #define __SPARC_HEAD_H
 
@@ -95,7 +95,7 @@
 
 /* The Get PSR software trap for userland. */
 #define GETPSR_TRAP \
-       mov %psr, %o0; jmpl %l2, %g0; rett %l2 + 4; nop;
+       mov %psr, %i0; jmp %l2; rett %l2 + 4; nop;
 
 /* This is for hard interrupts from level 1-14, 15 is non-maskable (nmi) and
  * gets handled with another macro.
index ca5e06538c1662f2118625223aaa587b87466f25..f784d8392338bd88509ba0807dae10d8db570db2 100644 (file)
@@ -298,6 +298,9 @@ struct sparcaudio_driver
         int input_count, input_active, recording_count;
         struct wait_queue *input_read_wait;
 
+       /* Select/poll waiters. */
+       struct wait_queue *poll_wait;
+
         /* Hack to make it look like we support variable size buffers. */
         int buffer_size;
 };
index 1b5e4da9c4a0952285d3660358faa1f3138d677a..25f6b752eb1c9ece190cf8d6bef1656075a1a6be 100644 (file)
-/* $Id: envctrl.h,v 1.1 1998/05/16 17:26:07 ecd Exp $
+/* $Id: envctrl.h,v 1.1.2.1 2000/05/02 04:23:33 davem Exp $
  *
  * envctrl.h: Definitions for access to the i2c environment
  *            monitoring on Ultrasparc systems.
  *
  * Copyright (C) 1998  Eddie C. Dost  (ecd@skynet.be)
+ * Copyright (C) 2000  Vinh Truong  (vinh.truong@eng.sun.com)
+ * VT - Add all ioctl commands and environment status definitions 
+ * VT - Add application note 
  */
-
 #ifndef _SPARC64_ENVCTRL_H
 #define _SPARC64_ENVCTRL_H 1
 
 #include <linux/ioctl.h>
 
-#define I2CIOCSADR _IOW('p', 0x40, int)
-#define I2CIOCGADR _IOR('p', 0x41, int)
+/* Application note:
+ *
+ * The driver supports 4 operations: open(), close(), ioctl(), read()
+ * The device name is /dev/envctrl.
+ * Below is sample usage:
+ *
+ *     fd = open("/dev/envtrl", O_RDONLY);
+ *     if (ioctl(fd, ENVCTRL_READ_SHUTDOWN_TEMPERATURE, 0) < 0)
+ *             printf("error\n");
+ *     ret = read(fd, buf, 10);
+ *     close(fd);
+ *
+ * Notice in the case of cpu voltage and temperature, the default is
+ * cpu0.  If we need to know the info of cpu1, cpu2, cpu3, we need to
+ * pass in cpu number in ioctl() last parameter.  For example, to
+ * get the voltage of cpu2:
+ *
+ *     ioctlbuf[0] = 2;
+ *     if (ioctl(fd, ENVCTRL_READ_CPU_VOLTAGE, ioctlbuf) < 0)
+ *             printf("error\n");
+ *     ret = read(fd, buf, 10);
+ *
+ * All the return values are in ascii.  So check read return value
+ * and do appropriate conversions in your application.
+ */
+
+/* IOCTL commands */
+
+/* Note: these commands reflect possible monitor features.
+ * Some boards choose to support some of the features only.
+ */
+#define ENVCTRL_RD_CPU_TEMPERATURE     _IOR('p', 0x40, int)
+#define ENVCTRL_RD_CPU_VOLTAGE         _IOR('p', 0x41, int)
+#define ENVCTRL_RD_FAN_STATUS          _IOR('p', 0x42, int)
+#define ENVCTRL_RD_WARNING_TEMPERATURE _IOR('p', 0x43, int)
+#define ENVCTRL_RD_SHUTDOWN_TEMPERATURE        _IOR('p', 0x44, int)
+#define ENVCTRL_RD_VOLTAGE_STATUS      _IOR('p', 0x45, int)
+#define ENVCTRL_RD_SCSI_TEMPERATURE    _IOR('p', 0x46, int)
+#define ENVCTRL_RD_ETHERNET_TEMPERATURE        _IOR('p', 0x47, int)
+#define ENVCTRL_RD_MTHRBD_TEMPERATURE  _IOR('p', 0x48, int)
+
+/* Read return values for a voltage status request. */
+#define ENVCTRL_VOLTAGE_POWERSUPPLY_GOOD       0x01
+#define ENVCTRL_VOLTAGE_BAD                    0x02
+#define ENVCTRL_POWERSUPPLY_BAD                        0x03
+#define ENVCTRL_VOLTAGE_POWERSUPPLY_BAD                0x04
+
+/* Read return values for a fan status request.
+ * A failure match means either the fan fails or
+ * the fan is not connected.  Some boards have optional
+ * connectors to connect extra fans.
+ *
+ * There are maximum 8 monitor fans.  Some are cpu fans
+ * some are system fans.  The mask below only indicates
+ * fan by order number.
+ * Below is a sample application:
+ *
+ *     if (ioctl(fd, ENVCTRL_READ_FAN_STATUS, 0) < 0) {
+ *             printf("ioctl fan failed\n");
+ *     }
+ *     if (read(fd, rslt, 1) <= 0) {
+ *             printf("error or fan not monitored\n");
+ *     } else {
+ *             if (rslt[0] == ENVCTRL_ALL_FANS_GOOD) {
+ *                     printf("all fans good\n");
+ *     } else if (rslt[0] == ENVCTRL_ALL_FANS_BAD) {
+ *             printf("all fans bad\n");
+ *     } else {
+ *             if (rslt[0] & ENVCTRL_FAN0_FAILURE_MASK) {
+ *                     printf("fan 0 failed or not connected\n");
+ *     }
+ *     ......
+ */  
+
+#define ENVCTRL_ALL_FANS_GOOD                  0x00
+#define ENVCTRL_FAN0_FAILURE_MASK              0x01
+#define ENVCTRL_FAN1_FAILURE_MASK              0x02
+#define ENVCTRL_FAN2_FAILURE_MASK              0x04
+#define ENVCTRL_FAN3_FAILURE_MASK              0x08
+#define ENVCTRL_FAN4_FAILURE_MASK              0x10
+#define ENVCTRL_FAN5_FAILURE_MASK              0x20
+#define ENVCTRL_FAN6_FAILURE_MASK              0x40
+#define ENVCTRL_FAN7_FAILURE_MASK              0x80
+#define ENVCTRL_ALL_FANS_BAD                   0xFF
 
 #endif /* !(_SPARC64_ENVCTRL_H) */
index 0f16f43a5bcc045c1e2615be4d745cafdaf8d0bc..2449cb82b6af148555be2f406247805b8a761509 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: string.h,v 1.14 1998/10/20 03:09:18 jj Exp $
+/* $Id: string.h,v 1.14.2.1 2000/05/27 04:46:42 davem Exp $
  * string.h: External definitions for optimized assembly string
  *           routines for the Linux Kernel.
  *
index cb82da06265a895c6a41e7fce037d7951ba496c8..099e7c53d6f2996ae9f0e8759d15ca4094a5ad22 100644 (file)
@@ -4,6 +4,10 @@
  * Andrew G. Morgan <morgan@transmeta.com>
  * Alexander Kjeldaas <astor@guardian.no>
  * with help from Aleph1, Roland Buresund and Andrew Main.
+ *
+ * See here for the libcap library ("POSIX draft" compliance):
+ *
+ * ftp://linux.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/
  */ 
 
 #ifndef _LINUX_CAPABILITY_H
@@ -167,8 +171,8 @@ typedef __u32 kernel_cap_t;
 
 #define CAP_IPC_OWNER        15
 
-/* Insert and remove kernel modules */
-
+/* Insert and remove kernel modules - modify kernel without limit */
+/* Modify cap_bset */
 #define CAP_SYS_MODULE       16
 
 /* Allow ioperm/iopl access */
@@ -287,12 +291,12 @@ extern kernel_cap_t cap_bset;
 #define CAP_EMPTY_SET       to_cap_t(0)
 #define CAP_FULL_SET        to_cap_t(~0)
 #define CAP_INIT_EFF_SET    to_cap_t(~0 & ~CAP_TO_MASK(CAP_SETPCAP))
-#define CAP_INIT_INH_SET    to_cap_t(~0 & ~CAP_TO_MASK(CAP_SETPCAP))
+#define CAP_INIT_INH_SET    to_cap_t(0)
 
 #define CAP_TO_MASK(x) (1 << (x))
 #define cap_raise(c, flag)   (cap_t(c) |=  CAP_TO_MASK(flag))
 #define cap_lower(c, flag)   (cap_t(c) &= ~CAP_TO_MASK(flag))
-#define cap_raised(c, flag)  (cap_t(c) & CAP_TO_MASK(flag) & cap_bset)
+#define cap_raised(c, flag)  (cap_t(c) & CAP_TO_MASK(flag))
 
 static inline kernel_cap_t cap_combine(kernel_cap_t a, kernel_cap_t b)
 {
diff --git a/include/net/slhc.h b/include/net/slhc.h
deleted file mode 100644 (file)
index c7b39db..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __NET_SLHC_H
-#define __NET_SLHC_H
-
-extern void slhc_install(void);
-
-#endif
index 1b5b68d12441d7206361f73e08fc32fb430f5890..e126bd8c3f7a1d6f64dfaaa8bd2075707a7f1ca5 100644 (file)
@@ -8,6 +8,8 @@
 #include <linux/mm.h>
 #include <asm/uaccess.h>
 
+kernel_cap_t cap_bset = CAP_INIT_EFF_SET;
+
 /* Note: never hold tasklist_lock while spinning for this one */
 spinlock_t task_capability_lock;
 
@@ -17,8 +19,6 @@ spinlock_t task_capability_lock;
  * uninteresting and/or not to be changed.
  */
 
-kernel_cap_t cap_bset = CAP_FULL_SET;
-
 asmlinkage int sys_capget(cap_user_header_t header, cap_user_data_t dataptr)
 {
      int error, pid;
index 500b758e2ca37179d76acad28794b907034ecfc8..5c3d7619ce18ab651f83bb82bba725454916986e 100644 (file)
@@ -7,6 +7,9 @@
 
        Modified to avoid chroot and file sharing problems.
        Mikael Pettersson
+
+       Back port check for modprobe loops from 2.3.
+       Keith Owens <kaos@ocs.com.au> May 2000
 */
 
 #define __KERNEL_SYSCALLS__
@@ -45,12 +48,15 @@ use_init_fs_context(void)
        unlock_kernel();
 }
 
-static int exec_modprobe(void * module_name)
+int exec_usermodehelper(char *program_path, char *argv[], char *envp[])
 {
-       static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
-       char *argv[] = { modprobe_path, "-s", "-k", (char*)module_name, NULL };
        int i;
 
+       current->session = 1;
+       current->pgrp = 1;
+
+       use_init_fs_context();
+
        /* Prevent parent user process from sending signals to child.
           Otherwise, if the modprobe program does not exist, it might
           be possible to get a user defined signal handler to execute
@@ -62,10 +68,6 @@ static int exec_modprobe(void * module_name)
        flush_signal_handlers(current);
        spin_unlock_irq(&current->sigmask_lock);
 
-       /* Copy root dir and cwd from init */
-       use_init_fs_context();
-
-       /* Close our copies of user's open files */
        for (i = 0; i < current->files->max_fds; i++ ) {
                if (current->files->fd[i]) close(i);
        }
@@ -73,33 +75,57 @@ static int exec_modprobe(void * module_name)
        /* Drop the "current user" thing */
        free_uid(current);
 
-       /* Give kmod all privileges.. */
+       /* Give kmod all effective privileges.. */
        current->uid = current->euid = current->fsuid = 0;
-       cap_set_full(current->cap_inheritable);
        cap_set_full(current->cap_effective);
 
        /* Allow execve args to be in kernel space. */
        set_fs(KERNEL_DS);
 
        /* Go, go, go... */
-       if (execve(modprobe_path, argv, envp) < 0) {
+       if (execve(program_path, argv, envp) < 0)
+               return -errno;
+       return 0;
+}
+
+static int exec_modprobe(void * module_name)
+{
+       static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
+       char *argv[] = { modprobe_path, "-s", "-k", (char*)module_name, NULL };
+       int ret;
+
+       ret = exec_usermodehelper(modprobe_path, argv, envp);
+       if (ret) {
                printk(KERN_ERR
                       "kmod: failed to exec %s -s -k %s, errno = %d\n",
                       modprobe_path, (char*) module_name, errno);
-               return -errno;
        }
-       return 0;
+       return ret;
 }
 
-/*
-       request_module: the function that everyone calls when they need
-       a module.
-*/
+/**
+ *     request_module - try to load a kernel module
+ *     @module_name: Name of module
+ *
+ *     Load a module using the user mode module loader. The function returns
+ *     zero on success or a negative errno code on failure. Note that a
+ *     successful module load does not mean the module did not then unload
+ *     and exit on an error of its own. Callers must check that the service
+ *     they requested is now available not blindly invoke it.
+ *
+ *     If module auto-loading support is disabled then this function
+ *     becomes a no-operation.
+ */
 int request_module(const char * module_name)
 {
        int pid;
        int waitpid_result;
        sigset_t tmpsig;
+       int i;
+       static atomic_t kmod_concurrent = ATOMIC_INIT(0);
+#define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */
+       static int kmod_loop_msg;
 
        /* Don't allow request_module() before the root fs is mounted!  */
        if ( ! current->fs->root ) {
@@ -108,9 +134,31 @@ int request_module(const char * module_name)
                return -EPERM;
        }
 
+       /* If modprobe needs a service that is in a module, we get a recursive
+        * loop.  Limit the number of running kmod threads to NR_TASKS/2 or
+        * MAX_KMOD_CONCURRENT, whichever is the smaller.  A cleaner method
+        * would be to run the parents of this process, counting how many times
+        * kmod was invoked.  That would mean accessing the internals of the
+        * process tables to get the command line, proc_pid_cmdline is static
+        * and it is not worth changing the proc code just to handle this case. 
+        * KAO.
+        */
+       i = NR_TASKS/2;
+       if (i > MAX_KMOD_CONCURRENT)
+               i = MAX_KMOD_CONCURRENT;
+       atomic_inc(&kmod_concurrent);
+       if (atomic_read(&kmod_concurrent) > i) {
+               if (kmod_loop_msg++ < 5)
+                       printk(KERN_ERR
+                              "kmod: runaway modprobe loop assumed and stopped\n");
+               atomic_dec(&kmod_concurrent);
+               return -ENOMEM;
+       }
+
        pid = kernel_thread(exec_modprobe, (void*) module_name, 0);
        if (pid < 0) {
                printk(KERN_ERR "request_module[%s]: fork failed, errno %d\n", module_name, -pid);
+               atomic_dec(&kmod_concurrent);
                return pid;
        }
 
@@ -122,6 +170,7 @@ int request_module(const char * module_name)
        spin_unlock_irq(&current->sigmask_lock);
 
        waitpid_result = waitpid(pid, NULL, __WCLONE);
+       atomic_dec(&kmod_concurrent);
 
        /* Allow signals again.. */
        spin_lock_irq(&current->sigmask_lock);
@@ -130,8 +179,8 @@ int request_module(const char * module_name)
        spin_unlock_irq(&current->sigmask_lock);
 
        if (waitpid_result != pid) {
-               printk (KERN_ERR "kmod: waitpid(%d,NULL,0) failed, returning %d.\n",
-                       pid, waitpid_result);
+               printk(KERN_ERR "request_module[%s]: waitpid(%d,...) failed, errno %d\n",
+                      module_name, pid, -waitpid_result);
        }
        return 0;
 }
index 132817cec3f84e370ebc2243308925bc9237287f..aaa985fa0e5d01b57949af7af2aeb29eeb08407a 100644 (file)
@@ -801,8 +801,11 @@ int proc_dointvec(ctl_table *table, int write, struct file *filp,
 int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
                        void *buffer, size_t *lenp)
 {
+       if (!capable(CAP_SYS_MODULE)) {
+               return -EPERM;
+       }
        return do_proc_dointvec(table,write,filp,buffer,lenp,1,
-               (current->pid == 1) ? OP_SET : OP_AND);
+                               (current->pid == 1) ? OP_SET : OP_AND);
 }
 
 
index 72572e83edb08bea07ee922647820374425009f0..b2c1154f53108fc7df6c1169c01e421c3b646b37 100644 (file)
@@ -142,7 +142,8 @@ int shrink_mmap(int priority, int gfp_mask)
        struct page * page;
        int count;
 
-       count = limit >> priority;
+       /* Make sure we scan all pages twice at priority 0. */
+       count = (limit << 1) >> priority;
 
        page = mem_map + clock;
        do {
index ecd56b04235ad795f127a67d106c68969a11725a..ad45dddca2dba1abed2f1f32cfaec82f836e2faa 100644 (file)
@@ -182,6 +182,8 @@ do { unsigned long size = 1 << high; \
 unsigned long __get_free_pages(int gfp_mask, unsigned long order)
 {
        unsigned long flags;
+       static unsigned long last_woke_kswapd = 0;
+       static atomic_t free_before_allocate = ATOMIC_INIT(0);
 
        if (order >= NR_MEM_LISTS)
                goto nopage;
@@ -206,28 +208,41 @@ unsigned long __get_free_pages(int gfp_mask, unsigned long order)
                int freed;
                extern struct wait_queue * kswapd_wait;
 
-               if (nr_free_pages >= freepages.high)
-               {
-                       /* share RO cachelines in fast path */
-                       if (current->trashing_mem)
-                               current->trashing_mem = 0;
+               if (nr_free_pages > freepages.high)
                        goto ok_to_allocate;
+               
+               /* Maybe wake up kswapd for background swapping. */
+               if (time_before(last_woke_kswapd + HZ, jiffies)) {
+                       last_woke_kswapd = jiffies;
+                       wake_up_interruptible(&kswapd_wait);
                }
-               else
-               {
-                       if (nr_free_pages < freepages.low)
-                               wake_up_interruptible(&kswapd_wait);
-                       if (nr_free_pages > freepages.min && !current->trashing_mem)
+
+               /* Somebody needs to free pages so we free some of our own. */
+               if (atomic_read(&free_before_allocate)) {
+                       current->flags |= PF_MEMALLOC;
+                       freed = try_to_free_pages(gfp_mask);
+                       current->flags &= ~PF_MEMALLOC;
+                       if (freed)
                                goto ok_to_allocate;
                }
 
-               current->trashing_mem = 1;
-               current->flags |= PF_MEMALLOC;
-               freed = try_to_free_pages(gfp_mask);
-               current->flags &= ~PF_MEMALLOC;
+               /* Do we have to help kswapd or can we proceed? */
+               if (nr_free_pages < (freepages.low + freepages.low) / 2) {
+                       wake_up_interruptible(&kswapd_wait);
+
+                       /* Help kswapd a bit... */
+                       current->flags |= PF_MEMALLOC;
+                       atomic_inc(&free_before_allocate);
+                       freed = try_to_free_pages(gfp_mask);
+                       atomic_dec(&free_before_allocate);
+                       current->flags &= ~PF_MEMALLOC;
 
-               if (!freed && !(gfp_mask & (__GFP_MED | __GFP_HIGH)))
-                       goto nopage;
+                       if (nr_free_pages > freepages.min)
+                               goto ok_to_allocate;
+
+                       if (!freed && !(gfp_mask & (__GFP_MED | __GFP_HIGH)))
+                               goto nopage;
+               }
        }
 ok_to_allocate:
        spin_lock_irqsave(&page_alloc_lock, flags);
index c8fbcf987c343140be60a56e7237b9e2b194585b..f275a2c683064723449a622d3d9b14e125cabc1a 100644 (file)
@@ -333,6 +333,7 @@ static int swap_out(unsigned int priority, int gfp_mask)
 
        for (; counter >= 0; counter--) {
                max_cnt = 0;
+               assign = 0;
                pbest = NULL;
        select:
                read_lock(&tasklist_lock);
@@ -377,10 +378,17 @@ out:
  * cluster them so that we get good swap-out behaviour. See
  * the "free_memory()" macro for details.
  */
+#define FLUSH_COUNT    8
 static int do_try_to_free_pages(unsigned int gfp_mask)
 {
-       int priority;
-       int count = SWAP_CLUSTER_MAX;
+       int priority, count, swapcount;
+       int flushcount = FLUSH_COUNT;
+       int ret = 0;
+
+       /* Kswapd does nothing but freeing pages so we can do big bites. */
+       if (gfp_mask == GFP_KSWAPD)
+               flushcount = SWAP_CLUSTER_MAX;
+       count = flushcount;
 
        lock_kernel();
 
@@ -390,6 +398,7 @@ static int do_try_to_free_pages(unsigned int gfp_mask)
        priority = 6;
        do {
                while (shrink_mmap(priority, gfp_mask)) {
+                       ret = 1;
                        if (!--count)
                                goto done;
                }
@@ -397,23 +406,36 @@ static int do_try_to_free_pages(unsigned int gfp_mask)
                /* Try to get rid of some shared memory pages.. */
                if (gfp_mask & __GFP_IO) {
                        while (shm_swap(priority, gfp_mask)) {
+                               ret = 1;
                                if (!--count)
                                        goto done;
                        }
                }
 
                /* Then, try to page stuff out.. */
+               swapcount = flushcount;
                while (swap_out(priority, gfp_mask)) {
-                       if (!--count)
-                               goto done;
+                       if (!--swapcount)
+                               break;
                }
 
                shrink_dcache_memory(priority, gfp_mask);
        } while (--priority >= 0);
+
+       /* End with a shrink_mmap() to make sure we free something. */
+       while (shrink_mmap(0, gfp_mask)) {
+               ret = 1;
+               if (!--count)
+                       goto done;
+       }
 done:
        unlock_kernel();
 
-       return priority >= 0;
+       if (!ret)
+               printk("VM: do_try_to_free_pages failed for %s...\n",
+                               current->comm);
+       /* Return success if we freed a page. */
+       return ret;
 }
 
 /*
@@ -485,10 +507,18 @@ int kswapd(void *unused)
                 * the processes needing more memory will wake us
                 * up on a more timely basis.
                 */
+               int failed = 0;
+sleep:
                interruptible_sleep_on(&kswapd_wait);
+               /* Enough free pages? -> call do_try_to_free_pages only once. */
+               if (nr_free_pages > freepages.low) {
+                       do_try_to_free_pages(GFP_KSWAPD);
+                       goto sleep;
+               }
+               /* Not enough free pages? -> free pages agressively. */
                while (nr_free_pages < freepages.high)
                {
-                       if (do_try_to_free_pages(GFP_KSWAPD))
+                       if (do_try_to_free_pages(GFP_KSWAPD) && failed++ < 10)
                        {
                                if (tsk->need_resched)
                                        schedule();
index 3f7d5f30f88a7b0e4533bd82b5f3ae8d2d33c85d..b1921a99c4b5b320350ab576cac4af36584d8f02 100644 (file)
@@ -81,7 +81,6 @@
 #include <linux/skbuff.h>
 #include <net/sock.h>
 #include <linux/rtnetlink.h>
-#include <net/slhc.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
 #include <net/br.h>
@@ -1966,18 +1965,6 @@ __initfunc(int net_dev_init(void))
 #endif
 #if defined(CONFIG_COMX)
        comx_init();
-#endif
-       /*
-        *      SLHC if present needs attaching so other people see it
-        *      even if not opened.
-        */
-        
-#ifdef CONFIG_INET      
-#if (defined(CONFIG_SLIP) && defined(CONFIG_SLIP_COMPRESSED)) \
-        || defined(CONFIG_PPP) \
-    || (defined(CONFIG_ISDN) && defined(CONFIG_ISDN_PPP))
-       slhc_install();
-#endif 
 #endif
 
 #ifdef CONFIG_NET_PROFILE
index 4d0044000501d159b57b9bb44b309e0629aa7b3c..2d9114c7c8acc4e4d84dd426eb80cf954dda3021 100644 (file)
@@ -1,6 +1,6 @@
 /* linux/net/inet/arp.c
  *
- * Version:    $Id: arp.c,v 1.77.2.5 1999/12/14 10:32:39 davem Exp $
+ * Version:    $Id: arp.c,v 1.77.2.6 2000/05/27 04:46:43 davem Exp $
  *
  * Copyright (C) 1994 by Florian  La Roche
  *
index 6c1edfd7e68945fcfe2452456ec329a3d76248d7..f3cd7c9845fb930d217399db7c7b2721271a9f74 100644 (file)
@@ -3,7 +3,7 @@
  *     
  *             Alan Cox, <alan@redhat.com>
  *
- *     Version: $Id: icmp.c,v 1.52.2.4 1999/11/16 02:28:40 davem Exp $
+ *     Version: $Id: icmp.c,v 1.52.2.5 2000/04/08 02:45:56 davem Exp $
  *
  *     This program is free software; you can redistribute it and/or
  *     modify it under the terms of the GNU General Public License
@@ -494,9 +494,12 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
                daddr = icmp_param->replyopts.faddr;
        if (ip_route_output(&rt, daddr, rt->rt_spec_dst, RT_TOS(skb->nh.iph->tos), 0))
                return;
-       ip_build_xmit(sk, icmp_glue_bits, icmp_param, 
-               icmp_param->data_len+sizeof(struct icmphdr),
-               &ipc, rt, MSG_DONTWAIT);
+       if (icmpv4_xrlim_allow(rt, icmp_param->icmph.type, 
+                              icmp_param->icmph.code)) { 
+               ip_build_xmit(sk, icmp_glue_bits, icmp_param, 
+                             icmp_param->data_len+sizeof(struct icmphdr),
+                             &ipc, rt, MSG_DONTWAIT);
+       }
        ip_rt_put(rt);
 }
 
index b99502f33e2a022e8cdb02b090c1bbc4a0dc2754..19e0592479fd5fa0c6816fed2eee252f350dc358 100644 (file)
@@ -87,28 +87,28 @@ int ip_masq_mod_lkp_unlink(struct ip_masq_mod *mmod)
 {
        struct ip_masq_mod **mmod_p;
 
-       write_lock_bh(&masq_mod_lock);
+       spin_lock_bh(&masq_mod_lock);
 
        for (mmod_p = &ip_masq_mod_lkp_base; *mmod_p ; mmod_p = &(*mmod_p)->next)
                if (mmod == (*mmod_p))  {
                        *mmod_p = mmod->next;
                        mmod->next = NULL;
-                       write_unlock_bh(&masq_mod_lock);
+                       spin_unlock_bh(&masq_mod_lock);
                        return 0;
                }
 
-       write_unlock_bh(&masq_mod_lock);
+       spin_unlock_bh(&masq_mod_lock);
        return -EINVAL;
 }
 
 int ip_masq_mod_lkp_link(struct ip_masq_mod *mmod)
 {
-       write_lock_bh(&masq_mod_lock);
+       spin_lock_bh(&masq_mod_lock);
 
        mmod->next = ip_masq_mod_lkp_base;
        ip_masq_mod_lkp_base=mmod;
 
-       write_unlock_bh(&masq_mod_lock);
+       spin_unlock_bh(&masq_mod_lock);
        return 0;
 }
 
index 62884aae815bea606c4a62fcf808b56f454151e3..154f479830d3879ba3d1f749f5a17932bcaf6aaf 100644 (file)
@@ -9,7 +9,7 @@
  *      as published by the Free Software Foundation; either version
  *      2 of the License, or (at your option) any later version.
  * 
- *  $Id: syncookies.c,v 1.7.2.3 1999/12/07 03:11:07 davem Exp $
+ *  $Id: syncookies.c,v 1.7.2.4 2000/04/17 05:57:01 davem Exp $
  *
  *  Missing: IPv6 support. 
  */
@@ -104,11 +104,19 @@ get_cookie_sock(struct sock *sk, struct sk_buff *skb, struct open_request *req,
 {
        struct tcp_opt *tp = &sk->tp_pinfo.af_tcp;
 
+       tp->syn_backlog++;
+
        sk = tp->af_specific->syn_recv_sock(sk, skb, req, dst);
-       req->sk = sk; 
-       
-       /* Queue up for accept() */
-       tcp_synq_queue(tp, req);
+       if (sk) {
+               req->sk = sk; 
+
+               /* Queue up for accept() */
+               tcp_synq_queue(tp, req);
+       } else {
+               tp->syn_backlog--;
+               (*req->class->destructor)(req);
+               tcp_openreq_free(req); 
+       }
        
        return sk; 
 }
index fa4dc0912a11367ed7bc37d245c4afcb4cfbb150..495d943fd3588b038b27be5ea25d079b7a11c1eb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
  *
- * $Id: sysctl_net_ipv4.c,v 1.38.2.2 1999/09/22 16:33:30 davem Exp $
+ * $Id: sysctl_net_ipv4.c,v 1.38.2.3 2000/04/17 05:46:06 davem Exp $
  *
  * Begun April 1, 1996, Mike Shaver.
  * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
index 8961ebbefd79778af2c6c69d05d13ec25c9dba0a..922ad102c22dc75ad799d52c5b91069638113c1d 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp.c,v 1.140.2.10 2000/03/21 20:54:13 davem Exp $
+ * Version:    $Id: tcp.c,v 1.140.2.11 2000/04/17 05:57:01 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -1484,15 +1484,18 @@ static void tcp_close_pending (struct sock *sk)
        while(req) {
                struct open_request *iter;
                
-               if (req->sk)
-                       tcp_close(req->sk, 0);
-
                iter = req;
                req = req->dl_next;
                
+               if (iter->sk) {
+                       tcp_close(iter->sk, 0);
+                       sk->ack_backlog--;
+               } else {
+                       tcp_dec_slow_timer(TCP_SLT_SYNACK);
+                       sk->tp_pinfo.af_tcp.syn_backlog--;
+               }
                (*iter->class->destructor)(iter);
-               tcp_dec_slow_timer(TCP_SLT_SYNACK);
-               sk->ack_backlog--;
+
                tcp_openreq_free(iter);
        }
 
index 0b7ede133acdc4409ff319d98b47366369683830..2ae7e231f25b94e8b3f289f319e114c64d6a8c75 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp_input.c,v 1.164.2.12 2000/01/31 20:43:36 davem Exp $
+ * Version:    $Id: tcp_input.c,v 1.164.2.15 2000/05/27 04:01:49 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -55,6 +55,7 @@
  *                                     work without delayed acks. 
  *             Andi Kleen:             Process packets with PSH set in the
  *                                     fast path.
+ *             Vincent Zweije          Fix TIME-WAIT FIN ACK bug.
  */
 
 #include <linux/config.h>
@@ -295,6 +296,7 @@ static void tcp_reset(struct sock *sk)
                sk->dport = 0;
                sk->daddr = 0;
                sk->num = 0;
+               tcp_clear_xmit_timer(sk, TIME_RETRANS);
        }
        sk->shutdown = SHUTDOWN_MASK;
        if (!sk->dead) 
@@ -1017,7 +1019,7 @@ tcp_timewait_state_process(struct tcp_tw_bucket *tw, struct sk_buff *skb,
        }
        /* Ack old packets if necessary */ 
        if (!after(TCP_SKB_CB(skb)->end_seq, tw->rcv_nxt) &&
-           (th->doff * 4) > len)
+           (len > (th->doff * 4) || th->fin))
                return TCP_TW_ACK; 
        return 0; 
 }
@@ -2022,10 +2024,10 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb,
                }
        
                sk = tp->af_specific->syn_recv_sock(sk, skb, req, NULL);
-               tcp_dec_slow_timer(TCP_SLT_SYNACK);
                if (sk == NULL)
                        return NULL;
                
+               tcp_dec_slow_timer(TCP_SLT_SYNACK);
                req->expires = 0UL;
                req->sk = sk;
        }
index 8075e571a6bf8708d529c998e1436b9c27e51de6..18ae4380cfc402175c1c62ec76578298016005fa 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             Implementation of the Transmission Control Protocol(TCP).
  *
- * Version:    $Id: tcp_timer.c,v 1.62.2.6 2000/01/13 04:28:06 davem Exp $
+ * Version:    $Id: tcp_timer.c,v 1.62.2.9 2000/05/27 04:04:43 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -178,6 +178,7 @@ static int tcp_write_timeout(struct sock *sk)
                sk->dport = 0;
                sk->daddr = 0;
                sk->num = 0;
+               tcp_clear_xmit_timer(sk, TIME_RETRANS);
        }
 
        return ret;
@@ -432,6 +433,15 @@ void tcp_retransmit_timer(unsigned long data)
                return;
        }
 
+       /* Unfortunately, here in 2.2.x on SMP this timer can race
+        * with the user level context.  It is fixed properly in 2.3.x
+        * and later, but for now we have to use this hack.
+        */
+       if (tp->packets_out == 0) {
+               tcp_clear_xmit_timer(sk, TIME_RETRANS);
+               return;
+       }
+
        /* Clear delay ack timer. */
        tcp_clear_xmit_timer(sk, TIME_DACK);
 
index 94560de6f445d5761661cc67eb3fa225d7ea9bcd..1ab0bdce3b4f5a02414b4d74a771af2052a6e84c 100644 (file)
@@ -5,7 +5,7 @@
  *
  *             The User Datagram Protocol (UDP).
  *
- * Version:    $Id: udp.c,v 1.66.2.3 1999/08/07 10:56:36 davem Exp $
+ * Version:    $Id: udp.c,v 1.66.2.4 2000/03/10 00:16:05 davem Exp $
  *
  * Authors:    Ross Biro, <bir7@leland.Stanford.Edu>
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
index ce57902206ea6c5f919e20bb71e6154a116780e1..0ef2fb445212fe037badca6d66e6924a0fef783c 100644 (file)
@@ -8,7 +8,7 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  *
- * Version:    $Id: af_unix.c,v 1.76.2.2 1999/08/07 10:56:48 davem Exp $
+ * Version:    $Id: af_unix.c,v 1.76.2.4 2000/05/27 04:46:44 davem Exp $
  *
  * Fixes:
  *             Linus Torvalds  :       Assorted bug cures.
diff --git a/p_sg2136_sg2137 b/p_sg2136_sg2137
deleted file mode 100644 (file)
index 623f167..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
---- linux/include/scsi/sg.h    Thu Jan 13 20:40:36 2000
-+++ linux/include/scsi/sg.h2137        Thu May  4 01:25:19 2000
-@@ -9,13 +9,15 @@
- Original driver (sg.h):
- *       Copyright (C) 1992 Lawrence Foard
- 2.x extensions to driver:
--*       Copyright (C) 1998, 1999 Douglas Gilbert
--
-+*       Copyright (C) 1998 - 2000 Douglas Gilbert
--    Version: 2.1.36 (991008)
-+    Version: 2.1.37 (20000504)
-     This version for 2.2.x series kernels
-     D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au)
-+    Changes since 2.1.36 (991008)
-+        - fix 0 length scatter gather requests + alignment
-+        - activate SG_SCSI_RESET ioctl() [to work needs mid level changes]
-     Changes since 2.1.34 (990603)
-         - skipped 2.1.35 (never fully released)
-         - add queuing info into struct sg_scsi_id
-@@ -35,19 +37,24 @@
-         - clean up logging of pointers to use %p (for 64 bit architectures)
-         - rework usage of get_user/copy_to_user family of kernel calls
-         - "disown" scsi_command blocks before releasing them
--    Changes since 2.1.30 (990320)
--        - memory tweaks: change flags on kmalloc (GFP_KERNEL to GFP_ATOMIC)
--        -                increase max allowable mid-level pool usage
-+Map of SG verions to the Linux kernels in which they appear:
-+       ----------        ----------------------------------
-+       original          all kernels < 2.2.6
-+       2.1.31            2.2.6 and 2.2.7
-+       2.1.32            2.2.8 and 2.2.9
-+       2.1.34            2.2.10 to 2.2.13
-+       2.1.36            2.2.14 and 2.2.15
-+       2.1.37            2.2.16
-+       3.0.13            optional version 3 sg driver for 2.2 series
-+       3.1.13            2.3.99-pre5, version 3 sg driver for 2.3 series
-     New features and changes:
--        - per file descriptor (fd) write-read sequencing and command queues.
--        - command queuing supported (SG_MAX_QUEUE is maximum per fd).
-+        - per file descriptor (fd) write-read sequencing
-+        - command queuing supported
-         - scatter-gather supported (allowing potentially megabyte transfers).
--        - the SCSI target, host and driver status are returned
--          in unused fields of sg_header (maintaining its original size).
--        - asynchronous notification support added (SIGPOLL, SIGIO) for
--          read()s (write()s should never block).
-+        - more SCSI status information returned
-+        - asynchronous notification support added (SIGPOLL, SIGIO)
-         - pack_id logic added so read() can wait for a specific pack_id. 
-         - uses memory > ISA_DMA_THRESHOLD if adapter allows it (e.g. a
-           pci scsi adapter).
-@@ -68,61 +75,21 @@
-           calling the ioctl of the same name is a more flexible and
-           safer approach.
-         - adds several ioctl calls, see ioctl section below.
-- 
-- Good documentation on the original "sg" device interface and usage can be
-- found in the Linux HOWTO document: "SCSI Programming HOWTO" (version 0.5)
-- by Heiko Eissfeldt; last updated 7 May 1996. Here is a quick summary of
-- sg basics:
-- An SG device is accessed by writing SCSI commands plus any associated 
-- outgoing data to it; the resulting status codes and any incoming data
-- are then obtained by a read call. The device can be opened O_NONBLOCK
-- (non-blocking) and poll() used to monitor its progress. The device may be
-- opened O_EXCL which excludes other "sg" users from this device (but not 
-- "sd", "st" or "sr" users). The buffer given to the write() call is made
-- up as follows:
--        - struct sg_header image (see below)
--        - scsi command (6, 10 or 12 bytes long)
--        - data to be written to the device (if any)
--
-- The buffer received from the corresponding read() call contains:
--        - struct sg_header image (check results + sense_buffer)
--        - data read back from device (if any)
--
-- The given SCSI command has its LUN field overwritten internally by the
-- value associated with the device that has been opened.
-- This device currently uses "indirect IO" in the sense that data is
-- DMAed into kernel buffers from the hardware and afterwards is
-- transferred into the user space (or vice versa if you are writing).
-- Transfer speeds or up to 20 to 30MBytes/sec have been measured using
-- indirect IO. For faster throughputs "direct IO" which cuts out the
-- double handling of data is required. This will also need a new interface.
--
-- Grabbing memory for those kernel buffers used in this driver for DMA may
-- cause the dreaded ENOMEM error. This error seems to be more prevalent 
-- under early 2.2.x kernels than under the 2.0.x kernel series. For a given 
-- (large) transfer the memory obtained by this driver must be contiguous or
-- scatter-gather must be used (if supported by the adapter). [Furthermore, 
-- ISA SCSI adapters can only use memory below the 16MB level on a i386.]
--
-- When a "sg" device is open()ed O_RDWR then this driver will attempt to
-- reserve a buffer of SG_DEF_RESERVED_SIZE that will be used by subsequent
-- write()s on this file descriptor as long as:
--    -  it is not already in use (eg when command queuing is in use)
--    -  the write() does not call for a buffer size larger than the
--       reserved size.
-- In these cases the write() will attempt to find the memory it needs for
-- DMA buffers dynamically and in the worst case will fail with ENOMEM.
-- The amount of memory actually reserved depends on various dynamic factors
-- and can be checked with the SG_GET_RESERVED_SIZE ioctl(). [In a very
-- tight memory situation it may yield 0!] The size of the reserved buffer
-- can be changed with the SG_SET_RESERVED_SIZE ioctl(). It should be
-- followed with a call to the SG_GET_RESERVED_SIZE ioctl() to find out how
-- much was actually reserved.
--
-- More documentation plus test and utility programs can be found at 
-- http://www.torque.net/sg
-+ Documentation
-+ =============
-+ A web site for SG device drivers can be found at:
-+        http://www.torque.net/sg  [alternatively check the MAINTAINERS file]
-+ The main documents are still based on 2.x versions:
-+        http://www.torque.net/sg/p/scsi-generic.txt
-+        http://www.torque.net/sg/p/scsi-generic_long.txt
-+ The first document can also be found in the kernel source tree, probably at:
-+        /usr/src/linux/Documentation/scsi-generic.txt .
-+ Documentation on the changes and additions in 3.x version of the sg driver
-+ can be found at: http://www.torque.net/sg/p/scsi-generic_v3.txt
-+ Utility and test programs are also available at that web site.
- */
-+ 
- #define SG_MAX_SENSE 16   /* too little, unlikely to change in 2.2.x */
-@@ -213,9 +180,13 @@
- #define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
-                    number on the next write() on this file descriptor */
--/* Returns -EBUSY if occupied else takes as input: 0 -> do nothing,
--   1 -> device reset or  2 -> bus reset (not operational yet) */
-+/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
- #define SG_SCSI_RESET 0x2284
-+/* Associated values that can be given to SG_SCSI_RESET follow */
-+#define         SG_SCSI_RESET_NOTHING   0
-+#define         SG_SCSI_RESET_DEVICE    1
-+#define         SG_SCSI_RESET_BUS       2
-+#define         SG_SCSI_RESET_HOST      3
- #define SG_SCATTER_SZ (8 * 4096)  /* PAGE_SIZE not available to user */
---- linux/drivers/scsi/sg.c    Thu Jan 13 20:40:23 2000
-+++ linux/drivers/scsi/sg.c2137        Thu May  4 01:24:01 2000
-@@ -7,7 +7,7 @@
-  * Original driver (sg.c):
-  *        Copyright (C) 1992 Lawrence Foard
-  * 2.x extensions to driver:
-- *        Copyright (C) 1998, 1999 Douglas Gilbert
-+ *        Copyright (C) 1998 - 2000 Douglas Gilbert
-  *
-  * This program is free software; you can redistribute it and/or modify
-  * it under the terms of the GNU General Public License as published by
-@@ -16,8 +16,8 @@
-  *
-  *  Borrows code from st driver. Thanks to Alessandro Rubini's "dd" book.
-  */
-- static char * sg_version_str = "Version: 2.1.36 (991218)";
-- static int sg_version_num = 20136; /* 2 digits for each component */
-+ static char * sg_version_str = "Version: 2.1.37 (20000504)";
-+ static int sg_version_num = 20137; /* 2 digits for each component */
- /*
-  *  D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes:
-  *      - scsi logging is available via SCSI_LOG_TIMEOUT macros. First
-@@ -100,7 +100,7 @@
- static void sg_detach(Scsi_Device *);
--struct Scsi_Device_Template sg_template = {NULL, NULL, "sg", NULL, 0xff,
-+struct Scsi_Device_Template sg_template = {NULL, "generic", "sg", NULL, 0xff,
-                                            SCSI_GENERIC_MAJOR, 0, 0, 0, 0,
-                                            sg_detect, sg_init,
-                                            sg_finish, sg_attach, sg_detach};
-@@ -609,8 +609,29 @@
-             return -EBUSY;
-         result = get_user(val, (int *)arg);
-         if (result) return result;
--        /* Don't do anything till scsi mod level visibility */
--        return 0;
-+        if (SG_SCSI_RESET_NOTHING == val)
-+            return 0;
-+#ifdef SCSI_TRY_RESET_DEVICE
-+        switch (val)
-+        {
-+        case SG_SCSI_RESET_DEVICE:
-+            val = SCSI_TRY_RESET_DEVICE;
-+            break;
-+        case SG_SCSI_RESET_BUS:
-+            val = SCSI_TRY_RESET_BUS;
-+            break;
-+        case SG_SCSI_RESET_HOST:
-+            val = SCSI_TRY_RESET_HOST;
-+            break;
-+        default:
-+            return -EINVAL;
-+        }
-+        if(! capable(CAP_SYS_ADMIN))  return -EACCES;
-+        return (scsi_reset_provider(sdp->device, val) == SUCCESS) ? 0 : -EIO;
-+#else
-+        SCSI_LOG_TIMEOUT(1, printk("sg_ioctl: SG_RESET_SCSI not supported\n"));
-+        result = -EINVAL;
-+#endif
-     case SCSI_IOCTL_SEND_COMMAND:
-         /* Allow SCSI_IOCTL_SEND_COMMAND without checking suser() since the
-            user already has read/write access to the generic device and so
-@@ -1124,6 +1145,8 @@
-     SCSI_LOG_TIMEOUT(4, printk("sg_start_req: max_buff_size=%d\n", 
-                                max_buff_size)); 
-+    if (max_buff_size <= 0)
-+        return 0;
-     if ((! sg_res_in_use(sfp)) && (max_buff_size <= rsv_schp->bufflen)) {
-         sg_link_reserve(sfp, srp, max_buff_size);
-         sg_write_xfer(req_schp, inp, num_write_xfer);
-@@ -1351,6 +1374,8 @@
-     Sg_scatter_hold * rsv_schp = &sfp->reserve;
-     SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size)); 
-+    /* round request up to next highest SG_SECTOR_SZ byte boundary */
-+    size = (size + SG_SECTOR_MSK) & (~SG_SECTOR_MSK);
-     if (rsv_schp->use_sg > 0) {
-         int k, num;
-         int rem = size;
-@@ -1431,12 +1456,12 @@
- static Sg_request * sg_add_request(Sg_fd * sfp)
- {
-     int k;
--    Sg_request * resp = NULL;
--    Sg_request * rp;
-+    Sg_request * resp = sfp->headrp;
-+    Sg_request * rp = sfp->req_arr;
--    resp = sfp->headrp;
--    rp = sfp->req_arr;
-     if (! resp) {
-+        memset(rp, 0, sizeof(Sg_request));
-+        rp->parentfp = sfp;
-         resp = rp;
-         sfp->headrp = resp;
-     }
-@@ -1444,12 +1469,15 @@
-         if (0 == sfp->cmd_q)
-             resp = NULL;   /* command queuing disallowed */
-         else {
--            for (k = 0, rp; k < SG_MAX_QUEUE; ++k, ++rp) {
-+            for (k = 0; k < SG_MAX_QUEUE; ++k, ++rp) {
-                 if (! rp->parentfp)
-                     break;
-             }
-             if (k < SG_MAX_QUEUE) {
--                while (resp->nextrp) resp = resp->nextrp;
-+                memset(rp, 0, sizeof(Sg_request));
-+                rp->parentfp = sfp;
-+                while (resp->nextrp) 
-+                    resp = resp->nextrp;
-                 resp->nextrp = rp;
-                 resp = rp;
-             }
-@@ -1458,11 +1486,7 @@
-         }
-     }
-     if (resp) {
--        resp->parentfp = sfp;
-         resp->nextrp = NULL;
--        resp->res_used = 0;
--        memset(&resp->data, 0, sizeof(Sg_scatter_hold));
--        memset(&resp->header, 0, sizeof(struct sg_header));
-         resp->my_cmdp = NULL;
-     }
-     return resp;
-@@ -1478,14 +1502,14 @@
-         return 0;
-     prev_rp = sfp->headrp;
-     if (srp == prev_rp) {
--        prev_rp->parentfp = NULL;
-         sfp->headrp = prev_rp->nextrp;
-+        prev_rp->parentfp = NULL;
-         return 1;
-     }
-     while ((rp = prev_rp->nextrp)) {
-         if (srp == rp) {
--            rp->parentfp = NULL;
-             prev_rp->nextrp = rp->nextrp;
-+            rp->parentfp = NULL;
-             return 1;
-         }
-         prev_rp = rp;
index f2189e239925190749d53038a85c7f59a5405d2a..0f5446dea9ff0db8cc636df142ed91ab8fe7b0c6 100644 (file)
@@ -402,6 +402,7 @@ proc minimenu { w mnum line text variable helpidx } {
 
 proc menusplit {w m n} {
        if { $n > 2 } then {
+               update idletasks
                set menuoptsize [expr [$m yposition 2] - [$m yposition 1]]   
                set maxsize [winfo screenheight $w]
                set splitpoint [expr $maxsize * 4 / 5 / $menuoptsize - 1]
@@ -411,6 +412,10 @@ proc menusplit {w m n} {
        }
 }
 
+proc menutitle {text menu w} {
+       wm title $w "$text"
+}
+
 proc submenu { w mnum line text subnum } {
        frame $w.x$line
        button $w.x$line.l -text "" -width 15 -relief groove
index 18d968eff8c86191febd793dbc46cd11296a6e30..68d63d72b997f5439bc989c272b3c84dd7fe73e7 100644 (file)
@@ -1248,7 +1248,7 @@ void dump_tk_script( struct kconfig * scfg )
                printf( "\tminimenu $w.config.f %d %d \"%s\" tmpvar_%d %s\n",
                    cfg->menu_number, cfg->menu_line, cfg->label,
                    -(cfg->nameindex), vartable[cfg->next->nameindex].name );
-               printf( "\tmenu $w.config.f.x%d.x.menu -title \"%s\"\n",
+               printf( "\tmenu $w.config.f.x%d.x.menu -tearoffcommand \"menutitle \\\"%s\\\"\"\n",
                    cfg->menu_line, cfg->label );
                cfg1 = cfg;
                opt_count = 0;
index e17f109a49d29e95aa7f9ec5fd9c06d0513afd76..abf5ad8b080dc649d13655e6bb89654e3a86c404 100644 (file)
@@ -172,6 +172,28 @@ static const char * get_qstring( const char * pnt, char ** label )
 
 
 
+/*
+ * Get a quoted or unquoted string. It is recognized by the first 
+ * non-white character. '"' and '"' are not allowed inside the string.
+ */
+static const char * get_qnqstring( const char * pnt, char ** label )
+{
+    char quote_char;
+
+    while ( *pnt == ' ' || *pnt == '\t' )
+       pnt++;
+
+    if ( *pnt == '\0' )
+       return pnt;
+    quote_char = *pnt;
+    if ( quote_char == '"' || quote_char == '\'' )
+       return get_qstring( pnt, label );
+    else
+       return get_string( pnt, label );
+}
+
+
+
 /*
  * Tokenize an 'if' statement condition.
  */
@@ -505,6 +527,8 @@ static void tokenize_line( const char * pnt )
        if ( last_menuoption != NULL )
        {
            pnt = get_qstring(pnt, &cfg->label);
+           if (cfg->label == NULL)
+               syntax_error( "missing comment text" );
            last_menuoption->label = cfg->label;
            last_menuoption = NULL;
        }
@@ -546,7 +570,9 @@ static void tokenize_line( const char * pnt )
     case token_define_string:
        pnt = get_string( pnt, &buffer );
        cfg->nameindex = get_varnum( buffer );
-       pnt = get_qstring( pnt, &cfg->value );
+       pnt = get_qnqstring( pnt, &cfg->value );
+       if (cfg->value == NULL)
+           syntax_error( "missing value" );
        break;
 
     case token_dep_bool:
@@ -659,7 +685,9 @@ static void tokenize_line( const char * pnt )
        pnt = get_qstring ( pnt, &cfg->label );
        pnt = get_string  ( pnt, &buffer );
        cfg->nameindex = get_varnum( buffer );
-       pnt = get_qstring  ( pnt, &cfg->value );
+       pnt = get_qnqstring  ( pnt, &cfg->value );
+       if (cfg->value == NULL)
+           syntax_error( "missing initial value" );
        break;
 
     case token_if: