]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 30 Jul 2007 23:36:33 +0000 (16:36 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 30 Jul 2007 23:36:33 +0000 (16:36 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
  IB/ipath: Workaround problem of errormask register being overwritten
  IB/ipath: Fix some issues with buffer cancel and sendctrl register update
  IB/ipath: Use faster put_tid_2 routine after initialization
  IB/ipath: Remove unsafe fastrcvint code from interrupt handler
  IB/ehca: Move extern declarations from .c files to .h files
  IB/mlx4: Whitespace fix
  IB/ehca: Fix include order to better match kernel style
  mlx4_core: Remove kfree() in mlx4_mr_alloc() error flow
  RDMA/amso1100: Initialize the wait_queue_head_t in the c2_qp structure

312 files changed:
Documentation/DocBook/kernel-api.tmpl
Documentation/feature-removal-schedule.txt
Documentation/ja_JP/HOWTO
Documentation/ja_JP/stable_api_nonsense.txt
Documentation/kernel-parameters.txt
Documentation/kobject.txt
Documentation/stable_api_nonsense.txt
Documentation/sysfs-rules.txt
arch/alpha/kernel/smp.c
arch/arm/Kconfig
arch/arm/kernel/setup.c
arch/arm/kernel/smp.c
arch/arm/kernel/traps.c
arch/arm/mach-sa1100/jornada720.c
arch/arm/mach-sa1100/jornada720_ssp.c
arch/blackfin/Makefile
arch/blackfin/kernel/dma-mapping.c
arch/blackfin/kernel/setup.c
arch/blackfin/kernel/traps.c
arch/blackfin/kernel/vmlinux.lds.S
arch/blackfin/mach-bf561/head.S
arch/blackfin/mach-common/cacheinit.S
arch/blackfin/mach-common/ints-priority-dc.c
arch/blackfin/mach-common/ints-priority-sc.c
arch/frv/kernel/sys_frv.c
arch/i386/Kconfig
arch/i386/Kconfig.debug
arch/i386/kernel/acpi/Makefile
arch/i386/kernel/e820.c
arch/i386/kernel/microcode.c
arch/i386/kernel/setup.c
arch/i386/kernel/sys_i386.c
arch/i386/kernel/sysenter.c
arch/i386/mm/init.c
arch/i386/power/Makefile
arch/ia64/hp/sim/simscsi.c
arch/ia64/kernel/init_task.c
arch/m32r/kernel/ptrace.c
arch/m32r/kernel/smpboot.c
arch/m32r/kernel/sys_m32r.c
arch/m68k/kernel/process.c
arch/m68k/kernel/sys_m68k.c
arch/mips/kernel/smp.c
arch/mips/kernel/syscall.c
arch/parisc/hpux/fs.c
arch/parisc/kernel/init_task.c
arch/parisc/kernel/process.c
arch/parisc/kernel/smp.c
arch/powerpc/Kconfig.debug
arch/powerpc/configs/lite5200_defconfig
arch/powerpc/configs/pmac32_defconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/syscalls.c
arch/powerpc/lib/rheap.c
arch/powerpc/oprofile/cell/spu_task_sync.c
arch/ppc/configs/TQM8540_defconfig
arch/ppc/configs/TQM8541_defconfig
arch/ppc/configs/TQM8555_defconfig
arch/ppc/configs/TQM8560_defconfig
arch/ppc/configs/ev64360_defconfig
arch/ppc/configs/ml300_defconfig
arch/ppc/configs/ml403_defconfig
arch/ppc/configs/mpc834x_sys_defconfig
arch/ppc/configs/prep_defconfig
arch/s390/appldata/appldata_base.c
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/entry.S
arch/s390/kernel/entry64.S
arch/s390/kernel/head.S
arch/s390/kernel/init_task.c
arch/s390/kernel/process.c
arch/s390/kernel/smp.c
arch/s390/kernel/sys_s390.c
arch/s390/kernel/syscalls.S
arch/s390/kernel/vmlinux.lds.S
arch/s390/kernel/vtime.c
arch/s390/mm/vmem.c
arch/sparc/defconfig
arch/sparc/kernel/init_task.c
arch/sparc/kernel/prom.c
arch/sparc64/Kconfig.debug
arch/sparc64/kernel/Makefile
arch/sparc64/kernel/ebus.c
arch/sparc64/kernel/init_task.c
arch/sparc64/kernel/iommu.c [moved from arch/sparc64/kernel/pci_iommu.c with 68% similarity]
arch/sparc64/kernel/isa.c
arch/sparc64/kernel/pci.c
arch/sparc64/kernel/pci_common.c
arch/sparc64/kernel/pci_fire.c
arch/sparc64/kernel/pci_psycho.c
arch/sparc64/kernel/pci_sabre.c
arch/sparc64/kernel/pci_schizo.c
arch/sparc64/kernel/pci_sun4v.c
arch/sparc64/kernel/process.c
arch/sparc64/kernel/sbus.c
arch/sparc64/kernel/time.c
arch/sparc64/kernel/traps.c
arch/sparc64/mm/fault.c
arch/um/drivers/mmapper_kern.c
arch/um/kernel/exec.c
arch/um/kernel/init_task.c
arch/um/kernel/syscall.c
arch/x86_64/defconfig
arch/x86_64/ia32/ptrace32.c
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/acpi/Makefile
arch/x86_64/kernel/head.S
arch/x86_64/kernel/process.c
arch/x86_64/kernel/setup.c
arch/x86_64/kernel/suspend.c
arch/x86_64/kernel/sys_x86_64.c
arch/x86_64/vdso/vma.c
block/Kconfig
block/blktrace.c
block/bsg.c
drivers/acpi/Kconfig
drivers/acpi/sleep/Makefile
drivers/acpi/sleep/main.c
drivers/acpi/sleep/poweroff.c
drivers/acpi/sleep/proc.c
drivers/acpi/sleep/sleep.h
drivers/base/core.c
drivers/base/firmware_class.c
drivers/base/power/Makefile
drivers/base/power/power.h
drivers/block/Makefile
drivers/char/agp/Kconfig
drivers/char/agp/ati-agp.c
drivers/char/agp/compat_ioctl.c
drivers/char/agp/frontend.c
drivers/char/agp/generic.c
drivers/char/agp/intel-agp.c
drivers/char/agp/sgi-agp.c
drivers/char/mmtimer.c
drivers/char/mspec.c
drivers/i2c/busses/Kconfig
drivers/i2c/chips/tps65010.c
drivers/infiniband/hw/ipath/ipath_diag.c
drivers/infiniband/ulp/iser/iscsi_iser.c
drivers/input/serio/Kconfig
drivers/lguest/Kconfig
drivers/lguest/hypercalls.c
drivers/lguest/interrupts_and_traps.c
drivers/lguest/lg.h
drivers/lguest/lguest.c
drivers/media/dvb/dvb-usb/af9005-fe.c
drivers/media/dvb/frontends/dvb-pll.c
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/ivtv/ivtv-driver.h
drivers/media/video/ivtv/ivtv-fileops.c
drivers/media/video/ivtv/ivtv-firmware.c
drivers/media/video/ivtv/ivtv-ioctl.c
drivers/media/video/ivtv/ivtv-mailbox.c
drivers/media/video/ivtv/ivtv-streams.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/zoran.h
drivers/media/video/zoran_device.c
drivers/media/video/zoran_driver.c
drivers/message/fusion/Kconfig
drivers/message/fusion/Makefile
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptbase.h
drivers/message/fusion/mptctl.c
drivers/message/fusion/mptdebug.h [new file with mode: 0644]
drivers/message/fusion/mptfc.c
drivers/message/fusion/mptlan.c
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptscsih.c
drivers/message/fusion/mptspi.c
drivers/net/Makefile
drivers/net/bfin_mac.c
drivers/net/fec.c
drivers/pci/pci-acpi.c
drivers/pci/pci.c
drivers/pnp/pnpacpi/core.c
drivers/rtc/rtc-bfin.c
drivers/s390/char/Kconfig
drivers/s390/char/raw3270.c
drivers/s390/char/sclp_vt220.c
drivers/s390/char/vmur.c
drivers/s390/cio/blacklist.c
drivers/s390/cio/ccwgroup.c
drivers/s390/cio/chp.c
drivers/s390/cio/chsc.c
drivers/s390/cio/chsc.h
drivers/s390/cio/cio.c
drivers/s390/cio/cio_debug.h
drivers/s390/cio/cmf.c
drivers/s390/cio/css.c
drivers/s390/cio/css.h
drivers/s390/cio/device.c
drivers/s390/cio/device_fsm.c
drivers/s390/cio/device_ops.c
drivers/sbus/sbus.c
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/linit.c
drivers/scsi/aacraid/nark.c
drivers/scsi/aacraid/rkt.c
drivers/scsi/aacraid/rx.c
drivers/scsi/advansys.c
drivers/scsi/aic7xxx/aic79xx_osm.c
drivers/scsi/aic7xxx/aic7xxx_osm.c
drivers/scsi/aic94xx/aic94xx_init.c
drivers/scsi/iscsi_tcp.c
drivers/scsi/libiscsi.c
drivers/scsi/libsas/sas_ata.c
drivers/scsi/libsas/sas_discover.c
drivers/scsi/libsas/sas_dump.c
drivers/scsi/libsas/sas_expander.c
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/scsi_devinfo.c
drivers/scsi/sym53c8xx_2/sym_glue.c
drivers/usb/Makefile
drivers/usb/core/message.c
drivers/usb/core/quirks.c
drivers/usb/gadget/config.c
drivers/usb/gadget/epautoconf.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/inode.c
drivers/usb/gadget/m66592-udc.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/gadget/zero.c
drivers/usb/serial/cp2101.c
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/io_edgeport.c
drivers/usb/serial/mct_u232.c
drivers/usb/serial/mct_u232.h
drivers/usb/serial/sierra.c
drivers/usb/serial/usb-serial.c
drivers/usb/storage/unusual_devs.h
drivers/video/bw2.c
drivers/video/cg14.c
drivers/video/cg3.c
drivers/video/cg6.c
drivers/video/ffb.c
drivers/video/leo.c
drivers/video/p9100.c
drivers/video/sbuslib.c
drivers/video/tcx.c
fs/compat_ioctl.c
fs/dcookies.c
fs/partitions/msdos.c
fs/partitions/sun.c
fs/partitions/sun.h
fs/pipe.c
fs/proc/inode.c
fs/splice.c
include/acpi/acpi_bus.h
include/acpi/acpi_drivers.h
include/asm-arm/arch-mxc/uncompress.h
include/asm-blackfin/bfin-global.h
include/asm-blackfin/mach-bf548/cdefBF54x_base.h
include/asm-blackfin/mach-bf548/irq.h
include/asm-blackfin/mach-bf561/cdefBF561.h
include/asm-blackfin/mach-bf561/defBF561.h
include/asm-blackfin/thread_info.h
include/asm-i386/e820.h
include/asm-m68k/system.h
include/asm-m68knommu/machdep.h
include/asm-s390/ccwdev.h
include/asm-s390/s390_ext.h
include/asm-s390/smp.h
include/asm-s390/unistd.h
include/asm-sparc/device.h
include/asm-sparc/floppy.h
include/asm-sparc64/dma-mapping.h
include/asm-sparc64/fbio.h
include/asm-sparc64/floppy.h
include/asm-sparc64/iommu.h
include/asm-sparc64/parport.h
include/asm-sparc64/pci.h
include/asm-sparc64/sbus.h
include/linux/blkdev.h
include/linux/bsg.h
include/linux/dvb/video.h
include/linux/freezer.h
include/linux/genhd.h
include/linux/hugetlb.h
include/linux/interrupt.h
include/linux/kobject.h
include/linux/lguest.h
include/linux/mm.h
include/linux/pm.h
include/linux/reiserfs_fs.h
include/linux/suspend.h
include/linux/usb.h
include/scsi/libiscsi.h
include/scsi/libsas.h
kernel/auditsc.c
kernel/irq/devres.c
kernel/params.c
kernel/power/Kconfig
kernel/power/Makefile
kernel/power/main.c
kernel/power/power.h
kernel/sys.c
kernel/sysctl.c
lib/kobject_uevent.c
mm/Kconfig
mm/mmap.c
mm/oom_kill.c
mm/page_alloc.c
mm/slub.c
mm/swapfile.c
mm/vmstat.c
net/iucv/iucv.c
sound/pci/bt87x.c
sound/soc/pxa/pxa2xx-ac97.c

index eb42bf9847cb97e388cbebbeb35ef7ec428e85cc..ec7c498b69fc6c7ae7ba55fa4ac14e7d6c6b618e 100644 (file)
@@ -704,14 +704,23 @@ X!Idrivers/video/console/fonts.c
 
   <chapter id="splice">
       <title>splice API</title>
-  <para>)
+  <para>
        splice is a method for moving blocks of data around inside the
-       kernel, without continually transferring it between the kernel
+       kernel, without continually transferring them between the kernel
        and user space.
   </para>
 !Iinclude/linux/splice.h
 !Ffs/splice.c
   </chapter>
 
+  <chapter id="pipes">
+      <title>pipes API</title>
+  <para>
+       Pipe interfaces are all for in-kernel (builtin image) use.
+       They are not exported for use by modules.
+  </para>
+!Iinclude/linux/pipe_fs_i.h
+!Ffs/pipe.c
+  </chapter>
 
 </book>
index c175eedadb5fb358f589d93da61720e9453b73ad..a43d2878a4efd7a7d0fbe8d50d324c3fcaf75416 100644 (file)
@@ -211,22 +211,6 @@ Who:       Richard Purdie <rpurdie@rpsys.net>
 
 ---------------------------
 
-What:  read_dev_chars(), read_conf_data{,_lpm}() (s390 common I/O layer)
-When:  December 2007
-Why:   These functions are a leftover from 2.4 times. They have several
-       problems:
-       - Duplication of checks that are done in the device driver's
-         interrupt handler
-       - common I/O layer can't do device specific error recovery
-       - device driver can't be notified for conditions happening during
-         execution of the function
-       Device drivers should issue the read device characteristics and read
-       configuration data ccws and do the appropriate error handling
-       themselves.
-Who:   Cornelia Huck <cornelia.huck@de.ibm.com>
-
----------------------------
-
 What:  i2c-ixp2000, i2c-ixp4xx and scx200_i2c drivers
 When:  September 2007
 Why:   Obsolete. The new i2c-gpio driver replaces all hardware-specific
index b2446a090870ea9ecb694b622bd66d20feeac98e..9f08dab1e75be0d2ea0b39315c82fdc7023e60d5 100644 (file)
@@ -1,23 +1,24 @@
-NOTE:
-This is Japanese translated version of "Documentation/HOWTO".
-This one is maintained by Tsugikazu Shibata <tshibata@ab.jp.nec.com>
-and JF Project team <www.linux.or.jp/JF>.
-If you find difference with original file or problem in translation,
-please contact maintainer of this file or JF project.
-
-Please also note that purpose of this file is easier to read for non
-English natives and not to be intended to fork. So, if you have any
-comments or updates of this file, please try to update Original(English)
-file at first.
-
-Last Updated: 2007/06/04
+NOTE:
+This is a version of Documentation/HOWTO translated into Japanese.
+This document is maintained by Tsugikazu Shibata <tshibata@ab.jp.nec.com>
+and the JF Project team <www.linux.or.jp/JF>.
+If you find any difference between this document and the original file
+or a problem with the translation,
+please contact the maintainer of this file or JF project.
+
+Please also note that the purpose of this file is to be easier to read
+for non English (read: Japanese) speakers and is not intended as a
+fork. So if you have any comments or updates for this file, please try
+to update the original English file first.
+
+Last Updated: 2007/07/18
 ==================================
 これは、
-linux-2.6.21/Documentation/HOWTO
+linux-2.6.22/Documentation/HOWTO
 の和訳です。
 
 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
-翻訳日: 2007/06/04
+翻訳日: 2007/07/16
 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
 校正者: 松倉さん <nbh--mats at nifty dot com>
          小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
@@ -52,6 +53,7 @@ Linux カーネル開発コミュニティと共に活動するやり方を学
 また、このコミュニティがなぜ今うまくまわっているのかという理由の一部も
 説明しようと試みています。
 
+
 カーネルは 少量のアーキテクチャ依存部分がアセンブリ言語で書かれている
 以外は大部分は C 言語で書かれています。C言語をよく理解していることはカー
 ネル開発者には必要です。アーキテクチャ向けの低レベル部分の開発をするの
@@ -141,6 +143,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
      これらのルールに従えばうまくいくことを保証することではありません
      が (すべてのパッチは内容とスタイルについて精査を受けるので)、
      ルールに従わなければ間違いなくうまくいかないでしょう。
+
      この他にパッチを作る方法についてのよくできた記述は-
 
        "The Perfect Patch"
@@ -360,44 +363,42 @@ linux-kernel メーリングリストで収集された多数のパッチと同
 
   git ツリー-
     - Kbuild の開発ツリー、Sam Ravnborg <sam@ravnborg.org>
-       kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
+       git.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
 
     - ACPI の開発ツリー、 Len Brown <len.brown@intel.com>
-       kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
+       git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
 
     - Block の開発ツリー、Jens Axboe <axboe@suse.de>
-       kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
+       git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
 
     - DRM の開発ツリー、Dave Airlie <airlied@linux.ie>
-       kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
+       git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
 
     - ia64 の開発ツリー、Tony Luck <tony.luck@intel.com>
-       kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
-
-    - ieee1394 の開発ツリー、Jody McIntyre <scjody@modernduck.com>
-       kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
+       git.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
 
     - infiniband, Roland Dreier <rolandd@cisco.com>
-       kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
+       git.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
 
     - libata, Jeff Garzik <jgarzik@pobox.com>
-       kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
+       git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
 
     - ネットワークドライバ, Jeff Garzik <jgarzik@pobox.com>
-       kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
+       git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
 
     - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
-       kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
+       git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
 
     - SCSI, James Bottomley <James.Bottomley@SteelEye.com>
-       kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
-
-  その他の git カーネルツリーは http://kernel.org/git に一覧表がありま
-  す。
+       git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
 
   quilt ツリー-
     - USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
        kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
+    - x86-64 と i386 の仲間 Andi Kleen <ak@suse.de>
+
+  その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ
+  イルに一覧表があります。
 
 バグレポート
 -------------
@@ -508,6 +509,7 @@ MAINTAINERS ファイルにリストがありますので参照してくださ
 せん*。単に自分のパッチに対して指摘された問題を全て修正して再送すれば
 いいのです。
 
+
 カーネルコミュニティと企業組織のちがい
 -----------------------------------------------------------------
 
@@ -577,6 +579,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
    かし、500行のパッチは、正しいことをレビューするのに数時間かかるかも
    しれません(時間はパッチのサイズなどにより指数関数に比例してかかりま
    す)
+
    小さいパッチは何かあったときにデバッグもとても簡単になります。パッ
    チを1個1個取り除くのは、とても大きなパッチを当てた後に(かつ、何かお
    かしくなった後で)解剖するのに比べればとても簡単です。
@@ -591,6 +594,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
         う。先生は簡潔な最高の解をみたいのです。良い生徒はこれを知って
         おり、そして最終解の前の中間作業を提出することは決してないので
         す"
+
         カーネル開発でもこれは同じです。メンテナー達とレビューア達は、
         問題を解決する解の背後になる思考プロセスをみたいとは思いません。
         彼らは単純であざやかな解決方法をみたいのです。
index b3f2b27f0881869178b7052749758ca121a88335..7653b5cbfed2bfcf8db4f95d0d738968647f2a45 100644 (file)
@@ -1,17 +1,17 @@
 NOTE:
-This is a Japanese translated version of
-"Documentation/stable_api_nonsense.txt".
-This one is maintained by
-IKEDA, Munehiro <m-ikeda@ds.jp.nec.com>
-and JF Project team <http://www.linux.or.jp/JF/>.
-If you find difference with original file or problem in translation,
+This is a version of Documentation/stable_api_nonsense.txt into Japanese.
+This document is maintained by IKEDA, Munehiro <m-ikeda@ds.jp.nec.com>
+and the JF Project team <http://www.linux.or.jp/JF/>.
+If you find any difference between this document and the original file
+or a problem with the translation,
 please contact the maintainer of this file or JF project.
 
-Please also note that purpose of this file is easier to read for non
-English natives and not to be intended to fork. So, if you have any
-comments or updates of this file, please try to update
-Original(English) file at first.
+Please also note that the purpose of this file is to be easier to read
+for non English (read: Japanese) speakers and is not intended as a
+fork. So if you have any comments or updates of this file, please try
+to update the original English file first.
 
+Last Updated: 2007/07/18
 ==================================
 これは、
 linux-2.6.22-rc4/Documentation/stable_api_nonsense.txt の和訳
index fb80e9ffea68b7a0f8d1bbcd0229957276cfe747..1156653338fe7baefff9246e50e4724cb8d8e07c 100644 (file)
@@ -30,6 +30,7 @@ the beginning of each description states the restrictions within which a
 parameter is applicable:
 
        ACPI    ACPI support is enabled.
+       AGP     AGP (Accelerated Graphics Port) is enabled.
        ALSA    ALSA sound support is enabled.
        APIC    APIC support is enabled.
        APM     Advanced Power Management support is enabled.
@@ -227,6 +228,12 @@ and is between 256 and 4096 characters. It is defined in the file
                        to assume that this machine's pmtimer latches its value
                        and always returns good values.
 
+       agp=            [AGP]
+                       { off | try_unsupported }
+                       off: disable AGP support
+                       try_unsupported: try to drive unsupported chipsets
+                               (may crash computer or cause data corruption)
+
        enable_timer_pin_1 [i386,x86-64]
                        Enable PIN 1 of APIC timer
                        Can be useful to work around chipset bugs
index e44855513b3d4f044177d871a8af7b8383c3fa59..8ee49ee7c9636ad6b16cd0ecf3e98539ff818fee 100644 (file)
@@ -27,7 +27,6 @@ in detail, and briefly here:
 - kobjects     a simple object.
 - kset         a set of objects of a certain type.
 - ktype                a set of helpers for objects of a common type. 
-- subsystem    a controlling object for a number of ksets.
 
 
 The kobject infrastructure maintains a close relationship with the
@@ -54,13 +53,15 @@ embedded in larger data structures and replace fields they duplicate.
 1.2 Definition
 
 struct kobject {
+       const char              * k_name;
        char                    name[KOBJ_NAME_LEN];
-       atomic_t                refcount;
+       struct kref             kref;
        struct list_head        entry;
        struct kobject          * parent;
        struct kset             * kset;
        struct kobj_type        * ktype;
-       struct dentry           * dentry;
+       struct sysfs_dirent     * sd;
+       wait_queue_head_t       poll;
 };
 
 void kobject_init(struct kobject *);
@@ -137,8 +138,7 @@ If a kobject does not have a parent when it is registered, its parent
 becomes its dominant kset. 
 
 If a kobject does not have a parent nor a dominant kset, its directory
-is created at the top-level of the sysfs partition. This should only
-happen for kobjects that are embedded in a struct subsystem. 
+is created at the top-level of the sysfs partition.
 
 
 
@@ -150,10 +150,10 @@ A kset is a set of kobjects that are embedded in the same type.
 
 
 struct kset {
-       struct subsystem        * subsys;
        struct kobj_type        * ktype;
        struct list_head        list;
        struct kobject          kobj;
+       struct kset_uevent_ops  * uevent_ops;
 };
 
 
@@ -169,8 +169,7 @@ struct kobject * kset_find_obj(struct kset *, char *);
 
 
 The type that the kobjects are embedded in is described by the ktype
-pointer. The subsystem that the kobject belongs to is pointed to by the
-subsys pointer. 
+pointer.
 
 A kset contains a kobject itself, meaning that it may be registered in
 the kobject hierarchy and exported via sysfs. More importantly, the
@@ -209,6 +208,58 @@ the hierarchy.
 kset_find_obj() may be used to locate a kobject with a particular
 name. The kobject, if found, is returned. 
 
+There are also some helper functions which names point to the formerly
+existing "struct subsystem", whose functions have been taken over by
+ksets.
+
+
+decl_subsys(name,type,uevent_ops)
+
+Declares a kset named '<name>_subsys' of type <type> with
+uevent_ops <uevent_ops>. For example,
+
+decl_subsys(devices, &ktype_device, &device_uevent_ops);
+
+is equivalent to doing:
+
+struct kset devices_subsys = {
+     .kobj = {
+          .name = "devices",
+     },
+     .ktype = &ktype_devices,
+     .uevent_ops = &device_uevent_ops,
+};
+
+
+The objects that are registered with a subsystem that use the
+subsystem's default list must have their kset ptr set properly. These
+objects may have embedded kobjects or ksets. The
+following helpers make setting the kset easier:
+
+
+kobj_set_kset_s(obj,subsys)
+
+- Assumes that obj->kobj exists, and is a struct kobject.
+- Sets the kset of that kobject to the kset <subsys>.
+
+
+kset_set_kset_s(obj,subsys)
+
+- Assumes that obj->kset exists, and is a struct kset.
+- Sets the kset of the embedded kobject to the kset <subsys>.
+
+subsys_set_kset(obj,subsys)
+
+- Assumes obj->subsys exists, and is a struct subsystem.
+- Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.
+
+void subsystem_init(struct kset *s);
+int subsystem_register(struct kset *s);
+void subsystem_unregister(struct kset *s);
+struct kset *subsys_get(struct kset *s);
+void kset_put(struct kset *s);
+
+These are just wrappers around the respective kset_* functions.
 
 2.3 sysfs
 
@@ -254,114 +305,3 @@ Instances of struct kobj_type are not registered; only referenced by
 the kset. A kobj_type may be referenced by an arbitrary number of
 ksets, as there may be disparate sets of identical objects. 
 
-
-
-4. subsystems
-
-4.1 Description
-
-A subsystem represents a significant entity of code that maintains an
-arbitrary number of sets of objects of various types. Since the number
-of ksets and the type of objects they contain are variable, a
-generic representation of a subsystem is minimal. 
-
-
-struct subsystem {
-       struct kset             kset;
-       struct rw_semaphore     rwsem;
-};
-
-int subsystem_register(struct subsystem *);
-void subsystem_unregister(struct subsystem *);
-
-struct subsystem * subsys_get(struct subsystem * s);
-void subsys_put(struct subsystem * s);
-
-
-A subsystem contains an embedded kset so:
-
-- It can be represented in the object hierarchy via the kset's
-  embedded kobject. 
-
-- It can maintain a default list of objects of one type. 
-
-Additional ksets may attach to the subsystem simply by referencing the
-subsystem before they are registered. (This one-way reference means
-that there is no way to determine the ksets that are attached to the
-subsystem.) 
-
-All ksets that are attached to a subsystem share the subsystem's R/W
-semaphore. 
-
-
-4.2 subsystem Programming Interface.
-
-The subsystem programming interface is simple and does not offer the
-flexibility that the kset and kobject programming interfaces do. They
-may be registered and unregistered, as well as reference counted. Each
-call forwards the calls to their embedded ksets (which forward the
-calls to their embedded kobjects).
-
-
-4.3 Helpers
-
-A number of macros are available to make dealing with subsystems and
-their embedded objects easier. 
-
-
-decl_subsys(name,type)
-
-Declares a subsystem named '<name>_subsys', with an embedded kset of
-type <type>. For example, 
-
-decl_subsys(devices,&ktype_devices);
-
-is equivalent to doing:
-
-struct subsystem device_subsys = {
-       .kset = {
-            .kobj = {
-                  .name = "devices",
-            },
-            .ktype = &ktype_devices,
-       }
-}; 
-
-
-The objects that are registered with a subsystem that use the
-subsystem's default list must have their kset ptr set properly. These
-objects may have embedded kobjects, ksets, or other subsystems. The
-following helpers make setting the kset easier: 
-
-
-kobj_set_kset_s(obj,subsys)
-
-- Assumes that obj->kobj exists, and is a struct kobject. 
-- Sets the kset of that kobject to the subsystem's embedded kset.
-
-
-kset_set_kset_s(obj,subsys)
-
-- Assumes that obj->kset exists, and is a struct kset.
-- Sets the kset of the embedded kobject to the subsystem's 
-  embedded kset. 
-
-subsys_set_kset(obj,subsys)
-
-- Assumes obj->subsys exists, and is a struct subsystem.
-- Sets obj->subsys.kset.kobj.kset to the subsystem's embedded kset.
-
-
-4.4 sysfs
-
-subsystems are represented in sysfs via their embedded kobjects. They
-follow the same rules as previously mentioned with no exceptions. They
-typically receive a top-level directory in sysfs, except when their
-embedded kobject is part of another kset, or the parent of the
-embedded kobject is explicitly set. 
-
-Note that the subsystem's embedded kset must be 'attached' to the
-subsystem itself in order to use its rwsem. This is done after
-kset_add() has been called. (Not before, because kset_add() uses its
-subsystem for a default parent if it doesn't already have one).
-
index a2afca3b2bab6fb923fb9eda102073606d15c278..847b342b7b20bd73758c603d833811c5ac738930 100644 (file)
@@ -10,7 +10,7 @@ kernel to userspace interfaces.  The kernel to userspace interface is
 the one that application programs use, the syscall interface.  That
 interface is _very_ stable over time, and will not break.  I have old
 programs that were built on a pre 0.9something kernel that still work
-just fine on the latest 2.6 kernel release.  This interface is the one
+just fine on the latest 2.6 kernel release.  That interface is the one
 that users and application programmers can count on being stable.
 
 
index 42861bb0bc9b3f451585a9fef2655ee2a22dafd9..80ef562160bba8697c5623ee3b5fa9b4c163ab4a 100644 (file)
@@ -1,19 +1,18 @@
 Rules on how to access information in the Linux kernel sysfs
 
-The kernel exported sysfs exports internal kernel implementation-details
+The kernel-exported sysfs exports internal kernel implementation details
 and depends on internal kernel structures and layout. It is agreed upon
 by the kernel developers that the Linux kernel does not provide a stable
 internal API. As sysfs is a direct export of kernel internal
-structures, the sysfs interface can not provide a stable interface eighter,
+structures, the sysfs interface cannot provide a stable interface either;
 it may always change along with internal kernel changes.
 
 To minimize the risk of breaking users of sysfs, which are in most cases
 low-level userspace applications, with a new kernel release, the users
-of sysfs must follow some rules to use an as abstract-as-possible way to
+of sysfs must follow some rules to use an as-abstract-as-possible way to
 access this filesystem. The current udev and HAL programs already
 implement this and users are encouraged to plug, if possible, into the
-abstractions these programs provide instead of accessing sysfs
-directly.
+abstractions these programs provide instead of accessing sysfs directly.
 
 But if you really do want or need to access sysfs directly, please follow
 the following rules and then your programs should work with future
@@ -25,22 +24,22 @@ versions of the sysfs interface.
   implementation details in its own API. Therefore it is not better than
   reading directories and opening the files yourself.
   Also, it is not actively maintained, in the sense of reflecting the
-  current kernel-development. The goal of providing a stable interface
-  to sysfs has failed, it causes more problems, than it solves. It
+  current kernel development. The goal of providing a stable interface
+  to sysfs has failed; it causes more problems than it solves. It
   violates many of the rules in this document.
 
 - sysfs is always at /sys
   Parsing /proc/mounts is a waste of time. Other mount points are a
   system configuration bug you should not try to solve. For test cases,
   possibly support a SYSFS_PATH environment variable to overwrite the
-  applications behavior, but never try to search for sysfs. Never try
+  application's behavior, but never try to search for sysfs. Never try
   to mount it, if you are not an early boot script.
 
 - devices are only "devices"
   There is no such thing like class-, bus-, physical devices,
   interfaces, and such that you can rely on in userspace. Everything is
   just simply a "device". Class-, bus-, physical, ... types are just
-  kernel implementation details, which should not be expected by
+  kernel implementation details which should not be expected by
   applications that look for devices in sysfs.
 
   The properties of a device are:
@@ -48,11 +47,11 @@ versions of the sysfs interface.
       - identical to the DEVPATH value in the event sent from the kernel
         at device creation and removal
       - the unique key to the device at that point in time
-      - the kernels path to the device-directory without the leading
+      - the kernel's path to the device directory without the leading
         /sys, and always starting with with a slash
       - all elements of a devpath must be real directories. Symlinks
         pointing to /sys/devices must always be resolved to their real
-        target, and the target path must be used to access the device.
+        target and the target path must be used to access the device.
         That way the devpath to the device matches the devpath of the
         kernel used at event time.
       - using or exposing symlink values as elements in a devpath string
@@ -73,17 +72,17 @@ versions of the sysfs interface.
         link
       - it is retrieved by reading the "driver"-link and using only the
         last element of the target path
-      - devices which do not have "driver"-link, just do not have a
-        driver; copying the driver value in a child device context, is a
+      - devices which do not have "driver"-link just do not have a
+        driver; copying the driver value in a child device context is a
         bug in the application
 
     o attributes
-      - the files in the device directory or files below subdirectories
+      - the files in the device directory or files below subdirectories
         of the same device directory
       - accessing attributes reached by a symlink pointing to another device,
         like the "device"-link, is a bug in the application
 
-  Everything else is just a kernel driver-core implementation detail,
+  Everything else is just a kernel driver-core implementation detail
   that should not be assumed to be stable across kernel releases.
 
 - Properties of parent devices never belong into a child device.
@@ -91,25 +90,25 @@ versions of the sysfs interface.
   context properties. If the device 'eth0' or 'sda' does not have a
   "driver"-link, then this device does not have a driver. Its value is empty.
   Never copy any property of the parent-device into a child-device. Parent
-  device-properties may change dynamically without any notice to the
+  device properties may change dynamically without any notice to the
   child device.
 
-- Hierarchy in a single device-tree
+- Hierarchy in a single device tree
   There is only one valid place in sysfs where hierarchy can be examined
   and this is below: /sys/devices.
-  It is planned, that all device directories will end up in the tree
+  It is planned that all device directories will end up in the tree
   below this directory.
 
 - Classification by subsystem
   There are currently three places for classification of devices:
   /sys/block, /sys/class and /sys/bus. It is planned that these will
-  not contain any device-directories themselves, but only flat lists of
+  not contain any device directories themselves, but only flat lists of
   symlinks pointing to the unified /sys/devices tree.
   All three places have completely different rules on how to access
   device information. It is planned to merge all three
-  classification-directories into one place at /sys/subsystem,
-  following the layout of the bus-directories. All buses and
-  classes, including the converted block-subsystem, will show up
+  classification directories into one place at /sys/subsystem,
+  following the layout of the bus directories. All buses and
+  classes, including the converted block subsystem, will show up
   there.
   The devices belonging to a subsystem will create a symlink in the
   "devices" directory at /sys/subsystem/<name>/devices.
@@ -121,38 +120,38 @@ versions of the sysfs interface.
   subsystem name.
 
   Assuming /sys/class/<subsystem> and /sys/bus/<subsystem>, or
-  /sys/block and /sys/class/block are not interchangeable, is a bug in
+  /sys/block and /sys/class/block are not interchangeable is a bug in
   the application.
 
 - Block
-  The converted block-subsystem at /sys/class/block, or
+  The converted block subsystem at /sys/class/block or
   /sys/subsystem/block will contain the links for disks and partitions
-  at the same level, never in a hierarchy. Assuming the block-subsytem to
-  contain only disks and not partition-devices in the same flat list is
+  at the same level, never in a hierarchy. Assuming the block subsytem to
+  contain only disks and not partition devices in the same flat list is
   a bug in the application.
 
 - "device"-link and <subsystem>:<kernel name>-links
   Never depend on the "device"-link. The "device"-link is a workaround
-  for the old layout, where class-devices are not created in
-  /sys/devices/ like the bus-devices. If the link-resolving of a
-  device-directory does not end in /sys/devices/, you can use the
+  for the old layout, where class devices are not created in
+  /sys/devices/ like the bus devices. If the link-resolving of a
+  device directory does not end in /sys/devices/, you can use the
   "device"-link to find the parent devices in /sys/devices/. That is the
-  single valid use of the "device"-link, it must never appear in any
+  single valid use of the "device"-link; it must never appear in any
   path as an element. Assuming the existence of the "device"-link for
   a device in /sys/devices/ is a bug in the application.
   Accessing /sys/class/net/eth0/device is a bug in the application.
 
   Never depend on the class-specific links back to the /sys/class
   directory.  These links are also a workaround for the design mistake
-  that class-devices are not created in /sys/devices. If a device
+  that class devices are not created in /sys/devices. If a device
   directory does not contain directories for child devices, these links
   may be used to find the child devices in /sys/class. That is the single
-  valid use of these links, they must never appear in any path as an
+  valid use of these links; they must never appear in any path as an
   element. Assuming the existence of these links for devices which are
-  real child device directories in the /sys/devices tree, is a bug in
+  real child device directories in the /sys/devices tree is a bug in
   the application.
 
-  It is planned to remove all these links when when all class-device
+  It is planned to remove all these links when all class device
   directories live in /sys/devices.
 
 - Position of devices along device chain can change.
@@ -161,6 +160,5 @@ versions of the sysfs interface.
   the chain. You must always request the parent device you are looking for
   by its subsystem value. You need to walk up the chain until you find
   the device that matches the expected subsystem. Depending on a specific
-  position of a parent device, or exposing relative paths, using "../" to
-  access the chain of parents, is a bug in the application.
-
+  position of a parent device or exposing relative paths using "../" to
+  access the chain of parents is a bug in the application.
index 0804b6abe20337eb02950d01e3320e4411a528c7..ad176441be558bcf41d7dfd109913ef77a36fa7d 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/threads.h>
 #include <linux/smp.h>
 #include <linux/interrupt.h>
index 85016313bd1175779772fbfe45d1c798780e064e..c8569e862c6ba7746d4a9080c59da4594d3d59e1 100644 (file)
@@ -341,6 +341,7 @@ config ARCH_PXA
        select ARCH_MTD_XIP
        select GENERIC_GPIO
        select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
        help
          Support for Intel's PXA2XX processor line.
 
index 5be2e987b8435b047bf168128364e3736eda30f4..4de432ec903aecc4bef4b91aab249c9bd0c62edd 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/cpu.h>
 #include <linux/interrupt.h>
 #include <linux/smp.h>
+#include <linux/fs.h>
 
 #include <asm/cpu.h>
 #include <asm/elf.h>
index 1b76d87fa335de634f7151c630cec6005ec340ec..eafbb2b05eb8a2cb7f78a522053f16e4cf70f574 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/profile.h>
 #include <linux/errno.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/cpu.h>
 #include <linux/smp.h>
 #include <linux/seq_file.h>
@@ -630,7 +631,7 @@ void smp_send_stop(void)
 /*
  * not supported here
  */
-int __init setup_profiling_timer(unsigned int multiplier)
+int setup_profiling_timer(unsigned int multiplier)
 {
        return -EINVAL;
 }
index f2114bcf09d522994d11fcfafef264b2ba318e92..8ad47619c07906b31dcd60c97490426f6330e34c 100644 (file)
@@ -352,10 +352,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
 
 asmlinkage void do_unexp_fiq (struct pt_regs *regs)
 {
-#ifndef CONFIG_IGNORE_FIQ
        printk("Hmm.  Unexpected FIQ received, but trying to continue\n");
        printk("You may have a hardware problem...\n");
-#endif
 }
 
 /*
index 64067cd58d36e075cd7fede2ddbdb48e2d715f1e..52ac37d1e23aa91f6ec67c548db310287051fc87 100644 (file)
@@ -3,6 +3,7 @@
  *
  * HP Jornada720 init code
  *
+ * Copyright (C) 2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com>
  * Copyright (C) 2006 Filip Zyzniewski <filip.zyzniewski@tefnet.pl>
  *  Copyright (C) 2005 Michael Gernoth <michael@gernoth.net>
  *
@@ -220,14 +221,16 @@ static struct platform_device sa1111_device = {
        .resource       = sa1111_resources,
 };
 
-static struct platform_device jornada720_mcu_device = {
-       .name           = "jornada720_mcu",
-       .id             = -1,
+static struct platform_device jornada_ssp_device = {
+       .name           = "jornada_ssp",
+       .id             = -1,
 };
 
 static struct platform_device *devices[] __initdata = {
        &sa1111_device,
-       &jornada720_mcu_device,
+#ifdef CONFIG_SA1100_JORNADA720_SSP
+       &jornada_ssp_device,
+#endif
        &s1d13xxxfb_device,
 };
 
@@ -236,19 +239,19 @@ static int __init jornada720_init(void)
        int ret = -ENODEV;
 
        if (machine_is_jornada720()) {
-               GPDR |= GPIO_GPIO20;
-               /* oscillator setup (line 116 of HP's doc) */
+               /* we want to use gpio20 as input to drive the clock of our uart 3 */
+               GPDR |= GPIO_GPIO20;    /* Clear gpio20 pin as input */
                TUCR = TUCR_VAL;
-               /* resetting SA1111 (line 118 of HP's doc) */
-               GPSR = GPIO_GPIO20;
+               GPSR = GPIO_GPIO20;     /* start gpio20 pin */
                udelay(1);
-               GPCR = GPIO_GPIO20;
+               GPCR = GPIO_GPIO20;     /* stop gpio20 */
                udelay(1);
-               GPSR = GPIO_GPIO20;
-               udelay(20);
+               GPSR = GPIO_GPIO20;     /* restart gpio20 */
+               udelay(20);             /* give it some time to restart */
 
                ret = platform_add_devices(devices, ARRAY_SIZE(devices));
        }
+
        return ret;
 }
 
@@ -345,7 +348,7 @@ static void __init jornada720_mach_init(void)
 }
 
 MACHINE_START(JORNADA720, "HP Jornada 720")
-       /* Maintainer: Michael Gernoth <michael@gernoth.net> */
+       /* Maintainer: Kristoffer Ericson <Kristoffer.Ericson@gmail.com> */
        .phys_io        = 0x80000000,
        .io_pg_offst    = ((0xf8000000) >> 18) & 0xfffc,
        .boot_params    = 0xc0000100,
index 0a45e1ac8ad6700d27f7d30fb8c47cdfab7318fc..395c39bed7d823c06fca82b10525279e45c0dd7b 100644 (file)
@@ -161,7 +161,7 @@ static int __init jornada_ssp_probe(struct platform_device *dev)
        ret = jornada_ssp_inout(GETBRIGHTNESS);
 
        /* seems like it worked, just feed it with TxDummy to get rid of data */
-       if (ret == TxDummy)
+       if (ret == TXDUMMY)
                jornada_ssp_inout(TXDUMMY);
 
        jornada_ssp_end();
index 1b75672dfc8f8800484463b326f623d6b8bde412..20841663270fa50694669b90c4e54a55eb250bf1 100644 (file)
@@ -24,6 +24,8 @@ machine-$(CONFIG_BF533) := bf533
 machine-$(CONFIG_BF534) := bf537
 machine-$(CONFIG_BF536) := bf537
 machine-$(CONFIG_BF537) := bf537
+machine-$(CONFIG_BF542) := bf548
+machine-$(CONFIG_BF544) := bf548
 machine-$(CONFIG_BF548) := bf548
 machine-$(CONFIG_BF549) := bf548
 machine-$(CONFIG_BF561) := bf561
@@ -36,6 +38,8 @@ cpu-$(CONFIG_BF533) := bf533
 cpu-$(CONFIG_BF534) := bf534
 cpu-$(CONFIG_BF536) := bf536
 cpu-$(CONFIG_BF537) := bf537
+cpu-$(CONFIG_BF542) := bf542
+cpu-$(CONFIG_BF544) := bf544
 cpu-$(CONFIG_BF548) := bf548
 cpu-$(CONFIG_BF549) := bf549
 cpu-$(CONFIG_BF561) := bf561
index ea48d5b13f11469a18faebbd15461def98ef5d23..94d7b119b71ec6637e8b49a23d4f10b98f723a02 100644 (file)
@@ -160,7 +160,8 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
        BUG_ON(direction == DMA_NONE);
 
        for (i = 0; i < nents; i++, sg++) {
-               sg->dma_address = page_address(sg->page) + sg->offset;
+               sg->dma_address = (dma_addr_t)(page_address(sg->page) +
+                                       sg->offset);
 
                invalidate_dcache_range(sg_dma_address(sg),
                                        sg_dma_address(sg) +
index f59dcee7bae3da76723a3432866fa08d8b7d9f0a..88f221b89b33341192aa7d2099495e10351a99aa 100644 (file)
@@ -402,11 +402,7 @@ void __init setup_arch(char **cmdline_p)
        if (l1_length > L1_DATA_A_LENGTH)
                panic("L1 data memory overflow\n");
 
-#ifdef BF561_FAMILY
-       _bfin_swrst = bfin_read_SICA_SWRST();
-#else
        _bfin_swrst = bfin_read_SWRST();
-#endif
 
        /* Copy atomic sequences to their fixed location, and sanity check that
           these locations are the ones that we advertise to userspace.  */
@@ -429,6 +425,7 @@ void __init setup_arch(char **cmdline_p)
        BUG_ON((char *)&atomic_xor32 - (char *)&fixed_code_start
               != ATOMIC_XOR32 - FIXED_CODE_START);
 
+       init_exception_vectors();
        bf53x_cache_init();
 }
 
index 3909f5b3553679ac1b6215b95e31f856aa34b2dd..8766bd612b4734778492aa6b9a9b693f1e2c9ee4 100644 (file)
@@ -140,7 +140,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
 #ifdef CONFIG_KGDB
 # define CHK_DEBUGGER_TRAP() \
        do { \
-               CHK_DEBUGGER(trapnr, sig, info.si_code, fp); \
+               CHK_DEBUGGER(trapnr, sig, info.si_code, fp); \
        } while (0)
 # define CHK_DEBUGGER_TRAP_MAYBE() \
        do { \
index d06f860f47900a5b6e09edf4b6629b6c9908c9e7..fb53780247bc94bf5c1ce393f54cab5620e43db4 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm-generic/vmlinux.lds.h>
 #include <asm/mem_map.h>
 #include <asm/page.h>
+#include <asm/thread_info.h>
 
 OUTPUT_FORMAT("elf32-bfin")
 ENTRY(__start)
@@ -64,8 +65,12 @@ SECTIONS
 
        .data :
        {
-               . = ALIGN(PAGE_SIZE);
+               /* make sure the init_task is aligned to the
+                * kernel thread size so we can locate the kernel
+                * stack properly and quickly.
+                */
                __sdata = .;
+               . = ALIGN(THREAD_SIZE);
                *(.data.init_task)
                DATA_DATA
                CONSTRUCTORS
@@ -73,14 +78,14 @@ SECTIONS
                . = ALIGN(32);
                *(.data.cacheline_aligned)
 
-               . = ALIGN(PAGE_SIZE);
+               . = ALIGN(THREAD_SIZE);
                __edata = .;
        }
 
-       . = ALIGN(PAGE_SIZE);
        ___init_begin = .;
        .init :
        {
+               . = ALIGN(PAGE_SIZE);
                __sinittext = .;
                *(.init.text)
                __einittext = .;
@@ -153,10 +158,9 @@ SECTIONS
                __ebss_b_l1 = .;
        }
 
-       . = LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1);
-       ___init_end = ALIGN(PAGE_SIZE);
+       ___init_end = LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1);
 
-       .bss ___init_end :
+       .bss LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1) :
        {
                . = ALIGN(4);
                ___bss_start = .;
index 2f08bcb2dded5158cd0270011ebab21415390496..38650a628980fec47626a20c4aad07ccb1319d1f 100644 (file)
@@ -440,15 +440,15 @@ ENTRY(_bfin_reset)
        SSYNC;
 
        /* make sure SYSCR is set to use BMODE */
-       P0.h = hi(SICA_SYSCR);
-       P0.l = lo(SICA_SYSCR);
-       R0.l = 0x20;
+       P0.h = hi(SYSCR);
+       P0.l = lo(SYSCR);
+       R0.l = 0x20;            /* on BF561, disable core b */
        W[P0] = R0.l;
        SSYNC;
 
        /* issue a system soft reset */
-       P1.h = hi(SICA_SWRST);
-       P1.l = lo(SICA_SWRST);
+       P1.h = hi(SWRST);
+       P1.l = lo(SWRST);
        R1.l = 0x0007;
        W[P1] = R1;
        SSYNC;
index 9d475623b7243f2069528de67cc291cda01ae9fb..5be6b975ae4a0fc88c65d0186652691d42658497 100644 (file)
@@ -60,6 +60,9 @@ ENDPROC(_bfin_write_IMEM_CONTROL)
 
 #if defined(CONFIG_BLKFIN_DCACHE)
 ENTRY(_bfin_write_DMEM_CONTROL)
+       P0.l = (DMEM_CONTROL & 0xFFFF);
+       P0.h = (DMEM_CONTROL >> 16);
+
        CLI R1;
        SSYNC;          /* SSYNC required before writing to DMEM_CONTROL. */
        .align 8;
index 6b9fd03ce8355135b7227b9073d2249690aff766..660f881b620a3591ee54474c041bff0545a7a705 100644 (file)
@@ -358,26 +358,10 @@ static void bf561_demux_gpio_irq(unsigned int inta_irq,
 
 #endif                         /* CONFIG_IRQCHIP_DEMUX_GPIO */
 
-/*
- * This function should be called during kernel startup to initialize
- * the BFin IRQ handling routines.
- */
-int __init init_arch_irq(void)
+void __init init_exception_vectors(void)
 {
-       int irq;
-       unsigned long ilat = 0;
-       /*  Disable all the peripheral intrs  - page 4-29 HW Ref manual */
-       bfin_write_SICA_IMASK0(SIC_UNMASK_ALL);
-       bfin_write_SICA_IMASK1(SIC_UNMASK_ALL);
        SSYNC();
 
-       bfin_write_SICA_IWR0(IWR_ENABLE_ALL);
-       bfin_write_SICA_IWR1(IWR_ENABLE_ALL);
-
-       local_irq_disable();
-
-       init_exception_buff();
-
 #ifndef CONFIG_KGDB
        bfin_write_EVT0(evt_emulation);
 #endif
@@ -395,6 +379,27 @@ int __init init_arch_irq(void)
        bfin_write_EVT14(evt14_softirq);
        bfin_write_EVT15(evt_system_call);
        CSYNC();
+}
+
+/*
+ * This function should be called during kernel startup to initialize
+ * the BFin IRQ handling routines.
+ */
+int __init init_arch_irq(void)
+{
+       int irq;
+       unsigned long ilat = 0;
+       /*  Disable all the peripheral intrs  - page 4-29 HW Ref manual */
+       bfin_write_SICA_IMASK0(SIC_UNMASK_ALL);
+       bfin_write_SICA_IMASK1(SIC_UNMASK_ALL);
+       SSYNC();
+
+       bfin_write_SICA_IWR0(IWR_ENABLE_ALL);
+       bfin_write_SICA_IWR1(IWR_ENABLE_ALL);
+
+       local_irq_disable();
+
+       init_exception_buff();
 
        for (irq = 0; irq <= SYS_IRQS; irq++) {
                if (irq <= IRQ_CORETMR)
index 28a878c3577a00d78e280b137e09be5124c4351d..4708023fe716e2c11d1f63d369c33b8870393177 100644 (file)
@@ -579,8 +579,12 @@ static unsigned int bfin_gpio_irq_startup(unsigned int irq)
        u16 gpionr = irq - IRQ_PA0;
        u8 pint_val = irq2pint_lut[irq - SYS_IRQS];
 
-       if (pint_val == IRQ_NOT_AVAIL)
+       if (pint_val == IRQ_NOT_AVAIL) {
+               printk(KERN_ERR
+               "GPIO IRQ %d :Not in PINT Assign table "
+               "Reconfigure Interrupt to Port Assignemt\n", irq);
                return -ENODEV;
+       }
 
        if (!(gpio_enabled[gpio_bank(gpionr)] & gpio_bit(gpionr))) {
                ret = gpio_request(gpionr, NULL);
@@ -713,6 +717,29 @@ static void bfin_demux_gpio_irq(unsigned int intb_irq,
 }
 #endif                         /* CONFIG_IRQCHIP_DEMUX_GPIO */
 
+void __init init_exception_vectors(void)
+{
+       SSYNC();
+
+#ifndef CONFIG_KGDB
+       bfin_write_EVT0(evt_emulation);
+#endif
+       bfin_write_EVT2(evt_evt2);
+       bfin_write_EVT3(trap);
+       bfin_write_EVT5(evt_ivhw);
+       bfin_write_EVT6(evt_timer);
+       bfin_write_EVT7(evt_evt7);
+       bfin_write_EVT8(evt_evt8);
+       bfin_write_EVT9(evt_evt9);
+       bfin_write_EVT10(evt_evt10);
+       bfin_write_EVT11(evt_evt11);
+       bfin_write_EVT12(evt_evt12);
+       bfin_write_EVT13(evt_evt13);
+       bfin_write_EVT14(evt14_softirq);
+       bfin_write_EVT15(evt_system_call);
+       CSYNC();
+}
+
 /*
  * This function should be called during kernel startup to initialize
  * the BFin IRQ handling routines.
@@ -733,29 +760,10 @@ int __init init_arch_irq(void)
        bfin_write_SIC_IMASK(SIC_UNMASK_ALL);
        bfin_write_SIC_IWR(IWR_ENABLE_ALL);
 #endif
-
        SSYNC();
 
        local_irq_disable();
 
-#ifndef CONFIG_KGDB
-       bfin_write_EVT0(evt_emulation);
-#endif
-       bfin_write_EVT2(evt_evt2);
-       bfin_write_EVT3(trap);
-       bfin_write_EVT5(evt_ivhw);
-       bfin_write_EVT6(evt_timer);
-       bfin_write_EVT7(evt_evt7);
-       bfin_write_EVT8(evt_evt8);
-       bfin_write_EVT9(evt_evt9);
-       bfin_write_EVT10(evt_evt10);
-       bfin_write_EVT11(evt_evt11);
-       bfin_write_EVT12(evt_evt12);
-       bfin_write_EVT13(evt_evt13);
-       bfin_write_EVT14(evt14_softirq);
-       bfin_write_EVT15(evt_system_call);
-       CSYNC();
-
 #if defined(CONFIG_IRQCHIP_DEMUX_GPIO) && defined(CONFIG_BF54x)
 #ifdef CONFIG_PINTx_REASSIGN
        pint[0]->assign = CONFIG_PINT0_ASSIGN;
index 26b3df32b9a7476a89dd2ee238f642a4bc2e73fa..6fbe2665c5776d794f2594dbe2a51784585dcae9 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/sem.h>
 #include <linux/msg.h>
index abb582bc218fdf4207d3fa3ce92d753fffa35f40..5c8a845a412903a5f871e5626ec2851499ccb134 100644 (file)
@@ -938,7 +938,7 @@ source "drivers/acpi/Kconfig"
 
 menuconfig APM
        tristate "APM (Advanced Power Management) BIOS support"
-       depends on PM && !X86_VISWS
+       depends on PM_SLEEP && !X86_VISWS
        ---help---
          APM is a BIOS specification for saving power using several different
          techniques. This is mostly useful for battery powered laptops with
index b31c0802e1ccf53f1e5a677e802c5e34166ebc54..f03531eacdfbe6936e2a4f8808babcd6f29411e4 100644 (file)
@@ -36,11 +36,11 @@ config DEBUG_STACK_USAGE
          This option will slow down process creation somewhat.
 
 comment "Page alloc debug is incompatible with Software Suspend on i386"
-       depends on DEBUG_KERNEL && SOFTWARE_SUSPEND
+       depends on DEBUG_KERNEL && HIBERNATION
 
 config DEBUG_PAGEALLOC
        bool "Debug page memory allocations"
-       depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND && !HUGETLBFS
+       depends on DEBUG_KERNEL && !HIBERNATION && !HUGETLBFS
        help
          Unmap pages from the kernel linear mapping after free_pages().
          This results in a large slowdown, but helps to find certain types
index 223f58fc9f46f32cff0d6e51bfe2438fb4072a34..7f7be01f44e66cd27257870d540ed38d3f1e1661 100644 (file)
@@ -2,7 +2,7 @@ obj-$(CONFIG_ACPI)              += boot.o
 ifneq ($(CONFIG_PCI),)
 obj-$(CONFIG_X86_IO_APIC)      += earlyquirk.o
 endif
-obj-$(CONFIG_ACPI)             += sleep.o wakeup.o
+obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
 
 ifneq ($(CONFIG_ACPI_PROCESSOR),)
 obj-y                          += cstate.o processor.o
index e60cddbc4cfbc39380c751f0d5793851ff25c96b..3c86b979a40aed829b52797cd8e90c88a6c8ed81 100644 (file)
@@ -321,7 +321,7 @@ static int __init request_standard_resources(void)
 
 subsys_initcall(request_standard_resources);
 
-#if defined(CONFIG_PM) && defined(CONFIG_SOFTWARE_SUSPEND)
+#if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION)
 /**
  * e820_mark_nosave_regions - Find the ranges of physical addresses that do not
  * correspond to e820 RAM areas and mark the corresponding pages as nosave for
index d865d041bea1dc7c25d9a8e1eaa63f54c6812ea0..09cf78110358fadc78bbc704349b8283737f5f90 100644 (file)
@@ -82,6 +82,7 @@
 #include <linux/miscdevice.h>
 #include <linux/spinlock.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/mutex.h>
 #include <linux/cpu.h>
 #include <linux/firmware.h>
index 7fe5da3c932e270f742290af4c35536a0ef29291..d474cd639bcb8ece22f706d285950926a50541ac 100644 (file)
@@ -422,7 +422,7 @@ void __init setup_bootmem_allocator(void)
         */
        reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
 #endif
-#ifdef CONFIG_ACPI
+#ifdef CONFIG_ACPI_SLEEP
        /*
         * Reserve low memory region for sleep support.
         */
index e5dcb9379018b6cda96460f8bd2856cf0365cfaf..42147304de8855e8d0667249ba43f76bcb7efcde 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/sem.h>
 #include <linux/msg.h>
index 6deb159d08e0cf761fe402ed5ab355bcfc9e3d4b..4eb2e408764f7bab8e81a7310616e3366cb1a29c 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/string.h>
 #include <linux/elf.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/module.h>
 
 #include <asm/cpufeature.h>
index 4c4809f13cb134007cb1c90f567c2e1d367895b3..730a5b177b1fa2237a08d3c465a009bbef4e4734 100644 (file)
@@ -432,7 +432,7 @@ static void __init pagetable_init (void)
        paravirt_pagetable_setup_done(pgd_base);
 }
 
-#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_ACPI)
+#if defined(CONFIG_HIBERNATION) || defined(CONFIG_ACPI)
 /*
  * Swap suspend & friends need this for resume because things like the intel-agp
  * driver might have split up a kernel 4MB mapping.
index 2de7bbf03cd7f0d35a93aa5e7b778127699367ef..d764ec950065686d96bbd92e49440de08e538270 100644 (file)
@@ -1,2 +1,2 @@
 obj-$(CONFIG_PM)               += cpu.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o suspend.o
+obj-$(CONFIG_HIBERNATION)      += swsusp.o suspend.o
index 64248b58f63ffc0801d7bd15769b8d2f7421bb41..e62694f8ef75d8b6b46605e6c9924d4ba7bcf898 100644 (file)
@@ -121,49 +121,23 @@ simscsi_biosparam (struct scsi_device *sdev, struct block_device *n,
        return 0;
 }
 
-static void
-simscsi_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset, unsigned long len)
-{
-       struct disk_stat stat;
-       struct disk_req req;
-
-       req.addr = __pa(sc->request_buffer);
-       req.len  = len;                 /* # of bytes to transfer */
-
-       if (sc->request_bufflen < req.len)
-               return;
-
-       stat.fd = desc[sc->device->id];
-       if (DBG)
-               printk("simscsi_%s @ %lx (off %lx)\n",
-                      mode == SSC_READ ? "read":"write", req.addr, offset);
-       ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
-       ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
-
-       if (stat.count == req.len) {
-               sc->result = GOOD;
-       } else {
-               sc->result = DID_ERROR << 16;
-       }
-}
-
 static void
 simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
 {
-       int list_len = sc->use_sg;
-       struct scatterlist *sl = (struct scatterlist *)sc->request_buffer;
+       int i;
+       struct scatterlist *sl;
        struct disk_stat stat;
        struct disk_req req;
 
        stat.fd = desc[sc->device->id];
 
-       while (list_len) {
+       scsi_for_each_sg(sc, sl, scsi_sg_count(sc), i) {
                req.addr = __pa(page_address(sl->page) + sl->offset);
                req.len  = sl->length;
                if (DBG)
                        printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n",
                               mode == SSC_READ ? "read":"write", req.addr, offset,
-                              list_len, sl->length);
+                              scsi_sg_count(sc) - i, sl->length);
                ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
                ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
 
@@ -173,8 +147,6 @@ simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
                        return;
                }
                offset +=  sl->length;
-               sl++;
-               list_len--;
        }
        sc->result = GOOD;
 }
@@ -190,10 +162,7 @@ simscsi_readwrite6 (struct scsi_cmnd *sc, int mode)
        unsigned long offset;
 
        offset = (((sc->cmnd[1] & 0x1f) << 16) | (sc->cmnd[2] << 8) | sc->cmnd[3])*512;
-       if (sc->use_sg > 0)
-               simscsi_sg_readwrite(sc, mode, offset);
-       else
-               simscsi_readwrite(sc, mode, offset, sc->cmnd[4]*512);
+       simscsi_sg_readwrite(sc, mode, offset);
 }
 
 static size_t
@@ -230,26 +199,21 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode)
                | ((unsigned long)sc->cmnd[3] << 16)
                | ((unsigned long)sc->cmnd[4] <<  8) 
                | ((unsigned long)sc->cmnd[5] <<  0))*512UL;
-       if (sc->use_sg > 0)
-               simscsi_sg_readwrite(sc, mode, offset);
-       else
-               simscsi_readwrite(sc, mode, offset, ((sc->cmnd[7] << 8) | sc->cmnd[8])*512);
+       simscsi_sg_readwrite(sc, mode, offset);
 }
 
 static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len)
 {
 
-       int scatterlen = sc->use_sg;
+       int i;
+       unsigned thislen;
        struct scatterlist *slp;
 
-       if (scatterlen == 0)
-               memcpy(sc->request_buffer, buf, len);
-       else for (slp = (struct scatterlist *)sc->request_buffer;
-                 scatterlen-- > 0 && len > 0; slp++) {
-               unsigned thislen = min(len, slp->length);
-
+       scsi_for_each_sg(sc, slp, scsi_sg_count(sc), i) {
+               if (!len)
+                       break;
+               thislen = min(len, slp->length);
                memcpy(page_address(slp->page) + slp->offset, buf, thislen);
-               slp++;
                len -= thislen;
        }
 }
@@ -275,7 +239,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
        if (target_id <= 15 && sc->device->lun == 0) {
                switch (sc->cmnd[0]) {
                      case INQUIRY:
-                       if (sc->request_bufflen < 35) {
+                       if (scsi_bufflen(sc) < 35) {
                                break;
                        }
                        sprintf (fname, "%s%c", simscsi_root, 'a' + target_id);
@@ -328,7 +292,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
                        break;
 
                      case READ_CAPACITY:
-                       if (desc[target_id] < 0 || sc->request_bufflen < 8) {
+                       if (desc[target_id] < 0 || scsi_bufflen(sc) < 8) {
                                break;
                        }
                        buf = localbuf;
@@ -350,7 +314,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
                      case MODE_SENSE:
                      case MODE_SENSE_10:
                        /* sd.c uses this to determine whether disk does write-caching. */
-                       simscsi_fillresult(sc, (char *)empty_zero_page, sc->request_bufflen);
+                       simscsi_fillresult(sc, (char *)empty_zero_page, scsi_bufflen(sc));
                        sc->result = GOOD;
                        break;
 
index b69c397ed1bf1eef6537e5fd336e3086539c9934..bc8efcad28b877c046c589a4a7514129b5aed010 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/init.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init_task.h>
index 57a92ef31a903ea7f4fd156a3097aa3d3a903a00..62a51429306eb92269bb80817d5f4e3cb389f4db 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index 3eb3059534972c07aeaa7935aa57d5814675e5c2..9dae410014d821c7d773ea65ba2441387538b1a3 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/irq.h>
 #include <linux/bootmem.h>
 #include <linux/delay.h>
index bda85548de6c79c0dceb81279257112443b2becd..b13dbbeaeafa0b6c3c0c77bd240e53a282315ea9 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/sem.h>
 #include <linux/msg.h>
index 99fc1226f7f804ed40cf875fca1118d78347e8ac..3ee918695215791b10f01ca19e9095b094cf35f5 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/stddef.h>
index 90238a8c9e14996cf48daca92b083390c703e6a4..36d78cf1a7bc14ea5c86550a8a209846829d6f41 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
 #include <linux/sem.h>
index be7362bc2c9a6ef7340bf811d1260dd09cd5cef4..04bbbd8d91abd11a913055bcb5b2a513bd957935 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/sched.h>
 #include <linux/cpumask.h>
 #include <linux/cpu.h>
+#include <linux/err.h>
 
 #include <asm/atomic.h>
 #include <asm/cpu.h>
index b53f7edbc159dffbb111c4863dfdabedbe58c95a..541b5005957e86d08dc38223ae8a2c304c6aff70 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/errno.h>
 #include <linux/linkage.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/mman.h>
 #include <linux/ptrace.h>
index f2042e6466a4086e8845759bf70639572d9575c6..1263f00dc35d568a63605890b2edcbb544facb5a 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/sched.h>
 #include <linux/file.h>
 #include <linux/slab.h>
index 8384bf9cecd240c77ae5f2b9f4ec6c2e1ced5eab..446f98d3fd7bd025018bac31b36034b9e0753a96 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init.h>
index 355664812b8319e1d0c9b01115fd4dbe162f8dc2..b80e02a4d81de3d193ec1faae269b7614a783cf1 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/personality.h>
 #include <linux/ptrace.h>
index 04c7e1d36cea781713e979f5e2e0755a5c961e65..d7bc7bb42c94e11baf1da17597b9bf0017b50608 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/smp.h>
 #include <linux/kernel_stat.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/delay.h>
 #include <linux/bitops.h>
 
index 5c71624ee38d41708af7dc299417c601606cde7d..22acece95b118d5c6055fed0f72ff7c5a1cbe18b 100644 (file)
@@ -20,7 +20,7 @@ config DEBUG_STACK_USAGE
 
 config DEBUG_PAGEALLOC
         bool "Debug page memory allocations"
-        depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND
+        depends on DEBUG_KERNEL && !HIBERNATION
         help
           Unmap pages from the kernel linear mapping after free_pages().
           This results in a large slowdown, but helps to find certain types
index d12a981398b81b8e7fec19c4f600d89494d4402e..9c30ca451617fd519293a61ef703498089e10ede 100644 (file)
@@ -196,7 +196,7 @@ CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 # CONFIG_WANT_DEVICE_TREE is not set
 CONFIG_ISA_DMA_API=y
index 0d8ba623e29a4c78369386c13f447d684799078e..08525d6fb1f1b9a61b27e218a864b37584f5a86d 100644 (file)
@@ -218,7 +218,7 @@ CONFIG_PM=y
 CONFIG_PM_DEBUG=y
 # CONFIG_DISABLE_CONSOLE_SUSPEND is not set
 CONFIG_PM_SYSFS_DEPRECATED=y
-CONFIG_SOFTWARE_SUSPEND=y
+CONFIG_HIBERNATION=y
 CONFIG_PM_STD_PARTITION=""
 CONFIG_APM_EMULATION=y
 CONFIG_SECCOMP=y
index 42c42ecad00c16bb82c6e4a325bc92230c1a909a..f39a72f30aadb81543fd3873491ccf94689b4d85 100644 (file)
@@ -37,9 +37,9 @@ obj-$(CONFIG_GENERIC_TBSYNC)  += smp-tbsync.o
 obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
 obj-$(CONFIG_6xx)              += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o
 obj-$(CONFIG_TAU)              += tau_6xx.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o suspend.o
-obj32-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_32.o
-obj64-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_64.o swsusp_asm64.o
+obj-$(CONFIG_HIBERNATION)      += swsusp.o suspend.o
+obj32-$(CONFIG_HIBERNATION) += swsusp_32.o
+obj64-$(CONFIG_HIBERNATION) += swsusp_64.o swsusp_asm64.o
 obj32-$(CONFIG_MODULES)                += module_32.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
index fc6647d332cbf18160e4f62865bf06a61cd75d65..f85f402ceaefea89461e4e558efed352e91b272e 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/sched.h>
 #include <linux/syscalls.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/sem.h>
 #include <linux/msg.h>
index 2f24ea0d723afdb4f4b96916f72bf33d2d91639f..ada5b42dd231635205bccdbc3cedd6c72f80f0cd 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/slab.h>
 
 #include <asm/rheap.h>
index 133665754a75cc34e34b18cfe83d611fc2611fd5..4a890cb42b98e7a7a2b23a7f2599efe1cc1a5f55 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/dcookies.h>
 #include <linux/kref.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/notifier.h>
 #include <linux/numa.h>
index 99bf3b7a27629a4eb278d32a9ebfc218a0e9c5a9..f33f0e772dcb0f263c3eea9b37fc8830c68af50e 100644 (file)
@@ -136,7 +136,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index 0ff56695d349f3d495f46a8a6f2b82322d8ec7d7..e00cd62daa3f2c033b99472aa9dcf5fa65d635d7 100644 (file)
@@ -138,7 +138,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index 730b3db2e47a5d0dd727cb417e8d830a4ebe191b..43a0d9df1e23a7b89452f63cacb269546df7c31a 100644 (file)
@@ -138,7 +138,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index 1d902072825e99a9beaf8381eb368d9e6c90ef18..a814d17a2be98346461e9c0ae54f6d04758463db 100644 (file)
@@ -137,7 +137,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index d471e578dcb58b0664acdf2765531da42c8b8a4b..f297c4bb632b40e417bc11264b7c9dcbcad15554 100644 (file)
@@ -142,7 +142,7 @@ CONFIG_BINFMT_MISC=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE="console=ttyMM0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2"
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index 4a33aca948cc7020d662522f188187c6eb496670..69bad91a6b656d5504f112147fa7d43d4054b46c 100644 (file)
@@ -148,7 +148,7 @@ CONFIG_BINFMT_ELF=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE="console=ttyS0,9600"
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index fafd2516fa5132ad243868d9fac92cdc0b783bf6..a78896ea456066ecbfea77d066a99cbf99f4e311 100644 (file)
@@ -149,7 +149,7 @@ CONFIG_BINFMT_ELF=y
 CONFIG_CMDLINE_BOOL=y
 CONFIG_CMDLINE="console=ttyS0,9600"
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index b96a6d6dad0e109c58ae5a2e5c987a52c35da39b..d90c8a7e060ccb49cd65a3df9034c72c25ca5d5a 100644 (file)
@@ -130,7 +130,7 @@ CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
-# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_HIBERNATION is not set
 CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
index 0aa333178b2affade3c6852ecbf76636beb03e8f..b7cee2d714053622a64ae50ee8931136f47b804a 100644 (file)
@@ -166,7 +166,7 @@ CONFIG_PROC_PREPRESIDUAL=y
 CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
-CONFIG_SOFTWARE_SUSPEND=y
+CONFIG_HIBERNATION=y
 CONFIG_PM_STD_PARTITION=""
 # CONFIG_SECCOMP is not set
 CONFIG_ISA_DMA_API=y
index 6ffbab77ae4dd5e6f1310e74a33673ce7968ac3c..62391fb1f61f0ed158c304bd0c939e77595d5191 100644 (file)
@@ -173,7 +173,7 @@ int appldata_diag(char record_nr, u16 function, unsigned long buffer,
 /*
  * appldata_mod_vtimer_wrap()
  *
- * wrapper function for mod_virt_timer(), because smp_call_function_on()
+ * wrapper function for mod_virt_timer(), because smp_call_function_single()
  * accepts only one parameter.
  */
 static void __appldata_mod_vtimer_wrap(void *p) {
@@ -208,9 +208,9 @@ __appldata_vtimer_setup(int cmd)
                                          num_online_cpus()) * TOD_MICRO;
                for_each_online_cpu(i) {
                        per_cpu(appldata_timer, i).expires = per_cpu_interval;
-                       smp_call_function_on(add_virt_timer_periodic,
-                                            &per_cpu(appldata_timer, i),
-                                            0, 1, i);
+                       smp_call_function_single(i, add_virt_timer_periodic,
+                                                &per_cpu(appldata_timer, i),
+                                                0, 1);
                }
                appldata_timer_active = 1;
                P_INFO("Monitoring timer started.\n");
@@ -236,8 +236,8 @@ __appldata_vtimer_setup(int cmd)
                        } args;
                        args.timer = &per_cpu(appldata_timer, i);
                        args.expires = per_cpu_interval;
-                       smp_call_function_on(__appldata_mod_vtimer_wrap,
-                                            &args, 0, 1, i);
+                       smp_call_function_single(i, __appldata_mod_vtimer_wrap,
+                                                &args, 0, 1);
                }
        }
 }
index acc415457b45ac0f05ec565a00c637569231564f..6ee1bedbd1bf85f020edfcf9b2c37457208ba1b7 100644 (file)
@@ -1710,3 +1710,13 @@ compat_sys_timerfd_wrapper:
 sys_eventfd_wrapper:
        llgfr   %r2,%r2                 # unsigned int
        jg      sys_eventfd
+
+       .globl  sys_fallocate_wrapper
+sys_fallocate_wrapper:
+       lgfr    %r2,%r2                 # int
+       lgfr    %r3,%r3                 # int
+       sllg    %r4,%r4,32              # get high word of 64bit loff_t
+       lr      %r4,%r5                 # get low word of 64bit loff_t
+       sllg    %r5,%r6,32              # get high word of 64bit loff_t
+       l       %r5,164(%r15)           # get low word of 64bit loff_t
+       jg      sys_fallocate
index bc7ff3658c3d4a4bb5bcf2db392abeecc7191d74..f3bceb165321e2bb3d57430a1b5fd8c90e7fbd9e 100644 (file)
@@ -624,9 +624,11 @@ io_work_loop:
 # _TIF_MCCK_PENDING is set, call handler
 #
 io_mcck_pending:
+       TRACE_IRQS_OFF
        l       %r1,BASED(.Ls390_handle_mcck)
-       la      %r14,BASED(io_work_loop)
-       br      %r1                     # TIF bit will be cleared by handler
+       basr    %r14,%r1                # TIF bit will be cleared by handler
+       TRACE_IRQS_ON
+       b       BASED(io_work_loop)
 
 #
 # _TIF_NEED_RESCHED is set, call schedule
index 2a7b1304418ba6ab8da72e923b8c99abb004d84f..9c0d5cc8269dd321a17da58a8046f2a20a2621ce 100644 (file)
@@ -611,8 +611,10 @@ io_work_loop:
 # _TIF_MCCK_PENDING is set, call handler
 #
 io_mcck_pending:
-       larl    %r14,io_work_loop
-       jg      s390_handle_mcck        # TIF bit will be cleared by handler
+       TRACE_IRQS_OFF
+       brasl   %r14,s390_handle_mcck   # TIF bit will be cleared by handler
+       TRACE_IRQS_ON
+       j       io_work_loop
 
 #
 # _TIF_NEED_RESCHED is set, call schedule
index 8f8c802f1bcfd86a07660a1b2e7dbd1d3cf80a06..83477c7dc743e39bcf79941f0f04a083ad265348 100644 (file)
@@ -35,6 +35,7 @@
 #define ARCH_OFFSET    0
 #endif
 
+.section ".text.head","ax"
 #ifndef CONFIG_IPL
        .org   0
        .long  0x00080000,0x80000000+startup    # Just a restart PSW
index d73a74013e73e0897c984fab7aabc44437fa3d6b..d494161b05b40125668709c893d3407432dbb971 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init_task.h>
index 441975b796fb03d901cef8a63dc3414a3a2b508c..abb447a3e472443b6925b1a60f08909a28d067f0 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/stddef.h>
 #include <linux/unistd.h>
index 182c085ae4ddd94e11d462d9b918152669bb6f1d..35edbef1d2228b021b8e677f22a9bcf7a66d0eeb 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/spinlock.h>
 #include <linux/kernel_stat.h>
 #include <linux/delay.h>
@@ -120,7 +121,7 @@ static void __smp_call_function_map(void (*func) (void *info), void *info,
        if (wait)
                data.finished = CPU_MASK_NONE;
 
-       spin_lock_bh(&call_lock);
+       spin_lock(&call_lock);
        call_data = &data;
 
        for_each_cpu_mask(cpu, map)
@@ -129,18 +130,16 @@ static void __smp_call_function_map(void (*func) (void *info), void *info,
        /* Wait for response */
        while (!cpus_equal(map, data.started))
                cpu_relax();
-
        if (wait)
                while (!cpus_equal(map, data.finished))
                        cpu_relax();
-
-       spin_unlock_bh(&call_lock);
-
+       spin_unlock(&call_lock);
 out:
-       local_irq_disable();
-       if (local)
+       if (local) {
+               local_irq_disable();
                func(info);
-       local_irq_enable();
+               local_irq_enable();
+       }
 }
 
 /*
@@ -170,30 +169,28 @@ int smp_call_function(void (*func) (void *info), void *info, int nonatomic,
 EXPORT_SYMBOL(smp_call_function);
 
 /*
- * smp_call_function_on:
+ * smp_call_function_single:
+ * @cpu: the CPU where func should run
  * @func: the function to run; this must be fast and non-blocking
  * @info: an arbitrary pointer to pass to the function
  * @nonatomic: unused
  * @wait: if true, wait (atomically) until function has completed on other CPUs
- * @cpu: the CPU where func should run
  *
  * Run a function on one processor.
  *
  * You must not call this function with disabled interrupts, from a
  * hardware interrupt handler or from a bottom half.
  */
-int smp_call_function_on(void (*func) (void *info), void *info, int nonatomic,
-                        int wait, int cpu)
+int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
+                            int nonatomic, int wait)
 {
-       cpumask_t map = CPU_MASK_NONE;
-
        preempt_disable();
-       cpu_set(cpu, map);
-       __smp_call_function_map(func, info, nonatomic, wait, map);
+       __smp_call_function_map(func, info, nonatomic, wait,
+                               cpumask_of_cpu(cpu));
        preempt_enable();
        return 0;
 }
-EXPORT_SYMBOL(smp_call_function_on);
+EXPORT_SYMBOL(smp_call_function_single);
 
 static void do_send_stop(void)
 {
index 1c90c7e999782949ddf6efeda76f4c71fbead09e..1eaff84a1eb652191611d5c7a47a713995342973 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/errno.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/sem.h>
 #include <linux/msg.h>
@@ -265,3 +266,23 @@ s390_fadvise64_64(struct fadvise64_64_args __user *args)
                return -EFAULT;
        return sys_fadvise64_64(a.fd, a.offset, a.len, a.advice);
 }
+
+#ifndef CONFIG_64BIT
+/*
+ * This is a wrapper to call sys_fallocate(). For 31 bit s390 the last
+ * 64 bit argument "len" is split into the upper and lower 32 bits. The
+ * system call wrapper in the user space loads the value to %r6/%r7.
+ * The code in entry.S keeps the values in %r2 - %r6 where they are and
+ * stores %r7 to 96(%r15). But the standard C linkage requires that
+ * the whole 64 bit value for len is stored on the stack and doesn't
+ * use %r6 at all. So s390_fallocate has to convert the arguments from
+ *   %r2: fd, %r3: mode, %r4/%r5: offset, %r6/96(%r15)-99(%r15): len
+ * to
+ *   %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len
+ */
+asmlinkage long s390_fallocate(int fd, int mode, loff_t offset,
+                              u32 len_high, u32 len_low)
+{
+       return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);
+}
+#endif
index 738feb4a0aadf4e575aa9cacee96b32c069ad7b2..9e26ed9fe4e73ee5301519ada6c2a602efdef2b6 100644 (file)
@@ -322,7 +322,7 @@ NI_SYSCALL                                                  /* 310 sys_move_pages */
 SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
 SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper)
 SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
-NI_SYSCALL                                                     /* 314 sys_fallocate */
+SYSCALL(s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
 SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper)      /* 315 */
 SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
 SYSCALL(sys_timerfd,sys_timerfd,compat_sys_timerfd_wrapper)
index 6ab7d4ee13a47365f7454c85f019af64056fb4e9..b4622a3889b0575f86dea86ccf6ffa96bd25ec2d 100644 (file)
@@ -21,6 +21,7 @@ SECTIONS
   . = 0x00000000;
   _text = .;                   /* Text and read-only data */
   .text : {
+       *(.text.head)
        TEXT_TEXT
        SCHED_TEXT
        LOCK_TEXT
index b6ed143e8597156d181437cab5519afe2062012d..84ff78de6bacdeec58a16261e58fdaea24a0932e 100644 (file)
@@ -415,7 +415,7 @@ EXPORT_SYMBOL(add_virt_timer_periodic);
 
 /*
  * If we change a pending timer the function must be called on the CPU
- * where the timer is running on, e.g. by smp_call_function_on()
+ * where the timer is running on, e.g. by smp_call_function_single()
  *
  * The original mod_timer adds the timer if it is not pending. For compatibility
  * we do the same. The timer will be added on the current CPU as a oneshot timer.
index 92a565190028618e603a067802faa4c7a4caabe3..fd594d5fe142bed0d1f1f17256ee4f98d617ce14 100644 (file)
@@ -29,8 +29,8 @@ struct memory_segment {
 
 static LIST_HEAD(mem_segs);
 
-void memmap_init(unsigned long size, int nid, unsigned long zone,
-                unsigned long start_pfn)
+void __meminit memmap_init(unsigned long size, int nid, unsigned long zone,
+                          unsigned long start_pfn)
 {
        struct page *start, *end;
        struct page *map_start, *map_end;
@@ -66,7 +66,7 @@ void memmap_init(unsigned long size, int nid, unsigned long zone,
        }
 }
 
-static inline void *vmem_alloc_pages(unsigned int order)
+static void __init_refok *vmem_alloc_pages(unsigned int order)
 {
        if (slab_is_available())
                return (void *)__get_free_pages(GFP_KERNEL, order);
index fdc67238408aaeed2822d129be55e7d2c9cade83..f7a509149199f06a46f3d3b4860ca4dc9c92feb9 100644 (file)
@@ -1,12 +1,14 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22-rc1
-# Mon May 14 03:25:14 2007
+# Linux kernel version: 2.6.23-rc1
+# Wed Jul 25 15:30:21 2007
 #
 CONFIG_MMU=y
 CONFIG_HIGHMEM=y
 CONFIG_ZONE_DMA=y
 CONFIG_GENERIC_ISA_DMA=y
+CONFIG_ARCH_NO_VIRT_TO_BUS=y
+CONFIG_OF=y
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -23,12 +25,11 @@ CONFIG_LOCALVERSION=""
 CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
-# CONFIG_IPC_NS is not set
 CONFIG_SYSVIPC_SYSCTL=y
 CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 # CONFIG_TASKSTATS is not set
-# CONFIG_UTS_NS is not set
+# CONFIG_USER_NS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
 CONFIG_LOG_BUF_SHIFT=14
@@ -63,24 +64,17 @@ CONFIG_SLAB=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
-
-#
-# Loadable module support
-#
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
 # CONFIG_MODVERSIONS is not set
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
-
-#
-# Block layer
-#
 CONFIG_BLOCK=y
 # CONFIG_LBD is not set
 # CONFIG_BLK_DEV_IO_TRACE is not set
 # CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
 
 #
 # IO Schedulers
@@ -113,11 +107,14 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
 # CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_EMULATED_CMPXCHG=y
 CONFIG_SUN_PM=y
 # CONFIG_SUN4 is not set
 CONFIG_PCI=y
+CONFIG_PCI_SYSCALL=y
 # CONFIG_ARCH_SUPPORTS_MSI is not set
 # CONFIG_PCI_DEBUG is not set
+# CONFIG_NO_DMA is not set
 CONFIG_SUN_OPENPROMFS=m
 # CONFIG_SPARC_LED is not set
 CONFIG_BINFMT_ELF=y
@@ -134,6 +131,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
 CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
 
 #
 # Networking
@@ -197,25 +195,13 @@ CONFIG_IPV6_TUNNEL=m
 # CONFIG_IPV6_MULTIPLE_TABLES is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
 CONFIG_IP_SCTP=m
 # CONFIG_SCTP_DBG_MSG is not set
 CONFIG_SCTP_DBG_OBJCNT=y
 # CONFIG_SCTP_HMAC_NONE is not set
 # CONFIG_SCTP_HMAC_SHA1 is not set
 CONFIG_SCTP_HMAC_MD5=y
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
@@ -253,6 +239,7 @@ CONFIG_AF_RXRPC=m
 # CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
 # CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
 
 #
 # Device Drivers
@@ -267,28 +254,12 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
 # CONFIG_CONNECTOR is not set
 # CONFIG_MTD is not set
-
-#
-# Parallel port support
-#
+CONFIG_OF_DEVICE=y
 # CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNPACPI is not set
-
-#
-# Block devices
-#
+CONFIG_BLK_DEV=y
 # CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_CPQ_DA is not set
 # CONFIG_BLK_CPQ_CISS_DA is not set
 # CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_UMEM is not set
@@ -303,18 +274,11 @@ CONFIG_BLK_DEV_RAM_SIZE=4096
 CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
-
-#
-# Misc devices
-#
+CONFIG_MISC_DEVICES=y
 # CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
 # CONFIG_SGI_IOC4 is not set
 # CONFIG_TIFM_CORE is not set
-# CONFIG_BLINK is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
 # CONFIG_IDE is not set
 
 #
@@ -322,6 +286,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 #
 # CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
 # CONFIG_SCSI_TGT is not set
 # CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
@@ -352,12 +317,8 @@ CONFIG_SCSI_WAIT_SCAN=m
 CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
 # CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
+CONFIG_SCSI_LOWLEVEL=y
 # CONFIG_ISCSI_TCP is not set
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
 # CONFIG_SCSI_3W_9XXX is not set
@@ -367,7 +328,6 @@ CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_AIC79XX is not set
 # CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_ARCMSR is not set
 # CONFIG_MEGARAID_NEWGEN is not set
 # CONFIG_MEGARAID_LEGACY is not set
@@ -389,14 +349,9 @@ CONFIG_SCSI_QLOGICPTI=m
 # CONFIG_SCSI_DC390T is not set
 # CONFIG_SCSI_NSP32 is not set
 # CONFIG_SCSI_DEBUG is not set
-CONFIG_SCSI_ESP_CORE=y
 CONFIG_SCSI_SUNESP=y
 # CONFIG_SCSI_SRP is not set
 # CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
 # CONFIG_MD is not set
 
 #
@@ -412,30 +367,16 @@ CONFIG_SCSI_SUNESP=y
 #
 # CONFIG_FIREWIRE is not set
 # CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
 # CONFIG_I2O is not set
-
-#
-# Network device support
-#
 CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
 CONFIG_DUMMY=m
 # CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
 # CONFIG_EQUALIZER is not set
 CONFIG_TUN=m
-
-#
-# ARCnet devices
-#
 # CONFIG_ARCNET is not set
 # CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=m
 CONFIG_SUNLANCE=y
@@ -445,10 +386,6 @@ CONFIG_SUNQE=m
 # CONFIG_SUNGEM is not set
 # CONFIG_CASSINI is not set
 # CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
 # CONFIG_NET_TULIP is not set
 # CONFIG_HP100 is not set
 # CONFIG_NET_PCI is not set
@@ -464,7 +401,7 @@ CONFIG_NETDEV_1000=y
 # CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
 # CONFIG_TIGON3 is not set
 # CONFIG_BNX2 is not set
 # CONFIG_QLA3XXX is not set
@@ -477,11 +414,6 @@ CONFIG_NETDEV_10000=y
 # CONFIG_MYRI10GE is not set
 # CONFIG_NETXEN_NIC is not set
 # CONFIG_MLX4_CORE is not set
-CONFIG_MLX4_DEBUG=y
-
-#
-# Token Ring devices
-#
 # CONFIG_TR is not set
 
 #
@@ -499,15 +431,7 @@ CONFIG_MLX4_DEBUG=y
 # CONFIG_NETCONSOLE is not set
 # CONFIG_NETPOLL is not set
 # CONFIG_NET_POLL_CONTROLLER is not set
-
-#
-# ISDN subsystem
-#
 # CONFIG_ISDN is not set
-
-#
-# Telephony Support
-#
 # CONFIG_PHONE is not set
 
 #
@@ -515,6 +439,7 @@ CONFIG_MLX4_DEBUG=y
 #
 CONFIG_INPUT=y
 # CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
 
 #
 # Userland interfaces
@@ -593,22 +518,13 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
-
-#
-# IPMI
-#
 # CONFIG_IPMI_HANDLER is not set
 # CONFIG_WATCHDOG is not set
 CONFIG_HW_RANDOM=m
 CONFIG_JS_RTC=m
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
-# CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
 # CONFIG_TCG_TPM is not set
 CONFIG_DEVPORT=y
 # CONFIG_I2C is not set
@@ -618,20 +534,24 @@ CONFIG_DEVPORT=y
 #
 # CONFIG_SPI is not set
 # CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
 # CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
 CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
 # CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_PC87360 is not set
 # CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SIS5595 is not set
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VIA686A is not set
 # CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
 # CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
@@ -656,6 +576,7 @@ CONFIG_HWMON=y
 #
 # CONFIG_DISPLAY_SUPPORT is not set
 # CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
 # CONFIG_FB is not set
 
 #
@@ -668,16 +589,10 @@ CONFIG_DUMMY_CONSOLE=y
 # Sound
 #
 # CONFIG_SOUND is not set
-
-#
-# HID Devices
-#
+CONFIG_HID_SUPPORT=y
 CONFIG_HID=y
 # CONFIG_HID_DEBUG is not set
-
-#
-# USB support
-#
+CONFIG_USB_SUPPORT=y
 CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
 CONFIG_USB_ARCH_HAS_EHCI=y
@@ -692,29 +607,9 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 #
 # CONFIG_USB_GADGET is not set
 # CONFIG_MMC is not set
-
-#
-# LED devices
-#
 # CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# InfiniBand support
-#
 # CONFIG_INFINIBAND is not set
 
-#
-# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
-#
-
 #
 # Real Time Clock
 #
@@ -733,6 +628,11 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 # DMA Devices
 #
 
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
 #
 # Misc Linux/SPARC drivers
 #
@@ -853,7 +753,6 @@ CONFIG_CIFS=m
 # CONFIG_CODA_FS is not set
 CONFIG_AFS_FS=m
 # CONFIG_AFS_DEBUG is not set
-# CONFIG_9P_FS is not set
 
 #
 # Partition Types
@@ -927,6 +826,7 @@ CONFIG_MAGIC_SYSRQ=y
 # CONFIG_HEADERS_CHECK is not set
 CONFIG_DEBUG_KERNEL=y
 CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHED_DEBUG is not set
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_TIMER_STATS is not set
 # CONFIG_DEBUG_SLAB is not set
@@ -953,10 +853,6 @@ CONFIG_FORCED_INLINING=y
 CONFIG_KEYS=y
 # CONFIG_KEYS_DEBUG_PROC_KEYS is not set
 # CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
 CONFIG_CRYPTO=y
 CONFIG_CRYPTO_ALGAPI=y
 CONFIG_CRYPTO_BLKCIPHER=y
@@ -996,10 +892,7 @@ CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_CRC32C=m
 # CONFIG_CRYPTO_CAMELLIA is not set
 # CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
+# CONFIG_CRYPTO_HW is not set
 
 #
 # Library routines
@@ -1009,6 +902,7 @@ CONFIG_BITREVERSE=y
 # CONFIG_CRC16 is not set
 # CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
 CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=y
index fc31de66b1c227f68c945715f6f5e7673f594379..d9d4f96360c7bff691836f3683d7fce954b5311f 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init_task.h>
index e3a537650db1e8792c0d7a7978b0e52ab3e7fe2e..39fbd3c8ab0b7cce84534bd4eb8b8726e1e270e1 100644 (file)
@@ -415,7 +415,7 @@ static void __init of_console_init(void)
        unsigned long flags;
        const char *type;
        phandle node;
-       int skip, fd;
+       int skip, tmp, fd;
 
        of_console_path = prom_early_alloc(256);
 
@@ -442,8 +442,9 @@ static void __init of_console_init(void)
                        prom_halt();
                }
 
+               tmp = skip;
                for_each_node_by_type(dp, type) {
-                       if (!skip--)
+                       if (!tmp--)
                                break;
                }
                if (!dp) {
index 1f130f3b6c24affc675d29425e7a21d9e8cd2ef7..a5faa3683bd6142fced745574163df555a63e2f5 100644 (file)
@@ -29,7 +29,7 @@ config DEBUG_BOOTMEM
 
 config DEBUG_PAGEALLOC
        bool "Debug page memory allocations"
-       depends on DEBUG_KERNEL && !SOFTWARE_SUSPEND
+       depends on DEBUG_KERNEL && !HIBERNATION
        help
          Unmap pages from the kernel linear mapping after free_pages().
          This results in a large slowdown, but helps to find certain types
index b66876bf410c489391f20251daa4401843465f9e..40d2f3aae91eb48b3443731a6987f78516279786 100644 (file)
@@ -8,14 +8,14 @@ EXTRA_CFLAGS := -Werror
 extra-y                := head.o init_task.o vmlinux.lds
 
 obj-y          := process.o setup.o cpu.o idprom.o \
-                  traps.o auxio.o una_asm.o sysfs.o \
+                  traps.o auxio.o una_asm.o sysfs.o iommu.o \
                   irq.o ptrace.o time.o sys_sparc.o signal.o \
                   unaligned.o central.o pci.o starfire.o semaphore.o \
                   power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \
                   visemul.o prom.o of_device.o hvapi.o sstate.o mdesc.o
 
 obj-$(CONFIG_STACKTRACE) += stacktrace.o
-obj-$(CONFIG_PCI)       += ebus.o isa.o pci_common.o pci_iommu.o \
+obj-$(CONFIG_PCI)       += ebus.o isa.o pci_common.o \
                            pci_psycho.o pci_sabre.o pci_schizo.o \
                            pci_sun4v.o pci_sun4v_asm.o pci_fire.o
 obj-$(CONFIG_SMP)       += smp.o trampoline.o hvtramp.o
index 6d2956179cde796006f767d6529cc80ab0694e73..bc9ae36f7a43cd1de77cf6469762f21fc4ce6bd3 100644 (file)
@@ -391,6 +391,8 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de
        sd = &dev->ofdev.dev.archdata;
        sd->prom_node = dp;
        sd->op = &dev->ofdev;
+       sd->iommu = dev->bus->ofdev.dev.parent->archdata.iommu;
+       sd->stc = dev->bus->ofdev.dev.parent->archdata.stc;
 
        dev->ofdev.node = dp;
        dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
index 329b38fa5c89e81fb995651f257417e4bfd04589..90007cf88bac650517c67951f81aa056ca7ae71f 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/init_task.h>
similarity index 68%
rename from arch/sparc64/kernel/pci_iommu.c
rename to arch/sparc64/kernel/iommu.c
index 70d2364fdfe0b6910be668dd9e5a032752c25e4b..b35a62167e9ce31af6f957b28902ca0259bf3b5d 100644 (file)
@@ -1,28 +1,32 @@
-/* pci_iommu.c: UltraSparc PCI controller IOM/STC support.
+/* iommu.c: Generic sparc64 IOMMU support.
  *
  * Copyright (C) 1999, 2007 David S. Miller (davem@davemloft.net)
  * Copyright (C) 1999, 2000 Jakub Jelinek (jakub@redhat.com)
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
+#include <linux/module.h>
 #include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/errno.h>
+
+#ifdef CONFIG_PCI
 #include <linux/pci.h>
+#endif
 
-#include <asm/oplib.h>
+#include <asm/iommu.h>
 
 #include "iommu_common.h"
-#include "pci_impl.h"
 
-#define PCI_STC_CTXMATCH_ADDR(STC, CTX)        \
+#define STC_CTXMATCH_ADDR(STC, CTX)    \
        ((STC)->strbuf_ctxmatch_base + ((CTX) << 3))
+#define STC_FLUSHFLAG_INIT(STC) \
+       (*((STC)->strbuf_flushflag) = 0UL)
+#define STC_FLUSHFLAG_SET(STC) \
+       (*((STC)->strbuf_flushflag) != 0UL)
 
-/* Accessing IOMMU and Streaming Buffer registers.
- * REG parameter is a physical address.  All registers
- * are 64-bits in size.
- */
-#define pci_iommu_read(__reg) \
+#define iommu_read(__reg) \
 ({     u64 __ret; \
        __asm__ __volatile__("ldxa [%1] %2, %0" \
                             : "=r" (__ret) \
@@ -30,7 +34,7 @@
                             : "memory"); \
        __ret; \
 })
-#define pci_iommu_write(__reg, __val) \
+#define iommu_write(__reg, __val) \
        __asm__ __volatile__("stxa %0, [%1] %2" \
                             : /* no outputs */ \
                             : "r" (__val), "r" (__reg), \
 static void __iommu_flushall(struct iommu *iommu)
 {
        if (iommu->iommu_flushinv) {
-               pci_iommu_write(iommu->iommu_flushinv, ~(u64)0);
+               iommu_write(iommu->iommu_flushinv, ~(u64)0);
        } else {
                unsigned long tag;
                int entry;
 
-               tag = iommu->iommu_flush + (0xa580UL - 0x0210UL);
+               tag = iommu->iommu_tags;
                for (entry = 0; entry < 16; entry++) {
-                       pci_iommu_write(tag, 0);
+                       iommu_write(tag, 0);
                        tag += 8;
                }
 
                /* Ensure completion of previous PIO writes. */
-               (void) pci_iommu_read(iommu->write_complete_reg);
+               (void) iommu_read(iommu->write_complete_reg);
        }
 }
 
@@ -80,7 +84,7 @@ static inline void iopte_make_dummy(struct iommu *iommu, iopte_t *iopte)
 }
 
 /* Based largely upon the ppc64 iommu allocator.  */
-static long pci_arena_alloc(struct iommu *iommu, unsigned long npages)
+static long arena_alloc(struct iommu *iommu, unsigned long npages)
 {
        struct iommu_arena *arena = &iommu->arena;
        unsigned long n, i, start, end, limit;
@@ -121,7 +125,7 @@ again:
        return n;
 }
 
-static void pci_arena_free(struct iommu_arena *arena, unsigned long base, unsigned long npages)
+static void arena_free(struct iommu_arena *arena, unsigned long base, unsigned long npages)
 {
        unsigned long i;
 
@@ -129,7 +133,8 @@ static void pci_arena_free(struct iommu_arena *arena, unsigned long base, unsign
                __clear_bit(i, arena->map);
 }
 
-void pci_iommu_table_init(struct iommu *iommu, int tsbsize, u32 dma_offset, u32 dma_addr_mask)
+int iommu_table_init(struct iommu *iommu, int tsbsize,
+                    u32 dma_offset, u32 dma_addr_mask)
 {
        unsigned long i, tsbbase, order, sz, num_tsb_entries;
 
@@ -146,8 +151,8 @@ void pci_iommu_table_init(struct iommu *iommu, int tsbsize, u32 dma_offset, u32
        sz = (sz + 7UL) & ~7UL;
        iommu->arena.map = kzalloc(sz, GFP_KERNEL);
        if (!iommu->arena.map) {
-               prom_printf("PCI_IOMMU: Error, kmalloc(arena.map) failed.\n");
-               prom_halt();
+               printk(KERN_ERR "IOMMU: Error, kmalloc(arena.map) failed.\n");
+               return -ENOMEM;
        }
        iommu->arena.limit = num_tsb_entries;
 
@@ -156,8 +161,8 @@ void pci_iommu_table_init(struct iommu *iommu, int tsbsize, u32 dma_offset, u32
         */
        iommu->dummy_page = __get_free_pages(GFP_KERNEL, 0);
        if (!iommu->dummy_page) {
-               prom_printf("PCI_IOMMU: Error, gfp(dummy_page) failed.\n");
-               prom_halt();
+               printk(KERN_ERR "IOMMU: Error, gfp(dummy_page) failed.\n");
+               goto out_free_map;
        }
        memset((void *)iommu->dummy_page, 0, PAGE_SIZE);
        iommu->dummy_page_pa = (unsigned long) __pa(iommu->dummy_page);
@@ -166,20 +171,32 @@ void pci_iommu_table_init(struct iommu *iommu, int tsbsize, u32 dma_offset, u32
        order = get_order(tsbsize);
        tsbbase = __get_free_pages(GFP_KERNEL, order);
        if (!tsbbase) {
-               prom_printf("PCI_IOMMU: Error, gfp(tsb) failed.\n");
-               prom_halt();
+               printk(KERN_ERR "IOMMU: Error, gfp(tsb) failed.\n");
+               goto out_free_dummy_page;
        }
        iommu->page_table = (iopte_t *)tsbbase;
 
        for (i = 0; i < num_tsb_entries; i++)
                iopte_make_dummy(iommu, &iommu->page_table[i]);
+
+       return 0;
+
+out_free_dummy_page:
+       free_page(iommu->dummy_page);
+       iommu->dummy_page = 0UL;
+
+out_free_map:
+       kfree(iommu->arena.map);
+       iommu->arena.map = NULL;
+
+       return -ENOMEM;
 }
 
 static inline iopte_t *alloc_npages(struct iommu *iommu, unsigned long npages)
 {
        long entry;
 
-       entry = pci_arena_alloc(iommu, npages);
+       entry = arena_alloc(iommu, npages);
        if (unlikely(entry < 0))
                return NULL;
 
@@ -188,7 +205,7 @@ static inline iopte_t *alloc_npages(struct iommu *iommu, unsigned long npages)
 
 static inline void free_npages(struct iommu *iommu, dma_addr_t base, unsigned long npages)
 {
-       pci_arena_free(&iommu->arena, base >> IO_PAGE_SHIFT, npages);
+       arena_free(&iommu->arena, base >> IO_PAGE_SHIFT, npages);
 }
 
 static int iommu_alloc_ctx(struct iommu *iommu)
@@ -219,11 +236,8 @@ static inline void iommu_free_ctx(struct iommu *iommu, int ctx)
        }
 }
 
-/* Allocate and map kernel buffer of size SIZE using consistent mode
- * DMA for PCI device PDEV.  Return non-NULL cpu-side address if
- * successful and set *DMA_ADDRP to the PCI side dma address.
- */
-static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp, gfp_t gfp)
+static void *dma_4u_alloc_coherent(struct device *dev, size_t size,
+                                  dma_addr_t *dma_addrp, gfp_t gfp)
 {
        struct iommu *iommu;
        iopte_t *iopte;
@@ -241,7 +255,7 @@ static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
                return NULL;
        memset((char *)first_page, 0, PAGE_SIZE << order);
 
-       iommu = pdev->dev.archdata.iommu;
+       iommu = dev->archdata.iommu;
 
        spin_lock_irqsave(&iommu->lock, flags);
        iopte = alloc_npages(iommu, size >> IO_PAGE_SHIFT);
@@ -268,15 +282,15 @@ static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
        return ret;
 }
 
-/* Free and unmap a consistent DMA translation. */
-static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, dma_addr_t dvma)
+static void dma_4u_free_coherent(struct device *dev, size_t size,
+                                void *cpu, dma_addr_t dvma)
 {
        struct iommu *iommu;
        iopte_t *iopte;
        unsigned long flags, order, npages;
 
        npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT;
-       iommu = pdev->dev.archdata.iommu;
+       iommu = dev->archdata.iommu;
        iopte = iommu->page_table +
                ((dvma - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
 
@@ -291,10 +305,8 @@ static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu,
                free_pages((unsigned long)cpu, order);
 }
 
-/* Map a single buffer at PTR of SZ bytes for PCI DMA
- * in streaming mode.
- */
-static dma_addr_t pci_4u_map_single(struct pci_dev *pdev, void *ptr, size_t sz, int direction)
+static dma_addr_t dma_4u_map_single(struct device *dev, void *ptr, size_t sz,
+                                   enum dma_data_direction direction)
 {
        struct iommu *iommu;
        struct strbuf *strbuf;
@@ -304,10 +316,10 @@ static dma_addr_t pci_4u_map_single(struct pci_dev *pdev, void *ptr, size_t sz,
        u32 bus_addr, ret;
        unsigned long iopte_protection;
 
-       iommu = pdev->dev.archdata.iommu;
-       strbuf = pdev->dev.archdata.stc;
+       iommu = dev->archdata.iommu;
+       strbuf = dev->archdata.stc;
 
-       if (unlikely(direction == PCI_DMA_NONE))
+       if (unlikely(direction == DMA_NONE))
                goto bad_no_ctx;
 
        oaddr = (unsigned long)ptr;
@@ -332,7 +344,7 @@ static dma_addr_t pci_4u_map_single(struct pci_dev *pdev, void *ptr, size_t sz,
                iopte_protection = IOPTE_STREAMING(ctx);
        else
                iopte_protection = IOPTE_CONSISTENT(ctx);
-       if (direction != PCI_DMA_TODEVICE)
+       if (direction != DMA_TO_DEVICE)
                iopte_protection |= IOPTE_WRITE;
 
        for (i = 0; i < npages; i++, base++, base_paddr += IO_PAGE_SIZE)
@@ -345,10 +357,12 @@ bad:
 bad_no_ctx:
        if (printk_ratelimit())
                WARN_ON(1);
-       return PCI_DMA_ERROR_CODE;
+       return DMA_ERROR_CODE;
 }
 
-static void pci_strbuf_flush(struct strbuf *strbuf, struct iommu *iommu, u32 vaddr, unsigned long ctx, unsigned long npages, int direction)
+static void strbuf_flush(struct strbuf *strbuf, struct iommu *iommu,
+                        u32 vaddr, unsigned long ctx, unsigned long npages,
+                        enum dma_data_direction direction)
 {
        int limit;
 
@@ -358,22 +372,22 @@ static void pci_strbuf_flush(struct strbuf *strbuf, struct iommu *iommu, u32 vad
                u64 val;
 
                flushreg = strbuf->strbuf_ctxflush;
-               matchreg = PCI_STC_CTXMATCH_ADDR(strbuf, ctx);
+               matchreg = STC_CTXMATCH_ADDR(strbuf, ctx);
 
-               pci_iommu_write(flushreg, ctx);
-               val = pci_iommu_read(matchreg);
+               iommu_write(flushreg, ctx);
+               val = iommu_read(matchreg);
                val &= 0xffff;
                if (!val)
                        goto do_flush_sync;
 
                while (val) {
                        if (val & 0x1)
-                               pci_iommu_write(flushreg, ctx);
+                               iommu_write(flushreg, ctx);
                        val >>= 1;
                }
-               val = pci_iommu_read(matchreg);
+               val = iommu_read(matchreg);
                if (unlikely(val)) {
-                       printk(KERN_WARNING "pci_strbuf_flush: ctx flush "
+                       printk(KERN_WARNING "strbuf_flush: ctx flush "
                               "timeout matchreg[%lx] ctx[%lx]\n",
                               val, ctx);
                        goto do_page_flush;
@@ -383,7 +397,7 @@ static void pci_strbuf_flush(struct strbuf *strbuf, struct iommu *iommu, u32 vad
 
        do_page_flush:
                for (i = 0; i < npages; i++, vaddr += IO_PAGE_SIZE)
-                       pci_iommu_write(strbuf->strbuf_pflush, vaddr);
+                       iommu_write(strbuf->strbuf_pflush, vaddr);
        }
 
 do_flush_sync:
@@ -391,15 +405,15 @@ do_flush_sync:
         * the streaming cache, no flush-flag synchronization needs
         * to be performed.
         */
-       if (direction == PCI_DMA_TODEVICE)
+       if (direction == DMA_TO_DEVICE)
                return;
 
-       PCI_STC_FLUSHFLAG_INIT(strbuf);
-       pci_iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
-       (void) pci_iommu_read(iommu->write_complete_reg);
+       STC_FLUSHFLAG_INIT(strbuf);
+       iommu_write(strbuf->strbuf_fsync, strbuf->strbuf_flushflag_pa);
+       (void) iommu_read(iommu->write_complete_reg);
 
        limit = 100000;
-       while (!PCI_STC_FLUSHFLAG_SET(strbuf)) {
+       while (!STC_FLUSHFLAG_SET(strbuf)) {
                limit--;
                if (!limit)
                        break;
@@ -407,37 +421,32 @@ do_flush_sync:
                rmb();
        }
        if (!limit)
-               printk(KERN_WARNING "pci_strbuf_flush: flushflag timeout "
+               printk(KERN_WARNING "strbuf_flush: flushflag timeout "
                       "vaddr[%08x] ctx[%lx] npages[%ld]\n",
                       vaddr, ctx, npages);
 }
 
-/* Unmap a single streaming mode DMA translation. */
-static void pci_4u_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction)
+static void dma_4u_unmap_single(struct device *dev, dma_addr_t bus_addr,
+                               size_t sz, enum dma_data_direction direction)
 {
        struct iommu *iommu;
        struct strbuf *strbuf;
        iopte_t *base;
        unsigned long flags, npages, ctx, i;
 
-       if (unlikely(direction == PCI_DMA_NONE)) {
+       if (unlikely(direction == DMA_NONE)) {
                if (printk_ratelimit())
                        WARN_ON(1);
                return;
        }
 
-       iommu = pdev->dev.archdata.iommu;
-       strbuf = pdev->dev.archdata.stc;
+       iommu = dev->archdata.iommu;
+       strbuf = dev->archdata.stc;
 
        npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK);
        npages >>= IO_PAGE_SHIFT;
        base = iommu->page_table +
                ((bus_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
-#ifdef DEBUG_PCI_IOMMU
-       if (IOPTE_IS_DUMMY(iommu, base))
-               printk("pci_unmap_single called on non-mapped region %08x,%08x from %016lx\n",
-                      bus_addr, sz, __builtin_return_address(0));
-#endif
        bus_addr &= IO_PAGE_MASK;
 
        spin_lock_irqsave(&iommu->lock, flags);
@@ -449,8 +458,8 @@ static void pci_4u_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_
 
        /* Step 1: Kick data out of streaming buffers if necessary. */
        if (strbuf->strbuf_enabled)
-               pci_strbuf_flush(strbuf, iommu, bus_addr, ctx,
-                                npages, direction);
+               strbuf_flush(strbuf, iommu, bus_addr, ctx,
+                            npages, direction);
 
        /* Step 2: Clear out TSB entries. */
        for (i = 0; i < npages; i++)
@@ -467,7 +476,8 @@ static void pci_4u_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_
        (__pa(page_address((SG)->page)) + (SG)->offset)
 
 static inline void fill_sg(iopte_t *iopte, struct scatterlist *sg,
-                          int nused, int nelems, unsigned long iopte_protection)
+                          int nused, int nelems,
+                          unsigned long iopte_protection)
 {
        struct scatterlist *dma_sg = sg;
        struct scatterlist *sg_end = sg + nelems;
@@ -539,12 +549,8 @@ static inline void fill_sg(iopte_t *iopte, struct scatterlist *sg,
        }
 }
 
-/* Map a set of buffers described by SGLIST with NELEMS array
- * elements in streaming mode for PCI DMA.
- * When making changes here, inspect the assembly output. I was having
- * hard time to keep this routine out of using stack slots for holding variables.
- */
-static int pci_4u_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction)
+static int dma_4u_map_sg(struct device *dev, struct scatterlist *sglist,
+                        int nelems, enum dma_data_direction direction)
 {
        struct iommu *iommu;
        struct strbuf *strbuf;
@@ -557,19 +563,20 @@ static int pci_4u_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int n
        /* Fast path single entry scatterlists. */
        if (nelems == 1) {
                sglist->dma_address =
-                       pci_4u_map_single(pdev,
-                                         (page_address(sglist->page) + sglist->offset),
+                       dma_4u_map_single(dev,
+                                         (page_address(sglist->page) +
+                                          sglist->offset),
                                          sglist->length, direction);
-               if (unlikely(sglist->dma_address == PCI_DMA_ERROR_CODE))
+               if (unlikely(sglist->dma_address == DMA_ERROR_CODE))
                        return 0;
                sglist->dma_length = sglist->length;
                return 1;
        }
 
-       iommu = pdev->dev.archdata.iommu;
-       strbuf = pdev->dev.archdata.stc;
-       
-       if (unlikely(direction == PCI_DMA_NONE))
+       iommu = dev->archdata.iommu;
+       strbuf = dev->archdata.stc;
+
+       if (unlikely(direction == DMA_NONE))
                goto bad_no_ctx;
 
        /* Step 1: Prepare scatter list. */
@@ -609,7 +616,7 @@ static int pci_4u_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int n
                iopte_protection = IOPTE_STREAMING(ctx);
        else
                iopte_protection = IOPTE_CONSISTENT(ctx);
-       if (direction != PCI_DMA_TODEVICE)
+       if (direction != DMA_TO_DEVICE)
                iopte_protection |= IOPTE_WRITE;
 
        fill_sg(base, sglist, used, nelems, iopte_protection);
@@ -628,8 +635,8 @@ bad_no_ctx:
        return 0;
 }
 
-/* Unmap a set of streaming mode DMA translations. */
-static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction)
+static void dma_4u_unmap_sg(struct device *dev, struct scatterlist *sglist,
+                           int nelems, enum dma_data_direction direction)
 {
        struct iommu *iommu;
        struct strbuf *strbuf;
@@ -637,14 +644,14 @@ static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
        unsigned long flags, ctx, i, npages;
        u32 bus_addr;
 
-       if (unlikely(direction == PCI_DMA_NONE)) {
+       if (unlikely(direction == DMA_NONE)) {
                if (printk_ratelimit())
                        WARN_ON(1);
        }
 
-       iommu = pdev->dev.archdata.iommu;
-       strbuf = pdev->dev.archdata.stc;
-       
+       iommu = dev->archdata.iommu;
+       strbuf = dev->archdata.stc;
+
        bus_addr = sglist->dma_address & IO_PAGE_MASK;
 
        for (i = 1; i < nelems; i++)
@@ -657,11 +664,6 @@ static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
        base = iommu->page_table +
                ((bus_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
 
-#ifdef DEBUG_PCI_IOMMU
-       if (IOPTE_IS_DUMMY(iommu, base))
-               printk("pci_unmap_sg called on non-mapped region %016lx,%d from %016lx\n", sglist->dma_address, nelems, __builtin_return_address(0));
-#endif
-
        spin_lock_irqsave(&iommu->lock, flags);
 
        /* Record the context, if any. */
@@ -671,7 +673,7 @@ static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
 
        /* Step 1: Kick data out of streaming buffers if necessary. */
        if (strbuf->strbuf_enabled)
-               pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
+               strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        /* Step 2: Clear out the TSB entries. */
        for (i = 0; i < npages; i++)
@@ -684,17 +686,16 @@ static void pci_4u_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
-/* Make physical memory consistent for a single
- * streaming mode DMA translation after a transfer.
- */
-static void pci_4u_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction)
+static void dma_4u_sync_single_for_cpu(struct device *dev,
+                                      dma_addr_t bus_addr, size_t sz,
+                                      enum dma_data_direction direction)
 {
        struct iommu *iommu;
        struct strbuf *strbuf;
        unsigned long flags, ctx, npages;
 
-       iommu = pdev->dev.archdata.iommu;
-       strbuf = pdev->dev.archdata.stc;
+       iommu = dev->archdata.iommu;
+       strbuf = dev->archdata.stc;
 
        if (!strbuf->strbuf_enabled)
                return;
@@ -717,23 +718,22 @@ static void pci_4u_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_
        }
 
        /* Step 2: Kick data out of streaming buffers. */
-       pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
+       strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
-/* Make physical memory consistent for a set of streaming
- * mode DMA translations after a transfer.
- */
-static void pci_4u_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction)
+static void dma_4u_sync_sg_for_cpu(struct device *dev,
+                                  struct scatterlist *sglist, int nelems,
+                                  enum dma_data_direction direction)
 {
        struct iommu *iommu;
        struct strbuf *strbuf;
        unsigned long flags, ctx, npages, i;
        u32 bus_addr;
 
-       iommu = pdev->dev.archdata.iommu;
-       strbuf = pdev->dev.archdata.stc;
+       iommu = dev->archdata.iommu;
+       strbuf = dev->archdata.stc;
 
        if (!strbuf->strbuf_enabled)
                return;
@@ -759,65 +759,51 @@ static void pci_4u_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist
        i--;
        npages = (IO_PAGE_ALIGN(sglist[i].dma_address + sglist[i].dma_length)
                  - bus_addr) >> IO_PAGE_SHIFT;
-       pci_strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
+       strbuf_flush(strbuf, iommu, bus_addr, ctx, npages, direction);
 
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
-const struct pci_iommu_ops pci_sun4u_iommu_ops = {
-       .alloc_consistent               = pci_4u_alloc_consistent,
-       .free_consistent                = pci_4u_free_consistent,
-       .map_single                     = pci_4u_map_single,
-       .unmap_single                   = pci_4u_unmap_single,
-       .map_sg                         = pci_4u_map_sg,
-       .unmap_sg                       = pci_4u_unmap_sg,
-       .dma_sync_single_for_cpu        = pci_4u_dma_sync_single_for_cpu,
-       .dma_sync_sg_for_cpu            = pci_4u_dma_sync_sg_for_cpu,
+const struct dma_ops sun4u_dma_ops = {
+       .alloc_coherent         = dma_4u_alloc_coherent,
+       .free_coherent          = dma_4u_free_coherent,
+       .map_single             = dma_4u_map_single,
+       .unmap_single           = dma_4u_unmap_single,
+       .map_sg                 = dma_4u_map_sg,
+       .unmap_sg               = dma_4u_unmap_sg,
+       .sync_single_for_cpu    = dma_4u_sync_single_for_cpu,
+       .sync_sg_for_cpu        = dma_4u_sync_sg_for_cpu,
 };
 
-static void ali_sound_dma_hack(struct pci_dev *pdev, int set_bit)
-{
-       struct pci_dev *ali_isa_bridge;
-       u8 val;
+const struct dma_ops *dma_ops = &sun4u_dma_ops;
+EXPORT_SYMBOL(dma_ops);
 
-       /* ALI sound chips generate 31-bits of DMA, a special register
-        * determines what bit 31 is emitted as.
-        */
-       ali_isa_bridge = pci_get_device(PCI_VENDOR_ID_AL,
-                                        PCI_DEVICE_ID_AL_M1533,
-                                        NULL);
-
-       pci_read_config_byte(ali_isa_bridge, 0x7e, &val);
-       if (set_bit)
-               val |= 0x01;
-       else
-               val &= ~0x01;
-       pci_write_config_byte(ali_isa_bridge, 0x7e, val);
-       pci_dev_put(ali_isa_bridge);
-}
-
-int pci_dma_supported(struct pci_dev *pdev, u64 device_mask)
+int dma_supported(struct device *dev, u64 device_mask)
 {
-       u64 dma_addr_mask;
+       struct iommu *iommu = dev->archdata.iommu;
+       u64 dma_addr_mask = iommu->dma_addr_mask;
 
-       if (pdev == NULL) {
-               dma_addr_mask = 0xffffffff;
-       } else {
-               struct iommu *iommu = pdev->dev.archdata.iommu;
+       if (device_mask >= (1UL << 32UL))
+               return 0;
 
-               dma_addr_mask = iommu->dma_addr_mask;
+       if ((device_mask & dma_addr_mask) == dma_addr_mask)
+               return 1;
 
-               if (pdev->vendor == PCI_VENDOR_ID_AL &&
-                   pdev->device == PCI_DEVICE_ID_AL_M5451 &&
-                   device_mask == 0x7fffffff) {
-                       ali_sound_dma_hack(pdev,
-                                          (dma_addr_mask & 0x80000000) != 0);
-                       return 1;
-               }
-       }
+#ifdef CONFIG_PCI
+       if (dev->bus == &pci_bus_type)
+               return pci_dma_supported(to_pci_dev(dev), device_mask);
+#endif
 
-       if (device_mask >= (1UL << 32UL))
-               return 0;
+       return 0;
+}
+EXPORT_SYMBOL(dma_supported);
 
-       return (device_mask & dma_addr_mask) == dma_addr_mask;
+int dma_set_mask(struct device *dev, u64 dma_mask)
+{
+#ifdef CONFIG_PCI
+       if (dev->bus == &pci_bus_type)
+               return pci_set_dma_mask(to_pci_dev(dev), dma_mask);
+#endif
+       return -EINVAL;
 }
+EXPORT_SYMBOL(dma_set_mask);
index 1a1043fcf97dda26866182a97acd2739e94df3ee..0f19dce1c905c699e30361a7f6c6397cffc5c3c7 100644 (file)
@@ -90,6 +90,8 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
                sd = &isa_dev->ofdev.dev.archdata;
                sd->prom_node = dp;
                sd->op = &isa_dev->ofdev;
+               sd->iommu = isa_br->ofdev.dev.parent->archdata.iommu;
+               sd->stc = isa_br->ofdev.dev.parent->archdata.stc;
 
                isa_dev->ofdev.node = dp;
                isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev;
index 55ad1b899bb8e945a3e049d09ef13e5e1fd167a5..3d93e9203ba2d412ccb6b0e71b5c1432ca9a06d3 100644 (file)
@@ -283,12 +283,6 @@ int __init pcic_present(void)
        return pci_controller_scan(pci_is_controller);
 }
 
-const struct pci_iommu_ops *pci_iommu_ops;
-EXPORT_SYMBOL(pci_iommu_ops);
-
-extern const struct pci_iommu_ops pci_sun4u_iommu_ops,
-       pci_sun4v_iommu_ops;
-
 /* Find each controller in the system, attach and initialize
  * software state structure for each and link into the
  * pci_pbm_root.  Setup the controller enough such
@@ -296,11 +290,6 @@ extern const struct pci_iommu_ops pci_sun4u_iommu_ops,
  */
 static void __init pci_controller_probe(void)
 {
-       if (tlb_type == hypervisor)
-               pci_iommu_ops = &pci_sun4v_iommu_ops;
-       else
-               pci_iommu_ops = &pci_sun4u_iommu_ops;
-
        printk("PCI: Probing for controllers.\n");
 
        pci_controller_scan(pci_controller_init);
@@ -406,6 +395,10 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
        sd->op = of_find_device_by_node(node);
        sd->msi_num = 0xffffffff;
 
+       sd = &sd->op->dev.archdata;
+       sd->iommu = pbm->iommu;
+       sd->stc = &pbm->stc;
+
        type = of_get_property(node, "device_type", NULL);
        if (type == NULL)
                type = "";
@@ -422,10 +415,15 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
        dev->multifunction = 0;         /* maybe a lie? */
 
        if (host_controller) {
-               dev->vendor = 0x108e;
-               dev->device = 0x8000;
-               dev->subsystem_vendor = 0x0000;
-               dev->subsystem_device = 0x0000;
+               if (tlb_type != hypervisor) {
+                       pci_read_config_word(dev, PCI_VENDOR_ID,
+                                            &dev->vendor);
+                       pci_read_config_word(dev, PCI_DEVICE_ID,
+                                            &dev->device);
+               } else {
+                       dev->vendor = PCI_VENDOR_ID_SUN;
+                       dev->device = 0x80f0;
+               }
                dev->cfg_size = 256;
                dev->class = PCI_CLASS_BRIDGE_HOST << 8;
                sprintf(pci_name(dev), "%04x:%02x:%02x.%d", pci_domain_nr(bus),
@@ -818,7 +816,7 @@ int pci_host_bridge_read_pci_cfg(struct pci_bus *bus_dev,
 {
        static u8 fake_pci_config[] = {
                0x8e, 0x10, /* Vendor: 0x108e (Sun) */
-               0x00, 0x80, /* Device: 0x8000 (PBM) */
+               0xf0, 0x80, /* Device: 0x80f0 (Fire) */
                0x46, 0x01, /* Command: 0x0146 (SERR, PARITY, MASTER, MEM) */
                0xa0, 0x22, /* Status: 0x02a0 (DEVSEL_MED, FB2B, 66MHZ) */
                0x00, 0x00, 0x00, 0x06, /* Class: 0x06000000 host bridge */
@@ -1221,4 +1219,51 @@ struct device_node *pci_device_to_OF_node(struct pci_dev *pdev)
 }
 EXPORT_SYMBOL(pci_device_to_OF_node);
 
+static void ali_sound_dma_hack(struct pci_dev *pdev, int set_bit)
+{
+       struct pci_dev *ali_isa_bridge;
+       u8 val;
+
+       /* ALI sound chips generate 31-bits of DMA, a special register
+        * determines what bit 31 is emitted as.
+        */
+       ali_isa_bridge = pci_get_device(PCI_VENDOR_ID_AL,
+                                        PCI_DEVICE_ID_AL_M1533,
+                                        NULL);
+
+       pci_read_config_byte(ali_isa_bridge, 0x7e, &val);
+       if (set_bit)
+               val |= 0x01;
+       else
+               val &= ~0x01;
+       pci_write_config_byte(ali_isa_bridge, 0x7e, val);
+       pci_dev_put(ali_isa_bridge);
+}
+
+int pci_dma_supported(struct pci_dev *pdev, u64 device_mask)
+{
+       u64 dma_addr_mask;
+
+       if (pdev == NULL) {
+               dma_addr_mask = 0xffffffff;
+       } else {
+               struct iommu *iommu = pdev->dev.archdata.iommu;
+
+               dma_addr_mask = iommu->dma_addr_mask;
+
+               if (pdev->vendor == PCI_VENDOR_ID_AL &&
+                   pdev->device == PCI_DEVICE_ID_AL_M5451 &&
+                   device_mask == 0x7fffffff) {
+                       ali_sound_dma_hack(pdev,
+                                          (dma_addr_mask & 0x80000000) != 0);
+                       return 1;
+               }
+       }
+
+       if (device_mask >= (1UL << 32UL))
+               return 0;
+
+       return (device_mask & dma_addr_mask) == dma_addr_mask;
+}
+
 #endif /* !(CONFIG_PCI) */
index 4249214608af63116aea1d2db4fd176b201a1e8a..2f61c4b1259606ee45ab004cd8e10d91bcb3b5ae 100644 (file)
@@ -44,6 +44,67 @@ static void *sun4u_config_mkaddr(struct pci_pbm_info *pbm,
        return (void *) (pbm->config_space | bus | devfn | reg);
 }
 
+/* At least on Sabre, it is necessary to access all PCI host controller
+ * registers at their natural size, otherwise zeros are returned.
+ * Strange but true, and I see no language in the UltraSPARC-IIi
+ * programmer's manual that mentions this even indirectly.
+ */
+static int sun4u_read_pci_cfg_host(struct pci_pbm_info *pbm,
+                                  unsigned char bus, unsigned int devfn,
+                                  int where, int size, u32 *value)
+{
+       u32 tmp32, *addr;
+       u16 tmp16;
+       u8 tmp8;
+
+       addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
+       if (!addr)
+               return PCIBIOS_SUCCESSFUL;
+
+       switch (size) {
+       case 1:
+               if (where < 8) {
+                       unsigned long align = (unsigned long) addr;
+
+                       align &= ~1;
+                       pci_config_read16((u16 *)align, &tmp16);
+                       if (where & 1)
+                               *value = tmp16 >> 8;
+                       else
+                               *value = tmp16 & 0xff;
+               } else {
+                       pci_config_read8((u8 *)addr, &tmp8);
+                       *value = (u32) tmp8;
+               }
+               break;
+
+       case 2:
+               if (where < 8) {
+                       pci_config_read16((u16 *)addr, &tmp16);
+                       *value = (u32) tmp16;
+               } else {
+                       pci_config_read8((u8 *)addr, &tmp8);
+                       *value = (u32) tmp8;
+                       pci_config_read8(((u8 *)addr) + 1, &tmp8);
+                       *value |= ((u32) tmp8) << 8;
+               }
+               break;
+
+       case 4:
+               tmp32 = 0xffffffff;
+               sun4u_read_pci_cfg_host(pbm, bus, devfn,
+                                       where, 2, &tmp32);
+               *value = tmp32;
+
+               tmp32 = 0xffffffff;
+               sun4u_read_pci_cfg_host(pbm, bus, devfn,
+                                       where + 2, 2, &tmp32);
+               *value |= tmp32 << 16;
+               break;
+       }
+       return PCIBIOS_SUCCESSFUL;
+}
+
 static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
                              int where, int size, u32 *value)
 {
@@ -53,10 +114,6 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
        u16 tmp16;
        u8 tmp8;
 
-       if (bus_dev == pbm->pci_bus && devfn == 0x00)
-               return pci_host_bridge_read_pci_cfg(bus_dev, devfn, where,
-                                                   size, value);
-
        switch (size) {
        case 1:
                *value = 0xff;
@@ -69,6 +126,10 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
                break;
        }
 
+       if (!bus_dev->number && !PCI_SLOT(devfn))
+               return sun4u_read_pci_cfg_host(pbm, bus, devfn, where,
+                                              size, value);
+
        addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
        if (!addr)
                return PCIBIOS_SUCCESSFUL;
@@ -101,6 +162,53 @@ static int sun4u_read_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
        return PCIBIOS_SUCCESSFUL;
 }
 
+static int sun4u_write_pci_cfg_host(struct pci_pbm_info *pbm,
+                                   unsigned char bus, unsigned int devfn,
+                                   int where, int size, u32 value)
+{
+       u32 *addr;
+
+       addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
+       if (!addr)
+               return PCIBIOS_SUCCESSFUL;
+
+       switch (size) {
+       case 1:
+               if (where < 8) {
+                       unsigned long align = (unsigned long) addr;
+                       u16 tmp16;
+
+                       align &= ~1;
+                       pci_config_read16((u16 *)align, &tmp16);
+                       if (where & 1) {
+                               tmp16 &= 0x00ff;
+                               tmp16 |= value << 8;
+                       } else {
+                               tmp16 &= 0xff00;
+                               tmp16 |= value;
+                       }
+                       pci_config_write16((u16 *)align, tmp16);
+               } else
+                       pci_config_write8((u8 *)addr, value);
+               break;
+       case 2:
+               if (where < 8) {
+                       pci_config_write16((u16 *)addr, value);
+               } else {
+                       pci_config_write8((u8 *)addr, value & 0xff);
+                       pci_config_write8(((u8 *)addr) + 1, value >> 8);
+               }
+               break;
+       case 4:
+               sun4u_write_pci_cfg_host(pbm, bus, devfn,
+                                        where, 2, value & 0xffff);
+               sun4u_write_pci_cfg_host(pbm, bus, devfn,
+                                        where + 2, 2, value >> 16);
+               break;
+       }
+       return PCIBIOS_SUCCESSFUL;
+}
+
 static int sun4u_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
                               int where, int size, u32 value)
 {
@@ -108,9 +216,10 @@ static int sun4u_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn,
        unsigned char bus = bus_dev->number;
        u32 *addr;
 
-       if (bus_dev == pbm->pci_bus && devfn == 0x00)
-               return pci_host_bridge_write_pci_cfg(bus_dev, devfn, where,
-                                                    size, value);
+       if (!bus_dev->number && !PCI_SLOT(devfn))
+               return sun4u_write_pci_cfg_host(pbm, bus, devfn, where,
+                                               size, value);
+
        addr = sun4u_config_mkaddr(pbm, bus, devfn, where);
        if (!addr)
                return PCIBIOS_SUCCESSFUL;
index 7f5d473901c49ac8229e9062d388dede7d6d1a6f..14d67fe21ab2c1a4aa8343a97352e0ab7573f0c7 100644 (file)
@@ -39,12 +39,12 @@ static void pci_fire_scan_bus(struct pci_pbm_info *pbm)
 #define FIRE_IOMMU_FLUSH       0x40100UL
 #define FIRE_IOMMU_FLUSHINV    0x40108UL
 
-static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
+static int pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
 {
        struct iommu *iommu = pbm->iommu;
        u32 vdma[2], dma_mask;
        u64 control;
-       int tsbsize;
+       int tsbsize, err;
 
        /* No virtual-dma property on these guys, use largest size.  */
        vdma[0] = 0xc0000000; /* base */
@@ -68,7 +68,9 @@ static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
         */
        fire_write(iommu->iommu_flushinv, ~(u64)0);
 
-       pci_iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask);
+       err = iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask);
+       if (err)
+               return err;
 
        fire_write(iommu->iommu_tsbbase, __pa(iommu->page_table) | 0x7UL);
 
@@ -78,6 +80,8 @@ static void pci_fire_pbm_iommu_init(struct pci_pbm_info *pbm)
                    0x00000002 /* Bypass enable */              |
                    0x00000001 /* Translation enable */);
        fire_write(iommu->iommu_control, control);
+
+       return 0;
 }
 
 /* Based at pbm->controller_regs */
@@ -167,8 +171,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)
        fire_write(pbm->pbm_regs + FIRE_PEC_IENAB, ~(u64)0);
 }
 
-static void pci_fire_pbm_init(struct pci_controller_info *p,
-                             struct device_node *dp, u32 portid)
+static int pci_fire_pbm_init(struct pci_controller_info *p,
+                            struct device_node *dp, u32 portid)
 {
        const struct linux_prom64_registers *regs;
        struct pci_pbm_info *pbm;
@@ -203,7 +207,8 @@ static void pci_fire_pbm_init(struct pci_controller_info *p,
        pci_get_pbm_props(pbm);
 
        pci_fire_hw_init(pbm);
-       pci_fire_pbm_iommu_init(pbm);
+
+       return pci_fire_pbm_iommu_init(pbm);
 }
 
 static inline int portid_compare(u32 x, u32 y)
@@ -222,7 +227,8 @@ void fire_pci_init(struct device_node *dp, const char *model_name)
 
        for (pbm = pci_pbm_root; pbm; pbm = pbm->next) {
                if (portid_compare(pbm->portid, portid)) {
-                       pci_fire_pbm_init(pbm->parent, dp, portid);
+                       if (pci_fire_pbm_init(pbm->parent, dp, portid))
+                               goto fatal_memory_error;
                        return;
                }
        }
@@ -250,7 +256,9 @@ void fire_pci_init(struct device_node *dp, const char *model_name)
         */
        pci_memspace_mask = 0x7fffffffUL;
 
-       pci_fire_pbm_init(p, dp, portid);
+       if (pci_fire_pbm_init(p, dp, portid))
+               goto fatal_memory_error;
+
        return;
 
 fatal_memory_error:
index 598393a2df168d1e92910cc9bc2a6866bb933013..b6b4cfea5b5f55bdc7f23e87b1ddd577a8a25f64 100644 (file)
@@ -813,16 +813,19 @@ static void psycho_scan_bus(struct pci_pbm_info *pbm)
        psycho_register_error_handlers(pbm);
 }
 
-static void psycho_iommu_init(struct pci_pbm_info *pbm)
+static int psycho_iommu_init(struct pci_pbm_info *pbm)
 {
        struct iommu *iommu = pbm->iommu;
        unsigned long i;
        u64 control;
+       int err;
 
        /* Register addresses. */
        iommu->iommu_control  = pbm->controller_regs + PSYCHO_IOMMU_CONTROL;
        iommu->iommu_tsbbase  = pbm->controller_regs + PSYCHO_IOMMU_TSBBASE;
        iommu->iommu_flush    = pbm->controller_regs + PSYCHO_IOMMU_FLUSH;
+       iommu->iommu_tags     = iommu->iommu_flush + (0xa580UL - 0x0210UL);
+
        /* PSYCHO's IOMMU lacks ctx flushing. */
        iommu->iommu_ctxflush = 0;
 
@@ -845,7 +848,9 @@ static void psycho_iommu_init(struct pci_pbm_info *pbm)
        /* Leave diag mode enabled for full-flushing done
         * in pci_iommu.c
         */
-       pci_iommu_table_init(iommu, IO_TSB_SIZE, 0xc0000000, 0xffffffff);
+       err = iommu_table_init(iommu, IO_TSB_SIZE, 0xc0000000, 0xffffffff);
+       if (err)
+               return err;
 
        psycho_write(pbm->controller_regs + PSYCHO_IOMMU_TSBBASE,
                     __pa(iommu->page_table));
@@ -858,6 +863,8 @@ static void psycho_iommu_init(struct pci_pbm_info *pbm)
        /* If necessary, hook us up for starfire IRQ translations. */
        if (this_is_starfire)
                starfire_hookup(pbm->portid);
+
+       return 0;
 }
 
 #define PSYCHO_IRQ_RETRY       0x1a00UL
@@ -1031,15 +1038,12 @@ void psycho_init(struct device_node *dp, char *model_name)
        }
 
        p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
-       if (!p) {
-               prom_printf("PSYCHO: Fatal memory allocation error.\n");
-               prom_halt();
-       }
+       if (!p)
+               goto fatal_memory_error;
        iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
-       if (!iommu) {
-               prom_printf("PSYCHO: Fatal memory allocation error.\n");
-               prom_halt();
-       }
+       if (!iommu)
+               goto fatal_memory_error;
+
        p->pbm_A.iommu = p->pbm_B.iommu = iommu;
 
        p->pbm_A.portid = upa_portid;
@@ -1062,8 +1066,14 @@ void psycho_init(struct device_node *dp, char *model_name)
 
        psycho_controller_hwinit(&p->pbm_A);
 
-       psycho_iommu_init(&p->pbm_A);
+       if (psycho_iommu_init(&p->pbm_A))
+               goto fatal_memory_error;
 
        is_pbm_a = ((pr_regs[0].phys_addr & 0x6000) == 0x2000);
        psycho_pbm_init(p, dp, is_pbm_a);
+       return;
+
+fatal_memory_error:
+       prom_printf("PSYCHO: Fatal memory allocation error.\n");
+       prom_halt();
 }
index 22e1be5c7489aaf1420da8fb1c4becf437c2eb49..fba67c3d880928e00d9332e9f1e5099f26d5171b 100644 (file)
@@ -672,18 +672,20 @@ static void sabre_scan_bus(struct pci_pbm_info *pbm)
        sabre_register_error_handlers(pbm);
 }
 
-static void sabre_iommu_init(struct pci_pbm_info *pbm,
-                            int tsbsize, unsigned long dvma_offset,
-                            u32 dma_mask)
+static int sabre_iommu_init(struct pci_pbm_info *pbm,
+                           int tsbsize, unsigned long dvma_offset,
+                           u32 dma_mask)
 {
        struct iommu *iommu = pbm->iommu;
        unsigned long i;
        u64 control;
+       int err;
 
        /* Register addresses. */
        iommu->iommu_control  = pbm->controller_regs + SABRE_IOMMU_CONTROL;
        iommu->iommu_tsbbase  = pbm->controller_regs + SABRE_IOMMU_TSBBASE;
        iommu->iommu_flush    = pbm->controller_regs + SABRE_IOMMU_FLUSH;
+       iommu->iommu_tags     = iommu->iommu_flush + (0xa580UL - 0x0210UL);
        iommu->write_complete_reg = pbm->controller_regs + SABRE_WRSYNC;
        /* Sabre's IOMMU lacks ctx flushing. */
        iommu->iommu_ctxflush = 0;
@@ -701,7 +703,10 @@ static void sabre_iommu_init(struct pci_pbm_info *pbm,
        /* Leave diag mode enabled for full-flushing done
         * in pci_iommu.c
         */
-       pci_iommu_table_init(iommu, tsbsize * 1024 * 8, dvma_offset, dma_mask);
+       err = iommu_table_init(iommu, tsbsize * 1024 * 8,
+                              dvma_offset, dma_mask);
+       if (err)
+               return err;
 
        sabre_write(pbm->controller_regs + SABRE_IOMMU_TSBBASE,
                    __pa(iommu->page_table));
@@ -722,6 +727,8 @@ static void sabre_iommu_init(struct pci_pbm_info *pbm,
                break;
        }
        sabre_write(pbm->controller_regs + SABRE_IOMMU_CONTROL, control);
+
+       return 0;
 }
 
 static void sabre_pbm_init(struct pci_controller_info *p, struct pci_pbm_info *pbm, struct device_node *dp)
@@ -775,16 +782,12 @@ void sabre_init(struct device_node *dp, char *model_name)
        }
 
        p = kzalloc(sizeof(*p), GFP_ATOMIC);
-       if (!p) {
-               prom_printf("SABRE: Error, kmalloc(pci_controller_info) failed.\n");
-               prom_halt();
-       }
+       if (!p)
+               goto fatal_memory_error;
 
        iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC);
-       if (!iommu) {
-               prom_printf("SABRE: Error, kmalloc(pci_iommu) failed.\n");
-               prom_halt();
-       }
+       if (!iommu)
+               goto fatal_memory_error;
        pbm = &p->pbm_A;
        pbm->iommu = iommu;
 
@@ -847,10 +850,16 @@ void sabre_init(struct device_node *dp, char *model_name)
                        prom_halt();
        }
 
-       sabre_iommu_init(pbm, tsbsize, vdma[0], dma_mask);
+       if (sabre_iommu_init(pbm, tsbsize, vdma[0], dma_mask))
+               goto fatal_memory_error;
 
        /*
         * Look for APB underneath.
         */
        sabre_pbm_init(p, pbm, dp);
+       return;
+
+fatal_memory_error:
+       prom_printf("SABRE: Fatal memory allocation error.\n");
+       prom_halt();
 }
index ae76898bbe2b0fcfa239669f31a794eb56191935..3c30bfa1f3a37a9c0d7be4c6a43d7501a5ed26cd 100644 (file)
@@ -1148,14 +1148,14 @@ static void schizo_pbm_strbuf_init(struct pci_pbm_info *pbm)
 #define SCHIZO_IOMMU_FLUSH             (0x00210UL)
 #define SCHIZO_IOMMU_CTXFLUSH          (0x00218UL)
 
-static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
+static int schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
 {
        struct iommu *iommu = pbm->iommu;
        unsigned long i, tagbase, database;
        struct property *prop;
        u32 vdma[2], dma_mask;
+       int tsbsize, err;
        u64 control;
-       int tsbsize;
 
        prop = of_find_property(pbm->prom_node, "virtual-dma", NULL);
        if (prop) {
@@ -1195,6 +1195,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
        iommu->iommu_control  = pbm->pbm_regs + SCHIZO_IOMMU_CONTROL;
        iommu->iommu_tsbbase  = pbm->pbm_regs + SCHIZO_IOMMU_TSBBASE;
        iommu->iommu_flush    = pbm->pbm_regs + SCHIZO_IOMMU_FLUSH;
+       iommu->iommu_tags     = iommu->iommu_flush + (0xa580UL - 0x0210UL);
        iommu->iommu_ctxflush = pbm->pbm_regs + SCHIZO_IOMMU_CTXFLUSH;
 
        /* We use the main control/status register of SCHIZO as the write
@@ -1219,7 +1220,9 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
        /* Leave diag mode enabled for full-flushing done
         * in pci_iommu.c
         */
-       pci_iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask);
+       err = iommu_table_init(iommu, tsbsize * 8 * 1024, vdma[0], dma_mask);
+       if (err)
+               return err;
 
        schizo_write(iommu->iommu_tsbbase, __pa(iommu->page_table));
 
@@ -1236,6 +1239,8 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
 
        control |= SCHIZO_IOMMU_CTRL_ENAB;
        schizo_write(iommu->iommu_control, control);
+
+       return 0;
 }
 
 #define SCHIZO_PCI_IRQ_RETRY   (0x1a00UL)
@@ -1328,14 +1333,14 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)
        }
 }
 
-static void schizo_pbm_init(struct pci_controller_info *p,
-                           struct device_node *dp, u32 portid,
-                           int chip_type)
+static int schizo_pbm_init(struct pci_controller_info *p,
+                          struct device_node *dp, u32 portid,
+                          int chip_type)
 {
        const struct linux_prom64_registers *regs;
        struct pci_pbm_info *pbm;
        const char *chipset_name;
-       int is_pbm_a;
+       int is_pbm_a, err;
 
        switch (chip_type) {
        case PBM_CHIP_TYPE_TOMATILLO:
@@ -1406,8 +1411,13 @@ static void schizo_pbm_init(struct pci_controller_info *p,
 
        pci_get_pbm_props(pbm);
 
-       schizo_pbm_iommu_init(pbm);
+       err = schizo_pbm_iommu_init(pbm);
+       if (err)
+               return err;
+
        schizo_pbm_strbuf_init(pbm);
+
+       return 0;
 }
 
 static inline int portid_compare(u32 x, u32 y, int chip_type)
@@ -1431,34 +1441,38 @@ static void __schizo_init(struct device_node *dp, char *model_name, int chip_typ
 
        for (pbm = pci_pbm_root; pbm; pbm = pbm->next) {
                if (portid_compare(pbm->portid, portid, chip_type)) {
-                       schizo_pbm_init(pbm->parent, dp, portid, chip_type);
+                       if (schizo_pbm_init(pbm->parent, dp,
+                                           portid, chip_type))
+                               goto fatal_memory_error;
                        return;
                }
        }
 
        p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
        if (!p)
-               goto memfail;
+               goto fatal_memory_error;
 
        iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
        if (!iommu)
-               goto memfail;
+               goto fatal_memory_error;
 
        p->pbm_A.iommu = iommu;
 
        iommu = kzalloc(sizeof(struct iommu), GFP_ATOMIC);
        if (!iommu)
-               goto memfail;
+               goto fatal_memory_error;
 
        p->pbm_B.iommu = iommu;
 
        /* Like PSYCHO we have a 2GB aligned area for memory space. */
        pci_memspace_mask = 0x7fffffffUL;
 
-       schizo_pbm_init(p, dp, portid, chip_type);
+       if (schizo_pbm_init(p, dp, portid, chip_type))
+               goto fatal_memory_error;
+
        return;
 
-memfail:
+fatal_memory_error:
        prom_printf("SCHIZO: Fatal memory allocation error.\n");
        prom_halt();
 }
index 639cf06ca37280f3fbe98b97d4f267e23eaaed69..466f4aa8fc82236549567ba47007fa193cf24857 100644 (file)
@@ -33,30 +33,30 @@ static unsigned long vpci_minor = 1;
 #define PGLIST_NENTS   (PAGE_SIZE / sizeof(u64))
 
 struct iommu_batch {
-       struct pci_dev  *pdev;          /* Device mapping is for.       */
+       struct device   *dev;           /* Device mapping is for.       */
        unsigned long   prot;           /* IOMMU page protections       */
        unsigned long   entry;          /* Index into IOTSB.            */
        u64             *pglist;        /* List of physical pages       */
        unsigned long   npages;         /* Number of pages in list.     */
 };
 
-static DEFINE_PER_CPU(struct iommu_batch, pci_iommu_batch);
+static DEFINE_PER_CPU(struct iommu_batch, iommu_batch);
 
 /* Interrupts must be disabled.  */
-static inline void pci_iommu_batch_start(struct pci_dev *pdev, unsigned long prot, unsigned long entry)
+static inline void iommu_batch_start(struct device *dev, unsigned long prot, unsigned long entry)
 {
-       struct iommu_batch *p = &__get_cpu_var(pci_iommu_batch);
+       struct iommu_batch *p = &__get_cpu_var(iommu_batch);
 
-       p->pdev         = pdev;
+       p->dev          = dev;
        p->prot         = prot;
        p->entry        = entry;
        p->npages       = 0;
 }
 
 /* Interrupts must be disabled.  */
-static long pci_iommu_batch_flush(struct iommu_batch *p)
+static long iommu_batch_flush(struct iommu_batch *p)
 {
-       struct pci_pbm_info *pbm = p->pdev->dev.archdata.host_controller;
+       struct pci_pbm_info *pbm = p->dev->archdata.host_controller;
        unsigned long devhandle = pbm->devhandle;
        unsigned long prot = p->prot;
        unsigned long entry = p->entry;
@@ -70,7 +70,7 @@ static long pci_iommu_batch_flush(struct iommu_batch *p)
                                          npages, prot, __pa(pglist));
                if (unlikely(num < 0)) {
                        if (printk_ratelimit())
-                               printk("pci_iommu_batch_flush: IOMMU map of "
+                               printk("iommu_batch_flush: IOMMU map of "
                                       "[%08lx:%08lx:%lx:%lx:%lx] failed with "
                                       "status %ld\n",
                                       devhandle, HV_PCI_TSBID(0, entry),
@@ -90,30 +90,30 @@ static long pci_iommu_batch_flush(struct iommu_batch *p)
 }
 
 /* Interrupts must be disabled.  */
-static inline long pci_iommu_batch_add(u64 phys_page)
+static inline long iommu_batch_add(u64 phys_page)
 {
-       struct iommu_batch *p = &__get_cpu_var(pci_iommu_batch);
+       struct iommu_batch *p = &__get_cpu_var(iommu_batch);
 
        BUG_ON(p->npages >= PGLIST_NENTS);
 
        p->pglist[p->npages++] = phys_page;
        if (p->npages == PGLIST_NENTS)
-               return pci_iommu_batch_flush(p);
+               return iommu_batch_flush(p);
 
        return 0;
 }
 
 /* Interrupts must be disabled.  */
-static inline long pci_iommu_batch_end(void)
+static inline long iommu_batch_end(void)
 {
-       struct iommu_batch *p = &__get_cpu_var(pci_iommu_batch);
+       struct iommu_batch *p = &__get_cpu_var(iommu_batch);
 
        BUG_ON(p->npages >= PGLIST_NENTS);
 
-       return pci_iommu_batch_flush(p);
+       return iommu_batch_flush(p);
 }
 
-static long pci_arena_alloc(struct iommu_arena *arena, unsigned long npages)
+static long arena_alloc(struct iommu_arena *arena, unsigned long npages)
 {
        unsigned long n, i, start, end, limit;
        int pass;
@@ -152,7 +152,8 @@ again:
        return n;
 }
 
-static void pci_arena_free(struct iommu_arena *arena, unsigned long base, unsigned long npages)
+static void arena_free(struct iommu_arena *arena, unsigned long base,
+                      unsigned long npages)
 {
        unsigned long i;
 
@@ -160,7 +161,8 @@ static void pci_arena_free(struct iommu_arena *arena, unsigned long base, unsign
                __clear_bit(i, arena->map);
 }
 
-static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp, gfp_t gfp)
+static void *dma_4v_alloc_coherent(struct device *dev, size_t size,
+                                  dma_addr_t *dma_addrp, gfp_t gfp)
 {
        struct iommu *iommu;
        unsigned long flags, order, first_page, npages, n;
@@ -180,10 +182,10 @@ static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
 
        memset((char *)first_page, 0, PAGE_SIZE << order);
 
-       iommu = pdev->dev.archdata.iommu;
+       iommu = dev->archdata.iommu;
 
        spin_lock_irqsave(&iommu->lock, flags);
-       entry = pci_arena_alloc(&iommu->arena, npages);
+       entry = arena_alloc(&iommu->arena, npages);
        spin_unlock_irqrestore(&iommu->lock, flags);
 
        if (unlikely(entry < 0L))
@@ -196,18 +198,18 @@ static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
 
        local_irq_save(flags);
 
-       pci_iommu_batch_start(pdev,
-                             (HV_PCI_MAP_ATTR_READ |
-                              HV_PCI_MAP_ATTR_WRITE),
-                             entry);
+       iommu_batch_start(dev,
+                         (HV_PCI_MAP_ATTR_READ |
+                          HV_PCI_MAP_ATTR_WRITE),
+                         entry);
 
        for (n = 0; n < npages; n++) {
-               long err = pci_iommu_batch_add(first_page + (n * PAGE_SIZE));
+               long err = iommu_batch_add(first_page + (n * PAGE_SIZE));
                if (unlikely(err < 0L))
                        goto iommu_map_fail;
        }
 
-       if (unlikely(pci_iommu_batch_end() < 0L))
+       if (unlikely(iommu_batch_end() < 0L))
                goto iommu_map_fail;
 
        local_irq_restore(flags);
@@ -217,7 +219,7 @@ static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
 iommu_map_fail:
        /* Interrupts are disabled.  */
        spin_lock(&iommu->lock);
-       pci_arena_free(&iommu->arena, entry, npages);
+       arena_free(&iommu->arena, entry, npages);
        spin_unlock_irqrestore(&iommu->lock, flags);
 
 arena_alloc_fail:
@@ -225,7 +227,8 @@ arena_alloc_fail:
        return NULL;
 }
 
-static void pci_4v_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, dma_addr_t dvma)
+static void dma_4v_free_coherent(struct device *dev, size_t size, void *cpu,
+                                dma_addr_t dvma)
 {
        struct pci_pbm_info *pbm;
        struct iommu *iommu;
@@ -233,14 +236,14 @@ static void pci_4v_free_consistent(struct pci_dev *pdev, size_t size, void *cpu,
        u32 devhandle;
 
        npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT;
-       iommu = pdev->dev.archdata.iommu;
-       pbm = pdev->dev.archdata.host_controller;
+       iommu = dev->archdata.iommu;
+       pbm = dev->archdata.host_controller;
        devhandle = pbm->devhandle;
        entry = ((dvma - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
 
        spin_lock_irqsave(&iommu->lock, flags);
 
-       pci_arena_free(&iommu->arena, entry, npages);
+       arena_free(&iommu->arena, entry, npages);
 
        do {
                unsigned long num;
@@ -258,7 +261,8 @@ static void pci_4v_free_consistent(struct pci_dev *pdev, size_t size, void *cpu,
                free_pages((unsigned long)cpu, order);
 }
 
-static dma_addr_t pci_4v_map_single(struct pci_dev *pdev, void *ptr, size_t sz, int direction)
+static dma_addr_t dma_4v_map_single(struct device *dev, void *ptr, size_t sz,
+                                   enum dma_data_direction direction)
 {
        struct iommu *iommu;
        unsigned long flags, npages, oaddr;
@@ -267,9 +271,9 @@ static dma_addr_t pci_4v_map_single(struct pci_dev *pdev, void *ptr, size_t sz,
        unsigned long prot;
        long entry;
 
-       iommu = pdev->dev.archdata.iommu;
+       iommu = dev->archdata.iommu;
 
-       if (unlikely(direction == PCI_DMA_NONE))
+       if (unlikely(direction == DMA_NONE))
                goto bad;
 
        oaddr = (unsigned long)ptr;
@@ -277,7 +281,7 @@ static dma_addr_t pci_4v_map_single(struct pci_dev *pdev, void *ptr, size_t sz,
        npages >>= IO_PAGE_SHIFT;
 
        spin_lock_irqsave(&iommu->lock, flags);
-       entry = pci_arena_alloc(&iommu->arena, npages);
+       entry = arena_alloc(&iommu->arena, npages);
        spin_unlock_irqrestore(&iommu->lock, flags);
 
        if (unlikely(entry < 0L))
@@ -288,19 +292,19 @@ static dma_addr_t pci_4v_map_single(struct pci_dev *pdev, void *ptr, size_t sz,
        ret = bus_addr | (oaddr & ~IO_PAGE_MASK);
        base_paddr = __pa(oaddr & IO_PAGE_MASK);
        prot = HV_PCI_MAP_ATTR_READ;
-       if (direction != PCI_DMA_TODEVICE)
+       if (direction != DMA_TO_DEVICE)
                prot |= HV_PCI_MAP_ATTR_WRITE;
 
        local_irq_save(flags);
 
-       pci_iommu_batch_start(pdev, prot, entry);
+       iommu_batch_start(dev, prot, entry);
 
        for (i = 0; i < npages; i++, base_paddr += IO_PAGE_SIZE) {
-               long err = pci_iommu_batch_add(base_paddr);
+               long err = iommu_batch_add(base_paddr);
                if (unlikely(err < 0L))
                        goto iommu_map_fail;
        }
-       if (unlikely(pci_iommu_batch_end() < 0L))
+       if (unlikely(iommu_batch_end() < 0L))
                goto iommu_map_fail;
 
        local_irq_restore(flags);
@@ -310,18 +314,19 @@ static dma_addr_t pci_4v_map_single(struct pci_dev *pdev, void *ptr, size_t sz,
 bad:
        if (printk_ratelimit())
                WARN_ON(1);
-       return PCI_DMA_ERROR_CODE;
+       return DMA_ERROR_CODE;
 
 iommu_map_fail:
        /* Interrupts are disabled.  */
        spin_lock(&iommu->lock);
-       pci_arena_free(&iommu->arena, entry, npages);
+       arena_free(&iommu->arena, entry, npages);
        spin_unlock_irqrestore(&iommu->lock, flags);
 
-       return PCI_DMA_ERROR_CODE;
+       return DMA_ERROR_CODE;
 }
 
-static void pci_4v_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction)
+static void dma_4v_unmap_single(struct device *dev, dma_addr_t bus_addr,
+                               size_t sz, enum dma_data_direction direction)
 {
        struct pci_pbm_info *pbm;
        struct iommu *iommu;
@@ -329,14 +334,14 @@ static void pci_4v_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_
        long entry;
        u32 devhandle;
 
-       if (unlikely(direction == PCI_DMA_NONE)) {
+       if (unlikely(direction == DMA_NONE)) {
                if (printk_ratelimit())
                        WARN_ON(1);
                return;
        }
 
-       iommu = pdev->dev.archdata.iommu;
-       pbm = pdev->dev.archdata.host_controller;
+       iommu = dev->archdata.iommu;
+       pbm = dev->archdata.host_controller;
        devhandle = pbm->devhandle;
 
        npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK);
@@ -346,7 +351,7 @@ static void pci_4v_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_
        spin_lock_irqsave(&iommu->lock, flags);
 
        entry = (bus_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT;
-       pci_arena_free(&iommu->arena, entry, npages);
+       arena_free(&iommu->arena, entry, npages);
 
        do {
                unsigned long num;
@@ -363,7 +368,7 @@ static void pci_4v_unmap_single(struct pci_dev *pdev, dma_addr_t bus_addr, size_
 #define SG_ENT_PHYS_ADDRESS(SG)        \
        (__pa(page_address((SG)->page)) + (SG)->offset)
 
-static inline long fill_sg(long entry, struct pci_dev *pdev,
+static inline long fill_sg(long entry, struct device *dev,
                           struct scatterlist *sg,
                           int nused, int nelems, unsigned long prot)
 {
@@ -374,7 +379,7 @@ static inline long fill_sg(long entry, struct pci_dev *pdev,
 
        local_irq_save(flags);
 
-       pci_iommu_batch_start(pdev, prot, entry);
+       iommu_batch_start(dev, prot, entry);
 
        for (i = 0; i < nused; i++) {
                unsigned long pteval = ~0UL;
@@ -415,7 +420,7 @@ static inline long fill_sg(long entry, struct pci_dev *pdev,
                        while (len > 0) {
                                long err;
 
-                               err = pci_iommu_batch_add(pteval);
+                               err = iommu_batch_add(pteval);
                                if (unlikely(err < 0L))
                                        goto iommu_map_failed;
 
@@ -446,7 +451,7 @@ static inline long fill_sg(long entry, struct pci_dev *pdev,
                dma_sg++;
        }
 
-       if (unlikely(pci_iommu_batch_end() < 0L))
+       if (unlikely(iommu_batch_end() < 0L))
                goto iommu_map_failed;
 
        local_irq_restore(flags);
@@ -457,7 +462,8 @@ iommu_map_failed:
        return -1L;
 }
 
-static int pci_4v_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction)
+static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
+                        int nelems, enum dma_data_direction direction)
 {
        struct iommu *iommu;
        unsigned long flags, npages, prot;
@@ -469,18 +475,19 @@ static int pci_4v_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int n
        /* Fast path single entry scatterlists. */
        if (nelems == 1) {
                sglist->dma_address =
-                       pci_4v_map_single(pdev,
-                                         (page_address(sglist->page) + sglist->offset),
+                       dma_4v_map_single(dev,
+                                         (page_address(sglist->page) +
+                                          sglist->offset),
                                          sglist->length, direction);
-               if (unlikely(sglist->dma_address == PCI_DMA_ERROR_CODE))
+               if (unlikely(sglist->dma_address == DMA_ERROR_CODE))
                        return 0;
                sglist->dma_length = sglist->length;
                return 1;
        }
 
-       iommu = pdev->dev.archdata.iommu;
+       iommu = dev->archdata.iommu;
        
-       if (unlikely(direction == PCI_DMA_NONE))
+       if (unlikely(direction == DMA_NONE))
                goto bad;
 
        /* Step 1: Prepare scatter list. */
@@ -488,7 +495,7 @@ static int pci_4v_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int n
 
        /* Step 2: Allocate a cluster and context, if necessary. */
        spin_lock_irqsave(&iommu->lock, flags);
-       entry = pci_arena_alloc(&iommu->arena, npages);
+       entry = arena_alloc(&iommu->arena, npages);
        spin_unlock_irqrestore(&iommu->lock, flags);
 
        if (unlikely(entry < 0L))
@@ -510,10 +517,10 @@ static int pci_4v_map_sg(struct pci_dev *pdev, struct scatterlist *sglist, int n
 
        /* Step 4: Create the mappings. */
        prot = HV_PCI_MAP_ATTR_READ;
-       if (direction != PCI_DMA_TODEVICE)
+       if (direction != DMA_TO_DEVICE)
                prot |= HV_PCI_MAP_ATTR_WRITE;
 
-       err = fill_sg(entry, pdev, sglist, used, nelems, prot);
+       err = fill_sg(entry, dev, sglist, used, nelems, prot);
        if (unlikely(err < 0L))
                goto iommu_map_failed;
 
@@ -526,13 +533,14 @@ bad:
 
 iommu_map_failed:
        spin_lock_irqsave(&iommu->lock, flags);
-       pci_arena_free(&iommu->arena, entry, npages);
+       arena_free(&iommu->arena, entry, npages);
        spin_unlock_irqrestore(&iommu->lock, flags);
 
        return 0;
 }
 
-static void pci_4v_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction)
+static void dma_4v_unmap_sg(struct device *dev, struct scatterlist *sglist,
+                           int nelems, enum dma_data_direction direction)
 {
        struct pci_pbm_info *pbm;
        struct iommu *iommu;
@@ -540,13 +548,13 @@ static void pci_4v_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
        long entry;
        u32 devhandle, bus_addr;
 
-       if (unlikely(direction == PCI_DMA_NONE)) {
+       if (unlikely(direction == DMA_NONE)) {
                if (printk_ratelimit())
                        WARN_ON(1);
        }
 
-       iommu = pdev->dev.archdata.iommu;
-       pbm = pdev->dev.archdata.host_controller;
+       iommu = dev->archdata.iommu;
+       pbm = dev->archdata.host_controller;
        devhandle = pbm->devhandle;
        
        bus_addr = sglist->dma_address & IO_PAGE_MASK;
@@ -562,7 +570,7 @@ static void pci_4v_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
 
        spin_lock_irqsave(&iommu->lock, flags);
 
-       pci_arena_free(&iommu->arena, entry, npages);
+       arena_free(&iommu->arena, entry, npages);
 
        do {
                unsigned long num;
@@ -576,25 +584,29 @@ static void pci_4v_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, in
        spin_unlock_irqrestore(&iommu->lock, flags);
 }
 
-static void pci_4v_dma_sync_single_for_cpu(struct pci_dev *pdev, dma_addr_t bus_addr, size_t sz, int direction)
+static void dma_4v_sync_single_for_cpu(struct device *dev,
+                                      dma_addr_t bus_addr, size_t sz,
+                                      enum dma_data_direction direction)
 {
        /* Nothing to do... */
 }
 
-static void pci_4v_dma_sync_sg_for_cpu(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, int direction)
+static void dma_4v_sync_sg_for_cpu(struct device *dev,
+                                  struct scatterlist *sglist, int nelems,
+                                  enum dma_data_direction direction)
 {
        /* Nothing to do... */
 }
 
-const struct pci_iommu_ops pci_sun4v_iommu_ops = {
-       .alloc_consistent               = pci_4v_alloc_consistent,
-       .free_consistent                = pci_4v_free_consistent,
-       .map_single                     = pci_4v_map_single,
-       .unmap_single                   = pci_4v_unmap_single,
-       .map_sg                         = pci_4v_map_sg,
-       .unmap_sg                       = pci_4v_unmap_sg,
-       .dma_sync_single_for_cpu        = pci_4v_dma_sync_single_for_cpu,
-       .dma_sync_sg_for_cpu            = pci_4v_dma_sync_sg_for_cpu,
+const struct dma_ops sun4v_dma_ops = {
+       .alloc_coherent                 = dma_4v_alloc_coherent,
+       .free_coherent                  = dma_4v_free_coherent,
+       .map_single                     = dma_4v_map_single,
+       .unmap_single                   = dma_4v_unmap_single,
+       .map_sg                         = dma_4v_map_sg,
+       .unmap_sg                       = dma_4v_unmap_sg,
+       .sync_single_for_cpu            = dma_4v_sync_single_for_cpu,
+       .sync_sg_for_cpu                = dma_4v_sync_sg_for_cpu,
 };
 
 static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm)
@@ -1186,6 +1198,8 @@ void __init sun4v_pci_init(struct device_node *dp, char *model_name)
                }
                printk("SUN4V_PCI: Registered hvapi major[%lu] minor[%lu]\n",
                       vpci_major, vpci_minor);
+
+               dma_ops = &sun4v_dma_ops;
        }
 
        prop = of_find_property(dp, "reg", NULL);
@@ -1206,7 +1220,7 @@ void __init sun4v_pci_init(struct device_node *dp, char *model_name)
                if (!page)
                        goto fatal_memory_error;
 
-               per_cpu(pci_iommu_batch, i).pglist = (u64 *) page;
+               per_cpu(iommu_batch, i).pglist = (u64 *) page;
        }
 
        p = kzalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
index fd7899ba1d70bde8edee7211139081fe7bad88f9..ca7cdfd55f72084c901a1dfcc3c35e507422ddf7 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/kernel.h>
 #include <linux/kallsyms.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/stddef.h>
 #include <linux/ptrace.h>
index a1fd9bcc0b872a5485bb6514b9a835cad583ee49..d1fb13ba02b59e75d56a9259e9f188e0784f3d38 100644 (file)
 
 #define MAP_BASE       ((u32)0xc0000000)
 
-struct sbus_info {
-       struct iommu    iommu;
-       struct strbuf   strbuf;
-};
-
 /* Offsets from iommu_regs */
 #define SYSIO_IOMMUREG_BASE    0x2400UL
 #define IOMMU_CONTROL  (0x2400UL - 0x2400UL)   /* IOMMU control register */
@@ -44,19 +39,6 @@ struct sbus_info {
 
 #define IOMMU_DRAM_VALID       (1UL << 30UL)
 
-static void __iommu_flushall(struct iommu *iommu)
-{
-       unsigned long tag;
-       int entry;
-
-       tag = iommu->iommu_control + (IOMMU_TAGDIAG - IOMMU_CONTROL);
-       for (entry = 0; entry < 16; entry++) {
-               upa_writeq(0, tag);
-               tag += 8UL;
-       }
-       upa_readq(iommu->write_complete_reg);
-}
-
 /* Offsets from strbuf_regs */
 #define SYSIO_STRBUFREG_BASE   0x2800UL
 #define STRBUF_CONTROL (0x2800UL - 0x2800UL)   /* Control */
@@ -69,511 +51,10 @@ static void __iommu_flushall(struct iommu *iommu)
 
 #define STRBUF_TAG_VALID       0x02UL
 
-static void sbus_strbuf_flush(struct iommu *iommu, struct strbuf *strbuf, u32 base, unsigned long npages, int direction)
-{
-       unsigned long n;
-       int limit;
-
-       n = npages;
-       while (n--)
-               upa_writeq(base + (n << IO_PAGE_SHIFT), strbuf->strbuf_pflush);
-
-       /* If the device could not have possibly put dirty data into
-        * the streaming cache, no flush-flag synchronization needs
-        * to be performed.
-        */
-       if (direction == SBUS_DMA_TODEVICE)
-               return;
-
-       *(strbuf->strbuf_flushflag) = 0UL;
-
-       /* Whoopee cushion! */
-       upa_writeq(strbuf->strbuf_flushflag_pa, strbuf->strbuf_fsync);
-       upa_readq(iommu->write_complete_reg);
-
-       limit = 100000;
-       while (*(strbuf->strbuf_flushflag) == 0UL) {
-               limit--;
-               if (!limit)
-                       break;
-               udelay(1);
-               rmb();
-       }
-       if (!limit)
-               printk(KERN_WARNING "sbus_strbuf_flush: flushflag timeout "
-                      "vaddr[%08x] npages[%ld]\n",
-                      base, npages);
-}
-
-/* Based largely upon the ppc64 iommu allocator.  */
-static long sbus_arena_alloc(struct iommu *iommu, unsigned long npages)
-{
-       struct iommu_arena *arena = &iommu->arena;
-       unsigned long n, i, start, end, limit;
-       int pass;
-
-       limit = arena->limit;
-       start = arena->hint;
-       pass = 0;
-
-again:
-       n = find_next_zero_bit(arena->map, limit, start);
-       end = n + npages;
-       if (unlikely(end >= limit)) {
-               if (likely(pass < 1)) {
-                       limit = start;
-                       start = 0;
-                       __iommu_flushall(iommu);
-                       pass++;
-                       goto again;
-               } else {
-                       /* Scanned the whole thing, give up. */
-                       return -1;
-               }
-       }
-
-       for (i = n; i < end; i++) {
-               if (test_bit(i, arena->map)) {
-                       start = i + 1;
-                       goto again;
-               }
-       }
-
-       for (i = n; i < end; i++)
-               __set_bit(i, arena->map);
-
-       arena->hint = end;
-
-       return n;
-}
-
-static void sbus_arena_free(struct iommu_arena *arena, unsigned long base, unsigned long npages)
-{
-       unsigned long i;
-
-       for (i = base; i < (base + npages); i++)
-               __clear_bit(i, arena->map);
-}
-
-static void sbus_iommu_table_init(struct iommu *iommu, unsigned int tsbsize)
-{
-       unsigned long tsbbase, order, sz, num_tsb_entries;
-
-       num_tsb_entries = tsbsize / sizeof(iopte_t);
-
-       /* Setup initial software IOMMU state. */
-       spin_lock_init(&iommu->lock);
-       iommu->page_table_map_base = MAP_BASE;
-
-       /* Allocate and initialize the free area map.  */
-       sz = num_tsb_entries / 8;
-       sz = (sz + 7UL) & ~7UL;
-       iommu->arena.map = kzalloc(sz, GFP_KERNEL);
-       if (!iommu->arena.map) {
-               prom_printf("SBUS_IOMMU: Error, kmalloc(arena.map) failed.\n");
-               prom_halt();
-       }
-       iommu->arena.limit = num_tsb_entries;
-
-       /* Now allocate and setup the IOMMU page table itself.  */
-       order = get_order(tsbsize);
-       tsbbase = __get_free_pages(GFP_KERNEL, order);
-       if (!tsbbase) {
-               prom_printf("IOMMU: Error, gfp(tsb) failed.\n");
-               prom_halt();
-       }
-       iommu->page_table = (iopte_t *)tsbbase;
-       memset(iommu->page_table, 0, tsbsize);
-}
-
-static inline iopte_t *alloc_npages(struct iommu *iommu, unsigned long npages)
-{
-       long entry;
-
-       entry = sbus_arena_alloc(iommu, npages);
-       if (unlikely(entry < 0))
-               return NULL;
-
-       return iommu->page_table + entry;
-}
-
-static inline void free_npages(struct iommu *iommu, dma_addr_t base, unsigned long npages)
-{
-       sbus_arena_free(&iommu->arena, base >> IO_PAGE_SHIFT, npages);
-}
-
-void *sbus_alloc_consistent(struct sbus_dev *sdev, size_t size, dma_addr_t *dvma_addr)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       iopte_t *iopte;
-       unsigned long flags, order, first_page;
-       void *ret;
-       int npages;
-
-       size = IO_PAGE_ALIGN(size);
-       order = get_order(size);
-       if (order >= 10)
-               return NULL;
-
-       first_page = __get_free_pages(GFP_KERNEL|__GFP_COMP, order);
-       if (first_page == 0UL)
-               return NULL;
-       memset((char *)first_page, 0, PAGE_SIZE << order);
-
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       iopte = alloc_npages(iommu, size >> IO_PAGE_SHIFT);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-
-       if (unlikely(iopte == NULL)) {
-               free_pages(first_page, order);
-               return NULL;
-       }
-
-       *dvma_addr = (iommu->page_table_map_base +
-                     ((iopte - iommu->page_table) << IO_PAGE_SHIFT));
-       ret = (void *) first_page;
-       npages = size >> IO_PAGE_SHIFT;
-       first_page = __pa(first_page);
-       while (npages--) {
-               iopte_val(*iopte) = (IOPTE_VALID | IOPTE_CACHE |
-                                    IOPTE_WRITE |
-                                    (first_page & IOPTE_PAGE));
-               iopte++;
-               first_page += IO_PAGE_SIZE;
-       }
-
-       return ret;
-}
-
-void sbus_free_consistent(struct sbus_dev *sdev, size_t size, void *cpu, dma_addr_t dvma)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       iopte_t *iopte;
-       unsigned long flags, order, npages;
-
-       npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT;
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-       iopte = iommu->page_table +
-               ((dvma - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
-
-       spin_lock_irqsave(&iommu->lock, flags);
-
-       free_npages(iommu, dvma - iommu->page_table_map_base, npages);
-
-       spin_unlock_irqrestore(&iommu->lock, flags);
-
-       order = get_order(size);
-       if (order < 10)
-               free_pages((unsigned long)cpu, order);
-}
-
-dma_addr_t sbus_map_single(struct sbus_dev *sdev, void *ptr, size_t sz, int direction)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       iopte_t *base;
-       unsigned long flags, npages, oaddr;
-       unsigned long i, base_paddr;
-       u32 bus_addr, ret;
-       unsigned long iopte_protection;
-
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-
-       if (unlikely(direction == SBUS_DMA_NONE))
-               BUG();
-
-       oaddr = (unsigned long)ptr;
-       npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK);
-       npages >>= IO_PAGE_SHIFT;
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       base = alloc_npages(iommu, npages);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-
-       if (unlikely(!base))
-               BUG();
-
-       bus_addr = (iommu->page_table_map_base +
-                   ((base - iommu->page_table) << IO_PAGE_SHIFT));
-       ret = bus_addr | (oaddr & ~IO_PAGE_MASK);
-       base_paddr = __pa(oaddr & IO_PAGE_MASK);
-
-       iopte_protection = IOPTE_VALID | IOPTE_STBUF | IOPTE_CACHE;
-       if (direction != SBUS_DMA_TODEVICE)
-               iopte_protection |= IOPTE_WRITE;
-
-       for (i = 0; i < npages; i++, base++, base_paddr += IO_PAGE_SIZE)
-               iopte_val(*base) = iopte_protection | base_paddr;
-
-       return ret;
-}
-
-void sbus_unmap_single(struct sbus_dev *sdev, dma_addr_t bus_addr, size_t sz, int direction)
-{
-       struct sbus_info *info = sdev->bus->iommu;
-       struct iommu *iommu = &info->iommu;
-       struct strbuf *strbuf = &info->strbuf;
-       iopte_t *base;
-       unsigned long flags, npages, i;
-
-       if (unlikely(direction == SBUS_DMA_NONE))
-               BUG();
-
-       npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK);
-       npages >>= IO_PAGE_SHIFT;
-       base = iommu->page_table +
-               ((bus_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
-
-       bus_addr &= IO_PAGE_MASK;
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       sbus_strbuf_flush(iommu, strbuf, bus_addr, npages, direction);
-       for (i = 0; i < npages; i++)
-               iopte_val(base[i]) = 0UL;
-       free_npages(iommu, bus_addr - iommu->page_table_map_base, npages);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-}
-
-#define SG_ENT_PHYS_ADDRESS(SG)        \
-       (__pa(page_address((SG)->page)) + (SG)->offset)
-
-static inline void fill_sg(iopte_t *iopte, struct scatterlist *sg,
-                          int nused, int nelems, unsigned long iopte_protection)
-{
-       struct scatterlist *dma_sg = sg;
-       struct scatterlist *sg_end = sg + nelems;
-       int i;
-
-       for (i = 0; i < nused; i++) {
-               unsigned long pteval = ~0UL;
-               u32 dma_npages;
-
-               dma_npages = ((dma_sg->dma_address & (IO_PAGE_SIZE - 1UL)) +
-                             dma_sg->dma_length +
-                             ((IO_PAGE_SIZE - 1UL))) >> IO_PAGE_SHIFT;
-               do {
-                       unsigned long offset;
-                       signed int len;
-
-                       /* If we are here, we know we have at least one
-                        * more page to map.  So walk forward until we
-                        * hit a page crossing, and begin creating new
-                        * mappings from that spot.
-                        */
-                       for (;;) {
-                               unsigned long tmp;
-
-                               tmp = SG_ENT_PHYS_ADDRESS(sg);
-                               len = sg->length;
-                               if (((tmp ^ pteval) >> IO_PAGE_SHIFT) != 0UL) {
-                                       pteval = tmp & IO_PAGE_MASK;
-                                       offset = tmp & (IO_PAGE_SIZE - 1UL);
-                                       break;
-                               }
-                               if (((tmp ^ (tmp + len - 1UL)) >> IO_PAGE_SHIFT) != 0UL) {
-                                       pteval = (tmp + IO_PAGE_SIZE) & IO_PAGE_MASK;
-                                       offset = 0UL;
-                                       len -= (IO_PAGE_SIZE - (tmp & (IO_PAGE_SIZE - 1UL)));
-                                       break;
-                               }
-                               sg++;
-                       }
-
-                       pteval = iopte_protection | (pteval & IOPTE_PAGE);
-                       while (len > 0) {
-                               *iopte++ = __iopte(pteval);
-                               pteval += IO_PAGE_SIZE;
-                               len -= (IO_PAGE_SIZE - offset);
-                               offset = 0;
-                               dma_npages--;
-                       }
-
-                       pteval = (pteval & IOPTE_PAGE) + len;
-                       sg++;
-
-                       /* Skip over any tail mappings we've fully mapped,
-                        * adjusting pteval along the way.  Stop when we
-                        * detect a page crossing event.
-                        */
-                       while (sg < sg_end &&
-                              (pteval << (64 - IO_PAGE_SHIFT)) != 0UL &&
-                              (pteval == SG_ENT_PHYS_ADDRESS(sg)) &&
-                              ((pteval ^
-                                (SG_ENT_PHYS_ADDRESS(sg) + sg->length - 1UL)) >> IO_PAGE_SHIFT) == 0UL) {
-                               pteval += sg->length;
-                               sg++;
-                       }
-                       if ((pteval << (64 - IO_PAGE_SHIFT)) == 0UL)
-                               pteval = ~0UL;
-               } while (dma_npages != 0);
-               dma_sg++;
-       }
-}
-
-int sbus_map_sg(struct sbus_dev *sdev, struct scatterlist *sglist, int nelems, int direction)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       unsigned long flags, npages, iopte_protection;
-       iopte_t *base;
-       u32 dma_base;
-       struct scatterlist *sgtmp;
-       int used;
-
-       /* Fast path single entry scatterlists. */
-       if (nelems == 1) {
-               sglist->dma_address =
-                       sbus_map_single(sdev,
-                                       (page_address(sglist->page) + sglist->offset),
-                                       sglist->length, direction);
-               sglist->dma_length = sglist->length;
-               return 1;
-       }
-
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-
-       if (unlikely(direction == SBUS_DMA_NONE))
-               BUG();
-
-       npages = prepare_sg(sglist, nelems);
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       base = alloc_npages(iommu, npages);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-
-       if (unlikely(base == NULL))
-               BUG();
-
-       dma_base = iommu->page_table_map_base +
-               ((base - iommu->page_table) << IO_PAGE_SHIFT);
-
-       /* Normalize DVMA addresses. */
-       used = nelems;
-
-       sgtmp = sglist;
-       while (used && sgtmp->dma_length) {
-               sgtmp->dma_address += dma_base;
-               sgtmp++;
-               used--;
-       }
-       used = nelems - used;
-
-       iopte_protection = IOPTE_VALID | IOPTE_STBUF | IOPTE_CACHE;
-       if (direction != SBUS_DMA_TODEVICE)
-               iopte_protection |= IOPTE_WRITE;
-
-       fill_sg(base, sglist, used, nelems, iopte_protection);
-
-#ifdef VERIFY_SG
-       verify_sglist(sglist, nelems, base, npages);
-#endif
-
-       return used;
-}
-
-void sbus_unmap_sg(struct sbus_dev *sdev, struct scatterlist *sglist, int nelems, int direction)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       struct strbuf *strbuf;
-       iopte_t *base;
-       unsigned long flags, i, npages;
-       u32 bus_addr;
-
-       if (unlikely(direction == SBUS_DMA_NONE))
-               BUG();
-
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-       strbuf = &info->strbuf;
-
-       bus_addr = sglist->dma_address & IO_PAGE_MASK;
-
-       for (i = 1; i < nelems; i++)
-               if (sglist[i].dma_length == 0)
-                       break;
-       i--;
-       npages = (IO_PAGE_ALIGN(sglist[i].dma_address + sglist[i].dma_length) -
-                 bus_addr) >> IO_PAGE_SHIFT;
-
-       base = iommu->page_table +
-               ((bus_addr - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       sbus_strbuf_flush(iommu, strbuf, bus_addr, npages, direction);
-       for (i = 0; i < npages; i++)
-               iopte_val(base[i]) = 0UL;
-       free_npages(iommu, bus_addr - iommu->page_table_map_base, npages);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-}
-
-void sbus_dma_sync_single_for_cpu(struct sbus_dev *sdev, dma_addr_t bus_addr, size_t sz, int direction)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       struct strbuf *strbuf;
-       unsigned long flags, npages;
-
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-       strbuf = &info->strbuf;
-
-       npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK);
-       npages >>= IO_PAGE_SHIFT;
-       bus_addr &= IO_PAGE_MASK;
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       sbus_strbuf_flush(iommu, strbuf, bus_addr, npages, direction);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-}
-
-void sbus_dma_sync_single_for_device(struct sbus_dev *sdev, dma_addr_t base, size_t size, int direction)
-{
-}
-
-void sbus_dma_sync_sg_for_cpu(struct sbus_dev *sdev, struct scatterlist *sglist, int nelems, int direction)
-{
-       struct sbus_info *info;
-       struct iommu *iommu;
-       struct strbuf *strbuf;
-       unsigned long flags, npages, i;
-       u32 bus_addr;
-
-       info = sdev->bus->iommu;
-       iommu = &info->iommu;
-       strbuf = &info->strbuf;
-
-       bus_addr = sglist[0].dma_address & IO_PAGE_MASK;
-       for (i = 0; i < nelems; i++) {
-               if (!sglist[i].dma_length)
-                       break;
-       }
-       i--;
-       npages = (IO_PAGE_ALIGN(sglist[i].dma_address + sglist[i].dma_length)
-                 - bus_addr) >> IO_PAGE_SHIFT;
-
-       spin_lock_irqsave(&iommu->lock, flags);
-       sbus_strbuf_flush(iommu, strbuf, bus_addr, npages, direction);
-       spin_unlock_irqrestore(&iommu->lock, flags);
-}
-
-void sbus_dma_sync_sg_for_device(struct sbus_dev *sdev, struct scatterlist *sg, int nents, int direction)
-{
-}
-
 /* Enable 64-bit DVMA mode for the given device. */
 void sbus_set_sbus64(struct sbus_dev *sdev, int bursts)
 {
-       struct sbus_info *info = sdev->bus->iommu;
-       struct iommu *iommu = &info->iommu;
+       struct iommu *iommu = sdev->ofdev.dev.archdata.iommu;
        int slot = sdev->slot;
        unsigned long cfg_reg;
        u64 val;
@@ -713,8 +194,7 @@ static unsigned long sysio_imap_to_iclr(unsigned long imap)
 unsigned int sbus_build_irq(void *buscookie, unsigned int ino)
 {
        struct sbus_bus *sbus = (struct sbus_bus *)buscookie;
-       struct sbus_info *info = sbus->iommu;
-       struct iommu *iommu = &info->iommu;
+       struct iommu *iommu = sbus->ofdev.dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
        unsigned long imap, iclr;
        int sbus_level = 0;
@@ -776,8 +256,7 @@ unsigned int sbus_build_irq(void *buscookie, unsigned int ino)
 static irqreturn_t sysio_ue_handler(int irq, void *dev_id)
 {
        struct sbus_bus *sbus = dev_id;
-       struct sbus_info *info = sbus->iommu;
-       struct iommu *iommu = &info->iommu;
+       struct iommu *iommu = sbus->ofdev.dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
        unsigned long afsr_reg, afar_reg;
        unsigned long afsr, afar, error_bits;
@@ -849,8 +328,7 @@ static irqreturn_t sysio_ue_handler(int irq, void *dev_id)
 static irqreturn_t sysio_ce_handler(int irq, void *dev_id)
 {
        struct sbus_bus *sbus = dev_id;
-       struct sbus_info *info = sbus->iommu;
-       struct iommu *iommu = &info->iommu;
+       struct iommu *iommu = sbus->ofdev.dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
        unsigned long afsr_reg, afar_reg;
        unsigned long afsr, afar, error_bits;
@@ -927,8 +405,7 @@ static irqreturn_t sysio_ce_handler(int irq, void *dev_id)
 static irqreturn_t sysio_sbus_error_handler(int irq, void *dev_id)
 {
        struct sbus_bus *sbus = dev_id;
-       struct sbus_info *info = sbus->iommu;
-       struct iommu *iommu = &info->iommu;
+       struct iommu *iommu = sbus->ofdev.dev.archdata.iommu;
        unsigned long afsr_reg, afar_reg, reg_base;
        unsigned long afsr, afar, error_bits;
        int reported;
@@ -995,8 +472,7 @@ static irqreturn_t sysio_sbus_error_handler(int irq, void *dev_id)
 
 static void __init sysio_register_error_handlers(struct sbus_bus *sbus)
 {
-       struct sbus_info *info = sbus->iommu;
-       struct iommu *iommu = &info->iommu;
+       struct iommu *iommu = sbus->ofdev.dev.archdata.iommu;
        unsigned long reg_base = iommu->write_complete_reg - 0x2000UL;
        unsigned int irq;
        u64 control;
@@ -1041,7 +517,6 @@ static void __init sbus_iommu_init(int __node, struct sbus_bus *sbus)
 {
        const struct linux_prom64_registers *pr;
        struct device_node *dp;
-       struct sbus_info *info;
        struct iommu *iommu;
        struct strbuf *strbuf;
        unsigned long regs, reg_base;
@@ -1054,25 +529,28 @@ static void __init sbus_iommu_init(int __node, struct sbus_bus *sbus)
 
        pr = of_get_property(dp, "reg", NULL);
        if (!pr) {
-               prom_printf("sbus_iommu_init: Cannot map SYSIO control registers.\n");
+               prom_printf("sbus_iommu_init: Cannot map SYSIO "
+                           "control registers.\n");
                prom_halt();
        }
        regs = pr->phys_addr;
 
-       info = kzalloc(sizeof(*info), GFP_ATOMIC);
-       if (info == NULL) {
-               prom_printf("sbus_iommu_init: Fatal error, "
-                           "kmalloc(info) failed\n");
-               prom_halt();
-       }
+       iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC);
+       if (!iommu)
+               goto fatal_memory_error;
+       strbuf = kzalloc(sizeof(*strbuf), GFP_ATOMIC);
+       if (!strbuf)
+               goto fatal_memory_error;
 
-       iommu = &info->iommu;
-       strbuf = &info->strbuf;
+       sbus->ofdev.dev.archdata.iommu = iommu;
+       sbus->ofdev.dev.archdata.stc = strbuf;
 
        reg_base = regs + SYSIO_IOMMUREG_BASE;
        iommu->iommu_control = reg_base + IOMMU_CONTROL;
        iommu->iommu_tsbbase = reg_base + IOMMU_TSBBASE;
        iommu->iommu_flush = reg_base + IOMMU_FLUSH;
+       iommu->iommu_tags = iommu->iommu_control +
+               (IOMMU_TAGDIAG - IOMMU_CONTROL);
 
        reg_base = regs + SYSIO_STRBUFREG_BASE;
        strbuf->strbuf_control = reg_base + STRBUF_CONTROL;
@@ -1093,14 +571,12 @@ static void __init sbus_iommu_init(int __node, struct sbus_bus *sbus)
         */
        iommu->write_complete_reg = regs + 0x2000UL;
 
-       /* Link into SYSIO software state. */
-       sbus->iommu = info;
-
        printk("SYSIO: UPA portID %x, at %016lx\n",
               sbus->portid, regs);
 
        /* Setup for TSB_SIZE=7, TBW_SIZE=0, MMU_DE=1, MMU_EN=1 */
-       sbus_iommu_table_init(iommu, IO_TSB_SIZE);
+       if (iommu_table_init(iommu, IO_TSB_SIZE, MAP_BASE, 0xffffffff))
+               goto fatal_memory_error;
 
        control = upa_readq(iommu->iommu_control);
        control = ((7UL << 16UL)        |
@@ -1157,6 +633,10 @@ static void __init sbus_iommu_init(int __node, struct sbus_bus *sbus)
                starfire_hookup(sbus->portid);
 
        sysio_register_error_handlers(sbus);
+       return;
+
+fatal_memory_error:
+       prom_printf("sbus_iommu_init: Fatal memory allocation error.\n");
 }
 
 void sbus_fill_device_irq(struct sbus_dev *sdev)
index 49063ca2efcdf53bfa6932185cc870a40948b02c..69cad1b653c14f55a57a2ec5ad0a5e2abf5ad801 100644 (file)
@@ -1460,6 +1460,74 @@ static int cmos_set_rtc_time(struct rtc_time *rtc_tm)
 }
 #endif /* CONFIG_PCI */
 
+static void mostek_get_rtc_time(struct rtc_time *rtc_tm)
+{
+       void __iomem *regs = mstk48t02_regs;
+       u8 tmp;
+
+       spin_lock_irq(&mostek_lock);
+
+       tmp = mostek_read(regs + MOSTEK_CREG);
+       tmp |= MSTK_CREG_READ;
+       mostek_write(regs + MOSTEK_CREG, tmp);
+
+       rtc_tm->tm_sec = MSTK_REG_SEC(regs);
+       rtc_tm->tm_min = MSTK_REG_MIN(regs);
+       rtc_tm->tm_hour = MSTK_REG_HOUR(regs);
+       rtc_tm->tm_mday = MSTK_REG_DOM(regs);
+       rtc_tm->tm_mon = MSTK_REG_MONTH(regs);
+       rtc_tm->tm_year = MSTK_CVT_YEAR( MSTK_REG_YEAR(regs) );
+       rtc_tm->tm_wday = MSTK_REG_DOW(regs);
+
+       tmp = mostek_read(regs + MOSTEK_CREG);
+       tmp &= ~MSTK_CREG_READ;
+       mostek_write(regs + MOSTEK_CREG, tmp);
+
+       spin_unlock_irq(&mostek_lock);
+
+       rtc_tm->tm_mon--;
+       rtc_tm->tm_wday--;
+       rtc_tm->tm_year -= 1900;
+}
+
+static int mostek_set_rtc_time(struct rtc_time *rtc_tm)
+{
+       unsigned char mon, day, hrs, min, sec, wday;
+       void __iomem *regs = mstk48t02_regs;
+       unsigned int yrs;
+       u8 tmp;
+
+       yrs = rtc_tm->tm_year + 1900;
+       mon = rtc_tm->tm_mon + 1;
+       day = rtc_tm->tm_mday;
+       wday = rtc_tm->tm_wday + 1;
+       hrs = rtc_tm->tm_hour;
+       min = rtc_tm->tm_min;
+       sec = rtc_tm->tm_sec;
+
+       spin_lock_irq(&mostek_lock);
+
+       tmp = mostek_read(regs + MOSTEK_CREG);
+       tmp |= MSTK_CREG_WRITE;
+       mostek_write(regs + MOSTEK_CREG, tmp);
+
+       MSTK_SET_REG_SEC(regs, sec);
+       MSTK_SET_REG_MIN(regs, min);
+       MSTK_SET_REG_HOUR(regs, hrs);
+       MSTK_SET_REG_DOW(regs, wday);
+       MSTK_SET_REG_DOM(regs, day);
+       MSTK_SET_REG_MONTH(regs, mon);
+       MSTK_SET_REG_YEAR(regs, yrs - MSTK_YEAR_ZERO);
+
+       tmp = mostek_read(regs + MOSTEK_CREG);
+       tmp &= ~MSTK_CREG_WRITE;
+       mostek_write(regs + MOSTEK_CREG, tmp);
+
+       spin_unlock_irq(&mostek_lock);
+
+       return 0;
+}
+
 struct mini_rtc_ops {
        void (*get_rtc_time)(struct rtc_time *);
        int (*set_rtc_time)(struct rtc_time *);
@@ -1487,6 +1555,11 @@ static struct mini_rtc_ops cmos_rtc_ops = {
 };
 #endif /* CONFIG_PCI */
 
+static struct mini_rtc_ops mostek_rtc_ops = {
+       .get_rtc_time = mostek_get_rtc_time,
+       .set_rtc_time = mostek_set_rtc_time,
+};
+
 static struct mini_rtc_ops *mini_rtc_ops;
 
 static inline void mini_get_rtc_time(struct rtc_time *time)
@@ -1615,6 +1688,8 @@ static int __init rtc_mini_init(void)
        else if (ds1287_regs)
                mini_rtc_ops = &cmos_rtc_ops;
 #endif /* CONFIG_PCI */
+       else if (mstk48t02_regs)
+               mini_rtc_ops = &mostek_rtc_ops;
        else
                return -ENODEV;
 
index 6ef2d299fb10c4527687d323f89154c4dbce9f4d..6ef42b8e53d84dff82b67797d81764f0d9d1a359 100644 (file)
@@ -2134,12 +2134,20 @@ static void user_instruction_dump (unsigned int __user *pc)
 void show_stack(struct task_struct *tsk, unsigned long *_ksp)
 {
        unsigned long pc, fp, thread_base, ksp;
-       void *tp = task_stack_page(tsk);
+       struct thread_info *tp;
        struct reg_window *rw;
        int count = 0;
 
        ksp = (unsigned long) _ksp;
-
+       if (!tsk)
+               tsk = current;
+       tp = task_thread_info(tsk);
+       if (ksp == 0UL) {
+               if (tsk == current)
+                       asm("mov %%fp, %0" : "=r" (ksp));
+               else
+                       ksp = tp->ksp;
+       }
        if (tp == current_thread_info())
                flushw_all();
 
@@ -2168,11 +2176,7 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp)
 
 void dump_stack(void)
 {
-       unsigned long *ksp;
-
-       __asm__ __volatile__("mov       %%fp, %0"
-                            : "=r" (ksp));
-       show_stack(current, ksp);
+       show_stack(current, NULL);
 }
 
 EXPORT_SYMBOL(dump_stack);
index 17123e9ecf78dcdb8547f6dc51b9be8900a59bca..9f7740eee8d2957eeaf6170648f390a08e8a4268 100644 (file)
@@ -112,15 +112,12 @@ static void __kprobes unhandled_fault(unsigned long address,
 
 static void bad_kernel_pc(struct pt_regs *regs, unsigned long vaddr)
 {
-       unsigned long *ksp;
-
        printk(KERN_CRIT "OOPS: Bogus kernel PC [%016lx] in fault handler\n",
               regs->tpc);
        printk(KERN_CRIT "OOPS: RPC [%016lx]\n", regs->u_regs[15]);
        print_symbol("RPC: <%s>\n", regs->u_regs[15]);
        printk(KERN_CRIT "OOPS: Fault was to vaddr[%lx]\n", vaddr);
-       __asm__("mov %%sp, %0" : "=r" (ksp));
-       show_stack(current, ksp);
+       dump_stack();
        unhandled_fault(regs->tpc, current, regs);
 }
 
index e41a08f04694ab74b531d31f0c9b50fb0249a3f5..867666a023397182c26f3b1f7e011f589acacba1 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/init.h> 
 #include <linux/module.h>
 #include <linux/mm.h> 
+#include <linux/fs.h>
 #include <linux/miscdevice.h>
 #include <asm/uaccess.h>
 #include "mem_user.h"
index 356e50f5aaed4c6567e8780adbba06f80494e2a2..ce6828fd396f3d65147064a8a97ef71c261b6a89 100644 (file)
@@ -6,6 +6,7 @@
 #include "linux/slab.h"
 #include "linux/smp_lock.h"
 #include "linux/ptrace.h"
+#include "linux/fs.h"
 #include "asm/ptrace.h"
 #include "asm/pgtable.h"
 #include "asm/tlbflush.h"
index d4f1d1ab252ba0757e47499db066bdb09cbf62bc..cba516e6c99a279683317045c1392b6315b5492c 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include "linux/mm.h"
+#include "linux/fs.h"
 #include "linux/module.h"
 #include "linux/sched.h"
 #include "linux/init_task.h"
index 237c4eab7cfd6c429a6ca8831a6a681671a3ddd6..7b3b67333ff31c2b4c418308b7cec9ff36b9d951 100644 (file)
@@ -7,6 +7,7 @@
 #include "linux/file.h"
 #include "linux/smp_lock.h"
 #include "linux/mm.h"
+#include "linux/fs.h"
 #include "linux/utsname.h"
 #include "linux/msg.h"
 #include "linux/shm.h"
index b7c4cd04bfc3c08d5711e3215d476ad3e629e272..e64f65c9d901903e67d0a487a319a76e98176c6f 100644 (file)
@@ -199,7 +199,7 @@ CONFIG_GENERIC_PENDING_IRQ=y
 CONFIG_PM=y
 # CONFIG_PM_LEGACY is not set
 # CONFIG_PM_DEBUG is not set
-CONFIG_SOFTWARE_SUSPEND=y
+CONFIG_HIBERNATION=y
 CONFIG_PM_STD_PARTITION=""
 CONFIG_SUSPEND_SMP=y
 
index 4de3a54318f4d6d4f3636144393ee7c88d13fea4..4a233ad6269cce1f2e7408af2137f9e8e92ba39a 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/syscalls.h>
 #include <linux/unistd.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/ptrace.h>
 #include <asm/ptrace.h>
 #include <asm/compat.h>
index 47f1dc30bf565625c86d96ff4862e685f2a72615..d1d18c1ea0f4fcc649d842cc072d8200d8ac33a4 100644 (file)
@@ -26,7 +26,7 @@ obj-y                         += io_apic.o mpparse.o genapic.o genapic_flat.o
 obj-$(CONFIG_KEXEC)            += machine_kexec.o relocate_kernel.o crash.o
 obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
 obj-$(CONFIG_PM)               += suspend.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend_asm.o
+obj-$(CONFIG_HIBERNATION)      += suspend_asm.o
 obj-$(CONFIG_CPU_FREQ)         += cpufreq/
 obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o
 obj-$(CONFIG_IOMMU)            += pci-gart.o aperture.o
index 17595d23fee7be9c3e873ce9095d71fe0efa9a04..080b9963f1bc1a6f0213a8a59b7ef8898f6d829c 100644 (file)
@@ -1,6 +1,6 @@
 obj-y                  := boot.o
 boot-y                 := ../../../i386/kernel/acpi/boot.o
-obj-y                  += sleep.o wakeup.o
+obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wakeup.o
 
 ifneq ($(CONFIG_ACPI_PROCESSOR),)
 obj-y                  += processor.o
index 3a16e417dd8dae1fc448043386041d9e211aca0c..e89abcdbdde8172e25d6dff0ddb8323471495c66 100644 (file)
@@ -120,7 +120,7 @@ ident_complete:
        addq    %rbp, trampoline_level4_pgt + 0(%rip)
        addq    %rbp, trampoline_level4_pgt + (511*8)(%rip)
 #endif
-#ifdef CONFIG_ACPI
+#ifdef CONFIG_ACPI_SLEEP
        addq    %rbp, wakeup_level4_pgt + 0(%rip)
        addq    %rbp, wakeup_level4_pgt + (511*8)(%rip)
 #endif
index e7ac629d4c4654ec97ddc387fc5ba71c0892e92a..2842f50cbe3fde220dfc33a61b720720aa7a7e7f 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/elfcore.h>
 #include <linux/smp.h>
 #include <linux/slab.h>
index 0f400f3c469494894b37d68f7d2badf44a246e97..af838f6b0b7fc9b7e3ed4de0ab12992e48cf9f18 100644 (file)
@@ -333,7 +333,7 @@ void __init setup_arch(char **cmdline_p)
        reserve_bootmem_generic(SMP_TRAMPOLINE_BASE, 2*PAGE_SIZE);
 #endif
 
-#ifdef CONFIG_ACPI
+#ifdef CONFIG_ACPI_SLEEP
        /*
         * Reserve low memory region for sleep support.
         */
index ea83a9f91965d3217d1f9346fefa45679f69d62a..573c0a6e0ac636e29a1da03ae608094200f499f5 100644 (file)
@@ -146,7 +146,7 @@ void fix_processor_context(void)
 
 }
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
 /* Defined in arch/x86_64/kernel/suspend_asm.S */
 extern int restore_image(void);
 
@@ -236,4 +236,4 @@ int pfn_is_nosave(unsigned long pfn)
        unsigned long nosave_end_pfn = PAGE_ALIGN(__pa_symbol(&__nosave_end)) >> PAGE_SHIFT;
        return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
 }
-#endif /* CONFIG_SOFTWARE_SUSPEND */
+#endif /* CONFIG_HIBERNATION */
index d067d9a2ad27bd27cf2fdc108bd64de77c26a8a6..4770b7a2052cf22774d09d06efd7dadf74d34df8 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/sched.h>
 #include <linux/syscalls.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/smp.h>
 #include <linux/sem.h>
 #include <linux/msg.h>
index d4cb83a6c0662fd3e48969c69031343384926be4..ff9333e5fb083af76a77a5707b1a0661ae76e1ff 100644 (file)
@@ -4,6 +4,7 @@
  * Subject to the GPL, v.2
  */
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/random.h>
index ca2ef4e08497f21a8f5f542031839f3e63e18b48..2484e0e9d89c9127c0678052b18bfa879b8a827d 100644 (file)
@@ -49,8 +49,6 @@ config LSF
 
          If unsure, say Y.
 
-endif # BLOCK
-
 config BLK_DEV_BSG
        bool "Block layer SG support v4 (EXPERIMENTAL)"
        depends on EXPERIMENTAL
@@ -64,4 +62,6 @@ config BLK_DEV_BSG
        protocols (e.g. Task Management Functions and SMP in Serial
        Attached SCSI).
 
+endif # BLOCK
+
 source block/Kconfig.iosched
index 20c3e22587b50f390a739176c6f2174de5b358e3..20fa034ea4a219d2906cdb27680c039beffa9f85 100644 (file)
@@ -41,7 +41,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
                const int cpu = smp_processor_id();
 
                t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
-               t->time = sched_clock() - per_cpu(blk_trace_cpu_offset, cpu);
+               t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
                t->device = bt->dev;
                t->action = action;
                t->pid = pid;
@@ -159,7 +159,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
 
                t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
                t->sequence = ++(*sequence);
-               t->time = sched_clock() - per_cpu(blk_trace_cpu_offset, cpu);
+               t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
                t->sector = sector;
                t->bytes = bytes;
                t->action = what;
@@ -488,17 +488,17 @@ void blk_trace_shutdown(struct request_queue *q)
 }
 
 /*
- * Average offset over two calls to sched_clock() with a gettimeofday()
+ * Average offset over two calls to cpu_clock() with a gettimeofday()
  * in the middle
  */
-static void blk_check_time(unsigned long long *t)
+static void blk_check_time(unsigned long long *t, int this_cpu)
 {
        unsigned long long a, b;
        struct timeval tv;
 
-       a = sched_clock();
+       a = cpu_clock(this_cpu);
        do_gettimeofday(&tv);
-       b = sched_clock();
+       b = cpu_clock(this_cpu);
 
        *t = tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
        *t -= (a + b) / 2;
@@ -510,16 +510,16 @@ static void blk_check_time(unsigned long long *t)
 static void blk_trace_check_cpu_time(void *data)
 {
        unsigned long long *t;
-       int cpu = get_cpu();
+       int this_cpu = get_cpu();
 
-       t = &per_cpu(blk_trace_cpu_offset, cpu);
+       t = &per_cpu(blk_trace_cpu_offset, this_cpu);
 
        /*
         * Just call it twice, hopefully the second call will be cache hot
         * and a little more precise
         */
-       blk_check_time(t);
-       blk_check_time(t);
+       blk_check_time(t, this_cpu);
+       blk_check_time(t, this_cpu);
 
        put_cpu();
 }
index 3b2f05258a9278d1b51b4b842e4da5784aa4eaed..d60eee54940554f9c168c22c7a722900be84595b 100644 (file)
@@ -9,13 +9,6 @@
  *  archive for more details.
  *
  */
-/*
- * TODO
- *     - Should this get merged, block/scsi_ioctl.c will be migrated into
- *       this file. To keep maintenance down, it's easier to have them
- *       seperated right now.
- *
- */
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/file.h>
@@ -24,6 +17,7 @@
 #include <linux/cdev.h>
 #include <linux/percpu.h>
 #include <linux/uio.h>
+#include <linux/idr.h>
 #include <linux/bsg.h>
 
 #include <scsi/scsi.h>
@@ -70,13 +64,12 @@ enum {
 #endif
 
 static DEFINE_MUTEX(bsg_mutex);
-static int bsg_device_nr, bsg_minor_idx;
+static DEFINE_IDR(bsg_minor_idr);
 
 #define BSG_LIST_ARRAY_SIZE    8
 static struct hlist_head bsg_device_list[BSG_LIST_ARRAY_SIZE];
 
 static struct class *bsg_class;
-static LIST_HEAD(bsg_class_list);
 static int bsg_major;
 
 static struct kmem_cache *bsg_cmd_cachep;
@@ -92,7 +85,6 @@ struct bsg_command {
        struct bio *bidi_bio;
        int err;
        struct sg_io_v4 hdr;
-       struct sg_io_v4 __user *uhdr;
        char sense[SCSI_SENSE_BUFFERSIZE];
 };
 
@@ -620,7 +612,6 @@ static int __bsg_write(struct bsg_device *bd, const char __user *buf,
                        break;
                }
 
-               bc->uhdr = (struct sg_io_v4 __user *) buf;
                if (copy_from_user(&bc->hdr, buf, sizeof(bc->hdr))) {
                        ret = -EFAULT;
                        break;
@@ -781,23 +772,18 @@ static struct bsg_device *__bsg_get_device(int minor)
 
 static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file)
 {
-       struct bsg_device *bd = __bsg_get_device(iminor(inode));
-       struct bsg_class_device *bcd, *__bcd;
+       struct bsg_device *bd;
+       struct bsg_class_device *bcd;
 
+       bd = __bsg_get_device(iminor(inode));
        if (bd)
                return bd;
 
        /*
         * find the class device
         */
-       bcd = NULL;
        mutex_lock(&bsg_mutex);
-       list_for_each_entry(__bcd, &bsg_class_list, list) {
-               if (__bcd->minor == iminor(inode)) {
-                       bcd = __bcd;
-                       break;
-               }
-       }
+       bcd = idr_find(&bsg_minor_idr, iminor(inode));
        mutex_unlock(&bsg_mutex);
 
        if (!bcd)
@@ -936,13 +922,12 @@ void bsg_unregister_queue(struct request_queue *q)
                return;
 
        mutex_lock(&bsg_mutex);
+       idr_remove(&bsg_minor_idr, bcd->minor);
        sysfs_remove_link(&q->kobj, "bsg");
        class_device_unregister(bcd->class_dev);
        put_device(bcd->dev);
        bcd->class_dev = NULL;
        bcd->dev = NULL;
-       list_del_init(&bcd->list);
-       bsg_device_nr--;
        mutex_unlock(&bsg_mutex);
 }
 EXPORT_SYMBOL_GPL(bsg_unregister_queue);
@@ -950,9 +935,9 @@ EXPORT_SYMBOL_GPL(bsg_unregister_queue);
 int bsg_register_queue(struct request_queue *q, struct device *gdev,
                       const char *name)
 {
-       struct bsg_class_device *bcd, *__bcd;
+       struct bsg_class_device *bcd;
        dev_t dev;
-       int ret = -EMFILE;
+       int ret, minor;
        struct class_device *class_dev = NULL;
        const char *devname;
 
@@ -969,28 +954,26 @@ int bsg_register_queue(struct request_queue *q, struct device *gdev,
 
        bcd = &q->bsg_dev;
        memset(bcd, 0, sizeof(*bcd));
-       INIT_LIST_HEAD(&bcd->list);
 
        mutex_lock(&bsg_mutex);
-       if (bsg_device_nr == BSG_MAX_DEVS) {
-               printk(KERN_ERR "bsg: too many bsg devices\n");
-               goto err;
-       }
 
-retry:
-       list_for_each_entry(__bcd, &bsg_class_list, list) {
-               if (__bcd->minor == bsg_minor_idx) {
-                       bsg_minor_idx++;
-                       if (bsg_minor_idx == BSG_MAX_DEVS)
-                               bsg_minor_idx = 0;
-                       goto retry;
-               }
+       ret = idr_pre_get(&bsg_minor_idr, GFP_KERNEL);
+       if (!ret) {
+               ret = -ENOMEM;
+               goto unlock;
        }
 
-       bcd->minor = bsg_minor_idx++;
-       if (bsg_minor_idx == BSG_MAX_DEVS)
-               bsg_minor_idx = 0;
+       ret = idr_get_new(&bsg_minor_idr, bcd, &minor);
+       if (ret < 0)
+               goto unlock;
 
+       if (minor >= BSG_MAX_DEVS) {
+               printk(KERN_ERR "bsg: too many bsg devices\n");
+               ret = -EINVAL;
+               goto remove_idr;
+       }
+
+       bcd->minor = minor;
        bcd->queue = q;
        bcd->dev = get_device(gdev);
        dev = MKDEV(bsg_major, bcd->minor);
@@ -998,27 +981,26 @@ retry:
                                        devname);
        if (IS_ERR(class_dev)) {
                ret = PTR_ERR(class_dev);
-               goto err_put;
+               goto put_dev;
        }
        bcd->class_dev = class_dev;
 
        if (q->kobj.sd) {
                ret = sysfs_create_link(&q->kobj, &bcd->class_dev->kobj, "bsg");
                if (ret)
-                       goto err_unregister;
+                       goto unregister_class_dev;
        }
 
-       list_add_tail(&bcd->list, &bsg_class_list);
-       bsg_device_nr++;
-
        mutex_unlock(&bsg_mutex);
        return 0;
 
-err_unregister:
+unregister_class_dev:
        class_device_unregister(class_dev);
-err_put:
+put_dev:
        put_device(gdev);
-err:
+remove_idr:
+       idr_remove(&bsg_minor_idr, minor);
+unlock:
        mutex_unlock(&bsg_mutex);
        return ret;
 }
index 22b401b2e0884d4a33a3e7a41c9258cc5341bcf7..934d639b36848598fb2a6ddcffe40e2bbe4f34d6 100644 (file)
@@ -42,6 +42,11 @@ menuconfig ACPI
 
 if ACPI
 
+config ACPI_SLEEP
+       bool
+       depends on PM_SLEEP
+       default y
+
 config ACPI_PROCFS
        bool "Deprecated /proc/acpi files"
        depends on PROC_FS
@@ -63,6 +68,14 @@ config ACPI_PROCFS
 
          Say N to delete /proc/acpi/ files that have moved to /sys/
 
+config ACPI_PROCFS_SLEEP
+       bool "/proc/acpi/sleep (deprecated)"
+       depends on PM_SLEEP && ACPI_PROCFS
+       default n
+       ---help---
+         Create /proc/acpi/sleep
+         Deprecated by /sys/power/state
+
 config ACPI_AC
        tristate "AC Adapter"
        depends on X86
index 01a993a1d08612b4e0a4fa5a2384806c8733d432..195a4f69c0f773d4ba73119d3efd0512c9d10454 100644 (file)
@@ -1,5 +1,5 @@
 obj-y                                  := poweroff.o wakeup.o
-obj-y                                  += main.o
-obj-$(CONFIG_X86)                      += proc.o
+obj-$(CONFIG_ACPI_SLEEP)               += main.o
+obj-$(CONFIG_ACPI_SLEEP)               += proc.o
 
 EXTRA_CFLAGS += $(ACPI_CFLAGS)
index ab21357c5c7b7d60dd15883981ea3016a94963b2..e8cff5dd4cbc8ba20cda8260825bff32122f4cbe 100644 (file)
@@ -21,6 +21,9 @@
 
 u8 sleep_states[ACPI_S_STATE_COUNT];
 
+static u32 acpi_target_sleep_state = ACPI_STATE_S0;
+
+#ifdef CONFIG_SUSPEND
 static struct pm_ops acpi_pm_ops;
 
 extern void do_suspend_lowlevel(void);
@@ -34,11 +37,6 @@ static u32 acpi_suspend_states[] = {
 
 static int init_8259A_after_S1;
 
-extern int acpi_sleep_prepare(u32 acpi_state);
-extern void acpi_power_off(void);
-
-static u32 acpi_target_sleep_state = ACPI_STATE_S0;
-
 /**
  *     acpi_pm_set_target - Set the target system sleep state to the state
  *             associated with given @pm_state, if supported.
@@ -163,21 +161,6 @@ static int acpi_pm_finish(suspend_state_t pm_state)
        return 0;
 }
 
-int acpi_suspend(u32 acpi_state)
-{
-       suspend_state_t states[] = {
-               [1] = PM_SUSPEND_STANDBY,
-               [3] = PM_SUSPEND_MEM,
-               [5] = PM_SUSPEND_MAX
-       };
-
-       if (acpi_state < 6 && states[acpi_state])
-               return pm_suspend(states[acpi_state]);
-       if (acpi_state == 4)
-               return hibernate();
-       return -EINVAL;
-}
-
 static int acpi_pm_state_valid(suspend_state_t pm_state)
 {
        u32 acpi_state;
@@ -202,7 +185,28 @@ static struct pm_ops acpi_pm_ops = {
        .finish = acpi_pm_finish,
 };
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
+/*
+ * Toshiba fails to preserve interrupts over S1, reinitialization
+ * of 8259 is needed after S1 resume.
+ */
+static int __init init_ints_after_s1(struct dmi_system_id *d)
+{
+       printk(KERN_WARNING "%s with broken S1 detected.\n", d->ident);
+       init_8259A_after_S1 = 1;
+       return 0;
+}
+
+static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+       {
+        .callback = init_ints_after_s1,
+        .ident = "Toshiba Satellite 4030cdt",
+        .matches = {DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),},
+        },
+       {},
+};
+#endif /* CONFIG_SUSPEND */
+
+#ifdef CONFIG_HIBERNATION
 static int acpi_hibernation_prepare(void)
 {
        return acpi_sleep_prepare(ACPI_STATE_S4);
@@ -254,7 +258,22 @@ static struct hibernation_ops acpi_hibernation_ops = {
        .pre_restore = acpi_hibernation_pre_restore,
        .restore_cleanup = acpi_hibernation_restore_cleanup,
 };
-#endif                         /* CONFIG_SOFTWARE_SUSPEND */
+#endif                         /* CONFIG_HIBERNATION */
+
+int acpi_suspend(u32 acpi_state)
+{
+       suspend_state_t states[] = {
+               [1] = PM_SUSPEND_STANDBY,
+               [3] = PM_SUSPEND_MEM,
+               [5] = PM_SUSPEND_MAX
+       };
+
+       if (acpi_state < 6 && states[acpi_state])
+               return pm_suspend(states[acpi_state]);
+       if (acpi_state == 4)
+               return hibernate();
+       return -EINVAL;
+}
 
 /**
  *     acpi_pm_device_sleep_state - return preferred power state of ACPI device
@@ -331,39 +350,22 @@ int acpi_pm_device_sleep_state(struct device *dev, int wake, int *d_min_p)
        return d_max;
 }
 
-/*
- * Toshiba fails to preserve interrupts over S1, reinitialization
- * of 8259 is needed after S1 resume.
- */
-static int __init init_ints_after_s1(struct dmi_system_id *d)
-{
-       printk(KERN_WARNING "%s with broken S1 detected.\n", d->ident);
-       init_8259A_after_S1 = 1;
-       return 0;
-}
-
-static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
-       {
-        .callback = init_ints_after_s1,
-        .ident = "Toshiba Satellite 4030cdt",
-        .matches = {DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),},
-        },
-       {},
-};
-
 int __init acpi_sleep_init(void)
 {
+       acpi_status status;
+       u8 type_a, type_b;
+#ifdef CONFIG_SUSPEND
        int i = 0;
 
        dmi_check_system(acpisleep_dmi_table);
+#endif
 
        if (acpi_disabled)
                return 0;
 
+#ifdef CONFIG_SUSPEND
        printk(KERN_INFO PREFIX "(supports");
-       for (i = 0; i < ACPI_S_STATE_COUNT; i++) {
-               acpi_status status;
-               u8 type_a, type_b;
+       for (i = ACPI_STATE_S0; i < ACPI_STATE_S4; i++) {
                status = acpi_get_sleep_type_data(i, &type_a, &type_b);
                if (ACPI_SUCCESS(status)) {
                        sleep_states[i] = 1;
@@ -373,10 +375,14 @@ int __init acpi_sleep_init(void)
        printk(")\n");
 
        pm_set_ops(&acpi_pm_ops);
+#endif
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
-       if (sleep_states[ACPI_STATE_S4])
+#ifdef CONFIG_HIBERNATION
+       status = acpi_get_sleep_type_data(ACPI_STATE_S4, &type_a, &type_b);
+       if (ACPI_SUCCESS(status)) {
                hibernation_set_ops(&acpi_hibernation_ops);
+               sleep_states[ACPI_STATE_S4] = 1;
+       }
 #else
        sleep_states[ACPI_STATE_S4] = 0;
 #endif
index b3f68ef0669ed23ba6077e4c784a9b20eaab9564..39e40d56b034ec9bd46e68c4a9e2d9467c3b9686 100644 (file)
@@ -18,6 +18,7 @@
 
 int acpi_sleep_prepare(u32 acpi_state)
 {
+#ifdef CONFIG_ACPI_SLEEP
        /* do we have a wakeup address for S2 and S3? */
        if (acpi_state == ACPI_STATE_S3) {
                if (!acpi_wakeup_address) {
@@ -30,6 +31,7 @@ int acpi_sleep_prepare(u32 acpi_state)
        }
        ACPI_FLUSH_CPU_CACHE();
        acpi_enable_wakeup_device_prep(acpi_state);
+#endif
        acpi_gpe_sleep_prepare(acpi_state);
        acpi_enter_sleep_state_prep(acpi_state);
        return 0;
index ed58e1168aed6b40c1631b23a5c8317fc4cda39c..66b62b0d3609a52b976316166e1ee1b271a56cb7 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 ACPI_MODULE_NAME("sleep")
-#ifdef CONFIG_ACPI_PROCFS
+#ifdef CONFIG_ACPI_PROCFS_SLEEP
 static int acpi_system_sleep_seq_show(struct seq_file *seq, void *offset)
 {
        int i;
@@ -66,7 +66,7 @@ acpi_system_write_sleep(struct file *file,
                goto Done;
        }
        state = simple_strtoul(str, NULL, 0);
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
        if (state == 4) {
                error = hibernate();
                goto Done;
@@ -76,9 +76,9 @@ acpi_system_write_sleep(struct file *file,
       Done:
        return error ? error : count;
 }
-#endif                         /* CONFIG_ACPI_PROCFS */
+#endif                         /* CONFIG_ACPI_PROCFS_SLEEP */
 
-#if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE)
+#if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE) || !defined(CONFIG_X86)
 /* use /sys/class/rtc/rtcX/wakealarm instead; it's not ACPI-specific */
 #else
 #define        HAVE_ACPI_LEGACY_ALARM
@@ -471,7 +471,7 @@ static const struct file_operations acpi_system_wakeup_device_fops = {
        .release = single_release,
 };
 
-#ifdef CONFIG_ACPI_PROCFS
+#ifdef CONFIG_ACPI_PROCFS_SLEEP
 static const struct file_operations acpi_system_sleep_fops = {
        .open = acpi_system_sleep_open_fs,
        .read = seq_read,
@@ -479,7 +479,7 @@ static const struct file_operations acpi_system_sleep_fops = {
        .llseek = seq_lseek,
        .release = single_release,
 };
-#endif                         /* CONFIG_ACPI_PROCFS */
+#endif                         /* CONFIG_ACPI_PROCFS_SLEEP */
 
 #ifdef HAVE_ACPI_LEGACY_ALARM
 static const struct file_operations acpi_system_alarm_fops = {
@@ -506,7 +506,7 @@ static int __init acpi_sleep_proc_init(void)
        if (acpi_disabled)
                return 0;
 
-#ifdef CONFIG_ACPI_PROCFS
+#ifdef CONFIG_ACPI_PROCFS_SLEEP
        /* 'sleep' [R/W] */
        entry =
            create_proc_entry("sleep", S_IFREG | S_IRUGO | S_IWUSR,
index f3e70397a7d67d1a95c7652dd067bf90340a5a43..ff1f8504f497e9a5127de4ce95a484b147771733 100644 (file)
@@ -6,3 +6,5 @@ extern void acpi_enable_wakeup_device_prep(u8 sleep_state);
 extern void acpi_enable_wakeup_device(u8 sleep_state);
 extern void acpi_disable_wakeup_device(u8 sleep_state);
 extern void acpi_gpe_sleep_prepare(u32 sleep_state);
+
+extern int acpi_sleep_prepare(u32 acpi_state);
index 3599ab2506d269ee299b1b8e807746bcbca98391..e6738bcbe5a9b2da343e5d20a67b51a6b28545ee 100644 (file)
@@ -24,8 +24,6 @@
 #include "base.h"
 #include "power/power.h"
 
-extern const char *kobject_actions[];
-
 int (*platform_notify)(struct device * dev) = NULL;
 int (*platform_notify_remove)(struct device * dev) = NULL;
 
@@ -680,8 +678,7 @@ static int device_add_class_symlinks(struct device *dev)
                if (error)
                        goto out_subsys;
        }
-       /* only bus-device parents get a "device"-link */
-       if (dev->parent && dev->parent->bus) {
+       if (dev->parent) {
                error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
                                          "device");
                if (error)
index 53f0ee6f301663db0ff4b87b5500b39bcd74744b..b24efd4e3e3de2c1f681c68936c52eca839cd8ea 100644 (file)
@@ -232,6 +232,7 @@ fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)
 /**
  * firmware_data_write - write method for firmware
  * @kobj: kobject for the device
+ * @bin_attr: bin_attr structure
  * @buffer: buffer being written
  * @offset: buffer offset for write in total data store area
  * @count: buffer size
index 966a5e2874150eae972089e728f4b37b17cec9b8..9caeaea753a3e00623fae4c41d72ffceaef1643c 100644 (file)
@@ -1,5 +1,5 @@
 obj-y                  := shutdown.o
-obj-$(CONFIG_PM)       += main.o suspend.o resume.o sysfs.o
+obj-$(CONFIG_PM_SLEEP) += main.o suspend.o resume.o sysfs.o
 obj-$(CONFIG_PM_TRACE) += trace.o
 
 ifeq ($(CONFIG_DEBUG_DRIVER),y)
index 591a0dd5deee544a6b4d3dbbc5ee8ac553b72acc..8ba0830cbc03fa6fe50d8bc27be7b5c3e770259c 100644 (file)
@@ -5,7 +5,7 @@
 extern void device_shutdown(void);
 
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 
 /*
  * main.c
@@ -62,7 +62,7 @@ extern int resume_device(struct device *);
  */
 extern int suspend_device(struct device *, pm_message_t);
 
-#else /* CONFIG_PM */
+#else /* CONFIG_PM_SLEEP */
 
 
 static inline int device_pm_add(struct device * dev)
index a7a099027fcadec6ff29705ba5096b13eaedb2d7..014e72121b5a255ae835d56b3ed7dd9989eab136 100644 (file)
@@ -31,4 +31,4 @@ obj-$(CONFIG_BLK_DEV_SX8)     += sx8.o
 obj-$(CONFIG_BLK_DEV_UB)       += ub.o
 
 obj-$(CONFIG_XEN_BLKDEV_FRONTEND)      += xen-blkfront.o
-obj-$(CONFIG_LGUEST_GUEST)     += lguest_blk.o
+obj-$(CONFIG_LGUEST_BLOCK)     += lguest_blk.o
index a9f9c48c2424c8f307061bdf7feda686d7a996ab..713533d8a86e7449156113d1e40e0da69d1deafc 100644 (file)
@@ -50,7 +50,7 @@ config AGP_ATI
 
 config AGP_AMD
        tristate "AMD Irongate, 761, and 762 chipset support"
-       depends on AGP && X86_32
+       depends on AGP && (X86_32 || ALPHA)
        help
          This option gives you AGP support for the GLX component of
          X on AMD Irongate, 761, and 762 chipsets.
index 780e59e588ad968c82f6b1a7b15df14925ff35fa..da7513d7b4e7e9b190f8ff72f1314ae633f94662 100644 (file)
@@ -123,21 +123,16 @@ static int ati_create_gatt_pages(int nr_tables)
 
        for (i = 0; i < nr_tables; i++) {
                entry = kzalloc(sizeof(struct ati_page_map), GFP_KERNEL);
+               tables[i] = entry;
                if (entry == NULL) {
-                       while (i > 0) {
-                               kfree(tables[i-1]);
-                               i--;
-                       }
-                       kfree(tables);
                        retval = -ENOMEM;
                        break;
                }
-               tables[i] = entry;
                retval = ati_create_page_map(entry);
                if (retval != 0)
                        break;
        }
-       ati_generic_private.num_tables = nr_tables;
+       ati_generic_private.num_tables = i;
        ati_generic_private.gatt_pages = tables;
 
        if (retval != 0)
index fcb4b1bf0d4e664187c3fbf2633e1f5b5ecb6b96..ecd4248861b9dfda6475e29d0acfcc9c6c547f96 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <linux/kernel.h>
 #include <linux/pci.h>
+#include <linux/fs.h>
 #include <linux/agpgart.h>
 #include <asm/uaccess.h>
 #include "agp.h"
index c7ed617aa7ff436ea8c359f66bdafa097b4641de..7791e98de51c81a34ed3b4aed1b007cb4b728e46 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/agpgart.h>
 #include <linux/slab.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/sched.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
index d535c406b3192512433130cc3109a4d3cd77bfe2..3db4f4076ed4dae4292d8802b170efff796a036c 100644 (file)
@@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge)
        map_page_into_agp(page);
 
        get_page(page);
-       SetPageLocked(page);
        atomic_inc(&agp_bridge->current_memory_agp);
        return page_address(page);
 }
@@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr)
        page = virt_to_page(addr);
        unmap_page_from_agp(page);
        put_page(page);
-       unlock_page(page);
        free_page((unsigned long)addr);
        atomic_dec(&agp_bridge->current_memory_agp);
 }
index a1240603912c2608f0137fa73ded8aa86a00e9e1..294cdbf4d44d9ecabe43ab892f4ee53502956be1 100644 (file)
@@ -20,7 +20,9 @@
 #define PCI_DEVICE_ID_INTEL_82965G_IG       0x29A2
 #define PCI_DEVICE_ID_INTEL_82965GM_HB      0x2A00
 #define PCI_DEVICE_ID_INTEL_82965GM_IG      0x2A02
+#define PCI_DEVICE_ID_INTEL_82965GME_HB     0x2A10
 #define PCI_DEVICE_ID_INTEL_82965GME_IG     0x2A12
+#define PCI_DEVICE_ID_INTEL_82945GME_HB     0x27AC
 #define PCI_DEVICE_ID_INTEL_82945GME_IG     0x27AE
 #define PCI_DEVICE_ID_INTEL_G33_HB          0x29C0
 #define PCI_DEVICE_ID_INTEL_G33_IG          0x29C2
@@ -33,7 +35,8 @@
                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \
                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB || \
-                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB)
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB || \
+                 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB)
 
 #define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
                agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
@@ -213,7 +216,6 @@ static void *i8xx_alloc_pages(void)
        }
        global_flush_tlb();
        get_page(page);
-       SetPageLocked(page);
        atomic_inc(&agp_bridge->current_memory_agp);
        return page_address(page);
 }
@@ -229,7 +231,6 @@ static void i8xx_destroy_pages(void *addr)
        change_page_attr(page, 4, PAGE_KERNEL);
        global_flush_tlb();
        put_page(page);
-       unlock_page(page);
        __free_pages(page, 2);
        atomic_dec(&agp_bridge->current_memory_agp);
 }
@@ -527,6 +528,7 @@ static void intel_i830_init_gtt_entries(void)
                            agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
                            agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
                            agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB ||
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB ||
                            IS_I965 || IS_G33)
                                gtt_entries = MB(48) - KB(size);
                        else
@@ -538,6 +540,7 @@ static void intel_i830_init_gtt_entries(void)
                            agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB ||
                            agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945G_HB ||
                            agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GM_HB ||
+                           agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82945GME_HB ||
                            IS_I965 || IS_G33)
                                gtt_entries = MB(64) - KB(size);
                        else
@@ -1848,9 +1851,9 @@ static const struct intel_driver_description {
                NULL, &intel_915_driver },
        { PCI_DEVICE_ID_INTEL_82945G_HB, PCI_DEVICE_ID_INTEL_82945G_IG, 0, "945G",
                NULL, &intel_915_driver },
-       { PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GM_IG, 1, "945GM",
+       { PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GM_IG, 0, "945GM",
                NULL, &intel_915_driver },
-       { PCI_DEVICE_ID_INTEL_82945GM_HB, PCI_DEVICE_ID_INTEL_82945GME_IG, 0, "945GME",
+       { PCI_DEVICE_ID_INTEL_82945GME_HB, PCI_DEVICE_ID_INTEL_82945GME_IG, 0, "945GME",
                NULL, &intel_915_driver },
        { PCI_DEVICE_ID_INTEL_82946GZ_HB, PCI_DEVICE_ID_INTEL_82946GZ_IG, 0, "946GZ",
                NULL, &intel_i965_driver },
@@ -1860,9 +1863,9 @@ static const struct intel_driver_description {
                NULL, &intel_i965_driver },
        { PCI_DEVICE_ID_INTEL_82965G_HB, PCI_DEVICE_ID_INTEL_82965G_IG, 0, "965G",
                NULL, &intel_i965_driver },
-       { PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GM_IG, 1, "965GM",
+       { PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GM_IG, 0, "965GM",
                NULL, &intel_i965_driver },
-       { PCI_DEVICE_ID_INTEL_82965GM_HB, PCI_DEVICE_ID_INTEL_82965GME_IG, 0, "965GME/GLE",
+       { PCI_DEVICE_ID_INTEL_82965GME_HB, PCI_DEVICE_ID_INTEL_82965GME_IG, 0, "965GME/GLE",
                NULL, &intel_i965_driver },
        { PCI_DEVICE_ID_INTEL_7505_0, 0, 0, "E7505", &intel_7505_driver, NULL },
        { PCI_DEVICE_ID_INTEL_7205_0, 0, 0, "E7205", &intel_7505_driver, NULL },
@@ -2051,11 +2054,13 @@ static struct pci_device_id agp_intel_pci_table[] = {
        ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
        ID(PCI_DEVICE_ID_INTEL_82945G_HB),
        ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
+       ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
        ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
        ID(PCI_DEVICE_ID_INTEL_82965G_1_HB),
        ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
        ID(PCI_DEVICE_ID_INTEL_82965G_HB),
        ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
+       ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
        ID(PCI_DEVICE_ID_INTEL_G33_HB),
        ID(PCI_DEVICE_ID_INTEL_Q35_HB),
        ID(PCI_DEVICE_ID_INTEL_Q33_HB),
index cda608c42bea35e9fd7ed8f79f50ef1e9b8412ad..98cf8abb3e57f59ab3055934f4f460b3352d9c49 100644 (file)
@@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct agp_bridge_data *bridge)
                return NULL;
 
        get_page(page);
-       SetPageLocked(page);
        atomic_inc(&agp_bridge->current_memory_agp);
        return page_address(page);
 }
index 6e55cfb9c65a3f03a12d0431040532cebdeb2e7c..e60a74c66e3dfa05c00eb45596829e77932ce5c1 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/mmtimer.h>
 #include <linux/miscdevice.h>
 #include <linux/posix-timers.h>
index c716ef0dd370af5043590d12d314e8981daac754..c08a4152ee8fc2f5df6032221d519beafb4837f0 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/miscdevice.h>
 #include <linux/spinlock.h>
 #include <linux/mm.h>
+#include <linux/fs.h>
 #include <linux/vmalloc.h>
 #include <linux/string.h>
 #include <linux/slab.h>
index da1647869f914872507ba0cb77a1258e1418c805..1842f523c23d33b3b1458e992d35effcbf88d0f8 100644 (file)
@@ -92,9 +92,9 @@ config I2C_AU1550
 
 config I2C_BLACKFIN_TWI
        tristate "Blackfin TWI I2C support"
-       depends on BF534 || BF536 || BF537
+       depends on BF534 || BF536 || BF537 || BF54x
        help
-         This is the TWI I2C device driver for Blackfin 534/536/537.
+         This is the TWI I2C device driver for Blackfin 534/536/537/54x.
          This driver can also be built as a module.  If so, the module
          will be called i2c-bfin-twi.
 
index 3c3f2ebf3fc9786eecf042ed4aa1d1ae9a56c9c3..503ffec2ce07c4f78ad04013b36d35c88d7d68ee 100644 (file)
@@ -352,7 +352,7 @@ static void tps65010_interrupt(struct tps65010 *tps)
                        /* REVISIT:  this might need its own workqueue
                         * plus tweaks including deadlock avoidance ...
                         * also needs to get error handling and probably
-                        * an #ifdef CONFIG_SOFTWARE_SUSPEND
+                        * an #ifdef CONFIG_HIBERNATION
                         */
                        hibernate();
 #endif
index a698f1949d1040da508c1c727acca8bf6bb24dbb..cf25cdab02f9dd3efa5af610d200cf6211b9b85a 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/io.h>
 #include <linux/pci.h>
 #include <linux/vmalloc.h>
+#include <linux/fs.h>
 #include <asm/uaccess.h>
 
 #include "ipath_kernel.h"
index 5db31438027109588ea50018a4875bfd64ae9521..bad8dacafd108e5c2c9fd0f4826e2a59630337e9 100644 (file)
@@ -548,6 +548,7 @@ iscsi_iser_ep_disconnect(__u64 ep_handle)
 }
 
 static struct scsi_host_template iscsi_iser_sht = {
+       .module                 = THIS_MODULE,
        .name                   = "iSCSI Initiator over iSER, v." DRV_VER,
        .queuecommand           = iscsi_queuecommand,
        .can_queue              = ISCSI_DEF_XMIT_CMDS_MAX - 1,
index adef447f23ea601fd4bb61d1b7935b61b1c7ee75..5ce632ca6815e34c6cf2ce0416f63c8ec9817608 100644 (file)
@@ -21,7 +21,7 @@ if SERIO
 config SERIO_I8042
        tristate "i8042 PC Keyboard controller" if EMBEDDED || !X86
        default y
-       depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && !M68K
+       depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && !M68K && !BFIN
        ---help---
          i8042 is the chip over which the standard AT keyboard and PS/2
          mouse are connected to the computer. If you use these devices,
index 43d901fdc77f714dd44203e178835a6a61464bae..888205c3f76b83d0f38fa667cb5148ca55b145fa 100644 (file)
@@ -1,6 +1,6 @@
 config LGUEST
        tristate "Linux hypervisor example code"
-       depends on X86 && PARAVIRT && NET && EXPERIMENTAL && !X86_PAE
+       depends on X86 && PARAVIRT && EXPERIMENTAL && !X86_PAE
        select LGUEST_GUEST
        select HVC_DRIVER
        ---help---
@@ -18,3 +18,11 @@ config LGUEST_GUEST
          The guest needs code built-in, even if the host has lguest
          support as a module.  The drivers are tiny, so we build them
          in too.
+
+config LGUEST_NET
+       tristate
+       depends on LGUEST_GUEST && NET
+
+config LGUEST_BLOCK
+       tristate
+       depends on LGUEST_GUEST && BLOCK
index 7a5299f9679ddcbe083cb7b16657ecc22cf1e2aa..db6caace3b9c22a7ce16a85580de212d318c4cd2 100644 (file)
@@ -64,14 +64,6 @@ static void do_hcall(struct lguest *lg, struct lguest_regs *regs)
                else
                        guest_pagetable_flush_user(lg);
                break;
-       case LHCALL_GET_WALLCLOCK: {
-               /* The Guest wants to know the real time in seconds since 1970,
-                * in good Unix tradition. */
-               struct timespec ts;
-               ktime_get_real_ts(&ts);
-               regs->eax = ts.tv_sec;
-               break;
-       }
        case LHCALL_BIND_DMA:
                /* BIND_DMA really wants four arguments, but it's the only call
                 * which does.  So the Guest packs the number of buffers and
@@ -235,6 +227,9 @@ static void initialize(struct lguest *lg)
            || put_user(lg->guestid, &lg->lguest_data->guestid))
                kill_guest(lg, "bad guest page %p", lg->lguest_data);
 
+       /* We write the current time into the Guest's data page once now. */
+       write_timestamp(lg);
+
        /* This is the one case where the above accesses might have been the
         * first write to a Guest page.  This may have caused a copy-on-write
         * fault, but the Guest might be referring to the old (read-only)
@@ -293,3 +288,13 @@ void do_hypercalls(struct lguest *lg)
                clear_hcall(lg);
        }
 }
+
+/* This routine supplies the Guest with time: it's used for wallclock time at
+ * initial boot and as a rough time source if the TSC isn't available. */
+void write_timestamp(struct lguest *lg)
+{
+       struct timespec now;
+       ktime_get_real_ts(&now);
+       if (put_user(now, &lg->lguest_data->time))
+               kill_guest(lg, "Writing timestamp");
+}
index bd0091bf79ec485edacedcdaf47194e429a35cb3..49787e964a0dfcae6b03fa044aaf2c0a03fd2a04 100644 (file)
@@ -175,6 +175,13 @@ void maybe_do_interrupt(struct lguest *lg)
                 * the stack as well: virtual interrupts never do. */
                set_guest_interrupt(lg, idt->a, idt->b, 0);
        }
+
+       /* Every time we deliver an interrupt, we update the timestamp in the
+        * Guest's lguest_data struct.  It would be better for the Guest if we
+        * did this more often, but it can actually be quite slow: doing it
+        * here is a compromise which means at least it gets updated every
+        * timer interrupt. */
+       write_timestamp(lg);
 }
 
 /*H:220 Now we've got the routines to deliver interrupts, delivering traps
index 269116eee85f93944485270e06933c8653861ee3..64f0abed317c2fbb6afe4c7d3ca881c163353ef7 100644 (file)
@@ -256,6 +256,7 @@ unsigned long get_dma_buffer(struct lguest *lg, unsigned long key,
 
 /* hypercalls.c: */
 void do_hypercalls(struct lguest *lg);
+void write_timestamp(struct lguest *lg);
 
 /*L:035
  * Let's step aside for the moment, to study one important routine that's used
index 6dfe568523a2d0cf0e319fd83bd818886f7fd1cd..1bc1546c7fd03c1fbb2a07bad1ffd5e15d498e13 100644 (file)
@@ -643,21 +643,42 @@ static void __init lguest_init_IRQ(void)
  * Time.
  *
  * It would be far better for everyone if the Guest had its own clock, but
- * until then it must ask the Host for the time.
+ * until then the Host gives us the time on every interrupt.
  */
 static unsigned long lguest_get_wallclock(void)
 {
-       return hcall(LHCALL_GET_WALLCLOCK, 0, 0, 0);
+       return lguest_data.time.tv_sec;
 }
 
-/* If the Host tells us we can trust the TSC, we use that, otherwise we simply
- * use the imprecise but reliable "jiffies" counter. */
 static cycle_t lguest_clock_read(void)
 {
+       unsigned long sec, nsec;
+
+       /* If the Host tells the TSC speed, we can trust that. */
        if (lguest_data.tsc_khz)
                return native_read_tsc();
-       else
-               return jiffies;
+
+       /* If we can't use the TSC, we read the time value written by the Host.
+        * Since it's in two parts (seconds and nanoseconds), we risk reading
+        * it just as it's changing from 99 & 0.999999999 to 100 and 0, and
+        * getting 99 and 0.  As Linux tends to come apart under the stress of
+        * time travel, we must be careful: */
+       do {
+               /* First we read the seconds part. */
+               sec = lguest_data.time.tv_sec;
+               /* This read memory barrier tells the compiler and the CPU that
+                * this can't be reordered: we have to complete the above
+                * before going on. */
+               rmb();
+               /* Now we read the nanoseconds part. */
+               nsec = lguest_data.time.tv_nsec;
+               /* Make sure we've done that. */
+               rmb();
+               /* Now if the seconds part has changed, try again. */
+       } while (unlikely(lguest_data.time.tv_sec != sec));
+
+       /* Our non-TSC clock is in real nanoseconds. */
+       return sec*1000000000ULL + nsec;
 }
 
 /* This is what we tell the kernel is our clocksource.  */
@@ -665,8 +686,11 @@ static struct clocksource lguest_clock = {
        .name           = "lguest",
        .rating         = 400,
        .read           = lguest_clock_read,
+       .mask           = CLOCKSOURCE_MASK(64),
+       .mult           = 1,
 };
 
+/* The "scheduler clock" is just our real clock, adjusted to start at zero */
 static unsigned long long lguest_sched_clock(void)
 {
        return cyc2ns(&lguest_clock, lguest_clock_read() - clock_base);
@@ -742,24 +766,21 @@ static void lguest_time_init(void)
        set_irq_handler(0, lguest_time_irq);
 
        /* Our clock structure look like arch/i386/kernel/tsc.c if we can use
-        * the TSC, otherwise it looks like kernel/time/jiffies.c.  Either way,
-        * the "rating" is initialized so high that it's always chosen over any
-        * other clocksource. */
+        * the TSC, otherwise it's a dumb nanosecond-resolution clock.  Either
+        * way, the "rating" is initialized so high that it's always chosen
+        * over any other clocksource. */
        if (lguest_data.tsc_khz) {
                lguest_clock.shift = 22;
                lguest_clock.mult = clocksource_khz2mult(lguest_data.tsc_khz,
                                                         lguest_clock.shift);
-               lguest_clock.mask = CLOCKSOURCE_MASK(64);
                lguest_clock.flags = CLOCK_SOURCE_IS_CONTINUOUS;
-       } else {
-               /* To understand this, start at kernel/time/jiffies.c... */
-               lguest_clock.shift = 8;
-               lguest_clock.mult = (((u64)NSEC_PER_SEC<<8)/ACTHZ) << 8;
-               lguest_clock.mask = CLOCKSOURCE_MASK(32);
        }
        clock_base = lguest_clock_read();
        clocksource_register(&lguest_clock);
 
+       /* Now we've set up our clock, we can use it as the scheduler clock */
+       paravirt_ops.sched_clock = lguest_sched_clock;
+
        /* We can't set cpumask in the initializer: damn C limitations!  Set it
         * here and register our timer device. */
        lguest_clockevent.cpumask = cpumask_of_cpu(0);
@@ -996,7 +1017,6 @@ __init void lguest_init(void *boot)
        paravirt_ops.time_init = lguest_time_init;
        paravirt_ops.set_lazy_mode = lguest_lazy_mode;
        paravirt_ops.wbinvd = lguest_wbinvd;
-       paravirt_ops.sched_clock = lguest_sched_clock;
        /* Now is a good time to look at the implementations of these functions
         * before returning to the rest of lguest_init(). */
 
@@ -1019,6 +1039,11 @@ __init void lguest_init(void *boot)
         * the normal data segment to get through booting. */
        asm volatile ("mov %0, %%fs" : : "r" (__KERNEL_DS) : "memory");
 
+       /* Clear the part of the kernel data which is expected to be zero.
+        * Normally it will be anyway, but if we're loading from a bzImage with
+        * CONFIG_RELOCATALE=y, the relocations will be sitting here. */
+       memset(__bss_start, 0, __bss_stop - __bss_start);
+
        /* The Host uses the top of the Guest's virtual address space for the
         * Host<->Guest Switcher, and it tells us how much it needs in
         * lguest_data.reserve_mem, set up on the LGUEST_INIT hypercall. */
index 7195c9461524bb1507bac6ff8015a5097642c650..b1a9c4cdec93ee27f8eec60f6f7dcf5774836c4e 100644 (file)
@@ -29,8 +29,6 @@
 
 struct af9005_fe_state {
        struct dvb_usb_device *d;
-       struct dvb_frontend *tuner;
-
        fe_status_t stat;
 
        /* retraining parameters */
@@ -345,8 +343,8 @@ static int af9005_reset_pre_viterbi(struct dvb_frontend *fe)
                                       1 & 0xff);
        if (ret)
                return ret;
-       af9005_write_ofdm_register(state->d, xd_p_fec_super_frm_unit_15_8,
-                                  1 >> 8);
+       ret = af9005_write_ofdm_register(state->d, xd_p_fec_super_frm_unit_15_8,
+                                        1 >> 8);
        if (ret)
                return ret;
        /* reset pre viterbi error count */
@@ -447,7 +445,7 @@ static int af9005_fe_read_status(struct dvb_frontend *fe, fe_status_t * stat)
        u8 temp;
        int ret;
 
-       if (state->tuner == NULL)
+       if (fe->ops.tuner_ops.release == NULL)
                return -ENODEV;
 
        *stat = 0;
@@ -493,7 +491,7 @@ static int af9005_fe_read_status(struct dvb_frontend *fe, fe_status_t * stat)
 static int af9005_fe_read_ber(struct dvb_frontend *fe, u32 * ber)
 {
        struct af9005_fe_state *state = fe->demodulator_priv;
-       if (state->tuner == NULL)
+       if (fe->ops.tuner_ops.release  == NULL)
                return -ENODEV;
        af9005_fe_refresh_state(fe);
        *ber = state->ber;
@@ -503,7 +501,7 @@ static int af9005_fe_read_ber(struct dvb_frontend *fe, u32 * ber)
 static int af9005_fe_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
 {
        struct af9005_fe_state *state = fe->demodulator_priv;
-       if (state->tuner == NULL)
+       if (fe->ops.tuner_ops.release == NULL)
                return -ENODEV;
        af9005_fe_refresh_state(fe);
        *unc = state->unc;
@@ -517,7 +515,7 @@ static int af9005_fe_read_signal_strength(struct dvb_frontend *fe,
        int ret;
        u8 if_gain, rf_gain;
 
-       if (state->tuner == NULL)
+       if (fe->ops.tuner_ops.release == NULL)
                return -ENODEV;
        ret =
            af9005_read_ofdm_register(state->d, xd_r_reg_aagc_rf_gain,
@@ -881,10 +879,8 @@ static int af9005_fe_init(struct dvb_frontend *fe)
             af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
                                        reg_ofdm_rst_pos, reg_ofdm_rst_len, 1)))
                return ret;
-       if ((ret =
-            af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
-                                       reg_ofdm_rst_pos, reg_ofdm_rst_len, 0)))
-               return ret;
+       ret = af9005_write_register_bits(state->d, xd_I2C_reg_ofdm_rst,
+                                        reg_ofdm_rst_pos, reg_ofdm_rst_len, 0);
 
        if (ret)
                return ret;
@@ -1041,7 +1037,7 @@ static int af9005_fe_init(struct dvb_frontend *fe)
                return ret;
 
        /* attach tuner and init */
-       if (state->tuner == NULL) {
+       if (fe->ops.tuner_ops.release == NULL) {
                /* read tuner and board id from eeprom */
                ret = af9005_read_eeprom(adap->dev, 0xc6, buf, 2);
                if (ret) {
@@ -1058,20 +1054,16 @@ static int af9005_fe_init(struct dvb_frontend *fe)
                                return ret;
                        }
                        if1 = (u16) (buf[0] << 8) + buf[1];
-                       state->tuner =
-                           dvb_attach(mt2060_attach, fe, &adap->dev->i2c_adap,
-                                      &af9005_mt2060_config, if1);
-                       if (state->tuner == NULL) {
+                       if (dvb_attach(mt2060_attach, fe, &adap->dev->i2c_adap,
+                                        &af9005_mt2060_config, if1) == NULL) {
                                deb_info("MT2060 attach failed\n");
                                return -ENODEV;
                        }
                        break;
                case 3: /* QT1010 */
                case 9: /* QT1010B */
-                       state->tuner =
-                           dvb_attach(qt1010_attach, fe, &adap->dev->i2c_adap,
-                                      &af9005_qt1010_config);
-                       if (state->tuner == NULL) {
+                       if (dvb_attach(qt1010_attach, fe, &adap->dev->i2c_adap,
+                                       &af9005_qt1010_config) ==NULL) {
                                deb_info("QT1010 attach failed\n");
                                return -ENODEV;
                        }
@@ -1080,7 +1072,7 @@ static int af9005_fe_init(struct dvb_frontend *fe)
                        err("Unsupported tuner type %d", buf[0]);
                        return -ENODEV;
                }
-               ret = state->tuner->ops.tuner_ops.init(state->tuner);
+               ret = fe->ops.tuner_ops.init(fe);
                if (ret)
                        return ret;
        }
@@ -1118,7 +1110,7 @@ static int af9005_fe_set_frontend(struct dvb_frontend *fe,
 
        deb_info("af9005_fe_set_frontend freq %d bw %d\n", fep->frequency,
                 fep->u.ofdm.bandwidth);
-       if (state->tuner == NULL) {
+       if (fe->ops.tuner_ops.release == NULL) {
                err("Tuner not attached");
                return -ENODEV;
        }
@@ -1199,7 +1191,7 @@ static int af9005_fe_set_frontend(struct dvb_frontend *fe,
                return ret;
        /* set tuner */
        deb_info("set tuner\n");
-       ret = state->tuner->ops.tuner_ops.set_params(state->tuner, fep);
+       ret = fe->ops.tuner_ops.set_params(fe, fep);
        if (ret)
                return ret;
 
@@ -1435,12 +1427,6 @@ static void af9005_fe_release(struct dvb_frontend *fe)
 {
        struct af9005_fe_state *state =
            (struct af9005_fe_state *)fe->demodulator_priv;
-       if (state->tuner != NULL && state->tuner->ops.tuner_ops.release != NULL) {
-               state->tuner->ops.tuner_ops.release(state->tuner);
-#ifdef CONFIG_DVB_CORE_ATTACH
-               symbol_put_addr(state->tuner->ops.tuner_ops.release);
-#endif
-       }
        kfree(state);
 }
 
@@ -1458,7 +1444,6 @@ struct dvb_frontend *af9005_fe_attach(struct dvb_usb_device *d)
        deb_info("attaching frontend af9005\n");
 
        state->d = d;
-       state->tuner = NULL;
        state->opened = 0;
 
        memcpy(&state->frontend.ops, &af9005_fe_ops,
index 0c0b94767bc1e1b8a64e8a75aa76415135b72fe3..ca99e439c97c26288dd10dd8d5a93f5f92eb8688 100644 (file)
@@ -501,7 +501,7 @@ static struct dvb_pll_desc dvb_pll_opera1 = {
 
 /* Philips FCV1236D
  */
-struct dvb_pll_desc dvb_pll_fcv1236d = {
+static struct dvb_pll_desc dvb_pll_fcv1236d = {
 /* Bit_0: RF Input select
  * Bit_1: 0=digital, 1=analog
  */
index 387cb2122d4f0061d1e964d0c7ecf8ce3fa42839..f6715007d409089cad347d660f6680fb35fa4111 100644 (file)
@@ -33,6 +33,7 @@
 #include <linux/pci.h>
 #include <linux/vmalloc.h>
 #include <linux/firmware.h>
+#include <net/checksum.h>
 
 #include <asm/io.h>
 
@@ -45,7 +46,7 @@ static void boot_msp34xx(struct bttv *btv, int pin);
 static void boot_bt832(struct bttv *btv);
 static void hauppauge_eeprom(struct bttv *btv);
 static void avermedia_eeprom(struct bttv *btv);
-static void osprey_eeprom(struct bttv *btv);
+static void osprey_eeprom(struct bttv *btv, const u8 ee[256]);
 static void modtec_eeprom(struct bttv *btv);
 static void init_PXC200(struct bttv *btv);
 static void init_RTV24(struct bttv *btv);
@@ -2843,13 +2844,28 @@ struct tvcard bttv_tvcards[] = {
                .has_remote     = 1,
        },
                /* ---- card 0x8c ---------------------------------- */
+       /* Has four Bt878 chips behind a PCI bridge, each chip has:
+            one external BNC composite input (mux 2)
+            three internal composite inputs (unknown muxes)
+            an 18-bit stereo A/D (CS5331A), which has:
+              one external stereo unblanced (RCA) audio connection
+              one (or 3?) internal stereo balanced (XLR) audio connection
+              input is selected via gpio to a 14052B mux
+                (mask=0x300, unbal=0x000, bal=0x100, ??=0x200,0x300)
+              gain is controlled via an X9221A chip on the I2C bus @0x28
+              sample rate is controlled via gpio to an MK1413S
+                (mask=0x3, 32kHz=0x0, 44.1kHz=0x1, 48kHz=0x2, ??=0x3)
+            There is neither a tuner nor an svideo input. */
        [BTTV_BOARD_OSPREY440]  = {
                .name           = "Osprey 440",
-               .video_inputs   = 1,
-               .audio_inputs   = 1,
+               .video_inputs   = 4,
+               .audio_inputs   = 2, /* this is meaningless */
                .tuner          = UNSET,
-               .svhs           = 1,
-               .muxsel         = { 2 },
+               .svhs           = UNSET,
+               .muxsel         = { 2, 3, 0, 1 }, /* 3,0,1 are guesses */
+               .gpiomask       = 0x303,
+               .gpiomute       = 0x000, /* int + 32kHz */
+               .gpiomux        = { 0, 0, 0x000, 0x100},
                .pll            = PLL_28,
                .tuner_type     = UNSET,
                .tuner_addr     = ADDR_UNSET,
@@ -3453,11 +3469,12 @@ void __devinit bttv_init_card2(struct bttv *btv)
        case BTTV_BOARD_OSPREY2xx:
        case BTTV_BOARD_OSPREY2x0_SVID:
        case BTTV_BOARD_OSPREY2x0:
+       case BTTV_BOARD_OSPREY440:
        case BTTV_BOARD_OSPREY500:
        case BTTV_BOARD_OSPREY540:
        case BTTV_BOARD_OSPREY2000:
                bttv_readee(btv,eeprom_data,0xa0);
-               osprey_eeprom(btv);
+               osprey_eeprom(btv, eeprom_data);
                break;
        case BTTV_BOARD_IDS_EAGLE:
                init_ids_eagle(btv);
@@ -3748,106 +3765,119 @@ static int __devinit pvr_boot(struct bttv *btv)
 /* ----------------------------------------------------------------------- */
 /* some osprey specific stuff                                              */
 
-static void __devinit osprey_eeprom(struct bttv *btv)
+static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256])
 {
-       int i = 0;
-       unsigned char *ee = eeprom_data;
-       unsigned long serial = 0;
-
-       if (btv->c.type == 0) {
-              /* this might be an antique... check for MMAC label in eeprom */
-              if ((ee[0]=='M') && (ee[1]=='M') && (ee[2]=='A') && (ee[3]=='C')) {
-                      unsigned char checksum = 0;
-                      for (i = 0; i < 21; i++)
-                              checksum += ee[i];
-                      if (checksum != ee[21])
-                              return;
-                      btv->c.type = BTTV_BOARD_OSPREY1x0_848;
-                      for (i = 12; i < 21; i++)
-                              serial *= 10, serial += ee[i] - '0';
-              }
+       int i;
+       u32 serial = 0;
+       int cardid = -1;
+
+       /* This code will nevery actually get called in this case.... */
+       if (btv->c.type == BTTV_BOARD_UNKNOWN) {
+               /* this might be an antique... check for MMAC label in eeprom */
+               if (!strncmp(ee, "MMAC", 4)) {
+                       u8 checksum = 0;
+                       for (i = 0; i < 21; i++)
+                               checksum += ee[i];
+                       if (checksum != ee[21])
+                               return;
+                       cardid = BTTV_BOARD_OSPREY1x0_848;
+                       for (i = 12; i < 21; i++)
+                               serial *= 10, serial += ee[i] - '0';
+               }
        } else {
-              unsigned short type;
-              int offset = 4*16;
-
-              for (; offset < 8*16; offset += 16) {
-                      unsigned short checksum = 0;
-                      /* verify the checksum */
-                      for (i = 0; i < 14; i++)
-                               checksum += ee[i+offset];
-                       checksum = ~checksum;  /* no idea why */
-                       if ((((checksum>>8)&0x0FF) == ee[offset+14]) &&
-                                  ((checksum & 0x0FF) == ee[offset+15])) {
-                              break;
-                      }
-              }
-
-              if (offset >= 8*16)
-                      return;
-
-              /* found a valid descriptor */
-              type = (ee[offset+4]<<8) | (ee[offset+5]);
-
-              switch(type) {
-              /* 848 based */
-              case 0x0004:
-                      btv->c.type = BTTV_BOARD_OSPREY1x0_848;
-                      break;
-              case 0x0005:
-                      btv->c.type = BTTV_BOARD_OSPREY101_848;
-                      break;
-
-              /* 878 based */
-              case 0x0012:
-              case 0x0013:
-                      btv->c.type = BTTV_BOARD_OSPREY1x0;
-                      break;
-              case 0x0014:
-              case 0x0015:
-                      btv->c.type = BTTV_BOARD_OSPREY1x1;
-                      break;
-              case 0x0016:
-              case 0x0017:
-              case 0x0020:
-                      btv->c.type = BTTV_BOARD_OSPREY1x1_SVID;
-                      break;
-              case 0x0018:
-              case 0x0019:
-              case 0x001E:
-              case 0x001F:
-                      btv->c.type = BTTV_BOARD_OSPREY2xx;
-                      break;
-              case 0x001A:
-              case 0x001B:
-                      btv->c.type = BTTV_BOARD_OSPREY2x0_SVID;
-                      break;
-              case 0x0040:
-                      btv->c.type = BTTV_BOARD_OSPREY500;
-                      break;
-              case 0x0050:
-              case 0x0056:
-                      btv->c.type = BTTV_BOARD_OSPREY540;
-                      /* bttv_osprey_540_init(btv); */
-                      break;
-              case 0x0060:
-              case 0x0070:
-              case 0x00A0:
-                      btv->c.type = BTTV_BOARD_OSPREY2x0;
-                      /* enable output on select control lines */
-                      gpio_inout(0xffffff,0x000303);
-                      break;
-              default:
-                      /* unknown...leave generic, but get serial # */
-                      break;
-              }
-              serial =  (ee[offset+6] << 24)
-                      | (ee[offset+7] << 16)
-                      | (ee[offset+8] <<  8)
-                      | (ee[offset+9]);
-       }
-
-       printk(KERN_INFO "bttv%d: osprey eeprom: card=%d name=%s serial=%ld\n",
-             btv->c.nr, btv->c.type, bttv_tvcards[btv->c.type].name,serial);
+               unsigned short type;
+
+               for (i = 4*16; i < 8*16; i += 16) {
+                       u16 checksum = ip_compute_csum(ee + i, 16);
+
+                       if ((checksum&0xff) + (checksum>>8) == 0xff)
+                               break;
+               }
+               if (i >= 8*16)
+                       return;
+               ee += i;
+
+               /* found a valid descriptor */
+               type = be16_to_cpup((u16*)(ee+4));
+
+               switch(type) {
+               /* 848 based */
+               case 0x0004:
+                       cardid = BTTV_BOARD_OSPREY1x0_848;
+                       break;
+               case 0x0005:
+                       cardid = BTTV_BOARD_OSPREY101_848;
+                       break;
+
+               /* 878 based */
+               case 0x0012:
+               case 0x0013:
+                       cardid = BTTV_BOARD_OSPREY1x0;
+                       break;
+               case 0x0014:
+               case 0x0015:
+                       cardid = BTTV_BOARD_OSPREY1x1;
+                       break;
+               case 0x0016:
+               case 0x0017:
+               case 0x0020:
+                       cardid = BTTV_BOARD_OSPREY1x1_SVID;
+                       break;
+               case 0x0018:
+               case 0x0019:
+               case 0x001E:
+               case 0x001F:
+                       cardid = BTTV_BOARD_OSPREY2xx;
+                       break;
+               case 0x001A:
+               case 0x001B:
+                       cardid = BTTV_BOARD_OSPREY2x0_SVID;
+                       break;
+               case 0x0040:
+                       cardid = BTTV_BOARD_OSPREY500;
+                       break;
+               case 0x0050:
+               case 0x0056:
+                       cardid = BTTV_BOARD_OSPREY540;
+                       /* bttv_osprey_540_init(btv); */
+                       break;
+               case 0x0060:
+               case 0x0070:
+               case 0x00A0:
+                       cardid = BTTV_BOARD_OSPREY2x0;
+                       /* enable output on select control lines */
+                       gpio_inout(0xffffff,0x000303);
+                       break;
+               case 0x00D8:
+                       cardid = BTTV_BOARD_OSPREY440;
+                       break;
+               default:
+                       /* unknown...leave generic, but get serial # */
+                       printk(KERN_INFO "bttv%d: "
+                              "osprey eeprom: unknown card type 0x%04x\n",
+                              btv->c.nr, type);
+                       break;
+               }
+               serial = be32_to_cpup((u32*)(ee+6));
+       }
+
+       printk(KERN_INFO "bttv%d: osprey eeprom: card=%d '%s' serial=%u\n",
+              btv->c.nr, cardid,
+              cardid>0 ? bttv_tvcards[cardid].name : "Unknown", serial);
+
+       if (cardid<0 || btv->c.type == cardid)
+               return;
+
+       /* card type isn't set correctly */
+       if (card[btv->c.nr] < bttv_num_tvcards) {
+               printk(KERN_WARNING "bttv%d: osprey eeprom: "
+                      "Not overriding user specified card type\n", btv->c.nr);
+       } else {
+               printk(KERN_INFO "bttv%d: osprey eeprom: "
+                      "Changing card type from %d to %d\n", btv->c.nr,
+                      btv->c.type, cardid);
+               btv->c.type = cardid;
+       }
 }
 
 /* ----------------------------------------------------------------------- */
index 91b588d261ae2a2f81189ba08c14aa7631567573..8abb34a35816917c5af6392beb873020e387dafe 100644 (file)
@@ -417,6 +417,7 @@ struct ivtv_mailbox_data {
 #define IVTV_F_I_WORK_HANDLER_YUV  17  /* there is work to be done for YUV */
 #define IVTV_F_I_WORK_HANDLER_PIO  18  /* there is work to be done for PIO */
 #define IVTV_F_I_PIO              19   /* PIO in progress */
+#define IVTV_F_I_DEC_PAUSED       20   /* the decoder is paused */
 
 /* Event notifications */
 #define IVTV_F_I_EV_DEC_STOPPED           28   /* decoder stopped event */
index 8e97a938398f729fa7386da8bde213d1ecaa30e8..5dd519caf81d5dcbe52f788d65c4e337c719ac08 100644 (file)
@@ -757,6 +757,7 @@ static void ivtv_stop_decoding(struct ivtv_open_id *id, int flags, u64 pts)
            itv->output_mode = OUT_NONE;
 
        itv->speed = 0;
+       clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
        ivtv_release_stream(s);
 }
 
@@ -799,7 +800,16 @@ int ivtv_v4l2_close(struct inode *inode, struct file *filp)
                ivtv_unmute(itv);
                ivtv_release_stream(s);
        } else if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) {
+               struct ivtv_stream *s_vout = &itv->streams[IVTV_DEC_STREAM_TYPE_VOUT];
+
                ivtv_stop_decoding(id, VIDEO_CMD_STOP_TO_BLACK | VIDEO_CMD_STOP_IMMEDIATELY, 0);
+
+               /* If all output streams are closed, and if the user doesn't have
+                  IVTV_DEC_STREAM_TYPE_VOUT open, then disable VBI on TV-out. */
+               if (itv->output_mode == OUT_NONE && !test_bit(IVTV_F_S_APPL_IO, &s_vout->s_flags)) {
+                       /* disable VBI on TV-out */
+                       ivtv_disable_vbi(itv);
+               }
        } else {
                ivtv_stop_capture(id, 0);
        }
index d0feabf9308023e3f2632cda4b27b10988e1daf3..425eb1063904726d15097f3696079497654af9e4 100644 (file)
@@ -72,8 +72,8 @@ retry:
                        dst++;
                        src++;
                }
-               release_firmware(fw);
                IVTV_INFO("Loaded %s firmware (%zd bytes)\n", fn, fw->size);
+               release_firmware(fw);
                return size;
        }
        IVTV_ERR("Unable to open firmware %s (must be %ld bytes)\n", fn, size);
index 4773453e8dab2b8e966523f2948965616ec3fdf6..047624b9e2717f0ded7af8e2403e908ee60c3091 100644 (file)
@@ -285,6 +285,10 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
 
                if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
                        return -EBUSY;
+               if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
+                       /* forces ivtv_set_speed to be called */
+                       itv->speed = 0;
+               }
                return ivtv_start_decoding(id, vc->play.speed);
        }
 
@@ -309,6 +313,7 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
                if (atomic_read(&itv->decoding) > 0) {
                        ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
                                (vc->flags & VIDEO_CMD_FREEZE_TO_BLACK) ? 1 : 0);
+                       set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
                }
                break;
 
@@ -317,8 +322,10 @@ static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
                if (try) break;
                if (itv->output_mode != OUT_MPG)
                        return -EBUSY;
-               if (atomic_read(&itv->decoding) > 0) {
-                       ivtv_vapi(itv, CX2341X_DEC_START_PLAYBACK, 2, 0, 0);
+               if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
+                       int speed = itv->speed;
+                       itv->speed = 0;
+                       return ivtv_start_decoding(id, speed);
                }
                break;
 
index 814a673712b386e3d79e245ddd9e5d733c42b50c..5e3b679202ae8a69031f4d118e42d40ae220d3ce 100644 (file)
@@ -40,6 +40,7 @@
 #define API_HIGH_VOL    (1 << 5)       /* High volume command (i.e. called during encoding or decoding) */
 #define API_NO_WAIT_MB          (1 << 4)       /* Command may not wait for a free mailbox */
 #define API_NO_WAIT_RES         (1 << 5)       /* Command may not wait for the result */
+#define API_NO_POLL     (1 << 6)       /* Avoid pointless polling */
 
 struct ivtv_api_info {
        int flags;              /* Flags, see above */
@@ -51,7 +52,7 @@ struct ivtv_api_info {
 static const struct ivtv_api_info api_info[256] = {
        /* MPEG encoder API */
        API_ENTRY(CX2341X_ENC_PING_FW,                  API_FAST_RESULT),
-       API_ENTRY(CX2341X_ENC_START_CAPTURE,            API_RESULT),
+       API_ENTRY(CX2341X_ENC_START_CAPTURE,            API_RESULT | API_NO_POLL),
        API_ENTRY(CX2341X_ENC_STOP_CAPTURE,             API_RESULT),
        API_ENTRY(CX2341X_ENC_SET_AUDIO_ID,             API_CACHE),
        API_ENTRY(CX2341X_ENC_SET_VIDEO_ID,             API_CACHE),
@@ -96,7 +97,7 @@ static const struct ivtv_api_info api_info[256] = {
 
        /* MPEG decoder API */
        API_ENTRY(CX2341X_DEC_PING_FW,                  API_FAST_RESULT),
-       API_ENTRY(CX2341X_DEC_START_PLAYBACK,           API_RESULT),
+       API_ENTRY(CX2341X_DEC_START_PLAYBACK,           API_RESULT | API_NO_POLL),
        API_ENTRY(CX2341X_DEC_STOP_PLAYBACK,            API_RESULT),
        API_ENTRY(CX2341X_DEC_SET_PLAYBACK_SPEED,       API_RESULT),
        API_ENTRY(CX2341X_DEC_STEP_VIDEO,               API_RESULT),
@@ -290,6 +291,13 @@ static int ivtv_api_call(struct ivtv *itv, int cmd, int args, u32 data[])
        /* Get results */
        then = jiffies;
 
+       if (!(flags & API_NO_POLL)) {
+               /* First try to poll, then switch to delays */
+               for (i = 0; i < 100; i++) {
+                       if (readl(&mbox->flags) & IVTV_MBOX_FIRMWARE_DONE)
+                               break;
+               }
+       }
        while (!(readl(&mbox->flags) & IVTV_MBOX_FIRMWARE_DONE)) {
                if (jiffies - then > api_timeout) {
                        IVTV_DEBUG_WARN("Could not get result (%s)\n", api_info[cmd].name);
@@ -301,7 +309,7 @@ static int ivtv_api_call(struct ivtv *itv, int cmd, int args, u32 data[])
                if (flags & API_NO_WAIT_RES)
                        mdelay(1);
                else
-                       ivtv_msleep_timeout(10, 0);
+                       ivtv_msleep_timeout(1, 0);
        }
        if (jiffies - then > msecs_to_jiffies(100))
                IVTV_DEBUG_WARN("%s took %u jiffies\n",
index 322b347b67c28905ccf00091a1a189dfe1c800bb..51df3f8550310f2ffdc0b3c5c937ca14ac1bdde1 100644 (file)
@@ -603,10 +603,6 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s)
 
        IVTV_DEBUG_INFO("Setting some initial decoder settings\n");
 
-       /* disable VBI signals, if the MPEG stream contains VBI data,
-          then that data will be processed automatically for you. */
-       ivtv_disable_vbi(itv);
-
        /* set audio mode to left/stereo  for dual/stereo mode. */
        ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
 
@@ -639,7 +635,7 @@ static int ivtv_setup_v4l2_decode_stream(struct ivtv_stream *s)
        }
        if (ivtv_vapi(itv, CX2341X_DEC_SET_DECODER_SOURCE, 4, datatype,
                        itv->params.width, itv->params.height, itv->params.audio_properties)) {
-               IVTV_DEBUG_WARN("COULDN'T INITIALIZE DECODER SOURCE\n");
+               IVTV_DEBUG_WARN("Couldn't initialize decoder source\n");
        }
        return 0;
 }
@@ -909,11 +905,6 @@ int ivtv_stop_v4l2_decode_stream(struct ivtv_stream *s, int flags, u64 pts)
        clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
        ivtv_flush_queues(s);
 
-       if (!test_bit(IVTV_F_S_PASSTHROUGH, &s->s_flags)) {
-               /* disable VBI on TV-out */
-               ivtv_disable_vbi(itv);
-       }
-
        /* decrement decoding */
        atomic_dec(&itv->decoding);
 
index 868b6886fe7fcb44d892c4b7090213eb01342b89..e3371f972240a896b930fd03107f12882aedf064 100644 (file)
@@ -517,6 +517,7 @@ static int vidioc_g_register (struct file *file, void *priv,
                    __FUNCTION__, errCode);
                return errCode;
        }
+       reg->val = errCode;
        return 0;
 }
 
@@ -531,8 +532,8 @@ static int vidioc_s_register (struct file *file, void *priv,
        if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
                return -EINVAL;
        /* NT100x has a 8-bit register space */
-       reg->val = (u8)usbvision_write_reg(usbvision, reg->reg&0xff, reg->val);
-       if (reg->val < 0) {
+       errCode = usbvision_write_reg(usbvision, reg->reg&0xff, reg->val);
+       if (errCode < 0) {
                err("%s: VIDIOC_DBG_S_REGISTER failed: error %d",
                    __FUNCTION__, errCode);
                return errCode;
index 8fb4a3414e0a7441d0f13ca3749bc551051447d1..937c4a616c0e3fbb7e9244de9e25d4b103aac12a 100644 (file)
@@ -240,11 +240,16 @@ enum gpcs_type {
 
 struct zoran_format {
        char *name;
+#ifdef CONFIG_VIDEO_V4L1_COMPAT
        int palette;
+#endif
+#ifdef CONFIG_VIDEO_V4L2
        __u32 fourcc;
        int colorspace;
+#endif
        int depth;
        __u32 flags;
+       __u32 vfespfr;
 };
 /* flags */
 #define ZORAN_FORMAT_COMPRESSED 1<<0
index b0752767ee4f5195df9144a42712837d4eedfd47..ba2f4ed294836586fe36e8560ab54e5cc6389918 100644 (file)
@@ -429,8 +429,6 @@ zr36057_set_vfe (struct zoran              *zr,
        reg |= (HorDcm << ZR36057_VFESPFR_HorDcm);
        reg |= (VerDcm << ZR36057_VFESPFR_VerDcm);
        reg |= (DispMode << ZR36057_VFESPFR_DispMode);
-       if (format->palette != VIDEO_PALETTE_YUV422 && format->palette != VIDEO_PALETTE_YUYV)
-               reg |= ZR36057_VFESPFR_LittleEndian;
        /* RJ: I don't know, why the following has to be the opposite
         * of the corresponding ZR36060 setting, but only this way
         * we get the correct colors when uncompressing to the screen  */
@@ -439,36 +437,6 @@ zr36057_set_vfe (struct zoran              *zr,
        if (zr->norm != VIDEO_MODE_NTSC)
                reg |= ZR36057_VFESPFR_ExtFl;   // NEEDED!!!!!!! Wolfgang
        reg |= ZR36057_VFESPFR_TopField;
-       switch (format->palette) {
-
-       case VIDEO_PALETTE_YUYV:
-       case VIDEO_PALETTE_YUV422:
-               reg |= ZR36057_VFESPFR_YUV422;
-               break;
-
-       case VIDEO_PALETTE_RGB555:
-               reg |= ZR36057_VFESPFR_RGB555 | ZR36057_VFESPFR_ErrDif;
-               break;
-
-       case VIDEO_PALETTE_RGB565:
-               reg |= ZR36057_VFESPFR_RGB565 | ZR36057_VFESPFR_ErrDif;
-               break;
-
-       case VIDEO_PALETTE_RGB24:
-               reg |= ZR36057_VFESPFR_RGB888 | ZR36057_VFESPFR_Pack24;
-               break;
-
-       case VIDEO_PALETTE_RGB32:
-               reg |= ZR36057_VFESPFR_RGB888;
-               break;
-
-       default:
-               dprintk(1,
-                       KERN_INFO "%s: set_vfe() - unknown color_fmt=%x\n",
-                       ZR_DEVNAME(zr), format->palette);
-               return;
-
-       }
        if (HorDcm >= 48) {
                reg |= 3 << ZR36057_VFESPFR_HFilter;    /* 5 tap filter */
        } else if (HorDcm >= 32) {
@@ -476,6 +444,7 @@ zr36057_set_vfe (struct zoran              *zr,
        } else if (HorDcm >= 16) {
                reg |= 1 << ZR36057_VFESPFR_HFilter;    /* 3 tap filter */
        }
+       reg |= format->vfespfr;
        btwrite(reg, ZR36057_VFESPFR);
 
        /* display configuration */
@@ -651,11 +620,17 @@ zr36057_set_memgrab (struct zoran *zr,
                     int           mode)
 {
        if (mode) {
-               if (btread(ZR36057_VSSFGR) &
-                   (ZR36057_VSSFGR_SnapShot | ZR36057_VSSFGR_FrameGrab))
+               /* We only check SnapShot and not FrameGrab here.  SnapShot==1
+                * means a capture is already in progress, but FrameGrab==1
+                * doesn't necessary mean that.  It's more correct to say a 1
+                * to 0 transition indicates a capture completed.  If a
+                * capture is pending when capturing is tuned off, FrameGrab
+                * will be stuck at 1 until capturing is turned back on.
+                */
+               if (btread(ZR36057_VSSFGR) & ZR36057_VSSFGR_SnapShot)
                        dprintk(1,
                                KERN_WARNING
-                               "%s: zr36057_set_memgrab(1) with SnapShot or FrameGrab on!?\n",
+                               "%s: zr36057_set_memgrab(1) with SnapShot on!?\n",
                                ZR_DEVNAME(zr));
 
                /* switch on VSync interrupts */
@@ -672,11 +647,12 @@ zr36057_set_memgrab (struct zoran *zr,
 
                zr->v4l_memgrab_active = 1;
        } else {
-               zr->v4l_memgrab_active = 0;
-
                /* switch off VSync interrupts */
                btand(~zr->card.vsync_int, ZR36057_ICR);        // SW
 
+               zr->v4l_memgrab_active = 0;
+               zr->v4l_grab_frame = NO_GRAB_ACTIVE;
+
                /* reenable grabbing to screen if it was running */
                if (zr->v4l_overlay_active) {
                        zr36057_overlay(zr, 1);
index 17118a490f8166cb2d3ddffdf7c304a473d4287d..72a037b75d63af058f8a7869eca4bb4a8c8af824 100644 (file)
 
 #include <asm/byteorder.h>
 
-const struct zoran_format zoran_formats[] = {
-       {
-               .name = "15-bit RGB",
-               .palette = VIDEO_PALETTE_RGB555,
-#ifdef CONFIG_VIDEO_V4L2
-#ifdef __LITTLE_ENDIAN
-               .fourcc = V4L2_PIX_FMT_RGB555,
+#if defined(CONFIG_VIDEO_V4L2) && defined(CONFIG_VIDEO_V4L1_COMPAT)
+#define ZFMT(pal, fcc, cs) \
+       .palette = (pal), .fourcc = (fcc), .colorspace = (cs)
+#elif defined(CONFIG_VIDEO_V4L2)
+#define ZFMT(pal, fcc, cs) \
+       .fourcc = (fcc), .colorspace = (cs)
 #else
-               .fourcc = V4L2_PIX_FMT_RGB555X,
-#endif
-               .colorspace = V4L2_COLORSPACE_SRGB,
+#define ZFMT(pal, fcc, cs) \
+       .palette = (pal)
 #endif
+
+const struct zoran_format zoran_formats[] = {
+       {
+               .name = "15-bit RGB LE",
+               ZFMT(VIDEO_PALETTE_RGB555,
+                    V4L2_PIX_FMT_RGB555, V4L2_COLORSPACE_SRGB),
                .depth = 15,
                .flags = ZORAN_FORMAT_CAPTURE |
                         ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif|
+                          ZR36057_VFESPFR_LittleEndian,
        }, {
-               .name = "16-bit RGB",
-               .palette = VIDEO_PALETTE_RGB565,
-#ifdef CONFIG_VIDEO_V4L2
-#ifdef __LITTLE_ENDIAN
-               .fourcc = V4L2_PIX_FMT_RGB565,
-#else
-               .fourcc = V4L2_PIX_FMT_RGB565X,
-#endif
-               .colorspace = V4L2_COLORSPACE_SRGB,
-#endif
+               .name = "15-bit RGB BE",
+               ZFMT(-1,
+                    V4L2_PIX_FMT_RGB555X, V4L2_COLORSPACE_SRGB),
+               .depth = 15,
+               .flags = ZORAN_FORMAT_CAPTURE |
+                        ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB555|ZR36057_VFESPFR_ErrDif,
+       }, {
+               .name = "16-bit RGB LE",
+               ZFMT(VIDEO_PALETTE_RGB565,
+                    V4L2_PIX_FMT_RGB565, V4L2_COLORSPACE_SRGB),
                .depth = 16,
                .flags = ZORAN_FORMAT_CAPTURE |
                         ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif|
+                          ZR36057_VFESPFR_LittleEndian,
+       }, {
+               .name = "16-bit RGB BE",
+               ZFMT(-1,
+                    V4L2_PIX_FMT_RGB565, V4L2_COLORSPACE_SRGB),
+               .depth = 16,
+               .flags = ZORAN_FORMAT_CAPTURE |
+                        ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB565|ZR36057_VFESPFR_ErrDif,
        }, {
                .name = "24-bit RGB",
-               .palette = VIDEO_PALETTE_RGB24,
-#ifdef CONFIG_VIDEO_V4L2
-#ifdef __LITTLE_ENDIAN
-               .fourcc = V4L2_PIX_FMT_BGR24,
-#else
-               .fourcc = V4L2_PIX_FMT_RGB24,
-#endif
-               .colorspace = V4L2_COLORSPACE_SRGB,
-#endif
+               ZFMT(VIDEO_PALETTE_RGB24,
+                    V4L2_PIX_FMT_BGR24, V4L2_COLORSPACE_SRGB),
                .depth = 24,
                .flags = ZORAN_FORMAT_CAPTURE |
                         ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_Pack24,
        }, {
-               .name = "32-bit RGB",
-               .palette = VIDEO_PALETTE_RGB32,
-#ifdef CONFIG_VIDEO_V4L2
-#ifdef __LITTLE_ENDIAN
-               .fourcc = V4L2_PIX_FMT_BGR32,
-#else
-               .fourcc = V4L2_PIX_FMT_RGB32,
-#endif
-               .colorspace = V4L2_COLORSPACE_SRGB,
-#endif
+               .name = "32-bit RGB LE",
+               ZFMT(VIDEO_PALETTE_RGB32,
+                    V4L2_PIX_FMT_BGR32, V4L2_COLORSPACE_SRGB),
+               .depth = 32,
+               .flags = ZORAN_FORMAT_CAPTURE |
+                        ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB888|ZR36057_VFESPFR_LittleEndian,
+       }, {
+               .name = "32-bit RGB BE",
+               ZFMT(-1,
+                    V4L2_PIX_FMT_RGB32, V4L2_COLORSPACE_SRGB),
                .depth = 32,
                .flags = ZORAN_FORMAT_CAPTURE |
                         ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_RGB888,
        }, {
                .name = "4:2:2, packed, YUYV",
-               .palette = VIDEO_PALETTE_YUV422,
-#ifdef CONFIG_VIDEO_V4L2
-               .fourcc = V4L2_PIX_FMT_YUYV,
-               .colorspace = V4L2_COLORSPACE_SMPTE170M,
-#endif
+               ZFMT(VIDEO_PALETTE_YUV422,
+                    V4L2_PIX_FMT_YUYV, V4L2_COLORSPACE_SMPTE170M),
+               .depth = 16,
+               .flags = ZORAN_FORMAT_CAPTURE |
+                        ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_YUV422,
+       }, {
+               .name = "4:2:2, packed, UYVY",
+               ZFMT(VIDEO_PALETTE_UYVY,
+                    V4L2_PIX_FMT_UYVY, V4L2_COLORSPACE_SMPTE170M),
                .depth = 16,
                .flags = ZORAN_FORMAT_CAPTURE |
                         ZORAN_FORMAT_OVERLAY,
+               .vfespfr = ZR36057_VFESPFR_YUV422|ZR36057_VFESPFR_LittleEndian,
        }, {
                .name = "Hardware-encoded Motion-JPEG",
-               .palette = -1,
-#ifdef CONFIG_VIDEO_V4L2
-               .fourcc = V4L2_PIX_FMT_MJPEG,
-               .colorspace = V4L2_COLORSPACE_SMPTE170M,
-#endif
+               ZFMT(-1,
+                    V4L2_PIX_FMT_MJPEG, V4L2_COLORSPACE_SMPTE170M),
                .depth = 0,
                .flags = ZORAN_FORMAT_CAPTURE |
                         ZORAN_FORMAT_PLAYBACK |
                         ZORAN_FORMAT_COMPRESSED,
        }
 };
-static const int zoran_num_formats =
-    (sizeof(zoran_formats) / sizeof(struct zoran_format));
+#define NUM_FORMATS ARRAY_SIZE(zoran_formats)
 
 // RJ: Test only - want to test BUZ_USE_HIMEM even when CONFIG_BIGPHYS_AREA is defined
 
@@ -768,13 +783,13 @@ v4l_grab (struct file       *file,
        struct zoran *zr = fh->zr;
        int res = 0, i;
 
-       for (i = 0; i < zoran_num_formats; i++) {
+       for (i = 0; i < NUM_FORMATS; i++) {
                if (zoran_formats[i].palette == mp->format &&
                    zoran_formats[i].flags & ZORAN_FORMAT_CAPTURE &&
                    !(zoran_formats[i].flags & ZORAN_FORMAT_COMPRESSED))
                        break;
        }
-       if (i == zoran_num_formats || zoran_formats[i].depth == 0) {
+       if (i == NUM_FORMATS || zoran_formats[i].depth == 0) {
                dprintk(1,
                        KERN_ERR
                        "%s: v4l_grab() - wrong bytes-per-pixel format\n",
@@ -1173,10 +1188,14 @@ zoran_close_end_session (struct file *file)
 
        /* v4l capture */
        if (fh->v4l_buffers.active != ZORAN_FREE) {
+               long flags;
+
+               spin_lock_irqsave(&zr->spinlock, flags);
                zr36057_set_memgrab(zr, 0);
                zr->v4l_buffers.allocated = 0;
                zr->v4l_buffers.active = fh->v4l_buffers.active =
                    ZORAN_FREE;
+               spin_unlock_irqrestore(&zr->spinlock, flags);
        }
 
        /* v4l buffers */
@@ -2107,7 +2126,7 @@ zoran_do_ioctl (struct inode *inode,
                        vpict->colour, vpict->contrast, vpict->depth,
                        vpict->palette);
 
-               for (i = 0; i < zoran_num_formats; i++) {
+               for (i = 0; i < NUM_FORMATS; i++) {
                        const struct zoran_format *fmt = &zoran_formats[i];
 
                        if (fmt->palette != -1 &&
@@ -2116,7 +2135,7 @@ zoran_do_ioctl (struct inode *inode,
                            fmt->depth == vpict->depth)
                                break;
                }
-               if (i == zoran_num_formats) {
+               if (i == NUM_FORMATS) {
                        dprintk(1,
                                KERN_ERR
                                "%s: VIDIOCSPICT - Invalid palette %d\n",
@@ -2220,10 +2239,10 @@ zoran_do_ioctl (struct inode *inode,
                        ZR_DEVNAME(zr), vbuf->base, vbuf->width,
                        vbuf->height, vbuf->depth, vbuf->bytesperline);
 
-               for (i = 0; i < zoran_num_formats; i++)
+               for (i = 0; i < NUM_FORMATS; i++)
                        if (zoran_formats[i].depth == vbuf->depth)
                                break;
-               if (i == zoran_num_formats) {
+               if (i == NUM_FORMATS) {
                        dprintk(1,
                                KERN_ERR
                                "%s: VIDIOCSFBUF - invalid fbuf depth %d\n",
@@ -2672,14 +2691,14 @@ zoran_do_ioctl (struct inode *inode,
                        return -EINVAL;
                }
 
-               for (i = 0; i < zoran_num_formats; i++) {
+               for (i = 0; i < NUM_FORMATS; i++) {
                        if (zoran_formats[i].flags & flag)
                                num++;
                        if (num == fmt->index)
                                break;
                }
                if (fmt->index < 0 /* late, but not too late */  ||
-                   i == zoran_num_formats)
+                   i == NUM_FORMATS)
                        return -EINVAL;
 
                memset(fmt, 0, sizeof(*fmt));
@@ -2737,7 +2756,8 @@ zoran_do_ioctl (struct inode *inode,
                                fmt->fmt.pix.height =
                                    fh->v4l_settings.height;
                                fmt->fmt.pix.sizeimage =
-                                   fh->v4l_buffers.buffer_size;
+                                   fh->v4l_settings.bytesperline *
+                                   fh->v4l_settings.height;
                                fmt->fmt.pix.pixelformat =
                                    fh->v4l_settings.format->fourcc;
                                fmt->fmt.pix.colorspace =
@@ -2941,11 +2961,11 @@ zoran_do_ioctl (struct inode *inode,
                        sfmtjpg_unlock_and_return:
                                mutex_unlock(&zr->resource_lock);
                        } else {
-                               for (i = 0; i < zoran_num_formats; i++)
+                               for (i = 0; i < NUM_FORMATS; i++)
                                        if (fmt->fmt.pix.pixelformat ==
                                            zoran_formats[i].fourcc)
                                                break;
-                               if (i == zoran_num_formats) {
+                               if (i == NUM_FORMATS) {
                                        dprintk(1,
                                                KERN_ERR
                                                "%s: VIDIOC_S_FMT - unknown/unsupported format 0x%x (%4.4s)\n",
@@ -2984,8 +3004,9 @@ zoran_do_ioctl (struct inode *inode,
 
                                /* tell the user the
                                 * results/missing stuff */
-                               fmt->fmt.pix.sizeimage = fh->v4l_buffers.buffer_size    /*zr->gbpl * zr->gheight */
-                                   ;
+                               fmt->fmt.pix.sizeimage =
+                                       fh->v4l_settings.height *
+                                       fh->v4l_settings.bytesperline;
                                if (BUZ_MAX_HEIGHT <
                                    (fh->v4l_settings.height * 2))
                                        fmt->fmt.pix.field =
@@ -3053,10 +3074,10 @@ zoran_do_ioctl (struct inode *inode,
                        fb->fmt.bytesperline, fb->fmt.pixelformat,
                        (char *) &printformat);
 
-               for (i = 0; i < zoran_num_formats; i++)
+               for (i = 0; i < NUM_FORMATS; i++)
                        if (zoran_formats[i].fourcc == fb->fmt.pixelformat)
                                break;
-               if (i == zoran_num_formats) {
+               if (i == NUM_FORMATS) {
                        dprintk(1,
                                KERN_ERR
                                "%s: VIDIOC_S_FBUF - format=0x%x (%4.4s) not allowed\n",
@@ -3439,8 +3460,13 @@ zoran_do_ioctl (struct inode *inode,
                                goto strmoff_unlock_and_return;
 
                        /* unload capture */
-                       if (zr->v4l_memgrab_active)
+                       if (zr->v4l_memgrab_active) {
+                               long flags;
+
+                               spin_lock_irqsave(&zr->spinlock, flags);
                                zr36057_set_memgrab(zr, 0);
+                               spin_unlock_irqrestore(&zr->spinlock, flags);
+                       }
 
                        for (i = 0; i < fh->v4l_buffers.num_buffers; i++)
                                zr->v4l_buffers.buffer[i].state =
@@ -3704,11 +3730,11 @@ zoran_do_ioctl (struct inode *inode,
                dprintk(3, KERN_DEBUG "%s: VIDIOC_S_STD - norm=0x%llx\n",
                        ZR_DEVNAME(zr), (unsigned long long)*std);
 
-               if (*std == V4L2_STD_PAL)
+               if ((*std & V4L2_STD_PAL) && !(*std & ~V4L2_STD_PAL))
                        norm = VIDEO_MODE_PAL;
-               else if (*std == V4L2_STD_NTSC)
+               else if ((*std & V4L2_STD_NTSC) && !(*std & ~V4L2_STD_NTSC))
                        norm = VIDEO_MODE_NTSC;
-               else if (*std == V4L2_STD_SECAM)
+               else if ((*std & V4L2_STD_SECAM) && !(*std & ~V4L2_STD_SECAM))
                        norm = VIDEO_MODE_SECAM;
                else if (*std == V4L2_STD_ALL)
                        norm = VIDEO_MODE_AUTO;
@@ -4149,11 +4175,11 @@ zoran_do_ioctl (struct inode *inode,
                                   V4L2_BUF_TYPE_VIDEO_CAPTURE) {
                                int i;
 
-                               for (i = 0; i < zoran_num_formats; i++)
+                               for (i = 0; i < NUM_FORMATS; i++)
                                        if (zoran_formats[i].fourcc ==
                                            fmt->fmt.pix.pixelformat)
                                                break;
-                               if (i == zoran_num_formats) {
+                               if (i == NUM_FORMATS) {
                                        res = -EINVAL;
                                        goto tryfmt_unlock_and_return;
                                }
@@ -4213,8 +4239,8 @@ zoran_poll (struct file *file,
 {
        struct zoran_fh *fh = file->private_data;
        struct zoran *zr = fh->zr;
-       wait_queue_head_t *queue = NULL;
        int res = 0, frame;
+       unsigned long flags;
 
        /* we should check whether buffers are ready to be synced on
         * (w/o waits - O_NONBLOCK) here
@@ -4228,51 +4254,58 @@ zoran_poll (struct file *file,
 
        switch (fh->map_mode) {
        case ZORAN_MAP_MODE_RAW:
-               if (fh->v4l_buffers.active == ZORAN_FREE ||
-                   zr->v4l_pend_head == zr->v4l_pend_tail) {
-                       dprintk(1,
-                               "%s: zoran_poll() - no buffers queued\n",
-                               ZR_DEVNAME(zr));
-                       res = POLLNVAL;
-                       goto poll_unlock_and_return;
-               }
-               queue = &zr->v4l_capq;
-               frame = zr->v4l_pend[zr->v4l_pend_tail & V4L_MASK_FRAME];
-               poll_wait(file, queue, wait);
-               if (fh->v4l_buffers.buffer[frame].state == BUZ_STATE_DONE)
+               poll_wait(file, &zr->v4l_capq, wait);
+               frame = zr->v4l_pend[zr->v4l_sync_tail & V4L_MASK_FRAME];
+
+               spin_lock_irqsave(&zr->spinlock, flags);
+               dprintk(3,
+                       KERN_DEBUG
+                       "%s: %s() raw - active=%c, sync_tail=%lu/%c, pend_tail=%lu, pend_head=%lu\n",
+                       ZR_DEVNAME(zr), __FUNCTION__,
+                       "FAL"[fh->v4l_buffers.active], zr->v4l_sync_tail,
+                       "UPMD"[zr->v4l_buffers.buffer[frame].state],
+                       zr->v4l_pend_tail, zr->v4l_pend_head);
+               /* Process is the one capturing? */
+               if (fh->v4l_buffers.active != ZORAN_FREE &&
+                   /* Buffer ready to DQBUF? */
+                   zr->v4l_buffers.buffer[frame].state == BUZ_STATE_DONE)
                        res = POLLIN | POLLRDNORM;
+               spin_unlock_irqrestore(&zr->spinlock, flags);
+
                break;
 
        case ZORAN_MAP_MODE_JPG_REC:
        case ZORAN_MAP_MODE_JPG_PLAY:
-               if (fh->jpg_buffers.active == ZORAN_FREE ||
-                   zr->jpg_que_head == zr->jpg_que_tail) {
-                       dprintk(1,
-                               "%s: zoran_poll() - no buffers queued\n",
-                               ZR_DEVNAME(zr));
-                       res = POLLNVAL;
-                       goto poll_unlock_and_return;
-               }
-               queue = &zr->jpg_capq;
+               poll_wait(file, &zr->jpg_capq, wait);
                frame = zr->jpg_pend[zr->jpg_que_tail & BUZ_MASK_FRAME];
-               poll_wait(file, queue, wait);
-               if (fh->jpg_buffers.buffer[frame].state == BUZ_STATE_DONE) {
+
+               spin_lock_irqsave(&zr->spinlock, flags);
+               dprintk(3,
+                       KERN_DEBUG
+                       "%s: %s() jpg - active=%c, que_tail=%lu/%c, que_head=%lu, dma=%lu/%lu\n",
+                       ZR_DEVNAME(zr), __FUNCTION__,
+                       "FAL"[fh->jpg_buffers.active], zr->jpg_que_tail,
+                       "UPMD"[zr->jpg_buffers.buffer[frame].state],
+                       zr->jpg_que_head, zr->jpg_dma_tail, zr->jpg_dma_head);
+               if (fh->jpg_buffers.active != ZORAN_FREE &&
+                   zr->jpg_buffers.buffer[frame].state == BUZ_STATE_DONE) {
                        if (fh->map_mode == ZORAN_MAP_MODE_JPG_REC)
                                res = POLLIN | POLLRDNORM;
                        else
                                res = POLLOUT | POLLWRNORM;
                }
+               spin_unlock_irqrestore(&zr->spinlock, flags);
+
                break;
 
        default:
                dprintk(1,
+                       KERN_ERR
                        "%s: zoran_poll() - internal error, unknown map_mode=%d\n",
                        ZR_DEVNAME(zr), fh->map_mode);
                res = POLLNVAL;
-               goto poll_unlock_and_return;
        }
 
-poll_unlock_and_return:
        mutex_unlock(&zr->resource_lock);
 
        return res;
@@ -4368,11 +4401,15 @@ zoran_vm_close (struct vm_area_struct *vma)
                                mutex_lock(&zr->resource_lock);
 
                                if (fh->v4l_buffers.active != ZORAN_FREE) {
+                                       long flags;
+
+                                       spin_lock_irqsave(&zr->spinlock, flags);
                                        zr36057_set_memgrab(zr, 0);
                                        zr->v4l_buffers.allocated = 0;
                                        zr->v4l_buffers.active =
                                            fh->v4l_buffers.active =
                                            ZORAN_FREE;
+                                       spin_unlock_irqrestore(&zr->spinlock, flags);
                                }
                                //v4l_fbuffer_free(file);
                                fh->v4l_buffers.allocated = 0;
index 4494e0fd36c623088858fd5c0f61bb14f050d41d..f55cc03a75c9a8a5135a670ad3ad7f320b9b7a1f 100644 (file)
@@ -102,4 +102,18 @@ config FUSION_LAN
 
          If unsure whether you really want or need this, say N.
 
+config FUSION_LOGGING
+       bool "Fusion MPT logging facility"
+       depends on FUSION
+       ---help---
+         This turns on a logging facility that can be used to debug a number
+         of Fusion MPT related problems.
+
+         The debug level can be programmed on the fly via SysFS (hex values)
+
+         echo [level] > /sys/class/scsi_host/host#/debug_level
+
+         There are various debug levels that an be found in the source:
+         file:drivers/message/fusion/mptdebug.h
+
 endmenu
index 6003b46c8438163367695238695171c3d59cb8e7..95c9532cb07ca693cd39a6f37a49c9debe3db9d6 100644 (file)
@@ -1,39 +1,8 @@
 # Fusion MPT drivers; recognized debug defines...
-#  MPT general:
-#EXTRA_CFLAGS += -DMPT_DEBUG
-#EXTRA_CFLAGS += -DMPT_DEBUG_MSG_FRAME
-#EXTRA_CFLAGS += -DMPT_DEBUG_SG
-#EXTRA_CFLAGS += -DMPT_DEBUG_EVENTS
-#EXTRA_CFLAGS += -DMPT_DEBUG_VERBOSE_EVENTS
-#EXTRA_CFLAGS += -DMPT_DEBUG_INIT
-#EXTRA_CFLAGS += -DMPT_DEBUG_EXIT
-#EXTRA_CFLAGS += -DMPT_DEBUG_FAIL
-#EXTRA_CFLAGS += -DMPT_DEBUG_DV
-#EXTRA_CFLAGS += -DMPT_DEBUG_TM
-#EXTRA_CFLAGS += -DMPT_DEBUG_REPLY
 
-#
-# driver/module specifics...
-#
-#  For mptbase:
-#CFLAGS_mptbase.o += -DMPT_DEBUG_HANDSHAKE
-#CFLAGS_mptbase.o += -DMPT_DEBUG_CONFIG
-#CFLAGS_mptbase.o += -DMPT_DEBUG_DL
-#CFLAGS_mptbase.o += -DMPT_DEBUG_IRQ
-#CFLAGS_mptbase.o += -DMPT_DEBUG_RESET
-#
-#  For mptscsih:
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_SCSI
-#
-#  For mptctl:
-#CFLAGS_mptctl.o += -DMPT_DEBUG_IOCTL
-#
-#  For mptfc:
-#CFLAGS_mptfc.o += -DMPT_DEBUG_FC
-
-#  For mptsas:
-#CFLAGS_mptsas.o += -DMPT_DEBUG_SAS
-#CFLAGS_mptsas.o += -DMPT_DEBUG_SAS_WIDE
+# enable verbose logging
+# CONFIG_FUSION_LOGGING needs to be enabled in Kconfig
+#EXTRA_CFLAGS += -DMPT_DEBUG_VERBOSE
 
 
 #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-} LSI_LOGIC
index 04f75e24dcecb2cd513a1275df597ed914ea7676..e866dacde7e5779b276fef36578256450a7856e0 100644 (file)
@@ -87,6 +87,10 @@ static int mpt_channel_mapping;
 module_param(mpt_channel_mapping, int, 0);
 MODULE_PARM_DESC(mpt_channel_mapping, " Mapping id's to channels (default=0)");
 
+static int mpt_debug_level;
+module_param(mpt_debug_level, int, 0);
+MODULE_PARM_DESC(mpt_debug_level, " debug level - refer to mptdebug.h - (default=0)");
+
 #ifdef MFCNT
 static int mfcounter = 0;
 #define PRINT_MF_COUNT 20000
@@ -179,9 +183,7 @@ static void mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc);
 
 //int          mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
 static int     ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers);
-#ifdef MPT_DEBUG_REPLY
 static void    mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
-#endif
 static void    mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info);
@@ -229,7 +231,7 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)
        int req_idx = 0;
        int cb_idx;
 
-       dmfprintk((MYIOC_s_INFO_FMT "Got TURBO reply req_idx=%08x\n",
+       dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got TURBO reply req_idx=%08x\n",
                                ioc->name, pa));
 
        switch (pa >> MPI_CONTEXT_REPLY_TYPE_SHIFT) {
@@ -312,9 +314,9 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
        cb_idx = mr->u.frame.hwhdr.msgctxu.fld.cb_idx;
        mf = MPT_INDEX_2_MFPTR(ioc, req_idx);
 
-       dmfprintk((MYIOC_s_INFO_FMT "Got non-TURBO reply=%p req_idx=%x cb_idx=%x Function=%x\n",
+       dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got non-TURBO reply=%p req_idx=%x cb_idx=%x Function=%x\n",
                        ioc->name, mr, req_idx, cb_idx, mr->u.hdr.Function));
-       DBG_DUMP_REPLY_FRAME(mr)
+       DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mr)
 
         /*  Check/log IOC log info
         */
@@ -329,10 +331,8 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
                        mpt_sas_log_info(ioc, log_info);
        }
 
-#ifdef MPT_DEBUG_REPLY
        if (ioc_stat & MPI_IOCSTATUS_MASK)
                mpt_iocstatus_info(ioc, (u32)ioc_stat, mf);
-#endif
 
        /*  Check for (valid) IO callback!  */
        if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
@@ -414,17 +414,17 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
        int freereq = 1;
        u8 func;
 
-       dmfprintk((MYIOC_s_INFO_FMT "mpt_base_reply() called\n", ioc->name));
-
-#if defined(MPT_DEBUG_MSG_FRAME)
-       if (!(reply->u.hdr.MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY)) {
-               dmfprintk((KERN_INFO MYNAM ": Original request frame (@%p) header\n", mf));
-               DBG_DUMP_REQUEST_FRAME_HDR(mf)
+       dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_base_reply() called\n", ioc->name));
+#ifdef CONFIG_FUSION_LOGGING
+       if ((ioc->debug_level & MPT_DEBUG_MSG_FRAME) &&
+                       !(reply->u.hdr.MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY)) {
+               dmfprintk(ioc, printk(KERN_INFO MYNAM ": Original request frame (@%p) header\n", mf));
+               DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)mf)
        }
 #endif
 
        func = reply->u.hdr.Function;
-       dmfprintk((MYIOC_s_INFO_FMT "mpt_base_reply, Function=%02Xh\n",
+       dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_base_reply, Function=%02Xh\n",
                        ioc->name, func));
 
        if (func == MPI_FUNCTION_EVENT_NOTIFICATION) {
@@ -435,7 +435,7 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
                results = ProcessEventNotification(ioc, pEvReply, &evHandlers);
                if (results != evHandlers) {
                        /* CHECKME! Any special handling needed here? */
-                       devtverboseprintk((MYIOC_s_WARN_FMT "Called %d event handlers, sum results = %d\n",
+                       devtverboseprintk(ioc, printk(MYIOC_s_WARN_FMT "Called %d event handlers, sum results = %d\n",
                                        ioc->name, evHandlers, results));
                }
 
@@ -446,7 +446,7 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
                if (pEvReply->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) {
                        freereq = 0;
                } else {
-                       devtverboseprintk((MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p returns Request frame\n",
+                       devtverboseprintk(ioc, printk(MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p returns Request frame\n",
                                ioc->name, pEvReply));
                }
 
@@ -455,13 +455,13 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
 #endif
 
        } else if (func == MPI_FUNCTION_EVENT_ACK) {
-               dprintk((MYIOC_s_INFO_FMT "mpt_base_reply, EventAck reply received\n",
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_base_reply, EventAck reply received\n",
                                ioc->name));
        } else if (func == MPI_FUNCTION_CONFIG) {
                CONFIGPARMS *pCfg;
                unsigned long flags;
 
-               dcprintk((MYIOC_s_INFO_FMT "config_complete (mf=%p,mr=%p)\n",
+               dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "config_complete (mf=%p,mr=%p)\n",
                                ioc->name, mf, reply));
 
                pCfg = * ((CONFIGPARMS **)((u8 *) mf + ioc->req_sz - sizeof(void *)));
@@ -484,7 +484,7 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
                                u16              status;
 
                                status = le16_to_cpu(pReply->IOCStatus) & MPI_IOCSTATUS_MASK;
-                               dcprintk((KERN_NOTICE "  IOCStatus=%04xh, IOCLogInfo=%08xh\n",
+                               dcprintk(ioc, printk(KERN_NOTICE "  IOCStatus=%04xh, IOCLogInfo=%08xh\n",
                                     status, le32_to_cpu(pReply->IOCLogInfo)));
 
                                pCfg->status = status;
@@ -789,7 +789,7 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
                printk(KERN_INFO "MF Count 0x%x Max 0x%x \n", ioc->mfcnt, ioc->req_depth);
 #endif
 
-       dmfprintk((KERN_INFO MYNAM ": %s: mpt_get_msg_frame(%d,%d), got mf=%p\n",
+       dmfprintk(ioc, printk(KERN_INFO MYNAM ": %s: mpt_get_msg_frame(%d,%d), got mf=%p\n",
                        ioc->name, handle, ioc->id, mf));
        return mf;
 }
@@ -820,27 +820,10 @@ mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
        mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
        mf->u.frame.hwhdr.msgctxu.fld.rsvd = 0;
 
-#ifdef MPT_DEBUG_MSG_FRAME
-       {
-               u32     *m = mf->u.frame.hwhdr.__hdr;
-               int      ii, n;
-
-               printk(KERN_INFO MYNAM ": %s: About to Put msg frame @ %p:\n" KERN_INFO " ",
-                               ioc->name, m);
-               n = ioc->req_sz/4 - 1;
-               while (m[n] == 0)
-                       n--;
-               for (ii=0; ii<=n; ii++) {
-                       if (ii && ((ii%8)==0))
-                               printk("\n" KERN_INFO " ");
-                       printk(" %08x", le32_to_cpu(m[ii]));
-               }
-               printk("\n");
-       }
-#endif
+       DBG_DUMP_PUT_MSG_FRAME(ioc, (u32 *)mf);
 
        mf_dma_addr = (ioc->req_frames_low_dma + req_offset) | ioc->RequestNB[req_idx];
-       dsgprintk((MYIOC_s_INFO_FMT "mf_dma_addr=%x req_idx=%d RequestNB=%x\n", ioc->name, mf_dma_addr, req_idx, ioc->RequestNB[req_idx]));
+       dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mf_dma_addr=%x req_idx=%d RequestNB=%x\n", ioc->name, mf_dma_addr, req_idx, ioc->RequestNB[req_idx]));
        CHIPREG_WRITE32(&ioc->chip->RequestFifo, mf_dma_addr);
 }
 
@@ -955,7 +938,7 @@ mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req,
        if (!(CHIPREG_READ32(&ioc->chip->Doorbell) & MPI_DOORBELL_ACTIVE))
                return -5;
 
-       dhsprintk((KERN_INFO MYNAM ": %s: mpt_send_handshake_request start, WaitCnt=%d\n",
+       dhsprintk(ioc, printk(KERN_INFO MYNAM ": %s: mpt_send_handshake_request start, WaitCnt=%d\n",
                ioc->name, ii));
 
        CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
@@ -1066,7 +1049,7 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init)
                            host_page_buffer_sz,
                            &ioc->HostPageBuffer_dma)) != NULL) {
 
-                               dinitprintk((MYIOC_s_INFO_FMT
+                               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                                    "host_page_buffer @ %p, dma @ %x, sz=%d bytes\n",
                                    ioc->name, ioc->HostPageBuffer,
                                    (u32)ioc->HostPageBuffer_dma,
@@ -1410,31 +1393,37 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
        struct proc_dir_entry *dent, *ent;
 #endif
 
+       ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC);
+       if (ioc == NULL) {
+               printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n");
+               return -ENOMEM;
+       }
+
+       ioc->debug_level = mpt_debug_level;
+       if (mpt_debug_level)
+               printk(KERN_INFO MYNAM ": mpt_debug_level=%xh\n", mpt_debug_level);
+
        if (pci_enable_device(pdev))
                return r;
 
-       dinitprintk((KERN_WARNING MYNAM ": mpt_adapter_install\n"));
+       dinitprintk(ioc, printk(KERN_WARNING MYNAM ": mpt_adapter_install\n"));
 
        if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               dprintk((KERN_INFO MYNAM
+               dprintk(ioc, printk(KERN_INFO MYNAM
                        ": 64 BIT PCI BUS DMA ADDRESSING SUPPORTED\n"));
        } else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
                printk(KERN_WARNING MYNAM ": 32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n");
                return r;
        }
 
-       if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
-               dprintk((KERN_INFO MYNAM
+       if (!pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK)) {
+               dprintk(ioc, printk(KERN_INFO MYNAM
                        ": Using 64 bit consistent mask\n"));
-       else
-               dprintk((KERN_INFO MYNAM
+       } else {
+               dprintk(ioc, printk(KERN_INFO MYNAM
                        ": Not using 64 bit consistent mask\n"));
-
-       ioc = kzalloc(sizeof(MPT_ADAPTER), GFP_ATOMIC);
-       if (ioc == NULL) {
-               printk(KERN_ERR MYNAM ": ERROR - Insufficient memory to add adapter!\n");
-               return -ENOMEM;
        }
+
        ioc->alloc_total = sizeof(MPT_ADAPTER);
        ioc->req_sz = MPT_DEFAULT_FRAME_SIZE;           /* avoid div by zero! */
        ioc->reply_sz = MPT_REPLY_FRAME_SIZE;
@@ -1502,9 +1491,9 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
                return -EINVAL;
        }
        ioc->memmap = mem;
-       dinitprintk((KERN_INFO MYNAM ": mem = %p, mem_phys = %lx\n", mem, mem_phys));
+       dinitprintk(ioc, printk(KERN_INFO MYNAM ": mem = %p, mem_phys = %lx\n", mem, mem_phys));
 
-       dinitprintk((KERN_INFO MYNAM ": facts @ %p, pfacts[0] @ %p\n",
+       dinitprintk(ioc, printk(KERN_INFO MYNAM ": facts @ %p, pfacts[0] @ %p\n",
                        &ioc->facts, &ioc->pfacts[0]));
 
        ioc->mem_phys = mem_phys;
@@ -1830,6 +1819,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
        int      ret = 0;
        int      reset_alt_ioc_active = 0;
        int      irq_allocated = 0;
+       u8      *a;
 
        printk(KERN_INFO MYNAM ": Initiating %s %s\n",
                        ioc->name, reason==MPT_HOSTEVENT_IOC_BRINGUP ? "bringup" : "recovery");
@@ -1858,7 +1848,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
 
                        if (reset_alt_ioc_active && ioc->alt_ioc) {
                                /* (re)Enable alt-IOC! (reply interrupt, FreeQ) */
-                               dprintk((KERN_INFO MYNAM ": alt-%s reply irq re-enabled\n",
+                               dprintk(ioc, printk(KERN_INFO MYNAM
+                                       ": alt-%s reply irq re-enabled\n",
                                                ioc->alt_ioc->name));
                                CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM);
                                ioc->alt_ioc->active = 1;
@@ -1891,7 +1882,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
 
 
        if (ii == 5) {
-               dinitprintk((MYIOC_s_INFO_FMT "Retry IocFacts failed rc=%x\n", ioc->name, rc));
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Retry IocFacts failed rc=%x\n", ioc->name, rc));
                ret = -2;
        } else if (reason == MPT_HOSTEVENT_IOC_BRINGUP) {
                MptDisplayIocCapabilities(ioc);
@@ -1899,13 +1890,15 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
 
        if (alt_ioc_ready) {
                if ((rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason)) != 0) {
-                       dinitprintk((MYIOC_s_INFO_FMT "Initial Alt IocFacts failed rc=%x\n", ioc->name, rc));
+                       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                               "Initial Alt IocFacts failed rc=%x\n", ioc->name, rc));
                        /* Retry - alt IOC was initialized once
                         */
                        rc = GetIocFacts(ioc->alt_ioc, sleepFlag, reason);
                }
                if (rc) {
-                       dinitprintk((MYIOC_s_INFO_FMT "Retry Alt IocFacts failed rc=%x\n", ioc->name, rc));
+                       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                               "Retry Alt IocFacts failed rc=%x\n", ioc->name, rc));
                        alt_ioc_ready = 0;
                        reset_alt_ioc_active = 0;
                } else if (reason == MPT_HOSTEVENT_IOC_BRINGUP) {
@@ -1938,7 +1931,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
                        ioc->pci_irq = ioc->pcidev->irq;
                        pci_set_master(ioc->pcidev);            /* ?? */
                        pci_set_drvdata(ioc->pcidev, ioc);
-                       dprintk((KERN_INFO MYNAM ": %s installed at interrupt "
+                       dprintk(ioc, printk(KERN_INFO MYNAM ": %s installed at interrupt "
                                "%d\n", ioc->name, ioc->pcidev->irq));
                }
        }
@@ -1976,7 +1969,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
 
        if (reason == MPT_HOSTEVENT_IOC_BRINGUP){
                if (ioc->upload_fw) {
-                       ddlprintk((MYIOC_s_INFO_FMT
+                       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                                "firmware upload required!\n", ioc->name));
 
                        /* Controller is not operational, cannot do upload
@@ -1992,7 +1985,8 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
                                                 * chips (mpt_adapter_disable,
                                                 * mpt_diag_reset)
                                                 */
-                                               ddlprintk((MYIOC_s_INFO_FMT ": mpt_upload:  alt_%s has cached_fw=%p \n",
+                                               ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                                       ": mpt_upload:  alt_%s has cached_fw=%p \n",
                                                        ioc->name, ioc->alt_ioc->name, ioc->alt_ioc->cached_fw));
                                                ioc->alt_ioc->cached_fw = NULL;
                                        }
@@ -2012,7 +2006,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
 
        if (reset_alt_ioc_active && ioc->alt_ioc) {
                /* (re)Enable alt-IOC! (reply interrupt) */
-               dinitprintk((KERN_INFO MYNAM ": alt-%s reply irq re-enabled\n",
+               dinitprintk(ioc, printk(KERN_INFO MYNAM ": alt-%s reply irq re-enabled\n",
                                ioc->alt_ioc->name));
                CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM);
                ioc->alt_ioc->active = 1;
@@ -2064,13 +2058,13 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
                                 *  (LANPage1_t stuff)
                                 */
                                (void) GetLanConfigPages(ioc);
-#ifdef MPT_DEBUG
-                               {
-                                       u8 *a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
-                                       dprintk((MYIOC_s_INFO_FMT "LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n",
-                                                       ioc->name, a[5], a[4], a[3], a[2], a[1], a[0] ));
-                               }
-#endif
+                               a = (u8*)&ioc->lan_cnfg_page1.HardwareAddressLow;
+                               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "LanAddr = %02X:%02X:%02X:"
+                                       "%02X:%02X:%02X\n",
+                                       ioc->name, a[5], a[4],
+                                       a[3], a[2], a[1], a[0] ));
+
                        }
                } else {
                        /* Get NVRAM and adapter maximums from SPP 0 and 2
@@ -2107,15 +2101,17 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
                rc = handlers = 0;
                for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
                        if ((ret == 0) && MptResetHandlers[ii]) {
-                               dprintk((MYIOC_s_INFO_FMT "Calling IOC post_reset handler #%d\n",
-                                               ioc->name, ii));
+                               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "Calling IOC post_reset handler #%d\n",
+                                       ioc->name, ii));
                                rc += mpt_signal_reset(ii, ioc, MPT_IOC_POST_RESET);
                                handlers++;
                        }
 
                        if (alt_ioc_ready && MptResetHandlers[ii]) {
-                               drsprintk((MYIOC_s_INFO_FMT "Calling alt-%s post_reset handler #%d\n",
-                                               ioc->name, ioc->alt_ioc->name, ii));
+                               drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "Calling alt-%s post_reset handler #%d\n",
+                                       ioc->name, ioc->alt_ioc->name, ii));
                                rc += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_POST_RESET);
                                handlers++;
                        }
@@ -2153,7 +2149,7 @@ mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev)
        unsigned int func = PCI_FUNC(pdev->devfn);
        MPT_ADAPTER *ioc_srch;
 
-       dprintk((MYIOC_s_INFO_FMT "PCI device %s devfn=%x/%x,"
+       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "PCI device %s devfn=%x/%x,"
            " searching for devfn match on %x or %x\n",
                ioc->name, pci_name(pdev), pdev->bus->number,
                pdev->devfn, func-1, func+1));
@@ -2178,7 +2174,7 @@ mpt_detect_bound_ports(MPT_ADAPTER *ioc, struct pci_dev *pdev)
                                        ioc_srch->name, ioc_srch->alt_ioc->name);
                                break;
                        }
-                       dprintk((KERN_INFO MYNAM ": FOUND! binding %s <==> %s\n",
+                       dprintk(ioc, printk(KERN_INFO MYNAM ": FOUND! binding %s <==> %s\n",
                                ioc->name, ioc_srch->name));
                        ioc_srch->alt_ioc = ioc;
                        ioc->alt_ioc = ioc_srch;
@@ -2199,7 +2195,7 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
        int ret;
 
        if (ioc->cached_fw != NULL) {
-               ddlprintk((KERN_INFO MYNAM ": mpt_adapter_disable: Pushing FW onto adapter\n"));
+               ddlprintk(ioc, printk(KERN_INFO MYNAM ": mpt_adapter_disable: Pushing FW onto adapter\n"));
                if ((ret = mpt_downloadboot(ioc, (MpiFwHeader_t *)ioc->cached_fw, NO_SLEEP)) < 0) {
                        printk(KERN_WARNING MYNAM
                                ": firmware downloadboot failure (%d)!\n", ret);
@@ -2214,7 +2210,7 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
 
        if (ioc->alloc != NULL) {
                sz = ioc->alloc_sz;
-               dexitprintk((KERN_INFO MYNAM ": %s.free  @ %p, sz=%d bytes\n",
+               dexitprintk(ioc, printk(KERN_INFO MYNAM ": %s.free  @ %p, sz=%d bytes\n",
                        ioc->name, ioc->alloc, ioc->alloc_sz));
                pci_free_consistent(ioc->pcidev, sz,
                                ioc->alloc, ioc->alloc_dma);
@@ -2256,7 +2252,7 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
 
        if (ioc->spi_data.pIocPg4 != NULL) {
                sz = ioc->spi_data.IocPg4Sz;
-               pci_free_consistent(ioc->pcidev, sz, 
+               pci_free_consistent(ioc->pcidev, sz,
                        ioc->spi_data.pIocPg4,
                        ioc->spi_data.IocPg4_dma);
                ioc->spi_data.pIocPg4 = NULL;
@@ -2279,7 +2275,7 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
                           ": %s: host page buffers free failed (%d)!\n",
                            __FUNCTION__, ret);
                }
-               dexitprintk((KERN_INFO MYNAM ": %s HostPageBuffer free  @ %p, sz=%d bytes\n",
+               dexitprintk(ioc, printk(KERN_INFO MYNAM ": %s HostPageBuffer free  @ %p, sz=%d bytes\n",
                        ioc->name, ioc->HostPageBuffer, ioc->HostPageBuffer_sz));
                pci_free_consistent(ioc->pcidev, ioc->HostPageBuffer_sz,
                                ioc->HostPageBuffer,
@@ -2325,7 +2321,7 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc)
 #if defined(CONFIG_MTRR) && 0
        if (ioc->mtrr_reg > 0) {
                mtrr_del(ioc->mtrr_reg, 0, 0);
-               dprintk((KERN_INFO MYNAM ": %s: MTRR region de-registered\n", ioc->name));
+               dprintk(ioc, printk(KERN_INFO MYNAM ": %s: MTRR region de-registered\n", ioc->name));
        }
 #endif
 
@@ -2333,7 +2329,7 @@ mpt_adapter_dispose(MPT_ADAPTER *ioc)
        list_del(&ioc->list);
 
        sz_last = ioc->alloc_total;
-       dprintk((KERN_INFO MYNAM ": %s: free'd %d of %d bytes\n",
+       dprintk(ioc, printk(KERN_INFO MYNAM ": %s: free'd %d of %d bytes\n",
                        ioc->name, sz_first-sz_last+(int)sizeof(*ioc), sz_first));
 
        if (ioc->alt_ioc)
@@ -2413,7 +2409,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)
 
        /* Get current [raw] IOC state  */
        ioc_state = mpt_GetIocState(ioc, 0);
-       dhsprintk((KERN_INFO MYNAM "::MakeIocReady, %s [raw] state=%08x\n", ioc->name, ioc_state));
+       dhsprintk(ioc, printk(KERN_INFO MYNAM "::MakeIocReady, %s [raw] state=%08x\n", ioc->name, ioc_state));
 
        /*
         *      Check to see if IOC got left/stuck in doorbell handshake
@@ -2444,7 +2440,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)
         *      Hmmm...  Did it get left operational?
         */
        if ((ioc_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_OPERATIONAL) {
-               dinitprintk((MYIOC_s_INFO_FMT "IOC operational unexpected\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "IOC operational unexpected\n",
                                ioc->name));
 
                /* Check WhoInit.
@@ -2453,7 +2449,7 @@ MakeIocReady(MPT_ADAPTER *ioc, int force, int sleepFlag)
                 * Else, fall through to KickStart case
                 */
                whoinit = (ioc_state & MPI_DOORBELL_WHO_INIT_MASK) >> MPI_DOORBELL_WHO_INIT_SHIFT;
-               dinitprintk((KERN_INFO MYNAM
+               dinitprintk(ioc, printk(KERN_INFO MYNAM
                        ": whoinit 0x%x statefault %d force %d\n",
                        whoinit, statefault, force));
                if (whoinit == MPI_WHOINIT_PCI_PEER)
@@ -2589,7 +2585,7 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)
        get_facts.Function = MPI_FUNCTION_IOC_FACTS;
        /* Assert: All other get_facts fields are zero! */
 
-       dinitprintk((MYIOC_s_INFO_FMT
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
            "Sending get IocFacts request req_sz=%d reply_sz=%d\n",
            ioc->name, req_sz, reply_sz));
 
@@ -2691,8 +2687,9 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)
                        sz = sz >> 1;
                }
                ioc->NBShiftFactor  = shiftFactor;
-               dinitprintk((MYIOC_s_INFO_FMT "NB_for_64_byte_frame=%x NBShiftFactor=%x BlockSize=%x\n",
-                                       ioc->name, vv, shiftFactor, r));
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                       "NB_for_64_byte_frame=%x NBShiftFactor=%x BlockSize=%x\n",
+                       ioc->name, vv, shiftFactor, r));
 
                if (reason == MPT_HOSTEVENT_IOC_BRINGUP) {
                        /*
@@ -2704,9 +2701,9 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)
                        ioc->reply_sz = MPT_REPLY_FRAME_SIZE;
                        ioc->reply_depth = min_t(int, MPT_DEFAULT_REPLY_DEPTH, facts->ReplyQueueDepth);
 
-                       dinitprintk((MYIOC_s_INFO_FMT "reply_sz=%3d, reply_depth=%4d\n",
+                       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "reply_sz=%3d, reply_depth=%4d\n",
                                ioc->name, ioc->reply_sz, ioc->reply_depth));
-                       dinitprintk((MYIOC_s_INFO_FMT "req_sz  =%3d, req_depth  =%4d\n",
+                       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "req_sz  =%3d, req_depth  =%4d\n",
                                ioc->name, ioc->req_sz, ioc->req_depth));
 
                        /* Get port facts! */
@@ -2765,7 +2762,7 @@ GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
        get_pfacts.PortNumber = portnum;
        /* Assert: All other get_pfacts fields are zero! */
 
-       dinitprintk((MYIOC_s_INFO_FMT "Sending get PortFacts(%d) request\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending get PortFacts(%d) request\n",
                        ioc->name, portnum));
 
        /* No non-zero fields in the get_pfacts request are greater than
@@ -2841,12 +2838,12 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
                ioc->upload_fw = 1;
        else
                ioc->upload_fw = 0;
-       ddlprintk((MYIOC_s_INFO_FMT "upload_fw %d facts.Flags=%x\n",
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "upload_fw %d facts.Flags=%x\n",
                   ioc->name, ioc->upload_fw, ioc->facts.Flags));
 
        ioc_init.MaxDevices = (U8)ioc->devices_per_bus;
        ioc_init.MaxBuses = (U8)ioc->number_of_buses;
-       dinitprintk((MYIOC_s_INFO_FMT "facts.MsgVersion=%x\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "facts.MsgVersion=%x\n",
                   ioc->name, ioc->facts.MsgVersion));
        if (ioc->facts.MsgVersion >= MPI_VERSION_01_05) {
                // set MsgVersion and HeaderVersion host driver was built with
@@ -2877,7 +2874,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
        ioc->facts.MaxDevices = ioc_init.MaxDevices;
        ioc->facts.MaxBuses = ioc_init.MaxBuses;
 
-       dhsprintk((MYIOC_s_INFO_FMT "Sending IOCInit (req @ %p)\n",
+       dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending IOCInit (req @ %p)\n",
                        ioc->name, &ioc_init));
 
        r = mpt_handshake_req_reply_wait(ioc, sizeof(IOCInit_t), (u32*)&ioc_init,
@@ -2891,7 +2888,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
         * since we don't even look at its contents.
         */
 
-       dhsprintk((MYIOC_s_INFO_FMT "Sending PortEnable (req @ %p)\n",
+       dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending PortEnable (req @ %p)\n",
                        ioc->name, &ioc_init));
 
        if ((r = SendPortEnable(ioc, 0, sleepFlag)) != 0) {
@@ -2922,7 +2919,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
                state = mpt_GetIocState(ioc, 1);
                count++;
        }
-       dinitprintk((MYIOC_s_INFO_FMT "INFO - Wait IOC_OPERATIONAL state (cnt=%d)\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "INFO - Wait IOC_OPERATIONAL state (cnt=%d)\n",
                        ioc->name, count));
 
        ioc->aen_event_read_flag=0;
@@ -2962,7 +2959,7 @@ SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
 /*     port_enable.MsgFlags = 0;               */
 /*     port_enable.MsgContext = 0;             */
 
-       dinitprintk((MYIOC_s_INFO_FMT "Sending Port(%d)Enable (req @ %p)\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending Port(%d)Enable (req @ %p)\n",
                        ioc->name, portnum, &port_enable));
 
        /* RAID FW may take a long time to enable
@@ -3015,7 +3012,7 @@ mpt_free_fw_memory(MPT_ADAPTER *ioc)
        int sz;
 
        sz = ioc->facts.FWImageSize;
-       dinitprintk((KERN_INFO MYNAM "free_fw_memory: FW Image  @ %p[%p], sz=%d[%x] bytes\n",
+       dinitprintk(ioc, printk(KERN_INFO MYNAM "free_fw_memory: FW Image  @ %p[%p], sz=%d[%x] bytes\n",
                 ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz));
        pci_free_consistent(ioc->pcidev, sz,
                        ioc->cached_fw, ioc->cached_fw_dma);
@@ -3059,7 +3056,7 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)
 
        mpt_alloc_fw_memory(ioc, sz);
 
-       dinitprintk((KERN_INFO MYNAM ": FW Image  @ %p[%p], sz=%d[%x] bytes\n",
+       dinitprintk(ioc, printk(KERN_INFO MYNAM ": FW Image  @ %p[%p], sz=%d[%x] bytes\n",
                 ioc->cached_fw, (void *)(ulong)ioc->cached_fw_dma, sz, sz));
 
        if (ioc->cached_fw == NULL) {
@@ -3091,14 +3088,14 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)
        mpt_add_sge(&request[sgeoffset], flagsLength, ioc->cached_fw_dma);
 
        sgeoffset += sizeof(u32) + sizeof(dma_addr_t);
-       dinitprintk((KERN_INFO MYNAM ": Sending FW Upload (req @ %p) sgeoffset=%d \n",
+       dinitprintk(ioc, printk(KERN_INFO MYNAM ": Sending FW Upload (req @ %p) sgeoffset=%d \n",
                        prequest, sgeoffset));
-       DBG_DUMP_FW_REQUEST_FRAME(prequest)
+       DBG_DUMP_FW_REQUEST_FRAME(ioc, (u32 *)prequest)
 
        ii = mpt_handshake_req_reply_wait(ioc, sgeoffset, (u32*)prequest,
                                reply_sz, (u16*)preply, 65 /*seconds*/, sleepFlag);
 
-       dinitprintk((KERN_INFO MYNAM ": FW Upload completed rc=%x \n", ii));
+       dinitprintk(ioc, printk(KERN_INFO MYNAM ": FW Upload completed rc=%x \n", ii));
 
        cmdStatus = -EFAULT;
        if (ii == 0) {
@@ -3113,13 +3110,13 @@ mpt_do_upload(MPT_ADAPTER *ioc, int sleepFlag)
                                cmdStatus = 0;
                }
        }
-       dinitprintk((MYIOC_s_INFO_FMT ": do_upload cmdStatus=%d \n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": do_upload cmdStatus=%d \n",
                        ioc->name, cmdStatus));
 
 
        if (cmdStatus) {
 
-               ddlprintk((MYIOC_s_INFO_FMT ": fw upload failed, freeing image \n",
+               ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": fw upload failed, freeing image \n",
                        ioc->name));
                mpt_free_fw_memory(ioc);
        }
@@ -3154,7 +3151,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
        u32                      load_addr;
        u32                      ioc_state=0;
 
-       ddlprintk((MYIOC_s_INFO_FMT "downloadboot: fw size 0x%x (%d), FW Ptr %p\n",
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot: fw size 0x%x (%d), FW Ptr %p\n",
                                ioc->name, pFwHeader->ImageSize, pFwHeader->ImageSize, pFwHeader));
 
        CHIPREG_WRITE32(&ioc->chip->WriteSequence, 0xFF);
@@ -3179,7 +3176,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
        for (count = 0; count < 30; count ++) {
                diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
                if (!(diag0val & MPI_DIAG_RESET_ADAPTER)) {
-                       ddlprintk((MYIOC_s_INFO_FMT "RESET_ADAPTER cleared, count=%d\n",
+                       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RESET_ADAPTER cleared, count=%d\n",
                                ioc->name, count));
                        break;
                }
@@ -3192,7 +3189,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
        }
 
        if ( count == 30 ) {
-               ddlprintk((MYIOC_s_INFO_FMT "downloadboot failed! "
+               ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot failed! "
                "Unable to get MPI_DIAG_DRWE mode, diag0val=%x\n",
                ioc->name, diag0val));
                return -3;
@@ -3218,10 +3215,10 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
                pci_enable_io_access(ioc->pcidev);
 
        CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->LoadStartAddress);
-       ddlprintk((MYIOC_s_INFO_FMT "LoadStart addr written 0x%x \n",
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "LoadStart addr written 0x%x \n",
                ioc->name, pFwHeader->LoadStartAddress));
 
-       ddlprintk((MYIOC_s_INFO_FMT "Write FW Image: 0x%x bytes @ %p\n",
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write FW Image: 0x%x bytes @ %p\n",
                                ioc->name, fwSize*4, ptrFw));
        while (fwSize--) {
                CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, *ptrFw++);
@@ -3236,7 +3233,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
                fwSize = (pExtImage->ImageSize + 3) >> 2;
                ptrFw = (u32 *)pExtImage;
 
-               ddlprintk((MYIOC_s_INFO_FMT "Write Ext Image: 0x%x (%d) bytes @ %p load_addr=%x\n",
+               ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write Ext Image: 0x%x (%d) bytes @ %p load_addr=%x\n",
                                                ioc->name, fwSize*4, fwSize*4, ptrFw, load_addr));
                CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, load_addr);
 
@@ -3247,11 +3244,11 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
        }
 
        /* Write the IopResetVectorRegAddr */
-       ddlprintk((MYIOC_s_INFO_FMT "Write IopResetVector Addr=%x! \n", ioc->name,      pFwHeader->IopResetRegAddr));
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write IopResetVector Addr=%x! \n", ioc->name,  pFwHeader->IopResetRegAddr));
        CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwAddress, pFwHeader->IopResetRegAddr);
 
        /* Write the IopResetVectorValue */
-       ddlprintk((MYIOC_s_INFO_FMT "Write IopResetVector Value=%x! \n", ioc->name, pFwHeader->IopResetVectorValue));
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Write IopResetVector Value=%x! \n", ioc->name, pFwHeader->IopResetVectorValue));
        CHIPREG_PIO_WRITE32(&ioc->pio_chip->DiagRwData, pFwHeader->IopResetVectorValue);
 
        /* Clear the internal flash bad bit - autoincrementing register,
@@ -3285,11 +3282,11 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
                pci_disable_io_access(ioc->pcidev);
 
        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
-       ddlprintk((MYIOC_s_INFO_FMT "downloadboot diag0val=%x, "
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot diag0val=%x, "
                "turning off PREVENT_IOC_BOOT, DISABLE_ARM, RW_ENABLE\n",
                ioc->name, diag0val));
        diag0val &= ~(MPI_DIAG_PREVENT_IOC_BOOT | MPI_DIAG_DISABLE_ARM | MPI_DIAG_RW_ENABLE);
-       ddlprintk((MYIOC_s_INFO_FMT "downloadboot now diag0val=%x\n",
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "downloadboot now diag0val=%x\n",
                ioc->name, diag0val));
        CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val);
 
@@ -3300,7 +3297,7 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
                ioc_state = mpt_GetIocState(ioc, 0);
                if ( (GetIocFacts(ioc, sleepFlag,
                                MPT_HOSTEVENT_IOC_BRINGUP)) != 0 ) {
-                       ddlprintk((MYIOC_s_INFO_FMT "GetIocFacts failed: IocState=%x\n",
+                       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "GetIocFacts failed: IocState=%x\n",
                                        ioc->name, ioc_state));
                        return -EFAULT;
                }
@@ -3308,17 +3305,20 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
 
        for (count=0; count<HZ*20; count++) {
                if ((ioc_state = mpt_GetIocState(ioc, 0)) & MPI_IOC_STATE_READY) {
-                       ddlprintk((MYIOC_s_INFO_FMT "downloadboot successful! (count=%d) IocState=%x\n",
-                                       ioc->name, count, ioc_state));
+                       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                               "downloadboot successful! (count=%d) IocState=%x\n",
+                               ioc->name, count, ioc_state));
                        if (ioc->bus_type == SAS) {
                                return 0;
                        }
                        if ((SendIocInit(ioc, sleepFlag)) != 0) {
-                               ddlprintk((MYIOC_s_INFO_FMT "downloadboot: SendIocInit failed\n",
+                               ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "downloadboot: SendIocInit failed\n",
                                        ioc->name));
                                return -EFAULT;
                        }
-                       ddlprintk((MYIOC_s_INFO_FMT "downloadboot: SendIocInit successful\n",
+                       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "downloadboot: SendIocInit successful\n",
                                        ioc->name));
                        return 0;
                }
@@ -3328,8 +3328,8 @@ mpt_downloadboot(MPT_ADAPTER *ioc, MpiFwHeader_t *pFwHeader, int sleepFlag)
                        mdelay (10);
                }
        }
-       ddlprintk((MYIOC_s_INFO_FMT "downloadboot failed! IocState=%x\n",
-               ioc->name, ioc_state));
+       ddlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+               "downloadboot failed! IocState=%x\n",ioc->name, ioc_state));
        return -EFAULT;
 }
 
@@ -3366,7 +3366,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
        u32 ioc_state=0;
        int cnt,cntdn;
 
-       dinitprintk((KERN_WARNING MYNAM ": KickStarting %s!\n", ioc->name));
+       dinitprintk(ioc, printk(KERN_WARNING MYNAM ": KickStarting %s!\n", ioc->name));
        if (ioc->bus_type == SPI) {
                /* Always issue a Msg Unit Reset first. This will clear some
                 * SCSI bus hang conditions.
@@ -3384,14 +3384,14 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
        if (hard_reset_done < 0)
                return hard_reset_done;
 
-       dinitprintk((MYIOC_s_INFO_FMT "Diagnostic reset successful!\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset successful!\n",
                        ioc->name));
 
        cntdn = ((sleepFlag == CAN_SLEEP) ? HZ : 1000) * 2;     /* 2 seconds */
        for (cnt=0; cnt<cntdn; cnt++) {
                ioc_state = mpt_GetIocState(ioc, 1);
                if ((ioc_state == MPI_IOC_STATE_READY) || (ioc_state == MPI_IOC_STATE_OPERATIONAL)) {
-                       dinitprintk((MYIOC_s_INFO_FMT "KickStart successful! (cnt=%d)\n",
+                       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "KickStart successful! (cnt=%d)\n",
                                        ioc->name, cnt));
                        return hard_reset_done;
                }
@@ -3434,15 +3434,13 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
        u32 doorbell;
        int hard_reset_done = 0;
        int count = 0;
-#ifdef MPT_DEBUG
        u32 diag1val = 0;
-#endif
 
        /* Clear any existing interrupts */
        CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
 
        if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) {
-               drsprintk((MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset "
+               drsprintk(ioc, printk(MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset "
                        "address=%p\n",  ioc->name, __FUNCTION__,
                        &ioc->chip->Doorbell, &ioc->chip->Reset_1078));
                CHIPREG_WRITE32(&ioc->chip->Reset_1078, 0x07);
@@ -3455,7 +3453,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                        doorbell = CHIPREG_READ32(&ioc->chip->Doorbell);
                        doorbell &= MPI_IOC_STATE_MASK;
 
-                       drsprintk((MYIOC_s_INFO_FMT
+                       drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                                "looking for READY STATE: doorbell=%x"
                                " count=%d\n",
                                ioc->name, doorbell, count));
@@ -3475,12 +3473,12 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
        /* Use "Diagnostic reset" method! (only thing available!) */
        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
 
-#ifdef MPT_DEBUG
-       if (ioc->alt_ioc)
-               diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
-       dprintk((MYIOC_s_INFO_FMT "DbG1: diag0=%08x, diag1=%08x\n",
+       if (ioc->debug_level & MPT_DEBUG) {
+               if (ioc->alt_ioc)
+                       diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG1: diag0=%08x, diag1=%08x\n",
                        ioc->name, diag0val, diag1val));
-#endif
+       }
 
        /* Do the reset if we are told to ignore the reset history
         * or if the reset history is 0
@@ -3514,16 +3512,16 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
 
                        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
 
-                       dprintk((MYIOC_s_INFO_FMT "Wrote magic DiagWriteEn sequence (%x)\n",
+                       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Wrote magic DiagWriteEn sequence (%x)\n",
                                        ioc->name, diag0val));
                }
 
-#ifdef MPT_DEBUG
-               if (ioc->alt_ioc)
-                       diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
-               dprintk((MYIOC_s_INFO_FMT "DbG2: diag0=%08x, diag1=%08x\n",
+               if (ioc->debug_level & MPT_DEBUG) {
+                       if (ioc->alt_ioc)
+                               diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
+                       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG2: diag0=%08x, diag1=%08x\n",
                                ioc->name, diag0val, diag1val));
-#endif
+               }
                /*
                 * Disable the ARM (Bug fix)
                 *
@@ -3537,7 +3535,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                 */
                CHIPREG_WRITE32(&ioc->chip->Diagnostic, diag0val | MPI_DIAG_RESET_ADAPTER);
                hard_reset_done = 1;
-               dprintk((MYIOC_s_INFO_FMT "Diagnostic reset performed\n",
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Diagnostic reset performed\n",
                                ioc->name));
 
                /*
@@ -3552,12 +3550,14 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
 
                        for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
                                if (MptResetHandlers[ii]) {
-                                       dprintk((MYIOC_s_INFO_FMT "Calling IOC pre_reset handler #%d\n",
-                                                       ioc->name, ii));
+                                       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                               "Calling IOC pre_reset handler #%d\n",
+                                               ioc->name, ii));
                                        r += mpt_signal_reset(ii, ioc, MPT_IOC_PRE_RESET);
                                        if (ioc->alt_ioc) {
-                                               dprintk((MYIOC_s_INFO_FMT "Calling alt-%s pre_reset handler #%d\n",
-                                                               ioc->name, ioc->alt_ioc->name, ii));
+                                               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                                       "Calling alt-%s pre_reset handler #%d\n",
+                                                       ioc->name, ioc->alt_ioc->name, ii));
                                                r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_PRE_RESET);
                                        }
                                }
@@ -3580,7 +3580,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                                        break;
                                }
 
-                               dprintk((MYIOC_s_INFO_FMT "cached_fw: diag0val=%x count=%d\n",
+                               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "cached_fw: diag0val=%x count=%d\n",
                                        iocp->name, diag0val, count));
                                /* wait 1 sec */
                                if (sleepFlag == CAN_SLEEP) {
@@ -3621,12 +3621,12 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
        }
 
        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
-#ifdef MPT_DEBUG
-       if (ioc->alt_ioc)
-               diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
-       dprintk((MYIOC_s_INFO_FMT "DbG3: diag0=%08x, diag1=%08x\n",
-               ioc->name, diag0val, diag1val));
-#endif
+       if (ioc->debug_level & MPT_DEBUG) {
+               if (ioc->alt_ioc)
+                       diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG3: diag0=%08x, diag1=%08x\n",
+                       ioc->name, diag0val, diag1val));
+       }
 
        /* Clear RESET_HISTORY bit!  Place board in the
         * diagnostic mode to update the diag register.
@@ -3680,12 +3680,12 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                return -3;
        }
 
-#ifdef MPT_DEBUG
-       if (ioc->alt_ioc)
-               diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
-       dprintk((MYIOC_s_INFO_FMT "DbG4: diag0=%08x, diag1=%08x\n",
+       if (ioc->debug_level & MPT_DEBUG) {
+               if (ioc->alt_ioc)
+                       diag1val = CHIPREG_READ32(&ioc->alt_ioc->chip->Diagnostic);
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "DbG4: diag0=%08x, diag1=%08x\n",
                        ioc->name, diag0val, diag1val));
-#endif
+       }
 
        /*
         * Reset flag that says we've enabled event notification
@@ -3717,7 +3717,7 @@ SendIocReset(MPT_ADAPTER *ioc, u8 reset_type, int sleepFlag)
        u32 state;
        int cntdn, count;
 
-       drsprintk((KERN_INFO MYNAM ": %s: Sending IOC reset(0x%02x)!\n",
+       drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending IOC reset(0x%02x)!\n",
                        ioc->name, reset_type));
        CHIPREG_WRITE32(&ioc->chip->Doorbell, reset_type<<MPI_DOORBELL_FUNCTION_SHIFT);
        if ((r = WaitForDoorbellAck(ioc, 5, sleepFlag)) < 0)
@@ -3782,14 +3782,14 @@ initChainBuffers(MPT_ADAPTER *ioc)
                        return -1;
 
                ioc->ReqToChain = (int *) mem;
-               dinitprintk((KERN_INFO MYNAM ": %s ReqToChain alloc  @ %p, sz=%d bytes\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReqToChain alloc  @ %p, sz=%d bytes\n",
                                ioc->name, mem, sz));
                mem = kmalloc(sz, GFP_ATOMIC);
                if (mem == NULL)
                        return -1;
 
                ioc->RequestNB = (int *) mem;
-               dinitprintk((KERN_INFO MYNAM ": %s RequestNB alloc  @ %p, sz=%d bytes\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestNB alloc  @ %p, sz=%d bytes\n",
                                ioc->name, mem, sz));
        }
        for (ii = 0; ii < ioc->req_depth; ii++) {
@@ -3819,7 +3819,7 @@ initChainBuffers(MPT_ADAPTER *ioc)
                numSGE = 1 + (scale - 1) * (ioc->facts.MaxChainDepth-1) + scale +
                        (ioc->req_sz - 64) / (sizeof(dma_addr_t) + sizeof(u32));
        }
-       dinitprintk((KERN_INFO MYNAM ": %s num_sge=%d numSGE=%d\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "num_sge=%d numSGE=%d\n",
                ioc->name, num_sge, numSGE));
 
        if ( numSGE > MPT_SCSI_SG_DEPTH )
@@ -3832,7 +3832,7 @@ initChainBuffers(MPT_ADAPTER *ioc)
        }
        num_chain++;
 
-       dinitprintk((KERN_INFO MYNAM ": %s Now numSGE=%d num_sge=%d num_chain=%d\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Now numSGE=%d num_sge=%d num_chain=%d\n",
                ioc->name, numSGE, num_sge, num_chain));
 
        if (ioc->bus_type == SPI)
@@ -3849,7 +3849,7 @@ initChainBuffers(MPT_ADAPTER *ioc)
                        return -1;
 
                ioc->ChainToChain = (int *) mem;
-               dinitprintk((KERN_INFO MYNAM ": %s ChainToChain alloc @ %p, sz=%d bytes\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainToChain alloc @ %p, sz=%d bytes\n",
                                ioc->name, mem, sz));
        } else {
                mem = (u8 *) ioc->ChainToChain;
@@ -3885,22 +3885,22 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
                        return -1;
 
                total_size = reply_sz = (ioc->reply_sz * ioc->reply_depth);
-               dinitprintk((KERN_INFO MYNAM ": %s.ReplyBuffer sz=%d bytes, ReplyDepth=%d\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffer sz=%d bytes, ReplyDepth=%d\n",
                                ioc->name, ioc->reply_sz, ioc->reply_depth));
-               dinitprintk((KERN_INFO MYNAM ": %s.ReplyBuffer sz=%d[%x] bytes\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffer sz=%d[%x] bytes\n",
                                ioc->name, reply_sz, reply_sz));
 
                sz = (ioc->req_sz * ioc->req_depth);
-               dinitprintk((KERN_INFO MYNAM ": %s.RequestBuffer sz=%d bytes, RequestDepth=%d\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestBuffer sz=%d bytes, RequestDepth=%d\n",
                                ioc->name, ioc->req_sz, ioc->req_depth));
-               dinitprintk((KERN_INFO MYNAM ": %s.RequestBuffer sz=%d[%x] bytes\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestBuffer sz=%d[%x] bytes\n",
                                ioc->name, sz, sz));
                total_size += sz;
 
                sz = num_chain * ioc->req_sz; /* chain buffer pool size */
-               dinitprintk((KERN_INFO MYNAM ": %s.ChainBuffer sz=%d bytes, ChainDepth=%d\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainBuffer sz=%d bytes, ChainDepth=%d\n",
                                ioc->name, ioc->req_sz, num_chain));
-               dinitprintk((KERN_INFO MYNAM ": %s.ChainBuffer sz=%d[%x] bytes num_chain=%d\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainBuffer sz=%d[%x] bytes num_chain=%d\n",
                                ioc->name, sz, sz, num_chain));
 
                total_size += sz;
@@ -3911,7 +3911,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
                        goto out_fail;
                }
 
-               dinitprintk((KERN_INFO MYNAM ": %s.Total alloc @ %p[%p], sz=%d[%x] bytes\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Total alloc @ %p[%p], sz=%d[%x] bytes\n",
                                ioc->name, mem, (void *)(ulong)alloc_dma, total_size, total_size));
 
                memset(mem, 0, total_size);
@@ -3922,7 +3922,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
                ioc->reply_frames = (MPT_FRAME_HDR *) mem;
                ioc->reply_frames_low_dma = (u32) (alloc_dma & 0xFFFFFFFF);
 
-               dinitprintk((KERN_INFO MYNAM ": %s ReplyBuffers @ %p[%p]\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffers @ %p[%p]\n",
                        ioc->name, ioc->reply_frames, (void *)(ulong)alloc_dma));
 
                alloc_dma += reply_sz;
@@ -3933,7 +3933,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
                ioc->req_frames = (MPT_FRAME_HDR *) mem;
                ioc->req_frames_dma = alloc_dma;
 
-               dinitprintk((KERN_INFO MYNAM ": %s RequestBuffers @ %p[%p]\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RequestBuffers @ %p[%p]\n",
                                ioc->name, mem, (void *)(ulong)alloc_dma));
 
                ioc->req_frames_low_dma = (u32) (alloc_dma & 0xFFFFFFFF);
@@ -3947,7 +3947,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
                ioc->mtrr_reg = mtrr_add(ioc->req_frames_dma,
                                         sz,
                                         MTRR_TYPE_WRCOMB, 1);
-               dprintk((MYIOC_s_INFO_FMT "MTRR region registered (base:size=%08x:%x)\n",
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MTRR region registered (base:size=%08x:%x)\n",
                                ioc->name, ioc->req_frames_dma, sz));
 #endif
 
@@ -3959,7 +3959,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
                ioc->ChainBuffer = mem;
                ioc->ChainBufferDMA = alloc_dma;
 
-               dinitprintk((KERN_INFO MYNAM " :%s ChainBuffers @ %p(%p)\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ChainBuffers @ %p(%p)\n",
                        ioc->name, ioc->ChainBuffer, (void *)(ulong)ioc->ChainBufferDMA));
 
                /* Initialize the free chain Q.
@@ -4004,7 +4004,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
 
                ioc->sense_buf_low_dma = (u32) (ioc->sense_buf_pool_dma & 0xFFFFFFFF);
                ioc->alloc_total += sz;
-               dinitprintk((KERN_INFO MYNAM ": %s.SenseBuffers @ %p[%p]\n",
+               dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SenseBuffers @ %p[%p]\n",
                        ioc->name, ioc->sense_buf_pool, (void *)(ulong)ioc->sense_buf_pool_dma));
 
        }
@@ -4012,7 +4012,7 @@ PrimeIocFifos(MPT_ADAPTER *ioc)
        /* Post Reply frames to FIFO
         */
        alloc_dma = ioc->alloc_dma;
-       dinitprintk((KERN_INFO MYNAM ": %s.ReplyBuffers @ %p[%p]\n",
+       dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ReplyBuffers @ %p[%p]\n",
                ioc->name, ioc->reply_frames, (void *)(ulong)alloc_dma));
 
        for (i = 0; i < ioc->reply_depth; i++) {
@@ -4093,7 +4093,7 @@ mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, u32 *req,
        if ((t = WaitForDoorbellInt(ioc, 5, sleepFlag)) < 0)
                failcnt++;
 
-       dhsprintk((MYIOC_s_INFO_FMT "HandShake request start reqBytes=%d, WaitCnt=%d%s\n",
+       dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake request start reqBytes=%d, WaitCnt=%d%s\n",
                        ioc->name, reqBytes, t, failcnt ? " - MISSING DOORBELL HANDSHAKE!" : ""));
 
        /* Read doorbell and check for active bit */
@@ -4128,10 +4128,10 @@ mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, u32 *req,
                                failcnt++;
                }
 
-               dhsprintk((KERN_INFO MYNAM ": Handshake request frame (@%p) header\n", req));
-               DBG_DUMP_REQUEST_FRAME_HDR(req)
+               dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Handshake request frame (@%p) header\n", ioc->name, req));
+               DBG_DUMP_REQUEST_FRAME_HDR(ioc, (u32 *)req)
 
-               dhsprintk((MYIOC_s_INFO_FMT "HandShake request post done, WaitCnt=%d%s\n",
+               dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake request post done, WaitCnt=%d%s\n",
                                ioc->name, t, failcnt ? " - MISSING DOORBELL ACK!" : ""));
 
                /*
@@ -4140,7 +4140,7 @@ mpt_handshake_req_reply_wait(MPT_ADAPTER *ioc, int reqBytes, u32 *req,
                if (!failcnt && (t = WaitForDoorbellReply(ioc, maxwait, sleepFlag)) < 0)
                        failcnt++;
 
-               dhsprintk((MYIOC_s_INFO_FMT "HandShake reply count=%d%s\n",
+               dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HandShake reply count=%d%s\n",
                                ioc->name, t, failcnt ? " - MISSING DOORBELL REPLY!" : ""));
 
                /*
@@ -4196,7 +4196,7 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
        }
 
        if (cntdn) {
-               dprintk((MYIOC_s_INFO_FMT "WaitForDoorbell ACK (count=%d)\n",
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell ACK (count=%d)\n",
                                ioc->name, count));
                return count;
        }
@@ -4245,7 +4245,7 @@ WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
        }
 
        if (cntdn) {
-               dprintk((MYIOC_s_INFO_FMT "WaitForDoorbell INT (cnt=%d) howlong=%d\n",
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell INT (cnt=%d) howlong=%d\n",
                                ioc->name, count, howlong));
                return count;
        }
@@ -4297,7 +4297,7 @@ WaitForDoorbellReply(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
                }
        }
 
-       dhsprintk((MYIOC_s_INFO_FMT "WaitCnt=%d First handshake reply word=%08x%s\n",
+       dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitCnt=%d First handshake reply word=%08x%s\n",
                        ioc->name, t, le32_to_cpu(*(u32 *)hs_reply),
                        failcnt ? " - MISSING DOORBELL HANDSHAKE!" : ""));
 
@@ -4333,10 +4333,10 @@ WaitForDoorbellReply(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
        }
 #endif
 
-       dhsprintk((MYIOC_s_INFO_FMT "Got Handshake reply:\n", ioc->name));
-       DBG_DUMP_REPLY_FRAME(mptReply)
+       dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got Handshake reply:\n", ioc->name));
+       DBG_DUMP_REPLY_FRAME(ioc, (u32 *)mptReply)
 
-       dhsprintk((MYIOC_s_INFO_FMT "WaitForDoorbell REPLY WaitCnt=%d (sz=%d)\n",
+       dhsprintk(ioc, printk(MYIOC_s_DEBUG_FMT "WaitForDoorbell REPLY WaitCnt=%d (sz=%d)\n",
                        ioc->name, t, u16cnt/2));
        return u16cnt/2;
 }
@@ -4761,7 +4761,7 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
 
                ioc->spi_data.nvram = (int *) mem;
 
-               dprintk((MYIOC_s_INFO_FMT "SCSI device NVRAM settings @ %p, sz=%d\n",
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SCSI device NVRAM settings @ %p, sz=%d\n",
                        ioc->name, ioc->spi_data.nvram, sz));
        }
 
@@ -4797,7 +4797,8 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
                                ioc->spi_data.minSyncFactor = MPT_ASYNC;
                                ioc->spi_data.busType = MPT_HOST_BUS_UNKNOWN;
                                rc = 1;
-                               ddvprintk((MYIOC_s_INFO_FMT "Unable to read PortPage0 minSyncFactor=%x\n",
+                               ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "Unable to read PortPage0 minSyncFactor=%x\n",
                                        ioc->name, ioc->spi_data.minSyncFactor));
                        } else {
                                /* Save the Port Page 0 data
@@ -4808,7 +4809,8 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
 
                                if ( (pPP0->Capabilities & MPI_SCSIPORTPAGE0_CAP_QAS) == 0 ) {
                                        ioc->spi_data.noQas |= MPT_TARGET_NO_NEGO_QAS;
-                                       ddvprintk((KERN_INFO MYNAM " :%s noQas due to Capabilities=%x\n",
+                                       ddvprintk(ioc, printk(KERN_INFO MYNAM
+                                               " :%s noQas due to Capabilities=%x\n",
                                                ioc->name, pPP0->Capabilities));
                                }
                                ioc->spi_data.maxBusWidth = pPP0->Capabilities & MPI_SCSIPORTPAGE0_CAP_WIDE ? 1 : 0;
@@ -4817,7 +4819,8 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
                                        ioc->spi_data.maxSyncOffset = (u8) (data >> 16);
                                        data = pPP0->Capabilities & MPI_SCSIPORTPAGE0_CAP_MIN_SYNC_PERIOD_MASK;
                                        ioc->spi_data.minSyncFactor = (u8) (data >> 8);
-                                       ddvprintk((MYIOC_s_INFO_FMT "PortPage0 minSyncFactor=%x\n",
+                                       ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                               "PortPage0 minSyncFactor=%x\n",
                                                ioc->name, ioc->spi_data.minSyncFactor));
                                } else {
                                        ioc->spi_data.maxSyncOffset = 0;
@@ -4833,7 +4836,8 @@ mpt_GetScsiPortSettings(MPT_ADAPTER *ioc, int portnum)
 
                                        if (ioc->spi_data.minSyncFactor < MPT_ULTRA) {
                                                ioc->spi_data.minSyncFactor = MPT_ULTRA;
-                                               ddvprintk((MYIOC_s_INFO_FMT "HVD or SE detected, minSyncFactor=%x\n",
+                                               ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                                       "HVD or SE detected, minSyncFactor=%x\n",
                                                        ioc->name, ioc->spi_data.minSyncFactor));
                                        }
                                }
@@ -4949,10 +4953,10 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
        ioc->spi_data.sdp0version = cfg.cfghdr.hdr->PageVersion;
        ioc->spi_data.sdp0length = cfg.cfghdr.hdr->PageLength;
 
-       dcprintk((MYIOC_s_INFO_FMT "Headers: 0: version %d length %d\n",
+       dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Headers: 0: version %d length %d\n",
                        ioc->name, ioc->spi_data.sdp0version, ioc->spi_data.sdp0length));
 
-       dcprintk((MYIOC_s_INFO_FMT "Headers: 1: version %d length %d\n",
+       dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Headers: 1: version %d length %d\n",
                        ioc->name, ioc->spi_data.sdp1version, ioc->spi_data.sdp1length));
        return 0;
 }
@@ -5361,12 +5365,12 @@ mpt_read_ioc_pg_1(MPT_ADAPTER *ioc)
        cfg.physAddr = ioc1_dma;
        cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
        if (mpt_config(ioc, &cfg) == 0) {
-               
+
                tmp = le32_to_cpu(pIoc1->Flags) & MPI_IOCPAGE1_REPLY_COALESCING;
                if (tmp == MPI_IOCPAGE1_REPLY_COALESCING) {
                        tmp = le32_to_cpu(pIoc1->CoalescingTimeout);
 
-                       dprintk((MYIOC_s_INFO_FMT "Coalescing Enabled Timeout = %d\n",
+                       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Coalescing Enabled Timeout = %d\n",
                                        ioc->name, tmp));
 
                        if (tmp > MPT_COALESCING_TIMEOUT) {
@@ -5377,26 +5381,29 @@ mpt_read_ioc_pg_1(MPT_ADAPTER *ioc)
                                cfg.dir = 1;
                                cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
                                if (mpt_config(ioc, &cfg) == 0) {
-                                       dprintk((MYIOC_s_INFO_FMT "Reset Current Coalescing Timeout to = %d\n",
+                                       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Reset Current Coalescing Timeout to = %d\n",
                                                        ioc->name, MPT_COALESCING_TIMEOUT));
 
                                        cfg.action = MPI_CONFIG_ACTION_PAGE_WRITE_NVRAM;
                                        if (mpt_config(ioc, &cfg) == 0) {
-                                               dprintk((MYIOC_s_INFO_FMT "Reset NVRAM Coalescing Timeout to = %d\n",
+                                               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                                               "Reset NVRAM Coalescing Timeout to = %d\n",
                                                                ioc->name, MPT_COALESCING_TIMEOUT));
                                        } else {
-                                               dprintk((MYIOC_s_INFO_FMT "Reset NVRAM Coalescing Timeout Failed\n",
-                                                                       ioc->name));
+                                               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                                               "Reset NVRAM Coalescing Timeout Failed\n",
+                                                               ioc->name));
                                        }
 
                                } else {
-                                       dprintk((MYIOC_s_WARN_FMT "Reset of Current Coalescing Timeout Failed!\n",
-                                                               ioc->name));
+                                       dprintk(ioc, printk(MYIOC_s_WARN_FMT
+                                               "Reset of Current Coalescing Timeout Failed!\n",
+                                               ioc->name));
                                }
                        }
 
                } else {
-                       dprintk((MYIOC_s_WARN_FMT "Coalescing Disabled\n", ioc->name));
+                       dprintk(ioc, printk(MYIOC_s_WARN_FMT "Coalescing Disabled\n", ioc->name));
                }
        }
 
@@ -5461,13 +5468,13 @@ SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch)
 
        evnp = (EventNotification_t *) mpt_get_msg_frame(mpt_base_index, ioc);
        if (evnp == NULL) {
-               devtverboseprintk((MYIOC_s_WARN_FMT "Unable to allocate event request frame!\n",
+               devtverboseprintk(ioc, printk(MYIOC_s_WARN_FMT "Unable to allocate event request frame!\n",
                                ioc->name));
                return 0;
        }
        memset(evnp, 0, sizeof(*evnp));
 
-       devtverboseprintk((MYIOC_s_INFO_FMT "Sending EventNotification (%d) request %p\n", ioc->name, EvSwitch, evnp));
+       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending EventNotification (%d) request %p\n", ioc->name, EvSwitch, evnp));
 
        evnp->Function = MPI_FUNCTION_EVENT_NOTIFICATION;
        evnp->ChainOffset = 0;
@@ -5491,12 +5498,12 @@ SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp)
        EventAck_t      *pAck;
 
        if ((pAck = (EventAck_t *) mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) {
-               dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames!!\n",
                    ioc->name,__FUNCTION__));
                return -1;
        }
 
-       devtverboseprintk((MYIOC_s_INFO_FMT "Sending EventAck\n", ioc->name));
+       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending EventAck\n", ioc->name));
 
        pAck->Function     = MPI_FUNCTION_EVENT_ACK;
        pAck->ChainOffset  = 0;
@@ -5541,7 +5548,7 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
         */
        in_isr = in_interrupt();
        if (in_isr) {
-               dcprintk((MYIOC_s_WARN_FMT "Config request not allowed in ISR context!\n",
+               dcprintk(ioc, printk(MYIOC_s_WARN_FMT "Config request not allowed in ISR context!\n",
                                ioc->name));
                return -EPERM;
        }
@@ -5549,7 +5556,7 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
        /* Get and Populate a free Frame
         */
        if ((mf = mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) {
-               dcprintk((MYIOC_s_WARN_FMT "mpt_config: no msg frames!\n",
+               dcprintk(ioc, printk(MYIOC_s_WARN_FMT "mpt_config: no msg frames!\n",
                                ioc->name));
                return -EAGAIN;
        }
@@ -5594,13 +5601,13 @@ mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *pCfg)
        if ((pCfg->cfghdr.hdr->PageType & MPI_CONFIG_PAGETYPE_MASK) == MPI_CONFIG_PAGETYPE_EXTENDED) {
                flagsLength |= pExtHdr->ExtPageLength * 4;
 
-               dcprintk((MYIOC_s_INFO_FMT "Sending Config request type %d, page %d and action %d\n",
+               dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending Config request type %d, page %d and action %d\n",
                        ioc->name, pReq->ExtPageType, pReq->Header.PageNumber, pReq->Action));
        }
        else {
                flagsLength |= pCfg->cfghdr.hdr->PageLength * 4;
 
-               dcprintk((MYIOC_s_INFO_FMT "Sending Config request type %d, page %d and action %d\n",
+               dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending Config request type %d, page %d and action %d\n",
                        ioc->name, pReq->Header.PageType, pReq->Header.PageNumber, pReq->Action));
        }
 
@@ -5650,7 +5657,7 @@ mpt_timer_expired(unsigned long data)
 {
        MPT_ADAPTER *ioc = (MPT_ADAPTER *) data;
 
-       dcprintk((MYIOC_s_WARN_FMT "mpt_timer_expired! \n", ioc->name));
+       dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_timer_expired! \n", ioc->name));
 
        /* Perform a FW reload */
        if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0)
@@ -5660,7 +5667,7 @@ mpt_timer_expired(unsigned long data)
         * Hard reset clean-up will wake up
         * process and free all resources.
         */
-       dcprintk((MYIOC_s_WARN_FMT "mpt_timer_expired complete!\n", ioc->name));
+       dcprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mpt_timer_expired complete!\n", ioc->name));
 
        return;
 }
@@ -5679,7 +5686,7 @@ mpt_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
        CONFIGPARMS *pCfg;
        unsigned long flags;
 
-       dprintk((KERN_WARNING MYNAM
+       dprintk(ioc, printk(KERN_DEBUG MYNAM
                        ": IOC %s_reset routed to MPT base driver!\n",
                        reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
                        reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
@@ -6050,7 +6057,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
        int              rc;
        unsigned long    flags;
 
-       dtmprintk((MYIOC_s_INFO_FMT "HardResetHandler Entered!\n", ioc->name));
+       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HardResetHandler Entered!\n", ioc->name));
 #ifdef MFCNT
        printk(MYIOC_s_INFO_FMT "HardResetHandler Entered!\n", ioc->name);
        printk("MF count 0x%x !\n", ioc->mfcnt);
@@ -6082,11 +6089,11 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
 
                for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
                        if (MptResetHandlers[ii]) {
-                               dtmprintk((MYIOC_s_INFO_FMT "Calling IOC reset_setup handler #%d\n",
+                               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling IOC reset_setup handler #%d\n",
                                                ioc->name, ii));
                                r += mpt_signal_reset(ii, ioc, MPT_IOC_SETUP_RESET);
                                if (ioc->alt_ioc) {
-                                       dtmprintk((MYIOC_s_INFO_FMT "Calling alt-%s setup reset handler #%d\n",
+                                       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling alt-%s setup reset handler #%d\n",
                                                        ioc->name, ioc->alt_ioc->name, ii));
                                        r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_SETUP_RESET);
                                }
@@ -6108,7 +6115,7 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
                ioc->alt_ioc->diagPending = 0;
        spin_unlock_irqrestore(&ioc->diagLock, flags);
 
-       dtmprintk((MYIOC_s_INFO_FMT "HardResetHandler rc = %d!\n", ioc->name, rc));
+       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "HardResetHandler rc = %d!\n", ioc->name, rc));
 
        return rc;
 }
@@ -6509,16 +6516,18 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
        }
 
        EventDescriptionStr(event, evData0, evStr);
-       devtprintk((MYIOC_s_INFO_FMT "MPT event:(%02Xh) : %s\n",
+       devtprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event:(%02Xh) : %s\n",
                        ioc->name,
                        event,
                        evStr));
 
-#if defined(MPT_DEBUG) || defined(MPT_DEBUG_VERBOSE_EVENTS)
-       printk(KERN_INFO MYNAM ": Event data:\n" KERN_INFO);
+#ifdef CONFIG_FUSION_LOGGING
+       devtverboseprintk(ioc, printk(KERN_DEBUG MYNAM
+           ": Event data:\n"));
        for (ii = 0; ii < evDataLen; ii++)
-               printk(" %08x", le32_to_cpu(pEventReply->Data[ii]));
-       printk("\n");
+               devtverboseprintk(ioc, printk(" %08x",
+                   le32_to_cpu(pEventReply->Data[ii])));
+       devtverboseprintk(ioc, printk(KERN_DEBUG "\n"));
 #endif
 
        /*
@@ -6573,7 +6582,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
         */
        for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
                if (MptEvHandlers[ii]) {
-                       devtverboseprintk((MYIOC_s_INFO_FMT "Routing Event to event handler #%d\n",
+                       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Routing Event to event handler #%d\n",
                                        ioc->name, ii));
                        r += (*(MptEvHandlers[ii]))(ioc, pEventReply);
                        handlers++;
@@ -6585,10 +6594,10 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
         *  If needed, send (a single) EventAck.
         */
        if (pEventReply->AckRequired == MPI_EVENT_NOTIFICATION_ACK_REQUIRED) {
-               devtverboseprintk((MYIOC_s_WARN_FMT
+               devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                        "EventAck required\n",ioc->name));
                if ((ii = SendEventAck(ioc, pEventReply)) != 0) {
-                       devtverboseprintk((MYIOC_s_WARN_FMT "SendEventAck returned %d\n",
+                       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SendEventAck returned %d\n",
                                        ioc->name, ii));
                }
        }
@@ -6935,7 +6944,6 @@ union loginfo_type {
                        sas_loginfo.dw.code, sas_loginfo.dw.subcode);
 }
 
-#ifdef MPT_DEBUG_REPLY
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
  *     mpt_iocstatus_info_config - IOCSTATUS information for config pages
@@ -7240,7 +7248,6 @@ mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
 
        printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s\n", ioc->name, status, desc);
 }
-#endif
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 EXPORT_SYMBOL(mpt_attach);
@@ -7305,11 +7312,7 @@ fusion_init(void)
 
        /* Register for hard reset handling callbacks.
         */
-       if (mpt_reset_register(mpt_base_index, mpt_ioc_reset) == 0) {
-               dprintk((KERN_INFO MYNAM ": Register for IOC reset notification\n"));
-       } else {
-               /* FIXME! */
-       }
+       mpt_reset_register(mpt_base_index, mpt_ioc_reset);
 
 #ifdef CONFIG_PROC_FS
        (void) procmpt_create();
@@ -7328,8 +7331,6 @@ static void __exit
 fusion_exit(void)
 {
 
-       dexitprintk((KERN_INFO MYNAM ": fusion_exit() called!\n"));
-
        mpt_reset_deregister(mpt_base_index);
 
 #ifdef CONFIG_PROC_FS
index 98eb9c688e1794b3e8264016d2cf23ef4836128d..15ff22645844ace62cfe016d93b6efef0cf242d2 100644 (file)
  * MPT drivers.  NOTE: Users of these macro defs must
  * themselves define their own MYNAM.
  */
+#define MYIOC_s_DEBUG_FMT              KERN_DEBUG MYNAM ": %s: "
 #define MYIOC_s_INFO_FMT               KERN_INFO MYNAM ": %s: "
 #define MYIOC_s_NOTE_FMT               KERN_NOTICE MYNAM ": %s: "
 #define MYIOC_s_WARN_FMT               KERN_WARNING MYNAM ": %s: WARNING - "
@@ -543,6 +544,7 @@ typedef struct _MPT_ADAPTER
        char                     board_tracer[16];
        u16                      nvdata_version_persistent;
        u16                      nvdata_version_default;
+       int                      debug_level;
        u8                       io_missing_delay;
        u8                       device_missing_delay;
        SYSIF_REGS __iomem      *chip;          /* == c8817000 (mmap) */
@@ -718,171 +720,7 @@ typedef struct _mpt_sge {
 /*
  *  Funky (private) macros...
  */
-#ifdef MPT_DEBUG
-#define dprintk(x)  printk x
-#else
-#define dprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_INIT
-#define dinitprintk(x)  printk x
-#define DBG_DUMP_FW_REQUEST_FRAME(mfp) \
-       {       int  i, n = 10;                                         \
-               u32 *m = (u32 *)(mfp);                                  \
-               printk(KERN_INFO " ");                                  \
-               for (i=0; i<n; i++)                                     \
-                       printk(" %08x", le32_to_cpu(m[i]));             \
-               printk("\n");                                           \
-       }
-#else
-#define dinitprintk(x)
-#define DBG_DUMP_FW_REQUEST_FRAME(mfp)
-#endif
-
-#ifdef MPT_DEBUG_EXIT
-#define dexitprintk(x)  printk x
-#else
-#define dexitprintk(x)
-#endif
-
-#if defined MPT_DEBUG_FAIL || defined (MPT_DEBUG_SG)
-#define dfailprintk(x) printk x
-#else
-#define dfailprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_HANDSHAKE
-#define dhsprintk(x)  printk x
-#else
-#define dhsprintk(x)
-#endif
-
-#if defined(MPT_DEBUG_EVENTS) || defined(MPT_DEBUG_VERBOSE_EVENTS)
-#define devtprintk(x)  printk x
-#else
-#define devtprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_VERBOSE_EVENTS
-#define devtverboseprintk(x)  printk x
-#else
-#define devtverboseprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_RESET
-#define drsprintk(x)  printk x
-#else
-#define drsprintk(x)
-#endif
-
-//#if defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)
-#if defined(MPT_DEBUG_MSG_FRAME)
-#define dmfprintk(x)  printk x
-#define DBG_DUMP_REQUEST_FRAME(mfp) \
-       {       int  i, n = 24;                                         \
-               u32 *m = (u32 *)(mfp);                                  \
-               for (i=0; i<n; i++) {                                   \
-                       if (i && ((i%8)==0))                            \
-                               printk("\n");                           \
-                       printk("%08x ", le32_to_cpu(m[i]));             \
-               }                                                       \
-               printk("\n");                                           \
-       }
-#else
-#define dmfprintk(x)
-#define DBG_DUMP_REQUEST_FRAME(mfp)
-#endif
-
-#ifdef MPT_DEBUG_IRQ
-#define dirqprintk(x)  printk x
-#else
-#define dirqprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_SG
-#define dsgprintk(x)  printk x
-#else
-#define dsgprintk(x)
-#endif
-
-#if defined(MPT_DEBUG_DL) || defined(MPT_DEBUG)
-#define ddlprintk(x)  printk x
-#else
-#define ddlprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_DV
-#define ddvprintk(x)  printk x
-#else
-#define ddvprintk(x)
-#endif
-
-#if defined(MPT_DEBUG_DV) || defined(MPT_DEBUG_DV_TINY)
-#define ddvtprintk(x)  printk x
-#else
-#define ddvtprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_IOCTL
-#define dctlprintk(x) printk x
-#else
-#define dctlprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_REPLY
-#define dreplyprintk(x) printk x
-#else
-#define dreplyprintk(x)
-#endif
-
-#ifdef DMPT_DEBUG_FC
-#define dfcprintk(x) printk x
-#else
-#define dfcprintk(x)
-#endif
-
-#ifdef MPT_DEBUG_TM
-#define dtmprintk(x) printk x
-#define DBG_DUMP_TM_REQUEST_FRAME(mfp) \
-       {       u32 *m = (u32 *)(mfp);                                  \
-               int  i, n = 13;                                         \
-               printk("TM_REQUEST:\n");                                \
-               for (i=0; i<n; i++) {                                   \
-                       if (i && ((i%8)==0))                            \
-                               printk("\n");                           \
-                       printk("%08x ", le32_to_cpu(m[i]));             \
-               }                                                       \
-               printk("\n");                                           \
-       }
-#define DBG_DUMP_TM_REPLY_FRAME(mfp) \
-       {       u32 *m = (u32 *)(mfp);                                  \
-               int  i, n = (le32_to_cpu(m[0]) & 0x00FF0000) >> 16;     \
-               printk("TM_REPLY MessageLength=%d:\n", n);              \
-               for (i=0; i<n; i++) {                                   \
-                       if (i && ((i%8)==0))                            \
-                               printk("\n");                           \
-                       printk(" %08x", le32_to_cpu(m[i]));             \
-               }                                                       \
-               printk("\n");                                           \
-       }
-#else
-#define dtmprintk(x)
-#define DBG_DUMP_TM_REQUEST_FRAME(mfp)
-#define DBG_DUMP_TM_REPLY_FRAME(mfp)
-#endif
-
-#if defined(MPT_DEBUG_CONFIG) || defined(MPT_DEBUG)
-#define dcprintk(x) printk x
-#else
-#define dcprintk(x)
-#endif
-
-#if defined(MPT_DEBUG_SCSI) || defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)
-#define dsprintk(x) printk x
-#else
-#define dsprintk(x)
-#endif
-
+#include "mptdebug.h"
 
 #define MPT_INDEX_2_MFPTR(ioc,idx) \
        (MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) )
@@ -893,36 +731,6 @@ typedef struct _mpt_sge {
 #define MPT_INDEX_2_RFPTR(ioc,idx) \
        (MPT_FRAME_HDR*)( (u8*)(ioc)->reply_frames + (ioc)->req_sz * (idx) )
 
-#if defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)
-#define DBG_DUMP_REPLY_FRAME(mfp) \
-       {       u32 *m = (u32 *)(mfp);                                  \
-               int  i, n = (le32_to_cpu(m[0]) & 0x00FF0000) >> 16;     \
-               printk(KERN_INFO " ");                                  \
-               for (i=0; i<n; i++)                                     \
-                       printk(" %08x", le32_to_cpu(m[i]));             \
-               printk("\n");                                           \
-       }
-#define DBG_DUMP_REQUEST_FRAME_HDR(mfp) \
-       {       int  i, n = 3;                                          \
-               u32 *m = (u32 *)(mfp);                                  \
-               printk(KERN_INFO " ");                                  \
-               for (i=0; i<n; i++)                                     \
-                       printk(" %08x", le32_to_cpu(m[i]));             \
-               printk("\n");                                           \
-       }
-#else
-#define DBG_DUMP_REPLY_FRAME(mfp)
-#define DBG_DUMP_REQUEST_FRAME_HDR(mfp)
-#endif
-
-// debug sas wide ports
-#ifdef MPT_DEBUG_SAS_WIDE
-#define dsaswideprintk(x) printk x
-#else
-#define dsaswideprintk(x)
-#endif
-
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
 #define SCSI_STD_SENSE_BYTES    18
index 58e6c319cc76244db9aab6b6a79eb57e0afaed81..89695e705bdc936b72df4dca3a98b3364ee58f3b 100644 (file)
@@ -181,7 +181,7 @@ static inline int
 mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
 {
        int rc = 0;
-       dctlprintk((KERN_INFO MYNAM "::mptctl_syscall_down(%p,%d) called\n", ioc, nonblock));
+//     dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down(%p,%d) called\n", ioc, nonblock));
 
        if (nonblock) {
                if (!mutex_trylock(&ioc->ioctl->ioctl_mutex))
@@ -190,7 +190,7 @@ mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
                if (mutex_lock_interruptible(&ioc->ioctl->ioctl_mutex))
                        rc = -ERESTARTSYS;
        }
-       dctlprintk((KERN_INFO MYNAM "::mptctl_syscall_down return %d\n", rc));
+//     dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down return %d\n", rc));
        return rc;
 }
 
@@ -209,18 +209,19 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
        u16 iocStatus;
        u8 cmd;
 
-       dctlprintk(("mptctl_reply()!\n"));
        if (req)
                 cmd = req->u.hdr.Function;
        else
                return 1;
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\tcompleting mpi function (0x%02X), req=%p, "
+           "reply=%p\n", ioc->name,  req->u.hdr.Function, req, reply));
 
        if (ioc->ioctl) {
 
                if (reply==NULL) {
 
-                       dctlprintk(("mptctl_reply() NULL Reply "
-                               "Function=%x!\n", cmd));
+                       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_reply() NULL Reply "
+                               "Function=%x!\n", ioc->name, cmd));
 
                        ioc->ioctl->status |= MPT_IOCTL_STATUS_COMMAND_GOOD;
                        ioc->ioctl->reset &= ~MPTCTL_RESET_OK;
@@ -233,14 +234,9 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
 
                }
 
-               dctlprintk(("mptctl_reply() with req=%p "
-                       "reply=%p Function=%x!\n", req, reply, cmd));
-
                /* Copy the reply frame (which much exist
                 * for non-SCSI I/O) to the IOC structure.
                 */
-               dctlprintk(("Copying Reply Frame @%p to ioc%d!\n",
-                       reply, ioc->id));
                memcpy(ioc->ioctl->ReplyFrame, reply,
                        min(ioc->reply_sz, 4*reply->u.reply.MsgLength));
                ioc->ioctl->status |= MPT_IOCTL_STATUS_RF_VALID;
@@ -252,8 +248,24 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
                if (iocStatus  == MPI_IOCSTATUS_SUCCESS)
                        ioc->ioctl->status |= MPT_IOCTL_STATUS_COMMAND_GOOD;
 
+               if (iocStatus || reply->u.reply.IOCLogInfo)
+                       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\tiocstatus (0x%04X), "
+                               "loginfo (0x%08X)\n", ioc->name,
+                               iocStatus,
+                               le32_to_cpu(reply->u.reply.IOCLogInfo)));
+
                if ((cmd == MPI_FUNCTION_SCSI_IO_REQUEST) ||
                        (cmd == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) {
+
+                       if (reply->u.sreply.SCSIStatus || reply->u.sreply.SCSIState)
+                               dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                                       "\tscsi_status (0x%02x), scsi_state (0x%02x), "
+                                       "tag = (0x%04x), transfer_count (0x%08x)\n", ioc->name,
+                                       reply->u.sreply.SCSIStatus,
+                                       reply->u.sreply.SCSIState,
+                                       le16_to_cpu(reply->u.sreply.TaskTag),
+                                       le32_to_cpu(reply->u.sreply.TransferCount)));
+
                        ioc->ioctl->reset &= ~MPTCTL_RESET_OK;
 
                        if ((iocStatus == MPI_IOCSTATUS_SCSI_DATA_UNDERRUN) ||
@@ -298,8 +310,8 @@ static void mptctl_timeout_expired (MPT_IOCTL *ioctl)
 {
        int rc = 1;
 
-       dctlprintk((KERN_NOTICE MYNAM ": Timeout Expired! Host %d\n",
-                               ioctl->ioc->id));
+       dctlprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT ": Timeout Expired! Host %d\n",
+                               ioctl->ioc->name, ioctl->ioc->id));
        if (ioctl == NULL)
                return;
 
@@ -311,7 +323,7 @@ static void mptctl_timeout_expired (MPT_IOCTL *ioctl)
                /* Issue a reset for this device.
                 * The IOC is not responding.
                 */
-               dctlprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n",
+               dctlprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n",
                         ioctl->ioc->name));
                mpt_HardResetHandler(ioctl->ioc, CAN_SLEEP);
        }
@@ -350,14 +362,14 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
        /* Send request
         */
        if ((mf = mpt_get_msg_frame(mptctl_id, ioctl->ioc)) == NULL) {
-               dctlprintk((MYIOC_s_WARN_FMT "IssueTaskMgmt, no msg frames!!\n",
+               dtmprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt, no msg frames!!\n",
                                ioctl->ioc->name));
 
                mptctl_free_tm_flags(ioctl->ioc);
                return -ENOMEM;
        }
 
-       dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt request @ %p\n",
+       dtmprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt request @ %p\n",
                        ioctl->ioc->name, mf));
 
        pScsiTm = (SCSITaskMgmt_t *) mf;
@@ -377,15 +389,15 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
                pScsiTm->Reserved2[ii] = 0;
 
        pScsiTm->TaskMsgContext = 0;
-       dtmprintk((MYIOC_s_INFO_FMT
+       dtmprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT
                "mptctl_bus_reset: issued.\n", ioctl->ioc->name));
 
-       DBG_DUMP_TM_REQUEST_FRAME((u32 *)mf);
+       DBG_DUMP_TM_REQUEST_FRAME(ioctl->ioc, (u32 *)mf);
 
        ioctl->wait_done=0;
        if ((retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc,
             sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) {
-               dfailprintk((MYIOC_s_ERR_FMT "_send_handshake FAILED!"
+               dfailprintk(ioctl->ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
                        " (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
                        hd->ioc, mf));
                goto mptctl_bus_reset_done;
@@ -456,7 +468,7 @@ static int
 mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
 {
        MPT_IOCTL *ioctl = ioc->ioctl;
-       dctlprintk((KERN_INFO MYNAM ": IOC %s_reset routed to IOCTL driver!\n",
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": IOC %s_reset routed to IOCTL driver!\n",ioc->name,
                reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
                reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
 
@@ -487,7 +499,8 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
 
        event = le32_to_cpu(pEvReply->Event) & 0xFF;
 
-       dctlprintk(("%s() called\n", __FUNCTION__));
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s() called\n",
+           ioc->name, __FUNCTION__));
        if(async_queue == NULL)
                return 1;
 
@@ -497,8 +510,10 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
         */
         if (event == 0x21 ) {
                ioc->aen_event_read_flag=1;
-               dctlprintk(("Raised SIGIO to application\n"));
-               devtverboseprintk(("Raised SIGIO to application\n"));
+               dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Raised SIGIO to application\n",
+                   ioc->name));
+               devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                   "Raised SIGIO to application\n", ioc->name));
                kill_fasync(&async_queue, SIGIO, POLL_IN);
                return 1;
         }
@@ -515,8 +530,10 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
         */
        if (ioc->events && (ioc->eventTypes & ( 1 << event))) {
                ioc->aen_event_read_flag=1;
-               dctlprintk(("Raised SIGIO to application\n"));
-               devtverboseprintk(("Raised SIGIO to application\n"));
+               dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                   "Raised SIGIO to application\n", ioc->name));
+               devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                   "Raised SIGIO to application\n", ioc->name));
                kill_fasync(&async_queue, SIGIO, POLL_IN);
        }
        return 1;
@@ -530,14 +547,12 @@ mptctl_fasync(int fd, struct file *filep, int mode)
        list_for_each_entry(ioc, &ioc_list, list)
                ioc->aen_event_read_flag=0;
 
-       dctlprintk(("%s() called\n", __FUNCTION__));
        return fasync_helper(fd, filep, mode, &async_queue);
 }
 
 static int
 mptctl_release(struct inode *inode, struct file *filep)
 {
-       dctlprintk(("%s() called\n", __FUNCTION__));
        return fasync_helper(-1, filep, 0, &async_queue);
 }
 
@@ -558,8 +573,6 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        int ret;
        MPT_ADAPTER *iocp = NULL;
 
-       dctlprintk(("mptctl_ioctl() called\n"));
-
        if (copy_from_user(&khdr, uhdr, sizeof(khdr))) {
                printk(KERN_ERR "%s::mptctl_ioctl() @%d - "
                                "Unable to copy mpt_ioctl_header data @ %p\n",
@@ -574,13 +587,13 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        iocnumX = khdr.iocnum & 0xFF;
        if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
            (iocp == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_ioctl() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnumX));
+               printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnumX);
                return -ENODEV;
        }
 
        if (!iocp->active) {
-               printk(KERN_ERR "%s::mptctl_ioctl() @%d - Controller disabled.\n",
+               printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - Controller disabled.\n",
                                __FILE__, __LINE__);
                return -EFAULT;
        }
@@ -612,8 +625,6 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
                return ret;
 
-       dctlprintk((MYIOC_s_INFO_FMT ": mptctl_ioctl()\n", iocp->name));
-
        if (cmd == MPTFWDOWNLOAD)
                ret = mptctl_fw_download(arg);
        else if (cmd == MPTCOMMAND)
@@ -648,8 +659,6 @@ static int mptctl_do_reset(unsigned long arg)
        struct mpt_ioctl_diag_reset krinfo;
        MPT_ADAPTER             *iocp;
 
-       dctlprintk((KERN_INFO "mptctl_do_reset called.\n"));
-
        if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) {
                printk(KERN_ERR "%s@%d::mptctl_do_reset - "
                                "Unable to copy mpt_ioctl_diag_reset struct @ %p\n",
@@ -658,11 +667,14 @@ static int mptctl_do_reset(unsigned long arg)
        }
 
        if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) {
-               dctlprintk((KERN_ERR "%s@%d::mptctl_do_reset - ioc%d not found!\n",
-                               __FILE__, __LINE__, krinfo.hdr.iocnum));
+               printk(KERN_DEBUG "%s@%d::mptctl_do_reset - ioc%d not found!\n",
+                               __FILE__, __LINE__, krinfo.hdr.iocnum);
                return -ENODEV; /* (-6) No such device or address */
        }
 
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "mptctl_do_reset called.\n",
+           iocp->name));
+
        if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) {
                printk (KERN_ERR "%s@%d::mptctl_do_reset - reset failed.\n",
                        __FILE__, __LINE__);
@@ -695,7 +707,6 @@ mptctl_fw_download(unsigned long arg)
        struct mpt_fw_xfer __user *ufwdl = (void __user *) arg;
        struct mpt_fw_xfer       kfwdl;
 
-       dctlprintk((KERN_INFO "mptctl_fwdl called. mptctl_id = %xh\n", mptctl_id)); //tc
        if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) {
                printk(KERN_ERR "%s@%d::_ioctl_fwdl - "
                                "Unable to copy mpt_fw_xfer struct @ %p\n",
@@ -744,15 +755,8 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
        u16                      iocstat;
        pFWDownloadReply_t       ReplyMsg = NULL;
 
-       dctlprintk(("mptctl_do_fwdl called. mptctl_id = %xh.\n", mptctl_id));
-
-       dctlprintk(("DbG: kfwdl.bufp  = %p\n", ufwbuf));
-       dctlprintk(("DbG: kfwdl.fwlen = %d\n", (int)fwlen));
-       dctlprintk(("DbG: kfwdl.ioc   = %04xh\n", ioc));
-
        if (mpt_verify_adapter(ioc, &iocp) < 0) {
-               dctlprintk(("ioctl_fwdl - ioc%d not found!\n",
-                                ioc));
+               printk(KERN_DEBUG "ioctl_fwdl - ioc%d not found!\n",                             ioc);
                return -ENODEV; /* (-6) No such device or address */
        } else {
 
@@ -761,6 +765,16 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
                if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL)
                        return -EAGAIN;
        }
+
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT
+           "mptctl_do_fwdl called. mptctl_id = %xh.\n", iocp->name, mptctl_id));
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.bufp  = %p\n",
+           iocp->name, ufwbuf));
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.fwlen = %d\n",
+           iocp->name, (int)fwlen));
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.ioc   = %04xh\n",
+           iocp->name, ioc));
+
        dlmsg = (FWDownload_t*) mf;
        ptsge = (FWDownloadTCSGE_t *) &dlmsg->SGL;
        sgOut = (char *) (ptsge + 1);
@@ -829,7 +843,8 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
                goto fwdl_out;
        }
 
-       dctlprintk(("DbG: sgl buffer  = %p, sgfrags = %d\n", sgl, numfrags));
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n",
+           iocp->name, sgl, numfrags));
 
        /*
         * Parse SG list, copying sgl itself,
@@ -865,15 +880,7 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
                sgOut += (sizeof(dma_addr_t) + sizeof(u32));
        }
 
-#ifdef MPT_DEBUG
-       {
-               u32 *m = (u32 *)mf;
-               printk(KERN_INFO MYNAM ": F/W download request:\n" KERN_INFO " ");
-               for (i=0; i < 7+numfrags*2; i++)
-                       printk(" %08x", le32_to_cpu(m[i]));
-               printk("\n");
-       }
-#endif
+       DBG_DUMP_FW_DOWNLOAD(iocp, (u32 *)mf, numfrags);
 
        /*
         * Finally, perform firmware download.
@@ -1049,13 +1056,11 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
        *frags = numfrags;
        *blp = buflist;
 
-       dctlprintk((KERN_INFO MYNAM "-SG: kbuf_alloc_2_sgl() - "
-                          "%d SG frags generated!\n",
-                          numfrags));
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
+          "%d SG frags generated!\n", ioc->name, numfrags));
 
-       dctlprintk((KERN_INFO MYNAM "-SG: kbuf_alloc_2_sgl() - "
-                          "last (big) alloc_sz=%d\n",
-                          alloc_sz));
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
+          "last (big) alloc_sz=%d\n", ioc->name, alloc_sz));
 
        return sglbuf;
 
@@ -1139,7 +1144,8 @@ kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma, struct buflist *buflist, MPT_ADAPTE
 
        pci_free_consistent(ioc->pcidev, MAX_SGL_BYTES, sgl, sgl_dma);
        kfree(buflist);
-       dctlprintk((KERN_INFO MYNAM "-SG: Free'd 1 SGL buf + %d kbufs!\n", n));
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: Free'd 1 SGL buf + %d kbufs!\n",
+           ioc->name, n));
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1166,7 +1172,6 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
        struct scsi_device      *sdev;
        VirtDevice              *vdev;
 
-       dctlprintk((": mptctl_getiocinfo called.\n"));
        /* Add of PCI INFO results in unaligned access for
         * IA64 and Sparc. Reset long to int. Return no PCI
         * data for obsolete format.
@@ -1199,8 +1204,8 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
 
        if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                kfree(karg);
                return -ENODEV;
        }
@@ -1214,6 +1219,9 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
                return -EFAULT;
        }
 
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_getiocinfo called.\n",
+           ioc->name));
+
        /* Fill in the data and return the structure to the calling
         * program
         */
@@ -1320,7 +1328,6 @@ mptctl_gettargetinfo (unsigned long arg)
        u8                      port;
        struct scsi_device      *sdev;
 
-       dctlprintk(("mptctl_gettargetinfo called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) {
                printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - "
                        "Unable to read in mpt_ioctl_targetinfo struct @ %p\n",
@@ -1330,11 +1337,13 @@ mptctl_gettargetinfo (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
 
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_gettargetinfo called.\n",
+           ioc->name));
        /* Get the port number and set the maximum number of bytes
         * in the returned structure.
         * Ignore the port setting.
@@ -1434,7 +1443,6 @@ mptctl_readtest (unsigned long arg)
        MPT_ADAPTER *ioc;
        int iocnum;
 
-       dctlprintk(("mptctl_readtest called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) {
                printk(KERN_ERR "%s@%d::mptctl_readtest - "
                        "Unable to read in mpt_ioctl_test struct @ %p\n",
@@ -1444,11 +1452,13 @@ mptctl_readtest (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_readtest() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_readtest() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
 
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_readtest called.\n",
+           ioc->name));
        /* Fill in the data and return the structure to the calling
         * program
         */
@@ -1494,7 +1504,6 @@ mptctl_eventquery (unsigned long arg)
        MPT_ADAPTER *ioc;
        int iocnum;
 
-       dctlprintk(("mptctl_eventquery called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) {
                printk(KERN_ERR "%s@%d::mptctl_eventquery - "
                        "Unable to read in mpt_ioctl_eventquery struct @ %p\n",
@@ -1504,11 +1513,13 @@ mptctl_eventquery (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_eventquery() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_eventquery() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
 
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventquery called.\n",
+           ioc->name));
        karg.eventEntries = MPTCTL_EVENT_LOG_SIZE;
        karg.eventTypes = ioc->eventTypes;
 
@@ -1532,7 +1543,6 @@ mptctl_eventenable (unsigned long arg)
        MPT_ADAPTER *ioc;
        int iocnum;
 
-       dctlprintk(("mptctl_eventenable called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) {
                printk(KERN_ERR "%s@%d::mptctl_eventenable - "
                        "Unable to read in mpt_ioctl_eventenable struct @ %p\n",
@@ -1542,11 +1552,13 @@ mptctl_eventenable (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_eventenable() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_eventenable() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
 
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventenable called.\n",
+           ioc->name));
        if (ioc->events == NULL) {
                /* Have not yet allocated memory - do so now.
                 */
@@ -1579,7 +1591,6 @@ mptctl_eventreport (unsigned long arg)
        int                      iocnum;
        int                      numBytes, maxEvents, max;
 
-       dctlprintk(("mptctl_eventreport called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) {
                printk(KERN_ERR "%s@%d::mptctl_eventreport - "
                        "Unable to read in mpt_ioctl_eventreport struct @ %p\n",
@@ -1589,10 +1600,12 @@ mptctl_eventreport (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_eventreport() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_eventreport() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventreport called.\n",
+           ioc->name));
 
        numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header);
        maxEvents = numBytes/sizeof(MPT_IOCTL_EVENTS);
@@ -1632,7 +1645,6 @@ mptctl_replace_fw (unsigned long arg)
        int                      iocnum;
        int                      newFwSize;
 
-       dctlprintk(("mptctl_replace_fw called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) {
                printk(KERN_ERR "%s@%d::mptctl_replace_fw - "
                        "Unable to read in mpt_ioctl_replace_fw struct @ %p\n",
@@ -1642,11 +1654,13 @@ mptctl_replace_fw (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
 
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_replace_fw called.\n",
+           ioc->name));
        /* If caching FW, Free the old FW image
         */
        if (ioc->cached_fw == NULL)
@@ -1704,7 +1718,6 @@ mptctl_mpt_command (unsigned long arg)
        int             iocnum;
        int             rc;
 
-       dctlprintk(("mptctl_command called.\n"));
 
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) {
                printk(KERN_ERR "%s@%d::mptctl_mpt_command - "
@@ -1715,8 +1728,8 @@ mptctl_mpt_command (unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
 
@@ -1756,13 +1769,12 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
        ulong           timeout;
        struct scsi_device *sdev;
 
-       dctlprintk(("mptctl_do_mpt_command called.\n"));
        bufIn.kptr = bufOut.kptr = NULL;
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
        if (!ioc->ioctl) {
@@ -1816,6 +1828,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
 
        /* Verify that this request is allowed.
         */
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sending mpi function (0x%02X), req=%p\n",
+           ioc->name, hdr->Function, mf));
+
        switch (hdr->Function) {
        case MPI_FUNCTION_IOC_FACTS:
        case MPI_FUNCTION_PORT_FACTS:
@@ -1823,6 +1838,18 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
                break;
 
        case MPI_FUNCTION_CONFIG:
+       {
+               Config_t *config_frame;
+               config_frame = (Config_t *)mf;
+               dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\ttype=0x%02x ext_type=0x%02x "
+                   "number=0x%02x action=0x%02x\n", ioc->name,
+                   config_frame->Header.PageType,
+                   config_frame->ExtPageType,
+                   config_frame->Header.PageNumber,
+                   config_frame->Action));
+               break;
+       }
+
        case MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND:
        case MPI_FUNCTION_FC_EX_LINK_SRVC_SEND:
        case MPI_FUNCTION_FW_UPLOAD:
@@ -2158,12 +2185,12 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
        ioc->ioctl->wait_done = 0;
        if (hdr->Function == MPI_FUNCTION_SCSI_TASK_MGMT) {
 
-               DBG_DUMP_TM_REQUEST_FRAME((u32 *)mf);
+               DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
 
                if (mpt_send_handshake_request(mptctl_id, ioc,
                        sizeof(SCSITaskMgmt_t), (u32*)mf,
                        CAN_SLEEP) != 0) {
-                       dfailprintk((MYIOC_s_ERR_FMT "_send_handshake FAILED!"
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
                                " (ioc %p, mf %p) \n", ioc->name,
                                ioc, mf));
                        mptctl_free_tm_flags(ioc);
@@ -2303,7 +2330,6 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
        MPT_FRAME_HDR           *mf = NULL;
        MPIHeader_t             *mpi_hdr;
 
-       dctlprintk((": mptctl_hp_hostinfo called.\n"));
        /* Reset long to int. Should affect IA64 and SPARC only
         */
        if (data_size == sizeof(hp_host_info_t))
@@ -2322,10 +2348,12 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
            (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_hostinfo called.\n",
+           ioc->name));
 
        /* Fill in the data and return the structure to the calling
         * program
@@ -2441,7 +2469,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
         * Gather ISTWI(Industry Standard Two Wire Interface) Data
         */
        if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) {
-               dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames!!\n",
                    ioc->name,__FUNCTION__));
                goto out;
        }
@@ -2474,7 +2502,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
             HZ*MPT_IOCTL_DEFAULT_TIMEOUT /* 10 sec */);
 
        if(rc <=0 && (ioc->ioctl->wait_done != 1 )) {
-               /* 
+               /*
                 * Now we need to reset the board
                 */
                mpt_free_msg_frame(ioc, mf);
@@ -2482,7 +2510,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
                goto out;
        }
 
-       /* 
+       /*
         *ISTWI Data Definition
         * pbuf[0] = FW_VERSION = 0x4
         * pbuf[1] = Bay Count = 6 or 4 or 2, depending on
@@ -2538,7 +2566,6 @@ mptctl_hp_targetinfo(unsigned long arg)
        ConfigPageHeader_t      hdr;
        int                     tmp, np, rc = 0;
 
-       dctlprintk((": mptctl_hp_targetinfo called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) {
                printk(KERN_ERR "%s@%d::mptctl_hp_targetinfo - "
                        "Unable to read in hp_host_targetinfo struct @ %p\n",
@@ -2548,10 +2575,12 @@ mptctl_hp_targetinfo(unsigned long arg)
 
        if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
                (ioc == NULL)) {
-               dctlprintk((KERN_ERR "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",
-                               __FILE__, __LINE__, iocnum));
+               printk(KERN_DEBUG "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",
+                               __FILE__, __LINE__, iocnum);
                return -ENODEV;
        }
+       dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_targetinfo called.\n",
+           ioc->name));
 
        /*  There is nothing to do for FCP parts.
         */
@@ -2694,7 +2723,6 @@ compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
        int nonblock = (filp->f_flags & O_NONBLOCK);
        int ret;
 
-       dctlprintk((KERN_INFO MYNAM "::compat_mptfwxfer_ioctl() called\n"));
 
        if (copy_from_user(&kfw32, (char __user *)arg, sizeof(kfw32)))
                return -EFAULT;
@@ -2703,14 +2731,16 @@ compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
        iocnumX = kfw32.iocnum & 0xFF;
        if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
            (iocp == NULL)) {
-               dctlprintk((KERN_ERR MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n",
-                               __LINE__, iocnumX));
+               printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n",
+                               __LINE__, iocnumX);
                return -ENODEV;
        }
 
        if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
                return ret;
 
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mptfwxfer_ioctl() called\n",
+           iocp->name));
        kfw.iocnum = iocnum;
        kfw.fwlen = kfw32.fwlen;
        kfw.bufp = compat_ptr(kfw32.bufp);
@@ -2734,8 +2764,6 @@ compat_mpt_command(struct file *filp, unsigned int cmd,
        int nonblock = (filp->f_flags & O_NONBLOCK);
        int ret;
 
-       dctlprintk((KERN_INFO MYNAM "::compat_mpt_command() called\n"));
-
        if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32)))
                return -EFAULT;
 
@@ -2743,14 +2771,16 @@ compat_mpt_command(struct file *filp, unsigned int cmd,
        iocnumX = karg32.hdr.iocnum & 0xFF;
        if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
            (iocp == NULL)) {
-               dctlprintk((KERN_ERR MYNAM "::compat_mpt_command @%d - ioc%d not found!\n",
-                               __LINE__, iocnumX));
+               printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n",
+                               __LINE__, iocnumX);
                return -ENODEV;
        }
 
        if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
                return ret;
 
+       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mpt_command() called\n",
+           iocp->name));
        /* Copy data to karg */
        karg.hdr.iocnum = karg32.hdr.iocnum;
        karg.hdr.port = karg32.hdr.port;
@@ -2878,11 +2908,7 @@ static int __init mptctl_init(void)
 
        show_mptmod_ver(my_NAME, my_VERSION);
 
-       if(mpt_device_driver_register(&mptctl_driver,
-         MPTCTL_DRIVER) != 0 ) {
-               dprintk((KERN_INFO MYNAM
-               ": failed to register dd callbacks\n"));
-       }
+       mpt_device_driver_register(&mptctl_driver, MPTCTL_DRIVER);
 
        /* Register this device */
        err = misc_register(&mptctl_miscdev);
@@ -2905,16 +2931,8 @@ static int __init mptctl_init(void)
                goto out_fail;
        }
 
-       if (mpt_reset_register(mptctl_id, mptctl_ioc_reset) == 0) {
-               dprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n"));
-       } else {
-               /* FIXME! */
-       }
-
-       if (mpt_event_register(mptctl_id, mptctl_event_process) == 0) {
-               devtverboseprintk((KERN_INFO MYNAM
-                 ": Registered for IOC event notifications\n"));
-       }
+       mpt_reset_register(mptctl_id, mptctl_ioc_reset);
+       mpt_event_register(mptctl_id, mptctl_event_process);
 
        return 0;
 
@@ -2934,11 +2952,9 @@ static void mptctl_exit(void)
 
        /* De-register reset handler from base module */
        mpt_reset_deregister(mptctl_id);
-       dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset notifications\n"));
 
        /* De-register callback handler from base module */
        mpt_deregister(mptctl_id);
-       printk(KERN_INFO MYNAM ": Deregistered from Fusion MPT base driver\n");
 
         mpt_device_driver_deregister(MPTCTL_DRIVER);
 
diff --git a/drivers/message/fusion/mptdebug.h b/drivers/message/fusion/mptdebug.h
new file mode 100644 (file)
index 0000000..ffdb0a6
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ *  linux/drivers/message/fusion/mptdebug.h
+ *      For use with LSI PCI chip/adapter(s)
+ *      running LSI Fusion MPT (Message Passing Technology) firmware.
+ *
+ *  Copyright (c) 1999-2007 LSI Corporation
+ *  (mailto:DL-MPTFusionLinux@lsi.com)
+ *
+ */
+/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+
+#ifndef MPTDEBUG_H_INCLUDED
+#define MPTDEBUG_H_INCLUDED
+
+/*
+ * debug level can be programmed on the fly via SysFS (hex values)
+ *
+ * Example:  (programming for MPT_DEBUG_EVENTS on host 5)
+ *
+ * echo 8 > /sys/class/scsi_host/host5/debug_level
+ *
+ * --------------------------------------------------------
+ * mpt_debug_level - command line parameter
+ * this allow enabling debug at driver load time (for all iocs)
+ *
+ * Example  (programming for MPT_DEBUG_EVENTS)
+ *
+ * insmod mptbase.ko mpt_debug_level=8
+ *
+ * --------------------------------------------------------
+ * CONFIG_FUSION_LOGGING - enables compiling debug into driver
+ * this can be enabled in the driver Makefile
+ *
+ *
+ * --------------------------------------------------------
+ * Please note most debug prints are set to logging priority = debug
+ * This is the lowest level, and most verbose.  Please refer to manual
+ * pages for syslogd or syslogd-ng on how to configure this.
+ */
+
+#define MPT_DEBUG                      0x00000001
+#define MPT_DEBUG_MSG_FRAME            0x00000002
+#define MPT_DEBUG_SG                   0x00000004
+#define MPT_DEBUG_EVENTS               0x00000008
+#define MPT_DEBUG_VERBOSE_EVENTS       0x00000010
+#define MPT_DEBUG_INIT                 0x00000020
+#define MPT_DEBUG_EXIT                 0x00000040
+#define MPT_DEBUG_FAIL                 0x00000080
+#define MPT_DEBUG_TM                   0x00000100
+#define MPT_DEBUG_DV                   0x00000200
+#define MPT_DEBUG_REPLY                        0x00000400
+#define MPT_DEBUG_HANDSHAKE            0x00000800
+#define MPT_DEBUG_CONFIG               0x00001000
+#define MPT_DEBUG_DL                   0x00002000
+#define MPT_DEBUG_RESET                        0x00008000
+#define MPT_DEBUG_SCSI                 0x00010000
+#define MPT_DEBUG_IOCTL                        0x00020000
+#define MPT_DEBUG_FC                   0x00080000
+#define MPT_DEBUG_SAS                  0x00100000
+#define MPT_DEBUG_SAS_WIDE             0x00200000
+
+/*
+ * CONFIG_FUSION_LOGGING - enabled in Kconfig
+ */
+
+#ifdef CONFIG_FUSION_LOGGING
+#define MPT_CHECK_LOGGING(IOC, CMD, BITS)                      \
+{                                                              \
+       if (IOC->debug_level & BITS)                            \
+               CMD;                                            \
+}
+#else
+#define MPT_CHECK_LOGGING(IOC, CMD, BITS)
+#endif
+
+
+/*
+ * debug macros
+ */
+
+#define dprintk(IOC, CMD)                      \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG)
+
+#define dsgprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SG)
+
+#define devtprintk(IOC, CMD)                   \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EVENTS)
+
+#define devtverboseprintk(IOC, CMD)            \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_VERBOSE_EVENTS)
+
+#define dinitprintk(IOC, CMD)                  \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_INIT)
+
+#define dexitprintk(IOC, CMD)                  \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EXIT)
+
+#define dfailprintk(IOC, CMD)                  \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FAIL)
+
+#define dtmprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TM)
+
+#define ddvprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DV)
+
+#define dreplyprintk(IOC, CMD)                 \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_REPLY)
+
+#define dhsprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_HANDSHAKE)
+
+#define dcprintk(IOC, CMD)                     \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_CONFIG)
+
+#define ddlprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DL)
+
+#define drsprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_RESET)
+
+#define dsprintk(IOC, CMD)                     \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SCSI)
+
+#define dctlprintk(IOC, CMD)                   \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_IOCTL)
+
+#define dfcprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FC)
+
+#define dsasprintk(IOC, CMD)                   \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS)
+
+#define dsaswideprintk(IOC, CMD)               \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS_WIDE)
+
+
+
+/*
+ * Verbose logging
+ */
+#if defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING)
+static inline void
+DBG_DUMP_FW_DOWNLOAD(MPT_ADAPTER *ioc, u32  *mfp, int numfrags)
+{
+       int i;
+
+       if (!(ioc->debug_level & MPT_DEBUG))
+               return;
+       printk(KERN_DEBUG "F/W download request:\n");
+       for (i=0; i < 7+numfrags*2; i++)
+               printk(" %08x", le32_to_cpu(mfp[i]));
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_PUT_MSG_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int      ii, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
+               return;
+       printk(KERN_DEBUG "%s: About to Put msg frame @ %p:\n",
+               ioc->name, mfp);
+       n = ioc->req_sz/4 - 1;
+       while (mfp[n] == 0)
+               n--;
+       for (ii=0; ii<=n; ii++) {
+               if (ii && ((ii%8)==0))
+                       printk("\n");
+               printk(" %08x", le32_to_cpu(mfp[ii]));
+       }
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_FW_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int  i, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
+               return;
+       n = 10;
+       printk(KERN_INFO " ");
+       for (i = 0; i < n; i++)
+               printk(" %08x", le32_to_cpu(mfp[i]));
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int  i, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
+               return;
+       n = 24;
+       for (i=0; i<n; i++) {
+               if (i && ((i%8)==0))
+                       printk("\n");
+               printk("%08x ", le32_to_cpu(mfp[i]));
+       }
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int  i, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
+               return;
+       n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
+       printk(KERN_INFO " ");
+       for (i=0; i<n; i++)
+               printk(" %08x", le32_to_cpu(mfp[i]));
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_REQUEST_FRAME_HDR(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int  i, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
+               return;
+       n = 3;
+       printk(KERN_INFO " ");
+       for (i=0; i<n; i++)
+               printk(" %08x", le32_to_cpu(mfp[i]));
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_TM_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int  i, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_TM))
+               return;
+       n = 13;
+       printk(KERN_DEBUG "TM_REQUEST:\n");
+       for (i=0; i<n; i++) {
+               if (i && ((i%8)==0))
+                       printk("\n");
+               printk("%08x ", le32_to_cpu(mfp[i]));
+       }
+       printk("\n");
+}
+
+static inline void
+DBG_DUMP_TM_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
+{
+       int  i, n;
+
+       if (!(ioc->debug_level & MPT_DEBUG_TM))
+               return;
+       n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
+       printk(KERN_DEBUG "TM_REPLY MessageLength=%d:\n", n);
+       for (i=0; i<n; i++) {
+               if (i && ((i%8)==0))
+                       printk("\n");
+               printk(" %08x", le32_to_cpu(mfp[i]));
+       }
+       printk("\n");
+}
+
+#define dmfprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
+
+# else /* ifdef MPT_DEBUG_MF */
+
+#define DBG_DUMP_FW_DOWNLOAD(IOC, mfp, numfrags)
+#define DBG_DUMP_PUT_MSG_FRAME(IOC, mfp)
+#define DBG_DUMP_FW_REQUEST_FRAME(IOC, mfp)
+#define DBG_DUMP_REQUEST_FRAME(IOC, mfp)
+#define DBG_DUMP_REPLY_FRAME(IOC, mfp)
+#define DBG_DUMP_REQUEST_FRAME_HDR(IOC, mfp)
+#define DBG_DUMP_TM_REQUEST_FRAME(IOC, mfp)
+#define DBG_DUMP_TM_REPLY_FRAME(IOC, mfp)
+
+#define dmfprintk(IOC, CMD)                    \
+       MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
+
+#endif /* defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING) */
+
+#endif /* ifndef MPTDEBUG_H_INCLUDED */
index f2ebaa9992febc19cee852c63542fe62b6f494f6..8422c25e4a3e7f71f8ecc26e95a16b416a5c15ac 100644 (file)
@@ -188,16 +188,18 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
                          int (*func)(struct scsi_cmnd *SCpnt),
                          const char *caller)
 {
+       MPT_SCSI_HOST           *hd;
        struct scsi_device      *sdev = SCpnt->device;
        struct Scsi_Host        *shost = sdev->host;
        struct fc_rport         *rport = starget_to_rport(scsi_target(sdev));
        unsigned long           flags;
        int                     ready;
 
+       hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
        spin_lock_irqsave(shost->host_lock, flags);
        while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) {
                spin_unlock_irqrestore(shost->host_lock, flags);
-               dfcprintk ((MYIOC_s_INFO_FMT
+               dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
                        "mptfc_block_error_handler.%d: %d:%d, port status is "
                        "DID_IMM_RETRY, deferring %s recovery.\n",
                        ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
@@ -209,7 +211,7 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
        spin_unlock_irqrestore(shost->host_lock, flags);
 
        if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) {
-               dfcprintk ((MYIOC_s_INFO_FMT
+               dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
                        "%s.%d: %d:%d, failing recovery, "
                        "port state %d, vdev %p.\n", caller,
                        ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
@@ -218,7 +220,7 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
                        SCpnt->device->hostdata));
                return FAILED;
        }
-       dfcprintk ((MYIOC_s_INFO_FMT
+       dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
                "%s.%d: %d:%d, executing recovery.\n", caller,
                ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
                ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
@@ -483,7 +485,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)
 
                        pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low;
                        nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low;
-                       dfcprintk ((MYIOC_s_INFO_FMT
+                       dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
                                "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, "
                                "rport tid %d, tmo %d\n",
                                        ioc->name,
@@ -559,6 +561,35 @@ mptfc_target_alloc(struct scsi_target *starget)
 
        return rc;
 }
+/*
+ *     mptfc_dump_lun_info
+ *     @ioc
+ *     @rport
+ *     @sdev
+ *
+ */
+static void
+mptfc_dump_lun_info(MPT_ADAPTER *ioc, struct fc_rport *rport, struct scsi_device *sdev,
+               VirtTarget *vtarget)
+{
+       u64 nn, pn;
+       struct mptfc_rport_info *ri;
+
+       ri = *((struct mptfc_rport_info **)rport->dd_data);
+       pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low;
+       nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low;
+       dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
+               "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, "
+               "CurrentTargetID %d, %x %llx %llx\n",
+               ioc->name,
+               sdev->host->host_no,
+               vtarget->num_luns,
+               sdev->id, ri->pg0.CurrentTargetID,
+               ri->pg0.PortIdentifier,
+               (unsigned long long)pn,
+               (unsigned long long)nn));
+}
+
 
 /*
  *     OS entry point to allow host driver to alloc memory
@@ -606,25 +637,7 @@ mptfc_slave_alloc(struct scsi_device *sdev)
        vtarget->num_luns++;
 
 
-#ifdef DMPT_DEBUG_FC
-       {
-       u64 nn, pn;
-       struct mptfc_rport_info *ri;
-       ri = *((struct mptfc_rport_info **)rport->dd_data);
-       pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low;
-       nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low;
-       dfcprintk ((MYIOC_s_INFO_FMT
-               "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, "
-               "CurrentTargetID %d, %x %llx %llx\n",
-               hd->ioc->name,
-               sdev->host->host_no,
-               vtarget->num_luns,
-               sdev->id, ri->pg0.CurrentTargetID,
-               ri->pg0.PortIdentifier,
-               (unsigned long long)pn,
-               (unsigned long long)nn));
-       }
-#endif
+       mptfc_dump_lun_info(hd->ioc, rport, sdev, vtarget);
 
        return 0;
 }
@@ -653,27 +666,12 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        /* dd_data is null until finished adding target */
        ri = *((struct mptfc_rport_info **)rport->dd_data);
        if (unlikely(!ri)) {
-               dfcprintk ((MYIOC_s_INFO_FMT
-                       "mptfc_qcmd.%d: %d:%d, dd_data is null.\n",
-                       ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name,
-                       ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no,
-                       SCpnt->device->id,SCpnt->device->lun));
                SCpnt->result = DID_IMM_RETRY << 16;
                done(SCpnt);
                return 0;
        }
 
-       err = mptscsih_qcmd(SCpnt,done);
-#ifdef DMPT_DEBUG_FC
-       if (unlikely(err)) {
-               dfcprintk ((MYIOC_s_INFO_FMT
-                       "mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero, (%x).\n",
-                       ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name,
-                       ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no,
-                       SCpnt->device->id,SCpnt->device->lun,err));
-       }
-#endif
-       return err;
+       return mptscsih_qcmd(SCpnt,done);
 }
 
 /*
@@ -1041,7 +1039,7 @@ mptfc_setup_reset(struct work_struct *work)
 
                        pn = (u64)ri->pg0.WWPN.High << 32 |
                             (u64)ri->pg0.WWPN.Low;
-                       dfcprintk ((MYIOC_s_INFO_FMT
+                       dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
                                "mptfc_setup_reset.%d: %llx deleted\n",
                                ioc->name,
                                ioc->sh->host_no,
@@ -1088,7 +1086,7 @@ mptfc_rescan_devices(struct work_struct *work)
 
                        pn = (u64)ri->pg0.WWPN.High << 32 |
                             (u64)ri->pg0.WWPN.Low;
-                       dfcprintk ((MYIOC_s_INFO_FMT
+                       dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
                                "mptfc_rescan.%d: %llx deleted\n",
                                ioc->name,
                                ioc->sh->host_no,
@@ -1212,7 +1210,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        if (numSGE < sh->sg_tablesize) {
                /* Reset this value */
-               dprintk((MYIOC_s_INFO_FMT
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                  "Resetting sg_tablesize to %d from %d\n",
                  ioc->name, numSGE, sh->sg_tablesize));
                sh->sg_tablesize = numSGE;
@@ -1232,7 +1230,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto out_mptfc_probe;
        }
 
-       dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
+       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
                 ioc->name, hd->ScsiLookup));
 
        /* Clear the TM flags
@@ -1264,7 +1262,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        sh->transportt = mptfc_transport_template;
        error = scsi_add_host (sh, &ioc->pcidev->dev);
        if(error) {
-               dprintk((KERN_ERR MYNAM
+               dprintk(ioc, printk(KERN_ERR MYNAM
                  "scsi_add_host failed\n"));
                goto out_mptfc_probe;
        }
@@ -1323,7 +1321,7 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
        unsigned long flags;
        int rc=1;
 
-       devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
+       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
                        ioc->name, event));
 
        if (ioc->sh == NULL ||
@@ -1357,8 +1355,8 @@ mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                return rc;
 
 
-       dtmprintk((KERN_WARNING MYNAM
-               ": IOC %s_reset routed to FC host driver!\n",
+       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+               ": IOC %s_reset routed to FC host driver!\n",ioc->name,
                reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
                reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
 
@@ -1413,15 +1411,8 @@ mptfc_init(void)
        mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER);
        mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER);
 
-       if (mpt_event_register(mptfcDoneCtx, mptfc_event_process) == 0) {
-               devtverboseprintk((KERN_INFO MYNAM
-                 ": Registered for IOC event notifications\n"));
-       }
-
-       if (mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset) == 0) {
-               dprintk((KERN_INFO MYNAM
-                 ": Registered for IOC reset notifications\n"));
-       }
+       mpt_event_register(mptfcDoneCtx, mptfc_event_process);
+       mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset);
 
        error = pci_register_driver(&mptfc_driver);
        if (error)
@@ -1486,12 +1477,7 @@ mptfc_exit(void)
        fc_release_transport(mptfc_transport_template);
 
        mpt_reset_deregister(mptfcDoneCtx);
-       dprintk((KERN_INFO MYNAM
-         ": Deregistered for IOC reset notifications\n"));
-
        mpt_event_deregister(mptfcDoneCtx);
-       dprintk((KERN_INFO MYNAM
-         ": Deregistered for IOC event notifications\n"));
 
        mpt_deregister(mptfcInternalCtx);
        mpt_deregister(mptfcTaskCtx);
index 7e8a90cb484e303542f112c29e2221c292dbd76d..01fc397fdd979f7783bcd90d6c8b5069d1bd0c9e 100644 (file)
@@ -1524,8 +1524,7 @@ static int __init mpt_lan_init (void)
 
        dlprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n"));
        
-       if (mpt_device_driver_register(&mptlan_driver, MPTLAN_DRIVER))
-               dprintk((KERN_INFO MYNAM ": failed to register dd callbacks\n"));
+       mpt_device_driver_register(&mptlan_driver, MPTLAN_DRIVER);
        return 0;
 }
 
index d5066464051221589bb4dab1f0a6de65f3200a42..29add83da58863e8854af63d4fbe2ed3c78f14ec 100644 (file)
@@ -201,103 +201,91 @@ struct mptsas_enclosure {
        u8      sep_channel;            /* SEP channel logical channel id */
 };
 
-#ifdef MPT_DEBUG_SAS
-static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
-{
-       printk("---- IO UNIT PAGE 0 ------------\n");
-       printk("Handle=0x%X\n",
-               le16_to_cpu(phy_data->AttachedDeviceHandle));
-       printk("Controller Handle=0x%X\n",
-               le16_to_cpu(phy_data->ControllerDevHandle));
-       printk("Port=0x%X\n", phy_data->Port);
-       printk("Port Flags=0x%X\n", phy_data->PortFlags);
-       printk("PHY Flags=0x%X\n", phy_data->PhyFlags);
-       printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate);
-       printk("Controller PHY Device Info=0x%X\n",
-               le32_to_cpu(phy_data->ControllerPhyDeviceInfo));
-       printk("DiscoveryStatus=0x%X\n",
-               le32_to_cpu(phy_data->DiscoveryStatus));
-       printk("\n");
+static void mptsas_print_phy_data(MPT_ADAPTER *ioc,
+                                       MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
+{
+       dsasprintk(ioc, printk(KERN_DEBUG "---- IO UNIT PAGE 0 ------------\n"));
+       dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n",
+               le16_to_cpu(phy_data->AttachedDeviceHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Controller Handle=0x%X\n",
+               le16_to_cpu(phy_data->ControllerDevHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Port=0x%X\n", phy_data->Port));
+       dsasprintk(ioc, printk(KERN_DEBUG "Port Flags=0x%X\n", phy_data->PortFlags));
+       dsasprintk(ioc, printk(KERN_DEBUG "PHY Flags=0x%X\n", phy_data->PhyFlags));
+       dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate));
+       dsasprintk(ioc, printk(KERN_DEBUG "Controller PHY Device Info=0x%X\n",
+               le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
+       dsasprintk(ioc, printk(KERN_DEBUG "DiscoveryStatus=0x%X\n\n",
+               le32_to_cpu(phy_data->DiscoveryStatus)));
 }
 
-static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0)
+static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
 {
        __le64 sas_address;
 
        memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
 
-       printk("---- SAS PHY PAGE 0 ------------\n");
-       printk("Attached Device Handle=0x%X\n",
-                       le16_to_cpu(pg0->AttachedDevHandle));
-       printk("SAS Address=0x%llX\n",
-                       (unsigned long long)le64_to_cpu(sas_address));
-       printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier);
-       printk("Attached Device Info=0x%X\n",
-                       le32_to_cpu(pg0->AttachedDeviceInfo));
-       printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate);
-       printk("Change Count=0x%X\n", pg0->ChangeCount);
-       printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo));
-       printk("\n");
+       dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 0 ------------\n"));
+       dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n",
+                       le16_to_cpu(pg0->AttachedDevHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n",
+                       (unsigned long long)le64_to_cpu(sas_address)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier));
+       dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Info=0x%X\n",
+                       le32_to_cpu(pg0->AttachedDeviceInfo)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate));
+       dsasprintk(ioc, printk(KERN_DEBUG "Change Count=0x%X\n", pg0->ChangeCount));
+       dsasprintk(ioc, printk(KERN_DEBUG "PHY Info=0x%X\n\n", le32_to_cpu(pg0->PhyInfo)));
 }
 
-static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1)
+static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)
 {
-       printk("---- SAS PHY PAGE 1 ------------\n");
-       printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount);
-       printk("Running Disparity Error Count=0x%x\n",
-                       pg1->RunningDisparityErrorCount);
-       printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount);
-       printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount);
-       printk("\n");
+       dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 1 ------------\n"));
+       dsasprintk(ioc, printk(KERN_DEBUG "Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount));
+       dsasprintk(ioc, printk(KERN_DEBUG "Running Disparity Error Count=0x%x\n",
+                       pg1->RunningDisparityErrorCount));
+       dsasprintk(ioc, printk(KERN_DEBUG "Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount));
+       dsasprintk(ioc, printk(KERN_DEBUG "PHY Reset Problem Count=0x%x\n\n", pg1->PhyResetProblemCount));
 }
 
-static void mptsas_print_device_pg0(SasDevicePage0_t *pg0)
+static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
 {
        __le64 sas_address;
 
        memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
 
-       printk("---- SAS DEVICE PAGE 0 ---------\n");
-       printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle));
-       printk("Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle));
-       printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle));
-       printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot));
-       printk("SAS Address=0x%llX\n", (unsigned long long)
-           le64_to_cpu(sas_address));
-       printk("Target ID=0x%X\n", pg0->TargetID);
-       printk("Bus=0x%X\n", pg0->Bus);
+       dsasprintk(ioc, printk(KERN_DEBUG "---- SAS DEVICE PAGE 0 ---------\n"));
+       dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Slot=0x%X\n", le16_to_cpu(pg0->Slot)));
+       dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", (unsigned long long)
+           le64_to_cpu(sas_address)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Target ID=0x%X\n", pg0->TargetID));
+       dsasprintk(ioc, printk(KERN_DEBUG "Bus=0x%X\n", pg0->Bus));
        /* The PhyNum field specifies the PHY number of the parent
         * device this device is linked to
         */
-       printk("Parent Phy Num=0x%X\n", pg0->PhyNum);
-       printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus));
-       printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo));
-       printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags));
-       printk("Physical Port=0x%X\n", pg0->PhysicalPort);
-       printk("\n");
+       dsasprintk(ioc, printk(KERN_DEBUG "Parent Phy Num=0x%X\n", pg0->PhyNum));
+       dsasprintk(ioc, printk(KERN_DEBUG "Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Flags=0x%X\n", le16_to_cpu(pg0->Flags)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n\n", pg0->PhysicalPort));
 }
 
-static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1)
-{
-       printk("---- SAS EXPANDER PAGE 1 ------------\n");
-
-       printk("Physical Port=0x%X\n", pg1->PhysicalPort);
-       printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier);
-       printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate);
-       printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate);
-       printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate);
-       printk("Owner Device Handle=0x%X\n",
-                       le16_to_cpu(pg1->OwnerDevHandle));
-       printk("Attached Device Handle=0x%X\n",
-                       le16_to_cpu(pg1->AttachedDevHandle));
+static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)
+{
+       dsasprintk(ioc, printk(KERN_DEBUG "---- SAS EXPANDER PAGE 1 ------------\n"));
+       dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n", pg1->PhysicalPort));
+       dsasprintk(ioc, printk(KERN_DEBUG "PHY Identifier=0x%X\n", pg1->PhyIdentifier));
+       dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate));
+       dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate));
+       dsasprintk(ioc, printk(KERN_DEBUG "Hardware Link Rate=0x%X\n", pg1->HwLinkRate));
+       dsasprintk(ioc, printk(KERN_DEBUG "Owner Device Handle=0x%X\n",
+                       le16_to_cpu(pg1->OwnerDevHandle)));
+       dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n\n",
+                       le16_to_cpu(pg1->AttachedDevHandle)));
 }
-#else
-#define mptsas_print_phy_data(phy_data)                do { } while (0)
-#define mptsas_print_phy_pg0(pg0)              do { } while (0)
-#define mptsas_print_phy_pg1(pg1)              do { } while (0)
-#define mptsas_print_device_pg0(pg0)           do { } while (0)
-#define mptsas_print_expander_pg1(pg1)         do { } while (0)
-#endif
 
 static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
 {
@@ -354,7 +342,7 @@ mptsas_is_end_device(struct mptsas_devinfo * attached)
 
 /* no mutex */
 static void
-mptsas_port_delete(struct mptsas_portinfo_details * port_details)
+mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_details)
 {
        struct mptsas_portinfo *port_info;
        struct mptsas_phyinfo *phy_info;
@@ -366,7 +354,7 @@ mptsas_port_delete(struct mptsas_portinfo_details * port_details)
        port_info = port_details->port_info;
        phy_info = port_info->phy_info;
 
-       dsaswideprintk((KERN_DEBUG "%s: [%p]: num_phys=%02d "
+       dsaswideprintk(ioc, printk(KERN_DEBUG "%s: [%p]: num_phys=%02d "
            "bitmask=0x%016llX\n", __FUNCTION__, port_details,
            port_details->num_phys, (unsigned long long)
            port_details->phy_bitmask));
@@ -390,20 +378,19 @@ mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
 }
 
 static inline void
-mptsas_set_rphy(struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
+mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
 {
        if (phy_info->port_details) {
                phy_info->port_details->rphy = rphy;
-               dsaswideprintk((KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy));
+               dsaswideprintk(ioc, printk(KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy));
        }
 
-#ifdef MPT_DEBUG_SAS_WIDE
        if (rphy) {
-               dev_printk(KERN_DEBUG, &rphy->dev, "add:");
-               printk("rphy=%p release=%p\n",
-                       rphy, rphy->dev.release);
+               dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
+                   &rphy->dev, "add:"));
+               dsaswideprintk(ioc, printk(KERN_DEBUG "rphy=%p release=%p\n",
+                       rphy, rphy->dev.release));
        }
-#endif
 }
 
 static inline struct sas_port *
@@ -416,18 +403,17 @@ mptsas_get_port(struct mptsas_phyinfo *phy_info)
 }
 
 static inline void
-mptsas_set_port(struct mptsas_phyinfo *phy_info, struct sas_port *port)
+mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_port *port)
 {
        if (phy_info->port_details)
                phy_info->port_details->port = port;
 
-#ifdef MPT_DEBUG_SAS_WIDE
        if (port) {
-               dev_printk(KERN_DEBUG, &port->dev, "add: ");
-               printk("port=%p release=%p\n",
-                       port, port->dev.release);
+               dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
+                   &port->dev, "add:"));
+               dsaswideprintk(ioc, printk(KERN_DEBUG "port=%p release=%p\n",
+                       port, port->dev.release));
        }
-#endif
 }
 
 static inline struct scsi_target *
@@ -477,7 +463,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
                 * Removing a phy from a port, letting the last
                 * phy be removed by firmware events.
                 */
-               dsaswideprintk((KERN_DEBUG
+               dsaswideprintk(ioc, printk(KERN_DEBUG
                        "%s: [%p]: deleting phy = %d\n",
                        __FUNCTION__, port_details, i));
                port_details->num_phys--;
@@ -493,7 +479,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
        phy_info = port_info->phy_info;
        for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
                sas_address = phy_info->attached.sas_address;
-               dsaswideprintk((KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n",
+               dsaswideprintk(ioc, printk(KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n",
                    i, (unsigned long long)sas_address));
                if (!sas_address)
                        continue;
@@ -512,7 +498,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
                                port_details->phy_bitmask |=
                                    (1 << phy_info->phy_id);
                        phy_info->sas_port_add_phy=1;
-                       dsaswideprintk((KERN_DEBUG "\t\tForming port\n\t\t"
+                       dsaswideprintk(ioc, printk(KERN_DEBUG "\t\tForming port\n\t\t"
                            "phy_id=%d sas_address=0x%018llX\n",
                            i, (unsigned long long)sas_address));
                        phy_info->port_details = port_details;
@@ -529,7 +515,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
                                continue;
                        if (phy_info_cmp->port_details == port_details )
                                continue;
-                       dsaswideprintk((KERN_DEBUG
+                       dsaswideprintk(ioc, printk(KERN_DEBUG
                            "\t\tphy_id=%d sas_address=0x%018llX\n",
                            j, (unsigned long long)
                            phy_info_cmp->attached.sas_address));
@@ -559,21 +545,19 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
 
  out:
 
-#ifdef MPT_DEBUG_SAS_WIDE
        for (i = 0; i < port_info->num_phys; i++) {
                port_details = port_info->phy_info[i].port_details;
                if (!port_details)
                        continue;
-               dsaswideprintk((KERN_DEBUG
+               dsaswideprintk(ioc, printk(KERN_DEBUG
                    "%s: [%p]: phy_id=%02d num_phys=%02d "
                    "bitmask=0x%016llX\n", __FUNCTION__,
                    port_details, i, port_details->num_phys,
                    (unsigned long long)port_details->phy_bitmask));
-               dsaswideprintk((KERN_DEBUG"\t\tport = %p rphy=%p\n",
+               dsaswideprintk(ioc, printk(KERN_DEBUG"\t\tport = %p rphy=%p\n",
                        port_details->port, port_details->rphy));
        }
-       dsaswideprintk((KERN_DEBUG"\n"));
-#endif
+       dsaswideprintk(ioc, printk(KERN_DEBUG"\n"));
        mutex_unlock(&ioc->sas_topology_mutex);
 }
 
@@ -622,7 +606,7 @@ mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
        SCSITaskMgmt_t  *pScsiTm;
 
        if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
-               dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
                    ioc->name,__FUNCTION__, __LINE__));
                return 0;
        }
@@ -637,12 +621,12 @@ mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
        pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
        pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
 
-       DBG_DUMP_TM_REQUEST_FRAME(mf);
+       DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
 
        if (mpt_send_handshake_request(ioc->TaskCtx, ioc,
            sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) {
                mpt_free_msg_frame(ioc, mf);
-               dfailprintk((MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
                    ioc->name,__FUNCTION__, __LINE__));
                return 0;
        }
@@ -681,7 +665,7 @@ mptsas_target_reset_queue(MPT_ADAPTER *ioc,
        target_reset_list = kzalloc(sizeof(*target_reset_list),
            GFP_ATOMIC);
        if (!target_reset_list) {
-               dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
                    ioc->name,__FUNCTION__, __LINE__));
                return;
        }
@@ -748,7 +732,7 @@ mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
 
        ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
        if (!ev) {
-               dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
                    ioc->name,__FUNCTION__, __LINE__));
                return;
        }
@@ -1168,7 +1152,7 @@ static int mptsas_get_linkerrors(struct sas_phy *phy)
        if (error)
                goto out_free_consistent;
 
-       mptsas_print_phy_pg1(buffer);
+       mptsas_print_phy_pg1(ioc, buffer);
 
        phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
        phy->running_disparity_error_count =
@@ -1397,7 +1381,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
            le16_to_cpu(buffer->NvdataVersionDefault);
 
        for (i = 0; i < port_info->num_phys; i++) {
-               mptsas_print_phy_data(&buffer->PhyData[i]);
+               mptsas_print_phy_data(ioc, &buffer->PhyData[i]);
                port_info->phy_info[i].phy_id = i;
                port_info->phy_info[i].port_id =
                    buffer->PhyData[i].Port;
@@ -1522,7 +1506,7 @@ mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
        if (error)
                goto out_free_consistent;
 
-       mptsas_print_phy_pg0(buffer);
+       mptsas_print_phy_pg0(ioc, buffer);
 
        phy_info->hw_link_rate = buffer->HwLinkRate;
        phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
@@ -1589,7 +1573,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
        if (error)
                goto out_free_consistent;
 
-       mptsas_print_device_pg0(buffer);
+       mptsas_print_device_pg0(ioc, buffer);
 
        device_info->handle = le16_to_cpu(buffer->DevHandle);
        device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
@@ -1737,7 +1721,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
                goto out_free_consistent;
 
 
-       mptsas_print_expander_pg1(buffer);
+       mptsas_print_expander_pg1(ioc, buffer);
 
        /* save config data */
        phy_info->phy_id = buffer->PhyIdentifier;
@@ -1946,17 +1930,17 @@ static int mptsas_probe_one_phy(struct device *dev,
                        }
                        error = sas_port_add(port);
                        if (error) {
-                               dfailprintk((MYIOC_s_ERR_FMT
+                               dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                        "%s: exit at line=%d\n", ioc->name,
                                        __FUNCTION__, __LINE__));
                                goto out;
                        }
-                       mptsas_set_port(phy_info, port);
-                       dsaswideprintk((KERN_DEBUG
+                       mptsas_set_port(ioc, phy_info, port);
+                       dsaswideprintk(ioc, printk(KERN_DEBUG
                            "sas_port_alloc: port=%p dev=%p port_id=%d\n",
                            port, dev, port->port_identifier));
                }
-               dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
+               dsaswideprintk(ioc, printk(KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
                    phy_info->phy_id));
                sas_port_add_phy(port, phy_info->phy);
                phy_info->sas_port_add_phy = 0;
@@ -2017,7 +2001,7 @@ static int mptsas_probe_one_phy(struct device *dev,
                        break;
                }
                if (!rphy) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        goto out;
@@ -2026,13 +2010,13 @@ static int mptsas_probe_one_phy(struct device *dev,
                rphy->identify = identify;
                error = sas_rphy_add(rphy);
                if (error) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        sas_rphy_free(rphy);
                        goto out;
                }
-               mptsas_set_rphy(phy_info, rphy);
+               mptsas_set_rphy(ioc, phy_info, rphy);
        }
 
  out:
@@ -2258,18 +2242,17 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
                                if (phy_info->attached.sas_address !=
                                        expander_sas_address)
                                        continue;
-#ifdef MPT_DEBUG_SAS_WIDE
-                               dev_printk(KERN_DEBUG, &port->dev,
-                                   "delete port (%d)\n", port->port_identifier);
-#endif
+                               dsaswideprintk(ioc,
+                                       dev_printk(KERN_DEBUG, &port->dev,
+                                       "delete port (%d)\n", port->port_identifier));
                                sas_port_delete(port);
-                               mptsas_port_delete(phy_info->port_details);
+                               mptsas_port_delete(ioc, phy_info->port_details);
                        }
  next_port:
 
                        phy_info = port_info->phy_info;
                        for (i = 0; i < port_info->num_phys; i++, phy_info++)
-                               mptsas_port_delete(phy_info->port_details);
+                               mptsas_port_delete(ioc, phy_info->port_details);
 
                        list_del(&port_info->list);
                        kfree(port_info->phy_info);
@@ -2555,7 +2538,7 @@ mptsas_hotplug_work(struct work_struct *work)
                                    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
                                     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
                                    (ev->channel << 8) + ev->id)) {
-                                       dfailprintk((MYIOC_s_ERR_FMT
+                                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                        "%s: exit at line=%d\n", ioc->name,
                                                __FUNCTION__, __LINE__));
                                        break;
@@ -2575,20 +2558,20 @@ mptsas_hotplug_work(struct work_struct *work)
                 * Sanity checks, for non-existing phys and remote rphys.
                 */
                if (!phy_info){
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break;
                }
                if (!phy_info->port_details) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break;
                }
                rphy = mptsas_get_rphy(phy_info);
                if (!rphy) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break;
@@ -2596,7 +2579,7 @@ mptsas_hotplug_work(struct work_struct *work)
 
                port = mptsas_get_port(phy_info);
                if (!port) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break;
@@ -2607,7 +2590,7 @@ mptsas_hotplug_work(struct work_struct *work)
                        vtarget = starget->hostdata;
 
                        if (!vtarget) {
-                               dfailprintk((MYIOC_s_ERR_FMT
+                               dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                        "%s: exit at line=%d\n", ioc->name,
                                        __FUNCTION__, __LINE__));
                                break;
@@ -2645,12 +2628,10 @@ mptsas_hotplug_work(struct work_struct *work)
                printk(MYIOC_s_INFO_FMT
                       "removing %s device, channel %d, id %d, phy %d\n",
                       ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
-#ifdef MPT_DEBUG_SAS_WIDE
                dev_printk(KERN_DEBUG, &port->dev,
                    "delete port (%d)\n", port->port_identifier);
-#endif
                sas_port_delete(port);
-               mptsas_port_delete(phy_info->port_details);
+               mptsas_port_delete(ioc, phy_info->port_details);
                break;
        case MPTSAS_ADD_DEVICE:
 
@@ -2664,7 +2645,7 @@ mptsas_hotplug_work(struct work_struct *work)
                    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
                     MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
                        (ev->channel << 8) + ev->id)) {
-                               dfailprintk((MYIOC_s_ERR_FMT
+                               dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                        "%s: exit at line=%d\n", ioc->name,
                                        __FUNCTION__, __LINE__));
                        break;
@@ -2676,7 +2657,7 @@ mptsas_hotplug_work(struct work_struct *work)
                                sas_device.sas_address);
 
                if (!phy_info || !phy_info->port_details) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break;
@@ -2688,7 +2669,7 @@ mptsas_hotplug_work(struct work_struct *work)
                        vtarget = starget->hostdata;
 
                        if (!vtarget) {
-                               dfailprintk((MYIOC_s_ERR_FMT
+                               dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                        "%s: exit at line=%d\n", ioc->name,
                                        __FUNCTION__, __LINE__));
                                break;
@@ -2711,7 +2692,7 @@ mptsas_hotplug_work(struct work_struct *work)
                }
 
                if (mptsas_get_rphy(phy_info)) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        if (ev->channel) printk("%d\n", __LINE__);
@@ -2720,7 +2701,7 @@ mptsas_hotplug_work(struct work_struct *work)
 
                port = mptsas_get_port(phy_info);
                if (!port) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break;
@@ -2745,7 +2726,7 @@ mptsas_hotplug_work(struct work_struct *work)
                mptsas_parse_device_info(&identify, &phy_info->attached);
                rphy = sas_end_device_alloc(port);
                if (!rphy) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        break; /* non-fatal: an rphy can be added later */
@@ -2753,13 +2734,13 @@ mptsas_hotplug_work(struct work_struct *work)
 
                rphy->identify = identify;
                if (sas_rphy_add(rphy)) {
-                       dfailprintk((MYIOC_s_ERR_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
                        sas_rphy_free(rphy);
                        break;
                }
-               mptsas_set_rphy(phy_info, rphy);
+               mptsas_set_rphy(ioc, phy_info, rphy);
                break;
        case MPTSAS_ADD_RAID:
                sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
@@ -3175,7 +3156,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        if (numSGE < sh->sg_tablesize) {
                /* Reset this value */
-               dprintk((MYIOC_s_INFO_FMT
+               dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                  "Resetting sg_tablesize to %d from %d\n",
                  ioc->name, numSGE, sh->sg_tablesize));
                sh->sg_tablesize = numSGE;
@@ -3193,7 +3174,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto out_mptsas_probe;
        }
 
-       dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
+       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
                 ioc->name, hd->ScsiLookup));
 
        /* Clear the TM flags
@@ -3233,7 +3214,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        error = scsi_add_host(sh, &ioc->pcidev->dev);
        if (error) {
-               dprintk((KERN_ERR MYNAM
+               dprintk(ioc, printk(KERN_ERR MYNAM
                  "scsi_add_host failed\n"));
                goto out_mptsas_probe;
        }
@@ -3261,7 +3242,7 @@ static void __devexit mptsas_remove(struct pci_dev *pdev)
        list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
                list_del(&p->list);
                for (i = 0 ; i < p->num_phys ; i++)
-                       mptsas_port_delete(p->phy_info[i].port_details);
+                       mptsas_port_delete(ioc, p->phy_info[i].port_details);
                kfree(p->phy_info);
                kfree(p);
        }
@@ -3316,15 +3297,8 @@ mptsas_init(void)
                mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
        mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
 
-       if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) {
-               devtverboseprintk((KERN_INFO MYNAM
-                 ": Registered for IOC event notifications\n"));
-       }
-
-       if (mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset) == 0) {
-               dprintk((KERN_INFO MYNAM
-                 ": Registered for IOC reset notifications\n"));
-       }
+       mpt_event_register(mptsasDoneCtx, mptsas_event_process);
+       mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset);
 
        error = pci_register_driver(&mptsas_driver);
        if (error)
index fd3aa2619f427317c5d7afb1e73d472887bd2c7a..5431529741ad28380442e3b5618d799b988bdecd 100644 (file)
@@ -191,7 +191,7 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex)
        int rc;
        int chain_idx;
 
-       dsgprintk((MYIOC_s_INFO_FMT "getFreeChainBuffer called\n",
+       dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer called\n",
                        ioc->name));
        spin_lock_irqsave(&ioc->FreeQlock, flags);
        if (!list_empty(&ioc->FreeChainQ)) {
@@ -203,12 +203,12 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex)
                offset = (u8 *)chainBuf - (u8 *)ioc->ChainBuffer;
                chain_idx = offset / ioc->req_sz;
                rc = SUCCESS;
-               dsgprintk((MYIOC_s_ERR_FMT "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n",
+               dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n",
                        ioc->name, chainBuf, ioc->ChainBuffer, offset, chain_idx));
        } else {
                rc = FAILED;
                chain_idx = MPT_HOST_NO_CHAIN;
-               dfailprintk((MYIOC_s_INFO_FMT "getFreeChainBuffer failed\n",
+               dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer failed\n",
                        ioc->name));
        }
        spin_unlock_irqrestore(&ioc->FreeQlock, flags);
@@ -337,7 +337,7 @@ nextSGEset:
                         */
                        pReq->ChainOffset = 0;
                        RequestNB = (((sgeOffset - 1) >> ioc->NBShiftFactor)  + 1) & 0x03;
-                       dsgprintk((MYIOC_s_INFO_FMT
+                       dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                            "Single Buffer RequestNB=%x, sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset));
                        ioc->RequestNB[req_idx] = RequestNB;
                }
@@ -353,7 +353,7 @@ nextSGEset:
                 * Loop until done.
                 */
 
-               dsgprintk((MYIOC_s_INFO_FMT "SG: Chain Required! sg done %d\n",
+               dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SG: Chain Required! sg done %d\n",
                                ioc->name, sg_done));
 
                /* Set LAST_ELEMENT flag for last non-chain element
@@ -386,7 +386,7 @@ nextSGEset:
                         */
                        pReq->ChainOffset = (u8) (sgeOffset >> 2);
                        RequestNB = (((sgeOffset - 1) >> ioc->NBShiftFactor)  + 1) & 0x03;
-                       dsgprintk((MYIOC_s_ERR_FMT "Chain Buffer Needed, RequestNB=%x sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset));
+                       dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Chain Buffer Needed, RequestNB=%x sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset));
                        ioc->RequestNB[req_idx] = RequestNB;
                }
 
@@ -397,7 +397,7 @@ nextSGEset:
                 * in current buffer. Get a chain buffer.
                 */
                if ((mptscsih_getFreeChainBuffer(ioc, &newIndex)) == FAILED) {
-                       dfailprintk((MYIOC_s_INFO_FMT
+                       dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                            "getFreeChainBuffer FAILED SCSI cmd=%02x (%p)\n",
                            ioc->name, pReq->CDB[0], SCpnt));
                        return FAILED;
@@ -419,7 +419,7 @@ nextSGEset:
                 *   out the Address and Flags fields.
                 */
                chainSge = (char *) psge;
-               dsgprintk((KERN_INFO "  Current buff @ %p (index 0x%x)",
+               dsgprintk(ioc, printk(KERN_DEBUG "  Current buff @ %p (index 0x%x)",
                                psge, req_idx));
 
                /* Start the SGE for the next buffer
@@ -428,7 +428,7 @@ nextSGEset:
                sgeOffset = 0;
                sg_done = 0;
 
-               dsgprintk((KERN_INFO "  Chain buff @ %p (index 0x%x)\n",
+               dsgprintk(ioc, printk(KERN_DEBUG "  Chain buff @ %p (index 0x%x)\n",
                                psge, chain_idx));
 
                /* Start the SGE for the next buffer
@@ -456,7 +456,7 @@ mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget,
                return;
 
        if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) {
-               dfailprintk((MYIOC_s_WARN_FMT "%s: no msg frames!!\n",
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s: no msg frames!!\n",
                    ioc->name,__FUNCTION__));
                return;
        }
@@ -467,93 +467,158 @@ mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget,
        SEPMsg->TargetID = vtarget->id;
        SEPMsg->Action = MPI_SEP_REQ_ACTION_WRITE_STATUS;
        SEPMsg->SlotStatus = SlotStatus;
-       devtverboseprintk((MYIOC_s_WARN_FMT
+       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
            "Sending SEP cmd=%x channel=%d id=%d\n",
            ioc->name, SlotStatus, SEPMsg->Bus, SEPMsg->TargetID));
        mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
 }
 
-#ifdef MPT_DEBUG_REPLY
+#ifdef CONFIG_FUSION_LOGGING
 /**
- *     mptscsih_iocstatus_info_scsiio - IOCSTATUS information for SCSIIO
+ *     mptscsih_info_scsiio - debug print info on reply frame
  *     @ioc: Pointer to MPT_ADAPTER structure
- *     @ioc_status: U32 IOCStatus word from IOC
- *     @scsi_status: U8 sam status from target
- *     @scsi_state: U8 scsi state
  *     @sc: original scsi cmnd pointer
- *     @mf: Pointer to MPT request frame
+ *     @pScsiReply: Pointer to MPT reply frame
+ *
+ *     MPT_DEBUG_REPLY needs to be enabled to obtain this info
  *
  *     Refer to lsi/mpi.h.
  **/
 static void
-mptscsih_iocstatus_info_scsiio(MPT_ADAPTER *ioc, u32 ioc_status,
-    u8 scsi_status, u8 scsi_state, struct scsi_cmnd *sc)
+mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pScsiReply)
 {
-       char extend_desc[EVENT_DESCR_STR_SZ];
-       char *desc = NULL;
+       char    *desc = NULL;
+       char    *desc1 = NULL;
+       u16     ioc_status;
+       u8      skey, asc, ascq;
+
+       ioc_status = le16_to_cpu(pScsiReply->IOCStatus) & MPI_IOCSTATUS_MASK;
 
        switch (ioc_status) {
 
-       case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */
-               desc = "SCSI Invalid Bus";
+       case MPI_IOCSTATUS_SUCCESS:
+               desc = "success";
                break;
-
-       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */
-               desc = "SCSI Invalid TargetID";
+       case MPI_IOCSTATUS_SCSI_INVALID_BUS:
+               desc = "invalid bus";
                break;
-
-       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */
-               /*
-                * Inquiry is issued for device scanning
-                */
-               if (sc->cmnd[0] != 0x12)
-                       desc = "SCSI Device Not There";
+       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID:
+               desc = "invalid target_id";
                break;
-
-       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */
-               desc = "SCSI Data Overrun";
+       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
+               desc = "device not there";
                break;
-
-       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
-               desc = "SCSI I/O Data Error";
+       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN:
+               desc = "data overrun";
                break;
-
-       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */
-               desc = "SCSI Protocol Error";
+       case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN:
+               desc = "data underrun";
                break;
-
-       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
-               desc = "SCSI Task Terminated";
+       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR:
+               desc = "I/O data error";
                break;
-
-       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
-               desc = "SCSI Residual Mismatch";
+       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR:
+               desc = "protocol error";
                break;
-
-       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */
-               desc = "SCSI Task Management Failed";
+       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED:
+               desc = "task terminated";
                break;
-
-       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
-               desc = "SCSI IOC Terminated";
+       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
+               desc = "residual mismatch";
+               break;
+       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
+               desc = "task management failed";
+               break;
+       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED:
+               desc = "IOC terminated";
+               break;
+       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED:
+               desc = "ext terminated";
                break;
+       default:
+               desc = "";
+               break;
+       }
+
+       switch (pScsiReply->SCSIStatus)
+       {
 
-       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
-               desc = "SCSI Ext Terminated";
+       case MPI_SCSI_STATUS_SUCCESS:
+               desc1 = "success";
+               break;
+       case MPI_SCSI_STATUS_CHECK_CONDITION:
+               desc1 = "check condition";
+               break;
+       case MPI_SCSI_STATUS_CONDITION_MET:
+               desc1 = "condition met";
+               break;
+       case MPI_SCSI_STATUS_BUSY:
+               desc1 = "busy";
+               break;
+       case MPI_SCSI_STATUS_INTERMEDIATE:
+               desc1 = "intermediate";
+               break;
+       case MPI_SCSI_STATUS_INTERMEDIATE_CONDMET:
+               desc1 = "intermediate condmet";
+               break;
+       case MPI_SCSI_STATUS_RESERVATION_CONFLICT:
+               desc1 = "reservation conflict";
+               break;
+       case MPI_SCSI_STATUS_COMMAND_TERMINATED:
+               desc1 = "command terminated";
+               break;
+       case MPI_SCSI_STATUS_TASK_SET_FULL:
+               desc1 = "task set full";
+               break;
+       case MPI_SCSI_STATUS_ACA_ACTIVE:
+               desc1 = "aca active";
+               break;
+       case MPI_SCSI_STATUS_FCPEXT_DEVICE_LOGGED_OUT:
+               desc1 = "fcpext device logged out";
+               break;
+       case MPI_SCSI_STATUS_FCPEXT_NO_LINK:
+               desc1 = "fcpext no link";
+               break;
+       case MPI_SCSI_STATUS_FCPEXT_UNASSIGNED:
+               desc1 = "fcpext unassigned";
+               break;
+       default:
+               desc1 = "";
                break;
        }
 
-       if (!desc)
-               return;
+       scsi_print_command(sc);
+       printk(KERN_DEBUG "\tfw_channel = %d, fw_id = %d\n",
+           pScsiReply->Bus, pScsiReply->TargetID);
+       printk(KERN_DEBUG "\trequest_len = %d, underflow = %d, resid = %d\n",
+           scsi_bufflen(sc), sc->underflow, scsi_get_resid(sc));
+       printk(KERN_DEBUG "\ttag = %d, transfer_count = %d, sc->result = %08X\n",
+           le16_to_cpu(pScsiReply->TaskTag),
+           le32_to_cpu(pScsiReply->TransferCount), sc->result);
 
-       snprintf(extend_desc, EVENT_DESCR_STR_SZ,
-           "[%d:%d:%d:%d] cmd=%02Xh, sam_status=%02Xh state=%02Xh",
-               sc->device->host->host_no,
-               sc->device->channel, sc->device->id, sc->device->lun,
-               sc->cmnd[0], scsi_status, scsi_state);
+       printk(KERN_DEBUG "\tiocstatus = %s (0x%04x), "
+           "scsi_status = %s (0x%02x), scsi_state = (0x%02x)\n",
+           desc, ioc_status,
+           desc1, pScsiReply->SCSIStatus,
+           pScsiReply->SCSIState);
 
-       printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s: %s\n",
-           ioc->name, ioc_status, desc, extend_desc);
+       if (pScsiReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID) {
+               skey = sc->sense_buffer[2] & 0x0F;
+               asc = sc->sense_buffer[12];
+               ascq = sc->sense_buffer[13];
+
+               printk(KERN_DEBUG "\t[sense_key,asc,ascq]: "
+                   "[0x%02x,0x%02x,0x%02x]\n",
+                   skey, asc, ascq);
+       }
+
+       /*
+        *  Look for + dump FCP ResponseInfo[]!
+        */
+       if (pScsiReply->SCSIState & MPI_SCSI_STATE_RESPONSE_INFO_VALID &&
+           pScsiReply->ResponseInfo)
+               printk(KERN_DEBUG "response_info = %08xh\n",
+                   le32_to_cpu(pScsiReply->ResponseInfo));
 }
 #endif
 
@@ -627,11 +692,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
        pScsiReply = (SCSIIOReply_t *) mr;
 
        if((ioc->facts.MsgVersion >= MPI_VERSION_01_05) && pScsiReply){
-               dmfprintk((MYIOC_s_INFO_FMT
+               dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                        "ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d,task-tag=%d)\n",
                        ioc->name, mf, mr, sc, req_idx, pScsiReply->TaskTag));
        }else{
-               dmfprintk((MYIOC_s_INFO_FMT
+               dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                        "ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d)\n",
                        ioc->name, mf, mr, sc, req_idx));
        }
@@ -759,7 +824,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                                sc->result=DID_SOFT_ERROR << 16;
                        else /* Sufficient data transfer occurred */
                                sc->result = (DID_OK << 16) | scsi_status;
-                       dreplyprintk((KERN_NOTICE
+                       dreplyprintk(ioc, printk(KERN_DEBUG
                            "RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n",
                            sc->result, sc->device->channel, sc->device->id));
                        break;
@@ -792,9 +857,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                                }
                        }
 
-                       dreplyprintk((KERN_NOTICE "  sc->underflow={report ERR if < %02xh bytes xfer'd}\n",
+
+                       dreplyprintk(ioc, printk(KERN_DEBUG "  sc->underflow={report ERR if < %02xh bytes xfer'd}\n",
                                        sc->underflow));
-                       dreplyprintk((KERN_NOTICE "  ActBytesXferd=%02xh\n", xfer_cnt));
+                       dreplyprintk(ioc, printk(KERN_DEBUG "  ActBytesXferd=%02xh\n", xfer_cnt));
+
                        /* Report Queue Full
                         */
                        if (scsi_status == MPI_SCSI_STATUS_TASK_SET_FULL)
@@ -871,27 +938,9 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 
                }       /* switch(status) */
 
-#ifdef MPT_DEBUG_REPLY
-               if (sc->result) {
-
-                       mptscsih_iocstatus_info_scsiio(ioc, status,
-                           scsi_status, scsi_state, sc);
-
-                       dreplyprintk(("%s: [%d:%d:%d:%d] cmd=0x%02x "
-                           "result=0x%08x\n\tiocstatus=0x%04X "
-                           "scsi_state=0x%02X scsi_status=0x%02X "
-                           "loginfo=0x%08X\n", __FUNCTION__,
-                           sc->device->host->host_no, sc->device->channel, sc->device->id,
-                           sc->device->lun, sc->cmnd[0], sc->result, status,
-                           scsi_state, scsi_status, log_info));
-
-                       dreplyprintk(("%s: [%d:%d:%d:%d] resid=%d "
-                                     "bufflen=%d xfer_cnt=%d\n", __FUNCTION__,
-                                     sc->device->host->host_no,
-                                     sc->device->channel, sc->device->id,
-                                     sc->device->lun, scsi_get_resid(sc),
-                                     scsi_bufflen(sc), xfer_cnt));
-               }
+#ifdef CONFIG_FUSION_LOGGING
+               if (sc->result && (ioc->debug_level & MPT_DEBUG_REPLY))
+                       mptscsih_info_scsiio(ioc, sc, pScsiReply);
 #endif
 
        } /* end of address reply case */
@@ -925,7 +974,7 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
        int              ii;
        int              max = ioc->req_depth;
 
-       dprintk((KERN_INFO MYNAM ": flush_ScsiLookup called\n"));
+       dprintk(ioc, printk(KERN_DEBUG MYNAM ": flush_ScsiLookup called\n"));
        for (ii= 0; ii < max; ii++) {
                if ((SCpnt = hd->ScsiLookup[ii]) != NULL) {
 
@@ -937,7 +986,7 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
                        hd->ScsiLookup[ii] = NULL;
 
                        mf = MPT_INDEX_2_MFPTR(ioc, ii);
-                       dmfprintk(( "flush: ScsiDone (mf=%p,sc=%p)\n",
+                       dmfprintk(ioc, printk(KERN_DEBUG MYNAM ": flush: ScsiDone (mf=%p,sc=%p)\n",
                                        mf, SCpnt));
 
                        /* Free Chain buffers */
@@ -987,7 +1036,7 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
        struct scsi_cmnd *sc;
        struct scsi_lun  lun;
 
-       dsprintk((KERN_INFO MYNAM ": search_running channel %d id %d lun %d max %d\n",
+       dsprintk(hd->ioc, printk(KERN_DEBUG MYNAM ": search_running channel %d id %d lun %d max %d\n",
            vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun, max));
 
        for (ii=0; ii < max; ii++) {
@@ -1020,9 +1069,9 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
                        scsi_dma_unmap(sc);
                        sc->host_scribble = NULL;
                        sc->result = DID_NO_CONNECT << 16;
-                       dsprintk(( "search_running: found (sc=%p, mf = %p) "
-                           "channel %d id %d, lun %d \n", sc, mf,
-                           vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun));
+                       sdev_printk(KERN_INFO, sc->device, "completing cmds: fw_channel %d,"
+                          "fw_id %d, sc=%p, mf = %p, idx=%x\n", vdevice->vtarget->channel,
+                          vdevice->vtarget->id, sc, mf, ii);
                        sc->scsi_done(sc);
                }
        }
@@ -1057,7 +1106,7 @@ mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSI
                return;
 
        if (time - hd->last_queue_full > 10 * HZ) {
-               dprintk((MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
+               dprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
                                hd->ioc->name, 0, sc->device->id, sc->device->lun));
                hd->last_queue_full = time;
        }
@@ -1098,7 +1147,7 @@ mptscsih_remove(struct pci_dev *pdev)
                hd->ScsiLookup = NULL;
        }
 
-       dprintk((MYIOC_s_INFO_FMT
+       dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
            "Free'd ScsiLookup (%d) memory\n",
            hd->ioc->name, sz1));
 
@@ -1317,17 +1366,19 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        u32      cmd_len;
        int      my_idx;
        int      ii;
+       MPT_ADAPTER *ioc;
 
        hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
+       ioc = hd->ioc;
        lun = SCpnt->device->lun;
        SCpnt->scsi_done = done;
 
-       dmfprintk((MYIOC_s_INFO_FMT "qcmd: SCpnt=%p, done()=%p\n",
-                       (hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt, done));
+       dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p, done()=%p\n",
+               ioc->name, SCpnt, done));
 
        if (hd->resetPending) {
-               dtmprintk((MYIOC_s_WARN_FMT "qcmd: SCpnt=%p timeout + 60HZ\n",
-                       (hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt));
+               dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "qcmd: SCpnt=%p timeout + 60HZ\n",
+                       ioc->name, SCpnt));
                return SCSI_MLQUEUE_HOST_BUSY;
        }
 
@@ -1335,8 +1386,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
         *  Put together a MPT SCSI request...
         */
        if ((mf = mpt_get_msg_frame(hd->ioc->DoneCtx, hd->ioc)) == NULL) {
-               dprintk((MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n",
-                               hd->ioc->name));
+               dprintk(ioc, printk(MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n",
+                               ioc->name));
                return SCSI_MLQUEUE_HOST_BUSY;
        }
 
@@ -1422,9 +1473,9 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        hd->ScsiLookup[my_idx] = SCpnt;
 
        mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf);
-       dmfprintk((MYIOC_s_INFO_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",
-                       hd->ioc->name, SCpnt, mf, my_idx));
-       DBG_DUMP_REQUEST_FRAME(mf)
+       dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",
+                       ioc->name, SCpnt, mf, my_idx));
+       DBG_DUMP_REQUEST_FRAME(ioc, (u32 *)mf)
        return 0;
 
  fail:
@@ -1475,7 +1526,7 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx)
                list_add_tail(&chain->u.frame.linkage.list, &ioc->FreeChainQ);
                spin_unlock_irqrestore(&ioc->FreeQlock, flags);
 
-               dmfprintk((MYIOC_s_INFO_FMT "FreeChainBuffers (index %d)\n",
+               dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "FreeChainBuffers (index %d)\n",
                                ioc->name, chain_idx));
 
                /* handle next */
@@ -1519,7 +1570,7 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
        unsigned long    flags;
 
        ioc = hd->ioc;
-       dtmprintk((MYIOC_s_INFO_FMT "TMHandler Entered!\n", ioc->name));
+       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TMHandler Entered!\n", ioc->name));
 
        // SJR - CHECKME - Can we avoid this here?
        // (mpt_HardResetHandler has this check...)
@@ -1539,20 +1590,20 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
         */
        if (mptscsih_tm_pending_wait(hd) == FAILED) {
                if (type == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK) {
-                       dtmprintk((KERN_INFO MYNAM ": %s: TMHandler abort: "
+                       dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler abort: "
                           "Timed out waiting for last TM (%d) to complete! \n",
-                          hd->ioc->name, hd->tmPending));
+                          ioc->name, hd->tmPending));
                        return FAILED;
                } else if (type == MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET) {
-                       dtmprintk((KERN_INFO MYNAM ": %s: TMHandler target "
+                       dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler target "
                                "reset: Timed out waiting for last TM (%d) "
-                               "to complete! \n", hd->ioc->name,
+                               "to complete! \n", ioc->name,
                                hd->tmPending));
                        return FAILED;
                } else if (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) {
-                       dtmprintk((KERN_INFO MYNAM ": %s: TMHandler bus reset: "
+                       dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler bus reset: "
                           "Timed out waiting for last TM (%d) to complete! \n",
-                          hd->ioc->name, hd->tmPending));
+                         ioc->name, hd->tmPending));
                        return FAILED;
                }
        } else {
@@ -1591,12 +1642,13 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
            ctx2abort, timeout);
        if (rc)
                printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n",
-                      hd->ioc->name);
+                      ioc->name);
        else
-               dtmprintk((MYIOC_s_INFO_FMT "Issue of TaskMgmt Successful!\n",
-                          hd->ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Issue of TaskMgmt Successful!\n",
+                          ioc->name));
 
-       dtmprintk((MYIOC_s_INFO_FMT "TMHandler rc = %d!\n", hd->ioc->name, rc));
+       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
+                       "TMHandler rc = %d!\n", ioc->name, rc));
 
        return rc;
 }
@@ -1632,11 +1684,11 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i
        /* Return Fail to calling function if no message frames available.
         */
        if ((mf = mpt_get_msg_frame(hd->ioc->TaskCtx, hd->ioc)) == NULL) {
-               dfailprintk((MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n",
+               dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n",
                                hd->ioc->name));
                return FAILED;
        }
-       dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt request @ %p\n",
+       dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt request @ %p\n",
                        hd->ioc->name, mf));
 
        /* Format the Request
@@ -1660,27 +1712,27 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i
 
        pScsiTm->TaskMsgContext = ctx2abort;
 
-       dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt: ctx2abort (0x%08x) "
+       dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt: ctx2abort (0x%08x) "
                "type=%d\n", hd->ioc->name, ctx2abort, type));
 
-       DBG_DUMP_TM_REQUEST_FRAME((u32 *)pScsiTm);
+       DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)pScsiTm);
 
        if ((retval = mpt_send_handshake_request(hd->ioc->TaskCtx, hd->ioc,
                sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) {
-               dfailprintk((MYIOC_s_ERR_FMT "send_handshake FAILED!"
+               dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "send_handshake FAILED!"
                        " (hd %p, ioc %p, mf %p, rc=%d) \n", hd->ioc->name, hd,
                        hd->ioc, mf, retval));
                goto fail_out;
        }
 
        if(mptscsih_tm_wait_for_completion(hd, timeout) == FAILED) {
-               dfailprintk((MYIOC_s_ERR_FMT "task management request TIMED OUT!"
+               dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "task management request TIMED OUT!"
                        " (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
                        hd->ioc, mf));
-               dtmprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n",
+               dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n",
                         hd->ioc->name));
                retval = mpt_HardResetHandler(hd->ioc, CAN_SLEEP);
-               dtmprintk((MYIOC_s_INFO_FMT "rc=%d \n",
+               dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "rc=%d \n",
                         hd->ioc->name, retval));
                goto fail_out;
        }
@@ -1748,8 +1800,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
        if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL) {
                SCpnt->result = DID_RESET << 16;
                SCpnt->scsi_done(SCpnt);
-               dfailprintk((KERN_INFO MYNAM ": mptscsih_abort: Can't locate "
-                   "host! (sc=%p)\n", SCpnt));
+               printk(KERN_DEBUG MYNAM ": mptscsih_abort: Can't locate "
+                   "host! (sc=%p)\n", SCpnt);
                return FAILED;
        }
 
@@ -1760,7 +1812,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
 
        vdevice = SCpnt->device->hostdata;
        if (!vdevice || !vdevice->vtarget) {
-               dtmprintk((MYIOC_s_DEBUG_FMT "task abort: device has been "
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: device has been "
                    "deleted (sc=%p)\n", ioc->name, SCpnt));
                SCpnt->result = DID_NO_CONNECT << 16;
                SCpnt->scsi_done(SCpnt);
@@ -1771,7 +1823,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
        /* Task aborts are not supported for hidden raid components.
         */
        if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
-               dtmprintk((MYIOC_s_DEBUG_FMT "task abort: hidden raid "
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: hidden raid "
                    "component (sc=%p)\n", ioc->name, SCpnt));
                SCpnt->result = DID_RESET << 16;
                retval = FAILED;
@@ -1785,7 +1837,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
                 * Do OS callback.
                 */
                SCpnt->result = DID_RESET << 16;
-               dtmprintk((KERN_INFO MYNAM ": %s: mptscsih_abort: "
+               dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: mptscsih_abort: "
                   "Command not in the active list! (sc=%p)\n", ioc->name,
                   SCpnt));
                retval = 0;
@@ -1850,8 +1902,8 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
        /* If we can't locate our host adapter structure, return FAILED status.
         */
        if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
-               dtmprintk((KERN_INFO MYNAM ": mptscsih_dev_reset: Can't "
-                   "locate host! (sc=%p)\n", SCpnt));
+               printk(KERN_DEBUG MYNAM ": mptscsih_dev_reset: Can't "
+                   "locate host! (sc=%p)\n", SCpnt);
                return FAILED;
        }
 
@@ -1913,8 +1965,8 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
        /* If we can't locate our host adapter structure, return FAILED status.
         */
        if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
-               dtmprintk((KERN_INFO MYNAM ": mptscsih_bus_reset: Can't "
-                   "locate host! (sc=%p)\n", SCpnt ));
+               printk(KERN_DEBUG MYNAM ": mptscsih_bus_reset: Can't "
+                   "locate host! (sc=%p)\n", SCpnt );
                return FAILED;
        }
 
@@ -1957,8 +2009,8 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)
 
        /*  If we can't locate the host to reset, then we failed. */
        if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
-               dtmprintk( ( KERN_INFO MYNAM ": mptscsih_host_reset: Can't "
-                   "locate host! (sc=%p)\n", SCpnt));
+               printk( KERN_DEBUG MYNAM ": mptscsih_host_reset: Can't "
+                   "locate host! (sc=%p)\n", SCpnt);
                return FAILED;
        }
 
@@ -2106,16 +2158,16 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
        u8                       tmType;
        u32                      termination_count;
 
-       dtmprintk((MYIOC_s_WARN_FMT "TaskMgmt completed (mf=%p,mr=%p)\n",
+       dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt completed (mf=%p,mr=%p)\n",
            ioc->name, mf, mr));
        if (!ioc->sh) {
-               dtmprintk((MYIOC_s_WARN_FMT
+               dtmprintk(ioc, printk(MYIOC_s_WARN_FMT
                    "TaskMgmt Complete: NULL Scsi Host Ptr\n", ioc->name));
                return 1;
        }
 
        if (mr == NULL) {
-               dtmprintk((MYIOC_s_WARN_FMT
+               dtmprintk(ioc, printk(MYIOC_s_WARN_FMT
                    "ERROR! TaskMgmt Reply: NULL Request %p\n", ioc->name, mf));
                return 1;
        }
@@ -2131,19 +2183,21 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
            pScsiTmReply->ResponseCode)
                mptscsih_taskmgmt_response_code(ioc,
                    pScsiTmReply->ResponseCode);
-       DBG_DUMP_TM_REPLY_FRAME((u32 *)pScsiTmReply);
-
-#if defined(MPT_DEBUG_REPLY) || defined(MPT_DEBUG_TM)
-       printk("%s: ha=%d [%d:%d:0] task_type=0x%02X "
-           "iocstatus=0x%04X\n\tloginfo=0x%08X response_code=0x%02X "
-           "term_cmnds=%d\n", __FUNCTION__, ioc->id, pScsiTmReply->Bus,
-           pScsiTmReply->TargetID, pScsiTmReq->TaskType,
-           le16_to_cpu(pScsiTmReply->IOCStatus),
-           le32_to_cpu(pScsiTmReply->IOCLogInfo),pScsiTmReply->ResponseCode,
-           le32_to_cpu(pScsiTmReply->TerminationCount));
+       DBG_DUMP_TM_REPLY_FRAME(ioc, (u32 *)pScsiTmReply);
+
+#ifdef CONFIG_FUSION_LOGGING
+       if ((ioc->debug_level & MPT_DEBUG_REPLY) ||
+                               (ioc->debug_level & MPT_DEBUG_TM ))
+               printk("%s: ha=%d [%d:%d:0] task_type=0x%02X "
+                       "iocstatus=0x%04X\n\tloginfo=0x%08X response_code=0x%02X "
+                       "term_cmnds=%d\n", __FUNCTION__, ioc->id, pScsiTmReply->Bus,
+                        pScsiTmReply->TargetID, pScsiTmReq->TaskType,
+                       le16_to_cpu(pScsiTmReply->IOCStatus),
+                       le32_to_cpu(pScsiTmReply->IOCLogInfo),pScsiTmReply->ResponseCode,
+                       le32_to_cpu(pScsiTmReply->TerminationCount));
 #endif
        if (!iocstatus) {
-               dtmprintk((MYIOC_s_WARN_FMT " TaskMgmt SUCCESS\n", ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT " TaskMgmt SUCCESS\n", ioc->name));
                        hd->abortSCpnt = NULL;
                goto out;
        }
@@ -2224,10 +2278,6 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
        geom[1] = sectors;
        geom[2] = cylinders;
 
-       dprintk((KERN_NOTICE
-               ": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n",
-               sdev->id, sdev->lun, sdev->channel, (int)cylinders, heads, sectors));
-
        return 0;
 }
 
@@ -2393,11 +2443,11 @@ mptscsih_slave_configure(struct scsi_device *sdev)
        vtarget = starget->hostdata;
        vdevice = sdev->hostdata;
 
-       dsprintk((MYIOC_s_INFO_FMT
+       dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
                "device @ %p, channel=%d, id=%d, lun=%d\n",
                hd->ioc->name, sdev, sdev->channel, sdev->id, sdev->lun));
        if (hd->ioc->bus_type == SPI)
-               dsprintk((MYIOC_s_INFO_FMT
+               dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
                    "sdtr %d wdtr %d ppr %d inq length=%d\n",
                    hd->ioc->name, sdev->sdtr, sdev->wdtr,
                    sdev->ppr, sdev->inquiry_len));
@@ -2411,19 +2461,19 @@ mptscsih_slave_configure(struct scsi_device *sdev)
        vdevice->configured_lun = 1;
        mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
 
-       dsprintk((MYIOC_s_INFO_FMT
+       dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
                "Queue depth=%d, tflags=%x\n",
                hd->ioc->name, sdev->queue_depth, vtarget->tflags));
 
        if (hd->ioc->bus_type == SPI)
-               dsprintk((MYIOC_s_INFO_FMT
+               dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
                    "negoFlags=%x, maxOffset=%x, SyncFactor=%x\n",
                    hd->ioc->name, vtarget->negoFlags, vtarget->maxOffset,
                    vtarget->minSyncFactor));
 
 slave_configure_exit:
 
-       dsprintk((MYIOC_s_INFO_FMT
+       dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
                "tagged %d, simple %d, ordered %d\n",
                hd->ioc->name,sdev->tagged_supported, sdev->simple_tags,
                sdev->ordered_tags));
@@ -2490,7 +2540,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
                        }
                }
        } else {
-               dprintk((MYIOC_s_INFO_FMT "Hmmm... SenseData len=0! (?)\n",
+               dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Hmmm... SenseData len=0! (?)\n",
                                hd->ioc->name));
        }
 }
@@ -2520,7 +2570,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
        unsigned long    flags;
        int             ii;
 
-       dtmprintk((KERN_WARNING MYNAM
+       dtmprintk(ioc, printk(KERN_DEBUG MYNAM
                        ": IOC %s_reset routed to SCSI host driver!\n",
                        reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
                        reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
@@ -2535,7 +2585,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
 
        if (reset_phase == MPT_IOC_SETUP_RESET) {
-               dtmprintk((MYIOC_s_WARN_FMT "Setup-Diag Reset\n", ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Setup-Diag Reset\n", ioc->name));
 
                /* Clean Up:
                 * 1. Set Hard Reset Pending Flag
@@ -2544,7 +2594,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                hd->resetPending = 1;
 
        } else if (reset_phase == MPT_IOC_PRE_RESET) {
-               dtmprintk((MYIOC_s_WARN_FMT "Pre-Diag Reset\n", ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Pre-Diag Reset\n", ioc->name));
 
                /* 2. Flush running commands
                 *      Clean ScsiLookup (and associated memory)
@@ -2564,10 +2614,10 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                        mpt_free_msg_frame(ioc, hd->cmdPtr);
                }
 
-               dtmprintk((MYIOC_s_WARN_FMT "Pre-Reset complete.\n", ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Pre-Reset complete.\n", ioc->name));
 
        } else {
-               dtmprintk((MYIOC_s_WARN_FMT "Post-Diag Reset\n", ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Post-Diag Reset\n", ioc->name));
 
                /* Once a FW reload begins, all new OS commands are
                 * redirected to the doneQ w/ a reset status.
@@ -2607,7 +2657,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
                        hd->cmdPtr = NULL;
                }
 
-               dtmprintk((MYIOC_s_WARN_FMT "Post-Reset complete.\n", ioc->name));
+               dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Post-Reset complete.\n", ioc->name));
 
        }
 
@@ -2621,7 +2671,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
        MPT_SCSI_HOST *hd;
        u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
 
-       devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
+       devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
                        ioc->name, event));
 
        if (ioc->sh == NULL ||
@@ -2663,7 +2713,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
        case MPI_EVENT_STATE_CHANGE:                    /* 02 */
        case MPI_EVENT_EVENT_CHANGE:                    /* 0A */
        default:
-               dprintk((KERN_INFO "  Ignoring event (=%02Xh)\n", event));
+               dprintk(ioc, printk(KERN_DEBUG MYNAM ": Ignoring event (=%02Xh)\n", event));
                break;
        }
 
@@ -2724,7 +2774,7 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
        }
        hd->cmdPtr = NULL;
 
-       ddvprintk((MYIOC_s_INFO_FMT "ScanDvComplete (mf=%p,mr=%p,idx=%d)\n",
+       ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScanDvComplete (mf=%p,mr=%p,idx=%d)\n",
                        hd->ioc->name, mf, mr, req_idx));
 
        hd->pLocal = &hd->localReply;
@@ -2744,9 +2794,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                status = le16_to_cpu(pReply->IOCStatus) & MPI_IOCSTATUS_MASK;
                scsi_status = pReply->SCSIStatus;
 
-               ddvtprintk((KERN_NOTICE "  IOCStatus=%04xh, SCSIState=%02xh, SCSIStatus=%02xh, IOCLogInfo=%08xh\n",
-                            status, pReply->SCSIState, scsi_status,
-                            le32_to_cpu(pReply->IOCLogInfo)));
 
                switch(status) {
 
@@ -2799,7 +2846,7 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                                                        SCSI_STD_SENSE_BYTES);
                                memcpy(hd->pLocal->sense, sense_data, sz);
 
-                               ddvprintk((KERN_NOTICE "  Check Condition, sense ptr %p\n",
+                               ddvprintk(ioc, printk(KERN_DEBUG "  Check Condition, sense ptr %p\n",
                                                sense_data));
                        } else if (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_FAILED) {
                                if (pReq->CDB[0] == INQUIRY)
@@ -2830,8 +2877,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 
                }       /* switch(status) */
 
-               ddvtprintk((KERN_NOTICE "  completionCode set to %08xh\n",
-                               completionCode));
        } /* end of address reply case */
 
        hd->pLocal->completion = completionCode;
@@ -2862,7 +2907,7 @@ mptscsih_timer_expired(unsigned long data)
 {
        MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data;
 
-       ddvprintk((MYIOC_s_WARN_FMT "Timer Expired! Cmd %p\n", hd->ioc->name, hd->cmdPtr));
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", hd->ioc->name, hd->cmdPtr));
 
        if (hd->cmdPtr) {
                MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr;
@@ -2874,7 +2919,6 @@ mptscsih_timer_expired(unsigned long data)
                         * If new eh code, do nothing. Wait for OS cmd timeout
                         *      for bus reset.
                         */
-                       ddvtprintk((MYIOC_s_NOTE_FMT "DV Cmd Timeout: NoOp\n", hd->ioc->name));
                } else {
                        /* Perform a FW reload */
                        if (mpt_HardResetHandler(hd->ioc, NO_SLEEP) < 0) {
@@ -2891,7 +2935,7 @@ mptscsih_timer_expired(unsigned long data)
         * The FW will reply to all outstanding commands, callback will finish cleanup.
         * Hard reset clean-up will free all resources.
         */
-       ddvprintk((MYIOC_s_WARN_FMT "Timer Expired Complete!\n", hd->ioc->name));
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", hd->ioc->name));
 
        return;
 }
@@ -2932,7 +2976,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
 
        in_isr = in_interrupt();
        if (in_isr) {
-               dprintk((MYIOC_s_WARN_FMT "Internal SCSI IO request not allowed in ISR context!\n",
+               dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Internal SCSI IO request not allowed in ISR context!\n",
                                        hd->ioc->name));
                return -EPERM;
        }
@@ -3035,7 +3079,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
        /* Get and Populate a free Frame
         */
        if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
-               ddvprintk((MYIOC_s_WARN_FMT "No msg frames!\n",
+               ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "No msg frames!\n",
                                        hd->ioc->name));
                return -EBUSY;
        }
@@ -3075,7 +3119,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
 
        if (cmd == REQUEST_SENSE) {
                pScsiReq->Control = cpu_to_le32(dir | MPI_SCSIIO_CONTROL_UNTAGGED);
-               ddvprintk((MYIOC_s_INFO_FMT "Untagged! 0x%2x\n",
+               ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Untagged! 0x%2x\n",
                        hd->ioc->name, cmd));
        }
 
@@ -3086,7 +3130,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
        pScsiReq->SenseBufferLowAddr = cpu_to_le32(hd->ioc->sense_buf_low_dma
                                           + (my_idx * MPT_SENSE_BUFFER_ALLOC));
 
-       ddvprintk((MYIOC_s_INFO_FMT "Sending Command 0x%x for (%d:%d:%d)\n",
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Sending Command 0x%x for (%d:%d:%d)\n",
                        hd->ioc->name, cmd, io->channel, io->id, io->lun));
 
        if (dir == MPI_SCSIIO_CONTROL_READ) {
@@ -3138,7 +3182,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
        } else {
                rc = -EFAULT;
                /* This should never happen. */
-               ddvprintk((MYIOC_s_INFO_FMT "_do_cmd: Null pLocal!!!\n",
+               ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "_do_cmd: Null pLocal!!!\n",
                                hd->ioc->name));
        }
 
@@ -3324,6 +3368,35 @@ mptscsih_device_delay_show(struct class_device *cdev, char *buf)
 static CLASS_DEVICE_ATTR(device_delay, S_IRUGO,
     mptscsih_device_delay_show, NULL);
 
+static ssize_t
+mptscsih_debug_level_show(struct class_device *cdev, char *buf)
+{
+       struct Scsi_Host *host = class_to_shost(cdev);
+       MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)host->hostdata;
+       MPT_ADAPTER *ioc = hd->ioc;
+
+       return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->debug_level);
+}
+static ssize_t
+mptscsih_debug_level_store(struct class_device *cdev, const char *buf,
+                                                               size_t count)
+{
+       struct Scsi_Host *host = class_to_shost(cdev);
+       MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)host->hostdata;
+       MPT_ADAPTER *ioc = hd->ioc;
+       int val = 0;
+
+       if (sscanf(buf, "%x", &val) != 1)
+               return -EINVAL;
+
+       ioc->debug_level = val;
+       printk(MYIOC_s_INFO_FMT "debug_level=%08xh\n",
+                               ioc->name, ioc->debug_level);
+       return strlen(buf);
+}
+static CLASS_DEVICE_ATTR(debug_level, S_IRUGO | S_IWUSR,
+    mptscsih_debug_level_show, mptscsih_debug_level_store);
+
 struct class_device_attribute *mptscsih_host_attrs[] = {
        &class_device_attr_version_fw,
        &class_device_attr_version_bios,
@@ -3336,6 +3409,7 @@ struct class_device_attribute *mptscsih_host_attrs[] = {
        &class_device_attr_board_tracer,
        &class_device_attr_io_delay,
        &class_device_attr_device_delay,
+       &class_device_attr_debug_level,
        NULL,
 };
 EXPORT_SYMBOL(mptscsih_host_attrs);
index 947fe29018002703b4b9dac91b6c2ef416fbbb9a..8c98420640a5eccaccaecfc3bff15f219a4e8707 100644 (file)
@@ -138,7 +138,9 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
                                else {
                                        factor = MPT_ULTRA320;
                                        if (scsi_device_qas(sdev)) {
-                                               ddvprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
+                                               ddvprintk(hd->ioc,
+                                               printk(KERN_DEBUG "Enabling QAS due to "
+                                               "byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
                                                noQas = 0;
                                        }
                                        if (sdev->type == TYPE_TAPE &&
@@ -225,7 +227,8 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
                /* Disable QAS in a mixed configuration case
                 */
 
-               ddvprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
+               ddvprintk(hd->ioc, printk(KERN_DEBUG
+                       "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
        }
 }
 
@@ -256,8 +259,8 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
        /* Get a MF for this command.
         */
        if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
-               dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n",
-                                       ioc->name));
+               dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
+                               "writeIOCPage4 : no msg frames!\n",ioc->name));
                return -EAGAIN;
        }
 
@@ -297,7 +300,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
 
        mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
 
-       ddvprintk((MYIOC_s_INFO_FMT
+       ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
                        ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
 
@@ -422,7 +425,7 @@ static int mptspi_target_alloc(struct scsi_target *starget)
        if (starget->channel == 0 &&
            mptspi_is_raid(hd, starget->id)) {
                vtarget->raidVolume = 1;
-               ddvprintk((KERN_INFO
+               ddvprintk(hd->ioc, printk(KERN_DEBUG
                    "RAID Volume @ channel=%d id=%d\n", starget->channel,
                    starget->id));
        }
@@ -462,7 +465,7 @@ mptspi_target_destroy(struct scsi_target *starget)
 static void
 mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
 {
-       ddvprintk((MYIOC_s_INFO_FMT "id=%d Requested = 0x%08x"
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Requested = 0x%08x"
            " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
            hd->ioc->name, starget->id, ii,
            ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
@@ -487,7 +490,7 @@ mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget,
 static void
 mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
 {
-       ddvprintk((MYIOC_s_INFO_FMT "id=%d Read = 0x%08x"
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Read = 0x%08x"
            " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
            hd->ioc->name, starget->id, ii,
            ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
@@ -613,7 +616,7 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
        /* Get and Populate a free Frame
         */
        if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
-               ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
+               ddvprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
                                        hd->ioc->name));
                return -EAGAIN;
        }
@@ -635,7 +638,7 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
        mpt_add_sge((char *)&pReq->ActionDataSGE,
                MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
 
-       ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action=%x channel=%d id=%d\n",
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
                        hd->ioc->name, pReq->Action, channel, id));
 
        hd->pLocal = NULL;
@@ -735,7 +738,7 @@ static int mptspi_slave_configure(struct scsi_device *sdev)
        if (ret)
                return ret;
 
-       ddvprintk((MYIOC_s_INFO_FMT "id=%d min_period=0x%02x"
+       ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d min_period=0x%02x"
                " max_offset=0x%02x max_width=%d\n", hd->ioc->name,
                sdev->id, spi_min_period(scsi_target(sdev)),
                spi_max_offset(scsi_target(sdev)),
@@ -768,10 +771,8 @@ mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
                return 0;
        }
 
-#ifdef MPT_DEBUG_DV
        if (spi_dv_pending(scsi_target(SCpnt->device)))
-               scsi_print_command(SCpnt);
-#endif
+               ddvprintk(hd->ioc, scsi_print_command(SCpnt));
 
        return mptscsih_qcmd(SCpnt,done);
 }
@@ -1415,7 +1416,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        if (numSGE < sh->sg_tablesize) {
                /* Reset this value */
-               dprintk((MYIOC_s_INFO_FMT
+               dprintk(ioc, printk(MYIOC_s_INFO_FMT
                  "Resetting sg_tablesize to %d from %d\n",
                  ioc->name, numSGE, sh->sg_tablesize));
                sh->sg_tablesize = numSGE;
@@ -1435,7 +1436,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto out_mptspi_probe;
        }
 
-       dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
+       dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
                 ioc->name, hd->ScsiLookup));
 
        /* Clear the TM flags
@@ -1463,7 +1464,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        ioc->spi_data.Saf_Te = mpt_saf_te;
 
        hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
-       ddvprintk((MYIOC_s_INFO_FMT
+       ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                "saf_te %x\n",
                ioc->name,
                mpt_saf_te));
@@ -1481,7 +1482,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        error = scsi_add_host (sh, &ioc->pcidev->dev);
        if(error) {
-               dprintk((KERN_ERR MYNAM
+               dprintk(ioc, printk(KERN_ERR MYNAM
                  "scsi_add_host failed\n"));
                goto out_mptspi_probe;
        }
@@ -1536,15 +1537,8 @@ mptspi_init(void)
        mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
        mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
 
-       if (mpt_event_register(mptspiDoneCtx, mptspi_event_process) == 0) {
-               devtverboseprintk((KERN_INFO MYNAM
-                 ": Registered for IOC event notifications\n"));
-       }
-
-       if (mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset) == 0) {
-               dprintk((KERN_INFO MYNAM
-                 ": Registered for IOC reset notifications\n"));
-       }
+       mpt_event_register(mptspiDoneCtx, mptspi_event_process);
+       mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset);
 
        error = pci_register_driver(&mptspi_driver);
        if (error)
@@ -1564,12 +1558,7 @@ mptspi_exit(void)
        pci_unregister_driver(&mptspi_driver);
 
        mpt_reset_deregister(mptspiDoneCtx);
-       dprintk((KERN_INFO MYNAM
-         ": Deregistered for IOC reset notifications\n"));
-
        mpt_event_deregister(mptspiDoneCtx);
-       dprintk((KERN_INFO MYNAM
-         ": Deregistered for IOC event notifications\n"));
 
        mpt_deregister(mptspiInternalCtx);
        mpt_deregister(mptspiTaskCtx);
index 94b78cc5fe86d554647585b9e310909931678952..e684212fd8e2004fd6410b1e8688fe2cc5044af5 100644 (file)
@@ -177,7 +177,7 @@ obj-$(CONFIG_ZORRO8390) += zorro8390.o
 obj-$(CONFIG_HPLANCE) += hplance.o 7990.o
 obj-$(CONFIG_MVME147_NET) += mvme147.o 7990.o
 obj-$(CONFIG_EQUALIZER) += eql.o
-obj-$(CONFIG_LGUEST_GUEST) += lguest_net.o
+obj-$(CONFIG_LGUEST_NET) += lguest_net.o
 obj-$(CONFIG_MIPS_JAZZ_SONIC) += jazzsonic.o
 obj-$(CONFIG_MIPS_AU1X00_ENET) += au1000_eth.o
 obj-$(CONFIG_MIPS_SIM_NET) += mipsnet.o
index 9a08d656f1ce5a879da190cf1bdb6a662439c9a6..2bb97d464689e9bcbe90db886a08a7f06ef15243 100644 (file)
@@ -798,6 +798,7 @@ static void bf537mac_shutdown(struct net_device *dev)
  */
 static int bf537mac_open(struct net_device *dev)
 {
+       int retval;
        pr_debug("%s: %s\n", dev->name, __FUNCTION__);
 
        /*
@@ -811,7 +812,10 @@ static int bf537mac_open(struct net_device *dev)
        }
 
        /* initial rx and tx list */
-       desc_list_init();
+       retval = desc_list_init();
+
+       if (retval)
+               return retval;
 
        bf537mac_setphy(dev);
        setup_system_regs(dev);
index 03023dd17829da101765112c4b7ef6054e4a9325..4e8df910c00d0705a503ee4441cd0df2233e9c4b 100644 (file)
@@ -47,6 +47,7 @@
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
+#include <asm/cacheflush.h>
 
 #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \
     defined(CONFIG_M5272) || defined(CONFIG_M528x) || \
@@ -98,8 +99,6 @@ static unsigned char  fec_mac_default[] = {
 #define        FEC_FLASHMAC    0xf0006006
 #elif defined(CONFIG_GILBARCONAP) || defined(CONFIG_SCALES)
 #define        FEC_FLASHMAC    0xf0006000
-#elif defined (CONFIG_MTD_KeyTechnology)
-#define        FEC_FLASHMAC    0xffe04000
 #elif defined(CONFIG_CANCam)
 #define        FEC_FLASHMAC    0xf0020000
 #elif defined (CONFIG_M5272C3)
@@ -191,6 +190,8 @@ struct fec_enet_private {
        /* Hardware registers of the FEC device */
        volatile fec_t  *hwp;
 
+       struct net_device *netdev;
+
        /* The saved address of a sent-in-place packet/buffer, for skfree(). */
        unsigned char *tx_bounce[TX_RING_SIZE];
        struct  sk_buff* tx_skbuff[TX_RING_SIZE];
@@ -1269,7 +1270,7 @@ static void __inline__ fec_request_intrs(struct net_device *dev)
        icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR3);
        *icrp = 0x00000ddd;
        icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1);
-       *icrp = (*icrp & 0x70777777) | 0x0d000000;
+       *icrp = 0x0d000000;
 }
 
 static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_private *fep)
@@ -1331,7 +1332,7 @@ static void __inline__ fec_disable_phy_intr(void)
 {
        volatile unsigned long *icrp;
        icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1);
-       *icrp = (*icrp & 0x70777777) | 0x08000000;
+       *icrp = 0x08000000;
 }
 
 static void __inline__ fec_phy_ack_intr(void)
@@ -1339,7 +1340,7 @@ static void __inline__ fec_phy_ack_intr(void)
        volatile unsigned long *icrp;
        /* Acknowledge the interrupt */
        icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1);
-       *icrp = (*icrp & 0x77777777) | 0x08000000;
+       *icrp = 0x0d000000;
 }
 
 static void __inline__ fec_localhw_setup(void)
@@ -1426,6 +1427,29 @@ static void __inline__ fec_request_intrs(struct net_device *dev)
                *gpio_pehlpar = 0xc0;
        }
 #endif
+
+#if defined(CONFIG_M527x)
+       /* Set up gpio outputs for MII lines */
+       {
+               volatile u8 *gpio_par_fec;
+               volatile u16 *gpio_par_feci2c;
+
+               gpio_par_feci2c = (volatile u16 *)(MCF_IPSBAR + 0x100082);
+               /* Set up gpio outputs for FEC0 MII lines */
+               gpio_par_fec = (volatile u8 *)(MCF_IPSBAR + 0x100078);
+
+               *gpio_par_feci2c |= 0x0f00;
+               *gpio_par_fec |= 0xc0;
+
+#if defined(CONFIG_FEC2)
+               /* Set up gpio outputs for FEC1 MII lines */
+               gpio_par_fec = (volatile u8 *)(MCF_IPSBAR + 0x100079);
+
+               *gpio_par_feci2c |= 0x00a0;
+               *gpio_par_fec |= 0xc0;
+#endif /* CONFIG_FEC2 */
+       }
+#endif /* CONFIG_M527x */
 }
 
 static void __inline__ fec_set_mii(struct net_device *dev, struct fec_enet_private *fep)
@@ -1940,9 +1964,10 @@ static void mii_display_status(struct net_device *dev)
        printk(".\n");
 }
 
-static void mii_display_config(struct net_device *dev)
+static void mii_display_config(struct work_struct *work)
 {
-       struct fec_enet_private *fep = netdev_priv(dev);
+       struct fec_enet_private *fep = container_of(work, struct fec_enet_private, phy_task);
+       struct net_device *dev = fep->netdev;
        uint status = fep->phy_status;
 
        /*
@@ -1976,9 +2001,10 @@ static void mii_display_config(struct net_device *dev)
        fep->sequence_done = 1;
 }
 
-static void mii_relink(struct net_device *dev)
+static void mii_relink(struct work_struct *work)
 {
-       struct fec_enet_private *fep = netdev_priv(dev);
+       struct fec_enet_private *fep = container_of(work, struct fec_enet_private, phy_task);
+       struct net_device *dev = fep->netdev;
        int duplex;
 
        /*
@@ -2022,7 +2048,7 @@ static void mii_queue_relink(uint mii_reg, struct net_device *dev)
                return;
 
        fep->mii_phy_task_queued = 1;
-       INIT_WORK(&fep->phy_task, (void*)mii_relink, dev);
+       INIT_WORK(&fep->phy_task, mii_relink);
        schedule_work(&fep->phy_task);
 }
 
@@ -2035,7 +2061,7 @@ static void mii_queue_config(uint mii_reg, struct net_device *dev)
                return;
 
        fep->mii_phy_task_queued = 1;
-       INIT_WORK(&fep->phy_task, (void*)mii_display_config, dev);
+       INIT_WORK(&fep->phy_task, mii_display_config);
        schedule_work(&fep->phy_task);
 }
 
@@ -2330,6 +2356,7 @@ int __init fec_enet_init(struct net_device *dev)
 
        fep->index = index;
        fep->hwp = fecp;
+       fep->netdev = dev;
 
        /* Whack a reset.  We should wait for this.
        */
index 67c63d1f15829453941f94f3283d0bef1da421f1..5c6a5d043007ebec1418fe2d9a70cf5071cc06eb 100644 (file)
@@ -220,6 +220,7 @@ acpi_status pci_osc_control_set(acpi_handle handle, u32 flags)
 }
 EXPORT_SYMBOL(pci_osc_control_set);
 
+#ifdef CONFIG_ACPI_SLEEP
 /*
  * _SxD returns the D-state with the highest power
  * (lowest D-state number) supported in the S-state "x".
@@ -267,6 +268,7 @@ static pci_power_t acpi_pci_choose_state(struct pci_dev *pdev,
        }
        return PCI_POWER_ERROR;
 }
+#endif
 
 static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
 {
@@ -340,7 +342,9 @@ static int __init acpi_pci_init(void)
        ret = register_acpi_bus_type(&acpi_pci_bus);
        if (ret)
                return 0;
+#ifdef CONFIG_ACPI_SLEEP
        platform_pci_choose_state = acpi_pci_choose_state;
+#endif
        platform_pci_set_power_state = acpi_pci_set_power_state;
        return 0;
 }
index fba319d6fcc86bf178be1cc531e0d227adff0a6c..1ee9cd9c86e221fe1c3380cfdb0d7fe838e8010f 100644 (file)
@@ -1517,7 +1517,7 @@ EXPORT_SYMBOL(pcie_get_readrq);
 /**
  * pcie_set_readrq - set PCI Express maximum memory read request
  * @dev: PCI device to query
- * @count: maximum memory read count in bytes
+ * @rq: maximum memory read count in bytes
  *    valid values are 128, 256, 512, 1024, 2048, 4096
  *
  * If possible sets maximum read byte count
index 6a2a3c2f4d5e56641d12b6ee9f625d9fce58a59e..616fc72190bfd9ad007c459bc142e063a6150d2f 100644 (file)
@@ -127,6 +127,7 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev)
        return ACPI_FAILURE(status) ? -ENODEV : 0;
 }
 
+#ifdef CONFIG_ACPI_SLEEP
 static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state)
 {
        return acpi_bus_set_power((acpi_handle) dev->data,
@@ -140,14 +141,17 @@ static int pnpacpi_resume(struct pnp_dev *dev)
 {
        return acpi_bus_set_power((acpi_handle) dev->data, ACPI_STATE_D0);
 }
+#endif
 
 static struct pnp_protocol pnpacpi_protocol = {
        .name    = "Plug and Play ACPI",
        .get     = pnpacpi_get_resources,
        .set     = pnpacpi_set_resources,
        .disable = pnpacpi_disable_resources,
+#ifdef CONFIG_ACPI_SLEEP
        .suspend = pnpacpi_suspend,
        .resume = pnpacpi_resume,
+#endif
 };
 
 static int __init pnpacpi_add_device(struct acpi_device *device)
index 260ead95991898b0f89f57f2838464263cdb1abd..1aa709dda0d67d0fbb9e5d660211e207b22ca3ba 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Blackfin On-Chip Real Time Clock Driver
- *  Supports BF531/BF532/BF533/BF534/BF536/BF537
+ *  Supports BF53[123]/BF53[467]/BF54[2489]
  *
  * Copyright 2004-2007 Analog Devices Inc.
  *
index 3f36cb3910ee638c3fcf167a605f42840effe755..643033890e341d28188a3769ea35dcc56cf66fe0 100644 (file)
@@ -44,15 +44,9 @@ config CCW_CONSOLE
        depends on TN3215_CONSOLE || TN3270_CONSOLE
        default y
 
-config SCLP
-       bool "Support for SCLP"
-       depends on S390
-       help
-         Include support for the SCLP interface to the service element.
-
 config SCLP_TTY
        bool "Support for SCLP line mode terminal"
-       depends on SCLP
+       depends on S390
        help
          Include support for IBM SCLP line-mode terminals.
 
@@ -65,7 +59,7 @@ config SCLP_CONSOLE
 
 config SCLP_VT220_TTY
        bool "Support for SCLP VT220-compatible terminal"
-       depends on SCLP
+       depends on S390
        help
          Include support for an IBM SCLP VT220-compatible terminal.
 
@@ -78,7 +72,7 @@ config SCLP_VT220_CONSOLE
 
 config SCLP_CPI
        tristate "Control-Program Identification"
-       depends on SCLP
+       depends on S390
        help
          This option enables the hardware console interface for system
          identification. This is commonly used for workload management and
index 743944ad61ecb44be0ba47a9f60ebad97e159730..4f2f81b16cfa277dfebd324513a60cdf400d3c1e 100644 (file)
@@ -147,8 +147,7 @@ raw3270_request_alloc(size_t size)
  * Allocate a new 3270 ccw request from bootmem. Only works very
  * early in the boot process. Only con3270.c should be using this.
  */
-struct raw3270_request *
-raw3270_request_alloc_bootmem(size_t size)
+struct raw3270_request __init *raw3270_request_alloc_bootmem(size_t size)
 {
        struct raw3270_request *rq;
 
@@ -848,8 +847,7 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc)
 /*
  * Setup 3270 device configured as console.
  */
-struct raw3270 *
-raw3270_setup_console(struct ccw_device *cdev)
+struct raw3270 __init *raw3270_setup_console(struct ccw_device *cdev)
 {
        struct raw3270 *rp;
        char *ascebc;
index 726334757bbf659d17b60d47d65297942ff60cb2..40cd21bc5cc4dc936191b3b68e1e9febc4c62710 100644 (file)
@@ -621,11 +621,24 @@ sclp_vt220_flush_buffer(struct tty_struct *tty)
 /*
  * Initialize all relevant components and register driver with system.
  */
-static int
-__sclp_vt220_init(int early)
+static void __init __sclp_vt220_cleanup(void)
+{
+       struct list_head *page, *p;
+
+       list_for_each_safe(page, p, &sclp_vt220_empty) {
+               list_del(page);
+               if (slab_is_available())
+                       free_page((unsigned long) page);
+               else
+                       free_bootmem((unsigned long) page, PAGE_SIZE);
+       }
+}
+
+static int __init __sclp_vt220_init(void)
 {
        void *page;
        int i;
+       int num_pages;
 
        if (sclp_vt220_initialized)
                return 0;
@@ -642,13 +655,16 @@ __sclp_vt220_init(int early)
        sclp_vt220_flush_later = 0;
 
        /* Allocate pages for output buffering */
-       for (i = 0; i < (early ? MAX_CONSOLE_PAGES : MAX_KMEM_PAGES); i++) {
-               if (early)
-                       page = alloc_bootmem_low_pages(PAGE_SIZE);
-               else
+       num_pages = slab_is_available() ? MAX_KMEM_PAGES : MAX_CONSOLE_PAGES;
+       for (i = 0; i < num_pages; i++) {
+               if (slab_is_available())
                        page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
-               if (!page)
+               else
+                       page = alloc_bootmem_low_pages(PAGE_SIZE);
+               if (!page) {
+                       __sclp_vt220_cleanup();
                        return -ENOMEM;
+               }
                list_add_tail((struct list_head *) page, &sclp_vt220_empty);
        }
        return 0;
@@ -662,14 +678,13 @@ static const struct tty_operations sclp_vt220_ops = {
        .flush_chars = sclp_vt220_flush_chars,
        .write_room = sclp_vt220_write_room,
        .chars_in_buffer = sclp_vt220_chars_in_buffer,
-       .flush_buffer = sclp_vt220_flush_buffer
+       .flush_buffer = sclp_vt220_flush_buffer,
 };
 
 /*
  * Register driver with SCLP and Linux and initialize internal tty structures.
  */
-static int __init
-sclp_vt220_tty_init(void)
+static int __init sclp_vt220_tty_init(void)
 {
        struct tty_driver *driver;
        int rc;
@@ -679,18 +694,15 @@ sclp_vt220_tty_init(void)
        driver = alloc_tty_driver(1);
        if (!driver)
                return -ENOMEM;
-       rc = __sclp_vt220_init(0);
-       if (rc) {
-               put_tty_driver(driver);
-               return rc;
-       }
+       rc = __sclp_vt220_init();
+       if (rc)
+               goto out_driver;
        rc = sclp_register(&sclp_vt220_register);
        if (rc) {
                printk(KERN_ERR SCLP_VT220_PRINT_HEADER
                       "could not register tty - "
                       "sclp_register returned %d\n", rc);
-               put_tty_driver(driver);
-               return rc;
+               goto out_init;
        }
 
        driver->owner = THIS_MODULE;
@@ -709,14 +721,20 @@ sclp_vt220_tty_init(void)
                printk(KERN_ERR SCLP_VT220_PRINT_HEADER
                       "could not register tty - "
                       "tty_register_driver returned %d\n", rc);
-               put_tty_driver(driver);
-               return rc;
+               goto out_sclp;
        }
        sclp_vt220_driver = driver;
        return 0;
-}
 
-module_init(sclp_vt220_tty_init);
+out_sclp:
+       sclp_unregister(&sclp_vt220_register);
+out_init:
+       __sclp_vt220_cleanup();
+out_driver:
+       put_tty_driver(driver);
+       return rc;
+}
+__initcall(sclp_vt220_tty_init);
 
 #ifdef CONFIG_SCLP_VT220_CONSOLE
 
@@ -762,7 +780,7 @@ sclp_vt220_con_init(void)
 
        if (!CONSOLE_IS_SCLP)
                return 0;
-       rc = __sclp_vt220_init(1);
+       rc = __sclp_vt220_init();
        if (rc)
                return rc;
        /* Attach linux console */
index e90b0f84619582f236c153cb7b4b00b7fd887a0d..161867cebd8c5bd2e0d9d8f09dfa0dac5996d8cf 100644 (file)
@@ -486,7 +486,7 @@ static ssize_t diag14_read(struct file *file, char __user *ubuf, size_t count,
                }
                if (rc)
                        goto fail;
-               if (reclen)
+               if (reclen && (copied == 0) && (*offs < PAGE_SIZE))
                        *((u16 *) &buf[FILE_RECLEN_OFFSET]) = reclen;
                len = min(count - copied, PAGE_SIZE - res);
                if (copy_to_user(ubuf + copied, buf + res, len)) {
index ec0404874fada1f004c01f2ebfbc54a81c87de22..bd5f16f80bf8f316e8d52937771100cf0f914d7f 100644 (file)
@@ -51,7 +51,7 @@ blacklist_range (range_action action, unsigned int from, unsigned int to,
                to = from;
 
        if (from > to || to > __MAX_SUBCHANNEL || ssid > __MAX_SSID) {
-               printk (KERN_WARNING "Invalid blacklist range "
+               printk (KERN_WARNING "cio: Invalid blacklist range "
                        "0.%x.%04x to 0.%x.%04x, skipping\n",
                        ssid, from, ssid, to);
                return;
@@ -119,7 +119,7 @@ blacklist_busid(char **str, int *id0, int *ssid, int *devno)
        return 0;
 confused:
        strsep(str, ",\n");
-       printk(KERN_WARNING "Invalid cio_ignore parameter '%s'\n", sav);
+       printk(KERN_WARNING "cio: Invalid cio_ignore parameter '%s'\n", sav);
        return 1;
 }
 
@@ -166,22 +166,19 @@ blacklist_parse_parameters (char *str, range_action action)
                                        continue;
                        }
                        if (*str == '-') {
-                               printk(KERN_WARNING "invalid cio_ignore "
+                               printk(KERN_WARNING "cio: invalid cio_ignore "
                                        "parameter '%s'\n",
                                        strsep(&str, ",\n"));
                                continue;
                        }
                        if ((from_id0 != to_id0) ||
                            (from_ssid != to_ssid)) {
-                               printk(KERN_WARNING "invalid cio_ignore range "
-                                       "%x.%x.%04x-%x.%x.%04x\n",
-                                       from_id0, from_ssid, from,
-                                       to_id0, to_ssid, to);
+                               printk(KERN_WARNING "cio: invalid cio_ignore "
+                                      "range %x.%x.%04x-%x.%x.%04x\n",
+                                      from_id0, from_ssid, from,
+                                      to_id0, to_ssid, to);
                                continue;
                        }
-                       pr_debug("blacklist_setup: adding range "
-                                "from %x.%x.%04x to %x.%x.%04x\n",
-                                from_id0, from_ssid, from, to_id0, to_ssid, to);
                        blacklist_range (ra, from, to, to_ssid);
                }
        }
@@ -239,7 +236,7 @@ blacklist_parse_proc_parameters (char *buf)
                 */
                blacklist_parse_parameters (buf + 4, add);
        } else {
-               printk (KERN_WARNING "cio_ignore: Parse error; \n"
+               printk (KERN_WARNING "cio: cio_ignore: Parse error; \n"
                        KERN_WARNING "try using 'free all|<devno-range>,"
                                     "<devno-range>,...'\n"
                        KERN_WARNING "or 'add <devno-range>,"
index e5ccda63e883a2cac7c9c277bcda9ac7b12e05f5..b0a18f5176aa3e07ecde788944f4061d1f0974d6 100644 (file)
@@ -359,7 +359,6 @@ ccwgroup_probe (struct device *dev)
        if ((ret = device_create_file(dev, &dev_attr_online)))
                return ret;
 
-       pr_debug("%s: device %s\n", __func__, gdev->dev.bus_id);
        ret = gdrv->probe ? gdrv->probe(gdev) : -ENODEV;
        if (ret)
                device_remove_file(dev, &dev_attr_online);
@@ -376,8 +375,6 @@ ccwgroup_remove (struct device *dev)
        gdev = to_ccwgroupdev(dev);
        gdrv = to_ccwgroupdrv(dev->driver);
 
-       pr_debug("%s: device %s\n", __func__, gdev->dev.bus_id);
-
        device_remove_file(dev, &dev_attr_online);
 
        if (gdrv && gdrv->remove)
index b57d93d986c0fa9fc6bf6a8cf4923542899207e5..920dd71e643457fbf541842f07e380e5a80cd407 100644 (file)
@@ -121,14 +121,8 @@ static int s390_vary_chpid(struct chp_id chpid, int on)
        CIO_TRACE_EVENT( 2, dbf_text);
 
        status = chp_get_status(chpid);
-       if (status < 0) {
-               printk(KERN_ERR "Can't vary unknown chpid %x.%02x\n",
-                      chpid.cssid, chpid.id);
-               return -EINVAL;
-       }
-
        if (!on && !status) {
-               printk(KERN_ERR "chpid %x.%02x is already offline\n",
+               printk(KERN_ERR "cio: chpid %x.%02x is already offline\n",
                       chpid.cssid, chpid.id);
                return -EINVAL;
        }
@@ -421,21 +415,14 @@ int chp_new(struct chp_id chpid)
                if (ret)
                        goto out_free;
        } else {
-               static int msg_done;
-
-               if (!msg_done) {
-                       printk(KERN_WARNING "cio: Channel measurements not "
-                              "available, continuing.\n");
-                       msg_done = 1;
-               }
                chp->cmg = -1;
        }
 
        /* make it known to the system */
        ret = device_register(&chp->dev);
        if (ret) {
-               printk(KERN_WARNING "%s: could not register %x.%02x\n",
-                      __func__, chpid.cssid, chpid.id);
+               CIO_MSG_EVENT(0, "Could not register chp%x.%02x: %d\n",
+                             chpid.cssid, chpid.id, ret);
                goto out_free;
        }
        ret = sysfs_create_group(&chp->dev.kobj, &chp_attr_group);
index ea92ac4d657709620b3d60a5d3bfddc276ec86ec..597c0c76a2adcaf12cc228465b6f363a8a528626 100644 (file)
@@ -990,16 +990,20 @@ out:
        return ret;
 }
 
-static int __init
-chsc_alloc_sei_area(void)
+int __init chsc_alloc_sei_area(void)
 {
        sei_page = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
        if (!sei_page)
-               printk(KERN_WARNING"Can't allocate page for processing of " \
-                      "chsc machine checks!\n");
+               CIO_MSG_EVENT(0, "Can't allocate page for processing of "
+                             "chsc machine checks!\n");
        return (sei_page ? 0 : -ENOMEM);
 }
 
+void __init chsc_free_sei_area(void)
+{
+       kfree(sei_page);
+}
+
 int __init
 chsc_enable_facility(int operation_code)
 {
@@ -1051,8 +1055,6 @@ chsc_enable_facility(int operation_code)
        return ret;
 }
 
-subsys_initcall(chsc_alloc_sei_area);
-
 struct css_general_char css_general_characteristics;
 struct css_chsc_char css_chsc_characteristics;
 
@@ -1073,8 +1075,8 @@ chsc_determine_css_characteristics(void)
 
        scsc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
        if (!scsc_area) {
-               printk(KERN_WARNING"cio: Was not able to determine available" \
-                      "CHSCs due to no memory.\n");
+               CIO_MSG_EVENT(0, "Was not able to determine available"
+                             "CHSCs due to no memory.\n");
                return -ENOMEM;
        }
 
@@ -1083,15 +1085,15 @@ chsc_determine_css_characteristics(void)
 
        result = chsc(scsc_area);
        if (result) {
-               printk(KERN_WARNING"cio: Was not able to determine " \
-                      "available CHSCs, cc=%i.\n", result);
+               CIO_MSG_EVENT(0, "Was not able to determine available CHSCs, "
+                             "cc=%i.\n", result);
                result = -EIO;
                goto exit;
        }
 
        if (scsc_area->response.code != 1) {
-               printk(KERN_WARNING"cio: Was not able to determine " \
-                      "available CHSCs.\n");
+               CIO_MSG_EVENT(0, "Was not able to determine "
+                             "available CHSCs.\n");
                result = -EIO;
                goto exit;
        }
index 2ad81d11cf7bfa564bdebe1d65085f0e054e3f7f..d1f5db1e69b94d6eee24aef06351fdb515abc1e4 100644 (file)
@@ -79,6 +79,8 @@ extern int chsc_get_ssd_info(struct subchannel_id schid,
                             struct chsc_ssd_info *ssd);
 extern int chsc_determine_css_characteristics(void);
 extern int css_characteristics_avail;
+extern int chsc_alloc_sei_area(void);
+extern void chsc_free_sei_area(void);
 
 extern int chsc_enable_facility(int);
 struct channel_subsystem;
index ea1defba5693af2f7533d387b1aa54d1f0b3a5f2..f2708d65be5a1d8bb14cedb874b950f21859f5f8 100644 (file)
@@ -47,8 +47,8 @@ cio_setup (char *parm)
        else if (!strcmp (parm, "no"))
                cio_show_msg = 0;
        else
-               printk (KERN_ERR "cio_setup : invalid cio_msg parameter '%s'",
-                       parm);
+               printk(KERN_ERR "cio: cio_setup: "
+                      "invalid cio_msg parameter '%s'", parm);
        return 1;
 }
 
@@ -80,7 +80,6 @@ cio_debug_init (void)
                goto out_unregister;
        debug_register_view (cio_debug_crw_id, &debug_sprintf_view);
        debug_set_level (cio_debug_crw_id, 2);
-       pr_debug("debugging initialized\n");
        return 0;
 
 out_unregister:
@@ -90,7 +89,7 @@ out_unregister:
                debug_unregister (cio_debug_trace_id);
        if (cio_debug_crw_id)
                debug_unregister (cio_debug_crw_id);
-       pr_debug("could not initialize debugging\n");
+       printk(KERN_WARNING"cio: could not initialize debugging\n");
        return -1;
 }
 
@@ -568,7 +567,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid)
         */
        if (sch->st != 0) {
                CIO_DEBUG(KERN_INFO, 0,
-                         "Subchannel 0.%x.%04x reports "
+                         "cio: Subchannel 0.%x.%04x reports "
                          "non-I/O subchannel type %04X\n",
                          sch->schid.ssid, sch->schid.sch_no, sch->st);
                /* We stop here for non-io subchannels. */
@@ -601,7 +600,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid)
        sch->lpm = sch->schib.pmcw.pam & sch->opm;
 
        CIO_DEBUG(KERN_INFO, 0,
-                 "Detected device %04x on subchannel 0.%x.%04X"
+                 "cio: Detected device %04x on subchannel 0.%x.%04X"
                  " - PIM = %02X, PAM = %02X, POM = %02X\n",
                  sch->schib.pmcw.dev, sch->schid.ssid,
                  sch->schid.sch_no, sch->schib.pmcw.pim,
@@ -766,7 +765,7 @@ cio_get_console_sch_no(void)
                /* unlike in 2.4, we cannot autoprobe here, since
                 * the channel subsystem is not fully initialized.
                 * With some luck, the HWC console can take over */
-               printk(KERN_WARNING "No ccw console found!\n");
+               printk(KERN_WARNING "cio: No ccw console found!\n");
                return -1;
        }
        return console_irq;
index f88844adae1ba432e58e8f1d3744415062dab1e7..c9bf8989930ff9d3c4fa1b08b1c95513997cf906 100644 (file)
@@ -23,6 +23,8 @@ extern debug_info_t *cio_debug_crw_id;
 static inline void
 CIO_HEX_EVENT(int level, void *data, int length)
 {
+       if (unlikely(!cio_debug_trace_id))
+               return;
        while (length > 0) {
                debug_event(cio_debug_trace_id, level, data, length);
                length -= cio_debug_trace_id->buf_size;
index 28abd697be1ace37a94e318efa4dcb96e01c56de..02fd00b55e1b0cb50ecb617114e8d927052c4f58 100644 (file)
@@ -1185,12 +1185,12 @@ static ssize_t cmb_enable_store(struct device *dev, struct device_attribute *att
        case '0':
                ret = disable_cmf(cdev);
                if (ret)
-                       printk(KERN_INFO "disable_cmf failed (%d)\n", ret);
+                       dev_info(&cdev->dev, "disable_cmf failed (%d)\n", ret);
                break;
        case '1':
                ret = enable_cmf(cdev);
                if (ret && ret != -EBUSY)
-                       printk(KERN_INFO "enable_cmf failed (%d)\n", ret);
+                       dev_info(&cdev->dev, "enable_cmf failed (%d)\n", ret);
                break;
        }
 
@@ -1280,10 +1280,10 @@ init_cmf(void)
                format_string = "basic";
                cmbops = &cmbops_basic;
                if (cmb_area.num_channels > 4096 || cmb_area.num_channels < 1) {
-                       printk(KERN_ERR "Basic channel measurement facility"
-                                       " can only use 1 to 4096 devices\n"
+                       printk(KERN_ERR "cio: Basic channel measurement "
+                              "facility can only use 1 to 4096 devices\n"
                               KERN_ERR "when the cmf driver is built"
-                                       " as a loadable module\n");
+                              " as a loadable module\n");
                        return 1;
                }
                break;
@@ -1292,13 +1292,13 @@ init_cmf(void)
                cmbops = &cmbops_extended;
                break;
        default:
-               printk(KERN_ERR "Invalid format %d for channel "
+               printk(KERN_ERR "cio: Invalid format %d for channel "
                        "measurement facility\n", format);
                return 1;
        }
 
-       printk(KERN_INFO "Channel measurement facility using %s format (%s)\n",
-               format_string, detect_string);
+       printk(KERN_INFO "cio: Channel measurement facility using %s "
+              "format (%s)\n", format_string, detect_string);
        return 0;
 }
 
index dfca0ef139fdc374cddc8bb0ef452b24a10ccd78..1c27a5a06b4982d6f754484f52ad4187b8f9162d 100644 (file)
@@ -109,7 +109,7 @@ css_subchannel_release(struct device *dev)
        }
 }
 
-int css_sch_device_register(struct subchannel *sch)
+static int css_sch_device_register(struct subchannel *sch)
 {
        int ret;
 
@@ -184,8 +184,8 @@ static int css_register_subchannel(struct subchannel *sch)
        /* make it known to the system */
        ret = css_sch_device_register(sch);
        if (ret) {
-               printk (KERN_WARNING "%s: could not register %s\n",
-                       __func__, sch->dev.bus_id);
+               CIO_MSG_EVENT(0, "Could not register sch 0.%x.%04x: %d\n",
+                             sch->schid.ssid, sch->schid.sch_no, ret);
                return ret;
        }
        return ret;
@@ -371,15 +371,12 @@ static int __init slow_subchannel_init(void)
        spin_lock_init(&slow_subchannel_lock);
        slow_subchannel_set = idset_sch_new();
        if (!slow_subchannel_set) {
-               printk(KERN_WARNING "cio: could not allocate slow subchannel "
-                      "set\n");
+               CIO_MSG_EVENT(0, "could not allocate slow subchannel set\n");
                return -ENOMEM;
        }
        return 0;
 }
 
-subsys_initcall(slow_subchannel_init);
-
 static void css_slow_path_func(struct work_struct *unused)
 {
        struct subchannel_id schid;
@@ -425,8 +422,8 @@ static int reprobe_subchannel(struct subchannel_id schid, void *data)
        struct subchannel *sch;
        int ret;
 
-       CIO_DEBUG(KERN_INFO, 6, "cio: reprobe 0.%x.%04x\n",
-                 schid.ssid, schid.sch_no);
+       CIO_MSG_EVENT(6, "cio: reprobe 0.%x.%04x\n",
+                     schid.ssid, schid.sch_no);
        if (need_reprobe)
                return -EAGAIN;
 
@@ -642,9 +639,20 @@ init_channel_subsystem (void)
 {
        int ret, i;
 
-       if (chsc_determine_css_characteristics() == 0)
+       ret = chsc_determine_css_characteristics();
+       if (ret == -ENOMEM)
+               goto out; /* No need to continue. */
+       if (ret == 0)
                css_characteristics_avail = 1;
 
+       ret = chsc_alloc_sei_area();
+       if (ret)
+               goto out;
+
+       ret = slow_subchannel_init();
+       if (ret)
+               goto out;
+
        if ((ret = bus_register(&css_bus_type)))
                goto out;
 
@@ -710,6 +718,10 @@ out_unregister:
 out_bus:
        bus_unregister(&css_bus_type);
 out:
+       chsc_free_sei_area();
+       kfree(slow_subchannel_set);
+       printk(KERN_WARNING"cio: failed to initialize css driver (%d)!\n",
+              ret);
        return ret;
 }
 
index ed7977531c3f8a14d9e345f86130107e1e582442..5d65e83ca66e818428ccf003b2f2a4ddc4e5b365 100644 (file)
@@ -139,7 +139,6 @@ struct css_driver {
  */
 extern struct bus_type css_bus_type;
 
-extern int css_sch_device_register(struct subchannel *);
 extern void css_sch_device_unregister(struct subchannel *);
 extern struct subchannel * get_subchannel_by_schid(struct subchannel_id);
 extern int css_init_done;
index 001682e70f672dc1be7e73e4da5918eb708427ff..297659fa0e26c80bd077092a12909b559f233f3e 100644 (file)
@@ -338,15 +338,20 @@ ccw_device_remove_disconnected(struct ccw_device *cdev)
                rc = device_schedule_callback(&cdev->dev,
                                              ccw_device_remove_orphan_cb);
                if (rc)
-                       dev_info(&cdev->dev, "Couldn't unregister orphan\n");
+                       CIO_MSG_EVENT(2, "Couldn't unregister orphan "
+                                     "0.%x.%04x\n",
+                                     cdev->private->dev_id.ssid,
+                                     cdev->private->dev_id.devno);
                return;
        }
        /* Deregister subchannel, which will kill the ccw device. */
        rc = device_schedule_callback(cdev->dev.parent,
                                      ccw_device_remove_sch_cb);
        if (rc)
-               dev_info(&cdev->dev,
-                        "Couldn't unregister disconnected device\n");
+               CIO_MSG_EVENT(2, "Couldn't unregister disconnected device "
+                             "0.%x.%04x\n",
+                             cdev->private->dev_id.ssid,
+                             cdev->private->dev_id.devno);
 }
 
 int
@@ -379,8 +384,10 @@ ccw_device_set_offline(struct ccw_device *cdev)
        if (ret == 0)
                wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
        else {
-               pr_debug("ccw_device_offline returned %d, device %s\n",
-                        ret, cdev->dev.bus_id);
+               CIO_MSG_EVENT(2, "ccw_device_offline returned %d, "
+                             "device 0.%x.%04x\n",
+                             ret, cdev->private->dev_id.ssid,
+                             cdev->private->dev_id.devno);
                cdev->online = 1;
        }
        return ret;
@@ -402,8 +409,10 @@ ccw_device_set_online(struct ccw_device *cdev)
        if (ret == 0)
                wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
        else {
-               pr_debug("ccw_device_online returned %d, device %s\n",
-                        ret, cdev->dev.bus_id);
+               CIO_MSG_EVENT(2, "ccw_device_online returned %d, "
+                             "device 0.%x.%04x\n",
+                             ret, cdev->private->dev_id.ssid,
+                             cdev->private->dev_id.devno);
                return ret;
        }
        if (cdev->private->state != DEV_STATE_ONLINE)
@@ -417,9 +426,11 @@ ccw_device_set_online(struct ccw_device *cdev)
        spin_unlock_irq(cdev->ccwlock);
        if (ret == 0)
                wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
-       else 
-               pr_debug("ccw_device_offline returned %d, device %s\n",
-                        ret, cdev->dev.bus_id);
+       else
+               CIO_MSG_EVENT(2, "ccw_device_offline returned %d, "
+                             "device 0.%x.%04x\n",
+                             ret, cdev->private->dev_id.ssid,
+                             cdev->private->dev_id.devno);
        return (ret == 0) ? -ENODEV : ret;
 }
 
@@ -439,9 +450,10 @@ static int online_store_recog_and_online(struct ccw_device *cdev)
        if (cdev->id.cu_type == 0) {
                ret = ccw_device_recognition(cdev);
                if (ret) {
-                       printk(KERN_WARNING"Couldn't start recognition "
-                              "for device %s (ret=%d)\n",
-                              cdev->dev.bus_id, ret);
+                       CIO_MSG_EVENT(0, "Couldn't start recognition "
+                                     "for device 0.%x.%04x (ret=%d)\n",
+                                     cdev->private->dev_id.ssid,
+                                     cdev->private->dev_id.devno, ret);
                        return ret;
                }
                wait_event(cdev->private->wait_q,
@@ -461,8 +473,8 @@ static void online_store_handle_online(struct ccw_device *cdev, int force)
        if (force && cdev->private->state == DEV_STATE_BOXED) {
                ret = ccw_device_stlck(cdev);
                if (ret) {
-                       printk(KERN_WARNING"ccw_device_stlck for device %s "
-                              "returned %d!\n", cdev->dev.bus_id, ret);
+                       dev_warn(&cdev->dev,
+                                "ccw_device_stlck returned %d!\n", ret);
                        return;
                }
                if (cdev->id.cu_type == 0)
@@ -893,8 +905,10 @@ io_subchannel_register(struct work_struct *work)
                        ret = device_reprobe(&cdev->dev);
                        if (ret)
                                /* We can't do much here. */
-                               dev_info(&cdev->dev, "device_reprobe() returned"
-                                        " %d\n", ret);
+                               CIO_MSG_EVENT(2, "device_reprobe() returned"
+                                             " %d for 0.%x.%04x\n", ret,
+                                             cdev->private->dev_id.ssid,
+                                             cdev->private->dev_id.devno);
                }
                goto out;
        }
@@ -907,8 +921,9 @@ io_subchannel_register(struct work_struct *work)
        /* make it known to the system */
        ret = ccw_device_register(cdev);
        if (ret) {
-               printk (KERN_WARNING "%s: could not register %s\n",
-                       __func__, cdev->dev.bus_id);
+               CIO_MSG_EVENT(0, "Could not register ccw dev 0.%x.%04x: %d\n",
+                             cdev->private->dev_id.ssid,
+                             cdev->private->dev_id.devno, ret);
                put_device(&cdev->dev);
                spin_lock_irqsave(sch->lock, flags);
                sch->dev.driver_data = NULL;
@@ -1361,7 +1376,6 @@ ccw_device_remove (struct device *dev)
        struct ccw_driver *cdrv = cdev->drv;
        int ret;
 
-       pr_debug("removing device %s\n", cdev->dev.bus_id);
        if (cdrv->remove)
                cdrv->remove(cdev);
        if (cdev->online) {
@@ -1374,8 +1388,10 @@ ccw_device_remove (struct device *dev)
                                   dev_fsm_final_state(cdev));
                else
                        //FIXME: we can't fail!
-                       pr_debug("ccw_device_offline returned %d, device %s\n",
-                                ret, cdev->dev.bus_id);
+                       CIO_MSG_EVENT(2, "ccw_device_offline returned %d, "
+                                     "device 0.%x.%04x\n",
+                                     ret, cdev->private->dev_id.ssid,
+                                     cdev->private->dev_id.devno);
        }
        ccw_device_set_timeout(cdev, 0);
        cdev->drv = NULL;
index 6bba809295772702bf3637bd6b263cb2a415a22b..8633dc537695db3a99a03d35e462133fca0fa829 100644 (file)
@@ -268,7 +268,7 @@ ccw_device_recog_done(struct ccw_device *cdev, int state)
        switch (state) {
        case DEV_STATE_NOT_OPER:
                CIO_DEBUG(KERN_WARNING, 2,
-                         "SenseID : unknown device %04x on subchannel "
+                         "cio: SenseID : unknown device %04x on subchannel "
                          "0.%x.%04x\n", cdev->private->dev_id.devno,
                          sch->schid.ssid, sch->schid.sch_no);
                break;
@@ -293,7 +293,8 @@ ccw_device_recog_done(struct ccw_device *cdev, int state)
                        return;
                }
                /* Issue device info message. */
-               CIO_DEBUG(KERN_INFO, 2, "SenseID : device 0.%x.%04x reports: "
+               CIO_DEBUG(KERN_INFO, 2,
+                         "cio: SenseID : device 0.%x.%04x reports: "
                          "CU  Type/Mod = %04X/%02X, Dev Type/Mod = "
                          "%04X/%02X\n",
                          cdev->private->dev_id.ssid,
@@ -303,7 +304,7 @@ ccw_device_recog_done(struct ccw_device *cdev, int state)
                break;
        case DEV_STATE_BOXED:
                CIO_DEBUG(KERN_WARNING, 2,
-                         "SenseID : boxed device %04x on subchannel "
+                         "cio: SenseID : boxed device %04x on subchannel "
                          "0.%x.%04x\n", cdev->private->dev_id.devno,
                          sch->schid.ssid, sch->schid.sch_no);
                break;
@@ -388,7 +389,7 @@ ccw_device_done(struct ccw_device *cdev, int state)
 
        if (state == DEV_STATE_BOXED)
                CIO_DEBUG(KERN_WARNING, 2,
-                         "Boxed device %04x on subchannel %04x\n",
+                         "cio: Boxed device %04x on subchannel %04x\n",
                          cdev->private->dev_id.devno, sch->schid.sch_no);
 
        if (cdev->private->flags.donotify) {
@@ -946,9 +947,10 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event)
                        /* Basic sense hasn't started. Try again. */
                        ccw_device_do_sense(cdev, irb);
                else {
-                       printk(KERN_INFO "Huh? %s(%s): unsolicited "
-                              "interrupt...\n",
-                              __FUNCTION__, cdev->dev.bus_id);
+                       CIO_MSG_EVENT(2, "Huh? 0.%x.%04x: unsolicited "
+                                     "interrupt during w4sense...\n",
+                                     cdev->private->dev_id.ssid,
+                                     cdev->private->dev_id.devno);
                        if (cdev->handler)
                                cdev->handler (cdev, 0, irb);
                }
@@ -1215,8 +1217,8 @@ ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event)
 static void
 ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event)
 {
-       printk(KERN_EMERG "dev_jumptable[%i][%i] == NULL\n",
-              cdev->private->state, dev_event);
+       CIO_MSG_EVENT(0, "dev_jumptable[%i][%i] == NULL\n",
+                     cdev->private->state, dev_event);
        BUG();
 }
 
index a5d263fb55ae1722ff0aced679d55df0978e7546..14eba854b1556e8bad206828105ea8c5974aeb24 100644 (file)
@@ -288,253 +288,6 @@ ccw_device_get_path_mask(struct ccw_device *cdev)
                return sch->lpm;
 }
 
-static void
-ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb)
-{
-       if (!ip)
-               /* unsolicited interrupt */
-               return;
-
-       /* Abuse intparm for error reporting. */
-       if (IS_ERR(irb))
-               cdev->private->intparm = -EIO;
-       else if (irb->scsw.cc == 1)
-               /* Retry for deferred condition code. */
-               cdev->private->intparm = -EAGAIN;
-       else if ((irb->scsw.dstat !=
-                 (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) ||
-                (irb->scsw.cstat != 0)) {
-               /*
-                * We didn't get channel end / device end. Check if path
-                * verification has been started; we can retry after it has
-                * finished. We also retry unit checks except for command reject
-                * or intervention required. Also check for long busy
-                * conditions.
-                */
-                if (cdev->private->flags.doverify ||
-                        cdev->private->state == DEV_STATE_VERIFY)
-                        cdev->private->intparm = -EAGAIN;
-               else if ((irb->scsw.dstat & DEV_STAT_UNIT_CHECK) &&
-                        !(irb->ecw[0] &
-                          (SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ)))
-                       cdev->private->intparm = -EAGAIN;
-               else if ((irb->scsw.dstat & DEV_STAT_ATTENTION) &&
-                        (irb->scsw.dstat & DEV_STAT_DEV_END) &&
-                        (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP))
-                       cdev->private->intparm = -EAGAIN;
-                else
-                        cdev->private->intparm = -EIO;
-                        
-       } else
-               cdev->private->intparm = 0;
-       wake_up(&cdev->private->wait_q);
-}
-
-static int
-__ccw_device_retry_loop(struct ccw_device *cdev, struct ccw1 *ccw, long magic, __u8 lpm)
-{
-       int ret;
-       struct subchannel *sch;
-
-       sch = to_subchannel(cdev->dev.parent);
-       do {
-               ccw_device_set_timeout(cdev, 60 * HZ);
-               ret = cio_start (sch, ccw, lpm);
-               if (ret != 0)
-                       ccw_device_set_timeout(cdev, 0);
-               if (ret == -EBUSY) {
-                       /* Try again later. */
-                       spin_unlock_irq(sch->lock);
-                       msleep(10);
-                       spin_lock_irq(sch->lock);
-                       continue;
-               }
-               if (ret != 0)
-                       /* Non-retryable error. */
-                       break;
-               /* Wait for end of request. */
-               cdev->private->intparm = magic;
-               spin_unlock_irq(sch->lock);
-               wait_event(cdev->private->wait_q,
-                          (cdev->private->intparm == -EIO) ||
-                          (cdev->private->intparm == -EAGAIN) ||
-                          (cdev->private->intparm == 0));
-               spin_lock_irq(sch->lock);
-               /* Check at least for channel end / device end */
-               if (cdev->private->intparm == -EIO) {
-                       /* Non-retryable error. */
-                       ret = -EIO;
-                       break;
-               }
-               if (cdev->private->intparm == 0)
-                       /* Success. */
-                       break;
-               /* Try again later. */
-               spin_unlock_irq(sch->lock);
-               msleep(10);
-               spin_lock_irq(sch->lock);
-       } while (1);
-
-       return ret;
-}
-
-/**
- * read_dev_chars() - read device characteristics
- * @param cdev   target ccw device
- * @param buffer pointer to buffer for rdc data
- * @param length size of rdc data
- * @returns 0 for success, negative error value on failure
- *
- * Context:
- *   called for online device, lock not held
- **/
-int
-read_dev_chars (struct ccw_device *cdev, void **buffer, int length)
-{
-       void (*handler)(struct ccw_device *, unsigned long, struct irb *);
-       struct subchannel *sch;
-       int ret;
-       struct ccw1 *rdc_ccw;
-
-       if (!cdev)
-               return -ENODEV;
-       if (!buffer || !length)
-               return -EINVAL;
-       sch = to_subchannel(cdev->dev.parent);
-
-       CIO_TRACE_EVENT (4, "rddevch");
-       CIO_TRACE_EVENT (4, sch->dev.bus_id);
-
-       rdc_ccw = kzalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA);
-       if (!rdc_ccw)
-               return -ENOMEM;
-       rdc_ccw->cmd_code = CCW_CMD_RDC;
-       rdc_ccw->count = length;
-       rdc_ccw->flags = CCW_FLAG_SLI;
-       ret = set_normalized_cda (rdc_ccw, (*buffer));
-       if (ret != 0) {
-               kfree(rdc_ccw);
-               return ret;
-       }
-
-       spin_lock_irq(sch->lock);
-       /* Save interrupt handler. */
-       handler = cdev->handler;
-       /* Temporarily install own handler. */
-       cdev->handler = ccw_device_wake_up;
-       if (cdev->private->state != DEV_STATE_ONLINE)
-               ret = -ENODEV;
-       else if (((sch->schib.scsw.stctl & SCSW_STCTL_PRIM_STATUS) &&
-                 !(sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)) ||
-                cdev->private->flags.doverify)
-               ret = -EBUSY;
-       else
-               /* 0x00D9C4C3 == ebcdic "RDC" */
-               ret = __ccw_device_retry_loop(cdev, rdc_ccw, 0x00D9C4C3, 0);
-
-       /* Restore interrupt handler. */
-       cdev->handler = handler;
-       spin_unlock_irq(sch->lock);
-
-       clear_normalized_cda (rdc_ccw);
-       kfree(rdc_ccw);
-
-       return ret;
-}
-
-/*
- *  Read Configuration data using path mask
- */
-int
-read_conf_data_lpm (struct ccw_device *cdev, void **buffer, int *length, __u8 lpm)
-{
-       void (*handler)(struct ccw_device *, unsigned long, struct irb *);
-       struct subchannel *sch;
-       struct ciw *ciw;
-       char *rcd_buf;
-       int ret;
-       struct ccw1 *rcd_ccw;
-
-       if (!cdev)
-               return -ENODEV;
-       if (!buffer || !length)
-               return -EINVAL;
-       sch = to_subchannel(cdev->dev.parent);
-
-       CIO_TRACE_EVENT (4, "rdconf");
-       CIO_TRACE_EVENT (4, sch->dev.bus_id);
-
-       /*
-        * scan for RCD command in extended SenseID data
-        */
-       ciw = ccw_device_get_ciw(cdev, CIW_TYPE_RCD);
-       if (!ciw || ciw->cmd == 0)
-               return -EOPNOTSUPP;
-
-       /* Adjust requested path mask to excluded varied off paths. */
-       if (lpm) {
-               lpm &= sch->opm;
-               if (lpm == 0)
-                       return -EACCES;
-       }
-
-       rcd_ccw = kzalloc(sizeof(struct ccw1), GFP_KERNEL | GFP_DMA);
-       if (!rcd_ccw)
-               return -ENOMEM;
-       rcd_buf = kzalloc(ciw->count, GFP_KERNEL | GFP_DMA);
-       if (!rcd_buf) {
-               kfree(rcd_ccw);
-               return -ENOMEM;
-       }
-       rcd_ccw->cmd_code = ciw->cmd;
-       rcd_ccw->cda = (__u32) __pa (rcd_buf);
-       rcd_ccw->count = ciw->count;
-       rcd_ccw->flags = CCW_FLAG_SLI;
-
-       spin_lock_irq(sch->lock);
-       /* Save interrupt handler. */
-       handler = cdev->handler;
-       /* Temporarily install own handler. */
-       cdev->handler = ccw_device_wake_up;
-       if (cdev->private->state != DEV_STATE_ONLINE)
-               ret = -ENODEV;
-       else if (((sch->schib.scsw.stctl & SCSW_STCTL_PRIM_STATUS) &&
-                 !(sch->schib.scsw.stctl & SCSW_STCTL_SEC_STATUS)) ||
-                cdev->private->flags.doverify)
-               ret = -EBUSY;
-       else
-               /* 0x00D9C3C4 == ebcdic "RCD" */
-               ret = __ccw_device_retry_loop(cdev, rcd_ccw, 0x00D9C3C4, lpm);
-
-       /* Restore interrupt handler. */
-       cdev->handler = handler;
-       spin_unlock_irq(sch->lock);
-
-       /*
-        * on success we update the user input parms
-        */
-       if (ret) {
-               kfree (rcd_buf);
-               *buffer = NULL;
-               *length = 0;
-       } else {
-               *length = ciw->count;
-               *buffer = rcd_buf;
-       }
-       kfree(rcd_ccw);
-
-       return ret;
-}
-
-/*
- *  Read Configuration data
- */
-int
-read_conf_data (struct ccw_device *cdev, void **buffer, int *length)
-{
-       return read_conf_data_lpm (cdev, buffer, length, 0);
-}
-
 /*
  * Try to break the lock on a boxed device.
  */
@@ -635,12 +388,6 @@ _ccw_device_get_subchannel_number(struct ccw_device *cdev)
        return cdev->private->schid.sch_no;
 }
 
-int
-_ccw_device_get_device_number(struct ccw_device *cdev)
-{
-       return cdev->private->dev_id.devno;
-}
-
 
 MODULE_LICENSE("GPL");
 EXPORT_SYMBOL(ccw_device_set_options_mask);
@@ -655,9 +402,5 @@ EXPORT_SYMBOL(ccw_device_start_timeout_key);
 EXPORT_SYMBOL(ccw_device_start_key);
 EXPORT_SYMBOL(ccw_device_get_ciw);
 EXPORT_SYMBOL(ccw_device_get_path_mask);
-EXPORT_SYMBOL(read_conf_data);
-EXPORT_SYMBOL(read_dev_chars);
 EXPORT_SYMBOL(_ccw_device_get_subchannel_number);
-EXPORT_SYMBOL(_ccw_device_get_device_number);
 EXPORT_SYMBOL_GPL(ccw_device_get_chp_desc);
-EXPORT_SYMBOL_GPL(read_conf_data_lpm);
index 2553629ec15db76dc364ec7cee2373783cdfe6e4..c37d7c2587ff923ad0129a3b145f1a542f150ddf 100644 (file)
@@ -210,6 +210,10 @@ static void __init walk_children(struct device_node *dp, struct sbus_dev *parent
 
                        sdev->bus = sbus;
                        sdev->parent = parent;
+                       sdev->ofdev.dev.archdata.iommu =
+                               sbus->ofdev.dev.archdata.iommu;
+                       sdev->ofdev.dev.archdata.stc =
+                               sbus->ofdev.dev.archdata.stc;
 
                        fill_sbus_device(dp, sdev);
 
@@ -269,6 +273,11 @@ static void __init build_one_sbus(struct device_node *dp, int num_sbus)
 
                        sdev->bus = sbus;
                        sdev->parent = NULL;
+                       sdev->ofdev.dev.archdata.iommu =
+                               sbus->ofdev.dev.archdata.iommu;
+                       sdev->ofdev.dev.archdata.stc =
+                               sbus->ofdev.dev.archdata.stc;
+
                        fill_sbus_device(dev_dp, sdev);
 
                        walk_children(dev_dp, sdev, sbus);
index a26baab09dbfb8e7edde8a99c02c8a8f291c17da..6800e578e4b1f82dc2a9b4763588497f2835fe63 100644 (file)
@@ -194,8 +194,7 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
        struct scsi_device *device;
 
        if (unlikely(!scsicmd || !scsicmd->scsi_done )) {
-               dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"))
-;
+               dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
                 aac_fib_complete(fibptr);
                 aac_fib_free(fibptr);
                 return 0;
@@ -1689,23 +1688,23 @@ static void synchronize_callback(void *context, struct fib *fibptr)
        if (!aac_valid_context(cmd, fibptr))
                return;
 
-       dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n", 
+       dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
                                smp_processor_id(), jiffies));
        BUG_ON(fibptr == NULL);
 
 
        synchronizereply = fib_data(fibptr);
        if (le32_to_cpu(synchronizereply->status) == CT_OK)
-               cmd->result = DID_OK << 16 | 
+               cmd->result = DID_OK << 16 |
                        COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
        else {
                struct scsi_device *sdev = cmd->device;
                struct aac_dev *dev = fibptr->dev;
                u32 cid = sdev_id(sdev);
-               printk(KERN_WARNING 
+               printk(KERN_WARNING
                     "synchronize_callback: synchronize failed, status = %d\n",
                     le32_to_cpu(synchronizereply->status));
-               cmd->result = DID_OK << 16 | 
+               cmd->result = DID_OK << 16 |
                        COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
                set_sense((u8 *)&dev->fsa_dev[cid].sense_data,
                                    HARDWARE_ERROR,
@@ -1713,7 +1712,7 @@ static void synchronize_callback(void *context, struct fib *fibptr)
                                    ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
                                    0, 0);
                memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
-                 min(sizeof(dev->fsa_dev[cid].sense_data), 
+                 min(sizeof(dev->fsa_dev[cid].sense_data),
                          sizeof(cmd->sense_buffer)));
        }
 
@@ -1731,6 +1730,9 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
        struct scsi_device *sdev = scsicmd->device;
        int active = 0;
        struct aac_dev *aac;
+       u64 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) |
+               (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
+       u32 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
        unsigned long flags;
 
        /*
@@ -1739,7 +1741,51 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
         */
        spin_lock_irqsave(&sdev->list_lock, flags);
        list_for_each_entry(cmd, &sdev->cmd_list, list)
-               if (cmd != scsicmd && cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
+               if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
+                       u64 cmnd_lba;
+                       u32 cmnd_count;
+
+                       if (cmd->cmnd[0] == WRITE_6) {
+                               cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) |
+                                       (cmd->cmnd[2] << 8) |
+                                       cmd->cmnd[3];
+                               cmnd_count = cmd->cmnd[4];
+                               if (cmnd_count == 0)
+                                       cmnd_count = 256;
+                       } else if (cmd->cmnd[0] == WRITE_16) {
+                               cmnd_lba = ((u64)cmd->cmnd[2] << 56) |
+                                       ((u64)cmd->cmnd[3] << 48) |
+                                       ((u64)cmd->cmnd[4] << 40) |
+                                       ((u64)cmd->cmnd[5] << 32) |
+                                       ((u64)cmd->cmnd[6] << 24) |
+                                       (cmd->cmnd[7] << 16) |
+                                       (cmd->cmnd[8] << 8) |
+                                       cmd->cmnd[9];
+                               cmnd_count = (cmd->cmnd[10] << 24) |
+                                       (cmd->cmnd[11] << 16) |
+                                       (cmd->cmnd[12] << 8) |
+                                       cmd->cmnd[13];
+                       } else if (cmd->cmnd[0] == WRITE_12) {
+                               cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
+                                       (cmd->cmnd[3] << 16) |
+                                       (cmd->cmnd[4] << 8) |
+                                       cmd->cmnd[5];
+                               cmnd_count = (cmd->cmnd[6] << 24) |
+                                       (cmd->cmnd[7] << 16) |
+                                       (cmd->cmnd[8] << 8) |
+                                       cmd->cmnd[9];
+                       } else if (cmd->cmnd[0] == WRITE_10) {
+                               cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
+                                       (cmd->cmnd[3] << 16) |
+                                       (cmd->cmnd[4] << 8) |
+                                       cmd->cmnd[5];
+                               cmnd_count = (cmd->cmnd[7] << 8) |
+                                       cmd->cmnd[8];
+                       } else
+                               continue;
+                       if (((cmnd_lba + cmnd_count) < lba) ||
+                         (count && ((lba + count) < cmnd_lba)))
+                               continue;
                        ++active;
                        break;
                }
@@ -1768,7 +1814,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
        synchronizecmd->command = cpu_to_le32(VM_ContainerConfig);
        synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE);
        synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
-       synchronizecmd->count = 
+       synchronizecmd->count =
             cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
 
        /*
@@ -1790,7 +1836,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
                return 0;
        }
 
-       printk(KERN_WARNING 
+       printk(KERN_WARNING
                "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
        aac_fib_complete(cmd_fibcontext);
        aac_fib_free(cmd_fibcontext);
index 400d03403cd547d84415d05ebceaa267a2a5b7db..94727b9375ecafde6fc46a74c4b7188bfe63fb2c 100644 (file)
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 2447
+# define AAC_DRIVER_BUILD 2449
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS 32
@@ -1807,10 +1807,10 @@ struct aac_aifcmd {
  *     accounting for the fact capacity could be a 64 bit value
  *
  */
-static inline u32 cap_to_cyls(sector_t capacity, u32 divisor)
+static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor)
 {
        sector_div(capacity, divisor);
-       return (u32)capacity;
+       return capacity;
 }
 
 /* SCp.phase values */
index c709dc8ad99dee8e886d8b1bb4ac81749181733f..813556c60007de5c1e1afde58c721048b34fa58a 100644 (file)
@@ -826,7 +826,7 @@ static ssize_t aac_show_reset_adapter(struct class_device *class_dev,
        tmp = aac_adapter_check_health(dev);
        if ((tmp == 0) && dev->in_reset)
                tmp = -EBUSY;
-       len = snprintf(buf, PAGE_SIZE, "0x%x", tmp);
+       len = snprintf(buf, PAGE_SIZE, "0x%x\n", tmp);
        return len;
 }
 
@@ -1126,9 +1126,8 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
 static void aac_shutdown(struct pci_dev *dev)
 {
        struct Scsi_Host *shost = pci_get_drvdata(dev);
-       struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
        scsi_block_requests(shost);
-       __aac_shutdown(aac);
+       __aac_shutdown((struct aac_dev *)shost->hostdata);
 }
 
 static void __devexit aac_remove_one(struct pci_dev *pdev)
index a8ace56778137d2548831d253b9e6ee8c572fea8..c55f7c862f0e0889541af9c1825fef78a3179c05 100644 (file)
@@ -1,11 +1,10 @@
 /*
  *     Adaptec AAC series RAID controller driver
- *     (c) Copyright 2001 Red Hat Inc. <alan@redhat.com>
  *
  * based on the old aacraid driver that is..
  * Adaptec aacraid device driver for Linux.
  *
- * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
+ * Copyright (c) 2006-2007 Adaptec, Inc. (aacraid@adaptec.com)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9c5fcfb398c21052266ed8b57826e6f39e5a4a16..8cd6588a83e3be4c7b81e65af0073b899b3600dd 100644 (file)
@@ -5,7 +5,7 @@
  * based on the old aacraid driver that is..
  * Adaptec aacraid device driver for Linux.
  *
- * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
+ * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ebc65b9fea92903bd63301626515d97c83a78a5b..73eef3dc5dc629d0056a1e8ba2178a1205bc9f4e 100644 (file)
@@ -472,7 +472,7 @@ static int aac_rx_restart_adapter(struct aac_dev *dev, int bled)
                else {
                        bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
                          0, 0, 0, 0, 0, 0, &var, NULL, NULL, NULL, NULL);
-                       if (!bled && (var != 0x00000001))
+                       if (!bled && (var != 0x00000001) && (var != 0x3803000F))
                                bled = -EINVAL;
                }
                if (bled && (bled != -ETIMEDOUT))
index 2b6689709e53d6dfca3b3062c6ea88ad4db73b3e..79c0b6e37a3b92abe629101857f0364a046acfd6 100644 (file)
@@ -1,4 +1,4 @@
-#define ASC_VERSION "3.3K"    /* AdvanSys Driver Version */
+#define ASC_VERSION "3.3K"     /* AdvanSys Driver Version */
 
 /*
  * advansys.c - Linux Host Driver for AdvanSys SCSI Adapters
 #include <linux/pci.h>
 #endif /* CONFIG_PCI */
 
-
 /*
  * --- Driver Options
  */
 /* Enable driver tracing. */
 /* #define ADVANSYS_DEBUG */
 
-
-/*
- * --- Debugging Header
- */
-
-#ifdef ADVANSYS_DEBUG
-#define STATIC
-#else /* ADVANSYS_DEBUG */
-#define STATIC static
-#endif /* ADVANSYS_DEBUG */
-
-
 /*
  * --- Asc Library Constants and Macros
  */
  * are all consistent at 8, 16, and 32 bits respectively. Pointers
  * and long types are 64 bits on Alpha and UltraSPARC.
  */
-#define ASC_PADDR __u32         /* Physical/Bus address data type. */
-#define ASC_VADDR __u32         /* Virtual address data type. */
-#define ASC_DCNT  __u32         /* Unsigned Data count type. */
-#define ASC_SDCNT __s32         /* Signed Data count type. */
+#define ASC_PADDR __u32                /* Physical/Bus address data type. */
+#define ASC_VADDR __u32                /* Virtual address data type. */
+#define ASC_DCNT  __u32                /* Unsigned Data count type. */
+#define ASC_SDCNT __s32                /* Signed Data count type. */
 
 /*
  * These macros are used to convert a virtual address to a
@@ -911,7 +898,7 @@ typedef unsigned char uchar;
 #define CC_VERY_LONG_SG_LIST 0
 #define ASC_SRB2SCSIQ(srb_ptr)  (srb_ptr)
 
-#define PortAddr                 unsigned short    /* port address size  */
+#define PortAddr                 unsigned short        /* port address size  */
 #define inp(port)                inb(port)
 #define outp(port, byte)         outb((byte), (port))
 
@@ -1038,17 +1025,17 @@ typedef unsigned char uchar;
 #define ASC_INQ_CLOCKING(inq)       (((inq)->info & 0x0c) >> 2)
 
 typedef struct {
-    uchar               periph;
-    uchar               devtype;
-    uchar               ver;
-    uchar               byte3;
-    uchar               add_len;
-    uchar               res1;
-    uchar               res2;
-    uchar               flags;
-    uchar               vendor_id[8];
-    uchar               product_id[16];
-    uchar               product_rev_level[4];
+       uchar periph;
+       uchar devtype;
+       uchar ver;
+       uchar byte3;
+       uchar add_len;
+       uchar res1;
+       uchar res2;
+       uchar flags;
+       uchar vendor_id[8];
+       uchar product_id[16];
+       uchar product_rev_level[4];
 } ASC_SCSI_INQUIRY;
 
 #define ASC_SG_LIST_PER_Q   7
@@ -1165,139 +1152,139 @@ typedef struct {
 #define ASC_QNO_TO_QADDR(q_no)      ((ASC_QADR_BEG)+((int)(q_no) << 6))
 
 typedef struct asc_scsiq_1 {
-    uchar               status;
-    uchar               q_no;
-    uchar               cntl;
-    uchar               sg_queue_cnt;
-    uchar               target_id;
-    uchar               target_lun;
-    ASC_PADDR           data_addr;
-    ASC_DCNT            data_cnt;
-    ASC_PADDR           sense_addr;
-    uchar               sense_len;
-    uchar               extra_bytes;
+       uchar status;
+       uchar q_no;
+       uchar cntl;
+       uchar sg_queue_cnt;
+       uchar target_id;
+       uchar target_lun;
+       ASC_PADDR data_addr;
+       ASC_DCNT data_cnt;
+       ASC_PADDR sense_addr;
+       uchar sense_len;
+       uchar extra_bytes;
 } ASC_SCSIQ_1;
 
 typedef struct asc_scsiq_2 {
-    ASC_VADDR           srb_ptr;
-    uchar               target_ix;
-    uchar               flag;
-    uchar               cdb_len;
-    uchar               tag_code;
-    ushort              vm_id;
+       ASC_VADDR srb_ptr;
+       uchar target_ix;
+       uchar flag;
+       uchar cdb_len;
+       uchar tag_code;
+       ushort vm_id;
 } ASC_SCSIQ_2;
 
 typedef struct asc_scsiq_3 {
-    uchar               done_stat;
-    uchar               host_stat;
-    uchar               scsi_stat;
-    uchar               scsi_msg;
+       uchar done_stat;
+       uchar host_stat;
+       uchar scsi_stat;
+       uchar scsi_msg;
 } ASC_SCSIQ_3;
 
 typedef struct asc_scsiq_4 {
-    uchar               cdb[ASC_MAX_CDB_LEN];
-    uchar               y_first_sg_list_qp;
-    uchar               y_working_sg_qp;
-    uchar               y_working_sg_ix;
-    uchar               y_res;
-    ushort              x_req_count;
-    ushort              x_reconnect_rtn;
-    ASC_PADDR           x_saved_data_addr;
-    ASC_DCNT            x_saved_data_cnt;
+       uchar cdb[ASC_MAX_CDB_LEN];
+       uchar y_first_sg_list_qp;
+       uchar y_working_sg_qp;
+       uchar y_working_sg_ix;
+       uchar y_res;
+       ushort x_req_count;
+       ushort x_reconnect_rtn;
+       ASC_PADDR x_saved_data_addr;
+       ASC_DCNT x_saved_data_cnt;
 } ASC_SCSIQ_4;
 
 typedef struct asc_q_done_info {
-    ASC_SCSIQ_2         d2;
-    ASC_SCSIQ_3         d3;
-    uchar               q_status;
-    uchar               q_no;
-    uchar               cntl;
-    uchar               sense_len;
-    uchar               extra_bytes;
-    uchar               res;
-    ASC_DCNT            remain_bytes;
+       ASC_SCSIQ_2 d2;
+       ASC_SCSIQ_3 d3;
+       uchar q_status;
+       uchar q_no;
+       uchar cntl;
+       uchar sense_len;
+       uchar extra_bytes;
+       uchar res;
+       ASC_DCNT remain_bytes;
 } ASC_QDONE_INFO;
 
 typedef struct asc_sg_list {
-    ASC_PADDR           addr;
-    ASC_DCNT            bytes;
+       ASC_PADDR addr;
+       ASC_DCNT bytes;
 } ASC_SG_LIST;
 
 typedef struct asc_sg_head {
-    ushort              entry_cnt;
-    ushort              queue_cnt;
-    ushort              entry_to_copy;
-    ushort              res;
-    ASC_SG_LIST         sg_list[ASC_MAX_SG_LIST];
+       ushort entry_cnt;
+       ushort queue_cnt;
+       ushort entry_to_copy;
+       ushort res;
+       ASC_SG_LIST sg_list[ASC_MAX_SG_LIST];
 } ASC_SG_HEAD;
 
 #define ASC_MIN_SG_LIST   2
 
 typedef struct asc_min_sg_head {
-    ushort              entry_cnt;
-    ushort              queue_cnt;
-    ushort              entry_to_copy;
-    ushort              res;
-    ASC_SG_LIST         sg_list[ASC_MIN_SG_LIST];
+       ushort entry_cnt;
+       ushort queue_cnt;
+       ushort entry_to_copy;
+       ushort res;
+       ASC_SG_LIST sg_list[ASC_MIN_SG_LIST];
 } ASC_MIN_SG_HEAD;
 
 #define QCX_SORT        (0x0001)
 #define QCX_COALEASE    (0x0002)
 
 typedef struct asc_scsi_q {
-    ASC_SCSIQ_1         q1;
-    ASC_SCSIQ_2         q2;
-    uchar               *cdbptr;
-    ASC_SG_HEAD         *sg_head;
-    ushort              remain_sg_entry_cnt;
-    ushort              next_sg_index;
+       ASC_SCSIQ_1 q1;
+       ASC_SCSIQ_2 q2;
+       uchar *cdbptr;
+       ASC_SG_HEAD *sg_head;
+       ushort remain_sg_entry_cnt;
+       ushort next_sg_index;
 } ASC_SCSI_Q;
 
 typedef struct asc_scsi_req_q {
-    ASC_SCSIQ_1         r1;
-    ASC_SCSIQ_2         r2;
-    uchar               *cdbptr;
-    ASC_SG_HEAD         *sg_head;
-    uchar               *sense_ptr;
-    ASC_SCSIQ_3         r3;
-    uchar               cdb[ASC_MAX_CDB_LEN];
-    uchar               sense[ASC_MIN_SENSE_LEN];
+       ASC_SCSIQ_1 r1;
+       ASC_SCSIQ_2 r2;
+       uchar *cdbptr;
+       ASC_SG_HEAD *sg_head;
+       uchar *sense_ptr;
+       ASC_SCSIQ_3 r3;
+       uchar cdb[ASC_MAX_CDB_LEN];
+       uchar sense[ASC_MIN_SENSE_LEN];
 } ASC_SCSI_REQ_Q;
 
 typedef struct asc_scsi_bios_req_q {
-    ASC_SCSIQ_1         r1;
-    ASC_SCSIQ_2         r2;
-    uchar               *cdbptr;
-    ASC_SG_HEAD         *sg_head;
-    uchar               *sense_ptr;
-    ASC_SCSIQ_3         r3;
-    uchar               cdb[ASC_MAX_CDB_LEN];
-    uchar               sense[ASC_MIN_SENSE_LEN];
+       ASC_SCSIQ_1 r1;
+       ASC_SCSIQ_2 r2;
+       uchar *cdbptr;
+       ASC_SG_HEAD *sg_head;
+       uchar *sense_ptr;
+       ASC_SCSIQ_3 r3;
+       uchar cdb[ASC_MAX_CDB_LEN];
+       uchar sense[ASC_MIN_SENSE_LEN];
 } ASC_SCSI_BIOS_REQ_Q;
 
 typedef struct asc_risc_q {
-    uchar               fwd;
-    uchar               bwd;
-    ASC_SCSIQ_1         i1;
-    ASC_SCSIQ_2         i2;
-    ASC_SCSIQ_3         i3;
-    ASC_SCSIQ_4         i4;
+       uchar fwd;
+       uchar bwd;
+       ASC_SCSIQ_1 i1;
+       ASC_SCSIQ_2 i2;
+       ASC_SCSIQ_3 i3;
+       ASC_SCSIQ_4 i4;
 } ASC_RISC_Q;
 
 typedef struct asc_sg_list_q {
-    uchar               seq_no;
-    uchar               q_no;
-    uchar               cntl;
-    uchar               sg_head_qp;
-    uchar               sg_list_cnt;
-    uchar               sg_cur_list_cnt;
+       uchar seq_no;
+       uchar q_no;
+       uchar cntl;
+       uchar sg_head_qp;
+       uchar sg_list_cnt;
+       uchar sg_cur_list_cnt;
 } ASC_SG_LIST_Q;
 
 typedef struct asc_risc_sg_list_q {
-    uchar               fwd;
-    uchar               bwd;
-    ASC_SG_LIST_Q       sg;
-    ASC_SG_LIST         sg_list[7];
+       uchar fwd;
+       uchar bwd;
+       ASC_SG_LIST_Q sg;
+       ASC_SG_LIST sg_list[7];
 } ASC_RISC_SG_LIST_Q;
 
 #define ASC_EXE_SCSI_IO_MAX_IDLE_LOOP  0x1000000UL
@@ -1431,25 +1418,25 @@ typedef struct asc_risc_sg_list_q {
 #define SYN_ULTRA_XFER_NS_15  107
 
 typedef struct ext_msg {
-    uchar               msg_type;
-    uchar               msg_len;
-    uchar               msg_req;
-    union {
-        struct {
-            uchar               sdtr_xfer_period;
-            uchar               sdtr_req_ack_offset;
-        } sdtr;
-        struct {
-            uchar               wdtr_width;
-        } wdtr;
-        struct {
-            uchar               mdp_b3;
-            uchar               mdp_b2;
-            uchar               mdp_b1;
-            uchar               mdp_b0;
-        } mdp;
-    } u_ext_msg;
-    uchar               res;
+       uchar msg_type;
+       uchar msg_len;
+       uchar msg_req;
+       union {
+               struct {
+                       uchar sdtr_xfer_period;
+                       uchar sdtr_req_ack_offset;
+               } sdtr;
+               struct {
+                       uchar wdtr_width;
+               } wdtr;
+               struct {
+                       uchar mdp_b3;
+                       uchar mdp_b2;
+                       uchar mdp_b1;
+                       uchar mdp_b0;
+               } mdp;
+       } u_ext_msg;
+       uchar res;
 } EXT_MSG;
 
 #define xfer_period     u_ext_msg.sdtr.sdtr_xfer_period
@@ -1461,24 +1448,24 @@ typedef struct ext_msg {
 #define mdp_b0          u_ext_msg.mdp_b0
 
 typedef struct asc_dvc_cfg {
-    ASC_SCSI_BIT_ID_TYPE can_tagged_qng;
-    ASC_SCSI_BIT_ID_TYPE cmd_qng_enabled;
-    ASC_SCSI_BIT_ID_TYPE disc_enable;
-    ASC_SCSI_BIT_ID_TYPE sdtr_enable;
-    uchar               chip_scsi_id;
-    uchar               isa_dma_speed;
-    uchar               isa_dma_channel;
-    uchar               chip_version;
-    ushort              lib_serial_no;
-    ushort              lib_version;
-    ushort              mcode_date;
-    ushort              mcode_version;
-    uchar               max_tag_qng[ASC_MAX_TID + 1];
-    uchar               *overrun_buf;
-    uchar               sdtr_period_offset[ASC_MAX_TID + 1];
-    ushort              pci_slot_info;
-    uchar               adapter_info[6];
-    struct device      *dev;
+       ASC_SCSI_BIT_ID_TYPE can_tagged_qng;
+       ASC_SCSI_BIT_ID_TYPE cmd_qng_enabled;
+       ASC_SCSI_BIT_ID_TYPE disc_enable;
+       ASC_SCSI_BIT_ID_TYPE sdtr_enable;
+       uchar chip_scsi_id;
+       uchar isa_dma_speed;
+       uchar isa_dma_channel;
+       uchar chip_version;
+       ushort lib_serial_no;
+       ushort lib_version;
+       ushort mcode_date;
+       ushort mcode_version;
+       uchar max_tag_qng[ASC_MAX_TID + 1];
+       uchar *overrun_buf;
+       uchar sdtr_period_offset[ASC_MAX_TID + 1];
+       ushort pci_slot_info;
+       uchar adapter_info[6];
+       struct device *dev;
 } ASC_DVC_CFG;
 
 #define ASC_DEF_DVC_CNTL       0xFFFF
@@ -1501,64 +1488,64 @@ typedef struct asc_dvc_cfg {
 #define ASC_MIN_TAGGED_CMD  7
 #define ASC_MAX_SCSI_RESET_WAIT      30
 
-struct asc_dvc_var;     /* Forward Declaration. */
+struct asc_dvc_var;            /* Forward Declaration. */
 
-typedef void (* ASC_ISR_CALLBACK)(struct asc_dvc_var *, ASC_QDONE_INFO *);
-typedef int (* ASC_EXE_CALLBACK)(struct asc_dvc_var *, ASC_SCSI_Q *);
+typedef void (*ASC_ISR_CALLBACK) (struct asc_dvc_var *, ASC_QDONE_INFO *);
+typedef int (*ASC_EXE_CALLBACK) (struct asc_dvc_var *, ASC_SCSI_Q *);
 
 typedef struct asc_dvc_var {
-    PortAddr            iop_base;
-    ushort              err_code;
-    ushort              dvc_cntl;
-    ushort              bug_fix_cntl;
-    ushort              bus_type;
-    ASC_ISR_CALLBACK    isr_callback;
-    ASC_EXE_CALLBACK    exe_callback;
-    ASC_SCSI_BIT_ID_TYPE init_sdtr;
-    ASC_SCSI_BIT_ID_TYPE sdtr_done;
-    ASC_SCSI_BIT_ID_TYPE use_tagged_qng;
-    ASC_SCSI_BIT_ID_TYPE unit_not_ready;
-    ASC_SCSI_BIT_ID_TYPE queue_full_or_busy;
-    ASC_SCSI_BIT_ID_TYPE start_motor;
-    uchar               scsi_reset_wait;
-    uchar               chip_no;
-    char                is_in_int;
-    uchar               max_total_qng;
-    uchar               cur_total_qng;
-    uchar               in_critical_cnt;
-    uchar               irq_no;
-    uchar               last_q_shortage;
-    ushort              init_state;
-    uchar               cur_dvc_qng[ASC_MAX_TID + 1];
-    uchar               max_dvc_qng[ASC_MAX_TID + 1];
-    ASC_SCSI_Q  *scsiq_busy_head[ASC_MAX_TID + 1];
-    ASC_SCSI_Q  *scsiq_busy_tail[ASC_MAX_TID + 1];
-    uchar               sdtr_period_tbl[ASC_MAX_SYN_XFER_NO];
-    ASC_DVC_CFG *cfg;
-    ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer_always;
-    char                redo_scam;
-    ushort              res2;
-    uchar               dos_int13_table[ASC_MAX_TID + 1];
-    ASC_DCNT            max_dma_count;
-    ASC_SCSI_BIT_ID_TYPE no_scam;
-    ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer;
-    uchar               max_sdtr_index;
-    uchar               host_init_sdtr_index;
-    struct asc_board    *drv_ptr;
-    ASC_DCNT            uc_break;
+       PortAddr iop_base;
+       ushort err_code;
+       ushort dvc_cntl;
+       ushort bug_fix_cntl;
+       ushort bus_type;
+       ASC_ISR_CALLBACK isr_callback;
+       ASC_EXE_CALLBACK exe_callback;
+       ASC_SCSI_BIT_ID_TYPE init_sdtr;
+       ASC_SCSI_BIT_ID_TYPE sdtr_done;
+       ASC_SCSI_BIT_ID_TYPE use_tagged_qng;
+       ASC_SCSI_BIT_ID_TYPE unit_not_ready;
+       ASC_SCSI_BIT_ID_TYPE queue_full_or_busy;
+       ASC_SCSI_BIT_ID_TYPE start_motor;
+       uchar scsi_reset_wait;
+       uchar chip_no;
+       char is_in_int;
+       uchar max_total_qng;
+       uchar cur_total_qng;
+       uchar in_critical_cnt;
+       uchar irq_no;
+       uchar last_q_shortage;
+       ushort init_state;
+       uchar cur_dvc_qng[ASC_MAX_TID + 1];
+       uchar max_dvc_qng[ASC_MAX_TID + 1];
+       ASC_SCSI_Q *scsiq_busy_head[ASC_MAX_TID + 1];
+       ASC_SCSI_Q *scsiq_busy_tail[ASC_MAX_TID + 1];
+       uchar sdtr_period_tbl[ASC_MAX_SYN_XFER_NO];
+       ASC_DVC_CFG *cfg;
+       ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer_always;
+       char redo_scam;
+       ushort res2;
+       uchar dos_int13_table[ASC_MAX_TID + 1];
+       ASC_DCNT max_dma_count;
+       ASC_SCSI_BIT_ID_TYPE no_scam;
+       ASC_SCSI_BIT_ID_TYPE pci_fix_asyn_xfer;
+       uchar max_sdtr_index;
+       uchar host_init_sdtr_index;
+       struct asc_board *drv_ptr;
+       ASC_DCNT uc_break;
 } ASC_DVC_VAR;
 
 typedef struct asc_dvc_inq_info {
-    uchar               type[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
+       uchar type[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
 } ASC_DVC_INQ_INFO;
 
 typedef struct asc_cap_info {
-    ASC_DCNT            lba;
-    ASC_DCNT            blk_size;
+       ASC_DCNT lba;
+       ASC_DCNT blk_size;
 } ASC_CAP_INFO;
 
 typedef struct asc_cap_info_array {
-    ASC_CAP_INFO        cap_info[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
+       ASC_CAP_INFO cap_info[ASC_MAX_TID + 1][ASC_MAX_LUN + 1];
 } ASC_CAP_INFO_ARRAY;
 
 #define ASC_MCNTL_NO_SEL_TIMEOUT  (ushort)0x0001
@@ -1603,23 +1590,23 @@ typedef struct asc_cap_info_array {
    ((cfg)->id_speed = ((cfg)->id_speed & 0x0f) | ((spd) & 0x0f) << 4)
 
 typedef struct asceep_config {
-    ushort              cfg_lsw;
-    ushort              cfg_msw;
-    uchar               init_sdtr;
-    uchar               disc_enable;
-    uchar               use_cmd_qng;
-    uchar               start_motor;
-    uchar               max_total_qng;
-    uchar               max_tag_qng;
-    uchar               bios_scan;
-    uchar               power_up_wait;
-    uchar               no_scam;
-    uchar               id_speed; /* low order 4 bits is chip scsi id */
-                                  /* high order 4 bits is isa dma speed */
-    uchar               dos_int13_table[ASC_MAX_TID + 1];
-    uchar               adapter_info[6];
-    ushort              cntl;
-    ushort              chksum;
+       ushort cfg_lsw;
+       ushort cfg_msw;
+       uchar init_sdtr;
+       uchar disc_enable;
+       uchar use_cmd_qng;
+       uchar start_motor;
+       uchar max_total_qng;
+       uchar max_tag_qng;
+       uchar bios_scan;
+       uchar power_up_wait;
+       uchar no_scam;
+       uchar id_speed;         /* low order 4 bits is chip scsi id */
+       /* high order 4 bits is isa dma speed */
+       uchar dos_int13_table[ASC_MAX_TID + 1];
+       uchar adapter_info[6];
+       ushort cntl;
+       ushort chksum;
 } ASCEEP_CONFIG;
 
 #define ASC_PCI_CFG_LSW_SCSI_PARITY  0x0800
@@ -1827,8 +1814,8 @@ typedef struct asceep_config {
 #define ASC_MC_SAVE_DATA_WSIZE  0x40
 
 typedef struct asc_mc_saved {
-    ushort              data[ASC_MC_SAVE_DATA_WSIZE];
-    ushort              code[ASC_MC_SAVE_CODE_WSIZE];
+       ushort data[ASC_MC_SAVE_DATA_WSIZE];
+       ushort code[ASC_MC_SAVE_CODE_WSIZE];
 } ASC_MC_SAVED;
 
 #define AscGetQDoneInProgress(port)         AscReadLramByte((port), ASCV_Q_DONE_IN_PROGRESS_B)
@@ -1900,120 +1887,113 @@ typedef struct asc_mc_saved {
 #define AscReadChipDvcID(port)            (uchar)inp((port)+IOP_REG_ID)
 #define AscWriteChipDvcID(port, data)     outp((port)+IOP_REG_ID, data)
 
-STATIC int       AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg);
-STATIC int       AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg);
-STATIC void      AscWaitEEPRead(void);
-STATIC void      AscWaitEEPWrite(void);
-STATIC ushort    AscReadEEPWord(PortAddr, uchar);
-STATIC ushort    AscWriteEEPWord(PortAddr, uchar, ushort);
-STATIC ushort    AscGetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
-STATIC int       AscSetEEPConfigOnce(PortAddr, ASCEEP_CONFIG *, ushort);
-STATIC int       AscSetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
-STATIC int       AscStartChip(PortAddr);
-STATIC int       AscStopChip(PortAddr);
-STATIC void      AscSetChipIH(PortAddr, ushort);
-STATIC int       AscIsChipHalted(PortAddr);
-STATIC void      AscAckInterrupt(PortAddr);
-STATIC void      AscDisableInterrupt(PortAddr);
-STATIC void      AscEnableInterrupt(PortAddr);
-STATIC void      AscSetBank(PortAddr, uchar);
-STATIC int       AscResetChipAndScsiBus(ASC_DVC_VAR *);
+static int AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg);
+static int AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg);
+static void AscWaitEEPRead(void);
+static void AscWaitEEPWrite(void);
+static ushort AscReadEEPWord(PortAddr, uchar);
+static ushort AscWriteEEPWord(PortAddr, uchar, ushort);
+static ushort AscGetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
+static int AscSetEEPConfigOnce(PortAddr, ASCEEP_CONFIG *, ushort);
+static int AscSetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
+static int AscStartChip(PortAddr);
+static int AscStopChip(PortAddr);
+static void AscSetChipIH(PortAddr, ushort);
+static int AscIsChipHalted(PortAddr);
+static void AscAckInterrupt(PortAddr);
+static void AscDisableInterrupt(PortAddr);
+static void AscEnableInterrupt(PortAddr);
+static void AscSetBank(PortAddr, uchar);
+static int AscResetChipAndScsiBus(ASC_DVC_VAR *);
 #ifdef CONFIG_ISA
-STATIC ushort    AscGetIsaDmaChannel(PortAddr);
-STATIC ushort    AscSetIsaDmaChannel(PortAddr, ushort);
-STATIC uchar     AscSetIsaDmaSpeed(PortAddr, uchar);
-STATIC uchar     AscGetIsaDmaSpeed(PortAddr);
+static ushort AscGetIsaDmaChannel(PortAddr);
+static ushort AscSetIsaDmaChannel(PortAddr, ushort);
+static uchar AscSetIsaDmaSpeed(PortAddr, uchar);
+static uchar AscGetIsaDmaSpeed(PortAddr);
 #endif /* CONFIG_ISA */
-STATIC uchar     AscReadLramByte(PortAddr, ushort);
-STATIC ushort    AscReadLramWord(PortAddr, ushort);
+static uchar AscReadLramByte(PortAddr, ushort);
+static ushort AscReadLramWord(PortAddr, ushort);
 #if CC_VERY_LONG_SG_LIST
-STATIC ASC_DCNT  AscReadLramDWord(PortAddr, ushort);
+static ASC_DCNT AscReadLramDWord(PortAddr, ushort);
 #endif /* CC_VERY_LONG_SG_LIST */
-STATIC void      AscWriteLramWord(PortAddr, ushort, ushort);
-STATIC void      AscWriteLramByte(PortAddr, ushort, uchar);
-STATIC ASC_DCNT  AscMemSumLramWord(PortAddr, ushort, int);
-STATIC void      AscMemWordSetLram(PortAddr, ushort, ushort, int);
-STATIC void      AscMemWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
-STATIC void      AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
-STATIC void      AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int);
-STATIC ushort    AscInitAscDvcVar(ASC_DVC_VAR *);
-STATIC ushort    AscInitFromEEP(ASC_DVC_VAR *);
-STATIC ushort    AscInitFromAscDvcVar(ASC_DVC_VAR *);
-STATIC ushort    AscInitMicroCodeVar(ASC_DVC_VAR *);
-STATIC int       AscTestExternalLram(ASC_DVC_VAR *);
-STATIC uchar     AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar);
-STATIC uchar     AscCalSDTRData(ASC_DVC_VAR *, uchar, uchar);
-STATIC void      AscSetChipSDTR(PortAddr, uchar, uchar);
-STATIC uchar     AscGetSynPeriodIndex(ASC_DVC_VAR *, uchar);
-STATIC uchar     AscAllocFreeQueue(PortAddr, uchar);
-STATIC uchar     AscAllocMultipleFreeQueue(PortAddr, uchar, uchar);
-STATIC int       AscHostReqRiscHalt(PortAddr);
-STATIC int       AscStopQueueExe(PortAddr);
-STATIC int       AscSendScsiQueue(ASC_DVC_VAR *,
-                    ASC_SCSI_Q * scsiq,
-                    uchar n_q_required);
-STATIC int       AscPutReadyQueue(ASC_DVC_VAR *,
-                    ASC_SCSI_Q *, uchar);
-STATIC int       AscPutReadySgListQueue(ASC_DVC_VAR *,
-                    ASC_SCSI_Q *, uchar);
-STATIC int       AscSetChipSynRegAtID(PortAddr, uchar, uchar);
-STATIC int       AscSetRunChipSynRegAtID(PortAddr, uchar, uchar);
-STATIC ushort    AscInitLram(ASC_DVC_VAR *);
-STATIC ushort    AscInitQLinkVar(ASC_DVC_VAR *);
-STATIC int       AscSetLibErrorCode(ASC_DVC_VAR *, ushort);
-STATIC int       AscIsrChipHalted(ASC_DVC_VAR *);
-STATIC uchar     _AscCopyLramScsiDoneQ(PortAddr, ushort,
-                    ASC_QDONE_INFO *, ASC_DCNT);
-STATIC int       AscIsrQDone(ASC_DVC_VAR *);
-STATIC int       AscCompareString(uchar *, uchar *, int);
+static void AscWriteLramWord(PortAddr, ushort, ushort);
+static void AscWriteLramByte(PortAddr, ushort, uchar);
+static ASC_DCNT AscMemSumLramWord(PortAddr, ushort, int);
+static void AscMemWordSetLram(PortAddr, ushort, ushort, int);
+static void AscMemWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
+static void AscMemDWordCopyPtrToLram(PortAddr, ushort, uchar *, int);
+static void AscMemWordCopyPtrFromLram(PortAddr, ushort, uchar *, int);
+static ushort AscInitAscDvcVar(ASC_DVC_VAR *);
+static ushort AscInitFromEEP(ASC_DVC_VAR *);
+static ushort AscInitFromAscDvcVar(ASC_DVC_VAR *);
+static ushort AscInitMicroCodeVar(ASC_DVC_VAR *);
+static int AscTestExternalLram(ASC_DVC_VAR *);
+static uchar AscMsgOutSDTR(ASC_DVC_VAR *, uchar, uchar);
+static uchar AscCalSDTRData(ASC_DVC_VAR *, uchar, uchar);
+static void AscSetChipSDTR(PortAddr, uchar, uchar);
+static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *, uchar);
+static uchar AscAllocFreeQueue(PortAddr, uchar);
+static uchar AscAllocMultipleFreeQueue(PortAddr, uchar, uchar);
+static int AscHostReqRiscHalt(PortAddr);
+static int AscStopQueueExe(PortAddr);
+static int AscSendScsiQueue(ASC_DVC_VAR *,
+                           ASC_SCSI_Q *scsiq, uchar n_q_required);
+static int AscPutReadyQueue(ASC_DVC_VAR *, ASC_SCSI_Q *, uchar);
+static int AscPutReadySgListQueue(ASC_DVC_VAR *, ASC_SCSI_Q *, uchar);
+static int AscSetChipSynRegAtID(PortAddr, uchar, uchar);
+static int AscSetRunChipSynRegAtID(PortAddr, uchar, uchar);
+static ushort AscInitLram(ASC_DVC_VAR *);
+static ushort AscInitQLinkVar(ASC_DVC_VAR *);
+static int AscSetLibErrorCode(ASC_DVC_VAR *, ushort);
+static int AscIsrChipHalted(ASC_DVC_VAR *);
+static uchar _AscCopyLramScsiDoneQ(PortAddr, ushort,
+                                  ASC_QDONE_INFO *, ASC_DCNT);
+static int AscIsrQDone(ASC_DVC_VAR *);
+static int AscCompareString(uchar *, uchar *, int);
 #ifdef CONFIG_ISA
-STATIC ushort    AscGetEisaChipCfg(PortAddr);
-STATIC ASC_DCNT  AscGetEisaProductID(PortAddr);
-STATIC PortAddr  AscSearchIOPortAddrEISA(PortAddr);
-STATIC PortAddr  AscSearchIOPortAddr11(PortAddr);
-STATIC PortAddr  AscSearchIOPortAddr(PortAddr, ushort);
-STATIC void      AscSetISAPNPWaitForKey(void);
+static ushort AscGetEisaChipCfg(PortAddr);
+static ASC_DCNT AscGetEisaProductID(PortAddr);
+static PortAddr AscSearchIOPortAddrEISA(PortAddr);
+static PortAddr AscSearchIOPortAddr11(PortAddr);
+static PortAddr AscSearchIOPortAddr(PortAddr, ushort);
+static void AscSetISAPNPWaitForKey(void);
 #endif /* CONFIG_ISA */
-STATIC uchar     AscGetChipScsiCtrl(PortAddr);
-STATIC uchar     AscSetChipScsiID(PortAddr, uchar);
-STATIC uchar     AscGetChipVersion(PortAddr, ushort);
-STATIC ushort    AscGetChipBusType(PortAddr);
-STATIC ASC_DCNT  AscLoadMicroCode(PortAddr, ushort, uchar *, ushort);
-STATIC int       AscFindSignature(PortAddr);
-STATIC void      AscToggleIRQAct(PortAddr);
-STATIC uchar     AscGetChipIRQ(PortAddr, ushort);
-STATIC uchar     AscSetChipIRQ(PortAddr, uchar, ushort);
-STATIC ushort    AscGetChipBiosAddress(PortAddr, ushort);
-STATIC inline ulong DvcEnterCritical(void);
-STATIC inline void DvcLeaveCritical(ulong);
+static uchar AscGetChipScsiCtrl(PortAddr);
+static uchar AscSetChipScsiID(PortAddr, uchar);
+static uchar AscGetChipVersion(PortAddr, ushort);
+static ushort AscGetChipBusType(PortAddr);
+static ASC_DCNT AscLoadMicroCode(PortAddr, ushort, uchar *, ushort);
+static int AscFindSignature(PortAddr);
+static void AscToggleIRQAct(PortAddr);
+static uchar AscGetChipIRQ(PortAddr, ushort);
+static uchar AscSetChipIRQ(PortAddr, uchar, ushort);
+static ushort AscGetChipBiosAddress(PortAddr, ushort);
+static inline ulong DvcEnterCritical(void);
+static inline void DvcLeaveCritical(ulong);
 #ifdef CONFIG_PCI
-STATIC uchar     DvcReadPCIConfigByte(ASC_DVC_VAR *, ushort);
-STATIC void      DvcWritePCIConfigByte(ASC_DVC_VAR *,
-                    ushort, uchar);
+static uchar DvcReadPCIConfigByte(ASC_DVC_VAR *, ushort);
+static void DvcWritePCIConfigByte(ASC_DVC_VAR *, ushort, uchar);
 #endif /* CONFIG_PCI */
-STATIC ushort      AscGetChipBiosAddress(PortAddr, ushort);
-STATIC void      DvcSleepMilliSecond(ASC_DCNT);
-STATIC void      DvcDelayNanoSecond(ASC_DVC_VAR *, ASC_DCNT);
-STATIC void      DvcPutScsiQ(PortAddr, ushort, uchar *, int);
-STATIC void      DvcGetQinfo(PortAddr, ushort, uchar *, int);
-STATIC ushort    AscInitGetConfig(ASC_DVC_VAR *);
-STATIC ushort    AscInitSetConfig(ASC_DVC_VAR *);
-STATIC ushort    AscInitAsc1000Driver(ASC_DVC_VAR *);
-STATIC void      AscAsyncFix(ASC_DVC_VAR *, uchar,
-                    ASC_SCSI_INQUIRY *);
-STATIC int       AscTagQueuingSafe(ASC_SCSI_INQUIRY *);
-STATIC void      AscInquiryHandling(ASC_DVC_VAR *,
-                    uchar, ASC_SCSI_INQUIRY *);
-STATIC int       AscExeScsiQueue(ASC_DVC_VAR *, ASC_SCSI_Q *);
-STATIC int       AscISR(ASC_DVC_VAR *);
-STATIC uint      AscGetNumOfFreeQueue(ASC_DVC_VAR *, uchar,
-                    uchar);
-STATIC int       AscSgListToQueue(int);
+static ushort AscGetChipBiosAddress(PortAddr, ushort);
+static void DvcSleepMilliSecond(ASC_DCNT);
+static void DvcDelayNanoSecond(ASC_DVC_VAR *, ASC_DCNT);
+static void DvcPutScsiQ(PortAddr, ushort, uchar *, int);
+static void DvcGetQinfo(PortAddr, ushort, uchar *, int);
+static ushort AscInitGetConfig(ASC_DVC_VAR *);
+static ushort AscInitSetConfig(ASC_DVC_VAR *);
+static ushort AscInitAsc1000Driver(ASC_DVC_VAR *);
+static void AscAsyncFix(ASC_DVC_VAR *, uchar, ASC_SCSI_INQUIRY *);
+static int AscTagQueuingSafe(ASC_SCSI_INQUIRY *);
+static void AscInquiryHandling(ASC_DVC_VAR *, uchar, ASC_SCSI_INQUIRY *);
+static int AscExeScsiQueue(ASC_DVC_VAR *, ASC_SCSI_Q *);
+static int AscISR(ASC_DVC_VAR *);
+static uint AscGetNumOfFreeQueue(ASC_DVC_VAR *, uchar, uchar);
+static int AscSgListToQueue(int);
 #ifdef CONFIG_ISA
-STATIC void      AscEnableIsaDma(uchar);
+static void AscEnableIsaDma(uchar);
 #endif /* CONFIG_ISA */
-STATIC ASC_DCNT  AscGetMaxDmaCount(ushort);
-static const char *advansys_info(struct Scsi_Host *shp);
+static ASC_DCNT AscGetMaxDmaCount(ushort);
+static const char *advansys_info(struct Scsi_Host *shost);
 
 /*
  * --- Adv Library Constants and Macros
@@ -2035,10 +2015,10 @@ static const char *advansys_info(struct Scsi_Host *shp);
  * are all consistent at 8, 16, and 32 bits respectively. Pointers
  * and long types are 64 bits on Alpha and UltraSPARC.
  */
-#define ADV_PADDR __u32         /* Physical address data type. */
-#define ADV_VADDR __u32         /* Virtual address data type. */
-#define ADV_DCNT  __u32         /* Unsigned Data count type. */
-#define ADV_SDCNT __s32         /* Signed Data count type. */
+#define ADV_PADDR __u32                /* Physical address data type. */
+#define ADV_VADDR __u32                /* Virtual address data type. */
+#define ADV_DCNT  __u32                /* Unsigned Data count type. */
+#define ADV_SDCNT __s32                /* Signed Data count type. */
 
 /*
  * These macros are used to convert a virtual address to a
@@ -2051,7 +2031,7 @@ static const char *advansys_info(struct Scsi_Host *shp);
 #define ADV_VADDR_TO_U32   virt_to_bus
 #define ADV_U32_TO_VADDR   bus_to_virt
 
-#define AdvPortAddr  void __iomem *     /* Virtual memory address size */
+#define AdvPortAddr  void __iomem *    /* Virtual memory address size */
 
 /*
  * Define Adv Library required memory access macros.
@@ -2103,20 +2083,20 @@ static const char *advansys_info(struct Scsi_Host *shp);
 
 #define ADV_EEP_DVC_CFG_BEGIN           (0x00)
 #define ADV_EEP_DVC_CFG_END             (0x15)
-#define ADV_EEP_DVC_CTL_BEGIN           (0x16)  /* location of OEM name */
+#define ADV_EEP_DVC_CTL_BEGIN           (0x16) /* location of OEM name */
 #define ADV_EEP_MAX_WORD_ADDR           (0x1E)
 
 #define ADV_EEP_DELAY_MS                100
 
-#define ADV_EEPROM_BIG_ENDIAN          0x8000   /* EEPROM Bit 15 */
-#define ADV_EEPROM_BIOS_ENABLE         0x4000   /* EEPROM Bit 14 */
+#define ADV_EEPROM_BIG_ENDIAN          0x8000  /* EEPROM Bit 15 */
+#define ADV_EEPROM_BIOS_ENABLE         0x4000  /* EEPROM Bit 14 */
 /*
  * For the ASC3550 Bit 13 is Termination Polarity control bit.
  * For later ICs Bit 13 controls whether the CIS (Card Information
  * Service Section) is loaded from EEPROM.
  */
-#define ADV_EEPROM_TERM_POL            0x2000   /* EEPROM Bit 13 */
-#define ADV_EEPROM_CIS_LD              0x2000   /* EEPROM Bit 13 */
+#define ADV_EEPROM_TERM_POL            0x2000  /* EEPROM Bit 13 */
+#define ADV_EEPROM_CIS_LD              0x2000  /* EEPROM Bit 13 */
 /*
  * ASC38C1600 Bit 11
  *
@@ -2128,280 +2108,277 @@ static const char *advansys_info(struct Scsi_Host *shp);
  * INT B in the PCI Configuration Space Int Pin field. If it is 1, then
  * Function 1 will specify INT A.
  */
-#define ADV_EEPROM_INTAB               0x0800   /* EEPROM Bit 11 */
-
-typedef struct adveep_3550_config
-{
-                                /* Word Offset, Description */
-
-  ushort cfg_lsw;               /* 00 power up initialization */
-                                /*  bit 13 set - Term Polarity Control */
-                                /*  bit 14 set - BIOS Enable */
-                                /*  bit 15 set - Big Endian Mode */
-  ushort cfg_msw;               /* 01 unused      */
-  ushort disc_enable;           /* 02 disconnect enable */
-  ushort wdtr_able;             /* 03 Wide DTR able */
-  ushort sdtr_able;             /* 04 Synchronous DTR able */
-  ushort start_motor;           /* 05 send start up motor */
-  ushort tagqng_able;           /* 06 tag queuing able */
-  ushort bios_scan;             /* 07 BIOS device control */
-  ushort scam_tolerant;         /* 08 no scam */
-
-  uchar  adapter_scsi_id;       /* 09 Host Adapter ID */
-  uchar  bios_boot_delay;       /*    power up wait */
-
-  uchar  scsi_reset_delay;      /* 10 reset delay */
-  uchar  bios_id_lun;           /*    first boot device scsi id & lun */
-                                /*    high nibble is lun */
-                                /*    low nibble is scsi id */
-
-  uchar  termination;           /* 11 0 - automatic */
-                                /*    1 - low off / high off */
-                                /*    2 - low off / high on */
-                                /*    3 - low on  / high on */
-                                /*    There is no low on  / high off */
-
-  uchar  reserved1;             /*    reserved byte (not used) */
-
-  ushort bios_ctrl;             /* 12 BIOS control bits */
-                                /*  bit 0  BIOS don't act as initiator. */
-                                /*  bit 1  BIOS > 1 GB support */
-                                /*  bit 2  BIOS > 2 Disk Support */
-                                /*  bit 3  BIOS don't support removables */
-                                /*  bit 4  BIOS support bootable CD */
-                                /*  bit 5  BIOS scan enabled */
-                                /*  bit 6  BIOS support multiple LUNs */
-                                /*  bit 7  BIOS display of message */
-                                /*  bit 8  SCAM disabled */
-                                /*  bit 9  Reset SCSI bus during init. */
-                                /*  bit 10 */
-                                /*  bit 11 No verbose initialization. */
-                                /*  bit 12 SCSI parity enabled */
-                                /*  bit 13 */
-                                /*  bit 14 */
-                                /*  bit 15 */
-  ushort  ultra_able;           /* 13 ULTRA speed able */
-  ushort  reserved2;            /* 14 reserved */
-  uchar   max_host_qng;         /* 15 maximum host queuing */
-  uchar   max_dvc_qng;          /*    maximum per device queuing */
-  ushort  dvc_cntl;             /* 16 control bit for driver */
-  ushort  bug_fix;              /* 17 control bit for bug fix */
-  ushort  serial_number_word1;  /* 18 Board serial number word 1 */
-  ushort  serial_number_word2;  /* 19 Board serial number word 2 */
-  ushort  serial_number_word3;  /* 20 Board serial number word 3 */
-  ushort  check_sum;            /* 21 EEP check sum */
-  uchar   oem_name[16];         /* 22 OEM name */
-  ushort  dvc_err_code;         /* 30 last device driver error code */
-  ushort  adv_err_code;         /* 31 last uc and Adv Lib error code */
-  ushort  adv_err_addr;         /* 32 last uc error address */
-  ushort  saved_dvc_err_code;   /* 33 saved last dev. driver error code   */
-  ushort  saved_adv_err_code;   /* 34 saved last uc and Adv Lib error code */
-  ushort  saved_adv_err_addr;   /* 35 saved last uc error address         */
-  ushort  num_of_err;           /* 36 number of error */
+#define ADV_EEPROM_INTAB               0x0800  /* EEPROM Bit 11 */
+
+typedef struct adveep_3550_config {
+       /* Word Offset, Description */
+
+       ushort cfg_lsw;         /* 00 power up initialization */
+       /*  bit 13 set - Term Polarity Control */
+       /*  bit 14 set - BIOS Enable */
+       /*  bit 15 set - Big Endian Mode */
+       ushort cfg_msw;         /* 01 unused      */
+       ushort disc_enable;     /* 02 disconnect enable */
+       ushort wdtr_able;       /* 03 Wide DTR able */
+       ushort sdtr_able;       /* 04 Synchronous DTR able */
+       ushort start_motor;     /* 05 send start up motor */
+       ushort tagqng_able;     /* 06 tag queuing able */
+       ushort bios_scan;       /* 07 BIOS device control */
+       ushort scam_tolerant;   /* 08 no scam */
+
+       uchar adapter_scsi_id;  /* 09 Host Adapter ID */
+       uchar bios_boot_delay;  /*    power up wait */
+
+       uchar scsi_reset_delay; /* 10 reset delay */
+       uchar bios_id_lun;      /*    first boot device scsi id & lun */
+       /*    high nibble is lun */
+       /*    low nibble is scsi id */
+
+       uchar termination;      /* 11 0 - automatic */
+       /*    1 - low off / high off */
+       /*    2 - low off / high on */
+       /*    3 - low on  / high on */
+       /*    There is no low on  / high off */
+
+       uchar reserved1;        /*    reserved byte (not used) */
+
+       ushort bios_ctrl;       /* 12 BIOS control bits */
+       /*  bit 0  BIOS don't act as initiator. */
+       /*  bit 1  BIOS > 1 GB support */
+       /*  bit 2  BIOS > 2 Disk Support */
+       /*  bit 3  BIOS don't support removables */
+       /*  bit 4  BIOS support bootable CD */
+       /*  bit 5  BIOS scan enabled */
+       /*  bit 6  BIOS support multiple LUNs */
+       /*  bit 7  BIOS display of message */
+       /*  bit 8  SCAM disabled */
+       /*  bit 9  Reset SCSI bus during init. */
+       /*  bit 10 */
+       /*  bit 11 No verbose initialization. */
+       /*  bit 12 SCSI parity enabled */
+       /*  bit 13 */
+       /*  bit 14 */
+       /*  bit 15 */
+       ushort ultra_able;      /* 13 ULTRA speed able */
+       ushort reserved2;       /* 14 reserved */
+       uchar max_host_qng;     /* 15 maximum host queuing */
+       uchar max_dvc_qng;      /*    maximum per device queuing */
+       ushort dvc_cntl;        /* 16 control bit for driver */
+       ushort bug_fix;         /* 17 control bit for bug fix */
+       ushort serial_number_word1;     /* 18 Board serial number word 1 */
+       ushort serial_number_word2;     /* 19 Board serial number word 2 */
+       ushort serial_number_word3;     /* 20 Board serial number word 3 */
+       ushort check_sum;       /* 21 EEP check sum */
+       uchar oem_name[16];     /* 22 OEM name */
+       ushort dvc_err_code;    /* 30 last device driver error code */
+       ushort adv_err_code;    /* 31 last uc and Adv Lib error code */
+       ushort adv_err_addr;    /* 32 last uc error address */
+       ushort saved_dvc_err_code;      /* 33 saved last dev. driver error code   */
+       ushort saved_adv_err_code;      /* 34 saved last uc and Adv Lib error code */
+       ushort saved_adv_err_addr;      /* 35 saved last uc error address         */
+       ushort num_of_err;      /* 36 number of error */
 } ADVEEP_3550_CONFIG;
 
-typedef struct adveep_38C0800_config
-{
-                                /* Word Offset, Description */
-
-  ushort cfg_lsw;               /* 00 power up initialization */
-                                /*  bit 13 set - Load CIS */
-                                /*  bit 14 set - BIOS Enable */
-                                /*  bit 15 set - Big Endian Mode */
-  ushort cfg_msw;               /* 01 unused      */
-  ushort disc_enable;           /* 02 disconnect enable */
-  ushort wdtr_able;             /* 03 Wide DTR able */
-  ushort sdtr_speed1;           /* 04 SDTR Speed TID 0-3 */
-  ushort start_motor;           /* 05 send start up motor */
-  ushort tagqng_able;           /* 06 tag queuing able */
-  ushort bios_scan;             /* 07 BIOS device control */
-  ushort scam_tolerant;         /* 08 no scam */
-
-  uchar  adapter_scsi_id;       /* 09 Host Adapter ID */
-  uchar  bios_boot_delay;       /*    power up wait */
-
-  uchar  scsi_reset_delay;      /* 10 reset delay */
-  uchar  bios_id_lun;           /*    first boot device scsi id & lun */
-                                /*    high nibble is lun */
-                                /*    low nibble is scsi id */
-
-  uchar  termination_se;        /* 11 0 - automatic */
-                                /*    1 - low off / high off */
-                                /*    2 - low off / high on */
-                                /*    3 - low on  / high on */
-                                /*    There is no low on  / high off */
-
-  uchar  termination_lvd;       /* 11 0 - automatic */
-                                /*    1 - low off / high off */
-                                /*    2 - low off / high on */
-                                /*    3 - low on  / high on */
-                                /*    There is no low on  / high off */
-
-  ushort bios_ctrl;             /* 12 BIOS control bits */
-                                /*  bit 0  BIOS don't act as initiator. */
-                                /*  bit 1  BIOS > 1 GB support */
-                                /*  bit 2  BIOS > 2 Disk Support */
-                                /*  bit 3  BIOS don't support removables */
-                                /*  bit 4  BIOS support bootable CD */
-                                /*  bit 5  BIOS scan enabled */
-                                /*  bit 6  BIOS support multiple LUNs */
-                                /*  bit 7  BIOS display of message */
-                                /*  bit 8  SCAM disabled */
-                                /*  bit 9  Reset SCSI bus during init. */
-                                /*  bit 10 */
-                                /*  bit 11 No verbose initialization. */
-                                /*  bit 12 SCSI parity enabled */
-                                /*  bit 13 */
-                                /*  bit 14 */
-                                /*  bit 15 */
-  ushort  sdtr_speed2;          /* 13 SDTR speed TID 4-7 */
-  ushort  sdtr_speed3;          /* 14 SDTR speed TID 8-11 */
-  uchar   max_host_qng;         /* 15 maximum host queueing */
-  uchar   max_dvc_qng;          /*    maximum per device queuing */
-  ushort  dvc_cntl;             /* 16 control bit for driver */
-  ushort  sdtr_speed4;          /* 17 SDTR speed 4 TID 12-15 */
-  ushort  serial_number_word1;  /* 18 Board serial number word 1 */
-  ushort  serial_number_word2;  /* 19 Board serial number word 2 */
-  ushort  serial_number_word3;  /* 20 Board serial number word 3 */
-  ushort  check_sum;            /* 21 EEP check sum */
-  uchar   oem_name[16];         /* 22 OEM name */
-  ushort  dvc_err_code;         /* 30 last device driver error code */
-  ushort  adv_err_code;         /* 31 last uc and Adv Lib error code */
-  ushort  adv_err_addr;         /* 32 last uc error address */
-  ushort  saved_dvc_err_code;   /* 33 saved last dev. driver error code   */
-  ushort  saved_adv_err_code;   /* 34 saved last uc and Adv Lib error code */
-  ushort  saved_adv_err_addr;   /* 35 saved last uc error address         */
-  ushort  reserved36;           /* 36 reserved */
-  ushort  reserved37;           /* 37 reserved */
-  ushort  reserved38;           /* 38 reserved */
-  ushort  reserved39;           /* 39 reserved */
-  ushort  reserved40;           /* 40 reserved */
-  ushort  reserved41;           /* 41 reserved */
-  ushort  reserved42;           /* 42 reserved */
-  ushort  reserved43;           /* 43 reserved */
-  ushort  reserved44;           /* 44 reserved */
-  ushort  reserved45;           /* 45 reserved */
-  ushort  reserved46;           /* 46 reserved */
-  ushort  reserved47;           /* 47 reserved */
-  ushort  reserved48;           /* 48 reserved */
-  ushort  reserved49;           /* 49 reserved */
-  ushort  reserved50;           /* 50 reserved */
-  ushort  reserved51;           /* 51 reserved */
-  ushort  reserved52;           /* 52 reserved */
-  ushort  reserved53;           /* 53 reserved */
-  ushort  reserved54;           /* 54 reserved */
-  ushort  reserved55;           /* 55 reserved */
-  ushort  cisptr_lsw;           /* 56 CIS PTR LSW */
-  ushort  cisprt_msw;           /* 57 CIS PTR MSW */
-  ushort  subsysvid;            /* 58 SubSystem Vendor ID */
-  ushort  subsysid;             /* 59 SubSystem ID */
-  ushort  reserved60;           /* 60 reserved */
-  ushort  reserved61;           /* 61 reserved */
-  ushort  reserved62;           /* 62 reserved */
-  ushort  reserved63;           /* 63 reserved */
+typedef struct adveep_38C0800_config {
+       /* Word Offset, Description */
+
+       ushort cfg_lsw;         /* 00 power up initialization */
+       /*  bit 13 set - Load CIS */
+       /*  bit 14 set - BIOS Enable */
+       /*  bit 15 set - Big Endian Mode */
+       ushort cfg_msw;         /* 01 unused      */
+       ushort disc_enable;     /* 02 disconnect enable */
+       ushort wdtr_able;       /* 03 Wide DTR able */
+       ushort sdtr_speed1;     /* 04 SDTR Speed TID 0-3 */
+       ushort start_motor;     /* 05 send start up motor */
+       ushort tagqng_able;     /* 06 tag queuing able */
+       ushort bios_scan;       /* 07 BIOS device control */
+       ushort scam_tolerant;   /* 08 no scam */
+
+       uchar adapter_scsi_id;  /* 09 Host Adapter ID */
+       uchar bios_boot_delay;  /*    power up wait */
+
+       uchar scsi_reset_delay; /* 10 reset delay */
+       uchar bios_id_lun;      /*    first boot device scsi id & lun */
+       /*    high nibble is lun */
+       /*    low nibble is scsi id */
+
+       uchar termination_se;   /* 11 0 - automatic */
+       /*    1 - low off / high off */
+       /*    2 - low off / high on */
+       /*    3 - low on  / high on */
+       /*    There is no low on  / high off */
+
+       uchar termination_lvd;  /* 11 0 - automatic */
+       /*    1 - low off / high off */
+       /*    2 - low off / high on */
+       /*    3 - low on  / high on */
+       /*    There is no low on  / high off */
+
+       ushort bios_ctrl;       /* 12 BIOS control bits */
+       /*  bit 0  BIOS don't act as initiator. */
+       /*  bit 1  BIOS > 1 GB support */
+       /*  bit 2  BIOS > 2 Disk Support */
+       /*  bit 3  BIOS don't support removables */
+       /*  bit 4  BIOS support bootable CD */
+       /*  bit 5  BIOS scan enabled */
+       /*  bit 6  BIOS support multiple LUNs */
+       /*  bit 7  BIOS display of message */
+       /*  bit 8  SCAM disabled */
+       /*  bit 9  Reset SCSI bus during init. */
+       /*  bit 10 */
+       /*  bit 11 No verbose initialization. */
+       /*  bit 12 SCSI parity enabled */
+       /*  bit 13 */
+       /*  bit 14 */
+       /*  bit 15 */
+       ushort sdtr_speed2;     /* 13 SDTR speed TID 4-7 */
+       ushort sdtr_speed3;     /* 14 SDTR speed TID 8-11 */
+       uchar max_host_qng;     /* 15 maximum host queueing */
+       uchar max_dvc_qng;      /*    maximum per device queuing */
+       ushort dvc_cntl;        /* 16 control bit for driver */
+       ushort sdtr_speed4;     /* 17 SDTR speed 4 TID 12-15 */
+       ushort serial_number_word1;     /* 18 Board serial number word 1 */
+       ushort serial_number_word2;     /* 19 Board serial number word 2 */
+       ushort serial_number_word3;     /* 20 Board serial number word 3 */
+       ushort check_sum;       /* 21 EEP check sum */
+       uchar oem_name[16];     /* 22 OEM name */
+       ushort dvc_err_code;    /* 30 last device driver error code */
+       ushort adv_err_code;    /* 31 last uc and Adv Lib error code */
+       ushort adv_err_addr;    /* 32 last uc error address */
+       ushort saved_dvc_err_code;      /* 33 saved last dev. driver error code   */
+       ushort saved_adv_err_code;      /* 34 saved last uc and Adv Lib error code */
+       ushort saved_adv_err_addr;      /* 35 saved last uc error address         */
+       ushort reserved36;      /* 36 reserved */
+       ushort reserved37;      /* 37 reserved */
+       ushort reserved38;      /* 38 reserved */
+       ushort reserved39;      /* 39 reserved */
+       ushort reserved40;      /* 40 reserved */
+       ushort reserved41;      /* 41 reserved */
+       ushort reserved42;      /* 42 reserved */
+       ushort reserved43;      /* 43 reserved */
+       ushort reserved44;      /* 44 reserved */
+       ushort reserved45;      /* 45 reserved */
+       ushort reserved46;      /* 46 reserved */
+       ushort reserved47;      /* 47 reserved */
+       ushort reserved48;      /* 48 reserved */
+       ushort reserved49;      /* 49 reserved */
+       ushort reserved50;      /* 50 reserved */
+       ushort reserved51;      /* 51 reserved */
+       ushort reserved52;      /* 52 reserved */
+       ushort reserved53;      /* 53 reserved */
+       ushort reserved54;      /* 54 reserved */
+       ushort reserved55;      /* 55 reserved */
+       ushort cisptr_lsw;      /* 56 CIS PTR LSW */
+       ushort cisprt_msw;      /* 57 CIS PTR MSW */
+       ushort subsysvid;       /* 58 SubSystem Vendor ID */
+       ushort subsysid;        /* 59 SubSystem ID */
+       ushort reserved60;      /* 60 reserved */
+       ushort reserved61;      /* 61 reserved */
+       ushort reserved62;      /* 62 reserved */
+       ushort reserved63;      /* 63 reserved */
 } ADVEEP_38C0800_CONFIG;
 
-typedef struct adveep_38C1600_config
-{
-                                /* Word Offset, Description */
-
-  ushort cfg_lsw;               /* 00 power up initialization */
-                                /*  bit 11 set - Func. 0 INTB, Func. 1 INTA */
-                                /*       clear - Func. 0 INTA, Func. 1 INTB */
-                                /*  bit 13 set - Load CIS */
-                                /*  bit 14 set - BIOS Enable */
-                                /*  bit 15 set - Big Endian Mode */
-  ushort cfg_msw;               /* 01 unused */
-  ushort disc_enable;           /* 02 disconnect enable */
-  ushort wdtr_able;             /* 03 Wide DTR able */
-  ushort sdtr_speed1;           /* 04 SDTR Speed TID 0-3 */
-  ushort start_motor;           /* 05 send start up motor */
-  ushort tagqng_able;           /* 06 tag queuing able */
-  ushort bios_scan;             /* 07 BIOS device control */
-  ushort scam_tolerant;         /* 08 no scam */
-
-  uchar  adapter_scsi_id;       /* 09 Host Adapter ID */
-  uchar  bios_boot_delay;       /*    power up wait */
-
-  uchar  scsi_reset_delay;      /* 10 reset delay */
-  uchar  bios_id_lun;           /*    first boot device scsi id & lun */
-                                /*    high nibble is lun */
-                                /*    low nibble is scsi id */
-
-  uchar  termination_se;        /* 11 0 - automatic */
-                                /*    1 - low off / high off */
-                                /*    2 - low off / high on */
-                                /*    3 - low on  / high on */
-                                /*    There is no low on  / high off */
-
-  uchar  termination_lvd;       /* 11 0 - automatic */
-                                /*    1 - low off / high off */
-                                /*    2 - low off / high on */
-                                /*    3 - low on  / high on */
-                                /*    There is no low on  / high off */
-
-  ushort bios_ctrl;             /* 12 BIOS control bits */
-                                /*  bit 0  BIOS don't act as initiator. */
-                                /*  bit 1  BIOS > 1 GB support */
-                                /*  bit 2  BIOS > 2 Disk Support */
-                                /*  bit 3  BIOS don't support removables */
-                                /*  bit 4  BIOS support bootable CD */
-                                /*  bit 5  BIOS scan enabled */
-                                /*  bit 6  BIOS support multiple LUNs */
-                                /*  bit 7  BIOS display of message */
-                                /*  bit 8  SCAM disabled */
-                                /*  bit 9  Reset SCSI bus during init. */
-                                /*  bit 10 Basic Integrity Checking disabled */
-                                /*  bit 11 No verbose initialization. */
-                                /*  bit 12 SCSI parity enabled */
-                                /*  bit 13 AIPP (Asyn. Info. Ph. Prot.) dis. */
-                                /*  bit 14 */
-                                /*  bit 15 */
-  ushort  sdtr_speed2;          /* 13 SDTR speed TID 4-7 */
-  ushort  sdtr_speed3;          /* 14 SDTR speed TID 8-11 */
-  uchar   max_host_qng;         /* 15 maximum host queueing */
-  uchar   max_dvc_qng;          /*    maximum per device queuing */
-  ushort  dvc_cntl;             /* 16 control bit for driver */
-  ushort  sdtr_speed4;          /* 17 SDTR speed 4 TID 12-15 */
-  ushort  serial_number_word1;  /* 18 Board serial number word 1 */
-  ushort  serial_number_word2;  /* 19 Board serial number word 2 */
-  ushort  serial_number_word3;  /* 20 Board serial number word 3 */
-  ushort  check_sum;            /* 21 EEP check sum */
-  uchar   oem_name[16];         /* 22 OEM name */
-  ushort  dvc_err_code;         /* 30 last device driver error code */
-  ushort  adv_err_code;         /* 31 last uc and Adv Lib error code */
-  ushort  adv_err_addr;         /* 32 last uc error address */
-  ushort  saved_dvc_err_code;   /* 33 saved last dev. driver error code   */
-  ushort  saved_adv_err_code;   /* 34 saved last uc and Adv Lib error code */
-  ushort  saved_adv_err_addr;   /* 35 saved last uc error address         */
-  ushort  reserved36;           /* 36 reserved */
-  ushort  reserved37;           /* 37 reserved */
-  ushort  reserved38;           /* 38 reserved */
-  ushort  reserved39;           /* 39 reserved */
-  ushort  reserved40;           /* 40 reserved */
-  ushort  reserved41;           /* 41 reserved */
-  ushort  reserved42;           /* 42 reserved */
-  ushort  reserved43;           /* 43 reserved */
-  ushort  reserved44;           /* 44 reserved */
-  ushort  reserved45;           /* 45 reserved */
-  ushort  reserved46;           /* 46 reserved */
-  ushort  reserved47;           /* 47 reserved */
-  ushort  reserved48;           /* 48 reserved */
-  ushort  reserved49;           /* 49 reserved */
-  ushort  reserved50;           /* 50 reserved */
-  ushort  reserved51;           /* 51 reserved */
-  ushort  reserved52;           /* 52 reserved */
-  ushort  reserved53;           /* 53 reserved */
-  ushort  reserved54;           /* 54 reserved */
-  ushort  reserved55;           /* 55 reserved */
-  ushort  cisptr_lsw;           /* 56 CIS PTR LSW */
-  ushort  cisprt_msw;           /* 57 CIS PTR MSW */
-  ushort  subsysvid;            /* 58 SubSystem Vendor ID */
-  ushort  subsysid;             /* 59 SubSystem ID */
-  ushort  reserved60;           /* 60 reserved */
-  ushort  reserved61;           /* 61 reserved */
-  ushort  reserved62;           /* 62 reserved */
-  ushort  reserved63;           /* 63 reserved */
+typedef struct adveep_38C1600_config {
+       /* Word Offset, Description */
+
+       ushort cfg_lsw;         /* 00 power up initialization */
+       /*  bit 11 set - Func. 0 INTB, Func. 1 INTA */
+       /*       clear - Func. 0 INTA, Func. 1 INTB */
+       /*  bit 13 set - Load CIS */
+       /*  bit 14 set - BIOS Enable */
+       /*  bit 15 set - Big Endian Mode */
+       ushort cfg_msw;         /* 01 unused */
+       ushort disc_enable;     /* 02 disconnect enable */
+       ushort wdtr_able;       /* 03 Wide DTR able */
+       ushort sdtr_speed1;     /* 04 SDTR Speed TID 0-3 */
+       ushort start_motor;     /* 05 send start up motor */
+       ushort tagqng_able;     /* 06 tag queuing able */
+       ushort bios_scan;       /* 07 BIOS device control */
+       ushort scam_tolerant;   /* 08 no scam */
+
+       uchar adapter_scsi_id;  /* 09 Host Adapter ID */
+       uchar bios_boot_delay;  /*    power up wait */
+
+       uchar scsi_reset_delay; /* 10 reset delay */
+       uchar bios_id_lun;      /*    first boot device scsi id & lun */
+       /*    high nibble is lun */
+       /*    low nibble is scsi id */
+
+       uchar termination_se;   /* 11 0 - automatic */
+       /*    1 - low off / high off */
+       /*    2 - low off / high on */
+       /*    3 - low on  / high on */
+       /*    There is no low on  / high off */
+
+       uchar termination_lvd;  /* 11 0 - automatic */
+       /*    1 - low off / high off */
+       /*    2 - low off / high on */
+       /*    3 - low on  / high on */
+       /*    There is no low on  / high off */
+
+       ushort bios_ctrl;       /* 12 BIOS control bits */
+       /*  bit 0  BIOS don't act as initiator. */
+       /*  bit 1  BIOS > 1 GB support */
+       /*  bit 2  BIOS > 2 Disk Support */
+       /*  bit 3  BIOS don't support removables */
+       /*  bit 4  BIOS support bootable CD */
+       /*  bit 5  BIOS scan enabled */
+       /*  bit 6  BIOS support multiple LUNs */
+       /*  bit 7  BIOS display of message */
+       /*  bit 8  SCAM disabled */
+       /*  bit 9  Reset SCSI bus during init. */
+       /*  bit 10 Basic Integrity Checking disabled */
+       /*  bit 11 No verbose initialization. */
+       /*  bit 12 SCSI parity enabled */
+       /*  bit 13 AIPP (Asyn. Info. Ph. Prot.) dis. */
+       /*  bit 14 */
+       /*  bit 15 */
+       ushort sdtr_speed2;     /* 13 SDTR speed TID 4-7 */
+       ushort sdtr_speed3;     /* 14 SDTR speed TID 8-11 */
+       uchar max_host_qng;     /* 15 maximum host queueing */
+       uchar max_dvc_qng;      /*    maximum per device queuing */
+       ushort dvc_cntl;        /* 16 control bit for driver */
+       ushort sdtr_speed4;     /* 17 SDTR speed 4 TID 12-15 */
+       ushort serial_number_word1;     /* 18 Board serial number word 1 */
+       ushort serial_number_word2;     /* 19 Board serial number word 2 */
+       ushort serial_number_word3;     /* 20 Board serial number word 3 */
+       ushort check_sum;       /* 21 EEP check sum */
+       uchar oem_name[16];     /* 22 OEM name */
+       ushort dvc_err_code;    /* 30 last device driver error code */
+       ushort adv_err_code;    /* 31 last uc and Adv Lib error code */
+       ushort adv_err_addr;    /* 32 last uc error address */
+       ushort saved_dvc_err_code;      /* 33 saved last dev. driver error code   */
+       ushort saved_adv_err_code;      /* 34 saved last uc and Adv Lib error code */
+       ushort saved_adv_err_addr;      /* 35 saved last uc error address         */
+       ushort reserved36;      /* 36 reserved */
+       ushort reserved37;      /* 37 reserved */
+       ushort reserved38;      /* 38 reserved */
+       ushort reserved39;      /* 39 reserved */
+       ushort reserved40;      /* 40 reserved */
+       ushort reserved41;      /* 41 reserved */
+       ushort reserved42;      /* 42 reserved */
+       ushort reserved43;      /* 43 reserved */
+       ushort reserved44;      /* 44 reserved */
+       ushort reserved45;      /* 45 reserved */
+       ushort reserved46;      /* 46 reserved */
+       ushort reserved47;      /* 47 reserved */
+       ushort reserved48;      /* 48 reserved */
+       ushort reserved49;      /* 49 reserved */
+       ushort reserved50;      /* 50 reserved */
+       ushort reserved51;      /* 51 reserved */
+       ushort reserved52;      /* 52 reserved */
+       ushort reserved53;      /* 53 reserved */
+       ushort reserved54;      /* 54 reserved */
+       ushort reserved55;      /* 55 reserved */
+       ushort cisptr_lsw;      /* 56 CIS PTR LSW */
+       ushort cisprt_msw;      /* 57 CIS PTR MSW */
+       ushort subsysvid;       /* 58 SubSystem Vendor ID */
+       ushort subsysid;        /* 59 SubSystem ID */
+       ushort reserved60;      /* 60 reserved */
+       ushort reserved61;      /* 61 reserved */
+       ushort reserved62;      /* 62 reserved */
+       ushort reserved63;      /* 63 reserved */
 } ADVEEP_38C1600_CONFIG;
 
 /*
@@ -2427,11 +2404,11 @@ typedef struct adveep_38C1600_config
 #define BIOS_CTRL_SCSI_PARITY        0x1000
 #define BIOS_CTRL_AIPP_DIS           0x2000
 
-#define ADV_3550_MEMSIZE   0x2000       /* 8 KB Internal Memory */
-#define ADV_3550_IOLEN     0x40         /* I/O Port Range in bytes */
+#define ADV_3550_MEMSIZE   0x2000      /* 8 KB Internal Memory */
+#define ADV_3550_IOLEN     0x40        /* I/O Port Range in bytes */
 
-#define ADV_38C0800_MEMSIZE  0x4000     /* 16 KB Internal Memory */
-#define ADV_38C0800_IOLEN    0x100      /* I/O Port Range in bytes */
+#define ADV_38C0800_MEMSIZE  0x4000    /* 16 KB Internal Memory */
+#define ADV_38C0800_IOLEN    0x100     /* I/O Port Range in bytes */
 
 /*
  * XXX - Since ASC38C1600 Rev.3 has a local RAM failure issue, there is
@@ -2440,9 +2417,9 @@ typedef struct adveep_38C1600_config
  *
  * #define ADV_38C1600_MEMSIZE  0x8000L   * 32 KB Internal Memory *
  */
-#define ADV_38C1600_MEMSIZE  0x4000   /* 16 KB Internal Memory */
-#define ADV_38C1600_IOLEN    0x100     /* I/O Port Range 256 bytes */
-#define ADV_38C1600_MEMLEN   0x1000    /* Memory Range 4KB bytes */
+#define ADV_38C1600_MEMSIZE  0x4000    /* 16 KB Internal Memory */
+#define ADV_38C1600_IOLEN    0x100     /* I/O Port Range 256 bytes */
+#define ADV_38C1600_MEMLEN   0x1000    /* Memory Range 4KB bytes */
 
 /*
  * Byte I/O register address from base of 'iop_base'.
@@ -2515,39 +2492,39 @@ typedef struct adveep_38C1600_config
 /*
  * Word I/O register address from base of 'iop_base'.
  */
-#define IOPW_CHIP_ID_0          0x00  /* CID0  */
-#define IOPW_CTRL_REG           0x02  /* CC    */
-#define IOPW_RAM_ADDR           0x04  /* LA    */
-#define IOPW_RAM_DATA           0x06  /* LD    */
+#define IOPW_CHIP_ID_0          0x00   /* CID0  */
+#define IOPW_CTRL_REG           0x02   /* CC    */
+#define IOPW_RAM_ADDR           0x04   /* LA    */
+#define IOPW_RAM_DATA           0x06   /* LD    */
 #define IOPW_RES_ADDR_08        0x08
-#define IOPW_RISC_CSR           0x0A  /* CSR   */
-#define IOPW_SCSI_CFG0          0x0C  /* CFG0  */
-#define IOPW_SCSI_CFG1          0x0E  /* CFG1  */
+#define IOPW_RISC_CSR           0x0A   /* CSR   */
+#define IOPW_SCSI_CFG0          0x0C   /* CFG0  */
+#define IOPW_SCSI_CFG1          0x0E   /* CFG1  */
 #define IOPW_RES_ADDR_10        0x10
-#define IOPW_SEL_MASK           0x12  /* SM    */
+#define IOPW_SEL_MASK           0x12   /* SM    */
 #define IOPW_RES_ADDR_14        0x14
-#define IOPW_FLASH_ADDR         0x16  /* FA    */
+#define IOPW_FLASH_ADDR         0x16   /* FA    */
 #define IOPW_RES_ADDR_18        0x18
-#define IOPW_EE_CMD             0x1A  /* EC    */
-#define IOPW_EE_DATA            0x1C  /* ED    */
-#define IOPW_SFIFO_CNT          0x1E  /* SFC   */
+#define IOPW_EE_CMD             0x1A   /* EC    */
+#define IOPW_EE_DATA            0x1C   /* ED    */
+#define IOPW_SFIFO_CNT          0x1E   /* SFC   */
 #define IOPW_RES_ADDR_20        0x20
-#define IOPW_Q_BASE             0x22  /* QB    */
-#define IOPW_QP                 0x24  /* QP    */
-#define IOPW_IX                 0x26  /* IX    */
-#define IOPW_SP                 0x28  /* SP    */
-#define IOPW_PC                 0x2A  /* PC    */
+#define IOPW_Q_BASE             0x22   /* QB    */
+#define IOPW_QP                 0x24   /* QP    */
+#define IOPW_IX                 0x26   /* IX    */
+#define IOPW_SP                 0x28   /* SP    */
+#define IOPW_PC                 0x2A   /* PC    */
 #define IOPW_RES_ADDR_2C        0x2C
 #define IOPW_RES_ADDR_2E        0x2E
-#define IOPW_SCSI_DATA          0x30  /* SD    */
-#define IOPW_SCSI_DATA_HSHK     0x32  /* SDH   */
-#define IOPW_SCSI_CTRL          0x34  /* SC    */
-#define IOPW_HSHK_CFG           0x36  /* HCFG  */
-#define IOPW_SXFR_STATUS        0x36  /* SXS   */
-#define IOPW_SXFR_CNTL          0x38  /* SXL   */
-#define IOPW_SXFR_CNTH          0x3A  /* SXH   */
+#define IOPW_SCSI_DATA          0x30   /* SD    */
+#define IOPW_SCSI_DATA_HSHK     0x32   /* SDH   */
+#define IOPW_SCSI_CTRL          0x34   /* SC    */
+#define IOPW_HSHK_CFG           0x36   /* HCFG  */
+#define IOPW_SXFR_STATUS        0x36   /* SXS   */
+#define IOPW_SXFR_CNTL          0x38   /* SXL   */
+#define IOPW_SXFR_CNTH          0x3A   /* SXH   */
 #define IOPW_RES_ADDR_3C        0x3C
-#define IOPW_RFIFO_DATA         0x3E  /* RFD   */
+#define IOPW_RFIFO_DATA         0x3E   /* RFD   */
 
 /*
  * Doubleword I/O register address from base of 'iop_base'.
@@ -2621,36 +2598,36 @@ typedef struct adveep_38C1600_config
 /*
  * SCSI_CFG0 Register bit definitions
  */
-#define TIMER_MODEAB    0xC000  /* Watchdog, Second, and Select. Timer Ctrl. */
-#define PARITY_EN       0x2000  /* Enable SCSI Parity Error detection */
-#define EVEN_PARITY     0x1000  /* Select Even Parity */
-#define WD_LONG         0x0800  /* Watchdog Interval, 1: 57 min, 0: 13 sec */
-#define QUEUE_128       0x0400  /* Queue Size, 1: 128 byte, 0: 64 byte */
-#define PRIM_MODE       0x0100  /* Primitive SCSI mode */
-#define SCAM_EN         0x0080  /* Enable SCAM selection */
-#define SEL_TMO_LONG    0x0040  /* Sel/Resel Timeout, 1: 400 ms, 0: 1.6 ms */
-#define CFRM_ID         0x0020  /* SCAM id sel. confirm., 1: fast, 0: 6.4 ms */
-#define OUR_ID_EN       0x0010  /* Enable OUR_ID bits */
-#define OUR_ID          0x000F  /* SCSI ID */
+#define TIMER_MODEAB    0xC000 /* Watchdog, Second, and Select. Timer Ctrl. */
+#define PARITY_EN       0x2000 /* Enable SCSI Parity Error detection */
+#define EVEN_PARITY     0x1000 /* Select Even Parity */
+#define WD_LONG         0x0800 /* Watchdog Interval, 1: 57 min, 0: 13 sec */
+#define QUEUE_128       0x0400 /* Queue Size, 1: 128 byte, 0: 64 byte */
+#define PRIM_MODE       0x0100 /* Primitive SCSI mode */
+#define SCAM_EN         0x0080 /* Enable SCAM selection */
+#define SEL_TMO_LONG    0x0040 /* Sel/Resel Timeout, 1: 400 ms, 0: 1.6 ms */
+#define CFRM_ID         0x0020 /* SCAM id sel. confirm., 1: fast, 0: 6.4 ms */
+#define OUR_ID_EN       0x0010 /* Enable OUR_ID bits */
+#define OUR_ID          0x000F /* SCSI ID */
 
 /*
  * SCSI_CFG1 Register bit definitions
  */
-#define BIG_ENDIAN      0x8000  /* Enable Big Endian Mode MIO:15, EEP:15 */
-#define TERM_POL        0x2000  /* Terminator Polarity Ctrl. MIO:13, EEP:13 */
-#define SLEW_RATE       0x1000  /* SCSI output buffer slew rate */
-#define FILTER_SEL      0x0C00  /* Filter Period Selection */
-#define  FLTR_DISABLE    0x0000  /* Input Filtering Disabled */
-#define  FLTR_11_TO_20NS 0x0800  /* Input Filtering 11ns to 20ns */
-#define  FLTR_21_TO_39NS 0x0C00  /* Input Filtering 21ns to 39ns */
-#define ACTIVE_DBL      0x0200  /* Disable Active Negation */
-#define DIFF_MODE       0x0100  /* SCSI differential Mode (Read-Only) */
-#define DIFF_SENSE      0x0080  /* 1: No SE cables, 0: SE cable (Read-Only) */
-#define TERM_CTL_SEL    0x0040  /* Enable TERM_CTL_H and TERM_CTL_L */
-#define TERM_CTL        0x0030  /* External SCSI Termination Bits */
-#define  TERM_CTL_H      0x0020  /* Enable External SCSI Upper Termination */
-#define  TERM_CTL_L      0x0010  /* Enable External SCSI Lower Termination */
-#define CABLE_DETECT    0x000F  /* External SCSI Cable Connection Status */
+#define BIG_ENDIAN      0x8000 /* Enable Big Endian Mode MIO:15, EEP:15 */
+#define TERM_POL        0x2000 /* Terminator Polarity Ctrl. MIO:13, EEP:13 */
+#define SLEW_RATE       0x1000 /* SCSI output buffer slew rate */
+#define FILTER_SEL      0x0C00 /* Filter Period Selection */
+#define  FLTR_DISABLE    0x0000        /* Input Filtering Disabled */
+#define  FLTR_11_TO_20NS 0x0800        /* Input Filtering 11ns to 20ns */
+#define  FLTR_21_TO_39NS 0x0C00        /* Input Filtering 21ns to 39ns */
+#define ACTIVE_DBL      0x0200 /* Disable Active Negation */
+#define DIFF_MODE       0x0100 /* SCSI differential Mode (Read-Only) */
+#define DIFF_SENSE      0x0080 /* 1: No SE cables, 0: SE cable (Read-Only) */
+#define TERM_CTL_SEL    0x0040 /* Enable TERM_CTL_H and TERM_CTL_L */
+#define TERM_CTL        0x0030 /* External SCSI Termination Bits */
+#define  TERM_CTL_H      0x0020        /* Enable External SCSI Upper Termination */
+#define  TERM_CTL_L      0x0010        /* Enable External SCSI Lower Termination */
+#define CABLE_DETECT    0x000F /* External SCSI Cable Connection Status */
 
 /*
  * Addendum for ASC-38C0800 Chip
@@ -2663,24 +2640,23 @@ typedef struct adveep_38C1600_config
  * Also each ASC-38C1600 function or channel uses only cable bits [5:4]
  * and [1:0]. Bits [14], [7:6], [3:2] are unused.
  */
-#define DIS_TERM_DRV    0x4000  /* 1: Read c_det[3:0], 0: cannot read */
-#define HVD_LVD_SE      0x1C00  /* Device Detect Bits */
-#define  HVD             0x1000  /* HVD Device Detect */
-#define  LVD             0x0800  /* LVD Device Detect */
-#define  SE              0x0400  /* SE Device Detect */
-#define TERM_LVD        0x00C0  /* LVD Termination Bits */
-#define  TERM_LVD_HI     0x0080  /* Enable LVD Upper Termination */
-#define  TERM_LVD_LO     0x0040  /* Enable LVD Lower Termination */
-#define TERM_SE         0x0030  /* SE Termination Bits */
-#define  TERM_SE_HI      0x0020  /* Enable SE Upper Termination */
-#define  TERM_SE_LO      0x0010  /* Enable SE Lower Termination */
-#define C_DET_LVD       0x000C  /* LVD Cable Detect Bits */
-#define  C_DET3          0x0008  /* Cable Detect for LVD External Wide */
-#define  C_DET2          0x0004  /* Cable Detect for LVD Internal Wide */
-#define C_DET_SE        0x0003  /* SE Cable Detect Bits */
-#define  C_DET1          0x0002  /* Cable Detect for SE Internal Wide */
-#define  C_DET0          0x0001  /* Cable Detect for SE Internal Narrow */
-
+#define DIS_TERM_DRV    0x4000 /* 1: Read c_det[3:0], 0: cannot read */
+#define HVD_LVD_SE      0x1C00 /* Device Detect Bits */
+#define  HVD             0x1000        /* HVD Device Detect */
+#define  LVD             0x0800        /* LVD Device Detect */
+#define  SE              0x0400        /* SE Device Detect */
+#define TERM_LVD        0x00C0 /* LVD Termination Bits */
+#define  TERM_LVD_HI     0x0080        /* Enable LVD Upper Termination */
+#define  TERM_LVD_LO     0x0040        /* Enable LVD Lower Termination */
+#define TERM_SE         0x0030 /* SE Termination Bits */
+#define  TERM_SE_HI      0x0020        /* Enable SE Upper Termination */
+#define  TERM_SE_LO      0x0010        /* Enable SE Lower Termination */
+#define C_DET_LVD       0x000C /* LVD Cable Detect Bits */
+#define  C_DET3          0x0008        /* Cable Detect for LVD External Wide */
+#define  C_DET2          0x0004        /* Cable Detect for LVD Internal Wide */
+#define C_DET_SE        0x0003 /* SE Cable Detect Bits */
+#define  C_DET1          0x0002        /* Cable Detect for SE Internal Wide */
+#define  C_DET0          0x0001        /* Cable Detect for SE Internal Narrow */
 
 #define CABLE_ILLEGAL_A 0x7
     /* x 0 0 0  | on  on | Illegal (all 3 connectors are used) */
@@ -2691,39 +2667,39 @@ typedef struct adveep_38C1600_config
 /*
  * MEM_CFG Register bit definitions
  */
-#define BIOS_EN         0x40    /* BIOS Enable MIO:14,EEP:14 */
-#define FAST_EE_CLK     0x20    /* Diagnostic Bit */
-#define RAM_SZ          0x1C    /* Specify size of RAM to RISC */
-#define  RAM_SZ_2KB      0x00    /* 2 KB */
-#define  RAM_SZ_4KB      0x04    /* 4 KB */
-#define  RAM_SZ_8KB      0x08    /* 8 KB */
-#define  RAM_SZ_16KB     0x0C    /* 16 KB */
-#define  RAM_SZ_32KB     0x10    /* 32 KB */
-#define  RAM_SZ_64KB     0x14    /* 64 KB */
+#define BIOS_EN         0x40   /* BIOS Enable MIO:14,EEP:14 */
+#define FAST_EE_CLK     0x20   /* Diagnostic Bit */
+#define RAM_SZ          0x1C   /* Specify size of RAM to RISC */
+#define  RAM_SZ_2KB      0x00  /* 2 KB */
+#define  RAM_SZ_4KB      0x04  /* 4 KB */
+#define  RAM_SZ_8KB      0x08  /* 8 KB */
+#define  RAM_SZ_16KB     0x0C  /* 16 KB */
+#define  RAM_SZ_32KB     0x10  /* 32 KB */
+#define  RAM_SZ_64KB     0x14  /* 64 KB */
 
 /*
  * DMA_CFG0 Register bit definitions
  *
  * This register is only accessible to the host.
  */
-#define BC_THRESH_ENB   0x80    /* PCI DMA Start Conditions */
-#define FIFO_THRESH     0x70    /* PCI DMA FIFO Threshold */
-#define  FIFO_THRESH_16B  0x00   /* 16 bytes */
-#define  FIFO_THRESH_32B  0x20   /* 32 bytes */
-#define  FIFO_THRESH_48B  0x30   /* 48 bytes */
-#define  FIFO_THRESH_64B  0x40   /* 64 bytes */
-#define  FIFO_THRESH_80B  0x50   /* 80 bytes (default) */
-#define  FIFO_THRESH_96B  0x60   /* 96 bytes */
-#define  FIFO_THRESH_112B 0x70   /* 112 bytes */
-#define START_CTL       0x0C    /* DMA start conditions */
-#define  START_CTL_TH    0x00    /* Wait threshold level (default) */
-#define  START_CTL_ID    0x04    /* Wait SDMA/SBUS idle */
-#define  START_CTL_THID  0x08    /* Wait threshold and SDMA/SBUS idle */
-#define  START_CTL_EMFU  0x0C    /* Wait SDMA FIFO empty/full */
-#define READ_CMD        0x03    /* Memory Read Method */
-#define  READ_CMD_MR     0x00    /* Memory Read */
-#define  READ_CMD_MRL    0x02    /* Memory Read Long */
-#define  READ_CMD_MRM    0x03    /* Memory Read Multiple (default) */
+#define BC_THRESH_ENB   0x80   /* PCI DMA Start Conditions */
+#define FIFO_THRESH     0x70   /* PCI DMA FIFO Threshold */
+#define  FIFO_THRESH_16B  0x00 /* 16 bytes */
+#define  FIFO_THRESH_32B  0x20 /* 32 bytes */
+#define  FIFO_THRESH_48B  0x30 /* 48 bytes */
+#define  FIFO_THRESH_64B  0x40 /* 64 bytes */
+#define  FIFO_THRESH_80B  0x50 /* 80 bytes (default) */
+#define  FIFO_THRESH_96B  0x60 /* 96 bytes */
+#define  FIFO_THRESH_112B 0x70 /* 112 bytes */
+#define START_CTL       0x0C   /* DMA start conditions */
+#define  START_CTL_TH    0x00  /* Wait threshold level (default) */
+#define  START_CTL_ID    0x04  /* Wait SDMA/SBUS idle */
+#define  START_CTL_THID  0x08  /* Wait threshold and SDMA/SBUS idle */
+#define  START_CTL_EMFU  0x0C  /* Wait SDMA FIFO empty/full */
+#define READ_CMD        0x03   /* Memory Read Method */
+#define  READ_CMD_MR     0x00  /* Memory Read */
+#define  READ_CMD_MRL    0x02  /* Memory Read Long */
+#define  READ_CMD_MRM    0x03  /* Memory Read Multiple (default) */
 
 /*
  * ASC-38C0800 RAM BIST Register bit definitions
@@ -2747,7 +2723,7 @@ typedef struct adveep_38C1600_config
  * IOPB_PCI_INT_CFG Bit Field Definitions
  */
 
-#define INTAB_LD        0x80    /* Value loaded from EEPROM Bit 11. */
+#define INTAB_LD        0x80   /* Value loaded from EEPROM Bit 11. */
 
 /*
  * Bit 1 can be set to change the interrupt for the Function to operate in
@@ -2780,53 +2756,52 @@ typedef struct adveep_38C1600_config
 #define ADV_BUSY        0
 #define ADV_ERROR       (-1)
 
-
 /*
  * ADV_DVC_VAR 'warn_code' values
  */
-#define ASC_WARN_BUSRESET_ERROR         0x0001 /* SCSI Bus Reset error */
-#define ASC_WARN_EEPROM_CHKSUM          0x0002 /* EEP check sum error */
-#define ASC_WARN_EEPROM_TERMINATION     0x0004 /* EEP termination bad field */
-#define ASC_WARN_SET_PCI_CONFIG_SPACE   0x0080 /* PCI config space set error */
-#define ASC_WARN_ERROR                  0xFFFF /* ADV_ERROR return */
+#define ASC_WARN_BUSRESET_ERROR         0x0001 /* SCSI Bus Reset error */
+#define ASC_WARN_EEPROM_CHKSUM          0x0002 /* EEP check sum error */
+#define ASC_WARN_EEPROM_TERMINATION     0x0004 /* EEP termination bad field */
+#define ASC_WARN_SET_PCI_CONFIG_SPACE   0x0080 /* PCI config space set error */
+#define ASC_WARN_ERROR                  0xFFFF /* ADV_ERROR return */
 
-#define ADV_MAX_TID                     15 /* max. target identifier */
-#define ADV_MAX_LUN                     7  /* max. logical unit number */
+#define ADV_MAX_TID                     15     /* max. target identifier */
+#define ADV_MAX_LUN                     7      /* max. logical unit number */
 
 /*
  * Error code values are set in ADV_DVC_VAR 'err_code'.
  */
-#define ASC_IERR_WRITE_EEPROM       0x0001 /* write EEPROM error */
-#define ASC_IERR_MCODE_CHKSUM       0x0002 /* micro code check sum error */
-#define ASC_IERR_NO_CARRIER         0x0004 /* No more carrier memory. */
-#define ASC_IERR_START_STOP_CHIP    0x0008 /* start/stop chip failed */
-#define ASC_IERR_CHIP_VERSION       0x0040 /* wrong chip version */
-#define ASC_IERR_SET_SCSI_ID        0x0080 /* set SCSI ID failed */
-#define ASC_IERR_HVD_DEVICE         0x0100 /* HVD attached to LVD connector. */
-#define ASC_IERR_BAD_SIGNATURE      0x0200 /* signature not found */
-#define ASC_IERR_ILLEGAL_CONNECTION 0x0400 /* Illegal cable connection */
-#define ASC_IERR_SINGLE_END_DEVICE  0x0800 /* Single-end used w/differential */
-#define ASC_IERR_REVERSED_CABLE     0x1000 /* Narrow flat cable reversed */
-#define ASC_IERR_BIST_PRE_TEST      0x2000 /* BIST pre-test error */
-#define ASC_IERR_BIST_RAM_TEST      0x4000 /* BIST RAM test error */
-#define ASC_IERR_BAD_CHIPTYPE       0x8000 /* Invalid 'chip_type' setting. */
+#define ASC_IERR_WRITE_EEPROM       0x0001     /* write EEPROM error */
+#define ASC_IERR_MCODE_CHKSUM       0x0002     /* micro code check sum error */
+#define ASC_IERR_NO_CARRIER         0x0004     /* No more carrier memory. */
+#define ASC_IERR_START_STOP_CHIP    0x0008     /* start/stop chip failed */
+#define ASC_IERR_CHIP_VERSION       0x0040     /* wrong chip version */
+#define ASC_IERR_SET_SCSI_ID        0x0080     /* set SCSI ID failed */
+#define ASC_IERR_HVD_DEVICE         0x0100     /* HVD attached to LVD connector. */
+#define ASC_IERR_BAD_SIGNATURE      0x0200     /* signature not found */
+#define ASC_IERR_ILLEGAL_CONNECTION 0x0400     /* Illegal cable connection */
+#define ASC_IERR_SINGLE_END_DEVICE  0x0800     /* Single-end used w/differential */
+#define ASC_IERR_REVERSED_CABLE     0x1000     /* Narrow flat cable reversed */
+#define ASC_IERR_BIST_PRE_TEST      0x2000     /* BIST pre-test error */
+#define ASC_IERR_BIST_RAM_TEST      0x4000     /* BIST RAM test error */
+#define ASC_IERR_BAD_CHIPTYPE       0x8000     /* Invalid 'chip_type' setting. */
 
 /*
  * Fixed locations of microcode operating variables.
  */
-#define ASC_MC_CODE_BEGIN_ADDR          0x0028 /* microcode start address */
-#define ASC_MC_CODE_END_ADDR            0x002A /* microcode end address */
-#define ASC_MC_CODE_CHK_SUM             0x002C /* microcode code checksum */
-#define ASC_MC_VERSION_DATE             0x0038 /* microcode version */
-#define ASC_MC_VERSION_NUM              0x003A /* microcode number */
-#define ASC_MC_BIOSMEM                  0x0040 /* BIOS RISC Memory Start */
-#define ASC_MC_BIOSLEN                  0x0050 /* BIOS RISC Memory Length */
-#define ASC_MC_BIOS_SIGNATURE           0x0058 /* BIOS Signature 0x55AA */
-#define ASC_MC_BIOS_VERSION             0x005A /* BIOS Version (2 bytes) */
-#define ASC_MC_SDTR_SPEED1              0x0090 /* SDTR Speed for TID 0-3 */
-#define ASC_MC_SDTR_SPEED2              0x0092 /* SDTR Speed for TID 4-7 */
-#define ASC_MC_SDTR_SPEED3              0x0094 /* SDTR Speed for TID 8-11 */
-#define ASC_MC_SDTR_SPEED4              0x0096 /* SDTR Speed for TID 12-15 */
+#define ASC_MC_CODE_BEGIN_ADDR          0x0028 /* microcode start address */
+#define ASC_MC_CODE_END_ADDR            0x002A /* microcode end address */
+#define ASC_MC_CODE_CHK_SUM             0x002C /* microcode code checksum */
+#define ASC_MC_VERSION_DATE             0x0038 /* microcode version */
+#define ASC_MC_VERSION_NUM              0x003A /* microcode number */
+#define ASC_MC_BIOSMEM                  0x0040 /* BIOS RISC Memory Start */
+#define ASC_MC_BIOSLEN                  0x0050 /* BIOS RISC Memory Length */
+#define ASC_MC_BIOS_SIGNATURE           0x0058 /* BIOS Signature 0x55AA */
+#define ASC_MC_BIOS_VERSION             0x005A /* BIOS Version (2 bytes) */
+#define ASC_MC_SDTR_SPEED1              0x0090 /* SDTR Speed for TID 0-3 */
+#define ASC_MC_SDTR_SPEED2              0x0092 /* SDTR Speed for TID 4-7 */
+#define ASC_MC_SDTR_SPEED3              0x0094 /* SDTR Speed for TID 8-11 */
+#define ASC_MC_SDTR_SPEED4              0x0096 /* SDTR Speed for TID 12-15 */
 #define ASC_MC_CHIP_TYPE                0x009A
 #define ASC_MC_INTRB_CODE               0x009B
 #define ASC_MC_WDTR_ABLE                0x009C
@@ -2844,9 +2819,9 @@ typedef struct adveep_38C1600_config
 #define ASC_MC_NUMBER_OF_QUEUED_CMD     0x00C0
 #define ASC_MC_NUMBER_OF_MAX_CMD        0x00D0
 #define ASC_MC_DEVICE_HSHK_CFG_TABLE    0x0100
-#define ASC_MC_CONTROL_FLAG             0x0122 /* Microcode control flag. */
+#define ASC_MC_CONTROL_FLAG             0x0122 /* Microcode control flag. */
 #define ASC_MC_WDTR_DONE                0x0124
-#define ASC_MC_CAM_MODE_MASK            0x015E /* CAM mode TID bitmask. */
+#define ASC_MC_CAM_MODE_MASK            0x015E /* CAM mode TID bitmask. */
 #define ASC_MC_ICQ                      0x0160
 #define ASC_MC_IRQ                      0x0164
 #define ASC_MC_PPR_ABLE                 0x017A
@@ -2865,8 +2840,8 @@ typedef struct adveep_38C1600_config
  * Flags set by the Adv Library in RISC variable 'control_flag' (0x122)
  * and handled by the microcode.
  */
-#define CONTROL_FLAG_IGNORE_PERR        0x0001 /* Ignore DMA Parity Errors */
-#define CONTROL_FLAG_ENABLE_AIPP        0x0002 /* Enabled AIPP checking. */
+#define CONTROL_FLAG_IGNORE_PERR        0x0001 /* Ignore DMA Parity Errors */
+#define CONTROL_FLAG_ENABLE_AIPP        0x0002 /* Enabled AIPP checking. */
 
 /*
  * ASC_MC_DEVICE_HSHK_CFG_TABLE microcode table or HSHK_CFG register format
@@ -2875,45 +2850,44 @@ typedef struct adveep_38C1600_config
 #define HSHK_CFG_RATE           0x0F00
 #define HSHK_CFG_OFFSET         0x001F
 
-#define ASC_DEF_MAX_HOST_QNG    0xFD /* Max. number of host commands (253) */
-#define ASC_DEF_MIN_HOST_QNG    0x10 /* Min. number of host commands (16) */
-#define ASC_DEF_MAX_DVC_QNG     0x3F /* Max. number commands per device (63) */
-#define ASC_DEF_MIN_DVC_QNG     0x04 /* Min. number commands per device (4) */
-
-#define ASC_QC_DATA_CHECK  0x01 /* Require ASC_QC_DATA_OUT set or clear. */
-#define ASC_QC_DATA_OUT    0x02 /* Data out DMA transfer. */
-#define ASC_QC_START_MOTOR 0x04 /* Send auto-start motor before request. */
-#define ASC_QC_NO_OVERRUN  0x08 /* Don't report overrun. */
-#define ASC_QC_FREEZE_TIDQ 0x10 /* Freeze TID queue after request. XXX TBD */
-
-#define ASC_QSC_NO_DISC     0x01 /* Don't allow disconnect for request. */
-#define ASC_QSC_NO_TAGMSG   0x02 /* Don't allow tag queuing for request. */
-#define ASC_QSC_NO_SYNC     0x04 /* Don't use Synch. transfer on request. */
-#define ASC_QSC_NO_WIDE     0x08 /* Don't use Wide transfer on request. */
-#define ASC_QSC_REDO_DTR    0x10 /* Renegotiate WDTR/SDTR before request. */
+#define ASC_DEF_MAX_HOST_QNG    0xFD   /* Max. number of host commands (253) */
+#define ASC_DEF_MIN_HOST_QNG    0x10   /* Min. number of host commands (16) */
+#define ASC_DEF_MAX_DVC_QNG     0x3F   /* Max. number commands per device (63) */
+#define ASC_DEF_MIN_DVC_QNG     0x04   /* Min. number commands per device (4) */
+
+#define ASC_QC_DATA_CHECK  0x01        /* Require ASC_QC_DATA_OUT set or clear. */
+#define ASC_QC_DATA_OUT    0x02        /* Data out DMA transfer. */
+#define ASC_QC_START_MOTOR 0x04        /* Send auto-start motor before request. */
+#define ASC_QC_NO_OVERRUN  0x08        /* Don't report overrun. */
+#define ASC_QC_FREEZE_TIDQ 0x10        /* Freeze TID queue after request. XXX TBD */
+
+#define ASC_QSC_NO_DISC     0x01       /* Don't allow disconnect for request. */
+#define ASC_QSC_NO_TAGMSG   0x02       /* Don't allow tag queuing for request. */
+#define ASC_QSC_NO_SYNC     0x04       /* Don't use Synch. transfer on request. */
+#define ASC_QSC_NO_WIDE     0x08       /* Don't use Wide transfer on request. */
+#define ASC_QSC_REDO_DTR    0x10       /* Renegotiate WDTR/SDTR before request. */
 /*
  * Note: If a Tag Message is to be sent and neither ASC_QSC_HEAD_TAG or
  * ASC_QSC_ORDERED_TAG is set, then a Simple Tag Message (0x20) is used.
  */
-#define ASC_QSC_HEAD_TAG    0x40 /* Use Head Tag Message (0x21). */
-#define ASC_QSC_ORDERED_TAG 0x80 /* Use Ordered Tag Message (0x22). */
+#define ASC_QSC_HEAD_TAG    0x40       /* Use Head Tag Message (0x21). */
+#define ASC_QSC_ORDERED_TAG 0x80       /* Use Ordered Tag Message (0x22). */
 
 /*
  * All fields here are accessed by the board microcode and need to be
  * little-endian.
  */
-typedef struct adv_carr_t
-{
-    ADV_VADDR   carr_va;       /* Carrier Virtual Address */
-    ADV_PADDR   carr_pa;       /* Carrier Physical Address */
-    ADV_VADDR   areq_vpa;      /* ASC_SCSI_REQ_Q Virtual or Physical Address */
-    /*
-     * next_vpa [31:4]            Carrier Virtual or Physical Next Pointer
-     *
-     * next_vpa [3:1]             Reserved Bits
-     * next_vpa [0]               Done Flag set in Response Queue.
-     */
-    ADV_VADDR   next_vpa;
+typedef struct adv_carr_t {
+       ADV_VADDR carr_va;      /* Carrier Virtual Address */
+       ADV_PADDR carr_pa;      /* Carrier Physical Address */
+       ADV_VADDR areq_vpa;     /* ASC_SCSI_REQ_Q Virtual or Physical Address */
+       /*
+        * next_vpa [31:4]            Carrier Virtual or Physical Next Pointer
+        *
+        * next_vpa [3:1]             Reserved Bits
+        * next_vpa [0]               Done Flag set in Response Queue.
+        */
+       ADV_VADDR next_vpa;
 } ADV_CARR_T;
 
 /*
@@ -2940,13 +2914,13 @@ typedef struct adv_carr_t
  * The Adv Library should limit use to the lower nibble (4 bits) of
  * a_flag. Drivers are free to use the upper nibble (4 bits) of a_flag.
  */
-#define ADV_POLL_REQUEST                0x01   /* poll for request completion */
-#define ADV_SCSIQ_DONE                  0x02   /* request done */
-#define ADV_DONT_RETRY                  0x08   /* don't do retry */
+#define ADV_POLL_REQUEST                0x01   /* poll for request completion */
+#define ADV_SCSIQ_DONE                  0x02   /* request done */
+#define ADV_DONT_RETRY                  0x08   /* don't do retry */
 
-#define ADV_CHIP_ASC3550          0x01   /* Ultra-Wide IC */
-#define ADV_CHIP_ASC38C0800       0x02   /* Ultra2-Wide/LVD IC */
-#define ADV_CHIP_ASC38C1600       0x03   /* Ultra3-Wide/LVD2 IC */
+#define ADV_CHIP_ASC3550          0x01 /* Ultra-Wide IC */
+#define ADV_CHIP_ASC38C0800       0x02 /* Ultra2-Wide/LVD IC */
+#define ADV_CHIP_ASC38C1600       0x03 /* Ultra3-Wide/LVD2 IC */
 
 /*
  * Adapter temporary configuration structure
@@ -2960,30 +2934,30 @@ typedef struct adv_carr_t
  *  value of the field is never reset.
  */
 typedef struct adv_dvc_cfg {
-  ushort disc_enable;       /* enable disconnection */
-  uchar  chip_version;      /* chip version */
-  uchar  termination;       /* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */
-  ushort lib_version;       /* Adv Library version number */
-  ushort control_flag;      /* Microcode Control Flag */
-  ushort mcode_date;        /* Microcode date */
-  ushort mcode_version;     /* Microcode version */
-  ushort pci_slot_info;     /* high byte device/function number */
-                            /* bits 7-3 device num., bits 2-0 function num. */
-                            /* low byte bus num. */
-  ushort serial1;           /* EEPROM serial number word 1 */
-  ushort serial2;           /* EEPROM serial number word 2 */
-  ushort serial3;           /* EEPROM serial number word 3 */
-  struct device *dev;  /* pointer to the pci dev structure for this board */
+       ushort disc_enable;     /* enable disconnection */
+       uchar chip_version;     /* chip version */
+       uchar termination;      /* Term. Ctrl. bits 6-5 of SCSI_CFG1 register */
+       ushort lib_version;     /* Adv Library version number */
+       ushort control_flag;    /* Microcode Control Flag */
+       ushort mcode_date;      /* Microcode date */
+       ushort mcode_version;   /* Microcode version */
+       ushort pci_slot_info;   /* high byte device/function number */
+       /* bits 7-3 device num., bits 2-0 function num. */
+       /* low byte bus num. */
+       ushort serial1;         /* EEPROM serial number word 1 */
+       ushort serial2;         /* EEPROM serial number word 2 */
+       ushort serial3;         /* EEPROM serial number word 3 */
+       struct device *dev;     /* pointer to the pci dev structure for this board */
 } ADV_DVC_CFG;
 
 struct adv_dvc_var;
 struct adv_scsi_req_q;
 
-typedef void (* ADV_ISR_CALLBACK)
   (struct adv_dvc_var *, struct adv_scsi_req_q *);
+typedef void (*ADV_ISR_CALLBACK)
+ (struct adv_dvc_var *, struct adv_scsi_req_q *);
 
-typedef void (* ADV_ASYNC_CALLBACK)
   (struct adv_dvc_var *, uchar);
+typedef void (*ADV_ASYNC_CALLBACK)
+ (struct adv_dvc_var *, uchar);
 
 /*
  * Adapter operation variable structure.
@@ -2998,55 +2972,55 @@ typedef void (* ADV_ASYNC_CALLBACK)
  *  of the feature, the field is cleared.
  */
 typedef struct adv_dvc_var {
-  AdvPortAddr iop_base;   /* I/O port address */
-  ushort err_code;        /* fatal error code */
-  ushort bios_ctrl;       /* BIOS control word, EEPROM word 12 */
-  ADV_ISR_CALLBACK isr_callback;
-  ADV_ASYNC_CALLBACK async_callback;
-  ushort wdtr_able;       /* try WDTR for a device */
-  ushort sdtr_able;       /* try SDTR for a device */
-  ushort ultra_able;      /* try SDTR Ultra speed for a device */
-  ushort sdtr_speed1;     /* EEPROM SDTR Speed for TID 0-3   */
-  ushort sdtr_speed2;     /* EEPROM SDTR Speed for TID 4-7   */
-  ushort sdtr_speed3;     /* EEPROM SDTR Speed for TID 8-11  */
-  ushort sdtr_speed4;     /* EEPROM SDTR Speed for TID 12-15 */
-  ushort tagqng_able;     /* try tagged queuing with a device */
-  ushort ppr_able;        /* PPR message capable per TID bitmask. */
-  uchar  max_dvc_qng;     /* maximum number of tagged commands per device */
-  ushort start_motor;     /* start motor command allowed */
-  uchar  scsi_reset_wait; /* delay in seconds after scsi bus reset */
-  uchar  chip_no;         /* should be assigned by caller */
-  uchar  max_host_qng;    /* maximum number of Q'ed command allowed */
-  uchar  irq_no;          /* IRQ number */
-  ushort no_scam;         /* scam_tolerant of EEPROM */
-  struct asc_board *drv_ptr; /* driver pointer to private structure */
-  uchar  chip_scsi_id;    /* chip SCSI target ID */
-  uchar  chip_type;
-  uchar  bist_err_code;
-  ADV_CARR_T *carrier_buf;
-  ADV_CARR_T *carr_freelist; /* Carrier free list. */
-  ADV_CARR_T *icq_sp;  /* Initiator command queue stopper pointer. */
-  ADV_CARR_T *irq_sp;  /* Initiator response queue stopper pointer. */
-  ushort carr_pending_cnt;    /* Count of pending carriers. */
- /*
-  * Note: The following fields will not be used after initialization. The
-  * driver may discard the buffer after initialization is done.
-  */
-  ADV_DVC_CFG *cfg; /* temporary configuration structure  */
+       AdvPortAddr iop_base;   /* I/O port address */
+       ushort err_code;        /* fatal error code */
+       ushort bios_ctrl;       /* BIOS control word, EEPROM word 12 */
+       ADV_ISR_CALLBACK isr_callback;
+       ADV_ASYNC_CALLBACK async_callback;
+       ushort wdtr_able;       /* try WDTR for a device */
+       ushort sdtr_able;       /* try SDTR for a device */
+       ushort ultra_able;      /* try SDTR Ultra speed for a device */
+       ushort sdtr_speed1;     /* EEPROM SDTR Speed for TID 0-3   */
+       ushort sdtr_speed2;     /* EEPROM SDTR Speed for TID 4-7   */
+       ushort sdtr_speed3;     /* EEPROM SDTR Speed for TID 8-11  */
+       ushort sdtr_speed4;     /* EEPROM SDTR Speed for TID 12-15 */
+       ushort tagqng_able;     /* try tagged queuing with a device */
+       ushort ppr_able;        /* PPR message capable per TID bitmask. */
+       uchar max_dvc_qng;      /* maximum number of tagged commands per device */
+       ushort start_motor;     /* start motor command allowed */
+       uchar scsi_reset_wait;  /* delay in seconds after scsi bus reset */
+       uchar chip_no;          /* should be assigned by caller */
+       uchar max_host_qng;     /* maximum number of Q'ed command allowed */
+       uchar irq_no;           /* IRQ number */
+       ushort no_scam;         /* scam_tolerant of EEPROM */
+       struct asc_board *drv_ptr;      /* driver pointer to private structure */
+       uchar chip_scsi_id;     /* chip SCSI target ID */
+       uchar chip_type;
+       uchar bist_err_code;
+       ADV_CARR_T *carrier_buf;
+       ADV_CARR_T *carr_freelist;      /* Carrier free list. */
+       ADV_CARR_T *icq_sp;     /* Initiator command queue stopper pointer. */
+       ADV_CARR_T *irq_sp;     /* Initiator response queue stopper pointer. */
+       ushort carr_pending_cnt;        /* Count of pending carriers. */
      /*
+        * Note: The following fields will not be used after initialization. The
+        * driver may discard the buffer after initialization is done.
+        */
+       ADV_DVC_CFG *cfg;       /* temporary configuration structure  */
 } ADV_DVC_VAR;
 
 #define NO_OF_SG_PER_BLOCK              15
 
 typedef struct asc_sg_block {
-    uchar reserved1;
-    uchar reserved2;
-    uchar reserved3;
-    uchar sg_cnt;                     /* Valid entries in block. */
-    ADV_PADDR sg_ptr;                 /* Pointer to next sg block. */
-    struct  {
-        ADV_PADDR sg_addr;                  /* SG element address. */
-        ADV_DCNT  sg_count;                 /* SG element count. */
-    } sg_list[NO_OF_SG_PER_BLOCK];
+       uchar reserved1;
+       uchar reserved2;
+       uchar reserved3;
+       uchar sg_cnt;           /* Valid entries in block. */
+       ADV_PADDR sg_ptr;       /* Pointer to next sg block. */
+       struct {
+               ADV_PADDR sg_addr;      /* SG element address. */
+               ADV_DCNT sg_count;      /* SG element count. */
+       } sg_list[NO_OF_SG_PER_BLOCK];
 } ADV_SG_BLOCK;
 
 /*
@@ -3061,37 +3035,37 @@ typedef struct asc_sg_block {
  * order.
  */
 typedef struct adv_scsi_req_q {
-    uchar       cntl;           /* Ucode flags and state (ASC_MC_QC_*). */
-    uchar       target_cmd;
-    uchar       target_id;      /* Device target identifier. */
-    uchar       target_lun;     /* Device target logical unit number. */
-    ADV_PADDR   data_addr;      /* Data buffer physical address. */
-    ADV_DCNT    data_cnt;       /* Data count. Ucode sets to residual. */
-    ADV_PADDR   sense_addr;
-    ADV_PADDR   carr_pa;
-    uchar       mflag;
-    uchar       sense_len;
-    uchar       cdb_len;        /* SCSI CDB length. Must <= 16 bytes. */
-    uchar       scsi_cntl;
-    uchar       done_status;    /* Completion status. */
-    uchar       scsi_status;    /* SCSI status byte. */
-    uchar       host_status;    /* Ucode host status. */
-    uchar       sg_working_ix;
-    uchar       cdb[12];        /* SCSI CDB bytes 0-11. */
-    ADV_PADDR   sg_real_addr;   /* SG list physical address. */
-    ADV_PADDR   scsiq_rptr;
-    uchar       cdb16[4];       /* SCSI CDB bytes 12-15. */
-    ADV_VADDR   scsiq_ptr;
-    ADV_VADDR   carr_va;
-    /*
-     * End of microcode structure - 60 bytes. The rest of the structure
-     * is used by the Adv Library and ignored by the microcode.
-     */
-    ADV_VADDR   srb_ptr;
-    ADV_SG_BLOCK *sg_list_ptr; /* SG list virtual address. */
-    char        *vdata_addr;   /* Data buffer virtual address. */
-    uchar       a_flag;
-    uchar       pad[2];        /* Pad out to a word boundary. */
+       uchar cntl;             /* Ucode flags and state (ASC_MC_QC_*). */
+       uchar target_cmd;
+       uchar target_id;        /* Device target identifier. */
+       uchar target_lun;       /* Device target logical unit number. */
+       ADV_PADDR data_addr;    /* Data buffer physical address. */
+       ADV_DCNT data_cnt;      /* Data count. Ucode sets to residual. */
+       ADV_PADDR sense_addr;
+       ADV_PADDR carr_pa;
+       uchar mflag;
+       uchar sense_len;
+       uchar cdb_len;          /* SCSI CDB length. Must <= 16 bytes. */
+       uchar scsi_cntl;
+       uchar done_status;      /* Completion status. */
+       uchar scsi_status;      /* SCSI status byte. */
+       uchar host_status;      /* Ucode host status. */
+       uchar sg_working_ix;
+       uchar cdb[12];          /* SCSI CDB bytes 0-11. */
+       ADV_PADDR sg_real_addr; /* SG list physical address. */
+       ADV_PADDR scsiq_rptr;
+       uchar cdb16[4];         /* SCSI CDB bytes 12-15. */
+       ADV_VADDR scsiq_ptr;
+       ADV_VADDR carr_va;
+       /*
+        * End of microcode structure - 60 bytes. The rest of the structure
+        * is used by the Adv Library and ignored by the microcode.
+        */
+       ADV_VADDR srb_ptr;
+       ADV_SG_BLOCK *sg_list_ptr;      /* SG list virtual address. */
+       char *vdata_addr;       /* Data buffer virtual address. */
+       uchar a_flag;
+       uchar pad[2];           /* Pad out to a word boundary. */
 } ADV_SCSI_REQ_Q;
 
 /*
@@ -3103,8 +3077,8 @@ typedef struct adv_scsi_req_q {
 #define IDLE_CMD_SEND_INT            0x0004
 #define IDLE_CMD_ABORT               0x0008
 #define IDLE_CMD_DEVICE_RESET        0x0010
-#define IDLE_CMD_SCSI_RESET_START    0x0020 /* Assert SCSI Bus Reset */
-#define IDLE_CMD_SCSI_RESET_END      0x0040 /* Deassert SCSI Bus Reset */
+#define IDLE_CMD_SCSI_RESET_START    0x0020    /* Assert SCSI Bus Reset */
+#define IDLE_CMD_SCSI_RESET_END      0x0040    /* Deassert SCSI Bus Reset */
 #define IDLE_CMD_SCSIREQ             0x0080
 
 #define IDLE_CMD_STATUS_SUCCESS      0x0001
@@ -3118,60 +3092,59 @@ typedef struct adv_scsi_req_q {
 /*
  * Wait loop time out values.
  */
-#define SCSI_WAIT_10_SEC             10UL    /* 10 seconds */
-#define SCSI_WAIT_100_MSEC           100UL   /* 100 milliseconds */
-#define SCSI_US_PER_MSEC             1000    /* microseconds per millisecond */
-#define SCSI_MS_PER_SEC              1000UL  /* milliseconds per second */
-#define SCSI_MAX_RETRY               10      /* retry count */
+#define SCSI_WAIT_10_SEC             10UL      /* 10 seconds */
+#define SCSI_WAIT_100_MSEC           100UL     /* 100 milliseconds */
+#define SCSI_US_PER_MSEC             1000      /* microseconds per millisecond */
+#define SCSI_MS_PER_SEC              1000UL    /* milliseconds per second */
+#define SCSI_MAX_RETRY               10        /* retry count */
 
-#define ADV_ASYNC_RDMA_FAILURE          0x01 /* Fatal RDMA failure. */
-#define ADV_ASYNC_SCSI_BUS_RESET_DET    0x02 /* Detected SCSI Bus Reset. */
-#define ADV_ASYNC_CARRIER_READY_FAILURE 0x03 /* Carrier Ready failure. */
-#define ADV_RDMA_IN_CARR_AND_Q_INVALID  0x04 /* RDMAed-in data invalid. */
+#define ADV_ASYNC_RDMA_FAILURE          0x01   /* Fatal RDMA failure. */
+#define ADV_ASYNC_SCSI_BUS_RESET_DET    0x02   /* Detected SCSI Bus Reset. */
+#define ADV_ASYNC_CARRIER_READY_FAILURE 0x03   /* Carrier Ready failure. */
+#define ADV_RDMA_IN_CARR_AND_Q_INVALID  0x04   /* RDMAed-in data invalid. */
 
-
-#define ADV_HOST_SCSI_BUS_RESET      0x80 /* Host Initiated SCSI Bus Reset. */
+#define ADV_HOST_SCSI_BUS_RESET      0x80      /* Host Initiated SCSI Bus Reset. */
 
 /*
  * Device drivers must define the following functions.
  */
-STATIC inline ulong DvcEnterCritical(void);
-STATIC inline void  DvcLeaveCritical(ulong);
-STATIC void  DvcSleepMilliSecond(ADV_DCNT);
-STATIC uchar DvcAdvReadPCIConfigByte(ADV_DVC_VAR *, ushort);
-STATIC void  DvcAdvWritePCIConfigByte(ADV_DVC_VAR *, ushort, uchar);
-STATIC ADV_PADDR DvcGetPhyAddr(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *,
-                uchar *, ASC_SDCNT *, int);
-STATIC void  DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
+static inline ulong DvcEnterCritical(void);
+static inline void DvcLeaveCritical(ulong);
+static void DvcSleepMilliSecond(ADV_DCNT);
+static uchar DvcAdvReadPCIConfigByte(ADV_DVC_VAR *, ushort);
+static void DvcAdvWritePCIConfigByte(ADV_DVC_VAR *, ushort, uchar);
+static ADV_PADDR DvcGetPhyAddr(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *,
+                              uchar *, ASC_SDCNT *, int);
+static void DvcDelayMicroSecond(ADV_DVC_VAR *, ushort);
 
 /*
  * Adv Library functions available to drivers.
  */
-STATIC int     AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
-STATIC int     AdvISR(ADV_DVC_VAR *);
-STATIC int     AdvInitGetConfig(ADV_DVC_VAR *);
-STATIC int     AdvInitAsc3550Driver(ADV_DVC_VAR *);
-STATIC int     AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
-STATIC int     AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
-STATIC int     AdvResetChipAndSB(ADV_DVC_VAR *);
-STATIC int     AdvResetSB(ADV_DVC_VAR *asc_dvc);
+static int AdvExeScsiQueue(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
+static int AdvISR(ADV_DVC_VAR *);
+static int AdvInitGetConfig(ADV_DVC_VAR *);
+static int AdvInitAsc3550Driver(ADV_DVC_VAR *);
+static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *);
+static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *);
+static int AdvResetChipAndSB(ADV_DVC_VAR *);
+static int AdvResetSB(ADV_DVC_VAR *asc_dvc);
 
 /*
  * Internal Adv Library functions.
  */
-STATIC int    AdvSendIdleCmd(ADV_DVC_VAR *, ushort, ADV_DCNT);
-STATIC void   AdvInquiryHandling(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
-STATIC int    AdvInitFrom3550EEP(ADV_DVC_VAR *);
-STATIC int    AdvInitFrom38C0800EEP(ADV_DVC_VAR *);
-STATIC int    AdvInitFrom38C1600EEP(ADV_DVC_VAR *);
-STATIC ushort AdvGet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
-STATIC void   AdvSet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
-STATIC ushort AdvGet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
-STATIC void   AdvSet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
-STATIC ushort AdvGet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
-STATIC void   AdvSet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
-STATIC void   AdvWaitEEPCmd(AdvPortAddr);
-STATIC ushort AdvReadEEPWord(AdvPortAddr, int);
+static int AdvSendIdleCmd(ADV_DVC_VAR *, ushort, ADV_DCNT);
+static void AdvInquiryHandling(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
+static int AdvInitFrom3550EEP(ADV_DVC_VAR *);
+static int AdvInitFrom38C0800EEP(ADV_DVC_VAR *);
+static int AdvInitFrom38C1600EEP(ADV_DVC_VAR *);
+static ushort AdvGet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
+static void AdvSet3550EEPConfig(AdvPortAddr, ADVEEP_3550_CONFIG *);
+static ushort AdvGet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
+static void AdvSet38C0800EEPConfig(AdvPortAddr, ADVEEP_38C0800_CONFIG *);
+static ushort AdvGet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
+static void AdvSet38C1600EEPConfig(AdvPortAddr, ADVEEP_38C1600_CONFIG *);
+static void AdvWaitEEPCmd(AdvPortAddr);
+static ushort AdvReadEEPWord(AdvPortAddr, int);
 
 /*
  * PCI Bus Definitions
@@ -3241,7 +3214,6 @@ do { \
 #define AdvWriteWordAutoIncLram(iop_base, word) \
      (ADV_MEM_WRITEW((iop_base) + IOPW_RAM_DATA, (word)))
 
-
 /*
  * Define macro to check for Condor signature.
  *
@@ -3313,7 +3285,7 @@ do { \
  * ASC_SCSI_REQ_Q 'done_status' and 'host_status' return values.
  */
 
-#define QD_NO_STATUS         0x00       /* Request not completed yet. */
+#define QD_NO_STATUS         0x00      /* Request not completed yet. */
 #define QD_NO_ERROR          0x01
 #define QD_ABORTED_BY_HOST   0x02
 #define QD_WITH_ERROR        0x04
@@ -3323,30 +3295,29 @@ do { \
 #define QHSTA_M_DATA_OVER_RUN       0x12
 #define QHSTA_M_UNEXPECTED_BUS_FREE 0x13
 #define QHSTA_M_QUEUE_ABORTED       0x15
-#define QHSTA_M_SXFR_SDMA_ERR       0x16 /* SXFR_STATUS SCSI DMA Error */
-#define QHSTA_M_SXFR_SXFR_PERR      0x17 /* SXFR_STATUS SCSI Bus Parity Error */
-#define QHSTA_M_RDMA_PERR           0x18 /* RISC PCI DMA parity error */
-#define QHSTA_M_SXFR_OFF_UFLW       0x19 /* SXFR_STATUS Offset Underflow */
-#define QHSTA_M_SXFR_OFF_OFLW       0x20 /* SXFR_STATUS Offset Overflow */
-#define QHSTA_M_SXFR_WD_TMO         0x21 /* SXFR_STATUS Watchdog Timeout */
-#define QHSTA_M_SXFR_DESELECTED     0x22 /* SXFR_STATUS Deselected */
+#define QHSTA_M_SXFR_SDMA_ERR       0x16       /* SXFR_STATUS SCSI DMA Error */
+#define QHSTA_M_SXFR_SXFR_PERR      0x17       /* SXFR_STATUS SCSI Bus Parity Error */
+#define QHSTA_M_RDMA_PERR           0x18       /* RISC PCI DMA parity error */
+#define QHSTA_M_SXFR_OFF_UFLW       0x19       /* SXFR_STATUS Offset Underflow */
+#define QHSTA_M_SXFR_OFF_OFLW       0x20       /* SXFR_STATUS Offset Overflow */
+#define QHSTA_M_SXFR_WD_TMO         0x21       /* SXFR_STATUS Watchdog Timeout */
+#define QHSTA_M_SXFR_DESELECTED     0x22       /* SXFR_STATUS Deselected */
 /* Note: QHSTA_M_SXFR_XFR_OFLW is identical to QHSTA_M_DATA_OVER_RUN. */
-#define QHSTA_M_SXFR_XFR_OFLW       0x12 /* SXFR_STATUS Transfer Overflow */
-#define QHSTA_M_SXFR_XFR_PH_ERR     0x24 /* SXFR_STATUS Transfer Phase Error */
-#define QHSTA_M_SXFR_UNKNOWN_ERROR  0x25 /* SXFR_STATUS Unknown Error */
-#define QHSTA_M_SCSI_BUS_RESET      0x30 /* Request aborted from SBR */
-#define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31 /* Request aborted from unsol. SBR */
-#define QHSTA_M_BUS_DEVICE_RESET    0x32 /* Request aborted from BDR */
-#define QHSTA_M_DIRECTION_ERR       0x35 /* Data Phase mismatch */
-#define QHSTA_M_DIRECTION_ERR_HUNG  0x36 /* Data Phase mismatch and bus hang */
+#define QHSTA_M_SXFR_XFR_OFLW       0x12       /* SXFR_STATUS Transfer Overflow */
+#define QHSTA_M_SXFR_XFR_PH_ERR     0x24       /* SXFR_STATUS Transfer Phase Error */
+#define QHSTA_M_SXFR_UNKNOWN_ERROR  0x25       /* SXFR_STATUS Unknown Error */
+#define QHSTA_M_SCSI_BUS_RESET      0x30       /* Request aborted from SBR */
+#define QHSTA_M_SCSI_BUS_RESET_UNSOL 0x31      /* Request aborted from unsol. SBR */
+#define QHSTA_M_BUS_DEVICE_RESET    0x32       /* Request aborted from BDR */
+#define QHSTA_M_DIRECTION_ERR       0x35       /* Data Phase mismatch */
+#define QHSTA_M_DIRECTION_ERR_HUNG  0x36       /* Data Phase mismatch and bus hang */
 #define QHSTA_M_WTM_TIMEOUT         0x41
 #define QHSTA_M_BAD_CMPL_STATUS_IN  0x42
 #define QHSTA_M_NO_AUTO_REQ_SENSE   0x43
 #define QHSTA_M_AUTO_REQ_SENSE_FAIL 0x44
-#define QHSTA_M_INVALID_DEVICE      0x45 /* Bad target ID */
-#define QHSTA_M_FROZEN_TIDQ         0x46 /* TID Queue frozen. */
-#define QHSTA_M_SGBACKUP_ERROR      0x47 /* Scatter-Gather backup error */
-
+#define QHSTA_M_INVALID_DEVICE      0x45       /* Bad target ID */
+#define QHSTA_M_FROZEN_TIDQ         0x46       /* TID Queue frozen. */
+#define QHSTA_M_SGBACKUP_ERROR      0x47       /* Scatter-Gather backup error */
 
 /*
  * Default EEPROM Configuration structure defined in a_init.c.
@@ -3358,12 +3329,12 @@ static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config;
 /*
  * DvcGetPhyAddr() flag arguments
  */
-#define ADV_IS_SCSIQ_FLAG       0x01 /* 'addr' is ASC_SCSI_REQ_Q pointer */
-#define ADV_ASCGETSGLIST_VADDR  0x02 /* 'addr' is AscGetSGList() virtual addr */
-#define ADV_IS_SENSE_FLAG       0x04 /* 'addr' is sense virtual pointer */
-#define ADV_IS_DATA_FLAG        0x08 /* 'addr' is data virtual pointer */
-#define ADV_IS_SGLIST_FLAG      0x10 /* 'addr' is sglist virtual pointer */
-#define ADV_IS_CARRIER_FLAG     0x20 /* 'addr' is ADV_CARR_T pointer */
+#define ADV_IS_SCSIQ_FLAG       0x01   /* 'addr' is ASC_SCSI_REQ_Q pointer */
+#define ADV_ASCGETSGLIST_VADDR  0x02   /* 'addr' is AscGetSGList() virtual addr */
+#define ADV_IS_SENSE_FLAG       0x04   /* 'addr' is sense virtual pointer */
+#define ADV_IS_DATA_FLAG        0x08   /* 'addr' is data virtual pointer */
+#define ADV_IS_SGLIST_FLAG      0x10   /* 'addr' is sglist virtual pointer */
+#define ADV_IS_CARRIER_FLAG     0x20   /* 'addr' is ADV_CARR_T pointer */
 
 /* Return the address that is aligned at the next doubleword >= to 'addr'. */
 #define ADV_8BALIGN(addr)      (((ulong) (addr) + 0x7) & ~0x7)
@@ -3413,43 +3384,42 @@ static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config;
 #define ADV_INQ_CLOCKING(inq)       (((inq)->info & 0x0c) >> 2)
 
 typedef struct {
-  uchar periph;                 /* peripheral device type [0:4] */
-                                /* peripheral qualifier [5:7] */
-  uchar devtype;                /* device type modifier (for SCSI I) [0:6] */
-                                /* RMB - removable medium bit [7] */
-  uchar ver;                    /* ANSI approved version [0:2] */
-                                /* ECMA version [3:5] */
-                                /* ISO version [6:7] */
-  uchar byte3;                  /* response data format [0:3] */
-                                /* 0 SCSI 1 */
-                                /* 1 CCS */
-                                /* 2 SCSI-2 */
-                                /* 3-F reserved */
-                                /* reserved [4:5] */
-                                /* terminate I/O process bit (see 5.6.22) [6] */
-                                /* asynch. event notification (processor) [7] */
-  uchar add_len;                /* additional length */
-  uchar res1;                   /* reserved */
-  uchar res2;                   /* reserved */
-  uchar flags;                  /* soft reset implemented [0] */
-                                /* command queuing [1] */
-                                /* reserved [2] */
-                                /* linked command for this logical unit [3] */
-                                /* synchronous data transfer [4] */
-                                /* wide bus 16 bit data transfer [5] */
-                                /* wide bus 32 bit data transfer [6] */
-                                /* relative addressing mode [7] */
-  uchar vendor_id[8];           /* vendor identification */
-  uchar product_id[16];         /* product identification */
-  uchar product_rev_level[4];   /* product revision level */
-  uchar vendor_specific[20];    /* vendor specific */
-  uchar info;                   /* information unit supported [0] */
-                                /* quick arbitrate supported [1] */
-                                /* clocking field [2:3] */
-                                /* reserved [4:7] */
-  uchar res3;                   /* reserved */
-} ADV_SCSI_INQUIRY; /* 58 bytes */
-
+       uchar periph;           /* peripheral device type [0:4] */
+       /* peripheral qualifier [5:7] */
+       uchar devtype;          /* device type modifier (for SCSI I) [0:6] */
+       /* RMB - removable medium bit [7] */
+       uchar ver;              /* ANSI approved version [0:2] */
+       /* ECMA version [3:5] */
+       /* ISO version [6:7] */
+       uchar byte3;            /* response data format [0:3] */
+       /* 0 SCSI 1 */
+       /* 1 CCS */
+       /* 2 SCSI-2 */
+       /* 3-F reserved */
+       /* reserved [4:5] */
+       /* terminate I/O process bit (see 5.6.22) [6] */
+       /* asynch. event notification (processor) [7] */
+       uchar add_len;          /* additional length */
+       uchar res1;             /* reserved */
+       uchar res2;             /* reserved */
+       uchar flags;            /* soft reset implemented [0] */
+       /* command queuing [1] */
+       /* reserved [2] */
+       /* linked command for this logical unit [3] */
+       /* synchronous data transfer [4] */
+       /* wide bus 16 bit data transfer [5] */
+       /* wide bus 32 bit data transfer [6] */
+       /* relative addressing mode [7] */
+       uchar vendor_id[8];     /* vendor identification */
+       uchar product_id[16];   /* product identification */
+       uchar product_rev_level[4];     /* product revision level */
+       uchar vendor_specific[20];      /* vendor specific */
+       uchar info;             /* information unit supported [0] */
+       /* quick arbitrate supported [1] */
+       /* clocking field [2:3] */
+       /* reserved [4:7] */
+       uchar res3;             /* reserved */
+} ADV_SCSI_INQUIRY;            /* 58 bytes */
 
 /*
  * --- Driver Constants and Macros
@@ -3464,15 +3434,15 @@ typedef struct {
 
 /* asc_board_t flags */
 #define ASC_HOST_IN_RESET       0x01
-#define ASC_IS_WIDE_BOARD       0x04    /* AdvanSys Wide Board */
+#define ASC_IS_WIDE_BOARD       0x04   /* AdvanSys Wide Board */
 #define ASC_SELECT_QUEUE_DEPTHS 0x08
 
 #define ASC_NARROW_BOARD(boardp) (((boardp)->flags & ASC_IS_WIDE_BOARD) == 0)
 #define ASC_WIDE_BOARD(boardp)   ((boardp)->flags & ASC_IS_WIDE_BOARD)
 
-#define NO_ISA_DMA              0xff        /* No ISA DMA Channel Used */
+#define NO_ISA_DMA              0xff   /* No ISA DMA Channel Used */
 
-#define ASC_INFO_SIZE           128            /* advansys_info() line size */
+#define ASC_INFO_SIZE           128    /* advansys_info() line size */
 
 #ifdef CONFIG_PROC_FS
 /* /proc/scsi/advansys/[0...] related definitions */
@@ -3514,7 +3484,7 @@ typedef struct {
  *  REQPTIME(reqp) - reqp's time stamp value
  *  REQTIMESTAMP() - system time stamp value
  */
-typedef struct scsi_cmnd     REQ, *REQP;
+typedef struct scsi_cmnd REQ, *REQP;
 #define REQPNEXT(reqp)       ((REQP) ((reqp)->host_scribble))
 #define REQPNEXTP(reqp)      ((REQP *) &((reqp)->host_scribble))
 #define REQPTID(reqp)        ((reqp)->device->id)
@@ -3564,17 +3534,17 @@ typedef struct scsi_cmnd     REQ, *REQP;
 #define PCI_MAX_SLOT            0x1F
 #define PCI_MAX_BUS             0xFF
 #define PCI_IOADDRESS_MASK      0xFFFE
-#define ASC_PCI_DEVICE_ID_CNT   6       /* PCI Device ID count. */
+#define ASC_PCI_DEVICE_ID_CNT   6      /* PCI Device ID count. */
 
 #ifndef ADVANSYS_STATS
-#define ASC_STATS(shp, counter)
-#define ASC_STATS_ADD(shp, counter, count)
+#define ASC_STATS(shost, counter)
+#define ASC_STATS_ADD(shost, counter, count)
 #else /* ADVANSYS_STATS */
-#define ASC_STATS(shp, counter) \
-    (ASC_BOARDP(shp)->asc_stats.counter++)
+#define ASC_STATS(shost, counter) \
+    (ASC_BOARDP(shost)->asc_stats.counter++)
 
-#define ASC_STATS_ADD(shp, counter, count) \
-    (ASC_BOARDP(shp)->asc_stats.counter += (count))
+#define ASC_STATS_ADD(shost, counter, count) \
+    (ASC_BOARDP(shost)->asc_stats.counter += (count))
 #endif /* ADVANSYS_STATS */
 
 #define ASC_CEILING(val, unit) (((val) + ((unit) - 1))/(unit))
@@ -3617,7 +3587,6 @@ typedef struct scsi_cmnd     REQ, *REQP;
         printk((s), (a1), (a2), (a3), (a4)); \
     }
 
-
 #ifndef ADVANSYS_DEBUG
 
 #define ASC_DBG(lvl, s)
@@ -3746,7 +3715,6 @@ typedef struct scsi_cmnd     REQ, *REQP;
 
 #endif /* ADVANSYS_ASSERT */
 
-
 /*
  * --- Driver Structures
  */
@@ -3755,27 +3723,27 @@ typedef struct scsi_cmnd     REQ, *REQP;
 
 /* Per board statistics structure */
 struct asc_stats {
-    /* Driver Entrypoint Statistics */
-    ADV_DCNT queuecommand;    /* # calls to advansys_queuecommand() */
-    ADV_DCNT reset;           /* # calls to advansys_eh_bus_reset() */
-    ADV_DCNT biosparam;       /* # calls to advansys_biosparam() */
-    ADV_DCNT interrupt;       /* # advansys_interrupt() calls */
-    ADV_DCNT callback;        /* # calls to asc/adv_isr_callback() */
-    ADV_DCNT done;            /* # calls to request's scsi_done function */
-    ADV_DCNT build_error;     /* # asc/adv_build_req() ASC_ERROR returns. */
-    ADV_DCNT adv_build_noreq; /* # adv_build_req() adv_req_t alloc. fail. */
-    ADV_DCNT adv_build_nosg;  /* # adv_build_req() adv_sgblk_t alloc. fail. */
-    /* AscExeScsiQueue()/AdvExeScsiQueue() Statistics */
-    ADV_DCNT exe_noerror;     /* # ASC_NOERROR returns. */
-    ADV_DCNT exe_busy;        /* # ASC_BUSY returns. */
-    ADV_DCNT exe_error;       /* # ASC_ERROR returns. */
-    ADV_DCNT exe_unknown;     /* # unknown returns. */
-    /* Data Transfer Statistics */
-    ADV_DCNT cont_cnt;        /* # non-scatter-gather I/O requests received */
-    ADV_DCNT cont_xfer;       /* # contiguous transfer 512-bytes */
-    ADV_DCNT sg_cnt;          /* # scatter-gather I/O requests received */
-    ADV_DCNT sg_elem;         /* # scatter-gather elements */
-    ADV_DCNT sg_xfer;         /* # scatter-gather transfer 512-bytes */
+       /* Driver Entrypoint Statistics */
+       ADV_DCNT queuecommand;  /* # calls to advansys_queuecommand() */
+       ADV_DCNT reset;         /* # calls to advansys_eh_bus_reset() */
+       ADV_DCNT biosparam;     /* # calls to advansys_biosparam() */
+       ADV_DCNT interrupt;     /* # advansys_interrupt() calls */
+       ADV_DCNT callback;      /* # calls to asc/adv_isr_callback() */
+       ADV_DCNT done;          /* # calls to request's scsi_done function */
+       ADV_DCNT build_error;   /* # asc/adv_build_req() ASC_ERROR returns. */
+       ADV_DCNT adv_build_noreq;       /* # adv_build_req() adv_req_t alloc. fail. */
+       ADV_DCNT adv_build_nosg;        /* # adv_build_req() adv_sgblk_t alloc. fail. */
+       /* AscExeScsiQueue()/AdvExeScsiQueue() Statistics */
+       ADV_DCNT exe_noerror;   /* # ASC_NOERROR returns. */
+       ADV_DCNT exe_busy;      /* # ASC_BUSY returns. */
+       ADV_DCNT exe_error;     /* # ASC_ERROR returns. */
+       ADV_DCNT exe_unknown;   /* # unknown returns. */
+       /* Data Transfer Statistics */
+       ADV_DCNT cont_cnt;      /* # non-scatter-gather I/O requests received */
+       ADV_DCNT cont_xfer;     /* # contiguous transfer 512-bytes */
+       ADV_DCNT sg_cnt;        /* # scatter-gather I/O requests received */
+       ADV_DCNT sg_elem;       /* # scatter-gather elements */
+       ADV_DCNT sg_xfer;       /* # scatter-gather transfer 512-bytes */
 };
 #endif /* ADVANSYS_STATS */
 
@@ -3783,17 +3751,17 @@ struct asc_stats {
  * Request queuing structure
  */
 typedef struct asc_queue {
-    ADV_SCSI_BIT_ID_TYPE  q_tidmask;                /* queue mask */
-    REQP                  q_first[ADV_MAX_TID+1];   /* first queued request */
-    REQP                  q_last[ADV_MAX_TID+1];    /* last queued request */
+       ADV_SCSI_BIT_ID_TYPE q_tidmask; /* queue mask */
+       REQP q_first[ADV_MAX_TID + 1];  /* first queued request */
+       REQP q_last[ADV_MAX_TID + 1];   /* last queued request */
 #ifdef ADVANSYS_STATS
-    short                 q_cur_cnt[ADV_MAX_TID+1]; /* current queue count */
-    short                 q_max_cnt[ADV_MAX_TID+1]; /* maximum queue count */
-    ADV_DCNT              q_tot_cnt[ADV_MAX_TID+1]; /* total enqueue count */
-    ADV_DCNT              q_tot_tim[ADV_MAX_TID+1]; /* total time queued */
-    ushort                q_max_tim[ADV_MAX_TID+1]; /* maximum time queued */
-    ushort                q_min_tim[ADV_MAX_TID+1]; /* minimum time queued */
-#endif /* ADVANSYS_STATS */
+       short q_cur_cnt[ADV_MAX_TID + 1];       /* current queue count */
+       short q_max_cnt[ADV_MAX_TID + 1];       /* maximum queue count */
+       ADV_DCNT q_tot_cnt[ADV_MAX_TID + 1];    /* total enqueue count */
+       ADV_DCNT q_tot_tim[ADV_MAX_TID + 1];    /* total time queued */
+       ushort q_max_tim[ADV_MAX_TID + 1];      /* maximum time queued */
+       ushort q_min_tim[ADV_MAX_TID + 1];      /* minimum time queued */
+#endif                         /* ADVANSYS_STATS */
 } asc_queue_t;
 
 /*
@@ -3814,17 +3782,17 @@ typedef struct asc_queue {
  * Both structures must be 32 byte aligned.
  */
 typedef struct adv_sgblk {
-    ADV_SG_BLOCK        sg_block;     /* Sgblock structure. */
-    uchar               align[32];    /* Sgblock structure padding. */
-    struct adv_sgblk    *next_sgblkp; /* Next scatter-gather structure. */
+       ADV_SG_BLOCK sg_block;  /* Sgblock structure. */
+       uchar align[32];        /* Sgblock structure padding. */
+       struct adv_sgblk *next_sgblkp;  /* Next scatter-gather structure. */
 } adv_sgblk_t;
 
 typedef struct adv_req {
-    ADV_SCSI_REQ_Q      scsi_req_q;   /* Adv Library request structure. */
-    uchar               align[32];    /* Request structure padding. */
-    struct scsi_cmnd   *cmndp;       /* Mid-Level SCSI command pointer. */
-    adv_sgblk_t         *sgblkp;      /* Adv Library scatter-gather pointer. */
-    struct adv_req      *next_reqp;   /* Next Request Structure. */
+       ADV_SCSI_REQ_Q scsi_req_q;      /* Adv Library request structure. */
+       uchar align[32];        /* Request structure padding. */
+       struct scsi_cmnd *cmndp;        /* Mid-Level SCSI command pointer. */
+       adv_sgblk_t *sgblkp;    /* Adv Library scatter-gather pointer. */
+       struct adv_req *next_reqp;      /* Next Request Structure. */
 } adv_req_t;
 
 /*
@@ -3835,113 +3803,109 @@ typedef struct adv_req {
  * field. It is guaranteed to be allocated from DMA-able memory.
  */
 typedef struct asc_board {
-    int                  id;                    /* Board Id */
-    uint                 flags;                 /* Board flags */
-    union {
-        ASC_DVC_VAR      asc_dvc_var;           /* Narrow board */
-        ADV_DVC_VAR      adv_dvc_var;           /* Wide board */
-    } dvc_var;
-    union {
-        ASC_DVC_CFG      asc_dvc_cfg;           /* Narrow board */
-        ADV_DVC_CFG      adv_dvc_cfg;           /* Wide board */
-    } dvc_cfg;
-    ushort               asc_n_io_port;         /* Number I/O ports. */
-    asc_queue_t          active;                /* Active command queue */
-    asc_queue_t          waiting;               /* Waiting command queue */
-    asc_queue_t          done;                  /* Done command queue */
-    ADV_SCSI_BIT_ID_TYPE init_tidmask;          /* Target init./valid mask */
-    struct scsi_device *device[ADV_MAX_TID+1]; /* Mid-Level Scsi Device */
-    ushort               reqcnt[ADV_MAX_TID+1]; /* Starvation request count */
-    ADV_SCSI_BIT_ID_TYPE queue_full;            /* Queue full mask */
-    ushort               queue_full_cnt[ADV_MAX_TID+1]; /* Queue full count */
-    union {
-        ASCEEP_CONFIG         asc_eep;          /* Narrow EEPROM config. */
-        ADVEEP_3550_CONFIG    adv_3550_eep;     /* 3550 EEPROM config. */
-        ADVEEP_38C0800_CONFIG adv_38C0800_eep;  /* 38C0800 EEPROM config. */
-        ADVEEP_38C1600_CONFIG adv_38C1600_eep;  /* 38C1600 EEPROM config. */
-    } eep_config;
-    ulong                last_reset;            /* Saved last reset time */
-    spinlock_t lock;                            /* Board spinlock */
+       int id;                 /* Board Id */
+       uint flags;             /* Board flags */
+       union {
+               ASC_DVC_VAR asc_dvc_var;        /* Narrow board */
+               ADV_DVC_VAR adv_dvc_var;        /* Wide board */
+       } dvc_var;
+       union {
+               ASC_DVC_CFG asc_dvc_cfg;        /* Narrow board */
+               ADV_DVC_CFG adv_dvc_cfg;        /* Wide board */
+       } dvc_cfg;
+       ushort asc_n_io_port;   /* Number I/O ports. */
+       asc_queue_t active;     /* Active command queue */
+       asc_queue_t waiting;    /* Waiting command queue */
+       asc_queue_t done;       /* Done command queue */
+       ADV_SCSI_BIT_ID_TYPE init_tidmask;      /* Target init./valid mask */
+       struct scsi_device *device[ADV_MAX_TID + 1];    /* Mid-Level Scsi Device */
+       ushort reqcnt[ADV_MAX_TID + 1]; /* Starvation request count */
+       ADV_SCSI_BIT_ID_TYPE queue_full;        /* Queue full mask */
+       ushort queue_full_cnt[ADV_MAX_TID + 1]; /* Queue full count */
+       union {
+               ASCEEP_CONFIG asc_eep;  /* Narrow EEPROM config. */
+               ADVEEP_3550_CONFIG adv_3550_eep;        /* 3550 EEPROM config. */
+               ADVEEP_38C0800_CONFIG adv_38C0800_eep;  /* 38C0800 EEPROM config. */
+               ADVEEP_38C1600_CONFIG adv_38C1600_eep;  /* 38C1600 EEPROM config. */
+       } eep_config;
+       ulong last_reset;       /* Saved last reset time */
+       spinlock_t lock;        /* Board spinlock */
 #ifdef CONFIG_PROC_FS
-    /* /proc/scsi/advansys/[0...] */
-    char                 *prtbuf;               /* /proc print buffer */
-#endif /* CONFIG_PROC_FS */
+       /* /proc/scsi/advansys/[0...] */
+       char *prtbuf;           /* /proc print buffer */
+#endif                         /* CONFIG_PROC_FS */
 #ifdef ADVANSYS_STATS
-    struct asc_stats     asc_stats;             /* Board statistics */
-#endif /* ADVANSYS_STATS */
-    /*
-     * The following fields are used only for Narrow Boards.
-     */
-    /* The following three structures must be in DMA-able memory. */
-    ASC_SCSI_REQ_Q       scsireqq;
-    ASC_CAP_INFO         cap_info;
-    ASC_SCSI_INQUIRY     inquiry;
-    uchar                sdtr_data[ASC_MAX_TID+1]; /* SDTR information */
-    /*
-     * The following fields are used only for Wide Boards.
-     */
-    void                 __iomem *ioremap_addr; /* I/O Memory remap address. */
-    ushort               ioport;                /* I/O Port address. */
-    ADV_CARR_T           *orig_carrp;           /* ADV_CARR_T memory block. */
-    adv_req_t            *orig_reqp;            /* adv_req_t memory block. */
-    adv_req_t            *adv_reqp;             /* Request structures. */
-    adv_sgblk_t          *adv_sgblkp;           /* Scatter-gather structures. */
-    ushort               bios_signature;        /* BIOS Signature. */
-    ushort               bios_version;          /* BIOS Version. */
-    ushort               bios_codeseg;          /* BIOS Code Segment. */
-    ushort               bios_codelen;          /* BIOS Code Segment Length. */
+       struct asc_stats asc_stats;     /* Board statistics */
+#endif                         /* ADVANSYS_STATS */
+       /*
+        * The following fields are used only for Narrow Boards.
+        */
+       /* The following three structures must be in DMA-able memory. */
+       ASC_SCSI_REQ_Q scsireqq;
+       ASC_CAP_INFO cap_info;
+       ASC_SCSI_INQUIRY inquiry;
+       uchar sdtr_data[ASC_MAX_TID + 1];       /* SDTR information */
+       /*
+        * The following fields are used only for Wide Boards.
+        */
+       void __iomem *ioremap_addr;     /* I/O Memory remap address. */
+       ushort ioport;          /* I/O Port address. */
+       ADV_CARR_T *orig_carrp; /* ADV_CARR_T memory block. */
+       adv_req_t *orig_reqp;   /* adv_req_t memory block. */
+       adv_req_t *adv_reqp;    /* Request structures. */
+       adv_sgblk_t *adv_sgblkp;        /* Scatter-gather structures. */
+       ushort bios_signature;  /* BIOS Signature. */
+       ushort bios_version;    /* BIOS Version. */
+       ushort bios_codeseg;    /* BIOS Code Segment. */
+       ushort bios_codelen;    /* BIOS Code Segment Length. */
 } asc_board_t;
 
 /*
  * PCI configuration structures
  */
-typedef struct _PCI_DATA_
-{
-    uchar    type;
-    uchar    bus;
-    uchar    slot;
-    uchar    func;
-    uchar    offset;
+typedef struct _PCI_DATA_ {
+       uchar type;
+       uchar bus;
+       uchar slot;
+       uchar func;
+       uchar offset;
 } PCI_DATA;
 
-typedef struct _PCI_DEVICE_
-{
-    ushort   vendorID;
-    ushort   deviceID;
-    ushort   slotNumber;
-    ushort   slotFound;
-    uchar    busNumber;
-    uchar    maxBusNumber;
-    uchar    devFunc;
-    ushort   startSlot;
-    ushort   endSlot;
-    uchar    bridge;
-    uchar    type;
+typedef struct _PCI_DEVICE_ {
+       ushort vendorID;
+       ushort deviceID;
+       ushort slotNumber;
+       ushort slotFound;
+       uchar busNumber;
+       uchar maxBusNumber;
+       uchar devFunc;
+       ushort startSlot;
+       ushort endSlot;
+       uchar bridge;
+       uchar type;
 } PCI_DEVICE;
 
-typedef struct _PCI_CONFIG_SPACE_
-{
-    ushort   vendorID;
-    ushort   deviceID;
-    ushort   command;
-    ushort   status;
-    uchar    revision;
-    uchar    classCode[3];
-    uchar    cacheSize;
-    uchar    latencyTimer;
-    uchar    headerType;
-    uchar    bist;
-    ADV_PADDR baseAddress[6];
-    ushort   reserved[4];
-    ADV_PADDR optionRomAddr;
-    ushort   reserved2[4];
-    uchar    irqLine;
-    uchar    irqPin;
-    uchar    minGnt;
-    uchar    maxLatency;
+typedef struct _PCI_CONFIG_SPACE_ {
+       ushort vendorID;
+       ushort deviceID;
+       ushort command;
+       ushort status;
+       uchar revision;
+       uchar classCode[3];
+       uchar cacheSize;
+       uchar latencyTimer;
+       uchar headerType;
+       uchar bist;
+       ADV_PADDR baseAddress[6];
+       ushort reserved[4];
+       ADV_PADDR optionRomAddr;
+       ushort reserved2[4];
+       uchar irqLine;
+       uchar irqPin;
+       uchar minGnt;
+       uchar maxLatency;
 } PCI_CONFIG_SPACE;
 
-
 /*
  * --- Driver Data
  */
@@ -3949,44 +3913,42 @@ typedef struct _PCI_CONFIG_SPACE_
 /* Note: All driver global data should be initialized. */
 
 /* Number of boards detected in system. */
-STATIC int asc_board_count = 0;
-STATIC struct Scsi_Host    *asc_host[ASC_NUM_BOARD_SUPPORTED] = { NULL };
+static int asc_board_count = 0;
+static struct Scsi_Host *asc_host[ASC_NUM_BOARD_SUPPORTED] = { NULL };
 
 /* Overrun buffer used by all narrow boards. */
-STATIC uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 };
+static uchar overrun_buf[ASC_OVERRUN_BSIZE] = { 0 };
 
 /*
  * Global structures required to issue a command.
  */
-STATIC ASC_SCSI_Q asc_scsi_q = { { 0 } };
-STATIC ASC_SG_HEAD asc_sg_head = { 0 };
+static ASC_SCSI_Q asc_scsi_q = { {0} };
+static ASC_SG_HEAD asc_sg_head = { 0 };
 
 /* List of supported bus types. */
-STATIC ushort asc_bus[ASC_NUM_BUS] __initdata = {
-    ASC_IS_ISA,
-    ASC_IS_VL,
-    ASC_IS_EISA,
-    ASC_IS_PCI,
+static ushort asc_bus[ASC_NUM_BUS] __initdata = {
+       ASC_IS_ISA,
+       ASC_IS_VL,
+       ASC_IS_EISA,
+       ASC_IS_PCI,
 };
 
-STATIC int asc_iopflag = ASC_FALSE;
-STATIC int asc_ioport[ASC_NUM_IOPORT_PROBE] = { 0, 0, 0, 0 };
+static int asc_iopflag = ASC_FALSE;
+static int asc_ioport[ASC_NUM_IOPORT_PROBE] = { 0, 0, 0, 0 };
 
 #ifdef ADVANSYS_DEBUG
-STATIC char *
-asc_bus_name[ASC_NUM_BUS] = {
-    "ASC_IS_ISA",
-    "ASC_IS_VL",
-    "ASC_IS_EISA",
-    "ASC_IS_PCI",
+static char *asc_bus_name[ASC_NUM_BUS] = {
+       "ASC_IS_ISA",
+       "ASC_IS_VL",
+       "ASC_IS_EISA",
+       "ASC_IS_PCI",
 };
 
-STATIC int          asc_dbglvl = 3;
+static int asc_dbglvl = 3;
 #endif /* ADVANSYS_DEBUG */
 
 /* Declaration for Asc Library internal data referenced by driver. */
-STATIC PortAddr     _asc_def_iop_base[];
-
+static PortAddr _asc_def_iop_base[];
 
 /*
  * --- Driver Function Prototypes
@@ -3994,62 +3956,61 @@ STATIC PortAddr     _asc_def_iop_base[];
  * advansys.h contains function prototypes for functions global to Linux.
  */
 
-STATIC irqreturn_t advansys_interrupt(int, void *);
-STATIC int       advansys_slave_configure(struct scsi_device *);
-STATIC void       asc_scsi_done_list(struct scsi_cmnd *);
-STATIC int        asc_execute_scsi_cmnd(struct scsi_cmnd *);
-STATIC int        asc_build_req(asc_board_t *, struct scsi_cmnd *);
-STATIC int        adv_build_req(asc_board_t *, struct scsi_cmnd *, ADV_SCSI_REQ_Q **);
-STATIC int        adv_get_sglist(asc_board_t *, adv_req_t *, struct scsi_cmnd *, int);
-STATIC void       asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
-STATIC void       adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
-STATIC void       adv_async_callback(ADV_DVC_VAR *, uchar);
-STATIC void       asc_enqueue(asc_queue_t *, REQP, int);
-STATIC REQP       asc_dequeue(asc_queue_t *, int);
-STATIC REQP       asc_dequeue_list(asc_queue_t *, REQP *, int);
-STATIC int        asc_rmqueue(asc_queue_t *, REQP);
-STATIC void       asc_execute_queue(asc_queue_t *);
+static irqreturn_t advansys_interrupt(int, void *);
+static int advansys_slave_configure(struct scsi_device *);
+static void asc_scsi_done_list(struct scsi_cmnd *);
+static int asc_execute_scsi_cmnd(struct scsi_cmnd *);
+static int asc_build_req(asc_board_t *, struct scsi_cmnd *);
+static int adv_build_req(asc_board_t *, struct scsi_cmnd *, ADV_SCSI_REQ_Q **);
+static int adv_get_sglist(asc_board_t *, adv_req_t *, struct scsi_cmnd *, int);
+static void asc_isr_callback(ASC_DVC_VAR *, ASC_QDONE_INFO *);
+static void adv_isr_callback(ADV_DVC_VAR *, ADV_SCSI_REQ_Q *);
+static void adv_async_callback(ADV_DVC_VAR *, uchar);
+static void asc_enqueue(asc_queue_t *, REQP, int);
+static REQP asc_dequeue(asc_queue_t *, int);
+static REQP asc_dequeue_list(asc_queue_t *, REQP *, int);
+static int asc_rmqueue(asc_queue_t *, REQP);
+static void asc_execute_queue(asc_queue_t *);
 #ifdef CONFIG_PROC_FS
-STATIC int        asc_proc_copy(off_t, off_t, char *, int , char *, int);
-STATIC int        asc_prt_board_devices(struct Scsi_Host *, char *, int);
-STATIC int        asc_prt_adv_bios(struct Scsi_Host *, char *, int);
-STATIC int        asc_get_eeprom_string(ushort *serialnum, uchar *cp);
-STATIC int        asc_prt_asc_board_eeprom(struct Scsi_Host *, char *, int);
-STATIC int        asc_prt_adv_board_eeprom(struct Scsi_Host *, char *, int);
-STATIC int        asc_prt_driver_conf(struct Scsi_Host *, char *, int);
-STATIC int        asc_prt_asc_board_info(struct Scsi_Host *, char *, int);
-STATIC int        asc_prt_adv_board_info(struct Scsi_Host *, char *, int);
-STATIC int        asc_prt_line(char *, int, char *fmt, ...);
+static int asc_proc_copy(off_t, off_t, char *, int, char *, int);
+static int asc_prt_board_devices(struct Scsi_Host *, char *, int);
+static int asc_prt_adv_bios(struct Scsi_Host *, char *, int);
+static int asc_get_eeprom_string(ushort *serialnum, uchar *cp);
+static int asc_prt_asc_board_eeprom(struct Scsi_Host *, char *, int);
+static int asc_prt_adv_board_eeprom(struct Scsi_Host *, char *, int);
+static int asc_prt_driver_conf(struct Scsi_Host *, char *, int);
+static int asc_prt_asc_board_info(struct Scsi_Host *, char *, int);
+static int asc_prt_adv_board_info(struct Scsi_Host *, char *, int);
+static int asc_prt_line(char *, int, char *fmt, ...);
 #endif /* CONFIG_PROC_FS */
 
 /* Declaration for Asc Library internal functions referenced by driver. */
-STATIC int          AscFindSignature(PortAddr);
-STATIC ushort       AscGetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
+static int AscFindSignature(PortAddr);
+static ushort AscGetEEPConfig(PortAddr, ASCEEP_CONFIG *, ushort);
 
 /* Statistics function prototypes. */
 #ifdef ADVANSYS_STATS
 #ifdef CONFIG_PROC_FS
-STATIC int          asc_prt_board_stats(struct Scsi_Host *, char *, int);
-STATIC int          asc_prt_target_stats(struct Scsi_Host *, int, char *, int);
+static int asc_prt_board_stats(struct Scsi_Host *, char *, int);
+static int asc_prt_target_stats(struct Scsi_Host *, int, char *, int);
 #endif /* CONFIG_PROC_FS */
 #endif /* ADVANSYS_STATS */
 
 /* Debug function prototypes. */
 #ifdef ADVANSYS_DEBUG
-STATIC void         asc_prt_scsi_host(struct Scsi_Host *);
-STATIC void         asc_prt_scsi_cmnd(struct scsi_cmnd *);
-STATIC void         asc_prt_asc_dvc_cfg(ASC_DVC_CFG *);
-STATIC void         asc_prt_asc_dvc_var(ASC_DVC_VAR *);
-STATIC void         asc_prt_asc_scsi_q(ASC_SCSI_Q *);
-STATIC void         asc_prt_asc_qdone_info(ASC_QDONE_INFO *);
-STATIC void         asc_prt_adv_dvc_cfg(ADV_DVC_CFG *);
-STATIC void         asc_prt_adv_dvc_var(ADV_DVC_VAR *);
-STATIC void         asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *);
-STATIC void         asc_prt_adv_sgblock(int, ADV_SG_BLOCK *);
-STATIC void         asc_prt_hex(char *f, uchar *, int);
+static void asc_prt_scsi_host(struct Scsi_Host *);
+static void asc_prt_scsi_cmnd(struct scsi_cmnd *);
+static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *);
+static void asc_prt_asc_dvc_var(ASC_DVC_VAR *);
+static void asc_prt_asc_scsi_q(ASC_SCSI_Q *);
+static void asc_prt_asc_qdone_info(ASC_QDONE_INFO *);
+static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *);
+static void asc_prt_adv_dvc_var(ADV_DVC_VAR *);
+static void asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *);
+static void asc_prt_adv_sgblock(int, ADV_SG_BLOCK *);
+static void asc_prt_hex(char *f, uchar *, int);
 #endif /* ADVANSYS_DEBUG */
 
-
 #ifdef CONFIG_PROC_FS
 /*
  * advansys_proc_info() - /proc/scsi/advansys/[0-(ASC_NUM_BOARD_SUPPORTED-1)]
@@ -4073,1389 +4034,210 @@ STATIC void         asc_prt_hex(char *f, uchar *, int);
  */
 static int
 advansys_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
-               off_t offset, int length, int inout)
+                  off_t offset, int length, int inout)
 {
-    struct Scsi_Host    *shp;
-    asc_board_t         *boardp;
-    int                 i;
-    char                *cp;
-    int                        cplen;
-    int                 cnt;
-    int                 totcnt;
-    int                 leftlen;
-    char                *curbuf;
-    off_t               advoffset;
+       struct Scsi_Host *shp;
+       asc_board_t *boardp;
+       int i;
+       char *cp;
+       int cplen;
+       int cnt;
+       int totcnt;
+       int leftlen;
+       char *curbuf;
+       off_t advoffset;
 #ifdef ADVANSYS_STATS
-    int                 tgt_id;
+       int tgt_id;
 #endif /* ADVANSYS_STATS */
 
-    ASC_DBG(1, "advansys_proc_info: begin\n");
-
-    /*
-     * User write not supported.
-     */
-    if (inout == TRUE) {
-        return(-ENOSYS);
-    }
-
-    /*
-     * User read of /proc/scsi/advansys/[0...] file.
-     */
-
-    /* Find the specified board. */
-    for (i = 0; i < asc_board_count; i++) {
-        if (asc_host[i]->host_no == shost->host_no) {
-            break;
-        }
-    }
-    if (i == asc_board_count) {
-        return(-ENOENT);
-    }
-
-    shp = asc_host[i];
-    boardp = ASC_BOARDP(shp);
+       ASC_DBG(1, "advansys_proc_info: begin\n");
 
-    /* Copy read data starting at the beginning of the buffer. */
-    *start = buffer;
-    curbuf = buffer;
-    advoffset = 0;
-    totcnt = 0;
-    leftlen = length;
-
-    /*
-     * Get board configuration information.
-     *
-     * advansys_info() returns the board string from its own static buffer.
-     */
-    cp = (char *) advansys_info(shp);
-    strcat(cp, "\n");
-    cplen = strlen(cp);
-    /* Copy board information. */
-    cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-    totcnt += cnt;
-    leftlen -= cnt;
-    if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-    }
-    advoffset += cplen;
-    curbuf += cnt;
+       /*
+        * User write not supported.
+        */
+       if (inout == TRUE) {
+               return (-ENOSYS);
+       }
 
-    /*
-     * Display Wide Board BIOS Information.
-     */
-    if (ASC_WIDE_BOARD(boardp)) {
-        cp = boardp->prtbuf;
-        cplen = asc_prt_adv_bios(shp, cp, ASC_PRTBUF_SIZE);
-        ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
-        cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-        totcnt += cnt;
-        leftlen -= cnt;
-        if (leftlen == 0) {
-            ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-            return totcnt;
-        }
-        advoffset += cplen;
-        curbuf += cnt;
-    }
+       /*
+        * User read of /proc/scsi/advansys/[0...] file.
+        */
 
-    /*
-     * Display driver information for each device attached to the board.
-     */
-    cp = boardp->prtbuf;
-    cplen = asc_prt_board_devices(shp, cp, ASC_PRTBUF_SIZE);
-    ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
-    cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-    totcnt += cnt;
-    leftlen -= cnt;
-    if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-    }
-    advoffset += cplen;
-    curbuf += cnt;
+       /* Find the specified board. */
+       for (i = 0; i < asc_board_count; i++) {
+               if (asc_host[i]->host_no == shost->host_no) {
+                       break;
+               }
+       }
+       if (i == asc_board_count) {
+               return (-ENOENT);
+       }
 
-    /*
-     * Display EEPROM configuration for the board.
-     */
-    cp = boardp->prtbuf;
-    if (ASC_NARROW_BOARD(boardp)) {
-        cplen = asc_prt_asc_board_eeprom(shp, cp, ASC_PRTBUF_SIZE);
-    } else {
-        cplen = asc_prt_adv_board_eeprom(shp, cp, ASC_PRTBUF_SIZE);
-    }
-    ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
-    cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-    totcnt += cnt;
-    leftlen -= cnt;
-    if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-    }
-    advoffset += cplen;
-    curbuf += cnt;
+       shp = asc_host[i];
+       boardp = ASC_BOARDP(shp);
+
+       /* Copy read data starting at the beginning of the buffer. */
+       *start = buffer;
+       curbuf = buffer;
+       advoffset = 0;
+       totcnt = 0;
+       leftlen = length;
+
+       /*
+        * Get board configuration information.
+        *
+        * advansys_info() returns the board string from its own static buffer.
+        */
+       cp = (char *)advansys_info(shp);
+       strcat(cp, "\n");
+       cplen = strlen(cp);
+       /* Copy board information. */
+       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
+       totcnt += cnt;
+       leftlen -= cnt;
+       if (leftlen == 0) {
+               ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+               return totcnt;
+       }
+       advoffset += cplen;
+       curbuf += cnt;
+
+       /*
+        * Display Wide Board BIOS Information.
+        */
+       if (ASC_WIDE_BOARD(boardp)) {
+               cp = boardp->prtbuf;
+               cplen = asc_prt_adv_bios(shp, cp, ASC_PRTBUF_SIZE);
+               ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
+               cnt =
+                   asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
+                                 cplen);
+               totcnt += cnt;
+               leftlen -= cnt;
+               if (leftlen == 0) {
+                       ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+                       return totcnt;
+               }
+               advoffset += cplen;
+               curbuf += cnt;
+       }
 
-    /*
-     * Display driver configuration and information for the board.
-     */
-    cp = boardp->prtbuf;
-    cplen = asc_prt_driver_conf(shp, cp, ASC_PRTBUF_SIZE);
-    ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
-    cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-    totcnt += cnt;
-    leftlen -= cnt;
-    if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-    }
-    advoffset += cplen;
-    curbuf += cnt;
+       /*
+        * Display driver information for each device attached to the board.
+        */
+       cp = boardp->prtbuf;
+       cplen = asc_prt_board_devices(shp, cp, ASC_PRTBUF_SIZE);
+       ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
+       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
+       totcnt += cnt;
+       leftlen -= cnt;
+       if (leftlen == 0) {
+               ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+               return totcnt;
+       }
+       advoffset += cplen;
+       curbuf += cnt;
+
+       /*
+        * Display EEPROM configuration for the board.
+        */
+       cp = boardp->prtbuf;
+       if (ASC_NARROW_BOARD(boardp)) {
+               cplen = asc_prt_asc_board_eeprom(shp, cp, ASC_PRTBUF_SIZE);
+       } else {
+               cplen = asc_prt_adv_board_eeprom(shp, cp, ASC_PRTBUF_SIZE);
+       }
+       ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
+       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
+       totcnt += cnt;
+       leftlen -= cnt;
+       if (leftlen == 0) {
+               ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+               return totcnt;
+       }
+       advoffset += cplen;
+       curbuf += cnt;
+
+       /*
+        * Display driver configuration and information for the board.
+        */
+       cp = boardp->prtbuf;
+       cplen = asc_prt_driver_conf(shp, cp, ASC_PRTBUF_SIZE);
+       ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
+       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
+       totcnt += cnt;
+       leftlen -= cnt;
+       if (leftlen == 0) {
+               ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+               return totcnt;
+       }
+       advoffset += cplen;
+       curbuf += cnt;
 
 #ifdef ADVANSYS_STATS
-    /*
-     * Display driver statistics for the board.
-     */
-    cp = boardp->prtbuf;
-    cplen = asc_prt_board_stats(shp, cp, ASC_PRTBUF_SIZE);
-    ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
-    cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-    totcnt += cnt;
-    leftlen -= cnt;
-    if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-    }
-    advoffset += cplen;
-    curbuf += cnt;
-
-    /*
-     * Display driver statistics for each target.
-     */
-    for (tgt_id = 0; tgt_id <= ADV_MAX_TID; tgt_id++) {
-      cp = boardp->prtbuf;
-      cplen = asc_prt_target_stats(shp, tgt_id, cp, ASC_PRTBUF_SIZE);
-      ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
-      cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-      totcnt += cnt;
-      leftlen -= cnt;
-      if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-      }
-      advoffset += cplen;
-      curbuf += cnt;
-    }
+       /*
+        * Display driver statistics for the board.
+        */
+       cp = boardp->prtbuf;
+       cplen = asc_prt_board_stats(shp, cp, ASC_PRTBUF_SIZE);
+       ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
+       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
+       totcnt += cnt;
+       leftlen -= cnt;
+       if (leftlen == 0) {
+               ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+               return totcnt;
+       }
+       advoffset += cplen;
+       curbuf += cnt;
+
+       /*
+        * Display driver statistics for each target.
+        */
+       for (tgt_id = 0; tgt_id <= ADV_MAX_TID; tgt_id++) {
+               cp = boardp->prtbuf;
+               cplen = asc_prt_target_stats(shp, tgt_id, cp, ASC_PRTBUF_SIZE);
+               ASC_ASSERT(cplen <= ASC_PRTBUF_SIZE);
+               cnt =
+                   asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
+                                 cplen);
+               totcnt += cnt;
+               leftlen -= cnt;
+               if (leftlen == 0) {
+                       ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+                       return totcnt;
+               }
+               advoffset += cplen;
+               curbuf += cnt;
+       }
 #endif /* ADVANSYS_STATS */
 
-    /*
-     * Display Asc Library dynamic configuration information
-     * for the board.
-     */
-    cp = boardp->prtbuf;
-    if (ASC_NARROW_BOARD(boardp)) {
-        cplen = asc_prt_asc_board_info(shp, cp, ASC_PRTBUF_SIZE);
-    } else {
-        cplen = asc_prt_adv_board_info(shp, cp, ASC_PRTBUF_SIZE);
-    }
-    ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
-    cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
-    totcnt += cnt;
-    leftlen -= cnt;
-    if (leftlen == 0) {
-        ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-        return totcnt;
-    }
-    advoffset += cplen;
-    curbuf += cnt;
-
-    ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
-
-    return totcnt;
-}
-#endif /* CONFIG_PROC_FS */
-
-/*
- * advansys_detect()
- *
- * Detect function for AdvanSys adapters.
- *
- * Argument is a pointer to the host driver's scsi_hosts entry.
- *
- * Return number of adapters found.
- *
- * Note: Because this function is called during system initialization
- * it must not call SCSI mid-level functions including scsi_malloc()
- * and scsi_free().
- */
-static int __init
-advansys_detect(struct scsi_host_template *tpnt)
-{
-    static int          detect_called = ASC_FALSE;
-    int                 iop;
-    int                 bus;
-    struct Scsi_Host    *shp = NULL;
-    asc_board_t         *boardp = NULL;
-    ASC_DVC_VAR         *asc_dvc_varp = NULL;
-    ADV_DVC_VAR         *adv_dvc_varp = NULL;
-    adv_sgblk_t         *sgp = NULL;
-    int                 ioport = 0;
-    int                 share_irq = FALSE;
-    int                 iolen = 0;
-    struct device      *dev = NULL;
-#ifdef CONFIG_PCI
-    int                 pci_init_search = 0;
-    struct pci_dev      *pci_devicep[ASC_NUM_BOARD_SUPPORTED];
-    int                 pci_card_cnt_max = 0;
-    int                 pci_card_cnt = 0;
-    struct pci_dev      *pci_devp = NULL;
-    int                 pci_device_id_cnt = 0;
-    unsigned int        pci_device_id[ASC_PCI_DEVICE_ID_CNT] = {
-                                    PCI_DEVICE_ID_ASP_1200A,
-                                    PCI_DEVICE_ID_ASP_ABP940,
-                                    PCI_DEVICE_ID_ASP_ABP940U,
-                                    PCI_DEVICE_ID_ASP_ABP940UW,
-                                    PCI_DEVICE_ID_38C0800_REV1,
-                                    PCI_DEVICE_ID_38C1600_REV1
-                        };
-    ADV_PADDR           pci_memory_address;
-#endif /* CONFIG_PCI */
-    int                 warn_code, err_code;
-    int                 ret;
-
-    if (detect_called == ASC_FALSE) {
-        detect_called = ASC_TRUE;
-    } else {
-        printk("AdvanSys SCSI: advansys_detect() multiple calls ignored\n");
-        return 0;
-    }
-
-    ASC_DBG(1, "advansys_detect: begin\n");
-
-    asc_board_count = 0;
-
-    /*
-     * If I/O port probing has been modified, then verify and
-     * clean-up the 'asc_ioport' list.
-     */
-    if (asc_iopflag == ASC_TRUE) {
-        for (ioport = 0; ioport < ASC_NUM_IOPORT_PROBE; ioport++) {
-            ASC_DBG2(1, "advansys_detect: asc_ioport[%d] 0x%x\n",
-                ioport, asc_ioport[ioport]);
-            if (asc_ioport[ioport] != 0) {
-                for (iop = 0; iop < ASC_IOADR_TABLE_MAX_IX; iop++) {
-                    if (_asc_def_iop_base[iop] == asc_ioport[ioport]) {
-                        break;
-                    }
-                }
-                if (iop == ASC_IOADR_TABLE_MAX_IX) {
-                    printk(
-"AdvanSys SCSI: specified I/O Port 0x%X is invalid\n",
-                        asc_ioport[ioport]);
-                    asc_ioport[ioport] = 0;
-                }
-            }
-        }
-        ioport = 0;
-    }
-
-    for (bus = 0; bus < ASC_NUM_BUS; bus++) {
-
-        ASC_DBG2(1, "advansys_detect: bus search type %d (%s)\n",
-            bus, asc_bus_name[bus]);
-        iop = 0;
-
-        while (asc_board_count < ASC_NUM_BOARD_SUPPORTED) {
-
-            ASC_DBG1(2, "advansys_detect: asc_board_count %d\n",
-                asc_board_count);
-
-            switch (asc_bus[bus]) {
-            case ASC_IS_ISA:
-            case ASC_IS_VL:
-#ifdef CONFIG_ISA
-                if (asc_iopflag == ASC_FALSE) {
-                    iop = AscSearchIOPortAddr(iop, asc_bus[bus]);
-                } else {
-                    /*
-                     * ISA and VL I/O port scanning has either been
-                     * eliminated or limited to selected ports on
-                     * the LILO command line, /etc/lilo.conf, or
-                     * by setting variables when the module was loaded.
-                     */
-                    ASC_DBG(1, "advansys_detect: I/O port scanning modified\n");
-                ioport_try_again:
-                    iop = 0;
-                    for (; ioport < ASC_NUM_IOPORT_PROBE; ioport++) {
-                        if ((iop = asc_ioport[ioport]) != 0) {
-                            break;
-                        }
-                    }
-                    if (iop) {
-                        ASC_DBG1(1,
-                                "advansys_detect: probing I/O port 0x%x...\n",
-                            iop);
-                       if (!request_region(iop, ASC_IOADR_GAP, "advansys")){
-                            printk(
-"AdvanSys SCSI: specified I/O Port 0x%X is busy\n", iop);
-                            /* Don't try this I/O port twice. */
-                            asc_ioport[ioport] = 0;
-                            goto ioport_try_again;
-                        } else if (AscFindSignature(iop) == ASC_FALSE) {
-                            printk(
-"AdvanSys SCSI: specified I/O Port 0x%X has no adapter\n", iop);
-                            /* Don't try this I/O port twice. */
-                           release_region(iop, ASC_IOADR_GAP);
-                            asc_ioport[ioport] = 0;
-                            goto ioport_try_again;
-                        } else {
-                            /*
-                             * If this isn't an ISA board, then it must be
-                             * a VL board. If currently looking an ISA
-                             * board is being looked for then try for
-                             * another ISA board in 'asc_ioport'.
-                             */
-                            if (asc_bus[bus] == ASC_IS_ISA &&
-                                (AscGetChipVersion(iop, ASC_IS_ISA) &
-                                 ASC_CHIP_VER_ISA_BIT) == 0) {
-                                 /*
-                                  * Don't clear 'asc_ioport[ioport]'. Try
-                                  * this board again for VL. Increment
-                                  * 'ioport' past this board.
-                                  */
-                                 ioport++;
-                                release_region(iop, ASC_IOADR_GAP);
-                                 goto ioport_try_again;
-                            }
-                        }
-                        /*
-                         * This board appears good, don't try the I/O port
-                         * again by clearing its value. Increment 'ioport'
-                         * for the next iteration.
-                         */
-                        asc_ioport[ioport++] = 0;
-                    }
-                }
-#endif /* CONFIG_ISA */
-                break;
-
-            case ASC_IS_EISA:
-#ifdef CONFIG_ISA
-                iop = AscSearchIOPortAddr(iop, asc_bus[bus]);
-#endif /* CONFIG_ISA */
-                break;
-
-            case ASC_IS_PCI:
-#ifdef CONFIG_PCI
-                if (pci_init_search == 0) {
-                    int i, j;
-
-                    pci_init_search = 1;
-
-                    /* Find all PCI cards. */
-                    while (pci_device_id_cnt < ASC_PCI_DEVICE_ID_CNT) {
-                        if ((pci_devp = pci_find_device(PCI_VENDOR_ID_ASP,
-                            pci_device_id[pci_device_id_cnt], pci_devp)) ==
-                            NULL) {
-                            pci_device_id_cnt++;
-                        } else {
-                            if (pci_enable_device(pci_devp) == 0) {
-                                pci_devicep[pci_card_cnt_max++] = pci_devp;
-                            }
-                        }
-                    }
-
-                    /*
-                     * Sort PCI cards in ascending order by PCI Bus, Slot,
-                     * and Device Number.
-                     */
-                    for (i = 0; i < pci_card_cnt_max - 1; i++)
-                    {
-                        for (j = i + 1; j < pci_card_cnt_max; j++) {
-                            if ((pci_devicep[j]->bus->number <
-                                 pci_devicep[i]->bus->number) ||
-                                ((pci_devicep[j]->bus->number ==
-                                  pci_devicep[i]->bus->number) &&
-                                  (pci_devicep[j]->devfn <
-                                   pci_devicep[i]->devfn))) {
-                                pci_devp = pci_devicep[i];
-                                pci_devicep[i] = pci_devicep[j];
-                                pci_devicep[j] = pci_devp;
-                            }
-                        }
-                    }
-
-                    pci_card_cnt = 0;
-                } else {
-                    pci_card_cnt++;
-                }
-
-                if (pci_card_cnt == pci_card_cnt_max) {
-                    iop = 0;
-                } else {
-                    pci_devp = pci_devicep[pci_card_cnt];
-
-                    ASC_DBG2(2,
-                        "advansys_detect: devfn %d, bus number %d\n",
-                        pci_devp->devfn, pci_devp->bus->number);
-                    iop = pci_resource_start(pci_devp, 0);
-                    ASC_DBG2(1,
-                        "advansys_detect: vendorID %X, deviceID %X\n",
-                        pci_devp->vendor, pci_devp->device);
-                    ASC_DBG2(2, "advansys_detect: iop %X, irqLine %d\n",
-                        iop, pci_devp->irq);
-                }
-               if(pci_devp)
-                   dev = &pci_devp->dev;
-
-#endif /* CONFIG_PCI */
-                break;
-
-            default:
-                ASC_PRINT1("advansys_detect: unknown bus type: %d\n",
-                    asc_bus[bus]);
-                break;
-            }
-            ASC_DBG1(1, "advansys_detect: iop 0x%x\n", iop);
-
-            /*
-             * Adapter not found, try next bus type.
-             */
-            if (iop == 0) {
-                break;
-            }
-
-            /*
-             * Adapter found.
-             *
-             * Register the adapter, get its configuration, and
-             * initialize it.
-             */
-            ASC_DBG(2, "advansys_detect: scsi_register()\n");
-            shp = scsi_register(tpnt, sizeof(asc_board_t));
-
-            if (shp == NULL) {
-                continue;
-            }
-
-            /* Save a pointer to the Scsi_Host of each board found. */
-            asc_host[asc_board_count++] = shp;
-
-            /* Initialize private per board data */
-            boardp = ASC_BOARDP(shp);
-            memset(boardp, 0, sizeof(asc_board_t));
-            boardp->id = asc_board_count - 1;
-
-            /* Initialize spinlock. */
-            spin_lock_init(&boardp->lock);
-
-            /*
-             * Handle both narrow and wide boards.
-             *
-             * If a Wide board was detected, set the board structure
-             * wide board flag. Set-up the board structure based on
-             * the board type.
-             */
-#ifdef CONFIG_PCI
-            if (asc_bus[bus] == ASC_IS_PCI &&
-                (pci_devp->device == PCI_DEVICE_ID_ASP_ABP940UW ||
-                 pci_devp->device == PCI_DEVICE_ID_38C0800_REV1 ||
-                 pci_devp->device == PCI_DEVICE_ID_38C1600_REV1))
-            {
-                boardp->flags |= ASC_IS_WIDE_BOARD;
-            }
-#endif /* CONFIG_PCI */
-
-            if (ASC_NARROW_BOARD(boardp)) {
-                ASC_DBG(1, "advansys_detect: narrow board\n");
-                asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
-                asc_dvc_varp->bus_type = asc_bus[bus];
-                asc_dvc_varp->drv_ptr = boardp;
-                asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg;
-                asc_dvc_varp->cfg->overrun_buf = &overrun_buf[0];
-                asc_dvc_varp->iop_base = iop;
-                asc_dvc_varp->isr_callback = asc_isr_callback;
-            } else {
-                ASC_DBG(1, "advansys_detect: wide board\n");
-                adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
-                adv_dvc_varp->drv_ptr = boardp;
-                adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg;
-                adv_dvc_varp->isr_callback = adv_isr_callback;
-                adv_dvc_varp->async_callback = adv_async_callback;
-#ifdef CONFIG_PCI
-                if (pci_devp->device == PCI_DEVICE_ID_ASP_ABP940UW)
-                {
-                    ASC_DBG(1, "advansys_detect: ASC-3550\n");
-                    adv_dvc_varp->chip_type = ADV_CHIP_ASC3550;
-                } else if (pci_devp->device == PCI_DEVICE_ID_38C0800_REV1)
-                {
-                    ASC_DBG(1, "advansys_detect: ASC-38C0800\n");
-                    adv_dvc_varp->chip_type = ADV_CHIP_ASC38C0800;
-                } else
-                {
-                    ASC_DBG(1, "advansys_detect: ASC-38C1600\n");
-                    adv_dvc_varp->chip_type = ADV_CHIP_ASC38C1600;
-                }
-#endif /* CONFIG_PCI */
-
-                /*
-                 * Map the board's registers into virtual memory for
-                 * PCI slave access. Only memory accesses are used to
-                 * access the board's registers.
-                 *
-                 * Note: The PCI register base address is not always
-                 * page aligned, but the address passed to ioremap()
-                 * must be page aligned. It is guaranteed that the
-                 * PCI register base address will not cross a page
-                 * boundary.
-                 */
-                if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-                {
-                    iolen = ADV_3550_IOLEN;
-                } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-                {
-                    iolen = ADV_38C0800_IOLEN;
-                } else
-                {
-                    iolen = ADV_38C1600_IOLEN;
-                }
-#ifdef CONFIG_PCI
-                pci_memory_address = pci_resource_start(pci_devp, 1);
-                ASC_DBG1(1, "advansys_detect: pci_memory_address: 0x%lx\n",
-                    (ulong) pci_memory_address);
-                if ((boardp->ioremap_addr =
-                    ioremap(pci_memory_address & PAGE_MASK,
-                         PAGE_SIZE)) == 0) {
-                   ASC_PRINT3(
-"advansys_detect: board %d: ioremap(%x, %d) returned NULL\n",
-                       boardp->id, pci_memory_address, iolen);
-                   scsi_unregister(shp);
-                   asc_board_count--;
-                   continue;
-                }
-                ASC_DBG1(1, "advansys_detect: ioremap_addr: 0x%lx\n",
-                    (ulong) boardp->ioremap_addr);
-                adv_dvc_varp->iop_base = (AdvPortAddr)
-                    (boardp->ioremap_addr +
-                     (pci_memory_address - (pci_memory_address & PAGE_MASK)));
-                ASC_DBG1(1, "advansys_detect: iop_base: 0x%lx\n",
-                    adv_dvc_varp->iop_base);
-#endif /* CONFIG_PCI */
-
-                /*
-                 * Even though it isn't used to access wide boards, other
-                 * than for the debug line below, save I/O Port address so
-                 * that it can be reported.
-                 */
-                boardp->ioport = iop;
-
-                ASC_DBG2(1,
-"advansys_detect: iopb_chip_id_1 0x%x, iopw_chip_id_0 0x%x\n",
-                    (ushort) inp(iop + 1), (ushort) inpw(iop));
-            }
-
-#ifdef CONFIG_PROC_FS
-            /*
-             * Allocate buffer for printing information from
-             * /proc/scsi/advansys/[0...].
-             */
-            if ((boardp->prtbuf =
-                kmalloc(ASC_PRTBUF_SIZE, GFP_ATOMIC)) == NULL) {
-                ASC_PRINT3(
-"advansys_detect: board %d: kmalloc(%d, %d) returned NULL\n",
-                    boardp->id, ASC_PRTBUF_SIZE, GFP_ATOMIC);
-                scsi_unregister(shp);
-                asc_board_count--;
-                continue;
-            }
-#endif /* CONFIG_PROC_FS */
-
-            if (ASC_NARROW_BOARD(boardp)) {
-               asc_dvc_varp->cfg->dev = dev;
-               /*
-                 * Set the board bus type and PCI IRQ before
-                 * calling AscInitGetConfig().
-                 */
-                switch (asc_dvc_varp->bus_type) {
-#ifdef CONFIG_ISA
-                case ASC_IS_ISA:
-                    shp->unchecked_isa_dma = TRUE;
-                    share_irq = FALSE;
-                    break;
-                case ASC_IS_VL:
-                    shp->unchecked_isa_dma = FALSE;
-                    share_irq = FALSE;
-                    break;
-                case ASC_IS_EISA:
-                    shp->unchecked_isa_dma = FALSE;
-                    share_irq = TRUE;
-                    break;
-#endif /* CONFIG_ISA */
-#ifdef CONFIG_PCI
-                case ASC_IS_PCI:
-                    shp->irq = asc_dvc_varp->irq_no = pci_devp->irq;
-                    asc_dvc_varp->cfg->pci_slot_info =
-                        ASC_PCI_MKID(pci_devp->bus->number,
-                            PCI_SLOT(pci_devp->devfn),
-                            PCI_FUNC(pci_devp->devfn));
-                    shp->unchecked_isa_dma = FALSE;
-                    share_irq = TRUE;
-                    break;
-#endif /* CONFIG_PCI */
-                default:
-                    ASC_PRINT2(
-"advansys_detect: board %d: unknown adapter type: %d\n",
-                        boardp->id, asc_dvc_varp->bus_type);
-                    shp->unchecked_isa_dma = TRUE;
-                    share_irq = FALSE;
-                    break;
-                }
-            } else {
-                adv_dvc_varp->cfg->dev = dev;
-                /*
-                 * For Wide boards set PCI information before calling
-                 * AdvInitGetConfig().
-                 */
-#ifdef CONFIG_PCI
-                shp->irq = adv_dvc_varp->irq_no = pci_devp->irq;
-                adv_dvc_varp->cfg->pci_slot_info =
-                    ASC_PCI_MKID(pci_devp->bus->number,
-                        PCI_SLOT(pci_devp->devfn),
-                        PCI_FUNC(pci_devp->devfn));
-                shp->unchecked_isa_dma = FALSE;
-                share_irq = TRUE;
-#endif /* CONFIG_PCI */
-            }
-
-            /*
-             * Read the board configuration.
-             */
-            if (ASC_NARROW_BOARD(boardp)) {
-                 /*
-                  * NOTE: AscInitGetConfig() may change the board's
-                  * bus_type value. The asc_bus[bus] value should no
-                  * longer be used. If the bus_type field must be
-                  * referenced only use the bit-wise AND operator "&".
-                  */
-                ASC_DBG(2, "advansys_detect: AscInitGetConfig()\n");
-                switch(ret = AscInitGetConfig(asc_dvc_varp)) {
-                case 0:    /* No error */
-                    break;
-                case ASC_WARN_IO_PORT_ROTATE:
-                    ASC_PRINT1(
-"AscInitGetConfig: board %d: I/O port address modified\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_AUTO_CONFIG:
-                    ASC_PRINT1(
-"AscInitGetConfig: board %d: I/O port increment switch enabled\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_EEPROM_CHKSUM:
-                    ASC_PRINT1(
-"AscInitGetConfig: board %d: EEPROM checksum error\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_IRQ_MODIFIED:
-                    ASC_PRINT1(
-"AscInitGetConfig: board %d: IRQ modified\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_CMD_QNG_CONFLICT:
-                    ASC_PRINT1(
-"AscInitGetConfig: board %d: tag queuing enabled w/o disconnects\n",
-                        boardp->id);
-                    break;
-                default:
-                    ASC_PRINT2(
-"AscInitGetConfig: board %d: unknown warning: 0x%x\n",
-                        boardp->id, ret);
-                    break;
-                }
-                if ((err_code = asc_dvc_varp->err_code) != 0) {
-                    ASC_PRINT3(
-"AscInitGetConfig: board %d error: init_state 0x%x, err_code 0x%x\n",
-                        boardp->id, asc_dvc_varp->init_state,
-                        asc_dvc_varp->err_code);
-                }
-            } else {
-                ASC_DBG(2, "advansys_detect: AdvInitGetConfig()\n");
-                if ((ret = AdvInitGetConfig(adv_dvc_varp)) != 0) {
-                    ASC_PRINT2("AdvInitGetConfig: board %d: warning: 0x%x\n",
-                        boardp->id, ret);
-                }
-                if ((err_code = adv_dvc_varp->err_code) != 0) {
-                    ASC_PRINT2(
-"AdvInitGetConfig: board %d error: err_code 0x%x\n",
-                        boardp->id, adv_dvc_varp->err_code);
-                }
-            }
-
-            if (err_code != 0) {
-#ifdef CONFIG_PROC_FS
-                kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
-                scsi_unregister(shp);
-                asc_board_count--;
-                continue;
-            }
-
-            /*
-             * Save the EEPROM configuration so that it can be displayed
-             * from /proc/scsi/advansys/[0...].
-             */
-            if (ASC_NARROW_BOARD(boardp)) {
-
-                ASCEEP_CONFIG *ep;
-
-                /*
-                 * Set the adapter's target id bit in the 'init_tidmask' field.
-                 */
-                boardp->init_tidmask |=
-                    ADV_TID_TO_TIDMASK(asc_dvc_varp->cfg->chip_scsi_id);
-
-                /*
-                 * Save EEPROM settings for the board.
-                 */
-                ep = &boardp->eep_config.asc_eep;
-
-                ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable;
-                ep->disc_enable = asc_dvc_varp->cfg->disc_enable;
-                ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled;
-                ASC_EEP_SET_DMA_SPD(ep, asc_dvc_varp->cfg->isa_dma_speed);
-                ep->start_motor = asc_dvc_varp->start_motor;
-                ep->cntl = asc_dvc_varp->dvc_cntl;
-                ep->no_scam = asc_dvc_varp->no_scam;
-                ep->max_total_qng = asc_dvc_varp->max_total_qng;
-                ASC_EEP_SET_CHIP_ID(ep, asc_dvc_varp->cfg->chip_scsi_id);
-                /* 'max_tag_qng' is set to the same value for every device. */
-                ep->max_tag_qng = asc_dvc_varp->cfg->max_tag_qng[0];
-                ep->adapter_info[0] = asc_dvc_varp->cfg->adapter_info[0];
-                ep->adapter_info[1] = asc_dvc_varp->cfg->adapter_info[1];
-                ep->adapter_info[2] = asc_dvc_varp->cfg->adapter_info[2];
-                ep->adapter_info[3] = asc_dvc_varp->cfg->adapter_info[3];
-                ep->adapter_info[4] = asc_dvc_varp->cfg->adapter_info[4];
-                ep->adapter_info[5] = asc_dvc_varp->cfg->adapter_info[5];
-
-               /*
-                * Modify board configuration.
-                */
-                ASC_DBG(2, "advansys_detect: AscInitSetConfig()\n");
-                switch (ret = AscInitSetConfig(asc_dvc_varp)) {
-                case 0:    /* No error. */
-                    break;
-                case ASC_WARN_IO_PORT_ROTATE:
-                    ASC_PRINT1(
-"AscInitSetConfig: board %d: I/O port address modified\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_AUTO_CONFIG:
-                    ASC_PRINT1(
-"AscInitSetConfig: board %d: I/O port increment switch enabled\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_EEPROM_CHKSUM:
-                    ASC_PRINT1(
-"AscInitSetConfig: board %d: EEPROM checksum error\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_IRQ_MODIFIED:
-                    ASC_PRINT1(
-"AscInitSetConfig: board %d: IRQ modified\n",
-                        boardp->id);
-                    break;
-                case ASC_WARN_CMD_QNG_CONFLICT:
-                    ASC_PRINT1(
-"AscInitSetConfig: board %d: tag queuing w/o disconnects\n",
-                        boardp->id);
-                    break;
-                default:
-                    ASC_PRINT2(
-"AscInitSetConfig: board %d: unknown warning: 0x%x\n",
-                        boardp->id, ret);
-                    break;
-                }
-                if (asc_dvc_varp->err_code != 0) {
-                    ASC_PRINT3(
-"AscInitSetConfig: board %d error: init_state 0x%x, err_code 0x%x\n",
-                        boardp->id, asc_dvc_varp->init_state,
-                        asc_dvc_varp->err_code);
-#ifdef CONFIG_PROC_FS
-                    kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
-                    scsi_unregister(shp);
-                    asc_board_count--;
-                    continue;
-                }
-
-                /*
-                 * Finish initializing the 'Scsi_Host' structure.
-                 */
-                /* AscInitSetConfig() will set the IRQ for non-PCI boards. */
-                if ((asc_dvc_varp->bus_type & ASC_IS_PCI) == 0) {
-                    shp->irq = asc_dvc_varp->irq_no;
-                }
-            } else {
-                ADVEEP_3550_CONFIG      *ep_3550;
-                ADVEEP_38C0800_CONFIG   *ep_38C0800;
-                ADVEEP_38C1600_CONFIG   *ep_38C1600;
-
-                /*
-                 * Save Wide EEP Configuration Information.
-                 */
-                if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-                {
-                    ep_3550 = &boardp->eep_config.adv_3550_eep;
-
-                    ep_3550->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
-                    ep_3550->max_host_qng = adv_dvc_varp->max_host_qng;
-                    ep_3550->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
-                    ep_3550->termination = adv_dvc_varp->cfg->termination;
-                    ep_3550->disc_enable = adv_dvc_varp->cfg->disc_enable;
-                    ep_3550->bios_ctrl = adv_dvc_varp->bios_ctrl;
-                    ep_3550->wdtr_able = adv_dvc_varp->wdtr_able;
-                    ep_3550->sdtr_able = adv_dvc_varp->sdtr_able;
-                    ep_3550->ultra_able = adv_dvc_varp->ultra_able;
-                    ep_3550->tagqng_able = adv_dvc_varp->tagqng_able;
-                    ep_3550->start_motor = adv_dvc_varp->start_motor;
-                    ep_3550->scsi_reset_delay = adv_dvc_varp->scsi_reset_wait;
-                    ep_3550->serial_number_word1 =
-                        adv_dvc_varp->cfg->serial1;
-                    ep_3550->serial_number_word2 =
-                        adv_dvc_varp->cfg->serial2;
-                    ep_3550->serial_number_word3 =
-                        adv_dvc_varp->cfg->serial3;
-                } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-                {
-                    ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
-
-                    ep_38C0800->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
-                    ep_38C0800->max_host_qng = adv_dvc_varp->max_host_qng;
-                    ep_38C0800->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
-                    ep_38C0800->termination_lvd =
-                        adv_dvc_varp->cfg->termination;
-                    ep_38C0800->disc_enable = adv_dvc_varp->cfg->disc_enable;
-                    ep_38C0800->bios_ctrl = adv_dvc_varp->bios_ctrl;
-                    ep_38C0800->wdtr_able = adv_dvc_varp->wdtr_able;
-                    ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
-                    ep_38C0800->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
-                    ep_38C0800->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
-                    ep_38C0800->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
-                    ep_38C0800->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
-                    ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
-                    ep_38C0800->start_motor = adv_dvc_varp->start_motor;
-                    ep_38C0800->scsi_reset_delay =
-                        adv_dvc_varp->scsi_reset_wait;
-                    ep_38C0800->serial_number_word1 =
-                        adv_dvc_varp->cfg->serial1;
-                    ep_38C0800->serial_number_word2 =
-                        adv_dvc_varp->cfg->serial2;
-                    ep_38C0800->serial_number_word3 =
-                        adv_dvc_varp->cfg->serial3;
-                } else
-                {
-                    ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
-
-                    ep_38C1600->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
-                    ep_38C1600->max_host_qng = adv_dvc_varp->max_host_qng;
-                    ep_38C1600->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
-                    ep_38C1600->termination_lvd =
-                        adv_dvc_varp->cfg->termination;
-                    ep_38C1600->disc_enable = adv_dvc_varp->cfg->disc_enable;
-                    ep_38C1600->bios_ctrl = adv_dvc_varp->bios_ctrl;
-                    ep_38C1600->wdtr_able = adv_dvc_varp->wdtr_able;
-                    ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
-                    ep_38C1600->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
-                    ep_38C1600->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
-                    ep_38C1600->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
-                    ep_38C1600->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
-                    ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
-                    ep_38C1600->start_motor = adv_dvc_varp->start_motor;
-                    ep_38C1600->scsi_reset_delay =
-                        adv_dvc_varp->scsi_reset_wait;
-                    ep_38C1600->serial_number_word1 =
-                        adv_dvc_varp->cfg->serial1;
-                    ep_38C1600->serial_number_word2 =
-                        adv_dvc_varp->cfg->serial2;
-                    ep_38C1600->serial_number_word3 =
-                        adv_dvc_varp->cfg->serial3;
-                }
-
-                /*
-                 * Set the adapter's target id bit in the 'init_tidmask' field.
-                 */
-                boardp->init_tidmask |=
-                    ADV_TID_TO_TIDMASK(adv_dvc_varp->chip_scsi_id);
-
-                /*
-                 * Finish initializing the 'Scsi_Host' structure.
-                 */
-                shp->irq = adv_dvc_varp->irq_no;
-            }
-
-            /*
-             * Channels are numbered beginning with 0. For AdvanSys one host
-             * structure supports one channel. Multi-channel boards have a
-             * separate host structure for each channel.
-             */
-            shp->max_channel = 0;
-            if (ASC_NARROW_BOARD(boardp)) {
-                shp->max_id = ASC_MAX_TID + 1;
-                shp->max_lun = ASC_MAX_LUN + 1;
-
-                shp->io_port = asc_dvc_varp->iop_base;
-                boardp->asc_n_io_port = ASC_IOADR_GAP;
-                shp->this_id = asc_dvc_varp->cfg->chip_scsi_id;
-
-                /* Set maximum number of queues the adapter can handle. */
-                shp->can_queue = asc_dvc_varp->max_total_qng;
-            } else {
-                shp->max_id = ADV_MAX_TID + 1;
-                shp->max_lun = ADV_MAX_LUN + 1;
-
-                /*
-                 * Save the I/O Port address and length even though
-                 * I/O ports are not used to access Wide boards.
-                 * Instead the Wide boards are accessed with
-                 * PCI Memory Mapped I/O.
-                 */
-                shp->io_port = iop;
-                boardp->asc_n_io_port = iolen;
-
-                shp->this_id = adv_dvc_varp->chip_scsi_id;
-
-                /* Set maximum number of queues the adapter can handle. */
-                shp->can_queue = adv_dvc_varp->max_host_qng;
-            }
-
-            /*
-             * 'n_io_port' currently is one byte.
-             *
-             * Set a value to 'n_io_port', but never referenced it because
-             * it may be truncated.
-             */
-            shp->n_io_port = boardp->asc_n_io_port <= 255 ?
-                boardp->asc_n_io_port : 255;
-
-            /*
-             * Following v1.3.89, 'cmd_per_lun' is no longer needed
-             * and should be set to zero.
-             *
-             * But because of a bug introduced in v1.3.89 if the driver is
-             * compiled as a module and 'cmd_per_lun' is zero, the Mid-Level
-             * SCSI function 'allocate_device' will panic. To allow the driver
-             * to work as a module in these kernels set 'cmd_per_lun' to 1.
-            *
-            * Note: This is wrong.  cmd_per_lun should be set to the depth
-            * you want on untagged devices always.
-#ifdef MODULE
-             */
-            shp->cmd_per_lun = 1;
-/* #else
-            shp->cmd_per_lun = 0;
-#endif */
-
-            /*
-             * Set the maximum number of scatter-gather elements the
-             * adapter can handle.
-             */
-            if (ASC_NARROW_BOARD(boardp)) {
-                /*
-                 * Allow two commands with 'sg_tablesize' scatter-gather
-                 * elements to be executed simultaneously. This value is
-                 * the theoretical hardware limit. It may be decreased
-                 * below.
-                 */
-                shp->sg_tablesize =
-                    (((asc_dvc_varp->max_total_qng - 2) / 2) *
-                    ASC_SG_LIST_PER_Q) + 1;
-            } else {
-                shp->sg_tablesize = ADV_MAX_SG_LIST;
-            }
-
-            /*
-             * The value of 'sg_tablesize' can not exceed the SCSI
-             * mid-level driver definition of SG_ALL. SG_ALL also
-             * must not be exceeded, because it is used to define the
-             * size of the scatter-gather table in 'struct asc_sg_head'.
-             */
-            if (shp->sg_tablesize > SG_ALL) {
-                shp->sg_tablesize = SG_ALL;
-            }
-
-            ASC_DBG1(1, "advansys_detect: sg_tablesize: %d\n",
-                shp->sg_tablesize);
-
-            /* BIOS start address. */
-            if (ASC_NARROW_BOARD(boardp)) {
-                shp->base =
-                        ((ulong) AscGetChipBiosAddress(
-                            asc_dvc_varp->iop_base,
-                            asc_dvc_varp->bus_type));
-            } else {
-                /*
-                 * Fill-in BIOS board variables. The Wide BIOS saves
-                 * information in LRAM that is used by the driver.
-                 */
-                AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_SIGNATURE,
-                    boardp->bios_signature);
-                AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_VERSION,
-                    boardp->bios_version);
-                AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_CODESEG,
-                    boardp->bios_codeseg);
-                AdvReadWordLram(adv_dvc_varp->iop_base, BIOS_CODELEN,
-                    boardp->bios_codelen);
-
-                ASC_DBG2(1,
-                    "advansys_detect: bios_signature 0x%x, bios_version 0x%x\n",
-                    boardp->bios_signature, boardp->bios_version);
-
-                ASC_DBG2(1,
-                    "advansys_detect: bios_codeseg 0x%x, bios_codelen 0x%x\n",
-                    boardp->bios_codeseg, boardp->bios_codelen);
-
-                /*
-                 * If the BIOS saved a valid signature, then fill in
-                 * the BIOS code segment base address.
-                 */
-                if (boardp->bios_signature == 0x55AA) {
-                    /*
-                     * Convert x86 realmode code segment to a linear
-                     * address by shifting left 4.
-                     */
-                    shp->base = ((ulong) boardp->bios_codeseg << 4);
-                } else {
-                    shp->base = 0;
-                }
-            }
-
-            /*
-             * Register Board Resources - I/O Port, DMA, IRQ
-             */
-
-            /*
-             * Register I/O port range.
-             *
-             * For Wide boards the I/O ports are not used to access
-             * the board, but request the region anyway.
-             *
-             * 'shp->n_io_port' is not referenced, because it may be truncated.
-             */
-            ASC_DBG2(2,
-                "advansys_detect: request_region port 0x%lx, len 0x%x\n",
-                (ulong) shp->io_port, boardp->asc_n_io_port);
-            if (request_region(shp->io_port, boardp->asc_n_io_port,
-                               "advansys") == NULL) {
-                ASC_PRINT3(
-"advansys_detect: board %d: request_region() failed, port 0x%lx, len 0x%x\n",
-                    boardp->id, (ulong) shp->io_port, boardp->asc_n_io_port);
-#ifdef CONFIG_PROC_FS
-                kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
-                scsi_unregister(shp);
-                asc_board_count--;
-                continue;
-            }
-
-            /* Register DMA Channel for Narrow boards. */
-            shp->dma_channel = NO_ISA_DMA; /* Default to no ISA DMA. */
-#ifdef CONFIG_ISA
-            if (ASC_NARROW_BOARD(boardp)) {
-                /* Register DMA channel for ISA bus. */
-                if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
-                    shp->dma_channel = asc_dvc_varp->cfg->isa_dma_channel;
-                    if ((ret =
-                         request_dma(shp->dma_channel, "advansys")) != 0) {
-                        ASC_PRINT3(
-"advansys_detect: board %d: request_dma() %d failed %d\n",
-                            boardp->id, shp->dma_channel, ret);
-                        release_region(shp->io_port, boardp->asc_n_io_port);
-#ifdef CONFIG_PROC_FS
-                        kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
-                        scsi_unregister(shp);
-                        asc_board_count--;
-                        continue;
-                    }
-                    AscEnableIsaDma(shp->dma_channel);
-                }
-            }
-#endif /* CONFIG_ISA */
+       /*
+        * Display Asc Library dynamic configuration information
+        * for the board.
+        */
+       cp = boardp->prtbuf;
+       if (ASC_NARROW_BOARD(boardp)) {
+               cplen = asc_prt_asc_board_info(shp, cp, ASC_PRTBUF_SIZE);
+       } else {
+               cplen = asc_prt_adv_board_info(shp, cp, ASC_PRTBUF_SIZE);
+       }
+       ASC_ASSERT(cplen < ASC_PRTBUF_SIZE);
+       cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
+       totcnt += cnt;
+       leftlen -= cnt;
+       if (leftlen == 0) {
+               ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
+               return totcnt;
+       }
+       advoffset += cplen;
+       curbuf += cnt;
 
-            /* Register IRQ Number. */
-            ASC_DBG1(2, "advansys_detect: request_irq() %d\n", shp->irq);
-           /*
-            * If request_irq() fails with the IRQF_DISABLED flag set,
-            * then try again without the IRQF_DISABLED flag set. This
-            * allows IRQ sharing to work even with other drivers that
-            * do not set the IRQF_DISABLED flag.
-            *
-            * If IRQF_DISABLED is not set, then interrupts are enabled
-            * before the driver interrupt function is called.
-            */
-            if (((ret = request_irq(shp->irq, advansys_interrupt,
-                            IRQF_DISABLED | (share_irq == TRUE ? IRQF_SHARED : 0),
-                            "advansys", boardp)) != 0) &&
-                ((ret = request_irq(shp->irq, advansys_interrupt,
-                            (share_irq == TRUE ? IRQF_SHARED : 0),
-                            "advansys", boardp)) != 0))
-            {
-                if (ret == -EBUSY) {
-                    ASC_PRINT2(
-"advansys_detect: board %d: request_irq(): IRQ 0x%x already in use.\n",
-                        boardp->id, shp->irq);
-                } else if (ret == -EINVAL) {
-                    ASC_PRINT2(
-"advansys_detect: board %d: request_irq(): IRQ 0x%x not valid.\n",
-                        boardp->id, shp->irq);
-                } else {
-                    ASC_PRINT3(
-"advansys_detect: board %d: request_irq(): IRQ 0x%x failed with %d\n",
-                        boardp->id, shp->irq, ret);
-                }
-                release_region(shp->io_port, boardp->asc_n_io_port);
-                iounmap(boardp->ioremap_addr);
-                if (shp->dma_channel != NO_ISA_DMA) {
-                    free_dma(shp->dma_channel);
-                }
-#ifdef CONFIG_PROC_FS
-                kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
-                scsi_unregister(shp);
-                asc_board_count--;
-                continue;
-            }
-
-            /*
-             * Initialize board RISC chip and enable interrupts.
-             */
-            if (ASC_NARROW_BOARD(boardp)) {
-                ASC_DBG(2, "advansys_detect: AscInitAsc1000Driver()\n");
-                warn_code = AscInitAsc1000Driver(asc_dvc_varp);
-                err_code = asc_dvc_varp->err_code;
-
-                if (warn_code || err_code) {
-                    ASC_PRINT4(
-"advansys_detect: board %d error: init_state 0x%x, warn 0x%x, error 0x%x\n",
-                        boardp->id, asc_dvc_varp->init_state,
-                        warn_code, err_code);
-                }
-            } else {
-                ADV_CARR_T      *carrp;
-                int             req_cnt = 0;
-                adv_req_t       *reqp = NULL;
-                int             sg_cnt = 0;
-
-                /*
-                 * Allocate buffer carrier structures. The total size
-                 * is about 4 KB, so allocate all at once.
-                 */
-                carrp =
-                    (ADV_CARR_T *) kmalloc(ADV_CARRIER_BUFSIZE, GFP_ATOMIC);
-                ASC_DBG1(1, "advansys_detect: carrp 0x%lx\n", (ulong) carrp);
-
-                if (carrp == NULL) {
-                    goto kmalloc_error;
-                }
-
-                /*
-                 * Allocate up to 'max_host_qng' request structures for
-                 * the Wide board. The total size is about 16 KB, so
-                 * allocate all at once. If the allocation fails decrement
-                 * and try again.
-                 */
-                for (req_cnt = adv_dvc_varp->max_host_qng;
-                    req_cnt > 0; req_cnt--) {
-
-                    reqp = (adv_req_t *)
-                        kmalloc(sizeof(adv_req_t) * req_cnt, GFP_ATOMIC);
-
-                    ASC_DBG3(1,
-                        "advansys_detect: reqp 0x%lx, req_cnt %d, bytes %lu\n",
-                        (ulong) reqp, req_cnt,
-                        (ulong) sizeof(adv_req_t) * req_cnt);
-
-                    if (reqp != NULL) {
-                        break;
-                    }
-                }
-                if (reqp == NULL)
-                {
-                    goto kmalloc_error;
-                }
-
-                /*
-                 * Allocate up to ADV_TOT_SG_BLOCK request structures for
-                 * the Wide board. Each structure is about 136 bytes.
-                 */
-                boardp->adv_sgblkp = NULL;
-                for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) {
-
-                    sgp = (adv_sgblk_t *)
-                        kmalloc(sizeof(adv_sgblk_t), GFP_ATOMIC);
-
-                    if (sgp == NULL) {
-                        break;
-                    }
-
-                    sgp->next_sgblkp = boardp->adv_sgblkp;
-                    boardp->adv_sgblkp = sgp;
-
-                }
-                ASC_DBG3(1,
-                    "advansys_detect: sg_cnt %d * %u = %u bytes\n",
-                    sg_cnt, sizeof(adv_sgblk_t),
-                    (unsigned) (sizeof(adv_sgblk_t) * sg_cnt));
-
-                /*
-                 * If no request structures or scatter-gather structures could
-                 * be allocated, then return an error. Otherwise continue with
-                 * initialization.
-                 */
-    kmalloc_error:
-                if (carrp == NULL)
-                {
-                    ASC_PRINT1(
-"advansys_detect: board %d error: failed to kmalloc() carrier buffer.\n",
-                        boardp->id);
-                    err_code = ADV_ERROR;
-                } else if (reqp == NULL) {
-                    kfree(carrp);
-                    ASC_PRINT1(
-"advansys_detect: board %d error: failed to kmalloc() adv_req_t buffer.\n",
-                        boardp->id);
-                    err_code = ADV_ERROR;
-                } else if (boardp->adv_sgblkp == NULL) {
-                    kfree(carrp);
-                    kfree(reqp);
-                    ASC_PRINT1(
-"advansys_detect: board %d error: failed to kmalloc() adv_sgblk_t buffers.\n",
-                        boardp->id);
-                    err_code = ADV_ERROR;
-                } else {
-
-                    /* Save carrier buffer pointer. */
-                    boardp->orig_carrp = carrp;
-
-                    /*
-                     * Save original pointer for kfree() in case the
-                     * driver is built as a module and can be unloaded.
-                     */
-                    boardp->orig_reqp = reqp;
-
-                    adv_dvc_varp->carrier_buf = carrp;
-
-                    /*
-                     * Point 'adv_reqp' to the request structures and
-                     * link them together.
-                     */
-                    req_cnt--;
-                    reqp[req_cnt].next_reqp = NULL;
-                    for (; req_cnt > 0; req_cnt--) {
-                        reqp[req_cnt - 1].next_reqp = &reqp[req_cnt];
-                    }
-                    boardp->adv_reqp = &reqp[0];
-
-                    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-                    {
-                        ASC_DBG(2,
-                            "advansys_detect: AdvInitAsc3550Driver()\n");
-                        warn_code = AdvInitAsc3550Driver(adv_dvc_varp);
-                    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
-                        ASC_DBG(2,
-                            "advansys_detect: AdvInitAsc38C0800Driver()\n");
-                        warn_code = AdvInitAsc38C0800Driver(adv_dvc_varp);
-                    } else {
-                        ASC_DBG(2,
-                            "advansys_detect: AdvInitAsc38C1600Driver()\n");
-                        warn_code = AdvInitAsc38C1600Driver(adv_dvc_varp);
-                    }
-                    err_code = adv_dvc_varp->err_code;
-
-                    if (warn_code || err_code) {
-                        ASC_PRINT3(
-"advansys_detect: board %d error: warn 0x%x, error 0x%x\n",
-                            boardp->id, warn_code, err_code);
-                    }
-                }
-            }
-
-            if (err_code != 0) {
-                release_region(shp->io_port, boardp->asc_n_io_port);
-                if (ASC_WIDE_BOARD(boardp)) {
-                    iounmap(boardp->ioremap_addr);
-                    kfree(boardp->orig_carrp);
-                    boardp->orig_carrp = NULL;
-                    if (boardp->orig_reqp) {
-                        kfree(boardp->orig_reqp);
-                        boardp->orig_reqp = boardp->adv_reqp = NULL;
-                    }
-                    while ((sgp = boardp->adv_sgblkp) != NULL)
-                    {
-                        boardp->adv_sgblkp = sgp->next_sgblkp;
-                        kfree(sgp);
-                    }
-                }
-                if (shp->dma_channel != NO_ISA_DMA) {
-                    free_dma(shp->dma_channel);
-                }
-#ifdef CONFIG_PROC_FS
-                kfree(boardp->prtbuf);
-#endif /* CONFIG_PROC_FS */
-                free_irq(shp->irq, boardp);
-                scsi_unregister(shp);
-                asc_board_count--;
-                continue;
-            }
-            ASC_DBG_PRT_SCSI_HOST(2, shp);
-        }
-    }
+       ASC_DBG1(1, "advansys_proc_info: totcnt %d\n", totcnt);
 
-    ASC_DBG1(1, "advansys_detect: done: asc_board_count %d\n", asc_board_count);
-    return asc_board_count;
+       return totcnt;
 }
-
-/*
- * advansys_release()
- *
- * Release resources allocated for a single AdvanSys adapter.
- */
-static int
-advansys_release(struct Scsi_Host *shp)
-{
-    asc_board_t    *boardp;
-
-    ASC_DBG(1, "advansys_release: begin\n");
-    boardp = ASC_BOARDP(shp);
-    free_irq(shp->irq, boardp);
-    if (shp->dma_channel != NO_ISA_DMA) {
-        ASC_DBG(1, "advansys_release: free_dma()\n");
-        free_dma(shp->dma_channel);
-    }
-    release_region(shp->io_port, boardp->asc_n_io_port);
-    if (ASC_WIDE_BOARD(boardp)) {
-        adv_sgblk_t    *sgp = NULL;
-
-        iounmap(boardp->ioremap_addr);
-        kfree(boardp->orig_carrp);
-        boardp->orig_carrp = NULL;
-        if (boardp->orig_reqp) {
-            kfree(boardp->orig_reqp);
-            boardp->orig_reqp = boardp->adv_reqp = NULL;
-        }
-        while ((sgp = boardp->adv_sgblkp) != NULL)
-        {
-            boardp->adv_sgblkp = sgp->next_sgblkp;
-            kfree(sgp);
-        }
-    }
-#ifdef CONFIG_PROC_FS
-    ASC_ASSERT(boardp->prtbuf != NULL);
-    kfree(boardp->prtbuf);
 #endif /* CONFIG_PROC_FS */
-    scsi_unregister(shp);
-    ASC_DBG(1, "advansys_release: end\n");
-    return 0;
-}
 
 /*
  * advansys_info()
@@ -5466,91 +4248,87 @@ advansys_release(struct Scsi_Host *shp)
  * Note: The information line should not exceed ASC_INFO_SIZE bytes,
  * otherwise the static 'info' array will be overrun.
  */
-static const char *
-advansys_info(struct Scsi_Host *shp)
+static const char *advansys_info(struct Scsi_Host *shost)
 {
-    static char     info[ASC_INFO_SIZE];
-    asc_board_t     *boardp;
-    ASC_DVC_VAR     *asc_dvc_varp;
-    ADV_DVC_VAR     *adv_dvc_varp;
-    char            *busname;
-    int             iolen;
-    char            *widename = NULL;
-
-    boardp = ASC_BOARDP(shp);
-    if (ASC_NARROW_BOARD(boardp)) {
-        asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
-        ASC_DBG(1, "advansys_info: begin\n");
-        if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
-            if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) == ASC_IS_ISAPNP) {
-                busname = "ISA PnP";
-            } else {
-                busname = "ISA";
-            }
-            /* Don't reference 'shp->n_io_port'; It may be truncated. */
-            sprintf(info,
-"AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
-                ASC_VERSION, busname,
-                (ulong) shp->io_port,
-                (ulong) shp->io_port + boardp->asc_n_io_port - 1,
-                shp->irq, shp->dma_channel);
-        } else {
-            if (asc_dvc_varp->bus_type & ASC_IS_VL) {
-                busname = "VL";
-            } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) {
-                busname = "EISA";
-            } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) {
-                if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA)
-                    == ASC_IS_PCI_ULTRA) {
-                    busname = "PCI Ultra";
-                } else {
-                    busname = "PCI";
-                }
-            } else {
-                busname = "?";
-                ASC_PRINT2( "advansys_info: board %d: unknown bus type %d\n",
-                    boardp->id, asc_dvc_varp->bus_type);
-            }
-            /* Don't reference 'shp->n_io_port'; It may be truncated. */
-            sprintf(info,
-                "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
-                ASC_VERSION, busname,
-                (ulong) shp->io_port,
-                (ulong) shp->io_port + boardp->asc_n_io_port - 1,
-                shp->irq);
-        }
-    } else {
-        /*
-         * Wide Adapter Information
-         *
-         * Memory-mapped I/O is used instead of I/O space to access
-         * the adapter, but display the I/O Port range. The Memory
-         * I/O address is displayed through the driver /proc file.
-         */
-        adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
-        if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-        {
-            iolen = ADV_3550_IOLEN;
-            widename = "Ultra-Wide";
-        } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-        {
-            iolen = ADV_38C0800_IOLEN;
-            widename = "Ultra2-Wide";
-        } else
-        {
-            iolen = ADV_38C1600_IOLEN;
-            widename = "Ultra3-Wide";
-        }
-        sprintf(info, "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
-            ASC_VERSION,
-            widename,
-            (ulong) adv_dvc_varp->iop_base,
-            (ulong) adv_dvc_varp->iop_base + iolen - 1,
-            shp->irq);
-    }
-    ASC_ASSERT(strlen(info) < ASC_INFO_SIZE);
-    ASC_DBG(1, "advansys_info: end\n");
-    return info;
+       static char info[ASC_INFO_SIZE];
+       asc_board_t *boardp;
+       ASC_DVC_VAR *asc_dvc_varp;
+       ADV_DVC_VAR *adv_dvc_varp;
+       char *busname;
+       int iolen;
+       char *widename = NULL;
+
+       boardp = ASC_BOARDP(shost);
+       if (ASC_NARROW_BOARD(boardp)) {
+               asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
+               ASC_DBG(1, "advansys_info: begin\n");
+               if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
+                       if ((asc_dvc_varp->bus_type & ASC_IS_ISAPNP) ==
+                           ASC_IS_ISAPNP) {
+                               busname = "ISA PnP";
+                       } else {
+                               busname = "ISA";
+                       }
+                       /* Don't reference 'shost->n_io_port'; It may be truncated. */
+                       sprintf(info,
+                               "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X, DMA 0x%X",
+                               ASC_VERSION, busname,
+                               (ulong)shost->io_port,
+                               (ulong)shost->io_port + boardp->asc_n_io_port -
+                               1, shost->irq, shost->dma_channel);
+               } else {
+                       if (asc_dvc_varp->bus_type & ASC_IS_VL) {
+                               busname = "VL";
+                       } else if (asc_dvc_varp->bus_type & ASC_IS_EISA) {
+                               busname = "EISA";
+                       } else if (asc_dvc_varp->bus_type & ASC_IS_PCI) {
+                               if ((asc_dvc_varp->bus_type & ASC_IS_PCI_ULTRA)
+                                   == ASC_IS_PCI_ULTRA) {
+                                       busname = "PCI Ultra";
+                               } else {
+                                       busname = "PCI";
+                               }
+                       } else {
+                               busname = "?";
+                               ASC_PRINT2
+                                   ("advansys_info: board %d: unknown bus type %d\n",
+                                    boardp->id, asc_dvc_varp->bus_type);
+                       }
+                       /* Don't reference 'shost->n_io_port'; It may be truncated. */
+                       sprintf(info,
+                               "AdvanSys SCSI %s: %s: IO 0x%lX-0x%lX, IRQ 0x%X",
+                               ASC_VERSION, busname,
+                               (ulong)shost->io_port,
+                               (ulong)shost->io_port + boardp->asc_n_io_port -
+                               1, shost->irq);
+               }
+       } else {
+               /*
+                * Wide Adapter Information
+                *
+                * Memory-mapped I/O is used instead of I/O space to access
+                * the adapter, but display the I/O Port range. The Memory
+                * I/O address is displayed through the driver /proc file.
+                */
+               adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
+               if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+                       iolen = ADV_3550_IOLEN;
+                       widename = "Ultra-Wide";
+               } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+                       iolen = ADV_38C0800_IOLEN;
+                       widename = "Ultra2-Wide";
+               } else {
+                       iolen = ADV_38C1600_IOLEN;
+                       widename = "Ultra3-Wide";
+               }
+               sprintf(info,
+                       "AdvanSys SCSI %s: PCI %s: PCIMEM 0x%lX-0x%lX, IRQ 0x%X",
+                       ASC_VERSION, widename, (ulong)adv_dvc_varp->iop_base,
+                       (ulong)adv_dvc_varp->iop_base + iolen - 1, shost->irq);
+       }
+       ASC_ASSERT(strlen(info) < ASC_INFO_SIZE);
+       ASC_DBG(1, "advansys_info: end\n");
+       return info;
 }
 
 /*
@@ -5560,82 +4338,82 @@ advansys_info(struct Scsi_Host *shp)
  * in the 'scp' result field.
  */
 static int
-advansys_queuecommand(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
+advansys_queuecommand(struct scsi_cmnd *scp, void (*done) (struct scsi_cmnd *))
 {
-    struct Scsi_Host    *shp;
-    asc_board_t         *boardp;
-    ulong               flags;
-    struct scsi_cmnd           *done_scp;
+       struct Scsi_Host *shost;
+       asc_board_t *boardp;
+       ulong flags;
+       struct scsi_cmnd *done_scp;
 
-    shp = scp->device->host;
-    boardp = ASC_BOARDP(shp);
-    ASC_STATS(shp, queuecommand);
+       shost = scp->device->host;
+       boardp = ASC_BOARDP(shost);
+       ASC_STATS(shost, queuecommand);
 
-    /* host_lock taken by mid-level prior to call but need to protect */
-    /* against own ISR */
-    spin_lock_irqsave(&boardp->lock, flags);
+       /* host_lock taken by mid-level prior to call but need to protect */
+       /* against own ISR */
+       spin_lock_irqsave(&boardp->lock, flags);
 
-    /*
-     * Block new commands while handling a reset or abort request.
-     */
-    if (boardp->flags & ASC_HOST_IN_RESET) {
-        ASC_DBG1(1,
-            "advansys_queuecommand: scp 0x%lx blocked for reset request\n",
-            (ulong) scp);
-        scp->result = HOST_BYTE(DID_RESET);
-
-        /*
-         * Add blocked requests to the board's 'done' queue. The queued
-         * requests will be completed at the end of the abort or reset
-         * handling.
-         */
-        asc_enqueue(&boardp->done, scp, ASC_BACK);
-       spin_unlock_irqrestore(&boardp->lock, flags);
-        return 0;
-    }
+       /*
+        * Block new commands while handling a reset or abort request.
+        */
+       if (boardp->flags & ASC_HOST_IN_RESET) {
+               ASC_DBG1(1,
+                        "advansys_queuecommand: scp 0x%lx blocked for reset request\n",
+                        (ulong)scp);
+               scp->result = HOST_BYTE(DID_RESET);
 
-    /*
-     * Attempt to execute any waiting commands for the board.
-     */
-    if (!ASC_QUEUE_EMPTY(&boardp->waiting)) {
-        ASC_DBG(1,
-            "advansys_queuecommand: before asc_execute_queue() waiting\n");
-        asc_execute_queue(&boardp->waiting);
-    }
+               /*
+                * Add blocked requests to the board's 'done' queue. The queued
+                * requests will be completed at the end of the abort or reset
+                * handling.
+                */
+               asc_enqueue(&boardp->done, scp, ASC_BACK);
+               spin_unlock_irqrestore(&boardp->lock, flags);
+               return 0;
+       }
 
-    /*
-     * Save the function pointer to Linux mid-level 'done' function
-     * and attempt to execute the command.
-     *
-     * If ASC_NOERROR is returned the request has been added to the
-     * board's 'active' queue and will be completed by the interrupt
-     * handler.
-     *
-     * If ASC_BUSY is returned add the request to the board's per
-     * target waiting list. This is the first time the request has
-     * been tried. Add it to the back of the waiting list. It will be
-     * retried later.
-     *
-     * If an error occurred, the request will have been placed on the
-     * board's 'done' queue and must be completed before returning.
-     */
-    scp->scsi_done = done;
-    switch (asc_execute_scsi_cmnd(scp)) {
-    case ASC_NOERROR:
-        break;
-    case ASC_BUSY:
-        asc_enqueue(&boardp->waiting, scp, ASC_BACK);
-        break;
-    case ASC_ERROR:
-    default:
-        done_scp = asc_dequeue_list(&boardp->done, NULL, ASC_TID_ALL);
-        /* Interrupts could be enabled here. */
-        asc_scsi_done_list(done_scp);
-        break;
-    }
-    spin_unlock_irqrestore(&boardp->lock, flags);
+       /*
+        * Attempt to execute any waiting commands for the board.
+        */
+       if (!ASC_QUEUE_EMPTY(&boardp->waiting)) {
+               ASC_DBG(1,
+                       "advansys_queuecommand: before asc_execute_queue() waiting\n");
+               asc_execute_queue(&boardp->waiting);
+       }
+
+       /*
+        * Save the function pointer to Linux mid-level 'done' function
+        * and attempt to execute the command.
+        *
+        * If ASC_NOERROR is returned the request has been added to the
+        * board's 'active' queue and will be completed by the interrupt
+        * handler.
+        *
+        * If ASC_BUSY is returned add the request to the board's per
+        * target waiting list. This is the first time the request has
+        * been tried. Add it to the back of the waiting list. It will be
+        * retried later.
+        *
+        * If an error occurred, the request will have been placed on the
+        * board's 'done' queue and must be completed before returning.
+        */
+       scp->scsi_done = done;
+       switch (asc_execute_scsi_cmnd(scp)) {
+       case ASC_NOERROR:
+               break;
+       case ASC_BUSY:
+               asc_enqueue(&boardp->waiting, scp, ASC_BACK);
+               break;
+       case ASC_ERROR:
+       default:
+               done_scp = asc_dequeue_list(&boardp->done, NULL, ASC_TID_ALL);
+               /* Interrupts could be enabled here. */
+               asc_scsi_done_list(done_scp);
+               break;
+       }
+       spin_unlock_irqrestore(&boardp->lock, flags);
 
-    return 0;
+       return 0;
 }
 
 /*
@@ -5647,178 +4425,187 @@ advansys_queuecommand(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
  * sleeping is allowed and no locking other than for host structures is
  * required. Returns SUCCESS or FAILED.
  */
-static int
-advansys_reset(struct scsi_cmnd *scp)
+static int advansys_reset(struct scsi_cmnd *scp)
 {
-    struct Scsi_Host     *shp;
-    asc_board_t          *boardp;
-    ASC_DVC_VAR          *asc_dvc_varp;
-    ADV_DVC_VAR          *adv_dvc_varp;
-    ulong                flags;
-    struct scsi_cmnd            *done_scp = NULL, *last_scp = NULL;
-    struct scsi_cmnd            *tscp, *new_last_scp;
-    int                  status;
-    int                  ret = SUCCESS;
-
-    ASC_DBG1(1, "advansys_reset: 0x%lx\n", (ulong) scp);
+       struct Scsi_Host *shost;
+       asc_board_t *boardp;
+       ASC_DVC_VAR *asc_dvc_varp;
+       ADV_DVC_VAR *adv_dvc_varp;
+       ulong flags;
+       struct scsi_cmnd *done_scp = NULL, *last_scp = NULL;
+       struct scsi_cmnd *tscp, *new_last_scp;
+       int status;
+       int ret = SUCCESS;
+
+       ASC_DBG1(1, "advansys_reset: 0x%lx\n", (ulong)scp);
 
 #ifdef ADVANSYS_STATS
-    if (scp->device->host != NULL) {
-        ASC_STATS(scp->device->host, reset);
-    }
+       if (scp->device->host != NULL) {
+               ASC_STATS(scp->device->host, reset);
+       }
 #endif /* ADVANSYS_STATS */
 
-    if ((shp = scp->device->host) == NULL) {
-        scp->result = HOST_BYTE(DID_ERROR);
-        return FAILED;
-    }
+       if ((shost = scp->device->host) == NULL) {
+               scp->result = HOST_BYTE(DID_ERROR);
+               return FAILED;
+       }
 
-    boardp = ASC_BOARDP(shp);
+       boardp = ASC_BOARDP(shost);
 
-    ASC_PRINT1("advansys_reset: board %d: SCSI bus reset started...\n",
-        boardp->id);
-    /*
-     * Check for re-entrancy.
-     */
-    spin_lock_irqsave(&boardp->lock, flags);
-    if (boardp->flags & ASC_HOST_IN_RESET) {
-       spin_unlock_irqrestore(&boardp->lock, flags);
-        return FAILED;
-    }
-    boardp->flags |= ASC_HOST_IN_RESET;
-    spin_unlock_irqrestore(&boardp->lock, flags);
-
-    if (ASC_NARROW_BOARD(boardp)) {
-        /*
-         * Narrow Board
-         */
-        asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
-
-        /*
-         * Reset the chip and SCSI bus.
-         */
-        ASC_DBG(1, "advansys_reset: before AscInitAsc1000Driver()\n");
-        status = AscInitAsc1000Driver(asc_dvc_varp);
-
-        /* Refer to ASC_IERR_* defintions for meaning of 'err_code'. */
-        if (asc_dvc_varp->err_code) {
-            ASC_PRINT2(
-                "advansys_reset: board %d: SCSI bus reset error: 0x%x\n",
-                boardp->id, asc_dvc_varp->err_code);
-            ret = FAILED;
-        } else if (status) {
-            ASC_PRINT2(
-                "advansys_reset: board %d: SCSI bus reset warning: 0x%x\n",
-                boardp->id, status);
-        } else {
-            ASC_PRINT1(
-                "advansys_reset: board %d: SCSI bus reset successful.\n",
-                boardp->id);
-        }
-
-        ASC_DBG(1, "advansys_reset: after AscInitAsc1000Driver()\n");
+       ASC_PRINT1("advansys_reset: board %d: SCSI bus reset started...\n",
+                  boardp->id);
+       /*
+        * Check for re-entrancy.
+        */
        spin_lock_irqsave(&boardp->lock, flags);
+       if (boardp->flags & ASC_HOST_IN_RESET) {
+               spin_unlock_irqrestore(&boardp->lock, flags);
+               return FAILED;
+       }
+       boardp->flags |= ASC_HOST_IN_RESET;
+       spin_unlock_irqrestore(&boardp->lock, flags);
 
-    } else {
-        /*
-         * Wide Board
-         *
-         * If the suggest reset bus flags are set, then reset the bus.
-         * Otherwise only reset the device.
-         */
-        adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
-
-        /*
-         * Reset the target's SCSI bus.
-         */
-        ASC_DBG(1, "advansys_reset: before AdvResetChipAndSB()\n");
-        switch (AdvResetChipAndSB(adv_dvc_varp)) {
-        case ASC_TRUE:
-            ASC_PRINT1("advansys_reset: board %d: SCSI bus reset successful.\n",
-                boardp->id);
-            break;
-        case ASC_FALSE:
-        default:
-            ASC_PRINT1("advansys_reset: board %d: SCSI bus reset error.\n",
-                boardp->id);
-            ret = FAILED;
-            break;
-        }
-       spin_lock_irqsave(&boardp->lock, flags);
-        (void) AdvISR(adv_dvc_varp);
-    }
-    /* Board lock is held. */
+       if (ASC_NARROW_BOARD(boardp)) {
+               /*
+                * Narrow Board
+                */
+               asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
 
-    /*
-     * Dequeue all board 'done' requests. A pointer to the last request
-     * is returned in 'last_scp'.
-     */
-    done_scp = asc_dequeue_list(&boardp->done, &last_scp, ASC_TID_ALL);
+               /*
+                * Reset the chip and SCSI bus.
+                */
+               ASC_DBG(1, "advansys_reset: before AscInitAsc1000Driver()\n");
+               status = AscInitAsc1000Driver(asc_dvc_varp);
+
+               /* Refer to ASC_IERR_* defintions for meaning of 'err_code'. */
+               if (asc_dvc_varp->err_code) {
+                       ASC_PRINT2
+                           ("advansys_reset: board %d: SCSI bus reset error: 0x%x\n",
+                            boardp->id, asc_dvc_varp->err_code);
+                       ret = FAILED;
+               } else if (status) {
+                       ASC_PRINT2
+                           ("advansys_reset: board %d: SCSI bus reset warning: 0x%x\n",
+                            boardp->id, status);
+               } else {
+                       ASC_PRINT1
+                           ("advansys_reset: board %d: SCSI bus reset successful.\n",
+                            boardp->id);
+               }
+
+               ASC_DBG(1, "advansys_reset: after AscInitAsc1000Driver()\n");
+               spin_lock_irqsave(&boardp->lock, flags);
 
-    /*
-     * Dequeue all board 'active' requests for all devices and set
-     * the request status to DID_RESET. A pointer to the last request
-     * is returned in 'last_scp'.
-     */
-    if (done_scp == NULL) {
-        done_scp = asc_dequeue_list(&boardp->active, &last_scp, ASC_TID_ALL);
-        for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
-            tscp->result = HOST_BYTE(DID_RESET);
-        }
-    } else {
-        /* Append to 'done_scp' at the end with 'last_scp'. */
-        ASC_ASSERT(last_scp != NULL);
-        last_scp->host_scribble = (unsigned char *)asc_dequeue_list(
-                       &boardp->active, &new_last_scp, ASC_TID_ALL);
-        if (new_last_scp != NULL) {
-            ASC_ASSERT(REQPNEXT(last_scp) != NULL);
-            for (tscp = REQPNEXT(last_scp); tscp; tscp = REQPNEXT(tscp)) {
-                tscp->result = HOST_BYTE(DID_RESET);
-            }
-            last_scp = new_last_scp;
-        }
-    }
+       } else {
+               /*
+                * Wide Board
+                *
+                * If the suggest reset bus flags are set, then reset the bus.
+                * Otherwise only reset the device.
+                */
+               adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
 
-    /*
-     * Dequeue all 'waiting' requests and set the request status
-     * to DID_RESET.
-     */
-    if (done_scp == NULL) {
-        done_scp = asc_dequeue_list(&boardp->waiting, &last_scp, ASC_TID_ALL);
-        for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
-            tscp->result = HOST_BYTE(DID_RESET);
-        }
-    } else {
-        /* Append to 'done_scp' at the end with 'last_scp'. */
-        ASC_ASSERT(last_scp != NULL);
-        last_scp->host_scribble = (unsigned char *)asc_dequeue_list(
-                       &boardp->waiting, &new_last_scp, ASC_TID_ALL);
-        if (new_last_scp != NULL) {
-            ASC_ASSERT(REQPNEXT(last_scp) != NULL);
-            for (tscp = REQPNEXT(last_scp); tscp; tscp = REQPNEXT(tscp)) {
-                tscp->result = HOST_BYTE(DID_RESET);
-            }
-            last_scp = new_last_scp;
-        }
-    }
+               /*
+                * Reset the target's SCSI bus.
+                */
+               ASC_DBG(1, "advansys_reset: before AdvResetChipAndSB()\n");
+               switch (AdvResetChipAndSB(adv_dvc_varp)) {
+               case ASC_TRUE:
+                       ASC_PRINT1
+                           ("advansys_reset: board %d: SCSI bus reset successful.\n",
+                            boardp->id);
+                       break;
+               case ASC_FALSE:
+               default:
+                       ASC_PRINT1
+                           ("advansys_reset: board %d: SCSI bus reset error.\n",
+                            boardp->id);
+                       ret = FAILED;
+                       break;
+               }
+               spin_lock_irqsave(&boardp->lock, flags);
+               (void)AdvISR(adv_dvc_varp);
+       }
+       /* Board lock is held. */
+
+       /*
+        * Dequeue all board 'done' requests. A pointer to the last request
+        * is returned in 'last_scp'.
+        */
+       done_scp = asc_dequeue_list(&boardp->done, &last_scp, ASC_TID_ALL);
+
+       /*
+        * Dequeue all board 'active' requests for all devices and set
+        * the request status to DID_RESET. A pointer to the last request
+        * is returned in 'last_scp'.
+        */
+       if (done_scp == NULL) {
+               done_scp =
+                   asc_dequeue_list(&boardp->active, &last_scp, ASC_TID_ALL);
+               for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
+                       tscp->result = HOST_BYTE(DID_RESET);
+               }
+       } else {
+               /* Append to 'done_scp' at the end with 'last_scp'. */
+               ASC_ASSERT(last_scp != NULL);
+               last_scp->host_scribble =
+                   (unsigned char *)asc_dequeue_list(&boardp->active,
+                                                     &new_last_scp,
+                                                     ASC_TID_ALL);
+               if (new_last_scp != NULL) {
+                       ASC_ASSERT(REQPNEXT(last_scp) != NULL);
+                       for (tscp = REQPNEXT(last_scp); tscp;
+                            tscp = REQPNEXT(tscp)) {
+                               tscp->result = HOST_BYTE(DID_RESET);
+                       }
+                       last_scp = new_last_scp;
+               }
+       }
 
-    /* Save the time of the most recently completed reset. */
-    boardp->last_reset = jiffies;
+       /*
+        * Dequeue all 'waiting' requests and set the request status
+        * to DID_RESET.
+        */
+       if (done_scp == NULL) {
+               done_scp =
+                   asc_dequeue_list(&boardp->waiting, &last_scp, ASC_TID_ALL);
+               for (tscp = done_scp; tscp; tscp = REQPNEXT(tscp)) {
+                       tscp->result = HOST_BYTE(DID_RESET);
+               }
+       } else {
+               /* Append to 'done_scp' at the end with 'last_scp'. */
+               ASC_ASSERT(last_scp != NULL);
+               last_scp->host_scribble =
+                   (unsigned char *)asc_dequeue_list(&boardp->waiting,
+                                                     &new_last_scp,
+                                                     ASC_TID_ALL);
+               if (new_last_scp != NULL) {
+                       ASC_ASSERT(REQPNEXT(last_scp) != NULL);
+                       for (tscp = REQPNEXT(last_scp); tscp;
+                            tscp = REQPNEXT(tscp)) {
+                               tscp->result = HOST_BYTE(DID_RESET);
+                       }
+                       last_scp = new_last_scp;
+               }
+       }
 
-    /* Clear reset flag. */
-    boardp->flags &= ~ASC_HOST_IN_RESET;
-    spin_unlock_irqrestore(&boardp->lock, flags);
+       /* Save the time of the most recently completed reset. */
+       boardp->last_reset = jiffies;
 
-    /*
-     * Complete all the 'done_scp' requests.
-     */
-    if (done_scp != NULL) {
-        asc_scsi_done_list(done_scp);
-    }
+       /* Clear reset flag. */
+       boardp->flags &= ~ASC_HOST_IN_RESET;
+       spin_unlock_irqrestore(&boardp->lock, flags);
+
+       /*
+        * Complete all the 'done_scp' requests.
+        */
+       if (done_scp != NULL) {
+               asc_scsi_done_list(done_scp);
+       }
 
-    ASC_DBG1(1, "advansys_reset: ret %d\n", ret);
+       ASC_DBG1(1, "advansys_reset: ret %d\n", ret);
 
-    return ret;
+       return ret;
 }
 
 /*
@@ -5834,71 +4621,70 @@ advansys_reset(struct scsi_cmnd *scp)
  */
 static int
 advansys_biosparam(struct scsi_device *sdev, struct block_device *bdev,
-               sector_t capacity, int ip[])
+                  sector_t capacity, int ip[])
 {
-    asc_board_t     *boardp;
-
-    ASC_DBG(1, "advansys_biosparam: begin\n");
-    ASC_STATS(sdev->host, biosparam);
-    boardp = ASC_BOARDP(sdev->host);
-    if (ASC_NARROW_BOARD(boardp)) {
-        if ((boardp->dvc_var.asc_dvc_var.dvc_cntl &
-             ASC_CNTL_BIOS_GT_1GB) && capacity > 0x200000) {
-                ip[0] = 255;
-                ip[1] = 63;
-        } else {
-                ip[0] = 64;
-                ip[1] = 32;
-        }
-    } else {
-        if ((boardp->dvc_var.adv_dvc_var.bios_ctrl &
-             BIOS_CTRL_EXTENDED_XLAT) && capacity > 0x200000) {
-                ip[0] = 255;
-                ip[1] = 63;
-        } else {
-                ip[0] = 64;
-                ip[1] = 32;
-        }
-    }
-    ip[2] = (unsigned long)capacity / (ip[0] * ip[1]);
-    ASC_DBG(1, "advansys_biosparam: end\n");
-    return 0;
+       asc_board_t *boardp;
+
+       ASC_DBG(1, "advansys_biosparam: begin\n");
+       ASC_STATS(sdev->host, biosparam);
+       boardp = ASC_BOARDP(sdev->host);
+       if (ASC_NARROW_BOARD(boardp)) {
+               if ((boardp->dvc_var.asc_dvc_var.dvc_cntl &
+                    ASC_CNTL_BIOS_GT_1GB) && capacity > 0x200000) {
+                       ip[0] = 255;
+                       ip[1] = 63;
+               } else {
+                       ip[0] = 64;
+                       ip[1] = 32;
+               }
+       } else {
+               if ((boardp->dvc_var.adv_dvc_var.bios_ctrl &
+                    BIOS_CTRL_EXTENDED_XLAT) && capacity > 0x200000) {
+                       ip[0] = 255;
+                       ip[1] = 63;
+               } else {
+                       ip[0] = 64;
+                       ip[1] = 32;
+               }
+       }
+       ip[2] = (unsigned long)capacity / (ip[0] * ip[1]);
+       ASC_DBG(1, "advansys_biosparam: end\n");
+       return 0;
 }
 
-/*
- * --- Loadable Driver Support
- */
+static int __init advansys_detect(struct scsi_host_template *tpnt);
+static int advansys_release(struct Scsi_Host *shp);
 
 static struct scsi_host_template driver_template = {
-    .proc_name                  = "advansys",
+       .proc_name = "advansys",
 #ifdef CONFIG_PROC_FS
-    .proc_info                  = advansys_proc_info,
+       .proc_info = advansys_proc_info,
 #endif
-    .name                       = "advansys",
-    .detect                     = advansys_detect, 
-    .release                    = advansys_release,
-    .info                       = advansys_info,
-    .queuecommand               = advansys_queuecommand,
-    .eh_bus_reset_handler      = advansys_reset,
-    .bios_param                 = advansys_biosparam,
-    .slave_configure           = advansys_slave_configure,
-    /*
-     * Because the driver may control an ISA adapter 'unchecked_isa_dma'
-     * must be set. The flag will be cleared in advansys_detect for non-ISA
-     * adapters. Refer to the comment in scsi_module.c for more information.
-     */
-    .unchecked_isa_dma          = 1,
-    /*
-     * All adapters controlled by this driver are capable of large
-     * scatter-gather lists. According to the mid-level SCSI documentation
-     * this obviates any performance gain provided by setting
-     * 'use_clustering'. But empirically while CPU utilization is increased
-     * by enabling clustering, I/O throughput increases as well.
-     */
-    .use_clustering             = ENABLE_CLUSTERING,
+       .name = "advansys",
+       .detect = advansys_detect,
+       .release = advansys_release,
+       .info = advansys_info,
+       .queuecommand = advansys_queuecommand,
+       .eh_bus_reset_handler = advansys_reset,
+       .bios_param = advansys_biosparam,
+       .slave_configure = advansys_slave_configure,
+       /*
+        * Because the driver may control an ISA adapter 'unchecked_isa_dma'
+        * must be set. The flag will be cleared in advansys_detect for non-ISA
+        * adapters. Refer to the comment in scsi_module.c for more information.
+        */
+       .unchecked_isa_dma = 1,
+       /*
+        * All adapters controlled by this driver are capable of large
+        * scatter-gather lists. According to the mid-level SCSI documentation
+        * this obviates any performance gain provided by setting
+        * 'use_clustering'. But empirically while CPU utilization is increased
+        * by enabling clustering, I/O throughput increases as well.
+        */
+       .use_clustering = ENABLE_CLUSTERING,
 };
-#include "scsi_module.c"
 
+#include "scsi_module.c"
 
 /*
  * --- Miscellaneous Driver Functions
@@ -5913,130 +4699,138 @@ static struct scsi_host_template driver_template = {
  * to the AdvanSys driver which is for a device sharing an interrupt with
  * an AdvanSys adapter.
  */
-STATIC irqreturn_t
-advansys_interrupt(int irq, void *dev_id)
+static irqreturn_t advansys_interrupt(int irq, void *dev_id)
 {
-    ulong           flags;
-    int             i;
-    asc_board_t     *boardp;
-    struct scsi_cmnd       *done_scp = NULL, *last_scp = NULL;
-    struct scsi_cmnd       *new_last_scp;
-    struct Scsi_Host *shp;
-
-    ASC_DBG(1, "advansys_interrupt: begin\n");
+       ulong flags;
+       int i;
+       asc_board_t *boardp;
+       struct scsi_cmnd *done_scp = NULL, *last_scp = NULL;
+       struct scsi_cmnd *new_last_scp;
+       struct Scsi_Host *shost;
+
+       ASC_DBG(1, "advansys_interrupt: begin\n");
+
+       /*
+        * Check for interrupts on all boards.
+        * AscISR() will call asc_isr_callback().
+        */
+       for (i = 0; i < asc_board_count; i++) {
+               shost = asc_host[i];
+               boardp = ASC_BOARDP(shost);
+               ASC_DBG2(2, "advansys_interrupt: i %d, boardp 0x%lx\n",
+                        i, (ulong)boardp);
+               spin_lock_irqsave(&boardp->lock, flags);
+               if (ASC_NARROW_BOARD(boardp)) {
+                       /*
+                        * Narrow Board
+                        */
+                       if (AscIsIntPending(shost->io_port)) {
+                               ASC_STATS(shost, interrupt);
+                               ASC_DBG(1,
+                                       "advansys_interrupt: before AscISR()\n");
+                               AscISR(&boardp->dvc_var.asc_dvc_var);
+                       }
+               } else {
+                       /*
+                        * Wide Board
+                        */
+                       ASC_DBG(1, "advansys_interrupt: before AdvISR()\n");
+                       if (AdvISR(&boardp->dvc_var.adv_dvc_var)) {
+                               ASC_STATS(shost, interrupt);
+                       }
+               }
 
-    /*
-     * Check for interrupts on all boards.
-     * AscISR() will call asc_isr_callback().
-     */
-    for (i = 0; i < asc_board_count; i++) {
-       shp = asc_host[i];
-        boardp = ASC_BOARDP(shp);
-        ASC_DBG2(2, "advansys_interrupt: i %d, boardp 0x%lx\n",
-            i, (ulong) boardp);
-        spin_lock_irqsave(&boardp->lock, flags);
-        if (ASC_NARROW_BOARD(boardp)) {
-            /*
-             * Narrow Board
-             */
-            if (AscIsIntPending(shp->io_port)) {
-                ASC_STATS(shp, interrupt);
-                ASC_DBG(1, "advansys_interrupt: before AscISR()\n");
-                AscISR(&boardp->dvc_var.asc_dvc_var);
-            }
-        } else {
-            /*
-             * Wide Board
-             */
-            ASC_DBG(1, "advansys_interrupt: before AdvISR()\n");
-            if (AdvISR(&boardp->dvc_var.adv_dvc_var)) {
-                ASC_STATS(shp, interrupt);
-            }
-        }
-
-        /*
-         * Start waiting requests and create a list of completed requests.
-         *
-         * If a reset request is being performed for the board, the reset
-         * handler will complete pending requests after it has completed.
-         */
-        if ((boardp->flags & ASC_HOST_IN_RESET) == 0) {
-            ASC_DBG2(1, "advansys_interrupt: done_scp 0x%lx, last_scp 0x%lx\n",
-                (ulong) done_scp, (ulong) last_scp);
-
-            /* Start any waiting commands for the board. */
-            if (!ASC_QUEUE_EMPTY(&boardp->waiting)) {
-                ASC_DBG(1, "advansys_interrupt: before asc_execute_queue()\n");
-                asc_execute_queue(&boardp->waiting);
-            }
-
-             /*
-              * Add to the list of requests that must be completed.
-              *
-              * 'done_scp' will always be NULL on the first iteration
-              * of this loop. 'last_scp' is set at the same time as
-              * 'done_scp'.
-              */
-            if (done_scp == NULL) {
-                done_scp = asc_dequeue_list(&boardp->done, &last_scp,
-                    ASC_TID_ALL);
-            } else {
-                ASC_ASSERT(last_scp != NULL);
-                last_scp->host_scribble = (unsigned char *)asc_dequeue_list(
-                       &boardp->done, &new_last_scp, ASC_TID_ALL);
-                if (new_last_scp != NULL) {
-                    ASC_ASSERT(REQPNEXT(last_scp) != NULL);
-                    last_scp = new_last_scp;
-                }
-            }
-        }
-        spin_unlock_irqrestore(&boardp->lock, flags);
-    }
+               /*
+                * Start waiting requests and create a list of completed requests.
+                *
+                * If a reset request is being performed for the board, the reset
+                * handler will complete pending requests after it has completed.
+                */
+               if ((boardp->flags & ASC_HOST_IN_RESET) == 0) {
+                       ASC_DBG2(1,
+                                "advansys_interrupt: done_scp 0x%lx, last_scp 0x%lx\n",
+                                (ulong)done_scp, (ulong)last_scp);
+
+                       /* Start any waiting commands for the board. */
+                       if (!ASC_QUEUE_EMPTY(&boardp->waiting)) {
+                               ASC_DBG(1,
+                                       "advansys_interrupt: before asc_execute_queue()\n");
+                               asc_execute_queue(&boardp->waiting);
+                       }
+
+                       /*
+                        * Add to the list of requests that must be completed.
+                        *
+                        * 'done_scp' will always be NULL on the first iteration
+                        * of this loop. 'last_scp' is set at the same time as
+                        * 'done_scp'.
+                        */
+                       if (done_scp == NULL) {
+                               done_scp =
+                                   asc_dequeue_list(&boardp->done, &last_scp,
+                                                    ASC_TID_ALL);
+                       } else {
+                               ASC_ASSERT(last_scp != NULL);
+                               last_scp->host_scribble =
+                                   (unsigned char *)asc_dequeue_list(&boardp->
+                                                                     done,
+                                                                     &new_last_scp,
+                                                                     ASC_TID_ALL);
+                               if (new_last_scp != NULL) {
+                                       ASC_ASSERT(REQPNEXT(last_scp) != NULL);
+                                       last_scp = new_last_scp;
+                               }
+                       }
+               }
+               spin_unlock_irqrestore(&boardp->lock, flags);
+       }
 
-    /*
-     * If interrupts were enabled on entry, then they
-     * are now enabled here.
-     *
-     * Complete all requests on the done list.
-     */
+       /*
+        * If interrupts were enabled on entry, then they
+        * are now enabled here.
+        *
+        * Complete all requests on the done list.
+        */
 
-    asc_scsi_done_list(done_scp);
+       asc_scsi_done_list(done_scp);
 
-    ASC_DBG(1, "advansys_interrupt: end\n");
-    return IRQ_HANDLED;
+       ASC_DBG(1, "advansys_interrupt: end\n");
+       return IRQ_HANDLED;
 }
 
 /*
  * Set the number of commands to queue per device for the
  * specified host adapter.
  */
-STATIC int
-advansys_slave_configure(struct scsi_device *device)
+static int advansys_slave_configure(struct scsi_device *device)
 {
-    asc_board_t        *boardp;
+       asc_board_t *boardp;
 
-    boardp = ASC_BOARDP(device->host);
-    boardp->flags |= ASC_SELECT_QUEUE_DEPTHS;
-    /*
-     * Save a pointer to the device and set its initial/maximum
-     * queue depth.  Only save the pointer for a lun0 dev though.
-     */
-    if(device->lun == 0)
-        boardp->device[device->id] = device;
-    if(device->tagged_supported) {
-        if (ASC_NARROW_BOARD(boardp)) {
-           scsi_adjust_queue_depth(device, MSG_ORDERED_TAG,
-                boardp->dvc_var.asc_dvc_var.max_dvc_qng[device->id]);
-        } else {
-           scsi_adjust_queue_depth(device, MSG_ORDERED_TAG,
-                boardp->dvc_var.adv_dvc_var.max_dvc_qng);
-        }
-    } else {
-       scsi_adjust_queue_depth(device, 0, device->host->cmd_per_lun);
-    }
-    ASC_DBG4(1, "advansys_slave_configure: device 0x%lx, boardp 0x%lx, id %d, depth %d\n",
-            (ulong) device, (ulong) boardp, device->id, device->queue_depth);
-    return 0;
+       boardp = ASC_BOARDP(device->host);
+       boardp->flags |= ASC_SELECT_QUEUE_DEPTHS;
+       /*
+        * Save a pointer to the device and set its initial/maximum
+        * queue depth.  Only save the pointer for a lun0 dev though.
+        */
+       if (device->lun == 0)
+               boardp->device[device->id] = device;
+       if (device->tagged_supported) {
+               if (ASC_NARROW_BOARD(boardp)) {
+                       scsi_adjust_queue_depth(device, MSG_ORDERED_TAG,
+                                               boardp->dvc_var.asc_dvc_var.
+                                               max_dvc_qng[device->id]);
+               } else {
+                       scsi_adjust_queue_depth(device, MSG_ORDERED_TAG,
+                                               boardp->dvc_var.adv_dvc_var.
+                                               max_dvc_qng);
+               }
+       } else {
+               scsi_adjust_queue_depth(device, 0, device->host->cmd_per_lun);
+       }
+       ASC_DBG4(1,
+                "advansys_slave_configure: device 0x%lx, boardp 0x%lx, id %d, depth %d\n",
+                (ulong)device, (ulong)boardp, device->id, device->queue_depth);
+       return 0;
 }
 
 /*
@@ -6045,43 +4839,44 @@ advansys_slave_configure(struct scsi_device *device)
  *
  * Interrupts can be enabled on entry.
  */
-STATIC void
-asc_scsi_done_list(struct scsi_cmnd *scp)
+static void asc_scsi_done_list(struct scsi_cmnd *scp)
 {
-    struct scsi_cmnd    *tscp;
+       struct scsi_cmnd *tscp;
 
-    ASC_DBG(2, "asc_scsi_done_list: begin\n");
-    while (scp != NULL) {
-       asc_board_t *boardp;
-       struct device *dev;
+       ASC_DBG(2, "asc_scsi_done_list: begin\n");
+       while (scp != NULL) {
+               asc_board_t *boardp;
+               struct device *dev;
 
-        ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong) scp);
-        tscp = REQPNEXT(scp);
-        scp->host_scribble = NULL;
+               ASC_DBG1(3, "asc_scsi_done_list: scp 0x%lx\n", (ulong)scp);
+               tscp = REQPNEXT(scp);
+               scp->host_scribble = NULL;
 
-       boardp = ASC_BOARDP(scp->device->host);
+               boardp = ASC_BOARDP(scp->device->host);
 
-       if (ASC_NARROW_BOARD(boardp))
-           dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
-       else
-           dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
+               if (ASC_NARROW_BOARD(boardp))
+                       dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
+               else
+                       dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
 
-       if (scp->use_sg)
-           dma_unmap_sg(dev, (struct scatterlist *)scp->request_buffer,
-                        scp->use_sg, scp->sc_data_direction);
-       else if (scp->request_bufflen)
-           dma_unmap_single(dev, scp->SCp.dma_handle,
-                            scp->request_bufflen, scp->sc_data_direction);
+               if (scp->use_sg)
+                       dma_unmap_sg(dev,
+                                    (struct scatterlist *)scp->request_buffer,
+                                    scp->use_sg, scp->sc_data_direction);
+               else if (scp->request_bufflen)
+                       dma_unmap_single(dev, scp->SCp.dma_handle,
+                                        scp->request_bufflen,
+                                        scp->sc_data_direction);
 
-        ASC_STATS(scp->device->host, done);
-        ASC_ASSERT(scp->scsi_done != NULL);
+               ASC_STATS(scp->device->host, done);
+               ASC_ASSERT(scp->scsi_done != NULL);
 
-        scp->scsi_done(scp);
+               scp->scsi_done(scp);
 
-        scp = tscp;
-    }
-    ASC_DBG(2, "asc_scsi_done_list: done\n");
-    return;
+               scp = tscp;
+       }
+       ASC_DBG(2, "asc_scsi_done_list: done\n");
+       return;
 }
 
 /*
@@ -6130,168 +4925,170 @@ asc_scsi_done_list(struct scsi_cmnd *scp)
  * If ASC_BUSY is returned the request will be enqueued by the
  * caller on the target's waiting queue and re-tried later.
  */
-STATIC int
-asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
+static int asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
 {
-    asc_board_t        *boardp;
-    ASC_DVC_VAR        *asc_dvc_varp;
-    ADV_DVC_VAR        *adv_dvc_varp;
-    ADV_SCSI_REQ_Q     *adv_scsiqp;
-    struct scsi_device *device;
-    int                ret;
-
-    ASC_DBG2(1, "asc_execute_scsi_cmnd: scp 0x%lx, done 0x%lx\n",
-        (ulong) scp, (ulong) scp->scsi_done);
-
-    boardp = ASC_BOARDP(scp->device->host);
-    device = boardp->device[scp->device->id];
-
-    if (ASC_NARROW_BOARD(boardp)) {
-        /*
-         * Build and execute Narrow Board request.
-         */
-
-        asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
-
-        /*
-         * Build Asc Library request structure using the
-         * global structures 'asc_scsi_req' and 'asc_sg_head'.
-         *
-         * If an error is returned, then the request has been
-         * queued on the board done queue. It will be completed
-         * by the caller.
-         *
-         * asc_build_req() can not return ASC_BUSY.
-         */
-        if (asc_build_req(boardp, scp) == ASC_ERROR) {
-            ASC_STATS(scp->device->host, build_error);
-            return ASC_ERROR;
-        }
-
-        /*
-         * Execute the command. If there is no error, add the command
-         * to the active queue.
-         */
-        switch (ret = AscExeScsiQueue(asc_dvc_varp, &asc_scsi_q)) {
-        case ASC_NOERROR:
-            ASC_STATS(scp->device->host, exe_noerror);
-            /*
-             * Increment monotonically increasing per device successful
-             * request counter. Wrapping doesn't matter.
-             */
-            boardp->reqcnt[scp->device->id]++;
-            asc_enqueue(&boardp->active, scp, ASC_BACK);
-            ASC_DBG(1,
-                "asc_execute_scsi_cmnd: AscExeScsiQueue(), ASC_NOERROR\n");
-            break;
-        case ASC_BUSY:
-            /*
-             * Caller will enqueue request on the target's waiting queue
-             * and retry later.
-             */
-            ASC_STATS(scp->device->host, exe_busy);
-            break;
-        case ASC_ERROR:
-            ASC_PRINT2(
-"asc_execute_scsi_cmnd: board %d: AscExeScsiQueue() ASC_ERROR, err_code 0x%x\n",
-                boardp->id, asc_dvc_varp->err_code);
-            ASC_STATS(scp->device->host, exe_error);
-            scp->result = HOST_BYTE(DID_ERROR);
-            asc_enqueue(&boardp->done, scp, ASC_BACK);
-            break;
-        default:
-            ASC_PRINT2(
-"asc_execute_scsi_cmnd: board %d: AscExeScsiQueue() unknown, err_code 0x%x\n",
-                boardp->id, asc_dvc_varp->err_code);
-            ASC_STATS(scp->device->host, exe_unknown);
-            scp->result = HOST_BYTE(DID_ERROR);
-            asc_enqueue(&boardp->done, scp, ASC_BACK);
-            break;
-        }
-    } else {
-        /*
-         * Build and execute Wide Board request.
-         */
-        adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
-
-        /*
-         * Build and get a pointer to an Adv Library request structure.
-         *
-         * If the request is successfully built then send it below,
-         * otherwise return with an error.
-         */
-        switch (adv_build_req(boardp, scp, &adv_scsiqp)) {
-        case ASC_NOERROR:
-            ASC_DBG(3, "asc_execute_scsi_cmnd: adv_build_req ASC_NOERROR\n");
-            break;
-        case ASC_BUSY:
-            ASC_DBG(1, "asc_execute_scsi_cmnd: adv_build_req ASC_BUSY\n");
-            /*
-             * If busy is returned the request has not been enqueued.
-             * It will be enqueued by the caller on the target's waiting
-             * queue and retried later.
-             *
-             * The asc_stats fields 'adv_build_noreq' and 'adv_build_nosg'
-             * count wide board busy conditions. They are updated in
-             * adv_build_req and adv_get_sglist, respectively.
-             */
-            return ASC_BUSY;
-        case ASC_ERROR:
-             /* 
-              * If an error is returned, then the request has been
-              * queued on the board done queue. It will be completed
-              * by the caller.
-              */
-        default:
-            ASC_DBG(1, "asc_execute_scsi_cmnd: adv_build_req ASC_ERROR\n");
-            ASC_STATS(scp->device->host, build_error);
-            return ASC_ERROR;
-        }
-
-        /*
-         * Execute the command. If there is no error, add the command
-         * to the active queue.
-         */
-        switch (ret = AdvExeScsiQueue(adv_dvc_varp, adv_scsiqp)) {
-        case ASC_NOERROR:
-            ASC_STATS(scp->device->host, exe_noerror);
-            /*
-             * Increment monotonically increasing per device successful
-             * request counter. Wrapping doesn't matter.
-             */
-            boardp->reqcnt[scp->device->id]++;
-            asc_enqueue(&boardp->active, scp, ASC_BACK);
-            ASC_DBG(1,
-                "asc_execute_scsi_cmnd: AdvExeScsiQueue(), ASC_NOERROR\n");
-            break;
-        case ASC_BUSY:
-            /*
-             * Caller will enqueue request on the target's waiting queue
-             * and retry later.
-             */
-            ASC_STATS(scp->device->host, exe_busy);
-            break;
-        case ASC_ERROR:
-            ASC_PRINT2(
-"asc_execute_scsi_cmnd: board %d: AdvExeScsiQueue() ASC_ERROR, err_code 0x%x\n",
-                boardp->id, adv_dvc_varp->err_code);
-            ASC_STATS(scp->device->host, exe_error);
-            scp->result = HOST_BYTE(DID_ERROR);
-            asc_enqueue(&boardp->done, scp, ASC_BACK);
-            break;
-        default:
-            ASC_PRINT2(
-"asc_execute_scsi_cmnd: board %d: AdvExeScsiQueue() unknown, err_code 0x%x\n",
-                boardp->id, adv_dvc_varp->err_code);
-            ASC_STATS(scp->device->host, exe_unknown);
-            scp->result = HOST_BYTE(DID_ERROR);
-            asc_enqueue(&boardp->done, scp, ASC_BACK);
-            break;
-        }
-    }
+       asc_board_t *boardp;
+       ASC_DVC_VAR *asc_dvc_varp;
+       ADV_DVC_VAR *adv_dvc_varp;
+       ADV_SCSI_REQ_Q *adv_scsiqp;
+       struct scsi_device *device;
+       int ret;
+
+       ASC_DBG2(1, "asc_execute_scsi_cmnd: scp 0x%lx, done 0x%lx\n",
+                (ulong)scp, (ulong)scp->scsi_done);
+
+       boardp = ASC_BOARDP(scp->device->host);
+       device = boardp->device[scp->device->id];
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               /*
+                * Build and execute Narrow Board request.
+                */
+
+               asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
+
+               /*
+                * Build Asc Library request structure using the
+                * global structures 'asc_scsi_req' and 'asc_sg_head'.
+                *
+                * If an error is returned, then the request has been
+                * queued on the board done queue. It will be completed
+                * by the caller.
+                *
+                * asc_build_req() can not return ASC_BUSY.
+                */
+               if (asc_build_req(boardp, scp) == ASC_ERROR) {
+                       ASC_STATS(scp->device->host, build_error);
+                       return ASC_ERROR;
+               }
+
+               /*
+                * Execute the command. If there is no error, add the command
+                * to the active queue.
+                */
+               switch (ret = AscExeScsiQueue(asc_dvc_varp, &asc_scsi_q)) {
+               case ASC_NOERROR:
+                       ASC_STATS(scp->device->host, exe_noerror);
+                       /*
+                        * Increment monotonically increasing per device successful
+                        * request counter. Wrapping doesn't matter.
+                        */
+                       boardp->reqcnt[scp->device->id]++;
+                       asc_enqueue(&boardp->active, scp, ASC_BACK);
+                       ASC_DBG(1,
+                               "asc_execute_scsi_cmnd: AscExeScsiQueue(), ASC_NOERROR\n");
+                       break;
+               case ASC_BUSY:
+                       /*
+                        * Caller will enqueue request on the target's waiting queue
+                        * and retry later.
+                        */
+                       ASC_STATS(scp->device->host, exe_busy);
+                       break;
+               case ASC_ERROR:
+                       ASC_PRINT2
+                           ("asc_execute_scsi_cmnd: board %d: AscExeScsiQueue() ASC_ERROR, err_code 0x%x\n",
+                            boardp->id, asc_dvc_varp->err_code);
+                       ASC_STATS(scp->device->host, exe_error);
+                       scp->result = HOST_BYTE(DID_ERROR);
+                       asc_enqueue(&boardp->done, scp, ASC_BACK);
+                       break;
+               default:
+                       ASC_PRINT2
+                           ("asc_execute_scsi_cmnd: board %d: AscExeScsiQueue() unknown, err_code 0x%x\n",
+                            boardp->id, asc_dvc_varp->err_code);
+                       ASC_STATS(scp->device->host, exe_unknown);
+                       scp->result = HOST_BYTE(DID_ERROR);
+                       asc_enqueue(&boardp->done, scp, ASC_BACK);
+                       break;
+               }
+       } else {
+               /*
+                * Build and execute Wide Board request.
+                */
+               adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
+
+               /*
+                * Build and get a pointer to an Adv Library request structure.
+                *
+                * If the request is successfully built then send it below,
+                * otherwise return with an error.
+                */
+               switch (adv_build_req(boardp, scp, &adv_scsiqp)) {
+               case ASC_NOERROR:
+                       ASC_DBG(3,
+                               "asc_execute_scsi_cmnd: adv_build_req ASC_NOERROR\n");
+                       break;
+               case ASC_BUSY:
+                       ASC_DBG(1,
+                               "asc_execute_scsi_cmnd: adv_build_req ASC_BUSY\n");
+                       /*
+                        * If busy is returned the request has not been enqueued.
+                        * It will be enqueued by the caller on the target's waiting
+                        * queue and retried later.
+                        *
+                        * The asc_stats fields 'adv_build_noreq' and 'adv_build_nosg'
+                        * count wide board busy conditions. They are updated in
+                        * adv_build_req and adv_get_sglist, respectively.
+                        */
+                       return ASC_BUSY;
+               case ASC_ERROR:
+                       /* 
+                        * If an error is returned, then the request has been
+                        * queued on the board done queue. It will be completed
+                        * by the caller.
+                        */
+               default:
+                       ASC_DBG(1,
+                               "asc_execute_scsi_cmnd: adv_build_req ASC_ERROR\n");
+                       ASC_STATS(scp->device->host, build_error);
+                       return ASC_ERROR;
+               }
 
-    ASC_DBG(1, "asc_execute_scsi_cmnd: end\n");
-    return ret;
+               /*
+                * Execute the command. If there is no error, add the command
+                * to the active queue.
+                */
+               switch (ret = AdvExeScsiQueue(adv_dvc_varp, adv_scsiqp)) {
+               case ASC_NOERROR:
+                       ASC_STATS(scp->device->host, exe_noerror);
+                       /*
+                        * Increment monotonically increasing per device successful
+                        * request counter. Wrapping doesn't matter.
+                        */
+                       boardp->reqcnt[scp->device->id]++;
+                       asc_enqueue(&boardp->active, scp, ASC_BACK);
+                       ASC_DBG(1,
+                               "asc_execute_scsi_cmnd: AdvExeScsiQueue(), ASC_NOERROR\n");
+                       break;
+               case ASC_BUSY:
+                       /*
+                        * Caller will enqueue request on the target's waiting queue
+                        * and retry later.
+                        */
+                       ASC_STATS(scp->device->host, exe_busy);
+                       break;
+               case ASC_ERROR:
+                       ASC_PRINT2
+                           ("asc_execute_scsi_cmnd: board %d: AdvExeScsiQueue() ASC_ERROR, err_code 0x%x\n",
+                            boardp->id, adv_dvc_varp->err_code);
+                       ASC_STATS(scp->device->host, exe_error);
+                       scp->result = HOST_BYTE(DID_ERROR);
+                       asc_enqueue(&boardp->done, scp, ASC_BACK);
+                       break;
+               default:
+                       ASC_PRINT2
+                           ("asc_execute_scsi_cmnd: board %d: AdvExeScsiQueue() unknown, err_code 0x%x\n",
+                            boardp->id, adv_dvc_varp->err_code);
+                       ASC_STATS(scp->device->host, exe_unknown);
+                       scp->result = HOST_BYTE(DID_ERROR);
+                       asc_enqueue(&boardp->done, scp, ASC_BACK);
+                       break;
+               }
+       }
+
+       ASC_DBG(1, "asc_execute_scsi_cmnd: end\n");
+       return ret;
 }
 
 /*
@@ -6303,131 +5100,140 @@ asc_execute_scsi_cmnd(struct scsi_cmnd *scp)
  * If an error occurs, then queue the request on the board done
  * queue and return ASC_ERROR.
  */
-STATIC int
-asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
+static int asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
 {
-    struct device *dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
-
-    /*
-     * Mutually exclusive access is required to 'asc_scsi_q' and
-     * 'asc_sg_head' until after the request is started.
-     */
-    memset(&asc_scsi_q, 0, sizeof(ASC_SCSI_Q));
-
-    /*
-     * Point the ASC_SCSI_Q to the 'struct scsi_cmnd'.
-     */
-    asc_scsi_q.q2.srb_ptr = ASC_VADDR_TO_U32(scp);
-
-    /*
-     * Build the ASC_SCSI_Q request.
-     *
-     * For narrow boards a CDB length maximum of 12 bytes
-     * is supported.
-     */
-    if (scp->cmd_len > ASC_MAX_CDB_LEN) {
-        ASC_PRINT3(
-"asc_build_req: board %d: cmd_len %d > ASC_MAX_CDB_LEN  %d\n",
-            boardp->id, scp->cmd_len, ASC_MAX_CDB_LEN);
-        scp->result = HOST_BYTE(DID_ERROR);
-        asc_enqueue(&boardp->done, scp, ASC_BACK);
-        return ASC_ERROR;
-    }
-    asc_scsi_q.cdbptr = &scp->cmnd[0];
-    asc_scsi_q.q2.cdb_len = scp->cmd_len;
-    asc_scsi_q.q1.target_id = ASC_TID_TO_TARGET_ID(scp->device->id);
-    asc_scsi_q.q1.target_lun = scp->device->lun;
-    asc_scsi_q.q2.target_ix = ASC_TIDLUN_TO_IX(scp->device->id, scp->device->lun);
-    asc_scsi_q.q1.sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
-    asc_scsi_q.q1.sense_len = sizeof(scp->sense_buffer);
+       struct device *dev = boardp->dvc_cfg.asc_dvc_cfg.dev;
+
+       /*
+        * Mutually exclusive access is required to 'asc_scsi_q' and
+        * 'asc_sg_head' until after the request is started.
+        */
+       memset(&asc_scsi_q, 0, sizeof(ASC_SCSI_Q));
+
+       /*
+        * Point the ASC_SCSI_Q to the 'struct scsi_cmnd'.
+        */
+       asc_scsi_q.q2.srb_ptr = ASC_VADDR_TO_U32(scp);
+
+       /*
+        * Build the ASC_SCSI_Q request.
+        *
+        * For narrow boards a CDB length maximum of 12 bytes
+        * is supported.
+        */
+       if (scp->cmd_len > ASC_MAX_CDB_LEN) {
+               ASC_PRINT3
+                   ("asc_build_req: board %d: cmd_len %d > ASC_MAX_CDB_LEN  %d\n",
+                    boardp->id, scp->cmd_len, ASC_MAX_CDB_LEN);
+               scp->result = HOST_BYTE(DID_ERROR);
+               asc_enqueue(&boardp->done, scp, ASC_BACK);
+               return ASC_ERROR;
+       }
+       asc_scsi_q.cdbptr = &scp->cmnd[0];
+       asc_scsi_q.q2.cdb_len = scp->cmd_len;
+       asc_scsi_q.q1.target_id = ASC_TID_TO_TARGET_ID(scp->device->id);
+       asc_scsi_q.q1.target_lun = scp->device->lun;
+       asc_scsi_q.q2.target_ix =
+           ASC_TIDLUN_TO_IX(scp->device->id, scp->device->lun);
+       asc_scsi_q.q1.sense_addr =
+           cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
+       asc_scsi_q.q1.sense_len = sizeof(scp->sense_buffer);
+
+       /*
+        * If there are any outstanding requests for the current target,
+        * then every 255th request send an ORDERED request. This heuristic
+        * tries to retain the benefit of request sorting while preventing
+        * request starvation. 255 is the max number of tags or pending commands
+        * a device may have outstanding.
+        *
+        * The request count is incremented below for every successfully
+        * started request.
+        *
+        */
+       if ((boardp->dvc_var.asc_dvc_var.cur_dvc_qng[scp->device->id] > 0) &&
+           (boardp->reqcnt[scp->device->id] % 255) == 0) {
+               asc_scsi_q.q2.tag_code = MSG_ORDERED_TAG;
+       } else {
+               asc_scsi_q.q2.tag_code = MSG_SIMPLE_TAG;
+       }
 
-    /*
-     * If there are any outstanding requests for the current target,
-     * then every 255th request send an ORDERED request. This heuristic
-     * tries to retain the benefit of request sorting while preventing
-     * request starvation. 255 is the max number of tags or pending commands
-     * a device may have outstanding.
-     *
-     * The request count is incremented below for every successfully
-     * started request.
-     *
-     */
-    if ((boardp->dvc_var.asc_dvc_var.cur_dvc_qng[scp->device->id] > 0) &&
-        (boardp->reqcnt[scp->device->id] % 255) == 0) {
-        asc_scsi_q.q2.tag_code = MSG_ORDERED_TAG;
-    } else {
-        asc_scsi_q.q2.tag_code = MSG_SIMPLE_TAG;
-    }
+       /*
+        * Build ASC_SCSI_Q for a contiguous buffer or a scatter-gather
+        * buffer command.
+        */
+       if (scp->use_sg == 0) {
+               /*
+                * CDB request of single contiguous buffer.
+                */
+               ASC_STATS(scp->device->host, cont_cnt);
+               scp->SCp.dma_handle = scp->request_bufflen ?
+                   dma_map_single(dev, scp->request_buffer,
+                                  scp->request_bufflen,
+                                  scp->sc_data_direction) : 0;
+               asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
+               asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
+               ASC_STATS_ADD(scp->device->host, cont_xfer,
+                             ASC_CEILING(scp->request_bufflen, 512));
+               asc_scsi_q.q1.sg_queue_cnt = 0;
+               asc_scsi_q.sg_head = NULL;
+       } else {
+               /*
+                * CDB scatter-gather request list.
+                */
+               int sgcnt;
+               int use_sg;
+               struct scatterlist *slp;
+
+               slp = (struct scatterlist *)scp->request_buffer;
+               use_sg =
+                   dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
+
+               if (use_sg > scp->device->host->sg_tablesize) {
+                       ASC_PRINT3
+                           ("asc_build_req: board %d: use_sg %d > sg_tablesize %d\n",
+                            boardp->id, use_sg,
+                            scp->device->host->sg_tablesize);
+                       dma_unmap_sg(dev, slp, scp->use_sg,
+                                    scp->sc_data_direction);
+                       scp->result = HOST_BYTE(DID_ERROR);
+                       asc_enqueue(&boardp->done, scp, ASC_BACK);
+                       return ASC_ERROR;
+               }
+
+               ASC_STATS(scp->device->host, sg_cnt);
 
-    /*
-     * Build ASC_SCSI_Q for a contiguous buffer or a scatter-gather
-     * buffer command.
-     */
-    if (scp->use_sg == 0) {
-        /*
-         * CDB request of single contiguous buffer.
-         */
-        ASC_STATS(scp->device->host, cont_cnt);
-       scp->SCp.dma_handle = scp->request_bufflen ?
-           dma_map_single(dev, scp->request_buffer,
-                          scp->request_bufflen, scp->sc_data_direction) : 0;
-       asc_scsi_q.q1.data_addr = cpu_to_le32(scp->SCp.dma_handle);
-        asc_scsi_q.q1.data_cnt = cpu_to_le32(scp->request_bufflen);
-        ASC_STATS_ADD(scp->device->host, cont_xfer,
-                      ASC_CEILING(scp->request_bufflen, 512));
-        asc_scsi_q.q1.sg_queue_cnt = 0;
-        asc_scsi_q.sg_head = NULL;
-    } else {
-        /*
-         * CDB scatter-gather request list.
-         */
-        int                     sgcnt;
-       int                     use_sg;
-        struct scatterlist      *slp;
+               /*
+                * Use global ASC_SG_HEAD structure and set the ASC_SCSI_Q
+                * structure to point to it.
+                */
+               memset(&asc_sg_head, 0, sizeof(ASC_SG_HEAD));
+
+               asc_scsi_q.q1.cntl |= QC_SG_HEAD;
+               asc_scsi_q.sg_head = &asc_sg_head;
+               asc_scsi_q.q1.data_cnt = 0;
+               asc_scsi_q.q1.data_addr = 0;
+               /* This is a byte value, otherwise it would need to be swapped. */
+               asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = use_sg;
+               ASC_STATS_ADD(scp->device->host, sg_elem,
+                             asc_sg_head.entry_cnt);
 
-       slp = (struct scatterlist *)scp->request_buffer;
-       use_sg = dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
-
-       if (use_sg > scp->device->host->sg_tablesize) {
-            ASC_PRINT3(
-"asc_build_req: board %d: use_sg %d > sg_tablesize %d\n",
-               boardp->id, use_sg, scp->device->host->sg_tablesize);
-           dma_unmap_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
-            scp->result = HOST_BYTE(DID_ERROR);
-            asc_enqueue(&boardp->done, scp, ASC_BACK);
-            return ASC_ERROR;
-        }
-
-        ASC_STATS(scp->device->host, sg_cnt);
-
-        /*
-         * Use global ASC_SG_HEAD structure and set the ASC_SCSI_Q
-         * structure to point to it.
-         */
-        memset(&asc_sg_head, 0, sizeof(ASC_SG_HEAD));
-
-        asc_scsi_q.q1.cntl |= QC_SG_HEAD;
-        asc_scsi_q.sg_head = &asc_sg_head;
-        asc_scsi_q.q1.data_cnt = 0;
-        asc_scsi_q.q1.data_addr = 0;
-        /* This is a byte value, otherwise it would need to be swapped. */
-       asc_sg_head.entry_cnt = asc_scsi_q.q1.sg_queue_cnt = use_sg;
-        ASC_STATS_ADD(scp->device->host, sg_elem, asc_sg_head.entry_cnt);
-
-        /*
-         * Convert scatter-gather list into ASC_SG_HEAD list.
-         */
-       for (sgcnt = 0; sgcnt < use_sg; sgcnt++, slp++) {
-           asc_sg_head.sg_list[sgcnt].addr = cpu_to_le32(sg_dma_address(slp));
-           asc_sg_head.sg_list[sgcnt].bytes = cpu_to_le32(sg_dma_len(slp));
-           ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
-        }
-    }
+               /*
+                * Convert scatter-gather list into ASC_SG_HEAD list.
+                */
+               for (sgcnt = 0; sgcnt < use_sg; sgcnt++, slp++) {
+                       asc_sg_head.sg_list[sgcnt].addr =
+                           cpu_to_le32(sg_dma_address(slp));
+                       asc_sg_head.sg_list[sgcnt].bytes =
+                           cpu_to_le32(sg_dma_len(slp));
+                       ASC_STATS_ADD(scp->device->host, sg_xfer,
+                                     ASC_CEILING(sg_dma_len(slp), 512));
+               }
+       }
 
-    ASC_DBG_PRT_ASC_SCSI_Q(2, &asc_scsi_q);
-    ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
+       ASC_DBG_PRT_ASC_SCSI_Q(2, &asc_scsi_q);
+       ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
 
-    return ASC_NOERROR;
+       return ASC_NOERROR;
 }
 
 /*
@@ -6440,162 +5246,168 @@ asc_build_req(asc_board_t *boardp, struct scsi_cmnd *scp)
  * microcode for DMA addresses or math operations are byte swapped
  * to little-endian order.
  */
-STATIC int
+static int
 adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
-    ADV_SCSI_REQ_Q **adv_scsiqpp)
+             ADV_SCSI_REQ_Q **adv_scsiqpp)
 {
-    adv_req_t           *reqp;
-    ADV_SCSI_REQ_Q      *scsiqp;
-    int                 i;
-    int                 ret;
-    struct device      *dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
-
-    /*
-     * Allocate an adv_req_t structure from the board to execute
-     * the command.
-     */
-    if (boardp->adv_reqp == NULL) {
-        ASC_DBG(1, "adv_build_req: no free adv_req_t\n");
-        ASC_STATS(scp->device->host, adv_build_noreq);
-        return ASC_BUSY;
-    } else {
-        reqp = boardp->adv_reqp;
-        boardp->adv_reqp = reqp->next_reqp;
-        reqp->next_reqp = NULL;
-    }
-
-    /*
-     * Get 32-byte aligned ADV_SCSI_REQ_Q and ADV_SG_BLOCK pointers.
-     */
-    scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
-
-    /*
-     * Initialize the structure.
-     */
-    scsiqp->cntl = scsiqp->scsi_cntl = scsiqp->done_status = 0;
-
-    /*
-     * Set the ADV_SCSI_REQ_Q 'srb_ptr' to point to the adv_req_t structure.
-     */
-    scsiqp->srb_ptr = ASC_VADDR_TO_U32(reqp);
-
-    /*
-     * Set the adv_req_t 'cmndp' to point to the struct scsi_cmnd structure.
-     */
-    reqp->cmndp = scp;
+       adv_req_t *reqp;
+       ADV_SCSI_REQ_Q *scsiqp;
+       int i;
+       int ret;
+       struct device *dev = boardp->dvc_cfg.adv_dvc_cfg.dev;
+
+       /*
+        * Allocate an adv_req_t structure from the board to execute
+        * the command.
+        */
+       if (boardp->adv_reqp == NULL) {
+               ASC_DBG(1, "adv_build_req: no free adv_req_t\n");
+               ASC_STATS(scp->device->host, adv_build_noreq);
+               return ASC_BUSY;
+       } else {
+               reqp = boardp->adv_reqp;
+               boardp->adv_reqp = reqp->next_reqp;
+               reqp->next_reqp = NULL;
+       }
 
-    /*
-     * Build the ADV_SCSI_REQ_Q request.
-     */
+       /*
+        * Get 32-byte aligned ADV_SCSI_REQ_Q and ADV_SG_BLOCK pointers.
+        */
+       scsiqp = (ADV_SCSI_REQ_Q *)ADV_32BALIGN(&reqp->scsi_req_q);
+
+       /*
+        * Initialize the structure.
+        */
+       scsiqp->cntl = scsiqp->scsi_cntl = scsiqp->done_status = 0;
+
+       /*
+        * Set the ADV_SCSI_REQ_Q 'srb_ptr' to point to the adv_req_t structure.
+        */
+       scsiqp->srb_ptr = ASC_VADDR_TO_U32(reqp);
+
+       /*
+        * Set the adv_req_t 'cmndp' to point to the struct scsi_cmnd structure.
+        */
+       reqp->cmndp = scp;
+
+       /*
+        * Build the ADV_SCSI_REQ_Q request.
+        */
+
+       /*
+        * Set CDB length and copy it to the request structure.
+        * For wide  boards a CDB length maximum of 16 bytes
+        * is supported.
+        */
+       if (scp->cmd_len > ADV_MAX_CDB_LEN) {
+               ASC_PRINT3
+                   ("adv_build_req: board %d: cmd_len %d > ADV_MAX_CDB_LEN  %d\n",
+                    boardp->id, scp->cmd_len, ADV_MAX_CDB_LEN);
+               scp->result = HOST_BYTE(DID_ERROR);
+               asc_enqueue(&boardp->done, scp, ASC_BACK);
+               return ASC_ERROR;
+       }
+       scsiqp->cdb_len = scp->cmd_len;
+       /* Copy first 12 CDB bytes to cdb[]. */
+       for (i = 0; i < scp->cmd_len && i < 12; i++) {
+               scsiqp->cdb[i] = scp->cmnd[i];
+       }
+       /* Copy last 4 CDB bytes, if present, to cdb16[]. */
+       for (; i < scp->cmd_len; i++) {
+               scsiqp->cdb16[i - 12] = scp->cmnd[i];
+       }
 
-    /*
-     * Set CDB length and copy it to the request structure.
-     * For wide  boards a CDB length maximum of 16 bytes
-     * is supported.
-     */
-    if (scp->cmd_len > ADV_MAX_CDB_LEN) {
-        ASC_PRINT3(
-"adv_build_req: board %d: cmd_len %d > ADV_MAX_CDB_LEN  %d\n",
-            boardp->id, scp->cmd_len, ADV_MAX_CDB_LEN);
-        scp->result = HOST_BYTE(DID_ERROR);
-        asc_enqueue(&boardp->done, scp, ASC_BACK);
-        return ASC_ERROR;
-    }
-    scsiqp->cdb_len = scp->cmd_len;
-    /* Copy first 12 CDB bytes to cdb[]. */
-    for (i = 0; i < scp->cmd_len && i < 12; i++) {
-        scsiqp->cdb[i] = scp->cmnd[i];
-    }
-    /* Copy last 4 CDB bytes, if present, to cdb16[]. */
-    for (; i < scp->cmd_len; i++) {
-        scsiqp->cdb16[i - 12] = scp->cmnd[i];
-    }
+       scsiqp->target_id = scp->device->id;
+       scsiqp->target_lun = scp->device->lun;
 
-    scsiqp->target_id = scp->device->id;
-    scsiqp->target_lun = scp->device->lun;
+       scsiqp->sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
+       scsiqp->sense_len = sizeof(scp->sense_buffer);
 
-    scsiqp->sense_addr = cpu_to_le32(virt_to_bus(&scp->sense_buffer[0]));
-    scsiqp->sense_len = sizeof(scp->sense_buffer);
+       /*
+        * Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
+        * buffer command.
+        */
 
-    /*
-     * Build ADV_SCSI_REQ_Q for a contiguous buffer or a scatter-gather
-     * buffer command.
-     */
-
-    scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
-    scsiqp->vdata_addr = scp->request_buffer;
-    scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
-
-    if (scp->use_sg == 0) {
-        /*
-         * CDB request of single contiguous buffer.
-         */
-        reqp->sgblkp = NULL;
        scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
-       if (scp->request_bufflen) {
-           scsiqp->vdata_addr = scp->request_buffer;
-           scp->SCp.dma_handle =
-               dma_map_single(dev, scp->request_buffer,
-                              scp->request_bufflen, scp->sc_data_direction);
-       } else {
-           scsiqp->vdata_addr = NULL;
-           scp->SCp.dma_handle = 0;
-       }
-       scsiqp->data_addr = cpu_to_le32(scp->SCp.dma_handle);
-        scsiqp->sg_list_ptr = NULL;
-        scsiqp->sg_real_addr = 0;
-        ASC_STATS(scp->device->host, cont_cnt);
-        ASC_STATS_ADD(scp->device->host, cont_xfer,
-                      ASC_CEILING(scp->request_bufflen, 512));
-    } else {
-        /*
-         * CDB scatter-gather request list.
-         */
-       struct scatterlist *slp;
-       int use_sg;
+       scsiqp->vdata_addr = scp->request_buffer;
+       scsiqp->data_addr = cpu_to_le32(virt_to_bus(scp->request_buffer));
 
-       slp = (struct scatterlist *)scp->request_buffer;
-       use_sg = dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
-
-       if (use_sg > ADV_MAX_SG_LIST) {
-            ASC_PRINT3(
-"adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n",
-               boardp->id, use_sg, scp->device->host->sg_tablesize);
-           dma_unmap_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
-            scp->result = HOST_BYTE(DID_ERROR);
-            asc_enqueue(&boardp->done, scp, ASC_BACK);
-
-            /*
-             * Free the 'adv_req_t' structure by adding it back to the
-             * board free list.
-             */
-            reqp->next_reqp = boardp->adv_reqp;
-            boardp->adv_reqp = reqp;
-
-            return ASC_ERROR;
-        }
-
-       if ((ret = adv_get_sglist(boardp, reqp, scp, use_sg)) != ADV_SUCCESS) {
-            /*
-             * Free the adv_req_t structure by adding it back to the
-             * board free list.
-             */
-            reqp->next_reqp = boardp->adv_reqp;
-            boardp->adv_reqp = reqp;
-
-            return ret;
-        }
-
-        ASC_STATS(scp->device->host, sg_cnt);
-       ASC_STATS_ADD(scp->device->host, sg_elem, use_sg);
-    }
+       if (scp->use_sg == 0) {
+               /*
+                * CDB request of single contiguous buffer.
+                */
+               reqp->sgblkp = NULL;
+               scsiqp->data_cnt = cpu_to_le32(scp->request_bufflen);
+               if (scp->request_bufflen) {
+                       scsiqp->vdata_addr = scp->request_buffer;
+                       scp->SCp.dma_handle =
+                           dma_map_single(dev, scp->request_buffer,
+                                          scp->request_bufflen,
+                                          scp->sc_data_direction);
+               } else {
+                       scsiqp->vdata_addr = NULL;
+                       scp->SCp.dma_handle = 0;
+               }
+               scsiqp->data_addr = cpu_to_le32(scp->SCp.dma_handle);
+               scsiqp->sg_list_ptr = NULL;
+               scsiqp->sg_real_addr = 0;
+               ASC_STATS(scp->device->host, cont_cnt);
+               ASC_STATS_ADD(scp->device->host, cont_xfer,
+                             ASC_CEILING(scp->request_bufflen, 512));
+       } else {
+               /*
+                * CDB scatter-gather request list.
+                */
+               struct scatterlist *slp;
+               int use_sg;
+
+               slp = (struct scatterlist *)scp->request_buffer;
+               use_sg =
+                   dma_map_sg(dev, slp, scp->use_sg, scp->sc_data_direction);
+
+               if (use_sg > ADV_MAX_SG_LIST) {
+                       ASC_PRINT3
+                           ("adv_build_req: board %d: use_sg %d > ADV_MAX_SG_LIST %d\n",
+                            boardp->id, use_sg,
+                            scp->device->host->sg_tablesize);
+                       dma_unmap_sg(dev, slp, scp->use_sg,
+                                    scp->sc_data_direction);
+                       scp->result = HOST_BYTE(DID_ERROR);
+                       asc_enqueue(&boardp->done, scp, ASC_BACK);
+
+                       /*
+                        * Free the 'adv_req_t' structure by adding it back to the
+                        * board free list.
+                        */
+                       reqp->next_reqp = boardp->adv_reqp;
+                       boardp->adv_reqp = reqp;
+
+                       return ASC_ERROR;
+               }
+
+               if ((ret =
+                    adv_get_sglist(boardp, reqp, scp,
+                                   use_sg)) != ADV_SUCCESS) {
+                       /*
+                        * Free the adv_req_t structure by adding it back to the
+                        * board free list.
+                        */
+                       reqp->next_reqp = boardp->adv_reqp;
+                       boardp->adv_reqp = reqp;
+
+                       return ret;
+               }
+
+               ASC_STATS(scp->device->host, sg_cnt);
+               ASC_STATS_ADD(scp->device->host, sg_elem, use_sg);
+       }
 
-    ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
-    ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
+       ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
+       ASC_DBG_PRT_CDB(1, scp->cmnd, scp->cmd_len);
 
-    *adv_scsiqpp = scsiqp;
+       *adv_scsiqpp = scsiqp;
 
-    return ASC_NOERROR;
+       return ASC_NOERROR;
 }
 
 /*
@@ -6610,108 +5422,109 @@ adv_build_req(asc_board_t *boardp, struct scsi_cmnd *scp,
  *      ADV_SUCCESS(1) - SG List successfully created
  *      ADV_ERROR(-1) - SG List creation failed
  */
-STATIC int
-adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, struct scsi_cmnd *scp, int use_sg)
+static int
+adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, struct scsi_cmnd *scp,
+              int use_sg)
 {
-    adv_sgblk_t         *sgblkp;
-    ADV_SCSI_REQ_Q      *scsiqp;
-    struct scatterlist  *slp;
-    int                 sg_elem_cnt;
-    ADV_SG_BLOCK        *sg_block, *prev_sg_block;
-    ADV_PADDR           sg_block_paddr;
-    int                 i;
-
-    scsiqp = (ADV_SCSI_REQ_Q *) ADV_32BALIGN(&reqp->scsi_req_q);
-    slp = (struct scatterlist *) scp->request_buffer;
-    sg_elem_cnt = use_sg;
-    prev_sg_block = NULL;
-    reqp->sgblkp = NULL;
-
-    do
-    {
-        /*
-         * Allocate a 'adv_sgblk_t' structure from the board free
-         * list. One 'adv_sgblk_t' structure holds NO_OF_SG_PER_BLOCK
-         * (15) scatter-gather elements.
-         */
-        if ((sgblkp = boardp->adv_sgblkp) == NULL) {
-            ASC_DBG(1, "adv_get_sglist: no free adv_sgblk_t\n");
-            ASC_STATS(scp->device->host, adv_build_nosg);
-
-            /*
-             * Allocation failed. Free 'adv_sgblk_t' structures already
-             * allocated for the request.
-             */
-            while ((sgblkp = reqp->sgblkp) != NULL)
-            {
-                /* Remove 'sgblkp' from the request list. */
-                reqp->sgblkp = sgblkp->next_sgblkp;
-
-                /* Add 'sgblkp' to the board free list. */
-                sgblkp->next_sgblkp = boardp->adv_sgblkp;
-                boardp->adv_sgblkp = sgblkp;
-            }
-            return ASC_BUSY;
-        } else {
-            /* Complete 'adv_sgblk_t' board allocation. */
-            boardp->adv_sgblkp = sgblkp->next_sgblkp;
-            sgblkp->next_sgblkp = NULL;
-
-            /*
-             * Get 8 byte aligned virtual and physical addresses for
-             * the allocated ADV_SG_BLOCK structure.
-             */
-            sg_block = (ADV_SG_BLOCK *) ADV_8BALIGN(&sgblkp->sg_block);
-            sg_block_paddr = virt_to_bus(sg_block);
-
-            /*
-             * Check if this is the first 'adv_sgblk_t' for the request.
-             */
-            if (reqp->sgblkp == NULL)
-            {
-                /* Request's first scatter-gather block. */
-                reqp->sgblkp = sgblkp;
-
-                /*
-                 * Set ADV_SCSI_REQ_T ADV_SG_BLOCK virtual and physical
-                 * address pointers.
-                 */
-                scsiqp->sg_list_ptr = sg_block;
-                scsiqp->sg_real_addr = cpu_to_le32(sg_block_paddr);
-            } else
-            {
-                /* Request's second or later scatter-gather block. */
-                sgblkp->next_sgblkp = reqp->sgblkp;
-                reqp->sgblkp = sgblkp;
-
-                /*
-                 * Point the previous ADV_SG_BLOCK structure to
-                 * the newly allocated ADV_SG_BLOCK structure.
-                 */
-                ASC_ASSERT(prev_sg_block != NULL);
-                prev_sg_block->sg_ptr = cpu_to_le32(sg_block_paddr);
-            }
-        }
-
-        for (i = 0; i < NO_OF_SG_PER_BLOCK; i++)
-        {
-           sg_block->sg_list[i].sg_addr = cpu_to_le32(sg_dma_address(slp));
-           sg_block->sg_list[i].sg_count = cpu_to_le32(sg_dma_len(slp));
-           ASC_STATS_ADD(scp->device->host, sg_xfer, ASC_CEILING(sg_dma_len(slp), 512));
-
-            if (--sg_elem_cnt == 0)
-            {   /* Last ADV_SG_BLOCK and scatter-gather entry. */
-                sg_block->sg_cnt = i + 1;
-                sg_block->sg_ptr = 0L;    /* Last ADV_SG_BLOCK in list. */
-                return ADV_SUCCESS;
-            }
-            slp++;
-        }
-        sg_block->sg_cnt = NO_OF_SG_PER_BLOCK;
-        prev_sg_block = sg_block;
-    }
-    while (1);
-    /* NOTREACHED */
+       adv_sgblk_t *sgblkp;
+       ADV_SCSI_REQ_Q *scsiqp;
+       struct scatterlist *slp;
+       int sg_elem_cnt;
+       ADV_SG_BLOCK *sg_block, *prev_sg_block;
+       ADV_PADDR sg_block_paddr;
+       int i;
+
+       scsiqp = (ADV_SCSI_REQ_Q *)ADV_32BALIGN(&reqp->scsi_req_q);
+       slp = (struct scatterlist *)scp->request_buffer;
+       sg_elem_cnt = use_sg;
+       prev_sg_block = NULL;
+       reqp->sgblkp = NULL;
+
+       do {
+               /*
+                * Allocate a 'adv_sgblk_t' structure from the board free
+                * list. One 'adv_sgblk_t' structure holds NO_OF_SG_PER_BLOCK
+                * (15) scatter-gather elements.
+                */
+               if ((sgblkp = boardp->adv_sgblkp) == NULL) {
+                       ASC_DBG(1, "adv_get_sglist: no free adv_sgblk_t\n");
+                       ASC_STATS(scp->device->host, adv_build_nosg);
+
+                       /*
+                        * Allocation failed. Free 'adv_sgblk_t' structures already
+                        * allocated for the request.
+                        */
+                       while ((sgblkp = reqp->sgblkp) != NULL) {
+                               /* Remove 'sgblkp' from the request list. */
+                               reqp->sgblkp = sgblkp->next_sgblkp;
+
+                               /* Add 'sgblkp' to the board free list. */
+                               sgblkp->next_sgblkp = boardp->adv_sgblkp;
+                               boardp->adv_sgblkp = sgblkp;
+                       }
+                       return ASC_BUSY;
+               } else {
+                       /* Complete 'adv_sgblk_t' board allocation. */
+                       boardp->adv_sgblkp = sgblkp->next_sgblkp;
+                       sgblkp->next_sgblkp = NULL;
+
+                       /*
+                        * Get 8 byte aligned virtual and physical addresses for
+                        * the allocated ADV_SG_BLOCK structure.
+                        */
+                       sg_block =
+                           (ADV_SG_BLOCK *)ADV_8BALIGN(&sgblkp->sg_block);
+                       sg_block_paddr = virt_to_bus(sg_block);
+
+                       /*
+                        * Check if this is the first 'adv_sgblk_t' for the request.
+                        */
+                       if (reqp->sgblkp == NULL) {
+                               /* Request's first scatter-gather block. */
+                               reqp->sgblkp = sgblkp;
+
+                               /*
+                                * Set ADV_SCSI_REQ_T ADV_SG_BLOCK virtual and physical
+                                * address pointers.
+                                */
+                               scsiqp->sg_list_ptr = sg_block;
+                               scsiqp->sg_real_addr =
+                                   cpu_to_le32(sg_block_paddr);
+                       } else {
+                               /* Request's second or later scatter-gather block. */
+                               sgblkp->next_sgblkp = reqp->sgblkp;
+                               reqp->sgblkp = sgblkp;
+
+                               /*
+                                * Point the previous ADV_SG_BLOCK structure to
+                                * the newly allocated ADV_SG_BLOCK structure.
+                                */
+                               ASC_ASSERT(prev_sg_block != NULL);
+                               prev_sg_block->sg_ptr =
+                                   cpu_to_le32(sg_block_paddr);
+                       }
+               }
+
+               for (i = 0; i < NO_OF_SG_PER_BLOCK; i++) {
+                       sg_block->sg_list[i].sg_addr =
+                           cpu_to_le32(sg_dma_address(slp));
+                       sg_block->sg_list[i].sg_count =
+                           cpu_to_le32(sg_dma_len(slp));
+                       ASC_STATS_ADD(scp->device->host, sg_xfer,
+                                     ASC_CEILING(sg_dma_len(slp), 512));
+
+                       if (--sg_elem_cnt == 0) {       /* Last ADV_SG_BLOCK and scatter-gather entry. */
+                               sg_block->sg_cnt = i + 1;
+                               sg_block->sg_ptr = 0L;  /* Last ADV_SG_BLOCK in list. */
+                               return ADV_SUCCESS;
+                       }
+                       slp++;
+               }
+               sg_block->sg_cnt = NO_OF_SG_PER_BLOCK;
+               prev_sg_block = sg_block;
+       }
+       while (1);
+       /* NOTREACHED */
 }
 
 /*
@@ -6719,165 +5532,171 @@ adv_get_sglist(asc_board_t *boardp, adv_req_t *reqp, struct scsi_cmnd *scp, int
  *
  * Interrupt callback function for the Narrow SCSI Asc Library.
  */
-STATIC void
-asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
+static void asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
 {
-    asc_board_t         *boardp;
-    struct scsi_cmnd           *scp;
-    struct Scsi_Host    *shp;
-    int                 i;
-
-    ASC_DBG2(1, "asc_isr_callback: asc_dvc_varp 0x%lx, qdonep 0x%lx\n",
-        (ulong) asc_dvc_varp, (ulong) qdonep);
-    ASC_DBG_PRT_ASC_QDONE_INFO(2, qdonep);
+       asc_board_t *boardp;
+       struct scsi_cmnd *scp;
+       struct Scsi_Host *shost;
+       int i;
+
+       ASC_DBG2(1, "asc_isr_callback: asc_dvc_varp 0x%lx, qdonep 0x%lx\n",
+                (ulong)asc_dvc_varp, (ulong)qdonep);
+       ASC_DBG_PRT_ASC_QDONE_INFO(2, qdonep);
+
+       /*
+        * Get the struct scsi_cmnd structure and Scsi_Host structure for the
+        * command that has been completed.
+        */
+       scp = (struct scsi_cmnd *)ASC_U32_TO_VADDR(qdonep->d2.srb_ptr);
+       ASC_DBG1(1, "asc_isr_callback: scp 0x%lx\n", (ulong)scp);
+
+       if (scp == NULL) {
+               ASC_PRINT("asc_isr_callback: scp is NULL\n");
+               return;
+       }
+       ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
+
+       /*
+        * If the request's host pointer is not valid, display a
+        * message and return.
+        */
+       shost = scp->device->host;
+       for (i = 0; i < asc_board_count; i++) {
+               if (asc_host[i] == shost) {
+                       break;
+               }
+       }
+       if (i == asc_board_count) {
+               ASC_PRINT2
+                   ("asc_isr_callback: scp 0x%lx has bad host pointer, host 0x%lx\n",
+                    (ulong)scp, (ulong)shost);
+               return;
+       }
 
-    /*
-     * Get the struct scsi_cmnd structure and Scsi_Host structure for the
-     * command that has been completed.
-     */
-    scp = (struct scsi_cmnd *) ASC_U32_TO_VADDR(qdonep->d2.srb_ptr);
-    ASC_DBG1(1, "asc_isr_callback: scp 0x%lx\n", (ulong) scp);
-
-    if (scp == NULL) {
-        ASC_PRINT("asc_isr_callback: scp is NULL\n");
-        return;
-    }
-    ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
+       ASC_STATS(shost, callback);
+       ASC_DBG1(1, "asc_isr_callback: shost 0x%lx\n", (ulong)shost);
+
+       /*
+        * If the request isn't found on the active queue, it may
+        * have been removed to handle a reset request.
+        * Display a message and return.
+        */
+       boardp = ASC_BOARDP(shost);
+       ASC_ASSERT(asc_dvc_varp == &boardp->dvc_var.asc_dvc_var);
+       if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
+               ASC_PRINT2
+                   ("asc_isr_callback: board %d: scp 0x%lx not on active queue\n",
+                    boardp->id, (ulong)scp);
+               return;
+       }
 
-    /*
-     * If the request's host pointer is not valid, display a
-     * message and return.
-     */
-    shp = scp->device->host;
-    for (i = 0; i < asc_board_count; i++) {
-        if (asc_host[i] == shp) {
-            break;
-        }
-    }
-    if (i == asc_board_count) {
-        ASC_PRINT2(
-            "asc_isr_callback: scp 0x%lx has bad host pointer, host 0x%lx\n",
-            (ulong) scp, (ulong) shp);
-        return;
-    }
+       /*
+        * 'qdonep' contains the command's ending status.
+        */
+       switch (qdonep->d3.done_stat) {
+       case QD_NO_ERROR:
+               ASC_DBG(2, "asc_isr_callback: QD_NO_ERROR\n");
+               scp->result = 0;
 
-    ASC_STATS(shp, callback);
-    ASC_DBG1(1, "asc_isr_callback: shp 0x%lx\n", (ulong) shp);
+               /*
+                * If an INQUIRY command completed successfully, then call
+                * the AscInquiryHandling() function to set-up the device.
+                */
+               if (scp->cmnd[0] == INQUIRY && scp->device->lun == 0 &&
+                   (scp->request_bufflen - qdonep->remain_bytes) >= 8) {
+                       AscInquiryHandling(asc_dvc_varp, scp->device->id & 0x7,
+                                          (ASC_SCSI_INQUIRY *)scp->
+                                          request_buffer);
+               }
 
-    /*
-     * If the request isn't found on the active queue, it may
-     * have been removed to handle a reset request.
-     * Display a message and return.
-     */
-    boardp = ASC_BOARDP(shp);
-    ASC_ASSERT(asc_dvc_varp == &boardp->dvc_var.asc_dvc_var);
-    if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
-        ASC_PRINT2(
-            "asc_isr_callback: board %d: scp 0x%lx not on active queue\n",
-            boardp->id, (ulong) scp);
-        return;
-    }
+               /*
+                * Check for an underrun condition.
+                *
+                * If there was no error and an underrun condition, then
+                * then return the number of underrun bytes.
+                */
+               if (scp->request_bufflen != 0 && qdonep->remain_bytes != 0 &&
+                   qdonep->remain_bytes <= scp->request_bufflen) {
+                       ASC_DBG1(1,
+                                "asc_isr_callback: underrun condition %u bytes\n",
+                                (unsigned)qdonep->remain_bytes);
+                       scp->resid = qdonep->remain_bytes;
+               }
+               break;
+
+       case QD_WITH_ERROR:
+               ASC_DBG(2, "asc_isr_callback: QD_WITH_ERROR\n");
+               switch (qdonep->d3.host_stat) {
+               case QHSTA_NO_ERROR:
+                       if (qdonep->d3.scsi_stat == SAM_STAT_CHECK_CONDITION) {
+                               ASC_DBG(2,
+                                       "asc_isr_callback: SAM_STAT_CHECK_CONDITION\n");
+                               ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
+                                                 sizeof(scp->sense_buffer));
+                               /*
+                                * Note: The 'status_byte()' macro used by target drivers
+                                * defined in scsi.h shifts the status byte returned by
+                                * host drivers right by 1 bit. This is why target drivers
+                                * also use right shifted status byte definitions. For
+                                * instance target drivers use CHECK_CONDITION, defined to
+                                * 0x1, instead of the SCSI defined check condition value
+                                * of 0x2. Host drivers are supposed to return the status
+                                * byte as it is defined by SCSI.
+                                */
+                               scp->result = DRIVER_BYTE(DRIVER_SENSE) |
+                                   STATUS_BYTE(qdonep->d3.scsi_stat);
+                       } else {
+                               scp->result = STATUS_BYTE(qdonep->d3.scsi_stat);
+                       }
+                       break;
+
+               default:
+                       /* QHSTA error occurred */
+                       ASC_DBG1(1, "asc_isr_callback: host_stat 0x%x\n",
+                                qdonep->d3.host_stat);
+                       scp->result = HOST_BYTE(DID_BAD_TARGET);
+                       break;
+               }
+               break;
+
+       case QD_ABORTED_BY_HOST:
+               ASC_DBG(1, "asc_isr_callback: QD_ABORTED_BY_HOST\n");
+               scp->result =
+                   HOST_BYTE(DID_ABORT) | MSG_BYTE(qdonep->d3.
+                                                   scsi_msg) |
+                   STATUS_BYTE(qdonep->d3.scsi_stat);
+               break;
+
+       default:
+               ASC_DBG1(1, "asc_isr_callback: done_stat 0x%x\n",
+                        qdonep->d3.done_stat);
+               scp->result =
+                   HOST_BYTE(DID_ERROR) | MSG_BYTE(qdonep->d3.
+                                                   scsi_msg) |
+                   STATUS_BYTE(qdonep->d3.scsi_stat);
+               break;
+       }
 
-    /*
-     * 'qdonep' contains the command's ending status.
-     */
-    switch (qdonep->d3.done_stat) {
-    case QD_NO_ERROR:
-        ASC_DBG(2, "asc_isr_callback: QD_NO_ERROR\n");
-        scp->result = 0;
-
-        /*
-         * If an INQUIRY command completed successfully, then call
-         * the AscInquiryHandling() function to set-up the device.
-         */
-        if (scp->cmnd[0] == INQUIRY && scp->device->lun == 0 &&
-            (scp->request_bufflen - qdonep->remain_bytes) >= 8)
-        {
-            AscInquiryHandling(asc_dvc_varp, scp->device->id & 0x7,
-                (ASC_SCSI_INQUIRY *) scp->request_buffer);
-        }
-
-        /*
-         * Check for an underrun condition.
-         *
-         * If there was no error and an underrun condition, then
-         * then return the number of underrun bytes.
-         */
-        if (scp->request_bufflen != 0 && qdonep->remain_bytes != 0 &&
-            qdonep->remain_bytes <= scp->request_bufflen) {
-            ASC_DBG1(1, "asc_isr_callback: underrun condition %u bytes\n",
-            (unsigned) qdonep->remain_bytes);
-            scp->resid = qdonep->remain_bytes;
-        }
-        break;
-
-    case QD_WITH_ERROR:
-        ASC_DBG(2, "asc_isr_callback: QD_WITH_ERROR\n");
-        switch (qdonep->d3.host_stat) {
-        case QHSTA_NO_ERROR:
-            if (qdonep->d3.scsi_stat == SAM_STAT_CHECK_CONDITION) {
-                ASC_DBG(2, "asc_isr_callback: SAM_STAT_CHECK_CONDITION\n");
-                ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
-                    sizeof(scp->sense_buffer));
-                /*
-                 * Note: The 'status_byte()' macro used by target drivers
-                 * defined in scsi.h shifts the status byte returned by
-                 * host drivers right by 1 bit. This is why target drivers
-                 * also use right shifted status byte definitions. For
-                 * instance target drivers use CHECK_CONDITION, defined to
-                 * 0x1, instead of the SCSI defined check condition value
-                 * of 0x2. Host drivers are supposed to return the status
-                 * byte as it is defined by SCSI.
-                 */
-                scp->result = DRIVER_BYTE(DRIVER_SENSE) |
-                    STATUS_BYTE(qdonep->d3.scsi_stat);
-            } else {
-                scp->result = STATUS_BYTE(qdonep->d3.scsi_stat);
-            }
-            break;
-
-        default:
-            /* QHSTA error occurred */
-            ASC_DBG1(1, "asc_isr_callback: host_stat 0x%x\n",
-                qdonep->d3.host_stat);
-            scp->result = HOST_BYTE(DID_BAD_TARGET);
-            break;
-        }
-        break;
-
-    case QD_ABORTED_BY_HOST:
-        ASC_DBG(1, "asc_isr_callback: QD_ABORTED_BY_HOST\n");
-        scp->result = HOST_BYTE(DID_ABORT) | MSG_BYTE(qdonep->d3.scsi_msg) |
-                STATUS_BYTE(qdonep->d3.scsi_stat);
-        break;
-
-    default:
-        ASC_DBG1(1, "asc_isr_callback: done_stat 0x%x\n", qdonep->d3.done_stat);
-        scp->result = HOST_BYTE(DID_ERROR) | MSG_BYTE(qdonep->d3.scsi_msg) |
-                STATUS_BYTE(qdonep->d3.scsi_stat);
-        break;
-    }
+       /*
+        * If the 'init_tidmask' bit isn't already set for the target and the
+        * current request finished normally, then set the bit for the target
+        * to indicate that a device is present.
+        */
+       if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
+           qdonep->d3.done_stat == QD_NO_ERROR &&
+           qdonep->d3.host_stat == QHSTA_NO_ERROR) {
+               boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
+       }
 
-    /*
-     * If the 'init_tidmask' bit isn't already set for the target and the
-     * current request finished normally, then set the bit for the target
-     * to indicate that a device is present.
-     */
-    if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
-        qdonep->d3.done_stat == QD_NO_ERROR &&
-        qdonep->d3.host_stat == QHSTA_NO_ERROR) {
-        boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
-    }
+       /*
+        * Because interrupts may be enabled by the 'struct scsi_cmnd' done
+        * function, add the command to the end of the board's done queue.
+        * The done function for the command will be called from
+        * advansys_interrupt().
+        */
+       asc_enqueue(&boardp->done, scp, ASC_BACK);
 
-    /*
-     * Because interrupts may be enabled by the 'struct scsi_cmnd' done
-     * function, add the command to the end of the board's done queue.
-     * The done function for the command will be called from
-     * advansys_interrupt().
-     */
-    asc_enqueue(&boardp->done, scp, ASC_BACK);
-
-    return;
+       return;
 }
 
 /*
@@ -6885,238 +5704,240 @@ asc_isr_callback(ASC_DVC_VAR *asc_dvc_varp, ASC_QDONE_INFO *qdonep)
  *
  * Callback function for the Wide SCSI Adv Library.
  */
-STATIC void
-adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp, ADV_SCSI_REQ_Q *scsiqp)
+static void adv_isr_callback(ADV_DVC_VAR *adv_dvc_varp, ADV_SCSI_REQ_Q *scsiqp)
 {
-    asc_board_t         *boardp;
-    adv_req_t           *reqp;
-    adv_sgblk_t         *sgblkp;
-    struct scsi_cmnd           *scp;
-    struct Scsi_Host    *shp;
-    int                 i;
-    ADV_DCNT            resid_cnt;
-
-
-    ASC_DBG2(1, "adv_isr_callback: adv_dvc_varp 0x%lx, scsiqp 0x%lx\n",
-        (ulong) adv_dvc_varp, (ulong) scsiqp);
-    ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
-
-    /*
-     * Get the adv_req_t structure for the command that has been
-     * completed. The adv_req_t structure actually contains the
-     * completed ADV_SCSI_REQ_Q structure.
-     */
-    reqp = (adv_req_t *) ADV_U32_TO_VADDR(scsiqp->srb_ptr);
-    ASC_DBG1(1, "adv_isr_callback: reqp 0x%lx\n", (ulong) reqp);
-    if (reqp == NULL) {
-        ASC_PRINT("adv_isr_callback: reqp is NULL\n");
-        return;
-    }
-
-    /*
-     * Get the struct scsi_cmnd structure and Scsi_Host structure for the
-     * command that has been completed.
-     *
-     * Note: The adv_req_t request structure and adv_sgblk_t structure,
-     * if any, are dropped, because a board structure pointer can not be
-     * determined.
-     */
-    scp = reqp->cmndp;
-    ASC_DBG1(1, "adv_isr_callback: scp 0x%lx\n", (ulong) scp);
-    if (scp == NULL) {
-        ASC_PRINT("adv_isr_callback: scp is NULL; adv_req_t dropped.\n");
-        return;
-    }
-    ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
-
-    /*
-     * If the request's host pointer is not valid, display a message
-     * and return.
-     */
-    shp = scp->device->host;
-    for (i = 0; i < asc_board_count; i++) {
-        if (asc_host[i] == shp) {
-            break;
-        }
-    }
-    /*
-     * Note: If the host structure is not found, the adv_req_t request
-     * structure and adv_sgblk_t structure, if any, is dropped.
-     */
-    if (i == asc_board_count) {
-        ASC_PRINT2(
-            "adv_isr_callback: scp 0x%lx has bad host pointer, host 0x%lx\n",
-            (ulong) scp, (ulong) shp);
-        return;
-    }
+       asc_board_t *boardp;
+       adv_req_t *reqp;
+       adv_sgblk_t *sgblkp;
+       struct scsi_cmnd *scp;
+       struct Scsi_Host *shost;
+       int i;
+       ADV_DCNT resid_cnt;
+
+       ASC_DBG2(1, "adv_isr_callback: adv_dvc_varp 0x%lx, scsiqp 0x%lx\n",
+                (ulong)adv_dvc_varp, (ulong)scsiqp);
+       ASC_DBG_PRT_ADV_SCSI_REQ_Q(2, scsiqp);
+
+       /*
+        * Get the adv_req_t structure for the command that has been
+        * completed. The adv_req_t structure actually contains the
+        * completed ADV_SCSI_REQ_Q structure.
+        */
+       reqp = (adv_req_t *)ADV_U32_TO_VADDR(scsiqp->srb_ptr);
+       ASC_DBG1(1, "adv_isr_callback: reqp 0x%lx\n", (ulong)reqp);
+       if (reqp == NULL) {
+               ASC_PRINT("adv_isr_callback: reqp is NULL\n");
+               return;
+       }
 
-    ASC_STATS(shp, callback);
-    ASC_DBG1(1, "adv_isr_callback: shp 0x%lx\n", (ulong) shp);
+       /*
+        * Get the struct scsi_cmnd structure and Scsi_Host structure for the
+        * command that has been completed.
+        *
+        * Note: The adv_req_t request structure and adv_sgblk_t structure,
+        * if any, are dropped, because a board structure pointer can not be
+        * determined.
+        */
+       scp = reqp->cmndp;
+       ASC_DBG1(1, "adv_isr_callback: scp 0x%lx\n", (ulong)scp);
+       if (scp == NULL) {
+               ASC_PRINT
+                   ("adv_isr_callback: scp is NULL; adv_req_t dropped.\n");
+               return;
+       }
+       ASC_DBG_PRT_CDB(2, scp->cmnd, scp->cmd_len);
+
+       /*
+        * If the request's host pointer is not valid, display a message
+        * and return.
+        */
+       shost = scp->device->host;
+       for (i = 0; i < asc_board_count; i++) {
+               if (asc_host[i] == shost) {
+                       break;
+               }
+       }
+       /*
+        * Note: If the host structure is not found, the adv_req_t request
+        * structure and adv_sgblk_t structure, if any, is dropped.
+        */
+       if (i == asc_board_count) {
+               ASC_PRINT2
+                   ("adv_isr_callback: scp 0x%lx has bad host pointer, host 0x%lx\n",
+                    (ulong)scp, (ulong)shost);
+               return;
+       }
 
-    /*
-     * If the request isn't found on the active queue, it may have been
-     * removed to handle a reset request. Display a message and return.
-     *
-     * Note: Because the structure may still be in use don't attempt
-     * to free the adv_req_t and adv_sgblk_t, if any, structures.
-     */
-    boardp = ASC_BOARDP(shp);
-    ASC_ASSERT(adv_dvc_varp == &boardp->dvc_var.adv_dvc_var);
-    if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
-        ASC_PRINT2(
-            "adv_isr_callback: board %d: scp 0x%lx not on active queue\n",
-            boardp->id, (ulong) scp);
-        return;
-    }
+       ASC_STATS(shost, callback);
+       ASC_DBG1(1, "adv_isr_callback: shost 0x%lx\n", (ulong)shost);
+
+       /*
+        * If the request isn't found on the active queue, it may have been
+        * removed to handle a reset request. Display a message and return.
+        *
+        * Note: Because the structure may still be in use don't attempt
+        * to free the adv_req_t and adv_sgblk_t, if any, structures.
+        */
+       boardp = ASC_BOARDP(shost);
+       ASC_ASSERT(adv_dvc_varp == &boardp->dvc_var.adv_dvc_var);
+       if (asc_rmqueue(&boardp->active, scp) == ASC_FALSE) {
+               ASC_PRINT2
+                   ("adv_isr_callback: board %d: scp 0x%lx not on active queue\n",
+                    boardp->id, (ulong)scp);
+               return;
+       }
 
-    /*
-     * 'done_status' contains the command's ending status.
-     */
-    switch (scsiqp->done_status) {
-    case QD_NO_ERROR:
-        ASC_DBG(2, "adv_isr_callback: QD_NO_ERROR\n");
-        scp->result = 0;
-
-        /*
-         * Check for an underrun condition.
-         *
-         * If there was no error and an underrun condition, then
-         * then return the number of underrun bytes.
-         */
-        resid_cnt = le32_to_cpu(scsiqp->data_cnt);
-        if (scp->request_bufflen != 0 && resid_cnt != 0 &&
-            resid_cnt <= scp->request_bufflen) {
-            ASC_DBG1(1, "adv_isr_callback: underrun condition %lu bytes\n",
-                (ulong) resid_cnt);
-            scp->resid = resid_cnt;
-        }
-        break;
-
-    case QD_WITH_ERROR:
-        ASC_DBG(2, "adv_isr_callback: QD_WITH_ERROR\n");
-        switch (scsiqp->host_status) {
-        case QHSTA_NO_ERROR:
-            if (scsiqp->scsi_status == SAM_STAT_CHECK_CONDITION) {
-                ASC_DBG(2, "adv_isr_callback: SAM_STAT_CHECK_CONDITION\n");
-                ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
-                    sizeof(scp->sense_buffer));
-                /*
-                 * Note: The 'status_byte()' macro used by target drivers
-                 * defined in scsi.h shifts the status byte returned by
-                 * host drivers right by 1 bit. This is why target drivers
-                 * also use right shifted status byte definitions. For
-                 * instance target drivers use CHECK_CONDITION, defined to
-                 * 0x1, instead of the SCSI defined check condition value
-                 * of 0x2. Host drivers are supposed to return the status
-                 * byte as it is defined by SCSI.
-                 */
-                scp->result = DRIVER_BYTE(DRIVER_SENSE) |
-                    STATUS_BYTE(scsiqp->scsi_status);
-            } else {
-                scp->result = STATUS_BYTE(scsiqp->scsi_status);
-            }
-            break;
-
-        default:
-            /* Some other QHSTA error occurred. */
-            ASC_DBG1(1, "adv_isr_callback: host_status 0x%x\n",
-                scsiqp->host_status);
-            scp->result = HOST_BYTE(DID_BAD_TARGET);
-            break;
-        }
-        break;
-
-    case QD_ABORTED_BY_HOST:
-        ASC_DBG(1, "adv_isr_callback: QD_ABORTED_BY_HOST\n");
-        scp->result = HOST_BYTE(DID_ABORT) | STATUS_BYTE(scsiqp->scsi_status);
-        break;
-
-    default:
-        ASC_DBG1(1, "adv_isr_callback: done_status 0x%x\n", scsiqp->done_status);
-        scp->result = HOST_BYTE(DID_ERROR) | STATUS_BYTE(scsiqp->scsi_status);
-        break;
-    }
+       /*
+        * 'done_status' contains the command's ending status.
+        */
+       switch (scsiqp->done_status) {
+       case QD_NO_ERROR:
+               ASC_DBG(2, "adv_isr_callback: QD_NO_ERROR\n");
+               scp->result = 0;
 
-    /*
-     * If the 'init_tidmask' bit isn't already set for the target and the
-     * current request finished normally, then set the bit for the target
-     * to indicate that a device is present.
-     */
-    if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
-        scsiqp->done_status == QD_NO_ERROR &&
-        scsiqp->host_status == QHSTA_NO_ERROR) {
-        boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
-    }
+               /*
+                * Check for an underrun condition.
+                *
+                * If there was no error and an underrun condition, then
+                * then return the number of underrun bytes.
+                */
+               resid_cnt = le32_to_cpu(scsiqp->data_cnt);
+               if (scp->request_bufflen != 0 && resid_cnt != 0 &&
+                   resid_cnt <= scp->request_bufflen) {
+                       ASC_DBG1(1,
+                                "adv_isr_callback: underrun condition %lu bytes\n",
+                                (ulong)resid_cnt);
+                       scp->resid = resid_cnt;
+               }
+               break;
+
+       case QD_WITH_ERROR:
+               ASC_DBG(2, "adv_isr_callback: QD_WITH_ERROR\n");
+               switch (scsiqp->host_status) {
+               case QHSTA_NO_ERROR:
+                       if (scsiqp->scsi_status == SAM_STAT_CHECK_CONDITION) {
+                               ASC_DBG(2,
+                                       "adv_isr_callback: SAM_STAT_CHECK_CONDITION\n");
+                               ASC_DBG_PRT_SENSE(2, scp->sense_buffer,
+                                                 sizeof(scp->sense_buffer));
+                               /*
+                                * Note: The 'status_byte()' macro used by target drivers
+                                * defined in scsi.h shifts the status byte returned by
+                                * host drivers right by 1 bit. This is why target drivers
+                                * also use right shifted status byte definitions. For
+                                * instance target drivers use CHECK_CONDITION, defined to
+                                * 0x1, instead of the SCSI defined check condition value
+                                * of 0x2. Host drivers are supposed to return the status
+                                * byte as it is defined by SCSI.
+                                */
+                               scp->result = DRIVER_BYTE(DRIVER_SENSE) |
+                                   STATUS_BYTE(scsiqp->scsi_status);
+                       } else {
+                               scp->result = STATUS_BYTE(scsiqp->scsi_status);
+                       }
+                       break;
+
+               default:
+                       /* Some other QHSTA error occurred. */
+                       ASC_DBG1(1, "adv_isr_callback: host_status 0x%x\n",
+                                scsiqp->host_status);
+                       scp->result = HOST_BYTE(DID_BAD_TARGET);
+                       break;
+               }
+               break;
+
+       case QD_ABORTED_BY_HOST:
+               ASC_DBG(1, "adv_isr_callback: QD_ABORTED_BY_HOST\n");
+               scp->result =
+                   HOST_BYTE(DID_ABORT) | STATUS_BYTE(scsiqp->scsi_status);
+               break;
+
+       default:
+               ASC_DBG1(1, "adv_isr_callback: done_status 0x%x\n",
+                        scsiqp->done_status);
+               scp->result =
+                   HOST_BYTE(DID_ERROR) | STATUS_BYTE(scsiqp->scsi_status);
+               break;
+       }
 
-    /*
-     * Because interrupts may be enabled by the 'struct scsi_cmnd' done
-     * function, add the command to the end of the board's done queue.
-     * The done function for the command will be called from
-     * advansys_interrupt().
-     */
-    asc_enqueue(&boardp->done, scp, ASC_BACK);
+       /*
+        * If the 'init_tidmask' bit isn't already set for the target and the
+        * current request finished normally, then set the bit for the target
+        * to indicate that a device is present.
+        */
+       if ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(scp->device->id)) == 0 &&
+           scsiqp->done_status == QD_NO_ERROR &&
+           scsiqp->host_status == QHSTA_NO_ERROR) {
+               boardp->init_tidmask |= ADV_TID_TO_TIDMASK(scp->device->id);
+       }
 
-    /*
-     * Free all 'adv_sgblk_t' structures allocated for the request.
-     */
-    while ((sgblkp = reqp->sgblkp) != NULL)
-    {
-        /* Remove 'sgblkp' from the request list. */
-        reqp->sgblkp = sgblkp->next_sgblkp;
-
-        /* Add 'sgblkp' to the board free list. */
-        sgblkp->next_sgblkp = boardp->adv_sgblkp;
-        boardp->adv_sgblkp = sgblkp;
-    }
+       /*
+        * Because interrupts may be enabled by the 'struct scsi_cmnd' done
+        * function, add the command to the end of the board's done queue.
+        * The done function for the command will be called from
+        * advansys_interrupt().
+        */
+       asc_enqueue(&boardp->done, scp, ASC_BACK);
+
+       /*
+        * Free all 'adv_sgblk_t' structures allocated for the request.
+        */
+       while ((sgblkp = reqp->sgblkp) != NULL) {
+               /* Remove 'sgblkp' from the request list. */
+               reqp->sgblkp = sgblkp->next_sgblkp;
+
+               /* Add 'sgblkp' to the board free list. */
+               sgblkp->next_sgblkp = boardp->adv_sgblkp;
+               boardp->adv_sgblkp = sgblkp;
+       }
 
-    /*
-     * Free the adv_req_t structure used with the command by adding
-     * it back to the board free list.
-     */
-    reqp->next_reqp = boardp->adv_reqp;
-    boardp->adv_reqp = reqp;
+       /*
+        * Free the adv_req_t structure used with the command by adding
+        * it back to the board free list.
+        */
+       reqp->next_reqp = boardp->adv_reqp;
+       boardp->adv_reqp = reqp;
 
-    ASC_DBG(1, "adv_isr_callback: done\n");
+       ASC_DBG(1, "adv_isr_callback: done\n");
 
-    return;
+       return;
 }
 
 /*
  * adv_async_callback() - Adv Library asynchronous event callback function.
  */
-STATIC void
-adv_async_callback(ADV_DVC_VAR *adv_dvc_varp, uchar code)
+static void adv_async_callback(ADV_DVC_VAR *adv_dvc_varp, uchar code)
 {
-    switch (code)
-    {
-    case ADV_ASYNC_SCSI_BUS_RESET_DET:
-        /*
-         * The firmware detected a SCSI Bus reset.
-         */
-        ASC_DBG(0, "adv_async_callback: ADV_ASYNC_SCSI_BUS_RESET_DET\n");
-        break;
-
-    case ADV_ASYNC_RDMA_FAILURE:
-        /*
-         * Handle RDMA failure by resetting the SCSI Bus and
-         * possibly the chip if it is unresponsive. Log the error
-         * with a unique code.
-         */
-        ASC_DBG(0, "adv_async_callback: ADV_ASYNC_RDMA_FAILURE\n");
-        AdvResetChipAndSB(adv_dvc_varp);
-        break;
-
-    case ADV_HOST_SCSI_BUS_RESET:
-        /*
-         * Host generated SCSI bus reset occurred.
-         */
-        ASC_DBG(0, "adv_async_callback: ADV_HOST_SCSI_BUS_RESET\n");
-        break;
-
-    default:
-        ASC_DBG1(0, "DvcAsyncCallBack: unknown code 0x%x\n", code);
-        break;
-    }
+       switch (code) {
+       case ADV_ASYNC_SCSI_BUS_RESET_DET:
+               /*
+                * The firmware detected a SCSI Bus reset.
+                */
+               ASC_DBG(0,
+                       "adv_async_callback: ADV_ASYNC_SCSI_BUS_RESET_DET\n");
+               break;
+
+       case ADV_ASYNC_RDMA_FAILURE:
+               /*
+                * Handle RDMA failure by resetting the SCSI Bus and
+                * possibly the chip if it is unresponsive. Log the error
+                * with a unique code.
+                */
+               ASC_DBG(0, "adv_async_callback: ADV_ASYNC_RDMA_FAILURE\n");
+               AdvResetChipAndSB(adv_dvc_varp);
+               break;
+
+       case ADV_HOST_SCSI_BUS_RESET:
+               /*
+                * Host generated SCSI bus reset occurred.
+                */
+               ASC_DBG(0, "adv_async_callback: ADV_HOST_SCSI_BUS_RESET\n");
+               break;
+
+       default:
+               ASC_DBG1(0, "DvcAsyncCallBack: unknown code 0x%x\n", code);
+               break;
+       }
 }
 
 /*
@@ -7127,50 +5948,50 @@ adv_async_callback(ADV_DVC_VAR *adv_dvc_varp, uchar code)
  *
  * 'REQPNEXT(reqp)' returns reqp's next pointer.
  */
-STATIC void
-asc_enqueue(asc_queue_t *ascq, REQP reqp, int flag)
+static void asc_enqueue(asc_queue_t *ascq, REQP reqp, int flag)
 {
-    int        tid;
-
-    ASC_DBG3(3, "asc_enqueue: ascq 0x%lx, reqp 0x%lx, flag %d\n",
-        (ulong) ascq, (ulong) reqp, flag);
-    ASC_ASSERT(reqp != NULL);
-    ASC_ASSERT(flag == ASC_FRONT || flag == ASC_BACK);
-    tid = REQPTID(reqp);
-    ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
-    if (flag == ASC_FRONT) {
-        reqp->host_scribble = (unsigned char *)ascq->q_first[tid];
-        ascq->q_first[tid] = reqp;
-        /* If the queue was empty, set the last pointer. */
-        if (ascq->q_last[tid] == NULL) {
-            ascq->q_last[tid] = reqp;
-        }
-    } else { /* ASC_BACK */
-        if (ascq->q_last[tid] != NULL) {
-            ascq->q_last[tid]->host_scribble = (unsigned char *)reqp;
-        }
-        ascq->q_last[tid] = reqp;
-        reqp->host_scribble = NULL;
-        /* If the queue was empty, set the first pointer. */
-        if (ascq->q_first[tid] == NULL) {
-            ascq->q_first[tid] = reqp;
-        }
-    }
-    /* The queue has at least one entry, set its bit. */
-    ascq->q_tidmask |= ADV_TID_TO_TIDMASK(tid);
+       int tid;
+
+       ASC_DBG3(3, "asc_enqueue: ascq 0x%lx, reqp 0x%lx, flag %d\n",
+                (ulong)ascq, (ulong)reqp, flag);
+       ASC_ASSERT(reqp != NULL);
+       ASC_ASSERT(flag == ASC_FRONT || flag == ASC_BACK);
+       tid = REQPTID(reqp);
+       ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
+       if (flag == ASC_FRONT) {
+               reqp->host_scribble = (unsigned char *)ascq->q_first[tid];
+               ascq->q_first[tid] = reqp;
+               /* If the queue was empty, set the last pointer. */
+               if (ascq->q_last[tid] == NULL) {
+                       ascq->q_last[tid] = reqp;
+               }
+       } else {                /* ASC_BACK */
+               if (ascq->q_last[tid] != NULL) {
+                       ascq->q_last[tid]->host_scribble =
+                           (unsigned char *)reqp;
+               }
+               ascq->q_last[tid] = reqp;
+               reqp->host_scribble = NULL;
+               /* If the queue was empty, set the first pointer. */
+               if (ascq->q_first[tid] == NULL) {
+                       ascq->q_first[tid] = reqp;
+               }
+       }
+       /* The queue has at least one entry, set its bit. */
+       ascq->q_tidmask |= ADV_TID_TO_TIDMASK(tid);
 #ifdef ADVANSYS_STATS
-    /* Maintain request queue statistics. */
-    ascq->q_tot_cnt[tid]++;
-    ascq->q_cur_cnt[tid]++;
-    if (ascq->q_cur_cnt[tid] > ascq->q_max_cnt[tid]) {
-        ascq->q_max_cnt[tid] = ascq->q_cur_cnt[tid];
-        ASC_DBG2(2, "asc_enqueue: new q_max_cnt[%d] %d\n",
-            tid, ascq->q_max_cnt[tid]);
-    }
-    REQPTIME(reqp) = REQTIMESTAMP();
+       /* Maintain request queue statistics. */
+       ascq->q_tot_cnt[tid]++;
+       ascq->q_cur_cnt[tid]++;
+       if (ascq->q_cur_cnt[tid] > ascq->q_max_cnt[tid]) {
+               ascq->q_max_cnt[tid] = ascq->q_cur_cnt[tid];
+               ASC_DBG2(2, "asc_enqueue: new q_max_cnt[%d] %d\n",
+                        tid, ascq->q_max_cnt[tid]);
+       }
+       REQPTIME(reqp) = REQTIMESTAMP();
 #endif /* ADVANSYS_STATS */
-    ASC_DBG1(3, "asc_enqueue: reqp 0x%lx\n", (ulong) reqp);
-    return;
+       ASC_DBG1(3, "asc_enqueue: reqp 0x%lx\n", (ulong)reqp);
+       return;
 }
 
 /*
@@ -7180,31 +6001,30 @@ asc_enqueue(asc_queue_t *ascq, REQP reqp, int flag)
  *
  * 'REQPNEXT(reqp)' returns reqp's next pointer.
  */
-STATIC REQP
-asc_dequeue(asc_queue_t *ascq, int tid)
+static REQP asc_dequeue(asc_queue_t *ascq, int tid)
 {
-    REQP    reqp;
-
-    ASC_DBG2(3, "asc_dequeue: ascq 0x%lx, tid %d\n", (ulong) ascq, tid);
-    ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
-    if ((reqp = ascq->q_first[tid]) != NULL) {
-        ASC_ASSERT(ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid));
-        ascq->q_first[tid] = REQPNEXT(reqp);
-        /* If the queue is empty, clear its bit and the last pointer. */
-        if (ascq->q_first[tid] == NULL) {
-            ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
-            ASC_ASSERT(ascq->q_last[tid] == reqp);
-            ascq->q_last[tid] = NULL;
-        }
+       REQP reqp;
+
+       ASC_DBG2(3, "asc_dequeue: ascq 0x%lx, tid %d\n", (ulong)ascq, tid);
+       ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
+       if ((reqp = ascq->q_first[tid]) != NULL) {
+               ASC_ASSERT(ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid));
+               ascq->q_first[tid] = REQPNEXT(reqp);
+               /* If the queue is empty, clear its bit and the last pointer. */
+               if (ascq->q_first[tid] == NULL) {
+                       ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
+                       ASC_ASSERT(ascq->q_last[tid] == reqp);
+                       ascq->q_last[tid] = NULL;
+               }
 #ifdef ADVANSYS_STATS
-        /* Maintain request queue statistics. */
-        ascq->q_cur_cnt[tid]--;
-        ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
-        REQTIMESTAT("asc_dequeue", ascq, reqp, tid);
+               /* Maintain request queue statistics. */
+               ascq->q_cur_cnt[tid]--;
+               ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
+               REQTIMESTAT("asc_dequeue", ascq, reqp, tid);
 #endif /* ADVANSYS_STATS */
-    }
-    ASC_DBG1(3, "asc_dequeue: reqp 0x%lx\n", (ulong) reqp);
-    return reqp;
+       }
+       ASC_DBG1(3, "asc_dequeue: reqp 0x%lx\n", (ulong)reqp);
+       return reqp;
 }
 
 /*
@@ -7227,74 +6047,76 @@ asc_dequeue(asc_queue_t *ascq, int tid)
  * Unfortunately collecting queuing time statistics adds overhead to
  * the function that isn't inherent to the function's algorithm.
  */
-STATIC REQP
-asc_dequeue_list(asc_queue_t *ascq, REQP *lastpp, int tid)
+static REQP asc_dequeue_list(asc_queue_t *ascq, REQP *lastpp, int tid)
 {
-    REQP    firstp, lastp;
-    int     i;
-
-    ASC_DBG2(3, "asc_dequeue_list: ascq 0x%lx, tid %d\n", (ulong) ascq, tid);
-    ASC_ASSERT((tid == ASC_TID_ALL) || (tid >= 0 && tid <= ADV_MAX_TID));
-
-    /*
-     * If 'tid' is not ASC_TID_ALL, return requests only for
-     * the specified 'tid'. If 'tid' is ASC_TID_ALL, return all
-     * requests for all tids.
-     */
-    if (tid != ASC_TID_ALL) {
-        /* Return all requests for the specified 'tid'. */
-        if ((ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid)) == 0) {
-            /* List is empty; Set first and last return pointers to NULL. */
-            firstp = lastp = NULL;
-        } else {
-            firstp = ascq->q_first[tid];
-            lastp = ascq->q_last[tid];
-            ascq->q_first[tid] = ascq->q_last[tid] = NULL;
-            ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
+       REQP firstp, lastp;
+       int i;
+
+       ASC_DBG2(3, "asc_dequeue_list: ascq 0x%lx, tid %d\n", (ulong)ascq, tid);
+       ASC_ASSERT((tid == ASC_TID_ALL) || (tid >= 0 && tid <= ADV_MAX_TID));
+
+       /*
+        * If 'tid' is not ASC_TID_ALL, return requests only for
+        * the specified 'tid'. If 'tid' is ASC_TID_ALL, return all
+        * requests for all tids.
+        */
+       if (tid != ASC_TID_ALL) {
+               /* Return all requests for the specified 'tid'. */
+               if ((ascq->q_tidmask & ADV_TID_TO_TIDMASK(tid)) == 0) {
+                       /* List is empty; Set first and last return pointers to NULL. */
+                       firstp = lastp = NULL;
+               } else {
+                       firstp = ascq->q_first[tid];
+                       lastp = ascq->q_last[tid];
+                       ascq->q_first[tid] = ascq->q_last[tid] = NULL;
+                       ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
 #ifdef ADVANSYS_STATS
-            {
-                REQP reqp;
-                ascq->q_cur_cnt[tid] = 0;
-                for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
-                    REQTIMESTAT("asc_dequeue_list", ascq, reqp, tid);
-                }
-            }
+                       {
+                               REQP reqp;
+                               ascq->q_cur_cnt[tid] = 0;
+                               for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
+                                       REQTIMESTAT("asc_dequeue_list", ascq,
+                                                   reqp, tid);
+                               }
+                       }
 #endif /* ADVANSYS_STATS */
-        }
-    } else {
-        /* Return all requests for all tids. */
-        firstp = lastp = NULL;
-        for (i = 0; i <= ADV_MAX_TID; i++) {
-            if (ascq->q_tidmask & ADV_TID_TO_TIDMASK(i)) {
-                if (firstp == NULL) {
-                    firstp = ascq->q_first[i];
-                    lastp = ascq->q_last[i];
-                } else {
-                    ASC_ASSERT(lastp != NULL);
-                    lastp->host_scribble = (unsigned char *)ascq->q_first[i];
-                    lastp = ascq->q_last[i];
-                }
-                ascq->q_first[i] = ascq->q_last[i] = NULL;
-                ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(i);
+               }
+       } else {
+               /* Return all requests for all tids. */
+               firstp = lastp = NULL;
+               for (i = 0; i <= ADV_MAX_TID; i++) {
+                       if (ascq->q_tidmask & ADV_TID_TO_TIDMASK(i)) {
+                               if (firstp == NULL) {
+                                       firstp = ascq->q_first[i];
+                                       lastp = ascq->q_last[i];
+                               } else {
+                                       ASC_ASSERT(lastp != NULL);
+                                       lastp->host_scribble =
+                                           (unsigned char *)ascq->q_first[i];
+                                       lastp = ascq->q_last[i];
+                               }
+                               ascq->q_first[i] = ascq->q_last[i] = NULL;
+                               ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(i);
 #ifdef ADVANSYS_STATS
-                ascq->q_cur_cnt[i] = 0;
+                               ascq->q_cur_cnt[i] = 0;
 #endif /* ADVANSYS_STATS */
-            }
-        }
+                       }
+               }
 #ifdef ADVANSYS_STATS
-        {
-            REQP reqp;
-            for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
-                REQTIMESTAT("asc_dequeue_list", ascq, reqp, reqp->device->id);
-            }
-        }
+               {
+                       REQP reqp;
+                       for (reqp = firstp; reqp; reqp = REQPNEXT(reqp)) {
+                               REQTIMESTAT("asc_dequeue_list", ascq, reqp,
+                                           reqp->device->id);
+                       }
+               }
 #endif /* ADVANSYS_STATS */
-    }
-    if (lastpp) {
-        *lastpp = lastp;
-    }
-    ASC_DBG1(3, "asc_dequeue_list: firstp 0x%lx\n", (ulong) firstp);
-    return firstp;
+       }
+       if (lastpp) {
+               *lastpp = lastp;
+       }
+       ASC_DBG1(3, "asc_dequeue_list: firstp 0x%lx\n", (ulong)firstp);
+       return firstp;
 }
 
 /*
@@ -7307,67 +6129,67 @@ asc_dequeue_list(asc_queue_t *ascq, REQP *lastpp, int tid)
  * Return ASC_TRUE if the command was found and removed,
  * otherwise return ASC_FALSE.
  */
-STATIC int
-asc_rmqueue(asc_queue_t *ascq, REQP reqp)
+static int asc_rmqueue(asc_queue_t *ascq, REQP reqp)
 {
-    REQP        currp, prevp;
-    int         tid;
-    int         ret = ASC_FALSE;
-
-    ASC_DBG2(3, "asc_rmqueue: ascq 0x%lx, reqp 0x%lx\n",
-        (ulong) ascq, (ulong) reqp);
-    ASC_ASSERT(reqp != NULL);
-
-    tid = REQPTID(reqp);
-    ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
-
-    /*
-     * Handle the common case of 'reqp' being the first
-     * entry on the queue.
-     */
-    if (reqp == ascq->q_first[tid]) {
-        ret = ASC_TRUE;
-        ascq->q_first[tid] = REQPNEXT(reqp);
-        /* If the queue is now empty, clear its bit and the last pointer. */
-        if (ascq->q_first[tid] == NULL) {
-            ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
-            ASC_ASSERT(ascq->q_last[tid] == reqp);
-            ascq->q_last[tid] = NULL;
-        }
-    } else if (ascq->q_first[tid] != NULL) {
-        ASC_ASSERT(ascq->q_last[tid] != NULL);
-        /*
-         * Because the case of 'reqp' being the first entry has been
-         * handled above and it is known the queue is not empty, if
-         * 'reqp' is found on the queue it is guaranteed the queue will
-         * not become empty and that 'q_first[tid]' will not be changed.
-         *
-         * Set 'prevp' to the first entry, 'currp' to the second entry,
-         * and search for 'reqp'.
-         */
-        for (prevp = ascq->q_first[tid], currp = REQPNEXT(prevp);
-             currp; prevp = currp, currp = REQPNEXT(currp)) {
-            if (currp == reqp) {
-                ret = ASC_TRUE;
-                prevp->host_scribble = (unsigned char *)REQPNEXT(currp);
-                reqp->host_scribble = NULL;
-                if (ascq->q_last[tid] == reqp) {
-                    ascq->q_last[tid] = prevp;
-                }
-                break;
-            }
-        }
-    }
+       REQP currp, prevp;
+       int tid;
+       int ret = ASC_FALSE;
+
+       ASC_DBG2(3, "asc_rmqueue: ascq 0x%lx, reqp 0x%lx\n",
+                (ulong)ascq, (ulong)reqp);
+       ASC_ASSERT(reqp != NULL);
+
+       tid = REQPTID(reqp);
+       ASC_ASSERT(tid >= 0 && tid <= ADV_MAX_TID);
+
+       /*
+        * Handle the common case of 'reqp' being the first
+        * entry on the queue.
+        */
+       if (reqp == ascq->q_first[tid]) {
+               ret = ASC_TRUE;
+               ascq->q_first[tid] = REQPNEXT(reqp);
+               /* If the queue is now empty, clear its bit and the last pointer. */
+               if (ascq->q_first[tid] == NULL) {
+                       ascq->q_tidmask &= ~ADV_TID_TO_TIDMASK(tid);
+                       ASC_ASSERT(ascq->q_last[tid] == reqp);
+                       ascq->q_last[tid] = NULL;
+               }
+       } else if (ascq->q_first[tid] != NULL) {
+               ASC_ASSERT(ascq->q_last[tid] != NULL);
+               /*
+                * Because the case of 'reqp' being the first entry has been
+                * handled above and it is known the queue is not empty, if
+                * 'reqp' is found on the queue it is guaranteed the queue will
+                * not become empty and that 'q_first[tid]' will not be changed.
+                *
+                * Set 'prevp' to the first entry, 'currp' to the second entry,
+                * and search for 'reqp'.
+                */
+               for (prevp = ascq->q_first[tid], currp = REQPNEXT(prevp);
+                    currp; prevp = currp, currp = REQPNEXT(currp)) {
+                       if (currp == reqp) {
+                               ret = ASC_TRUE;
+                               prevp->host_scribble =
+                                   (unsigned char *)REQPNEXT(currp);
+                               reqp->host_scribble = NULL;
+                               if (ascq->q_last[tid] == reqp) {
+                                       ascq->q_last[tid] = prevp;
+                               }
+                               break;
+                       }
+               }
+       }
 #ifdef ADVANSYS_STATS
-    /* Maintain request queue statistics. */
-    if (ret == ASC_TRUE) {
-        ascq->q_cur_cnt[tid]--;
-        REQTIMESTAT("asc_rmqueue", ascq, reqp, tid);
-    }
-    ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
+       /* Maintain request queue statistics. */
+       if (ret == ASC_TRUE) {
+               ascq->q_cur_cnt[tid]--;
+               REQTIMESTAT("asc_rmqueue", ascq, reqp, tid);
+       }
+       ASC_ASSERT(ascq->q_cur_cnt[tid] >= 0);
 #endif /* ADVANSYS_STATS */
-    ASC_DBG2(3, "asc_rmqueue: reqp 0x%lx, ret %d\n", (ulong) reqp, ret);
-    return ret;
+       ASC_DBG2(3, "asc_rmqueue: reqp 0x%lx, ret %d\n", (ulong)reqp, ret);
+       return ret;
 }
 
 /*
@@ -7375,37 +6197,38 @@ asc_rmqueue(asc_queue_t *ascq, REQP reqp)
  *
  * Calls asc_execute_scsi_cmnd() to execute a REQP/struct scsi_cmnd.
  */
-STATIC void
-asc_execute_queue(asc_queue_t *ascq)
+static void asc_execute_queue(asc_queue_t *ascq)
 {
-    ADV_SCSI_BIT_ID_TYPE    scan_tidmask;
-    REQP                    reqp;
-    int                     i;
-
-    ASC_DBG1(1, "asc_execute_queue: ascq 0x%lx\n", (ulong) ascq);
-    /*
-     * Execute queued commands for devices attached to
-     * the current board in round-robin fashion.
-     */
-    scan_tidmask = ascq->q_tidmask;
-    do {
-        for (i = 0; i <= ADV_MAX_TID; i++) {
-            if (scan_tidmask & ADV_TID_TO_TIDMASK(i)) {
-                if ((reqp = asc_dequeue(ascq, i)) == NULL) {
-                    scan_tidmask &= ~ADV_TID_TO_TIDMASK(i);
-                } else if (asc_execute_scsi_cmnd((struct scsi_cmnd *) reqp)
-                            == ASC_BUSY) {
-                    scan_tidmask &= ~ADV_TID_TO_TIDMASK(i);
-                    /*
-                     * The request returned ASC_BUSY. Enqueue at the front of
-                     * target's waiting list to maintain correct ordering.
-                     */
-                    asc_enqueue(ascq, reqp, ASC_FRONT);
-                }
-            }
-        }
-    } while (scan_tidmask);
-    return;
+       ADV_SCSI_BIT_ID_TYPE scan_tidmask;
+       REQP reqp;
+       int i;
+
+       ASC_DBG1(1, "asc_execute_queue: ascq 0x%lx\n", (ulong)ascq);
+       /*
+        * Execute queued commands for devices attached to
+        * the current board in round-robin fashion.
+        */
+       scan_tidmask = ascq->q_tidmask;
+       do {
+               for (i = 0; i <= ADV_MAX_TID; i++) {
+                       if (scan_tidmask & ADV_TID_TO_TIDMASK(i)) {
+                               if ((reqp = asc_dequeue(ascq, i)) == NULL) {
+                                       scan_tidmask &= ~ADV_TID_TO_TIDMASK(i);
+                               } else
+                                   if (asc_execute_scsi_cmnd
+                                       ((struct scsi_cmnd *)reqp)
+                                       == ASC_BUSY) {
+                                       scan_tidmask &= ~ADV_TID_TO_TIDMASK(i);
+                                       /*
+                                        * The request returned ASC_BUSY. Enqueue at the front of
+                                        * target's waiting list to maintain correct ordering.
+                                        */
+                                       asc_enqueue(ascq, reqp, ASC_FRONT);
+                               }
+                       }
+               }
+       } while (scan_tidmask);
+       return;
 }
 
 #ifdef CONFIG_PROC_FS
@@ -7420,102 +6243,102 @@ asc_execute_queue(asc_queue_t *ascq)
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_board_devices(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t        *boardp;
-    int                leftlen;
-    int                totlen;
-    int                len;
-    int                chip_scsi_id;
-    int                i;
-
-    boardp = ASC_BOARDP(shp);
-    leftlen = cplen;
-    totlen = len = 0;
-
-    len = asc_prt_line(cp, leftlen,
-"\nDevice Information for AdvanSys SCSI Host %d:\n", shp->host_no);
-    ASC_PRT_NEXT();
-
-    if (ASC_NARROW_BOARD(boardp)) {
-        chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
-    } else {
-        chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
-    }
+       asc_board_t *boardp;
+       int leftlen;
+       int totlen;
+       int len;
+       int chip_scsi_id;
+       int i;
+
+       boardp = ASC_BOARDP(shost);
+       leftlen = cplen;
+       totlen = len = 0;
+
+       len = asc_prt_line(cp, leftlen,
+                          "\nDevice Information for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
+       } else {
+               chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
+       }
 
-    len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
-            len = asc_prt_line(cp, leftlen, " %X,", i);
-            ASC_PRT_NEXT();
-        }
-    }
-    len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id);
-    ASC_PRT_NEXT();
+       len = asc_prt_line(cp, leftlen, "Target IDs Detected:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) {
+                       len = asc_prt_line(cp, leftlen, " %X,", i);
+                       ASC_PRT_NEXT();
+               }
+       }
+       len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id);
+       ASC_PRT_NEXT();
 
-    return totlen;
+       return totlen;
 }
 
 /*
  * Display Wide Board BIOS Information.
  */
-STATIC int
-asc_prt_adv_bios(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t        *boardp;
-    int                leftlen;
-    int                totlen;
-    int                len;
-    ushort             major, minor, letter;
-
-    boardp = ASC_BOARDP(shp);
-    leftlen = cplen;
-    totlen = len = 0;
+       asc_board_t *boardp;
+       int leftlen;
+       int totlen;
+       int len;
+       ushort major, minor, letter;
+
+       boardp = ASC_BOARDP(shost);
+       leftlen = cplen;
+       totlen = len = 0;
+
+       len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
+       ASC_PRT_NEXT();
+
+       /*
+        * If the BIOS saved a valid signature, then fill in
+        * the BIOS code segment base address.
+        */
+       if (boardp->bios_signature != 0x55AA) {
+               len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n");
+               ASC_PRT_NEXT();
+               len = asc_prt_line(cp, leftlen,
+                                  "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
+               ASC_PRT_NEXT();
+               len = asc_prt_line(cp, leftlen,
+                                  "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
+               ASC_PRT_NEXT();
+       } else {
+               major = (boardp->bios_version >> 12) & 0xF;
+               minor = (boardp->bios_version >> 8) & 0xF;
+               letter = (boardp->bios_version & 0xFF);
 
-    len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
-    ASC_PRT_NEXT();
+               len = asc_prt_line(cp, leftlen, "%d.%d%c\n",
+                                  major, minor,
+                                  letter >= 26 ? '?' : letter + 'A');
+               ASC_PRT_NEXT();
 
-    /*
-     * If the BIOS saved a valid signature, then fill in
-     * the BIOS code segment base address.
-     */
-    if (boardp->bios_signature != 0x55AA) {
-        len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n");
-        ASC_PRT_NEXT();
-        len = asc_prt_line(cp, leftlen,
-"BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
-        ASC_PRT_NEXT();
-        len = asc_prt_line(cp, leftlen,
-"can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
-        ASC_PRT_NEXT();
-    } else {
-        major = (boardp->bios_version >> 12) & 0xF;
-        minor = (boardp->bios_version >> 8) & 0xF;
-        letter = (boardp->bios_version & 0xFF);
-
-        len = asc_prt_line(cp, leftlen, "%d.%d%c\n",
-            major, minor, letter >= 26 ? '?' : letter + 'A');
-        ASC_PRT_NEXT();
-
-        /*
-         * Current available ROM BIOS release is 3.1I for UW
-         * and 3.2I for U2W. This code doesn't differentiate
-         * UW and U2W boards.
-         */
-        if (major < 3 || (major <= 3 && minor < 1) ||
-            (major <= 3 && minor <= 1 && letter < ('I'- 'A'))) {
-            len = asc_prt_line(cp, leftlen,
-"Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
-            ASC_PRT_NEXT();
-            len = asc_prt_line(cp, leftlen,
-"ftp://ftp.connectcom.net/pub\n");
-            ASC_PRT_NEXT();
-        }
-    }
+               /*
+                * Current available ROM BIOS release is 3.1I for UW
+                * and 3.2I for U2W. This code doesn't differentiate
+                * UW and U2W boards.
+                */
+               if (major < 3 || (major <= 3 && minor < 1) ||
+                   (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) {
+                       len = asc_prt_line(cp, leftlen,
+                                          "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
+                       ASC_PRT_NEXT();
+                       len = asc_prt_line(cp, leftlen,
+                                          "ftp://ftp.connectcom.net/pub\n");
+                       ASC_PRT_NEXT();
+               }
+       }
 
-    return totlen;
+       return totlen;
 }
 
 /*
@@ -7541,80 +6364,79 @@ asc_prt_adv_bios(struct Scsi_Host *shp, char *cp, int cplen)
  *
  * Returns ASC_TRUE if serial number found, otherwise returns ASC_FALSE.
  */
-STATIC int
-asc_get_eeprom_string(ushort *serialnum, uchar *cp)
+static int asc_get_eeprom_string(ushort *serialnum, uchar *cp)
 {
-    ushort      w, num;
-
-    if ((serialnum[1] & 0xFE00) != ((ushort) 0xAA << 8)) {
-        return ASC_FALSE;
-    } else {
-        /*
-         * First word - 6 digits.
-         */
-        w = serialnum[0];
-
-        /* Product type - 1st digit. */
-        if ((*cp = 'A' + ((w & 0xE000) >> 13)) == 'H') {
-            /* Product type is P=Prototype */
-            *cp += 0x8;
-        }
-        cp++;
-
-        /* Manufacturing location - 2nd digit. */
-        *cp++ = 'A' + ((w & 0x1C00) >> 10);
-
-        /* Product ID - 3rd, 4th digits. */
-        num = w & 0x3FF;
-        *cp++ = '0' + (num / 100);
-        num %= 100;
-        *cp++ = '0' + (num / 10);
-
-        /* Product revision - 5th digit. */
-        *cp++ = 'A' + (num % 10);
-
-        /*
-         * Second word
-         */
-        w = serialnum[1];
-
-        /*
-         * Year - 6th digit.
-         *
-         * If bit 15 of third word is set, then the
-         * last digit of the year is greater than 7.
-         */
-        if (serialnum[2] & 0x8000) {
-            *cp++ = '8' + ((w & 0x1C0) >> 6);
-        } else {
-            *cp++ = '0' + ((w & 0x1C0) >> 6);
-        }
-
-        /* Week of year - 7th, 8th digits. */
-        num = w & 0x003F;
-        *cp++ = '0' + num / 10;
-        num %= 10;
-        *cp++ = '0' + num;
-
-        /*
-         * Third word
-         */
-        w = serialnum[2] & 0x7FFF;
-
-        /* Serial number - 9th digit. */
-        *cp++ = 'A' + (w / 1000);
-
-        /* 10th, 11th, 12th digits. */
-        num = w % 1000;
-        *cp++ = '0' + num / 100;
-        num %= 100;
-        *cp++ = '0' + num / 10;
-        num %= 10;
-        *cp++ = '0' + num;
-
-        *cp = '\0';     /* Null Terminate the string. */
-        return ASC_TRUE;
-    }
+       ushort w, num;
+
+       if ((serialnum[1] & 0xFE00) != ((ushort)0xAA << 8)) {
+               return ASC_FALSE;
+       } else {
+               /*
+                * First word - 6 digits.
+                */
+               w = serialnum[0];
+
+               /* Product type - 1st digit. */
+               if ((*cp = 'A' + ((w & 0xE000) >> 13)) == 'H') {
+                       /* Product type is P=Prototype */
+                       *cp += 0x8;
+               }
+               cp++;
+
+               /* Manufacturing location - 2nd digit. */
+               *cp++ = 'A' + ((w & 0x1C00) >> 10);
+
+               /* Product ID - 3rd, 4th digits. */
+               num = w & 0x3FF;
+               *cp++ = '0' + (num / 100);
+               num %= 100;
+               *cp++ = '0' + (num / 10);
+
+               /* Product revision - 5th digit. */
+               *cp++ = 'A' + (num % 10);
+
+               /*
+                * Second word
+                */
+               w = serialnum[1];
+
+               /*
+                * Year - 6th digit.
+                *
+                * If bit 15 of third word is set, then the
+                * last digit of the year is greater than 7.
+                */
+               if (serialnum[2] & 0x8000) {
+                       *cp++ = '8' + ((w & 0x1C0) >> 6);
+               } else {
+                       *cp++ = '0' + ((w & 0x1C0) >> 6);
+               }
+
+               /* Week of year - 7th, 8th digits. */
+               num = w & 0x003F;
+               *cp++ = '0' + num / 10;
+               num %= 10;
+               *cp++ = '0' + num;
+
+               /*
+                * Third word
+                */
+               w = serialnum[2] & 0x7FFF;
+
+               /* Serial number - 9th digit. */
+               *cp++ = 'A' + (w / 1000);
+
+               /* 10th, 11th, 12th digits. */
+               num = w % 1000;
+               *cp++ = '0' + num / 100;
+               num %= 100;
+               *cp++ = '0' + num / 10;
+               num %= 10;
+               *cp++ = '0' + num;
+
+               *cp = '\0';     /* Null Terminate the string. */
+               return ASC_TRUE;
+       }
 }
 
 /*
@@ -7628,122 +6450,127 @@ asc_get_eeprom_string(ushort *serialnum, uchar *cp)
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_asc_board_eeprom(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t        *boardp;
-    ASC_DVC_VAR        *asc_dvc_varp;
-    int                leftlen;
-    int                totlen;
-    int                len;
-    ASCEEP_CONFIG      *ep;
-    int                i;
+       asc_board_t *boardp;
+       ASC_DVC_VAR *asc_dvc_varp;
+       int leftlen;
+       int totlen;
+       int len;
+       ASCEEP_CONFIG *ep;
+       int i;
 #ifdef CONFIG_ISA
-    int                isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 };
+       int isa_dma_speed[] = { 10, 8, 7, 6, 5, 4, 3, 2 };
 #endif /* CONFIG_ISA */
-    uchar              serialstr[13];
-
-    boardp = ASC_BOARDP(shp);
-    asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
-    ep = &boardp->eep_config.asc_eep;
-
-    leftlen = cplen;
-    totlen = len = 0;
-
-    len = asc_prt_line(cp, leftlen,
-"\nEEPROM Settings for AdvanSys SCSI Host %d:\n", shp->host_no);
-    ASC_PRT_NEXT();
-
-    if (asc_get_eeprom_string((ushort *) &ep->adapter_info[0], serialstr) ==
-        ASC_TRUE) {
-        len = asc_prt_line(cp, leftlen, " Serial Number: %s\n", serialstr);
-        ASC_PRT_NEXT();
-    } else {
-        if (ep->adapter_info[5] == 0xBB) {
-            len = asc_prt_line(cp, leftlen,
-                " Default Settings Used for EEPROM-less Adapter.\n");
-            ASC_PRT_NEXT();
-        } else {
-            len = asc_prt_line(cp, leftlen,
-                " Serial Number Signature Not Present.\n");
-            ASC_PRT_NEXT();
-        }
-    }
+       uchar serialstr[13];
+
+       boardp = ASC_BOARDP(shost);
+       asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
+       ep = &boardp->eep_config.asc_eep;
+
+       leftlen = cplen;
+       totlen = len = 0;
+
+       len = asc_prt_line(cp, leftlen,
+                          "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
+
+       if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr)
+           == ASC_TRUE) {
+               len =
+                   asc_prt_line(cp, leftlen, " Serial Number: %s\n",
+                                serialstr);
+               ASC_PRT_NEXT();
+       } else {
+               if (ep->adapter_info[5] == 0xBB) {
+                       len = asc_prt_line(cp, leftlen,
+                                          " Default Settings Used for EEPROM-less Adapter.\n");
+                       ASC_PRT_NEXT();
+               } else {
+                       len = asc_prt_line(cp, leftlen,
+                                          " Serial Number Signature Not Present.\n");
+                       ASC_PRT_NEXT();
+               }
+       }
 
-    len = asc_prt_line(cp, leftlen,
-" Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-        ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng, ep->max_tag_qng);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" cntl 0x%x, no_scam 0x%x\n",
-        ep->cntl, ep->no_scam);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Target ID:           ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %d", i);
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Disconnects:         ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (ep->disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Command Queuing:     ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (ep->use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Start Motor:         ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (ep->start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Synchronous Transfer:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (ep->init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
+       len = asc_prt_line(cp, leftlen,
+                          " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                          ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
+                          ep->max_tag_qng);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Target ID:           ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %d", i);
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Disconnects:         ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (ep->
+                                   disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (ep->
+                                   use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Start Motor:         ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (ep->
+                                   start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (ep->
+                                   init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
 
 #ifdef CONFIG_ISA
-    if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
-        len = asc_prt_line(cp, leftlen,
-" Host ISA DMA speed:   %d MB/S\n",
-            isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
-        ASC_PRT_NEXT();
-    }
+       if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
+               len = asc_prt_line(cp, leftlen,
+                                  " Host ISA DMA speed:   %d MB/S\n",
+                                  isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
+               ASC_PRT_NEXT();
+       }
 #endif /* CONFIG_ISA */
 
-     return totlen;
+       return totlen;
 }
 
 /*
@@ -7757,365 +6584,347 @@ asc_prt_asc_board_eeprom(struct Scsi_Host *shp, char *cp, int cplen)
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_adv_board_eeprom(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t                 *boardp;
-    ADV_DVC_VAR                 *adv_dvc_varp;
-    int                         leftlen;
-    int                         totlen;
-    int                         len;
-    int                         i;
-    char                        *termstr;
-    uchar                       serialstr[13];
-    ADVEEP_3550_CONFIG          *ep_3550 = NULL;
-    ADVEEP_38C0800_CONFIG       *ep_38C0800 = NULL;
-    ADVEEP_38C1600_CONFIG       *ep_38C1600 = NULL;
-    ushort                      word;
-    ushort                      *wordp;
-    ushort                      sdtr_speed = 0;
-
-    boardp = ASC_BOARDP(shp);
-    adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        ep_3550 = &boardp->eep_config.adv_3550_eep;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
-    } else
-    {
-        ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
-    }
+       asc_board_t *boardp;
+       ADV_DVC_VAR *adv_dvc_varp;
+       int leftlen;
+       int totlen;
+       int len;
+       int i;
+       char *termstr;
+       uchar serialstr[13];
+       ADVEEP_3550_CONFIG *ep_3550 = NULL;
+       ADVEEP_38C0800_CONFIG *ep_38C0800 = NULL;
+       ADVEEP_38C1600_CONFIG *ep_38C1600 = NULL;
+       ushort word;
+       ushort *wordp;
+       ushort sdtr_speed = 0;
+
+       boardp = ASC_BOARDP(shost);
+       adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               ep_3550 = &boardp->eep_config.adv_3550_eep;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
+       } else {
+               ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
+       }
 
-    leftlen = cplen;
-    totlen = len = 0;
-
-    len = asc_prt_line(cp, leftlen,
-"\nEEPROM Settings for AdvanSys SCSI Host %d:\n", shp->host_no);
-    ASC_PRT_NEXT();
-
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        wordp = &ep_3550->serial_number_word1;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        wordp = &ep_38C0800->serial_number_word1;
-    } else
-    {
-        wordp = &ep_38C1600->serial_number_word1;
-    }
+       leftlen = cplen;
+       totlen = len = 0;
 
-    if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
-        len = asc_prt_line(cp, leftlen, " Serial Number: %s\n", serialstr);
-        ASC_PRT_NEXT();
-    } else {
-        len = asc_prt_line(cp, leftlen,
-            " Serial Number Signature Not Present.\n");
-        ASC_PRT_NEXT();
-    }
+       len = asc_prt_line(cp, leftlen,
+                          "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
 
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        len = asc_prt_line(cp, leftlen,
-" Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-            ep_3550->adapter_scsi_id, ep_3550->max_host_qng,
-            ep_3550->max_dvc_qng);
-        ASC_PRT_NEXT();
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        len = asc_prt_line(cp, leftlen,
-" Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-            ep_38C0800->adapter_scsi_id, ep_38C0800->max_host_qng,
-            ep_38C0800->max_dvc_qng);
-        ASC_PRT_NEXT();
-    } else
-    {
-        len = asc_prt_line(cp, leftlen,
-" Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
-            ep_38C1600->adapter_scsi_id, ep_38C1600->max_host_qng,
-            ep_38C1600->max_dvc_qng);
-        ASC_PRT_NEXT();
-    }
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        word = ep_3550->termination;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        word = ep_38C0800->termination_lvd;
-    } else
-    {
-        word = ep_38C1600->termination_lvd;
-    }
-    switch (word) {
-        case 1:
-            termstr = "Low Off/High Off";
-            break;
-        case 2:
-            termstr = "Low Off/High On";
-            break;
-        case 3:
-            termstr = "Low On/High On";
-            break;
-        default:
-        case 0:
-            termstr = "Automatic";
-            break;
-    }
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               wordp = &ep_3550->serial_number_word1;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               wordp = &ep_38C0800->serial_number_word1;
+       } else {
+               wordp = &ep_38C1600->serial_number_word1;
+       }
 
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        len = asc_prt_line(cp, leftlen,
-" termination: %u (%s), bios_ctrl: 0x%x\n",
-            ep_3550->termination, termstr, ep_3550->bios_ctrl);
-        ASC_PRT_NEXT();
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        len = asc_prt_line(cp, leftlen,
-" termination: %u (%s), bios_ctrl: 0x%x\n",
-            ep_38C0800->termination_lvd, termstr, ep_38C0800->bios_ctrl);
-        ASC_PRT_NEXT();
-    } else
-    {
-        len = asc_prt_line(cp, leftlen,
-" termination: %u (%s), bios_ctrl: 0x%x\n",
-            ep_38C1600->termination_lvd, termstr, ep_38C1600->bios_ctrl);
-        ASC_PRT_NEXT();
-    }
+       if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) {
+               len =
+                   asc_prt_line(cp, leftlen, " Serial Number: %s\n",
+                                serialstr);
+               ASC_PRT_NEXT();
+       } else {
+               len = asc_prt_line(cp, leftlen,
+                                  " Serial Number Signature Not Present.\n");
+               ASC_PRT_NEXT();
+       }
 
-    len = asc_prt_line(cp, leftlen,
-" Target ID:           ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %X", i);
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        word = ep_3550->disc_enable;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        word = ep_38C0800->disc_enable;
-    } else
-    {
-        word = ep_38C1600->disc_enable;
-    }
-    len = asc_prt_line(cp, leftlen,
-" Disconnects:         ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        word = ep_3550->tagqng_able;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        word = ep_38C0800->tagqng_able;
-    } else
-    {
-        word = ep_38C1600->tagqng_able;
-    }
-    len = asc_prt_line(cp, leftlen,
-" Command Queuing:     ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        word = ep_3550->start_motor;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        word = ep_38C0800->start_motor;
-    } else
-    {
-        word = ep_38C1600->start_motor;
-    }
-    len = asc_prt_line(cp, leftlen,
-" Start Motor:         ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        len = asc_prt_line(cp, leftlen,
-" Synchronous Transfer:");
-        ASC_PRT_NEXT();
-        for (i = 0; i <= ADV_MAX_TID; i++) {
-            len = asc_prt_line(cp, leftlen, " %c",
-                (ep_3550->sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-            ASC_PRT_NEXT();
-        }
-        len = asc_prt_line(cp, leftlen, "\n");
-        ASC_PRT_NEXT();
-    }
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               len = asc_prt_line(cp, leftlen,
+                                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                                  ep_3550->adapter_scsi_id,
+                                  ep_3550->max_host_qng, ep_3550->max_dvc_qng);
+               ASC_PRT_NEXT();
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               len = asc_prt_line(cp, leftlen,
+                                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                                  ep_38C0800->adapter_scsi_id,
+                                  ep_38C0800->max_host_qng,
+                                  ep_38C0800->max_dvc_qng);
+               ASC_PRT_NEXT();
+       } else {
+               len = asc_prt_line(cp, leftlen,
+                                  " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
+                                  ep_38C1600->adapter_scsi_id,
+                                  ep_38C1600->max_host_qng,
+                                  ep_38C1600->max_dvc_qng);
+               ASC_PRT_NEXT();
+       }
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               word = ep_3550->termination;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               word = ep_38C0800->termination_lvd;
+       } else {
+               word = ep_38C1600->termination_lvd;
+       }
+       switch (word) {
+       case 1:
+               termstr = "Low Off/High Off";
+               break;
+       case 2:
+               termstr = "Low Off/High On";
+               break;
+       case 3:
+               termstr = "Low On/High On";
+               break;
+       default:
+       case 0:
+               termstr = "Automatic";
+               break;
+       }
 
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        len = asc_prt_line(cp, leftlen,
-" Ultra Transfer:      ");
-    ASC_PRT_NEXT();
-        for (i = 0; i <= ADV_MAX_TID; i++) {
-            len = asc_prt_line(cp, leftlen, " %c",
-                (ep_3550->ultra_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-            ASC_PRT_NEXT();
-        }
-        len = asc_prt_line(cp, leftlen, "\n");
-        ASC_PRT_NEXT();
-    }
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               len = asc_prt_line(cp, leftlen,
+                                  " termination: %u (%s), bios_ctrl: 0x%x\n",
+                                  ep_3550->termination, termstr,
+                                  ep_3550->bios_ctrl);
+               ASC_PRT_NEXT();
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               len = asc_prt_line(cp, leftlen,
+                                  " termination: %u (%s), bios_ctrl: 0x%x\n",
+                                  ep_38C0800->termination_lvd, termstr,
+                                  ep_38C0800->bios_ctrl);
+               ASC_PRT_NEXT();
+       } else {
+               len = asc_prt_line(cp, leftlen,
+                                  " termination: %u (%s), bios_ctrl: 0x%x\n",
+                                  ep_38C1600->termination_lvd, termstr,
+                                  ep_38C1600->bios_ctrl);
+               ASC_PRT_NEXT();
+       }
 
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
-    {
-        word = ep_3550->wdtr_able;
-    } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        word = ep_38C0800->wdtr_able;
-    } else
-    {
-        word = ep_38C1600->wdtr_able;
-    }
-    len = asc_prt_line(cp, leftlen,
-" Wide Transfer:       ");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        len = asc_prt_line(cp, leftlen, " %c",
-            (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
-        adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600)
-    {
-        len = asc_prt_line(cp, leftlen,
-" Synchronous Transfer Speed (Mhz):\n  ");
-        ASC_PRT_NEXT();
-        for (i = 0; i <= ADV_MAX_TID; i++) {
-            char *speed_str;
-
-            if (i == 0)
-            {
-                sdtr_speed = adv_dvc_varp->sdtr_speed1;
-            } else if (i == 4)
-            {
-                sdtr_speed = adv_dvc_varp->sdtr_speed2;
-            } else if (i == 8)
-            {
-                sdtr_speed = adv_dvc_varp->sdtr_speed3;
-            } else if (i == 12)
-            {
-                sdtr_speed = adv_dvc_varp->sdtr_speed4;
-            }
-            switch (sdtr_speed & ADV_MAX_TID)
-            {
-                case 0:  speed_str = "Off"; break;
-                case 1:  speed_str = "  5"; break;
-                case 2:  speed_str = " 10"; break;
-                case 3:  speed_str = " 20"; break;
-                case 4:  speed_str = " 40"; break;
-                case 5:  speed_str = " 80"; break;
-                default: speed_str = "Unk"; break;
-            }
-            len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
-            ASC_PRT_NEXT();
-            if (i == 7)
-            {
-                len = asc_prt_line(cp, leftlen, "\n  ");
-                ASC_PRT_NEXT();
-            }
-            sdtr_speed >>= 4;
-        }
-        len = asc_prt_line(cp, leftlen, "\n");
-        ASC_PRT_NEXT();
-    }
+       len = asc_prt_line(cp, leftlen, " Target ID:           ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %X", i);
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
 
-    return totlen;
-}
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               word = ep_3550->disc_enable;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               word = ep_38C0800->disc_enable;
+       } else {
+               word = ep_38C1600->disc_enable;
+       }
+       len = asc_prt_line(cp, leftlen, " Disconnects:         ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
 
-/*
- * asc_prt_driver_conf()
- *
- * Note: no single line should be greater than ASC_PRTLINE_SIZE,
- * cf. asc_prt_line().
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               word = ep_3550->tagqng_able;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               word = ep_38C0800->tagqng_able;
+       } else {
+               word = ep_38C1600->tagqng_able;
+       }
+       len = asc_prt_line(cp, leftlen, " Command Queuing:     ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               word = ep_3550->start_motor;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               word = ep_38C0800->start_motor;
+       } else {
+               word = ep_38C1600->start_motor;
+       }
+       len = asc_prt_line(cp, leftlen, " Start Motor:         ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
+               ASC_PRT_NEXT();
+               for (i = 0; i <= ADV_MAX_TID; i++) {
+                       len = asc_prt_line(cp, leftlen, " %c",
+                                          (ep_3550->
+                                           sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
+                                          'Y' : 'N');
+                       ASC_PRT_NEXT();
+               }
+               len = asc_prt_line(cp, leftlen, "\n");
+               ASC_PRT_NEXT();
+       }
+
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               len = asc_prt_line(cp, leftlen, " Ultra Transfer:      ");
+               ASC_PRT_NEXT();
+               for (i = 0; i <= ADV_MAX_TID; i++) {
+                       len = asc_prt_line(cp, leftlen, " %c",
+                                          (ep_3550->
+                                           ultra_able & ADV_TID_TO_TIDMASK(i))
+                                          ? 'Y' : 'N');
+                       ASC_PRT_NEXT();
+               }
+               len = asc_prt_line(cp, leftlen, "\n");
+               ASC_PRT_NEXT();
+       }
+
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+               word = ep_3550->wdtr_able;
+       } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+               word = ep_38C0800->wdtr_able;
+       } else {
+               word = ep_38C1600->wdtr_able;
+       }
+       len = asc_prt_line(cp, leftlen, " Wide Transfer:       ");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               len = asc_prt_line(cp, leftlen, " %c",
+                                  (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
+           adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) {
+               len = asc_prt_line(cp, leftlen,
+                                  " Synchronous Transfer Speed (Mhz):\n  ");
+               ASC_PRT_NEXT();
+               for (i = 0; i <= ADV_MAX_TID; i++) {
+                       char *speed_str;
+
+                       if (i == 0) {
+                               sdtr_speed = adv_dvc_varp->sdtr_speed1;
+                       } else if (i == 4) {
+                               sdtr_speed = adv_dvc_varp->sdtr_speed2;
+                       } else if (i == 8) {
+                               sdtr_speed = adv_dvc_varp->sdtr_speed3;
+                       } else if (i == 12) {
+                               sdtr_speed = adv_dvc_varp->sdtr_speed4;
+                       }
+                       switch (sdtr_speed & ADV_MAX_TID) {
+                       case 0:
+                               speed_str = "Off";
+                               break;
+                       case 1:
+                               speed_str = "  5";
+                               break;
+                       case 2:
+                               speed_str = " 10";
+                               break;
+                       case 3:
+                               speed_str = " 20";
+                               break;
+                       case 4:
+                               speed_str = " 40";
+                               break;
+                       case 5:
+                               speed_str = " 80";
+                               break;
+                       default:
+                               speed_str = "Unk";
+                               break;
+                       }
+                       len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str);
+                       ASC_PRT_NEXT();
+                       if (i == 7) {
+                               len = asc_prt_line(cp, leftlen, "\n  ");
+                               ASC_PRT_NEXT();
+                       }
+                       sdtr_speed >>= 4;
+               }
+               len = asc_prt_line(cp, leftlen, "\n");
+               ASC_PRT_NEXT();
+       }
+
+       return totlen;
+}
+
+/*
+ * asc_prt_driver_conf()
+ *
+ * Note: no single line should be greater than ASC_PRTLINE_SIZE,
+ * cf. asc_prt_line().
  *
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_driver_conf(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t            *boardp;
-    int                    leftlen;
-    int                    totlen;
-    int                    len;
-    int                    chip_scsi_id;
-
-    boardp = ASC_BOARDP(shp);
-
-    leftlen = cplen;
-    totlen = len = 0;
-
-    len = asc_prt_line(cp, leftlen,
-"\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
-        shp->host_no);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
-        shp->host_busy, shp->last_reset, shp->max_id, shp->max_lun,
-        shp->max_channel);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
-        shp->unique_id, shp->can_queue, shp->this_id, shp->sg_tablesize,
-        shp->cmd_per_lun);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" unchecked_isa_dma %d, use_clustering %d\n",
-        shp->unchecked_isa_dma, shp->use_clustering);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
-        boardp->flags, boardp->last_reset, jiffies, boardp->asc_n_io_port);
-    ASC_PRT_NEXT();
-
-     /* 'shp->n_io_port' may be truncated because it is only one byte. */
-    len = asc_prt_line(cp, leftlen,
-" io_port 0x%x, n_io_port 0x%x\n",
-        shp->io_port, shp->n_io_port);
-    ASC_PRT_NEXT();
-
-    if (ASC_NARROW_BOARD(boardp)) {
-        chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
-    } else {
-        chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
-    }
+       asc_board_t *boardp;
+       int leftlen;
+       int totlen;
+       int len;
+       int chip_scsi_id;
+
+       boardp = ASC_BOARDP(shost);
+
+       leftlen = cplen;
+       totlen = len = 0;
+
+       len = asc_prt_line(cp, leftlen,
+                          "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n",
+                          shost->host_busy, shost->last_reset, shost->max_id,
+                          shost->max_lun, shost->max_channel);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
+                          shost->unique_id, shost->can_queue, shost->this_id,
+                          shost->sg_tablesize, shost->cmd_per_lun);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " unchecked_isa_dma %d, use_clustering %d\n",
+                          shost->unchecked_isa_dma, shost->use_clustering);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
+                          boardp->flags, boardp->last_reset, jiffies,
+                          boardp->asc_n_io_port);
+       ASC_PRT_NEXT();
+
+       /* 'shost->n_io_port' may be truncated because it is only one byte. */
+       len = asc_prt_line(cp, leftlen,
+                          " io_port 0x%x, n_io_port 0x%x\n",
+                          shost->io_port, shost->n_io_port);
+       ASC_PRT_NEXT();
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
+       } else {
+               chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
+       }
 
-    return totlen;
+       return totlen;
 }
 
 /*
@@ -8129,178 +6938,181 @@ asc_prt_driver_conf(struct Scsi_Host *shp, char *cp, int cplen)
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_asc_board_info(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t            *boardp;
-    int                    chip_scsi_id;
-    int                    leftlen;
-    int                    totlen;
-    int                    len;
-    ASC_DVC_VAR            *v;
-    ASC_DVC_CFG            *c;
-    int                    i;
-    int                    renegotiate = 0;
-
-    boardp = ASC_BOARDP(shp);
-    v = &boardp->dvc_var.asc_dvc_var;
-    c = &boardp->dvc_cfg.asc_dvc_cfg;
-    chip_scsi_id = c->chip_scsi_id;
-
-    leftlen = cplen;
-    totlen = len = 0;
-
-    len = asc_prt_line(cp, leftlen,
-"\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
-    shp->host_no);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" chip_version %u, lib_version 0x%x, lib_serial_no %u, mcode_date 0x%x\n",
-        c->chip_version, c->lib_version, c->lib_serial_no, c->mcode_date);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" mcode_version 0x%x, err_code %u\n",
-         c->mcode_version, v->err_code);
-    ASC_PRT_NEXT();
-
-    /* Current number of commands waiting for the host. */
-    len = asc_prt_line(cp, leftlen,
-" Total Command Pending: %d\n", v->cur_total_qng);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Command Queuing:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-        len = asc_prt_line(cp, leftlen, " %X:%c",
-            i, (v->use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    /* Current number of commands waiting for a device. */
-    len = asc_prt_line(cp, leftlen,
-" Command Queue Pending:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-        len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    /* Current limit on number of commands that can be sent to a device. */
-    len = asc_prt_line(cp, leftlen,
-" Command Queue Limit:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-        len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    /* Indicate whether the device has returned queue full status. */
-    len = asc_prt_line(cp, leftlen,
-" Command Queue Full:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-        if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
-            len = asc_prt_line(cp, leftlen, " %X:Y-%d",
-                i, boardp->queue_full_cnt[i]);
-        } else {
-            len = asc_prt_line(cp, leftlen, " %X:N", i);
-        }
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Synchronous Transfer:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-        len = asc_prt_line(cp, leftlen, " %X:%c",
-            i, (v->sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        uchar syn_period_ix;
-
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
-            ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        len = asc_prt_line(cp, leftlen, "  %X:", i);
-        ASC_PRT_NEXT();
-
-        if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0)
-        {
-            len = asc_prt_line(cp, leftlen, " Asynchronous");
-            ASC_PRT_NEXT();
-        } else
-        {
-            syn_period_ix =
-                (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index - 1);
-
-            len = asc_prt_line(cp, leftlen,
-                " Transfer Period Factor: %d (%d.%d Mhz),",
-                v->sdtr_period_tbl[syn_period_ix],
-                250 / v->sdtr_period_tbl[syn_period_ix],
-                ASC_TENTHS(250, v->sdtr_period_tbl[syn_period_ix]));
-            ASC_PRT_NEXT();
-
-            len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
-                boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET);
-            ASC_PRT_NEXT();
-        }
-
-        if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
-            len = asc_prt_line(cp, leftlen, "*\n");
-            renegotiate = 1;
-        } else
-        {
-            len = asc_prt_line(cp, leftlen, "\n");
-        }
-        ASC_PRT_NEXT();
-    }
+       asc_board_t *boardp;
+       int chip_scsi_id;
+       int leftlen;
+       int totlen;
+       int len;
+       ASC_DVC_VAR *v;
+       ASC_DVC_CFG *c;
+       int i;
+       int renegotiate = 0;
+
+       boardp = ASC_BOARDP(shost);
+       v = &boardp->dvc_var.asc_dvc_var;
+       c = &boardp->dvc_cfg.asc_dvc_cfg;
+       chip_scsi_id = c->chip_scsi_id;
+
+       leftlen = cplen;
+       totlen = len = 0;
+
+       len = asc_prt_line(cp, leftlen,
+                          "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " chip_version %u, lib_version 0x%x, lib_serial_no %u, mcode_date 0x%x\n",
+                          c->chip_version, c->lib_version, c->lib_serial_no,
+                          c->mcode_date);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " mcode_version 0x%x, err_code %u\n",
+                          c->mcode_version, v->err_code);
+       ASC_PRT_NEXT();
+
+       /* Current number of commands waiting for the host. */
+       len = asc_prt_line(cp, leftlen,
+                          " Total Command Pending: %d\n", v->cur_total_qng);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Command Queuing:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+               len = asc_prt_line(cp, leftlen, " %X:%c",
+                                  i,
+                                  (v->
+                                   use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ?
+                                  'Y' : 'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       /* Current number of commands waiting for a device. */
+       len = asc_prt_line(cp, leftlen, " Command Queue Pending:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+               len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]);
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       /* Current limit on number of commands that can be sent to a device. */
+       len = asc_prt_line(cp, leftlen, " Command Queue Limit:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+               len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]);
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       /* Indicate whether the device has returned queue full status. */
+       len = asc_prt_line(cp, leftlen, " Command Queue Full:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+               if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) {
+                       len = asc_prt_line(cp, leftlen, " %X:Y-%d",
+                                          i, boardp->queue_full_cnt[i]);
+               } else {
+                       len = asc_prt_line(cp, leftlen, " %X:N", i);
+               }
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+               len = asc_prt_line(cp, leftlen, " %X:%c",
+                                  i,
+                                  (v->
+                                   sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               uchar syn_period_ix;
+
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
+                   ((v->init_sdtr & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               len = asc_prt_line(cp, leftlen, "  %X:", i);
+               ASC_PRT_NEXT();
+
+               if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) {
+                       len = asc_prt_line(cp, leftlen, " Asynchronous");
+                       ASC_PRT_NEXT();
+               } else {
+                       syn_period_ix =
+                           (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index -
+                                                          1);
+
+                       len = asc_prt_line(cp, leftlen,
+                                          " Transfer Period Factor: %d (%d.%d Mhz),",
+                                          v->sdtr_period_tbl[syn_period_ix],
+                                          250 /
+                                          v->sdtr_period_tbl[syn_period_ix],
+                                          ASC_TENTHS(250,
+                                                     v->
+                                                     sdtr_period_tbl
+                                                     [syn_period_ix]));
+                       ASC_PRT_NEXT();
+
+                       len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
+                                          boardp->
+                                          sdtr_data[i] & ASC_SYN_MAX_OFFSET);
+                       ASC_PRT_NEXT();
+               }
+
+               if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
+                       len = asc_prt_line(cp, leftlen, "*\n");
+                       renegotiate = 1;
+               } else {
+                       len = asc_prt_line(cp, leftlen, "\n");
+               }
+               ASC_PRT_NEXT();
+       }
 
-    if (renegotiate)
-    {
-        len = asc_prt_line(cp, leftlen,
-            " * = Re-negotiation pending before next command.\n");
-        ASC_PRT_NEXT();
-    }
+       if (renegotiate) {
+               len = asc_prt_line(cp, leftlen,
+                                  " * = Re-negotiation pending before next command.\n");
+               ASC_PRT_NEXT();
+       }
 
-    return totlen;
+       return totlen;
 }
 
 /*
@@ -8314,237 +7126,242 @@ asc_prt_asc_board_info(struct Scsi_Host *shp, char *cp, int cplen)
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_adv_board_info(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    asc_board_t            *boardp;
-    int                    leftlen;
-    int                    totlen;
-    int                    len;
-    int                    i;
-    ADV_DVC_VAR            *v;
-    ADV_DVC_CFG            *c;
-    AdvPortAddr            iop_base;
-    ushort                 chip_scsi_id;
-    ushort                 lramword;
-    uchar                  lrambyte;
-    ushort                 tagqng_able;
-    ushort                 sdtr_able, wdtr_able;
-    ushort                 wdtr_done, sdtr_done;
-    ushort                 period = 0;
-    int                    renegotiate = 0;
-
-    boardp = ASC_BOARDP(shp);
-    v = &boardp->dvc_var.adv_dvc_var;
-    c = &boardp->dvc_cfg.adv_dvc_cfg;
-    iop_base = v->iop_base;
-    chip_scsi_id = v->chip_scsi_id;
-
-    leftlen = cplen;
-    totlen = len = 0;
-
-    len = asc_prt_line(cp, leftlen,
-"\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
-    shp->host_no);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" iop_base 0x%lx, cable_detect: %X, err_code %u\n",
-         v->iop_base,
-         AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1) & CABLE_DETECT,
-         v->err_code);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" chip_version %u, lib_version 0x%x, mcode_date 0x%x, mcode_version 0x%x\n",
-        c->chip_version, c->lib_version, c->mcode_date, c->mcode_version);
-    ASC_PRT_NEXT();
-
-    AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-    len = asc_prt_line(cp, leftlen,
-" Queuing Enabled:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        len = asc_prt_line(cp, leftlen, " %X:%c",
-            i, (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Queue Limit:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i, lrambyte);
-
-        len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" Command Pending:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i, lrambyte);
-
-        len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-    len = asc_prt_line(cp, leftlen,
-" Wide Enabled:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        len = asc_prt_line(cp, leftlen, " %X:%c",
-            i, (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
-    len = asc_prt_line(cp, leftlen,
-" Transfer Bit Width:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        AdvReadWordLram(iop_base, ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
-            lramword);
-
-        len = asc_prt_line(cp, leftlen, " %X:%d",
-            i, (lramword & 0x8000) ? 16 : 8);
-        ASC_PRT_NEXT();
-
-        if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
-            (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
-            len = asc_prt_line(cp, leftlen, "*");
-            ASC_PRT_NEXT();
-            renegotiate = 1;
-        }
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-    len = asc_prt_line(cp, leftlen,
-" Synchronous Enabled:");
-    ASC_PRT_NEXT();
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        len = asc_prt_line(cp, leftlen, " %X:%c",
-            i, (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
-        ASC_PRT_NEXT();
-    }
-    len = asc_prt_line(cp, leftlen, "\n");
-    ASC_PRT_NEXT();
-
-    AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
-    for (i = 0; i <= ADV_MAX_TID; i++) {
-
-        AdvReadWordLram(iop_base, ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
-            lramword);
-        lramword &= ~0x8000;
-
-        if ((chip_scsi_id == i) ||
-            ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
-            ((sdtr_able & ADV_TID_TO_TIDMASK(i)) == 0)) {
-            continue;
-        }
-
-        len = asc_prt_line(cp, leftlen, "  %X:", i);
-        ASC_PRT_NEXT();
-
-        if ((lramword & 0x1F) == 0) /* Check for REQ/ACK Offset 0. */
-        {
-            len = asc_prt_line(cp, leftlen, " Asynchronous");
-            ASC_PRT_NEXT();
-        } else
-        {
-            len = asc_prt_line(cp, leftlen, " Transfer Period Factor: ");
-            ASC_PRT_NEXT();
-
-            if ((lramword & 0x1F00) == 0x1100) /* 80 Mhz */
-            {
-                len = asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
-                ASC_PRT_NEXT();
-            } else if ((lramword & 0x1F00) == 0x1000) /* 40 Mhz */
-            {
-                len = asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
-                ASC_PRT_NEXT();
-            } else /* 20 Mhz or below. */
-            {
-                period = (((lramword >> 8) * 25) + 50)/4;
-
-                if (period == 0) /* Should never happen. */
-                {
-                    len = asc_prt_line(cp, leftlen, "%d (? Mhz), ");
-                    ASC_PRT_NEXT();
-                } else
-                {
-                    len = asc_prt_line(cp, leftlen,
-                        "%d (%d.%d Mhz),",
-                        period, 250/period, ASC_TENTHS(250, period));
-                    ASC_PRT_NEXT();
-                }
-            }
-
-            len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
-                lramword & 0x1F);
-            ASC_PRT_NEXT();
-        }
-
-        if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
-            len = asc_prt_line(cp, leftlen, "*\n");
-            renegotiate = 1;
-        } else
-        {
-            len = asc_prt_line(cp, leftlen, "\n");
-        }
-        ASC_PRT_NEXT();
-    }
+       asc_board_t *boardp;
+       int leftlen;
+       int totlen;
+       int len;
+       int i;
+       ADV_DVC_VAR *v;
+       ADV_DVC_CFG *c;
+       AdvPortAddr iop_base;
+       ushort chip_scsi_id;
+       ushort lramword;
+       uchar lrambyte;
+       ushort tagqng_able;
+       ushort sdtr_able, wdtr_able;
+       ushort wdtr_done, sdtr_done;
+       ushort period = 0;
+       int renegotiate = 0;
+
+       boardp = ASC_BOARDP(shost);
+       v = &boardp->dvc_var.adv_dvc_var;
+       c = &boardp->dvc_cfg.adv_dvc_cfg;
+       iop_base = v->iop_base;
+       chip_scsi_id = v->chip_scsi_id;
+
+       leftlen = cplen;
+       totlen = len = 0;
+
+       len = asc_prt_line(cp, leftlen,
+                          "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
+                          v->iop_base,
+                          AdvReadWordRegister(iop_base,
+                                              IOPW_SCSI_CFG1) & CABLE_DETECT,
+                          v->err_code);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " chip_version %u, lib_version 0x%x, mcode_date 0x%x, mcode_version 0x%x\n",
+                          c->chip_version, c->lib_version, c->mcode_date,
+                          c->mcode_version);
+       ASC_PRT_NEXT();
+
+       AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
+       len = asc_prt_line(cp, leftlen, " Queuing Enabled:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               len = asc_prt_line(cp, leftlen, " %X:%c",
+                                  i,
+                                  (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Queue Limit:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i,
+                               lrambyte);
+
+               len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen, " Command Pending:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i,
+                               lrambyte);
+
+               len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte);
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+       len = asc_prt_line(cp, leftlen, " Wide Enabled:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               len = asc_prt_line(cp, leftlen, " %X:%c",
+                                  i,
+                                  (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
+       len = asc_prt_line(cp, leftlen, " Transfer Bit Width:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               AdvReadWordLram(iop_base,
+                               ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
+                               lramword);
+
+               len = asc_prt_line(cp, leftlen, " %X:%d",
+                                  i, (lramword & 0x8000) ? 16 : 8);
+               ASC_PRT_NEXT();
+
+               if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
+                   (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
+                       len = asc_prt_line(cp, leftlen, "*");
+                       ASC_PRT_NEXT();
+                       renegotiate = 1;
+               }
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+       len = asc_prt_line(cp, leftlen, " Synchronous Enabled:");
+       ASC_PRT_NEXT();
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               len = asc_prt_line(cp, leftlen, " %X:%c",
+                                  i,
+                                  (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
+                                  'N');
+               ASC_PRT_NEXT();
+       }
+       len = asc_prt_line(cp, leftlen, "\n");
+       ASC_PRT_NEXT();
+
+       AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
+       for (i = 0; i <= ADV_MAX_TID; i++) {
+
+               AdvReadWordLram(iop_base,
+                               ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
+                               lramword);
+               lramword &= ~0x8000;
+
+               if ((chip_scsi_id == i) ||
+                   ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0) ||
+                   ((sdtr_able & ADV_TID_TO_TIDMASK(i)) == 0)) {
+                       continue;
+               }
+
+               len = asc_prt_line(cp, leftlen, "  %X:", i);
+               ASC_PRT_NEXT();
+
+               if ((lramword & 0x1F) == 0) {   /* Check for REQ/ACK Offset 0. */
+                       len = asc_prt_line(cp, leftlen, " Asynchronous");
+                       ASC_PRT_NEXT();
+               } else {
+                       len =
+                           asc_prt_line(cp, leftlen,
+                                        " Transfer Period Factor: ");
+                       ASC_PRT_NEXT();
+
+                       if ((lramword & 0x1F00) == 0x1100) {    /* 80 Mhz */
+                               len =
+                                   asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
+                               ASC_PRT_NEXT();
+                       } else if ((lramword & 0x1F00) == 0x1000) {     /* 40 Mhz */
+                               len =
+                                   asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
+                               ASC_PRT_NEXT();
+                       } else {        /* 20 Mhz or below. */
+
+                               period = (((lramword >> 8) * 25) + 50) / 4;
+
+                               if (period == 0) {      /* Should never happen. */
+                                       len =
+                                           asc_prt_line(cp, leftlen,
+                                                        "%d (? Mhz), ");
+                                       ASC_PRT_NEXT();
+                               } else {
+                                       len = asc_prt_line(cp, leftlen,
+                                                          "%d (%d.%d Mhz),",
+                                                          period, 250 / period,
+                                                          ASC_TENTHS(250,
+                                                                     period));
+                                       ASC_PRT_NEXT();
+                               }
+                       }
+
+                       len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d",
+                                          lramword & 0x1F);
+                       ASC_PRT_NEXT();
+               }
+
+               if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
+                       len = asc_prt_line(cp, leftlen, "*\n");
+                       renegotiate = 1;
+               } else {
+                       len = asc_prt_line(cp, leftlen, "\n");
+               }
+               ASC_PRT_NEXT();
+       }
 
-    if (renegotiate)
-    {
-        len = asc_prt_line(cp, leftlen,
-            " * = Re-negotiation pending before next command.\n");
-        ASC_PRT_NEXT();
-    }
+       if (renegotiate) {
+               len = asc_prt_line(cp, leftlen,
+                                  " * = Re-negotiation pending before next command.\n");
+               ASC_PRT_NEXT();
+       }
 
-    return totlen;
+       return totlen;
 }
 
 /*
@@ -8553,30 +7370,30 @@ asc_prt_adv_board_info(struct Scsi_Host *shp, char *cp, int cplen)
  * Copy proc information to a read buffer taking into account the current
  * read offset in the file and the remaining space in the read buffer.
  */
-STATIC int
+static int
 asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
-              char *cp, int cplen)
+             char *cp, int cplen)
 {
-    int cnt = 0;
-
-    ASC_DBG3(2, "asc_proc_copy: offset %d, advoffset %d, cplen %d\n",
-            (unsigned) offset, (unsigned) advoffset, cplen);
-    if (offset <= advoffset) {
-        /* Read offset below current offset, copy everything. */
-        cnt = min(cplen, leftlen);
-        ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
-                (ulong) curbuf, (ulong) cp, cnt);
-        memcpy(curbuf, cp, cnt);
-    } else if (offset < advoffset + cplen) {
-        /* Read offset within current range, partial copy. */
-        cnt = (advoffset + cplen) - offset;
-        cp = (cp + cplen) - cnt;
-        cnt = min(cnt, leftlen);
-        ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
-                (ulong) curbuf, (ulong) cp, cnt);
-        memcpy(curbuf, cp, cnt);
-    }
-    return cnt;
+       int cnt = 0;
+
+       ASC_DBG3(2, "asc_proc_copy: offset %d, advoffset %d, cplen %d\n",
+                (unsigned)offset, (unsigned)advoffset, cplen);
+       if (offset <= advoffset) {
+               /* Read offset below current offset, copy everything. */
+               cnt = min(cplen, leftlen);
+               ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
+                        (ulong)curbuf, (ulong)cp, cnt);
+               memcpy(curbuf, cp, cnt);
+       } else if (offset < advoffset + cplen) {
+               /* Read offset within current range, partial copy. */
+               cnt = (advoffset + cplen) - offset;
+               cp = (cp + cplen) - cnt;
+               cnt = min(cnt, leftlen);
+               ASC_DBG3(2, "asc_proc_copy: curbuf 0x%lx, cp 0x%lx, cnt %d\n",
+                        (ulong)curbuf, (ulong)cp, cnt);
+               memcpy(curbuf, cp, cnt);
+       }
+       return cnt;
 }
 
 /*
@@ -8590,29 +7407,27 @@ asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
  * Note: If any single line is greater than ASC_PRTLINE_SIZE bytes the stack
  * will be corrupted. 's[]' is defined to be ASC_PRTLINE_SIZE bytes.
  */
-STATIC int
-asc_prt_line(char *buf, int buflen, char *fmt, ...)
+static int asc_prt_line(char *buf, int buflen, char *fmt, ...)
 {
-    va_list        args;
-    int            ret;
-    char           s[ASC_PRTLINE_SIZE];
-
-    va_start(args, fmt);
-    ret = vsprintf(s, fmt, args);
-    ASC_ASSERT(ret < ASC_PRTLINE_SIZE);
-    if (buf == NULL) {
-        (void) printk(s);
-        ret = 0;
-    } else {
-        ret = min(buflen, ret);
-        memcpy(buf, s, ret);
-    }
-    va_end(args);
-    return ret;
+       va_list args;
+       int ret;
+       char s[ASC_PRTLINE_SIZE];
+
+       va_start(args, fmt);
+       ret = vsprintf(s, fmt, args);
+       ASC_ASSERT(ret < ASC_PRTLINE_SIZE);
+       if (buf == NULL) {
+               (void)printk(s);
+               ret = 0;
+       } else {
+               ret = min(buflen, ret);
+               memcpy(buf, s, ret);
+       }
+       va_end(args);
+       return ret;
 }
 #endif /* CONFIG_PROC_FS */
 
-
 /*
  * --- Functions Required by the Asc Library
  */
@@ -8623,31 +7438,28 @@ asc_prt_line(char *buf, int buflen, char *fmt, ...)
  * from a timer interrupt, because this function may be
  * called when interrupts are disabled.
  */
-STATIC void
-DvcSleepMilliSecond(ADV_DCNT n)
+static void DvcSleepMilliSecond(ADV_DCNT n)
 {
-    ASC_DBG1(4, "DvcSleepMilliSecond: %lu\n", (ulong) n);
-    mdelay(n);
+       ASC_DBG1(4, "DvcSleepMilliSecond: %lu\n", (ulong)n);
+       mdelay(n);
 }
 
 /*
  * Currently and inline noop but leave as a placeholder.
  * Leave DvcEnterCritical() as a noop placeholder.
  */
-STATIC inline ulong
-DvcEnterCritical(void)
+static inline ulong DvcEnterCritical(void)
 {
-    return 0;
+       return 0;
 }
 
 /*
  * Critical sections are all protected by the board spinlock.
  * Leave DvcLeaveCritical() as a noop placeholder.
  */
-STATIC inline void
-DvcLeaveCritical(ulong flags)
+static inline void DvcLeaveCritical(ulong flags)
 {
-    return;
+       return;
 }
 
 /*
@@ -8660,20 +7472,20 @@ DvcLeaveCritical(ulong flags)
  * Description:
  *     Output an ASC_SCSI_Q structure to the chip
  */
-STATIC void
+static void
 DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
 {
-    int    i;
-
-    ASC_DBG_PRT_HEX(2, "DvcPutScsiQ", outbuf, 2 * words);
-    AscSetChipLramAddr(iop_base, s_addr);
-    for (i = 0; i < 2 * words; i += 2) {
-        if (i == 4 || i == 20) {
-            continue;
-        }
-        outpw(iop_base + IOP_RAM_DATA,
-            ((ushort) outbuf[i + 1] << 8) | outbuf[i]);
-    }
+       int i;
+
+       ASC_DBG_PRT_HEX(2, "DvcPutScsiQ", outbuf, 2 * words);
+       AscSetChipLramAddr(iop_base, s_addr);
+       for (i = 0; i < 2 * words; i += 2) {
+               if (i == 4 || i == 20) {
+                       continue;
+               }
+               outpw(iop_base + IOP_RAM_DATA,
+                     ((ushort)outbuf[i + 1] << 8) | outbuf[i]);
+       }
 }
 
 /*
@@ -8686,52 +7498,46 @@ DvcPutScsiQ(PortAddr iop_base, ushort s_addr, uchar *outbuf, int words)
  * Description:
  *     Input an ASC_QDONE_INFO structure from the chip
  */
-STATIC void
+static void
 DvcGetQinfo(PortAddr iop_base, ushort s_addr, uchar *inbuf, int words)
 {
-    int    i;
-    ushort word;
-
-    AscSetChipLramAddr(iop_base, s_addr);
-    for (i = 0; i < 2 * words; i += 2) {
-        if (i == 10) {
-            continue;
-        }
-        word = inpw(iop_base + IOP_RAM_DATA);
-        inbuf[i] = word & 0xff;
-        inbuf[i + 1] = (word >> 8) & 0xff;
-    }
-    ASC_DBG_PRT_HEX(2, "DvcGetQinfo", inbuf, 2 * words);
+       int i;
+       ushort word;
+
+       AscSetChipLramAddr(iop_base, s_addr);
+       for (i = 0; i < 2 * words; i += 2) {
+               if (i == 10) {
+                       continue;
+               }
+               word = inpw(iop_base + IOP_RAM_DATA);
+               inbuf[i] = word & 0xff;
+               inbuf[i + 1] = (word >> 8) & 0xff;
+       }
+       ASC_DBG_PRT_HEX(2, "DvcGetQinfo", inbuf, 2 * words);
 }
 
 /*
  * Read a PCI configuration byte.
  */
-STATIC uchar __init
-DvcReadPCIConfigByte(
-        ASC_DVC_VAR *asc_dvc,
-        ushort offset)
+static uchar __init DvcReadPCIConfigByte(ASC_DVC_VAR *asc_dvc, ushort offset)
 {
 #ifdef CONFIG_PCI
-    uchar byte_data;
-    pci_read_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, &byte_data);
-    return byte_data;
+       uchar byte_data;
+       pci_read_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, &byte_data);
+       return byte_data;
 #else /* !defined(CONFIG_PCI) */
-    return 0;
+       return 0;
 #endif /* !defined(CONFIG_PCI) */
 }
 
 /*
  * Write a PCI configuration byte.
  */
-STATIC void __init
-DvcWritePCIConfigByte(
-        ASC_DVC_VAR *asc_dvc,
-        ushort offset,
-        uchar  byte_data)
+static void __init
+DvcWritePCIConfigByte(ASC_DVC_VAR *asc_dvc, ushort offset, uchar byte_data)
 {
 #ifdef CONFIG_PCI
-    pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
+       pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
 #endif /* CONFIG_PCI */
 }
 
@@ -8739,51 +7545,43 @@ DvcWritePCIConfigByte(
  * Return the BIOS address of the adapter at the specified
  * I/O port and with the specified bus type.
  */
-STATIC ushort __init
-AscGetChipBiosAddress(
-        PortAddr iop_base,
-        ushort bus_type)
+static ushort __init AscGetChipBiosAddress(PortAddr iop_base, ushort bus_type)
 {
-    ushort  cfg_lsw;
-    ushort  bios_addr;
-
-    /*
-     * The PCI BIOS is re-located by the motherboard BIOS. Because
-     * of this the driver can not determine where a PCI BIOS is
-     * loaded and executes.
-     */
-    if (bus_type & ASC_IS_PCI)
-    {
-        return(0);
-    }
-
+       ushort cfg_lsw;
+       ushort bios_addr;
+
+       /*
+        * The PCI BIOS is re-located by the motherboard BIOS. Because
+        * of this the driver can not determine where a PCI BIOS is
+        * loaded and executes.
+        */
+       if (bus_type & ASC_IS_PCI) {
+               return (0);
+       }
 #ifdef CONFIG_ISA
-    if((bus_type & ASC_IS_EISA) != 0)
-    {
-        cfg_lsw = AscGetEisaChipCfg(iop_base);
-        cfg_lsw &= 0x000F;
-        bios_addr = (ushort)(ASC_BIOS_MIN_ADDR  +
-                                (cfg_lsw * ASC_BIOS_BANK_SIZE));
-        return(bios_addr);
-    }/* if */
+       if ((bus_type & ASC_IS_EISA) != 0) {
+               cfg_lsw = AscGetEisaChipCfg(iop_base);
+               cfg_lsw &= 0x000F;
+               bios_addr = (ushort)(ASC_BIOS_MIN_ADDR +
+                                    (cfg_lsw * ASC_BIOS_BANK_SIZE));
+               return (bios_addr);
+       }                       /* if */
 #endif /* CONFIG_ISA */
 
-    cfg_lsw = AscGetChipCfgLsw(iop_base);
+       cfg_lsw = AscGetChipCfgLsw(iop_base);
 
-    /*
-    *  ISA PnP uses the top bit as the 32K BIOS flag
-    */
-    if (bus_type == ASC_IS_ISAPNP)
-    {
-        cfg_lsw &= 0x7FFF;
-    }/* if */
-
-    bios_addr = (ushort)(((cfg_lsw >> 12) * ASC_BIOS_BANK_SIZE) +
-            ASC_BIOS_MIN_ADDR);
-    return(bios_addr);
+       /*
+        *  ISA PnP uses the top bit as the 32K BIOS flag
+        */
+       if (bus_type == ASC_IS_ISAPNP) {
+               cfg_lsw &= 0x7FFF;
+       }
+       /* if */
+       bios_addr = (ushort)(((cfg_lsw >> 12) * ASC_BIOS_BANK_SIZE) +
+                            ASC_BIOS_MIN_ADDR);
+       return (bios_addr);
 }
 
-
 /*
  * --- Functions Required by the Adv Library
  */
@@ -8801,49 +7599,44 @@ AscGetChipBiosAddress(
  */
 ADV_PADDR
 DvcGetPhyAddr(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq,
-        uchar *vaddr, ADV_SDCNT *lenp, int flag)
+             uchar *vaddr, ADV_SDCNT *lenp, int flag)
 {
-    ADV_PADDR           paddr;
+       ADV_PADDR paddr;
 
-    paddr = virt_to_bus(vaddr);
+       paddr = virt_to_bus(vaddr);
 
-    ASC_DBG4(4,
-        "DvcGetPhyAddr: vaddr 0x%lx, lenp 0x%lx *lenp %lu, paddr 0x%lx\n",
-        (ulong) vaddr, (ulong) lenp, (ulong) *((ulong *) lenp), (ulong) paddr);
+       ASC_DBG4(4,
+                "DvcGetPhyAddr: vaddr 0x%lx, lenp 0x%lx *lenp %lu, paddr 0x%lx\n",
+                (ulong)vaddr, (ulong)lenp, (ulong)*((ulong *)lenp),
+                (ulong)paddr);
 
-    return paddr;
+       return paddr;
 }
 
 /*
  * Read a PCI configuration byte.
  */
-STATIC uchar __init
-DvcAdvReadPCIConfigByte(
-        ADV_DVC_VAR *asc_dvc,
-        ushort offset)
+static uchar __init DvcAdvReadPCIConfigByte(ADV_DVC_VAR *asc_dvc, ushort offset)
 {
 #ifdef CONFIG_PCI
-    uchar byte_data;
-    pci_read_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, &byte_data);
-    return byte_data;
+       uchar byte_data;
+       pci_read_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, &byte_data);
+       return byte_data;
 #else /* CONFIG_PCI */
-    return 0;
+       return 0;
 #endif /* CONFIG_PCI */
 }
 
 /*
  * Write a PCI configuration byte.
  */
-STATIC void __init
-DvcAdvWritePCIConfigByte(
-        ADV_DVC_VAR *asc_dvc,
-        ushort offset,
-        uchar  byte_data)
+static void __init
+DvcAdvWritePCIConfigByte(ADV_DVC_VAR *asc_dvc, ushort offset, uchar byte_data)
 {
 #ifdef CONFIG_PCI
-    pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
+       pci_write_config_byte(to_pci_dev(asc_dvc->cfg->dev), offset, byte_data);
 #else /* CONFIG_PCI */
-    return;
+       return;
 #endif /* CONFIG_PCI */
 }
 
@@ -8862,97 +7655,98 @@ DvcAdvWritePCIConfigByte(
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_board_stats(struct Scsi_Host *shp, char *cp, int cplen)
+static int asc_prt_board_stats(struct Scsi_Host *shost, char *cp, int cplen)
 {
-    int                    leftlen;
-    int                    totlen;
-    int                    len;
-    struct asc_stats       *s;
-    asc_board_t            *boardp;
-
-    leftlen = cplen;
-    totlen = len = 0;
-
-    boardp = ASC_BOARDP(shp);
-    s = &boardp->asc_stats;
-
-    len = asc_prt_line(cp, leftlen,
-"\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n", shp->host_no);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
-        s->queuecommand, s->reset, s->biosparam, s->interrupt);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
-        s->callback, s->done, s->build_error, s->adv_build_noreq,
-        s->adv_build_nosg);
-    ASC_PRT_NEXT();
-
-    len = asc_prt_line(cp, leftlen,
-" exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
-        s->exe_noerror, s->exe_busy, s->exe_error, s->exe_unknown);
-    ASC_PRT_NEXT();
-
-    /*
-     * Display data transfer statistics.
-     */
-    if (s->cont_cnt > 0) {
-        len = asc_prt_line(cp, leftlen, " cont_cnt %lu, ", s->cont_cnt);
-        ASC_PRT_NEXT();
-
-        len = asc_prt_line(cp, leftlen, "cont_xfer %lu.%01lu kb ",
-                    s->cont_xfer/2,
-                    ASC_TENTHS(s->cont_xfer, 2));
-        ASC_PRT_NEXT();
-
-        /* Contiguous transfer average size */
-        len = asc_prt_line(cp, leftlen, "avg_xfer %lu.%01lu kb\n",
-                    (s->cont_xfer/2)/s->cont_cnt,
-                    ASC_TENTHS((s->cont_xfer/2), s->cont_cnt));
-        ASC_PRT_NEXT();
-    }
+       int leftlen;
+       int totlen;
+       int len;
+       struct asc_stats *s;
+       asc_board_t *boardp;
 
-    if (s->sg_cnt > 0) {
+       leftlen = cplen;
+       totlen = len = 0;
+
+       boardp = ASC_BOARDP(shost);
+       s = &boardp->asc_stats;
+
+       len = asc_prt_line(cp, leftlen,
+                          "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
+                          shost->host_no);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n",
+                          s->queuecommand, s->reset, s->biosparam,
+                          s->interrupt);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n",
+                          s->callback, s->done, s->build_error,
+                          s->adv_build_noreq, s->adv_build_nosg);
+       ASC_PRT_NEXT();
+
+       len = asc_prt_line(cp, leftlen,
+                          " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
+                          s->exe_noerror, s->exe_busy, s->exe_error,
+                          s->exe_unknown);
+       ASC_PRT_NEXT();
+
+       /*
+        * Display data transfer statistics.
+        */
+       if (s->cont_cnt > 0) {
+               len = asc_prt_line(cp, leftlen, " cont_cnt %lu, ", s->cont_cnt);
+               ASC_PRT_NEXT();
+
+               len = asc_prt_line(cp, leftlen, "cont_xfer %lu.%01lu kb ",
+                                  s->cont_xfer / 2,
+                                  ASC_TENTHS(s->cont_xfer, 2));
+               ASC_PRT_NEXT();
+
+               /* Contiguous transfer average size */
+               len = asc_prt_line(cp, leftlen, "avg_xfer %lu.%01lu kb\n",
+                                  (s->cont_xfer / 2) / s->cont_cnt,
+                                  ASC_TENTHS((s->cont_xfer / 2), s->cont_cnt));
+               ASC_PRT_NEXT();
+       }
 
-        len = asc_prt_line(cp, leftlen, " sg_cnt %lu, sg_elem %lu, ",
-                    s->sg_cnt, s->sg_elem);
-        ASC_PRT_NEXT();
+       if (s->sg_cnt > 0) {
 
-        len = asc_prt_line(cp, leftlen, "sg_xfer %lu.%01lu kb\n",
-                    s->sg_xfer/2,
-                    ASC_TENTHS(s->sg_xfer, 2));
-        ASC_PRT_NEXT();
+               len = asc_prt_line(cp, leftlen, " sg_cnt %lu, sg_elem %lu, ",
+                                  s->sg_cnt, s->sg_elem);
+               ASC_PRT_NEXT();
 
-        /* Scatter gather transfer statistics */
-        len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ",
-                    s->sg_elem/s->sg_cnt,
-                    ASC_TENTHS(s->sg_elem, s->sg_cnt));
-        ASC_PRT_NEXT();
+               len = asc_prt_line(cp, leftlen, "sg_xfer %lu.%01lu kb\n",
+                                  s->sg_xfer / 2, ASC_TENTHS(s->sg_xfer, 2));
+               ASC_PRT_NEXT();
 
-        len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ",
-                    (s->sg_xfer/2)/s->sg_elem,
-                    ASC_TENTHS((s->sg_xfer/2), s->sg_elem));
-        ASC_PRT_NEXT();
+               /* Scatter gather transfer statistics */
+               len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ",
+                                  s->sg_elem / s->sg_cnt,
+                                  ASC_TENTHS(s->sg_elem, s->sg_cnt));
+               ASC_PRT_NEXT();
 
-        len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n",
-                    (s->sg_xfer/2)/s->sg_cnt,
-                    ASC_TENTHS((s->sg_xfer/2), s->sg_cnt));
-        ASC_PRT_NEXT();
-    }
+               len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ",
+                                  (s->sg_xfer / 2) / s->sg_elem,
+                                  ASC_TENTHS((s->sg_xfer / 2), s->sg_elem));
+               ASC_PRT_NEXT();
 
-    /*
-     * Display request queuing statistics.
-     */
-    len = asc_prt_line(cp, leftlen,
-" Active and Waiting Request Queues (Time Unit: %d HZ):\n", HZ);
-    ASC_PRT_NEXT();
+               len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n",
+                                  (s->sg_xfer / 2) / s->sg_cnt,
+                                  ASC_TENTHS((s->sg_xfer / 2), s->sg_cnt));
+               ASC_PRT_NEXT();
+       }
 
+       /*
+        * Display request queuing statistics.
+        */
+       len = asc_prt_line(cp, leftlen,
+                          " Active and Waiting Request Queues (Time Unit: %d HZ):\n",
+                          HZ);
+       ASC_PRT_NEXT();
 
-     return totlen;
+       return totlen;
 }
 
 /*
@@ -8967,70 +7761,89 @@ asc_prt_board_stats(struct Scsi_Host *shp, char *cp, int cplen)
  * Return the number of characters copied into 'cp'. No more than
  * 'cplen' characters will be copied to 'cp'.
  */
-STATIC int
-asc_prt_target_stats(struct Scsi_Host *shp, int tgt_id, char *cp, int cplen)
+static int
+asc_prt_target_stats(struct Scsi_Host *shost, int tgt_id, char *cp, int cplen)
 {
-    int                    leftlen;
-    int                    totlen;
-    int                    len;
-    struct asc_stats       *s;
-    ushort                 chip_scsi_id;
-    asc_board_t            *boardp;
-    asc_queue_t            *active;
-    asc_queue_t            *waiting;
-
-    leftlen = cplen;
-    totlen = len = 0;
-
-    boardp = ASC_BOARDP(shp);
-    s = &boardp->asc_stats;
-
-    active = &ASC_BOARDP(shp)->active;
-    waiting = &ASC_BOARDP(shp)->waiting;
-
-    if (ASC_NARROW_BOARD(boardp)) {
-        chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
-    } else {
-        chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
-    }
+       int leftlen;
+       int totlen;
+       int len;
+       struct asc_stats *s;
+       ushort chip_scsi_id;
+       asc_board_t *boardp;
+       asc_queue_t *active;
+       asc_queue_t *waiting;
 
-    if ((chip_scsi_id == tgt_id) ||
-        ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(tgt_id)) == 0)) {
-        return 0;
-    }
+       leftlen = cplen;
+       totlen = len = 0;
+
+       boardp = ASC_BOARDP(shost);
+       s = &boardp->asc_stats;
+
+       active = &ASC_BOARDP(shost)->active;
+       waiting = &ASC_BOARDP(shost)->waiting;
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
+       } else {
+               chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
+       }
+
+       if ((chip_scsi_id == tgt_id) ||
+           ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(tgt_id)) == 0)) {
+               return 0;
+       }
 
-    do {
-        if (active->q_tot_cnt[tgt_id] > 0 || waiting->q_tot_cnt[tgt_id] > 0) {
-            len = asc_prt_line(cp, leftlen, " target %d\n", tgt_id);
-            ASC_PRT_NEXT();
-
-            len = asc_prt_line(cp, leftlen,
-"   active: cnt [cur %d, max %d, tot %u], time [min %d, max %d, avg %lu.%01lu]\n",
-                active->q_cur_cnt[tgt_id], active->q_max_cnt[tgt_id],
-                active->q_tot_cnt[tgt_id],
-                active->q_min_tim[tgt_id], active->q_max_tim[tgt_id],
-                (active->q_tot_cnt[tgt_id] == 0) ? 0 :
-                (active->q_tot_tim[tgt_id]/active->q_tot_cnt[tgt_id]),
-                (active->q_tot_cnt[tgt_id] == 0) ? 0 :
-                ASC_TENTHS(active->q_tot_tim[tgt_id],
-                active->q_tot_cnt[tgt_id]));
-             ASC_PRT_NEXT();
-
-             len = asc_prt_line(cp, leftlen,
-"   waiting: cnt [cur %d, max %d, tot %u], time [min %u, max %u, avg %lu.%01lu]\n",
-                waiting->q_cur_cnt[tgt_id], waiting->q_max_cnt[tgt_id],
-                waiting->q_tot_cnt[tgt_id],
-                waiting->q_min_tim[tgt_id], waiting->q_max_tim[tgt_id],
-                (waiting->q_tot_cnt[tgt_id] == 0) ? 0 :
-                (waiting->q_tot_tim[tgt_id]/waiting->q_tot_cnt[tgt_id]),
-                (waiting->q_tot_cnt[tgt_id] == 0) ? 0 :
-                ASC_TENTHS(waiting->q_tot_tim[tgt_id],
-                waiting->q_tot_cnt[tgt_id]));
-             ASC_PRT_NEXT();
-        }
-    } while (0);
-
-     return totlen;
+       do {
+               if (active->q_tot_cnt[tgt_id] > 0
+                   || waiting->q_tot_cnt[tgt_id] > 0) {
+                       len = asc_prt_line(cp, leftlen, " target %d\n", tgt_id);
+                       ASC_PRT_NEXT();
+
+                       len = asc_prt_line(cp, leftlen,
+                                          "   active: cnt [cur %d, max %d, tot %u], time [min %d, max %d, avg %lu.%01lu]\n",
+                                          active->q_cur_cnt[tgt_id],
+                                          active->q_max_cnt[tgt_id],
+                                          active->q_tot_cnt[tgt_id],
+                                          active->q_min_tim[tgt_id],
+                                          active->q_max_tim[tgt_id],
+                                          (active->q_tot_cnt[tgt_id] ==
+                                           0) ? 0 : (active->
+                                                     q_tot_tim[tgt_id] /
+                                                     active->
+                                                     q_tot_cnt[tgt_id]),
+                                          (active->q_tot_cnt[tgt_id] ==
+                                           0) ? 0 : ASC_TENTHS(active->
+                                                               q_tot_tim
+                                                               [tgt_id],
+                                                               active->
+                                                               q_tot_cnt
+                                                               [tgt_id]));
+                       ASC_PRT_NEXT();
+
+                       len = asc_prt_line(cp, leftlen,
+                                          "   waiting: cnt [cur %d, max %d, tot %u], time [min %u, max %u, avg %lu.%01lu]\n",
+                                          waiting->q_cur_cnt[tgt_id],
+                                          waiting->q_max_cnt[tgt_id],
+                                          waiting->q_tot_cnt[tgt_id],
+                                          waiting->q_min_tim[tgt_id],
+                                          waiting->q_max_tim[tgt_id],
+                                          (waiting->q_tot_cnt[tgt_id] ==
+                                           0) ? 0 : (waiting->
+                                                     q_tot_tim[tgt_id] /
+                                                     waiting->
+                                                     q_tot_cnt[tgt_id]),
+                                          (waiting->q_tot_cnt[tgt_id] ==
+                                           0) ? 0 : ASC_TENTHS(waiting->
+                                                               q_tot_tim
+                                                               [tgt_id],
+                                                               waiting->
+                                                               q_tot_cnt
+                                                               [tgt_id]));
+                       ASC_PRT_NEXT();
+               }
+       } while (0);
+
+       return totlen;
 }
 #endif /* CONFIG_PROC_FS */
 #endif /* ADVANSYS_STATS */
@@ -9039,207 +7852,181 @@ asc_prt_target_stats(struct Scsi_Host *shp, int tgt_id, char *cp, int cplen)
 /*
  * asc_prt_scsi_host()
  */
-STATIC void
-asc_prt_scsi_host(struct Scsi_Host *s)
+static void asc_prt_scsi_host(struct Scsi_Host *s)
 {
-    asc_board_t         *boardp;
-
-    boardp = ASC_BOARDP(s);
-
-    printk("Scsi_Host at addr 0x%lx\n", (ulong) s);
-    printk(
-" host_busy %u, host_no %d, last_reset %d,\n",
-        s->host_busy, s->host_no,
-        (unsigned) s->last_reset);
-
-    printk(
-" base 0x%lx, io_port 0x%lx, n_io_port %u, irq 0x%x,\n",
-        (ulong) s->base, (ulong) s->io_port, s->n_io_port, s->irq);
-
-    printk(
-" dma_channel %d, this_id %d, can_queue %d,\n",
-        s->dma_channel, s->this_id, s->can_queue);
-
-    printk(
-" cmd_per_lun %d, sg_tablesize %d, unchecked_isa_dma %d\n",
-        s->cmd_per_lun, s->sg_tablesize, s->unchecked_isa_dma);
-
-    if (ASC_NARROW_BOARD(boardp)) {
-        asc_prt_asc_dvc_var(&ASC_BOARDP(s)->dvc_var.asc_dvc_var);
-        asc_prt_asc_dvc_cfg(&ASC_BOARDP(s)->dvc_cfg.asc_dvc_cfg);
-    } else {
-        asc_prt_adv_dvc_var(&ASC_BOARDP(s)->dvc_var.adv_dvc_var);
-        asc_prt_adv_dvc_cfg(&ASC_BOARDP(s)->dvc_cfg.adv_dvc_cfg);
-    }
+       asc_board_t *boardp;
+
+       boardp = ASC_BOARDP(s);
+
+       printk("Scsi_Host at addr 0x%lx\n", (ulong)s);
+       printk(" host_busy %u, host_no %d, last_reset %d,\n",
+              s->host_busy, s->host_no, (unsigned)s->last_reset);
+
+       printk(" base 0x%lx, io_port 0x%lx, n_io_port %u, irq 0x%x,\n",
+              (ulong)s->base, (ulong)s->io_port, s->n_io_port, s->irq);
+
+       printk(" dma_channel %d, this_id %d, can_queue %d,\n",
+              s->dma_channel, s->this_id, s->can_queue);
+
+       printk(" cmd_per_lun %d, sg_tablesize %d, unchecked_isa_dma %d\n",
+              s->cmd_per_lun, s->sg_tablesize, s->unchecked_isa_dma);
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               asc_prt_asc_dvc_var(&ASC_BOARDP(s)->dvc_var.asc_dvc_var);
+               asc_prt_asc_dvc_cfg(&ASC_BOARDP(s)->dvc_cfg.asc_dvc_cfg);
+       } else {
+               asc_prt_adv_dvc_var(&ASC_BOARDP(s)->dvc_var.adv_dvc_var);
+               asc_prt_adv_dvc_cfg(&ASC_BOARDP(s)->dvc_cfg.adv_dvc_cfg);
+       }
 }
 
 /*
  * asc_prt_scsi_cmnd()
  */
-STATIC void
-asc_prt_scsi_cmnd(struct scsi_cmnd *s)
+static void asc_prt_scsi_cmnd(struct scsi_cmnd *s)
 {
-    printk("struct scsi_cmnd at addr 0x%lx\n", (ulong) s);
+       printk("struct scsi_cmnd at addr 0x%lx\n", (ulong)s);
 
-    printk(
-" host 0x%lx, device 0x%lx, target %u, lun %u, channel %u,\n",
-        (ulong) s->device->host, (ulong) s->device, s->device->id, s->device->lun,
-        s->device->channel);
+       printk(" host 0x%lx, device 0x%lx, target %u, lun %u, channel %u,\n",
+              (ulong)s->device->host, (ulong)s->device, s->device->id,
+              s->device->lun, s->device->channel);
 
-    asc_prt_hex(" CDB", s->cmnd, s->cmd_len);
+       asc_prt_hex(" CDB", s->cmnd, s->cmd_len);
 
-    printk (
-"sc_data_direction %u, resid %d\n",
-        s->sc_data_direction, s->resid);
+       printk("sc_data_direction %u, resid %d\n",
+              s->sc_data_direction, s->resid);
 
-    printk(
-" use_sg %u, sglist_len %u\n",
-        s->use_sg, s->sglist_len);
+       printk(" use_sg %u, sglist_len %u\n", s->use_sg, s->sglist_len);
 
-    printk(
-" serial_number 0x%x, retries %d, allowed %d\n",
-        (unsigned) s->serial_number, s->retries, s->allowed);
+       printk(" serial_number 0x%x, retries %d, allowed %d\n",
+              (unsigned)s->serial_number, s->retries, s->allowed);
 
-    printk(
-" timeout_per_command %d\n",
-        s->timeout_per_command);
+       printk(" timeout_per_command %d\n", s->timeout_per_command);
 
-    printk(
-" scsi_done 0x%lx, done 0x%lx, host_scribble 0x%lx, result 0x%x\n",
-        (ulong) s->scsi_done, (ulong) s->done,
-        (ulong) s->host_scribble, s->result);
+       printk
+           (" scsi_done 0x%lx, done 0x%lx, host_scribble 0x%lx, result 0x%x\n",
+            (ulong)s->scsi_done, (ulong)s->done, (ulong)s->host_scribble,
+            s->result);
 
-    printk(
-" tag %u, pid %u\n",
-        (unsigned) s->tag, (unsigned) s->pid);
+       printk(" tag %u, pid %u\n", (unsigned)s->tag, (unsigned)s->pid);
 }
 
 /*
  * asc_prt_asc_dvc_var()
  */
-STATIC void
-asc_prt_asc_dvc_var(ASC_DVC_VAR *h)
+static void asc_prt_asc_dvc_var(ASC_DVC_VAR *h)
 {
-    printk("ASC_DVC_VAR at addr 0x%lx\n", (ulong) h);
-
-    printk(
-" iop_base 0x%x, err_code 0x%x, dvc_cntl 0x%x, bug_fix_cntl %d,\n",
-        h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl);
-
-    printk(
-" bus_type %d, isr_callback 0x%lx, exe_callback 0x%lx, init_sdtr 0x%x,\n",
-        h->bus_type, (ulong) h->isr_callback, (ulong) h->exe_callback,
-        (unsigned) h->init_sdtr);
-
-    printk(
-" sdtr_done 0x%x, use_tagged_qng 0x%x, unit_not_ready 0x%x, chip_no 0x%x,\n",
-        (unsigned) h->sdtr_done, (unsigned) h->use_tagged_qng,
-        (unsigned) h->unit_not_ready, (unsigned) h->chip_no);
-
-    printk(
-" queue_full_or_busy 0x%x, start_motor 0x%x, scsi_reset_wait %u,\n",
-        (unsigned) h->queue_full_or_busy, (unsigned) h->start_motor,
-        (unsigned) h->scsi_reset_wait);
-
-    printk(
-" is_in_int %u, max_total_qng %u, cur_total_qng %u, in_critical_cnt %u,\n",
-        (unsigned) h->is_in_int, (unsigned) h->max_total_qng,
-        (unsigned) h->cur_total_qng, (unsigned) h->in_critical_cnt);
-
-    printk(
-" last_q_shortage %u, init_state 0x%x, no_scam 0x%x, pci_fix_asyn_xfer 0x%x,\n",
-        (unsigned) h->last_q_shortage, (unsigned) h->init_state,
-        (unsigned) h->no_scam, (unsigned) h->pci_fix_asyn_xfer);
-
-    printk(
-" cfg 0x%lx, irq_no 0x%x\n",
-        (ulong) h->cfg, (unsigned) h->irq_no);
+       printk("ASC_DVC_VAR at addr 0x%lx\n", (ulong)h);
+
+       printk
+           (" iop_base 0x%x, err_code 0x%x, dvc_cntl 0x%x, bug_fix_cntl %d,\n",
+            h->iop_base, h->err_code, h->dvc_cntl, h->bug_fix_cntl);
+
+       printk
+           (" bus_type %d, isr_callback 0x%lx, exe_callback 0x%lx, init_sdtr 0x%x,\n",
+            h->bus_type, (ulong)h->isr_callback, (ulong)h->exe_callback,
+            (unsigned)h->init_sdtr);
+
+       printk
+           (" sdtr_done 0x%x, use_tagged_qng 0x%x, unit_not_ready 0x%x, chip_no 0x%x,\n",
+            (unsigned)h->sdtr_done, (unsigned)h->use_tagged_qng,
+            (unsigned)h->unit_not_ready, (unsigned)h->chip_no);
+
+       printk
+           (" queue_full_or_busy 0x%x, start_motor 0x%x, scsi_reset_wait %u,\n",
+            (unsigned)h->queue_full_or_busy, (unsigned)h->start_motor,
+            (unsigned)h->scsi_reset_wait);
+
+       printk
+           (" is_in_int %u, max_total_qng %u, cur_total_qng %u, in_critical_cnt %u,\n",
+            (unsigned)h->is_in_int, (unsigned)h->max_total_qng,
+            (unsigned)h->cur_total_qng, (unsigned)h->in_critical_cnt);
+
+       printk
+           (" last_q_shortage %u, init_state 0x%x, no_scam 0x%x, pci_fix_asyn_xfer 0x%x,\n",
+            (unsigned)h->last_q_shortage, (unsigned)h->init_state,
+            (unsigned)h->no_scam, (unsigned)h->pci_fix_asyn_xfer);
+
+       printk(" cfg 0x%lx, irq_no 0x%x\n", (ulong)h->cfg, (unsigned)h->irq_no);
 }
 
 /*
  * asc_prt_asc_dvc_cfg()
  */
-STATIC void
-asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h)
+static void asc_prt_asc_dvc_cfg(ASC_DVC_CFG *h)
 {
-    printk("ASC_DVC_CFG at addr 0x%lx\n", (ulong) h);
-
-    printk(
-" can_tagged_qng 0x%x, cmd_qng_enabled 0x%x,\n",
-            h->can_tagged_qng, h->cmd_qng_enabled);
-    printk(
-" disc_enable 0x%x, sdtr_enable 0x%x,\n",
-            h->disc_enable, h->sdtr_enable);
-
-    printk(
-" chip_scsi_id %d, isa_dma_speed %d, isa_dma_channel %d, chip_version %d,\n",
-             h->chip_scsi_id, h->isa_dma_speed, h->isa_dma_channel,
-             h->chip_version);
-
-    printk(
-" pci_device_id %d, lib_serial_no %u, lib_version %u, mcode_date 0x%x,\n",
-          to_pci_dev(h->dev)->device, h->lib_serial_no, h->lib_version,
-          h->mcode_date);
-
-    printk(
-" mcode_version %d, overrun_buf 0x%lx\n",
-            h->mcode_version, (ulong) h->overrun_buf);
+       printk("ASC_DVC_CFG at addr 0x%lx\n", (ulong)h);
+
+       printk(" can_tagged_qng 0x%x, cmd_qng_enabled 0x%x,\n",
+              h->can_tagged_qng, h->cmd_qng_enabled);
+       printk(" disc_enable 0x%x, sdtr_enable 0x%x,\n",
+              h->disc_enable, h->sdtr_enable);
+
+       printk
+           (" chip_scsi_id %d, isa_dma_speed %d, isa_dma_channel %d, chip_version %d,\n",
+            h->chip_scsi_id, h->isa_dma_speed, h->isa_dma_channel,
+            h->chip_version);
+
+       printk
+           (" pci_device_id %d, lib_serial_no %u, lib_version %u, mcode_date 0x%x,\n",
+            to_pci_dev(h->dev)->device, h->lib_serial_no, h->lib_version,
+            h->mcode_date);
+
+       printk(" mcode_version %d, overrun_buf 0x%lx\n",
+              h->mcode_version, (ulong)h->overrun_buf);
 }
 
 /*
  * asc_prt_asc_scsi_q()
  */
-STATIC void
-asc_prt_asc_scsi_q(ASC_SCSI_Q *q)
+static void asc_prt_asc_scsi_q(ASC_SCSI_Q *q)
 {
-    ASC_SG_HEAD    *sgp;
-    int i;
-
-    printk("ASC_SCSI_Q at addr 0x%lx\n", (ulong) q);
-
-    printk(
-" target_ix 0x%x, target_lun %u, srb_ptr 0x%lx, tag_code 0x%x,\n",
-            q->q2.target_ix, q->q1.target_lun,
-            (ulong) q->q2.srb_ptr, q->q2.tag_code);
-
-    printk(
-" data_addr 0x%lx, data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
-            (ulong) le32_to_cpu(q->q1.data_addr),
-            (ulong) le32_to_cpu(q->q1.data_cnt),
-            (ulong) le32_to_cpu(q->q1.sense_addr), q->q1.sense_len);
-
-    printk(
-" cdbptr 0x%lx, cdb_len %u, sg_head 0x%lx, sg_queue_cnt %u\n",
-            (ulong) q->cdbptr, q->q2.cdb_len,
-            (ulong) q->sg_head, q->q1.sg_queue_cnt);
-
-    if (q->sg_head) {
-        sgp = q->sg_head;
-        printk("ASC_SG_HEAD at addr 0x%lx\n", (ulong) sgp);
-        printk(" entry_cnt %u, queue_cnt %u\n", sgp->entry_cnt, sgp->queue_cnt);
-        for (i = 0; i < sgp->entry_cnt; i++) {
-            printk(" [%u]: addr 0x%lx, bytes %lu\n",
-                i, (ulong) le32_to_cpu(sgp->sg_list[i].addr),
-                (ulong) le32_to_cpu(sgp->sg_list[i].bytes));
-        }
+       ASC_SG_HEAD *sgp;
+       int i;
+
+       printk("ASC_SCSI_Q at addr 0x%lx\n", (ulong)q);
+
+       printk
+           (" target_ix 0x%x, target_lun %u, srb_ptr 0x%lx, tag_code 0x%x,\n",
+            q->q2.target_ix, q->q1.target_lun, (ulong)q->q2.srb_ptr,
+            q->q2.tag_code);
+
+       printk
+           (" data_addr 0x%lx, data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
+            (ulong)le32_to_cpu(q->q1.data_addr),
+            (ulong)le32_to_cpu(q->q1.data_cnt),
+            (ulong)le32_to_cpu(q->q1.sense_addr), q->q1.sense_len);
+
+       printk(" cdbptr 0x%lx, cdb_len %u, sg_head 0x%lx, sg_queue_cnt %u\n",
+              (ulong)q->cdbptr, q->q2.cdb_len,
+              (ulong)q->sg_head, q->q1.sg_queue_cnt);
+
+       if (q->sg_head) {
+               sgp = q->sg_head;
+               printk("ASC_SG_HEAD at addr 0x%lx\n", (ulong)sgp);
+               printk(" entry_cnt %u, queue_cnt %u\n", sgp->entry_cnt,
+                      sgp->queue_cnt);
+               for (i = 0; i < sgp->entry_cnt; i++) {
+                       printk(" [%u]: addr 0x%lx, bytes %lu\n",
+                              i, (ulong)le32_to_cpu(sgp->sg_list[i].addr),
+                              (ulong)le32_to_cpu(sgp->sg_list[i].bytes));
+               }
 
-    }
+       }
 }
 
 /*
  * asc_prt_asc_qdone_info()
  */
-STATIC void
-asc_prt_asc_qdone_info(ASC_QDONE_INFO *q)
+static void asc_prt_asc_qdone_info(ASC_QDONE_INFO *q)
 {
-    printk("ASC_QDONE_INFO at addr 0x%lx\n", (ulong) q);
-    printk(
-" srb_ptr 0x%lx, target_ix %u, cdb_len %u, tag_code %u,\n",
-            (ulong) q->d2.srb_ptr, q->d2.target_ix, q->d2.cdb_len,
-            q->d2.tag_code);
-    printk(
-" done_stat 0x%x, host_stat 0x%x, scsi_stat 0x%x, scsi_msg 0x%x\n",
-            q->d3.done_stat, q->d3.host_stat, q->d3.scsi_stat, q->d3.scsi_msg);
+       printk("ASC_QDONE_INFO at addr 0x%lx\n", (ulong)q);
+       printk(" srb_ptr 0x%lx, target_ix %u, cdb_len %u, tag_code %u,\n",
+              (ulong)q->d2.srb_ptr, q->d2.target_ix, q->d2.cdb_len,
+              q->d2.tag_code);
+       printk
+           (" done_stat 0x%x, host_stat 0x%x, scsi_stat 0x%x, scsi_msg 0x%x\n",
+            q->d3.done_stat, q->d3.host_stat, q->d3.scsi_stat, q->d3.scsi_msg);
 }
 
 /*
@@ -9247,41 +8034,33 @@ asc_prt_asc_qdone_info(ASC_QDONE_INFO *q)
  *
  * Display an ADV_DVC_VAR structure.
  */
-STATIC void
-asc_prt_adv_dvc_var(ADV_DVC_VAR *h)
+static void asc_prt_adv_dvc_var(ADV_DVC_VAR *h)
 {
-    printk(" ADV_DVC_VAR at addr 0x%lx\n", (ulong) h);
-
-    printk(
-"  iop_base 0x%lx, err_code 0x%x, ultra_able 0x%x\n",
-        (ulong) h->iop_base, h->err_code, (unsigned) h->ultra_able);
-
-    printk(
-"  isr_callback 0x%lx, sdtr_able 0x%x, wdtr_able 0x%x\n",
-        (ulong) h->isr_callback, (unsigned) h->sdtr_able,
-        (unsigned) h->wdtr_able);
-
-    printk(
-"  start_motor 0x%x, scsi_reset_wait 0x%x, irq_no 0x%x,\n",
-        (unsigned) h->start_motor,
-        (unsigned) h->scsi_reset_wait, (unsigned) h->irq_no);
-
-    printk(
-"  max_host_qng %u, max_dvc_qng %u, carr_freelist 0x%lxn\n",
-        (unsigned) h->max_host_qng, (unsigned) h->max_dvc_qng,
-        (ulong) h->carr_freelist);
-
-    printk(
-"  icq_sp 0x%lx, irq_sp 0x%lx\n",
-        (ulong) h->icq_sp, (ulong) h->irq_sp);
-
-    printk(
-"  no_scam 0x%x, tagqng_able 0x%x\n",
-        (unsigned) h->no_scam, (unsigned) h->tagqng_able);
-
-    printk(
-"  chip_scsi_id 0x%x, cfg 0x%lx\n",
-        (unsigned) h->chip_scsi_id, (ulong) h->cfg);
+       printk(" ADV_DVC_VAR at addr 0x%lx\n", (ulong)h);
+
+       printk("  iop_base 0x%lx, err_code 0x%x, ultra_able 0x%x\n",
+              (ulong)h->iop_base, h->err_code, (unsigned)h->ultra_able);
+
+       printk("  isr_callback 0x%lx, sdtr_able 0x%x, wdtr_able 0x%x\n",
+              (ulong)h->isr_callback, (unsigned)h->sdtr_able,
+              (unsigned)h->wdtr_able);
+
+       printk("  start_motor 0x%x, scsi_reset_wait 0x%x, irq_no 0x%x,\n",
+              (unsigned)h->start_motor,
+              (unsigned)h->scsi_reset_wait, (unsigned)h->irq_no);
+
+       printk("  max_host_qng %u, max_dvc_qng %u, carr_freelist 0x%lxn\n",
+              (unsigned)h->max_host_qng, (unsigned)h->max_dvc_qng,
+              (ulong)h->carr_freelist);
+
+       printk("  icq_sp 0x%lx, irq_sp 0x%lx\n",
+              (ulong)h->icq_sp, (ulong)h->irq_sp);
+
+       printk("  no_scam 0x%x, tagqng_able 0x%x\n",
+              (unsigned)h->no_scam, (unsigned)h->tagqng_able);
+
+       printk("  chip_scsi_id 0x%x, cfg 0x%lx\n",
+              (unsigned)h->chip_scsi_id, (ulong)h->cfg);
 }
 
 /*
@@ -9289,26 +8068,21 @@ asc_prt_adv_dvc_var(ADV_DVC_VAR *h)
  *
  * Display an ADV_DVC_CFG structure.
  */
-STATIC void
-asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
+static void asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
 {
-    printk(" ADV_DVC_CFG at addr 0x%lx\n", (ulong) h);
+       printk(" ADV_DVC_CFG at addr 0x%lx\n", (ulong)h);
 
-    printk(
-"  disc_enable 0x%x, termination 0x%x\n",
-        h->disc_enable, h->termination);
+       printk("  disc_enable 0x%x, termination 0x%x\n",
+              h->disc_enable, h->termination);
 
-    printk(
-"  chip_version 0x%x, mcode_date 0x%x\n",
-        h->chip_version, h->mcode_date);
+       printk("  chip_version 0x%x, mcode_date 0x%x\n",
+              h->chip_version, h->mcode_date);
 
-    printk(
-"  mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n",
-       h->mcode_version, to_pci_dev(h->dev)->device, h->lib_version);
+       printk("  mcode_version 0x%x, pci_device_id 0x%x, lib_version %u\n",
+              h->mcode_version, to_pci_dev(h->dev)->device, h->lib_version);
 
-    printk(
-"  control_flag 0x%x, pci_slot_info 0x%x\n",
-       h->control_flag, h->pci_slot_info);
+       printk("  control_flag 0x%x, pci_slot_info 0x%x\n",
+              h->control_flag, h->pci_slot_info);
 }
 
 /*
@@ -9316,60 +8090,54 @@ asc_prt_adv_dvc_cfg(ADV_DVC_CFG *h)
  *
  * Display an ADV_SCSI_REQ_Q structure.
  */
-STATIC void
-asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *q)
+static void asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *q)
 {
-    int                 sg_blk_cnt;
-    struct asc_sg_block *sg_ptr;
-
-    printk("ADV_SCSI_REQ_Q at addr 0x%lx\n", (ulong) q);
-
-    printk(
-"  target_id %u, target_lun %u, srb_ptr 0x%lx, a_flag 0x%x\n",
-            q->target_id, q->target_lun, (ulong) q->srb_ptr, q->a_flag);
-
-    printk("  cntl 0x%x, data_addr 0x%lx, vdata_addr 0x%lx\n",
-            q->cntl, (ulong) le32_to_cpu(q->data_addr), (ulong) q->vdata_addr);
-
-    printk(
-"  data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
-            (ulong) le32_to_cpu(q->data_cnt),
-            (ulong) le32_to_cpu(q->sense_addr), q->sense_len);
-
-    printk(
-"  cdb_len %u, done_status 0x%x, host_status 0x%x, scsi_status 0x%x\n",
-            q->cdb_len, q->done_status, q->host_status, q->scsi_status);
-
-    printk(
-"  sg_working_ix 0x%x, target_cmd %u\n",
-            q->sg_working_ix, q->target_cmd);
-
-    printk(
-"  scsiq_rptr 0x%lx, sg_real_addr 0x%lx, sg_list_ptr 0x%lx\n",
-            (ulong) le32_to_cpu(q->scsiq_rptr),
-            (ulong) le32_to_cpu(q->sg_real_addr), (ulong) q->sg_list_ptr);
-
-    /* Display the request's ADV_SG_BLOCK structures. */
-    if (q->sg_list_ptr != NULL)
-    {
-        sg_blk_cnt = 0;
-        while (1) {
-            /*
-             * 'sg_ptr' is a physical address. Convert it to a virtual
-             * address by indexing 'sg_blk_cnt' into the virtual address
-             * array 'sg_list_ptr'.
-             *
-             * XXX - Assumes all SG physical blocks are virtually contiguous.
-             */
-            sg_ptr = &(((ADV_SG_BLOCK *) (q->sg_list_ptr))[sg_blk_cnt]);
-            asc_prt_adv_sgblock(sg_blk_cnt, sg_ptr);
-            if (sg_ptr->sg_ptr == 0)
-            {
-                break;
-            }
-            sg_blk_cnt++;
-        }
-    }
+       int sg_blk_cnt;
+       struct asc_sg_block *sg_ptr;
+
+       printk("ADV_SCSI_REQ_Q at addr 0x%lx\n", (ulong)q);
+
+       printk("  target_id %u, target_lun %u, srb_ptr 0x%lx, a_flag 0x%x\n",
+              q->target_id, q->target_lun, (ulong)q->srb_ptr, q->a_flag);
+
+       printk("  cntl 0x%x, data_addr 0x%lx, vdata_addr 0x%lx\n",
+              q->cntl, (ulong)le32_to_cpu(q->data_addr), (ulong)q->vdata_addr);
+
+       printk("  data_cnt %lu, sense_addr 0x%lx, sense_len %u,\n",
+              (ulong)le32_to_cpu(q->data_cnt),
+              (ulong)le32_to_cpu(q->sense_addr), q->sense_len);
+
+       printk
+           ("  cdb_len %u, done_status 0x%x, host_status 0x%x, scsi_status 0x%x\n",
+            q->cdb_len, q->done_status, q->host_status, q->scsi_status);
+
+       printk("  sg_working_ix 0x%x, target_cmd %u\n",
+              q->sg_working_ix, q->target_cmd);
+
+       printk("  scsiq_rptr 0x%lx, sg_real_addr 0x%lx, sg_list_ptr 0x%lx\n",
+              (ulong)le32_to_cpu(q->scsiq_rptr),
+              (ulong)le32_to_cpu(q->sg_real_addr), (ulong)q->sg_list_ptr);
+
+       /* Display the request's ADV_SG_BLOCK structures. */
+       if (q->sg_list_ptr != NULL) {
+               sg_blk_cnt = 0;
+               while (1) {
+                       /*
+                        * 'sg_ptr' is a physical address. Convert it to a virtual
+                        * address by indexing 'sg_blk_cnt' into the virtual address
+                        * array 'sg_list_ptr'.
+                        *
+                        * XXX - Assumes all SG physical blocks are virtually contiguous.
+                        */
+                       sg_ptr =
+                           &(((ADV_SG_BLOCK *)(q->sg_list_ptr))[sg_blk_cnt]);
+                       asc_prt_adv_sgblock(sg_blk_cnt, sg_ptr);
+                       if (sg_ptr->sg_ptr == 0) {
+                               break;
+                       }
+                       sg_blk_cnt++;
+               }
+       }
 }
 
 /*
@@ -9377,24 +8145,23 @@ asc_prt_adv_scsi_req_q(ADV_SCSI_REQ_Q *q)
  *
  * Display an ADV_SG_BLOCK structure.
  */
-STATIC void
-asc_prt_adv_sgblock(int sgblockno, ADV_SG_BLOCK *b)
+static void asc_prt_adv_sgblock(int sgblockno, ADV_SG_BLOCK *b)
 {
-    int i;
-
-    printk(" ASC_SG_BLOCK at addr 0x%lx (sgblockno %d)\n",
-        (ulong) b, sgblockno);
-    printk("  sg_cnt %u, sg_ptr 0x%lx\n",
-        b->sg_cnt, (ulong) le32_to_cpu(b->sg_ptr));
-    ASC_ASSERT(b->sg_cnt <= NO_OF_SG_PER_BLOCK);
-    if (b->sg_ptr != 0)
-    {
-        ASC_ASSERT(b->sg_cnt == NO_OF_SG_PER_BLOCK);
-    }
-    for (i = 0; i < b->sg_cnt; i++) {
-        printk("  [%u]: sg_addr 0x%lx, sg_count 0x%lx\n",
-            i, (ulong) b->sg_list[i].sg_addr, (ulong) b->sg_list[i].sg_count);
-    }
+       int i;
+
+       printk(" ASC_SG_BLOCK at addr 0x%lx (sgblockno %d)\n",
+              (ulong)b, sgblockno);
+       printk("  sg_cnt %u, sg_ptr 0x%lx\n",
+              b->sg_cnt, (ulong)le32_to_cpu(b->sg_ptr));
+       ASC_ASSERT(b->sg_cnt <= NO_OF_SG_PER_BLOCK);
+       if (b->sg_ptr != 0) {
+               ASC_ASSERT(b->sg_cnt == NO_OF_SG_PER_BLOCK);
+       }
+       for (i = 0; i < b->sg_cnt; i++) {
+               printk("  [%u]: sg_addr 0x%lx, sg_count 0x%lx\n",
+                      i, (ulong)b->sg_list[i].sg_addr,
+                      (ulong)b->sg_list[i].sg_count);
+       }
 }
 
 /*
@@ -9403,55 +8170,55 @@ asc_prt_adv_sgblock(int sgblockno, ADV_SG_BLOCK *b)
  * Print hexadecimal output in 4 byte groupings 32 bytes
  * or 8 double-words per line.
  */
-STATIC void
-asc_prt_hex(char *f, uchar *s, int l)
+static void asc_prt_hex(char *f, uchar *s, int l)
 {
-    int            i;
-    int            j;
-    int            k;
-    int            m;
-
-    printk("%s: (%d bytes)\n", f, l);
-
-    for (i = 0; i < l; i += 32) {
-
-        /* Display a maximum of 8 double-words per line. */
-        if ((k = (l - i) / 4) >= 8) {
-            k = 8;
-            m = 0;
-        } else {
-            m = (l - i) % 4;
-        }
-
-        for (j = 0; j < k; j++) {
-            printk(" %2.2X%2.2X%2.2X%2.2X",
-                (unsigned) s[i+(j*4)], (unsigned) s[i+(j*4)+1],
-                (unsigned) s[i+(j*4)+2], (unsigned) s[i+(j*4)+3]);
-        }
-
-        switch (m) {
-        case 0:
-        default:
-            break;
-        case 1:
-            printk(" %2.2X",
-                (unsigned) s[i+(j*4)]);
-            break;
-        case 2:
-            printk(" %2.2X%2.2X",
-                (unsigned) s[i+(j*4)],
-                (unsigned) s[i+(j*4)+1]);
-            break;
-        case 3:
-            printk(" %2.2X%2.2X%2.2X",
-                (unsigned) s[i+(j*4)+1],
-                (unsigned) s[i+(j*4)+2],
-                (unsigned) s[i+(j*4)+3]);
-            break;
-        }
-
-        printk("\n");
-    }
+       int i;
+       int j;
+       int k;
+       int m;
+
+       printk("%s: (%d bytes)\n", f, l);
+
+       for (i = 0; i < l; i += 32) {
+
+               /* Display a maximum of 8 double-words per line. */
+               if ((k = (l - i) / 4) >= 8) {
+                       k = 8;
+                       m = 0;
+               } else {
+                       m = (l - i) % 4;
+               }
+
+               for (j = 0; j < k; j++) {
+                       printk(" %2.2X%2.2X%2.2X%2.2X",
+                              (unsigned)s[i + (j * 4)],
+                              (unsigned)s[i + (j * 4) + 1],
+                              (unsigned)s[i + (j * 4) + 2],
+                              (unsigned)s[i + (j * 4) + 3]);
+               }
+
+               switch (m) {
+               case 0:
+               default:
+                       break;
+               case 1:
+                       printk(" %2.2X", (unsigned)s[i + (j * 4)]);
+                       break;
+               case 2:
+                       printk(" %2.2X%2.2X",
+                              (unsigned)s[i + (j * 4)],
+                              (unsigned)s[i + (j * 4) + 1]);
+                       break;
+               case 3:
+                       printk(" %2.2X%2.2X%2.2X",
+                              (unsigned)s[i + (j * 4) + 1],
+                              (unsigned)s[i + (j * 4) + 2],
+                              (unsigned)s[i + (j * 4) + 3]);
+                       break;
+               }
+
+               printk("\n");
+       }
 }
 #endif /* ADVANSYS_DEBUG */
 
@@ -9459,3380 +8226,3400 @@ asc_prt_hex(char *f, uchar *s, int l)
  * --- Asc Library Functions
  */
 
-STATIC ushort __init
-AscGetEisaChipCfg(
-                     PortAddr iop_base)
+static ushort __init AscGetEisaChipCfg(PortAddr iop_base)
 {
-    PortAddr            eisa_cfg_iop;
+       PortAddr eisa_cfg_iop;
 
-    eisa_cfg_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
-      (PortAddr) (ASC_EISA_CFG_IOP_MASK);
-    return (inpw(eisa_cfg_iop));
+       eisa_cfg_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
+           (PortAddr) (ASC_EISA_CFG_IOP_MASK);
+       return (inpw(eisa_cfg_iop));
 }
 
-STATIC uchar __init
-AscSetChipScsiID(
-                    PortAddr iop_base,
-                    uchar new_host_id
-)
+static uchar __init AscSetChipScsiID(PortAddr iop_base, uchar new_host_id)
 {
-    ushort              cfg_lsw;
+       ushort cfg_lsw;
 
-    if (AscGetChipScsiID(iop_base) == new_host_id) {
-        return (new_host_id);
-    }
-    cfg_lsw = AscGetChipCfgLsw(iop_base);
-    cfg_lsw &= 0xF8FF;
-    cfg_lsw |= (ushort) ((new_host_id & ASC_MAX_TID) << 8);
-    AscSetChipCfgLsw(iop_base, cfg_lsw);
-    return (AscGetChipScsiID(iop_base));
+       if (AscGetChipScsiID(iop_base) == new_host_id) {
+               return (new_host_id);
+       }
+       cfg_lsw = AscGetChipCfgLsw(iop_base);
+       cfg_lsw &= 0xF8FF;
+       cfg_lsw |= (ushort)((new_host_id & ASC_MAX_TID) << 8);
+       AscSetChipCfgLsw(iop_base, cfg_lsw);
+       return (AscGetChipScsiID(iop_base));
 }
 
-STATIC uchar __init
-AscGetChipScsiCtrl(
-               PortAddr iop_base)
+static uchar __init AscGetChipScsiCtrl(PortAddr iop_base)
 {
-    uchar               sc;
+       uchar sc;
 
-    AscSetBank(iop_base, 1);
-    sc = inp(iop_base + IOP_REG_SC);
-    AscSetBank(iop_base, 0);
-    return (sc);
+       AscSetBank(iop_base, 1);
+       sc = inp(iop_base + IOP_REG_SC);
+       AscSetBank(iop_base, 0);
+       return (sc);
 }
 
-STATIC uchar __init
-AscGetChipVersion(
-                     PortAddr iop_base,
-                     ushort bus_type
-)
+static uchar __init AscGetChipVersion(PortAddr iop_base, ushort bus_type)
 {
-    if ((bus_type & ASC_IS_EISA) != 0) {
-        PortAddr            eisa_iop;
-        uchar               revision;
-        eisa_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
-          (PortAddr) ASC_EISA_REV_IOP_MASK;
-        revision = inp(eisa_iop);
-        return ((uchar) ((ASC_CHIP_MIN_VER_EISA - 1) + revision));
-    }
-    return (AscGetChipVerNo(iop_base));
+       if ((bus_type & ASC_IS_EISA) != 0) {
+               PortAddr eisa_iop;
+               uchar revision;
+               eisa_iop = (PortAddr) ASC_GET_EISA_SLOT(iop_base) |
+                   (PortAddr) ASC_EISA_REV_IOP_MASK;
+               revision = inp(eisa_iop);
+               return ((uchar)((ASC_CHIP_MIN_VER_EISA - 1) + revision));
+       }
+       return (AscGetChipVerNo(iop_base));
 }
 
-STATIC ushort __init
-AscGetChipBusType(
-                     PortAddr iop_base)
+static ushort __init AscGetChipBusType(PortAddr iop_base)
 {
-    ushort              chip_ver;
-
-    chip_ver = AscGetChipVerNo(iop_base);
-    if (
-           (chip_ver >= ASC_CHIP_MIN_VER_VL)
-           && (chip_ver <= ASC_CHIP_MAX_VER_VL)
-) {
-        if (
-               ((iop_base & 0x0C30) == 0x0C30)
-               || ((iop_base & 0x0C50) == 0x0C50)
-) {
-            return (ASC_IS_EISA);
-        }
-        return (ASC_IS_VL);
-    }
-    if ((chip_ver >= ASC_CHIP_MIN_VER_ISA) &&
-        (chip_ver <= ASC_CHIP_MAX_VER_ISA)) {
-        if (chip_ver >= ASC_CHIP_MIN_VER_ISA_PNP) {
-            return (ASC_IS_ISAPNP);
-        }
-        return (ASC_IS_ISA);
-    } else if ((chip_ver >= ASC_CHIP_MIN_VER_PCI) &&
-               (chip_ver <= ASC_CHIP_MAX_VER_PCI)) {
-        return (ASC_IS_PCI);
-    }
-    return (0);
+       ushort chip_ver;
+
+       chip_ver = AscGetChipVerNo(iop_base);
+       if ((chip_ver >= ASC_CHIP_MIN_VER_VL)
+           && (chip_ver <= ASC_CHIP_MAX_VER_VL)
+           ) {
+               if (((iop_base & 0x0C30) == 0x0C30)
+                   || ((iop_base & 0x0C50) == 0x0C50)
+                   ) {
+                       return (ASC_IS_EISA);
+               }
+               return (ASC_IS_VL);
+       }
+       if ((chip_ver >= ASC_CHIP_MIN_VER_ISA) &&
+           (chip_ver <= ASC_CHIP_MAX_VER_ISA)) {
+               if (chip_ver >= ASC_CHIP_MIN_VER_ISA_PNP) {
+                       return (ASC_IS_ISAPNP);
+               }
+               return (ASC_IS_ISA);
+       } else if ((chip_ver >= ASC_CHIP_MIN_VER_PCI) &&
+                  (chip_ver <= ASC_CHIP_MAX_VER_PCI)) {
+               return (ASC_IS_PCI);
+       }
+       return (0);
 }
 
-STATIC ASC_DCNT
-AscLoadMicroCode(
-                    PortAddr iop_base,
-                    ushort s_addr,
-                    uchar *mcode_buf,
-                    ushort mcode_size
-)
+static ASC_DCNT
+AscLoadMicroCode(PortAddr iop_base,
+                ushort s_addr, uchar *mcode_buf, ushort mcode_size)
 {
-    ASC_DCNT            chksum;
-    ushort              mcode_word_size;
-    ushort              mcode_chksum;
-
-    /* Write the microcode buffer starting at LRAM address 0. */
-    mcode_word_size = (ushort) (mcode_size >> 1);
-    AscMemWordSetLram(iop_base, s_addr, 0, mcode_word_size);
-    AscMemWordCopyPtrToLram(iop_base, s_addr, mcode_buf, mcode_word_size);
-
-    chksum = AscMemSumLramWord(iop_base, s_addr, mcode_word_size);
-    ASC_DBG1(1, "AscLoadMicroCode: chksum 0x%lx\n", (ulong) chksum);
-    mcode_chksum = (ushort) AscMemSumLramWord(iop_base,
-          (ushort) ASC_CODE_SEC_BEG,
-          (ushort) ((mcode_size - s_addr - (ushort) ASC_CODE_SEC_BEG) / 2));
-    ASC_DBG1(1, "AscLoadMicroCode: mcode_chksum 0x%lx\n",
-        (ulong) mcode_chksum);
-    AscWriteLramWord(iop_base, ASCV_MCODE_CHKSUM_W, mcode_chksum);
-    AscWriteLramWord(iop_base, ASCV_MCODE_SIZE_W, mcode_size);
-    return (chksum);
+       ASC_DCNT chksum;
+       ushort mcode_word_size;
+       ushort mcode_chksum;
+
+       /* Write the microcode buffer starting at LRAM address 0. */
+       mcode_word_size = (ushort)(mcode_size >> 1);
+       AscMemWordSetLram(iop_base, s_addr, 0, mcode_word_size);
+       AscMemWordCopyPtrToLram(iop_base, s_addr, mcode_buf, mcode_word_size);
+
+       chksum = AscMemSumLramWord(iop_base, s_addr, mcode_word_size);
+       ASC_DBG1(1, "AscLoadMicroCode: chksum 0x%lx\n", (ulong)chksum);
+       mcode_chksum = (ushort)AscMemSumLramWord(iop_base,
+                                                (ushort)ASC_CODE_SEC_BEG,
+                                                (ushort)((mcode_size -
+                                                          s_addr - (ushort)
+                                                          ASC_CODE_SEC_BEG) /
+                                                         2));
+       ASC_DBG1(1, "AscLoadMicroCode: mcode_chksum 0x%lx\n",
+                (ulong)mcode_chksum);
+       AscWriteLramWord(iop_base, ASCV_MCODE_CHKSUM_W, mcode_chksum);
+       AscWriteLramWord(iop_base, ASCV_MCODE_SIZE_W, mcode_size);
+       return (chksum);
 }
 
-STATIC int
-AscFindSignature(
-                    PortAddr iop_base
-)
+static int AscFindSignature(PortAddr iop_base)
 {
-    ushort              sig_word;
-
-    ASC_DBG2(1, "AscFindSignature: AscGetChipSignatureByte(0x%x) 0x%x\n",
-        iop_base, AscGetChipSignatureByte(iop_base));
-    if (AscGetChipSignatureByte(iop_base) == (uchar) ASC_1000_ID1B) {
-        ASC_DBG2(1, "AscFindSignature: AscGetChipSignatureWord(0x%x) 0x%x\n",
-            iop_base, AscGetChipSignatureWord(iop_base));
-        sig_word = AscGetChipSignatureWord(iop_base);
-        if ((sig_word == (ushort) ASC_1000_ID0W) ||
-            (sig_word == (ushort) ASC_1000_ID0W_FIX)) {
-            return (1);
-        }
-    }
-    return (0);
+       ushort sig_word;
+
+       ASC_DBG2(1, "AscFindSignature: AscGetChipSignatureByte(0x%x) 0x%x\n",
+                iop_base, AscGetChipSignatureByte(iop_base));
+       if (AscGetChipSignatureByte(iop_base) == (uchar)ASC_1000_ID1B) {
+               ASC_DBG2(1,
+                        "AscFindSignature: AscGetChipSignatureWord(0x%x) 0x%x\n",
+                        iop_base, AscGetChipSignatureWord(iop_base));
+               sig_word = AscGetChipSignatureWord(iop_base);
+               if ((sig_word == (ushort)ASC_1000_ID0W) ||
+                   (sig_word == (ushort)ASC_1000_ID0W_FIX)) {
+                       return (1);
+               }
+       }
+       return (0);
 }
 
-STATIC PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] __initdata =
-{
-    0x100, ASC_IOADR_1, 0x120, ASC_IOADR_2, 0x140, ASC_IOADR_3, ASC_IOADR_4,
-    ASC_IOADR_5, ASC_IOADR_6, ASC_IOADR_7, ASC_IOADR_8
+static PortAddr _asc_def_iop_base[ASC_IOADR_TABLE_MAX_IX] __initdata = {
+       0x100, ASC_IOADR_1, 0x120, ASC_IOADR_2, 0x140, ASC_IOADR_3, ASC_IOADR_4,
+       ASC_IOADR_5, ASC_IOADR_6, ASC_IOADR_7, ASC_IOADR_8
 };
 
 #ifdef CONFIG_ISA
-STATIC uchar _isa_pnp_inited __initdata = 0;
+static uchar _isa_pnp_inited __initdata = 0;
 
-STATIC PortAddr __init
-AscSearchIOPortAddr(
-                       PortAddr iop_beg,
-                       ushort bus_type)
+static PortAddr __init AscSearchIOPortAddr(PortAddr iop_beg, ushort bus_type)
 {
-    if (bus_type & ASC_IS_VL) {
-        while ((iop_beg = AscSearchIOPortAddr11(iop_beg)) != 0) {
-            if (AscGetChipVersion(iop_beg, bus_type) <= ASC_CHIP_MAX_VER_VL) {
-                return (iop_beg);
-            }
-        }
-        return (0);
-    }
-    if (bus_type & ASC_IS_ISA) {
-        if (_isa_pnp_inited == 0) {
-            AscSetISAPNPWaitForKey();
-            _isa_pnp_inited++;
-        }
-        while ((iop_beg = AscSearchIOPortAddr11(iop_beg)) != 0) {
-            if ((AscGetChipVersion(iop_beg, bus_type) & ASC_CHIP_VER_ISA_BIT) != 0) {
-                return (iop_beg);
-            }
-        }
-        return (0);
-    }
-    if (bus_type & ASC_IS_EISA) {
-        if ((iop_beg = AscSearchIOPortAddrEISA(iop_beg)) != 0) {
-            return (iop_beg);
-        }
-        return (0);
-    }
-    return (0);
+       if (bus_type & ASC_IS_VL) {
+               while ((iop_beg = AscSearchIOPortAddr11(iop_beg)) != 0) {
+                       if (AscGetChipVersion(iop_beg, bus_type) <=
+                           ASC_CHIP_MAX_VER_VL) {
+                               return (iop_beg);
+                       }
+               }
+               return (0);
+       }
+       if (bus_type & ASC_IS_ISA) {
+               if (_isa_pnp_inited == 0) {
+                       AscSetISAPNPWaitForKey();
+                       _isa_pnp_inited++;
+               }
+               while ((iop_beg = AscSearchIOPortAddr11(iop_beg)) != 0) {
+                       if ((AscGetChipVersion(iop_beg, bus_type) &
+                            ASC_CHIP_VER_ISA_BIT) != 0) {
+                               return (iop_beg);
+                       }
+               }
+               return (0);
+       }
+       if (bus_type & ASC_IS_EISA) {
+               if ((iop_beg = AscSearchIOPortAddrEISA(iop_beg)) != 0) {
+                       return (iop_beg);
+               }
+               return (0);
+       }
+       return (0);
 }
 
-STATIC PortAddr __init
-AscSearchIOPortAddr11(
-                         PortAddr s_addr
-)
+static PortAddr __init AscSearchIOPortAddr11(PortAddr s_addr)
 {
-    int                 i;
-    PortAddr            iop_base;
+       int i;
+       PortAddr iop_base;
 
-    for (i = 0; i < ASC_IOADR_TABLE_MAX_IX; i++) {
-        if (_asc_def_iop_base[i] > s_addr) {
-            break;
-        }
-    }
-    for (; i < ASC_IOADR_TABLE_MAX_IX; i++) {
-        iop_base = _asc_def_iop_base[i];
-       if (!request_region(iop_base, ASC_IOADR_GAP, "advansys")){
-            ASC_DBG1(1,
-               "AscSearchIOPortAddr11: check_region() failed I/O port 0x%x\n",
-                     iop_base);
-            continue;
-        }
-        ASC_DBG1(1, "AscSearchIOPortAddr11: probing I/O port 0x%x\n", iop_base);
-       release_region(iop_base, ASC_IOADR_GAP);
-        if (AscFindSignature(iop_base)) {
-            return (iop_base);
-        }
-    }
-    return (0);
+       for (i = 0; i < ASC_IOADR_TABLE_MAX_IX; i++) {
+               if (_asc_def_iop_base[i] > s_addr) {
+                       break;
+               }
+       }
+       for (; i < ASC_IOADR_TABLE_MAX_IX; i++) {
+               iop_base = _asc_def_iop_base[i];
+               if (!request_region(iop_base, ASC_IOADR_GAP, "advansys")) {
+                       ASC_DBG1(1,
+                                "AscSearchIOPortAddr11: check_region() failed I/O port 0x%x\n",
+                                iop_base);
+                       continue;
+               }
+               ASC_DBG1(1, "AscSearchIOPortAddr11: probing I/O port 0x%x\n",
+                        iop_base);
+               release_region(iop_base, ASC_IOADR_GAP);
+               if (AscFindSignature(iop_base)) {
+                       return (iop_base);
+               }
+       }
+       return (0);
 }
 
-STATIC void __init
-AscSetISAPNPWaitForKey(void)
+static void __init AscSetISAPNPWaitForKey(void)
 {
-    outp(ASC_ISA_PNP_PORT_ADDR, 0x02);
-    outp(ASC_ISA_PNP_PORT_WRITE, 0x02);
-    return;
+       outp(ASC_ISA_PNP_PORT_ADDR, 0x02);
+       outp(ASC_ISA_PNP_PORT_WRITE, 0x02);
+       return;
 }
 #endif /* CONFIG_ISA */
 
-STATIC void __init
-AscToggleIRQAct(
-                   PortAddr iop_base
-)
+static void __init AscToggleIRQAct(PortAddr iop_base)
 {
-    AscSetChipStatus(iop_base, CIW_IRQ_ACT);
-    AscSetChipStatus(iop_base, 0);
-    return;
+       AscSetChipStatus(iop_base, CIW_IRQ_ACT);
+       AscSetChipStatus(iop_base, 0);
+       return;
 }
 
-STATIC uchar __init
-AscGetChipIRQ(
-                 PortAddr iop_base,
-                 ushort bus_type)
+static uchar __init AscGetChipIRQ(PortAddr iop_base, ushort bus_type)
 {
-    ushort              cfg_lsw;
-    uchar               chip_irq;
-
-    if ((bus_type & ASC_IS_EISA) != 0) {
-        cfg_lsw = AscGetEisaChipCfg(iop_base);
-        chip_irq = (uchar) (((cfg_lsw >> 8) & 0x07) + 10);
-        if ((chip_irq == 13) || (chip_irq > 15)) {
-            return (0);
-        }
-        return (chip_irq);
-    }
-    if ((bus_type & ASC_IS_VL) != 0) {
-        cfg_lsw = AscGetChipCfgLsw(iop_base);
-        chip_irq = (uchar) (((cfg_lsw >> 2) & 0x07));
-        if ((chip_irq == 0) ||
-            (chip_irq == 4) ||
-            (chip_irq == 7)) {
-            return (0);
-        }
-        return ((uchar) (chip_irq + (ASC_MIN_IRQ_NO - 1)));
-    }
-    cfg_lsw = AscGetChipCfgLsw(iop_base);
-    chip_irq = (uchar) (((cfg_lsw >> 2) & 0x03));
-    if (chip_irq == 3)
-        chip_irq += (uchar) 2;
-    return ((uchar) (chip_irq + ASC_MIN_IRQ_NO));
+       ushort cfg_lsw;
+       uchar chip_irq;
+
+       if ((bus_type & ASC_IS_EISA) != 0) {
+               cfg_lsw = AscGetEisaChipCfg(iop_base);
+               chip_irq = (uchar)(((cfg_lsw >> 8) & 0x07) + 10);
+               if ((chip_irq == 13) || (chip_irq > 15)) {
+                       return (0);
+               }
+               return (chip_irq);
+       }
+       if ((bus_type & ASC_IS_VL) != 0) {
+               cfg_lsw = AscGetChipCfgLsw(iop_base);
+               chip_irq = (uchar)(((cfg_lsw >> 2) & 0x07));
+               if ((chip_irq == 0) || (chip_irq == 4) || (chip_irq == 7)) {
+                       return (0);
+               }
+               return ((uchar)(chip_irq + (ASC_MIN_IRQ_NO - 1)));
+       }
+       cfg_lsw = AscGetChipCfgLsw(iop_base);
+       chip_irq = (uchar)(((cfg_lsw >> 2) & 0x03));
+       if (chip_irq == 3)
+               chip_irq += (uchar)2;
+       return ((uchar)(chip_irq + ASC_MIN_IRQ_NO));
 }
 
-STATIC uchar __init
-AscSetChipIRQ(
-                 PortAddr iop_base,
-                 uchar irq_no,
-                 ushort bus_type)
+static uchar __init
+AscSetChipIRQ(PortAddr iop_base, uchar irq_no, ushort bus_type)
 {
-    ushort              cfg_lsw;
-
-    if ((bus_type & ASC_IS_VL) != 0) {
-        if (irq_no != 0) {
-            if ((irq_no < ASC_MIN_IRQ_NO) || (irq_no > ASC_MAX_IRQ_NO)) {
-                irq_no = 0;
-            } else {
-                irq_no -= (uchar) ((ASC_MIN_IRQ_NO - 1));
-            }
-        }
-        cfg_lsw = (ushort) (AscGetChipCfgLsw(iop_base) & 0xFFE3);
-        cfg_lsw |= (ushort) 0x0010;
-        AscSetChipCfgLsw(iop_base, cfg_lsw);
-        AscToggleIRQAct(iop_base);
-        cfg_lsw = (ushort) (AscGetChipCfgLsw(iop_base) & 0xFFE0);
-        cfg_lsw |= (ushort) ((irq_no & 0x07) << 2);
-        AscSetChipCfgLsw(iop_base, cfg_lsw);
-        AscToggleIRQAct(iop_base);
-        return (AscGetChipIRQ(iop_base, bus_type));
-    }
-    if ((bus_type & (ASC_IS_ISA)) != 0) {
-        if (irq_no == 15)
-            irq_no -= (uchar) 2;
-        irq_no -= (uchar) ASC_MIN_IRQ_NO;
-        cfg_lsw = (ushort) (AscGetChipCfgLsw(iop_base) & 0xFFF3);
-        cfg_lsw |= (ushort) ((irq_no & 0x03) << 2);
-        AscSetChipCfgLsw(iop_base, cfg_lsw);
-        return (AscGetChipIRQ(iop_base, bus_type));
-    }
-    return (0);
+       ushort cfg_lsw;
+
+       if ((bus_type & ASC_IS_VL) != 0) {
+               if (irq_no != 0) {
+                       if ((irq_no < ASC_MIN_IRQ_NO)
+                           || (irq_no > ASC_MAX_IRQ_NO)) {
+                               irq_no = 0;
+                       } else {
+                               irq_no -= (uchar)((ASC_MIN_IRQ_NO - 1));
+                       }
+               }
+               cfg_lsw = (ushort)(AscGetChipCfgLsw(iop_base) & 0xFFE3);
+               cfg_lsw |= (ushort)0x0010;
+               AscSetChipCfgLsw(iop_base, cfg_lsw);
+               AscToggleIRQAct(iop_base);
+               cfg_lsw = (ushort)(AscGetChipCfgLsw(iop_base) & 0xFFE0);
+               cfg_lsw |= (ushort)((irq_no & 0x07) << 2);
+               AscSetChipCfgLsw(iop_base, cfg_lsw);
+               AscToggleIRQAct(iop_base);
+               return (AscGetChipIRQ(iop_base, bus_type));
+       }
+       if ((bus_type & (ASC_IS_ISA)) != 0) {
+               if (irq_no == 15)
+                       irq_no -= (uchar)2;
+               irq_no -= (uchar)ASC_MIN_IRQ_NO;
+               cfg_lsw = (ushort)(AscGetChipCfgLsw(iop_base) & 0xFFF3);
+               cfg_lsw |= (ushort)((irq_no & 0x03) << 2);
+               AscSetChipCfgLsw(iop_base, cfg_lsw);
+               return (AscGetChipIRQ(iop_base, bus_type));
+       }
+       return (0);
 }
 
 #ifdef CONFIG_ISA
-STATIC void __init
-AscEnableIsaDma(
-                   uchar dma_channel)
+static void __init AscEnableIsaDma(uchar dma_channel)
 {
-    if (dma_channel < 4) {
-        outp(0x000B, (ushort) (0xC0 | dma_channel));
-        outp(0x000A, dma_channel);
-    } else if (dma_channel < 8) {
-        outp(0x00D6, (ushort) (0xC0 | (dma_channel - 4)));
-        outp(0x00D4, (ushort) (dma_channel - 4));
-    }
-    return;
+       if (dma_channel < 4) {
+               outp(0x000B, (ushort)(0xC0 | dma_channel));
+               outp(0x000A, dma_channel);
+       } else if (dma_channel < 8) {
+               outp(0x00D6, (ushort)(0xC0 | (dma_channel - 4)));
+               outp(0x00D4, (ushort)(dma_channel - 4));
+       }
+       return;
 }
 #endif /* CONFIG_ISA */
 
-STATIC int
-AscIsrChipHalted(
-                    ASC_DVC_VAR *asc_dvc
-)
+static int AscIsrChipHalted(ASC_DVC_VAR *asc_dvc)
 {
-    EXT_MSG             ext_msg;
-    EXT_MSG             out_msg;
-    ushort              halt_q_addr;
-    int                 sdtr_accept;
-    ushort              int_halt_code;
-    ASC_SCSI_BIT_ID_TYPE scsi_busy;
-    ASC_SCSI_BIT_ID_TYPE target_id;
-    PortAddr            iop_base;
-    uchar               tag_code;
-    uchar               q_status;
-    uchar               halt_qp;
-    uchar               sdtr_data;
-    uchar               target_ix;
-    uchar               q_cntl, tid_no;
-    uchar               cur_dvc_qng;
-    uchar               asyn_sdtr;
-    uchar               scsi_status;
-    asc_board_t         *boardp;
-
-    ASC_ASSERT(asc_dvc->drv_ptr != NULL);
-    boardp = asc_dvc->drv_ptr;
-
-    iop_base = asc_dvc->iop_base;
-    int_halt_code = AscReadLramWord(iop_base, ASCV_HALTCODE_W);
-
-    halt_qp = AscReadLramByte(iop_base, ASCV_CURCDB_B);
-    halt_q_addr = ASC_QNO_TO_QADDR(halt_qp);
-    target_ix = AscReadLramByte(iop_base,
-                   (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_TARGET_IX));
-    q_cntl = AscReadLramByte(iop_base,
-                        (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_CNTL));
-    tid_no = ASC_TIX_TO_TID(target_ix);
-    target_id = (uchar) ASC_TID_TO_TARGET_ID(tid_no);
-    if (asc_dvc->pci_fix_asyn_xfer & target_id) {
-        asyn_sdtr = ASYN_SDTR_DATA_FIX_PCI_REV_AB;
-    } else {
-        asyn_sdtr = 0;
-    }
-    if (int_halt_code == ASC_HALT_DISABLE_ASYN_USE_SYN_FIX) {
-        if (asc_dvc->pci_fix_asyn_xfer & target_id) {
-            AscSetChipSDTR(iop_base, 0, tid_no);
-            boardp->sdtr_data[tid_no] = 0;
-        }
-        AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-        return (0);
-    } else if (int_halt_code == ASC_HALT_ENABLE_ASYN_USE_SYN_FIX) {
-        if (asc_dvc->pci_fix_asyn_xfer & target_id) {
-            AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
-            boardp->sdtr_data[tid_no] = asyn_sdtr;
-        }
-        AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-        return (0);
-    } else if (int_halt_code == ASC_HALT_EXTMSG_IN) {
-
-        AscMemWordCopyPtrFromLram(iop_base,
-                               ASCV_MSGIN_BEG,
-                               (uchar *) &ext_msg,
-                               sizeof(EXT_MSG) >> 1);
-
-        if (ext_msg.msg_type == MS_EXTEND &&
-            ext_msg.msg_req == MS_SDTR_CODE &&
-            ext_msg.msg_len == MS_SDTR_LEN) {
-            sdtr_accept = TRUE;
-            if ((ext_msg.req_ack_offset > ASC_SYN_MAX_OFFSET)) {
-
-                sdtr_accept = FALSE;
-                ext_msg.req_ack_offset = ASC_SYN_MAX_OFFSET;
-            }
-            if ((ext_msg.xfer_period <
-                 asc_dvc->sdtr_period_tbl[asc_dvc->host_init_sdtr_index]) ||
-                (ext_msg.xfer_period >
-                 asc_dvc->sdtr_period_tbl[asc_dvc->max_sdtr_index])) {
-                sdtr_accept = FALSE;
-                ext_msg.xfer_period =
-                    asc_dvc->sdtr_period_tbl[asc_dvc->host_init_sdtr_index];
-            }
-            if (sdtr_accept) {
-                sdtr_data = AscCalSDTRData(asc_dvc, ext_msg.xfer_period,
-                                           ext_msg.req_ack_offset);
-                if ((sdtr_data == 0xFF)) {
-
-                    q_cntl |= QC_MSG_OUT;
-                    asc_dvc->init_sdtr &= ~target_id;
-                    asc_dvc->sdtr_done &= ~target_id;
-                    AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
-                    boardp->sdtr_data[tid_no] = asyn_sdtr;
-                }
-            }
-            if (ext_msg.req_ack_offset == 0) {
-
-                q_cntl &= ~QC_MSG_OUT;
-                asc_dvc->init_sdtr &= ~target_id;
-                asc_dvc->sdtr_done &= ~target_id;
-                AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
-            } else {
-                if (sdtr_accept && (q_cntl & QC_MSG_OUT)) {
-
-                    q_cntl &= ~QC_MSG_OUT;
-                    asc_dvc->sdtr_done |= target_id;
-                    asc_dvc->init_sdtr |= target_id;
-                    asc_dvc->pci_fix_asyn_xfer &= ~target_id;
-                    sdtr_data = AscCalSDTRData(asc_dvc, ext_msg.xfer_period,
-                                               ext_msg.req_ack_offset);
-                    AscSetChipSDTR(iop_base, sdtr_data, tid_no);
-                    boardp->sdtr_data[tid_no] = sdtr_data;
-                } else {
-
-                    q_cntl |= QC_MSG_OUT;
-                    AscMsgOutSDTR(asc_dvc,
-                                  ext_msg.xfer_period,
-                                  ext_msg.req_ack_offset);
-                    asc_dvc->pci_fix_asyn_xfer &= ~target_id;
-                    sdtr_data = AscCalSDTRData(asc_dvc, ext_msg.xfer_period,
-                                               ext_msg.req_ack_offset);
-                    AscSetChipSDTR(iop_base, sdtr_data, tid_no);
-                    boardp->sdtr_data[tid_no] = sdtr_data;
-                    asc_dvc->sdtr_done |= target_id;
-                    asc_dvc->init_sdtr |= target_id;
-                }
-            }
-
-            AscWriteLramByte(iop_base,
-                         (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_CNTL),
-                             q_cntl);
-            AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-            return (0);
-        } else if (ext_msg.msg_type == MS_EXTEND &&
-                   ext_msg.msg_req == MS_WDTR_CODE &&
-                   ext_msg.msg_len == MS_WDTR_LEN) {
-
-            ext_msg.wdtr_width = 0;
-            AscMemWordCopyPtrToLram(iop_base,
-                                 ASCV_MSGOUT_BEG,
-                                 (uchar *) &ext_msg,
-                                 sizeof(EXT_MSG) >> 1);
-            q_cntl |= QC_MSG_OUT;
-            AscWriteLramByte(iop_base,
-                         (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_CNTL),
-                             q_cntl);
-            AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-            return (0);
-        } else {
-
-            ext_msg.msg_type = MESSAGE_REJECT;
-            AscMemWordCopyPtrToLram(iop_base,
-                                 ASCV_MSGOUT_BEG,
-                                 (uchar *) &ext_msg,
-                                 sizeof(EXT_MSG) >> 1);
-            q_cntl |= QC_MSG_OUT;
-            AscWriteLramByte(iop_base,
-                         (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_CNTL),
-                             q_cntl);
-            AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-            return (0);
-        }
-    } else if (int_halt_code == ASC_HALT_CHK_CONDITION) {
-
-        q_cntl |= QC_REQ_SENSE;
-
-        if ((asc_dvc->init_sdtr & target_id) != 0) {
-
-            asc_dvc->sdtr_done &= ~target_id;
-
-            sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
-            q_cntl |= QC_MSG_OUT;
-            AscMsgOutSDTR(asc_dvc,
-                          asc_dvc->sdtr_period_tbl[(sdtr_data >> 4) &
-                           (uchar) (asc_dvc->max_sdtr_index - 1)],
-                          (uchar) (sdtr_data & (uchar) ASC_SYN_MAX_OFFSET));
-        }
-
-        AscWriteLramByte(iop_base,
-                         (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_CNTL),
-                         q_cntl);
-
-        tag_code = AscReadLramByte(iop_base,
-                    (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_TAG_CODE));
-        tag_code &= 0xDC;
-        if (
-               (asc_dvc->pci_fix_asyn_xfer & target_id)
-               && !(asc_dvc->pci_fix_asyn_xfer_always & target_id)
-) {
-
-            tag_code |= (ASC_TAG_FLAG_DISABLE_DISCONNECT
-                         | ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX);
-
-        }
-        AscWriteLramByte(iop_base,
-                     (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_TAG_CODE),
-                         tag_code);
-
-        q_status = AscReadLramByte(iop_base,
-                      (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_STATUS));
-        q_status |= (QS_READY | QS_BUSY);
-        AscWriteLramByte(iop_base,
-                       (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_STATUS),
-                         q_status);
-
-        scsi_busy = AscReadLramByte(iop_base,
-                                    (ushort) ASCV_SCSIBUSY_B);
-        scsi_busy &= ~target_id;
-        AscWriteLramByte(iop_base, (ushort) ASCV_SCSIBUSY_B, scsi_busy);
-
-        AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-        return (0);
-    } else if (int_halt_code == ASC_HALT_SDTR_REJECTED) {
-
-        AscMemWordCopyPtrFromLram(iop_base,
-                               ASCV_MSGOUT_BEG,
-                               (uchar *) &out_msg,
-                               sizeof(EXT_MSG) >> 1);
-
-        if ((out_msg.msg_type == MS_EXTEND) &&
-            (out_msg.msg_len == MS_SDTR_LEN) &&
-            (out_msg.msg_req == MS_SDTR_CODE)) {
-
-            asc_dvc->init_sdtr &= ~target_id;
-            asc_dvc->sdtr_done &= ~target_id;
-            AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
-            boardp->sdtr_data[tid_no] = asyn_sdtr;
-        }
-        q_cntl &= ~QC_MSG_OUT;
-        AscWriteLramByte(iop_base,
-                         (ushort) (halt_q_addr + (ushort) ASC_SCSIQ_B_CNTL),
-                         q_cntl);
-        AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-        return (0);
-    } else if (int_halt_code == ASC_HALT_SS_QUEUE_FULL) {
-
-        scsi_status = AscReadLramByte(iop_base,
-          (ushort) ((ushort) halt_q_addr + (ushort) ASC_SCSIQ_SCSI_STATUS));
-        cur_dvc_qng = AscReadLramByte(iop_base,
-                     (ushort) ((ushort) ASC_QADR_BEG + (ushort) target_ix));
-        if ((cur_dvc_qng > 0) &&
-            (asc_dvc->cur_dvc_qng[tid_no] > 0)) {
-
-            scsi_busy = AscReadLramByte(iop_base,
-                                        (ushort) ASCV_SCSIBUSY_B);
-            scsi_busy |= target_id;
-            AscWriteLramByte(iop_base,
-                             (ushort) ASCV_SCSIBUSY_B, scsi_busy);
-            asc_dvc->queue_full_or_busy |= target_id;
-
-            if (scsi_status == SAM_STAT_TASK_SET_FULL) {
-                if (cur_dvc_qng > ASC_MIN_TAGGED_CMD) {
-                    cur_dvc_qng -= 1;
-                    asc_dvc->max_dvc_qng[tid_no] = cur_dvc_qng;
-
-                    AscWriteLramByte(iop_base,
-                          (ushort) ((ushort) ASCV_MAX_DVC_QNG_BEG +
-                           (ushort) tid_no),
-                          cur_dvc_qng);
-
-                    /*
-                     * Set the device queue depth to the number of
-                     * active requests when the QUEUE FULL condition
-                     * was encountered.
-                     */
-                    boardp->queue_full |= target_id;
-                    boardp->queue_full_cnt[tid_no] = cur_dvc_qng;
-                }
-            }
-        }
-        AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-        return (0);
-    }
+       EXT_MSG ext_msg;
+       EXT_MSG out_msg;
+       ushort halt_q_addr;
+       int sdtr_accept;
+       ushort int_halt_code;
+       ASC_SCSI_BIT_ID_TYPE scsi_busy;
+       ASC_SCSI_BIT_ID_TYPE target_id;
+       PortAddr iop_base;
+       uchar tag_code;
+       uchar q_status;
+       uchar halt_qp;
+       uchar sdtr_data;
+       uchar target_ix;
+       uchar q_cntl, tid_no;
+       uchar cur_dvc_qng;
+       uchar asyn_sdtr;
+       uchar scsi_status;
+       asc_board_t *boardp;
+
+       ASC_ASSERT(asc_dvc->drv_ptr != NULL);
+       boardp = asc_dvc->drv_ptr;
+
+       iop_base = asc_dvc->iop_base;
+       int_halt_code = AscReadLramWord(iop_base, ASCV_HALTCODE_W);
+
+       halt_qp = AscReadLramByte(iop_base, ASCV_CURCDB_B);
+       halt_q_addr = ASC_QNO_TO_QADDR(halt_qp);
+       target_ix = AscReadLramByte(iop_base,
+                                   (ushort)(halt_q_addr +
+                                            (ushort)ASC_SCSIQ_B_TARGET_IX));
+       q_cntl =
+           AscReadLramByte(iop_base,
+                           (ushort)(halt_q_addr + (ushort)ASC_SCSIQ_B_CNTL));
+       tid_no = ASC_TIX_TO_TID(target_ix);
+       target_id = (uchar)ASC_TID_TO_TARGET_ID(tid_no);
+       if (asc_dvc->pci_fix_asyn_xfer & target_id) {
+               asyn_sdtr = ASYN_SDTR_DATA_FIX_PCI_REV_AB;
+       } else {
+               asyn_sdtr = 0;
+       }
+       if (int_halt_code == ASC_HALT_DISABLE_ASYN_USE_SYN_FIX) {
+               if (asc_dvc->pci_fix_asyn_xfer & target_id) {
+                       AscSetChipSDTR(iop_base, 0, tid_no);
+                       boardp->sdtr_data[tid_no] = 0;
+               }
+               AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+               return (0);
+       } else if (int_halt_code == ASC_HALT_ENABLE_ASYN_USE_SYN_FIX) {
+               if (asc_dvc->pci_fix_asyn_xfer & target_id) {
+                       AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
+                       boardp->sdtr_data[tid_no] = asyn_sdtr;
+               }
+               AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+               return (0);
+       } else if (int_halt_code == ASC_HALT_EXTMSG_IN) {
+
+               AscMemWordCopyPtrFromLram(iop_base,
+                                         ASCV_MSGIN_BEG,
+                                         (uchar *)&ext_msg,
+                                         sizeof(EXT_MSG) >> 1);
+
+               if (ext_msg.msg_type == MS_EXTEND &&
+                   ext_msg.msg_req == MS_SDTR_CODE &&
+                   ext_msg.msg_len == MS_SDTR_LEN) {
+                       sdtr_accept = TRUE;
+                       if ((ext_msg.req_ack_offset > ASC_SYN_MAX_OFFSET)) {
+
+                               sdtr_accept = FALSE;
+                               ext_msg.req_ack_offset = ASC_SYN_MAX_OFFSET;
+                       }
+                       if ((ext_msg.xfer_period <
+                            asc_dvc->sdtr_period_tbl[asc_dvc->
+                                                     host_init_sdtr_index])
+                           || (ext_msg.xfer_period >
+                               asc_dvc->sdtr_period_tbl[asc_dvc->
+                                                        max_sdtr_index])) {
+                               sdtr_accept = FALSE;
+                               ext_msg.xfer_period =
+                                   asc_dvc->sdtr_period_tbl[asc_dvc->
+                                                            host_init_sdtr_index];
+                       }
+                       if (sdtr_accept) {
+                               sdtr_data =
+                                   AscCalSDTRData(asc_dvc, ext_msg.xfer_period,
+                                                  ext_msg.req_ack_offset);
+                               if ((sdtr_data == 0xFF)) {
+
+                                       q_cntl |= QC_MSG_OUT;
+                                       asc_dvc->init_sdtr &= ~target_id;
+                                       asc_dvc->sdtr_done &= ~target_id;
+                                       AscSetChipSDTR(iop_base, asyn_sdtr,
+                                                      tid_no);
+                                       boardp->sdtr_data[tid_no] = asyn_sdtr;
+                               }
+                       }
+                       if (ext_msg.req_ack_offset == 0) {
+
+                               q_cntl &= ~QC_MSG_OUT;
+                               asc_dvc->init_sdtr &= ~target_id;
+                               asc_dvc->sdtr_done &= ~target_id;
+                               AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
+                       } else {
+                               if (sdtr_accept && (q_cntl & QC_MSG_OUT)) {
+
+                                       q_cntl &= ~QC_MSG_OUT;
+                                       asc_dvc->sdtr_done |= target_id;
+                                       asc_dvc->init_sdtr |= target_id;
+                                       asc_dvc->pci_fix_asyn_xfer &=
+                                           ~target_id;
+                                       sdtr_data =
+                                           AscCalSDTRData(asc_dvc,
+                                                          ext_msg.xfer_period,
+                                                          ext_msg.
+                                                          req_ack_offset);
+                                       AscSetChipSDTR(iop_base, sdtr_data,
+                                                      tid_no);
+                                       boardp->sdtr_data[tid_no] = sdtr_data;
+                               } else {
+
+                                       q_cntl |= QC_MSG_OUT;
+                                       AscMsgOutSDTR(asc_dvc,
+                                                     ext_msg.xfer_period,
+                                                     ext_msg.req_ack_offset);
+                                       asc_dvc->pci_fix_asyn_xfer &=
+                                           ~target_id;
+                                       sdtr_data =
+                                           AscCalSDTRData(asc_dvc,
+                                                          ext_msg.xfer_period,
+                                                          ext_msg.
+                                                          req_ack_offset);
+                                       AscSetChipSDTR(iop_base, sdtr_data,
+                                                      tid_no);
+                                       boardp->sdtr_data[tid_no] = sdtr_data;
+                                       asc_dvc->sdtr_done |= target_id;
+                                       asc_dvc->init_sdtr |= target_id;
+                               }
+                       }
+
+                       AscWriteLramByte(iop_base,
+                                        (ushort)(halt_q_addr +
+                                                 (ushort)ASC_SCSIQ_B_CNTL),
+                                        q_cntl);
+                       AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+                       return (0);
+               } else if (ext_msg.msg_type == MS_EXTEND &&
+                          ext_msg.msg_req == MS_WDTR_CODE &&
+                          ext_msg.msg_len == MS_WDTR_LEN) {
+
+                       ext_msg.wdtr_width = 0;
+                       AscMemWordCopyPtrToLram(iop_base,
+                                               ASCV_MSGOUT_BEG,
+                                               (uchar *)&ext_msg,
+                                               sizeof(EXT_MSG) >> 1);
+                       q_cntl |= QC_MSG_OUT;
+                       AscWriteLramByte(iop_base,
+                                        (ushort)(halt_q_addr +
+                                                 (ushort)ASC_SCSIQ_B_CNTL),
+                                        q_cntl);
+                       AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+                       return (0);
+               } else {
+
+                       ext_msg.msg_type = MESSAGE_REJECT;
+                       AscMemWordCopyPtrToLram(iop_base,
+                                               ASCV_MSGOUT_BEG,
+                                               (uchar *)&ext_msg,
+                                               sizeof(EXT_MSG) >> 1);
+                       q_cntl |= QC_MSG_OUT;
+                       AscWriteLramByte(iop_base,
+                                        (ushort)(halt_q_addr +
+                                                 (ushort)ASC_SCSIQ_B_CNTL),
+                                        q_cntl);
+                       AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+                       return (0);
+               }
+       } else if (int_halt_code == ASC_HALT_CHK_CONDITION) {
+
+               q_cntl |= QC_REQ_SENSE;
+
+               if ((asc_dvc->init_sdtr & target_id) != 0) {
+
+                       asc_dvc->sdtr_done &= ~target_id;
+
+                       sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
+                       q_cntl |= QC_MSG_OUT;
+                       AscMsgOutSDTR(asc_dvc,
+                                     asc_dvc->
+                                     sdtr_period_tbl[(sdtr_data >> 4) &
+                                                     (uchar)(asc_dvc->
+                                                             max_sdtr_index -
+                                                             1)],
+                                     (uchar)(sdtr_data & (uchar)
+                                             ASC_SYN_MAX_OFFSET));
+               }
+
+               AscWriteLramByte(iop_base,
+                                (ushort)(halt_q_addr +
+                                         (ushort)ASC_SCSIQ_B_CNTL), q_cntl);
+
+               tag_code = AscReadLramByte(iop_base,
+                                          (ushort)(halt_q_addr + (ushort)
+                                                   ASC_SCSIQ_B_TAG_CODE));
+               tag_code &= 0xDC;
+               if ((asc_dvc->pci_fix_asyn_xfer & target_id)
+                   && !(asc_dvc->pci_fix_asyn_xfer_always & target_id)
+                   ) {
+
+                       tag_code |= (ASC_TAG_FLAG_DISABLE_DISCONNECT
+                                    | ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX);
+
+               }
+               AscWriteLramByte(iop_base,
+                                (ushort)(halt_q_addr +
+                                         (ushort)ASC_SCSIQ_B_TAG_CODE),
+                                tag_code);
+
+               q_status = AscReadLramByte(iop_base,
+                                          (ushort)(halt_q_addr + (ushort)
+                                                   ASC_SCSIQ_B_STATUS));
+               q_status |= (QS_READY | QS_BUSY);
+               AscWriteLramByte(iop_base,
+                                (ushort)(halt_q_addr +
+                                         (ushort)ASC_SCSIQ_B_STATUS),
+                                q_status);
+
+               scsi_busy = AscReadLramByte(iop_base, (ushort)ASCV_SCSIBUSY_B);
+               scsi_busy &= ~target_id;
+               AscWriteLramByte(iop_base, (ushort)ASCV_SCSIBUSY_B, scsi_busy);
+
+               AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+               return (0);
+       } else if (int_halt_code == ASC_HALT_SDTR_REJECTED) {
+
+               AscMemWordCopyPtrFromLram(iop_base,
+                                         ASCV_MSGOUT_BEG,
+                                         (uchar *)&out_msg,
+                                         sizeof(EXT_MSG) >> 1);
+
+               if ((out_msg.msg_type == MS_EXTEND) &&
+                   (out_msg.msg_len == MS_SDTR_LEN) &&
+                   (out_msg.msg_req == MS_SDTR_CODE)) {
+
+                       asc_dvc->init_sdtr &= ~target_id;
+                       asc_dvc->sdtr_done &= ~target_id;
+                       AscSetChipSDTR(iop_base, asyn_sdtr, tid_no);
+                       boardp->sdtr_data[tid_no] = asyn_sdtr;
+               }
+               q_cntl &= ~QC_MSG_OUT;
+               AscWriteLramByte(iop_base,
+                                (ushort)(halt_q_addr +
+                                         (ushort)ASC_SCSIQ_B_CNTL), q_cntl);
+               AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+               return (0);
+       } else if (int_halt_code == ASC_HALT_SS_QUEUE_FULL) {
+
+               scsi_status = AscReadLramByte(iop_base,
+                                             (ushort)((ushort)halt_q_addr +
+                                                      (ushort)
+                                                      ASC_SCSIQ_SCSI_STATUS));
+               cur_dvc_qng =
+                   AscReadLramByte(iop_base,
+                                   (ushort)((ushort)ASC_QADR_BEG +
+                                            (ushort)target_ix));
+               if ((cur_dvc_qng > 0) && (asc_dvc->cur_dvc_qng[tid_no] > 0)) {
+
+                       scsi_busy = AscReadLramByte(iop_base,
+                                                   (ushort)ASCV_SCSIBUSY_B);
+                       scsi_busy |= target_id;
+                       AscWriteLramByte(iop_base,
+                                        (ushort)ASCV_SCSIBUSY_B, scsi_busy);
+                       asc_dvc->queue_full_or_busy |= target_id;
+
+                       if (scsi_status == SAM_STAT_TASK_SET_FULL) {
+                               if (cur_dvc_qng > ASC_MIN_TAGGED_CMD) {
+                                       cur_dvc_qng -= 1;
+                                       asc_dvc->max_dvc_qng[tid_no] =
+                                           cur_dvc_qng;
+
+                                       AscWriteLramByte(iop_base,
+                                                        (ushort)((ushort)
+                                                                 ASCV_MAX_DVC_QNG_BEG
+                                                                 + (ushort)
+                                                                 tid_no),
+                                                        cur_dvc_qng);
+
+                                       /*
+                                        * Set the device queue depth to the number of
+                                        * active requests when the QUEUE FULL condition
+                                        * was encountered.
+                                        */
+                                       boardp->queue_full |= target_id;
+                                       boardp->queue_full_cnt[tid_no] =
+                                           cur_dvc_qng;
+                               }
+                       }
+               }
+               AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+               return (0);
+       }
 #if CC_VERY_LONG_SG_LIST
-    else if (int_halt_code == ASC_HALT_HOST_COPY_SG_LIST_TO_RISC)
-    {
-        uchar              q_no;
-        ushort             q_addr;
-        uchar              sg_wk_q_no;
-        uchar              first_sg_wk_q_no;
-        ASC_SCSI_Q         *scsiq; /* Ptr to driver request. */
-        ASC_SG_HEAD        *sg_head; /* Ptr to driver SG request. */
-        ASC_SG_LIST_Q      scsi_sg_q; /* Structure written to queue. */
-        ushort             sg_list_dwords;
-        ushort             sg_entry_cnt;
-        uchar              next_qp;
-        int                i;
-
-        q_no = AscReadLramByte(iop_base, (ushort) ASCV_REQ_SG_LIST_QP);
-        if (q_no == ASC_QLINK_END)
-        {
-            return(0);
-        }
-
-        q_addr = ASC_QNO_TO_QADDR(q_no);
-
-        /*
-         * Convert the request's SRB pointer to a host ASC_SCSI_REQ
-         * structure pointer using a macro provided by the driver.
-         * The ASC_SCSI_REQ pointer provides a pointer to the
-         * host ASC_SG_HEAD structure.
-         */
-        /* Read request's SRB pointer. */
-        scsiq = (ASC_SCSI_Q *)
-           ASC_SRB2SCSIQ(
-               ASC_U32_TO_VADDR(AscReadLramDWord(iop_base,
-               (ushort) (q_addr + ASC_SCSIQ_D_SRBPTR))));
-
-        /*
-         * Get request's first and working SG queue.
-         */
-        sg_wk_q_no = AscReadLramByte(iop_base,
-            (ushort) (q_addr + ASC_SCSIQ_B_SG_WK_QP));
-
-        first_sg_wk_q_no = AscReadLramByte(iop_base,
-            (ushort) (q_addr + ASC_SCSIQ_B_FIRST_SG_WK_QP));
-
-        /*
-         * Reset request's working SG queue back to the
-         * first SG queue.
-         */
-        AscWriteLramByte(iop_base,
-            (ushort) (q_addr + (ushort) ASC_SCSIQ_B_SG_WK_QP),
-            first_sg_wk_q_no);
-
-        sg_head = scsiq->sg_head;
-
-        /*
-         * Set sg_entry_cnt to the number of SG elements
-         * that will be completed on this interrupt.
-         *
-         * Note: The allocated SG queues contain ASC_MAX_SG_LIST - 1
-         * SG elements. The data_cnt and data_addr fields which
-         * add 1 to the SG element capacity are not used when
-         * restarting SG handling after a halt.
-         */
-        if (scsiq->remain_sg_entry_cnt > (ASC_MAX_SG_LIST - 1))
-        {
-             sg_entry_cnt = ASC_MAX_SG_LIST - 1;
-
-             /*
-              * Keep track of remaining number of SG elements that will
-              * need to be handled on the next interrupt.
-              */
-             scsiq->remain_sg_entry_cnt -= (ASC_MAX_SG_LIST - 1);
-        } else
-        {
-             sg_entry_cnt = scsiq->remain_sg_entry_cnt;
-             scsiq->remain_sg_entry_cnt = 0;
-        }
-
-        /*
-         * Copy SG elements into the list of allocated SG queues.
-         *
-         * Last index completed is saved in scsiq->next_sg_index.
-         */
-        next_qp = first_sg_wk_q_no;
-        q_addr = ASC_QNO_TO_QADDR(next_qp);
-        scsi_sg_q.sg_head_qp = q_no;
-        scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
-        for( i = 0; i < sg_head->queue_cnt; i++)
-        {
-             scsi_sg_q.seq_no = i + 1;
-             if (sg_entry_cnt > ASC_SG_LIST_PER_Q)
-             {
-                 sg_list_dwords = (uchar) (ASC_SG_LIST_PER_Q * 2);
-                 sg_entry_cnt -= ASC_SG_LIST_PER_Q;
-                 /*
-                  * After very first SG queue RISC FW uses next
-                  * SG queue first element then checks sg_list_cnt
-                  * against zero and then decrements, so set
-                  * sg_list_cnt 1 less than number of SG elements
-                  * in each SG queue.
-                  */
-                 scsi_sg_q.sg_list_cnt = ASC_SG_LIST_PER_Q - 1;
-                 scsi_sg_q.sg_cur_list_cnt = ASC_SG_LIST_PER_Q - 1;
-             } else {
-                 /*
-                  * This is the last SG queue in the list of
-                  * allocated SG queues. If there are more
-                  * SG elements than will fit in the allocated
-                  * queues, then set the QCSG_SG_XFER_MORE flag.
-                  */
-                 if (scsiq->remain_sg_entry_cnt != 0)
-                 {
-                     scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
-                 } else
-                 {
-                     scsi_sg_q.cntl |= QCSG_SG_XFER_END;
-                 }
-                 /* equals sg_entry_cnt * 2 */
-                 sg_list_dwords = sg_entry_cnt << 1;
-                 scsi_sg_q.sg_list_cnt = sg_entry_cnt - 1;
-                 scsi_sg_q.sg_cur_list_cnt = sg_entry_cnt - 1;
-                 sg_entry_cnt = 0;
-             }
-
-             scsi_sg_q.q_no = next_qp;
-             AscMemWordCopyPtrToLram(iop_base,
-                          q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
-                          (uchar *) &scsi_sg_q,
-                          sizeof(ASC_SG_LIST_Q) >> 1);
-
-             AscMemDWordCopyPtrToLram(iop_base,
-                          q_addr + ASC_SGQ_LIST_BEG,
-                          (uchar *) &sg_head->sg_list[scsiq->next_sg_index],
-                          sg_list_dwords);
-
-             scsiq->next_sg_index += ASC_SG_LIST_PER_Q;
-
-             /*
-              * If the just completed SG queue contained the
-              * last SG element, then no more SG queues need
-              * to be written.
-              */
-             if (scsi_sg_q.cntl & QCSG_SG_XFER_END)
-             {
-                 break;
-             }
-
-             next_qp = AscReadLramByte( iop_base,
-                          ( ushort )( q_addr+ASC_SCSIQ_B_FWD ) );
-             q_addr = ASC_QNO_TO_QADDR( next_qp );
-        }
-
-        /*
-         * Clear the halt condition so the RISC will be restarted
-         * after the return.
-         */
-        AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-        return(0);
-    }
+       else if (int_halt_code == ASC_HALT_HOST_COPY_SG_LIST_TO_RISC) {
+               uchar q_no;
+               ushort q_addr;
+               uchar sg_wk_q_no;
+               uchar first_sg_wk_q_no;
+               ASC_SCSI_Q *scsiq;      /* Ptr to driver request. */
+               ASC_SG_HEAD *sg_head;   /* Ptr to driver SG request. */
+               ASC_SG_LIST_Q scsi_sg_q;        /* Structure written to queue. */
+               ushort sg_list_dwords;
+               ushort sg_entry_cnt;
+               uchar next_qp;
+               int i;
+
+               q_no = AscReadLramByte(iop_base, (ushort)ASCV_REQ_SG_LIST_QP);
+               if (q_no == ASC_QLINK_END) {
+                       return (0);
+               }
+
+               q_addr = ASC_QNO_TO_QADDR(q_no);
+
+               /*
+                * Convert the request's SRB pointer to a host ASC_SCSI_REQ
+                * structure pointer using a macro provided by the driver.
+                * The ASC_SCSI_REQ pointer provides a pointer to the
+                * host ASC_SG_HEAD structure.
+                */
+               /* Read request's SRB pointer. */
+               scsiq = (ASC_SCSI_Q *)
+                   ASC_SRB2SCSIQ(ASC_U32_TO_VADDR(AscReadLramDWord(iop_base,
+                                                                   (ushort)
+                                                                   (q_addr +
+                                                                    ASC_SCSIQ_D_SRBPTR))));
+
+               /*
+                * Get request's first and working SG queue.
+                */
+               sg_wk_q_no = AscReadLramByte(iop_base,
+                                            (ushort)(q_addr +
+                                                     ASC_SCSIQ_B_SG_WK_QP));
+
+               first_sg_wk_q_no = AscReadLramByte(iop_base,
+                                                  (ushort)(q_addr +
+                                                           ASC_SCSIQ_B_FIRST_SG_WK_QP));
+
+               /*
+                * Reset request's working SG queue back to the
+                * first SG queue.
+                */
+               AscWriteLramByte(iop_base,
+                                (ushort)(q_addr +
+                                         (ushort)ASC_SCSIQ_B_SG_WK_QP),
+                                first_sg_wk_q_no);
+
+               sg_head = scsiq->sg_head;
+
+               /*
+                * Set sg_entry_cnt to the number of SG elements
+                * that will be completed on this interrupt.
+                *
+                * Note: The allocated SG queues contain ASC_MAX_SG_LIST - 1
+                * SG elements. The data_cnt and data_addr fields which
+                * add 1 to the SG element capacity are not used when
+                * restarting SG handling after a halt.
+                */
+               if (scsiq->remain_sg_entry_cnt > (ASC_MAX_SG_LIST - 1)) {
+                       sg_entry_cnt = ASC_MAX_SG_LIST - 1;
+
+                       /*
+                        * Keep track of remaining number of SG elements that will
+                        * need to be handled on the next interrupt.
+                        */
+                       scsiq->remain_sg_entry_cnt -= (ASC_MAX_SG_LIST - 1);
+               } else {
+                       sg_entry_cnt = scsiq->remain_sg_entry_cnt;
+                       scsiq->remain_sg_entry_cnt = 0;
+               }
+
+               /*
+                * Copy SG elements into the list of allocated SG queues.
+                *
+                * Last index completed is saved in scsiq->next_sg_index.
+                */
+               next_qp = first_sg_wk_q_no;
+               q_addr = ASC_QNO_TO_QADDR(next_qp);
+               scsi_sg_q.sg_head_qp = q_no;
+               scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
+               for (i = 0; i < sg_head->queue_cnt; i++) {
+                       scsi_sg_q.seq_no = i + 1;
+                       if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
+                               sg_list_dwords = (uchar)(ASC_SG_LIST_PER_Q * 2);
+                               sg_entry_cnt -= ASC_SG_LIST_PER_Q;
+                               /*
+                                * After very first SG queue RISC FW uses next
+                                * SG queue first element then checks sg_list_cnt
+                                * against zero and then decrements, so set
+                                * sg_list_cnt 1 less than number of SG elements
+                                * in each SG queue.
+                                */
+                               scsi_sg_q.sg_list_cnt = ASC_SG_LIST_PER_Q - 1;
+                               scsi_sg_q.sg_cur_list_cnt =
+                                   ASC_SG_LIST_PER_Q - 1;
+                       } else {
+                               /*
+                                * This is the last SG queue in the list of
+                                * allocated SG queues. If there are more
+                                * SG elements than will fit in the allocated
+                                * queues, then set the QCSG_SG_XFER_MORE flag.
+                                */
+                               if (scsiq->remain_sg_entry_cnt != 0) {
+                                       scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
+                               } else {
+                                       scsi_sg_q.cntl |= QCSG_SG_XFER_END;
+                               }
+                               /* equals sg_entry_cnt * 2 */
+                               sg_list_dwords = sg_entry_cnt << 1;
+                               scsi_sg_q.sg_list_cnt = sg_entry_cnt - 1;
+                               scsi_sg_q.sg_cur_list_cnt = sg_entry_cnt - 1;
+                               sg_entry_cnt = 0;
+                       }
+
+                       scsi_sg_q.q_no = next_qp;
+                       AscMemWordCopyPtrToLram(iop_base,
+                                               q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
+                                               (uchar *)&scsi_sg_q,
+                                               sizeof(ASC_SG_LIST_Q) >> 1);
+
+                       AscMemDWordCopyPtrToLram(iop_base,
+                                                q_addr + ASC_SGQ_LIST_BEG,
+                                                (uchar *)&sg_head->
+                                                sg_list[scsiq->next_sg_index],
+                                                sg_list_dwords);
+
+                       scsiq->next_sg_index += ASC_SG_LIST_PER_Q;
+
+                       /*
+                        * If the just completed SG queue contained the
+                        * last SG element, then no more SG queues need
+                        * to be written.
+                        */
+                       if (scsi_sg_q.cntl & QCSG_SG_XFER_END) {
+                               break;
+                       }
+
+                       next_qp = AscReadLramByte(iop_base,
+                                                 (ushort)(q_addr +
+                                                          ASC_SCSIQ_B_FWD));
+                       q_addr = ASC_QNO_TO_QADDR(next_qp);
+               }
+
+               /*
+                * Clear the halt condition so the RISC will be restarted
+                * after the return.
+                */
+               AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+               return (0);
+       }
 #endif /* CC_VERY_LONG_SG_LIST */
-    return (0);
+       return (0);
 }
 
-STATIC uchar
-_AscCopyLramScsiDoneQ(
-                         PortAddr iop_base,
-                         ushort q_addr,
-                         ASC_QDONE_INFO * scsiq,
-                         ASC_DCNT max_dma_count
-)
+static uchar
+_AscCopyLramScsiDoneQ(PortAddr iop_base,
+                     ushort q_addr,
+                     ASC_QDONE_INFO *scsiq, ASC_DCNT max_dma_count)
 {
-    ushort              _val;
-    uchar               sg_queue_cnt;
-
-    DvcGetQinfo(iop_base,
-                q_addr + ASC_SCSIQ_DONE_INFO_BEG,
-                (uchar *) scsiq,
-                (sizeof (ASC_SCSIQ_2) + sizeof (ASC_SCSIQ_3)) / 2);
-
-    _val = AscReadLramWord(iop_base,
-                           (ushort) (q_addr + (ushort) ASC_SCSIQ_B_STATUS));
-    scsiq->q_status = (uchar) _val;
-    scsiq->q_no = (uchar) (_val >> 8);
-    _val = AscReadLramWord(iop_base,
-                           (ushort) (q_addr + (ushort) ASC_SCSIQ_B_CNTL));
-    scsiq->cntl = (uchar) _val;
-    sg_queue_cnt = (uchar) (_val >> 8);
-    _val = AscReadLramWord(iop_base,
-                        (ushort) (q_addr + (ushort) ASC_SCSIQ_B_SENSE_LEN));
-    scsiq->sense_len = (uchar) _val;
-    scsiq->extra_bytes = (uchar) (_val >> 8);
-
-    /*
-     * Read high word of remain bytes from alternate location.
-     */
-    scsiq->remain_bytes = (((ADV_DCNT) AscReadLramWord( iop_base,
-                      (ushort) (q_addr+ (ushort) ASC_SCSIQ_W_ALT_DC1))) << 16);
-    /*
-     * Read low word of remain bytes from original location.
-     */
-    scsiq->remain_bytes += AscReadLramWord(iop_base,
-        (ushort) (q_addr+ (ushort) ASC_SCSIQ_DW_REMAIN_XFER_CNT));
-
-    scsiq->remain_bytes &= max_dma_count;
-    return (sg_queue_cnt);
+       ushort _val;
+       uchar sg_queue_cnt;
+
+       DvcGetQinfo(iop_base,
+                   q_addr + ASC_SCSIQ_DONE_INFO_BEG,
+                   (uchar *)scsiq,
+                   (sizeof(ASC_SCSIQ_2) + sizeof(ASC_SCSIQ_3)) / 2);
+
+       _val = AscReadLramWord(iop_base,
+                              (ushort)(q_addr + (ushort)ASC_SCSIQ_B_STATUS));
+       scsiq->q_status = (uchar)_val;
+       scsiq->q_no = (uchar)(_val >> 8);
+       _val = AscReadLramWord(iop_base,
+                              (ushort)(q_addr + (ushort)ASC_SCSIQ_B_CNTL));
+       scsiq->cntl = (uchar)_val;
+       sg_queue_cnt = (uchar)(_val >> 8);
+       _val = AscReadLramWord(iop_base,
+                              (ushort)(q_addr +
+                                       (ushort)ASC_SCSIQ_B_SENSE_LEN));
+       scsiq->sense_len = (uchar)_val;
+       scsiq->extra_bytes = (uchar)(_val >> 8);
+
+       /*
+        * Read high word of remain bytes from alternate location.
+        */
+       scsiq->remain_bytes = (((ADV_DCNT)AscReadLramWord(iop_base,
+                                                         (ushort)(q_addr +
+                                                                  (ushort)
+                                                                  ASC_SCSIQ_W_ALT_DC1)))
+                              << 16);
+       /*
+        * Read low word of remain bytes from original location.
+        */
+       scsiq->remain_bytes += AscReadLramWord(iop_base,
+                                              (ushort)(q_addr + (ushort)
+                                                       ASC_SCSIQ_DW_REMAIN_XFER_CNT));
+
+       scsiq->remain_bytes &= max_dma_count;
+       return (sg_queue_cnt);
 }
 
-STATIC int
-AscIsrQDone(
-               ASC_DVC_VAR *asc_dvc
-)
+static int AscIsrQDone(ASC_DVC_VAR *asc_dvc)
 {
-    uchar               next_qp;
-    uchar               n_q_used;
-    uchar               sg_list_qp;
-    uchar               sg_queue_cnt;
-    uchar               q_cnt;
-    uchar               done_q_tail;
-    uchar               tid_no;
-    ASC_SCSI_BIT_ID_TYPE scsi_busy;
-    ASC_SCSI_BIT_ID_TYPE target_id;
-    PortAddr            iop_base;
-    ushort              q_addr;
-    ushort              sg_q_addr;
-    uchar               cur_target_qng;
-    ASC_QDONE_INFO      scsiq_buf;
-    ASC_QDONE_INFO *scsiq;
-    int                 false_overrun;
-    ASC_ISR_CALLBACK    asc_isr_callback;
-
-    iop_base = asc_dvc->iop_base;
-    asc_isr_callback = asc_dvc->isr_callback;
-    n_q_used = 1;
-    scsiq = (ASC_QDONE_INFO *) & scsiq_buf;
-    done_q_tail = (uchar) AscGetVarDoneQTail(iop_base);
-    q_addr = ASC_QNO_TO_QADDR(done_q_tail);
-    next_qp = AscReadLramByte(iop_base,
-                              (ushort) (q_addr + (ushort) ASC_SCSIQ_B_FWD));
-    if (next_qp != ASC_QLINK_END) {
-        AscPutVarDoneQTail(iop_base, next_qp);
-        q_addr = ASC_QNO_TO_QADDR(next_qp);
-        sg_queue_cnt = _AscCopyLramScsiDoneQ(iop_base, q_addr, scsiq,
-            asc_dvc->max_dma_count);
-        AscWriteLramByte(iop_base,
-                         (ushort) (q_addr + (ushort) ASC_SCSIQ_B_STATUS),
-             (uchar) (scsiq->q_status & (uchar) ~ (QS_READY | QS_ABORTED)));
-        tid_no = ASC_TIX_TO_TID(scsiq->d2.target_ix);
-        target_id = ASC_TIX_TO_TARGET_ID(scsiq->d2.target_ix);
-        if ((scsiq->cntl & QC_SG_HEAD) != 0) {
-            sg_q_addr = q_addr;
-            sg_list_qp = next_qp;
-            for (q_cnt = 0; q_cnt < sg_queue_cnt; q_cnt++) {
-                sg_list_qp = AscReadLramByte(iop_base,
-                           (ushort) (sg_q_addr + (ushort) ASC_SCSIQ_B_FWD));
-                sg_q_addr = ASC_QNO_TO_QADDR(sg_list_qp);
-                if (sg_list_qp == ASC_QLINK_END) {
-                    AscSetLibErrorCode(asc_dvc, ASCQ_ERR_SG_Q_LINKS);
-                    scsiq->d3.done_stat = QD_WITH_ERROR;
-                    scsiq->d3.host_stat = QHSTA_D_QDONE_SG_LIST_CORRUPTED;
-                    goto FATAL_ERR_QDONE;
-                }
-                AscWriteLramByte(iop_base,
-                         (ushort) (sg_q_addr + (ushort) ASC_SCSIQ_B_STATUS),
-                                 QS_FREE);
-            }
-            n_q_used = sg_queue_cnt + 1;
-            AscPutVarDoneQTail(iop_base, sg_list_qp);
-        }
-        if (asc_dvc->queue_full_or_busy & target_id) {
-            cur_target_qng = AscReadLramByte(iop_base,
-            (ushort) ((ushort) ASC_QADR_BEG + (ushort) scsiq->d2.target_ix));
-            if (cur_target_qng < asc_dvc->max_dvc_qng[tid_no]) {
-                scsi_busy = AscReadLramByte(iop_base,
-                                            (ushort) ASCV_SCSIBUSY_B);
-                scsi_busy &= ~target_id;
-                AscWriteLramByte(iop_base,
-                                 (ushort) ASCV_SCSIBUSY_B, scsi_busy);
-                asc_dvc->queue_full_or_busy &= ~target_id;
-            }
-        }
-        if (asc_dvc->cur_total_qng >= n_q_used) {
-            asc_dvc->cur_total_qng -= n_q_used;
-            if (asc_dvc->cur_dvc_qng[tid_no] != 0) {
-                asc_dvc->cur_dvc_qng[tid_no]--;
-            }
-        } else {
-            AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CUR_QNG);
-            scsiq->d3.done_stat = QD_WITH_ERROR;
-            goto FATAL_ERR_QDONE;
-        }
-        if ((scsiq->d2.srb_ptr == 0UL) ||
-            ((scsiq->q_status & QS_ABORTED) != 0)) {
-            return (0x11);
-        } else if (scsiq->q_status == QS_DONE) {
-            false_overrun = FALSE;
-            if (scsiq->extra_bytes != 0) {
-                scsiq->remain_bytes += (ADV_DCNT) scsiq->extra_bytes;
-            }
-            if (scsiq->d3.done_stat == QD_WITH_ERROR) {
-                if (scsiq->d3.host_stat == QHSTA_M_DATA_OVER_RUN) {
-                    if ((scsiq->cntl & (QC_DATA_IN | QC_DATA_OUT)) == 0) {
-                        scsiq->d3.done_stat = QD_NO_ERROR;
-                        scsiq->d3.host_stat = QHSTA_NO_ERROR;
-                    } else if (false_overrun) {
-                        scsiq->d3.done_stat = QD_NO_ERROR;
-                        scsiq->d3.host_stat = QHSTA_NO_ERROR;
-                    }
-                } else if (scsiq->d3.host_stat ==
-                           QHSTA_M_HUNG_REQ_SCSI_BUS_RESET) {
-                    AscStopChip(iop_base);
-                    AscSetChipControl(iop_base,
-                        (uchar) (CC_SCSI_RESET | CC_HALT));
-                    DvcDelayNanoSecond(asc_dvc, 60000);
-                    AscSetChipControl(iop_base, CC_HALT);
-                    AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
-                    AscSetChipStatus(iop_base, 0);
-                    AscSetChipControl(iop_base, 0);
-                }
-            }
-            if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
-                (*asc_isr_callback) (asc_dvc, scsiq);
-            } else {
-                if ((AscReadLramByte(iop_base,
-                          (ushort) (q_addr + (ushort) ASC_SCSIQ_CDB_BEG)) ==
-                     START_STOP)) {
-                    asc_dvc->unit_not_ready &= ~target_id;
-                    if (scsiq->d3.done_stat != QD_NO_ERROR) {
-                        asc_dvc->start_motor &= ~target_id;
-                    }
-                }
-            }
-            return (1);
-        } else {
-            AscSetLibErrorCode(asc_dvc, ASCQ_ERR_Q_STATUS);
-          FATAL_ERR_QDONE:
-            if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
-                (*asc_isr_callback) (asc_dvc, scsiq);
-            }
-            return (0x80);
-        }
-    }
-    return (0);
+       uchar next_qp;
+       uchar n_q_used;
+       uchar sg_list_qp;
+       uchar sg_queue_cnt;
+       uchar q_cnt;
+       uchar done_q_tail;
+       uchar tid_no;
+       ASC_SCSI_BIT_ID_TYPE scsi_busy;
+       ASC_SCSI_BIT_ID_TYPE target_id;
+       PortAddr iop_base;
+       ushort q_addr;
+       ushort sg_q_addr;
+       uchar cur_target_qng;
+       ASC_QDONE_INFO scsiq_buf;
+       ASC_QDONE_INFO *scsiq;
+       int false_overrun;
+       ASC_ISR_CALLBACK asc_isr_callback;
+
+       iop_base = asc_dvc->iop_base;
+       asc_isr_callback = asc_dvc->isr_callback;
+       n_q_used = 1;
+       scsiq = (ASC_QDONE_INFO *)&scsiq_buf;
+       done_q_tail = (uchar)AscGetVarDoneQTail(iop_base);
+       q_addr = ASC_QNO_TO_QADDR(done_q_tail);
+       next_qp = AscReadLramByte(iop_base,
+                                 (ushort)(q_addr + (ushort)ASC_SCSIQ_B_FWD));
+       if (next_qp != ASC_QLINK_END) {
+               AscPutVarDoneQTail(iop_base, next_qp);
+               q_addr = ASC_QNO_TO_QADDR(next_qp);
+               sg_queue_cnt = _AscCopyLramScsiDoneQ(iop_base, q_addr, scsiq,
+                                                    asc_dvc->max_dma_count);
+               AscWriteLramByte(iop_base,
+                                (ushort)(q_addr +
+                                         (ushort)ASC_SCSIQ_B_STATUS),
+                                (uchar)(scsiq->
+                                        q_status & (uchar)~(QS_READY |
+                                                            QS_ABORTED)));
+               tid_no = ASC_TIX_TO_TID(scsiq->d2.target_ix);
+               target_id = ASC_TIX_TO_TARGET_ID(scsiq->d2.target_ix);
+               if ((scsiq->cntl & QC_SG_HEAD) != 0) {
+                       sg_q_addr = q_addr;
+                       sg_list_qp = next_qp;
+                       for (q_cnt = 0; q_cnt < sg_queue_cnt; q_cnt++) {
+                               sg_list_qp = AscReadLramByte(iop_base,
+                                                            (ushort)(sg_q_addr
+                                                                     + (ushort)
+                                                                     ASC_SCSIQ_B_FWD));
+                               sg_q_addr = ASC_QNO_TO_QADDR(sg_list_qp);
+                               if (sg_list_qp == ASC_QLINK_END) {
+                                       AscSetLibErrorCode(asc_dvc,
+                                                          ASCQ_ERR_SG_Q_LINKS);
+                                       scsiq->d3.done_stat = QD_WITH_ERROR;
+                                       scsiq->d3.host_stat =
+                                           QHSTA_D_QDONE_SG_LIST_CORRUPTED;
+                                       goto FATAL_ERR_QDONE;
+                               }
+                               AscWriteLramByte(iop_base,
+                                                (ushort)(sg_q_addr + (ushort)
+                                                         ASC_SCSIQ_B_STATUS),
+                                                QS_FREE);
+                       }
+                       n_q_used = sg_queue_cnt + 1;
+                       AscPutVarDoneQTail(iop_base, sg_list_qp);
+               }
+               if (asc_dvc->queue_full_or_busy & target_id) {
+                       cur_target_qng = AscReadLramByte(iop_base,
+                                                        (ushort)((ushort)
+                                                                 ASC_QADR_BEG
+                                                                 + (ushort)
+                                                                 scsiq->d2.
+                                                                 target_ix));
+                       if (cur_target_qng < asc_dvc->max_dvc_qng[tid_no]) {
+                               scsi_busy = AscReadLramByte(iop_base, (ushort)
+                                                           ASCV_SCSIBUSY_B);
+                               scsi_busy &= ~target_id;
+                               AscWriteLramByte(iop_base,
+                                                (ushort)ASCV_SCSIBUSY_B,
+                                                scsi_busy);
+                               asc_dvc->queue_full_or_busy &= ~target_id;
+                       }
+               }
+               if (asc_dvc->cur_total_qng >= n_q_used) {
+                       asc_dvc->cur_total_qng -= n_q_used;
+                       if (asc_dvc->cur_dvc_qng[tid_no] != 0) {
+                               asc_dvc->cur_dvc_qng[tid_no]--;
+                       }
+               } else {
+                       AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CUR_QNG);
+                       scsiq->d3.done_stat = QD_WITH_ERROR;
+                       goto FATAL_ERR_QDONE;
+               }
+               if ((scsiq->d2.srb_ptr == 0UL) ||
+                   ((scsiq->q_status & QS_ABORTED) != 0)) {
+                       return (0x11);
+               } else if (scsiq->q_status == QS_DONE) {
+                       false_overrun = FALSE;
+                       if (scsiq->extra_bytes != 0) {
+                               scsiq->remain_bytes +=
+                                   (ADV_DCNT)scsiq->extra_bytes;
+                       }
+                       if (scsiq->d3.done_stat == QD_WITH_ERROR) {
+                               if (scsiq->d3.host_stat ==
+                                   QHSTA_M_DATA_OVER_RUN) {
+                                       if ((scsiq->
+                                            cntl & (QC_DATA_IN | QC_DATA_OUT))
+                                           == 0) {
+                                               scsiq->d3.done_stat =
+                                                   QD_NO_ERROR;
+                                               scsiq->d3.host_stat =
+                                                   QHSTA_NO_ERROR;
+                                       } else if (false_overrun) {
+                                               scsiq->d3.done_stat =
+                                                   QD_NO_ERROR;
+                                               scsiq->d3.host_stat =
+                                                   QHSTA_NO_ERROR;
+                                       }
+                               } else if (scsiq->d3.host_stat ==
+                                          QHSTA_M_HUNG_REQ_SCSI_BUS_RESET) {
+                                       AscStopChip(iop_base);
+                                       AscSetChipControl(iop_base,
+                                                         (uchar)(CC_SCSI_RESET
+                                                                 | CC_HALT));
+                                       DvcDelayNanoSecond(asc_dvc, 60000);
+                                       AscSetChipControl(iop_base, CC_HALT);
+                                       AscSetChipStatus(iop_base,
+                                                        CIW_CLR_SCSI_RESET_INT);
+                                       AscSetChipStatus(iop_base, 0);
+                                       AscSetChipControl(iop_base, 0);
+                               }
+                       }
+                       if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
+                               (*asc_isr_callback) (asc_dvc, scsiq);
+                       } else {
+                               if ((AscReadLramByte(iop_base,
+                                                    (ushort)(q_addr + (ushort)
+                                                             ASC_SCSIQ_CDB_BEG))
+                                    == START_STOP)) {
+                                       asc_dvc->unit_not_ready &= ~target_id;
+                                       if (scsiq->d3.done_stat != QD_NO_ERROR) {
+                                               asc_dvc->start_motor &=
+                                                   ~target_id;
+                                       }
+                               }
+                       }
+                       return (1);
+               } else {
+                       AscSetLibErrorCode(asc_dvc, ASCQ_ERR_Q_STATUS);
+ FATAL_ERR_QDONE:
+                       if ((scsiq->cntl & QC_NO_CALLBACK) == 0) {
+                               (*asc_isr_callback) (asc_dvc, scsiq);
+                       }
+                       return (0x80);
+               }
+       }
+       return (0);
 }
 
-STATIC int
-AscISR(
-          ASC_DVC_VAR *asc_dvc
-)
+static int AscISR(ASC_DVC_VAR *asc_dvc)
 {
-    ASC_CS_TYPE         chipstat;
-    PortAddr            iop_base;
-    ushort              saved_ram_addr;
-    uchar               ctrl_reg;
-    uchar               saved_ctrl_reg;
-    int                 int_pending;
-    int                 status;
-    uchar               host_flag;
-
-    iop_base = asc_dvc->iop_base;
-    int_pending = FALSE;
-
-    if (AscIsIntPending(iop_base) == 0)
-    {
-        return int_pending;
-    }
+       ASC_CS_TYPE chipstat;
+       PortAddr iop_base;
+       ushort saved_ram_addr;
+       uchar ctrl_reg;
+       uchar saved_ctrl_reg;
+       int int_pending;
+       int status;
+       uchar host_flag;
+
+       iop_base = asc_dvc->iop_base;
+       int_pending = FALSE;
+
+       if (AscIsIntPending(iop_base) == 0) {
+               return int_pending;
+       }
 
-    if (((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0)
-        || (asc_dvc->isr_callback == 0)
-) {
-        return (ERR);
-    }
-    if (asc_dvc->in_critical_cnt != 0) {
-        AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_ON_CRITICAL);
-        return (ERR);
-    }
-    if (asc_dvc->is_in_int) {
-        AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_RE_ENTRY);
-        return (ERR);
-    }
-    asc_dvc->is_in_int = TRUE;
-    ctrl_reg = AscGetChipControl(iop_base);
-    saved_ctrl_reg = ctrl_reg & (~(CC_SCSI_RESET | CC_CHIP_RESET |
-                                   CC_SINGLE_STEP | CC_DIAG | CC_TEST));
-    chipstat = AscGetChipStatus(iop_base);
-    if (chipstat & CSW_SCSI_RESET_LATCH) {
-        if (!(asc_dvc->bus_type & (ASC_IS_VL | ASC_IS_EISA))) {
-            int i = 10;
-            int_pending = TRUE;
-            asc_dvc->sdtr_done = 0;
-            saved_ctrl_reg &= (uchar) (~CC_HALT);
-            while ((AscGetChipStatus(iop_base) & CSW_SCSI_RESET_ACTIVE) &&
-                   (i-- > 0))
-            {
-                  DvcSleepMilliSecond(100);
-            }
-            AscSetChipControl(iop_base, (CC_CHIP_RESET | CC_HALT));
-            AscSetChipControl(iop_base, CC_HALT);
-            AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
-            AscSetChipStatus(iop_base, 0);
-            chipstat = AscGetChipStatus(iop_base);
-        }
-    }
-    saved_ram_addr = AscGetChipLramAddr(iop_base);
-    host_flag = AscReadLramByte(iop_base,
-        ASCV_HOST_FLAG_B) & (uchar) (~ASC_HOST_FLAG_IN_ISR);
-    AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
-                     (uchar) (host_flag | (uchar) ASC_HOST_FLAG_IN_ISR));
-    if ((chipstat & CSW_INT_PENDING)
-        || (int_pending)
-) {
-        AscAckInterrupt(iop_base);
-        int_pending = TRUE;
-        if ((chipstat & CSW_HALTED) &&
-            (ctrl_reg & CC_SINGLE_STEP)) {
-            if (AscIsrChipHalted(asc_dvc) == ERR) {
-                goto ISR_REPORT_QDONE_FATAL_ERROR;
-            } else {
-                saved_ctrl_reg &= (uchar) (~CC_HALT);
-            }
-        } else {
-          ISR_REPORT_QDONE_FATAL_ERROR:
-            if ((asc_dvc->dvc_cntl & ASC_CNTL_INT_MULTI_Q) != 0) {
-                while (((status = AscIsrQDone(asc_dvc)) & 0x01) != 0) {
-                }
-            } else {
-                do {
-                    if ((status = AscIsrQDone(asc_dvc)) == 1) {
-                        break;
-                    }
-                } while (status == 0x11);
-            }
-            if ((status & 0x80) != 0)
-                int_pending = ERR;
-        }
-    }
-    AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
-    AscSetChipLramAddr(iop_base, saved_ram_addr);
-    AscSetChipControl(iop_base, saved_ctrl_reg);
-    asc_dvc->is_in_int = FALSE;
-    return (int_pending);
+       if (((asc_dvc->init_state & ASC_INIT_STATE_END_LOAD_MC) == 0)
+           || (asc_dvc->isr_callback == 0)
+           ) {
+               return (ERR);
+       }
+       if (asc_dvc->in_critical_cnt != 0) {
+               AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_ON_CRITICAL);
+               return (ERR);
+       }
+       if (asc_dvc->is_in_int) {
+               AscSetLibErrorCode(asc_dvc, ASCQ_ERR_ISR_RE_ENTRY);
+               return (ERR);
+       }
+       asc_dvc->is_in_int = TRUE;
+       ctrl_reg = AscGetChipControl(iop_base);
+       saved_ctrl_reg = ctrl_reg & (~(CC_SCSI_RESET | CC_CHIP_RESET |
+                                      CC_SINGLE_STEP | CC_DIAG | CC_TEST));
+       chipstat = AscGetChipStatus(iop_base);
+       if (chipstat & CSW_SCSI_RESET_LATCH) {
+               if (!(asc_dvc->bus_type & (ASC_IS_VL | ASC_IS_EISA))) {
+                       int i = 10;
+                       int_pending = TRUE;
+                       asc_dvc->sdtr_done = 0;
+                       saved_ctrl_reg &= (uchar)(~CC_HALT);
+                       while ((AscGetChipStatus(iop_base) &
+                               CSW_SCSI_RESET_ACTIVE) && (i-- > 0)) {
+                               DvcSleepMilliSecond(100);
+                       }
+                       AscSetChipControl(iop_base, (CC_CHIP_RESET | CC_HALT));
+                       AscSetChipControl(iop_base, CC_HALT);
+                       AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
+                       AscSetChipStatus(iop_base, 0);
+                       chipstat = AscGetChipStatus(iop_base);
+               }
+       }
+       saved_ram_addr = AscGetChipLramAddr(iop_base);
+       host_flag = AscReadLramByte(iop_base,
+                                   ASCV_HOST_FLAG_B) &
+           (uchar)(~ASC_HOST_FLAG_IN_ISR);
+       AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
+                        (uchar)(host_flag | (uchar)ASC_HOST_FLAG_IN_ISR));
+       if ((chipstat & CSW_INT_PENDING)
+           || (int_pending)
+           ) {
+               AscAckInterrupt(iop_base);
+               int_pending = TRUE;
+               if ((chipstat & CSW_HALTED) && (ctrl_reg & CC_SINGLE_STEP)) {
+                       if (AscIsrChipHalted(asc_dvc) == ERR) {
+                               goto ISR_REPORT_QDONE_FATAL_ERROR;
+                       } else {
+                               saved_ctrl_reg &= (uchar)(~CC_HALT);
+                       }
+               } else {
+ ISR_REPORT_QDONE_FATAL_ERROR:
+                       if ((asc_dvc->dvc_cntl & ASC_CNTL_INT_MULTI_Q) != 0) {
+                               while (((status =
+                                        AscIsrQDone(asc_dvc)) & 0x01) != 0) {
+                               }
+                       } else {
+                               do {
+                                       if ((status =
+                                            AscIsrQDone(asc_dvc)) == 1) {
+                                               break;
+                                       }
+                               } while (status == 0x11);
+                       }
+                       if ((status & 0x80) != 0)
+                               int_pending = ERR;
+               }
+       }
+       AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
+       AscSetChipLramAddr(iop_base, saved_ram_addr);
+       AscSetChipControl(iop_base, saved_ctrl_reg);
+       asc_dvc->is_in_int = FALSE;
+       return (int_pending);
 }
 
 /* Microcode buffer is kept after initialization for error recovery. */
-STATIC uchar _asc_mcode_buf[] =
-{
-  0x01,  0x03,  0x01,  0x19,  0x0F,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
-  0x0F,  0x0F,  0x0F,  0x0F,  0x0F,  0x0F,  0x0F,  0x0F,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
-  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
-  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
-  0x00,  0x00,  0x00,  0x00,  0xC3,  0x12,  0x0D,  0x05,  0x01,  0x00,  0x00,  0x00,  0x00,  0xFF,  0x00,  0x00,
-  0x00,  0x00,  0x00,  0x00,  0xFF,  0x80,  0xFF,  0xFF,  0x01,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,
-  0x00,  0x00,  0x00,  0x23,  0x00,  0x00,  0x00,  0x00,  0x00,  0x07,  0x00,  0xFF,  0x00,  0x00,  0x00,  0x00,
-  0xFF,  0xFF,  0xFF,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00,  0xE4,  0x88,  0x00,  0x00,  0x00,  0x00,
-  0x80,  0x73,  0x48,  0x04,  0x36,  0x00,  0x00,  0xA2,  0xC2,  0x00,  0x80,  0x73,  0x03,  0x23,  0x36,  0x40,
-  0xB6,  0x00,  0x36,  0x00,  0x05,  0xD6,  0x0C,  0xD2,  0x12,  0xDA,  0x00,  0xA2,  0xC2,  0x00,  0x92,  0x80,
-  0x1E,  0x98,  0x50,  0x00,  0xF5,  0x00,  0x48,  0x98,  0xDF,  0x23,  0x36,  0x60,  0xB6,  0x00,  0x92,  0x80,
-  0x4F,  0x00,  0xF5,  0x00,  0x48,  0x98,  0xEF,  0x23,  0x36,  0x60,  0xB6,  0x00,  0x92,  0x80,  0x80,  0x62,
-  0x92,  0x80,  0x00,  0x46,  0x15,  0xEE,  0x13,  0xEA,  0x02,  0x01,  0x09,  0xD8,  0xCD,  0x04,  0x4D,  0x00,
-  0x00,  0xA3,  0xD6,  0x00,  0xA6,  0x97,  0x7F,  0x23,  0x04,  0x61,  0x84,  0x01,  0xE6,  0x84,  0xD2,  0xC1,
-  0x80,  0x73,  0xCD,  0x04,  0x4D,  0x00,  0x00,  0xA3,  0xDA,  0x01,  0xA6,  0x97,  0xC6,  0x81,  0xC2,  0x88,
-  0x80,  0x73,  0x80,  0x77,  0x00,  0x01,  0x01,  0xA1,  0xFE,  0x00,  0x4F,  0x00,  0x84,  0x97,  0x07,  0xA6,
-  0x08,  0x01,  0x00,  0x33,  0x03,  0x00,  0xC2,  0x88,  0x03,  0x03,  0x01,  0xDE,  0xC2,  0x88,  0xCE,  0x00,
-  0x69,  0x60,  0xCE,  0x00,  0x02,  0x03,  0x4A,  0x60,  0x00,  0xA2,  0x78,  0x01,  0x80,  0x63,  0x07,  0xA6,
-  0x24,  0x01,  0x78,  0x81,  0x03,  0x03,  0x80,  0x63,  0xE2,  0x00,  0x07,  0xA6,  0x34,  0x01,  0x00,  0x33,
-  0x04,  0x00,  0xC2,  0x88,  0x03,  0x07,  0x02,  0x01,  0x04,  0xCA,  0x0D,  0x23,  0x68,  0x98,  0x4D,  0x04,
-  0x04,  0x85,  0x05,  0xD8,  0x0D,  0x23,  0x68,  0x98,  0xCD,  0x04,  0x15,  0x23,  0xF8,  0x88,  0xFB,  0x23,
-  0x02,  0x61,  0x82,  0x01,  0x80,  0x63,  0x02,  0x03,  0x06,  0xA3,  0x62,  0x01,  0x00,  0x33,  0x0A,  0x00,
-  0xC2,  0x88,  0x4E,  0x00,  0x07,  0xA3,  0x6E,  0x01,  0x00,  0x33,  0x0B,  0x00,  0xC2,  0x88,  0xCD,  0x04,
-  0x36,  0x2D,  0x00,  0x33,  0x1A,  0x00,  0xC2,  0x88,  0x50,  0x04,  0x88,  0x81,  0x06,  0xAB,  0x82,  0x01,
-  0x88,  0x81,  0x4E,  0x00,  0x07,  0xA3,  0x92,  0x01,  0x50,  0x00,  0x00,  0xA3,  0x3C,  0x01,  0x00,  0x05,
-  0x7C,  0x81,  0x46,  0x97,  0x02,  0x01,  0x05,  0xC6,  0x04,  0x23,  0xA0,  0x01,  0x15,  0x23,  0xA1,  0x01,
-  0xBE,  0x81,  0xFD,  0x23,  0x02,  0x61,  0x82,  0x01,  0x0A,  0xDA,  0x4A,  0x00,  0x06,  0x61,  0x00,  0xA0,
-  0xB4,  0x01,  0x80,  0x63,  0xCD,  0x04,  0x36,  0x2D,  0x00,  0x33,  0x1B,  0x00,  0xC2,  0x88,  0x06,  0x23,
-  0x68,  0x98,  0xCD,  0x04,  0xE6,  0x84,  0x06,  0x01,  0x00,  0xA2,  0xD4,  0x01,  0x57,  0x60,  0x00,  0xA0,
-  0xDA,  0x01,  0xE6,  0x84,  0x80,  0x23,  0xA0,  0x01,  0xE6,  0x84,  0x80,  0x73,  0x4B,  0x00,  0x06,  0x61,
-  0x00,  0xA2,  0x00,  0x02,  0x04,  0x01,  0x0C,  0xDE,  0x02,  0x01,  0x03,  0xCC,  0x4F,  0x00,  0x84,  0x97,
-  0xFC,  0x81,  0x08,  0x23,  0x02,  0x41,  0x82,  0x01,  0x4F,  0x00,  0x62,  0x97,  0x48,  0x04,  0x84,  0x80,
-  0xF0,  0x97,  0x00,  0x46,  0x56,  0x00,  0x03,  0xC0,  0x01,  0x23,  0xE8,  0x00,  0x81,  0x73,  0x06,  0x29,
-  0x03,  0x42,  0x06,  0xE2,  0x03,  0xEE,  0x6B,  0xEB,  0x11,  0x23,  0xF8,  0x88,  0x04,  0x98,  0xF0,  0x80,
-  0x80,  0x73,  0x80,  0x77,  0x07,  0xA4,  0x2A,  0x02,  0x7C,  0x95,  0x06,  0xA6,  0x34,  0x02,  0x03,  0xA6,
-  0x4C,  0x04,  0x46,  0x82,  0x04,  0x01,  0x03,  0xD8,  0xB4,  0x98,  0x6A,  0x96,  0x46,  0x82,  0xFE,  0x95,
-  0x80,  0x67,  0x83,  0x03,  0x80,  0x63,  0xB6,  0x2D,  0x02,  0xA6,  0x6C,  0x02,  0x07,  0xA6,  0x5A,  0x02,
-  0x06,  0xA6,  0x5E,  0x02,  0x03,  0xA6,  0x62,  0x02,  0xC2,  0x88,  0x7C,  0x95,  0x48,  0x82,  0x60,  0x96,
-  0x48,  0x82,  0x04,  0x23,  0xA0,  0x01,  0x14,  0x23,  0xA1,  0x01,  0x3C,  0x84,  0x04,  0x01,  0x0C,  0xDC,
-  0xE0,  0x23,  0x25,  0x61,  0xEF,  0x00,  0x14,  0x01,  0x4F,  0x04,  0xA8,  0x01,  0x6F,  0x00,  0xA5,  0x01,
-  0x03,  0x23,  0xA4,  0x01,  0x06,  0x23,  0x9C,  0x01,  0x24,  0x2B,  0x1C,  0x01,  0x02,  0xA6,  0xAA,  0x02,
-  0x07,  0xA6,  0x5A,  0x02,  0x06,  0xA6,  0x5E,  0x02,  0x03,  0xA6,  0x20,  0x04,  0x01,  0xA6,  0xB4,  0x02,
-  0x00,  0xA6,  0xB4,  0x02,  0x00,  0x33,  0x12,  0x00,  0xC2,  0x88,  0x00,  0x0E,  0x80,  0x63,  0x00,  0x43,
-  0x00,  0xA0,  0x8C,  0x02,  0x4D,  0x04,  0x04,  0x01,  0x0B,  0xDC,  0xE7,  0x23,  0x04,  0x61,  0x84,  0x01,
-  0x10,  0x31,  0x12,  0x35,  0x14,  0x01,  0xEC,  0x00,  0x6C,  0x38,  0x00,  0x3F,  0x00,  0x00,  0xEA,  0x82,
-  0x18,  0x23,  0x04,  0x61,  0x18,  0xA0,  0xE2,  0x02,  0x04,  0x01,  0xA2,  0xC8,  0x00,  0x33,  0x1F,  0x00,
-  0xC2,  0x88,  0x08,  0x31,  0x0A,  0x35,  0x0C,  0x39,  0x0E,  0x3D,  0x7E,  0x98,  0xB6,  0x2D,  0x01,  0xA6,
-  0x14,  0x03,  0x00,  0xA6,  0x14,  0x03,  0x07,  0xA6,  0x0C,  0x03,  0x06,  0xA6,  0x10,  0x03,  0x03,  0xA6,
-  0x20,  0x04,  0x02,  0xA6,  0x6C,  0x02,  0x00,  0x33,  0x33,  0x00,  0xC2,  0x88,  0x7C,  0x95,  0xEE,  0x82,
-  0x60,  0x96,  0xEE,  0x82,  0x82,  0x98,  0x80,  0x42,  0x7E,  0x98,  0x64,  0xE4,  0x04,  0x01,  0x2D,  0xC8,
-  0x31,  0x05,  0x07,  0x01,  0x00,  0xA2,  0x54,  0x03,  0x00,  0x43,  0x87,  0x01,  0x05,  0x05,  0x86,  0x98,
-  0x7E,  0x98,  0x00,  0xA6,  0x16,  0x03,  0x07,  0xA6,  0x4C,  0x03,  0x03,  0xA6,  0x3C,  0x04,  0x06,  0xA6,
-  0x50,  0x03,  0x01,  0xA6,  0x16,  0x03,  0x00,  0x33,  0x25,  0x00,  0xC2,  0x88,  0x7C,  0x95,  0x32,  0x83,
-  0x60,  0x96,  0x32,  0x83,  0x04,  0x01,  0x10,  0xCE,  0x07,  0xC8,  0x05,  0x05,  0xEB,  0x04,  0x00,  0x33,
-  0x00,  0x20,  0xC0,  0x20,  0x81,  0x62,  0x72,  0x83,  0x00,  0x01,  0x05,  0x05,  0xFF,  0xA2,  0x7A,  0x03,
-  0xB1,  0x01,  0x08,  0x23,  0xB2,  0x01,  0x2E,  0x83,  0x05,  0x05,  0x15,  0x01,  0x00,  0xA2,  0x9A,  0x03,
-  0xEC,  0x00,  0x6E,  0x00,  0x95,  0x01,  0x6C,  0x38,  0x00,  0x3F,  0x00,  0x00,  0x01,  0xA6,  0x96,  0x03,
-  0x00,  0xA6,  0x96,  0x03,  0x10,  0x84,  0x80,  0x42,  0x7E,  0x98,  0x01,  0xA6,  0xA4,  0x03,  0x00,  0xA6,
-  0xBC,  0x03,  0x10,  0x84,  0xA8,  0x98,  0x80,  0x42,  0x01,  0xA6,  0xA4,  0x03,  0x07,  0xA6,  0xB2,  0x03,
-  0xD4,  0x83,  0x7C,  0x95,  0xA8,  0x83,  0x00,  0x33,  0x2F,  0x00,  0xC2,  0x88,  0xA8,  0x98,  0x80,  0x42,
-  0x00,  0xA6,  0xBC,  0x03,  0x07,  0xA6,  0xCA,  0x03,  0xD4,  0x83,  0x7C,  0x95,  0xC0,  0x83,  0x00,  0x33,
-  0x26,  0x00,  0xC2,  0x88,  0x38,  0x2B,  0x80,  0x32,  0x80,  0x36,  0x04,  0x23,  0xA0,  0x01,  0x12,  0x23,
-  0xA1,  0x01,  0x10,  0x84,  0x07,  0xF0,  0x06,  0xA4,  0xF4,  0x03,  0x80,  0x6B,  0x80,  0x67,  0x05,  0x23,
-  0x83,  0x03,  0x80,  0x63,  0x03,  0xA6,  0x0E,  0x04,  0x07,  0xA6,  0x06,  0x04,  0x06,  0xA6,  0x0A,  0x04,
-  0x00,  0x33,  0x17,  0x00,  0xC2,  0x88,  0x7C,  0x95,  0xF4,  0x83,  0x60,  0x96,  0xF4,  0x83,  0x20,  0x84,
-  0x07,  0xF0,  0x06,  0xA4,  0x20,  0x04,  0x80,  0x6B,  0x80,  0x67,  0x05,  0x23,  0x83,  0x03,  0x80,  0x63,
-  0xB6,  0x2D,  0x03,  0xA6,  0x3C,  0x04,  0x07,  0xA6,  0x34,  0x04,  0x06,  0xA6,  0x38,  0x04,  0x00,  0x33,
-  0x30,  0x00,  0xC2,  0x88,  0x7C,  0x95,  0x20,  0x84,  0x60,  0x96,  0x20,  0x84,  0x1D,  0x01,  0x06,  0xCC,
-  0x00,  0x33,  0x00,  0x84,  0xC0,  0x20,  0x00,  0x23,  0xEA,  0x00,  0x81,  0x62,  0xA2,  0x0D,  0x80,  0x63,
-  0x07,  0xA6,  0x5A,  0x04,  0x00,  0x33,  0x18,  0x00,  0xC2,  0x88,  0x03,  0x03,  0x80,  0x63,  0xA3,  0x01,
-  0x07,  0xA4,  0x64,  0x04,  0x23,  0x01,  0x00,  0xA2,  0x86,  0x04,  0x0A,  0xA0,  0x76,  0x04,  0xE0,  0x00,
-  0x00,  0x33,  0x1D,  0x00,  0xC2,  0x88,  0x0B,  0xA0,  0x82,  0x04,  0xE0,  0x00,  0x00,  0x33,  0x1E,  0x00,
-  0xC2,  0x88,  0x42,  0x23,  0xF8,  0x88,  0x00,  0x23,  0x22,  0xA3,  0xE6,  0x04,  0x08,  0x23,  0x22,  0xA3,
-  0xA2,  0x04,  0x28,  0x23,  0x22,  0xA3,  0xAE,  0x04,  0x02,  0x23,  0x22,  0xA3,  0xC4,  0x04,  0x42,  0x23,
-  0xF8,  0x88,  0x4A,  0x00,  0x06,  0x61,  0x00,  0xA0,  0xAE,  0x04,  0x45,  0x23,  0xF8,  0x88,  0x04,  0x98,
-  0x00,  0xA2,  0xC0,  0x04,  0xB4,  0x98,  0x00,  0x33,  0x00,  0x82,  0xC0,  0x20,  0x81,  0x62,  0xE8,  0x81,
-  0x47,  0x23,  0xF8,  0x88,  0x04,  0x01,  0x0B,  0xDE,  0x04,  0x98,  0xB4,  0x98,  0x00,  0x33,  0x00,  0x81,
-  0xC0,  0x20,  0x81,  0x62,  0x14,  0x01,  0x00,  0xA0,  0x00,  0x02,  0x43,  0x23,  0xF8,  0x88,  0x04,  0x23,
-  0xA0,  0x01,  0x44,  0x23,  0xA1,  0x01,  0x80,  0x73,  0x4D,  0x00,  0x03,  0xA3,  0xF4,  0x04,  0x00,  0x33,
-  0x27,  0x00,  0xC2,  0x88,  0x04,  0x01,  0x04,  0xDC,  0x02,  0x23,  0xA2,  0x01,  0x04,  0x23,  0xA0,  0x01,
-  0x04,  0x98,  0x26,  0x95,  0x4B,  0x00,  0xF6,  0x00,  0x4F,  0x04,  0x4F,  0x00,  0x00,  0xA3,  0x22,  0x05,
-  0x00,  0x05,  0x76,  0x00,  0x06,  0x61,  0x00,  0xA2,  0x1C,  0x05,  0x0A,  0x85,  0x46,  0x97,  0xCD,  0x04,
-  0x24,  0x85,  0x48,  0x04,  0x84,  0x80,  0x02,  0x01,  0x03,  0xDA,  0x80,  0x23,  0x82,  0x01,  0x34,  0x85,
-  0x02,  0x23,  0xA0,  0x01,  0x4A,  0x00,  0x06,  0x61,  0x00,  0xA2,  0x40,  0x05,  0x1D,  0x01,  0x04,  0xD6,
-  0xFF,  0x23,  0x86,  0x41,  0x4B,  0x60,  0xCB,  0x00,  0xFF,  0x23,  0x80,  0x01,  0x49,  0x00,  0x81,  0x01,
-  0x04,  0x01,  0x02,  0xC8,  0x30,  0x01,  0x80,  0x01,  0xF7,  0x04,  0x03,  0x01,  0x49,  0x04,  0x80,  0x01,
-  0xC9,  0x00,  0x00,  0x05,  0x00,  0x01,  0xFF,  0xA0,  0x60,  0x05,  0x77,  0x04,  0x01,  0x23,  0xEA,  0x00,
-  0x5D,  0x00,  0xFE,  0xC7,  0x00,  0x62,  0x00,  0x23,  0xEA,  0x00,  0x00,  0x63,  0x07,  0xA4,  0xF8,  0x05,
-  0x03,  0x03,  0x02,  0xA0,  0x8E,  0x05,  0xF4,  0x85,  0x00,  0x33,  0x2D,  0x00,  0xC2,  0x88,  0x04,  0xA0,
-  0xB8,  0x05,  0x80,  0x63,  0x00,  0x23,  0xDF,  0x00,  0x4A,  0x00,  0x06,  0x61,  0x00,  0xA2,  0xA4,  0x05,
-  0x1D,  0x01,  0x06,  0xD6,  0x02,  0x23,  0x02,  0x41,  0x82,  0x01,  0x50,  0x00,  0x62,  0x97,  0x04,  0x85,
-  0x04,  0x23,  0x02,  0x41,  0x82,  0x01,  0x04,  0x85,  0x08,  0xA0,  0xBE,  0x05,  0xF4,  0x85,  0x03,  0xA0,
-  0xC4,  0x05,  0xF4,  0x85,  0x01,  0xA0,  0xCE,  0x05,  0x88,  0x00,  0x80,  0x63,  0xCC,  0x86,  0x07,  0xA0,
-  0xEE,  0x05,  0x5F,  0x00,  0x00,  0x2B,  0xDF,  0x08,  0x00,  0xA2,  0xE6,  0x05,  0x80,  0x67,  0x80,  0x63,
-  0x01,  0xA2,  0x7A,  0x06,  0x7C,  0x85,  0x06,  0x23,  0x68,  0x98,  0x48,  0x23,  0xF8,  0x88,  0x07,  0x23,
-  0x80,  0x00,  0x06,  0x87,  0x80,  0x63,  0x7C,  0x85,  0x00,  0x23,  0xDF,  0x00,  0x00,  0x63,  0x4A,  0x00,
-  0x06,  0x61,  0x00,  0xA2,  0x36,  0x06,  0x1D,  0x01,  0x16,  0xD4,  0xC0,  0x23,  0x07,  0x41,  0x83,  0x03,
-  0x80,  0x63,  0x06,  0xA6,  0x1C,  0x06,  0x00,  0x33,  0x37,  0x00,  0xC2,  0x88,  0x1D,  0x01,  0x01,  0xD6,
-  0x20,  0x23,  0x63,  0x60,  0x83,  0x03,  0x80,  0x63,  0x02,  0x23,  0xDF,  0x00,  0x07,  0xA6,  0x7C,  0x05,
-  0xEF,  0x04,  0x6F,  0x00,  0x00,  0x63,  0x4B,  0x00,  0x06,  0x41,  0xCB,  0x00,  0x52,  0x00,  0x06,  0x61,
-  0x00,  0xA2,  0x4E,  0x06,  0x1D,  0x01,  0x03,  0xCA,  0xC0,  0x23,  0x07,  0x41,  0x00,  0x63,  0x1D,  0x01,
-  0x04,  0xCC,  0x00,  0x33,  0x00,  0x83,  0xC0,  0x20,  0x81,  0x62,  0x80,  0x23,  0x07,  0x41,  0x00,  0x63,
-  0x80,  0x67,  0x08,  0x23,  0x83,  0x03,  0x80,  0x63,  0x00,  0x63,  0x01,  0x23,  0xDF,  0x00,  0x06,  0xA6,
-  0x84,  0x06,  0x07,  0xA6,  0x7C,  0x05,  0x80,  0x67,  0x80,  0x63,  0x00,  0x33,  0x00,  0x40,  0xC0,  0x20,
-  0x81,  0x62,  0x00,  0x63,  0x00,  0x00,  0xFE,  0x95,  0x83,  0x03,  0x80,  0x63,  0x06,  0xA6,  0x94,  0x06,
-  0x07,  0xA6,  0x7C,  0x05,  0x00,  0x00,  0x01,  0xA0,  0x14,  0x07,  0x00,  0x2B,  0x40,  0x0E,  0x80,  0x63,
-  0x01,  0x00,  0x06,  0xA6,  0xAA,  0x06,  0x07,  0xA6,  0x7C,  0x05,  0x40,  0x0E,  0x80,  0x63,  0x00,  0x43,
-  0x00,  0xA0,  0xA2,  0x06,  0x06,  0xA6,  0xBC,  0x06,  0x07,  0xA6,  0x7C,  0x05,  0x80,  0x67,  0x40,  0x0E,
-  0x80,  0x63,  0x07,  0xA6,  0x7C,  0x05,  0x00,  0x23,  0xDF,  0x00,  0x00,  0x63,  0x07,  0xA6,  0xD6,  0x06,
-  0x00,  0x33,  0x2A,  0x00,  0xC2,  0x88,  0x03,  0x03,  0x80,  0x63,  0x89,  0x00,  0x0A,  0x2B,  0x07,  0xA6,
-  0xE8,  0x06,  0x00,  0x33,  0x29,  0x00,  0xC2,  0x88,  0x00,  0x43,  0x00,  0xA2,  0xF4,  0x06,  0xC0,  0x0E,
-  0x80,  0x63,  0xDE,  0x86,  0xC0,  0x0E,  0x00,  0x33,  0x00,  0x80,  0xC0,  0x20,  0x81,  0x62,  0x04,  0x01,
-  0x02,  0xDA,  0x80,  0x63,  0x7C,  0x85,  0x80,  0x7B,  0x80,  0x63,  0x06,  0xA6,  0x8C,  0x06,  0x00,  0x33,
-  0x2C,  0x00,  0xC2,  0x88,  0x0C,  0xA2,  0x2E,  0x07,  0xFE,  0x95,  0x83,  0x03,  0x80,  0x63,  0x06,  0xA6,
-  0x2C,  0x07,  0x07,  0xA6,  0x7C,  0x05,  0x00,  0x33,  0x3D,  0x00,  0xC2,  0x88,  0x00,  0x00,  0x80,  0x67,
-  0x83,  0x03,  0x80,  0x63,  0x0C,  0xA0,  0x44,  0x07,  0x07,  0xA6,  0x7C,  0x05,  0xBF,  0x23,  0x04,  0x61,
-  0x84,  0x01,  0xE6,  0x84,  0x00,  0x63,  0xF0,  0x04,  0x01,  0x01,  0xF1,  0x00,  0x00,  0x01,  0xF2,  0x00,
-  0x01,  0x05,  0x80,  0x01,  0x72,  0x04,  0x71,  0x00,  0x81,  0x01,  0x70,  0x04,  0x80,  0x05,  0x81,  0x05,
-  0x00,  0x63,  0xF0,  0x04,  0xF2,  0x00,  0x72,  0x04,  0x01,  0x01,  0xF1,  0x00,  0x70,  0x00,  0x81,  0x01,
-  0x70,  0x04,  0x71,  0x00,  0x81,  0x01,  0x72,  0x00,  0x80,  0x01,  0x71,  0x04,  0x70,  0x00,  0x80,  0x01,
-  0x70,  0x04,  0x00,  0x63,  0xF0,  0x04,  0xF2,  0x00,  0x72,  0x04,  0x00,  0x01,  0xF1,  0x00,  0x70,  0x00,
-  0x80,  0x01,  0x70,  0x04,  0x71,  0x00,  0x80,  0x01,  0x72,  0x00,  0x81,  0x01,  0x71,  0x04,  0x70,  0x00,
-  0x81,  0x01,  0x70,  0x04,  0x00,  0x63,  0x00,  0x23,  0xB3,  0x01,  0x83,  0x05,  0xA3,  0x01,  0xA2,  0x01,
-  0xA1,  0x01,  0x01,  0x23,  0xA0,  0x01,  0x00,  0x01,  0xC8,  0x00,  0x03,  0xA1,  0xC4,  0x07,  0x00,  0x33,
-  0x07,  0x00,  0xC2,  0x88,  0x80,  0x05,  0x81,  0x05,  0x04,  0x01,  0x11,  0xC8,  0x48,  0x00,  0xB0,  0x01,
-  0xB1,  0x01,  0x08,  0x23,  0xB2,  0x01,  0x05,  0x01,  0x48,  0x04,  0x00,  0x43,  0x00,  0xA2,  0xE4,  0x07,
-  0x00,  0x05,  0xDA,  0x87,  0x00,  0x01,  0xC8,  0x00,  0xFF,  0x23,  0x80,  0x01,  0x05,  0x05,  0x00,  0x63,
-  0xF7,  0x04,  0x1A,  0x09,  0xF6,  0x08,  0x6E,  0x04,  0x00,  0x02,  0x80,  0x43,  0x76,  0x08,  0x80,  0x02,
-  0x77,  0x04,  0x00,  0x63,  0xF7,  0x04,  0x1A,  0x09,  0xF6,  0x08,  0x6E,  0x04,  0x00,  0x02,  0x00,  0xA0,
-  0x14,  0x08,  0x16,  0x88,  0x00,  0x43,  0x76,  0x08,  0x80,  0x02,  0x77,  0x04,  0x00,  0x63,  0xF3,  0x04,
-  0x00,  0x23,  0xF4,  0x00,  0x74,  0x00,  0x80,  0x43,  0xF4,  0x00,  0xCF,  0x40,  0x00,  0xA2,  0x44,  0x08,
-  0x74,  0x04,  0x02,  0x01,  0xF7,  0xC9,  0xF6,  0xD9,  0x00,  0x01,  0x01,  0xA1,  0x24,  0x08,  0x04,  0x98,
-  0x26,  0x95,  0x24,  0x88,  0x73,  0x04,  0x00,  0x63,  0xF3,  0x04,  0x75,  0x04,  0x5A,  0x88,  0x02,  0x01,
-  0x04,  0xD8,  0x46,  0x97,  0x04,  0x98,  0x26,  0x95,  0x4A,  0x88,  0x75,  0x00,  0x00,  0xA3,  0x64,  0x08,
-  0x00,  0x05,  0x4E,  0x88,  0x73,  0x04,  0x00,  0x63,  0x80,  0x7B,  0x80,  0x63,  0x06,  0xA6,  0x76,  0x08,
-  0x00,  0x33,  0x3E,  0x00,  0xC2,  0x88,  0x80,  0x67,  0x83,  0x03,  0x80,  0x63,  0x00,  0x63,  0x38,  0x2B,
-  0x9C,  0x88,  0x38,  0x2B,  0x92,  0x88,  0x32,  0x09,  0x31,  0x05,  0x92,  0x98,  0x05,  0x05,  0xB2,  0x09,
-  0x00,  0x63,  0x00,  0x32,  0x00,  0x36,  0x00,  0x3A,  0x00,  0x3E,  0x00,  0x63,  0x80,  0x32,  0x80,  0x36,
-  0x80,  0x3A,  0x80,  0x3E,  0xB4,  0x3D,  0x00,  0x63,  0x38,  0x2B,  0x40,  0x32,  0x40,  0x36,  0x40,  0x3A,
-  0x40,  0x3E,  0x00,  0x63,  0x5A,  0x20,  0xC9,  0x40,  0x00,  0xA0,  0xB4,  0x08,  0x5D,  0x00,  0xFE,  0xC3,
-  0x00,  0x63,  0x80,  0x73,  0xE6,  0x20,  0x02,  0x23,  0xE8,  0x00,  0x82,  0x73,  0xFF,  0xFD,  0x80,  0x73,
-  0x13,  0x23,  0xF8,  0x88,  0x66,  0x20,  0xC0,  0x20,  0x04,  0x23,  0xA0,  0x01,  0xA1,  0x23,  0xA1,  0x01,
-  0x81,  0x62,  0xE2,  0x88,  0x80,  0x73,  0x80,  0x77,  0x68,  0x00,  0x00,  0xA2,  0x80,  0x00,  0x03,  0xC2,
-  0xF1,  0xC7,  0x41,  0x23,  0xF8,  0x88,  0x11,  0x23,  0xA1,  0x01,  0x04,  0x23,  0xA0,  0x01,  0xE6,  0x84,
+static uchar _asc_mcode_buf[] = {
+       0x01, 0x03, 0x01, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0xC3, 0x12, 0x0D, 0x05, 0x01, 0x00, 0x00, 0x00,
+       0x00, 0xFF, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xFF,
+       0x00, 0x00, 0x00, 0x00,
+       0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x88,
+       0x00, 0x00, 0x00, 0x00,
+       0x80, 0x73, 0x48, 0x04, 0x36, 0x00, 0x00, 0xA2, 0xC2, 0x00, 0x80, 0x73,
+       0x03, 0x23, 0x36, 0x40,
+       0xB6, 0x00, 0x36, 0x00, 0x05, 0xD6, 0x0C, 0xD2, 0x12, 0xDA, 0x00, 0xA2,
+       0xC2, 0x00, 0x92, 0x80,
+       0x1E, 0x98, 0x50, 0x00, 0xF5, 0x00, 0x48, 0x98, 0xDF, 0x23, 0x36, 0x60,
+       0xB6, 0x00, 0x92, 0x80,
+       0x4F, 0x00, 0xF5, 0x00, 0x48, 0x98, 0xEF, 0x23, 0x36, 0x60, 0xB6, 0x00,
+       0x92, 0x80, 0x80, 0x62,
+       0x92, 0x80, 0x00, 0x46, 0x15, 0xEE, 0x13, 0xEA, 0x02, 0x01, 0x09, 0xD8,
+       0xCD, 0x04, 0x4D, 0x00,
+       0x00, 0xA3, 0xD6, 0x00, 0xA6, 0x97, 0x7F, 0x23, 0x04, 0x61, 0x84, 0x01,
+       0xE6, 0x84, 0xD2, 0xC1,
+       0x80, 0x73, 0xCD, 0x04, 0x4D, 0x00, 0x00, 0xA3, 0xDA, 0x01, 0xA6, 0x97,
+       0xC6, 0x81, 0xC2, 0x88,
+       0x80, 0x73, 0x80, 0x77, 0x00, 0x01, 0x01, 0xA1, 0xFE, 0x00, 0x4F, 0x00,
+       0x84, 0x97, 0x07, 0xA6,
+       0x08, 0x01, 0x00, 0x33, 0x03, 0x00, 0xC2, 0x88, 0x03, 0x03, 0x01, 0xDE,
+       0xC2, 0x88, 0xCE, 0x00,
+       0x69, 0x60, 0xCE, 0x00, 0x02, 0x03, 0x4A, 0x60, 0x00, 0xA2, 0x78, 0x01,
+       0x80, 0x63, 0x07, 0xA6,
+       0x24, 0x01, 0x78, 0x81, 0x03, 0x03, 0x80, 0x63, 0xE2, 0x00, 0x07, 0xA6,
+       0x34, 0x01, 0x00, 0x33,
+       0x04, 0x00, 0xC2, 0x88, 0x03, 0x07, 0x02, 0x01, 0x04, 0xCA, 0x0D, 0x23,
+       0x68, 0x98, 0x4D, 0x04,
+       0x04, 0x85, 0x05, 0xD8, 0x0D, 0x23, 0x68, 0x98, 0xCD, 0x04, 0x15, 0x23,
+       0xF8, 0x88, 0xFB, 0x23,
+       0x02, 0x61, 0x82, 0x01, 0x80, 0x63, 0x02, 0x03, 0x06, 0xA3, 0x62, 0x01,
+       0x00, 0x33, 0x0A, 0x00,
+       0xC2, 0x88, 0x4E, 0x00, 0x07, 0xA3, 0x6E, 0x01, 0x00, 0x33, 0x0B, 0x00,
+       0xC2, 0x88, 0xCD, 0x04,
+       0x36, 0x2D, 0x00, 0x33, 0x1A, 0x00, 0xC2, 0x88, 0x50, 0x04, 0x88, 0x81,
+       0x06, 0xAB, 0x82, 0x01,
+       0x88, 0x81, 0x4E, 0x00, 0x07, 0xA3, 0x92, 0x01, 0x50, 0x00, 0x00, 0xA3,
+       0x3C, 0x01, 0x00, 0x05,
+       0x7C, 0x81, 0x46, 0x97, 0x02, 0x01, 0x05, 0xC6, 0x04, 0x23, 0xA0, 0x01,
+       0x15, 0x23, 0xA1, 0x01,
+       0xBE, 0x81, 0xFD, 0x23, 0x02, 0x61, 0x82, 0x01, 0x0A, 0xDA, 0x4A, 0x00,
+       0x06, 0x61, 0x00, 0xA0,
+       0xB4, 0x01, 0x80, 0x63, 0xCD, 0x04, 0x36, 0x2D, 0x00, 0x33, 0x1B, 0x00,
+       0xC2, 0x88, 0x06, 0x23,
+       0x68, 0x98, 0xCD, 0x04, 0xE6, 0x84, 0x06, 0x01, 0x00, 0xA2, 0xD4, 0x01,
+       0x57, 0x60, 0x00, 0xA0,
+       0xDA, 0x01, 0xE6, 0x84, 0x80, 0x23, 0xA0, 0x01, 0xE6, 0x84, 0x80, 0x73,
+       0x4B, 0x00, 0x06, 0x61,
+       0x00, 0xA2, 0x00, 0x02, 0x04, 0x01, 0x0C, 0xDE, 0x02, 0x01, 0x03, 0xCC,
+       0x4F, 0x00, 0x84, 0x97,
+       0xFC, 0x81, 0x08, 0x23, 0x02, 0x41, 0x82, 0x01, 0x4F, 0x00, 0x62, 0x97,
+       0x48, 0x04, 0x84, 0x80,
+       0xF0, 0x97, 0x00, 0x46, 0x56, 0x00, 0x03, 0xC0, 0x01, 0x23, 0xE8, 0x00,
+       0x81, 0x73, 0x06, 0x29,
+       0x03, 0x42, 0x06, 0xE2, 0x03, 0xEE, 0x6B, 0xEB, 0x11, 0x23, 0xF8, 0x88,
+       0x04, 0x98, 0xF0, 0x80,
+       0x80, 0x73, 0x80, 0x77, 0x07, 0xA4, 0x2A, 0x02, 0x7C, 0x95, 0x06, 0xA6,
+       0x34, 0x02, 0x03, 0xA6,
+       0x4C, 0x04, 0x46, 0x82, 0x04, 0x01, 0x03, 0xD8, 0xB4, 0x98, 0x6A, 0x96,
+       0x46, 0x82, 0xFE, 0x95,
+       0x80, 0x67, 0x83, 0x03, 0x80, 0x63, 0xB6, 0x2D, 0x02, 0xA6, 0x6C, 0x02,
+       0x07, 0xA6, 0x5A, 0x02,
+       0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x62, 0x02, 0xC2, 0x88, 0x7C, 0x95,
+       0x48, 0x82, 0x60, 0x96,
+       0x48, 0x82, 0x04, 0x23, 0xA0, 0x01, 0x14, 0x23, 0xA1, 0x01, 0x3C, 0x84,
+       0x04, 0x01, 0x0C, 0xDC,
+       0xE0, 0x23, 0x25, 0x61, 0xEF, 0x00, 0x14, 0x01, 0x4F, 0x04, 0xA8, 0x01,
+       0x6F, 0x00, 0xA5, 0x01,
+       0x03, 0x23, 0xA4, 0x01, 0x06, 0x23, 0x9C, 0x01, 0x24, 0x2B, 0x1C, 0x01,
+       0x02, 0xA6, 0xAA, 0x02,
+       0x07, 0xA6, 0x5A, 0x02, 0x06, 0xA6, 0x5E, 0x02, 0x03, 0xA6, 0x20, 0x04,
+       0x01, 0xA6, 0xB4, 0x02,
+       0x00, 0xA6, 0xB4, 0x02, 0x00, 0x33, 0x12, 0x00, 0xC2, 0x88, 0x00, 0x0E,
+       0x80, 0x63, 0x00, 0x43,
+       0x00, 0xA0, 0x8C, 0x02, 0x4D, 0x04, 0x04, 0x01, 0x0B, 0xDC, 0xE7, 0x23,
+       0x04, 0x61, 0x84, 0x01,
+       0x10, 0x31, 0x12, 0x35, 0x14, 0x01, 0xEC, 0x00, 0x6C, 0x38, 0x00, 0x3F,
+       0x00, 0x00, 0xEA, 0x82,
+       0x18, 0x23, 0x04, 0x61, 0x18, 0xA0, 0xE2, 0x02, 0x04, 0x01, 0xA2, 0xC8,
+       0x00, 0x33, 0x1F, 0x00,
+       0xC2, 0x88, 0x08, 0x31, 0x0A, 0x35, 0x0C, 0x39, 0x0E, 0x3D, 0x7E, 0x98,
+       0xB6, 0x2D, 0x01, 0xA6,
+       0x14, 0x03, 0x00, 0xA6, 0x14, 0x03, 0x07, 0xA6, 0x0C, 0x03, 0x06, 0xA6,
+       0x10, 0x03, 0x03, 0xA6,
+       0x20, 0x04, 0x02, 0xA6, 0x6C, 0x02, 0x00, 0x33, 0x33, 0x00, 0xC2, 0x88,
+       0x7C, 0x95, 0xEE, 0x82,
+       0x60, 0x96, 0xEE, 0x82, 0x82, 0x98, 0x80, 0x42, 0x7E, 0x98, 0x64, 0xE4,
+       0x04, 0x01, 0x2D, 0xC8,
+       0x31, 0x05, 0x07, 0x01, 0x00, 0xA2, 0x54, 0x03, 0x00, 0x43, 0x87, 0x01,
+       0x05, 0x05, 0x86, 0x98,
+       0x7E, 0x98, 0x00, 0xA6, 0x16, 0x03, 0x07, 0xA6, 0x4C, 0x03, 0x03, 0xA6,
+       0x3C, 0x04, 0x06, 0xA6,
+       0x50, 0x03, 0x01, 0xA6, 0x16, 0x03, 0x00, 0x33, 0x25, 0x00, 0xC2, 0x88,
+       0x7C, 0x95, 0x32, 0x83,
+       0x60, 0x96, 0x32, 0x83, 0x04, 0x01, 0x10, 0xCE, 0x07, 0xC8, 0x05, 0x05,
+       0xEB, 0x04, 0x00, 0x33,
+       0x00, 0x20, 0xC0, 0x20, 0x81, 0x62, 0x72, 0x83, 0x00, 0x01, 0x05, 0x05,
+       0xFF, 0xA2, 0x7A, 0x03,
+       0xB1, 0x01, 0x08, 0x23, 0xB2, 0x01, 0x2E, 0x83, 0x05, 0x05, 0x15, 0x01,
+       0x00, 0xA2, 0x9A, 0x03,
+       0xEC, 0x00, 0x6E, 0x00, 0x95, 0x01, 0x6C, 0x38, 0x00, 0x3F, 0x00, 0x00,
+       0x01, 0xA6, 0x96, 0x03,
+       0x00, 0xA6, 0x96, 0x03, 0x10, 0x84, 0x80, 0x42, 0x7E, 0x98, 0x01, 0xA6,
+       0xA4, 0x03, 0x00, 0xA6,
+       0xBC, 0x03, 0x10, 0x84, 0xA8, 0x98, 0x80, 0x42, 0x01, 0xA6, 0xA4, 0x03,
+       0x07, 0xA6, 0xB2, 0x03,
+       0xD4, 0x83, 0x7C, 0x95, 0xA8, 0x83, 0x00, 0x33, 0x2F, 0x00, 0xC2, 0x88,
+       0xA8, 0x98, 0x80, 0x42,
+       0x00, 0xA6, 0xBC, 0x03, 0x07, 0xA6, 0xCA, 0x03, 0xD4, 0x83, 0x7C, 0x95,
+       0xC0, 0x83, 0x00, 0x33,
+       0x26, 0x00, 0xC2, 0x88, 0x38, 0x2B, 0x80, 0x32, 0x80, 0x36, 0x04, 0x23,
+       0xA0, 0x01, 0x12, 0x23,
+       0xA1, 0x01, 0x10, 0x84, 0x07, 0xF0, 0x06, 0xA4, 0xF4, 0x03, 0x80, 0x6B,
+       0x80, 0x67, 0x05, 0x23,
+       0x83, 0x03, 0x80, 0x63, 0x03, 0xA6, 0x0E, 0x04, 0x07, 0xA6, 0x06, 0x04,
+       0x06, 0xA6, 0x0A, 0x04,
+       0x00, 0x33, 0x17, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0xF4, 0x83, 0x60, 0x96,
+       0xF4, 0x83, 0x20, 0x84,
+       0x07, 0xF0, 0x06, 0xA4, 0x20, 0x04, 0x80, 0x6B, 0x80, 0x67, 0x05, 0x23,
+       0x83, 0x03, 0x80, 0x63,
+       0xB6, 0x2D, 0x03, 0xA6, 0x3C, 0x04, 0x07, 0xA6, 0x34, 0x04, 0x06, 0xA6,
+       0x38, 0x04, 0x00, 0x33,
+       0x30, 0x00, 0xC2, 0x88, 0x7C, 0x95, 0x20, 0x84, 0x60, 0x96, 0x20, 0x84,
+       0x1D, 0x01, 0x06, 0xCC,
+       0x00, 0x33, 0x00, 0x84, 0xC0, 0x20, 0x00, 0x23, 0xEA, 0x00, 0x81, 0x62,
+       0xA2, 0x0D, 0x80, 0x63,
+       0x07, 0xA6, 0x5A, 0x04, 0x00, 0x33, 0x18, 0x00, 0xC2, 0x88, 0x03, 0x03,
+       0x80, 0x63, 0xA3, 0x01,
+       0x07, 0xA4, 0x64, 0x04, 0x23, 0x01, 0x00, 0xA2, 0x86, 0x04, 0x0A, 0xA0,
+       0x76, 0x04, 0xE0, 0x00,
+       0x00, 0x33, 0x1D, 0x00, 0xC2, 0x88, 0x0B, 0xA0, 0x82, 0x04, 0xE0, 0x00,
+       0x00, 0x33, 0x1E, 0x00,
+       0xC2, 0x88, 0x42, 0x23, 0xF8, 0x88, 0x00, 0x23, 0x22, 0xA3, 0xE6, 0x04,
+       0x08, 0x23, 0x22, 0xA3,
+       0xA2, 0x04, 0x28, 0x23, 0x22, 0xA3, 0xAE, 0x04, 0x02, 0x23, 0x22, 0xA3,
+       0xC4, 0x04, 0x42, 0x23,
+       0xF8, 0x88, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA0, 0xAE, 0x04, 0x45, 0x23,
+       0xF8, 0x88, 0x04, 0x98,
+       0x00, 0xA2, 0xC0, 0x04, 0xB4, 0x98, 0x00, 0x33, 0x00, 0x82, 0xC0, 0x20,
+       0x81, 0x62, 0xE8, 0x81,
+       0x47, 0x23, 0xF8, 0x88, 0x04, 0x01, 0x0B, 0xDE, 0x04, 0x98, 0xB4, 0x98,
+       0x00, 0x33, 0x00, 0x81,
+       0xC0, 0x20, 0x81, 0x62, 0x14, 0x01, 0x00, 0xA0, 0x00, 0x02, 0x43, 0x23,
+       0xF8, 0x88, 0x04, 0x23,
+       0xA0, 0x01, 0x44, 0x23, 0xA1, 0x01, 0x80, 0x73, 0x4D, 0x00, 0x03, 0xA3,
+       0xF4, 0x04, 0x00, 0x33,
+       0x27, 0x00, 0xC2, 0x88, 0x04, 0x01, 0x04, 0xDC, 0x02, 0x23, 0xA2, 0x01,
+       0x04, 0x23, 0xA0, 0x01,
+       0x04, 0x98, 0x26, 0x95, 0x4B, 0x00, 0xF6, 0x00, 0x4F, 0x04, 0x4F, 0x00,
+       0x00, 0xA3, 0x22, 0x05,
+       0x00, 0x05, 0x76, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x1C, 0x05, 0x0A, 0x85,
+       0x46, 0x97, 0xCD, 0x04,
+       0x24, 0x85, 0x48, 0x04, 0x84, 0x80, 0x02, 0x01, 0x03, 0xDA, 0x80, 0x23,
+       0x82, 0x01, 0x34, 0x85,
+       0x02, 0x23, 0xA0, 0x01, 0x4A, 0x00, 0x06, 0x61, 0x00, 0xA2, 0x40, 0x05,
+       0x1D, 0x01, 0x04, 0xD6,
+       0xFF, 0x23, 0x86, 0x41, 0x4B, 0x60, 0xCB, 0x00, 0xFF, 0x23, 0x80, 0x01,
+       0x49, 0x00, 0x81, 0x01,
+       0x04, 0x01, 0x02, 0xC8, 0x30, 0x01, 0x80, 0x01, 0xF7, 0x04, 0x03, 0x01,
+       0x49, 0x04, 0x80, 0x01,
+       0xC9, 0x00, 0x00, 0x05, 0x00, 0x01, 0xFF, 0xA0, 0x60, 0x05, 0x77, 0x04,
+       0x01, 0x23, 0xEA, 0x00,
+       0x5D, 0x00, 0xFE, 0xC7, 0x00, 0x62, 0x00, 0x23, 0xEA, 0x00, 0x00, 0x63,
+       0x07, 0xA4, 0xF8, 0x05,
+       0x03, 0x03, 0x02, 0xA0, 0x8E, 0x05, 0xF4, 0x85, 0x00, 0x33, 0x2D, 0x00,
+       0xC2, 0x88, 0x04, 0xA0,
+       0xB8, 0x05, 0x80, 0x63, 0x00, 0x23, 0xDF, 0x00, 0x4A, 0x00, 0x06, 0x61,
+       0x00, 0xA2, 0xA4, 0x05,
+       0x1D, 0x01, 0x06, 0xD6, 0x02, 0x23, 0x02, 0x41, 0x82, 0x01, 0x50, 0x00,
+       0x62, 0x97, 0x04, 0x85,
+       0x04, 0x23, 0x02, 0x41, 0x82, 0x01, 0x04, 0x85, 0x08, 0xA0, 0xBE, 0x05,
+       0xF4, 0x85, 0x03, 0xA0,
+       0xC4, 0x05, 0xF4, 0x85, 0x01, 0xA0, 0xCE, 0x05, 0x88, 0x00, 0x80, 0x63,
+       0xCC, 0x86, 0x07, 0xA0,
+       0xEE, 0x05, 0x5F, 0x00, 0x00, 0x2B, 0xDF, 0x08, 0x00, 0xA2, 0xE6, 0x05,
+       0x80, 0x67, 0x80, 0x63,
+       0x01, 0xA2, 0x7A, 0x06, 0x7C, 0x85, 0x06, 0x23, 0x68, 0x98, 0x48, 0x23,
+       0xF8, 0x88, 0x07, 0x23,
+       0x80, 0x00, 0x06, 0x87, 0x80, 0x63, 0x7C, 0x85, 0x00, 0x23, 0xDF, 0x00,
+       0x00, 0x63, 0x4A, 0x00,
+       0x06, 0x61, 0x00, 0xA2, 0x36, 0x06, 0x1D, 0x01, 0x16, 0xD4, 0xC0, 0x23,
+       0x07, 0x41, 0x83, 0x03,
+       0x80, 0x63, 0x06, 0xA6, 0x1C, 0x06, 0x00, 0x33, 0x37, 0x00, 0xC2, 0x88,
+       0x1D, 0x01, 0x01, 0xD6,
+       0x20, 0x23, 0x63, 0x60, 0x83, 0x03, 0x80, 0x63, 0x02, 0x23, 0xDF, 0x00,
+       0x07, 0xA6, 0x7C, 0x05,
+       0xEF, 0x04, 0x6F, 0x00, 0x00, 0x63, 0x4B, 0x00, 0x06, 0x41, 0xCB, 0x00,
+       0x52, 0x00, 0x06, 0x61,
+       0x00, 0xA2, 0x4E, 0x06, 0x1D, 0x01, 0x03, 0xCA, 0xC0, 0x23, 0x07, 0x41,
+       0x00, 0x63, 0x1D, 0x01,
+       0x04, 0xCC, 0x00, 0x33, 0x00, 0x83, 0xC0, 0x20, 0x81, 0x62, 0x80, 0x23,
+       0x07, 0x41, 0x00, 0x63,
+       0x80, 0x67, 0x08, 0x23, 0x83, 0x03, 0x80, 0x63, 0x00, 0x63, 0x01, 0x23,
+       0xDF, 0x00, 0x06, 0xA6,
+       0x84, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x80, 0x67, 0x80, 0x63, 0x00, 0x33,
+       0x00, 0x40, 0xC0, 0x20,
+       0x81, 0x62, 0x00, 0x63, 0x00, 0x00, 0xFE, 0x95, 0x83, 0x03, 0x80, 0x63,
+       0x06, 0xA6, 0x94, 0x06,
+       0x07, 0xA6, 0x7C, 0x05, 0x00, 0x00, 0x01, 0xA0, 0x14, 0x07, 0x00, 0x2B,
+       0x40, 0x0E, 0x80, 0x63,
+       0x01, 0x00, 0x06, 0xA6, 0xAA, 0x06, 0x07, 0xA6, 0x7C, 0x05, 0x40, 0x0E,
+       0x80, 0x63, 0x00, 0x43,
+       0x00, 0xA0, 0xA2, 0x06, 0x06, 0xA6, 0xBC, 0x06, 0x07, 0xA6, 0x7C, 0x05,
+       0x80, 0x67, 0x40, 0x0E,
+       0x80, 0x63, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x23, 0xDF, 0x00, 0x00, 0x63,
+       0x07, 0xA6, 0xD6, 0x06,
+       0x00, 0x33, 0x2A, 0x00, 0xC2, 0x88, 0x03, 0x03, 0x80, 0x63, 0x89, 0x00,
+       0x0A, 0x2B, 0x07, 0xA6,
+       0xE8, 0x06, 0x00, 0x33, 0x29, 0x00, 0xC2, 0x88, 0x00, 0x43, 0x00, 0xA2,
+       0xF4, 0x06, 0xC0, 0x0E,
+       0x80, 0x63, 0xDE, 0x86, 0xC0, 0x0E, 0x00, 0x33, 0x00, 0x80, 0xC0, 0x20,
+       0x81, 0x62, 0x04, 0x01,
+       0x02, 0xDA, 0x80, 0x63, 0x7C, 0x85, 0x80, 0x7B, 0x80, 0x63, 0x06, 0xA6,
+       0x8C, 0x06, 0x00, 0x33,
+       0x2C, 0x00, 0xC2, 0x88, 0x0C, 0xA2, 0x2E, 0x07, 0xFE, 0x95, 0x83, 0x03,
+       0x80, 0x63, 0x06, 0xA6,
+       0x2C, 0x07, 0x07, 0xA6, 0x7C, 0x05, 0x00, 0x33, 0x3D, 0x00, 0xC2, 0x88,
+       0x00, 0x00, 0x80, 0x67,
+       0x83, 0x03, 0x80, 0x63, 0x0C, 0xA0, 0x44, 0x07, 0x07, 0xA6, 0x7C, 0x05,
+       0xBF, 0x23, 0x04, 0x61,
+       0x84, 0x01, 0xE6, 0x84, 0x00, 0x63, 0xF0, 0x04, 0x01, 0x01, 0xF1, 0x00,
+       0x00, 0x01, 0xF2, 0x00,
+       0x01, 0x05, 0x80, 0x01, 0x72, 0x04, 0x71, 0x00, 0x81, 0x01, 0x70, 0x04,
+       0x80, 0x05, 0x81, 0x05,
+       0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04, 0x01, 0x01, 0xF1, 0x00,
+       0x70, 0x00, 0x81, 0x01,
+       0x70, 0x04, 0x71, 0x00, 0x81, 0x01, 0x72, 0x00, 0x80, 0x01, 0x71, 0x04,
+       0x70, 0x00, 0x80, 0x01,
+       0x70, 0x04, 0x00, 0x63, 0xF0, 0x04, 0xF2, 0x00, 0x72, 0x04, 0x00, 0x01,
+       0xF1, 0x00, 0x70, 0x00,
+       0x80, 0x01, 0x70, 0x04, 0x71, 0x00, 0x80, 0x01, 0x72, 0x00, 0x81, 0x01,
+       0x71, 0x04, 0x70, 0x00,
+       0x81, 0x01, 0x70, 0x04, 0x00, 0x63, 0x00, 0x23, 0xB3, 0x01, 0x83, 0x05,
+       0xA3, 0x01, 0xA2, 0x01,
+       0xA1, 0x01, 0x01, 0x23, 0xA0, 0x01, 0x00, 0x01, 0xC8, 0x00, 0x03, 0xA1,
+       0xC4, 0x07, 0x00, 0x33,
+       0x07, 0x00, 0xC2, 0x88, 0x80, 0x05, 0x81, 0x05, 0x04, 0x01, 0x11, 0xC8,
+       0x48, 0x00, 0xB0, 0x01,
+       0xB1, 0x01, 0x08, 0x23, 0xB2, 0x01, 0x05, 0x01, 0x48, 0x04, 0x00, 0x43,
+       0x00, 0xA2, 0xE4, 0x07,
+       0x00, 0x05, 0xDA, 0x87, 0x00, 0x01, 0xC8, 0x00, 0xFF, 0x23, 0x80, 0x01,
+       0x05, 0x05, 0x00, 0x63,
+       0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04, 0x00, 0x02, 0x80, 0x43,
+       0x76, 0x08, 0x80, 0x02,
+       0x77, 0x04, 0x00, 0x63, 0xF7, 0x04, 0x1A, 0x09, 0xF6, 0x08, 0x6E, 0x04,
+       0x00, 0x02, 0x00, 0xA0,
+       0x14, 0x08, 0x16, 0x88, 0x00, 0x43, 0x76, 0x08, 0x80, 0x02, 0x77, 0x04,
+       0x00, 0x63, 0xF3, 0x04,
+       0x00, 0x23, 0xF4, 0x00, 0x74, 0x00, 0x80, 0x43, 0xF4, 0x00, 0xCF, 0x40,
+       0x00, 0xA2, 0x44, 0x08,
+       0x74, 0x04, 0x02, 0x01, 0xF7, 0xC9, 0xF6, 0xD9, 0x00, 0x01, 0x01, 0xA1,
+       0x24, 0x08, 0x04, 0x98,
+       0x26, 0x95, 0x24, 0x88, 0x73, 0x04, 0x00, 0x63, 0xF3, 0x04, 0x75, 0x04,
+       0x5A, 0x88, 0x02, 0x01,
+       0x04, 0xD8, 0x46, 0x97, 0x04, 0x98, 0x26, 0x95, 0x4A, 0x88, 0x75, 0x00,
+       0x00, 0xA3, 0x64, 0x08,
+       0x00, 0x05, 0x4E, 0x88, 0x73, 0x04, 0x00, 0x63, 0x80, 0x7B, 0x80, 0x63,
+       0x06, 0xA6, 0x76, 0x08,
+       0x00, 0x33, 0x3E, 0x00, 0xC2, 0x88, 0x80, 0x67, 0x83, 0x03, 0x80, 0x63,
+       0x00, 0x63, 0x38, 0x2B,
+       0x9C, 0x88, 0x38, 0x2B, 0x92, 0x88, 0x32, 0x09, 0x31, 0x05, 0x92, 0x98,
+       0x05, 0x05, 0xB2, 0x09,
+       0x00, 0x63, 0x00, 0x32, 0x00, 0x36, 0x00, 0x3A, 0x00, 0x3E, 0x00, 0x63,
+       0x80, 0x32, 0x80, 0x36,
+       0x80, 0x3A, 0x80, 0x3E, 0xB4, 0x3D, 0x00, 0x63, 0x38, 0x2B, 0x40, 0x32,
+       0x40, 0x36, 0x40, 0x3A,
+       0x40, 0x3E, 0x00, 0x63, 0x5A, 0x20, 0xC9, 0x40, 0x00, 0xA0, 0xB4, 0x08,
+       0x5D, 0x00, 0xFE, 0xC3,
+       0x00, 0x63, 0x80, 0x73, 0xE6, 0x20, 0x02, 0x23, 0xE8, 0x00, 0x82, 0x73,
+       0xFF, 0xFD, 0x80, 0x73,
+       0x13, 0x23, 0xF8, 0x88, 0x66, 0x20, 0xC0, 0x20, 0x04, 0x23, 0xA0, 0x01,
+       0xA1, 0x23, 0xA1, 0x01,
+       0x81, 0x62, 0xE2, 0x88, 0x80, 0x73, 0x80, 0x77, 0x68, 0x00, 0x00, 0xA2,
+       0x80, 0x00, 0x03, 0xC2,
+       0xF1, 0xC7, 0x41, 0x23, 0xF8, 0x88, 0x11, 0x23, 0xA1, 0x01, 0x04, 0x23,
+       0xA0, 0x01, 0xE6, 0x84,
 };
 
-STATIC ushort _asc_mcode_size = sizeof(_asc_mcode_buf);
-STATIC ADV_DCNT _asc_mcode_chksum = 0x012C453FUL;
+static ushort _asc_mcode_size = sizeof(_asc_mcode_buf);
+static ADV_DCNT _asc_mcode_chksum = 0x012C453FUL;
 
 #define ASC_SYN_OFFSET_ONE_DISABLE_LIST  16
-STATIC uchar _syn_offset_one_disable_cmd[ASC_SYN_OFFSET_ONE_DISABLE_LIST] =
-{
-    INQUIRY,
-    REQUEST_SENSE,
-    READ_CAPACITY,
-    READ_TOC,
-    MODE_SELECT,
-    MODE_SENSE,
-    MODE_SELECT_10,
-    MODE_SENSE_10,
-    0xFF,
-    0xFF,
-    0xFF,
-    0xFF,
-    0xFF,
-    0xFF,
-    0xFF,
-    0xFF
+static uchar _syn_offset_one_disable_cmd[ASC_SYN_OFFSET_ONE_DISABLE_LIST] = {
+       INQUIRY,
+       REQUEST_SENSE,
+       READ_CAPACITY,
+       READ_TOC,
+       MODE_SELECT,
+       MODE_SENSE,
+       MODE_SELECT_10,
+       MODE_SENSE_10,
+       0xFF,
+       0xFF,
+       0xFF,
+       0xFF,
+       0xFF,
+       0xFF,
+       0xFF,
+       0xFF
 };
 
-STATIC int
-AscExeScsiQueue(
-                   ASC_DVC_VAR *asc_dvc,
-                   ASC_SCSI_Q *scsiq
-)
+static int AscExeScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq)
 {
-    PortAddr            iop_base;
-    ulong               last_int_level;
-    int                 sta;
-    int                 n_q_required;
-    int                 disable_syn_offset_one_fix;
-    int                 i;
-    ASC_PADDR           addr;
-    ASC_EXE_CALLBACK    asc_exe_callback;
-    ushort              sg_entry_cnt = 0;
-    ushort              sg_entry_cnt_minus_one = 0;
-    uchar               target_ix;
-    uchar               tid_no;
-    uchar               sdtr_data;
-    uchar               extra_bytes;
-    uchar               scsi_cmd;
-    uchar               disable_cmd;
-    ASC_SG_HEAD         *sg_head;
-    ASC_DCNT            data_cnt;
-
-    iop_base = asc_dvc->iop_base;
-    sg_head = scsiq->sg_head;
-    asc_exe_callback = asc_dvc->exe_callback;
-    if (asc_dvc->err_code != 0)
-        return (ERR);
-    if (scsiq == (ASC_SCSI_Q *) 0L) {
-        AscSetLibErrorCode(asc_dvc, ASCQ_ERR_SCSIQ_NULL_PTR);
-        return (ERR);
-    }
-    scsiq->q1.q_no = 0;
-    if ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES) == 0) {
-        scsiq->q1.extra_bytes = 0;
-    }
-    sta = 0;
-    target_ix = scsiq->q2.target_ix;
-    tid_no = ASC_TIX_TO_TID(target_ix);
-    n_q_required = 1;
-    if (scsiq->cdbptr[0] == REQUEST_SENSE) {
-        if ((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) {
-            asc_dvc->sdtr_done &= ~scsiq->q1.target_id;
-            sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
-            AscMsgOutSDTR(asc_dvc,
-                          asc_dvc->sdtr_period_tbl[(sdtr_data >> 4) &
-                          (uchar) (asc_dvc->max_sdtr_index - 1)],
-                          (uchar) (sdtr_data & (uchar) ASC_SYN_MAX_OFFSET));
-            scsiq->q1.cntl |= (QC_MSG_OUT | QC_URGENT);
-        }
-    }
-    last_int_level = DvcEnterCritical();
-    if (asc_dvc->in_critical_cnt != 0) {
-        DvcLeaveCritical(last_int_level);
-        AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CRITICAL_RE_ENTRY);
-        return (ERR);
-    }
-    asc_dvc->in_critical_cnt++;
-    if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
-        if ((sg_entry_cnt = sg_head->entry_cnt) == 0) {
-            asc_dvc->in_critical_cnt--;
-            DvcLeaveCritical(last_int_level);
-            return (ERR);
-        }
+       PortAddr iop_base;
+       ulong last_int_level;
+       int sta;
+       int n_q_required;
+       int disable_syn_offset_one_fix;
+       int i;
+       ASC_PADDR addr;
+       ASC_EXE_CALLBACK asc_exe_callback;
+       ushort sg_entry_cnt = 0;
+       ushort sg_entry_cnt_minus_one = 0;
+       uchar target_ix;
+       uchar tid_no;
+       uchar sdtr_data;
+       uchar extra_bytes;
+       uchar scsi_cmd;
+       uchar disable_cmd;
+       ASC_SG_HEAD *sg_head;
+       ASC_DCNT data_cnt;
+
+       iop_base = asc_dvc->iop_base;
+       sg_head = scsiq->sg_head;
+       asc_exe_callback = asc_dvc->exe_callback;
+       if (asc_dvc->err_code != 0)
+               return (ERR);
+       if (scsiq == (ASC_SCSI_Q *)0L) {
+               AscSetLibErrorCode(asc_dvc, ASCQ_ERR_SCSIQ_NULL_PTR);
+               return (ERR);
+       }
+       scsiq->q1.q_no = 0;
+       if ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES) == 0) {
+               scsiq->q1.extra_bytes = 0;
+       }
+       sta = 0;
+       target_ix = scsiq->q2.target_ix;
+       tid_no = ASC_TIX_TO_TID(target_ix);
+       n_q_required = 1;
+       if (scsiq->cdbptr[0] == REQUEST_SENSE) {
+               if ((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) {
+                       asc_dvc->sdtr_done &= ~scsiq->q1.target_id;
+                       sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
+                       AscMsgOutSDTR(asc_dvc,
+                                     asc_dvc->
+                                     sdtr_period_tbl[(sdtr_data >> 4) &
+                                                     (uchar)(asc_dvc->
+                                                             max_sdtr_index -
+                                                             1)],
+                                     (uchar)(sdtr_data & (uchar)
+                                             ASC_SYN_MAX_OFFSET));
+                       scsiq->q1.cntl |= (QC_MSG_OUT | QC_URGENT);
+               }
+       }
+       last_int_level = DvcEnterCritical();
+       if (asc_dvc->in_critical_cnt != 0) {
+               DvcLeaveCritical(last_int_level);
+               AscSetLibErrorCode(asc_dvc, ASCQ_ERR_CRITICAL_RE_ENTRY);
+               return (ERR);
+       }
+       asc_dvc->in_critical_cnt++;
+       if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
+               if ((sg_entry_cnt = sg_head->entry_cnt) == 0) {
+                       asc_dvc->in_critical_cnt--;
+                       DvcLeaveCritical(last_int_level);
+                       return (ERR);
+               }
 #if !CC_VERY_LONG_SG_LIST
-        if (sg_entry_cnt > ASC_MAX_SG_LIST)
-        {
-            asc_dvc->in_critical_cnt--;
-            DvcLeaveCritical(last_int_level);
-            return(ERR);
-        }
+               if (sg_entry_cnt > ASC_MAX_SG_LIST) {
+                       asc_dvc->in_critical_cnt--;
+                       DvcLeaveCritical(last_int_level);
+                       return (ERR);
+               }
 #endif /* !CC_VERY_LONG_SG_LIST */
-        if (sg_entry_cnt == 1) {
-            scsiq->q1.data_addr = (ADV_PADDR) sg_head->sg_list[0].addr;
-            scsiq->q1.data_cnt = (ADV_DCNT) sg_head->sg_list[0].bytes;
-            scsiq->q1.cntl &= ~(QC_SG_HEAD | QC_SG_SWAP_QUEUE);
-        }
-        sg_entry_cnt_minus_one = sg_entry_cnt - 1;
-    }
-    scsi_cmd = scsiq->cdbptr[0];
-    disable_syn_offset_one_fix = FALSE;
-    if ((asc_dvc->pci_fix_asyn_xfer & scsiq->q1.target_id) &&
-        !(asc_dvc->pci_fix_asyn_xfer_always & scsiq->q1.target_id)) {
-        if (scsiq->q1.cntl & QC_SG_HEAD) {
-            data_cnt = 0;
-            for (i = 0; i < sg_entry_cnt; i++) {
-                data_cnt += (ADV_DCNT) le32_to_cpu(sg_head->sg_list[i].bytes);
-            }
-        } else {
-            data_cnt = le32_to_cpu(scsiq->q1.data_cnt);
-        }
-        if (data_cnt != 0UL) {
-            if (data_cnt < 512UL) {
-                disable_syn_offset_one_fix = TRUE;
-            } else {
-                for (i = 0; i < ASC_SYN_OFFSET_ONE_DISABLE_LIST; i++) {
-                    disable_cmd = _syn_offset_one_disable_cmd[i];
-                    if (disable_cmd == 0xFF) {
-                        break;
-                    }
-                    if (scsi_cmd == disable_cmd) {
-                        disable_syn_offset_one_fix = TRUE;
-                        break;
-                    }
-                }
-            }
-        }
-    }
-    if (disable_syn_offset_one_fix) {
-        scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
-        scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX |
-                               ASC_TAG_FLAG_DISABLE_DISCONNECT);
-    } else {
-        scsiq->q2.tag_code &= 0x27;
-    }
-    if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
-        if (asc_dvc->bug_fix_cntl) {
-            if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
-                if ((scsi_cmd == READ_6) ||
-                    (scsi_cmd == READ_10)) {
-                    addr =
-                        (ADV_PADDR) le32_to_cpu(
-                            sg_head->sg_list[sg_entry_cnt_minus_one].addr) +
-                        (ADV_DCNT) le32_to_cpu(
-                            sg_head->sg_list[sg_entry_cnt_minus_one].bytes);
-                    extra_bytes = (uchar) ((ushort) addr & 0x0003);
-                    if ((extra_bytes != 0) &&
-                        ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES)
-                         == 0)) {
-                        scsiq->q2.tag_code |= ASC_TAG_FLAG_EXTRA_BYTES;
-                        scsiq->q1.extra_bytes = extra_bytes;
-                        data_cnt = le32_to_cpu(
-                            sg_head->sg_list[sg_entry_cnt_minus_one].bytes);
-                        data_cnt -= (ASC_DCNT) extra_bytes;
-                        sg_head->sg_list[sg_entry_cnt_minus_one].bytes =
-                            cpu_to_le32(data_cnt);
-                    }
-                }
-            }
-        }
-        sg_head->entry_to_copy = sg_head->entry_cnt;
+               if (sg_entry_cnt == 1) {
+                       scsiq->q1.data_addr =
+                           (ADV_PADDR)sg_head->sg_list[0].addr;
+                       scsiq->q1.data_cnt =
+                           (ADV_DCNT)sg_head->sg_list[0].bytes;
+                       scsiq->q1.cntl &= ~(QC_SG_HEAD | QC_SG_SWAP_QUEUE);
+               }
+               sg_entry_cnt_minus_one = sg_entry_cnt - 1;
+       }
+       scsi_cmd = scsiq->cdbptr[0];
+       disable_syn_offset_one_fix = FALSE;
+       if ((asc_dvc->pci_fix_asyn_xfer & scsiq->q1.target_id) &&
+           !(asc_dvc->pci_fix_asyn_xfer_always & scsiq->q1.target_id)) {
+               if (scsiq->q1.cntl & QC_SG_HEAD) {
+                       data_cnt = 0;
+                       for (i = 0; i < sg_entry_cnt; i++) {
+                               data_cnt +=
+                                   (ADV_DCNT)le32_to_cpu(sg_head->sg_list[i].
+                                                         bytes);
+                       }
+               } else {
+                       data_cnt = le32_to_cpu(scsiq->q1.data_cnt);
+               }
+               if (data_cnt != 0UL) {
+                       if (data_cnt < 512UL) {
+                               disable_syn_offset_one_fix = TRUE;
+                       } else {
+                               for (i = 0; i < ASC_SYN_OFFSET_ONE_DISABLE_LIST;
+                                    i++) {
+                                       disable_cmd =
+                                           _syn_offset_one_disable_cmd[i];
+                                       if (disable_cmd == 0xFF) {
+                                               break;
+                                       }
+                                       if (scsi_cmd == disable_cmd) {
+                                               disable_syn_offset_one_fix =
+                                                   TRUE;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       }
+       if (disable_syn_offset_one_fix) {
+               scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
+               scsiq->q2.tag_code |= (ASC_TAG_FLAG_DISABLE_ASYN_USE_SYN_FIX |
+                                      ASC_TAG_FLAG_DISABLE_DISCONNECT);
+       } else {
+               scsiq->q2.tag_code &= 0x27;
+       }
+       if ((scsiq->q1.cntl & QC_SG_HEAD) != 0) {
+               if (asc_dvc->bug_fix_cntl) {
+                       if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
+                               if ((scsi_cmd == READ_6) ||
+                                   (scsi_cmd == READ_10)) {
+                                       addr =
+                                           (ADV_PADDR)le32_to_cpu(sg_head->
+                                                                  sg_list
+                                                                  [sg_entry_cnt_minus_one].
+                                                                  addr) +
+                                           (ADV_DCNT)le32_to_cpu(sg_head->
+                                                                 sg_list
+                                                                 [sg_entry_cnt_minus_one].
+                                                                 bytes);
+                                       extra_bytes =
+                                           (uchar)((ushort)addr & 0x0003);
+                                       if ((extra_bytes != 0)
+                                           &&
+                                           ((scsiq->q2.
+                                             tag_code &
+                                             ASC_TAG_FLAG_EXTRA_BYTES)
+                                            == 0)) {
+                                               scsiq->q2.tag_code |=
+                                                   ASC_TAG_FLAG_EXTRA_BYTES;
+                                               scsiq->q1.extra_bytes =
+                                                   extra_bytes;
+                                               data_cnt =
+                                                   le32_to_cpu(sg_head->
+                                                               sg_list
+                                                               [sg_entry_cnt_minus_one].
+                                                               bytes);
+                                               data_cnt -=
+                                                   (ASC_DCNT) extra_bytes;
+                                               sg_head->
+                                                   sg_list
+                                                   [sg_entry_cnt_minus_one].
+                                                   bytes =
+                                                   cpu_to_le32(data_cnt);
+                                       }
+                               }
+                       }
+               }
+               sg_head->entry_to_copy = sg_head->entry_cnt;
 #if CC_VERY_LONG_SG_LIST
-        /*
-         * Set the sg_entry_cnt to the maximum possible. The rest of
-         * the SG elements will be copied when the RISC completes the
-         * SG elements that fit and halts.
-         */
-        if (sg_entry_cnt > ASC_MAX_SG_LIST)
-        {
-             sg_entry_cnt = ASC_MAX_SG_LIST;
-        }
+               /*
+                * Set the sg_entry_cnt to the maximum possible. The rest of
+                * the SG elements will be copied when the RISC completes the
+                * SG elements that fit and halts.
+                */
+               if (sg_entry_cnt > ASC_MAX_SG_LIST) {
+                       sg_entry_cnt = ASC_MAX_SG_LIST;
+               }
 #endif /* CC_VERY_LONG_SG_LIST */
-        n_q_required = AscSgListToQueue(sg_entry_cnt);
-        if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, n_q_required) >=
-            (uint) n_q_required) || ((scsiq->q1.cntl & QC_URGENT) != 0)) {
-            if ((sta = AscSendScsiQueue(asc_dvc, scsiq,
-                                        n_q_required)) == 1) {
-                asc_dvc->in_critical_cnt--;
-                if (asc_exe_callback != 0) {
-                    (*asc_exe_callback) (asc_dvc, scsiq);
-                }
-                DvcLeaveCritical(last_int_level);
-                return (sta);
-            }
-        }
-    } else {
-        if (asc_dvc->bug_fix_cntl) {
-            if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
-                if ((scsi_cmd == READ_6) ||
-                    (scsi_cmd == READ_10)) {
-                    addr = le32_to_cpu(scsiq->q1.data_addr) +
-                        le32_to_cpu(scsiq->q1.data_cnt);
-                    extra_bytes = (uchar) ((ushort) addr & 0x0003);
-                    if ((extra_bytes != 0) &&
-                        ((scsiq->q2.tag_code & ASC_TAG_FLAG_EXTRA_BYTES)
-                          == 0)) {
-                        data_cnt = le32_to_cpu(scsiq->q1.data_cnt);
-                        if (((ushort) data_cnt & 0x01FF) == 0) {
-                            scsiq->q2.tag_code |= ASC_TAG_FLAG_EXTRA_BYTES;
-                            data_cnt -= (ASC_DCNT) extra_bytes;
-                            scsiq->q1.data_cnt = cpu_to_le32(data_cnt);
-                            scsiq->q1.extra_bytes = extra_bytes;
-                        }
-                    }
-                }
-            }
-        }
-        n_q_required = 1;
-        if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, 1) >= 1) ||
-            ((scsiq->q1.cntl & QC_URGENT) != 0)) {
-            if ((sta = AscSendScsiQueue(asc_dvc, scsiq,
-                                        n_q_required)) == 1) {
-                asc_dvc->in_critical_cnt--;
-                if (asc_exe_callback != 0) {
-                    (*asc_exe_callback) (asc_dvc, scsiq);
-                }
-                DvcLeaveCritical(last_int_level);
-                return (sta);
-            }
-        }
-    }
-    asc_dvc->in_critical_cnt--;
-    DvcLeaveCritical(last_int_level);
-    return (sta);
+               n_q_required = AscSgListToQueue(sg_entry_cnt);
+               if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, n_q_required) >=
+                    (uint) n_q_required)
+                   || ((scsiq->q1.cntl & QC_URGENT) != 0)) {
+                       if ((sta =
+                            AscSendScsiQueue(asc_dvc, scsiq,
+                                             n_q_required)) == 1) {
+                               asc_dvc->in_critical_cnt--;
+                               if (asc_exe_callback != 0) {
+                                       (*asc_exe_callback) (asc_dvc, scsiq);
+                               }
+                               DvcLeaveCritical(last_int_level);
+                               return (sta);
+                       }
+               }
+       } else {
+               if (asc_dvc->bug_fix_cntl) {
+                       if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_IF_NOT_DWB) {
+                               if ((scsi_cmd == READ_6) ||
+                                   (scsi_cmd == READ_10)) {
+                                       addr =
+                                           le32_to_cpu(scsiq->q1.data_addr) +
+                                           le32_to_cpu(scsiq->q1.data_cnt);
+                                       extra_bytes =
+                                           (uchar)((ushort)addr & 0x0003);
+                                       if ((extra_bytes != 0)
+                                           &&
+                                           ((scsiq->q2.
+                                             tag_code &
+                                             ASC_TAG_FLAG_EXTRA_BYTES)
+                                            == 0)) {
+                                               data_cnt =
+                                                   le32_to_cpu(scsiq->q1.
+                                                               data_cnt);
+                                               if (((ushort)data_cnt & 0x01FF)
+                                                   == 0) {
+                                                       scsiq->q2.tag_code |=
+                                                           ASC_TAG_FLAG_EXTRA_BYTES;
+                                                       data_cnt -= (ASC_DCNT)
+                                                           extra_bytes;
+                                                       scsiq->q1.data_cnt =
+                                                           cpu_to_le32
+                                                           (data_cnt);
+                                                       scsiq->q1.extra_bytes =
+                                                           extra_bytes;
+                                               }
+                                       }
+                               }
+                       }
+               }
+               n_q_required = 1;
+               if ((AscGetNumOfFreeQueue(asc_dvc, target_ix, 1) >= 1) ||
+                   ((scsiq->q1.cntl & QC_URGENT) != 0)) {
+                       if ((sta = AscSendScsiQueue(asc_dvc, scsiq,
+                                                   n_q_required)) == 1) {
+                               asc_dvc->in_critical_cnt--;
+                               if (asc_exe_callback != 0) {
+                                       (*asc_exe_callback) (asc_dvc, scsiq);
+                               }
+                               DvcLeaveCritical(last_int_level);
+                               return (sta);
+                       }
+               }
+       }
+       asc_dvc->in_critical_cnt--;
+       DvcLeaveCritical(last_int_level);
+       return (sta);
 }
 
-STATIC int
-AscSendScsiQueue(
-                    ASC_DVC_VAR *asc_dvc,
-                    ASC_SCSI_Q *scsiq,
-                    uchar n_q_required
-)
+static int
+AscSendScsiQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar n_q_required)
 {
-    PortAddr            iop_base;
-    uchar               free_q_head;
-    uchar               next_qp;
-    uchar               tid_no;
-    uchar               target_ix;
-    int                 sta;
-
-    iop_base = asc_dvc->iop_base;
-    target_ix = scsiq->q2.target_ix;
-    tid_no = ASC_TIX_TO_TID(target_ix);
-    sta = 0;
-    free_q_head = (uchar) AscGetVarFreeQHead(iop_base);
-    if (n_q_required > 1) {
-        if ((next_qp = AscAllocMultipleFreeQueue(iop_base,
-                                       free_q_head, (uchar) (n_q_required)))
-            != (uchar) ASC_QLINK_END) {
-            asc_dvc->last_q_shortage = 0;
-            scsiq->sg_head->queue_cnt = n_q_required - 1;
-            scsiq->q1.q_no = free_q_head;
-            if ((sta = AscPutReadySgListQueue(asc_dvc, scsiq,
-                                              free_q_head)) == 1) {
-                AscPutVarFreeQHead(iop_base, next_qp);
-                asc_dvc->cur_total_qng += (uchar) (n_q_required);
-                asc_dvc->cur_dvc_qng[tid_no]++;
-            }
-            return (sta);
-        }
-    } else if (n_q_required == 1) {
-        if ((next_qp = AscAllocFreeQueue(iop_base,
-                                         free_q_head)) != ASC_QLINK_END) {
-            scsiq->q1.q_no = free_q_head;
-            if ((sta = AscPutReadyQueue(asc_dvc, scsiq,
-                                        free_q_head)) == 1) {
-                AscPutVarFreeQHead(iop_base, next_qp);
-                asc_dvc->cur_total_qng++;
-                asc_dvc->cur_dvc_qng[tid_no]++;
-            }
-            return (sta);
-        }
-    }
-    return (sta);
+       PortAddr iop_base;
+       uchar free_q_head;
+       uchar next_qp;
+       uchar tid_no;
+       uchar target_ix;
+       int sta;
+
+       iop_base = asc_dvc->iop_base;
+       target_ix = scsiq->q2.target_ix;
+       tid_no = ASC_TIX_TO_TID(target_ix);
+       sta = 0;
+       free_q_head = (uchar)AscGetVarFreeQHead(iop_base);
+       if (n_q_required > 1) {
+               if ((next_qp = AscAllocMultipleFreeQueue(iop_base,
+                                                        free_q_head, (uchar)
+                                                        (n_q_required)))
+                   != (uchar)ASC_QLINK_END) {
+                       asc_dvc->last_q_shortage = 0;
+                       scsiq->sg_head->queue_cnt = n_q_required - 1;
+                       scsiq->q1.q_no = free_q_head;
+                       if ((sta = AscPutReadySgListQueue(asc_dvc, scsiq,
+                                                         free_q_head)) == 1) {
+                               AscPutVarFreeQHead(iop_base, next_qp);
+                               asc_dvc->cur_total_qng += (uchar)(n_q_required);
+                               asc_dvc->cur_dvc_qng[tid_no]++;
+                       }
+                       return (sta);
+               }
+       } else if (n_q_required == 1) {
+               if ((next_qp = AscAllocFreeQueue(iop_base,
+                                                free_q_head)) !=
+                   ASC_QLINK_END) {
+                       scsiq->q1.q_no = free_q_head;
+                       if ((sta = AscPutReadyQueue(asc_dvc, scsiq,
+                                                   free_q_head)) == 1) {
+                               AscPutVarFreeQHead(iop_base, next_qp);
+                               asc_dvc->cur_total_qng++;
+                               asc_dvc->cur_dvc_qng[tid_no]++;
+                       }
+                       return (sta);
+               }
+       }
+       return (sta);
 }
 
-STATIC int
-AscSgListToQueue(
-                    int sg_list
-)
+static int AscSgListToQueue(int sg_list)
 {
-    int                 n_sg_list_qs;
+       int n_sg_list_qs;
 
-    n_sg_list_qs = ((sg_list - 1) / ASC_SG_LIST_PER_Q);
-    if (((sg_list - 1) % ASC_SG_LIST_PER_Q) != 0)
-        n_sg_list_qs++;
-    return (n_sg_list_qs + 1);
+       n_sg_list_qs = ((sg_list - 1) / ASC_SG_LIST_PER_Q);
+       if (((sg_list - 1) % ASC_SG_LIST_PER_Q) != 0)
+               n_sg_list_qs++;
+       return (n_sg_list_qs + 1);
 }
 
-
-STATIC uint
-AscGetNumOfFreeQueue(
-                        ASC_DVC_VAR *asc_dvc,
-                        uchar target_ix,
-                        uchar n_qs
-)
+static uint
+AscGetNumOfFreeQueue(ASC_DVC_VAR *asc_dvc, uchar target_ix, uchar n_qs)
 {
-    uint                cur_used_qs;
-    uint                cur_free_qs;
-    ASC_SCSI_BIT_ID_TYPE target_id;
-    uchar               tid_no;
-
-    target_id = ASC_TIX_TO_TARGET_ID(target_ix);
-    tid_no = ASC_TIX_TO_TID(target_ix);
-    if ((asc_dvc->unit_not_ready & target_id) ||
-        (asc_dvc->queue_full_or_busy & target_id)) {
-        return (0);
-    }
-    if (n_qs == 1) {
-        cur_used_qs = (uint) asc_dvc->cur_total_qng +
-          (uint) asc_dvc->last_q_shortage +
-          (uint) ASC_MIN_FREE_Q;
-    } else {
-        cur_used_qs = (uint) asc_dvc->cur_total_qng +
-          (uint) ASC_MIN_FREE_Q;
-    }
-    if ((uint) (cur_used_qs + n_qs) <= (uint) asc_dvc->max_total_qng) {
-        cur_free_qs = (uint) asc_dvc->max_total_qng - cur_used_qs;
-        if (asc_dvc->cur_dvc_qng[tid_no] >=
-            asc_dvc->max_dvc_qng[tid_no]) {
-            return (0);
-        }
-        return (cur_free_qs);
-    }
-    if (n_qs > 1) {
-        if ((n_qs > asc_dvc->last_q_shortage) && (n_qs <= (asc_dvc->max_total_qng - ASC_MIN_FREE_Q))) {
-            asc_dvc->last_q_shortage = n_qs;
-        }
-    }
-    return (0);
+       uint cur_used_qs;
+       uint cur_free_qs;
+       ASC_SCSI_BIT_ID_TYPE target_id;
+       uchar tid_no;
+
+       target_id = ASC_TIX_TO_TARGET_ID(target_ix);
+       tid_no = ASC_TIX_TO_TID(target_ix);
+       if ((asc_dvc->unit_not_ready & target_id) ||
+           (asc_dvc->queue_full_or_busy & target_id)) {
+               return (0);
+       }
+       if (n_qs == 1) {
+               cur_used_qs = (uint) asc_dvc->cur_total_qng +
+                   (uint) asc_dvc->last_q_shortage + (uint) ASC_MIN_FREE_Q;
+       } else {
+               cur_used_qs = (uint) asc_dvc->cur_total_qng +
+                   (uint) ASC_MIN_FREE_Q;
+       }
+       if ((uint) (cur_used_qs + n_qs) <= (uint) asc_dvc->max_total_qng) {
+               cur_free_qs = (uint) asc_dvc->max_total_qng - cur_used_qs;
+               if (asc_dvc->cur_dvc_qng[tid_no] >=
+                   asc_dvc->max_dvc_qng[tid_no]) {
+                       return (0);
+               }
+               return (cur_free_qs);
+       }
+       if (n_qs > 1) {
+               if ((n_qs > asc_dvc->last_q_shortage)
+                   && (n_qs <= (asc_dvc->max_total_qng - ASC_MIN_FREE_Q))) {
+                       asc_dvc->last_q_shortage = n_qs;
+               }
+       }
+       return (0);
 }
 
-STATIC int
-AscPutReadyQueue(
-                    ASC_DVC_VAR *asc_dvc,
-                    ASC_SCSI_Q *scsiq,
-                    uchar q_no
-)
+static int AscPutReadyQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no)
 {
-    ushort              q_addr;
-    uchar               tid_no;
-    uchar               sdtr_data;
-    uchar               syn_period_ix;
-    uchar               syn_offset;
-    PortAddr            iop_base;
-
-    iop_base = asc_dvc->iop_base;
-    if (((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) &&
-        ((asc_dvc->sdtr_done & scsiq->q1.target_id) == 0)) {
-        tid_no = ASC_TIX_TO_TID(scsiq->q2.target_ix);
-        sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
-        syn_period_ix = (sdtr_data >> 4) & (asc_dvc->max_sdtr_index - 1);
-        syn_offset = sdtr_data & ASC_SYN_MAX_OFFSET;
-        AscMsgOutSDTR(asc_dvc,
-                      asc_dvc->sdtr_period_tbl[syn_period_ix],
-                      syn_offset);
-        scsiq->q1.cntl |= QC_MSG_OUT;
-    }
-    q_addr = ASC_QNO_TO_QADDR(q_no);
-    if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) {
-        scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG ;
-    }
-    scsiq->q1.status = QS_FREE;
-    AscMemWordCopyPtrToLram(iop_base,
-                         q_addr + ASC_SCSIQ_CDB_BEG,
-                         (uchar *) scsiq->cdbptr,
-                         scsiq->q2.cdb_len >> 1);
-
-    DvcPutScsiQ(iop_base,
-                q_addr + ASC_SCSIQ_CPY_BEG,
-                (uchar *) &scsiq->q1.cntl,
-                ((sizeof(ASC_SCSIQ_1) + sizeof(ASC_SCSIQ_2)) / 2) - 1);
-    AscWriteLramWord(iop_base,
-                     (ushort) (q_addr + (ushort) ASC_SCSIQ_B_STATUS),
-             (ushort) (((ushort) scsiq->q1.q_no << 8) | (ushort) QS_READY));
-    return (1);
+       ushort q_addr;
+       uchar tid_no;
+       uchar sdtr_data;
+       uchar syn_period_ix;
+       uchar syn_offset;
+       PortAddr iop_base;
+
+       iop_base = asc_dvc->iop_base;
+       if (((asc_dvc->init_sdtr & scsiq->q1.target_id) != 0) &&
+           ((asc_dvc->sdtr_done & scsiq->q1.target_id) == 0)) {
+               tid_no = ASC_TIX_TO_TID(scsiq->q2.target_ix);
+               sdtr_data = AscGetMCodeInitSDTRAtID(iop_base, tid_no);
+               syn_period_ix =
+                   (sdtr_data >> 4) & (asc_dvc->max_sdtr_index - 1);
+               syn_offset = sdtr_data & ASC_SYN_MAX_OFFSET;
+               AscMsgOutSDTR(asc_dvc,
+                             asc_dvc->sdtr_period_tbl[syn_period_ix],
+                             syn_offset);
+               scsiq->q1.cntl |= QC_MSG_OUT;
+       }
+       q_addr = ASC_QNO_TO_QADDR(q_no);
+       if ((scsiq->q1.target_id & asc_dvc->use_tagged_qng) == 0) {
+               scsiq->q2.tag_code &= ~MSG_SIMPLE_TAG;
+       }
+       scsiq->q1.status = QS_FREE;
+       AscMemWordCopyPtrToLram(iop_base,
+                               q_addr + ASC_SCSIQ_CDB_BEG,
+                               (uchar *)scsiq->cdbptr, scsiq->q2.cdb_len >> 1);
+
+       DvcPutScsiQ(iop_base,
+                   q_addr + ASC_SCSIQ_CPY_BEG,
+                   (uchar *)&scsiq->q1.cntl,
+                   ((sizeof(ASC_SCSIQ_1) + sizeof(ASC_SCSIQ_2)) / 2) - 1);
+       AscWriteLramWord(iop_base,
+                        (ushort)(q_addr + (ushort)ASC_SCSIQ_B_STATUS),
+                        (ushort)(((ushort)scsiq->q1.
+                                  q_no << 8) | (ushort)QS_READY));
+       return (1);
 }
 
-STATIC int
-AscPutReadySgListQueue(
-                          ASC_DVC_VAR *asc_dvc,
-                          ASC_SCSI_Q *scsiq,
-                          uchar q_no
-)
+static int
+AscPutReadySgListQueue(ASC_DVC_VAR *asc_dvc, ASC_SCSI_Q *scsiq, uchar q_no)
 {
-    int                 sta;
-    int                 i;
-    ASC_SG_HEAD *sg_head;
-    ASC_SG_LIST_Q       scsi_sg_q;
-    ASC_DCNT            saved_data_addr;
-    ASC_DCNT            saved_data_cnt;
-    PortAddr            iop_base;
-    ushort              sg_list_dwords;
-    ushort              sg_index;
-    ushort              sg_entry_cnt;
-    ushort              q_addr;
-    uchar               next_qp;
-
-    iop_base = asc_dvc->iop_base;
-    sg_head = scsiq->sg_head;
-    saved_data_addr = scsiq->q1.data_addr;
-    saved_data_cnt = scsiq->q1.data_cnt;
-    scsiq->q1.data_addr = (ASC_PADDR) sg_head->sg_list[0].addr;
-    scsiq->q1.data_cnt = (ASC_DCNT) sg_head->sg_list[0].bytes;
+       int sta;
+       int i;
+       ASC_SG_HEAD *sg_head;
+       ASC_SG_LIST_Q scsi_sg_q;
+       ASC_DCNT saved_data_addr;
+       ASC_DCNT saved_data_cnt;
+       PortAddr iop_base;
+       ushort sg_list_dwords;
+       ushort sg_index;
+       ushort sg_entry_cnt;
+       ushort q_addr;
+       uchar next_qp;
+
+       iop_base = asc_dvc->iop_base;
+       sg_head = scsiq->sg_head;
+       saved_data_addr = scsiq->q1.data_addr;
+       saved_data_cnt = scsiq->q1.data_cnt;
+       scsiq->q1.data_addr = (ASC_PADDR) sg_head->sg_list[0].addr;
+       scsiq->q1.data_cnt = (ASC_DCNT) sg_head->sg_list[0].bytes;
 #if CC_VERY_LONG_SG_LIST
-    /*
-     * If sg_head->entry_cnt is greater than ASC_MAX_SG_LIST
-     * then not all SG elements will fit in the allocated queues.
-     * The rest of the SG elements will be copied when the RISC
-     * completes the SG elements that fit and halts.
-     */
-    if (sg_head->entry_cnt > ASC_MAX_SG_LIST)
-    {
-         /*
-          * Set sg_entry_cnt to be the number of SG elements that
-          * will fit in the allocated SG queues. It is minus 1, because
-          * the first SG element is handled above. ASC_MAX_SG_LIST is
-          * already inflated by 1 to account for this. For example it
-          * may be 50 which is 1 + 7 queues * 7 SG elements.
-          */
-         sg_entry_cnt = ASC_MAX_SG_LIST - 1;
-
-         /*
-          * Keep track of remaining number of SG elements that will
-          * need to be handled from a_isr.c.
-          */
-         scsiq->remain_sg_entry_cnt = sg_head->entry_cnt - ASC_MAX_SG_LIST;
-    } else
-    {
+       /*
+        * If sg_head->entry_cnt is greater than ASC_MAX_SG_LIST
+        * then not all SG elements will fit in the allocated queues.
+        * The rest of the SG elements will be copied when the RISC
+        * completes the SG elements that fit and halts.
+        */
+       if (sg_head->entry_cnt > ASC_MAX_SG_LIST) {
+               /*
+                * Set sg_entry_cnt to be the number of SG elements that
+                * will fit in the allocated SG queues. It is minus 1, because
+                * the first SG element is handled above. ASC_MAX_SG_LIST is
+                * already inflated by 1 to account for this. For example it
+                * may be 50 which is 1 + 7 queues * 7 SG elements.
+                */
+               sg_entry_cnt = ASC_MAX_SG_LIST - 1;
+
+               /*
+                * Keep track of remaining number of SG elements that will
+                * need to be handled from a_isr.c.
+                */
+               scsiq->remain_sg_entry_cnt =
+                   sg_head->entry_cnt - ASC_MAX_SG_LIST;
+       } else {
 #endif /* CC_VERY_LONG_SG_LIST */
-         /*
-          * Set sg_entry_cnt to be the number of SG elements that
-          * will fit in the allocated SG queues. It is minus 1, because
-          * the first SG element is handled above.
-          */
-         sg_entry_cnt = sg_head->entry_cnt - 1;
+               /*
+                * Set sg_entry_cnt to be the number of SG elements that
+                * will fit in the allocated SG queues. It is minus 1, because
+                * the first SG element is handled above.
+                */
+               sg_entry_cnt = sg_head->entry_cnt - 1;
 #if CC_VERY_LONG_SG_LIST
-    }
+       }
 #endif /* CC_VERY_LONG_SG_LIST */
-    if (sg_entry_cnt != 0) {
-        scsiq->q1.cntl |= QC_SG_HEAD;
-        q_addr = ASC_QNO_TO_QADDR(q_no);
-        sg_index = 1;
-        scsiq->q1.sg_queue_cnt = sg_head->queue_cnt;
-        scsi_sg_q.sg_head_qp = q_no;
-        scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
-        for (i = 0; i < sg_head->queue_cnt; i++) {
-            scsi_sg_q.seq_no = i + 1;
-            if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
-                sg_list_dwords = (uchar) (ASC_SG_LIST_PER_Q * 2);
-                sg_entry_cnt -= ASC_SG_LIST_PER_Q;
-                if (i == 0) {
-                    scsi_sg_q.sg_list_cnt = ASC_SG_LIST_PER_Q;
-                    scsi_sg_q.sg_cur_list_cnt = ASC_SG_LIST_PER_Q;
-                } else {
-                    scsi_sg_q.sg_list_cnt = ASC_SG_LIST_PER_Q - 1;
-                    scsi_sg_q.sg_cur_list_cnt = ASC_SG_LIST_PER_Q - 1;
-                }
-            } else {
+       if (sg_entry_cnt != 0) {
+               scsiq->q1.cntl |= QC_SG_HEAD;
+               q_addr = ASC_QNO_TO_QADDR(q_no);
+               sg_index = 1;
+               scsiq->q1.sg_queue_cnt = sg_head->queue_cnt;
+               scsi_sg_q.sg_head_qp = q_no;
+               scsi_sg_q.cntl = QCSG_SG_XFER_LIST;
+               for (i = 0; i < sg_head->queue_cnt; i++) {
+                       scsi_sg_q.seq_no = i + 1;
+                       if (sg_entry_cnt > ASC_SG_LIST_PER_Q) {
+                               sg_list_dwords = (uchar)(ASC_SG_LIST_PER_Q * 2);
+                               sg_entry_cnt -= ASC_SG_LIST_PER_Q;
+                               if (i == 0) {
+                                       scsi_sg_q.sg_list_cnt =
+                                           ASC_SG_LIST_PER_Q;
+                                       scsi_sg_q.sg_cur_list_cnt =
+                                           ASC_SG_LIST_PER_Q;
+                               } else {
+                                       scsi_sg_q.sg_list_cnt =
+                                           ASC_SG_LIST_PER_Q - 1;
+                                       scsi_sg_q.sg_cur_list_cnt =
+                                           ASC_SG_LIST_PER_Q - 1;
+                               }
+                       } else {
 #if CC_VERY_LONG_SG_LIST
-                /*
-                 * This is the last SG queue in the list of
-                 * allocated SG queues. If there are more
-                 * SG elements than will fit in the allocated
-                 * queues, then set the QCSG_SG_XFER_MORE flag.
-                 */
-                if (sg_head->entry_cnt > ASC_MAX_SG_LIST)
-                {
-                    scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
-                } else
-                {
+                               /*
+                                * This is the last SG queue in the list of
+                                * allocated SG queues. If there are more
+                                * SG elements than will fit in the allocated
+                                * queues, then set the QCSG_SG_XFER_MORE flag.
+                                */
+                               if (sg_head->entry_cnt > ASC_MAX_SG_LIST) {
+                                       scsi_sg_q.cntl |= QCSG_SG_XFER_MORE;
+                               } else {
 #endif /* CC_VERY_LONG_SG_LIST */
-                    scsi_sg_q.cntl |= QCSG_SG_XFER_END;
+                                       scsi_sg_q.cntl |= QCSG_SG_XFER_END;
 #if CC_VERY_LONG_SG_LIST
-                }
+                               }
 #endif /* CC_VERY_LONG_SG_LIST */
-                sg_list_dwords = sg_entry_cnt << 1;
-                if (i == 0) {
-                    scsi_sg_q.sg_list_cnt = sg_entry_cnt;
-                    scsi_sg_q.sg_cur_list_cnt = sg_entry_cnt;
-                } else {
-                    scsi_sg_q.sg_list_cnt = sg_entry_cnt - 1;
-                    scsi_sg_q.sg_cur_list_cnt = sg_entry_cnt - 1;
-                }
-                sg_entry_cnt = 0;
-            }
-            next_qp = AscReadLramByte(iop_base,
-                                      (ushort) (q_addr + ASC_SCSIQ_B_FWD));
-            scsi_sg_q.q_no = next_qp;
-            q_addr = ASC_QNO_TO_QADDR(next_qp);
-            AscMemWordCopyPtrToLram(iop_base,
-                                q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
-                                (uchar *) &scsi_sg_q,
-                                sizeof(ASC_SG_LIST_Q) >> 1);
-            AscMemDWordCopyPtrToLram(iop_base,
-                                q_addr + ASC_SGQ_LIST_BEG,
-                                (uchar *) &sg_head->sg_list[sg_index],
-                                sg_list_dwords);
-            sg_index += ASC_SG_LIST_PER_Q;
-            scsiq->next_sg_index = sg_index;
-        }
-    } else {
-        scsiq->q1.cntl &= ~QC_SG_HEAD;
-    }
-    sta = AscPutReadyQueue(asc_dvc, scsiq, q_no);
-    scsiq->q1.data_addr = saved_data_addr;
-    scsiq->q1.data_cnt = saved_data_cnt;
-    return (sta);
+                               sg_list_dwords = sg_entry_cnt << 1;
+                               if (i == 0) {
+                                       scsi_sg_q.sg_list_cnt = sg_entry_cnt;
+                                       scsi_sg_q.sg_cur_list_cnt =
+                                           sg_entry_cnt;
+                               } else {
+                                       scsi_sg_q.sg_list_cnt =
+                                           sg_entry_cnt - 1;
+                                       scsi_sg_q.sg_cur_list_cnt =
+                                           sg_entry_cnt - 1;
+                               }
+                               sg_entry_cnt = 0;
+                       }
+                       next_qp = AscReadLramByte(iop_base,
+                                                 (ushort)(q_addr +
+                                                          ASC_SCSIQ_B_FWD));
+                       scsi_sg_q.q_no = next_qp;
+                       q_addr = ASC_QNO_TO_QADDR(next_qp);
+                       AscMemWordCopyPtrToLram(iop_base,
+                                               q_addr + ASC_SCSIQ_SGHD_CPY_BEG,
+                                               (uchar *)&scsi_sg_q,
+                                               sizeof(ASC_SG_LIST_Q) >> 1);
+                       AscMemDWordCopyPtrToLram(iop_base,
+                                                q_addr + ASC_SGQ_LIST_BEG,
+                                                (uchar *)&sg_head->
+                                                sg_list[sg_index],
+                                                sg_list_dwords);
+                       sg_index += ASC_SG_LIST_PER_Q;
+                       scsiq->next_sg_index = sg_index;
+               }
+       } else {
+               scsiq->q1.cntl &= ~QC_SG_HEAD;
+       }
+       sta = AscPutReadyQueue(asc_dvc, scsiq, q_no);
+       scsiq->q1.data_addr = saved_data_addr;
+       scsiq->q1.data_cnt = saved_data_cnt;
+       return (sta);
 }
 
-STATIC int
-AscSetRunChipSynRegAtID(
-                           PortAddr iop_base,
-                           uchar tid_no,
-                           uchar sdtr_data
-)
+static int
+AscSetRunChipSynRegAtID(PortAddr iop_base, uchar tid_no, uchar sdtr_data)
 {
-    int                 sta = FALSE;
+       int sta = FALSE;
 
-    if (AscHostReqRiscHalt(iop_base)) {
-        sta = AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
-        AscStartChip(iop_base);
-        return (sta);
-    }
-    return (sta);
+       if (AscHostReqRiscHalt(iop_base)) {
+               sta = AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
+               AscStartChip(iop_base);
+               return (sta);
+       }
+       return (sta);
 }
 
-STATIC int
-AscSetChipSynRegAtID(
-                        PortAddr iop_base,
-                        uchar id,
-                        uchar sdtr_data
-)
+static int AscSetChipSynRegAtID(PortAddr iop_base, uchar id, uchar sdtr_data)
 {
-    ASC_SCSI_BIT_ID_TYPE org_id;
-    int                 i;
-    int                 sta = TRUE;
-
-    AscSetBank(iop_base, 1);
-    org_id = AscReadChipDvcID(iop_base);
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        if (org_id == (0x01 << i))
-            break;
-    }
-    org_id = (ASC_SCSI_BIT_ID_TYPE) i;
-    AscWriteChipDvcID(iop_base, id);
-    if (AscReadChipDvcID(iop_base) == (0x01 << id)) {
-        AscSetBank(iop_base, 0);
-        AscSetChipSyn(iop_base, sdtr_data);
-        if (AscGetChipSyn(iop_base) != sdtr_data) {
-            sta = FALSE;
-        }
-    } else {
-        sta = FALSE;
-    }
-    AscSetBank(iop_base, 1);
-    AscWriteChipDvcID(iop_base, org_id);
-    AscSetBank(iop_base, 0);
-    return (sta);
-}
+       ASC_SCSI_BIT_ID_TYPE org_id;
+       int i;
+       int sta = TRUE;
+
+       AscSetBank(iop_base, 1);
+       org_id = AscReadChipDvcID(iop_base);
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               if (org_id == (0x01 << i))
+                       break;
+       }
+       org_id = (ASC_SCSI_BIT_ID_TYPE) i;
+       AscWriteChipDvcID(iop_base, id);
+       if (AscReadChipDvcID(iop_base) == (0x01 << id)) {
+               AscSetBank(iop_base, 0);
+               AscSetChipSyn(iop_base, sdtr_data);
+               if (AscGetChipSyn(iop_base) != sdtr_data) {
+                       sta = FALSE;
+               }
+       } else {
+               sta = FALSE;
+       }
+       AscSetBank(iop_base, 1);
+       AscWriteChipDvcID(iop_base, org_id);
+       AscSetBank(iop_base, 0);
+       return (sta);
+}
 
-STATIC ushort
-AscInitLram(
-               ASC_DVC_VAR *asc_dvc
-)
+static ushort AscInitLram(ASC_DVC_VAR *asc_dvc)
 {
-    uchar               i;
-    ushort              s_addr;
-    PortAddr            iop_base;
-    ushort              warn_code;
-
-    iop_base = asc_dvc->iop_base;
-    warn_code = 0;
-    AscMemWordSetLram(iop_base, ASC_QADR_BEG, 0,
-               (ushort) (((int) (asc_dvc->max_total_qng + 2 + 1) * 64) >> 1)
-);
-    i = ASC_MIN_ACTIVE_QNO;
-    s_addr = ASC_QADR_BEG + ASC_QBLK_SIZE;
-    AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_FWD),
-                     (uchar) (i + 1));
-    AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_BWD),
-                     (uchar) (asc_dvc->max_total_qng));
-    AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_QNO),
-                     (uchar) i);
-    i++;
-    s_addr += ASC_QBLK_SIZE;
-    for (; i < asc_dvc->max_total_qng; i++, s_addr += ASC_QBLK_SIZE) {
-        AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_FWD),
-                         (uchar) (i + 1));
-        AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_BWD),
-                         (uchar) (i - 1));
-        AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_QNO),
-                         (uchar) i);
-    }
-    AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_FWD),
-                     (uchar) ASC_QLINK_END);
-    AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_BWD),
-                     (uchar) (asc_dvc->max_total_qng - 1));
-    AscWriteLramByte(iop_base, (ushort) (s_addr + ASC_SCSIQ_B_QNO),
-                     (uchar) asc_dvc->max_total_qng);
-    i++;
-    s_addr += ASC_QBLK_SIZE;
-    for (; i <= (uchar) (asc_dvc->max_total_qng + 3);
-         i++, s_addr += ASC_QBLK_SIZE) {
-        AscWriteLramByte(iop_base,
-                         (ushort) (s_addr + (ushort) ASC_SCSIQ_B_FWD), i);
-        AscWriteLramByte(iop_base,
-                         (ushort) (s_addr + (ushort) ASC_SCSIQ_B_BWD), i);
-        AscWriteLramByte(iop_base,
-                         (ushort) (s_addr + (ushort) ASC_SCSIQ_B_QNO), i);
-    }
-    return (warn_code);
+       uchar i;
+       ushort s_addr;
+       PortAddr iop_base;
+       ushort warn_code;
+
+       iop_base = asc_dvc->iop_base;
+       warn_code = 0;
+       AscMemWordSetLram(iop_base, ASC_QADR_BEG, 0,
+                         (ushort)(((int)(asc_dvc->max_total_qng + 2 + 1) *
+                                   64) >> 1)
+           );
+       i = ASC_MIN_ACTIVE_QNO;
+       s_addr = ASC_QADR_BEG + ASC_QBLK_SIZE;
+       AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
+                        (uchar)(i + 1));
+       AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
+                        (uchar)(asc_dvc->max_total_qng));
+       AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
+                        (uchar)i);
+       i++;
+       s_addr += ASC_QBLK_SIZE;
+       for (; i < asc_dvc->max_total_qng; i++, s_addr += ASC_QBLK_SIZE) {
+               AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
+                                (uchar)(i + 1));
+               AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
+                                (uchar)(i - 1));
+               AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
+                                (uchar)i);
+       }
+       AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_FWD),
+                        (uchar)ASC_QLINK_END);
+       AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_BWD),
+                        (uchar)(asc_dvc->max_total_qng - 1));
+       AscWriteLramByte(iop_base, (ushort)(s_addr + ASC_SCSIQ_B_QNO),
+                        (uchar)asc_dvc->max_total_qng);
+       i++;
+       s_addr += ASC_QBLK_SIZE;
+       for (; i <= (uchar)(asc_dvc->max_total_qng + 3);
+            i++, s_addr += ASC_QBLK_SIZE) {
+               AscWriteLramByte(iop_base,
+                                (ushort)(s_addr + (ushort)ASC_SCSIQ_B_FWD), i);
+               AscWriteLramByte(iop_base,
+                                (ushort)(s_addr + (ushort)ASC_SCSIQ_B_BWD), i);
+               AscWriteLramByte(iop_base,
+                                (ushort)(s_addr + (ushort)ASC_SCSIQ_B_QNO), i);
+       }
+       return (warn_code);
 }
 
-STATIC ushort
-AscInitQLinkVar(
-                   ASC_DVC_VAR *asc_dvc
-)
+static ushort AscInitQLinkVar(ASC_DVC_VAR *asc_dvc)
 {
-    PortAddr            iop_base;
-    int                 i;
-    ushort              lram_addr;
-
-    iop_base = asc_dvc->iop_base;
-    AscPutRiscVarFreeQHead(iop_base, 1);
-    AscPutRiscVarDoneQTail(iop_base, asc_dvc->max_total_qng);
-    AscPutVarFreeQHead(iop_base, 1);
-    AscPutVarDoneQTail(iop_base, asc_dvc->max_total_qng);
-    AscWriteLramByte(iop_base, ASCV_BUSY_QHEAD_B,
-                     (uchar) ((int) asc_dvc->max_total_qng + 1));
-    AscWriteLramByte(iop_base, ASCV_DISC1_QHEAD_B,
-                     (uchar) ((int) asc_dvc->max_total_qng + 2));
-    AscWriteLramByte(iop_base, (ushort) ASCV_TOTAL_READY_Q_B,
-                     asc_dvc->max_total_qng);
-    AscWriteLramWord(iop_base, ASCV_ASCDVC_ERR_CODE_W, 0);
-    AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
-    AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, 0);
-    AscWriteLramByte(iop_base, ASCV_SCSIBUSY_B, 0);
-    AscWriteLramByte(iop_base, ASCV_WTM_FLAG_B, 0);
-    AscPutQDoneInProgress(iop_base, 0);
-    lram_addr = ASC_QADR_BEG;
-    for (i = 0; i < 32; i++, lram_addr += 2) {
-        AscWriteLramWord(iop_base, lram_addr, 0);
-    }
-    return (0);
+       PortAddr iop_base;
+       int i;
+       ushort lram_addr;
+
+       iop_base = asc_dvc->iop_base;
+       AscPutRiscVarFreeQHead(iop_base, 1);
+       AscPutRiscVarDoneQTail(iop_base, asc_dvc->max_total_qng);
+       AscPutVarFreeQHead(iop_base, 1);
+       AscPutVarDoneQTail(iop_base, asc_dvc->max_total_qng);
+       AscWriteLramByte(iop_base, ASCV_BUSY_QHEAD_B,
+                        (uchar)((int)asc_dvc->max_total_qng + 1));
+       AscWriteLramByte(iop_base, ASCV_DISC1_QHEAD_B,
+                        (uchar)((int)asc_dvc->max_total_qng + 2));
+       AscWriteLramByte(iop_base, (ushort)ASCV_TOTAL_READY_Q_B,
+                        asc_dvc->max_total_qng);
+       AscWriteLramWord(iop_base, ASCV_ASCDVC_ERR_CODE_W, 0);
+       AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0);
+       AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, 0);
+       AscWriteLramByte(iop_base, ASCV_SCSIBUSY_B, 0);
+       AscWriteLramByte(iop_base, ASCV_WTM_FLAG_B, 0);
+       AscPutQDoneInProgress(iop_base, 0);
+       lram_addr = ASC_QADR_BEG;
+       for (i = 0; i < 32; i++, lram_addr += 2) {
+               AscWriteLramWord(iop_base, lram_addr, 0);
+       }
+       return (0);
 }
 
-STATIC int
-AscSetLibErrorCode(
-                      ASC_DVC_VAR *asc_dvc,
-                      ushort err_code
-)
+static int AscSetLibErrorCode(ASC_DVC_VAR *asc_dvc, ushort err_code)
 {
-    if (asc_dvc->err_code == 0) {
-        asc_dvc->err_code = err_code;
-        AscWriteLramWord(asc_dvc->iop_base, ASCV_ASCDVC_ERR_CODE_W,
-                         err_code);
-    }
-    return (err_code);
+       if (asc_dvc->err_code == 0) {
+               asc_dvc->err_code = err_code;
+               AscWriteLramWord(asc_dvc->iop_base, ASCV_ASCDVC_ERR_CODE_W,
+                                err_code);
+       }
+       return (err_code);
 }
 
-
-STATIC uchar
-AscMsgOutSDTR(
-                 ASC_DVC_VAR *asc_dvc,
-                 uchar sdtr_period,
-                 uchar sdtr_offset
-)
+static uchar
+AscMsgOutSDTR(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar sdtr_offset)
 {
-    EXT_MSG             sdtr_buf;
-    uchar               sdtr_period_index;
-    PortAddr            iop_base;
-
-    iop_base = asc_dvc->iop_base;
-    sdtr_buf.msg_type = MS_EXTEND;
-    sdtr_buf.msg_len = MS_SDTR_LEN;
-    sdtr_buf.msg_req = MS_SDTR_CODE;
-    sdtr_buf.xfer_period = sdtr_period;
-    sdtr_offset &= ASC_SYN_MAX_OFFSET;
-    sdtr_buf.req_ack_offset = sdtr_offset;
-    if ((sdtr_period_index =
-         AscGetSynPeriodIndex(asc_dvc, sdtr_period)) <=
-        asc_dvc->max_sdtr_index) {
-        AscMemWordCopyPtrToLram(iop_base,
-                             ASCV_MSGOUT_BEG,
-                             (uchar *) &sdtr_buf,
-                             sizeof (EXT_MSG) >> 1);
-        return ((sdtr_period_index << 4) | sdtr_offset);
-    } else {
-
-        sdtr_buf.req_ack_offset = 0;
-        AscMemWordCopyPtrToLram(iop_base,
-                             ASCV_MSGOUT_BEG,
-                             (uchar *) &sdtr_buf,
-                             sizeof (EXT_MSG) >> 1);
-        return (0);
-    }
+       EXT_MSG sdtr_buf;
+       uchar sdtr_period_index;
+       PortAddr iop_base;
+
+       iop_base = asc_dvc->iop_base;
+       sdtr_buf.msg_type = MS_EXTEND;
+       sdtr_buf.msg_len = MS_SDTR_LEN;
+       sdtr_buf.msg_req = MS_SDTR_CODE;
+       sdtr_buf.xfer_period = sdtr_period;
+       sdtr_offset &= ASC_SYN_MAX_OFFSET;
+       sdtr_buf.req_ack_offset = sdtr_offset;
+       if ((sdtr_period_index =
+            AscGetSynPeriodIndex(asc_dvc, sdtr_period)) <=
+           asc_dvc->max_sdtr_index) {
+               AscMemWordCopyPtrToLram(iop_base,
+                                       ASCV_MSGOUT_BEG,
+                                       (uchar *)&sdtr_buf,
+                                       sizeof(EXT_MSG) >> 1);
+               return ((sdtr_period_index << 4) | sdtr_offset);
+       } else {
+
+               sdtr_buf.req_ack_offset = 0;
+               AscMemWordCopyPtrToLram(iop_base,
+                                       ASCV_MSGOUT_BEG,
+                                       (uchar *)&sdtr_buf,
+                                       sizeof(EXT_MSG) >> 1);
+               return (0);
+       }
 }
 
-STATIC uchar
-AscCalSDTRData(
-                  ASC_DVC_VAR *asc_dvc,
-                  uchar sdtr_period,
-                  uchar syn_offset
-)
+static uchar
+AscCalSDTRData(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar syn_offset)
 {
-    uchar               byte;
-    uchar               sdtr_period_ix;
-
-    sdtr_period_ix = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
-    if (
-           (sdtr_period_ix > asc_dvc->max_sdtr_index)
-) {
-        return (0xFF);
-    }
-    byte = (sdtr_period_ix << 4) | (syn_offset & ASC_SYN_MAX_OFFSET);
-    return (byte);
+       uchar byte;
+       uchar sdtr_period_ix;
+
+       sdtr_period_ix = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
+       if ((sdtr_period_ix > asc_dvc->max_sdtr_index)
+           ) {
+               return (0xFF);
+       }
+       byte = (sdtr_period_ix << 4) | (syn_offset & ASC_SYN_MAX_OFFSET);
+       return (byte);
 }
 
-STATIC void
-AscSetChipSDTR(
-                  PortAddr iop_base,
-                  uchar sdtr_data,
-                  uchar tid_no
-)
+static void AscSetChipSDTR(PortAddr iop_base, uchar sdtr_data, uchar tid_no)
 {
-    AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
-    AscPutMCodeSDTRDoneAtID(iop_base, tid_no, sdtr_data);
-    return;
+       AscSetChipSynRegAtID(iop_base, tid_no, sdtr_data);
+       AscPutMCodeSDTRDoneAtID(iop_base, tid_no, sdtr_data);
+       return;
 }
 
-STATIC uchar
-AscGetSynPeriodIndex(
-                        ASC_DVC_VAR *asc_dvc,
-                        uchar syn_time
-)
+static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time)
 {
-    uchar             *period_table;
-    int                 max_index;
-    int                 min_index;
-    int                 i;
-
-    period_table = asc_dvc->sdtr_period_tbl;
-    max_index = (int) asc_dvc->max_sdtr_index;
-    min_index = (int)asc_dvc->host_init_sdtr_index;
-    if ((syn_time <= period_table[max_index])) {
-        for (i = min_index; i < (max_index - 1); i++) {
-            if (syn_time <= period_table[i]) {
-                return ((uchar) i);
-            }
-        }
-        return ((uchar) max_index);
-    } else {
-        return ((uchar) (max_index + 1));
-    }
+       uchar *period_table;
+       int max_index;
+       int min_index;
+       int i;
+
+       period_table = asc_dvc->sdtr_period_tbl;
+       max_index = (int)asc_dvc->max_sdtr_index;
+       min_index = (int)asc_dvc->host_init_sdtr_index;
+       if ((syn_time <= period_table[max_index])) {
+               for (i = min_index; i < (max_index - 1); i++) {
+                       if (syn_time <= period_table[i]) {
+                               return ((uchar)i);
+                       }
+               }
+               return ((uchar)max_index);
+       } else {
+               return ((uchar)(max_index + 1));
+       }
 }
 
-STATIC uchar
-AscAllocFreeQueue(
-                     PortAddr iop_base,
-                     uchar free_q_head
-)
+static uchar AscAllocFreeQueue(PortAddr iop_base, uchar free_q_head)
 {
-    ushort              q_addr;
-    uchar               next_qp;
-    uchar               q_status;
-
-    q_addr = ASC_QNO_TO_QADDR(free_q_head);
-    q_status = (uchar) AscReadLramByte(iop_base,
-                                    (ushort) (q_addr + ASC_SCSIQ_B_STATUS));
-    next_qp = AscReadLramByte(iop_base,
-                              (ushort) (q_addr + ASC_SCSIQ_B_FWD));
-    if (((q_status & QS_READY) == 0) && (next_qp != ASC_QLINK_END)) {
-        return (next_qp);
-    }
-    return (ASC_QLINK_END);
+       ushort q_addr;
+       uchar next_qp;
+       uchar q_status;
+
+       q_addr = ASC_QNO_TO_QADDR(free_q_head);
+       q_status = (uchar)AscReadLramByte(iop_base,
+                                         (ushort)(q_addr +
+                                                  ASC_SCSIQ_B_STATUS));
+       next_qp = AscReadLramByte(iop_base, (ushort)(q_addr + ASC_SCSIQ_B_FWD));
+       if (((q_status & QS_READY) == 0) && (next_qp != ASC_QLINK_END)) {
+               return (next_qp);
+       }
+       return (ASC_QLINK_END);
 }
 
-STATIC uchar
-AscAllocMultipleFreeQueue(
-                             PortAddr iop_base,
-                             uchar free_q_head,
-                             uchar n_free_q
-)
+static uchar
+AscAllocMultipleFreeQueue(PortAddr iop_base, uchar free_q_head, uchar n_free_q)
 {
-    uchar               i;
+       uchar i;
 
-    for (i = 0; i < n_free_q; i++) {
-        if ((free_q_head = AscAllocFreeQueue(iop_base, free_q_head))
-            == ASC_QLINK_END) {
-            return (ASC_QLINK_END);
-        }
-    }
-    return (free_q_head);
+       for (i = 0; i < n_free_q; i++) {
+               if ((free_q_head = AscAllocFreeQueue(iop_base, free_q_head))
+                   == ASC_QLINK_END) {
+                       return (ASC_QLINK_END);
+               }
+       }
+       return (free_q_head);
 }
 
-STATIC int
-AscHostReqRiscHalt(
-                      PortAddr iop_base
-)
+static int AscHostReqRiscHalt(PortAddr iop_base)
 {
-    int                 count = 0;
-    int                 sta = 0;
-    uchar               saved_stop_code;
-
-    if (AscIsChipHalted(iop_base))
-        return (1);
-    saved_stop_code = AscReadLramByte(iop_base, ASCV_STOP_CODE_B);
-    AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
-                     ASC_STOP_HOST_REQ_RISC_HALT | ASC_STOP_REQ_RISC_STOP
-);
-    do {
-        if (AscIsChipHalted(iop_base)) {
-            sta = 1;
-            break;
-        }
-        DvcSleepMilliSecond(100);
-    } while (count++ < 20);
-    AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, saved_stop_code);
-    return (sta);
+       int count = 0;
+       int sta = 0;
+       uchar saved_stop_code;
+
+       if (AscIsChipHalted(iop_base))
+               return (1);
+       saved_stop_code = AscReadLramByte(iop_base, ASCV_STOP_CODE_B);
+       AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
+                        ASC_STOP_HOST_REQ_RISC_HALT | ASC_STOP_REQ_RISC_STOP);
+       do {
+               if (AscIsChipHalted(iop_base)) {
+                       sta = 1;
+                       break;
+               }
+               DvcSleepMilliSecond(100);
+       } while (count++ < 20);
+       AscWriteLramByte(iop_base, ASCV_STOP_CODE_B, saved_stop_code);
+       return (sta);
 }
 
-STATIC int
-AscStopQueueExe(
-                   PortAddr iop_base
-)
+static int AscStopQueueExe(PortAddr iop_base)
 {
-    int                 count = 0;
-
-    if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) == 0) {
-        AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
-                         ASC_STOP_REQ_RISC_STOP);
-        do {
-            if (
-                   AscReadLramByte(iop_base, ASCV_STOP_CODE_B) &
-                   ASC_STOP_ACK_RISC_STOP) {
-                return (1);
-            }
-            DvcSleepMilliSecond(100);
-        } while (count++ < 20);
-    }
-    return (0);
+       int count = 0;
+
+       if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) == 0) {
+               AscWriteLramByte(iop_base, ASCV_STOP_CODE_B,
+                                ASC_STOP_REQ_RISC_STOP);
+               do {
+                       if (AscReadLramByte(iop_base, ASCV_STOP_CODE_B) &
+                           ASC_STOP_ACK_RISC_STOP) {
+                               return (1);
+                       }
+                       DvcSleepMilliSecond(100);
+               } while (count++ < 20);
+       }
+       return (0);
 }
 
-STATIC void
-DvcDelayMicroSecond(ADV_DVC_VAR *asc_dvc, ushort micro_sec)
+static void DvcDelayMicroSecond(ADV_DVC_VAR *asc_dvc, ushort micro_sec)
 {
-    udelay(micro_sec);
+       udelay(micro_sec);
 }
 
-STATIC void
-DvcDelayNanoSecond(ASC_DVC_VAR *asc_dvc, ASC_DCNT nano_sec)
+static void DvcDelayNanoSecond(ASC_DVC_VAR *asc_dvc, ASC_DCNT nano_sec)
 {
-    udelay((nano_sec + 999)/1000);
+       udelay((nano_sec + 999) / 1000);
 }
 
 #ifdef CONFIG_ISA
-STATIC ASC_DCNT __init
-AscGetEisaProductID(
-                       PortAddr iop_base)
+static ASC_DCNT __init AscGetEisaProductID(PortAddr iop_base)
 {
-    PortAddr            eisa_iop;
-    ushort              product_id_high, product_id_low;
-    ASC_DCNT            product_id;
-
-    eisa_iop = ASC_GET_EISA_SLOT(iop_base) | ASC_EISA_PID_IOP_MASK;
-    product_id_low = inpw(eisa_iop);
-    product_id_high = inpw(eisa_iop + 2);
-    product_id = ((ASC_DCNT) product_id_high << 16) |
-        (ASC_DCNT) product_id_low;
-    return (product_id);
+       PortAddr eisa_iop;
+       ushort product_id_high, product_id_low;
+       ASC_DCNT product_id;
+
+       eisa_iop = ASC_GET_EISA_SLOT(iop_base) | ASC_EISA_PID_IOP_MASK;
+       product_id_low = inpw(eisa_iop);
+       product_id_high = inpw(eisa_iop + 2);
+       product_id = ((ASC_DCNT) product_id_high << 16) |
+           (ASC_DCNT) product_id_low;
+       return (product_id);
 }
 
-STATIC PortAddr __init
-AscSearchIOPortAddrEISA(
-                           PortAddr iop_base)
+static PortAddr __init AscSearchIOPortAddrEISA(PortAddr iop_base)
 {
-    ASC_DCNT            eisa_product_id;
-
-    if (iop_base == 0) {
-        iop_base = ASC_EISA_MIN_IOP_ADDR;
-    } else {
-        if (iop_base == ASC_EISA_MAX_IOP_ADDR)
-            return (0);
-        if ((iop_base & 0x0050) == 0x0050) {
-            iop_base += ASC_EISA_BIG_IOP_GAP;
-        } else {
-            iop_base += ASC_EISA_SMALL_IOP_GAP;
-        }
-    }
-    while (iop_base <= ASC_EISA_MAX_IOP_ADDR) {
-        eisa_product_id = AscGetEisaProductID(iop_base);
-        if ((eisa_product_id == ASC_EISA_ID_740) ||
-            (eisa_product_id == ASC_EISA_ID_750)) {
-            if (AscFindSignature(iop_base)) {
-                inpw(iop_base + 4);
-                return (iop_base);
-            }
-        }
-        if (iop_base == ASC_EISA_MAX_IOP_ADDR)
-            return (0);
-        if ((iop_base & 0x0050) == 0x0050) {
-            iop_base += ASC_EISA_BIG_IOP_GAP;
-        } else {
-            iop_base += ASC_EISA_SMALL_IOP_GAP;
-        }
-    }
-    return (0);
+       ASC_DCNT eisa_product_id;
+
+       if (iop_base == 0) {
+               iop_base = ASC_EISA_MIN_IOP_ADDR;
+       } else {
+               if (iop_base == ASC_EISA_MAX_IOP_ADDR)
+                       return (0);
+               if ((iop_base & 0x0050) == 0x0050) {
+                       iop_base += ASC_EISA_BIG_IOP_GAP;
+               } else {
+                       iop_base += ASC_EISA_SMALL_IOP_GAP;
+               }
+       }
+       while (iop_base <= ASC_EISA_MAX_IOP_ADDR) {
+               eisa_product_id = AscGetEisaProductID(iop_base);
+               if ((eisa_product_id == ASC_EISA_ID_740) ||
+                   (eisa_product_id == ASC_EISA_ID_750)) {
+                       if (AscFindSignature(iop_base)) {
+                               inpw(iop_base + 4);
+                               return (iop_base);
+                       }
+               }
+               if (iop_base == ASC_EISA_MAX_IOP_ADDR)
+                       return (0);
+               if ((iop_base & 0x0050) == 0x0050) {
+                       iop_base += ASC_EISA_BIG_IOP_GAP;
+               } else {
+                       iop_base += ASC_EISA_SMALL_IOP_GAP;
+               }
+       }
+       return (0);
 }
 #endif /* CONFIG_ISA */
 
-STATIC int
-AscStartChip(
-                PortAddr iop_base
-)
+static int AscStartChip(PortAddr iop_base)
 {
-    AscSetChipControl(iop_base, 0);
-    if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
-        return (0);
-    }
-    return (1);
+       AscSetChipControl(iop_base, 0);
+       if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
+               return (0);
+       }
+       return (1);
 }
 
-STATIC int
-AscStopChip(
-               PortAddr iop_base
-)
+static int AscStopChip(PortAddr iop_base)
 {
-    uchar               cc_val;
-
-    cc_val = AscGetChipControl(iop_base) & (~(CC_SINGLE_STEP | CC_TEST | CC_DIAG));
-    AscSetChipControl(iop_base, (uchar) (cc_val | CC_HALT));
-    AscSetChipIH(iop_base, INS_HALT);
-    AscSetChipIH(iop_base, INS_RFLAG_WTM);
-    if ((AscGetChipStatus(iop_base) & CSW_HALTED) == 0) {
-        return (0);
-    }
-    return (1);
+       uchar cc_val;
+
+       cc_val =
+           AscGetChipControl(iop_base) &
+           (~(CC_SINGLE_STEP | CC_TEST | CC_DIAG));
+       AscSetChipControl(iop_base, (uchar)(cc_val | CC_HALT));
+       AscSetChipIH(iop_base, INS_HALT);
+       AscSetChipIH(iop_base, INS_RFLAG_WTM);
+       if ((AscGetChipStatus(iop_base) & CSW_HALTED) == 0) {
+               return (0);
+       }
+       return (1);
 }
 
-STATIC int
-AscIsChipHalted(
-                   PortAddr iop_base
-)
+static int AscIsChipHalted(PortAddr iop_base)
 {
-    if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
-        if ((AscGetChipControl(iop_base) & CC_HALT) != 0) {
-            return (1);
-        }
-    }
-    return (0);
+       if ((AscGetChipStatus(iop_base) & CSW_HALTED) != 0) {
+               if ((AscGetChipControl(iop_base) & CC_HALT) != 0) {
+                       return (1);
+               }
+       }
+       return (0);
 }
 
-STATIC void
-AscSetChipIH(
-                PortAddr iop_base,
-                ushort ins_code
-)
+static void AscSetChipIH(PortAddr iop_base, ushort ins_code)
 {
-    AscSetBank(iop_base, 1);
-    AscWriteChipIH(iop_base, ins_code);
-    AscSetBank(iop_base, 0);
-    return;
+       AscSetBank(iop_base, 1);
+       AscWriteChipIH(iop_base, ins_code);
+       AscSetBank(iop_base, 0);
+       return;
 }
 
-STATIC void
-AscAckInterrupt(
-                   PortAddr iop_base
-)
+static void AscAckInterrupt(PortAddr iop_base)
 {
-    uchar               host_flag;
-    uchar               risc_flag;
-    ushort              loop;
-
-    loop = 0;
-    do {
-        risc_flag = AscReadLramByte(iop_base, ASCV_RISC_FLAG_B);
-        if (loop++ > 0x7FFF) {
-            break;
-        }
-    } while ((risc_flag & ASC_RISC_FLAG_GEN_INT) != 0);
-    host_flag = AscReadLramByte(iop_base, ASCV_HOST_FLAG_B) & (~ASC_HOST_FLAG_ACK_INT);
-    AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
-                     (uchar) (host_flag | ASC_HOST_FLAG_ACK_INT));
-    AscSetChipStatus(iop_base, CIW_INT_ACK);
-    loop = 0;
-    while (AscGetChipStatus(iop_base) & CSW_INT_PENDING) {
-        AscSetChipStatus(iop_base, CIW_INT_ACK);
-        if (loop++ > 3) {
-            break;
-        }
-    }
-    AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
-    return;
+       uchar host_flag;
+       uchar risc_flag;
+       ushort loop;
+
+       loop = 0;
+       do {
+               risc_flag = AscReadLramByte(iop_base, ASCV_RISC_FLAG_B);
+               if (loop++ > 0x7FFF) {
+                       break;
+               }
+       } while ((risc_flag & ASC_RISC_FLAG_GEN_INT) != 0);
+       host_flag =
+           AscReadLramByte(iop_base,
+                           ASCV_HOST_FLAG_B) & (~ASC_HOST_FLAG_ACK_INT);
+       AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B,
+                        (uchar)(host_flag | ASC_HOST_FLAG_ACK_INT));
+       AscSetChipStatus(iop_base, CIW_INT_ACK);
+       loop = 0;
+       while (AscGetChipStatus(iop_base) & CSW_INT_PENDING) {
+               AscSetChipStatus(iop_base, CIW_INT_ACK);
+               if (loop++ > 3) {
+                       break;
+               }
+       }
+       AscWriteLramByte(iop_base, ASCV_HOST_FLAG_B, host_flag);
+       return;
 }
 
-STATIC void
-AscDisableInterrupt(
-                       PortAddr iop_base
-)
+static void AscDisableInterrupt(PortAddr iop_base)
 {
-    ushort              cfg;
+       ushort cfg;
 
-    cfg = AscGetChipCfgLsw(iop_base);
-    AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON));
-    return;
+       cfg = AscGetChipCfgLsw(iop_base);
+       AscSetChipCfgLsw(iop_base, cfg & (~ASC_CFG0_HOST_INT_ON));
+       return;
 }
 
-STATIC void
-AscEnableInterrupt(
-                      PortAddr iop_base
-)
+static void AscEnableInterrupt(PortAddr iop_base)
 {
-    ushort              cfg;
+       ushort cfg;
 
-    cfg = AscGetChipCfgLsw(iop_base);
-    AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON);
-    return;
+       cfg = AscGetChipCfgLsw(iop_base);
+       AscSetChipCfgLsw(iop_base, cfg | ASC_CFG0_HOST_INT_ON);
+       return;
 }
 
-
-
-STATIC void
-AscSetBank(
-              PortAddr iop_base,
-              uchar bank
-)
+static void AscSetBank(PortAddr iop_base, uchar bank)
 {
-    uchar               val;
-
-    val = AscGetChipControl(iop_base) &
-      (~(CC_SINGLE_STEP | CC_TEST | CC_DIAG | CC_SCSI_RESET | CC_CHIP_RESET));
-    if (bank == 1) {
-        val |= CC_BANK_ONE;
-    } else if (bank == 2) {
-        val |= CC_DIAG | CC_BANK_ONE;
-    } else {
-        val &= ~CC_BANK_ONE;
-    }
-    AscSetChipControl(iop_base, val);
-    return;
+       uchar val;
+
+       val = AscGetChipControl(iop_base) &
+           (~
+            (CC_SINGLE_STEP | CC_TEST | CC_DIAG | CC_SCSI_RESET |
+             CC_CHIP_RESET));
+       if (bank == 1) {
+               val |= CC_BANK_ONE;
+       } else if (bank == 2) {
+               val |= CC_DIAG | CC_BANK_ONE;
+       } else {
+               val &= ~CC_BANK_ONE;
+       }
+       AscSetChipControl(iop_base, val);
+       return;
 }
 
-STATIC int
-AscResetChipAndScsiBus(
-                          ASC_DVC_VAR *asc_dvc
-)
+static int AscResetChipAndScsiBus(ASC_DVC_VAR *asc_dvc)
 {
-    PortAddr    iop_base;
-    int         i = 10;
+       PortAddr iop_base;
+       int i = 10;
 
-    iop_base = asc_dvc->iop_base;
-    while ((AscGetChipStatus(iop_base) & CSW_SCSI_RESET_ACTIVE) && (i-- > 0))
-    {
-          DvcSleepMilliSecond(100);
-    }
-    AscStopChip(iop_base);
-    AscSetChipControl(iop_base, CC_CHIP_RESET | CC_SCSI_RESET | CC_HALT);
-    DvcDelayNanoSecond(asc_dvc, 60000);
-    AscSetChipIH(iop_base, INS_RFLAG_WTM);
-    AscSetChipIH(iop_base, INS_HALT);
-    AscSetChipControl(iop_base, CC_CHIP_RESET | CC_HALT);
-    AscSetChipControl(iop_base, CC_HALT);
-    DvcSleepMilliSecond(200);
-    AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
-    AscSetChipStatus(iop_base, 0);
-    return (AscIsChipHalted(iop_base));
+       iop_base = asc_dvc->iop_base;
+       while ((AscGetChipStatus(iop_base) & CSW_SCSI_RESET_ACTIVE)
+              && (i-- > 0)) {
+               DvcSleepMilliSecond(100);
+       }
+       AscStopChip(iop_base);
+       AscSetChipControl(iop_base, CC_CHIP_RESET | CC_SCSI_RESET | CC_HALT);
+       DvcDelayNanoSecond(asc_dvc, 60000);
+       AscSetChipIH(iop_base, INS_RFLAG_WTM);
+       AscSetChipIH(iop_base, INS_HALT);
+       AscSetChipControl(iop_base, CC_CHIP_RESET | CC_HALT);
+       AscSetChipControl(iop_base, CC_HALT);
+       DvcSleepMilliSecond(200);
+       AscSetChipStatus(iop_base, CIW_CLR_SCSI_RESET_INT);
+       AscSetChipStatus(iop_base, 0);
+       return (AscIsChipHalted(iop_base));
 }
 
-STATIC ASC_DCNT __init
-AscGetMaxDmaCount(
-                     ushort bus_type)
+static ASC_DCNT __init AscGetMaxDmaCount(ushort bus_type)
 {
-    if (bus_type & ASC_IS_ISA)
-        return (ASC_MAX_ISA_DMA_COUNT);
-    else if (bus_type & (ASC_IS_EISA | ASC_IS_VL))
-        return (ASC_MAX_VL_DMA_COUNT);
-    return (ASC_MAX_PCI_DMA_COUNT);
+       if (bus_type & ASC_IS_ISA)
+               return (ASC_MAX_ISA_DMA_COUNT);
+       else if (bus_type & (ASC_IS_EISA | ASC_IS_VL))
+               return (ASC_MAX_VL_DMA_COUNT);
+       return (ASC_MAX_PCI_DMA_COUNT);
 }
 
 #ifdef CONFIG_ISA
-STATIC ushort __init
-AscGetIsaDmaChannel(
-                       PortAddr iop_base)
+static ushort __init AscGetIsaDmaChannel(PortAddr iop_base)
 {
-    ushort              channel;
-
-    channel = AscGetChipCfgLsw(iop_base) & 0x0003;
-    if (channel == 0x03)
-        return (0);
-    else if (channel == 0x00)
-        return (7);
-    return (channel + 4);
+       ushort channel;
+
+       channel = AscGetChipCfgLsw(iop_base) & 0x0003;
+       if (channel == 0x03)
+               return (0);
+       else if (channel == 0x00)
+               return (7);
+       return (channel + 4);
 }
 
-STATIC ushort __init
-AscSetIsaDmaChannel(
-                       PortAddr iop_base,
-                       ushort dma_channel)
+static ushort __init AscSetIsaDmaChannel(PortAddr iop_base, ushort dma_channel)
 {
-    ushort              cfg_lsw;
-    uchar               value;
-
-    if ((dma_channel >= 5) && (dma_channel <= 7)) {
-        if (dma_channel == 7)
-            value = 0x00;
-        else
-            value = dma_channel - 4;
-        cfg_lsw = AscGetChipCfgLsw(iop_base) & 0xFFFC;
-        cfg_lsw |= value;
-        AscSetChipCfgLsw(iop_base, cfg_lsw);
-        return (AscGetIsaDmaChannel(iop_base));
-    }
-    return (0);
+       ushort cfg_lsw;
+       uchar value;
+
+       if ((dma_channel >= 5) && (dma_channel <= 7)) {
+               if (dma_channel == 7)
+                       value = 0x00;
+               else
+                       value = dma_channel - 4;
+               cfg_lsw = AscGetChipCfgLsw(iop_base) & 0xFFFC;
+               cfg_lsw |= value;
+               AscSetChipCfgLsw(iop_base, cfg_lsw);
+               return (AscGetIsaDmaChannel(iop_base));
+       }
+       return (0);
 }
 
-STATIC uchar __init
-AscSetIsaDmaSpeed(
-                     PortAddr iop_base,
-                     uchar speed_value)
+static uchar __init AscSetIsaDmaSpeed(PortAddr iop_base, uchar speed_value)
 {
-    speed_value &= 0x07;
-    AscSetBank(iop_base, 1);
-    AscWriteChipDmaSpeed(iop_base, speed_value);
-    AscSetBank(iop_base, 0);
-    return (AscGetIsaDmaSpeed(iop_base));
+       speed_value &= 0x07;
+       AscSetBank(iop_base, 1);
+       AscWriteChipDmaSpeed(iop_base, speed_value);
+       AscSetBank(iop_base, 0);
+       return (AscGetIsaDmaSpeed(iop_base));
 }
 
-STATIC uchar __init
-AscGetIsaDmaSpeed(
-                     PortAddr iop_base
-)
+static uchar __init AscGetIsaDmaSpeed(PortAddr iop_base)
 {
-    uchar               speed_value;
+       uchar speed_value;
 
-    AscSetBank(iop_base, 1);
-    speed_value = AscReadChipDmaSpeed(iop_base);
-    speed_value &= 0x07;
-    AscSetBank(iop_base, 0);
-    return (speed_value);
+       AscSetBank(iop_base, 1);
+       speed_value = AscReadChipDmaSpeed(iop_base);
+       speed_value &= 0x07;
+       AscSetBank(iop_base, 0);
+       return (speed_value);
 }
 #endif /* CONFIG_ISA */
 
-STATIC ushort __init
-AscReadPCIConfigWord(
-    ASC_DVC_VAR *asc_dvc,
-    ushort pci_config_offset)
+static ushort __init
+AscReadPCIConfigWord(ASC_DVC_VAR *asc_dvc, ushort pci_config_offset)
 {
-    uchar       lsb, msb;
+       uchar lsb, msb;
 
-    lsb = DvcReadPCIConfigByte(asc_dvc, pci_config_offset);
-    msb = DvcReadPCIConfigByte(asc_dvc, pci_config_offset + 1);
-    return ((ushort) ((msb << 8) | lsb));
+       lsb = DvcReadPCIConfigByte(asc_dvc, pci_config_offset);
+       msb = DvcReadPCIConfigByte(asc_dvc, pci_config_offset + 1);
+       return ((ushort)((msb << 8) | lsb));
 }
 
-STATIC ushort __init
-AscInitGetConfig(
-        ASC_DVC_VAR *asc_dvc
-)
+static ushort __init AscInitGetConfig(ASC_DVC_VAR *asc_dvc)
 {
-    ushort              warn_code;
-    PortAddr            iop_base;
-    ushort              PCIDeviceID;
-    ushort              PCIVendorID;
-    uchar               PCIRevisionID;
-    uchar               prevCmdRegBits;
-
-    warn_code = 0;
-    iop_base = asc_dvc->iop_base;
-    asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG;
-    if (asc_dvc->err_code != 0) {
-        return (UW_ERR);
-    }
-    if (asc_dvc->bus_type == ASC_IS_PCI) {
-        PCIVendorID = AscReadPCIConfigWord(asc_dvc,
-                                    AscPCIConfigVendorIDRegister);
-
-        PCIDeviceID = AscReadPCIConfigWord(asc_dvc,
-                                    AscPCIConfigDeviceIDRegister);
-
-        PCIRevisionID = DvcReadPCIConfigByte(asc_dvc,
-                                    AscPCIConfigRevisionIDRegister);
-
-        if (PCIVendorID != PCI_VENDOR_ID_ASP) {
-            warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
-        }
-        prevCmdRegBits = DvcReadPCIConfigByte(asc_dvc,
-                                    AscPCIConfigCommandRegister);
-
-        if ((prevCmdRegBits & AscPCICmdRegBits_IOMemBusMaster) !=
-            AscPCICmdRegBits_IOMemBusMaster) {
-            DvcWritePCIConfigByte(asc_dvc,
-                            AscPCIConfigCommandRegister,
-                            (prevCmdRegBits |
-                             AscPCICmdRegBits_IOMemBusMaster));
-
-            if ((DvcReadPCIConfigByte(asc_dvc,
-                                AscPCIConfigCommandRegister)
-                 & AscPCICmdRegBits_IOMemBusMaster)
-                != AscPCICmdRegBits_IOMemBusMaster) {
-                warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
-            }
-        }
-        if ((PCIDeviceID == PCI_DEVICE_ID_ASP_1200A) ||
-            (PCIDeviceID == PCI_DEVICE_ID_ASP_ABP940)) {
-            DvcWritePCIConfigByte(asc_dvc,
-                            AscPCIConfigLatencyTimer, 0x00);
-            if (DvcReadPCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer)
-                != 0x00) {
-                warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
-            }
-        } else if (PCIDeviceID == PCI_DEVICE_ID_ASP_ABP940U) {
-            if (DvcReadPCIConfigByte(asc_dvc,
-                                AscPCIConfigLatencyTimer) < 0x20) {
-                DvcWritePCIConfigByte(asc_dvc,
-                                    AscPCIConfigLatencyTimer, 0x20);
-
-                if (DvcReadPCIConfigByte(asc_dvc,
-                                    AscPCIConfigLatencyTimer) < 0x20) {
-                    warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
-                }
-            }
-        }
-    }
+       ushort warn_code;
+       PortAddr iop_base;
+       ushort PCIDeviceID;
+       ushort PCIVendorID;
+       uchar PCIRevisionID;
+       uchar prevCmdRegBits;
+
+       warn_code = 0;
+       iop_base = asc_dvc->iop_base;
+       asc_dvc->init_state = ASC_INIT_STATE_BEG_GET_CFG;
+       if (asc_dvc->err_code != 0) {
+               return (UW_ERR);
+       }
+       if (asc_dvc->bus_type == ASC_IS_PCI) {
+               PCIVendorID = AscReadPCIConfigWord(asc_dvc,
+                                                  AscPCIConfigVendorIDRegister);
+
+               PCIDeviceID = AscReadPCIConfigWord(asc_dvc,
+                                                  AscPCIConfigDeviceIDRegister);
+
+               PCIRevisionID = DvcReadPCIConfigByte(asc_dvc,
+                                                    AscPCIConfigRevisionIDRegister);
+
+               if (PCIVendorID != PCI_VENDOR_ID_ASP) {
+                       warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
+               }
+               prevCmdRegBits = DvcReadPCIConfigByte(asc_dvc,
+                                                     AscPCIConfigCommandRegister);
+
+               if ((prevCmdRegBits & AscPCICmdRegBits_IOMemBusMaster) !=
+                   AscPCICmdRegBits_IOMemBusMaster) {
+                       DvcWritePCIConfigByte(asc_dvc,
+                                             AscPCIConfigCommandRegister,
+                                             (prevCmdRegBits |
+                                              AscPCICmdRegBits_IOMemBusMaster));
+
+                       if ((DvcReadPCIConfigByte(asc_dvc,
+                                                 AscPCIConfigCommandRegister)
+                            & AscPCICmdRegBits_IOMemBusMaster)
+                           != AscPCICmdRegBits_IOMemBusMaster) {
+                               warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
+                       }
+               }
+               if ((PCIDeviceID == PCI_DEVICE_ID_ASP_1200A) ||
+                   (PCIDeviceID == PCI_DEVICE_ID_ASP_ABP940)) {
+                       DvcWritePCIConfigByte(asc_dvc,
+                                             AscPCIConfigLatencyTimer, 0x00);
+                       if (DvcReadPCIConfigByte
+                           (asc_dvc, AscPCIConfigLatencyTimer)
+                           != 0x00) {
+                               warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
+                       }
+               } else if (PCIDeviceID == PCI_DEVICE_ID_ASP_ABP940U) {
+                       if (DvcReadPCIConfigByte(asc_dvc,
+                                                AscPCIConfigLatencyTimer) <
+                           0x20) {
+                               DvcWritePCIConfigByte(asc_dvc,
+                                                     AscPCIConfigLatencyTimer,
+                                                     0x20);
+
+                               if (DvcReadPCIConfigByte(asc_dvc,
+                                                        AscPCIConfigLatencyTimer)
+                                   < 0x20) {
+                                       warn_code |=
+                                           ASC_WARN_SET_PCI_CONFIG_SPACE;
+                               }
+                       }
+               }
+       }
 
-    if (AscFindSignature(iop_base)) {
-        warn_code |= AscInitAscDvcVar(asc_dvc);
-        warn_code |= AscInitFromEEP(asc_dvc);
-        asc_dvc->init_state |= ASC_INIT_STATE_END_GET_CFG;
-        if (asc_dvc->scsi_reset_wait > ASC_MAX_SCSI_RESET_WAIT) {
-            asc_dvc->scsi_reset_wait = ASC_MAX_SCSI_RESET_WAIT;
-        }
-    } else {
-        asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
-    }
-    return(warn_code);
+       if (AscFindSignature(iop_base)) {
+               warn_code |= AscInitAscDvcVar(asc_dvc);
+               warn_code |= AscInitFromEEP(asc_dvc);
+               asc_dvc->init_state |= ASC_INIT_STATE_END_GET_CFG;
+               if (asc_dvc->scsi_reset_wait > ASC_MAX_SCSI_RESET_WAIT) {
+                       asc_dvc->scsi_reset_wait = ASC_MAX_SCSI_RESET_WAIT;
+               }
+       } else {
+               asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
+       }
+       return (warn_code);
 }
 
-STATIC ushort __init
-AscInitSetConfig(
-                    ASC_DVC_VAR *asc_dvc
-)
+static ushort __init AscInitSetConfig(ASC_DVC_VAR *asc_dvc)
 {
-    ushort              warn_code = 0;
-
-    asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
-    if (asc_dvc->err_code != 0)
-        return (UW_ERR);
-    if (AscFindSignature(asc_dvc->iop_base)) {
-        warn_code |= AscInitFromAscDvcVar(asc_dvc);
-        asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
-    } else {
-        asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
-    }
-    return (warn_code);
+       ushort warn_code = 0;
+
+       asc_dvc->init_state |= ASC_INIT_STATE_BEG_SET_CFG;
+       if (asc_dvc->err_code != 0)
+               return (UW_ERR);
+       if (AscFindSignature(asc_dvc->iop_base)) {
+               warn_code |= AscInitFromAscDvcVar(asc_dvc);
+               asc_dvc->init_state |= ASC_INIT_STATE_END_SET_CFG;
+       } else {
+               asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
+       }
+       return (warn_code);
 }
 
-STATIC ushort __init
-AscInitFromAscDvcVar(
-                        ASC_DVC_VAR *asc_dvc
-)
+static ushort __init AscInitFromAscDvcVar(ASC_DVC_VAR *asc_dvc)
 {
-    PortAddr            iop_base;
-    ushort              cfg_msw;
-    ushort              warn_code;
-    ushort              pci_device_id = 0;
+       PortAddr iop_base;
+       ushort cfg_msw;
+       ushort warn_code;
+       ushort pci_device_id = 0;
 
-    iop_base = asc_dvc->iop_base;
+       iop_base = asc_dvc->iop_base;
 #ifdef CONFIG_PCI
-    if (asc_dvc->cfg->dev)
-        pci_device_id = to_pci_dev(asc_dvc->cfg->dev)->device;
+       if (asc_dvc->cfg->dev)
+               pci_device_id = to_pci_dev(asc_dvc->cfg->dev)->device;
 #endif
-    warn_code = 0;
-    cfg_msw = AscGetChipCfgMsw(iop_base);
-    if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
-        cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
-        warn_code |= ASC_WARN_CFG_MSW_RECOVER;
-        AscSetChipCfgMsw(iop_base, cfg_msw);
-    }
-    if ((asc_dvc->cfg->cmd_qng_enabled & asc_dvc->cfg->disc_enable) !=
-        asc_dvc->cfg->cmd_qng_enabled) {
-        asc_dvc->cfg->disc_enable = asc_dvc->cfg->cmd_qng_enabled;
-        warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
-    }
-    if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
-        warn_code |= ASC_WARN_AUTO_CONFIG;
-    }
-    if ((asc_dvc->bus_type & (ASC_IS_ISA | ASC_IS_VL)) != 0) {
-        if (AscSetChipIRQ(iop_base, asc_dvc->irq_no, asc_dvc->bus_type)
-            != asc_dvc->irq_no) {
-            asc_dvc->err_code |= ASC_IERR_SET_IRQ_NO;
-        }
-    }
-    if (asc_dvc->bus_type & ASC_IS_PCI) {
-        cfg_msw &= 0xFFC0;
-        AscSetChipCfgMsw(iop_base, cfg_msw);
-        if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) {
-        } else {
-            if ((pci_device_id == PCI_DEVICE_ID_ASP_1200A) ||
-                (pci_device_id == PCI_DEVICE_ID_ASP_ABP940)) {
-                asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_IF_NOT_DWB;
-                asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_ASYN_USE_SYN;
-            }
-        }
-    } else if (asc_dvc->bus_type == ASC_IS_ISAPNP) {
-        if (AscGetChipVersion(iop_base, asc_dvc->bus_type)
-            == ASC_CHIP_VER_ASYN_BUG) {
-            asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_ASYN_USE_SYN;
-        }
-    }
-    if (AscSetChipScsiID(iop_base, asc_dvc->cfg->chip_scsi_id) !=
-        asc_dvc->cfg->chip_scsi_id) {
-        asc_dvc->err_code |= ASC_IERR_SET_SCSI_ID;
-    }
+       warn_code = 0;
+       cfg_msw = AscGetChipCfgMsw(iop_base);
+       if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
+               cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
+               warn_code |= ASC_WARN_CFG_MSW_RECOVER;
+               AscSetChipCfgMsw(iop_base, cfg_msw);
+       }
+       if ((asc_dvc->cfg->cmd_qng_enabled & asc_dvc->cfg->disc_enable) !=
+           asc_dvc->cfg->cmd_qng_enabled) {
+               asc_dvc->cfg->disc_enable = asc_dvc->cfg->cmd_qng_enabled;
+               warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
+       }
+       if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
+               warn_code |= ASC_WARN_AUTO_CONFIG;
+       }
+       if ((asc_dvc->bus_type & (ASC_IS_ISA | ASC_IS_VL)) != 0) {
+               if (AscSetChipIRQ(iop_base, asc_dvc->irq_no, asc_dvc->bus_type)
+                   != asc_dvc->irq_no) {
+                       asc_dvc->err_code |= ASC_IERR_SET_IRQ_NO;
+               }
+       }
+       if (asc_dvc->bus_type & ASC_IS_PCI) {
+               cfg_msw &= 0xFFC0;
+               AscSetChipCfgMsw(iop_base, cfg_msw);
+               if ((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) {
+               } else {
+                       if ((pci_device_id == PCI_DEVICE_ID_ASP_1200A) ||
+                           (pci_device_id == PCI_DEVICE_ID_ASP_ABP940)) {
+                               asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_IF_NOT_DWB;
+                               asc_dvc->bug_fix_cntl |=
+                                   ASC_BUG_FIX_ASYN_USE_SYN;
+                       }
+               }
+       } else if (asc_dvc->bus_type == ASC_IS_ISAPNP) {
+               if (AscGetChipVersion(iop_base, asc_dvc->bus_type)
+                   == ASC_CHIP_VER_ASYN_BUG) {
+                       asc_dvc->bug_fix_cntl |= ASC_BUG_FIX_ASYN_USE_SYN;
+               }
+       }
+       if (AscSetChipScsiID(iop_base, asc_dvc->cfg->chip_scsi_id) !=
+           asc_dvc->cfg->chip_scsi_id) {
+               asc_dvc->err_code |= ASC_IERR_SET_SCSI_ID;
+       }
 #ifdef CONFIG_ISA
-    if (asc_dvc->bus_type & ASC_IS_ISA) {
-        AscSetIsaDmaChannel(iop_base, asc_dvc->cfg->isa_dma_channel);
-        AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
-    }
+       if (asc_dvc->bus_type & ASC_IS_ISA) {
+               AscSetIsaDmaChannel(iop_base, asc_dvc->cfg->isa_dma_channel);
+               AscSetIsaDmaSpeed(iop_base, asc_dvc->cfg->isa_dma_speed);
+       }
 #endif /* CONFIG_ISA */
-    return (warn_code);
+       return (warn_code);
 }
 
-STATIC ushort
-AscInitAsc1000Driver(
-                        ASC_DVC_VAR *asc_dvc
-)
+static ushort AscInitAsc1000Driver(ASC_DVC_VAR *asc_dvc)
 {
-    ushort              warn_code;
-    PortAddr            iop_base;
-
-    iop_base = asc_dvc->iop_base;
-    warn_code = 0;
-    if ((asc_dvc->dvc_cntl & ASC_CNTL_RESET_SCSI) &&
-        !(asc_dvc->init_state & ASC_INIT_RESET_SCSI_DONE)) {
-        AscResetChipAndScsiBus(asc_dvc);
-        DvcSleepMilliSecond((ASC_DCNT)
-            ((ushort) asc_dvc->scsi_reset_wait * 1000));
-    }
-    asc_dvc->init_state |= ASC_INIT_STATE_BEG_LOAD_MC;
-    if (asc_dvc->err_code != 0)
-        return (UW_ERR);
-    if (!AscFindSignature(asc_dvc->iop_base)) {
-        asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
-        return (warn_code);
-    }
-    AscDisableInterrupt(iop_base);
-    warn_code |= AscInitLram(asc_dvc);
-    if (asc_dvc->err_code != 0)
-        return (UW_ERR);
-    ASC_DBG1(1, "AscInitAsc1000Driver: _asc_mcode_chksum 0x%lx\n",
-        (ulong) _asc_mcode_chksum);
-    if (AscLoadMicroCode(iop_base, 0, _asc_mcode_buf,
-                         _asc_mcode_size) != _asc_mcode_chksum) {
-        asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
-        return (warn_code);
-    }
-    warn_code |= AscInitMicroCodeVar(asc_dvc);
-    asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;
-    AscEnableInterrupt(iop_base);
-    return (warn_code);
+       ushort warn_code;
+       PortAddr iop_base;
+
+       iop_base = asc_dvc->iop_base;
+       warn_code = 0;
+       if ((asc_dvc->dvc_cntl & ASC_CNTL_RESET_SCSI) &&
+           !(asc_dvc->init_state & ASC_INIT_RESET_SCSI_DONE)) {
+               AscResetChipAndScsiBus(asc_dvc);
+               DvcSleepMilliSecond((ASC_DCNT)
+                                   ((ushort)asc_dvc->scsi_reset_wait * 1000));
+       }
+       asc_dvc->init_state |= ASC_INIT_STATE_BEG_LOAD_MC;
+       if (asc_dvc->err_code != 0)
+               return (UW_ERR);
+       if (!AscFindSignature(asc_dvc->iop_base)) {
+               asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
+               return (warn_code);
+       }
+       AscDisableInterrupt(iop_base);
+       warn_code |= AscInitLram(asc_dvc);
+       if (asc_dvc->err_code != 0)
+               return (UW_ERR);
+       ASC_DBG1(1, "AscInitAsc1000Driver: _asc_mcode_chksum 0x%lx\n",
+                (ulong)_asc_mcode_chksum);
+       if (AscLoadMicroCode(iop_base, 0, _asc_mcode_buf,
+                            _asc_mcode_size) != _asc_mcode_chksum) {
+               asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
+               return (warn_code);
+       }
+       warn_code |= AscInitMicroCodeVar(asc_dvc);
+       asc_dvc->init_state |= ASC_INIT_STATE_END_LOAD_MC;
+       AscEnableInterrupt(iop_base);
+       return (warn_code);
 }
 
-STATIC ushort __init
-AscInitAscDvcVar(
-                    ASC_DVC_VAR *asc_dvc)
+static ushort __init AscInitAscDvcVar(ASC_DVC_VAR *asc_dvc)
 {
-    int                 i;
-    PortAddr            iop_base;
-    ushort              warn_code;
-    uchar               chip_version;
-
-    iop_base = asc_dvc->iop_base;
-    warn_code = 0;
-    asc_dvc->err_code = 0;
-    if ((asc_dvc->bus_type &
-         (ASC_IS_ISA | ASC_IS_PCI | ASC_IS_EISA | ASC_IS_VL)) == 0) {
-        asc_dvc->err_code |= ASC_IERR_NO_BUS_TYPE;
-    }
-    AscSetChipControl(iop_base, CC_HALT);
-    AscSetChipStatus(iop_base, 0);
-    asc_dvc->bug_fix_cntl = 0;
-    asc_dvc->pci_fix_asyn_xfer = 0;
-    asc_dvc->pci_fix_asyn_xfer_always = 0;
-    /* asc_dvc->init_state initalized in AscInitGetConfig(). */
-    asc_dvc->sdtr_done = 0;
-    asc_dvc->cur_total_qng = 0;
-    asc_dvc->is_in_int = 0;
-    asc_dvc->in_critical_cnt = 0;
-    asc_dvc->last_q_shortage = 0;
-    asc_dvc->use_tagged_qng = 0;
-    asc_dvc->no_scam = 0;
-    asc_dvc->unit_not_ready = 0;
-    asc_dvc->queue_full_or_busy = 0;
-    asc_dvc->redo_scam = 0;
-    asc_dvc->res2 = 0;
-    asc_dvc->host_init_sdtr_index = 0;
-    asc_dvc->cfg->can_tagged_qng = 0;
-    asc_dvc->cfg->cmd_qng_enabled = 0;
-    asc_dvc->dvc_cntl = ASC_DEF_DVC_CNTL;
-    asc_dvc->init_sdtr = 0;
-    asc_dvc->max_total_qng = ASC_DEF_MAX_TOTAL_QNG;
-    asc_dvc->scsi_reset_wait = 3;
-    asc_dvc->start_motor = ASC_SCSI_WIDTH_BIT_SET;
-    asc_dvc->max_dma_count = AscGetMaxDmaCount(asc_dvc->bus_type);
-    asc_dvc->cfg->sdtr_enable = ASC_SCSI_WIDTH_BIT_SET;
-    asc_dvc->cfg->disc_enable = ASC_SCSI_WIDTH_BIT_SET;
-    asc_dvc->cfg->chip_scsi_id = ASC_DEF_CHIP_SCSI_ID;
-    asc_dvc->cfg->lib_serial_no = ASC_LIB_SERIAL_NUMBER;
-    asc_dvc->cfg->lib_version = (ASC_LIB_VERSION_MAJOR << 8) |
-      ASC_LIB_VERSION_MINOR;
-    chip_version = AscGetChipVersion(iop_base, asc_dvc->bus_type);
-    asc_dvc->cfg->chip_version = chip_version;
-    asc_dvc->sdtr_period_tbl[0] = SYN_XFER_NS_0;
-    asc_dvc->sdtr_period_tbl[1] = SYN_XFER_NS_1;
-    asc_dvc->sdtr_period_tbl[2] = SYN_XFER_NS_2;
-    asc_dvc->sdtr_period_tbl[3] = SYN_XFER_NS_3;
-    asc_dvc->sdtr_period_tbl[4] = SYN_XFER_NS_4;
-    asc_dvc->sdtr_period_tbl[5] = SYN_XFER_NS_5;
-    asc_dvc->sdtr_period_tbl[6] = SYN_XFER_NS_6;
-    asc_dvc->sdtr_period_tbl[7] = SYN_XFER_NS_7;
-    asc_dvc->max_sdtr_index = 7;
-    if ((asc_dvc->bus_type & ASC_IS_PCI) &&
-        (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3150)) {
-        asc_dvc->bus_type = ASC_IS_PCI_ULTRA;
-        asc_dvc->sdtr_period_tbl[0] = SYN_ULTRA_XFER_NS_0;
-        asc_dvc->sdtr_period_tbl[1] = SYN_ULTRA_XFER_NS_1;
-        asc_dvc->sdtr_period_tbl[2] = SYN_ULTRA_XFER_NS_2;
-        asc_dvc->sdtr_period_tbl[3] = SYN_ULTRA_XFER_NS_3;
-        asc_dvc->sdtr_period_tbl[4] = SYN_ULTRA_XFER_NS_4;
-        asc_dvc->sdtr_period_tbl[5] = SYN_ULTRA_XFER_NS_5;
-        asc_dvc->sdtr_period_tbl[6] = SYN_ULTRA_XFER_NS_6;
-        asc_dvc->sdtr_period_tbl[7] = SYN_ULTRA_XFER_NS_7;
-        asc_dvc->sdtr_period_tbl[8] = SYN_ULTRA_XFER_NS_8;
-        asc_dvc->sdtr_period_tbl[9] = SYN_ULTRA_XFER_NS_9;
-        asc_dvc->sdtr_period_tbl[10] = SYN_ULTRA_XFER_NS_10;
-        asc_dvc->sdtr_period_tbl[11] = SYN_ULTRA_XFER_NS_11;
-        asc_dvc->sdtr_period_tbl[12] = SYN_ULTRA_XFER_NS_12;
-        asc_dvc->sdtr_period_tbl[13] = SYN_ULTRA_XFER_NS_13;
-        asc_dvc->sdtr_period_tbl[14] = SYN_ULTRA_XFER_NS_14;
-        asc_dvc->sdtr_period_tbl[15] = SYN_ULTRA_XFER_NS_15;
-        asc_dvc->max_sdtr_index = 15;
-        if (chip_version == ASC_CHIP_VER_PCI_ULTRA_3150)
-        {
-            AscSetExtraControl(iop_base,
-                (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
-        } else if (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3050) {
-            AscSetExtraControl(iop_base,
-                (SEC_ACTIVE_NEGATE | SEC_ENABLE_FILTER));
-        }
-    }
-    if (asc_dvc->bus_type == ASC_IS_PCI) {
-           AscSetExtraControl(iop_base, (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
-    }
+       int i;
+       PortAddr iop_base;
+       ushort warn_code;
+       uchar chip_version;
+
+       iop_base = asc_dvc->iop_base;
+       warn_code = 0;
+       asc_dvc->err_code = 0;
+       if ((asc_dvc->bus_type &
+            (ASC_IS_ISA | ASC_IS_PCI | ASC_IS_EISA | ASC_IS_VL)) == 0) {
+               asc_dvc->err_code |= ASC_IERR_NO_BUS_TYPE;
+       }
+       AscSetChipControl(iop_base, CC_HALT);
+       AscSetChipStatus(iop_base, 0);
+       asc_dvc->bug_fix_cntl = 0;
+       asc_dvc->pci_fix_asyn_xfer = 0;
+       asc_dvc->pci_fix_asyn_xfer_always = 0;
+       /* asc_dvc->init_state initalized in AscInitGetConfig(). */
+       asc_dvc->sdtr_done = 0;
+       asc_dvc->cur_total_qng = 0;
+       asc_dvc->is_in_int = 0;
+       asc_dvc->in_critical_cnt = 0;
+       asc_dvc->last_q_shortage = 0;
+       asc_dvc->use_tagged_qng = 0;
+       asc_dvc->no_scam = 0;
+       asc_dvc->unit_not_ready = 0;
+       asc_dvc->queue_full_or_busy = 0;
+       asc_dvc->redo_scam = 0;
+       asc_dvc->res2 = 0;
+       asc_dvc->host_init_sdtr_index = 0;
+       asc_dvc->cfg->can_tagged_qng = 0;
+       asc_dvc->cfg->cmd_qng_enabled = 0;
+       asc_dvc->dvc_cntl = ASC_DEF_DVC_CNTL;
+       asc_dvc->init_sdtr = 0;
+       asc_dvc->max_total_qng = ASC_DEF_MAX_TOTAL_QNG;
+       asc_dvc->scsi_reset_wait = 3;
+       asc_dvc->start_motor = ASC_SCSI_WIDTH_BIT_SET;
+       asc_dvc->max_dma_count = AscGetMaxDmaCount(asc_dvc->bus_type);
+       asc_dvc->cfg->sdtr_enable = ASC_SCSI_WIDTH_BIT_SET;
+       asc_dvc->cfg->disc_enable = ASC_SCSI_WIDTH_BIT_SET;
+       asc_dvc->cfg->chip_scsi_id = ASC_DEF_CHIP_SCSI_ID;
+       asc_dvc->cfg->lib_serial_no = ASC_LIB_SERIAL_NUMBER;
+       asc_dvc->cfg->lib_version = (ASC_LIB_VERSION_MAJOR << 8) |
+           ASC_LIB_VERSION_MINOR;
+       chip_version = AscGetChipVersion(iop_base, asc_dvc->bus_type);
+       asc_dvc->cfg->chip_version = chip_version;
+       asc_dvc->sdtr_period_tbl[0] = SYN_XFER_NS_0;
+       asc_dvc->sdtr_period_tbl[1] = SYN_XFER_NS_1;
+       asc_dvc->sdtr_period_tbl[2] = SYN_XFER_NS_2;
+       asc_dvc->sdtr_period_tbl[3] = SYN_XFER_NS_3;
+       asc_dvc->sdtr_period_tbl[4] = SYN_XFER_NS_4;
+       asc_dvc->sdtr_period_tbl[5] = SYN_XFER_NS_5;
+       asc_dvc->sdtr_period_tbl[6] = SYN_XFER_NS_6;
+       asc_dvc->sdtr_period_tbl[7] = SYN_XFER_NS_7;
+       asc_dvc->max_sdtr_index = 7;
+       if ((asc_dvc->bus_type & ASC_IS_PCI) &&
+           (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3150)) {
+               asc_dvc->bus_type = ASC_IS_PCI_ULTRA;
+               asc_dvc->sdtr_period_tbl[0] = SYN_ULTRA_XFER_NS_0;
+               asc_dvc->sdtr_period_tbl[1] = SYN_ULTRA_XFER_NS_1;
+               asc_dvc->sdtr_period_tbl[2] = SYN_ULTRA_XFER_NS_2;
+               asc_dvc->sdtr_period_tbl[3] = SYN_ULTRA_XFER_NS_3;
+               asc_dvc->sdtr_period_tbl[4] = SYN_ULTRA_XFER_NS_4;
+               asc_dvc->sdtr_period_tbl[5] = SYN_ULTRA_XFER_NS_5;
+               asc_dvc->sdtr_period_tbl[6] = SYN_ULTRA_XFER_NS_6;
+               asc_dvc->sdtr_period_tbl[7] = SYN_ULTRA_XFER_NS_7;
+               asc_dvc->sdtr_period_tbl[8] = SYN_ULTRA_XFER_NS_8;
+               asc_dvc->sdtr_period_tbl[9] = SYN_ULTRA_XFER_NS_9;
+               asc_dvc->sdtr_period_tbl[10] = SYN_ULTRA_XFER_NS_10;
+               asc_dvc->sdtr_period_tbl[11] = SYN_ULTRA_XFER_NS_11;
+               asc_dvc->sdtr_period_tbl[12] = SYN_ULTRA_XFER_NS_12;
+               asc_dvc->sdtr_period_tbl[13] = SYN_ULTRA_XFER_NS_13;
+               asc_dvc->sdtr_period_tbl[14] = SYN_ULTRA_XFER_NS_14;
+               asc_dvc->sdtr_period_tbl[15] = SYN_ULTRA_XFER_NS_15;
+               asc_dvc->max_sdtr_index = 15;
+               if (chip_version == ASC_CHIP_VER_PCI_ULTRA_3150) {
+                       AscSetExtraControl(iop_base,
+                                          (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
+               } else if (chip_version >= ASC_CHIP_VER_PCI_ULTRA_3050) {
+                       AscSetExtraControl(iop_base,
+                                          (SEC_ACTIVE_NEGATE |
+                                           SEC_ENABLE_FILTER));
+               }
+       }
+       if (asc_dvc->bus_type == ASC_IS_PCI) {
+               AscSetExtraControl(iop_base,
+                                  (SEC_ACTIVE_NEGATE | SEC_SLEW_RATE));
+       }
 
-    asc_dvc->cfg->isa_dma_speed = ASC_DEF_ISA_DMA_SPEED;
-    if (AscGetChipBusType(iop_base) == ASC_IS_ISAPNP) {
-        AscSetChipIFC(iop_base, IFC_INIT_DEFAULT);
-        asc_dvc->bus_type = ASC_IS_ISAPNP;
-    }
+       asc_dvc->cfg->isa_dma_speed = ASC_DEF_ISA_DMA_SPEED;
+       if (AscGetChipBusType(iop_base) == ASC_IS_ISAPNP) {
+               AscSetChipIFC(iop_base, IFC_INIT_DEFAULT);
+               asc_dvc->bus_type = ASC_IS_ISAPNP;
+       }
 #ifdef CONFIG_ISA
-    if ((asc_dvc->bus_type & ASC_IS_ISA) != 0) {
-        asc_dvc->cfg->isa_dma_channel = (uchar) AscGetIsaDmaChannel(iop_base);
-    }
+       if ((asc_dvc->bus_type & ASC_IS_ISA) != 0) {
+               asc_dvc->cfg->isa_dma_channel =
+                   (uchar)AscGetIsaDmaChannel(iop_base);
+       }
 #endif /* CONFIG_ISA */
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        asc_dvc->cur_dvc_qng[i] = 0;
-        asc_dvc->max_dvc_qng[i] = ASC_MAX_SCSI1_QNG;
-        asc_dvc->scsiq_busy_head[i] = (ASC_SCSI_Q *) 0L;
-        asc_dvc->scsiq_busy_tail[i] = (ASC_SCSI_Q *) 0L;
-        asc_dvc->cfg->max_tag_qng[i] = ASC_MAX_INRAM_TAG_QNG;
-    }
-    return (warn_code);
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               asc_dvc->cur_dvc_qng[i] = 0;
+               asc_dvc->max_dvc_qng[i] = ASC_MAX_SCSI1_QNG;
+               asc_dvc->scsiq_busy_head[i] = (ASC_SCSI_Q *)0L;
+               asc_dvc->scsiq_busy_tail[i] = (ASC_SCSI_Q *)0L;
+               asc_dvc->cfg->max_tag_qng[i] = ASC_MAX_INRAM_TAG_QNG;
+       }
+       return (warn_code);
 }
 
-STATIC ushort __init
-AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
+static ushort __init AscInitFromEEP(ASC_DVC_VAR *asc_dvc)
 {
-    ASCEEP_CONFIG       eep_config_buf;
-    ASCEEP_CONFIG       *eep_config;
-    PortAddr            iop_base;
-    ushort              chksum;
-    ushort              warn_code;
-    ushort              cfg_msw, cfg_lsw;
-    int                 i;
-    int                 write_eep = 0;
-
-    iop_base = asc_dvc->iop_base;
-    warn_code = 0;
-    AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0x00FE);
-    AscStopQueueExe(iop_base);
-    if ((AscStopChip(iop_base) == FALSE) ||
-        (AscGetChipScsiCtrl(iop_base) != 0)) {
-        asc_dvc->init_state |= ASC_INIT_RESET_SCSI_DONE;
-        AscResetChipAndScsiBus(asc_dvc);
-        DvcSleepMilliSecond((ASC_DCNT)
-            ((ushort) asc_dvc->scsi_reset_wait * 1000));
-    }
-    if (AscIsChipHalted(iop_base) == FALSE) {
-        asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
-        return (warn_code);
-    }
-    AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
-    if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
-        asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
-        return (warn_code);
-    }
-    eep_config = (ASCEEP_CONFIG *) &eep_config_buf;
-    cfg_msw = AscGetChipCfgMsw(iop_base);
-    cfg_lsw = AscGetChipCfgLsw(iop_base);
-    if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
-        cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
-        warn_code |= ASC_WARN_CFG_MSW_RECOVER;
-        AscSetChipCfgMsw(iop_base, cfg_msw);
-    }
-    chksum = AscGetEEPConfig(iop_base, eep_config, asc_dvc->bus_type);
-    ASC_DBG1(1, "AscInitFromEEP: chksum 0x%x\n", chksum);
-    if (chksum == 0) {
-        chksum = 0xaa55;
-    }
-    if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
-        warn_code |= ASC_WARN_AUTO_CONFIG;
-        if (asc_dvc->cfg->chip_version == 3) {
-            if (eep_config->cfg_lsw != cfg_lsw) {
-                warn_code |= ASC_WARN_EEPROM_RECOVER;
-                eep_config->cfg_lsw = AscGetChipCfgLsw(iop_base);
-            }
-            if (eep_config->cfg_msw != cfg_msw) {
-                warn_code |= ASC_WARN_EEPROM_RECOVER;
-                eep_config->cfg_msw = AscGetChipCfgMsw(iop_base);
-            }
-        }
-    }
-    eep_config->cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
-    eep_config->cfg_lsw |= ASC_CFG0_HOST_INT_ON;
-    ASC_DBG1(1, "AscInitFromEEP: eep_config->chksum 0x%x\n",
-        eep_config->chksum);
-    if (chksum != eep_config->chksum) {
-            if (AscGetChipVersion(iop_base, asc_dvc->bus_type) ==
-                    ASC_CHIP_VER_PCI_ULTRA_3050 )
-            {
-                ASC_DBG(1,
-"AscInitFromEEP: chksum error ignored; EEPROM-less board\n");
-                eep_config->init_sdtr = 0xFF;
-                eep_config->disc_enable = 0xFF;
-                eep_config->start_motor = 0xFF;
-                eep_config->use_cmd_qng = 0;
-                eep_config->max_total_qng = 0xF0;
-                eep_config->max_tag_qng = 0x20;
-                eep_config->cntl = 0xBFFF;
-                ASC_EEP_SET_CHIP_ID(eep_config, 7);
-                eep_config->no_scam = 0;
-                eep_config->adapter_info[0] = 0;
-                eep_config->adapter_info[1] = 0;
-                eep_config->adapter_info[2] = 0;
-                eep_config->adapter_info[3] = 0;
-                eep_config->adapter_info[4] = 0;
-                /* Indicate EEPROM-less board. */
-                eep_config->adapter_info[5] = 0xBB;
-            } else {
-                ASC_PRINT(
-"AscInitFromEEP: EEPROM checksum error; Will try to re-write EEPROM.\n");
-                write_eep = 1;
-                warn_code |= ASC_WARN_EEPROM_CHKSUM;
-            }
-    }
-    asc_dvc->cfg->sdtr_enable = eep_config->init_sdtr;
-    asc_dvc->cfg->disc_enable = eep_config->disc_enable;
-    asc_dvc->cfg->cmd_qng_enabled = eep_config->use_cmd_qng;
-    asc_dvc->cfg->isa_dma_speed = ASC_EEP_GET_DMA_SPD(eep_config);
-    asc_dvc->start_motor = eep_config->start_motor;
-    asc_dvc->dvc_cntl = eep_config->cntl;
-    asc_dvc->no_scam = eep_config->no_scam;
-    asc_dvc->cfg->adapter_info[0] = eep_config->adapter_info[0];
-    asc_dvc->cfg->adapter_info[1] = eep_config->adapter_info[1];
-    asc_dvc->cfg->adapter_info[2] = eep_config->adapter_info[2];
-    asc_dvc->cfg->adapter_info[3] = eep_config->adapter_info[3];
-    asc_dvc->cfg->adapter_info[4] = eep_config->adapter_info[4];
-    asc_dvc->cfg->adapter_info[5] = eep_config->adapter_info[5];
-    if (!AscTestExternalLram(asc_dvc)) {
-        if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA)) {
-            eep_config->max_total_qng = ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG;
-            eep_config->max_tag_qng = ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG;
-        } else {
-            eep_config->cfg_msw |= 0x0800;
-            cfg_msw |= 0x0800;
-            AscSetChipCfgMsw(iop_base, cfg_msw);
-            eep_config->max_total_qng = ASC_MAX_PCI_INRAM_TOTAL_QNG;
-            eep_config->max_tag_qng = ASC_MAX_INRAM_TAG_QNG;
-        }
-    } else {
-    }
-    if (eep_config->max_total_qng < ASC_MIN_TOTAL_QNG) {
-        eep_config->max_total_qng = ASC_MIN_TOTAL_QNG;
-    }
-    if (eep_config->max_total_qng > ASC_MAX_TOTAL_QNG) {
-        eep_config->max_total_qng = ASC_MAX_TOTAL_QNG;
-    }
-    if (eep_config->max_tag_qng > eep_config->max_total_qng) {
-        eep_config->max_tag_qng = eep_config->max_total_qng;
-    }
-    if (eep_config->max_tag_qng < ASC_MIN_TAG_Q_PER_DVC) {
-        eep_config->max_tag_qng = ASC_MIN_TAG_Q_PER_DVC;
-    }
-    asc_dvc->max_total_qng = eep_config->max_total_qng;
-    if ((eep_config->use_cmd_qng & eep_config->disc_enable) !=
-        eep_config->use_cmd_qng) {
-        eep_config->disc_enable = eep_config->use_cmd_qng;
-        warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
-    }
-    if (asc_dvc->bus_type & (ASC_IS_ISA | ASC_IS_VL | ASC_IS_EISA)) {
-        asc_dvc->irq_no = AscGetChipIRQ(iop_base, asc_dvc->bus_type);
-    }
-    ASC_EEP_SET_CHIP_ID(eep_config, ASC_EEP_GET_CHIP_ID(eep_config) & ASC_MAX_TID);
-    asc_dvc->cfg->chip_scsi_id = ASC_EEP_GET_CHIP_ID(eep_config);
-    if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) &&
-        !(asc_dvc->dvc_cntl & ASC_CNTL_SDTR_ENABLE_ULTRA)) {
-        asc_dvc->host_init_sdtr_index = ASC_SDTR_ULTRA_PCI_10MB_INDEX;
-    }
+       ASCEEP_CONFIG eep_config_buf;
+       ASCEEP_CONFIG *eep_config;
+       PortAddr iop_base;
+       ushort chksum;
+       ushort warn_code;
+       ushort cfg_msw, cfg_lsw;
+       int i;
+       int write_eep = 0;
+
+       iop_base = asc_dvc->iop_base;
+       warn_code = 0;
+       AscWriteLramWord(iop_base, ASCV_HALTCODE_W, 0x00FE);
+       AscStopQueueExe(iop_base);
+       if ((AscStopChip(iop_base) == FALSE) ||
+           (AscGetChipScsiCtrl(iop_base) != 0)) {
+               asc_dvc->init_state |= ASC_INIT_RESET_SCSI_DONE;
+               AscResetChipAndScsiBus(asc_dvc);
+               DvcSleepMilliSecond((ASC_DCNT)
+                                   ((ushort)asc_dvc->scsi_reset_wait * 1000));
+       }
+       if (AscIsChipHalted(iop_base) == FALSE) {
+               asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
+               return (warn_code);
+       }
+       AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
+       if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
+               asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
+               return (warn_code);
+       }
+       eep_config = (ASCEEP_CONFIG *)&eep_config_buf;
+       cfg_msw = AscGetChipCfgMsw(iop_base);
+       cfg_lsw = AscGetChipCfgLsw(iop_base);
+       if ((cfg_msw & ASC_CFG_MSW_CLR_MASK) != 0) {
+               cfg_msw &= (~(ASC_CFG_MSW_CLR_MASK));
+               warn_code |= ASC_WARN_CFG_MSW_RECOVER;
+               AscSetChipCfgMsw(iop_base, cfg_msw);
+       }
+       chksum = AscGetEEPConfig(iop_base, eep_config, asc_dvc->bus_type);
+       ASC_DBG1(1, "AscInitFromEEP: chksum 0x%x\n", chksum);
+       if (chksum == 0) {
+               chksum = 0xaa55;
+       }
+       if (AscGetChipStatus(iop_base) & CSW_AUTO_CONFIG) {
+               warn_code |= ASC_WARN_AUTO_CONFIG;
+               if (asc_dvc->cfg->chip_version == 3) {
+                       if (eep_config->cfg_lsw != cfg_lsw) {
+                               warn_code |= ASC_WARN_EEPROM_RECOVER;
+                               eep_config->cfg_lsw =
+                                   AscGetChipCfgLsw(iop_base);
+                       }
+                       if (eep_config->cfg_msw != cfg_msw) {
+                               warn_code |= ASC_WARN_EEPROM_RECOVER;
+                               eep_config->cfg_msw =
+                                   AscGetChipCfgMsw(iop_base);
+                       }
+               }
+       }
+       eep_config->cfg_msw &= ~ASC_CFG_MSW_CLR_MASK;
+       eep_config->cfg_lsw |= ASC_CFG0_HOST_INT_ON;
+       ASC_DBG1(1, "AscInitFromEEP: eep_config->chksum 0x%x\n",
+                eep_config->chksum);
+       if (chksum != eep_config->chksum) {
+               if (AscGetChipVersion(iop_base, asc_dvc->bus_type) ==
+                   ASC_CHIP_VER_PCI_ULTRA_3050) {
+                       ASC_DBG(1,
+                               "AscInitFromEEP: chksum error ignored; EEPROM-less board\n");
+                       eep_config->init_sdtr = 0xFF;
+                       eep_config->disc_enable = 0xFF;
+                       eep_config->start_motor = 0xFF;
+                       eep_config->use_cmd_qng = 0;
+                       eep_config->max_total_qng = 0xF0;
+                       eep_config->max_tag_qng = 0x20;
+                       eep_config->cntl = 0xBFFF;
+                       ASC_EEP_SET_CHIP_ID(eep_config, 7);
+                       eep_config->no_scam = 0;
+                       eep_config->adapter_info[0] = 0;
+                       eep_config->adapter_info[1] = 0;
+                       eep_config->adapter_info[2] = 0;
+                       eep_config->adapter_info[3] = 0;
+                       eep_config->adapter_info[4] = 0;
+                       /* Indicate EEPROM-less board. */
+                       eep_config->adapter_info[5] = 0xBB;
+               } else {
+                       ASC_PRINT
+                           ("AscInitFromEEP: EEPROM checksum error; Will try to re-write EEPROM.\n");
+                       write_eep = 1;
+                       warn_code |= ASC_WARN_EEPROM_CHKSUM;
+               }
+       }
+       asc_dvc->cfg->sdtr_enable = eep_config->init_sdtr;
+       asc_dvc->cfg->disc_enable = eep_config->disc_enable;
+       asc_dvc->cfg->cmd_qng_enabled = eep_config->use_cmd_qng;
+       asc_dvc->cfg->isa_dma_speed = ASC_EEP_GET_DMA_SPD(eep_config);
+       asc_dvc->start_motor = eep_config->start_motor;
+       asc_dvc->dvc_cntl = eep_config->cntl;
+       asc_dvc->no_scam = eep_config->no_scam;
+       asc_dvc->cfg->adapter_info[0] = eep_config->adapter_info[0];
+       asc_dvc->cfg->adapter_info[1] = eep_config->adapter_info[1];
+       asc_dvc->cfg->adapter_info[2] = eep_config->adapter_info[2];
+       asc_dvc->cfg->adapter_info[3] = eep_config->adapter_info[3];
+       asc_dvc->cfg->adapter_info[4] = eep_config->adapter_info[4];
+       asc_dvc->cfg->adapter_info[5] = eep_config->adapter_info[5];
+       if (!AscTestExternalLram(asc_dvc)) {
+               if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) ==
+                    ASC_IS_PCI_ULTRA)) {
+                       eep_config->max_total_qng =
+                           ASC_MAX_PCI_ULTRA_INRAM_TOTAL_QNG;
+                       eep_config->max_tag_qng =
+                           ASC_MAX_PCI_ULTRA_INRAM_TAG_QNG;
+               } else {
+                       eep_config->cfg_msw |= 0x0800;
+                       cfg_msw |= 0x0800;
+                       AscSetChipCfgMsw(iop_base, cfg_msw);
+                       eep_config->max_total_qng = ASC_MAX_PCI_INRAM_TOTAL_QNG;
+                       eep_config->max_tag_qng = ASC_MAX_INRAM_TAG_QNG;
+               }
+       } else {
+       }
+       if (eep_config->max_total_qng < ASC_MIN_TOTAL_QNG) {
+               eep_config->max_total_qng = ASC_MIN_TOTAL_QNG;
+       }
+       if (eep_config->max_total_qng > ASC_MAX_TOTAL_QNG) {
+               eep_config->max_total_qng = ASC_MAX_TOTAL_QNG;
+       }
+       if (eep_config->max_tag_qng > eep_config->max_total_qng) {
+               eep_config->max_tag_qng = eep_config->max_total_qng;
+       }
+       if (eep_config->max_tag_qng < ASC_MIN_TAG_Q_PER_DVC) {
+               eep_config->max_tag_qng = ASC_MIN_TAG_Q_PER_DVC;
+       }
+       asc_dvc->max_total_qng = eep_config->max_total_qng;
+       if ((eep_config->use_cmd_qng & eep_config->disc_enable) !=
+           eep_config->use_cmd_qng) {
+               eep_config->disc_enable = eep_config->use_cmd_qng;
+               warn_code |= ASC_WARN_CMD_QNG_CONFLICT;
+       }
+       if (asc_dvc->bus_type & (ASC_IS_ISA | ASC_IS_VL | ASC_IS_EISA)) {
+               asc_dvc->irq_no = AscGetChipIRQ(iop_base, asc_dvc->bus_type);
+       }
+       ASC_EEP_SET_CHIP_ID(eep_config,
+                           ASC_EEP_GET_CHIP_ID(eep_config) & ASC_MAX_TID);
+       asc_dvc->cfg->chip_scsi_id = ASC_EEP_GET_CHIP_ID(eep_config);
+       if (((asc_dvc->bus_type & ASC_IS_PCI_ULTRA) == ASC_IS_PCI_ULTRA) &&
+           !(asc_dvc->dvc_cntl & ASC_CNTL_SDTR_ENABLE_ULTRA)) {
+               asc_dvc->host_init_sdtr_index = ASC_SDTR_ULTRA_PCI_10MB_INDEX;
+       }
 
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        asc_dvc->dos_int13_table[i] = eep_config->dos_int13_table[i];
-        asc_dvc->cfg->max_tag_qng[i] = eep_config->max_tag_qng;
-        asc_dvc->cfg->sdtr_period_offset[i] =
-            (uchar) (ASC_DEF_SDTR_OFFSET |
-                     (asc_dvc->host_init_sdtr_index << 4));
-    }
-    eep_config->cfg_msw = AscGetChipCfgMsw(iop_base);
-    if (write_eep) {
-        if ((i = AscSetEEPConfig(iop_base, eep_config, asc_dvc->bus_type)) !=
-             0) {
-                ASC_PRINT1(
-"AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n", i);
-        } else {
-                ASC_PRINT("AscInitFromEEP: Successfully re-wrote EEPROM.\n");
-        }
-    }
-    return (warn_code);
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               asc_dvc->dos_int13_table[i] = eep_config->dos_int13_table[i];
+               asc_dvc->cfg->max_tag_qng[i] = eep_config->max_tag_qng;
+               asc_dvc->cfg->sdtr_period_offset[i] =
+                   (uchar)(ASC_DEF_SDTR_OFFSET |
+                           (asc_dvc->host_init_sdtr_index << 4));
+       }
+       eep_config->cfg_msw = AscGetChipCfgMsw(iop_base);
+       if (write_eep) {
+               if ((i =
+                    AscSetEEPConfig(iop_base, eep_config,
+                                    asc_dvc->bus_type)) != 0) {
+                       ASC_PRINT1
+                           ("AscInitFromEEP: Failed to re-write EEPROM with %d errors.\n",
+                            i);
+               } else {
+                       ASC_PRINT
+                           ("AscInitFromEEP: Successfully re-wrote EEPROM.\n");
+               }
+       }
+       return (warn_code);
 }
 
-STATIC ushort
-AscInitMicroCodeVar(
-                       ASC_DVC_VAR *asc_dvc
-)
+static ushort AscInitMicroCodeVar(ASC_DVC_VAR *asc_dvc)
 {
-    int                 i;
-    ushort              warn_code;
-    PortAddr            iop_base;
-    ASC_PADDR           phy_addr;
-    ASC_DCNT            phy_size;
-
-    iop_base = asc_dvc->iop_base;
-    warn_code = 0;
-    for (i = 0; i <= ASC_MAX_TID; i++) {
-        AscPutMCodeInitSDTRAtID(iop_base, i,
-                                asc_dvc->cfg->sdtr_period_offset[i]
-);
-    }
+       int i;
+       ushort warn_code;
+       PortAddr iop_base;
+       ASC_PADDR phy_addr;
+       ASC_DCNT phy_size;
+
+       iop_base = asc_dvc->iop_base;
+       warn_code = 0;
+       for (i = 0; i <= ASC_MAX_TID; i++) {
+               AscPutMCodeInitSDTRAtID(iop_base, i,
+                                       asc_dvc->cfg->sdtr_period_offset[i]
+                   );
+       }
 
-    AscInitQLinkVar(asc_dvc);
-    AscWriteLramByte(iop_base, ASCV_DISC_ENABLE_B,
-                     asc_dvc->cfg->disc_enable);
-    AscWriteLramByte(iop_base, ASCV_HOSTSCSI_ID_B,
-                     ASC_TID_TO_TARGET_ID(asc_dvc->cfg->chip_scsi_id));
-
-    /* Align overrun buffer on an 8 byte boundary. */
-    phy_addr = virt_to_bus(asc_dvc->cfg->overrun_buf);
-    phy_addr = cpu_to_le32((phy_addr + 7) & ~0x7);
-    AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_PADDR_D,
-        (uchar *) &phy_addr, 1);
-    phy_size = cpu_to_le32(ASC_OVERRUN_BSIZE - 8);
-    AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_BSIZE_D,
-        (uchar *) &phy_size, 1);
-
-    asc_dvc->cfg->mcode_date =
-        AscReadLramWord(iop_base, (ushort) ASCV_MC_DATE_W);
-    asc_dvc->cfg->mcode_version =
-        AscReadLramWord(iop_base, (ushort) ASCV_MC_VER_W);
-
-    AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
-    if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
-        asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
-        return (warn_code);
-    }
-    if (AscStartChip(iop_base) != 1) {
-        asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
-        return (warn_code);
-    }
+       AscInitQLinkVar(asc_dvc);
+       AscWriteLramByte(iop_base, ASCV_DISC_ENABLE_B,
+                        asc_dvc->cfg->disc_enable);
+       AscWriteLramByte(iop_base, ASCV_HOSTSCSI_ID_B,
+                        ASC_TID_TO_TARGET_ID(asc_dvc->cfg->chip_scsi_id));
+
+       /* Align overrun buffer on an 8 byte boundary. */
+       phy_addr = virt_to_bus(asc_dvc->cfg->overrun_buf);
+       phy_addr = cpu_to_le32((phy_addr + 7) & ~0x7);
+       AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_PADDR_D,
+                                (uchar *)&phy_addr, 1);
+       phy_size = cpu_to_le32(ASC_OVERRUN_BSIZE - 8);
+       AscMemDWordCopyPtrToLram(iop_base, ASCV_OVERRUN_BSIZE_D,
+                                (uchar *)&phy_size, 1);
+
+       asc_dvc->cfg->mcode_date =
+           AscReadLramWord(iop_base, (ushort)ASCV_MC_DATE_W);
+       asc_dvc->cfg->mcode_version =
+           AscReadLramWord(iop_base, (ushort)ASCV_MC_VER_W);
+
+       AscSetPCAddr(iop_base, ASC_MCODE_START_ADDR);
+       if (AscGetPCAddr(iop_base) != ASC_MCODE_START_ADDR) {
+               asc_dvc->err_code |= ASC_IERR_SET_PC_ADDR;
+               return (warn_code);
+       }
+       if (AscStartChip(iop_base) != 1) {
+               asc_dvc->err_code |= ASC_IERR_START_STOP_CHIP;
+               return (warn_code);
+       }
 
-    return (warn_code);
+       return (warn_code);
 }
 
-STATIC int __init
-AscTestExternalLram(
-                       ASC_DVC_VAR *asc_dvc)
+static int __init AscTestExternalLram(ASC_DVC_VAR *asc_dvc)
 {
-    PortAddr            iop_base;
-    ushort              q_addr;
-    ushort              saved_word;
-    int                 sta;
-
-    iop_base = asc_dvc->iop_base;
-    sta = 0;
-    q_addr = ASC_QNO_TO_QADDR(241);
-    saved_word = AscReadLramWord(iop_base, q_addr);
-    AscSetChipLramAddr(iop_base, q_addr);
-    AscSetChipLramData(iop_base, 0x55AA);
-    DvcSleepMilliSecond(10);
-    AscSetChipLramAddr(iop_base, q_addr);
-    if (AscGetChipLramData(iop_base) == 0x55AA) {
-        sta = 1;
-        AscWriteLramWord(iop_base, q_addr, saved_word);
-    }
-    return (sta);
+       PortAddr iop_base;
+       ushort q_addr;
+       ushort saved_word;
+       int sta;
+
+       iop_base = asc_dvc->iop_base;
+       sta = 0;
+       q_addr = ASC_QNO_TO_QADDR(241);
+       saved_word = AscReadLramWord(iop_base, q_addr);
+       AscSetChipLramAddr(iop_base, q_addr);
+       AscSetChipLramData(iop_base, 0x55AA);
+       DvcSleepMilliSecond(10);
+       AscSetChipLramAddr(iop_base, q_addr);
+       if (AscGetChipLramData(iop_base) == 0x55AA) {
+               sta = 1;
+               AscWriteLramWord(iop_base, q_addr, saved_word);
+       }
+       return (sta);
 }
 
-STATIC int __init
-AscWriteEEPCmdReg(
-                     PortAddr iop_base,
-                     uchar cmd_reg
-)
+static int __init AscWriteEEPCmdReg(PortAddr iop_base, uchar cmd_reg)
 {
-    uchar               read_back;
-    int                 retry;
-
-    retry = 0;
-    while (TRUE) {
-        AscSetChipEEPCmd(iop_base, cmd_reg);
-        DvcSleepMilliSecond(1);
-        read_back = AscGetChipEEPCmd(iop_base);
-        if (read_back == cmd_reg) {
-            return (1);
-        }
-        if (retry++ > ASC_EEP_MAX_RETRY) {
-            return (0);
-        }
-    }
+       uchar read_back;
+       int retry;
+
+       retry = 0;
+       while (TRUE) {
+               AscSetChipEEPCmd(iop_base, cmd_reg);
+               DvcSleepMilliSecond(1);
+               read_back = AscGetChipEEPCmd(iop_base);
+               if (read_back == cmd_reg) {
+                       return (1);
+               }
+               if (retry++ > ASC_EEP_MAX_RETRY) {
+                       return (0);
+               }
+       }
 }
 
-STATIC int __init
-AscWriteEEPDataReg(
-                      PortAddr iop_base,
-                      ushort data_reg
-)
+static int __init AscWriteEEPDataReg(PortAddr iop_base, ushort data_reg)
 {
-    ushort              read_back;
-    int                 retry;
-
-    retry = 0;
-    while (TRUE) {
-        AscSetChipEEPData(iop_base, data_reg);
-        DvcSleepMilliSecond(1);
-        read_back = AscGetChipEEPData(iop_base);
-        if (read_back == data_reg) {
-            return (1);
-        }
-        if (retry++ > ASC_EEP_MAX_RETRY) {
-            return (0);
-        }
-    }
+       ushort read_back;
+       int retry;
+
+       retry = 0;
+       while (TRUE) {
+               AscSetChipEEPData(iop_base, data_reg);
+               DvcSleepMilliSecond(1);
+               read_back = AscGetChipEEPData(iop_base);
+               if (read_back == data_reg) {
+                       return (1);
+               }
+               if (retry++ > ASC_EEP_MAX_RETRY) {
+                       return (0);
+               }
+       }
 }
 
-STATIC void __init
-AscWaitEEPRead(void)
+static void __init AscWaitEEPRead(void)
 {
-    DvcSleepMilliSecond(1);
-    return;
+       DvcSleepMilliSecond(1);
+       return;
 }
 
-STATIC void __init
-AscWaitEEPWrite(void)
+static void __init AscWaitEEPWrite(void)
 {
-    DvcSleepMilliSecond(20);
-    return;
+       DvcSleepMilliSecond(20);
+       return;
 }
 
-STATIC ushort __init
-AscReadEEPWord(
-                  PortAddr iop_base,
-                  uchar addr)
+static ushort __init AscReadEEPWord(PortAddr iop_base, uchar addr)
 {
-    ushort              read_wval;
-    uchar               cmd_reg;
-
-    AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
-    AscWaitEEPRead();
-    cmd_reg = addr | ASC_EEP_CMD_READ;
-    AscWriteEEPCmdReg(iop_base, cmd_reg);
-    AscWaitEEPRead();
-    read_wval = AscGetChipEEPData(iop_base);
-    AscWaitEEPRead();
-    return (read_wval);
+       ushort read_wval;
+       uchar cmd_reg;
+
+       AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
+       AscWaitEEPRead();
+       cmd_reg = addr | ASC_EEP_CMD_READ;
+       AscWriteEEPCmdReg(iop_base, cmd_reg);
+       AscWaitEEPRead();
+       read_wval = AscGetChipEEPData(iop_base);
+       AscWaitEEPRead();
+       return (read_wval);
 }
 
-STATIC ushort __init
-AscWriteEEPWord(
-                   PortAddr iop_base,
-                   uchar addr,
-                   ushort word_val)
+static ushort __init
+AscWriteEEPWord(PortAddr iop_base, uchar addr, ushort word_val)
 {
-    ushort              read_wval;
-
-    read_wval = AscReadEEPWord(iop_base, addr);
-    if (read_wval != word_val) {
-        AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_ABLE);
-        AscWaitEEPRead();
-        AscWriteEEPDataReg(iop_base, word_val);
-        AscWaitEEPRead();
-        AscWriteEEPCmdReg(iop_base,
-                          (uchar) ((uchar) ASC_EEP_CMD_WRITE | addr));
-        AscWaitEEPWrite();
-        AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
-        AscWaitEEPRead();
-        return (AscReadEEPWord(iop_base, addr));
-    }
-    return (read_wval);
+       ushort read_wval;
+
+       read_wval = AscReadEEPWord(iop_base, addr);
+       if (read_wval != word_val) {
+               AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_ABLE);
+               AscWaitEEPRead();
+               AscWriteEEPDataReg(iop_base, word_val);
+               AscWaitEEPRead();
+               AscWriteEEPCmdReg(iop_base,
+                                 (uchar)((uchar)ASC_EEP_CMD_WRITE | addr));
+               AscWaitEEPWrite();
+               AscWriteEEPCmdReg(iop_base, ASC_EEP_CMD_WRITE_DISABLE);
+               AscWaitEEPRead();
+               return (AscReadEEPWord(iop_base, addr));
+       }
+       return (read_wval);
 }
 
-STATIC ushort __init
-AscGetEEPConfig(
-                   PortAddr iop_base,
-                   ASCEEP_CONFIG * cfg_buf, ushort bus_type)
+static ushort __init
+AscGetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
 {
-    ushort              wval;
-    ushort              sum;
-    ushort              *wbuf;
-    int                 cfg_beg;
-    int                 cfg_end;
-    int                 uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
-    int                 s_addr;
-
-    wbuf = (ushort *) cfg_buf;
-    sum = 0;
-    /* Read two config words; Byte-swapping done by AscReadEEPWord(). */
-    for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
-        *wbuf = AscReadEEPWord(iop_base, (uchar) s_addr);
-        sum += *wbuf;
-    }
-    if (bus_type & ASC_IS_VL) {
-        cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
-        cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
-    } else {
-        cfg_beg = ASC_EEP_DVC_CFG_BEG;
-        cfg_end = ASC_EEP_MAX_DVC_ADDR;
-    }
-    for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
-        wval = AscReadEEPWord( iop_base, ( uchar )s_addr ) ;
-        if (s_addr <= uchar_end_in_config) {
-            /*
-             * Swap all char fields - must unswap bytes already swapped
-             * by AscReadEEPWord().
-             */
-            *wbuf = le16_to_cpu(wval);
-        } else {
-            /* Don't swap word field at the end - cntl field. */
-            *wbuf = wval;
-        }
-        sum += wval; /* Checksum treats all EEPROM data as words. */
-    }
-    /*
-     * Read the checksum word which will be compared against 'sum'
-     * by the caller. Word field already swapped.
-     */
-    *wbuf = AscReadEEPWord(iop_base, (uchar) s_addr);
-    return (sum);
+       ushort wval;
+       ushort sum;
+       ushort *wbuf;
+       int cfg_beg;
+       int cfg_end;
+       int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
+       int s_addr;
+
+       wbuf = (ushort *)cfg_buf;
+       sum = 0;
+       /* Read two config words; Byte-swapping done by AscReadEEPWord(). */
+       for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
+               *wbuf = AscReadEEPWord(iop_base, (uchar)s_addr);
+               sum += *wbuf;
+       }
+       if (bus_type & ASC_IS_VL) {
+               cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
+               cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
+       } else {
+               cfg_beg = ASC_EEP_DVC_CFG_BEG;
+               cfg_end = ASC_EEP_MAX_DVC_ADDR;
+       }
+       for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
+               wval = AscReadEEPWord(iop_base, (uchar)s_addr);
+               if (s_addr <= uchar_end_in_config) {
+                       /*
+                        * Swap all char fields - must unswap bytes already swapped
+                        * by AscReadEEPWord().
+                        */
+                       *wbuf = le16_to_cpu(wval);
+               } else {
+                       /* Don't swap word field at the end - cntl field. */
+                       *wbuf = wval;
+               }
+               sum += wval;    /* Checksum treats all EEPROM data as words. */
+       }
+       /*
+        * Read the checksum word which will be compared against 'sum'
+        * by the caller. Word field already swapped.
+        */
+       *wbuf = AscReadEEPWord(iop_base, (uchar)s_addr);
+       return (sum);
 }
 
-STATIC int __init
-AscSetEEPConfigOnce(
-                       PortAddr iop_base,
-                       ASCEEP_CONFIG * cfg_buf, ushort bus_type)
+static int __init
+AscSetEEPConfigOnce(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
 {
-    int                 n_error;
-    ushort              *wbuf;
-    ushort              word;
-    ushort              sum;
-    int                 s_addr;
-    int                 cfg_beg;
-    int                 cfg_end;
-    int                 uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
-
-
-    wbuf = (ushort *) cfg_buf;
-    n_error = 0;
-    sum = 0;
-    /* Write two config words; AscWriteEEPWord() will swap bytes. */
-    for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
-        sum += *wbuf;
-        if (*wbuf != AscWriteEEPWord(iop_base, (uchar) s_addr, *wbuf)) {
-            n_error++;
-        }
-    }
-    if (bus_type & ASC_IS_VL) {
-        cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
-        cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
-    } else {
-        cfg_beg = ASC_EEP_DVC_CFG_BEG;
-        cfg_end = ASC_EEP_MAX_DVC_ADDR;
-    }
-    for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
-        if (s_addr <= uchar_end_in_config) {
-            /*
-             * This is a char field. Swap char fields before they are
-             * swapped again by AscWriteEEPWord().
-             */
-            word = cpu_to_le16(*wbuf);
-            if (word != AscWriteEEPWord( iop_base, (uchar) s_addr, word)) {
-                n_error++;
-            }
-        } else {
-            /* Don't swap word field at the end - cntl field. */
-            if (*wbuf != AscWriteEEPWord(iop_base, (uchar) s_addr, *wbuf)) {
-                n_error++;
-            }
-        }
-        sum += *wbuf; /* Checksum calculated from word values. */
-    }
-    /* Write checksum word. It will be swapped by AscWriteEEPWord(). */
-    *wbuf = sum;
-    if (sum != AscWriteEEPWord(iop_base, (uchar) s_addr, sum)) {
-        n_error++;
-    }
+       int n_error;
+       ushort *wbuf;
+       ushort word;
+       ushort sum;
+       int s_addr;
+       int cfg_beg;
+       int cfg_end;
+       int uchar_end_in_config = ASC_EEP_MAX_DVC_ADDR - 2;
+
+       wbuf = (ushort *)cfg_buf;
+       n_error = 0;
+       sum = 0;
+       /* Write two config words; AscWriteEEPWord() will swap bytes. */
+       for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
+               sum += *wbuf;
+               if (*wbuf != AscWriteEEPWord(iop_base, (uchar)s_addr, *wbuf)) {
+                       n_error++;
+               }
+       }
+       if (bus_type & ASC_IS_VL) {
+               cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
+               cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
+       } else {
+               cfg_beg = ASC_EEP_DVC_CFG_BEG;
+               cfg_end = ASC_EEP_MAX_DVC_ADDR;
+       }
+       for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
+               if (s_addr <= uchar_end_in_config) {
+                       /*
+                        * This is a char field. Swap char fields before they are
+                        * swapped again by AscWriteEEPWord().
+                        */
+                       word = cpu_to_le16(*wbuf);
+                       if (word !=
+                           AscWriteEEPWord(iop_base, (uchar)s_addr, word)) {
+                               n_error++;
+                       }
+               } else {
+                       /* Don't swap word field at the end - cntl field. */
+                       if (*wbuf !=
+                           AscWriteEEPWord(iop_base, (uchar)s_addr, *wbuf)) {
+                               n_error++;
+                       }
+               }
+               sum += *wbuf;   /* Checksum calculated from word values. */
+       }
+       /* Write checksum word. It will be swapped by AscWriteEEPWord(). */
+       *wbuf = sum;
+       if (sum != AscWriteEEPWord(iop_base, (uchar)s_addr, sum)) {
+               n_error++;
+       }
 
-    /* Read EEPROM back again. */
-    wbuf = (ushort *) cfg_buf;
-    /*
-     * Read two config words; Byte-swapping done by AscReadEEPWord().
-     */
-    for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
-        if (*wbuf != AscReadEEPWord(iop_base, (uchar) s_addr)) {
-            n_error++;
-        }
-    }
-    if (bus_type & ASC_IS_VL) {
-        cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
-        cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
-    } else {
-        cfg_beg = ASC_EEP_DVC_CFG_BEG;
-        cfg_end = ASC_EEP_MAX_DVC_ADDR;
-    }
-    for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
-        if (s_addr <= uchar_end_in_config) {
-            /*
-             * Swap all char fields. Must unswap bytes already swapped
-             * by AscReadEEPWord().
-             */
-            word = le16_to_cpu(AscReadEEPWord(iop_base, (uchar) s_addr));
-        } else {
-            /* Don't swap word field at the end - cntl field. */
-            word = AscReadEEPWord(iop_base, (uchar) s_addr);
-        }
-        if (*wbuf != word) {
-            n_error++;
-        }
-    }
-    /* Read checksum; Byte swapping not needed. */
-    if (AscReadEEPWord(iop_base, (uchar) s_addr) != sum) {
-        n_error++;
-    }
-    return (n_error);
+       /* Read EEPROM back again. */
+       wbuf = (ushort *)cfg_buf;
+       /*
+        * Read two config words; Byte-swapping done by AscReadEEPWord().
+        */
+       for (s_addr = 0; s_addr < 2; s_addr++, wbuf++) {
+               if (*wbuf != AscReadEEPWord(iop_base, (uchar)s_addr)) {
+                       n_error++;
+               }
+       }
+       if (bus_type & ASC_IS_VL) {
+               cfg_beg = ASC_EEP_DVC_CFG_BEG_VL;
+               cfg_end = ASC_EEP_MAX_DVC_ADDR_VL;
+       } else {
+               cfg_beg = ASC_EEP_DVC_CFG_BEG;
+               cfg_end = ASC_EEP_MAX_DVC_ADDR;
+       }
+       for (s_addr = cfg_beg; s_addr <= (cfg_end - 1); s_addr++, wbuf++) {
+               if (s_addr <= uchar_end_in_config) {
+                       /*
+                        * Swap all char fields. Must unswap bytes already swapped
+                        * by AscReadEEPWord().
+                        */
+                       word =
+                           le16_to_cpu(AscReadEEPWord
+                                       (iop_base, (uchar)s_addr));
+               } else {
+                       /* Don't swap word field at the end - cntl field. */
+                       word = AscReadEEPWord(iop_base, (uchar)s_addr);
+               }
+               if (*wbuf != word) {
+                       n_error++;
+               }
+       }
+       /* Read checksum; Byte swapping not needed. */
+       if (AscReadEEPWord(iop_base, (uchar)s_addr) != sum) {
+               n_error++;
+       }
+       return (n_error);
 }
 
-STATIC int __init
-AscSetEEPConfig(
-                   PortAddr iop_base,
-                   ASCEEP_CONFIG * cfg_buf, ushort bus_type
-)
+static int __init
+AscSetEEPConfig(PortAddr iop_base, ASCEEP_CONFIG *cfg_buf, ushort bus_type)
 {
-    int            retry;
-    int            n_error;
-
-    retry = 0;
-    while (TRUE) {
-        if ((n_error = AscSetEEPConfigOnce(iop_base, cfg_buf,
-                                           bus_type)) == 0) {
-            break;
-        }
-        if (++retry > ASC_EEP_MAX_RETRY) {
-            break;
-        }
-    }
-    return (n_error);
+       int retry;
+       int n_error;
+
+       retry = 0;
+       while (TRUE) {
+               if ((n_error = AscSetEEPConfigOnce(iop_base, cfg_buf,
+                                                  bus_type)) == 0) {
+                       break;
+               }
+               if (++retry > ASC_EEP_MAX_RETRY) {
+                       break;
+               }
+       }
+       return (n_error);
 }
 
-STATIC void
-AscAsyncFix(
-               ASC_DVC_VAR *asc_dvc,
-               uchar tid_no,
-               ASC_SCSI_INQUIRY *inq)
+static void
+AscAsyncFix(ASC_DVC_VAR *asc_dvc, uchar tid_no, ASC_SCSI_INQUIRY *inq)
 {
-    uchar                       dvc_type;
-    ASC_SCSI_BIT_ID_TYPE        tid_bits;
-
-    dvc_type = ASC_INQ_DVC_TYPE(inq);
-    tid_bits = ASC_TIX_TO_TARGET_ID(tid_no);
-
-    if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_ASYN_USE_SYN)
-    {
-        if (!(asc_dvc->init_sdtr & tid_bits))
-        {
-            if ((dvc_type == TYPE_ROM) &&
-                (AscCompareString((uchar *) inq->vendor_id,
-                    (uchar *) "HP ", 3) == 0))
-            {
-                asc_dvc->pci_fix_asyn_xfer_always |= tid_bits;
-            }
-            asc_dvc->pci_fix_asyn_xfer |= tid_bits;
-            if ((dvc_type == TYPE_PROCESSOR) ||
-                (dvc_type == TYPE_SCANNER) ||
-                (dvc_type == TYPE_ROM) ||
-                (dvc_type == TYPE_TAPE))
-            {
-                asc_dvc->pci_fix_asyn_xfer &= ~tid_bits;
-            }
-
-            if (asc_dvc->pci_fix_asyn_xfer & tid_bits)
-            {
-                AscSetRunChipSynRegAtID(asc_dvc->iop_base, tid_no,
-                    ASYN_SDTR_DATA_FIX_PCI_REV_AB);
-            }
-        }
-    }
-    return;
+       uchar dvc_type;
+       ASC_SCSI_BIT_ID_TYPE tid_bits;
+
+       dvc_type = ASC_INQ_DVC_TYPE(inq);
+       tid_bits = ASC_TIX_TO_TARGET_ID(tid_no);
+
+       if (asc_dvc->bug_fix_cntl & ASC_BUG_FIX_ASYN_USE_SYN) {
+               if (!(asc_dvc->init_sdtr & tid_bits)) {
+                       if ((dvc_type == TYPE_ROM) &&
+                           (AscCompareString((uchar *)inq->vendor_id,
+                                             (uchar *)"HP ", 3) == 0)) {
+                               asc_dvc->pci_fix_asyn_xfer_always |= tid_bits;
+                       }
+                       asc_dvc->pci_fix_asyn_xfer |= tid_bits;
+                       if ((dvc_type == TYPE_PROCESSOR) ||
+                           (dvc_type == TYPE_SCANNER) ||
+                           (dvc_type == TYPE_ROM) || (dvc_type == TYPE_TAPE)) {
+                               asc_dvc->pci_fix_asyn_xfer &= ~tid_bits;
+                       }
+
+                       if (asc_dvc->pci_fix_asyn_xfer & tid_bits) {
+                               AscSetRunChipSynRegAtID(asc_dvc->iop_base,
+                                                       tid_no,
+                                                       ASYN_SDTR_DATA_FIX_PCI_REV_AB);
+                       }
+               }
+       }
+       return;
 }
 
-STATIC int
-AscTagQueuingSafe(ASC_SCSI_INQUIRY *inq)
+static int AscTagQueuingSafe(ASC_SCSI_INQUIRY *inq)
 {
-    if ((inq->add_len >= 32) &&
-        (AscCompareString((uchar *) inq->vendor_id,
-            (uchar *) "QUANTUM XP34301", 15) == 0) &&
-        (AscCompareString((uchar *) inq->product_rev_level,
-            (uchar *) "1071", 4) == 0))
-    {
-        return 0;
-    }
-    return 1;
+       if ((inq->add_len >= 32) &&
+           (AscCompareString((uchar *)inq->vendor_id,
+                             (uchar *)"QUANTUM XP34301", 15) == 0) &&
+           (AscCompareString((uchar *)inq->product_rev_level,
+                             (uchar *)"1071", 4) == 0)) {
+               return 0;
+       }
+       return 1;
 }
 
-STATIC void
-AscInquiryHandling(ASC_DVC_VAR *asc_dvc,
-                   uchar tid_no, ASC_SCSI_INQUIRY *inq)
+static void
+AscInquiryHandling(ASC_DVC_VAR *asc_dvc, uchar tid_no, ASC_SCSI_INQUIRY *inq)
 {
-    ASC_SCSI_BIT_ID_TYPE tid_bit = ASC_TIX_TO_TARGET_ID(tid_no);
-    ASC_SCSI_BIT_ID_TYPE orig_init_sdtr, orig_use_tagged_qng;
-
-    orig_init_sdtr = asc_dvc->init_sdtr;
-    orig_use_tagged_qng = asc_dvc->use_tagged_qng;
-
-    asc_dvc->init_sdtr &= ~tid_bit;
-    asc_dvc->cfg->can_tagged_qng &= ~tid_bit;
-    asc_dvc->use_tagged_qng &= ~tid_bit;
-
-    if (ASC_INQ_RESPONSE_FMT(inq) >= 2 || ASC_INQ_ANSI_VER(inq) >= 2) {
-        if ((asc_dvc->cfg->sdtr_enable & tid_bit) && ASC_INQ_SYNC(inq)) {
-            asc_dvc->init_sdtr |= tid_bit;
-        }
-        if ((asc_dvc->cfg->cmd_qng_enabled & tid_bit) &&
-             ASC_INQ_CMD_QUEUE(inq)) {
-            if (AscTagQueuingSafe(inq)) {
-                asc_dvc->use_tagged_qng |= tid_bit;
-                asc_dvc->cfg->can_tagged_qng |= tid_bit;
-            }
-        }
-    }
-    if (orig_use_tagged_qng != asc_dvc->use_tagged_qng) {
-        AscWriteLramByte(asc_dvc->iop_base, ASCV_DISC_ENABLE_B,
-                         asc_dvc->cfg->disc_enable);
-        AscWriteLramByte(asc_dvc->iop_base, ASCV_USE_TAGGED_QNG_B,
-                         asc_dvc->use_tagged_qng);
-        AscWriteLramByte(asc_dvc->iop_base, ASCV_CAN_TAGGED_QNG_B,
-                         asc_dvc->cfg->can_tagged_qng);
-
-        asc_dvc->max_dvc_qng[tid_no] =
-          asc_dvc->cfg->max_tag_qng[tid_no];
-        AscWriteLramByte(asc_dvc->iop_base,
-                         (ushort) (ASCV_MAX_DVC_QNG_BEG + tid_no),
-                         asc_dvc->max_dvc_qng[tid_no]);
-    }
-    if (orig_init_sdtr != asc_dvc->init_sdtr) {
-        AscAsyncFix(asc_dvc, tid_no, inq);
-    }
-    return;
+       ASC_SCSI_BIT_ID_TYPE tid_bit = ASC_TIX_TO_TARGET_ID(tid_no);
+       ASC_SCSI_BIT_ID_TYPE orig_init_sdtr, orig_use_tagged_qng;
+
+       orig_init_sdtr = asc_dvc->init_sdtr;
+       orig_use_tagged_qng = asc_dvc->use_tagged_qng;
+
+       asc_dvc->init_sdtr &= ~tid_bit;
+       asc_dvc->cfg->can_tagged_qng &= ~tid_bit;
+       asc_dvc->use_tagged_qng &= ~tid_bit;
+
+       if (ASC_INQ_RESPONSE_FMT(inq) >= 2 || ASC_INQ_ANSI_VER(inq) >= 2) {
+               if ((asc_dvc->cfg->sdtr_enable & tid_bit) && ASC_INQ_SYNC(inq)) {
+                       asc_dvc->init_sdtr |= tid_bit;
+               }
+               if ((asc_dvc->cfg->cmd_qng_enabled & tid_bit) &&
+                   ASC_INQ_CMD_QUEUE(inq)) {
+                       if (AscTagQueuingSafe(inq)) {
+                               asc_dvc->use_tagged_qng |= tid_bit;
+                               asc_dvc->cfg->can_tagged_qng |= tid_bit;
+                       }
+               }
+       }
+       if (orig_use_tagged_qng != asc_dvc->use_tagged_qng) {
+               AscWriteLramByte(asc_dvc->iop_base, ASCV_DISC_ENABLE_B,
+                                asc_dvc->cfg->disc_enable);
+               AscWriteLramByte(asc_dvc->iop_base, ASCV_USE_TAGGED_QNG_B,
+                                asc_dvc->use_tagged_qng);
+               AscWriteLramByte(asc_dvc->iop_base, ASCV_CAN_TAGGED_QNG_B,
+                                asc_dvc->cfg->can_tagged_qng);
+
+               asc_dvc->max_dvc_qng[tid_no] =
+                   asc_dvc->cfg->max_tag_qng[tid_no];
+               AscWriteLramByte(asc_dvc->iop_base,
+                                (ushort)(ASCV_MAX_DVC_QNG_BEG + tid_no),
+                                asc_dvc->max_dvc_qng[tid_no]);
+       }
+       if (orig_init_sdtr != asc_dvc->init_sdtr) {
+               AscAsyncFix(asc_dvc, tid_no, inq);
+       }
+       return;
 }
 
-STATIC int
-AscCompareString(
-                    uchar *str1,
-                    uchar *str2,
-                    int len
-)
+static int AscCompareString(uchar *str1, uchar *str2, int len)
 {
-    int                 i;
-    int                 diff;
+       int i;
+       int diff;
 
-    for (i = 0; i < len; i++) {
-        diff = (int) (str1[i] - str2[i]);
-        if (diff != 0)
-            return (diff);
-    }
-    return (0);
+       for (i = 0; i < len; i++) {
+               diff = (int)(str1[i] - str2[i]);
+               if (diff != 0)
+                       return (diff);
+       }
+       return (0);
 }
 
-STATIC uchar
-AscReadLramByte(
-                   PortAddr iop_base,
-                   ushort addr
-)
+static uchar AscReadLramByte(PortAddr iop_base, ushort addr)
 {
-    uchar               byte_data;
-    ushort              word_data;
-
-    if (isodd_word(addr)) {
-        AscSetChipLramAddr(iop_base, addr - 1);
-        word_data = AscGetChipLramData(iop_base);
-        byte_data = (uchar) ((word_data >> 8) & 0xFF);
-    } else {
-        AscSetChipLramAddr(iop_base, addr);
-        word_data = AscGetChipLramData(iop_base);
-        byte_data = (uchar) (word_data & 0xFF);
-    }
-    return (byte_data);
+       uchar byte_data;
+       ushort word_data;
+
+       if (isodd_word(addr)) {
+               AscSetChipLramAddr(iop_base, addr - 1);
+               word_data = AscGetChipLramData(iop_base);
+               byte_data = (uchar)((word_data >> 8) & 0xFF);
+       } else {
+               AscSetChipLramAddr(iop_base, addr);
+               word_data = AscGetChipLramData(iop_base);
+               byte_data = (uchar)(word_data & 0xFF);
+       }
+       return (byte_data);
 }
-STATIC ushort
-AscReadLramWord(
-                   PortAddr iop_base,
-                   ushort addr
-)
+
+static ushort AscReadLramWord(PortAddr iop_base, ushort addr)
 {
-    ushort              word_data;
+       ushort word_data;
 
-    AscSetChipLramAddr(iop_base, addr);
-    word_data = AscGetChipLramData(iop_base);
-    return (word_data);
+       AscSetChipLramAddr(iop_base, addr);
+       word_data = AscGetChipLramData(iop_base);
+       return (word_data);
 }
 
 #if CC_VERY_LONG_SG_LIST
-STATIC ASC_DCNT
-AscReadLramDWord(
-                    PortAddr iop_base,
-                    ushort addr
-)
+static ASC_DCNT AscReadLramDWord(PortAddr iop_base, ushort addr)
 {
-    ushort              val_low, val_high;
-    ASC_DCNT            dword_data;
-
-    AscSetChipLramAddr(iop_base, addr);
-    val_low = AscGetChipLramData(iop_base);
-    val_high = AscGetChipLramData(iop_base);
-    dword_data = ((ASC_DCNT) val_high << 16) | (ASC_DCNT) val_low;
-    return (dword_data);
+       ushort val_low, val_high;
+       ASC_DCNT dword_data;
+
+       AscSetChipLramAddr(iop_base, addr);
+       val_low = AscGetChipLramData(iop_base);
+       val_high = AscGetChipLramData(iop_base);
+       dword_data = ((ASC_DCNT) val_high << 16) | (ASC_DCNT) val_low;
+       return (dword_data);
 }
 #endif /* CC_VERY_LONG_SG_LIST */
 
-STATIC void
-AscWriteLramWord(
-                    PortAddr iop_base,
-                    ushort addr,
-                    ushort word_val
-)
+static void AscWriteLramWord(PortAddr iop_base, ushort addr, ushort word_val)
 {
-    AscSetChipLramAddr(iop_base, addr);
-    AscSetChipLramData(iop_base, word_val);
-    return;
+       AscSetChipLramAddr(iop_base, addr);
+       AscSetChipLramData(iop_base, word_val);
+       return;
 }
 
-STATIC void
-AscWriteLramByte(
-                    PortAddr iop_base,
-                    ushort addr,
-                    uchar byte_val
-)
+static void AscWriteLramByte(PortAddr iop_base, ushort addr, uchar byte_val)
 {
-    ushort              word_data;
-
-    if (isodd_word(addr)) {
-        addr--;
-        word_data = AscReadLramWord(iop_base, addr);
-        word_data &= 0x00FF;
-        word_data |= (((ushort) byte_val << 8) & 0xFF00);
-    } else {
-        word_data = AscReadLramWord(iop_base, addr);
-        word_data &= 0xFF00;
-        word_data |= ((ushort) byte_val & 0x00FF);
-    }
-    AscWriteLramWord(iop_base, addr, word_data);
-    return;
+       ushort word_data;
+
+       if (isodd_word(addr)) {
+               addr--;
+               word_data = AscReadLramWord(iop_base, addr);
+               word_data &= 0x00FF;
+               word_data |= (((ushort)byte_val << 8) & 0xFF00);
+       } else {
+               word_data = AscReadLramWord(iop_base, addr);
+               word_data &= 0xFF00;
+               word_data |= ((ushort)byte_val & 0x00FF);
+       }
+       AscWriteLramWord(iop_base, addr, word_data);
+       return;
 }
 
 /*
@@ -12841,30 +11628,26 @@ AscWriteLramByte(
  * The source data is assumed to be in little-endian order in memory
  * and is maintained in little-endian order when written to LRAM.
  */
-STATIC void
-AscMemWordCopyPtrToLram(
-                        PortAddr iop_base,
-                        ushort s_addr,
-                        uchar *s_buffer,
-                        int words
-)
+static void
+AscMemWordCopyPtrToLram(PortAddr iop_base,
+                       ushort s_addr, uchar *s_buffer, int words)
 {
-    int    i;
-
-    AscSetChipLramAddr(iop_base, s_addr);
-    for (i = 0; i < 2 * words; i += 2) {
-        /*
-         * On a little-endian system the second argument below
-         * produces a little-endian ushort which is written to
-         * LRAM in little-endian order. On a big-endian system
-         * the second argument produces a big-endian ushort which
-         * is "transparently" byte-swapped by outpw() and written
-         * in little-endian order to LRAM.
-         */
-        outpw(iop_base + IOP_RAM_DATA,
-            ((ushort) s_buffer[i + 1] << 8) | s_buffer[i]);
-    }
-    return;
+       int i;
+
+       AscSetChipLramAddr(iop_base, s_addr);
+       for (i = 0; i < 2 * words; i += 2) {
+               /*
+                * On a little-endian system the second argument below
+                * produces a little-endian ushort which is written to
+                * LRAM in little-endian order. On a big-endian system
+                * the second argument produces a big-endian ushort which
+                * is "transparently" byte-swapped by outpw() and written
+                * in little-endian order to LRAM.
+                */
+               outpw(iop_base + IOP_RAM_DATA,
+                     ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
+       }
+       return;
 }
 
 /*
@@ -12873,24 +11656,18 @@ AscMemWordCopyPtrToLram(
  * The source data is assumed to be in little-endian order in memory
  * and is maintained in little-endian order when writen to LRAM.
  */
-STATIC void
-AscMemDWordCopyPtrToLram(
-                         PortAddr iop_base,
-                         ushort s_addr,
-                         uchar *s_buffer,
-                         int dwords
-)
+static void
+AscMemDWordCopyPtrToLram(PortAddr iop_base,
+                        ushort s_addr, uchar *s_buffer, int dwords)
 {
-    int       i;
-
-    AscSetChipLramAddr(iop_base, s_addr);
-    for (i = 0; i < 4 * dwords; i += 4) {
-        outpw(iop_base + IOP_RAM_DATA,
-            ((ushort) s_buffer[i + 1] << 8) | s_buffer[i]); /* LSW */
-        outpw(iop_base + IOP_RAM_DATA,
-            ((ushort) s_buffer[i + 3] << 8) | s_buffer[i + 2]); /* MSW */
-    }
-    return;
+       int i;
+
+       AscSetChipLramAddr(iop_base, s_addr);
+       for (i = 0; i < 4 * dwords; i += 4) {
+               outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);   /* LSW */
+               outpw(iop_base + IOP_RAM_DATA, ((ushort)s_buffer[i + 3] << 8) | s_buffer[i + 2]);       /* MSW */
+       }
+       return;
 }
 
 /*
@@ -12899,61 +11676,46 @@ AscMemDWordCopyPtrToLram(
  * The source data is assumed to be in little-endian order in LRAM
  * and is maintained in little-endian order when written to memory.
  */
-STATIC void
-AscMemWordCopyPtrFromLram(
-                          PortAddr iop_base,
-                          ushort s_addr,
-                          uchar *d_buffer,
-                          int words
-)
+static void
+AscMemWordCopyPtrFromLram(PortAddr iop_base,
+                         ushort s_addr, uchar *d_buffer, int words)
 {
-    int i;
-    ushort word;
-
-    AscSetChipLramAddr(iop_base, s_addr);
-    for (i = 0; i < 2 * words; i += 2) {
-        word = inpw(iop_base + IOP_RAM_DATA);
-        d_buffer[i] = word & 0xff;
-        d_buffer[i + 1] = (word >> 8) & 0xff;
-    }
-    return;
+       int i;
+       ushort word;
+
+       AscSetChipLramAddr(iop_base, s_addr);
+       for (i = 0; i < 2 * words; i += 2) {
+               word = inpw(iop_base + IOP_RAM_DATA);
+               d_buffer[i] = word & 0xff;
+               d_buffer[i + 1] = (word >> 8) & 0xff;
+       }
+       return;
 }
 
-STATIC ASC_DCNT
-AscMemSumLramWord(
-                     PortAddr iop_base,
-                     ushort s_addr,
-                     int words
-)
+static ASC_DCNT AscMemSumLramWord(PortAddr iop_base, ushort s_addr, int words)
 {
-    ASC_DCNT         sum;
-    int              i;
+       ASC_DCNT sum;
+       int i;
 
-    sum = 0L;
-    for (i = 0; i < words; i++, s_addr += 2) {
-        sum += AscReadLramWord(iop_base, s_addr);
-    }
-    return (sum);
+       sum = 0L;
+       for (i = 0; i < words; i++, s_addr += 2) {
+               sum += AscReadLramWord(iop_base, s_addr);
+       }
+       return (sum);
 }
 
-STATIC void
-AscMemWordSetLram(
-                     PortAddr iop_base,
-                     ushort s_addr,
-                     ushort set_wval,
-                     int words
-)
+static void
+AscMemWordSetLram(PortAddr iop_base, ushort s_addr, ushort set_wval, int words)
 {
-    int             i;
+       int i;
 
-    AscSetChipLramAddr(iop_base, s_addr);
-    for (i = 0; i < words; i++) {
-        AscSetChipLramData(iop_base, set_wval);
-    }
-    return;
+       AscSetChipLramAddr(iop_base, s_addr);
+       for (i = 0; i < words; i++) {
+               AscSetChipLramData(iop_base, set_wval);
+       }
+       return;
 }
 
-
 /*
  * --- Adv Library Functions
  */
@@ -12961,1076 +11723,2112 @@ AscMemWordSetLram(
 /* a_mcode.h */
 
 /* Microcode buffer is kept after initialization for error recovery. */
-STATIC unsigned char _adv_asc3550_buf[] = {
-  0x00,  0x00,  0x00,  0xf2,  0x00,  0xf0,  0x00,  0x16,  0x18,  0xe4,  0x00,  0xfc,  0x01,  0x00,  0x48,  0xe4,
-  0xbe,  0x18,  0x18,  0x80,  0x03,  0xf6,  0x02,  0x00,  0x00,  0xfa,  0xff,  0xff,  0x28,  0x0e,  0x9e,  0xe7,
-  0xff,  0x00,  0x82,  0xe7,  0x00,  0xea,  0x00,  0xf6,  0x01,  0xe6,  0x09,  0xe7,  0x55,  0xf0,  0x01,  0xf6,
-  0x01,  0xfa,  0x08,  0x00,  0x03,  0x00,  0x04,  0x00,  0x18,  0xf4,  0x10,  0x00,  0x00,  0xec,  0x85,  0xf0,
-  0xbc,  0x00,  0xd5,  0xf0,  0x8e,  0x0c,  0x38,  0x54,  0x00,  0xe6,  0x1e,  0xf0,  0x86,  0xf0,  0xb4,  0x00,
-  0x98,  0x57,  0xd0,  0x01,  0x0c,  0x1c,  0x3e,  0x1c,  0x0c,  0x00,  0xbb,  0x00,  0xaa,  0x18,  0x02,  0x80,
-  0x32,  0xf0,  0x01,  0xfc,  0x88,  0x0c,  0xc6,  0x12,  0x02,  0x13,  0x18,  0x40,  0x00,  0x57,  0x01,  0xea,
-  0x3c,  0x00,  0x6c,  0x01,  0x6e,  0x01,  0x04,  0x12,  0x3e,  0x57,  0x00,  0x80,  0x03,  0xe6,  0xb6,  0x00,
-  0xc0,  0x00,  0x01,  0x01,  0x3e,  0x01,  0xda,  0x0f,  0x22,  0x10,  0x08,  0x12,  0x02,  0x4a,  0xb9,  0x54,
-  0x03,  0x58,  0x1b,  0x80,  0x30,  0xe4,  0x4b,  0xe4,  0x20,  0x00,  0x32,  0x00,  0x3e,  0x00,  0x80,  0x00,
-  0x24,  0x01,  0x3c,  0x01,  0x68,  0x01,  0x6a,  0x01,  0x70,  0x01,  0x72,  0x01,  0x74,  0x01,  0x76,  0x01,
-  0x78,  0x01,  0x62,  0x0a,  0x92,  0x0c,  0x2c,  0x10,  0x2e,  0x10,  0x06,  0x13,  0x4c,  0x1c,  0xbb,  0x55,
-  0x3c,  0x56,  0x04,  0x80,  0x4a,  0xe4,  0x02,  0xee,  0x5b,  0xf0,  0xb1,  0xf0,  0x03,  0xf7,  0x06,  0xf7,
-  0x03,  0xfc,  0x0f,  0x00,  0x40,  0x00,  0xbe,  0x00,  0x00,  0x01,  0xb0,  0x08,  0x30,  0x13,  0x64,  0x15,
-  0x32,  0x1c,  0x38,  0x1c,  0x4e,  0x1c,  0x10,  0x44,  0x02,  0x48,  0x00,  0x4c,  0x04,  0xea,  0x5d,  0xf0,
-  0x04,  0xf6,  0x02,  0xfc,  0x05,  0x00,  0x34,  0x00,  0x36,  0x00,  0x98,  0x00,  0xcc,  0x00,  0x20,  0x01,
-  0x4e,  0x01,  0x4e,  0x0b,  0x1e,  0x0e,  0x0c,  0x10,  0x0a,  0x12,  0x04,  0x13,  0x40,  0x13,  0x30,  0x1c,
-  0x00,  0x4e,  0xbd,  0x56,  0x06,  0x83,  0x00,  0xdc,  0x05,  0xf0,  0x09,  0xf0,  0x59,  0xf0,  0xa7,  0xf0,
-  0xb8,  0xf0,  0x0e,  0xf7,  0x06,  0x00,  0x19,  0x00,  0x33,  0x00,  0x9b,  0x00,  0xa4,  0x00,  0xb5,  0x00,
-  0xba,  0x00,  0xd0,  0x00,  0xe1,  0x00,  0xe7,  0x00,  0xde,  0x03,  0x56,  0x0a,  0x14,  0x0e,  0x02,  0x10,
-  0x04,  0x10,  0x0a,  0x10,  0x36,  0x10,  0x0a,  0x13,  0x12,  0x13,  0x52,  0x13,  0x10,  0x15,  0x14,  0x15,
-  0xac,  0x16,  0x20,  0x1c,  0x34,  0x1c,  0x36,  0x1c,  0x08,  0x44,  0x38,  0x44,  0x91,  0x44,  0x0a,  0x45,
-  0x48,  0x46,  0x01,  0x48,  0x68,  0x54,  0x83,  0x55,  0xb0,  0x57,  0x01,  0x58,  0x83,  0x59,  0x05,  0xe6,
-  0x0b,  0xf0,  0x0c,  0xf0,  0x5c,  0xf0,  0x4b,  0xf4,  0x04,  0xf8,  0x05,  0xf8,  0x02,  0xfa,  0x03,  0xfa,
-  0x04,  0xfc,  0x05,  0xfc,  0x07,  0x00,  0x0a,  0x00,  0x0d,  0x00,  0x1c,  0x00,  0x9e,  0x00,  0xa8,  0x00,
-  0xaa,  0x00,  0xb9,  0x00,  0xe0,  0x00,  0x22,  0x01,  0x26,  0x01,  0x79,  0x01,  0x7a,  0x01,  0xc0,  0x01,
-  0xc2,  0x01,  0x7c,  0x02,  0x5a,  0x03,  0xea,  0x04,  0xe8,  0x07,  0x68,  0x08,  0x69,  0x08,  0xba,  0x08,
-  0xe9,  0x09,  0x06,  0x0b,  0x3a,  0x0e,  0x00,  0x10,  0x1a,  0x10,  0xed,  0x10,  0xf1,  0x10,  0x06,  0x12,
-  0x0c,  0x13,  0x16,  0x13,  0x1e,  0x13,  0x82,  0x13,  0x42,  0x14,  0xd6,  0x14,  0x8a,  0x15,  0xc6,  0x17,
-  0xd2,  0x17,  0x6b,  0x18,  0x12,  0x1c,  0x46,  0x1c,  0x9c,  0x32,  0x00,  0x40,  0x0e,  0x47,  0x48,  0x47,
-  0x41,  0x48,  0x89,  0x48,  0x80,  0x4c,  0x00,  0x54,  0x44,  0x55,  0xe5,  0x55,  0x14,  0x56,  0x77,  0x57,
-  0xbf,  0x57,  0x40,  0x5c,  0x06,  0x80,  0x08,  0x90,  0x03,  0xa1,  0xfe,  0x9c,  0xf0,  0x29,  0x02,  0xfe,
-  0xb8,  0x0c,  0xff,  0x10,  0x00,  0x00,  0xd0,  0xfe,  0xcc,  0x18,  0x00,  0xcf,  0xfe,  0x80,  0x01,  0xff,
-  0x03,  0x00,  0x00,  0xfe,  0x93,  0x15,  0xfe,  0x0f,  0x05,  0xff,  0x38,  0x00,  0x00,  0xfe,  0x57,  0x24,
-  0x00,  0xfe,  0x48,  0x00,  0x4f,  0xff,  0x04,  0x00,  0x00,  0x10,  0xff,  0x09,  0x00,  0x00,  0xff,  0x08,
-  0x01,  0x01,  0xff,  0x08,  0xff,  0xff,  0xff,  0x27,  0x00,  0x00,  0xff,  0x10,  0xff,  0xff,  0xff,  0x0f,
-  0x00,  0x00,  0xfe,  0x78,  0x56,  0xfe,  0x34,  0x12,  0xff,  0x21,  0x00,  0x00,  0xfe,  0x04,  0xf7,  0xcf,
-  0x2a,  0x67,  0x0b,  0x01,  0xfe,  0xce,  0x0e,  0xfe,  0x04,  0xf7,  0xcf,  0x67,  0x0b,  0x3c,  0x2a,  0xfe,
-  0x3d,  0xf0,  0xfe,  0x02,  0x02,  0xfe,  0x20,  0xf0,  0x9c,  0xfe,  0x91,  0xf0,  0xfe,  0xf0,  0x01,  0xfe,
-  0x90,  0xf0,  0xfe,  0xf0,  0x01,  0xfe,  0x8f,  0xf0,  0x9c,  0x05,  0x51,  0x3b,  0x02,  0xfe,  0xd4,  0x0c,
-  0x01,  0xfe,  0x44,  0x0d,  0xfe,  0xdd,  0x12,  0xfe,  0xfc,  0x10,  0xfe,  0x28,  0x1c,  0x05,  0xfe,  0xa6,
-  0x00,  0xfe,  0xd3,  0x12,  0x47,  0x18,  0xfe,  0xa6,  0x00,  0xb5,  0xfe,  0x48,  0xf0,  0xfe,  0x86,  0x02,
-  0xfe,  0x49,  0xf0,  0xfe,  0xa0,  0x02,  0xfe,  0x4a,  0xf0,  0xfe,  0xbe,  0x02,  0xfe,  0x46,  0xf0,  0xfe,
-  0x50,  0x02,  0xfe,  0x47,  0xf0,  0xfe,  0x56,  0x02,  0xfe,  0x43,  0xf0,  0xfe,  0x44,  0x02,  0xfe,  0x44,
-  0xf0,  0xfe,  0x48,  0x02,  0xfe,  0x45,  0xf0,  0xfe,  0x4c,  0x02,  0x17,  0x0b,  0xa0,  0x17,  0x06,  0x18,
-  0x96,  0x02,  0x29,  0xfe,  0x00,  0x1c,  0xde,  0xfe,  0x02,  0x1c,  0xdd,  0xfe,  0x1e,  0x1c,  0xfe,  0xe9,
-  0x10,  0x01,  0xfe,  0x20,  0x17,  0xfe,  0xe7,  0x10,  0xfe,  0x06,  0xfc,  0xc7,  0x0a,  0x6b,  0x01,  0x9e,
-  0x02,  0x29,  0x14,  0x4d,  0x37,  0x97,  0x01,  0xfe,  0x64,  0x0f,  0x0a,  0x6b,  0x01,  0x82,  0xfe,  0xbd,
-  0x10,  0x0a,  0x6b,  0x01,  0x82,  0xfe,  0xad,  0x10,  0xfe,  0x16,  0x1c,  0xfe,  0x58,  0x1c,  0x17,  0x06,
-  0x18,  0x96,  0x2a,  0x25,  0x29,  0xfe,  0x3d,  0xf0,  0xfe,  0x02,  0x02,  0x21,  0xfe,  0x94,  0x02,  0xfe,
-  0x5a,  0x1c,  0xea,  0xfe,  0x14,  0x1c,  0x14,  0xfe,  0x30,  0x00,  0x37,  0x97,  0x01,  0xfe,  0x54,  0x0f,
-  0x17,  0x06,  0x18,  0x96,  0x02,  0xd0,  0x1e,  0x20,  0x07,  0x10,  0x34,  0xfe,  0x69,  0x10,  0x17,  0x06,
-  0x18,  0x96,  0xfe,  0x04,  0xec,  0x20,  0x46,  0x3d,  0x12,  0x20,  0xfe,  0x05,  0xf6,  0xc7,  0x01,  0xfe,
-  0x52,  0x16,  0x09,  0x4a,  0x4c,  0x35,  0x11,  0x2d,  0x3c,  0x8a,  0x01,  0xe6,  0x02,  0x29,  0x0a,  0x40,
-  0x01,  0x0e,  0x07,  0x00,  0x5d,  0x01,  0x6f,  0xfe,  0x18,  0x10,  0xfe,  0x41,  0x58,  0x0a,  0x99,  0x01,
-  0x0e,  0xfe,  0xc8,  0x54,  0x64,  0xfe,  0x0c,  0x03,  0x01,  0xe6,  0x02,  0x29,  0x2a,  0x46,  0xfe,  0x02,
-  0xe8,  0x27,  0xf8,  0xfe,  0x9e,  0x43,  0xf7,  0xfe,  0x27,  0xf0,  0xfe,  0xdc,  0x01,  0xfe,  0x07,  0x4b,
-  0xfe,  0x20,  0xf0,  0x9c,  0xfe,  0x40,  0x1c,  0x25,  0xd2,  0xfe,  0x26,  0xf0,  0xfe,  0x56,  0x03,  0xfe,
-  0xa0,  0xf0,  0xfe,  0x44,  0x03,  0xfe,  0x11,  0xf0,  0x9c,  0xfe,  0xef,  0x10,  0xfe,  0x9f,  0xf0,  0xfe,
-  0x64,  0x03,  0xeb,  0x0f,  0xfe,  0x11,  0x00,  0x02,  0x5a,  0x2a,  0xfe,  0x48,  0x1c,  0xeb,  0x09,  0x04,
-  0x1d,  0xfe,  0x18,  0x13,  0x23,  0x1e,  0x98,  0xac,  0x12,  0x98,  0x0a,  0x40,  0x01,  0x0e,  0xac,  0x75,
-  0x01,  0xfe,  0xbc,  0x15,  0x11,  0xca,  0x25,  0xd2,  0xfe,  0x01,  0xf0,  0xd2,  0xfe,  0x82,  0xf0,  0xfe,
-  0x92,  0x03,  0xec,  0x11,  0xfe,  0xe4,  0x00,  0x65,  0xfe,  0xa4,  0x03,  0x25,  0x32,  0x1f,  0xfe,  0xb4,
-  0x03,  0x01,  0x43,  0xfe,  0x06,  0xf0,  0xfe,  0xc4,  0x03,  0x8d,  0x81,  0xfe,  0x0a,  0xf0,  0xfe,  0x7a,
-  0x06,  0x02,  0x22,  0x05,  0x6b,  0x28,  0x16,  0xfe,  0xf6,  0x04,  0x14,  0x2c,  0x01,  0x33,  0x8f,  0xfe,
-  0x66,  0x02,  0x02,  0xd1,  0xeb,  0x2a,  0x67,  0x1a,  0xfe,  0x67,  0x1b,  0xf8,  0xf7,  0xfe,  0x48,  0x1c,
-  0x70,  0x01,  0x6e,  0x87,  0x0a,  0x40,  0x01,  0x0e,  0x07,  0x00,  0x16,  0xd3,  0x0a,  0xca,  0x01,  0x0e,
-  0x74,  0x60,  0x59,  0x76,  0x27,  0x05,  0x6b,  0x28,  0xfe,  0x10,  0x12,  0x14,  0x2c,  0x01,  0x33,  0x8f,
-  0xfe,  0x66,  0x02,  0x02,  0xd1,  0xbc,  0x7d,  0xbd,  0x7f,  0x25,  0x22,  0x65,  0xfe,  0x3c,  0x04,  0x1f,
-  0xfe,  0x38,  0x04,  0x68,  0xfe,  0xa0,  0x00,  0xfe,  0x9b,  0x57,  0xfe,  0x4e,  0x12,  0x2b,  0xff,  0x02,
-  0x00,  0x10,  0x01,  0x08,  0x1f,  0xfe,  0xe0,  0x04,  0x2b,  0x01,  0x08,  0x1f,  0x22,  0x30,  0x2e,  0xd5,
-  0xfe,  0x4c,  0x44,  0xfe,  0x4c,  0x12,  0x60,  0xfe,  0x44,  0x48,  0x13,  0x2c,  0xfe,  0x4c,  0x54,  0x64,
-  0xd3,  0x46,  0x76,  0x27,  0xfa,  0xef,  0xfe,  0x62,  0x13,  0x09,  0x04,  0x1d,  0xfe,  0x2a,  0x13,  0x2f,
-  0x07,  0x7e,  0xa5,  0xfe,  0x20,  0x10,  0x13,  0x2c,  0xfe,  0x4c,  0x54,  0x64,  0xd3,  0xfa,  0xef,  0x86,
-  0x09,  0x04,  0x1d,  0xfe,  0x08,  0x13,  0x2f,  0x07,  0x7e,  0x6e,  0x09,  0x04,  0x1d,  0xfe,  0x1c,  0x12,
-  0x14,  0x92,  0x09,  0x04,  0x06,  0x3b,  0x14,  0xc4,  0x01,  0x33,  0x8f,  0xfe,  0x70,  0x0c,  0x02,  0x22,
-  0x2b,  0x11,  0xfe,  0xe6,  0x00,  0xfe,  0x1c,  0x90,  0xf9,  0x03,  0x14,  0x92,  0x01,  0x33,  0x02,  0x29,
-  0xfe,  0x42,  0x5b,  0x67,  0x1a,  0xfe,  0x46,  0x59,  0xf8,  0xf7,  0xfe,  0x87,  0x80,  0xfe,  0x31,  0xe4,
-  0x4f,  0x09,  0x04,  0x0b,  0xfe,  0x78,  0x13,  0xfe,  0x20,  0x80,  0x07,  0x1a,  0xfe,  0x70,  0x12,  0x49,
-  0x04,  0x06,  0xfe,  0x60,  0x13,  0x05,  0xfe,  0xa2,  0x00,  0x28,  0x16,  0xfe,  0x80,  0x05,  0xfe,  0x31,
-  0xe4,  0x6a,  0x49,  0x04,  0x0b,  0xfe,  0x4a,  0x13,  0x05,  0xfe,  0xa0,  0x00,  0x28,  0xfe,  0x42,  0x12,
-  0x5e,  0x01,  0x08,  0x25,  0x32,  0xf1,  0x01,  0x08,  0x26,  0xfe,  0x98,  0x05,  0x11,  0xfe,  0xe3,  0x00,
-  0x23,  0x49,  0xfe,  0x4a,  0xf0,  0xfe,  0x6a,  0x05,  0xfe,  0x49,  0xf0,  0xfe,  0x64,  0x05,  0x83,  0x24,
-  0xfe,  0x21,  0x00,  0xa1,  0x24,  0xfe,  0x22,  0x00,  0xa0,  0x24,  0x4c,  0xfe,  0x09,  0x48,  0x01,  0x08,
-  0x26,  0xfe,  0x98,  0x05,  0xfe,  0xe2,  0x08,  0x49,  0x04,  0xc5,  0x3b,  0x01,  0x86,  0x24,  0x06,  0x12,
-  0xcc,  0x37,  0xfe,  0x27,  0x01,  0x09,  0x04,  0x1d,  0xfe,  0x22,  0x12,  0x47,  0x01,  0xa7,  0x14,  0x92,
-  0x09,  0x04,  0x06,  0x3b,  0x14,  0xc4,  0x01,  0x33,  0x8f,  0xfe,  0x70,  0x0c,  0x02,  0x22,  0x05,  0xfe,
-  0x9c,  0x00,  0x28,  0xfe,  0x3e,  0x12,  0x05,  0x50,  0x28,  0xfe,  0x36,  0x13,  0x47,  0x01,  0xa7,  0x26,
-  0xfe,  0x08,  0x06,  0x0a,  0x06,  0x49,  0x04,  0x19,  0xfe,  0x02,  0x12,  0x5f,  0x01,  0xfe,  0xaa,  0x14,
-  0x1f,  0xfe,  0xfe,  0x05,  0x11,  0x9a,  0x01,  0x43,  0x11,  0xfe,  0xe5,  0x00,  0x05,  0x50,  0xb4,  0x0c,
-  0x50,  0x05,  0xc6,  0x28,  0xfe,  0x62,  0x12,  0x05,  0x3f,  0x28,  0xfe,  0x5a,  0x13,  0x01,  0xfe,  0x14,
-  0x18,  0x01,  0xfe,  0x66,  0x18,  0xfe,  0x43,  0x48,  0xb7,  0x19,  0x13,  0x6c,  0xff,  0x02,  0x00,  0x57,
-  0x48,  0x8b,  0x1c,  0x3d,  0x85,  0xb7,  0x69,  0x47,  0x01,  0xa7,  0x26,  0xfe,  0x72,  0x06,  0x49,  0x04,
-  0x1b,  0xdf,  0x89,  0x0a,  0x4d,  0x01,  0xfe,  0xd8,  0x14,  0x1f,  0xfe,  0x68,  0x06,  0x11,  0x9a,  0x01,
-  0x43,  0x11,  0xfe,  0xe5,  0x00,  0x05,  0x3f,  0xb4,  0x0c,  0x3f,  0x17,  0x06,  0x01,  0xa7,  0xec,  0x72,
-  0x70,  0x01,  0x6e,  0x87,  0x11,  0xfe,  0xe2,  0x00,  0x01,  0x08,  0x25,  0x32,  0xfe,  0x0a,  0xf0,  0xfe,
-  0xa6,  0x06,  0x8c,  0xfe,  0x5c,  0x07,  0xfe,  0x06,  0xf0,  0xfe,  0x64,  0x07,  0x8d,  0x81,  0x02,  0x22,
-  0x09,  0x04,  0x0b,  0xfe,  0x2e,  0x12,  0x15,  0x1a,  0x01,  0x08,  0x15,  0x00,  0x01,  0x08,  0x15,  0x00,
-  0x01,  0x08,  0x15,  0x00,  0x01,  0x08,  0xfe,  0x99,  0xa4,  0x01,  0x08,  0x15,  0x00,  0x02,  0xfe,  0x32,
-  0x08,  0x61,  0x04,  0x1b,  0xfe,  0x38,  0x12,  0x09,  0x04,  0x1b,  0x6e,  0x15,  0xfe,  0x1b,  0x00,  0x01,
-  0x08,  0x15,  0x00,  0x01,  0x08,  0x15,  0x00,  0x01,  0x08,  0x15,  0x00,  0x01,  0x08,  0x15,  0x06,  0x01,
-  0x08,  0x15,  0x00,  0x02,  0xd9,  0x66,  0x4c,  0xfe,  0x3a,  0x55,  0x5f,  0xfe,  0x9a,  0x81,  0x4b,  0x1d,
-  0xba,  0xfe,  0x32,  0x07,  0x0a,  0x1d,  0xfe,  0x09,  0x6f,  0xaf,  0xfe,  0xca,  0x45,  0xfe,  0x32,  0x12,
-  0x62,  0x2c,  0x85,  0x66,  0x7b,  0x01,  0x08,  0x25,  0x32,  0xfe,  0x0a,  0xf0,  0xfe,  0x32,  0x07,  0x8d,
-  0x81,  0x8c,  0xfe,  0x5c,  0x07,  0x02,  0x22,  0x01,  0x43,  0x02,  0xfe,  0x8a,  0x06,  0x15,  0x19,  0x02,
-  0xfe,  0x8a,  0x06,  0xfe,  0x9c,  0xf7,  0xd4,  0xfe,  0x2c,  0x90,  0xfe,  0xae,  0x90,  0x77,  0xfe,  0xca,
-  0x07,  0x0c,  0x54,  0x18,  0x55,  0x09,  0x4a,  0x6a,  0x35,  0x1e,  0x20,  0x07,  0x10,  0xfe,  0x0e,  0x12,
-  0x74,  0xfe,  0x80,  0x80,  0x37,  0x20,  0x63,  0x27,  0xfe,  0x06,  0x10,  0xfe,  0x83,  0xe7,  0xc4,  0xa1,
-  0xfe,  0x03,  0x40,  0x09,  0x4a,  0x4f,  0x35,  0x01,  0xa8,  0xad,  0xfe,  0x1f,  0x40,  0x12,  0x58,  0x01,
-  0xa5,  0xfe,  0x08,  0x50,  0xfe,  0x8a,  0x50,  0xfe,  0x44,  0x51,  0xfe,  0xc6,  0x51,  0x83,  0xfb,  0xfe,
-  0x8a,  0x90,  0x0c,  0x52,  0x18,  0x53,  0xfe,  0x0c,  0x90,  0xfe,  0x8e,  0x90,  0xfe,  0x40,  0x50,  0xfe,
-  0xc2,  0x50,  0x0c,  0x39,  0x18,  0x3a,  0xfe,  0x4a,  0x10,  0x09,  0x04,  0x6a,  0xfe,  0x2a,  0x12,  0xfe,
-  0x2c,  0x90,  0xfe,  0xae,  0x90,  0x0c,  0x54,  0x18,  0x55,  0x09,  0x04,  0x4f,  0x85,  0x01,  0xa8,  0xfe,
-  0x1f,  0x80,  0x12,  0x58,  0xfe,  0x44,  0x90,  0xfe,  0xc6,  0x90,  0x0c,  0x56,  0x18,  0x57,  0xfb,  0xfe,
-  0x8a,  0x90,  0x0c,  0x52,  0x18,  0x53,  0xfe,  0x40,  0x90,  0xfe,  0xc2,  0x90,  0x0c,  0x39,  0x18,  0x3a,
-  0x0c,  0x38,  0x18,  0x4e,  0x09,  0x4a,  0x19,  0x35,  0x2a,  0x13,  0xfe,  0x4e,  0x11,  0x65,  0xfe,  0x48,
-  0x08,  0xfe,  0x9e,  0xf0,  0xfe,  0x5c,  0x08,  0xb1,  0x16,  0x32,  0x2a,  0x73,  0xdd,  0xb8,  0xfe,  0x80,
-  0x08,  0xb9,  0xfe,  0x9e,  0x08,  0x8c,  0xfe,  0x74,  0x08,  0xfe,  0x06,  0xf0,  0xfe,  0x7a,  0x08,  0x8d,
-  0x81,  0x02,  0x22,  0x01,  0x43,  0xfe,  0xc9,  0x10,  0x15,  0x19,  0xfe,  0xc9,  0x10,  0x61,  0x04,  0x06,
-  0xfe,  0x10,  0x12,  0x61,  0x04,  0x0b,  0x45,  0x09,  0x04,  0x0b,  0xfe,  0x68,  0x12,  0xfe,  0x2e,  0x1c,
-  0x02,  0xfe,  0x24,  0x0a,  0x61,  0x04,  0x06,  0x45,  0x61,  0x04,  0x0b,  0xfe,  0x52,  0x12,  0xfe,  0x2c,
-  0x1c,  0xfe,  0xaa,  0xf0,  0xfe,  0x1e,  0x09,  0xfe,  0xac,  0xf0,  0xfe,  0xbe,  0x08,  0xfe,  0x8a,  0x10,
-  0xaa,  0xfe,  0xf3,  0x10,  0xfe,  0xad,  0xf0,  0xfe,  0xca,  0x08,  0x02,  0xfe,  0x24,  0x0a,  0xab,  0xfe,
-  0xe7,  0x10,  0xfe,  0x2b,  0xf0,  0x9d,  0xe9,  0x1c,  0xfe,  0x00,  0xfe,  0xfe,  0x1c,  0x12,  0xb5,  0xfe,
-  0xd2,  0xf0,  0x9d,  0xfe,  0x76,  0x18,  0x1c,  0x1a,  0x16,  0x9d,  0x05,  0xcb,  0x1c,  0x06,  0x16,  0x9d,
-  0xb8,  0x6d,  0xb9,  0x6d,  0xaa,  0xab,  0xfe,  0xb1,  0x10,  0x70,  0x5e,  0x2b,  0x14,  0x92,  0x01,  0x33,
-  0x0f,  0xfe,  0x35,  0x00,  0xfe,  0x01,  0xf0,  0x5a,  0x0f,  0x7c,  0x02,  0x5a,  0xfe,  0x74,  0x18,  0x1c,
-  0xfe,  0x00,  0xf8,  0x16,  0x6d,  0x67,  0x1b,  0x01,  0xfe,  0x44,  0x0d,  0x3b,  0x01,  0xe6,  0x1e,  0x27,
-  0x74,  0x67,  0x1a,  0x02,  0x6d,  0x09,  0x04,  0x0b,  0x21,  0xfe,  0x06,  0x0a,  0x09,  0x04,  0x6a,  0xfe,
-  0x82,  0x12,  0x09,  0x04,  0x19,  0xfe,  0x66,  0x13,  0x1e,  0x58,  0xac,  0xfc,  0xfe,  0x83,  0x80,  0xfe,
-  0xc8,  0x44,  0xfe,  0x2e,  0x13,  0xfe,  0x04,  0x91,  0xfe,  0x86,  0x91,  0x63,  0x27,  0xfe,  0x40,  0x59,
-  0xfe,  0xc1,  0x59,  0x77,  0xd7,  0x05,  0x54,  0x31,  0x55,  0x0c,  0x7b,  0x18,  0x7c,  0xbe,  0x54,  0xbf,
-  0x55,  0x01,  0xa8,  0xad,  0x63,  0x27,  0x12,  0x58,  0xc0,  0x38,  0xc1,  0x4e,  0x79,  0x56,  0x68,  0x57,
-  0xf4,  0xf5,  0xfe,  0x04,  0xfa,  0x38,  0xfe,  0x05,  0xfa,  0x4e,  0x01,  0xa5,  0xa2,  0x23,  0x0c,  0x7b,
-  0x0c,  0x7c,  0x79,  0x56,  0x68,  0x57,  0xfe,  0x12,  0x10,  0x09,  0x04,  0x19,  0x16,  0xd7,  0x79,  0x39,
-  0x68,  0x3a,  0x09,  0x04,  0xfe,  0xf7,  0x00,  0x35,  0x05,  0x52,  0x31,  0x53,  0xfe,  0x10,  0x58,  0xfe,
-  0x91,  0x58,  0xfe,  0x14,  0x59,  0xfe,  0x95,  0x59,  0x02,  0x6d,  0x09,  0x04,  0x19,  0x16,  0xd7,  0x09,
-  0x04,  0xfe,  0xf7,  0x00,  0x35,  0xfe,  0x3a,  0x55,  0xfe,  0x19,  0x81,  0x5f,  0xfe,  0x10,  0x90,  0xfe,
-  0x92,  0x90,  0xfe,  0xd7,  0x10,  0x2f,  0x07,  0x9b,  0x16,  0xfe,  0xc6,  0x08,  0x11,  0x9b,  0x09,  0x04,
-  0x0b,  0xfe,  0x14,  0x13,  0x05,  0x39,  0x31,  0x3a,  0x77,  0xfe,  0xc6,  0x08,  0xfe,  0x0c,  0x58,  0xfe,
-  0x8d,  0x58,  0x02,  0x6d,  0x23,  0x47,  0xfe,  0x19,  0x80,  0xde,  0x09,  0x04,  0x0b,  0xfe,  0x1a,  0x12,
-  0xfe,  0x6c,  0x19,  0xfe,  0x19,  0x41,  0xe9,  0xb5,  0xfe,  0xd1,  0xf0,  0xd9,  0x14,  0x7a,  0x01,  0x33,
-  0x0f,  0xfe,  0x44,  0x00,  0xfe,  0x8e,  0x10,  0xfe,  0x6c,  0x19,  0xbe,  0x39,  0xfe,  0xed,  0x19,  0xbf,
-  0x3a,  0xfe,  0x0c,  0x51,  0xfe,  0x8e,  0x51,  0xe9,  0x1c,  0xfe,  0x00,  0xff,  0x34,  0xfe,  0x74,  0x10,
-  0xb5,  0xfe,  0xd2,  0xf0,  0xfe,  0xb2,  0x0a,  0xfe,  0x76,  0x18,  0x1c,  0x1a,  0x84,  0x05,  0xcb,  0x1c,
-  0x06,  0xfe,  0x08,  0x13,  0x0f,  0xfe,  0x16,  0x00,  0x02,  0x5a,  0xfe,  0xd1,  0xf0,  0xfe,  0xc4,  0x0a,
-  0x14,  0x7a,  0x01,  0x33,  0x0f,  0xfe,  0x17,  0x00,  0xfe,  0x42,  0x10,  0xfe,  0xce,  0xf0,  0xfe,  0xca,
-  0x0a,  0xfe,  0x3c,  0x10,  0xfe,  0xcd,  0xf0,  0xfe,  0xd6,  0x0a,  0x0f,  0xfe,  0x22,  0x00,  0x02,  0x5a,
-  0xfe,  0xcb,  0xf0,  0xfe,  0xe2,  0x0a,  0x0f,  0xfe,  0x24,  0x00,  0x02,  0x5a,  0xfe,  0xd0,  0xf0,  0xfe,
-  0xec,  0x0a,  0x0f,  0x93,  0xdc,  0xfe,  0xcf,  0xf0,  0xfe,  0xf6,  0x0a,  0x0f,  0x4c,  0xfe,  0x10,  0x10,
-  0xfe,  0xcc,  0xf0,  0xd9,  0x61,  0x04,  0x19,  0x3b,  0x0f,  0xfe,  0x12,  0x00,  0x2a,  0x13,  0xfe,  0x4e,
-  0x11,  0x65,  0xfe,  0x0c,  0x0b,  0xfe,  0x9e,  0xf0,  0xfe,  0x20,  0x0b,  0xb1,  0x16,  0x32,  0x2a,  0x73,
-  0xdd,  0xb8,  0x22,  0xb9,  0x22,  0x2a,  0xec,  0x65,  0xfe,  0x2c,  0x0b,  0x25,  0x32,  0x8c,  0xfe,  0x48,
-  0x0b,  0x8d,  0x81,  0xb8,  0xd4,  0xb9,  0xd4,  0x02,  0x22,  0x01,  0x43,  0xfe,  0xdb,  0x10,  0x11,  0xfe,
-  0xe8,  0x00,  0xaa,  0xab,  0x70,  0xbc,  0x7d,  0xbd,  0x7f,  0xfe,  0x89,  0xf0,  0x22,  0x30,  0x2e,  0xd8,
-  0xbc,  0x7d,  0xbd,  0x7f,  0x01,  0x08,  0x1f,  0x22,  0x30,  0x2e,  0xd6,  0xb1,  0x45,  0x0f,  0xfe,  0x42,
-  0x00,  0x02,  0x5a,  0x78,  0x06,  0xfe,  0x81,  0x49,  0x16,  0xfe,  0x38,  0x0c,  0x09,  0x04,  0x0b,  0xfe,
-  0x44,  0x13,  0x0f,  0x00,  0x4b,  0x0b,  0xfe,  0x54,  0x12,  0x4b,  0xfe,  0x28,  0x00,  0x21,  0xfe,  0xa6,
-  0x0c,  0x0a,  0x40,  0x01,  0x0e,  0x07,  0x00,  0x5d,  0x3e,  0xfe,  0x28,  0x00,  0xfe,  0xe2,  0x10,  0x01,
-  0xe7,  0x01,  0xe8,  0x0a,  0x99,  0x01,  0xfe,  0x32,  0x0e,  0x59,  0x11,  0x2d,  0x01,  0x6f,  0x02,  0x29,
-  0x0f,  0xfe,  0x44,  0x00,  0x4b,  0x0b,  0xdf,  0x3e,  0x0b,  0xfe,  0xb4,  0x10,  0x01,  0x86,  0x3e,  0x0b,
-  0xfe,  0xaa,  0x10,  0x01,  0x86,  0xfe,  0x19,  0x82,  0xfe,  0x34,  0x46,  0xa3,  0x3e,  0x0b,  0x0f,  0xfe,
-  0x43,  0x00,  0xfe,  0x96,  0x10,  0x09,  0x4a,  0x0b,  0x35,  0x01,  0xe7,  0x01,  0xe8,  0x59,  0x11,  0x2d,
-  0x01,  0x6f,  0x67,  0x0b,  0x59,  0x3c,  0x8a,  0x02,  0xfe,  0x2a,  0x03,  0x09,  0x04,  0x0b,  0x84,  0x3e,
-  0x0b,  0x0f,  0x00,  0xfe,  0x5c,  0x10,  0x61,  0x04,  0x1b,  0xfe,  0x58,  0x12,  0x09,  0x04,  0x1b,  0xfe,
-  0x50,  0x13,  0xfe,  0x1c,  0x1c,  0xfe,  0x9d,  0xf0,  0xfe,  0x5c,  0x0c,  0xfe,  0x1c,  0x1c,  0xfe,  0x9d,
-  0xf0,  0xfe,  0x62,  0x0c,  0x09,  0x4a,  0x1b,  0x35,  0xfe,  0xa9,  0x10,  0x0f,  0xfe,  0x15,  0x00,  0xfe,
-  0x04,  0xe6,  0x0b,  0x5f,  0x5c,  0x0f,  0xfe,  0x13,  0x00,  0xfe,  0x10,  0x10,  0x0f,  0xfe,  0x47,  0x00,
-  0xa1,  0x0f,  0xfe,  0x41,  0x00,  0xa0,  0x0f,  0xfe,  0x24,  0x00,  0x87,  0xaa,  0xab,  0x70,  0x05,  0x6b,
-  0x28,  0x21,  0xd1,  0x5f,  0xfe,  0x04,  0xe6,  0x1b,  0xfe,  0x9d,  0x41,  0xfe,  0x1c,  0x42,  0x59,  0x01,
-  0xda,  0x02,  0x29,  0xea,  0x14,  0x0b,  0x37,  0x95,  0xa9,  0x14,  0xfe,  0x31,  0x00,  0x37,  0x97,  0x01,
-  0xfe,  0x54,  0x0f,  0x02,  0xd0,  0x3c,  0xfe,  0x06,  0xec,  0xc9,  0xee,  0x3e,  0x1d,  0xfe,  0xce,  0x45,
-  0x34,  0x3c,  0xfe,  0x06,  0xea,  0xc9,  0xfe,  0x47,  0x4b,  0x89,  0xfe,  0x75,  0x57,  0x05,  0x51,  0xfe,
-  0x98,  0x56,  0xfe,  0x38,  0x12,  0x0a,  0x42,  0x01,  0x0e,  0xfe,  0x44,  0x48,  0x46,  0x09,  0x04,  0x1d,
-  0xfe,  0x1a,  0x13,  0x0a,  0x40,  0x01,  0x0e,  0x47,  0xfe,  0x41,  0x58,  0x0a,  0x99,  0x01,  0x0e,  0xfe,
-  0x49,  0x54,  0x8e,  0xfe,  0x2a,  0x0d,  0x02,  0xfe,  0x2a,  0x03,  0x0a,  0x51,  0xfe,  0xee,  0x14,  0xee,
-  0x3e,  0x1d,  0xfe,  0xce,  0x45,  0x34,  0x3c,  0xfe,  0xce,  0x47,  0xfe,  0xad,  0x13,  0x02,  0x29,  0x1e,
-  0x20,  0x07,  0x10,  0xfe,  0x9e,  0x12,  0x23,  0x12,  0x4d,  0x12,  0x94,  0x12,  0xce,  0x1e,  0x2d,  0x47,
-  0x37,  0x2d,  0xb1,  0xe0,  0xfe,  0xbc,  0xf0,  0xfe,  0xec,  0x0d,  0x13,  0x06,  0x12,  0x4d,  0x01,  0xfe,
-  0xe2,  0x15,  0x05,  0xfe,  0x38,  0x01,  0x31,  0xfe,  0x3a,  0x01,  0x77,  0xfe,  0xf0,  0x0d,  0xfe,  0x02,
-  0xec,  0xce,  0x62,  0x00,  0x5d,  0xfe,  0x04,  0xec,  0x20,  0x46,  0xfe,  0x05,  0xf6,  0xfe,  0x34,  0x01,
-  0x01,  0xfe,  0x52,  0x16,  0xfb,  0xfe,  0x48,  0xf4,  0x0d,  0xfe,  0x18,  0x13,  0xaf,  0xfe,  0x02,  0xea,
-  0xce,  0x62,  0x7a,  0xfe,  0xc5,  0x13,  0x14,  0x1b,  0x37,  0x95,  0xa9,  0x5c,  0x05,  0xfe,  0x38,  0x01,
-  0x1c,  0xfe,  0xf0,  0xff,  0x0c,  0xfe,  0x60,  0x01,  0x05,  0xfe,  0x3a,  0x01,  0x0c,  0xfe,  0x62,  0x01,
-  0x3d,  0x12,  0x20,  0x24,  0x06,  0x12,  0x2d,  0x11,  0x2d,  0x8a,  0x13,  0x06,  0x03,  0x23,  0x03,  0x1e,
-  0x4d,  0xfe,  0xf7,  0x12,  0x1e,  0x94,  0xac,  0x12,  0x94,  0x07,  0x7a,  0xfe,  0x71,  0x13,  0xfe,  0x24,
-  0x1c,  0x14,  0x1a,  0x37,  0x95,  0xa9,  0xfe,  0xd9,  0x10,  0xb6,  0xfe,  0x03,  0xdc,  0xfe,  0x73,  0x57,
-  0xfe,  0x80,  0x5d,  0x03,  0xb6,  0xfe,  0x03,  0xdc,  0xfe,  0x5b,  0x57,  0xfe,  0x80,  0x5d,  0x03,  0xfe,
-  0x03,  0x57,  0xb6,  0x23,  0xfe,  0x00,  0xcc,  0x03,  0xfe,  0x03,  0x57,  0xb6,  0x75,  0x03,  0x09,  0x04,
-  0x4c,  0xfe,  0x22,  0x13,  0xfe,  0x1c,  0x80,  0x07,  0x06,  0xfe,  0x1a,  0x13,  0xfe,  0x1e,  0x80,  0xe1,
-  0xfe,  0x1d,  0x80,  0xa4,  0xfe,  0x0c,  0x90,  0xfe,  0x0e,  0x13,  0xfe,  0x0e,  0x90,  0xa3,  0xfe,  0x3c,
-  0x90,  0xfe,  0x30,  0xf4,  0x0b,  0xfe,  0x3c,  0x50,  0xa0,  0x01,  0xfe,  0x82,  0x16,  0x2f,  0x07,  0x2d,
-  0xe0,  0x01,  0xfe,  0xbc,  0x15,  0x09,  0x04,  0x1d,  0x45,  0x01,  0xe7,  0x01,  0xe8,  0x11,  0xfe,  0xe9,
-  0x00,  0x09,  0x04,  0x4c,  0xfe,  0x2c,  0x13,  0x01,  0xfe,  0x14,  0x16,  0xfe,  0x1e,  0x1c,  0xfe,  0x14,
-  0x90,  0xfe,  0x96,  0x90,  0x0c,  0xfe,  0x64,  0x01,  0x18,  0xfe,  0x66,  0x01,  0x09,  0x04,  0x4f,  0xfe,
-  0x12,  0x12,  0xfe,  0x03,  0x80,  0x74,  0xfe,  0x01,  0xec,  0x20,  0xfe,  0x80,  0x40,  0x12,  0x20,  0x63,
-  0x27,  0x11,  0xc8,  0x59,  0x1e,  0x20,  0xed,  0x76,  0x20,  0x03,  0xfe,  0x08,  0x1c,  0x05,  0xfe,  0xac,
-  0x00,  0xfe,  0x06,  0x58,  0x05,  0xfe,  0xae,  0x00,  0xfe,  0x07,  0x58,  0x05,  0xfe,  0xb0,  0x00,  0xfe,
-  0x08,  0x58,  0x05,  0xfe,  0xb2,  0x00,  0xfe,  0x09,  0x58,  0xfe,  0x0a,  0x1c,  0x24,  0x69,  0x12,  0xc9,
-  0x23,  0x0c,  0x50,  0x0c,  0x3f,  0x13,  0x40,  0x48,  0x5f,  0x17,  0x1d,  0xfe,  0x90,  0x4d,  0xfe,  0x91,
-  0x54,  0x21,  0xfe,  0x08,  0x0f,  0x3e,  0x10,  0x13,  0x42,  0x48,  0x17,  0x4c,  0xfe,  0x90,  0x4d,  0xfe,
-  0x91,  0x54,  0x21,  0xfe,  0x1e,  0x0f,  0x24,  0x10,  0x12,  0x20,  0x78,  0x2c,  0x46,  0x1e,  0x20,  0xed,
-  0x76,  0x20,  0x11,  0xc8,  0xf6,  0xfe,  0xd6,  0xf0,  0xfe,  0x32,  0x0f,  0xea,  0x70,  0xfe,  0x14,  0x1c,
-  0xfe,  0x10,  0x1c,  0xfe,  0x18,  0x1c,  0x03,  0x3c,  0xfe,  0x0c,  0x14,  0xee,  0xfe,  0x07,  0xe6,  0x1d,
-  0xfe,  0xce,  0x47,  0xfe,  0xf5,  0x13,  0x03,  0x01,  0x86,  0x78,  0x2c,  0x46,  0xfa,  0xef,  0xfe,  0x42,
-  0x13,  0x2f,  0x07,  0x2d,  0xfe,  0x34,  0x13,  0x0a,  0x42,  0x01,  0x0e,  0xb0,  0xfe,  0x36,  0x12,  0xf0,
-  0xfe,  0x45,  0x48,  0x01,  0xe3,  0xfe,  0x00,  0xcc,  0xb0,  0xfe,  0xf3,  0x13,  0x3d,  0x75,  0x07,  0x10,
-  0xa3,  0x0a,  0x80,  0x01,  0x0e,  0xfe,  0x80,  0x5c,  0x01,  0x6f,  0xfe,  0x0e,  0x10,  0x07,  0x7e,  0x45,
-  0xf6,  0xfe,  0xd6,  0xf0,  0xfe,  0x6c,  0x0f,  0x03,  0xfe,  0x44,  0x58,  0x74,  0xfe,  0x01,  0xec,  0x97,
-  0xfe,  0x9e,  0x40,  0xfe,  0x9d,  0xe7,  0x00,  0xfe,  0x9c,  0xe7,  0x1b,  0x76,  0x27,  0x01,  0xda,  0xfe,
-  0xdd,  0x10,  0x2a,  0xbc,  0x7d,  0xbd,  0x7f,  0x30,  0x2e,  0xd5,  0x07,  0x1b,  0xfe,  0x48,  0x12,  0x07,
-  0x0b,  0xfe,  0x56,  0x12,  0x07,  0x1a,  0xfe,  0x30,  0x12,  0x07,  0xc2,  0x16,  0xfe,  0x3e,  0x11,  0x07,
-  0xfe,  0x23,  0x00,  0x16,  0xfe,  0x4a,  0x11,  0x07,  0x06,  0x16,  0xfe,  0xa8,  0x11,  0x07,  0x19,  0xfe,
-  0x12,  0x12,  0x07,  0x00,  0x16,  0x22,  0x14,  0xc2,  0x01,  0x33,  0x9f,  0x2b,  0x01,  0x08,  0x8c,  0x43,
-  0x03,  0x2b,  0xfe,  0x62,  0x08,  0x0a,  0xca,  0x01,  0xfe,  0x32,  0x0e,  0x11,  0x7e,  0x02,  0x29,  0x2b,
-  0x2f,  0x07,  0x9b,  0xfe,  0xd9,  0x13,  0x79,  0x39,  0x68,  0x3a,  0x77,  0xfe,  0xfc,  0x10,  0x09,  0x04,
-  0x6a,  0xfe,  0x72,  0x12,  0xc0,  0x38,  0xc1,  0x4e,  0xf4,  0xf5,  0x8e,  0xfe,  0xc6,  0x10,  0x1e,  0x58,
-  0xfe,  0x26,  0x13,  0x05,  0x7b,  0x31,  0x7c,  0x77,  0xfe,  0x82,  0x0c,  0x0c,  0x54,  0x18,  0x55,  0x23,
-  0x0c,  0x7b,  0x0c,  0x7c,  0x01,  0xa8,  0x24,  0x69,  0x73,  0x12,  0x58,  0x01,  0xa5,  0xc0,  0x38,  0xc1,
-  0x4e,  0xfe,  0x04,  0x55,  0xfe,  0xa5,  0x55,  0xfe,  0x04,  0xfa,  0x38,  0xfe,  0x05,  0xfa,  0x4e,  0xfe,
-  0x91,  0x10,  0x05,  0x56,  0x31,  0x57,  0xfe,  0x40,  0x56,  0xfe,  0xe1,  0x56,  0x0c,  0x56,  0x18,  0x57,
-  0x83,  0xc0,  0x38,  0xc1,  0x4e,  0xf4,  0xf5,  0x05,  0x52,  0x31,  0x53,  0xfe,  0x00,  0x56,  0xfe,  0xa1,
-  0x56,  0x0c,  0x52,  0x18,  0x53,  0x09,  0x04,  0x6a,  0xfe,  0x1e,  0x12,  0x1e,  0x58,  0xfe,  0x1f,  0x40,
-  0x05,  0x54,  0x31,  0x55,  0xfe,  0x2c,  0x50,  0xfe,  0xae,  0x50,  0x05,  0x56,  0x31,  0x57,  0xfe,  0x44,
-  0x50,  0xfe,  0xc6,  0x50,  0x05,  0x52,  0x31,  0x53,  0xfe,  0x08,  0x50,  0xfe,  0x8a,  0x50,  0x05,  0x39,
-  0x31,  0x3a,  0xfe,  0x40,  0x50,  0xfe,  0xc2,  0x50,  0x02,  0x5c,  0x24,  0x06,  0x12,  0xcd,  0x02,  0x5b,
-  0x2b,  0x01,  0x08,  0x1f,  0x44,  0x30,  0x2e,  0xd5,  0x07,  0x06,  0x21,  0x44,  0x2f,  0x07,  0x9b,  0x21,
-  0x5b,  0x01,  0x6e,  0x1c,  0x3d,  0x16,  0x44,  0x09,  0x04,  0x0b,  0xe2,  0x79,  0x39,  0x68,  0x3a,  0xfe,
-  0x0a,  0x55,  0x34,  0xfe,  0x8b,  0x55,  0xbe,  0x39,  0xbf,  0x3a,  0xfe,  0x0c,  0x51,  0xfe,  0x8e,  0x51,
-  0x02,  0x5b,  0xfe,  0x19,  0x81,  0xaf,  0xfe,  0x19,  0x41,  0x02,  0x5b,  0x2b,  0x01,  0x08,  0x25,  0x32,
-  0x1f,  0xa2,  0x30,  0x2e,  0xd8,  0x4b,  0x1a,  0xfe,  0xa6,  0x12,  0x4b,  0x0b,  0x3b,  0x02,  0x44,  0x01,
-  0x08,  0x25,  0x32,  0x1f,  0xa2,  0x30,  0x2e,  0xd6,  0x07,  0x1a,  0x21,  0x44,  0x01,  0x08,  0x1f,  0xa2,
-  0x30,  0x2e,  0xfe,  0xe8,  0x09,  0xfe,  0xc2,  0x49,  0x60,  0x05,  0xfe,  0x9c,  0x00,  0x28,  0x84,  0x49,
-  0x04,  0x19,  0x34,  0x9f,  0xfe,  0xbb,  0x45,  0x4b,  0x00,  0x45,  0x3e,  0x06,  0x78,  0x3d,  0xfe,  0xda,
-  0x14,  0x01,  0x6e,  0x87,  0xfe,  0x4b,  0x45,  0xe2,  0x2f,  0x07,  0x9a,  0xe1,  0x05,  0xc6,  0x28,  0x84,
-  0x05,  0x3f,  0x28,  0x34,  0x5e,  0x02,  0x5b,  0xfe,  0xc0,  0x5d,  0xfe,  0xf8,  0x14,  0xfe,  0x03,  0x17,
-  0x05,  0x50,  0xb4,  0x0c,  0x50,  0x5e,  0x2b,  0x01,  0x08,  0x26,  0x5c,  0x01,  0xfe,  0xaa,  0x14,  0x02,
-  0x5c,  0x01,  0x08,  0x25,  0x32,  0x1f,  0x44,  0x30,  0x2e,  0xd6,  0x07,  0x06,  0x21,  0x44,  0x01,  0xfe,
-  0x8e,  0x13,  0xfe,  0x42,  0x58,  0xfe,  0x82,  0x14,  0xfe,  0xa4,  0x14,  0x87,  0xfe,  0x4a,  0xf4,  0x0b,
-  0x16,  0x44,  0xfe,  0x4a,  0xf4,  0x06,  0xfe,  0x0c,  0x12,  0x2f,  0x07,  0x9a,  0x85,  0x02,  0x5b,  0x05,
-  0x3f,  0xb4,  0x0c,  0x3f,  0x5e,  0x2b,  0x01,  0x08,  0x26,  0x5c,  0x01,  0xfe,  0xd8,  0x14,  0x02,  0x5c,
-  0x13,  0x06,  0x65,  0xfe,  0xca,  0x12,  0x26,  0xfe,  0xe0,  0x12,  0x72,  0xf1,  0x01,  0x08,  0x23,  0x72,
-  0x03,  0x8f,  0xfe,  0xdc,  0x12,  0x25,  0xfe,  0xdc,  0x12,  0x1f,  0xfe,  0xca,  0x12,  0x5e,  0x2b,  0x01,
-  0x08,  0xfe,  0xd5,  0x10,  0x13,  0x6c,  0xff,  0x02,  0x00,  0x57,  0x48,  0x8b,  0x1c,  0xfe,  0xff,  0x7f,
-  0xfe,  0x30,  0x56,  0xfe,  0x00,  0x5c,  0x03,  0x13,  0x6c,  0xff,  0x02,  0x00,  0x57,  0x48,  0x8b,  0x1c,
-  0x3d,  0xfe,  0x30,  0x56,  0xfe,  0x00,  0x5c,  0x03,  0x13,  0x6c,  0xff,  0x02,  0x00,  0x57,  0x48,  0x8b,
-  0x03,  0x13,  0x6c,  0xff,  0x02,  0x00,  0x57,  0x48,  0x8b,  0xfe,  0x0b,  0x58,  0x03,  0x0a,  0x50,  0x01,
-  0x82,  0x0a,  0x3f,  0x01,  0x82,  0x03,  0xfc,  0x1c,  0x10,  0xff,  0x03,  0x00,  0x54,  0xfe,  0x00,  0xf4,
-  0x19,  0x48,  0xfe,  0x00,  0x7d,  0xfe,  0x01,  0x7d,  0xfe,  0x02,  0x7d,  0xfe,  0x03,  0x7c,  0x63,  0x27,
-  0x0c,  0x52,  0x18,  0x53,  0xbe,  0x56,  0xbf,  0x57,  0x03,  0xfe,  0x62,  0x08,  0xfe,  0x82,  0x4a,  0xfe,
-  0xe1,  0x1a,  0xfe,  0x83,  0x5a,  0x74,  0x03,  0x01,  0xfe,  0x14,  0x18,  0xfe,  0x42,  0x48,  0x5f,  0x60,
-  0x89,  0x01,  0x08,  0x1f,  0xfe,  0xa2,  0x14,  0x30,  0x2e,  0xd8,  0x01,  0x08,  0x1f,  0xfe,  0xa2,  0x14,
-  0x30,  0x2e,  0xfe,  0xe8,  0x0a,  0xfe,  0xc1,  0x59,  0x05,  0xc6,  0x28,  0xfe,  0xcc,  0x12,  0x49,  0x04,
-  0x1b,  0xfe,  0xc4,  0x13,  0x23,  0x62,  0x1b,  0xe2,  0x4b,  0xc3,  0x64,  0xfe,  0xe8,  0x13,  0x3b,  0x13,
-  0x06,  0x17,  0xc3,  0x78,  0xdb,  0xfe,  0x78,  0x10,  0xff,  0x02,  0x83,  0x55,  0xa1,  0xff,  0x02,  0x83,
-  0x55,  0x62,  0x1a,  0xa4,  0xbb,  0xfe,  0x30,  0x00,  0x8e,  0xe4,  0x17,  0x2c,  0x13,  0x06,  0xfe,  0x56,
-  0x10,  0x62,  0x0b,  0xe1,  0xbb,  0xfe,  0x64,  0x00,  0x8e,  0xe4,  0x0a,  0xfe,  0x64,  0x00,  0x17,  0x93,
-  0x13,  0x06,  0xfe,  0x28,  0x10,  0x62,  0x06,  0xfe,  0x60,  0x13,  0xbb,  0xfe,  0xc8,  0x00,  0x8e,  0xe4,
-  0x0a,  0xfe,  0xc8,  0x00,  0x17,  0x4d,  0x13,  0x06,  0x83,  0xbb,  0xfe,  0x90,  0x01,  0xba,  0xfe,  0x4e,
-  0x14,  0x89,  0xfe,  0x12,  0x10,  0xfe,  0x43,  0xf4,  0x94,  0xfe,  0x56,  0xf0,  0xfe,  0x60,  0x14,  0xfe,
-  0x04,  0xf4,  0x6c,  0xfe,  0x43,  0xf4,  0x93,  0xfe,  0xf3,  0x10,  0xf9,  0x01,  0xfe,  0x22,  0x13,  0x1c,
-  0x3d,  0xfe,  0x10,  0x13,  0xfe,  0x00,  0x17,  0xfe,  0x4d,  0xe4,  0x69,  0xba,  0xfe,  0x9c,  0x14,  0xb7,
-  0x69,  0xfe,  0x1c,  0x10,  0xfe,  0x00,  0x17,  0xfe,  0x4d,  0xe4,  0x19,  0xba,  0xfe,  0x9c,  0x14,  0xb7,
-  0x19,  0x83,  0x60,  0x23,  0xfe,  0x4d,  0xf4,  0x00,  0xdf,  0x89,  0x13,  0x06,  0xfe,  0xb4,  0x56,  0xfe,
-  0xc3,  0x58,  0x03,  0x60,  0x13,  0x0b,  0x03,  0x15,  0x06,  0x01,  0x08,  0x26,  0xe5,  0x15,  0x0b,  0x01,
-  0x08,  0x26,  0xe5,  0x15,  0x1a,  0x01,  0x08,  0x26,  0xe5,  0x72,  0xfe,  0x89,  0x49,  0x01,  0x08,  0x03,
-  0x15,  0x06,  0x01,  0x08,  0x26,  0xa6,  0x15,  0x1a,  0x01,  0x08,  0x26,  0xa6,  0x15,  0x06,  0x01,  0x08,
-  0x26,  0xa6,  0xfe,  0x89,  0x49,  0x01,  0x08,  0x26,  0xa6,  0x72,  0xfe,  0x89,  0x4a,  0x01,  0x08,  0x03,
-  0x60,  0x03,  0x1e,  0xcc,  0x07,  0x06,  0xfe,  0x44,  0x13,  0xad,  0x12,  0xcc,  0xfe,  0x49,  0xf4,  0x00,
-  0x3b,  0x72,  0x9f,  0x5e,  0xfe,  0x01,  0xec,  0xfe,  0x27,  0x01,  0xf1,  0x01,  0x08,  0x2f,  0x07,  0xfe,
-  0xe3,  0x00,  0xfe,  0x20,  0x13,  0x1f,  0xfe,  0x5a,  0x15,  0x23,  0x12,  0xcd,  0x01,  0x43,  0x1e,  0xcd,
-  0x07,  0x06,  0x45,  0x09,  0x4a,  0x06,  0x35,  0x03,  0x0a,  0x42,  0x01,  0x0e,  0xed,  0x88,  0x07,  0x10,
-  0xa4,  0x0a,  0x80,  0x01,  0x0e,  0x88,  0x0a,  0x51,  0x01,  0x9e,  0x03,  0x0a,  0x80,  0x01,  0x0e,  0x88,
-  0xfe,  0x80,  0xe7,  0x10,  0x07,  0x10,  0x84,  0xfe,  0x45,  0x58,  0x01,  0xe3,  0x88,  0x03,  0x0a,  0x42,
-  0x01,  0x0e,  0x88,  0x0a,  0x51,  0x01,  0x9e,  0x03,  0x0a,  0x42,  0x01,  0x0e,  0xfe,  0x80,  0x80,  0xf2,
-  0xfe,  0x49,  0xe4,  0x10,  0xa4,  0x0a,  0x80,  0x01,  0x0e,  0xf2,  0x0a,  0x51,  0x01,  0x82,  0x03,  0x17,
-  0x10,  0x71,  0x66,  0xfe,  0x60,  0x01,  0xfe,  0x18,  0xdf,  0xfe,  0x19,  0xde,  0xfe,  0x24,  0x1c,  0xfe,
-  0x1d,  0xf7,  0x1d,  0x90,  0xfe,  0xf6,  0x15,  0x01,  0xfe,  0xfc,  0x16,  0xe0,  0x91,  0x1d,  0x66,  0xfe,
-  0x2c,  0x01,  0xfe,  0x2f,  0x19,  0x03,  0xae,  0x21,  0xfe,  0xe6,  0x15,  0xfe,  0xda,  0x10,  0x17,  0x10,
-  0x71,  0x05,  0xfe,  0x64,  0x01,  0xfe,  0x00,  0xf4,  0x19,  0xfe,  0x18,  0x58,  0x05,  0xfe,  0x66,  0x01,
-  0xfe,  0x19,  0x58,  0x91,  0x19,  0xfe,  0x3c,  0x90,  0xfe,  0x30,  0xf4,  0x06,  0xfe,  0x3c,  0x50,  0x66,
-  0xfe,  0x38,  0x00,  0xfe,  0x0f,  0x79,  0xfe,  0x1c,  0xf7,  0x19,  0x90,  0xfe,  0x40,  0x16,  0xfe,  0xb6,
-  0x14,  0x34,  0x03,  0xae,  0x21,  0xfe,  0x18,  0x16,  0xfe,  0x9c,  0x10,  0x17,  0x10,  0x71,  0xfe,  0x83,
-  0x5a,  0xfe,  0x18,  0xdf,  0xfe,  0x19,  0xde,  0xfe,  0x1d,  0xf7,  0x38,  0x90,  0xfe,  0x62,  0x16,  0xfe,
-  0x94,  0x14,  0xfe,  0x10,  0x13,  0x91,  0x38,  0x66,  0x1b,  0xfe,  0xaf,  0x19,  0xfe,  0x98,  0xe7,  0x00,
-  0x03,  0xae,  0x21,  0xfe,  0x56,  0x16,  0xfe,  0x6c,  0x10,  0x17,  0x10,  0x71,  0xfe,  0x30,  0xbc,  0xfe,
-  0xb2,  0xbc,  0x91,  0xc5,  0x66,  0x1b,  0xfe,  0x0f,  0x79,  0xfe,  0x1c,  0xf7,  0xc5,  0x90,  0xfe,  0x9a,
-  0x16,  0xfe,  0x5c,  0x14,  0x34,  0x03,  0xae,  0x21,  0xfe,  0x86,  0x16,  0xfe,  0x42,  0x10,  0xfe,  0x02,
-  0xf6,  0x10,  0x71,  0xfe,  0x18,  0xfe,  0x54,  0xfe,  0x19,  0xfe,  0x55,  0xfc,  0xfe,  0x1d,  0xf7,  0x4f,
-  0x90,  0xfe,  0xc0,  0x16,  0xfe,  0x36,  0x14,  0xfe,  0x1c,  0x13,  0x91,  0x4f,  0x47,  0xfe,  0x83,  0x58,
-  0xfe,  0xaf,  0x19,  0xfe,  0x80,  0xe7,  0x10,  0xfe,  0x81,  0xe7,  0x10,  0x11,  0xfe,  0xdd,  0x00,  0x63,
-  0x27,  0x03,  0x63,  0x27,  0xfe,  0x12,  0x45,  0x21,  0xfe,  0xb0,  0x16,  0x14,  0x06,  0x37,  0x95,  0xa9,
-  0x02,  0x29,  0xfe,  0x39,  0xf0,  0xfe,  0x04,  0x17,  0x23,  0x03,  0xfe,  0x7e,  0x18,  0x1c,  0x1a,  0x5d,
-  0x13,  0x0d,  0x03,  0x71,  0x05,  0xcb,  0x1c,  0x06,  0xfe,  0xef,  0x12,  0xfe,  0xe1,  0x10,  0x78,  0x2c,
-  0x46,  0x2f,  0x07,  0x2d,  0xfe,  0x3c,  0x13,  0xfe,  0x82,  0x14,  0xfe,  0x42,  0x13,  0x3c,  0x8a,  0x0a,
-  0x42,  0x01,  0x0e,  0xb0,  0xfe,  0x3e,  0x12,  0xf0,  0xfe,  0x45,  0x48,  0x01,  0xe3,  0xfe,  0x00,  0xcc,
-  0xb0,  0xfe,  0xf3,  0x13,  0x3d,  0x75,  0x07,  0x10,  0xa3,  0x0a,  0x80,  0x01,  0x0e,  0xf2,  0x01,  0x6f,
-  0xfe,  0x16,  0x10,  0x07,  0x7e,  0x85,  0xfe,  0x40,  0x14,  0xfe,  0x24,  0x12,  0xf6,  0xfe,  0xd6,  0xf0,
-  0xfe,  0x24,  0x17,  0x17,  0x0b,  0x03,  0xfe,  0x9c,  0xe7,  0x0b,  0x0f,  0xfe,  0x15,  0x00,  0x59,  0x76,
-  0x27,  0x01,  0xda,  0x17,  0x06,  0x03,  0x3c,  0x8a,  0x09,  0x4a,  0x1d,  0x35,  0x11,  0x2d,  0x01,  0x6f,
-  0x17,  0x06,  0x03,  0xfe,  0x38,  0x90,  0xfe,  0xba,  0x90,  0x79,  0xc7,  0x68,  0xc8,  0xfe,  0x48,  0x55,
-  0x34,  0xfe,  0xc9,  0x55,  0x03,  0x1e,  0x98,  0x73,  0x12,  0x98,  0x03,  0x0a,  0x99,  0x01,  0x0e,  0xf0,
-  0x0a,  0x40,  0x01,  0x0e,  0xfe,  0x49,  0x44,  0x16,  0xfe,  0xf0,  0x17,  0x73,  0x75,  0x03,  0x0a,  0x42,
-  0x01,  0x0e,  0x07,  0x10,  0x45,  0x0a,  0x51,  0x01,  0x9e,  0x0a,  0x40,  0x01,  0x0e,  0x73,  0x75,  0x03,
-  0xfe,  0x4e,  0xe4,  0x1a,  0x64,  0xfe,  0x24,  0x18,  0x05,  0xfe,  0x90,  0x00,  0xfe,  0x3a,  0x45,  0x5b,
-  0xfe,  0x4e,  0xe4,  0xc2,  0x64,  0xfe,  0x36,  0x18,  0x05,  0xfe,  0x92,  0x00,  0xfe,  0x02,  0xe6,  0x1b,
-  0xdc,  0xfe,  0x4e,  0xe4,  0xfe,  0x0b,  0x00,  0x64,  0xfe,  0x48,  0x18,  0x05,  0xfe,  0x94,  0x00,  0xfe,
-  0x02,  0xe6,  0x19,  0xfe,  0x08,  0x10,  0x05,  0xfe,  0x96,  0x00,  0xfe,  0x02,  0xe6,  0x2c,  0xfe,  0x4e,
-  0x45,  0xfe,  0x0c,  0x12,  0xaf,  0xff,  0x04,  0x68,  0x54,  0xde,  0x1c,  0x69,  0x03,  0x07,  0x7a,  0xfe,
-  0x5a,  0xf0,  0xfe,  0x74,  0x18,  0x24,  0xfe,  0x09,  0x00,  0xfe,  0x34,  0x10,  0x07,  0x1b,  0xfe,  0x5a,
-  0xf0,  0xfe,  0x82,  0x18,  0x24,  0xc3,  0xfe,  0x26,  0x10,  0x07,  0x1a,  0x5d,  0x24,  0x2c,  0xdc,  0x07,
-  0x0b,  0x5d,  0x24,  0x93,  0xfe,  0x0e,  0x10,  0x07,  0x06,  0x5d,  0x24,  0x4d,  0x9f,  0xad,  0x03,  0x14,
-  0xfe,  0x09,  0x00,  0x01,  0x33,  0xfe,  0x04,  0xfe,  0x7d,  0x05,  0x7f,  0xf9,  0x03,  0x25,  0xfe,  0xca,
-  0x18,  0xfe,  0x14,  0xf0,  0x08,  0x65,  0xfe,  0xc6,  0x18,  0x03,  0xff,  0x1a,  0x00,  0x00,
+static unsigned char _adv_asc3550_buf[] = {
+       0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0x16, 0x18, 0xe4, 0x00, 0xfc,
+       0x01, 0x00, 0x48, 0xe4,
+       0xbe, 0x18, 0x18, 0x80, 0x03, 0xf6, 0x02, 0x00, 0x00, 0xfa, 0xff, 0xff,
+       0x28, 0x0e, 0x9e, 0xe7,
+       0xff, 0x00, 0x82, 0xe7, 0x00, 0xea, 0x00, 0xf6, 0x01, 0xe6, 0x09, 0xe7,
+       0x55, 0xf0, 0x01, 0xf6,
+       0x01, 0xfa, 0x08, 0x00, 0x03, 0x00, 0x04, 0x00, 0x18, 0xf4, 0x10, 0x00,
+       0x00, 0xec, 0x85, 0xf0,
+       0xbc, 0x00, 0xd5, 0xf0, 0x8e, 0x0c, 0x38, 0x54, 0x00, 0xe6, 0x1e, 0xf0,
+       0x86, 0xf0, 0xb4, 0x00,
+       0x98, 0x57, 0xd0, 0x01, 0x0c, 0x1c, 0x3e, 0x1c, 0x0c, 0x00, 0xbb, 0x00,
+       0xaa, 0x18, 0x02, 0x80,
+       0x32, 0xf0, 0x01, 0xfc, 0x88, 0x0c, 0xc6, 0x12, 0x02, 0x13, 0x18, 0x40,
+       0x00, 0x57, 0x01, 0xea,
+       0x3c, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12, 0x3e, 0x57, 0x00, 0x80,
+       0x03, 0xe6, 0xb6, 0x00,
+       0xc0, 0x00, 0x01, 0x01, 0x3e, 0x01, 0xda, 0x0f, 0x22, 0x10, 0x08, 0x12,
+       0x02, 0x4a, 0xb9, 0x54,
+       0x03, 0x58, 0x1b, 0x80, 0x30, 0xe4, 0x4b, 0xe4, 0x20, 0x00, 0x32, 0x00,
+       0x3e, 0x00, 0x80, 0x00,
+       0x24, 0x01, 0x3c, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x70, 0x01, 0x72, 0x01,
+       0x74, 0x01, 0x76, 0x01,
+       0x78, 0x01, 0x62, 0x0a, 0x92, 0x0c, 0x2c, 0x10, 0x2e, 0x10, 0x06, 0x13,
+       0x4c, 0x1c, 0xbb, 0x55,
+       0x3c, 0x56, 0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0, 0xb1, 0xf0,
+       0x03, 0xf7, 0x06, 0xf7,
+       0x03, 0xfc, 0x0f, 0x00, 0x40, 0x00, 0xbe, 0x00, 0x00, 0x01, 0xb0, 0x08,
+       0x30, 0x13, 0x64, 0x15,
+       0x32, 0x1c, 0x38, 0x1c, 0x4e, 0x1c, 0x10, 0x44, 0x02, 0x48, 0x00, 0x4c,
+       0x04, 0xea, 0x5d, 0xf0,
+       0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x34, 0x00, 0x36, 0x00, 0x98, 0x00,
+       0xcc, 0x00, 0x20, 0x01,
+       0x4e, 0x01, 0x4e, 0x0b, 0x1e, 0x0e, 0x0c, 0x10, 0x0a, 0x12, 0x04, 0x13,
+       0x40, 0x13, 0x30, 0x1c,
+       0x00, 0x4e, 0xbd, 0x56, 0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0,
+       0x59, 0xf0, 0xa7, 0xf0,
+       0xb8, 0xf0, 0x0e, 0xf7, 0x06, 0x00, 0x19, 0x00, 0x33, 0x00, 0x9b, 0x00,
+       0xa4, 0x00, 0xb5, 0x00,
+       0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00, 0xe7, 0x00, 0xde, 0x03, 0x56, 0x0a,
+       0x14, 0x0e, 0x02, 0x10,
+       0x04, 0x10, 0x0a, 0x10, 0x36, 0x10, 0x0a, 0x13, 0x12, 0x13, 0x52, 0x13,
+       0x10, 0x15, 0x14, 0x15,
+       0xac, 0x16, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c, 0x08, 0x44, 0x38, 0x44,
+       0x91, 0x44, 0x0a, 0x45,
+       0x48, 0x46, 0x01, 0x48, 0x68, 0x54, 0x83, 0x55, 0xb0, 0x57, 0x01, 0x58,
+       0x83, 0x59, 0x05, 0xe6,
+       0x0b, 0xf0, 0x0c, 0xf0, 0x5c, 0xf0, 0x4b, 0xf4, 0x04, 0xf8, 0x05, 0xf8,
+       0x02, 0xfa, 0x03, 0xfa,
+       0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x1c, 0x00,
+       0x9e, 0x00, 0xa8, 0x00,
+       0xaa, 0x00, 0xb9, 0x00, 0xe0, 0x00, 0x22, 0x01, 0x26, 0x01, 0x79, 0x01,
+       0x7a, 0x01, 0xc0, 0x01,
+       0xc2, 0x01, 0x7c, 0x02, 0x5a, 0x03, 0xea, 0x04, 0xe8, 0x07, 0x68, 0x08,
+       0x69, 0x08, 0xba, 0x08,
+       0xe9, 0x09, 0x06, 0x0b, 0x3a, 0x0e, 0x00, 0x10, 0x1a, 0x10, 0xed, 0x10,
+       0xf1, 0x10, 0x06, 0x12,
+       0x0c, 0x13, 0x16, 0x13, 0x1e, 0x13, 0x82, 0x13, 0x42, 0x14, 0xd6, 0x14,
+       0x8a, 0x15, 0xc6, 0x17,
+       0xd2, 0x17, 0x6b, 0x18, 0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40,
+       0x0e, 0x47, 0x48, 0x47,
+       0x41, 0x48, 0x89, 0x48, 0x80, 0x4c, 0x00, 0x54, 0x44, 0x55, 0xe5, 0x55,
+       0x14, 0x56, 0x77, 0x57,
+       0xbf, 0x57, 0x40, 0x5c, 0x06, 0x80, 0x08, 0x90, 0x03, 0xa1, 0xfe, 0x9c,
+       0xf0, 0x29, 0x02, 0xfe,
+       0xb8, 0x0c, 0xff, 0x10, 0x00, 0x00, 0xd0, 0xfe, 0xcc, 0x18, 0x00, 0xcf,
+       0xfe, 0x80, 0x01, 0xff,
+       0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
+       0x00, 0xfe, 0x57, 0x24,
+       0x00, 0xfe, 0x48, 0x00, 0x4f, 0xff, 0x04, 0x00, 0x00, 0x10, 0xff, 0x09,
+       0x00, 0x00, 0xff, 0x08,
+       0x01, 0x01, 0xff, 0x08, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10,
+       0xff, 0xff, 0xff, 0x0f,
+       0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
+       0xfe, 0x04, 0xf7, 0xcf,
+       0x2a, 0x67, 0x0b, 0x01, 0xfe, 0xce, 0x0e, 0xfe, 0x04, 0xf7, 0xcf, 0x67,
+       0x0b, 0x3c, 0x2a, 0xfe,
+       0x3d, 0xf0, 0xfe, 0x02, 0x02, 0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x91, 0xf0,
+       0xfe, 0xf0, 0x01, 0xfe,
+       0x90, 0xf0, 0xfe, 0xf0, 0x01, 0xfe, 0x8f, 0xf0, 0x9c, 0x05, 0x51, 0x3b,
+       0x02, 0xfe, 0xd4, 0x0c,
+       0x01, 0xfe, 0x44, 0x0d, 0xfe, 0xdd, 0x12, 0xfe, 0xfc, 0x10, 0xfe, 0x28,
+       0x1c, 0x05, 0xfe, 0xa6,
+       0x00, 0xfe, 0xd3, 0x12, 0x47, 0x18, 0xfe, 0xa6, 0x00, 0xb5, 0xfe, 0x48,
+       0xf0, 0xfe, 0x86, 0x02,
+       0xfe, 0x49, 0xf0, 0xfe, 0xa0, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xbe, 0x02,
+       0xfe, 0x46, 0xf0, 0xfe,
+       0x50, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x56, 0x02, 0xfe, 0x43, 0xf0, 0xfe,
+       0x44, 0x02, 0xfe, 0x44,
+       0xf0, 0xfe, 0x48, 0x02, 0xfe, 0x45, 0xf0, 0xfe, 0x4c, 0x02, 0x17, 0x0b,
+       0xa0, 0x17, 0x06, 0x18,
+       0x96, 0x02, 0x29, 0xfe, 0x00, 0x1c, 0xde, 0xfe, 0x02, 0x1c, 0xdd, 0xfe,
+       0x1e, 0x1c, 0xfe, 0xe9,
+       0x10, 0x01, 0xfe, 0x20, 0x17, 0xfe, 0xe7, 0x10, 0xfe, 0x06, 0xfc, 0xc7,
+       0x0a, 0x6b, 0x01, 0x9e,
+       0x02, 0x29, 0x14, 0x4d, 0x37, 0x97, 0x01, 0xfe, 0x64, 0x0f, 0x0a, 0x6b,
+       0x01, 0x82, 0xfe, 0xbd,
+       0x10, 0x0a, 0x6b, 0x01, 0x82, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
+       0x58, 0x1c, 0x17, 0x06,
+       0x18, 0x96, 0x2a, 0x25, 0x29, 0xfe, 0x3d, 0xf0, 0xfe, 0x02, 0x02, 0x21,
+       0xfe, 0x94, 0x02, 0xfe,
+       0x5a, 0x1c, 0xea, 0xfe, 0x14, 0x1c, 0x14, 0xfe, 0x30, 0x00, 0x37, 0x97,
+       0x01, 0xfe, 0x54, 0x0f,
+       0x17, 0x06, 0x18, 0x96, 0x02, 0xd0, 0x1e, 0x20, 0x07, 0x10, 0x34, 0xfe,
+       0x69, 0x10, 0x17, 0x06,
+       0x18, 0x96, 0xfe, 0x04, 0xec, 0x20, 0x46, 0x3d, 0x12, 0x20, 0xfe, 0x05,
+       0xf6, 0xc7, 0x01, 0xfe,
+       0x52, 0x16, 0x09, 0x4a, 0x4c, 0x35, 0x11, 0x2d, 0x3c, 0x8a, 0x01, 0xe6,
+       0x02, 0x29, 0x0a, 0x40,
+       0x01, 0x0e, 0x07, 0x00, 0x5d, 0x01, 0x6f, 0xfe, 0x18, 0x10, 0xfe, 0x41,
+       0x58, 0x0a, 0x99, 0x01,
+       0x0e, 0xfe, 0xc8, 0x54, 0x64, 0xfe, 0x0c, 0x03, 0x01, 0xe6, 0x02, 0x29,
+       0x2a, 0x46, 0xfe, 0x02,
+       0xe8, 0x27, 0xf8, 0xfe, 0x9e, 0x43, 0xf7, 0xfe, 0x27, 0xf0, 0xfe, 0xdc,
+       0x01, 0xfe, 0x07, 0x4b,
+       0xfe, 0x20, 0xf0, 0x9c, 0xfe, 0x40, 0x1c, 0x25, 0xd2, 0xfe, 0x26, 0xf0,
+       0xfe, 0x56, 0x03, 0xfe,
+       0xa0, 0xf0, 0xfe, 0x44, 0x03, 0xfe, 0x11, 0xf0, 0x9c, 0xfe, 0xef, 0x10,
+       0xfe, 0x9f, 0xf0, 0xfe,
+       0x64, 0x03, 0xeb, 0x0f, 0xfe, 0x11, 0x00, 0x02, 0x5a, 0x2a, 0xfe, 0x48,
+       0x1c, 0xeb, 0x09, 0x04,
+       0x1d, 0xfe, 0x18, 0x13, 0x23, 0x1e, 0x98, 0xac, 0x12, 0x98, 0x0a, 0x40,
+       0x01, 0x0e, 0xac, 0x75,
+       0x01, 0xfe, 0xbc, 0x15, 0x11, 0xca, 0x25, 0xd2, 0xfe, 0x01, 0xf0, 0xd2,
+       0xfe, 0x82, 0xf0, 0xfe,
+       0x92, 0x03, 0xec, 0x11, 0xfe, 0xe4, 0x00, 0x65, 0xfe, 0xa4, 0x03, 0x25,
+       0x32, 0x1f, 0xfe, 0xb4,
+       0x03, 0x01, 0x43, 0xfe, 0x06, 0xf0, 0xfe, 0xc4, 0x03, 0x8d, 0x81, 0xfe,
+       0x0a, 0xf0, 0xfe, 0x7a,
+       0x06, 0x02, 0x22, 0x05, 0x6b, 0x28, 0x16, 0xfe, 0xf6, 0x04, 0x14, 0x2c,
+       0x01, 0x33, 0x8f, 0xfe,
+       0x66, 0x02, 0x02, 0xd1, 0xeb, 0x2a, 0x67, 0x1a, 0xfe, 0x67, 0x1b, 0xf8,
+       0xf7, 0xfe, 0x48, 0x1c,
+       0x70, 0x01, 0x6e, 0x87, 0x0a, 0x40, 0x01, 0x0e, 0x07, 0x00, 0x16, 0xd3,
+       0x0a, 0xca, 0x01, 0x0e,
+       0x74, 0x60, 0x59, 0x76, 0x27, 0x05, 0x6b, 0x28, 0xfe, 0x10, 0x12, 0x14,
+       0x2c, 0x01, 0x33, 0x8f,
+       0xfe, 0x66, 0x02, 0x02, 0xd1, 0xbc, 0x7d, 0xbd, 0x7f, 0x25, 0x22, 0x65,
+       0xfe, 0x3c, 0x04, 0x1f,
+       0xfe, 0x38, 0x04, 0x68, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e,
+       0x12, 0x2b, 0xff, 0x02,
+       0x00, 0x10, 0x01, 0x08, 0x1f, 0xfe, 0xe0, 0x04, 0x2b, 0x01, 0x08, 0x1f,
+       0x22, 0x30, 0x2e, 0xd5,
+       0xfe, 0x4c, 0x44, 0xfe, 0x4c, 0x12, 0x60, 0xfe, 0x44, 0x48, 0x13, 0x2c,
+       0xfe, 0x4c, 0x54, 0x64,
+       0xd3, 0x46, 0x76, 0x27, 0xfa, 0xef, 0xfe, 0x62, 0x13, 0x09, 0x04, 0x1d,
+       0xfe, 0x2a, 0x13, 0x2f,
+       0x07, 0x7e, 0xa5, 0xfe, 0x20, 0x10, 0x13, 0x2c, 0xfe, 0x4c, 0x54, 0x64,
+       0xd3, 0xfa, 0xef, 0x86,
+       0x09, 0x04, 0x1d, 0xfe, 0x08, 0x13, 0x2f, 0x07, 0x7e, 0x6e, 0x09, 0x04,
+       0x1d, 0xfe, 0x1c, 0x12,
+       0x14, 0x92, 0x09, 0x04, 0x06, 0x3b, 0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe,
+       0x70, 0x0c, 0x02, 0x22,
+       0x2b, 0x11, 0xfe, 0xe6, 0x00, 0xfe, 0x1c, 0x90, 0xf9, 0x03, 0x14, 0x92,
+       0x01, 0x33, 0x02, 0x29,
+       0xfe, 0x42, 0x5b, 0x67, 0x1a, 0xfe, 0x46, 0x59, 0xf8, 0xf7, 0xfe, 0x87,
+       0x80, 0xfe, 0x31, 0xe4,
+       0x4f, 0x09, 0x04, 0x0b, 0xfe, 0x78, 0x13, 0xfe, 0x20, 0x80, 0x07, 0x1a,
+       0xfe, 0x70, 0x12, 0x49,
+       0x04, 0x06, 0xfe, 0x60, 0x13, 0x05, 0xfe, 0xa2, 0x00, 0x28, 0x16, 0xfe,
+       0x80, 0x05, 0xfe, 0x31,
+       0xe4, 0x6a, 0x49, 0x04, 0x0b, 0xfe, 0x4a, 0x13, 0x05, 0xfe, 0xa0, 0x00,
+       0x28, 0xfe, 0x42, 0x12,
+       0x5e, 0x01, 0x08, 0x25, 0x32, 0xf1, 0x01, 0x08, 0x26, 0xfe, 0x98, 0x05,
+       0x11, 0xfe, 0xe3, 0x00,
+       0x23, 0x49, 0xfe, 0x4a, 0xf0, 0xfe, 0x6a, 0x05, 0xfe, 0x49, 0xf0, 0xfe,
+       0x64, 0x05, 0x83, 0x24,
+       0xfe, 0x21, 0x00, 0xa1, 0x24, 0xfe, 0x22, 0x00, 0xa0, 0x24, 0x4c, 0xfe,
+       0x09, 0x48, 0x01, 0x08,
+       0x26, 0xfe, 0x98, 0x05, 0xfe, 0xe2, 0x08, 0x49, 0x04, 0xc5, 0x3b, 0x01,
+       0x86, 0x24, 0x06, 0x12,
+       0xcc, 0x37, 0xfe, 0x27, 0x01, 0x09, 0x04, 0x1d, 0xfe, 0x22, 0x12, 0x47,
+       0x01, 0xa7, 0x14, 0x92,
+       0x09, 0x04, 0x06, 0x3b, 0x14, 0xc4, 0x01, 0x33, 0x8f, 0xfe, 0x70, 0x0c,
+       0x02, 0x22, 0x05, 0xfe,
+       0x9c, 0x00, 0x28, 0xfe, 0x3e, 0x12, 0x05, 0x50, 0x28, 0xfe, 0x36, 0x13,
+       0x47, 0x01, 0xa7, 0x26,
+       0xfe, 0x08, 0x06, 0x0a, 0x06, 0x49, 0x04, 0x19, 0xfe, 0x02, 0x12, 0x5f,
+       0x01, 0xfe, 0xaa, 0x14,
+       0x1f, 0xfe, 0xfe, 0x05, 0x11, 0x9a, 0x01, 0x43, 0x11, 0xfe, 0xe5, 0x00,
+       0x05, 0x50, 0xb4, 0x0c,
+       0x50, 0x05, 0xc6, 0x28, 0xfe, 0x62, 0x12, 0x05, 0x3f, 0x28, 0xfe, 0x5a,
+       0x13, 0x01, 0xfe, 0x14,
+       0x18, 0x01, 0xfe, 0x66, 0x18, 0xfe, 0x43, 0x48, 0xb7, 0x19, 0x13, 0x6c,
+       0xff, 0x02, 0x00, 0x57,
+       0x48, 0x8b, 0x1c, 0x3d, 0x85, 0xb7, 0x69, 0x47, 0x01, 0xa7, 0x26, 0xfe,
+       0x72, 0x06, 0x49, 0x04,
+       0x1b, 0xdf, 0x89, 0x0a, 0x4d, 0x01, 0xfe, 0xd8, 0x14, 0x1f, 0xfe, 0x68,
+       0x06, 0x11, 0x9a, 0x01,
+       0x43, 0x11, 0xfe, 0xe5, 0x00, 0x05, 0x3f, 0xb4, 0x0c, 0x3f, 0x17, 0x06,
+       0x01, 0xa7, 0xec, 0x72,
+       0x70, 0x01, 0x6e, 0x87, 0x11, 0xfe, 0xe2, 0x00, 0x01, 0x08, 0x25, 0x32,
+       0xfe, 0x0a, 0xf0, 0xfe,
+       0xa6, 0x06, 0x8c, 0xfe, 0x5c, 0x07, 0xfe, 0x06, 0xf0, 0xfe, 0x64, 0x07,
+       0x8d, 0x81, 0x02, 0x22,
+       0x09, 0x04, 0x0b, 0xfe, 0x2e, 0x12, 0x15, 0x1a, 0x01, 0x08, 0x15, 0x00,
+       0x01, 0x08, 0x15, 0x00,
+       0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0xfe, 0x99, 0xa4, 0x01, 0x08, 0x15,
+       0x00, 0x02, 0xfe, 0x32,
+       0x08, 0x61, 0x04, 0x1b, 0xfe, 0x38, 0x12, 0x09, 0x04, 0x1b, 0x6e, 0x15,
+       0xfe, 0x1b, 0x00, 0x01,
+       0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01, 0x08, 0x15, 0x00, 0x01,
+       0x08, 0x15, 0x06, 0x01,
+       0x08, 0x15, 0x00, 0x02, 0xd9, 0x66, 0x4c, 0xfe, 0x3a, 0x55, 0x5f, 0xfe,
+       0x9a, 0x81, 0x4b, 0x1d,
+       0xba, 0xfe, 0x32, 0x07, 0x0a, 0x1d, 0xfe, 0x09, 0x6f, 0xaf, 0xfe, 0xca,
+       0x45, 0xfe, 0x32, 0x12,
+       0x62, 0x2c, 0x85, 0x66, 0x7b, 0x01, 0x08, 0x25, 0x32, 0xfe, 0x0a, 0xf0,
+       0xfe, 0x32, 0x07, 0x8d,
+       0x81, 0x8c, 0xfe, 0x5c, 0x07, 0x02, 0x22, 0x01, 0x43, 0x02, 0xfe, 0x8a,
+       0x06, 0x15, 0x19, 0x02,
+       0xfe, 0x8a, 0x06, 0xfe, 0x9c, 0xf7, 0xd4, 0xfe, 0x2c, 0x90, 0xfe, 0xae,
+       0x90, 0x77, 0xfe, 0xca,
+       0x07, 0x0c, 0x54, 0x18, 0x55, 0x09, 0x4a, 0x6a, 0x35, 0x1e, 0x20, 0x07,
+       0x10, 0xfe, 0x0e, 0x12,
+       0x74, 0xfe, 0x80, 0x80, 0x37, 0x20, 0x63, 0x27, 0xfe, 0x06, 0x10, 0xfe,
+       0x83, 0xe7, 0xc4, 0xa1,
+       0xfe, 0x03, 0x40, 0x09, 0x4a, 0x4f, 0x35, 0x01, 0xa8, 0xad, 0xfe, 0x1f,
+       0x40, 0x12, 0x58, 0x01,
+       0xa5, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0xfe, 0x44, 0x51, 0xfe, 0xc6,
+       0x51, 0x83, 0xfb, 0xfe,
+       0x8a, 0x90, 0x0c, 0x52, 0x18, 0x53, 0xfe, 0x0c, 0x90, 0xfe, 0x8e, 0x90,
+       0xfe, 0x40, 0x50, 0xfe,
+       0xc2, 0x50, 0x0c, 0x39, 0x18, 0x3a, 0xfe, 0x4a, 0x10, 0x09, 0x04, 0x6a,
+       0xfe, 0x2a, 0x12, 0xfe,
+       0x2c, 0x90, 0xfe, 0xae, 0x90, 0x0c, 0x54, 0x18, 0x55, 0x09, 0x04, 0x4f,
+       0x85, 0x01, 0xa8, 0xfe,
+       0x1f, 0x80, 0x12, 0x58, 0xfe, 0x44, 0x90, 0xfe, 0xc6, 0x90, 0x0c, 0x56,
+       0x18, 0x57, 0xfb, 0xfe,
+       0x8a, 0x90, 0x0c, 0x52, 0x18, 0x53, 0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90,
+       0x0c, 0x39, 0x18, 0x3a,
+       0x0c, 0x38, 0x18, 0x4e, 0x09, 0x4a, 0x19, 0x35, 0x2a, 0x13, 0xfe, 0x4e,
+       0x11, 0x65, 0xfe, 0x48,
+       0x08, 0xfe, 0x9e, 0xf0, 0xfe, 0x5c, 0x08, 0xb1, 0x16, 0x32, 0x2a, 0x73,
+       0xdd, 0xb8, 0xfe, 0x80,
+       0x08, 0xb9, 0xfe, 0x9e, 0x08, 0x8c, 0xfe, 0x74, 0x08, 0xfe, 0x06, 0xf0,
+       0xfe, 0x7a, 0x08, 0x8d,
+       0x81, 0x02, 0x22, 0x01, 0x43, 0xfe, 0xc9, 0x10, 0x15, 0x19, 0xfe, 0xc9,
+       0x10, 0x61, 0x04, 0x06,
+       0xfe, 0x10, 0x12, 0x61, 0x04, 0x0b, 0x45, 0x09, 0x04, 0x0b, 0xfe, 0x68,
+       0x12, 0xfe, 0x2e, 0x1c,
+       0x02, 0xfe, 0x24, 0x0a, 0x61, 0x04, 0x06, 0x45, 0x61, 0x04, 0x0b, 0xfe,
+       0x52, 0x12, 0xfe, 0x2c,
+       0x1c, 0xfe, 0xaa, 0xf0, 0xfe, 0x1e, 0x09, 0xfe, 0xac, 0xf0, 0xfe, 0xbe,
+       0x08, 0xfe, 0x8a, 0x10,
+       0xaa, 0xfe, 0xf3, 0x10, 0xfe, 0xad, 0xf0, 0xfe, 0xca, 0x08, 0x02, 0xfe,
+       0x24, 0x0a, 0xab, 0xfe,
+       0xe7, 0x10, 0xfe, 0x2b, 0xf0, 0x9d, 0xe9, 0x1c, 0xfe, 0x00, 0xfe, 0xfe,
+       0x1c, 0x12, 0xb5, 0xfe,
+       0xd2, 0xf0, 0x9d, 0xfe, 0x76, 0x18, 0x1c, 0x1a, 0x16, 0x9d, 0x05, 0xcb,
+       0x1c, 0x06, 0x16, 0x9d,
+       0xb8, 0x6d, 0xb9, 0x6d, 0xaa, 0xab, 0xfe, 0xb1, 0x10, 0x70, 0x5e, 0x2b,
+       0x14, 0x92, 0x01, 0x33,
+       0x0f, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x5a, 0x0f, 0x7c, 0x02, 0x5a,
+       0xfe, 0x74, 0x18, 0x1c,
+       0xfe, 0x00, 0xf8, 0x16, 0x6d, 0x67, 0x1b, 0x01, 0xfe, 0x44, 0x0d, 0x3b,
+       0x01, 0xe6, 0x1e, 0x27,
+       0x74, 0x67, 0x1a, 0x02, 0x6d, 0x09, 0x04, 0x0b, 0x21, 0xfe, 0x06, 0x0a,
+       0x09, 0x04, 0x6a, 0xfe,
+       0x82, 0x12, 0x09, 0x04, 0x19, 0xfe, 0x66, 0x13, 0x1e, 0x58, 0xac, 0xfc,
+       0xfe, 0x83, 0x80, 0xfe,
+       0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91, 0xfe, 0x86, 0x91, 0x63,
+       0x27, 0xfe, 0x40, 0x59,
+       0xfe, 0xc1, 0x59, 0x77, 0xd7, 0x05, 0x54, 0x31, 0x55, 0x0c, 0x7b, 0x18,
+       0x7c, 0xbe, 0x54, 0xbf,
+       0x55, 0x01, 0xa8, 0xad, 0x63, 0x27, 0x12, 0x58, 0xc0, 0x38, 0xc1, 0x4e,
+       0x79, 0x56, 0x68, 0x57,
+       0xf4, 0xf5, 0xfe, 0x04, 0xfa, 0x38, 0xfe, 0x05, 0xfa, 0x4e, 0x01, 0xa5,
+       0xa2, 0x23, 0x0c, 0x7b,
+       0x0c, 0x7c, 0x79, 0x56, 0x68, 0x57, 0xfe, 0x12, 0x10, 0x09, 0x04, 0x19,
+       0x16, 0xd7, 0x79, 0x39,
+       0x68, 0x3a, 0x09, 0x04, 0xfe, 0xf7, 0x00, 0x35, 0x05, 0x52, 0x31, 0x53,
+       0xfe, 0x10, 0x58, 0xfe,
+       0x91, 0x58, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x02, 0x6d, 0x09, 0x04,
+       0x19, 0x16, 0xd7, 0x09,
+       0x04, 0xfe, 0xf7, 0x00, 0x35, 0xfe, 0x3a, 0x55, 0xfe, 0x19, 0x81, 0x5f,
+       0xfe, 0x10, 0x90, 0xfe,
+       0x92, 0x90, 0xfe, 0xd7, 0x10, 0x2f, 0x07, 0x9b, 0x16, 0xfe, 0xc6, 0x08,
+       0x11, 0x9b, 0x09, 0x04,
+       0x0b, 0xfe, 0x14, 0x13, 0x05, 0x39, 0x31, 0x3a, 0x77, 0xfe, 0xc6, 0x08,
+       0xfe, 0x0c, 0x58, 0xfe,
+       0x8d, 0x58, 0x02, 0x6d, 0x23, 0x47, 0xfe, 0x19, 0x80, 0xde, 0x09, 0x04,
+       0x0b, 0xfe, 0x1a, 0x12,
+       0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41, 0xe9, 0xb5, 0xfe, 0xd1, 0xf0, 0xd9,
+       0x14, 0x7a, 0x01, 0x33,
+       0x0f, 0xfe, 0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe, 0x6c, 0x19, 0xbe, 0x39,
+       0xfe, 0xed, 0x19, 0xbf,
+       0x3a, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0xe9, 0x1c, 0xfe, 0x00, 0xff,
+       0x34, 0xfe, 0x74, 0x10,
+       0xb5, 0xfe, 0xd2, 0xf0, 0xfe, 0xb2, 0x0a, 0xfe, 0x76, 0x18, 0x1c, 0x1a,
+       0x84, 0x05, 0xcb, 0x1c,
+       0x06, 0xfe, 0x08, 0x13, 0x0f, 0xfe, 0x16, 0x00, 0x02, 0x5a, 0xfe, 0xd1,
+       0xf0, 0xfe, 0xc4, 0x0a,
+       0x14, 0x7a, 0x01, 0x33, 0x0f, 0xfe, 0x17, 0x00, 0xfe, 0x42, 0x10, 0xfe,
+       0xce, 0xf0, 0xfe, 0xca,
+       0x0a, 0xfe, 0x3c, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xd6, 0x0a, 0x0f, 0xfe,
+       0x22, 0x00, 0x02, 0x5a,
+       0xfe, 0xcb, 0xf0, 0xfe, 0xe2, 0x0a, 0x0f, 0xfe, 0x24, 0x00, 0x02, 0x5a,
+       0xfe, 0xd0, 0xf0, 0xfe,
+       0xec, 0x0a, 0x0f, 0x93, 0xdc, 0xfe, 0xcf, 0xf0, 0xfe, 0xf6, 0x0a, 0x0f,
+       0x4c, 0xfe, 0x10, 0x10,
+       0xfe, 0xcc, 0xf0, 0xd9, 0x61, 0x04, 0x19, 0x3b, 0x0f, 0xfe, 0x12, 0x00,
+       0x2a, 0x13, 0xfe, 0x4e,
+       0x11, 0x65, 0xfe, 0x0c, 0x0b, 0xfe, 0x9e, 0xf0, 0xfe, 0x20, 0x0b, 0xb1,
+       0x16, 0x32, 0x2a, 0x73,
+       0xdd, 0xb8, 0x22, 0xb9, 0x22, 0x2a, 0xec, 0x65, 0xfe, 0x2c, 0x0b, 0x25,
+       0x32, 0x8c, 0xfe, 0x48,
+       0x0b, 0x8d, 0x81, 0xb8, 0xd4, 0xb9, 0xd4, 0x02, 0x22, 0x01, 0x43, 0xfe,
+       0xdb, 0x10, 0x11, 0xfe,
+       0xe8, 0x00, 0xaa, 0xab, 0x70, 0xbc, 0x7d, 0xbd, 0x7f, 0xfe, 0x89, 0xf0,
+       0x22, 0x30, 0x2e, 0xd8,
+       0xbc, 0x7d, 0xbd, 0x7f, 0x01, 0x08, 0x1f, 0x22, 0x30, 0x2e, 0xd6, 0xb1,
+       0x45, 0x0f, 0xfe, 0x42,
+       0x00, 0x02, 0x5a, 0x78, 0x06, 0xfe, 0x81, 0x49, 0x16, 0xfe, 0x38, 0x0c,
+       0x09, 0x04, 0x0b, 0xfe,
+       0x44, 0x13, 0x0f, 0x00, 0x4b, 0x0b, 0xfe, 0x54, 0x12, 0x4b, 0xfe, 0x28,
+       0x00, 0x21, 0xfe, 0xa6,
+       0x0c, 0x0a, 0x40, 0x01, 0x0e, 0x07, 0x00, 0x5d, 0x3e, 0xfe, 0x28, 0x00,
+       0xfe, 0xe2, 0x10, 0x01,
+       0xe7, 0x01, 0xe8, 0x0a, 0x99, 0x01, 0xfe, 0x32, 0x0e, 0x59, 0x11, 0x2d,
+       0x01, 0x6f, 0x02, 0x29,
+       0x0f, 0xfe, 0x44, 0x00, 0x4b, 0x0b, 0xdf, 0x3e, 0x0b, 0xfe, 0xb4, 0x10,
+       0x01, 0x86, 0x3e, 0x0b,
+       0xfe, 0xaa, 0x10, 0x01, 0x86, 0xfe, 0x19, 0x82, 0xfe, 0x34, 0x46, 0xa3,
+       0x3e, 0x0b, 0x0f, 0xfe,
+       0x43, 0x00, 0xfe, 0x96, 0x10, 0x09, 0x4a, 0x0b, 0x35, 0x01, 0xe7, 0x01,
+       0xe8, 0x59, 0x11, 0x2d,
+       0x01, 0x6f, 0x67, 0x0b, 0x59, 0x3c, 0x8a, 0x02, 0xfe, 0x2a, 0x03, 0x09,
+       0x04, 0x0b, 0x84, 0x3e,
+       0x0b, 0x0f, 0x00, 0xfe, 0x5c, 0x10, 0x61, 0x04, 0x1b, 0xfe, 0x58, 0x12,
+       0x09, 0x04, 0x1b, 0xfe,
+       0x50, 0x13, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x5c, 0x0c, 0xfe,
+       0x1c, 0x1c, 0xfe, 0x9d,
+       0xf0, 0xfe, 0x62, 0x0c, 0x09, 0x4a, 0x1b, 0x35, 0xfe, 0xa9, 0x10, 0x0f,
+       0xfe, 0x15, 0x00, 0xfe,
+       0x04, 0xe6, 0x0b, 0x5f, 0x5c, 0x0f, 0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10,
+       0x0f, 0xfe, 0x47, 0x00,
+       0xa1, 0x0f, 0xfe, 0x41, 0x00, 0xa0, 0x0f, 0xfe, 0x24, 0x00, 0x87, 0xaa,
+       0xab, 0x70, 0x05, 0x6b,
+       0x28, 0x21, 0xd1, 0x5f, 0xfe, 0x04, 0xe6, 0x1b, 0xfe, 0x9d, 0x41, 0xfe,
+       0x1c, 0x42, 0x59, 0x01,
+       0xda, 0x02, 0x29, 0xea, 0x14, 0x0b, 0x37, 0x95, 0xa9, 0x14, 0xfe, 0x31,
+       0x00, 0x37, 0x97, 0x01,
+       0xfe, 0x54, 0x0f, 0x02, 0xd0, 0x3c, 0xfe, 0x06, 0xec, 0xc9, 0xee, 0x3e,
+       0x1d, 0xfe, 0xce, 0x45,
+       0x34, 0x3c, 0xfe, 0x06, 0xea, 0xc9, 0xfe, 0x47, 0x4b, 0x89, 0xfe, 0x75,
+       0x57, 0x05, 0x51, 0xfe,
+       0x98, 0x56, 0xfe, 0x38, 0x12, 0x0a, 0x42, 0x01, 0x0e, 0xfe, 0x44, 0x48,
+       0x46, 0x09, 0x04, 0x1d,
+       0xfe, 0x1a, 0x13, 0x0a, 0x40, 0x01, 0x0e, 0x47, 0xfe, 0x41, 0x58, 0x0a,
+       0x99, 0x01, 0x0e, 0xfe,
+       0x49, 0x54, 0x8e, 0xfe, 0x2a, 0x0d, 0x02, 0xfe, 0x2a, 0x03, 0x0a, 0x51,
+       0xfe, 0xee, 0x14, 0xee,
+       0x3e, 0x1d, 0xfe, 0xce, 0x45, 0x34, 0x3c, 0xfe, 0xce, 0x47, 0xfe, 0xad,
+       0x13, 0x02, 0x29, 0x1e,
+       0x20, 0x07, 0x10, 0xfe, 0x9e, 0x12, 0x23, 0x12, 0x4d, 0x12, 0x94, 0x12,
+       0xce, 0x1e, 0x2d, 0x47,
+       0x37, 0x2d, 0xb1, 0xe0, 0xfe, 0xbc, 0xf0, 0xfe, 0xec, 0x0d, 0x13, 0x06,
+       0x12, 0x4d, 0x01, 0xfe,
+       0xe2, 0x15, 0x05, 0xfe, 0x38, 0x01, 0x31, 0xfe, 0x3a, 0x01, 0x77, 0xfe,
+       0xf0, 0x0d, 0xfe, 0x02,
+       0xec, 0xce, 0x62, 0x00, 0x5d, 0xfe, 0x04, 0xec, 0x20, 0x46, 0xfe, 0x05,
+       0xf6, 0xfe, 0x34, 0x01,
+       0x01, 0xfe, 0x52, 0x16, 0xfb, 0xfe, 0x48, 0xf4, 0x0d, 0xfe, 0x18, 0x13,
+       0xaf, 0xfe, 0x02, 0xea,
+       0xce, 0x62, 0x7a, 0xfe, 0xc5, 0x13, 0x14, 0x1b, 0x37, 0x95, 0xa9, 0x5c,
+       0x05, 0xfe, 0x38, 0x01,
+       0x1c, 0xfe, 0xf0, 0xff, 0x0c, 0xfe, 0x60, 0x01, 0x05, 0xfe, 0x3a, 0x01,
+       0x0c, 0xfe, 0x62, 0x01,
+       0x3d, 0x12, 0x20, 0x24, 0x06, 0x12, 0x2d, 0x11, 0x2d, 0x8a, 0x13, 0x06,
+       0x03, 0x23, 0x03, 0x1e,
+       0x4d, 0xfe, 0xf7, 0x12, 0x1e, 0x94, 0xac, 0x12, 0x94, 0x07, 0x7a, 0xfe,
+       0x71, 0x13, 0xfe, 0x24,
+       0x1c, 0x14, 0x1a, 0x37, 0x95, 0xa9, 0xfe, 0xd9, 0x10, 0xb6, 0xfe, 0x03,
+       0xdc, 0xfe, 0x73, 0x57,
+       0xfe, 0x80, 0x5d, 0x03, 0xb6, 0xfe, 0x03, 0xdc, 0xfe, 0x5b, 0x57, 0xfe,
+       0x80, 0x5d, 0x03, 0xfe,
+       0x03, 0x57, 0xb6, 0x23, 0xfe, 0x00, 0xcc, 0x03, 0xfe, 0x03, 0x57, 0xb6,
+       0x75, 0x03, 0x09, 0x04,
+       0x4c, 0xfe, 0x22, 0x13, 0xfe, 0x1c, 0x80, 0x07, 0x06, 0xfe, 0x1a, 0x13,
+       0xfe, 0x1e, 0x80, 0xe1,
+       0xfe, 0x1d, 0x80, 0xa4, 0xfe, 0x0c, 0x90, 0xfe, 0x0e, 0x13, 0xfe, 0x0e,
+       0x90, 0xa3, 0xfe, 0x3c,
+       0x90, 0xfe, 0x30, 0xf4, 0x0b, 0xfe, 0x3c, 0x50, 0xa0, 0x01, 0xfe, 0x82,
+       0x16, 0x2f, 0x07, 0x2d,
+       0xe0, 0x01, 0xfe, 0xbc, 0x15, 0x09, 0x04, 0x1d, 0x45, 0x01, 0xe7, 0x01,
+       0xe8, 0x11, 0xfe, 0xe9,
+       0x00, 0x09, 0x04, 0x4c, 0xfe, 0x2c, 0x13, 0x01, 0xfe, 0x14, 0x16, 0xfe,
+       0x1e, 0x1c, 0xfe, 0x14,
+       0x90, 0xfe, 0x96, 0x90, 0x0c, 0xfe, 0x64, 0x01, 0x18, 0xfe, 0x66, 0x01,
+       0x09, 0x04, 0x4f, 0xfe,
+       0x12, 0x12, 0xfe, 0x03, 0x80, 0x74, 0xfe, 0x01, 0xec, 0x20, 0xfe, 0x80,
+       0x40, 0x12, 0x20, 0x63,
+       0x27, 0x11, 0xc8, 0x59, 0x1e, 0x20, 0xed, 0x76, 0x20, 0x03, 0xfe, 0x08,
+       0x1c, 0x05, 0xfe, 0xac,
+       0x00, 0xfe, 0x06, 0x58, 0x05, 0xfe, 0xae, 0x00, 0xfe, 0x07, 0x58, 0x05,
+       0xfe, 0xb0, 0x00, 0xfe,
+       0x08, 0x58, 0x05, 0xfe, 0xb2, 0x00, 0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c,
+       0x24, 0x69, 0x12, 0xc9,
+       0x23, 0x0c, 0x50, 0x0c, 0x3f, 0x13, 0x40, 0x48, 0x5f, 0x17, 0x1d, 0xfe,
+       0x90, 0x4d, 0xfe, 0x91,
+       0x54, 0x21, 0xfe, 0x08, 0x0f, 0x3e, 0x10, 0x13, 0x42, 0x48, 0x17, 0x4c,
+       0xfe, 0x90, 0x4d, 0xfe,
+       0x91, 0x54, 0x21, 0xfe, 0x1e, 0x0f, 0x24, 0x10, 0x12, 0x20, 0x78, 0x2c,
+       0x46, 0x1e, 0x20, 0xed,
+       0x76, 0x20, 0x11, 0xc8, 0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x32, 0x0f, 0xea,
+       0x70, 0xfe, 0x14, 0x1c,
+       0xfe, 0x10, 0x1c, 0xfe, 0x18, 0x1c, 0x03, 0x3c, 0xfe, 0x0c, 0x14, 0xee,
+       0xfe, 0x07, 0xe6, 0x1d,
+       0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x03, 0x01, 0x86, 0x78, 0x2c, 0x46,
+       0xfa, 0xef, 0xfe, 0x42,
+       0x13, 0x2f, 0x07, 0x2d, 0xfe, 0x34, 0x13, 0x0a, 0x42, 0x01, 0x0e, 0xb0,
+       0xfe, 0x36, 0x12, 0xf0,
+       0xfe, 0x45, 0x48, 0x01, 0xe3, 0xfe, 0x00, 0xcc, 0xb0, 0xfe, 0xf3, 0x13,
+       0x3d, 0x75, 0x07, 0x10,
+       0xa3, 0x0a, 0x80, 0x01, 0x0e, 0xfe, 0x80, 0x5c, 0x01, 0x6f, 0xfe, 0x0e,
+       0x10, 0x07, 0x7e, 0x45,
+       0xf6, 0xfe, 0xd6, 0xf0, 0xfe, 0x6c, 0x0f, 0x03, 0xfe, 0x44, 0x58, 0x74,
+       0xfe, 0x01, 0xec, 0x97,
+       0xfe, 0x9e, 0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x1b, 0x76,
+       0x27, 0x01, 0xda, 0xfe,
+       0xdd, 0x10, 0x2a, 0xbc, 0x7d, 0xbd, 0x7f, 0x30, 0x2e, 0xd5, 0x07, 0x1b,
+       0xfe, 0x48, 0x12, 0x07,
+       0x0b, 0xfe, 0x56, 0x12, 0x07, 0x1a, 0xfe, 0x30, 0x12, 0x07, 0xc2, 0x16,
+       0xfe, 0x3e, 0x11, 0x07,
+       0xfe, 0x23, 0x00, 0x16, 0xfe, 0x4a, 0x11, 0x07, 0x06, 0x16, 0xfe, 0xa8,
+       0x11, 0x07, 0x19, 0xfe,
+       0x12, 0x12, 0x07, 0x00, 0x16, 0x22, 0x14, 0xc2, 0x01, 0x33, 0x9f, 0x2b,
+       0x01, 0x08, 0x8c, 0x43,
+       0x03, 0x2b, 0xfe, 0x62, 0x08, 0x0a, 0xca, 0x01, 0xfe, 0x32, 0x0e, 0x11,
+       0x7e, 0x02, 0x29, 0x2b,
+       0x2f, 0x07, 0x9b, 0xfe, 0xd9, 0x13, 0x79, 0x39, 0x68, 0x3a, 0x77, 0xfe,
+       0xfc, 0x10, 0x09, 0x04,
+       0x6a, 0xfe, 0x72, 0x12, 0xc0, 0x38, 0xc1, 0x4e, 0xf4, 0xf5, 0x8e, 0xfe,
+       0xc6, 0x10, 0x1e, 0x58,
+       0xfe, 0x26, 0x13, 0x05, 0x7b, 0x31, 0x7c, 0x77, 0xfe, 0x82, 0x0c, 0x0c,
+       0x54, 0x18, 0x55, 0x23,
+       0x0c, 0x7b, 0x0c, 0x7c, 0x01, 0xa8, 0x24, 0x69, 0x73, 0x12, 0x58, 0x01,
+       0xa5, 0xc0, 0x38, 0xc1,
+       0x4e, 0xfe, 0x04, 0x55, 0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x38, 0xfe,
+       0x05, 0xfa, 0x4e, 0xfe,
+       0x91, 0x10, 0x05, 0x56, 0x31, 0x57, 0xfe, 0x40, 0x56, 0xfe, 0xe1, 0x56,
+       0x0c, 0x56, 0x18, 0x57,
+       0x83, 0xc0, 0x38, 0xc1, 0x4e, 0xf4, 0xf5, 0x05, 0x52, 0x31, 0x53, 0xfe,
+       0x00, 0x56, 0xfe, 0xa1,
+       0x56, 0x0c, 0x52, 0x18, 0x53, 0x09, 0x04, 0x6a, 0xfe, 0x1e, 0x12, 0x1e,
+       0x58, 0xfe, 0x1f, 0x40,
+       0x05, 0x54, 0x31, 0x55, 0xfe, 0x2c, 0x50, 0xfe, 0xae, 0x50, 0x05, 0x56,
+       0x31, 0x57, 0xfe, 0x44,
+       0x50, 0xfe, 0xc6, 0x50, 0x05, 0x52, 0x31, 0x53, 0xfe, 0x08, 0x50, 0xfe,
+       0x8a, 0x50, 0x05, 0x39,
+       0x31, 0x3a, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x02, 0x5c, 0x24, 0x06,
+       0x12, 0xcd, 0x02, 0x5b,
+       0x2b, 0x01, 0x08, 0x1f, 0x44, 0x30, 0x2e, 0xd5, 0x07, 0x06, 0x21, 0x44,
+       0x2f, 0x07, 0x9b, 0x21,
+       0x5b, 0x01, 0x6e, 0x1c, 0x3d, 0x16, 0x44, 0x09, 0x04, 0x0b, 0xe2, 0x79,
+       0x39, 0x68, 0x3a, 0xfe,
+       0x0a, 0x55, 0x34, 0xfe, 0x8b, 0x55, 0xbe, 0x39, 0xbf, 0x3a, 0xfe, 0x0c,
+       0x51, 0xfe, 0x8e, 0x51,
+       0x02, 0x5b, 0xfe, 0x19, 0x81, 0xaf, 0xfe, 0x19, 0x41, 0x02, 0x5b, 0x2b,
+       0x01, 0x08, 0x25, 0x32,
+       0x1f, 0xa2, 0x30, 0x2e, 0xd8, 0x4b, 0x1a, 0xfe, 0xa6, 0x12, 0x4b, 0x0b,
+       0x3b, 0x02, 0x44, 0x01,
+       0x08, 0x25, 0x32, 0x1f, 0xa2, 0x30, 0x2e, 0xd6, 0x07, 0x1a, 0x21, 0x44,
+       0x01, 0x08, 0x1f, 0xa2,
+       0x30, 0x2e, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49, 0x60, 0x05, 0xfe, 0x9c,
+       0x00, 0x28, 0x84, 0x49,
+       0x04, 0x19, 0x34, 0x9f, 0xfe, 0xbb, 0x45, 0x4b, 0x00, 0x45, 0x3e, 0x06,
+       0x78, 0x3d, 0xfe, 0xda,
+       0x14, 0x01, 0x6e, 0x87, 0xfe, 0x4b, 0x45, 0xe2, 0x2f, 0x07, 0x9a, 0xe1,
+       0x05, 0xc6, 0x28, 0x84,
+       0x05, 0x3f, 0x28, 0x34, 0x5e, 0x02, 0x5b, 0xfe, 0xc0, 0x5d, 0xfe, 0xf8,
+       0x14, 0xfe, 0x03, 0x17,
+       0x05, 0x50, 0xb4, 0x0c, 0x50, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01,
+       0xfe, 0xaa, 0x14, 0x02,
+       0x5c, 0x01, 0x08, 0x25, 0x32, 0x1f, 0x44, 0x30, 0x2e, 0xd6, 0x07, 0x06,
+       0x21, 0x44, 0x01, 0xfe,
+       0x8e, 0x13, 0xfe, 0x42, 0x58, 0xfe, 0x82, 0x14, 0xfe, 0xa4, 0x14, 0x87,
+       0xfe, 0x4a, 0xf4, 0x0b,
+       0x16, 0x44, 0xfe, 0x4a, 0xf4, 0x06, 0xfe, 0x0c, 0x12, 0x2f, 0x07, 0x9a,
+       0x85, 0x02, 0x5b, 0x05,
+       0x3f, 0xb4, 0x0c, 0x3f, 0x5e, 0x2b, 0x01, 0x08, 0x26, 0x5c, 0x01, 0xfe,
+       0xd8, 0x14, 0x02, 0x5c,
+       0x13, 0x06, 0x65, 0xfe, 0xca, 0x12, 0x26, 0xfe, 0xe0, 0x12, 0x72, 0xf1,
+       0x01, 0x08, 0x23, 0x72,
+       0x03, 0x8f, 0xfe, 0xdc, 0x12, 0x25, 0xfe, 0xdc, 0x12, 0x1f, 0xfe, 0xca,
+       0x12, 0x5e, 0x2b, 0x01,
+       0x08, 0xfe, 0xd5, 0x10, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b,
+       0x1c, 0xfe, 0xff, 0x7f,
+       0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x03, 0x13, 0x6c, 0xff, 0x02, 0x00,
+       0x57, 0x48, 0x8b, 0x1c,
+       0x3d, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x03, 0x13, 0x6c, 0xff, 0x02,
+       0x00, 0x57, 0x48, 0x8b,
+       0x03, 0x13, 0x6c, 0xff, 0x02, 0x00, 0x57, 0x48, 0x8b, 0xfe, 0x0b, 0x58,
+       0x03, 0x0a, 0x50, 0x01,
+       0x82, 0x0a, 0x3f, 0x01, 0x82, 0x03, 0xfc, 0x1c, 0x10, 0xff, 0x03, 0x00,
+       0x54, 0xfe, 0x00, 0xf4,
+       0x19, 0x48, 0xfe, 0x00, 0x7d, 0xfe, 0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe,
+       0x03, 0x7c, 0x63, 0x27,
+       0x0c, 0x52, 0x18, 0x53, 0xbe, 0x56, 0xbf, 0x57, 0x03, 0xfe, 0x62, 0x08,
+       0xfe, 0x82, 0x4a, 0xfe,
+       0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x74, 0x03, 0x01, 0xfe, 0x14, 0x18, 0xfe,
+       0x42, 0x48, 0x5f, 0x60,
+       0x89, 0x01, 0x08, 0x1f, 0xfe, 0xa2, 0x14, 0x30, 0x2e, 0xd8, 0x01, 0x08,
+       0x1f, 0xfe, 0xa2, 0x14,
+       0x30, 0x2e, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59, 0x05, 0xc6, 0x28, 0xfe,
+       0xcc, 0x12, 0x49, 0x04,
+       0x1b, 0xfe, 0xc4, 0x13, 0x23, 0x62, 0x1b, 0xe2, 0x4b, 0xc3, 0x64, 0xfe,
+       0xe8, 0x13, 0x3b, 0x13,
+       0x06, 0x17, 0xc3, 0x78, 0xdb, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55,
+       0xa1, 0xff, 0x02, 0x83,
+       0x55, 0x62, 0x1a, 0xa4, 0xbb, 0xfe, 0x30, 0x00, 0x8e, 0xe4, 0x17, 0x2c,
+       0x13, 0x06, 0xfe, 0x56,
+       0x10, 0x62, 0x0b, 0xe1, 0xbb, 0xfe, 0x64, 0x00, 0x8e, 0xe4, 0x0a, 0xfe,
+       0x64, 0x00, 0x17, 0x93,
+       0x13, 0x06, 0xfe, 0x28, 0x10, 0x62, 0x06, 0xfe, 0x60, 0x13, 0xbb, 0xfe,
+       0xc8, 0x00, 0x8e, 0xe4,
+       0x0a, 0xfe, 0xc8, 0x00, 0x17, 0x4d, 0x13, 0x06, 0x83, 0xbb, 0xfe, 0x90,
+       0x01, 0xba, 0xfe, 0x4e,
+       0x14, 0x89, 0xfe, 0x12, 0x10, 0xfe, 0x43, 0xf4, 0x94, 0xfe, 0x56, 0xf0,
+       0xfe, 0x60, 0x14, 0xfe,
+       0x04, 0xf4, 0x6c, 0xfe, 0x43, 0xf4, 0x93, 0xfe, 0xf3, 0x10, 0xf9, 0x01,
+       0xfe, 0x22, 0x13, 0x1c,
+       0x3d, 0xfe, 0x10, 0x13, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x69, 0xba,
+       0xfe, 0x9c, 0x14, 0xb7,
+       0x69, 0xfe, 0x1c, 0x10, 0xfe, 0x00, 0x17, 0xfe, 0x4d, 0xe4, 0x19, 0xba,
+       0xfe, 0x9c, 0x14, 0xb7,
+       0x19, 0x83, 0x60, 0x23, 0xfe, 0x4d, 0xf4, 0x00, 0xdf, 0x89, 0x13, 0x06,
+       0xfe, 0xb4, 0x56, 0xfe,
+       0xc3, 0x58, 0x03, 0x60, 0x13, 0x0b, 0x03, 0x15, 0x06, 0x01, 0x08, 0x26,
+       0xe5, 0x15, 0x0b, 0x01,
+       0x08, 0x26, 0xe5, 0x15, 0x1a, 0x01, 0x08, 0x26, 0xe5, 0x72, 0xfe, 0x89,
+       0x49, 0x01, 0x08, 0x03,
+       0x15, 0x06, 0x01, 0x08, 0x26, 0xa6, 0x15, 0x1a, 0x01, 0x08, 0x26, 0xa6,
+       0x15, 0x06, 0x01, 0x08,
+       0x26, 0xa6, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x26, 0xa6, 0x72, 0xfe, 0x89,
+       0x4a, 0x01, 0x08, 0x03,
+       0x60, 0x03, 0x1e, 0xcc, 0x07, 0x06, 0xfe, 0x44, 0x13, 0xad, 0x12, 0xcc,
+       0xfe, 0x49, 0xf4, 0x00,
+       0x3b, 0x72, 0x9f, 0x5e, 0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xf1, 0x01,
+       0x08, 0x2f, 0x07, 0xfe,
+       0xe3, 0x00, 0xfe, 0x20, 0x13, 0x1f, 0xfe, 0x5a, 0x15, 0x23, 0x12, 0xcd,
+       0x01, 0x43, 0x1e, 0xcd,
+       0x07, 0x06, 0x45, 0x09, 0x4a, 0x06, 0x35, 0x03, 0x0a, 0x42, 0x01, 0x0e,
+       0xed, 0x88, 0x07, 0x10,
+       0xa4, 0x0a, 0x80, 0x01, 0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03, 0x0a,
+       0x80, 0x01, 0x0e, 0x88,
+       0xfe, 0x80, 0xe7, 0x10, 0x07, 0x10, 0x84, 0xfe, 0x45, 0x58, 0x01, 0xe3,
+       0x88, 0x03, 0x0a, 0x42,
+       0x01, 0x0e, 0x88, 0x0a, 0x51, 0x01, 0x9e, 0x03, 0x0a, 0x42, 0x01, 0x0e,
+       0xfe, 0x80, 0x80, 0xf2,
+       0xfe, 0x49, 0xe4, 0x10, 0xa4, 0x0a, 0x80, 0x01, 0x0e, 0xf2, 0x0a, 0x51,
+       0x01, 0x82, 0x03, 0x17,
+       0x10, 0x71, 0x66, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde,
+       0xfe, 0x24, 0x1c, 0xfe,
+       0x1d, 0xf7, 0x1d, 0x90, 0xfe, 0xf6, 0x15, 0x01, 0xfe, 0xfc, 0x16, 0xe0,
+       0x91, 0x1d, 0x66, 0xfe,
+       0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x03, 0xae, 0x21, 0xfe, 0xe6, 0x15, 0xfe,
+       0xda, 0x10, 0x17, 0x10,
+       0x71, 0x05, 0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x19, 0xfe, 0x18, 0x58,
+       0x05, 0xfe, 0x66, 0x01,
+       0xfe, 0x19, 0x58, 0x91, 0x19, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4, 0x06,
+       0xfe, 0x3c, 0x50, 0x66,
+       0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x19, 0x90, 0xfe,
+       0x40, 0x16, 0xfe, 0xb6,
+       0x14, 0x34, 0x03, 0xae, 0x21, 0xfe, 0x18, 0x16, 0xfe, 0x9c, 0x10, 0x17,
+       0x10, 0x71, 0xfe, 0x83,
+       0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7, 0x38, 0x90,
+       0xfe, 0x62, 0x16, 0xfe,
+       0x94, 0x14, 0xfe, 0x10, 0x13, 0x91, 0x38, 0x66, 0x1b, 0xfe, 0xaf, 0x19,
+       0xfe, 0x98, 0xe7, 0x00,
+       0x03, 0xae, 0x21, 0xfe, 0x56, 0x16, 0xfe, 0x6c, 0x10, 0x17, 0x10, 0x71,
+       0xfe, 0x30, 0xbc, 0xfe,
+       0xb2, 0xbc, 0x91, 0xc5, 0x66, 0x1b, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7,
+       0xc5, 0x90, 0xfe, 0x9a,
+       0x16, 0xfe, 0x5c, 0x14, 0x34, 0x03, 0xae, 0x21, 0xfe, 0x86, 0x16, 0xfe,
+       0x42, 0x10, 0xfe, 0x02,
+       0xf6, 0x10, 0x71, 0xfe, 0x18, 0xfe, 0x54, 0xfe, 0x19, 0xfe, 0x55, 0xfc,
+       0xfe, 0x1d, 0xf7, 0x4f,
+       0x90, 0xfe, 0xc0, 0x16, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13, 0x91, 0x4f,
+       0x47, 0xfe, 0x83, 0x58,
+       0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7, 0x10, 0xfe, 0x81, 0xe7, 0x10, 0x11,
+       0xfe, 0xdd, 0x00, 0x63,
+       0x27, 0x03, 0x63, 0x27, 0xfe, 0x12, 0x45, 0x21, 0xfe, 0xb0, 0x16, 0x14,
+       0x06, 0x37, 0x95, 0xa9,
+       0x02, 0x29, 0xfe, 0x39, 0xf0, 0xfe, 0x04, 0x17, 0x23, 0x03, 0xfe, 0x7e,
+       0x18, 0x1c, 0x1a, 0x5d,
+       0x13, 0x0d, 0x03, 0x71, 0x05, 0xcb, 0x1c, 0x06, 0xfe, 0xef, 0x12, 0xfe,
+       0xe1, 0x10, 0x78, 0x2c,
+       0x46, 0x2f, 0x07, 0x2d, 0xfe, 0x3c, 0x13, 0xfe, 0x82, 0x14, 0xfe, 0x42,
+       0x13, 0x3c, 0x8a, 0x0a,
+       0x42, 0x01, 0x0e, 0xb0, 0xfe, 0x3e, 0x12, 0xf0, 0xfe, 0x45, 0x48, 0x01,
+       0xe3, 0xfe, 0x00, 0xcc,
+       0xb0, 0xfe, 0xf3, 0x13, 0x3d, 0x75, 0x07, 0x10, 0xa3, 0x0a, 0x80, 0x01,
+       0x0e, 0xf2, 0x01, 0x6f,
+       0xfe, 0x16, 0x10, 0x07, 0x7e, 0x85, 0xfe, 0x40, 0x14, 0xfe, 0x24, 0x12,
+       0xf6, 0xfe, 0xd6, 0xf0,
+       0xfe, 0x24, 0x17, 0x17, 0x0b, 0x03, 0xfe, 0x9c, 0xe7, 0x0b, 0x0f, 0xfe,
+       0x15, 0x00, 0x59, 0x76,
+       0x27, 0x01, 0xda, 0x17, 0x06, 0x03, 0x3c, 0x8a, 0x09, 0x4a, 0x1d, 0x35,
+       0x11, 0x2d, 0x01, 0x6f,
+       0x17, 0x06, 0x03, 0xfe, 0x38, 0x90, 0xfe, 0xba, 0x90, 0x79, 0xc7, 0x68,
+       0xc8, 0xfe, 0x48, 0x55,
+       0x34, 0xfe, 0xc9, 0x55, 0x03, 0x1e, 0x98, 0x73, 0x12, 0x98, 0x03, 0x0a,
+       0x99, 0x01, 0x0e, 0xf0,
+       0x0a, 0x40, 0x01, 0x0e, 0xfe, 0x49, 0x44, 0x16, 0xfe, 0xf0, 0x17, 0x73,
+       0x75, 0x03, 0x0a, 0x42,
+       0x01, 0x0e, 0x07, 0x10, 0x45, 0x0a, 0x51, 0x01, 0x9e, 0x0a, 0x40, 0x01,
+       0x0e, 0x73, 0x75, 0x03,
+       0xfe, 0x4e, 0xe4, 0x1a, 0x64, 0xfe, 0x24, 0x18, 0x05, 0xfe, 0x90, 0x00,
+       0xfe, 0x3a, 0x45, 0x5b,
+       0xfe, 0x4e, 0xe4, 0xc2, 0x64, 0xfe, 0x36, 0x18, 0x05, 0xfe, 0x92, 0x00,
+       0xfe, 0x02, 0xe6, 0x1b,
+       0xdc, 0xfe, 0x4e, 0xe4, 0xfe, 0x0b, 0x00, 0x64, 0xfe, 0x48, 0x18, 0x05,
+       0xfe, 0x94, 0x00, 0xfe,
+       0x02, 0xe6, 0x19, 0xfe, 0x08, 0x10, 0x05, 0xfe, 0x96, 0x00, 0xfe, 0x02,
+       0xe6, 0x2c, 0xfe, 0x4e,
+       0x45, 0xfe, 0x0c, 0x12, 0xaf, 0xff, 0x04, 0x68, 0x54, 0xde, 0x1c, 0x69,
+       0x03, 0x07, 0x7a, 0xfe,
+       0x5a, 0xf0, 0xfe, 0x74, 0x18, 0x24, 0xfe, 0x09, 0x00, 0xfe, 0x34, 0x10,
+       0x07, 0x1b, 0xfe, 0x5a,
+       0xf0, 0xfe, 0x82, 0x18, 0x24, 0xc3, 0xfe, 0x26, 0x10, 0x07, 0x1a, 0x5d,
+       0x24, 0x2c, 0xdc, 0x07,
+       0x0b, 0x5d, 0x24, 0x93, 0xfe, 0x0e, 0x10, 0x07, 0x06, 0x5d, 0x24, 0x4d,
+       0x9f, 0xad, 0x03, 0x14,
+       0xfe, 0x09, 0x00, 0x01, 0x33, 0xfe, 0x04, 0xfe, 0x7d, 0x05, 0x7f, 0xf9,
+       0x03, 0x25, 0xfe, 0xca,
+       0x18, 0xfe, 0x14, 0xf0, 0x08, 0x65, 0xfe, 0xc6, 0x18, 0x03, 0xff, 0x1a,
+       0x00, 0x00,
 };
 
-STATIC unsigned short _adv_asc3550_size =
-        sizeof(_adv_asc3550_buf); /* 0x13AD */
-STATIC ADV_DCNT _adv_asc3550_chksum =
-        0x04D52DDDUL; /* Expanded little-endian checksum. */
+static unsigned short _adv_asc3550_size = sizeof(_adv_asc3550_buf);    /* 0x13AD */
+static ADV_DCNT _adv_asc3550_chksum = 0x04D52DDDUL;    /* Expanded little-endian checksum. */
 
 /* Microcode buffer is kept after initialization for error recovery. */
-STATIC unsigned char _adv_asc38C0800_buf[] = {
-  0x00,  0x00,  0x00,  0xf2,  0x00,  0xf0,  0x00,  0xfc,  0x00,  0x16,  0x18,  0xe4,  0x01,  0x00,  0x48,  0xe4,
-  0x18,  0x80,  0x03,  0xf6,  0x02,  0x00,  0xce,  0x19,  0x00,  0xfa,  0xff,  0xff,  0x1c,  0x0f,  0x00,  0xf6,
-  0x9e,  0xe7,  0xff,  0x00,  0x82,  0xe7,  0x00,  0xea,  0x01,  0xfa,  0x01,  0xe6,  0x09,  0xe7,  0x55,  0xf0,
-  0x01,  0xf6,  0x03,  0x00,  0x04,  0x00,  0x10,  0x00,  0x1e,  0xf0,  0x85,  0xf0,  0x18,  0xf4,  0x08,  0x00,
-  0xbc,  0x00,  0x38,  0x54,  0x00,  0xec,  0xd5,  0xf0,  0x82,  0x0d,  0x00,  0xe6,  0x86,  0xf0,  0xb1,  0xf0,
-  0x98,  0x57,  0x01,  0xfc,  0xb4,  0x00,  0xd4,  0x01,  0x0c,  0x1c,  0x3e,  0x1c,  0x3c,  0x00,  0xbb,  0x00,
-  0x00,  0x10,  0xba,  0x19,  0x02,  0x80,  0x32,  0xf0,  0x7c,  0x0d,  0x02,  0x13,  0xba,  0x13,  0x18,  0x40,
-  0x00,  0x57,  0x01,  0xea,  0x02,  0xfc,  0x03,  0xfc,  0x3e,  0x00,  0x6c,  0x01,  0x6e,  0x01,  0x74,  0x01,
-  0x76,  0x01,  0xb9,  0x54,  0x3e,  0x57,  0x00,  0x80,  0x03,  0xe6,  0xb6,  0x00,  0xc0,  0x00,  0x01,  0x01,
-  0x3e,  0x01,  0x7a,  0x01,  0xca,  0x08,  0xce,  0x10,  0x16,  0x11,  0x04,  0x12,  0x08,  0x12,  0x02,  0x4a,
-  0xbb,  0x55,  0x3c,  0x56,  0x03,  0x58,  0x1b,  0x80,  0x30,  0xe4,  0x4b,  0xe4,  0x5d,  0xf0,  0x02,  0xfa,
-  0x20,  0x00,  0x32,  0x00,  0x40,  0x00,  0x80,  0x00,  0x24,  0x01,  0x3c,  0x01,  0x68,  0x01,  0x6a,  0x01,
-  0x70,  0x01,  0x72,  0x01,  0x78,  0x01,  0x7c,  0x01,  0x62,  0x0a,  0x86,  0x0d,  0x06,  0x13,  0x4c,  0x1c,
-  0x04,  0x80,  0x4a,  0xe4,  0x02,  0xee,  0x5b,  0xf0,  0x03,  0xf7,  0x0c,  0x00,  0x0f,  0x00,  0x47,  0x00,
-  0xbe,  0x00,  0x00,  0x01,  0x20,  0x11,  0x5c,  0x16,  0x32,  0x1c,  0x38,  0x1c,  0x4e,  0x1c,  0x10,  0x44,
-  0x00,  0x4c,  0x04,  0xea,  0x5c,  0xf0,  0xa7,  0xf0,  0x04,  0xf6,  0x03,  0xfa,  0x05,  0x00,  0x34,  0x00,
-  0x36,  0x00,  0x98,  0x00,  0xcc,  0x00,  0x20,  0x01,  0x4e,  0x01,  0x4a,  0x0b,  0x42,  0x0c,  0x12,  0x0f,
-  0x0c,  0x10,  0x22,  0x11,  0x0a,  0x12,  0x04,  0x13,  0x30,  0x1c,  0x02,  0x48,  0x00,  0x4e,  0x42,  0x54,
-  0x44,  0x55,  0xbd,  0x56,  0x06,  0x83,  0x00,  0xdc,  0x05,  0xf0,  0x09,  0xf0,  0x59,  0xf0,  0xb8,  0xf0,
-  0x4b,  0xf4,  0x06,  0xf7,  0x0e,  0xf7,  0x04,  0xfc,  0x05,  0xfc,  0x06,  0x00,  0x19,  0x00,  0x33,  0x00,
-  0x9b,  0x00,  0xa4,  0x00,  0xb5,  0x00,  0xba,  0x00,  0xd0,  0x00,  0xe1,  0x00,  0xe7,  0x00,  0xe2,  0x03,
-  0x08,  0x0f,  0x02,  0x10,  0x04,  0x10,  0x0a,  0x10,  0x0a,  0x13,  0x0c,  0x13,  0x12,  0x13,  0x24,  0x14,
-  0x34,  0x14,  0x04,  0x16,  0x08,  0x16,  0xa4,  0x17,  0x20,  0x1c,  0x34,  0x1c,  0x36,  0x1c,  0x08,  0x44,
-  0x38,  0x44,  0x91,  0x44,  0x0a,  0x45,  0x48,  0x46,  0x01,  0x48,  0x68,  0x54,  0x3a,  0x55,  0x83,  0x55,
-  0xe5,  0x55,  0xb0,  0x57,  0x01,  0x58,  0x83,  0x59,  0x05,  0xe6,  0x0b,  0xf0,  0x0c,  0xf0,  0x04,  0xf8,
-  0x05,  0xf8,  0x07,  0x00,  0x0a,  0x00,  0x1c,  0x00,  0x1e,  0x00,  0x9e,  0x00,  0xa8,  0x00,  0xaa,  0x00,
-  0xb9,  0x00,  0xe0,  0x00,  0x22,  0x01,  0x26,  0x01,  0x79,  0x01,  0x7e,  0x01,  0xc4,  0x01,  0xc6,  0x01,
-  0x80,  0x02,  0x5e,  0x03,  0xee,  0x04,  0x9a,  0x06,  0xf8,  0x07,  0x62,  0x08,  0x68,  0x08,  0x69,  0x08,
-  0xd6,  0x08,  0xe9,  0x09,  0xfa,  0x0b,  0x2e,  0x0f,  0x12,  0x10,  0x1a,  0x10,  0xed,  0x10,  0xf1,  0x10,
-  0x2a,  0x11,  0x06,  0x12,  0x0c,  0x12,  0x3e,  0x12,  0x10,  0x13,  0x16,  0x13,  0x1e,  0x13,  0x46,  0x14,
-  0x76,  0x14,  0x82,  0x14,  0x36,  0x15,  0xca,  0x15,  0x6b,  0x18,  0xbe,  0x18,  0xca,  0x18,  0xe6,  0x19,
-  0x12,  0x1c,  0x46,  0x1c,  0x9c,  0x32,  0x00,  0x40,  0x0e,  0x47,  0xfe,  0x9c,  0xf0,  0x2b,  0x02,  0xfe,
-  0xac,  0x0d,  0xff,  0x10,  0x00,  0x00,  0xd7,  0xfe,  0xe8,  0x19,  0x00,  0xd6,  0xfe,  0x84,  0x01,  0xff,
-  0x03,  0x00,  0x00,  0xfe,  0x93,  0x15,  0xfe,  0x0f,  0x05,  0xff,  0x38,  0x00,  0x00,  0xfe,  0x57,  0x24,
-  0x00,  0xfe,  0x4c,  0x00,  0x5b,  0xff,  0x04,  0x00,  0x00,  0x11,  0xff,  0x09,  0x00,  0x00,  0xff,  0x08,
-  0x01,  0x01,  0xff,  0x08,  0xff,  0xff,  0xff,  0x27,  0x00,  0x00,  0xff,  0x10,  0xff,  0xff,  0xff,  0x11,
-  0x00,  0x00,  0xfe,  0x78,  0x56,  0xfe,  0x34,  0x12,  0xff,  0x21,  0x00,  0x00,  0xfe,  0x04,  0xf7,  0xd6,
-  0x2c,  0x99,  0x0a,  0x01,  0xfe,  0xc2,  0x0f,  0xfe,  0x04,  0xf7,  0xd6,  0x99,  0x0a,  0x42,  0x2c,  0xfe,
-  0x3d,  0xf0,  0xfe,  0x06,  0x02,  0xfe,  0x20,  0xf0,  0xa7,  0xfe,  0x91,  0xf0,  0xfe,  0xf4,  0x01,  0xfe,
-  0x90,  0xf0,  0xfe,  0xf4,  0x01,  0xfe,  0x8f,  0xf0,  0xa7,  0x03,  0x5d,  0x4d,  0x02,  0xfe,  0xc8,  0x0d,
-  0x01,  0xfe,  0x38,  0x0e,  0xfe,  0xdd,  0x12,  0xfe,  0xfc,  0x10,  0xfe,  0x28,  0x1c,  0x03,  0xfe,  0xa6,
-  0x00,  0xfe,  0xd3,  0x12,  0x41,  0x14,  0xfe,  0xa6,  0x00,  0xc2,  0xfe,  0x48,  0xf0,  0xfe,  0x8a,  0x02,
-  0xfe,  0x49,  0xf0,  0xfe,  0xa4,  0x02,  0xfe,  0x4a,  0xf0,  0xfe,  0xc2,  0x02,  0xfe,  0x46,  0xf0,  0xfe,
-  0x54,  0x02,  0xfe,  0x47,  0xf0,  0xfe,  0x5a,  0x02,  0xfe,  0x43,  0xf0,  0xfe,  0x48,  0x02,  0xfe,  0x44,
-  0xf0,  0xfe,  0x4c,  0x02,  0xfe,  0x45,  0xf0,  0xfe,  0x50,  0x02,  0x18,  0x0a,  0xaa,  0x18,  0x06,  0x14,
-  0xa1,  0x02,  0x2b,  0xfe,  0x00,  0x1c,  0xe7,  0xfe,  0x02,  0x1c,  0xe6,  0xfe,  0x1e,  0x1c,  0xfe,  0xe9,
-  0x10,  0x01,  0xfe,  0x18,  0x18,  0xfe,  0xe7,  0x10,  0xfe,  0x06,  0xfc,  0xce,  0x09,  0x70,  0x01,  0xa8,
-  0x02,  0x2b,  0x15,  0x59,  0x39,  0xa2,  0x01,  0xfe,  0x58,  0x10,  0x09,  0x70,  0x01,  0x87,  0xfe,  0xbd,
-  0x10,  0x09,  0x70,  0x01,  0x87,  0xfe,  0xad,  0x10,  0xfe,  0x16,  0x1c,  0xfe,  0x58,  0x1c,  0x18,  0x06,
-  0x14,  0xa1,  0x2c,  0x1c,  0x2b,  0xfe,  0x3d,  0xf0,  0xfe,  0x06,  0x02,  0x23,  0xfe,  0x98,  0x02,  0xfe,
-  0x5a,  0x1c,  0xf8,  0xfe,  0x14,  0x1c,  0x15,  0xfe,  0x30,  0x00,  0x39,  0xa2,  0x01,  0xfe,  0x48,  0x10,
-  0x18,  0x06,  0x14,  0xa1,  0x02,  0xd7,  0x22,  0x20,  0x07,  0x11,  0x35,  0xfe,  0x69,  0x10,  0x18,  0x06,
-  0x14,  0xa1,  0xfe,  0x04,  0xec,  0x20,  0x4f,  0x43,  0x13,  0x20,  0xfe,  0x05,  0xf6,  0xce,  0x01,  0xfe,
-  0x4a,  0x17,  0x08,  0x54,  0x58,  0x37,  0x12,  0x2f,  0x42,  0x92,  0x01,  0xfe,  0x82,  0x16,  0x02,  0x2b,
-  0x09,  0x46,  0x01,  0x0e,  0x07,  0x00,  0x66,  0x01,  0x73,  0xfe,  0x18,  0x10,  0xfe,  0x41,  0x58,  0x09,
-  0xa4,  0x01,  0x0e,  0xfe,  0xc8,  0x54,  0x6b,  0xfe,  0x10,  0x03,  0x01,  0xfe,  0x82,  0x16,  0x02,  0x2b,
-  0x2c,  0x4f,  0xfe,  0x02,  0xe8,  0x2a,  0xfe,  0xbf,  0x57,  0xfe,  0x9e,  0x43,  0xfe,  0x77,  0x57,  0xfe,
-  0x27,  0xf0,  0xfe,  0xe0,  0x01,  0xfe,  0x07,  0x4b,  0xfe,  0x20,  0xf0,  0xa7,  0xfe,  0x40,  0x1c,  0x1c,
-  0xd9,  0xfe,  0x26,  0xf0,  0xfe,  0x5a,  0x03,  0xfe,  0xa0,  0xf0,  0xfe,  0x48,  0x03,  0xfe,  0x11,  0xf0,
-  0xa7,  0xfe,  0xef,  0x10,  0xfe,  0x9f,  0xf0,  0xfe,  0x68,  0x03,  0xf9,  0x10,  0xfe,  0x11,  0x00,  0x02,
-  0x65,  0x2c,  0xfe,  0x48,  0x1c,  0xf9,  0x08,  0x05,  0x1b,  0xfe,  0x18,  0x13,  0x21,  0x22,  0xa3,  0xb7,
-  0x13,  0xa3,  0x09,  0x46,  0x01,  0x0e,  0xb7,  0x78,  0x01,  0xfe,  0xb4,  0x16,  0x12,  0xd1,  0x1c,  0xd9,
-  0xfe,  0x01,  0xf0,  0xd9,  0xfe,  0x82,  0xf0,  0xfe,  0x96,  0x03,  0xfa,  0x12,  0xfe,  0xe4,  0x00,  0x27,
-  0xfe,  0xa8,  0x03,  0x1c,  0x34,  0x1d,  0xfe,  0xb8,  0x03,  0x01,  0x4b,  0xfe,  0x06,  0xf0,  0xfe,  0xc8,
-  0x03,  0x95,  0x86,  0xfe,  0x0a,  0xf0,  0xfe,  0x8a,  0x06,  0x02,  0x24,  0x03,  0x70,  0x28,  0x17,  0xfe,
-  0xfa,  0x04,  0x15,  0x6d,  0x01,  0x36,  0x7b,  0xfe,  0x6a,  0x02,  0x02,  0xd8,  0xf9,  0x2c,  0x99,  0x19,
-  0xfe,  0x67,  0x1b,  0xfe,  0xbf,  0x57,  0xfe,  0x77,  0x57,  0xfe,  0x48,  0x1c,  0x74,  0x01,  0xaf,  0x8c,
-  0x09,  0x46,  0x01,  0x0e,  0x07,  0x00,  0x17,  0xda,  0x09,  0xd1,  0x01,  0x0e,  0x8d,  0x51,  0x64,  0x79,
-  0x2a,  0x03,  0x70,  0x28,  0xfe,  0x10,  0x12,  0x15,  0x6d,  0x01,  0x36,  0x7b,  0xfe,  0x6a,  0x02,  0x02,
-  0xd8,  0xc7,  0x81,  0xc8,  0x83,  0x1c,  0x24,  0x27,  0xfe,  0x40,  0x04,  0x1d,  0xfe,  0x3c,  0x04,  0x3b,
-  0xfe,  0xa0,  0x00,  0xfe,  0x9b,  0x57,  0xfe,  0x4e,  0x12,  0x2d,  0xff,  0x02,  0x00,  0x10,  0x01,  0x0b,
-  0x1d,  0xfe,  0xe4,  0x04,  0x2d,  0x01,  0x0b,  0x1d,  0x24,  0x33,  0x31,  0xde,  0xfe,  0x4c,  0x44,  0xfe,
-  0x4c,  0x12,  0x51,  0xfe,  0x44,  0x48,  0x0f,  0x6f,  0xfe,  0x4c,  0x54,  0x6b,  0xda,  0x4f,  0x79,  0x2a,
-  0xfe,  0x06,  0x80,  0xfe,  0x48,  0x47,  0xfe,  0x62,  0x13,  0x08,  0x05,  0x1b,  0xfe,  0x2a,  0x13,  0x32,
-  0x07,  0x82,  0xfe,  0x52,  0x13,  0xfe,  0x20,  0x10,  0x0f,  0x6f,  0xfe,  0x4c,  0x54,  0x6b,  0xda,  0xfe,
-  0x06,  0x80,  0xfe,  0x48,  0x47,  0xfe,  0x40,  0x13,  0x08,  0x05,  0x1b,  0xfe,  0x08,  0x13,  0x32,  0x07,
-  0x82,  0xfe,  0x30,  0x13,  0x08,  0x05,  0x1b,  0xfe,  0x1c,  0x12,  0x15,  0x9d,  0x08,  0x05,  0x06,  0x4d,
-  0x15,  0xfe,  0x0d,  0x00,  0x01,  0x36,  0x7b,  0xfe,  0x64,  0x0d,  0x02,  0x24,  0x2d,  0x12,  0xfe,  0xe6,
-  0x00,  0xfe,  0x1c,  0x90,  0xfe,  0x40,  0x5c,  0x04,  0x15,  0x9d,  0x01,  0x36,  0x02,  0x2b,  0xfe,  0x42,
-  0x5b,  0x99,  0x19,  0xfe,  0x46,  0x59,  0xfe,  0xbf,  0x57,  0xfe,  0x77,  0x57,  0xfe,  0x87,  0x80,  0xfe,
-  0x31,  0xe4,  0x5b,  0x08,  0x05,  0x0a,  0xfe,  0x84,  0x13,  0xfe,  0x20,  0x80,  0x07,  0x19,  0xfe,  0x7c,
-  0x12,  0x53,  0x05,  0x06,  0xfe,  0x6c,  0x13,  0x03,  0xfe,  0xa2,  0x00,  0x28,  0x17,  0xfe,  0x90,  0x05,
-  0xfe,  0x31,  0xe4,  0x5a,  0x53,  0x05,  0x0a,  0xfe,  0x56,  0x13,  0x03,  0xfe,  0xa0,  0x00,  0x28,  0xfe,
-  0x4e,  0x12,  0x67,  0xff,  0x02,  0x00,  0x10,  0x27,  0xfe,  0x48,  0x05,  0x1c,  0x34,  0xfe,  0x89,  0x48,
-  0xff,  0x02,  0x00,  0x10,  0x27,  0xfe,  0x56,  0x05,  0x26,  0xfe,  0xa8,  0x05,  0x12,  0xfe,  0xe3,  0x00,
-  0x21,  0x53,  0xfe,  0x4a,  0xf0,  0xfe,  0x76,  0x05,  0xfe,  0x49,  0xf0,  0xfe,  0x70,  0x05,  0x88,  0x25,
-  0xfe,  0x21,  0x00,  0xab,  0x25,  0xfe,  0x22,  0x00,  0xaa,  0x25,  0x58,  0xfe,  0x09,  0x48,  0xff,  0x02,
-  0x00,  0x10,  0x27,  0xfe,  0x86,  0x05,  0x26,  0xfe,  0xa8,  0x05,  0xfe,  0xe2,  0x08,  0x53,  0x05,  0xcb,
-  0x4d,  0x01,  0xb0,  0x25,  0x06,  0x13,  0xd3,  0x39,  0xfe,  0x27,  0x01,  0x08,  0x05,  0x1b,  0xfe,  0x22,
-  0x12,  0x41,  0x01,  0xb2,  0x15,  0x9d,  0x08,  0x05,  0x06,  0x4d,  0x15,  0xfe,  0x0d,  0x00,  0x01,  0x36,
-  0x7b,  0xfe,  0x64,  0x0d,  0x02,  0x24,  0x03,  0xfe,  0x9c,  0x00,  0x28,  0xeb,  0x03,  0x5c,  0x28,  0xfe,
-  0x36,  0x13,  0x41,  0x01,  0xb2,  0x26,  0xfe,  0x18,  0x06,  0x09,  0x06,  0x53,  0x05,  0x1f,  0xfe,  0x02,
-  0x12,  0x50,  0x01,  0xfe,  0x9e,  0x15,  0x1d,  0xfe,  0x0e,  0x06,  0x12,  0xa5,  0x01,  0x4b,  0x12,  0xfe,
-  0xe5,  0x00,  0x03,  0x5c,  0xc1,  0x0c,  0x5c,  0x03,  0xcd,  0x28,  0xfe,  0x62,  0x12,  0x03,  0x45,  0x28,
-  0xfe,  0x5a,  0x13,  0x01,  0xfe,  0x0c,  0x19,  0x01,  0xfe,  0x76,  0x19,  0xfe,  0x43,  0x48,  0xc4,  0xcc,
-  0x0f,  0x71,  0xff,  0x02,  0x00,  0x57,  0x52,  0x93,  0x1e,  0x43,  0x8b,  0xc4,  0x6e,  0x41,  0x01,  0xb2,
-  0x26,  0xfe,  0x82,  0x06,  0x53,  0x05,  0x1a,  0xe9,  0x91,  0x09,  0x59,  0x01,  0xfe,  0xcc,  0x15,  0x1d,
-  0xfe,  0x78,  0x06,  0x12,  0xa5,  0x01,  0x4b,  0x12,  0xfe,  0xe5,  0x00,  0x03,  0x45,  0xc1,  0x0c,  0x45,
-  0x18,  0x06,  0x01,  0xb2,  0xfa,  0x76,  0x74,  0x01,  0xaf,  0x8c,  0x12,  0xfe,  0xe2,  0x00,  0x27,  0xdb,
-  0x1c,  0x34,  0xfe,  0x0a,  0xf0,  0xfe,  0xb6,  0x06,  0x94,  0xfe,  0x6c,  0x07,  0xfe,  0x06,  0xf0,  0xfe,
-  0x74,  0x07,  0x95,  0x86,  0x02,  0x24,  0x08,  0x05,  0x0a,  0xfe,  0x2e,  0x12,  0x16,  0x19,  0x01,  0x0b,
-  0x16,  0x00,  0x01,  0x0b,  0x16,  0x00,  0x01,  0x0b,  0x16,  0x00,  0x01,  0x0b,  0xfe,  0x99,  0xa4,  0x01,
-  0x0b,  0x16,  0x00,  0x02,  0xfe,  0x42,  0x08,  0x68,  0x05,  0x1a,  0xfe,  0x38,  0x12,  0x08,  0x05,  0x1a,
-  0xfe,  0x30,  0x13,  0x16,  0xfe,  0x1b,  0x00,  0x01,  0x0b,  0x16,  0x00,  0x01,  0x0b,  0x16,  0x00,  0x01,
-  0x0b,  0x16,  0x00,  0x01,  0x0b,  0x16,  0x06,  0x01,  0x0b,  0x16,  0x00,  0x02,  0xe2,  0x6c,  0x58,  0xbe,
-  0x50,  0xfe,  0x9a,  0x81,  0x55,  0x1b,  0x7a,  0xfe,  0x42,  0x07,  0x09,  0x1b,  0xfe,  0x09,  0x6f,  0xba,
-  0xfe,  0xca,  0x45,  0xfe,  0x32,  0x12,  0x69,  0x6d,  0x8b,  0x6c,  0x7f,  0x27,  0xfe,  0x54,  0x07,  0x1c,
-  0x34,  0xfe,  0x0a,  0xf0,  0xfe,  0x42,  0x07,  0x95,  0x86,  0x94,  0xfe,  0x6c,  0x07,  0x02,  0x24,  0x01,
-  0x4b,  0x02,  0xdb,  0x16,  0x1f,  0x02,  0xdb,  0xfe,  0x9c,  0xf7,  0xdc,  0xfe,  0x2c,  0x90,  0xfe,  0xae,
-  0x90,  0x56,  0xfe,  0xda,  0x07,  0x0c,  0x60,  0x14,  0x61,  0x08,  0x54,  0x5a,  0x37,  0x22,  0x20,  0x07,
-  0x11,  0xfe,  0x0e,  0x12,  0x8d,  0xfe,  0x80,  0x80,  0x39,  0x20,  0x6a,  0x2a,  0xfe,  0x06,  0x10,  0xfe,
-  0x83,  0xe7,  0xfe,  0x48,  0x00,  0xab,  0xfe,  0x03,  0x40,  0x08,  0x54,  0x5b,  0x37,  0x01,  0xb3,  0xb8,
-  0xfe,  0x1f,  0x40,  0x13,  0x62,  0x01,  0xef,  0xfe,  0x08,  0x50,  0xfe,  0x8a,  0x50,  0xfe,  0x44,  0x51,
-  0xfe,  0xc6,  0x51,  0x88,  0xfe,  0x08,  0x90,  0xfe,  0x8a,  0x90,  0x0c,  0x5e,  0x14,  0x5f,  0xfe,  0x0c,
-  0x90,  0xfe,  0x8e,  0x90,  0xfe,  0x40,  0x50,  0xfe,  0xc2,  0x50,  0x0c,  0x3d,  0x14,  0x3e,  0xfe,  0x4a,
-  0x10,  0x08,  0x05,  0x5a,  0xfe,  0x2a,  0x12,  0xfe,  0x2c,  0x90,  0xfe,  0xae,  0x90,  0x0c,  0x60,  0x14,
-  0x61,  0x08,  0x05,  0x5b,  0x8b,  0x01,  0xb3,  0xfe,  0x1f,  0x80,  0x13,  0x62,  0xfe,  0x44,  0x90,  0xfe,
-  0xc6,  0x90,  0x0c,  0x3f,  0x14,  0x40,  0xfe,  0x08,  0x90,  0xfe,  0x8a,  0x90,  0x0c,  0x5e,  0x14,  0x5f,
-  0xfe,  0x40,  0x90,  0xfe,  0xc2,  0x90,  0x0c,  0x3d,  0x14,  0x3e,  0x0c,  0x2e,  0x14,  0x3c,  0x21,  0x0c,
-  0x49,  0x0c,  0x63,  0x08,  0x54,  0x1f,  0x37,  0x2c,  0x0f,  0xfe,  0x4e,  0x11,  0x27,  0xdd,  0xfe,  0x9e,
-  0xf0,  0xfe,  0x76,  0x08,  0xbc,  0x17,  0x34,  0x2c,  0x77,  0xe6,  0xc5,  0xfe,  0x9a,  0x08,  0xc6,  0xfe,
-  0xb8,  0x08,  0x94,  0xfe,  0x8e,  0x08,  0xfe,  0x06,  0xf0,  0xfe,  0x94,  0x08,  0x95,  0x86,  0x02,  0x24,
-  0x01,  0x4b,  0xfe,  0xc9,  0x10,  0x16,  0x1f,  0xfe,  0xc9,  0x10,  0x68,  0x05,  0x06,  0xfe,  0x10,  0x12,
-  0x68,  0x05,  0x0a,  0x4e,  0x08,  0x05,  0x0a,  0xfe,  0x90,  0x12,  0xfe,  0x2e,  0x1c,  0x02,  0xfe,  0x18,
-  0x0b,  0x68,  0x05,  0x06,  0x4e,  0x68,  0x05,  0x0a,  0xfe,  0x7a,  0x12,  0xfe,  0x2c,  0x1c,  0xfe,  0xaa,
-  0xf0,  0xfe,  0xd2,  0x09,  0xfe,  0xac,  0xf0,  0xfe,  0x00,  0x09,  0x02,  0xfe,  0xde,  0x09,  0xfe,  0xb7,
-  0xf0,  0xfe,  0xfc,  0x08,  0xfe,  0x02,  0xf6,  0x1a,  0x50,  0xfe,  0x70,  0x18,  0xfe,  0xf1,  0x18,  0xfe,
-  0x40,  0x55,  0xfe,  0xe1,  0x55,  0xfe,  0x10,  0x58,  0xfe,  0x91,  0x58,  0xfe,  0x14,  0x59,  0xfe,  0x95,
-  0x59,  0x1c,  0x85,  0xfe,  0x8c,  0xf0,  0xfe,  0xfc,  0x08,  0xfe,  0xac,  0xf0,  0xfe,  0xf0,  0x08,  0xb5,
-  0xfe,  0xcb,  0x10,  0xfe,  0xad,  0xf0,  0xfe,  0x0c,  0x09,  0x02,  0xfe,  0x18,  0x0b,  0xb6,  0xfe,  0xbf,
-  0x10,  0xfe,  0x2b,  0xf0,  0x85,  0xf4,  0x1e,  0xfe,  0x00,  0xfe,  0xfe,  0x1c,  0x12,  0xc2,  0xfe,  0xd2,
-  0xf0,  0x85,  0xfe,  0x76,  0x18,  0x1e,  0x19,  0x17,  0x85,  0x03,  0xd2,  0x1e,  0x06,  0x17,  0x85,  0xc5,
-  0x4a,  0xc6,  0x4a,  0xb5,  0xb6,  0xfe,  0x89,  0x10,  0x74,  0x67,  0x2d,  0x15,  0x9d,  0x01,  0x36,  0x10,
-  0xfe,  0x35,  0x00,  0xfe,  0x01,  0xf0,  0x65,  0x10,  0x80,  0x02,  0x65,  0xfe,  0x98,  0x80,  0xfe,  0x19,
-  0xe4,  0x0a,  0xfe,  0x1a,  0x12,  0x51,  0xfe,  0x19,  0x82,  0xfe,  0x6c,  0x18,  0xfe,  0x44,  0x54,  0xbe,
-  0xfe,  0x19,  0x81,  0xfe,  0x74,  0x18,  0x8f,  0x90,  0x17,  0xfe,  0xce,  0x08,  0x02,  0x4a,  0x08,  0x05,
-  0x5a,  0xec,  0x03,  0x2e,  0x29,  0x3c,  0x0c,  0x3f,  0x14,  0x40,  0x9b,  0x2e,  0x9c,  0x3c,  0xfe,  0x6c,
-  0x18,  0xfe,  0xed,  0x18,  0xfe,  0x44,  0x54,  0xfe,  0xe5,  0x54,  0x3a,  0x3f,  0x3b,  0x40,  0x03,  0x49,
-  0x29,  0x63,  0x8f,  0xfe,  0xe3,  0x54,  0xfe,  0x74,  0x18,  0xfe,  0xf5,  0x18,  0x8f,  0xfe,  0xe3,  0x54,
-  0x90,  0xc0,  0x56,  0xfe,  0xce,  0x08,  0x02,  0x4a,  0xfe,  0x37,  0xf0,  0xfe,  0xda,  0x09,  0xfe,  0x8b,
-  0xf0,  0xfe,  0x60,  0x09,  0x02,  0x4a,  0x08,  0x05,  0x0a,  0x23,  0xfe,  0xfa,  0x0a,  0x3a,  0x49,  0x3b,
-  0x63,  0x56,  0xfe,  0x3e,  0x0a,  0x0f,  0xfe,  0xc0,  0x07,  0x41,  0x98,  0x00,  0xad,  0xfe,  0x01,  0x59,
-  0xfe,  0x52,  0xf0,  0xfe,  0x0c,  0x0a,  0x8f,  0x7a,  0xfe,  0x24,  0x0a,  0x3a,  0x49,  0x8f,  0xfe,  0xe3,
-  0x54,  0x57,  0x49,  0x7d,  0x63,  0xfe,  0x14,  0x58,  0xfe,  0x95,  0x58,  0x02,  0x4a,  0x3a,  0x49,  0x3b,
-  0x63,  0xfe,  0x14,  0x59,  0xfe,  0x95,  0x59,  0xbe,  0x57,  0x49,  0x57,  0x63,  0x02,  0x4a,  0x08,  0x05,
-  0x5a,  0xfe,  0x82,  0x12,  0x08,  0x05,  0x1f,  0xfe,  0x66,  0x13,  0x22,  0x62,  0xb7,  0xfe,  0x03,  0xa1,
-  0xfe,  0x83,  0x80,  0xfe,  0xc8,  0x44,  0xfe,  0x2e,  0x13,  0xfe,  0x04,  0x91,  0xfe,  0x86,  0x91,  0x6a,
-  0x2a,  0xfe,  0x40,  0x59,  0xfe,  0xc1,  0x59,  0x56,  0xe0,  0x03,  0x60,  0x29,  0x61,  0x0c,  0x7f,  0x14,
-  0x80,  0x57,  0x60,  0x7d,  0x61,  0x01,  0xb3,  0xb8,  0x6a,  0x2a,  0x13,  0x62,  0x9b,  0x2e,  0x9c,  0x3c,
-  0x3a,  0x3f,  0x3b,  0x40,  0x90,  0xc0,  0xfe,  0x04,  0xfa,  0x2e,  0xfe,  0x05,  0xfa,  0x3c,  0x01,  0xef,
-  0xfe,  0x36,  0x10,  0x21,  0x0c,  0x7f,  0x0c,  0x80,  0x3a,  0x3f,  0x3b,  0x40,  0xe4,  0x08,  0x05,  0x1f,
-  0x17,  0xe0,  0x3a,  0x3d,  0x3b,  0x3e,  0x08,  0x05,  0xfe,  0xf7,  0x00,  0x37,  0x03,  0x5e,  0x29,  0x5f,
-  0xfe,  0x10,  0x58,  0xfe,  0x91,  0x58,  0x57,  0x49,  0x7d,  0x63,  0x02,  0xfe,  0xf4,  0x09,  0x08,  0x05,
-  0x1f,  0x17,  0xe0,  0x08,  0x05,  0xfe,  0xf7,  0x00,  0x37,  0xbe,  0xfe,  0x19,  0x81,  0x50,  0xfe,  0x10,
-  0x90,  0xfe,  0x92,  0x90,  0xfe,  0xd3,  0x10,  0x32,  0x07,  0xa6,  0x17,  0xfe,  0x08,  0x09,  0x12,  0xa6,
-  0x08,  0x05,  0x0a,  0xfe,  0x14,  0x13,  0x03,  0x3d,  0x29,  0x3e,  0x56,  0xfe,  0x08,  0x09,  0xfe,  0x0c,
-  0x58,  0xfe,  0x8d,  0x58,  0x02,  0x4a,  0x21,  0x41,  0xfe,  0x19,  0x80,  0xe7,  0x08,  0x05,  0x0a,  0xfe,
-  0x1a,  0x12,  0xfe,  0x6c,  0x19,  0xfe,  0x19,  0x41,  0xf4,  0xc2,  0xfe,  0xd1,  0xf0,  0xe2,  0x15,  0x7e,
-  0x01,  0x36,  0x10,  0xfe,  0x44,  0x00,  0xfe,  0x8e,  0x10,  0xfe,  0x6c,  0x19,  0x57,  0x3d,  0xfe,  0xed,
-  0x19,  0x7d,  0x3e,  0xfe,  0x0c,  0x51,  0xfe,  0x8e,  0x51,  0xf4,  0x1e,  0xfe,  0x00,  0xff,  0x35,  0xfe,
-  0x74,  0x10,  0xc2,  0xfe,  0xd2,  0xf0,  0xfe,  0xa6,  0x0b,  0xfe,  0x76,  0x18,  0x1e,  0x19,  0x8a,  0x03,
-  0xd2,  0x1e,  0x06,  0xfe,  0x08,  0x13,  0x10,  0xfe,  0x16,  0x00,  0x02,  0x65,  0xfe,  0xd1,  0xf0,  0xfe,
-  0xb8,  0x0b,  0x15,  0x7e,  0x01,  0x36,  0x10,  0xfe,  0x17,  0x00,  0xfe,  0x42,  0x10,  0xfe,  0xce,  0xf0,
-  0xfe,  0xbe,  0x0b,  0xfe,  0x3c,  0x10,  0xfe,  0xcd,  0xf0,  0xfe,  0xca,  0x0b,  0x10,  0xfe,  0x22,  0x00,
-  0x02,  0x65,  0xfe,  0xcb,  0xf0,  0xfe,  0xd6,  0x0b,  0x10,  0xfe,  0x24,  0x00,  0x02,  0x65,  0xfe,  0xd0,
-  0xf0,  0xfe,  0xe0,  0x0b,  0x10,  0x9e,  0xe5,  0xfe,  0xcf,  0xf0,  0xfe,  0xea,  0x0b,  0x10,  0x58,  0xfe,
-  0x10,  0x10,  0xfe,  0xcc,  0xf0,  0xe2,  0x68,  0x05,  0x1f,  0x4d,  0x10,  0xfe,  0x12,  0x00,  0x2c,  0x0f,
-  0xfe,  0x4e,  0x11,  0x27,  0xfe,  0x00,  0x0c,  0xfe,  0x9e,  0xf0,  0xfe,  0x14,  0x0c,  0xbc,  0x17,  0x34,
-  0x2c,  0x77,  0xe6,  0xc5,  0x24,  0xc6,  0x24,  0x2c,  0xfa,  0x27,  0xfe,  0x20,  0x0c,  0x1c,  0x34,  0x94,
-  0xfe,  0x3c,  0x0c,  0x95,  0x86,  0xc5,  0xdc,  0xc6,  0xdc,  0x02,  0x24,  0x01,  0x4b,  0xfe,  0xdb,  0x10,
-  0x12,  0xfe,  0xe8,  0x00,  0xb5,  0xb6,  0x74,  0xc7,  0x81,  0xc8,  0x83,  0xfe,  0x89,  0xf0,  0x24,  0x33,
-  0x31,  0xe1,  0xc7,  0x81,  0xc8,  0x83,  0x27,  0xfe,  0x66,  0x0c,  0x1d,  0x24,  0x33,  0x31,  0xdf,  0xbc,
-  0x4e,  0x10,  0xfe,  0x42,  0x00,  0x02,  0x65,  0x7c,  0x06,  0xfe,  0x81,  0x49,  0x17,  0xfe,  0x2c,  0x0d,
-  0x08,  0x05,  0x0a,  0xfe,  0x44,  0x13,  0x10,  0x00,  0x55,  0x0a,  0xfe,  0x54,  0x12,  0x55,  0xfe,  0x28,
-  0x00,  0x23,  0xfe,  0x9a,  0x0d,  0x09,  0x46,  0x01,  0x0e,  0x07,  0x00,  0x66,  0x44,  0xfe,  0x28,  0x00,
-  0xfe,  0xe2,  0x10,  0x01,  0xf5,  0x01,  0xf6,  0x09,  0xa4,  0x01,  0xfe,  0x26,  0x0f,  0x64,  0x12,  0x2f,
-  0x01,  0x73,  0x02,  0x2b,  0x10,  0xfe,  0x44,  0x00,  0x55,  0x0a,  0xe9,  0x44,  0x0a,  0xfe,  0xb4,  0x10,
-  0x01,  0xb0,  0x44,  0x0a,  0xfe,  0xaa,  0x10,  0x01,  0xb0,  0xfe,  0x19,  0x82,  0xfe,  0x34,  0x46,  0xac,
-  0x44,  0x0a,  0x10,  0xfe,  0x43,  0x00,  0xfe,  0x96,  0x10,  0x08,  0x54,  0x0a,  0x37,  0x01,  0xf5,  0x01,
-  0xf6,  0x64,  0x12,  0x2f,  0x01,  0x73,  0x99,  0x0a,  0x64,  0x42,  0x92,  0x02,  0xfe,  0x2e,  0x03,  0x08,
-  0x05,  0x0a,  0x8a,  0x44,  0x0a,  0x10,  0x00,  0xfe,  0x5c,  0x10,  0x68,  0x05,  0x1a,  0xfe,  0x58,  0x12,
-  0x08,  0x05,  0x1a,  0xfe,  0x50,  0x13,  0xfe,  0x1c,  0x1c,  0xfe,  0x9d,  0xf0,  0xfe,  0x50,  0x0d,  0xfe,
-  0x1c,  0x1c,  0xfe,  0x9d,  0xf0,  0xfe,  0x56,  0x0d,  0x08,  0x54,  0x1a,  0x37,  0xfe,  0xa9,  0x10,  0x10,
-  0xfe,  0x15,  0x00,  0xfe,  0x04,  0xe6,  0x0a,  0x50,  0xfe,  0x2e,  0x10,  0x10,  0xfe,  0x13,  0x00,  0xfe,
-  0x10,  0x10,  0x10,  0x6f,  0xab,  0x10,  0xfe,  0x41,  0x00,  0xaa,  0x10,  0xfe,  0x24,  0x00,  0x8c,  0xb5,
-  0xb6,  0x74,  0x03,  0x70,  0x28,  0x23,  0xd8,  0x50,  0xfe,  0x04,  0xe6,  0x1a,  0xfe,  0x9d,  0x41,  0xfe,
-  0x1c,  0x42,  0x64,  0x01,  0xe3,  0x02,  0x2b,  0xf8,  0x15,  0x0a,  0x39,  0xa0,  0xb4,  0x15,  0xfe,  0x31,
-  0x00,  0x39,  0xa2,  0x01,  0xfe,  0x48,  0x10,  0x02,  0xd7,  0x42,  0xfe,  0x06,  0xec,  0xd0,  0xfc,  0x44,
-  0x1b,  0xfe,  0xce,  0x45,  0x35,  0x42,  0xfe,  0x06,  0xea,  0xd0,  0xfe,  0x47,  0x4b,  0x91,  0xfe,  0x75,
-  0x57,  0x03,  0x5d,  0xfe,  0x98,  0x56,  0xfe,  0x38,  0x12,  0x09,  0x48,  0x01,  0x0e,  0xfe,  0x44,  0x48,
-  0x4f,  0x08,  0x05,  0x1b,  0xfe,  0x1a,  0x13,  0x09,  0x46,  0x01,  0x0e,  0x41,  0xfe,  0x41,  0x58,  0x09,
-  0xa4,  0x01,  0x0e,  0xfe,  0x49,  0x54,  0x96,  0xfe,  0x1e,  0x0e,  0x02,  0xfe,  0x2e,  0x03,  0x09,  0x5d,
-  0xfe,  0xee,  0x14,  0xfc,  0x44,  0x1b,  0xfe,  0xce,  0x45,  0x35,  0x42,  0xfe,  0xce,  0x47,  0xfe,  0xad,
-  0x13,  0x02,  0x2b,  0x22,  0x20,  0x07,  0x11,  0xfe,  0x9e,  0x12,  0x21,  0x13,  0x59,  0x13,  0x9f,  0x13,
-  0xd5,  0x22,  0x2f,  0x41,  0x39,  0x2f,  0xbc,  0xad,  0xfe,  0xbc,  0xf0,  0xfe,  0xe0,  0x0e,  0x0f,  0x06,
-  0x13,  0x59,  0x01,  0xfe,  0xda,  0x16,  0x03,  0xfe,  0x38,  0x01,  0x29,  0xfe,  0x3a,  0x01,  0x56,  0xfe,
-  0xe4,  0x0e,  0xfe,  0x02,  0xec,  0xd5,  0x69,  0x00,  0x66,  0xfe,  0x04,  0xec,  0x20,  0x4f,  0xfe,  0x05,
-  0xf6,  0xfe,  0x34,  0x01,  0x01,  0xfe,  0x4a,  0x17,  0xfe,  0x08,  0x90,  0xfe,  0x48,  0xf4,  0x0d,  0xfe,
-  0x18,  0x13,  0xba,  0xfe,  0x02,  0xea,  0xd5,  0x69,  0x7e,  0xfe,  0xc5,  0x13,  0x15,  0x1a,  0x39,  0xa0,
-  0xb4,  0xfe,  0x2e,  0x10,  0x03,  0xfe,  0x38,  0x01,  0x1e,  0xfe,  0xf0,  0xff,  0x0c,  0xfe,  0x60,  0x01,
-  0x03,  0xfe,  0x3a,  0x01,  0x0c,  0xfe,  0x62,  0x01,  0x43,  0x13,  0x20,  0x25,  0x06,  0x13,  0x2f,  0x12,
-  0x2f,  0x92,  0x0f,  0x06,  0x04,  0x21,  0x04,  0x22,  0x59,  0xfe,  0xf7,  0x12,  0x22,  0x9f,  0xb7,  0x13,
-  0x9f,  0x07,  0x7e,  0xfe,  0x71,  0x13,  0xfe,  0x24,  0x1c,  0x15,  0x19,  0x39,  0xa0,  0xb4,  0xfe,  0xd9,
-  0x10,  0xc3,  0xfe,  0x03,  0xdc,  0xfe,  0x73,  0x57,  0xfe,  0x80,  0x5d,  0x04,  0xc3,  0xfe,  0x03,  0xdc,
-  0xfe,  0x5b,  0x57,  0xfe,  0x80,  0x5d,  0x04,  0xfe,  0x03,  0x57,  0xc3,  0x21,  0xfe,  0x00,  0xcc,  0x04,
-  0xfe,  0x03,  0x57,  0xc3,  0x78,  0x04,  0x08,  0x05,  0x58,  0xfe,  0x22,  0x13,  0xfe,  0x1c,  0x80,  0x07,
-  0x06,  0xfe,  0x1a,  0x13,  0xfe,  0x1e,  0x80,  0xed,  0xfe,  0x1d,  0x80,  0xae,  0xfe,  0x0c,  0x90,  0xfe,
-  0x0e,  0x13,  0xfe,  0x0e,  0x90,  0xac,  0xfe,  0x3c,  0x90,  0xfe,  0x30,  0xf4,  0x0a,  0xfe,  0x3c,  0x50,
-  0xaa,  0x01,  0xfe,  0x7a,  0x17,  0x32,  0x07,  0x2f,  0xad,  0x01,  0xfe,  0xb4,  0x16,  0x08,  0x05,  0x1b,
-  0x4e,  0x01,  0xf5,  0x01,  0xf6,  0x12,  0xfe,  0xe9,  0x00,  0x08,  0x05,  0x58,  0xfe,  0x2c,  0x13,  0x01,
-  0xfe,  0x0c,  0x17,  0xfe,  0x1e,  0x1c,  0xfe,  0x14,  0x90,  0xfe,  0x96,  0x90,  0x0c,  0xfe,  0x64,  0x01,
-  0x14,  0xfe,  0x66,  0x01,  0x08,  0x05,  0x5b,  0xfe,  0x12,  0x12,  0xfe,  0x03,  0x80,  0x8d,  0xfe,  0x01,
-  0xec,  0x20,  0xfe,  0x80,  0x40,  0x13,  0x20,  0x6a,  0x2a,  0x12,  0xcf,  0x64,  0x22,  0x20,  0xfb,  0x79,
-  0x20,  0x04,  0xfe,  0x08,  0x1c,  0x03,  0xfe,  0xac,  0x00,  0xfe,  0x06,  0x58,  0x03,  0xfe,  0xae,  0x00,
-
-  0xfe,  0x07,  0x58,  0x03,  0xfe,  0xb0,  0x00,  0xfe,  0x08,  0x58,  0x03,  0xfe,  0xb2,  0x00,  0xfe,  0x09,
-  0x58,  0xfe,  0x0a,  0x1c,  0x25,  0x6e,  0x13,  0xd0,  0x21,  0x0c,  0x5c,  0x0c,  0x45,  0x0f,  0x46,  0x52,
-  0x50,  0x18,  0x1b,  0xfe,  0x90,  0x4d,  0xfe,  0x91,  0x54,  0x23,  0xfe,  0xfc,  0x0f,  0x44,  0x11,  0x0f,
-  0x48,  0x52,  0x18,  0x58,  0xfe,  0x90,  0x4d,  0xfe,  0x91,  0x54,  0x23,  0xe4,  0x25,  0x11,  0x13,  0x20,
-  0x7c,  0x6f,  0x4f,  0x22,  0x20,  0xfb,  0x79,  0x20,  0x12,  0xcf,  0xfe,  0x14,  0x56,  0xfe,  0xd6,  0xf0,
-  0xfe,  0x26,  0x10,  0xf8,  0x74,  0xfe,  0x14,  0x1c,  0xfe,  0x10,  0x1c,  0xfe,  0x18,  0x1c,  0x04,  0x42,
-  0xfe,  0x0c,  0x14,  0xfc,  0xfe,  0x07,  0xe6,  0x1b,  0xfe,  0xce,  0x47,  0xfe,  0xf5,  0x13,  0x04,  0x01,
-  0xb0,  0x7c,  0x6f,  0x4f,  0xfe,  0x06,  0x80,  0xfe,  0x48,  0x47,  0xfe,  0x42,  0x13,  0x32,  0x07,  0x2f,
-  0xfe,  0x34,  0x13,  0x09,  0x48,  0x01,  0x0e,  0xbb,  0xfe,  0x36,  0x12,  0xfe,  0x41,  0x48,  0xfe,  0x45,
-  0x48,  0x01,  0xf0,  0xfe,  0x00,  0xcc,  0xbb,  0xfe,  0xf3,  0x13,  0x43,  0x78,  0x07,  0x11,  0xac,  0x09,
-  0x84,  0x01,  0x0e,  0xfe,  0x80,  0x5c,  0x01,  0x73,  0xfe,  0x0e,  0x10,  0x07,  0x82,  0x4e,  0xfe,  0x14,
-  0x56,  0xfe,  0xd6,  0xf0,  0xfe,  0x60,  0x10,  0x04,  0xfe,  0x44,  0x58,  0x8d,  0xfe,  0x01,  0xec,  0xa2,
-  0xfe,  0x9e,  0x40,  0xfe,  0x9d,  0xe7,  0x00,  0xfe,  0x9c,  0xe7,  0x1a,  0x79,  0x2a,  0x01,  0xe3,  0xfe,
-  0xdd,  0x10,  0x2c,  0xc7,  0x81,  0xc8,  0x83,  0x33,  0x31,  0xde,  0x07,  0x1a,  0xfe,  0x48,  0x12,  0x07,
-  0x0a,  0xfe,  0x56,  0x12,  0x07,  0x19,  0xfe,  0x30,  0x12,  0x07,  0xc9,  0x17,  0xfe,  0x32,  0x12,  0x07,
-  0xfe,  0x23,  0x00,  0x17,  0xeb,  0x07,  0x06,  0x17,  0xfe,  0x9c,  0x12,  0x07,  0x1f,  0xfe,  0x12,  0x12,
-  0x07,  0x00,  0x17,  0x24,  0x15,  0xc9,  0x01,  0x36,  0xa9,  0x2d,  0x01,  0x0b,  0x94,  0x4b,  0x04,  0x2d,
-  0xdd,  0x09,  0xd1,  0x01,  0xfe,  0x26,  0x0f,  0x12,  0x82,  0x02,  0x2b,  0x2d,  0x32,  0x07,  0xa6,  0xfe,
-  0xd9,  0x13,  0x3a,  0x3d,  0x3b,  0x3e,  0x56,  0xfe,  0xf0,  0x11,  0x08,  0x05,  0x5a,  0xfe,  0x72,  0x12,
-  0x9b,  0x2e,  0x9c,  0x3c,  0x90,  0xc0,  0x96,  0xfe,  0xba,  0x11,  0x22,  0x62,  0xfe,  0x26,  0x13,  0x03,
-  0x7f,  0x29,  0x80,  0x56,  0xfe,  0x76,  0x0d,  0x0c,  0x60,  0x14,  0x61,  0x21,  0x0c,  0x7f,  0x0c,  0x80,
-  0x01,  0xb3,  0x25,  0x6e,  0x77,  0x13,  0x62,  0x01,  0xef,  0x9b,  0x2e,  0x9c,  0x3c,  0xfe,  0x04,  0x55,
-  0xfe,  0xa5,  0x55,  0xfe,  0x04,  0xfa,  0x2e,  0xfe,  0x05,  0xfa,  0x3c,  0xfe,  0x91,  0x10,  0x03,  0x3f,
-  0x29,  0x40,  0xfe,  0x40,  0x56,  0xfe,  0xe1,  0x56,  0x0c,  0x3f,  0x14,  0x40,  0x88,  0x9b,  0x2e,  0x9c,
-  0x3c,  0x90,  0xc0,  0x03,  0x5e,  0x29,  0x5f,  0xfe,  0x00,  0x56,  0xfe,  0xa1,  0x56,  0x0c,  0x5e,  0x14,
-  0x5f,  0x08,  0x05,  0x5a,  0xfe,  0x1e,  0x12,  0x22,  0x62,  0xfe,  0x1f,  0x40,  0x03,  0x60,  0x29,  0x61,
-  0xfe,  0x2c,  0x50,  0xfe,  0xae,  0x50,  0x03,  0x3f,  0x29,  0x40,  0xfe,  0x44,  0x50,  0xfe,  0xc6,  0x50,
-  0x03,  0x5e,  0x29,  0x5f,  0xfe,  0x08,  0x50,  0xfe,  0x8a,  0x50,  0x03,  0x3d,  0x29,  0x3e,  0xfe,  0x40,
-  0x50,  0xfe,  0xc2,  0x50,  0x02,  0x89,  0x25,  0x06,  0x13,  0xd4,  0x02,  0x72,  0x2d,  0x01,  0x0b,  0x1d,
-  0x4c,  0x33,  0x31,  0xde,  0x07,  0x06,  0x23,  0x4c,  0x32,  0x07,  0xa6,  0x23,  0x72,  0x01,  0xaf,  0x1e,
-  0x43,  0x17,  0x4c,  0x08,  0x05,  0x0a,  0xee,  0x3a,  0x3d,  0x3b,  0x3e,  0xfe,  0x0a,  0x55,  0x35,  0xfe,
-  0x8b,  0x55,  0x57,  0x3d,  0x7d,  0x3e,  0xfe,  0x0c,  0x51,  0xfe,  0x8e,  0x51,  0x02,  0x72,  0xfe,  0x19,
-  0x81,  0xba,  0xfe,  0x19,  0x41,  0x02,  0x72,  0x2d,  0x01,  0x0b,  0x1c,  0x34,  0x1d,  0xe8,  0x33,  0x31,
-  0xe1,  0x55,  0x19,  0xfe,  0xa6,  0x12,  0x55,  0x0a,  0x4d,  0x02,  0x4c,  0x01,  0x0b,  0x1c,  0x34,  0x1d,
-  0xe8,  0x33,  0x31,  0xdf,  0x07,  0x19,  0x23,  0x4c,  0x01,  0x0b,  0x1d,  0xe8,  0x33,  0x31,  0xfe,  0xe8,
-  0x09,  0xfe,  0xc2,  0x49,  0x51,  0x03,  0xfe,  0x9c,  0x00,  0x28,  0x8a,  0x53,  0x05,  0x1f,  0x35,  0xa9,
-  0xfe,  0xbb,  0x45,  0x55,  0x00,  0x4e,  0x44,  0x06,  0x7c,  0x43,  0xfe,  0xda,  0x14,  0x01,  0xaf,  0x8c,
-  0xfe,  0x4b,  0x45,  0xee,  0x32,  0x07,  0xa5,  0xed,  0x03,  0xcd,  0x28,  0x8a,  0x03,  0x45,  0x28,  0x35,
-  0x67,  0x02,  0x72,  0xfe,  0xc0,  0x5d,  0xfe,  0xf8,  0x14,  0xfe,  0x03,  0x17,  0x03,  0x5c,  0xc1,  0x0c,
-  0x5c,  0x67,  0x2d,  0x01,  0x0b,  0x26,  0x89,  0x01,  0xfe,  0x9e,  0x15,  0x02,  0x89,  0x01,  0x0b,  0x1c,
-  0x34,  0x1d,  0x4c,  0x33,  0x31,  0xdf,  0x07,  0x06,  0x23,  0x4c,  0x01,  0xf1,  0xfe,  0x42,  0x58,  0xf1,
-  0xfe,  0xa4,  0x14,  0x8c,  0xfe,  0x4a,  0xf4,  0x0a,  0x17,  0x4c,  0xfe,  0x4a,  0xf4,  0x06,  0xea,  0x32,
-  0x07,  0xa5,  0x8b,  0x02,  0x72,  0x03,  0x45,  0xc1,  0x0c,  0x45,  0x67,  0x2d,  0x01,  0x0b,  0x26,  0x89,
-  0x01,  0xfe,  0xcc,  0x15,  0x02,  0x89,  0x0f,  0x06,  0x27,  0xfe,  0xbe,  0x13,  0x26,  0xfe,  0xd4,  0x13,
-  0x76,  0xfe,  0x89,  0x48,  0x01,  0x0b,  0x21,  0x76,  0x04,  0x7b,  0xfe,  0xd0,  0x13,  0x1c,  0xfe,  0xd0,
-  0x13,  0x1d,  0xfe,  0xbe,  0x13,  0x67,  0x2d,  0x01,  0x0b,  0xfe,  0xd5,  0x10,  0x0f,  0x71,  0xff,  0x02,
-  0x00,  0x57,  0x52,  0x93,  0x1e,  0xfe,  0xff,  0x7f,  0xfe,  0x30,  0x56,  0xfe,  0x00,  0x5c,  0x04,  0x0f,
-  0x71,  0xff,  0x02,  0x00,  0x57,  0x52,  0x93,  0x1e,  0x43,  0xfe,  0x30,  0x56,  0xfe,  0x00,  0x5c,  0x04,
-  0x0f,  0x71,  0xff,  0x02,  0x00,  0x57,  0x52,  0x93,  0x04,  0x0f,  0x71,  0xff,  0x02,  0x00,  0x57,  0x52,
-  0x93,  0xfe,  0x0b,  0x58,  0x04,  0x09,  0x5c,  0x01,  0x87,  0x09,  0x45,  0x01,  0x87,  0x04,  0xfe,  0x03,
-  0xa1,  0x1e,  0x11,  0xff,  0x03,  0x00,  0x54,  0xfe,  0x00,  0xf4,  0x1f,  0x52,  0xfe,  0x00,  0x7d,  0xfe,
-  0x01,  0x7d,  0xfe,  0x02,  0x7d,  0xfe,  0x03,  0x7c,  0x6a,  0x2a,  0x0c,  0x5e,  0x14,  0x5f,  0x57,  0x3f,
-  0x7d,  0x40,  0x04,  0xdd,  0xfe,  0x82,  0x4a,  0xfe,  0xe1,  0x1a,  0xfe,  0x83,  0x5a,  0x8d,  0x04,  0x01,
-  0xfe,  0x0c,  0x19,  0xfe,  0x42,  0x48,  0x50,  0x51,  0x91,  0x01,  0x0b,  0x1d,  0xfe,  0x96,  0x15,  0x33,
-  0x31,  0xe1,  0x01,  0x0b,  0x1d,  0xfe,  0x96,  0x15,  0x33,  0x31,  0xfe,  0xe8,  0x0a,  0xfe,  0xc1,  0x59,
-  0x03,  0xcd,  0x28,  0xfe,  0xcc,  0x12,  0x53,  0x05,  0x1a,  0xfe,  0xc4,  0x13,  0x21,  0x69,  0x1a,  0xee,
-  0x55,  0xca,  0x6b,  0xfe,  0xdc,  0x14,  0x4d,  0x0f,  0x06,  0x18,  0xca,  0x7c,  0x30,  0xfe,  0x78,  0x10,
-  0xff,  0x02,  0x83,  0x55,  0xab,  0xff,  0x02,  0x83,  0x55,  0x69,  0x19,  0xae,  0x98,  0xfe,  0x30,  0x00,
-  0x96,  0xf2,  0x18,  0x6d,  0x0f,  0x06,  0xfe,  0x56,  0x10,  0x69,  0x0a,  0xed,  0x98,  0xfe,  0x64,  0x00,
-  0x96,  0xf2,  0x09,  0xfe,  0x64,  0x00,  0x18,  0x9e,  0x0f,  0x06,  0xfe,  0x28,  0x10,  0x69,  0x06,  0xfe,
-  0x60,  0x13,  0x98,  0xfe,  0xc8,  0x00,  0x96,  0xf2,  0x09,  0xfe,  0xc8,  0x00,  0x18,  0x59,  0x0f,  0x06,
-  0x88,  0x98,  0xfe,  0x90,  0x01,  0x7a,  0xfe,  0x42,  0x15,  0x91,  0xe4,  0xfe,  0x43,  0xf4,  0x9f,  0xfe,
-  0x56,  0xf0,  0xfe,  0x54,  0x15,  0xfe,  0x04,  0xf4,  0x71,  0xfe,  0x43,  0xf4,  0x9e,  0xfe,  0xf3,  0x10,
-  0xfe,  0x40,  0x5c,  0x01,  0xfe,  0x16,  0x14,  0x1e,  0x43,  0xec,  0xfe,  0x00,  0x17,  0xfe,  0x4d,  0xe4,
-  0x6e,  0x7a,  0xfe,  0x90,  0x15,  0xc4,  0x6e,  0xfe,  0x1c,  0x10,  0xfe,  0x00,  0x17,  0xfe,  0x4d,  0xe4,
-  0xcc,  0x7a,  0xfe,  0x90,  0x15,  0xc4,  0xcc,  0x88,  0x51,  0x21,  0xfe,  0x4d,  0xf4,  0x00,  0xe9,  0x91,
-  0x0f,  0x06,  0xfe,  0xb4,  0x56,  0xfe,  0xc3,  0x58,  0x04,  0x51,  0x0f,  0x0a,  0x04,  0x16,  0x06,  0x01,
-  0x0b,  0x26,  0xf3,  0x16,  0x0a,  0x01,  0x0b,  0x26,  0xf3,  0x16,  0x19,  0x01,  0x0b,  0x26,  0xf3,  0x76,
-  0xfe,  0x89,  0x49,  0x01,  0x0b,  0x04,  0x16,  0x06,  0x01,  0x0b,  0x26,  0xb1,  0x16,  0x19,  0x01,  0x0b,
-  0x26,  0xb1,  0x16,  0x06,  0x01,  0x0b,  0x26,  0xb1,  0xfe,  0x89,  0x49,  0x01,  0x0b,  0x26,  0xb1,  0x76,
-  0xfe,  0x89,  0x4a,  0x01,  0x0b,  0x04,  0x51,  0x04,  0x22,  0xd3,  0x07,  0x06,  0xfe,  0x48,  0x13,  0xb8,
-  0x13,  0xd3,  0xfe,  0x49,  0xf4,  0x00,  0x4d,  0x76,  0xa9,  0x67,  0xfe,  0x01,  0xec,  0xfe,  0x27,  0x01,
-  0xfe,  0x89,  0x48,  0xff,  0x02,  0x00,  0x10,  0x27,  0xfe,  0x2e,  0x16,  0x32,  0x07,  0xfe,  0xe3,  0x00,
-  0xfe,  0x20,  0x13,  0x1d,  0xfe,  0x52,  0x16,  0x21,  0x13,  0xd4,  0x01,  0x4b,  0x22,  0xd4,  0x07,  0x06,
-  0x4e,  0x08,  0x54,  0x06,  0x37,  0x04,  0x09,  0x48,  0x01,  0x0e,  0xfb,  0x8e,  0x07,  0x11,  0xae,  0x09,
-  0x84,  0x01,  0x0e,  0x8e,  0x09,  0x5d,  0x01,  0xa8,  0x04,  0x09,  0x84,  0x01,  0x0e,  0x8e,  0xfe,  0x80,
-  0xe7,  0x11,  0x07,  0x11,  0x8a,  0xfe,  0x45,  0x58,  0x01,  0xf0,  0x8e,  0x04,  0x09,  0x48,  0x01,  0x0e,
-  0x8e,  0x09,  0x5d,  0x01,  0xa8,  0x04,  0x09,  0x48,  0x01,  0x0e,  0xfe,  0x80,  0x80,  0xfe,  0x80,  0x4c,
-  0xfe,  0x49,  0xe4,  0x11,  0xae,  0x09,  0x84,  0x01,  0x0e,  0xfe,  0x80,  0x4c,  0x09,  0x5d,  0x01,  0x87,
-  0x04,  0x18,  0x11,  0x75,  0x6c,  0xfe,  0x60,  0x01,  0xfe,  0x18,  0xdf,  0xfe,  0x19,  0xde,  0xfe,  0x24,
-  0x1c,  0xfe,  0x1d,  0xf7,  0x1b,  0x97,  0xfe,  0xee,  0x16,  0x01,  0xfe,  0xf4,  0x17,  0xad,  0x9a,  0x1b,
-  0x6c,  0xfe,  0x2c,  0x01,  0xfe,  0x2f,  0x19,  0x04,  0xb9,  0x23,  0xfe,  0xde,  0x16,  0xfe,  0xda,  0x10,
-  0x18,  0x11,  0x75,  0x03,  0xfe,  0x64,  0x01,  0xfe,  0x00,  0xf4,  0x1f,  0xfe,  0x18,  0x58,  0x03,  0xfe,
-  0x66,  0x01,  0xfe,  0x19,  0x58,  0x9a,  0x1f,  0xfe,  0x3c,  0x90,  0xfe,  0x30,  0xf4,  0x06,  0xfe,  0x3c,
-  0x50,  0x6c,  0xfe,  0x38,  0x00,  0xfe,  0x0f,  0x79,  0xfe,  0x1c,  0xf7,  0x1f,  0x97,  0xfe,  0x38,  0x17,
-  0xfe,  0xb6,  0x14,  0x35,  0x04,  0xb9,  0x23,  0xfe,  0x10,  0x17,  0xfe,  0x9c,  0x10,  0x18,  0x11,  0x75,
-  0xfe,  0x83,  0x5a,  0xfe,  0x18,  0xdf,  0xfe,  0x19,  0xde,  0xfe,  0x1d,  0xf7,  0x2e,  0x97,  0xfe,  0x5a,
-  0x17,  0xfe,  0x94,  0x14,  0xec,  0x9a,  0x2e,  0x6c,  0x1a,  0xfe,  0xaf,  0x19,  0xfe,  0x98,  0xe7,  0x00,
-  0x04,  0xb9,  0x23,  0xfe,  0x4e,  0x17,  0xfe,  0x6c,  0x10,  0x18,  0x11,  0x75,  0xfe,  0x30,  0xbc,  0xfe,
-  0xb2,  0xbc,  0x9a,  0xcb,  0x6c,  0x1a,  0xfe,  0x0f,  0x79,  0xfe,  0x1c,  0xf7,  0xcb,  0x97,  0xfe,  0x92,
-  0x17,  0xfe,  0x5c,  0x14,  0x35,  0x04,  0xb9,  0x23,  0xfe,  0x7e,  0x17,  0xfe,  0x42,  0x10,  0xfe,  0x02,
-  0xf6,  0x11,  0x75,  0xfe,  0x18,  0xfe,  0x60,  0xfe,  0x19,  0xfe,  0x61,  0xfe,  0x03,  0xa1,  0xfe,  0x1d,
-  0xf7,  0x5b,  0x97,  0xfe,  0xb8,  0x17,  0xfe,  0x36,  0x14,  0xfe,  0x1c,  0x13,  0x9a,  0x5b,  0x41,  0xfe,
-  0x83,  0x58,  0xfe,  0xaf,  0x19,  0xfe,  0x80,  0xe7,  0x11,  0xfe,  0x81,  0xe7,  0x11,  0x12,  0xfe,  0xdd,
-  0x00,  0x6a,  0x2a,  0x04,  0x6a,  0x2a,  0xfe,  0x12,  0x45,  0x23,  0xfe,  0xa8,  0x17,  0x15,  0x06,  0x39,
-  0xa0,  0xb4,  0x02,  0x2b,  0xfe,  0x39,  0xf0,  0xfe,  0xfc,  0x17,  0x21,  0x04,  0xfe,  0x7e,  0x18,  0x1e,
-  0x19,  0x66,  0x0f,  0x0d,  0x04,  0x75,  0x03,  0xd2,  0x1e,  0x06,  0xfe,  0xef,  0x12,  0xfe,  0xe1,  0x10,
-  0x7c,  0x6f,  0x4f,  0x32,  0x07,  0x2f,  0xfe,  0x3c,  0x13,  0xf1,  0xfe,  0x42,  0x13,  0x42,  0x92,  0x09,
-  0x48,  0x01,  0x0e,  0xbb,  0xeb,  0xfe,  0x41,  0x48,  0xfe,  0x45,  0x48,  0x01,  0xf0,  0xfe,  0x00,  0xcc,
-  0xbb,  0xfe,  0xf3,  0x13,  0x43,  0x78,  0x07,  0x11,  0xac,  0x09,  0x84,  0x01,  0x0e,  0xfe,  0x80,  0x4c,
-  0x01,  0x73,  0xfe,  0x16,  0x10,  0x07,  0x82,  0x8b,  0xfe,  0x40,  0x14,  0xfe,  0x24,  0x12,  0xfe,  0x14,
-  0x56,  0xfe,  0xd6,  0xf0,  0xfe,  0x1c,  0x18,  0x18,  0x0a,  0x04,  0xfe,  0x9c,  0xe7,  0x0a,  0x10,  0xfe,
-  0x15,  0x00,  0x64,  0x79,  0x2a,  0x01,  0xe3,  0x18,  0x06,  0x04,  0x42,  0x92,  0x08,  0x54,  0x1b,  0x37,
-  0x12,  0x2f,  0x01,  0x73,  0x18,  0x06,  0x04,  0xfe,  0x38,  0x90,  0xfe,  0xba,  0x90,  0x3a,  0xce,  0x3b,
-  0xcf,  0xfe,  0x48,  0x55,  0x35,  0xfe,  0xc9,  0x55,  0x04,  0x22,  0xa3,  0x77,  0x13,  0xa3,  0x04,  0x09,
-  0xa4,  0x01,  0x0e,  0xfe,  0x41,  0x48,  0x09,  0x46,  0x01,  0x0e,  0xfe,  0x49,  0x44,  0x17,  0xfe,  0xe8,
-  0x18,  0x77,  0x78,  0x04,  0x09,  0x48,  0x01,  0x0e,  0x07,  0x11,  0x4e,  0x09,  0x5d,  0x01,  0xa8,  0x09,
-  0x46,  0x01,  0x0e,  0x77,  0x78,  0x04,  0xfe,  0x4e,  0xe4,  0x19,  0x6b,  0xfe,  0x1c,  0x19,  0x03,  0xfe,
-  0x90,  0x00,  0xfe,  0x3a,  0x45,  0xfe,  0x2c,  0x10,  0xfe,  0x4e,  0xe4,  0xc9,  0x6b,  0xfe,  0x2e,  0x19,
-  0x03,  0xfe,  0x92,  0x00,  0xfe,  0x02,  0xe6,  0x1a,  0xe5,  0xfe,  0x4e,  0xe4,  0xfe,  0x0b,  0x00,  0x6b,
-  0xfe,  0x40,  0x19,  0x03,  0xfe,  0x94,  0x00,  0xfe,  0x02,  0xe6,  0x1f,  0xfe,  0x08,  0x10,  0x03,  0xfe,
-  0x96,  0x00,  0xfe,  0x02,  0xe6,  0x6d,  0xfe,  0x4e,  0x45,  0xea,  0xba,  0xff,  0x04,  0x68,  0x54,  0xe7,
-  0x1e,  0x6e,  0xfe,  0x08,  0x1c,  0xfe,  0x67,  0x19,  0xfe,  0x0a,  0x1c,  0xfe,  0x1a,  0xf4,  0xfe,  0x00,
-  0x04,  0xea,  0xfe,  0x48,  0xf4,  0x19,  0x7a,  0xfe,  0x74,  0x19,  0x0f,  0x19,  0x04,  0x07,  0x7e,  0xfe,
-  0x5a,  0xf0,  0xfe,  0x84,  0x19,  0x25,  0xfe,  0x09,  0x00,  0xfe,  0x34,  0x10,  0x07,  0x1a,  0xfe,  0x5a,
-  0xf0,  0xfe,  0x92,  0x19,  0x25,  0xca,  0xfe,  0x26,  0x10,  0x07,  0x19,  0x66,  0x25,  0x6d,  0xe5,  0x07,
-  0x0a,  0x66,  0x25,  0x9e,  0xfe,  0x0e,  0x10,  0x07,  0x06,  0x66,  0x25,  0x59,  0xa9,  0xb8,  0x04,  0x15,
-  0xfe,  0x09,  0x00,  0x01,  0x36,  0xfe,  0x04,  0xfe,  0x81,  0x03,  0x83,  0xfe,  0x40,  0x5c,  0x04,  0x1c,
-  0xf7,  0xfe,  0x14,  0xf0,  0x0b,  0x27,  0xfe,  0xd6,  0x19,  0x1c,  0xf7,  0x7b,  0xf7,  0xfe,  0x82,  0xf0,
-  0xfe,  0xda,  0x19,  0x04,  0xff,  0xcc,  0x00,  0x00,
+static unsigned char _adv_asc38C0800_buf[] = {
+       0x00, 0x00, 0x00, 0xf2, 0x00, 0xf0, 0x00, 0xfc, 0x00, 0x16, 0x18, 0xe4,
+       0x01, 0x00, 0x48, 0xe4,
+       0x18, 0x80, 0x03, 0xf6, 0x02, 0x00, 0xce, 0x19, 0x00, 0xfa, 0xff, 0xff,
+       0x1c, 0x0f, 0x00, 0xf6,
+       0x9e, 0xe7, 0xff, 0x00, 0x82, 0xe7, 0x00, 0xea, 0x01, 0xfa, 0x01, 0xe6,
+       0x09, 0xe7, 0x55, 0xf0,
+       0x01, 0xf6, 0x03, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1e, 0xf0, 0x85, 0xf0,
+       0x18, 0xf4, 0x08, 0x00,
+       0xbc, 0x00, 0x38, 0x54, 0x00, 0xec, 0xd5, 0xf0, 0x82, 0x0d, 0x00, 0xe6,
+       0x86, 0xf0, 0xb1, 0xf0,
+       0x98, 0x57, 0x01, 0xfc, 0xb4, 0x00, 0xd4, 0x01, 0x0c, 0x1c, 0x3e, 0x1c,
+       0x3c, 0x00, 0xbb, 0x00,
+       0x00, 0x10, 0xba, 0x19, 0x02, 0x80, 0x32, 0xf0, 0x7c, 0x0d, 0x02, 0x13,
+       0xba, 0x13, 0x18, 0x40,
+       0x00, 0x57, 0x01, 0xea, 0x02, 0xfc, 0x03, 0xfc, 0x3e, 0x00, 0x6c, 0x01,
+       0x6e, 0x01, 0x74, 0x01,
+       0x76, 0x01, 0xb9, 0x54, 0x3e, 0x57, 0x00, 0x80, 0x03, 0xe6, 0xb6, 0x00,
+       0xc0, 0x00, 0x01, 0x01,
+       0x3e, 0x01, 0x7a, 0x01, 0xca, 0x08, 0xce, 0x10, 0x16, 0x11, 0x04, 0x12,
+       0x08, 0x12, 0x02, 0x4a,
+       0xbb, 0x55, 0x3c, 0x56, 0x03, 0x58, 0x1b, 0x80, 0x30, 0xe4, 0x4b, 0xe4,
+       0x5d, 0xf0, 0x02, 0xfa,
+       0x20, 0x00, 0x32, 0x00, 0x40, 0x00, 0x80, 0x00, 0x24, 0x01, 0x3c, 0x01,
+       0x68, 0x01, 0x6a, 0x01,
+       0x70, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7c, 0x01, 0x62, 0x0a, 0x86, 0x0d,
+       0x06, 0x13, 0x4c, 0x1c,
+       0x04, 0x80, 0x4a, 0xe4, 0x02, 0xee, 0x5b, 0xf0, 0x03, 0xf7, 0x0c, 0x00,
+       0x0f, 0x00, 0x47, 0x00,
+       0xbe, 0x00, 0x00, 0x01, 0x20, 0x11, 0x5c, 0x16, 0x32, 0x1c, 0x38, 0x1c,
+       0x4e, 0x1c, 0x10, 0x44,
+       0x00, 0x4c, 0x04, 0xea, 0x5c, 0xf0, 0xa7, 0xf0, 0x04, 0xf6, 0x03, 0xfa,
+       0x05, 0x00, 0x34, 0x00,
+       0x36, 0x00, 0x98, 0x00, 0xcc, 0x00, 0x20, 0x01, 0x4e, 0x01, 0x4a, 0x0b,
+       0x42, 0x0c, 0x12, 0x0f,
+       0x0c, 0x10, 0x22, 0x11, 0x0a, 0x12, 0x04, 0x13, 0x30, 0x1c, 0x02, 0x48,
+       0x00, 0x4e, 0x42, 0x54,
+       0x44, 0x55, 0xbd, 0x56, 0x06, 0x83, 0x00, 0xdc, 0x05, 0xf0, 0x09, 0xf0,
+       0x59, 0xf0, 0xb8, 0xf0,
+       0x4b, 0xf4, 0x06, 0xf7, 0x0e, 0xf7, 0x04, 0xfc, 0x05, 0xfc, 0x06, 0x00,
+       0x19, 0x00, 0x33, 0x00,
+       0x9b, 0x00, 0xa4, 0x00, 0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe1, 0x00,
+       0xe7, 0x00, 0xe2, 0x03,
+       0x08, 0x0f, 0x02, 0x10, 0x04, 0x10, 0x0a, 0x10, 0x0a, 0x13, 0x0c, 0x13,
+       0x12, 0x13, 0x24, 0x14,
+       0x34, 0x14, 0x04, 0x16, 0x08, 0x16, 0xa4, 0x17, 0x20, 0x1c, 0x34, 0x1c,
+       0x36, 0x1c, 0x08, 0x44,
+       0x38, 0x44, 0x91, 0x44, 0x0a, 0x45, 0x48, 0x46, 0x01, 0x48, 0x68, 0x54,
+       0x3a, 0x55, 0x83, 0x55,
+       0xe5, 0x55, 0xb0, 0x57, 0x01, 0x58, 0x83, 0x59, 0x05, 0xe6, 0x0b, 0xf0,
+       0x0c, 0xf0, 0x04, 0xf8,
+       0x05, 0xf8, 0x07, 0x00, 0x0a, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x9e, 0x00,
+       0xa8, 0x00, 0xaa, 0x00,
+       0xb9, 0x00, 0xe0, 0x00, 0x22, 0x01, 0x26, 0x01, 0x79, 0x01, 0x7e, 0x01,
+       0xc4, 0x01, 0xc6, 0x01,
+       0x80, 0x02, 0x5e, 0x03, 0xee, 0x04, 0x9a, 0x06, 0xf8, 0x07, 0x62, 0x08,
+       0x68, 0x08, 0x69, 0x08,
+       0xd6, 0x08, 0xe9, 0x09, 0xfa, 0x0b, 0x2e, 0x0f, 0x12, 0x10, 0x1a, 0x10,
+       0xed, 0x10, 0xf1, 0x10,
+       0x2a, 0x11, 0x06, 0x12, 0x0c, 0x12, 0x3e, 0x12, 0x10, 0x13, 0x16, 0x13,
+       0x1e, 0x13, 0x46, 0x14,
+       0x76, 0x14, 0x82, 0x14, 0x36, 0x15, 0xca, 0x15, 0x6b, 0x18, 0xbe, 0x18,
+       0xca, 0x18, 0xe6, 0x19,
+       0x12, 0x1c, 0x46, 0x1c, 0x9c, 0x32, 0x00, 0x40, 0x0e, 0x47, 0xfe, 0x9c,
+       0xf0, 0x2b, 0x02, 0xfe,
+       0xac, 0x0d, 0xff, 0x10, 0x00, 0x00, 0xd7, 0xfe, 0xe8, 0x19, 0x00, 0xd6,
+       0xfe, 0x84, 0x01, 0xff,
+       0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
+       0x00, 0xfe, 0x57, 0x24,
+       0x00, 0xfe, 0x4c, 0x00, 0x5b, 0xff, 0x04, 0x00, 0x00, 0x11, 0xff, 0x09,
+       0x00, 0x00, 0xff, 0x08,
+       0x01, 0x01, 0xff, 0x08, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10,
+       0xff, 0xff, 0xff, 0x11,
+       0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
+       0xfe, 0x04, 0xf7, 0xd6,
+       0x2c, 0x99, 0x0a, 0x01, 0xfe, 0xc2, 0x0f, 0xfe, 0x04, 0xf7, 0xd6, 0x99,
+       0x0a, 0x42, 0x2c, 0xfe,
+       0x3d, 0xf0, 0xfe, 0x06, 0x02, 0xfe, 0x20, 0xf0, 0xa7, 0xfe, 0x91, 0xf0,
+       0xfe, 0xf4, 0x01, 0xfe,
+       0x90, 0xf0, 0xfe, 0xf4, 0x01, 0xfe, 0x8f, 0xf0, 0xa7, 0x03, 0x5d, 0x4d,
+       0x02, 0xfe, 0xc8, 0x0d,
+       0x01, 0xfe, 0x38, 0x0e, 0xfe, 0xdd, 0x12, 0xfe, 0xfc, 0x10, 0xfe, 0x28,
+       0x1c, 0x03, 0xfe, 0xa6,
+       0x00, 0xfe, 0xd3, 0x12, 0x41, 0x14, 0xfe, 0xa6, 0x00, 0xc2, 0xfe, 0x48,
+       0xf0, 0xfe, 0x8a, 0x02,
+       0xfe, 0x49, 0xf0, 0xfe, 0xa4, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc2, 0x02,
+       0xfe, 0x46, 0xf0, 0xfe,
+       0x54, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x5a, 0x02, 0xfe, 0x43, 0xf0, 0xfe,
+       0x48, 0x02, 0xfe, 0x44,
+       0xf0, 0xfe, 0x4c, 0x02, 0xfe, 0x45, 0xf0, 0xfe, 0x50, 0x02, 0x18, 0x0a,
+       0xaa, 0x18, 0x06, 0x14,
+       0xa1, 0x02, 0x2b, 0xfe, 0x00, 0x1c, 0xe7, 0xfe, 0x02, 0x1c, 0xe6, 0xfe,
+       0x1e, 0x1c, 0xfe, 0xe9,
+       0x10, 0x01, 0xfe, 0x18, 0x18, 0xfe, 0xe7, 0x10, 0xfe, 0x06, 0xfc, 0xce,
+       0x09, 0x70, 0x01, 0xa8,
+       0x02, 0x2b, 0x15, 0x59, 0x39, 0xa2, 0x01, 0xfe, 0x58, 0x10, 0x09, 0x70,
+       0x01, 0x87, 0xfe, 0xbd,
+       0x10, 0x09, 0x70, 0x01, 0x87, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c, 0xfe,
+       0x58, 0x1c, 0x18, 0x06,
+       0x14, 0xa1, 0x2c, 0x1c, 0x2b, 0xfe, 0x3d, 0xf0, 0xfe, 0x06, 0x02, 0x23,
+       0xfe, 0x98, 0x02, 0xfe,
+       0x5a, 0x1c, 0xf8, 0xfe, 0x14, 0x1c, 0x15, 0xfe, 0x30, 0x00, 0x39, 0xa2,
+       0x01, 0xfe, 0x48, 0x10,
+       0x18, 0x06, 0x14, 0xa1, 0x02, 0xd7, 0x22, 0x20, 0x07, 0x11, 0x35, 0xfe,
+       0x69, 0x10, 0x18, 0x06,
+       0x14, 0xa1, 0xfe, 0x04, 0xec, 0x20, 0x4f, 0x43, 0x13, 0x20, 0xfe, 0x05,
+       0xf6, 0xce, 0x01, 0xfe,
+       0x4a, 0x17, 0x08, 0x54, 0x58, 0x37, 0x12, 0x2f, 0x42, 0x92, 0x01, 0xfe,
+       0x82, 0x16, 0x02, 0x2b,
+       0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66, 0x01, 0x73, 0xfe, 0x18, 0x10,
+       0xfe, 0x41, 0x58, 0x09,
+       0xa4, 0x01, 0x0e, 0xfe, 0xc8, 0x54, 0x6b, 0xfe, 0x10, 0x03, 0x01, 0xfe,
+       0x82, 0x16, 0x02, 0x2b,
+       0x2c, 0x4f, 0xfe, 0x02, 0xe8, 0x2a, 0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43,
+       0xfe, 0x77, 0x57, 0xfe,
+       0x27, 0xf0, 0xfe, 0xe0, 0x01, 0xfe, 0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xa7,
+       0xfe, 0x40, 0x1c, 0x1c,
+       0xd9, 0xfe, 0x26, 0xf0, 0xfe, 0x5a, 0x03, 0xfe, 0xa0, 0xf0, 0xfe, 0x48,
+       0x03, 0xfe, 0x11, 0xf0,
+       0xa7, 0xfe, 0xef, 0x10, 0xfe, 0x9f, 0xf0, 0xfe, 0x68, 0x03, 0xf9, 0x10,
+       0xfe, 0x11, 0x00, 0x02,
+       0x65, 0x2c, 0xfe, 0x48, 0x1c, 0xf9, 0x08, 0x05, 0x1b, 0xfe, 0x18, 0x13,
+       0x21, 0x22, 0xa3, 0xb7,
+       0x13, 0xa3, 0x09, 0x46, 0x01, 0x0e, 0xb7, 0x78, 0x01, 0xfe, 0xb4, 0x16,
+       0x12, 0xd1, 0x1c, 0xd9,
+       0xfe, 0x01, 0xf0, 0xd9, 0xfe, 0x82, 0xf0, 0xfe, 0x96, 0x03, 0xfa, 0x12,
+       0xfe, 0xe4, 0x00, 0x27,
+       0xfe, 0xa8, 0x03, 0x1c, 0x34, 0x1d, 0xfe, 0xb8, 0x03, 0x01, 0x4b, 0xfe,
+       0x06, 0xf0, 0xfe, 0xc8,
+       0x03, 0x95, 0x86, 0xfe, 0x0a, 0xf0, 0xfe, 0x8a, 0x06, 0x02, 0x24, 0x03,
+       0x70, 0x28, 0x17, 0xfe,
+       0xfa, 0x04, 0x15, 0x6d, 0x01, 0x36, 0x7b, 0xfe, 0x6a, 0x02, 0x02, 0xd8,
+       0xf9, 0x2c, 0x99, 0x19,
+       0xfe, 0x67, 0x1b, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0xfe, 0x48, 0x1c,
+       0x74, 0x01, 0xaf, 0x8c,
+       0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x17, 0xda, 0x09, 0xd1, 0x01, 0x0e,
+       0x8d, 0x51, 0x64, 0x79,
+       0x2a, 0x03, 0x70, 0x28, 0xfe, 0x10, 0x12, 0x15, 0x6d, 0x01, 0x36, 0x7b,
+       0xfe, 0x6a, 0x02, 0x02,
+       0xd8, 0xc7, 0x81, 0xc8, 0x83, 0x1c, 0x24, 0x27, 0xfe, 0x40, 0x04, 0x1d,
+       0xfe, 0x3c, 0x04, 0x3b,
+       0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x4e, 0x12, 0x2d, 0xff, 0x02,
+       0x00, 0x10, 0x01, 0x0b,
+       0x1d, 0xfe, 0xe4, 0x04, 0x2d, 0x01, 0x0b, 0x1d, 0x24, 0x33, 0x31, 0xde,
+       0xfe, 0x4c, 0x44, 0xfe,
+       0x4c, 0x12, 0x51, 0xfe, 0x44, 0x48, 0x0f, 0x6f, 0xfe, 0x4c, 0x54, 0x6b,
+       0xda, 0x4f, 0x79, 0x2a,
+       0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x62, 0x13, 0x08, 0x05, 0x1b,
+       0xfe, 0x2a, 0x13, 0x32,
+       0x07, 0x82, 0xfe, 0x52, 0x13, 0xfe, 0x20, 0x10, 0x0f, 0x6f, 0xfe, 0x4c,
+       0x54, 0x6b, 0xda, 0xfe,
+       0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x40, 0x13, 0x08, 0x05, 0x1b, 0xfe,
+       0x08, 0x13, 0x32, 0x07,
+       0x82, 0xfe, 0x30, 0x13, 0x08, 0x05, 0x1b, 0xfe, 0x1c, 0x12, 0x15, 0x9d,
+       0x08, 0x05, 0x06, 0x4d,
+       0x15, 0xfe, 0x0d, 0x00, 0x01, 0x36, 0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24,
+       0x2d, 0x12, 0xfe, 0xe6,
+       0x00, 0xfe, 0x1c, 0x90, 0xfe, 0x40, 0x5c, 0x04, 0x15, 0x9d, 0x01, 0x36,
+       0x02, 0x2b, 0xfe, 0x42,
+       0x5b, 0x99, 0x19, 0xfe, 0x46, 0x59, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57,
+       0xfe, 0x87, 0x80, 0xfe,
+       0x31, 0xe4, 0x5b, 0x08, 0x05, 0x0a, 0xfe, 0x84, 0x13, 0xfe, 0x20, 0x80,
+       0x07, 0x19, 0xfe, 0x7c,
+       0x12, 0x53, 0x05, 0x06, 0xfe, 0x6c, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x28,
+       0x17, 0xfe, 0x90, 0x05,
+       0xfe, 0x31, 0xe4, 0x5a, 0x53, 0x05, 0x0a, 0xfe, 0x56, 0x13, 0x03, 0xfe,
+       0xa0, 0x00, 0x28, 0xfe,
+       0x4e, 0x12, 0x67, 0xff, 0x02, 0x00, 0x10, 0x27, 0xfe, 0x48, 0x05, 0x1c,
+       0x34, 0xfe, 0x89, 0x48,
+       0xff, 0x02, 0x00, 0x10, 0x27, 0xfe, 0x56, 0x05, 0x26, 0xfe, 0xa8, 0x05,
+       0x12, 0xfe, 0xe3, 0x00,
+       0x21, 0x53, 0xfe, 0x4a, 0xf0, 0xfe, 0x76, 0x05, 0xfe, 0x49, 0xf0, 0xfe,
+       0x70, 0x05, 0x88, 0x25,
+       0xfe, 0x21, 0x00, 0xab, 0x25, 0xfe, 0x22, 0x00, 0xaa, 0x25, 0x58, 0xfe,
+       0x09, 0x48, 0xff, 0x02,
+       0x00, 0x10, 0x27, 0xfe, 0x86, 0x05, 0x26, 0xfe, 0xa8, 0x05, 0xfe, 0xe2,
+       0x08, 0x53, 0x05, 0xcb,
+       0x4d, 0x01, 0xb0, 0x25, 0x06, 0x13, 0xd3, 0x39, 0xfe, 0x27, 0x01, 0x08,
+       0x05, 0x1b, 0xfe, 0x22,
+       0x12, 0x41, 0x01, 0xb2, 0x15, 0x9d, 0x08, 0x05, 0x06, 0x4d, 0x15, 0xfe,
+       0x0d, 0x00, 0x01, 0x36,
+       0x7b, 0xfe, 0x64, 0x0d, 0x02, 0x24, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0xeb,
+       0x03, 0x5c, 0x28, 0xfe,
+       0x36, 0x13, 0x41, 0x01, 0xb2, 0x26, 0xfe, 0x18, 0x06, 0x09, 0x06, 0x53,
+       0x05, 0x1f, 0xfe, 0x02,
+       0x12, 0x50, 0x01, 0xfe, 0x9e, 0x15, 0x1d, 0xfe, 0x0e, 0x06, 0x12, 0xa5,
+       0x01, 0x4b, 0x12, 0xfe,
+       0xe5, 0x00, 0x03, 0x5c, 0xc1, 0x0c, 0x5c, 0x03, 0xcd, 0x28, 0xfe, 0x62,
+       0x12, 0x03, 0x45, 0x28,
+       0xfe, 0x5a, 0x13, 0x01, 0xfe, 0x0c, 0x19, 0x01, 0xfe, 0x76, 0x19, 0xfe,
+       0x43, 0x48, 0xc4, 0xcc,
+       0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0x8b, 0xc4,
+       0x6e, 0x41, 0x01, 0xb2,
+       0x26, 0xfe, 0x82, 0x06, 0x53, 0x05, 0x1a, 0xe9, 0x91, 0x09, 0x59, 0x01,
+       0xfe, 0xcc, 0x15, 0x1d,
+       0xfe, 0x78, 0x06, 0x12, 0xa5, 0x01, 0x4b, 0x12, 0xfe, 0xe5, 0x00, 0x03,
+       0x45, 0xc1, 0x0c, 0x45,
+       0x18, 0x06, 0x01, 0xb2, 0xfa, 0x76, 0x74, 0x01, 0xaf, 0x8c, 0x12, 0xfe,
+       0xe2, 0x00, 0x27, 0xdb,
+       0x1c, 0x34, 0xfe, 0x0a, 0xf0, 0xfe, 0xb6, 0x06, 0x94, 0xfe, 0x6c, 0x07,
+       0xfe, 0x06, 0xf0, 0xfe,
+       0x74, 0x07, 0x95, 0x86, 0x02, 0x24, 0x08, 0x05, 0x0a, 0xfe, 0x2e, 0x12,
+       0x16, 0x19, 0x01, 0x0b,
+       0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01, 0x0b,
+       0xfe, 0x99, 0xa4, 0x01,
+       0x0b, 0x16, 0x00, 0x02, 0xfe, 0x42, 0x08, 0x68, 0x05, 0x1a, 0xfe, 0x38,
+       0x12, 0x08, 0x05, 0x1a,
+       0xfe, 0x30, 0x13, 0x16, 0xfe, 0x1b, 0x00, 0x01, 0x0b, 0x16, 0x00, 0x01,
+       0x0b, 0x16, 0x00, 0x01,
+       0x0b, 0x16, 0x00, 0x01, 0x0b, 0x16, 0x06, 0x01, 0x0b, 0x16, 0x00, 0x02,
+       0xe2, 0x6c, 0x58, 0xbe,
+       0x50, 0xfe, 0x9a, 0x81, 0x55, 0x1b, 0x7a, 0xfe, 0x42, 0x07, 0x09, 0x1b,
+       0xfe, 0x09, 0x6f, 0xba,
+       0xfe, 0xca, 0x45, 0xfe, 0x32, 0x12, 0x69, 0x6d, 0x8b, 0x6c, 0x7f, 0x27,
+       0xfe, 0x54, 0x07, 0x1c,
+       0x34, 0xfe, 0x0a, 0xf0, 0xfe, 0x42, 0x07, 0x95, 0x86, 0x94, 0xfe, 0x6c,
+       0x07, 0x02, 0x24, 0x01,
+       0x4b, 0x02, 0xdb, 0x16, 0x1f, 0x02, 0xdb, 0xfe, 0x9c, 0xf7, 0xdc, 0xfe,
+       0x2c, 0x90, 0xfe, 0xae,
+       0x90, 0x56, 0xfe, 0xda, 0x07, 0x0c, 0x60, 0x14, 0x61, 0x08, 0x54, 0x5a,
+       0x37, 0x22, 0x20, 0x07,
+       0x11, 0xfe, 0x0e, 0x12, 0x8d, 0xfe, 0x80, 0x80, 0x39, 0x20, 0x6a, 0x2a,
+       0xfe, 0x06, 0x10, 0xfe,
+       0x83, 0xe7, 0xfe, 0x48, 0x00, 0xab, 0xfe, 0x03, 0x40, 0x08, 0x54, 0x5b,
+       0x37, 0x01, 0xb3, 0xb8,
+       0xfe, 0x1f, 0x40, 0x13, 0x62, 0x01, 0xef, 0xfe, 0x08, 0x50, 0xfe, 0x8a,
+       0x50, 0xfe, 0x44, 0x51,
+       0xfe, 0xc6, 0x51, 0x88, 0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90, 0x0c, 0x5e,
+       0x14, 0x5f, 0xfe, 0x0c,
+       0x90, 0xfe, 0x8e, 0x90, 0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x0c, 0x3d,
+       0x14, 0x3e, 0xfe, 0x4a,
+       0x10, 0x08, 0x05, 0x5a, 0xfe, 0x2a, 0x12, 0xfe, 0x2c, 0x90, 0xfe, 0xae,
+       0x90, 0x0c, 0x60, 0x14,
+       0x61, 0x08, 0x05, 0x5b, 0x8b, 0x01, 0xb3, 0xfe, 0x1f, 0x80, 0x13, 0x62,
+       0xfe, 0x44, 0x90, 0xfe,
+       0xc6, 0x90, 0x0c, 0x3f, 0x14, 0x40, 0xfe, 0x08, 0x90, 0xfe, 0x8a, 0x90,
+       0x0c, 0x5e, 0x14, 0x5f,
+       0xfe, 0x40, 0x90, 0xfe, 0xc2, 0x90, 0x0c, 0x3d, 0x14, 0x3e, 0x0c, 0x2e,
+       0x14, 0x3c, 0x21, 0x0c,
+       0x49, 0x0c, 0x63, 0x08, 0x54, 0x1f, 0x37, 0x2c, 0x0f, 0xfe, 0x4e, 0x11,
+       0x27, 0xdd, 0xfe, 0x9e,
+       0xf0, 0xfe, 0x76, 0x08, 0xbc, 0x17, 0x34, 0x2c, 0x77, 0xe6, 0xc5, 0xfe,
+       0x9a, 0x08, 0xc6, 0xfe,
+       0xb8, 0x08, 0x94, 0xfe, 0x8e, 0x08, 0xfe, 0x06, 0xf0, 0xfe, 0x94, 0x08,
+       0x95, 0x86, 0x02, 0x24,
+       0x01, 0x4b, 0xfe, 0xc9, 0x10, 0x16, 0x1f, 0xfe, 0xc9, 0x10, 0x68, 0x05,
+       0x06, 0xfe, 0x10, 0x12,
+       0x68, 0x05, 0x0a, 0x4e, 0x08, 0x05, 0x0a, 0xfe, 0x90, 0x12, 0xfe, 0x2e,
+       0x1c, 0x02, 0xfe, 0x18,
+       0x0b, 0x68, 0x05, 0x06, 0x4e, 0x68, 0x05, 0x0a, 0xfe, 0x7a, 0x12, 0xfe,
+       0x2c, 0x1c, 0xfe, 0xaa,
+       0xf0, 0xfe, 0xd2, 0x09, 0xfe, 0xac, 0xf0, 0xfe, 0x00, 0x09, 0x02, 0xfe,
+       0xde, 0x09, 0xfe, 0xb7,
+       0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0x02, 0xf6, 0x1a, 0x50, 0xfe, 0x70, 0x18,
+       0xfe, 0xf1, 0x18, 0xfe,
+       0x40, 0x55, 0xfe, 0xe1, 0x55, 0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58, 0xfe,
+       0x14, 0x59, 0xfe, 0x95,
+       0x59, 0x1c, 0x85, 0xfe, 0x8c, 0xf0, 0xfe, 0xfc, 0x08, 0xfe, 0xac, 0xf0,
+       0xfe, 0xf0, 0x08, 0xb5,
+       0xfe, 0xcb, 0x10, 0xfe, 0xad, 0xf0, 0xfe, 0x0c, 0x09, 0x02, 0xfe, 0x18,
+       0x0b, 0xb6, 0xfe, 0xbf,
+       0x10, 0xfe, 0x2b, 0xf0, 0x85, 0xf4, 0x1e, 0xfe, 0x00, 0xfe, 0xfe, 0x1c,
+       0x12, 0xc2, 0xfe, 0xd2,
+       0xf0, 0x85, 0xfe, 0x76, 0x18, 0x1e, 0x19, 0x17, 0x85, 0x03, 0xd2, 0x1e,
+       0x06, 0x17, 0x85, 0xc5,
+       0x4a, 0xc6, 0x4a, 0xb5, 0xb6, 0xfe, 0x89, 0x10, 0x74, 0x67, 0x2d, 0x15,
+       0x9d, 0x01, 0x36, 0x10,
+       0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x65, 0x10, 0x80, 0x02, 0x65, 0xfe,
+       0x98, 0x80, 0xfe, 0x19,
+       0xe4, 0x0a, 0xfe, 0x1a, 0x12, 0x51, 0xfe, 0x19, 0x82, 0xfe, 0x6c, 0x18,
+       0xfe, 0x44, 0x54, 0xbe,
+       0xfe, 0x19, 0x81, 0xfe, 0x74, 0x18, 0x8f, 0x90, 0x17, 0xfe, 0xce, 0x08,
+       0x02, 0x4a, 0x08, 0x05,
+       0x5a, 0xec, 0x03, 0x2e, 0x29, 0x3c, 0x0c, 0x3f, 0x14, 0x40, 0x9b, 0x2e,
+       0x9c, 0x3c, 0xfe, 0x6c,
+       0x18, 0xfe, 0xed, 0x18, 0xfe, 0x44, 0x54, 0xfe, 0xe5, 0x54, 0x3a, 0x3f,
+       0x3b, 0x40, 0x03, 0x49,
+       0x29, 0x63, 0x8f, 0xfe, 0xe3, 0x54, 0xfe, 0x74, 0x18, 0xfe, 0xf5, 0x18,
+       0x8f, 0xfe, 0xe3, 0x54,
+       0x90, 0xc0, 0x56, 0xfe, 0xce, 0x08, 0x02, 0x4a, 0xfe, 0x37, 0xf0, 0xfe,
+       0xda, 0x09, 0xfe, 0x8b,
+       0xf0, 0xfe, 0x60, 0x09, 0x02, 0x4a, 0x08, 0x05, 0x0a, 0x23, 0xfe, 0xfa,
+       0x0a, 0x3a, 0x49, 0x3b,
+       0x63, 0x56, 0xfe, 0x3e, 0x0a, 0x0f, 0xfe, 0xc0, 0x07, 0x41, 0x98, 0x00,
+       0xad, 0xfe, 0x01, 0x59,
+       0xfe, 0x52, 0xf0, 0xfe, 0x0c, 0x0a, 0x8f, 0x7a, 0xfe, 0x24, 0x0a, 0x3a,
+       0x49, 0x8f, 0xfe, 0xe3,
+       0x54, 0x57, 0x49, 0x7d, 0x63, 0xfe, 0x14, 0x58, 0xfe, 0x95, 0x58, 0x02,
+       0x4a, 0x3a, 0x49, 0x3b,
+       0x63, 0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0xbe, 0x57, 0x49, 0x57, 0x63,
+       0x02, 0x4a, 0x08, 0x05,
+       0x5a, 0xfe, 0x82, 0x12, 0x08, 0x05, 0x1f, 0xfe, 0x66, 0x13, 0x22, 0x62,
+       0xb7, 0xfe, 0x03, 0xa1,
+       0xfe, 0x83, 0x80, 0xfe, 0xc8, 0x44, 0xfe, 0x2e, 0x13, 0xfe, 0x04, 0x91,
+       0xfe, 0x86, 0x91, 0x6a,
+       0x2a, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x56, 0xe0, 0x03, 0x60, 0x29,
+       0x61, 0x0c, 0x7f, 0x14,
+       0x80, 0x57, 0x60, 0x7d, 0x61, 0x01, 0xb3, 0xb8, 0x6a, 0x2a, 0x13, 0x62,
+       0x9b, 0x2e, 0x9c, 0x3c,
+       0x3a, 0x3f, 0x3b, 0x40, 0x90, 0xc0, 0xfe, 0x04, 0xfa, 0x2e, 0xfe, 0x05,
+       0xfa, 0x3c, 0x01, 0xef,
+       0xfe, 0x36, 0x10, 0x21, 0x0c, 0x7f, 0x0c, 0x80, 0x3a, 0x3f, 0x3b, 0x40,
+       0xe4, 0x08, 0x05, 0x1f,
+       0x17, 0xe0, 0x3a, 0x3d, 0x3b, 0x3e, 0x08, 0x05, 0xfe, 0xf7, 0x00, 0x37,
+       0x03, 0x5e, 0x29, 0x5f,
+       0xfe, 0x10, 0x58, 0xfe, 0x91, 0x58, 0x57, 0x49, 0x7d, 0x63, 0x02, 0xfe,
+       0xf4, 0x09, 0x08, 0x05,
+       0x1f, 0x17, 0xe0, 0x08, 0x05, 0xfe, 0xf7, 0x00, 0x37, 0xbe, 0xfe, 0x19,
+       0x81, 0x50, 0xfe, 0x10,
+       0x90, 0xfe, 0x92, 0x90, 0xfe, 0xd3, 0x10, 0x32, 0x07, 0xa6, 0x17, 0xfe,
+       0x08, 0x09, 0x12, 0xa6,
+       0x08, 0x05, 0x0a, 0xfe, 0x14, 0x13, 0x03, 0x3d, 0x29, 0x3e, 0x56, 0xfe,
+       0x08, 0x09, 0xfe, 0x0c,
+       0x58, 0xfe, 0x8d, 0x58, 0x02, 0x4a, 0x21, 0x41, 0xfe, 0x19, 0x80, 0xe7,
+       0x08, 0x05, 0x0a, 0xfe,
+       0x1a, 0x12, 0xfe, 0x6c, 0x19, 0xfe, 0x19, 0x41, 0xf4, 0xc2, 0xfe, 0xd1,
+       0xf0, 0xe2, 0x15, 0x7e,
+       0x01, 0x36, 0x10, 0xfe, 0x44, 0x00, 0xfe, 0x8e, 0x10, 0xfe, 0x6c, 0x19,
+       0x57, 0x3d, 0xfe, 0xed,
+       0x19, 0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51, 0xf4, 0x1e, 0xfe,
+       0x00, 0xff, 0x35, 0xfe,
+       0x74, 0x10, 0xc2, 0xfe, 0xd2, 0xf0, 0xfe, 0xa6, 0x0b, 0xfe, 0x76, 0x18,
+       0x1e, 0x19, 0x8a, 0x03,
+       0xd2, 0x1e, 0x06, 0xfe, 0x08, 0x13, 0x10, 0xfe, 0x16, 0x00, 0x02, 0x65,
+       0xfe, 0xd1, 0xf0, 0xfe,
+       0xb8, 0x0b, 0x15, 0x7e, 0x01, 0x36, 0x10, 0xfe, 0x17, 0x00, 0xfe, 0x42,
+       0x10, 0xfe, 0xce, 0xf0,
+       0xfe, 0xbe, 0x0b, 0xfe, 0x3c, 0x10, 0xfe, 0xcd, 0xf0, 0xfe, 0xca, 0x0b,
+       0x10, 0xfe, 0x22, 0x00,
+       0x02, 0x65, 0xfe, 0xcb, 0xf0, 0xfe, 0xd6, 0x0b, 0x10, 0xfe, 0x24, 0x00,
+       0x02, 0x65, 0xfe, 0xd0,
+       0xf0, 0xfe, 0xe0, 0x0b, 0x10, 0x9e, 0xe5, 0xfe, 0xcf, 0xf0, 0xfe, 0xea,
+       0x0b, 0x10, 0x58, 0xfe,
+       0x10, 0x10, 0xfe, 0xcc, 0xf0, 0xe2, 0x68, 0x05, 0x1f, 0x4d, 0x10, 0xfe,
+       0x12, 0x00, 0x2c, 0x0f,
+       0xfe, 0x4e, 0x11, 0x27, 0xfe, 0x00, 0x0c, 0xfe, 0x9e, 0xf0, 0xfe, 0x14,
+       0x0c, 0xbc, 0x17, 0x34,
+       0x2c, 0x77, 0xe6, 0xc5, 0x24, 0xc6, 0x24, 0x2c, 0xfa, 0x27, 0xfe, 0x20,
+       0x0c, 0x1c, 0x34, 0x94,
+       0xfe, 0x3c, 0x0c, 0x95, 0x86, 0xc5, 0xdc, 0xc6, 0xdc, 0x02, 0x24, 0x01,
+       0x4b, 0xfe, 0xdb, 0x10,
+       0x12, 0xfe, 0xe8, 0x00, 0xb5, 0xb6, 0x74, 0xc7, 0x81, 0xc8, 0x83, 0xfe,
+       0x89, 0xf0, 0x24, 0x33,
+       0x31, 0xe1, 0xc7, 0x81, 0xc8, 0x83, 0x27, 0xfe, 0x66, 0x0c, 0x1d, 0x24,
+       0x33, 0x31, 0xdf, 0xbc,
+       0x4e, 0x10, 0xfe, 0x42, 0x00, 0x02, 0x65, 0x7c, 0x06, 0xfe, 0x81, 0x49,
+       0x17, 0xfe, 0x2c, 0x0d,
+       0x08, 0x05, 0x0a, 0xfe, 0x44, 0x13, 0x10, 0x00, 0x55, 0x0a, 0xfe, 0x54,
+       0x12, 0x55, 0xfe, 0x28,
+       0x00, 0x23, 0xfe, 0x9a, 0x0d, 0x09, 0x46, 0x01, 0x0e, 0x07, 0x00, 0x66,
+       0x44, 0xfe, 0x28, 0x00,
+       0xfe, 0xe2, 0x10, 0x01, 0xf5, 0x01, 0xf6, 0x09, 0xa4, 0x01, 0xfe, 0x26,
+       0x0f, 0x64, 0x12, 0x2f,
+       0x01, 0x73, 0x02, 0x2b, 0x10, 0xfe, 0x44, 0x00, 0x55, 0x0a, 0xe9, 0x44,
+       0x0a, 0xfe, 0xb4, 0x10,
+       0x01, 0xb0, 0x44, 0x0a, 0xfe, 0xaa, 0x10, 0x01, 0xb0, 0xfe, 0x19, 0x82,
+       0xfe, 0x34, 0x46, 0xac,
+       0x44, 0x0a, 0x10, 0xfe, 0x43, 0x00, 0xfe, 0x96, 0x10, 0x08, 0x54, 0x0a,
+       0x37, 0x01, 0xf5, 0x01,
+       0xf6, 0x64, 0x12, 0x2f, 0x01, 0x73, 0x99, 0x0a, 0x64, 0x42, 0x92, 0x02,
+       0xfe, 0x2e, 0x03, 0x08,
+       0x05, 0x0a, 0x8a, 0x44, 0x0a, 0x10, 0x00, 0xfe, 0x5c, 0x10, 0x68, 0x05,
+       0x1a, 0xfe, 0x58, 0x12,
+       0x08, 0x05, 0x1a, 0xfe, 0x50, 0x13, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0,
+       0xfe, 0x50, 0x0d, 0xfe,
+       0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x56, 0x0d, 0x08, 0x54, 0x1a, 0x37,
+       0xfe, 0xa9, 0x10, 0x10,
+       0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0a, 0x50, 0xfe, 0x2e, 0x10, 0x10,
+       0xfe, 0x13, 0x00, 0xfe,
+       0x10, 0x10, 0x10, 0x6f, 0xab, 0x10, 0xfe, 0x41, 0x00, 0xaa, 0x10, 0xfe,
+       0x24, 0x00, 0x8c, 0xb5,
+       0xb6, 0x74, 0x03, 0x70, 0x28, 0x23, 0xd8, 0x50, 0xfe, 0x04, 0xe6, 0x1a,
+       0xfe, 0x9d, 0x41, 0xfe,
+       0x1c, 0x42, 0x64, 0x01, 0xe3, 0x02, 0x2b, 0xf8, 0x15, 0x0a, 0x39, 0xa0,
+       0xb4, 0x15, 0xfe, 0x31,
+       0x00, 0x39, 0xa2, 0x01, 0xfe, 0x48, 0x10, 0x02, 0xd7, 0x42, 0xfe, 0x06,
+       0xec, 0xd0, 0xfc, 0x44,
+       0x1b, 0xfe, 0xce, 0x45, 0x35, 0x42, 0xfe, 0x06, 0xea, 0xd0, 0xfe, 0x47,
+       0x4b, 0x91, 0xfe, 0x75,
+       0x57, 0x03, 0x5d, 0xfe, 0x98, 0x56, 0xfe, 0x38, 0x12, 0x09, 0x48, 0x01,
+       0x0e, 0xfe, 0x44, 0x48,
+       0x4f, 0x08, 0x05, 0x1b, 0xfe, 0x1a, 0x13, 0x09, 0x46, 0x01, 0x0e, 0x41,
+       0xfe, 0x41, 0x58, 0x09,
+       0xa4, 0x01, 0x0e, 0xfe, 0x49, 0x54, 0x96, 0xfe, 0x1e, 0x0e, 0x02, 0xfe,
+       0x2e, 0x03, 0x09, 0x5d,
+       0xfe, 0xee, 0x14, 0xfc, 0x44, 0x1b, 0xfe, 0xce, 0x45, 0x35, 0x42, 0xfe,
+       0xce, 0x47, 0xfe, 0xad,
+       0x13, 0x02, 0x2b, 0x22, 0x20, 0x07, 0x11, 0xfe, 0x9e, 0x12, 0x21, 0x13,
+       0x59, 0x13, 0x9f, 0x13,
+       0xd5, 0x22, 0x2f, 0x41, 0x39, 0x2f, 0xbc, 0xad, 0xfe, 0xbc, 0xf0, 0xfe,
+       0xe0, 0x0e, 0x0f, 0x06,
+       0x13, 0x59, 0x01, 0xfe, 0xda, 0x16, 0x03, 0xfe, 0x38, 0x01, 0x29, 0xfe,
+       0x3a, 0x01, 0x56, 0xfe,
+       0xe4, 0x0e, 0xfe, 0x02, 0xec, 0xd5, 0x69, 0x00, 0x66, 0xfe, 0x04, 0xec,
+       0x20, 0x4f, 0xfe, 0x05,
+       0xf6, 0xfe, 0x34, 0x01, 0x01, 0xfe, 0x4a, 0x17, 0xfe, 0x08, 0x90, 0xfe,
+       0x48, 0xf4, 0x0d, 0xfe,
+       0x18, 0x13, 0xba, 0xfe, 0x02, 0xea, 0xd5, 0x69, 0x7e, 0xfe, 0xc5, 0x13,
+       0x15, 0x1a, 0x39, 0xa0,
+       0xb4, 0xfe, 0x2e, 0x10, 0x03, 0xfe, 0x38, 0x01, 0x1e, 0xfe, 0xf0, 0xff,
+       0x0c, 0xfe, 0x60, 0x01,
+       0x03, 0xfe, 0x3a, 0x01, 0x0c, 0xfe, 0x62, 0x01, 0x43, 0x13, 0x20, 0x25,
+       0x06, 0x13, 0x2f, 0x12,
+       0x2f, 0x92, 0x0f, 0x06, 0x04, 0x21, 0x04, 0x22, 0x59, 0xfe, 0xf7, 0x12,
+       0x22, 0x9f, 0xb7, 0x13,
+       0x9f, 0x07, 0x7e, 0xfe, 0x71, 0x13, 0xfe, 0x24, 0x1c, 0x15, 0x19, 0x39,
+       0xa0, 0xb4, 0xfe, 0xd9,
+       0x10, 0xc3, 0xfe, 0x03, 0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x04,
+       0xc3, 0xfe, 0x03, 0xdc,
+       0xfe, 0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x04, 0xfe, 0x03, 0x57, 0xc3, 0x21,
+       0xfe, 0x00, 0xcc, 0x04,
+       0xfe, 0x03, 0x57, 0xc3, 0x78, 0x04, 0x08, 0x05, 0x58, 0xfe, 0x22, 0x13,
+       0xfe, 0x1c, 0x80, 0x07,
+       0x06, 0xfe, 0x1a, 0x13, 0xfe, 0x1e, 0x80, 0xed, 0xfe, 0x1d, 0x80, 0xae,
+       0xfe, 0x0c, 0x90, 0xfe,
+       0x0e, 0x13, 0xfe, 0x0e, 0x90, 0xac, 0xfe, 0x3c, 0x90, 0xfe, 0x30, 0xf4,
+       0x0a, 0xfe, 0x3c, 0x50,
+       0xaa, 0x01, 0xfe, 0x7a, 0x17, 0x32, 0x07, 0x2f, 0xad, 0x01, 0xfe, 0xb4,
+       0x16, 0x08, 0x05, 0x1b,
+       0x4e, 0x01, 0xf5, 0x01, 0xf6, 0x12, 0xfe, 0xe9, 0x00, 0x08, 0x05, 0x58,
+       0xfe, 0x2c, 0x13, 0x01,
+       0xfe, 0x0c, 0x17, 0xfe, 0x1e, 0x1c, 0xfe, 0x14, 0x90, 0xfe, 0x96, 0x90,
+       0x0c, 0xfe, 0x64, 0x01,
+       0x14, 0xfe, 0x66, 0x01, 0x08, 0x05, 0x5b, 0xfe, 0x12, 0x12, 0xfe, 0x03,
+       0x80, 0x8d, 0xfe, 0x01,
+       0xec, 0x20, 0xfe, 0x80, 0x40, 0x13, 0x20, 0x6a, 0x2a, 0x12, 0xcf, 0x64,
+       0x22, 0x20, 0xfb, 0x79,
+       0x20, 0x04, 0xfe, 0x08, 0x1c, 0x03, 0xfe, 0xac, 0x00, 0xfe, 0x06, 0x58,
+       0x03, 0xfe, 0xae, 0x00,
+
+       0xfe, 0x07, 0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe, 0x08, 0x58, 0x03, 0xfe,
+       0xb2, 0x00, 0xfe, 0x09,
+       0x58, 0xfe, 0x0a, 0x1c, 0x25, 0x6e, 0x13, 0xd0, 0x21, 0x0c, 0x5c, 0x0c,
+       0x45, 0x0f, 0x46, 0x52,
+       0x50, 0x18, 0x1b, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x23, 0xfe, 0xfc,
+       0x0f, 0x44, 0x11, 0x0f,
+       0x48, 0x52, 0x18, 0x58, 0xfe, 0x90, 0x4d, 0xfe, 0x91, 0x54, 0x23, 0xe4,
+       0x25, 0x11, 0x13, 0x20,
+       0x7c, 0x6f, 0x4f, 0x22, 0x20, 0xfb, 0x79, 0x20, 0x12, 0xcf, 0xfe, 0x14,
+       0x56, 0xfe, 0xd6, 0xf0,
+       0xfe, 0x26, 0x10, 0xf8, 0x74, 0xfe, 0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe,
+       0x18, 0x1c, 0x04, 0x42,
+       0xfe, 0x0c, 0x14, 0xfc, 0xfe, 0x07, 0xe6, 0x1b, 0xfe, 0xce, 0x47, 0xfe,
+       0xf5, 0x13, 0x04, 0x01,
+       0xb0, 0x7c, 0x6f, 0x4f, 0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42,
+       0x13, 0x32, 0x07, 0x2f,
+       0xfe, 0x34, 0x13, 0x09, 0x48, 0x01, 0x0e, 0xbb, 0xfe, 0x36, 0x12, 0xfe,
+       0x41, 0x48, 0xfe, 0x45,
+       0x48, 0x01, 0xf0, 0xfe, 0x00, 0xcc, 0xbb, 0xfe, 0xf3, 0x13, 0x43, 0x78,
+       0x07, 0x11, 0xac, 0x09,
+       0x84, 0x01, 0x0e, 0xfe, 0x80, 0x5c, 0x01, 0x73, 0xfe, 0x0e, 0x10, 0x07,
+       0x82, 0x4e, 0xfe, 0x14,
+       0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x60, 0x10, 0x04, 0xfe, 0x44, 0x58, 0x8d,
+       0xfe, 0x01, 0xec, 0xa2,
+       0xfe, 0x9e, 0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x1a, 0x79,
+       0x2a, 0x01, 0xe3, 0xfe,
+       0xdd, 0x10, 0x2c, 0xc7, 0x81, 0xc8, 0x83, 0x33, 0x31, 0xde, 0x07, 0x1a,
+       0xfe, 0x48, 0x12, 0x07,
+       0x0a, 0xfe, 0x56, 0x12, 0x07, 0x19, 0xfe, 0x30, 0x12, 0x07, 0xc9, 0x17,
+       0xfe, 0x32, 0x12, 0x07,
+       0xfe, 0x23, 0x00, 0x17, 0xeb, 0x07, 0x06, 0x17, 0xfe, 0x9c, 0x12, 0x07,
+       0x1f, 0xfe, 0x12, 0x12,
+       0x07, 0x00, 0x17, 0x24, 0x15, 0xc9, 0x01, 0x36, 0xa9, 0x2d, 0x01, 0x0b,
+       0x94, 0x4b, 0x04, 0x2d,
+       0xdd, 0x09, 0xd1, 0x01, 0xfe, 0x26, 0x0f, 0x12, 0x82, 0x02, 0x2b, 0x2d,
+       0x32, 0x07, 0xa6, 0xfe,
+       0xd9, 0x13, 0x3a, 0x3d, 0x3b, 0x3e, 0x56, 0xfe, 0xf0, 0x11, 0x08, 0x05,
+       0x5a, 0xfe, 0x72, 0x12,
+       0x9b, 0x2e, 0x9c, 0x3c, 0x90, 0xc0, 0x96, 0xfe, 0xba, 0x11, 0x22, 0x62,
+       0xfe, 0x26, 0x13, 0x03,
+       0x7f, 0x29, 0x80, 0x56, 0xfe, 0x76, 0x0d, 0x0c, 0x60, 0x14, 0x61, 0x21,
+       0x0c, 0x7f, 0x0c, 0x80,
+       0x01, 0xb3, 0x25, 0x6e, 0x77, 0x13, 0x62, 0x01, 0xef, 0x9b, 0x2e, 0x9c,
+       0x3c, 0xfe, 0x04, 0x55,
+       0xfe, 0xa5, 0x55, 0xfe, 0x04, 0xfa, 0x2e, 0xfe, 0x05, 0xfa, 0x3c, 0xfe,
+       0x91, 0x10, 0x03, 0x3f,
+       0x29, 0x40, 0xfe, 0x40, 0x56, 0xfe, 0xe1, 0x56, 0x0c, 0x3f, 0x14, 0x40,
+       0x88, 0x9b, 0x2e, 0x9c,
+       0x3c, 0x90, 0xc0, 0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x00, 0x56, 0xfe, 0xa1,
+       0x56, 0x0c, 0x5e, 0x14,
+       0x5f, 0x08, 0x05, 0x5a, 0xfe, 0x1e, 0x12, 0x22, 0x62, 0xfe, 0x1f, 0x40,
+       0x03, 0x60, 0x29, 0x61,
+       0xfe, 0x2c, 0x50, 0xfe, 0xae, 0x50, 0x03, 0x3f, 0x29, 0x40, 0xfe, 0x44,
+       0x50, 0xfe, 0xc6, 0x50,
+       0x03, 0x5e, 0x29, 0x5f, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x03, 0x3d,
+       0x29, 0x3e, 0xfe, 0x40,
+       0x50, 0xfe, 0xc2, 0x50, 0x02, 0x89, 0x25, 0x06, 0x13, 0xd4, 0x02, 0x72,
+       0x2d, 0x01, 0x0b, 0x1d,
+       0x4c, 0x33, 0x31, 0xde, 0x07, 0x06, 0x23, 0x4c, 0x32, 0x07, 0xa6, 0x23,
+       0x72, 0x01, 0xaf, 0x1e,
+       0x43, 0x17, 0x4c, 0x08, 0x05, 0x0a, 0xee, 0x3a, 0x3d, 0x3b, 0x3e, 0xfe,
+       0x0a, 0x55, 0x35, 0xfe,
+       0x8b, 0x55, 0x57, 0x3d, 0x7d, 0x3e, 0xfe, 0x0c, 0x51, 0xfe, 0x8e, 0x51,
+       0x02, 0x72, 0xfe, 0x19,
+       0x81, 0xba, 0xfe, 0x19, 0x41, 0x02, 0x72, 0x2d, 0x01, 0x0b, 0x1c, 0x34,
+       0x1d, 0xe8, 0x33, 0x31,
+       0xe1, 0x55, 0x19, 0xfe, 0xa6, 0x12, 0x55, 0x0a, 0x4d, 0x02, 0x4c, 0x01,
+       0x0b, 0x1c, 0x34, 0x1d,
+       0xe8, 0x33, 0x31, 0xdf, 0x07, 0x19, 0x23, 0x4c, 0x01, 0x0b, 0x1d, 0xe8,
+       0x33, 0x31, 0xfe, 0xe8,
+       0x09, 0xfe, 0xc2, 0x49, 0x51, 0x03, 0xfe, 0x9c, 0x00, 0x28, 0x8a, 0x53,
+       0x05, 0x1f, 0x35, 0xa9,
+       0xfe, 0xbb, 0x45, 0x55, 0x00, 0x4e, 0x44, 0x06, 0x7c, 0x43, 0xfe, 0xda,
+       0x14, 0x01, 0xaf, 0x8c,
+       0xfe, 0x4b, 0x45, 0xee, 0x32, 0x07, 0xa5, 0xed, 0x03, 0xcd, 0x28, 0x8a,
+       0x03, 0x45, 0x28, 0x35,
+       0x67, 0x02, 0x72, 0xfe, 0xc0, 0x5d, 0xfe, 0xf8, 0x14, 0xfe, 0x03, 0x17,
+       0x03, 0x5c, 0xc1, 0x0c,
+       0x5c, 0x67, 0x2d, 0x01, 0x0b, 0x26, 0x89, 0x01, 0xfe, 0x9e, 0x15, 0x02,
+       0x89, 0x01, 0x0b, 0x1c,
+       0x34, 0x1d, 0x4c, 0x33, 0x31, 0xdf, 0x07, 0x06, 0x23, 0x4c, 0x01, 0xf1,
+       0xfe, 0x42, 0x58, 0xf1,
+       0xfe, 0xa4, 0x14, 0x8c, 0xfe, 0x4a, 0xf4, 0x0a, 0x17, 0x4c, 0xfe, 0x4a,
+       0xf4, 0x06, 0xea, 0x32,
+       0x07, 0xa5, 0x8b, 0x02, 0x72, 0x03, 0x45, 0xc1, 0x0c, 0x45, 0x67, 0x2d,
+       0x01, 0x0b, 0x26, 0x89,
+       0x01, 0xfe, 0xcc, 0x15, 0x02, 0x89, 0x0f, 0x06, 0x27, 0xfe, 0xbe, 0x13,
+       0x26, 0xfe, 0xd4, 0x13,
+       0x76, 0xfe, 0x89, 0x48, 0x01, 0x0b, 0x21, 0x76, 0x04, 0x7b, 0xfe, 0xd0,
+       0x13, 0x1c, 0xfe, 0xd0,
+       0x13, 0x1d, 0xfe, 0xbe, 0x13, 0x67, 0x2d, 0x01, 0x0b, 0xfe, 0xd5, 0x10,
+       0x0f, 0x71, 0xff, 0x02,
+       0x00, 0x57, 0x52, 0x93, 0x1e, 0xfe, 0xff, 0x7f, 0xfe, 0x30, 0x56, 0xfe,
+       0x00, 0x5c, 0x04, 0x0f,
+       0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0x1e, 0x43, 0xfe, 0x30, 0x56,
+       0xfe, 0x00, 0x5c, 0x04,
+       0x0f, 0x71, 0xff, 0x02, 0x00, 0x57, 0x52, 0x93, 0x04, 0x0f, 0x71, 0xff,
+       0x02, 0x00, 0x57, 0x52,
+       0x93, 0xfe, 0x0b, 0x58, 0x04, 0x09, 0x5c, 0x01, 0x87, 0x09, 0x45, 0x01,
+       0x87, 0x04, 0xfe, 0x03,
+       0xa1, 0x1e, 0x11, 0xff, 0x03, 0x00, 0x54, 0xfe, 0x00, 0xf4, 0x1f, 0x52,
+       0xfe, 0x00, 0x7d, 0xfe,
+       0x01, 0x7d, 0xfe, 0x02, 0x7d, 0xfe, 0x03, 0x7c, 0x6a, 0x2a, 0x0c, 0x5e,
+       0x14, 0x5f, 0x57, 0x3f,
+       0x7d, 0x40, 0x04, 0xdd, 0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83,
+       0x5a, 0x8d, 0x04, 0x01,
+       0xfe, 0x0c, 0x19, 0xfe, 0x42, 0x48, 0x50, 0x51, 0x91, 0x01, 0x0b, 0x1d,
+       0xfe, 0x96, 0x15, 0x33,
+       0x31, 0xe1, 0x01, 0x0b, 0x1d, 0xfe, 0x96, 0x15, 0x33, 0x31, 0xfe, 0xe8,
+       0x0a, 0xfe, 0xc1, 0x59,
+       0x03, 0xcd, 0x28, 0xfe, 0xcc, 0x12, 0x53, 0x05, 0x1a, 0xfe, 0xc4, 0x13,
+       0x21, 0x69, 0x1a, 0xee,
+       0x55, 0xca, 0x6b, 0xfe, 0xdc, 0x14, 0x4d, 0x0f, 0x06, 0x18, 0xca, 0x7c,
+       0x30, 0xfe, 0x78, 0x10,
+       0xff, 0x02, 0x83, 0x55, 0xab, 0xff, 0x02, 0x83, 0x55, 0x69, 0x19, 0xae,
+       0x98, 0xfe, 0x30, 0x00,
+       0x96, 0xf2, 0x18, 0x6d, 0x0f, 0x06, 0xfe, 0x56, 0x10, 0x69, 0x0a, 0xed,
+       0x98, 0xfe, 0x64, 0x00,
+       0x96, 0xf2, 0x09, 0xfe, 0x64, 0x00, 0x18, 0x9e, 0x0f, 0x06, 0xfe, 0x28,
+       0x10, 0x69, 0x06, 0xfe,
+       0x60, 0x13, 0x98, 0xfe, 0xc8, 0x00, 0x96, 0xf2, 0x09, 0xfe, 0xc8, 0x00,
+       0x18, 0x59, 0x0f, 0x06,
+       0x88, 0x98, 0xfe, 0x90, 0x01, 0x7a, 0xfe, 0x42, 0x15, 0x91, 0xe4, 0xfe,
+       0x43, 0xf4, 0x9f, 0xfe,
+       0x56, 0xf0, 0xfe, 0x54, 0x15, 0xfe, 0x04, 0xf4, 0x71, 0xfe, 0x43, 0xf4,
+       0x9e, 0xfe, 0xf3, 0x10,
+       0xfe, 0x40, 0x5c, 0x01, 0xfe, 0x16, 0x14, 0x1e, 0x43, 0xec, 0xfe, 0x00,
+       0x17, 0xfe, 0x4d, 0xe4,
+       0x6e, 0x7a, 0xfe, 0x90, 0x15, 0xc4, 0x6e, 0xfe, 0x1c, 0x10, 0xfe, 0x00,
+       0x17, 0xfe, 0x4d, 0xe4,
+       0xcc, 0x7a, 0xfe, 0x90, 0x15, 0xc4, 0xcc, 0x88, 0x51, 0x21, 0xfe, 0x4d,
+       0xf4, 0x00, 0xe9, 0x91,
+       0x0f, 0x06, 0xfe, 0xb4, 0x56, 0xfe, 0xc3, 0x58, 0x04, 0x51, 0x0f, 0x0a,
+       0x04, 0x16, 0x06, 0x01,
+       0x0b, 0x26, 0xf3, 0x16, 0x0a, 0x01, 0x0b, 0x26, 0xf3, 0x16, 0x19, 0x01,
+       0x0b, 0x26, 0xf3, 0x76,
+       0xfe, 0x89, 0x49, 0x01, 0x0b, 0x04, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1,
+       0x16, 0x19, 0x01, 0x0b,
+       0x26, 0xb1, 0x16, 0x06, 0x01, 0x0b, 0x26, 0xb1, 0xfe, 0x89, 0x49, 0x01,
+       0x0b, 0x26, 0xb1, 0x76,
+       0xfe, 0x89, 0x4a, 0x01, 0x0b, 0x04, 0x51, 0x04, 0x22, 0xd3, 0x07, 0x06,
+       0xfe, 0x48, 0x13, 0xb8,
+       0x13, 0xd3, 0xfe, 0x49, 0xf4, 0x00, 0x4d, 0x76, 0xa9, 0x67, 0xfe, 0x01,
+       0xec, 0xfe, 0x27, 0x01,
+       0xfe, 0x89, 0x48, 0xff, 0x02, 0x00, 0x10, 0x27, 0xfe, 0x2e, 0x16, 0x32,
+       0x07, 0xfe, 0xe3, 0x00,
+       0xfe, 0x20, 0x13, 0x1d, 0xfe, 0x52, 0x16, 0x21, 0x13, 0xd4, 0x01, 0x4b,
+       0x22, 0xd4, 0x07, 0x06,
+       0x4e, 0x08, 0x54, 0x06, 0x37, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfb, 0x8e,
+       0x07, 0x11, 0xae, 0x09,
+       0x84, 0x01, 0x0e, 0x8e, 0x09, 0x5d, 0x01, 0xa8, 0x04, 0x09, 0x84, 0x01,
+       0x0e, 0x8e, 0xfe, 0x80,
+       0xe7, 0x11, 0x07, 0x11, 0x8a, 0xfe, 0x45, 0x58, 0x01, 0xf0, 0x8e, 0x04,
+       0x09, 0x48, 0x01, 0x0e,
+       0x8e, 0x09, 0x5d, 0x01, 0xa8, 0x04, 0x09, 0x48, 0x01, 0x0e, 0xfe, 0x80,
+       0x80, 0xfe, 0x80, 0x4c,
+       0xfe, 0x49, 0xe4, 0x11, 0xae, 0x09, 0x84, 0x01, 0x0e, 0xfe, 0x80, 0x4c,
+       0x09, 0x5d, 0x01, 0x87,
+       0x04, 0x18, 0x11, 0x75, 0x6c, 0xfe, 0x60, 0x01, 0xfe, 0x18, 0xdf, 0xfe,
+       0x19, 0xde, 0xfe, 0x24,
+       0x1c, 0xfe, 0x1d, 0xf7, 0x1b, 0x97, 0xfe, 0xee, 0x16, 0x01, 0xfe, 0xf4,
+       0x17, 0xad, 0x9a, 0x1b,
+       0x6c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x04, 0xb9, 0x23, 0xfe, 0xde,
+       0x16, 0xfe, 0xda, 0x10,
+       0x18, 0x11, 0x75, 0x03, 0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x1f, 0xfe,
+       0x18, 0x58, 0x03, 0xfe,
+       0x66, 0x01, 0xfe, 0x19, 0x58, 0x9a, 0x1f, 0xfe, 0x3c, 0x90, 0xfe, 0x30,
+       0xf4, 0x06, 0xfe, 0x3c,
+       0x50, 0x6c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7, 0x1f,
+       0x97, 0xfe, 0x38, 0x17,
+       0xfe, 0xb6, 0x14, 0x35, 0x04, 0xb9, 0x23, 0xfe, 0x10, 0x17, 0xfe, 0x9c,
+       0x10, 0x18, 0x11, 0x75,
+       0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe, 0x1d, 0xf7,
+       0x2e, 0x97, 0xfe, 0x5a,
+       0x17, 0xfe, 0x94, 0x14, 0xec, 0x9a, 0x2e, 0x6c, 0x1a, 0xfe, 0xaf, 0x19,
+       0xfe, 0x98, 0xe7, 0x00,
+       0x04, 0xb9, 0x23, 0xfe, 0x4e, 0x17, 0xfe, 0x6c, 0x10, 0x18, 0x11, 0x75,
+       0xfe, 0x30, 0xbc, 0xfe,
+       0xb2, 0xbc, 0x9a, 0xcb, 0x6c, 0x1a, 0xfe, 0x0f, 0x79, 0xfe, 0x1c, 0xf7,
+       0xcb, 0x97, 0xfe, 0x92,
+       0x17, 0xfe, 0x5c, 0x14, 0x35, 0x04, 0xb9, 0x23, 0xfe, 0x7e, 0x17, 0xfe,
+       0x42, 0x10, 0xfe, 0x02,
+       0xf6, 0x11, 0x75, 0xfe, 0x18, 0xfe, 0x60, 0xfe, 0x19, 0xfe, 0x61, 0xfe,
+       0x03, 0xa1, 0xfe, 0x1d,
+       0xf7, 0x5b, 0x97, 0xfe, 0xb8, 0x17, 0xfe, 0x36, 0x14, 0xfe, 0x1c, 0x13,
+       0x9a, 0x5b, 0x41, 0xfe,
+       0x83, 0x58, 0xfe, 0xaf, 0x19, 0xfe, 0x80, 0xe7, 0x11, 0xfe, 0x81, 0xe7,
+       0x11, 0x12, 0xfe, 0xdd,
+       0x00, 0x6a, 0x2a, 0x04, 0x6a, 0x2a, 0xfe, 0x12, 0x45, 0x23, 0xfe, 0xa8,
+       0x17, 0x15, 0x06, 0x39,
+       0xa0, 0xb4, 0x02, 0x2b, 0xfe, 0x39, 0xf0, 0xfe, 0xfc, 0x17, 0x21, 0x04,
+       0xfe, 0x7e, 0x18, 0x1e,
+       0x19, 0x66, 0x0f, 0x0d, 0x04, 0x75, 0x03, 0xd2, 0x1e, 0x06, 0xfe, 0xef,
+       0x12, 0xfe, 0xe1, 0x10,
+       0x7c, 0x6f, 0x4f, 0x32, 0x07, 0x2f, 0xfe, 0x3c, 0x13, 0xf1, 0xfe, 0x42,
+       0x13, 0x42, 0x92, 0x09,
+       0x48, 0x01, 0x0e, 0xbb, 0xeb, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01,
+       0xf0, 0xfe, 0x00, 0xcc,
+       0xbb, 0xfe, 0xf3, 0x13, 0x43, 0x78, 0x07, 0x11, 0xac, 0x09, 0x84, 0x01,
+       0x0e, 0xfe, 0x80, 0x4c,
+       0x01, 0x73, 0xfe, 0x16, 0x10, 0x07, 0x82, 0x8b, 0xfe, 0x40, 0x14, 0xfe,
+       0x24, 0x12, 0xfe, 0x14,
+       0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0x1c, 0x18, 0x18, 0x0a, 0x04, 0xfe, 0x9c,
+       0xe7, 0x0a, 0x10, 0xfe,
+       0x15, 0x00, 0x64, 0x79, 0x2a, 0x01, 0xe3, 0x18, 0x06, 0x04, 0x42, 0x92,
+       0x08, 0x54, 0x1b, 0x37,
+       0x12, 0x2f, 0x01, 0x73, 0x18, 0x06, 0x04, 0xfe, 0x38, 0x90, 0xfe, 0xba,
+       0x90, 0x3a, 0xce, 0x3b,
+       0xcf, 0xfe, 0x48, 0x55, 0x35, 0xfe, 0xc9, 0x55, 0x04, 0x22, 0xa3, 0x77,
+       0x13, 0xa3, 0x04, 0x09,
+       0xa4, 0x01, 0x0e, 0xfe, 0x41, 0x48, 0x09, 0x46, 0x01, 0x0e, 0xfe, 0x49,
+       0x44, 0x17, 0xfe, 0xe8,
+       0x18, 0x77, 0x78, 0x04, 0x09, 0x48, 0x01, 0x0e, 0x07, 0x11, 0x4e, 0x09,
+       0x5d, 0x01, 0xa8, 0x09,
+       0x46, 0x01, 0x0e, 0x77, 0x78, 0x04, 0xfe, 0x4e, 0xe4, 0x19, 0x6b, 0xfe,
+       0x1c, 0x19, 0x03, 0xfe,
+       0x90, 0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10, 0xfe, 0x4e, 0xe4, 0xc9,
+       0x6b, 0xfe, 0x2e, 0x19,
+       0x03, 0xfe, 0x92, 0x00, 0xfe, 0x02, 0xe6, 0x1a, 0xe5, 0xfe, 0x4e, 0xe4,
+       0xfe, 0x0b, 0x00, 0x6b,
+       0xfe, 0x40, 0x19, 0x03, 0xfe, 0x94, 0x00, 0xfe, 0x02, 0xe6, 0x1f, 0xfe,
+       0x08, 0x10, 0x03, 0xfe,
+       0x96, 0x00, 0xfe, 0x02, 0xe6, 0x6d, 0xfe, 0x4e, 0x45, 0xea, 0xba, 0xff,
+       0x04, 0x68, 0x54, 0xe7,
+       0x1e, 0x6e, 0xfe, 0x08, 0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c, 0xfe,
+       0x1a, 0xf4, 0xfe, 0x00,
+       0x04, 0xea, 0xfe, 0x48, 0xf4, 0x19, 0x7a, 0xfe, 0x74, 0x19, 0x0f, 0x19,
+       0x04, 0x07, 0x7e, 0xfe,
+       0x5a, 0xf0, 0xfe, 0x84, 0x19, 0x25, 0xfe, 0x09, 0x00, 0xfe, 0x34, 0x10,
+       0x07, 0x1a, 0xfe, 0x5a,
+       0xf0, 0xfe, 0x92, 0x19, 0x25, 0xca, 0xfe, 0x26, 0x10, 0x07, 0x19, 0x66,
+       0x25, 0x6d, 0xe5, 0x07,
+       0x0a, 0x66, 0x25, 0x9e, 0xfe, 0x0e, 0x10, 0x07, 0x06, 0x66, 0x25, 0x59,
+       0xa9, 0xb8, 0x04, 0x15,
+       0xfe, 0x09, 0x00, 0x01, 0x36, 0xfe, 0x04, 0xfe, 0x81, 0x03, 0x83, 0xfe,
+       0x40, 0x5c, 0x04, 0x1c,
+       0xf7, 0xfe, 0x14, 0xf0, 0x0b, 0x27, 0xfe, 0xd6, 0x19, 0x1c, 0xf7, 0x7b,
+       0xf7, 0xfe, 0x82, 0xf0,
+       0xfe, 0xda, 0x19, 0x04, 0xff, 0xcc, 0x00, 0x00,
 };
 
-STATIC unsigned short _adv_asc38C0800_size =
-        sizeof(_adv_asc38C0800_buf); /* 0x14E1 */
-STATIC ADV_DCNT _adv_asc38C0800_chksum =
-        0x050D3FD8UL; /* Expanded little-endian checksum. */
+static unsigned short _adv_asc38C0800_size = sizeof(_adv_asc38C0800_buf);      /* 0x14E1 */
+static ADV_DCNT _adv_asc38C0800_chksum = 0x050D3FD8UL; /* Expanded little-endian checksum. */
 
 /* Microcode buffer is kept after initialization for error recovery. */
-STATIC unsigned char _adv_asc38C1600_buf[] = {
-  0x00,  0x00,  0x00,  0xf2,  0x00,  0x16,  0x00,  0xfc,  0x00,  0x10,  0x00,  0xf0,  0x18,  0xe4,  0x01,  0x00,
-  0x04,  0x1e,  0x48,  0xe4,  0x03,  0xf6,  0xf7,  0x13,  0x2e,  0x1e,  0x02,  0x00,  0x07,  0x17,  0xc0,  0x5f,
-  0x00,  0xfa,  0xff,  0xff,  0x04,  0x00,  0x00,  0xf6,  0x09,  0xe7,  0x82,  0xe7,  0x85,  0xf0,  0x86,  0xf0,
-  0x4e,  0x10,  0x9e,  0xe7,  0xff,  0x00,  0x55,  0xf0,  0x01,  0xf6,  0x03,  0x00,  0x98,  0x57,  0x01,  0xe6,
-  0x00,  0xea,  0x00,  0xec,  0x01,  0xfa,  0x18,  0xf4,  0x08,  0x00,  0xf0,  0x1d,  0x38,  0x54,  0x32,  0xf0,
-  0x10,  0x00,  0xc2,  0x0e,  0x1e,  0xf0,  0xd5,  0xf0,  0xbc,  0x00,  0x4b,  0xe4,  0x00,  0xe6,  0xb1,  0xf0,
-  0xb4,  0x00,  0x02,  0x13,  0x3e,  0x1c,  0xc8,  0x47,  0x3e,  0x00,  0xd8,  0x01,  0x06,  0x13,  0x0c,  0x1c,
-  0x5e,  0x1e,  0x00,  0x57,  0xc8,  0x57,  0x01,  0xfc,  0xbc,  0x0e,  0xa2,  0x12,  0xb9,  0x54,  0x00,  0x80,
-  0x62,  0x0a,  0x5a,  0x12,  0xc8,  0x15,  0x3e,  0x1e,  0x18,  0x40,  0xbd,  0x56,  0x03,  0xe6,  0x01,  0xea,
-  0x5c,  0xf0,  0x0f,  0x00,  0x20,  0x00,  0x6c,  0x01,  0x6e,  0x01,  0x04,  0x12,  0x04,  0x13,  0xbb,  0x55,
-  0x3c,  0x56,  0x3e,  0x57,  0x03,  0x58,  0x4a,  0xe4,  0x40,  0x00,  0xb6,  0x00,  0xbb,  0x00,  0xc0,  0x00,
-  0x00,  0x01,  0x01,  0x01,  0x3e,  0x01,  0x58,  0x0a,  0x44,  0x10,  0x0a,  0x12,  0x4c,  0x1c,  0x4e,  0x1c,
-  0x02,  0x4a,  0x30,  0xe4,  0x05,  0xe6,  0x0c,  0x00,  0x3c,  0x00,  0x80,  0x00,  0x24,  0x01,  0x3c,  0x01,
-  0x68,  0x01,  0x6a,  0x01,  0x70,  0x01,  0x72,  0x01,  0x74,  0x01,  0x76,  0x01,  0x78,  0x01,  0x7c,  0x01,
-  0xc6,  0x0e,  0x0c,  0x10,  0xac,  0x12,  0xae,  0x12,  0x16,  0x1a,  0x32,  0x1c,  0x6e,  0x1e,  0x02,  0x48,
-  0x3a,  0x55,  0xc9,  0x57,  0x02,  0xee,  0x5b,  0xf0,  0x03,  0xf7,  0x06,  0xf7,  0x03,  0xfc,  0x06,  0x00,
-  0x1e,  0x00,  0xbe,  0x00,  0xe1,  0x00,  0x0c,  0x12,  0x18,  0x1a,  0x70,  0x1a,  0x30,  0x1c,  0x38,  0x1c,
-  0x10,  0x44,  0x00,  0x4c,  0xb0,  0x57,  0x40,  0x5c,  0x4d,  0xe4,  0x04,  0xea,  0x5d,  0xf0,  0xa7,  0xf0,
-  0x04,  0xf6,  0x02,  0xfc,  0x05,  0x00,  0x09,  0x00,  0x19,  0x00,  0x32,  0x00,  0x33,  0x00,  0x34,  0x00,
-  0x36,  0x00,  0x98,  0x00,  0x9e,  0x00,  0xcc,  0x00,  0x20,  0x01,  0x4e,  0x01,  0x79,  0x01,  0x3c,  0x09,
-  0x68,  0x0d,  0x02,  0x10,  0x04,  0x10,  0x3a,  0x10,  0x08,  0x12,  0x0a,  0x13,  0x40,  0x16,  0x50,  0x16,
-  0x00,  0x17,  0x4a,  0x19,  0x00,  0x4e,  0x00,  0x54,  0x01,  0x58,  0x00,  0xdc,  0x05,  0xf0,  0x09,  0xf0,
-  0x59,  0xf0,  0xb8,  0xf0,  0x48,  0xf4,  0x0e,  0xf7,  0x0a,  0x00,  0x9b,  0x00,  0x9c,  0x00,  0xa4,  0x00,
-  0xb5,  0x00,  0xba,  0x00,  0xd0,  0x00,  0xe7,  0x00,  0xf0,  0x03,  0x69,  0x08,  0xe9,  0x09,  0x5c,  0x0c,
-  0xb6,  0x12,  0xbc,  0x19,  0xd8,  0x1b,  0x20,  0x1c,  0x34,  0x1c,  0x36,  0x1c,  0x42,  0x1d,  0x08,  0x44,
-  0x38,  0x44,  0x91,  0x44,  0x0a,  0x45,  0x48,  0x46,  0x89,  0x48,  0x68,  0x54,  0x83,  0x55,  0x83,  0x59,
-  0x31,  0xe4,  0x02,  0xe6,  0x07,  0xf0,  0x08,  0xf0,  0x0b,  0xf0,  0x0c,  0xf0,  0x4b,  0xf4,  0x04,  0xf8,
-  0x05,  0xf8,  0x02,  0xfa,  0x03,  0xfa,  0x04,  0xfc,  0x05,  0xfc,  0x07,  0x00,  0xa8,  0x00,  0xaa,  0x00,
-  0xb9,  0x00,  0xe0,  0x00,  0xe5,  0x00,  0x22,  0x01,  0x26,  0x01,  0x60,  0x01,  0x7a,  0x01,  0x82,  0x01,
-  0xc8,  0x01,  0xca,  0x01,  0x86,  0x02,  0x6a,  0x03,  0x18,  0x05,  0xb2,  0x07,  0x68,  0x08,  0x10,  0x0d,
-  0x06,  0x10,  0x0a,  0x10,  0x0e,  0x10,  0x12,  0x10,  0x60,  0x10,  0xed,  0x10,  0xf3,  0x10,  0x06,  0x12,
-  0x10,  0x12,  0x1e,  0x12,  0x0c,  0x13,  0x0e,  0x13,  0x10,  0x13,  0xfe,  0x9c,  0xf0,  0x35,  0x05,  0xfe,
-  0xec,  0x0e,  0xff,  0x10,  0x00,  0x00,  0xe9,  0xfe,  0x34,  0x1f,  0x00,  0xe8,  0xfe,  0x88,  0x01,  0xff,
-  0x03,  0x00,  0x00,  0xfe,  0x93,  0x15,  0xfe,  0x0f,  0x05,  0xff,  0x38,  0x00,  0x00,  0xfe,  0x57,  0x24,
-  0x00,  0xfe,  0x4c,  0x00,  0x65,  0xff,  0x04,  0x00,  0x00,  0x1a,  0xff,  0x09,  0x00,  0x00,  0xff,  0x08,
-  0x01,  0x01,  0xff,  0x08,  0xff,  0xff,  0xff,  0x27,  0x00,  0x00,  0xff,  0x10,  0xff,  0xff,  0xff,  0x13,
-  0x00,  0x00,  0xfe,  0x78,  0x56,  0xfe,  0x34,  0x12,  0xff,  0x21,  0x00,  0x00,  0xfe,  0x04,  0xf7,  0xe8,
-  0x37,  0x7d,  0x0d,  0x01,  0xfe,  0x4a,  0x11,  0xfe,  0x04,  0xf7,  0xe8,  0x7d,  0x0d,  0x51,  0x37,  0xfe,
-  0x3d,  0xf0,  0xfe,  0x0c,  0x02,  0xfe,  0x20,  0xf0,  0xbc,  0xfe,  0x91,  0xf0,  0xfe,  0xf8,  0x01,  0xfe,
-  0x90,  0xf0,  0xfe,  0xf8,  0x01,  0xfe,  0x8f,  0xf0,  0xbc,  0x03,  0x67,  0x4d,  0x05,  0xfe,  0x08,  0x0f,
-  0x01,  0xfe,  0x78,  0x0f,  0xfe,  0xdd,  0x12,  0x05,  0xfe,  0x0e,  0x03,  0xfe,  0x28,  0x1c,  0x03,  0xfe,
-  0xa6,  0x00,  0xfe,  0xd1,  0x12,  0x3e,  0x22,  0xfe,  0xa6,  0x00,  0xac,  0xfe,  0x48,  0xf0,  0xfe,  0x90,
-  0x02,  0xfe,  0x49,  0xf0,  0xfe,  0xaa,  0x02,  0xfe,  0x4a,  0xf0,  0xfe,  0xc8,  0x02,  0xfe,  0x46,  0xf0,
-  0xfe,  0x5a,  0x02,  0xfe,  0x47,  0xf0,  0xfe,  0x60,  0x02,  0xfe,  0x43,  0xf0,  0xfe,  0x4e,  0x02,  0xfe,
-  0x44,  0xf0,  0xfe,  0x52,  0x02,  0xfe,  0x45,  0xf0,  0xfe,  0x56,  0x02,  0x1c,  0x0d,  0xa2,  0x1c,  0x07,
-  0x22,  0xb7,  0x05,  0x35,  0xfe,  0x00,  0x1c,  0xfe,  0xf1,  0x10,  0xfe,  0x02,  0x1c,  0xf5,  0xfe,  0x1e,
-  0x1c,  0xfe,  0xe9,  0x10,  0x01,  0x5f,  0xfe,  0xe7,  0x10,  0xfe,  0x06,  0xfc,  0xde,  0x0a,  0x81,  0x01,
-  0xa3,  0x05,  0x35,  0x1f,  0x95,  0x47,  0xb8,  0x01,  0xfe,  0xe4,  0x11,  0x0a,  0x81,  0x01,  0x5c,  0xfe,
-  0xbd,  0x10,  0x0a,  0x81,  0x01,  0x5c,  0xfe,  0xad,  0x10,  0xfe,  0x16,  0x1c,  0xfe,  0x58,  0x1c,  0x1c,
-  0x07,  0x22,  0xb7,  0x37,  0x2a,  0x35,  0xfe,  0x3d,  0xf0,  0xfe,  0x0c,  0x02,  0x2b,  0xfe,  0x9e,  0x02,
-  0xfe,  0x5a,  0x1c,  0xfe,  0x12,  0x1c,  0xfe,  0x14,  0x1c,  0x1f,  0xfe,  0x30,  0x00,  0x47,  0xb8,  0x01,
-  0xfe,  0xd4,  0x11,  0x1c,  0x07,  0x22,  0xb7,  0x05,  0xe9,  0x21,  0x2c,  0x09,  0x1a,  0x31,  0xfe,  0x69,
-  0x10,  0x1c,  0x07,  0x22,  0xb7,  0xfe,  0x04,  0xec,  0x2c,  0x60,  0x01,  0xfe,  0x1e,  0x1e,  0x20,  0x2c,
-  0xfe,  0x05,  0xf6,  0xde,  0x01,  0xfe,  0x62,  0x1b,  0x01,  0x0c,  0x61,  0x4a,  0x44,  0x15,  0x56,  0x51,
-  0x01,  0xfe,  0x9e,  0x1e,  0x01,  0xfe,  0x96,  0x1a,  0x05,  0x35,  0x0a,  0x57,  0x01,  0x18,  0x09,  0x00,
-  0x36,  0x01,  0x85,  0xfe,  0x18,  0x10,  0xfe,  0x41,  0x58,  0x0a,  0xba,  0x01,  0x18,  0xfe,  0xc8,  0x54,
-  0x7b,  0xfe,  0x1c,  0x03,  0x01,  0xfe,  0x96,  0x1a,  0x05,  0x35,  0x37,  0x60,  0xfe,  0x02,  0xe8,  0x30,
-  0xfe,  0xbf,  0x57,  0xfe,  0x9e,  0x43,  0xfe,  0x77,  0x57,  0xfe,  0x27,  0xf0,  0xfe,  0xe4,  0x01,  0xfe,
-  0x07,  0x4b,  0xfe,  0x20,  0xf0,  0xbc,  0xfe,  0x40,  0x1c,  0x2a,  0xeb,  0xfe,  0x26,  0xf0,  0xfe,  0x66,
-  0x03,  0xfe,  0xa0,  0xf0,  0xfe,  0x54,  0x03,  0xfe,  0x11,  0xf0,  0xbc,  0xfe,  0xef,  0x10,  0xfe,  0x9f,
-  0xf0,  0xfe,  0x74,  0x03,  0xfe,  0x46,  0x1c,  0x19,  0xfe,  0x11,  0x00,  0x05,  0x70,  0x37,  0xfe,  0x48,
-  0x1c,  0xfe,  0x46,  0x1c,  0x01,  0x0c,  0x06,  0x28,  0xfe,  0x18,  0x13,  0x26,  0x21,  0xb9,  0xc7,  0x20,
-  0xb9,  0x0a,  0x57,  0x01,  0x18,  0xc7,  0x89,  0x01,  0xfe,  0xc8,  0x1a,  0x15,  0xe1,  0x2a,  0xeb,  0xfe,
-  0x01,  0xf0,  0xeb,  0xfe,  0x82,  0xf0,  0xfe,  0xa4,  0x03,  0xfe,  0x9c,  0x32,  0x15,  0xfe,  0xe4,  0x00,
-  0x2f,  0xfe,  0xb6,  0x03,  0x2a,  0x3c,  0x16,  0xfe,  0xc6,  0x03,  0x01,  0x41,  0xfe,  0x06,  0xf0,  0xfe,
-  0xd6,  0x03,  0xaf,  0xa0,  0xfe,  0x0a,  0xf0,  0xfe,  0xa2,  0x07,  0x05,  0x29,  0x03,  0x81,  0x1e,  0x1b,
-  0xfe,  0x24,  0x05,  0x1f,  0x63,  0x01,  0x42,  0x8f,  0xfe,  0x70,  0x02,  0x05,  0xea,  0xfe,  0x46,  0x1c,
-  0x37,  0x7d,  0x1d,  0xfe,  0x67,  0x1b,  0xfe,  0xbf,  0x57,  0xfe,  0x77,  0x57,  0xfe,  0x48,  0x1c,  0x75,
-  0x01,  0xa6,  0x86,  0x0a,  0x57,  0x01,  0x18,  0x09,  0x00,  0x1b,  0xec,  0x0a,  0xe1,  0x01,  0x18,  0x77,
-  0x50,  0x40,  0x8d,  0x30,  0x03,  0x81,  0x1e,  0xf8,  0x1f,  0x63,  0x01,  0x42,  0x8f,  0xfe,  0x70,  0x02,
-  0x05,  0xea,  0xd7,  0x99,  0xd8,  0x9c,  0x2a,  0x29,  0x2f,  0xfe,  0x4e,  0x04,  0x16,  0xfe,  0x4a,  0x04,
-  0x7e,  0xfe,  0xa0,  0x00,  0xfe,  0x9b,  0x57,  0xfe,  0x54,  0x12,  0x32,  0xff,  0x02,  0x00,  0x10,  0x01,
-  0x08,  0x16,  0xfe,  0x02,  0x05,  0x32,  0x01,  0x08,  0x16,  0x29,  0x27,  0x25,  0xee,  0xfe,  0x4c,  0x44,
-  0xfe,  0x58,  0x12,  0x50,  0xfe,  0x44,  0x48,  0x13,  0x34,  0xfe,  0x4c,  0x54,  0x7b,  0xec,  0x60,  0x8d,
-  0x30,  0x01,  0xfe,  0x4e,  0x1e,  0xfe,  0x48,  0x47,  0xfe,  0x7c,  0x13,  0x01,  0x0c,  0x06,  0x28,  0xfe,
-  0x32,  0x13,  0x01,  0x43,  0x09,  0x9b,  0xfe,  0x68,  0x13,  0xfe,  0x26,  0x10,  0x13,  0x34,  0xfe,  0x4c,
-  0x54,  0x7b,  0xec,  0x01,  0xfe,  0x4e,  0x1e,  0xfe,  0x48,  0x47,  0xfe,  0x54,  0x13,  0x01,  0x0c,  0x06,
-  0x28,  0xa5,  0x01,  0x43,  0x09,  0x9b,  0xfe,  0x40,  0x13,  0x01,  0x0c,  0x06,  0x28,  0xf9,  0x1f,  0x7f,
-  0x01,  0x0c,  0x06,  0x07,  0x4d,  0x1f,  0xfe,  0x0d,  0x00,  0x01,  0x42,  0x8f,  0xfe,  0xa4,  0x0e,  0x05,
-  0x29,  0x32,  0x15,  0xfe,  0xe6,  0x00,  0x0f,  0xfe,  0x1c,  0x90,  0x04,  0xfe,  0x9c,  0x93,  0x3a,  0x0b,
-  0x0e,  0x8b,  0x02,  0x1f,  0x7f,  0x01,  0x42,  0x05,  0x35,  0xfe,  0x42,  0x5b,  0x7d,  0x1d,  0xfe,  0x46,
-  0x59,  0xfe,  0xbf,  0x57,  0xfe,  0x77,  0x57,  0x0f,  0xfe,  0x87,  0x80,  0x04,  0xfe,  0x87,  0x83,  0xfe,
-  0xc9,  0x47,  0x0b,  0x0e,  0xd0,  0x65,  0x01,  0x0c,  0x06,  0x0d,  0xfe,  0x98,  0x13,  0x0f,  0xfe,  0x20,
-  0x80,  0x04,  0xfe,  0xa0,  0x83,  0x33,  0x0b,  0x0e,  0x09,  0x1d,  0xfe,  0x84,  0x12,  0x01,  0x38,  0x06,
-  0x07,  0xfe,  0x70,  0x13,  0x03,  0xfe,  0xa2,  0x00,  0x1e,  0x1b,  0xfe,  0xda,  0x05,  0xd0,  0x54,  0x01,
-  0x38,  0x06,  0x0d,  0xfe,  0x58,  0x13,  0x03,  0xfe,  0xa0,  0x00,  0x1e,  0xfe,  0x50,  0x12,  0x5e,  0xff,
-  0x02,  0x00,  0x10,  0x2f,  0xfe,  0x90,  0x05,  0x2a,  0x3c,  0xcc,  0xff,  0x02,  0x00,  0x10,  0x2f,  0xfe,
-  0x9e,  0x05,  0x17,  0xfe,  0xf4,  0x05,  0x15,  0xfe,  0xe3,  0x00,  0x26,  0x01,  0x38,  0xfe,  0x4a,  0xf0,
-  0xfe,  0xc0,  0x05,  0xfe,  0x49,  0xf0,  0xfe,  0xba,  0x05,  0x71,  0x2e,  0xfe,  0x21,  0x00,  0xf1,  0x2e,
-  0xfe,  0x22,  0x00,  0xa2,  0x2e,  0x4a,  0xfe,  0x09,  0x48,  0xff,  0x02,  0x00,  0x10,  0x2f,  0xfe,  0xd0,
-  0x05,  0x17,  0xfe,  0xf4,  0x05,  0xfe,  0xe2,  0x08,  0x01,  0x38,  0x06,  0xfe,  0x1c,  0x00,  0x4d,  0x01,
-  0xa7,  0x2e,  0x07,  0x20,  0xe4,  0x47,  0xfe,  0x27,  0x01,  0x01,  0x0c,  0x06,  0x28,  0xfe,  0x24,  0x12,
-  0x3e,  0x01,  0x84,  0x1f,  0x7f,  0x01,  0x0c,  0x06,  0x07,  0x4d,  0x1f,  0xfe,  0x0d,  0x00,  0x01,  0x42,
-  0x8f,  0xfe,  0xa4,  0x0e,  0x05,  0x29,  0x03,  0xe6,  0x1e,  0xfe,  0xca,  0x13,  0x03,  0xb6,  0x1e,  0xfe,
-  0x40,  0x12,  0x03,  0x66,  0x1e,  0xfe,  0x38,  0x13,  0x3e,  0x01,  0x84,  0x17,  0xfe,  0x72,  0x06,  0x0a,
-  0x07,  0x01,  0x38,  0x06,  0x24,  0xfe,  0x02,  0x12,  0x4f,  0x01,  0xfe,  0x56,  0x19,  0x16,  0xfe,  0x68,
-  0x06,  0x15,  0x82,  0x01,  0x41,  0x15,  0xe2,  0x03,  0x66,  0x8a,  0x10,  0x66,  0x03,  0x9a,  0x1e,  0xfe,
-  0x70,  0x12,  0x03,  0x55,  0x1e,  0xfe,  0x68,  0x13,  0x01,  0xc6,  0x09,  0x12,  0x48,  0xfe,  0x92,  0x06,
-  0x2e,  0x12,  0x01,  0xfe,  0xac,  0x1d,  0xfe,  0x43,  0x48,  0x62,  0x80,  0x13,  0x58,  0xff,  0x02,  0x00,
-  0x57,  0x52,  0xad,  0x23,  0x3f,  0x4e,  0x62,  0x49,  0x3e,  0x01,  0x84,  0x17,  0xfe,  0xea,  0x06,  0x01,
-  0x38,  0x06,  0x12,  0xf7,  0x45,  0x0a,  0x95,  0x01,  0xfe,  0x84,  0x19,  0x16,  0xfe,  0xe0,  0x06,  0x15,
-  0x82,  0x01,  0x41,  0x15,  0xe2,  0x03,  0x55,  0x8a,  0x10,  0x55,  0x1c,  0x07,  0x01,  0x84,  0xfe,  0xae,
-  0x10,  0x03,  0x6f,  0x1e,  0xfe,  0x9e,  0x13,  0x3e,  0x01,  0x84,  0x03,  0x9a,  0x1e,  0xfe,  0x1a,  0x12,
-  0x01,  0x38,  0x06,  0x12,  0xfc,  0x01,  0xc6,  0x01,  0xfe,  0xac,  0x1d,  0xfe,  0x43,  0x48,  0x62,  0x80,
-  0xf0,  0x45,  0x0a,  0x95,  0x03,  0xb6,  0x1e,  0xf8,  0x01,  0x38,  0x06,  0x24,  0x36,  0xfe,  0x02,  0xf6,
-  0x07,  0x71,  0x78,  0x8c,  0x00,  0x4d,  0x62,  0x49,  0x3e,  0x2d,  0x93,  0x4e,  0xd0,  0x0d,  0x17,  0xfe,
-  0x9a,  0x07,  0x01,  0xfe,  0xc0,  0x19,  0x16,  0xfe,  0x90,  0x07,  0x26,  0x20,  0x9e,  0x15,  0x82,  0x01,
-  0x41,  0x15,  0xe2,  0x21,  0x9e,  0x09,  0x07,  0xfb,  0x03,  0xe6,  0xfe,  0x58,  0x57,  0x10,  0xe6,  0x05,
-  0xfe,  0x2a,  0x06,  0x03,  0x6f,  0x8a,  0x10,  0x6f,  0x1c,  0x07,  0x01,  0x84,  0xfe,  0x9c,  0x32,  0x5f,
-  0x75,  0x01,  0xa6,  0x86,  0x15,  0xfe,  0xe2,  0x00,  0x2f,  0xed,  0x2a,  0x3c,  0xfe,  0x0a,  0xf0,  0xfe,
-  0xce,  0x07,  0xae,  0xfe,  0x96,  0x08,  0xfe,  0x06,  0xf0,  0xfe,  0x9e,  0x08,  0xaf,  0xa0,  0x05,  0x29,
-  0x01,  0x0c,  0x06,  0x0d,  0xfe,  0x2e,  0x12,  0x14,  0x1d,  0x01,  0x08,  0x14,  0x00,  0x01,  0x08,  0x14,
-  0x00,  0x01,  0x08,  0x14,  0x00,  0x01,  0x08,  0xfe,  0x99,  0xa4,  0x01,  0x08,  0x14,  0x00,  0x05,  0xfe,
-  0xc6,  0x09,  0x01,  0x76,  0x06,  0x12,  0xfe,  0x3a,  0x12,  0x01,  0x0c,  0x06,  0x12,  0xfe,  0x30,  0x13,
-  0x14,  0xfe,  0x1b,  0x00,  0x01,  0x08,  0x14,  0x00,  0x01,  0x08,  0x14,  0x00,  0x01,  0x08,  0x14,  0x00,
-  0x01,  0x08,  0x14,  0x07,  0x01,  0x08,  0x14,  0x00,  0x05,  0xef,  0x7c,  0x4a,  0x78,  0x4f,  0x0f,  0xfe,
-  0x9a,  0x81,  0x04,  0xfe,  0x9a,  0x83,  0xfe,  0xcb,  0x47,  0x0b,  0x0e,  0x2d,  0x28,  0x48,  0xfe,  0x6c,
-  0x08,  0x0a,  0x28,  0xfe,  0x09,  0x6f,  0xca,  0xfe,  0xca,  0x45,  0xfe,  0x32,  0x12,  0x53,  0x63,  0x4e,
-  0x7c,  0x97,  0x2f,  0xfe,  0x7e,  0x08,  0x2a,  0x3c,  0xfe,  0x0a,  0xf0,  0xfe,  0x6c,  0x08,  0xaf,  0xa0,
-  0xae,  0xfe,  0x96,  0x08,  0x05,  0x29,  0x01,  0x41,  0x05,  0xed,  0x14,  0x24,  0x05,  0xed,  0xfe,  0x9c,
-  0xf7,  0x9f,  0x01,  0xfe,  0xae,  0x1e,  0xfe,  0x18,  0x58,  0x01,  0xfe,  0xbe,  0x1e,  0xfe,  0x99,  0x58,
-  0xfe,  0x78,  0x18,  0xfe,  0xf9,  0x18,  0x8e,  0xfe,  0x16,  0x09,  0x10,  0x6a,  0x22,  0x6b,  0x01,  0x0c,
-  0x61,  0x54,  0x44,  0x21,  0x2c,  0x09,  0x1a,  0xf8,  0x77,  0x01,  0xfe,  0x7e,  0x1e,  0x47,  0x2c,  0x7a,
-  0x30,  0xf0,  0xfe,  0x83,  0xe7,  0xfe,  0x3f,  0x00,  0x71,  0xfe,  0x03,  0x40,  0x01,  0x0c,  0x61,  0x65,
-  0x44,  0x01,  0xc2,  0xc8,  0xfe,  0x1f,  0x40,  0x20,  0x6e,  0x01,  0xfe,  0x6a,  0x16,  0xfe,  0x08,  0x50,
-  0xfe,  0x8a,  0x50,  0xfe,  0x44,  0x51,  0xfe,  0xc6,  0x51,  0xfe,  0x10,  0x10,  0x01,  0xfe,  0xce,  0x1e,
-  0x01,  0xfe,  0xde,  0x1e,  0x10,  0x68,  0x22,  0x69,  0x01,  0xfe,  0xee,  0x1e,  0x01,  0xfe,  0xfe,  0x1e,
-  0xfe,  0x40,  0x50,  0xfe,  0xc2,  0x50,  0x10,  0x4b,  0x22,  0x4c,  0xfe,  0x8a,  0x10,  0x01,  0x0c,  0x06,
-  0x54,  0xfe,  0x50,  0x12,  0x01,  0xfe,  0xae,  0x1e,  0x01,  0xfe,  0xbe,  0x1e,  0x10,  0x6a,  0x22,  0x6b,
-  0x01,  0x0c,  0x06,  0x65,  0x4e,  0x01,  0xc2,  0x0f,  0xfe,  0x1f,  0x80,  0x04,  0xfe,  0x9f,  0x83,  0x33,
-  0x0b,  0x0e,  0x20,  0x6e,  0x0f,  0xfe,  0x44,  0x90,  0x04,  0xfe,  0xc4,  0x93,  0x3a,  0x0b,  0xfe,  0xc6,
-  0x90,  0x04,  0xfe,  0xc6,  0x93,  0x79,  0x0b,  0x0e,  0x10,  0x6c,  0x22,  0x6d,  0x01,  0xfe,  0xce,  0x1e,
-  0x01,  0xfe,  0xde,  0x1e,  0x10,  0x68,  0x22,  0x69,  0x0f,  0xfe,  0x40,  0x90,  0x04,  0xfe,  0xc0,  0x93,
-  0x3a,  0x0b,  0xfe,  0xc2,  0x90,  0x04,  0xfe,  0xc2,  0x93,  0x79,  0x0b,  0x0e,  0x10,  0x4b,  0x22,  0x4c,
-  0x10,  0x64,  0x22,  0x34,  0x01,  0x0c,  0x61,  0x24,  0x44,  0x37,  0x13,  0xfe,  0x4e,  0x11,  0x2f,  0xfe,
-  0xde,  0x09,  0xfe,  0x9e,  0xf0,  0xfe,  0xf2,  0x09,  0xfe,  0x01,  0x48,  0x1b,  0x3c,  0x37,  0x88,  0xf5,
-  0xd4,  0xfe,  0x1e,  0x0a,  0xd5,  0xfe,  0x42,  0x0a,  0xd2,  0xfe,  0x1e,  0x0a,  0xd3,  0xfe,  0x42,  0x0a,
-  0xae,  0xfe,  0x12,  0x0a,  0xfe,  0x06,  0xf0,  0xfe,  0x18,  0x0a,  0xaf,  0xa0,  0x05,  0x29,  0x01,  0x41,
-  0xfe,  0xc1,  0x10,  0x14,  0x24,  0xfe,  0xc1,  0x10,  0x01,  0x76,  0x06,  0x07,  0xfe,  0x14,  0x12,  0x01,
-  0x76,  0x06,  0x0d,  0x5d,  0x01,  0x0c,  0x06,  0x0d,  0xfe,  0x74,  0x12,  0xfe,  0x2e,  0x1c,  0x05,  0xfe,
-  0x1a,  0x0c,  0x01,  0x76,  0x06,  0x07,  0x5d,  0x01,  0x76,  0x06,  0x0d,  0x41,  0xfe,  0x2c,  0x1c,  0xfe,
-  0xaa,  0xf0,  0xfe,  0xce,  0x0a,  0xfe,  0xac,  0xf0,  0xfe,  0x66,  0x0a,  0xfe,  0x92,  0x10,  0xc4,  0xf6,
-  0xfe,  0xad,  0xf0,  0xfe,  0x72,  0x0a,  0x05,  0xfe,  0x1a,  0x0c,  0xc5,  0xfe,  0xe7,  0x10,  0xfe,  0x2b,
-  0xf0,  0xbf,  0xfe,  0x6b,  0x18,  0x23,  0xfe,  0x00,  0xfe,  0xfe,  0x1c,  0x12,  0xac,  0xfe,  0xd2,  0xf0,
-  0xbf,  0xfe,  0x76,  0x18,  0x23,  0x1d,  0x1b,  0xbf,  0x03,  0xe3,  0x23,  0x07,  0x1b,  0xbf,  0xd4,  0x5b,
-  0xd5,  0x5b,  0xd2,  0x5b,  0xd3,  0x5b,  0xc4,  0xc5,  0xfe,  0xa9,  0x10,  0x75,  0x5e,  0x32,  0x1f,  0x7f,
-  0x01,  0x42,  0x19,  0xfe,  0x35,  0x00,  0xfe,  0x01,  0xf0,  0x70,  0x19,  0x98,  0x05,  0x70,  0xfe,  0x74,
-  0x18,  0x23,  0xfe,  0x00,  0xf8,  0x1b,  0x5b,  0x7d,  0x12,  0x01,  0xfe,  0x78,  0x0f,  0x4d,  0x01,  0xfe,
-  0x96,  0x1a,  0x21,  0x30,  0x77,  0x7d,  0x1d,  0x05,  0x5b,  0x01,  0x0c,  0x06,  0x0d,  0x2b,  0xfe,  0xe2,
-  0x0b,  0x01,  0x0c,  0x06,  0x54,  0xfe,  0xa6,  0x12,  0x01,  0x0c,  0x06,  0x24,  0xfe,  0x88,  0x13,  0x21,
-  0x6e,  0xc7,  0x01,  0xfe,  0x1e,  0x1f,  0x0f,  0xfe,  0x83,  0x80,  0x04,  0xfe,  0x83,  0x83,  0xfe,  0xc9,
-  0x47,  0x0b,  0x0e,  0xfe,  0xc8,  0x44,  0xfe,  0x42,  0x13,  0x0f,  0xfe,  0x04,  0x91,  0x04,  0xfe,  0x84,
-  0x93,  0xfe,  0xca,  0x57,  0x0b,  0xfe,  0x86,  0x91,  0x04,  0xfe,  0x86,  0x93,  0xfe,  0xcb,  0x57,  0x0b,
-  0x0e,  0x7a,  0x30,  0xfe,  0x40,  0x59,  0xfe,  0xc1,  0x59,  0x8e,  0x40,  0x03,  0x6a,  0x3b,  0x6b,  0x10,
-  0x97,  0x22,  0x98,  0xd9,  0x6a,  0xda,  0x6b,  0x01,  0xc2,  0xc8,  0x7a,  0x30,  0x20,  0x6e,  0xdb,  0x64,
-  0xdc,  0x34,  0x91,  0x6c,  0x7e,  0x6d,  0xfe,  0x44,  0x55,  0xfe,  0xe5,  0x55,  0xfe,  0x04,  0xfa,  0x64,
-  0xfe,  0x05,  0xfa,  0x34,  0x01,  0xfe,  0x6a,  0x16,  0xa3,  0x26,  0x10,  0x97,  0x10,  0x98,  0x91,  0x6c,
-  0x7e,  0x6d,  0xfe,  0x14,  0x10,  0x01,  0x0c,  0x06,  0x24,  0x1b,  0x40,  0x91,  0x4b,  0x7e,  0x4c,  0x01,
-  0x0c,  0x06,  0xfe,  0xf7,  0x00,  0x44,  0x03,  0x68,  0x3b,  0x69,  0xfe,  0x10,  0x58,  0xfe,  0x91,  0x58,
-  0xfe,  0x14,  0x59,  0xfe,  0x95,  0x59,  0x05,  0x5b,  0x01,  0x0c,  0x06,  0x24,  0x1b,  0x40,  0x01,  0x0c,
-  0x06,  0xfe,  0xf7,  0x00,  0x44,  0x78,  0x01,  0xfe,  0x8e,  0x1e,  0x4f,  0x0f,  0xfe,  0x10,  0x90,  0x04,
-  0xfe,  0x90,  0x93,  0x3a,  0x0b,  0xfe,  0x92,  0x90,  0x04,  0xfe,  0x92,  0x93,  0x79,  0x0b,  0x0e,  0xfe,
-  0xbd,  0x10,  0x01,  0x43,  0x09,  0xbb,  0x1b,  0xfe,  0x6e,  0x0a,  0x15,  0xbb,  0x01,  0x0c,  0x06,  0x0d,
-  0xfe,  0x14,  0x13,  0x03,  0x4b,  0x3b,  0x4c,  0x8e,  0xfe,  0x6e,  0x0a,  0xfe,  0x0c,  0x58,  0xfe,  0x8d,
-  0x58,  0x05,  0x5b,  0x26,  0x3e,  0x0f,  0xfe,  0x19,  0x80,  0x04,  0xfe,  0x99,  0x83,  0x33,  0x0b,  0x0e,
-  0xfe,  0xe5,  0x10,  0x01,  0x0c,  0x06,  0x0d,  0xfe,  0x1a,  0x12,  0xfe,  0x6c,  0x19,  0xfe,  0x19,  0x41,
-  0xfe,  0x6b,  0x18,  0xac,  0xfe,  0xd1,  0xf0,  0xef,  0x1f,  0x92,  0x01,  0x42,  0x19,  0xfe,  0x44,  0x00,
-  0xfe,  0x90,  0x10,  0xfe,  0x6c,  0x19,  0xd9,  0x4b,  0xfe,  0xed,  0x19,  0xda,  0x4c,  0xfe,  0x0c,  0x51,
-  0xfe,  0x8e,  0x51,  0xfe,  0x6b,  0x18,  0x23,  0xfe,  0x00,  0xff,  0x31,  0xfe,  0x76,  0x10,  0xac,  0xfe,
-  0xd2,  0xf0,  0xfe,  0xba,  0x0c,  0xfe,  0x76,  0x18,  0x23,  0x1d,  0x5d,  0x03,  0xe3,  0x23,  0x07,  0xfe,
-  0x08,  0x13,  0x19,  0xfe,  0x16,  0x00,  0x05,  0x70,  0xfe,  0xd1,  0xf0,  0xfe,  0xcc,  0x0c,  0x1f,  0x92,
-  0x01,  0x42,  0x19,  0xfe,  0x17,  0x00,  0x5c,  0xfe,  0xce,  0xf0,  0xfe,  0xd2,  0x0c,  0xfe,  0x3e,  0x10,
-  0xfe,  0xcd,  0xf0,  0xfe,  0xde,  0x0c,  0x19,  0xfe,  0x22,  0x00,  0x05,  0x70,  0xfe,  0xcb,  0xf0,  0xfe,
-  0xea,  0x0c,  0x19,  0xfe,  0x24,  0x00,  0x05,  0x70,  0xfe,  0xd0,  0xf0,  0xfe,  0xf4,  0x0c,  0x19,  0x94,
-  0xfe,  0x1c,  0x10,  0xfe,  0xcf,  0xf0,  0xfe,  0xfe,  0x0c,  0x19,  0x4a,  0xf3,  0xfe,  0xcc,  0xf0,  0xef,
-  0x01,  0x76,  0x06,  0x24,  0x4d,  0x19,  0xfe,  0x12,  0x00,  0x37,  0x13,  0xfe,  0x4e,  0x11,  0x2f,  0xfe,
-  0x16,  0x0d,  0xfe,  0x9e,  0xf0,  0xfe,  0x2a,  0x0d,  0xfe,  0x01,  0x48,  0x1b,  0x3c,  0x37,  0x88,  0xf5,
-  0xd4,  0x29,  0xd5,  0x29,  0xd2,  0x29,  0xd3,  0x29,  0x37,  0xfe,  0x9c,  0x32,  0x2f,  0xfe,  0x3e,  0x0d,
-  0x2a,  0x3c,  0xae,  0xfe,  0x62,  0x0d,  0xaf,  0xa0,  0xd4,  0x9f,  0xd5,  0x9f,  0xd2,  0x9f,  0xd3,  0x9f,
-  0x05,  0x29,  0x01,  0x41,  0xfe,  0xd3,  0x10,  0x15,  0xfe,  0xe8,  0x00,  0xc4,  0xc5,  0x75,  0xd7,  0x99,
-  0xd8,  0x9c,  0xfe,  0x89,  0xf0,  0x29,  0x27,  0x25,  0xbe,  0xd7,  0x99,  0xd8,  0x9c,  0x2f,  0xfe,  0x8c,
-  0x0d,  0x16,  0x29,  0x27,  0x25,  0xbd,  0xfe,  0x01,  0x48,  0xa4,  0x19,  0xfe,  0x42,  0x00,  0x05,  0x70,
-  0x90,  0x07,  0xfe,  0x81,  0x49,  0x1b,  0xfe,  0x64,  0x0e,  0x01,  0x0c,  0x06,  0x0d,  0xfe,  0x44,  0x13,
-  0x19,  0x00,  0x2d,  0x0d,  0xfe,  0x54,  0x12,  0x2d,  0xfe,  0x28,  0x00,  0x2b,  0xfe,  0xda,  0x0e,  0x0a,
-  0x57,  0x01,  0x18,  0x09,  0x00,  0x36,  0x46,  0xfe,  0x28,  0x00,  0xfe,  0xfa,  0x10,  0x01,  0xfe,  0xf4,
-  0x1c,  0x01,  0xfe,  0x00,  0x1d,  0x0a,  0xba,  0x01,  0xfe,  0x58,  0x10,  0x40,  0x15,  0x56,  0x01,  0x85,
-  0x05,  0x35,  0x19,  0xfe,  0x44,  0x00,  0x2d,  0x0d,  0xf7,  0x46,  0x0d,  0xfe,  0xcc,  0x10,  0x01,  0xa7,
-  0x46,  0x0d,  0xfe,  0xc2,  0x10,  0x01,  0xa7,  0x0f,  0xfe,  0x19,  0x82,  0x04,  0xfe,  0x99,  0x83,  0xfe,
-  0xcc,  0x47,  0x0b,  0x0e,  0xfe,  0x34,  0x46,  0xa5,  0x46,  0x0d,  0x19,  0xfe,  0x43,  0x00,  0xfe,  0xa2,
-  0x10,  0x01,  0x0c,  0x61,  0x0d,  0x44,  0x01,  0xfe,  0xf4,  0x1c,  0x01,  0xfe,  0x00,  0x1d,  0x40,  0x15,
-  0x56,  0x01,  0x85,  0x7d,  0x0d,  0x40,  0x51,  0x01,  0xfe,  0x9e,  0x1e,  0x05,  0xfe,  0x3a,  0x03,  0x01,
-  0x0c,  0x06,  0x0d,  0x5d,  0x46,  0x0d,  0x19,  0x00,  0xfe,  0x62,  0x10,  0x01,  0x76,  0x06,  0x12,  0xfe,
-  0x5c,  0x12,  0x01,  0x0c,  0x06,  0x12,  0xfe,  0x52,  0x13,  0xfe,  0x1c,  0x1c,  0xfe,  0x9d,  0xf0,  0xfe,
-  0x8e,  0x0e,  0xfe,  0x1c,  0x1c,  0xfe,  0x9d,  0xf0,  0xfe,  0x94,  0x0e,  0x01,  0x0c,  0x61,  0x12,  0x44,
-  0xfe,  0x9f,  0x10,  0x19,  0xfe,  0x15,  0x00,  0xfe,  0x04,  0xe6,  0x0d,  0x4f,  0xfe,  0x2e,  0x10,  0x19,
-  0xfe,  0x13,  0x00,  0xfe,  0x10,  0x10,  0x19,  0xfe,  0x47,  0x00,  0xf1,  0x19,  0xfe,  0x41,  0x00,  0xa2,
-  0x19,  0xfe,  0x24,  0x00,  0x86,  0xc4,  0xc5,  0x75,  0x03,  0x81,  0x1e,  0x2b,  0xea,  0x4f,  0xfe,  0x04,
-  0xe6,  0x12,  0xfe,  0x9d,  0x41,  0xfe,  0x1c,  0x42,  0x40,  0x01,  0xf4,  0x05,  0x35,  0xfe,  0x12,  0x1c,
-  0x1f,  0x0d,  0x47,  0xb5,  0xc3,  0x1f,  0xfe,  0x31,  0x00,  0x47,  0xb8,  0x01,  0xfe,  0xd4,  0x11,  0x05,
-  0xe9,  0x51,  0xfe,  0x06,  0xec,  0xe0,  0xfe,  0x0e,  0x47,  0x46,  0x28,  0xfe,  0xce,  0x45,  0x31,  0x51,
-  0xfe,  0x06,  0xea,  0xe0,  0xfe,  0x47,  0x4b,  0x45,  0xfe,  0x75,  0x57,  0x03,  0x67,  0xfe,  0x98,  0x56,
-  0xfe,  0x38,  0x12,  0x0a,  0x5a,  0x01,  0x18,  0xfe,  0x44,  0x48,  0x60,  0x01,  0x0c,  0x06,  0x28,  0xfe,
-  0x18,  0x13,  0x0a,  0x57,  0x01,  0x18,  0x3e,  0xfe,  0x41,  0x58,  0x0a,  0xba,  0xfe,  0xfa,  0x14,  0xfe,
-  0x49,  0x54,  0xb0,  0xfe,  0x5e,  0x0f,  0x05,  0xfe,  0x3a,  0x03,  0x0a,  0x67,  0xfe,  0xe0,  0x14,  0xfe,
-  0x0e,  0x47,  0x46,  0x28,  0xfe,  0xce,  0x45,  0x31,  0x51,  0xfe,  0xce,  0x47,  0xfe,  0xad,  0x13,  0x05,
-  0x35,  0x21,  0x2c,  0x09,  0x1a,  0xfe,  0x98,  0x12,  0x26,  0x20,  0x96,  0x20,  0xe7,  0xfe,  0x08,  0x1c,
-  0xfe,  0x7c,  0x19,  0xfe,  0xfd,  0x19,  0xfe,  0x0a,  0x1c,  0x03,  0xe5,  0xfe,  0x48,  0x55,  0xa5,  0x3b,
-  0xfe,  0x62,  0x01,  0xfe,  0xc9,  0x55,  0x31,  0xfe,  0x74,  0x10,  0x01,  0xfe,  0xf0,  0x1a,  0x03,  0xfe,
-  0x38,  0x01,  0x3b,  0xfe,  0x3a,  0x01,  0x8e,  0xfe,  0x1e,  0x10,  0xfe,  0x02,  0xec,  0xe7,  0x53,  0x00,
-  0x36,  0xfe,  0x04,  0xec,  0x2c,  0x60,  0xfe,  0x05,  0xf6,  0xfe,  0x34,  0x01,  0x01,  0xfe,  0x62,  0x1b,
-  0x01,  0xfe,  0xce,  0x1e,  0xb2,  0x11,  0xfe,  0x18,  0x13,  0xca,  0xfe,  0x02,  0xea,  0xe7,  0x53,  0x92,
-  0xfe,  0xc3,  0x13,  0x1f,  0x12,  0x47,  0xb5,  0xc3,  0xfe,  0x2a,  0x10,  0x03,  0xfe,  0x38,  0x01,  0x23,
-  0xfe,  0xf0,  0xff,  0x10,  0xe5,  0x03,  0xfe,  0x3a,  0x01,  0x10,  0xfe,  0x62,  0x01,  0x01,  0xfe,  0x1e,
-  0x1e,  0x20,  0x2c,  0x15,  0x56,  0x01,  0xfe,  0x9e,  0x1e,  0x13,  0x07,  0x02,  0x26,  0x02,  0x21,  0x96,
-  0xc7,  0x20,  0x96,  0x09,  0x92,  0xfe,  0x79,  0x13,  0x1f,  0x1d,  0x47,  0xb5,  0xc3,  0xfe,  0xe1,  0x10,
-  0xcf,  0xfe,  0x03,  0xdc,  0xfe,  0x73,  0x57,  0xfe,  0x80,  0x5d,  0x02,  0xcf,  0xfe,  0x03,  0xdc,  0xfe,
-  0x5b,  0x57,  0xfe,  0x80,  0x5d,  0x02,  0xfe,  0x03,  0x57,  0xcf,  0x26,  0xfe,  0x00,  0xcc,  0x02,  0xfe,
-  0x03,  0x57,  0xcf,  0x89,  0x02,  0x01,  0x0c,  0x06,  0x4a,  0xfe,  0x4e,  0x13,  0x0f,  0xfe,  0x1c,  0x80,
-  0x04,  0xfe,  0x9c,  0x83,  0x33,  0x0b,  0x0e,  0x09,  0x07,  0xfe,  0x3a,  0x13,  0x0f,  0xfe,  0x1e,  0x80,
-  0x04,  0xfe,  0x9e,  0x83,  0x33,  0x0b,  0x0e,  0xfe,  0x2a,  0x13,  0x0f,  0xfe,  0x1d,  0x80,  0x04,  0xfe,
-  0x9d,  0x83,  0xfe,  0xf9,  0x13,  0x0e,  0xfe,  0x1c,  0x13,  0x01,  0xfe,  0xee,  0x1e,  0xac,  0xfe,  0x14,
-  0x13,  0x01,  0xfe,  0xfe,  0x1e,  0xfe,  0x81,  0x58,  0xfa,  0x01,  0xfe,  0x0e,  0x1f,  0xfe,  0x30,  0xf4,
-  0x0d,  0xfe,  0x3c,  0x50,  0xa2,  0x01,  0xfe,  0x92,  0x1b,  0x01,  0x43,  0x09,  0x56,  0xfb,  0x01,  0xfe,
-  0xc8,  0x1a,  0x01,  0x0c,  0x06,  0x28,  0xa4,  0x01,  0xfe,  0xf4,  0x1c,  0x01,  0xfe,  0x00,  0x1d,  0x15,
-  0xfe,  0xe9,  0x00,  0x01,  0x0c,  0x06,  0x4a,  0xfe,  0x4e,  0x13,  0x01,  0xfe,  0x22,  0x1b,  0xfe,  0x1e,
-  0x1c,  0x0f,  0xfe,  0x14,  0x90,  0x04,  0xfe,  0x94,  0x93,  0x3a,  0x0b,  0xfe,  0x96,  0x90,  0x04,  0xfe,
-  0x96,  0x93,  0x79,  0x0b,  0x0e,  0x10,  0xfe,  0x64,  0x01,  0x22,  0xfe,  0x66,  0x01,  0x01,  0x0c,  0x06,
-  0x65,  0xf9,  0x0f,  0xfe,  0x03,  0x80,  0x04,  0xfe,  0x83,  0x83,  0x33,  0x0b,  0x0e,  0x77,  0xfe,  0x01,
-  0xec,  0x2c,  0xfe,  0x80,  0x40,  0x20,  0x2c,  0x7a,  0x30,  0x15,  0xdf,  0x40,  0x21,  0x2c,  0xfe,  0x00,
-  0x40,  0x8d,  0x2c,  0x02,  0xfe,  0x08,  0x1c,  0x03,  0xfe,  0xac,  0x00,  0xfe,  0x06,  0x58,  0x03,  0xfe,
-  0xae,  0x00,  0xfe,  0x07,  0x58,  0x03,  0xfe,  0xb0,  0x00,  0xfe,  0x08,  0x58,  0x03,  0xfe,  0xb2,  0x00,
-  0xfe,  0x09,  0x58,  0xfe,  0x0a,  0x1c,  0x2e,  0x49,  0x20,  0xe0,  0x26,  0x10,  0x66,  0x10,  0x55,  0x10,
-  0x6f,  0x13,  0x57,  0x52,  0x4f,  0x1c,  0x28,  0xfe,  0x90,  0x4d,  0xfe,  0x91,  0x54,  0x2b,  0xfe,  0x88,
-  0x11,  0x46,  0x1a,  0x13,  0x5a,  0x52,  0x1c,  0x4a,  0xfe,  0x90,  0x4d,  0xfe,  0x91,  0x54,  0x2b,  0xfe,
-  0x9e,  0x11,  0x2e,  0x1a,  0x20,  0x2c,  0x90,  0x34,  0x60,  0x21,  0x2c,  0xfe,  0x00,  0x40,  0x8d,  0x2c,
-  0x15,  0xdf,  0xfe,  0x14,  0x56,  0xfe,  0xd6,  0xf0,  0xfe,  0xb2,  0x11,  0xfe,  0x12,  0x1c,  0x75,  0xfe,
-  0x14,  0x1c,  0xfe,  0x10,  0x1c,  0xfe,  0x18,  0x1c,  0x02,  0x51,  0xfe,  0x0c,  0x14,  0xfe,  0x0e,  0x47,
-  0xfe,  0x07,  0xe6,  0x28,  0xfe,  0xce,  0x47,  0xfe,  0xf5,  0x13,  0x02,  0x01,  0xa7,  0x90,  0x34,  0x60,
-  0xfe,  0x06,  0x80,  0xfe,  0x48,  0x47,  0xfe,  0x42,  0x13,  0xfe,  0x02,  0x80,  0x09,  0x56,  0xfe,  0x34,
-  0x13,  0x0a,  0x5a,  0x01,  0x18,  0xcb,  0xfe,  0x36,  0x12,  0xfe,  0x41,  0x48,  0xfe,  0x45,  0x48,  0x01,
-  0xfe,  0xb2,  0x16,  0xfe,  0x00,  0xcc,  0xcb,  0xfe,  0xf3,  0x13,  0x3f,  0x89,  0x09,  0x1a,  0xa5,  0x0a,
-  0x9d,  0x01,  0x18,  0xfe,  0x80,  0x5c,  0x01,  0x85,  0xf2,  0x09,  0x9b,  0xa4,  0xfe,  0x14,  0x56,  0xfe,
-  0xd6,  0xf0,  0xfe,  0xec,  0x11,  0x02,  0xfe,  0x44,  0x58,  0x77,  0xfe,  0x01,  0xec,  0xb8,  0xfe,  0x9e,
-  0x40,  0xfe,  0x9d,  0xe7,  0x00,  0xfe,  0x9c,  0xe7,  0x12,  0x8d,  0x30,  0x01,  0xf4,  0xfe,  0xdd,  0x10,
-  0x37,  0xd7,  0x99,  0xd8,  0x9c,  0x27,  0x25,  0xee,  0x09,  0x12,  0xfe,  0x48,  0x12,  0x09,  0x0d,  0xfe,
-  0x56,  0x12,  0x09,  0x1d,  0xfe,  0x30,  0x12,  0x09,  0xdd,  0x1b,  0xfe,  0xc4,  0x13,  0x09,  0xfe,  0x23,
-  0x00,  0x1b,  0xfe,  0xd0,  0x13,  0x09,  0x07,  0x1b,  0xfe,  0x34,  0x14,  0x09,  0x24,  0xfe,  0x12,  0x12,
-  0x09,  0x00,  0x1b,  0x29,  0x1f,  0xdd,  0x01,  0x42,  0xa1,  0x32,  0x01,  0x08,  0xae,  0x41,  0x02,  0x32,
-  0xfe,  0x62,  0x08,  0x0a,  0xe1,  0x01,  0xfe,  0x58,  0x10,  0x15,  0x9b,  0x05,  0x35,  0x32,  0x01,  0x43,
-  0x09,  0xbb,  0xfe,  0xd7,  0x13,  0x91,  0x4b,  0x7e,  0x4c,  0x8e,  0xfe,  0x80,  0x13,  0x01,  0x0c,  0x06,
-  0x54,  0xfe,  0x72,  0x12,  0xdb,  0x64,  0xdc,  0x34,  0xfe,  0x44,  0x55,  0xfe,  0xe5,  0x55,  0xb0,  0xfe,
-  0x4a,  0x13,  0x21,  0x6e,  0xfe,  0x26,  0x13,  0x03,  0x97,  0x3b,  0x98,  0x8e,  0xfe,  0xb6,  0x0e,  0x10,
-  0x6a,  0x22,  0x6b,  0x26,  0x10,  0x97,  0x10,  0x98,  0x01,  0xc2,  0x2e,  0x49,  0x88,  0x20,  0x6e,  0x01,
-  0xfe,  0x6a,  0x16,  0xdb,  0x64,  0xdc,  0x34,  0xfe,  0x04,  0x55,  0xfe,  0xa5,  0x55,  0xfe,  0x04,  0xfa,
-  0x64,  0xfe,  0x05,  0xfa,  0x34,  0xfe,  0x8f,  0x10,  0x03,  0x6c,  0x3b,  0x6d,  0xfe,  0x40,  0x56,  0xfe,
-  0xe1,  0x56,  0x10,  0x6c,  0x22,  0x6d,  0x71,  0xdb,  0x64,  0xdc,  0x34,  0xfe,  0x44,  0x55,  0xfe,  0xe5,
-  0x55,  0x03,  0x68,  0x3b,  0x69,  0xfe,  0x00,  0x56,  0xfe,  0xa1,  0x56,  0x10,  0x68,  0x22,  0x69,  0x01,
-  0x0c,  0x06,  0x54,  0xf9,  0x21,  0x6e,  0xfe,  0x1f,  0x40,  0x03,  0x6a,  0x3b,  0x6b,  0xfe,  0x2c,  0x50,
-  0xfe,  0xae,  0x50,  0x03,  0x6c,  0x3b,  0x6d,  0xfe,  0x44,  0x50,  0xfe,  0xc6,  0x50,  0x03,  0x68,  0x3b,
-  0x69,  0xfe,  0x08,  0x50,  0xfe,  0x8a,  0x50,  0x03,  0x4b,  0x3b,  0x4c,  0xfe,  0x40,  0x50,  0xfe,  0xc2,
-  0x50,  0x05,  0x73,  0x2e,  0x07,  0x20,  0x9e,  0x05,  0x72,  0x32,  0x01,  0x08,  0x16,  0x3d,  0x27,  0x25,
-  0xee,  0x09,  0x07,  0x2b,  0x3d,  0x01,  0x43,  0x09,  0xbb,  0x2b,  0x72,  0x01,  0xa6,  0x23,  0x3f,  0x1b,
-  0x3d,  0x01,  0x0c,  0x06,  0x0d,  0xfe,  0x1e,  0x13,  0x91,  0x4b,  0x7e,  0x4c,  0xfe,  0x0a,  0x55,  0x31,
-  0xfe,  0x8b,  0x55,  0xd9,  0x4b,  0xda,  0x4c,  0xfe,  0x0c,  0x51,  0xfe,  0x8e,  0x51,  0x05,  0x72,  0x01,
-  0xfe,  0x8e,  0x1e,  0xca,  0xfe,  0x19,  0x41,  0x05,  0x72,  0x32,  0x01,  0x08,  0x2a,  0x3c,  0x16,  0xc0,
-  0x27,  0x25,  0xbe,  0x2d,  0x1d,  0xc0,  0x2d,  0x0d,  0x83,  0x2d,  0x7f,  0x1b,  0xfe,  0x66,  0x15,  0x05,
-  0x3d,  0x01,  0x08,  0x2a,  0x3c,  0x16,  0xc0,  0x27,  0x25,  0xbd,  0x09,  0x1d,  0x2b,  0x3d,  0x01,  0x08,
-  0x16,  0xc0,  0x27,  0x25,  0xfe,  0xe8,  0x09,  0xfe,  0xc2,  0x49,  0x50,  0x03,  0xb6,  0x1e,  0x83,  0x01,
-  0x38,  0x06,  0x24,  0x31,  0xa1,  0xfe,  0xbb,  0x45,  0x2d,  0x00,  0xa4,  0x46,  0x07,  0x90,  0x3f,  0x01,
-  0xfe,  0xf8,  0x15,  0x01,  0xa6,  0x86,  0xfe,  0x4b,  0x45,  0xfe,  0x20,  0x13,  0x01,  0x43,  0x09,  0x82,
-  0xfe,  0x16,  0x13,  0x03,  0x9a,  0x1e,  0x5d,  0x03,  0x55,  0x1e,  0x31,  0x5e,  0x05,  0x72,  0xfe,  0xc0,
-  0x5d,  0x01,  0xa7,  0xfe,  0x03,  0x17,  0x03,  0x66,  0x8a,  0x10,  0x66,  0x5e,  0x32,  0x01,  0x08,  0x17,
-  0x73,  0x01,  0xfe,  0x56,  0x19,  0x05,  0x73,  0x01,  0x08,  0x2a,  0x3c,  0x16,  0x3d,  0x27,  0x25,  0xbd,
-  0x09,  0x07,  0x2b,  0x3d,  0x01,  0xfe,  0xbe,  0x16,  0xfe,  0x42,  0x58,  0xfe,  0xe8,  0x14,  0x01,  0xa6,
-  0x86,  0xfe,  0x4a,  0xf4,  0x0d,  0x1b,  0x3d,  0xfe,  0x4a,  0xf4,  0x07,  0xfe,  0x0e,  0x12,  0x01,  0x43,
-  0x09,  0x82,  0x4e,  0x05,  0x72,  0x03,  0x55,  0x8a,  0x10,  0x55,  0x5e,  0x32,  0x01,  0x08,  0x17,  0x73,
-  0x01,  0xfe,  0x84,  0x19,  0x05,  0x73,  0x01,  0x08,  0x2a,  0x3c,  0x16,  0x3d,  0x27,  0x25,  0xbd,  0x09,
-  0x12,  0x2b,  0x3d,  0x01,  0xfe,  0xe8,  0x17,  0x8b,  0xfe,  0xaa,  0x14,  0xfe,  0xb6,  0x14,  0x86,  0xa8,
-  0xb2,  0x0d,  0x1b,  0x3d,  0xb2,  0x07,  0xfe,  0x0e,  0x12,  0x01,  0x43,  0x09,  0x82,  0x4e,  0x05,  0x72,
-  0x03,  0x6f,  0x8a,  0x10,  0x6f,  0x5e,  0x32,  0x01,  0x08,  0x17,  0x73,  0x01,  0xfe,  0xc0,  0x19,  0x05,
-  0x73,  0x13,  0x07,  0x2f,  0xfe,  0xcc,  0x15,  0x17,  0xfe,  0xe2,  0x15,  0x5f,  0xcc,  0x01,  0x08,  0x26,
-  0x5f,  0x02,  0x8f,  0xfe,  0xde,  0x15,  0x2a,  0xfe,  0xde,  0x15,  0x16,  0xfe,  0xcc,  0x15,  0x5e,  0x32,
-  0x01,  0x08,  0xfe,  0xd5,  0x10,  0x13,  0x58,  0xff,  0x02,  0x00,  0x57,  0x52,  0xad,  0x23,  0xfe,  0xff,
-  0x7f,  0xfe,  0x30,  0x56,  0xfe,  0x00,  0x5c,  0x02,  0x13,  0x58,  0xff,  0x02,  0x00,  0x57,  0x52,  0xad,
-  0x23,  0x3f,  0xfe,  0x30,  0x56,  0xfe,  0x00,  0x5c,  0x02,  0x13,  0x58,  0xff,  0x02,  0x00,  0x57,  0x52,
-  0xad,  0x02,  0x13,  0x58,  0xff,  0x02,  0x00,  0x57,  0x52,  0xfe,  0x00,  0x5e,  0x02,  0x13,  0x58,  0xff,
-  0x02,  0x00,  0x57,  0x52,  0xad,  0xfe,  0x0b,  0x58,  0x02,  0x0a,  0x66,  0x01,  0x5c,  0x0a,  0x55,  0x01,
-  0x5c,  0x0a,  0x6f,  0x01,  0x5c,  0x02,  0x01,  0xfe,  0x1e,  0x1f,  0x23,  0x1a,  0xff,  0x03,  0x00,  0x54,
-  0xfe,  0x00,  0xf4,  0x24,  0x52,  0x0f,  0xfe,  0x00,  0x7c,  0x04,  0xfe,  0x07,  0x7c,  0x3a,  0x0b,  0x0e,
-  0xfe,  0x00,  0x71,  0xfe,  0xf9,  0x18,  0xfe,  0x7a,  0x19,  0xfe,  0xfb,  0x19,  0xfe,  0x1a,  0xf7,  0x00,
-  0xfe,  0x1b,  0xf7,  0x00,  0x7a,  0x30,  0x10,  0x68,  0x22,  0x69,  0xd9,  0x6c,  0xda,  0x6d,  0x02,  0xfe,
-  0x62,  0x08,  0xfe,  0x82,  0x4a,  0xfe,  0xe1,  0x1a,  0xfe,  0x83,  0x5a,  0x77,  0x02,  0x01,  0xc6,  0xfe,
-  0x42,  0x48,  0x4f,  0x50,  0x45,  0x01,  0x08,  0x16,  0xfe,  0xe0,  0x17,  0x27,  0x25,  0xbe,  0x01,  0x08,
-  0x16,  0xfe,  0xe0,  0x17,  0x27,  0x25,  0xfe,  0xe8,  0x0a,  0xfe,  0xc1,  0x59,  0x03,  0x9a,  0x1e,  0xfe,
-  0xda,  0x12,  0x01,  0x38,  0x06,  0x12,  0xfe,  0xd0,  0x13,  0x26,  0x53,  0x12,  0x48,  0xfe,  0x08,  0x17,
-  0xd1,  0x12,  0x53,  0x12,  0xfe,  0x1e,  0x13,  0x2d,  0xb4,  0x7b,  0xfe,  0x26,  0x17,  0x4d,  0x13,  0x07,
-  0x1c,  0xb4,  0x90,  0x04,  0xfe,  0x78,  0x10,  0xff,  0x02,  0x83,  0x55,  0xf1,  0xff,  0x02,  0x83,  0x55,
-  0x53,  0x1d,  0xfe,  0x12,  0x13,  0xd6,  0xfe,  0x30,  0x00,  0xb0,  0xfe,  0x80,  0x17,  0x1c,  0x63,  0x13,
-  0x07,  0xfe,  0x56,  0x10,  0x53,  0x0d,  0xfe,  0x16,  0x13,  0xd6,  0xfe,  0x64,  0x00,  0xb0,  0xfe,  0x80,
-  0x17,  0x0a,  0xfe,  0x64,  0x00,  0x1c,  0x94,  0x13,  0x07,  0xfe,  0x28,  0x10,  0x53,  0x07,  0xfe,  0x60,
-  0x13,  0xd6,  0xfe,  0xc8,  0x00,  0xb0,  0xfe,  0x80,  0x17,  0x0a,  0xfe,  0xc8,  0x00,  0x1c,  0x95,  0x13,
-  0x07,  0x71,  0xd6,  0xfe,  0x90,  0x01,  0x48,  0xfe,  0x8c,  0x17,  0x45,  0xf3,  0xfe,  0x43,  0xf4,  0x96,
-  0xfe,  0x56,  0xf0,  0xfe,  0x9e,  0x17,  0xfe,  0x04,  0xf4,  0x58,  0xfe,  0x43,  0xf4,  0x94,  0xf6,  0x8b,
-  0x01,  0xfe,  0x24,  0x16,  0x23,  0x3f,  0xfc,  0xa8,  0x8c,  0x49,  0x48,  0xfe,  0xda,  0x17,  0x62,  0x49,
-  0xfe,  0x1c,  0x10,  0xa8,  0x8c,  0x80,  0x48,  0xfe,  0xda,  0x17,  0x62,  0x80,  0x71,  0x50,  0x26,  0xfe,
-  0x4d,  0xf4,  0x00,  0xf7,  0x45,  0x13,  0x07,  0xfe,  0xb4,  0x56,  0xfe,  0xc3,  0x58,  0x02,  0x50,  0x13,
-  0x0d,  0x02,  0x50,  0x3e,  0x78,  0x4f,  0x45,  0x01,  0x08,  0x16,  0xa9,  0x27,  0x25,  0xbe,  0xfe,  0x03,
-  0xea,  0xfe,  0x7e,  0x01,  0x01,  0x08,  0x16,  0xa9,  0x27,  0x25,  0xfe,  0xe9,  0x0a,  0x01,  0x08,  0x16,
-  0xa9,  0x27,  0x25,  0xfe,  0xe9,  0x0a,  0xfe,  0x05,  0xea,  0xfe,  0x7f,  0x01,  0x01,  0x08,  0x16,  0xa9,
-  0x27,  0x25,  0xfe,  0x69,  0x09,  0xfe,  0x02,  0xea,  0xfe,  0x80,  0x01,  0x01,  0x08,  0x16,  0xa9,  0x27,
-  0x25,  0xfe,  0xe8,  0x08,  0x47,  0xfe,  0x81,  0x01,  0x03,  0xb6,  0x1e,  0x83,  0x01,  0x38,  0x06,  0x24,
-  0x31,  0xa2,  0x78,  0xf2,  0x53,  0x07,  0x36,  0xfe,  0x34,  0xf4,  0x3f,  0xa1,  0x78,  0x03,  0x9a,  0x1e,
-  0x83,  0x01,  0x38,  0x06,  0x12,  0x31,  0xf0,  0x4f,  0x45,  0xfe,  0x90,  0x10,  0xfe,  0x40,  0x5a,  0x23,
-  0x3f,  0xfb,  0x8c,  0x49,  0x48,  0xfe,  0xaa,  0x18,  0x62,  0x49,  0x71,  0x8c,  0x80,  0x48,  0xfe,  0xaa,
-  0x18,  0x62,  0x80,  0xfe,  0xb4,  0x56,  0xfe,  0x40,  0x5d,  0x01,  0xc6,  0x01,  0xfe,  0xac,  0x1d,  0xfe,
-  0x02,  0x17,  0xfe,  0xc8,  0x45,  0xfe,  0x5a,  0xf0,  0xfe,  0xc0,  0x18,  0xfe,  0x43,  0x48,  0x2d,  0x93,
-  0x36,  0xfe,  0x34,  0xf4,  0xfe,  0x00,  0x11,  0xfe,  0x40,  0x10,  0x2d,  0xb4,  0x36,  0xfe,  0x34,  0xf4,
-  0x04,  0xfe,  0x34,  0x10,  0x2d,  0xfe,  0x0b,  0x00,  0x36,  0x46,  0x63,  0xfe,  0x28,  0x10,  0xfe,  0xc0,
-  0x49,  0xff,  0x02,  0x00,  0x54,  0xb2,  0xfe,  0x90,  0x01,  0x48,  0xfe,  0xfa,  0x18,  0x45,  0xfe,  0x1c,
-  0xf4,  0x3f,  0xf3,  0xfe,  0x40,  0xf4,  0x96,  0xfe,  0x56,  0xf0,  0xfe,  0x0c,  0x19,  0xfe,  0x04,  0xf4,
-  0x58,  0xfe,  0x40,  0xf4,  0x94,  0xf6,  0x3e,  0x2d,  0x93,  0x4e,  0xd0,  0x0d,  0x21,  0xfe,  0x7f,  0x01,
-  0xfe,  0xc8,  0x46,  0xfe,  0x24,  0x13,  0x8c,  0x00,  0x5d,  0x26,  0x21,  0xfe,  0x7e,  0x01,  0xfe,  0xc8,
-  0x45,  0xfe,  0x14,  0x13,  0x21,  0xfe,  0x80,  0x01,  0xfe,  0x48,  0x45,  0xfa,  0x21,  0xfe,  0x81,  0x01,
-  0xfe,  0xc8,  0x44,  0x4e,  0x26,  0x02,  0x13,  0x07,  0x02,  0x78,  0x45,  0x50,  0x13,  0x0d,  0x02,  0x14,
-  0x07,  0x01,  0x08,  0x17,  0xfe,  0x82,  0x19,  0x14,  0x0d,  0x01,  0x08,  0x17,  0xfe,  0x82,  0x19,  0x14,
-  0x1d,  0x01,  0x08,  0x17,  0xfe,  0x82,  0x19,  0x5f,  0xfe,  0x89,  0x49,  0x01,  0x08,  0x02,  0x14,  0x07,
-  0x01,  0x08,  0x17,  0xc1,  0x14,  0x1d,  0x01,  0x08,  0x17,  0xc1,  0x14,  0x07,  0x01,  0x08,  0x17,  0xc1,
-  0xfe,  0x89,  0x49,  0x01,  0x08,  0x17,  0xc1,  0x5f,  0xfe,  0x89,  0x4a,  0x01,  0x08,  0x02,  0x50,  0x02,
-  0x14,  0x07,  0x01,  0x08,  0x17,  0x74,  0x14,  0x7f,  0x01,  0x08,  0x17,  0x74,  0x14,  0x12,  0x01,  0x08,
-  0x17,  0x74,  0xfe,  0x89,  0x49,  0x01,  0x08,  0x17,  0x74,  0x14,  0x00,  0x01,  0x08,  0x17,  0x74,  0xfe,
-  0x89,  0x4a,  0x01,  0x08,  0x17,  0x74,  0xfe,  0x09,  0x49,  0x01,  0x08,  0x17,  0x74,  0x5f,  0xcc,  0x01,
-  0x08,  0x02,  0x21,  0xe4,  0x09,  0x07,  0xfe,  0x4c,  0x13,  0xc8,  0x20,  0xe4,  0xfe,  0x49,  0xf4,  0x00,
-  0x4d,  0x5f,  0xa1,  0x5e,  0xfe,  0x01,  0xec,  0xfe,  0x27,  0x01,  0xcc,  0xff,  0x02,  0x00,  0x10,  0x2f,
-  0xfe,  0x3e,  0x1a,  0x01,  0x43,  0x09,  0xfe,  0xe3,  0x00,  0xfe,  0x22,  0x13,  0x16,  0xfe,  0x64,  0x1a,
-  0x26,  0x20,  0x9e,  0x01,  0x41,  0x21,  0x9e,  0x09,  0x07,  0x5d,  0x01,  0x0c,  0x61,  0x07,  0x44,  0x02,
-  0x0a,  0x5a,  0x01,  0x18,  0xfe,  0x00,  0x40,  0xaa,  0x09,  0x1a,  0xfe,  0x12,  0x13,  0x0a,  0x9d,  0x01,
-  0x18,  0xaa,  0x0a,  0x67,  0x01,  0xa3,  0x02,  0x0a,  0x9d,  0x01,  0x18,  0xaa,  0xfe,  0x80,  0xe7,  0x1a,
-  0x09,  0x1a,  0x5d,  0xfe,  0x45,  0x58,  0x01,  0xfe,  0xb2,  0x16,  0xaa,  0x02,  0x0a,  0x5a,  0x01,  0x18,
-  0xaa,  0x0a,  0x67,  0x01,  0xa3,  0x02,  0x0a,  0x5a,  0x01,  0x18,  0x01,  0xfe,  0x7e,  0x1e,  0xfe,  0x80,
-  0x4c,  0xfe,  0x49,  0xe4,  0x1a,  0xfe,  0x12,  0x13,  0x0a,  0x9d,  0x01,  0x18,  0xfe,  0x80,  0x4c,  0x0a,
-  0x67,  0x01,  0x5c,  0x02,  0x1c,  0x1a,  0x87,  0x7c,  0xe5,  0xfe,  0x18,  0xdf,  0xfe,  0x19,  0xde,  0xfe,
-  0x24,  0x1c,  0xfe,  0x1d,  0xf7,  0x28,  0xb1,  0xfe,  0x04,  0x1b,  0x01,  0xfe,  0x2a,  0x1c,  0xfa,  0xb3,
-  0x28,  0x7c,  0xfe,  0x2c,  0x01,  0xfe,  0x2f,  0x19,  0x02,  0xc9,  0x2b,  0xfe,  0xf4,  0x1a,  0xfe,  0xfa,
-  0x10,  0x1c,  0x1a,  0x87,  0x03,  0xfe,  0x64,  0x01,  0xfe,  0x00,  0xf4,  0x24,  0xfe,  0x18,  0x58,  0x03,
-  0xfe,  0x66,  0x01,  0xfe,  0x19,  0x58,  0xb3,  0x24,  0x01,  0xfe,  0x0e,  0x1f,  0xfe,  0x30,  0xf4,  0x07,
-  0xfe,  0x3c,  0x50,  0x7c,  0xfe,  0x38,  0x00,  0xfe,  0x0f,  0x79,  0xfe,  0x1c,  0xf7,  0x24,  0xb1,  0xfe,
-  0x50,  0x1b,  0xfe,  0xd4,  0x14,  0x31,  0x02,  0xc9,  0x2b,  0xfe,  0x26,  0x1b,  0xfe,  0xba,  0x10,  0x1c,
-  0x1a,  0x87,  0xfe,  0x83,  0x5a,  0xfe,  0x18,  0xdf,  0xfe,  0x19,  0xde,  0xfe,  0x1d,  0xf7,  0x54,  0xb1,
-  0xfe,  0x72,  0x1b,  0xfe,  0xb2,  0x14,  0xfc,  0xb3,  0x54,  0x7c,  0x12,  0xfe,  0xaf,  0x19,  0xfe,  0x98,
-  0xe7,  0x00,  0x02,  0xc9,  0x2b,  0xfe,  0x66,  0x1b,  0xfe,  0x8a,  0x10,  0x1c,  0x1a,  0x87,  0x8b,  0x0f,
-  0xfe,  0x30,  0x90,  0x04,  0xfe,  0xb0,  0x93,  0x3a,  0x0b,  0xfe,  0x18,  0x58,  0xfe,  0x32,  0x90,  0x04,
-  0xfe,  0xb2,  0x93,  0x3a,  0x0b,  0xfe,  0x19,  0x58,  0x0e,  0xa8,  0xb3,  0x4a,  0x7c,  0x12,  0xfe,  0x0f,
-  0x79,  0xfe,  0x1c,  0xf7,  0x4a,  0xb1,  0xfe,  0xc6,  0x1b,  0xfe,  0x5e,  0x14,  0x31,  0x02,  0xc9,  0x2b,
-  0xfe,  0x96,  0x1b,  0x5c,  0xfe,  0x02,  0xf6,  0x1a,  0x87,  0xfe,  0x18,  0xfe,  0x6a,  0xfe,  0x19,  0xfe,
-  0x6b,  0x01,  0xfe,  0x1e,  0x1f,  0xfe,  0x1d,  0xf7,  0x65,  0xb1,  0xfe,  0xee,  0x1b,  0xfe,  0x36,  0x14,
-  0xfe,  0x1c,  0x13,  0xb3,  0x65,  0x3e,  0xfe,  0x83,  0x58,  0xfe,  0xaf,  0x19,  0xfe,  0x80,  0xe7,  0x1a,
-  0xfe,  0x81,  0xe7,  0x1a,  0x15,  0xfe,  0xdd,  0x00,  0x7a,  0x30,  0x02,  0x7a,  0x30,  0xfe,  0x12,  0x45,
-  0x2b,  0xfe,  0xdc,  0x1b,  0x1f,  0x07,  0x47,  0xb5,  0xc3,  0x05,  0x35,  0xfe,  0x39,  0xf0,  0x75,  0x26,
-  0x02,  0xfe,  0x7e,  0x18,  0x23,  0x1d,  0x36,  0x13,  0x11,  0x02,  0x87,  0x03,  0xe3,  0x23,  0x07,  0xfe,
-  0xef,  0x12,  0xfe,  0xe1,  0x10,  0x90,  0x34,  0x60,  0xfe,  0x02,  0x80,  0x09,  0x56,  0xfe,  0x3c,  0x13,
-  0xfe,  0x82,  0x14,  0xfe,  0x42,  0x13,  0x51,  0xfe,  0x06,  0x83,  0x0a,  0x5a,  0x01,  0x18,  0xcb,  0xfe,
-  0x3e,  0x12,  0xfe,  0x41,  0x48,  0xfe,  0x45,  0x48,  0x01,  0xfe,  0xb2,  0x16,  0xfe,  0x00,  0xcc,  0xcb,
-  0xfe,  0xf3,  0x13,  0x3f,  0x89,  0x09,  0x1a,  0xa5,  0x0a,  0x9d,  0x01,  0x18,  0xfe,  0x80,  0x4c,  0x01,
-  0x85,  0xfe,  0x16,  0x10,  0x09,  0x9b,  0x4e,  0xfe,  0x40,  0x14,  0xfe,  0x24,  0x12,  0xfe,  0x14,  0x56,
-  0xfe,  0xd6,  0xf0,  0xfe,  0x52,  0x1c,  0x1c,  0x0d,  0x02,  0xfe,  0x9c,  0xe7,  0x0d,  0x19,  0xfe,  0x15,
-  0x00,  0x40,  0x8d,  0x30,  0x01,  0xf4,  0x1c,  0x07,  0x02,  0x51,  0xfe,  0x06,  0x83,  0xfe,  0x18,  0x80,
-  0x61,  0x28,  0x44,  0x15,  0x56,  0x01,  0x85,  0x1c,  0x07,  0x02,  0xfe,  0x38,  0x90,  0xfe,  0xba,  0x90,
-  0x91,  0xde,  0x7e,  0xdf,  0xfe,  0x48,  0x55,  0x31,  0xfe,  0xc9,  0x55,  0x02,  0x21,  0xb9,  0x88,  0x20,
-  0xb9,  0x02,  0x0a,  0xba,  0x01,  0x18,  0xfe,  0x41,  0x48,  0x0a,  0x57,  0x01,  0x18,  0xfe,  0x49,  0x44,
-  0x1b,  0xfe,  0x1e,  0x1d,  0x88,  0x89,  0x02,  0x0a,  0x5a,  0x01,  0x18,  0x09,  0x1a,  0xa4,  0x0a,  0x67,
-  0x01,  0xa3,  0x0a,  0x57,  0x01,  0x18,  0x88,  0x89,  0x02,  0xfe,  0x4e,  0xe4,  0x1d,  0x7b,  0xfe,  0x52,
-  0x1d,  0x03,  0xfe,  0x90,  0x00,  0xfe,  0x3a,  0x45,  0xfe,  0x2c,  0x10,  0xfe,  0x4e,  0xe4,  0xdd,  0x7b,
-  0xfe,  0x64,  0x1d,  0x03,  0xfe,  0x92,  0x00,  0xd1,  0x12,  0xfe,  0x1a,  0x10,  0xfe,  0x4e,  0xe4,  0xfe,
-  0x0b,  0x00,  0x7b,  0xfe,  0x76,  0x1d,  0x03,  0xfe,  0x94,  0x00,  0xd1,  0x24,  0xfe,  0x08,  0x10,  0x03,
-  0xfe,  0x96,  0x00,  0xd1,  0x63,  0xfe,  0x4e,  0x45,  0x83,  0xca,  0xff,  0x04,  0x68,  0x54,  0xfe,  0xf1,
-  0x10,  0x23,  0x49,  0xfe,  0x08,  0x1c,  0xfe,  0x67,  0x19,  0xfe,  0x0a,  0x1c,  0xfe,  0x1a,  0xf4,  0xfe,
-  0x00,  0x04,  0x83,  0xb2,  0x1d,  0x48,  0xfe,  0xaa,  0x1d,  0x13,  0x1d,  0x02,  0x09,  0x92,  0xfe,  0x5a,
-  0xf0,  0xfe,  0xba,  0x1d,  0x2e,  0x93,  0xfe,  0x34,  0x10,  0x09,  0x12,  0xfe,  0x5a,  0xf0,  0xfe,  0xc8,
-  0x1d,  0x2e,  0xb4,  0xfe,  0x26,  0x10,  0x09,  0x1d,  0x36,  0x2e,  0x63,  0xfe,  0x1a,  0x10,  0x09,  0x0d,
-  0x36,  0x2e,  0x94,  0xf2,  0x09,  0x07,  0x36,  0x2e,  0x95,  0xa1,  0xc8,  0x02,  0x1f,  0x93,  0x01,  0x42,
-  0xfe,  0x04,  0xfe,  0x99,  0x03,  0x9c,  0x8b,  0x02,  0x2a,  0xfe,  0x1c,  0x1e,  0xfe,  0x14,  0xf0,  0x08,
-  0x2f,  0xfe,  0x0c,  0x1e,  0x2a,  0xfe,  0x1c,  0x1e,  0x8f,  0xfe,  0x1c,  0x1e,  0xfe,  0x82,  0xf0,  0xfe,
-  0x10,  0x1e,  0x02,  0x0f,  0x3f,  0x04,  0xfe,  0x80,  0x83,  0x33,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x18,
-  0x80,  0x04,  0xfe,  0x98,  0x83,  0x33,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x02,  0x80,  0x04,  0xfe,  0x82,
-  0x83,  0x33,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x06,  0x80,  0x04,  0xfe,  0x86,  0x83,  0x33,  0x0b,  0x0e,
-  0x02,  0x0f,  0xfe,  0x1b,  0x80,  0x04,  0xfe,  0x9b,  0x83,  0x33,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x04,
-  0x80,  0x04,  0xfe,  0x84,  0x83,  0x33,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x80,  0x80,  0x04,  0xfe,  0x80,
-  0x83,  0xfe,  0xc9,  0x47,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x19,  0x81,  0x04,  0xfe,  0x99,  0x83,  0xfe,
-  0xca,  0x47,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x06,  0x83,  0x04,  0xfe,  0x86,  0x83,  0xfe,  0xce,  0x47,
-  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x2c,  0x90,  0x04,  0xfe,  0xac,  0x93,  0x3a,  0x0b,  0x0e,  0x02,  0x0f,
-  0xfe,  0xae,  0x90,  0x04,  0xfe,  0xae,  0x93,  0x79,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x08,  0x90,  0x04,
-  0xfe,  0x88,  0x93,  0x3a,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x8a,  0x90,  0x04,  0xfe,  0x8a,  0x93,  0x79,
-  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x0c,  0x90,  0x04,  0xfe,  0x8c,  0x93,  0x3a,  0x0b,  0x0e,  0x02,  0x0f,
-  0xfe,  0x8e,  0x90,  0x04,  0xfe,  0x8e,  0x93,  0x79,  0x0b,  0x0e,  0x02,  0x0f,  0xfe,  0x3c,  0x90,  0x04,
-  0xfe,  0xbc,  0x93,  0x3a,  0x0b,  0x0e,  0x02,  0x8b,  0x0f,  0xfe,  0x03,  0x80,  0x04,  0xfe,  0x83,  0x83,
-  0x33,  0x0b,  0x77,  0x0e,  0xa8,  0x02,  0xff,  0x66,  0x00,  0x00,
+static unsigned char _adv_asc38C1600_buf[] = {
+       0x00, 0x00, 0x00, 0xf2, 0x00, 0x16, 0x00, 0xfc, 0x00, 0x10, 0x00, 0xf0,
+       0x18, 0xe4, 0x01, 0x00,
+       0x04, 0x1e, 0x48, 0xe4, 0x03, 0xf6, 0xf7, 0x13, 0x2e, 0x1e, 0x02, 0x00,
+       0x07, 0x17, 0xc0, 0x5f,
+       0x00, 0xfa, 0xff, 0xff, 0x04, 0x00, 0x00, 0xf6, 0x09, 0xe7, 0x82, 0xe7,
+       0x85, 0xf0, 0x86, 0xf0,
+       0x4e, 0x10, 0x9e, 0xe7, 0xff, 0x00, 0x55, 0xf0, 0x01, 0xf6, 0x03, 0x00,
+       0x98, 0x57, 0x01, 0xe6,
+       0x00, 0xea, 0x00, 0xec, 0x01, 0xfa, 0x18, 0xf4, 0x08, 0x00, 0xf0, 0x1d,
+       0x38, 0x54, 0x32, 0xf0,
+       0x10, 0x00, 0xc2, 0x0e, 0x1e, 0xf0, 0xd5, 0xf0, 0xbc, 0x00, 0x4b, 0xe4,
+       0x00, 0xe6, 0xb1, 0xf0,
+       0xb4, 0x00, 0x02, 0x13, 0x3e, 0x1c, 0xc8, 0x47, 0x3e, 0x00, 0xd8, 0x01,
+       0x06, 0x13, 0x0c, 0x1c,
+       0x5e, 0x1e, 0x00, 0x57, 0xc8, 0x57, 0x01, 0xfc, 0xbc, 0x0e, 0xa2, 0x12,
+       0xb9, 0x54, 0x00, 0x80,
+       0x62, 0x0a, 0x5a, 0x12, 0xc8, 0x15, 0x3e, 0x1e, 0x18, 0x40, 0xbd, 0x56,
+       0x03, 0xe6, 0x01, 0xea,
+       0x5c, 0xf0, 0x0f, 0x00, 0x20, 0x00, 0x6c, 0x01, 0x6e, 0x01, 0x04, 0x12,
+       0x04, 0x13, 0xbb, 0x55,
+       0x3c, 0x56, 0x3e, 0x57, 0x03, 0x58, 0x4a, 0xe4, 0x40, 0x00, 0xb6, 0x00,
+       0xbb, 0x00, 0xc0, 0x00,
+       0x00, 0x01, 0x01, 0x01, 0x3e, 0x01, 0x58, 0x0a, 0x44, 0x10, 0x0a, 0x12,
+       0x4c, 0x1c, 0x4e, 0x1c,
+       0x02, 0x4a, 0x30, 0xe4, 0x05, 0xe6, 0x0c, 0x00, 0x3c, 0x00, 0x80, 0x00,
+       0x24, 0x01, 0x3c, 0x01,
+       0x68, 0x01, 0x6a, 0x01, 0x70, 0x01, 0x72, 0x01, 0x74, 0x01, 0x76, 0x01,
+       0x78, 0x01, 0x7c, 0x01,
+       0xc6, 0x0e, 0x0c, 0x10, 0xac, 0x12, 0xae, 0x12, 0x16, 0x1a, 0x32, 0x1c,
+       0x6e, 0x1e, 0x02, 0x48,
+       0x3a, 0x55, 0xc9, 0x57, 0x02, 0xee, 0x5b, 0xf0, 0x03, 0xf7, 0x06, 0xf7,
+       0x03, 0xfc, 0x06, 0x00,
+       0x1e, 0x00, 0xbe, 0x00, 0xe1, 0x00, 0x0c, 0x12, 0x18, 0x1a, 0x70, 0x1a,
+       0x30, 0x1c, 0x38, 0x1c,
+       0x10, 0x44, 0x00, 0x4c, 0xb0, 0x57, 0x40, 0x5c, 0x4d, 0xe4, 0x04, 0xea,
+       0x5d, 0xf0, 0xa7, 0xf0,
+       0x04, 0xf6, 0x02, 0xfc, 0x05, 0x00, 0x09, 0x00, 0x19, 0x00, 0x32, 0x00,
+       0x33, 0x00, 0x34, 0x00,
+       0x36, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xcc, 0x00, 0x20, 0x01, 0x4e, 0x01,
+       0x79, 0x01, 0x3c, 0x09,
+       0x68, 0x0d, 0x02, 0x10, 0x04, 0x10, 0x3a, 0x10, 0x08, 0x12, 0x0a, 0x13,
+       0x40, 0x16, 0x50, 0x16,
+       0x00, 0x17, 0x4a, 0x19, 0x00, 0x4e, 0x00, 0x54, 0x01, 0x58, 0x00, 0xdc,
+       0x05, 0xf0, 0x09, 0xf0,
+       0x59, 0xf0, 0xb8, 0xf0, 0x48, 0xf4, 0x0e, 0xf7, 0x0a, 0x00, 0x9b, 0x00,
+       0x9c, 0x00, 0xa4, 0x00,
+       0xb5, 0x00, 0xba, 0x00, 0xd0, 0x00, 0xe7, 0x00, 0xf0, 0x03, 0x69, 0x08,
+       0xe9, 0x09, 0x5c, 0x0c,
+       0xb6, 0x12, 0xbc, 0x19, 0xd8, 0x1b, 0x20, 0x1c, 0x34, 0x1c, 0x36, 0x1c,
+       0x42, 0x1d, 0x08, 0x44,
+       0x38, 0x44, 0x91, 0x44, 0x0a, 0x45, 0x48, 0x46, 0x89, 0x48, 0x68, 0x54,
+       0x83, 0x55, 0x83, 0x59,
+       0x31, 0xe4, 0x02, 0xe6, 0x07, 0xf0, 0x08, 0xf0, 0x0b, 0xf0, 0x0c, 0xf0,
+       0x4b, 0xf4, 0x04, 0xf8,
+       0x05, 0xf8, 0x02, 0xfa, 0x03, 0xfa, 0x04, 0xfc, 0x05, 0xfc, 0x07, 0x00,
+       0xa8, 0x00, 0xaa, 0x00,
+       0xb9, 0x00, 0xe0, 0x00, 0xe5, 0x00, 0x22, 0x01, 0x26, 0x01, 0x60, 0x01,
+       0x7a, 0x01, 0x82, 0x01,
+       0xc8, 0x01, 0xca, 0x01, 0x86, 0x02, 0x6a, 0x03, 0x18, 0x05, 0xb2, 0x07,
+       0x68, 0x08, 0x10, 0x0d,
+       0x06, 0x10, 0x0a, 0x10, 0x0e, 0x10, 0x12, 0x10, 0x60, 0x10, 0xed, 0x10,
+       0xf3, 0x10, 0x06, 0x12,
+       0x10, 0x12, 0x1e, 0x12, 0x0c, 0x13, 0x0e, 0x13, 0x10, 0x13, 0xfe, 0x9c,
+       0xf0, 0x35, 0x05, 0xfe,
+       0xec, 0x0e, 0xff, 0x10, 0x00, 0x00, 0xe9, 0xfe, 0x34, 0x1f, 0x00, 0xe8,
+       0xfe, 0x88, 0x01, 0xff,
+       0x03, 0x00, 0x00, 0xfe, 0x93, 0x15, 0xfe, 0x0f, 0x05, 0xff, 0x38, 0x00,
+       0x00, 0xfe, 0x57, 0x24,
+       0x00, 0xfe, 0x4c, 0x00, 0x65, 0xff, 0x04, 0x00, 0x00, 0x1a, 0xff, 0x09,
+       0x00, 0x00, 0xff, 0x08,
+       0x01, 0x01, 0xff, 0x08, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0xff, 0x10,
+       0xff, 0xff, 0xff, 0x13,
+       0x00, 0x00, 0xfe, 0x78, 0x56, 0xfe, 0x34, 0x12, 0xff, 0x21, 0x00, 0x00,
+       0xfe, 0x04, 0xf7, 0xe8,
+       0x37, 0x7d, 0x0d, 0x01, 0xfe, 0x4a, 0x11, 0xfe, 0x04, 0xf7, 0xe8, 0x7d,
+       0x0d, 0x51, 0x37, 0xfe,
+       0x3d, 0xf0, 0xfe, 0x0c, 0x02, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x91, 0xf0,
+       0xfe, 0xf8, 0x01, 0xfe,
+       0x90, 0xf0, 0xfe, 0xf8, 0x01, 0xfe, 0x8f, 0xf0, 0xbc, 0x03, 0x67, 0x4d,
+       0x05, 0xfe, 0x08, 0x0f,
+       0x01, 0xfe, 0x78, 0x0f, 0xfe, 0xdd, 0x12, 0x05, 0xfe, 0x0e, 0x03, 0xfe,
+       0x28, 0x1c, 0x03, 0xfe,
+       0xa6, 0x00, 0xfe, 0xd1, 0x12, 0x3e, 0x22, 0xfe, 0xa6, 0x00, 0xac, 0xfe,
+       0x48, 0xf0, 0xfe, 0x90,
+       0x02, 0xfe, 0x49, 0xf0, 0xfe, 0xaa, 0x02, 0xfe, 0x4a, 0xf0, 0xfe, 0xc8,
+       0x02, 0xfe, 0x46, 0xf0,
+       0xfe, 0x5a, 0x02, 0xfe, 0x47, 0xf0, 0xfe, 0x60, 0x02, 0xfe, 0x43, 0xf0,
+       0xfe, 0x4e, 0x02, 0xfe,
+       0x44, 0xf0, 0xfe, 0x52, 0x02, 0xfe, 0x45, 0xf0, 0xfe, 0x56, 0x02, 0x1c,
+       0x0d, 0xa2, 0x1c, 0x07,
+       0x22, 0xb7, 0x05, 0x35, 0xfe, 0x00, 0x1c, 0xfe, 0xf1, 0x10, 0xfe, 0x02,
+       0x1c, 0xf5, 0xfe, 0x1e,
+       0x1c, 0xfe, 0xe9, 0x10, 0x01, 0x5f, 0xfe, 0xe7, 0x10, 0xfe, 0x06, 0xfc,
+       0xde, 0x0a, 0x81, 0x01,
+       0xa3, 0x05, 0x35, 0x1f, 0x95, 0x47, 0xb8, 0x01, 0xfe, 0xe4, 0x11, 0x0a,
+       0x81, 0x01, 0x5c, 0xfe,
+       0xbd, 0x10, 0x0a, 0x81, 0x01, 0x5c, 0xfe, 0xad, 0x10, 0xfe, 0x16, 0x1c,
+       0xfe, 0x58, 0x1c, 0x1c,
+       0x07, 0x22, 0xb7, 0x37, 0x2a, 0x35, 0xfe, 0x3d, 0xf0, 0xfe, 0x0c, 0x02,
+       0x2b, 0xfe, 0x9e, 0x02,
+       0xfe, 0x5a, 0x1c, 0xfe, 0x12, 0x1c, 0xfe, 0x14, 0x1c, 0x1f, 0xfe, 0x30,
+       0x00, 0x47, 0xb8, 0x01,
+       0xfe, 0xd4, 0x11, 0x1c, 0x07, 0x22, 0xb7, 0x05, 0xe9, 0x21, 0x2c, 0x09,
+       0x1a, 0x31, 0xfe, 0x69,
+       0x10, 0x1c, 0x07, 0x22, 0xb7, 0xfe, 0x04, 0xec, 0x2c, 0x60, 0x01, 0xfe,
+       0x1e, 0x1e, 0x20, 0x2c,
+       0xfe, 0x05, 0xf6, 0xde, 0x01, 0xfe, 0x62, 0x1b, 0x01, 0x0c, 0x61, 0x4a,
+       0x44, 0x15, 0x56, 0x51,
+       0x01, 0xfe, 0x9e, 0x1e, 0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x0a, 0x57,
+       0x01, 0x18, 0x09, 0x00,
+       0x36, 0x01, 0x85, 0xfe, 0x18, 0x10, 0xfe, 0x41, 0x58, 0x0a, 0xba, 0x01,
+       0x18, 0xfe, 0xc8, 0x54,
+       0x7b, 0xfe, 0x1c, 0x03, 0x01, 0xfe, 0x96, 0x1a, 0x05, 0x35, 0x37, 0x60,
+       0xfe, 0x02, 0xe8, 0x30,
+       0xfe, 0xbf, 0x57, 0xfe, 0x9e, 0x43, 0xfe, 0x77, 0x57, 0xfe, 0x27, 0xf0,
+       0xfe, 0xe4, 0x01, 0xfe,
+       0x07, 0x4b, 0xfe, 0x20, 0xf0, 0xbc, 0xfe, 0x40, 0x1c, 0x2a, 0xeb, 0xfe,
+       0x26, 0xf0, 0xfe, 0x66,
+       0x03, 0xfe, 0xa0, 0xf0, 0xfe, 0x54, 0x03, 0xfe, 0x11, 0xf0, 0xbc, 0xfe,
+       0xef, 0x10, 0xfe, 0x9f,
+       0xf0, 0xfe, 0x74, 0x03, 0xfe, 0x46, 0x1c, 0x19, 0xfe, 0x11, 0x00, 0x05,
+       0x70, 0x37, 0xfe, 0x48,
+       0x1c, 0xfe, 0x46, 0x1c, 0x01, 0x0c, 0x06, 0x28, 0xfe, 0x18, 0x13, 0x26,
+       0x21, 0xb9, 0xc7, 0x20,
+       0xb9, 0x0a, 0x57, 0x01, 0x18, 0xc7, 0x89, 0x01, 0xfe, 0xc8, 0x1a, 0x15,
+       0xe1, 0x2a, 0xeb, 0xfe,
+       0x01, 0xf0, 0xeb, 0xfe, 0x82, 0xf0, 0xfe, 0xa4, 0x03, 0xfe, 0x9c, 0x32,
+       0x15, 0xfe, 0xe4, 0x00,
+       0x2f, 0xfe, 0xb6, 0x03, 0x2a, 0x3c, 0x16, 0xfe, 0xc6, 0x03, 0x01, 0x41,
+       0xfe, 0x06, 0xf0, 0xfe,
+       0xd6, 0x03, 0xaf, 0xa0, 0xfe, 0x0a, 0xf0, 0xfe, 0xa2, 0x07, 0x05, 0x29,
+       0x03, 0x81, 0x1e, 0x1b,
+       0xfe, 0x24, 0x05, 0x1f, 0x63, 0x01, 0x42, 0x8f, 0xfe, 0x70, 0x02, 0x05,
+       0xea, 0xfe, 0x46, 0x1c,
+       0x37, 0x7d, 0x1d, 0xfe, 0x67, 0x1b, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57,
+       0xfe, 0x48, 0x1c, 0x75,
+       0x01, 0xa6, 0x86, 0x0a, 0x57, 0x01, 0x18, 0x09, 0x00, 0x1b, 0xec, 0x0a,
+       0xe1, 0x01, 0x18, 0x77,
+       0x50, 0x40, 0x8d, 0x30, 0x03, 0x81, 0x1e, 0xf8, 0x1f, 0x63, 0x01, 0x42,
+       0x8f, 0xfe, 0x70, 0x02,
+       0x05, 0xea, 0xd7, 0x99, 0xd8, 0x9c, 0x2a, 0x29, 0x2f, 0xfe, 0x4e, 0x04,
+       0x16, 0xfe, 0x4a, 0x04,
+       0x7e, 0xfe, 0xa0, 0x00, 0xfe, 0x9b, 0x57, 0xfe, 0x54, 0x12, 0x32, 0xff,
+       0x02, 0x00, 0x10, 0x01,
+       0x08, 0x16, 0xfe, 0x02, 0x05, 0x32, 0x01, 0x08, 0x16, 0x29, 0x27, 0x25,
+       0xee, 0xfe, 0x4c, 0x44,
+       0xfe, 0x58, 0x12, 0x50, 0xfe, 0x44, 0x48, 0x13, 0x34, 0xfe, 0x4c, 0x54,
+       0x7b, 0xec, 0x60, 0x8d,
+       0x30, 0x01, 0xfe, 0x4e, 0x1e, 0xfe, 0x48, 0x47, 0xfe, 0x7c, 0x13, 0x01,
+       0x0c, 0x06, 0x28, 0xfe,
+       0x32, 0x13, 0x01, 0x43, 0x09, 0x9b, 0xfe, 0x68, 0x13, 0xfe, 0x26, 0x10,
+       0x13, 0x34, 0xfe, 0x4c,
+       0x54, 0x7b, 0xec, 0x01, 0xfe, 0x4e, 0x1e, 0xfe, 0x48, 0x47, 0xfe, 0x54,
+       0x13, 0x01, 0x0c, 0x06,
+       0x28, 0xa5, 0x01, 0x43, 0x09, 0x9b, 0xfe, 0x40, 0x13, 0x01, 0x0c, 0x06,
+       0x28, 0xf9, 0x1f, 0x7f,
+       0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe, 0x0d, 0x00, 0x01, 0x42, 0x8f,
+       0xfe, 0xa4, 0x0e, 0x05,
+       0x29, 0x32, 0x15, 0xfe, 0xe6, 0x00, 0x0f, 0xfe, 0x1c, 0x90, 0x04, 0xfe,
+       0x9c, 0x93, 0x3a, 0x0b,
+       0x0e, 0x8b, 0x02, 0x1f, 0x7f, 0x01, 0x42, 0x05, 0x35, 0xfe, 0x42, 0x5b,
+       0x7d, 0x1d, 0xfe, 0x46,
+       0x59, 0xfe, 0xbf, 0x57, 0xfe, 0x77, 0x57, 0x0f, 0xfe, 0x87, 0x80, 0x04,
+       0xfe, 0x87, 0x83, 0xfe,
+       0xc9, 0x47, 0x0b, 0x0e, 0xd0, 0x65, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x98,
+       0x13, 0x0f, 0xfe, 0x20,
+       0x80, 0x04, 0xfe, 0xa0, 0x83, 0x33, 0x0b, 0x0e, 0x09, 0x1d, 0xfe, 0x84,
+       0x12, 0x01, 0x38, 0x06,
+       0x07, 0xfe, 0x70, 0x13, 0x03, 0xfe, 0xa2, 0x00, 0x1e, 0x1b, 0xfe, 0xda,
+       0x05, 0xd0, 0x54, 0x01,
+       0x38, 0x06, 0x0d, 0xfe, 0x58, 0x13, 0x03, 0xfe, 0xa0, 0x00, 0x1e, 0xfe,
+       0x50, 0x12, 0x5e, 0xff,
+       0x02, 0x00, 0x10, 0x2f, 0xfe, 0x90, 0x05, 0x2a, 0x3c, 0xcc, 0xff, 0x02,
+       0x00, 0x10, 0x2f, 0xfe,
+       0x9e, 0x05, 0x17, 0xfe, 0xf4, 0x05, 0x15, 0xfe, 0xe3, 0x00, 0x26, 0x01,
+       0x38, 0xfe, 0x4a, 0xf0,
+       0xfe, 0xc0, 0x05, 0xfe, 0x49, 0xf0, 0xfe, 0xba, 0x05, 0x71, 0x2e, 0xfe,
+       0x21, 0x00, 0xf1, 0x2e,
+       0xfe, 0x22, 0x00, 0xa2, 0x2e, 0x4a, 0xfe, 0x09, 0x48, 0xff, 0x02, 0x00,
+       0x10, 0x2f, 0xfe, 0xd0,
+       0x05, 0x17, 0xfe, 0xf4, 0x05, 0xfe, 0xe2, 0x08, 0x01, 0x38, 0x06, 0xfe,
+       0x1c, 0x00, 0x4d, 0x01,
+       0xa7, 0x2e, 0x07, 0x20, 0xe4, 0x47, 0xfe, 0x27, 0x01, 0x01, 0x0c, 0x06,
+       0x28, 0xfe, 0x24, 0x12,
+       0x3e, 0x01, 0x84, 0x1f, 0x7f, 0x01, 0x0c, 0x06, 0x07, 0x4d, 0x1f, 0xfe,
+       0x0d, 0x00, 0x01, 0x42,
+       0x8f, 0xfe, 0xa4, 0x0e, 0x05, 0x29, 0x03, 0xe6, 0x1e, 0xfe, 0xca, 0x13,
+       0x03, 0xb6, 0x1e, 0xfe,
+       0x40, 0x12, 0x03, 0x66, 0x1e, 0xfe, 0x38, 0x13, 0x3e, 0x01, 0x84, 0x17,
+       0xfe, 0x72, 0x06, 0x0a,
+       0x07, 0x01, 0x38, 0x06, 0x24, 0xfe, 0x02, 0x12, 0x4f, 0x01, 0xfe, 0x56,
+       0x19, 0x16, 0xfe, 0x68,
+       0x06, 0x15, 0x82, 0x01, 0x41, 0x15, 0xe2, 0x03, 0x66, 0x8a, 0x10, 0x66,
+       0x03, 0x9a, 0x1e, 0xfe,
+       0x70, 0x12, 0x03, 0x55, 0x1e, 0xfe, 0x68, 0x13, 0x01, 0xc6, 0x09, 0x12,
+       0x48, 0xfe, 0x92, 0x06,
+       0x2e, 0x12, 0x01, 0xfe, 0xac, 0x1d, 0xfe, 0x43, 0x48, 0x62, 0x80, 0x13,
+       0x58, 0xff, 0x02, 0x00,
+       0x57, 0x52, 0xad, 0x23, 0x3f, 0x4e, 0x62, 0x49, 0x3e, 0x01, 0x84, 0x17,
+       0xfe, 0xea, 0x06, 0x01,
+       0x38, 0x06, 0x12, 0xf7, 0x45, 0x0a, 0x95, 0x01, 0xfe, 0x84, 0x19, 0x16,
+       0xfe, 0xe0, 0x06, 0x15,
+       0x82, 0x01, 0x41, 0x15, 0xe2, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x1c, 0x07,
+       0x01, 0x84, 0xfe, 0xae,
+       0x10, 0x03, 0x6f, 0x1e, 0xfe, 0x9e, 0x13, 0x3e, 0x01, 0x84, 0x03, 0x9a,
+       0x1e, 0xfe, 0x1a, 0x12,
+       0x01, 0x38, 0x06, 0x12, 0xfc, 0x01, 0xc6, 0x01, 0xfe, 0xac, 0x1d, 0xfe,
+       0x43, 0x48, 0x62, 0x80,
+       0xf0, 0x45, 0x0a, 0x95, 0x03, 0xb6, 0x1e, 0xf8, 0x01, 0x38, 0x06, 0x24,
+       0x36, 0xfe, 0x02, 0xf6,
+       0x07, 0x71, 0x78, 0x8c, 0x00, 0x4d, 0x62, 0x49, 0x3e, 0x2d, 0x93, 0x4e,
+       0xd0, 0x0d, 0x17, 0xfe,
+       0x9a, 0x07, 0x01, 0xfe, 0xc0, 0x19, 0x16, 0xfe, 0x90, 0x07, 0x26, 0x20,
+       0x9e, 0x15, 0x82, 0x01,
+       0x41, 0x15, 0xe2, 0x21, 0x9e, 0x09, 0x07, 0xfb, 0x03, 0xe6, 0xfe, 0x58,
+       0x57, 0x10, 0xe6, 0x05,
+       0xfe, 0x2a, 0x06, 0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x1c, 0x07, 0x01, 0x84,
+       0xfe, 0x9c, 0x32, 0x5f,
+       0x75, 0x01, 0xa6, 0x86, 0x15, 0xfe, 0xe2, 0x00, 0x2f, 0xed, 0x2a, 0x3c,
+       0xfe, 0x0a, 0xf0, 0xfe,
+       0xce, 0x07, 0xae, 0xfe, 0x96, 0x08, 0xfe, 0x06, 0xf0, 0xfe, 0x9e, 0x08,
+       0xaf, 0xa0, 0x05, 0x29,
+       0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x2e, 0x12, 0x14, 0x1d, 0x01, 0x08, 0x14,
+       0x00, 0x01, 0x08, 0x14,
+       0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0xfe, 0x99, 0xa4, 0x01, 0x08,
+       0x14, 0x00, 0x05, 0xfe,
+       0xc6, 0x09, 0x01, 0x76, 0x06, 0x12, 0xfe, 0x3a, 0x12, 0x01, 0x0c, 0x06,
+       0x12, 0xfe, 0x30, 0x13,
+       0x14, 0xfe, 0x1b, 0x00, 0x01, 0x08, 0x14, 0x00, 0x01, 0x08, 0x14, 0x00,
+       0x01, 0x08, 0x14, 0x00,
+       0x01, 0x08, 0x14, 0x07, 0x01, 0x08, 0x14, 0x00, 0x05, 0xef, 0x7c, 0x4a,
+       0x78, 0x4f, 0x0f, 0xfe,
+       0x9a, 0x81, 0x04, 0xfe, 0x9a, 0x83, 0xfe, 0xcb, 0x47, 0x0b, 0x0e, 0x2d,
+       0x28, 0x48, 0xfe, 0x6c,
+       0x08, 0x0a, 0x28, 0xfe, 0x09, 0x6f, 0xca, 0xfe, 0xca, 0x45, 0xfe, 0x32,
+       0x12, 0x53, 0x63, 0x4e,
+       0x7c, 0x97, 0x2f, 0xfe, 0x7e, 0x08, 0x2a, 0x3c, 0xfe, 0x0a, 0xf0, 0xfe,
+       0x6c, 0x08, 0xaf, 0xa0,
+       0xae, 0xfe, 0x96, 0x08, 0x05, 0x29, 0x01, 0x41, 0x05, 0xed, 0x14, 0x24,
+       0x05, 0xed, 0xfe, 0x9c,
+       0xf7, 0x9f, 0x01, 0xfe, 0xae, 0x1e, 0xfe, 0x18, 0x58, 0x01, 0xfe, 0xbe,
+       0x1e, 0xfe, 0x99, 0x58,
+       0xfe, 0x78, 0x18, 0xfe, 0xf9, 0x18, 0x8e, 0xfe, 0x16, 0x09, 0x10, 0x6a,
+       0x22, 0x6b, 0x01, 0x0c,
+       0x61, 0x54, 0x44, 0x21, 0x2c, 0x09, 0x1a, 0xf8, 0x77, 0x01, 0xfe, 0x7e,
+       0x1e, 0x47, 0x2c, 0x7a,
+       0x30, 0xf0, 0xfe, 0x83, 0xe7, 0xfe, 0x3f, 0x00, 0x71, 0xfe, 0x03, 0x40,
+       0x01, 0x0c, 0x61, 0x65,
+       0x44, 0x01, 0xc2, 0xc8, 0xfe, 0x1f, 0x40, 0x20, 0x6e, 0x01, 0xfe, 0x6a,
+       0x16, 0xfe, 0x08, 0x50,
+       0xfe, 0x8a, 0x50, 0xfe, 0x44, 0x51, 0xfe, 0xc6, 0x51, 0xfe, 0x10, 0x10,
+       0x01, 0xfe, 0xce, 0x1e,
+       0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x01, 0xfe, 0xee, 0x1e,
+       0x01, 0xfe, 0xfe, 0x1e,
+       0xfe, 0x40, 0x50, 0xfe, 0xc2, 0x50, 0x10, 0x4b, 0x22, 0x4c, 0xfe, 0x8a,
+       0x10, 0x01, 0x0c, 0x06,
+       0x54, 0xfe, 0x50, 0x12, 0x01, 0xfe, 0xae, 0x1e, 0x01, 0xfe, 0xbe, 0x1e,
+       0x10, 0x6a, 0x22, 0x6b,
+       0x01, 0x0c, 0x06, 0x65, 0x4e, 0x01, 0xc2, 0x0f, 0xfe, 0x1f, 0x80, 0x04,
+       0xfe, 0x9f, 0x83, 0x33,
+       0x0b, 0x0e, 0x20, 0x6e, 0x0f, 0xfe, 0x44, 0x90, 0x04, 0xfe, 0xc4, 0x93,
+       0x3a, 0x0b, 0xfe, 0xc6,
+       0x90, 0x04, 0xfe, 0xc6, 0x93, 0x79, 0x0b, 0x0e, 0x10, 0x6c, 0x22, 0x6d,
+       0x01, 0xfe, 0xce, 0x1e,
+       0x01, 0xfe, 0xde, 0x1e, 0x10, 0x68, 0x22, 0x69, 0x0f, 0xfe, 0x40, 0x90,
+       0x04, 0xfe, 0xc0, 0x93,
+       0x3a, 0x0b, 0xfe, 0xc2, 0x90, 0x04, 0xfe, 0xc2, 0x93, 0x79, 0x0b, 0x0e,
+       0x10, 0x4b, 0x22, 0x4c,
+       0x10, 0x64, 0x22, 0x34, 0x01, 0x0c, 0x61, 0x24, 0x44, 0x37, 0x13, 0xfe,
+       0x4e, 0x11, 0x2f, 0xfe,
+       0xde, 0x09, 0xfe, 0x9e, 0xf0, 0xfe, 0xf2, 0x09, 0xfe, 0x01, 0x48, 0x1b,
+       0x3c, 0x37, 0x88, 0xf5,
+       0xd4, 0xfe, 0x1e, 0x0a, 0xd5, 0xfe, 0x42, 0x0a, 0xd2, 0xfe, 0x1e, 0x0a,
+       0xd3, 0xfe, 0x42, 0x0a,
+       0xae, 0xfe, 0x12, 0x0a, 0xfe, 0x06, 0xf0, 0xfe, 0x18, 0x0a, 0xaf, 0xa0,
+       0x05, 0x29, 0x01, 0x41,
+       0xfe, 0xc1, 0x10, 0x14, 0x24, 0xfe, 0xc1, 0x10, 0x01, 0x76, 0x06, 0x07,
+       0xfe, 0x14, 0x12, 0x01,
+       0x76, 0x06, 0x0d, 0x5d, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x74, 0x12, 0xfe,
+       0x2e, 0x1c, 0x05, 0xfe,
+       0x1a, 0x0c, 0x01, 0x76, 0x06, 0x07, 0x5d, 0x01, 0x76, 0x06, 0x0d, 0x41,
+       0xfe, 0x2c, 0x1c, 0xfe,
+       0xaa, 0xf0, 0xfe, 0xce, 0x0a, 0xfe, 0xac, 0xf0, 0xfe, 0x66, 0x0a, 0xfe,
+       0x92, 0x10, 0xc4, 0xf6,
+       0xfe, 0xad, 0xf0, 0xfe, 0x72, 0x0a, 0x05, 0xfe, 0x1a, 0x0c, 0xc5, 0xfe,
+       0xe7, 0x10, 0xfe, 0x2b,
+       0xf0, 0xbf, 0xfe, 0x6b, 0x18, 0x23, 0xfe, 0x00, 0xfe, 0xfe, 0x1c, 0x12,
+       0xac, 0xfe, 0xd2, 0xf0,
+       0xbf, 0xfe, 0x76, 0x18, 0x23, 0x1d, 0x1b, 0xbf, 0x03, 0xe3, 0x23, 0x07,
+       0x1b, 0xbf, 0xd4, 0x5b,
+       0xd5, 0x5b, 0xd2, 0x5b, 0xd3, 0x5b, 0xc4, 0xc5, 0xfe, 0xa9, 0x10, 0x75,
+       0x5e, 0x32, 0x1f, 0x7f,
+       0x01, 0x42, 0x19, 0xfe, 0x35, 0x00, 0xfe, 0x01, 0xf0, 0x70, 0x19, 0x98,
+       0x05, 0x70, 0xfe, 0x74,
+       0x18, 0x23, 0xfe, 0x00, 0xf8, 0x1b, 0x5b, 0x7d, 0x12, 0x01, 0xfe, 0x78,
+       0x0f, 0x4d, 0x01, 0xfe,
+       0x96, 0x1a, 0x21, 0x30, 0x77, 0x7d, 0x1d, 0x05, 0x5b, 0x01, 0x0c, 0x06,
+       0x0d, 0x2b, 0xfe, 0xe2,
+       0x0b, 0x01, 0x0c, 0x06, 0x54, 0xfe, 0xa6, 0x12, 0x01, 0x0c, 0x06, 0x24,
+       0xfe, 0x88, 0x13, 0x21,
+       0x6e, 0xc7, 0x01, 0xfe, 0x1e, 0x1f, 0x0f, 0xfe, 0x83, 0x80, 0x04, 0xfe,
+       0x83, 0x83, 0xfe, 0xc9,
+       0x47, 0x0b, 0x0e, 0xfe, 0xc8, 0x44, 0xfe, 0x42, 0x13, 0x0f, 0xfe, 0x04,
+       0x91, 0x04, 0xfe, 0x84,
+       0x93, 0xfe, 0xca, 0x57, 0x0b, 0xfe, 0x86, 0x91, 0x04, 0xfe, 0x86, 0x93,
+       0xfe, 0xcb, 0x57, 0x0b,
+       0x0e, 0x7a, 0x30, 0xfe, 0x40, 0x59, 0xfe, 0xc1, 0x59, 0x8e, 0x40, 0x03,
+       0x6a, 0x3b, 0x6b, 0x10,
+       0x97, 0x22, 0x98, 0xd9, 0x6a, 0xda, 0x6b, 0x01, 0xc2, 0xc8, 0x7a, 0x30,
+       0x20, 0x6e, 0xdb, 0x64,
+       0xdc, 0x34, 0x91, 0x6c, 0x7e, 0x6d, 0xfe, 0x44, 0x55, 0xfe, 0xe5, 0x55,
+       0xfe, 0x04, 0xfa, 0x64,
+       0xfe, 0x05, 0xfa, 0x34, 0x01, 0xfe, 0x6a, 0x16, 0xa3, 0x26, 0x10, 0x97,
+       0x10, 0x98, 0x91, 0x6c,
+       0x7e, 0x6d, 0xfe, 0x14, 0x10, 0x01, 0x0c, 0x06, 0x24, 0x1b, 0x40, 0x91,
+       0x4b, 0x7e, 0x4c, 0x01,
+       0x0c, 0x06, 0xfe, 0xf7, 0x00, 0x44, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x10,
+       0x58, 0xfe, 0x91, 0x58,
+       0xfe, 0x14, 0x59, 0xfe, 0x95, 0x59, 0x05, 0x5b, 0x01, 0x0c, 0x06, 0x24,
+       0x1b, 0x40, 0x01, 0x0c,
+       0x06, 0xfe, 0xf7, 0x00, 0x44, 0x78, 0x01, 0xfe, 0x8e, 0x1e, 0x4f, 0x0f,
+       0xfe, 0x10, 0x90, 0x04,
+       0xfe, 0x90, 0x93, 0x3a, 0x0b, 0xfe, 0x92, 0x90, 0x04, 0xfe, 0x92, 0x93,
+       0x79, 0x0b, 0x0e, 0xfe,
+       0xbd, 0x10, 0x01, 0x43, 0x09, 0xbb, 0x1b, 0xfe, 0x6e, 0x0a, 0x15, 0xbb,
+       0x01, 0x0c, 0x06, 0x0d,
+       0xfe, 0x14, 0x13, 0x03, 0x4b, 0x3b, 0x4c, 0x8e, 0xfe, 0x6e, 0x0a, 0xfe,
+       0x0c, 0x58, 0xfe, 0x8d,
+       0x58, 0x05, 0x5b, 0x26, 0x3e, 0x0f, 0xfe, 0x19, 0x80, 0x04, 0xfe, 0x99,
+       0x83, 0x33, 0x0b, 0x0e,
+       0xfe, 0xe5, 0x10, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1a, 0x12, 0xfe, 0x6c,
+       0x19, 0xfe, 0x19, 0x41,
+       0xfe, 0x6b, 0x18, 0xac, 0xfe, 0xd1, 0xf0, 0xef, 0x1f, 0x92, 0x01, 0x42,
+       0x19, 0xfe, 0x44, 0x00,
+       0xfe, 0x90, 0x10, 0xfe, 0x6c, 0x19, 0xd9, 0x4b, 0xfe, 0xed, 0x19, 0xda,
+       0x4c, 0xfe, 0x0c, 0x51,
+       0xfe, 0x8e, 0x51, 0xfe, 0x6b, 0x18, 0x23, 0xfe, 0x00, 0xff, 0x31, 0xfe,
+       0x76, 0x10, 0xac, 0xfe,
+       0xd2, 0xf0, 0xfe, 0xba, 0x0c, 0xfe, 0x76, 0x18, 0x23, 0x1d, 0x5d, 0x03,
+       0xe3, 0x23, 0x07, 0xfe,
+       0x08, 0x13, 0x19, 0xfe, 0x16, 0x00, 0x05, 0x70, 0xfe, 0xd1, 0xf0, 0xfe,
+       0xcc, 0x0c, 0x1f, 0x92,
+       0x01, 0x42, 0x19, 0xfe, 0x17, 0x00, 0x5c, 0xfe, 0xce, 0xf0, 0xfe, 0xd2,
+       0x0c, 0xfe, 0x3e, 0x10,
+       0xfe, 0xcd, 0xf0, 0xfe, 0xde, 0x0c, 0x19, 0xfe, 0x22, 0x00, 0x05, 0x70,
+       0xfe, 0xcb, 0xf0, 0xfe,
+       0xea, 0x0c, 0x19, 0xfe, 0x24, 0x00, 0x05, 0x70, 0xfe, 0xd0, 0xf0, 0xfe,
+       0xf4, 0x0c, 0x19, 0x94,
+       0xfe, 0x1c, 0x10, 0xfe, 0xcf, 0xf0, 0xfe, 0xfe, 0x0c, 0x19, 0x4a, 0xf3,
+       0xfe, 0xcc, 0xf0, 0xef,
+       0x01, 0x76, 0x06, 0x24, 0x4d, 0x19, 0xfe, 0x12, 0x00, 0x37, 0x13, 0xfe,
+       0x4e, 0x11, 0x2f, 0xfe,
+       0x16, 0x0d, 0xfe, 0x9e, 0xf0, 0xfe, 0x2a, 0x0d, 0xfe, 0x01, 0x48, 0x1b,
+       0x3c, 0x37, 0x88, 0xf5,
+       0xd4, 0x29, 0xd5, 0x29, 0xd2, 0x29, 0xd3, 0x29, 0x37, 0xfe, 0x9c, 0x32,
+       0x2f, 0xfe, 0x3e, 0x0d,
+       0x2a, 0x3c, 0xae, 0xfe, 0x62, 0x0d, 0xaf, 0xa0, 0xd4, 0x9f, 0xd5, 0x9f,
+       0xd2, 0x9f, 0xd3, 0x9f,
+       0x05, 0x29, 0x01, 0x41, 0xfe, 0xd3, 0x10, 0x15, 0xfe, 0xe8, 0x00, 0xc4,
+       0xc5, 0x75, 0xd7, 0x99,
+       0xd8, 0x9c, 0xfe, 0x89, 0xf0, 0x29, 0x27, 0x25, 0xbe, 0xd7, 0x99, 0xd8,
+       0x9c, 0x2f, 0xfe, 0x8c,
+       0x0d, 0x16, 0x29, 0x27, 0x25, 0xbd, 0xfe, 0x01, 0x48, 0xa4, 0x19, 0xfe,
+       0x42, 0x00, 0x05, 0x70,
+       0x90, 0x07, 0xfe, 0x81, 0x49, 0x1b, 0xfe, 0x64, 0x0e, 0x01, 0x0c, 0x06,
+       0x0d, 0xfe, 0x44, 0x13,
+       0x19, 0x00, 0x2d, 0x0d, 0xfe, 0x54, 0x12, 0x2d, 0xfe, 0x28, 0x00, 0x2b,
+       0xfe, 0xda, 0x0e, 0x0a,
+       0x57, 0x01, 0x18, 0x09, 0x00, 0x36, 0x46, 0xfe, 0x28, 0x00, 0xfe, 0xfa,
+       0x10, 0x01, 0xfe, 0xf4,
+       0x1c, 0x01, 0xfe, 0x00, 0x1d, 0x0a, 0xba, 0x01, 0xfe, 0x58, 0x10, 0x40,
+       0x15, 0x56, 0x01, 0x85,
+       0x05, 0x35, 0x19, 0xfe, 0x44, 0x00, 0x2d, 0x0d, 0xf7, 0x46, 0x0d, 0xfe,
+       0xcc, 0x10, 0x01, 0xa7,
+       0x46, 0x0d, 0xfe, 0xc2, 0x10, 0x01, 0xa7, 0x0f, 0xfe, 0x19, 0x82, 0x04,
+       0xfe, 0x99, 0x83, 0xfe,
+       0xcc, 0x47, 0x0b, 0x0e, 0xfe, 0x34, 0x46, 0xa5, 0x46, 0x0d, 0x19, 0xfe,
+       0x43, 0x00, 0xfe, 0xa2,
+       0x10, 0x01, 0x0c, 0x61, 0x0d, 0x44, 0x01, 0xfe, 0xf4, 0x1c, 0x01, 0xfe,
+       0x00, 0x1d, 0x40, 0x15,
+       0x56, 0x01, 0x85, 0x7d, 0x0d, 0x40, 0x51, 0x01, 0xfe, 0x9e, 0x1e, 0x05,
+       0xfe, 0x3a, 0x03, 0x01,
+       0x0c, 0x06, 0x0d, 0x5d, 0x46, 0x0d, 0x19, 0x00, 0xfe, 0x62, 0x10, 0x01,
+       0x76, 0x06, 0x12, 0xfe,
+       0x5c, 0x12, 0x01, 0x0c, 0x06, 0x12, 0xfe, 0x52, 0x13, 0xfe, 0x1c, 0x1c,
+       0xfe, 0x9d, 0xf0, 0xfe,
+       0x8e, 0x0e, 0xfe, 0x1c, 0x1c, 0xfe, 0x9d, 0xf0, 0xfe, 0x94, 0x0e, 0x01,
+       0x0c, 0x61, 0x12, 0x44,
+       0xfe, 0x9f, 0x10, 0x19, 0xfe, 0x15, 0x00, 0xfe, 0x04, 0xe6, 0x0d, 0x4f,
+       0xfe, 0x2e, 0x10, 0x19,
+       0xfe, 0x13, 0x00, 0xfe, 0x10, 0x10, 0x19, 0xfe, 0x47, 0x00, 0xf1, 0x19,
+       0xfe, 0x41, 0x00, 0xa2,
+       0x19, 0xfe, 0x24, 0x00, 0x86, 0xc4, 0xc5, 0x75, 0x03, 0x81, 0x1e, 0x2b,
+       0xea, 0x4f, 0xfe, 0x04,
+       0xe6, 0x12, 0xfe, 0x9d, 0x41, 0xfe, 0x1c, 0x42, 0x40, 0x01, 0xf4, 0x05,
+       0x35, 0xfe, 0x12, 0x1c,
+       0x1f, 0x0d, 0x47, 0xb5, 0xc3, 0x1f, 0xfe, 0x31, 0x00, 0x47, 0xb8, 0x01,
+       0xfe, 0xd4, 0x11, 0x05,
+       0xe9, 0x51, 0xfe, 0x06, 0xec, 0xe0, 0xfe, 0x0e, 0x47, 0x46, 0x28, 0xfe,
+       0xce, 0x45, 0x31, 0x51,
+       0xfe, 0x06, 0xea, 0xe0, 0xfe, 0x47, 0x4b, 0x45, 0xfe, 0x75, 0x57, 0x03,
+       0x67, 0xfe, 0x98, 0x56,
+       0xfe, 0x38, 0x12, 0x0a, 0x5a, 0x01, 0x18, 0xfe, 0x44, 0x48, 0x60, 0x01,
+       0x0c, 0x06, 0x28, 0xfe,
+       0x18, 0x13, 0x0a, 0x57, 0x01, 0x18, 0x3e, 0xfe, 0x41, 0x58, 0x0a, 0xba,
+       0xfe, 0xfa, 0x14, 0xfe,
+       0x49, 0x54, 0xb0, 0xfe, 0x5e, 0x0f, 0x05, 0xfe, 0x3a, 0x03, 0x0a, 0x67,
+       0xfe, 0xe0, 0x14, 0xfe,
+       0x0e, 0x47, 0x46, 0x28, 0xfe, 0xce, 0x45, 0x31, 0x51, 0xfe, 0xce, 0x47,
+       0xfe, 0xad, 0x13, 0x05,
+       0x35, 0x21, 0x2c, 0x09, 0x1a, 0xfe, 0x98, 0x12, 0x26, 0x20, 0x96, 0x20,
+       0xe7, 0xfe, 0x08, 0x1c,
+       0xfe, 0x7c, 0x19, 0xfe, 0xfd, 0x19, 0xfe, 0x0a, 0x1c, 0x03, 0xe5, 0xfe,
+       0x48, 0x55, 0xa5, 0x3b,
+       0xfe, 0x62, 0x01, 0xfe, 0xc9, 0x55, 0x31, 0xfe, 0x74, 0x10, 0x01, 0xfe,
+       0xf0, 0x1a, 0x03, 0xfe,
+       0x38, 0x01, 0x3b, 0xfe, 0x3a, 0x01, 0x8e, 0xfe, 0x1e, 0x10, 0xfe, 0x02,
+       0xec, 0xe7, 0x53, 0x00,
+       0x36, 0xfe, 0x04, 0xec, 0x2c, 0x60, 0xfe, 0x05, 0xf6, 0xfe, 0x34, 0x01,
+       0x01, 0xfe, 0x62, 0x1b,
+       0x01, 0xfe, 0xce, 0x1e, 0xb2, 0x11, 0xfe, 0x18, 0x13, 0xca, 0xfe, 0x02,
+       0xea, 0xe7, 0x53, 0x92,
+       0xfe, 0xc3, 0x13, 0x1f, 0x12, 0x47, 0xb5, 0xc3, 0xfe, 0x2a, 0x10, 0x03,
+       0xfe, 0x38, 0x01, 0x23,
+       0xfe, 0xf0, 0xff, 0x10, 0xe5, 0x03, 0xfe, 0x3a, 0x01, 0x10, 0xfe, 0x62,
+       0x01, 0x01, 0xfe, 0x1e,
+       0x1e, 0x20, 0x2c, 0x15, 0x56, 0x01, 0xfe, 0x9e, 0x1e, 0x13, 0x07, 0x02,
+       0x26, 0x02, 0x21, 0x96,
+       0xc7, 0x20, 0x96, 0x09, 0x92, 0xfe, 0x79, 0x13, 0x1f, 0x1d, 0x47, 0xb5,
+       0xc3, 0xfe, 0xe1, 0x10,
+       0xcf, 0xfe, 0x03, 0xdc, 0xfe, 0x73, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xcf,
+       0xfe, 0x03, 0xdc, 0xfe,
+       0x5b, 0x57, 0xfe, 0x80, 0x5d, 0x02, 0xfe, 0x03, 0x57, 0xcf, 0x26, 0xfe,
+       0x00, 0xcc, 0x02, 0xfe,
+       0x03, 0x57, 0xcf, 0x89, 0x02, 0x01, 0x0c, 0x06, 0x4a, 0xfe, 0x4e, 0x13,
+       0x0f, 0xfe, 0x1c, 0x80,
+       0x04, 0xfe, 0x9c, 0x83, 0x33, 0x0b, 0x0e, 0x09, 0x07, 0xfe, 0x3a, 0x13,
+       0x0f, 0xfe, 0x1e, 0x80,
+       0x04, 0xfe, 0x9e, 0x83, 0x33, 0x0b, 0x0e, 0xfe, 0x2a, 0x13, 0x0f, 0xfe,
+       0x1d, 0x80, 0x04, 0xfe,
+       0x9d, 0x83, 0xfe, 0xf9, 0x13, 0x0e, 0xfe, 0x1c, 0x13, 0x01, 0xfe, 0xee,
+       0x1e, 0xac, 0xfe, 0x14,
+       0x13, 0x01, 0xfe, 0xfe, 0x1e, 0xfe, 0x81, 0x58, 0xfa, 0x01, 0xfe, 0x0e,
+       0x1f, 0xfe, 0x30, 0xf4,
+       0x0d, 0xfe, 0x3c, 0x50, 0xa2, 0x01, 0xfe, 0x92, 0x1b, 0x01, 0x43, 0x09,
+       0x56, 0xfb, 0x01, 0xfe,
+       0xc8, 0x1a, 0x01, 0x0c, 0x06, 0x28, 0xa4, 0x01, 0xfe, 0xf4, 0x1c, 0x01,
+       0xfe, 0x00, 0x1d, 0x15,
+       0xfe, 0xe9, 0x00, 0x01, 0x0c, 0x06, 0x4a, 0xfe, 0x4e, 0x13, 0x01, 0xfe,
+       0x22, 0x1b, 0xfe, 0x1e,
+       0x1c, 0x0f, 0xfe, 0x14, 0x90, 0x04, 0xfe, 0x94, 0x93, 0x3a, 0x0b, 0xfe,
+       0x96, 0x90, 0x04, 0xfe,
+       0x96, 0x93, 0x79, 0x0b, 0x0e, 0x10, 0xfe, 0x64, 0x01, 0x22, 0xfe, 0x66,
+       0x01, 0x01, 0x0c, 0x06,
+       0x65, 0xf9, 0x0f, 0xfe, 0x03, 0x80, 0x04, 0xfe, 0x83, 0x83, 0x33, 0x0b,
+       0x0e, 0x77, 0xfe, 0x01,
+       0xec, 0x2c, 0xfe, 0x80, 0x40, 0x20, 0x2c, 0x7a, 0x30, 0x15, 0xdf, 0x40,
+       0x21, 0x2c, 0xfe, 0x00,
+       0x40, 0x8d, 0x2c, 0x02, 0xfe, 0x08, 0x1c, 0x03, 0xfe, 0xac, 0x00, 0xfe,
+       0x06, 0x58, 0x03, 0xfe,
+       0xae, 0x00, 0xfe, 0x07, 0x58, 0x03, 0xfe, 0xb0, 0x00, 0xfe, 0x08, 0x58,
+       0x03, 0xfe, 0xb2, 0x00,
+       0xfe, 0x09, 0x58, 0xfe, 0x0a, 0x1c, 0x2e, 0x49, 0x20, 0xe0, 0x26, 0x10,
+       0x66, 0x10, 0x55, 0x10,
+       0x6f, 0x13, 0x57, 0x52, 0x4f, 0x1c, 0x28, 0xfe, 0x90, 0x4d, 0xfe, 0x91,
+       0x54, 0x2b, 0xfe, 0x88,
+       0x11, 0x46, 0x1a, 0x13, 0x5a, 0x52, 0x1c, 0x4a, 0xfe, 0x90, 0x4d, 0xfe,
+       0x91, 0x54, 0x2b, 0xfe,
+       0x9e, 0x11, 0x2e, 0x1a, 0x20, 0x2c, 0x90, 0x34, 0x60, 0x21, 0x2c, 0xfe,
+       0x00, 0x40, 0x8d, 0x2c,
+       0x15, 0xdf, 0xfe, 0x14, 0x56, 0xfe, 0xd6, 0xf0, 0xfe, 0xb2, 0x11, 0xfe,
+       0x12, 0x1c, 0x75, 0xfe,
+       0x14, 0x1c, 0xfe, 0x10, 0x1c, 0xfe, 0x18, 0x1c, 0x02, 0x51, 0xfe, 0x0c,
+       0x14, 0xfe, 0x0e, 0x47,
+       0xfe, 0x07, 0xe6, 0x28, 0xfe, 0xce, 0x47, 0xfe, 0xf5, 0x13, 0x02, 0x01,
+       0xa7, 0x90, 0x34, 0x60,
+       0xfe, 0x06, 0x80, 0xfe, 0x48, 0x47, 0xfe, 0x42, 0x13, 0xfe, 0x02, 0x80,
+       0x09, 0x56, 0xfe, 0x34,
+       0x13, 0x0a, 0x5a, 0x01, 0x18, 0xcb, 0xfe, 0x36, 0x12, 0xfe, 0x41, 0x48,
+       0xfe, 0x45, 0x48, 0x01,
+       0xfe, 0xb2, 0x16, 0xfe, 0x00, 0xcc, 0xcb, 0xfe, 0xf3, 0x13, 0x3f, 0x89,
+       0x09, 0x1a, 0xa5, 0x0a,
+       0x9d, 0x01, 0x18, 0xfe, 0x80, 0x5c, 0x01, 0x85, 0xf2, 0x09, 0x9b, 0xa4,
+       0xfe, 0x14, 0x56, 0xfe,
+       0xd6, 0xf0, 0xfe, 0xec, 0x11, 0x02, 0xfe, 0x44, 0x58, 0x77, 0xfe, 0x01,
+       0xec, 0xb8, 0xfe, 0x9e,
+       0x40, 0xfe, 0x9d, 0xe7, 0x00, 0xfe, 0x9c, 0xe7, 0x12, 0x8d, 0x30, 0x01,
+       0xf4, 0xfe, 0xdd, 0x10,
+       0x37, 0xd7, 0x99, 0xd8, 0x9c, 0x27, 0x25, 0xee, 0x09, 0x12, 0xfe, 0x48,
+       0x12, 0x09, 0x0d, 0xfe,
+       0x56, 0x12, 0x09, 0x1d, 0xfe, 0x30, 0x12, 0x09, 0xdd, 0x1b, 0xfe, 0xc4,
+       0x13, 0x09, 0xfe, 0x23,
+       0x00, 0x1b, 0xfe, 0xd0, 0x13, 0x09, 0x07, 0x1b, 0xfe, 0x34, 0x14, 0x09,
+       0x24, 0xfe, 0x12, 0x12,
+       0x09, 0x00, 0x1b, 0x29, 0x1f, 0xdd, 0x01, 0x42, 0xa1, 0x32, 0x01, 0x08,
+       0xae, 0x41, 0x02, 0x32,
+       0xfe, 0x62, 0x08, 0x0a, 0xe1, 0x01, 0xfe, 0x58, 0x10, 0x15, 0x9b, 0x05,
+       0x35, 0x32, 0x01, 0x43,
+       0x09, 0xbb, 0xfe, 0xd7, 0x13, 0x91, 0x4b, 0x7e, 0x4c, 0x8e, 0xfe, 0x80,
+       0x13, 0x01, 0x0c, 0x06,
+       0x54, 0xfe, 0x72, 0x12, 0xdb, 0x64, 0xdc, 0x34, 0xfe, 0x44, 0x55, 0xfe,
+       0xe5, 0x55, 0xb0, 0xfe,
+       0x4a, 0x13, 0x21, 0x6e, 0xfe, 0x26, 0x13, 0x03, 0x97, 0x3b, 0x98, 0x8e,
+       0xfe, 0xb6, 0x0e, 0x10,
+       0x6a, 0x22, 0x6b, 0x26, 0x10, 0x97, 0x10, 0x98, 0x01, 0xc2, 0x2e, 0x49,
+       0x88, 0x20, 0x6e, 0x01,
+       0xfe, 0x6a, 0x16, 0xdb, 0x64, 0xdc, 0x34, 0xfe, 0x04, 0x55, 0xfe, 0xa5,
+       0x55, 0xfe, 0x04, 0xfa,
+       0x64, 0xfe, 0x05, 0xfa, 0x34, 0xfe, 0x8f, 0x10, 0x03, 0x6c, 0x3b, 0x6d,
+       0xfe, 0x40, 0x56, 0xfe,
+       0xe1, 0x56, 0x10, 0x6c, 0x22, 0x6d, 0x71, 0xdb, 0x64, 0xdc, 0x34, 0xfe,
+       0x44, 0x55, 0xfe, 0xe5,
+       0x55, 0x03, 0x68, 0x3b, 0x69, 0xfe, 0x00, 0x56, 0xfe, 0xa1, 0x56, 0x10,
+       0x68, 0x22, 0x69, 0x01,
+       0x0c, 0x06, 0x54, 0xf9, 0x21, 0x6e, 0xfe, 0x1f, 0x40, 0x03, 0x6a, 0x3b,
+       0x6b, 0xfe, 0x2c, 0x50,
+       0xfe, 0xae, 0x50, 0x03, 0x6c, 0x3b, 0x6d, 0xfe, 0x44, 0x50, 0xfe, 0xc6,
+       0x50, 0x03, 0x68, 0x3b,
+       0x69, 0xfe, 0x08, 0x50, 0xfe, 0x8a, 0x50, 0x03, 0x4b, 0x3b, 0x4c, 0xfe,
+       0x40, 0x50, 0xfe, 0xc2,
+       0x50, 0x05, 0x73, 0x2e, 0x07, 0x20, 0x9e, 0x05, 0x72, 0x32, 0x01, 0x08,
+       0x16, 0x3d, 0x27, 0x25,
+       0xee, 0x09, 0x07, 0x2b, 0x3d, 0x01, 0x43, 0x09, 0xbb, 0x2b, 0x72, 0x01,
+       0xa6, 0x23, 0x3f, 0x1b,
+       0x3d, 0x01, 0x0c, 0x06, 0x0d, 0xfe, 0x1e, 0x13, 0x91, 0x4b, 0x7e, 0x4c,
+       0xfe, 0x0a, 0x55, 0x31,
+       0xfe, 0x8b, 0x55, 0xd9, 0x4b, 0xda, 0x4c, 0xfe, 0x0c, 0x51, 0xfe, 0x8e,
+       0x51, 0x05, 0x72, 0x01,
+       0xfe, 0x8e, 0x1e, 0xca, 0xfe, 0x19, 0x41, 0x05, 0x72, 0x32, 0x01, 0x08,
+       0x2a, 0x3c, 0x16, 0xc0,
+       0x27, 0x25, 0xbe, 0x2d, 0x1d, 0xc0, 0x2d, 0x0d, 0x83, 0x2d, 0x7f, 0x1b,
+       0xfe, 0x66, 0x15, 0x05,
+       0x3d, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0xc0, 0x27, 0x25, 0xbd, 0x09, 0x1d,
+       0x2b, 0x3d, 0x01, 0x08,
+       0x16, 0xc0, 0x27, 0x25, 0xfe, 0xe8, 0x09, 0xfe, 0xc2, 0x49, 0x50, 0x03,
+       0xb6, 0x1e, 0x83, 0x01,
+       0x38, 0x06, 0x24, 0x31, 0xa1, 0xfe, 0xbb, 0x45, 0x2d, 0x00, 0xa4, 0x46,
+       0x07, 0x90, 0x3f, 0x01,
+       0xfe, 0xf8, 0x15, 0x01, 0xa6, 0x86, 0xfe, 0x4b, 0x45, 0xfe, 0x20, 0x13,
+       0x01, 0x43, 0x09, 0x82,
+       0xfe, 0x16, 0x13, 0x03, 0x9a, 0x1e, 0x5d, 0x03, 0x55, 0x1e, 0x31, 0x5e,
+       0x05, 0x72, 0xfe, 0xc0,
+       0x5d, 0x01, 0xa7, 0xfe, 0x03, 0x17, 0x03, 0x66, 0x8a, 0x10, 0x66, 0x5e,
+       0x32, 0x01, 0x08, 0x17,
+       0x73, 0x01, 0xfe, 0x56, 0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16,
+       0x3d, 0x27, 0x25, 0xbd,
+       0x09, 0x07, 0x2b, 0x3d, 0x01, 0xfe, 0xbe, 0x16, 0xfe, 0x42, 0x58, 0xfe,
+       0xe8, 0x14, 0x01, 0xa6,
+       0x86, 0xfe, 0x4a, 0xf4, 0x0d, 0x1b, 0x3d, 0xfe, 0x4a, 0xf4, 0x07, 0xfe,
+       0x0e, 0x12, 0x01, 0x43,
+       0x09, 0x82, 0x4e, 0x05, 0x72, 0x03, 0x55, 0x8a, 0x10, 0x55, 0x5e, 0x32,
+       0x01, 0x08, 0x17, 0x73,
+       0x01, 0xfe, 0x84, 0x19, 0x05, 0x73, 0x01, 0x08, 0x2a, 0x3c, 0x16, 0x3d,
+       0x27, 0x25, 0xbd, 0x09,
+       0x12, 0x2b, 0x3d, 0x01, 0xfe, 0xe8, 0x17, 0x8b, 0xfe, 0xaa, 0x14, 0xfe,
+       0xb6, 0x14, 0x86, 0xa8,
+       0xb2, 0x0d, 0x1b, 0x3d, 0xb2, 0x07, 0xfe, 0x0e, 0x12, 0x01, 0x43, 0x09,
+       0x82, 0x4e, 0x05, 0x72,
+       0x03, 0x6f, 0x8a, 0x10, 0x6f, 0x5e, 0x32, 0x01, 0x08, 0x17, 0x73, 0x01,
+       0xfe, 0xc0, 0x19, 0x05,
+       0x73, 0x13, 0x07, 0x2f, 0xfe, 0xcc, 0x15, 0x17, 0xfe, 0xe2, 0x15, 0x5f,
+       0xcc, 0x01, 0x08, 0x26,
+       0x5f, 0x02, 0x8f, 0xfe, 0xde, 0x15, 0x2a, 0xfe, 0xde, 0x15, 0x16, 0xfe,
+       0xcc, 0x15, 0x5e, 0x32,
+       0x01, 0x08, 0xfe, 0xd5, 0x10, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52,
+       0xad, 0x23, 0xfe, 0xff,
+       0x7f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x02, 0x13, 0x58, 0xff, 0x02,
+       0x00, 0x57, 0x52, 0xad,
+       0x23, 0x3f, 0xfe, 0x30, 0x56, 0xfe, 0x00, 0x5c, 0x02, 0x13, 0x58, 0xff,
+       0x02, 0x00, 0x57, 0x52,
+       0xad, 0x02, 0x13, 0x58, 0xff, 0x02, 0x00, 0x57, 0x52, 0xfe, 0x00, 0x5e,
+       0x02, 0x13, 0x58, 0xff,
+       0x02, 0x00, 0x57, 0x52, 0xad, 0xfe, 0x0b, 0x58, 0x02, 0x0a, 0x66, 0x01,
+       0x5c, 0x0a, 0x55, 0x01,
+       0x5c, 0x0a, 0x6f, 0x01, 0x5c, 0x02, 0x01, 0xfe, 0x1e, 0x1f, 0x23, 0x1a,
+       0xff, 0x03, 0x00, 0x54,
+       0xfe, 0x00, 0xf4, 0x24, 0x52, 0x0f, 0xfe, 0x00, 0x7c, 0x04, 0xfe, 0x07,
+       0x7c, 0x3a, 0x0b, 0x0e,
+       0xfe, 0x00, 0x71, 0xfe, 0xf9, 0x18, 0xfe, 0x7a, 0x19, 0xfe, 0xfb, 0x19,
+       0xfe, 0x1a, 0xf7, 0x00,
+       0xfe, 0x1b, 0xf7, 0x00, 0x7a, 0x30, 0x10, 0x68, 0x22, 0x69, 0xd9, 0x6c,
+       0xda, 0x6d, 0x02, 0xfe,
+       0x62, 0x08, 0xfe, 0x82, 0x4a, 0xfe, 0xe1, 0x1a, 0xfe, 0x83, 0x5a, 0x77,
+       0x02, 0x01, 0xc6, 0xfe,
+       0x42, 0x48, 0x4f, 0x50, 0x45, 0x01, 0x08, 0x16, 0xfe, 0xe0, 0x17, 0x27,
+       0x25, 0xbe, 0x01, 0x08,
+       0x16, 0xfe, 0xe0, 0x17, 0x27, 0x25, 0xfe, 0xe8, 0x0a, 0xfe, 0xc1, 0x59,
+       0x03, 0x9a, 0x1e, 0xfe,
+       0xda, 0x12, 0x01, 0x38, 0x06, 0x12, 0xfe, 0xd0, 0x13, 0x26, 0x53, 0x12,
+       0x48, 0xfe, 0x08, 0x17,
+       0xd1, 0x12, 0x53, 0x12, 0xfe, 0x1e, 0x13, 0x2d, 0xb4, 0x7b, 0xfe, 0x26,
+       0x17, 0x4d, 0x13, 0x07,
+       0x1c, 0xb4, 0x90, 0x04, 0xfe, 0x78, 0x10, 0xff, 0x02, 0x83, 0x55, 0xf1,
+       0xff, 0x02, 0x83, 0x55,
+       0x53, 0x1d, 0xfe, 0x12, 0x13, 0xd6, 0xfe, 0x30, 0x00, 0xb0, 0xfe, 0x80,
+       0x17, 0x1c, 0x63, 0x13,
+       0x07, 0xfe, 0x56, 0x10, 0x53, 0x0d, 0xfe, 0x16, 0x13, 0xd6, 0xfe, 0x64,
+       0x00, 0xb0, 0xfe, 0x80,
+       0x17, 0x0a, 0xfe, 0x64, 0x00, 0x1c, 0x94, 0x13, 0x07, 0xfe, 0x28, 0x10,
+       0x53, 0x07, 0xfe, 0x60,
+       0x13, 0xd6, 0xfe, 0xc8, 0x00, 0xb0, 0xfe, 0x80, 0x17, 0x0a, 0xfe, 0xc8,
+       0x00, 0x1c, 0x95, 0x13,
+       0x07, 0x71, 0xd6, 0xfe, 0x90, 0x01, 0x48, 0xfe, 0x8c, 0x17, 0x45, 0xf3,
+       0xfe, 0x43, 0xf4, 0x96,
+       0xfe, 0x56, 0xf0, 0xfe, 0x9e, 0x17, 0xfe, 0x04, 0xf4, 0x58, 0xfe, 0x43,
+       0xf4, 0x94, 0xf6, 0x8b,
+       0x01, 0xfe, 0x24, 0x16, 0x23, 0x3f, 0xfc, 0xa8, 0x8c, 0x49, 0x48, 0xfe,
+       0xda, 0x17, 0x62, 0x49,
+       0xfe, 0x1c, 0x10, 0xa8, 0x8c, 0x80, 0x48, 0xfe, 0xda, 0x17, 0x62, 0x80,
+       0x71, 0x50, 0x26, 0xfe,
+       0x4d, 0xf4, 0x00, 0xf7, 0x45, 0x13, 0x07, 0xfe, 0xb4, 0x56, 0xfe, 0xc3,
+       0x58, 0x02, 0x50, 0x13,
+       0x0d, 0x02, 0x50, 0x3e, 0x78, 0x4f, 0x45, 0x01, 0x08, 0x16, 0xa9, 0x27,
+       0x25, 0xbe, 0xfe, 0x03,
+       0xea, 0xfe, 0x7e, 0x01, 0x01, 0x08, 0x16, 0xa9, 0x27, 0x25, 0xfe, 0xe9,
+       0x0a, 0x01, 0x08, 0x16,
+       0xa9, 0x27, 0x25, 0xfe, 0xe9, 0x0a, 0xfe, 0x05, 0xea, 0xfe, 0x7f, 0x01,
+       0x01, 0x08, 0x16, 0xa9,
+       0x27, 0x25, 0xfe, 0x69, 0x09, 0xfe, 0x02, 0xea, 0xfe, 0x80, 0x01, 0x01,
+       0x08, 0x16, 0xa9, 0x27,
+       0x25, 0xfe, 0xe8, 0x08, 0x47, 0xfe, 0x81, 0x01, 0x03, 0xb6, 0x1e, 0x83,
+       0x01, 0x38, 0x06, 0x24,
+       0x31, 0xa2, 0x78, 0xf2, 0x53, 0x07, 0x36, 0xfe, 0x34, 0xf4, 0x3f, 0xa1,
+       0x78, 0x03, 0x9a, 0x1e,
+       0x83, 0x01, 0x38, 0x06, 0x12, 0x31, 0xf0, 0x4f, 0x45, 0xfe, 0x90, 0x10,
+       0xfe, 0x40, 0x5a, 0x23,
+       0x3f, 0xfb, 0x8c, 0x49, 0x48, 0xfe, 0xaa, 0x18, 0x62, 0x49, 0x71, 0x8c,
+       0x80, 0x48, 0xfe, 0xaa,
+       0x18, 0x62, 0x80, 0xfe, 0xb4, 0x56, 0xfe, 0x40, 0x5d, 0x01, 0xc6, 0x01,
+       0xfe, 0xac, 0x1d, 0xfe,
+       0x02, 0x17, 0xfe, 0xc8, 0x45, 0xfe, 0x5a, 0xf0, 0xfe, 0xc0, 0x18, 0xfe,
+       0x43, 0x48, 0x2d, 0x93,
+       0x36, 0xfe, 0x34, 0xf4, 0xfe, 0x00, 0x11, 0xfe, 0x40, 0x10, 0x2d, 0xb4,
+       0x36, 0xfe, 0x34, 0xf4,
+       0x04, 0xfe, 0x34, 0x10, 0x2d, 0xfe, 0x0b, 0x00, 0x36, 0x46, 0x63, 0xfe,
+       0x28, 0x10, 0xfe, 0xc0,
+       0x49, 0xff, 0x02, 0x00, 0x54, 0xb2, 0xfe, 0x90, 0x01, 0x48, 0xfe, 0xfa,
+       0x18, 0x45, 0xfe, 0x1c,
+       0xf4, 0x3f, 0xf3, 0xfe, 0x40, 0xf4, 0x96, 0xfe, 0x56, 0xf0, 0xfe, 0x0c,
+       0x19, 0xfe, 0x04, 0xf4,
+       0x58, 0xfe, 0x40, 0xf4, 0x94, 0xf6, 0x3e, 0x2d, 0x93, 0x4e, 0xd0, 0x0d,
+       0x21, 0xfe, 0x7f, 0x01,
+       0xfe, 0xc8, 0x46, 0xfe, 0x24, 0x13, 0x8c, 0x00, 0x5d, 0x26, 0x21, 0xfe,
+       0x7e, 0x01, 0xfe, 0xc8,
+       0x45, 0xfe, 0x14, 0x13, 0x21, 0xfe, 0x80, 0x01, 0xfe, 0x48, 0x45, 0xfa,
+       0x21, 0xfe, 0x81, 0x01,
+       0xfe, 0xc8, 0x44, 0x4e, 0x26, 0x02, 0x13, 0x07, 0x02, 0x78, 0x45, 0x50,
+       0x13, 0x0d, 0x02, 0x14,
+       0x07, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x14, 0x0d, 0x01, 0x08, 0x17,
+       0xfe, 0x82, 0x19, 0x14,
+       0x1d, 0x01, 0x08, 0x17, 0xfe, 0x82, 0x19, 0x5f, 0xfe, 0x89, 0x49, 0x01,
+       0x08, 0x02, 0x14, 0x07,
+       0x01, 0x08, 0x17, 0xc1, 0x14, 0x1d, 0x01, 0x08, 0x17, 0xc1, 0x14, 0x07,
+       0x01, 0x08, 0x17, 0xc1,
+       0xfe, 0x89, 0x49, 0x01, 0x08, 0x17, 0xc1, 0x5f, 0xfe, 0x89, 0x4a, 0x01,
+       0x08, 0x02, 0x50, 0x02,
+       0x14, 0x07, 0x01, 0x08, 0x17, 0x74, 0x14, 0x7f, 0x01, 0x08, 0x17, 0x74,
+       0x14, 0x12, 0x01, 0x08,
+       0x17, 0x74, 0xfe, 0x89, 0x49, 0x01, 0x08, 0x17, 0x74, 0x14, 0x00, 0x01,
+       0x08, 0x17, 0x74, 0xfe,
+       0x89, 0x4a, 0x01, 0x08, 0x17, 0x74, 0xfe, 0x09, 0x49, 0x01, 0x08, 0x17,
+       0x74, 0x5f, 0xcc, 0x01,
+       0x08, 0x02, 0x21, 0xe4, 0x09, 0x07, 0xfe, 0x4c, 0x13, 0xc8, 0x20, 0xe4,
+       0xfe, 0x49, 0xf4, 0x00,
+       0x4d, 0x5f, 0xa1, 0x5e, 0xfe, 0x01, 0xec, 0xfe, 0x27, 0x01, 0xcc, 0xff,
+       0x02, 0x00, 0x10, 0x2f,
+       0xfe, 0x3e, 0x1a, 0x01, 0x43, 0x09, 0xfe, 0xe3, 0x00, 0xfe, 0x22, 0x13,
+       0x16, 0xfe, 0x64, 0x1a,
+       0x26, 0x20, 0x9e, 0x01, 0x41, 0x21, 0x9e, 0x09, 0x07, 0x5d, 0x01, 0x0c,
+       0x61, 0x07, 0x44, 0x02,
+       0x0a, 0x5a, 0x01, 0x18, 0xfe, 0x00, 0x40, 0xaa, 0x09, 0x1a, 0xfe, 0x12,
+       0x13, 0x0a, 0x9d, 0x01,
+       0x18, 0xaa, 0x0a, 0x67, 0x01, 0xa3, 0x02, 0x0a, 0x9d, 0x01, 0x18, 0xaa,
+       0xfe, 0x80, 0xe7, 0x1a,
+       0x09, 0x1a, 0x5d, 0xfe, 0x45, 0x58, 0x01, 0xfe, 0xb2, 0x16, 0xaa, 0x02,
+       0x0a, 0x5a, 0x01, 0x18,
+       0xaa, 0x0a, 0x67, 0x01, 0xa3, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x01, 0xfe,
+       0x7e, 0x1e, 0xfe, 0x80,
+       0x4c, 0xfe, 0x49, 0xe4, 0x1a, 0xfe, 0x12, 0x13, 0x0a, 0x9d, 0x01, 0x18,
+       0xfe, 0x80, 0x4c, 0x0a,
+       0x67, 0x01, 0x5c, 0x02, 0x1c, 0x1a, 0x87, 0x7c, 0xe5, 0xfe, 0x18, 0xdf,
+       0xfe, 0x19, 0xde, 0xfe,
+       0x24, 0x1c, 0xfe, 0x1d, 0xf7, 0x28, 0xb1, 0xfe, 0x04, 0x1b, 0x01, 0xfe,
+       0x2a, 0x1c, 0xfa, 0xb3,
+       0x28, 0x7c, 0xfe, 0x2c, 0x01, 0xfe, 0x2f, 0x19, 0x02, 0xc9, 0x2b, 0xfe,
+       0xf4, 0x1a, 0xfe, 0xfa,
+       0x10, 0x1c, 0x1a, 0x87, 0x03, 0xfe, 0x64, 0x01, 0xfe, 0x00, 0xf4, 0x24,
+       0xfe, 0x18, 0x58, 0x03,
+       0xfe, 0x66, 0x01, 0xfe, 0x19, 0x58, 0xb3, 0x24, 0x01, 0xfe, 0x0e, 0x1f,
+       0xfe, 0x30, 0xf4, 0x07,
+       0xfe, 0x3c, 0x50, 0x7c, 0xfe, 0x38, 0x00, 0xfe, 0x0f, 0x79, 0xfe, 0x1c,
+       0xf7, 0x24, 0xb1, 0xfe,
+       0x50, 0x1b, 0xfe, 0xd4, 0x14, 0x31, 0x02, 0xc9, 0x2b, 0xfe, 0x26, 0x1b,
+       0xfe, 0xba, 0x10, 0x1c,
+       0x1a, 0x87, 0xfe, 0x83, 0x5a, 0xfe, 0x18, 0xdf, 0xfe, 0x19, 0xde, 0xfe,
+       0x1d, 0xf7, 0x54, 0xb1,
+       0xfe, 0x72, 0x1b, 0xfe, 0xb2, 0x14, 0xfc, 0xb3, 0x54, 0x7c, 0x12, 0xfe,
+       0xaf, 0x19, 0xfe, 0x98,
+       0xe7, 0x00, 0x02, 0xc9, 0x2b, 0xfe, 0x66, 0x1b, 0xfe, 0x8a, 0x10, 0x1c,
+       0x1a, 0x87, 0x8b, 0x0f,
+       0xfe, 0x30, 0x90, 0x04, 0xfe, 0xb0, 0x93, 0x3a, 0x0b, 0xfe, 0x18, 0x58,
+       0xfe, 0x32, 0x90, 0x04,
+       0xfe, 0xb2, 0x93, 0x3a, 0x0b, 0xfe, 0x19, 0x58, 0x0e, 0xa8, 0xb3, 0x4a,
+       0x7c, 0x12, 0xfe, 0x0f,
+       0x79, 0xfe, 0x1c, 0xf7, 0x4a, 0xb1, 0xfe, 0xc6, 0x1b, 0xfe, 0x5e, 0x14,
+       0x31, 0x02, 0xc9, 0x2b,
+       0xfe, 0x96, 0x1b, 0x5c, 0xfe, 0x02, 0xf6, 0x1a, 0x87, 0xfe, 0x18, 0xfe,
+       0x6a, 0xfe, 0x19, 0xfe,
+       0x6b, 0x01, 0xfe, 0x1e, 0x1f, 0xfe, 0x1d, 0xf7, 0x65, 0xb1, 0xfe, 0xee,
+       0x1b, 0xfe, 0x36, 0x14,
+       0xfe, 0x1c, 0x13, 0xb3, 0x65, 0x3e, 0xfe, 0x83, 0x58, 0xfe, 0xaf, 0x19,
+       0xfe, 0x80, 0xe7, 0x1a,
+       0xfe, 0x81, 0xe7, 0x1a, 0x15, 0xfe, 0xdd, 0x00, 0x7a, 0x30, 0x02, 0x7a,
+       0x30, 0xfe, 0x12, 0x45,
+       0x2b, 0xfe, 0xdc, 0x1b, 0x1f, 0x07, 0x47, 0xb5, 0xc3, 0x05, 0x35, 0xfe,
+       0x39, 0xf0, 0x75, 0x26,
+       0x02, 0xfe, 0x7e, 0x18, 0x23, 0x1d, 0x36, 0x13, 0x11, 0x02, 0x87, 0x03,
+       0xe3, 0x23, 0x07, 0xfe,
+       0xef, 0x12, 0xfe, 0xe1, 0x10, 0x90, 0x34, 0x60, 0xfe, 0x02, 0x80, 0x09,
+       0x56, 0xfe, 0x3c, 0x13,
+       0xfe, 0x82, 0x14, 0xfe, 0x42, 0x13, 0x51, 0xfe, 0x06, 0x83, 0x0a, 0x5a,
+       0x01, 0x18, 0xcb, 0xfe,
+       0x3e, 0x12, 0xfe, 0x41, 0x48, 0xfe, 0x45, 0x48, 0x01, 0xfe, 0xb2, 0x16,
+       0xfe, 0x00, 0xcc, 0xcb,
+       0xfe, 0xf3, 0x13, 0x3f, 0x89, 0x09, 0x1a, 0xa5, 0x0a, 0x9d, 0x01, 0x18,
+       0xfe, 0x80, 0x4c, 0x01,
+       0x85, 0xfe, 0x16, 0x10, 0x09, 0x9b, 0x4e, 0xfe, 0x40, 0x14, 0xfe, 0x24,
+       0x12, 0xfe, 0x14, 0x56,
+       0xfe, 0xd6, 0xf0, 0xfe, 0x52, 0x1c, 0x1c, 0x0d, 0x02, 0xfe, 0x9c, 0xe7,
+       0x0d, 0x19, 0xfe, 0x15,
+       0x00, 0x40, 0x8d, 0x30, 0x01, 0xf4, 0x1c, 0x07, 0x02, 0x51, 0xfe, 0x06,
+       0x83, 0xfe, 0x18, 0x80,
+       0x61, 0x28, 0x44, 0x15, 0x56, 0x01, 0x85, 0x1c, 0x07, 0x02, 0xfe, 0x38,
+       0x90, 0xfe, 0xba, 0x90,
+       0x91, 0xde, 0x7e, 0xdf, 0xfe, 0x48, 0x55, 0x31, 0xfe, 0xc9, 0x55, 0x02,
+       0x21, 0xb9, 0x88, 0x20,
+       0xb9, 0x02, 0x0a, 0xba, 0x01, 0x18, 0xfe, 0x41, 0x48, 0x0a, 0x57, 0x01,
+       0x18, 0xfe, 0x49, 0x44,
+       0x1b, 0xfe, 0x1e, 0x1d, 0x88, 0x89, 0x02, 0x0a, 0x5a, 0x01, 0x18, 0x09,
+       0x1a, 0xa4, 0x0a, 0x67,
+       0x01, 0xa3, 0x0a, 0x57, 0x01, 0x18, 0x88, 0x89, 0x02, 0xfe, 0x4e, 0xe4,
+       0x1d, 0x7b, 0xfe, 0x52,
+       0x1d, 0x03, 0xfe, 0x90, 0x00, 0xfe, 0x3a, 0x45, 0xfe, 0x2c, 0x10, 0xfe,
+       0x4e, 0xe4, 0xdd, 0x7b,
+       0xfe, 0x64, 0x1d, 0x03, 0xfe, 0x92, 0x00, 0xd1, 0x12, 0xfe, 0x1a, 0x10,
+       0xfe, 0x4e, 0xe4, 0xfe,
+       0x0b, 0x00, 0x7b, 0xfe, 0x76, 0x1d, 0x03, 0xfe, 0x94, 0x00, 0xd1, 0x24,
+       0xfe, 0x08, 0x10, 0x03,
+       0xfe, 0x96, 0x00, 0xd1, 0x63, 0xfe, 0x4e, 0x45, 0x83, 0xca, 0xff, 0x04,
+       0x68, 0x54, 0xfe, 0xf1,
+       0x10, 0x23, 0x49, 0xfe, 0x08, 0x1c, 0xfe, 0x67, 0x19, 0xfe, 0x0a, 0x1c,
+       0xfe, 0x1a, 0xf4, 0xfe,
+       0x00, 0x04, 0x83, 0xb2, 0x1d, 0x48, 0xfe, 0xaa, 0x1d, 0x13, 0x1d, 0x02,
+       0x09, 0x92, 0xfe, 0x5a,
+       0xf0, 0xfe, 0xba, 0x1d, 0x2e, 0x93, 0xfe, 0x34, 0x10, 0x09, 0x12, 0xfe,
+       0x5a, 0xf0, 0xfe, 0xc8,
+       0x1d, 0x2e, 0xb4, 0xfe, 0x26, 0x10, 0x09, 0x1d, 0x36, 0x2e, 0x63, 0xfe,
+       0x1a, 0x10, 0x09, 0x0d,
+       0x36, 0x2e, 0x94, 0xf2, 0x09, 0x07, 0x36, 0x2e, 0x95, 0xa1, 0xc8, 0x02,
+       0x1f, 0x93, 0x01, 0x42,
+       0xfe, 0x04, 0xfe, 0x99, 0x03, 0x9c, 0x8b, 0x02, 0x2a, 0xfe, 0x1c, 0x1e,
+       0xfe, 0x14, 0xf0, 0x08,
+       0x2f, 0xfe, 0x0c, 0x1e, 0x2a, 0xfe, 0x1c, 0x1e, 0x8f, 0xfe, 0x1c, 0x1e,
+       0xfe, 0x82, 0xf0, 0xfe,
+       0x10, 0x1e, 0x02, 0x0f, 0x3f, 0x04, 0xfe, 0x80, 0x83, 0x33, 0x0b, 0x0e,
+       0x02, 0x0f, 0xfe, 0x18,
+       0x80, 0x04, 0xfe, 0x98, 0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x02,
+       0x80, 0x04, 0xfe, 0x82,
+       0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06, 0x80, 0x04, 0xfe, 0x86,
+       0x83, 0x33, 0x0b, 0x0e,
+       0x02, 0x0f, 0xfe, 0x1b, 0x80, 0x04, 0xfe, 0x9b, 0x83, 0x33, 0x0b, 0x0e,
+       0x02, 0x0f, 0xfe, 0x04,
+       0x80, 0x04, 0xfe, 0x84, 0x83, 0x33, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x80,
+       0x80, 0x04, 0xfe, 0x80,
+       0x83, 0xfe, 0xc9, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x19, 0x81, 0x04,
+       0xfe, 0x99, 0x83, 0xfe,
+       0xca, 0x47, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x06, 0x83, 0x04, 0xfe, 0x86,
+       0x83, 0xfe, 0xce, 0x47,
+       0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x2c, 0x90, 0x04, 0xfe, 0xac, 0x93, 0x3a,
+       0x0b, 0x0e, 0x02, 0x0f,
+       0xfe, 0xae, 0x90, 0x04, 0xfe, 0xae, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
+       0xfe, 0x08, 0x90, 0x04,
+       0xfe, 0x88, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x8a, 0x90, 0x04,
+       0xfe, 0x8a, 0x93, 0x79,
+       0x0b, 0x0e, 0x02, 0x0f, 0xfe, 0x0c, 0x90, 0x04, 0xfe, 0x8c, 0x93, 0x3a,
+       0x0b, 0x0e, 0x02, 0x0f,
+       0xfe, 0x8e, 0x90, 0x04, 0xfe, 0x8e, 0x93, 0x79, 0x0b, 0x0e, 0x02, 0x0f,
+       0xfe, 0x3c, 0x90, 0x04,
+       0xfe, 0xbc, 0x93, 0x3a, 0x0b, 0x0e, 0x02, 0x8b, 0x0f, 0xfe, 0x03, 0x80,
+       0x04, 0xfe, 0x83, 0x83,
+       0x33, 0x0b, 0x77, 0x0e, 0xa8, 0x02, 0xff, 0x66, 0x00, 0x00,
 };
 
-STATIC unsigned short _adv_asc38C1600_size =
-        sizeof(_adv_asc38C1600_buf); /* 0x1673 */
-STATIC ADV_DCNT _adv_asc38C1600_chksum =
-        0x0604EF77UL; /* Expanded little-endian checksum. */
+static unsigned short _adv_asc38C1600_size = sizeof(_adv_asc38C1600_buf);      /* 0x1673 */
+static ADV_DCNT _adv_asc38C1600_chksum = 0x0604EF77UL; /* Expanded little-endian checksum. */
 
 /* a_init.c */
 /*
@@ -14049,340 +13847,340 @@ STATIC ADV_DCNT _adv_asc38C1600_chksum =
  * on big-endian platforms so char fields read as words are actually being
  * unswapped on big-endian platforms.
  */
-STATIC ADVEEP_3550_CONFIG
-Default_3550_EEPROM_Config __initdata = {
-    ADV_EEPROM_BIOS_ENABLE,     /* cfg_lsw */
-    0x0000,                     /* cfg_msw */
-    0xFFFF,                     /* disc_enable */
-    0xFFFF,                     /* wdtr_able */
-    0xFFFF,                     /* sdtr_able */
-    0xFFFF,                     /* start_motor */
-    0xFFFF,                     /* tagqng_able */
-    0xFFFF,                     /* bios_scan */
-    0,                          /* scam_tolerant */
-    7,                          /* adapter_scsi_id */
-    0,                          /* bios_boot_delay */
-    3,                          /* scsi_reset_delay */
-    0,                          /* bios_id_lun */
-    0,                          /* termination */
-    0,                          /* reserved1 */
-    0xFFE7,                     /* bios_ctrl */
-    0xFFFF,                     /* ultra_able */
-    0,                          /* reserved2 */
-    ASC_DEF_MAX_HOST_QNG,       /* max_host_qng */
-    ASC_DEF_MAX_DVC_QNG,        /* max_dvc_qng */
-    0,                          /* dvc_cntl */
-    0,                          /* bug_fix */
-    0,                          /* serial_number_word1 */
-    0,                          /* serial_number_word2 */
-    0,                          /* serial_number_word3 */
-    0,                          /* check_sum */
-    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* oem_name[16] */
-    0,                          /* dvc_err_code */
-    0,                          /* adv_err_code */
-    0,                          /* adv_err_addr */
-    0,                          /* saved_dvc_err_code */
-    0,                          /* saved_adv_err_code */
-    0,                          /* saved_adv_err_addr */
-    0                           /* num_of_err */
+static ADVEEP_3550_CONFIG Default_3550_EEPROM_Config __initdata = {
+       ADV_EEPROM_BIOS_ENABLE, /* cfg_lsw */
+       0x0000,                 /* cfg_msw */
+       0xFFFF,                 /* disc_enable */
+       0xFFFF,                 /* wdtr_able */
+       0xFFFF,                 /* sdtr_able */
+       0xFFFF,                 /* start_motor */
+       0xFFFF,                 /* tagqng_able */
+       0xFFFF,                 /* bios_scan */
+       0,                      /* scam_tolerant */
+       7,                      /* adapter_scsi_id */
+       0,                      /* bios_boot_delay */
+       3,                      /* scsi_reset_delay */
+       0,                      /* bios_id_lun */
+       0,                      /* termination */
+       0,                      /* reserved1 */
+       0xFFE7,                 /* bios_ctrl */
+       0xFFFF,                 /* ultra_able */
+       0,                      /* reserved2 */
+       ASC_DEF_MAX_HOST_QNG,   /* max_host_qng */
+       ASC_DEF_MAX_DVC_QNG,    /* max_dvc_qng */
+       0,                      /* dvc_cntl */
+       0,                      /* bug_fix */
+       0,                      /* serial_number_word1 */
+       0,                      /* serial_number_word2 */
+       0,                      /* serial_number_word3 */
+       0,                      /* check_sum */
+       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+       ,                       /* oem_name[16] */
+       0,                      /* dvc_err_code */
+       0,                      /* adv_err_code */
+       0,                      /* adv_err_addr */
+       0,                      /* saved_dvc_err_code */
+       0,                      /* saved_adv_err_code */
+       0,                      /* saved_adv_err_addr */
+       0                       /* num_of_err */
 };
 
-STATIC ADVEEP_3550_CONFIG
-ADVEEP_3550_Config_Field_IsChar __initdata = {
-    0,                          /* cfg_lsw */
-    0,                          /* cfg_msw */
-    0,                          /* -disc_enable */
-    0,                          /* wdtr_able */
-    0,                          /* sdtr_able */
-    0,                          /* start_motor */
-    0,                          /* tagqng_able */
-    0,                          /* bios_scan */
-    0,                          /* scam_tolerant */
-    1,                          /* adapter_scsi_id */
-    1,                          /* bios_boot_delay */
-    1,                          /* scsi_reset_delay */
-    1,                          /* bios_id_lun */
-    1,                          /* termination */
-    1,                          /* reserved1 */
-    0,                          /* bios_ctrl */
-    0,                          /* ultra_able */
-    0,                          /* reserved2 */
-    1,                          /* max_host_qng */
-    1,                          /* max_dvc_qng */
-    0,                          /* dvc_cntl */
-    0,                          /* bug_fix */
-    0,                          /* serial_number_word1 */
-    0,                          /* serial_number_word2 */
-    0,                          /* serial_number_word3 */
-    0,                          /* check_sum */
-    { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, /* oem_name[16] */
-    0,                          /* dvc_err_code */
-    0,                          /* adv_err_code */
-    0,                          /* adv_err_addr */
-    0,                          /* saved_dvc_err_code */
-    0,                          /* saved_adv_err_code */
-    0,                          /* saved_adv_err_addr */
-    0                           /* num_of_err */
+static ADVEEP_3550_CONFIG ADVEEP_3550_Config_Field_IsChar __initdata = {
+       0,                      /* cfg_lsw */
+       0,                      /* cfg_msw */
+       0,                      /* -disc_enable */
+       0,                      /* wdtr_able */
+       0,                      /* sdtr_able */
+       0,                      /* start_motor */
+       0,                      /* tagqng_able */
+       0,                      /* bios_scan */
+       0,                      /* scam_tolerant */
+       1,                      /* adapter_scsi_id */
+       1,                      /* bios_boot_delay */
+       1,                      /* scsi_reset_delay */
+       1,                      /* bios_id_lun */
+       1,                      /* termination */
+       1,                      /* reserved1 */
+       0,                      /* bios_ctrl */
+       0,                      /* ultra_able */
+       0,                      /* reserved2 */
+       1,                      /* max_host_qng */
+       1,                      /* max_dvc_qng */
+       0,                      /* dvc_cntl */
+       0,                      /* bug_fix */
+       0,                      /* serial_number_word1 */
+       0,                      /* serial_number_word2 */
+       0,                      /* serial_number_word3 */
+       0,                      /* check_sum */
+       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+       ,                       /* oem_name[16] */
+       0,                      /* dvc_err_code */
+       0,                      /* adv_err_code */
+       0,                      /* adv_err_addr */
+       0,                      /* saved_dvc_err_code */
+       0,                      /* saved_adv_err_code */
+       0,                      /* saved_adv_err_addr */
+       0                       /* num_of_err */
 };
 
-STATIC ADVEEP_38C0800_CONFIG
-Default_38C0800_EEPROM_Config __initdata = {
-    ADV_EEPROM_BIOS_ENABLE,     /* 00 cfg_lsw */
-    0x0000,                     /* 01 cfg_msw */
-    0xFFFF,                     /* 02 disc_enable */
-    0xFFFF,                     /* 03 wdtr_able */
-    0x4444,                     /* 04 sdtr_speed1 */
-    0xFFFF,                     /* 05 start_motor */
-    0xFFFF,                     /* 06 tagqng_able */
-    0xFFFF,                     /* 07 bios_scan */
-    0,                          /* 08 scam_tolerant */
-    7,                          /* 09 adapter_scsi_id */
-    0,                          /*    bios_boot_delay */
-    3,                          /* 10 scsi_reset_delay */
-    0,                          /*    bios_id_lun */
-    0,                          /* 11 termination_se */
-    0,                          /*    termination_lvd */
-    0xFFE7,                     /* 12 bios_ctrl */
-    0x4444,                     /* 13 sdtr_speed2 */
-    0x4444,                     /* 14 sdtr_speed3 */
-    ASC_DEF_MAX_HOST_QNG,       /* 15 max_host_qng */
-    ASC_DEF_MAX_DVC_QNG,        /*    max_dvc_qng */
-    0,                          /* 16 dvc_cntl */
-    0x4444,                     /* 17 sdtr_speed4 */
-    0,                          /* 18 serial_number_word1 */
-    0,                          /* 19 serial_number_word2 */
-    0,                          /* 20 serial_number_word3 */
-    0,                          /* 21 check_sum */
-    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* 22-29 oem_name[16] */
-    0,                          /* 30 dvc_err_code */
-    0,                          /* 31 adv_err_code */
-    0,                          /* 32 adv_err_addr */
-    0,                          /* 33 saved_dvc_err_code */
-    0,                          /* 34 saved_adv_err_code */
-    0,                          /* 35 saved_adv_err_addr */
-    0,                          /* 36 reserved */
-    0,                          /* 37 reserved */
-    0,                          /* 38 reserved */
-    0,                          /* 39 reserved */
-    0,                          /* 40 reserved */
-    0,                          /* 41 reserved */
-    0,                          /* 42 reserved */
-    0,                          /* 43 reserved */
-    0,                          /* 44 reserved */
-    0,                          /* 45 reserved */
-    0,                          /* 46 reserved */
-    0,                          /* 47 reserved */
-    0,                          /* 48 reserved */
-    0,                          /* 49 reserved */
-    0,                          /* 50 reserved */
-    0,                          /* 51 reserved */
-    0,                          /* 52 reserved */
-    0,                          /* 53 reserved */
-    0,                          /* 54 reserved */
-    0,                          /* 55 reserved */
-    0,                          /* 56 cisptr_lsw */
-    0,                          /* 57 cisprt_msw */
-    PCI_VENDOR_ID_ASP,          /* 58 subsysvid */
-    PCI_DEVICE_ID_38C0800_REV1, /* 59 subsysid */
-    0,                          /* 60 reserved */
-    0,                          /* 61 reserved */
-    0,                          /* 62 reserved */
-    0                           /* 63 reserved */
+static ADVEEP_38C0800_CONFIG Default_38C0800_EEPROM_Config __initdata = {
+       ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
+       0x0000,                 /* 01 cfg_msw */
+       0xFFFF,                 /* 02 disc_enable */
+       0xFFFF,                 /* 03 wdtr_able */
+       0x4444,                 /* 04 sdtr_speed1 */
+       0xFFFF,                 /* 05 start_motor */
+       0xFFFF,                 /* 06 tagqng_able */
+       0xFFFF,                 /* 07 bios_scan */
+       0,                      /* 08 scam_tolerant */
+       7,                      /* 09 adapter_scsi_id */
+       0,                      /*    bios_boot_delay */
+       3,                      /* 10 scsi_reset_delay */
+       0,                      /*    bios_id_lun */
+       0,                      /* 11 termination_se */
+       0,                      /*    termination_lvd */
+       0xFFE7,                 /* 12 bios_ctrl */
+       0x4444,                 /* 13 sdtr_speed2 */
+       0x4444,                 /* 14 sdtr_speed3 */
+       ASC_DEF_MAX_HOST_QNG,   /* 15 max_host_qng */
+       ASC_DEF_MAX_DVC_QNG,    /*    max_dvc_qng */
+       0,                      /* 16 dvc_cntl */
+       0x4444,                 /* 17 sdtr_speed4 */
+       0,                      /* 18 serial_number_word1 */
+       0,                      /* 19 serial_number_word2 */
+       0,                      /* 20 serial_number_word3 */
+       0,                      /* 21 check_sum */
+       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+       ,                       /* 22-29 oem_name[16] */
+       0,                      /* 30 dvc_err_code */
+       0,                      /* 31 adv_err_code */
+       0,                      /* 32 adv_err_addr */
+       0,                      /* 33 saved_dvc_err_code */
+       0,                      /* 34 saved_adv_err_code */
+       0,                      /* 35 saved_adv_err_addr */
+       0,                      /* 36 reserved */
+       0,                      /* 37 reserved */
+       0,                      /* 38 reserved */
+       0,                      /* 39 reserved */
+       0,                      /* 40 reserved */
+       0,                      /* 41 reserved */
+       0,                      /* 42 reserved */
+       0,                      /* 43 reserved */
+       0,                      /* 44 reserved */
+       0,                      /* 45 reserved */
+       0,                      /* 46 reserved */
+       0,                      /* 47 reserved */
+       0,                      /* 48 reserved */
+       0,                      /* 49 reserved */
+       0,                      /* 50 reserved */
+       0,                      /* 51 reserved */
+       0,                      /* 52 reserved */
+       0,                      /* 53 reserved */
+       0,                      /* 54 reserved */
+       0,                      /* 55 reserved */
+       0,                      /* 56 cisptr_lsw */
+       0,                      /* 57 cisprt_msw */
+       PCI_VENDOR_ID_ASP,      /* 58 subsysvid */
+       PCI_DEVICE_ID_38C0800_REV1,     /* 59 subsysid */
+       0,                      /* 60 reserved */
+       0,                      /* 61 reserved */
+       0,                      /* 62 reserved */
+       0                       /* 63 reserved */
 };
 
-STATIC ADVEEP_38C0800_CONFIG
-ADVEEP_38C0800_Config_Field_IsChar __initdata = {
-    0,                          /* 00 cfg_lsw */
-    0,                          /* 01 cfg_msw */
-    0,                          /* 02 disc_enable */
-    0,                          /* 03 wdtr_able */
-    0,                          /* 04 sdtr_speed1 */
-    0,                          /* 05 start_motor */
-    0,                          /* 06 tagqng_able */
-    0,                          /* 07 bios_scan */
-    0,                          /* 08 scam_tolerant */
-    1,                          /* 09 adapter_scsi_id */
-    1,                          /*    bios_boot_delay */
-    1,                          /* 10 scsi_reset_delay */
-    1,                          /*    bios_id_lun */
-    1,                          /* 11 termination_se */
-    1,                          /*    termination_lvd */
-    0,                          /* 12 bios_ctrl */
-    0,                          /* 13 sdtr_speed2 */
-    0,                          /* 14 sdtr_speed3 */
-    1,                          /* 15 max_host_qng */
-    1,                          /*    max_dvc_qng */
-    0,                          /* 16 dvc_cntl */
-    0,                          /* 17 sdtr_speed4 */
-    0,                          /* 18 serial_number_word1 */
-    0,                          /* 19 serial_number_word2 */
-    0,                          /* 20 serial_number_word3 */
-    0,                          /* 21 check_sum */
-    { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, /* 22-29 oem_name[16] */
-    0,                          /* 30 dvc_err_code */
-    0,                          /* 31 adv_err_code */
-    0,                          /* 32 adv_err_addr */
-    0,                          /* 33 saved_dvc_err_code */
-    0,                          /* 34 saved_adv_err_code */
-    0,                          /* 35 saved_adv_err_addr */
-    0,                          /* 36 reserved */
-    0,                          /* 37 reserved */
-    0,                          /* 38 reserved */
-    0,                          /* 39 reserved */
-    0,                          /* 40 reserved */
-    0,                          /* 41 reserved */
-    0,                          /* 42 reserved */
-    0,                          /* 43 reserved */
-    0,                          /* 44 reserved */
-    0,                          /* 45 reserved */
-    0,                          /* 46 reserved */
-    0,                          /* 47 reserved */
-    0,                          /* 48 reserved */
-    0,                          /* 49 reserved */
-    0,                          /* 50 reserved */
-    0,                          /* 51 reserved */
-    0,                          /* 52 reserved */
-    0,                          /* 53 reserved */
-    0,                          /* 54 reserved */
-    0,                          /* 55 reserved */
-    0,                          /* 56 cisptr_lsw */
-    0,                          /* 57 cisprt_msw */
-    0,                          /* 58 subsysvid */
-    0,                          /* 59 subsysid */
-    0,                          /* 60 reserved */
-    0,                          /* 61 reserved */
-    0,                          /* 62 reserved */
-    0                           /* 63 reserved */
+static ADVEEP_38C0800_CONFIG ADVEEP_38C0800_Config_Field_IsChar __initdata = {
+       0,                      /* 00 cfg_lsw */
+       0,                      /* 01 cfg_msw */
+       0,                      /* 02 disc_enable */
+       0,                      /* 03 wdtr_able */
+       0,                      /* 04 sdtr_speed1 */
+       0,                      /* 05 start_motor */
+       0,                      /* 06 tagqng_able */
+       0,                      /* 07 bios_scan */
+       0,                      /* 08 scam_tolerant */
+       1,                      /* 09 adapter_scsi_id */
+       1,                      /*    bios_boot_delay */
+       1,                      /* 10 scsi_reset_delay */
+       1,                      /*    bios_id_lun */
+       1,                      /* 11 termination_se */
+       1,                      /*    termination_lvd */
+       0,                      /* 12 bios_ctrl */
+       0,                      /* 13 sdtr_speed2 */
+       0,                      /* 14 sdtr_speed3 */
+       1,                      /* 15 max_host_qng */
+       1,                      /*    max_dvc_qng */
+       0,                      /* 16 dvc_cntl */
+       0,                      /* 17 sdtr_speed4 */
+       0,                      /* 18 serial_number_word1 */
+       0,                      /* 19 serial_number_word2 */
+       0,                      /* 20 serial_number_word3 */
+       0,                      /* 21 check_sum */
+       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+       ,                       /* 22-29 oem_name[16] */
+       0,                      /* 30 dvc_err_code */
+       0,                      /* 31 adv_err_code */
+       0,                      /* 32 adv_err_addr */
+       0,                      /* 33 saved_dvc_err_code */
+       0,                      /* 34 saved_adv_err_code */
+       0,                      /* 35 saved_adv_err_addr */
+       0,                      /* 36 reserved */
+       0,                      /* 37 reserved */
+       0,                      /* 38 reserved */
+       0,                      /* 39 reserved */
+       0,                      /* 40 reserved */
+       0,                      /* 41 reserved */
+       0,                      /* 42 reserved */
+       0,                      /* 43 reserved */
+       0,                      /* 44 reserved */
+       0,                      /* 45 reserved */
+       0,                      /* 46 reserved */
+       0,                      /* 47 reserved */
+       0,                      /* 48 reserved */
+       0,                      /* 49 reserved */
+       0,                      /* 50 reserved */
+       0,                      /* 51 reserved */
+       0,                      /* 52 reserved */
+       0,                      /* 53 reserved */
+       0,                      /* 54 reserved */
+       0,                      /* 55 reserved */
+       0,                      /* 56 cisptr_lsw */
+       0,                      /* 57 cisprt_msw */
+       0,                      /* 58 subsysvid */
+       0,                      /* 59 subsysid */
+       0,                      /* 60 reserved */
+       0,                      /* 61 reserved */
+       0,                      /* 62 reserved */
+       0                       /* 63 reserved */
 };
 
-STATIC ADVEEP_38C1600_CONFIG
-Default_38C1600_EEPROM_Config __initdata = {
-    ADV_EEPROM_BIOS_ENABLE,     /* 00 cfg_lsw */
-    0x0000,                     /* 01 cfg_msw */
-    0xFFFF,                     /* 02 disc_enable */
-    0xFFFF,                     /* 03 wdtr_able */
-    0x5555,                     /* 04 sdtr_speed1 */
-    0xFFFF,                     /* 05 start_motor */
-    0xFFFF,                     /* 06 tagqng_able */
-    0xFFFF,                     /* 07 bios_scan */
-    0,                          /* 08 scam_tolerant */
-    7,                          /* 09 adapter_scsi_id */
-    0,                          /*    bios_boot_delay */
-    3,                          /* 10 scsi_reset_delay */
-    0,                          /*    bios_id_lun */
-    0,                          /* 11 termination_se */
-    0,                          /*    termination_lvd */
-    0xFFE7,                     /* 12 bios_ctrl */
-    0x5555,                     /* 13 sdtr_speed2 */
-    0x5555,                     /* 14 sdtr_speed3 */
-    ASC_DEF_MAX_HOST_QNG,       /* 15 max_host_qng */
-    ASC_DEF_MAX_DVC_QNG,        /*    max_dvc_qng */
-    0,                          /* 16 dvc_cntl */
-    0x5555,                     /* 17 sdtr_speed4 */
-    0,                          /* 18 serial_number_word1 */
-    0,                          /* 19 serial_number_word2 */
-    0,                          /* 20 serial_number_word3 */
-    0,                          /* 21 check_sum */
-    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, /* 22-29 oem_name[16] */
-    0,                          /* 30 dvc_err_code */
-    0,                          /* 31 adv_err_code */
-    0,                          /* 32 adv_err_addr */
-    0,                          /* 33 saved_dvc_err_code */
-    0,                          /* 34 saved_adv_err_code */
-    0,                          /* 35 saved_adv_err_addr */
-    0,                          /* 36 reserved */
-    0,                          /* 37 reserved */
-    0,                          /* 38 reserved */
-    0,                          /* 39 reserved */
-    0,                          /* 40 reserved */
-    0,                          /* 41 reserved */
-    0,                          /* 42 reserved */
-    0,                          /* 43 reserved */
-    0,                          /* 44 reserved */
-    0,                          /* 45 reserved */
-    0,                          /* 46 reserved */
-    0,                          /* 47 reserved */
-    0,                          /* 48 reserved */
-    0,                          /* 49 reserved */
-    0,                          /* 50 reserved */
-    0,                          /* 51 reserved */
-    0,                          /* 52 reserved */
-    0,                          /* 53 reserved */
-    0,                          /* 54 reserved */
-    0,                          /* 55 reserved */
-    0,                          /* 56 cisptr_lsw */
-    0,                          /* 57 cisprt_msw */
-    PCI_VENDOR_ID_ASP,          /* 58 subsysvid */
-    PCI_DEVICE_ID_38C1600_REV1, /* 59 subsysid */
-    0,                          /* 60 reserved */
-    0,                          /* 61 reserved */
-    0,                          /* 62 reserved */
-    0                           /* 63 reserved */
+static ADVEEP_38C1600_CONFIG Default_38C1600_EEPROM_Config __initdata = {
+       ADV_EEPROM_BIOS_ENABLE, /* 00 cfg_lsw */
+       0x0000,                 /* 01 cfg_msw */
+       0xFFFF,                 /* 02 disc_enable */
+       0xFFFF,                 /* 03 wdtr_able */
+       0x5555,                 /* 04 sdtr_speed1 */
+       0xFFFF,                 /* 05 start_motor */
+       0xFFFF,                 /* 06 tagqng_able */
+       0xFFFF,                 /* 07 bios_scan */
+       0,                      /* 08 scam_tolerant */
+       7,                      /* 09 adapter_scsi_id */
+       0,                      /*    bios_boot_delay */
+       3,                      /* 10 scsi_reset_delay */
+       0,                      /*    bios_id_lun */
+       0,                      /* 11 termination_se */
+       0,                      /*    termination_lvd */
+       0xFFE7,                 /* 12 bios_ctrl */
+       0x5555,                 /* 13 sdtr_speed2 */
+       0x5555,                 /* 14 sdtr_speed3 */
+       ASC_DEF_MAX_HOST_QNG,   /* 15 max_host_qng */
+       ASC_DEF_MAX_DVC_QNG,    /*    max_dvc_qng */
+       0,                      /* 16 dvc_cntl */
+       0x5555,                 /* 17 sdtr_speed4 */
+       0,                      /* 18 serial_number_word1 */
+       0,                      /* 19 serial_number_word2 */
+       0,                      /* 20 serial_number_word3 */
+       0,                      /* 21 check_sum */
+       {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+       ,                       /* 22-29 oem_name[16] */
+       0,                      /* 30 dvc_err_code */
+       0,                      /* 31 adv_err_code */
+       0,                      /* 32 adv_err_addr */
+       0,                      /* 33 saved_dvc_err_code */
+       0,                      /* 34 saved_adv_err_code */
+       0,                      /* 35 saved_adv_err_addr */
+       0,                      /* 36 reserved */
+       0,                      /* 37 reserved */
+       0,                      /* 38 reserved */
+       0,                      /* 39 reserved */
+       0,                      /* 40 reserved */
+       0,                      /* 41 reserved */
+       0,                      /* 42 reserved */
+       0,                      /* 43 reserved */
+       0,                      /* 44 reserved */
+       0,                      /* 45 reserved */
+       0,                      /* 46 reserved */
+       0,                      /* 47 reserved */
+       0,                      /* 48 reserved */
+       0,                      /* 49 reserved */
+       0,                      /* 50 reserved */
+       0,                      /* 51 reserved */
+       0,                      /* 52 reserved */
+       0,                      /* 53 reserved */
+       0,                      /* 54 reserved */
+       0,                      /* 55 reserved */
+       0,                      /* 56 cisptr_lsw */
+       0,                      /* 57 cisprt_msw */
+       PCI_VENDOR_ID_ASP,      /* 58 subsysvid */
+       PCI_DEVICE_ID_38C1600_REV1,     /* 59 subsysid */
+       0,                      /* 60 reserved */
+       0,                      /* 61 reserved */
+       0,                      /* 62 reserved */
+       0                       /* 63 reserved */
 };
 
-STATIC ADVEEP_38C1600_CONFIG
-ADVEEP_38C1600_Config_Field_IsChar __initdata = {
-    0,                          /* 00 cfg_lsw */
-    0,                          /* 01 cfg_msw */
-    0,                          /* 02 disc_enable */
-    0,                          /* 03 wdtr_able */
-    0,                          /* 04 sdtr_speed1 */
-    0,                          /* 05 start_motor */
-    0,                          /* 06 tagqng_able */
-    0,                          /* 07 bios_scan */
-    0,                          /* 08 scam_tolerant */
-    1,                          /* 09 adapter_scsi_id */
-    1,                          /*    bios_boot_delay */
-    1,                          /* 10 scsi_reset_delay */
-    1,                          /*    bios_id_lun */
-    1,                          /* 11 termination_se */
-    1,                          /*    termination_lvd */
-    0,                          /* 12 bios_ctrl */
-    0,                          /* 13 sdtr_speed2 */
-    0,                          /* 14 sdtr_speed3 */
-    1,                          /* 15 max_host_qng */
-    1,                          /*    max_dvc_qng */
-    0,                          /* 16 dvc_cntl */
-    0,                          /* 17 sdtr_speed4 */
-    0,                          /* 18 serial_number_word1 */
-    0,                          /* 19 serial_number_word2 */
-    0,                          /* 20 serial_number_word3 */
-    0,                          /* 21 check_sum */
-    { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }, /* 22-29 oem_name[16] */
-    0,                          /* 30 dvc_err_code */
-    0,                          /* 31 adv_err_code */
-    0,                          /* 32 adv_err_addr */
-    0,                          /* 33 saved_dvc_err_code */
-    0,                          /* 34 saved_adv_err_code */
-    0,                          /* 35 saved_adv_err_addr */
-    0,                          /* 36 reserved */
-    0,                          /* 37 reserved */
-    0,                          /* 38 reserved */
-    0,                          /* 39 reserved */
-    0,                          /* 40 reserved */
-    0,                          /* 41 reserved */
-    0,                          /* 42 reserved */
-    0,                          /* 43 reserved */
-    0,                          /* 44 reserved */
-    0,                          /* 45 reserved */
-    0,                          /* 46 reserved */
-    0,                          /* 47 reserved */
-    0,                          /* 48 reserved */
-    0,                          /* 49 reserved */
-    0,                          /* 50 reserved */
-    0,                          /* 51 reserved */
-    0,                          /* 52 reserved */
-    0,                          /* 53 reserved */
-    0,                          /* 54 reserved */
-    0,                          /* 55 reserved */
-    0,                          /* 56 cisptr_lsw */
-    0,                          /* 57 cisprt_msw */
-    0,                          /* 58 subsysvid */
-    0,                          /* 59 subsysid */
-    0,                          /* 60 reserved */
-    0,                          /* 61 reserved */
-    0,                          /* 62 reserved */
-    0                           /* 63 reserved */
+static ADVEEP_38C1600_CONFIG ADVEEP_38C1600_Config_Field_IsChar __initdata = {
+       0,                      /* 00 cfg_lsw */
+       0,                      /* 01 cfg_msw */
+       0,                      /* 02 disc_enable */
+       0,                      /* 03 wdtr_able */
+       0,                      /* 04 sdtr_speed1 */
+       0,                      /* 05 start_motor */
+       0,                      /* 06 tagqng_able */
+       0,                      /* 07 bios_scan */
+       0,                      /* 08 scam_tolerant */
+       1,                      /* 09 adapter_scsi_id */
+       1,                      /*    bios_boot_delay */
+       1,                      /* 10 scsi_reset_delay */
+       1,                      /*    bios_id_lun */
+       1,                      /* 11 termination_se */
+       1,                      /*    termination_lvd */
+       0,                      /* 12 bios_ctrl */
+       0,                      /* 13 sdtr_speed2 */
+       0,                      /* 14 sdtr_speed3 */
+       1,                      /* 15 max_host_qng */
+       1,                      /*    max_dvc_qng */
+       0,                      /* 16 dvc_cntl */
+       0,                      /* 17 sdtr_speed4 */
+       0,                      /* 18 serial_number_word1 */
+       0,                      /* 19 serial_number_word2 */
+       0,                      /* 20 serial_number_word3 */
+       0,                      /* 21 check_sum */
+       {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+       ,                       /* 22-29 oem_name[16] */
+       0,                      /* 30 dvc_err_code */
+       0,                      /* 31 adv_err_code */
+       0,                      /* 32 adv_err_addr */
+       0,                      /* 33 saved_dvc_err_code */
+       0,                      /* 34 saved_adv_err_code */
+       0,                      /* 35 saved_adv_err_addr */
+       0,                      /* 36 reserved */
+       0,                      /* 37 reserved */
+       0,                      /* 38 reserved */
+       0,                      /* 39 reserved */
+       0,                      /* 40 reserved */
+       0,                      /* 41 reserved */
+       0,                      /* 42 reserved */
+       0,                      /* 43 reserved */
+       0,                      /* 44 reserved */
+       0,                      /* 45 reserved */
+       0,                      /* 46 reserved */
+       0,                      /* 47 reserved */
+       0,                      /* 48 reserved */
+       0,                      /* 49 reserved */
+       0,                      /* 50 reserved */
+       0,                      /* 51 reserved */
+       0,                      /* 52 reserved */
+       0,                      /* 53 reserved */
+       0,                      /* 54 reserved */
+       0,                      /* 55 reserved */
+       0,                      /* 56 cisptr_lsw */
+       0,                      /* 57 cisprt_msw */
+       0,                      /* 58 subsysvid */
+       0,                      /* 59 subsysid */
+       0,                      /* 60 reserved */
+       0,                      /* 61 reserved */
+       0,                      /* 62 reserved */
+       0                       /* 63 reserved */
 };
 
 /*
@@ -14393,136 +14191,128 @@ ADVEEP_38C1600_Config_Field_IsChar __initdata = {
  * For a non-fatal error return a warning code. If there are no warnings
  * then 0 is returned.
  */
-STATIC int __init
-AdvInitGetConfig(ADV_DVC_VAR *asc_dvc)
+static int __init AdvInitGetConfig(ADV_DVC_VAR *asc_dvc)
 {
-    ushort      warn_code;
-    AdvPortAddr iop_base;
-    uchar       pci_cmd_reg;
-    int         status;
-
-    warn_code = 0;
-    asc_dvc->err_code = 0;
-    iop_base = asc_dvc->iop_base;
-
-    /*
-     * PCI Command Register
-     *
-     * Note: AscPCICmdRegBits_BusMastering definition (0x0007) includes
-     * I/O Space Control, Memory Space Control and Bus Master Control bits.
-     */
-
-    if (((pci_cmd_reg = DvcAdvReadPCIConfigByte(asc_dvc,
-                            AscPCIConfigCommandRegister))
-         & AscPCICmdRegBits_BusMastering)
-        != AscPCICmdRegBits_BusMastering)
-    {
-        pci_cmd_reg |= AscPCICmdRegBits_BusMastering;
-
-        DvcAdvWritePCIConfigByte(asc_dvc,
-                AscPCIConfigCommandRegister, pci_cmd_reg);
-
-        if (((DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigCommandRegister))
-             & AscPCICmdRegBits_BusMastering)
-            != AscPCICmdRegBits_BusMastering)
-        {
-            warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
-        }
-    }
-
-    /*
-     * PCI Latency Timer
-     *
-     * If the "latency timer" register is 0x20 or above, then we don't need
-     * to change it.  Otherwise, set it to 0x20 (i.e. set it to 0x20 if it
-     * comes up less than 0x20).
-     */
-    if (DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer) < 0x20) {
-        DvcAdvWritePCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer, 0x20);
-        if (DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer) < 0x20)
-        {
-            warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
-        }
-    }
-
-    /*
-     * Save the state of the PCI Configuration Command Register
-     * "Parity Error Response Control" Bit. If the bit is clear (0),
-     * in AdvInitAsc3550/38C0800Driver() tell the microcode to ignore
-     * DMA parity errors.
-     */
-    asc_dvc->cfg->control_flag = 0;
-    if (((DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigCommandRegister)
-         & AscPCICmdRegBits_ParErrRespCtrl)) == 0)
-    {
-        asc_dvc->cfg->control_flag |= CONTROL_FLAG_IGNORE_PERR;
-    }
+       ushort warn_code;
+       AdvPortAddr iop_base;
+       uchar pci_cmd_reg;
+       int status;
+
+       warn_code = 0;
+       asc_dvc->err_code = 0;
+       iop_base = asc_dvc->iop_base;
+
+       /*
+        * PCI Command Register
+        *
+        * Note: AscPCICmdRegBits_BusMastering definition (0x0007) includes
+        * I/O Space Control, Memory Space Control and Bus Master Control bits.
+        */
+
+       if (((pci_cmd_reg = DvcAdvReadPCIConfigByte(asc_dvc,
+                                                   AscPCIConfigCommandRegister))
+            & AscPCICmdRegBits_BusMastering)
+           != AscPCICmdRegBits_BusMastering) {
+               pci_cmd_reg |= AscPCICmdRegBits_BusMastering;
+
+               DvcAdvWritePCIConfigByte(asc_dvc,
+                                        AscPCIConfigCommandRegister,
+                                        pci_cmd_reg);
+
+               if (((DvcAdvReadPCIConfigByte
+                     (asc_dvc, AscPCIConfigCommandRegister))
+                    & AscPCICmdRegBits_BusMastering)
+                   != AscPCICmdRegBits_BusMastering) {
+                       warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
+               }
+       }
 
-    asc_dvc->cfg->lib_version = (ADV_LIB_VERSION_MAJOR << 8) |
-      ADV_LIB_VERSION_MINOR;
-    asc_dvc->cfg->chip_version =
-      AdvGetChipVersion(iop_base, asc_dvc->bus_type);
+       /*
+        * PCI Latency Timer
+        *
+        * If the "latency timer" register is 0x20 or above, then we don't need
+        * to change it.  Otherwise, set it to 0x20 (i.e. set it to 0x20 if it
+        * comes up less than 0x20).
+        */
+       if (DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer) < 0x20) {
+               DvcAdvWritePCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer,
+                                        0x20);
+               if (DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigLatencyTimer) <
+                   0x20) {
+                       warn_code |= ASC_WARN_SET_PCI_CONFIG_SPACE;
+               }
+       }
 
-    ASC_DBG2(1, "AdvInitGetConfig: iopb_chip_id_1: 0x%x 0x%x\n",
-        (ushort) AdvReadByteRegister(iop_base, IOPB_CHIP_ID_1),
-        (ushort) ADV_CHIP_ID_BYTE);
+       /*
+        * Save the state of the PCI Configuration Command Register
+        * "Parity Error Response Control" Bit. If the bit is clear (0),
+        * in AdvInitAsc3550/38C0800Driver() tell the microcode to ignore
+        * DMA parity errors.
+        */
+       asc_dvc->cfg->control_flag = 0;
+       if (((DvcAdvReadPCIConfigByte(asc_dvc, AscPCIConfigCommandRegister)
+             & AscPCICmdRegBits_ParErrRespCtrl)) == 0) {
+               asc_dvc->cfg->control_flag |= CONTROL_FLAG_IGNORE_PERR;
+       }
 
-    ASC_DBG2(1, "AdvInitGetConfig: iopw_chip_id_0: 0x%x 0x%x\n",
-        (ushort) AdvReadWordRegister(iop_base, IOPW_CHIP_ID_0),
-        (ushort) ADV_CHIP_ID_WORD);
+       asc_dvc->cfg->lib_version = (ADV_LIB_VERSION_MAJOR << 8) |
+           ADV_LIB_VERSION_MINOR;
+       asc_dvc->cfg->chip_version =
+           AdvGetChipVersion(iop_base, asc_dvc->bus_type);
+
+       ASC_DBG2(1, "AdvInitGetConfig: iopb_chip_id_1: 0x%x 0x%x\n",
+                (ushort)AdvReadByteRegister(iop_base, IOPB_CHIP_ID_1),
+                (ushort)ADV_CHIP_ID_BYTE);
+
+       ASC_DBG2(1, "AdvInitGetConfig: iopw_chip_id_0: 0x%x 0x%x\n",
+                (ushort)AdvReadWordRegister(iop_base, IOPW_CHIP_ID_0),
+                (ushort)ADV_CHIP_ID_WORD);
+
+       /*
+        * Reset the chip to start and allow register writes.
+        */
+       if (AdvFindSignature(iop_base) == 0) {
+               asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
+               return ADV_ERROR;
+       } else {
+               /*
+                * The caller must set 'chip_type' to a valid setting.
+                */
+               if (asc_dvc->chip_type != ADV_CHIP_ASC3550 &&
+                   asc_dvc->chip_type != ADV_CHIP_ASC38C0800 &&
+                   asc_dvc->chip_type != ADV_CHIP_ASC38C1600) {
+                       asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE;
+                       return ADV_ERROR;
+               }
 
-    /*
-     * Reset the chip to start and allow register writes.
-     */
-    if (AdvFindSignature(iop_base) == 0)
-    {
-        asc_dvc->err_code = ASC_IERR_BAD_SIGNATURE;
-        return ADV_ERROR;
-    }
-    else {
-        /*
-         * The caller must set 'chip_type' to a valid setting.
-         */
-        if (asc_dvc->chip_type != ADV_CHIP_ASC3550 &&
-            asc_dvc->chip_type != ADV_CHIP_ASC38C0800 &&
-            asc_dvc->chip_type != ADV_CHIP_ASC38C1600)
-        {
-            asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE;
-            return ADV_ERROR;
-        }
-
-        /*
-         * Reset Chip.
-         */
-        AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
-            ADV_CTRL_REG_CMD_RESET);
-        DvcSleepMilliSecond(100);
-        AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
-            ADV_CTRL_REG_CMD_WR_IO_REG);
-
-        if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
-        {
-            if ((status = AdvInitFrom38C1600EEP(asc_dvc)) == ADV_ERROR)
-            {
-                return ADV_ERROR;
-            }
-        } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
-        {
-            if ((status = AdvInitFrom38C0800EEP(asc_dvc)) == ADV_ERROR)
-            {
-                return ADV_ERROR;
-            }
-        } else
-        {
-            if ((status = AdvInitFrom3550EEP(asc_dvc)) == ADV_ERROR)
-            {
-                return ADV_ERROR;
-            }
-        }
-        warn_code |= status;
-    }
+               /*
+                * Reset Chip.
+                */
+               AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
+                                    ADV_CTRL_REG_CMD_RESET);
+               DvcSleepMilliSecond(100);
+               AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
+                                    ADV_CTRL_REG_CMD_WR_IO_REG);
+
+               if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
+                       if ((status =
+                            AdvInitFrom38C1600EEP(asc_dvc)) == ADV_ERROR) {
+                               return ADV_ERROR;
+                       }
+               } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
+                       if ((status =
+                            AdvInitFrom38C0800EEP(asc_dvc)) == ADV_ERROR) {
+                               return ADV_ERROR;
+                       }
+               } else {
+                       if ((status = AdvInitFrom3550EEP(asc_dvc)) == ADV_ERROR) {
+                               return ADV_ERROR;
+                       }
+               }
+               warn_code |= status;
+       }
 
-    return warn_code;
+       return warn_code;
 }
 
 /*
@@ -14535,2513 +14325,2407 @@ AdvInitGetConfig(ADV_DVC_VAR *asc_dvc)
  *
  * Needed after initialization for error recovery.
  */
-STATIC int
-AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
+static int AdvInitAsc3550Driver(ADV_DVC_VAR *asc_dvc)
 {
-    AdvPortAddr iop_base;
-    ushort      warn_code;
-    ADV_DCNT    sum;
-    int         begin_addr;
-    int         end_addr;
-    ushort      code_sum;
-    int         word;
-    int         j;
-    int         adv_asc3550_expanded_size;
-    ADV_CARR_T  *carrp;
-    ADV_DCNT    contig_len;
-    ADV_SDCNT   buf_size;
-    ADV_PADDR   carr_paddr;
-    int         i;
-    ushort      scsi_cfg1;
-    uchar       tid;
-    ushort      bios_mem[ASC_MC_BIOSLEN/2]; /* BIOS RISC Memory 0x40-0x8F. */
-    ushort      wdtr_able = 0, sdtr_able, tagqng_able;
-    uchar       max_cmd[ADV_MAX_TID + 1];
-
-    /* If there is already an error, don't continue. */
-    if (asc_dvc->err_code != 0)
-    {
-        return ADV_ERROR;
-    }
+       AdvPortAddr iop_base;
+       ushort warn_code;
+       ADV_DCNT sum;
+       int begin_addr;
+       int end_addr;
+       ushort code_sum;
+       int word;
+       int j;
+       int adv_asc3550_expanded_size;
+       ADV_CARR_T *carrp;
+       ADV_DCNT contig_len;
+       ADV_SDCNT buf_size;
+       ADV_PADDR carr_paddr;
+       int i;
+       ushort scsi_cfg1;
+       uchar tid;
+       ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
+       ushort wdtr_able = 0, sdtr_able, tagqng_able;
+       uchar max_cmd[ADV_MAX_TID + 1];
+
+       /* If there is already an error, don't continue. */
+       if (asc_dvc->err_code != 0) {
+               return ADV_ERROR;
+       }
 
-    /*
-     * The caller must set 'chip_type' to ADV_CHIP_ASC3550.
-     */
-    if (asc_dvc->chip_type != ADV_CHIP_ASC3550)
-    {
-        asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE;
-        return ADV_ERROR;
-    }
+       /*
+        * The caller must set 'chip_type' to ADV_CHIP_ASC3550.
+        */
+       if (asc_dvc->chip_type != ADV_CHIP_ASC3550) {
+               asc_dvc->err_code |= ASC_IERR_BAD_CHIPTYPE;
+               return ADV_ERROR;
+       }
 
-    warn_code = 0;
-    iop_base = asc_dvc->iop_base;
+       warn_code = 0;
+       iop_base = asc_dvc->iop_base;
+
+       /*
+        * Save the RISC memory BIOS region before writing the microcode.
+        * The BIOS may already be loaded and using its RISC LRAM region
+        * so its region must be saved and restored.
+        *
+        * Note: This code makes the assumption, which is currently true,
+        * that a chip reset does not clear RISC LRAM.
+        */
+       for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
+               AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
+                               bios_mem[i]);
+       }
 
-    /*
-     * Save the RISC memory BIOS region before writing the microcode.
-     * The BIOS may already be loaded and using its RISC LRAM region
-     * so its region must be saved and restored.
-     *
-     * Note: This code makes the assumption, which is currently true,
-     * that a chip reset does not clear RISC LRAM.
-     */
-    for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
-    }
+       /*
+        * Save current per TID negotiated values.
+        */
+       if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] == 0x55AA) {
+               ushort bios_version, major, minor;
+
+               bios_version =
+                   bios_mem[(ASC_MC_BIOS_VERSION - ASC_MC_BIOSMEM) / 2];
+               major = (bios_version >> 12) & 0xF;
+               minor = (bios_version >> 8) & 0xF;
+               if (major < 3 || (major == 3 && minor == 1)) {
+                       /* BIOS 3.1 and earlier location of 'wdtr_able' variable. */
+                       AdvReadWordLram(iop_base, 0x120, wdtr_able);
+               } else {
+                       AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+               }
+       }
+       AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+       AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
+       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+               AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                               max_cmd[tid]);
+       }
 
-    /*
-     * Save current per TID negotiated values.
-     */
-    if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
-    {
-        ushort  bios_version, major, minor;
-
-        bios_version = bios_mem[(ASC_MC_BIOS_VERSION - ASC_MC_BIOSMEM)/2];
-        major = (bios_version  >> 12) & 0xF;
-        minor = (bios_version  >> 8) & 0xF;
-        if (major < 3 || (major == 3 && minor == 1))
-        {
-            /* BIOS 3.1 and earlier location of 'wdtr_able' variable. */
-            AdvReadWordLram(iop_base, 0x120, wdtr_able);
-        } else
-        {
-            AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-        }
-    }
-    AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-    AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-    for (tid = 0; tid <= ADV_MAX_TID; tid++)
-    {
-        AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-            max_cmd[tid]);
-    }
+       /*
+        * Load the Microcode
+        *
+        * Write the microcode image to RISC memory starting at address 0.
+        */
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
+       /* Assume the following compressed format of the microcode buffer:
+        *
+        *  254 word (508 byte) table indexed by byte code followed
+        *  by the following byte codes:
+        *
+        *    1-Byte Code:
+        *      00: Emit word 0 in table.
+        *      01: Emit word 1 in table.
+        *      .
+        *      FD: Emit word 253 in table.
+        *
+        *    Multi-Byte Code:
+        *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
+        *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
+        */
+       word = 0;
+       for (i = 253 * 2; i < _adv_asc3550_size; i++) {
+               if (_adv_asc3550_buf[i] == 0xff) {
+                       for (j = 0; j < _adv_asc3550_buf[i + 1]; j++) {
+                               AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                                   _adv_asc3550_buf
+                                                                   [i +
+                                                                    3] << 8) |
+                                                                  _adv_asc3550_buf
+                                                                  [i + 2]));
+                               word++;
+                       }
+                       i += 3;
+               } else if (_adv_asc3550_buf[i] == 0xfe) {
+                       AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                           _adv_asc3550_buf[i +
+                                                                            2]
+                                                           << 8) |
+                                                          _adv_asc3550_buf[i +
+                                                                           1]));
+                       i += 2;
+                       word++;
+               } else {
+                       AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                           _adv_asc3550_buf[(_adv_asc3550_buf[i] * 2) + 1] << 8) | _adv_asc3550_buf[_adv_asc3550_buf[i] * 2]));
+                       word++;
+               }
+       }
 
-    /*
-     * Load the Microcode
-     *
-     * Write the microcode image to RISC memory starting at address 0.
-     */
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
-    /* Assume the following compressed format of the microcode buffer:
-     *
-     *  254 word (508 byte) table indexed by byte code followed
-     *  by the following byte codes:
-     *
-     *    1-Byte Code:
-     *      00: Emit word 0 in table.
-     *      01: Emit word 1 in table.
-     *      .
-     *      FD: Emit word 253 in table.
-     *
-     *    Multi-Byte Code:
-     *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
-     *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
-     */
-    word = 0;
-    for (i = 253 * 2; i < _adv_asc3550_size; i++)
-    {
-        if (_adv_asc3550_buf[i] == 0xff)
-        {
-            for (j = 0; j < _adv_asc3550_buf[i + 1]; j++)
-            {
-                AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                    _adv_asc3550_buf[i + 3] << 8) |
-                _adv_asc3550_buf[i + 2]));
-                word++;
-            }
-            i += 3;
-        } else if (_adv_asc3550_buf[i] == 0xfe)
-        {
-            AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                _adv_asc3550_buf[i + 2] << 8) |
-                _adv_asc3550_buf[i + 1]));
-            i += 2;
-            word++;
-        } else
-        {
-            AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                _adv_asc3550_buf[(_adv_asc3550_buf[i] * 2) + 1] << 8) |
-                _adv_asc3550_buf[_adv_asc3550_buf[i] * 2]));
-            word++;
-        }
-    }
+       /*
+        * Set 'word' for later use to clear the rest of memory and save
+        * the expanded mcode size.
+        */
+       word *= 2;
+       adv_asc3550_expanded_size = word;
+
+       /*
+        * Clear the rest of ASC-3550 Internal RAM (8KB).
+        */
+       for (; word < ADV_3550_MEMSIZE; word += 2) {
+               AdvWriteWordAutoIncLram(iop_base, 0);
+       }
 
-    /*
-     * Set 'word' for later use to clear the rest of memory and save
-     * the expanded mcode size.
-     */
-    word *= 2;
-    adv_asc3550_expanded_size = word;
+       /*
+        * Verify the microcode checksum.
+        */
+       sum = 0;
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
 
-    /*
-     * Clear the rest of ASC-3550 Internal RAM (8KB).
-     */
-    for (; word < ADV_3550_MEMSIZE; word += 2)
-    {
-        AdvWriteWordAutoIncLram(iop_base, 0);
-    }
+       for (word = 0; word < adv_asc3550_expanded_size; word += 2) {
+               sum += AdvReadWordAutoIncLram(iop_base);
+       }
 
-    /*
-     * Verify the microcode checksum.
-     */
-    sum = 0;
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
-
-    for (word = 0; word < adv_asc3550_expanded_size; word += 2)
-    {
-        sum += AdvReadWordAutoIncLram(iop_base);
-    }
+       if (sum != _adv_asc3550_chksum) {
+               asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
+               return ADV_ERROR;
+       }
 
-    if (sum != _adv_asc3550_chksum)
-    {
-        asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
-        return ADV_ERROR;
-    }
+       /*
+        * Restore the RISC memory BIOS region.
+        */
+       for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
+               AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
+                                bios_mem[i]);
+       }
 
-    /*
-     * Restore the RISC memory BIOS region.
-     */
-    for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
-    }
+       /*
+        * Calculate and write the microcode code checksum to the microcode
+        * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
+        */
+       AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
+       AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
+       code_sum = 0;
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
+       for (word = begin_addr; word < end_addr; word += 2) {
+               code_sum += AdvReadWordAutoIncLram(iop_base);
+       }
+       AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
+
+       /*
+        * Read and save microcode version and date.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
+                       asc_dvc->cfg->mcode_date);
+       AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
+                       asc_dvc->cfg->mcode_version);
+
+       /*
+        * Set the chip type to indicate the ASC3550.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC3550);
+
+       /*
+        * If the PCI Configuration Command Register "Parity Error Response
+        * Control" Bit was clear (0), then set the microcode variable
+        * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
+        * to ignore DMA parity errors.
+        */
+       if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
+               AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+               word |= CONTROL_FLAG_IGNORE_PERR;
+               AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+       }
 
-    /*
-     * Calculate and write the microcode code checksum to the microcode
-     * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
-     */
-    AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
-    AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
-    code_sum = 0;
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
-    for (word = begin_addr; word < end_addr; word += 2)
-    {
-        code_sum += AdvReadWordAutoIncLram(iop_base);
-    }
-    AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
+       /*
+        * For ASC-3550, setting the START_CTL_EMFU [3:2] bits sets a FIFO
+        * threshold of 128 bytes. This register is only accessible to the host.
+        */
+       AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
+                            START_CTL_EMFU | READ_CMD_MRM);
+
+       /*
+        * Microcode operating variables for WDTR, SDTR, and command tag
+        * queuing will be set in AdvInquiryHandling() based on what a
+        * device reports it is capable of in Inquiry byte 7.
+        *
+        * If SCSI Bus Resets have been disabled, then directly set
+        * SDTR and WDTR from the EEPROM configuration. This will allow
+        * the BIOS and warm boot to work without a SCSI bus hang on
+        * the Inquiry caused by host and target mismatched DTR values.
+        * Without the SCSI Bus Reset, before an Inquiry a device can't
+        * be assumed to be in Asynchronous, Narrow mode.
+        */
+       if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
+               AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
+                                asc_dvc->wdtr_able);
+               AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
+                                asc_dvc->sdtr_able);
+       }
 
-    /*
-     * Read and save microcode version and date.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE, asc_dvc->cfg->mcode_date);
-    AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM, asc_dvc->cfg->mcode_version);
+       /*
+        * Set microcode operating variables for SDTR_SPEED1, SDTR_SPEED2,
+        * SDTR_SPEED3, and SDTR_SPEED4 based on the ULTRA EEPROM per TID
+        * bitmask. These values determine the maximum SDTR speed negotiated
+        * with a device.
+        *
+        * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
+        * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
+        * without determining here whether the device supports SDTR.
+        *
+        * 4-bit speed  SDTR speed name
+        * ===========  ===============
+        * 0000b (0x0)  SDTR disabled
+        * 0001b (0x1)  5 Mhz
+        * 0010b (0x2)  10 Mhz
+        * 0011b (0x3)  20 Mhz (Ultra)
+        * 0100b (0x4)  40 Mhz (LVD/Ultra2)
+        * 0101b (0x5)  80 Mhz (LVD2/Ultra3)
+        * 0110b (0x6)  Undefined
+        * .
+        * 1111b (0xF)  Undefined
+        */
+       word = 0;
+       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+               if (ADV_TID_TO_TIDMASK(tid) & asc_dvc->ultra_able) {
+                       /* Set Ultra speed for TID 'tid'. */
+                       word |= (0x3 << (4 * (tid % 4)));
+               } else {
+                       /* Set Fast speed for TID 'tid'. */
+                       word |= (0x2 << (4 * (tid % 4)));
+               }
+               if (tid == 3) { /* Check if done with sdtr_speed1. */
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, word);
+                       word = 0;
+               } else if (tid == 7) {  /* Check if done with sdtr_speed2. */
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, word);
+                       word = 0;
+               } else if (tid == 11) { /* Check if done with sdtr_speed3. */
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, word);
+                       word = 0;
+               } else if (tid == 15) { /* Check if done with sdtr_speed4. */
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, word);
+                       /* End of loop. */
+               }
+       }
 
-    /*
-     * Set the chip type to indicate the ASC3550.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC3550);
+       /*
+        * Set microcode operating variable for the disconnect per TID bitmask.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
+                        asc_dvc->cfg->disc_enable);
+
+       /*
+        * Set SCSI_CFG0 Microcode Default Value.
+        *
+        * The microcode will set the SCSI_CFG0 register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
+                        PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
+                        asc_dvc->chip_scsi_id);
+
+       /*
+        * Determine SCSI_CFG1 Microcode Default Value.
+        *
+        * The microcode will set the SCSI_CFG1 register using this value
+        * after it is started below.
+        */
+
+       /* Read current SCSI_CFG1 Register value. */
+       scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+
+       /*
+        * If all three connectors are in use, return an error.
+        */
+       if ((scsi_cfg1 & CABLE_ILLEGAL_A) == 0 ||
+           (scsi_cfg1 & CABLE_ILLEGAL_B) == 0) {
+               asc_dvc->err_code |= ASC_IERR_ILLEGAL_CONNECTION;
+               return ADV_ERROR;
+       }
 
-    /*
-     * If the PCI Configuration Command Register "Parity Error Response
-     * Control" Bit was clear (0), then set the microcode variable
-     * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
-     * to ignore DMA parity errors.
-     */
-    if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-        word |= CONTROL_FLAG_IGNORE_PERR;
-        AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-    }
+       /*
+        * If the internal narrow cable is reversed all of the SCSI_CTRL
+        * register signals will be set. Check for and return an error if
+        * this condition is found.
+        */
+       if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
+               asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * For ASC-3550, setting the START_CTL_EMFU [3:2] bits sets a FIFO
-     * threshold of 128 bytes. This register is only accessible to the host.
-     */
-    AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
-        START_CTL_EMFU | READ_CMD_MRM);
+       /*
+        * If this is a differential board and a single-ended device
+        * is attached to one of the connectors, return an error.
+        */
+       if ((scsi_cfg1 & DIFF_MODE) && (scsi_cfg1 & DIFF_SENSE) == 0) {
+               asc_dvc->err_code |= ASC_IERR_SINGLE_END_DEVICE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Microcode operating variables for WDTR, SDTR, and command tag
-     * queuing will be set in AdvInquiryHandling() based on what a
-     * device reports it is capable of in Inquiry byte 7.
-     *
-     * If SCSI Bus Resets have been disabled, then directly set
-     * SDTR and WDTR from the EEPROM configuration. This will allow
-     * the BIOS and warm boot to work without a SCSI bus hang on
-     * the Inquiry caused by host and target mismatched DTR values.
-     * Without the SCSI Bus Reset, before an Inquiry a device can't
-     * be assumed to be in Asynchronous, Narrow mode.
-     */
-    if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, asc_dvc->wdtr_able);
-        AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, asc_dvc->sdtr_able);
-    }
+       /*
+        * If automatic termination control is enabled, then set the
+        * termination value based on a table listed in a_condor.h.
+        *
+        * If manual termination was specified with an EEPROM setting
+        * then 'termination' was set-up in AdvInitFrom3550EEPROM() and
+        * is ready to be 'ored' into SCSI_CFG1.
+        */
+       if (asc_dvc->cfg->termination == 0) {
+               /*
+                * The software always controls termination by setting TERM_CTL_SEL.
+                * If TERM_CTL_SEL were set to 0, the hardware would set termination.
+                */
+               asc_dvc->cfg->termination |= TERM_CTL_SEL;
+
+               switch (scsi_cfg1 & CABLE_DETECT) {
+                       /* TERM_CTL_H: on, TERM_CTL_L: on */
+               case 0x3:
+               case 0x7:
+               case 0xB:
+               case 0xD:
+               case 0xE:
+               case 0xF:
+                       asc_dvc->cfg->termination |= (TERM_CTL_H | TERM_CTL_L);
+                       break;
+
+                       /* TERM_CTL_H: on, TERM_CTL_L: off */
+               case 0x1:
+               case 0x5:
+               case 0x9:
+               case 0xA:
+               case 0xC:
+                       asc_dvc->cfg->termination |= TERM_CTL_H;
+                       break;
+
+                       /* TERM_CTL_H: off, TERM_CTL_L: off */
+               case 0x2:
+               case 0x6:
+                       break;
+               }
+       }
 
-    /*
-     * Set microcode operating variables for SDTR_SPEED1, SDTR_SPEED2,
-     * SDTR_SPEED3, and SDTR_SPEED4 based on the ULTRA EEPROM per TID
-     * bitmask. These values determine the maximum SDTR speed negotiated
-     * with a device.
-     *
-     * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
-     * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
-     * without determining here whether the device supports SDTR.
-     *
-     * 4-bit speed  SDTR speed name
-     * ===========  ===============
-     * 0000b (0x0)  SDTR disabled
-     * 0001b (0x1)  5 Mhz
-     * 0010b (0x2)  10 Mhz
-     * 0011b (0x3)  20 Mhz (Ultra)
-     * 0100b (0x4)  40 Mhz (LVD/Ultra2)
-     * 0101b (0x5)  80 Mhz (LVD2/Ultra3)
-     * 0110b (0x6)  Undefined
-     * .
-     * 1111b (0xF)  Undefined
-     */
-    word = 0;
-    for (tid = 0; tid <= ADV_MAX_TID; tid++)
-    {
-        if (ADV_TID_TO_TIDMASK(tid) & asc_dvc->ultra_able)
-        {
-            /* Set Ultra speed for TID 'tid'. */
-            word |= (0x3 << (4 * (tid % 4)));
-        } else
-        {
-            /* Set Fast speed for TID 'tid'. */
-            word |= (0x2 << (4 * (tid % 4)));
-        }
-        if (tid == 3) /* Check if done with sdtr_speed1. */
-        {
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, word);
-            word = 0;
-        } else if (tid == 7) /* Check if done with sdtr_speed2. */
-        {
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, word);
-            word = 0;
-        } else if (tid == 11) /* Check if done with sdtr_speed3. */
-        {
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, word);
-            word = 0;
-        } else if (tid == 15) /* Check if done with sdtr_speed4. */
-        {
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, word);
-            /* End of loop. */
-        }
-    }
+       /*
+        * Clear any set TERM_CTL_H and TERM_CTL_L bits.
+        */
+       scsi_cfg1 &= ~TERM_CTL;
+
+       /*
+        * Invert the TERM_CTL_H and TERM_CTL_L bits and then
+        * set 'scsi_cfg1'. The TERM_POL bit does not need to be
+        * referenced, because the hardware internally inverts
+        * the Termination High and Low bits if TERM_POL is set.
+        */
+       scsi_cfg1 |= (TERM_CTL_SEL | (~asc_dvc->cfg->termination & TERM_CTL));
+
+       /*
+        * Set SCSI_CFG1 Microcode Default Value
+        *
+        * Set filter value and possibly modified termination control
+        * bits in the Microcode SCSI_CFG1 Register Value.
+        *
+        * The microcode will set the SCSI_CFG1 register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1,
+                        FLTR_DISABLE | scsi_cfg1);
+
+       /*
+        * Set MEM_CFG Microcode Default Value
+        *
+        * The microcode will set the MEM_CFG register using this value
+        * after it is started below.
+        *
+        * MEM_CFG may be accessed as a word or byte, but only bits 0-7
+        * are defined.
+        *
+        * ASC-3550 has 8KB internal memory.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
+                        BIOS_EN | RAM_SZ_8KB);
+
+       /*
+        * Set SEL_MASK Microcode Default Value
+        *
+        * The microcode will set the SEL_MASK register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
+                        ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
+
+       /*
+        * Build carrier freelist.
+        *
+        * Driver must have already allocated memory and set 'carrier_buf'.
+        */
+       ASC_ASSERT(asc_dvc->carrier_buf != NULL);
+
+       carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
+       asc_dvc->carr_freelist = NULL;
+       if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf) {
+               buf_size = ADV_CARRIER_BUFSIZE;
+       } else {
+               buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
+       }
 
-    /*
-     * Set microcode operating variable for the disconnect per TID bitmask.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE, asc_dvc->cfg->disc_enable);
+       do {
+               /*
+                * Get physical address of the carrier 'carrp'.
+                */
+               contig_len = sizeof(ADV_CARR_T);
+               carr_paddr =
+                   cpu_to_le32(DvcGetPhyAddr
+                               (asc_dvc, NULL, (uchar *)carrp,
+                                (ADV_SDCNT *)&contig_len,
+                                ADV_IS_CARRIER_FLAG));
 
-    /*
-     * Set SCSI_CFG0 Microcode Default Value.
-     *
-     * The microcode will set the SCSI_CFG0 register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
-        PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
-        asc_dvc->chip_scsi_id);
+               buf_size -= sizeof(ADV_CARR_T);
 
-    /*
-     * Determine SCSI_CFG1 Microcode Default Value.
-     *
-     * The microcode will set the SCSI_CFG1 register using this value
-     * after it is started below.
-     */
+               /*
+                * If the current carrier is not physically contiguous, then
+                * maybe there was a page crossing. Try the next carrier aligned
+                * start address.
+                */
+               if (contig_len < sizeof(ADV_CARR_T)) {
+                       carrp++;
+                       continue;
+               }
+
+               carrp->carr_pa = carr_paddr;
+               carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
 
-    /* Read current SCSI_CFG1 Register value. */
-    scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+               /*
+                * Insert the carrier at the beginning of the freelist.
+                */
+               carrp->next_vpa =
+                   cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
+               asc_dvc->carr_freelist = carrp;
 
-    /*
-     * If all three connectors are in use, return an error.
-     */
-    if ((scsi_cfg1 & CABLE_ILLEGAL_A) == 0 ||
-        (scsi_cfg1 & CABLE_ILLEGAL_B) == 0)
-    {
-            asc_dvc->err_code |= ASC_IERR_ILLEGAL_CONNECTION;
-            return ADV_ERROR;
-    }
+               carrp++;
+       }
+       while (buf_size > 0);
 
-    /*
-     * If the internal narrow cable is reversed all of the SCSI_CTRL
-     * register signals will be set. Check for and return an error if
-     * this condition is found.
-     */
-    if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07)
-    {
-        asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
-        return ADV_ERROR;
-    }
+       /*
+        * Set-up the Host->RISC Initiator Command Queue (ICQ).
+        */
 
-    /*
-     * If this is a differential board and a single-ended device
-     * is attached to one of the connectors, return an error.
-     */
-    if ((scsi_cfg1 & DIFF_MODE) && (scsi_cfg1 & DIFF_SENSE) == 0)
-    {
-        asc_dvc->err_code |= ASC_IERR_SINGLE_END_DEVICE;
-        return ADV_ERROR;
-    }
+       if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
+               asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
+               return ADV_ERROR;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
+
+       /*
+        * The first command issued will be placed in the stopper carrier.
+        */
+       asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Set RISC ICQ physical address start value.
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
+
+       /*
+        * Set-up the RISC->Host Initiator Response Queue (IRQ).
+        */
+       if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
+               asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
+               return ADV_ERROR;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
+
+       /*
+        * The first command completed by the RISC will be placed in
+        * the stopper.
+        *
+        * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
+        * completed the RISC will set the ASC_RQ_STOPPER bit.
+        */
+       asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Set RISC IRQ physical address start value.
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
+       asc_dvc->carr_pending_cnt = 0;
+
+       AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
+                            (ADV_INTR_ENABLE_HOST_INTR |
+                             ADV_INTR_ENABLE_GLOBAL_INTR));
+
+       AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
+       AdvWriteWordRegister(iop_base, IOPW_PC, word);
+
+       /* finally, finally, gentlemen, start your engine */
+       AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
+
+       /*
+        * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
+        * Resets should be performed. The RISC has to be running
+        * to issue a SCSI Bus Reset.
+        */
+       if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
+               /*
+                * If the BIOS Signature is present in memory, restore the
+                * BIOS Handshake Configuration Table and do not perform
+                * a SCSI Bus Reset.
+                */
+               if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
+                   0x55AA) {
+                       /*
+                        * Restore per TID negotiated values.
+                        */
+                       AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
+                                        tagqng_able);
+                       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+                               AdvWriteByteLram(iop_base,
+                                                ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                                                max_cmd[tid]);
+                       }
+               } else {
+                       if (AdvResetSB(asc_dvc) != ADV_TRUE) {
+                               warn_code = ASC_WARN_BUSRESET_ERROR;
+                       }
+               }
+       }
 
-    /*
-     * If automatic termination control is enabled, then set the
-     * termination value based on a table listed in a_condor.h.
-     *
-     * If manual termination was specified with an EEPROM setting
-     * then 'termination' was set-up in AdvInitFrom3550EEPROM() and
-     * is ready to be 'ored' into SCSI_CFG1.
-     */
-    if (asc_dvc->cfg->termination == 0)
-    {
-        /*
-         * The software always controls termination by setting TERM_CTL_SEL.
-         * If TERM_CTL_SEL were set to 0, the hardware would set termination.
-         */
-        asc_dvc->cfg->termination |= TERM_CTL_SEL;
-
-        switch(scsi_cfg1 & CABLE_DETECT)
-        {
-            /* TERM_CTL_H: on, TERM_CTL_L: on */
-            case 0x3: case 0x7: case 0xB: case 0xD: case 0xE: case 0xF:
-                asc_dvc->cfg->termination |= (TERM_CTL_H | TERM_CTL_L);
-                break;
-
-            /* TERM_CTL_H: on, TERM_CTL_L: off */
-            case 0x1: case 0x5: case 0x9: case 0xA: case 0xC:
-                asc_dvc->cfg->termination |= TERM_CTL_H;
-                break;
-
-            /* TERM_CTL_H: off, TERM_CTL_L: off */
-            case 0x2: case 0x6:
-                break;
-        }
-    }
+       return warn_code;
+}
 
-    /*
-     * Clear any set TERM_CTL_H and TERM_CTL_L bits.
-     */
-    scsi_cfg1 &= ~TERM_CTL;
+/*
+ * Initialize the ASC-38C0800.
+ *
+ * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
+ *
+ * For a non-fatal error return a warning code. If there are no warnings
+ * then 0 is returned.
+ *
+ * Needed after initialization for error recovery.
+ */
+static int AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
+{
+       AdvPortAddr iop_base;
+       ushort warn_code;
+       ADV_DCNT sum;
+       int begin_addr;
+       int end_addr;
+       ushort code_sum;
+       int word;
+       int j;
+       int adv_asc38C0800_expanded_size;
+       ADV_CARR_T *carrp;
+       ADV_DCNT contig_len;
+       ADV_SDCNT buf_size;
+       ADV_PADDR carr_paddr;
+       int i;
+       ushort scsi_cfg1;
+       uchar byte;
+       uchar tid;
+       ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
+       ushort wdtr_able, sdtr_able, tagqng_able;
+       uchar max_cmd[ADV_MAX_TID + 1];
+
+       /* If there is already an error, don't continue. */
+       if (asc_dvc->err_code != 0) {
+               return ADV_ERROR;
+       }
 
-    /*
-     * Invert the TERM_CTL_H and TERM_CTL_L bits and then
-     * set 'scsi_cfg1'. The TERM_POL bit does not need to be
-     * referenced, because the hardware internally inverts
-     * the Termination High and Low bits if TERM_POL is set.
-     */
-    scsi_cfg1 |= (TERM_CTL_SEL | (~asc_dvc->cfg->termination & TERM_CTL));
+       /*
+        * The caller must set 'chip_type' to ADV_CHIP_ASC38C0800.
+        */
+       if (asc_dvc->chip_type != ADV_CHIP_ASC38C0800) {
+               asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Set SCSI_CFG1 Microcode Default Value
-     *
-     * Set filter value and possibly modified termination control
-     * bits in the Microcode SCSI_CFG1 Register Value.
-     *
-     * The microcode will set the SCSI_CFG1 register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1,
-        FLTR_DISABLE | scsi_cfg1);
+       warn_code = 0;
+       iop_base = asc_dvc->iop_base;
+
+       /*
+        * Save the RISC memory BIOS region before writing the microcode.
+        * The BIOS may already be loaded and using its RISC LRAM region
+        * so its region must be saved and restored.
+        *
+        * Note: This code makes the assumption, which is currently true,
+        * that a chip reset does not clear RISC LRAM.
+        */
+       for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
+               AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
+                               bios_mem[i]);
+       }
 
-    /*
-     * Set MEM_CFG Microcode Default Value
-     *
-     * The microcode will set the MEM_CFG register using this value
-     * after it is started below.
-     *
-     * MEM_CFG may be accessed as a word or byte, but only bits 0-7
-     * are defined.
-     *
-     * ASC-3550 has 8KB internal memory.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
-        BIOS_EN | RAM_SZ_8KB);
+       /*
+        * Save current per TID negotiated values.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+       AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+       AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
+       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+               AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                               max_cmd[tid]);
+       }
 
-    /*
-     * Set SEL_MASK Microcode Default Value
-     *
-     * The microcode will set the SEL_MASK register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
-        ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
+       /*
+        * RAM BIST (RAM Built-In Self Test)
+        *
+        * Address : I/O base + offset 0x38h register (byte).
+        * Function: Bit 7-6(RW) : RAM mode
+        *                          Normal Mode   : 0x00
+        *                          Pre-test Mode : 0x40
+        *                          RAM Test Mode : 0x80
+        *           Bit 5       : unused
+        *           Bit 4(RO)   : Done bit
+        *           Bit 3-0(RO) : Status
+        *                          Host Error    : 0x08
+        *                          Int_RAM Error : 0x04
+        *                          RISC Error    : 0x02
+        *                          SCSI Error    : 0x01
+        *                          No Error      : 0x00
+        *
+        * Note: RAM BIST code should be put right here, before loading the
+        * microcode and after saving the RISC memory BIOS region.
+        */
+
+       /*
+        * LRAM Pre-test
+        *
+        * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
+        * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
+        * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
+        * to NORMAL_MODE, return an error too.
+        */
+       for (i = 0; i < 2; i++) {
+               AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
+               DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
+               byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
+               if ((byte & RAM_TEST_DONE) == 0
+                   || (byte & 0x0F) != PRE_TEST_VALUE) {
+                       asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
+                       return ADV_ERROR;
+               }
+
+               AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
+               DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
+               if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
+                   != NORMAL_VALUE) {
+                       asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
+                       return ADV_ERROR;
+               }
+       }
 
-    /*
-     * Build carrier freelist.
-     *
-     * Driver must have already allocated memory and set 'carrier_buf'.
-     */
-    ASC_ASSERT(asc_dvc->carrier_buf != NULL);
-
-    carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
-    asc_dvc->carr_freelist = NULL;
-    if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf)
-    {
-        buf_size = ADV_CARRIER_BUFSIZE;
-    } else
-    {
-        buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
-    }
+       /*
+        * LRAM Test - It takes about 1.5 ms to run through the test.
+        *
+        * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
+        * If Done bit not set or Status not 0, save register byte, set the
+        * err_code, and return an error.
+        */
+       AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
+       DvcSleepMilliSecond(10);        /* Wait for 10ms before checking status. */
+
+       byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
+       if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
+               /* Get here if Done bit not set or Status not 0. */
+               asc_dvc->bist_err_code = byte;  /* for BIOS display message */
+               asc_dvc->err_code |= ASC_IERR_BIST_RAM_TEST;
+               return ADV_ERROR;
+       }
 
-    do {
-        /*
-         * Get physical address of the carrier 'carrp'.
-         */
-        contig_len = sizeof(ADV_CARR_T);
-        carr_paddr = cpu_to_le32(DvcGetPhyAddr(asc_dvc, NULL, (uchar *) carrp,
-            (ADV_SDCNT *) &contig_len, ADV_IS_CARRIER_FLAG));
-
-        buf_size -= sizeof(ADV_CARR_T);
-
-        /*
-         * If the current carrier is not physically contiguous, then
-         * maybe there was a page crossing. Try the next carrier aligned
-         * start address.
-         */
-        if (contig_len < sizeof(ADV_CARR_T))
-        {
-            carrp++;
-            continue;
-        }
-
-        carrp->carr_pa = carr_paddr;
-        carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
-
-        /*
-         * Insert the carrier at the beginning of the freelist.
-         */
-        carrp->next_vpa = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
-        asc_dvc->carr_freelist = carrp;
-
-        carrp++;
-    }
-    while (buf_size > 0);
+       /* We need to reset back to normal mode after LRAM test passes. */
+       AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
+
+       /*
+        * Load the Microcode
+        *
+        * Write the microcode image to RISC memory starting at address 0.
+        *
+        */
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
+
+       /* Assume the following compressed format of the microcode buffer:
+        *
+        *  254 word (508 byte) table indexed by byte code followed
+        *  by the following byte codes:
+        *
+        *    1-Byte Code:
+        *      00: Emit word 0 in table.
+        *      01: Emit word 1 in table.
+        *      .
+        *      FD: Emit word 253 in table.
+        *
+        *    Multi-Byte Code:
+        *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
+        *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
+        */
+       word = 0;
+       for (i = 253 * 2; i < _adv_asc38C0800_size; i++) {
+               if (_adv_asc38C0800_buf[i] == 0xff) {
+                       for (j = 0; j < _adv_asc38C0800_buf[i + 1]; j++) {
+                               AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                                   _adv_asc38C0800_buf
+                                                                   [i +
+                                                                    3] << 8) |
+                                                                  _adv_asc38C0800_buf
+                                                                  [i + 2]));
+                               word++;
+                       }
+                       i += 3;
+               } else if (_adv_asc38C0800_buf[i] == 0xfe) {
+                       AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                           _adv_asc38C0800_buf
+                                                           [i +
+                                                            2] << 8) |
+                                                          _adv_asc38C0800_buf[i
+                                                                              +
+                                                                              1]));
+                       i += 2;
+                       word++;
+               } else {
+                       AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                           _adv_asc38C0800_buf[(_adv_asc38C0800_buf[i] * 2) + 1] << 8) | _adv_asc38C0800_buf[_adv_asc38C0800_buf[i] * 2]));
+                       word++;
+               }
+       }
 
-    /*
-     * Set-up the Host->RISC Initiator Command Queue (ICQ).
-     */
+       /*
+        * Set 'word' for later use to clear the rest of memory and save
+        * the expanded mcode size.
+        */
+       word *= 2;
+       adv_asc38C0800_expanded_size = word;
+
+       /*
+        * Clear the rest of ASC-38C0800 Internal RAM (16KB).
+        */
+       for (; word < ADV_38C0800_MEMSIZE; word += 2) {
+               AdvWriteWordAutoIncLram(iop_base, 0);
+       }
 
-    if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL)
-    {
-        asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
-        return ADV_ERROR;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-        ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
+       /*
+        * Verify the microcode checksum.
+        */
+       sum = 0;
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
 
-    /*
-     * The first command issued will be placed in the stopper carrier.
-     */
-    asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+       for (word = 0; word < adv_asc38C0800_expanded_size; word += 2) {
+               sum += AdvReadWordAutoIncLram(iop_base);
+       }
+       ASC_DBG2(1, "AdvInitAsc38C0800Driver: word %d, i %d\n", word, i);
 
-    /*
-     * Set RISC ICQ physical address start value.
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
+       ASC_DBG2(1,
+                "AdvInitAsc38C0800Driver: sum 0x%lx, _adv_asc38C0800_chksum 0x%lx\n",
+                (ulong)sum, (ulong)_adv_asc38C0800_chksum);
 
-    /*
-     * Set-up the RISC->Host Initiator Response Queue (IRQ).
-     */
-    if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL)
-    {
-        asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
-        return ADV_ERROR;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-         ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
+       if (sum != _adv_asc38C0800_chksum) {
+               asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
+               return ADV_ERROR;
+       }
 
-    /*
-     * The first command completed by the RISC will be placed in
-     * the stopper.
-     *
-     * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
-     * completed the RISC will set the ASC_RQ_STOPPER bit.
-     */
-    asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+       /*
+        * Restore the RISC memory BIOS region.
+        */
+       for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
+               AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
+                                bios_mem[i]);
+       }
 
-    /*
-     * Set RISC IRQ physical address start value.
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
-    asc_dvc->carr_pending_cnt = 0;
+       /*
+        * Calculate and write the microcode code checksum to the microcode
+        * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
+        */
+       AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
+       AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
+       code_sum = 0;
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
+       for (word = begin_addr; word < end_addr; word += 2) {
+               code_sum += AdvReadWordAutoIncLram(iop_base);
+       }
+       AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
+
+       /*
+        * Read microcode version and date.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
+                       asc_dvc->cfg->mcode_date);
+       AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
+                       asc_dvc->cfg->mcode_version);
+
+       /*
+        * Set the chip type to indicate the ASC38C0800.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C0800);
+
+       /*
+        * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
+        * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
+        * cable detection and then we are able to read C_DET[3:0].
+        *
+        * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
+        * Microcode Default Value' section below.
+        */
+       scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+       AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1,
+                            scsi_cfg1 | DIS_TERM_DRV);
+
+       /*
+        * If the PCI Configuration Command Register "Parity Error Response
+        * Control" Bit was clear (0), then set the microcode variable
+        * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
+        * to ignore DMA parity errors.
+        */
+       if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
+               AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+               word |= CONTROL_FLAG_IGNORE_PERR;
+               AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+       }
 
-    AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
-        (ADV_INTR_ENABLE_HOST_INTR | ADV_INTR_ENABLE_GLOBAL_INTR));
+       /*
+        * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2]
+        * bits for the default FIFO threshold.
+        *
+        * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes.
+        *
+        * For DMA Errata #4 set the BC_THRESH_ENB bit.
+        */
+       AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
+                            BC_THRESH_ENB | FIFO_THRESH_80B | START_CTL_TH |
+                            READ_CMD_MRM);
+
+       /*
+        * Microcode operating variables for WDTR, SDTR, and command tag
+        * queuing will be set in AdvInquiryHandling() based on what a
+        * device reports it is capable of in Inquiry byte 7.
+        *
+        * If SCSI Bus Resets have been disabled, then directly set
+        * SDTR and WDTR from the EEPROM configuration. This will allow
+        * the BIOS and warm boot to work without a SCSI bus hang on
+        * the Inquiry caused by host and target mismatched DTR values.
+        * Without the SCSI Bus Reset, before an Inquiry a device can't
+        * be assumed to be in Asynchronous, Narrow mode.
+        */
+       if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
+               AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
+                                asc_dvc->wdtr_able);
+               AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
+                                asc_dvc->sdtr_able);
+       }
 
-    AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
-    AdvWriteWordRegister(iop_base, IOPW_PC, word);
+       /*
+        * Set microcode operating variables for DISC and SDTR_SPEED1,
+        * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
+        * configuration values.
+        *
+        * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
+        * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
+        * without determining here whether the device supports SDTR.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
+                        asc_dvc->cfg->disc_enable);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
+
+       /*
+        * Set SCSI_CFG0 Microcode Default Value.
+        *
+        * The microcode will set the SCSI_CFG0 register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
+                        PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
+                        asc_dvc->chip_scsi_id);
+
+       /*
+        * Determine SCSI_CFG1 Microcode Default Value.
+        *
+        * The microcode will set the SCSI_CFG1 register using this value
+        * after it is started below.
+        */
+
+       /* Read current SCSI_CFG1 Register value. */
+       scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+
+       /*
+        * If the internal narrow cable is reversed all of the SCSI_CTRL
+        * register signals will be set. Check for and return an error if
+        * this condition is found.
+        */
+       if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
+               asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
+               return ADV_ERROR;
+       }
 
-    /* finally, finally, gentlemen, start your engine */
-    AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
+       /*
+        * All kind of combinations of devices attached to one of four connectors
+        * are acceptable except HVD device attached. For example, LVD device can
+        * be attached to SE connector while SE device attached to LVD connector.
+        * If LVD device attached to SE connector, it only runs up to Ultra speed.
+        *
+        * If an HVD device is attached to one of LVD connectors, return an error.
+        * However, there is no way to detect HVD device attached to SE connectors.
+        */
+       if (scsi_cfg1 & HVD) {
+               asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
-     * Resets should be performed. The RISC has to be running
-     * to issue a SCSI Bus Reset.
-     */
-    if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
-    {
-        /*
-         * If the BIOS Signature is present in memory, restore the
-         * BIOS Handshake Configuration Table and do not perform
-         * a SCSI Bus Reset.
-         */
-        if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
-        {
-            /*
-             * Restore per TID negotiated values.
-             */
-            AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-            for (tid = 0; tid <= ADV_MAX_TID; tid++)
-            {
-                AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-                    max_cmd[tid]);
-            }
-        } else
-        {
-            if (AdvResetSB(asc_dvc) != ADV_TRUE)
-            {
-                warn_code = ASC_WARN_BUSRESET_ERROR;
-            }
-        }
-    }
+       /*
+        * If either SE or LVD automatic termination control is enabled, then
+        * set the termination value based on a table listed in a_condor.h.
+        *
+        * If manual termination was specified with an EEPROM setting then
+        * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready to
+        * be 'ored' into SCSI_CFG1.
+        */
+       if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
+               /* SE automatic termination control is enabled. */
+               switch (scsi_cfg1 & C_DET_SE) {
+                       /* TERM_SE_HI: on, TERM_SE_LO: on */
+               case 0x1:
+               case 0x2:
+               case 0x3:
+                       asc_dvc->cfg->termination |= TERM_SE;
+                       break;
+
+                       /* TERM_SE_HI: on, TERM_SE_LO: off */
+               case 0x0:
+                       asc_dvc->cfg->termination |= TERM_SE_HI;
+                       break;
+               }
+       }
+
+       if ((asc_dvc->cfg->termination & TERM_LVD) == 0) {
+               /* LVD automatic termination control is enabled. */
+               switch (scsi_cfg1 & C_DET_LVD) {
+                       /* TERM_LVD_HI: on, TERM_LVD_LO: on */
+               case 0x4:
+               case 0x8:
+               case 0xC:
+                       asc_dvc->cfg->termination |= TERM_LVD;
+                       break;
+
+                       /* TERM_LVD_HI: off, TERM_LVD_LO: off */
+               case 0x0:
+                       break;
+               }
+       }
+
+       /*
+        * Clear any set TERM_SE and TERM_LVD bits.
+        */
+       scsi_cfg1 &= (~TERM_SE & ~TERM_LVD);
+
+       /*
+        * Invert the TERM_SE and TERM_LVD bits and then set 'scsi_cfg1'.
+        */
+       scsi_cfg1 |= (~asc_dvc->cfg->termination & 0xF0);
+
+       /*
+        * Clear BIG_ENDIAN, DIS_TERM_DRV, Terminator Polarity and HVD/LVD/SE bits
+        * and set possibly modified termination control bits in the Microcode
+        * SCSI_CFG1 Register Value.
+        */
+       scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL & ~HVD_LVD_SE);
+
+       /*
+        * Set SCSI_CFG1 Microcode Default Value
+        *
+        * Set possibly modified termination control and reset DIS_TERM_DRV
+        * bits in the Microcode SCSI_CFG1 Register Value.
+        *
+        * The microcode will set the SCSI_CFG1 register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
+
+       /*
+        * Set MEM_CFG Microcode Default Value
+        *
+        * The microcode will set the MEM_CFG register using this value
+        * after it is started below.
+        *
+        * MEM_CFG may be accessed as a word or byte, but only bits 0-7
+        * are defined.
+        *
+        * ASC-38C0800 has 16KB internal memory.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
+                        BIOS_EN | RAM_SZ_16KB);
+
+       /*
+        * Set SEL_MASK Microcode Default Value
+        *
+        * The microcode will set the SEL_MASK register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
+                        ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
+
+       /*
+        * Build the carrier freelist.
+        *
+        * Driver must have already allocated memory and set 'carrier_buf'.
+        */
+       ASC_ASSERT(asc_dvc->carrier_buf != NULL);
+
+       carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
+       asc_dvc->carr_freelist = NULL;
+       if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf) {
+               buf_size = ADV_CARRIER_BUFSIZE;
+       } else {
+               buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
+       }
+
+       do {
+               /*
+                * Get physical address for the carrier 'carrp'.
+                */
+               contig_len = sizeof(ADV_CARR_T);
+               carr_paddr =
+                   cpu_to_le32(DvcGetPhyAddr
+                               (asc_dvc, NULL, (uchar *)carrp,
+                                (ADV_SDCNT *)&contig_len,
+                                ADV_IS_CARRIER_FLAG));
 
-    return warn_code;
+               buf_size -= sizeof(ADV_CARR_T);
+
+               /*
+                * If the current carrier is not physically contiguous, then
+                * maybe there was a page crossing. Try the next carrier aligned
+                * start address.
+                */
+               if (contig_len < sizeof(ADV_CARR_T)) {
+                       carrp++;
+                       continue;
+               }
+
+               carrp->carr_pa = carr_paddr;
+               carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
+
+               /*
+                * Insert the carrier at the beginning of the freelist.
+                */
+               carrp->next_vpa =
+                   cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
+               asc_dvc->carr_freelist = carrp;
+
+               carrp++;
+       }
+       while (buf_size > 0);
+
+       /*
+        * Set-up the Host->RISC Initiator Command Queue (ICQ).
+        */
+
+       if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
+               asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
+               return ADV_ERROR;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
+
+       /*
+        * The first command issued will be placed in the stopper carrier.
+        */
+       asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Set RISC ICQ physical address start value.
+        * carr_pa is LE, must be native before write
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
+
+       /*
+        * Set-up the RISC->Host Initiator Response Queue (IRQ).
+        */
+       if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
+               asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
+               return ADV_ERROR;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
+
+       /*
+        * The first command completed by the RISC will be placed in
+        * the stopper.
+        *
+        * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
+        * completed the RISC will set the ASC_RQ_STOPPER bit.
+        */
+       asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Set RISC IRQ physical address start value.
+        *
+        * carr_pa is LE, must be native before write *
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
+       asc_dvc->carr_pending_cnt = 0;
+
+       AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
+                            (ADV_INTR_ENABLE_HOST_INTR |
+                             ADV_INTR_ENABLE_GLOBAL_INTR));
+
+       AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
+       AdvWriteWordRegister(iop_base, IOPW_PC, word);
+
+       /* finally, finally, gentlemen, start your engine */
+       AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
+
+       /*
+        * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
+        * Resets should be performed. The RISC has to be running
+        * to issue a SCSI Bus Reset.
+        */
+       if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
+               /*
+                * If the BIOS Signature is present in memory, restore the
+                * BIOS Handshake Configuration Table and do not perform
+                * a SCSI Bus Reset.
+                */
+               if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
+                   0x55AA) {
+                       /*
+                        * Restore per TID negotiated values.
+                        */
+                       AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
+                                        tagqng_able);
+                       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+                               AdvWriteByteLram(iop_base,
+                                                ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                                                max_cmd[tid]);
+                       }
+               } else {
+                       if (AdvResetSB(asc_dvc) != ADV_TRUE) {
+                               warn_code = ASC_WARN_BUSRESET_ERROR;
+                       }
+               }
+       }
+
+       return warn_code;
 }
 
 /*
- * Initialize the ASC-38C0800.
+ * Initialize the ASC-38C1600.
  *
- * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
+ * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
  *
  * For a non-fatal error return a warning code. If there are no warnings
  * then 0 is returned.
  *
  * Needed after initialization for error recovery.
  */
-STATIC int
-AdvInitAsc38C0800Driver(ADV_DVC_VAR *asc_dvc)
+static int AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
 {
-    AdvPortAddr iop_base;
-    ushort      warn_code;
-    ADV_DCNT    sum;
-    int         begin_addr;
-    int         end_addr;
-    ushort      code_sum;
-    int         word;
-    int         j;
-    int         adv_asc38C0800_expanded_size;
-    ADV_CARR_T  *carrp;
-    ADV_DCNT    contig_len;
-    ADV_SDCNT   buf_size;
-    ADV_PADDR   carr_paddr;
-    int         i;
-    ushort      scsi_cfg1;
-    uchar       byte;
-    uchar       tid;
-    ushort      bios_mem[ASC_MC_BIOSLEN/2]; /* BIOS RISC Memory 0x40-0x8F. */
-    ushort      wdtr_able, sdtr_able, tagqng_able;
-    uchar       max_cmd[ADV_MAX_TID + 1];
-
-    /* If there is already an error, don't continue. */
-    if (asc_dvc->err_code != 0)
-    {
-        return ADV_ERROR;
-    }
-
-    /*
-     * The caller must set 'chip_type' to ADV_CHIP_ASC38C0800.
-     */
-    if (asc_dvc->chip_type != ADV_CHIP_ASC38C0800)
-    {
-        asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
-        return ADV_ERROR;
-    }
+       AdvPortAddr iop_base;
+       ushort warn_code;
+       ADV_DCNT sum;
+       int begin_addr;
+       int end_addr;
+       ushort code_sum;
+       long word;
+       int j;
+       int adv_asc38C1600_expanded_size;
+       ADV_CARR_T *carrp;
+       ADV_DCNT contig_len;
+       ADV_SDCNT buf_size;
+       ADV_PADDR carr_paddr;
+       int i;
+       ushort scsi_cfg1;
+       uchar byte;
+       uchar tid;
+       ushort bios_mem[ASC_MC_BIOSLEN / 2];    /* BIOS RISC Memory 0x40-0x8F. */
+       ushort wdtr_able, sdtr_able, ppr_able, tagqng_able;
+       uchar max_cmd[ASC_MAX_TID + 1];
+
+       /* If there is already an error, don't continue. */
+       if (asc_dvc->err_code != 0) {
+               return ADV_ERROR;
+       }
 
-    warn_code = 0;
-    iop_base = asc_dvc->iop_base;
+       /*
+        * The caller must set 'chip_type' to ADV_CHIP_ASC38C1600.
+        */
+       if (asc_dvc->chip_type != ADV_CHIP_ASC38C1600) {
+               asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Save the RISC memory BIOS region before writing the microcode.
-     * The BIOS may already be loaded and using its RISC LRAM region
-     * so its region must be saved and restored.
-     *
-     * Note: This code makes the assumption, which is currently true,
-     * that a chip reset does not clear RISC LRAM.
-     */
-    for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
-    }
+       warn_code = 0;
+       iop_base = asc_dvc->iop_base;
+
+       /*
+        * Save the RISC memory BIOS region before writing the microcode.
+        * The BIOS may already be loaded and using its RISC LRAM region
+        * so its region must be saved and restored.
+        *
+        * Note: This code makes the assumption, which is currently true,
+        * that a chip reset does not clear RISC LRAM.
+        */
+       for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
+               AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
+                               bios_mem[i]);
+       }
 
-    /*
-     * Save current per TID negotiated values.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-    AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-    AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-    for (tid = 0; tid <= ADV_MAX_TID; tid++)
-    {
-        AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-            max_cmd[tid]);
-    }
+       /*
+        * Save current per TID negotiated values.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+       AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+       AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
+       AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
+       for (tid = 0; tid <= ASC_MAX_TID; tid++) {
+               AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                               max_cmd[tid]);
+       }
 
-    /*
-     * RAM BIST (RAM Built-In Self Test)
-     *
-     * Address : I/O base + offset 0x38h register (byte).
-     * Function: Bit 7-6(RW) : RAM mode
-     *                          Normal Mode   : 0x00
-     *                          Pre-test Mode : 0x40
-     *                          RAM Test Mode : 0x80
-     *           Bit 5       : unused
-     *           Bit 4(RO)   : Done bit
-     *           Bit 3-0(RO) : Status
-     *                          Host Error    : 0x08
-     *                          Int_RAM Error : 0x04
-     *                          RISC Error    : 0x02
-     *                          SCSI Error    : 0x01
-     *                          No Error      : 0x00
-     *
-     * Note: RAM BIST code should be put right here, before loading the
-     * microcode and after saving the RISC memory BIOS region.
-     */
+       /*
+        * RAM BIST (Built-In Self Test)
+        *
+        * Address : I/O base + offset 0x38h register (byte).
+        * Function: Bit 7-6(RW) : RAM mode
+        *                          Normal Mode   : 0x00
+        *                          Pre-test Mode : 0x40
+        *                          RAM Test Mode : 0x80
+        *           Bit 5       : unused
+        *           Bit 4(RO)   : Done bit
+        *           Bit 3-0(RO) : Status
+        *                          Host Error    : 0x08
+        *                          Int_RAM Error : 0x04
+        *                          RISC Error    : 0x02
+        *                          SCSI Error    : 0x01
+        *                          No Error      : 0x00
+        *
+        * Note: RAM BIST code should be put right here, before loading the
+        * microcode and after saving the RISC memory BIOS region.
+        */
+
+       /*
+        * LRAM Pre-test
+        *
+        * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
+        * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
+        * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
+        * to NORMAL_MODE, return an error too.
+        */
+       for (i = 0; i < 2; i++) {
+               AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
+               DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
+               byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
+               if ((byte & RAM_TEST_DONE) == 0
+                   || (byte & 0x0F) != PRE_TEST_VALUE) {
+                       asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
+                       return ADV_ERROR;
+               }
+
+               AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
+               DvcSleepMilliSecond(10);        /* Wait for 10ms before reading back. */
+               if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
+                   != NORMAL_VALUE) {
+                       asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
+                       return ADV_ERROR;
+               }
+       }
 
-    /*
-     * LRAM Pre-test
-     *
-     * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
-     * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
-     * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
-     * to NORMAL_MODE, return an error too.
-     */
-    for (i = 0; i < 2; i++)
-    {
-        AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
-        DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
-        byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
-        if ((byte & RAM_TEST_DONE) == 0 || (byte & 0x0F) != PRE_TEST_VALUE)
-        {
-            asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
-            return ADV_ERROR;
-        }
-
-        AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
-        DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
-        if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
-            != NORMAL_VALUE)
-        {
-            asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
-            return ADV_ERROR;
-        }
-    }
+       /*
+        * LRAM Test - It takes about 1.5 ms to run through the test.
+        *
+        * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
+        * If Done bit not set or Status not 0, save register byte, set the
+        * err_code, and return an error.
+        */
+       AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
+       DvcSleepMilliSecond(10);        /* Wait for 10ms before checking status. */
+
+       byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
+       if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0) {
+               /* Get here if Done bit not set or Status not 0. */
+               asc_dvc->bist_err_code = byte;  /* for BIOS display message */
+               asc_dvc->err_code |= ASC_IERR_BIST_RAM_TEST;
+               return ADV_ERROR;
+       }
 
-    /*
-     * LRAM Test - It takes about 1.5 ms to run through the test.
-     *
-     * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
-     * If Done bit not set or Status not 0, save register byte, set the
-     * err_code, and return an error.
-     */
-    AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
-    DvcSleepMilliSecond(10);  /* Wait for 10ms before checking status. */
-
-    byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
-    if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0)
-    {
-        /* Get here if Done bit not set or Status not 0. */
-        asc_dvc->bist_err_code = byte;  /* for BIOS display message */
-        asc_dvc->err_code |= ASC_IERR_BIST_RAM_TEST;
-        return ADV_ERROR;
-    }
+       /* We need to reset back to normal mode after LRAM test passes. */
+       AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
+
+       /*
+        * Load the Microcode
+        *
+        * Write the microcode image to RISC memory starting at address 0.
+        *
+        */
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
+
+       /*
+        * Assume the following compressed format of the microcode buffer:
+        *
+        *  254 word (508 byte) table indexed by byte code followed
+        *  by the following byte codes:
+        *
+        *    1-Byte Code:
+        *      00: Emit word 0 in table.
+        *      01: Emit word 1 in table.
+        *      .
+        *      FD: Emit word 253 in table.
+        *
+        *    Multi-Byte Code:
+        *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
+        *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
+        */
+       word = 0;
+       for (i = 253 * 2; i < _adv_asc38C1600_size; i++) {
+               if (_adv_asc38C1600_buf[i] == 0xff) {
+                       for (j = 0; j < _adv_asc38C1600_buf[i + 1]; j++) {
+                               AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                                   _adv_asc38C1600_buf
+                                                                   [i +
+                                                                    3] << 8) |
+                                                                  _adv_asc38C1600_buf
+                                                                  [i + 2]));
+                               word++;
+                       }
+                       i += 3;
+               } else if (_adv_asc38C1600_buf[i] == 0xfe) {
+                       AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                           _adv_asc38C1600_buf
+                                                           [i +
+                                                            2] << 8) |
+                                                          _adv_asc38C1600_buf[i
+                                                                              +
+                                                                              1]));
+                       i += 2;
+                       word++;
+               } else {
+                       AdvWriteWordAutoIncLram(iop_base, (((ushort)
+                                                           _adv_asc38C1600_buf[(_adv_asc38C1600_buf[i] * 2) + 1] << 8) | _adv_asc38C1600_buf[_adv_asc38C1600_buf[i] * 2]));
+                       word++;
+               }
+       }
 
-    /* We need to reset back to normal mode after LRAM test passes. */
-    AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
+       /*
+        * Set 'word' for later use to clear the rest of memory and save
+        * the expanded mcode size.
+        */
+       word *= 2;
+       adv_asc38C1600_expanded_size = word;
+
+       /*
+        * Clear the rest of ASC-38C1600 Internal RAM (32KB).
+        */
+       for (; word < ADV_38C1600_MEMSIZE; word += 2) {
+               AdvWriteWordAutoIncLram(iop_base, 0);
+       }
 
-    /*
-     * Load the Microcode
-     *
-     * Write the microcode image to RISC memory starting at address 0.
-     *
-     */
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
-
-    /* Assume the following compressed format of the microcode buffer:
-     *
-     *  254 word (508 byte) table indexed by byte code followed
-     *  by the following byte codes:
-     *
-     *    1-Byte Code:
-     *      00: Emit word 0 in table.
-     *      01: Emit word 1 in table.
-     *      .
-     *      FD: Emit word 253 in table.
-     *
-     *    Multi-Byte Code:
-     *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
-     *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
-     */
-    word = 0;
-    for (i = 253 * 2; i < _adv_asc38C0800_size; i++)
-    {
-        if (_adv_asc38C0800_buf[i] == 0xff)
-        {
-            for (j = 0; j < _adv_asc38C0800_buf[i + 1]; j++)
-            {
-                AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                    _adv_asc38C0800_buf[i + 3] << 8) |
-                    _adv_asc38C0800_buf[i + 2]));
-                word++;
-            }
-            i += 3;
-        } else if (_adv_asc38C0800_buf[i] == 0xfe)
-        {
-            AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                _adv_asc38C0800_buf[i + 2] << 8) |
-                _adv_asc38C0800_buf[i + 1]));
-            i += 2;
-            word++;
-        } else
-        {
-            AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                _adv_asc38C0800_buf[(_adv_asc38C0800_buf[i] * 2) + 1] << 8) |
-                _adv_asc38C0800_buf[_adv_asc38C0800_buf[i] * 2]));
-            word++;
-        }
-    }
+       /*
+        * Verify the microcode checksum.
+        */
+       sum = 0;
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
 
-    /*
-     * Set 'word' for later use to clear the rest of memory and save
-     * the expanded mcode size.
-     */
-    word *= 2;
-    adv_asc38C0800_expanded_size = word;
+       for (word = 0; word < adv_asc38C1600_expanded_size; word += 2) {
+               sum += AdvReadWordAutoIncLram(iop_base);
+       }
 
-    /*
-     * Clear the rest of ASC-38C0800 Internal RAM (16KB).
-     */
-    for (; word < ADV_38C0800_MEMSIZE; word += 2)
-    {
-        AdvWriteWordAutoIncLram(iop_base, 0);
-    }
+       if (sum != _adv_asc38C1600_chksum) {
+               asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Verify the microcode checksum.
-     */
-    sum = 0;
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
-
-    for (word = 0; word < adv_asc38C0800_expanded_size; word += 2)
-    {
-        sum += AdvReadWordAutoIncLram(iop_base);
-    }
-    ASC_DBG2(1, "AdvInitAsc38C0800Driver: word %d, i %d\n", word, i);
+       /*
+        * Restore the RISC memory BIOS region.
+        */
+       for (i = 0; i < ASC_MC_BIOSLEN / 2; i++) {
+               AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i),
+                                bios_mem[i]);
+       }
 
-    ASC_DBG2(1,
-        "AdvInitAsc38C0800Driver: sum 0x%lx, _adv_asc38C0800_chksum 0x%lx\n",
-        (ulong) sum, (ulong) _adv_asc38C0800_chksum);
+       /*
+        * Calculate and write the microcode code checksum to the microcode
+        * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
+        */
+       AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
+       AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
+       code_sum = 0;
+       AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
+       for (word = begin_addr; word < end_addr; word += 2) {
+               code_sum += AdvReadWordAutoIncLram(iop_base);
+       }
+       AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
+
+       /*
+        * Read microcode version and date.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE,
+                       asc_dvc->cfg->mcode_date);
+       AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM,
+                       asc_dvc->cfg->mcode_version);
+
+       /*
+        * Set the chip type to indicate the ASC38C1600.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C1600);
+
+       /*
+        * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
+        * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
+        * cable detection and then we are able to read C_DET[3:0].
+        *
+        * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
+        * Microcode Default Value' section below.
+        */
+       scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+       AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1,
+                            scsi_cfg1 | DIS_TERM_DRV);
+
+       /*
+        * If the PCI Configuration Command Register "Parity Error Response
+        * Control" Bit was clear (0), then set the microcode variable
+        * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
+        * to ignore DMA parity errors.
+        */
+       if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR) {
+               AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+               word |= CONTROL_FLAG_IGNORE_PERR;
+               AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+       }
 
-    if (sum != _adv_asc38C0800_chksum)
-    {
-        asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
-        return ADV_ERROR;
-    }
+       /*
+        * If the BIOS control flag AIPP (Asynchronous Information
+        * Phase Protection) disable bit is not set, then set the firmware
+        * 'control_flag' CONTROL_FLAG_ENABLE_AIPP bit to enable
+        * AIPP checking and encoding.
+        */
+       if ((asc_dvc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0) {
+               AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+               word |= CONTROL_FLAG_ENABLE_AIPP;
+               AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
+       }
 
-    /*
-     * Restore the RISC memory BIOS region.
-     */
-    for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
-    }
+       /*
+        * For ASC-38C1600 use DMA_CFG0 default values: FIFO_THRESH_80B [6:4],
+        * and START_CTL_TH [3:2].
+        */
+       AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
+                            FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
+
+       /*
+        * Microcode operating variables for WDTR, SDTR, and command tag
+        * queuing will be set in AdvInquiryHandling() based on what a
+        * device reports it is capable of in Inquiry byte 7.
+        *
+        * If SCSI Bus Resets have been disabled, then directly set
+        * SDTR and WDTR from the EEPROM configuration. This will allow
+        * the BIOS and warm boot to work without a SCSI bus hang on
+        * the Inquiry caused by host and target mismatched DTR values.
+        * Without the SCSI Bus Reset, before an Inquiry a device can't
+        * be assumed to be in Asynchronous, Narrow mode.
+        */
+       if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0) {
+               AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
+                                asc_dvc->wdtr_able);
+               AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
+                                asc_dvc->sdtr_able);
+       }
 
-    /*
-     * Calculate and write the microcode code checksum to the microcode
-     * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
-     */
-    AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
-    AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
-    code_sum = 0;
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
-    for (word = begin_addr; word < end_addr; word += 2)
-    {
-        code_sum += AdvReadWordAutoIncLram(iop_base);
-    }
-    AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
+       /*
+        * Set microcode operating variables for DISC and SDTR_SPEED1,
+        * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
+        * configuration values.
+        *
+        * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
+        * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
+        * without determining here whether the device supports SDTR.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE,
+                        asc_dvc->cfg->disc_enable);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
+
+       /*
+        * Set SCSI_CFG0 Microcode Default Value.
+        *
+        * The microcode will set the SCSI_CFG0 register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
+                        PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
+                        asc_dvc->chip_scsi_id);
+
+       /*
+        * Calculate SCSI_CFG1 Microcode Default Value.
+        *
+        * The microcode will set the SCSI_CFG1 register using this value
+        * after it is started below.
+        *
+        * Each ASC-38C1600 function has only two cable detect bits.
+        * The bus mode override bits are in IOPB_SOFT_OVER_WR.
+        */
+       scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+
+       /*
+        * If the cable is reversed all of the SCSI_CTRL register signals
+        * will be set. Check for and return an error if this condition is
+        * found.
+        */
+       if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07) {
+               asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Read microcode version and date.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE, asc_dvc->cfg->mcode_date);
-    AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM, asc_dvc->cfg->mcode_version);
+       /*
+        * Each ASC-38C1600 function has two connectors. Only an HVD device
+        * can not be connected to either connector. An LVD device or SE device
+        * may be connected to either connecor. If an SE device is connected,
+        * then at most Ultra speed (20 Mhz) can be used on both connectors.
+        *
+        * If an HVD device is attached, return an error.
+        */
+       if (scsi_cfg1 & HVD) {
+               asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
+               return ADV_ERROR;
+       }
 
-    /*
-     * Set the chip type to indicate the ASC38C0800.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C0800);
+       /*
+        * Each function in the ASC-38C1600 uses only the SE cable detect and
+        * termination because there are two connectors for each function. Each
+        * function may use either LVD or SE mode. Corresponding the SE automatic
+        * termination control EEPROM bits are used for each function. Each
+        * function has its own EEPROM. If SE automatic control is enabled for
+        * the function, then set the termination value based on a table listed
+        * in a_condor.h.
+        *
+        * If manual termination is specified in the EEPROM for the function,
+        * then 'termination' was set-up in AscInitFrom38C1600EEPROM() and is
+        * ready to be 'ored' into SCSI_CFG1.
+        */
+       if ((asc_dvc->cfg->termination & TERM_SE) == 0) {
+               /* SE automatic termination control is enabled. */
+               switch (scsi_cfg1 & C_DET_SE) {
+                       /* TERM_SE_HI: on, TERM_SE_LO: on */
+               case 0x1:
+               case 0x2:
+               case 0x3:
+                       asc_dvc->cfg->termination |= TERM_SE;
+                       break;
+
+               case 0x0:
+                       if (ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) == 0) {
+                               /* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */
+                       } else {
+                               /* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */
+                               asc_dvc->cfg->termination |= TERM_SE_HI;
+                       }
+                       break;
+               }
+       }
 
-    /*
-     * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
-     * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
-     * cable detection and then we are able to read C_DET[3:0].
-     *
-     * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
-     * Microcode Default Value' section below.
-     */
-    scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
-    AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1, scsi_cfg1 | DIS_TERM_DRV);
+       /*
+        * Clear any set TERM_SE bits.
+        */
+       scsi_cfg1 &= ~TERM_SE;
+
+       /*
+        * Invert the TERM_SE bits and then set 'scsi_cfg1'.
+        */
+       scsi_cfg1 |= (~asc_dvc->cfg->termination & TERM_SE);
+
+       /*
+        * Clear Big Endian and Terminator Polarity bits and set possibly
+        * modified termination control bits in the Microcode SCSI_CFG1
+        * Register Value.
+        *
+        * Big Endian bit is not used even on big endian machines.
+        */
+       scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL);
+
+       /*
+        * Set SCSI_CFG1 Microcode Default Value
+        *
+        * Set possibly modified termination control bits in the Microcode
+        * SCSI_CFG1 Register Value.
+        *
+        * The microcode will set the SCSI_CFG1 register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
+
+       /*
+        * Set MEM_CFG Microcode Default Value
+        *
+        * The microcode will set the MEM_CFG register using this value
+        * after it is started below.
+        *
+        * MEM_CFG may be accessed as a word or byte, but only bits 0-7
+        * are defined.
+        *
+        * ASC-38C1600 has 32KB internal memory.
+        *
+        * XXX - Since ASC38C1600 Rev.3 has a Local RAM failure issue, we come
+        * out a special 16K Adv Library and Microcode version. After the issue
+        * resolved, we should turn back to the 32K support. Both a_condor.h and
+        * mcode.sas files also need to be updated.
+        *
+        * AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
+        *  BIOS_EN | RAM_SZ_32KB);
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
+                        BIOS_EN | RAM_SZ_16KB);
+
+       /*
+        * Set SEL_MASK Microcode Default Value
+        *
+        * The microcode will set the SEL_MASK register using this value
+        * after it is started below.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
+                        ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
+
+       /*
+        * Build the carrier freelist.
+        *
+        * Driver must have already allocated memory and set 'carrier_buf'.
+        */
+
+       ASC_ASSERT(asc_dvc->carrier_buf != NULL);
+
+       carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
+       asc_dvc->carr_freelist = NULL;
+       if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf) {
+               buf_size = ADV_CARRIER_BUFSIZE;
+       } else {
+               buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
+       }
 
-    /*
-     * If the PCI Configuration Command Register "Parity Error Response
-     * Control" Bit was clear (0), then set the microcode variable
-     * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
-     * to ignore DMA parity errors.
-     */
-    if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-        word |= CONTROL_FLAG_IGNORE_PERR;
-        AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-    }
+       do {
+               /*
+                * Get physical address for the carrier 'carrp'.
+                */
+               contig_len = sizeof(ADV_CARR_T);
+               carr_paddr =
+                   cpu_to_le32(DvcGetPhyAddr
+                               (asc_dvc, NULL, (uchar *)carrp,
+                                (ADV_SDCNT *)&contig_len,
+                                ADV_IS_CARRIER_FLAG));
 
-    /*
-     * For ASC-38C0800, set FIFO_THRESH_80B [6:4] bits and START_CTL_TH [3:2]
-     * bits for the default FIFO threshold.
-     *
-     * Note: ASC-38C0800 FIFO threshold has been changed to 256 bytes.
-     *
-     * For DMA Errata #4 set the BC_THRESH_ENB bit.
-     */
-    AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
-        BC_THRESH_ENB | FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
+               buf_size -= sizeof(ADV_CARR_T);
 
-    /*
-     * Microcode operating variables for WDTR, SDTR, and command tag
-     * queuing will be set in AdvInquiryHandling() based on what a
-     * device reports it is capable of in Inquiry byte 7.
-     *
-     * If SCSI Bus Resets have been disabled, then directly set
-     * SDTR and WDTR from the EEPROM configuration. This will allow
-     * the BIOS and warm boot to work without a SCSI bus hang on
-     * the Inquiry caused by host and target mismatched DTR values.
-     * Without the SCSI Bus Reset, before an Inquiry a device can't
-     * be assumed to be in Asynchronous, Narrow mode.
-     */
-    if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, asc_dvc->wdtr_able);
-        AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, asc_dvc->sdtr_able);
-    }
+               /*
+                * If the current carrier is not physically contiguous, then
+                * maybe there was a page crossing. Try the next carrier aligned
+                * start address.
+                */
+               if (contig_len < sizeof(ADV_CARR_T)) {
+                       carrp++;
+                       continue;
+               }
+
+               carrp->carr_pa = carr_paddr;
+               carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
 
-    /*
-     * Set microcode operating variables for DISC and SDTR_SPEED1,
-     * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
-     * configuration values.
-     *
-     * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
-     * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
-     * without determining here whether the device supports SDTR.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE, asc_dvc->cfg->disc_enable);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
+               /*
+                * Insert the carrier at the beginning of the freelist.
+                */
+               carrp->next_vpa =
+                   cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
+               asc_dvc->carr_freelist = carrp;
 
-    /*
-     * Set SCSI_CFG0 Microcode Default Value.
-     *
-     * The microcode will set the SCSI_CFG0 register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
-        PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
-        asc_dvc->chip_scsi_id);
+               carrp++;
+       }
+       while (buf_size > 0);
+
+       /*
+        * Set-up the Host->RISC Initiator Command Queue (ICQ).
+        */
+       if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL) {
+               asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
+               return ADV_ERROR;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
+
+       /*
+        * The first command issued will be placed in the stopper carrier.
+        */
+       asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Set RISC ICQ physical address start value. Initialize the
+        * COMMA register to the same value otherwise the RISC will
+        * prematurely detect a command is available.
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
+       AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
+                             le32_to_cpu(asc_dvc->icq_sp->carr_pa));
+
+       /*
+        * Set-up the RISC->Host Initiator Response Queue (IRQ).
+        */
+       if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL) {
+               asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
+               return ADV_ERROR;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
+
+       /*
+        * The first command completed by the RISC will be placed in
+        * the stopper.
+        *
+        * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
+        * completed the RISC will set the ASC_RQ_STOPPER bit.
+        */
+       asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Set RISC IRQ physical address start value.
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
+       asc_dvc->carr_pending_cnt = 0;
+
+       AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
+                            (ADV_INTR_ENABLE_HOST_INTR |
+                             ADV_INTR_ENABLE_GLOBAL_INTR));
+       AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
+       AdvWriteWordRegister(iop_base, IOPW_PC, word);
+
+       /* finally, finally, gentlemen, start your engine */
+       AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
+
+       /*
+        * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
+        * Resets should be performed. The RISC has to be running
+        * to issue a SCSI Bus Reset.
+        */
+       if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) {
+               /*
+                * If the BIOS Signature is present in memory, restore the
+                * per TID microcode operating variables.
+                */
+               if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM) / 2] ==
+                   0x55AA) {
+                       /*
+                        * Restore per TID negotiated values.
+                        */
+                       AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
+                       AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
+                                        tagqng_able);
+                       for (tid = 0; tid <= ASC_MAX_TID; tid++) {
+                               AdvWriteByteLram(iop_base,
+                                                ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                                                max_cmd[tid]);
+                       }
+               } else {
+                       if (AdvResetSB(asc_dvc) != ADV_TRUE) {
+                               warn_code = ASC_WARN_BUSRESET_ERROR;
+                       }
+               }
+       }
 
-    /*
-     * Determine SCSI_CFG1 Microcode Default Value.
-     *
-     * The microcode will set the SCSI_CFG1 register using this value
-     * after it is started below.
-     */
+       return warn_code;
+}
 
-    /* Read current SCSI_CFG1 Register value. */
-    scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
+/*
+ * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
+ * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
+ * all of this is done.
+ *
+ * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
+ *
+ * For a non-fatal error return a warning code. If there are no warnings
+ * then 0 is returned.
+ *
+ * Note: Chip is stopped on entry.
+ */
+static int __init AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
+{
+       AdvPortAddr iop_base;
+       ushort warn_code;
+       ADVEEP_3550_CONFIG eep_config;
+       int i;
 
-    /*
-     * If the internal narrow cable is reversed all of the SCSI_CTRL
-     * register signals will be set. Check for and return an error if
-     * this condition is found.
-     */
-    if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07)
-    {
-        asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
-        return ADV_ERROR;
-    }
+       iop_base = asc_dvc->iop_base;
 
-    /*
-     * All kind of combinations of devices attached to one of four connectors
-     * are acceptable except HVD device attached. For example, LVD device can
-     * be attached to SE connector while SE device attached to LVD connector.
-     * If LVD device attached to SE connector, it only runs up to Ultra speed.
-     *
-     * If an HVD device is attached to one of LVD connectors, return an error.
-     * However, there is no way to detect HVD device attached to SE connectors.
-     */
-    if (scsi_cfg1 & HVD)
-    {
-        asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
-        return ADV_ERROR;
-    }
+       warn_code = 0;
 
-    /*
-     * If either SE or LVD automatic termination control is enabled, then
-     * set the termination value based on a table listed in a_condor.h.
-     *
-     * If manual termination was specified with an EEPROM setting then
-     * 'termination' was set-up in AdvInitFrom38C0800EEPROM() and is ready to
-     * be 'ored' into SCSI_CFG1.
-     */
-    if ((asc_dvc->cfg->termination & TERM_SE) == 0)
-    {
-        /* SE automatic termination control is enabled. */
-        switch(scsi_cfg1 & C_DET_SE)
-        {
-            /* TERM_SE_HI: on, TERM_SE_LO: on */
-            case 0x1: case 0x2: case 0x3:
-                asc_dvc->cfg->termination |= TERM_SE;
-                break;
-
-            /* TERM_SE_HI: on, TERM_SE_LO: off */
-            case 0x0:
-                asc_dvc->cfg->termination |= TERM_SE_HI;
-                break;
-        }
-    }
+       /*
+        * Read the board's EEPROM configuration.
+        *
+        * Set default values if a bad checksum is found.
+        */
+       if (AdvGet3550EEPConfig(iop_base, &eep_config) != eep_config.check_sum) {
+               warn_code |= ASC_WARN_EEPROM_CHKSUM;
 
-    if ((asc_dvc->cfg->termination & TERM_LVD) == 0)
-    {
-        /* LVD automatic termination control is enabled. */
-        switch(scsi_cfg1 & C_DET_LVD)
-        {
-            /* TERM_LVD_HI: on, TERM_LVD_LO: on */
-            case 0x4: case 0x8: case 0xC:
-                asc_dvc->cfg->termination |= TERM_LVD;
-                break;
-
-            /* TERM_LVD_HI: off, TERM_LVD_LO: off */
-            case 0x0:
-                break;
-        }
-    }
+               /*
+                * Set EEPROM default values.
+                */
+               for (i = 0; i < sizeof(ADVEEP_3550_CONFIG); i++) {
+                       *((uchar *)&eep_config + i) =
+                           *((uchar *)&Default_3550_EEPROM_Config + i);
+               }
 
-    /*
-     * Clear any set TERM_SE and TERM_LVD bits.
-     */
-    scsi_cfg1 &= (~TERM_SE & ~TERM_LVD);
+               /*
+                * Assume the 6 byte board serial number that was read
+                * from EEPROM is correct even if the EEPROM checksum
+                * failed.
+                */
+               eep_config.serial_number_word3 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
 
-    /*
-     * Invert the TERM_SE and TERM_LVD bits and then set 'scsi_cfg1'.
-     */
-    scsi_cfg1 |= (~asc_dvc->cfg->termination & 0xF0);
+               eep_config.serial_number_word2 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
 
-    /*
-     * Clear BIG_ENDIAN, DIS_TERM_DRV, Terminator Polarity and HVD/LVD/SE bits
-     * and set possibly modified termination control bits in the Microcode
-     * SCSI_CFG1 Register Value.
-     */
-    scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL & ~HVD_LVD_SE);
+               eep_config.serial_number_word1 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
 
-    /*
-     * Set SCSI_CFG1 Microcode Default Value
-     *
-     * Set possibly modified termination control and reset DIS_TERM_DRV
-     * bits in the Microcode SCSI_CFG1 Register Value.
-     *
-     * The microcode will set the SCSI_CFG1 register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
+               AdvSet3550EEPConfig(iop_base, &eep_config);
+       }
+       /*
+        * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
+        * EEPROM configuration that was read.
+        *
+        * This is the mapping of EEPROM fields to Adv Library fields.
+        */
+       asc_dvc->wdtr_able = eep_config.wdtr_able;
+       asc_dvc->sdtr_able = eep_config.sdtr_able;
+       asc_dvc->ultra_able = eep_config.ultra_able;
+       asc_dvc->tagqng_able = eep_config.tagqng_able;
+       asc_dvc->cfg->disc_enable = eep_config.disc_enable;
+       asc_dvc->max_host_qng = eep_config.max_host_qng;
+       asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+       asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
+       asc_dvc->start_motor = eep_config.start_motor;
+       asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
+       asc_dvc->bios_ctrl = eep_config.bios_ctrl;
+       asc_dvc->no_scam = eep_config.scam_tolerant;
+       asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
+       asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
+       asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
+
+       /*
+        * Set the host maximum queuing (max. 253, min. 16) and the per device
+        * maximum queuing (max. 63, min. 4).
+        */
+       if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
+               eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
+       } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
+               /* If the value is zero, assume it is uninitialized. */
+               if (eep_config.max_host_qng == 0) {
+                       eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
+               } else {
+                       eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
+               }
+       }
 
-    /*
-     * Set MEM_CFG Microcode Default Value
-     *
-     * The microcode will set the MEM_CFG register using this value
-     * after it is started below.
-     *
-     * MEM_CFG may be accessed as a word or byte, but only bits 0-7
-     * are defined.
-     *
-     * ASC-38C0800 has 16KB internal memory.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
-        BIOS_EN | RAM_SZ_16KB);
+       if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
+               eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
+       } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
+               /* If the value is zero, assume it is uninitialized. */
+               if (eep_config.max_dvc_qng == 0) {
+                       eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
+               } else {
+                       eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
+               }
+       }
 
-    /*
-     * Set SEL_MASK Microcode Default Value
-     *
-     * The microcode will set the SEL_MASK register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
-        ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
+       /*
+        * If 'max_dvc_qng' is greater than 'max_host_qng', then
+        * set 'max_dvc_qng' to 'max_host_qng'.
+        */
+       if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
+               eep_config.max_dvc_qng = eep_config.max_host_qng;
+       }
 
-    /*
-     * Build the carrier freelist.
-     *
-     * Driver must have already allocated memory and set 'carrier_buf'.
-     */
-    ASC_ASSERT(asc_dvc->carrier_buf != NULL);
-
-    carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
-    asc_dvc->carr_freelist = NULL;
-    if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf)
-    {
-        buf_size = ADV_CARRIER_BUFSIZE;
-    } else
-    {
-        buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
-    }
+       /*
+        * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
+        * values based on possibly adjusted EEPROM values.
+        */
+       asc_dvc->max_host_qng = eep_config.max_host_qng;
+       asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+
+       /*
+        * If the EEPROM 'termination' field is set to automatic (0), then set
+        * the ADV_DVC_CFG 'termination' field to automatic also.
+        *
+        * If the termination is specified with a non-zero 'termination'
+        * value check that a legal value is set and set the ADV_DVC_CFG
+        * 'termination' field appropriately.
+        */
+       if (eep_config.termination == 0) {
+               asc_dvc->cfg->termination = 0;  /* auto termination */
+       } else {
+               /* Enable manual control with low off / high off. */
+               if (eep_config.termination == 1) {
+                       asc_dvc->cfg->termination = TERM_CTL_SEL;
+
+                       /* Enable manual control with low off / high on. */
+               } else if (eep_config.termination == 2) {
+                       asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H;
+
+                       /* Enable manual control with low on / high on. */
+               } else if (eep_config.termination == 3) {
+                       asc_dvc->cfg->termination =
+                           TERM_CTL_SEL | TERM_CTL_H | TERM_CTL_L;
+               } else {
+                       /*
+                        * The EEPROM 'termination' field contains a bad value. Use
+                        * automatic termination instead.
+                        */
+                       asc_dvc->cfg->termination = 0;
+                       warn_code |= ASC_WARN_EEPROM_TERMINATION;
+               }
+       }
 
-    do {
-        /*
-         * Get physical address for the carrier 'carrp'.
-         */
-        contig_len = sizeof(ADV_CARR_T);
-        carr_paddr = cpu_to_le32(DvcGetPhyAddr(asc_dvc, NULL, (uchar *) carrp,
-            (ADV_SDCNT *) &contig_len, ADV_IS_CARRIER_FLAG));
-
-        buf_size -= sizeof(ADV_CARR_T);
-
-        /*
-         * If the current carrier is not physically contiguous, then
-         * maybe there was a page crossing. Try the next carrier aligned
-         * start address.
-         */
-        if (contig_len < sizeof(ADV_CARR_T))
-        {
-            carrp++;
-            continue;
-        }
-
-        carrp->carr_pa = carr_paddr;
-        carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
-
-        /*
-         * Insert the carrier at the beginning of the freelist.
-         */
-        carrp->next_vpa = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
-        asc_dvc->carr_freelist = carrp;
-
-        carrp++;
-    }
-    while (buf_size > 0);
+       return warn_code;
+}
 
-    /*
-     * Set-up the Host->RISC Initiator Command Queue (ICQ).
-     */
+/*
+ * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
+ * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
+ * all of this is done.
+ *
+ * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
+ *
+ * For a non-fatal error return a warning code. If there are no warnings
+ * then 0 is returned.
+ *
+ * Note: Chip is stopped on entry.
+ */
+static int __init AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
+{
+       AdvPortAddr iop_base;
+       ushort warn_code;
+       ADVEEP_38C0800_CONFIG eep_config;
+       int i;
+       uchar tid, termination;
+       ushort sdtr_speed = 0;
+
+       iop_base = asc_dvc->iop_base;
+
+       warn_code = 0;
+
+       /*
+        * Read the board's EEPROM configuration.
+        *
+        * Set default values if a bad checksum is found.
+        */
+       if (AdvGet38C0800EEPConfig(iop_base, &eep_config) !=
+           eep_config.check_sum) {
+               warn_code |= ASC_WARN_EEPROM_CHKSUM;
 
-    if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL)
-    {
-        asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
-        return ADV_ERROR;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-        ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
+               /*
+                * Set EEPROM default values.
+                */
+               for (i = 0; i < sizeof(ADVEEP_38C0800_CONFIG); i++) {
+                       *((uchar *)&eep_config + i) =
+                           *((uchar *)&Default_38C0800_EEPROM_Config + i);
+               }
 
-    /*
-     * The first command issued will be placed in the stopper carrier.
-     */
-    asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+               /*
+                * Assume the 6 byte board serial number that was read
+                * from EEPROM is correct even if the EEPROM checksum
+                * failed.
+                */
+               eep_config.serial_number_word3 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
 
-    /*
-     * Set RISC ICQ physical address start value.
-     * carr_pa is LE, must be native before write
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
+               eep_config.serial_number_word2 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
 
-    /*
-     * Set-up the RISC->Host Initiator Response Queue (IRQ).
-     */
-    if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL)
-    {
-        asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
-        return ADV_ERROR;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-        ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
+               eep_config.serial_number_word1 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
 
-    /*
-     * The first command completed by the RISC will be placed in
-     * the stopper.
-     *
-     * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
-     * completed the RISC will set the ASC_RQ_STOPPER bit.
-     */
-    asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+               AdvSet38C0800EEPConfig(iop_base, &eep_config);
+       }
+       /*
+        * Set ADV_DVC_VAR and ADV_DVC_CFG variables from the
+        * EEPROM configuration that was read.
+        *
+        * This is the mapping of EEPROM fields to Adv Library fields.
+        */
+       asc_dvc->wdtr_able = eep_config.wdtr_able;
+       asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
+       asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
+       asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
+       asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
+       asc_dvc->tagqng_able = eep_config.tagqng_able;
+       asc_dvc->cfg->disc_enable = eep_config.disc_enable;
+       asc_dvc->max_host_qng = eep_config.max_host_qng;
+       asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+       asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
+       asc_dvc->start_motor = eep_config.start_motor;
+       asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
+       asc_dvc->bios_ctrl = eep_config.bios_ctrl;
+       asc_dvc->no_scam = eep_config.scam_tolerant;
+       asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
+       asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
+       asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
+
+       /*
+        * For every Target ID if any of its 'sdtr_speed[1234]' bits
+        * are set, then set an 'sdtr_able' bit for it.
+        */
+       asc_dvc->sdtr_able = 0;
+       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+               if (tid == 0) {
+                       sdtr_speed = asc_dvc->sdtr_speed1;
+               } else if (tid == 4) {
+                       sdtr_speed = asc_dvc->sdtr_speed2;
+               } else if (tid == 8) {
+                       sdtr_speed = asc_dvc->sdtr_speed3;
+               } else if (tid == 12) {
+                       sdtr_speed = asc_dvc->sdtr_speed4;
+               }
+               if (sdtr_speed & ADV_MAX_TID) {
+                       asc_dvc->sdtr_able |= (1 << tid);
+               }
+               sdtr_speed >>= 4;
+       }
 
-    /*
-     * Set RISC IRQ physical address start value.
-     *
-     * carr_pa is LE, must be native before write *
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
-    asc_dvc->carr_pending_cnt = 0;
+       /*
+        * Set the host maximum queuing (max. 253, min. 16) and the per device
+        * maximum queuing (max. 63, min. 4).
+        */
+       if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
+               eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
+       } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
+               /* If the value is zero, assume it is uninitialized. */
+               if (eep_config.max_host_qng == 0) {
+                       eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
+               } else {
+                       eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
+               }
+       }
 
-    AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
-        (ADV_INTR_ENABLE_HOST_INTR | ADV_INTR_ENABLE_GLOBAL_INTR));
+       if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
+               eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
+       } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
+               /* If the value is zero, assume it is uninitialized. */
+               if (eep_config.max_dvc_qng == 0) {
+                       eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
+               } else {
+                       eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
+               }
+       }
 
-    AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
-    AdvWriteWordRegister(iop_base, IOPW_PC, word);
+       /*
+        * If 'max_dvc_qng' is greater than 'max_host_qng', then
+        * set 'max_dvc_qng' to 'max_host_qng'.
+        */
+       if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
+               eep_config.max_dvc_qng = eep_config.max_host_qng;
+       }
 
-    /* finally, finally, gentlemen, start your engine */
-    AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
+       /*
+        * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
+        * values based on possibly adjusted EEPROM values.
+        */
+       asc_dvc->max_host_qng = eep_config.max_host_qng;
+       asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+
+       /*
+        * If the EEPROM 'termination' field is set to automatic (0), then set
+        * the ADV_DVC_CFG 'termination' field to automatic also.
+        *
+        * If the termination is specified with a non-zero 'termination'
+        * value check that a legal value is set and set the ADV_DVC_CFG
+        * 'termination' field appropriately.
+        */
+       if (eep_config.termination_se == 0) {
+               termination = 0;        /* auto termination for SE */
+       } else {
+               /* Enable manual control with low off / high off. */
+               if (eep_config.termination_se == 1) {
+                       termination = 0;
+
+                       /* Enable manual control with low off / high on. */
+               } else if (eep_config.termination_se == 2) {
+                       termination = TERM_SE_HI;
+
+                       /* Enable manual control with low on / high on. */
+               } else if (eep_config.termination_se == 3) {
+                       termination = TERM_SE;
+               } else {
+                       /*
+                        * The EEPROM 'termination_se' field contains a bad value.
+                        * Use automatic termination instead.
+                        */
+                       termination = 0;
+                       warn_code |= ASC_WARN_EEPROM_TERMINATION;
+               }
+       }
 
-    /*
-     * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
-     * Resets should be performed. The RISC has to be running
-     * to issue a SCSI Bus Reset.
-     */
-    if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
-    {
-        /*
-         * If the BIOS Signature is present in memory, restore the
-         * BIOS Handshake Configuration Table and do not perform
-         * a SCSI Bus Reset.
-         */
-        if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
-        {
-            /*
-             * Restore per TID negotiated values.
-             */
-            AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-            for (tid = 0; tid <= ADV_MAX_TID; tid++)
-            {
-                AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-                    max_cmd[tid]);
-            }
-        } else
-        {
-            if (AdvResetSB(asc_dvc) != ADV_TRUE)
-            {
-                warn_code = ASC_WARN_BUSRESET_ERROR;
-            }
-        }
-    }
+       if (eep_config.termination_lvd == 0) {
+               asc_dvc->cfg->termination = termination;        /* auto termination for LVD */
+       } else {
+               /* Enable manual control with low off / high off. */
+               if (eep_config.termination_lvd == 1) {
+                       asc_dvc->cfg->termination = termination;
+
+                       /* Enable manual control with low off / high on. */
+               } else if (eep_config.termination_lvd == 2) {
+                       asc_dvc->cfg->termination = termination | TERM_LVD_HI;
+
+                       /* Enable manual control with low on / high on. */
+               } else if (eep_config.termination_lvd == 3) {
+                       asc_dvc->cfg->termination = termination | TERM_LVD;
+               } else {
+                       /*
+                        * The EEPROM 'termination_lvd' field contains a bad value.
+                        * Use automatic termination instead.
+                        */
+                       asc_dvc->cfg->termination = termination;
+                       warn_code |= ASC_WARN_EEPROM_TERMINATION;
+               }
+       }
 
-    return warn_code;
+       return warn_code;
 }
 
 /*
- * Initialize the ASC-38C1600.
+ * Read the board's EEPROM configuration. Set fields in ASC_DVC_VAR and
+ * ASC_DVC_CFG based on the EEPROM settings. The chip is stopped while
+ * all of this is done.
  *
  * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
  *
  * For a non-fatal error return a warning code. If there are no warnings
  * then 0 is returned.
  *
- * Needed after initialization for error recovery.
+ * Note: Chip is stopped on entry.
  */
-STATIC int
-AdvInitAsc38C1600Driver(ADV_DVC_VAR *asc_dvc)
+static int __init AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
 {
-    AdvPortAddr iop_base;
-    ushort      warn_code;
-    ADV_DCNT    sum;
-    int         begin_addr;
-    int         end_addr;
-    ushort      code_sum;
-    long        word;
-    int         j;
-    int         adv_asc38C1600_expanded_size;
-    ADV_CARR_T  *carrp;
-    ADV_DCNT    contig_len;
-    ADV_SDCNT   buf_size;
-    ADV_PADDR   carr_paddr;
-    int         i;
-    ushort      scsi_cfg1;
-    uchar       byte;
-    uchar       tid;
-    ushort      bios_mem[ASC_MC_BIOSLEN/2]; /* BIOS RISC Memory 0x40-0x8F. */
-    ushort      wdtr_able, sdtr_able, ppr_able, tagqng_able;
-    uchar       max_cmd[ASC_MAX_TID + 1];
-
-    /* If there is already an error, don't continue. */
-    if (asc_dvc->err_code != 0)
-    {
-        return ADV_ERROR;
-    }
-
-    /*
-     * The caller must set 'chip_type' to ADV_CHIP_ASC38C1600.
-     */
-    if (asc_dvc->chip_type != ADV_CHIP_ASC38C1600)
-    {
-        asc_dvc->err_code = ASC_IERR_BAD_CHIPTYPE;
-        return ADV_ERROR;
-    }
-
-    warn_code = 0;
-    iop_base = asc_dvc->iop_base;
-
-    /*
-     * Save the RISC memory BIOS region before writing the microcode.
-     * The BIOS may already be loaded and using its RISC LRAM region
-     * so its region must be saved and restored.
-     *
-     * Note: This code makes the assumption, which is currently true,
-     * that a chip reset does not clear RISC LRAM.
-     */
-    for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
-    }
-
-    /*
-     * Save current per TID negotiated values.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-    AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-    AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
-    AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-    for (tid = 0; tid <= ASC_MAX_TID; tid++)
-    {
-        AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-            max_cmd[tid]);
-    }
-
-    /*
-     * RAM BIST (Built-In Self Test)
-     *
-     * Address : I/O base + offset 0x38h register (byte).
-     * Function: Bit 7-6(RW) : RAM mode
-     *                          Normal Mode   : 0x00
-     *                          Pre-test Mode : 0x40
-     *                          RAM Test Mode : 0x80
-     *           Bit 5       : unused
-     *           Bit 4(RO)   : Done bit
-     *           Bit 3-0(RO) : Status
-     *                          Host Error    : 0x08
-     *                          Int_RAM Error : 0x04
-     *                          RISC Error    : 0x02
-     *                          SCSI Error    : 0x01
-     *                          No Error      : 0x00
-     *
-     * Note: RAM BIST code should be put right here, before loading the
-     * microcode and after saving the RISC memory BIOS region.
-     */
-
-    /*
-     * LRAM Pre-test
-     *
-     * Write PRE_TEST_MODE (0x40) to register and wait for 10 milliseconds.
-     * If Done bit not set or low nibble not PRE_TEST_VALUE (0x05), return
-     * an error. Reset to NORMAL_MODE (0x00) and do again. If cannot reset
-     * to NORMAL_MODE, return an error too.
-     */
-    for (i = 0; i < 2; i++)
-    {
-        AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, PRE_TEST_MODE);
-        DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
-        byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
-        if ((byte & RAM_TEST_DONE) == 0 || (byte & 0x0F) != PRE_TEST_VALUE)
-        {
-            asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
-            return ADV_ERROR;
-        }
-
-        AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
-        DvcSleepMilliSecond(10);  /* Wait for 10ms before reading back. */
-        if (AdvReadByteRegister(iop_base, IOPB_RAM_BIST)
-            != NORMAL_VALUE)
-        {
-            asc_dvc->err_code |= ASC_IERR_BIST_PRE_TEST;
-            return ADV_ERROR;
-        }
-    }
-
-    /*
-     * LRAM Test - It takes about 1.5 ms to run through the test.
-     *
-     * Write RAM_TEST_MODE (0x80) to register and wait for 10 milliseconds.
-     * If Done bit not set or Status not 0, save register byte, set the
-     * err_code, and return an error.
-     */
-    AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, RAM_TEST_MODE);
-    DvcSleepMilliSecond(10);  /* Wait for 10ms before checking status. */
-
-    byte = AdvReadByteRegister(iop_base, IOPB_RAM_BIST);
-    if ((byte & RAM_TEST_DONE) == 0 || (byte & RAM_TEST_STATUS) != 0)
-    {
-        /* Get here if Done bit not set or Status not 0. */
-        asc_dvc->bist_err_code = byte;  /* for BIOS display message */
-        asc_dvc->err_code |= ASC_IERR_BIST_RAM_TEST;
-        return ADV_ERROR;
-    }
-
-    /* We need to reset back to normal mode after LRAM test passes. */
-    AdvWriteByteRegister(iop_base, IOPB_RAM_BIST, NORMAL_MODE);
-
-    /*
-     * Load the Microcode
-     *
-     * Write the microcode image to RISC memory starting at address 0.
-     *
-     */
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
-
-    /*
-     * Assume the following compressed format of the microcode buffer:
-     *
-     *  254 word (508 byte) table indexed by byte code followed
-     *  by the following byte codes:
-     *
-     *    1-Byte Code:
-     *      00: Emit word 0 in table.
-     *      01: Emit word 1 in table.
-     *      .
-     *      FD: Emit word 253 in table.
-     *
-     *    Multi-Byte Code:
-     *      FE WW WW: (3 byte code) Word to emit is the next word WW WW.
-     *      FF BB WW WW: (4 byte code) Emit BB count times next word WW WW.
-     */
-    word = 0;
-    for (i = 253 * 2; i < _adv_asc38C1600_size; i++)
-    {
-        if (_adv_asc38C1600_buf[i] == 0xff)
-        {
-            for (j = 0; j < _adv_asc38C1600_buf[i + 1]; j++)
-            {
-                AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                     _adv_asc38C1600_buf[i + 3] << 8) |
-                     _adv_asc38C1600_buf[i + 2]));
-                word++;
-            }
-           i += 3;
-        } else if (_adv_asc38C1600_buf[i] == 0xfe)
-        {
-                AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                     _adv_asc38C1600_buf[i + 2] << 8) |
-                     _adv_asc38C1600_buf[i + 1]));
-            i += 2;
-            word++;
-        } else
-        {
-            AdvWriteWordAutoIncLram(iop_base, (((ushort)
-                 _adv_asc38C1600_buf[(_adv_asc38C1600_buf[i] * 2) + 1] << 8) |
-                 _adv_asc38C1600_buf[_adv_asc38C1600_buf[i] * 2]));
-            word++;
-        }
-    }
-
-    /*
-     * Set 'word' for later use to clear the rest of memory and save
-     * the expanded mcode size.
-     */
-    word *= 2;
-    adv_asc38C1600_expanded_size = word;
-
-    /*
-     * Clear the rest of ASC-38C1600 Internal RAM (32KB).
-     */
-    for (; word < ADV_38C1600_MEMSIZE; word += 2)
-    {
-        AdvWriteWordAutoIncLram(iop_base, 0);
-    }
-
-    /*
-     * Verify the microcode checksum.
-     */
-    sum = 0;
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, 0);
-
-    for (word = 0; word < adv_asc38C1600_expanded_size; word += 2)
-    {
-        sum += AdvReadWordAutoIncLram(iop_base);
-    }
-
-    if (sum != _adv_asc38C1600_chksum)
-    {
-        asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
-        return ADV_ERROR;
-    }
-
-    /*
-     * Restore the RISC memory BIOS region.
-     */
-    for (i = 0; i < ASC_MC_BIOSLEN/2; i++)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_BIOSMEM + (2 * i), bios_mem[i]);
-    }
-
-    /*
-     * Calculate and write the microcode code checksum to the microcode
-     * code checksum location ASC_MC_CODE_CHK_SUM (0x2C).
-     */
-    AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, begin_addr);
-    AdvReadWordLram(iop_base, ASC_MC_CODE_END_ADDR, end_addr);
-    code_sum = 0;
-    AdvWriteWordRegister(iop_base, IOPW_RAM_ADDR, begin_addr);
-    for (word = begin_addr; word < end_addr; word += 2)
-    {
-        code_sum += AdvReadWordAutoIncLram(iop_base);
-    }
-    AdvWriteWordLram(iop_base, ASC_MC_CODE_CHK_SUM, code_sum);
-
-    /*
-     * Read microcode version and date.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_VERSION_DATE, asc_dvc->cfg->mcode_date);
-    AdvReadWordLram(iop_base, ASC_MC_VERSION_NUM, asc_dvc->cfg->mcode_version);
-
-    /*
-     * Set the chip type to indicate the ASC38C1600.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_CHIP_TYPE, ADV_CHIP_ASC38C1600);
-
-    /*
-     * Write 1 to bit 14 'DIS_TERM_DRV' in the SCSI_CFG1 register.
-     * When DIS_TERM_DRV set to 1, C_DET[3:0] will reflect current
-     * cable detection and then we are able to read C_DET[3:0].
-     *
-     * Note: We will reset DIS_TERM_DRV to 0 in the 'Set SCSI_CFG1
-     * Microcode Default Value' section below.
-     */
-    scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
-    AdvWriteWordRegister(iop_base, IOPW_SCSI_CFG1, scsi_cfg1 | DIS_TERM_DRV);
-
-    /*
-     * If the PCI Configuration Command Register "Parity Error Response
-     * Control" Bit was clear (0), then set the microcode variable
-     * 'control_flag' CONTROL_FLAG_IGNORE_PERR flag to tell the microcode
-     * to ignore DMA parity errors.
-     */
-    if (asc_dvc->cfg->control_flag & CONTROL_FLAG_IGNORE_PERR)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-        word |= CONTROL_FLAG_IGNORE_PERR;
-        AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-    }
-
-    /*
-     * If the BIOS control flag AIPP (Asynchronous Information
-     * Phase Protection) disable bit is not set, then set the firmware
-     * 'control_flag' CONTROL_FLAG_ENABLE_AIPP bit to enable
-     * AIPP checking and encoding.
-     */
-    if ((asc_dvc->bios_ctrl & BIOS_CTRL_AIPP_DIS) == 0)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-        word |= CONTROL_FLAG_ENABLE_AIPP;
-        AdvWriteWordLram(iop_base, ASC_MC_CONTROL_FLAG, word);
-    }
-
-    /*
-     * For ASC-38C1600 use DMA_CFG0 default values: FIFO_THRESH_80B [6:4],
-     * and START_CTL_TH [3:2].
-     */
-    AdvWriteByteRegister(iop_base, IOPB_DMA_CFG0,
-        FIFO_THRESH_80B | START_CTL_TH | READ_CMD_MRM);
-
-    /*
-     * Microcode operating variables for WDTR, SDTR, and command tag
-     * queuing will be set in AdvInquiryHandling() based on what a
-     * device reports it is capable of in Inquiry byte 7.
-     *
-     * If SCSI Bus Resets have been disabled, then directly set
-     * SDTR and WDTR from the EEPROM configuration. This will allow
-     * the BIOS and warm boot to work without a SCSI bus hang on
-     * the Inquiry caused by host and target mismatched DTR values.
-     * Without the SCSI Bus Reset, before an Inquiry a device can't
-     * be assumed to be in Asynchronous, Narrow mode.
-     */
-    if ((asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS) == 0)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, asc_dvc->wdtr_able);
-        AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, asc_dvc->sdtr_able);
-    }
-
-    /*
-     * Set microcode operating variables for DISC and SDTR_SPEED1,
-     * SDTR_SPEED2, SDTR_SPEED3, and SDTR_SPEED4 based on the EEPROM
-     * configuration values.
-     *
-     * The SDTR per TID bitmask overrides the SDTR_SPEED1, SDTR_SPEED2,
-     * SDTR_SPEED3, and SDTR_SPEED4 values so it is safe to set them
-     * without determining here whether the device supports SDTR.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DISC_ENABLE, asc_dvc->cfg->disc_enable);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED1, asc_dvc->sdtr_speed1);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED2, asc_dvc->sdtr_speed2);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED3, asc_dvc->sdtr_speed3);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_SPEED4, asc_dvc->sdtr_speed4);
-
-    /*
-     * Set SCSI_CFG0 Microcode Default Value.
-     *
-     * The microcode will set the SCSI_CFG0 register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG0,
-        PARITY_EN | QUEUE_128 | SEL_TMO_LONG | OUR_ID_EN |
-        asc_dvc->chip_scsi_id);
-
-    /*
-     * Calculate SCSI_CFG1 Microcode Default Value.
-     *
-     * The microcode will set the SCSI_CFG1 register using this value
-     * after it is started below.
-     *
-     * Each ASC-38C1600 function has only two cable detect bits.
-     * The bus mode override bits are in IOPB_SOFT_OVER_WR.
-     */
-    scsi_cfg1 = AdvReadWordRegister(iop_base, IOPW_SCSI_CFG1);
-
-    /*
-     * If the cable is reversed all of the SCSI_CTRL register signals
-     * will be set. Check for and return an error if this condition is
-     * found.
-     */
-    if ((AdvReadWordRegister(iop_base, IOPW_SCSI_CTRL) & 0x3F07) == 0x3F07)
-    {
-        asc_dvc->err_code |= ASC_IERR_REVERSED_CABLE;
-        return ADV_ERROR;
-    }
-
-    /*
-     * Each ASC-38C1600 function has two connectors. Only an HVD device
-     * can not be connected to either connector. An LVD device or SE device
-     * may be connected to either connecor. If an SE device is connected,
-     * then at most Ultra speed (20 Mhz) can be used on both connectors.
-     *
-     * If an HVD device is attached, return an error.
-     */
-    if (scsi_cfg1 & HVD)
-    {
-        asc_dvc->err_code |= ASC_IERR_HVD_DEVICE;
-        return ADV_ERROR;
-    }
-
-    /*
-     * Each function in the ASC-38C1600 uses only the SE cable detect and
-     * termination because there are two connectors for each function. Each
-     * function may use either LVD or SE mode. Corresponding the SE automatic
-     * termination control EEPROM bits are used for each function. Each
-     * function has its own EEPROM. If SE automatic control is enabled for
-     * the function, then set the termination value based on a table listed
-     * in a_condor.h.
-     *
-     * If manual termination is specified in the EEPROM for the function,
-     * then 'termination' was set-up in AscInitFrom38C1600EEPROM() and is
-     * ready to be 'ored' into SCSI_CFG1.
-     */
-    if ((asc_dvc->cfg->termination & TERM_SE) == 0)
-    {
-        /* SE automatic termination control is enabled. */
-        switch(scsi_cfg1 & C_DET_SE)
-        {
-            /* TERM_SE_HI: on, TERM_SE_LO: on */
-            case 0x1: case 0x2: case 0x3:
-                asc_dvc->cfg->termination |= TERM_SE;
-                break;
-
-            case 0x0:
-                if (ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) == 0)
-                {
-                    /* Function 0 - TERM_SE_HI: off, TERM_SE_LO: off */
-                }
-                else
-                {
-                    /* Function 1 - TERM_SE_HI: on, TERM_SE_LO: off */
-                    asc_dvc->cfg->termination |= TERM_SE_HI;
-                }
-                break;
-        }
-    }
-
-    /*
-     * Clear any set TERM_SE bits.
-     */
-    scsi_cfg1 &= ~TERM_SE;
-
-    /*
-     * Invert the TERM_SE bits and then set 'scsi_cfg1'.
-     */
-    scsi_cfg1 |= (~asc_dvc->cfg->termination & TERM_SE);
-
-    /*
-     * Clear Big Endian and Terminator Polarity bits and set possibly
-     * modified termination control bits in the Microcode SCSI_CFG1
-     * Register Value.
-     *
-     * Big Endian bit is not used even on big endian machines.
-     */
-    scsi_cfg1 &= (~BIG_ENDIAN & ~DIS_TERM_DRV & ~TERM_POL);
-
-    /*
-     * Set SCSI_CFG1 Microcode Default Value
-     *
-     * Set possibly modified termination control bits in the Microcode
-     * SCSI_CFG1 Register Value.
-     *
-     * The microcode will set the SCSI_CFG1 register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SCSI_CFG1, scsi_cfg1);
-
-    /*
-     * Set MEM_CFG Microcode Default Value
-     *
-     * The microcode will set the MEM_CFG register using this value
-     * after it is started below.
-     *
-     * MEM_CFG may be accessed as a word or byte, but only bits 0-7
-     * are defined.
-     *
-     * ASC-38C1600 has 32KB internal memory.
-     *
-     * XXX - Since ASC38C1600 Rev.3 has a Local RAM failure issue, we come
-     * out a special 16K Adv Library and Microcode version. After the issue
-     * resolved, we should turn back to the 32K support. Both a_condor.h and
-     * mcode.sas files also need to be updated.
-     *
-     * AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG,
-     *  BIOS_EN | RAM_SZ_32KB);
-     */
-     AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_MEM_CFG, BIOS_EN | RAM_SZ_16KB);
-
-    /*
-     * Set SEL_MASK Microcode Default Value
-     *
-     * The microcode will set the SEL_MASK register using this value
-     * after it is started below.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_DEFAULT_SEL_MASK,
-        ADV_TID_TO_TIDMASK(asc_dvc->chip_scsi_id));
-
-    /*
-     * Build the carrier freelist.
-     *
-     * Driver must have already allocated memory and set 'carrier_buf'.
-     */
-
-    ASC_ASSERT(asc_dvc->carrier_buf != NULL);
-
-    carrp = (ADV_CARR_T *) ADV_16BALIGN(asc_dvc->carrier_buf);
-    asc_dvc->carr_freelist = NULL;
-    if (carrp == (ADV_CARR_T *) asc_dvc->carrier_buf)
-    {
-        buf_size = ADV_CARRIER_BUFSIZE;
-    } else
-    {
-        buf_size = ADV_CARRIER_BUFSIZE - sizeof(ADV_CARR_T);
-    }
-
-    do {
-        /*
-         * Get physical address for the carrier 'carrp'.
-         */
-        contig_len = sizeof(ADV_CARR_T);
-        carr_paddr = cpu_to_le32(DvcGetPhyAddr(asc_dvc, NULL, (uchar *) carrp,
-            (ADV_SDCNT *) &contig_len, ADV_IS_CARRIER_FLAG));
-
-        buf_size -= sizeof(ADV_CARR_T);
-
-        /*
-         * If the current carrier is not physically contiguous, then
-         * maybe there was a page crossing. Try the next carrier aligned
-         * start address.
-         */
-        if (contig_len < sizeof(ADV_CARR_T))
-        {
-            carrp++;
-            continue;
-        }
-
-        carrp->carr_pa = carr_paddr;
-        carrp->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(carrp));
-
-        /*
-         * Insert the carrier at the beginning of the freelist.
-         */
-        carrp->next_vpa = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
-        asc_dvc->carr_freelist = carrp;
-
-        carrp++;
-    }
-    while (buf_size > 0);
-
-    /*
-     * Set-up the Host->RISC Initiator Command Queue (ICQ).
-     */
-    if ((asc_dvc->icq_sp = asc_dvc->carr_freelist) == NULL)
-    {
-        asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
-        return ADV_ERROR;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-        ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->icq_sp->next_vpa));
-
-    /*
-     * The first command issued will be placed in the stopper carrier.
-     */
-    asc_dvc->icq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
-
-    /*
-     * Set RISC ICQ physical address start value. Initialize the
-     * COMMA register to the same value otherwise the RISC will
-     * prematurely detect a command is available.
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_ICQ, asc_dvc->icq_sp->carr_pa);
-    AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
-        le32_to_cpu(asc_dvc->icq_sp->carr_pa));
-
-    /*
-     * Set-up the RISC->Host Initiator Response Queue (IRQ).
-     */
-    if ((asc_dvc->irq_sp = asc_dvc->carr_freelist) == NULL)
-    {
-        asc_dvc->err_code |= ASC_IERR_NO_CARRIER;
-        return ADV_ERROR;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-        ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->next_vpa));
-
-    /*
-     * The first command completed by the RISC will be placed in
-     * the stopper.
-     *
-     * Note: Set 'next_vpa' to ASC_CQ_STOPPER. When the request is
-     * completed the RISC will set the ASC_RQ_STOPPER bit.
-     */
-    asc_dvc->irq_sp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
-
-    /*
-     * Set RISC IRQ physical address start value.
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IRQ, asc_dvc->irq_sp->carr_pa);
-    asc_dvc->carr_pending_cnt = 0;
-
-    AdvWriteByteRegister(iop_base, IOPB_INTR_ENABLES,
-        (ADV_INTR_ENABLE_HOST_INTR | ADV_INTR_ENABLE_GLOBAL_INTR));
-    AdvReadWordLram(iop_base, ASC_MC_CODE_BEGIN_ADDR, word);
-    AdvWriteWordRegister(iop_base, IOPW_PC, word);
-
-    /* finally, finally, gentlemen, start your engine */
-    AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_RUN);
-
-    /*
-     * Reset the SCSI Bus if the EEPROM indicates that SCSI Bus
-     * Resets should be performed. The RISC has to be running
-     * to issue a SCSI Bus Reset.
-     */
-    if (asc_dvc->bios_ctrl & BIOS_CTRL_RESET_SCSI_BUS)
-    {
-        /*
-         * If the BIOS Signature is present in memory, restore the
-         * per TID microcode operating variables.
-         */
-        if (bios_mem[(ASC_MC_BIOS_SIGNATURE - ASC_MC_BIOSMEM)/2] == 0x55AA)
-        {
-            /*
-             * Restore per TID negotiated values.
-             */
-            AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
-            AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-            for (tid = 0; tid <= ASC_MAX_TID; tid++)
-            {
-                AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-                    max_cmd[tid]);
-            }
-        } else
-        {
-            if (AdvResetSB(asc_dvc) != ADV_TRUE)
-            {
-                warn_code = ASC_WARN_BUSRESET_ERROR;
-            }
-        }
-    }
-
-    return warn_code;
-}
-
-/*
- * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
- * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
- * all of this is done.
- *
- * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
- *
- * For a non-fatal error return a warning code. If there are no warnings
- * then 0 is returned.
- *
- * Note: Chip is stopped on entry.
- */
-STATIC int __init
-AdvInitFrom3550EEP(ADV_DVC_VAR *asc_dvc)
-{
-    AdvPortAddr         iop_base;
-    ushort              warn_code;
-    ADVEEP_3550_CONFIG  eep_config;
-    int                 i;
-
-    iop_base = asc_dvc->iop_base;
-
-    warn_code = 0;
-
-    /*
-     * Read the board's EEPROM configuration.
-     *
-     * Set default values if a bad checksum is found.
-     */
-    if (AdvGet3550EEPConfig(iop_base, &eep_config) != eep_config.check_sum)
-    {
-        warn_code |= ASC_WARN_EEPROM_CHKSUM;
-
-        /*
-         * Set EEPROM default values.
-         */
-        for (i = 0; i < sizeof(ADVEEP_3550_CONFIG); i++)
-        {
-            *((uchar *) &eep_config + i) =
-                *((uchar *) &Default_3550_EEPROM_Config + i);
-        }
-
-        /*
-         * Assume the 6 byte board serial number that was read
-         * from EEPROM is correct even if the EEPROM checksum
-         * failed.
-         */
-        eep_config.serial_number_word3 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
-
-        eep_config.serial_number_word2 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
-
-        eep_config.serial_number_word1 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
-
-        AdvSet3550EEPConfig(iop_base, &eep_config);
-    }
-    /*
-     * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
-     * EEPROM configuration that was read.
-     *
-     * This is the mapping of EEPROM fields to Adv Library fields.
-     */
-    asc_dvc->wdtr_able = eep_config.wdtr_able;
-    asc_dvc->sdtr_able = eep_config.sdtr_able;
-    asc_dvc->ultra_able = eep_config.ultra_able;
-    asc_dvc->tagqng_able = eep_config.tagqng_able;
-    asc_dvc->cfg->disc_enable = eep_config.disc_enable;
-    asc_dvc->max_host_qng = eep_config.max_host_qng;
-    asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
-    asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
-    asc_dvc->start_motor = eep_config.start_motor;
-    asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
-    asc_dvc->bios_ctrl = eep_config.bios_ctrl;
-    asc_dvc->no_scam = eep_config.scam_tolerant;
-    asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
-    asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
-    asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
-
-    /*
-     * Set the host maximum queuing (max. 253, min. 16) and the per device
-     * maximum queuing (max. 63, min. 4).
-     */
-    if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG)
-    {
-        eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
-    } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
-    {
-        /* If the value is zero, assume it is uninitialized. */
-        if (eep_config.max_host_qng == 0)
-        {
-            eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
-        } else
-        {
-            eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
-        }
-    }
-
-    if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG)
-    {
-        eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
-    } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG)
-    {
-        /* If the value is zero, assume it is uninitialized. */
-        if (eep_config.max_dvc_qng == 0)
-        {
-            eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
-        } else
-        {
-            eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
-        }
-    }
-
-    /*
-     * If 'max_dvc_qng' is greater than 'max_host_qng', then
-     * set 'max_dvc_qng' to 'max_host_qng'.
-     */
-    if (eep_config.max_dvc_qng > eep_config.max_host_qng)
-    {
-        eep_config.max_dvc_qng = eep_config.max_host_qng;
-    }
-
-    /*
-     * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
-     * values based on possibly adjusted EEPROM values.
-     */
-    asc_dvc->max_host_qng = eep_config.max_host_qng;
-    asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
-
-
-    /*
-     * If the EEPROM 'termination' field is set to automatic (0), then set
-     * the ADV_DVC_CFG 'termination' field to automatic also.
-     *
-     * If the termination is specified with a non-zero 'termination'
-     * value check that a legal value is set and set the ADV_DVC_CFG
-     * 'termination' field appropriately.
-     */
-    if (eep_config.termination == 0)
-    {
-        asc_dvc->cfg->termination = 0;    /* auto termination */
-    } else
-    {
-        /* Enable manual control with low off / high off. */
-        if (eep_config.termination == 1)
-        {
-            asc_dvc->cfg->termination = TERM_CTL_SEL;
-
-        /* Enable manual control with low off / high on. */
-        } else if (eep_config.termination == 2)
-        {
-            asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H;
-
-        /* Enable manual control with low on / high on. */
-        } else if (eep_config.termination == 3)
-        {
-            asc_dvc->cfg->termination = TERM_CTL_SEL | TERM_CTL_H | TERM_CTL_L;
-        } else
-        {
-            /*
-             * The EEPROM 'termination' field contains a bad value. Use
-             * automatic termination instead.
-             */
-            asc_dvc->cfg->termination = 0;
-            warn_code |= ASC_WARN_EEPROM_TERMINATION;
-        }
-    }
-
-    return warn_code;
-}
-
-/*
- * Read the board's EEPROM configuration. Set fields in ADV_DVC_VAR and
- * ADV_DVC_CFG based on the EEPROM settings. The chip is stopped while
- * all of this is done.
- *
- * On failure set the ADV_DVC_VAR field 'err_code' and return ADV_ERROR.
- *
- * For a non-fatal error return a warning code. If there are no warnings
- * then 0 is returned.
- *
- * Note: Chip is stopped on entry.
- */
-STATIC int __init
-AdvInitFrom38C0800EEP(ADV_DVC_VAR *asc_dvc)
-{
-    AdvPortAddr              iop_base;
-    ushort                   warn_code;
-    ADVEEP_38C0800_CONFIG    eep_config;
-    int                      i;
-    uchar                    tid, termination;
-    ushort                   sdtr_speed = 0;
-
-    iop_base = asc_dvc->iop_base;
-
-    warn_code = 0;
-
-    /*
-     * Read the board's EEPROM configuration.
-     *
-     * Set default values if a bad checksum is found.
-     */
-    if (AdvGet38C0800EEPConfig(iop_base, &eep_config) != eep_config.check_sum)
-    {
-        warn_code |= ASC_WARN_EEPROM_CHKSUM;
-
-        /*
-         * Set EEPROM default values.
-         */
-        for (i = 0; i < sizeof(ADVEEP_38C0800_CONFIG); i++)
-        {
-            *((uchar *) &eep_config + i) =
-                *((uchar *) &Default_38C0800_EEPROM_Config + i);
-        }
-
-        /*
-         * Assume the 6 byte board serial number that was read
-         * from EEPROM is correct even if the EEPROM checksum
-         * failed.
-         */
-        eep_config.serial_number_word3 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
-
-        eep_config.serial_number_word2 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
-
-        eep_config.serial_number_word1 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
-
-        AdvSet38C0800EEPConfig(iop_base, &eep_config);
-    }
-    /*
-     * Set ADV_DVC_VAR and ADV_DVC_CFG variables from the
-     * EEPROM configuration that was read.
-     *
-     * This is the mapping of EEPROM fields to Adv Library fields.
-     */
-    asc_dvc->wdtr_able = eep_config.wdtr_able;
-    asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
-    asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
-    asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
-    asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
-    asc_dvc->tagqng_able = eep_config.tagqng_able;
-    asc_dvc->cfg->disc_enable = eep_config.disc_enable;
-    asc_dvc->max_host_qng = eep_config.max_host_qng;
-    asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
-    asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ADV_MAX_TID);
-    asc_dvc->start_motor = eep_config.start_motor;
-    asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
-    asc_dvc->bios_ctrl = eep_config.bios_ctrl;
-    asc_dvc->no_scam = eep_config.scam_tolerant;
-    asc_dvc->cfg->serial1 = eep_config.serial_number_word1;
-    asc_dvc->cfg->serial2 = eep_config.serial_number_word2;
-    asc_dvc->cfg->serial3 = eep_config.serial_number_word3;
-
-    /*
-     * For every Target ID if any of its 'sdtr_speed[1234]' bits
-     * are set, then set an 'sdtr_able' bit for it.
-     */
-    asc_dvc->sdtr_able = 0;
-    for (tid = 0; tid <= ADV_MAX_TID; tid++)
-    {
-        if (tid == 0)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed1;
-        } else if (tid == 4)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed2;
-        } else if (tid == 8)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed3;
-        } else if (tid == 12)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed4;
-        }
-        if (sdtr_speed & ADV_MAX_TID)
-        {
-            asc_dvc->sdtr_able |= (1 << tid);
-        }
-        sdtr_speed >>= 4;
-    }
-
-    /*
-     * Set the host maximum queuing (max. 253, min. 16) and the per device
-     * maximum queuing (max. 63, min. 4).
-     */
-    if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG)
-    {
-        eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
-    } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
-    {
-        /* If the value is zero, assume it is uninitialized. */
-        if (eep_config.max_host_qng == 0)
-        {
-            eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
-        } else
-        {
-            eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
-        }
-    }
-
-    if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG)
-    {
-        eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
-    } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG)
-    {
-        /* If the value is zero, assume it is uninitialized. */
-        if (eep_config.max_dvc_qng == 0)
-        {
-            eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
-        } else
-        {
-            eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
-        }
-    }
-
-    /*
-     * If 'max_dvc_qng' is greater than 'max_host_qng', then
-     * set 'max_dvc_qng' to 'max_host_qng'.
-     */
-    if (eep_config.max_dvc_qng > eep_config.max_host_qng)
-    {
-        eep_config.max_dvc_qng = eep_config.max_host_qng;
-    }
-
-    /*
-     * Set ADV_DVC_VAR 'max_host_qng' and ADV_DVC_VAR 'max_dvc_qng'
-     * values based on possibly adjusted EEPROM values.
-     */
-    asc_dvc->max_host_qng = eep_config.max_host_qng;
-    asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
-
-    /*
-     * If the EEPROM 'termination' field is set to automatic (0), then set
-     * the ADV_DVC_CFG 'termination' field to automatic also.
-     *
-     * If the termination is specified with a non-zero 'termination'
-     * value check that a legal value is set and set the ADV_DVC_CFG
-     * 'termination' field appropriately.
-     */
-    if (eep_config.termination_se == 0)
-    {
-        termination = 0;                         /* auto termination for SE */
-    } else
-    {
-        /* Enable manual control with low off / high off. */
-        if (eep_config.termination_se == 1)
-        {
-            termination = 0;
-
-        /* Enable manual control with low off / high on. */
-        } else if (eep_config.termination_se == 2)
-        {
-            termination = TERM_SE_HI;
-
-        /* Enable manual control with low on / high on. */
-        } else if (eep_config.termination_se == 3)
-        {
-            termination = TERM_SE;
-        } else
-        {
-            /*
-             * The EEPROM 'termination_se' field contains a bad value.
-             * Use automatic termination instead.
-             */
-            termination = 0;
-            warn_code |= ASC_WARN_EEPROM_TERMINATION;
-        }
-    }
-
-    if (eep_config.termination_lvd == 0)
-    {
-        asc_dvc->cfg->termination = termination; /* auto termination for LVD */
-    } else
-    {
-        /* Enable manual control with low off / high off. */
-        if (eep_config.termination_lvd == 1)
-        {
-            asc_dvc->cfg->termination = termination;
-
-        /* Enable manual control with low off / high on. */
-        } else if (eep_config.termination_lvd == 2)
-        {
-            asc_dvc->cfg->termination = termination | TERM_LVD_HI;
-
-        /* Enable manual control with low on / high on. */
-        } else if (eep_config.termination_lvd == 3)
-        {
-            asc_dvc->cfg->termination =
-                termination | TERM_LVD;
-        } else
-        {
-            /*
-             * The EEPROM 'termination_lvd' field contains a bad value.
-             * Use automatic termination instead.
-             */
-            asc_dvc->cfg->termination = termination;
-            warn_code |= ASC_WARN_EEPROM_TERMINATION;
-        }
-    }
-
-    return warn_code;
-}
-
-/*
- * Read the board's EEPROM configuration. Set fields in ASC_DVC_VAR and
- * ASC_DVC_CFG based on the EEPROM settings. The chip is stopped while
- * all of this is done.
- *
- * On failure set the ASC_DVC_VAR field 'err_code' and return ADV_ERROR.
- *
- * For a non-fatal error return a warning code. If there are no warnings
- * then 0 is returned.
- *
- * Note: Chip is stopped on entry.
- */
-STATIC int __init
-AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
-{
-    AdvPortAddr              iop_base;
-    ushort                   warn_code;
-    ADVEEP_38C1600_CONFIG    eep_config;
-    int                      i;
-    uchar                    tid, termination;
-    ushort                   sdtr_speed = 0;
+       AdvPortAddr iop_base;
+       ushort warn_code;
+       ADVEEP_38C1600_CONFIG eep_config;
+       int i;
+       uchar tid, termination;
+       ushort sdtr_speed = 0;
+
+       iop_base = asc_dvc->iop_base;
+
+       warn_code = 0;
+
+       /*
+        * Read the board's EEPROM configuration.
+        *
+        * Set default values if a bad checksum is found.
+        */
+       if (AdvGet38C1600EEPConfig(iop_base, &eep_config) !=
+           eep_config.check_sum) {
+               warn_code |= ASC_WARN_EEPROM_CHKSUM;
 
-    iop_base = asc_dvc->iop_base;
+               /*
+                * Set EEPROM default values.
+                */
+               for (i = 0; i < sizeof(ADVEEP_38C1600_CONFIG); i++) {
+                       if (i == 1
+                           && ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) !=
+                           0) {
+                               /*
+                                * Set Function 1 EEPROM Word 0 MSB
+                                *
+                                * Clear the BIOS_ENABLE (bit 14) and INTAB (bit 11)
+                                * EEPROM bits.
+                                *
+                                * Disable Bit 14 (BIOS_ENABLE) to fix SPARC Ultra 60 and
+                                * old Mac system booting problem. The Expansion ROM must
+                                * be disabled in Function 1 for these systems.
+                                *
+                                */
+                               *((uchar *)&eep_config + i) =
+                                   ((*
+                                     ((uchar *)&Default_38C1600_EEPROM_Config
+                                      +
+                                      i)) &
+                                    (~
+                                     (((ADV_EEPROM_BIOS_ENABLE |
+                                        ADV_EEPROM_INTAB) >> 8) & 0xFF)));
+
+                               /*
+                                * Set the INTAB (bit 11) if the GPIO 0 input indicates
+                                * the Function 1 interrupt line is wired to INTA.
+                                *
+                                * Set/Clear Bit 11 (INTAB) from the GPIO bit 0 input:
+                                *   1 - Function 1 interrupt line wired to INT A.
+                                *   0 - Function 1 interrupt line wired to INT B.
+                                *
+                                * Note: Adapter boards always have Function 0 wired to INTA.
+                                * Put all 5 GPIO bits in input mode and then read
+                                * their input values.
+                                */
+                               AdvWriteByteRegister(iop_base, IOPB_GPIO_CNTL,
+                                                    0);
+                               if (AdvReadByteRegister
+                                   (iop_base, IOPB_GPIO_DATA) & 0x01) {
+                                       /* Function 1 interrupt wired to INTA; Set EEPROM bit. */
+                                       *((uchar *)&eep_config + i) |=
+                                           ((ADV_EEPROM_INTAB >> 8) & 0xFF);
+                               }
+                       } else {
+                               *((uchar *)&eep_config + i) =
+                                   *((uchar *)&Default_38C1600_EEPROM_Config
+                                     + i);
+                       }
+               }
 
-    warn_code = 0;
+               /*
+                * Assume the 6 byte board serial number that was read
+                * from EEPROM is correct even if the EEPROM checksum
+                * failed.
+                */
+               eep_config.serial_number_word3 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
 
-    /*
-     * Read the board's EEPROM configuration.
-     *
-     * Set default values if a bad checksum is found.
-     */
-    if (AdvGet38C1600EEPConfig(iop_base, &eep_config) != eep_config.check_sum)
-    {
-        warn_code |= ASC_WARN_EEPROM_CHKSUM;
-
-        /*
-         * Set EEPROM default values.
-         */
-        for (i = 0; i < sizeof(ADVEEP_38C1600_CONFIG); i++)
-        {
-            if (i == 1 && ASC_PCI_ID2FUNC(asc_dvc->cfg->pci_slot_info) != 0)
-            {
-                /*
-                 * Set Function 1 EEPROM Word 0 MSB
-                 *
-                 * Clear the BIOS_ENABLE (bit 14) and INTAB (bit 11)
-                 * EEPROM bits.
-                 *
-                 * Disable Bit 14 (BIOS_ENABLE) to fix SPARC Ultra 60 and
-                 * old Mac system booting problem. The Expansion ROM must
-                 * be disabled in Function 1 for these systems.
-                 *
-                 */
-                *((uchar *) &eep_config + i) =
-                ((*((uchar *) &Default_38C1600_EEPROM_Config + i)) &
-                    (~(((ADV_EEPROM_BIOS_ENABLE | ADV_EEPROM_INTAB) >> 8) &
-                     0xFF)));
-
-                /*
-                 * Set the INTAB (bit 11) if the GPIO 0 input indicates
-                 * the Function 1 interrupt line is wired to INTA.
-                 *
-                 * Set/Clear Bit 11 (INTAB) from the GPIO bit 0 input:
-                 *   1 - Function 1 interrupt line wired to INT A.
-                 *   0 - Function 1 interrupt line wired to INT B.
-                 *
-                 * Note: Adapter boards always have Function 0 wired to INTA.
-                 * Put all 5 GPIO bits in input mode and then read
-                 * their input values.
-                 */
-                AdvWriteByteRegister(iop_base, IOPB_GPIO_CNTL, 0);
-                if (AdvReadByteRegister(iop_base, IOPB_GPIO_DATA) & 0x01)
-                {
-                    /* Function 1 interrupt wired to INTA; Set EEPROM bit. */
-                *((uchar *) &eep_config + i) |=
-                    ((ADV_EEPROM_INTAB >> 8) & 0xFF);
-                }
-            }
-            else
-            {
-                *((uchar *) &eep_config + i) =
-                *((uchar *) &Default_38C1600_EEPROM_Config + i);
-            }
-        }
-
-        /*
-         * Assume the 6 byte board serial number that was read
-         * from EEPROM is correct even if the EEPROM checksum
-         * failed.
-         */
-        eep_config.serial_number_word3 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 1);
-
-        eep_config.serial_number_word2 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
-
-        eep_config.serial_number_word1 =
-            AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
-
-        AdvSet38C1600EEPConfig(iop_base, &eep_config);
-    }
+               eep_config.serial_number_word2 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 2);
 
-    /*
-     * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
-     * EEPROM configuration that was read.
-     *
-     * This is the mapping of EEPROM fields to Adv Library fields.
-     */
-    asc_dvc->wdtr_able = eep_config.wdtr_able;
-    asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
-    asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
-    asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
-    asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
-    asc_dvc->ppr_able = 0;
-    asc_dvc->tagqng_able = eep_config.tagqng_able;
-    asc_dvc->cfg->disc_enable = eep_config.disc_enable;
-    asc_dvc->max_host_qng = eep_config.max_host_qng;
-    asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
-    asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ASC_MAX_TID);
-    asc_dvc->start_motor = eep_config.start_motor;
-    asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
-    asc_dvc->bios_ctrl = eep_config.bios_ctrl;
-    asc_dvc->no_scam = eep_config.scam_tolerant;
+               eep_config.serial_number_word1 =
+                   AdvReadEEPWord(iop_base, ADV_EEP_DVC_CFG_END - 3);
 
-    /*
-     * For every Target ID if any of its 'sdtr_speed[1234]' bits
-     * are set, then set an 'sdtr_able' bit for it.
-     */
-    asc_dvc->sdtr_able = 0;
-    for (tid = 0; tid <= ASC_MAX_TID; tid++)
-    {
-        if (tid == 0)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed1;
-        } else if (tid == 4)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed2;
-        } else if (tid == 8)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed3;
-        } else if (tid == 12)
-        {
-            sdtr_speed = asc_dvc->sdtr_speed4;
-        }
-        if (sdtr_speed & ASC_MAX_TID)
-        {
-            asc_dvc->sdtr_able |= (1 << tid);
-        }
-        sdtr_speed >>= 4;
-    }
+               AdvSet38C1600EEPConfig(iop_base, &eep_config);
+       }
 
-    /*
-     * Set the host maximum queuing (max. 253, min. 16) and the per device
-     * maximum queuing (max. 63, min. 4).
-     */
-    if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG)
-    {
-        eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
-    } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG)
-    {
-        /* If the value is zero, assume it is uninitialized. */
-        if (eep_config.max_host_qng == 0)
-        {
-            eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
-        } else
-        {
-            eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
-        }
-    }
+       /*
+        * Set ASC_DVC_VAR and ASC_DVC_CFG variables from the
+        * EEPROM configuration that was read.
+        *
+        * This is the mapping of EEPROM fields to Adv Library fields.
+        */
+       asc_dvc->wdtr_able = eep_config.wdtr_able;
+       asc_dvc->sdtr_speed1 = eep_config.sdtr_speed1;
+       asc_dvc->sdtr_speed2 = eep_config.sdtr_speed2;
+       asc_dvc->sdtr_speed3 = eep_config.sdtr_speed3;
+       asc_dvc->sdtr_speed4 = eep_config.sdtr_speed4;
+       asc_dvc->ppr_able = 0;
+       asc_dvc->tagqng_able = eep_config.tagqng_able;
+       asc_dvc->cfg->disc_enable = eep_config.disc_enable;
+       asc_dvc->max_host_qng = eep_config.max_host_qng;
+       asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+       asc_dvc->chip_scsi_id = (eep_config.adapter_scsi_id & ASC_MAX_TID);
+       asc_dvc->start_motor = eep_config.start_motor;
+       asc_dvc->scsi_reset_wait = eep_config.scsi_reset_delay;
+       asc_dvc->bios_ctrl = eep_config.bios_ctrl;
+       asc_dvc->no_scam = eep_config.scam_tolerant;
+
+       /*
+        * For every Target ID if any of its 'sdtr_speed[1234]' bits
+        * are set, then set an 'sdtr_able' bit for it.
+        */
+       asc_dvc->sdtr_able = 0;
+       for (tid = 0; tid <= ASC_MAX_TID; tid++) {
+               if (tid == 0) {
+                       sdtr_speed = asc_dvc->sdtr_speed1;
+               } else if (tid == 4) {
+                       sdtr_speed = asc_dvc->sdtr_speed2;
+               } else if (tid == 8) {
+                       sdtr_speed = asc_dvc->sdtr_speed3;
+               } else if (tid == 12) {
+                       sdtr_speed = asc_dvc->sdtr_speed4;
+               }
+               if (sdtr_speed & ASC_MAX_TID) {
+                       asc_dvc->sdtr_able |= (1 << tid);
+               }
+               sdtr_speed >>= 4;
+       }
 
-    if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG)
-    {
-        eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
-    } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG)
-    {
-        /* If the value is zero, assume it is uninitialized. */
-        if (eep_config.max_dvc_qng == 0)
-        {
-            eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
-        } else
-        {
-            eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
-        }
-    }
+       /*
+        * Set the host maximum queuing (max. 253, min. 16) and the per device
+        * maximum queuing (max. 63, min. 4).
+        */
+       if (eep_config.max_host_qng > ASC_DEF_MAX_HOST_QNG) {
+               eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
+       } else if (eep_config.max_host_qng < ASC_DEF_MIN_HOST_QNG) {
+               /* If the value is zero, assume it is uninitialized. */
+               if (eep_config.max_host_qng == 0) {
+                       eep_config.max_host_qng = ASC_DEF_MAX_HOST_QNG;
+               } else {
+                       eep_config.max_host_qng = ASC_DEF_MIN_HOST_QNG;
+               }
+       }
 
-    /*
-     * If 'max_dvc_qng' is greater than 'max_host_qng', then
-     * set 'max_dvc_qng' to 'max_host_qng'.
-     */
-    if (eep_config.max_dvc_qng > eep_config.max_host_qng)
-    {
-        eep_config.max_dvc_qng = eep_config.max_host_qng;
-    }
+       if (eep_config.max_dvc_qng > ASC_DEF_MAX_DVC_QNG) {
+               eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
+       } else if (eep_config.max_dvc_qng < ASC_DEF_MIN_DVC_QNG) {
+               /* If the value is zero, assume it is uninitialized. */
+               if (eep_config.max_dvc_qng == 0) {
+                       eep_config.max_dvc_qng = ASC_DEF_MAX_DVC_QNG;
+               } else {
+                       eep_config.max_dvc_qng = ASC_DEF_MIN_DVC_QNG;
+               }
+       }
 
-    /*
-     * Set ASC_DVC_VAR 'max_host_qng' and ASC_DVC_VAR 'max_dvc_qng'
-     * values based on possibly adjusted EEPROM values.
-     */
-    asc_dvc->max_host_qng = eep_config.max_host_qng;
-    asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+       /*
+        * If 'max_dvc_qng' is greater than 'max_host_qng', then
+        * set 'max_dvc_qng' to 'max_host_qng'.
+        */
+       if (eep_config.max_dvc_qng > eep_config.max_host_qng) {
+               eep_config.max_dvc_qng = eep_config.max_host_qng;
+       }
 
-    /*
-     * If the EEPROM 'termination' field is set to automatic (0), then set
-     * the ASC_DVC_CFG 'termination' field to automatic also.
-     *
-     * If the termination is specified with a non-zero 'termination'
-     * value check that a legal value is set and set the ASC_DVC_CFG
-     * 'termination' field appropriately.
-     */
-    if (eep_config.termination_se == 0)
-    {
-        termination = 0;                         /* auto termination for SE */
-    } else
-    {
-        /* Enable manual control with low off / high off. */
-        if (eep_config.termination_se == 1)
-        {
-            termination = 0;
-
-        /* Enable manual control with low off / high on. */
-        } else if (eep_config.termination_se == 2)
-        {
-            termination = TERM_SE_HI;
-
-        /* Enable manual control with low on / high on. */
-        } else if (eep_config.termination_se == 3)
-        {
-            termination = TERM_SE;
-        } else
-        {
-            /*
-             * The EEPROM 'termination_se' field contains a bad value.
-             * Use automatic termination instead.
-             */
-            termination = 0;
-            warn_code |= ASC_WARN_EEPROM_TERMINATION;
-        }
-    }
+       /*
+        * Set ASC_DVC_VAR 'max_host_qng' and ASC_DVC_VAR 'max_dvc_qng'
+        * values based on possibly adjusted EEPROM values.
+        */
+       asc_dvc->max_host_qng = eep_config.max_host_qng;
+       asc_dvc->max_dvc_qng = eep_config.max_dvc_qng;
+
+       /*
+        * If the EEPROM 'termination' field is set to automatic (0), then set
+        * the ASC_DVC_CFG 'termination' field to automatic also.
+        *
+        * If the termination is specified with a non-zero 'termination'
+        * value check that a legal value is set and set the ASC_DVC_CFG
+        * 'termination' field appropriately.
+        */
+       if (eep_config.termination_se == 0) {
+               termination = 0;        /* auto termination for SE */
+       } else {
+               /* Enable manual control with low off / high off. */
+               if (eep_config.termination_se == 1) {
+                       termination = 0;
+
+                       /* Enable manual control with low off / high on. */
+               } else if (eep_config.termination_se == 2) {
+                       termination = TERM_SE_HI;
+
+                       /* Enable manual control with low on / high on. */
+               } else if (eep_config.termination_se == 3) {
+                       termination = TERM_SE;
+               } else {
+                       /*
+                        * The EEPROM 'termination_se' field contains a bad value.
+                        * Use automatic termination instead.
+                        */
+                       termination = 0;
+                       warn_code |= ASC_WARN_EEPROM_TERMINATION;
+               }
+       }
 
-    if (eep_config.termination_lvd == 0)
-    {
-        asc_dvc->cfg->termination = termination; /* auto termination for LVD */
-    } else
-    {
-        /* Enable manual control with low off / high off. */
-        if (eep_config.termination_lvd == 1)
-        {
-            asc_dvc->cfg->termination = termination;
-
-        /* Enable manual control with low off / high on. */
-        } else if (eep_config.termination_lvd == 2)
-        {
-            asc_dvc->cfg->termination = termination | TERM_LVD_HI;
-
-        /* Enable manual control with low on / high on. */
-        } else if (eep_config.termination_lvd == 3)
-        {
-            asc_dvc->cfg->termination =
-                termination | TERM_LVD;
-        } else
-        {
-            /*
-             * The EEPROM 'termination_lvd' field contains a bad value.
-             * Use automatic termination instead.
-             */
-            asc_dvc->cfg->termination = termination;
-            warn_code |= ASC_WARN_EEPROM_TERMINATION;
-        }
-    }
+       if (eep_config.termination_lvd == 0) {
+               asc_dvc->cfg->termination = termination;        /* auto termination for LVD */
+       } else {
+               /* Enable manual control with low off / high off. */
+               if (eep_config.termination_lvd == 1) {
+                       asc_dvc->cfg->termination = termination;
+
+                       /* Enable manual control with low off / high on. */
+               } else if (eep_config.termination_lvd == 2) {
+                       asc_dvc->cfg->termination = termination | TERM_LVD_HI;
+
+                       /* Enable manual control with low on / high on. */
+               } else if (eep_config.termination_lvd == 3) {
+                       asc_dvc->cfg->termination = termination | TERM_LVD;
+               } else {
+                       /*
+                        * The EEPROM 'termination_lvd' field contains a bad value.
+                        * Use automatic termination instead.
+                        */
+                       asc_dvc->cfg->termination = termination;
+                       warn_code |= ASC_WARN_EEPROM_TERMINATION;
+               }
+       }
 
-    return warn_code;
+       return warn_code;
 }
 
 /*
@@ -17049,45 +16733,42 @@ AdvInitFrom38C1600EEP(ADV_DVC_VAR *asc_dvc)
  *
  * Return a checksum based on the EEPROM configuration read.
  */
-STATIC ushort __init
+static ushort __init
 AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
 {
-    ushort              wval, chksum;
-    ushort              *wbuf;
-    int                 eep_addr;
-    ushort              *charfields;
-
-    charfields = (ushort *) &ADVEEP_3550_Config_Field_IsChar;
-    wbuf = (ushort *) cfg_buf;
-    chksum = 0;
-
-    for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
-         eep_addr < ADV_EEP_DVC_CFG_END;
-         eep_addr++, wbuf++)
-    {
-        wval = AdvReadEEPWord(iop_base, eep_addr);
-        chksum += wval; /* Checksum is calculated from word values. */
-        if (*charfields++) {
-            *wbuf = le16_to_cpu(wval);
-        } else {
-            *wbuf = wval;
-        }
-    }
-    /* Read checksum word. */
-    *wbuf = AdvReadEEPWord(iop_base, eep_addr);
-    wbuf++; charfields++;
-
-    /* Read rest of EEPROM not covered by the checksum. */
-    for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
-         eep_addr < ADV_EEP_MAX_WORD_ADDR;
-         eep_addr++, wbuf++)
-    {
-        *wbuf = AdvReadEEPWord(iop_base, eep_addr);
-        if (*charfields++) {
-            *wbuf = le16_to_cpu(*wbuf);
-        }
-    }
-    return chksum;
+       ushort wval, chksum;
+       ushort *wbuf;
+       int eep_addr;
+       ushort *charfields;
+
+       charfields = (ushort *)&ADVEEP_3550_Config_Field_IsChar;
+       wbuf = (ushort *)cfg_buf;
+       chksum = 0;
+
+       for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
+            eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
+               wval = AdvReadEEPWord(iop_base, eep_addr);
+               chksum += wval; /* Checksum is calculated from word values. */
+               if (*charfields++) {
+                       *wbuf = le16_to_cpu(wval);
+               } else {
+                       *wbuf = wval;
+               }
+       }
+       /* Read checksum word. */
+       *wbuf = AdvReadEEPWord(iop_base, eep_addr);
+       wbuf++;
+       charfields++;
+
+       /* Read rest of EEPROM not covered by the checksum. */
+       for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
+            eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
+               *wbuf = AdvReadEEPWord(iop_base, eep_addr);
+               if (*charfields++) {
+                       *wbuf = le16_to_cpu(*wbuf);
+               }
+       }
+       return chksum;
 }
 
 /*
@@ -17095,46 +16776,42 @@ AdvGet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
  *
  * Return a checksum based on the EEPROM configuration read.
  */
-STATIC ushort __init
-AdvGet38C0800EEPConfig(AdvPortAddr iop_base,
-                       ADVEEP_38C0800_CONFIG *cfg_buf)
+static ushort __init
+AdvGet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
 {
-    ushort              wval, chksum;
-    ushort              *wbuf;
-    int                 eep_addr;
-    ushort              *charfields;
-
-    charfields = (ushort *) &ADVEEP_38C0800_Config_Field_IsChar;
-    wbuf = (ushort *) cfg_buf;
-    chksum = 0;
-
-    for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
-         eep_addr < ADV_EEP_DVC_CFG_END;
-         eep_addr++, wbuf++)
-    {
-        wval = AdvReadEEPWord(iop_base, eep_addr);
-        chksum += wval; /* Checksum is calculated from word values. */
-        if (*charfields++) {
-            *wbuf = le16_to_cpu(wval);
-        } else {
-            *wbuf = wval;
-        }
-    }
-    /* Read checksum word. */
-    *wbuf = AdvReadEEPWord(iop_base, eep_addr);
-    wbuf++; charfields++;
-
-    /* Read rest of EEPROM not covered by the checksum. */
-    for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
-         eep_addr < ADV_EEP_MAX_WORD_ADDR;
-         eep_addr++, wbuf++)
-    {
-        *wbuf = AdvReadEEPWord(iop_base, eep_addr);
-        if (*charfields++) {
-            *wbuf = le16_to_cpu(*wbuf);
-        }
-    }
-    return chksum;
+       ushort wval, chksum;
+       ushort *wbuf;
+       int eep_addr;
+       ushort *charfields;
+
+       charfields = (ushort *)&ADVEEP_38C0800_Config_Field_IsChar;
+       wbuf = (ushort *)cfg_buf;
+       chksum = 0;
+
+       for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
+            eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
+               wval = AdvReadEEPWord(iop_base, eep_addr);
+               chksum += wval; /* Checksum is calculated from word values. */
+               if (*charfields++) {
+                       *wbuf = le16_to_cpu(wval);
+               } else {
+                       *wbuf = wval;
+               }
+       }
+       /* Read checksum word. */
+       *wbuf = AdvReadEEPWord(iop_base, eep_addr);
+       wbuf++;
+       charfields++;
+
+       /* Read rest of EEPROM not covered by the checksum. */
+       for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
+            eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
+               *wbuf = AdvReadEEPWord(iop_base, eep_addr);
+               if (*charfields++) {
+                       *wbuf = le16_to_cpu(*wbuf);
+               }
+       }
+       return chksum;
 }
 
 /*
@@ -17142,81 +16819,74 @@ AdvGet38C0800EEPConfig(AdvPortAddr iop_base,
  *
  * Return a checksum based on the EEPROM configuration read.
  */
-STATIC ushort __init
-AdvGet38C1600EEPConfig(AdvPortAddr iop_base,
-                       ADVEEP_38C1600_CONFIG *cfg_buf)
+static ushort __init
+AdvGet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
 {
-    ushort              wval, chksum;
-    ushort              *wbuf;
-    int                 eep_addr;
-    ushort              *charfields;
-
-    charfields = (ushort*) &ADVEEP_38C1600_Config_Field_IsChar;
-    wbuf = (ushort *) cfg_buf;
-    chksum = 0;
-
-    for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
-         eep_addr < ADV_EEP_DVC_CFG_END;
-         eep_addr++, wbuf++)
-    {
-        wval = AdvReadEEPWord(iop_base, eep_addr);
-        chksum += wval; /* Checksum is calculated from word values. */
-        if (*charfields++) {
-            *wbuf = le16_to_cpu(wval);
-        } else {
-            *wbuf = wval;
-        }
-    }
-    /* Read checksum word. */
-    *wbuf = AdvReadEEPWord(iop_base, eep_addr);
-    wbuf++; charfields++;
-
-    /* Read rest of EEPROM not covered by the checksum. */
-    for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
-         eep_addr < ADV_EEP_MAX_WORD_ADDR;
-         eep_addr++, wbuf++)
-    {
-        *wbuf = AdvReadEEPWord(iop_base, eep_addr);
-        if (*charfields++) {
-            *wbuf = le16_to_cpu(*wbuf);
-        }
-    }
-    return chksum;
+       ushort wval, chksum;
+       ushort *wbuf;
+       int eep_addr;
+       ushort *charfields;
+
+       charfields = (ushort *)&ADVEEP_38C1600_Config_Field_IsChar;
+       wbuf = (ushort *)cfg_buf;
+       chksum = 0;
+
+       for (eep_addr = ADV_EEP_DVC_CFG_BEGIN;
+            eep_addr < ADV_EEP_DVC_CFG_END; eep_addr++, wbuf++) {
+               wval = AdvReadEEPWord(iop_base, eep_addr);
+               chksum += wval; /* Checksum is calculated from word values. */
+               if (*charfields++) {
+                       *wbuf = le16_to_cpu(wval);
+               } else {
+                       *wbuf = wval;
+               }
+       }
+       /* Read checksum word. */
+       *wbuf = AdvReadEEPWord(iop_base, eep_addr);
+       wbuf++;
+       charfields++;
+
+       /* Read rest of EEPROM not covered by the checksum. */
+       for (eep_addr = ADV_EEP_DVC_CTL_BEGIN;
+            eep_addr < ADV_EEP_MAX_WORD_ADDR; eep_addr++, wbuf++) {
+               *wbuf = AdvReadEEPWord(iop_base, eep_addr);
+               if (*charfields++) {
+                       *wbuf = le16_to_cpu(*wbuf);
+               }
+       }
+       return chksum;
 }
 
 /*
  * Read the EEPROM from specified location
  */
-STATIC ushort __init
-AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
+static ushort __init AdvReadEEPWord(AdvPortAddr iop_base, int eep_word_addr)
 {
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
-        ASC_EEP_CMD_READ | eep_word_addr);
-    AdvWaitEEPCmd(iop_base);
-    return AdvReadWordRegister(iop_base, IOPW_EE_DATA);
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                            ASC_EEP_CMD_READ | eep_word_addr);
+       AdvWaitEEPCmd(iop_base);
+       return AdvReadWordRegister(iop_base, IOPW_EE_DATA);
 }
 
 /*
  * Wait for EEPROM command to complete
  */
-STATIC void __init
-AdvWaitEEPCmd(AdvPortAddr iop_base)
+static void __init AdvWaitEEPCmd(AdvPortAddr iop_base)
 {
-    int eep_delay_ms;
-
-    for (eep_delay_ms = 0; eep_delay_ms < ADV_EEP_DELAY_MS; eep_delay_ms++)
-    {
-        if (AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE)
-        {
-            break;
-        }
-        DvcSleepMilliSecond(1);
-    }
-    if ((AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE) == 0)
-    {
-        ASC_ASSERT(0);
-    }
-    return;
+       int eep_delay_ms;
+
+       for (eep_delay_ms = 0; eep_delay_ms < ADV_EEP_DELAY_MS; eep_delay_ms++) {
+               if (AdvReadWordRegister(iop_base, IOPW_EE_CMD) &
+                   ASC_EEP_CMD_DONE) {
+                       break;
+               }
+               DvcSleepMilliSecond(1);
+       }
+       if ((AdvReadWordRegister(iop_base, IOPW_EE_CMD) & ASC_EEP_CMD_DONE) ==
+           0) {
+               ASC_ASSERT(0);
+       }
+       return;
 }
 
 /*
@@ -17225,201 +16895,202 @@ AdvWaitEEPCmd(AdvPortAddr iop_base)
 void __init
 AdvSet3550EEPConfig(AdvPortAddr iop_base, ADVEEP_3550_CONFIG *cfg_buf)
 {
-    ushort *wbuf;
-    ushort addr, chksum;
-    ushort *charfields;
-
-    wbuf = (ushort *) cfg_buf;
-    charfields = (ushort *) &ADVEEP_3550_Config_Field_IsChar;
-    chksum = 0;
-
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
-    AdvWaitEEPCmd(iop_base);
-
-    /*
-     * Write EEPROM from word 0 to word 20.
-     */
-    for (addr = ADV_EEP_DVC_CFG_BEGIN;
-         addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++)
-    {
-        ushort word;
-
-        if (*charfields++) {
-            word = cpu_to_le16(*wbuf);
-        } else {
-            word = *wbuf;
-        }
-        chksum += *wbuf; /* Checksum is calculated from word values. */
-        AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
-        AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-        AdvWaitEEPCmd(iop_base);
-        DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
-    }
-
-    /*
-     * Write EEPROM checksum at word 21.
-     */
-    AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-    AdvWaitEEPCmd(iop_base);
-    wbuf++; charfields++;
+       ushort *wbuf;
+       ushort addr, chksum;
+       ushort *charfields;
+
+       wbuf = (ushort *)cfg_buf;
+       charfields = (ushort *)&ADVEEP_3550_Config_Field_IsChar;
+       chksum = 0;
+
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
+       AdvWaitEEPCmd(iop_base);
+
+       /*
+        * Write EEPROM from word 0 to word 20.
+        */
+       for (addr = ADV_EEP_DVC_CFG_BEGIN;
+            addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
+               ushort word;
+
+               if (*charfields++) {
+                       word = cpu_to_le16(*wbuf);
+               } else {
+                       word = *wbuf;
+               }
+               chksum += *wbuf;        /* Checksum is calculated from word values. */
+               AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
+               AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                                    ASC_EEP_CMD_WRITE | addr);
+               AdvWaitEEPCmd(iop_base);
+               DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
+       }
 
-    /*
-     * Write EEPROM OEM name at words 22 to 29.
-     */
-    for (addr = ADV_EEP_DVC_CTL_BEGIN;
-         addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++)
-    {
-        ushort word;
-
-        if (*charfields++) {
-            word = cpu_to_le16(*wbuf);
-        } else {
-            word = *wbuf;
-        }
-        AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
-        AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-        AdvWaitEEPCmd(iop_base);
-    }
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
-    AdvWaitEEPCmd(iop_base);
-    return;
+       /*
+        * Write EEPROM checksum at word 21.
+        */
+       AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
+       AdvWaitEEPCmd(iop_base);
+       wbuf++;
+       charfields++;
+
+       /*
+        * Write EEPROM OEM name at words 22 to 29.
+        */
+       for (addr = ADV_EEP_DVC_CTL_BEGIN;
+            addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
+               ushort word;
+
+               if (*charfields++) {
+                       word = cpu_to_le16(*wbuf);
+               } else {
+                       word = *wbuf;
+               }
+               AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
+               AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                                    ASC_EEP_CMD_WRITE | addr);
+               AdvWaitEEPCmd(iop_base);
+       }
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
+       AdvWaitEEPCmd(iop_base);
+       return;
 }
 
 /*
  * Write the EEPROM from 'cfg_buf'.
  */
 void __init
-AdvSet38C0800EEPConfig(AdvPortAddr iop_base,
-                       ADVEEP_38C0800_CONFIG *cfg_buf)
+AdvSet38C0800EEPConfig(AdvPortAddr iop_base, ADVEEP_38C0800_CONFIG *cfg_buf)
 {
-    ushort *wbuf;
-    ushort *charfields;
-    ushort addr, chksum;
-
-    wbuf = (ushort *) cfg_buf;
-    charfields = (ushort *) &ADVEEP_38C0800_Config_Field_IsChar;
-    chksum = 0;
-
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
-    AdvWaitEEPCmd(iop_base);
-
-    /*
-     * Write EEPROM from word 0 to word 20.
-     */
-    for (addr = ADV_EEP_DVC_CFG_BEGIN;
-         addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++)
-    {
-        ushort word;
-
-        if (*charfields++) {
-            word = cpu_to_le16(*wbuf);
-        } else {
-            word = *wbuf;
-        }
-        chksum += *wbuf; /* Checksum is calculated from word values. */
-        AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
-        AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-        AdvWaitEEPCmd(iop_base);
-        DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
-    }
-
-    /*
-     * Write EEPROM checksum at word 21.
-     */
-    AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-    AdvWaitEEPCmd(iop_base);
-    wbuf++; charfields++;
+       ushort *wbuf;
+       ushort *charfields;
+       ushort addr, chksum;
+
+       wbuf = (ushort *)cfg_buf;
+       charfields = (ushort *)&ADVEEP_38C0800_Config_Field_IsChar;
+       chksum = 0;
+
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
+       AdvWaitEEPCmd(iop_base);
+
+       /*
+        * Write EEPROM from word 0 to word 20.
+        */
+       for (addr = ADV_EEP_DVC_CFG_BEGIN;
+            addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
+               ushort word;
+
+               if (*charfields++) {
+                       word = cpu_to_le16(*wbuf);
+               } else {
+                       word = *wbuf;
+               }
+               chksum += *wbuf;        /* Checksum is calculated from word values. */
+               AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
+               AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                                    ASC_EEP_CMD_WRITE | addr);
+               AdvWaitEEPCmd(iop_base);
+               DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
+       }
 
-    /*
-     * Write EEPROM OEM name at words 22 to 29.
-     */
-    for (addr = ADV_EEP_DVC_CTL_BEGIN;
-         addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++)
-    {
-        ushort word;
-
-        if (*charfields++) {
-            word = cpu_to_le16(*wbuf);
-        } else {
-            word = *wbuf;
-        }
-        AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
-        AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-        AdvWaitEEPCmd(iop_base);
-    }
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
-    AdvWaitEEPCmd(iop_base);
-    return;
+       /*
+        * Write EEPROM checksum at word 21.
+        */
+       AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
+       AdvWaitEEPCmd(iop_base);
+       wbuf++;
+       charfields++;
+
+       /*
+        * Write EEPROM OEM name at words 22 to 29.
+        */
+       for (addr = ADV_EEP_DVC_CTL_BEGIN;
+            addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
+               ushort word;
+
+               if (*charfields++) {
+                       word = cpu_to_le16(*wbuf);
+               } else {
+                       word = *wbuf;
+               }
+               AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
+               AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                                    ASC_EEP_CMD_WRITE | addr);
+               AdvWaitEEPCmd(iop_base);
+       }
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
+       AdvWaitEEPCmd(iop_base);
+       return;
 }
 
 /*
  * Write the EEPROM from 'cfg_buf'.
  */
 void __init
-AdvSet38C1600EEPConfig(AdvPortAddr iop_base,
-                       ADVEEP_38C1600_CONFIG *cfg_buf)
+AdvSet38C1600EEPConfig(AdvPortAddr iop_base, ADVEEP_38C1600_CONFIG *cfg_buf)
 {
-    ushort              *wbuf;
-    ushort              *charfields;
-    ushort              addr, chksum;
-
-    wbuf = (ushort *) cfg_buf;
-    charfields = (ushort *) &ADVEEP_38C1600_Config_Field_IsChar;
-    chksum = 0;
-
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
-    AdvWaitEEPCmd(iop_base);
-
-    /*
-     * Write EEPROM from word 0 to word 20.
-     */
-    for (addr = ADV_EEP_DVC_CFG_BEGIN;
-         addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++)
-    {
-        ushort word;
-
-        if (*charfields++) {
-            word = cpu_to_le16(*wbuf);
-        } else {
-            word = *wbuf;
-        }
-        chksum += *wbuf; /* Checksum is calculated from word values. */
-        AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
-        AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-        AdvWaitEEPCmd(iop_base);
-        DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
-    }
-
-    /*
-     * Write EEPROM checksum at word 21.
-     */
-    AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-    AdvWaitEEPCmd(iop_base);
-    wbuf++; charfields++;
+       ushort *wbuf;
+       ushort *charfields;
+       ushort addr, chksum;
+
+       wbuf = (ushort *)cfg_buf;
+       charfields = (ushort *)&ADVEEP_38C1600_Config_Field_IsChar;
+       chksum = 0;
+
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_ABLE);
+       AdvWaitEEPCmd(iop_base);
+
+       /*
+        * Write EEPROM from word 0 to word 20.
+        */
+       for (addr = ADV_EEP_DVC_CFG_BEGIN;
+            addr < ADV_EEP_DVC_CFG_END; addr++, wbuf++) {
+               ushort word;
+
+               if (*charfields++) {
+                       word = cpu_to_le16(*wbuf);
+               } else {
+                       word = *wbuf;
+               }
+               chksum += *wbuf;        /* Checksum is calculated from word values. */
+               AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
+               AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                                    ASC_EEP_CMD_WRITE | addr);
+               AdvWaitEEPCmd(iop_base);
+               DvcSleepMilliSecond(ADV_EEP_DELAY_MS);
+       }
 
-    /*
-     * Write EEPROM OEM name at words 22 to 29.
-     */
-    for (addr = ADV_EEP_DVC_CTL_BEGIN;
-         addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++)
-    {
-        ushort word;
-
-        if (*charfields++) {
-            word = cpu_to_le16(*wbuf);
-        } else {
-            word = *wbuf;
-        }
-        AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
-        AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
-        AdvWaitEEPCmd(iop_base);
-    }
-    AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
-    AdvWaitEEPCmd(iop_base);
-    return;
+       /*
+        * Write EEPROM checksum at word 21.
+        */
+       AdvWriteWordRegister(iop_base, IOPW_EE_DATA, chksum);
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE | addr);
+       AdvWaitEEPCmd(iop_base);
+       wbuf++;
+       charfields++;
+
+       /*
+        * Write EEPROM OEM name at words 22 to 29.
+        */
+       for (addr = ADV_EEP_DVC_CTL_BEGIN;
+            addr < ADV_EEP_MAX_WORD_ADDR; addr++, wbuf++) {
+               ushort word;
+
+               if (*charfields++) {
+                       word = cpu_to_le16(*wbuf);
+               } else {
+                       word = *wbuf;
+               }
+               AdvWriteWordRegister(iop_base, IOPW_EE_DATA, word);
+               AdvWriteWordRegister(iop_base, IOPW_EE_CMD,
+                                    ASC_EEP_CMD_WRITE | addr);
+               AdvWaitEEPCmd(iop_base);
+       }
+       AdvWriteWordRegister(iop_base, IOPW_EE_CMD, ASC_EEP_CMD_WRITE_DISABLE);
+       AdvWaitEEPCmd(iop_base);
+       return;
 }
 
 /* a_advlib.c */
@@ -17444,126 +17115,120 @@ AdvSet38C1600EEPConfig(AdvPortAddr iop_base,
  *      ADV_ERROR(-1) -  Invalid ADV_SCSI_REQ_Q request structure
  *                       host IC error.
  */
-STATIC int
-AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc,
-                ADV_SCSI_REQ_Q *scsiq)
+static int AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq)
 {
-    ulong                  last_int_level;
-    AdvPortAddr            iop_base;
-    ADV_DCNT               req_size;
-    ADV_PADDR              req_paddr;
-    ADV_CARR_T             *new_carrp;
-
-    ASC_ASSERT(scsiq != NULL); /* 'scsiq' should never be NULL. */
-
-    /*
-     * The ADV_SCSI_REQ_Q 'target_id' field should never exceed ADV_MAX_TID.
-     */
-    if (scsiq->target_id > ADV_MAX_TID)
-    {
-        scsiq->host_status = QHSTA_M_INVALID_DEVICE;
-        scsiq->done_status = QD_WITH_ERROR;
-        return ADV_ERROR;
-    }
-
-    iop_base = asc_dvc->iop_base;
-
-    last_int_level = DvcEnterCritical();
-
-    /*
-     * Allocate a carrier ensuring at least one carrier always
-     * remains on the freelist and initialize fields.
-     */
-    if ((new_carrp = asc_dvc->carr_freelist) == NULL)
-    {
-       DvcLeaveCritical(last_int_level);
-       return ADV_BUSY;
-    }
-    asc_dvc->carr_freelist = (ADV_CARR_T *)
-        ADV_U32_TO_VADDR(le32_to_cpu(new_carrp->next_vpa));
-    asc_dvc->carr_pending_cnt++;
-
-    /*
-     * Set the carrier to be a stopper by setting 'next_vpa'
-     * to the stopper value. The current stopper will be changed
-     * below to point to the new stopper.
-     */
-    new_carrp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
-
-    /*
-     * Clear the ADV_SCSI_REQ_Q done flag.
-     */
-    scsiq->a_flag &= ~ADV_SCSIQ_DONE;
-
-    req_size = sizeof(ADV_SCSI_REQ_Q);
-    req_paddr = DvcGetPhyAddr(asc_dvc, scsiq, (uchar *) scsiq,
-        (ADV_SDCNT *) &req_size, ADV_IS_SCSIQ_FLAG);
-
-    ASC_ASSERT(ADV_32BALIGN(req_paddr) == req_paddr);
-    ASC_ASSERT(req_size >= sizeof(ADV_SCSI_REQ_Q));
-
-    /* Wait for assertion before making little-endian */
-    req_paddr = cpu_to_le32(req_paddr);
+       ulong last_int_level;
+       AdvPortAddr iop_base;
+       ADV_DCNT req_size;
+       ADV_PADDR req_paddr;
+       ADV_CARR_T *new_carrp;
+
+       ASC_ASSERT(scsiq != NULL);      /* 'scsiq' should never be NULL. */
+
+       /*
+        * The ADV_SCSI_REQ_Q 'target_id' field should never exceed ADV_MAX_TID.
+        */
+       if (scsiq->target_id > ADV_MAX_TID) {
+               scsiq->host_status = QHSTA_M_INVALID_DEVICE;
+               scsiq->done_status = QD_WITH_ERROR;
+               return ADV_ERROR;
+       }
 
-    /* Save virtual and physical address of ADV_SCSI_REQ_Q and carrier. */
-    scsiq->scsiq_ptr = cpu_to_le32(ADV_VADDR_TO_U32(scsiq));
-    scsiq->scsiq_rptr = req_paddr;
+       iop_base = asc_dvc->iop_base;
 
-    scsiq->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->icq_sp));
-    /*
-     * Every ADV_CARR_T.carr_pa is byte swapped to little-endian
-     * order during initialization.
-     */
-    scsiq->carr_pa = asc_dvc->icq_sp->carr_pa;
-
-   /*
-    * Use the current stopper to send the ADV_SCSI_REQ_Q command to
-    * the microcode. The newly allocated stopper will become the new
-    * stopper.
-    */
-    asc_dvc->icq_sp->areq_vpa = req_paddr;
+       last_int_level = DvcEnterCritical();
 
-    /*
-     * Set the 'next_vpa' pointer for the old stopper to be the
-     * physical address of the new stopper. The RISC can only
-     * follow physical addresses.
-     */
-    asc_dvc->icq_sp->next_vpa = new_carrp->carr_pa;
-
-    /*
-     * Set the host adapter stopper pointer to point to the new carrier.
-     */
-    asc_dvc->icq_sp = new_carrp;
-
-    if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
-        asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        /*
-         * Tickle the RISC to tell it to read its Command Queue Head pointer.
-         */
-        AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
-        if (asc_dvc->chip_type == ADV_CHIP_ASC3550)
-        {
-            /*
-             * Clear the tickle value. In the ASC-3550 the RISC flag
-             * command 'clr_tickle_a' does not work unless the host
-             * value is cleared.
-             */
-            AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
-        }
-    } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
-    {
-        /*
-         * Notify the RISC a carrier is ready by writing the physical
-         * address of the new carrier stopper to the COMMA register.
-         */
-        AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
-                le32_to_cpu(new_carrp->carr_pa));
-    }
+       /*
+        * Allocate a carrier ensuring at least one carrier always
+        * remains on the freelist and initialize fields.
+        */
+       if ((new_carrp = asc_dvc->carr_freelist) == NULL) {
+               DvcLeaveCritical(last_int_level);
+               return ADV_BUSY;
+       }
+       asc_dvc->carr_freelist = (ADV_CARR_T *)
+           ADV_U32_TO_VADDR(le32_to_cpu(new_carrp->next_vpa));
+       asc_dvc->carr_pending_cnt++;
+
+       /*
+        * Set the carrier to be a stopper by setting 'next_vpa'
+        * to the stopper value. The current stopper will be changed
+        * below to point to the new stopper.
+        */
+       new_carrp->next_vpa = cpu_to_le32(ASC_CQ_STOPPER);
+
+       /*
+        * Clear the ADV_SCSI_REQ_Q done flag.
+        */
+       scsiq->a_flag &= ~ADV_SCSIQ_DONE;
+
+       req_size = sizeof(ADV_SCSI_REQ_Q);
+       req_paddr = DvcGetPhyAddr(asc_dvc, scsiq, (uchar *)scsiq,
+                                 (ADV_SDCNT *)&req_size, ADV_IS_SCSIQ_FLAG);
+
+       ASC_ASSERT(ADV_32BALIGN(req_paddr) == req_paddr);
+       ASC_ASSERT(req_size >= sizeof(ADV_SCSI_REQ_Q));
+
+       /* Wait for assertion before making little-endian */
+       req_paddr = cpu_to_le32(req_paddr);
+
+       /* Save virtual and physical address of ADV_SCSI_REQ_Q and carrier. */
+       scsiq->scsiq_ptr = cpu_to_le32(ADV_VADDR_TO_U32(scsiq));
+       scsiq->scsiq_rptr = req_paddr;
+
+       scsiq->carr_va = cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->icq_sp));
+       /*
+        * Every ADV_CARR_T.carr_pa is byte swapped to little-endian
+        * order during initialization.
+        */
+       scsiq->carr_pa = asc_dvc->icq_sp->carr_pa;
+
+       /*
+        * Use the current stopper to send the ADV_SCSI_REQ_Q command to
+        * the microcode. The newly allocated stopper will become the new
+        * stopper.
+        */
+       asc_dvc->icq_sp->areq_vpa = req_paddr;
+
+       /*
+        * Set the 'next_vpa' pointer for the old stopper to be the
+        * physical address of the new stopper. The RISC can only
+        * follow physical addresses.
+        */
+       asc_dvc->icq_sp->next_vpa = new_carrp->carr_pa;
+
+       /*
+        * Set the host adapter stopper pointer to point to the new carrier.
+        */
+       asc_dvc->icq_sp = new_carrp;
+
+       if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
+           asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
+               /*
+                * Tickle the RISC to tell it to read its Command Queue Head pointer.
+                */
+               AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
+               if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
+                       /*
+                        * Clear the tickle value. In the ASC-3550 the RISC flag
+                        * command 'clr_tickle_a' does not work unless the host
+                        * value is cleared.
+                        */
+                       AdvWriteByteRegister(iop_base, IOPB_TICKLE,
+                                            ADV_TICKLE_NOP);
+               }
+       } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
+               /*
+                * Notify the RISC a carrier is ready by writing the physical
+                * address of the new carrier stopper to the COMMA register.
+                */
+               AdvWriteDWordRegister(iop_base, IOPDW_COMMA,
+                                     le32_to_cpu(new_carrp->carr_pa));
+       }
 
-    DvcLeaveCritical(last_int_level);
+       DvcLeaveCritical(last_int_level);
 
-    return ADV_SUCCESS;
+       return ADV_SUCCESS;
 }
 
 /*
@@ -17575,42 +17240,39 @@ AdvExeScsiQueue(ADV_DVC_VAR *asc_dvc,
  *      ADV_ERROR(-1) - Microcode command timed-out. Microcode or IC
  *                      may be hung which requires driver recovery.
  */
-STATIC int
-AdvResetSB(ADV_DVC_VAR *asc_dvc)
+static int AdvResetSB(ADV_DVC_VAR *asc_dvc)
 {
-    int         status;
-
-    /*
-     * Send the SCSI Bus Reset idle start idle command which asserts
-     * the SCSI Bus Reset signal.
-     */
-    status = AdvSendIdleCmd(asc_dvc, (ushort) IDLE_CMD_SCSI_RESET_START, 0L);
-    if (status != ADV_TRUE)
-    {
-        return status;
-    }
-
-    /*
-     * Delay for the specified SCSI Bus Reset hold time.
-     *
-     * The hold time delay is done on the host because the RISC has no
-     * microsecond accurate timer.
-     */
-    DvcDelayMicroSecond(asc_dvc, (ushort) ASC_SCSI_RESET_HOLD_TIME_US);
-
-    /*
-     * Send the SCSI Bus Reset end idle command which de-asserts
-     * the SCSI Bus Reset signal and purges any pending requests.
-     */
-    status = AdvSendIdleCmd(asc_dvc, (ushort) IDLE_CMD_SCSI_RESET_END, 0L);
-    if (status != ADV_TRUE)
-    {
-        return status;
-    }
+       int status;
+
+       /*
+        * Send the SCSI Bus Reset idle start idle command which asserts
+        * the SCSI Bus Reset signal.
+        */
+       status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_START, 0L);
+       if (status != ADV_TRUE) {
+               return status;
+       }
 
-    DvcSleepMilliSecond((ADV_DCNT) asc_dvc->scsi_reset_wait * 1000);
+       /*
+        * Delay for the specified SCSI Bus Reset hold time.
+        *
+        * The hold time delay is done on the host because the RISC has no
+        * microsecond accurate timer.
+        */
+       DvcDelayMicroSecond(asc_dvc, (ushort)ASC_SCSI_RESET_HOLD_TIME_US);
+
+       /*
+        * Send the SCSI Bus Reset end idle command which de-asserts
+        * the SCSI Bus Reset signal and purges any pending requests.
+        */
+       status = AdvSendIdleCmd(asc_dvc, (ushort)IDLE_CMD_SCSI_RESET_END, 0L);
+       if (status != ADV_TRUE) {
+               return status;
+       }
+
+       DvcSleepMilliSecond((ADV_DCNT)asc_dvc->scsi_reset_wait * 1000);
 
-    return status;
+       return status;
 }
 
 /*
@@ -17620,99 +17282,89 @@ AdvResetSB(ADV_DVC_VAR *asc_dvc)
  *      ADV_TRUE(1) -   Chip re-initialization and SCSI Bus Reset successful.
  *      ADV_FALSE(0) -  Chip re-initialization and SCSI Bus Reset failure.
  */
-STATIC int
-AdvResetChipAndSB(ADV_DVC_VAR *asc_dvc)
+static int AdvResetChipAndSB(ADV_DVC_VAR *asc_dvc)
 {
-    int         status;
-    ushort      wdtr_able, sdtr_able, tagqng_able;
-    ushort      ppr_able = 0;
-    uchar       tid, max_cmd[ADV_MAX_TID + 1];
-    AdvPortAddr iop_base;
-    ushort      bios_sig;
-
-    iop_base = asc_dvc->iop_base;
-
-    /*
-     * Save current per TID negotiated values.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-    AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-    if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
-    {
-        AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
-    }
-    AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-    for (tid = 0; tid <= ADV_MAX_TID; tid++)
-    {
-        AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-            max_cmd[tid]);
-    }
-
-    /*
-     * Force the AdvInitAsc3550/38C0800Driver() function to
-     * perform a SCSI Bus Reset by clearing the BIOS signature word.
-     * The initialization functions assumes a SCSI Bus Reset is not
-     * needed if the BIOS signature word is present.
-     */
-    AdvReadWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
-    AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, 0);
-
-    /*
-     * Stop chip and reset it.
-     */
-    AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_STOP);
-    AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_RESET);
-    DvcSleepMilliSecond(100);
-    AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_WR_IO_REG);
-
-    /*
-     * Reset Adv Library error code, if any, and try
-     * re-initializing the chip.
-     */
-    asc_dvc->err_code = 0;
-    if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
-    {
-        status = AdvInitAsc38C1600Driver(asc_dvc);
-    }
-    else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
-    {
-        status = AdvInitAsc38C0800Driver(asc_dvc);
-    } else
-    {
-        status = AdvInitAsc3550Driver(asc_dvc);
-    }
+       int status;
+       ushort wdtr_able, sdtr_able, tagqng_able;
+       ushort ppr_able = 0;
+       uchar tid, max_cmd[ADV_MAX_TID + 1];
+       AdvPortAddr iop_base;
+       ushort bios_sig;
+
+       iop_base = asc_dvc->iop_base;
+
+       /*
+        * Save current per TID negotiated values.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+       AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+       if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
+               AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
+       }
+       AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
+       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+               AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                               max_cmd[tid]);
+       }
 
-    /* Translate initialization return value to status value. */
-    if (status == 0)
-    {
-        status = ADV_TRUE;
-    } else
-    {
-        status = ADV_FALSE;
-    }
+       /*
+        * Force the AdvInitAsc3550/38C0800Driver() function to
+        * perform a SCSI Bus Reset by clearing the BIOS signature word.
+        * The initialization functions assumes a SCSI Bus Reset is not
+        * needed if the BIOS signature word is present.
+        */
+       AdvReadWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
+       AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, 0);
+
+       /*
+        * Stop chip and reset it.
+        */
+       AdvWriteWordRegister(iop_base, IOPW_RISC_CSR, ADV_RISC_CSR_STOP);
+       AdvWriteWordRegister(iop_base, IOPW_CTRL_REG, ADV_CTRL_REG_CMD_RESET);
+       DvcSleepMilliSecond(100);
+       AdvWriteWordRegister(iop_base, IOPW_CTRL_REG,
+                            ADV_CTRL_REG_CMD_WR_IO_REG);
+
+       /*
+        * Reset Adv Library error code, if any, and try
+        * re-initializing the chip.
+        */
+       asc_dvc->err_code = 0;
+       if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
+               status = AdvInitAsc38C1600Driver(asc_dvc);
+       } else if (asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
+               status = AdvInitAsc38C0800Driver(asc_dvc);
+       } else {
+               status = AdvInitAsc3550Driver(asc_dvc);
+       }
 
-    /*
-     * Restore the BIOS signature word.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
+       /* Translate initialization return value to status value. */
+       if (status == 0) {
+               status = ADV_TRUE;
+       } else {
+               status = ADV_FALSE;
+       }
 
-    /*
-     * Restore per TID negotiated values.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
-    AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
-    if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600)
-    {
-        AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
-    }
-    AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
-    for (tid = 0; tid <= ADV_MAX_TID; tid++)
-    {
-        AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-            max_cmd[tid]);
-    }
+       /*
+        * Restore the BIOS signature word.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_BIOS_SIGNATURE, bios_sig);
+
+       /*
+        * Restore per TID negotiated values.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
+       AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
+       if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600) {
+               AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, ppr_able);
+       }
+       AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
+       for (tid = 0; tid <= ADV_MAX_TID; tid++) {
+               AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                                max_cmd[tid]);
+       }
 
-    return status;
+       return status;
 }
 
 /*
@@ -17734,158 +17386,151 @@ AdvResetChipAndSB(ADV_DVC_VAR *asc_dvc)
  *   ADV_TRUE(1) - interrupt was pending
  *   ADV_FALSE(0) - no interrupt was pending
  */
-STATIC int
-AdvISR(ADV_DVC_VAR *asc_dvc)
+static int AdvISR(ADV_DVC_VAR *asc_dvc)
 {
-    AdvPortAddr                 iop_base;
-    uchar                       int_stat;
-    ushort                      target_bit;
-    ADV_CARR_T                  *free_carrp;
-    ADV_VADDR                   irq_next_vpa;
-    int                         flags;
-    ADV_SCSI_REQ_Q              *scsiq;
-
-    flags = DvcEnterCritical();
-
-    iop_base = asc_dvc->iop_base;
-
-    /* Reading the register clears the interrupt. */
-    int_stat = AdvReadByteRegister(iop_base, IOPB_INTR_STATUS_REG);
-
-    if ((int_stat & (ADV_INTR_STATUS_INTRA | ADV_INTR_STATUS_INTRB |
-         ADV_INTR_STATUS_INTRC)) == 0)
-    {
-        DvcLeaveCritical(flags);
-        return ADV_FALSE;
-    }
+       AdvPortAddr iop_base;
+       uchar int_stat;
+       ushort target_bit;
+       ADV_CARR_T *free_carrp;
+       ADV_VADDR irq_next_vpa;
+       int flags;
+       ADV_SCSI_REQ_Q *scsiq;
 
-    /*
-     * Notify the driver of an asynchronous microcode condition by
-     * calling the ADV_DVC_VAR.async_callback function. The function
-     * is passed the microcode ASC_MC_INTRB_CODE byte value.
-     */
-    if (int_stat & ADV_INTR_STATUS_INTRB)
-    {
-        uchar intrb_code;
-
-        AdvReadByteLram(iop_base, ASC_MC_INTRB_CODE, intrb_code);
-
-        if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
-            asc_dvc->chip_type == ADV_CHIP_ASC38C0800)
-        {
-            if (intrb_code == ADV_ASYNC_CARRIER_READY_FAILURE &&
-                asc_dvc->carr_pending_cnt != 0)
-            {
-                AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_A);
-                if (asc_dvc->chip_type == ADV_CHIP_ASC3550)
-                {
-                    AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
-                }
-            }
-        }
-
-        if (asc_dvc->async_callback != 0)
-        {
-            (*asc_dvc->async_callback)(asc_dvc, intrb_code);
-        }
-    }
+       flags = DvcEnterCritical();
 
-    /*
-     * Check if the IRQ stopper carrier contains a completed request.
-     */
-    while (((irq_next_vpa =
-             le32_to_cpu(asc_dvc->irq_sp->next_vpa)) & ASC_RQ_DONE) != 0)
-    {
-        /*
-         * Get a pointer to the newly completed ADV_SCSI_REQ_Q structure.
-         * The RISC will have set 'areq_vpa' to a virtual address.
-         *
-         * The firmware will have copied the ASC_SCSI_REQ_Q.scsiq_ptr
-         * field to the carrier ADV_CARR_T.areq_vpa field. The conversion
-         * below complements the conversion of ASC_SCSI_REQ_Q.scsiq_ptr'
-         * in AdvExeScsiQueue().
-         */
-        scsiq = (ADV_SCSI_REQ_Q *)
-            ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->areq_vpa));
-
-        /*
-         * Request finished with good status and the queue was not
-         * DMAed to host memory by the firmware. Set all status fields
-         * to indicate good status.
-         */
-        if ((irq_next_vpa & ASC_RQ_GOOD) != 0)
-        {
-            scsiq->done_status = QD_NO_ERROR;
-            scsiq->host_status = scsiq->scsi_status = 0;
-            scsiq->data_cnt = 0L;
-        }
-
-        /*
-         * Advance the stopper pointer to the next carrier
-         * ignoring the lower four bits. Free the previous
-         * stopper carrier.
-         */
-        free_carrp = asc_dvc->irq_sp;
-        asc_dvc->irq_sp = (ADV_CARR_T *)
-            ADV_U32_TO_VADDR(ASC_GET_CARRP(irq_next_vpa));
-
-        free_carrp->next_vpa =
-                cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
-        asc_dvc->carr_freelist = free_carrp;
-        asc_dvc->carr_pending_cnt--;
-
-        ASC_ASSERT(scsiq != NULL);
-        target_bit = ADV_TID_TO_TIDMASK(scsiq->target_id);
-
-        /*
-         * Clear request microcode control flag.
-         */
-        scsiq->cntl = 0;
-
-        /*
-         * If the command that completed was a SCSI INQUIRY and
-         * LUN 0 was sent the command, then process the INQUIRY
-         * command information for the device.
-         *
-         * Note: If data returned were either VPD or CmdDt data,
-         * don't process the INQUIRY command information for
-         * the device, otherwise may erroneously set *_able bits.
-         */
-        if (scsiq->done_status == QD_NO_ERROR &&
-            scsiq->cdb[0] == INQUIRY &&
-            scsiq->target_lun == 0 &&
-            (scsiq->cdb[1] & ADV_INQ_RTN_VPD_AND_CMDDT)
-                == ADV_INQ_RTN_STD_INQUIRY_DATA)
-        {
-            AdvInquiryHandling(asc_dvc, scsiq);
-        }
-
-        /*
-         * Notify the driver of the completed request by passing
-         * the ADV_SCSI_REQ_Q pointer to its callback function.
-         */
-        scsiq->a_flag |= ADV_SCSIQ_DONE;
-        (*asc_dvc->isr_callback)(asc_dvc, scsiq);
-        /*
-         * Note: After the driver callback function is called, 'scsiq'
-         * can no longer be referenced.
-         *
-         * Fall through and continue processing other completed
-         * requests...
-         */
-
-        /*
-         * Disable interrupts again in case the driver inadvertently
-         * enabled interrupts in its callback function.
-         *
-         * The DvcEnterCritical() return value is ignored, because
-         * the 'flags' saved when AdvISR() was first entered will be
-         * used to restore the interrupt flag on exit.
-         */
-        (void) DvcEnterCritical();
-    }
-    DvcLeaveCritical(flags);
-    return ADV_TRUE;
+       iop_base = asc_dvc->iop_base;
+
+       /* Reading the register clears the interrupt. */
+       int_stat = AdvReadByteRegister(iop_base, IOPB_INTR_STATUS_REG);
+
+       if ((int_stat & (ADV_INTR_STATUS_INTRA | ADV_INTR_STATUS_INTRB |
+                        ADV_INTR_STATUS_INTRC)) == 0) {
+               DvcLeaveCritical(flags);
+               return ADV_FALSE;
+       }
+
+       /*
+        * Notify the driver of an asynchronous microcode condition by
+        * calling the ADV_DVC_VAR.async_callback function. The function
+        * is passed the microcode ASC_MC_INTRB_CODE byte value.
+        */
+       if (int_stat & ADV_INTR_STATUS_INTRB) {
+               uchar intrb_code;
+
+               AdvReadByteLram(iop_base, ASC_MC_INTRB_CODE, intrb_code);
+
+               if (asc_dvc->chip_type == ADV_CHIP_ASC3550 ||
+                   asc_dvc->chip_type == ADV_CHIP_ASC38C0800) {
+                       if (intrb_code == ADV_ASYNC_CARRIER_READY_FAILURE &&
+                           asc_dvc->carr_pending_cnt != 0) {
+                               AdvWriteByteRegister(iop_base, IOPB_TICKLE,
+                                                    ADV_TICKLE_A);
+                               if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
+                                       AdvWriteByteRegister(iop_base,
+                                                            IOPB_TICKLE,
+                                                            ADV_TICKLE_NOP);
+                               }
+                       }
+               }
+
+               if (asc_dvc->async_callback != 0) {
+                       (*asc_dvc->async_callback) (asc_dvc, intrb_code);
+               }
+       }
+
+       /*
+        * Check if the IRQ stopper carrier contains a completed request.
+        */
+       while (((irq_next_vpa =
+                le32_to_cpu(asc_dvc->irq_sp->next_vpa)) & ASC_RQ_DONE) != 0) {
+               /*
+                * Get a pointer to the newly completed ADV_SCSI_REQ_Q structure.
+                * The RISC will have set 'areq_vpa' to a virtual address.
+                *
+                * The firmware will have copied the ASC_SCSI_REQ_Q.scsiq_ptr
+                * field to the carrier ADV_CARR_T.areq_vpa field. The conversion
+                * below complements the conversion of ASC_SCSI_REQ_Q.scsiq_ptr'
+                * in AdvExeScsiQueue().
+                */
+               scsiq = (ADV_SCSI_REQ_Q *)
+                   ADV_U32_TO_VADDR(le32_to_cpu(asc_dvc->irq_sp->areq_vpa));
+
+               /*
+                * Request finished with good status and the queue was not
+                * DMAed to host memory by the firmware. Set all status fields
+                * to indicate good status.
+                */
+               if ((irq_next_vpa & ASC_RQ_GOOD) != 0) {
+                       scsiq->done_status = QD_NO_ERROR;
+                       scsiq->host_status = scsiq->scsi_status = 0;
+                       scsiq->data_cnt = 0L;
+               }
+
+               /*
+                * Advance the stopper pointer to the next carrier
+                * ignoring the lower four bits. Free the previous
+                * stopper carrier.
+                */
+               free_carrp = asc_dvc->irq_sp;
+               asc_dvc->irq_sp = (ADV_CARR_T *)
+                   ADV_U32_TO_VADDR(ASC_GET_CARRP(irq_next_vpa));
+
+               free_carrp->next_vpa =
+                   cpu_to_le32(ADV_VADDR_TO_U32(asc_dvc->carr_freelist));
+               asc_dvc->carr_freelist = free_carrp;
+               asc_dvc->carr_pending_cnt--;
+
+               ASC_ASSERT(scsiq != NULL);
+               target_bit = ADV_TID_TO_TIDMASK(scsiq->target_id);
+
+               /*
+                * Clear request microcode control flag.
+                */
+               scsiq->cntl = 0;
+
+               /*
+                * If the command that completed was a SCSI INQUIRY and
+                * LUN 0 was sent the command, then process the INQUIRY
+                * command information for the device.
+                *
+                * Note: If data returned were either VPD or CmdDt data,
+                * don't process the INQUIRY command information for
+                * the device, otherwise may erroneously set *_able bits.
+                */
+               if (scsiq->done_status == QD_NO_ERROR &&
+                   scsiq->cdb[0] == INQUIRY &&
+                   scsiq->target_lun == 0 &&
+                   (scsiq->cdb[1] & ADV_INQ_RTN_VPD_AND_CMDDT)
+                   == ADV_INQ_RTN_STD_INQUIRY_DATA) {
+                       AdvInquiryHandling(asc_dvc, scsiq);
+               }
+
+               /*
+                * Notify the driver of the completed request by passing
+                * the ADV_SCSI_REQ_Q pointer to its callback function.
+                */
+               scsiq->a_flag |= ADV_SCSIQ_DONE;
+               (*asc_dvc->isr_callback) (asc_dvc, scsiq);
+               /*
+                * Note: After the driver callback function is called, 'scsiq'
+                * can no longer be referenced.
+                *
+                * Fall through and continue processing other completed
+                * requests...
+                */
+
+               /*
+                * Disable interrupts again in case the driver inadvertently
+                * enabled interrupts in its callback function.
+                *
+                * The DvcEnterCritical() return value is ignored, because
+                * the 'flags' saved when AdvISR() was first entered will be
+                * used to restore the interrupt flag on exit.
+                */
+               (void)DvcEnterCritical();
+       }
+       DvcLeaveCritical(flags);
+       return ADV_TRUE;
 }
 
 /*
@@ -17902,71 +17547,67 @@ AdvISR(ADV_DVC_VAR *asc_dvc)
  *   ADV_FALSE - command failed
  *   ADV_ERROR - command timed out
  */
-STATIC int
+static int
 AdvSendIdleCmd(ADV_DVC_VAR *asc_dvc,
-               ushort idle_cmd,
-               ADV_DCNT idle_cmd_parameter)
+              ushort idle_cmd, ADV_DCNT idle_cmd_parameter)
 {
-    ulong       last_int_level;
-    int         result;
-    ADV_DCNT    i, j;
-    AdvPortAddr iop_base;
-
-    last_int_level = DvcEnterCritical();
-
-    iop_base = asc_dvc->iop_base;
-
-    /*
-     * Clear the idle command status which is set by the microcode
-     * to a non-zero value to indicate when the command is completed.
-     * The non-zero result is one of the IDLE_CMD_STATUS_* values
-     * defined in a_advlib.h.
-     */
-    AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, (ushort) 0);
-
-    /*
-     * Write the idle command value after the idle command parameter
-     * has been written to avoid a race condition. If the order is not
-     * followed, the microcode may process the idle command before the
-     * parameters have been written to LRAM.
-     */
-    AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IDLE_CMD_PARAMETER,
-        cpu_to_le32(idle_cmd_parameter));
-    AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD, idle_cmd);
-
-    /*
-     * Tickle the RISC to tell it to process the idle command.
-     */
-    AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_B);
-    if (asc_dvc->chip_type == ADV_CHIP_ASC3550)
-    {
-        /*
-         * Clear the tickle value. In the ASC-3550 the RISC flag
-         * command 'clr_tickle_b' does not work unless the host
-         * value is cleared.
-         */
-        AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
-    }
+       ulong last_int_level;
+       int result;
+       ADV_DCNT i, j;
+       AdvPortAddr iop_base;
+
+       last_int_level = DvcEnterCritical();
+
+       iop_base = asc_dvc->iop_base;
+
+       /*
+        * Clear the idle command status which is set by the microcode
+        * to a non-zero value to indicate when the command is completed.
+        * The non-zero result is one of the IDLE_CMD_STATUS_* values
+        * defined in a_advlib.h.
+        */
+       AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, (ushort)0);
+
+       /*
+        * Write the idle command value after the idle command parameter
+        * has been written to avoid a race condition. If the order is not
+        * followed, the microcode may process the idle command before the
+        * parameters have been written to LRAM.
+        */
+       AdvWriteDWordLramNoSwap(iop_base, ASC_MC_IDLE_CMD_PARAMETER,
+                               cpu_to_le32(idle_cmd_parameter));
+       AdvWriteWordLram(iop_base, ASC_MC_IDLE_CMD, idle_cmd);
+
+       /*
+        * Tickle the RISC to tell it to process the idle command.
+        */
+       AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_B);
+       if (asc_dvc->chip_type == ADV_CHIP_ASC3550) {
+               /*
+                * Clear the tickle value. In the ASC-3550 the RISC flag
+                * command 'clr_tickle_b' does not work unless the host
+                * value is cleared.
+                */
+               AdvWriteByteRegister(iop_base, IOPB_TICKLE, ADV_TICKLE_NOP);
+       }
 
-    /* Wait for up to 100 millisecond for the idle command to timeout. */
-    for (i = 0; i < SCSI_WAIT_100_MSEC; i++)
-    {
-        /* Poll once each microsecond for command completion. */
-        for (j = 0; j < SCSI_US_PER_MSEC; j++)
-        {
-            AdvReadWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS, result);
-            if (result != 0)
-            {
-                DvcLeaveCritical(last_int_level);
-                return result;
-            }
-            DvcDelayMicroSecond(asc_dvc, (ushort) 1);
-        }
-    }
+       /* Wait for up to 100 millisecond for the idle command to timeout. */
+       for (i = 0; i < SCSI_WAIT_100_MSEC; i++) {
+               /* Poll once each microsecond for command completion. */
+               for (j = 0; j < SCSI_US_PER_MSEC; j++) {
+                       AdvReadWordLram(iop_base, ASC_MC_IDLE_CMD_STATUS,
+                                       result);
+                       if (result != 0) {
+                               DvcLeaveCritical(last_int_level);
+                               return result;
+                       }
+                       DvcDelayMicroSecond(asc_dvc, (ushort)1);
+               }
+       }
 
-    ASC_ASSERT(0); /* The idle command should never timeout. */
-    DvcLeaveCritical(last_int_level);
-    return ADV_ERROR;
+       ASC_ASSERT(0);          /* The idle command should never timeout. */
+       DvcLeaveCritical(last_int_level);
+       return ADV_ERROR;
 }
 
 /*
@@ -17976,179 +17617,1415 @@ AdvSendIdleCmd(ADV_DVC_VAR *asc_dvc,
  * microcode operating variables that affect WDTR, SDTR, and Tag
  * Queuing.
  */
-STATIC void
-AdvInquiryHandling(
-    ADV_DVC_VAR                 *asc_dvc,
-    ADV_SCSI_REQ_Q              *scsiq)
+static void AdvInquiryHandling(ADV_DVC_VAR *asc_dvc, ADV_SCSI_REQ_Q *scsiq)
 {
-    AdvPortAddr                 iop_base;
-    uchar                       tid;
-    ADV_SCSI_INQUIRY            *inq;
-    ushort                      tidmask;
-    ushort                      cfg_word;
+       AdvPortAddr iop_base;
+       uchar tid;
+       ADV_SCSI_INQUIRY *inq;
+       ushort tidmask;
+       ushort cfg_word;
+
+       /*
+        * AdvInquiryHandling() requires up to INQUIRY information Byte 7
+        * to be available.
+        *
+        * If less than 8 bytes of INQUIRY information were requested or less
+        * than 8 bytes were transferred, then return. cdb[4] is the request
+        * length and the ADV_SCSI_REQ_Q 'data_cnt' field is set by the
+        * microcode to the transfer residual count.
+        */
+
+       if (scsiq->cdb[4] < 8 ||
+           (scsiq->cdb[4] - le32_to_cpu(scsiq->data_cnt)) < 8) {
+               return;
+       }
 
-    /*
-     * AdvInquiryHandling() requires up to INQUIRY information Byte 7
-     * to be available.
-     *
-     * If less than 8 bytes of INQUIRY information were requested or less
-     * than 8 bytes were transferred, then return. cdb[4] is the request
-     * length and the ADV_SCSI_REQ_Q 'data_cnt' field is set by the
-     * microcode to the transfer residual count.
-     */
-
-    if (scsiq->cdb[4] < 8 ||
-        (scsiq->cdb[4] - le32_to_cpu(scsiq->data_cnt)) < 8)
-    {
-        return;
-    }
+       iop_base = asc_dvc->iop_base;
+       tid = scsiq->target_id;
+
+       inq = (ADV_SCSI_INQUIRY *) scsiq->vdata_addr;
 
-    iop_base = asc_dvc->iop_base;
-    tid = scsiq->target_id;
+       /*
+        * WDTR, SDTR, and Tag Queuing cannot be enabled for old devices.
+        */
+       if (ADV_INQ_RESPONSE_FMT(inq) < 2 && ADV_INQ_ANSI_VER(inq) < 2) {
+               return;
+       } else {
+               /*
+                * INQUIRY Byte 7 Handling
+                *
+                * Use a device's INQUIRY byte 7 to determine whether it
+                * supports WDTR, SDTR, and Tag Queuing. If the feature
+                * is enabled in the EEPROM and the device supports the
+                * feature, then enable it in the microcode.
+                */
 
-    inq = (ADV_SCSI_INQUIRY *) scsiq->vdata_addr;
+               tidmask = ADV_TID_TO_TIDMASK(tid);
 
-    /*
-     * WDTR, SDTR, and Tag Queuing cannot be enabled for old devices.
-     */
-    if (ADV_INQ_RESPONSE_FMT(inq) < 2 && ADV_INQ_ANSI_VER(inq) < 2)
-    {
-        return;
-    } else
-    {
-        /*
-         * INQUIRY Byte 7 Handling
-         *
-         * Use a device's INQUIRY byte 7 to determine whether it
-         * supports WDTR, SDTR, and Tag Queuing. If the feature
-         * is enabled in the EEPROM and the device supports the
-         * feature, then enable it in the microcode.
-         */
-
-        tidmask = ADV_TID_TO_TIDMASK(tid);
-
-        /*
-         * Wide Transfers
-         *
-         * If the EEPROM enabled WDTR for the device and the device
-         * supports wide bus (16 bit) transfers, then turn on the
-         * device's 'wdtr_able' bit and write the new value to the
-         * microcode.
-         */
-        if ((asc_dvc->wdtr_able & tidmask) && ADV_INQ_WIDE16(inq))
-        {
-            AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
-            if ((cfg_word & tidmask) == 0)
-            {
-                cfg_word |= tidmask;
-                AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
-
-                /*
-                 * Clear the microcode "SDTR negotiation" and "WDTR
-                 * negotiation" done indicators for the target to cause
-                 * it to negotiate with the new setting set above.
-                 * WDTR when accepted causes the target to enter
-                 * asynchronous mode, so SDTR must be negotiated.
-                 */
-                AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
-                cfg_word &= ~tidmask;
-                AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
-                AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
-                cfg_word &= ~tidmask;
-                AdvWriteWordLram(iop_base, ASC_MC_WDTR_DONE, cfg_word);
-            }
-        }
-
-        /*
-         * Synchronous Transfers
-         *
-         * If the EEPROM enabled SDTR for the device and the device
-         * supports synchronous transfers, then turn on the device's
-         * 'sdtr_able' bit. Write the new value to the microcode.
-         */
-        if ((asc_dvc->sdtr_able & tidmask) && ADV_INQ_SYNC(inq))
-        {
-            AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
-            if ((cfg_word & tidmask) == 0)
-            {
-                cfg_word |= tidmask;
-                AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
-
-                /*
-                 * Clear the microcode "SDTR negotiation" done indicator
-                 * for the target to cause it to negotiate with the new
-                 * setting set above.
-                 */
-                AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
-                cfg_word &= ~tidmask;
-                AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE, cfg_word);
-            }
-        }
-        /*
-         * If the Inquiry data included enough space for the SPI-3
-         * Clocking field, then check if DT mode is supported.
-         */
-        if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600 &&
-            (scsiq->cdb[4] >= 57 ||
-            (scsiq->cdb[4] - le32_to_cpu(scsiq->data_cnt)) >= 57))
-        {
-            /*
-             * PPR (Parallel Protocol Request) Capable
-             *
-             * If the device supports DT mode, then it must be PPR capable.
-             * The PPR message will be used in place of the SDTR and WDTR
-             * messages to negotiate synchronous speed and offset, transfer
-             * width, and protocol options.
-             */
-            if (ADV_INQ_CLOCKING(inq) & ADV_INQ_CLOCKING_DT_ONLY)
-            {
-                AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE, asc_dvc->ppr_able);
-                asc_dvc->ppr_able |= tidmask;
-                AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE, asc_dvc->ppr_able);
-            }
-        }
-
-        /*
-         * If the EEPROM enabled Tag Queuing for the device and the
-         * device supports Tag Queueing, then turn on the device's
-         * 'tagqng_enable' bit in the microcode and set the microcode
-         * maximum command count to the ADV_DVC_VAR 'max_dvc_qng'
-         * value.
-         *
-         * Tag Queuing is disabled for the BIOS which runs in polled
-         * mode and would see no benefit from Tag Queuing. Also by
-         * disabling Tag Queuing in the BIOS devices with Tag Queuing
-         * bugs will at least work with the BIOS.
-         */
-        if ((asc_dvc->tagqng_able & tidmask) && ADV_INQ_CMD_QUEUE(inq))
-        {
-            AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
-            cfg_word |= tidmask;
-            AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
-
-            AdvWriteByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + tid,
-                asc_dvc->max_dvc_qng);
-        }
-    }
+               /*
+                * Wide Transfers
+                *
+                * If the EEPROM enabled WDTR for the device and the device
+                * supports wide bus (16 bit) transfers, then turn on the
+                * device's 'wdtr_able' bit and write the new value to the
+                * microcode.
+                */
+               if ((asc_dvc->wdtr_able & tidmask) && ADV_INQ_WIDE16(inq)) {
+                       AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, cfg_word);
+                       if ((cfg_word & tidmask) == 0) {
+                               cfg_word |= tidmask;
+                               AdvWriteWordLram(iop_base, ASC_MC_WDTR_ABLE,
+                                                cfg_word);
+
+                               /*
+                                * Clear the microcode "SDTR negotiation" and "WDTR
+                                * negotiation" done indicators for the target to cause
+                                * it to negotiate with the new setting set above.
+                                * WDTR when accepted causes the target to enter
+                                * asynchronous mode, so SDTR must be negotiated.
+                                */
+                               AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE,
+                                               cfg_word);
+                               cfg_word &= ~tidmask;
+                               AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE,
+                                                cfg_word);
+                               AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE,
+                                               cfg_word);
+                               cfg_word &= ~tidmask;
+                               AdvWriteWordLram(iop_base, ASC_MC_WDTR_DONE,
+                                                cfg_word);
+                       }
+               }
+
+               /*
+                * Synchronous Transfers
+                *
+                * If the EEPROM enabled SDTR for the device and the device
+                * supports synchronous transfers, then turn on the device's
+                * 'sdtr_able' bit. Write the new value to the microcode.
+                */
+               if ((asc_dvc->sdtr_able & tidmask) && ADV_INQ_SYNC(inq)) {
+                       AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, cfg_word);
+                       if ((cfg_word & tidmask) == 0) {
+                               cfg_word |= tidmask;
+                               AdvWriteWordLram(iop_base, ASC_MC_SDTR_ABLE,
+                                                cfg_word);
+
+                               /*
+                                * Clear the microcode "SDTR negotiation" done indicator
+                                * for the target to cause it to negotiate with the new
+                                * setting set above.
+                                */
+                               AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE,
+                                               cfg_word);
+                               cfg_word &= ~tidmask;
+                               AdvWriteWordLram(iop_base, ASC_MC_SDTR_DONE,
+                                                cfg_word);
+                       }
+               }
+               /*
+                * If the Inquiry data included enough space for the SPI-3
+                * Clocking field, then check if DT mode is supported.
+                */
+               if (asc_dvc->chip_type == ADV_CHIP_ASC38C1600 &&
+                   (scsiq->cdb[4] >= 57 ||
+                    (scsiq->cdb[4] - le32_to_cpu(scsiq->data_cnt)) >= 57)) {
+                       /*
+                        * PPR (Parallel Protocol Request) Capable
+                        *
+                        * If the device supports DT mode, then it must be PPR capable.
+                        * The PPR message will be used in place of the SDTR and WDTR
+                        * messages to negotiate synchronous speed and offset, transfer
+                        * width, and protocol options.
+                        */
+                       if (ADV_INQ_CLOCKING(inq) & ADV_INQ_CLOCKING_DT_ONLY) {
+                               AdvReadWordLram(iop_base, ASC_MC_PPR_ABLE,
+                                               asc_dvc->ppr_able);
+                               asc_dvc->ppr_able |= tidmask;
+                               AdvWriteWordLram(iop_base, ASC_MC_PPR_ABLE,
+                                                asc_dvc->ppr_able);
+                       }
+               }
+
+               /*
+                * If the EEPROM enabled Tag Queuing for the device and the
+                * device supports Tag Queueing, then turn on the device's
+                * 'tagqng_enable' bit in the microcode and set the microcode
+                * maximum command count to the ADV_DVC_VAR 'max_dvc_qng'
+                * value.
+                *
+                * Tag Queuing is disabled for the BIOS which runs in polled
+                * mode and would see no benefit from Tag Queuing. Also by
+                * disabling Tag Queuing in the BIOS devices with Tag Queuing
+                * bugs will at least work with the BIOS.
+                */
+               if ((asc_dvc->tagqng_able & tidmask) && ADV_INQ_CMD_QUEUE(inq)) {
+                       AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, cfg_word);
+                       cfg_word |= tidmask;
+                       AdvWriteWordLram(iop_base, ASC_MC_TAGQNG_ABLE,
+                                        cfg_word);
+
+                       AdvWriteByteLram(iop_base,
+                                        ASC_MC_NUMBER_OF_MAX_CMD + tid,
+                                        asc_dvc->max_dvc_qng);
+               }
+       }
 }
+
 MODULE_LICENSE("Dual BSD/GPL");
 
+static struct Scsi_Host *__devinit
+advansys_board_found(int iop, struct device *dev, int bus_type)
+{
+       struct Scsi_Host *shost;
+       struct pci_dev *pdev = bus_type == ASC_IS_PCI ? to_pci_dev(dev) : NULL;
+       asc_board_t *boardp;
+       ASC_DVC_VAR *asc_dvc_varp = NULL;
+       ADV_DVC_VAR *adv_dvc_varp = NULL;
+       adv_sgblk_t *sgp = NULL;
+       int share_irq = FALSE;
+       int iolen = 0;
+       ADV_PADDR pci_memory_address;
+       int warn_code, err_code;
+       int ret;
+
+       /*
+        * Adapter found.
+        *
+        * Register the adapter, get its configuration, and
+        * initialize it.
+        */
+       ASC_DBG(2, "advansys_board_found: scsi_register()\n");
+       shost = scsi_register(&driver_template, sizeof(asc_board_t));
+
+       if (!shost)
+               return NULL;
+
+       /* Save a pointer to the Scsi_Host of each board found. */
+       asc_host[asc_board_count++] = shost;
+
+       /* Initialize private per board data */
+       boardp = ASC_BOARDP(shost);
+       memset(boardp, 0, sizeof(asc_board_t));
+       boardp->id = asc_board_count - 1;
+
+       /* Initialize spinlock. */
+       spin_lock_init(&boardp->lock);
+
+       /*
+        * Handle both narrow and wide boards.
+        *
+        * If a Wide board was detected, set the board structure
+        * wide board flag. Set-up the board structure based on
+        * the board type.
+        */
+#ifdef CONFIG_PCI
+       if (bus_type == ASC_IS_PCI &&
+           (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW ||
+            pdev->device == PCI_DEVICE_ID_38C0800_REV1 ||
+            pdev->device == PCI_DEVICE_ID_38C1600_REV1)) {
+               boardp->flags |= ASC_IS_WIDE_BOARD;
+       }
+#endif /* CONFIG_PCI */
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               ASC_DBG(1, "advansys_board_found: narrow board\n");
+               asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
+               asc_dvc_varp->bus_type = bus_type;
+               asc_dvc_varp->drv_ptr = boardp;
+               asc_dvc_varp->cfg = &boardp->dvc_cfg.asc_dvc_cfg;
+               asc_dvc_varp->cfg->overrun_buf = &overrun_buf[0];
+               asc_dvc_varp->iop_base = iop;
+               asc_dvc_varp->isr_callback = asc_isr_callback;
+       } else {
+               ASC_DBG(1, "advansys_board_found: wide board\n");
+               adv_dvc_varp = &boardp->dvc_var.adv_dvc_var;
+               adv_dvc_varp->drv_ptr = boardp;
+               adv_dvc_varp->cfg = &boardp->dvc_cfg.adv_dvc_cfg;
+               adv_dvc_varp->isr_callback = adv_isr_callback;
+               adv_dvc_varp->async_callback = adv_async_callback;
+#ifdef CONFIG_PCI
+               if (pdev->device == PCI_DEVICE_ID_ASP_ABP940UW) {
+                       ASC_DBG(1, "advansys_board_found: ASC-3550\n");
+                       adv_dvc_varp->chip_type = ADV_CHIP_ASC3550;
+               } else if (pdev->device == PCI_DEVICE_ID_38C0800_REV1) {
+                       ASC_DBG(1, "advansys_board_found: ASC-38C0800\n");
+                       adv_dvc_varp->chip_type = ADV_CHIP_ASC38C0800;
+               } else {
+                       ASC_DBG(1, "advansys_board_found: ASC-38C1600\n");
+                       adv_dvc_varp->chip_type = ADV_CHIP_ASC38C1600;
+               }
+#endif /* CONFIG_PCI */
+
+               /*
+                * Map the board's registers into virtual memory for
+                * PCI slave access. Only memory accesses are used to
+                * access the board's registers.
+                *
+                * Note: The PCI register base address is not always
+                * page aligned, but the address passed to ioremap()
+                * must be page aligned. It is guaranteed that the
+                * PCI register base address will not cross a page
+                * boundary.
+                */
+               if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+                       iolen = ADV_3550_IOLEN;
+               } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+                       iolen = ADV_38C0800_IOLEN;
+               } else {
+                       iolen = ADV_38C1600_IOLEN;
+               }
+#ifdef CONFIG_PCI
+               pci_memory_address = pci_resource_start(pdev, 1);
+               ASC_DBG1(1,
+                        "advansys_board_found: pci_memory_address: 0x%lx\n",
+                        (ulong)pci_memory_address);
+               if ((boardp->ioremap_addr =
+                    ioremap(pci_memory_address & PAGE_MASK, PAGE_SIZE)) == 0) {
+                       ASC_PRINT3
+                           ("advansys_board_found: board %d: ioremap(%x, %d) returned NULL\n",
+                            boardp->id, pci_memory_address, iolen);
+                       scsi_unregister(shost);
+                       asc_board_count--;
+                       return NULL;
+               }
+               ASC_DBG1(1,
+                        "advansys_board_found: ioremap_addr: 0x%lx\n",
+                        (ulong)boardp->ioremap_addr);
+               adv_dvc_varp->iop_base = (AdvPortAddr)
+                   (boardp->ioremap_addr +
+                    (pci_memory_address - (pci_memory_address & PAGE_MASK)));
+               ASC_DBG1(1,
+                        "advansys_board_found: iop_base: 0x%lx\n",
+                        adv_dvc_varp->iop_base);
+#endif /* CONFIG_PCI */
+
+               /*
+                * Even though it isn't used to access wide boards, other
+                * than for the debug line below, save I/O Port address so
+                * that it can be reported.
+                */
+               boardp->ioport = iop;
+
+               ASC_DBG2(1,
+                        "advansys_board_found: iopb_chip_id_1 0x%x, iopw_chip_id_0 0x%x\n",
+                        (ushort)inp(iop + 1), (ushort)inpw(iop));
+       }
+
+#ifdef CONFIG_PROC_FS
+       /*
+        * Allocate buffer for printing information from
+        * /proc/scsi/advansys/[0...].
+        */
+       if ((boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_ATOMIC)) == NULL) {
+               ASC_PRINT3
+                   ("advansys_board_found: board %d: kmalloc(%d, %d) returned NULL\n",
+                    boardp->id, ASC_PRTBUF_SIZE, GFP_ATOMIC);
+               scsi_unregister(shost);
+               asc_board_count--;
+               return NULL;
+       }
+#endif /* CONFIG_PROC_FS */
+
+       if (ASC_NARROW_BOARD(boardp)) {
+               asc_dvc_varp->cfg->dev = dev;
+               /*
+                * Set the board bus type and PCI IRQ before
+                * calling AscInitGetConfig().
+                */
+               switch (asc_dvc_varp->bus_type) {
+#ifdef CONFIG_ISA
+               case ASC_IS_ISA:
+                       shost->unchecked_isa_dma = TRUE;
+                       share_irq = FALSE;
+                       break;
+               case ASC_IS_VL:
+                       shost->unchecked_isa_dma = FALSE;
+                       share_irq = FALSE;
+                       break;
+               case ASC_IS_EISA:
+                       shost->unchecked_isa_dma = FALSE;
+                       share_irq = TRUE;
+                       break;
+#endif /* CONFIG_ISA */
+#ifdef CONFIG_PCI
+               case ASC_IS_PCI:
+                       shost->irq = asc_dvc_varp->irq_no = pdev->irq;
+                       asc_dvc_varp->cfg->pci_slot_info =
+                           ASC_PCI_MKID(pdev->bus->number,
+                                        PCI_SLOT(pdev->devfn),
+                                        PCI_FUNC(pdev->devfn));
+                       shost->unchecked_isa_dma = FALSE;
+                       share_irq = TRUE;
+                       break;
+#endif /* CONFIG_PCI */
+               default:
+                       ASC_PRINT2
+                           ("advansys_board_found: board %d: unknown adapter type: %d\n",
+                            boardp->id, asc_dvc_varp->bus_type);
+                       shost->unchecked_isa_dma = TRUE;
+                       share_irq = FALSE;
+                       break;
+               }
+       } else {
+               adv_dvc_varp->cfg->dev = dev;
+               /*
+                * For Wide boards set PCI information before calling
+                * AdvInitGetConfig().
+                */
+#ifdef CONFIG_PCI
+               shost->irq = adv_dvc_varp->irq_no = pdev->irq;
+               adv_dvc_varp->cfg->pci_slot_info =
+                   ASC_PCI_MKID(pdev->bus->number,
+                                PCI_SLOT(pdev->devfn),
+                                PCI_FUNC(pdev->devfn));
+               shost->unchecked_isa_dma = FALSE;
+               share_irq = TRUE;
+#endif /* CONFIG_PCI */
+       }
+
+       /*
+        * Read the board configuration.
+        */
+       if (ASC_NARROW_BOARD(boardp)) {
+               /*
+                * NOTE: AscInitGetConfig() may change the board's
+                * bus_type value. The bus_type value should no
+                * longer be used. If the bus_type field must be
+                * referenced only use the bit-wise AND operator "&".
+                */
+               ASC_DBG(2, "advansys_board_found: AscInitGetConfig()\n");
+               switch (ret = AscInitGetConfig(asc_dvc_varp)) {
+               case 0: /* No error */
+                       break;
+               case ASC_WARN_IO_PORT_ROTATE:
+                       ASC_PRINT1
+                           ("AscInitGetConfig: board %d: I/O port address modified\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_AUTO_CONFIG:
+                       ASC_PRINT1
+                           ("AscInitGetConfig: board %d: I/O port increment switch enabled\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_EEPROM_CHKSUM:
+                       ASC_PRINT1
+                           ("AscInitGetConfig: board %d: EEPROM checksum error\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_IRQ_MODIFIED:
+                       ASC_PRINT1
+                           ("AscInitGetConfig: board %d: IRQ modified\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_CMD_QNG_CONFLICT:
+                       ASC_PRINT1
+                           ("AscInitGetConfig: board %d: tag queuing enabled w/o disconnects\n",
+                            boardp->id);
+                       break;
+               default:
+                       ASC_PRINT2
+                           ("AscInitGetConfig: board %d: unknown warning: 0x%x\n",
+                            boardp->id, ret);
+                       break;
+               }
+               if ((err_code = asc_dvc_varp->err_code) != 0) {
+                       ASC_PRINT3
+                           ("AscInitGetConfig: board %d error: init_state 0x%x, err_code 0x%x\n",
+                            boardp->id,
+                            asc_dvc_varp->init_state, asc_dvc_varp->err_code);
+               }
+       } else {
+               ASC_DBG(2, "advansys_board_found: AdvInitGetConfig()\n");
+               if ((ret = AdvInitGetConfig(adv_dvc_varp)) != 0) {
+                       ASC_PRINT2
+                           ("AdvInitGetConfig: board %d: warning: 0x%x\n",
+                            boardp->id, ret);
+               }
+               if ((err_code = adv_dvc_varp->err_code) != 0) {
+                       ASC_PRINT2
+                           ("AdvInitGetConfig: board %d error: err_code 0x%x\n",
+                            boardp->id, adv_dvc_varp->err_code);
+               }
+       }
+
+       if (err_code != 0) {
+#ifdef CONFIG_PROC_FS
+               kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+               scsi_unregister(shost);
+               asc_board_count--;
+               return NULL;
+       }
+
+       /*
+        * Save the EEPROM configuration so that it can be displayed
+        * from /proc/scsi/advansys/[0...].
+        */
+       if (ASC_NARROW_BOARD(boardp)) {
+
+               ASCEEP_CONFIG *ep;
+
+               /*
+                * Set the adapter's target id bit in the 'init_tidmask' field.
+                */
+               boardp->init_tidmask |=
+                   ADV_TID_TO_TIDMASK(asc_dvc_varp->cfg->chip_scsi_id);
+
+               /*
+                * Save EEPROM settings for the board.
+                */
+               ep = &boardp->eep_config.asc_eep;
+
+               ep->init_sdtr = asc_dvc_varp->cfg->sdtr_enable;
+               ep->disc_enable = asc_dvc_varp->cfg->disc_enable;
+               ep->use_cmd_qng = asc_dvc_varp->cfg->cmd_qng_enabled;
+               ASC_EEP_SET_DMA_SPD(ep, asc_dvc_varp->cfg->isa_dma_speed);
+               ep->start_motor = asc_dvc_varp->start_motor;
+               ep->cntl = asc_dvc_varp->dvc_cntl;
+               ep->no_scam = asc_dvc_varp->no_scam;
+               ep->max_total_qng = asc_dvc_varp->max_total_qng;
+               ASC_EEP_SET_CHIP_ID(ep, asc_dvc_varp->cfg->chip_scsi_id);
+               /* 'max_tag_qng' is set to the same value for every device. */
+               ep->max_tag_qng = asc_dvc_varp->cfg->max_tag_qng[0];
+               ep->adapter_info[0] = asc_dvc_varp->cfg->adapter_info[0];
+               ep->adapter_info[1] = asc_dvc_varp->cfg->adapter_info[1];
+               ep->adapter_info[2] = asc_dvc_varp->cfg->adapter_info[2];
+               ep->adapter_info[3] = asc_dvc_varp->cfg->adapter_info[3];
+               ep->adapter_info[4] = asc_dvc_varp->cfg->adapter_info[4];
+               ep->adapter_info[5] = asc_dvc_varp->cfg->adapter_info[5];
+
+               /*
+                * Modify board configuration.
+                */
+               ASC_DBG(2, "advansys_board_found: AscInitSetConfig()\n");
+               switch (ret = AscInitSetConfig(asc_dvc_varp)) {
+               case 0: /* No error. */
+                       break;
+               case ASC_WARN_IO_PORT_ROTATE:
+                       ASC_PRINT1
+                           ("AscInitSetConfig: board %d: I/O port address modified\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_AUTO_CONFIG:
+                       ASC_PRINT1
+                           ("AscInitSetConfig: board %d: I/O port increment switch enabled\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_EEPROM_CHKSUM:
+                       ASC_PRINT1
+                           ("AscInitSetConfig: board %d: EEPROM checksum error\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_IRQ_MODIFIED:
+                       ASC_PRINT1
+                           ("AscInitSetConfig: board %d: IRQ modified\n",
+                            boardp->id);
+                       break;
+               case ASC_WARN_CMD_QNG_CONFLICT:
+                       ASC_PRINT1
+                           ("AscInitSetConfig: board %d: tag queuing w/o disconnects\n",
+                            boardp->id);
+                       break;
+               default:
+                       ASC_PRINT2
+                           ("AscInitSetConfig: board %d: unknown warning: 0x%x\n",
+                            boardp->id, ret);
+                       break;
+               }
+               if (asc_dvc_varp->err_code != 0) {
+                       ASC_PRINT3
+                           ("AscInitSetConfig: board %d error: init_state 0x%x, err_code 0x%x\n",
+                            boardp->id,
+                            asc_dvc_varp->init_state, asc_dvc_varp->err_code);
+#ifdef CONFIG_PROC_FS
+                       kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+                       scsi_unregister(shost);
+                       asc_board_count--;
+                       return NULL;
+               }
+
+               /*
+                * Finish initializing the 'Scsi_Host' structure.
+                */
+               /* AscInitSetConfig() will set the IRQ for non-PCI boards. */
+               if ((asc_dvc_varp->bus_type & ASC_IS_PCI) == 0) {
+                       shost->irq = asc_dvc_varp->irq_no;
+               }
+       } else {
+               ADVEEP_3550_CONFIG *ep_3550;
+               ADVEEP_38C0800_CONFIG *ep_38C0800;
+               ADVEEP_38C1600_CONFIG *ep_38C1600;
+
+               /*
+                * Save Wide EEP Configuration Information.
+                */
+               if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+                       ep_3550 = &boardp->eep_config.adv_3550_eep;
+
+                       ep_3550->adapter_scsi_id = adv_dvc_varp->chip_scsi_id;
+                       ep_3550->max_host_qng = adv_dvc_varp->max_host_qng;
+                       ep_3550->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
+                       ep_3550->termination = adv_dvc_varp->cfg->termination;
+                       ep_3550->disc_enable = adv_dvc_varp->cfg->disc_enable;
+                       ep_3550->bios_ctrl = adv_dvc_varp->bios_ctrl;
+                       ep_3550->wdtr_able = adv_dvc_varp->wdtr_able;
+                       ep_3550->sdtr_able = adv_dvc_varp->sdtr_able;
+                       ep_3550->ultra_able = adv_dvc_varp->ultra_able;
+                       ep_3550->tagqng_able = adv_dvc_varp->tagqng_able;
+                       ep_3550->start_motor = adv_dvc_varp->start_motor;
+                       ep_3550->scsi_reset_delay =
+                           adv_dvc_varp->scsi_reset_wait;
+                       ep_3550->serial_number_word1 =
+                           adv_dvc_varp->cfg->serial1;
+                       ep_3550->serial_number_word2 =
+                           adv_dvc_varp->cfg->serial2;
+                       ep_3550->serial_number_word3 =
+                           adv_dvc_varp->cfg->serial3;
+               } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
+                       ep_38C0800 = &boardp->eep_config.adv_38C0800_eep;
+
+                       ep_38C0800->adapter_scsi_id =
+                           adv_dvc_varp->chip_scsi_id;
+                       ep_38C0800->max_host_qng = adv_dvc_varp->max_host_qng;
+                       ep_38C0800->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
+                       ep_38C0800->termination_lvd =
+                           adv_dvc_varp->cfg->termination;
+                       ep_38C0800->disc_enable =
+                           adv_dvc_varp->cfg->disc_enable;
+                       ep_38C0800->bios_ctrl = adv_dvc_varp->bios_ctrl;
+                       ep_38C0800->wdtr_able = adv_dvc_varp->wdtr_able;
+                       ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
+                       ep_38C0800->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
+                       ep_38C0800->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
+                       ep_38C0800->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
+                       ep_38C0800->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
+                       ep_38C0800->tagqng_able = adv_dvc_varp->tagqng_able;
+                       ep_38C0800->start_motor = adv_dvc_varp->start_motor;
+                       ep_38C0800->scsi_reset_delay =
+                           adv_dvc_varp->scsi_reset_wait;
+                       ep_38C0800->serial_number_word1 =
+                           adv_dvc_varp->cfg->serial1;
+                       ep_38C0800->serial_number_word2 =
+                           adv_dvc_varp->cfg->serial2;
+                       ep_38C0800->serial_number_word3 =
+                           adv_dvc_varp->cfg->serial3;
+               } else {
+                       ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
+
+                       ep_38C1600->adapter_scsi_id =
+                           adv_dvc_varp->chip_scsi_id;
+                       ep_38C1600->max_host_qng = adv_dvc_varp->max_host_qng;
+                       ep_38C1600->max_dvc_qng = adv_dvc_varp->max_dvc_qng;
+                       ep_38C1600->termination_lvd =
+                           adv_dvc_varp->cfg->termination;
+                       ep_38C1600->disc_enable =
+                           adv_dvc_varp->cfg->disc_enable;
+                       ep_38C1600->bios_ctrl = adv_dvc_varp->bios_ctrl;
+                       ep_38C1600->wdtr_able = adv_dvc_varp->wdtr_able;
+                       ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
+                       ep_38C1600->sdtr_speed1 = adv_dvc_varp->sdtr_speed1;
+                       ep_38C1600->sdtr_speed2 = adv_dvc_varp->sdtr_speed2;
+                       ep_38C1600->sdtr_speed3 = adv_dvc_varp->sdtr_speed3;
+                       ep_38C1600->sdtr_speed4 = adv_dvc_varp->sdtr_speed4;
+                       ep_38C1600->tagqng_able = adv_dvc_varp->tagqng_able;
+                       ep_38C1600->start_motor = adv_dvc_varp->start_motor;
+                       ep_38C1600->scsi_reset_delay =
+                           adv_dvc_varp->scsi_reset_wait;
+                       ep_38C1600->serial_number_word1 =
+                           adv_dvc_varp->cfg->serial1;
+                       ep_38C1600->serial_number_word2 =
+                           adv_dvc_varp->cfg->serial2;
+                       ep_38C1600->serial_number_word3 =
+                           adv_dvc_varp->cfg->serial3;
+               }
+
+               /*
+                * Set the adapter's target id bit in the 'init_tidmask' field.
+                */
+               boardp->init_tidmask |=
+                   ADV_TID_TO_TIDMASK(adv_dvc_varp->chip_scsi_id);
+
+               /*
+                * Finish initializing the 'Scsi_Host' structure.
+                */
+               shost->irq = adv_dvc_varp->irq_no;
+       }
+
+       /*
+        * Channels are numbered beginning with 0. For AdvanSys one host
+        * structure supports one channel. Multi-channel boards have a
+        * separate host structure for each channel.
+        */
+       shost->max_channel = 0;
+       if (ASC_NARROW_BOARD(boardp)) {
+               shost->max_id = ASC_MAX_TID + 1;
+               shost->max_lun = ASC_MAX_LUN + 1;
+
+               shost->io_port = asc_dvc_varp->iop_base;
+               boardp->asc_n_io_port = ASC_IOADR_GAP;
+               shost->this_id = asc_dvc_varp->cfg->chip_scsi_id;
+
+               /* Set maximum number of queues the adapter can handle. */
+               shost->can_queue = asc_dvc_varp->max_total_qng;
+       } else {
+               shost->max_id = ADV_MAX_TID + 1;
+               shost->max_lun = ADV_MAX_LUN + 1;
+
+               /*
+                * Save the I/O Port address and length even though
+                * I/O ports are not used to access Wide boards.
+                * Instead the Wide boards are accessed with
+                * PCI Memory Mapped I/O.
+                */
+               shost->io_port = iop;
+               boardp->asc_n_io_port = iolen;
+
+               shost->this_id = adv_dvc_varp->chip_scsi_id;
+
+               /* Set maximum number of queues the adapter can handle. */
+               shost->can_queue = adv_dvc_varp->max_host_qng;
+       }
+
+       /*
+        * 'n_io_port' currently is one byte.
+        *
+        * Set a value to 'n_io_port', but never referenced it because
+        * it may be truncated.
+        */
+       shost->n_io_port = boardp->asc_n_io_port <= 255 ?
+           boardp->asc_n_io_port : 255;
+
+       /*
+        * Following v1.3.89, 'cmd_per_lun' is no longer needed
+        * and should be set to zero.
+        *
+        * But because of a bug introduced in v1.3.89 if the driver is
+        * compiled as a module and 'cmd_per_lun' is zero, the Mid-Level
+        * SCSI function 'allocate_device' will panic. To allow the driver
+        * to work as a module in these kernels set 'cmd_per_lun' to 1.
+        *
+        * Note: This is wrong.  cmd_per_lun should be set to the depth
+        * you want on untagged devices always.
+        #ifdef MODULE
+        */
+       shost->cmd_per_lun = 1;
+/* #else
+            shost->cmd_per_lun = 0;
+#endif */
+
+       /*
+        * Set the maximum number of scatter-gather elements the
+        * adapter can handle.
+        */
+       if (ASC_NARROW_BOARD(boardp)) {
+               /*
+                * Allow two commands with 'sg_tablesize' scatter-gather
+                * elements to be executed simultaneously. This value is
+                * the theoretical hardware limit. It may be decreased
+                * below.
+                */
+               shost->sg_tablesize =
+                   (((asc_dvc_varp->max_total_qng - 2) / 2) *
+                    ASC_SG_LIST_PER_Q) + 1;
+       } else {
+               shost->sg_tablesize = ADV_MAX_SG_LIST;
+       }
+
+       /*
+        * The value of 'sg_tablesize' can not exceed the SCSI
+        * mid-level driver definition of SG_ALL. SG_ALL also
+        * must not be exceeded, because it is used to define the
+        * size of the scatter-gather table in 'struct asc_sg_head'.
+        */
+       if (shost->sg_tablesize > SG_ALL) {
+               shost->sg_tablesize = SG_ALL;
+       }
+
+       ASC_DBG1(1, "advansys_board_found: sg_tablesize: %d\n", shost->sg_tablesize);
+
+       /* BIOS start address. */
+       if (ASC_NARROW_BOARD(boardp)) {
+               shost->base = ((ulong)
+                            AscGetChipBiosAddress(asc_dvc_varp->
+                                                  iop_base,
+                                                  asc_dvc_varp->bus_type));
+       } else {
+               /*
+                * Fill-in BIOS board variables. The Wide BIOS saves
+                * information in LRAM that is used by the driver.
+                */
+               AdvReadWordLram(adv_dvc_varp->iop_base,
+                               BIOS_SIGNATURE, boardp->bios_signature);
+               AdvReadWordLram(adv_dvc_varp->iop_base,
+                               BIOS_VERSION, boardp->bios_version);
+               AdvReadWordLram(adv_dvc_varp->iop_base,
+                               BIOS_CODESEG, boardp->bios_codeseg);
+               AdvReadWordLram(adv_dvc_varp->iop_base,
+                               BIOS_CODELEN, boardp->bios_codelen);
+
+               ASC_DBG2(1,
+                        "advansys_board_found: bios_signature 0x%x, bios_version 0x%x\n",
+                        boardp->bios_signature, boardp->bios_version);
+
+               ASC_DBG2(1,
+                        "advansys_board_found: bios_codeseg 0x%x, bios_codelen 0x%x\n",
+                        boardp->bios_codeseg, boardp->bios_codelen);
+
+               /*
+                * If the BIOS saved a valid signature, then fill in
+                * the BIOS code segment base address.
+                */
+               if (boardp->bios_signature == 0x55AA) {
+                       /*
+                        * Convert x86 realmode code segment to a linear
+                        * address by shifting left 4.
+                        */
+                       shost->base = ((ulong)boardp->bios_codeseg << 4);
+               } else {
+                       shost->base = 0;
+               }
+       }
+
+       /*
+        * Register Board Resources - I/O Port, DMA, IRQ
+        */
+
+       /*
+        * Register I/O port range.
+        *
+        * For Wide boards the I/O ports are not used to access
+        * the board, but request the region anyway.
+        *
+        * 'shost->n_io_port' is not referenced, because it may be truncated.
+        */
+       ASC_DBG2(2,
+                "advansys_board_found: request_region port 0x%lx, len 0x%x\n",
+                (ulong)shost->io_port, boardp->asc_n_io_port);
+       if (request_region(shost->io_port, boardp->asc_n_io_port,
+                          "advansys") == NULL) {
+               ASC_PRINT3
+                   ("advansys_board_found: board %d: request_region() failed, port 0x%lx, len 0x%x\n",
+                    boardp->id, (ulong)shost->io_port, boardp->asc_n_io_port);
+#ifdef CONFIG_PROC_FS
+               kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+               scsi_unregister(shost);
+               asc_board_count--;
+               return NULL;
+       }
+
+       /* Register DMA Channel for Narrow boards. */
+       shost->dma_channel = NO_ISA_DMA;        /* Default to no ISA DMA. */
+#ifdef CONFIG_ISA
+       if (ASC_NARROW_BOARD(boardp)) {
+               /* Register DMA channel for ISA bus. */
+               if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
+                       shost->dma_channel = asc_dvc_varp->cfg->isa_dma_channel;
+                       if ((ret =
+                            request_dma(shost->dma_channel, "advansys")) != 0) {
+                               ASC_PRINT3
+                                   ("advansys_board_found: board %d: request_dma() %d failed %d\n",
+                                    boardp->id, shost->dma_channel, ret);
+                               release_region(shost->io_port,
+                                              boardp->asc_n_io_port);
+#ifdef CONFIG_PROC_FS
+                               kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+                               scsi_unregister(shost);
+                               asc_board_count--;
+                               return NULL;
+                       }
+                       AscEnableIsaDma(shost->dma_channel);
+               }
+       }
+#endif /* CONFIG_ISA */
+
+       /* Register IRQ Number. */
+       ASC_DBG1(2, "advansys_board_found: request_irq() %d\n", shost->irq);
+       /*
+        * If request_irq() fails with the IRQF_DISABLED flag set,
+        * then try again without the IRQF_DISABLED flag set. This
+        * allows IRQ sharing to work even with other drivers that
+        * do not set the IRQF_DISABLED flag.
+        *
+        * If IRQF_DISABLED is not set, then interrupts are enabled
+        * before the driver interrupt function is called.
+        */
+       if (((ret = request_irq(shost->irq, advansys_interrupt,
+                               IRQF_DISABLED | (share_irq ==
+                                                TRUE ?
+                                                IRQF_SHARED :
+                                                0), "advansys", boardp)) != 0)
+           &&
+           ((ret =
+             request_irq(shost->irq, advansys_interrupt,
+                         (share_irq == TRUE ? IRQF_SHARED : 0),
+                         "advansys", boardp)) != 0)) {
+               if (ret == -EBUSY) {
+                       ASC_PRINT2
+                           ("advansys_board_found: board %d: request_irq(): IRQ 0x%x already in use.\n",
+                            boardp->id, shost->irq);
+               } else if (ret == -EINVAL) {
+                       ASC_PRINT2
+                           ("advansys_board_found: board %d: request_irq(): IRQ 0x%x not valid.\n",
+                            boardp->id, shost->irq);
+               } else {
+                       ASC_PRINT3
+                           ("advansys_board_found: board %d: request_irq(): IRQ 0x%x failed with %d\n",
+                            boardp->id, shost->irq, ret);
+               }
+               release_region(shost->io_port, boardp->asc_n_io_port);
+               iounmap(boardp->ioremap_addr);
+               if (shost->dma_channel != NO_ISA_DMA) {
+                       free_dma(shost->dma_channel);
+               }
+#ifdef CONFIG_PROC_FS
+               kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+               scsi_unregister(shost);
+               asc_board_count--;
+               return NULL;
+       }
+
+       /*
+        * Initialize board RISC chip and enable interrupts.
+        */
+       if (ASC_NARROW_BOARD(boardp)) {
+               ASC_DBG(2, "advansys_board_found: AscInitAsc1000Driver()\n");
+               warn_code = AscInitAsc1000Driver(asc_dvc_varp);
+               err_code = asc_dvc_varp->err_code;
+
+               if (warn_code || err_code) {
+                       ASC_PRINT4
+                           ("advansys_board_found: board %d error: init_state 0x%x, warn 0x%x, error 0x%x\n",
+                            boardp->id,
+                            asc_dvc_varp->init_state, warn_code, err_code);
+               }
+       } else {
+               ADV_CARR_T *carrp;
+               int req_cnt = 0;
+               adv_req_t *reqp = NULL;
+               int sg_cnt = 0;
+
+               /*
+                * Allocate buffer carrier structures. The total size
+                * is about 4 KB, so allocate all at once.
+                */
+               carrp = (ADV_CARR_T *) kmalloc(ADV_CARRIER_BUFSIZE, GFP_ATOMIC);
+               ASC_DBG1(1, "advansys_board_found: carrp 0x%lx\n", (ulong)carrp);
+
+               if (carrp == NULL) {
+                       goto kmalloc_error;
+               }
+
+               /*
+                * Allocate up to 'max_host_qng' request structures for
+                * the Wide board. The total size is about 16 KB, so
+                * allocate all at once. If the allocation fails decrement
+                * and try again.
+                */
+               for (req_cnt = adv_dvc_varp->max_host_qng;
+                    req_cnt > 0; req_cnt--) {
+
+                       reqp = (adv_req_t *)
+                           kmalloc(sizeof(adv_req_t) * req_cnt, GFP_ATOMIC);
+
+                       ASC_DBG3(1,
+                                "advansys_board_found: reqp 0x%lx, req_cnt %d, bytes %lu\n",
+                                (ulong)reqp, req_cnt,
+                                (ulong)sizeof(adv_req_t) * req_cnt);
+
+                       if (reqp != NULL) {
+                               break;
+                       }
+               }
+               if (reqp == NULL) {
+                       goto kmalloc_error;
+               }
+
+               /*
+                * Allocate up to ADV_TOT_SG_BLOCK request structures for
+                * the Wide board. Each structure is about 136 bytes.
+                */
+               boardp->adv_sgblkp = NULL;
+               for (sg_cnt = 0; sg_cnt < ADV_TOT_SG_BLOCK; sg_cnt++) {
+
+                       sgp = (adv_sgblk_t *)
+                           kmalloc(sizeof(adv_sgblk_t), GFP_ATOMIC);
+
+                       if (sgp == NULL) {
+                               break;
+                       }
+
+                       sgp->next_sgblkp = boardp->adv_sgblkp;
+                       boardp->adv_sgblkp = sgp;
+
+               }
+               ASC_DBG3(1,
+                        "advansys_board_found: sg_cnt %d * %u = %u bytes\n",
+                        sg_cnt, sizeof(adv_sgblk_t),
+                        (unsigned)(sizeof(adv_sgblk_t) * sg_cnt));
+
+               /*
+                * If no request structures or scatter-gather structures could
+                * be allocated, then return an error. Otherwise continue with
+                * initialization.
+                */
+ kmalloc_error:
+               if (carrp == NULL) {
+                       ASC_PRINT1
+                           ("advansys_board_found: board %d error: failed to kmalloc() carrier buffer.\n",
+                            boardp->id);
+                       err_code = ADV_ERROR;
+               } else if (reqp == NULL) {
+                       kfree(carrp);
+                       ASC_PRINT1
+                           ("advansys_board_found: board %d error: failed to kmalloc() adv_req_t buffer.\n",
+                            boardp->id);
+                       err_code = ADV_ERROR;
+               } else if (boardp->adv_sgblkp == NULL) {
+                       kfree(carrp);
+                       kfree(reqp);
+                       ASC_PRINT1
+                           ("advansys_board_found: board %d error: failed to kmalloc() adv_sgblk_t buffers.\n",
+                            boardp->id);
+                       err_code = ADV_ERROR;
+               } else {
+
+                       /* Save carrier buffer pointer. */
+                       boardp->orig_carrp = carrp;
+
+                       /*
+                        * Save original pointer for kfree() in case the
+                        * driver is built as a module and can be unloaded.
+                        */
+                       boardp->orig_reqp = reqp;
+
+                       adv_dvc_varp->carrier_buf = carrp;
+
+                       /*
+                        * Point 'adv_reqp' to the request structures and
+                        * link them together.
+                        */
+                       req_cnt--;
+                       reqp[req_cnt].next_reqp = NULL;
+                       for (; req_cnt > 0; req_cnt--) {
+                               reqp[req_cnt - 1].next_reqp = &reqp[req_cnt];
+                       }
+                       boardp->adv_reqp = &reqp[0];
+
+                       if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
+                               ASC_DBG(2,
+                                       "advansys_board_found: AdvInitAsc3550Driver()\n");
+                               warn_code = AdvInitAsc3550Driver(adv_dvc_varp);
+                       } else if (adv_dvc_varp->chip_type ==
+                                  ADV_CHIP_ASC38C0800) {
+                               ASC_DBG(2,
+                                       "advansys_board_found: AdvInitAsc38C0800Driver()\n");
+                               warn_code =
+                                   AdvInitAsc38C0800Driver(adv_dvc_varp);
+                       } else {
+                               ASC_DBG(2,
+                                       "advansys_board_found: AdvInitAsc38C1600Driver()\n");
+                               warn_code =
+                                   AdvInitAsc38C1600Driver(adv_dvc_varp);
+                       }
+                       err_code = adv_dvc_varp->err_code;
+
+                       if (warn_code || err_code) {
+                               ASC_PRINT3
+                                   ("advansys_board_found: board %d error: warn 0x%x, error 0x%x\n",
+                                    boardp->id, warn_code, err_code);
+                       }
+               }
+       }
+
+       if (err_code != 0) {
+               release_region(shost->io_port, boardp->asc_n_io_port);
+               if (ASC_WIDE_BOARD(boardp)) {
+                       iounmap(boardp->ioremap_addr);
+                       kfree(boardp->orig_carrp);
+                       boardp->orig_carrp = NULL;
+                       if (boardp->orig_reqp) {
+                               kfree(boardp->orig_reqp);
+                               boardp->orig_reqp = boardp->adv_reqp = NULL;
+                       }
+                       while ((sgp = boardp->adv_sgblkp) != NULL) {
+                               boardp->adv_sgblkp = sgp->next_sgblkp;
+                               kfree(sgp);
+                       }
+               }
+               if (shost->dma_channel != NO_ISA_DMA) {
+                       free_dma(shost->dma_channel);
+               }
+#ifdef CONFIG_PROC_FS
+               kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+               free_irq(shost->irq, boardp);
+               scsi_unregister(shost);
+               asc_board_count--;
+               return NULL;
+       }
+       ASC_DBG_PRT_SCSI_HOST(2, shost);
+
+       return shost;
+}
+
+/*
+ * advansys_detect()
+ *
+ * Detect function for AdvanSys adapters.
+ *
+ * Argument is a pointer to the host driver's scsi_hosts entry.
+ *
+ * Return number of adapters found.
+ *
+ * Note: Because this function is called during system initialization
+ * it must not call SCSI mid-level functions including scsi_malloc()
+ * and scsi_free().
+ */
+static int __init advansys_detect(struct scsi_host_template *tpnt)
+{
+       static int detect_called = ASC_FALSE;
+       int iop;
+       int bus;
+       int ioport = 0;
+       struct device *dev = NULL;
+#ifdef CONFIG_PCI
+       int pci_init_search = 0;
+       struct pci_dev *pci_devicep[ASC_NUM_BOARD_SUPPORTED];
+       int pci_card_cnt_max = 0;
+       int pci_card_cnt = 0;
+       struct pci_dev *pdev = NULL;
+       int pci_device_id_cnt = 0;
+       unsigned int pci_device_id[ASC_PCI_DEVICE_ID_CNT] = {
+               PCI_DEVICE_ID_ASP_1200A,
+               PCI_DEVICE_ID_ASP_ABP940,
+               PCI_DEVICE_ID_ASP_ABP940U,
+               PCI_DEVICE_ID_ASP_ABP940UW,
+               PCI_DEVICE_ID_38C0800_REV1,
+               PCI_DEVICE_ID_38C1600_REV1
+       };
+#endif /* CONFIG_PCI */
+
+       if (detect_called == ASC_FALSE) {
+               detect_called = ASC_TRUE;
+       } else {
+               printk
+                   ("AdvanSys SCSI: advansys_detect() multiple calls ignored\n");
+               return 0;
+       }
+
+       ASC_DBG(1, "advansys_detect: begin\n");
+
+       asc_board_count = 0;
+
+       /*
+        * If I/O port probing has been modified, then verify and
+        * clean-up the 'asc_ioport' list.
+        */
+       if (asc_iopflag == ASC_TRUE) {
+               for (ioport = 0; ioport < ASC_NUM_IOPORT_PROBE; ioport++) {
+                       ASC_DBG2(1, "advansys_detect: asc_ioport[%d] 0x%x\n",
+                                ioport, asc_ioport[ioport]);
+                       if (asc_ioport[ioport] != 0) {
+                               for (iop = 0; iop < ASC_IOADR_TABLE_MAX_IX;
+                                    iop++) {
+                                       if (_asc_def_iop_base[iop] ==
+                                           asc_ioport[ioport]) {
+                                               break;
+                                       }
+                               }
+                               if (iop == ASC_IOADR_TABLE_MAX_IX) {
+                                       printk
+                                           ("AdvanSys SCSI: specified I/O Port 0x%X is invalid\n",
+                                            asc_ioport[ioport]);
+                                       asc_ioport[ioport] = 0;
+                               }
+                       }
+               }
+               ioport = 0;
+       }
+
+       for (bus = 0; bus < ASC_NUM_BUS; bus++) {
+
+               ASC_DBG2(1, "advansys_detect: bus search type %d (%s)\n",
+                        bus, asc_bus_name[bus]);
+               iop = 0;
+
+               while (asc_board_count < ASC_NUM_BOARD_SUPPORTED) {
+
+                       ASC_DBG1(2, "advansys_detect: asc_board_count %d\n",
+                                asc_board_count);
+
+                       switch (asc_bus[bus]) {
+                       case ASC_IS_ISA:
+                       case ASC_IS_VL:
+#ifdef CONFIG_ISA
+                               if (asc_iopflag == ASC_FALSE) {
+                                       iop =
+                                           AscSearchIOPortAddr(iop,
+                                                               asc_bus[bus]);
+                               } else {
+                                       /*
+                                        * ISA and VL I/O port scanning has either been
+                                        * eliminated or limited to selected ports on
+                                        * the LILO command line, /etc/lilo.conf, or
+                                        * by setting variables when the module was loaded.
+                                        */
+                                       ASC_DBG(1,
+                                               "advansys_detect: I/O port scanning modified\n");
+ ioport_try_again:
+                                       iop = 0;
+                                       for (; ioport < ASC_NUM_IOPORT_PROBE;
+                                            ioport++) {
+                                               if ((iop =
+                                                    asc_ioport[ioport]) != 0) {
+                                                       break;
+                                               }
+                                       }
+                                       if (iop) {
+                                               ASC_DBG1(1,
+                                                        "advansys_detect: probing I/O port 0x%x...\n",
+                                                        iop);
+                                               if (!request_region
+                                                   (iop, ASC_IOADR_GAP,
+                                                    "advansys")) {
+                                                       printk
+                                                           ("AdvanSys SCSI: specified I/O Port 0x%X is busy\n",
+                                                            iop);
+                                                       /* Don't try this I/O port twice. */
+                                                       asc_ioport[ioport] = 0;
+                                                       goto ioport_try_again;
+                                               } else if (AscFindSignature(iop)
+                                                          == ASC_FALSE) {
+                                                       printk
+                                                           ("AdvanSys SCSI: specified I/O Port 0x%X has no adapter\n",
+                                                            iop);
+                                                       /* Don't try this I/O port twice. */
+                                                       release_region(iop,
+                                                                      ASC_IOADR_GAP);
+                                                       asc_ioport[ioport] = 0;
+                                                       goto ioport_try_again;
+                                               } else {
+                                                       /*
+                                                        * If this isn't an ISA board, then it must be
+                                                        * a VL board. If currently looking an ISA
+                                                        * board is being looked for then try for
+                                                        * another ISA board in 'asc_ioport'.
+                                                        */
+                                                       if (asc_bus[bus] ==
+                                                           ASC_IS_ISA
+                                                           &&
+                                                           (AscGetChipVersion
+                                                            (iop,
+                                                             ASC_IS_ISA) &
+                                                            ASC_CHIP_VER_ISA_BIT)
+                                                           == 0) {
+                                                               /*
+                                                                * Don't clear 'asc_ioport[ioport]'. Try
+                                                                * this board again for VL. Increment
+                                                                * 'ioport' past this board.
+                                                                */
+                                                               ioport++;
+                                                               release_region
+                                                                   (iop,
+                                                                    ASC_IOADR_GAP);
+                                                               goto ioport_try_again;
+                                                       }
+                                               }
+                                               /*
+                                                * This board appears good, don't try the I/O port
+                                                * again by clearing its value. Increment 'ioport'
+                                                * for the next iteration.
+                                                */
+                                               asc_ioport[ioport++] = 0;
+                                       }
+                               }
+#endif /* CONFIG_ISA */
+                               break;
+
+                       case ASC_IS_EISA:
+#ifdef CONFIG_ISA
+                               iop = AscSearchIOPortAddr(iop, asc_bus[bus]);
+#endif /* CONFIG_ISA */
+                               break;
+
+                       case ASC_IS_PCI:
+#ifdef CONFIG_PCI
+                               if (pci_init_search == 0) {
+                                       int i, j;
+
+                                       pci_init_search = 1;
+
+                                       /* Find all PCI cards. */
+                                       while (pci_device_id_cnt <
+                                              ASC_PCI_DEVICE_ID_CNT) {
+                                               if ((pdev =
+                                                    pci_find_device
+                                                    (PCI_VENDOR_ID_ASP,
+                                                     pci_device_id
+                                                     [pci_device_id_cnt],
+                                                     pdev)) == NULL) {
+                                                       pci_device_id_cnt++;
+                                               } else {
+                                                       if (pci_enable_device
+                                                           (pdev) == 0) {
+                                                               pci_devicep
+                                                                   [pci_card_cnt_max++]
+                                                                   = pdev;
+                                                       }
+                                               }
+                                       }
+
+                                       /*
+                                        * Sort PCI cards in ascending order by PCI Bus, Slot,
+                                        * and Device Number.
+                                        */
+                                       for (i = 0; i < pci_card_cnt_max - 1;
+                                            i++) {
+                                               for (j = i + 1;
+                                                    j < pci_card_cnt_max;
+                                                    j++) {
+                                                       if ((pci_devicep[j]->
+                                                            bus->number <
+                                                            pci_devicep[i]->
+                                                            bus->number)
+                                                           ||
+                                                           ((pci_devicep[j]->
+                                                             bus->number ==
+                                                             pci_devicep[i]->
+                                                             bus->number)
+                                                            &&
+                                                            (pci_devicep[j]->
+                                                             devfn <
+                                                             pci_devicep[i]->
+                                                             devfn))) {
+                                                               pdev =
+                                                                   pci_devicep
+                                                                   [i];
+                                                               pci_devicep[i] =
+                                                                   pci_devicep
+                                                                   [j];
+                                                               pci_devicep[j] =
+                                                                   pdev;
+                                                       }
+                                               }
+                                       }
+
+                                       pci_card_cnt = 0;
+                               } else {
+                                       pci_card_cnt++;
+                               }
+
+                               if (pci_card_cnt == pci_card_cnt_max) {
+                                       iop = 0;
+                               } else {
+                                       pdev = pci_devicep[pci_card_cnt];
+
+                                       ASC_DBG2(2,
+                                                "advansys_detect: devfn %d, bus number %d\n",
+                                                pdev->devfn,
+                                                pdev->bus->number);
+                                       iop = pci_resource_start(pdev, 0);
+                                       ASC_DBG2(1,
+                                                "advansys_detect: vendorID %X, deviceID %X\n",
+                                                pdev->vendor,
+                                                pdev->device);
+                                       ASC_DBG2(2,
+                                                "advansys_detect: iop %X, irqLine %d\n",
+                                                iop, pdev->irq);
+                               }
+                               if (pdev)
+                                       dev = &pdev->dev;
+
+#endif /* CONFIG_PCI */
+                               break;
+
+                       default:
+                               ASC_PRINT1
+                                   ("advansys_detect: unknown bus type: %d\n",
+                                    asc_bus[bus]);
+                               break;
+                       }
+                       ASC_DBG1(1, "advansys_detect: iop 0x%x\n", iop);
+
+                       /*
+                        * Adapter not found, try next bus type.
+                        */
+                       if (iop == 0) {
+                               break;
+                       }
+
+                       advansys_board_found(iop, dev, asc_bus[bus]);
+               }
+       }
+
+       ASC_DBG1(1, "advansys_detect: done: asc_board_count %d\n",
+                asc_board_count);
+       return asc_board_count;
+}
+
+/*
+ * advansys_release()
+ *
+ * Release resources allocated for a single AdvanSys adapter.
+ */
+static int advansys_release(struct Scsi_Host *shost)
+{
+       asc_board_t *boardp;
+
+       ASC_DBG(1, "advansys_release: begin\n");
+       boardp = ASC_BOARDP(shost);
+       free_irq(shost->irq, boardp);
+       if (shost->dma_channel != NO_ISA_DMA) {
+               ASC_DBG(1, "advansys_release: free_dma()\n");
+               free_dma(shost->dma_channel);
+       }
+       release_region(shost->io_port, boardp->asc_n_io_port);
+       if (ASC_WIDE_BOARD(boardp)) {
+               adv_sgblk_t *sgp = NULL;
+
+               iounmap(boardp->ioremap_addr);
+               kfree(boardp->orig_carrp);
+               boardp->orig_carrp = NULL;
+               if (boardp->orig_reqp) {
+                       kfree(boardp->orig_reqp);
+                       boardp->orig_reqp = boardp->adv_reqp = NULL;
+               }
+               while ((sgp = boardp->adv_sgblkp) != NULL) {
+                       boardp->adv_sgblkp = sgp->next_sgblkp;
+                       kfree(sgp);
+               }
+       }
+#ifdef CONFIG_PROC_FS
+       ASC_ASSERT(boardp->prtbuf != NULL);
+       kfree(boardp->prtbuf);
+#endif /* CONFIG_PROC_FS */
+       scsi_unregister(shost);
+       ASC_DBG(1, "advansys_release: end\n");
+       return 0;
+}
+
 #ifdef CONFIG_PCI
 /* PCI Devices supported by this driver */
 static struct pci_device_id advansys_pci_tbl[] __devinitdata = {
-       { PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940U,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940UW,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C0800_REV1,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C1600_REV1,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { }
+       {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_1200A,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940U,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_ASP_ABP940UW,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C0800_REV1,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       {PCI_VENDOR_ID_ASP, PCI_DEVICE_ID_38C1600_REV1,
+        PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       {}
 };
+
 MODULE_DEVICE_TABLE(pci, advansys_pci_tbl);
 #endif /* CONFIG_PCI */
index 286ab83116f92eb3f6ea3304aa47baf8b98b32b7..a055a96e3ad34e9185f10a214f798788928e6260 100644 (file)
@@ -2284,9 +2284,12 @@ static void ahd_linux_set_period(struct scsi_target *starget, int period)
        if (period < 8)
                period = 8;
        if (period < 10) {
-               ppr_options |= MSG_EXT_PPR_DT_REQ;
-               if (period == 8)
-                       ppr_options |= MSG_EXT_PPR_IU_REQ;
+               if (spi_max_width(starget)) {
+                       ppr_options |= MSG_EXT_PPR_DT_REQ;
+                       if (period == 8)
+                               ppr_options |= MSG_EXT_PPR_IU_REQ;
+               } else
+                       period = 10;
        }
 
        dt = ppr_options & MSG_EXT_PPR_DT_REQ;
@@ -2365,7 +2368,7 @@ static void ahd_linux_set_dt(struct scsi_target *starget, int dt)
                printf("%s: %s DT\n", ahd_name(ahd), 
                       dt ? "enabling" : "disabling");
 #endif
-       if (dt) {
+       if (dt && spi_max_width(starget)) {
                ppr_options |= MSG_EXT_PPR_DT_REQ;
                if (!width)
                        ahd_linux_set_width(starget, 1);
@@ -2447,7 +2450,7 @@ static void ahd_linux_set_iu(struct scsi_target *starget, int iu)
                       iu ? "enabling" : "disabling");
 #endif
 
-       if (iu) {
+       if (iu && spi_max_width(starget)) {
                ppr_options |= MSG_EXT_PPR_IU_REQ;
                ppr_options |= MSG_EXT_PPR_DT_REQ; /* IU requires DT */
        }
@@ -2487,7 +2490,7 @@ static void ahd_linux_set_rd_strm(struct scsi_target *starget, int rdstrm)
                       rdstrm  ? "enabling" : "disabling");
 #endif
 
-       if (rdstrm)
+       if (rdstrm && spi_max_width(starget))
                ppr_options |= MSG_EXT_PPR_RD_STRM;
 
        ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
@@ -2523,7 +2526,7 @@ static void ahd_linux_set_wr_flow(struct scsi_target *starget, int wrflow)
                       wrflow ? "enabling" : "disabling");
 #endif
 
-       if (wrflow)
+       if (wrflow && spi_max_width(starget))
                ppr_options |= MSG_EXT_PPR_WR_FLOW;
 
        ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
@@ -2567,7 +2570,7 @@ static void ahd_linux_set_rti(struct scsi_target *starget, int rti)
                       rti ? "enabling" : "disabling");
 #endif
 
-       if (rti)
+       if (rti && spi_max_width(starget))
                ppr_options |= MSG_EXT_PPR_RTI;
 
        ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
@@ -2603,7 +2606,7 @@ static void ahd_linux_set_pcomp_en(struct scsi_target *starget, int pcomp)
                       pcomp ? "Enable" : "Disable");
 #endif
 
-       if (pcomp) {
+       if (pcomp && spi_max_width(starget)) {
                uint8_t precomp;
 
                if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) {
@@ -2647,7 +2650,7 @@ static void ahd_linux_set_hold_mcs(struct scsi_target *starget, int hold)
        unsigned int dt = ppr_options & MSG_EXT_PPR_DT_REQ;
        unsigned long flags;
 
-       if (hold)
+       if (hold && spi_max_width(starget))
                ppr_options |= MSG_EXT_PPR_HOLD_MCS;
 
        ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
index 1803ab6fc21c49ac0ad158e42567b04651d52a82..2e9c38f2e8a68d1065be272baa7174fa2eb06e90 100644 (file)
@@ -2317,8 +2317,13 @@ static void ahc_linux_set_period(struct scsi_target *starget, int period)
 
        if (period < 9)
                period = 9;     /* 12.5ns is our minimum */
-       if (period == 9)
-               ppr_options |= MSG_EXT_PPR_DT_REQ;
+       if (period == 9) {
+               if (spi_max_width(starget))
+                       ppr_options |= MSG_EXT_PPR_DT_REQ;
+               else
+                       /* need wide for DT and need DT for 12.5 ns */
+                       period = 10;
+       }
 
        ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
                            starget->channel + 'A', ROLE_INITIATOR);
@@ -2381,7 +2386,7 @@ static void ahc_linux_set_dt(struct scsi_target *starget, int dt)
        unsigned long flags;
        struct ahc_syncrate *syncrate;
 
-       if (dt) {
+       if (dt && spi_max_width(starget)) {
                ppr_options |= MSG_EXT_PPR_DT_REQ;
                if (!width)
                        ahc_linux_set_width(starget, 1);
index ab00aecc5466ec018d621e7a9ab60466de37d5d9..63bcde24644740baeadb8b956c6c0ab68f88b16e 100644 (file)
@@ -586,7 +586,7 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
                goto Err;
        }
        asd_ha->pcidev = dev;
-       asd_ha->sas_ha.pcidev = asd_ha->pcidev;
+       asd_ha->sas_ha.dev = &asd_ha->pcidev->dev;
        asd_ha->sas_ha.lldd_ha = asd_ha;
 
        asd_ha->name = asd_dev->name;
@@ -605,8 +605,6 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
                goto Err_free;
        }
 
-
-
        err = asd_dev->setup(asd_ha);
        if (err)
                goto Err_free;
index 7829ab1e2fb46d5bf350c9c6d54d0ff9dec4a01a..a21455d0274cb5d634a40baf768726ff4daf1472 100644 (file)
@@ -2216,11 +2216,13 @@ static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session)
 
 static int iscsi_tcp_slave_configure(struct scsi_device *sdev)
 {
+       blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY);
        blk_queue_dma_alignment(sdev->request_queue, 0);
        return 0;
 }
 
 static struct scsi_host_template iscsi_sht = {
+       .module                 = THIS_MODULE,
        .name                   = "iSCSI Initiator over TCP/IP",
        .queuecommand           = iscsi_queuecommand,
        .change_queue_depth     = iscsi_change_queue_depth,
index 4d85ce1001922819e40ea48e6ea46c86680dcb99..5606d1e62978433e7ca763e917b15e1c8af4c8e6 100644 (file)
@@ -596,9 +596,16 @@ static void iscsi_prep_mtask(struct iscsi_conn *conn,
        nop->cmdsn = cpu_to_be32(session->cmdsn);
        if (hdr->itt != RESERVED_ITT) {
                hdr->itt = build_itt(mtask->itt, conn->id, session->age);
+               /*
+                * TODO: We always use immediate, so we never hit this.
+                * If we start to send tmfs or nops as non-immediate then
+                * we should start checking the cmdsn numbers for mgmt tasks.
+                */
                if (conn->c_stage == ISCSI_CONN_STARTED &&
-                   !(hdr->opcode & ISCSI_OP_IMMEDIATE))
+                   !(hdr->opcode & ISCSI_OP_IMMEDIATE)) {
+                       session->queued_cmdsn++;
                        session->cmdsn++;
+               }
        }
 
        if (session->tt->init_mgmt_task)
@@ -641,9 +648,11 @@ static int iscsi_check_cmdsn_window_closed(struct iscsi_conn *conn)
        /*
         * Check for iSCSI window and take care of CmdSN wrap-around
         */
-       if (!iscsi_sna_lte(session->cmdsn, session->max_cmdsn)) {
-               debug_scsi("iSCSI CmdSN closed. MaxCmdSN %u CmdSN %u\n",
-                          session->max_cmdsn, session->cmdsn);
+       if (!iscsi_sna_lte(session->queued_cmdsn, session->max_cmdsn)) {
+               debug_scsi("iSCSI CmdSN closed. ExpCmdSn %u MaxCmdSN %u "
+                          "CmdSN %u/%u\n", session->exp_cmdsn,
+                          session->max_cmdsn, session->cmdsn,
+                          session->queued_cmdsn);
                return -ENOSPC;
        }
        return 0;
@@ -722,11 +731,6 @@ check_mgmt:
 
        /* process command queue */
        while (!list_empty(&conn->xmitqueue)) {
-               rc = iscsi_check_cmdsn_window_closed(conn);
-               if (rc) {
-                       spin_unlock_bh(&conn->session->lock);
-                       return rc;
-               }
                /*
                 * iscsi tcp may readd the task to the xmitqueue to send
                 * write data
@@ -834,12 +838,6 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
                goto fault;
        }
 
-       /*
-        * We check this here and in data xmit, because if we get to the point
-        * that this check is hitting the window then we have enough IO in
-        * flight and enough IO waiting to be transmitted it is better
-        * to let the scsi/block layer queue up.
-        */
        if (iscsi_check_cmdsn_window_closed(conn)) {
                reason = FAILURE_WINDOW_CLOSED;
                goto reject;
@@ -850,6 +848,8 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
                reason = FAILURE_OOM;
                goto reject;
        }
+       session->queued_cmdsn++;
+
        sc->SCp.phase = session->age;
        sc->SCp.ptr = (char *)ctask;
 
@@ -1140,7 +1140,13 @@ static void fail_command(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
        if (!sc)
                return;
 
-       if (ctask->state != ISCSI_TASK_PENDING)
+       if (ctask->state == ISCSI_TASK_PENDING)
+               /*
+                * cmd never made it to the xmit thread, so we should not count
+                * the cmd in the sequencing
+                */
+               conn->session->queued_cmdsn--;
+       else
                conn->session->tt->cleanup_cmd_task(conn, ctask);
        iscsi_ctask_mtask_cleanup(ctask);
 
@@ -1392,7 +1398,7 @@ iscsi_session_setup(struct iscsi_transport *iscsit,
        session->state = ISCSI_STATE_FREE;
        session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX;
        session->cmds_max = cmds_max;
-       session->cmdsn = initial_cmdsn;
+       session->queued_cmdsn = session->cmdsn = initial_cmdsn;
        session->exp_cmdsn = initial_cmdsn + 1;
        session->max_cmdsn = initial_cmdsn + 1;
        session->max_r2t = 1;
@@ -1473,6 +1479,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
        struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
        struct module *owner = cls_session->transport->owner;
 
+       iscsi_unblock_session(cls_session);
        scsi_remove_host(shost);
 
        iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds);
@@ -1615,11 +1622,8 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
        kfree(conn->persistent_address);
        __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
                    sizeof(void*));
-       if (session->leadconn == conn) {
+       if (session->leadconn == conn)
                session->leadconn = NULL;
-               /* no connections exits.. reset sequencing */
-               session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1;
-       }
        spin_unlock_bh(&session->lock);
 
        kfifo_free(conn->mgmtqueue);
@@ -1649,6 +1653,7 @@ int iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
        spin_lock_bh(&session->lock);
        conn->c_stage = ISCSI_CONN_STARTED;
        session->state = ISCSI_STATE_LOGGED_IN;
+       session->queued_cmdsn = session->cmdsn;
 
        switch(conn->stop_stage) {
        case STOP_CONN_RECOVER:
index ced2de32c5117af2676196bfdad42df43231bcfd..5e573efcf0a70f90232ac916aa8897f85c5f713b 100644 (file)
@@ -382,7 +382,7 @@ int sas_ata_init_host_and_port(struct domain_device *found_dev,
        struct ata_port *ap;
 
        ata_host_init(&found_dev->sata_dev.ata_host,
-                     &ha->pcidev->dev,
+                     ha->dev,
                      sata_port_info.flags,
                      &sas_sata_ops);
        ap = ata_sas_port_alloc(&found_dev->sata_dev.ata_host,
@@ -448,10 +448,10 @@ static void sas_disc_task_done(struct sas_task *task)
  * @task: the task to be executed
  * @buffer: pointer to buffer to do I/O
  * @size: size of @buffer
- * @pci_dma_dir: PCI_DMA_...
+ * @dma_dir: DMA direction.  DMA_xxx
  */
 static int sas_execute_task(struct sas_task *task, void *buffer, int size,
-                           int pci_dma_dir)
+                           enum dma_data_direction dma_dir)
 {
        int res = 0;
        struct scatterlist *scatter = NULL;
@@ -461,7 +461,7 @@ static int sas_execute_task(struct sas_task *task, void *buffer, int size,
        struct sas_internal *i =
                to_sas_internal(task->dev->port->ha->core.shost->transportt);
 
-       if (pci_dma_dir != PCI_DMA_NONE) {
+       if (dma_dir != DMA_NONE) {
                scatter = kzalloc(sizeof(*scatter), GFP_KERNEL);
                if (!scatter)
                        goto out;
@@ -474,11 +474,11 @@ static int sas_execute_task(struct sas_task *task, void *buffer, int size,
        task->scatter = scatter;
        task->num_scatter = num_scatter;
        task->total_xfer_len = size;
-       task->data_dir = pci_dma_dir;
+       task->data_dir = dma_dir;
        task->task_done = sas_disc_task_done;
-       if (pci_dma_dir != PCI_DMA_NONE &&
+       if (dma_dir != DMA_NONE &&
            sas_protocol_ata(task->task_proto)) {
-               task->num_scatter = pci_map_sg(task->dev->port->ha->pcidev,
+               task->num_scatter = dma_map_sg(task->dev->port->ha->dev,
                                               task->scatter,
                                               task->num_scatter,
                                               task->data_dir);
@@ -565,9 +565,9 @@ static int sas_execute_task(struct sas_task *task, void *buffer, int size,
                }
        }
 ex_err:
-       if (pci_dma_dir != PCI_DMA_NONE) {
+       if (dma_dir != DMA_NONE) {
                if (sas_protocol_ata(task->task_proto))
-                       pci_unmap_sg(task->dev->port->ha->pcidev,
+                       dma_unmap_sg(task->dev->port->ha->dev,
                                     task->scatter, task->num_scatter,
                                     task->data_dir);
                kfree(scatter);
@@ -628,11 +628,11 @@ static void sas_get_ata_command_set(struct domain_device *dev)
  * @features: the features register
  * @buffer: pointer to buffer to do I/O
  * @size: size of @buffer
- * @pci_dma_dir: PCI_DMA_...
+ * @dma_dir: DMA direction.  DMA_xxx
  */
 static int sas_issue_ata_cmd(struct domain_device *dev, u8 command,
                             u8 features, void *buffer, int size,
-                            int pci_dma_dir)
+                            enum dma_data_direction dma_dir)
 {
        int res = 0;
        struct sas_task *task;
@@ -652,7 +652,7 @@ static int sas_issue_ata_cmd(struct domain_device *dev, u8 command,
        task->ata_task.fis.device = d2h_fis->device;
        task->ata_task.retry_count = 1;
 
-       res = sas_execute_task(task, buffer, size, pci_dma_dir);
+       res = sas_execute_task(task, buffer, size, dma_dir);
 
        sas_free_task(task);
 out:
@@ -707,7 +707,7 @@ static int sas_discover_sata_dev(struct domain_device *dev)
        }
 
        res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512,
-                               PCI_DMA_FROMDEVICE);
+                               DMA_FROM_DEVICE);
        if (res)
                goto out_err;
 
@@ -720,13 +720,13 @@ static int sas_discover_sata_dev(struct domain_device *dev)
                        goto cont1;
                res = sas_issue_ata_cmd(dev, ATA_SET_FEATURES,
                                        ATA_FEATURE_PUP_STBY_SPIN_UP,
-                                       NULL, 0, PCI_DMA_NONE);
+                                       NULL, 0, DMA_NONE);
                if (res)
                        goto cont1;
 
                schedule_timeout_interruptible(5*HZ); /* More time? */
                res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512,
-                                       PCI_DMA_FROMDEVICE);
+                                       DMA_FROM_DEVICE);
                if (res)
                        goto out_err;
        }
index 6ac9f61d006a5616c4f882088eaac4948a5c6d4e..7ef0afc3cd68b7f848a7b635af3c30fb8a6690ad 100644 (file)
@@ -22,7 +22,6 @@
  *
  */
 
-#include <linux/pci.h>
 #include <linux/scatterlist.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_eh.h>
@@ -170,7 +169,7 @@ int sas_notify_lldd_dev_found(struct domain_device *dev)
                if (res) {
                        printk("sas: driver on pcidev %s cannot handle "
                               "device %llx, error:%d\n",
-                              pci_name(sas_ha->pcidev),
+                              sas_ha->dev->bus_id,
                               SAS_ADDR(dev->sas_addr), res);
                }
        }
index f1246d2c9bef83a90847fd5399c546d078149391..bf34a236f946b62711f4b3111e476eac6594f5c1 100644 (file)
@@ -56,7 +56,7 @@ void sas_dprint_phye(int phyid, enum phy_event pe)
 
 void sas_dprint_hae(struct sas_ha_struct *sas_ha, enum ha_event he)
 {
-       SAS_DPRINTK("ha %s: %s event\n", pci_name(sas_ha->pcidev),
+       SAS_DPRINTK("ha %s: %s event\n", sas_ha->dev->bus_id,
                    sas_hae_str[he]);
 }
 
index b500f0c1449c5d7da0a8b9005541556d4b757ac3..8727436b222d340f269556d2b7054a31416700c6 100644 (file)
@@ -507,14 +507,21 @@ static int sas_dev_present_in_domain(struct asd_sas_port *port,
 int sas_smp_get_phy_events(struct sas_phy *phy)
 {
        int res;
+       u8 *req;
+       u8 *resp;
        struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent);
        struct domain_device *dev = sas_find_dev_by_rphy(rphy);
-       u8 *req = alloc_smp_req(RPEL_REQ_SIZE);
-       u8 *resp = kzalloc(RPEL_RESP_SIZE, GFP_KERNEL);
 
-       if (!resp)
+       req = alloc_smp_req(RPEL_REQ_SIZE);
+       if (!req)
                return -ENOMEM;
 
+       resp = alloc_smp_resp(RPEL_RESP_SIZE);
+       if (!resp) {
+               kfree(req);
+               return -ENOMEM;
+       }
+
        req[1] = SMP_REPORT_PHY_ERR_LOG;
        req[9] = phy->number;
 
@@ -1879,7 +1886,7 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
                    struct request *req)
 {
        struct domain_device *dev;
-       int ret, type = rphy->identify.device_type;
+       int ret, type;
        struct request *rsp = req->next_rq;
 
        if (!rsp) {
@@ -1888,12 +1895,13 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
                return -EINVAL;
        }
 
-       /* seems aic94xx doesn't support */
+       /* no rphy means no smp target support (ie aic94xx host) */
        if (!rphy) {
                printk("%s: can we send a smp request to a host?\n",
                       __FUNCTION__);
                return -EINVAL;
        }
+       type = rphy->identify.device_type;
 
        if (type != SAS_EDGE_EXPANDER_DEVICE &&
            type != SAS_FANOUT_EXPANDER_DEVICE) {
index 1612f9200a524f575b01f017f870668752594c8a..0f2a9f5d801c77efb918dd140c3941051e7f41c4 100644 (file)
@@ -91,18 +91,20 @@ qla2x00_sysfs_read_nvram(struct kobject *kobj,
 {
        struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
            struct device, kobj)));
-       unsigned long   flags;
+       int             size = ha->nvram_size;
+       char            *nvram_cache = ha->nvram;
 
-       if (!capable(CAP_SYS_ADMIN) || off != 0)
+       if (!capable(CAP_SYS_ADMIN) || off > size || count == 0)
                return 0;
+       if (off + count > size) {
+               size -= off;
+               count = size;
+       }
 
-       /* Read NVRAM. */
-       spin_lock_irqsave(&ha->hardware_lock, flags);
-       ha->isp_ops->read_nvram(ha, (uint8_t *)buf, ha->nvram_base,
-           ha->nvram_size);
-       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+       /* Read NVRAM data from cache. */
+       memcpy(buf, &nvram_cache[off], count);
 
-       return ha->nvram_size;
+       return count;
 }
 
 static ssize_t
@@ -144,6 +146,8 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj,
        /* Write NVRAM. */
        spin_lock_irqsave(&ha->hardware_lock, flags);
        ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->nvram_base, count);
+       ha->isp_ops->read_nvram(ha, (uint8_t *)&ha->nvram, ha->nvram_base,
+           count);
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
        set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
@@ -298,18 +302,20 @@ qla2x00_sysfs_read_vpd(struct kobject *kobj,
 {
        struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
            struct device, kobj)));
-       unsigned long flags;
+       int           size = ha->vpd_size;
+       char          *vpd_cache = ha->vpd;
 
-       if (!capable(CAP_SYS_ADMIN) || off != 0)
+       if (!capable(CAP_SYS_ADMIN) || off > size || count == 0)
                return 0;
+       if (off + count > size) {
+               size -= off;
+               count = size;
+       }
 
-       /* Read NVRAM. */
-       spin_lock_irqsave(&ha->hardware_lock, flags);
-       ha->isp_ops->read_nvram(ha, (uint8_t *)buf, ha->vpd_base,
-           ha->vpd_size);
-       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+       /* Read NVRAM data from cache. */
+       memcpy(buf, &vpd_cache[off], count);
 
-       return ha->vpd_size;
+       return count;
 }
 
 static ssize_t
@@ -327,6 +333,7 @@ qla2x00_sysfs_write_vpd(struct kobject *kobj,
        /* Write NVRAM. */
        spin_lock_irqsave(&ha->hardware_lock, flags);
        ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->vpd_base, count);
+       ha->isp_ops->read_nvram(ha, (uint8_t *)ha->vpd, ha->vpd_base, count);
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
        return count;
index 0c9f36c8a24870dadd6c20f8e61bf099686a0562..27ae3a532a55f0cc1d8abec4c8c9498c3deec699 100644 (file)
@@ -2340,10 +2340,14 @@ typedef struct scsi_qla_host {
        uint8_t         serial2;
 
        /* NVRAM configuration data */
+#define MAX_NVRAM_SIZE 4096
+#define VPD_OFFSET     MAX_NVRAM_SIZE / 2
        uint16_t        nvram_size;
        uint16_t        nvram_base;
+       void            *nvram;
        uint16_t        vpd_size;
        uint16_t        vpd_base;
+       void            *vpd;
 
        uint16_t        loop_reset_delay;
        uint8_t         retry_count;
index 5ec798c2bf13d4f0404d10d3b4409db9ec3a07e6..374abe19b5474f3ff18115604c76d230522f6e46 100644 (file)
@@ -1461,8 +1461,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
        uint16_t        cnt;
        uint8_t         *dptr1, *dptr2;
        init_cb_t       *icb = ha->init_cb;
-       nvram_t         *nv = (nvram_t *)ha->request_ring;
-       uint8_t         *ptr = (uint8_t *)ha->request_ring;
+       nvram_t         *nv = ha->nvram;
+       uint8_t         *ptr = ha->nvram;
        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 
        rval = QLA_SUCCESS;
@@ -1480,8 +1480,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
                chksum += *ptr++;
 
        DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
-       DEBUG5(qla2x00_dump_buffer((uint8_t *)ha->request_ring,
-           ha->nvram_size));
+       DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size));
 
        /* Bad NVRAM data, set defaults parameters. */
        if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' ||
@@ -3500,7 +3499,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
 
        rval = QLA_SUCCESS;
        icb = (struct init_cb_24xx *)ha->init_cb;
-       nv = (struct nvram_24xx *)ha->request_ring;
+       nv = ha->nvram;
 
        /* Determine NVRAM starting address. */
        ha->nvram_size = sizeof(struct nvram_24xx);
@@ -3512,7 +3511,12 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
                ha->vpd_base = FA_NVRAM_VPD1_ADDR;
        }
 
-       /* Get NVRAM data and calculate checksum. */
+       /* Get VPD data into cache */
+       ha->vpd = ha->nvram + VPD_OFFSET;
+       ha->isp_ops->read_nvram(ha, (uint8_t *)ha->vpd,
+           ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4);
+
+       /* Get NVRAM data into cache and calculate checksum. */
        dptr = (uint32_t *)nv;
        ha->isp_ops->read_nvram(ha, (uint8_t *)dptr, ha->nvram_base,
            ha->nvram_size);
@@ -3520,8 +3524,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
                chksum += le32_to_cpu(*dptr++);
 
        DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
-       DEBUG5(qla2x00_dump_buffer((uint8_t *)ha->request_ring,
-           ha->nvram_size));
+       DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size));
 
        /* Bad NVRAM data, set defaults parameters. */
        if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P'
index b8f226ae26334290eb9698bd3524eae2eba683a4..50539da467bf0dcebcd49d0bd0711e2d8e0205b5 100644 (file)
@@ -1068,7 +1068,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
                         * values.
                         */
                        if (resid &&
-                           ((unsigned)(cp->request_bufflen - resid) <
+                           ((unsigned)(scsi_bufflen(cp) - resid) <
                             cp->underflow)) {
                                DEBUG2(qla_printk(KERN_INFO, ha,
                                    "scsi(%ld:%d:%d:%d): Mid-layer underflow "
@@ -1076,7 +1076,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
                                    "error status.\n", ha->host_no,
                                    cp->device->channel, cp->device->id,
                                    cp->device->lun, resid,
-                                   cp->request_bufflen));
+                                   scsi_bufflen(cp)));
 
                                cp->result = DID_ERROR << 16 | lscsi_status;
                        }
index 19c44f0781fd7d478858c2295d232f6f5ebe7f4c..e2ea739e33df121dae6b91b25339efee7cdf3696 100644 (file)
@@ -154,6 +154,9 @@ static struct {
        {"EMC",  "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
        {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN},
        {"EMULEX", "MD21/S2     ESDI", NULL, BLIST_SINGLELUN},
+       {"easyRAID", "16P", NULL, BLIST_NOREPORTLUN},
+       {"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN},
+       {"easyRAID", "F8", NULL, BLIST_NOREPORTLUN},
        {"FSC", "CentricStor", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
        {"Generic", "USB SD Reader", "1.00", BLIST_FORCELUN | BLIST_INQUIRY_36},
        {"Generic", "USB Storage-SMC", "0180", BLIST_FORCELUN | BLIST_INQUIRY_36},
index 15a51459c81fbafb0d77d97f62542185cecb28e8..3db22325ea2cdf55a76b0dca34e59a2f579495e6 100644 (file)
@@ -2033,7 +2033,7 @@ static struct pci_device_id sym2_id_table[] __devinitdata = {
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C875,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C1510,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, /* new */
+         PCI_ANY_ID, PCI_ANY_ID,  PCI_CLASS_STORAGE_SCSI<<8,  0xffff00, 0UL }, /* new */
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C895A,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
        { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C875A,
index befff5f9d58c59ce1b5fc19545382ca8b9116b69..ac49b15fa76840ba74c986ee9d44c8ed7b17bf43 100644 (file)
@@ -48,6 +48,7 @@ obj-$(CONFIG_USB_SISUSBVGA)   += misc/
 obj-$(CONFIG_USB_TEST)         += misc/
 obj-$(CONFIG_USB_TRANCEVIBRATOR)+= misc/
 obj-$(CONFIG_USB_USS720)       += misc/
+obj-$(CONFIG_USB_IOWARRIOR)    += misc/
 
 obj-$(CONFIG_USB_ATM)          += atm/
 obj-$(CONFIG_USB_SPEEDTOUCH)   += atm/
index 25f63f1096b43d4d9a6da4e266e212cf09d48549..b6bd05e3d439eb41f6c87633d9bba10960d45498 100644 (file)
 #include "hcd.h"       /* for usbcore internals */
 #include "usb.h"
 
+struct api_context {
+       struct completion       done;
+       int                     status;
+};
+
 static void usb_api_blocking_completion(struct urb *urb)
 {
-       complete((struct completion *)urb->context);
+       struct api_context *ctx = urb->context;
+
+       ctx->status = urb->status;
+       complete(&ctx->done);
 }
 
 
@@ -32,20 +40,21 @@ static void usb_api_blocking_completion(struct urb *urb)
  */
 static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length)
 { 
-       struct completion done;
+       struct api_context ctx;
        unsigned long expire;
        int retval;
-       int status = urb->status;
 
-       init_completion(&done);         
-       urb->context = &done;
+       init_completion(&ctx.done);
+       urb->context = &ctx;
        urb->actual_length = 0;
        retval = usb_submit_urb(urb, GFP_NOIO);
        if (unlikely(retval))
                goto out;
 
        expire = timeout ? msecs_to_jiffies(timeout) : MAX_SCHEDULE_TIMEOUT;
-       if (!wait_for_completion_timeout(&done, expire)) {
+       if (!wait_for_completion_timeout(&ctx.done, expire)) {
+               usb_kill_urb(urb);
+               retval = (ctx.status == -ENOENT ? -ETIMEDOUT : ctx.status);
 
                dev_dbg(&urb->dev->dev,
                        "%s timed out on ep%d%s len=%d/%d\n",
@@ -54,11 +63,8 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length)
                        usb_pipein(urb->pipe) ? "in" : "out",
                        urb->actual_length,
                        urb->transfer_buffer_length);
-
-               usb_kill_urb(urb);
-               retval = status == -ENOENT ? -ETIMEDOUT : status;
        } else
-               retval = status;
+               retval = ctx.status;
 out:
        if (actual_length)
                *actual_length = urb->actual_length;
@@ -411,15 +417,22 @@ int usb_sg_init (
                 * Some systems need to revert to PIO when DMA is temporarily
                 * unavailable.  For their sakes, both transfer_buffer and
                 * transfer_dma are set when possible.  However this can only
-                * work on systems without HIGHMEM, since DMA buffers located
-                * in high memory are not directly addressable by the CPU for
-                * PIO ... so when HIGHMEM is in use, transfer_buffer is NULL
+                * work on systems without:
+                *
+                *  - HIGHMEM, since DMA buffers located in high memory are
+                *    not directly addressable by the CPU for PIO;
+                *
+                *  - IOMMU, since dma_map_sg() is allowed to use an IOMMU to
+                *    make virtually discontiguous buffers be "dma-contiguous"
+                *    so that PIO and DMA need diferent numbers of URBs.
+                *
+                * So when HIGHMEM or IOMMU are in use, transfer_buffer is NULL
                 * to prevent stale pointers and to help spot bugs.
                 */
                if (dma) {
                        io->urbs [i]->transfer_dma = sg_dma_address (sg + i);
                        len = sg_dma_len (sg + i);
-#ifdef CONFIG_HIGHMEM
+#if defined(CONFIG_HIGHMEM) || defined(CONFIG_IOMMU)
                        io->urbs[i]->transfer_buffer = NULL;
 #else
                        io->urbs[i]->transfer_buffer =
index aa21b38a31cee53bca3af2cb0ca9ea8fd89ac64c..b7917c5a3c6f4182f6f085e8186790b17577f8d1 100644 (file)
 static const struct usb_device_id usb_quirk_list[] = {
        /* HP 5300/5370C scanner */
        { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 },
+       /* Acer Peripherals Inc. (now BenQ Corp.) Prisa 640BU */
+       { USB_DEVICE(0x04a5, 0x207e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Benq S2W 3300U */
        { USB_DEVICE(0x04a5, 0x20b0), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Canon, Inc. CanoScan N1240U/LiDE30 */
+       { USB_DEVICE(0x04a9, 0x220e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Canon, Inc. CanoScan N650U/N656U */
+       { USB_DEVICE(0x04a9, 0x2206), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Canon, Inc. CanoScan 1220U */
+       { USB_DEVICE(0x04a9, 0x2207), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Canon, Inc. CanoScan N670U/N676U/LiDE 20 */
+       { USB_DEVICE(0x04a9, 0x220d), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* old Cannon scanner */
+       { USB_DEVICE(0x04a9, 0x2220), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Seiko Epson Corp. Perfection 1200 */
        { USB_DEVICE(0x04b8, 0x0104), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Seiko Epson Corp. Perfection 660 */
+       { USB_DEVICE(0x04b8, 0x0114), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Epson Perfection 1260 Photo */
+       { USB_DEVICE(0x04b8, 0x011d), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Seiko Epson Corp - Perfection 1670 */
        { USB_DEVICE(0x04b8, 0x011f), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* EPSON Perfection 2480 */
+       { USB_DEVICE(0x04b8, 0x0121), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Seiko Epson Corp.*/
+       { USB_DEVICE(0x04b8, 0x0122), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Samsung ML-2510 Series printer */
        { USB_DEVICE(0x04e8, 0x327e), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Elsa MicroLink 56k (V.250) */
        { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Ultima Electronics Corp.*/
        { USB_DEVICE(0x05d8, 0x4005), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
+       /* Agfa Snapscan1212u */
+       { USB_DEVICE(0x06bd, 0x2061), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
        /* Umax [hex] Astra 3400U */
        { USB_DEVICE(0x1606, 0x0060), .driver_info = USB_QUIRK_NO_AUTOSUSPEND },
 
index d18901b92cdaf191146156126f18b514730d47fd..c6760aee1e5c0e7e4449c1e66515e0ff7c109d63 100644 (file)
@@ -50,7 +50,7 @@ usb_descriptor_fillbuf(void *buf, unsigned buflen,
                return -EINVAL;
 
        /* fill buffer from src[] until null descriptor ptr */
-       for (; 0 != *src; src++) {
+       for (; NULL != *src; src++) {
                unsigned                len = (*src)->bLength;
 
                if (len > buflen)
index 6042364402b8fb0b4fe1551fe8b5c57b8ae190c5..3aa46cfa66bae3fdae225ad3fd4e862514903e9e 100644 (file)
@@ -71,7 +71,7 @@ ep_matches (
        u16             max;
 
        /* endpoint already claimed? */
-       if (0 != ep->driver_data)
+       if (NULL != ep->driver_data)
                return 0;
 
        /* only support ep0 for portable CONTROL traffic */
index a3376739a81b0cb839ea01f292ca34535ce68197..593e23507b1a79cff9b63fc0986d0ae088ac3d93 100644 (file)
@@ -1723,7 +1723,8 @@ rx_submit (struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags)
                size += sizeof (struct rndis_packet_msg_type);
        size -= size % dev->out_ep->maxpacket;
 
-       if ((skb = alloc_skb (size + NET_IP_ALIGN, gfp_flags)) == 0) {
+       skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags);
+       if (skb == NULL) {
                DEBUG (dev, "no rx skb\n");
                goto enomem;
        }
index e60745ffaf8e382b71cab4203db168025475077b..173004f60feaca1a74b395bbb109141d9ec0d781 100644 (file)
@@ -964,7 +964,7 @@ static int setup_req (struct usb_ep *ep, struct usb_request *req, u16 len)
        }
        if (len > sizeof (dev->rbuf))
                req->buf = kmalloc(len, GFP_ATOMIC);
-       if (req->buf == 0) {
+       if (req->buf == NULL) {
                req->buf = dev->rbuf;
                return -ENOMEM;
        }
@@ -1394,7 +1394,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
        dev->setup_abort = 0;
        if (dev->state == STATE_DEV_UNCONNECTED) {
 #ifdef CONFIG_USB_GADGET_DUALSPEED
-               if (gadget->speed == USB_SPEED_HIGH && dev->hs_config == 0) {
+               if (gadget->speed == USB_SPEED_HIGH && dev->hs_config == NULL) {
                        spin_unlock(&dev->lock);
                        ERROR (dev, "no high speed config??\n");
                        return -EINVAL;
index 700dda8a91579666cf04af70416e2dae6fb01912..4b27d12f049db022b7ca8287d5a8f816d4f4cdf0 100644 (file)
@@ -1299,7 +1299,7 @@ static int m66592_queue(struct usb_ep *_ep, struct usb_request *_req,
        req->req.actual = 0;
        req->req.status = -EINPROGRESS;
 
-       if (ep->desc == 0)      /* control */
+       if (ep->desc == NULL)   /* control */
                start_ep0(ep, req);
        else {
                if (request && !ep->busy)
index 63b9521c1322018a4c494f32c0174cb190a11181..72b4ebbf132d1ed636b2ebc60953f97b23fe99cc 100644 (file)
@@ -93,8 +93,6 @@ static const char driver_name [] = "pxa2xx_udc";
 static const char ep0name [] = "ep0";
 
 
-// #define     DISABLE_TEST_MODE
-
 #ifdef CONFIG_ARCH_IXP4XX
 
 /* cpu-specific register addresses are compiled in to this code */
@@ -113,17 +111,6 @@ static const char ep0name [] = "ep0";
 #define SIZE_STR       ""
 #endif
 
-#ifdef DISABLE_TEST_MODE
-/* (mode == 0) == no undocumented chip tweaks
- * (mode & 1)  == double buffer bulk IN
- * (mode & 2)  == double buffer bulk OUT
- * ... so mode = 3 (or 7, 15, etc) does it for both
- */
-static ushort fifo_mode = 0;
-module_param(fifo_mode, ushort, 0);
-MODULE_PARM_DESC (fifo_mode, "pxa2xx udc fifo mode");
-#endif
-
 /* ---------------------------------------------------------------------------
  *     endpoint related parts of the api to the usb controller hardware,
  *     used by gadget driver; and the inner talker-to-hardware core.
@@ -1252,23 +1239,6 @@ static void udc_enable (struct pxa2xx_udc *dev)
                UDC_RES2 = 0x00;
        }
 
-#ifdef DISABLE_TEST_MODE
-       /* "test mode" seems to have become the default in later chip
-        * revs, preventing double buffering (and invalidating docs).
-        * this EXPERIMENT enables it for bulk endpoints by tweaking
-        * undefined/reserved register bits (that other drivers clear).
-        * Belcarra code comments noted this usage.
-        */
-       if (fifo_mode & 1) {    /* IN endpoints */
-               UDC_RES1 |= USIR0_IR1|USIR0_IR6;
-               UDC_RES2 |= USIR1_IR11;
-       }
-       if (fifo_mode & 2) {    /* OUT endpoints */
-               UDC_RES1 |= USIR0_IR2|USIR0_IR7;
-               UDC_RES2 |= USIR1_IR12;
-       }
-#endif
-
        /* enable suspend/resume and reset irqs */
        udc_clear_mask_UDCCR(UDCCR_SRM | UDCCR_REM);
 
index a2e6e3fc8c8d731b516ec3880ea3a987f3098438..fcfe869acb942bb36dcb742666d285f7de0cd931 100644 (file)
@@ -653,7 +653,8 @@ set_source_sink_config (struct zero_dev *dev, gfp_t gfp_flags)
                        result = usb_ep_enable (ep, d);
                        if (result == 0) {
                                ep->driver_data = dev;
-                               if (source_sink_start_ep (ep, gfp_flags) != 0) {
+                               if (source_sink_start_ep(ep, gfp_flags)
+                                               != NULL) {
                                        dev->in_ep = ep;
                                        continue;
                                }
@@ -667,7 +668,8 @@ set_source_sink_config (struct zero_dev *dev, gfp_t gfp_flags)
                        result = usb_ep_enable (ep, d);
                        if (result == 0) {
                                ep->driver_data = dev;
-                               if (source_sink_start_ep (ep, gfp_flags) != 0) {
+                               if (source_sink_start_ep(ep, gfp_flags)
+                                               != NULL) {
                                        dev->out_ep = ep;
                                        continue;
                                }
index e831cb7f64fd00eb590812fae00b53298112b807..33f6ee50b8d34b5c0ca5fc83d368d8325d11e235 100644 (file)
@@ -356,7 +356,7 @@ static void cp2101_get_termios (struct usb_serial_port *port)
 
        dbg("%s - port %d", __FUNCTION__, port->number);
 
-       if ((!port->tty) || (!port->tty->termios)) {
+       if (!port->tty || !port->tty->termios) {
                dbg("%s - no tty structures", __FUNCTION__);
                return;
        }
@@ -526,50 +526,35 @@ static void cp2101_set_termios (struct usb_serial_port *port,
                return;
        }
        cflag = port->tty->termios->c_cflag;
-
-       /* Check that they really want us to change something */
-       if (old_termios) {
-               if ((cflag == old_termios->c_cflag) &&
-                               (RELEVANT_IFLAG(port->tty->termios->c_iflag)
-                               == RELEVANT_IFLAG(old_termios->c_iflag))) {
-                       dbg("%s - nothing to change...", __FUNCTION__);
-                       return;
-               }
-
-               old_cflag = old_termios->c_cflag;
-       }
+       old_cflag = old_termios->c_cflag;
+       baud = tty_get_baud_rate(port->tty);
 
        /* If the baud rate is to be updated*/
-       if ((cflag & CBAUD) != (old_cflag & CBAUD)) {
-               switch (cflag & CBAUD) {
-                       /*
-                        * The baud rates which are commented out below
-                        * appear to be supported by the device
-                        * but are non-standard
-                        */
-                       case B0:        baud = 0;       break;
-                       case B600:      baud = 600;     break;
-                       case B1200:     baud = 1200;    break;
-                       case B1800:     baud = 1800;    break;
-                       case B2400:     baud = 2400;    break;
-                       case B4800:     baud = 4800;    break;
-                       /*case B7200:   baud = 7200;    break;*/
-                       case B9600:     baud = 9600;    break;
-                       /*ase B14400:   baud = 14400;   break;*/
-                       case B19200:    baud = 19200;   break;
-                       /*case B28800:  baud = 28800;   break;*/
-                       case B38400:    baud = 38400;   break;
-                       /*case B55854:  baud = 55054;   break;*/
-                       case B57600:    baud = 57600;   break;
-                       case B115200:   baud = 115200;  break;
-                       /*case B127117: baud = 127117;  break;*/
-                       case B230400:   baud = 230400;  break;
-                       case B460800:   baud = 460800;  break;
-                       case B921600:   baud = 921600;  break;
-                       /*case B3686400:        baud = 3686400; break;*/
+       if (baud != tty_termios_baud_rate(old_termios)) {
+               switch (baud) {
+                       case 0:
+                       case 600:
+                       case 1200:
+                       case 1800:
+                       case 2400:
+                       case 4800:
+                       case 7200:
+                       case 9600:
+                       case 14400:
+                       case 19200:
+                       case 28800:
+                       case 38400:
+                       case 55854:
+                       case 57600:
+                       case 115200:
+                       case 127117:
+                       case 230400:
+                       case 460800:
+                       case 921600:
+                       case 3686400:
+                               break;
                        default:
-                               dev_err(&port->dev, "cp2101 driver does not "
-                                       "support the baudrate requested\n");
+                               baud = 9600;
                                break;
                }
 
index 976f54ec26e66e0529f10a2c6d6879953a1b7f67..dab2e66d111dbb8692fe717615965784cc110b31 100644 (file)
@@ -433,38 +433,38 @@ struct digi_port {
 
 /* Local Function Declarations */
 
-static void digi_wakeup_write( struct usb_serial_port *port );
+static void digi_wakeup_write(struct usb_serial_port *port);
 static void digi_wakeup_write_lock(struct work_struct *work);
-static int digi_write_oob_command( struct usb_serial_port *port,
-       unsigned char *buf, int count, int interruptible );
-static int digi_write_inb_command( struct usb_serial_port *port,
-       unsigned char *buf, int count, unsigned long timeout );
-static int digi_set_modem_signals( struct usb_serial_port *port,
-       unsigned int modem_signals, int interruptible );
-static int digi_transmit_idle( struct usb_serial_port *port,
-       unsigned long timeout );
+static int digi_write_oob_command(struct usb_serial_port *port,
+       unsigned char *buf, int count, int interruptible);
+static int digi_write_inb_command(struct usb_serial_port *port,
+       unsigned char *buf, int count, unsigned long timeout);
+static int digi_set_modem_signals(struct usb_serial_port *port,
+       unsigned int modem_signals, int interruptible);
+static int digi_transmit_idle(struct usb_serial_port *port,
+       unsigned long timeout);
 static void digi_rx_throttle (struct usb_serial_port *port);
 static void digi_rx_unthrottle (struct usb_serial_port *port);
-static void digi_set_termios( struct usb_serial_port *port, 
-       struct ktermios *old_termios );
-static void digi_break_ctl( struct usb_serial_port *port, int break_state );
-static int digi_ioctl( struct usb_serial_port *port, struct file *file,
-       unsigned int cmd, unsigned long arg );
-static int digi_tiocmget( struct usb_serial_port *port, struct file *file );
-static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
-       unsigned int set, unsigned int clear );
-static int digi_write( struct usb_serial_port *port, const unsigned char *buf, int count );
-static void digi_write_bulk_callback( struct urb *urb );
-static int digi_write_room( struct usb_serial_port *port );
-static int digi_chars_in_buffer( struct usb_serial_port *port );
-static int digi_open( struct usb_serial_port *port, struct file *filp );
-static void digi_close( struct usb_serial_port *port, struct file *filp );
-static int digi_startup_device( struct usb_serial *serial );
-static int digi_startup( struct usb_serial *serial );
-static void digi_shutdown( struct usb_serial *serial );
-static void digi_read_bulk_callback( struct urb *urb );
-static int digi_read_inb_callback( struct urb *urb );
-static int digi_read_oob_callback( struct urb *urb );
+static void digi_set_termios(struct usb_serial_port *port,
+       struct ktermios *old_termios);
+static void digi_break_ctl(struct usb_serial_port *port, int break_state);
+static int digi_ioctl(struct usb_serial_port *port, struct file *file,
+       unsigned int cmd, unsigned long arg);
+static int digi_tiocmget(struct usb_serial_port *port, struct file *file);
+static int digi_tiocmset(struct usb_serial_port *port, struct file *file,
+       unsigned int set, unsigned int clear);
+static int digi_write(struct usb_serial_port *port, const unsigned char *buf, int count);
+static void digi_write_bulk_callback(struct urb *urb);
+static int digi_write_room(struct usb_serial_port *port);
+static int digi_chars_in_buffer(struct usb_serial_port *port);
+static int digi_open(struct usb_serial_port *port, struct file *filp);
+static void digi_close(struct usb_serial_port *port, struct file *filp);
+static int digi_startup_device(struct usb_serial *serial);
+static int digi_startup(struct usb_serial *serial);
+static void digi_shutdown(struct usb_serial *serial);
+static void digi_read_bulk_callback(struct urb *urb);
+static int digi_read_inb_callback(struct urb *urb);
+static int digi_read_oob_callback(struct urb *urb);
 
 
 /* Statics */
@@ -576,9 +576,9 @@ static struct usb_serial_driver digi_acceleport_4_device = {
 *  with the equivalent code.
 */
 
-static inline long cond_wait_interruptible_timeout_irqrestore(
+static long cond_wait_interruptible_timeout_irqrestore(
        wait_queue_head_t *q, long timeout,
-       spinlock_t *lock, unsigned long flags )
+       spinlock_t *lock, unsigned long flags)
 {
        DEFINE_WAIT(wait);
 
@@ -600,18 +600,16 @@ static inline long cond_wait_interruptible_timeout_irqrestore(
 
 static void digi_wakeup_write_lock(struct work_struct *work)
 {
-       struct digi_port *priv =
-               container_of(work, struct digi_port, dp_wakeup_work);
+       struct digi_port *priv = container_of(work, struct digi_port, dp_wakeup_work);
        struct usb_serial_port *port = priv->dp_port;
        unsigned long flags;
 
-
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
-       digi_wakeup_write( port );
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
+       digi_wakeup_write(port);
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
 }
 
-static void digi_wakeup_write( struct usb_serial_port *port )
+static void digi_wakeup_write(struct usb_serial_port *port)
 {
        tty_wakeup(port->tty);
 }
@@ -628,8 +626,8 @@ static void digi_wakeup_write( struct usb_serial_port *port )
 *  returned by usb_submit_urb.
 */
 
-static int digi_write_oob_command( struct usb_serial_port *port,
-       unsigned char *buf, int count, int interruptible )
+static int digi_write_oob_command(struct usb_serial_port *port,
+       unsigned char *buf, int count, int interruptible)
 {
 
        int ret = 0;
@@ -638,49 +636,37 @@ static int digi_write_oob_command( struct usb_serial_port *port,
        struct digi_port *oob_priv = usb_get_serial_port_data(oob_port);
        unsigned long flags = 0;
 
+       dbg("digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, count);
 
-dbg( "digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, count );
-
-       spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
-
-       while( count > 0 ) {
-
-               while( oob_port->write_urb->status == -EINPROGRESS
-               || oob_priv->dp_write_urb_in_use ) {
+       spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
+       while(count > 0) {
+               while(oob_port->write_urb->status == -EINPROGRESS
+                       || oob_priv->dp_write_urb_in_use) {
                        cond_wait_interruptible_timeout_irqrestore(
                                &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
-                               &oob_priv->dp_port_lock, flags );
-                       if( interruptible && signal_pending(current) ) {
-                               return( -EINTR );
-                       }
-                       spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
+                               &oob_priv->dp_port_lock, flags);
+                       if (interruptible && signal_pending(current))
+                               return -EINTR;
+                       spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
                }
 
                /* len must be a multiple of 4, so commands are not split */
-               len = min(count, oob_port->bulk_out_size );
-               if( len > 4 )
+               len = min(count, oob_port->bulk_out_size);
+               if (len > 4)
                        len &= ~3;
-
-               memcpy( oob_port->write_urb->transfer_buffer, buf, len );
+               memcpy(oob_port->write_urb->transfer_buffer, buf, len);
                oob_port->write_urb->transfer_buffer_length = len;
                oob_port->write_urb->dev = port->serial->dev;
-
-               if( (ret=usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0 ) {
+               if ((ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0) {
                        oob_priv->dp_write_urb_in_use = 1;
                        count -= len;
                        buf += len;
                }
-
-       }
-
-       spin_unlock_irqrestore( &oob_priv->dp_port_lock, flags );
-
-       if( ret ) {
-               err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__,
-                       ret );
        }
-
-       return( ret );
+       spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
+       if (ret)
+               err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__, ret);
+       return ret;
 
 }
 
@@ -697,63 +683,58 @@ dbg( "digi_write_oob_command: TOP: port=%d, count=%d", oob_priv->dp_port_num, co
 *  error returned by digi_write.
 */
 
-static int digi_write_inb_command( struct usb_serial_port *port,
-       unsigned char *buf, int count, unsigned long timeout )
+static int digi_write_inb_command(struct usb_serial_port *port,
+       unsigned char *buf, int count, unsigned long timeout)
 {
-
        int ret = 0;
        int len;
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned char *data = port->write_urb->transfer_buffer;
        unsigned long flags = 0;
 
+       dbg("digi_write_inb_command: TOP: port=%d, count=%d",
+               priv->dp_port_num, count);
 
-dbg( "digi_write_inb_command: TOP: port=%d, count=%d", priv->dp_port_num,
-count );
-
-       if( timeout )
+       if (timeout)
                timeout += jiffies;
        else
                timeout = ULONG_MAX;
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
-
-       while( count > 0 && ret == 0 ) {
-
-               while( (port->write_urb->status == -EINPROGRESS
-               || priv->dp_write_urb_in_use) && time_before(jiffies, timeout)) {
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
+       while(count > 0 && ret == 0) {
+               while((port->write_urb->status == -EINPROGRESS
+                       || priv->dp_write_urb_in_use) && time_before(jiffies, timeout)) {
                        cond_wait_interruptible_timeout_irqrestore(
                                &port->write_wait, DIGI_RETRY_TIMEOUT,
-                               &priv->dp_port_lock, flags );
-                       if( signal_pending(current) ) {
-                               return( -EINTR );
-                       }
-                       spin_lock_irqsave( &priv->dp_port_lock, flags );
+                               &priv->dp_port_lock, flags);
+                       if (signal_pending(current))
+                               return -EINTR;
+                       spin_lock_irqsave(&priv->dp_port_lock, flags);
                }
 
                /* len must be a multiple of 4 and small enough to */
                /* guarantee the write will send buffered data first, */
                /* so commands are in order with data and not split */
-               len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len );
-               if( len > 4 )
+               len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
+               if (len > 4)
                        len &= ~3;
 
                /* write any buffered data first */
-               if( priv->dp_out_buf_len > 0 ) {
+               if (priv->dp_out_buf_len > 0) {
                        data[0] = DIGI_CMD_SEND_DATA;
                        data[1] = priv->dp_out_buf_len;
-                       memcpy( data+2, priv->dp_out_buf,
-                               priv->dp_out_buf_len );
-                       memcpy( data+2+priv->dp_out_buf_len, buf, len );
+                       memcpy(data + 2, priv->dp_out_buf,
+                               priv->dp_out_buf_len);
+                       memcpy(data + 2 + priv->dp_out_buf_len, buf, len);
                        port->write_urb->transfer_buffer_length
-                               = priv->dp_out_buf_len+2+len;
+                               = priv->dp_out_buf_len + 2 + len;
                } else {
-                       memcpy( data, buf, len );
+                       memcpy(data, buf, len);
                        port->write_urb->transfer_buffer_length = len;
                }
                port->write_urb->dev = port->serial->dev;
 
-               if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
+               if ((ret = usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0) {
                        priv->dp_write_urb_in_use = 1;
                        priv->dp_out_buf_len = 0;
                        count -= len;
@@ -761,16 +742,12 @@ count );
                }
 
        }
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
 
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
-       if( ret ) {
-               err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
-               ret, priv->dp_port_num );
-       }
-
-       return( ret );
-
+       if (ret)
+               err("%s: usb_submit_urb failed, ret=%d, port=%d",
+                       __FUNCTION__, ret, priv->dp_port_num);
+       return ret;
 }
 
 
@@ -784,8 +761,8 @@ count );
 *  returned by usb_submit_urb.
 */
 
-static int digi_set_modem_signals( struct usb_serial_port *port,
-       unsigned int modem_signals, int interruptible )
+static int digi_set_modem_signals(struct usb_serial_port *port,
+       unsigned int modem_signals, int interruptible)
 {
 
        int ret;
@@ -796,60 +773,47 @@ static int digi_set_modem_signals( struct usb_serial_port *port,
        unsigned long flags = 0;
 
 
-dbg( "digi_set_modem_signals: TOP: port=%d, modem_signals=0x%x",
-port_priv->dp_port_num, modem_signals );
+       dbg("digi_set_modem_signals: TOP: port=%d, modem_signals=0x%x",
+               port_priv->dp_port_num, modem_signals);
 
-       spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
-       spin_lock( &port_priv->dp_port_lock );
+       spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
+       spin_lock(&port_priv->dp_port_lock);
 
-       while( oob_port->write_urb->status == -EINPROGRESS
-       || oob_priv->dp_write_urb_in_use ) {
-               spin_unlock( &port_priv->dp_port_lock );
+       while(oob_port->write_urb->status == -EINPROGRESS || oob_priv->dp_write_urb_in_use) {
+               spin_unlock(&port_priv->dp_port_lock);
                cond_wait_interruptible_timeout_irqrestore(
                        &oob_port->write_wait, DIGI_RETRY_TIMEOUT,
-                       &oob_priv->dp_port_lock, flags );
-               if( interruptible && signal_pending(current) ) {
-                       return( -EINTR );
-               }
-               spin_lock_irqsave( &oob_priv->dp_port_lock, flags );
-               spin_lock( &port_priv->dp_port_lock );
+                       &oob_priv->dp_port_lock, flags);
+               if (interruptible && signal_pending(current))
+                       return -EINTR;
+               spin_lock_irqsave(&oob_priv->dp_port_lock, flags);
+               spin_lock(&port_priv->dp_port_lock);
        }
-
        data[0] = DIGI_CMD_SET_DTR_SIGNAL;
        data[1] = port_priv->dp_port_num;
-       data[2] = (modem_signals&TIOCM_DTR) ?
-               DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE;
+       data[2] = (modem_signals&TIOCM_DTR) ? DIGI_DTR_ACTIVE : DIGI_DTR_INACTIVE;
        data[3] = 0;
-
        data[4] = DIGI_CMD_SET_RTS_SIGNAL;
        data[5] = port_priv->dp_port_num;
-       data[6] = (modem_signals&TIOCM_RTS) ?
-               DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE;
+       data[6] = (modem_signals&TIOCM_RTS) ? DIGI_RTS_ACTIVE : DIGI_RTS_INACTIVE;
        data[7] = 0;
 
        oob_port->write_urb->transfer_buffer_length = 8;
        oob_port->write_urb->dev = port->serial->dev;
 
-       if( (ret=usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0 ) {
+       if ((ret = usb_submit_urb(oob_port->write_urb, GFP_ATOMIC)) == 0) {
                oob_priv->dp_write_urb_in_use = 1;
                port_priv->dp_modem_signals =
                        (port_priv->dp_modem_signals&~(TIOCM_DTR|TIOCM_RTS))
                        | (modem_signals&(TIOCM_DTR|TIOCM_RTS));
        }
-
-       spin_unlock( &port_priv->dp_port_lock );
-       spin_unlock_irqrestore( &oob_priv->dp_port_lock, flags );
-
-       if( ret ) {
-               err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__,
-               ret );
-       }
-
-       return( ret );
-
+       spin_unlock(&port_priv->dp_port_lock);
+       spin_unlock_irqrestore(&oob_priv->dp_port_lock, flags);
+       if (ret)
+               err("%s: usb_submit_urb failed, ret=%d", __FUNCTION__, ret);
+       return ret;
 }
 
-
 /*
 *  Digi Transmit Idle
 *
@@ -862,203 +826,182 @@ port_priv->dp_port_num, modem_signals );
 *  port at a time, so its ok.
 */
 
-static int digi_transmit_idle( struct usb_serial_port *port,
-       unsigned long timeout )
+static int digi_transmit_idle(struct usb_serial_port *port,
+       unsigned long timeout)
 {
-
        int ret;
        unsigned char buf[2];
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned long flags = 0;
 
-
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
        priv->dp_transmit_idle = 0;
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
 
        buf[0] = DIGI_CMD_TRANSMIT_IDLE;
        buf[1] = 0;
 
        timeout += jiffies;
 
-       if( (ret=digi_write_inb_command( port, buf, 2, timeout-jiffies )) != 0 )
-               return( ret );
+       if ((ret = digi_write_inb_command(port, buf, 2, timeout - jiffies)) != 0)
+               return ret;
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
 
-       while( time_before(jiffies, timeout) && !priv->dp_transmit_idle ) {
+       while(time_before(jiffies, timeout) && !priv->dp_transmit_idle) {
                cond_wait_interruptible_timeout_irqrestore(
                        &priv->dp_transmit_idle_wait, DIGI_RETRY_TIMEOUT,
-                       &priv->dp_port_lock, flags );
-               if( signal_pending(current) ) {
-                       return( -EINTR );
-               }
-               spin_lock_irqsave( &priv->dp_port_lock, flags );
+                       &priv->dp_port_lock, flags);
+               if (signal_pending(current))
+                       return -EINTR;
+               spin_lock_irqsave(&priv->dp_port_lock, flags);
        }
-
        priv->dp_transmit_idle = 0;
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
-       return( 0 );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       return 0;
 
 }
 
 
-static void digi_rx_throttle( struct usb_serial_port *port )
+static void digi_rx_throttle(struct usb_serial_port *port)
 {
-
        unsigned long flags;
        struct digi_port *priv = usb_get_serial_port_data(port);
 
 
-dbg( "digi_rx_throttle: TOP: port=%d", priv->dp_port_num );
+       dbg("digi_rx_throttle: TOP: port=%d", priv->dp_port_num);
 
        /* stop receiving characters by not resubmitting the read urb */
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
        priv->dp_throttled = 1;
        priv->dp_throttle_restart = 0;
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
 }
 
 
-static void digi_rx_unthrottle( struct usb_serial_port *port )
+static void digi_rx_unthrottle(struct usb_serial_port *port)
 {
-
        int ret = 0;
        unsigned long flags;
        struct digi_port *priv = usb_get_serial_port_data(port);
 
-dbg( "digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num );
+       dbg("digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num);
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
 
        /* turn throttle off */
        priv->dp_throttled = 0;
        priv->dp_throttle_restart = 0;
 
        /* restart read chain */
-       if( priv->dp_throttle_restart ) {
+       if (priv->dp_throttle_restart) {
                port->read_urb->dev = port->serial->dev;
-               ret = usb_submit_urb( port->read_urb, GFP_ATOMIC );
+               ret = usb_submit_urb(port->read_urb, GFP_ATOMIC);
        }
 
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
-       if( ret ) {
-               err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
-                       ret, priv->dp_port_num );
-       }
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
 
+       if (ret)
+               err("%s: usb_submit_urb failed, ret=%d, port=%d",
+                       __FUNCTION__, ret, priv->dp_port_num);
 }
 
 
-static void digi_set_termios( struct usb_serial_port *port, 
-       struct ktermios *old_termios )
+static void digi_set_termios(struct usb_serial_port *port,
+                                       struct ktermios *old_termios)
 {
 
        struct digi_port *priv = usb_get_serial_port_data(port);
-       unsigned int iflag = port->tty->termios->c_iflag;
-       unsigned int cflag = port->tty->termios->c_cflag;
+       struct tty_struct *tty = port->tty;
+       unsigned int iflag = tty->termios->c_iflag;
+       unsigned int cflag = tty->termios->c_cflag;
        unsigned int old_iflag = old_termios->c_iflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned char buf[32];
        unsigned int modem_signals;
        int arg,ret;
        int i = 0;
+       speed_t baud;
 
-
-dbg( "digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x", priv->dp_port_num, iflag, old_iflag, cflag, old_cflag );
+       dbg("digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, old_cflag=0x%x", priv->dp_port_num, iflag, old_iflag, cflag, old_cflag);
 
        /* set baud rate */
-       if( (cflag&CBAUD) != (old_cflag&CBAUD) ) {
-
+       if ((baud = tty_get_baud_rate(tty)) != tty_termios_baud_rate(old_termios)) {
                arg = -1;
 
                /* reassert DTR and (maybe) RTS on transition from B0 */
-               if( (old_cflag&CBAUD) == B0 ) {
+               if ((old_cflag&CBAUD) == B0) {
                        /* don't set RTS if using hardware flow control */
                        /* and throttling input */
                        modem_signals = TIOCM_DTR;
-                       if( !(port->tty->termios->c_cflag & CRTSCTS) ||
-                       !test_bit(TTY_THROTTLED, &port->tty->flags) ) {
+                       if (!(tty->termios->c_cflag & CRTSCTS) ||
+                           !test_bit(TTY_THROTTLED, &tty->flags))
                                modem_signals |= TIOCM_RTS;
-                       }
-                       digi_set_modem_signals( port, modem_signals, 1 );
+                       digi_set_modem_signals(port, modem_signals, 1);
                }
-
-               switch( (cflag&CBAUD) ) {
+               switch (baud) {
                        /* drop DTR and RTS on transition to B0 */
-               case B0: digi_set_modem_signals( port, 0, 1 ); break;
-               case B50: arg = DIGI_BAUD_50; break;
-               case B75: arg = DIGI_BAUD_75; break;
-               case B110: arg = DIGI_BAUD_110; break;
-               case B150: arg = DIGI_BAUD_150; break;
-               case B200: arg = DIGI_BAUD_200; break;
-               case B300: arg = DIGI_BAUD_300; break;
-               case B600: arg = DIGI_BAUD_600; break;
-               case B1200: arg = DIGI_BAUD_1200; break;
-               case B1800: arg = DIGI_BAUD_1800; break;
-               case B2400: arg = DIGI_BAUD_2400; break;
-               case B4800: arg = DIGI_BAUD_4800; break;
-               case B9600: arg = DIGI_BAUD_9600; break;
-               case B19200: arg = DIGI_BAUD_19200; break;
-               case B38400: arg = DIGI_BAUD_38400; break;
-               case B57600: arg = DIGI_BAUD_57600; break;
-               case B115200: arg = DIGI_BAUD_115200; break;
-               case B230400: arg = DIGI_BAUD_230400; break;
-               case B460800: arg = DIGI_BAUD_460800; break;
-               default:
-                       dbg( "digi_set_termios: can't handle baud rate 0x%x",
-                               (cflag&CBAUD) );
-                       break;
+                       case 0: digi_set_modem_signals(port, 0, 1); break;
+                       case 50: arg = DIGI_BAUD_50; break;
+                       case 75: arg = DIGI_BAUD_75; break;
+                       case 110: arg = DIGI_BAUD_110; break;
+                       case 150: arg = DIGI_BAUD_150; break;
+                       case 200: arg = DIGI_BAUD_200; break;
+                       case 300: arg = DIGI_BAUD_300; break;
+                       case 600: arg = DIGI_BAUD_600; break;
+                       case 1200: arg = DIGI_BAUD_1200; break;
+                       case 1800: arg = DIGI_BAUD_1800; break;
+                       case 2400: arg = DIGI_BAUD_2400; break;
+                       case 4800: arg = DIGI_BAUD_4800; break;
+                       case 9600: arg = DIGI_BAUD_9600; break;
+                       case 19200: arg = DIGI_BAUD_19200; break;
+                       case 38400: arg = DIGI_BAUD_38400; break;
+                       case 57600: arg = DIGI_BAUD_57600; break;
+                       case 115200: arg = DIGI_BAUD_115200; break;
+                       case 230400: arg = DIGI_BAUD_230400; break;
+                       case 460800: arg = DIGI_BAUD_460800; break;
+                       default:
+                               arg = DIGI_BAUD_9600;
+                               baud = 9600;
+                               break;
                }
-
-               if( arg != -1 ) {
+               if (arg != -1) {
                        buf[i++] = DIGI_CMD_SET_BAUD_RATE;
                        buf[i++] = priv->dp_port_num;
                        buf[i++] = arg;
                        buf[i++] = 0;
                }
-
        }
-
        /* set parity */
-       if( (cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD)) ) {
-
-               if( (cflag&PARENB) ) {
-                       if( (cflag&PARODD) )
+       if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) {
+               if (cflag&PARENB) {
+                       if (cflag&PARODD)
                                arg = DIGI_PARITY_ODD;
                        else
                                arg = DIGI_PARITY_EVEN;
                } else {
                        arg = DIGI_PARITY_NONE;
                }
-
                buf[i++] = DIGI_CMD_SET_PARITY;
                buf[i++] = priv->dp_port_num;
                buf[i++] = arg;
                buf[i++] = 0;
-
        }
-
        /* set word size */
-       if( (cflag&CSIZE) != (old_cflag&CSIZE) ) {
-
+       if ((cflag&CSIZE) != (old_cflag&CSIZE)) {
                arg = -1;
-
-               switch( (cflag&CSIZE) ) {
+               switch (cflag&CSIZE) {
                case CS5: arg = DIGI_WORD_SIZE_5; break;
                case CS6: arg = DIGI_WORD_SIZE_6; break;
                case CS7: arg = DIGI_WORD_SIZE_7; break;
                case CS8: arg = DIGI_WORD_SIZE_8; break;
                default:
-                       dbg( "digi_set_termios: can't handle word size %d",
-                               (cflag&CSIZE) );
+                       dbg("digi_set_termios: can't handle word size %d",
+                               (cflag&CSIZE));
                        break;
                }
 
-               if( arg != -1 ) {
+               if (arg != -1) {
                        buf[i++] = DIGI_CMD_SET_WORD_SIZE;
                        buf[i++] = priv->dp_port_num;
                        buf[i++] = arg;
@@ -1068,9 +1011,9 @@ dbg( "digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, ol
        }
 
        /* set stop bits */
-       if( (cflag&CSTOPB) != (old_cflag&CSTOPB) ) {
+       if ((cflag&CSTOPB) != (old_cflag&CSTOPB)) {
 
-               if( (cflag&CSTOPB) )
+               if ((cflag&CSTOPB))
                        arg = DIGI_STOP_BITS_2;
                else
                        arg = DIGI_STOP_BITS_1;
@@ -1083,18 +1026,15 @@ dbg( "digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, ol
        }
 
        /* set input flow control */
-       if( (iflag&IXOFF) != (old_iflag&IXOFF)
-       || (cflag&CRTSCTS) != (old_cflag&CRTSCTS) ) {
-
+       if ((iflag&IXOFF) != (old_iflag&IXOFF)
+           || (cflag&CRTSCTS) != (old_cflag&CRTSCTS)) {
                arg = 0;
-
-               if( (iflag&IXOFF) )
+               if (iflag&IXOFF)
                        arg |= DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
                else
                        arg &= ~DIGI_INPUT_FLOW_CONTROL_XON_XOFF;
 
-               if( (cflag&CRTSCTS) ) {
-
+               if (cflag&CRTSCTS) {
                        arg |= DIGI_INPUT_FLOW_CONTROL_RTS;
 
                        /* On USB-4 it is necessary to assert RTS prior */
@@ -1107,43 +1047,37 @@ dbg( "digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, ol
                } else {
                        arg &= ~DIGI_INPUT_FLOW_CONTROL_RTS;
                }
-
                buf[i++] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
                buf[i++] = priv->dp_port_num;
                buf[i++] = arg;
                buf[i++] = 0;
-
        }
 
        /* set output flow control */
-       if( (iflag&IXON) != (old_iflag&IXON)
-       || (cflag&CRTSCTS) != (old_cflag&CRTSCTS) ) {
-
+       if ((iflag&IXON) != (old_iflag&IXON)
+           || (cflag&CRTSCTS) != (old_cflag&CRTSCTS)) {
                arg = 0;
-
-               if( (iflag&IXON) )
+               if (iflag&IXON)
                        arg |= DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
                else
                        arg &= ~DIGI_OUTPUT_FLOW_CONTROL_XON_XOFF;
 
-               if( (cflag&CRTSCTS) ) {
+               if (cflag&CRTSCTS) {
                        arg |= DIGI_OUTPUT_FLOW_CONTROL_CTS;
                } else {
                        arg &= ~DIGI_OUTPUT_FLOW_CONTROL_CTS;
-                       port->tty->hw_stopped = 0;
+                       tty->hw_stopped = 0;
                }
 
                buf[i++] = DIGI_CMD_SET_OUTPUT_FLOW_CONTROL;
                buf[i++] = priv->dp_port_num;
                buf[i++] = arg;
                buf[i++] = 0;
-
        }
 
        /* set receive enable/disable */
-       if( (cflag&CREAD) != (old_cflag&CREAD) ) {
-
-               if( (cflag&CREAD) )
+       if ((cflag&CREAD) != (old_cflag&CREAD)) {
+               if (cflag&CREAD)
                        arg = DIGI_ENABLE;
                else
                        arg = DIGI_DISABLE;
@@ -1152,32 +1086,26 @@ dbg( "digi_set_termios: TOP: port=%d, iflag=0x%x, old_iflag=0x%x, cflag=0x%x, ol
                buf[i++] = priv->dp_port_num;
                buf[i++] = arg;
                buf[i++] = 0;
-
        }
-
-       if( (ret=digi_write_oob_command( port, buf, i, 1 )) != 0 )
-               dbg( "digi_set_termios: write oob failed, ret=%d", ret );
+       if ((ret = digi_write_oob_command(port, buf, i, 1)) != 0)
+               dbg("digi_set_termios: write oob failed, ret=%d", ret);
 
 }
 
 
-static void digi_break_ctl( struct usb_serial_port *port, int break_state )
+static void digi_break_ctl(struct usb_serial_port *port, int break_state)
 {
-
        unsigned char buf[4];
 
-
        buf[0] = DIGI_CMD_BREAK_CONTROL;
        buf[1] = 2;                             /* length */
        buf[2] = break_state ? 1 : 0;
        buf[3] = 0;                             /* pad */
-
-       digi_write_inb_command( port, buf, 4, 0 );
-
+       digi_write_inb_command(port, buf, 4, 0);
 }
 
 
-static int digi_tiocmget( struct usb_serial_port *port, struct file *file )
+static int digi_tiocmget(struct usb_serial_port *port, struct file *file)
 {
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned int val;
@@ -1185,15 +1113,15 @@ static int digi_tiocmget( struct usb_serial_port *port, struct file *file )
 
        dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
        val = priv->dp_modem_signals;
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
        return val;
 }
 
 
-static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
-       unsigned int set, unsigned int clear )
+static int digi_tiocmset(struct usb_serial_port *port, struct file *file,
+       unsigned int set, unsigned int clear)
 {
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned int val;
@@ -1201,41 +1129,34 @@ static int digi_tiocmset( struct usb_serial_port *port, struct file *file,
 
        dbg("%s: TOP: port=%d", __FUNCTION__, priv->dp_port_num);
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
        val = (priv->dp_modem_signals & ~clear) | set;
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-       return digi_set_modem_signals( port, val, 1 );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       return digi_set_modem_signals(port, val, 1);
 }
 
 
-static int digi_ioctl( struct usb_serial_port *port, struct file *file,
-       unsigned int cmd, unsigned long arg )
+static int digi_ioctl(struct usb_serial_port *port, struct file *file,
+       unsigned int cmd, unsigned long arg)
 {
-
        struct digi_port *priv = usb_get_serial_port_data(port);
-
-dbg( "digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd );
+       dbg("digi_ioctl: TOP: port=%d, cmd=0x%x", priv->dp_port_num, cmd);
 
        switch (cmd) {
-
        case TIOCMIWAIT:
                /* wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)*/
                /* TODO */
-               return( 0 );
-
+               return 0;
        case TIOCGICOUNT:
                /* return count of modemline transitions */
                /* TODO */
                return 0;
-
        }
-
-       return( -ENOIOCTLCMD );
+       return -ENOIOCTLCMD;
 
 }
 
-
-static int digi_write( struct usb_serial_port *port, const unsigned char *buf, int count )
+static int digi_write(struct usb_serial_port *port, const unsigned char *buf, int count)
 {
 
        int ret,data_len,new_len;
@@ -1243,35 +1164,29 @@ static int digi_write( struct usb_serial_port *port, const unsigned char *buf, i
        unsigned char *data = port->write_urb->transfer_buffer;
        unsigned long flags = 0;
 
-
-dbg( "digi_write: TOP: port=%d, count=%d, in_interrupt=%ld",
-priv->dp_port_num, count, in_interrupt() );
+       dbg("digi_write: TOP: port=%d, count=%d, in_interrupt=%ld",
+               priv->dp_port_num, count, in_interrupt());
 
        /* copy user data (which can sleep) before getting spin lock */
-       count = min( count, port->bulk_out_size-2 );
-       count = min( 64, count);
+       count = min(count, port->bulk_out_size-2);
+       count = min(64, count);
 
        /* be sure only one write proceeds at a time */
        /* there are races on the port private buffer */
        /* and races to check write_urb->status */
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
 
        /* wait for urb status clear to submit another urb */
-       if( port->write_urb->status == -EINPROGRESS
-       || priv->dp_write_urb_in_use ) {
-
+       if (port->write_urb->status == -EINPROGRESS || priv->dp_write_urb_in_use) {
                /* buffer data if count is 1 (probably put_char) if possible */
-               if( count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE ) {
+               if (count == 1 && priv->dp_out_buf_len < DIGI_OUT_BUF_SIZE) {
                        priv->dp_out_buf[priv->dp_out_buf_len++] = *buf;
                        new_len = 1;
                } else {
                        new_len = 0;
                }
-
-               spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
-               return( new_len );
-
+               spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+               return new_len;
        }
 
        /* allow space for any buffered data and for new data, up to */
@@ -1279,9 +1194,9 @@ priv->dp_port_num, count, in_interrupt() );
        new_len = min(count, port->bulk_out_size-2-priv->dp_out_buf_len);
        data_len = new_len + priv->dp_out_buf_len;
 
-       if( data_len == 0 ) {
-               spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-               return( 0 );
+       if (data_len == 0) {
+               spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+               return 0;
        }
 
        port->write_urb->transfer_buffer_length = data_len+2;
@@ -1291,32 +1206,29 @@ priv->dp_port_num, count, in_interrupt() );
        *data++ = data_len;
 
        /* copy in buffered data first */
-       memcpy( data, priv->dp_out_buf, priv->dp_out_buf_len );
+       memcpy(data, priv->dp_out_buf, priv->dp_out_buf_len);
        data += priv->dp_out_buf_len;
 
        /* copy in new data */
-       memcpy( data, buf, new_len );
+       memcpy(data, buf, new_len);
 
-       if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
+       if ((ret = usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0) {
                priv->dp_write_urb_in_use = 1;
                ret = new_len;
                priv->dp_out_buf_len = 0;
        }
 
        /* return length of new data written, or error */
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-       if( ret < 0 ) {
-               err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
-                       ret, priv->dp_port_num );
-       }
-
-dbg( "digi_write: returning %d", ret );
-       return( ret );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       if (ret < 0)
+               err("%s: usb_submit_urb failed, ret=%d, port=%d",
+                       __FUNCTION__, ret, priv->dp_port_num);
+       dbg("digi_write: returning %d", ret);
+       return ret;
 
 } 
 
-
-static void digi_write_bulk_callback( struct urb *urb )
+static void digi_write_bulk_callback(struct urb *urb)
 {
 
        struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
@@ -1326,153 +1238,136 @@ static void digi_write_bulk_callback( struct urb *urb )
        int ret = 0;
        int status = urb->status;
 
-
-       dbg("digi_write_bulk_callback: TOP, urb status=%d", status);
+       dbg("digi_write_bulk_callback: TOP, urb->status=%d", status);
 
        /* port and serial sanity check */
-       if( port == NULL || (priv=usb_get_serial_port_data(port)) == NULL ) {
+       if (port == NULL || (priv=usb_get_serial_port_data(port)) == NULL) {
                err("%s: port or port->private is NULL, status=%d",
                    __FUNCTION__, status);
                return;
        }
        serial = port->serial;
-       if( serial == NULL || (serial_priv=usb_get_serial_data(serial)) == NULL ) {
+       if (serial == NULL || (serial_priv=usb_get_serial_data(serial)) == NULL) {
                err("%s: serial or serial->private is NULL, status=%d",
                    __FUNCTION__, status);
                return;
        }
 
        /* handle oob callback */
-       if( priv->dp_port_num == serial_priv->ds_oob_port_num ) {
-               dbg( "digi_write_bulk_callback: oob callback" );
-               spin_lock( &priv->dp_port_lock );
+       if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
+               dbg("digi_write_bulk_callback: oob callback");
+               spin_lock(&priv->dp_port_lock);
                priv->dp_write_urb_in_use = 0;
-               wake_up_interruptible( &port->write_wait );
-               spin_unlock( &priv->dp_port_lock );
+               wake_up_interruptible(&port->write_wait);
+               spin_unlock(&priv->dp_port_lock);
                return;
        }
 
        /* try to send any buffered data on this port, if it is open */
-       spin_lock( &priv->dp_port_lock );
+       spin_lock(&priv->dp_port_lock);
        priv->dp_write_urb_in_use = 0;
-       if( port->open_count && port->write_urb->status != -EINPROGRESS
-       && priv->dp_out_buf_len > 0 ) {
-
+       if (port->open_count && port->write_urb->status != -EINPROGRESS
+           && priv->dp_out_buf_len > 0) {
                *((unsigned char *)(port->write_urb->transfer_buffer))
                        = (unsigned char)DIGI_CMD_SEND_DATA;
                *((unsigned char *)(port->write_urb->transfer_buffer)+1)
                        = (unsigned char)priv->dp_out_buf_len;
-
-               port->write_urb->transfer_buffer_length
-                       = priv->dp_out_buf_len+2;
+               port->write_urb->transfer_buffer_length = priv->dp_out_buf_len+2;
                port->write_urb->dev = serial->dev;
-
-               memcpy( port->write_urb->transfer_buffer+2, priv->dp_out_buf,
-                       priv->dp_out_buf_len );
-
-               if( (ret=usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0 ) {
+               memcpy(port->write_urb->transfer_buffer+2, priv->dp_out_buf,
+                       priv->dp_out_buf_len);
+               if ((ret = usb_submit_urb(port->write_urb, GFP_ATOMIC)) == 0) {
                        priv->dp_write_urb_in_use = 1;
                        priv->dp_out_buf_len = 0;
                }
-
        }
-
        /* wake up processes sleeping on writes immediately */
-       digi_wakeup_write( port );
-
+       digi_wakeup_write(port);
        /* also queue up a wakeup at scheduler time, in case we */
        /* lost the race in write_chan(). */
        schedule_work(&priv->dp_wakeup_work);
 
-       spin_unlock( &priv->dp_port_lock );
-
-       if( ret ) {
-               err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
-                       ret, priv->dp_port_num );
-       }
-
+       spin_unlock(&priv->dp_port_lock);
+       if (ret)
+               err("%s: usb_submit_urb failed, ret=%d, port=%d",
+                       __FUNCTION__, ret, priv->dp_port_num);
 }
 
-
-static int digi_write_room( struct usb_serial_port *port )
+static int digi_write_room(struct usb_serial_port *port)
 {
 
        int room;
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned long flags = 0;
 
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
-
-       if( port->write_urb->status == -EINPROGRESS
-       || priv->dp_write_urb_in_use )
+       if (port->write_urb->status == -EINPROGRESS || priv->dp_write_urb_in_use)
                room = 0;
        else
                room = port->bulk_out_size - 2 - priv->dp_out_buf_len;
 
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
-dbg( "digi_write_room: port=%d, room=%d", priv->dp_port_num, room );
-       return( room );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       dbg("digi_write_room: port=%d, room=%d", priv->dp_port_num, room);
+       return room;
 
 }
 
-
-static int digi_chars_in_buffer( struct usb_serial_port *port )
+static int digi_chars_in_buffer(struct usb_serial_port *port)
 {
 
        struct digi_port *priv = usb_get_serial_port_data(port);
 
 
-       if( port->write_urb->status == -EINPROGRESS
-       || priv->dp_write_urb_in_use ) {
-dbg( "digi_chars_in_buffer: port=%d, chars=%d", priv->dp_port_num, port->bulk_out_size - 2 );
-               /* return( port->bulk_out_size - 2 ); */
-               return( 256 );
+       if (port->write_urb->status == -EINPROGRESS
+           || priv->dp_write_urb_in_use) {
+               dbg("digi_chars_in_buffer: port=%d, chars=%d",
+                       priv->dp_port_num, port->bulk_out_size - 2);
+               /* return(port->bulk_out_size - 2); */
+               return 256;
        } else {
-dbg( "digi_chars_in_buffer: port=%d, chars=%d", priv->dp_port_num, priv->dp_out_buf_len );
-               return( priv->dp_out_buf_len );
+               dbg("digi_chars_in_buffer: port=%d, chars=%d",
+                       priv->dp_port_num, priv->dp_out_buf_len);
+               return priv->dp_out_buf_len;
        }
 
 }
 
 
-static int digi_open( struct usb_serial_port *port, struct file *filp )
+static int digi_open(struct usb_serial_port *port, struct file *filp)
 {
-
        int ret;
        unsigned char buf[32];
        struct digi_port *priv = usb_get_serial_port_data(port);
        struct ktermios not_termios;
        unsigned long flags = 0;
 
-
-dbg( "digi_open: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_count );
+       dbg("digi_open: TOP: port=%d, open_count=%d",
+               priv->dp_port_num, port->open_count);
 
        /* be sure the device is started up */
-       if( digi_startup_device( port->serial ) != 0 )
-               return( -ENXIO );
+       if (digi_startup_device(port->serial) != 0)
+               return -ENXIO;
 
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
 
        /* don't wait on a close in progress for non-blocking opens */
-       if( priv->dp_in_close && (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0 ) {
-               spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-               return( -EAGAIN );
+       if (priv->dp_in_close && (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0) {
+               spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+               return -EAGAIN;
        }
 
        /* wait for a close in progress to finish */
-       while( priv->dp_in_close ) {
+       while(priv->dp_in_close) {
                cond_wait_interruptible_timeout_irqrestore(
                        &priv->dp_close_wait, DIGI_RETRY_TIMEOUT,
-                       &priv->dp_port_lock, flags );
-               if( signal_pending(current) ) {
-                       return( -EINTR );
-               }
-               spin_lock_irqsave( &priv->dp_port_lock, flags );
+                       &priv->dp_port_lock, flags);
+               if (signal_pending(current))
+                       return -EINTR;
+               spin_lock_irqsave(&priv->dp_port_lock, flags);
        }
 
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
  
        /* read modem signals automatically whenever they change */
        buf[0] = DIGI_CMD_READ_INPUT_SIGNALS;
@@ -1486,23 +1381,22 @@ dbg( "digi_open: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_cou
        buf[6] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
        buf[7] = 0;
 
-       if( (ret=digi_write_oob_command( port, buf, 8, 1 )) != 0 )
-               dbg( "digi_open: write oob failed, ret=%d", ret );
+       if ((ret = digi_write_oob_command(port, buf, 8, 1)) != 0)
+               dbg("digi_open: write oob failed, ret=%d", ret);
 
        /* set termios settings */
        not_termios.c_cflag = ~port->tty->termios->c_cflag;
        not_termios.c_iflag = ~port->tty->termios->c_iflag;
-       digi_set_termios( port, &not_termios );
+       digi_set_termios(port, &not_termios);
 
        /* set DTR and RTS */
-       digi_set_modem_signals( port, TIOCM_DTR|TIOCM_RTS, 1 );
-
-       return( 0 );
+       digi_set_modem_signals(port, TIOCM_DTR|TIOCM_RTS, 1);
 
+       return 0;
 }
 
 
-static void digi_close( struct usb_serial_port *port, struct file *filp )
+static void digi_close(struct usb_serial_port *port, struct file *filp)
 {
        DEFINE_WAIT(wait);
        int ret;
@@ -1511,40 +1405,37 @@ static void digi_close( struct usb_serial_port *port, struct file *filp )
        struct digi_port *priv = usb_get_serial_port_data(port);
        unsigned long flags = 0;
 
-
-dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_count );
-
+       dbg("digi_close: TOP: port=%d, open_count=%d",
+               priv->dp_port_num, port->open_count);
 
        /* if disconnected, just clear flags */
        if (!usb_get_intfdata(port->serial->interface))
                goto exit;
 
        /* do cleanup only after final close on this port */
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
        priv->dp_in_close = 1;
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
 
        /* tell line discipline to process only XON/XOFF */
        tty->closing = 1;
 
        /* wait for output to drain */
-       if( (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0 ) {
-               tty_wait_until_sent( tty, DIGI_CLOSE_TIMEOUT );
-       }
+       if ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0)
+               tty_wait_until_sent(tty, DIGI_CLOSE_TIMEOUT);
 
        /* flush driver and line discipline buffers */
-       if( tty->driver->flush_buffer )
-               tty->driver->flush_buffer( tty );
+       if (tty->driver->flush_buffer)
+               tty->driver->flush_buffer(tty);
        tty_ldisc_flush(tty);
 
        if (port->serial->dev) {
                /* wait for transmit idle */
-               if( (filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0 ) {
-                       digi_transmit_idle( port, DIGI_CLOSE_TIMEOUT );
+               if ((filp->f_flags&(O_NDELAY|O_NONBLOCK)) == 0) {
+                       digi_transmit_idle(port, DIGI_CLOSE_TIMEOUT);
                }
-
                /* drop DTR and RTS */
-               digi_set_modem_signals( port, 0, 0 );
+               digi_set_modem_signals(port, 0, 0);
 
                /* disable input flow control */
                buf[0] = DIGI_CMD_SET_INPUT_FLOW_CONTROL;
@@ -1576,8 +1467,8 @@ dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_co
                buf[18] = DIGI_FLUSH_TX | DIGI_FLUSH_RX;
                buf[19] = 0;
 
-               if( (ret=digi_write_oob_command( port, buf, 20, 0 )) != 0 )
-                       dbg( "digi_close: write oob failed, ret=%d", ret );
+               if ((ret = digi_write_oob_command(port, buf, 20, 0)) != 0)
+                       dbg("digi_close: write oob failed, ret=%d", ret);
 
                /* wait for final commands on oob port to complete */
                prepare_to_wait(&priv->dp_flush_wait, &wait, TASK_INTERRUPTIBLE);
@@ -1587,17 +1478,14 @@ dbg( "digi_close: TOP: port=%d, open_count=%d", priv->dp_port_num, port->open_co
                /* shutdown any outstanding bulk writes */
                usb_kill_urb(port->write_urb);
        }
-
        tty->closing = 0;
-
 exit:
-       spin_lock_irqsave( &priv->dp_port_lock, flags );
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
        priv->dp_write_urb_in_use = 0;
        priv->dp_in_close = 0;
-       wake_up_interruptible( &priv->dp_close_wait );
-       spin_unlock_irqrestore( &priv->dp_port_lock, flags );
-
-dbg( "digi_close: done" );
+       wake_up_interruptible(&priv->dp_close_wait);
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       dbg("digi_close: done");
 }
 
 
@@ -1608,155 +1496,136 @@ dbg( "digi_close: done" );
 *  urbs initialized.  Returns 0 if successful, non-zero error otherwise.
 */
 
-static int digi_startup_device( struct usb_serial *serial )
+static int digi_startup_device(struct usb_serial *serial)
 {
-
        int i,ret = 0;
        struct digi_serial *serial_priv = usb_get_serial_data(serial);
        struct usb_serial_port *port;
 
-
        /* be sure this happens exactly once */
-       spin_lock( &serial_priv->ds_serial_lock );
-       if( serial_priv->ds_device_started ) {
-               spin_unlock( &serial_priv->ds_serial_lock );
-               return( 0 );
+       spin_lock(&serial_priv->ds_serial_lock);
+       if (serial_priv->ds_device_started) {
+               spin_unlock(&serial_priv->ds_serial_lock);
+               return 0;
        }
        serial_priv->ds_device_started = 1;
-       spin_unlock( &serial_priv->ds_serial_lock );
+       spin_unlock(&serial_priv->ds_serial_lock);
 
        /* start reading from each bulk in endpoint for the device */
        /* set USB_DISABLE_SPD flag for write bulk urbs */
-       for( i=0; i<serial->type->num_ports+1; i++ ) {
-
+       for (i = 0; i < serial->type->num_ports + 1; i++) {
                port = serial->port[i];
-
                port->write_urb->dev = port->serial->dev;
-
-               if( (ret=usb_submit_urb(port->read_urb, GFP_KERNEL)) != 0 ) {
-                       err("%s: usb_submit_urb failed, ret=%d, port=%d", __FUNCTION__,
-                       ret, i );
+               if ((ret = usb_submit_urb(port->read_urb, GFP_KERNEL)) != 0) {
+                       err("%s: usb_submit_urb failed, ret=%d, port=%d",
+                                       __FUNCTION__, ret, i);
                        break;
                }
-
        }
-
-       return( ret );
-
+       return ret;
 }
 
 
-static int digi_startup( struct usb_serial *serial )
+static int digi_startup(struct usb_serial *serial)
 {
 
        int i;
        struct digi_port *priv;
        struct digi_serial *serial_priv;
 
-
-dbg( "digi_startup: TOP" );
+       dbg("digi_startup: TOP");
 
        /* allocate the private data structures for all ports */
        /* number of regular ports + 1 for the out-of-band port */
-       for( i=0; i<serial->type->num_ports+1; i++ ) {
-
+       for(i = 0; i < serial->type->num_ports + 1; i++) {
                /* allocate port private structure */
-               priv = kmalloc( sizeof(struct digi_port),
-                       GFP_KERNEL );
-               if( priv == (struct digi_port *)0 ) {
-                       while( --i >= 0 )
-                               kfree( usb_get_serial_port_data(serial->port[i]) );
-                       return( 1 );                    /* error */
+               priv = kmalloc(sizeof(struct digi_port), GFP_KERNEL);
+               if (priv == NULL) {
+                       while (--i >= 0)
+                               kfree(usb_get_serial_port_data(serial->port[i]));
+                       return 1;                       /* error */
                }
 
                /* initialize port private structure */
-               spin_lock_init( &priv->dp_port_lock );
+               spin_lock_init(&priv->dp_port_lock);
                priv->dp_port_num = i;
                priv->dp_out_buf_len = 0;
                priv->dp_write_urb_in_use = 0;
                priv->dp_modem_signals = 0;
-               init_waitqueue_head( &priv->dp_modem_change_wait );
+               init_waitqueue_head(&priv->dp_modem_change_wait);
                priv->dp_transmit_idle = 0;
-               init_waitqueue_head( &priv->dp_transmit_idle_wait );
+               init_waitqueue_head(&priv->dp_transmit_idle_wait);
                priv->dp_throttled = 0;
                priv->dp_throttle_restart = 0;
-               init_waitqueue_head( &priv->dp_flush_wait );
+               init_waitqueue_head(&priv->dp_flush_wait);
                priv->dp_in_close = 0;
-               init_waitqueue_head( &priv->dp_close_wait );
+               init_waitqueue_head(&priv->dp_close_wait);
                INIT_WORK(&priv->dp_wakeup_work, digi_wakeup_write_lock);
                priv->dp_port = serial->port[i];
-
                /* initialize write wait queue for this port */
-               init_waitqueue_head( &serial->port[i]->write_wait );
+               init_waitqueue_head(&serial->port[i]->write_wait);
 
                usb_set_serial_port_data(serial->port[i], priv);
        }
 
        /* allocate serial private structure */
-       serial_priv = kmalloc( sizeof(struct digi_serial),
-               GFP_KERNEL );
-       if( serial_priv == (struct digi_serial *)0 ) {
-               for( i=0; i<serial->type->num_ports+1; i++ )
-                       kfree( usb_get_serial_port_data(serial->port[i]) );
-               return( 1 );                    /* error */
+       serial_priv = kmalloc(sizeof(struct digi_serial), GFP_KERNEL);
+       if (serial_priv == NULL) {
+               for (i = 0; i < serial->type->num_ports + 1; i++)
+                       kfree(usb_get_serial_port_data(serial->port[i]));
+               return 1;                       /* error */
        }
 
        /* initialize serial private structure */
-       spin_lock_init( &serial_priv->ds_serial_lock );
+       spin_lock_init(&serial_priv->ds_serial_lock);
        serial_priv->ds_oob_port_num = serial->type->num_ports;
        serial_priv->ds_oob_port = serial->port[serial_priv->ds_oob_port_num];
        serial_priv->ds_device_started = 0;
        usb_set_serial_data(serial, serial_priv);
 
-       return( 0 );
-
+       return 0;
 }
 
 
-static void digi_shutdown( struct usb_serial *serial )
+static void digi_shutdown(struct usb_serial *serial)
 {
-
        int i;
-
-
-dbg( "digi_shutdown: TOP, in_interrupt()=%ld", in_interrupt() );
+       dbg("digi_shutdown: TOP, in_interrupt()=%ld", in_interrupt());
 
        /* stop reads and writes on all ports */
-       for( i=0; i<serial->type->num_ports+1; i++ ) {
+       for (i = 0; i < serial->type->num_ports + 1; i++) {
                usb_kill_urb(serial->port[i]->read_urb);
                usb_kill_urb(serial->port[i]->write_urb);
        }
 
        /* free the private data structures for all ports */
        /* number of regular ports + 1 for the out-of-band port */
-       for( i=0; i<serial->type->num_ports+1; i++ )
-               kfree( usb_get_serial_port_data(serial->port[i]) );
-       kfree( usb_get_serial_data(serial) );
+       for(i = 0; i < serial->type->num_ports + 1; i++)
+               kfree(usb_get_serial_port_data(serial->port[i]));
+       kfree(usb_get_serial_data(serial));
 }
 
 
-static void digi_read_bulk_callback( struct urb *urb )
+static void digi_read_bulk_callback(struct urb *urb)
 {
-
        struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
        struct digi_port *priv;
        struct digi_serial *serial_priv;
        int ret;
        int status = urb->status;
 
-
-dbg( "digi_read_bulk_callback: TOP" );
+       dbg("digi_read_bulk_callback: TOP");
 
        /* port sanity check, do not resubmit if port is not valid */
-       if( port == NULL || (priv=usb_get_serial_port_data(port)) == NULL ) {
+       if (port == NULL || (priv = usb_get_serial_port_data(port)) == NULL) {
                err("%s: port or port->private is NULL, status=%d",
                    __FUNCTION__, status);
                return;
        }
-       if( port->serial == NULL
-       || (serial_priv=usb_get_serial_data(port->serial)) == NULL ) {
+       if (port->serial == NULL ||
+               (serial_priv=usb_get_serial_data(port->serial)) == NULL) {
                err("%s: serial is bad or serial->private is NULL, status=%d",
-                   __FUNCTION__, status);
+                       __FUNCTION__, status);
                return;
        }
 
@@ -1768,24 +1637,23 @@ dbg( "digi_read_bulk_callback: TOP" );
        }
 
        /* handle oob or inb callback, do not resubmit if error */
-       if( priv->dp_port_num == serial_priv->ds_oob_port_num ) {
-               if( digi_read_oob_callback( urb ) != 0 )
+       if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
+               if (digi_read_oob_callback(urb) != 0)
                        return;
        } else {
-               if( digi_read_inb_callback( urb ) != 0 )
+               if (digi_read_inb_callback(urb) != 0)
                        return;
        }
 
        /* continue read */
        urb->dev = port->serial->dev;
-       if( (ret=usb_submit_urb(urb, GFP_ATOMIC)) != 0 ) {
-               err("%s: failed resubmitting urb, ret=%d, port=%d", __FUNCTION__,
-                       ret, priv->dp_port_num );
+       if ((ret = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {
+               err("%s: failed resubmitting urb, ret=%d, port=%d",
+                   __FUNCTION__, ret, priv->dp_port_num);
        }
 
 }
 
-
 /* 
 *  Digi Read INB Callback
 *
@@ -1796,7 +1664,7 @@ dbg( "digi_read_bulk_callback: TOP" );
 *  throttled, and -1 if the sanity checks failed.
 */
 
-static int digi_read_inb_callback( struct urb *urb )
+static int digi_read_inb_callback(struct urb *urb)
 {
 
        struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
@@ -1812,72 +1680,67 @@ static int digi_read_inb_callback( struct urb *urb )
 
        /* do not process callbacks on closed ports */
        /* but do continue the read chain */
-       if( port->open_count == 0 )
-               return( 0 );
+       if (port->open_count == 0)
+               return 0;
 
        /* short/multiple packet check */
-       if( urb->actual_length != len + 2 ) {
-               err("%s: INCOMPLETE OR MULTIPLE PACKET, urb status=%d, "
+       if (urb->actual_length != len + 2) {
+               err("%s: INCOMPLETE OR MULTIPLE PACKET, urb->status=%d, "
                    "port=%d, opcode=%d, len=%d, actual_length=%d, "
-                   "port_status=%d", __FUNCTION__, status, priv->dp_port_num,
+                   "status=%d", __FUNCTION__, status, priv->dp_port_num,
                    opcode, len, urb->actual_length, port_status);
-               return( -1 );
+               return -1;
        }
 
-       spin_lock( &priv->dp_port_lock );
+       spin_lock(&priv->dp_port_lock);
 
        /* check for throttle; if set, do not resubmit read urb */
        /* indicate the read chain needs to be restarted on unthrottle */
        throttled = priv->dp_throttled;
-       if( throttled )
+       if (throttled)
                priv->dp_throttle_restart = 1;
 
        /* receive data */
-       if( opcode == DIGI_CMD_RECEIVE_DATA ) {
-
+       if (opcode == DIGI_CMD_RECEIVE_DATA) {
                /* get flag from port_status */
                flag = 0;
 
                /* overrun is special, not associated with a char */
-               if (port_status & DIGI_OVERRUN_ERROR) {
-                       tty_insert_flip_char( tty, 0, TTY_OVERRUN );
-               }
+               if (port_status & DIGI_OVERRUN_ERROR)
+                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
 
                /* break takes precedence over parity, */
                /* which takes precedence over framing errors */
-               if (port_status & DIGI_BREAK_ERROR) {
+               if (port_status & DIGI_BREAK_ERROR)
                        flag = TTY_BREAK;
-               } else if (port_status & DIGI_PARITY_ERROR) {
+               else if (port_status & DIGI_PARITY_ERROR)
                        flag = TTY_PARITY;
-               } else if (port_status & DIGI_FRAMING_ERROR) {
+               else if (port_status & DIGI_FRAMING_ERROR)
                        flag = TTY_FRAME;
-               }
 
                /* data length is len-1 (one byte of len is port_status) */
                --len;
 
                len = tty_buffer_request_room(tty, len);
-               if( len > 0 ) {
+               if (len > 0) {
                        /* Hot path */
-                       if(flag == TTY_NORMAL)
+                       if (flag == TTY_NORMAL)
                                tty_insert_flip_string(tty, data, len);
                        else {
                                for(i = 0; i < len; i++)
                                        tty_insert_flip_char(tty, data[i], flag);
                        }
-                       tty_flip_buffer_push( tty );
+                       tty_flip_buffer_push(tty);
                }
        }
+       spin_unlock(&priv->dp_port_lock);
 
-       spin_unlock( &priv->dp_port_lock );
-
-       if( opcode == DIGI_CMD_RECEIVE_DISABLE ) {
-               dbg("%s: got RECEIVE_DISABLE", __FUNCTION__ );
-       } else if( opcode != DIGI_CMD_RECEIVE_DATA ) {
-               dbg("%s: unknown opcode: %d", __FUNCTION__, opcode );
-       }
+       if (opcode == DIGI_CMD_RECEIVE_DISABLE)
+               dbg("%s: got RECEIVE_DISABLE", __FUNCTION__);
+       else if (opcode != DIGI_CMD_RECEIVE_DATA)
+               dbg("%s: unknown opcode: %d", __FUNCTION__, opcode);
 
-       return( throttled ? 1 : 0 );
+       return(throttled ? 1 : 0);
 
 }
 
@@ -1891,7 +1754,7 @@ static int digi_read_inb_callback( struct urb *urb )
 *  -1 if the sanity checks failed.
 */
 
-static int digi_read_oob_callback( struct urb *urb )
+static int digi_read_oob_callback(struct urb *urb)
 {
 
        struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
@@ -1900,87 +1763,75 @@ static int digi_read_oob_callback( struct urb *urb )
        int opcode, line, status, val;
        int i;
 
-
-dbg( "digi_read_oob_callback: port=%d, len=%d", priv->dp_port_num,
-urb->actual_length );
+       dbg("digi_read_oob_callback: port=%d, len=%d",
+                       priv->dp_port_num, urb->actual_length);
 
        /* handle each oob command */
-       for( i=0; i<urb->actual_length-3; ) {
-
+       for(i = 0; i < urb->actual_length - 3;) {
                opcode = ((unsigned char *)urb->transfer_buffer)[i++];
                line = ((unsigned char *)urb->transfer_buffer)[i++];
                status = ((unsigned char *)urb->transfer_buffer)[i++];
                val = ((unsigned char *)urb->transfer_buffer)[i++];
 
-dbg( "digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d",
-opcode, line, status, val );
+               dbg("digi_read_oob_callback: opcode=%d, line=%d, status=%d, val=%d",
+                       opcode, line, status, val);
 
-               if( status != 0 || line >= serial->type->num_ports )
+               if (status != 0 || line >= serial->type->num_ports)
                        continue;
 
                port = serial->port[line];
 
-               if ((priv=usb_get_serial_port_data(port)) == NULL )
+               if ((priv=usb_get_serial_port_data(port)) == NULL)
                        return -1;
 
-               if( opcode == DIGI_CMD_READ_INPUT_SIGNALS ) {
-
-                       spin_lock( &priv->dp_port_lock );
-
+               if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
+                       spin_lock(&priv->dp_port_lock);
                        /* convert from digi flags to termiox flags */
-                       if( val & DIGI_READ_INPUT_SIGNALS_CTS ) {
+                       if (val & DIGI_READ_INPUT_SIGNALS_CTS) {
                                priv->dp_modem_signals |= TIOCM_CTS;
                                /* port must be open to use tty struct */
-                               ifport->open_count
-                               && port->tty->termios->c_cflag & CRTSCTS ) {
+                               if (port->open_count
+                                       && port->tty->termios->c_cflag & CRTSCTS) {
                                        port->tty->hw_stopped = 0;
-                                       digi_wakeup_write( port );
+                                       digi_wakeup_write(port);
                                }
                        } else {
                                priv->dp_modem_signals &= ~TIOCM_CTS;
                                /* port must be open to use tty struct */
-                               ifport->open_count
-                               && port->tty->termios->c_cflag & CRTSCTS ) {
+                               if (port->open_count
+                                       && port->tty->termios->c_cflag & CRTSCTS) {
                                        port->tty->hw_stopped = 1;
                                }
                        }
-                       if( val & DIGI_READ_INPUT_SIGNALS_DSR )
+                       if (val & DIGI_READ_INPUT_SIGNALS_DSR)
                                priv->dp_modem_signals |= TIOCM_DSR;
                        else
                                priv->dp_modem_signals &= ~TIOCM_DSR;
-                       if( val & DIGI_READ_INPUT_SIGNALS_RI )
+                       if (val & DIGI_READ_INPUT_SIGNALS_RI)
                                priv->dp_modem_signals |= TIOCM_RI;
                        else
                                priv->dp_modem_signals &= ~TIOCM_RI;
-                       if( val & DIGI_READ_INPUT_SIGNALS_DCD )
+                       if (val & DIGI_READ_INPUT_SIGNALS_DCD)
                                priv->dp_modem_signals |= TIOCM_CD;
                        else
                                priv->dp_modem_signals &= ~TIOCM_CD;
 
-                       wake_up_interruptible( &priv->dp_modem_change_wait );
-                       spin_unlock( &priv->dp_port_lock );
-
-               } else if( opcode == DIGI_CMD_TRANSMIT_IDLE ) {
-
-                       spin_lock( &priv->dp_port_lock );
+                       wake_up_interruptible(&priv->dp_modem_change_wait);
+                       spin_unlock(&priv->dp_port_lock);
+               } else if (opcode == DIGI_CMD_TRANSMIT_IDLE) {
+                       spin_lock(&priv->dp_port_lock);
                        priv->dp_transmit_idle = 1;
-                       wake_up_interruptible( &priv->dp_transmit_idle_wait );
-                       spin_unlock( &priv->dp_port_lock );
-
-               } else if( opcode == DIGI_CMD_IFLUSH_FIFO ) {
-
-                       wake_up_interruptible( &priv->dp_flush_wait );
-
+                       wake_up_interruptible(&priv->dp_transmit_idle_wait);
+                       spin_unlock(&priv->dp_port_lock);
+               } else if (opcode == DIGI_CMD_IFLUSH_FIFO) {
+                       wake_up_interruptible(&priv->dp_flush_wait);
                }
-
        }
-
-       return( 0 );
+       return 0;
 
 }
 
-
-static int __init digi_init (void)
+static int __init digi_init(void)
 {
        int retval;
        retval = usb_serial_register(&digi_acceleport_2_device);
@@ -2002,12 +1853,11 @@ failed_acceleport_2_device:
        return retval;
 }
 
-
 static void __exit digi_exit (void)
 {
-       usb_deregister (&digi_driver);
-       usb_serial_deregister (&digi_acceleport_2_device);
-       usb_serial_deregister (&digi_acceleport_4_device);
+       usb_deregister(&digi_driver);
+       usb_serial_deregister(&digi_acceleport_2_device);
+       usb_serial_deregister(&digi_acceleport_4_device);
 }
 
 
@@ -2015,8 +1865,8 @@ module_init(digi_init);
 module_exit(digi_exit);
 
 
-MODULE_AUTHOR( DRIVER_AUTHOR );
-MODULE_DESCRIPTION( DRIVER_DESC );
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
 MODULE_LICENSE("GPL");
 
 module_param(debug, bool, S_IRUGO | S_IWUSR);
index dd42f57089ffea3a97ee86357113079d00a972a9..2ecb1d2a034d0aa03dc08af168ae09a2f918efea 100644 (file)
@@ -2366,9 +2366,8 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa
        int status;
        unsigned char number = edge_port->port->number - edge_port->port->serial->minor;
 
-       if ((!edge_serial->is_epic) ||
-           ((edge_serial->is_epic) &&
-            (!edge_serial->epic_descriptor.Supports.IOSPSetBaudRate))) {
+       if (edge_serial->is_epic &&
+           !edge_serial->epic_descriptor.Supports.IOSPSetBaudRate) {
                dbg("SendCmdWriteBaudRate - NOT Setting baud rate for port = %d, baud = %d",
                    edge_port->port->number, baudRate);
                return 0;
@@ -2461,18 +2460,16 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r
 
        dbg("%s - write to %s register 0x%02x", (regNum == MCR) ? "MCR" : "LCR", __FUNCTION__, regValue);
 
-       if ((!edge_serial->is_epic) ||
-           ((edge_serial->is_epic) &&
-            (!edge_serial->epic_descriptor.Supports.IOSPWriteMCR) &&
-            (regNum == MCR))) {
+       if (edge_serial->is_epic &&
+           !edge_serial->epic_descriptor.Supports.IOSPWriteMCR &&
+           regNum == MCR) {
                dbg("SendCmdWriteUartReg - Not writing to MCR Register");
                return 0;
        }
 
-       if ((!edge_serial->is_epic) ||
-           ((edge_serial->is_epic) &&
-            (!edge_serial->epic_descriptor.Supports.IOSPWriteLCR) &&
-            (regNum == LCR))) {
+       if (edge_serial->is_epic &&
+           !edge_serial->epic_descriptor.Supports.IOSPWriteLCR &&
+           regNum == LCR) {
                dbg ("SendCmdWriteUartReg - Not writing to LCR Register");
                return 0;
        }
index 2a3fabcf5186aa2179b88f4cc64acaa90fba1411..e08c9bb403d88544709108174ce610b51962a340 100644 (file)
@@ -184,21 +184,21 @@ struct mct_u232_private {
  * we do not know how to support. We ignore them for the moment.
  * XXX Rate-limit the error message, it's user triggerable.
  */
-static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value)
+static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value)
 {
        if (le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_SITECOM_PID
          || le16_to_cpu(serial->dev->descriptor.idProduct) == MCT_U232_BELKIN_F5U109_PID) {
                switch (value) {
-               case    B300: return 0x01;
-               case    B600: return 0x02; /* this one not tested */
-               case   B1200: return 0x03;
-               case   B2400: return 0x04;
-               case   B4800: return 0x06;
-               case   B9600: return 0x08;
-               case  B19200: return 0x09;
-               case  B38400: return 0x0a;
-               case  B57600: return 0x0b;
-               case B115200: return 0x0c;
+               case    300: return 0x01;
+               case    600: return 0x02; /* this one not tested */
+               case   1200: return 0x03;
+               case   2400: return 0x04;
+               case   4800: return 0x06;
+               case   9600: return 0x08;
+               case  19200: return 0x09;
+               case  38400: return 0x0a;
+               case  57600: return 0x0b;
+               case 115200: return 0x0c;
                default:
                        err("MCT USB-RS232: unsupported baudrate request 0x%x,"
                            " using default of B9600", value);
@@ -206,27 +206,27 @@ static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value)
                }
        } else {
                switch (value) {
-               case    B300: value =     300; break;
-               case    B600: value =     600; break;
-               case   B1200: value =    1200; break;
-               case   B2400: value =    2400; break;
-               case   B4800: value =    4800; break;
-               case   B9600: value =    9600; break;
-               case  B19200: value =   19200; break;
-               case  B38400: value =   38400; break;
-               case  B57600: value =   57600; break;
-               case B115200: value =  115200; break;
-               default:
-                       err("MCT USB-RS232: unsupported baudrate request 0x%x,"
-                           " using default of B9600", value);
-                       value = 9600;
+                       case 300: break;
+                       case 600: break;
+                       case 1200: break;
+                       case 2400: break;
+                       case 4800: break;
+                       case 9600: break;
+                       case 19200: break;
+                       case 38400: break;
+                       case 57600: break;
+                       case 115200: break;
+                       default:
+                               err("MCT USB-RS232: unsupported baudrate request 0x%x,"
+                                   " using default of B9600", value);
+                               value = 9600;
                }
                return 115200/value;
        }
 }
 
 static int mct_u232_set_baud_rate(struct usb_serial *serial, struct usb_serial_port *port,
-                                 int value)
+                                 speed_t value)
 {
        __le32 divisor;
         int rc;
@@ -634,7 +634,7 @@ static void mct_u232_set_termios (struct usb_serial_port *port,
                mct_u232_set_modem_ctrl(serial, control_state);
        }
 
-       mct_u232_set_baud_rate(serial, port, cflag & CBAUD);
+       mct_u232_set_baud_rate(serial, port, tty_get_baud_rate(port->tty));
 
        if ((cflag & CBAUD) == B0 ) {
                dbg("%s: baud is B0", __FUNCTION__);
index a61bac8f224aded9acfca8b794d385c6bcf79811..aae10c8174d6bb0fd51abd7fb397999bce64f237 100644 (file)
@@ -79,7 +79,7 @@
  * and "Intel solution". They are the regular MCT and "Sitecom" for us.
  * This is pointless to document in the header, see the code for the bits.
  */
-static int mct_u232_calculate_baud_rate(struct usb_serial *serial, int value);
+static int mct_u232_calculate_baud_rate(struct usb_serial *serial, speed_t value);
 
 /*
  * Line Control Register (LCR)
index 0794ccdebfd402a94fd4b71c8f661901dc873e56..0bb8de4cc5241a2b4071095b7c6b3b57049fe357 100644 (file)
@@ -45,7 +45,7 @@ enum devicetype {
        DEVICE_INSTALLER =      2,
 };
 
-int sierra_set_power_state(struct usb_device *udev, __u16 swiState)
+static int sierra_set_power_state(struct usb_device *udev, __u16 swiState)
 {
        int result;
        dev_dbg(&udev->dev, "%s", "SET POWER STATE");
@@ -60,7 +60,7 @@ int sierra_set_power_state(struct usb_device *udev, __u16 swiState)
        return result;
 }
 
-int sierra_set_ms_mode(struct usb_device *udev, __u16 eSocMode)
+static int sierra_set_ms_mode(struct usb_device *udev, __u16 eSocMode)
 {
        int result;
        dev_dbg(&udev->dev, "%s", "DEVICE MODE SWITCH");
@@ -75,7 +75,8 @@ int sierra_set_ms_mode(struct usb_device *udev, __u16 eSocMode)
        return result;
 }
 
-int sierra_probe(struct usb_interface *iface, const struct usb_device_id *id)
+static int sierra_probe(struct usb_interface *iface,
+                       const struct usb_device_id *id)
 {
        int result;
        struct usb_device *udev;
index a3665659d13b32636914368429c0be0d6998e35d..9bf01a5efc84adaaec0145ca24076421b64db558 100644 (file)
@@ -60,19 +60,19 @@ static struct usb_driver usb_serial_driver = {
 
 static int debug;
 static struct usb_serial *serial_table[SERIAL_TTY_MINORS];     /* initially all NULL */
-static spinlock_t table_lock;
+static DEFINE_MUTEX(table_lock);
 static LIST_HEAD(usb_serial_driver_list);
 
 struct usb_serial *usb_serial_get_by_index(unsigned index)
 {
        struct usb_serial *serial;
 
-       spin_lock(&table_lock);
+       mutex_lock(&table_lock);
        serial = serial_table[index];
 
        if (serial)
                kref_get(&serial->kref);
-       spin_unlock(&table_lock);
+       mutex_unlock(&table_lock);
        return serial;
 }
 
@@ -84,7 +84,7 @@ static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_po
        dbg("%s %d", __FUNCTION__, num_ports);
 
        *minor = 0;
-       spin_lock(&table_lock);
+       mutex_lock(&table_lock);
        for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
                if (serial_table[i])
                        continue;
@@ -106,10 +106,10 @@ static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_po
                        serial_table[i] = serial;
                        serial->port[j++]->number = i;
                }
-               spin_unlock(&table_lock);
+               mutex_unlock(&table_lock);
                return serial;
        }
-       spin_unlock(&table_lock);
+       mutex_unlock(&table_lock);
        return NULL;
 }
 
@@ -172,9 +172,9 @@ static void destroy_serial(struct kref *kref)
 
 void usb_serial_put(struct usb_serial *serial)
 {
-       spin_lock(&table_lock);
+       mutex_lock(&table_lock);
        kref_put(&serial->kref, destroy_serial);
-       spin_unlock(&table_lock);
+       mutex_unlock(&table_lock);
 }
 
 /*****************************************************************************
@@ -1077,16 +1077,17 @@ int usb_serial_suspend(struct usb_interface *intf, pm_message_t message)
        struct usb_serial_port *port;
        int i, r = 0;
 
-       if (serial) {
-               for (i = 0; i < serial->num_ports; ++i) {
-                       port = serial->port[i];
-                       if (port)
-                               kill_traffic(port);
-               }
+       if (!serial) /* device has been disconnected */
+               return 0;
+
+       for (i = 0; i < serial->num_ports; ++i) {
+               port = serial->port[i];
+               if (port)
+                       kill_traffic(port);
        }
 
        if (serial->type->suspend)
-               serial->type->suspend(serial, message);
+               r = serial->type->suspend(serial, message);
 
        return r;
 }
@@ -1128,7 +1129,6 @@ static int __init usb_serial_init(void)
                return -ENOMEM;
 
        /* Initialize our global data */
-       spin_lock_init(&table_lock);
        for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
                serial_table[i] = NULL;
        }
index a624e72f81dc39a41bf79236d0f24707251b7c41..d8d008d4294643419b52c798eea81fd941fdc1f9 100644 (file)
@@ -320,6 +320,13 @@ UNUSUAL_DEV(  0x04b0, 0x0401, 0x0200, 0x0200,
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_FIX_CAPACITY),
 
+/* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */
+UNUSUAL_DEV(  0x04b0, 0x0409, 0x0100, 0x0100,
+               "NIKON",
+               "NIKON DSC D50",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY),
+
 /* Reported by Andreas Bockhold <andreas@bockionline.de> */
 UNUSUAL_DEV(  0x04b0, 0x0405, 0x0100, 0x0100,
                "NIKON",
@@ -1357,6 +1364,20 @@ UNUSUAL_DEV(  0x0f19, 0x0105, 0x0100, 0x0100,
                US_SC_DEVICE, US_PR_DEVICE, NULL,
                US_FL_IGNORE_RESIDUE ),
 
+/* Jeremy Katz <katzj@redhat.com>:
+ * The Blackberry Pearl can run in two modes; a usb-storage only mode
+ * and a mode that allows access via mass storage and to its database.
+ * The berry_charge module will set the device to dual mode and thus we
+ * should ignore its native mode if that module is built
+ */
+#ifdef CONFIG_USB_BERRY_CHARGE
+UNUSUAL_DEV(  0x0fca, 0x0006, 0x0001, 0x0001,
+               "RIM",
+               "Blackberry Pearl",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_IGNORE_DEVICE ),
+#endif
+
 /* Reported by Michael Stattmann <michael@stattmann.com> */
 UNUSUAL_DEV(  0x0fce, 0xd008, 0x0000, 0x0000,
                "Sony Ericsson",
index b0b2e40bbd9f8c07b8f37ab71e85d6dae4314fac..718b9f83736e51f81bfca1db17d3dc452435ea74 100644 (file)
@@ -279,90 +279,91 @@ static void __devinit bw2_do_default_mode(struct bw2_par *par,
        }
 }
 
-struct all_info {
-       struct fb_info info;
-       struct bw2_par par;
-};
-
-static int __devinit bw2_init_one(struct of_device *op)
+static int __devinit bw2_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct bw2_par *par;
        int linebytes, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct bw2_par), &op->dev);
 
-       spin_lock_init(&all->par.lock);
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       all->par.physbase = op->resource[0].start;
-       all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
+       spin_lock_init(&par->lock);
 
-       sbusfb_fill_var(&all->info.var, dp->node, 1);
+       par->physbase = op->resource[0].start;
+       par->which_io = op->resource[0].flags & IORESOURCE_BITS;
+
+       sbusfb_fill_var(&info->var, dp->node, 1);
        linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
+                                         info->var.xres);
 
-       all->info.var.red.length = all->info.var.green.length =
-               all->info.var.blue.length = all->info.var.bits_per_pixel;
-       all->info.var.red.offset = all->info.var.green.offset =
-               all->info.var.blue.offset = 0;
+       info->var.red.length = info->var.green.length =
+               info->var.blue.length = info->var.bits_per_pixel;
+       info->var.red.offset = info->var.green.offset =
+               info->var.blue.offset = 0;
 
-       all->par.regs = of_ioremap(&op->resource[0], BWTWO_REGISTER_OFFSET,
-                                  sizeof(struct bw2_regs), "bw2 regs");
+       par->regs = of_ioremap(&op->resource[0], BWTWO_REGISTER_OFFSET,
+                              sizeof(struct bw2_regs), "bw2 regs");
+       if (!par->regs)
+               goto out_release_fb;
 
        if (!of_find_property(dp, "width", NULL))
-               bw2_do_default_mode(&all->par, &all->info, &linebytes);
+               bw2_do_default_mode(par, info, &linebytes);
 
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
 
-       all->info.flags = FBINFO_DEFAULT;
-       all->info.fbops = &bw2_ops;
+       info->flags = FBINFO_DEFAULT;
+       info->fbops = &bw2_ops;
 
-       all->info.screen_base =
-               of_ioremap(&op->resource[0], 0, all->par.fbsize, "bw2 ram");
-       all->info.par = &all->par;
+       info->screen_base = of_ioremap(&op->resource[0], 0,
+                                      par->fbsize, "bw2 ram");
+       if (!info->screen_base)
+               goto out_unmap_regs;
 
-       bw2_blank(0, &all->info);
+       bw2_blank(0, info);
 
-       bw2_init_fix(&all->info, linebytes);
+       bw2_init_fix(info, linebytes);
 
-       err= register_framebuffer(&all->info);
-       if (err < 0) {
-               of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct bw2_regs));
-               of_iounmap(&op->resource[0],
-                          all->info.screen_base, all->par.fbsize);
-               kfree(all);
-               return err;
-       }
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_unmap_screen;
 
-       dev_set_drvdata(&op->dev, all);
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: bwtwo at %lx:%lx\n",
-              dp->full_name,
-              all->par.which_io, all->par.physbase);
+              dp->full_name, par->which_io, par->physbase);
 
        return 0;
-}
 
-static int __devinit bw2_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_unmap_screen:
+       of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
+
+out_unmap_regs:
+       of_iounmap(&op->resource[0], par->regs, sizeof(struct bw2_regs));
+
+out_release_fb:
+       framebuffer_release(info);
 
-       return bw2_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit bw2_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct bw2_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
+       unregister_framebuffer(info);
 
-       of_iounmap(&op->resource[0], all->par.regs, sizeof(struct bw2_regs));
-       of_iounmap(&op->resource[0], all->info.screen_base, all->par.fbsize);
+       of_iounmap(&op->resource[0], par->regs, sizeof(struct bw2_regs));
+       of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index b071bb632b9748c02eff25b178d0e61708f8ac70..41f6dbf61be7108108b0e174400fc7c58fb77199 100644 (file)
@@ -448,81 +448,79 @@ static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __devinitdata = {
        { .size = 0 }
 };
 
-struct all_info {
-       struct fb_info info;
-       struct cg14_par par;
-};
-
-static void cg14_unmap_regs(struct of_device *op, struct all_info *all)
+static void cg14_unmap_regs(struct of_device *op, struct fb_info *info,
+                           struct cg14_par *par)
 {
-       if (all->par.regs)
+       if (par->regs)
                of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct cg14_regs));
-       if (all->par.clut)
+                          par->regs, sizeof(struct cg14_regs));
+       if (par->clut)
                of_iounmap(&op->resource[0],
-                          all->par.clut, sizeof(struct cg14_clut));
-       if (all->par.cursor)
+                          par->clut, sizeof(struct cg14_clut));
+       if (par->cursor)
                of_iounmap(&op->resource[0],
-                          all->par.cursor, sizeof(struct cg14_cursor));
-       if (all->info.screen_base)
+                          par->cursor, sizeof(struct cg14_cursor));
+       if (info->screen_base)
                of_iounmap(&op->resource[1],
-                          all->info.screen_base, all->par.fbsize);
+                          info->screen_base, par->fbsize);
 }
 
-static int __devinit cg14_init_one(struct of_device *op)
+static int __devinit cg14_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct cg14_par *par;
        int is_8mb, linebytes, i, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct cg14_par), &op->dev);
+
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       spin_lock_init(&all->par.lock);
+       spin_lock_init(&par->lock);
 
-       sbusfb_fill_var(&all->info.var, dp->node, 8);
-       all->info.var.red.length = 8;
-       all->info.var.green.length = 8;
-       all->info.var.blue.length = 8;
+       sbusfb_fill_var(&info->var, dp->node, 8);
+       info->var.red.length = 8;
+       info->var.green.length = 8;
+       info->var.blue.length = 8;
 
        linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
+                                         info->var.xres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
 
        if (!strcmp(dp->parent->name, "sbus") ||
            !strcmp(dp->parent->name, "sbi")) {
-               all->par.physbase = op->resource[0].start;
-               all->par.iospace = op->resource[0].flags & IORESOURCE_BITS;
+               par->physbase = op->resource[0].start;
+               par->iospace = op->resource[0].flags & IORESOURCE_BITS;
        } else {
-               all->par.physbase = op->resource[1].start;
-               all->par.iospace = op->resource[0].flags & IORESOURCE_BITS;
+               par->physbase = op->resource[1].start;
+               par->iospace = op->resource[0].flags & IORESOURCE_BITS;
        }
 
-       all->par.regs = of_ioremap(&op->resource[0], 0,
-                                  sizeof(struct cg14_regs), "cg14 regs");
-       all->par.clut = of_ioremap(&op->resource[0], CG14_CLUT1,
-                                  sizeof(struct cg14_clut), "cg14 clut");
-       all->par.cursor = of_ioremap(&op->resource[0], CG14_CURSORREGS,
-                                  sizeof(struct cg14_cursor), "cg14 cursor");
+       par->regs = of_ioremap(&op->resource[0], 0,
+                              sizeof(struct cg14_regs), "cg14 regs");
+       par->clut = of_ioremap(&op->resource[0], CG14_CLUT1,
+                              sizeof(struct cg14_clut), "cg14 clut");
+       par->cursor = of_ioremap(&op->resource[0], CG14_CURSORREGS,
+                                sizeof(struct cg14_cursor), "cg14 cursor");
 
-       all->info.screen_base = of_ioremap(&op->resource[1], 0,
-                                          all->par.fbsize, "cg14 ram");
+       info->screen_base = of_ioremap(&op->resource[1], 0,
+                                      par->fbsize, "cg14 ram");
 
-       if (!all->par.regs || !all->par.clut || !all->par.cursor ||
-           !all->info.screen_base)
-               cg14_unmap_regs(op, all);
+       if (!par->regs || !par->clut || !par->cursor || !info->screen_base)
+               goto out_unmap_regs;
 
        is_8mb = (((op->resource[1].end - op->resource[1].start) + 1) ==
                  (8 * 1024 * 1024));
 
-       BUILD_BUG_ON(sizeof(all->par.mmap_map) != sizeof(__cg14_mmap_map));
+       BUILD_BUG_ON(sizeof(par->mmap_map) != sizeof(__cg14_mmap_map));
                
-       memcpy(&all->par.mmap_map, &__cg14_mmap_map,
-              sizeof(all->par.mmap_map));
+       memcpy(&par->mmap_map, &__cg14_mmap_map, sizeof(par->mmap_map));
 
        for (i = 0; i < CG14_MMAP_ENTRIES; i++) {
-               struct sbus_mmap_map *map = &all->par.mmap_map[i];
+               struct sbus_mmap_map *map = &par->mmap_map[i];
 
                if (!map->size)
                        break;
@@ -536,59 +534,55 @@ static int __devinit cg14_init_one(struct of_device *op)
                        map->size *= 2;
        }
 
-       all->par.mode = MDI_8_PIX;
-       all->par.ramsize = (is_8mb ? 0x800000 : 0x400000);
+       par->mode = MDI_8_PIX;
+       par->ramsize = (is_8mb ? 0x800000 : 0x400000);
 
-       all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
-       all->info.fbops = &cg14_ops;
-       all->info.par = &all->par;
+       info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
+       info->fbops = &cg14_ops;
 
-       __cg14_reset(&all->par);
+       __cg14_reset(par);
 
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               cg14_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;
-       }
-       fb_set_cmap(&all->info.cmap, &all->info);
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_regs;
 
-       cg14_init_fix(&all->info, linebytes, dp);
+       fb_set_cmap(&info->cmap, info);
 
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               fb_dealloc_cmap(&all->info.cmap);
-               cg14_unmap_regs(op, all);
-               kfree(all);
-               return err;
-       }
+       cg14_init_fix(info, linebytes, dp);
+
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
 
-       dev_set_drvdata(&op->dev, all);
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: cgfourteen at %lx:%lx, %dMB\n",
               dp->full_name,
-              all->par.iospace, all->par.physbase,
-              all->par.ramsize >> 20);
+              par->iospace, par->physbase,
+              par->ramsize >> 20);
 
        return 0;
-}
 
-static int __devinit cg14_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_regs:
+       cg14_unmap_regs(op, info, par);
 
-       return cg14_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit cg14_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct cg14_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       cg14_unmap_regs(op, all);
+       cg14_unmap_regs(op, info, par);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index f042428a84f4485214a5ca1d95c38001bf0d9e8a..5741b46ade1be0b0780d07a79f8e02cd41de98be 100644 (file)
@@ -353,104 +353,102 @@ static void __devinit cg3_do_default_mode(struct cg3_par *par)
        }
 }
 
-struct all_info {
-       struct fb_info info;
-       struct cg3_par par;
-};
-
-static int __devinit cg3_init_one(struct of_device *op)
+static int __devinit cg3_probe(struct of_device *op,
+                              const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct cg3_par *par;
        int linebytes, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct cg3_par), &op->dev);
 
-       spin_lock_init(&all->par.lock);
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       all->par.physbase = op->resource[0].start;
-       all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
+       spin_lock_init(&par->lock);
 
-       sbusfb_fill_var(&all->info.var, dp->node, 8);
-       all->info.var.red.length = 8;
-       all->info.var.green.length = 8;
-       all->info.var.blue.length = 8;
+       par->physbase = op->resource[0].start;
+       par->which_io = op->resource[0].flags & IORESOURCE_BITS;
+
+       sbusfb_fill_var(&info->var, dp->node, 8);
+       info->var.red.length = 8;
+       info->var.green.length = 8;
+       info->var.blue.length = 8;
        if (!strcmp(dp->name, "cgRDI"))
-               all->par.flags |= CG3_FLAG_RDI;
-       if (all->par.flags & CG3_FLAG_RDI)
-               cg3_rdi_maybe_fixup_var(&all->info.var, dp);
+               par->flags |= CG3_FLAG_RDI;
+       if (par->flags & CG3_FLAG_RDI)
+               cg3_rdi_maybe_fixup_var(&info->var, dp);
 
        linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
+                                         info->var.xres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
 
-       all->par.regs = of_ioremap(&op->resource[0], CG3_REGS_OFFSET,
-                                  sizeof(struct cg3_regs), "cg3 regs");
+       par->regs = of_ioremap(&op->resource[0], CG3_REGS_OFFSET,
+                              sizeof(struct cg3_regs), "cg3 regs");
+       if (!par->regs)
+               goto out_release_fb;
 
-       all->info.flags = FBINFO_DEFAULT;
-       all->info.fbops = &cg3_ops;
-       all->info.screen_base =
-               of_ioremap(&op->resource[0], CG3_RAM_OFFSET,
-                          all->par.fbsize, "cg3 ram");
-       all->info.par = &all->par;
+       info->flags = FBINFO_DEFAULT;
+       info->fbops = &cg3_ops;
+       info->screen_base = of_ioremap(&op->resource[0], CG3_RAM_OFFSET,
+                                      par->fbsize, "cg3 ram");
+       if (!info->screen_base)
+               goto out_unmap_regs;
 
-       cg3_blank(0, &all->info);
+       cg3_blank(0, info);
 
        if (!of_find_property(dp, "width", NULL))
-               cg3_do_default_mode(&all->par);
-
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct cg3_regs));
-               of_iounmap(&op->resource[0],
-                          all->info.screen_base, all->par.fbsize);
-               kfree(all);
-               return -ENOMEM;
-       }
-       fb_set_cmap(&all->info.cmap, &all->info);
-
-       cg3_init_fix(&all->info, linebytes, dp);
-
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               fb_dealloc_cmap(&all->info.cmap);
-               of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct cg3_regs));
-               of_iounmap(&op->resource[0],
-                          all->info.screen_base, all->par.fbsize);
-               kfree(all);
-               return err;
-       }
+               cg3_do_default_mode(par);
+
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_screen;
+
+       fb_set_cmap(&info->cmap, info);
 
-       dev_set_drvdata(&op->dev, all);
+       cg3_init_fix(info, linebytes, dp);
+
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
+
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: cg3 at %lx:%lx\n",
-              dp->full_name, all->par.which_io, all->par.physbase);
+              dp->full_name, par->which_io, par->physbase);
 
        return 0;
-}
 
-static int __devinit cg3_probe(struct of_device *dev,
-                              const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_screen:
+       of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
+
+out_unmap_regs:
+       of_iounmap(&op->resource[0], par->regs, sizeof(struct cg3_regs));
+
+out_release_fb:
+       framebuffer_release(info);
 
-       return cg3_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit cg3_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct cg3_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       of_iounmap(&op->resource[0], all->par.regs, sizeof(struct cg3_regs));
-       of_iounmap(&op->resource[0], all->info.screen_base, all->par.fbsize);
+       of_iounmap(&op->resource[0], par->regs, sizeof(struct cg3_regs));
+       of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index 4dad23a28f58eb0c42b28907de817b5d246cd2ba..87c74712353873f14c15927556ecaf0eeeaa0f77 100644 (file)
@@ -653,135 +653,120 @@ static void cg6_chip_init(struct fb_info *info)
        sbus_writel(info->var.yres - 1, &fbc->clipmaxy);
 }
 
-struct all_info {
-       struct fb_info info;
-       struct cg6_par par;
-};
-
-static void cg6_unmap_regs(struct of_device *op, struct all_info *all)
+static void cg6_unmap_regs(struct of_device *op, struct fb_info *info,
+                          struct cg6_par *par)
 {
-       if (all->par.fbc)
-               of_iounmap(&op->resource[0], all->par.fbc, 4096);
-       if (all->par.tec)
-               of_iounmap(&op->resource[0],
-                          all->par.tec, sizeof(struct cg6_tec));
-       if (all->par.thc)
-               of_iounmap(&op->resource[0],
-                          all->par.thc, sizeof(struct cg6_thc));
-       if (all->par.bt)
-               of_iounmap(&op->resource[0],
-                          all->par.bt, sizeof(struct bt_regs));
-       if (all->par.fhc)
-               of_iounmap(&op->resource[0],
-                          all->par.fhc, sizeof(u32));
-
-       if (all->info.screen_base)
-               of_iounmap(&op->resource[0],
-                          all->info.screen_base, all->par.fbsize);
+       if (par->fbc)
+               of_iounmap(&op->resource[0], par->fbc, 4096);
+       if (par->tec)
+               of_iounmap(&op->resource[0], par->tec, sizeof(struct cg6_tec));
+       if (par->thc)
+               of_iounmap(&op->resource[0], par->thc, sizeof(struct cg6_thc));
+       if (par->bt)
+               of_iounmap(&op->resource[0], par->bt, sizeof(struct bt_regs));
+       if (par->fhc)
+               of_iounmap(&op->resource[0], par->fhc, sizeof(u32));
+
+       if (info->screen_base)
+               of_iounmap(&op->resource[0], info->screen_base, par->fbsize);
 }
 
-static int __devinit cg6_init_one(struct of_device *op)
+static int __devinit cg6_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct cg6_par *par;
        int linebytes, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct cg6_par), &op->dev);
+
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       spin_lock_init(&all->par.lock);
+       spin_lock_init(&par->lock);
 
-       all->par.physbase = op->resource[0].start;
-       all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
+       par->physbase = op->resource[0].start;
+       par->which_io = op->resource[0].flags & IORESOURCE_BITS;
 
-       sbusfb_fill_var(&all->info.var, dp->node, 8);
-       all->info.var.red.length = 8;
-       all->info.var.green.length = 8;
-       all->info.var.blue.length = 8;
+       sbusfb_fill_var(&info->var, dp->node, 8);
+       info->var.red.length = 8;
+       info->var.green.length = 8;
+       info->var.blue.length = 8;
 
        linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
+                                         info->var.xres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
        if (of_find_property(dp, "dblbuf", NULL))
-               all->par.fbsize *= 4;
+               par->fbsize *= 4;
 
-       all->par.fbc = of_ioremap(&op->resource[0], CG6_FBC_OFFSET,
+       par->fbc = of_ioremap(&op->resource[0], CG6_FBC_OFFSET,
                                  4096, "cgsix fbc");
-       all->par.tec = of_ioremap(&op->resource[0], CG6_TEC_OFFSET,
+       par->tec = of_ioremap(&op->resource[0], CG6_TEC_OFFSET,
                                  sizeof(struct cg6_tec), "cgsix tec");
-       all->par.thc = of_ioremap(&op->resource[0], CG6_THC_OFFSET,
+       par->thc = of_ioremap(&op->resource[0], CG6_THC_OFFSET,
                                  sizeof(struct cg6_thc), "cgsix thc");
-       all->par.bt = of_ioremap(&op->resource[0], CG6_BROOKTREE_OFFSET,
+       par->bt = of_ioremap(&op->resource[0], CG6_BROOKTREE_OFFSET,
                                 sizeof(struct bt_regs), "cgsix dac");
-       all->par.fhc = of_ioremap(&op->resource[0], CG6_FHC_OFFSET,
+       par->fhc = of_ioremap(&op->resource[0], CG6_FHC_OFFSET,
                                  sizeof(u32), "cgsix fhc");
 
-       all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_IMAGEBLIT |
+       info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_IMAGEBLIT |
                           FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT;
-       all->info.fbops = &cg6_ops;
-
-       all->info.screen_base =  of_ioremap(&op->resource[0], CG6_RAM_OFFSET,
-                                           all->par.fbsize, "cgsix ram");
-       if (!all->par.fbc || !all->par.tec || !all->par.thc ||
-           !all->par.bt || !all->par.fhc || !all->info.screen_base) {
-               cg6_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;
-       }
+       info->fbops = &cg6_ops;
 
-       all->info.par = &all->par;
+       info->screen_base =  of_ioremap(&op->resource[0], CG6_RAM_OFFSET,
+                                           par->fbsize, "cgsix ram");
+       if (!par->fbc || !par->tec || !par->thc ||
+           !par->bt || !par->fhc || !info->screen_base)
+               goto out_unmap_regs;
 
-       all->info.var.accel_flags = FB_ACCELF_TEXT;
+       info->var.accel_flags = FB_ACCELF_TEXT;
 
-       cg6_bt_init(&all->par);
-       cg6_chip_init(&all->info);
-       cg6_blank(0, &all->info);
+       cg6_bt_init(par);
+       cg6_chip_init(info);
+       cg6_blank(0, info);
 
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               cg6_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;
-       }
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_regs;
 
-       fb_set_cmap(&all->info.cmap, &all->info);
-       cg6_init_fix(&all->info, linebytes);
+       fb_set_cmap(&info->cmap, info);
+       cg6_init_fix(info, linebytes);
 
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               cg6_unmap_regs(op, all);
-               fb_dealloc_cmap(&all->info.cmap);
-               kfree(all);
-               return err;
-       }
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
 
-       dev_set_drvdata(&op->dev, all);
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: CGsix [%s] at %lx:%lx\n",
-              dp->full_name,
-              all->info.fix.id,
-              all->par.which_io, all->par.physbase);
+              dp->full_name, info->fix.id,
+              par->which_io, par->physbase);
 
        return 0;
-}
 
-static int __devinit cg6_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_regs:
+       cg6_unmap_regs(op, info, par);
 
-       return cg6_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit cg6_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct cg6_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       cg6_unmap_regs(op, all);
+       cg6_unmap_regs(op, info, par);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index 3f6c98fad437fca8f542dbd11a29a19e55d52bce..4b520b573911f96d617935a2741898204b46b153 100644 (file)
@@ -371,6 +371,8 @@ struct ffb_par {
        unsigned long           fbsize;
 
        int                     board_type;
+
+       u32                     pseudo_palette[16];
 };
 
 static void FFBFifo(struct ffb_par *par, int n)
@@ -900,75 +902,67 @@ ffb_init_fix(struct fb_info *info)
        info->fix.accel = FB_ACCEL_SUN_CREATOR;
 }
 
-struct all_info {
-       struct fb_info info;
-       struct ffb_par par;
-       u32 pseudo_palette[16];
-};
-
-static int ffb_init_one(struct of_device *op)
+static int __devinit ffb_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
        struct ffb_fbc __iomem *fbc;
        struct ffb_dac __iomem *dac;
-       struct all_info *all;
-       int err;
+       struct fb_info *info;
+       struct ffb_par *par;
        u32 dac_pnum, dac_rev, dac_mrev;
+       int err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct ffb_par), &op->dev);
 
-       spin_lock_init(&all->par.lock);
-       all->par.fbc = of_ioremap(&op->resource[2], 0,
-                                 sizeof(struct ffb_fbc), "ffb fbc");
-       if (!all->par.fbc) {
-               kfree(all);
-               return -ENOMEM;
-       }
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
 
-       all->par.dac = of_ioremap(&op->resource[1], 0,
-                                 sizeof(struct ffb_dac), "ffb dac");
-       if (!all->par.dac) {
-               of_iounmap(&op->resource[2],
-                          all->par.fbc, sizeof(struct ffb_fbc));
-               kfree(all);
-               return -ENOMEM;
-       }
+       par = info->par;
+
+       spin_lock_init(&par->lock);
+       par->fbc = of_ioremap(&op->resource[2], 0,
+                             sizeof(struct ffb_fbc), "ffb fbc");
+       if (!par->fbc)
+               goto out_release_fb;
+
+       par->dac = of_ioremap(&op->resource[1], 0,
+                             sizeof(struct ffb_dac), "ffb dac");
+       if (!par->dac)
+               goto out_unmap_fbc;
 
-       all->par.rop_cache = FFB_ROP_NEW;
-       all->par.physbase = op->resource[0].start;
+       par->rop_cache = FFB_ROP_NEW;
+       par->physbase = op->resource[0].start;
 
        /* Don't mention copyarea, so SCROLL_REDRAW is always
         * used.  It is the fastest on this chip.
         */
-       all->info.flags = (FBINFO_DEFAULT |
-                          /* FBINFO_HWACCEL_COPYAREA | */
-                          FBINFO_HWACCEL_FILLRECT |
-                          FBINFO_HWACCEL_IMAGEBLIT);
-       all->info.fbops = &ffb_ops;
-       all->info.screen_base = (char *) all->par.physbase + FFB_DFB24_POFF;
-       all->info.par = &all->par;
-       all->info.pseudo_palette = all->pseudo_palette;
-
-       sbusfb_fill_var(&all->info.var, dp->node, 32);
-       all->par.fbsize = PAGE_ALIGN(all->info.var.xres *
-                                    all->info.var.yres *
-                                    4);
-       ffb_fixup_var_rgb(&all->info.var);
-
-       all->info.var.accel_flags = FB_ACCELF_TEXT;
+       info->flags = (FBINFO_DEFAULT |
+                      /* FBINFO_HWACCEL_COPYAREA | */
+                      FBINFO_HWACCEL_FILLRECT |
+                      FBINFO_HWACCEL_IMAGEBLIT);
+
+       info->fbops = &ffb_ops;
+
+       info->screen_base = (char *) par->physbase + FFB_DFB24_POFF;
+       info->pseudo_palette = par->pseudo_palette;
+
+       sbusfb_fill_var(&info->var, dp->node, 32);
+       par->fbsize = PAGE_ALIGN(info->var.xres * info->var.yres * 4);
+       ffb_fixup_var_rgb(&info->var);
+
+       info->var.accel_flags = FB_ACCELF_TEXT;
 
        if (!strcmp(dp->name, "SUNW,afb"))
-               all->par.flags |= FFB_FLAG_AFB;
+               par->flags |= FFB_FLAG_AFB;
 
-       all->par.board_type = of_getintprop_default(dp, "board_type", 0);
+       par->board_type = of_getintprop_default(dp, "board_type", 0);
 
-       fbc = all->par.fbc;
+       fbc = par->fbc;
        if ((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0)
                upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr);
 
-       dac = all->par.dac;
+       dac = par->dac;
        upa_writel(FFB_DAC_DID, &dac->type);
        dac_pnum = upa_readl(&dac->value);
        dac_rev = (dac_pnum & FFB_DAC_DID_REV) >> FFB_DAC_DID_REV_SHIFT;
@@ -985,76 +979,70 @@ static int ffb_init_one(struct of_device *op)
         * cursor logic.  We identify Pacifica 1 as not Pacifica 2, the
         * latter having a part number value of 0x236e.
         */
-       if ((all->par.flags & FFB_FLAG_AFB) || dac_pnum == 0x236e) {
-               all->par.flags &= ~FFB_FLAG_INVCURSOR;
+       if ((par->flags & FFB_FLAG_AFB) || dac_pnum == 0x236e) {
+               par->flags &= ~FFB_FLAG_INVCURSOR;
        } else {
                if (dac_mrev < 3)
-                       all->par.flags |= FFB_FLAG_INVCURSOR;
+                       par->flags |= FFB_FLAG_INVCURSOR;
        }
 
-       ffb_switch_from_graph(&all->par);
+       ffb_switch_from_graph(par);
 
        /* Unblank it just to be sure.  When there are multiple
         * FFB/AFB cards in the system, or it is not the OBP
         * chosen console, it will have video outputs off in
         * the DAC.
         */
-       ffb_blank(0, &all->info);
-
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               printk(KERN_ERR "ffb: Could not allocate color map.\n");
-               of_iounmap(&op->resource[2],
-                          all->par.fbc, sizeof(struct ffb_fbc));
-               of_iounmap(&op->resource[1],
-                          all->par.dac, sizeof(struct ffb_dac));
-               kfree(all);
-               return -ENOMEM;
-       }
+       ffb_blank(0, info);
 
-       ffb_init_fix(&all->info);
-
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               printk(KERN_ERR "ffb: Could not register framebuffer.\n");
-               fb_dealloc_cmap(&all->info.cmap);
-               of_iounmap(&op->resource[2],
-                          all->par.fbc, sizeof(struct ffb_fbc));
-               of_iounmap(&op->resource[1],
-                          all->par.dac, sizeof(struct ffb_dac));
-               kfree(all);
-               return err;
-       }
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_dac;
+
+       ffb_init_fix(info);
 
-       dev_set_drvdata(&op->dev, all);
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
+
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: %s at %016lx, type %d, "
               "DAC pnum[%x] rev[%d] manuf_rev[%d]\n",
               dp->full_name,
-              ((all->par.flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
-              all->par.physbase, all->par.board_type,
+              ((par->flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
+              par->physbase, par->board_type,
               dac_pnum, dac_rev, dac_mrev);
 
        return 0;
-}
 
-static int __devinit ffb_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_dac:
+       of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
+
+out_unmap_fbc:
+       of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
+
+out_release_fb:
+       framebuffer_release(info);
 
-       return ffb_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit ffb_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct ffb_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       of_iounmap(&op->resource[2], all->par.fbc, sizeof(struct ffb_fbc));
-       of_iounmap(&op->resource[1], all->par.dac, sizeof(struct ffb_dac));
+       of_iounmap(&op->resource[2], par->fbc, sizeof(struct ffb_fbc));
+       of_iounmap(&op->resource[1], par->dac, sizeof(struct ffb_dac));
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index a038aa5a9e1ccbed66d9e403adf1eaa684235c15..45b9a5d55dec97d7f7ae3303fedb2a71e569afff 100644 (file)
@@ -525,130 +525,123 @@ static void leo_fixup_var_rgb(struct fb_var_screeninfo *var)
        var->transp.length = 0;
 }
 
-struct all_info {
-       struct fb_info info;
-       struct leo_par par;
-};
-
-static void leo_unmap_regs(struct of_device *op, struct all_info *all)
+static void leo_unmap_regs(struct of_device *op, struct fb_info *info,
+                          struct leo_par *par)
 {
-       if (all->par.lc_ss0_usr)
-               of_iounmap(&op->resource[0], all->par.lc_ss0_usr, 0x1000);
-       if (all->par.ld_ss0)
-               of_iounmap(&op->resource[0], all->par.ld_ss0, 0x1000);
-       if (all->par.ld_ss1)
-               of_iounmap(&op->resource[0], all->par.ld_ss1, 0x1000);
-       if (all->par.lx_krn)
-               of_iounmap(&op->resource[0], all->par.lx_krn, 0x1000);
-       if (all->par.cursor)
+       if (par->lc_ss0_usr)
+               of_iounmap(&op->resource[0], par->lc_ss0_usr, 0x1000);
+       if (par->ld_ss0)
+               of_iounmap(&op->resource[0], par->ld_ss0, 0x1000);
+       if (par->ld_ss1)
+               of_iounmap(&op->resource[0], par->ld_ss1, 0x1000);
+       if (par->lx_krn)
+               of_iounmap(&op->resource[0], par->lx_krn, 0x1000);
+       if (par->cursor)
                of_iounmap(&op->resource[0],
-                          all->par.cursor, sizeof(struct leo_cursor));
-       if (all->info.screen_base)
-               of_iounmap(&op->resource[0], all->info.screen_base, 0x800000);
+                          par->cursor, sizeof(struct leo_cursor));
+       if (info->screen_base)
+               of_iounmap(&op->resource[0], info->screen_base, 0x800000);
 }
 
-static int __devinit leo_init_one(struct of_device *op)
+static int __devinit leo_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct leo_par *par;
        int linebytes, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct leo_par), &op->dev);
+
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       spin_lock_init(&all->par.lock);
+       spin_lock_init(&par->lock);
 
-       all->par.physbase = op->resource[0].start;
-       all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
+       par->physbase = op->resource[0].start;
+       par->which_io = op->resource[0].flags & IORESOURCE_BITS;
 
-       sbusfb_fill_var(&all->info.var, dp->node, 32);
-       leo_fixup_var_rgb(&all->info.var);
+       sbusfb_fill_var(&info->var, dp->node, 32);
+       leo_fixup_var_rgb(&info->var);
 
        linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
+                                         info->var.xres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
 
-       all->par.lc_ss0_usr =
+       par->lc_ss0_usr =
                of_ioremap(&op->resource[0], LEO_OFF_LC_SS0_USR,
                           0x1000, "leolc ss0usr");
-       all->par.ld_ss0 =
+       par->ld_ss0 =
                of_ioremap(&op->resource[0], LEO_OFF_LD_SS0,
                           0x1000, "leold ss0");
-       all->par.ld_ss1 =
+       par->ld_ss1 =
                of_ioremap(&op->resource[0], LEO_OFF_LD_SS1,
                           0x1000, "leold ss1");
-       all->par.lx_krn =
+       par->lx_krn =
                of_ioremap(&op->resource[0], LEO_OFF_LX_KRN,
                           0x1000, "leolx krn");
-       all->par.cursor =
+       par->cursor =
                of_ioremap(&op->resource[0], LEO_OFF_LX_CURSOR,
                           sizeof(struct leo_cursor), "leolx cursor");
-       all->info.screen_base = 
+       info->screen_base =
                of_ioremap(&op->resource[0], LEO_OFF_SS0,
                           0x800000, "leo ram");
-       if (!all->par.lc_ss0_usr ||
-           !all->par.ld_ss0 ||
-           !all->par.ld_ss1 ||
-           !all->par.lx_krn ||
-           !all->par.cursor ||
-           !all->info.screen_base) {
-               leo_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;
-       }
+       if (!par->lc_ss0_usr ||
+           !par->ld_ss0 ||
+           !par->ld_ss1 ||
+           !par->lx_krn ||
+           !par->cursor ||
+           !info->screen_base)
+               goto out_unmap_regs;
 
-       all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
-       all->info.fbops = &leo_ops;
-       all->info.par = &all->par;
+       info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
+       info->fbops = &leo_ops;
 
-       leo_init_wids(&all->info);
-       leo_init_hw(&all->info);
+       leo_init_wids(info);
+       leo_init_hw(info);
 
-       leo_blank(0, &all->info);
+       leo_blank(0, info);
 
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               leo_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;;
-       }
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_regs;
 
-       leo_init_fix(&all->info, dp);
+       leo_init_fix(info, dp);
 
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               fb_dealloc_cmap(&all->info.cmap);
-               leo_unmap_regs(op, all);
-               kfree(all);
-               return err;
-       }
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
 
-       dev_set_drvdata(&op->dev, all);
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: leo at %lx:%lx\n",
               dp->full_name,
-              all->par.which_io, all->par.physbase);
+              par->which_io, par->physbase);
 
        return 0;
-}
 
-static int __devinit leo_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_regs:
+       leo_unmap_regs(op, info, par);
+       framebuffer_release(info);
 
-       return leo_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit leo_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct leo_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       leo_unmap_regs(op, all);
+       leo_unmap_regs(op, info, par);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index 637b78bb4bf79d62f2798d81cd0181623eb6aef2..58496061142de6e90d2a27e79381ac55d1d0b29f 100644 (file)
@@ -255,107 +255,95 @@ static void p9100_init_fix(struct fb_info *info, int linebytes, struct device_no
        info->fix.accel = FB_ACCEL_SUN_CGTHREE;
 }
 
-struct all_info {
-       struct fb_info info;
-       struct p9100_par par;
-};
-
-static int __devinit p9100_init_one(struct of_device *op)
+static int __devinit p9100_probe(struct of_device *op, const struct of_device_id *match)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct p9100_par *par;
        int linebytes, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct p9100_par), &op->dev);
+
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       spin_lock_init(&all->par.lock);
+       spin_lock_init(&par->lock);
 
        /* This is the framebuffer and the only resource apps can mmap.  */
-       all->par.physbase = op->resource[2].start;
-       all->par.which_io = op->resource[2].flags & IORESOURCE_BITS;
-
-       sbusfb_fill_var(&all->info.var, dp->node, 8);
-       all->info.var.red.length = 8;
-       all->info.var.green.length = 8;
-       all->info.var.blue.length = 8;
-
-       linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
-
-       all->par.regs = of_ioremap(&op->resource[0], 0,
-                                  sizeof(struct p9100_regs), "p9100 regs");
-       if (!all->par.regs) {
-               kfree(all);
-               return -ENOMEM;
-       }
+       par->physbase = op->resource[2].start;
+       par->which_io = op->resource[2].flags & IORESOURCE_BITS;
 
-       all->info.flags = FBINFO_DEFAULT;
-       all->info.fbops = &p9100_ops;
-       all->info.screen_base = of_ioremap(&op->resource[2], 0,
-                                          all->par.fbsize, "p9100 ram");
-       if (!all->info.screen_base) {
-               of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct p9100_regs));
-               kfree(all);
-               return -ENOMEM;
-       }
-       all->info.par = &all->par;
+       sbusfb_fill_var(&info->var, dp->node, 8);
+       info->var.red.length = 8;
+       info->var.green.length = 8;
+       info->var.blue.length = 8;
 
-       p9100_blank(0, &all->info);
+       linebytes = of_getintprop_default(dp, "linebytes", info->var.xres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
 
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct p9100_regs));
-               of_iounmap(&op->resource[2],
-                          all->info.screen_base, all->par.fbsize);
-               kfree(all);
-               return -ENOMEM;
-       }
+       par->regs = of_ioremap(&op->resource[0], 0,
+                              sizeof(struct p9100_regs), "p9100 regs");
+       if (!par->regs)
+               goto out_release_fb;
 
-       p9100_init_fix(&all->info, linebytes, dp);
-
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               fb_dealloc_cmap(&all->info.cmap);
-               of_iounmap(&op->resource[0],
-                          all->par.regs, sizeof(struct p9100_regs));
-               of_iounmap(&op->resource[2],
-                          all->info.screen_base, all->par.fbsize);
-               kfree(all);
-               return err;
-       }
-       fb_set_cmap(&all->info.cmap, &all->info);
+       info->flags = FBINFO_DEFAULT;
+       info->fbops = &p9100_ops;
+       info->screen_base = of_ioremap(&op->resource[2], 0,
+                                      par->fbsize, "p9100 ram");
+       if (!info->screen_base)
+               goto out_unmap_regs;
+
+       p9100_blank(0, info);
+
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_screen;
 
-       dev_set_drvdata(&op->dev, all);
+       p9100_init_fix(info, linebytes, dp);
+
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
+
+       fb_set_cmap(&info->cmap, info);
+
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: p9100 at %lx:%lx\n",
               dp->full_name,
-              all->par.which_io, all->par.physbase);
+              par->which_io, par->physbase);
 
        return 0;
-}
 
-static int __devinit p9100_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct of_device *op = to_of_device(&dev->dev);
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_screen:
+       of_iounmap(&op->resource[2], info->screen_base, par->fbsize);
+
+out_unmap_regs:
+       of_iounmap(&op->resource[0], par->regs, sizeof(struct p9100_regs));
+
+out_release_fb:
+       framebuffer_release(info);
 
-       return p9100_init_one(op);
+out_err:
+       return err;
 }
 
 static int __devexit p9100_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct p9100_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       of_iounmap(&op->resource[0], all->par.regs, sizeof(struct p9100_regs));
-       of_iounmap(&op->resource[2], all->info.screen_base, all->par.fbsize);
+       of_iounmap(&op->resource[0], par->regs, sizeof(struct p9100_regs));
+       of_iounmap(&op->resource[2], info->screen_base, par->fbsize);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index 34ef859ee41440ec80492e70038307f7e08cc8c1..963a454b70741ecb696802c98bd5e73dd83e146d 100644 (file)
@@ -190,17 +190,6 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
 EXPORT_SYMBOL(sbusfb_ioctl_helper);
 
 #ifdef CONFIG_COMPAT
-struct  fbcmap32 {
-       int             index;          /* first element (0 origin) */
-       int             count;
-       u32             red;
-       u32             green;
-       u32             blue;
-};
-
-#define FBIOPUTCMAP32  _IOW('F', 3, struct fbcmap32)
-#define FBIOGETCMAP32  _IOW('F', 4, struct fbcmap32)
-
 static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long arg)
 {
        struct fbcmap32 __user *argp = (void __user *)arg;
@@ -223,20 +212,6 @@ static int fbiogetputcmap(struct fb_info *info, unsigned int cmd, unsigned long
                        (unsigned long)p);
 }
 
-struct fbcursor32 {
-       short set;              /* what to set, choose from the list above */
-       short enable;           /* cursor on/off */
-       struct fbcurpos pos;    /* cursor position */
-       struct fbcurpos hot;    /* cursor hot spot */
-       struct fbcmap32 cmap;   /* color map info */
-       struct fbcurpos size;   /* cursor bit map size */
-       u32     image;          /* cursor image bits */
-       u32     mask;           /* cursor mask bits */
-};
-
-#define FBIOSCURSOR32  _IOW('F', 24, struct fbcursor32)
-#define FBIOGCURSOR32  _IOW('F', 25, struct fbcursor32)
-
 static int fbiogscursor(struct fb_info *info, unsigned long arg)
 {
        struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p));
index 5a99669232ce51dc042655ee53f4edabbe540c3f..e5a9ddb3c8be4d9386a63aa758429074fc1ed176 100644 (file)
@@ -345,88 +345,82 @@ tcx_init_fix(struct fb_info *info, int linebytes)
        info->fix.accel = FB_ACCEL_SUN_TCX;
 }
 
-struct all_info {
-       struct fb_info info;
-       struct tcx_par par;
-};
-
-static void tcx_unmap_regs(struct of_device *op, struct all_info *all)
+static void tcx_unmap_regs(struct of_device *op, struct fb_info *info,
+                          struct tcx_par *par)
 {
-       if (all->par.tec)
+       if (par->tec)
                of_iounmap(&op->resource[7],
-                          all->par.tec, sizeof(struct tcx_tec));
-       if (all->par.thc)
+                          par->tec, sizeof(struct tcx_tec));
+       if (par->thc)
                of_iounmap(&op->resource[9],
-                          all->par.thc, sizeof(struct tcx_thc));
-       if (all->par.bt)
+                          par->thc, sizeof(struct tcx_thc));
+       if (par->bt)
                of_iounmap(&op->resource[8],
-                          all->par.bt, sizeof(struct bt_regs));
-       if (all->par.cplane)
+                          par->bt, sizeof(struct bt_regs));
+       if (par->cplane)
                of_iounmap(&op->resource[4],
-                          all->par.cplane, all->par.fbsize * sizeof(u32));
-       if (all->info.screen_base)
+                          par->cplane, par->fbsize * sizeof(u32));
+       if (info->screen_base)
                of_iounmap(&op->resource[0],
-                          all->info.screen_base, all->par.fbsize);
+                          info->screen_base, par->fbsize);
 }
 
 static int __devinit tcx_init_one(struct of_device *op)
 {
        struct device_node *dp = op->node;
-       struct all_info *all;
+       struct fb_info *info;
+       struct tcx_par *par;
        int linebytes, i, err;
 
-       all = kzalloc(sizeof(*all), GFP_KERNEL);
-       if (!all)
-               return -ENOMEM;
+       info = framebuffer_alloc(sizeof(struct tcx_par), &op->dev);
 
-       spin_lock_init(&all->par.lock);
+       err = -ENOMEM;
+       if (!info)
+               goto out_err;
+       par = info->par;
 
-       all->par.lowdepth =
+       spin_lock_init(&par->lock);
+
+       par->lowdepth =
                (of_find_property(dp, "tcx-8-bit", NULL) != NULL);
 
-       sbusfb_fill_var(&all->info.var, dp->node, 8);
-       all->info.var.red.length = 8;
-       all->info.var.green.length = 8;
-       all->info.var.blue.length = 8;
+       sbusfb_fill_var(&info->var, dp->node, 8);
+       info->var.red.length = 8;
+       info->var.green.length = 8;
+       info->var.blue.length = 8;
 
        linebytes = of_getintprop_default(dp, "linebytes",
-                                         all->info.var.xres);
-       all->par.fbsize = PAGE_ALIGN(linebytes * all->info.var.yres);
+                                         info->var.xres);
+       par->fbsize = PAGE_ALIGN(linebytes * info->var.yres);
 
-       all->par.tec = of_ioremap(&op->resource[7], 0,
+       par->tec = of_ioremap(&op->resource[7], 0,
                                  sizeof(struct tcx_tec), "tcx tec");
-       all->par.thc = of_ioremap(&op->resource[9], 0,
+       par->thc = of_ioremap(&op->resource[9], 0,
                                  sizeof(struct tcx_thc), "tcx thc");
-       all->par.bt = of_ioremap(&op->resource[8], 0,
+       par->bt = of_ioremap(&op->resource[8], 0,
                                 sizeof(struct bt_regs), "tcx dac");
-       all->info.screen_base = of_ioremap(&op->resource[0], 0,
-                                          all->par.fbsize, "tcx ram");
-       if (!all->par.tec || !all->par.thc ||
-           !all->par.bt || !all->info.screen_base) {
-               tcx_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;
-       }
-
-       memcpy(&all->par.mmap_map, &__tcx_mmap_map, sizeof(all->par.mmap_map));
-       if (!all->par.lowdepth) {
-               all->par.cplane = of_ioremap(&op->resource[4], 0,
-                                            all->par.fbsize * sizeof(u32),
+       info->screen_base = of_ioremap(&op->resource[0], 0,
+                                          par->fbsize, "tcx ram");
+       if (!par->tec || !par->thc ||
+           !par->bt || !info->screen_base)
+               goto out_unmap_regs;
+
+       memcpy(&par->mmap_map, &__tcx_mmap_map, sizeof(par->mmap_map));
+       if (!par->lowdepth) {
+               par->cplane = of_ioremap(&op->resource[4], 0,
+                                            par->fbsize * sizeof(u32),
                                             "tcx cplane");
-               if (!all->par.cplane) {
-                       tcx_unmap_regs(op, all);
-                       kfree(all);
-                       return -ENOMEM;
-               }
+               if (!par->cplane)
+                       goto out_unmap_regs;
        } else {
-               all->par.mmap_map[1].size = SBUS_MMAP_EMPTY;
-               all->par.mmap_map[4].size = SBUS_MMAP_EMPTY;
-               all->par.mmap_map[5].size = SBUS_MMAP_EMPTY;
-               all->par.mmap_map[6].size = SBUS_MMAP_EMPTY;
+               par->mmap_map[1].size = SBUS_MMAP_EMPTY;
+               par->mmap_map[4].size = SBUS_MMAP_EMPTY;
+               par->mmap_map[5].size = SBUS_MMAP_EMPTY;
+               par->mmap_map[6].size = SBUS_MMAP_EMPTY;
        }
 
-       all->par.physbase = 0;
-       all->par.which_io = op->resource[0].flags & IORESOURCE_BITS;
+       par->physbase = 0;
+       par->which_io = op->resource[0].flags & IORESOURCE_BITS;
 
        for (i = 0; i < TCX_MMAP_ENTRIES; i++) {
                int j;
@@ -444,53 +438,54 @@ static int __devinit tcx_init_one(struct of_device *op)
                        j = i;
                        break;
                };
-               all->par.mmap_map[i].poff = op->resource[j].start;
+               par->mmap_map[i].poff = op->resource[j].start;
        }
 
-       all->info.flags = FBINFO_DEFAULT;
-       all->info.fbops = &tcx_ops;
-       all->info.par = &all->par;
+       info->flags = FBINFO_DEFAULT;
+       info->fbops = &tcx_ops;
 
        /* Initialize brooktree DAC. */
-       sbus_writel(0x04 << 24, &all->par.bt->addr);         /* color planes */
-       sbus_writel(0xff << 24, &all->par.bt->control);
-       sbus_writel(0x05 << 24, &all->par.bt->addr);
-       sbus_writel(0x00 << 24, &all->par.bt->control);
-       sbus_writel(0x06 << 24, &all->par.bt->addr);         /* overlay plane */
-       sbus_writel(0x73 << 24, &all->par.bt->control);
-       sbus_writel(0x07 << 24, &all->par.bt->addr);
-       sbus_writel(0x00 << 24, &all->par.bt->control);
-
-       tcx_reset(&all->info);
-
-       tcx_blank(FB_BLANK_UNBLANK, &all->info);
-
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
-               tcx_unmap_regs(op, all);
-               kfree(all);
-               return -ENOMEM;
-       }
+       sbus_writel(0x04 << 24, &par->bt->addr);         /* color planes */
+       sbus_writel(0xff << 24, &par->bt->control);
+       sbus_writel(0x05 << 24, &par->bt->addr);
+       sbus_writel(0x00 << 24, &par->bt->control);
+       sbus_writel(0x06 << 24, &par->bt->addr);         /* overlay plane */
+       sbus_writel(0x73 << 24, &par->bt->control);
+       sbus_writel(0x07 << 24, &par->bt->addr);
+       sbus_writel(0x00 << 24, &par->bt->control);
+
+       tcx_reset(info);
 
-       fb_set_cmap(&all->info.cmap, &all->info);
-       tcx_init_fix(&all->info, linebytes);
+       tcx_blank(FB_BLANK_UNBLANK, info);
 
-       err = register_framebuffer(&all->info);
-       if (err < 0) {
-               fb_dealloc_cmap(&all->info.cmap);
-               tcx_unmap_regs(op, all);
-               kfree(all);
-               return err;
-       }
+       if (fb_alloc_cmap(&info->cmap, 256, 0))
+               goto out_unmap_regs;
+
+       fb_set_cmap(&info->cmap, info);
+       tcx_init_fix(info, linebytes);
+
+       err = register_framebuffer(info);
+       if (err < 0)
+               goto out_dealloc_cmap;
 
-       dev_set_drvdata(&op->dev, all);
+       dev_set_drvdata(&op->dev, info);
 
        printk("%s: TCX at %lx:%lx, %s\n",
               dp->full_name,
-              all->par.which_io,
+              par->which_io,
               op->resource[0].start,
-              all->par.lowdepth ? "8-bit only" : "24-bit depth");
+              par->lowdepth ? "8-bit only" : "24-bit depth");
 
        return 0;
+
+out_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
+
+out_unmap_regs:
+       tcx_unmap_regs(op, info, par);
+
+out_err:
+       return err;
 }
 
 static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id *match)
@@ -502,14 +497,15 @@ static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id
 
 static int __devexit tcx_remove(struct of_device *op)
 {
-       struct all_info *all = dev_get_drvdata(&op->dev);
+       struct fb_info *info = dev_get_drvdata(&op->dev);
+       struct tcx_par *par = info->par;
 
-       unregister_framebuffer(&all->info);
-       fb_dealloc_cmap(&all->info.cmap);
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
 
-       tcx_unmap_regs(op, all);
+       tcx_unmap_regs(op, info, par);
 
-       kfree(all);
+       framebuffer_release(info);
 
        dev_set_drvdata(&op->dev, NULL);
 
index e440a7b95d0275769f5f89124c69c39259785c2f..2bc1428d621c919f4a3bf48e46ec9325d1b2d3fe 100644 (file)
 #include <linux/dvb/video.h>
 #include <linux/lp.h>
 
+#ifdef CONFIG_SPARC
+#include <asm/fbio.h>
+#endif
+
 static int do_ioctl32_pointer(unsigned int fd, unsigned int cmd,
                              unsigned long arg, struct file *f)
 {
@@ -3493,6 +3497,22 @@ IGNORE_IOCTL(VFAT_IOCTL_READDIR_SHORT32)
 
 /* loop */
 IGNORE_IOCTL(LOOP_CLR_FD)
+
+#ifdef CONFIG_SPARC
+/* Sparc framebuffers, handled in sbusfb_compat_ioctl() */
+IGNORE_IOCTL(FBIOGTYPE)
+IGNORE_IOCTL(FBIOSATTR)
+IGNORE_IOCTL(FBIOGATTR)
+IGNORE_IOCTL(FBIOSVIDEO)
+IGNORE_IOCTL(FBIOGVIDEO)
+IGNORE_IOCTL(FBIOSCURPOS)
+IGNORE_IOCTL(FBIOGCURPOS)
+IGNORE_IOCTL(FBIOGCURMAX)
+IGNORE_IOCTL(FBIOPUTCMAP32)
+IGNORE_IOCTL(FBIOGETCMAP32)
+IGNORE_IOCTL(FBIOSCURSOR32)
+IGNORE_IOCTL(FBIOGCURSOR32)
+#endif
 };
 
 #define IOCTL_HASHSIZE 256
index c1208f53bd74596c74423f085886c859bf51cf3e..792cbf55fa9592cefbd6b2446ed26d573301beee 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/capability.h>
 #include <linux/dcache.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/errno.h>
 #include <linux/dcookies.h>
 #include <linux/mutex.h>
index 4ccec4cd1367a304bac2c784d0ba7e794b3e98cc..5567ec0d03a3910e931591e72669842cfc2b4591 100644 (file)
@@ -203,6 +203,7 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev,
        Sector sect;
        struct solaris_x86_vtoc *v;
        int i;
+       short max_nparts;
 
        v = (struct solaris_x86_vtoc *)read_dev_sector(bdev, offset+1, &sect);
        if (!v)
@@ -218,7 +219,9 @@ parse_solaris_x86(struct parsed_partitions *state, struct block_device *bdev,
                put_dev_sector(sect);
                return;
        }
-       for (i=0; i<SOLARIS_X86_NUMSLICE && state->next<state->limit; i++) {
+       /* Ensure we can handle previous case of VTOC with 8 entries gracefully */
+       max_nparts = le16_to_cpu (v->v_nparts) > 8 ? SOLARIS_X86_NUMSLICE : 8;
+       for (i=0; i<max_nparts && state->next<state->limit; i++) {
                struct solaris_x86_slice *s = &v->v_slice[i];
                if (s->s_size == 0)
                        continue;
index 123f8b46c8ba7cfbfd3676b37b00a8fa07070e38..794118da4ef3ee04877a1bb2122bf81c977f61fd 100644 (file)
@@ -19,34 +19,47 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
        Sector sect;
        struct sun_disklabel {
                unsigned char info[128];   /* Informative text string */
-               unsigned char spare0[14];
-               struct sun_info {
-                       unsigned char spare1;
-                       unsigned char id;
-                       unsigned char spare2;
-                       unsigned char flags;
-               } infos[8];
-               unsigned char spare[246];  /* Boot information etc. */
+               struct sun_vtoc {
+                   __be32 version;     /* Layout version */
+                   char   volume[8];   /* Volume name */
+                   __be16 nparts;      /* Number of partitions */
+                   struct sun_info {           /* Partition hdrs, sec 2 */
+                       __be16 id;
+                       __be16 flags;
+                   } infos[8];
+                   __be16 padding;     /* Alignment padding */
+                   __be32 bootinfo[3];  /* Info needed by mboot */
+                   __be32 sanity;       /* To verify vtoc sanity */
+                   __be32 reserved[10]; /* Free space */
+                   __be32 timestamp[8]; /* Partition timestamp */
+               } vtoc;
+               __be32 write_reinstruct; /* sectors to skip, writes */
+               __be32 read_reinstruct;  /* sectors to skip, reads */
+               unsigned char spare[148]; /* Padding */
                __be16 rspeed;     /* Disk rotational speed */
                __be16 pcylcount;  /* Physical cylinder count */
                __be16 sparecyl;   /* extra sects per cylinder */
-               unsigned char spare2[4];   /* More magic... */
+               __be16 obs1;       /* gap1 */
+               __be16 obs2;       /* gap2 */
                __be16 ilfact;     /* Interleave factor */
                __be16 ncyl;       /* Data cylinder count */
                __be16 nacyl;      /* Alt. cylinder count */
                __be16 ntrks;      /* Tracks per cylinder */
                __be16 nsect;      /* Sectors per track */
-               unsigned char spare3[4];   /* Even more magic... */
+               __be16 obs3;       /* bhead - Label head offset */
+               __be16 obs4;       /* ppart - Physical Partition */
                struct sun_partition {
                        __be32 start_cylinder;
                        __be32 num_sectors;
                } partitions[8];
                __be16 magic;      /* Magic number */
                __be16 csum;       /* Label xor'd checksum */
-       } * label;              
+       } * label;
        struct sun_partition *p;
        unsigned long spc;
        char b[BDEVNAME_SIZE];
+       int use_vtoc;
+       int nparts;
 
        label = (struct sun_disklabel *)read_dev_sector(bdev, 0, &sect);
        if (!label)
@@ -70,9 +83,22 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
                return 0;
        }
 
-       /* All Sun disks have 8 partition entries */
+       /* Check to see if we can use the VTOC table */
+       use_vtoc = ((be32_to_cpu(label->vtoc.sanity) == SUN_VTOC_SANITY) &&
+                   (be32_to_cpu(label->vtoc.version) == 1) &&
+                   (be16_to_cpu(label->vtoc.nparts) <= 8));
+
+       /* Use 8 partition entries if not specified in validated VTOC */
+       nparts = (use_vtoc) ? be16_to_cpu(label->vtoc.nparts) : 8;
+
+       /*
+        * So that old Linux-Sun partitions continue to work,
+        * alow the VTOC to be used under the additional condition ...
+        */
+       use_vtoc = use_vtoc || !(label->vtoc.sanity |
+                                label->vtoc.version | label->vtoc.nparts);
        spc = be16_to_cpu(label->ntrks) * be16_to_cpu(label->nsect);
-       for (i = 0; i < 8; i++, p++) {
+       for (i = 0; i < nparts; i++, p++) {
                unsigned long st_sector;
                unsigned int num_sectors;
 
@@ -81,10 +107,12 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
                if (num_sectors) {
                        put_partition(state, slot, st_sector, num_sectors);
                        state->parts[slot].flags = 0;
-                       if (label->infos[i].id == LINUX_RAID_PARTITION)
-                               state->parts[slot].flags |= ADDPART_FLAG_RAID;
-                       if (label->infos[i].id == SUN_WHOLE_DISK)
-                               state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK;
+                       if (use_vtoc) {
+                               if (be16_to_cpu(label->vtoc.infos[i].id) == LINUX_RAID_PARTITION)
+                                       state->parts[slot].flags |= ADDPART_FLAG_RAID;
+                               else if (be16_to_cpu(label->vtoc.infos[i].id) == SUN_WHOLE_DISK)
+                                       state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK;
+                       }
                }
                slot++;
        }
index b1b19fda7b22c8b742a88c40029db342dd57fd00..7f864d1f86d4747548ad0635cfe171462977226d 100644 (file)
@@ -3,5 +3,6 @@
  */
 
 #define SUN_LABEL_MAGIC          0xDABE
+#define SUN_VTOC_SANITY          0x600DDEEE
 
 int sun_partition(struct parsed_partitions *state, struct block_device *bdev);
index d007830d9c870fabb4b887d3f81afcb8e7160642..6b3d91a691bf146edeeb7934a366e6ab4c0ff100 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -255,7 +255,7 @@ void generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
 
 /**
  * generic_pipe_buf_confirm - verify contents of the pipe buffer
- * @pipe:      the pipe that the buffer belongs to
+ * @info:      the pipe that the buffer belongs to
  * @buf:       the buffer to confirm
  *
  * Description:
index 94e2c1adf184f157413fe9d91def4a0e447850ea..a5b0dfd89a17043b262261b55a55a3a0f284f286 100644 (file)
@@ -386,6 +386,19 @@ static const struct file_operations proc_reg_file_ops = {
        .release        = proc_reg_release,
 };
 
+#ifdef CONFIG_COMPAT
+static const struct file_operations proc_reg_file_ops_no_compat = {
+       .llseek         = proc_reg_llseek,
+       .read           = proc_reg_read,
+       .write          = proc_reg_write,
+       .poll           = proc_reg_poll,
+       .unlocked_ioctl = proc_reg_unlocked_ioctl,
+       .mmap           = proc_reg_mmap,
+       .open           = proc_reg_open,
+       .release        = proc_reg_release,
+};
+#endif
+
 struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
                                struct proc_dir_entry *de)
 {
@@ -413,8 +426,15 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
                if (de->proc_iops)
                        inode->i_op = de->proc_iops;
                if (de->proc_fops) {
-                       if (S_ISREG(inode->i_mode))
-                               inode->i_fop = &proc_reg_file_ops;
+                       if (S_ISREG(inode->i_mode)) {
+#ifdef CONFIG_COMPAT
+                               if (!de->proc_fops->compat_ioctl)
+                                       inode->i_fop =
+                                               &proc_reg_file_ops_no_compat;
+                               else
+#endif
+                                       inode->i_fop = &proc_reg_file_ops;
+                       }
                        else
                                inode->i_fop = de->proc_fops;
                }
index 0a09732180847ce6cb7d67f91477c2314296003a..c010a72ca2d2a3543fb2a7365b2e8c5b4c73b652 100644 (file)
@@ -164,7 +164,7 @@ static const struct pipe_buf_operations user_page_pipe_buf_ops = {
  * @spd:       data to fill
  *
  * Description:
- *    @spd contains a map of pages and len/offset tupples, a long with
+ *    @spd contains a map of pages and len/offset tuples, along with
  *    the struct pipe_buf_operations associated with these pages. This
  *    function will link that data to the pipe.
  *
@@ -1000,7 +1000,7 @@ static long do_splice_to(struct file *in, loff_t *ppos,
  * Description:
  *    This is a special case helper to splice directly between two
  *    points, without requiring an explicit pipe. Internally an allocated
- *    pipe is cached in the process, and reused during the life time of
+ *    pipe is cached in the process, and reused during the lifetime of
  *    that process.
  *
  */
index 533ef40f7ccfa8f636acc097d65b4970b022732d..3d0fea235bf341af95fb417dcea94d0872ae643b 100644 (file)
@@ -366,7 +366,16 @@ acpi_handle acpi_get_child(acpi_handle, acpi_integer);
 acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
 #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
 
+#ifdef CONFIG_PM_SLEEP
 int acpi_pm_device_sleep_state(struct device *, int, int *);
+#else /* !CONFIG_PM_SLEEP */
+static inline int acpi_pm_device_sleep_state(struct device *d, int w, int *p)
+{
+       if (p)
+               *p = ACPI_STATE_D0;
+       return ACPI_STATE_D3;
+}
+#endif /* !CONFIG_PM_SLEEP */
 
 #endif                         /* CONFIG_ACPI */
 
index f85f77a538aa67afb418b4b35ba8c3ccd945516f..202acb9ff4d071299cb0926c8887cc5d3b57bd53 100644 (file)
@@ -147,6 +147,10 @@ static inline void unregister_hotplug_dock_device(acpi_handle handle)
 /*--------------------------------------------------------------------------
                                   Suspend/Resume
   -------------------------------------------------------------------------- */
+#ifdef CONFIG_ACPI_SLEEP
 extern int acpi_sleep_init(void);
+#else
+static inline int acpi_sleep_init(void) { return 0; }
+#endif
 
 #endif /*__ACPI_DRIVERS_H__*/
index ec5787d0e78cac6c714b5b5347041a4749625a41..42cc0cb3fefd40343ae2380cb9969d6ea2570f05 100644 (file)
@@ -26,7 +26,6 @@
 #define __MXC_BOOT_UNCOMPRESS
 
 #include <asm/hardware.h>
-#include <asm/processor.h>
 
 #define UART(x) (*(volatile unsigned long *)(serial_port + (x)))
 
@@ -62,7 +61,7 @@ static void putc(int ch)
        }
 
        while (!(UART(USR2) & USR2_TXFE))
-               cpu_relax();
+               barrier();
 
        UART(TXR) = ch;
 }
index c4d6cbbf96d490283df0a12fb6375f63f16a16b1..a970781a0f98a25cad63f9202164f0674d572022 100644 (file)
@@ -61,6 +61,7 @@ extern void bfin_dcache_init(void);
 extern int read_iloc(void);
 extern int bfin_console_init(void);
 extern asmlinkage void lower_to_irq14(void);
+extern void init_exception_vectors(void);
 extern void init_dma(void);
 extern void program_IAR(void);
 extern void evt14_softirq(void);
index 98d35a9291165d61cacc8167ac24b48d5724be1b..cdf29e75ea598922b3091c6e7c526dffd92e31cb 100644 (file)
@@ -242,6 +242,39 @@ static __inline__ void bfin_write_VR_CTL(unsigned int val)
 #define bfin_read_TWI0_RCV_DATA16()            bfin_read16(TWI0_RCV_DATA16)
 #define bfin_write_TWI0_RCV_DATA16(val)                bfin_write16(TWI0_RCV_DATA16, val)
 
+#define bfin_read_TWI_CLKDIV()                 bfin_read16(TWI0_CLKDIV)
+#define bfin_write_TWI_CLKDIV(val)             bfin_write16(TWI0_CLKDIV, val)
+#define bfin_read_TWI_CONTROL()                        bfin_read16(TWI0_CONTROL)
+#define bfin_write_TWI_CONTROL(val)            bfin_write16(TWI0_CONTROL, val)
+#define bfin_read_TWI_SLAVE_CTRL()             bfin_read16(TWI0_SLAVE_CTRL)
+#define bfin_write_TWI_SLAVE_CTRL(val)         bfin_write16(TWI0_SLAVE_CTRL, val)
+#define bfin_read_TWI_SLAVE_STAT()             bfin_read16(TWI0_SLAVE_STAT)
+#define bfin_write_TWI_SLAVE_STAT(val)         bfin_write16(TWI0_SLAVE_STAT, val)
+#define bfin_read_TWI_SLAVE_ADDR()             bfin_read16(TWI0_SLAVE_ADDR)
+#define bfin_write_TWI_SLAVE_ADDR(val)         bfin_write16(TWI0_SLAVE_ADDR, val)
+#define bfin_read_TWI_MASTER_CTL()             bfin_read16(TWI0_MASTER_CTRL)
+#define bfin_write_TWI_MASTER_CTL(val)         bfin_write16(TWI0_MASTER_CTRL, val)
+#define bfin_read_TWI_MASTER_STAT()            bfin_read16(TWI0_MASTER_STAT)
+#define bfin_write_TWI_MASTER_STAT(val)                bfin_write16(TWI0_MASTER_STAT, val)
+#define bfin_read_TWI_MASTER_ADDR()            bfin_read16(TWI0_MASTER_ADDR)
+#define bfin_write_TWI_MASTER_ADDR(val)                bfin_write16(TWI0_MASTER_ADDR, val)
+#define bfin_read_TWI_INT_STAT()               bfin_read16(TWI0_INT_STAT)
+#define bfin_write_TWI_INT_STAT(val)           bfin_write16(TWI0_INT_STAT, val)
+#define bfin_read_TWI_INT_MASK()               bfin_read16(TWI0_INT_MASK)
+#define bfin_write_TWI_INT_MASK(val)           bfin_write16(TWI0_INT_MASK, val)
+#define bfin_read_TWI_FIFO_CTL()               bfin_read16(TWI0_FIFO_CTRL)
+#define bfin_write_TWI_FIFO_CTL(val)           bfin_write16(TWI0_FIFO_CTRL, val)
+#define bfin_read_TWI_FIFO_STAT()              bfin_read16(TWI0_FIFO_STAT)
+#define bfin_write_TWI_FIFO_STAT(val)          bfin_write16(TWI0_FIFO_STAT, val)
+#define bfin_read_TWI_XMT_DATA8()              bfin_read16(TWI0_XMT_DATA8)
+#define bfin_write_TWI_XMT_DATA8(val)          bfin_write16(TWI0_XMT_DATA8, val)
+#define bfin_read_TWI_XMT_DATA16()             bfin_read16(TWI0_XMT_DATA16)
+#define bfin_write_TWI_XMT_DATA16(val)         bfin_write16(TWI0_XMT_DATA16, val)
+#define bfin_read_TWI_RCV_DATA8()              bfin_read16(TWI0_RCV_DATA8)
+#define bfin_write_TWI_RCV_DATA8(val)          bfin_write16(TWI0_RCV_DATA8, val)
+#define bfin_read_TWI_RCV_DATA16()             bfin_read16(TWI0_RCV_DATA16)
+#define bfin_write_TWI_RCV_DATA16(val)         bfin_write16(TWI0_RCV_DATA16, val)
+
 /* SPORT0 is not defined in the shared file because it is not available on the ADSP-BF542 and ADSP-BF544 bfin_read_()rocessors */
 
 /* SPORT1 Registers */
index 0b3325bb1fffa97669d6dd0db9083026f9a19d43..e548d3cd81e31b3b0099f4d25536b763b5ea35a3 100644 (file)
@@ -112,6 +112,7 @@ Events         (highest priority)  EMU         0
 #define IRQ_ATAPI_TX   BFIN_IRQ(44)    /* ATAPI TX (DMA11) Interrupt */
 #define IRQ_TWI0       BFIN_IRQ(45)    /* TWI0 Interrupt */
 #define IRQ_TWI1       BFIN_IRQ(46)    /* TWI1 Interrupt */
+#define IRQ_TWI                IRQ_TWI0        /* TWI Interrupt */
 #define IRQ_CAN0_RX    BFIN_IRQ(47)    /* CAN0 Receive Interrupt */
 #define IRQ_CAN0_TX    BFIN_IRQ(48)    /* CAN0 Transmit Interrupt */
 #define IRQ_MDMAS2     BFIN_IRQ(49)    /* MDMA Stream 2 Interrupt */
index 1a8ec9e46922295ecd513de90bd2a608defe534e..6e87ab269ffe577b6ad301a1b8cf11a6723cd06e 100644 (file)
@@ -81,6 +81,12 @@ static __inline__ void bfin_write_VR_CTL(unsigned int val)
 #define bfin_write_PLL_LOCKCNT(val)          bfin_write16(PLL_LOCKCNT,val)
 #define bfin_read_CHIPID()                   bfin_read32(CHIPID)
 
+/* For MMR's that are reserved on Core B, set up defines to better integrate with other ports */
+#define bfin_read_SWRST()                    bfin_read_SICA_SWRST()
+#define bfin_write_SWRST()                   bfin_write_SICA_SWRST()
+#define bfin_read_SYSCR()                    bfin_read_SICA_SYSCR()
+#define bfin_write_SYSCR()                   bfin_write_SICA_SYSCR()
+
 /* System Reset and Interrupt Controller registers for core A (0xFFC0 0100-0xFFC0 01FF) */
 #define bfin_read_SICA_SWRST()               bfin_read16(SICA_SWRST)
 #define bfin_write_SICA_SWRST(val)           bfin_write16(SICA_SWRST,val)
index 89150ecb909d58c1b30402856adf6911a6fee810..0f2dc6e6335b60b108eedbeeed11b8c6a7d495b7 100644 (file)
 #define PLL_LOCKCNT            0xFFC00010      /* PLL Lock Count register (16-bit) */
 #define CHIPID                 0xFFC00014       /* Chip ID Register */
 
+/* For MMR's that are reserved on Core B, set up defines to better integrate with other ports */
+#define SWRST                   SICA_SWRST
+#define SYSCR                   SICA_SYSCR
+
 /* System Reset and Interrupt Controller registers for core A (0xFFC0 0100-0xFFC0 01FF) */
 #define SICA_SWRST              0xFFC00100     /* Software Reset register */
 #define SICA_SYSCR              0xFFC00104     /* System Reset Configuration register */
index fa8f08cf283e2692f6c5291c229721ba96e05287..34d3c2eec949d2b87cce6c397868f1decb43c6bb 100644 (file)
  */
 #define ALIGN_PAGE_MASK         0xffffe000
 
+/*
+ * Size of kernel stack for each process. This must be a power of 2...
+ */
+#define THREAD_SIZE            8192    /* 2 pages */
+
 #ifndef __ASSEMBLY__
 
 typedef unsigned long mm_segment_t;
@@ -76,11 +81,6 @@ struct thread_info {
 #define init_thread_info       (init_thread_union.thread_info)
 #define init_stack             (init_thread_union.stack)
 
-/*
- * Size of kernel stack for each process. This must be a power of 2...
- */
-#define THREAD_SIZE            8192    /* 2 pages */
-
 /* How to get the thread information struct from C */
 
 static inline struct thread_info *current_thread_info(void)
@@ -94,7 +94,7 @@ static inline struct thread_info *current_thread_info(void)
        struct thread_info *ti;
       __asm__("%0 = sp;": "=&d"(ti):
        );
-       return (struct thread_info *)((long)ti & ~8191UL);
+       return (struct thread_info *)((long)ti & ~((long)THREAD_SIZE-1));
 }
 
 /* thread information allocation */
index 43114c824608b21f96c89a814b5499c1d71008d3..cf67dbb1db79a21e8430be37597b3a42196ad948 100644 (file)
@@ -47,7 +47,7 @@ extern void e820_register_memory(void);
 extern void limit_regions(unsigned long long size);
 extern void print_memory_map(char *who);
 
-#if defined(CONFIG_PM) && defined(CONFIG_SOFTWARE_SUSPEND)
+#if defined(CONFIG_PM) && defined(CONFIG_HIBERNATION)
 extern void e820_mark_nosave_regions(void);
 #else
 static inline void e820_mark_nosave_regions(void)
index 198878b53a618c92cf5f37261b0476807754c722..caa9b1663e452d509c9c2055335442ff44631edb 100644 (file)
@@ -46,6 +46,22 @@ asmlinkage void resume(void);
 } while (0)
 
 
+/*
+ * Force strict CPU ordering.
+ * Not really required on m68k...
+ */
+#define nop()          do { asm volatile ("nop"); barrier(); } while (0)
+#define mb()           barrier()
+#define rmb()          barrier()
+#define wmb()          barrier()
+#define read_barrier_depends() ((void)0)
+#define set_mb(var, value)     ({ (var) = (value); wmb(); })
+
+#define smp_mb()       barrier()
+#define smp_rmb()      barrier()
+#define smp_wmb()      barrier()
+#define smp_read_barrier_depends()     ((void)0)
+
 /* interrupt control.. */
 #if 0
 #define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory")
@@ -70,23 +86,6 @@ static inline int irqs_disabled(void)
 /* For spinlocks etc */
 #define local_irq_save(x)      ({ local_save_flags(x); local_irq_disable(); })
 
-/*
- * Force strict CPU ordering.
- * Not really required on m68k...
- */
-#define nop()          do { asm volatile ("nop"); barrier(); } while (0)
-#define mb()           barrier()
-#define rmb()          barrier()
-#define wmb()          barrier()
-#define read_barrier_depends() ((void)0)
-#define set_mb(var, value)     ({ (var) = (value); wmb(); })
-
-#define smp_mb()       barrier()
-#define smp_rmb()      barrier()
-#define smp_wmb()      barrier()
-#define smp_read_barrier_depends()     ((void)0)
-
-
 #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
 
 struct __xchg_dummy { unsigned long a[100]; };
index 2b75a300df4f3d7a2f6dec8b301ed3ef30bf764c..708d7863ba687624f04a89257f31079283ba8f84 100644 (file)
@@ -1,50 +1,19 @@
 #ifndef _M68KNOMMU_MACHDEP_H
 #define _M68KNOMMU_MACHDEP_H
 
-#include <linux/seq_file.h>
 #include <linux/interrupt.h>
 
-struct pt_regs;
-struct kbd_repeat;
-struct mktime;
-struct hwclk_time;
-struct gendisk;
-struct buffer_head;
-
-extern void (*mach_sched_init) (irqreturn_t (*handler)(int, void *, struct pt_regs *));
-/* machine dependent keyboard functions */
-extern int (*mach_keyb_init) (void);
-extern int (*mach_kbdrate) (struct kbd_repeat *);
-extern void (*mach_kbd_leds) (unsigned int);
-/* machine dependent irq functions */
-extern void (*mach_init_IRQ) (void);
-extern irq_handler_t mach_default_handler;
-extern int (*mach_request_irq) (unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
-                                unsigned long flags, const char *devname, void *dev_id);
-extern void (*mach_free_irq) (unsigned int irq, void *dev_id);
-extern void (*mach_get_model) (char *model);
-extern int (*mach_get_hardware_list) (char *buffer);
-extern int (*mach_get_irq_list) (struct seq_file *p, void *v);
-extern void (*mach_process_int) (int irq, struct pt_regs *fp);
+extern void (*mach_sched_init) (irq_handler_t handler);
 /* machine dependent timer functions */
 extern unsigned long (*mach_gettimeoffset)(void);
 extern void (*mach_gettod)(int *year, int *mon, int *day, int *hour,
                           int *min, int *sec);
-extern int (*mach_hwclk)(int, struct hwclk_time*);
 extern int (*mach_set_clock_mmss)(unsigned long);
+
+/* machine dependent power off functions */
 extern void (*mach_reset)( void );
 extern void (*mach_halt)( void );
 extern void (*mach_power_off)( void );
-extern unsigned long (*mach_hd_init) (unsigned long, unsigned long);
-extern void (*mach_hd_setup)(char *, int *);
-extern long mach_max_dma_address;
-extern void (*mach_floppy_eject)(void);
-extern void (*mach_heartbeat) (int);
-extern void (*mach_l2_flush) (int);
-extern int mach_sysrq_key;
-extern int mach_sysrq_shift_state;
-extern int mach_sysrq_shift_mask;
-extern char *mach_sysrq_xlate;
 
 extern void config_BSP(char *command, int len);
 extern void (*mach_tick)(void);
index 4c2e1710f15724ad7d170adb25723683245a30e1..1aeda27d5a8bb33e9aae6408391d387b7614699b 100644 (file)
@@ -165,11 +165,6 @@ extern int ccw_device_resume(struct ccw_device *);
 extern int ccw_device_halt(struct ccw_device *, unsigned long);
 extern int ccw_device_clear(struct ccw_device *, unsigned long);
 
-extern int __deprecated read_dev_chars(struct ccw_device *cdev, void **buffer, int length);
-extern int __deprecated read_conf_data(struct ccw_device *cdev, void **buffer, int *length);
-extern int __deprecated read_conf_data_lpm(struct ccw_device *cdev, void **buffer,
-                             int *length, __u8 lpm);
-
 extern int ccw_device_set_online(struct ccw_device *cdev);
 extern int ccw_device_set_offline(struct ccw_device *cdev);
 
index df9b1017b703a6ff9693212f3b170392ce164191..1e72362cad78b6a50e2200325479617a3ac4a06f 100644 (file)
@@ -10,6 +10,8 @@
  *               Martin Schwidefsky (schwidefsky@de.ibm.com)
  */
 
+#include <linux/types.h>
+
 typedef void (*ext_int_handler_t)(__u16 code);
 
 /*
index 76e424f718c63bb98ca8225b50e02bde5a873353..07708c07701e434f9ddaa905864045efe32c07a6 100644 (file)
@@ -36,8 +36,7 @@ extern void machine_halt_smp(void);
 extern void machine_power_off_smp(void);
 
 extern void smp_setup_cpu_possible_map(void);
-extern int smp_call_function_on(void (*func) (void *info), void *info,
-                               int nonatomic, int wait, int cpu);
+
 #define NO_PROC_ID             0xFF            /* No processor magic marker */
 
 /*
@@ -96,14 +95,6 @@ extern int __cpu_up (unsigned int cpu);
 #endif
 
 #ifndef CONFIG_SMP
-static inline int
-smp_call_function_on(void (*func) (void *info), void *info,
-                    int nonatomic, int wait, int cpu)
-{
-       func(info);
-       return 0;
-}
-
 static inline void smp_send_stop(void)
 {
        /* Disable all interrupts/machine checks */
index 790c1c557417bb1330662399350f71fe4b6f05b4..f04acb2670a8121e3d99121e65d00c285cbf34d1 100644 (file)
 #define __NR_getcpu            311
 #define __NR_epoll_pwait       312
 #define __NR_utimes            313
-/* Number 314 is reserved for new sys_fallocate */
+#define __NR_fallocate         314
 #define __NR_utimensat         315
 #define __NR_signalfd          316
 #define __NR_timerfd           317
index 4a56d84d69c427d461ff8ba097d21ba75dc4365b..c0a7786d65f7768403f10ab5ce93e93d31490e96 100644 (file)
@@ -10,6 +10,10 @@ struct device_node;
 struct of_device;
 
 struct dev_archdata {
+       void                    *iommu;
+       void                    *stc;
+       void                    *host_controller;
+
        struct device_node      *prom_node;
        struct of_device        *op;
 };
index 9073c84218ce549204aa873d629d0275d47f1b5e..28ce2b9c3da80708af5e9c02995643a4cc3af769 100644 (file)
@@ -101,6 +101,29 @@ static struct sun_floppy_ops sun_fdops;
 #define CROSS_64KB(a,s) (0)
 
 /* Routines unique to each controller type on a Sun. */
+static void sun_set_dor(unsigned char value, int fdc_82077)
+{
+       if (sparc_cpu_model == sun4c) {
+               unsigned int bits = 0;
+               if (value & 0x10)
+                       bits |= AUXIO_FLPY_DSEL;
+               if ((value & 0x80) == 0)
+                       bits |= AUXIO_FLPY_EJCT;
+               set_auxio(bits, (~bits) & (AUXIO_FLPY_DSEL|AUXIO_FLPY_EJCT));
+       }
+       if (fdc_82077) {
+               sun_fdc->dor_82077 = value;
+       }
+}
+
+static unsigned char sun_read_dir(void)
+{
+       if (sparc_cpu_model == sun4c)
+               return (get_auxio() & AUXIO_FLPY_DCHG) ? 0x80 : 0;
+       else
+               return sun_fdc->dir_82077;
+}
+
 static unsigned char sun_82072_fd_inb(int port)
 {
        udelay(5);
@@ -113,7 +136,7 @@ static unsigned char sun_82072_fd_inb(int port)
        case 5: /* FD_DATA */
                return sun_fdc->data_82072;
        case 7: /* FD_DIR */
-               return (get_auxio() & AUXIO_FLPY_DCHG)? 0x80: 0;
+               return sun_read_dir();
        };
        panic("sun_82072_fd_inb: How did I get here?");
 }
@@ -126,20 +149,7 @@ static void sun_82072_fd_outb(unsigned char value, int port)
                printk("floppy: Asked to write to unknown port %d\n", port);
                panic("floppy: Port bolixed.");
        case 2: /* FD_DOR */
-               /* Oh geese, 82072 on the Sun has no DOR register,
-                * the functionality is implemented via the AUXIO
-                * I/O register.  So we must emulate the behavior.
-                *
-                * ASSUMPTIONS:  There will only ever be one floppy
-                *               drive attached to a Sun controller
-                *               and it will be at drive zero.
-                */
-               {
-                       unsigned bits = 0;
-                       if (value & 0x10) bits |= AUXIO_FLPY_DSEL;
-                       if ((value & 0x80) == 0) bits |= AUXIO_FLPY_EJCT;
-                       set_auxio(bits, (~bits) & (AUXIO_FLPY_DSEL|AUXIO_FLPY_EJCT));
-               }
+               sun_set_dor(value, 0);
                break;
        case 5: /* FD_DATA */
                sun_fdc->data_82072 = value;
@@ -161,15 +171,22 @@ static unsigned char sun_82077_fd_inb(int port)
        default:
                printk("floppy: Asked to read unknown port %d\n", port);
                panic("floppy: Port bolixed.");
+       case 0: /* FD_STATUS_0 */
+               return sun_fdc->status1_82077;
+       case 1: /* FD_STATUS_1 */
+               return sun_fdc->status2_82077;
+       case 2: /* FD_DOR */
+               return sun_fdc->dor_82077;
+       case 3: /* FD_TDR */
+               return sun_fdc->tapectl_82077;
        case 4: /* FD_STATUS */
                return sun_fdc->status_82077 & ~STATUS_DMA;
        case 5: /* FD_DATA */
                return sun_fdc->data_82077;
        case 7: /* FD_DIR */
-               /* XXX: Is DCL on 0x80 in sun4m? */
-               return sun_fdc->dir_82077;
+               return sun_read_dir();
        };
-       panic("sun_82072_fd_inb: How did I get here?");
+       panic("sun_82077_fd_inb: How did I get here?");
 }
 
 static void sun_82077_fd_outb(unsigned char value, int port)
@@ -180,8 +197,7 @@ static void sun_82077_fd_outb(unsigned char value, int port)
                printk("floppy: Asked to write to unknown port %d\n", port);
                panic("floppy: Port bolixed.");
        case 2: /* FD_DOR */
-               /* Happily, the 82077 has a real DOR register. */
-               sun_fdc->dor_82077 = value;
+               sun_set_dor(value, 1);
                break;
        case 5: /* FD_DATA */
                sun_fdc->data_82077 = value;
@@ -192,6 +208,9 @@ static void sun_82077_fd_outb(unsigned char value, int port)
        case 4: /* FD_STATUS */
                sun_fdc->status_82077 = value;
                break;
+       case 3: /* FD_TDR */
+               sun_fdc->tapectl_82077 = value;
+               break;
        };
        return;
 }
@@ -332,16 +351,17 @@ static int sun_floppy_init(void)
                goto no_sun_fdc;
        }
 
-        if(sparc_cpu_model == sun4c) {
-                sun_fdops.fd_inb = sun_82072_fd_inb;
-                sun_fdops.fd_outb = sun_82072_fd_outb;
-                fdc_status = &sun_fdc->status_82072;
-                /* printk("AUXIO @0x%lx\n", auxio_register); */ /* P3 */
-        } else {
-                sun_fdops.fd_inb = sun_82077_fd_inb;
-                sun_fdops.fd_outb = sun_82077_fd_outb;
-                fdc_status = &sun_fdc->status_82077;
-                /* printk("DOR @0x%p\n", &sun_fdc->dor_82077); */ /* P3 */
+       sun_fdops.fd_inb = sun_82077_fd_inb;
+       sun_fdops.fd_outb = sun_82077_fd_outb;
+       fdc_status = &sun_fdc->status_82077;
+
+       if (sun_fdc->dor_82077 == 0x80) {
+               sun_fdc->dor_82077 = 0x02;
+               if (sun_fdc->dor_82077 == 0x80) {
+                       sun_fdops.fd_inb = sun_82072_fd_inb;
+                       sun_fdops.fd_outb = sun_82072_fd_outb;
+                       fdc_status = &sun_fdc->status_82072;
+               }
        }
 
        /* Success... */
index c58ec1661df864d69c9ff46ebeed26e247727581..0a1006692bb253a601ae7e6e2187e8a983e37767 100644 (file)
 #ifndef _ASM_SPARC64_DMA_MAPPING_H
 #define _ASM_SPARC64_DMA_MAPPING_H
 
-
-#ifdef CONFIG_PCI
-
-/* we implement the API below in terms of the existing PCI one,
- * so include it */
-#include <linux/pci.h>
-/* need struct page definitions */
+#include <linux/scatterlist.h>
 #include <linux/mm.h>
 
-#include <asm/of_device.h>
-
-static inline int
-dma_supported(struct device *dev, u64 mask)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       return pci_dma_supported(to_pci_dev(dev), mask);
-}
-
-static inline int
-dma_set_mask(struct device *dev, u64 dma_mask)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       return pci_set_dma_mask(to_pci_dev(dev), dma_mask);
-}
-
-static inline void *
-dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
-                  gfp_t flag)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       return pci_iommu_ops->alloc_consistent(to_pci_dev(dev), size, dma_handle, flag);
-}
-
-static inline void
-dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
-                   dma_addr_t dma_handle)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_free_consistent(to_pci_dev(dev), size, cpu_addr, dma_handle);
-}
-
-static inline dma_addr_t
-dma_map_single(struct device *dev, void *cpu_addr, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       return pci_map_single(to_pci_dev(dev), cpu_addr, size, (int)direction);
-}
-
-static inline void
-dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_unmap_single(to_pci_dev(dev), dma_addr, size, (int)direction);
-}
-
-static inline dma_addr_t
-dma_map_page(struct device *dev, struct page *page,
-            unsigned long offset, size_t size,
-            enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       return pci_map_page(to_pci_dev(dev), page, offset, size, (int)direction);
-}
-
-static inline void
-dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_unmap_page(to_pci_dev(dev), dma_address, size, (int)direction);
-}
-
-static inline int
-dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-          enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       return pci_map_sg(to_pci_dev(dev), sg, nents, (int)direction);
-}
-
-static inline void
-dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-            enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_unmap_sg(to_pci_dev(dev), sg, nhwentries, (int)direction);
-}
-
-static inline void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-                       enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_dma_sync_single_for_cpu(to_pci_dev(dev), dma_handle,
-                                   size, (int)direction);
-}
-
-static inline void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-                          enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_dma_sync_single_for_device(to_pci_dev(dev), dma_handle,
-                                      size, (int)direction);
-}
-
-static inline void
-dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-                   enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_dma_sync_sg_for_cpu(to_pci_dev(dev), sg, nelems, (int)direction);
-}
-
-static inline void
-dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-                      enum dma_data_direction direction)
-{
-       BUG_ON(dev->bus != &pci_bus_type);
-
-       pci_dma_sync_sg_for_device(to_pci_dev(dev), sg, nelems, (int)direction);
-}
-
-static inline int
-dma_mapping_error(dma_addr_t dma_addr)
-{
-       return pci_dma_mapping_error(dma_addr);
-}
-
-#else
-
-struct device;
-struct page;
-struct scatterlist;
-
-static inline int
-dma_supported(struct device *dev, u64 mask)
-{
-       BUG();
-       return 0;
-}
-
-static inline int
-dma_set_mask(struct device *dev, u64 dma_mask)
-{
-       BUG();
-       return 0;
-}
+#define DMA_ERROR_CODE (~(dma_addr_t)0x0)
+
+struct dma_ops {
+       void *(*alloc_coherent)(struct device *dev, size_t size,
+                               dma_addr_t *dma_handle, gfp_t flag);
+       void (*free_coherent)(struct device *dev, size_t size,
+                             void *cpu_addr, dma_addr_t dma_handle);
+       dma_addr_t (*map_single)(struct device *dev, void *cpu_addr,
+                                size_t size,
+                                enum dma_data_direction direction);
+       void (*unmap_single)(struct device *dev, dma_addr_t dma_addr,
+                            size_t size,
+                            enum dma_data_direction direction);
+       int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents,
+                     enum dma_data_direction direction);
+       void (*unmap_sg)(struct device *dev, struct scatterlist *sg,
+                        int nhwentries,
+                        enum dma_data_direction direction);
+       void (*sync_single_for_cpu)(struct device *dev,
+                                   dma_addr_t dma_handle, size_t size,
+                                   enum dma_data_direction direction);
+       void (*sync_single_for_device)(struct device *dev,
+                                      dma_addr_t dma_handle, size_t size,
+                                      enum dma_data_direction direction);
+       void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg,
+                               int nelems,
+                               enum dma_data_direction direction);
+       void (*sync_sg_for_device)(struct device *dev, struct scatterlist *sg,
+                                  int nelems,
+                                  enum dma_data_direction direction);
+};
+extern const struct dma_ops *dma_ops;
+
+extern int dma_supported(struct device *dev, u64 mask);
+extern int dma_set_mask(struct device *dev, u64 dma_mask);
 
 static inline void *dma_alloc_coherent(struct device *dev, size_t size,
-                        dma_addr_t *dma_handle, gfp_t flag)
+                                      dma_addr_t *dma_handle, gfp_t flag)
 {
-       BUG();
-       return NULL;
+       return dma_ops->alloc_coherent(dev, size, dma_handle, flag);
 }
 
 static inline void dma_free_coherent(struct device *dev, size_t size,
-                      void *vaddr, dma_addr_t dma_handle)
+                                    void *cpu_addr, dma_addr_t dma_handle)
 {
-       BUG();
+       dma_ops->free_coherent(dev, size, cpu_addr, dma_handle);
 }
 
-static inline dma_addr_t
-dma_map_single(struct device *dev, void *cpu_addr, size_t size,
-              enum dma_data_direction direction)
+static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr,
+                                       size_t size,
+                                       enum dma_data_direction direction)
 {
-       BUG();
-       return 0;
+       return dma_ops->map_single(dev, cpu_addr, size, direction);
 }
 
-static inline void
-dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                enum dma_data_direction direction)
+static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
+                                   size_t size,
+                                   enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->unmap_single(dev, dma_addr, size, direction);
 }
 
-static inline dma_addr_t
-dma_map_page(struct device *dev, struct page *page,
-            unsigned long offset, size_t size,
-            enum dma_data_direction direction)
+static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
+                                     unsigned long offset, size_t size,
+                                     enum dma_data_direction direction)
 {
-       BUG();
-       return 0;
+       return dma_ops->map_single(dev, page_address(page) + offset,
+                                  size, direction);
 }
 
-static inline void
-dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-              enum dma_data_direction direction)
+static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
+                                 size_t size,
+                                 enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->unmap_single(dev, dma_address, size, direction);
 }
 
-static inline int
-dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-          enum dma_data_direction direction)
+static inline int dma_map_sg(struct device *dev, struct scatterlist *sg,
+                            int nents, enum dma_data_direction direction)
 {
-       BUG();
-       return 0;
+       return dma_ops->map_sg(dev, sg, nents, direction);
 }
 
-static inline void
-dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-            enum dma_data_direction direction)
+static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
+                               int nents, enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->unmap_sg(dev, sg, nents, direction);
 }
 
-static inline void
-dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-                       enum dma_data_direction direction)
+static inline void dma_sync_single_for_cpu(struct device *dev,
+                                          dma_addr_t dma_handle, size_t size,
+                                          enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->sync_single_for_cpu(dev, dma_handle, size, direction);
 }
 
-static inline void
-dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-                          enum dma_data_direction direction)
+static inline void dma_sync_single_for_device(struct device *dev,
+                                             dma_addr_t dma_handle,
+                                             size_t size,
+                                             enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->sync_single_for_device(dev, dma_handle, size, direction);
 }
 
-static inline void
-dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-                   enum dma_data_direction direction)
+static inline void dma_sync_sg_for_cpu(struct device *dev,
+                                      struct scatterlist *sg, int nelems,
+                                      enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->sync_sg_for_cpu(dev, sg, nelems, direction);
 }
 
-static inline void
-dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-                      enum dma_data_direction direction)
+static inline void dma_sync_sg_for_device(struct device *dev,
+                                         struct scatterlist *sg, int nelems,
+                                         enum dma_data_direction direction)
 {
-       BUG();
+       dma_ops->sync_sg_for_device(dev, sg, nelems, direction);
 }
 
-static inline int
-dma_mapping_error(dma_addr_t dma_addr)
+static inline int dma_mapping_error(dma_addr_t dma_addr)
 {
-       BUG();
-       return 0;
+       return (dma_addr == DMA_ERROR_CODE);
 }
 
-#endif /* PCI */
-
-
-/* Now for the API extensions over the pci_ one */
-
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
 #define dma_is_consistent(d, h)        (1)
 
-static inline int
-dma_get_cache_alignment(void)
-{
-       /* no easy way to get cache size on all processors, so return
-        * the maximum possible, to be safe */
-       return (1 << INTERNODE_CACHE_SHIFT);
-}
-
-static inline void
-dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                             unsigned long offset, size_t size,
-                             enum dma_data_direction direction)
-{
-       /* just sync everything, that's all the pci API can do */
-       dma_sync_single_for_cpu(dev, dma_handle, offset+size, direction);
-}
-
-static inline void
-dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-                                unsigned long offset, size_t size,
-                                enum dma_data_direction direction)
-{
-       /* just sync everything, that's all the pci API can do */
-       dma_sync_single_for_device(dev, dma_handle, offset+size, direction);
-}
-
-static inline void
-dma_cache_sync(struct device *dev, void *vaddr, size_t size,
-              enum dma_data_direction direction)
-{
-       /* could define this in terms of the dma_cache ... operations,
-        * but if you get this on a platform, you should convert the platform
-        * to using the generic device DMA API */
-       BUG();
-}
-
 #endif /* _ASM_SPARC64_DMA_MAPPING_H */
index 500026d9f6e1b524fdc8c313586cd7141abf6e12..b9215a0907d3f429352edd0298dbc12dffbb8dca 100644 (file)
@@ -2,6 +2,7 @@
 #define __LINUX_FBIO_H
 
 #include <linux/compiler.h>
+#include <linux/types.h>
 
 /* Constants used for fbio SunOS compatibility */
 /* (C) 1996 Miguel de Icaza */
@@ -299,4 +300,31 @@ struct fb_clut32 {
 #define LEO_LD_GBL_MAP         0x01009000
 #define LEO_UNK2_MAP           0x0100a000
 
+#ifdef __KERNEL__
+struct  fbcmap32 {
+       int             index;          /* first element (0 origin) */
+       int             count;
+       u32             red;
+       u32             green;
+       u32             blue;
+};
+
+#define FBIOPUTCMAP32  _IOW('F', 3, struct fbcmap32)
+#define FBIOGETCMAP32  _IOW('F', 4, struct fbcmap32)
+
+struct fbcursor32 {
+       short set;              /* what to set, choose from the list above */
+       short enable;           /* cursor on/off */
+       struct fbcurpos pos;    /* cursor position */
+       struct fbcurpos hot;    /* cursor hot spot */
+       struct fbcmap32 cmap;   /* color map info */
+       struct fbcurpos size;   /* cursor bit map size */
+       u32     image;          /* cursor image bits */
+       u32     mask;           /* cursor mask bits */
+};
+
+#define FBIOSCURSOR32  _IOW('F', 24, struct fbcursor32)
+#define FBIOGCURSOR32  _IOW('F', 25, struct fbcursor32)
+#endif
+
 #endif /* __LINUX_FBIO_H */
index 4aa0925e1b1b6b784bf83850deb28a0be5b5e449..1783239c7b405a18003ea2b2372c73b18effbe1e 100644 (file)
@@ -1,7 +1,6 @@
-/* $Id: floppy.h,v 1.32 2001/10/26 17:59:36 davem Exp $
- * asm-sparc64/floppy.h: Sparc specific parts of the Floppy driver.
+/* floppy.h: Sparc specific parts of the Floppy driver.
  *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 1996, 2007 David S. Miller (davem@davemloft.net)
  * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  *
  * Ultra/PCI support added: Sep 1997  Eddie C. Dost  (ecd@skynet.be)
@@ -11,6 +10,7 @@
 #define __ASM_SPARC64_FLOPPY_H
 
 #include <linux/init.h>
+#include <linux/pci.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
index 0b1813f410454983c3936411ac87cf96a1c71c31..9eac6676caf10a5887a749c6a1811f21f6d45b48 100644 (file)
@@ -1,7 +1,6 @@
-/* $Id: iommu.h,v 1.10 2001/03/08 09:55:56 davem Exp $
- * iommu.h: Definitions for the sun5 IOMMU.
+/* iommu.h: Definitions for the sun5 IOMMU.
  *
- * Copyright (C) 1996, 1999 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 1996, 1999, 2007 David S. Miller (davem@davemloft.net)
  */
 #ifndef _SPARC64_IOMMU_H
 #define _SPARC64_IOMMU_H
@@ -33,6 +32,7 @@ struct iommu {
        unsigned long           iommu_tsbbase;
        unsigned long           iommu_flush;
        unsigned long           iommu_flushinv;
+       unsigned long           iommu_tags;
        unsigned long           iommu_ctxflush;
        unsigned long           write_complete_reg;
        unsigned long           dummy_page;
@@ -54,4 +54,7 @@ struct strbuf {
        volatile unsigned long  __flushflag_buf[(64+(64-1)) / sizeof(long)];
 };
 
-#endif /* !(_SPARC_IOMMU_H) */
+extern int iommu_table_init(struct iommu *iommu, int tsbsize,
+                           u32 dma_offset, u32 dma_addr_mask);
+
+#endif /* !(_SPARC64_IOMMU_H) */
index 600afe5ae2e3b21955a24ff081f949b6b12e2ded..8116e8f6062cad953e43ba8b7d0dc07743796079 100644 (file)
@@ -117,7 +117,7 @@ static int __devinit ecpp_probe(struct of_device *op, const struct of_device_id
        if (!strcmp(parent->name, "dma")) {
                p = parport_pc_probe_port(base, base + 0x400,
                                          op->irqs[0], PARPORT_DMA_NOFIFO,
-                                         op->dev.parent);
+                                         op->dev.parent->parent);
                if (!p)
                        return -ENOMEM;
                dev_set_drvdata(&op->dev, p);
index e11ac100f043469664c2870b90b3a1731de37e17..1393e57d50fb0c2bbee86edc1fb814d1bca90b39 100644 (file)
@@ -3,8 +3,7 @@
 
 #ifdef __KERNEL__
 
-#include <linux/fs.h>
-#include <linux/mm.h>
+#include <linux/dma-mapping.h>
 
 /* Can be used to override the logic in pci_scan_bus for skipping
  * already-configured bus numbers - to be used for buggy BIOSes
@@ -30,80 +29,42 @@ static inline void pcibios_penalize_isa_irq(int irq, int active)
        /* We don't do dynamic PCI IRQ allocation */
 }
 
-/* Dynamic DMA mapping stuff.
- */
-
 /* The PCI address space does not equal the physical memory
  * address space.  The networking and block device layers use
  * this boolean for bounce buffer decisions.
  */
 #define PCI_DMA_BUS_IS_PHYS    (0)
 
-#include <asm/scatterlist.h>
-
-struct pci_dev;
-
-struct pci_iommu_ops {
-       void *(*alloc_consistent)(struct pci_dev *, size_t, dma_addr_t *, gfp_t);
-       void (*free_consistent)(struct pci_dev *, size_t, void *, dma_addr_t);
-       dma_addr_t (*map_single)(struct pci_dev *, void *, size_t, int);
-       void (*unmap_single)(struct pci_dev *, dma_addr_t, size_t, int);
-       int (*map_sg)(struct pci_dev *, struct scatterlist *, int, int);
-       void (*unmap_sg)(struct pci_dev *, struct scatterlist *, int, int);
-       void (*dma_sync_single_for_cpu)(struct pci_dev *, dma_addr_t, size_t, int);
-       void (*dma_sync_sg_for_cpu)(struct pci_dev *, struct scatterlist *, int, int);
-};
-
-extern const struct pci_iommu_ops *pci_iommu_ops;
-
-/* Allocate and map kernel buffer using consistent mode DMA for a device.
- * hwdev should be valid struct pci_dev pointer for PCI devices.
- */
-static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *dma_handle)
+static inline void *pci_alloc_consistent(struct pci_dev *pdev, size_t size,
+                                        dma_addr_t *dma_handle)
 {
-       return pci_iommu_ops->alloc_consistent(hwdev, size, dma_handle, GFP_ATOMIC);
+       return dma_alloc_coherent(&pdev->dev, size, dma_handle, GFP_ATOMIC);
 }
 
-/* Free and unmap a consistent DMA buffer.
- * cpu_addr is what was returned from pci_alloc_consistent,
- * size must be the same as what as passed into pci_alloc_consistent,
- * and likewise dma_addr must be the same as what *dma_addrp was set to.
- *
- * References to the memory and mappings associated with cpu_addr/dma_addr
- * past this call are illegal.
- */
-static inline void pci_free_consistent(struct pci_dev *hwdev, size_t size, void *vaddr, dma_addr_t dma_handle)
+static inline void pci_free_consistent(struct pci_dev *pdev, size_t size,
+                                      void *vaddr, dma_addr_t dma_handle)
 {
-       return pci_iommu_ops->free_consistent(hwdev, size, vaddr, dma_handle);
+       return dma_free_coherent(&pdev->dev, size, vaddr, dma_handle);
 }
 
-/* Map a single buffer of the indicated size for DMA in streaming mode.
- * The 32-bit bus address to use is returned.
- *
- * Once the device is given the dma address, the device owns this memory
- * until either pci_unmap_single or pci_dma_sync_single_for_cpu is performed.
- */
-static inline dma_addr_t pci_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
+static inline dma_addr_t pci_map_single(struct pci_dev *pdev, void *ptr,
+                                       size_t size, int direction)
 {
-       return pci_iommu_ops->map_single(hwdev, ptr, size, direction);
+       return dma_map_single(&pdev->dev, ptr, size,
+                             (enum dma_data_direction) direction);
 }
 
-/* Unmap a single streaming mode DMA translation.  The dma_addr and size
- * must match what was provided for in a previous pci_map_single call.  All
- * other usages are undefined.
- *
- * After this call, reads by the cpu to the buffer are guaranteed to see
- * whatever the device wrote there.
- */
-static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, size_t size, int direction)
+static inline void pci_unmap_single(struct pci_dev *pdev, dma_addr_t dma_addr,
+                                   size_t size, int direction)
 {
-       pci_iommu_ops->unmap_single(hwdev, dma_addr, size, direction);
+       dma_unmap_single(&pdev->dev, dma_addr, size,
+                        (enum dma_data_direction) direction);
 }
 
-/* No highmem on sparc64, plus we have an IOMMU, so mapping pages is easy. */
 #define pci_map_page(dev, page, off, size, dir) \
        pci_map_single(dev, (page_address(page) + (off)), size, dir)
-#define pci_unmap_page(dev,addr,sz,dir) pci_unmap_single(dev,addr,sz,dir)
+#define pci_unmap_page(dev,addr,sz,dir) \
+       pci_unmap_single(dev,addr,sz,dir)
 
 /* pci_unmap_{single,page} is not a nop, thus... */
 #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)      \
@@ -119,75 +80,48 @@ static inline void pci_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
 #define pci_unmap_len_set(PTR, LEN_NAME, VAL)          \
        (((PTR)->LEN_NAME) = (VAL))
 
-/* Map a set of buffers described by scatterlist in streaming
- * mode for DMA.  This is the scatter-gather version of the
- * above pci_map_single interface.  Here the scatter gather list
- * elements are each tagged with the appropriate dma address
- * and length.  They are obtained via sg_dma_{address,length}(SG).
- *
- * NOTE: An implementation may be able to use a smaller number of
- *       DMA address/length pairs than there are SG table elements.
- *       (for example via virtual mapping capabilities)
- *       The routine returns the number of addr/length pairs actually
- *       used, at most nents.
- *
- * Device ownership issues as mentioned above for pci_map_single are
- * the same here.
- */
-static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, int direction)
+static inline int pci_map_sg(struct pci_dev *pdev, struct scatterlist *sg,
+                            int nents, int direction)
 {
-       return pci_iommu_ops->map_sg(hwdev, sg, nents, direction);
+       return dma_map_sg(&pdev->dev, sg, nents,
+                         (enum dma_data_direction) direction);
 }
 
-/* Unmap a set of streaming mode DMA translations.
- * Again, cpu read rules concerning calls here are the same as for
- * pci_unmap_single() above.
- */
-static inline void pci_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nhwents, int direction)
+static inline void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sg,
+                               int nents, int direction)
 {
-       pci_iommu_ops->unmap_sg(hwdev, sg, nhwents, direction);
+       dma_unmap_sg(&pdev->dev, sg, nents,
+                    (enum dma_data_direction) direction);
 }
 
-/* Make physical memory consistent for a single
- * streaming mode DMA translation after a transfer.
- *
- * If you perform a pci_map_single() but wish to interrogate the
- * buffer using the cpu, yet do not wish to teardown the PCI dma
- * mapping, you must call this function before doing so.  At the
- * next point you give the PCI dma address back to the card, you
- * must first perform a pci_dma_sync_for_device, and then the
- * device again owns the buffer.
- */
-static inline void pci_dma_sync_single_for_cpu(struct pci_dev *hwdev, dma_addr_t dma_handle, size_t size, int direction)
+static inline void pci_dma_sync_single_for_cpu(struct pci_dev *pdev,
+                                              dma_addr_t dma_handle,
+                                              size_t size, int direction)
 {
-       pci_iommu_ops->dma_sync_single_for_cpu(hwdev, dma_handle, size, direction);
+       dma_sync_single_for_cpu(&pdev->dev, dma_handle, size,
+                               (enum dma_data_direction) direction);
 }
 
-static inline void
-pci_dma_sync_single_for_device(struct pci_dev *hwdev, dma_addr_t dma_handle,
-                              size_t size, int direction)
+static inline void pci_dma_sync_single_for_device(struct pci_dev *pdev,
+                                                 dma_addr_t dma_handle,
+                                                 size_t size, int direction)
 {
        /* No flushing needed to sync cpu writes to the device.  */
-       BUG_ON(direction == PCI_DMA_NONE);
 }
 
-/* Make physical memory consistent for a set of streaming
- * mode DMA translations after a transfer.
- *
- * The same as pci_dma_sync_single_* but for a scatter-gather list,
- * same rules and usage.
- */
-static inline void pci_dma_sync_sg_for_cpu(struct pci_dev *hwdev, struct scatterlist *sg, int nelems, int direction)
+static inline void pci_dma_sync_sg_for_cpu(struct pci_dev *pdev,
+                                          struct scatterlist *sg,
+                                          int nents, int direction)
 {
-       pci_iommu_ops->dma_sync_sg_for_cpu(hwdev, sg, nelems, direction);
+       dma_sync_sg_for_cpu(&pdev->dev, sg, nents,
+                           (enum dma_data_direction) direction);
 }
 
-static inline void
-pci_dma_sync_sg_for_device(struct pci_dev *hwdev, struct scatterlist *sg,
-                       int nelems, int direction)
+static inline void pci_dma_sync_sg_for_device(struct pci_dev *pdev,
+                                             struct scatterlist *sg,
+                                             int nelems, int direction)
 {
        /* No flushing needed to sync cpu writes to the device.  */
-       BUG_ON(direction == PCI_DMA_NONE);
 }
 
 /* Return whether the given PCI device DMA address mask can
@@ -206,11 +140,9 @@ extern int pci_dma_supported(struct pci_dev *hwdev, u64 mask);
 #define PCI64_REQUIRED_MASK    (~(dma64_addr_t)0)
 #define PCI64_ADDR_BASE                0xfffc000000000000UL
 
-#define PCI_DMA_ERROR_CODE     (~(dma_addr_t)0x0)
-
 static inline int pci_dma_mapping_error(dma_addr_t dma_addr)
 {
-       return (dma_addr == PCI_DMA_ERROR_CODE);
+       return dma_mapping_error(dma_addr);
 }
 
 #ifdef CONFIG_PCI
index 7efd49d31bb8a55a71f9ce9d07dcdf3a2a2e920f..0151cad486f3c86454428d4af9c1ebfd88afc68c 100644 (file)
@@ -1,7 +1,6 @@
-/* $Id: sbus.h,v 1.14 2000/02/18 13:50:55 davem Exp $
- * sbus.h: Defines for the Sun SBus.
+/* sbus.h: Defines for the Sun SBus.
  *
- * Copyright (C) 1996, 1999 David S. Miller (davem@redhat.com)
+ * Copyright (C) 1996, 1999, 2007 David S. Miller (davem@davemloft.net)
  */
 
 #ifndef _SPARC64_SBUS_H
@@ -69,7 +68,6 @@ struct sbus_dev {
 /* This struct describes the SBus(s) found on this machine. */
 struct sbus_bus {
        struct of_device        ofdev;
-       void                    *iommu;         /* Opaque IOMMU cookie  */
        struct sbus_dev         *devices;       /* Tree of SBUS devices */
        struct sbus_bus         *next;          /* Next SBUS in system  */
        int                     prom_node;      /* OBP node of SBUS     */
@@ -102,9 +100,18 @@ extern struct sbus_bus *sbus_root;
 extern void sbus_set_sbus64(struct sbus_dev *, int);
 extern void sbus_fill_device_irq(struct sbus_dev *);
 
-/* These yield IOMMU mappings in consistent mode. */
-extern void *sbus_alloc_consistent(struct sbus_dev *, size_t, dma_addr_t *dma_addrp);
-extern void sbus_free_consistent(struct sbus_dev *, size_t, void *, dma_addr_t);
+static inline void *sbus_alloc_consistent(struct sbus_dev *sdev , size_t size,
+                                         dma_addr_t *dma_handle)
+{
+       return dma_alloc_coherent(&sdev->ofdev.dev, size,
+                                 dma_handle, GFP_ATOMIC);
+}
+
+static inline void sbus_free_consistent(struct sbus_dev *sdev, size_t size,
+                                       void *vaddr, dma_addr_t dma_handle)
+{
+       return dma_free_coherent(&sdev->ofdev.dev, size, vaddr, dma_handle);
+}
 
 #define SBUS_DMA_BIDIRECTIONAL DMA_BIDIRECTIONAL
 #define SBUS_DMA_TODEVICE      DMA_TO_DEVICE
@@ -112,18 +119,67 @@ extern void sbus_free_consistent(struct sbus_dev *, size_t, void *, dma_addr_t);
 #define        SBUS_DMA_NONE           DMA_NONE
 
 /* All the rest use streaming mode mappings. */
-extern dma_addr_t sbus_map_single(struct sbus_dev *, void *, size_t, int);
-extern void sbus_unmap_single(struct sbus_dev *, dma_addr_t, size_t, int);
-extern int sbus_map_sg(struct sbus_dev *, struct scatterlist *, int, int);
-extern void sbus_unmap_sg(struct sbus_dev *, struct scatterlist *, int, int);
+static inline dma_addr_t sbus_map_single(struct sbus_dev *sdev, void *ptr,
+                                        size_t size, int direction)
+{
+       return dma_map_single(&sdev->ofdev.dev, ptr, size,
+                             (enum dma_data_direction) direction);
+}
+
+static inline void sbus_unmap_single(struct sbus_dev *sdev,
+                                    dma_addr_t dma_addr, size_t size,
+                                    int direction)
+{
+       dma_unmap_single(&sdev->ofdev.dev, dma_addr, size,
+                        (enum dma_data_direction) direction);
+}
+
+static inline int sbus_map_sg(struct sbus_dev *sdev, struct scatterlist *sg,
+                             int nents, int direction)
+{
+       return dma_map_sg(&sdev->ofdev.dev, sg, nents,
+                         (enum dma_data_direction) direction);
+}
+
+static inline void sbus_unmap_sg(struct sbus_dev *sdev, struct scatterlist *sg,
+                                int nents, int direction)
+{
+       dma_unmap_sg(&sdev->ofdev.dev, sg, nents,
+                    (enum dma_data_direction) direction);
+}
 
 /* Finally, allow explicit synchronization of streamable mappings. */
-extern void sbus_dma_sync_single_for_cpu(struct sbus_dev *, dma_addr_t, size_t, int);
+static inline void sbus_dma_sync_single_for_cpu(struct sbus_dev *sdev,
+                                               dma_addr_t dma_handle,
+                                               size_t size, int direction)
+{
+       dma_sync_single_for_cpu(&sdev->ofdev.dev, dma_handle, size,
+                               (enum dma_data_direction) direction);
+}
 #define sbus_dma_sync_single sbus_dma_sync_single_for_cpu
-extern void sbus_dma_sync_single_for_device(struct sbus_dev *, dma_addr_t, size_t, int);
-extern void sbus_dma_sync_sg_for_cpu(struct sbus_dev *, struct scatterlist *, int, int);
+
+static inline void sbus_dma_sync_single_for_device(struct sbus_dev *sdev,
+                                                  dma_addr_t dma_handle,
+                                                  size_t size, int direction)
+{
+       /* No flushing needed to sync cpu writes to the device.  */
+}
+
+static inline void sbus_dma_sync_sg_for_cpu(struct sbus_dev *sdev,
+                                           struct scatterlist *sg,
+                                           int nents, int direction)
+{
+       dma_sync_sg_for_cpu(&sdev->ofdev.dev, sg, nents,
+                           (enum dma_data_direction) direction);
+}
 #define sbus_dma_sync_sg sbus_dma_sync_sg_for_cpu
-extern void sbus_dma_sync_sg_for_device(struct sbus_dev *, struct scatterlist *, int, int);
+
+static inline void sbus_dma_sync_sg_for_device(struct sbus_dev *sdev,
+                                              struct scatterlist *sg,
+                                              int nents, int direction)
+{
+       /* No flushing needed to sync cpu writes to the device.  */
+}
 
 extern void sbus_arch_bus_ranges_init(struct device_node *, struct sbus_bus *);
 extern void sbus_setup_iommu(struct sbus_bus *, struct device_node *);
index a1c96d9ee720c1032217a1aa4e06d6d31799eab2..b126c6f68e27b2080fe434fe15847a00058048fe 100644 (file)
@@ -483,8 +483,8 @@ struct request_queue
 #define QUEUE_FLAG_CLUSTER     0       /* cluster several segments into 1 */
 #define QUEUE_FLAG_QUEUED      1       /* uses generic tag queueing */
 #define QUEUE_FLAG_STOPPED     2       /* queue is stopped */
-#define        QUEUE_FLAG_READFULL     3       /* write queue has been filled */
-#define QUEUE_FLAG_WRITEFULL   4       /* read queue has been filled */
+#define        QUEUE_FLAG_READFULL     3       /* read queue has been filled */
+#define QUEUE_FLAG_WRITEFULL   4       /* write queue has been filled */
 #define QUEUE_FLAG_DEAD                5       /* queue being torn down */
 #define QUEUE_FLAG_REENTER     6       /* Re-entrancy avoidance */
 #define QUEUE_FLAG_PLUGGED     7       /* queue is plugged */
index f415f89e0ac84ae77ba4309bb9eb023007c8f399..102dc096e1cb62c7f89ee1a58f6a77e5bb8c3180 100644 (file)
@@ -53,15 +53,19 @@ struct bsg_class_device {
        struct class_device *class_dev;
        struct device *dev;
        int minor;
-       struct list_head list;
        struct request_queue *queue;
 };
 
 extern int bsg_register_queue(struct request_queue *, struct device *, const char *);
 extern void bsg_unregister_queue(struct request_queue *);
 #else
-#define bsg_register_queue(disk, dev, name)            (0)
-#define bsg_unregister_queue(disk)     do { } while (0)
+static inline int bsg_register_queue(struct request_queue * rq, struct device *dev, const char *name)
+{
+       return 0;
+}
+static inline void bsg_unregister_queue(struct request_queue *rq)
+{
+}
 #endif
 
 #endif /* __KERNEL__ */
index 93e4c3a6d1903239a3250c06c0cd1b7df007d36a..50839fe9e39e3b615b9acb5e3bc549a603d46a52 100644 (file)
@@ -29,6 +29,7 @@
 #ifdef __KERNEL__
 #include <linux/types.h>
 #else
+#include <asm/types.h>
 #include <stdint.h>
 #include <time.h>
 #endif
index c8e02de737f6b07a3443d53362aee0d3bc507087..efded00ad08c5003bebd89964bb8b8619630a2c2 100644 (file)
@@ -5,7 +5,7 @@
 
 #include <linux/sched.h>
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 /*
  * Check if a process has been frozen
  */
@@ -126,7 +126,7 @@ static inline void set_freezable(void)
        current->flags &= ~PF_NOFREEZE;
 }
 
-#else
+#else /* !CONFIG_PM_SLEEP */
 static inline int frozen(struct task_struct *p) { return 0; }
 static inline int freezing(struct task_struct *p) { return 0; }
 static inline void set_freeze_flag(struct task_struct *p) {}
@@ -143,6 +143,6 @@ static inline void freezer_do_not_count(void) {}
 static inline void freezer_count(void) {}
 static inline int freezer_should_skip(struct task_struct *p) { return 0; }
 static inline void set_freezable(void) {}
-#endif
+#endif /* !CONFIG_PM_SLEEP */
 
 #endif /* FREEZER_H_INCLUDED */
index 9756fc102a83f284a1040386bd076d6acca81cff..a47b8025d39935c18a66db9cc975a58fe8f85dda 100644 (file)
@@ -264,7 +264,7 @@ static inline void set_capacity(struct gendisk *disk, sector_t size)
 
 #ifdef CONFIG_SOLARIS_X86_PARTITION
 
-#define SOLARIS_X86_NUMSLICE   8
+#define SOLARIS_X86_NUMSLICE   16
 #define SOLARIS_X86_VTOC_SANE  (0x600DDEEEUL)
 
 struct solaris_x86_slice {
index 49b7053043adde30bcfc8475403fe39ba93ce5f6..e6a71c82d204699b6a18226e261a7beda4463ed7 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _LINUX_HUGETLB_H
 #define _LINUX_HUGETLB_H
 
+#include <linux/fs.h>
+
 #ifdef CONFIG_HUGETLB_PAGE
 
 #include <linux/mempolicy.h>
index 0a3c2ebf200872f0d716ea2faf0c8ab5f69d9b34..5523f19d88d2930bc97c3b44ad09ef9aa84a049d 100644 (file)
@@ -11,8 +11,6 @@
 #include <linux/hardirq.h>
 #include <linux/sched.h>
 #include <linux/irqflags.h>
-#include <linux/bottom_half.h>
-#include <linux/device.h>
 #include <asm/atomic.h>
 #include <asm/ptrace.h>
 #include <asm/system.h>
@@ -97,6 +95,8 @@ extern int __must_check request_irq(unsigned int, irq_handler_t handler,
                       unsigned long, const char *, void *);
 extern void free_irq(unsigned int, void *);
 
+struct device;
+
 extern int __must_check devm_request_irq(struct device *dev, unsigned int irq,
                            irq_handler_t handler, unsigned long irqflags,
                            const char *devname, void *dev_id);
index aa2fe22b1baa64aa9e54c8b1bf4d5b3207956ac0..949706c33622dfca669418f4fa3e0551bc79c529 100644 (file)
@@ -56,6 +56,9 @@ enum kobject_action {
        KOBJ_MAX
 };
 
+/* The list of strings defining the valid kobject actions as specified above */
+extern const char *kobject_actions[];
+
 struct kobject {
        const char              * k_name;
        char                    name[KOBJ_NAME_LEN];
@@ -108,9 +111,15 @@ struct kobj_type {
        struct attribute        ** default_attrs;
 };
 
+struct kset_uevent_ops {
+       int (*filter)(struct kset *kset, struct kobject *kobj);
+       const char *(*name)(struct kset *kset, struct kobject *kobj);
+       int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp,
+                       int num_envp, char *buffer, int buffer_size);
+};
 
-/**
- *     kset - a set of kobjects of a specific type, belonging
+/*
+ *     struct kset - a set of kobjects of a specific type, belonging
  *     to a specific subsystem.
  *
  *     All kobjects of a kset should be embedded in an identical 
@@ -126,13 +135,6 @@ struct kobj_type {
  *     supress the event generation or add subsystem specific
  *     variables carried with the event.
  */
-struct kset_uevent_ops {
-       int (*filter)(struct kset *kset, struct kobject *kobj);
-       const char *(*name)(struct kset *kset, struct kobject *kobj);
-       int (*uevent)(struct kset *kset, struct kobject *kobj, char **envp,
-                       int num_envp, char *buffer, int buffer_size);
-};
-
 struct kset {
        struct kobj_type        * ktype;
        struct list_head        list;
@@ -173,7 +175,7 @@ static inline struct kobj_type * get_ktype(struct kobject * k)
 extern struct kobject * kset_find_obj(struct kset *, const char *);
 
 
-/**
+/*
  * Use this when initializing an embedded kset with no other 
  * fields to initialize.
  */
@@ -198,7 +200,7 @@ extern struct kset kernel_subsys;
 /* The global /sys/hypervisor/ subsystem  */
 extern struct kset hypervisor_subsys;
 
-/**
+/*
  * Helpers for setting the kset of registered objects.
  * Often, a registered object belongs to a kset embedded in a 
  * subsystem. These do no magic, just make the resulting code
@@ -233,7 +235,7 @@ extern struct kset hypervisor_subsys;
 /**
  *     subsys_set_kset(obj,subsys) - set kset for subsystem
  *     @obj:           ptr to some object type.
- *     @subsys:        a subsystem object (not a ptr).
+ *     @_subsys:       a subsystem object (not a ptr).
  *
  *     Can be used for any object type with an embedded ->subsys.
  *     Sets the kset of @obj's kobject to @subsys.kset. This makes
index e76c151c71290a9669db0d503d98f90eb4494976..157ad64aa7ce8e020759db4498a7288d31345662 100644 (file)
@@ -17,7 +17,6 @@
 #define LHCALL_TS              8
 #define LHCALL_SET_CLOCKEVENT  9
 #define LHCALL_HALT            10
-#define LHCALL_GET_WALLCLOCK   11
 #define LHCALL_BIND_DMA                12
 #define LHCALL_SEND_DMA                13
 #define LHCALL_SET_PTE         14
@@ -88,6 +87,9 @@ struct lguest_data
         * this address would normally be found. */
        unsigned long cr2;
 
+       /* Wallclock time set by the Host. */
+       struct timespec time;
+
        /* Async hypercall ring.  Instead of directly making hypercalls, we can
         * place them in here for processing the next time the Host wants.
         * This batching can be quite efficient. */
index 3e9e8fec5a419bbb948c837415437f5310cd399e..655094dc9440fd5e8fdce2ab4f0380b83d72dd0e 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/mmzone.h>
 #include <linux/rbtree.h>
 #include <linux/prio_tree.h>
-#include <linux/fs.h>
 #include <linux/mutex.h>
 #include <linux/debug_locks.h>
 #include <linux/backing-dev.h>
@@ -18,7 +17,9 @@
 
 struct mempolicy;
 struct anon_vma;
+struct file_ra_state;
 struct user_struct;
+struct writeback_control;
 
 #ifndef CONFIG_DISCONTIGMEM          /* Don't use mapnrs, do it properly */
 extern unsigned long max_mapnr;
@@ -861,38 +862,7 @@ struct shrinker {
 extern void register_shrinker(struct shrinker *);
 extern void unregister_shrinker(struct shrinker *);
 
-/*
- * Some shared mappigns will want the pages marked read-only
- * to track write events. If so, we'll downgrade vm_page_prot
- * to the private version (using protection_map[] without the
- * VM_SHARED bit).
- */
-static inline int vma_wants_writenotify(struct vm_area_struct *vma)
-{
-       unsigned int vm_flags = vma->vm_flags;
-
-       /* If it was private or non-writable, the write bit is already clear */
-       if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED)))
-               return 0;
-
-       /* The backer wishes to know when pages are first written to? */
-       if (vma->vm_ops && vma->vm_ops->page_mkwrite)
-               return 1;
-
-       /* The open routine did something to the protections already? */
-       if (pgprot_val(vma->vm_page_prot) !=
-           pgprot_val(protection_map[vm_flags &
-                   (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]))
-               return 0;
-
-       /* Specialty mapping? */
-       if (vm_flags & (VM_PFNMAP|VM_INSERTPAGE))
-               return 0;
-
-       /* Can the mapping track the dirty pages? */
-       return vma->vm_file && vma->vm_file->f_mapping &&
-               mapping_cap_account_dirty(vma->vm_file->f_mapping);
-}
+int vma_wants_writenotify(struct vm_area_struct *vma);
 
 extern pte_t *FASTCALL(get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl));
 
index ad3cc2eb0d34d4a4bb1be8f5f68240892142d16b..48b71badfb4c837969fedf91f90cba2cce369587 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <linux/list.h>
 #include <asm/atomic.h>
+#include <asm/errno.h>
 
 /*
  * Power management requests... these are passed to pm_send_all() and friends.
@@ -165,6 +166,7 @@ struct pm_ops {
        int (*finish)(suspend_state_t state);
 };
 
+#ifdef CONFIG_SUSPEND
 extern struct pm_ops *pm_ops;
 
 /**
@@ -193,6 +195,12 @@ extern void arch_suspend_disable_irqs(void);
 extern void arch_suspend_enable_irqs(void);
 
 extern int pm_suspend(suspend_state_t state);
+#else /* !CONFIG_SUSPEND */
+#define suspend_valid_only_mem NULL
+
+static inline void pm_set_ops(struct pm_ops *pm_ops) {}
+static inline int pm_suspend(suspend_state_t state) { return -ENOSYS; }
+#endif /* !CONFIG_SUSPEND */
 
 /*
  * Device power management
@@ -266,7 +274,7 @@ typedef struct pm_message {
 struct dev_pm_info {
        pm_message_t            power_state;
        unsigned                can_wakeup:1;
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
        unsigned                should_wakeup:1;
        struct list_head        entry;
 #endif
@@ -276,7 +284,7 @@ extern int device_power_down(pm_message_t state);
 extern void device_power_up(void);
 extern void device_resume(void);
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 extern int device_suspend(pm_message_t state);
 extern int device_prepare_suspend(pm_message_t state);
 
@@ -306,7 +314,7 @@ static inline int call_platform_enable_wakeup(struct device *dev, int is_on)
        return 0;
 }
 
-#else /* !CONFIG_PM */
+#else /* !CONFIG_PM_SLEEP */
 
 static inline int device_suspend(pm_message_t state)
 {
@@ -323,7 +331,7 @@ static inline int call_platform_enable_wakeup(struct device *dev, int is_on)
        return 0;
 }
 
-#endif
+#endif /* !CONFIG_PM_SLEEP */
 
 /* changes to device_may_wakeup take effect on the next pm state change.
  * by default, devices should wakeup if they can.
index 965d5b3ea9eb3deaf583c4d986d45a9e3b70bc8c..180a9d832dde000f966cee08666235b58690f168 100644 (file)
@@ -81,14 +81,16 @@ void reiserfs_warning(struct super_block *s, const char *fmt, ...);
 /* assertions handling */
 
 /** always check a condition and panic if it's false. */
-#define RASSERT( cond, format, args... )                                       \
+#define __RASSERT( cond, scond, format, args... )                                      \
 if( !( cond ) )                                                                \
-  reiserfs_panic( NULL, "reiserfs[%i]: assertion " #cond " failed at " \
+  reiserfs_panic( NULL, "reiserfs[%i]: assertion " scond " failed at " \
                  __FILE__ ":%i:%s: " format "\n",              \
                  in_interrupt() ? -1 : current -> pid, __LINE__ , __FUNCTION__ , ##args )
 
+#define RASSERT(cond, format, args...) __RASSERT(cond, #cond, format, ##args)
+
 #if defined( CONFIG_REISERFS_CHECK )
-#define RFALSE( cond, format, args... ) RASSERT( !( cond ), format, ##args )
+#define RFALSE(cond, format, args...) __RASSERT(!(cond), "!(" #cond ")", format, ##args)
 #else
 #define RFALSE( cond, format, args... ) do {;} while( 0 )
 #endif
index 618f93c32b7fcf139e3f9c89fd9d5e12b952a722..388cace9751f06b9ee9496e2824a79e4bb9d839f 100644 (file)
@@ -24,7 +24,7 @@ struct pbe {
 extern void drain_local_pages(void);
 extern void mark_free_pages(struct zone *zone);
 
-#if defined(CONFIG_PM) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
+#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
 extern int pm_prepare_console(void);
 extern void pm_restore_console(void);
 #else
@@ -54,8 +54,7 @@ struct hibernation_ops {
        void (*restore_cleanup)(void);
 };
 
-#ifdef CONFIG_PM
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
 /* kernel/power/snapshot.c */
 extern void __register_nosave_region(unsigned long b, unsigned long e, int km);
 static inline void register_nosave_region(unsigned long b, unsigned long e)
@@ -73,15 +72,16 @@ extern unsigned long get_safe_page(gfp_t gfp_mask);
 
 extern void hibernation_set_ops(struct hibernation_ops *ops);
 extern int hibernate(void);
-#else /* CONFIG_SOFTWARE_SUSPEND */
+#else /* CONFIG_HIBERNATION */
 static inline int swsusp_page_is_forbidden(struct page *p) { return 0; }
 static inline void swsusp_set_page_free(struct page *p) {}
 static inline void swsusp_unset_page_free(struct page *p) {}
 
 static inline void hibernation_set_ops(struct hibernation_ops *ops) {}
 static inline int hibernate(void) { return -ENOSYS; }
-#endif /* CONFIG_SOFTWARE_SUSPEND */
+#endif /* CONFIG_HIBERNATION */
 
+#ifdef CONFIG_PM_SLEEP
 void save_processor_state(void);
 void restore_processor_state(void);
 struct saved_context;
@@ -106,7 +106,7 @@ static inline int unregister_pm_notifier(struct notifier_block *nb)
                { .notifier_call = fn, .priority = pri };       \
        register_pm_notifier(&fn##_nb);                 \
 }
-#else /* CONFIG_PM */
+#else /* !CONFIG_PM_SLEEP */
 
 static inline int register_pm_notifier(struct notifier_block *nb)
 {
@@ -119,9 +119,9 @@ static inline int unregister_pm_notifier(struct notifier_block *nb)
 }
 
 #define pm_notifier(fn, pri)   do { (void)(fn); } while (0)
-#endif /* CONFIG_PM */
+#endif /* !CONFIG_PM_SLEEP */
 
-#if !defined CONFIG_SOFTWARE_SUSPEND || !defined(CONFIG_PM)
+#ifndef CONFIG_HIBERNATION
 static inline void register_nosave_region(unsigned long b, unsigned long e)
 {
 }
index 7a60946df3b675889f4e4bdc2e5b77ab7fe45a38..4f33a58fa9d1c687baa8e3d76773a4c61d9cc23c 100644 (file)
@@ -94,6 +94,7 @@ enum usb_interface_condition {
  *     endpoint configurations.  They will be in no particular order.
  * @num_altsetting: number of altsettings defined.
  * @cur_altsetting: the current altsetting.
+ * @intf_assoc: interface association descriptor
  * @driver: the USB driver that is bound to this interface.
  * @minor: the minor number assigned to this interface, if this
  *     interface is bound to a driver that uses the USB major number.
@@ -213,6 +214,7 @@ struct usb_interface_cache {
  * @desc: the device's configuration descriptor.
  * @string: pointer to the cached version of the iConfiguration string, if
  *     present for this configuration.
+ * @intf_assoc: list of any interface association descriptors in this config
  * @interface: array of pointers to usb_interface structures, one for each
  *     interface in the configuration.  The number of interfaces is stored
  *     in desc.bNumInterfaces.  These pointers are valid only while the
index 3f631b08a1ab3a63fd4cc2a9d4291cb87ac4613f..007d442412e2224a987bb36145e6f4f771a4760d 100644 (file)
@@ -210,6 +210,9 @@ struct iscsi_session {
        uint32_t                exp_cmdsn;
        uint32_t                max_cmdsn;
 
+       /* This tracks the reqs queued into the initiator */
+       uint32_t                queued_cmdsn;
+
        /* configuration */
        int                     initial_r2t_en;
        unsigned                max_r2t;
index df36461fe88141829ab60dee48a2ad2f8d973a89..8dda2d66b5b92bcb61fd03c3e5fde16ce4bdb3ff 100644 (file)
@@ -348,7 +348,7 @@ struct sas_ha_struct {
 
 /* public: */
        char *sas_ha_name;
-       struct pci_dev *pcidev;   /* should be set */
+       struct device *dev;       /* should be set */
        struct module *lldd_module; /* should be set */
 
        u8 *sas_addr;             /* must be set */
index bde1124d590891d42f4fced9ecf0f15a80fe8297..a777d376141696dc7bc779b5ecc0d2bb58a6961c 100644 (file)
@@ -824,12 +824,14 @@ static void audit_log_execve_info(struct audit_buffer *ab,
 {
        int i;
        long len, ret;
-       const char __user *p = (const char __user *)axi->mm->arg_start;
+       const char __user *p;
        char *buf;
 
        if (axi->mm != current->mm)
                return; /* execve failed, no additional info */
 
+       p = (const char __user *)axi->mm->arg_start;
+
        for (i = 0; i < axi->argc; i++, p += len) {
                len = strnlen_user(p, MAX_ARG_STRLEN);
                /*
@@ -855,7 +857,7 @@ static void audit_log_execve_info(struct audit_buffer *ab,
                 * copied them here, and the mm hasn't been exposed to user-
                 * space yet.
                 */
-               if (!ret) {
+               if (ret) {
                        WARN_ON(1);
                        send_sig(SIGKILL, current, 0);
                }
index d8ee241115f56cd741f0db41dc207484d2cb49ec..6d9204f3a370cfa30b35c9712e15dd5c8723d49c 100644 (file)
@@ -1,5 +1,6 @@
 #include <linux/module.h>
 #include <linux/interrupt.h>
+#include <linux/device.h>
 
 /*
  * Device resource management aware IRQ request/free implementation.
index effbaaedd7f328ac8a69bc246e60903b5babd271..4e57732fcfb41c03ddb38841d7c1876d5372e862 100644 (file)
@@ -567,7 +567,12 @@ static void __init kernel_param_sysfs_setup(const char *name,
        kobject_set_name(&mk->kobj, name);
        kobject_init(&mk->kobj);
        ret = kobject_add(&mk->kobj);
-       BUG_ON(ret < 0);
+       if (ret) {
+               printk(KERN_ERR "Module '%s' failed to be added to sysfs, "
+                     "error number %d\n", name, ret);
+               printk(KERN_ERR "The system will be unstable now.\n");
+               return;
+       }
        param_sysfs_setup(mk, kparam, num_params, name_skip);
        kobject_uevent(&mk->kobj, KOBJ_ADD);
 }
index c1a106d87d90385407d49ee2c7f3e86cc010935e..412859f8d94abde2edd6248aa8db20764111cc6a 100644 (file)
@@ -46,7 +46,7 @@ config PM_VERBOSE
 
 config DISABLE_CONSOLE_SUSPEND
        bool "Keep console(s) enabled during suspend/resume (DANGEROUS)"
-       depends on PM_DEBUG
+       depends on PM_DEBUG && PM_SLEEP
        default n
        ---help---
        This option turns off the console suspend mechanism that prevents
@@ -57,7 +57,7 @@ config DISABLE_CONSOLE_SUSPEND
 
 config PM_TRACE
        bool "Suspend/resume event tracing"
-       depends on PM_DEBUG && X86 && EXPERIMENTAL
+       depends on PM_DEBUG && X86 && PM_SLEEP && EXPERIMENTAL
        default n
        ---help---
        This enables some cheesy code to save the last PM event point in the
@@ -72,9 +72,37 @@ config PM_TRACE
        CAUTION: this option will cause your machine's real-time clock to be
        set to an invalid time after a resume.
 
-config SOFTWARE_SUSPEND
-       bool "Software Suspend (Hibernation)"
-       depends on PM && SWAP && (((X86 || PPC64_SWSUSP) && (!SMP || SUSPEND_SMP)) || ((FRV || PPC32) && !SMP))
+config SUSPEND_SMP_POSSIBLE
+       bool
+       depends on (X86 && !X86_VOYAGER) || (PPC64 && (PPC_PSERIES || PPC_PMAC))
+       depends on SMP
+       default y
+
+config SUSPEND_SMP
+       bool
+       depends on SUSPEND_SMP_POSSIBLE && PM_SLEEP
+       select HOTPLUG_CPU
+       default y
+
+config PM_SLEEP
+       bool
+       depends on SUSPEND || HIBERNATION
+       default y
+
+config SUSPEND
+       bool "Suspend to RAM and standby"
+       depends on PM
+       depends on !SMP || SUSPEND_SMP_POSSIBLE
+       default y
+       ---help---
+         Allow the system to enter sleep states in which main memory is
+         powered and thus its contents are preserved, such as the
+         suspend-to-RAM state (i.e. the ACPI S3 state).
+
+config HIBERNATION
+       bool "Hibernation (aka 'suspend to disk')"
+       depends on PM && SWAP
+       depends on ((X86 || PPC64_SWSUSP || FRV || PPC32) && !SMP) || SUSPEND_SMP_POSSIBLE
        ---help---
          Enable the suspend to disk (STD) functionality, which is usually
          called "hibernation" in user interfaces.  STD checkpoints the
@@ -112,7 +140,7 @@ config SOFTWARE_SUSPEND
 
 config PM_STD_PARTITION
        string "Default resume partition"
-       depends on SOFTWARE_SUSPEND
+       depends on HIBERNATION
        default ""
        ---help---
          The default resume partition is the partition that the suspend-
@@ -132,11 +160,6 @@ config PM_STD_PARTITION
          suspended image to. It will simply pick the first available swap 
          device.
 
-config SUSPEND_SMP
-       bool
-       depends on HOTPLUG_CPU && (X86 || PPC64) && PM
-       default y
-
 config APM_EMULATION
        tristate "Advanced Power Management Emulation"
        depends on PM && SYS_SUPPORTS_APM_EMULATION
index 38725f526afc6cff3f2071017daeea536e78f801..f7dfff28ecdb7035d290a3f7a9e8649283b5d222 100644 (file)
@@ -3,8 +3,9 @@ ifeq ($(CONFIG_PM_DEBUG),y)
 EXTRA_CFLAGS   +=      -DDEBUG
 endif
 
-obj-y                          := main.o process.o console.o
+obj-y                          := main.o
 obj-$(CONFIG_PM_LEGACY)                += pm.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o disk.o snapshot.o swap.o user.o
+obj-$(CONFIG_PM_SLEEP)         += process.o console.o
+obj-$(CONFIG_HIBERNATION)      += swsusp.o disk.o snapshot.o swap.o user.o
 
 obj-$(CONFIG_MAGIC_SYSRQ)      += poweroff.o
index 32147b57c3bfb419f0950b7abafe88aa207984a5..350b485b3b60bdc7679cbd9963ef4ba4b64ed4f3 100644 (file)
 
 BLOCKING_NOTIFIER_HEAD(pm_chain_head);
 
-/*This is just an arbitrary number */
-#define FREE_PAGE_NUMBER (100)
-
 DEFINE_MUTEX(pm_mutex);
 
+#ifdef CONFIG_SUSPEND
+
+/* This is just an arbitrary number */
+#define FREE_PAGE_NUMBER (100)
+
 struct pm_ops *pm_ops;
 
 /**
@@ -269,6 +271,8 @@ int pm_suspend(suspend_state_t state)
 
 EXPORT_SYMBOL(pm_suspend);
 
+#endif /* CONFIG_SUSPEND */
+
 decl_subsys(power,NULL,NULL);
 
 
@@ -285,14 +289,16 @@ decl_subsys(power,NULL,NULL);
 
 static ssize_t state_show(struct kset *kset, char *buf)
 {
+       char *s = buf;
+#ifdef CONFIG_SUSPEND
        int i;
-       char * s = buf;
 
        for (i = 0; i < PM_SUSPEND_MAX; i++) {
                if (pm_states[i] && valid_state(i))
                        s += sprintf(s,"%s ", pm_states[i]);
        }
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#endif
+#ifdef CONFIG_HIBERNATION
        s += sprintf(s, "%s\n", "disk");
 #else
        if (s != buf)
@@ -304,11 +310,13 @@ static ssize_t state_show(struct kset *kset, char *buf)
 
 static ssize_t state_store(struct kset *kset, const char *buf, size_t n)
 {
+#ifdef CONFIG_SUSPEND
        suspend_state_t state = PM_SUSPEND_STANDBY;
        const char * const *s;
+#endif
        char *p;
-       int error;
        int len;
+       int error = -EINVAL;
 
        p = memchr(buf, '\n', n);
        len = p ? p - buf : n;
@@ -316,17 +324,19 @@ static ssize_t state_store(struct kset *kset, const char *buf, size_t n)
        /* First, check if we are requested to hibernate */
        if (len == 4 && !strncmp(buf, "disk", len)) {
                error = hibernate();
-               return error ? error : n;
+  goto Exit;
        }
 
+#ifdef CONFIG_SUSPEND
        for (s = &pm_states[state]; state < PM_SUSPEND_MAX; s++, state++) {
                if (*s && len == strlen(*s) && !strncmp(buf, *s, len))
                        break;
        }
        if (state < PM_SUSPEND_MAX && *s)
                error = enter_state(state);
-       else
-               error = -EINVAL;
+#endif
+
+ Exit:
        return error ? error : n;
 }
 
index 5f24c786f8ec9bacd0421e95d4113c603a823fd5..95fbf2dd3fe33901be99ef8ce60a3bf2ca9fb833 100644 (file)
@@ -13,7 +13,7 @@ struct swsusp_info {
 
 
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
 /*
  * Keep some memory free so that I/O operations can succeed without paging
  * [Might this be more than 4 MB?]
@@ -176,9 +176,17 @@ struct timeval;
 extern void swsusp_show_speed(struct timeval *, struct timeval *,
                                unsigned int, char *);
 
+#ifdef CONFIG_SUSPEND
 /* kernel/power/main.c */
-extern int suspend_enter(suspend_state_t state);
 extern int suspend_devices_and_enter(suspend_state_t state);
+#else /* !CONFIG_SUSPEND */
+static inline int suspend_devices_and_enter(suspend_state_t state)
+{
+       return -ENOSYS;
+}
+#endif /* !CONFIG_SUSPEND */
+
+/* kernel/power/common.c */
 extern struct blocking_notifier_head pm_chain_head;
 
 static inline int pm_notifier_call_chain(unsigned long val)
index 14f8adcfffd98ea1acc2387ffafdf348b900834b..449b81b98b3db5b873301ee45f68605296f118c2 100644 (file)
@@ -954,7 +954,7 @@ asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user
                unlock_kernel();
                return -EINVAL;
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
        case LINUX_REBOOT_CMD_SW_SUSPEND:
                {
                        int ret = hibernate();
index eb26f2ba51ed33eb30f3be4c359875faad721e9f..79c891e6266cf8a7babd078f993e9960295ea088 100644 (file)
@@ -689,7 +689,7 @@ static ctl_table kern_table[] = {
                .proc_handler   = &proc_dointvec,
        },
 #endif
-#if defined(CONFIG_ACPI) && defined(CONFIG_X86)
+#if    defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
        {
                .ctl_name       = KERN_ACPI_VIDEO_FLAGS,
                .procname       = "acpi_video_flags",
index 6a80c784a8fb91f43c6d5f3f833df320be3b2cbb..df02814699d747bc484b89cb22100467f82e0a91 100644 (file)
 #define BUFFER_SIZE    2048    /* buffer for the variables */
 #define NUM_ENVP       32      /* number of env pointers */
 
-#if defined(CONFIG_HOTPLUG)
-u64 uevent_seqnum;
-char uevent_helper[UEVENT_HELPER_PATH_LEN] = "/sbin/hotplug";
-static DEFINE_SPINLOCK(sequence_lock);
-#if defined(CONFIG_NET)
-static struct sock *uevent_sock;
-#endif
-
 /* the strings here must match the enum in include/linux/kobject.h */
 const char *kobject_actions[] = {
        "add",
@@ -43,6 +35,14 @@ const char *kobject_actions[] = {
        "offline",
 };
 
+#if defined(CONFIG_HOTPLUG)
+u64 uevent_seqnum;
+char uevent_helper[UEVENT_HELPER_PATH_LEN] = "/sbin/hotplug";
+static DEFINE_SPINLOCK(sequence_lock);
+#if defined(CONFIG_NET)
+static struct sock *uevent_sock;
+#endif
+
 /**
  * kobject_uevent_env - send an uevent with environmental data
  *
index 86187221e78fdceb4c572fb310c519ba80554fdb..e24d348083c34da69472bc22a9b7025d562a3ffe 100644 (file)
@@ -116,11 +116,11 @@ config SPARSEMEM_EXTREME
 config MEMORY_HOTPLUG
        bool "Allow for memory hot-add"
        depends on SPARSEMEM || X86_64_ACPI_NUMA
-       depends on HOTPLUG && !SOFTWARE_SUSPEND && ARCH_ENABLE_MEMORY_HOTPLUG
+       depends on HOTPLUG && !HIBERNATION && ARCH_ENABLE_MEMORY_HOTPLUG
        depends on (IA64 || X86 || PPC64 || SUPERH)
 
 comment "Memory hotplug is currently incompatible with Software Suspend"
-       depends on SPARSEMEM && HOTPLUG && SOFTWARE_SUSPEND
+       depends on SPARSEMEM && HOTPLUG && HIBERNATION
 
 config MEMORY_HOTPLUG_SPARSE
        def_bool y
index 7afc7a7cec6f681001817ad6656d3a20d9ed53a7..b6537211b9ccfdfcf1f7d9d63c5891ba89e483e7 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1029,6 +1029,40 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
 }
 EXPORT_SYMBOL(do_mmap_pgoff);
 
+/*
+ * Some shared mappigns will want the pages marked read-only
+ * to track write events. If so, we'll downgrade vm_page_prot
+ * to the private version (using protection_map[] without the
+ * VM_SHARED bit).
+ */
+int vma_wants_writenotify(struct vm_area_struct *vma)
+{
+       unsigned int vm_flags = vma->vm_flags;
+
+       /* If it was private or non-writable, the write bit is already clear */
+       if ((vm_flags & (VM_WRITE|VM_SHARED)) != ((VM_WRITE|VM_SHARED)))
+               return 0;
+
+       /* The backer wishes to know when pages are first written to? */
+       if (vma->vm_ops && vma->vm_ops->page_mkwrite)
+               return 1;
+
+       /* The open routine did something to the protections already? */
+       if (pgprot_val(vma->vm_page_prot) !=
+           pgprot_val(protection_map[vm_flags &
+                   (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]))
+               return 0;
+
+       /* Specialty mapping? */
+       if (vm_flags & (VM_PFNMAP|VM_INSERTPAGE))
+               return 0;
+
+       /* Can the mapping track the dirty pages? */
+       return vma->vm_file && vma->vm_file->f_mapping &&
+               mapping_cap_account_dirty(vma->vm_file->f_mapping);
+}
+
+
 unsigned long mmap_region(struct file *file, unsigned long addr,
                          unsigned long len, unsigned long flags,
                          unsigned int vm_flags, unsigned long pgoff,
index a7001410ab15964449f2b7188be3ecf05a9876eb..10367654ae774fba2072698e1fac470174d8698e 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <linux/oom.h>
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/sched.h>
 #include <linux/swap.h>
 #include <linux/timex.h>
index 6d3550ca028201cf74f266d16789cc9608f71d0f..0bd4d82ddfffb55494bb94d5ce6120f56416e07c 100644 (file)
@@ -726,7 +726,7 @@ static void __drain_pages(unsigned int cpu)
        }
 }
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_HIBERNATION
 
 void mark_free_pages(struct zone *zone)
 {
@@ -772,7 +772,7 @@ void drain_local_pages(void)
        __drain_pages(smp_processor_id());
        local_irq_restore(flags);       
 }
-#endif /* CONFIG_PM */
+#endif /* CONFIG_HIBERNATION */
 
 /*
  * Free a 0-order page
index 9b2d6178d06ce7259941c6aafa7b20cf81228e40..6c6d74ff06941e0baf4d923cc0f103e2b1e7297d 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1131,6 +1131,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page)
                slab_pad_check(s, page);
                for_each_object(p, s, page_address(page))
                        check_object(s, page, p, 0);
+               ClearSlabDebug(page);
        }
 
        mod_zone_page_state(page_zone(page),
@@ -1169,7 +1170,6 @@ static void discard_slab(struct kmem_cache *s, struct page *page)
 
        atomic_long_dec(&n->nr_slabs);
        reset_page_mapcount(page);
-       ClearSlabDebug(page);
        __ClearPageSlab(page);
        free_slab(s, page);
 }
@@ -1656,6 +1656,7 @@ static void __always_inline slab_free(struct kmem_cache *s,
        unsigned long flags;
 
        local_irq_save(flags);
+       debug_check_no_locks_freed(object, s->objsize);
        if (likely(page == s->cpu_slab[smp_processor_id()] &&
                                                !SlabDebug(page))) {
                object[page->offset] = page->lockless_freelist;
index 7ff0a81c7b016fc6957288c342eebdd697d020dc..f071648e1360823d06e83b1951a77f1c53a5f998 100644 (file)
@@ -425,7 +425,7 @@ void free_swap_and_cache(swp_entry_t entry)
        }
 }
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
 /*
  * Find the swap type that corresponds to given device (if any).
  *
@@ -951,7 +951,7 @@ sector_t map_swap_page(struct swap_info_struct *sis, pgoff_t offset)
        }
 }
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
+#ifdef CONFIG_HIBERNATION
 /*
  * Get the (PAGE_SIZE) block corresponding to given offset on the swapdev
  * corresponding to given index in swap_info (swap type).
@@ -966,7 +966,7 @@ sector_t swapdev_block(int swap_type, pgoff_t offset)
        sis = swap_info + swap_type;
        return (sis->flags & SWP_WRITEOK) ? map_swap_page(sis, offset) : 0;
 }
-#endif /* CONFIG_SOFTWARE_SUSPEND */
+#endif /* CONFIG_HIBERNATION */
 
 /*
  * Free all of a swapdev's extent information
index fadf791cd7e6828e3a778f7e636786a4dd6c2cbd..c64d169537bfcfe65fc963b009779de85c9b051a 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include <linux/mm.h>
+#include <linux/err.h>
 #include <linux/module.h>
 #include <linux/cpu.h>
 #include <linux/sched.h>
index ad5150b8dfa9b583a20a73a2d03a348a386e4d10..983058d432dc8c613f63a48af80db1997679dd3f 100644 (file)
@@ -479,7 +479,8 @@ static void iucv_setmask_mp(void)
                /* Enable all cpus with a declared buffer. */
                if (cpu_isset(cpu, iucv_buffer_cpumask) &&
                    !cpu_isset(cpu, iucv_irq_cpumask))
-                       smp_call_function_on(iucv_allow_cpu, NULL, 0, 1, cpu);
+                       smp_call_function_single(cpu, iucv_allow_cpu,
+                                                NULL, 0, 1);
        preempt_enable();
 }
 
@@ -497,7 +498,7 @@ static void iucv_setmask_up(void)
        cpumask = iucv_irq_cpumask;
        cpu_clear(first_cpu(iucv_irq_cpumask), cpumask);
        for_each_cpu_mask(cpu, cpumask)
-               smp_call_function_on(iucv_block_cpu, NULL, 0, 1, cpu);
+               smp_call_function_single(cpu, iucv_block_cpu, NULL, 0, 1);
 }
 
 /**
@@ -522,7 +523,7 @@ static int iucv_enable(void)
        rc = -EIO;
        preempt_disable();
        for_each_online_cpu(cpu)
-               smp_call_function_on(iucv_declare_cpu, NULL, 0, 1, cpu);
+               smp_call_function_single(cpu, iucv_declare_cpu, NULL, 0, 1);
        preempt_enable();
        if (cpus_empty(iucv_buffer_cpumask))
                /* No cpu could declare an iucv buffer. */
@@ -578,7 +579,7 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self,
        case CPU_ONLINE_FROZEN:
        case CPU_DOWN_FAILED:
        case CPU_DOWN_FAILED_FROZEN:
-               smp_call_function_on(iucv_declare_cpu, NULL, 0, 1, cpu);
+               smp_call_function_single(cpu, iucv_declare_cpu, NULL, 0, 1);
                break;
        case CPU_DOWN_PREPARE:
        case CPU_DOWN_PREPARE_FROZEN:
@@ -587,10 +588,10 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self,
                if (cpus_empty(cpumask))
                        /* Can't offline last IUCV enabled cpu. */
                        return NOTIFY_BAD;
-               smp_call_function_on(iucv_retrieve_cpu, NULL, 0, 1, cpu);
+               smp_call_function_single(cpu, iucv_retrieve_cpu, NULL, 0, 1);
                if (cpus_empty(iucv_irq_cpumask))
-                       smp_call_function_on(iucv_allow_cpu, NULL, 0, 1,
-                                            first_cpu(iucv_buffer_cpumask));
+                       smp_call_function_single(first_cpu(iucv_buffer_cpumask),
+                                                iucv_allow_cpu, NULL, 0, 1);
                break;
        }
        return NOTIFY_OK;
index 6523ba07db963eca79b03126eee27b5244f63576..188c7cf21b8227465fdd248b6286efabc6f373d6 100644 (file)
@@ -781,6 +781,8 @@ static struct pci_device_id snd_bt87x_ids[] = {
        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, 32000),
        /* Viewcast Osprey 200 */
        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, 44100),
+       /* Viewcast Osprey 440 (rate is configurable via gpio) */
+       BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff07, 32000),
        /* ATI TV-Wonder */
        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1002, 0x0001, 32000),
        /* Leadtek Winfast tv 2000xp delux */
index 129d851b31511fb8516df1b89c50a85248b62a67..dd14abcdf1bd6091d4e3ab3a767866c64405cd84 100644 (file)
@@ -160,9 +160,9 @@ static void pxa2xx_ac97_cold_reset(struct snd_ac97 *ac97)
        gsr_bits = 0;
 #ifdef CONFIG_PXA27x
        /* PXA27x Developers Manual section 13.5.2.2.1 */
-       pxa_set_cken(1 << 31, 1);
+       pxa_set_cken(31, 1);
        udelay(5);
-       pxa_set_cken(1 << 31, 0);
+       pxa_set_cken(31, 0);
        GCR = GCR_COLD_RST;
        udelay(50);
 #else