r2794 - in trunk/kernel/hppa: . kernel-image-2.6.11-hppa-2.6.11 kernel-image-2.6.11-hppa-2.6.11/bin kernel-image-2.6.11-hppa-2.6.11/config kernel-image-2.6.11-hppa-2.6.11/debian kernel-patch-2.6.11-hppa-2.6.11 kernel-patch-2.6.11-hppa-2.6.11/debian

Kyle McMartin kyle at costa.debian.org
Fri Oct 19 10:58:30 UTC 2007


Author: kyle
Date: 2005-03-22 19:51:30 +0100 (Tue, 22 Mar 2005)
New Revision: 2794

Added:
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/bin/
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/bin/touch
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32-smp
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64-smp
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/default
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/README.Debian
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/changelog
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/control
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/copyright
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/rules
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/header-install
   trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/post-install
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/README.Debian
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/changelog
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/control
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/copyright
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/kpatches.arch
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/rules
   trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/hppa_2.6.11.diff
Log:
Add preliminary 2.6.11 support.


Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/bin/touch
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/bin/touch	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/bin/touch	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+set -e
+
+if [ -z "${1##-*}" ] && [ "$1" != -- ]; then
+	exec touch.orig "$@"
+fi
+
+trap 'rm -f $TMP' EXIT
+TMP=$(tempfile)
+
+# Create the files if they don't exist.
+touch.orig -a "$@"
+
+tar -P --remove-files -cf $TMP "$@"
+tar xfP $TMP
+rm -f $TMP
+exec touch.orig "$@"


Property changes on: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/bin/touch
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,1595 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.10
+# Fri Jan 21 03:13:53 2005
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Processor type and features
+#
+CONFIG_PA7000=y
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
+# CONFIG_PA8X00 is not set
+CONFIG_PA11=y
+# CONFIG_64BIT is not set
+# CONFIG_SMP is not set
+CONFIG_DISCONTIGMEM=y
+# CONFIG_PREEMPT is not set
+# CONFIG_HPUX is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+CONFIG_GSC=y
+CONFIG_HPPB=y
+CONFIG_IOMMU_CCIO=y
+CONFIG_GSC_LASI=y
+CONFIG_GSC_WAX=y
+CONFIG_EISA=y
+CONFIG_EISA_NAMES=y
+CONFIG_ISA=y
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_GSC_DINO=y
+CONFIG_PCI_LBA=y
+CONFIG_IOSAPIC=y
+CONFIG_IOMMU_SBA=y
+CONFIG_SUPERIO=y
+CONFIG_CHASSIS_LCD_LED=y
+CONFIG_PDC_CHASSIS=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_PCMCIA_OBSOLETE is not set
+CONFIG_PCMCIA=m
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=m
+CONFIG_PD6729=m
+CONFIG_I82092=m
+CONFIG_I82365=m
+# CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_CML1=m
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+CONFIG_PARPORT_PC_PCMCIA=m
+CONFIG_PARPORT_GSC=m
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE 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
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=m
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+CONFIG_BLK_DEV_IDESCSI=m
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=m
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+CONFIG_BLK_DEV_AEC62XX=m
+CONFIG_BLK_DEV_ALI15X3=m
+# CONFIG_WDC_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=m
+CONFIG_BLK_DEV_CMD64X=m
+CONFIG_BLK_DEV_TRIFLEX=m
+CONFIG_BLK_DEV_CY82C693=m
+CONFIG_BLK_DEV_CS5520=m
+CONFIG_BLK_DEV_CS5530=m
+CONFIG_BLK_DEV_HPT34X=m
+# CONFIG_HPT34X_AUTODMA is not set
+CONFIG_BLK_DEV_HPT366=m
+CONFIG_BLK_DEV_SC1200=m
+CONFIG_BLK_DEV_PIIX=m
+CONFIG_BLK_DEV_NS87415=m
+CONFIG_BLK_DEV_PDC202XX_OLD=m
+# CONFIG_PDC202XX_BURST is not set
+CONFIG_BLK_DEV_PDC202XX_NEW=m
+# CONFIG_PDC202XX_FORCE is not set
+CONFIG_BLK_DEV_SVWKS=m
+CONFIG_BLK_DEV_SIIMAGE=m
+CONFIG_BLK_DEV_SLC90E66=m
+CONFIG_BLK_DEV_TRM290=m
+CONFIG_BLK_DEV_VIA82CXXX=m
+# CONFIG_IDE_ARM is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=y
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AHA1740 is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+CONFIG_MEGARAID_LEGACY=m
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
+CONFIG_SCSI_INITIO=m
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+CONFIG_SCSI_LASI700=m
+CONFIG_53C700_MEM_MAPPED=y
+CONFIG_53C700_LE_ON_BE=y
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
+CONFIG_SCSI_ZALON=m
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+CONFIG_PCMCIA_AHA152X=m
+CONFIG_PCMCIA_FDOMAIN=m
+CONFIG_PCMCIA_NINJA_SCSI=m
+CONFIG_PCMCIA_QLOGIC=m
+CONFIG_PCMCIA_SYM53C500=m
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_RAID6=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_FAULTY=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_TUNNEL=m
+CONFIG_IP_TCPDIAG=m
+CONFIG_IP_TCPDIAG_IPV6=y
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CONNTRACK_MARK=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
+CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
+CONFIG_IP_NF_TFTP=m
+CONFIG_IP_NF_AMANDA=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_PKTTYPE=m
+CONFIG_IP_NF_MATCH_MARK=m
+CONFIG_IP_NF_MATCH_MULTIPORT=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_DSCP=m
+CONFIG_IP_NF_MATCH_AH_ESP=m
+CONFIG_IP_NF_MATCH_LENGTH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_TCPMSS=m
+CONFIG_IP_NF_MATCH_HELPER=m
+CONFIG_IP_NF_MATCH_STATE=m
+CONFIG_IP_NF_MATCH_CONNTRACK=m
+CONFIG_IP_NF_MATCH_OWNER=m
+# CONFIG_IP_NF_MATCH_PHYSDEV is not set
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_REALM=m
+CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
+CONFIG_IP_NF_MATCH_CONNMARK=m
+CONFIG_IP_NF_MATCH_HASHLIMIT=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_SAME=m
+CONFIG_IP_NF_NAT_LOCAL=y
+CONFIG_IP_NF_NAT_SNMP_BASIC=m
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
+CONFIG_IP_NF_NAT_TFTP=m
+CONFIG_IP_NF_NAT_AMANDA=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_DSCP=m
+CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_CLASSIFY=m
+CONFIG_IP_NF_TARGET_CONNMARK=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP_NF_COMPAT_IPCHAINS=m
+CONFIG_IP_NF_COMPAT_IPFWADM=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_LIMIT=m
+CONFIG_IP6_NF_MATCH_MAC=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_MULTIPORT=m
+CONFIG_IP6_NF_MATCH_OWNER=m
+CONFIG_IP6_NF_MATCH_MARK=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_AHESP=m
+CONFIG_IP6_NF_MATCH_LENGTH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_PHYSDEV=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_TARGET_MARK=m
+CONFIG_IP6_NF_RAW=m
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_PEDIT=m
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_LASI_82596=m
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_EL1=m
+CONFIG_EL2=m
+CONFIG_ELPLUS=m
+CONFIG_EL16=m
+CONFIG_EL3=m
+# CONFIG_3C515 is not set
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+CONFIG_WD80x3=m
+CONFIG_ULTRA=m
+CONFIG_ULTRA32=m
+CONFIG_SMC9194=m
+CONFIG_NET_VENDOR_RACAL=y
+# CONFIG_NI5010 is not set
+CONFIG_NI52=m
+# CONFIG_NI65 is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=m
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+CONFIG_PCMCIA_XIRCOM=m
+# CONFIG_PCMCIA_XIRTULIP is not set
+CONFIG_AT1700=m
+CONFIG_DEPCA=m
+CONFIG_HP100=m
+CONFIG_NET_ISA=y
+CONFIG_E2100=m
+CONFIG_EWRK3=m
+CONFIG_EEXPRESS=m
+CONFIG_EEXPRESS_PRO=m
+CONFIG_HPLAN_PLUS=m
+CONFIG_HPLAN=m
+CONFIG_LP486E=m
+CONFIG_ETH16I=m
+CONFIG_NE2000=m
+CONFIG_ZNET=m
+CONFIG_SEEQ8005=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+# CONFIG_AMD8111E_NAPI is not set
+CONFIG_ADAPTEC_STARFIRE=m
+# CONFIG_ADAPTEC_STARFIRE_NAPI is not set
+CONFIG_AC3200=m
+CONFIG_APRICOT=m
+CONFIG_B44=m
+CONFIG_FORCEDETH=m
+CONFIG_CS89x0=m
+CONFIG_EEPRO100=m
+# CONFIG_EEPRO100_PIO is not set
+CONFIG_E100=m
+# CONFIG_E100_NAPI is not set
+CONFIG_LNE390=m
+CONFIG_FEALNX=m
+CONFIG_NATSEMI=m
+CONFIG_NE2K_PCI=m
+CONFIG_NE3210=m
+CONFIG_ES3210=m
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_SIS900=m
+CONFIG_EPIC100=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+CONFIG_TLAN=m
+CONFIG_VIA_RHINE=m
+# CONFIG_VIA_RHINE_MMIO is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_DL2K=m
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+CONFIG_NS83820=m
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+CONFIG_R8169=m
+# CONFIG_R8169_NAPI is not set
+CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
+CONFIG_TIGON3=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IXGB=m
+# CONFIG_IXGB_NAPI is not set
+CONFIG_S2IO=m
+# CONFIG_S2IO_NAPI is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_ARLAN is not set
+# CONFIG_WAVELAN is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+CONFIG_PCMCIA_RAYCS=m
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_AIRO=m
+CONFIG_HERMES=m
+# CONFIG_PLX_HERMES is not set
+# CONFIG_TMD_HERMES is not set
+# CONFIG_PCI_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+
+#
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+#
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PLIP=m
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_NET_FC is not set
+CONFIG_SHAPER=m
+CONFIG_NETCONSOLE=m
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_GSCPS2=y
+CONFIG_HP_SDC=m
+CONFIG_HIL_MLC=m
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_RAW=m
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
+# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_KEYBOARD_HIL_OLD=m
+CONFIG_KEYBOARD_HIL=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+CONFIG_MOUSE_HIL=m
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_HP_SDC_RTC=m
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_MUX=y
+CONFIG_SERIAL_MUX_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=m
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_SYNCLINK_CS=m
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+CONFIG_FB_STI=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON_OLD is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_STI_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_PARISC_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_VX_LIB=m
+CONFIG_SND_DUMMY=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ISA devices
+#
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4232 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB is not set
+# CONFIG_SND_OPTI92X_AD1848 is not set
+# CONFIG_SND_OPTI92X_CS4231 is not set
+# CONFIG_SND_OPTI93X is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VX222 is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+CONFIG_SND_USB_USX2Y=m
+
+#
+# PCMCIA devices
+#
+CONFIG_SND_VXPOCKET=m
+CONFIG_SND_VXP440=m
+CONFIG_SND_PDAUDIOCF=m
+
+#
+# GSC devices
+#
+# CONFIG_SND_HARMONY is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=m
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+CONFIG_SOUND_HARMONY=m
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_SOUND_OSS=m
+# CONFIG_SOUND_TRACEINIT is not set
+# CONFIG_SOUND_DMAP is not set
+# CONFIG_SOUND_AD1816 is not set
+CONFIG_SOUND_AD1889=m
+# CONFIG_SOUND_SGALAXY is not set
+# CONFIG_SOUND_ADLIB is not set
+# CONFIG_SOUND_ACI_MIXER is not set
+# CONFIG_SOUND_CS4232 is not set
+# CONFIG_SOUND_SSCAPE is not set
+# CONFIG_SOUND_GUS is not set
+# CONFIG_SOUND_VMIDI is not set
+# CONFIG_SOUND_TRIX is not set
+# CONFIG_SOUND_MSS is not set
+# CONFIG_SOUND_MPU401 is not set
+# CONFIG_SOUND_NM256 is not set
+# CONFIG_SOUND_MAD16 is not set
+# CONFIG_SOUND_PAS is not set
+# CONFIG_SOUND_PSS is not set
+# CONFIG_SOUND_SB is not set
+# CONFIG_SOUND_AWE32_SYNTH is not set
+# CONFIG_SOUND_WAVEFRONT is not set
+# CONFIG_SOUND_MAUI is not set
+# CONFIG_SOUND_YM3812 is not set
+# CONFIG_SOUND_OPL3SA1 is not set
+# CONFIG_SOUND_OPL3SA2 is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_UART6850 is not set
+# CONFIG_SOUND_AEDSP16 is not set
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH_TTY is not set
+# CONFIG_USB_MIDI is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_USB_HIDINPUT=y
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+
+#
+# USB HID Boot Protocol drivers
+#
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_EGALAX is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+
+#
+# Video4Linux support is needed for USB Multimedia device support
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_TIGL is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGETKIT is not set
+# CONFIG_USB_PHIDGETSERVO is not set
+
+#
+# USB ATM/DSL drivers
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT3_FS=m
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+CONFIG_JFS_POSIX_ACL=y
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_XFS_FS=m
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_QUOTA=y
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=m
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_RW is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_DEVFS_FS=y
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ASFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPCSEC_GSS_SPKM3=m
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_DEFAULT=y
+CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_EXPERIMENTAL is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_ROOTPLUG is not set
+CONFIG_SECURITY_SECLVL=m
+# CONFIG_SECURITY_SELINUX is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32-smp
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32-smp	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/32-smp	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,1597 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.10-1-32-smp
+# Fri Jan 21 03:12:35 2005
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_LOCK_KERNEL=y
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Processor type and features
+#
+CONFIG_PA7000=y
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
+# CONFIG_PA8X00 is not set
+CONFIG_PA11=y
+# CONFIG_64BIT is not set
+CONFIG_SMP=y
+CONFIG_HOTPLUG_CPU=y
+CONFIG_DISCONTIGMEM=y
+# CONFIG_PREEMPT is not set
+# CONFIG_HPUX is not set
+CONFIG_NR_CPUS=32
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+CONFIG_GSC=y
+CONFIG_HPPB=y
+CONFIG_IOMMU_CCIO=y
+CONFIG_GSC_LASI=y
+CONFIG_GSC_WAX=y
+CONFIG_EISA=y
+CONFIG_EISA_NAMES=y
+CONFIG_ISA=y
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_GSC_DINO=y
+CONFIG_PCI_LBA=y
+CONFIG_IOSAPIC=y
+CONFIG_IOMMU_SBA=y
+CONFIG_SUPERIO=y
+CONFIG_CHASSIS_LCD_LED=y
+CONFIG_PDC_CHASSIS=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_PCMCIA_OBSOLETE is not set
+CONFIG_PCMCIA=m
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=m
+CONFIG_PD6729=m
+CONFIG_I82092=m
+CONFIG_I82365=m
+# CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_CML1=m
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+CONFIG_PARPORT_PC_PCMCIA=m
+CONFIG_PARPORT_GSC=m
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE 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
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=m
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+CONFIG_BLK_DEV_IDESCSI=m
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=m
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+CONFIG_BLK_DEV_AEC62XX=m
+CONFIG_BLK_DEV_ALI15X3=m
+# CONFIG_WDC_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=m
+CONFIG_BLK_DEV_CMD64X=m
+CONFIG_BLK_DEV_TRIFLEX=m
+CONFIG_BLK_DEV_CY82C693=m
+CONFIG_BLK_DEV_CS5520=m
+CONFIG_BLK_DEV_CS5530=m
+CONFIG_BLK_DEV_HPT34X=m
+# CONFIG_HPT34X_AUTODMA is not set
+CONFIG_BLK_DEV_HPT366=m
+CONFIG_BLK_DEV_SC1200=m
+CONFIG_BLK_DEV_PIIX=m
+CONFIG_BLK_DEV_NS87415=m
+CONFIG_BLK_DEV_PDC202XX_OLD=m
+# CONFIG_PDC202XX_BURST is not set
+CONFIG_BLK_DEV_PDC202XX_NEW=m
+# CONFIG_PDC202XX_FORCE is not set
+CONFIG_BLK_DEV_SVWKS=m
+CONFIG_BLK_DEV_SIIMAGE=m
+CONFIG_BLK_DEV_SLC90E66=m
+CONFIG_BLK_DEV_TRM290=m
+CONFIG_BLK_DEV_VIA82CXXX=m
+# CONFIG_IDE_ARM is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=y
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AHA1740 is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+CONFIG_MEGARAID_LEGACY=m
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
+CONFIG_SCSI_INITIO=m
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+CONFIG_SCSI_LASI700=m
+CONFIG_53C700_MEM_MAPPED=y
+CONFIG_53C700_LE_ON_BE=y
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
+CONFIG_SCSI_ZALON=m
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+CONFIG_PCMCIA_AHA152X=m
+CONFIG_PCMCIA_FDOMAIN=m
+CONFIG_PCMCIA_NINJA_SCSI=m
+CONFIG_PCMCIA_QLOGIC=m
+CONFIG_PCMCIA_SYM53C500=m
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_RAID6=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_FAULTY=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_TUNNEL=m
+CONFIG_IP_TCPDIAG=m
+CONFIG_IP_TCPDIAG_IPV6=y
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CONNTRACK_MARK=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
+CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
+CONFIG_IP_NF_TFTP=m
+CONFIG_IP_NF_AMANDA=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_PKTTYPE=m
+CONFIG_IP_NF_MATCH_MARK=m
+CONFIG_IP_NF_MATCH_MULTIPORT=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_DSCP=m
+CONFIG_IP_NF_MATCH_AH_ESP=m
+CONFIG_IP_NF_MATCH_LENGTH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_TCPMSS=m
+CONFIG_IP_NF_MATCH_HELPER=m
+CONFIG_IP_NF_MATCH_STATE=m
+CONFIG_IP_NF_MATCH_CONNTRACK=m
+CONFIG_IP_NF_MATCH_OWNER=m
+# CONFIG_IP_NF_MATCH_PHYSDEV is not set
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_REALM=m
+CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
+CONFIG_IP_NF_MATCH_CONNMARK=m
+CONFIG_IP_NF_MATCH_HASHLIMIT=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_SAME=m
+CONFIG_IP_NF_NAT_LOCAL=y
+CONFIG_IP_NF_NAT_SNMP_BASIC=m
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
+CONFIG_IP_NF_NAT_TFTP=m
+CONFIG_IP_NF_NAT_AMANDA=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_DSCP=m
+CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_CLASSIFY=m
+CONFIG_IP_NF_TARGET_CONNMARK=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP_NF_COMPAT_IPCHAINS=m
+CONFIG_IP_NF_COMPAT_IPFWADM=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_LIMIT=m
+CONFIG_IP6_NF_MATCH_MAC=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_MULTIPORT=m
+CONFIG_IP6_NF_MATCH_OWNER=m
+CONFIG_IP6_NF_MATCH_MARK=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_AHESP=m
+CONFIG_IP6_NF_MATCH_LENGTH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_PHYSDEV=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_TARGET_MARK=m
+CONFIG_IP6_NF_RAW=m
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_PEDIT=m
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_LASI_82596=m
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_EL1=m
+CONFIG_EL2=m
+CONFIG_ELPLUS=m
+CONFIG_EL16=m
+CONFIG_EL3=m
+# CONFIG_3C515 is not set
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+CONFIG_WD80x3=m
+CONFIG_ULTRA=m
+CONFIG_ULTRA32=m
+CONFIG_SMC9194=m
+CONFIG_NET_VENDOR_RACAL=y
+CONFIG_NI52=m
+# CONFIG_NI65 is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=m
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+CONFIG_PCMCIA_XIRCOM=m
+CONFIG_AT1700=m
+CONFIG_DEPCA=m
+CONFIG_HP100=m
+CONFIG_NET_ISA=y
+CONFIG_E2100=m
+CONFIG_EWRK3=m
+CONFIG_EEXPRESS=m
+CONFIG_EEXPRESS_PRO=m
+CONFIG_HPLAN_PLUS=m
+CONFIG_HPLAN=m
+CONFIG_LP486E=m
+CONFIG_ETH16I=m
+CONFIG_NE2000=m
+CONFIG_ZNET=m
+CONFIG_SEEQ8005=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+# CONFIG_AMD8111E_NAPI is not set
+CONFIG_ADAPTEC_STARFIRE=m
+# CONFIG_ADAPTEC_STARFIRE_NAPI is not set
+CONFIG_AC3200=m
+CONFIG_APRICOT=m
+CONFIG_B44=m
+CONFIG_FORCEDETH=m
+CONFIG_CS89x0=m
+CONFIG_EEPRO100=m
+# CONFIG_EEPRO100_PIO is not set
+CONFIG_E100=m
+# CONFIG_E100_NAPI is not set
+CONFIG_LNE390=m
+CONFIG_FEALNX=m
+CONFIG_NATSEMI=m
+CONFIG_NE2K_PCI=m
+CONFIG_NE3210=m
+CONFIG_ES3210=m
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_SIS900=m
+CONFIG_EPIC100=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+CONFIG_TLAN=m
+CONFIG_VIA_RHINE=m
+# CONFIG_VIA_RHINE_MMIO is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_DL2K=m
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+CONFIG_NS83820=m
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+CONFIG_R8169=m
+# CONFIG_R8169_NAPI is not set
+CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
+CONFIG_TIGON3=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IXGB=m
+# CONFIG_IXGB_NAPI is not set
+CONFIG_S2IO=m
+# CONFIG_S2IO_NAPI is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_ARLAN is not set
+# CONFIG_WAVELAN is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+CONFIG_PCMCIA_RAYCS=m
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_AIRO=m
+CONFIG_HERMES=m
+# CONFIG_PLX_HERMES is not set
+# CONFIG_TMD_HERMES is not set
+# CONFIG_PCI_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+
+#
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+#
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PLIP=m
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_NET_FC is not set
+CONFIG_SHAPER=m
+CONFIG_NETCONSOLE=m
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_GSCPS2=y
+CONFIG_HP_SDC=m
+CONFIG_HIL_MLC=m
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_RAW=m
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
+# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_KEYBOARD_HIL_OLD=m
+CONFIG_KEYBOARD_HIL=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+CONFIG_MOUSE_HIL=m
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_HP_SDC_RTC=m
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_MUX=y
+CONFIG_SERIAL_MUX_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=m
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_SYNCLINK_CS=m
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+CONFIG_FB_STI=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON_OLD is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_STI_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_PARISC_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_VX_LIB=m
+CONFIG_SND_DUMMY=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ISA devices
+#
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4232 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB is not set
+# CONFIG_SND_OPTI92X_AD1848 is not set
+# CONFIG_SND_OPTI92X_CS4231 is not set
+# CONFIG_SND_OPTI93X is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VX222 is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+CONFIG_SND_USB_USX2Y=m
+
+#
+# PCMCIA devices
+#
+CONFIG_SND_VXPOCKET=m
+CONFIG_SND_VXP440=m
+CONFIG_SND_PDAUDIOCF=m
+
+#
+# GSC devices
+#
+# CONFIG_SND_HARMONY is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=m
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+CONFIG_SOUND_HARMONY=m
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_SOUND_OSS=m
+# CONFIG_SOUND_TRACEINIT is not set
+# CONFIG_SOUND_DMAP is not set
+# CONFIG_SOUND_AD1816 is not set
+CONFIG_SOUND_AD1889=m
+# CONFIG_SOUND_SGALAXY is not set
+# CONFIG_SOUND_ADLIB is not set
+# CONFIG_SOUND_ACI_MIXER is not set
+# CONFIG_SOUND_CS4232 is not set
+# CONFIG_SOUND_SSCAPE is not set
+# CONFIG_SOUND_GUS is not set
+# CONFIG_SOUND_VMIDI is not set
+# CONFIG_SOUND_TRIX is not set
+# CONFIG_SOUND_MSS is not set
+# CONFIG_SOUND_MPU401 is not set
+# CONFIG_SOUND_NM256 is not set
+# CONFIG_SOUND_MAD16 is not set
+# CONFIG_SOUND_PAS is not set
+# CONFIG_SOUND_PSS is not set
+# CONFIG_SOUND_SB is not set
+# CONFIG_SOUND_AWE32_SYNTH is not set
+# CONFIG_SOUND_WAVEFRONT is not set
+# CONFIG_SOUND_MAUI is not set
+# CONFIG_SOUND_YM3812 is not set
+# CONFIG_SOUND_OPL3SA1 is not set
+# CONFIG_SOUND_OPL3SA2 is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_UART6850 is not set
+# CONFIG_SOUND_AEDSP16 is not set
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH_TTY is not set
+# CONFIG_USB_MIDI is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_USB_HIDINPUT=y
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+
+#
+# USB HID Boot Protocol drivers
+#
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_EGALAX is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+
+#
+# Video4Linux support is needed for USB Multimedia device support
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_TIGL is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGETKIT is not set
+# CONFIG_USB_PHIDGETSERVO is not set
+
+#
+# USB ATM/DSL drivers
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT3_FS=m
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+CONFIG_JFS_POSIX_ACL=y
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_XFS_FS=m
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_QUOTA=y
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=m
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_RW is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_DEVFS_FS=y
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ASFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPCSEC_GSS_SPKM3=m
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_DEFAULT=y
+CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_EXPERIMENTAL is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_RWLOCK is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_ROOTPLUG is not set
+CONFIG_SECURITY_SECLVL=m
+# CONFIG_SECURITY_SELINUX is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,1590 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.10
+# Fri Jan 21 03:14:17 2005
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Processor type and features
+#
+# CONFIG_PA7000 is not set
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
+CONFIG_PA8X00=y
+CONFIG_PA20=y
+CONFIG_PREFETCH=y
+CONFIG_PARISC64=y
+CONFIG_64BIT=y
+# CONFIG_SMP is not set
+CONFIG_DISCONTIGMEM=y
+# CONFIG_PREEMPT is not set
+CONFIG_COMPAT=y
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+CONFIG_GSC=y
+CONFIG_HPPB=y
+CONFIG_IOMMU_CCIO=y
+CONFIG_GSC_LASI=y
+CONFIG_GSC_WAX=y
+CONFIG_EISA=y
+CONFIG_EISA_NAMES=y
+CONFIG_ISA=y
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_GSC_DINO=y
+CONFIG_PCI_LBA=y
+CONFIG_IOSAPIC=y
+CONFIG_IOMMU_SBA=y
+CONFIG_SUPERIO=y
+CONFIG_CHASSIS_LCD_LED=y
+CONFIG_PDC_CHASSIS=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_PCMCIA_OBSOLETE is not set
+CONFIG_PCMCIA=m
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=m
+CONFIG_PD6729=m
+CONFIG_I82092=m
+CONFIG_I82365=m
+# CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_CML1=m
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+CONFIG_PARPORT_PC_PCMCIA=m
+CONFIG_PARPORT_GSC=m
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE 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
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=m
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+CONFIG_BLK_DEV_IDESCSI=m
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=m
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+CONFIG_BLK_DEV_AEC62XX=m
+CONFIG_BLK_DEV_ALI15X3=m
+# CONFIG_WDC_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=m
+CONFIG_BLK_DEV_CMD64X=m
+CONFIG_BLK_DEV_TRIFLEX=m
+CONFIG_BLK_DEV_CY82C693=m
+CONFIG_BLK_DEV_CS5520=m
+CONFIG_BLK_DEV_CS5530=m
+CONFIG_BLK_DEV_HPT34X=m
+# CONFIG_HPT34X_AUTODMA is not set
+CONFIG_BLK_DEV_HPT366=m
+CONFIG_BLK_DEV_SC1200=m
+CONFIG_BLK_DEV_PIIX=m
+CONFIG_BLK_DEV_NS87415=m
+CONFIG_BLK_DEV_PDC202XX_OLD=m
+# CONFIG_PDC202XX_BURST is not set
+CONFIG_BLK_DEV_PDC202XX_NEW=m
+# CONFIG_PDC202XX_FORCE is not set
+CONFIG_BLK_DEV_SVWKS=m
+CONFIG_BLK_DEV_SIIMAGE=m
+CONFIG_BLK_DEV_SLC90E66=m
+CONFIG_BLK_DEV_TRM290=m
+CONFIG_BLK_DEV_VIA82CXXX=m
+# CONFIG_IDE_ARM is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=y
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AHA1740 is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+CONFIG_MEGARAID_LEGACY=m
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
+CONFIG_SCSI_INITIO=m
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+CONFIG_SCSI_LASI700=m
+CONFIG_53C700_MEM_MAPPED=y
+CONFIG_53C700_LE_ON_BE=y
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
+CONFIG_SCSI_ZALON=m
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+CONFIG_PCMCIA_FDOMAIN=m
+CONFIG_PCMCIA_QLOGIC=m
+CONFIG_PCMCIA_SYM53C500=m
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_RAID6=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_FAULTY=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_TUNNEL=m
+CONFIG_IP_TCPDIAG=m
+CONFIG_IP_TCPDIAG_IPV6=y
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CONNTRACK_MARK=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
+CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
+CONFIG_IP_NF_TFTP=m
+CONFIG_IP_NF_AMANDA=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_PKTTYPE=m
+CONFIG_IP_NF_MATCH_MARK=m
+CONFIG_IP_NF_MATCH_MULTIPORT=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_DSCP=m
+CONFIG_IP_NF_MATCH_AH_ESP=m
+CONFIG_IP_NF_MATCH_LENGTH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_TCPMSS=m
+CONFIG_IP_NF_MATCH_HELPER=m
+CONFIG_IP_NF_MATCH_STATE=m
+CONFIG_IP_NF_MATCH_CONNTRACK=m
+CONFIG_IP_NF_MATCH_OWNER=m
+# CONFIG_IP_NF_MATCH_PHYSDEV is not set
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_REALM=m
+CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
+CONFIG_IP_NF_MATCH_CONNMARK=m
+CONFIG_IP_NF_MATCH_HASHLIMIT=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_SAME=m
+CONFIG_IP_NF_NAT_LOCAL=y
+CONFIG_IP_NF_NAT_SNMP_BASIC=m
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
+CONFIG_IP_NF_NAT_TFTP=m
+CONFIG_IP_NF_NAT_AMANDA=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_DSCP=m
+CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_CLASSIFY=m
+CONFIG_IP_NF_TARGET_CONNMARK=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP_NF_COMPAT_IPCHAINS=m
+CONFIG_IP_NF_COMPAT_IPFWADM=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_LIMIT=m
+CONFIG_IP6_NF_MATCH_MAC=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_MULTIPORT=m
+CONFIG_IP6_NF_MATCH_OWNER=m
+CONFIG_IP6_NF_MATCH_MARK=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_AHESP=m
+CONFIG_IP6_NF_MATCH_LENGTH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_PHYSDEV=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_TARGET_MARK=m
+CONFIG_IP6_NF_RAW=m
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_PEDIT=m
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_LASI_82596=m
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_EL1=m
+CONFIG_EL2=m
+CONFIG_ELPLUS=m
+CONFIG_EL16=m
+CONFIG_EL3=m
+# CONFIG_3C515 is not set
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+CONFIG_WD80x3=m
+CONFIG_ULTRA=m
+CONFIG_ULTRA32=m
+CONFIG_SMC9194=m
+CONFIG_NET_VENDOR_RACAL=y
+# CONFIG_NI5010 is not set
+CONFIG_NI52=m
+# CONFIG_NI65 is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=m
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+CONFIG_PCMCIA_XIRCOM=m
+# CONFIG_PCMCIA_XIRTULIP is not set
+CONFIG_AT1700=m
+CONFIG_DEPCA=m
+CONFIG_HP100=m
+CONFIG_NET_ISA=y
+CONFIG_E2100=m
+CONFIG_EWRK3=m
+CONFIG_EEXPRESS=m
+CONFIG_EEXPRESS_PRO=m
+CONFIG_HPLAN_PLUS=m
+CONFIG_HPLAN=m
+CONFIG_LP486E=m
+CONFIG_ETH16I=m
+CONFIG_NE2000=m
+CONFIG_ZNET=m
+CONFIG_SEEQ8005=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+# CONFIG_AMD8111E_NAPI is not set
+CONFIG_ADAPTEC_STARFIRE=m
+# CONFIG_ADAPTEC_STARFIRE_NAPI is not set
+CONFIG_AC3200=m
+CONFIG_APRICOT=m
+CONFIG_B44=m
+CONFIG_FORCEDETH=m
+CONFIG_CS89x0=m
+CONFIG_EEPRO100=m
+# CONFIG_EEPRO100_PIO is not set
+CONFIG_E100=m
+# CONFIG_E100_NAPI is not set
+CONFIG_LNE390=m
+CONFIG_FEALNX=m
+CONFIG_NATSEMI=m
+CONFIG_NE2K_PCI=m
+CONFIG_NE3210=m
+CONFIG_ES3210=m
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_SIS900=m
+CONFIG_EPIC100=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+CONFIG_VIA_RHINE=m
+# CONFIG_VIA_RHINE_MMIO is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_DL2K=m
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+CONFIG_NS83820=m
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+CONFIG_R8169=m
+# CONFIG_R8169_NAPI is not set
+CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
+CONFIG_TIGON3=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IXGB=m
+# CONFIG_IXGB_NAPI is not set
+CONFIG_S2IO=m
+# CONFIG_S2IO_NAPI is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_WAVELAN is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+CONFIG_PCMCIA_RAYCS=m
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_AIRO=m
+CONFIG_HERMES=m
+# CONFIG_PLX_HERMES is not set
+# CONFIG_TMD_HERMES is not set
+# CONFIG_PCI_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+
+#
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+#
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PLIP=m
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_NET_FC is not set
+CONFIG_SHAPER=m
+CONFIG_NETCONSOLE=m
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_GSCPS2=y
+CONFIG_HP_SDC=m
+CONFIG_HIL_MLC=m
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_RAW=m
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
+# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_KEYBOARD_HIL_OLD=m
+CONFIG_KEYBOARD_HIL=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+CONFIG_MOUSE_HIL=m
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_HP_SDC_RTC=m
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_MUX=y
+CONFIG_SERIAL_MUX_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=m
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_SYNCLINK_CS=m
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+CONFIG_FB_STI=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON_OLD is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_STI_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_PARISC_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_VX_LIB=m
+CONFIG_SND_DUMMY=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ISA devices
+#
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4232 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB is not set
+# CONFIG_SND_OPTI92X_AD1848 is not set
+# CONFIG_SND_OPTI92X_CS4231 is not set
+# CONFIG_SND_OPTI93X is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VX222 is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+CONFIG_SND_USB_USX2Y=m
+
+#
+# PCMCIA devices
+#
+CONFIG_SND_VXPOCKET=m
+CONFIG_SND_VXP440=m
+CONFIG_SND_PDAUDIOCF=m
+
+#
+# GSC devices
+#
+# CONFIG_SND_HARMONY is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=m
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+CONFIG_SOUND_HARMONY=m
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_SOUND_OSS=m
+# CONFIG_SOUND_TRACEINIT is not set
+# CONFIG_SOUND_DMAP is not set
+# CONFIG_SOUND_AD1816 is not set
+CONFIG_SOUND_AD1889=m
+# CONFIG_SOUND_SGALAXY is not set
+# CONFIG_SOUND_ADLIB is not set
+# CONFIG_SOUND_ACI_MIXER is not set
+# CONFIG_SOUND_CS4232 is not set
+# CONFIG_SOUND_SSCAPE is not set
+# CONFIG_SOUND_GUS is not set
+# CONFIG_SOUND_VMIDI is not set
+# CONFIG_SOUND_TRIX is not set
+# CONFIG_SOUND_MSS is not set
+# CONFIG_SOUND_MPU401 is not set
+# CONFIG_SOUND_NM256 is not set
+# CONFIG_SOUND_MAD16 is not set
+# CONFIG_SOUND_PAS is not set
+# CONFIG_SOUND_PSS is not set
+# CONFIG_SOUND_SB is not set
+# CONFIG_SOUND_AWE32_SYNTH is not set
+# CONFIG_SOUND_WAVEFRONT is not set
+# CONFIG_SOUND_MAUI is not set
+# CONFIG_SOUND_YM3812 is not set
+# CONFIG_SOUND_OPL3SA1 is not set
+# CONFIG_SOUND_OPL3SA2 is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_UART6850 is not set
+# CONFIG_SOUND_AEDSP16 is not set
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH_TTY is not set
+# CONFIG_USB_MIDI is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_USB_HIDINPUT=y
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+
+#
+# USB HID Boot Protocol drivers
+#
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_EGALAX is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+
+#
+# Video4Linux support is needed for USB Multimedia device support
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_TIGL is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGETKIT is not set
+# CONFIG_USB_PHIDGETSERVO is not set
+
+#
+# USB ATM/DSL drivers
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT3_FS=m
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+CONFIG_JFS_POSIX_ACL=y
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_XFS_FS=m
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_QUOTA=y
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=m
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_RW is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_DEVFS_FS=y
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ASFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPCSEC_GSS_SPKM3=m
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_DEFAULT=y
+CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_EXPERIMENTAL is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_ROOTPLUG is not set
+CONFIG_SECURITY_SECLVL=m
+# CONFIG_SECURITY_SELINUX is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64-smp
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64-smp	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/64-smp	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,1592 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.10
+# Fri Jan 21 03:14:29 2005
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_LOCK_KERNEL=y
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Processor type and features
+#
+# CONFIG_PA7000 is not set
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
+CONFIG_PA8X00=y
+CONFIG_PA20=y
+CONFIG_PREFETCH=y
+CONFIG_PARISC64=y
+CONFIG_64BIT=y
+CONFIG_SMP=y
+CONFIG_HOTPLUG_CPU=y
+CONFIG_DISCONTIGMEM=y
+# CONFIG_PREEMPT is not set
+CONFIG_COMPAT=y
+CONFIG_NR_CPUS=32
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+CONFIG_GSC=y
+CONFIG_HPPB=y
+CONFIG_IOMMU_CCIO=y
+CONFIG_GSC_LASI=y
+CONFIG_GSC_WAX=y
+CONFIG_EISA=y
+CONFIG_EISA_NAMES=y
+CONFIG_ISA=y
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_GSC_DINO=y
+CONFIG_PCI_LBA=y
+CONFIG_IOSAPIC=y
+CONFIG_IOMMU_SBA=y
+CONFIG_SUPERIO=y
+CONFIG_CHASSIS_LCD_LED=y
+CONFIG_PDC_CHASSIS=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_PCMCIA_OBSOLETE is not set
+CONFIG_PCMCIA=m
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=m
+CONFIG_PD6729=m
+CONFIG_I82092=m
+CONFIG_I82365=m
+# CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_CML1=m
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+CONFIG_PARPORT_PC_PCMCIA=m
+CONFIG_PARPORT_GSC=m
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE 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
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=m
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+CONFIG_BLK_DEV_IDESCSI=m
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=m
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+CONFIG_BLK_DEV_AEC62XX=m
+CONFIG_BLK_DEV_ALI15X3=m
+# CONFIG_WDC_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=m
+CONFIG_BLK_DEV_CMD64X=m
+CONFIG_BLK_DEV_TRIFLEX=m
+CONFIG_BLK_DEV_CY82C693=m
+CONFIG_BLK_DEV_CS5520=m
+CONFIG_BLK_DEV_CS5530=m
+CONFIG_BLK_DEV_HPT34X=m
+# CONFIG_HPT34X_AUTODMA is not set
+CONFIG_BLK_DEV_HPT366=m
+CONFIG_BLK_DEV_SC1200=m
+CONFIG_BLK_DEV_PIIX=m
+CONFIG_BLK_DEV_NS87415=m
+CONFIG_BLK_DEV_PDC202XX_OLD=m
+# CONFIG_PDC202XX_BURST is not set
+CONFIG_BLK_DEV_PDC202XX_NEW=m
+# CONFIG_PDC202XX_FORCE is not set
+CONFIG_BLK_DEV_SVWKS=m
+CONFIG_BLK_DEV_SIIMAGE=m
+CONFIG_BLK_DEV_SLC90E66=m
+CONFIG_BLK_DEV_TRM290=m
+CONFIG_BLK_DEV_VIA82CXXX=m
+# CONFIG_IDE_ARM is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=y
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AHA1740 is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+CONFIG_MEGARAID_LEGACY=m
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
+CONFIG_SCSI_INITIO=m
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+CONFIG_SCSI_LASI700=m
+CONFIG_53C700_MEM_MAPPED=y
+CONFIG_53C700_LE_ON_BE=y
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
+CONFIG_SCSI_ZALON=m
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+CONFIG_PCMCIA_FDOMAIN=m
+CONFIG_PCMCIA_QLOGIC=m
+CONFIG_PCMCIA_SYM53C500=m
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_RAID6=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_FAULTY=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_TUNNEL=m
+CONFIG_IP_TCPDIAG=m
+CONFIG_IP_TCPDIAG_IPV6=y
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CONNTRACK_MARK=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
+CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
+CONFIG_IP_NF_TFTP=m
+CONFIG_IP_NF_AMANDA=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_PKTTYPE=m
+CONFIG_IP_NF_MATCH_MARK=m
+CONFIG_IP_NF_MATCH_MULTIPORT=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_DSCP=m
+CONFIG_IP_NF_MATCH_AH_ESP=m
+CONFIG_IP_NF_MATCH_LENGTH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_TCPMSS=m
+CONFIG_IP_NF_MATCH_HELPER=m
+CONFIG_IP_NF_MATCH_STATE=m
+CONFIG_IP_NF_MATCH_CONNTRACK=m
+CONFIG_IP_NF_MATCH_OWNER=m
+# CONFIG_IP_NF_MATCH_PHYSDEV is not set
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_REALM=m
+CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
+CONFIG_IP_NF_MATCH_CONNMARK=m
+CONFIG_IP_NF_MATCH_HASHLIMIT=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_SAME=m
+CONFIG_IP_NF_NAT_LOCAL=y
+CONFIG_IP_NF_NAT_SNMP_BASIC=m
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
+CONFIG_IP_NF_NAT_TFTP=m
+CONFIG_IP_NF_NAT_AMANDA=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_DSCP=m
+CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_CLASSIFY=m
+CONFIG_IP_NF_TARGET_CONNMARK=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP_NF_COMPAT_IPCHAINS=m
+CONFIG_IP_NF_COMPAT_IPFWADM=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_LIMIT=m
+CONFIG_IP6_NF_MATCH_MAC=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_MULTIPORT=m
+CONFIG_IP6_NF_MATCH_OWNER=m
+CONFIG_IP6_NF_MATCH_MARK=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_AHESP=m
+CONFIG_IP6_NF_MATCH_LENGTH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_PHYSDEV=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_TARGET_MARK=m
+CONFIG_IP6_NF_RAW=m
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_PEDIT=m
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_LASI_82596=m
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_EL1=m
+CONFIG_EL2=m
+CONFIG_ELPLUS=m
+CONFIG_EL16=m
+CONFIG_EL3=m
+# CONFIG_3C515 is not set
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+CONFIG_WD80x3=m
+CONFIG_ULTRA=m
+CONFIG_ULTRA32=m
+CONFIG_SMC9194=m
+CONFIG_NET_VENDOR_RACAL=y
+CONFIG_NI52=m
+# CONFIG_NI65 is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=m
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+CONFIG_PCMCIA_XIRCOM=m
+CONFIG_AT1700=m
+CONFIG_DEPCA=m
+CONFIG_HP100=m
+CONFIG_NET_ISA=y
+CONFIG_E2100=m
+CONFIG_EWRK3=m
+CONFIG_EEXPRESS=m
+CONFIG_EEXPRESS_PRO=m
+CONFIG_HPLAN_PLUS=m
+CONFIG_HPLAN=m
+CONFIG_LP486E=m
+CONFIG_ETH16I=m
+CONFIG_NE2000=m
+CONFIG_ZNET=m
+CONFIG_SEEQ8005=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+# CONFIG_AMD8111E_NAPI is not set
+CONFIG_ADAPTEC_STARFIRE=m
+# CONFIG_ADAPTEC_STARFIRE_NAPI is not set
+CONFIG_AC3200=m
+CONFIG_APRICOT=m
+CONFIG_B44=m
+CONFIG_FORCEDETH=m
+CONFIG_CS89x0=m
+CONFIG_EEPRO100=m
+# CONFIG_EEPRO100_PIO is not set
+CONFIG_E100=m
+# CONFIG_E100_NAPI is not set
+CONFIG_LNE390=m
+CONFIG_FEALNX=m
+CONFIG_NATSEMI=m
+CONFIG_NE2K_PCI=m
+CONFIG_NE3210=m
+CONFIG_ES3210=m
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_SIS900=m
+CONFIG_EPIC100=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+CONFIG_VIA_RHINE=m
+# CONFIG_VIA_RHINE_MMIO is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_DL2K=m
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+CONFIG_NS83820=m
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+CONFIG_R8169=m
+# CONFIG_R8169_NAPI is not set
+CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
+CONFIG_TIGON3=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IXGB=m
+# CONFIG_IXGB_NAPI is not set
+CONFIG_S2IO=m
+# CONFIG_S2IO_NAPI is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_WAVELAN is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+CONFIG_PCMCIA_RAYCS=m
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_AIRO=m
+CONFIG_HERMES=m
+# CONFIG_PLX_HERMES is not set
+# CONFIG_TMD_HERMES is not set
+# CONFIG_PCI_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+
+#
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+#
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PLIP=m
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_NET_FC is not set
+CONFIG_SHAPER=m
+CONFIG_NETCONSOLE=m
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_GSCPS2=y
+CONFIG_HP_SDC=m
+CONFIG_HIL_MLC=m
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_RAW=m
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
+# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_KEYBOARD_HIL_OLD=m
+CONFIG_KEYBOARD_HIL=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+CONFIG_MOUSE_HIL=m
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_HP_SDC_RTC=m
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_MUX=y
+CONFIG_SERIAL_MUX_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=m
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_SYNCLINK_CS=m
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+CONFIG_FB_STI=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON_OLD is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_STI_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_PARISC_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_VX_LIB=m
+CONFIG_SND_DUMMY=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ISA devices
+#
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4232 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB is not set
+# CONFIG_SND_OPTI92X_AD1848 is not set
+# CONFIG_SND_OPTI92X_CS4231 is not set
+# CONFIG_SND_OPTI93X is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VX222 is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+CONFIG_SND_USB_USX2Y=m
+
+#
+# PCMCIA devices
+#
+CONFIG_SND_VXPOCKET=m
+CONFIG_SND_VXP440=m
+CONFIG_SND_PDAUDIOCF=m
+
+#
+# GSC devices
+#
+# CONFIG_SND_HARMONY is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=m
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+CONFIG_SOUND_HARMONY=m
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_SOUND_OSS=m
+# CONFIG_SOUND_TRACEINIT is not set
+# CONFIG_SOUND_DMAP is not set
+# CONFIG_SOUND_AD1816 is not set
+CONFIG_SOUND_AD1889=m
+# CONFIG_SOUND_SGALAXY is not set
+# CONFIG_SOUND_ADLIB is not set
+# CONFIG_SOUND_ACI_MIXER is not set
+# CONFIG_SOUND_CS4232 is not set
+# CONFIG_SOUND_SSCAPE is not set
+# CONFIG_SOUND_GUS is not set
+# CONFIG_SOUND_VMIDI is not set
+# CONFIG_SOUND_TRIX is not set
+# CONFIG_SOUND_MSS is not set
+# CONFIG_SOUND_MPU401 is not set
+# CONFIG_SOUND_NM256 is not set
+# CONFIG_SOUND_MAD16 is not set
+# CONFIG_SOUND_PAS is not set
+# CONFIG_SOUND_PSS is not set
+# CONFIG_SOUND_SB is not set
+# CONFIG_SOUND_AWE32_SYNTH is not set
+# CONFIG_SOUND_WAVEFRONT is not set
+# CONFIG_SOUND_MAUI is not set
+# CONFIG_SOUND_YM3812 is not set
+# CONFIG_SOUND_OPL3SA1 is not set
+# CONFIG_SOUND_OPL3SA2 is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_UART6850 is not set
+# CONFIG_SOUND_AEDSP16 is not set
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH_TTY is not set
+# CONFIG_USB_MIDI is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_USB_HIDINPUT=y
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+
+#
+# USB HID Boot Protocol drivers
+#
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_EGALAX is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+
+#
+# Video4Linux support is needed for USB Multimedia device support
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_TIGL is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGETKIT is not set
+# CONFIG_USB_PHIDGETSERVO is not set
+
+#
+# USB ATM/DSL drivers
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT3_FS=m
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+CONFIG_JFS_POSIX_ACL=y
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_XFS_FS=m
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_QUOTA=y
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=m
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_RW is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_DEVFS_FS=y
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ASFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPCSEC_GSS_SPKM3=m
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_DEFAULT=y
+CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_EXPERIMENTAL is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_RWLOCK is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_ROOTPLUG is not set
+CONFIG_SECURITY_SECLVL=m
+# CONFIG_SECURITY_SELINUX is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/default
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/default	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/config/default	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,1595 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.10
+# Fri Jan 21 03:13:53 2005
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_KMOD=y
+
+#
+# Processor type and features
+#
+CONFIG_PA7000=y
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
+# CONFIG_PA8X00 is not set
+CONFIG_PA11=y
+# CONFIG_64BIT is not set
+# CONFIG_SMP is not set
+CONFIG_DISCONTIGMEM=y
+# CONFIG_PREEMPT is not set
+# CONFIG_HPUX is not set
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+CONFIG_GSC=y
+CONFIG_HPPB=y
+CONFIG_IOMMU_CCIO=y
+CONFIG_GSC_LASI=y
+CONFIG_GSC_WAX=y
+CONFIG_EISA=y
+CONFIG_EISA_NAMES=y
+CONFIG_ISA=y
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_GSC_DINO=y
+CONFIG_PCI_LBA=y
+CONFIG_IOSAPIC=y
+CONFIG_IOMMU_SBA=y
+CONFIG_SUPERIO=y
+CONFIG_CHASSIS_LCD_LED=y
+CONFIG_PDC_CHASSIS=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+# CONFIG_PCMCIA_OBSOLETE is not set
+CONFIG_PCMCIA=m
+CONFIG_CARDBUS=y
+
+#
+# PC-card bridges
+#
+CONFIG_YENTA=m
+CONFIG_PD6729=m
+CONFIG_I82092=m
+CONFIG_I82365=m
+# CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=m
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_CML1=m
+# CONFIG_PARPORT_SERIAL is not set
+# CONFIG_PARPORT_PC_FIFO is not set
+# CONFIG_PARPORT_PC_SUPERIO is not set
+CONFIG_PARPORT_PC_PCMCIA=m
+CONFIG_PARPORT_GSC=m
+# CONFIG_PARPORT_OTHER is not set
+# CONFIG_PARPORT_1284 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE 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
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=m
+CONFIG_BLK_DEV_IDE=m
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=m
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+CONFIG_BLK_DEV_IDESCSI=m
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=m
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_SHARE_IRQ=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_BLK_DEV_OPTI621 is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+CONFIG_BLK_DEV_AEC62XX=m
+CONFIG_BLK_DEV_ALI15X3=m
+# CONFIG_WDC_ALI15X3 is not set
+CONFIG_BLK_DEV_AMD74XX=m
+CONFIG_BLK_DEV_CMD64X=m
+CONFIG_BLK_DEV_TRIFLEX=m
+CONFIG_BLK_DEV_CY82C693=m
+CONFIG_BLK_DEV_CS5520=m
+CONFIG_BLK_DEV_CS5530=m
+CONFIG_BLK_DEV_HPT34X=m
+# CONFIG_HPT34X_AUTODMA is not set
+CONFIG_BLK_DEV_HPT366=m
+CONFIG_BLK_DEV_SC1200=m
+CONFIG_BLK_DEV_PIIX=m
+CONFIG_BLK_DEV_NS87415=m
+CONFIG_BLK_DEV_PDC202XX_OLD=m
+# CONFIG_PDC202XX_BURST is not set
+CONFIG_BLK_DEV_PDC202XX_NEW=m
+# CONFIG_PDC202XX_FORCE is not set
+CONFIG_BLK_DEV_SVWKS=m
+CONFIG_BLK_DEV_SIIMAGE=m
+CONFIG_BLK_DEV_SLC90E66=m
+CONFIG_BLK_DEV_TRM290=m
+CONFIG_BLK_DEV_VIA82CXXX=m
+# CONFIG_IDE_ARM is not set
+# CONFIG_IDE_CHIPSETS is not set
+CONFIG_BLK_DEV_IDEDMA=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+CONFIG_CHR_DEV_ST=m
+CONFIG_CHR_DEV_OSST=m
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=y
+# CONFIG_SCSI_FC_ATTRS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_7000FASST is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AHA1542 is not set
+# CONFIG_SCSI_AHA1740 is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+CONFIG_MEGARAID_LEGACY=m
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_IPS is not set
+CONFIG_SCSI_INITIO=m
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+CONFIG_SCSI_LASI700=m
+CONFIG_53C700_MEM_MAPPED=y
+CONFIG_53C700_LE_ON_BE=y
+CONFIG_SCSI_SYM53C8XX_2=m
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
+CONFIG_SCSI_ZALON=m
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
+CONFIG_SCSI_NCR53C8XX_SYNC=20
+# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+# CONFIG_SCSI_QLOGIC_FC is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_SIM710 is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_U14_34F is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+CONFIG_PCMCIA_AHA152X=m
+CONFIG_PCMCIA_FDOMAIN=m
+CONFIG_PCMCIA_NINJA_SCSI=m
+CONFIG_PCMCIA_QLOGIC=m
+CONFIG_PCMCIA_SYM53C500=m
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=m
+CONFIG_MD_LINEAR=m
+CONFIG_MD_RAID0=m
+CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
+CONFIG_MD_RAID5=m
+CONFIG_MD_RAID6=m
+CONFIG_MD_MULTIPATH=m
+CONFIG_MD_FAULTY=m
+CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+CONFIG_DM_MIRROR=m
+CONFIG_DM_ZERO=m
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_TUNNEL=m
+CONFIG_IP_TCPDIAG=m
+CONFIG_IP_TCPDIAG_IPV6=y
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+CONFIG_IPV6_PRIVACY=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_BRIDGE_NETFILTER=y
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CONNTRACK_MARK=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
+CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
+CONFIG_IP_NF_TFTP=m
+CONFIG_IP_NF_AMANDA=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_PKTTYPE=m
+CONFIG_IP_NF_MATCH_MARK=m
+CONFIG_IP_NF_MATCH_MULTIPORT=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_DSCP=m
+CONFIG_IP_NF_MATCH_AH_ESP=m
+CONFIG_IP_NF_MATCH_LENGTH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_TCPMSS=m
+CONFIG_IP_NF_MATCH_HELPER=m
+CONFIG_IP_NF_MATCH_STATE=m
+CONFIG_IP_NF_MATCH_CONNTRACK=m
+CONFIG_IP_NF_MATCH_OWNER=m
+# CONFIG_IP_NF_MATCH_PHYSDEV is not set
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_MATCH_REALM=m
+CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
+CONFIG_IP_NF_MATCH_CONNMARK=m
+CONFIG_IP_NF_MATCH_HASHLIMIT=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_SAME=m
+CONFIG_IP_NF_NAT_LOCAL=y
+CONFIG_IP_NF_NAT_SNMP_BASIC=m
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
+CONFIG_IP_NF_NAT_TFTP=m
+CONFIG_IP_NF_NAT_AMANDA=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_DSCP=m
+CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_CLASSIFY=m
+CONFIG_IP_NF_TARGET_CONNMARK=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IP_NF_COMPAT_IPCHAINS=m
+CONFIG_IP_NF_COMPAT_IPFWADM=m
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_LIMIT=m
+CONFIG_IP6_NF_MATCH_MAC=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_MULTIPORT=m
+CONFIG_IP6_NF_MATCH_OWNER=m
+CONFIG_IP6_NF_MATCH_MARK=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_AHESP=m
+CONFIG_IP6_NF_MATCH_LENGTH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_PHYSDEV=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_TARGET_MARK=m
+CONFIG_IP6_NF_RAW=m
+
+#
+# Bridge: Netfilter Configuration
+#
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=m
+CONFIG_VLAN_8021Q=m
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
+CONFIG_NET_QOS=y
+CONFIG_NET_ESTIMATOR=y
+CONFIG_NET_CLS=y
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_ROUTE=y
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_NET_CLS_ACT=y
+CONFIG_NET_ACT_POLICE=m
+CONFIG_NET_ACT_GACT=m
+CONFIG_GACT_PROB=y
+CONFIG_NET_ACT_MIRRED=m
+CONFIG_NET_ACT_IPT=m
+CONFIG_NET_ACT_PEDIT=m
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_LASI_82596=m
+CONFIG_HAPPYMEAL=m
+CONFIG_SUNGEM=m
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_EL1=m
+CONFIG_EL2=m
+CONFIG_ELPLUS=m
+CONFIG_EL16=m
+CONFIG_EL3=m
+# CONFIG_3C515 is not set
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+# CONFIG_LANCE is not set
+CONFIG_NET_VENDOR_SMC=y
+CONFIG_WD80x3=m
+CONFIG_ULTRA=m
+CONFIG_ULTRA32=m
+CONFIG_SMC9194=m
+CONFIG_NET_VENDOR_RACAL=y
+# CONFIG_NI5010 is not set
+CONFIG_NI52=m
+# CONFIG_NI65 is not set
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=m
+# CONFIG_TULIP_MWI is not set
+# CONFIG_TULIP_MMIO is not set
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+CONFIG_PCMCIA_XIRCOM=m
+# CONFIG_PCMCIA_XIRTULIP is not set
+CONFIG_AT1700=m
+CONFIG_DEPCA=m
+CONFIG_HP100=m
+CONFIG_NET_ISA=y
+CONFIG_E2100=m
+CONFIG_EWRK3=m
+CONFIG_EEXPRESS=m
+CONFIG_EEXPRESS_PRO=m
+CONFIG_HPLAN_PLUS=m
+CONFIG_HPLAN=m
+CONFIG_LP486E=m
+CONFIG_ETH16I=m
+CONFIG_NE2000=m
+CONFIG_ZNET=m
+CONFIG_SEEQ8005=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+CONFIG_AMD8111_ETH=m
+# CONFIG_AMD8111E_NAPI is not set
+CONFIG_ADAPTEC_STARFIRE=m
+# CONFIG_ADAPTEC_STARFIRE_NAPI is not set
+CONFIG_AC3200=m
+CONFIG_APRICOT=m
+CONFIG_B44=m
+CONFIG_FORCEDETH=m
+CONFIG_CS89x0=m
+CONFIG_EEPRO100=m
+# CONFIG_EEPRO100_PIO is not set
+CONFIG_E100=m
+# CONFIG_E100_NAPI is not set
+CONFIG_LNE390=m
+CONFIG_FEALNX=m
+CONFIG_NATSEMI=m
+CONFIG_NE2K_PCI=m
+CONFIG_NE3210=m
+CONFIG_ES3210=m
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_SIS900=m
+CONFIG_EPIC100=m
+CONFIG_SUNDANCE=m
+# CONFIG_SUNDANCE_MMIO is not set
+CONFIG_TLAN=m
+CONFIG_VIA_RHINE=m
+# CONFIG_VIA_RHINE_MMIO is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_DL2K=m
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+CONFIG_NS83820=m
+CONFIG_HAMACHI=m
+CONFIG_YELLOWFIN=m
+CONFIG_R8169=m
+# CONFIG_R8169_NAPI is not set
+CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
+CONFIG_TIGON3=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IXGB=m
+# CONFIG_IXGB_NAPI is not set
+CONFIG_S2IO=m
+# CONFIG_S2IO_NAPI is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_ARLAN is not set
+# CONFIG_WAVELAN is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+CONFIG_PCMCIA_RAYCS=m
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_AIRO=m
+CONFIG_HERMES=m
+# CONFIG_PLX_HERMES is not set
+# CONFIG_TMD_HERMES is not set
+# CONFIG_PCI_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+
+#
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+#
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PLIP=m
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_NET_FC is not set
+CONFIG_SHAPER=m
+CONFIG_NETCONSOLE=m
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+CONFIG_SERIO=y
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_GSCPS2=y
+CONFIG_HP_SDC=m
+CONFIG_HIL_MLC=m
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_RAW=m
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
+# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+CONFIG_KEYBOARD_HIL_OLD=m
+CONFIG_KEYBOARD_HIL=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+CONFIG_MOUSE_HIL=m
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_UINPUT is not set
+CONFIG_HP_SDC_RTC=m
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_MUX=y
+CONFIG_SERIAL_MUX_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=m
+# CONFIG_LP_CONSOLE is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+CONFIG_SYNCLINK_CS=m
+# CONFIG_RAW_DRIVER is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_IMSTT is not set
+CONFIG_FB_STI=y
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_RADEON_OLD is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_STI_CONSOLE=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+CONFIG_LOGO_LINUX_MONO=y
+CONFIG_LOGO_LINUX_VGA16=y
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_PARISC_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_VX_LIB=m
+CONFIG_SND_DUMMY=m
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ISA devices
+#
+# CONFIG_SND_AD1848 is not set
+# CONFIG_SND_CS4231 is not set
+# CONFIG_SND_CS4232 is not set
+# CONFIG_SND_CS4236 is not set
+# CONFIG_SND_ES1688 is not set
+# CONFIG_SND_ES18XX is not set
+# CONFIG_SND_GUSCLASSIC is not set
+# CONFIG_SND_GUSEXTREME is not set
+# CONFIG_SND_GUSMAX is not set
+# CONFIG_SND_INTERWAVE is not set
+# CONFIG_SND_INTERWAVE_STB is not set
+# CONFIG_SND_OPTI92X_AD1848 is not set
+# CONFIG_SND_OPTI92X_CS4231 is not set
+# CONFIG_SND_OPTI93X is not set
+# CONFIG_SND_SB8 is not set
+# CONFIG_SND_SB16 is not set
+# CONFIG_SND_SBAWE is not set
+# CONFIG_SND_WAVEFRONT is not set
+# CONFIG_SND_CMI8330 is not set
+# CONFIG_SND_OPL3SA2 is not set
+# CONFIG_SND_SGALAXY is not set
+# CONFIG_SND_SSCAPE is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VX222 is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+CONFIG_SND_USB_USX2Y=m
+
+#
+# PCMCIA devices
+#
+CONFIG_SND_VXPOCKET=m
+CONFIG_SND_VXP440=m
+CONFIG_SND_PDAUDIOCF=m
+
+#
+# GSC devices
+#
+# CONFIG_SND_HARMONY is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=m
+# CONFIG_SOUND_BT878 is not set
+# CONFIG_SOUND_CMPCI is not set
+# CONFIG_SOUND_EMU10K1 is not set
+# CONFIG_SOUND_FUSION is not set
+# CONFIG_SOUND_CS4281 is not set
+# CONFIG_SOUND_ES1370 is not set
+# CONFIG_SOUND_ES1371 is not set
+# CONFIG_SOUND_ESSSOLO1 is not set
+# CONFIG_SOUND_MAESTRO is not set
+# CONFIG_SOUND_MAESTRO3 is not set
+# CONFIG_SOUND_ICH is not set
+CONFIG_SOUND_HARMONY=m
+# CONFIG_SOUND_SONICVIBES is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+# CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_SOUND_OSS=m
+# CONFIG_SOUND_TRACEINIT is not set
+# CONFIG_SOUND_DMAP is not set
+# CONFIG_SOUND_AD1816 is not set
+CONFIG_SOUND_AD1889=m
+# CONFIG_SOUND_SGALAXY is not set
+# CONFIG_SOUND_ADLIB is not set
+# CONFIG_SOUND_ACI_MIXER is not set
+# CONFIG_SOUND_CS4232 is not set
+# CONFIG_SOUND_SSCAPE is not set
+# CONFIG_SOUND_GUS is not set
+# CONFIG_SOUND_VMIDI is not set
+# CONFIG_SOUND_TRIX is not set
+# CONFIG_SOUND_MSS is not set
+# CONFIG_SOUND_MPU401 is not set
+# CONFIG_SOUND_NM256 is not set
+# CONFIG_SOUND_MAD16 is not set
+# CONFIG_SOUND_PAS is not set
+# CONFIG_SOUND_PSS is not set
+# CONFIG_SOUND_SB is not set
+# CONFIG_SOUND_AWE32_SYNTH is not set
+# CONFIG_SOUND_WAVEFRONT is not set
+# CONFIG_SOUND_MAUI is not set
+# CONFIG_SOUND_YM3812 is not set
+# CONFIG_SOUND_OPL3SA1 is not set
+# CONFIG_SOUND_OPL3SA2 is not set
+# CONFIG_SOUND_YMFPCI is not set
+# CONFIG_SOUND_UART6850 is not set
+# CONFIG_SOUND_AEDSP16 is not set
+# CONFIG_SOUND_ALI5455 is not set
+# CONFIG_SOUND_FORTE is not set
+# CONFIG_SOUND_RME96XX is not set
+# CONFIG_SOUND_AD1980 is not set
+
+#
+# USB support
+#
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS is not set
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_AUDIO is not set
+# CONFIG_USB_BLUETOOTH_TTY is not set
+# CONFIG_USB_MIDI is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_HP8200e is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_USB_HIDINPUT=y
+# CONFIG_HID_FF is not set
+CONFIG_USB_HIDDEV=y
+
+#
+# USB HID Boot Protocol drivers
+#
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_EGALAX is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+# CONFIG_USB_HPUSBSCSI is not set
+
+#
+# USB Multimedia devices
+#
+
+#
+# Video4Linux support is needed for USB Multimedia device support
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_TIGL is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGETKIT is not set
+# CONFIG_USB_PHIDGETSERVO is not set
+
+#
+# USB ATM/DSL drivers
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT3_FS=m
+CONFIG_EXT3_FS_XATTR=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+CONFIG_REISERFS_FS_XATTR=y
+CONFIG_REISERFS_FS_POSIX_ACL=y
+CONFIG_REISERFS_FS_SECURITY=y
+CONFIG_JFS_FS=m
+CONFIG_JFS_POSIX_ACL=y
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_FS_POSIX_ACL=y
+CONFIG_XFS_FS=m
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+CONFIG_MINIX_FS=m
+CONFIG_ROMFS_FS=m
+CONFIG_QUOTA=y
+CONFIG_QFMT_V1=m
+CONFIG_QFMT_V2=m
+CONFIG_QUOTACTL=y
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_ZISOFS_FS=m
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_RW is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_DEVFS_FS=y
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_XATTR is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ASFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPCSEC_GSS_SPKM3=m
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_DEFAULT=y
+CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_EXPERIMENTAL is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+CONFIG_SECURITY=y
+CONFIG_SECURITY_NETWORK=y
+CONFIG_SECURITY_CAPABILITIES=y
+# CONFIG_SECURITY_ROOTPLUG is not set
+CONFIG_SECURITY_SECLVL=m
+# CONFIG_SECURITY_SELINUX is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/README.Debian
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/README.Debian	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/README.Debian	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,26 @@
+Choosing which kernel package is right for you
+----------------------------------------------
+
+If your machine has multiple processors, choose a kernel with the
+"smp" suffix. However, you may wish to install the non-SMP kernel 
+as well, as a backup in the event SMP does not boot on your machine class,
+and send a bug report to parisc-linux at parisc-linux.org.
+
+If your machine has a PA7000 series processor, you want the "32"
+flavour of kernels.
+
+If your machine has a PA8000 series processor, you can choose either the
+"32" or "64" flavour, depending on your systems firmware.
+
+Some machines only have 64-bit "Wide" PDC (Processor Dependent Code), such as
+the A500 and L2000 series systems. These machines do not support running
+32-bit "Narrow" kernels, so you must run "64" kernels on them.
+
+There is no real advantage to using a 64-bit kernel, in fact,
+it is recommended that you use a "32" kernel, unless you
+want to test 64-bit mode, are required to by your systems firmware, or
+want to address more than 3.5 GB of memory.
+
+If in doubt, consult http://www.parisc-linux.org/.
+
+-- Kyle McMartin <kyle at parisc-linux.org>, Tue 24 Aug 2004 16:25:19 -0400

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/changelog
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/changelog	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/changelog	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,70 @@
+kernel-image-2.6.11-hppa (2.6.11-1) UNRELEASED; urgency=low
+
+  * New upstream release(s).
+
+ -- Kyle McMartin <kyle at debian.org>  Sun, 13 Mar 2005 02:54:19 -0500
+
+kernel-image-2.6.10-hppa (2.6.10-1) unstable; urgency=low
+
+  * New upstream release(s).
+
+ -- Kyle McMartin <kyle at debian.org>  Fri, 21 Jan 2005 02:51:16 -0500
+
+kernel-image-2.6.8-hppa (2.6.8-6) unstable; urgency=high
+
+  * Disable de4x5, as it conflicts with tulip.
+  * We have lots of modules enabled now. (closes: #275468)
+  * Enable SERIAL_MUX and PDC_CONSOLE, the former so we have
+    console on K and Nova class machines. 
+  * Depend on newer kernel-source-2.6.8, for security fixes.
+  * Depend on newer kernel-patch-2.6.8-hppa, to fix rejects with
+    newer kernel-source.
+  * Properly set the $architecture for make-kpkg, so it
+    preserves include/asm-parisc properly. (closes: #289785)
+
+ -- Kyle McMartin <kyle at debian.org>  Sat, 15 Jan 2005 19:40:05 -0500
+
+kernel-image-2.6.8-hppa (2.6.8-5) unstable; urgency=high
+
+  * make ps2 keyboard support built-in instead of modular to ease d-i pain
+    
+ -- Bdale Garbee <bdale at gag.com>  Tue,  2 Nov 2004 12:55:33 -0700
+
+kernel-image-2.6.8-hppa (2.6.8-4) unstable; urgency=high
+
+  * we really want ext2 built-in and not as a module for d-i initrd use
+  * turn AT keyboard and PS mouse support back on as modules
+  * add gcc-3.3-hppa64 and binutils-hppa64 to build deps
+  * make sure all the configs are 'make oldconfig' clean again, and the diffs
+    between flavors are only those things that should vary between them
+  * add Bdale as an uploader
+  * crank up urgency as we need these changes in sarge for d-i udebs
+
+ -- Bdale Garbee <bdale at gag.com>  Thu, 28 Oct 2004 10:51:22 -0600
+
+kernel-image-2.6.8-hppa (2.6.8-3) unstable; urgency=low
+
+  * CONFIG_BLK_DEV_RAM_SIZE must be 8192, or d-i fails, because
+    kernel command line flags are truncated.
+
+ -- Kyle McMartin <kyle at debian.org>  Sun, 24 Oct 2004 01:35:23 -0400
+
+kernel-image-2.6.8-hppa (2.6.8-2) unstable; urgency=low
+
+  * Remove meta-packages, as we will transition to the
+    kernel-latest framework.
+  * Build against kernel-patch-hppa 2.6.8-4.
+  * Add support for PCI/EISA network cards (in addition to those
+    already built on PA-RISC.)
+
+ -- Kyle McMartin <kyle at debian.org>  Sat, 16 Oct 2004 10:29:53 -0400
+
+kernel-image-2.6.8-hppa (2.6.8-1) unstable; urgency=high
+
+  * New upstream release. Synced to 2.6.8.1-pa7 or greater.
+  * Priority is high, since we want to see this package make it into
+    sarge. It provides significantly better hardware support, which
+    we feel justifies the higher priority.
+
+ -- Kyle McMartin <kyle at debian.org>  Wed, 18 Aug 2004 12:21:12 -0400
+

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/control
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/control	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/control	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,135 @@
+Source: kernel-image-2.6.11-hppa
+Section: devel
+Priority: optional
+Maintainer: Kyle McMartin <kyle at debian.org>
+Uploaders: Bdale Garbee <bdale at gag.com>
+Build-Depends: kernel-tree-2.6.11-1, kernel-patch-2.6.11-hppa (>= 2.6.11-1), kernel-package, debianutils (>= 1.6), debhelper (>= 2), bzip2, modutils (>=2.4.21-3), gcc-3.3-hppa64, binutils-hppa64
+Standards-Version: 3.6.1
+
+Package: kernel-headers-2.6.11-1
+Architecture: hppa
+Section: devel
+Priority: optional
+Depends: coreutils | fileutils (>= 4.0), kernel-kbuild-2.6-3
+Provides: kernel-headers, kernel-headers-2.6
+Description: Header files for the Linux kernel version 2.6.11
+ This package provides kernel header files for version 2.6.11, for sites
+ that want the latest kernel headers. Please read
+ /usr/share/doc/kernel-headers-2.6.11-1/debian.README.gz for details.
+
+Package: kernel-headers-2.6.11-1-32
+Architecture: hppa
+Section: devel
+Priority: optional
+Depends: coreutils | fileutils (>= 4.0), kernel-headers-2.6.11-1
+Provides: kernel-headers, kernel-headers-2.6
+Description: Linux kernel headers 2.6.11 on HP PA-RISC 32-bit systems
+ This package provides kernel header files for version 2.6.11 on
+ HP PA-RISC 32-bit systems, for sites that want the latest kernel headers.
+ Please read /usr/share/doc/kernel-headers-2.6.11-1-32/debian.README.gz for
+ details.
+
+Package: kernel-image-2.6.11-1-32
+Architecture: hppa
+Section: base
+Priority: optional
+Provides: kernel-image, kernel-image-2.6
+Depends: palo, initrd-tools, coreutils | fileutils, module-init-tools
+Suggests: kernel-doc-2.6.11 | kernel-source-2.6.11
+Description: Linux kernel image for version 2.6.11 on 32-bit PA-RISC
+ This package contains the Linux kernel image for version 2.6.11 on
+ 32-bit HP PA-RISC, the corresponding System.map file, and the modules
+ built by the packager. It also contains scripts that try to ensure that
+ the system is not left in a unbootable state after an update.
+ .
+ Kernel image packages are generally produced using kernel-package,
+ and it is suggested that you install that package if you wish to create a
+ custom kernel from the sources.
+
+Package: kernel-headers-2.6.11-1-64
+Architecture: hppa
+Section: devel
+Priority: optional
+Depends: coreutils | fileutils (>= 4.0), kernel-headers-2.6.11-1
+Provides: kernel-headers, kernel-headers-2.6
+Description: Linux kernel headers 2.6.11 on HP PA-RISC 64-bit systems
+ This package provides kernel header files for version 2.6.11 on
+ HP PA-RISC 64-bit systems, for sites that want the latest kernel headers.
+ Please read /usr/share/doc/kernel-headers-2.6.11-1-64/debian.README.gz for
+ details.
+
+Package: kernel-image-2.6.11-1-64
+Architecture: hppa
+Section: base
+Priority: optional
+Provides: kernel-image, kernel-image-2.6
+Depends: palo, initrd-tools, coreutils | fileutils, module-init-tools
+Suggests: kernel-doc-2.6.11 | kernel-source-2.6.11
+Description: Linux kernel image for version 2.6.11 on 64-bit PA-RISC
+ This package contains the Linux kernel image for version 2.6.11 on
+ 64-bit HP PA-RISC, the corresponding System.map file, and the modules
+ built by the packager. It also contains scripts that try to ensure that
+ the system is not left in a unbootable state after an update.
+ .
+ Kernel image packages are generally produced using kernel-package,
+ and it is suggested that you install that package if you wish to create a
+ custom kernel from the sources.
+
+Package: kernel-headers-2.6.11-1-32-smp
+Architecture: hppa
+Section: devel
+Priority: optional
+Depends: coreutils | fileutils (>= 4.0), kernel-headers-2.6.11-1
+Provides: kernel-headers, kernel-headers-2.6
+Description: Linux kernel headers 2.6.11 on HP PA-RISC 32-bit systems
+ This package provides kernel header files for version 2.6.11 on
+ HP PA-RISC 32-bit systems, for sites that want the latest kernel headers.
+ Please read /usr/share/doc/kernel-headers-2.6.11-1-32/debian.README.gz for
+ details.
+
+Package: kernel-image-2.6.11-1-32-smp
+Architecture: hppa
+Section: base
+Priority: optional
+Provides: kernel-image, kernel-image-2.6
+Depends: palo, initrd-tools, coreutils | fileutils, module-init-tools
+Suggests: kernel-doc-2.6.11 | kernel-source-2.6.11
+Description: Linux kernel image for version 2.6.11 on 32-bit PA-RISC
+ This package contains the Linux kernel image for version 2.6.11 on
+ 32-bit HP PA-RISC, the corresponding System.map file, and the modules
+ built by the packager. It also contains scripts that try to ensure that
+ the system is not left in a unbootable state after an update.
+ .
+ Kernel image packages are generally produced using kernel-package,
+ and it is suggested that you install that package if you wish to create a
+ custom kernel from the sources.
+
+Package: kernel-headers-2.6.11-1-64-smp
+Architecture: hppa
+Section: devel
+Priority: optional
+Depends: coreutils | fileutils (>= 4.0), kernel-headers-2.6.11-1
+Provides: kernel-headers, kernel-headers-2.6
+Description: Linux kernel headers 2.6.11 on HP PA-RISC 64-bit systems
+ This package provides kernel header files for version 2.6.11 on
+ HP PA-RISC 64-bit systems, for sites that want the latest kernel headers.
+ Please read /usr/share/doc/kernel-headers-2.6.11-1-64/debian.README.gz for
+ details.
+
+Package: kernel-image-2.6.11-1-64-smp
+Architecture: hppa
+Section: base
+Priority: optional
+Provides: kernel-image, kernel-image-2.6smp
+Depends: palo, initrd-tools, coreutils | fileutils, module-init-tools
+Suggests: kernel-doc-2.6.11 | kernel-source-2.6.11
+Description: Linux kernel image for version 2.6.11 on 64-bit PA-RISC
+ This package contains the Linux kernel image for version 2.6.11 on
+ 64-bit HP PA-RISC, the corresponding System.map file, and the modules
+ built by the packager. It also contains scripts that try to ensure that
+ the system is not left in a unbootable state after an update.
+ .
+ Kernel image packages are generally produced using kernel-package,
+ and it is suggested that you install that package if you wish to create a
+ custom kernel from the sources.
+

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/copyright
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/copyright	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/copyright	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,28 @@
+This is the Debian GNU/Linux prepackaged version of the Linux kernel for
+systems using the Hewlett-Packard PA-RISC (HPPA) processor family.
+
+This package was constructed by Kyle McMartin <kyle at debian.org> using the 
+HP PA-RISC specific patchset downloaded from:
+
+	http://cvs.parisc-linux.org/download/linux-2.6/
+
+Linux is copyrighted by Linus Torvalds and others, and released under 
+version 2 of the GNU General Public License, with the following addition:
+
+
+   NOTE! This copyright does *not* cover user programs that use kernel
+ services by normal system calls - this is merely considered normal use
+ of the kernel, and does *not* fall under the heading of "derived work".
+ Also note that the GPL below is copyrighted by the Free Software
+ Foundation, but the instance of code that it refers to (the Linux
+ kernel) is copyrighted by me and others who actually wrote it.
+
+ Also note that the only valid version of the GPL as far as the kernel
+ is concerned is _this_ license (ie v2), unless explicitly otherwise
+ stated.
+
+			Linus Torvalds
+
+
+On Debian GNU/Linux systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/rules
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/rules	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/rules	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,123 @@
+#!/usr/bin/make -f
+#
+# debian/rules for kernel-image-*
+#
+# GNU copyright 1997 to 1999 by Joey Hess.
+# Copyright (c) 1999-2002 Herbert Xu <herbert at debian.org>
+#
+# $Id: rules,v 1.12 2004/04/27 11:41:35 herbert Exp $
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This is the debhelper compatability version to use.
+export DH_COMPAT=2
+
+SHELL := sh -e
+
+khsed := s/^Package: kernel-headers-\(.*\)\(-[[:digit:]]*\)$$/\1 \2/
+debver := $(shell sed -n '$(khsed); t e; b; :e; p; q' debian/control)
+export version := $(firstword $(debver))
+export debnum := $(word 2,$(debver))
+debver := $(version)$(debnum)
+appvan :=
+
+ifneq ($(debnum),)
+appvan := --append_to_version $(debnum)
+endif
+
+addpatch := --added-patches debian,hppa_$(shell echo $(version) | tr '.' '_')
+
+flavours := $(shell \
+        find config -maxdepth 1 -type f ! -name default -printf '%f\n' \
+)
+
+ktver := $(shell \
+	sed -n 's/.*kernel-tree-\([^,]*\).*/\1/p; t e; b; :e q' \
+		debian/control \
+)
+
+kbsed := s/^Depends: .*\(kernel-kbuild-[^ ,]*\).*/\1/p
+kbpkg := $(shell sed -n '$(kbsed); t e; b; :e q' debian/control)
+
+export DEBIAN_SRCTOP := $(CURDIR)/kernel-source-$(version)
+export DEBIAN_UPSTREAM_VERSION := $(version)
+
+unpack: unpack-stamp
+unpack-stamp:
+	dh_testdir
+	tar jxf /usr/src/kernel-source-$(version).tar.bz2
+	cd kernel-source-$(version); \
+		/usr/src/kernel-patches/all/$(version)/apply/debian $(ktver)
+	mkdir -p kernel-source-$(version)/debian
+	cp debian/changelog kernel-source-$(version)/debian
+	cp debian/control kernel-source-$(version)/debian
+	cp debian/copyright kernel-source-$(version)/debian
+	> kernel-source-$(version)/debian/official
+	install post-install kernel-source-$(version)/debian
+	for i in $(flavours); do \
+		cp -al kernel-source-$(version) build-$$i; \
+		cp config/$$i build-$$i/.config; \
+	done
+	cp config/default kernel-source-$(version)/.config
+	ln -s `command -v touch` bin/touch.orig
+	sed 's/@kbpkg@/$(kbpkg)/g' header-install > header-install.out
+	chmod u+x header-install.out
+
+	touch unpack-stamp
+
+build: build-stamp
+build-stamp: unpack-stamp
+	dh_testdir
+	PATH=$$PWD/bin:$$PATH; \
+	for i in $(flavours); do \
+		cd build-$$i; \
+		make-kpkg $(addpatch) --append_to_version $(debnum)-$$i \
+		build; \
+		cd ..; \
+	done
+
+	touch build-stamp
+
+debnum:
+	@echo $(debnum)
+
+clean:
+	dh_testdir
+	rm -f unpack-stamp build-stamp
+	rm -rf kernel-source-$(version) build-* install-* *.deb
+	rm -f bin/touch.orig
+	rm -f header-install.out
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_clean -k
+	dh_installdirs
+
+# Build architecture-independent files here.
+binary-indep:
+
+# Build architecture-dependent files here.
+binary-arch: install
+	dh_testdir
+
+	cd kernel-source-$(version); \
+		 HEADER_CLEAN_HOOK=$(CURDIR)/header-install.out \
+			 make-kpkg $(addpatch) $(appvan) kernel-headers
+	mv kernel-source-$(version)/debian/files debian
+
+	for i in $(flavours); do \
+		cp -al build-$$i install-$$i; \
+		cd install-$$i; \
+		make-kpkg $(addpatch) --append_to_version $(debnum)-$$i \
+			--initrd kernel-image; \
+		cd ..; \
+		cat install-$$i/debian/files >> debian/files; \
+		rm -rf install-$$i; \
+	done
+	
+	mv *.deb ..
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install unpack


Property changes on: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/header-install
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/header-install	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/header-install	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+set -e
+
+kbpkg=@kbpkg@
+
+cd $DEBIAN_SRCTOP
+{
+	find . -path './scripts/*' -prune -o \
+		-path './Documentation/*' -prune -o \
+		-path './debian/*' -prune -o \
+		-type f \( -name Makefile -o -name 'Kconfig*' \) -print
+	echo arch/$DEB_HOST_ARCH/kernel/asm-offsets.s
+} | cpio -pd --preserve-modification-time $OLDPWD
+cd - > /dev/null
+ln -s ../$kbpkg/scripts .
+
+remove=
+cd include
+for i in asm-*; do
+	case ${i#asm-} in
+	generic | parisc)
+		;;
+	*)
+		remove="$remove $i"
+		;;
+	esac
+done
+${remove:+rm -r $remove}

Added: trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/post-install
===================================================================
--- trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/post-install	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-image-2.6.11-hppa-2.6.11/post-install	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+set -e
+
+debhelper_pre() {
+	dh_clean -k --package="$1"
+	dh_installdirs --package="$1"
+}
+
+debhelper_post() {
+	dh_installdocs --package="$1"
+	dh_installchangelogs --package="$1"
+	dh_compress --package="$1"
+	dh_fixperms --package="$1"
+	dh_installdeb --package="$1"
+	dh_gencontrol --package="$1"
+	dh_md5sums --package="$1"
+	dh_builddeb --package="$1"
+}
+
+prefix=$DEBIAN_UPSTREAM_VERSION$debnum
+pkg=kernel-headers-$version
+top=$PWD/debian/$pkg
+dir=$top/usr/src/kernel-headers-$version
+
+debhelper_pre $pkg
+
+mkdir -p $dir/include/linux
+
+cp -a .config $dir
+echo $debnum-$suffix > $dir/.extraversion
+cp -a Module.symvers $dir
+
+find . -mindepth 1 -maxdepth 1 \
+	! -name debian -a ! -name Documentation -a ! -name include -a \
+	! -name '.*' -a \( \
+	-name Makefile -o -type d \) \
+	-printf "../kernel-headers-$prefix/%f\n" |
+	xargs ln -s --target-directory=$dir
+
+cd include
+find . -mindepth 1 -maxdepth 1 \
+	! -name config -a ! -name linux -a \( \
+	! -name 'asm-*' -o -name asm-generic -o -name asm-$DEB_HOST_ARCH \) \
+	-printf "../../kernel-headers-$prefix/include/%f\n" |
+	xargs ln -s --target-directory=$dir/include
+cp -a config $dir/include
+find linux -mindepth 1 -maxdepth 1 \
+	! -name autoconf.h -a \
+	! -name compile.h -a ! -name version.h \
+	-printf "../../../kernel-headers-$prefix/include/linux/%f\n" |
+	xargs ln -s --target-directory=$dir/include/linux
+cp -a linux/autoconf.h linux/compile.h \
+	linux/version.h $dir/include/linux
+cd ..
+
+mkdir -p $top/lib/modules/$version
+ln -s /usr/src/kernel-headers-$version $top/lib/modules/$version/build
+
+debhelper_post $pkg
+
+
+cd $IMAGE_TOP/lib/modules/$version
+mkdir boot initrd

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/README.Debian
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/README.Debian	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/README.Debian	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,8 @@
+NOTES TO PACKAGE USERS
+======================
+
+  To use this patch with make-kpkg, use a command like:
+
+$ PATCH_THE_KERNEL=YES make-kpkg --added_patches=hppa --config=menuconfig
+
+  Read the make-kpkg documentation for more information.

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/changelog
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/changelog	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/changelog	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,52 @@
+kernel-patch-2.6.11-hppa (2.6.11-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+  * We are synced with 2.6.11-pa2 in the parisc-linux tree.
+
+ -- Kyle McMartin <kyle at debian.org>  Sun, 13 Mar 2005 02:51:01 -0500
+
+kernel-patch-2.6.10-hppa (2.6.10-1) unstable; urgency=low
+
+  * New upstream release.
+  * We are at 2.6.10-pa1 according to the parisc-linux tree. All merges
+    from this point on will be backports from the top of the tree.
+  * Patches:
+    + serial_mux_include_irq:
+      - Fix build of drivers/serial/mux.c, needs NO_IRQ definition
+        from asm/irq.h.
+
+ -- Kyle McMartin <kyle at debian.org>  Fri, 21 Jan 2005 02:46:08 -0500
+
+kernel-patch-2.6.8-hppa (2.6.8-5) unstable; urgency=low
+
+  * Fix a reject in drivers/serial/8250.c.
+
+ -- Kyle McMartin <kyle at debian.org>  Sat, 15 Jan 2005 21:49:11 -0500
+
+kernel-patch-2.6.8-hppa (2.6.8-4) unstable; urgency=low
+
+  * Sync to 2.6.8.1-pa11.
+
+ -- Kyle McMartin <kyle at debian.org>  Sat, 16 Oct 2004 10:20:11 -0400
+
+kernel-patch-2.6.8-hppa (2.6.8-3) unstable; urgency=high
+
+  * Priority high because we want 2.6.8-pa7 in sarge.
+     Justification is improved hardware support, and proper SMP,
+     among other reasons.
+  * Sync to newest upstream 2.6.8.1-pa7.
+
+ -- Kyle McMartin <kyle at debian.org>  Mon, 23 Aug 2004 01:03:04 -0400
+
+kernel-patch-2.6.8-hppa (2.6.8-2) unstable; urgency=low
+
+  * Sync to newest upstream 2.6.8.1-pa5.
+ 
+ -- Kyle McMartin <kyle at debian.org>  Thu, 19 Aug 2004 15:54:19 -0400
+
+kernel-patch-2.6.8-hppa (2.6.8-1) unstable; urgency=low
+
+  * Initial release, 2.6.8.1-pa4 synced.
+
+ -- Kyle McMartin <kyle at debian.org>  Tue, 17 Aug 2004 03:22:11 -0400
+

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/control
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/control	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/control	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,14 @@
+Source: kernel-patch-2.6.11-hppa
+Section: devel
+Priority: extra
+Maintainer: Kyle McMartin <kyle at debian.org>
+Uploaders: LaMont Jones <lamont at debian.org>, Bdale Garbee <bdale at gag.com>, Thibaut VARENE <varenet at debian.org>
+Standards-Version: 3.6.1
+Build-Depends-Indep: debhelper, dh-kpatches (>= 0.99.21)
+
+Package: kernel-patch-2.6.11-hppa
+Architecture: all
+Depends: ${kpatch:Depends}
+Description: Diffs to the kernel source for HP PA-RISC (2.6)
+ The HP PA-RISC kernel is maintained at cvs.parisc-linux.org as a patch set
+ distinct from Linus Torvalds' official copy.  

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/copyright
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/copyright	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/copyright	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,31 @@
+This is the Debian GNU/Linux prepackaged version of the Linux kernel for
+systems using the Hewlett-Packard PA-RISC (HPPA) processor family.
+
+This package was constructed by Kyle McMartin <kyle at debian.org> using the 
+HP PA-RISC specific patchset downloaded from:
+
+	http://cvs.parisc-linux.org/download/linux-2.6/
+
+The contents of the debian/ directory and other portions of this package
+not covered under other copyright are Copyright 2004 by Kyle McMartin, and
+released under the GNU General Public License.
+
+Linux is copyrighted by Linus Torvalds and others, and released under 
+version 2 of the GNU General Public License, with the following addition:
+
+
+   NOTE! This copyright does *not* cover user programs that use kernel
+ services by normal system calls - this is merely considered normal use
+ of the kernel, and does *not* fall under the heading of "derived work".
+ Also note that the GPL below is copyrighted by the Free Software
+ Foundation, but the instance of code that it refers to (the Linux
+ kernel) is copyrighted by me and others who actually wrote it.
+
+ Also note that the only valid version of the GPL as far as the kernel
+ is concerned is _this_ license (ie v2), unless explicitly otherwise
+ stated.
+
+			Linus Torvalds
+
+On Debian GNU/Linux systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/kpatches.arch
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/kpatches.arch	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/kpatches.arch	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,7 @@
+Patch-name: hppa architecture
+Patch-id: hppa_2_6_11
+Path-strip-level: 1
+
+Patch-file: hppa_2.6.11.diff
+Architecture: hppa
+Kernel-version: 2.6.11

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/rules
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/rules	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/rules	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,43 @@
+#! /usr/bin/make -f
+
+PACKAGE=kernel-patch-2.6.11-hppa
+
+####################
+
+arch=$(shell dpkg --print-architecture)
+
+topdir=$(shell pwd)
+destdir=${topdir}/debian/tmp
+docdir=${destdir}/usr/share/doc/${PACKAGE}
+
+build:
+	dh_testdir
+
+clean:
+	find . -name .svn | xargs rm -rf
+	dh_testdir
+	dh_testroot
+	dh_clean
+
+binary-arch:	build
+
+binary-indep:	build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+
+	mkdir $(destdir)
+	dh_installkpatches
+	dh_installchangelogs
+	dh_installdocs
+
+	dh_compress
+	dh_fixperms
+	dh_installdeb
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-arch binary-indep
+
+.PHONY: binary binary-arch binary-indep clean checkroot


Property changes on: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/hppa_2.6.11.diff
===================================================================
--- trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/hppa_2.6.11.diff	2005-03-22 17:40:10 UTC (rev 2793)
+++ trunk/kernel/hppa/kernel-patch-2.6.11-hppa-2.6.11/hppa_2.6.11.diff	2005-03-22 18:51:30 UTC (rev 2794)
@@ -0,0 +1,28834 @@
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/Documentation/kernel-parameters.txt CVS2_6_11_PA2/Documentation/kernel-parameters.txt
+--- LINUS_2_6_11/Documentation/kernel-parameters.txt	2005-03-02 04:18:53.000000000 -0700
++++ CVS2_6_11_PA2/Documentation/kernel-parameters.txt	2005-02-13 19:54:56.000000000 -0700
+@@ -1345,9 +1345,6 @@
+ 	sym53c416=	[HW,SCSI]
+ 			See header of drivers/scsi/sym53c416.c.
+ 
+-	sym53c8xx=	[HW,SCSI]
+-			See Documentation/scsi/ncr53c8xx.txt.
+-
+ 	t128=		[HW,SCSI]
+ 			See header of drivers/scsi/t128.c.
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/Documentation/parisc/00-INDEX CVS2_6_11_PA2/Documentation/parisc/00-INDEX
+--- LINUS_2_6_11/Documentation/parisc/00-INDEX	2005-03-02 04:18:54.000000000 -0700
++++ CVS2_6_11_PA2/Documentation/parisc/00-INDEX	2004-11-11 08:52:52.000000000 -0700
+@@ -1,10 +1,6 @@
+ 00-INDEX
+ 	- this file.
+-IODC.txt
+-	- Documentation IODC
+ debugging
+ 	- some debugging hints for real-mode code
+-mm
+-	- Documentation on parisc mm status
+ registers
+ 	- current/planned usage of registers
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/Documentation/parisc/todo CVS2_6_11_PA2/Documentation/parisc/todo
+--- LINUS_2_6_11/Documentation/parisc/todo	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/Documentation/parisc/todo	2005-02-07 11:34:52.000000000 -0700
+@@ -0,0 +1,83 @@
++Status 2005-02-07 :
++-------------------
++ - Merged to 2.6.11-rc3
++
++Todo:
++-----
++
++ - Review and eliminate all warnings for io accesses with an eye to
++   turning on ioremap
++ - 2005-02-04 (Carlos) Review the gettimeofday
++   implementation, possibly use a light-weight-syscall and
++   rely on cr16 and cpu speed for more accurate timing?
++   This requires adding some backwards compatibility code in
++   userspace since the LWS might not be available on the
++   booted kernel. Detecting LWS is a problem.
++ - PREEMPT support
++ - CPU hotplug: we cannot bring up cpus after init, and we don't know if we can
++   shutdown cpus
++ - task_struct/thread_info split -- task_struct should not be visible in
++   entry.S, we need to move some items into thread_info -- this includes
++   pt_regs and maybe some of the flags (ptrace, etc)
++ - flush_tlb_kernel_range is horribly inefficient. this has been merged
++   with the userspace tlb flush, but it has a magic constant that needs
++   tuning
++ - Superdome support
++ - our PDC early debug console hacks need to be cleaned up somehow
++ - CPU IRQ affinity (willy)
++ - Allow more than BITS_PER_LONG cpu interrupts to be allocated (willy)
++ - 64-bit userspace (Leandro)
++ - syscall signal return path needs work, we don't loop on signal
++   delivery like other archs.
++	= 2005-02-04 (Carlos) This entry should be more specific,
++	we recently fixed do_signal such that it always
++	loops forcing the signal. If this was the bug then it was
++	fixed.
++
++
++Drivers
++-------
++
++ - write Lasi floppy driver
++ - write Suckyio floppy driver
++ - write spifi driver (rbrad)
++ - modify ncr53c8xx driver for Outfield (735 & 755)
++ - write GSC FDDI driver
++ - write Timi ASIC (74x) support
++ - EISA DMA support
++
++
++Started and in progress:
++------------------------
++ - 2004-08-16 (Carlos)
++   64-bit binutils needs to be fixed to get multiple stub
++   section support.
++ - port hil_kbd.c to new input layer
++ - port hil_ptr.c to new input layer
++
++
++CONFIG options without help:
++-----------------------------
++ - REVIEW THESE ENTRIES!
++
++ _USB_OHCI_HCD (add parisc info?)
++ _HP_SDC_RTC
++ _HIL_MLC
++ _HIL_KBD (to improve)
++ _HIL_PTR (to improve)
++
++ 
++Review all the todo entries below!
++----------------------------------
++
++ - the fix for do_fork needs checking
++ - ad1889 driver: only works with .wav;  Convert to ALSA (ggg, tausq, tbone)
++ - ns87415 dma doesn't work reliably on suckyio-systems
++ - (ab)use kmap/kunmap on 64-bit to eliminate flush_dcache calls.
++ - cp_new_stat32 for sys_parisc32.c is inefficient; maybe it's better
++   to fill in a tmp stat32 and just do copy_to_user in one go at the end?
++ - investigate not putting in extable entries for put_kernel_asm; will
++   probably reduce kernel size
++ - fix HIL problem: ksoftirqd/0 eats 56% cpu (kernel 2.4 & kernel 2.6)
++ - NPTL kernel support (CLONE_*TID flags need to be correctly handled by 
++   sys_clone() and friends)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/Documentation/scsi/sym53c8xx_2.txt CVS2_6_11_PA2/Documentation/scsi/sym53c8xx_2.txt
+--- LINUS_2_6_11/Documentation/scsi/sym53c8xx_2.txt	2005-03-02 04:18:55.000000000 -0700
++++ CVS2_6_11_PA2/Documentation/scsi/sym53c8xx_2.txt	2004-12-26 10:32:18.000000000 -0700
+@@ -440,7 +440,7 @@
+ The following command will install the driver module with the same
+ options as above.
+ 
+-    modprobe sym53c8xx cmd_per_lun=4 sync=10 debug=0x200"
++    modprobe sym53c8xx cmd_per_lun=4 sync=10 debug=0x200
+ 
+ 10.2 Available arguments
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/MAINTAINERS CVS2_6_11_PA2/MAINTAINERS
+--- LINUS_2_6_11/MAINTAINERS	2005-03-02 04:18:52.000000000 -0700
++++ CVS2_6_11_PA2/MAINTAINERS	2005-02-19 17:56:46.000000000 -0700
+@@ -199,6 +199,13 @@
+ W:	http://linux.thorsten-knabe.de
+ S:	Maintained
+ 
++AD1889 SOUND DRIVER
++P:	Kyle McMartin
++M:	kyle at parisc-linux.org
++W:	http://www.parisc-linux.org/~kyle/ad1889/
++L:	parisc-linux at lists.parisc-linux.org
++S:	Maintained
++
+ ADM1025 HARDWARE MONITOR DRIVER
+ P:	Jean Delvare
+ M:	khali at linux-fr.org
+@@ -916,6 +923,13 @@
+ W:	http://hq.pm.waw.pl/hdlc/
+ S:	Maintained
+ 
++HARMONY SOUND DRIVER
++P:	Kyle McMartin
++M:	kyle at parisc-linux.org
++W:	http://www.parisc-linux.org/~kyle/harmony/
++L:	parisc-linux at lists.parisc-linux.org
++S:	Maintained
++
+ HAYES ESP SERIAL DRIVER
+ P:	Andrew J. Robinson
+ M:	arobinso at nyx.net
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/Kconfig CVS2_6_11_PA2/arch/parisc/Kconfig
+--- LINUS_2_6_11/arch/parisc/Kconfig	2005-03-02 04:18:59.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/Kconfig	2005-02-04 12:34:34.000000000 -0700
+@@ -6,8 +6,7 @@
+ mainmenu "Linux/PA-RISC Kernel Configuration"
+ 
+ config PARISC
+-	bool
+-	default y
++	def_bool y
+ 	help
+ 	  The PA-RISC microprocessor is designed by Hewlett-Packard and used
+ 	  in many of their workstations & servers (HP9000 700 and 800 series,
+@@ -15,19 +14,16 @@
+ 	  at <http://www.parisc-linux.org/>.
+ 
+ config MMU
+-	bool
+-	default y
++	def_bool y
+ 
+ config STACK_GROWSUP
+-	bool
+-	default y
++	def_bool y
+ 
+ config UID16
+ 	bool
+ 
+ config RWSEM_GENERIC_SPINLOCK
+-	bool
+-	default y
++	def_bool y
+ 
+ config RWSEM_XCHGADD_ALGORITHM
+ 	bool
+@@ -111,7 +107,7 @@
+ 	def_bool y
+ 	depends on PA8X00
+ 
+-config PARISC64
++config 64BIT
+ 	bool "64-bit kernel"
+ 	depends on PA8X00
+ 	help
+@@ -124,9 +120,6 @@
+ 	  enable this option otherwise. The 64bit kernel is significantly bigger
+ 	  and slower than the 32bit one.
+ 
+-config 64BIT
+-	def_bool PARISC64
+-
+ config SMP
+ 	bool "Symmetric multi-processing support"
+ 	---help---
+@@ -166,13 +159,12 @@
+ 	default n
+ 
+ config COMPAT
+-	bool
+-	depends on PARISC64
+-	default y
++	def_bool y
++	depends on 64BIT
+ 
+ config HPUX
+ 	bool "Support for HP-UX binaries"
+-	depends on !PARISC64
++	depends on !64BIT
+ 
+ config NR_CPUS
+ 	int "Maximum number of CPUs (2-32)"
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/Makefile CVS2_6_11_PA2/arch/parisc/Makefile
+--- LINUS_2_6_11/arch/parisc/Makefile	2005-03-02 04:18:59.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/Makefile	2005-02-04 12:34:34.000000000 -0700
+@@ -17,9 +17,12 @@
+ # Mike Shaver, Helge Deller and Martin K. Petersen
+ #
+ NM		= sh $(srctree)/arch/parisc/nm
+-ifdef CONFIG_PARISC64
++CHECKFLAGS	+= -D__hppa__=1
++
++ifdef CONFIG_64BIT
+ CROSS_COMPILE	:= hppa64-linux-
+ UTS_MACHINE	:= parisc64
++CHECKFLAGS	+= -D__LP64__=1 -m64
+ else
+ MACHINE := $(subst 64,,$(shell uname -m))
+ ifneq ($(MACHINE),parisc)
+@@ -65,8 +68,12 @@
+ 
+ drivers-$(CONFIG_OPROFILE)		+= arch/parisc/oprofile/
+ 
++PALO := $(shell if which palo; then : ; \
++	elif [ -x /sbin/palo ]; then echo /sbin/palo; \
++	fi)
++
+ palo: vmlinux
+-	@if [ $$(palo -f /dev/null >/dev/null 2>&1 ; echo $$?) != 2 ]; then \
++	@if [ -x $PALO ]; then \
+ 		echo 'ERROR: Please install palo first (apt-get install palo)';\
+ 		echo 'or build it from source and install it somewhere in your $$PATH';\
+ 		false; \
+@@ -78,7 +85,7 @@
+ 		echo 'WARNING: the "lifimage" file is now placed in this directory by default!'; \
+ 		false; \
+ 	fi
+-	palo -f ./palo.conf
++	$(PALO) -f ./palo.conf
+ 
+ oldpalo: vmlinux
+ 	export TOPDIR=`pwd`; \
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/configs/a500_defconfig CVS2_6_11_PA2/arch/parisc/configs/a500_defconfig
+--- LINUS_2_6_11/arch/parisc/configs/a500_defconfig	2005-03-02 04:18:59.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/configs/a500_defconfig	2005-02-16 14:19:58.000000000 -0700
+@@ -1,12 +1,15 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.10-pa5
+-# Wed Jan  5 13:22:34 2005
++# Linux kernel version: 2.6.11-rc4-pa1
++# Wed Feb 16 11:32:49 2005
+ #
+ CONFIG_PARISC=y
+ CONFIG_MMU=y
+ CONFIG_STACK_GROWSUP=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_GENERIC_IRQ_PROBE=y
+ 
+ #
+ # Code maturity level options
+@@ -68,7 +71,6 @@
+ CONFIG_PA8X00=y
+ CONFIG_PA20=y
+ CONFIG_PREFETCH=y
+-CONFIG_PARISC64=y
+ CONFIG_64BIT=y
+ CONFIG_SMP=y
+ CONFIG_HOTPLUG_CPU=y
+@@ -87,16 +89,12 @@
+ CONFIG_PCI_LBA=y
+ CONFIG_IOSAPIC=y
+ CONFIG_IOMMU_SBA=y
+-# CONFIG_SUPERIO is not set
+-# CONFIG_CHASSIS_LCD_LED is not set
+-CONFIG_PDC_CHASSIS=y
+ 
+ #
+ # PCCARD (PCMCIA/CardBus) support
+ #
+ CONFIG_PCCARD=m
+ # CONFIG_PCMCIA_DEBUG is not set
+-# CONFIG_PCMCIA_OBSOLETE is not set
+ CONFIG_PCMCIA=m
+ CONFIG_CARDBUS=y
+ 
+@@ -107,6 +105,7 @@
+ CONFIG_PD6729=m
+ CONFIG_I82092=m
+ CONFIG_TCIC=m
++CONFIG_PCCARD_NONSTATIC=m
+ 
+ #
+ # PCI Hotplug Support
+@@ -114,6 +113,14 @@
+ # CONFIG_HOTPLUG_PCI is not set
+ 
+ #
++# PA-RISC specific drivers
++#
++# CONFIG_SUPERIO is not set
++# CONFIG_CHASSIS_LCD_LED is not set
++CONFIG_PDC_CHASSIS=y
++CONFIG_PDC_STABLE=y
++
++#
+ # Executable file formats
+ #
+ CONFIG_BINFMT_ELF=y
+@@ -153,6 +160,7 @@
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+ CONFIG_BLK_DEV_UMEM=m
++# CONFIG_BLK_DEV_COW_COMMON is not set
+ CONFIG_BLK_DEV_LOOP=y
+ # CONFIG_BLK_DEV_CRYPTOLOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
+@@ -171,6 +179,7 @@
+ CONFIG_IOSCHED_AS=y
+ CONFIG_IOSCHED_DEADLINE=y
+ CONFIG_IOSCHED_CFQ=y
++# CONFIG_ATA_OVER_ETH is not set
+ 
+ #
+ # ATA/ATAPI/MFM/RLL support
+@@ -205,6 +214,7 @@
+ #
+ CONFIG_SCSI_SPI_ATTRS=y
+ CONFIG_SCSI_FC_ATTRS=m
++CONFIG_SCSI_ISCSI_ATTRS=m
+ 
+ #
+ # SCSI low-level drivers
+@@ -231,10 +241,10 @@
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
+ CONFIG_SCSI_SYM53C8XX_2=y
+-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
++CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
+ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+-CONFIG_SCSI_SYM53C8XX_IOMAPPED=y
++# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+ # CONFIG_SCSI_IPR is not set
+ # CONFIG_SCSI_PCI2000 is not set
+ # CONFIG_SCSI_PCI2220I is not set
+@@ -249,7 +259,6 @@
+ CONFIG_SCSI_QLA2300=m
+ CONFIG_SCSI_QLA2322=m
+ CONFIG_SCSI_QLA6312=m
+-CONFIG_SCSI_QLA6322=m
+ # CONFIG_SCSI_DC395x is not set
+ # CONFIG_SCSI_DC390T is not set
+ CONFIG_SCSI_DEBUG=m
+@@ -399,8 +408,6 @@
+ CONFIG_IP_NF_ARPTABLES=m
+ CONFIG_IP_NF_ARPFILTER=m
+ CONFIG_IP_NF_ARP_MANGLE=m
+-# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+-# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+ CONFIG_XFRM=y
+ CONFIG_XFRM_USER=m
+ 
+@@ -465,7 +472,7 @@
+ #
+ CONFIG_NET_TULIP=y
+ CONFIG_DE2104X=m
+-CONFIG_TULIP=m
++CONFIG_TULIP=y
+ # CONFIG_TULIP_MWI is not set
+ CONFIG_TULIP_MMIO=y
+ # CONFIG_TULIP_NAPI is not set
+@@ -483,7 +490,6 @@
+ # CONFIG_FORCEDETH is not set
+ # CONFIG_DGRS is not set
+ CONFIG_EEPRO100=m
+-# CONFIG_EEPRO100_PIO is not set
+ CONFIG_E100=m
+ CONFIG_E100_NAPI=y
+ # CONFIG_FEALNX is not set
+@@ -524,6 +530,7 @@
+ CONFIG_IXGB_NAPI=y
+ CONFIG_S2IO=m
+ CONFIG_S2IO_NAPI=y
++# CONFIG_2BUFF_MODE is not set
+ 
+ #
+ # Token Ring devices
+@@ -691,7 +698,6 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_AGP is not set
+ # CONFIG_DRM is not set
+ 
+ #
+@@ -733,9 +739,9 @@
+ #
+ # Console display driver support
+ #
++CONFIG_DUMMY_CONSOLE=y
+ CONFIG_DUMMY_CONSOLE_COLUMNS=160
+ CONFIG_DUMMY_CONSOLE_ROWS=64
+-CONFIG_DUMMY_CONSOLE=y
+ 
+ #
+ # Sound
+@@ -764,6 +770,15 @@
+ # CONFIG_MMC is not set
+ 
+ #
++# InfiniBand support
++#
++CONFIG_INFINIBAND=m
++CONFIG_INFINIBAND_MTHCA=m
++# CONFIG_INFINIBAND_MTHCA_DEBUG is not set
++CONFIG_INFINIBAND_IPOIB=m
++# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
++
++#
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+@@ -775,10 +790,16 @@
+ # CONFIG_REISERFS_FS is not set
+ CONFIG_JFS_FS=m
+ # CONFIG_JFS_POSIX_ACL is not set
++# CONFIG_JFS_SECURITY is not set
+ # CONFIG_JFS_DEBUG is not set
+ # CONFIG_JFS_STATISTICS is not set
+ CONFIG_FS_POSIX_ACL=y
++
++#
++# XFS support
++#
+ CONFIG_XFS_FS=m
++CONFIG_XFS_EXPORT=y
+ # CONFIG_XFS_RT is not set
+ # CONFIG_XFS_QUOTA is not set
+ # CONFIG_XFS_SECURITY is not set
+@@ -786,7 +807,7 @@
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
+ # CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
++CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ CONFIG_AUTOFS4_FS=y
+ 
+@@ -817,7 +838,8 @@
+ CONFIG_SYSFS=y
+ # CONFIG_DEVFS_FS is not set
+ # CONFIG_DEVPTS_FS_XATTR is not set
+-# CONFIG_TMPFS is not set
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
+@@ -935,6 +957,8 @@
+ # CONFIG_DEBUG_SPINLOCK is not set
+ # CONFIG_DEBUG_KOBJECT is not set
+ # CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_IOREMAP is not set
++# CONFIG_DEBUG_FS is not set
+ # CONFIG_DEBUG_RWLOCK is not set
+ 
+ #
+@@ -973,6 +997,10 @@
+ CONFIG_CRYPTO_TEST=m
+ 
+ #
++# Hardware crypto devices
++#
++
++#
+ # Library routines
+ #
+ CONFIG_CRC_CCITT=m
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/configs/n4000_defconfig CVS2_6_11_PA2/arch/parisc/configs/n4000_defconfig
+--- LINUS_2_6_11/arch/parisc/configs/n4000_defconfig	2005-03-02 04:18:59.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/configs/n4000_defconfig	1969-12-31 17:00:00.000000000 -0700
+@@ -1,927 +0,0 @@
+-#
+-# Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.10-pa5
+-# Wed Jan  5 13:40:36 2005
+-#
+-CONFIG_PARISC=y
+-CONFIG_MMU=y
+-CONFIG_STACK_GROWSUP=y
+-CONFIG_RWSEM_GENERIC_SPINLOCK=y
+-
+-#
+-# Code maturity level options
+-#
+-CONFIG_EXPERIMENTAL=y
+-# CONFIG_CLEAN_COMPILE is not set
+-CONFIG_BROKEN=y
+-CONFIG_BROKEN_ON_SMP=y
+-
+-#
+-# General setup
+-#
+-CONFIG_LOCALVERSION=""
+-CONFIG_SWAP=y
+-CONFIG_SYSVIPC=y
+-CONFIG_POSIX_MQUEUE=y
+-# CONFIG_BSD_PROCESS_ACCT is not set
+-CONFIG_SYSCTL=y
+-# CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=16
+-CONFIG_HOTPLUG=y
+-CONFIG_KOBJECT_UEVENT=y
+-CONFIG_IKCONFIG=y
+-CONFIG_IKCONFIG_PROC=y
+-CONFIG_EMBEDDED=y
+-CONFIG_KALLSYMS=y
+-CONFIG_KALLSYMS_ALL=y
+-# CONFIG_KALLSYMS_EXTRA_PASS is not set
+-CONFIG_FUTEX=y
+-CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+-CONFIG_SHMEM=y
+-CONFIG_CC_ALIGN_FUNCTIONS=0
+-CONFIG_CC_ALIGN_LABELS=0
+-CONFIG_CC_ALIGN_LOOPS=0
+-CONFIG_CC_ALIGN_JUMPS=0
+-# CONFIG_TINY_SHMEM is not set
+-
+-#
+-# Loadable module support
+-#
+-CONFIG_MODULES=y
+-CONFIG_MODULE_UNLOAD=y
+-CONFIG_MODULE_FORCE_UNLOAD=y
+-CONFIG_OBSOLETE_MODPARM=y
+-# CONFIG_MODVERSIONS is not set
+-# CONFIG_MODULE_SRCVERSION_ALL is not set
+-CONFIG_KMOD=y
+-
+-#
+-# Processor type and features
+-#
+-# CONFIG_PA7000 is not set
+-# CONFIG_PA7100LC is not set
+-# CONFIG_PA7200 is not set
+-# CONFIG_PA7300LC is not set
+-CONFIG_PA8X00=y
+-CONFIG_PA20=y
+-CONFIG_PREFETCH=y
+-CONFIG_PARISC64=y
+-CONFIG_64BIT=y
+-# CONFIG_SMP is not set
+-CONFIG_DISCONTIGMEM=y
+-# CONFIG_PREEMPT is not set
+-CONFIG_COMPAT=y
+-
+-#
+-# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+-#
+-# CONFIG_GSC is not set
+-CONFIG_PCI=y
+-CONFIG_PCI_LEGACY_PROC=y
+-CONFIG_PCI_NAMES=y
+-CONFIG_PCI_LBA=y
+-CONFIG_IOSAPIC=y
+-CONFIG_IOMMU_SBA=y
+-# CONFIG_SUPERIO is not set
+-CONFIG_CHASSIS_LCD_LED=y
+-# CONFIG_PDC_CHASSIS is not set
+-
+-#
+-# PCCARD (PCMCIA/CardBus) support
+-#
+-# CONFIG_PCCARD is not set
+-
+-#
+-# PC-card bridges
+-#
+-
+-#
+-# PCI Hotplug Support
+-#
+-# CONFIG_HOTPLUG_PCI is not set
+-
+-#
+-# Executable file formats
+-#
+-CONFIG_BINFMT_ELF=y
+-# CONFIG_BINFMT_MISC is not set
+-
+-#
+-# Device Drivers
+-#
+-
+-#
+-# Generic Driver Options
+-#
+-# CONFIG_STANDALONE is not set
+-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+-CONFIG_FW_LOADER=y
+-# CONFIG_DEBUG_DRIVER is not set
+-
+-#
+-# Memory Technology Devices (MTD)
+-#
+-# CONFIG_MTD is not set
+-
+-#
+-# Parallel port support
+-#
+-# CONFIG_PARPORT is not set
+-
+-#
+-# Plug and Play support
+-#
+-
+-#
+-# Block devices
+-#
+-# CONFIG_BLK_DEV_FD is not set
+-# CONFIG_BLK_CPQ_DA is not set
+-# CONFIG_BLK_CPQ_CISS_DA is not set
+-# CONFIG_BLK_DEV_DAC960 is not set
+-CONFIG_BLK_DEV_UMEM=m
+-CONFIG_BLK_DEV_LOOP=y
+-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+-# CONFIG_BLK_DEV_NBD is not set
+-# CONFIG_BLK_DEV_SX8 is not set
+-CONFIG_BLK_DEV_RAM=y
+-CONFIG_BLK_DEV_RAM_COUNT=16
+-CONFIG_BLK_DEV_RAM_SIZE=6144
+-CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-CONFIG_CDROM_PKTCDVD=m
+-CONFIG_CDROM_PKTCDVD_BUFFERS=8
+-# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+-
+-#
+-# ATA/ATAPI/MFM/RLL support
+-#
+-# CONFIG_IDE is not set
+-
+-#
+-# SCSI device support
+-#
+-CONFIG_SCSI=y
+-CONFIG_SCSI_PROC_FS=y
+-
+-#
+-# SCSI support type (disk, tape, CD-ROM)
+-#
+-CONFIG_BLK_DEV_SD=y
+-CONFIG_CHR_DEV_ST=y
+-# CONFIG_CHR_DEV_OSST is not set
+-CONFIG_BLK_DEV_SR=y
+-# CONFIG_BLK_DEV_SR_VENDOR is not set
+-CONFIG_CHR_DEV_SG=y
+-
+-#
+-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+-#
+-CONFIG_SCSI_MULTI_LUN=y
+-# CONFIG_SCSI_CONSTANTS is not set
+-# CONFIG_SCSI_LOGGING is not set
+-
+-#
+-# SCSI Transport Attributes
+-#
+-CONFIG_SCSI_SPI_ATTRS=y
+-CONFIG_SCSI_FC_ATTRS=m
+-
+-#
+-# SCSI low-level drivers
+-#
+-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+-# CONFIG_SCSI_3W_9XXX is not set
+-# CONFIG_SCSI_ACARD is not set
+-# CONFIG_SCSI_AACRAID is not set
+-# CONFIG_SCSI_AIC7XXX is not set
+-# CONFIG_SCSI_AIC7XXX_OLD is not set
+-# CONFIG_SCSI_AIC79XX is not set
+-# CONFIG_SCSI_ADVANSYS is not set
+-# CONFIG_MEGARAID_NEWGEN is not set
+-# CONFIG_MEGARAID_LEGACY is not set
+-# CONFIG_SCSI_SATA is not set
+-# CONFIG_SCSI_BUSLOGIC is not set
+-# CONFIG_SCSI_CPQFCTS is not set
+-# CONFIG_SCSI_DMX3191D is not set
+-# CONFIG_SCSI_EATA is not set
+-# CONFIG_SCSI_EATA_PIO is not set
+-# CONFIG_SCSI_FUTURE_DOMAIN is not set
+-# CONFIG_SCSI_GDTH is not set
+-# CONFIG_SCSI_IPS is not set
+-# CONFIG_SCSI_INITIO is not set
+-# CONFIG_SCSI_INIA100 is not set
+-CONFIG_SCSI_SYM53C8XX_2=y
+-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+-CONFIG_SCSI_SYM53C8XX_IOMAPPED=y
+-# CONFIG_SCSI_IPR is not set
+-# CONFIG_SCSI_PCI2000 is not set
+-# CONFIG_SCSI_PCI2220I is not set
+-# CONFIG_SCSI_QLOGIC_ISP is not set
+-CONFIG_SCSI_QLOGIC_FC=m
+-# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
+-CONFIG_SCSI_QLOGIC_1280=m
+-# CONFIG_SCSI_QLOGIC_1280_1040 is not set
+-CONFIG_SCSI_QLA2XXX=y
+-# CONFIG_SCSI_QLA21XX is not set
+-# CONFIG_SCSI_QLA22XX is not set
+-CONFIG_SCSI_QLA2300=m
+-CONFIG_SCSI_QLA2322=m
+-CONFIG_SCSI_QLA6312=m
+-CONFIG_SCSI_QLA6322=m
+-# CONFIG_SCSI_DC395x is not set
+-# CONFIG_SCSI_DC390T is not set
+-CONFIG_SCSI_DEBUG=m
+-
+-#
+-# Multi-device support (RAID and LVM)
+-#
+-CONFIG_MD=y
+-CONFIG_BLK_DEV_MD=y
+-CONFIG_MD_LINEAR=y
+-CONFIG_MD_RAID0=y
+-CONFIG_MD_RAID1=y
+-# CONFIG_MD_RAID10 is not set
+-# CONFIG_MD_RAID5 is not set
+-# CONFIG_MD_RAID6 is not set
+-# CONFIG_MD_MULTIPATH is not set
+-# CONFIG_MD_FAULTY is not set
+-# CONFIG_BLK_DEV_DM is not set
+-
+-#
+-# Fusion MPT device support
+-#
+-CONFIG_FUSION=m
+-CONFIG_FUSION_MAX_SGE=40
+-CONFIG_FUSION_CTL=m
+-
+-#
+-# IEEE 1394 (FireWire) support
+-#
+-# CONFIG_IEEE1394 is not set
+-
+-#
+-# I2O device support
+-#
+-# CONFIG_I2O is not set
+-
+-#
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-CONFIG_PACKET_MMAP=y
+-CONFIG_NETLINK_DEV=y
+-CONFIG_UNIX=y
+-CONFIG_NET_KEY=m
+-CONFIG_INET=y
+-CONFIG_IP_MULTICAST=y
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-CONFIG_IP_PNP_BOOTP=y
+-# CONFIG_IP_PNP_RARP is not set
+-# CONFIG_NET_IPIP is not set
+-# CONFIG_NET_IPGRE is not set
+-# CONFIG_IP_MROUTE is not set
+-# CONFIG_ARPD is not set
+-# CONFIG_SYN_COOKIES is not set
+-CONFIG_INET_AH=m
+-CONFIG_INET_ESP=m
+-# CONFIG_INET_IPCOMP is not set
+-# CONFIG_INET_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-
+-#
+-# IP: Virtual Server Configuration
+-#
+-# CONFIG_IP_VS is not set
+-# CONFIG_IPV6 is not set
+-CONFIG_NETFILTER=y
+-# CONFIG_NETFILTER_DEBUG is not set
+-
+-#
+-# IP: Netfilter Configuration
+-#
+-CONFIG_IP_NF_CONNTRACK=m
+-# CONFIG_IP_NF_CT_ACCT is not set
+-# CONFIG_IP_NF_CONNTRACK_MARK is not set
+-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
+-CONFIG_IP_NF_FTP=m
+-CONFIG_IP_NF_IRC=m
+-CONFIG_IP_NF_TFTP=m
+-CONFIG_IP_NF_AMANDA=m
+-CONFIG_IP_NF_QUEUE=m
+-CONFIG_IP_NF_IPTABLES=m
+-CONFIG_IP_NF_MATCH_LIMIT=m
+-CONFIG_IP_NF_MATCH_IPRANGE=m
+-CONFIG_IP_NF_MATCH_MAC=m
+-CONFIG_IP_NF_MATCH_PKTTYPE=m
+-CONFIG_IP_NF_MATCH_MARK=m
+-CONFIG_IP_NF_MATCH_MULTIPORT=m
+-CONFIG_IP_NF_MATCH_TOS=m
+-CONFIG_IP_NF_MATCH_RECENT=m
+-CONFIG_IP_NF_MATCH_ECN=m
+-CONFIG_IP_NF_MATCH_DSCP=m
+-CONFIG_IP_NF_MATCH_AH_ESP=m
+-CONFIG_IP_NF_MATCH_LENGTH=m
+-CONFIG_IP_NF_MATCH_TTL=m
+-CONFIG_IP_NF_MATCH_TCPMSS=m
+-CONFIG_IP_NF_MATCH_HELPER=m
+-CONFIG_IP_NF_MATCH_STATE=m
+-CONFIG_IP_NF_MATCH_CONNTRACK=m
+-CONFIG_IP_NF_MATCH_OWNER=m
+-CONFIG_IP_NF_MATCH_ADDRTYPE=m
+-CONFIG_IP_NF_MATCH_REALM=m
+-CONFIG_IP_NF_MATCH_SCTP=m
+-CONFIG_IP_NF_MATCH_COMMENT=m
+-CONFIG_IP_NF_MATCH_HASHLIMIT=m
+-CONFIG_IP_NF_FILTER=m
+-CONFIG_IP_NF_TARGET_REJECT=m
+-CONFIG_IP_NF_TARGET_LOG=m
+-CONFIG_IP_NF_TARGET_ULOG=m
+-CONFIG_IP_NF_TARGET_TCPMSS=m
+-CONFIG_IP_NF_NAT=m
+-CONFIG_IP_NF_NAT_NEEDED=y
+-CONFIG_IP_NF_TARGET_MASQUERADE=m
+-CONFIG_IP_NF_TARGET_REDIRECT=m
+-CONFIG_IP_NF_TARGET_NETMAP=m
+-CONFIG_IP_NF_TARGET_SAME=m
+-CONFIG_IP_NF_NAT_SNMP_BASIC=m
+-CONFIG_IP_NF_NAT_IRC=m
+-CONFIG_IP_NF_NAT_FTP=m
+-CONFIG_IP_NF_NAT_TFTP=m
+-CONFIG_IP_NF_NAT_AMANDA=m
+-CONFIG_IP_NF_MANGLE=m
+-CONFIG_IP_NF_TARGET_TOS=m
+-CONFIG_IP_NF_TARGET_ECN=m
+-CONFIG_IP_NF_TARGET_DSCP=m
+-CONFIG_IP_NF_TARGET_MARK=m
+-CONFIG_IP_NF_TARGET_CLASSIFY=m
+-CONFIG_IP_NF_RAW=m
+-CONFIG_IP_NF_TARGET_NOTRACK=m
+-CONFIG_IP_NF_ARPTABLES=m
+-CONFIG_IP_NF_ARPFILTER=m
+-CONFIG_IP_NF_ARP_MANGLE=m
+-# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+-# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+-CONFIG_XFRM=y
+-CONFIG_XFRM_USER=m
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP is not set
+-# CONFIG_ATM is not set
+-# CONFIG_BRIDGE is not set
+-# CONFIG_VLAN_8021Q is not set
+-# CONFIG_DECNET is not set
+-CONFIG_LLC=m
+-CONFIG_LLC2=m
+-# CONFIG_IPX is not set
+-# CONFIG_ATALK is not set
+-# CONFIG_X25 is not set
+-# CONFIG_LAPB is not set
+-# CONFIG_NET_DIVERT is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
+-#
+-# CONFIG_NET_SCHED is not set
+-CONFIG_NET_CLS_ROUTE=y
+-
+-#
+-# Network testing
+-#
+-CONFIG_NET_PKTGEN=m
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+-CONFIG_NETDEVICES=y
+-CONFIG_DUMMY=m
+-CONFIG_BONDING=m
+-# CONFIG_EQUALIZER is not set
+-CONFIG_TUN=m
+-# CONFIG_ETHERTAP is not set
+-
+-#
+-# ARCnet devices
+-#
+-# CONFIG_ARCNET is not set
+-
+-#
+-# Ethernet (10 or 100Mbit)
+-#
+-CONFIG_NET_ETHERNET=y
+-CONFIG_MII=m
+-# CONFIG_HAPPYMEAL is not set
+-# CONFIG_SUNGEM is not set
+-CONFIG_NET_VENDOR_3COM=y
+-CONFIG_VORTEX=m
+-CONFIG_TYPHOON=m
+-
+-#
+-# Tulip family network device support
+-#
+-CONFIG_NET_TULIP=y
+-CONFIG_DE2104X=y
+-CONFIG_TULIP=y
+-# CONFIG_TULIP_MWI is not set
+-CONFIG_TULIP_MMIO=y
+-# CONFIG_TULIP_NAPI is not set
+-# CONFIG_DE4X5 is not set
+-# CONFIG_WINBOND_840 is not set
+-# CONFIG_DM9102 is not set
+-CONFIG_HP100=m
+-CONFIG_NET_PCI=y
+-CONFIG_PCNET32=m
+-# CONFIG_AMD8111_ETH is not set
+-# CONFIG_ADAPTEC_STARFIRE is not set
+-# CONFIG_B44 is not set
+-# CONFIG_FORCEDETH is not set
+-# CONFIG_DGRS is not set
+-CONFIG_EEPRO100=m
+-# CONFIG_EEPRO100_PIO is not set
+-CONFIG_E100=m
+-CONFIG_E100_NAPI=y
+-# CONFIG_FEALNX is not set
+-CONFIG_NATSEMI=m
+-# CONFIG_NE2K_PCI is not set
+-# CONFIG_8139CP is not set
+-CONFIG_8139TOO=m
+-# CONFIG_8139TOO_PIO is not set
+-# CONFIG_8139TOO_TUNE_TWISTER is not set
+-# CONFIG_8139TOO_8129 is not set
+-# CONFIG_8139_OLD_RX_RESET is not set
+-# CONFIG_SIS900 is not set
+-CONFIG_EPIC100=m
+-# CONFIG_SUNDANCE is not set
+-CONFIG_VIA_RHINE=m
+-CONFIG_VIA_RHINE_MMIO=y
+-
+-#
+-# Ethernet (1000 Mbit)
+-#
+-CONFIG_ACENIC=m
+-CONFIG_ACENIC_OMIT_TIGON_I=y
+-CONFIG_DL2K=m
+-CONFIG_E1000=m
+-CONFIG_E1000_NAPI=y
+-# CONFIG_NS83820 is not set
+-# CONFIG_HAMACHI is not set
+-# CONFIG_YELLOWFIN is not set
+-# CONFIG_R8169 is not set
+-# CONFIG_SK98LIN is not set
+-# CONFIG_VIA_VELOCITY is not set
+-CONFIG_TIGON3=m
+-
+-#
+-# Ethernet (10000 Mbit)
+-#
+-CONFIG_IXGB=m
+-CONFIG_IXGB_NAPI=y
+-CONFIG_S2IO=m
+-CONFIG_S2IO_NAPI=y
+-
+-#
+-# Token Ring devices
+-#
+-# CONFIG_TR is not set
+-
+-#
+-# Wireless LAN (non-hamradio)
+-#
+-CONFIG_NET_RADIO=y
+-
+-#
+-# Obsolete Wireless cards support (pre-802.11)
+-#
+-# CONFIG_STRIP is not set
+-
+-#
+-# Wireless 802.11b ISA/PCI cards support
+-#
+-CONFIG_HERMES=m
+-CONFIG_PLX_HERMES=m
+-CONFIG_TMD_HERMES=m
+-CONFIG_PCI_HERMES=m
+-# CONFIG_ATMEL is not set
+-
+-#
+-# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+-#
+-# CONFIG_PRISM54 is not set
+-CONFIG_NET_WIRELESS=y
+-
+-#
+-# Wan interfaces
+-#
+-# CONFIG_WAN is not set
+-# CONFIG_FDDI is not set
+-# CONFIG_HIPPI is not set
+-CONFIG_PPP=m
+-# CONFIG_PPP_MULTILINK is not set
+-# CONFIG_PPP_FILTER is not set
+-CONFIG_PPP_ASYNC=m
+-CONFIG_PPP_SYNC_TTY=m
+-CONFIG_PPP_DEFLATE=m
+-CONFIG_PPP_BSDCOMP=m
+-# CONFIG_PPPOE is not set
+-# CONFIG_SLIP is not set
+-# CONFIG_NET_FC is not set
+-# CONFIG_SHAPER is not set
+-# CONFIG_NETCONSOLE is not set
+-
+-#
+-# ISDN subsystem
+-#
+-# CONFIG_ISDN is not set
+-
+-#
+-# Telephony Support
+-#
+-# CONFIG_PHONE is not set
+-
+-#
+-# Input device support
+-#
+-CONFIG_INPUT=y
+-
+-#
+-# Userland interfaces
+-#
+-# CONFIG_INPUT_MOUSEDEV is not set
+-# CONFIG_INPUT_JOYDEV is not set
+-# CONFIG_INPUT_TSDEV is not set
+-# CONFIG_INPUT_EVDEV is not set
+-# CONFIG_INPUT_EVBUG is not set
+-
+-#
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-# CONFIG_SERIO is not set
+-
+-#
+-# Input Device Drivers
+-#
+-# CONFIG_INPUT_KEYBOARD is not set
+-# CONFIG_INPUT_MOUSE is not set
+-# CONFIG_INPUT_JOYSTICK is not set
+-# CONFIG_INPUT_TOUCHSCREEN is not set
+-# CONFIG_INPUT_MISC is not set
+-
+-#
+-# Character devices
+-#
+-CONFIG_VT=y
+-CONFIG_VT_CONSOLE=y
+-CONFIG_HW_CONSOLE=y
+-# CONFIG_SERIAL_NONSTANDARD is not set
+-
+-#
+-# Serial drivers
+-#
+-CONFIG_SERIAL_8250=y
+-CONFIG_SERIAL_8250_CONSOLE=y
+-CONFIG_SERIAL_8250_NR_UARTS=8
+-CONFIG_SERIAL_8250_EXTENDED=y
+-CONFIG_SERIAL_8250_MANY_PORTS=y
+-CONFIG_SERIAL_8250_SHARE_IRQ=y
+-# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+-# CONFIG_SERIAL_8250_MULTIPORT is not set
+-# CONFIG_SERIAL_8250_RSA is not set
+-
+-#
+-# Non-8250 serial port support
+-#
+-# CONFIG_SERIAL_MUX is not set
+-CONFIG_PDC_CONSOLE=y
+-CONFIG_SERIAL_CORE=y
+-CONFIG_SERIAL_CORE_CONSOLE=y
+-CONFIG_UNIX98_PTYS=y
+-# CONFIG_LEGACY_PTYS is not set
+-
+-#
+-# IPMI
+-#
+-# CONFIG_IPMI_HANDLER is not set
+-
+-#
+-# Watchdog Cards
+-#
+-# CONFIG_WATCHDOG is not set
+-CONFIG_GEN_RTC=y
+-CONFIG_GEN_RTC_X=y
+-# CONFIG_DTLK is not set
+-# CONFIG_R3964 is not set
+-# CONFIG_APPLICOM is not set
+-
+-#
+-# Ftape, the floppy tape device driver
+-#
+-# CONFIG_AGP is not set
+-# CONFIG_DRM is not set
+-CONFIG_RAW_DRIVER=y
+-CONFIG_MAX_RAW_DEVS=256
+-
+-#
+-# I2C support
+-#
+-# CONFIG_I2C is not set
+-
+-#
+-# Dallas's 1-wire bus
+-#
+-# CONFIG_W1 is not set
+-
+-#
+-# Misc devices
+-#
+-
+-#
+-# Multimedia devices
+-#
+-# CONFIG_VIDEO_DEV is not set
+-
+-#
+-# Digital Video Broadcasting Devices
+-#
+-# CONFIG_DVB is not set
+-
+-#
+-# Graphics support
+-#
+-# CONFIG_FB is not set
+-
+-#
+-# Console display driver support
+-#
+-CONFIG_DUMMY_CONSOLE_COLUMNS=160
+-CONFIG_DUMMY_CONSOLE_ROWS=64
+-CONFIG_DUMMY_CONSOLE=y
+-
+-#
+-# Sound
+-#
+-# CONFIG_SOUND is not set
+-
+-#
+-# USB support
+-#
+-# CONFIG_USB is not set
+-CONFIG_USB_ARCH_HAS_HCD=y
+-CONFIG_USB_ARCH_HAS_OHCI=y
+-
+-#
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+-#
+-
+-#
+-# USB Gadget Support
+-#
+-# CONFIG_USB_GADGET is not set
+-
+-#
+-# MMC/SD Card support
+-#
+-# CONFIG_MMC is not set
+-
+-#
+-# File systems
+-#
+-CONFIG_EXT2_FS=y
+-# CONFIG_EXT2_FS_XATTR is not set
+-CONFIG_EXT3_FS=y
+-# CONFIG_EXT3_FS_XATTR is not set
+-CONFIG_JBD=y
+-# CONFIG_JBD_DEBUG is not set
+-# CONFIG_REISERFS_FS is not set
+-CONFIG_JFS_FS=m
+-# CONFIG_JFS_POSIX_ACL is not set
+-# CONFIG_JFS_DEBUG is not set
+-# CONFIG_JFS_STATISTICS is not set
+-CONFIG_FS_POSIX_ACL=y
+-CONFIG_XFS_FS=m
+-# CONFIG_XFS_RT is not set
+-# CONFIG_XFS_QUOTA is not set
+-# CONFIG_XFS_SECURITY is not set
+-# CONFIG_XFS_POSIX_ACL is not set
+-# CONFIG_MINIX_FS is not set
+-# CONFIG_ROMFS_FS is not set
+-# CONFIG_QUOTA is not set
+-# CONFIG_DNOTIFY is not set
+-# CONFIG_AUTOFS_FS is not set
+-CONFIG_AUTOFS4_FS=y
+-
+-#
+-# CD-ROM/DVD Filesystems
+-#
+-CONFIG_ISO9660_FS=y
+-CONFIG_JOLIET=y
+-# CONFIG_ZISOFS is not set
+-CONFIG_UDF_FS=m
+-CONFIG_UDF_NLS=y
+-
+-#
+-# DOS/FAT/NT Filesystems
+-#
+-CONFIG_FAT_FS=m
+-CONFIG_MSDOS_FS=m
+-CONFIG_VFAT_FS=m
+-CONFIG_FAT_DEFAULT_CODEPAGE=437
+-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+-# CONFIG_NTFS_FS is not set
+-
+-#
+-# Pseudo filesystems
+-#
+-CONFIG_PROC_FS=y
+-CONFIG_PROC_KCORE=y
+-CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+-CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+-# CONFIG_HUGETLBFS is not set
+-# CONFIG_HUGETLB_PAGE is not set
+-CONFIG_RAMFS=y
+-
+-#
+-# Miscellaneous filesystems
+-#
+-# CONFIG_ADFS_FS is not set
+-# CONFIG_AFFS_FS is not set
+-# CONFIG_HFS_FS is not set
+-# CONFIG_HFSPLUS_FS is not set
+-# CONFIG_BEFS_FS is not set
+-# CONFIG_BFS_FS is not set
+-# CONFIG_EFS_FS is not set
+-# CONFIG_CRAMFS is not set
+-# CONFIG_VXFS_FS is not set
+-# CONFIG_HPFS_FS is not set
+-# CONFIG_QNX4FS_FS is not set
+-# CONFIG_SYSV_FS is not set
+-CONFIG_UFS_FS=m
+-# CONFIG_UFS_FS_WRITE is not set
+-
+-#
+-# Network File Systems
+-#
+-CONFIG_NFS_FS=y
+-CONFIG_NFS_V3=y
+-CONFIG_NFS_V4=y
+-CONFIG_NFS_DIRECTIO=y
+-CONFIG_NFSD=m
+-CONFIG_NFSD_V3=y
+-CONFIG_NFSD_V4=y
+-CONFIG_NFSD_TCP=y
+-CONFIG_ROOT_NFS=y
+-CONFIG_LOCKD=y
+-CONFIG_LOCKD_V4=y
+-CONFIG_EXPORTFS=m
+-CONFIG_SUNRPC=y
+-CONFIG_SUNRPC_GSS=y
+-CONFIG_RPCSEC_GSS_KRB5=y
+-# CONFIG_RPCSEC_GSS_SPKM3 is not set
+-CONFIG_SMB_FS=m
+-CONFIG_SMB_NLS_DEFAULT=y
+-CONFIG_SMB_NLS_REMOTE="cp437"
+-CONFIG_CIFS=m
+-# CONFIG_CIFS_STATS is not set
+-# CONFIG_CIFS_XATTR is not set
+-# CONFIG_CIFS_EXPERIMENTAL is not set
+-# CONFIG_NCP_FS is not set
+-# CONFIG_CODA_FS is not set
+-# CONFIG_AFS_FS is not set
+-
+-#
+-# Partition Types
+-#
+-# CONFIG_PARTITION_ADVANCED is not set
+-CONFIG_MSDOS_PARTITION=y
+-
+-#
+-# Native Language Support
+-#
+-CONFIG_NLS=y
+-CONFIG_NLS_DEFAULT="iso8859-1"
+-CONFIG_NLS_CODEPAGE_437=m
+-# CONFIG_NLS_CODEPAGE_737 is not set
+-# CONFIG_NLS_CODEPAGE_775 is not set
+-CONFIG_NLS_CODEPAGE_850=m
+-CONFIG_NLS_CODEPAGE_852=m
+-# CONFIG_NLS_CODEPAGE_855 is not set
+-# CONFIG_NLS_CODEPAGE_857 is not set
+-# CONFIG_NLS_CODEPAGE_860 is not set
+-# CONFIG_NLS_CODEPAGE_861 is not set
+-# CONFIG_NLS_CODEPAGE_862 is not set
+-CONFIG_NLS_CODEPAGE_863=m
+-# CONFIG_NLS_CODEPAGE_864 is not set
+-CONFIG_NLS_CODEPAGE_865=m
+-# CONFIG_NLS_CODEPAGE_866 is not set
+-# CONFIG_NLS_CODEPAGE_869 is not set
+-# CONFIG_NLS_CODEPAGE_936 is not set
+-# CONFIG_NLS_CODEPAGE_950 is not set
+-# CONFIG_NLS_CODEPAGE_932 is not set
+-# CONFIG_NLS_CODEPAGE_949 is not set
+-# CONFIG_NLS_CODEPAGE_874 is not set
+-# CONFIG_NLS_ISO8859_8 is not set
+-# CONFIG_NLS_CODEPAGE_1250 is not set
+-# CONFIG_NLS_CODEPAGE_1251 is not set
+-# CONFIG_NLS_ASCII is not set
+-CONFIG_NLS_ISO8859_1=m
+-CONFIG_NLS_ISO8859_2=m
+-CONFIG_NLS_ISO8859_3=m
+-CONFIG_NLS_ISO8859_4=m
+-# CONFIG_NLS_ISO8859_5 is not set
+-# CONFIG_NLS_ISO8859_6 is not set
+-# CONFIG_NLS_ISO8859_7 is not set
+-# CONFIG_NLS_ISO8859_9 is not set
+-# CONFIG_NLS_ISO8859_13 is not set
+-# CONFIG_NLS_ISO8859_14 is not set
+-CONFIG_NLS_ISO8859_15=m
+-# CONFIG_NLS_KOI8_R is not set
+-# CONFIG_NLS_KOI8_U is not set
+-CONFIG_NLS_UTF8=m
+-
+-#
+-# Profiling support
+-#
+-CONFIG_PROFILING=y
+-CONFIG_OPROFILE=m
+-
+-#
+-# Kernel hacking
+-#
+-CONFIG_DEBUG_KERNEL=y
+-CONFIG_MAGIC_SYSRQ=y
+-# CONFIG_SCHEDSTATS is not set
+-# CONFIG_DEBUG_SLAB is not set
+-# CONFIG_DEBUG_SPINLOCK is not set
+-# CONFIG_DEBUG_KOBJECT is not set
+-# CONFIG_DEBUG_INFO is not set
+-
+-#
+-# Security options
+-#
+-# CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+-
+-#
+-# Cryptographic options
+-#
+-CONFIG_CRYPTO=y
+-CONFIG_CRYPTO_HMAC=y
+-CONFIG_CRYPTO_NULL=m
+-CONFIG_CRYPTO_MD4=m
+-CONFIG_CRYPTO_MD5=y
+-CONFIG_CRYPTO_SHA1=m
+-CONFIG_CRYPTO_SHA256=m
+-CONFIG_CRYPTO_SHA512=m
+-CONFIG_CRYPTO_WP512=m
+-CONFIG_CRYPTO_DES=y
+-CONFIG_CRYPTO_BLOWFISH=m
+-CONFIG_CRYPTO_TWOFISH=m
+-CONFIG_CRYPTO_SERPENT=m
+-CONFIG_CRYPTO_AES=m
+-CONFIG_CRYPTO_CAST5=m
+-CONFIG_CRYPTO_CAST6=m
+-CONFIG_CRYPTO_TEA=m
+-# CONFIG_CRYPTO_ARC4 is not set
+-CONFIG_CRYPTO_KHAZAD=m
+-CONFIG_CRYPTO_ANUBIS=m
+-CONFIG_CRYPTO_DEFLATE=m
+-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+-CONFIG_CRYPTO_CRC32C=m
+-CONFIG_CRYPTO_TEST=m
+-
+-#
+-# Library routines
+-#
+-CONFIG_CRC_CCITT=m
+-CONFIG_CRC32=y
+-CONFIG_LIBCRC32C=m
+-CONFIG_ZLIB_INFLATE=m
+-CONFIG_ZLIB_DEFLATE=m
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/Makefile CVS2_6_11_PA2/arch/parisc/kernel/Makefile
+--- LINUS_2_6_11/arch/parisc/kernel/Makefile	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/Makefile	2005-02-04 12:34:34.000000000 -0700
+@@ -19,6 +19,6 @@
+ obj-$(CONFIG_PA11)	+= pci-dma.o
+ obj-$(CONFIG_PCI)	+= pci.o
+ obj-$(CONFIG_MODULES)	+= module.o
+-obj-$(CONFIG_PARISC64)	+= binfmt_elf32.o sys_parisc32.o ioctl32.o signal32.o
++obj-$(CONFIG_64BIT)	+= binfmt_elf32.o sys_parisc32.o ioctl32.o signal32.o
+ # only supported for PCX-W/U in 64-bit mode at the moment
+-obj-$(CONFIG_PARISC64)	+= perf.o perf_asm.o
++obj-$(CONFIG_64BIT)	+= perf.o perf_asm.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/binfmt_elf32.c CVS2_6_11_PA2/arch/parisc/kernel/binfmt_elf32.c
+--- LINUS_2_6_11/arch/parisc/kernel/binfmt_elf32.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/binfmt_elf32.c	2005-03-01 23:47:36.000000000 -0700
+@@ -37,7 +37,6 @@
+ #include <linux/spinlock.h>
+ #include <asm/processor.h>
+ #include <linux/module.h>
+-#include <linux/config.h>
+ #include <linux/elfcore.h>
+ #include <linux/compat.h>		/* struct compat_timeval */
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/drivers.c CVS2_6_11_PA2/arch/parisc/kernel/drivers.c
+--- LINUS_2_6_11/arch/parisc/kernel/drivers.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/drivers.c	2005-01-26 09:23:26.000000000 -0700
+@@ -10,7 +10,7 @@
+  * Copyright (c) 2001 Matthew Wilcox for Hewlett Packard
+  * Copyright (c) 2001 Helge Deller <deller at gmx.de>
+  * Copyright (c) 2001,2002 Ryan Bradetich 
+- * Copyright (c) 2004 Thibaut VARENE <varenet at parisc-linux.org>
++ * Copyright (c) 2004-2005 Thibaut VARENE <varenet at parisc-linux.org>
+  * 
+  * The file handles registering devices and drivers, then matching them.
+  * It's the closest we get to a dating agency.
+@@ -611,6 +611,24 @@
+ }
+ EXPORT_SYMBOL(hwpath_to_device);
+ 
++/**
++ * device_to_hwpath - Populates the hwpath corresponding to the given device.
++ * @param dev the target device
++ * @param path pointer to a previously allocated hwpath struct to be filled in
++ */
++void device_to_hwpath(struct device *dev, struct hardware_path *path)
++{
++	struct parisc_device *padev;
++	if (dev->bus == &parisc_bus_type) {
++		padev = to_parisc_device(dev);
++		get_node_path(dev->parent, path);
++		path->mod = padev->hw_path;
++	} else if (is_pci_dev(dev)) {
++		get_node_path(dev, path);
++	}
++}
++EXPORT_SYMBOL(device_to_hwpath);
++
+ #define BC_PORT_MASK 0x8
+ #define BC_LOWER_PORT 0x8
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/entry.S CVS2_6_11_PA2/arch/parisc/kernel/entry.S
+--- LINUS_2_6_11/arch/parisc/kernel/entry.S	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/entry.S	2005-01-07 14:14:33.000000000 -0700
+@@ -76,13 +76,11 @@
+ 	mtsp	%r0, %sr5
+ 	mtsp	%r0, %sr6
+ 	mtsp	%r0, %sr7
+-	ldil	L%KERNEL_PSW, %r1
+-	ldo	R%KERNEL_PSW(%r1), %r1
++	load32	KERNEL_PSW, %r1
+ 	mtctl	%r1, %cr22
+ 	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+ 	mtctl	%r0, %cr17	/* Clear IIASQ head */
+-	ldil	L%4f, %r1
+-	ldo	R%4f(%r1), %r1
++	load32	4f, %r1
+ 	mtctl	%r1, %cr18	/* Set IIAOQ tail */
+ 	ldo	4(%r1), %r1
+ 	mtctl	%r1, %cr18	/* Set IIAOQ head */
+@@ -197,8 +195,7 @@
+ 	/* HPMC handler */
+ 	.macro	hpmc code
+ 	nop			/* must be a NOP, will be patched later */
+-	ldil	L%PA(os_hpmc), %r3
+-	ldo	R%PA(os_hpmc)(%r3), %r3
++	load32	PA(os_hpmc), %r3
+ 	bv,n	0(%r3)
+ 	nop
+ 	.word	0		/* checksum (will be patched) */
+@@ -860,8 +857,7 @@
+ 
+ 	callee_save
+ 
+-	ldil	L%_switch_to_ret, %r2
+-	ldo	R%_switch_to_ret(%r2), %r2
++	load32	_switch_to_ret, %r2
+ 
+ 	STREG	%r2, TASK_PT_KPC(%r26)
+ 	LDREG	TASK_PT_KPC(%r25), %r2
+@@ -914,16 +910,13 @@
+ 	depi	3,31,2,%r19
+ 	STREG	%r19,PT_IAOQ1(%r16)
+ 	LDREG   PT_PSW(%r16),%r19
+-	ldil    L%USER_PSW_MASK,%r1
+-	ldo     R%USER_PSW_MASK(%r1),%r1
++	load32	USER_PSW_MASK,%r1
+ #ifdef __LP64__
+-	ldil    L%USER_PSW_HI_MASK,%r20
+-	ldo     R%USER_PSW_HI_MASK(%r20),%r20
++	load32	USER_PSW_HI_MASK,%r20
+ 	depd    %r20,31,32,%r1
+ #endif
+ 	and     %r19,%r1,%r19 /* Mask out bits that user shouldn't play with */
+-	ldil    L%USER_PSW,%r1
+-	ldo     R%USER_PSW(%r1),%r1
++	load32	USER_PSW,%r1
+ 	or      %r19,%r1,%r19 /* Make sure default USER_PSW bits are set */
+ 	STREG   %r19,PT_PSW(%r16)
+ 
+@@ -955,8 +948,7 @@
+ 
+ 	.import irq_stat,data
+ 
+-	ldil	L%irq_stat,%r19
+-	ldo	R%irq_stat(%r19),%r19
++	load32	irq_stat,%r19
+ #ifdef CONFIG_SMP
+ 	mfctl   %cr30,%r1
+ 	ldw	TI_CPU(%r1),%r1 /* get cpu # - int */
+@@ -1079,7 +1071,7 @@
+ 	BL	do_signal,%r2
+ 	copy	%r0, %r26			/* sigset_t *oldset = NULL */
+ 
+-	b	intr_restore
++	b	intr_check_sig
+ 	nop
+ 
+ 	/*
+@@ -1607,8 +1599,7 @@
+ 
+ #ifdef CONFIG_SMP
+ 	CMPIB=,n        0,spc,dbit_nolock_20w
+-	ldil            L%PA(pa_dbit_lock),t0
+-	ldo             R%PA(pa_dbit_lock)(t0),t0
++	load32		PA(pa_dbit_lock),t0
+ 
+ dbit_spin_20w:
+ 	ldcw            0(t0),t1
+@@ -1644,8 +1635,7 @@
+ 
+ #ifdef CONFIG_SMP
+ 	CMPIB=,n        0,spc,dbit_nolock_11
+-	ldil            L%PA(pa_dbit_lock),t0
+-	ldo             R%PA(pa_dbit_lock)(t0),t0
++	load32		PA(pa_dbit_lock),t0
+ 
+ dbit_spin_11:
+ 	ldcw            0(t0),t1
+@@ -1685,8 +1675,7 @@
+ 
+ #ifdef CONFIG_SMP
+ 	CMPIB=,n        0,spc,dbit_nolock_20
+-	ldil            L%PA(pa_dbit_lock),t0
+-	ldo             R%PA(pa_dbit_lock)(t0),t0
++	load32		PA(pa_dbit_lock),t0
+ 
+ dbit_spin_20:
+ 	ldcw            0(t0),t1
+@@ -2082,8 +2071,7 @@
+ 
+ 	.import irq_stat,data
+ 
+-	ldil    L%irq_stat,%r19
+-	ldo     R%irq_stat(%r19),%r19
++	load32	irq_stat,%r19
+ 
+ #ifdef CONFIG_SMP
+ 	/* sched.h: int processor */
+@@ -2282,7 +2270,7 @@
+ 	ldo	TASK_REGS(%r1), %r20		/* reload pt_regs */
+ 	reg_restore %r20
+ 
+-	b,n     syscall_restore
++	b,n     syscall_check_sig
+ 
+ 	/*
+ 	 * get_register is used by the non access tlb miss handlers to
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/firmware.c CVS2_6_11_PA2/arch/parisc/kernel/firmware.c
+--- LINUS_2_6_11/arch/parisc/kernel/firmware.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/firmware.c	2005-02-11 14:28:18.000000000 -0700
+@@ -120,10 +120,10 @@
+ #ifdef __LP64__
+ 	if(unlikely(parisc_narrow_firmware)) {
+ 		if((address & 0xff000000) == 0xf0000000)
+-			return 0xf0f0f0f000000000 | (u32)address;
++			return 0xf0f0f0f000000000UL | (u32)address;
+ 
+ 		if((address & 0xf0000000) == 0xf0000000)
+-			return 0xffffffff00000000 | (u32)address;
++			return 0xffffffff00000000UL | (u32)address;
+ 	}
+ #endif
+ 	return address;
+@@ -782,6 +782,8 @@
+ {
+ 	int retval;
+ 
++	BUG_ON((unsigned long)tbl & 0x7);
++
+ 	spin_lock_irq(&pdc_lock);
+ 	pdc_result[0] = num_entries;
+ 	retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL, 
+@@ -912,7 +914,7 @@
+  *
+  * Reset the system.
+  */
+-int pdc_do_reset()
++int pdc_do_reset(void)
+ {
+         int retval;
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/hardware.c CVS2_6_11_PA2/arch/parisc/kernel/hardware.c
+--- LINUS_2_6_11/arch/parisc/kernel/hardware.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/hardware.c	2004-10-04 13:12:49.000000000 -0600
+@@ -1296,18 +1296,18 @@
+ };
+ 
+ char *cpu_name_version[][2] = {
+-	[pcx]	{ "PA7000 (PCX)",	"1.0" },
+-	[pcxs]	{ "PA7000 (PCX-S)",	"1.1a" },
+-	[pcxt]	{ "PA7100 (PCX-T)",	"1.1b" },
+-	[pcxt_]	{ "PA7200 (PCX-T')",	"1.1c" },
+-	[pcxl]	{ "PA7100LC (PCX-L)",	"1.1d" },
+-	[pcxl2]	{ "PA7300LC (PCX-L2)",	"1.1e" },
+-	[pcxu]	{ "PA8000 (PCX-U)",	"2.0" },
+-	[pcxu_]	{ "PA8200 (PCX-U+)",	"2.0" },
+-	[pcxw]	{ "PA8500 (PCX-W)",	"2.0" },
+-	[pcxw_]	{ "PA8600 (PCX-W+)",	"2.0" },
+-	[pcxw2]	{ "PA8700 (PCX-W2)",	"2.0" },
+-	[mako]	{ "PA8800 (Mako)",	"2.0" }
++	[pcx]	= { "PA7000 (PCX)",	"1.0" },
++	[pcxs]	= { "PA7000 (PCX-S)",	"1.1a" },
++	[pcxt]	= { "PA7100 (PCX-T)",	"1.1b" },
++	[pcxt_]	= { "PA7200 (PCX-T')",	"1.1c" },
++	[pcxl]	= { "PA7100LC (PCX-L)",	"1.1d" },
++	[pcxl2]	= { "PA7300LC (PCX-L2)",	"1.1e" },
++	[pcxu]	= { "PA8000 (PCX-U)",	"2.0" },
++	[pcxu_]	= { "PA8200 (PCX-U+)",	"2.0" },
++	[pcxw]	= { "PA8500 (PCX-W)",	"2.0" },
++	[pcxw_]	= { "PA8600 (PCX-W+)",	"2.0" },
++	[pcxw2]	= { "PA8700 (PCX-W2)",	"2.0" },
++	[mako]	= { "PA8800 (Mako)",	"2.0" }
+ };
+ 
+ const char * __init
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/head.S CVS2_6_11_PA2/arch/parisc/kernel/head.S
+--- LINUS_2_6_11/arch/parisc/kernel/head.S	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/head.S	2004-11-01 09:15:50.000000000 -0700
+@@ -71,47 +71,42 @@
+ 	stw,ma          %arg2,4(%r1)
+ 	stw,ma          %arg3,4(%r1)
+ 
+-	/* Initialize startup VM. Just map first 8 MB of memory */
+-	load32		PA(pg0),%r1
+-
+-#ifdef __LP64__
+-	load32		PA(pmd0),%r5
+-	shrd            %r5,PxD_VALUE_SHIFT,%r3	
+-#else
+-	shr		%r1,PxD_VALUE_SHIFT,%r3
+-#endif
+-        ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3	
+-	
++	/* Initialize startup VM. Just map first 8/16 MB of memory */
+ 	load32		PA(swapper_pg_dir),%r4
+ 	mtctl		%r4,%cr24	/* Initialize kernel root pointer */
+ 	mtctl		%r4,%cr25	/* Initialize user root pointer */
+ 
+ #ifdef __LP64__
++	/* Set pmd in pgd */
++	load32		PA(pmd0),%r5
++	shrd            %r5,PxD_VALUE_SHIFT,%r3	
++        ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3	
+ 	stw		%r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4)
+-	shrd		%r1,PxD_VALUE_SHIFT,%r3
+-	ldo		(PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
+-	ldo		ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r5
++	ldo		ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r4
+ #else
++	/* 2-level page table, so pmd == pgd */
+         ldo             ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
+ #endif
++
++	/* Fill in pmd with enough pte directories */
++	load32		PA(pg0),%r1
++	SHRREG		%r1,PxD_VALUE_SHIFT,%r3
++	ldo		(PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
++
+ 	ldi		ASM_PT_INITIAL,%r1
+ 
+ 1:
+-#ifdef __LP64__
+-	stw             %r3,0(%r5)
+-#else
+-	stw             %r3,0(%r4)
+-#endif
+-	
++	stw		%r3,0(%r4)
+ 	ldo		(ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
+ 	addib,>		-1,%r1,1b
+-
+ #ifdef __LP64__
+-	ldo		ASM_PMD_ENTRY_SIZE(%r5),%r5
++	ldo             ASM_PMD_ENTRY_SIZE(%r4),%r4
+ #else
+-	ldo		ASM_PGD_ENTRY_SIZE(%r4),%r4
++	ldo             ASM_PGD_ENTRY_SIZE(%r4),%r4
+ #endif
+ 
++
++	/* Now initialize the PTEs themselves */
+ 	ldo		_PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */
+ 	load32		PA(pg0),%r1
+ 
+@@ -306,7 +301,7 @@
+ 	mtctl		%r11,%cr18	/* IIAOQ head */
+ 	ldo		4(%r11),%r11
+ 	mtctl		%r11,%cr18	/* IIAOQ tail */
+-
++	
+ 	/* Jump to hyperspace */
+ 	rfi
+ 	nop
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/hpmc.S CVS2_6_11_PA2/arch/parisc/kernel/hpmc.S
+--- LINUS_2_6_11/arch/parisc/kernel/hpmc.S	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/hpmc.S	2005-01-07 14:14:33.000000000 -0700
+@@ -121,8 +121,7 @@
+ 
+ 	/* Setup stack pointer. */
+ 
+-	ldil    L%PA(hpmc_stack),sp
+-	ldo     R%PA(hpmc_stack)(sp),sp
++	load32	PA(hpmc_stack),sp
+ 	
+ 	ldo     128(sp),sp /* leave room for arguments */
+ 
+@@ -135,8 +134,7 @@
+ 	mtctl   %r4,ipsw
+ 	mtctl   %r0,pcsq
+ 	mtctl   %r0,pcsq
+-	ldil    L%PA(os_hpmc_1),%r4
+-	ldo     R%PA(os_hpmc_1)(%r4),%r4
++	load32	PA(os_hpmc_1),%r4
+ 	mtctl   %r4,pcoq
+ 	ldo     4(%r4),%r4
+ 	mtctl   %r4,pcoq
+@@ -155,12 +153,9 @@
+ 
+ 	ldo     PDC_PIM(%r0), arg0
+ 	ldo     PDC_PIM_HPMC(%r0),arg1          /* Transfer HPMC data */
+-	ldil    L%PA(hpmc_raddr),arg2
+-	ldo     R%PA(hpmc_raddr)(arg2),arg2
+-	ldil    L%PA(hpmc_pim_data),arg3
+-	ldo     R%PA(hpmc_pim_data)(arg3),arg3
+-	ldil    L%HPMC_PIM_DATA_SIZE,%r4
+-	ldo     R%HPMC_PIM_DATA_SIZE(%r4),%r4
++	load32	PA(hpmc_raddr),arg2
++	load32	PA(hpmc_pim_data),arg3
++	load32	HPMC_PIM_DATA_SIZE,%r4
+ 	stw     %r4,-52(sp)
+ 
+ 	ldil    L%PA(os_hpmc_2), rp
+@@ -199,16 +194,13 @@
+ 
+ 	ldo     PDC_IODC(%r0),arg0
+ 	ldo     PDC_IODC_READ(%r0),arg1
+-	ldil    L%PA(hpmc_raddr),arg2
+-	ldo     R%PA(hpmc_raddr)(arg2),arg2
++	load32	PA(hpmc_raddr),arg2
+ 	ldw     BOOT_CONSOLE_HPA_OFFSET(%r0),arg3 /* console hpa */
+ 	ldo     PDC_IODC_RI_INIT(%r0),%r4
+ 	stw     %r4,-52(sp)
+-	ldil    L%PA(hpmc_iodc_buf),%r4
+-	ldo     R%PA(hpmc_iodc_buf)(%r4),%r4
++	load32	PA(hpmc_iodc_buf),%r4
+ 	stw     %r4,-56(sp)
+-	ldil    L%HPMC_IODC_BUF_SIZE,%r4
+-	ldo     R%HPMC_IODC_BUF_SIZE(%r4),%r4
++	load32	HPMC_IODC_BUF_SIZE,%r4
+ 	stw     %r4,-60(sp)
+ 
+ 	ldil    L%PA(os_hpmc_4),rp
+@@ -225,16 +217,14 @@
+ 	ldw     BOOT_CONSOLE_SPA_OFFSET(%r0),arg2  /* console spa */
+ 	depi    0,31,11,arg2                       /* clear bits 21-31    */
+ 	ldo     BOOT_CONSOLE_PATH_OFFSET(%r0),arg3 /* console path */
+-	ldil    L%PA(hpmc_raddr),%r4
+-	ldo     R%PA(hpmc_raddr)(%r4),%r4
++	load32	PA(hpmc_raddr),%r4
+ 	stw     %r4, -52(sp)
+ 	stw     %r0, -56(sp)                    /* HV                  */
+ 	stw     %r0, -60(sp)                    /* HV                  */
+ 	stw     %r0, -64(sp)                    /* HV                  */
+ 	stw     %r0, -68(sp)                    /* lang, must be zero  */
+ 
+-	ldil    L%PA(hpmc_iodc_buf),%r5
+-	ldo     R%PA(hpmc_iodc_buf)(%r5),%r5
++	load32	PA(hpmc_iodc_buf),%r5
+ 	ldil    L%PA(os_hpmc_5),rp
+ 	bv      (%r5)
+ 	ldo     R%PA(os_hpmc_5)(rp),rp
+@@ -249,8 +239,7 @@
+ 	 * we don't intend to ever return to user land anyway)
+ 	 */
+ 
+-	ldil		L%PA(swapper_pg_dir),%r4
+-	ldo		R%PA(swapper_pg_dir)(%r4),%r4
++	load32		PA(swapper_pg_dir),%r4
+ 	mtctl		%r4,%cr24	/* Initialize kernel root pointer */
+ 	mtctl		%r4,%cr25	/* Initialize user root pointer */
+ 
+@@ -265,8 +254,7 @@
+ 
+ 	rsm 8,%r0           /* Clear Q bit */
+ 	ldi     1,%r8       /* Set trap code to "1" for HPMC */
+-	ldil    L%PA(intr_save), %r1
+-	ldo     R%PA(intr_save)(%r1), %r1
++	load32	PA(intr_save),%r1
+ 	be      0(%sr7,%r1)
+ 	nop
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/init_task.c CVS2_6_11_PA2/arch/parisc/kernel/init_task.c
+--- LINUS_2_6_11/arch/parisc/kernel/init_task.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/init_task.c	2004-10-31 16:11:09.000000000 -0700
+@@ -55,11 +55,15 @@
+ 
+ #ifdef __LP64__
+ /* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout
+- * with the first pmd adjacent to the pgd and below it */
+-pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((aligned(PAGE_SIZE))) = { {0}, };
++ * with the first pmd adjacent to the pgd and below it. gcc doesn't actually
++ * guarantee that global objects will be laid out in memory in the same order 
++ * as the order of declaration, so put these in different sections and use
++ * the linker script to order them. */
++pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((aligned(PAGE_SIZE))) __attribute__ ((__section__ (".data.vm0.pmd"))) = { {0}, };
++
+ #endif
+-pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((aligned(PAGE_SIZE))) = { {0}, };
+-pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((aligned(PAGE_SIZE))) = { {0}, };
++pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((aligned(PAGE_SIZE))) __attribute__ ((__section__ (".data.vm0.pgd"))) = { {0}, };
++pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((aligned(PAGE_SIZE))) __attribute__ ((__section__ (".data.vm0.pte")))  = { {0}, };
+ 
+ /*
+  * Initial task structure.
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/ioctl32.c CVS2_6_11_PA2/arch/parisc/kernel/ioctl32.c
+--- LINUS_2_6_11/arch/parisc/kernel/ioctl32.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/ioctl32.c	2004-10-04 13:12:49.000000000 -0600
+@@ -563,7 +563,7 @@
+ 
+ #endif
+ 
+-#define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, 0 },
++#define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL },
+ #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) 
+ 
+ #define IOCTL_TABLE_START  struct ioctl_trans ioctl_start[] = {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/irq.c CVS2_6_11_PA2/arch/parisc/kernel/irq.c
+--- LINUS_2_6_11/arch/parisc/kernel/irq.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/irq.c	2005-02-13 20:22:34.000000000 -0700
+@@ -5,6 +5,7 @@
+  * Copyright (C) 1994, 1995, 1996, 1997, 1998 Ralf Baechle
+  * Copyright (C) 1999 SuSE GmbH (Philipp Rumpf, prumpf at tux.org)
+  * Copyright (C) 1999-2000 Grant Grundler
++ * Copyright (c) 2005 Matthew Wilcox
+  *
+  *    This program is free software; you can redistribute it and/or modify
+  *    it under the terms of the GNU General Public License as published by
+@@ -22,38 +23,19 @@
+  */
+ #include <linux/bitops.h>
+ #include <linux/config.h>
+-#include <linux/eisa.h>
+ #include <linux/errno.h>
+ #include <linux/init.h>
+-#include <linux/module.h>
+-#include <linux/signal.h>
+-#include <linux/types.h>
+-#include <linux/ioport.h>
+-#include <linux/timex.h>
+-#include <linux/slab.h>
+-#include <linux/random.h>
+-#include <linux/sched.h>
+ #include <linux/interrupt.h>
+ #include <linux/kernel_stat.h>
+-#include <linux/irq.h>
+ #include <linux/seq_file.h>
+ #include <linux/spinlock.h>
++#include <linux/types.h>
+ 
+-#include <asm/cache.h>
+-#include <asm/pdc.h>
+-
+-#undef DEBUG_IRQ
+ #undef PARISC_IRQ_CR16_COUNTS
+ 
+ extern irqreturn_t timer_interrupt(int, void *, struct pt_regs *);
+ extern irqreturn_t ipi_interrupt(int, void *, struct pt_regs *);
+ 
+-#ifdef DEBUG_IRQ
+-#define DBG_IRQ(irq, x)	if ((irq) != TIMER_IRQ) printk x
+-#else /* DEBUG_IRQ */
+-#define DBG_IRQ(irq, x)	do { } while (0)
+-#endif /* DEBUG_IRQ */
+-
+ #define EIEM_MASK(irq)       (1UL<<(CPU_IRQ_MAX - irq))
+ 
+ /* Bits in EIEM correlate with cpu_irq_action[].
+@@ -120,8 +102,10 @@
+ 	}
+ 
+ 	if (i < NR_IRQS) {
++		struct irqaction *action;
++
+ 		spin_lock_irqsave(&irq_desc[i].lock, flags);
+-		struct irqaction *action = irq_desc[i].action;
++		action = irq_desc[i].action;
+ 		if (!action)
+ 			goto skip;
+ 		seq_printf(p, "%3d: ", i);
+@@ -200,7 +184,25 @@
+ 	return cpu_claim_irq(irq, NULL, NULL) ? -1 : irq;
+ }
+ 
+-int txn_alloc_irq(void)
++/*
++ * The bits_wide parameter accommodates the limitations of the HW/SW which
++ * use these bits:
++ * Legacy PA I/O (GSC/NIO): 5 bits (architected EIM register)
++ * V-class (EPIC):          6 bits
++ * N/L/A-class (iosapic):   8 bits
++ * PCI 2.2 MSI:            16 bits
++ * Some PCI devices:       32 bits (Symbios SCSI/ATM/HyperFabric)
++ *
++ * On the service provider side:
++ * o PA 1.1 (and PA2.0 narrow mode)     5-bits (width of EIR register)
++ * o PA 2.0 wide mode                   6-bits (per processor)
++ * o IA64                               8-bits (0-256 total)
++ *
++ * So a Legacy PA I/O device on a PA 2.0 box can't use all the bits supported
++ * by the processor...and the N/L-class I/O subsystem supports more bits than
++ * PA2.0 has. The first case is the problem.
++ */
++int txn_alloc_irq(unsigned int bits_wide)
+ {
+ 	int irq;
+ 
+@@ -208,6 +210,8 @@
+ 	for (irq = CPU_IRQ_BASE + 1; irq <= CPU_IRQ_MAX; irq++) {
+ 		if (cpu_claim_irq(irq, NULL, NULL) < 0)
+ 			continue;
++		if ((irq - CPU_IRQ_BASE) >= (1 << bits_wide))
++			continue;
+ 		return irq;
+ 	}
+ 
+@@ -215,7 +219,7 @@
+ 	return -1;
+ }
+ 
+-unsigned long txn_alloc_addr(int virt_irq)
++unsigned long txn_alloc_addr(unsigned int virt_irq)
+ {
+ 	static int next_cpu = -1;
+ 
+@@ -233,36 +237,8 @@
+ }
+ 
+ 
+-/*
+-** The alloc process needs to accept a parameter to accommodate limitations
+-** of the HW/SW which use these bits:
+-** Legacy PA I/O (GSC/NIO): 5 bits (architected EIM register)
+-** V-class (EPIC):          6 bits
+-** N/L-class/A500:          8 bits (iosapic)
+-** PCI 2.2 MSI:             16 bits (I think)
+-** Existing PCI devices:    32-bits (all Symbios SCSI/ATM/HyperFabric)
+-**
+-** On the service provider side:
+-** o PA 1.1 (and PA2.0 narrow mode)     5-bits (width of EIR register)
+-** o PA 2.0 wide mode                   6-bits (per processor)
+-** o IA64                               8-bits (0-256 total)
+-**
+-** So a Legacy PA I/O device on a PA 2.0 box can't use all
+-** the bits supported by the processor...and the N/L-class
+-** I/O subsystem supports more bits than PA2.0 has. The first
+-** case is the problem.
+-*/
+-unsigned int txn_alloc_data(int virt_irq, unsigned int bits_wide)
++unsigned int txn_alloc_data(unsigned int virt_irq)
+ {
+-	/* XXX FIXME : bits_wide indicates how wide the transaction
+-	** data is allowed to be...we may need a different virt_irq
+-	** if this one won't work. Another reason to index virtual
+-	** irq's into a table which can manage CPU/IRQ bit separately.
+-	*/
+-	if ((virt_irq - CPU_IRQ_BASE) > (1 << (bits_wide - 1))) {
+-		panic("Sorry -- didn't allocate valid IRQ for this device\n");
+-	}
+-
+ 	return virt_irq - CPU_IRQ_BASE;
+ }
+ 
+@@ -270,42 +246,35 @@
+ void do_cpu_irq_mask(struct pt_regs *regs)
+ {
+ 	unsigned long eirr_val;
+-	unsigned int i=3;	/* limit time in interrupt context */
++
++	irq_enter();
+ 
+ 	/*
+-	 * PSW_I or EIEM bits cannot be enabled until after the
+-	 * interrupts are processed.
+-	 * timer_interrupt() assumes it won't get interrupted when it
+-	 * holds the xtime_lock...an unmasked interrupt source could
+-	 * interrupt and deadlock by trying to grab xtime_lock too.
+-	 * Keeping PSW_I and EIEM disabled avoids this.
++	 * Only allow interrupt processing to be interrupted by the
++	 * timer tick
+ 	 */
+-	set_eiem(0UL);	/* disable all extr interrupt for now */
++	set_eiem(EIEM_MASK(TIMER_IRQ));
+ 
+ 	/* 1) only process IRQs that are enabled/unmasked (cpu_eiem)
+ 	 * 2) We loop here on EIRR contents in order to avoid
+ 	 *    nested interrupts or having to take another interrupt
+ 	 *    when we could have just handled it right away.
+-	 * 3) Limit the number of times we loop to make sure other
+-	 *    processing can occur.
+ 	 */
+ 	for (;;) {
+ 		unsigned long bit = (1UL << (BITS_PER_LONG - 1));
+ 		unsigned int irq;
+ 		eirr_val = mfctl(23) & cpu_eiem;
+-		if (!eirr_val || !i--)
++		if (!eirr_val)
+ 			break;
+ 
+-		mtctl(eirr_val, 23); /* reset bits we are going to process */
++		if (eirr_val & EIEM_MASK(TIMER_IRQ))
++			set_eiem(0);
+ 
+-#ifdef DEBUG_IRQ
+-		if (eirr_val != (1UL << MAX_CPU_IRQ))
+-			printk(KERN_DEBUG "do_cpu_irq_mask  0x%x & 0x%x\n", eirr_val, cpu_eiem);
+-#endif
++		mtctl(eirr_val, 23); /* reset bits we are going to process */
+ 
+ 		/* Work our way from MSb to LSb...same order we alloc EIRs */
+ 		for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) {
+-			if (!(bit & eirr_val & cpu_eiem))
++			if (!(bit & eirr_val))
+ 				continue;
+ 
+ 			/* clear bit in mask - can exit loop sooner */
+@@ -315,6 +284,7 @@
+ 		}
+ 	}
+ 	set_eiem(cpu_eiem);
++	irq_exit();
+ }
+ 
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/module.c CVS2_6_11_PA2/arch/parisc/kernel/module.c
+--- LINUS_2_6_11/arch/parisc/kernel/module.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/module.c	2005-02-25 07:54:20.000000000 -0700
+@@ -2,7 +2,7 @@
+  *
+  *    The best reference for this stuff is probably the Processor-
+  *    Specific ELF Supplement for PA-RISC:
+- *        http://ftp.parisc-linux.org/docs/elf-pa-hp.pdf
++ *        http://ftp.parisc-linux.org/docs/arch/elf-pa-hp.pdf
+  *
+  *    Linux/PA-RISC Project (http://www.parisc-linux.org/)
+  *    Copyright (C) 2003 Randolph Chung <tausq at debian . org>
+@@ -21,6 +21,23 @@
+  *    You should have received a copy of the GNU General Public License
+  *    along with this program; if not, write to the Free Software
+  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *
++ *    Notes:
++ *    - SEGREL32 handling
++ *      We are not doing SEGREL32 handling correctly. According to the ABI, we
++ *      should do a value offset, like this:
++ *			if (is_init(me, (void *)val))
++ *				val -= (uint32_t)me->module_init;
++ *			else
++ *				val -= (uint32_t)me->module_core;
++ *	However, SEGREL32 is used only for PARISC unwind entries, and we want
++ *	those entries to have an absolute address, and not just an offset.
++ *
++ *	The unwind table mechanism has the ability to specify an offset for 
++ *	the unwind table; however, because we split off the init functions into
++ *	a different piece of memory, it is not possible to do this using a 
++ *	single offset. Instead, we use the above hack for now.
+  */
+ 
+ #include <linux/moduleloader.h>
+@@ -30,6 +47,8 @@
+ #include <linux/string.h>
+ #include <linux/kernel.h>
+ 
++#include <asm/unwind.h>
++
+ #if 0
+ #define DEBUGP printk
+ #else
+@@ -248,6 +267,10 @@
+ 		const Elf_Rela *rels = (void *)hdr + sechdrs[i].sh_offset;
+ 		unsigned long nrels = sechdrs[i].sh_size / sizeof(*rels);
+ 
++		if (strncmp(secstrings + sechdrs[i].sh_name,
++			    ".PARISC.unwind", 14) == 0)
++			me->arch.unwind_section = i;
++
+ 		if (sechdrs[i].sh_type != SHT_RELA)
+ 			continue;
+ 
+@@ -499,7 +522,9 @@
+ 			break;
+ 		case R_PARISC_SEGREL32:
+ 			/* 32-bit segment relative address */
+-			val -= (uint32_t)me->module_core;
++			/* See note about special handling of SEGREL32 at
++			 * the beginning of this file.
++			 */
+ 			*loc = fsel(val, addend); 
+ 			break;
+ 		case R_PARISC_DPREL21L:
+@@ -651,7 +676,9 @@
+ 			break;
+ 		case R_PARISC_SEGREL32:
+ 			/* 32-bit segment relative address */
+-			val -= (uint64_t)me->module_core;
++			/* See note about special handling of SEGREL32 at
++			 * the beginning of this file.
++			 */
+ 			*loc = fsel(val, addend); 
+ 			break;
+ 		case R_PARISC_FPTR64:
+@@ -682,6 +709,32 @@
+ }
+ #endif
+ 
++static void
++register_unwind_table(struct module *me,
++		      const Elf_Shdr *sechdrs)
++{
++	unsigned char *table, *end;
++	unsigned long gp;
++
++	if (!me->arch.unwind_section)
++		return;
++
++	table = (unsigned char *)sechdrs[me->arch.unwind_section].sh_addr;
++	end = table + sechdrs[me->arch.unwind_section].sh_size;
++	gp = (Elf_Addr)me->module_core + me->arch.got_offset;
++
++	DEBUGP("register_unwind_table(), sect = %d at 0x%p - 0x%p (gp=0x%lx)\n",
++	       me->arch.unwind_section, table, end, gp);
++	me->arch.unwind = unwind_table_add(me->name, 0, gp, table, end);
++}
++
++static void
++deregister_unwind_table(struct module *me)
++{
++	if (me->arch.unwind)
++		unwind_table_remove(me->arch.unwind);
++}
++
+ int module_finalize(const Elf_Ehdr *hdr,
+ 		    const Elf_Shdr *sechdrs,
+ 		    struct module *me)
+@@ -711,6 +764,8 @@
+ 	       me->arch.fdesc_count, me->arch.fdesc_max);
+ #endif
+ 
++	register_unwind_table(me, sechdrs);
++
+ 	/* haven't filled in me->symtab yet, so have to find it
+ 	 * ourselves */
+ 	for (i = 1; i < hdr->e_shnum; i++) {
+@@ -763,4 +818,5 @@
+ 
+ void module_arch_cleanup(struct module *mod)
+ {
++	deregister_unwind_table(mod);
+ }
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/pacache.S CVS2_6_11_PA2/arch/parisc/kernel/pacache.S
+--- LINUS_2_6_11/arch/parisc/kernel/pacache.S	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/pacache.S	2005-02-27 16:41:13.000000000 -0700
+@@ -27,17 +27,17 @@
+  */
+ 
+ #ifdef __LP64__
+-#define ADDIB   addib,*
+-#define CMPB    cmpb,*
+-#define ANDCM   andcm,*
++#define ADDIB	addib,*
++#define CMPB	cmpb,*
++#define ANDCM	andcm,*
+ 
+-	.level 2.0w
++	.level	2.0w
+ #else
+-#define ADDIB   addib,
+-#define CMPB    cmpb,
+-#define ANDCM   andcm
++#define ADDIB	addib,
++#define CMPB	cmpb,
++#define ANDCM	andcm
+ 
+-	.level 2.0
++	.level	2.0
+ #endif
+ 
+ #include <asm/assembly.h>
+@@ -46,7 +46,7 @@
+ #include <asm/cache.h>
+ 
+ 	.text
+-	.align 128
++	.align	128
+ 
+ 	.export flush_tlb_all_local,code
+ 
+@@ -68,7 +68,7 @@
+ 	 * consolidated.
+ 	 */
+ 
+-	rsm     PSW_SM_I,%r19	/* relied upon translation! PA 2.0 Arch. F-5 */
++	rsm		PSW_SM_I, %r19		/* relied upon translation! PA 2.0 Arch. F-5 */
+ 	nop
+ 	nop
+ 	nop
+@@ -77,127 +77,127 @@
+ 	nop
+ 	nop
+ 	
+-	rsm     PSW_SM_Q,%r0       /* Turn off Q bit to load iia queue */
+-	ldil    L%REAL_MODE_PSW, %r1
+-	ldo     R%REAL_MODE_PSW(%r1), %r1
+-	mtctl	%r1, %cr22
+-	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+-	mtctl	%r0, %cr17	/* Clear IIASQ head */
+-	ldil    L%PA(1f),%r1
+-	ldo     R%PA(1f)(%r1),%r1
+-	mtctl	%r1, %cr18	/* IIAOQ head */
+-	ldo	4(%r1), %r1
+-	mtctl	%r1, %cr18	/* IIAOQ tail */
++	rsm		PSW_SM_Q, %r0		/* Turn off Q bit to load iia queue */
++	ldil		L%REAL_MODE_PSW, %r1
++	ldo		R%REAL_MODE_PSW(%r1), %r1
++	mtctl		%r1, %cr22
++	mtctl		%r0, %cr17		/* Clear IIASQ tail */
++	mtctl		%r0, %cr17		/* Clear IIASQ head */
++	ldil		L%PA(1f), %r1
++	ldo		R%PA(1f)(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ head */
++	ldo		4(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ tail */
+ 	rfi
+ 	nop
+ 
+-1:      ldil            L%PA(cache_info),%r1
+-	ldo             R%PA(cache_info)(%r1),%r1
++1:      ldil		L%PA(cache_info), %r1
++	ldo		R%PA(cache_info)(%r1), %r1
+ 
+ 	/* Flush Instruction Tlb */
+ 
+-	LDREG           ITLB_SID_BASE(%r1),%r20
+-	LDREG           ITLB_SID_STRIDE(%r1),%r21
+-	LDREG           ITLB_SID_COUNT(%r1),%r22
+-	LDREG           ITLB_OFF_BASE(%r1),%arg0
+-	LDREG           ITLB_OFF_STRIDE(%r1),%arg1
+-	LDREG           ITLB_OFF_COUNT(%r1),%arg2
+-	LDREG           ITLB_LOOP(%r1),%arg3
+-
+-	ADDIB=          -1,%arg3,fitoneloop     /* Preadjust and test */
+-	movb,<,n        %arg3,%r31,fitdone      /* If loop < 0, skip */
+-	copy            %arg0,%r28              /* Init base addr */
+-
+-fitmanyloop:                                    /* Loop if LOOP >= 2 */
+-	mtsp            %r20,%sr1
+-	add             %r21,%r20,%r20          /* increment space */
+-	copy            %arg2,%r29              /* Init middle loop count */
+-
+-fitmanymiddle:                                  /* Loop if LOOP >= 2 */
+-	ADDIB>          -1,%r31,fitmanymiddle   /* Adjusted inner loop decr */
+-	pitlbe          0(%sr1,%r28)
+-	pitlbe,m        %arg1(%sr1,%r28)        /* Last pitlbe and addr adjust */
+-	ADDIB>          -1,%r29,fitmanymiddle   /* Middle loop decr */
+-	copy            %arg3,%r31              /* Re-init inner loop count */
+-
+-	movb,tr         %arg0,%r28,fitmanyloop  /* Re-init base addr */
+-	ADDIB<=,n       -1,%r22,fitdone         /* Outer loop count decr */
+-
+-fitoneloop:                                     /* Loop if LOOP = 1 */
+-	mtsp            %r20,%sr1
+-	copy            %arg0,%r28              /* init base addr */
+-	copy            %arg2,%r29              /* init middle loop count */
+-
+-fitonemiddle:                                   /* Loop if LOOP = 1 */
+-	ADDIB>          -1,%r29,fitonemiddle    /* Middle loop count decr */
+-	pitlbe,m        %arg1(%sr1,%r28)        /* pitlbe for one loop */
++	LDREG		ITLB_SID_BASE(%r1), %r20
++	LDREG		ITLB_SID_STRIDE(%r1), %r21
++	LDREG		ITLB_SID_COUNT(%r1), %r22
++	LDREG		ITLB_OFF_BASE(%r1), %arg0
++	LDREG		ITLB_OFF_STRIDE(%r1), %arg1
++	LDREG		ITLB_OFF_COUNT(%r1), %arg2
++	LDREG		ITLB_LOOP(%r1), %arg3
++
++	ADDIB=		-1, %arg3, fitoneloop	/* Preadjust and test */
++	movb,<,n	%arg3, %r31, fitdone	/* If loop < 0, skip */
++	copy		%arg0, %r28		/* Init base addr */
++
++fitmanyloop:					/* Loop if LOOP >= 2 */
++	mtsp		%r20, %sr1
++	add		%r21, %r20, %r20	/* increment space */
++	copy		%arg2, %r29		/* Init middle loop count */
++
++fitmanymiddle:					/* Loop if LOOP >= 2 */
++	ADDIB>		-1, %r31, fitmanymiddle	/* Adjusted inner loop decr */
++	pitlbe		0(%sr1, %r28)
++	pitlbe,m	%arg1(%sr1, %r28)	/* Last pitlbe and addr adjust */
++	ADDIB>		-1, %r29, fitmanymiddle	/* Middle loop decr */
++	copy		%arg3, %r31		/* Re-init inner loop count */
++
++	movb,tr		%arg0, %r28, fitmanyloop /* Re-init base addr */
++	ADDIB<=,n	-1, %r22, fitdone	/* Outer loop count decr */
++
++fitoneloop:					/* Loop if LOOP = 1 */
++	mtsp		%r20, %sr1
++	copy		%arg0, %r28		/* init base addr */
++	copy		%arg2, %r29		/* init middle loop count */
++
++fitonemiddle:					/* Loop if LOOP = 1 */
++	ADDIB>		-1, %r29, fitonemiddle	/* Middle loop count decr */
++	pitlbe,m	%arg1(%sr1, %r28)	/* pitlbe for one loop */
+ 
+-	ADDIB>          -1,%r22,fitoneloop      /* Outer loop count decr */
+-	add             %r21,%r20,%r20          /* increment space */
++	ADDIB>		-1, %r22, fitoneloop	/* Outer loop count decr */
++	add		%r21, %r20, %r20		/* increment space */
+ 
+ fitdone:
+ 
+ 	/* Flush Data Tlb */
+ 
+-	LDREG           DTLB_SID_BASE(%r1),%r20
+-	LDREG           DTLB_SID_STRIDE(%r1),%r21
+-	LDREG           DTLB_SID_COUNT(%r1),%r22
+-	LDREG           DTLB_OFF_BASE(%r1),%arg0
+-	LDREG           DTLB_OFF_STRIDE(%r1),%arg1
+-	LDREG           DTLB_OFF_COUNT(%r1),%arg2
+-	LDREG           DTLB_LOOP(%r1),%arg3
+-
+-	ADDIB=          -1,%arg3,fdtoneloop     /* Preadjust and test */
+-	movb,<,n        %arg3,%r31,fdtdone      /* If loop < 0, skip */
+-	copy            %arg0,%r28              /* Init base addr */
+-
+-fdtmanyloop:                                    /* Loop if LOOP >= 2 */
+-	mtsp            %r20,%sr1
+-	add             %r21,%r20,%r20          /* increment space */
+-	copy            %arg2,%r29              /* Init middle loop count */
+-
+-fdtmanymiddle:                                  /* Loop if LOOP >= 2 */
+-	ADDIB>          -1,%r31,fdtmanymiddle   /* Adjusted inner loop decr */
+-	pdtlbe          0(%sr1,%r28)
+-	pdtlbe,m        %arg1(%sr1,%r28)        /* Last pdtlbe and addr adjust */
+-	ADDIB>          -1,%r29,fdtmanymiddle   /* Middle loop decr */
+-	copy            %arg3,%r31              /* Re-init inner loop count */
+-
+-	movb,tr         %arg0,%r28,fdtmanyloop  /* Re-init base addr */
+-	ADDIB<=,n       -1,%r22,fdtdone         /* Outer loop count decr */
+-
+-fdtoneloop:                                     /* Loop if LOOP = 1 */
+-	mtsp            %r20,%sr1
+-	copy            %arg0,%r28              /* init base addr */
+-	copy            %arg2,%r29              /* init middle loop count */
+-
+-fdtonemiddle:                                   /* Loop if LOOP = 1 */
+-	ADDIB>          -1,%r29,fdtonemiddle    /* Middle loop count decr */
+-	pdtlbe,m        %arg1(%sr1,%r28)        /* pdtlbe for one loop */
++	LDREG		DTLB_SID_BASE(%r1), %r20
++	LDREG		DTLB_SID_STRIDE(%r1), %r21
++	LDREG		DTLB_SID_COUNT(%r1), %r22
++	LDREG		DTLB_OFF_BASE(%r1), %arg0
++	LDREG		DTLB_OFF_STRIDE(%r1), %arg1
++	LDREG		DTLB_OFF_COUNT(%r1), %arg2
++	LDREG		DTLB_LOOP(%r1), %arg3
++
++	ADDIB=		-1, %arg3, fdtoneloop	/* Preadjust and test */
++	movb,<,n	%arg3, %r31, fdtdone	/* If loop < 0, skip */
++	copy		%arg0, %r28		/* Init base addr */
++
++fdtmanyloop:					/* Loop if LOOP >= 2 */
++	mtsp		%r20, %sr1
++	add		%r21, %r20, %r20	/* increment space */
++	copy		%arg2, %r29		/* Init middle loop count */
++
++fdtmanymiddle:					/* Loop if LOOP >= 2 */
++	ADDIB>		-1, %r31, fdtmanymiddle	/* Adjusted inner loop decr */
++	pdtlbe		0(%sr1, %r28)
++	pdtlbe,m	%arg1(%sr1, %r28)	/* Last pdtlbe and addr adjust */
++	ADDIB>		-1, %r29, fdtmanymiddle	/* Middle loop decr */
++	copy		%arg3, %r31		/* Re-init inner loop count */
++
++	movb,tr		%arg0, %r28, fdtmanyloop /* Re-init base addr */
++	ADDIB<=,n	-1, %r22,fdtdone	/* Outer loop count decr */
++
++fdtoneloop:					/* Loop if LOOP = 1 */
++	mtsp		%r20, %sr1
++	copy		%arg0, %r28		/* init base addr */
++	copy		%arg2, %r29		/* init middle loop count */
++
++fdtonemiddle:					/* Loop if LOOP = 1 */
++	ADDIB>		-1, %r29, fdtonemiddle	/* Middle loop count decr */
++	pdtlbe,m	%arg1(%sr1, %r28)	/* pdtlbe for one loop */
+ 
+-	ADDIB>          -1,%r22,fdtoneloop      /* Outer loop count decr */
+-	add             %r21,%r20,%r20          /* increment space */
++	ADDIB>		-1, %r22, fdtoneloop	/* Outer loop count decr */
++	add		%r21, %r20, %r20	/* increment space */
+ 
+ fdtdone:
+ 
+ 	/* Switch back to virtual mode */
+ 
+-	rsm     PSW_SM_Q,%r0       /* clear Q bit to load iia queue */
+-	ldil	L%KERNEL_PSW, %r1
+-	ldo	R%KERNEL_PSW(%r1), %r1
+-	or      %r1,%r19,%r1    /* Set I bit if set on entry */
+-	mtctl	%r1, %cr22
+-	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+-	mtctl	%r0, %cr17	/* Clear IIASQ head */
+-	ldil    L%(2f), %r1
+-	ldo     R%(2f)(%r1), %r1
+-	mtctl	%r1, %cr18	/* IIAOQ head */
+-	ldo	4(%r1), %r1
+-	mtctl	%r1, %cr18	/* IIAOQ tail */
++	rsm		PSW_SM_Q, %r0		/* clear Q bit to load iia queue */
++	ldil		L%KERNEL_PSW, %r1
++	ldo		R%KERNEL_PSW(%r1), %r1
++	or		%r1, %r19, %r1		/* Set I bit if set on entry */
++	mtctl		%r1, %cr22
++	mtctl		%r0, %cr17		/* Clear IIASQ tail */
++	mtctl		%r0, %cr17		/* Clear IIASQ head */
++	ldil		L%(2f), %r1
++	ldo		R%(2f)(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ head */
++	ldo		4(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ tail */
+ 	rfi
+ 	nop
+ 
+-2:      bv      %r0(%r2)
++2:      bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -211,140 +211,198 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	mtsp            %r0,%sr1
+-	ldil            L%cache_info,%r1
+-	ldo             R%cache_info(%r1),%r1
++	mtsp		%r0, %sr1
++	ldil		L%cache_info, %r1
++	ldo		R%cache_info(%r1), %r1
+ 
+ 	/* Flush Instruction Cache */
+ 
+-	LDREG           ICACHE_BASE(%r1),%arg0
+-	LDREG           ICACHE_STRIDE(%r1),%arg1
+-	LDREG           ICACHE_COUNT(%r1),%arg2
+-	LDREG           ICACHE_LOOP(%r1),%arg3
+-	rsm             PSW_SM_I,%r22		/* No mmgt ops during loop*/
+-	ADDIB=          -1,%arg3,fioneloop      /* Preadjust and test */
+-	movb,<,n        %arg3,%r31,fisync       /* If loop < 0, do sync */
+-
+-fimanyloop:                                     /* Loop if LOOP >= 2 */
+-	ADDIB>          -1,%r31,fimanyloop      /* Adjusted inner loop decr */
+-	fice            0(%sr1,%arg0)
+-	fice,m          %arg1(%sr1,%arg0)       /* Last fice and addr adjust */
+-	movb,tr         %arg3,%r31,fimanyloop   /* Re-init inner loop count */
+-	ADDIB<=,n       -1,%arg2,fisync         /* Outer loop decr */
+-
+-fioneloop:                                      /* Loop if LOOP = 1 */
+-	ADDIB>          -1,%arg2,fioneloop      /* Outer loop count decr */
+-	fice,m          %arg1(%sr1,%arg0)       /* Fice for one loop */
++	LDREG		ICACHE_BASE(%r1), %arg0
++	LDREG		ICACHE_STRIDE(%r1), %arg1
++	LDREG		ICACHE_COUNT(%r1), %arg2
++	LDREG		ICACHE_LOOP(%r1), %arg3
++	rsm             PSW_SM_I, %r22		/* No mmgt ops during loop*/
++	ADDIB=		-1, %arg3, fioneloop	/* Preadjust and test */
++	movb,<,n	%arg3, %r31, fisync	/* If loop < 0, do sync */
++
++fimanyloop:					/* Loop if LOOP >= 2 */
++	ADDIB>		-1, %r31, fimanyloop	/* Adjusted inner loop decr */
++	fice            0(%sr1, %arg0)
++	fice,m		%arg1(%sr1, %arg0)	/* Last fice and addr adjust */
++	movb,tr		%arg3, %r31, fimanyloop	/* Re-init inner loop count */
++	ADDIB<=,n	-1, %arg2, fisync	/* Outer loop decr */
++
++fioneloop:					/* Loop if LOOP = 1 */
++	ADDIB>		-1, %arg2, fioneloop	/* Outer loop count decr */
++	fice,m		%arg1(%sr1, %arg0)	/* Fice for one loop */
+ 
+ fisync:
+ 	sync
+-	mtsm	%r22
+-	bv      %r0(%r2)
++	mtsm		%r22
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+ 	.procend
+ 
+-	.export flush_data_cache_local,code
+-	.import cache_info,data
++	.export flush_data_cache_local, code
++	.import cache_info, data
+ 
+ flush_data_cache_local:
+ 	.proc
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	mtsp            %r0,%sr1
+-	ldil            L%cache_info,%r1
+-	ldo             R%cache_info(%r1),%r1
++	mtsp		%r0, %sr1
++	ldil		L%cache_info, %r1
++	ldo		R%cache_info(%r1), %r1
+ 
+ 	/* Flush Data Cache */
+ 
+-	LDREG           DCACHE_BASE(%r1),%arg0
+-	LDREG           DCACHE_STRIDE(%r1),%arg1
+-	LDREG           DCACHE_COUNT(%r1),%arg2
+-	LDREG           DCACHE_LOOP(%r1),%arg3
+-	rsm             PSW_SM_I,%r22
+-	ADDIB=          -1,%arg3,fdoneloop      /* Preadjust and test */
+-	movb,<,n        %arg3,%r31,fdsync       /* If loop < 0, do sync */
+-
+-fdmanyloop:                                     /* Loop if LOOP >= 2 */
+-	ADDIB>          -1,%r31,fdmanyloop      /* Adjusted inner loop decr */
+-	fdce            0(%sr1,%arg0)
+-	fdce,m          %arg1(%sr1,%arg0)       /* Last fdce and addr adjust */
+-	movb,tr         %arg3,%r31,fdmanyloop   /* Re-init inner loop count */
+-	ADDIB<=,n       -1,%arg2,fdsync         /* Outer loop decr */
+-
+-fdoneloop:                                      /* Loop if LOOP = 1 */
+-	ADDIB>          -1,%arg2,fdoneloop      /* Outer loop count decr */
+-	fdce,m          %arg1(%sr1,%arg0)       /* Fdce for one loop */
++	LDREG		DCACHE_BASE(%r1), %arg0
++	LDREG		DCACHE_STRIDE(%r1), %arg1
++	LDREG		DCACHE_COUNT(%r1), %arg2
++	LDREG		DCACHE_LOOP(%r1), %arg3
++	rsm		PSW_SM_I, %r22
++	ADDIB=		-1, %arg3, fdoneloop	/* Preadjust and test */
++	movb,<,n	%arg3, %r31, fdsync	/* If loop < 0, do sync */
++
++fdmanyloop:					/* Loop if LOOP >= 2 */
++	ADDIB>		-1, %r31, fdmanyloop	/* Adjusted inner loop decr */
++	fdce		0(%sr1, %arg0)
++	fdce,m		%arg1(%sr1, %arg0)	/* Last fdce and addr adjust */
++	movb,tr		%arg3, %r31, fdmanyloop	/* Re-init inner loop count */
++	ADDIB<=,n	-1, %arg2, fdsync	/* Outer loop decr */
++
++fdoneloop:					/* Loop if LOOP = 1 */
++	ADDIB>		-1, %arg2, fdoneloop	/* Outer loop count decr */
++	fdce,m		%arg1(%sr1, %arg0)	/* Fdce for one loop */
+ 
+ fdsync:
+ 	syncdma
+ 	sync
+-	mtsm    %r22
+-	bv      %r0(%r2)
++	mtsm		%r22
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+ 	.procend
+ 
+ 	.export copy_user_page_asm,code
++	.align	16
+ 
+ copy_user_page_asm:
+ 	.proc
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldi 64,%r1
++#ifdef __LP64__
++	/* PA8x00 CPUs can consume 2 loads or 1 store per cycle.
++	 * Unroll the loop by hand and arrange insn appropriately.
++	 * GCC probably can do this just as well.
++	 */
++
++	ldd		0(%r25), %r19
++	ldi		32, %r1                 /* PAGE_SIZE/128 == 32 */
++	ldw		64(%r25), %r0		/* prefetch 1 cacheline ahead */
++	ldw		128(%r25), %r0		/* prefetch 2 */
++
++1:	ldd		8(%r25), %r20
++	ldw		192(%r25), %r0		/* prefetch 3 */
++	ldw		256(%r25), %r0		/* prefetch 4 */
++
++	ldd		16(%r25), %r21
++	ldd		24(%r25), %r22
++	std		%r19, 0(%r26)
++	std		%r20, 8(%r26)
++
++	ldd		32(%r25), %r19
++	ldd		40(%r25), %r20
++	std		%r21, 16(%r26)
++	std		%r22, 24(%r26)
++
++	ldd		48(%r25), %r21
++	ldd		56(%r25), %r22
++	std		%r19, 32(%r26)
++	std		%r20, 40(%r26)
++
++	ldd		64(%r25), %r19
++	ldd		72(%r25), %r20
++	std		%r21, 48(%r26)
++	std		%r22, 56(%r26)
++
++	ldd		80(%r25), %r21
++	ldd		88(%r25), %r22
++	std		%r19, 64(%r26)
++	std		%r20, 72(%r26)
++
++	ldd		 96(%r25), %r19
++	ldd		104(%r25), %r20
++	std		%r21, 80(%r26)
++	std		%r22, 88(%r26)
++
++	ldd		112(%r25), %r21
++	ldd		120(%r25), %r22
++	std		%r19, 96(%r26)
++	std		%r20, 104(%r26)
++
++	ldo		128(%r25), %r25
++	std		%r21, 112(%r26)
++	std		%r22, 120(%r26)
++	ldo		128(%r26), %r26
++
++	ADDIB>		-1, %r1, 1b		/* bundle 10 */
++	ldd		0(%r25), %r19		/* start next loads */
++
++#else
+ 
+ 	/*
+ 	 * This loop is optimized for PCXL/PCXL2 ldw/ldw and stw/stw
+-	 * bundles (very restricted rules for bundling). It probably
+-	 * does OK on PCXU and better, but we could do better with
+-	 * ldd/std instructions. Note that until (if) we start saving
++	 * bundles (very restricted rules for bundling).
++	 * Note that until (if) we start saving
+ 	 * the full 64 bit register values on interrupt, we can't
+ 	 * use ldd/std on a 32 bit kernel.
+ 	 */
+-
++	ldi		64, %r1		/* PAGE_SIZE/64 == 64 */
+ 
+ 1:
+-	ldw 0(%r25),%r19
+-	ldw 4(%r25),%r20
+-	ldw 8(%r25),%r21
+-	ldw 12(%r25),%r22
+-	stw %r19,0(%r26)
+-	stw %r20,4(%r26)
+-	stw %r21,8(%r26)
+-	stw %r22,12(%r26)
+-	ldw 16(%r25),%r19
+-	ldw 20(%r25),%r20
+-	ldw 24(%r25),%r21
+-	ldw 28(%r25),%r22
+-	stw %r19,16(%r26)
+-	stw %r20,20(%r26)
+-	stw %r21,24(%r26)
+-	stw %r22,28(%r26)
+-	ldw 32(%r25),%r19
+-	ldw 36(%r25),%r20
+-	ldw 40(%r25),%r21
+-	ldw 44(%r25),%r22
+-	stw %r19,32(%r26)
+-	stw %r20,36(%r26)
+-	stw %r21,40(%r26)
+-	stw %r22,44(%r26)
+-	ldw 48(%r25),%r19
+-	ldw 52(%r25),%r20
+-	ldw 56(%r25),%r21
+-	ldw 60(%r25),%r22
+-	stw %r19,48(%r26)
+-	stw %r20,52(%r26)
+-	stw %r21,56(%r26)
+-	stw %r22,60(%r26)
+-	ldo 64(%r26),%r26
+-	ADDIB>  -1,%r1,1b
+-	ldo 64(%r25),%r25
+-
+-	bv      %r0(%r2)
++	ldw		0(%r25), %r19
++	ldw		4(%r25), %r20
++	ldw		8(%r25), %r21
++	ldw		12(%r25), %r22
++	stw		%r19, 0(%r26)
++	stw		%r20, 4(%r26)
++	stw		%r21, 8(%r26)
++	stw		%r22, 12(%r26)
++	ldw		16(%r25), %r19
++	ldw		20(%r25), %r20
++	ldw		24(%r25), %r21
++	ldw		28(%r25), %r22
++	stw		%r19, 16(%r26)
++	stw		%r20, 20(%r26)
++	stw		%r21, 24(%r26)
++	stw		%r22, 28(%r26)
++	ldw		32(%r25), %r19
++	ldw		36(%r25), %r20
++	ldw		40(%r25), %r21
++	ldw		44(%r25), %r22
++	stw		%r19, 32(%r26)
++	stw		%r20, 36(%r26)
++	stw		%r21, 40(%r26)
++	stw		%r22, 44(%r26)
++	ldw		48(%r25), %r19
++	ldw		52(%r25), %r20
++	ldw		56(%r25), %r21
++	ldw		60(%r25), %r22
++	stw		%r19, 48(%r26)
++	stw		%r20, 52(%r26)
++	stw		%r21, 56(%r26)
++	stw		%r22, 60(%r26)
++	ldo		64(%r26), %r26
++	ADDIB>		-1, %r1, 1b
++	ldo		64(%r25), %r25
++#endif
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -393,33 +451,33 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%(__PAGE_OFFSET),%r1
+-	sub     %r26,%r1,%r26
+-	sub     %r25,%r1,%r23  /* move physical addr into non shadowed reg */
+-
+-	ldil    L%(TMPALIAS_MAP_START),%r28
+-#ifdef __LP64__
+-	extrd,u %r26,56,32,%r26 /* convert phys addr to tlb insert format */
+-	extrd,u %r23,56,32,%r23 /* convert phys addr to tlb insert format */
+-	depd    %r24,63,22,%r28 /* Form aliased virtual address 'to' */
+-	depdi   0,63,12,%r28    /* Clear any offset bits */
+-	copy    %r28,%r29
+-	depdi   1,41,1,%r29     /* Form aliased virtual address 'from' */
+-#else
+-	extrw,u %r26,24,25,%r26 /* convert phys addr to tlb insert format */
+-	extrw,u %r23,24,25,%r23 /* convert phys addr to tlb insert format */
+-	depw    %r24,31,22,%r28 /* Form aliased virtual address 'to' */
+-	depwi   0,31,12,%r28    /* Clear any offset bits */
+-	copy    %r28,%r29
+-	depwi   1,9,1,%r29      /* Form aliased virtual address 'from' */
++	ldil		L%(__PAGE_OFFSET), %r1
++	sub		%r26, %r1, %r26
++	sub		%r25, %r1, %r23		/* move physical addr into non shadowed reg */
++
++	ldil		L%(TMPALIAS_MAP_START), %r28
++#ifdef __LP64__
++	extrd,u		%r26,56,32, %r26		/* convert phys addr to tlb insert format */
++	extrd,u		%r23,56,32, %r23		/* convert phys addr to tlb insert format */
++	depd		%r24,63,22, %r28		/* Form aliased virtual address 'to' */
++	depdi		0, 63,12, %r28		/* Clear any offset bits */
++	copy		%r28, %r29
++	depdi		1, 41,1, %r29		/* Form aliased virtual address 'from' */
++#else
++	extrw,u		%r26, 24,25, %r26	/* convert phys addr to tlb insert format */
++	extrw,u		%r23, 24,25, %r23	/* convert phys addr to tlb insert format */
++	depw		%r24, 31,22, %r28	/* Form aliased virtual address 'to' */
++	depwi		0, 31,12, %r28		/* Clear any offset bits */
++	copy		%r28, %r29
++	depwi		1, 9,1, %r29		/* Form aliased virtual address 'from' */
+ #endif
+ 
+ 	/* Purge any old translations */
+ 
+-	pdtlb   0(%r28)
+-	pdtlb   0(%r29)
++	pdtlb		0(%r28)
++	pdtlb		0(%r29)
+ 
+-	ldi 64,%r1
++	ldi		64, %r1
+ 
+ 	/*
+ 	 * This loop is optimized for PCXL/PCXL2 ldw/ldw and stw/stw
+@@ -432,43 +490,43 @@
+ 
+ 
+ 1:
+-	ldw 0(%r29),%r19
+-	ldw 4(%r29),%r20
+-	ldw 8(%r29),%r21
+-	ldw 12(%r29),%r22
+-	stw %r19,0(%r28)
+-	stw %r20,4(%r28)
+-	stw %r21,8(%r28)
+-	stw %r22,12(%r28)
+-	ldw 16(%r29),%r19
+-	ldw 20(%r29),%r20
+-	ldw 24(%r29),%r21
+-	ldw 28(%r29),%r22
+-	stw %r19,16(%r28)
+-	stw %r20,20(%r28)
+-	stw %r21,24(%r28)
+-	stw %r22,28(%r28)
+-	ldw 32(%r29),%r19
+-	ldw 36(%r29),%r20
+-	ldw 40(%r29),%r21
+-	ldw 44(%r29),%r22
+-	stw %r19,32(%r28)
+-	stw %r20,36(%r28)
+-	stw %r21,40(%r28)
+-	stw %r22,44(%r28)
+-	ldw 48(%r29),%r19
+-	ldw 52(%r29),%r20
+-	ldw 56(%r29),%r21
+-	ldw 60(%r29),%r22
+-	stw %r19,48(%r28)
+-	stw %r20,52(%r28)
+-	stw %r21,56(%r28)
+-	stw %r22,60(%r28)
+-	ldo 64(%r28),%r28
+-	ADDIB>  -1,%r1,1b
+-	ldo 64(%r29),%r29
++	ldw		0(%r29), %r19
++	ldw		4(%r29), %r20
++	ldw		8(%r29), %r21
++	ldw		12(%r29), %r22
++	stw		%r19, 0(%r28)
++	stw		%r20, 4(%r28)
++	stw		%r21, 8(%r28)
++	stw		%r22, 12(%r28)
++	ldw		16(%r29), %r19
++	ldw		20(%r29), %r20
++	ldw		24(%r29), %r21
++	ldw		28(%r29), %r22
++	stw		%r19, 16(%r28)
++	stw		%r20, 20(%r28)
++	stw		%r21, 24(%r28)
++	stw		%r22, 28(%r28)
++	ldw		32(%r29), %r19
++	ldw		36(%r29), %r20
++	ldw		40(%r29), %r21
++	ldw		44(%r29), %r22
++	stw		%r19, 32(%r28)
++	stw		%r20, 36(%r28)
++	stw		%r21, 40(%r28)
++	stw		%r22, 44(%r28)
++	ldw		48(%r29), %r19
++	ldw		52(%r29), %r20
++	ldw		56(%r29), %r21
++	ldw		60(%r29), %r22
++	stw		%r19, 48(%r28)
++	stw		%r20, 52(%r28)
++	stw		%r21, 56(%r28)
++	stw		%r22, 60(%r28)
++	ldo		64(%r28), %r28
++	ADDIB>		-1, %r1,1b
++	ldo		64(%r29), %r29
+ 
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -482,49 +540,77 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	tophys_r1 %r26
++	tophys_r1	%r26
+ 
+-	ldil    L%(TMPALIAS_MAP_START),%r28
++	ldil		L%(TMPALIAS_MAP_START), %r28
+ #ifdef __LP64__
+ #if (TMPALIAS_MAP_START >= 0x80000000)
+-	depdi	0,31,32,%r28	/* clear any sign extension */
++	depdi		0, 31,32, %r28		/* clear any sign extension */
+ #endif
+-	extrd,u %r26,56,32,%r26 /* convert phys addr to tlb insert format */
+-	depd    %r25,63,22,%r28 /* Form aliased virtual address 'to' */
+-	depdi   0,63,12,%r28    /* Clear any offset bits */
+-#else
+-	extrw,u %r26,24,25,%r26 /* convert phys addr to tlb insert format */
+-	depw    %r25,31,22,%r28 /* Form aliased virtual address 'to' */
+-	depwi   0,31,12,%r28    /* Clear any offset bits */
++	extrd,u		%r26, 56,32, %r26	/* convert phys addr to tlb insert format */
++	depd		%r25, 63,22, %r28	/* Form aliased virtual address 'to' */
++	depdi		0, 63,12, %r28		/* Clear any offset bits */
++#else
++	extrw,u		%r26, 24,25, %r26	/* convert phys addr to tlb insert format */
++	depw		%r25, 31,22, %r28	/* Form aliased virtual address 'to' */
++	depwi		0, 31,12, %r28		/* Clear any offset bits */
+ #endif
+ 
+ 	/* Purge any old translation */
+ 
+-	pdtlb   0(%r28)
++	pdtlb		0(%r28)
+ 
+-	ldi 64,%r1
++#ifdef __LP64__
++	ldi		32, %r1			/* PAGE_SIZE/128 == 32 */
++
++	/* PREFETCH (Write) has not (yet) been proven to help here */
++/* #define	PREFETCHW_OP	ldd		256(%0), %r0 */
++
++1:	std		%r0, 0(%r28)
++	std		%r0, 8(%r28)
++	std		%r0, 16(%r28)
++	std		%r0, 24(%r28)
++	std		%r0, 32(%r28)
++	std		%r0, 40(%r28)
++	std		%r0, 48(%r28)
++	std		%r0, 56(%r28)
++	std		%r0, 64(%r28)
++	std		%r0, 72(%r28)
++	std		%r0, 80(%r28)
++	std		%r0, 88(%r28)
++	std		%r0, 96(%r28)
++	std		%r0, 104(%r28)
++	std		%r0, 112(%r28)
++	std		%r0, 120(%r28)
++	ADDIB>		-1, %r1, 1b
++	ldo		128(%r28), %r28
++
++#else	/* ! __LP64 */
++
++	ldi		64, %r1			/* PAGE_SIZE/64 == 64 */
+ 
+ 1:
+-	stw %r0,0(%r28)
+-	stw %r0,4(%r28)
+-	stw %r0,8(%r28)
+-	stw %r0,12(%r28)
+-	stw %r0,16(%r28)
+-	stw %r0,20(%r28)
+-	stw %r0,24(%r28)
+-	stw %r0,28(%r28)
+-	stw %r0,32(%r28)
+-	stw %r0,36(%r28)
+-	stw %r0,40(%r28)
+-	stw %r0,44(%r28)
+-	stw %r0,48(%r28)
+-	stw %r0,52(%r28)
+-	stw %r0,56(%r28)
+-	stw %r0,60(%r28)
+-	ADDIB>  -1,%r1,1b
+-	ldo 64(%r28),%r28
++	stw		%r0, 0(%r28)
++	stw		%r0, 4(%r28)
++	stw		%r0, 8(%r28)
++	stw		%r0, 12(%r28)
++	stw		%r0, 16(%r28)
++	stw		%r0, 20(%r28)
++	stw		%r0, 24(%r28)
++	stw		%r0, 28(%r28)
++	stw		%r0, 32(%r28)
++	stw		%r0, 36(%r28)
++	stw		%r0, 40(%r28)
++	stw		%r0, 44(%r28)
++	stw		%r0, 48(%r28)
++	stw		%r0, 52(%r28)
++	stw		%r0, 56(%r28)
++	stw		%r0, 60(%r28)
++	ADDIB>		-1, %r1, 1b
++	ldo		64(%r28), %r28
++#endif	/* __LP64 */
+ 
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -537,38 +623,38 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
+ 
+ #ifdef __LP64__
+-	depdi,z 1,63-PAGE_SHIFT,1,%r25
++	depdi,z		1, 63-PAGE_SHIFT,1, %r25
+ #else
+-	depwi,z 1,31-PAGE_SHIFT,1,%r25
++	depwi,z		1, 31-PAGE_SHIFT,1, %r25
+ #endif
+-	add     %r26,%r25,%r25
+-	sub     %r25,%r23,%r25
+-
+-
+-1:      fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	fdc,m   %r23(%r26)
+-	CMPB<<  %r26,%r25,1b
+-	fdc,m   %r23(%r26)
++	add		%r26, %r25, %r25
++	sub		%r25, %r23, %r25
++
++
++1:      fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	fdc,m		%r23(%r26)
++	CMPB<<		%r26, %r25,1b
++	fdc,m		%r23(%r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -581,38 +667,38 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
+ 
+ #ifdef __LP64__
+-	depdi,z 1,63-PAGE_SHIFT,1,%r25
++	depdi,z		1,63-PAGE_SHIFT,1, %r25
+ #else
+-	depwi,z 1,31-PAGE_SHIFT,1,%r25
++	depwi,z		1,31-PAGE_SHIFT,1, %r25
+ #endif
+-	add     %r26,%r25,%r25
+-	sub     %r25,%r23,%r25
+-
+-
+-1:      fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	fdc,m   %r23(%sr3,%r26)
+-	CMPB<<  %r26,%r25,1b
+-	fdc,m   %r23(%sr3,%r26)
++	add		%r26, %r25, %r25
++	sub		%r25, %r23, %r25
++
++
++1:      fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	fdc,m		%r23(%sr3, %r26)
++	CMPB<<		%r26, %r25,1b
++	fdc,m		%r23(%sr3, %r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -625,38 +711,38 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
+ 
+ #ifdef __LP64__
+-	depdi,z 1,63-PAGE_SHIFT,1,%r25
++	depdi,z		1, 63-PAGE_SHIFT,1, %r25
+ #else
+-	depwi,z 1,31-PAGE_SHIFT,1,%r25
++	depwi,z		1, 31-PAGE_SHIFT,1, %r25
+ #endif
+-	add     %r26,%r25,%r25
+-	sub     %r25,%r23,%r25
+-
+-
+-1:      fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	fic,m   %r23(%sr3,%r26)
+-	CMPB<<  %r26,%r25,1b
+-	fic,m   %r23(%sr3,%r26)
++	add		%r26, %r25, %r25
++	sub		%r25, %r23, %r25
++
++
++1:      fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	fic,m		%r23(%sr3, %r26)
++	CMPB<<		%r26, %r25,1b
++	fic,m		%r23(%sr3, %r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -670,37 +756,37 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
+ 
+ #ifdef __LP64__
+-	depdi,z 1,63-PAGE_SHIFT,1,%r25
++	depdi,z		1, 63-PAGE_SHIFT,1, %r25
+ #else
+-	depwi,z 1,31-PAGE_SHIFT,1,%r25
++	depwi,z		1, 31-PAGE_SHIFT,1, %r25
+ #endif
+-	add      %r26,%r25,%r25
+-	sub      %r25,%r23,%r25
+-
+-1:      pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	pdc,m   %r23(%r26)
+-	CMPB<<  %r26,%r25,1b
+-	pdc,m   %r23(%r26)
++	add		%r26, %r25, %r25
++	sub		%r25, %r23, %r25
++
++1:      pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	pdc,m		%r23(%r26)
++	CMPB<<		%r26, %r25, 1b
++	pdc,m		%r23(%r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -718,54 +804,54 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	tophys_r1 %r26
++	tophys_r1		%r26
+ 
+-	ldil    L%(TMPALIAS_MAP_START),%r28
++	ldil		L%(TMPALIAS_MAP_START), %r28
+ #ifdef __LP64__
+-	extrd,u %r26,56,32,%r26 /* convert phys addr to tlb insert format */
+-	depd    %r25,63,22,%r28 /* Form aliased virtual address 'to' */
+-	depdi   0,63,12,%r28    /* Clear any offset bits */
++	extrd,u		%r26, 56,32, %r26	/* convert phys addr to tlb insert format */
++	depd		%r25, 63,22, %r28	/* Form aliased virtual address 'to' */
++	depdi		0, 63,12, %r28		/* Clear any offset bits */
+ #else
+-	extrw,u %r26,24,25,%r26 /* convert phys addr to tlb insert format */
+-	depw    %r25,31,22,%r28 /* Form aliased virtual address 'to' */
+-	depwi   0,31,12,%r28    /* Clear any offset bits */
++	extrw,u		%r26, 24,25, %r26	/* convert phys addr to tlb insert format */
++	depw		%r25, 31,22, %r28	/* Form aliased virtual address 'to' */
++	depwi		0, 31,12, %r28		/* Clear any offset bits */
+ #endif
+ 
+ 	/* Purge any old translation */
+ 
+-	pdtlb   0(%r28)
++	pdtlb		0(%r28)
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
+ 
+ #ifdef __LP64__
+-	depdi,z 1,63-PAGE_SHIFT,1,%r29
++	depdi,z		1, 63-PAGE_SHIFT,1, %r29
+ #else
+-	depwi,z 1,31-PAGE_SHIFT,1,%r29
+-#endif
+-	add      %r28,%r29,%r29
+-	sub      %r29,%r23,%r29
+-
+-1:      fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	fdc,m   %r23(%r28)
+-	CMPB<<  %r28,%r29,1b
+-	fdc,m   %r23(%r28)
++	depwi,z		1, 31-PAGE_SHIFT,1, %r29
++#endif
++	add		%r28, %r29, %r29
++	sub		%r29, %r23, %r29
++
++1:      fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	fdc,m		%r23(%r28)
++	CMPB<<		%r28, %r29, 1b
++	fdc,m		%r23(%r28)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -779,16 +865,16 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
+-	ldo     -1(%r23),%r21
+-	ANDCM   %r26,%r21,%r26
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
++	ldo		-1(%r23), %r21
++	ANDCM		%r26, %r21, %r26
+ 
+-1:      CMPB<<,n %r26,%r25,1b
+-	fdc,m   %r23(%sr3,%r26)
++1:      CMPB<<,n	%r26, %r25, 1b
++	fdc,m		%r23(%sr3, %r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -801,17 +887,17 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%dcache_stride,%r1
+-	ldw     R%dcache_stride(%r1),%r23
+-	ldo     -1(%r23),%r21
+-	ANDCM   %r26,%r21,%r26
++	ldil		L%dcache_stride, %r1
++	ldw		R%dcache_stride(%r1), %r23
++	ldo		-1(%r23), %r21
++	ANDCM		%r26, %r21, %r26
+ 
+-1:      CMPB<<,n %r26,%r25,1b
+-	fdc,m   %r23(%r26)
++1:      CMPB<<,n	%r26, %r25,1b
++	fdc,m		%r23(%r26)
+ 
+ 	sync
+ 	syncdma
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -824,16 +910,16 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%icache_stride,%r1
+-	ldw     R%icache_stride(%r1),%r23
+-	ldo     -1(%r23),%r21
+-	ANDCM   %r26,%r21,%r26
++	ldil		L%icache_stride, %r1
++	ldw		R%icache_stride(%r1), %r23
++	ldo		-1(%r23), %r21
++	ANDCM		%r26, %r21, %r26
+ 
+-1:      CMPB<<,n %r26,%r25,1b
+-	fic,m   %r23(%sr3,%r26)
++1:      CMPB<<,n	%r26, %r25,1b
++	fic,m		%r23(%sr3, %r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -846,38 +932,38 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%icache_stride,%r1
+-	ldw     R%icache_stride(%r1),%r23
++	ldil		L%icache_stride, %r1
++	ldw		R%icache_stride(%r1), %r23
+ 
+ #ifdef __LP64__
+-	depdi,z 1,63-PAGE_SHIFT,1,%r25
++	depdi,z		1, 63-PAGE_SHIFT,1, %r25
+ #else
+-	depwi,z 1,31-PAGE_SHIFT,1,%r25
++	depwi,z		1, 31-PAGE_SHIFT,1, %r25
+ #endif
+-	add     %r26,%r25,%r25
+-	sub     %r25,%r23,%r25
+-
+-
+-1:      fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	fic,m   %r23(%r26)
+-	CMPB<<  %r26,%r25,1b
+-	fic,m   %r23(%r26)
++	add		%r26, %r25, %r25
++	sub		%r25, %r23, %r25
++
++
++1:      fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	fic,m		%r23(%r26)
++	CMPB<<		%r26, %r25, 1b
++	fic,m		%r23(%r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+@@ -890,22 +976,22 @@
+ 	.callinfo NO_CALLS
+ 	.entry
+ 
+-	ldil    L%icache_stride,%r1
+-	ldw     R%icache_stride(%r1),%r23
+-	ldo     -1(%r23),%r21
+-	ANDCM   %r26,%r21,%r26
++	ldil		L%icache_stride, %r1
++	ldw		R%icache_stride(%r1), %r23
++	ldo		-1(%r23), %r21
++	ANDCM		%r26, %r21, %r26
+ 
+-1:      CMPB<<,n %r26,%r25,1b
+-	fic,m   %r23(%r26)
++1:      CMPB<<,n	%r26, %r25, 1b
++	fic,m		%r23(%r26)
+ 
+ 	sync
+-	bv      %r0(%r2)
++	bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+ 	.procend
+ 
+-	.align 128
++	.align	128
+ 
+ 	.export disable_sr_hashing_asm,code
+ 
+@@ -916,7 +1002,7 @@
+ 
+ 	/* Switch to real mode */
+ 
+-	ssm     0,%r0           /* relied upon translation! */
++	ssm		0, %r0			/* relied upon translation! */
+ 	nop
+ 	nop
+ 	nop
+@@ -925,73 +1011,73 @@
+ 	nop
+ 	nop
+ 	
+-	rsm     (PSW_SM_Q|PSW_SM_I),%r0 /* disable Q&I to load the iia queue */
+-	ldil    L%REAL_MODE_PSW, %r1
+-	ldo     R%REAL_MODE_PSW(%r1), %r1
+-	mtctl	%r1, %cr22
+-	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+-	mtctl	%r0, %cr17	/* Clear IIASQ head */
+-	ldil    L%PA(1f),%r1
+-	ldo     R%PA(1f)(%r1),%r1
+-	mtctl	%r1, %cr18	/* IIAOQ head */
+-	ldo	4(%r1), %r1
+-	mtctl	%r1, %cr18	/* IIAOQ tail */
++	rsm		(PSW_SM_Q|PSW_SM_I), %r0 /* disable Q&I to load the iia queue */
++	ldil		L%REAL_MODE_PSW, %r1
++	ldo		R%REAL_MODE_PSW(%r1), %r1
++	mtctl		%r1, %cr22
++	mtctl		%r0, %cr17		/* Clear IIASQ tail */
++	mtctl		%r0, %cr17		/* Clear IIASQ head */
++	ldil		L%PA(1f), %r1
++	ldo		R%PA(1f)(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ head */
++	ldo		4(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ tail */
+ 	rfi
+ 	nop
+ 
+-1:      cmpib,=,n SRHASH_PCXST,%r26,srdis_pcxs
+-	cmpib,=,n SRHASH_PCXL,%r26,srdis_pcxl
+-	cmpib,=,n SRHASH_PA20,%r26,srdis_pa20
+-	b,n       srdis_done
++1:      cmpib,=,n	SRHASH_PCXST, %r26,srdis_pcxs
++	cmpib,=,n	SRHASH_PCXL, %r26,srdis_pcxl
++	cmpib,=,n	SRHASH_PA20, %r26,srdis_pa20
++	b,n		srdis_done
+ 
+ srdis_pcxs:
+ 
+ 	/* Disable Space Register Hashing for PCXS,PCXT,PCXT' */
+ 
+-	.word           0x141c1a00  /* mfdiag %dr0,%r28 */
+-	.word           0x141c1a00  /* must issue twice */
+-	depwi           0,18,1,%r28 /* Clear DHE (dcache hash enable) */
+-	depwi           0,20,1,%r28 /* Clear IHE (icache hash enable) */
+-	.word           0x141c1600  /* mtdiag %r28,%dr0 */
+-	.word           0x141c1600  /* must issue twice */
+-	b,n             srdis_done
++	.word		0x141c1a00		/* mfdiag %dr0, %r28 */
++	.word		0x141c1a00		/* must issue twice */
++	depwi		0,18,1, %r28		/* Clear DHE (dcache hash enable) */
++	depwi		0,20,1, %r28		/* Clear IHE (icache hash enable) */
++	.word		0x141c1600		/* mtdiag %r28, %dr0 */
++	.word		0x141c1600		/* must issue twice */
++	b,n		srdis_done
+ 
+ srdis_pcxl:
+ 
+ 	/* Disable Space Register Hashing for PCXL */
+ 
+-	.word           0x141c0600  /* mfdiag %dr0,%r28 */
+-	depwi           0,28,2,%r28 /* Clear DHASH_EN & IHASH_EN */
+-	.word           0x141c0240  /* mtdiag %r28,%dr0 */
+-	b,n             srdis_done
++	.word		0x141c0600		/* mfdiag %dr0, %r28 */
++	depwi           0,28,2, %r28		/* Clear DHASH_EN & IHASH_EN */
++	.word		0x141c0240		/* mtdiag %r28, %dr0 */
++	b,n		srdis_done
+ 
+ srdis_pa20:
+ 
+ 	/* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+ */
+ 
+-	.word           0x144008bc  /* mfdiag %dr2,%r28 */
+-	depdi           0,54,1,%r28 /* clear DIAG_SPHASH_ENAB (bit 54) */
+-	.word           0x145c1840  /* mtdiag %r28,%dr2 */
++	.word		0x144008bc		/* mfdiag %dr2, %r28 */
++	depdi		0, 54,1, %r28		/* clear DIAG_SPHASH_ENAB (bit 54) */
++	.word		0x145c1840		/* mtdiag %r28, %dr2 */
+ 
+ srdis_done:
+ 
+ 	/* Switch back to virtual mode */
+ 
+-	rsm     PSW_SM_Q,%r0           /* clear Q bit to load iia queue */
+-	ldil	L%KERNEL_PSW, %r1
+-	ldo	R%KERNEL_PSW(%r1), %r1
+-	mtctl	%r1, %cr22
+-	mtctl	%r0, %cr17	/* Clear IIASQ tail */
+-	mtctl	%r0, %cr17	/* Clear IIASQ head */
+-	ldil    L%(2f), %r1
+-	ldo     R%(2f)(%r1), %r1
+-	mtctl	%r1, %cr18	/* IIAOQ head */
+-	ldo	4(%r1), %r1
+-	mtctl	%r1, %cr18	/* IIAOQ tail */
++	rsm		PSW_SM_Q, %r0		/* clear Q bit to load iia queue */
++	ldil		L%KERNEL_PSW, %r1
++	ldo		R%KERNEL_PSW(%r1), %r1
++	mtctl		%r1, %cr22
++	mtctl		%r0, %cr17		/* Clear IIASQ tail */
++	mtctl		%r0, %cr17		/* Clear IIASQ head */
++	ldil 	   	L%(2f), %r1
++	ldo     	R%(2f)(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ head */
++	ldo		4(%r1), %r1
++	mtctl		%r1, %cr18		/* IIAOQ tail */
+ 	rfi
+ 	nop
+ 
+-2:      bv      %r0(%r2)
++2:      bv		%r0(%r2)
+ 	nop
+ 	.exit
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/pci-dma.c CVS2_6_11_PA2/arch/parisc/kernel/pci-dma.c
+--- LINUS_2_6_11/arch/parisc/kernel/pci-dma.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/pci-dma.c	2004-11-17 15:17:42.000000000 -0700
+@@ -32,18 +32,6 @@
+ #include <asm/pgalloc.h>
+ #include <asm/uaccess.h>
+ 
+-#ifdef DEBUG_PCI
+-#undef ASSERT
+-#define ASSERT(expr) \
+-	if(!(expr)) { \
+-		printk("\n%s:%d: Assertion " #expr " failed!\n", \
+-				__FILE__, __LINE__); \
+-		panic(#expr); \
+-	}
+-#else
+-#define ASSERT(expr)
+-#endif
+-
+ 
+ static struct proc_dir_entry * proc_gsc_root = NULL;
+ static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
+@@ -259,10 +247,6 @@
+ 	u_long mask, flags;
+ 	unsigned int pages_needed = size >> PAGE_SHIFT;
+ 
+-	ASSERT(pages_needed);
+-	ASSERT((pages_needed * PAGE_SIZE) < DMA_CHUNK_SIZE);
+-	ASSERT(pages_needed < (BITS_PER_LONG - PAGE_SHIFT));
+-
+ 	mask = (u_long) -1L;
+  	mask >>= BITS_PER_LONG - pages_needed;
+ 
+@@ -306,7 +290,7 @@
+ 
+ #define PCXL_FREE_MAPPINGS(idx, m, size) \
+ 		u##size *res_ptr = (u##size *)&(pcxl_res_map[(idx) + (((size >> 3) - 1) & (~((size >> 3) - 1)))]); \
+-		ASSERT((*res_ptr & m) == m); \
++		/* BUG_ON((*res_ptr & m) != m); */ \
+ 		*res_ptr &= ~m;
+ 
+ /*
+@@ -319,10 +303,6 @@
+ 	unsigned int res_idx = (vaddr - pcxl_dma_start) >> (PAGE_SHIFT + 3);
+ 	unsigned int pages_mapped = size >> PAGE_SHIFT;
+ 
+-	ASSERT(pages_mapped);
+-	ASSERT((pages_mapped * PAGE_SIZE) < DMA_CHUNK_SIZE);
+-	ASSERT(pages_mapped < (BITS_PER_LONG - PAGE_SHIFT));
+-
+ 	mask = (u_long) -1L;
+  	mask >>= BITS_PER_LONG - pages_mapped;
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/pci.c CVS2_6_11_PA2/arch/parisc/kernel/pci.c
+--- LINUS_2_6_11/arch/parisc/kernel/pci.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/pci.c	2004-11-02 17:57:49.000000000 -0700
+@@ -202,7 +202,8 @@
+ pcibios_link_hba_resources( struct resource *hba_res, struct resource *r)
+ {
+ 	if (!r->parent) {
+-		printk(KERN_EMERG "PCI: Tell willy he's wrong\n");
++		printk(KERN_EMERG "PCI: resource not parented! [%lx-%lx]\n",
++				r->start, r->end);
+ 		r->parent = hba_res;
+ 
+ 		/* reverse link is harder *sigh*  */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/pdc_chassis.c CVS2_6_11_PA2/arch/parisc/kernel/pdc_chassis.c
+--- LINUS_2_6_11/arch/parisc/kernel/pdc_chassis.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/pdc_chassis.c	2005-02-04 12:34:34.000000000 -0700
+@@ -2,7 +2,7 @@
+  *    interfaces to log Chassis Codes via PDC (firmware)
+  *
+  *    Copyright (C) 2002 Laurent Canet <canetl at esiee.fr>
+- *    Copyright (C) 2002-2004 Thibaut VARENE <varenet at esiee.fr>
++ *    Copyright (C) 2002-2004 Thibaut VARENE <varenet at parisc-linux.org>
+  *
+  *    This program is free software; you can redistribute it and/or modify
+  *    it under the terms of the GNU General Public License as published by
+@@ -182,7 +182,7 @@
+ 
+ 		DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ 		if (is_pdc_pat()) {
+ 			switch(message) {
+ 				case PDC_CHASSIS_DIRECT_BSTART:
+@@ -238,7 +238,7 @@
+ 					retval = -1;
+ 			}
+ 		} else retval = -1;
+-#endif /* CONFIG_PARISC64 */
++#endif /* CONFIG_64BIT */
+ 	}	/* if (pdc_chassis_enabled) */
+ #endif /* CONFIG_PDC_CHASSIS */
+ 	return retval;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/perf.c CVS2_6_11_PA2/arch/parisc/kernel/perf.c
+--- LINUS_2_6_11/arch/parisc/kernel/perf.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/perf.c	2005-03-01 23:47:36.000000000 -0700
+@@ -42,7 +42,6 @@
+  *  on every box. 
+  */
+ 
+-#include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/proc_fs.h>
+ #include <linux/miscdevice.h>
+@@ -157,16 +156,16 @@
+  * this array.
+  */
+ static uint64_t perf_bitmasks[] = {
+-	0x0000000000000000,     /* first dbl word must be zero */
+-	0xfdffe00000000000,     /* RDR0 bitmask */
+-	0x003f000000000000,     /* RDR1 bitmask */
+-	0x00ffffffffffffff,     /* RDR20-RDR21 bitmask (152 bits) */
+-	0xffffffffffffffff,
+-	0xfffffffc00000000,
+-	0xffffffffffffffff,     /* RDR22-RDR23 bitmask (233 bits) */
+-	0xffffffffffffffff,
+-	0xfffffffffffffffc,
+-	0xff00000000000000
++	0x0000000000000000ul,     /* first dbl word must be zero */
++	0xfdffe00000000000ul,     /* RDR0 bitmask */
++	0x003f000000000000ul,     /* RDR1 bitmask */
++	0x00fffffffffffffful,     /* RDR20-RDR21 bitmask (152 bits) */
++	0xfffffffffffffffful,
++	0xfffffffc00000000ul,
++	0xfffffffffffffffful,     /* RDR22-RDR23 bitmask (233 bits) */
++	0xfffffffffffffffful,
++	0xfffffffffffffffcul,
++	0xff00000000000000ul
+ };
+ 
+ /*
+@@ -174,16 +173,16 @@
+  * somethings have changed slightly.
+  */
+ static uint64_t perf_bitmasks_piranha[] = {
+-	0x0000000000000000,     /* first dbl word must be zero */
+-	0xfdffe00000000000,     /* RDR0 bitmask */
+-	0x003f000000000000,     /* RDR1 bitmask */
+-	0x00ffffffffffffff,     /* RDR20-RDR21 bitmask (158 bits) */
+-	0xffffffffffffffff,
+-	0xfffffffc00000000,
+-	0xffffffffffffffff,     /* RDR22-RDR23 bitmask (210 bits) */
+-	0xffffffffffffffff,
+-	0xffffffffffffffff,
+-	0xfffc000000000000
++	0x0000000000000000ul,     /* first dbl word must be zero */
++	0xfdffe00000000000ul,     /* RDR0 bitmask */
++	0x003f000000000000ul,     /* RDR1 bitmask */
++	0x00fffffffffffffful,     /* RDR20-RDR21 bitmask (158 bits) */
++	0xfffffffffffffffful,
++	0xfffffffc00000000ul,
++	0xfffffffffffffffful,     /* RDR22-RDR23 bitmask (210 bits) */
++	0xfffffffffffffffful,
++	0xfffffffffffffffful,
++	0xfffc000000000000ul
+ };
+ 
+ static uint64_t *bitmask_array;   /* array of bitmasks to use */
+@@ -194,8 +193,8 @@
+ static int perf_config(uint32_t *image_ptr);
+ static int perf_release(struct inode *inode, struct file *file);
+ static int perf_open(struct inode *inode, struct file *file);
+-static ssize_t perf_read(struct file *file, char *buf, size_t cnt, loff_t *ppos);
+-static ssize_t perf_write(struct file *file, const char *buf, size_t count, 
++static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
++static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, 
+ 	loff_t *ppos);
+ static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+ 	unsigned long arg);
+@@ -287,7 +286,7 @@
+ /*
+  * Read does nothing for this driver
+  */
+-static ssize_t perf_read(struct file *file, char *buf, size_t cnt, loff_t *ppos)
++static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos)
+ {
+ 	return 0;
+ }
+@@ -299,7 +298,7 @@
+  * called on the processor that the download should happen
+  * on.
+  */
+-static ssize_t perf_write(struct file *file, const char *buf, size_t count, 
++static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, 
+ 	loff_t *ppos)
+ {
+ 	int err;
+@@ -460,7 +459,7 @@
+ 			}
+ 
+ 			/* copy out the Counters */
+-			if (copy_to_user((void *)arg, raddr, 
++			if (copy_to_user((void __user *)arg, raddr, 
+ 					sizeof (raddr)) != 0) {
+ 				return -EFAULT;
+ 			}
+@@ -607,7 +606,7 @@
+ 		 * all of dword 22 and 58 bits (plus 6 don't care bits) of
+ 		 * dword 23.
+ 		 */
+-		userbuf[21] &= 0xfffffffffffffc00;	/* 0 to last 10 bits */
++		userbuf[21] &= 0xfffffffffffffc00ul;	/* 0 to last 10 bits */
+ 		userbuf[22] = 0;
+ 		userbuf[23] = 0;
+ 
+@@ -802,8 +801,8 @@
+ 	proc_hpa = cpu_device->hpa;
+ 
+ 	/* Merge intrigue bits into Runway STATUS 0 */
+-	tmp64 = __raw_readq(proc_hpa + RUNWAY_STATUS) & 0xffecffffffffffff;
+-	__raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000), proc_hpa + RUNWAY_STATUS);
++	tmp64 = __raw_readq(proc_hpa + RUNWAY_STATUS) & 0xffecfffffffffffful;
++	__raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul), proc_hpa + RUNWAY_STATUS);
+ 	
+ 	/* Write RUNWAY DEBUG registers */
+ 	for (i = 0; i < 8; i++) {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/perf_asm.S CVS2_6_11_PA2/arch/parisc/kernel/perf_asm.S
+--- LINUS_2_6_11/arch/parisc/kernel/perf_asm.S	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/perf_asm.S	2005-03-01 23:47:36.000000000 -0700
+@@ -22,9 +22,9 @@
+ #include <linux/config.h>
+ #include <asm/assembly.h>
+ 
+-#ifdef __LP64__
++#ifdef CONFIG_64BIT
+ 	.level		2.0w
+-#endif /* __LP64__ */
++#endif /* CONFIG_64BIT */
+ 
+ #define MTDIAG_1(gr)    .word 0x14201840 + gr*0x10000
+ #define MTDIAG_2(gr)    .word 0x14401840 + gr*0x10000
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/process.c CVS2_6_11_PA2/arch/parisc/kernel/process.c
+--- LINUS_2_6_11/arch/parisc/kernel/process.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/process.c	2004-12-27 19:13:47.000000000 -0700
+@@ -54,7 +54,7 @@
+ #include <asm/uaccess.h>
+ #include <asm/unwind.h>
+ 
+-int hlt_counter;
++static int hlt_counter;
+ 
+ /*
+  * Power off function, if any
+@@ -251,7 +251,7 @@
+ sys_clone(unsigned long clone_flags, unsigned long usp,
+ 	  struct pt_regs *regs)
+ {
+-	int *user_tid = (int *)regs->gr[26];
++	int __user *user_tid = (int __user *)regs->gr[26];
+ 
+ 	/* usp must be word aligned.  This also prevents users from
+ 	 * passing in the value 1 (which is the signal for a special
+@@ -357,12 +357,12 @@
+ 	int error;
+ 	char *filename;
+ 
+-	filename = getname((char *) regs->gr[26]);
++	filename = getname((const char __user *) regs->gr[26]);
+ 	error = PTR_ERR(filename);
+ 	if (IS_ERR(filename))
+ 		goto out;
+-	error = do_execve(filename, (char **) regs->gr[25],
+-		(char **) regs->gr[24], regs);
++	error = do_execve(filename, (char __user **) regs->gr[25],
++		(char __user **) regs->gr[24], regs);
+ 	if (error == 0) {
+ 		task_lock(current);
+ 		current->ptrace &= ~PT_DTRACE;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/real2.S CVS2_6_11_PA2/arch/parisc/kernel/real2.S
+--- LINUS_2_6_11/arch/parisc/kernel/real2.S	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/real2.S	2005-01-07 14:14:33.000000000 -0700
+@@ -81,8 +81,7 @@
+ 	rsm	PSW_SM_W, %r0		/* go narrow */
+ #endif
+ 
+-	ldil	L%PA(ric_ret), %r2
+-	ldo	R%PA(ric_ret)(%r2), %r2
++	load32	PA(ric_ret), %r2
+ 	bv	0(%r31)
+ 	nop
+ ric_ret:
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/setup.c CVS2_6_11_PA2/arch/parisc/kernel/setup.c
+--- LINUS_2_6_11/arch/parisc/kernel/setup.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/setup.c	2004-12-31 10:26:35.000000000 -0700
+@@ -53,6 +53,15 @@
+ struct proc_dir_entry * proc_gsc_root = NULL;
+ struct proc_dir_entry * proc_mckinley_root = NULL;
+ 
++#if !defined(CONFIG_PA20) && (defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA))
++int parisc_bus_is_phys = 1;	/* Assume no IOMMU is present */
++EXPORT_SYMBOL(parisc_bus_is_phys);
++#endif
++
++/* This sets the vmerge boundary and size, it's here because it has to
++ * be available on all platforms (zero means no-virtual merging) */
++unsigned long parisc_vmerge_boundary = 0;
++unsigned long parisc_vmerge_max_size = 0;
+ 
+ void __init setup_cmdline(char **cmdline_p)
+ {
+@@ -112,6 +121,10 @@
+ 
+ void __init setup_arch(char **cmdline_p)
+ {
++#ifdef __LP64__
++	extern int parisc_narrow_firmware;
++#endif
++
+ 	init_per_cpu(smp_processor_id());	/* Set Modes & Enable FP */
+ 
+ #ifdef __LP64__
+@@ -123,7 +136,6 @@
+ 	pdc_console_init();
+ 
+ #ifdef __LP64__
+-	extern int parisc_narrow_firmware;
+ 	if(parisc_narrow_firmware) {
+ 		printk(KERN_INFO "Kernel is using PDC in 32-bit mode.\n");
+ 	}
+@@ -199,7 +211,7 @@
+ 	case pcxl2:
+ 		if (NULL == proc_gsc_root)
+ 		{
+-			proc_gsc_root = proc_mkdir("bus/gsc", 0);
++			proc_gsc_root = proc_mkdir("bus/gsc", NULL);
+ 		}
+ 		break;
+         case pcxt_:
+@@ -210,13 +222,13 @@
+         case pcxw2:
+                 if (NULL == proc_runway_root)
+                 {
+-                        proc_runway_root = proc_mkdir("bus/runway", 0);
++                        proc_runway_root = proc_mkdir("bus/runway", NULL);
+                 }
+                 break;
+ 	case mako:
+                 if (NULL == proc_mckinley_root)
+                 {
+-                        proc_mckinley_root = proc_mkdir("bus/mckinley", 0);
++                        proc_mckinley_root = proc_mkdir("bus/mckinley", NULL);
+                 }
+                 break;
+ 	default:
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/signal.c CVS2_6_11_PA2/arch/parisc/kernel/signal.c
+--- LINUS_2_6_11/arch/parisc/kernel/signal.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/signal.c	2004-12-02 00:56:50.000000000 -0700
+@@ -32,6 +32,7 @@
+ #include <asm/uaccess.h>
+ #include <asm/pgalloc.h>
+ #include <asm/cacheflush.h>
++#include <asm/offsets.h>
+ 
+ #ifdef CONFIG_COMPAT
+ #include <linux/compat.h>
+@@ -69,7 +70,7 @@
+ #endif
+ 
+ asmlinkage int
+-sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, struct pt_regs *regs)
++sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *regs)
+ {
+ 	sigset_t saveset, newset;
+ #ifdef __LP64__
+@@ -79,7 +80,7 @@
+ 		/* XXX: Don't preclude handling different sized sigset_t's.  */
+ 		if (sigsetsize != sizeof(compat_sigset_t))
+ 			return -EINVAL;
+-		if (copy_from_user(&newset32, (compat_sigset_t *)unewset, sizeof(newset32)))
++		if (copy_from_user(&newset32, (compat_sigset_t __user *)unewset, sizeof(newset32)))
+ 			return -EFAULT;
+ 		sigset_32to64(&newset,&newset32);
+ 		
+@@ -125,7 +126,7 @@
+ #define INSN_DIE_HORRIBLY 0x68000ccc /* stw %r0,0x666(%sr0,%r0) */
+ 
+ static long
+-restore_sigcontext(struct sigcontext *sc, struct pt_regs *regs)
++restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
+ {
+ 	long err = 0;
+ 
+@@ -143,14 +144,14 @@
+ void
+ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
+ {
+-	struct rt_sigframe *frame;
++	struct rt_sigframe __user *frame;
+ 	struct siginfo si;
+ 	sigset_t set;
+ 	unsigned long usp = (regs->gr[30] & ~(0x01UL));
+ 	unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
+ #ifdef __LP64__
+ 	compat_sigset_t compat_set;
+-	struct compat_rt_sigframe * compat_frame;
++	struct compat_rt_sigframe __user * compat_frame;
+ 	
+ 	if(personality(current->personality) == PER_LINUX32)
+ 		sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
+@@ -158,12 +159,12 @@
+ 
+ 
+ 	/* Unwind the user stack to get the rt_sigframe structure. */
+-	frame = (struct rt_sigframe *)
++	frame = (struct rt_sigframe __user *)
+ 		(usp - sigframe_size);
+ 	DBG(2,"sys_rt_sigreturn: frame is %p\n", frame);
+ 
+ #ifdef __LP64__
+-	compat_frame = (struct compat_rt_sigframe *)frame;
++	compat_frame = (struct compat_rt_sigframe __user *)frame;
+ 	
+ 	if(personality(current->personality) == PER_LINUX32){
+ 		DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
+@@ -238,7 +239,7 @@
+  * Set up a signal frame.
+  */
+ 
+-static inline void *
++static inline void __user *
+ get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
+ {
+ 	/*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
+@@ -251,11 +252,11 @@
+ 		sp = current->sas_ss_sp; /* Stacks grow up! */
+ 
+ 	DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
+-	return (void *) sp; /* Stacks grow up.  Fun. */
++	return (void __user *) sp; /* Stacks grow up.  Fun. */
+ }
+ 
+ static long
+-setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs, int in_syscall)
++setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
+ 		 
+ {
+ 	unsigned long flags = 0;
+@@ -292,14 +293,14 @@
+ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+ 	       sigset_t *set, struct pt_regs *regs, int in_syscall)
+ {
+-	struct rt_sigframe *frame;
++	struct rt_sigframe __user *frame;
+ 	unsigned long rp, usp;
+ 	unsigned long haddr, sigframe_size;
+ 	struct siginfo si;
+ 	int err = 0;
+ #ifdef __LP64__
+ 	compat_int_t compat_val;
+-	struct compat_rt_sigframe * compat_frame;
++	struct compat_rt_sigframe __user * compat_frame;
+ 	compat_sigset_t compat_set;
+ #endif
+ 	
+@@ -313,7 +314,7 @@
+ 	
+ #ifdef __LP64__
+ 
+-	compat_frame = (struct compat_rt_sigframe *)frame;
++	compat_frame = (struct compat_rt_sigframe __user *)frame;
+ 	
+ 	if(personality(current->personality) == PER_LINUX32) {
+ 		DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
+@@ -396,7 +397,7 @@
+ #endif
+ 		if (haddr & PA_PLABEL_FDESC) {
+ 			Elf32_Fdesc fdesc;
+-			Elf32_Fdesc *ufdesc = (Elf32_Fdesc *)A(haddr & ~3);
++			Elf32_Fdesc __user *ufdesc = (Elf32_Fdesc __user *)A(haddr & ~3);
+ 
+ 			err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
+ 
+@@ -409,7 +410,7 @@
+ #ifdef __LP64__
+ 	} else {
+ 		Elf64_Fdesc fdesc;
+-		Elf64_Fdesc *ufdesc = (Elf64_Fdesc *)A(haddr & ~3);
++		Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3);
+ 		
+ 		err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
+ 		
+@@ -443,6 +444,18 @@
+ 			psw |= PSW_W;
+ #endif
+ 
++		/* If we are singlestepping, arrange a trap to be delivered
++		   when we return to userspace. Note the semantics -- we
++		   should trap before the first insn in the handler is
++		   executed. Ref:
++			http://sources.redhat.com/ml/gdb/2004-11/msg00245.html
++		 */
++		if (pa_psw(current)->r) {
++			pa_psw(current)->r = 0;
++			psw |= PSW_R;
++			mtctl(-1, 0);
++		}
++
+ 		regs->gr[0] = psw;
+ 		regs->iaoq[0] = haddr | 3;
+ 		regs->iaoq[1] = regs->iaoq[0] + 4;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/signal32.c CVS2_6_11_PA2/arch/parisc/kernel/signal32.c
+--- LINUS_2_6_11/arch/parisc/kernel/signal32.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/signal32.c	2005-03-01 23:47:36.000000000 -0700
+@@ -20,7 +20,6 @@
+  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+ 
+-#include <linux/config.h>
+ #include <linux/compat.h>
+ #include <linux/slab.h>
+ #include <linux/module.h>
+@@ -65,7 +64,7 @@
+ }
+ 
+ static int
+-put_sigset32(compat_sigset_t *up, sigset_t *set, size_t sz)
++put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
+ {
+ 	compat_sigset_t s;
+ 
+@@ -76,7 +75,7 @@
+ }
+ 
+ static int
+-get_sigset32(compat_sigset_t *up, sigset_t *set, size_t sz)
++get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz)
+ {
+ 	compat_sigset_t s;
+ 	int r;
+@@ -90,7 +89,7 @@
+ 	return r;
+ }
+ 
+-int sys32_rt_sigprocmask(int how, compat_sigset_t *set, compat_sigset_t *oset,
++int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t __user *oset,
+ 				    unsigned int sigsetsize)
+ {
+ 	sigset_t old_set, new_set;
+@@ -99,8 +98,8 @@
+ 	if (set && get_sigset32(set, &new_set, sigsetsize))
+ 		return -EFAULT;
+ 	
+-	KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? &new_set : NULL,
+-				 oset ? &old_set : NULL, sigsetsize);
++	KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL,
++				 oset ? (sigset_t __user *)&old_set : NULL, sigsetsize);
+ 
+ 	if (!ret && oset && put_sigset32(oset, &old_set, sigsetsize))
+ 		return -EFAULT;
+@@ -109,12 +108,12 @@
+ }
+ 
+ 
+-int sys32_rt_sigpending(compat_sigset_t *uset, unsigned int sigsetsize)
++int sys32_rt_sigpending(compat_sigset_t __user *uset, unsigned int sigsetsize)
+ {
+ 	int ret;
+ 	sigset_t set;
+ 
+-	KERNEL_SYSCALL(ret, sys_rt_sigpending, &set, sigsetsize);
++	KERNEL_SYSCALL(ret, sys_rt_sigpending, (sigset_t __user *)&set, sigsetsize);
+ 
+ 	if (!ret && put_sigset32(uset, &set, sigsetsize))
+ 		return -EFAULT;
+@@ -123,7 +122,7 @@
+ }
+ 
+ long
+-sys32_rt_sigaction(int sig, const struct sigaction32 *act, struct sigaction32 *oact,
++sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigaction32 __user *oact,
+                  size_t sigsetsize)
+ {
+ 	struct k_sigaction32 new_sa32, old_sa32;
+@@ -151,7 +150,7 @@
+ }
+ 
+ int 
+-do_sigaltstack32 (const compat_stack_t *uss32, compat_stack_t *uoss32, unsigned long sp)
++do_sigaltstack32 (const compat_stack_t __user *uss32, compat_stack_t __user *uoss32, unsigned long sp)
+ {
+ 	compat_stack_t ss32, oss32;
+ 	stack_t ss, oss;
+@@ -162,7 +161,7 @@
+ 		if (copy_from_user(&ss32, uss32, sizeof ss32))
+ 			return -EFAULT;
+ 
+-		ss.ss_sp = (void *)(unsigned long)ss32.ss_sp;
++		ss.ss_sp = (void __user *)(unsigned long)ss32.ss_sp;
+ 		ss.ss_flags = ss32.ss_flags;
+ 		ss.ss_size = ss32.ss_size;
+ 
+@@ -172,7 +171,7 @@
+ 	if (uoss32)
+ 		ossp = &oss;
+ 
+-	KERNEL_SYSCALL(ret, do_sigaltstack, ssp, ossp, sp);
++	KERNEL_SYSCALL(ret, do_sigaltstack, (const stack_t __user *)ssp, (stack_t __user *)ossp, sp);
+ 
+ 	if (!ret && uoss32) {
+ 		oss32.ss_sp = (unsigned int)(unsigned long)oss.ss_sp;
+@@ -186,7 +185,7 @@
+ }
+ 
+ long
+-restore_sigcontext32(struct compat_sigcontext *sc, struct compat_regfile * rf,
++restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf,
+ 		struct pt_regs *regs)
+ {
+ 	long err = 0;
+@@ -265,7 +264,7 @@
+  * truncate for a 32-bit userspace.
+  */
+ long
+-setup_sigcontext32(struct compat_sigcontext *sc, struct compat_regfile * rf, 
++setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, 
+ 		struct pt_regs *regs, int in_syscall)		 
+ {
+ 	compat_int_t flags = 0;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/signal32.h CVS2_6_11_PA2/arch/parisc/kernel/signal32.h
+--- LINUS_2_6_11/arch/parisc/kernel/signal32.h	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/signal32.h	2004-10-04 13:12:49.000000000 -0600
+@@ -31,13 +31,13 @@
+ 
+ void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
+ void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
+-int do_sigaltstack32 (const compat_stack_t *uss32, 
+-		compat_stack_t *uoss32, unsigned long sp);
+-long restore_sigcontext32(struct compat_sigcontext *sc, 
+-		struct compat_regfile *rf,
++int do_sigaltstack32 (const compat_stack_t __user *uss32, 
++		compat_stack_t __user *uoss32, unsigned long sp);
++long restore_sigcontext32(struct compat_sigcontext __user *sc, 
++		struct compat_regfile __user *rf,
+ 		struct pt_regs *regs);
+-long setup_sigcontext32(struct compat_sigcontext *sc, 
+-		struct compat_regfile *rf,
++long setup_sigcontext32(struct compat_sigcontext __user *sc, 
++		struct compat_regfile __user *rf,
+ 		struct pt_regs *regs, int in_syscall);
+ 
+ #endif
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/sys_parisc.c CVS2_6_11_PA2/arch/parisc/kernel/sys_parisc.c
+--- LINUS_2_6_11/arch/parisc/kernel/sys_parisc.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/sys_parisc.c	2005-02-04 12:34:34.000000000 -0700
+@@ -32,7 +32,7 @@
+ #include <linux/smp_lock.h>
+ #include <linux/syscalls.h>
+ 
+-int sys_pipe(int *fildes)
++int sys_pipe(int __user *fildes)
+ {
+ 	int fd[2];
+ 	int error;
+@@ -161,7 +161,7 @@
+ 	}
+ }
+ 
+-long sys_shmat_wrapper(int shmid, char *shmaddr, int shmflag)
++long sys_shmat_wrapper(int shmid, char __user *shmaddr, int shmflag)
+ {
+ 	unsigned long raddr;
+ 	int r;
+@@ -174,8 +174,8 @@
+ 
+ /* Fucking broken ABI */
+ 
+-#ifdef CONFIG_PARISC64
+-asmlinkage long parisc_truncate64(const char * path,
++#ifdef CONFIG_64BIT
++asmlinkage long parisc_truncate64(const char __user * path,
+ 					unsigned int high, unsigned int low)
+ {
+ 	return sys_truncate(path, (long)high << 32 | low);
+@@ -189,7 +189,7 @@
+ 
+ /* stubs for the benefit of the syscall_table since truncate64 and truncate 
+  * are identical on LP64 */
+-asmlinkage long sys_truncate64(const char * path, unsigned long length)
++asmlinkage long sys_truncate64(const char __user * path, unsigned long length)
+ {
+ 	return sys_truncate(path, length);
+ }
+@@ -203,7 +203,7 @@
+ }
+ #else
+ 
+-asmlinkage long parisc_truncate64(const char * path,
++asmlinkage long parisc_truncate64(const char __user * path,
+ 					unsigned int high, unsigned int low)
+ {
+ 	return sys_truncate64(path, (loff_t)high << 32 | low);
+@@ -216,13 +216,13 @@
+ }
+ #endif
+ 
+-asmlinkage ssize_t parisc_pread64(unsigned int fd, char *buf, size_t count,
++asmlinkage ssize_t parisc_pread64(unsigned int fd, char __user *buf, size_t count,
+ 					unsigned int high, unsigned int low)
+ {
+ 	return sys_pread64(fd, buf, count, (loff_t)high << 32 | low);
+ }
+ 
+-asmlinkage ssize_t parisc_pwrite64(unsigned int fd, const char *buf,
++asmlinkage ssize_t parisc_pwrite64(unsigned int fd, const char __user *buf,
+ 			size_t count, unsigned int high, unsigned int low)
+ {
+ 	return sys_pwrite64(fd, buf, count, (loff_t)high << 32 | low);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/sys_parisc32.c CVS2_6_11_PA2/arch/parisc/kernel/sys_parisc32.c
+--- LINUS_2_6_11/arch/parisc/kernel/sys_parisc32.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/sys_parisc32.c	2005-02-03 04:44:18.000000000 -0700
+@@ -74,7 +74,7 @@
+ 	char *filename;
+ 
+ 	DBG(("sys32_execve(%p) r26 = 0x%lx\n", regs, regs->gr[26]));
+-	filename = getname((char *) regs->gr[26]);
++	filename = getname((const char __user *) regs->gr[26]);
+ 	error = PTR_ERR(filename);
+ 	if (IS_ERR(filename))
+ 		goto out;
+@@ -111,13 +111,13 @@
+ 	u32 __unused[4];
+ };
+ 
+-asmlinkage long sys32_sysctl(struct __sysctl_args32 *args)
++asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
+ {
+ 	struct __sysctl_args32 tmp;
+ 	int error;
+ 	unsigned int oldlen32;
+ 	size_t oldlen, *oldlenp = NULL;
+-	unsigned long addr = (((long)&args->__unused[0]) + 7) & ~7;
++	unsigned long addr = (((long __force)&args->__unused[0]) + 7) & ~7;
+ 	extern int do_sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
+ 	       void *newval, size_t newlen);
+ 
+@@ -159,7 +159,7 @@
+ 					error = -EFAULT;
+ 			}
+ 		}
+-		if (copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)))
++		if (copy_to_user(&args->__unused[0], tmp.__unused, sizeof(tmp.__unused)))
+ 			error = -EFAULT;
+ 	}
+ 	return error;
+@@ -168,19 +168,19 @@
+ #endif /* CONFIG_SYSCTL */
+ 
+ asmlinkage long sys32_sched_rr_get_interval(pid_t pid,
+-	struct compat_timespec *interval)
++	struct compat_timespec __user *interval)
+ {
+ 	struct timespec t;
+ 	int ret;
+-	
+-	KERNEL_SYSCALL(ret, sys_sched_rr_get_interval, pid, &t);
++
++	KERNEL_SYSCALL(ret, sys_sched_rr_get_interval, pid, (struct timespec __user *)&t);
+ 	if (put_compat_timespec(&t, interval))
+ 		return -EFAULT;
+ 	return ret;
+ }
+ 
+ static int
+-put_compat_timeval(struct compat_timeval *u, struct timeval *t)
++put_compat_timeval(struct compat_timeval __user *u, struct timeval *t)
+ {
+ 	struct compat_timeval t32;
+ 	t32.tv_sec = t->tv_sec;
+@@ -188,7 +188,7 @@
+ 	return copy_to_user(u, &t32, sizeof t32);
+ }
+ 
+-static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
++static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i)
+ {
+ 	long usec;
+ 
+@@ -201,7 +201,7 @@
+ }
+ 
+ asmlinkage int
+-sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz)
++sys32_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
+ {
+     extern void do_gettimeofday(struct timeval *tv);
+ 
+@@ -220,7 +220,7 @@
+ }
+ 
+ asmlinkage 
+-int sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz)
++int sys32_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
+ {
+ 	struct timespec kts;
+ 	struct timezone ktz;
+@@ -237,7 +237,7 @@
+ 	return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
+ }
+ 
+-int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf)
++int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
+ {
+ 	int err;
+ 
+@@ -294,24 +294,24 @@
+ };
+ 
+ struct getdents32_callback {
+-	struct linux32_dirent * current_dir;
+-	struct linux32_dirent * previous;
++	struct linux32_dirent __user * current_dir;
++	struct linux32_dirent __user * previous;
+ 	int count;
+ 	int error;
+ };
+ 
+ struct readdir32_callback {
+-	struct old_linux32_dirent * dirent;
++	struct old_linux32_dirent __user * dirent;
+ 	int count;
+ };
+ 
+ #define ROUND_UP(x,a)	((__typeof__(x))(((unsigned long)(x) + ((a) - 1)) & ~((a) - 1)))
+-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
++#define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
+ static int
+ filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino,
+ 	   unsigned int d_type)
+ {
+-	struct linux32_dirent * dirent;
++	struct linux32_dirent __user * dirent;
+ 	struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
+ 	int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1, 4);
+ 
+@@ -327,17 +327,17 @@
+ 	put_user(reclen, &dirent->d_reclen);
+ 	copy_to_user(dirent->d_name, name, namlen);
+ 	put_user(0, dirent->d_name + namlen);
+-	dirent = (struct linux32_dirent *)((char *)dirent + reclen);
++	dirent = ((void __user *)dirent) + reclen;
+ 	buf->current_dir = dirent;
+ 	buf->count -= reclen;
+ 	return 0;
+ }
+ 
+ asmlinkage long
+-sys32_getdents (unsigned int fd, void * dirent, unsigned int count)
++sys32_getdents (unsigned int fd, void __user * dirent, unsigned int count)
+ {
+ 	struct file * file;
+-	struct linux32_dirent * lastdirent;
++	struct linux32_dirent __user * lastdirent;
+ 	struct getdents32_callback buf;
+ 	int error;
+ 
+@@ -346,7 +346,7 @@
+ 	if (!file)
+ 		goto out;
+ 
+-	buf.current_dir = (struct linux32_dirent *) dirent;
++	buf.current_dir = (struct linux32_dirent __user *) dirent;
+ 	buf.previous = NULL;
+ 	buf.count = count;
+ 	buf.error = 0;
+@@ -372,7 +372,7 @@
+ 	      unsigned int d_type)
+ {
+ 	struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
+-	struct old_linux32_dirent * dirent;
++	struct old_linux32_dirent __user * dirent;
+ 
+ 	if (buf->count)
+ 		return -EINVAL;
+@@ -387,7 +387,7 @@
+ }
+ 
+ asmlinkage long
+-sys32_readdir (unsigned int fd, void * dirent, unsigned int count)
++sys32_readdir (unsigned int fd, void __user * dirent, unsigned int count)
+ {
+ 	int error;
+ 	struct file * file;
+@@ -477,7 +477,7 @@
+ };
+ 
+ asmlinkage long sys32_msgsnd(int msqid,
+-				struct msgbuf32 *umsgp32,
++				struct msgbuf32 __user *umsgp32,
+ 				size_t msgsz, int msgflg)
+ {
+ 	struct msgbuf *mb;
+@@ -494,14 +494,14 @@
+ 	if (err)
+ 		err = -EFAULT;
+ 	else
+-		KERNEL_SYSCALL(err, sys_msgsnd, msqid, mb, msgsz, msgflg);
++		KERNEL_SYSCALL(err, sys_msgsnd, msqid, (struct msgbuf __user *)mb, msgsz, msgflg);
+ 
+ 	kfree(mb);
+ 	return err;
+ }
+ 
+ asmlinkage long sys32_msgrcv(int msqid,
+-				struct msgbuf32 *umsgp32,
++				struct msgbuf32 __user *umsgp32,
+ 				size_t msgsz, long msgtyp, int msgflg)
+ {
+ 	struct msgbuf *mb;
+@@ -511,7 +511,7 @@
+ 	if ((mb = kmalloc(msgsz + sizeof *mb + 4, GFP_KERNEL)) == NULL)
+ 		return -ENOMEM;
+ 
+-	KERNEL_SYSCALL(err, sys_msgrcv, msqid, mb, msgsz, msgtyp, msgflg);
++	KERNEL_SYSCALL(err, sys_msgrcv, msqid, (struct msgbuf __user *)mb, msgsz, msgtyp, msgflg);
+ 
+ 	if (err >= 0) {
+ 		len = err;
+@@ -528,7 +528,7 @@
+ 	return err;
+ }
+ 
+-asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, s32 count)
++asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, s32 count)
+ {
+         mm_segment_t old_fs = get_fs();
+         int ret;
+@@ -538,7 +538,7 @@
+                 return -EFAULT;
+ 
+         set_fs(KERNEL_DS);
+-        ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
++        ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL, count);
+         set_fs(old_fs);
+ 
+         if (offset && put_user(of, offset))
+@@ -547,9 +547,7 @@
+         return ret;
+ }
+ 
+-typedef long __kernel_loff_t32;		/* move this to asm/posix_types.h? */
+-
+-asmlinkage int sys32_sendfile64(int out_fd, int in_fd, __kernel_loff_t32 *offset, s32 count)
++asmlinkage int sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset, s32 count)
+ {
+ 	mm_segment_t old_fs = get_fs();
+ 	int ret;
+@@ -559,7 +557,7 @@
+ 		return -EFAULT;
+ 		
+ 	set_fs(KERNEL_DS);
+-	ret = sys_sendfile64(out_fd, in_fd, offset ? &lof : NULL, count);
++	ret = sys_sendfile64(out_fd, in_fd, offset ? (loff_t __user *)&lof : NULL, count);
+ 	set_fs(old_fs);
+ 	
+ 	if (offset && put_user(lof, offset))
+@@ -598,7 +596,7 @@
+ 	int  :32; int  :32; int  :32; int  :32;
+ };
+ 
+-asmlinkage long sys32_adjtimex(struct timex32 *txc_p32)
++asmlinkage long sys32_adjtimex(struct timex32 __user *txc_p32)
+ {
+ 	struct timex txc;
+ 	struct timex32 t32;
+@@ -647,7 +645,7 @@
+  * damage, I decided to just duplicate the code from sys_sysinfo here.
+  */
+ 
+-asmlinkage int sys32_sysinfo(struct sysinfo32 *info)
++asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info)
+ {
+ 	struct sysinfo val;
+ 	int err;
+@@ -714,7 +712,7 @@
+ 	return sys_semctl (semid, semnum, cmd, arg);
+ }
+ 
+-long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char *buf,
++long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char __user *buf,
+ 			  size_t len)
+ {
+ 	return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low,
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/traps.c CVS2_6_11_PA2/arch/parisc/kernel/traps.c
+--- LINUS_2_6_11/arch/parisc/kernel/traps.c	2005-03-02 04:19:00.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/traps.c	2005-03-01 18:20:47.000000000 -0700
+@@ -163,13 +163,20 @@
+ 	struct unwind_frame_info info;
+ 
+ 	if (!task) {
+-		unsigned long sp, ip, rp;
++		unsigned long sp;
++		struct pt_regs *r;
+ 
+ HERE:
+ 		asm volatile ("copy %%r30, %0" : "=r"(sp));
+-		ip = (unsigned long)&&HERE;
+-		rp = (unsigned long)__builtin_return_address(0);
+-		unwind_frame_init(&info, current, sp, ip, rp);
++		r = (struct pt_regs *)kmalloc(sizeof(struct pt_regs), GFP_KERNEL);
++		if (!r)
++			return;
++		memset(r, 0, sizeof(struct pt_regs));
++		r->iaoq[0] = (unsigned long)&&HERE;
++		r->gr[2] = (unsigned long)__builtin_return_address(0);
++		r->gr[30] = sp;
++		unwind_frame_init(&info, current, r);
++		kfree(r);
+ 	} else {
+ 		unwind_frame_init_from_blocked_task(&info, task);
+ 	}
+@@ -242,7 +249,7 @@
+ 	struct siginfo si;
+ 
+ 	si.si_code = wot;
+-	si.si_addr = (void *) (regs->iaoq[0] & ~3);
++	si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
+ 	si.si_signo = SIGTRAP;
+ 	si.si_errno = 0;
+ 	force_sig_info(SIGTRAP, &si, current);
+@@ -263,7 +270,7 @@
+ 		show_regs(regs);
+ #endif
+ 		si.si_code = TRAP_BRKPT;
+-		si.si_addr = (void *) (regs->iaoq[0] & ~3);
++		si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
+ 		si.si_signo = SIGTRAP;
+ 		force_sig_info(SIGTRAP, &si, current);
+ 		break;
+@@ -281,7 +288,7 @@
+ #endif
+ 		si.si_signo = SIGTRAP;
+ 		si.si_code = TRAP_BRKPT;
+-		si.si_addr = (void *) (regs->iaoq[0] & ~3);
++		si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
+ 		force_sig_info(SIGTRAP, &si, current);
+ 		return;
+ 	}
+@@ -416,7 +423,7 @@
+ 	{
+ 		/* show_stack(NULL, (unsigned long *)regs->gr[30]); */
+ 		struct unwind_frame_info info;
+-		unwind_frame_init(&info, current, regs->gr[30], regs->iaoq[0], regs->gr[2]);
++		unwind_frame_init(&info, current, regs);
+ 		do_show_stack(&info);
+ 	}
+ 
+@@ -569,7 +576,7 @@
+ 	give_sigill:
+ 		si.si_signo = SIGILL;
+ 		si.si_errno = 0;
+-		si.si_addr = (void *) regs->iaoq[0];
++		si.si_addr = (void __user *) regs->iaoq[0];
+ 		force_sig_info(SIGILL, &si, current);
+ 		return;
+ 
+@@ -577,7 +584,7 @@
+ 		/* Overflow Trap, let the userland signal handler do the cleanup */
+ 		si.si_signo = SIGFPE;
+ 		si.si_code = FPE_INTOVF;
+-		si.si_addr = (void *) regs->iaoq[0];
++		si.si_addr = (void __user *) regs->iaoq[0];
+ 		force_sig_info(SIGFPE, &si, current);
+ 		return;
+ 		
+@@ -699,9 +706,9 @@
+ 		si.si_signo = SIGSEGV;
+ 		si.si_errno = 0;
+ 		if (code == 7)
+-		    si.si_addr = (void *) regs->iaoq[0];
++		    si.si_addr = (void __user *) regs->iaoq[0];
+ 		else
+-		    si.si_addr = (void *) regs->ior;
++		    si.si_addr = (void __user *) regs->ior;
+ 		force_sig_info(SIGSEGV, &si, current);
+ 		return;
+ 
+@@ -721,7 +728,7 @@
+ 			si.si_signo = SIGBUS;
+ 			si.si_code = BUS_OBJERR;
+ 			si.si_errno = 0;
+-			si.si_addr = (void *) regs->ior;
++			si.si_addr = (void __user *) regs->ior;
+ 			force_sig_info(SIGBUS, &si, current);
+ 			return;
+ 		}
+@@ -732,7 +739,7 @@
+ 	}
+ 
+ 	if (user_mode(regs)) {
+-	    if ((fault_space>>SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) {
++	    if ((fault_space >> SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) {
+ #ifdef PRINT_USER_FAULTS
+ 		if (fault_space == 0)
+ 			printk(KERN_DEBUG "User Fault on Kernel Space ");
+@@ -745,7 +752,7 @@
+ 		si.si_signo = SIGSEGV;
+ 		si.si_errno = 0;
+ 		si.si_code = SEGV_MAPERR;
+-		si.si_addr = (void *) regs->ior;
++		si.si_addr = (void __user *) regs->ior;
+ 		force_sig_info(SIGSEGV, &si, current);
+ 		return;
+ 	    }
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/unaligned.c CVS2_6_11_PA2/arch/parisc/kernel/unaligned.c
+--- LINUS_2_6_11/arch/parisc/kernel/unaligned.c	2005-03-02 04:19:01.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/unaligned.c	2004-10-04 13:12:49.000000000 -0600
+@@ -744,7 +744,7 @@
+ 			si.si_signo = SIGSEGV;
+ 			si.si_errno = 0;
+ 			si.si_code = SEGV_MAPERR;
+-			si.si_addr = (void *)regs->ior;
++			si.si_addr = (void __user *)regs->ior;
+ 			force_sig_info(SIGSEGV, &si, current);
+ 		}
+ 		else
+@@ -754,7 +754,7 @@
+ 			si.si_signo = SIGBUS;
+ 			si.si_errno = 0;
+ 			si.si_code = BUS_ADRALN;
+-			si.si_addr = (void *)regs->ior;
++			si.si_addr = (void __user *)regs->ior;
+ 			force_sig_info(SIGBUS, &si, current);
+ 		}
+ 		
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/unwind.c CVS2_6_11_PA2/arch/parisc/kernel/unwind.c
+--- LINUS_2_6_11/arch/parisc/kernel/unwind.c	2005-03-02 04:19:01.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/unwind.c	2005-03-01 18:20:47.000000000 -0700
+@@ -36,8 +36,7 @@
+  * possible (before the slab allocator is initialized)
+  */
+ static struct unwind_table kernel_unwind_table;
+-static struct unwind_table *unwind_tables, *unwind_tables_end;
+-
++static LIST_HEAD(unwind_tables);
+ 
+ static inline const struct unwind_table_entry *
+ find_unwind_entry_in_table(const struct unwind_table *table, unsigned long addr)
+@@ -65,14 +64,14 @@
+ static const struct unwind_table_entry *
+ find_unwind_entry(unsigned long addr)
+ {
+-	struct unwind_table *table = unwind_tables;
++	struct unwind_table *table;
+ 	const struct unwind_table_entry *e = NULL;
+ 
+ 	if (addr >= kernel_unwind_table.start && 
+ 	    addr <= kernel_unwind_table.end)
+ 		e = find_unwind_entry_in_table(&kernel_unwind_table, addr);
+-	else
+-		for (; table; table = table->next) {
++	else 
++		list_for_each_entry(table, &unwind_tables, list) {
+ 			if (addr >= table->start && 
+ 			    addr <= table->end)
+ 				e = find_unwind_entry_in_table(table, addr);
+@@ -99,7 +98,7 @@
+ 	table->end = base_addr + end->region_end;
+ 	table->table = (struct unwind_table_entry *)table_start;
+ 	table->length = end - start + 1;
+-	table->next = NULL;
++	INIT_LIST_HEAD(&table->list);
+ 
+ 	for (; start <= end; start++) {
+ 		if (start < end && 
+@@ -112,33 +111,60 @@
+ 	}
+ }
+ 
+-void *
++static void
++unwind_table_sort(struct unwind_table_entry *start,
++		  struct unwind_table_entry *finish)
++{
++	struct unwind_table_entry el, *p, *q;
++
++	for (p = start + 1; p < finish; ++p) {
++		if (p[0].region_start < p[-1].region_start) {
++			el = *p;
++			q = p;
++			do {
++				q[0] = q[-1];
++				--q;
++			} while (q > start && 
++				 el.region_start < q[-1].region_start);
++			*q = el;
++		}
++	}
++}
++
++struct unwind_table *
+ unwind_table_add(const char *name, unsigned long base_addr, 
+ 		 unsigned long gp,
+                  void *start, void *end)
+ {
+ 	struct unwind_table *table;
+ 	unsigned long flags;
++	struct unwind_table_entry *s = (struct unwind_table_entry *)start;
++	struct unwind_table_entry *e = (struct unwind_table_entry *)end;
++
++	unwind_table_sort(s, e);
+ 
+ 	table = kmalloc(sizeof(struct unwind_table), GFP_USER);
+ 	if (table == NULL)
+ 		return NULL;
+ 	unwind_table_init(table, name, base_addr, gp, start, end);
+ 	spin_lock_irqsave(&unwind_lock, flags);
+-	if (unwind_tables)
+-	{
+-		unwind_tables_end->next = table;
+-		unwind_tables_end = table;
+-	}
+-	else
+-	{
+-		unwind_tables = unwind_tables_end = table;
+-	}
++	list_add_tail(&table->list, &unwind_tables);
+ 	spin_unlock_irqrestore(&unwind_lock, flags);
+ 
+ 	return table;
+ }
+ 
++void unwind_table_remove(struct unwind_table *table)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&unwind_lock, flags);
++	list_del(&table->list);
++	spin_unlock_irqrestore(&unwind_lock, flags);
++
++	kfree(table);
++}
++
+ /* Called from setup_arch to import the kernel unwind info */
+ static int unwind_init(void)
+ {
+@@ -148,6 +174,8 @@
+ 	start = (long)&__start___unwind[0];
+ 	stop = (long)&__stop___unwind[0];
+ 
++	spin_lock_init(&unwind_lock);
++
+ 	printk("unwind_init: start = 0x%lx, end = 0x%lx, entries = %lu\n", 
+ 	    start, stop,
+ 	    (stop - start) / sizeof(struct unwind_table_entry));
+@@ -239,9 +267,9 @@
+ 		    info->prev_sp, info->prev_ip);
+ 	} else {
+ 		dbg("e->start = 0x%x, e->end = 0x%x, Save_SP = %d, "
+-		    "Save_RP = %d size = %u\n", e->region_start, 
+-		    e->region_end, e->Save_SP, e->Save_RP, 
+-		    e->Total_frame_size);
++		    "Save_RP = %d, Millicode = %d size = %u\n", 
++		    e->region_start, e->region_end, e->Save_SP, e->Save_RP, 
++		    e->Millicode, e->Total_frame_size);
+ 
+ 		looking_for_rp = e->Save_RP;
+ 
+@@ -284,7 +312,9 @@
+ 		}
+ 
+ 		info->prev_sp = info->sp - frame_size;
+-		if (rpoffset)
++		if (e->Millicode)
++			info->rp = info->r31;
++		else if (rpoffset)
+ 			info->rp = *(unsigned long *)(info->prev_sp - rpoffset);
+ 		info->prev_ip = info->rp;
+ 		info->rp = 0;
+@@ -296,13 +326,14 @@
+ }
+ 
+ void unwind_frame_init(struct unwind_frame_info *info, struct task_struct *t, 
+-		       unsigned long sp, unsigned long ip, unsigned long rp)
++		       struct pt_regs *regs)
+ {
+ 	memset(info, 0, sizeof(struct unwind_frame_info));
+ 	info->t = t;
+-	info->sp = sp;
+-	info->ip = ip;
+-	info->rp = rp;
++	info->sp = regs->gr[30];
++	info->ip = regs->iaoq[0];
++	info->rp = regs->gr[2];
++	info->r31 = regs->gr[31];
+ 
+ 	dbg("(%d) Start unwind from sp=%08lx ip=%08lx\n", 
+ 	    t ? (int)t->pid : -1, info->sp, info->ip);
+@@ -310,14 +341,22 @@
+ 
+ void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct task_struct *t)
+ {
+-	struct pt_regs *regs = &t->thread.regs;
+-	unwind_frame_init(info, t, regs->ksp, regs->kpc, 0);
++	struct pt_regs *r = &t->thread.regs;
++	struct pt_regs *r2;
++
++	r2 = (struct pt_regs *)kmalloc(sizeof(struct pt_regs), GFP_KERNEL);
++	if (!r2)
++		return;
++	*r2 = *r;
++	r2->gr[30] = r->ksp;
++	r2->iaoq[0] = r->kpc;
++	unwind_frame_init(info, t, r2);
++	kfree(r2);
+ }
+ 
+ void unwind_frame_init_running(struct unwind_frame_info *info, struct pt_regs *regs)
+ {
+-	unwind_frame_init(info, current, regs->gr[30], regs->iaoq[0],
+-			  regs->gr[2]);
++	unwind_frame_init(info, current, regs);
+ }
+ 
+ int unwind_once(struct unwind_frame_info *next_frame)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/kernel/vmlinux.lds.S CVS2_6_11_PA2/arch/parisc/kernel/vmlinux.lds.S
+--- LINUS_2_6_11/arch/parisc/kernel/vmlinux.lds.S	2005-03-02 04:19:01.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/kernel/vmlinux.lds.S	2005-02-04 12:34:34.000000000 -0700
+@@ -29,7 +29,7 @@
+ #include <asm/page.h>
+ 	
+ /* ld script to make hppa Linux kernel */
+-#ifndef CONFIG_PARISC64
++#ifndef CONFIG_64BIT
+ OUTPUT_FORMAT("elf32-hppa-linux")
+ OUTPUT_ARCH(hppa)
+ #else
+@@ -38,7 +38,7 @@
+ #endif
+ 
+ ENTRY(_stext)
+-#ifndef CONFIG_PARISC64
++#ifndef CONFIG_64BIT
+ jiffies = jiffies_64 + 4;
+ #else
+ jiffies = jiffies_64;
+@@ -84,6 +84,9 @@
+  
+   .data : {			/* Data */
+ 	*(.data)
++	*(.data.vm0.pmd)
++	*(.data.vm0.pgd)
++	*(.data.vm0.pte)
+ 	CONSTRUCTORS
+ 	}
+ 
+@@ -112,7 +115,7 @@
+   . = ALIGN(16384);	
+   init_istack : { *(init_istack) }
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+   . = ALIGN(16);               /* Linkage tables */
+   .opd : { *(.opd) } PROVIDE (__gp = .); 
+   .plt : { *(.plt) } 
+@@ -180,7 +183,7 @@
+   /* Sections to be discarded */
+   /DISCARD/ : {
+ 	*(.exitcall.exit)
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ 	/* temporary hack until binutils is fixed to not emit these
+ 	 for static binaries */
+ 	*(.interp)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/lib/checksum.c CVS2_6_11_PA2/arch/parisc/lib/checksum.c
+--- LINUS_2_6_11/arch/parisc/lib/checksum.c	2005-03-02 04:19:01.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/lib/checksum.c	2005-01-22 07:58:57.000000000 -0700
+@@ -131,9 +131,9 @@
+  * Copy from userspace and compute checksum.  If we catch an exception
+  * then zero the rest of the buffer.
+  */
+-unsigned int csum_partial_copy_from_user (const unsigned char *src, unsigned char *dst,
+-                                          int len, unsigned int sum,
+-                                          int *err_ptr)
++unsigned int csum_partial_copy_from_user(const unsigned char __user *src,
++					unsigned char *dst, int len,
++					unsigned int sum, int *err_ptr)
+ {
+ 	int missing;
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/lib/debuglocks.c CVS2_6_11_PA2/arch/parisc/lib/debuglocks.c
+--- LINUS_2_6_11/arch/parisc/lib/debuglocks.c	2005-03-02 04:19:01.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/lib/debuglocks.c	2005-01-13 08:38:42.000000000 -0700
+@@ -1,7 +1,7 @@
+ /* 
+  *    Debugging versions of SMP locking primitives.
+  *
+- *    Copyright (C) 2004 Thibaut VARENE <varenet at esiee.fr>
++ *    Copyright (C) 2004 Thibaut VARENE <varenet at parisc-linux.org>
+  *
+  *    Some code stollen from alpha & sparc64 ;)
+  *
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/lib/memcpy.c CVS2_6_11_PA2/arch/parisc/lib/memcpy.c
+--- LINUS_2_6_11/arch/parisc/lib/memcpy.c	2005-03-02 04:19:01.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/lib/memcpy.c	2005-02-03 04:44:19.000000000 -0700
+@@ -111,7 +111,7 @@
+ 	"\t" EXC_WORD "\t" #_e "\n"			\
+ 	"\t.previous\n"					\
+ 	: _tt(_t), "+r"(_a)				\
+-	: "1"(_a)					\
++	: 						\
+ 	: "r8")
+ 
+ #define def_store_ai_insn(_insn,_sz,_tt,_s,_a,_t,_e) 	\
+@@ -122,7 +122,7 @@
+ 	"\t" EXC_WORD "\t" #_e "\n"			\
+ 	"\t.previous\n"					\
+ 	: "+r"(_a) 					\
+-	: _tt(_t), "0"(_a)				\
++	: _tt(_t)					\
+ 	: "r8")
+ 
+ #define ldbma(_s, _a, _t, _e) def_load_ai_insn(ldbs,1,"=r",_s,_a,_t,_e)
+@@ -297,7 +297,7 @@
+ unsigned long pa_memcpy(void *dstp, const void *srcp, unsigned long len)
+ {
+ 	register unsigned long src, dst, t1, t2, t3;
+-	register char *pcs, *pcd;
++	register unsigned char *pcs, *pcd;
+ 	register unsigned int *pws, *pwd;
+ 	register double *pds, *pdd;
+ 	unsigned long ret = 0;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/math-emu/driver.c CVS2_6_11_PA2/arch/parisc/math-emu/driver.c
+--- LINUS_2_6_11/arch/parisc/math-emu/driver.c	2005-03-02 04:19:02.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/math-emu/driver.c	2005-03-01 23:47:36.000000000 -0700
+@@ -27,7 +27,6 @@
+  *  Copyright (C) 2001	      Hewlett-Packard <bame at debian.org>
+  */
+ 
+-#include <linux/config.h>
+ #include <linux/sched.h>
+ #include "float.h"
+ #include "math-emu.h"
+@@ -120,7 +119,7 @@
+ 	    si.si_signo = signalcode >> 24;
+ 	    si.si_errno = 0;
+ 	    si.si_code = signalcode & 0xffffff;
+-	    si.si_addr = (void *) regs->iaoq[0];
++	    si.si_addr = (void __user *) regs->iaoq[0];
+ 	    force_sig_info(si.si_signo, &si, current);
+ 	    return -1;
+ 	}
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/mm/fault.c CVS2_6_11_PA2/arch/parisc/mm/fault.c
+--- LINUS_2_6_11/arch/parisc/mm/fault.c	2005-03-02 04:19:02.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/mm/fault.c	2004-10-04 13:12:50.000000000 -0600
+@@ -225,7 +225,7 @@
+ 		si.si_signo = SIGSEGV;
+ 		si.si_errno = 0;
+ 		si.si_code = SEGV_MAPERR;
+-		si.si_addr = (void *) address;
++		si.si_addr = (void __user *) address;
+ 		force_sig_info(SIGSEGV, &si, current);
+ 		return;
+ 	}
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/arch/parisc/mm/init.c CVS2_6_11_PA2/arch/parisc/mm/init.c
+--- LINUS_2_6_11/arch/parisc/mm/init.c	2005-03-02 04:19:02.000000000 -0700
++++ CVS2_6_11_PA2/arch/parisc/mm/init.c	2005-01-26 06:28:50.000000000 -0700
+@@ -21,6 +21,7 @@
+ #include <linux/swap.h>
+ #include <linux/unistd.h>
+ #include <linux/nodemask.h>	/* for node_online_map */
++#include <linux/pagemap.h>	/* for release_pages and page_cache_release */
+ 
+ #include <asm/pgalloc.h>
+ #include <asm/tlb.h>
+@@ -59,8 +60,6 @@
+ 
+ static struct resource sysram_resources[MAX_PHYSMEM_RANGES];
+ 
+-static unsigned long max_pfn;
+-
+ /* The following array is initialized from the firmware specific
+  * information retrieved in kernel/inventory.c.
+  */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/ide/Kconfig CVS2_6_11_PA2/drivers/ide/Kconfig
+--- LINUS_2_6_11/drivers/ide/Kconfig	2005-03-02 04:19:06.000000000 -0700
++++ CVS2_6_11_PA2/drivers/ide/Kconfig	2005-02-24 06:57:03.000000000 -0700
+@@ -611,7 +611,7 @@
+ 	tristate "NS87415 chipset support"
+ 	help
+ 	  This driver adds detection and support for the NS87415 chip
+-	  (used in SPARC64, among others).
++	  (used mainly on SPARC64 and PA-RISC machines).
+ 
+ 	  Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/keyboard/Kconfig CVS2_6_11_PA2/drivers/input/keyboard/Kconfig
+--- LINUS_2_6_11/drivers/input/keyboard/Kconfig	2005-03-02 04:19:07.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/keyboard/Kconfig	2005-01-12 13:16:31.000000000 -0700
+@@ -30,6 +30,44 @@
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called atkbd.
+ 
++config KEYBOARD_ATKBD_HP_KEYCODES
++	bool "Use HP keyboard scancodes"
++	depends on PARISC && KEYBOARD_ATKBD
++	default y
++	help
++	  Say Y here if you have a PA-RISC machine and want to use an AT or
++	  PS/2 keyboard, and your keyboard uses keycodes that are specific to
++	  PA-RISC keyboards.
++
++	  Say N if you use a standard keyboard.
++
++config KEYBOARD_ATKBD_RDI_KEYCODES
++	bool "Use PrecisionBook keyboard scancodes"
++	depends on KEYBOARD_ATKBD_HP_KEYCODES
++	default n
++	help
++	  If you have an RDI PrecisionBook, say Y here if you want to use its
++	  built-in keyboard (as opposed to an external keyboard).
++
++	  The PrecisionBook has five keys that conflict with those used by most
++	  AT and PS/2 keyboards. These are as follows:
++
++	    PrecisionBook    Standard AT or PS/2
++
++	    F1               F12
++	    Left Ctrl        Left Alt
++	    Caps Lock        Left Ctrl
++	    Right Ctrl       Caps Lock
++	    Left             102nd key (the key to the right of Left Shift)
++
++	  If you say N here, and use the PrecisionBook keyboard, then each key
++	  in the left-hand column will be interpreted as the corresponding key
++	  in the right-hand column.
++
++	  If you say Y here, and use an external keyboard, then each key in the
++	  right-hand column will be interpreted as the key shown in the
++	  left-hand column.
++
+ config KEYBOARD_SUNKBD
+ 	tristate "Sun Type 4 and Type 5 keyboard support"
+ 	depends on INPUT && INPUT_KEYBOARD
+@@ -97,3 +135,34 @@
+ 
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called amikbd.
++
++config KEYBOARD_HIL_OLD
++	tristate "HP HIL keyboard support (simple driver)"
++	depends on GSC && INPUT && INPUT_KEYBOARD && !HIL_MLC
++	default y
++	help
++	  The "Human Interface Loop" is a older, 8-channel USB-like
++	  controller used in several Hewlett Packard models. This driver
++	  was adapted from the one written for m68k/hp300, and implements
++	  support for a keyboard attached to the HIL port, but not for
++	  any other types of HIL input devices like mice or tablets.
++	  However, it has been thoroughly tested and is stable.
++
++	  If you want full HIL support including support for multiple
++	  keyboards, mices and tablets, you have to enable the
++	  "HP System Device Controller i8042 Support" in the input/serio
++	  submenu.
++
++config KEYBOARD_HIL
++	tristate "HP HIL keyboard support"
++	depends on GSC && INPUT && INPUT_KEYBOARD
++	default y
++	select HP_SDC
++ 	select HIL_MLC
++	select SERIO
++	help
++	  The "Human Interface Loop" is a older, 8-channel USB-like
++	  controller used in several Hewlett Packard models.
++	  This driver implements support for HIL-keyboards attached
++	  to your machine, so normally you should say Y here.
++
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/keyboard/Makefile CVS2_6_11_PA2/drivers/input/keyboard/Makefile
+--- LINUS_2_6_11/drivers/input/keyboard/Makefile	2005-03-02 04:19:07.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/keyboard/Makefile	2004-03-20 13:29:36.000000000 -0700
+@@ -2,8 +2,6 @@
+ # Makefile for the input core drivers.
+ #
+ 
+-# Each configuration option enables a list of files.
+-
+ obj-$(CONFIG_KEYBOARD_ATKBD)		+= atkbd.o
+ obj-$(CONFIG_KEYBOARD_MAPLE)		+= maple_keyb.o
+ obj-$(CONFIG_KEYBOARD_SUNKBD)		+= sunkbd.o
+@@ -12,3 +10,5 @@
+ obj-$(CONFIG_KEYBOARD_AMIGA)		+= amikbd.o
+ obj-$(CONFIG_KEYBOARD_NEWTON)		+= newtonkbd.o
+ obj-$(CONFIG_KEYBOARD_98KBD)		+= 98kbd.o
++obj-$(CONFIG_KEYBOARD_HIL)		+= hil_kbd.o
++obj-$(CONFIG_KEYBOARD_HIL_OLD)		+= hilkbd.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/keyboard/atkbd.c CVS2_6_11_PA2/drivers/input/keyboard/atkbd.c
+--- LINUS_2_6_11/drivers/input/keyboard/atkbd.c	2005-03-02 04:19:07.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/keyboard/atkbd.c	2005-02-03 04:44:37.000000000 -0700
+@@ -71,12 +71,15 @@
+  * are loadable via an userland utility.
+  */
+ 
+-#if defined(__hppa__)
+-#include "hpps2atkbd.h"
+-#else
+-
+ static unsigned char atkbd_set2_keycode[512] = {
+ 
++#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES
++
++/* XXX: need a more general approach */
++
++#include "hpps2atkbd.h"	/* include the keyboard scancodes */
++
++#else
+ 	  0, 67, 65, 63, 61, 59, 60, 88,  0, 68, 66, 64, 62, 15, 41,117,
+ 	  0, 56, 42, 93, 29, 16,  2,  0,  0,  0, 44, 31, 30, 17,  3,  0,
+ 	  0, 46, 45, 32, 18,  5,  4, 95,  0, 57, 47, 33, 20, 19,  6,183,
+@@ -96,9 +99,8 @@
+ 	110,111,108,112,106,103,  0,119,  0,118,109,  0, 99,104,119,  0,
+ 
+ 	  0,  0,  0, 65, 99,
+-};
+-
+ #endif
++};
+ 
+ static unsigned char atkbd_set3_keycode[512] = {
+ 
+@@ -254,8 +256,8 @@
+ 	int scroll = 0, click = -1;
+ 	int value;
+ 
+-#ifdef ATKBD_DEBUG
+-	printk(KERN_DEBUG "atkbd.c: Received %02x flags %02x\n", data, flags);
++#if 0 || defined(ATKBD_DEBUG)   /* CHANGEME */
++	printk(KERN_ERR "atkbd.c: Received %02x flags %02x\n", data, flags);
+ #endif
+ 
+ #if !defined(__i386__) && !defined (__x86_64__)
+@@ -388,6 +390,9 @@
+ 					break;
+ 			}
+ 
++#if 0  /* CHANGEME */
++			printk(KERN_ERR "Reporting: %#x, emul=%d\n", code, atkbd->emul);
++#endif
+ 			atkbd_report_key(&atkbd->dev, regs, atkbd->keycode[code], value);
+ 	}
+ 
+@@ -501,7 +506,12 @@
+  * controller may confuse the keyboard need a full reset of the keyboard. On
+  * these systems the BIOS also usually doesn't do it for us.
+  */
+-
++/* XXX: I think this is wrong. We can't assume, that this definitively is a
++        keyboard. Since we are still in probing phase, it could be a mouse or 
++	anything else and just sending a ATKBD_CMD_RESET_BAT might confuse the
++	device. IMHO those lines should be moved to the end of atkbd_probe().
++	Helge Deller
++ */
+ 	if (atkbd_reset)
+ 		if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT))
+ 			printk(KERN_WARNING "atkbd.c: keyboard reset failed on %s\n", ps2dev->serio->phys);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/keyboard/hil_kbd.c CVS2_6_11_PA2/drivers/input/keyboard/hil_kbd.c
+--- LINUS_2_6_11/drivers/input/keyboard/hil_kbd.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/keyboard/hil_kbd.c	2004-11-01 10:57:39.000000000 -0700
+@@ -0,0 +1,375 @@
++/*
++ * Generic linux-input device driver for keyboard devices
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ *
++ */
++
++#include <linux/hil.h>
++#include <linux/input.h>
++#include <linux/serio.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/pci_ids.h>
++
++#define PREFIX "HIL KEYB: "
++#define HIL_GENERIC_NAME "HIL keyboard"
++
++MODULE_AUTHOR("Brian S. Julin <bri at calyx.com>");
++MODULE_DESCRIPTION(HIL_GENERIC_NAME " driver");
++MODULE_LICENSE("Dual BSD/GPL");
++
++#define HIL_KBD_MAX_LENGTH 16
++
++#define HIL_KBD_SET1_UPBIT 0x01
++#define HIL_KBD_SET1_SHIFT 1
++static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] = 
++	{ HIL_KEYCODES_SET1 };
++
++#define HIL_KBD_SET2_UPBIT 0x01
++#define HIL_KBD_SET2_SHIFT 1
++/* Set2 is user defined */
++
++#define HIL_KBD_SET3_UPBIT 0x80
++#define HIL_KBD_SET3_SHIFT 0
++static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] =
++	{ HIL_KEYCODES_SET3 };
++
++static char hil_language[][16] = { HIL_LOCALE_MAP };
++
++struct hil_kbd {
++	struct input_dev dev;
++	struct serio *serio;
++
++	/* Input buffer and index for packets from HIL bus. */
++	hil_packet data[HIL_KBD_MAX_LENGTH];
++	int idx4; /* four counts per packet */
++
++	/* Raw device info records from HIL bus, see hil.h for fields. */
++	char	idd[HIL_KBD_MAX_LENGTH];	/* DID byte and IDD record */
++	char	rsc[HIL_KBD_MAX_LENGTH];	/* RSC record */
++	char	exd[HIL_KBD_MAX_LENGTH];	/* EXD record */
++	char	rnm[HIL_KBD_MAX_LENGTH + 1];	/* RNM record + NULL term. */
++
++	/* Something to sleep around with. */
++	struct semaphore sem;
++};
++
++/* Process a complete packet after transfer from the HIL */
++static void hil_kbd_process_record(struct hil_kbd *kbd)
++{
++	struct input_dev *dev = &kbd->dev;
++	hil_packet *data = kbd->data;
++	hil_packet p;
++	int idx, i, cnt;
++
++	idx = kbd->idx4/4;
++	p = data[idx - 1];
++
++	if ((p & ~HIL_CMDCT_POL) == 
++	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) goto report;
++	if ((p & ~HIL_CMDCT_RPL) == 
++	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL)) goto report;
++
++	/* Not a poll response.  See if we are loading config records. */
++	switch (p & HIL_PKT_DATA_MASK) {
++	case HIL_CMD_IDD:
++		for (i = 0; i < idx; i++)
++			kbd->idd[i] = kbd->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_KBD_MAX_LENGTH; i++)
++			kbd->idd[i] = 0;
++		break;
++	case HIL_CMD_RSC:
++		for (i = 0; i < idx; i++)
++			kbd->rsc[i] = kbd->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_KBD_MAX_LENGTH; i++)
++			kbd->rsc[i] = 0;
++		break;
++	case HIL_CMD_EXD:
++		for (i = 0; i < idx; i++)
++			kbd->exd[i] = kbd->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_KBD_MAX_LENGTH; i++)
++			kbd->exd[i] = 0;
++		break;
++	case HIL_CMD_RNM:
++		for (i = 0; i < idx; i++)
++			kbd->rnm[i] = kbd->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_KBD_MAX_LENGTH + 1; i++)
++			kbd->rnm[i] = '\0';
++		break;
++	default:
++		/* These occur when device isn't present */
++		if (p == (HIL_ERR_INT | HIL_PKT_CMD)) break; 
++		/* Anything else we'd like to know about. */
++		printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p);
++		break;
++	}
++	goto out;
++
++ report:
++	cnt = 1;
++	switch (kbd->data[0] & HIL_POL_CHARTYPE_MASK) {
++	case HIL_POL_CHARTYPE_NONE:
++		break;
++	case HIL_POL_CHARTYPE_ASCII:
++		while (cnt < idx - 1)
++			input_report_key(dev, kbd->data[cnt++] & 0x7f, 1);
++		break;
++	case HIL_POL_CHARTYPE_RSVD1:
++	case HIL_POL_CHARTYPE_RSVD2:
++	case HIL_POL_CHARTYPE_BINARY:
++		while (cnt < idx - 1)
++			input_report_key(dev, kbd->data[cnt++], 1);
++		break;
++	case HIL_POL_CHARTYPE_SET1:
++		while (cnt < idx - 1) {
++			unsigned int key;
++			int up;
++			key = kbd->data[cnt++];
++			up = key & HIL_KBD_SET1_UPBIT;
++			key &= (~HIL_KBD_SET1_UPBIT & 0xff);
++			key = hil_kbd_set1[key >> HIL_KBD_SET1_SHIFT];
++			if (key != KEY_RESERVED)
++				input_report_key(dev, key, !up);
++		}
++		break;
++	case HIL_POL_CHARTYPE_SET2:
++		while (cnt < idx - 1) {
++			unsigned int key;
++			int up;
++			key = kbd->data[cnt++];
++			up = key & HIL_KBD_SET2_UPBIT;
++			key &= (~HIL_KBD_SET1_UPBIT & 0xff);
++			key = key >> HIL_KBD_SET2_SHIFT;
++			if (key != KEY_RESERVED)
++				input_report_key(dev, key, !up);
++		}
++		break;
++	case HIL_POL_CHARTYPE_SET3:
++		while (cnt < idx - 1) {
++			unsigned int key;
++			int up;
++			key = kbd->data[cnt++];
++			up = key & HIL_KBD_SET3_UPBIT;
++			key &= (~HIL_KBD_SET1_UPBIT & 0xff);
++			key = hil_kbd_set3[key >> HIL_KBD_SET3_SHIFT];
++			if (key != KEY_RESERVED)
++				input_report_key(dev, key, !up);
++		}
++		break;
++	}
++ out:
++	kbd->idx4 = 0;
++	up(&kbd->sem);
++}
++
++static void hil_kbd_process_err(struct hil_kbd *kbd) {
++	printk(KERN_WARNING PREFIX "errored HIL packet\n");
++	kbd->idx4 = 0;
++	up(&kbd->sem);
++}
++
++static irqreturn_t hil_kbd_interrupt(struct serio *serio, 
++	      unsigned char data, unsigned int flags, struct pt_regs *regs)
++{
++	struct hil_kbd *kbd;
++	hil_packet packet;
++	int idx;
++
++	kbd = (struct hil_kbd *)serio->private;
++	if (kbd == NULL) {
++		BUG();
++		return IRQ_HANDLED;
++	}
++
++	if (kbd->idx4 >= (HIL_KBD_MAX_LENGTH * sizeof(hil_packet))) {
++		hil_kbd_process_err(kbd);
++		return IRQ_HANDLED;
++	}
++	idx = kbd->idx4/4;
++	if (!(kbd->idx4 % 4)) kbd->data[idx] = 0;
++	packet = kbd->data[idx];
++	packet |= ((hil_packet)data) << ((3 - (kbd->idx4 % 4)) * 8);
++	kbd->data[idx] = packet;
++
++	/* Records of N 4-byte hil_packets must terminate with a command. */
++	if ((++(kbd->idx4)) % 4) return IRQ_HANDLED;
++	if ((packet & 0xffff0000) != HIL_ERR_INT) {
++		hil_kbd_process_err(kbd);
++		return IRQ_HANDLED;
++	}
++	if (packet & HIL_PKT_CMD) hil_kbd_process_record(kbd);
++	return IRQ_HANDLED;
++}
++
++static void hil_kbd_disconnect(struct serio *serio)
++{
++	struct hil_kbd *kbd;
++
++	kbd = (struct hil_kbd *)serio->private;
++	if (kbd == NULL) {
++		BUG();
++		return;
++	}
++
++	input_unregister_device(&kbd->dev);
++	serio_close(serio);
++	kfree(kbd);
++}
++
++static void hil_kbd_connect(struct serio *serio, struct serio_driver *drv)
++{
++	struct hil_kbd	*kbd;
++	uint8_t		did, *idd;
++	int		i;
++	
++	if (serio->type != (SERIO_HIL_MLC | SERIO_HIL)) return;
++
++	if (!(kbd = kmalloc(sizeof(struct hil_kbd), GFP_KERNEL))) return;
++	memset(kbd, 0, sizeof(struct hil_kbd));
++
++	if (serio_open(serio, drv)) goto bail0;
++
++	serio->private = kbd;
++	kbd->serio = serio;
++	kbd->dev.private = kbd;
++
++	init_MUTEX_LOCKED(&(kbd->sem));
++
++	/* Get device info.  MLC driver supplies devid/status/etc. */
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_IDD);
++	down(&(kbd->sem));
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_RSC);
++	down(&(kbd->sem));
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_RNM);
++	down(&(kbd->sem));
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_EXD);
++	down(&(kbd->sem));
++
++	up(&(kbd->sem));
++
++	did = kbd->idd[0];
++	idd = kbd->idd + 1;
++	switch (did & HIL_IDD_DID_TYPE_MASK) {
++	case HIL_IDD_DID_TYPE_KB_INTEGRAL:
++	case HIL_IDD_DID_TYPE_KB_ITF:
++	case HIL_IDD_DID_TYPE_KB_RSVD:
++	case HIL_IDD_DID_TYPE_CHAR:
++		printk(KERN_INFO PREFIX "HIL keyboard found (did = 0x%02x, lang = %s)\n",
++			did, hil_language[did & HIL_IDD_DID_TYPE_KB_LANG_MASK]);
++		break;
++	default:
++		goto bail1;
++	}
++
++	if(HIL_IDD_NUM_BUTTONS(idd) || HIL_IDD_NUM_AXES_PER_SET(*idd)) {
++		printk(KERN_INFO PREFIX "keyboards only, no combo devices supported.\n");
++		goto bail1;
++	}
++
++
++	kbd->dev.evbit[0]	= BIT(EV_KEY) | BIT(EV_REP);
++	kbd->dev.ledbit[0]	= BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
++	kbd->dev.keycodemax	= HIL_KEYCODES_SET1_TBLSIZE;
++	kbd->dev.keycodesize	= sizeof(hil_kbd_set1[0]);
++	kbd->dev.keycode	= hil_kbd_set1;
++	kbd->dev.name		= strlen(kbd->rnm) ? kbd->rnm : HIL_GENERIC_NAME;
++	kbd->dev.phys		= "hpkbd/input0";	/* XXX */
++
++	kbd->dev.id.bustype	= BUS_HIL;
++	kbd->dev.id.vendor	= PCI_VENDOR_ID_HP;
++	kbd->dev.id.product	= 0x0001; /* TODO: get from kbd->rsc */
++	kbd->dev.id.version	= 0x0100; /* TODO: get from kbd->rsc */
++	kbd->dev.dev		= &serio->dev;
++
++	for (i = 0; i < 128; i++) {
++		set_bit(hil_kbd_set1[i], kbd->dev.keybit);
++		set_bit(hil_kbd_set3[i], kbd->dev.keybit);
++	}
++	clear_bit(0, kbd->dev.keybit);
++
++	input_register_device(&kbd->dev);
++	printk(KERN_INFO "input: %s, ID: %d\n",
++		kbd->dev.name, did);
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_EK1); /* Enable Keyswitch Autorepeat 1 */
++	down(&(kbd->sem));
++	up(&(kbd->sem));
++
++	return;
++ bail1:
++	serio_close(serio);
++ bail0:
++	kfree(kbd);
++}
++
++
++struct serio_driver hil_kbd_serio_drv = {
++	.driver		= {
++		.name	= "hil_kbd",
++	},
++	.description	= "HP HIL keyboard driver",
++	.connect 	= hil_kbd_connect,
++	.disconnect 	= hil_kbd_disconnect,
++	.interrupt 	= hil_kbd_interrupt
++};
++
++static int __init hil_kbd_init(void)
++{
++	serio_register_driver(&hil_kbd_serio_drv);
++        return 0;
++}
++                
++static void __exit hil_kbd_exit(void)
++{
++	serio_unregister_driver(&hil_kbd_serio_drv);
++}
++                        
++module_init(hil_kbd_init);
++module_exit(hil_kbd_exit);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/keyboard/hilkbd.c CVS2_6_11_PA2/drivers/input/keyboard/hilkbd.c
+--- LINUS_2_6_11/drivers/input/keyboard/hilkbd.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/keyboard/hilkbd.c	2005-01-11 07:11:34.000000000 -0700
+@@ -0,0 +1,343 @@
++/*
++ *  linux/drivers/hil/hilkbd.c
++ *
++ *  Copyright (C) 1998 Philip Blundell <philb at gnu.org>
++ *  Copyright (C) 1999 Matthew Wilcox <willy at bofh.ai>
++ *  Copyright (C) 1999-2003 Helge Deller <deller at gmx.de>
++ *
++ *  Very basic HP Human Interface Loop (HIL) driver.
++ *  This driver handles the keyboard on HP300 (m68k) and on some 
++ *  HP700 (parisc) series machines.
++ *
++ * 
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License version 2.  See the file COPYING in the main directory of this
++ * archive for more details.
++ */
++
++#include <linux/pci_ids.h>
++#include <linux/ioport.h>
++#include <linux/module.h>
++#include <linux/config.h>
++#include <linux/errno.h>
++#include <linux/input.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <linux/hil.h>
++#include <linux/spinlock.h>
++
++
++MODULE_AUTHOR("Philip Blundell, Matthew Wilcox, Helge Deller");
++MODULE_DESCRIPTION("HIL keyboard driver (basic functionality)");
++MODULE_LICENSE("GPL v2");
++
++
++#if defined(CONFIG_PARISC)
++
++ #include <asm/io.h>
++ #include <asm/hardware.h>
++ #include <asm/parisc-device.h>
++ static unsigned long hil_base;	/* HPA for the HIL device */
++ static unsigned int hil_irq;
++ #define HILBASE		hil_base /* HPPA (parisc) port address */
++ #define HIL_DATA		0x800
++ #define HIL_CMD		0x801
++ #define HIL_IRQ		hil_irq
++ #define hil_readb(p)		gsc_readb(p)
++ #define hil_writeb(v,p)	gsc_writeb((v),(p))
++
++#elif defined(CONFIG_HP300)
++
++ #define HILBASE		0xf0428000 /* HP300 (m86k) port address */
++ #define HIL_DATA		0x1
++ #define HIL_CMD		0x3
++ #define HIL_IRQ		2
++ #define hil_readb(p)		readb(p)
++ #define hil_writeb(v,p)	writeb((v),(p))
++
++#else
++#error "HIL is not supported on this platform"
++#endif
++
++
++ 
++/* HIL helper functions */
++ 
++#define hil_busy()              (hil_readb(HILBASE + HIL_CMD) & HIL_BUSY)
++#define hil_data_available()    (hil_readb(HILBASE + HIL_CMD) & HIL_DATA_RDY)
++#define hil_status()            (hil_readb(HILBASE + HIL_CMD))
++#define hil_command(x)          do { hil_writeb((x), HILBASE + HIL_CMD); } while (0)
++#define hil_read_data()         (hil_readb(HILBASE + HIL_DATA))
++#define hil_write_data(x)       do { hil_writeb((x), HILBASE + HIL_DATA); } while (0)
++
++/* HIL constants */
++ 
++#define	HIL_BUSY		0x02
++#define	HIL_DATA_RDY		0x01
++
++#define	HIL_SETARD		0xA0		/* set auto-repeat delay */
++#define	HIL_SETARR		0xA2		/* set auto-repeat rate */
++#define	HIL_SETTONE		0xA3		/* set tone generator */
++#define	HIL_CNMT		0xB2		/* clear nmi */
++#define	HIL_INTON		0x5C		/* Turn on interrupts. */
++#define	HIL_INTOFF		0x5D		/* Turn off interrupts. */
++
++#define	HIL_READKBDSADR	 	0xF9
++#define	HIL_WRITEKBDSADR 	0xE9
++
++static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] = 
++	{ HIL_KEYCODES_SET1 };
++
++/* HIL structure */
++static struct {
++	struct input_dev dev;
++
++	unsigned int curdev;
++	
++	unsigned char s;
++	unsigned char c;
++	int valid;
++	
++	unsigned char data[16];
++	unsigned int ptr;
++	spinlock_t lock;
++
++	void *dev_id;	/* native bus device */
++} hil_dev;
++
++
++static void poll_finished(void)
++{
++	int down;
++	int key;
++	unsigned char scode;
++	
++	switch (hil_dev.data[0]) {
++	case 0x40:
++		down = (hil_dev.data[1] & 1) == 0;
++		scode = hil_dev.data[1] >> 1;
++		key = hphilkeyb_keycode[scode];
++		input_report_key(&hil_dev.dev, key, down);
++		break;
++	}
++	hil_dev.curdev = 0;
++}
++
++static inline void handle_status(unsigned char s, unsigned char c)
++{
++	if (c & 0x8) {
++		/* End of block */
++		if (c & 0x10)
++			poll_finished();
++	} else {
++		if (c & 0x10) {
++			if (hil_dev.curdev)
++				poll_finished();  /* just in case */
++			hil_dev.curdev = c & 7;
++			hil_dev.ptr = 0;
++		}
++	}
++}
++
++static inline void handle_data(unsigned char s, unsigned char c)
++{
++	if (hil_dev.curdev) {
++		hil_dev.data[hil_dev.ptr++] = c;
++		hil_dev.ptr &= 15;
++	}
++}
++
++
++/* 
++ * Handle HIL interrupts.
++ */
++static irqreturn_t hil_interrupt(int irq, void *handle, struct pt_regs *regs)
++{
++	unsigned char s, c;
++	
++	s = hil_status();
++	c = hil_read_data();
++
++	switch (s >> 4) {
++	case 0x5:
++		handle_status(s, c);
++		break;
++	case 0x6:
++		handle_data(s, c);
++		break;
++	case 0x4:
++		hil_dev.s = s;
++		hil_dev.c = c;
++		mb();
++		hil_dev.valid = 1;
++		break;
++	}
++	return IRQ_HANDLED;
++}
++
++/*
++ * Send a command to the HIL
++ */
++
++static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&hil_dev.lock, flags);
++	while (hil_busy())
++		/* wait */;
++	hil_command(cmd);
++	while (len--) {
++		while (hil_busy())
++			/* wait */;
++		hil_write_data(*(data++));
++	}
++	spin_unlock_irqrestore(&hil_dev.lock, flags);
++}
++
++
++/*
++ * Initialise HIL. 
++ */
++
++static int __init
++hil_keyb_init(void)
++{
++	unsigned char c;
++	unsigned int i, kbid;
++	wait_queue_head_t hil_wait;
++
++	if (hil_dev.dev.id.bustype) {
++		return -ENODEV; /* already initialized */
++	}
++	
++#if defined(CONFIG_HP300)
++	if (!hwreg_present((void *)(HILBASE + HIL_DATA)))
++		return -ENODEV;
++	
++	request_region(HILBASE+HIL_DATA, 2, "hil");
++#endif
++	
++	request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id);
++
++	/* Turn on interrupts */
++	hil_do(HIL_INTON, NULL, 0);
++
++	/* Look for keyboards */
++	hil_dev.valid = 0;	/* clear any pending data */
++	hil_do(HIL_READKBDSADR, NULL, 0);
++
++	init_waitqueue_head(&hil_wait);
++	wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3*HZ);
++	if (!hil_dev.valid) {
++		printk(KERN_WARNING "HIL: timed out, assuming no keyboard present.\n");
++	}
++
++	c = hil_dev.c; 
++	hil_dev.valid = 0;
++	if (c == 0) {
++		kbid = -1;
++		printk(KERN_WARNING "HIL: no keyboard present.\n");
++	} else {
++		kbid = ffz(~c);
++		/* printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid); */
++	}
++
++	/* set it to raw mode */
++	c = 0;
++	hil_do(HIL_WRITEKBDSADR, &c, 1);
++	
++	init_input_dev(&hil_dev.dev);
++
++	for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++)
++		if (hphilkeyb_keycode[i] != KEY_RESERVED)
++			set_bit(hphilkeyb_keycode[i], hil_dev.dev.keybit);
++
++	hil_dev.dev.evbit[0]    = BIT(EV_KEY) | BIT(EV_REP);
++	hil_dev.dev.ledbit[0]   = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
++	hil_dev.dev.keycodemax  = HIL_KEYCODES_SET1_TBLSIZE;
++        hil_dev.dev.keycodesize = sizeof(hphilkeyb_keycode[0]);
++	hil_dev.dev.keycode     = hphilkeyb_keycode;
++	hil_dev.dev.name 	= "HIL keyboard";
++	hil_dev.dev.phys 	= "hpkbd/input0";
++
++	hil_dev.dev.id.bustype	= BUS_HIL;
++	hil_dev.dev.id.vendor	= PCI_VENDOR_ID_HP;
++	hil_dev.dev.id.product	= 0x0001;
++	hil_dev.dev.id.version	= 0x0010;
++
++	input_register_device(&hil_dev.dev);
++	printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n",
++		hil_dev.dev.name, kbid, HILBASE, HIL_IRQ);
++
++	return 0;
++}
++
++#if defined(CONFIG_PARISC)
++static int __init
++hil_init_chip(struct parisc_device *dev)
++{
++	if (!dev->irq) {
++		printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n", dev->hpa);
++		return -ENODEV;
++	}
++
++	hil_base = dev->hpa;
++	hil_irq  = dev->irq;
++	hil_dev.dev_id = dev;
++	
++	printk(KERN_INFO "Found HIL bus at 0x%08lx, IRQ %d\n", hil_base, hil_irq);
++
++	return hil_keyb_init();
++}
++
++static struct parisc_device_id hil_tbl[] = {
++	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00073 },
++	{ 0, }
++};
++
++MODULE_DEVICE_TABLE(parisc, hil_tbl);
++
++static struct parisc_driver hil_driver = {
++	.name =		"HIL",
++	.id_table =	hil_tbl,
++	.probe =	hil_init_chip,
++};
++#endif /* CONFIG_PARISC */
++
++
++
++
++
++static int __init hil_init(void)
++{
++#if defined(CONFIG_PARISC)
++	return register_parisc_driver(&hil_driver);
++#else
++	return hil_keyb_init();
++#endif
++}
++
++
++static void __exit hil_exit(void)
++{
++	if (HIL_IRQ) {
++		disable_irq(HIL_IRQ);
++		free_irq(HIL_IRQ, hil_dev.dev_id);
++	}
++
++	/* Turn off interrupts */
++	hil_do(HIL_INTOFF, NULL, 0);
++
++	input_unregister_device(&hil_dev.dev);
++
++#if defined(CONFIG_PARISC)
++	unregister_parisc_driver(&hil_driver);
++#else
++	release_region(HILBASE+HIL_DATA, 2);
++#endif
++}
++
++module_init(hil_init);
++module_exit(hil_exit);
++
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/keyboard/hpps2atkbd.h CVS2_6_11_PA2/drivers/input/keyboard/hpps2atkbd.h
+--- LINUS_2_6_11/drivers/input/keyboard/hpps2atkbd.h	2005-03-02 04:19:07.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/keyboard/hpps2atkbd.h	2005-01-13 08:38:42.000000000 -0700
+@@ -3,7 +3,7 @@
+  *
+  * Copyright (c) 2004 Helge Deller <deller at gmx.de>
+  * Copyright (c) 2002 Laurent Canet <canetl at esiee.fr>
+- * Copyright (c) 2002 Thibaut Varene <varenet at esiee.fr>
++ * Copyright (c) 2002 Thibaut Varene <varenet at parisc-linux.org>
+  * Copyright (c) 2000 Xavier Debacker <debackex at esiee.fr>
+  *
+  * HP PS/2 AT-compatible Keyboard, found in PA/RISC Workstations & Laptops
+@@ -14,10 +14,8 @@
+  */
+ 
+ 
+-/* undefine if you have a RDI PRECISIONBOOK */
+-#define STANDARD_KEYBOARD
+-
+-#if defined(STANDARD_KEYBOARD)
++/* Is the keyboard an RDI PrecisionBook? */
++#ifndef CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES
+ # define CONFLICT(x,y) x
+ #else
+ # define CONFLICT(x,y) y
+@@ -50,10 +48,10 @@
+ /* 60 */  KEY_DOWN,     C_61,          KEY_PAUSE,     KEY_UP,        KEY_DELETE,    KEY_END,      KEY_BACKSPACE, KEY_INSERT,
+ /* 68 */  KEY_RESERVED, KEY_KP1,       KEY_RIGHT,     KEY_KP4,       KEY_KP7,       KEY_PAGEDOWN, KEY_HOME,      KEY_PAGEUP,
+ /* 70 */  KEY_KP0,      KEY_KPDOT,     KEY_KP2,       KEY_KP5,       KEY_KP6,       KEY_KP8,      KEY_ESC,       KEY_NUMLOCK,
+-/* 78 */  KEY_F11,      KEY_KPPLUS,    KEY_KP3,       KEY_KPMINUS,   KEY_KPASTERISK,KEY_KP9,      KEY_SCROLLLOCK,KEY_103RD,
++/* 78 */  KEY_F11,      KEY_KPPLUS,    KEY_KP3,       KEY_KPMINUS,   KEY_KPASTERISK,KEY_KP9,      KEY_SCROLLLOCK,KEY_102ND,
+ /* 80 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,
+ /* 88 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,
+-/* 90 */  KEY_RESERVED, KEY_RIGHTALT,  KEY_SYSRQ,     KEY_RESERVED,  KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,
++/* 90 */  KEY_RESERVED, KEY_RIGHTALT,  255,           KEY_RESERVED,  KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,
+ /* 98 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_CAPSLOCK, KEY_RESERVED,  KEY_LEFTMETA,
+ /* a0 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,  KEY_RIGHTMETA,
+ /* a8 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,  KEY_COMPOSE,
+@@ -103,7 +101,6 @@
+ /* f0 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,
+ /* f8 */  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,  KEY_RESERVED
+ 
+-#undef STANDARD_KEYBOARD
+ #undef CONFLICT
+ #undef C_07
+ #undef C_11
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/misc/Kconfig CVS2_6_11_PA2/drivers/input/misc/Kconfig
+--- LINUS_2_6_11/drivers/input/misc/Kconfig	2005-03-02 04:19:08.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/misc/Kconfig	2005-01-22 07:59:19.000000000 -0700
+@@ -49,3 +49,11 @@
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called uinput.
+ 
++config HP_SDC_RTC
++	tristate "HP SDC Real Time Clock"
++	depends on INPUT && INPUT_MISC && GSC
++	select HP_SDC
++	help
++	  Say Y here if you want to support the built-in real time clock
++	  of the HP SDC controller.
++
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/misc/Makefile CVS2_6_11_PA2/drivers/input/misc/Makefile
+--- LINUS_2_6_11/drivers/input/misc/Makefile	2005-03-02 04:19:08.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/misc/Makefile	2004-01-14 11:19:43.000000000 -0700
+@@ -9,3 +9,4 @@
+ obj-$(CONFIG_INPUT_M68K_BEEP)		+= m68kspkr.o
+ obj-$(CONFIG_INPUT_98SPKR)		+= 98spkr.o
+ obj-$(CONFIG_INPUT_UINPUT)		+= uinput.o
++obj-$(CONFIG_HP_SDC_RTC)		+= hp_sdc_rtc.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/misc/hp_sdc_rtc.c CVS2_6_11_PA2/drivers/input/misc/hp_sdc_rtc.c
+--- LINUS_2_6_11/drivers/input/misc/hp_sdc_rtc.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/misc/hp_sdc_rtc.c	2004-10-27 14:17:18.000000000 -0600
+@@ -0,0 +1,724 @@
++/*
++ * HP i8042 SDC + MSM-58321 BBRTC driver.
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * System Device Controller Microprocessor Firmware Theory of Operation
++ *      for Part Number 1820-4784 Revision B.  Dwg No. A-1820-4784-2
++ * efirtc.c by Stephane Eranian/Hewlett Packard
++ *
++ */
++
++#include <linux/hp_sdc.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/time.h>
++#include <linux/miscdevice.h>
++#include <linux/proc_fs.h>
++#include <linux/poll.h>
++#include <linux/rtc.h>
++
++MODULE_AUTHOR("Brian S. Julin <bri at calyx.com>");
++MODULE_DESCRIPTION("HP i8042 SDC + MSM-58321 RTC Driver");
++MODULE_LICENSE("Dual BSD/GPL");
++
++#define RTC_VERSION "1.10d"
++
++static unsigned long epoch = 2000;
++
++static struct semaphore i8042tregs;
++
++static hp_sdc_irqhook hp_sdc_rtc_isr;
++
++static struct fasync_struct *hp_sdc_rtc_async_queue;
++
++static DECLARE_WAIT_QUEUE_HEAD(hp_sdc_rtc_wait);
++
++static loff_t hp_sdc_rtc_llseek(struct file *file, loff_t offset, int origin);
++
++static ssize_t hp_sdc_rtc_read(struct file *file, char *buf,
++			       size_t count, loff_t *ppos);
++
++static int hp_sdc_rtc_ioctl(struct inode *inode, struct file *file,
++			    unsigned int cmd, unsigned long arg);
++
++static unsigned int hp_sdc_rtc_poll(struct file *file, poll_table *wait);
++
++static int hp_sdc_rtc_open(struct inode *inode, struct file *file);
++static int hp_sdc_rtc_release(struct inode *inode, struct file *file);
++static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on);
++
++static int hp_sdc_rtc_read_proc(char *page, char **start, off_t off,
++				int count, int *eof, void *data);
++
++static void hp_sdc_rtc_isr (int irq, void *dev_id, 
++			    uint8_t status, uint8_t data) 
++{
++	return;
++}
++
++static int hp_sdc_rtc_do_read_bbrtc (struct rtc_time *rtctm)
++{
++	struct semaphore tsem;
++	hp_sdc_transaction t;
++	uint8_t tseq[91];
++	int i;
++	
++	i = 0;
++	while (i < 91) {
++		tseq[i++] = HP_SDC_ACT_DATAREG |
++			HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN;
++		tseq[i++] = 0x01;			/* write i8042[0x70] */
++	  	tseq[i]   = i / 7;			/* BBRTC reg address */
++		i++;
++		tseq[i++] = HP_SDC_CMD_DO_RTCR;		/* Trigger command   */
++		tseq[i++] = 2;		/* expect 1 stat/dat pair back.   */
++		i++; i++;               /* buffer for stat/dat pair       */
++	}
++	tseq[84] |= HP_SDC_ACT_SEMAPHORE;
++	t.endidx =		91;
++	t.seq =			tseq;
++	t.act.semaphore =	&tsem;
++	init_MUTEX_LOCKED(&tsem);
++	
++	if (hp_sdc_enqueue_transaction(&t)) return -1;
++	
++	down_interruptible(&tsem);  /* Put ourselves to sleep for results. */
++	
++	/* Check for nonpresence of BBRTC */
++	if (!((tseq[83] | tseq[90] | tseq[69] | tseq[76] |
++	       tseq[55] | tseq[62] | tseq[34] | tseq[41] |
++	       tseq[20] | tseq[27] | tseq[6]  | tseq[13]) & 0x0f))
++		return -1;
++
++	memset(rtctm, 0, sizeof(struct rtc_time));
++	rtctm->tm_year = (tseq[83] & 0x0f) + (tseq[90] & 0x0f) * 10;
++	rtctm->tm_mon  = (tseq[69] & 0x0f) + (tseq[76] & 0x0f) * 10;
++	rtctm->tm_mday = (tseq[55] & 0x0f) + (tseq[62] & 0x0f) * 10;
++	rtctm->tm_wday = (tseq[48] & 0x0f);
++	rtctm->tm_hour = (tseq[34] & 0x0f) + (tseq[41] & 0x0f) * 10;
++	rtctm->tm_min  = (tseq[20] & 0x0f) + (tseq[27] & 0x0f) * 10;
++	rtctm->tm_sec  = (tseq[6]  & 0x0f) + (tseq[13] & 0x0f) * 10;
++	
++	return 0;
++}
++
++static int hp_sdc_rtc_read_bbrtc (struct rtc_time *rtctm)
++{
++	struct rtc_time tm, tm_last;
++	int i = 0;
++
++	/* MSM-58321 has no read latch, so must read twice and compare. */
++
++	if (hp_sdc_rtc_do_read_bbrtc(&tm_last)) return -1;
++	if (hp_sdc_rtc_do_read_bbrtc(&tm)) return -1;
++
++	while (memcmp(&tm, &tm_last, sizeof(struct rtc_time))) {
++		if (i++ > 4) return -1;
++		memcpy(&tm_last, &tm, sizeof(struct rtc_time));
++		if (hp_sdc_rtc_do_read_bbrtc(&tm)) return -1;
++	}
++
++	memcpy(rtctm, &tm, sizeof(struct rtc_time));
++
++	return 0;
++}
++
++
++static int64_t hp_sdc_rtc_read_i8042timer (uint8_t loadcmd, int numreg)
++{
++	hp_sdc_transaction t;
++	uint8_t tseq[26] = {
++		HP_SDC_ACT_PRECMD | HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN,
++		0,
++		HP_SDC_CMD_READ_T1, 2, 0, 0,
++		HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, 
++		HP_SDC_CMD_READ_T2, 2, 0, 0,
++		HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, 
++		HP_SDC_CMD_READ_T3, 2, 0, 0,
++		HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, 
++		HP_SDC_CMD_READ_T4, 2, 0, 0,
++		HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, 
++		HP_SDC_CMD_READ_T5, 2, 0, 0
++	};
++
++	t.endidx = numreg * 5;
++
++	tseq[1] = loadcmd;
++	tseq[t.endidx - 4] |= HP_SDC_ACT_SEMAPHORE; /* numreg assumed > 1 */
++
++	t.seq =			tseq;
++	t.act.semaphore =	&i8042tregs;
++
++	down_interruptible(&i8042tregs);  /* Sleep if output regs in use. */
++
++	if (hp_sdc_enqueue_transaction(&t)) return -1;
++	
++	down_interruptible(&i8042tregs);  /* Sleep until results come back. */
++	up(&i8042tregs);
++
++	return (tseq[5] | 
++		((uint64_t)(tseq[10]) << 8)  | ((uint64_t)(tseq[15]) << 16) |
++		((uint64_t)(tseq[20]) << 24) | ((uint64_t)(tseq[25]) << 32));
++}
++
++
++/* Read the i8042 real-time clock */
++static inline int hp_sdc_rtc_read_rt(struct timeval *res) {
++	int64_t raw;
++	uint32_t tenms; 
++	unsigned int days;
++
++	raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_RT, 5);
++	if (raw < 0) return -1;
++
++	tenms = (uint32_t)raw & 0xffffff;
++	days  = (unsigned int)(raw >> 24) & 0xffff;
++
++	res->tv_usec = (suseconds_t)(tenms % 100) * 10000;
++	res->tv_sec =  (time_t)(tenms / 100) + days * 86400;
++
++	return 0;
++}
++
++
++/* Read the i8042 fast handshake timer */
++static inline int hp_sdc_rtc_read_fhs(struct timeval *res) {
++	uint64_t raw;
++	unsigned int tenms;
++
++	raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_FHS, 2);
++	if (raw < 0) return -1;
++
++	tenms = (unsigned int)raw & 0xffff;
++
++	res->tv_usec = (suseconds_t)(tenms % 100) * 10000;
++	res->tv_sec  = (time_t)(tenms / 100);
++
++	return 0;
++}
++
++
++/* Read the i8042 match timer (a.k.a. alarm) */
++static inline int hp_sdc_rtc_read_mt(struct timeval *res) {
++	int64_t raw;	
++	uint32_t tenms; 
++
++	raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_MT, 3);
++	if (raw < 0) return -1;
++
++	tenms = (uint32_t)raw & 0xffffff;
++
++	res->tv_usec = (suseconds_t)(tenms % 100) * 10000;
++	res->tv_sec  = (time_t)(tenms / 100);
++
++	return 0;
++}
++
++
++/* Read the i8042 delay timer */
++static inline int hp_sdc_rtc_read_dt(struct timeval *res) {
++	int64_t raw;
++	uint32_t tenms;
++
++	raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_DT, 3);
++	if (raw < 0) return -1;
++
++	tenms = (uint32_t)raw & 0xffffff;
++
++	res->tv_usec = (suseconds_t)(tenms % 100) * 10000;
++	res->tv_sec  = (time_t)(tenms / 100);
++
++	return 0;
++}
++
++
++/* Read the i8042 cycle timer (a.k.a. periodic) */
++static inline int hp_sdc_rtc_read_ct(struct timeval *res) {
++	int64_t raw;
++	uint32_t tenms;
++
++	raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_CT, 3);
++	if (raw < 0) return -1;
++
++	tenms = (uint32_t)raw & 0xffffff;
++
++	res->tv_usec = (suseconds_t)(tenms % 100) * 10000;
++	res->tv_sec  = (time_t)(tenms / 100);
++
++	return 0;
++}
++
++
++/* Set the i8042 real-time clock */
++static int hp_sdc_rtc_set_rt (struct timeval *setto)
++{
++	uint32_t tenms;
++	unsigned int days;
++	hp_sdc_transaction t;
++	uint8_t tseq[11] = {
++		HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT,
++		HP_SDC_CMD_SET_RTMS, 3, 0, 0, 0,
++		HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT,
++		HP_SDC_CMD_SET_RTD, 2, 0, 0 
++	};
++
++	t.endidx = 10;
++
++	if (0xffff < setto->tv_sec / 86400) return -1;
++	days = setto->tv_sec / 86400;
++	if (0xffff < setto->tv_usec / 1000000 / 86400) return -1;
++	days += ((setto->tv_sec % 86400) + setto->tv_usec / 1000000) / 86400;
++	if (days > 0xffff) return -1;
++
++	if (0xffffff < setto->tv_sec) return -1;
++	tenms  = setto->tv_sec * 100;
++	if (0xffffff < setto->tv_usec / 10000) return -1;
++	tenms += setto->tv_usec / 10000;
++	if (tenms > 0xffffff) return -1;
++
++	tseq[3] = (uint8_t)(tenms & 0xff);
++	tseq[4] = (uint8_t)((tenms >> 8)  & 0xff);
++	tseq[5] = (uint8_t)((tenms >> 16) & 0xff);
++
++	tseq[9] = (uint8_t)(days & 0xff);
++	tseq[10] = (uint8_t)((days >> 8) & 0xff);
++
++	t.seq =	tseq;
++
++	if (hp_sdc_enqueue_transaction(&t)) return -1;
++	return 0;
++}
++
++/* Set the i8042 fast handshake timer */
++static int hp_sdc_rtc_set_fhs (struct timeval *setto)
++{
++	uint32_t tenms;
++	hp_sdc_transaction t;
++	uint8_t tseq[5] = {
++		HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT,
++		HP_SDC_CMD_SET_FHS, 2, 0, 0
++	};
++
++	t.endidx = 4;
++
++	if (0xffff < setto->tv_sec) return -1;
++	tenms  = setto->tv_sec * 100;
++	if (0xffff < setto->tv_usec / 10000) return -1;
++	tenms += setto->tv_usec / 10000;
++	if (tenms > 0xffff) return -1;
++
++	tseq[3] = (uint8_t)(tenms & 0xff);
++	tseq[4] = (uint8_t)((tenms >> 8)  & 0xff);
++
++	t.seq =	tseq;
++
++	if (hp_sdc_enqueue_transaction(&t)) return -1;
++	return 0;
++}
++
++
++/* Set the i8042 match timer (a.k.a. alarm) */
++#define hp_sdc_rtc_set_mt (setto) \
++	hp_sdc_rtc_set_i8042timer(setto, HP_SDC_CMD_SET_MT)
++
++/* Set the i8042 delay timer */
++#define hp_sdc_rtc_set_dt (setto) \
++	hp_sdc_rtc_set_i8042timer(setto, HP_SDC_CMD_SET_DT)
++
++/* Set the i8042 cycle timer (a.k.a. periodic) */
++#define hp_sdc_rtc_set_ct (setto) \
++	hp_sdc_rtc_set_i8042timer(setto, HP_SDC_CMD_SET_CT)
++
++/* Set one of the i8042 3-byte wide timers */
++static int hp_sdc_rtc_set_i8042timer (struct timeval *setto, uint8_t setcmd)
++{
++	uint32_t tenms;
++	hp_sdc_transaction t;
++	uint8_t tseq[6] = {
++		HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT,
++		0, 3, 0, 0, 0
++	};
++
++	t.endidx = 6;
++
++	if (0xffffff < setto->tv_sec) return -1;
++	tenms  = setto->tv_sec * 100;
++	if (0xffffff < setto->tv_usec / 10000) return -1;
++	tenms += setto->tv_usec / 10000;
++	if (tenms > 0xffffff) return -1;
++
++	tseq[1] = setcmd;
++	tseq[3] = (uint8_t)(tenms & 0xff);
++	tseq[4] = (uint8_t)((tenms >> 8)  & 0xff);
++	tseq[5] = (uint8_t)((tenms >> 16)  & 0xff);
++
++	t.seq =			tseq;
++
++	if (hp_sdc_enqueue_transaction(&t)) { 
++		return -1;
++	}
++	return 0;
++}
++
++static loff_t hp_sdc_rtc_llseek(struct file *file, loff_t offset, int origin)
++{
++        return -ESPIPE;
++}
++
++static ssize_t hp_sdc_rtc_read(struct file *file, char *buf,
++			       size_t count, loff_t *ppos) {
++	ssize_t retval;
++
++        if (count < sizeof(unsigned long))
++                return -EINVAL;
++
++	retval = put_user(68, (unsigned long *)buf);
++	return retval;
++}
++
++static unsigned int hp_sdc_rtc_poll(struct file *file, poll_table *wait)
++{
++        unsigned long l;
++
++	l = 0;
++        if (l != 0)
++                return POLLIN | POLLRDNORM;
++        return 0;
++}
++
++static int hp_sdc_rtc_open(struct inode *inode, struct file *file)
++{
++        return 0;
++}
++
++static int hp_sdc_rtc_release(struct inode *inode, struct file *file)
++{
++	/* Turn off interrupts? */
++
++        if (file->f_flags & FASYNC) {
++                hp_sdc_rtc_fasync (-1, file, 0);
++        }
++
++        return 0;
++}
++
++static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on)
++{
++        return fasync_helper (fd, filp, on, &hp_sdc_rtc_async_queue);
++}
++
++static int hp_sdc_rtc_proc_output (char *buf)
++{
++#define YN(bit) ("no")
++#define NY(bit) ("yes")
++        char *p;
++        struct rtc_time tm;
++	struct timeval tv;
++
++	memset(&tm, 0, sizeof(struct rtc_time));
++
++	p = buf;
++
++	if (hp_sdc_rtc_read_bbrtc(&tm)) {
++		p += sprintf(p, "BBRTC\t\t: READ FAILED!\n");
++	} else {
++		p += sprintf(p,
++			     "rtc_time\t: %02d:%02d:%02d\n"
++			     "rtc_date\t: %04d-%02d-%02d\n"
++			     "rtc_epoch\t: %04lu\n",
++			     tm.tm_hour, tm.tm_min, tm.tm_sec,
++			     tm.tm_year + 1900, tm.tm_mon + 1, 
++			     tm.tm_mday, epoch);
++	}
++
++	if (hp_sdc_rtc_read_rt(&tv)) {
++		p += sprintf(p, "i8042 rtc\t: READ FAILED!\n");
++	} else {
++		p += sprintf(p, "i8042 rtc\t: %ld.%02d seconds\n", 
++			     tv.tv_sec, tv.tv_usec/1000);
++	}
++
++	if (hp_sdc_rtc_read_fhs(&tv)) {
++		p += sprintf(p, "handshake\t: READ FAILED!\n");
++	} else {
++        	p += sprintf(p, "handshake\t: %ld.%02d seconds\n", 
++			     tv.tv_sec, tv.tv_usec/1000);
++	}
++
++	if (hp_sdc_rtc_read_mt(&tv)) {
++		p += sprintf(p, "alarm\t\t: READ FAILED!\n");
++	} else {
++		p += sprintf(p, "alarm\t\t: %ld.%02d seconds\n", 
++			     tv.tv_sec, tv.tv_usec/1000);
++	}
++
++	if (hp_sdc_rtc_read_dt(&tv)) {
++		p += sprintf(p, "delay\t\t: READ FAILED!\n");
++	} else {
++		p += sprintf(p, "delay\t\t: %ld.%02d seconds\n", 
++			     tv.tv_sec, tv.tv_usec/1000);
++	}
++
++	if (hp_sdc_rtc_read_ct(&tv)) {
++		p += sprintf(p, "periodic\t: READ FAILED!\n");
++	} else {
++		p += sprintf(p, "periodic\t: %ld.%02d seconds\n", 
++			     tv.tv_sec, tv.tv_usec/1000);
++	}
++
++        p += sprintf(p,
++                     "DST_enable\t: %s\n"
++                     "BCD\t\t: %s\n"
++                     "24hr\t\t: %s\n"
++                     "square_wave\t: %s\n"
++                     "alarm_IRQ\t: %s\n"
++                     "update_IRQ\t: %s\n"
++                     "periodic_IRQ\t: %s\n"
++		     "periodic_freq\t: %ld\n"
++                     "batt_status\t: %s\n",
++                     YN(RTC_DST_EN),
++                     NY(RTC_DM_BINARY),
++                     YN(RTC_24H),
++                     YN(RTC_SQWE),
++                     YN(RTC_AIE),
++                     YN(RTC_UIE),
++                     YN(RTC_PIE),
++                     1UL,
++                     1 ? "okay" : "dead");
++
++        return  p - buf;
++#undef YN
++#undef NY
++}
++
++static int hp_sdc_rtc_read_proc(char *page, char **start, off_t off,
++                         int count, int *eof, void *data)
++{
++	int len = hp_sdc_rtc_proc_output (page);
++        if (len <= off+count) *eof = 1;
++        *start = page + off;
++        len -= off;
++        if (len>count) len = count;
++        if (len<0) len = 0;
++        return len;
++}
++
++static int hp_sdc_rtc_ioctl(struct inode *inode, struct file *file, 
++			    unsigned int cmd, unsigned long arg)
++{
++#if 1
++	return -EINVAL;
++#else
++	
++        struct rtc_time wtime; 
++	struct timeval ttime;
++	int use_wtime = 0;
++
++	/* This needs major work. */
++
++        switch (cmd) {
++
++        case RTC_AIE_OFF:       /* Mask alarm int. enab. bit    */
++        case RTC_AIE_ON:        /* Allow alarm interrupts.      */
++	case RTC_PIE_OFF:       /* Mask periodic int. enab. bit */
++        case RTC_PIE_ON:        /* Allow periodic ints          */
++        case RTC_UIE_ON:        /* Allow ints for RTC updates.  */
++        case RTC_UIE_OFF:       /* Allow ints for RTC updates.  */
++        {
++		/* We cannot mask individual user timers and we
++		   cannot tell them apart when they occur, so it 
++		   would be disingenuous to succeed these IOCTLs */
++		return -EINVAL;
++        }
++        case RTC_ALM_READ:      /* Read the present alarm time */
++        {
++		if (hp_sdc_rtc_read_mt(&ttime)) return -EFAULT;
++		if (hp_sdc_rtc_read_bbrtc(&wtime)) return -EFAULT;
++
++		wtime.tm_hour = ttime.tv_sec / 3600;  ttime.tv_sec %= 3600;
++		wtime.tm_min  = ttime.tv_sec / 60;    ttime.tv_sec %= 60;
++		wtime.tm_sec  = ttime.tv_sec;
++                
++		break;
++        }
++        case RTC_IRQP_READ:     /* Read the periodic IRQ rate.  */
++        {
++                return put_user(hp_sdc_rtc_freq, (unsigned long *)arg);
++        }
++        case RTC_IRQP_SET:      /* Set periodic IRQ rate.       */
++        {
++                /* 
++                 * The max we can do is 100Hz.
++		 */
++
++                if ((arg < 1) || (arg > 100)) return -EINVAL;
++		ttime.tv_sec = 0;
++		ttime.tv_usec = 1000000 / arg;
++		if (hp_sdc_rtc_set_ct(&ttime)) return -EFAULT;
++		hp_sdc_rtc_freq = arg;
++                return 0;
++        }
++        case RTC_ALM_SET:       /* Store a time into the alarm */
++        {
++                /*
++                 * This expects a struct hp_sdc_rtc_time. Writing 0xff means
++                 * "don't care" or "match all" for PC timers.  The HP SDC
++		 * does not support that perk, but it could be emulated fairly
++		 * easily.  Only the tm_hour, tm_min and tm_sec are used.
++		 * We could do it with 10ms accuracy with the HP SDC, if the 
++		 * rtc interface left us a way to do that.
++                 */
++                struct hp_sdc_rtc_time alm_tm;
++
++                if (copy_from_user(&alm_tm, (struct hp_sdc_rtc_time*)arg,
++                                   sizeof(struct hp_sdc_rtc_time)))
++                       return -EFAULT;
++
++                if (alm_tm.tm_hour > 23) return -EINVAL;
++		if (alm_tm.tm_min  > 59) return -EINVAL;
++		if (alm_tm.tm_sec  > 59) return -EINVAL;  
++
++		ttime.sec = alm_tm.tm_hour * 3600 + 
++		  alm_tm.tm_min * 60 + alm_tm.tm_sec;
++		ttime.usec = 0;
++		if (hp_sdc_rtc_set_mt(&ttime)) return -EFAULT;
++                return 0;
++        }
++        case RTC_RD_TIME:       /* Read the time/date from RTC  */
++        {
++		if (hp_sdc_rtc_read_bbrtc(&wtime)) return -EFAULT;
++                break;
++        }
++        case RTC_SET_TIME:      /* Set the RTC */
++        {
++                struct rtc_time hp_sdc_rtc_tm;
++                unsigned char mon, day, hrs, min, sec, leap_yr;
++                unsigned int yrs;
++
++                if (!capable(CAP_SYS_TIME))
++                        return -EACCES;
++		if (copy_from_user(&hp_sdc_rtc_tm, (struct rtc_time *)arg,
++                                   sizeof(struct rtc_time)))
++                        return -EFAULT;
++
++                yrs = hp_sdc_rtc_tm.tm_year + 1900;
++                mon = hp_sdc_rtc_tm.tm_mon + 1;   /* tm_mon starts at zero */
++                day = hp_sdc_rtc_tm.tm_mday;
++                hrs = hp_sdc_rtc_tm.tm_hour;
++                min = hp_sdc_rtc_tm.tm_min;
++                sec = hp_sdc_rtc_tm.tm_sec;
++
++                if (yrs < 1970)
++                        return -EINVAL;
++
++                leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
++
++                if ((mon > 12) || (day == 0))
++                        return -EINVAL;
++                if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
++                        return -EINVAL;
++		if ((hrs >= 24) || (min >= 60) || (sec >= 60))
++                        return -EINVAL;
++
++                if ((yrs -= eH) > 255)    /* They are unsigned */
++                        return -EINVAL;
++
++
++                return 0;
++        }
++        case RTC_EPOCH_READ:    /* Read the epoch.      */
++        {
++                return put_user (epoch, (unsigned long *)arg);
++        }
++        case RTC_EPOCH_SET:     /* Set the epoch.       */
++        {
++                /* 
++                 * There were no RTC clocks before 1900.
++                 */
++                if (arg < 1900)
++		  return -EINVAL;
++		if (!capable(CAP_SYS_TIME))
++		  return -EACCES;
++		
++                epoch = arg;
++                return 0;
++        }
++        default:
++                return -EINVAL;
++        }
++        return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0;
++#endif
++}
++
++static struct file_operations hp_sdc_rtc_fops = {
++        .owner =	THIS_MODULE,
++        .llseek =	hp_sdc_rtc_llseek,
++        .read =		hp_sdc_rtc_read,
++        .poll =		hp_sdc_rtc_poll,
++        .ioctl =	hp_sdc_rtc_ioctl,
++        .open =		hp_sdc_rtc_open,
++        .release =	hp_sdc_rtc_release,
++        .fasync =	hp_sdc_rtc_fasync,
++};
++
++static struct miscdevice hp_sdc_rtc_dev = {
++        .minor =	RTC_MINOR,
++        .name =		"rtc_HIL",
++        .fops =		&hp_sdc_rtc_fops
++};
++
++static int __init hp_sdc_rtc_init(void)
++{
++	int ret;
++
++	init_MUTEX(&i8042tregs);
++
++	if ((ret = hp_sdc_request_timer_irq(&hp_sdc_rtc_isr)))
++		return ret;
++	misc_register(&hp_sdc_rtc_dev);
++        create_proc_read_entry ("driver/rtc", 0, 0, 
++				hp_sdc_rtc_read_proc, NULL);
++
++	printk(KERN_INFO "HP i8042 SDC + MSM-58321 RTC support loaded "
++			 "(RTC v " RTC_VERSION ")\n");
++
++	return 0;
++}
++
++static void __exit hp_sdc_rtc_exit(void)
++{
++	remove_proc_entry ("driver/rtc", NULL);
++        misc_deregister(&hp_sdc_rtc_dev);
++	hp_sdc_release_timer_irq(hp_sdc_rtc_isr);
++        printk(KERN_INFO "HP i8042 SDC + MSM-58321 RTC support unloaded\n");
++}
++
++module_init(hp_sdc_rtc_init);
++module_exit(hp_sdc_rtc_exit);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/mouse/Kconfig CVS2_6_11_PA2/drivers/input/mouse/Kconfig
+--- LINUS_2_6_11/drivers/input/mouse/Kconfig	2005-03-02 04:19:08.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/mouse/Kconfig	2005-01-22 07:59:19.000000000 -0700
+@@ -129,3 +129,10 @@
+ 	  described in the source file). This driver also works with the
+ 	  digitizer (VSXXX-AB) DEC produced.
+ 
++config MOUSE_HIL
++	tristate "HIL pointers (mice etc)."
++	depends on GSC && INPUT_MOUSE
++	select HP_SDC
++	select HIL_MLC
++	help
++	  Say Y here to support HIL pointers.
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/mouse/Makefile CVS2_6_11_PA2/drivers/input/mouse/Makefile
+--- LINUS_2_6_11/drivers/input/mouse/Makefile	2005-03-02 04:19:08.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/mouse/Makefile	2005-01-12 13:16:32.000000000 -0700
+@@ -12,6 +12,7 @@
+ obj-$(CONFIG_MOUSE_PC110PAD)	+= pc110pad.o
+ obj-$(CONFIG_MOUSE_PS2)		+= psmouse.o
+ obj-$(CONFIG_MOUSE_SERIAL)	+= sermouse.o
++obj-$(CONFIG_MOUSE_HIL)		+= hil_ptr.o
+ obj-$(CONFIG_MOUSE_VSXXXAA)	+= vsxxxaa.o
+ 
+ psmouse-objs  := psmouse-base.o alps.o logips2pp.o synaptics.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/mouse/hil_ptr.c CVS2_6_11_PA2/drivers/input/mouse/hil_ptr.c
+--- LINUS_2_6_11/drivers/input/mouse/hil_ptr.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/mouse/hil_ptr.c	2004-10-27 14:17:19.000000000 -0600
+@@ -0,0 +1,414 @@
++/*
++ * Generic linux-input device driver for axis-bearing devices
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ *
++ */
++
++#include <linux/hil.h>
++#include <linux/input.h>
++#include <linux/serio.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/pci_ids.h>
++
++#define PREFIX "HIL PTR: "
++#define HIL_GENERIC_NAME "HIL pointer device"
++
++MODULE_AUTHOR("Brian S. Julin <bri at calyx.com>");
++MODULE_DESCRIPTION(HIL_GENERIC_NAME " driver");
++MODULE_LICENSE("Dual BSD/GPL");
++
++
++#define TABLET_SIMULATES_MOUSE	/* allow tablet to be used as mouse */
++#undef  TABLET_AUTOADJUST	/* auto-adjust valid tablet ranges */
++
++
++#define HIL_PTR_MAX_LENGTH 16
++
++struct hil_ptr {
++	struct input_dev dev;
++	struct serio *serio;
++
++	/* Input buffer and index for packets from HIL bus. */
++	hil_packet data[HIL_PTR_MAX_LENGTH];
++	int idx4; /* four counts per packet */
++
++	/* Raw device info records from HIL bus, see hil.h for fields. */
++	char	idd[HIL_PTR_MAX_LENGTH];	/* DID byte and IDD record */
++	char	rsc[HIL_PTR_MAX_LENGTH];	/* RSC record */
++	char	exd[HIL_PTR_MAX_LENGTH];	/* EXD record */
++	char	rnm[HIL_PTR_MAX_LENGTH + 1];	/* RNM record + NULL term. */
++
++	/* Extra device details not contained in struct input_dev. */
++	unsigned int nbtn, naxes;
++	unsigned int btnmap[7];
++
++	/* Something to sleep around with. */
++	struct semaphore sem;
++};
++
++/* Process a complete packet after transfer from the HIL */
++static void hil_ptr_process_record(struct hil_ptr *ptr)
++{
++	struct input_dev *dev = &ptr->dev;
++	hil_packet *data = ptr->data;
++	hil_packet p;
++	int idx, i, cnt, laxis;
++	int ax16, absdev;
++
++	idx = ptr->idx4/4;
++	p = data[idx - 1];
++
++	if ((p & ~HIL_CMDCT_POL) == 
++	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) goto report;
++	if ((p & ~HIL_CMDCT_RPL) == 
++	    (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL)) goto report;
++
++	/* Not a poll response.  See if we are loading config records. */
++	switch (p & HIL_PKT_DATA_MASK) {
++	case HIL_CMD_IDD:
++		for (i = 0; i < idx; i++)
++			ptr->idd[i] = ptr->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_PTR_MAX_LENGTH; i++)
++			ptr->idd[i] = 0;
++		break;
++	case HIL_CMD_RSC:
++		for (i = 0; i < idx; i++)
++			ptr->rsc[i] = ptr->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_PTR_MAX_LENGTH; i++)
++			ptr->rsc[i] = 0;
++		break;
++	case HIL_CMD_EXD:
++		for (i = 0; i < idx; i++)
++			ptr->exd[i] = ptr->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_PTR_MAX_LENGTH; i++)
++			ptr->exd[i] = 0;
++		break;
++	case HIL_CMD_RNM:
++		for (i = 0; i < idx; i++)
++			ptr->rnm[i] = ptr->data[i] & HIL_PKT_DATA_MASK;
++		for (; i < HIL_PTR_MAX_LENGTH + 1; i++)
++			ptr->rnm[i] = '\0';
++		break;
++	default:
++		/* These occur when device isn't present */
++		if (p == (HIL_ERR_INT | HIL_PKT_CMD)) break; 
++		/* Anything else we'd like to know about. */
++		printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p);
++		break;
++	}
++	goto out;
++
++ report:
++	if ((p & HIL_CMDCT_POL) != idx - 1) {
++		printk(KERN_WARNING PREFIX "Malformed poll packet %x (idx = %i)\n", p, idx);
++		goto out;
++	}
++
++	i = (ptr->data[0] & HIL_POL_AXIS_ALT) ? 3 : 0;
++	laxis = ptr->data[0] & HIL_POL_NUM_AXES_MASK;
++	laxis += i;
++
++	ax16 = ptr->idd[1] & HIL_IDD_HEADER_16BIT; /* 8 or 16bit resolution */
++	absdev = ptr->idd[1] & HIL_IDD_HEADER_ABS; 
++
++	for (cnt = 1; i < laxis; i++) {
++		unsigned int lo,hi,val;
++		lo = ptr->data[cnt++] & HIL_PKT_DATA_MASK;
++		hi = ax16 ? (ptr->data[cnt++] & HIL_PKT_DATA_MASK) : 0;
++		if (absdev) {
++			val = lo + (hi<<8);
++#ifdef TABLET_AUTOADJUST
++			if (val < ptr->dev.absmin[ABS_X + i])
++				ptr->dev.absmin[ABS_X + i] = val;
++			if (val > ptr->dev.absmax[ABS_X + i])
++				ptr->dev.absmax[ABS_X + i] = val;
++#endif
++			if (i%3) val = ptr->dev.absmax[ABS_X + i] - val;
++			input_report_abs(dev, ABS_X + i, val);
++		} else {
++			val = (int) (((int8_t)lo) | ((int8_t)hi<<8));
++			if (i%3) val *= -1;
++			input_report_rel(dev, REL_X + i, val);
++		}
++	}
++
++	while (cnt < idx - 1) {
++		unsigned int btn;
++		int up;
++		btn = ptr->data[cnt++];
++		up = btn & 1;
++		btn &= 0xfe;
++		if (btn == 0x8e) {
++			continue; /* TODO: proximity == touch? */
++		}
++		else if ((btn > 0x8c) || (btn < 0x80)) continue;
++		btn = (btn - 0x80) >> 1;
++		btn = ptr->btnmap[btn];
++		input_report_key(dev, btn, !up);
++	}
++	input_sync(dev);
++ out:
++	ptr->idx4 = 0;
++	up(&ptr->sem);
++}
++
++static void hil_ptr_process_err(struct hil_ptr *ptr) {
++	printk(KERN_WARNING PREFIX "errored HIL packet\n");
++	ptr->idx4 = 0;
++	up(&ptr->sem);
++	return;
++}
++
++static irqreturn_t hil_ptr_interrupt(struct serio *serio, 
++        unsigned char data, unsigned int flags, struct pt_regs *regs)
++{
++	struct hil_ptr *ptr;
++	hil_packet packet;
++	int idx;
++
++	ptr = (struct hil_ptr *)serio->private;
++	if (ptr == NULL) {
++		BUG();
++		return IRQ_HANDLED;
++	}
++
++	if (ptr->idx4 >= (HIL_PTR_MAX_LENGTH * sizeof(hil_packet))) {
++		hil_ptr_process_err(ptr);
++		return IRQ_HANDLED;
++	}
++	idx = ptr->idx4/4;
++	if (!(ptr->idx4 % 4)) ptr->data[idx] = 0;
++	packet = ptr->data[idx];
++	packet |= ((hil_packet)data) << ((3 - (ptr->idx4 % 4)) * 8);
++	ptr->data[idx] = packet;
++
++	/* Records of N 4-byte hil_packets must terminate with a command. */
++	if ((++(ptr->idx4)) % 4) return IRQ_HANDLED;
++	if ((packet & 0xffff0000) != HIL_ERR_INT) {
++		hil_ptr_process_err(ptr);
++		return IRQ_HANDLED;
++	}
++	if (packet & HIL_PKT_CMD) 
++		hil_ptr_process_record(ptr);
++	return IRQ_HANDLED;
++}
++
++static void hil_ptr_disconnect(struct serio *serio)
++{
++	struct hil_ptr *ptr;
++
++	ptr = (struct hil_ptr *)serio->private;
++	if (ptr == NULL) {
++		BUG();
++		return;
++	}
++
++	input_unregister_device(&ptr->dev);
++	serio_close(serio);
++	kfree(ptr);
++}
++
++static void hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
++{
++	struct hil_ptr	*ptr;
++	char		*txt;
++	unsigned int	i, naxsets, btntype;
++	uint8_t		did, *idd;
++
++	if (serio->type != (SERIO_HIL_MLC | SERIO_HIL)) return;
++
++	if (!(ptr = kmalloc(sizeof(struct hil_ptr), GFP_KERNEL))) return;
++	memset(ptr, 0, sizeof(struct hil_ptr));
++
++	if (serio_open(serio, driver)) goto bail0;
++
++	serio->private = ptr;
++	ptr->serio = serio;
++	ptr->dev.private = ptr;
++
++	init_MUTEX_LOCKED(&(ptr->sem));
++
++	/* Get device info.  MLC driver supplies devid/status/etc. */
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_IDD);
++	down(&(ptr->sem));
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_RSC);
++	down(&(ptr->sem));
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_RNM);
++	down(&(ptr->sem));
++
++	serio->write(serio, 0);
++	serio->write(serio, 0);
++	serio->write(serio, HIL_PKT_CMD >> 8);
++	serio->write(serio, HIL_CMD_EXD);
++	down(&(ptr->sem));
++
++	up(&(ptr->sem));
++
++	init_input_dev(&ptr->dev);
++	did = ptr->idd[0];
++	idd = ptr->idd + 1;
++	txt = "unknown";
++	if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) {
++		ptr->dev.evbit[0] = BIT(EV_REL);
++		txt = "relative";
++	}
++
++	if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_ABS) {
++		ptr->dev.evbit[0] = BIT(EV_ABS);
++		txt = "absolute";
++	}
++	if (!ptr->dev.evbit[0]) {
++		goto bail1;
++	}
++
++	ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd);
++	if (ptr->nbtn) ptr->dev.evbit[0] |= BIT(EV_KEY);
++
++	naxsets = HIL_IDD_NUM_AXSETS(*idd);
++	ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd);
++
++	printk(KERN_INFO PREFIX "HIL pointer device found (did: 0x%02x, axis: %s)\n",
++			did, txt);
++	printk(KERN_INFO PREFIX "HIL pointer has %i buttons and %i sets of %i axes\n",
++			ptr->nbtn, naxsets, ptr->naxes);
++	
++	btntype = BTN_MISC;
++	if ((did & HIL_IDD_DID_ABS_TABLET_MASK) == HIL_IDD_DID_ABS_TABLET)
++#ifdef TABLET_SIMULATES_MOUSE
++		btntype = BTN_TOUCH;
++#else
++		btntype = BTN_DIGI;
++#endif
++	if ((did & HIL_IDD_DID_ABS_TSCREEN_MASK) == HIL_IDD_DID_ABS_TSCREEN)
++		btntype = BTN_TOUCH;
++		
++	if ((did & HIL_IDD_DID_REL_MOUSE_MASK) == HIL_IDD_DID_REL_MOUSE)
++		btntype = BTN_MOUSE;
++
++	for (i = 0; i < ptr->nbtn; i++) {
++		set_bit(btntype | i, ptr->dev.keybit);
++		ptr->btnmap[i] = btntype | i;
++	}
++
++	if (btntype == BTN_MOUSE) {
++		/* Swap buttons 2 and 3 */
++		ptr->btnmap[1] = BTN_MIDDLE;
++		ptr->btnmap[2] = BTN_RIGHT;
++	}
++
++	if ((did & HIL_IDD_DID_TYPE_MASK) == HIL_IDD_DID_TYPE_REL) {
++		for (i = 0; i < ptr->naxes; i++) {
++			set_bit(REL_X + i, ptr->dev.relbit);
++		}
++		for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) {
++			set_bit(REL_X + i, ptr->dev.relbit);
++		}
++	} else {
++		for (i = 0; i < ptr->naxes; i++) {
++	  		set_bit(ABS_X + i, ptr->dev.absbit);
++			ptr->dev.absmin[ABS_X + i] = 0;
++			ptr->dev.absmax[ABS_X + i] = 
++				HIL_IDD_AXIS_MAX((ptr->idd + 1), i);
++		}
++		for (i = 3; (i < ptr->naxes + 3) && (naxsets > 1); i++) {
++			set_bit(ABS_X + i, ptr->dev.absbit);
++			ptr->dev.absmin[ABS_X + i] = 0;
++			ptr->dev.absmax[ABS_X + i] = 
++				HIL_IDD_AXIS_MAX((ptr->idd + 1), (i - 3));
++		}
++#ifdef TABLET_AUTOADJUST
++		for (i = 0; i < ABS_MAX; i++) {
++			int diff = ptr->dev.absmax[ABS_X + i] / 10;
++			ptr->dev.absmin[ABS_X + i] += diff;
++			ptr->dev.absmax[ABS_X + i] -= diff;
++		}
++#endif
++	}
++
++	ptr->dev.name = strlen(ptr->rnm) ? ptr->rnm : HIL_GENERIC_NAME;
++
++	ptr->dev.id.bustype	= BUS_HIL;
++	ptr->dev.id.vendor	= PCI_VENDOR_ID_HP;
++	ptr->dev.id.product	= 0x0001; /* TODO: get from ptr->rsc */
++	ptr->dev.id.version	= 0x0100; /* TODO: get from ptr->rsc */
++	ptr->dev.dev		= &serio->dev;
++
++	input_register_device(&ptr->dev);
++	printk(KERN_INFO "input: %s (%s), ID: %d\n",
++                ptr->dev.name, 
++		(btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad",
++		did);
++
++	return;
++ bail1:
++	serio_close(serio);
++ bail0:
++	kfree(ptr);
++	return;
++}
++
++
++static struct serio_driver hil_ptr_serio_driver = {
++	.driver		= {
++		.name	= "hil_ptr",
++	},
++	.description	= "HP HIL mouse/tablet driver",
++	.connect =	hil_ptr_connect,
++	.disconnect =	hil_ptr_disconnect,
++	.interrupt =	hil_ptr_interrupt
++};
++
++static int __init hil_ptr_init(void)
++{
++	serio_register_driver(&hil_ptr_serio_driver);
++        return 0;
++}
++                
++static void __exit hil_ptr_exit(void)
++{
++	serio_unregister_driver(&hil_ptr_serio_driver);
++}
++                        
++module_init(hil_ptr_init);
++module_exit(hil_ptr_exit);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/serio/Kconfig CVS2_6_11_PA2/drivers/input/serio/Kconfig
+--- LINUS_2_6_11/drivers/input/serio/Kconfig	2005-03-02 04:19:09.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/serio/Kconfig	2005-01-12 13:16:32.000000000 -0700
+@@ -48,8 +48,7 @@
+ 
+ config SERIO_CT82C710
+ 	tristate "ct82c710 Aux port controller"
+-	depends on SERIO
+-	depends on !PARISC
++	depends on X86 && SERIO
+ 	---help---
+ 	  Say Y here if you have a Texas Instruments TravelMate notebook
+ 	  equipped with the ct82c710 chip and want to use a mouse connected
+@@ -111,6 +110,32 @@
+ 	  To compile this driver as a module, choose M here: the
+ 	  module will be called gscps2.
+ 
++config HP_SDC
++	tristate "HP System Device Controller i8042 Support"
++	depends on GSC && SERIO
++	default y
++	---help---
++	  This option enables supports for the the "System Device
++	  Controller", an i8042 carrying microcode to manage a
++	  few miscellanous devices on some Hewlett Packard systems.
++	  The SDC itself contains a 10ms resolution timer/clock capable
++	  of delivering interrupts on a periodic and one-shot basis.
++	  The SDC may also be connected to a battery-backed real-time
++	  clock, a basic audio waveform generator, and an HP-HIL Master
++	  Link Controller serving up to seven input devices.
++
++	  By itself this option is rather useless, but enabling it will
++	  enable selection of drivers for the abovementioned devices.
++	  It is, however, incompatible with the old, reliable HIL keyboard
++	  driver, and the new HIL driver is experimental, so if you plan
++	  to use a HIL keyboard as your primary keyboard, you may wish
++	  to keep using that driver until the new HIL drivers have had
++	  more testing.
++
++config HIL_MLC
++	tristate "HIL MLC Support (needed for HIL input devices)"
++	depends on HP_SDC
++
+ config SERIO_PCIPS2
+ 	tristate "PCI PS/2 keyboard and PS/2 mouse controller"
+ 	depends on PCI && SERIO
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/serio/Makefile CVS2_6_11_PA2/drivers/input/serio/Makefile
+--- LINUS_2_6_11/drivers/input/serio/Makefile	2005-03-02 04:19:09.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/serio/Makefile	2005-01-12 13:16:32.000000000 -0700
+@@ -2,8 +2,6 @@
+ # Makefile for the input core drivers.
+ #
+ 
+-# Each configuration option enables a list of files.
+-
+ obj-$(CONFIG_SERIO)		+= serio.o
+ obj-$(CONFIG_SERIO_I8042)	+= i8042.o
+ obj-$(CONFIG_SERIO_PARKBD)	+= parkbd.o
+@@ -15,6 +13,8 @@
+ obj-$(CONFIG_SERIO_Q40KBD)	+= q40kbd.o
+ obj-$(CONFIG_SERIO_98KBD)	+= 98kbd-io.o
+ obj-$(CONFIG_SERIO_GSCPS2)	+= gscps2.o
++obj-$(CONFIG_HP_SDC)		+= hp_sdc.o
++obj-$(CONFIG_HIL_MLC)		+= hp_sdc_mlc.o hil_mlc.o
+ obj-$(CONFIG_SERIO_PCIPS2)	+= pcips2.o
+ obj-$(CONFIG_SERIO_MACEPS2)	+= maceps2.o
+ obj-$(CONFIG_SERIO_LIBPS2)	+= libps2.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/serio/gscps2.c CVS2_6_11_PA2/drivers/input/serio/gscps2.c
+--- LINUS_2_6_11/drivers/input/serio/gscps2.c	2005-03-02 04:19:09.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/serio/gscps2.c	2005-01-13 08:38:43.000000000 -0700
+@@ -3,7 +3,7 @@
+  *
+  * Copyright (c) 2004 Helge Deller <deller at gmx.de>
+  * Copyright (c) 2002 Laurent Canet <canetl at esiee.fr>
+- * Copyright (c) 2002 Thibaut Varene <varenet at esiee.fr>
++ * Copyright (c) 2002 Thibaut Varene <varenet at parisc-linux.org>
+  *
+  * Pieces of code based on linux-2.4's hp_mouse.c & hp_keyb.c
+  * 	Copyright (c) 1999 Alex deVries <alex at onefishtwo.ca>
+@@ -37,8 +37,8 @@
+ #include <asm/io.h>
+ #include <asm/parisc-device.h>
+ 
+-MODULE_AUTHOR("Laurent Canet <canetl at esiee.fr>, Thibaut Varene <varenet at esiee.fr>, Helge Deller <deller at gmx.de>");
+-MODULE_DESCRIPTION("HP GSC PS/2 port driver");
++MODULE_AUTHOR("Laurent Canet <canetl at esiee.fr>, Thibaut Varene <varenet at parisc-linux.org>, Helge Deller <deller at gmx.de>");
++MODULE_DESCRIPTION("HP GSC PS2 port driver");
+ MODULE_LICENSE("GPL");
+ MODULE_DEVICE_TABLE(parisc, gscps2_device_tbl);
+ 
+@@ -448,7 +448,7 @@
+ };
+ 
+ static struct parisc_driver parisc_ps2_driver = {
+-	.name		= "GSC PS/2",
++	.name		= "GSC PS2",
+ 	.id_table	= gscps2_device_tbl,
+ 	.probe		= gscps2_probe,
+ 	.remove		= gscps2_remove,
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/serio/hil_mlc.c CVS2_6_11_PA2/drivers/input/serio/hil_mlc.c
+--- LINUS_2_6_11/drivers/input/serio/hil_mlc.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/serio/hil_mlc.c	2004-10-30 13:51:50.000000000 -0600
+@@ -0,0 +1,949 @@
++/*
++ * HIL MLC state machine and serio interface driver
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ *
++ *
++ *	Driver theory of operation:
++ *
++ *	Some access methods and an ISR is defined by the sub-driver 
++ *	(e.g. hp_sdc_mlc.c).  These methods are expected to provide a 
++ *	few bits of logic in addition to raw access to the HIL MLC, 
++ *	specifically, the ISR, which is entirely registered by the 
++ *	sub-driver and invoked directly, must check for record 
++ *	termination or packet match, at which point a semaphore must
++ *	be cleared and then the hil_mlcs_tasklet must be scheduled.
++ *
++ *	The hil_mlcs_tasklet processes the state machine for all MLCs
++ *	each time it runs, checking each MLC's progress at the current
++ *	node in the state machine, and moving the MLC to subsequent nodes
++ *	in the state machine when appropriate.  It will reschedule
++ *	itself if output is pending.  (This rescheduling should be replaced
++ *	at some point with a sub-driver-specific mechanism.)
++ *
++ *	A timer task prods the tasklet once per second to prevent 
++ *	hangups when attached devices do not return expected data
++ *	and to initiate probes of the loop for new devices.
++ */
++
++#include <linux/hil_mlc.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <linux/timer.h>
++#include <linux/sched.h>
++#include <linux/list.h>
++
++MODULE_AUTHOR("Brian S. Julin <bri at calyx.com>");
++MODULE_DESCRIPTION("HIL MLC serio");
++MODULE_LICENSE("Dual BSD/GPL");
++
++EXPORT_SYMBOL(hil_mlc_register);
++EXPORT_SYMBOL(hil_mlc_unregister);
++
++#define PREFIX "HIL MLC: "
++
++static LIST_HEAD(hil_mlcs);
++static rwlock_t			hil_mlcs_lock = RW_LOCK_UNLOCKED;
++static struct timer_list	hil_mlcs_kicker;
++static int			hil_mlcs_probe;
++
++static void hil_mlcs_process(unsigned long unused);
++DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0);
++
++
++/* #define HIL_MLC_DEBUG */
++
++/********************** Device info/instance management **********************/
++
++static void hil_mlc_clear_di_map (hil_mlc *mlc, int val) {
++	int j;
++	for (j = val; j < 7 ; j++) {
++		mlc->di_map[j] = -1;
++	}
++}
++
++static void hil_mlc_clear_di_scratch (hil_mlc *mlc) {
++	memset(&(mlc->di_scratch), 0, sizeof(mlc->di_scratch));
++}
++
++static void hil_mlc_copy_di_scratch (hil_mlc *mlc, int idx) {
++	memcpy(&(mlc->di[idx]), &(mlc->di_scratch), sizeof(mlc->di_scratch));
++}
++
++static int hil_mlc_match_di_scratch (hil_mlc *mlc) {
++	int idx;
++
++	for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) {
++		int j, found;
++
++		/* In-use slots are not eligible. */
++		found = 0;
++		for (j = 0; j < 7 ; j++) {
++			if (mlc->di_map[j] == idx) found++;
++		}
++		if (found) continue;
++		if (!memcmp(mlc->di + idx, 
++			    &(mlc->di_scratch), 
++			    sizeof(mlc->di_scratch))) break;
++	}
++	return((idx >= HIL_MLC_DEVMEM) ? -1 : idx);
++}
++
++static int hil_mlc_find_free_di(hil_mlc *mlc) {
++	int idx;
++	/* TODO: Pick all-zero slots first, failing that, 
++	 * randomize the slot picked among those eligible. 
++	 */
++	for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) {
++		int j, found;
++		found = 0;
++		for (j = 0; j < 7 ; j++) {
++			if (mlc->di_map[j] == idx) found++;
++		}
++		if (!found) break;
++	}
++	return(idx); /* Note: It is guaranteed at least one above will match */
++}
++
++static inline void hil_mlc_clean_serio_map(hil_mlc *mlc) {
++	int idx;
++	for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) {
++		int j, found;
++		found = 0;
++		for (j = 0; j < 7 ; j++) {
++			if (mlc->di_map[j] == idx) found++;
++		}
++		if (!found) mlc->serio_map[idx].di_revmap = -1;
++	}
++}
++
++static void hil_mlc_send_polls(hil_mlc *mlc) {
++	int did, i, cnt;
++	struct serio *serio;
++	struct serio_driver *drv;
++
++	i = cnt = 0;
++	did = (mlc->ipacket[0] & HIL_PKT_ADDR_MASK) >> 8;
++	serio = did ? mlc->serio[mlc->di_map[did - 1]] : NULL;
++	drv = (serio != NULL) ? serio->drv : NULL;
++
++	while (mlc->icount < 15 - i) {
++		hil_packet p;
++		p = mlc->ipacket[i];
++		if (did != (p & HIL_PKT_ADDR_MASK) >> 8) {
++			if (drv == NULL || drv->interrupt == NULL) goto skip;
++
++			drv->interrupt(serio, 0, 0, NULL);
++			drv->interrupt(serio, HIL_ERR_INT >> 16, 0, NULL);
++			drv->interrupt(serio, HIL_PKT_CMD >> 8,  0, NULL);
++			drv->interrupt(serio, HIL_CMD_POL + cnt, 0, NULL);
++		skip:
++			did = (p & HIL_PKT_ADDR_MASK) >> 8;
++			serio = did ? mlc->serio[mlc->di_map[did-1]] : NULL;
++			drv = (serio != NULL) ? serio->drv : NULL;
++			cnt = 0;
++		}
++		cnt++; i++;
++		if (drv == NULL || drv->interrupt == NULL) continue;
++		drv->interrupt(serio, (p >> 24), 0, NULL);
++		drv->interrupt(serio, (p >> 16) & 0xff, 0, NULL);
++		drv->interrupt(serio, (p >> 8) & ~HIL_PKT_ADDR_MASK, 0, NULL);
++		drv->interrupt(serio, p & 0xff, 0, NULL);
++	}
++}
++
++/*************************** State engine *********************************/
++
++#define HILSEN_SCHED	0x000100	/* Schedule the tasklet		*/
++#define HILSEN_BREAK	0x000200	/* Wait until next pass		*/
++#define HILSEN_UP	0x000400	/* relative node#, decrement	*/
++#define HILSEN_DOWN	0x000800	/* relative node#, increment	*/
++#define HILSEN_FOLLOW	0x001000	/* use retval as next node#	*/
++
++#define HILSEN_MASK	0x0000ff
++#define HILSEN_START	0
++#define HILSEN_RESTART	1
++#define HILSEN_DHR	9
++#define HILSEN_DHR2	10
++#define HILSEN_IFC	14
++#define HILSEN_HEAL0	16
++#define HILSEN_HEAL	18
++#define HILSEN_ACF      21
++#define HILSEN_ACF2	22
++#define HILSEN_DISC0	25
++#define HILSEN_DISC	27
++#define HILSEN_MATCH	40
++#define HILSEN_OPERATE	41
++#define HILSEN_PROBE	44
++#define HILSEN_DSR	52
++#define HILSEN_REPOLL	55
++#define HILSEN_IFCACF	58
++#define HILSEN_END	60
++
++#define HILSEN_NEXT	(HILSEN_DOWN | 1)
++#define HILSEN_SAME	(HILSEN_DOWN | 0)
++#define HILSEN_LAST	(HILSEN_UP | 1)
++
++#define HILSEN_DOZE	(HILSEN_SAME | HILSEN_SCHED | HILSEN_BREAK)
++#define HILSEN_SLEEP	(HILSEN_SAME | HILSEN_BREAK)
++
++static int hilse_match(hil_mlc *mlc, int unused) {
++	int rc;
++	rc = hil_mlc_match_di_scratch(mlc);
++	if (rc == -1) {
++		rc = hil_mlc_find_free_di(mlc);
++		if (rc == -1) goto err;
++#ifdef HIL_MLC_DEBUG
++		printk(KERN_DEBUG PREFIX "new in slot %i\n", rc);
++#endif
++		hil_mlc_copy_di_scratch(mlc, rc);
++		mlc->di_map[mlc->ddi] = rc;
++		mlc->serio_map[rc].di_revmap = mlc->ddi;
++		hil_mlc_clean_serio_map(mlc);
++		serio_rescan(mlc->serio[rc]);
++		return -1;
++	}
++	mlc->di_map[mlc->ddi] = rc;
++#ifdef HIL_MLC_DEBUG
++	printk(KERN_DEBUG PREFIX "same in slot %i\n", rc);
++#endif
++	mlc->serio_map[rc].di_revmap = mlc->ddi;
++	hil_mlc_clean_serio_map(mlc);
++	return 0;
++ err:
++	printk(KERN_ERR PREFIX "Residual device slots exhausted, close some serios!\n");
++	return 1;
++}
++
++/* An LCV used to prevent runaway loops, forces 5 second sleep when reset. */
++static int hilse_init_lcv(hil_mlc *mlc, int unused) {
++	struct timeval tv;
++
++	do_gettimeofday(&tv);
++
++	if(mlc->lcv == 0) goto restart;  /* First init, no need to dally */
++	if(tv.tv_sec - mlc->lcv_tv.tv_sec < 5) return -1;
++ restart:
++	mlc->lcv_tv = tv;
++	mlc->lcv = 0;
++	return 0;
++}
++
++static int hilse_inc_lcv(hil_mlc *mlc, int lim) {
++	if (mlc->lcv++ >= lim) return -1;
++	return 0;
++}
++
++#if 0
++static int hilse_set_lcv(hil_mlc *mlc, int val) {
++	mlc->lcv = val;
++	return 0;
++}
++#endif
++
++/* Management of the discovered device index (zero based, -1 means no devs) */
++static int hilse_set_ddi(hil_mlc *mlc, int val) {
++	mlc->ddi = val;
++	hil_mlc_clear_di_map(mlc, val + 1);
++	return 0;
++}
++
++static int hilse_dec_ddi(hil_mlc *mlc, int unused) {
++	mlc->ddi--;
++	if (mlc->ddi <= -1) { 
++		mlc->ddi = -1;
++		hil_mlc_clear_di_map(mlc, 0);
++		return -1;
++	}
++	hil_mlc_clear_di_map(mlc, mlc->ddi + 1);
++	return 0;
++}
++
++static int hilse_inc_ddi(hil_mlc *mlc, int unused) {
++	if (mlc->ddi >= 6) {
++		BUG();
++		return -1;
++	}
++	mlc->ddi++;
++	return 0;
++}
++
++static int hilse_take_idd(hil_mlc *mlc, int unused) {
++	int i;
++
++	/* Help the state engine: 
++	 * Is this a real IDD response or just an echo? 
++	 *
++	 * Real IDD response does not start with a command. 
++	 */
++	if (mlc->ipacket[0] & HIL_PKT_CMD) goto bail;
++	/* Should have the command echoed further down. */
++	for (i = 1; i < 16; i++) {
++		if (((mlc->ipacket[i] & HIL_PKT_ADDR_MASK) == 
++		     (mlc->ipacket[0] & HIL_PKT_ADDR_MASK)) &&
++		    (mlc->ipacket[i] & HIL_PKT_CMD) && 
++		    ((mlc->ipacket[i] & HIL_PKT_DATA_MASK) == HIL_CMD_IDD))
++			break;
++	}
++	if (i > 15) goto bail;
++	/* And the rest of the packets should still be clear. */
++	while (++i < 16) {
++		if (mlc->ipacket[i]) break;
++	}
++	if (i < 16) goto bail;
++	for (i = 0; i < 16; i++) {
++		mlc->di_scratch.idd[i] = 
++			mlc->ipacket[i] & HIL_PKT_DATA_MASK;
++	}
++	/* Next step is to see if RSC supported */
++	if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_RSC) 
++		return HILSEN_NEXT;
++	if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) 
++		return HILSEN_DOWN | 4;
++	return 0;
++ bail:
++	mlc->ddi--;
++	return -1; /* This should send us off to ACF */
++}
++
++static int hilse_take_rsc(hil_mlc *mlc, int unused) {
++	int i;
++
++	for (i = 0; i < 16; i++) {
++		mlc->di_scratch.rsc[i] = 
++			mlc->ipacket[i] & HIL_PKT_DATA_MASK;
++	}
++	/* Next step is to see if EXD supported (IDD has already been read) */
++	if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) 
++		return HILSEN_NEXT;
++	return 0;
++}
++
++static int hilse_take_exd(hil_mlc *mlc, int unused) {
++	int i;
++
++	for (i = 0; i < 16; i++) {
++		mlc->di_scratch.exd[i] = 
++			mlc->ipacket[i] & HIL_PKT_DATA_MASK;
++	}
++	/* Next step is to see if RNM supported. */
++	if (mlc->di_scratch.exd[0] & HIL_EXD_HEADER_RNM) 
++		return HILSEN_NEXT;
++	return 0;
++}
++
++static int hilse_take_rnm(hil_mlc *mlc, int unused) {
++	int i;
++
++	for (i = 0; i < 16; i++) {
++		mlc->di_scratch.rnm[i] = 
++			mlc->ipacket[i] & HIL_PKT_DATA_MASK;
++	}
++	do {
++	  char nam[17];
++	  snprintf(nam, 16, "%s", mlc->di_scratch.rnm);
++	  nam[16] = '\0';
++	  printk(KERN_INFO PREFIX "Device name gotten: %s\n", nam);
++	} while (0);
++	return 0;
++}
++
++static int hilse_operate(hil_mlc *mlc, int repoll) { 
++
++	if (mlc->opercnt == 0) hil_mlcs_probe = 0;
++	mlc->opercnt = 1;
++
++	hil_mlc_send_polls(mlc);
++
++	if (!hil_mlcs_probe) return 0;
++	hil_mlcs_probe = 0;
++	mlc->opercnt = 0;
++	return 1;
++}
++
++#define FUNC(funct, funct_arg, zero_rc, neg_rc, pos_rc) \
++{ HILSE_FUNC,		{ func: &funct }, funct_arg, zero_rc, neg_rc, pos_rc },
++#define OUT(pack) \
++{ HILSE_OUT,		{ packet: pack }, 0, HILSEN_NEXT, HILSEN_DOZE, 0 },
++#define CTS \
++{ HILSE_CTS,		{ packet: 0    }, 0, HILSEN_NEXT | HILSEN_SCHED | HILSEN_BREAK, HILSEN_DOZE, 0 },
++#define EXPECT(comp, to, got, got_wrong, timed_out) \
++{ HILSE_EXPECT,		{ packet: comp }, to, got, got_wrong, timed_out },
++#define EXPECT_LAST(comp, to, got, got_wrong, timed_out) \
++{ HILSE_EXPECT_LAST,	{ packet: comp }, to, got, got_wrong, timed_out },
++#define EXPECT_DISC(comp, to, got, got_wrong, timed_out) \
++{ HILSE_EXPECT_DISC,	{ packet: comp }, to, got, got_wrong, timed_out },
++#define IN(to, got, got_error, timed_out) \
++{ HILSE_IN,		{ packet: 0    }, to, got, got_error, timed_out },
++#define OUT_DISC(pack) \
++{ HILSE_OUT_DISC,	{ packet: pack }, 0, 0, 0, 0 },
++#define OUT_LAST(pack) \
++{ HILSE_OUT_LAST,	{ packet: pack }, 0, 0, 0, 0 },
++
++struct hilse_node hil_mlc_se[HILSEN_END] = {
++
++	/* 0  HILSEN_START */
++	FUNC(hilse_init_lcv, 0,	HILSEN_NEXT,	HILSEN_SLEEP,	0)
++
++	/* 1  HILSEN_RESTART */
++	FUNC(hilse_inc_lcv, 10,	HILSEN_NEXT,	HILSEN_START,  0)
++	OUT(HIL_CTRL_ONLY)			/* Disable APE */
++	CTS
++
++#define TEST_PACKET(x) \
++(HIL_PKT_CMD | (x << HIL_PKT_ADDR_SHIFT) | x << 4 | x)
++
++	OUT(HIL_DO_ALTER_CTRL | HIL_CTRL_TEST | TEST_PACKET(0x5))
++	EXPECT(HIL_ERR_INT | TEST_PACKET(0x5),
++	       2000,		HILSEN_NEXT,	HILSEN_RESTART,	HILSEN_RESTART)
++	OUT(HIL_DO_ALTER_CTRL | HIL_CTRL_TEST | TEST_PACKET(0xa))
++	EXPECT(HIL_ERR_INT | TEST_PACKET(0xa),
++	       2000,		HILSEN_NEXT,	HILSEN_RESTART,	HILSEN_RESTART)
++	OUT(HIL_CTRL_ONLY | 0)			/* Disable test mode */
++	
++	/* 9  HILSEN_DHR */
++	FUNC(hilse_init_lcv, 0,	HILSEN_NEXT,	HILSEN_SLEEP,	0)
++
++	/* 10 HILSEN_DHR2 */
++	FUNC(hilse_inc_lcv, 10,	HILSEN_NEXT,	HILSEN_START,	0)
++	FUNC(hilse_set_ddi, -1,	HILSEN_NEXT,	0,		0)
++	OUT(HIL_PKT_CMD | HIL_CMD_DHR)
++	IN(300000,		HILSEN_DHR2,	HILSEN_DHR2,	HILSEN_NEXT)
++
++	/* 14 HILSEN_IFC */
++  	OUT(HIL_PKT_CMD | HIL_CMD_IFC)
++	EXPECT(HIL_PKT_CMD | HIL_CMD_IFC | HIL_ERR_INT,
++	       20000,		HILSEN_DISC,	HILSEN_DHR2,	HILSEN_NEXT )
++
++	/* If devices are there, they weren't in PUP or other loopback mode.
++	 * We're more concerned at this point with restoring operation
++	 * to devices than discovering new ones, so we try to salvage
++	 * the loop configuration by closing off the loop.
++	 */
++
++	/* 16 HILSEN_HEAL0 */
++	FUNC(hilse_dec_ddi, 0,	HILSEN_NEXT,	HILSEN_ACF,	0)
++	FUNC(hilse_inc_ddi, 0,	HILSEN_NEXT,	0,		0)
++
++	/* 18 HILSEN_HEAL */
++	OUT_LAST(HIL_CMD_ELB)
++	EXPECT_LAST(HIL_CMD_ELB | HIL_ERR_INT, 
++		    20000,	HILSEN_REPOLL,	HILSEN_DSR,	HILSEN_NEXT)
++	FUNC(hilse_dec_ddi, 0,	HILSEN_HEAL,	HILSEN_NEXT,	0)
++
++	/* 21 HILSEN_ACF */
++	FUNC(hilse_init_lcv, 0,	HILSEN_NEXT,	HILSEN_DOZE,	0)
++
++	/* 22 HILSEN_ACF2 */
++	FUNC(hilse_inc_lcv, 10,	HILSEN_NEXT,	HILSEN_START,	0)
++	OUT(HIL_PKT_CMD | HIL_CMD_ACF | 1)
++	IN(20000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_NEXT)
++
++	/* 25 HILSEN_DISC0 */
++	OUT_DISC(HIL_PKT_CMD | HIL_CMD_ELB)
++	EXPECT_DISC(HIL_PKT_CMD | HIL_CMD_ELB | HIL_ERR_INT,
++	       20000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_DSR)
++
++	/* Only enter here if response just received */
++	/* 27 HILSEN_DISC */
++	OUT_DISC(HIL_PKT_CMD | HIL_CMD_IDD)
++	EXPECT_DISC(HIL_PKT_CMD | HIL_CMD_IDD | HIL_ERR_INT,
++	       20000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_START)
++	FUNC(hilse_inc_ddi,  0,	HILSEN_NEXT,	HILSEN_START,	0)
++	FUNC(hilse_take_idd, 0,	HILSEN_MATCH,	HILSEN_IFCACF,	HILSEN_FOLLOW)
++	OUT_LAST(HIL_PKT_CMD | HIL_CMD_RSC)
++	EXPECT_LAST(HIL_PKT_CMD | HIL_CMD_RSC | HIL_ERR_INT,
++	       30000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_DSR)
++	FUNC(hilse_take_rsc, 0,	HILSEN_MATCH,	0,		HILSEN_FOLLOW)
++	OUT_LAST(HIL_PKT_CMD | HIL_CMD_EXD)
++	EXPECT_LAST(HIL_PKT_CMD | HIL_CMD_EXD | HIL_ERR_INT,
++	       30000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_DSR)
++	FUNC(hilse_take_exd, 0,	HILSEN_MATCH,	0,		HILSEN_FOLLOW)
++	OUT_LAST(HIL_PKT_CMD | HIL_CMD_RNM)
++	EXPECT_LAST(HIL_PKT_CMD | HIL_CMD_RNM | HIL_ERR_INT,
++	       30000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_DSR)
++	FUNC(hilse_take_rnm, 0, HILSEN_MATCH,	0,		0)
++
++	/* 40 HILSEN_MATCH */
++	FUNC(hilse_match, 0,	HILSEN_NEXT,	HILSEN_NEXT,	/* TODO */ 0)
++
++	/* 41 HILSEN_OPERATE */
++	OUT(HIL_PKT_CMD | HIL_CMD_POL)
++	EXPECT(HIL_PKT_CMD | HIL_CMD_POL | HIL_ERR_INT,
++	       20000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_NEXT)
++	FUNC(hilse_operate, 0,	HILSEN_OPERATE,	HILSEN_IFC,	HILSEN_NEXT)
++
++	/* 44 HILSEN_PROBE */
++	OUT_LAST(HIL_PKT_CMD | HIL_CMD_EPT)
++	IN(10000, 		HILSEN_DISC,	HILSEN_DSR,	HILSEN_NEXT)
++	OUT_DISC(HIL_PKT_CMD | HIL_CMD_ELB)
++	IN(10000,		HILSEN_DISC,	HILSEN_DSR,	HILSEN_NEXT)
++	OUT(HIL_PKT_CMD | HIL_CMD_ACF | 1)
++	IN(10000,		HILSEN_DISC0,	HILSEN_DSR,	HILSEN_NEXT)
++	OUT_LAST(HIL_PKT_CMD | HIL_CMD_ELB)
++	IN(10000,		HILSEN_OPERATE,	HILSEN_DSR,	HILSEN_DSR)
++
++	/* 52 HILSEN_DSR */
++	FUNC(hilse_set_ddi, -1,	HILSEN_NEXT,	0,		0)
++	OUT(HIL_PKT_CMD | HIL_CMD_DSR)
++	IN(20000, 		HILSEN_DHR,	HILSEN_DHR,	HILSEN_IFC)
++
++	/* 55 HILSEN_REPOLL */
++	OUT(HIL_PKT_CMD | HIL_CMD_RPL)
++	EXPECT(HIL_PKT_CMD | HIL_CMD_RPL | HIL_ERR_INT,
++	       20000,		HILSEN_NEXT,	HILSEN_DSR,	HILSEN_NEXT)
++	FUNC(hilse_operate, 1,	HILSEN_OPERATE,	HILSEN_IFC,	HILSEN_PROBE)
++
++	/* 58 HILSEN_IFCACF */
++  	OUT(HIL_PKT_CMD | HIL_CMD_IFC)
++	EXPECT(HIL_PKT_CMD | HIL_CMD_IFC | HIL_ERR_INT,
++	       20000,		HILSEN_ACF2,	HILSEN_DHR2,	HILSEN_HEAL)
++
++	/* 60 HILSEN_END */
++};
++
++static inline void hilse_setup_input(hil_mlc *mlc, struct hilse_node *node) {
++
++	switch (node->act) {
++	case HILSE_EXPECT_DISC:
++		mlc->imatch = node->object.packet;
++		mlc->imatch |= ((mlc->ddi + 2) << HIL_PKT_ADDR_SHIFT);
++		break;
++	case HILSE_EXPECT_LAST:
++		mlc->imatch = node->object.packet;
++		mlc->imatch |= ((mlc->ddi + 1) << HIL_PKT_ADDR_SHIFT);
++		break;
++	case HILSE_EXPECT:
++		mlc->imatch = node->object.packet;
++		break;
++	case HILSE_IN:
++		mlc->imatch = 0;
++		break;
++	default:
++		BUG();
++	}
++	mlc->istarted = 1;
++	mlc->intimeout = node->arg;
++	do_gettimeofday(&(mlc->instart));
++	mlc->icount = 15;
++	memset(mlc->ipacket, 0, 16 * sizeof(hil_packet));
++	if (down_trylock(&(mlc->isem))) BUG();
++
++	return;
++}
++
++#ifdef HIL_MLC_DEBUG
++static int doze = 0;
++static int seidx; /* For debug */
++static int kick = 1;
++#endif
++
++static int hilse_donode (hil_mlc *mlc) {
++	struct hilse_node *node;
++	int nextidx = 0;
++	int sched_long = 0;
++	unsigned long flags;
++
++#ifdef HIL_MLC_DEBUG
++	if (mlc->seidx && (mlc->seidx != seidx)  && mlc->seidx != 41 && mlc->seidx != 42 && mlc->seidx != 43) {
++	  printk(KERN_DEBUG PREFIX "z%i \n%s {%i}", doze, kick ? "K" : "", mlc->seidx);
++		doze = 0;
++	}
++	kick = 0;
++
++	seidx = mlc->seidx;
++#endif
++	node = hil_mlc_se + mlc->seidx;
++
++	switch (node->act) {
++		int rc;
++		hil_packet pack;
++
++	case HILSE_FUNC:
++		if (node->object.func == NULL) break;
++		rc = node->object.func(mlc, node->arg);
++		nextidx = (rc > 0) ? node->ugly : 
++			((rc < 0) ? node->bad : node->good);
++		if (nextidx == HILSEN_FOLLOW) nextidx = rc;
++		break;
++	case HILSE_EXPECT_LAST:
++	case HILSE_EXPECT_DISC:
++	case HILSE_EXPECT:
++	case HILSE_IN:
++		/* Already set up from previous HILSE_OUT_* */
++		write_lock_irqsave(&(mlc->lock), flags);
++		rc = mlc->in(mlc, node->arg);
++		if (rc == 2)  {
++			nextidx = HILSEN_DOZE;
++			sched_long = 1;
++			write_unlock_irqrestore(&(mlc->lock), flags);
++			break;
++		}
++		if (rc == 1)		nextidx = node->ugly;
++		else if (rc == 0)	nextidx = node->good;
++		else			nextidx = node->bad;
++		mlc->istarted = 0;
++		write_unlock_irqrestore(&(mlc->lock), flags);
++		break;
++	case HILSE_OUT_LAST:
++		write_lock_irqsave(&(mlc->lock), flags);
++		pack = node->object.packet;
++		pack |= ((mlc->ddi + 1) << HIL_PKT_ADDR_SHIFT);
++		goto out;
++	case HILSE_OUT_DISC:
++		write_lock_irqsave(&(mlc->lock), flags);
++		pack = node->object.packet;
++		pack |= ((mlc->ddi + 2) << HIL_PKT_ADDR_SHIFT);
++		goto out;
++	case HILSE_OUT:
++		write_lock_irqsave(&(mlc->lock), flags);
++		pack = node->object.packet;
++	out:
++		if (mlc->istarted) goto out2;
++		/* Prepare to receive input */
++		if ((node + 1)->act & HILSE_IN)
++			hilse_setup_input(mlc, node + 1);
++
++	out2:
++		write_unlock_irqrestore(&(mlc->lock), flags);
++
++		if (down_trylock(&mlc->osem)) {
++			nextidx = HILSEN_DOZE;
++			break;
++		}
++		up(&mlc->osem);
++
++		write_lock_irqsave(&(mlc->lock), flags);
++		if (!(mlc->ostarted)) {
++			mlc->ostarted = 1;
++			mlc->opacket = pack;
++			mlc->out(mlc);
++			nextidx = HILSEN_DOZE;
++			write_unlock_irqrestore(&(mlc->lock), flags);
++			break;
++		}
++		mlc->ostarted = 0;
++		do_gettimeofday(&(mlc->instart));
++		write_unlock_irqrestore(&(mlc->lock), flags);
++		nextidx = HILSEN_NEXT;
++		break;
++	case HILSE_CTS:
++		nextidx = mlc->cts(mlc) ? node->bad : node->good;
++		break;
++	default:
++		BUG();
++		nextidx = 0;
++		break;
++	}
++
++#ifdef HIL_MLC_DEBUG
++	if (nextidx == HILSEN_DOZE) doze++;
++#endif
++
++	while (nextidx & HILSEN_SCHED) {
++		struct timeval tv;
++
++		if (!sched_long) goto sched;
++
++		do_gettimeofday(&tv);
++		tv.tv_usec += 1000000 * (tv.tv_sec - mlc->instart.tv_sec);
++		tv.tv_usec -= mlc->instart.tv_usec;
++		if (tv.tv_usec >= mlc->intimeout) goto sched;
++		tv.tv_usec = (mlc->intimeout - tv.tv_usec) * HZ / 1000000;
++		if (!tv.tv_usec) goto sched;
++		mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec);
++		break;
++	sched:
++		tasklet_schedule(&hil_mlcs_tasklet);
++		break;
++	} 
++	if (nextidx & HILSEN_DOWN) mlc->seidx += nextidx & HILSEN_MASK;
++	else if (nextidx & HILSEN_UP) mlc->seidx -= nextidx & HILSEN_MASK;
++	else mlc->seidx = nextidx & HILSEN_MASK;
++
++	if (nextidx & HILSEN_BREAK)	return 1;
++	return 0;
++}
++
++/******************** tasklet context functions **************************/
++static void hil_mlcs_process(unsigned long unused) {
++	struct list_head *tmp;
++
++	read_lock(&hil_mlcs_lock);
++	list_for_each(tmp, &hil_mlcs) {
++		struct hil_mlc *mlc = list_entry(tmp, hil_mlc, list);
++		while (hilse_donode(mlc) == 0) {
++#ifdef HIL_MLC_DEBUG
++		  if (mlc->seidx != 41 && 
++		      mlc->seidx != 42 && 
++		      mlc->seidx != 43) 
++		    printk(KERN_DEBUG PREFIX " + ");
++#endif
++		};
++	}
++	read_unlock(&hil_mlcs_lock);
++}
++
++/************************* Keepalive timer task *********************/
++
++void hil_mlcs_timer (unsigned long data) {
++	hil_mlcs_probe = 1;
++	tasklet_schedule(&hil_mlcs_tasklet);
++	/* Re-insert the periodic task. */
++	if (!timer_pending(&hil_mlcs_kicker))
++		mod_timer(&hil_mlcs_kicker, jiffies + HZ);
++}
++
++/******************** user/kernel context functions **********************/
++
++static int hil_mlc_serio_write(struct serio *serio, unsigned char c) {
++	struct hil_mlc_serio_map *map;
++	struct hil_mlc *mlc;
++	struct serio_driver *drv;
++	uint8_t *idx, *last;
++
++	map = serio->port_data;
++	if (map == NULL) {
++		BUG();
++		return -EIO;
++	}
++	mlc = map->mlc;
++	if (mlc == NULL) {
++		BUG();
++		return -EIO;
++	}
++	mlc->serio_opacket[map->didx] |= 
++		((hil_packet)c) << (8 * (3 - mlc->serio_oidx[map->didx]));
++
++	if (mlc->serio_oidx[map->didx] >= 3) {
++		/* for now only commands */
++		if (!(mlc->serio_opacket[map->didx] & HIL_PKT_CMD)) 
++			return -EIO;
++		switch (mlc->serio_opacket[map->didx] & HIL_PKT_DATA_MASK) {
++		case HIL_CMD_IDD:
++			idx = mlc->di[map->didx].idd;
++			goto emu;
++		case HIL_CMD_RSC:
++			idx = mlc->di[map->didx].rsc;
++			goto emu;
++		case HIL_CMD_EXD:
++			idx = mlc->di[map->didx].exd;
++			goto emu;
++		case HIL_CMD_RNM:
++			idx = mlc->di[map->didx].rnm;
++			goto emu;
++		default:
++			break;
++		}
++		mlc->serio_oidx[map->didx] = 0;
++		mlc->serio_opacket[map->didx] = 0;
++	}
++
++	mlc->serio_oidx[map->didx]++;
++	return -EIO;
++ emu:
++	drv = serio->drv;
++	if (drv == NULL) {
++		BUG();
++		return -EIO;
++	}
++	last = idx + 15;
++	while ((last != idx) && (*last == 0)) last--;
++
++	while (idx != last) {
++		drv->interrupt(serio, 0, 0, NULL);
++		drv->interrupt(serio, HIL_ERR_INT >> 16, 0, NULL);
++		drv->interrupt(serio, 0, 0, NULL);
++		drv->interrupt(serio, *idx, 0, NULL);
++		idx++;
++	}
++	drv->interrupt(serio, 0, 0, NULL);
++	drv->interrupt(serio, HIL_ERR_INT >> 16, 0, NULL);
++	drv->interrupt(serio, HIL_PKT_CMD >> 8, 0, NULL);
++	drv->interrupt(serio, *idx, 0, NULL);
++	
++	mlc->serio_oidx[map->didx] = 0;
++	mlc->serio_opacket[map->didx] = 0;
++
++	return 0;
++}
++
++static int hil_mlc_serio_open(struct serio *serio) {
++	struct hil_mlc_serio_map *map;
++	struct hil_mlc *mlc;
++
++	if (serio->private != NULL) return -EBUSY;
++
++	map = serio->port_data;
++	if (map == NULL) {
++		BUG();
++		return -ENODEV;
++	}
++	mlc = map->mlc;
++	if (mlc == NULL) {
++		BUG();
++		return -ENODEV;
++	}
++
++	return 0;
++}
++
++static void hil_mlc_serio_close(struct serio *serio) {
++	struct hil_mlc_serio_map *map;
++	struct hil_mlc *mlc;
++
++	map = serio->port_data;
++	if (map == NULL) {
++		BUG();
++		return;
++	}
++	mlc = map->mlc;
++	if (mlc == NULL) {
++		BUG();
++		return;
++	}
++
++	serio->private = NULL;
++	serio->drv = NULL;
++	/* TODO wake up interruptable */
++}
++
++int hil_mlc_register(hil_mlc *mlc) {
++	int i;
++        unsigned long flags;
++
++	if (mlc == NULL) {
++		return -EINVAL;
++	}
++
++	mlc->istarted = 0;
++        mlc->ostarted = 0;
++
++        mlc->lock = RW_LOCK_UNLOCKED;
++        init_MUTEX(&(mlc->osem));
++
++        init_MUTEX(&(mlc->isem));
++        mlc->icount = -1;
++        mlc->imatch = 0;
++
++	mlc->opercnt = 0;
++
++        init_MUTEX_LOCKED(&(mlc->csem));
++
++	hil_mlc_clear_di_scratch(mlc);
++	hil_mlc_clear_di_map(mlc, 0);
++	for (i = 0; i < HIL_MLC_DEVMEM; i++) {
++		struct serio *mlc_serio;
++		hil_mlc_copy_di_scratch(mlc, i);
++		mlc_serio = kmalloc(sizeof(*mlc_serio), GFP_KERNEL);
++		mlc->serio[i] = mlc_serio;
++		memset(mlc_serio, 0, sizeof(*mlc_serio));
++		mlc_serio->type			= SERIO_HIL | SERIO_HIL_MLC;
++		mlc_serio->write		= hil_mlc_serio_write;
++		mlc_serio->open			= hil_mlc_serio_open;
++		mlc_serio->close		= hil_mlc_serio_close;
++		mlc_serio->port_data		= &(mlc->serio_map[i]);
++		mlc->serio_map[i].mlc		= mlc;
++		mlc->serio_map[i].didx		= i;
++		mlc->serio_map[i].di_revmap	= -1;
++		mlc->serio_opacket[i]		= 0;
++		mlc->serio_oidx[i]		= 0;
++		serio_register_port(mlc_serio);
++	}
++
++	mlc->tasklet = &hil_mlcs_tasklet;
++
++	write_lock_irqsave(&hil_mlcs_lock, flags);
++	list_add_tail(&mlc->list, &hil_mlcs);
++	mlc->seidx = HILSEN_START;
++	write_unlock_irqrestore(&hil_mlcs_lock, flags);
++
++	tasklet_schedule(&hil_mlcs_tasklet);
++	return 0;
++}
++
++int hil_mlc_unregister(hil_mlc *mlc) {
++	struct list_head *tmp;
++        unsigned long flags;
++	int i;
++
++	if (mlc == NULL)
++		return -EINVAL;
++
++	write_lock_irqsave(&hil_mlcs_lock, flags);
++	list_for_each(tmp, &hil_mlcs) {
++		if (list_entry(tmp, hil_mlc, list) == mlc)
++			goto found;
++	}
++
++	/* not found in list */
++	write_unlock_irqrestore(&hil_mlcs_lock, flags);
++	tasklet_schedule(&hil_mlcs_tasklet);
++	return -ENODEV;
++
++ found:
++	list_del(tmp);
++        write_unlock_irqrestore(&hil_mlcs_lock, flags);
++
++	for (i = 0; i < HIL_MLC_DEVMEM; i++) {
++		serio_unregister_port(mlc->serio[i]);
++		mlc->serio[i] = NULL;
++	}
++
++	tasklet_schedule(&hil_mlcs_tasklet);
++	return 0;
++}
++
++/**************************** Module interface *************************/
++
++static int __init hil_mlc_init(void)
++{
++	init_timer(&hil_mlcs_kicker);
++	hil_mlcs_kicker.expires = jiffies + HZ;
++	hil_mlcs_kicker.function = &hil_mlcs_timer;
++	add_timer(&hil_mlcs_kicker);
++
++	tasklet_enable(&hil_mlcs_tasklet);
++
++	return 0;
++}
++                
++static void __exit hil_mlc_exit(void)
++{
++	del_timer(&hil_mlcs_kicker);
++
++	tasklet_disable(&hil_mlcs_tasklet);
++	tasklet_kill(&hil_mlcs_tasklet);
++}
++                        
++module_init(hil_mlc_init);
++module_exit(hil_mlc_exit);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/serio/hp_sdc.c CVS2_6_11_PA2/drivers/input/serio/hp_sdc.c
+--- LINUS_2_6_11/drivers/input/serio/hp_sdc.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/serio/hp_sdc.c	2005-02-03 05:48:16.000000000 -0700
+@@ -0,0 +1,1054 @@
++/*
++ * HP i8042-based System Device Controller driver.
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * System Device Controller Microprocessor Firmware Theory of Operation
++ *      for Part Number 1820-4784 Revision B.  Dwg No. A-1820-4784-2
++ * Helge Deller's original hilkbd.c port for PA-RISC.
++ *
++ *
++ * Driver theory of operation:
++ *
++ * hp_sdc_put does all writing to the SDC.  ISR can run on a different 
++ * CPU than hp_sdc_put, but only one CPU runs hp_sdc_put at a time 
++ * (it cannot really benefit from SMP anyway.)  A tasket fit this perfectly.
++ *
++ * All data coming back from the SDC is sent via interrupt and can be read 
++ * fully in the ISR, so there are no latency/throughput problems there.  
++ * The problem is with output, due to the slow clock speed of the SDC 
++ * compared to the CPU.  This should not be too horrible most of the time, 
++ * but if used with HIL devices that support the multibyte transfer command, 
++ * keeping outbound throughput flowing at the 6500KBps that the HIL is 
++ * capable of is more than can be done at HZ=100.
++ *
++ * Busy polling for IBF clear wastes CPU cycles and bus cycles.  hp_sdc.ibf 
++ * is set to 0 when the IBF flag in the status register has cleared.  ISR 
++ * may do this, and may also access the parts of queued transactions related 
++ * to reading data back from the SDC, but otherwise will not touch the 
++ * hp_sdc state. Whenever a register is written hp_sdc.ibf is set to 1.
++ *
++ * The i8042 write index and the values in the 4-byte input buffer
++ * starting at 0x70 are kept track of in hp_sdc.wi, and .r7[], respectively,
++ * to minimize the amount of IO needed to the SDC.  However these values 
++ * do not need to be locked since they are only ever accessed by hp_sdc_put.
++ *
++ * A timer task schedules the tasklet once per second just to make
++ * sure it doesn't freeze up and to allow for bad reads to time out.
++ */
++
++#include <linux/hp_sdc.h>
++#include <linux/sched.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/ioport.h>
++#include <linux/time.h>
++#include <linux/slab.h>
++#include <linux/hil.h>
++#include <asm/io.h>
++#include <asm/system.h>
++
++/* Machine-specific abstraction */
++
++#if defined(__hppa__)
++# include <asm/parisc-device.h>
++# define sdc_readb(p)		gsc_readb(p)
++# define sdc_writeb(v,p)	gsc_writeb((v),(p))
++#elif defined(__mc68000__)
++# include <asm/uaccess.h>
++# define sdc_readb(p)		in_8(p)
++# define sdc_writeb(v,p)	out_8((p),(v))
++#else
++# error "HIL is not supported on this platform"
++#endif
++
++#define PREFIX "HP SDC: "
++
++MODULE_AUTHOR("Brian S. Julin <bri at calyx.com>");
++MODULE_DESCRIPTION("HP i8042-based SDC Driver");
++MODULE_LICENSE("Dual BSD/GPL");
++
++EXPORT_SYMBOL(hp_sdc_request_timer_irq);
++EXPORT_SYMBOL(hp_sdc_request_hil_irq);
++EXPORT_SYMBOL(hp_sdc_request_cooked_irq);
++
++EXPORT_SYMBOL(hp_sdc_release_timer_irq);
++EXPORT_SYMBOL(hp_sdc_release_hil_irq);
++EXPORT_SYMBOL(hp_sdc_release_cooked_irq);
++
++EXPORT_SYMBOL(hp_sdc_enqueue_transaction);
++EXPORT_SYMBOL(hp_sdc_dequeue_transaction);
++
++static hp_i8042_sdc	hp_sdc;	/* All driver state is kept in here. */
++
++/*************** primitives for use in any context *********************/
++static inline uint8_t hp_sdc_status_in8 (void) {
++	uint8_t status;
++	unsigned long flags;
++
++	write_lock_irqsave(&hp_sdc.ibf_lock, flags);
++	status = sdc_readb(hp_sdc.status_io);
++	if (!(status & HP_SDC_STATUS_IBF)) hp_sdc.ibf = 0;
++	write_unlock_irqrestore(&hp_sdc.ibf_lock, flags);
++
++	return status;
++}
++
++static inline uint8_t hp_sdc_data_in8 (void) {
++	return sdc_readb(hp_sdc.data_io); 
++}
++
++static inline void hp_sdc_status_out8 (uint8_t val) {
++	unsigned long flags;
++
++	write_lock_irqsave(&hp_sdc.ibf_lock, flags);
++	hp_sdc.ibf = 1;
++	if ((val & 0xf0) == 0xe0) hp_sdc.wi = 0xff;
++	sdc_writeb(val, hp_sdc.status_io);
++	write_unlock_irqrestore(&hp_sdc.ibf_lock, flags);
++}
++
++static inline void hp_sdc_data_out8 (uint8_t val) {
++	unsigned long flags;
++
++	write_lock_irqsave(&hp_sdc.ibf_lock, flags);
++	hp_sdc.ibf = 1;
++	sdc_writeb(val, hp_sdc.data_io);
++	write_unlock_irqrestore(&hp_sdc.ibf_lock, flags);
++}
++
++/*	Care must be taken to only invoke hp_sdc_spin_ibf when 
++ *	absolutely needed, or in rarely invoked subroutines.  
++ *	Not only does it waste CPU cycles, it also wastes bus cycles. 
++ */
++static inline void hp_sdc_spin_ibf(void) {
++	unsigned long flags;
++	rwlock_t *lock;
++
++	lock = &hp_sdc.ibf_lock;
++
++	read_lock_irqsave(lock, flags);
++	if (!hp_sdc.ibf) {
++		read_unlock_irqrestore(lock, flags);
++		return;
++	}
++	read_unlock(lock);
++	write_lock(lock);
++	while (sdc_readb(hp_sdc.status_io) & HP_SDC_STATUS_IBF) {};
++	hp_sdc.ibf = 0;
++	write_unlock_irqrestore(lock, flags);
++}
++
++
++/************************ Interrupt context functions ************************/
++static void hp_sdc_take (int irq, void *dev_id, uint8_t status, uint8_t data) {
++	hp_sdc_transaction *curr;
++
++	read_lock(&hp_sdc.rtq_lock);
++	if (hp_sdc.rcurr < 0) {
++	  	read_unlock(&hp_sdc.rtq_lock);
++		return;
++	}
++	curr = hp_sdc.tq[hp_sdc.rcurr];
++	read_unlock(&hp_sdc.rtq_lock);
++
++	curr->seq[curr->idx++] = status;
++	curr->seq[curr->idx++] = data;
++	hp_sdc.rqty -= 2;
++	do_gettimeofday(&hp_sdc.rtv);
++
++	if (hp_sdc.rqty <= 0) {
++		/* All data has been gathered. */
++		if(curr->seq[curr->actidx] & HP_SDC_ACT_SEMAPHORE) {
++			if (curr->act.semaphore) up(curr->act.semaphore);
++		}
++		if(curr->seq[curr->actidx] & HP_SDC_ACT_CALLBACK) {
++			if (curr->act.irqhook)
++				curr->act.irqhook(irq, dev_id, status, data);
++		}
++		curr->actidx = curr->idx;
++		curr->idx++;
++		/* Return control of this transaction */
++		write_lock(&hp_sdc.rtq_lock);
++		hp_sdc.rcurr = -1; 
++		hp_sdc.rqty = 0;
++		write_unlock(&hp_sdc.rtq_lock);
++		tasklet_schedule(&hp_sdc.task);
++	}
++}
++
++static irqreturn_t hp_sdc_isr(int irq, void *dev_id, struct pt_regs * regs) {
++	uint8_t status, data;
++
++	status = hp_sdc_status_in8();
++	/* Read data unconditionally to advance i8042. */
++	data =   hp_sdc_data_in8();
++
++	/* For now we are ignoring these until we get the SDC to behave. */
++	if (((status & 0xf1) == 0x51) && data == 0x82) {
++	  return IRQ_HANDLED;
++	}
++
++	switch(status & HP_SDC_STATUS_IRQMASK) {
++	      case 0: /* This case is not documented. */
++		break;
++	      case HP_SDC_STATUS_USERTIMER:
++	      case HP_SDC_STATUS_PERIODIC:
++	      case HP_SDC_STATUS_TIMER:
++		read_lock(&hp_sdc.hook_lock);
++	      	if (hp_sdc.timer != NULL)
++			hp_sdc.timer(irq, dev_id, status, data);
++		read_unlock(&hp_sdc.hook_lock);
++		break;
++	      case HP_SDC_STATUS_REG:
++		hp_sdc_take(irq, dev_id, status, data);
++		break;
++	      case HP_SDC_STATUS_HILCMD:
++	      case HP_SDC_STATUS_HILDATA:
++		read_lock(&hp_sdc.hook_lock);
++		if (hp_sdc.hil != NULL)
++			hp_sdc.hil(irq, dev_id, status, data);
++		read_unlock(&hp_sdc.hook_lock);
++		break;
++	      case HP_SDC_STATUS_PUP:
++		read_lock(&hp_sdc.hook_lock);
++		if (hp_sdc.pup != NULL)
++			hp_sdc.pup(irq, dev_id, status, data);
++		else printk(KERN_INFO PREFIX "HP SDC reports successful PUP.\n");
++		read_unlock(&hp_sdc.hook_lock);
++		break;
++	      default:
++		read_lock(&hp_sdc.hook_lock);
++		if (hp_sdc.cooked != NULL)
++			hp_sdc.cooked(irq, dev_id, status, data);
++		read_unlock(&hp_sdc.hook_lock);
++		break;
++	}
++	return IRQ_HANDLED;
++}
++
++
++static irqreturn_t hp_sdc_nmisr(int irq, void *dev_id, struct pt_regs * regs) {
++	int status;
++	
++	status = hp_sdc_status_in8();
++	printk(KERN_WARNING PREFIX "NMI !\n");
++
++#if 0	
++	if (status & HP_SDC_NMISTATUS_FHS) {
++		read_lock(&hp_sdc.hook_lock);
++	      	if (hp_sdc.timer != NULL)
++			hp_sdc.timer(irq, dev_id, status, 0);
++		read_unlock(&hp_sdc.hook_lock);
++	}
++	else {
++		/* TODO: pass this on to the HIL handler, or do SAK here? */
++		printk(KERN_WARNING PREFIX "HIL NMI\n");
++	}
++#endif
++	return IRQ_HANDLED;
++}
++
++
++/***************** Kernel (tasklet) context functions ****************/
++
++unsigned long hp_sdc_put(void);
++
++static void hp_sdc_tasklet(unsigned long foo) {
++
++	write_lock_irq(&hp_sdc.rtq_lock);
++	if (hp_sdc.rcurr >= 0) {
++		struct timeval tv;
++		do_gettimeofday(&tv);
++		if (tv.tv_sec > hp_sdc.rtv.tv_sec) tv.tv_usec += 1000000;
++		if (tv.tv_usec - hp_sdc.rtv.tv_usec > HP_SDC_MAX_REG_DELAY) {
++			hp_sdc_transaction *curr;
++			uint8_t tmp;
++
++			curr = hp_sdc.tq[hp_sdc.rcurr];
++			/* If this turns out to be a normal failure mode
++			 * we'll need to figure out a way to communicate
++			 * it back to the application. and be less verbose.
++			 */
++			printk(KERN_WARNING PREFIX "read timeout (%ius)!\n",
++			       tv.tv_usec - hp_sdc.rtv.tv_usec);
++			curr->idx += hp_sdc.rqty;
++			hp_sdc.rqty = 0;
++			tmp = curr->seq[curr->actidx];
++			curr->seq[curr->actidx] |= HP_SDC_ACT_DEAD;
++			if(tmp & HP_SDC_ACT_SEMAPHORE) {
++				if (curr->act.semaphore) 
++					up(curr->act.semaphore);
++			}
++			if(tmp & HP_SDC_ACT_CALLBACK) {
++				/* Note this means that irqhooks may be called
++				 * in tasklet/bh context.
++				 */
++				if (curr->act.irqhook) 
++					curr->act.irqhook(0, 0, 0, 0);
++			}
++			curr->actidx = curr->idx;
++			curr->idx++;
++			hp_sdc.rcurr = -1; 
++		}
++	}
++	write_unlock_irq(&hp_sdc.rtq_lock);
++	hp_sdc_put();
++}
++
++unsigned long hp_sdc_put(void) {
++	hp_sdc_transaction *curr;
++	uint8_t act;
++	int idx, curridx;
++
++	int limit = 0;
++
++	write_lock(&hp_sdc.lock);
++
++	/* If i8042 buffers are full, we cannot do anything that
++	   requires output, so we skip to the administrativa. */
++	if (hp_sdc.ibf) {
++		hp_sdc_status_in8();
++		if (hp_sdc.ibf) goto finish;
++	}
++
++ anew:
++	/* See if we are in the middle of a sequence. */
++	if (hp_sdc.wcurr < 0) hp_sdc.wcurr = 0;
++	read_lock_irq(&hp_sdc.rtq_lock);
++	if (hp_sdc.rcurr == hp_sdc.wcurr) hp_sdc.wcurr++;
++	read_unlock_irq(&hp_sdc.rtq_lock);
++	if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) hp_sdc.wcurr = 0;
++	curridx = hp_sdc.wcurr;
++
++	if (hp_sdc.tq[curridx] != NULL) goto start;
++
++	while (++curridx != hp_sdc.wcurr) {
++		if (curridx >= HP_SDC_QUEUE_LEN) {
++			curridx = -1; /* Wrap to top */
++			continue;
++		}
++		read_lock_irq(&hp_sdc.rtq_lock);
++		if (hp_sdc.rcurr == curridx) {
++			read_unlock_irq(&hp_sdc.rtq_lock);
++			continue;
++		}
++		read_unlock_irq(&hp_sdc.rtq_lock);
++		if (hp_sdc.tq[curridx] != NULL) break; /* Found one. */
++	}
++	if (curridx == hp_sdc.wcurr) { /* There's nothing queued to do. */
++		curridx = -1;
++	}
++	hp_sdc.wcurr = curridx;
++
++ start:
++
++	/* Check to see if the interrupt mask needs to be set. */
++	if (hp_sdc.set_im) {
++		hp_sdc_status_out8(hp_sdc.im | HP_SDC_CMD_SET_IM);
++		hp_sdc.set_im = 0;
++		goto finish;
++	}
++
++	if (hp_sdc.wcurr == -1) goto done;
++
++	curr = hp_sdc.tq[curridx];
++	idx = curr->actidx;
++
++	if (curr->actidx >= curr->endidx) {
++		hp_sdc.tq[curridx] = NULL;
++		/* Interleave outbound data between the transactions. */
++		hp_sdc.wcurr++;
++		if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) hp_sdc.wcurr = 0;
++		goto finish;	
++	}
++
++	act = curr->seq[idx];
++	idx++;
++
++	if (curr->idx >= curr->endidx) {
++		if (act & HP_SDC_ACT_DEALLOC) kfree(curr);
++		hp_sdc.tq[curridx] = NULL;
++		/* Interleave outbound data between the transactions. */
++		hp_sdc.wcurr++;
++		if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) hp_sdc.wcurr = 0;
++		goto finish;	
++	}
++
++	while (act & HP_SDC_ACT_PRECMD) {
++		if (curr->idx != idx) {
++			idx++;
++			act &= ~HP_SDC_ACT_PRECMD;
++			break;
++		}
++		hp_sdc_status_out8(curr->seq[idx]);
++		curr->idx++;
++		/* act finished? */
++		if ((act & HP_SDC_ACT_DURING) == HP_SDC_ACT_PRECMD)
++		  goto actdone;
++		/* skip quantity field if data-out sequence follows. */
++		if (act & HP_SDC_ACT_DATAOUT) curr->idx++;
++		goto finish;
++	}
++	if (act & HP_SDC_ACT_DATAOUT) {
++		int qty;
++
++		qty = curr->seq[idx];
++		idx++;
++		if (curr->idx - idx < qty) {
++			hp_sdc_data_out8(curr->seq[curr->idx]);
++			curr->idx++;
++			/* act finished? */
++			if ((curr->idx - idx >= qty) && 
++			    ((act & HP_SDC_ACT_DURING) == HP_SDC_ACT_DATAOUT))
++				goto actdone;
++			goto finish;
++		}
++		idx += qty;
++		act &= ~HP_SDC_ACT_DATAOUT;
++	}
++	else while (act & HP_SDC_ACT_DATAREG) {
++		int mask;
++		uint8_t w7[4];
++
++		mask = curr->seq[idx];
++		if (idx != curr->idx) {
++			idx++;
++			idx += !!(mask & 1);
++			idx += !!(mask & 2);
++			idx += !!(mask & 4);
++			idx += !!(mask & 8);
++			act &= ~HP_SDC_ACT_DATAREG;
++			break;
++		}
++		
++		w7[0] = (mask & 1) ? curr->seq[++idx] : hp_sdc.r7[0];
++		w7[1] = (mask & 2) ? curr->seq[++idx] : hp_sdc.r7[1];
++		w7[2] = (mask & 4) ? curr->seq[++idx] : hp_sdc.r7[2];
++		w7[3] = (mask & 8) ? curr->seq[++idx] : hp_sdc.r7[3];
++		
++		if (hp_sdc.wi > 0x73 || hp_sdc.wi < 0x70 ||
++		        w7[hp_sdc.wi-0x70] == hp_sdc.r7[hp_sdc.wi-0x70]) {
++			int i = 0;
++
++			/* Need to point the write index register */	
++			while ((i < 4) && w7[i] == hp_sdc.r7[i]) i++;
++			if (i < 4) {
++				hp_sdc_status_out8(HP_SDC_CMD_SET_D0 + i);
++				hp_sdc.wi = 0x70 + i;
++				goto finish;
++			}
++			idx++;
++			if ((act & HP_SDC_ACT_DURING) == HP_SDC_ACT_DATAREG)
++				goto actdone;
++			curr->idx = idx;
++			act &= ~HP_SDC_ACT_DATAREG;
++			break;
++		}
++
++		hp_sdc_data_out8(w7[hp_sdc.wi - 0x70]);
++		hp_sdc.r7[hp_sdc.wi - 0x70] = w7[hp_sdc.wi - 0x70];
++		hp_sdc.wi++; /* write index register autoincrements */
++		{
++			int i = 0;
++
++			while ((i < 4) && w7[i] == hp_sdc.r7[i]) i++;
++			if (i >= 4) {
++				curr->idx = idx + 1;
++				if ((act & HP_SDC_ACT_DURING) == 
++				    HP_SDC_ACT_DATAREG)
++				        goto actdone;
++			}
++		}
++		goto finish;
++	}
++	/* We don't go any further in the command if there is a pending read,
++	   because we don't want interleaved results. */
++	read_lock_irq(&hp_sdc.rtq_lock);
++	if (hp_sdc.rcurr >= 0) {
++		read_unlock_irq(&hp_sdc.rtq_lock);
++		goto finish;
++	}
++	read_unlock_irq(&hp_sdc.rtq_lock);
++
++
++	if (act & HP_SDC_ACT_POSTCMD) {
++	  	uint8_t postcmd;
++
++		/* curr->idx should == idx at this point. */
++		postcmd = curr->seq[idx];
++		curr->idx++;
++		if (act & HP_SDC_ACT_DATAIN) {
++
++			/* Start a new read */
++	  		hp_sdc.rqty = curr->seq[curr->idx];
++			do_gettimeofday(&hp_sdc.rtv);
++			curr->idx++;
++			/* Still need to lock here in case of spurious irq. */
++			write_lock_irq(&hp_sdc.rtq_lock);
++			hp_sdc.rcurr = curridx; 
++			write_unlock_irq(&hp_sdc.rtq_lock);
++			hp_sdc_status_out8(postcmd);
++			goto finish;
++		}
++		hp_sdc_status_out8(postcmd);
++		goto actdone;
++	}
++
++actdone:
++	if (act & HP_SDC_ACT_SEMAPHORE) {
++		up(curr->act.semaphore);
++	}
++	else if (act & HP_SDC_ACT_CALLBACK) {
++		curr->act.irqhook(0,0,0,0);
++	}
++	if (curr->idx >= curr->endidx) { /* This transaction is over. */
++		if (act & HP_SDC_ACT_DEALLOC) kfree(curr);
++		hp_sdc.tq[curridx] = NULL;
++	}
++	else {
++		curr->actidx = idx + 1;
++		curr->idx = idx + 2;
++	}
++	/* Interleave outbound data between the transactions. */
++	hp_sdc.wcurr++;
++	if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) hp_sdc.wcurr = 0;
++
++ finish:
++	/* If by some quirk IBF has cleared and our ISR has run to 
++	   see that that has happened, do it all again. */
++	if (!hp_sdc.ibf && limit++ < 20) goto anew;
++
++ done:
++	if (hp_sdc.wcurr >= 0) tasklet_schedule(&hp_sdc.task);
++	write_unlock(&hp_sdc.lock);
++	return 0;
++}
++
++/******* Functions called in either user or kernel context ****/
++int hp_sdc_enqueue_transaction(hp_sdc_transaction *this) {
++	unsigned long flags;
++	int i;
++
++	if (this == NULL) {
++		tasklet_schedule(&hp_sdc.task);
++		return -EINVAL;
++	};
++
++	write_lock_irqsave(&hp_sdc.lock, flags);
++
++	/* Can't have same transaction on queue twice */
++	for (i=0; i < HP_SDC_QUEUE_LEN; i++)
++		if (hp_sdc.tq[i] == this) goto fail;
++
++	this->actidx = 0;
++	this->idx = 1;
++
++	/* Search for empty slot */
++	for (i=0; i < HP_SDC_QUEUE_LEN; i++) {
++		if (hp_sdc.tq[i] == NULL) {
++			hp_sdc.tq[i] = this;
++			write_unlock_irqrestore(&hp_sdc.lock, flags);
++			tasklet_schedule(&hp_sdc.task);
++			return 0;
++		}
++	}
++	write_unlock_irqrestore(&hp_sdc.lock, flags);
++	printk(KERN_WARNING PREFIX "No free slot to add transaction.\n");
++	return -EBUSY;
++
++ fail:
++	write_unlock_irqrestore(&hp_sdc.lock,flags);
++	printk(KERN_WARNING PREFIX "Transaction add failed: transaction already queued?\n");
++	return -EINVAL;
++}
++
++int hp_sdc_dequeue_transaction(hp_sdc_transaction *this) {
++	unsigned long flags;
++	int i;
++
++	write_lock_irqsave(&hp_sdc.lock, flags);
++
++	/* TODO: don't remove it if it's not done. */
++
++	for (i=0; i < HP_SDC_QUEUE_LEN; i++)
++		if (hp_sdc.tq[i] == this) hp_sdc.tq[i] = NULL;
++
++	write_unlock_irqrestore(&hp_sdc.lock, flags);
++	return 0;
++}
++
++
++
++/********************** User context functions **************************/
++int hp_sdc_request_timer_irq(hp_sdc_irqhook *callback) {
++
++	if (callback == NULL || hp_sdc.dev == NULL) {
++		return -EINVAL;
++	}
++	write_lock_irq(&hp_sdc.hook_lock);
++	if (hp_sdc.timer != NULL) {
++		write_unlock_irq(&hp_sdc.hook_lock);
++		return -EBUSY;
++	}
++
++	hp_sdc.timer = callback;
++	/* Enable interrupts from the timers */
++	hp_sdc.im &= ~HP_SDC_IM_FH;
++        hp_sdc.im &= ~HP_SDC_IM_PT;
++	hp_sdc.im &= ~HP_SDC_IM_TIMERS;
++	hp_sdc.set_im = 1;
++	write_unlock_irq(&hp_sdc.hook_lock);
++
++	tasklet_schedule(&hp_sdc.task);
++
++	return 0;
++}
++
++int hp_sdc_request_hil_irq(hp_sdc_irqhook *callback) {
++
++	if (callback == NULL || hp_sdc.dev == NULL) {
++		return -EINVAL;
++	}
++	write_lock_irq(&hp_sdc.hook_lock);
++	if (hp_sdc.hil != NULL) {
++		write_unlock_irq(&hp_sdc.hook_lock);
++		return -EBUSY;
++	}
++
++	hp_sdc.hil = callback;
++	hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET);
++	hp_sdc.set_im = 1;
++	write_unlock_irq(&hp_sdc.hook_lock);
++
++	tasklet_schedule(&hp_sdc.task);
++
++	return 0;
++}
++
++int hp_sdc_request_cooked_irq(hp_sdc_irqhook *callback) {
++
++	if (callback == NULL || hp_sdc.dev == NULL) {
++		return -EINVAL;
++	}
++	write_lock_irq(&hp_sdc.hook_lock);
++	if (hp_sdc.cooked != NULL) {
++		write_unlock_irq(&hp_sdc.hook_lock);
++		return -EBUSY;
++	}
++
++	/* Enable interrupts from the HIL MLC */
++	hp_sdc.cooked = callback;
++	hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET);
++	hp_sdc.set_im = 1;
++	write_unlock_irq(&hp_sdc.hook_lock);
++
++	tasklet_schedule(&hp_sdc.task);
++
++	return 0;
++}
++
++int hp_sdc_release_timer_irq(hp_sdc_irqhook *callback) {
++
++
++	write_lock_irq(&hp_sdc.hook_lock);
++	if ((callback != hp_sdc.timer) ||
++	    (hp_sdc.timer == NULL)) {
++		write_unlock_irq(&hp_sdc.hook_lock);
++		return -EINVAL;
++	}
++
++	/* Disable interrupts from the timers */
++	hp_sdc.timer = NULL;
++	hp_sdc.im |= HP_SDC_IM_TIMERS;
++	hp_sdc.im |= HP_SDC_IM_FH;
++	hp_sdc.im |= HP_SDC_IM_PT;
++	hp_sdc.set_im = 1;
++	write_unlock_irq(&hp_sdc.hook_lock);
++	tasklet_schedule(&hp_sdc.task);
++
++	return 0;
++}
++
++int hp_sdc_release_hil_irq(hp_sdc_irqhook *callback) {
++
++	write_lock_irq(&hp_sdc.hook_lock);
++	if ((callback != hp_sdc.hil) ||
++	    (hp_sdc.hil == NULL)) {
++		write_unlock_irq(&hp_sdc.hook_lock);
++		return -EINVAL;
++	}
++
++	hp_sdc.hil = NULL;
++	/* Disable interrupts from HIL only if there is no cooked driver. */
++	if(hp_sdc.cooked == NULL) {
++		hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET);
++		hp_sdc.set_im = 1;
++	}
++	write_unlock_irq(&hp_sdc.hook_lock);
++	tasklet_schedule(&hp_sdc.task);
++
++	return 0;
++}
++
++int hp_sdc_release_cooked_irq(hp_sdc_irqhook *callback) {
++
++	write_lock_irq(&hp_sdc.hook_lock);
++	if ((callback != hp_sdc.cooked) ||
++	    (hp_sdc.cooked == NULL)) {
++		write_unlock_irq(&hp_sdc.hook_lock);
++		return -EINVAL;
++	}
++
++	hp_sdc.cooked = NULL;
++	/* Disable interrupts from HIL only if there is no raw HIL driver. */
++	if(hp_sdc.hil == NULL) {
++		hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET);
++		hp_sdc.set_im = 1;
++	}
++	write_unlock_irq(&hp_sdc.hook_lock);
++	tasklet_schedule(&hp_sdc.task);
++
++	return 0;
++}
++
++/************************* Keepalive timer task *********************/
++
++void hp_sdc_kicker (unsigned long data) {
++	tasklet_schedule(&hp_sdc.task);
++	/* Re-insert the periodic task. */
++	mod_timer(&hp_sdc.kicker, jiffies + HZ);
++}
++
++/************************** Module Initialization ***************************/
++
++#if defined(__hppa__)
++
++static struct parisc_device_id hp_sdc_tbl[] = {
++	{
++		.hw_type =	HPHW_FIO, 
++		.hversion_rev =	HVERSION_REV_ANY_ID,
++		.hversion =	HVERSION_ANY_ID,
++		.sversion =	0x73, 
++	 },
++	{ 0, }
++};
++
++MODULE_DEVICE_TABLE(parisc, hp_sdc_tbl);
++
++static int __init hp_sdc_init_hppa(struct parisc_device *d);
++
++static struct parisc_driver hp_sdc_driver = {
++	.name =		"HP SDC",
++	.id_table =	hp_sdc_tbl,
++	.probe =	hp_sdc_init_hppa,
++};
++
++#endif /* __hppa__ */
++
++static int __init hp_sdc_init(void)
++{
++	int i;
++	char *errstr;
++	hp_sdc_transaction t_sync;
++	uint8_t ts_sync[6];
++	struct semaphore s_sync;
++
++  	hp_sdc.lock		= RW_LOCK_UNLOCKED;
++  	hp_sdc.ibf_lock		= RW_LOCK_UNLOCKED;
++  	hp_sdc.rtq_lock		= RW_LOCK_UNLOCKED;
++  	hp_sdc.hook_lock	= RW_LOCK_UNLOCKED;
++
++	hp_sdc.timer		= NULL;
++	hp_sdc.hil		= NULL;
++	hp_sdc.pup		= NULL;
++	hp_sdc.cooked		= NULL;
++	hp_sdc.im		= HP_SDC_IM_MASK;  /* Mask maskable irqs */
++	hp_sdc.set_im		= 1;
++	hp_sdc.wi		= 0xff;
++	hp_sdc.r7[0]		= 0xff;
++	hp_sdc.r7[1]		= 0xff;
++	hp_sdc.r7[2]		= 0xff;
++	hp_sdc.r7[3]		= 0xff;
++	hp_sdc.ibf		= 1;
++
++	for (i = 0; i < HP_SDC_QUEUE_LEN; i++) hp_sdc.tq[i] = NULL;
++	hp_sdc.wcurr		= -1;
++        hp_sdc.rcurr		= -1;
++	hp_sdc.rqty		= 0;
++
++	hp_sdc.dev_err = -ENODEV;
++
++	errstr = "IO not found for";
++	if (!hp_sdc.base_io) goto err0;
++
++	errstr = "IRQ not found for";
++	if (!hp_sdc.irq) goto err0;
++
++	hp_sdc.dev_err = -EBUSY;
++
++#if defined(__hppa__)
++	errstr = "IO not available for";
++        if (request_region(hp_sdc.data_io, 2, hp_sdc_driver.name)) goto err0;
++#endif	
++
++	errstr = "IRQ not available for";
++        if(request_irq(hp_sdc.irq, &hp_sdc_isr, 0, "HP SDC",
++		       (void *) hp_sdc.base_io)) goto err1;
++
++	errstr = "NMI not available for";
++	if (request_irq(hp_sdc.nmi, &hp_sdc_nmisr, 0, "HP SDC NMI", 
++			(void *) hp_sdc.base_io)) goto err2;
++
++	printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", 
++	       (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
++
++	hp_sdc_status_in8();
++	hp_sdc_data_in8();
++
++	tasklet_init(&hp_sdc.task, hp_sdc_tasklet, 0);
++
++	/* Sync the output buffer registers, thus scheduling hp_sdc_tasklet. */
++	t_sync.actidx	= 0;
++	t_sync.idx	= 1;
++	t_sync.endidx	= 6;
++	t_sync.seq	= ts_sync;
++	ts_sync[0]	= HP_SDC_ACT_DATAREG | HP_SDC_ACT_SEMAPHORE;
++	ts_sync[1]	= 0x0f;
++	ts_sync[2] = ts_sync[3]	= ts_sync[4] = ts_sync[5] = 0;
++	t_sync.act.semaphore = &s_sync;
++	init_MUTEX_LOCKED(&s_sync);
++	hp_sdc_enqueue_transaction(&t_sync);
++	down(&s_sync); /* Wait for t_sync to complete */
++
++	/* Create the keepalive task */
++	init_timer(&hp_sdc.kicker);
++	hp_sdc.kicker.expires = jiffies + HZ;
++	hp_sdc.kicker.function = &hp_sdc_kicker;
++	add_timer(&hp_sdc.kicker);
++
++	hp_sdc.dev_err = 0;
++	return 0;
++ err2:
++	free_irq(hp_sdc.irq, NULL);
++ err1:
++	release_region(hp_sdc.data_io, 2);
++ err0:
++	printk(KERN_WARNING PREFIX ": %s SDC IO=0x%p IRQ=0x%x NMI=0x%x\n", 
++		errstr, (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi);
++	hp_sdc.dev = NULL;
++	return hp_sdc.dev_err;
++}
++
++#if defined(__hppa__)
++
++static int __init hp_sdc_init_hppa(struct parisc_device *d)
++{
++	if (!d) return 1;
++	if (hp_sdc.dev != NULL) return 1;	/* We only expect one SDC */
++
++	hp_sdc.dev		= d;
++	hp_sdc.irq		= d->irq;
++	hp_sdc.nmi		= d->aux_irq;
++	hp_sdc.base_io		= d->hpa;
++	hp_sdc.data_io		= d->hpa + 0x800;
++	hp_sdc.status_io	= d->hpa + 0x801;
++
++	return hp_sdc_init();
++}
++
++#endif /* __hppa__ */
++
++#if !defined(__mc68000__) /* Link error on m68k! */
++static void __exit hp_sdc_exit(void)
++#else
++static void hp_sdc_exit(void)
++#endif
++{
++	write_lock_irq(&hp_sdc.lock);
++
++	/* Turn off all maskable "sub-function" irq's. */
++	hp_sdc_spin_ibf();
++	sdc_writeb(HP_SDC_CMD_SET_IM | HP_SDC_IM_MASK, hp_sdc.status_io);
++
++	/* Wait until we know this has been processed by the i8042 */
++	hp_sdc_spin_ibf();
++
++	free_irq(hp_sdc.nmi, NULL);
++	free_irq(hp_sdc.irq, NULL);
++	write_unlock_irq(&hp_sdc.lock);
++
++	del_timer(&hp_sdc.kicker);
++
++	tasklet_kill(&hp_sdc.task);
++
++/*        release_region(hp_sdc.data_io, 2); */
++
++#if defined(__hppa__)
++	if (unregister_parisc_driver(&hp_sdc_driver)) 
++		printk(KERN_WARNING PREFIX "Error unregistering HP SDC");
++#endif
++}
++
++static int __init hp_sdc_register(void)
++{
++	hp_sdc_transaction tq_init;
++	uint8_t tq_init_seq[5];
++	struct semaphore tq_init_sem;
++#if defined(__mc68000__)
++	mm_segment_t fs;
++	unsigned char i;
++#endif
++	
++	hp_sdc.dev = NULL;
++	hp_sdc.dev_err = 0;
++#if defined(__hppa__)
++	if (register_parisc_driver(&hp_sdc_driver)) {
++		printk(KERN_WARNING PREFIX "Error registering SDC with system bus tree.\n");
++		return -ENODEV;
++	}
++#elif defined(__mc68000__)
++	if (!MACH_IS_HP300)
++	    return -ENODEV;
++
++	hp_sdc.irq	 = 1;
++	hp_sdc.nmi	 = 7;
++	hp_sdc.base_io	 = (unsigned long) 0xf0428000;
++	hp_sdc.data_io	 = (unsigned long) hp_sdc.base_io + 1;
++	hp_sdc.status_io = (unsigned long) hp_sdc.base_io + 3;
++	fs = get_fs();
++	set_fs(KERNEL_DS);
++	if (!get_user(i, (unsigned char *)hp_sdc.data_io))
++		hp_sdc.dev = (void *)1;
++	set_fs(fs);
++	hp_sdc.dev_err   = hp_sdc_init();
++#endif
++	if (hp_sdc.dev == NULL) {
++		printk(KERN_WARNING PREFIX "No SDC found.\n");
++		return hp_sdc.dev_err;
++	}
++
++	init_MUTEX_LOCKED(&tq_init_sem);
++
++	tq_init.actidx		= 0;
++	tq_init.idx		= 1;
++	tq_init.endidx		= 5;
++	tq_init.seq		= tq_init_seq;
++	tq_init.act.semaphore	= &tq_init_sem;
++
++	tq_init_seq[0] = 
++	  HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN | HP_SDC_ACT_SEMAPHORE;
++	tq_init_seq[1] = HP_SDC_CMD_READ_KCC;
++	tq_init_seq[2] = 1;
++	tq_init_seq[3] = 0;
++	tq_init_seq[4] = 0;
++
++	hp_sdc_enqueue_transaction(&tq_init);
++
++	down(&tq_init_sem);
++	up(&tq_init_sem);
++
++	if ((tq_init_seq[0] & HP_SDC_ACT_DEAD) == HP_SDC_ACT_DEAD) {
++		printk(KERN_WARNING PREFIX "Error reading config byte.\n");
++		hp_sdc_exit();
++		return -ENODEV;
++	}
++	hp_sdc.r11 = tq_init_seq[4];
++	if (hp_sdc.r11 & HP_SDC_CFG_NEW) {
++		char *str;
++		printk(KERN_INFO PREFIX "New style SDC\n");
++		tq_init_seq[1] = HP_SDC_CMD_READ_XTD;
++		tq_init.actidx		= 0;
++		tq_init.idx		= 1;
++		down(&tq_init_sem);
++		hp_sdc_enqueue_transaction(&tq_init);		
++		down(&tq_init_sem);
++		up(&tq_init_sem);
++		if ((tq_init_seq[0] & HP_SDC_ACT_DEAD) == HP_SDC_ACT_DEAD) {
++			printk(KERN_WARNING PREFIX "Error reading extended config byte.\n");
++			return -ENODEV;
++		}
++		hp_sdc.r7e = tq_init_seq[4];
++		HP_SDC_XTD_REV_STRINGS(hp_sdc.r7e & HP_SDC_XTD_REV, str)
++		printk(KERN_INFO PREFIX "Revision: %s\n", str);
++		if (hp_sdc.r7e & HP_SDC_XTD_BEEPER) {
++			printk(KERN_INFO PREFIX "TI SN76494 beeper present\n");
++		}
++		if (hp_sdc.r7e & HP_SDC_XTD_BBRTC) {
++			printk(KERN_INFO PREFIX "OKI MSM-58321 BBRTC present\n");
++		}
++		printk(KERN_INFO PREFIX "Spunking the self test register to force PUP "
++		       "on next firmware reset.\n");
++		tq_init_seq[0] = HP_SDC_ACT_PRECMD | 
++			HP_SDC_ACT_DATAOUT | HP_SDC_ACT_SEMAPHORE;
++		tq_init_seq[1] = HP_SDC_CMD_SET_STR;
++		tq_init_seq[2] = 1;
++		tq_init_seq[3] = 0;
++		tq_init.actidx		= 0;
++		tq_init.idx		= 1;
++		tq_init.endidx		= 4;
++		down(&tq_init_sem);
++		hp_sdc_enqueue_transaction(&tq_init);		
++		down(&tq_init_sem);
++		up(&tq_init_sem);
++	}
++	else {
++		printk(KERN_INFO PREFIX "Old style SDC (1820-%s).\n", 
++		       (hp_sdc.r11 & HP_SDC_CFG_REV) ? "3300" : "2564/3087");
++	}
++
++        return 0;
++}
++
++module_init(hp_sdc_register);
++module_exit(hp_sdc_exit);
++
++/* Timing notes:  These measurements taken on my 64MHz 7100-LC (715/64) 
++ *                                              cycles cycles-adj    time
++ * between two consecutive mfctl(16)'s:              4        n/a    63ns
++ * hp_sdc_spin_ibf when idle:                      119        115   1.7us
++ * gsc_writeb status register:                      83         79   1.2us
++ * IBF to clear after sending SET_IM:             6204       6006    93us
++ * IBF to clear after sending LOAD_RT:            4467       4352    68us  
++ * IBF to clear after sending two LOAD_RTs:      18974      18859   295us
++ * READ_T1, read status/data, IRQ, call handler: 35564        n/a   556us
++ * cmd to ~IBF READ_T1 2nd time right after:   5158403        n/a    81ms
++ * between IRQ received and ~IBF for above:    2578877        n/a    40ms
++ *
++ * Performance stats after a run of this module configuring HIL and
++ * receiving a few mouse events:
++ *
++ * status in8  282508 cycles 7128 calls
++ * status out8   8404 cycles  341 calls
++ * data out8     1734 cycles   78 calls
++ * isr         174324 cycles  617 calls (includes take)
++ * take          1241 cycles    2 calls
++ * put        1411504 cycles 6937 calls
++ * task       1655209 cycles 6937 calls (includes put)
++ *
++ */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/input/serio/hp_sdc_mlc.c CVS2_6_11_PA2/drivers/input/serio/hp_sdc_mlc.c
+--- LINUS_2_6_11/drivers/input/serio/hp_sdc_mlc.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/input/serio/hp_sdc_mlc.c	2004-10-30 13:51:50.000000000 -0600
+@@ -0,0 +1,358 @@
++/*
++ * Access to HP-HIL MLC through HP System Device Controller.
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ * System Device Controller Microprocessor Firmware Theory of Operation
++ *      for Part Number 1820-4784 Revision B.  Dwg No. A-1820-4784-2
++ *
++ */
++
++#include <linux/hil_mlc.h>
++#include <linux/hp_sdc.h>
++#include <linux/errno.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/string.h>
++
++#define PREFIX "HP SDC MLC: "
++
++static hil_mlc hp_sdc_mlc;
++
++MODULE_AUTHOR("Brian S. Julin <bri at calyx.com>");
++MODULE_DESCRIPTION("Glue for onboard HIL MLC in HP-PARISC machines");
++MODULE_LICENSE("Dual BSD/GPL");
++
++struct hp_sdc_mlc_priv_s {
++	int emtestmode;
++	hp_sdc_transaction trans;
++	u8 tseq[16];
++	int got5x;
++} hp_sdc_mlc_priv;
++
++/************************* Interrupt context ******************************/
++static void hp_sdc_mlc_isr (int irq, void *dev_id, 
++			    uint8_t status, uint8_t data) {
++  	int idx;
++	hil_mlc *mlc = &hp_sdc_mlc;
++
++	write_lock(&(mlc->lock));
++	if (mlc->icount < 0) {
++		printk(KERN_WARNING PREFIX "HIL Overflow!\n");
++		up(&mlc->isem);
++		goto out;
++	}
++	idx = 15 - mlc->icount;
++	if ((status & HP_SDC_STATUS_IRQMASK) == HP_SDC_STATUS_HILDATA) {
++		mlc->ipacket[idx] |= data | HIL_ERR_INT;
++		mlc->icount--;
++		if (hp_sdc_mlc_priv.got5x) goto check;
++		if (!idx) goto check;
++		if ((mlc->ipacket[idx-1] & HIL_PKT_ADDR_MASK) !=
++		    (mlc->ipacket[idx] & HIL_PKT_ADDR_MASK)) {
++			mlc->ipacket[idx] &= ~HIL_PKT_ADDR_MASK;
++			mlc->ipacket[idx] |= (mlc->ipacket[idx-1] 
++						    & HIL_PKT_ADDR_MASK);
++		}
++		goto check;
++	}
++	/* We know status is 5X */
++	if (data & HP_SDC_HIL_ISERR) goto err;
++	mlc->ipacket[idx] = 
++		(data & HP_SDC_HIL_R1MASK) << HIL_PKT_ADDR_SHIFT;
++	hp_sdc_mlc_priv.got5x = 1;
++	goto out;
++
++ check:
++	hp_sdc_mlc_priv.got5x = 0;
++	if (mlc->imatch == 0) goto done;
++	if ((mlc->imatch == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) 
++	    && (mlc->ipacket[idx] == (mlc->imatch | idx))) goto done;
++	if (mlc->ipacket[idx] == mlc->imatch) goto done;
++	goto out;
++
++ err:				
++	printk(KERN_DEBUG PREFIX "err code %x\n", data);
++	switch (data) {
++	case HP_SDC_HIL_RC_DONE:
++		printk(KERN_WARNING PREFIX "Bastard SDC reconfigured loop!\n");
++		break;
++	case HP_SDC_HIL_ERR:
++		mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_PERR | 
++		  HIL_ERR_FERR | HIL_ERR_FOF;
++		break;
++	case HP_SDC_HIL_TO:
++		mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_LERR;
++		break;
++	case HP_SDC_HIL_RC:
++		printk(KERN_WARNING PREFIX "Bastard SDC decided to reconfigure loop!\n");
++		break;
++	default:
++		printk(KERN_WARNING PREFIX "Unkown HIL Error status (%x)!\n", data);
++		break;
++	}
++	/* No more data will be coming due to an error. */
++ done:
++	tasklet_schedule(mlc->tasklet);
++	up(&(mlc->isem));
++ out:
++	write_unlock(&(mlc->lock));
++}
++
++
++/******************** Tasklet or userspace context functions ****************/
++
++static int hp_sdc_mlc_in (hil_mlc *mlc, suseconds_t timeout) {
++	unsigned long flags;
++	struct hp_sdc_mlc_priv_s *priv;
++	int rc = 2;
++
++	priv = mlc->priv;
++
++	write_lock_irqsave(&(mlc->lock), flags);
++
++	/* Try to down the semaphore */
++	if (down_trylock(&(mlc->isem))) {
++		struct timeval tv;
++		if (priv->emtestmode) {
++			mlc->ipacket[0] = 
++				HIL_ERR_INT | (mlc->opacket & 
++					       (HIL_PKT_CMD | 
++						HIL_PKT_ADDR_MASK | 
++						HIL_PKT_DATA_MASK));
++			mlc->icount = 14;
++			/* printk(KERN_DEBUG PREFIX ">[%x]\n", mlc->ipacket[0]); */
++			goto wasup;
++		}
++		do_gettimeofday(&tv);
++		tv.tv_usec += 1000000 * (tv.tv_sec - mlc->instart.tv_sec);
++		if (tv.tv_usec - mlc->instart.tv_usec > mlc->intimeout) {
++		  /*		  printk("!%i %i", 
++				  tv.tv_usec - mlc->instart.tv_usec, 
++				  mlc->intimeout);
++		  */
++			rc = 1;
++			up(&(mlc->isem));
++		}
++		goto done;
++	}
++ wasup:
++	up(&(mlc->isem));
++	rc = 0;
++	goto done;
++ done:
++	write_unlock_irqrestore(&(mlc->lock), flags);
++	return rc;
++}
++
++static int hp_sdc_mlc_cts (hil_mlc *mlc) {
++	struct hp_sdc_mlc_priv_s *priv;
++	unsigned long flags;
++
++	priv = mlc->priv;	
++
++	write_lock_irqsave(&(mlc->lock), flags);
++
++	/* Try to down the semaphores -- they should be up. */
++	if (down_trylock(&(mlc->isem))) {
++		BUG();
++		goto busy;
++	}
++	if (down_trylock(&(mlc->osem))) {
++	 	BUG();
++		up(&(mlc->isem));
++		goto busy;
++	}
++	up(&(mlc->isem));
++	up(&(mlc->osem));
++
++	if (down_trylock(&(mlc->csem))) {
++		if (priv->trans.act.semaphore != &(mlc->csem)) goto poll;
++		goto busy;
++	}
++	if (!(priv->tseq[4] & HP_SDC_USE_LOOP)) goto done;
++
++ poll:
++	priv->trans.act.semaphore = &(mlc->csem);
++	priv->trans.actidx = 0;
++	priv->trans.idx = 1;
++	priv->trans.endidx = 5;
++	priv->tseq[0] = 
++		HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN | HP_SDC_ACT_SEMAPHORE;
++	priv->tseq[1] = HP_SDC_CMD_READ_USE;
++	priv->tseq[2] = 1;
++	priv->tseq[3] = 0;
++	priv->tseq[4] = 0;
++	hp_sdc_enqueue_transaction(&(priv->trans));
++ busy:
++	write_unlock_irqrestore(&(mlc->lock), flags);
++	return 1;
++ done:
++	priv->trans.act.semaphore = &(mlc->osem);
++	up(&(mlc->csem));
++	write_unlock_irqrestore(&(mlc->lock), flags);
++	return 0;
++}
++
++static void hp_sdc_mlc_out (hil_mlc *mlc) {
++	struct hp_sdc_mlc_priv_s *priv;
++	unsigned long flags;
++
++	priv = mlc->priv;
++
++	write_lock_irqsave(&(mlc->lock), flags);
++	
++	/* Try to down the semaphore -- it should be up. */
++	if (down_trylock(&(mlc->osem))) {
++	 	BUG();
++		goto done;
++	}
++
++	if (mlc->opacket & HIL_DO_ALTER_CTRL) goto do_control;
++
++ do_data:
++	if (priv->emtestmode) {
++		up(&(mlc->osem));
++		goto done;
++	}
++	/* Shouldn't be sending commands when loop may be busy */
++	if (down_trylock(&(mlc->csem))) {
++	 	BUG();
++		goto done;
++	}
++	up(&(mlc->csem));
++
++	priv->trans.actidx = 0;
++	priv->trans.idx = 1;
++	priv->trans.act.semaphore = &(mlc->osem);
++	priv->trans.endidx = 6;
++	priv->tseq[0] = 
++		HP_SDC_ACT_DATAREG | HP_SDC_ACT_POSTCMD | HP_SDC_ACT_SEMAPHORE;
++	priv->tseq[1] = 0x7;
++	priv->tseq[2] = 
++		(mlc->opacket & 
++		 (HIL_PKT_ADDR_MASK | HIL_PKT_CMD))
++		   >> HIL_PKT_ADDR_SHIFT;
++	priv->tseq[3] = 
++		(mlc->opacket & HIL_PKT_DATA_MASK) 
++		  >> HIL_PKT_DATA_SHIFT;
++	priv->tseq[4] = 0;  /* No timeout */
++	if (priv->tseq[3] == HIL_CMD_DHR) priv->tseq[4] = 1;
++	priv->tseq[5] = HP_SDC_CMD_DO_HIL;
++	goto enqueue;
++
++ do_control:
++	priv->emtestmode = mlc->opacket & HIL_CTRL_TEST;
++	if ((mlc->opacket & (HIL_CTRL_APE | HIL_CTRL_IPF)) == HIL_CTRL_APE) {
++		BUG(); /* we cannot emulate this, it should not be used. */
++	}
++	if ((mlc->opacket & HIL_CTRL_ONLY) == HIL_CTRL_ONLY) goto control_only;
++	if (mlc->opacket & HIL_CTRL_APE) { 
++		BUG(); /* Should not send command/data after engaging APE */
++		goto done;
++	}
++	/* Disengaging APE this way would not be valid either since 
++	 * the loop must be allowed to idle.
++	 *
++	 * So, it works out that we really never actually send control 
++	 * and data when using SDC, we just send the data. 
++	 */
++	goto do_data;
++
++ control_only:
++	priv->trans.actidx = 0;
++	priv->trans.idx = 1;
++	priv->trans.act.semaphore = &(mlc->osem);
++	priv->trans.endidx = 4;
++	priv->tseq[0] = 
++	  HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT | HP_SDC_ACT_SEMAPHORE;
++	priv->tseq[1] = HP_SDC_CMD_SET_LPC;
++	priv->tseq[2] = 1;
++	//	priv->tseq[3] = (mlc->ddc + 1) | HP_SDC_LPS_ACSUCC;
++	priv->tseq[3] = 0;
++	if (mlc->opacket & HIL_CTRL_APE) {
++		priv->tseq[3] |= HP_SDC_LPC_APE_IPF;
++		down_trylock(&(mlc->csem));
++	} 
++ enqueue:
++	hp_sdc_enqueue_transaction(&(priv->trans));
++ done:
++	write_unlock_irqrestore(&(mlc->lock), flags);
++}
++
++static int __init hp_sdc_mlc_init(void)
++{
++	hil_mlc *mlc = &hp_sdc_mlc;
++
++	printk(KERN_INFO PREFIX "Registering the System Domain Controller's HIL MLC.\n");
++
++	hp_sdc_mlc_priv.emtestmode = 0;
++	hp_sdc_mlc_priv.trans.seq = hp_sdc_mlc_priv.tseq;
++	hp_sdc_mlc_priv.trans.act.semaphore = &(mlc->osem);
++	hp_sdc_mlc_priv.got5x = 0;
++
++	mlc->cts		= &hp_sdc_mlc_cts;
++	mlc->in			= &hp_sdc_mlc_in;
++	mlc->out		= &hp_sdc_mlc_out;
++
++	if (hil_mlc_register(mlc)) {
++		printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n");
++		goto err0;
++	}
++	mlc->priv		= &hp_sdc_mlc_priv;
++
++	if (hp_sdc_request_hil_irq(&hp_sdc_mlc_isr)) {
++		printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n");
++		goto err1;
++	}
++	return 0;
++ err1:
++	if (hil_mlc_unregister(mlc)) {
++		printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n"
++			"This is bad.  Could cause an oops.\n");
++	}
++ err0:
++	return -EBUSY;
++}
++
++static void __exit hp_sdc_mlc_exit(void)
++{
++	hil_mlc *mlc = &hp_sdc_mlc;
++	if (hp_sdc_release_hil_irq(&hp_sdc_mlc_isr)) {
++		printk(KERN_ERR PREFIX "Failed to release the raw HIL ISR hook.\n"
++			"This is bad.  Could cause an oops.\n");
++	}
++	if (hil_mlc_unregister(mlc)) {
++		printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n"
++			"This is bad.  Could cause an oops.\n");
++	}
++}
++
++module_init(hp_sdc_mlc_init);
++module_exit(hp_sdc_mlc_exit);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/net/tulip/media.c CVS2_6_11_PA2/drivers/net/tulip/media.c
+--- LINUS_2_6_11/drivers/net/tulip/media.c	2005-03-02 04:19:10.000000000 -0700
++++ CVS2_6_11_PA2/drivers/net/tulip/media.c	2005-01-12 13:16:53.000000000 -0700
+@@ -44,8 +44,10 @@
+ 
+ /* MII transceiver control section.
+    Read and write the MII registers using software-generated serial
+-   MDIO protocol.  See the MII specifications or DP83840A data sheet
+-   for details. */
++   MDIO protocol.
++   See IEEE 802.3-2002.pdf (Section 2, Chapter "22.2.4 Management functions")
++   or DP83840A data sheet for more details.
++   */
+ 
+ int tulip_mdio_read(struct net_device *dev, int phy_id, int location)
+ {
+@@ -307,13 +309,29 @@
+ 				int reset_length = p[2 + init_length];
+ 				misc_info = (u16*)(reset_sequence + reset_length);
+ 				if (startup) {
++					int timeout = 10;	/* max 1 ms */
+ 					iowrite32(mtable->csr12dir | 0x100, ioaddr + CSR12);
+ 					for (i = 0; i < reset_length; i++)
+ 						iowrite32(reset_sequence[i], ioaddr + CSR12);
++
++					/* flush posted writes */
++					ioread32(ioaddr + CSR12);
++
++					/* Sect 3.10.3 in DP83840A.pdf (p39) */
++					udelay(500);
++
++					/* Section 4.2 in DP83840A.pdf (p43) */
++					/* and IEEE 802.3 "22.2.4.1.1 Reset" */
++					while (timeout-- &&
++						(tulip_mdio_read (dev, phy_num, MII_BMCR) & BMCR_RESET))
++						udelay(100);
+ 				}
+ 				for (i = 0; i < init_length; i++)
+ 					iowrite32(init_sequence[i], ioaddr + CSR12);
++
++				ioread32(ioaddr + CSR12);	/* flush posted writes */
+ 			}
++
+ 			tmp_info = get_u16(&misc_info[1]);
+ 			if (tmp_info)
+ 				tp->advertising[phy_num] = tmp_info | 1;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/net/tulip/tulip.h CVS2_6_11_PA2/drivers/net/tulip/tulip.h
+--- LINUS_2_6_11/drivers/net/tulip/tulip.h	2005-03-02 04:19:10.000000000 -0700
++++ CVS2_6_11_PA2/drivers/net/tulip/tulip.h	2005-01-12 13:16:53.000000000 -0700
+@@ -475,8 +475,11 @@
+ 			udelay(10);
+ 
+ 		if (!i)
+-			printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed\n",
+-					tp->pdev->slot_name);
++			printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed"
++					" (CSR5 0x%x CSR6 0x%x)\n",
++					tp->pdev->slot_name,
++					ioread32(ioaddr + CSR5),
++					ioread32(ioaddr + CSR6));
+ 	}
+ }
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/net/tulip/tulip_core.c CVS2_6_11_PA2/drivers/net/tulip/tulip_core.c
+--- LINUS_2_6_11/drivers/net/tulip/tulip_core.c	2005-03-02 04:19:10.000000000 -0700
++++ CVS2_6_11_PA2/drivers/net/tulip/tulip_core.c	2005-01-22 07:59:27.000000000 -0700
+@@ -22,7 +22,7 @@
+ #else
+ #define DRV_VERSION	"1.1.13"
+ #endif
+-#define DRV_RELDATE	"May 11, 2002"
++#define DRV_RELDATE	"December 15, 2004"
+ 
+ 
+ #include <linux/module.h>
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/Kconfig CVS2_6_11_PA2/drivers/parisc/Kconfig
+--- LINUS_2_6_11/drivers/parisc/Kconfig	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/Kconfig	2005-01-13 08:35:18.000000000 -0700
+@@ -110,6 +110,14 @@
+ #	help
+ #	  Say Y here for V-class PCI, DMA/IOMMU, IRQ subsystem support.
+ 
++source "drivers/pcmcia/Kconfig"
++
++source "drivers/pci/hotplug/Kconfig"
++
++endmenu
++
++menu "PA-RISC specific drivers"
++
+ config SUPERIO
+ 	bool "SuperIO (SuckyIO) support"
+ 	depends on PCI_LBA
+@@ -144,9 +152,18 @@
+ 	  
+ 	  If unsure, say Y.
+ 
+-source "drivers/pcmcia/Kconfig"
+-
+-source "drivers/pci/hotplug/Kconfig"
+-
++config PDC_STABLE
++	tristate "PDC Stable Storage support"
++	depends on SYSFS
++	default y
++	help
++	  Say Y here if you want to enable support for accessing Stable Storage
++	  variables (PDC non volatile variables such as Primary Boot Path,
++	  Console Path, Autoboot, Autosearch, etc) through SysFS.
++	
++	  If unsure, say Y.
++	
++	  To compile this driver as a module, choose M here.
++	  The module will be called pdc_stable.
+ 
+ endmenu
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/Makefile CVS2_6_11_PA2/drivers/parisc/Makefile
+--- LINUS_2_6_11/drivers/parisc/Makefile	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/Makefile	2005-01-12 17:17:12.000000000 -0700
+@@ -22,5 +22,6 @@
+ 
+ obj-$(CONFIG_SUPERIO)		+= superio.o
+ obj-$(CONFIG_CHASSIS_LCD_LED)	+= led.o
++obj-$(CONFIG_PDC_STABLE)	+= pdc_stable.o
+ obj-y				+= power.o
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/asp.c CVS2_6_11_PA2/drivers/parisc/asp.c
+--- LINUS_2_6_11/drivers/parisc/asp.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/asp.c	2005-02-03 05:48:16.000000000 -0700
+@@ -30,6 +30,8 @@
+ 
+ #define VIPER_INT_WORD  0xFFFBF088      /* addr of viper interrupt word */
+ 
++static struct gsc_asic asp;
++
+ static void asp_choose_irq(struct parisc_device *dev, void *ctrl)
+ {
+ 	int irq;
+@@ -51,6 +53,14 @@
+ 	}
+ 
+ 	gsc_asic_assign_irq(ctrl, irq, &dev->irq);
++
++	switch (dev->id.sversion) {
++	case 0x73:	irq =  2; break; /* i8042 High-priority */
++	case 0x76:	irq =  0; break; /* EISA BA */
++	default:	return;		 /* Other */
++	}
++
++	gsc_asic_assign_irq(ctrl, irq, &dev->aux_irq);
+ }
+ 
+ /* There are two register ranges we're interested in.  Interrupt /
+@@ -64,20 +74,15 @@
+ int __init
+ asp_init_chip(struct parisc_device *dev)
+ {
+-	struct gsc_asic *asp;
+ 	struct gsc_irq gsc_irq;
+ 	int ret;
+ 
+-	asp = kmalloc(sizeof(*asp), GFP_KERNEL);
+-	if(!asp)
+-		return -ENOMEM;
+-
+-	asp->version = gsc_readb(dev->hpa + ASP_VER_OFFSET) & 0xf;
+-	asp->name = (asp->version == 1) ? "Asp" : "Cutoff";
+-	asp->hpa = ASP_INTERRUPT_ADDR;
++	asp.version = gsc_readb(dev->hpa + ASP_VER_OFFSET) & 0xf;
++	asp.name = (asp.version == 1) ? "Asp" : "Cutoff";
++	asp.hpa = ASP_INTERRUPT_ADDR;
+ 
+ 	printk(KERN_INFO "%s version %d at 0x%lx found.\n", 
+-		asp->name, asp->version, dev->hpa);
++		asp.name, asp.version, dev->hpa);
+ 
+ 	/* the IRQ ASP should use */
+ 	ret = -EBUSY;
+@@ -87,9 +92,9 @@
+ 		goto out;
+ 	}
+ 
+-	asp->eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
++	asp.eim = ((u32) gsc_irq.txn_addr) | gsc_irq.txn_data;
+ 
+-	ret = request_irq(gsc_irq.irq, gsc_asic_intr, 0, "asp", asp);
++	ret = request_irq(gsc_irq.irq, gsc_asic_intr, 0, "asp", &asp);
+ 	if (ret < 0)
+ 		goto out;
+ 
+@@ -97,13 +102,13 @@
+ 	gsc_writel((1 << (31 - ASP_GSC_IRQ)),VIPER_INT_WORD);
+ 
+ 	/* Done init'ing, register this driver */
+-	ret = gsc_common_setup(dev, asp);
++	ret = gsc_common_setup(dev, &asp);
+ 	if (ret)
+ 		goto out;
+ 
+-	gsc_fixup_irqs(dev, asp, asp_choose_irq);
++	gsc_fixup_irqs(dev, &asp, asp_choose_irq);
+ 	/* Mongoose is a sibling of Asp, not a child... */
+-	gsc_fixup_irqs(parisc_parent(dev), asp, asp_choose_irq);
++	gsc_fixup_irqs(parisc_parent(dev), &asp, asp_choose_irq);
+ 
+ 	/* initialize the chassis LEDs */ 
+ #ifdef CONFIG_CHASSIS_LCD_LED	
+@@ -111,10 +116,7 @@
+ 		    ASP_LED_ADDR);
+ #endif
+ 
+-	return 0;
+-
+-out:
+-	kfree(asp);
++ out:
+ 	return ret;
+ }
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/ccio-dma.c CVS2_6_11_PA2/drivers/parisc/ccio-dma.c
+--- LINUS_2_6_11/drivers/parisc/ccio-dma.c	2004-11-17 11:07:08.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/ccio-dma.c	2005-03-06 16:48:39.000000000 -0700
+@@ -262,8 +262,6 @@
+ 	struct resource mmio_region[2]; /* The "routed" MMIO regions */
+ };
+ 
+-/* Ratio of Host MEM to IOV Space size */
+-static unsigned long ccio_mem_ratio = 4;
+ static struct ioc *ioc_list;
+ static int ioc_count;
+ 
+@@ -559,7 +557,7 @@
+ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
+ 		   unsigned long hints)
+ {
+-	register unsigned long pa = (volatile unsigned long) vba;
++	register unsigned long pa;
+ 	register unsigned long ci; /* coherent index */
+ 
+ 	/* We currently only support kernel addresses */
+@@ -1243,6 +1241,21 @@
+ #define CCIO_CHAINID_MASK	0xff
+ #endif /* 0 */
+ 
++/* We *can't* support JAVA (T600). Venture there at your own risk. */
++static struct parisc_device_id ccio_tbl[] = {
++	{ HPHW_IOA, HVERSION_REV_ANY_ID, U2_IOA_RUNWAY, 0xb }, /* U2 */
++	{ HPHW_IOA, HVERSION_REV_ANY_ID, UTURN_IOA_RUNWAY, 0xb }, /* UTurn */
++	{ 0, }
++};
++
++static int ccio_probe(struct parisc_device *dev);
++
++static struct parisc_driver ccio_driver = {
++	.name =		"U2:Uturn",
++	.id_table =	ccio_tbl,
++	.probe =	ccio_probe,
++};
++
+ /**
+  * ccio_ioc_init - Initalize the I/O Controller
+  * @ioc: The I/O Controller.
+@@ -1254,9 +1267,9 @@
+ static void
+ ccio_ioc_init(struct ioc *ioc)
+ {
+-	int i, iov_order;
++	int i;
++	unsigned int iov_order;
+ 	u32 iova_space_size;
+-	unsigned long physmem;
+ 
+ 	/*
+ 	** Determine IOVA Space size from memory size.
+@@ -1269,17 +1282,16 @@
+ 	** Hot-Plug/Removal of PCI cards. (aka PCI OLARD).
+ 	*/
+ 
++	iova_space_size = (u32) (num_physpages / count_parisc_driver(&ccio_driver));
++
+ 	/* limit IOVA space size to 1MB-1GB */
+ 
+-	physmem = num_physpages << PAGE_SHIFT;
+-	if(physmem < (ccio_mem_ratio * 1024 * 1024)) {
+-		iova_space_size = 1024 * 1024;
++	if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
++		iova_space_size =  1 << (20 - PAGE_SHIFT);
+ #ifdef __LP64__
+-	} else if(physmem > (ccio_mem_ratio * 512 * 1024 * 1024)) {
+-		iova_space_size = 512 * 1024 * 1024;
++	} else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) {
++		iova_space_size =  1 << (30 - PAGE_SHIFT);
+ #endif
+-	} else {
+-		iova_space_size = (u32)(physmem / ccio_mem_ratio);
+ 	}
+ 
+ 	/*
+@@ -1295,10 +1307,10 @@
+ 	**   this is the case under linux."
+ 	*/
+ 
+-	iov_order = get_order(iova_space_size) >> (IOVP_SHIFT - PAGE_SHIFT);
+-	BUG_ON(iov_order > (30 - IOVP_SHIFT));   /* iova_space_size <= 1GB */
+-	BUG_ON(iov_order < (20 - IOVP_SHIFT));   /* iova_space_size >= 1MB */
+-	iova_space_size = 1 << (iov_order + IOVP_SHIFT);
++	iov_order = get_order(iova_space_size << PAGE_SHIFT);
++
++	/* iova_space_size is now bytes, not pages */
++	iova_space_size = 1 << (iov_order + PAGE_SHIFT);
+ 
+ 	ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);
+ 
+@@ -1307,9 +1319,12 @@
+ 	/* Verify it's a power of two */
+ 	BUG_ON((1 << get_order(ioc->pdir_size)) != (ioc->pdir_size >> PAGE_SHIFT));
+ 
+-	DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits) PDIR size 0x%0x",
+-		__FUNCTION__, ioc->ioc_hpa, physmem>>20, iova_space_size>>20,
+-		 iov_order + PAGE_SHIFT, ioc->pdir_size);
++	DBG_INIT("%s() hpa 0x%lx mem %luMB IOV %dMB (%d bits)\n",
++			__FUNCTION__,
++			ioc->ioc_hpa,
++			(unsigned long) num_physpages >> (20 - PAGE_SHIFT),
++			iova_space_size>>20,
++			iov_order + PAGE_SHIFT);
+ 
+ 	ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL, 
+ 						 get_order(ioc->pdir_size));
+@@ -1566,19 +1581,6 @@
+ 	return 0;
+ }
+ 
+-/* We *can't* support JAVA (T600). Venture there at your own risk. */
+-static struct parisc_device_id ccio_tbl[] = {
+-	{ HPHW_IOA, HVERSION_REV_ANY_ID, U2_IOA_RUNWAY, 0xb }, /* U2 */
+-	{ HPHW_IOA, HVERSION_REV_ANY_ID, UTURN_IOA_RUNWAY, 0xb }, /* UTurn */
+-	{ 0, }
+-};
+-
+-static struct parisc_driver ccio_driver = {
+-	.name =		"U2:Uturn",
+-	.id_table =	ccio_tbl,
+-	.probe =	ccio_probe,
+-};
+-
+ /**
+  * ccio_init - ccio initalization procedure.
+  *
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/eisa.c CVS2_6_11_PA2/drivers/parisc/eisa.c
+--- LINUS_2_6_11/drivers/parisc/eisa.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/eisa.c	2005-02-15 08:23:58.000000000 -0700
+@@ -44,6 +44,7 @@
+ #include <asm/parisc-device.h>
+ #include <asm/delay.h>
+ #include <asm/eisa_bus.h>
++#include <asm/eisa_eeprom.h>
+ 
+ #if 0
+ #define EISA_DBG(msg, arg... ) printk(KERN_DEBUG "eisa: " msg , ## arg )
+@@ -56,6 +57,8 @@
+ 
+ static DEFINE_SPINLOCK(eisa_irq_lock);
+ 
++void __iomem *eisa_eeprom_addr;
++
+ /* We can only have one EISA adapter in the system because neither
+  * implementation can be flexed.
+  */
+@@ -351,6 +354,7 @@
+ 	}
+ 	
+ 	EISA_bus = 1;
++
+ 	if (dev->num_addrs) {
+ 		/* newer firmware hand out the eeprom address */
+ 		eisa_dev.eeprom_addr = dev->addr[0];
+@@ -362,8 +366,9 @@
+ 			eisa_dev.eeprom_addr = MIRAGE_EEPROM_BASE_ADDR;
+ 		}
+ 	}
+-	eisa_eeprom_init(eisa_dev.eeprom_addr);
+-	result = eisa_enumerator(eisa_dev.eeprom_addr, &eisa_dev.hba.io_space, &eisa_dev.hba.lmmio_space);
++	eisa_eeprom_addr = ioremap(eisa_dev.eeprom_addr, HPEE_MAX_LENGTH);
++	result = eisa_enumerator(eisa_dev.eeprom_addr, &eisa_dev.hba.io_space,
++			&eisa_dev.hba.lmmio_space);
+ 	init_eisa_pic();
+ 
+ 	if (result >= 0) {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/eisa_eeprom.c CVS2_6_11_PA2/drivers/parisc/eisa_eeprom.c
+--- LINUS_2_6_11/drivers/parisc/eisa_eeprom.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/eisa_eeprom.c	2005-03-01 23:47:37.000000000 -0700
+@@ -19,7 +19,6 @@
+  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+ 
+-#include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+@@ -32,8 +31,6 @@
+ 
+ #define 	EISA_EEPROM_MINOR 241
+ 
+-static unsigned long eeprom_addr;
+-
+ static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin )
+ {
+ 	switch (origin) {
+@@ -64,7 +61,7 @@
+ 	tmp = kmalloc(count, GFP_KERNEL);
+ 	if (tmp) {
+ 		for (i = 0; i < count; i++)
+-			tmp[i] = gsc_readb(eeprom_addr+(*ppos)++);
++			tmp[i] = readb(eisa_eeprom_addr+(*ppos)++);
+ 
+ 		if (copy_to_user (buf, tmp, count))
+ 			ret = -EFAULT;
+@@ -86,7 +83,7 @@
+ 
+ static int eisa_eeprom_open(struct inode *inode, struct file *file)
+ {
+-	if (file->f_mode & 2 || eeprom_addr == 0)
++	if (file->f_mode & 2)
+ 		return -EINVAL;
+    
+ 	return 0;
+@@ -109,22 +106,18 @@
+ 	.release =	eisa_eeprom_release,
+ };
+ 
+-static struct miscdevice eisa_eeprom_dev=
+-{
++static struct miscdevice eisa_eeprom_dev = {
+ 	EISA_EEPROM_MINOR,
+-	"eisa eeprom",
++	"eisa_eeprom",
+ 	&eisa_eeprom_fops
+ };
+ 
+-int __init eisa_eeprom_init(unsigned long addr)
++static int __init eisa_eeprom_init(void)
+ {
+ 	int retval;
+ 
+-	/* XXX why return success when we haven't done anything? */
+-	if (!addr)
+-		return 0;
+-
+-	eeprom_addr = addr;
++	if (!eisa_eeprom_addr)
++		return -ENODEV;
+ 
+ 	retval = misc_register(&eisa_eeprom_dev);
+ 	if (retval < 0) {
+@@ -132,8 +125,10 @@
+ 		return retval;
+ 	}
+ 
+-	printk(KERN_INFO "EISA EEPROM at 0x%lx\n", eeprom_addr);
++	printk(KERN_INFO "EISA EEPROM at 0x%p\n", eisa_eeprom_addr);
+ 	return 0;
+ }
+ 
+ MODULE_LICENSE("GPL");
++
++module_init(eisa_eeprom_init);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/gsc.c CVS2_6_11_PA2/drivers/parisc/gsc.c
+--- LINUS_2_6_11/drivers/parisc/gsc.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/gsc.c	2005-01-22 17:09:47.000000000 -0700
+@@ -38,14 +38,14 @@
+ 
+ int gsc_alloc_irq(struct gsc_irq *i)
+ {
+-	int irq = txn_alloc_irq();
++	int irq = txn_alloc_irq(GSC_EIM_WIDTH);
+ 	if (irq < 0) {
+ 		printk("cannot get irq\n");
+ 		return irq;
+ 	}
+ 
+ 	i->txn_addr = txn_alloc_addr(irq);
+-	i->txn_data = txn_alloc_data(irq, GSC_EIM_WIDTH);
++	i->txn_data = txn_alloc_data(irq);
+ 	i->irq = irq;
+ 
+ 	return irq;
+@@ -64,7 +64,7 @@
+ 	}
+ 
+ 	i->txn_addr = txn_alloc_addr(irq);
+-	i->txn_data = txn_alloc_data(irq, GSC_EIM_WIDTH);
++	i->txn_data = txn_alloc_data(irq);
+ 	i->irq = irq;
+ 
+ 	return irq;
+@@ -171,12 +171,16 @@
+ 
+ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp)
+ {
+-	int irq = gsc_assign_irq(&gsc_asic_interrupt_type, asic);
+-	if (irq == NO_IRQ)
+-		return;
++	int irq = asic->global_irq[local_irq];
++	
++	if (irq <= 0) {
++		irq = gsc_assign_irq(&gsc_asic_interrupt_type, asic);
++		if (irq == NO_IRQ)
++			return;
+ 
++		asic->global_irq[local_irq] = irq;
++	}
+ 	*irqp = irq;
+-	asic->global_irq[local_irq] = irq;
+ }
+ 
+ void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
+@@ -198,9 +202,15 @@
+ int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic)
+ {
+ 	struct resource *res;
++	int i;
+ 
+ 	gsc_asic->gsc = parent;
+ 
++	/* Initialise local irq -> global irq mapping */
++	for (i = 0; i < 32; i++) {
++		gsc_asic->global_irq[i] = NO_IRQ;
++	}
++
+ 	/* allocate resource region */
+ 	res = request_mem_region(gsc_asic->hpa, 0x100000, gsc_asic->name);
+ 	if (res) {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/hppb.c CVS2_6_11_PA2/drivers/parisc/hppb.c
+--- LINUS_2_6_11/drivers/parisc/hppb.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/hppb.c	2005-03-01 23:47:37.000000000 -0700
+@@ -16,7 +16,6 @@
+ **
+ */
+ 
+-#include <linux/config.h>
+ #include <linux/types.h>
+ #include <linux/init.h>
+ #include <linux/mm.h>
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/iosapic.c CVS2_6_11_PA2/drivers/parisc/iosapic.c
+--- LINUS_2_6_11/drivers/parisc/iosapic.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/iosapic.c	2005-02-11 14:28:18.000000000 -0700
+@@ -158,31 +158,9 @@
+ 
+ 
+ #ifdef DEBUG_IOSAPIC
+-static char assert_buf[128];
+-
+-static int
+-assert_failed (char *a, char *f, int l)
+-{
+-        sprintf(assert_buf,
+-			"ASSERT(%s) failed!\nline %d in %s\n",
+-			a,      /* assertion text */
+-			l,      /* line number */
+-			f);     /* file name */
+-        panic(assert_buf);
+-	return 0;
+-}
+-
+-#undef ASSERT
+-#define ASSERT(EX) { if (!(EX)) assert_failed(# EX, __FILE__, __LINE__); }
+-
+ #define DBG(x...) printk(x)
+-
+ #else /* DEBUG_IOSAPIC */
+-
+ #define DBG(x...)
+-#undef	ASSERT
+-#define ASSERT(EX)
+-
+ #endif /* DEBUG_IOSAPIC */
+ 
+ #ifdef DEBUG_IOSAPIC_IRT
+@@ -191,6 +169,12 @@
+ #define DBG_IRT(x...)
+ #endif
+ 
++#ifdef CONFIG_64BIT
++#define COMPARE_IRTE_ADDR(irte, hpa)	((irte)->dest_iosapic_addr == (hpa))
++#else
++#define COMPARE_IRTE_ADDR(irte, hpa)	\
++		((irte)->dest_iosapic_addr == ((hpa) | 0xffffffff00000000ULL))
++#endif
+ 
+ #define IOSAPIC_REG_SELECT              0x00
+ #define IOSAPIC_REG_WINDOW              0x10
+@@ -201,33 +185,18 @@
+ #define IOSAPIC_IRDT_ENTRY(idx)		(0x10+(idx)*2)
+ #define IOSAPIC_IRDT_ENTRY_HI(idx)	(0x11+(idx)*2)
+ 
+-static inline unsigned int iosapic_read(unsigned long iosapic, unsigned int reg)
++static inline unsigned int iosapic_read(void __iomem *iosapic, unsigned int reg)
+ {
+ 	writel(reg, iosapic + IOSAPIC_REG_SELECT);
+ 	return readl(iosapic + IOSAPIC_REG_WINDOW);
+ }
+ 
+-static inline void iosapic_write(unsigned long iosapic, unsigned int reg, u32 val)
++static inline void iosapic_write(void __iomem *iosapic, unsigned int reg, u32 val)
+ {
+ 	writel(reg, iosapic + IOSAPIC_REG_SELECT);
+ 	writel(val, iosapic + IOSAPIC_REG_WINDOW);
+ }
+ 
+-/*
+-**     GFP_KERNEL includes __GFP_WAIT flag and that may not
+-**     be acceptable. Since this is boot time, we shouldn't have
+-**     to wait ever and this code should (will?) never get called
+-**     from the interrrupt context.
+-*/
+-#define	IOSAPIC_KALLOC(a_type, cnt) \
+-			(a_type *) kmalloc(sizeof(a_type)*(cnt), GFP_KERNEL)
+-#define IOSAPIC_FREE(addr, f_type, cnt) kfree((void *)addr)
+-
+-
+-#define	IOSAPIC_LOCK(lck)	spin_lock_irqsave(lck, irqflags)
+-#define	IOSAPIC_UNLOCK(lck)	spin_unlock_irqrestore(lck, irqflags)
+-
+-
+ #define IOSAPIC_VERSION_MASK	0x000000ff
+ #define	IOSAPIC_VERSION(ver)	((int) (ver & IOSAPIC_VERSION_MASK))
+ 
+@@ -265,52 +234,64 @@
+ static struct irt_entry *irt_cell;
+ static size_t irt_num_entry;
+ 
++static struct irt_entry *iosapic_alloc_irt(int num_entries)
++{
++	unsigned long a;
+ 
++	/* The IRT needs to be 8-byte aligned for the PDC call. 
++	 * Normally kmalloc would guarantee larger alignment, but
++	 * if CONFIG_DEBUG_SLAB is enabled, then we can get only
++	 * 4-byte alignment on 32-bit kernels
++	 */
++	a = (unsigned long)kmalloc(sizeof(struct irt_entry) * num_entries + 8, GFP_KERNEL);
++	a = (a + 7) & ~7;
++	return (struct irt_entry *)a;
++}
+ 
+-/*
+-** iosapic_load_irt
+-**
+-** The "Get PCI INT Routing Table Size" option returns the number of 
+-** entries in the PCI interrupt routing table for the cell specified 
+-** in the cell_number argument.  The cell number must be for a cell 
+-** within the caller's protection domain.
+-**
+-** The "Get PCI INT Routing Table" option returns, for the cell 
+-** specified in the cell_number argument, the PCI interrupt routing 
+-** table in the caller allocated memory pointed to by mem_addr.
+-** We assume the IRT only contains entries for I/O SAPIC and
+-** calculate the size based on the size of I/O sapic entries.
+-**
+-** The PCI interrupt routing table entry format is derived from the
+-** IA64 SAL Specification 2.4.   The PCI interrupt routing table defines
+-** the routing of PCI interrupt signals between the PCI device output
+-** "pins" and the IO SAPICs' input "lines" (including core I/O PCI
+-** devices).  This table does NOT include information for devices/slots
+-** behind PCI to PCI bridges. See PCI to PCI Bridge Architecture Spec.
+-** for the architected method of routing of IRQ's behind PPB's.
+-*/
++/**
++ * iosapic_load_irt - Fill in the interrupt routing table
++ * @cell_num: The cell number of the CPU we're currently executing on
++ * @irt: The address to place the new IRT at
++ * @return The number of entries found
++ *
++ * The "Get PCI INT Routing Table Size" option returns the number of 
++ * entries in the PCI interrupt routing table for the cell specified 
++ * in the cell_number argument.  The cell number must be for a cell 
++ * within the caller's protection domain.
++ *
++ * The "Get PCI INT Routing Table" option returns, for the cell 
++ * specified in the cell_number argument, the PCI interrupt routing 
++ * table in the caller allocated memory pointed to by mem_addr.
++ * We assume the IRT only contains entries for I/O SAPIC and
++ * calculate the size based on the size of I/O sapic entries.
++ *
++ * The PCI interrupt routing table entry format is derived from the
++ * IA64 SAL Specification 2.4.   The PCI interrupt routing table defines
++ * the routing of PCI interrupt signals between the PCI device output
++ * "pins" and the IO SAPICs' input "lines" (including core I/O PCI
++ * devices).  This table does NOT include information for devices/slots
++ * behind PCI to PCI bridges. See PCI to PCI Bridge Architecture Spec.
++ * for the architected method of routing of IRQ's behind PPB's.
++ */
+ 
+ 
+-static int __init /* return number of entries as success/fail flag */
++static int __init
+ iosapic_load_irt(unsigned long cell_num, struct irt_entry **irt)
+ {
+ 	long status;              /* PDC return value status */
+ 	struct irt_entry *table;  /* start of interrupt routing tbl */
+ 	unsigned long num_entries = 0UL;
+ 
+-	ASSERT(NULL != irt);
++	BUG_ON(!irt);
+ 
+ 	if (is_pdc_pat()) {
+-
+ 		/* Use pat pdc routine to get interrupt routing table size */
+ 		DBG("calling get_irt_size (cell %ld)\n", cell_num);
+ 		status = pdc_pat_get_irt_size(&num_entries, cell_num);
+ 		DBG("get_irt_size: %ld\n", status);
+ 
+-		ASSERT(status == PDC_OK);
+-
+-		/* save the number of entries in the table */
+-		ASSERT(0UL != num_entries);
++		BUG_ON(status != PDC_OK);
++		BUG_ON(num_entries == 0);
+ 
+ 		/*
+ 		** allocate memory for interrupt routing table
+@@ -318,45 +299,47 @@
+ 		** the contents of the table are exclusively
+ 		** for I/O sapic devices.
+ 		*/
+-		table = IOSAPIC_KALLOC(struct irt_entry, num_entries);
++		table = iosapic_alloc_irt(num_entries);
+ 		if (table == NULL) {
+-			printk(KERN_WARNING MODULE_NAME ": read_irt : can not alloc mem for IRT\n");
++			printk(KERN_WARNING MODULE_NAME ": read_irt : can "
++					"not alloc mem for IRT\n");
+ 			return 0;
+ 		}
+ 
+ 		/* get PCI INT routing table */
+ 		status = pdc_pat_get_irt(table, cell_num);
+ 		DBG("pdc_pat_get_irt: %ld\n", status);
+-		ASSERT(status == PDC_OK);
++		WARN_ON(status != PDC_OK);
+ 	} else {
+ 		/*
+ 		** C3000/J5000 (and similar) platforms with Sprockets PDC
+ 		** will return exactly one IRT for all iosapics.
+ 		** So if we have one, don't need to get it again.
+ 		*/
+-		if (NULL != irt_cell)
++		if (irt_cell)
+ 			return 0;
+ 
+ 		/* Should be using the Elroy's HPA, but it's ignored anyway */
+ 		status = pdc_pci_irt_size(&num_entries, 0);
+ 		DBG("pdc_pci_irt_size: %ld\n", status);
+ 
+-		if (PDC_OK != status) {
++		if (status != PDC_OK) {
+ 			/* Not a "legacy" system with I/O SAPIC either */
+ 			return 0;
+ 		}
+ 
+-		ASSERT(0UL != num_entries);
++		BUG_ON(num_entries == 0);
+ 
+-		table = IOSAPIC_KALLOC(struct irt_entry, num_entries);
+-		if (table == NULL) {
+-			printk(KERN_WARNING MODULE_NAME ": read_irt : can not alloc mem for IRT\n");
++		table = iosapic_alloc_irt(num_entries);
++		if (!table) {
++			printk(KERN_WARNING MODULE_NAME ": read_irt : can "
++					"not alloc mem for IRT\n");
+ 			return 0;
+ 		}
+ 
+ 		/* HPA ignored by this call too. */
+ 		status = pdc_pci_irt(num_entries, 0, table);
+-		ASSERT(PDC_OK == status);
++		BUG_ON(status != PDC_OK);
+ 	}
+ 
+ 	/* return interrupt table address */
+@@ -390,16 +373,10 @@
+ 
+ 
+ 
+-void __init
+-iosapic_init(void)
++void __init iosapic_init(void)
+ {
+ 	unsigned long cell = 0;
+ 
+-	/* init global data */
+-	spin_lock_init(&iosapic_lock);
+-        iosapic_list = (struct iosapic_info *) NULL;
+-	iosapic_count = 0;
+-
+ 	DBG("iosapic_init()\n");
+ 
+ #ifdef __LP64__
+@@ -414,11 +391,9 @@
+ 	}
+ #endif
+ 
+-	/*
+-	**  get IRT for this cell.
+-	*/
+-	irt_num_entry =  iosapic_load_irt(cell, &irt_cell);
+-	if (0 == irt_num_entry)
++	/* get interrupt routing table for this cell */
++	irt_num_entry = iosapic_load_irt(cell, &irt_cell);
++	if (irt_num_entry == 0)
+ 		irt_cell = NULL;	/* old PDC w/o iosapic */
+ }
+ 
+@@ -459,10 +434,7 @@
+ 			continue;
+ 		}
+ 
+-		/*
+-		** Compare: dest_iosapic_addr, src_bus_irq_devno
+-		*/
+-		if (i->dest_iosapic_addr != (u64) ((long) isi->isi_hpa))
++		if (!COMPARE_IRTE_ADDR(i, isi->isi_hpa))
+ 			continue;
+ 
+ 		if ((i->src_bus_irq_devno & IRT_IRQ_DEVNO_MASK) != irq_devno)
+@@ -506,10 +478,10 @@
+ 
+ 	pci_read_config_byte(pcidev, PCI_INTERRUPT_PIN, &intr_pin);
+ 
+-	DBG_IRT("iosapic_xlate_pin() SLOT %d pin %d\n",
+-		PCI_SLOT(pcidev->devfn), intr_pin);
++	DBG_IRT("iosapic_xlate_pin(%s) SLOT %d pin %d\n",
++		pcidev->slot_name, PCI_SLOT(pcidev->devfn), intr_pin);
+ 
+-	if (0 == intr_pin) {
++	if (intr_pin == 0) {
+ 		/* The device does NOT support/use IRQ lines.  */
+ 		return NULL;
+ 	}
+@@ -606,7 +578,6 @@
+ {
+ 	u32 mode = 0;
+ 	struct irt_entry *p = vi->irte;
+-	ASSERT(NULL != vi->irte);
+ 
+ 	if ((p->polarity_trigger & IRT_PO_MASK) == IRT_ACTIVE_LO)
+ 		mode |= IOSAPIC_IRDT_PO_LOW;
+@@ -619,7 +590,6 @@
+ 	** PA doesn't support EXTINT or LPRIO bits.
+ 	*/
+ 
+-	ASSERT(vi->txn_data);
+ 	*dp0 = mode | (u32) vi->txn_data;
+ 
+ 	/*
+@@ -802,22 +772,23 @@
+ 
+ 	vi->irte = irte;
+ 
+-	/* Allocate processor IRQ */
+-	vi->txn_irq = txn_alloc_irq();
+-
+ 	/*
++	 * Allocate processor IRQ
++	 *
+ 	 * XXX/FIXME The txn_alloc_irq() code and related code should be
+ 	 * moved to enable_irq(). That way we only allocate processor IRQ
+ 	 * bits for devices that actually have drivers claiming them.
+ 	 * Right now we assign an IRQ to every PCI device present,
+ 	 * regardless of whether it's used or not.
+ 	 */
++	vi->txn_irq = txn_alloc_irq(8);
++
+ 	if (vi->txn_irq < 0)
+ 		panic("I/O sapic: couldn't get TXN IRQ\n");
+ 
+ 	/* enable_irq() will use txn_* to program IRdT */
+ 	vi->txn_addr = txn_alloc_addr(vi->txn_irq);
+-	vi->txn_data = txn_alloc_data(vi->txn_irq, 8);
++	vi->txn_data = txn_alloc_data(vi->txn_irq);
+ 
+ 	vi->eoi_addr = isi->addr + IOSAPIC_REG_EOI;
+ 	vi->eoi_data = cpu_to_le32(vi->txn_data);
+@@ -841,10 +812,7 @@
+ static unsigned int
+ iosapic_rd_version(struct iosapic_info *isi)
+ {
+-	ASSERT(isi);
+-	ASSERT(isi->isi_hpa);
+-
+-	return iosapic_read(isi->isi_hpa, IOSAPIC_REG_VERSION);
++	return iosapic_read(isi->addr, IOSAPIC_REG_VERSION);
+ }
+ 
+ 
+@@ -866,44 +834,38 @@
+ 	int cnt;	/* track how many entries we've looked at */
+ 
+ 	/*
+-	** Astro based platforms can't support PCI OLARD if they
+-	** implement the legacy PDC (not PAT). Though Legacy PDC
+-	** supports an IRT, LBA's with no device under them
+-	** are *not* listed in the IRT.
+-	** Search the IRT and ignore iosapic's which aren't
+-	** in the IRT.
+-	*/
+-	ASSERT(NULL != irte);	/* always have built-in devices */
++	 * Astro based platforms can only support PCI OLARD if they implement
++	 * PAT PDC.  Legacy PDC omits LBAs with no PCI devices from the IRT.
++	 * Search the IRT and ignore iosapic's which aren't in the IRT.
++	 */
+ 	for (cnt=0; cnt < irt_num_entry; cnt++, irte++) {
+-		ASSERT(IRT_IOSAPIC_TYPE == irte->entry_type);
+-		/*
+-		** We need sign extension of the hpa on 32-bit kernels.
+-		** The address in the IRT is *always* 64 bit and really
+-		** is an unsigned quantity (like all physical addresses).
+-		*/ 
+-		if (irte->dest_iosapic_addr == (s64) ((long) hpa))
++		WARN_ON(IRT_IOSAPIC_TYPE != irte->entry_type);
++		if (COMPARE_IRTE_ADDR(irte, hpa))
+ 			break;
+ 	}
+ 
+-	if (cnt  >= irt_num_entry)
+-		return (NULL);
++	if (cnt >= irt_num_entry) {
++		DBG("iosapic_register() ignoring 0x%lx (NOT FOUND)\n", hpa);
++		return NULL;
++	}
+ 
+-	if ((isi = IOSAPIC_KALLOC(struct iosapic_info, 1)) == NULL) {
++	isi = (struct iosapic_info *)kmalloc(sizeof(struct iosapic_info), GFP_KERNEL);
++	if (!isi) {
+ 		BUG();
+-		return (NULL);
++		return NULL;
+ 	}
+ 
+ 	memset(isi, 0, sizeof(struct iosapic_info));
+ 
+-	isi->isi_hpa         = hpa;
+-	isi->isi_version     = iosapic_rd_version(isi);
++	isi->addr = ioremap(hpa, 4096);
++	isi->isi_hpa = hpa;
++	isi->isi_version = iosapic_rd_version(isi);
+ 	isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1;
+ 
+-	vip = isi->isi_vector =
+-		 IOSAPIC_KALLOC(struct vector_info, isi->isi_num_vectors);
+-
++	vip = isi->isi_vector = (struct vector_info *)
++		kmalloc(sizeof(struct vector_info) * isi->isi_num_vectors, GFP_KERNEL);
+ 	if (vip == NULL) {
+-		IOSAPIC_FREE(isi, struct iosapic_info, 1);
++		kfree(isi);
+ 		return NULL;
+ 	}
+ 
+@@ -924,7 +886,6 @@
+ {
+ 	unsigned int i, *irp = (unsigned int *) irt;
+ 
+-	ASSERT(NULL != irt);
+ 
+ 	printk(KERN_DEBUG MODULE_NAME ": Interrupt Routing Table (%lx entries)\n", num_entry);
+ 
+@@ -938,8 +899,6 @@
+ static void
+ iosapic_prt_vi(struct vector_info *vi)
+ {
+-	ASSERT(NULL != vi);
+-
+ 	printk(KERN_DEBUG MODULE_NAME ": vector_info[%d] is at %p\n", vi->irqline, vi);
+ 	printk(KERN_DEBUG "\t\tstatus:	 %.4x\n", vi->status);
+ 	printk(KERN_DEBUG "\t\ttxn_irq:  %d\n",  vi->txn_irq);
+@@ -953,10 +912,9 @@
+ static void
+ iosapic_prt_isi(struct iosapic_info *isi)
+ {
+-	ASSERT(NULL != isi);
+ 	printk(KERN_DEBUG MODULE_NAME ": io_sapic_info at %p\n", isi);
+ 	printk(KERN_DEBUG "\t\tisi_hpa:       %lx\n", isi->isi_hpa);
+-	printk(KERN_DEBUG "\t\tisi_status:     %x\n", isi->isi_status);
++	printk(KERN_DEBUG "\t\tisi_status:    %x\n", isi->isi_status);
+ 	printk(KERN_DEBUG "\t\tisi_version:   %x\n", isi->isi_version);
+ 	printk(KERN_DEBUG "\t\tisi_vector:    %p\n", isi->isi_vector);
+ }
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/lasi.c CVS2_6_11_PA2/drivers/parisc/lasi.c
+--- LINUS_2_6_11/drivers/parisc/lasi.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/lasi.c	2005-01-11 21:10:48.000000000 -0700
+@@ -139,7 +139,7 @@
+ 		break;
+ 	}
+ 
+-	register_led_driver(DISPLAY_MODEL_LASI, LED_CMD_REG_NONE, (char *)datareg);
++	register_led_driver(DISPLAY_MODEL_LASI, LED_CMD_REG_NONE, datareg);
+ }
+ #endif
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/lba_pci.c CVS2_6_11_PA2/drivers/parisc/lba_pci.c
+--- LINUS_2_6_11/drivers/parisc/lba_pci.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/lba_pci.c	2005-02-12 00:58:59.000000000 -0700
+@@ -51,11 +51,6 @@
+ #include <asm/iosapic.h>	/* for iosapic_register() */
+ #include <asm/io.h>		/* read/write stuff */
+ 
+-#ifndef TRUE
+-#define TRUE (1 == 1)
+-#define FALSE (1 == 0)
+-#endif
+-
+ #undef DEBUG_LBA	/* general stuff */
+ #undef DEBUG_LBA_PORT	/* debug I/O Port access */
+ #undef DEBUG_LBA_CFG	/* debug Config Space Access (ie PCI Bus walk) */
+@@ -88,18 +83,6 @@
+ #define DBG_PAT(x...)
+ #endif
+ 
+-#ifdef DEBUG_LBA
+-#undef ASSERT
+-#define ASSERT(expr) \
+-	if(!(expr)) { \
+-		printk("\n%s:%d: Assertion " #expr " failed!\n", \
+-				__FILE__, __LINE__); \
+-		panic(#expr); \
+-	}
+-#else
+-#define ASSERT(expr)
+-#endif
+-
+ 
+ /*
+ ** Config accessor functions only pass in the 8-bit bus number and not
+@@ -184,6 +167,7 @@
+ 
+ /* non-postable I/O port space, densely packed */
+ #define LBA_PORT_BASE	(PCI_F_EXTEND | 0xfee00000UL)
++static void __iomem *astro_iop_base;
+ 
+ #define ELROY_HVERS	0x782
+ #define MERCURY_HVERS	0x783
+@@ -214,8 +198,8 @@
+ 	spinlock_t	lba_lock;
+ 	void		*iosapic_obj;
+ 
+-#ifdef CONFIG_PARISC64
+-	unsigned long	iop_base;    /* PA_VIEW - for IO port accessor funcs */
++#ifdef CONFIG_64BIT
++	void __iomem *	iop_base;    /* PA_VIEW - for IO port accessor funcs */
+ #endif
+ 
+ 	int		flags;       /* state/functionality enabled */
+@@ -225,15 +209,9 @@
+ 
+ static u32 lba_t32;
+ 
+-/*
+-** lba "flags"
+-*/
+-#define LBA_FLAG_NO_DMA_DURING_CFG	0x01
++/* lba flags */
+ #define LBA_FLAG_SKIP_PROBE	0x10
+ 
+-/* Tape Release 4 == hw_rev 5 */
+-#define LBA_TR4PLUS(d)      ((d)->hw_rev > 0x4)
+-#define LBA_DMA_DURING_CFG_DISABLED(d) ((d)->flags & LBA_FLAG_NO_DMA_DURING_CFG)
+ #define LBA_SKIP_PROBE(d) ((d)->flags & LBA_FLAG_SKIP_PROBE)
+ 
+ 
+@@ -293,7 +271,7 @@
+ 
+ 	printk(KERN_DEBUG "(%p)", r->parent);
+ 	for (i = d; i ; --i) printk(" ");
+-	printk(KERN_DEBUG "%p [%lx,%lx]/%x\n", r, r->start, r->end, (int) r->flags);
++	printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, r->start, r->end, r->flags);
+ 	lba_dump_res(r->child, d+2);
+ 	lba_dump_res(r->sibling, d);
+ }
+@@ -303,7 +281,7 @@
+ ** LBA rev 2.0, 2.1, 2.2, and 3.0 bus walks require a complex
+ ** workaround for cfg cycles:
+ **	-- preserve  LBA state
+-**	-- LBA_FLAG_NO_DMA_DURING_CFG workaround
++**	-- prevent any DMA from occurring
+ **	-- turn on smart mode
+ **	-- probe with config writes before doing config reads
+ **	-- check ERROR_STATUS
+@@ -313,25 +291,18 @@
+ ** The workaround is only used for device discovery.
+ */
+ 
+-static int
+-lba_device_present( u8 bus, u8 dfn, struct lba_device *d)
++static int lba_device_present(u8 bus, u8 dfn, struct lba_device *d)
+ {
+ 	u8 first_bus = d->hba.hba_bus->secondary;
+ 	u8 last_sub_bus = d->hba.hba_bus->subordinate;
+ 
+-	ASSERT(bus >= first_bus);
+-	ASSERT(bus <= last_sub_bus);
+-	ASSERT((bus - first_bus) < LBA_MAX_NUM_BUSES);
+-
+ 	if ((bus < first_bus) ||
+ 	    (bus > last_sub_bus) ||
+-	    ((bus - first_bus) >= LBA_MAX_NUM_BUSES))
+-	{
+-	    /* devices that fall into any of these cases won't get claimed */
+-	    return(FALSE);
++	    ((bus - first_bus) >= LBA_MAX_NUM_BUSES)) {
++		return 0;
+ 	}
+ 
+-	return TRUE;
++	return 1;
+ }
+ 
+ 
+@@ -346,7 +317,6 @@
+     /* For LBA rev 2.0, 2.1, 2.2, and 3.0, we must disable DMA		\
+     ** arbitration for full bus walks.					\
+     */									\
+-    if (LBA_DMA_DURING_CFG_DISABLED(d)) {				\
+ 	/* Save contents of arb mask register. */			\
+ 	arb_mask = READ_REG32(d->hba.base_addr + LBA_ARB_MASK);		\
+ \
+@@ -354,8 +324,7 @@
+ 	 * Turn off all device arbitration bits (i.e. everything	\
+ 	 * except arbitration enable bit).				\
+ 	 */								\
+-	WRITE_REG32(0x1, d->hba.base_addr + LBA_ARB_MASK);			\
+-    }									\
++	WRITE_REG32(0x1, d->hba.base_addr + LBA_ARB_MASK);		\
+ \
+     /*									\
+      * Set the smart mode bit so that master aborts don't cause		\
+@@ -375,7 +344,7 @@
+      * Read address register to ensure that LBA is the bus master,	\
+      * which implies that DMA traffic has stopped when DMA arb is off.	\
+      */									\
+-    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);		\
++    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);	\
+     /*									\
+      * Generate a cfg write cycle (will have no affect on		\
+      * Vendor ID register since read-only).				\
+@@ -385,7 +354,7 @@
+      * Make sure write has completed before proceeding further,		\
+      * i.e. before setting clear enable.				\
+      */									\
+-    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);		\
++    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);	\
+ }
+ 
+ 
+@@ -439,20 +408,16 @@
+     }									\
+ }
+ 
+-#define LBA_CFG_TR4_ADDR_SETUP(d, addr) \
+-    WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR); \
+-    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR)
++#define LBA_CFG_TR4_ADDR_SETUP(d, addr)					\
++	WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR);
+ 
+-#define LBA_CFG_ADDR_SETUP(d, addr) {				\
++#define LBA_CFG_ADDR_SETUP(d, addr) {					\
+     WRITE_REG32(((addr) & ~3), (d)->hba.base_addr + LBA_PCI_CFG_ADDR);	\
+     /*									\
+-     * HPREVISIT:							\
+-     *       --	Potentially could skip this once DMA bug fixed.		\
+-     *									\
+      * Read address register to ensure that LBA is the bus master,	\
+      * which implies that DMA traffic has stopped when DMA arb is off.	\
+      */									\
+-    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);		\
++    lba_t32 = READ_REG32((d)->hba.base_addr + LBA_PCI_CFG_ADDR);	\
+ }
+ 
+ 
+@@ -465,12 +430,10 @@
+      * Restore error config register (turn off smart mode).		\
+      */									\
+     WRITE_REG32(error_config, base + LBA_ERROR_CONFIG);			\
+-    if (LBA_DMA_DURING_CFG_DISABLED(d)) {				\
+ 	/*								\
+ 	 * Restore arb mask register (reenables DMA arbitration).	\
+ 	 */								\
+ 	WRITE_REG32(arb_mask, base + LBA_ARB_MASK);			\
+-    }									\
+ }
+ 
+ 
+@@ -478,39 +441,23 @@
+ static unsigned int
+ lba_rd_cfg(struct lba_device *d, u32 tok, u8 reg, u32 size)
+ {
+-	u32 data = ~0;
++	u32 data = ~0U;
+ 	int error = 0;
+ 	u32 arb_mask = 0;	/* used by LBA_CFG_SETUP/RESTORE */
+ 	u32 error_config = 0;	/* used by LBA_CFG_SETUP/RESTORE */
+ 	u32 status_control = 0;	/* used by LBA_CFG_SETUP/RESTORE */
+ 
+-	ASSERT((size == sizeof(u8)) ||
+-		(size == sizeof(u16)) ||
+-		(size == sizeof(u32)));
+-
+-	if ((size != sizeof(u8)) &&
+-		(size != sizeof(u16)) &&
+-		(size != sizeof(u32))) {
+-		return(data);
+-	}
+-
+ 	LBA_CFG_SETUP(d, tok);
+ 	LBA_CFG_PROBE(d, tok);
+ 	LBA_CFG_MASTER_ABORT_CHECK(d, d->hba.base_addr, tok, error);
+ 	if (!error) {
++		void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
++
+ 		LBA_CFG_ADDR_SETUP(d, tok | reg);
+ 		switch (size) {
+-		case sizeof(u8):
+-			data = (u32) READ_REG8(d->hba.base_addr + LBA_PCI_CFG_DATA + (reg & 3));
+-			break;
+-		case sizeof(u16):
+-			data = (u32) READ_REG16(d->hba.base_addr + LBA_PCI_CFG_DATA + (reg & 2));
+-			break;
+-		case sizeof(u32):
+-			data = READ_REG32(d->hba.base_addr + LBA_PCI_CFG_DATA);
+-			break;
+-		default:
+-			break; /* leave data as -1 */
++		case 1: data = (u32) READ_REG8(data_reg + (reg & 3)); break;
++		case 2: data = (u32) READ_REG16(data_reg+ (reg & 2)); break;
++		case 4: data = READ_REG32(data_reg); break;
+ 		}
+ 	}
+ 	LBA_CFG_RESTORE(d, d->hba.base_addr);
+@@ -518,142 +465,26 @@
+ }
+ 
+ 
+-#if USE_PAT_PDC_CFG
+-
+-/* PAT PDC needs to be relocated in order to perform properly.
+- * tg3 driver does about 1600 PCI Cfg writes to initialize the card.
+- * On 440Mhz A500, PDC takes ~20ms/write, or ~30 seconds per card.
+- * On PA8800, that takes about 5ms/write (8 seconds).
+- * But relocating PDC will burn at least 4MB of RAM.
+- * Easier/Cheaper to just maintain our own mercury cfg ops.
+- */
+-#define pat_cfg_addr(bus, devfn, addr) (((bus) << 16) | ((devfn) << 8) | (addr))
+-
+-static int pat_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
+-{
+-	int tok = pat_cfg_addr(bus->number, devfn, pos);
+-	u32 tmp;
+-	int ret = pdc_pat_io_pci_cfg_read(tok, size, &tmp);
+-
+-	DBG_CFG("%s(%d:%d.%d+0x%02x) -> 0x%x %d\n", __FUNCTION__, bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), pos, tmp, ret);
+-
+-	switch (size) {
+-		case 1: *data = (u8)  tmp; return (tmp == (u8)  ~0);
+-		case 2: *data = (u16) tmp; return (tmp == (u16) ~0);
+-		case 4: *data = (u32) tmp; return (tmp == (u32) ~0);
+-	}
+-	*data = ~0;
+-	return (ret);
+-}
+-
+-static int pat_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
+-{
+-	int tok = pat_cfg_addr(bus->number, devfn, pos);
+-	int ret = pdc_pat_io_pci_cfg_write(tok, size, data);
+-
+-	DBG_CFG("%s(%d:%d.%d+0x%02x, 0x%lx/%d)\n", __FUNCTION__, bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), pos, data, size);
+-	return (ret);
+-}
+-
+-static struct pci_ops pat_cfg_ops = {
+-	.read =		pat_cfg_read,
+-	.write =	pat_cfg_write,
+-};
+-#endif
+-
+-
+-#ifdef CONFIG_PARISC64
+-static int mercury_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
++static int elroy_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
+ {
+ 	struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
+ 	u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary;
+ 	u32 tok = LBA_CFG_TOK(local_bus, devfn);
++	void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
+ 
+-	/* Basic Algorithm
+-	** Should only get here on fully working LBA rev.
+-	** This is how simple the original LBA code should have been.
+-	*/
+-	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
+-	switch(size) {
+-	case 1: *(u8 *)  data = READ_REG8(d->hba.base_addr + LBA_PCI_CFG_DATA
+-							+ (pos & 3));
+-		DBG_CFG("%s(%x+%2x) -> 0x%x (c)\n", __FUNCTION__, tok, pos,
+-				*(u8 *)data);
+-		return(*(u8 *)data == (u8) ~0U);
+-	case 2: *(u16 *) data = READ_REG16(d->hba.base_addr + LBA_PCI_CFG_DATA
+-							+ (pos & 2));
+-		DBG_CFG("%s(%x+%2x) -> 0x%x (c)\n", __FUNCTION__, tok, pos,
+-				*(u16 *)data);
+-		return(*(u16 *)data == (u16) ~0U);
+-	case 4: *(u32 *) data = READ_REG32(d->hba.base_addr + LBA_PCI_CFG_DATA);
+-		DBG_CFG("%s(%x+%2x) -> 0x%x (c)\n", __FUNCTION__, tok, pos, *data);
+-		return(*data == ~0U);
+-	}
+-	DBG_CFG("%s(%x+%2x) -> bad size (%d)\n", __FUNCTION__, tok, pos, size);
+-	*data = ~0U;
+-	return(!PCIBIOS_SUCCESSFUL);	/* failed */
+-}
+-
+-/*
+- * LBA 4.0 config write code implements non-postable semantics
+- * by doing a read of CONFIG ADDR after the write.
+- */
+-
+-static int mercury_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
+-{
+-	struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
+-	unsigned long data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
+-	u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary;
+-	u32 tok = LBA_CFG_TOK(local_bus,devfn);
+-
+- 	ASSERT((tok & 0xff) == 0);
+-	ASSERT(pos < 0x100);
+-
+-	DBG_CFG("%s(%x+%2x) <- 0x%x (c)\n", __FUNCTION__, tok, pos, data);
+-
+-	/* Basic Algorithm */
+-	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
+-	switch(size) {
+-	case 1:		WRITE_REG8 (data, data_reg + (pos & 3)); break;
+-	case 2:		WRITE_REG16(data, data_reg + (pos & 2)); break;
+-	case 4:		WRITE_REG32(data, data_reg);             break;
+-	default: 
+-		DBG_CFG("%s(%x+%2x) WTF! size %d\n", __FUNCTION__, tok, pos,
+-				size);
+-	}
+-
+-	/* flush posted write */
+-	lba_t32 = READ_U32(d->hba.base_addr + LBA_PCI_CFG_ADDR);
+-	return PCIBIOS_SUCCESSFUL;
+-}
+-
+-
+-static struct pci_ops mercury_cfg_ops = {
+-	.read =		mercury_cfg_read,
+-	.write =	mercury_cfg_write,
+-};
+-#else
+-#define mercury_cfg_ops lba_cfg_ops
+-#endif /* CONFIG_PARISC64 */
+-
+-
+-static int lba_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
+-{
+-	struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
+-	u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary;
+-	u32 tok = LBA_CFG_TOK(local_bus, devfn);
++	if ((pos > 255) || (devfn > 255))
++		return -EINVAL;
+ 
+ /* FIXME: B2K/C3600 workaround is always use old method... */
+-	/* if (!LBA_TR4PLUS(d) && !LBA_SKIP_PROBE(d)) */ {
++	/* if (!LBA_SKIP_PROBE(d)) */ {
+ 		/* original - Generate config cycle on broken elroy
+ 		  with risk we will miss PCI bus errors. */
+ 		*data = lba_rd_cfg(d, tok, pos, size);
+ 		DBG_CFG("%s(%x+%2x) -> 0x%x (a)\n", __FUNCTION__, tok, pos, *data);
+-		return(*data == ~0U);
++		return 0;
+ 	}
+ 
+-	if (LBA_SKIP_PROBE(d) && (!lba_device_present(bus->secondary, devfn, d)))
+-	{
++	if (LBA_SKIP_PROBE(d) && !lba_device_present(bus->secondary, devfn, d)) {
+ 		DBG_CFG("%s(%x+%2x) -> -1 (b)\n", __FUNCTION__, tok, pos);
+ 		/* either don't want to look or know device isn't present. */
+ 		*data = ~0U;
+@@ -664,52 +495,32 @@
+ 	** Should only get here on fully working LBA rev.
+ 	** This is how simple the code should have been.
+ 	*/
+-	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
++	LBA_CFG_ADDR_SETUP(d, tok | pos);
+ 	switch(size) {
+-	case 1: *(u8 *)  data = READ_REG8(d->hba.base_addr + LBA_PCI_CFG_DATA + (pos & 3));
+-		break;
+-	case 2: *(u16 *) data = READ_REG16(d->hba.base_addr + LBA_PCI_CFG_DATA + (pos & 2));
+-		break;
+-	case 4: *(u32 *) data = READ_REG32(d->hba.base_addr + LBA_PCI_CFG_DATA);
+-	   break;
++	case 1: *data = READ_REG8 (data_reg + (pos & 3)); break;
++	case 2: *data = READ_REG16(data_reg + (pos & 2)); break;
++	case 4: *data = READ_REG32(data_reg); break;
+ 	}
+ 	DBG_CFG("%s(%x+%2x) -> 0x%x (c)\n", __FUNCTION__, tok, pos, *data);
+-	return(*data == ~0U);
++	return 0;
+ }
+ 
+ 
+ static void
+-lba_wr_cfg( struct lba_device *d, u32 tok, u8 reg, u32 data, u32 size)
++lba_wr_cfg(struct lba_device *d, u32 tok, u8 reg, u32 data, u32 size)
+ {
+ 	int error = 0;
+ 	u32 arb_mask = 0;
+ 	u32 error_config = 0;
+ 	u32 status_control = 0;
+-
+-	ASSERT((size == sizeof(u8)) ||
+-		(size == sizeof(u16)) ||
+-		(size == sizeof(u32)));
+-
+-	if ((size != sizeof(u8)) &&
+-		(size != sizeof(u16)) &&
+-		(size != sizeof(u32))) {
+-			return;
+-	}
++	void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
+ 
+ 	LBA_CFG_SETUP(d, tok);
+ 	LBA_CFG_ADDR_SETUP(d, tok | reg);
+ 	switch (size) {
+-	case sizeof(u8):
+-		WRITE_REG8((u8) data, d->hba.base_addr + LBA_PCI_CFG_DATA + (reg&3));
+-		break;
+-	case sizeof(u16):
+-		WRITE_REG16((u8) data, d->hba.base_addr + LBA_PCI_CFG_DATA +(reg&2));
+-		break;
+-	case sizeof(u32):
+-		WRITE_REG32(data, d->hba.base_addr + LBA_PCI_CFG_DATA);
+-		break;
+-	default:
+-		break;
++	case 1: WRITE_REG8 (data, data_reg + (reg & 3)); break;
++	case 2: WRITE_REG16(data, data_reg + (reg & 2)); break;
++	case 4: WRITE_REG32(data, data_reg);             break;
+ 	}
+ 	LBA_CFG_MASTER_ABORT_CHECK(d, d->hba.base_addr, tok, error);
+ 	LBA_CFG_RESTORE(d, d->hba.base_addr);
+@@ -721,16 +532,16 @@
+  * by doing a read of CONFIG ADDR after the write.
+  */
+ 
+-static int lba_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
++static int elroy_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
+ {
+ 	struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
+ 	u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary;
+ 	u32 tok = LBA_CFG_TOK(local_bus,devfn);
+ 
+- 	ASSERT((tok & 0xff) == 0);
+-	ASSERT(pos < 0x100);
++	if ((pos > 255) || (devfn > 255))
++		return -EINVAL;
+ 
+-	if (!LBA_TR4PLUS(d) && !LBA_SKIP_PROBE(d)) {
++	if (!LBA_SKIP_PROBE(d)) {
+ 		/* Original Workaround */
+ 		lba_wr_cfg(d, tok, pos, (u32) data, size);
+ 		DBG_CFG("%s(%x+%2x) = 0x%x (a)\n", __FUNCTION__, tok, pos,data);
+@@ -745,7 +556,7 @@
+ 	DBG_CFG("%s(%x+%2x) = 0x%x (c)\n", __FUNCTION__, tok, pos, data);
+ 
+ 	/* Basic Algorithm */
+-	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
++	LBA_CFG_ADDR_SETUP(d, tok | pos);
+ 	switch(size) {
+ 	case 1: WRITE_REG8 (data, d->hba.base_addr + LBA_PCI_CFG_DATA + (pos & 3));
+ 		   break;
+@@ -760,9 +571,82 @@
+ }
+ 
+ 
+-static struct pci_ops lba_cfg_ops = {
+-	.read =		lba_cfg_read,
+-	.write =	lba_cfg_write,
++static struct pci_ops elroy_cfg_ops = {
++	.read =		elroy_cfg_read,
++	.write =	elroy_cfg_write,
++};
++
++/*
++ * The mercury_cfg_ops are slightly misnamed; they're also used for Elroy
++ * TR4.0 as no additional bugs were found in this areea between Elroy and
++ * Mercury
++ */
++
++static int mercury_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
++{
++	struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
++	u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary;
++	u32 tok = LBA_CFG_TOK(local_bus, devfn);
++	void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
++
++	if ((pos > 255) || (devfn > 255))
++		return -EINVAL;
++
++	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
++	switch(size) {
++	case 1:
++		*data = READ_REG8(data_reg + (pos & 3));
++		break;
++	case 2:
++		*data = READ_REG16(data_reg + (pos & 2));
++		break;
++	case 4:
++		*data = READ_REG32(data_reg);             break;
++		break;
++	}
++
++	DBG_CFG("mercury_cfg_read(%x+%2x) -> 0x%x\n", tok, pos, *data);
++	return 0;
++}
++
++/*
++ * LBA 4.0 config write code implements non-postable semantics
++ * by doing a read of CONFIG ADDR after the write.
++ */
++
++static int mercury_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
++{
++	struct lba_device *d = LBA_DEV(parisc_walk_tree(bus->bridge));
++	void __iomem *data_reg = d->hba.base_addr + LBA_PCI_CFG_DATA;
++	u32 local_bus = (bus->parent == NULL) ? 0 : bus->secondary;
++	u32 tok = LBA_CFG_TOK(local_bus,devfn);
++
++	if ((pos > 255) || (devfn > 255))
++		return -EINVAL;
++
++	DBG_CFG("%s(%x+%2x) <- 0x%x (c)\n", __FUNCTION__, tok, pos, data);
++
++	LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
++	switch(size) {
++	case 1:
++		WRITE_REG8 (data, data_reg + (pos & 3));
++		break;
++	case 2:
++		WRITE_REG16(data, data_reg + (pos & 2));
++		break;
++	case 4:
++		WRITE_REG32(data, data_reg);
++		break;
++	}
++
++	/* flush posted write */
++	lba_t32 = READ_U32(d->hba.base_addr + LBA_PCI_CFG_ADDR);
++	return 0;
++}
++
++static struct pci_ops mercury_cfg_ops = {
++	.read =		mercury_cfg_read,
++	.write =	mercury_cfg_write,
+ };
+ 
+ 
+@@ -773,7 +657,7 @@
+ }
+ 
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ 
+ /*
+ ** Determine if a device is already configured.
+@@ -802,11 +686,11 @@
+ 	for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
+ 		if (dev->resource[i].flags & srch_flags) {
+ 			pci_claim_resource(dev, i);
+-			DBG("   claimed %s %d [%lx,%lx]/%x\n",
++			DBG("   claimed %s %d [%lx,%lx]/%lx\n",
+ 				pci_name(dev), i,
+ 				dev->resource[i].start,
+ 				dev->resource[i].end,
+-				(int) dev->resource[i].flags
++				dev->resource[i].flags
+ 				);
+ 		}
+ 	}
+@@ -835,7 +719,7 @@
+ 	struct lba_device *ldev = LBA_DEV(parisc_walk_tree(bus->bridge));
+ 	int lba_portbase = HBA_PORT_BASE(ldev->hba.hba_num);
+ 
+-	DBG("lba_fixup_bus(0x%p) bus %d sysdata 0x%p\n",
++	DBG("lba_fixup_bus(0x%p) bus %d platform_data 0x%p\n",
+ 		bus, bus->secondary, bus->bridge->platform_data);
+ 
+ 	/*
+@@ -849,14 +733,14 @@
+ 		/* Host-PCI Bridge */
+ 		int err, i;
+ 
+-		DBG("lba_fixup_bus() %s [%lx/%lx]/%x\n",
++		DBG("lba_fixup_bus() %s [%lx/%lx]/%lx\n",
+ 			ldev->hba.io_space.name,
+ 			ldev->hba.io_space.start, ldev->hba.io_space.end,
+-			(int) ldev->hba.io_space.flags);
+-		DBG("lba_fixup_bus() %s [%lx/%lx]/%x\n",
++			ldev->hba.io_space.flags);
++		DBG("lba_fixup_bus() %s [%lx/%lx]/%lx\n",
+ 			ldev->hba.lmmio_space.name,
+ 			ldev->hba.lmmio_space.start, ldev->hba.lmmio_space.end,
+-			(int) ldev->hba.lmmio_space.flags);
++			ldev->hba.lmmio_space.flags);
+ 
+ 		err = request_resource(&ioport_resource, &(ldev->hba.io_space));
+ 		if (err < 0) {
+@@ -895,7 +779,7 @@
+ 			/* lba_dump_res(&iomem_resource, 2); */
+ 		}
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ 		/* GMMIO is  distributed range. Every LBA/Rope gets part it. */
+ 		if (ldev->hba.gmmio_space.flags) {
+ 			err = request_resource(&iomem_resource, &(ldev->hba.gmmio_space));
+@@ -1035,7 +919,7 @@
+ static u##size lba_astro_in##size (struct pci_hba_data *d, u16 addr) \
+ { \
+ 	u##size t; \
+-	t = READ_REG##size(LBA_PORT_BASE + addr); \
++	t = READ_REG##size(astro_iop_base + addr); \
+ 	DBG_PORT(" 0x%x\n", t); \
+ 	return (t); \
+ }
+@@ -1075,9 +959,8 @@
+ #define LBA_PORT_OUT(size, mask) \
+ static void lba_astro_out##size (struct pci_hba_data *d, u16 addr, u##size val) \
+ { \
+-	ASSERT(d != NULL); \
+ 	DBG_PORT("%s(0x%p, 0x%x, 0x%x)\n", __FUNCTION__, d, addr, val); \
+-	WRITE_REG##size(val, LBA_PORT_BASE + addr); \
++	WRITE_REG##size(val, astro_iop_base + addr); \
+ 	if (LBA_DEV(d)->hw_rev < 3) \
+ 		lba_t32 = READ_U32(d->base_addr + LBA_FUNC_ID); \
+ }
+@@ -1097,7 +980,7 @@
+ };
+ 
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ #define PIOP_TO_GMMIO(lba, addr) \
+ 	((lba)->iop_base + (((addr)&0xFFFC)<<10) + ((addr)&3))
+ 
+@@ -1215,16 +1098,19 @@
+ 		case PAT_LMMIO:
+ 			/* used to fix up pre-initialized MEM BARs */
+ 			if (!lba_dev->hba.lmmio_space.start) {
+-				sprintf(lba_dev->hba.lmmio_name, "PCI%02x LMMIO",
+-					(int) lba_dev->hba.bus_num.start);
+-				lba_dev->hba.lmmio_space_offset = p->start - io->start;
+-				r = &(lba_dev->hba.lmmio_space);
+-				r->name  = lba_dev->hba.lmmio_name;
++				sprintf(lba_dev->hba.lmmio_name,
++						"PCI%02lx LMMIO",
++						lba_dev->hba.bus_num.start);
++				lba_dev->hba.lmmio_space_offset = p->start -
++					io->start;
++				r = &lba_dev->hba.lmmio_space;
++				r->name = lba_dev->hba.lmmio_name;
+ 			} else if (!lba_dev->hba.elmmio_space.start) {
+-				sprintf(lba_dev->hba.elmmio_name, "PCI%02x ELMMIO",
+-					(int) lba_dev->hba.bus_num.start);
+-				r = &(lba_dev->hba.elmmio_space);
+-				r->name  = lba_dev->hba.elmmio_name;
++				sprintf(lba_dev->hba.elmmio_name,
++						"PCI%02lx ELMMIO",
++						lba_dev->hba.bus_num.start);
++				r = &lba_dev->hba.elmmio_space;
++				r->name = lba_dev->hba.elmmio_name;
+ 			} else {
+ 				printk(KERN_WARNING MODULE_NAME
+ 					" only supports 2 LMMIO resources!\n");
+@@ -1239,9 +1125,9 @@
+ 
+ 		case PAT_GMMIO:
+ 			/* MMIO space > 4GB phys addr; for 64-bit BAR */
+-			sprintf(lba_dev->hba.gmmio_name, "PCI%02x GMMIO",
+-					(int) lba_dev->hba.bus_num.start);
+-			r = &(lba_dev->hba.gmmio_space);
++			sprintf(lba_dev->hba.gmmio_name, "PCI%02lx GMMIO",
++					lba_dev->hba.bus_num.start);
++			r = &lba_dev->hba.gmmio_space;
+ 			r->name  = lba_dev->hba.gmmio_name;
+ 			r->start  = p->start;
+ 			r->end    = p->end;
+@@ -1260,11 +1146,11 @@
+ 			** Postable I/O port space is per PCI host adapter.
+ 			** base of 64MB PIOP region
+ 			*/
+-			lba_dev->iop_base = p->start;
++			lba_dev->iop_base = ioremap(p->start, 64 * 1024 * 1024);
+ 
+-			sprintf(lba_dev->hba.io_name, "PCI%02x Ports",
+-					(int) lba_dev->hba.bus_num.start);
+-			r = &(lba_dev->hba.io_space);
++			sprintf(lba_dev->hba.io_name, "PCI%02lx Ports",
++					lba_dev->hba.bus_num.start);
++			r = &lba_dev->hba.io_space;
+ 			r->name  = lba_dev->hba.io_name;
+ 			r->start  = HBA_PORT_BASE(lba_dev->hba.hba_num);
+ 			r->end    = r->start + HBA_PORT_SPACE_SIZE - 1;
+@@ -1284,7 +1170,7 @@
+ /* keep compiler from complaining about missing declarations */
+ #define lba_pat_port_ops lba_astro_port_ops
+ #define lba_pat_resources(pa_dev, lba_dev)
+-#endif	/* CONFIG_PARISC64 */
++#endif	/* CONFIG_64BIT */
+ 
+ 
+ extern void sba_distributed_lmmio(struct parisc_device *, struct resource *);
+@@ -1306,7 +1192,7 @@
+ 	** PCI bus walk *should* end up with the same result.
+ 	** FIXME: But we don't have sanity checks in PCI or LBA.
+ 	*/
+-	lba_num = READ_REG32(pa_dev->hpa + LBA_FW_SCRATCH);
++	lba_num = READ_REG32(lba_dev->hba.base_addr + LBA_FW_SCRATCH);
+ 	r = &(lba_dev->hba.bus_num);
+ 	r->name = "LBA PCI Busses";
+ 	r->start = lba_num & 0xff;
+@@ -1316,8 +1202,8 @@
+ 	** Legacy boxes but it's nice to see in /proc/iomem.
+ 	*/
+ 	r = &(lba_dev->hba.lmmio_space);
+-	sprintf(lba_dev->hba.lmmio_name, "PCI%02x LMMIO",
+-					(int) lba_dev->hba.bus_num.start);
++	sprintf(lba_dev->hba.lmmio_name, "PCI%02lx LMMIO",
++					lba_dev->hba.bus_num.start);
+ 	r->name  = lba_dev->hba.lmmio_name;
+ 
+ #if 1
+@@ -1387,7 +1273,7 @@
+ 	 *
+ 	 * All is well now.
+ 	 */
+-	r->start = (long) READ_REG32(pa_dev->hpa + LBA_LMMIO_BASE);
++	r->start = READ_REG32(lba_dev->hba.base_addr + LBA_LMMIO_BASE);
+ 	if (r->start & 1) {
+ 		unsigned long rsize;
+ 
+@@ -1395,7 +1281,7 @@
+ 		/* mmio_mask also clears Enable bit */
+ 		r->start &= mmio_mask;
+ 		r->start = PCI_HOST_ADDR(HBA_DATA(lba_dev), r->start);
+-		rsize = ~ READ_REG32(pa_dev->hpa + LBA_LMMIO_MASK);
++		rsize = ~ READ_REG32(lba_dev->hba.base_addr + LBA_LMMIO_MASK);
+ 
+ 		/*
+ 		** Each rope only gets part of the distributed range.
+@@ -1425,15 +1311,15 @@
+ 	** an existing (but unused portion of) distributed range.
+ 	*/
+ 	r = &(lba_dev->hba.elmmio_space);
+-	sprintf(lba_dev->hba.elmmio_name, "PCI%02x ELMMIO",
+-					(int) lba_dev->hba.bus_num.start);
++	sprintf(lba_dev->hba.elmmio_name, "PCI%02lx ELMMIO",
++					lba_dev->hba.bus_num.start);
+ 	r->name  = lba_dev->hba.elmmio_name;
+ 
+ #if 1
+ 	/* See comment which precedes call to sba_directed_lmmio() */
+ 	sba_directed_lmmio(pa_dev, r);
+ #else
+-	r->start = READ_REG32(pa_dev->hpa + LBA_ELMMIO_BASE);
++	r->start = READ_REG32(lba_dev->hba.base_addr + LBA_ELMMIO_BASE);
+ 
+ 	if (r->start & 1) {
+ 		unsigned long rsize;
+@@ -1441,18 +1327,18 @@
+ 		/* mmio_mask also clears Enable bit */
+ 		r->start &= mmio_mask;
+ 		r->start = PCI_HOST_ADDR(HBA_DATA(lba_dev), r->start);
+-		rsize = READ_REG32(pa_dev->hpa + LBA_ELMMIO_MASK);
++		rsize = READ_REG32(lba_dev->hba.base_addr + LBA_ELMMIO_MASK);
+ 		r->end = r->start + ~rsize;
+ 	}
+ #endif
+ 
+ 	r = &(lba_dev->hba.io_space);
+-	sprintf(lba_dev->hba.io_name, "PCI%02x Ports",
+-					(int) lba_dev->hba.bus_num.start);
++	sprintf(lba_dev->hba.io_name, "PCI%02lx Ports",
++					lba_dev->hba.bus_num.start);
+ 	r->name  = lba_dev->hba.io_name;
+ 	r->flags = IORESOURCE_IO;
+-	r->start = READ_REG32(pa_dev->hpa + LBA_IOS_BASE) & ~1L;
+-	r->end   = r->start + (READ_REG32(pa_dev->hpa + LBA_IOS_MASK) ^ (HBA_PORT_SPACE_SIZE - 1));
++	r->start = READ_REG32(lba_dev->hba.base_addr + LBA_IOS_BASE) & ~1L;
++	r->end   = r->start + (READ_REG32(lba_dev->hba.base_addr + LBA_IOS_MASK) ^ (HBA_PORT_SPACE_SIZE - 1));
+ 
+ 	/* Virtualize the I/O Port space ranges */
+ 	lba_num = HBA_PORT_BASE(lba_dev->hba.hba_num);
+@@ -1501,7 +1387,7 @@
+ 	printk("\n");
+ #endif	/* DEBUG_LBA_PAT */
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ /*
+  * FIXME add support for PDC_PAT_IO "Get slot status" - OLAR support
+  * Only N-Class and up can really make use of Get slot status.
+@@ -1558,23 +1444,6 @@
+ 
+ 
+ 
+-static void __init
+-lba_common_init(struct lba_device *lba_dev)
+-{
+-	pci_bios = &lba_bios_ops;
+-	pcibios_register_hba(HBA_DATA(lba_dev));
+-	spin_lock_init(&lba_dev->lba_lock);
+-
+-	/*
+-	** Set flags which depend on hw_rev
+-	*/
+-	if (!LBA_TR4PLUS(lba_dev)) {
+-		lba_dev->flags |= LBA_FLAG_NO_DMA_DURING_CFG;
+-	}
+-}
+-
+-
+-
+ /*
+ ** Determine if lba should claim this chip (return 0) or not (return 1).
+ ** If so, initialize the chip and tell other partners in crime they
+@@ -1585,12 +1454,14 @@
+ {
+ 	struct lba_device *lba_dev;
+ 	struct pci_bus *lba_bus;
++	struct pci_ops *cfg_ops;
+ 	u32 func_class;
+ 	void *tmp_obj;
+ 	char *version;
++	void __iomem *addr = ioremap(dev->hpa, 4096);
+ 
+ 	/* Read HW Rev First */
+-	func_class = READ_REG32(dev->hpa + LBA_FCLASS);
++	func_class = READ_REG32(addr + LBA_FCLASS);
+ 
+ 	if (IS_ELROY(dev)) {	
+ 		func_class &= 0xf;
+@@ -1603,24 +1474,40 @@
+ 		case 5:	version = "TR4.0"; break;
+ 		default: version = "TR4+";
+ 		}
++
+ 		printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
+ 			MODULE_NAME, version, func_class & 0xf, dev->hpa);
+ 
+-		/* Just in case we find some prototypes... */
++		if (func_class < 2) {
++			printk(KERN_WARNING "Can't support LBA older than "
++				"TR2.1 - continuing under adversity.\n");
++		}
++
++#if 0
++/* Elroy TR4.0 should work with simple algorithm.
++   But it doesn't.  Still missing something. *sigh*
++*/
++		if (func_class > 4) {
++			cfg_ops = &mercury_cfg_ops;
++		} else
++#endif
++		{
++			cfg_ops = &elroy_cfg_ops;
++		}
++
+ 	} else if (IS_MERCURY(dev) || IS_QUICKSILVER(dev)) {
+ 		func_class &= 0xff;
+ 		version = kmalloc(6, GFP_KERNEL);
+ 		sprintf(version,"TR%d.%d",(func_class >> 4),(func_class & 0xf));
+-		/* We could use one printk for both and have it outside,
++		/* We could use one printk for both Elroy and Mercury,
+                  * but for the mask for func_class.
+                  */ 
+ 		printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
+ 			MODULE_NAME, version, func_class & 0xff, dev->hpa);
+-	}
+-
+-	if (func_class < 2) {
+-		printk(KERN_WARNING "Can't support LBA older than TR2.1"
+-				" - continuing under adversity.\n");
++		cfg_ops = &mercury_cfg_ops;
++	} else {
++		printk(KERN_ERR "Unknown LBA found at 0x%lx\n", dev->hpa);
++		return -ENODEV;
+ 	}
+ 
+ 	/*
+@@ -1633,8 +1520,7 @@
+ 	*/
+ 	
+ 	lba_dev = kmalloc(sizeof(struct lba_device), GFP_KERNEL);
+-	if (NULL == lba_dev)
+-	{
++	if (!lba_dev) {
+ 		printk(KERN_ERR "lba_init_chip - couldn't alloc lba_device\n");
+ 		return(1);
+ 	}
+@@ -1644,19 +1530,16 @@
+ 
+ 	/* ---------- First : initialize data we already have --------- */
+ 
+-	/*
+-	** Need hw_rev to adjust configuration space behavior.
+-	** LBA_TR4PLUS macro uses hw_rev field.
+-	*/
+ 	lba_dev->hw_rev = func_class;
+-
+-	lba_dev->hba.base_addr = dev->hpa;  /* faster access */
++	lba_dev->hba.base_addr = addr;
+ 	lba_dev->hba.dev = dev;
+ 	lba_dev->iosapic_obj = tmp_obj;  /* save interrupt handle */
+ 	lba_dev->hba.iommu = sba_get_iommu(dev);  /* get iommu data */
+ 
+ 	/* ------------ Second : initialize common stuff ---------- */
+-	lba_common_init(lba_dev);
++	pci_bios = &lba_bios_ops;
++	pcibios_register_hba(HBA_DATA(lba_dev));
++	spin_lock_init(&lba_dev->lba_lock);
+ 
+ 	if (lba_hw_init(lba_dev))
+ 		return(1);
+@@ -1669,8 +1552,11 @@
+ 		/* Go ask PDC PAT what resources this LBA has */
+ 		lba_pat_resources(dev, lba_dev);
+ 	} else {
+-		/* Sprockets PDC uses NPIOP region */
+-		pci_port = &lba_astro_port_ops;
++		if (!astro_iop_base) {
++			/* Sprockets PDC uses NPIOP region */
++			astro_iop_base = ioremap(LBA_PORT_BASE, 64 * 1024);
++			pci_port = &lba_astro_port_ops;
++		}
+ 
+ 		/* Poke the chip a bit for /proc output */
+ 		lba_legacy_resources(dev, lba_dev);
+@@ -1683,8 +1569,7 @@
+ 	dev->dev.platform_data = lba_dev;
+ 	lba_bus = lba_dev->hba.hba_bus =
+ 		pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start,
+-				IS_ELROY(dev) ? &lba_cfg_ops : &mercury_cfg_ops,
+-				NULL);
++				cfg_ops, NULL);
+ 
+ 	/* This is in lieu of calling pci_assign_unassigned_resources() */
+ 	if (is_pdc_pat()) {
+@@ -1711,7 +1596,7 @@
+ 	** space is restricted. Avoids master aborts on config cycles.
+ 	** Early LBA revs go fatal on *any* master abort.
+ 	*/
+-	if (!LBA_TR4PLUS(lba_dev)) {
++	if (cfg_ops == &elroy_cfg_ops) {
+ 		lba_dev->flags |= LBA_FLAG_SKIP_PROBE;
+ 	}
+ 
+@@ -1746,18 +1631,19 @@
+ ** Only called from sba_iommu.c in order to route ranges (MMIO vs DMA).
+ ** sba_iommu is responsible for locking (none needed at init time).
+ */
+-void
+-lba_set_iregs(struct parisc_device *lba, u32 ibase, u32 imask)
++void lba_set_iregs(struct parisc_device *lba, u32 ibase, u32 imask)
+ {
+-	unsigned long base_addr = lba->hpa;
++	void __iomem * base_addr = ioremap(lba->hpa, 4096);
+ 
+ 	imask <<= 2;	/* adjust for hints - 2 more bits */
+ 
+-	ASSERT((ibase & 0x003fffff) == 0);
+-	ASSERT((imask & 0x003fffff) == 0);
++	/* Make sure we aren't trying to set bits that aren't writeable. */
++	WARN_ON((ibase & 0x001fffff) != 0);
++	WARN_ON((imask & 0x001fffff) != 0);
+ 	
+ 	DBG("%s() ibase 0x%x imask 0x%x\n", __FUNCTION__, ibase, imask);
+ 	WRITE_REG32( imask, base_addr + LBA_IMASK);
+ 	WRITE_REG32( ibase, base_addr + LBA_IBASE);
++	iounmap(base_addr);
+ }
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/led.c CVS2_6_11_PA2/drivers/parisc/led.c
+--- LINUS_2_6_11/drivers/parisc/led.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/led.c	2005-02-03 04:44:44.000000000 -0700
+@@ -77,8 +77,8 @@
+ struct pdc_chassis_lcd_info_ret_block {
+ 	unsigned long model:16;		/* DISPLAY_MODEL_XXXX */
+ 	unsigned long lcd_width:16;	/* width of the LCD in chars (DISPLAY_MODEL_LCD only) */
+-	char *lcd_cmd_reg_addr;		/* ptr to LCD cmd-register & data ptr for LED */
+-	char *lcd_data_reg_addr;	/* ptr to LCD data-register (LCD only) */
++	unsigned long lcd_cmd_reg_addr;	/* ptr to LCD cmd-register & data ptr for LED */
++	unsigned long lcd_data_reg_addr; /* ptr to LCD data-register (LCD only) */
+ 	unsigned int min_cmd_delay;	/* delay in uS after cmd-write (LCD only) */
+ 	unsigned char reset_cmd1;	/* command #1 for writing LCD string (LCD only) */
+ 	unsigned char reset_cmd2;	/* command #2 for writing LCD string (LCD only) */
+@@ -102,8 +102,8 @@
+ {
+ 	.model =		DISPLAY_MODEL_LCD,
+ 	.lcd_width =		16,
+-	.lcd_cmd_reg_addr =	(char *) KITTYHAWK_LCD_CMD,
+-	.lcd_data_reg_addr =	(char *) KITTYHAWK_LCD_DATA,
++	.lcd_cmd_reg_addr =	KITTYHAWK_LCD_CMD,
++	.lcd_data_reg_addr =	KITTYHAWK_LCD_DATA,
+ 	.min_cmd_delay =	40,
+ 	.reset_cmd1 =		0x80,
+ 	.reset_cmd2 =		0xc0,
+@@ -540,20 +540,20 @@
+    ** 
+  */
+ 
+-int __init register_led_driver(int model, char *cmd_reg, char *data_reg)
++int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long data_reg)
+ {
+ 	static int initialized;
+ 	
+ 	if (initialized || !data_reg)
+-	    return 1;
++		return 1;
+ 	
+ 	lcd_info.model = model;		/* store the values */
+-	LCD_CMD_REG = (cmd_reg == LED_CMD_REG_NONE) ? NULL : cmd_reg;
++	LCD_CMD_REG = (cmd_reg == LED_CMD_REG_NONE) ? 0 : cmd_reg;
+ 
+ 	switch (lcd_info.model) {
+ 	case DISPLAY_MODEL_LCD:
+ 		LCD_DATA_REG = data_reg;
+-		printk(KERN_INFO "LCD display at %p,%p registered\n", 
++		printk(KERN_INFO "LCD display at %lu,%lu registered\n", 
+ 			LCD_CMD_REG , LCD_DATA_REG);
+ 		led_func_ptr = led_LCD_driver;
+ 		lcd_print( lcd_text_default );
+@@ -563,14 +563,14 @@
+ 	case DISPLAY_MODEL_LASI:
+ 		LED_DATA_REG = data_reg;
+ 		led_func_ptr = led_LASI_driver;
+-		printk(KERN_INFO "LED display at %p registered\n", LED_DATA_REG);
++		printk(KERN_INFO "LED display at %lu registered\n", LED_DATA_REG);
+ 		led_type = LED_NOLCD;
+ 		break;
+ 
+ 	case DISPLAY_MODEL_OLD_ASP:
+ 		LED_DATA_REG = data_reg;
+ 		led_func_ptr = led_ASP_driver;
+-		printk(KERN_INFO "LED (ASP-style) display at %p registered\n", 
++		printk(KERN_INFO "LED (ASP-style) display at %lu registered\n", 
+ 		    LED_DATA_REG);
+ 		led_type = LED_NOLCD;
+ 		break;
+@@ -695,7 +695,8 @@
+ 	lcd_info.model = DISPLAY_MODEL_NONE;
+ 	chassis_info.actcnt = chassis_info.maxcnt = 0;
+ 
+-	if ((ret = pdc_chassis_info(&chassis_info, &lcd_info, sizeof(lcd_info))) == PDC_OK) {
++	ret = pdc_chassis_info(&chassis_info, &lcd_info, sizeof(lcd_info));
++	if (ret == PDC_OK) {
+ 		DPRINTK((KERN_INFO "%s: chassis info: model=%d (%s), "
+ 			 "lcd_width=%d, cmd_delay=%u,\n"
+ 			 "%s: sizecnt=%d, actcnt=%ld, maxcnt=%ld\n",
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/pdc_stable.c CVS2_6_11_PA2/drivers/parisc/pdc_stable.c
+--- LINUS_2_6_11/drivers/parisc/pdc_stable.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/pdc_stable.c	2005-03-01 23:47:37.000000000 -0700
+@@ -0,0 +1,735 @@
++/* 
++ *    Interfaces to retrieve and set PDC Stable options (firmware)
++ *
++ *    Copyright (C) 2005 Thibaut VARENE <varenet at parisc-linux.org>
++ *
++ *    This program is free software; you can redistribute it and/or modify
++ *    it under the terms of the GNU General Public License as published by
++ *    the Free Software Foundation; either version 2 of the License, or
++ *    (at your option) any later version.
++ *
++ *    This program is distributed in the hope that it will be useful,
++ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *    GNU General Public License for more details.
++ *
++ *    You should have received a copy of the GNU General Public License
++ *    along with this program; if not, write to the Free Software
++ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *
++ *    DEV NOTE: the PDC Procedures reference states that:
++ *    "A minimum of 96 bytes of Stable Storage is required. Providing more than
++ *    96 bytes of Stable Storage is optional [...]. Failure to provide the
++ *    optional locations from 96 to 192 results in the loss of certain
++ *    functionality during boot."
++ *
++ *    Since locations between 96 and 192 are the various paths, most (if not
++ *    all) PA-RISC machines should have them. Anyway, for safety reasons, the
++ *    following code can deal with only 96 bytes of Stable Storage, and all
++ *    sizes between 96 and 192 bytes (provided they are multiple of struct
++ *    device_path size, eg: 128, 160 and 192) to provide full information.
++ *    The code makes no use of data above 192 bytes. One last word: there's one
++ *    path we can always count on: the primary path.
++ */
++
++#undef PDCS_DEBUG
++#ifdef PDCS_DEBUG
++#define DPRINTK(fmt, args...)	printk(KERN_DEBUG fmt, ## args)
++#else
++#define DPRINTK(fmt, args...)
++#endif
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/sched.h>		/* for capable() */
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/ctype.h>
++#include <linux/sysfs.h>
++#include <linux/kobject.h>
++#include <linux/device.h>
++#include <linux/errno.h>
++
++#include <asm/pdc.h>
++#include <asm/page.h>
++#include <asm/uaccess.h>
++#include <asm/hardware.h>
++
++#define PDCS_VERSION	"0.09"
++
++#define PDCS_ADDR_PPRI	0x00
++#define PDCS_ADDR_OSID	0x40
++#define PDCS_ADDR_FSIZ	0x5C
++#define PDCS_ADDR_PCON	0x60
++#define PDCS_ADDR_PALT	0x80
++#define PDCS_ADDR_PKBD	0xA0
++
++MODULE_AUTHOR("Thibaut VARENE <varenet at parisc-linux.org>");
++MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data");
++MODULE_LICENSE("GPL");
++MODULE_VERSION(PDCS_VERSION);
++
++static unsigned long pdcs_size = 0;
++
++/* This struct defines what we need to deal with a parisc pdc path entry */
++struct pdcspath_entry {
++	short ready;			/* entry record is valid if != 0 */
++	unsigned long addr;		/* entry address in stable storage */
++	char *name;			/* entry name */
++	struct device_path devpath;	/* device path in parisc representation */
++	struct device *dev;		/* corresponding device */
++	struct kobject kobj;
++};
++
++struct pdcspath_attribute {
++	struct attribute attr;
++	ssize_t (*show)(struct pdcspath_entry *entry, char *buf);
++	ssize_t (*store)(struct pdcspath_entry *entry, const char *buf, size_t count);
++};
++
++#define PDCSPATH_ENTRY(_addr, _name) \
++struct pdcspath_entry pdcspath_entry_##_name = { \
++	.ready = 0, \
++	.addr = _addr, \
++	.name = __stringify(_name), \
++};
++
++#define PDCS_ATTR(_name, _mode, _show, _store) \
++struct subsys_attribute pdcs_attr_##_name = { \
++	.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE}, \
++	.show = _show, \
++	.store = _store, \
++};
++
++#define PATHS_ATTR(_name, _mode, _show, _store) \
++struct pdcspath_attribute paths_attr_##_name = { \
++	.attr = {.name = __stringify(_name), .mode = _mode, .owner = THIS_MODULE}, \
++	.show = _show, \
++	.store = _store, \
++};
++
++#define to_pdcspath_attribute(_attr) container_of(_attr, struct pdcspath_attribute, attr)
++#define to_pdcspath_entry(obj)  container_of(obj, struct pdcspath_entry, kobj)
++
++/**
++ * pdcspath_fetch - This function populates the path entry structs.
++ * @entry: A pointer to an allocated pdcspath_entry.
++ * 
++ * The general idea is that you don't read from the Stable Storage every time
++ * you access the files provided by the facilites. We store a copy of the
++ * content of the stable storage WRT various paths in these structs. We read
++ * these structs when reading the files, and we will write to these structs when
++ * writing to the files, and only then write them back to the Stable Storage.
++ */
++static int
++pdcspath_fetch(struct pdcspath_entry *entry)
++{
++	struct device_path *devpath;
++
++	if (!entry)
++		return -EINVAL;
++
++	devpath = &entry->devpath;
++	
++	DPRINTK("%s: fetch: 0x%p, 0x%p, addr: 0x%lx\n", __func__,
++			entry, devpath, entry->addr);
++
++	/* addr, devpath and count must be word aligned */
++	if (pdc_stable_read(entry->addr, devpath, sizeof(*devpath)) != PDC_OK)
++		return -EIO;
++		
++	/* Find the matching device.
++	   NOTE: hardware_path overlays with device_path, so the nice cast can
++	   be used */
++	entry->dev = hwpath_to_device((struct hardware_path *)devpath);
++
++	entry->ready = 1;
++	
++	DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
++	
++	return 0;
++}
++
++/**
++ * pdcspath_store - This function writes a path to stable storage.
++ * @entry: A pointer to an allocated pdcspath_entry.
++ * 
++ * It can be used in two ways: either by passing it a preset devpath struct
++ * containing an already computed hardware path, or by passing it a device
++ * pointer, from which it'll find out the corresponding hardware path.
++ * For now we do not handle the case where there's an error in writing to the
++ * Stable Storage area, so you'd better not mess up the data :P
++ */
++static int
++pdcspath_store(struct pdcspath_entry *entry)
++{
++	struct device_path *devpath;
++
++	if (!entry)
++		return -EINVAL;
++
++	devpath = &entry->devpath;
++	
++	/* We expect the caller to set the ready flag to 0 if the hardware
++	   path struct provided is invalid, so that we know we have to fill it.
++	   First case, we don't have a preset hwpath... */
++	if (!entry->ready) {
++		/* ...but we have a device, map it */
++		if (entry->dev)
++			device_to_hwpath(entry->dev, (struct hardware_path *)devpath);
++		else
++			return -EINVAL;
++	}
++	/* else, we expect the provided hwpath to be valid. */
++	
++	DPRINTK("%s: store: 0x%p, 0x%p, addr: 0x%lx\n", __func__,
++			entry, devpath, entry->addr);
++
++	/* addr, devpath and count must be word aligned */
++	if (pdc_stable_write(entry->addr, devpath, sizeof(*devpath)) != PDC_OK) {
++		printk(KERN_ERR "%s: an error occured when writing to PDC.\n"
++				"It is likely that the Stable Storage data has been corrupted.\n"
++				"Please check it carefully upon next reboot.\n", __func__);
++		return -EIO;
++	}
++		
++	entry->ready = 1;
++	
++	DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
++	
++	return 0;
++}
++
++/**
++ * pdcspath_hwpath_read - This function handles hardware path pretty printing.
++ * @entry: An allocated and populated pdscpath_entry struct.
++ * @buf: The output buffer to write to.
++ * 
++ * We will call this function to format the output of the hwpath attribute file.
++ */
++static ssize_t
++pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf)
++{
++	char *out = buf;
++	struct device_path *devpath;
++	unsigned short i;
++
++	if (!entry || !buf)
++		return -EINVAL;
++
++	devpath = &entry->devpath;
++
++	if (!entry->ready)
++		return -ENODATA;
++	
++	for (i = 0; i < 6; i++) {
++		if (devpath->bc[i] >= 128)
++			continue;
++		out += sprintf(out, "%u/", (unsigned char)devpath->bc[i]);
++	}
++	out += sprintf(out, "%u\n", (unsigned char)devpath->mod);
++	
++	return out - buf;
++}
++
++/**
++ * pdcspath_hwpath_write - This function handles hardware path modifying.
++ * @entry: An allocated and populated pdscpath_entry struct.
++ * @buf: The input buffer to read from.
++ * @count: The number of bytes to be read.
++ * 
++ * We will call this function to change the current hardware path.
++ * Hardware paths are to be given '/'-delimited, without brackets.
++ * We take care to make sure that the provided path actually maps to an existing
++ * device, BUT nothing would prevent some foolish user to set the path to some
++ * PCI bridge or even a CPU...
++ * A better work around would be to make sure we are at the end of a device tree
++ * for instance, but it would be IMHO beyond the simple scope of that driver.
++ * The aim is to provide a facility. Data correctness is left to userland.
++ */
++static ssize_t
++pdcspath_hwpath_write(struct pdcspath_entry *entry, const char *buf, size_t count)
++{
++	struct hardware_path hwpath;
++	unsigned short i;
++	char in[count+1], *temp;
++	struct device *dev;
++
++	if (!entry || !buf || !count)
++		return -EINVAL;
++
++	/* We'll use a local copy of buf */
++	memset(in, 0, count+1);
++	strncpy(in, buf, count);
++	
++	/* Let's clean up the target. 0xff is a blank pattern */
++	memset(&hwpath, 0xff, sizeof(hwpath));
++	
++	/* First, pick the mod field (the last one of the input string) */
++	if (!(temp = strrchr(in, '/')))
++		return -EINVAL;
++			
++	hwpath.mod = simple_strtoul(temp+1, NULL, 10);
++	in[temp-in] = '\0';	/* truncate the remaining string. just precaution */
++	DPRINTK("%s: mod: %d\n", __func__, hwpath.mod);
++	
++	/* Then, loop for each delimiter, making sure we don't have too many.
++	   we write the bc fields in a down-top way. No matter what, we stop
++	   before writing the last field. If there are too many fields anyway,
++	   then the user is a moron and it'll be caught up later when we'll
++	   check the consistency of the given hwpath. */
++	for (i=5; ((temp = strrchr(in, '/'))) && (temp-in > 0) && (likely(i)); i--) {
++		hwpath.bc[i] = simple_strtoul(temp+1, NULL, 10);
++		in[temp-in] = '\0';
++		DPRINTK("%s: bc[%d]: %d\n", __func__, i, hwpath.bc[i]);
++	}
++	
++	/* Store the final field */		
++	hwpath.bc[i] = simple_strtoul(in, NULL, 10);
++	DPRINTK("%s: bc[%d]: %d\n", __func__, i, hwpath.bc[i]);
++	
++	/* Now we check that the user isn't trying to lure us */
++	if (!(dev = hwpath_to_device((struct hardware_path *)&hwpath))) {
++		printk(KERN_WARNING "%s: attempt to set invalid \"%s\" "
++			"hardware path: %s\n", __func__, entry->name, buf);
++		return -EINVAL;
++	}
++	
++	/* So far so good, let's get in deep */
++	entry->ready = 0;
++	entry->dev = dev;
++	
++	/* Now, dive in. Write back to the hardware */
++	WARN_ON(pdcspath_store(entry));	/* this warn should *NEVER* happen */
++	
++	/* Update the symlink to the real device */
++	sysfs_remove_link(&entry->kobj, "device");
++	sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device");
++	
++	printk(KERN_INFO "PDC Stable Storage: changed \"%s\" path to \"%s\"\n",
++		entry->name, buf);
++	
++	return count;
++}
++
++/**
++ * pdcspath_layer_read - Extended layer (eg. SCSI ids) pretty printing.
++ * @entry: An allocated and populated pdscpath_entry struct.
++ * @buf: The output buffer to write to.
++ * 
++ * We will call this function to format the output of the layer attribute file.
++ */
++static ssize_t
++pdcspath_layer_read(struct pdcspath_entry *entry, char *buf)
++{
++	char *out = buf;
++	struct device_path *devpath;
++	unsigned short i;
++
++	if (!entry || !buf)
++		return -EINVAL;
++	
++	devpath = &entry->devpath;
++
++	if (!entry->ready)
++		return -ENODATA;
++	
++	for (i = 0; devpath->layers[i] && (likely(i < 6)); i++)
++		out += sprintf(out, "%u ", devpath->layers[i]);
++
++	out += sprintf(out, "\n");
++	
++	return out - buf;
++}
++
++/**
++ * pdcspath_layer_write - This function handles extended layer modifying.
++ * @entry: An allocated and populated pdscpath_entry struct.
++ * @buf: The input buffer to read from.
++ * @count: The number of bytes to be read.
++ * 
++ * We will call this function to change the current layer value.
++ * Layers are to be given '.'-delimited, without brackets.
++ * XXX beware we are far less checky WRT input data provided than for hwpath.
++ * Potential harm can be done, since there's no way to check the validity of
++ * the layer fields.
++ */
++static ssize_t
++pdcspath_layer_write(struct pdcspath_entry *entry, const char *buf, size_t count)
++{
++	unsigned int layers[6]; /* device-specific info (ctlr#, unit#, ...) */
++	unsigned short i;
++	char in[count+1], *temp;
++
++	if (!entry || !buf || !count)
++		return -EINVAL;
++
++	/* We'll use a local copy of buf */
++	memset(in, 0, count+1);
++	strncpy(in, buf, count);
++	
++	/* Let's clean up the target. 0 is a blank pattern */
++	memset(&layers, 0, sizeof(layers));
++	
++	/* First, pick the first layer */
++	if (unlikely(!isdigit(*in)))
++		return -EINVAL;
++	layers[0] = simple_strtoul(in, NULL, 10);
++	DPRINTK("%s: layer[0]: %d\n", __func__, layers[0]);
++	
++	temp = in;
++	for (i=1; ((temp = strchr(temp, '.'))) && (likely(i<6)); i++) {
++		if (unlikely(!isdigit(*(++temp))))
++			return -EINVAL;
++		layers[i] = simple_strtoul(temp, NULL, 10);
++		DPRINTK("%s: layer[%d]: %d\n", __func__, i, layers[i]);
++	}
++		
++	/* So far so good, let's get in deep */
++	
++	/* First, overwrite the current layers with the new ones, not touching
++	   the hardware path. */
++	memcpy(&entry->devpath.layers, &layers, sizeof(layers));
++	
++	/* Now, dive in. Write back to the hardware */
++	WARN_ON(pdcspath_store(entry));	/* this warn should *NEVER* happen */
++	
++	printk(KERN_INFO "PDC Stable Storage: changed \"%s\" layers to \"%s\"\n",
++		entry->name, buf);
++	
++	return count;
++}
++
++/**
++ * pdcspath_attr_show - Generic read function call wrapper.
++ * @kobj: The kobject to get info from.
++ * @attr: The attribute looked upon.
++ * @buf: The output buffer.
++ */
++static ssize_t
++pdcspath_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
++{
++	struct pdcspath_entry *entry = to_pdcspath_entry(kobj);
++	struct pdcspath_attribute *pdcs_attr = to_pdcspath_attribute(attr);
++	ssize_t ret = 0;
++
++	if (!capable(CAP_SYS_ADMIN))
++		return -EACCES;
++
++	if (pdcs_attr->show)
++		ret = pdcs_attr->show(entry, buf);
++
++	return ret;
++}
++
++/**
++ * pdcspath_attr_store - Generic write function call wrapper.
++ * @kobj: The kobject to write info to.
++ * @attr: The attribute to be modified.
++ * @buf: The input buffer.
++ * @count: The size of the buffer.
++ */
++static ssize_t
++pdcspath_attr_store(struct kobject *kobj, struct attribute *attr,
++			const char *buf, size_t count)
++{
++	struct pdcspath_entry *entry = to_pdcspath_entry(kobj);
++	struct pdcspath_attribute *pdcs_attr = to_pdcspath_attribute(attr);
++	ssize_t ret = 0;
++
++	if (!capable(CAP_SYS_ADMIN))
++		return -EACCES;
++
++	if (pdcs_attr->store)
++		ret = pdcs_attr->store(entry, buf, count);
++
++	return ret;
++}
++
++static struct sysfs_ops pdcspath_attr_ops = {
++	.show = pdcspath_attr_show,
++	.store = pdcspath_attr_store,
++};
++
++/* These are the two attributes of any PDC path. */
++static PATHS_ATTR(hwpath, 0600, pdcspath_hwpath_read, pdcspath_hwpath_write);
++static PATHS_ATTR(layer, 0600, pdcspath_layer_read, pdcspath_layer_write);
++
++static struct attribute *paths_subsys_attrs[] = {
++	&paths_attr_hwpath.attr,
++	&paths_attr_layer.attr,
++	NULL,
++};
++
++/* Specific kobject type for our PDC paths */
++static struct kobj_type ktype_pdcspath = {
++	.sysfs_ops = &pdcspath_attr_ops,
++	.default_attrs = paths_subsys_attrs,
++};
++
++/* We hard define the 4 types of path we expect to find */
++static PDCSPATH_ENTRY(PDCS_ADDR_PPRI, primary);
++static PDCSPATH_ENTRY(PDCS_ADDR_PCON, console);
++static PDCSPATH_ENTRY(PDCS_ADDR_PALT, alternative);
++static PDCSPATH_ENTRY(PDCS_ADDR_PKBD, keyboard);
++
++/* An array containing all PDC paths we will deal with */
++static struct pdcspath_entry *pdcspath_entries[] = {
++	&pdcspath_entry_primary,
++	&pdcspath_entry_alternative,
++	&pdcspath_entry_console,
++	&pdcspath_entry_keyboard,
++	NULL,
++};
++
++/**
++ * pdcs_info_read - Pretty printing of the remaining useful data.
++ * @entry: An allocated and populated subsytem struct. We don't use it tho.
++ * @buf: The output buffer to write to.
++ * 
++ * We will call this function to format the output of the 'info' attribute file.
++ * Please refer to PDC Procedures documentation, section PDC_STABLE to get a
++ * better insight of what we're doing here.
++ */
++static ssize_t
++pdcs_info_read(struct subsystem *entry, char *buf)
++{
++	char *out = buf;
++	__u32 result;
++	struct device_path devpath;
++	char *tmpstr = NULL;
++	
++	if (!entry || !buf)
++		return -EINVAL;
++		
++	/* show the size of the stable storage */
++	out += sprintf(out, "Stable Storage size: %ld bytes\n", pdcs_size);
++
++	/* deal with flags */
++	if (pdc_stable_read(PDCS_ADDR_PPRI, &devpath, sizeof(devpath)) != PDC_OK)
++		return -EIO;
++	
++	out += sprintf(out, "Autoboot: %s\n", (devpath.flags & PF_AUTOBOOT) ? "On" : "Off");
++	out += sprintf(out, "Autosearch: %s\n", (devpath.flags & PF_AUTOSEARCH) ? "On" : "Off");
++	out += sprintf(out, "Timer: %u s\n", (devpath.flags & PF_TIMER) ? (1 << (devpath.flags & PF_TIMER)) : 0);
++
++	/* get OSID */
++	if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK)
++		return -EIO;
++
++	/* the actual result is 16 bits away */
++	switch (result >> 16) {
++		case 0x0000:	tmpstr = "No OS-dependent data"; break;
++		case 0x0001:	tmpstr = "HP-UX dependent data"; break;
++		case 0x0002:	tmpstr = "MPE-iX dependent data"; break;
++		case 0x0003:	tmpstr = "OSF dependent data"; break;
++		case 0x0004:	tmpstr = "HP-RT dependent data"; break;
++		case 0x0005:	tmpstr = "Novell Netware dependent data"; break;
++		default:	tmpstr = "Unknown"; break;
++	}
++	out += sprintf(out, "OS ID: %s (0x%.4x)\n", tmpstr, (result >> 16));
++
++	/* get fast-size */
++	if (pdc_stable_read(PDCS_ADDR_FSIZ, &result, sizeof(result)) != PDC_OK)
++		return -EIO;
++
++	out += sprintf(out, "Memory tested: ");
++	if ((result & 0x0F) < 0x0E)
++		out += sprintf(out, "%.3f MB", 0.256*(1<<(result & 0x0F)));
++	else
++		out += sprintf(out, "All");
++	out += sprintf(out, "\n");
++	
++	return out - buf;
++}
++
++/**
++ * pdcs_info_write - This function handles boot flag modifying.
++ * @entry: An allocated and populated subsytem struct. We don't use it tho.
++ * @buf: The input buffer to read from.
++ * @count: The number of bytes to be read.
++ * 
++ * We will call this function to change the current boot flags.
++ * We expect a precise syntax:
++ *	\"n n\" (n == 0 or 1) to toggle respectively AutoBoot and AutoSearch
++ *
++ * As of now there is no incentive on my side to provide more "knobs" to that
++ * interface, since modifying the rest of the data is pretty meaningless when
++ * the machine is running and for the expected use of that facility, such as
++ * PALO setting up the boot disk when installing a Linux distribution...
++ */
++static ssize_t
++pdcs_info_write(struct subsystem *entry, const char *buf, size_t count)
++{
++	struct pdcspath_entry *pathentry;
++	unsigned char flags;
++	char in[count+1], *temp;
++	char c;
++
++	if (!capable(CAP_SYS_ADMIN))
++		return -EACCES;
++
++	if (!entry || !buf || !count)
++		return -EINVAL;
++
++	/* We'll use a local copy of buf */
++	memset(in, 0, count+1);
++	strncpy(in, buf, count);
++
++	/* Current flags are stored in primary boot path entry */
++	pathentry = &pdcspath_entry_primary;
++	
++	/* Be nice to the existing flag record */
++	flags = pathentry->devpath.flags;
++	
++	DPRINTK("%s: flags before: 0x%X\n", __func__, flags);
++			
++	temp = in;
++	
++	while (*temp && isspace(*temp))
++		temp++;
++	
++	c = *temp++ - '0';
++	if ((c != 0) && (c != 1))
++		goto parse_error;
++	if (c == 0)
++		flags &= ~PF_AUTOBOOT;
++	else
++		flags |= PF_AUTOBOOT;
++	
++	if (*temp++ != ' ')
++		goto parse_error;
++	
++	c = *temp++ - '0';
++	if ((c != 0) && (c != 1))
++		goto parse_error;
++	if (c == 0)
++		flags &= ~PF_AUTOSEARCH;
++	else
++		flags |= PF_AUTOSEARCH;
++	
++	DPRINTK("%s: flags after: 0x%X\n", __func__, flags);
++		
++	/* So far so good, let's get in deep */
++	
++	/* Change the path entry flags first */
++	pathentry->devpath.flags = flags;
++		
++	/* Now, dive in. Write back to the hardware */
++	WARN_ON(pdcspath_store(pathentry));	/* this warn should *NEVER* happen */
++	
++	printk(KERN_INFO "PDC Stable Storage: changed flags to \"%s\"\n", buf);
++	
++	return count;
++
++parse_error:
++	printk(KERN_WARNING "%s: Parse error: expect \"n n\" (n == 0 or 1) for AB and AS\n", __func__);
++	return -EINVAL;
++}
++
++/* The last attribute (the 'root' one actually) with all remaining data. */
++static PDCS_ATTR(info, 0600, pdcs_info_read, pdcs_info_write);
++
++static struct subsys_attribute *pdcs_subsys_attrs[] = {
++	&pdcs_attr_info,
++	NULL,	/* maybe more in the future? */
++};
++
++static decl_subsys(paths, &ktype_pdcspath, NULL);
++static decl_subsys(pdc, NULL, NULL);
++
++/**
++ * pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage.
++ * 
++ * It creates kobjects corresponding to each path entry with nice sysfs
++ * links to the real device. This is where the magic takes place: when
++ * registering the subsystem attributes during module init, each kobject hereby
++ * created will show in the sysfs tree as a folder containing files as defined
++ * by path_subsys_attr[].
++ */
++static inline int __init
++pdcs_register_pathentries(void)
++{
++	unsigned short i;
++	struct pdcspath_entry *entry;
++	
++	for (i = 0; (entry = pdcspath_entries[i]); i++) {
++		if (pdcspath_fetch(entry) < 0)
++			continue;
++
++		kobject_set_name(&entry->kobj, "%s", entry->name);
++		kobj_set_kset_s(entry, paths_subsys);
++		kobject_register(&entry->kobj);
++
++		if (!entry->dev)
++			continue;
++
++		/* Add a nice symlink to the real device */
++		sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device");
++	}
++	
++	return 0;
++}
++
++/**
++ * pdcs_unregister_pathentries - Routine called when unregistering the module.
++ */
++static inline void __exit
++pdcs_unregister_pathentries(void)
++{
++	unsigned short i;
++	struct pdcspath_entry *entry;
++	
++	for (i = 0; (entry = pdcspath_entries[i]); i++)
++		if (entry->ready)
++			kobject_unregister(&entry->kobj);	
++}
++
++/*
++ * For now we register the pdc subsystem with the firmware subsystem
++ * and the paths subsystem with the pdc subsystem
++ */
++static int __init
++pdc_stable_init(void)
++{
++	struct subsys_attribute *attr;
++	int i, rc = 0, error = 0;
++
++	/* find the size of the stable storage */
++	if (pdc_stable_get_size(&pdcs_size) != PDC_OK) 
++		return -ENODEV;
++
++	printk(KERN_INFO "PDC Stable Storage facility v%s\n", PDCS_VERSION);
++
++	/* For now we'll register the pdc subsys within this driver */
++	if ((rc = firmware_register(&pdc_subsys)))
++		return rc;
++
++	/* Don't forget the info entry */
++	for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++)
++		if (attr->show)
++			error = subsys_create_file(&pdc_subsys, attr);
++	
++	/* register the paths subsys as a subsystem of pdc subsys */
++	kset_set_kset_s(&paths_subsys, pdc_subsys);
++	subsystem_register(&paths_subsys);
++
++	/* now we create all "files" for the paths subsys */
++	pdcs_register_pathentries();
++	
++	return 0;
++}
++
++static void __exit
++pdc_stable_exit(void)
++{
++	pdcs_unregister_pathentries();
++	subsystem_unregister(&paths_subsys);
++
++	firmware_unregister(&pdc_subsys);
++}
++
++
++module_init(pdc_stable_init);
++module_exit(pdc_stable_exit);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/power.c CVS2_6_11_PA2/drivers/parisc/power.c
+--- LINUS_2_6_11/drivers/parisc/power.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/power.c	2005-01-11 21:10:48.000000000 -0700
+@@ -47,7 +47,6 @@
+ #include <linux/workqueue.h>
+ 
+ #include <asm/pdc.h>
+-#include <asm/irq.h>
+ #include <asm/io.h>
+ #include <asm/led.h>
+ #include <asm/uaccess.h>
+@@ -126,11 +125,11 @@
+ 	
+ 	/* wait until the button was pressed for 1 second */
+ 	if (shutdown_timer == HZ) {
++#if defined (DEBUG) || defined(CONFIG_CHASSIS_LCD_LED)
+ 		static char msg[] = "Shutting down...";
++#endif
+ 		DPRINTK(KERN_INFO "%s\n", msg);
+-#ifdef CONFIG_CHASSIS_LCD_LED
+ 		lcd_print(msg);
+-#endif
+ 		poweroff();
+ 	}
+ }
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/sba_iommu.c CVS2_6_11_PA2/drivers/parisc/sba_iommu.c
+--- LINUS_2_6_11/drivers/parisc/sba_iommu.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/sba_iommu.c	2005-02-27 16:41:13.000000000 -0700
+@@ -58,7 +58,6 @@
+ ** Don't even think about messing with it unless you have
+ ** plenty of 710's to sacrifice to the computer gods. :^)
+ */
+-#undef DEBUG_SBA_ASSERT
+ #undef DEBUG_SBA_INIT
+ #undef DEBUG_SBA_RUN
+ #undef DEBUG_SBA_RUN_SG
+@@ -92,19 +91,6 @@
+ #define DBG_RES(x...)
+ #endif
+ 
+-#ifdef DEBUG_SBA_ASSERT
+-#undef ASSERT
+-#define ASSERT(expr) \
+-	if(!(expr)) { \
+-		printk("\n%s:%d: Assertion " #expr " failed!\n", \
+-				__FILE__, __LINE__); \
+-		panic(#expr); \
+-	}
+-#else
+-#define ASSERT(expr)
+-#endif
+-
+-
+ #if defined(__LP64__) && !defined(CONFIG_PDC_NARROW)
+ /* "low end" PA8800 machines use ZX1 chipset */
+ #define ZX1_SUPPORT
+@@ -125,39 +111,24 @@
+ #define DEFAULT_DMA_HINT_REG	0
+ 
+ #define ASTRO_RUNWAY_PORT	0x582
+-#define ASTRO_ROPES_PORT	0x780
+-
+ #define IKE_MERCED_PORT		0x803
+-#define IKE_ROPES_PORT		0x781
+-
+ #define REO_MERCED_PORT		0x804
+-#define REO_ROPES_PORT		0x782
+-
+ #define REOG_MERCED_PORT	0x805
+-#define REOG_ROPES_PORT		0x783
+-
+ #define PLUTO_MCKINLEY_PORT	0x880
+-#define PLUTO_ROPES_PORT	0x784
+ 
+ #define SBA_FUNC_ID	0x0000	/* function id */
+ #define SBA_FCLASS	0x0008	/* function class, bist, header, rev... */
+ 
+-#define IS_ASTRO(id) \
+-(((id)->hversion == ASTRO_RUNWAY_PORT) || ((id)->hversion == ASTRO_ROPES_PORT))
+-
+-#define IS_IKE(id) \
+-(((id)->hversion == IKE_MERCED_PORT) || ((id)->hversion == IKE_ROPES_PORT))
+-
+-#define IS_PLUTO(id) \
+-(((id)->hversion == PLUTO_MCKINLEY_PORT) || ((id)->hversion == PLUTO_ROPES_PORT))
++#define IS_ASTRO(id)		((id)->hversion == ASTRO_RUNWAY_PORT)
++#define IS_IKE(id)		((id)->hversion == IKE_MERCED_PORT)
++#define IS_PLUTO(id)		((id)->hversion == PLUTO_MCKINLEY_PORT)
+ 
+ #define SBA_FUNC_SIZE 4096   /* SBA configuration function reg set */
+ 
+-#define ASTRO_IOC_OFFSET 0x20000
+-/* Ike's IOC's occupy functions 2 and 3 (not 0 and 1) */
+-#define IKE_IOC_OFFSET(p) ((p+2)*SBA_FUNC_SIZE)
+-
+-#define PLUTO_IOC_OFFSET 0x1000
++#define ASTRO_IOC_OFFSET	(32 * SBA_FUNC_SIZE)
++#define PLUTO_IOC_OFFSET	(1 * SBA_FUNC_SIZE)
++/* Ike's IOC's occupy functions 2 and 3 */
++#define IKE_IOC_OFFSET(p)	((p+2) * SBA_FUNC_SIZE)
+ 
+ #define IOC_CTRL          0x8	/* IOC_CTRL offset */
+ #define IOC_CTRL_TC       (1 << 0) /* TOC Enable */
+@@ -165,6 +136,8 @@
+ #define IOC_CTRL_DE       (1 << 2) /* Dillon Enable */
+ #define IOC_CTRL_RM       (1 << 8) /* Real Mode */
+ #define IOC_CTRL_NC       (1 << 9) /* Non Coherent Mode */
++#define IOC_CTRL_D4       (1 << 11) /* Disable 4-byte coalescing */
++#define IOC_CTRL_DD       (1 << 13) /* Disable distr. LMMIO range coalescing */
+ 
+ #define MAX_IOC		2	/* per Ike. Pluto/Astro only have 1. */
+ 
+@@ -246,9 +219,9 @@
+ 
+ 
+ struct ioc {
+-	unsigned long	ioc_hpa;	/* I/O MMU base address */
+-	char	*res_map;	/* resource map, bit == pdir entry */
+-	u64	*pdir_base;	/* physical base address */
++	void __iomem	*ioc_hpa;	/* I/O MMU base address */
++	char		*res_map;	/* resource map, bit == pdir entry */
++	u64		*pdir_base;	/* physical base address */
+ 	unsigned long	ibase;	/* pdir IOV Space base - shared w/lba_pci */
+ 	unsigned long	imask;	/* pdir IOV Space mask - shared w/lba_pci */
+ #ifdef ZX1_SUPPORT
+@@ -295,7 +268,7 @@
+ 	struct parisc_device	*dev;	/* dev found in bus walk */
+ 	struct parisc_device_id	*iodc;	/* data about dev from firmware */
+ 	const char 		*name;
+-	unsigned long		sba_hpa; /* base address */
++	void __iomem		*sba_hpa; /* base address */
+ 	spinlock_t		sba_lock;
+ 	unsigned int		flags;  /* state/functionality enabled */
+ 	unsigned int		hw_rev;  /* HW revision of chip */
+@@ -312,9 +285,6 @@
+ 
+ static unsigned long ioc_needs_fdc = 0;
+ 
+-/* Ratio of Host MEM to IOV Space size */
+-static unsigned long sba_mem_ratio = 8;
+-
+ /* global count of IOMMUs in the system */
+ static unsigned int global_ioc_cnt = 0;
+ 
+@@ -364,9 +334,9 @@
+  * IO Adapter (aka Bus Converter).
+  */
+ static void
+-sba_dump_ranges(unsigned long hpa)
++sba_dump_ranges(void __iomem *hpa)
+ {
+-	DBG_INIT("SBA at 0x%lx\n", hpa);
++	DBG_INIT("SBA at 0x%p\n", hpa);
+ 	DBG_INIT("IOS_DIST_BASE   : %Lx\n", READ_REG64(hpa+IOS_DIST_BASE));
+ 	DBG_INIT("IOS_DIST_MASK   : %Lx\n", READ_REG64(hpa+IOS_DIST_MASK));
+ 	DBG_INIT("IOS_DIST_ROUTE  : %Lx\n", READ_REG64(hpa+IOS_DIST_ROUTE));
+@@ -382,10 +352,9 @@
+  *
+  * Print the size/location of the IO MMU PDIR.
+  */
+-static void
+-sba_dump_tlb(unsigned long hpa)
++static void sba_dump_tlb(void __iomem *hpa)
+ {
+-	DBG_INIT("IO TLB at 0x%lx\n", hpa);
++	DBG_INIT("IO TLB at 0x%p\n", hpa);
+ 	DBG_INIT("IOC_IBASE    : 0x%Lx\n", READ_REG64(hpa+IOC_IBASE));
+ 	DBG_INIT("IOC_IMASK    : 0x%Lx\n", READ_REG64(hpa+IOC_IMASK));
+ 	DBG_INIT("IOC_TCNFG    : 0x%Lx\n", READ_REG64(hpa+IOC_TCNFG));
+@@ -547,8 +516,6 @@
+ 	unsigned long *res_end = (unsigned long *) &(ioc->res_map[ioc->res_size]);
+ 	unsigned long pide = ~0UL;
+ 
+-	ASSERT(((unsigned long) ioc->res_hint & (sizeof(unsigned long) - 1UL)) == 0);
+-	ASSERT(res_ptr < res_end);
+ 	if (bits_wanted > (BITS_PER_LONG/2)) {
+ 		/* Search word at a time - no mask needed */
+ 		for(; res_ptr < res_end; ++res_ptr) {
+@@ -583,8 +550,8 @@
+ 		while(res_ptr < res_end)
+ 		{ 
+ 			DBG_RES("    %p %lx %lx\n", res_ptr, mask, *res_ptr);
+-			BUG_ON(0 == mask);
+-			if(0 == ((*res_ptr) & mask)) {
++			WARN_ON(mask == 0);
++			if(((*res_ptr) & mask) == 0) {
+ 				*res_ptr |= mask;     /* mark resources busy! */
+ 				pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map);
+ 				pide <<= 3;	/* convert to bit address */
+@@ -593,7 +560,7 @@
+ 			}
+ 			mask >>= o;
+ 			bitshiftcnt += o;
+-			if (0 == mask) {
++			if (mask == 0) {
+ 				mask = RESMAP_MASK(bits_wanted);
+ 				bitshiftcnt=0;
+ 				res_ptr++;
+@@ -631,21 +598,11 @@
+ #endif
+ 	unsigned long pide;
+ 
+-	ASSERT(pages_needed);
+-	ASSERT((pages_needed * IOVP_SIZE) <= DMA_CHUNK_SIZE);
+-	ASSERT(pages_needed <= BITS_PER_LONG);
+-	ASSERT(0 == (size & ~IOVP_MASK));
+-
+-	/*
+-	** "seek and ye shall find"...praying never hurts either...
+-	** ggg sacrifices another 710 to the computer gods.
+-	*/
+-
+ 	pide = sba_search_bitmap(ioc, pages_needed);
+ 	if (pide >= (ioc->res_size << 3)) {
+ 		pide = sba_search_bitmap(ioc, pages_needed);
+ 		if (pide >= (ioc->res_size << 3))
+-			panic("%s: I/O MMU @ %lx is out of mapping resources\n",
++			panic("%s: I/O MMU @ %p is out of mapping resources\n",
+ 			      __FILE__, ioc->ioc_hpa);
+ 	}
+ 
+@@ -707,11 +664,6 @@
+ 	ioc->used_pages -= bits_not_wanted;
+ #endif
+ 
+-	ASSERT(m != 0);
+-	ASSERT(bits_not_wanted);
+-	ASSERT((bits_not_wanted * IOVP_SIZE) <= DMA_CHUNK_SIZE);
+-	ASSERT(bits_not_wanted <= BITS_PER_LONG);
+-	ASSERT((*res_ptr & m) == m); /* verify same bits are set */
+ 	*res_ptr &= ~m;
+ }
+ 
+@@ -732,8 +684,9 @@
+ /**
+  * sba_io_pdir_entry - fill in one IO PDIR entry
+  * @pdir_ptr:  pointer to IO PDIR entry
+- * @sid: process Space ID
++ * @sid: process Space ID - currently only support KERNEL_SPACE
+  * @vba: Virtual CPU address of buffer to map
++ * @hint: DMA hint set to use for this mapping
+  *
+  * SBA Mapping Routine
+  *
+@@ -768,7 +721,6 @@
+  * IOMMU uses little endian for the pdir.
+  */
+ 
+-
+ void SBA_INLINE
+ sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
+ 		  unsigned long hint)
+@@ -776,12 +728,6 @@
+ 	u64 pa; /* physical address */
+ 	register unsigned ci; /* coherent index */
+ 
+-	/* We currently only support kernel addresses.
+-	 * fdc instr below will need to reload sr1 with KERNEL_SPACE
+-	 * once we try to support direct DMA to user space.
+-	 */
+-	ASSERT(sid == KERNEL_SPACE);
+-
+ 	pa = virt_to_phys(vba);
+ 	pa &= IOVP_MASK;
+ 
+@@ -830,10 +776,6 @@
+ 	*/
+ 	int off = PDIR_INDEX(iovp)*sizeof(u64)+7;
+ 
+-	/* Must be non-zero and rounded up */
+-	ASSERT(byte_cnt > 0);
+-	ASSERT(0 == (byte_cnt & ~IOVP_MASK));
+-
+ #ifdef ASSERT_PDIR_SANITY
+ 	/* Assert first pdir entry is set */
+ 	if (0x80 != (((u8 *) ioc->pdir_base)[off])) {
+@@ -843,8 +785,6 @@
+ 
+ 	if (byte_cnt <= IOVP_SIZE)
+ 	{
+-		ASSERT( off < ioc->pdir_size);
+-
+ 		iovp |= IOVP_SHIFT;     /* set "size" field for PCOM */
+ 
+ 		/*
+@@ -858,11 +798,7 @@
+ 		u32 t = get_order(byte_cnt) + PAGE_SHIFT;
+ 
+ 		iovp |= t;
+-		ASSERT(t <= 31);   /* 2GB! Max value of "size" field */
+-
+ 		do {
+-			/* verify this pdir entry is enabled */
+-			ASSERT(0x80 == (((u8 *) ioc->pdir_base)[off] & 0x80));
+ 			/* clear I/O Pdir entry "valid" bit first */
+ 			((u8 *)(ioc->pdir_base))[off] = 0;
+ 			off += sizeof(u64);
+@@ -880,17 +816,21 @@
+  *
+  * See Documentation/DMA-mapping.txt
+  */
+-static int
+-sba_dma_supported( struct device *dev, u64 mask)
++static int sba_dma_supported( struct device *dev, u64 mask)
+ {
++	struct ioc *ioc;
+ 	if (dev == NULL) {
+ 		printk(KERN_ERR MODULE_NAME ": EISA/ISA/et al not supported\n");
+ 		BUG();
+ 		return(0);
+ 	}
+ 
+-	/* only support 32-bit PCI devices - no DAC support (yet) */
+-	return((int) (mask == 0xffffffffUL));
++	ioc = GET_IOC(dev);
++
++	/* check if mask is > than the largest IO Virt Address */
++
++	return((int) (mask >= (ioc->ibase +
++				(ioc->pdir_size / sizeof(u64) * IOVP_SIZE) )));
+ }
+ 
+ 
+@@ -914,11 +854,7 @@
+ 	u64 *pdir_start;
+ 	int pide;
+ 
+-	ASSERT(size > 0);
+-	ASSERT(size <= DMA_CHUNK_SIZE);
+-
+ 	ioc = GET_IOC(dev);
+-	ASSERT(ioc);
+ 
+ 	/* save offset bits */
+ 	offset = ((dma_addr_t) (long) addr) & ~IOVP_MASK;
+@@ -944,7 +880,6 @@
+ 	pdir_start = &(ioc->pdir_base[pide]);
+ 
+ 	while (size > 0) {
+-		ASSERT(((u8 *)pdir_start)[7] == 0); /* verify availability */
+ 		sba_io_pdir_entry(pdir_start, KERNEL_SPACE, (unsigned long) addr, 0);
+ 
+ 		DBG_RUN("	pdir 0x%p %02x%02x%02x%02x%02x%02x%02x%02x\n",
+@@ -992,14 +927,10 @@
+ 	unsigned long flags; 
+ 	dma_addr_t offset;
+ 
+-	ioc = GET_IOC(dev);
+-	ASSERT(ioc);
++	DBG_RUN("%s() iovp 0x%lx/%x\n", __FUNCTION__, (long) iova, size);
+ 
++	ioc = GET_IOC(dev);
+ 	offset = iova & ~IOVP_MASK;
+-
+-	DBG_RUN("%s() iovp 0x%lx/%x\n",
+-		__FUNCTION__, (long) iova, size);
+-
+ 	iova ^= offset;        /* clear offset bits */
+ 	size += offset;
+ 	size = ROUNDUP(size, IOVP_SIZE);
+@@ -1131,7 +1062,6 @@
+ 	DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents);
+ 
+ 	ioc = GET_IOC(dev);
+-	ASSERT(ioc);
+ 
+ 	/* Fast path single entry scatterlists. */
+ 	if (nents == 1) {
+@@ -1186,7 +1116,6 @@
+ 
+ 	spin_unlock_irqrestore(&ioc->res_lock, flags);
+ 
+-	ASSERT(coalesced == filled);
+ 	DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled);
+ 
+ 	return filled;
+@@ -1215,7 +1144,6 @@
+ 		__FUNCTION__, nents, sg_virt_addr(sglist), sglist->length);
+ 
+ 	ioc = GET_IOC(dev);
+-	ASSERT(ioc);
+ 
+ #ifdef SBA_COLLECT_STATS
+ 	ioc->usg_calls++;
+@@ -1394,16 +1322,27 @@
+ 	return (void *) pdir_base;
+ }
+ 
+-static void
+-sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
++/* setup Mercury or Elroy IBASE/IMASK registers. */
++static void setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
+ {
+-        /* lba_set_iregs() is in arch/parisc/kernel/lba_pci.c */
++        /* lba_set_iregs() is in drivers/parisc/lba_pci.c */
+         extern void lba_set_iregs(struct parisc_device *, u32, u32);
++	struct device *dev;
++
++	list_for_each_entry(dev, &sba->dev.children, node) {
++		struct parisc_device *lba = to_parisc_device(dev);
++		int rope_num = (lba->hpa >> 13) & 0xf;
++		if (rope_num >> 3 == ioc_num)
++			lba_set_iregs(lba, ioc->ibase, ioc->imask);
++	}
++}
+ 
++static void
++sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
++{
+ 	u32 iova_space_mask;
+ 	u32 iova_space_size;
+ 	int iov_order, tcnfg;
+-	struct parisc_device *lba;
+ #if SBA_AGP_SUPPORT
+ 	int agp_found = 0;
+ #endif
+@@ -1449,7 +1388,7 @@
+ 		ioc->hint_shift_pdir, ioc->hint_mask_pdir);
+ #endif
+ 
+-	ASSERT((((unsigned long) ioc->pdir_base) & PAGE_MASK) == (unsigned long) ioc->pdir_base);
++	WARN_ON((((unsigned long) ioc->pdir_base) & PAGE_MASK) != (unsigned long) ioc->pdir_base);
+ 	WRITE_REG(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE);
+ 
+ 	/* build IMASK for IOC and Elroy */
+@@ -1461,14 +1400,7 @@
+ #endif
+ 	sba_dump_tlb(ioc->ioc_hpa);
+ 
+-	/*
+-	** setup Mercury IBASE/IMASK registers as well.
+-	*/
+-	for (lba = sba->child; lba; lba = lba->sibling) {
+-		int rope_num = (lba->hpa >> 13) & 0xf;
+-		if (rope_num >> 3 == ioc_num)
+-			lba_set_iregs(lba, ioc->ibase, ioc->imask);
+-	}
++	setup_ibase_imask(sba, ioc, ioc_num);
+ 
+ 	WRITE_REG(ioc->imask, ioc->ioc_hpa + IOC_IMASK);
+ 
+@@ -1534,13 +1466,8 @@
+ static void
+ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
+ {
+-	/* lba_set_iregs() is in arch/parisc/kernel/lba_pci.c */
+-	extern void lba_set_iregs(struct parisc_device *, u32, u32);
+-
+ 	u32 iova_space_size, iova_space_mask;
+-	int pdir_size, iov_order;
+-	unsigned long physmem;
+-	struct parisc_device *lba;
++	unsigned int pdir_size, iov_order;
+ 
+ 	/*
+ 	** Determine IOVA Space size from memory size.
+@@ -1556,16 +1483,15 @@
+ 	** for DMA hints - ergo only 30 bits max.
+ 	*/
+ 
+-	physmem = num_physpages << PAGE_SHIFT;
+-	iova_space_size = (u32) (physmem/(sba_mem_ratio*global_ioc_cnt));
++	iova_space_size = (u32) (num_physpages/global_ioc_cnt);
+ 
+ 	/* limit IOVA space size to 1MB-1GB */
+-	if (iova_space_size < 1024*1024) {
+-		iova_space_size = 1024*1024;
++	if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
++		iova_space_size = 1 << (20 - PAGE_SHIFT);
+ 	}
+ #ifdef __LP64__
+-	else if (iova_space_size > 512*1024*1024) {
+-		iova_space_size = 512*1024*1024;
++	else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) {
++		iova_space_size = 1 << (30 - PAGE_SHIFT);
+ 	}
+ #endif
+ 
+@@ -1574,21 +1500,19 @@
+ 	** thus, pdir/res_map will also be log2().
+ 	** PIRANHA BUG: Exception is when IO Pdir is 2MB (gets reduced)
+ 	*/
+-	iov_order = get_order(iova_space_size >> (IOVP_SHIFT-PAGE_SHIFT));
+-	ASSERT(iov_order <= (30 - IOVP_SHIFT));   /* iova_space_size <= 1GB */
+-	ASSERT(iov_order >= (20 - IOVP_SHIFT));   /* iova_space_size >= 1MB */
+-	iova_space_size = 1 << (iov_order + IOVP_SHIFT);
++	iov_order = get_order(iova_space_size << PAGE_SHIFT);
+ 
+-	ioc->pdir_size = pdir_size = (iova_space_size/IOVP_SIZE) * sizeof(u64);
++	/* iova_space_size is now bytes, not pages */
++	iova_space_size = 1 << (iov_order + PAGE_SHIFT);
+ 
+-	ASSERT(pdir_size < 4*1024*1024);   /* max pdir size == 2MB */
+-
+-	/* Verify it's a power of two */
+-	ASSERT((1 << get_order(pdir_size)) == (pdir_size >> PAGE_SHIFT));
++	ioc->pdir_size = pdir_size = (iova_space_size/IOVP_SIZE) * sizeof(u64);
+ 
+-	DBG_INIT("%s() hpa 0x%lx mem %dMB IOV %dMB (%d bits) PDIR size 0x%0x\n",
+-		__FUNCTION__, ioc->ioc_hpa, (int) (physmem>>20),
+-		iova_space_size>>20, iov_order + PAGE_SHIFT, pdir_size);
++	DBG_INIT("%s() hpa 0x%lx mem %ldMB IOV %dMB (%d bits)\n",
++			__FUNCTION__,
++			ioc->ioc_hpa,
++			(unsigned long) num_physpages >> (20 - PAGE_SHIFT),
++			iova_space_size>>20,
++			iov_order + PAGE_SHIFT);
+ 
+ 	ioc->pdir_base = sba_alloc_pdir(pdir_size);
+ 
+@@ -1604,7 +1528,6 @@
+ 			ioc->hint_shift_pdir, ioc->hint_mask_pdir);
+ #endif
+ 
+-	ASSERT((((unsigned long) ioc->pdir_base) & PAGE_MASK) == (unsigned long) ioc->pdir_base);
+ 	WRITE_REG64(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE);
+ 
+ 	/* build IMASK for IOC and Elroy */
+@@ -1630,14 +1553,7 @@
+ 	** can't reprogram them the way drivers want.
+ 	*/
+ 
+-	/*
+-	** setup Elroy IBASE/IMASK registers as well.
+-	*/
+-	for (lba = sba->child; lba; lba = lba->sibling) {
+-		int rope_num = (lba->hpa >> 13) & 0xf;
+-		if (rope_num >> 3 == ioc_num)
+-			lba_set_iregs(lba, ioc->ibase, ioc->imask);
+-	}
++	setup_ibase_imask(sba, ioc, ioc_num);
+ 
+ 	/*
+ 	** Program the IOC's ibase and enable IOVA translation
+@@ -1672,8 +1588,12 @@
+ **
+ **************************************************************************/
+ 
+-static void
+-sba_hw_init(struct sba_device *sba_dev)
++static void __iomem *ioc_remap(struct sba_device *sba_dev, int offset)
++{
++	return ioremap(sba_dev->dev->hpa + offset, SBA_FUNC_SIZE);
++}
++
++static void sba_hw_init(struct sba_device *sba_dev)
+ { 
+ 	int i;
+ 	int num_ioc;
+@@ -1682,24 +1602,55 @@
+ 	if (!is_pdc_pat()) {
+ 		/* Shutdown the USB controller on Astro-based workstations.
+ 		** Once we reprogram the IOMMU, the next DMA performed by
+-		** USB will HPMC the box.
++		** USB will HPMC the box. USB is only enabled if a
++		** keyboard is present and found.
++		**
++		** With serial console, j6k v5.0 firmware says:
++		**   mem_kbd hpa 0xfee003f8 sba 0x0 pad 0x0 cl_class 0x7
++		**
++		** FIXME: Using GFX+USB console at power up but direct
++		**	linux to serial console is still broken.
++		**	USB could generate DMA so we must reset USB.
++		**	The proper sequence would be:
++		**	o block console output
++		**	o reset USB device
++		**	o reprogram serial port
++		**	o unblock console output
+ 		*/
+-		pdc_io_reset_devices();
++		if (PAGE0->mem_kbd.cl_class == CL_KEYBD) {
++			pdc_io_reset_devices();
++		}
+ 
+-		/*
+-		** XXX May need something more sophisticated to deal
+-		**     with DMA from LAN. Maybe use page zero boot device
+-		**     as a handle to talk to PDC about which device to
+-		**     shutdown. This also needs to work for is_pdc_pat(). 
+-		*/
+ 	}
+ 
++
++#if 0
++printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa,
++	PAGE0->mem_boot.spa, PAGE0->mem_boot.pad, PAGE0->mem_boot.cl_class);
++
++	/*
++	** Need to deal with DMA from LAN.
++	**	Maybe use page zero boot device as a handle to talk
++	**	to PDC about which device to shutdown.
++	**
++	** Netbooting, j6k v5.0 firmware says:
++	** 	mem_boot hpa 0xf4008000 sba 0x0 pad 0x0 cl_class 0x1002
++	** ARGH! invalid class.
++	*/
++	if ((PAGE0->mem_boot.cl_class != CL_RANDOM)
++		&& (PAGE0->mem_boot.cl_class != CL_SEQU)) {
++			pdc_io_reset();
++	}
++#endif
++
+ 	if (!IS_PLUTO(sba_dev->iodc)) {
+ 		ioc_ctl = READ_REG(sba_dev->sba_hpa+IOC_CTRL);
+ 		DBG_INIT("%s() hpa 0x%lx ioc_ctl 0x%Lx ->",
+ 			__FUNCTION__, sba_dev->sba_hpa, ioc_ctl);
+ 		ioc_ctl &= ~(IOC_CTRL_RM | IOC_CTRL_NC | IOC_CTRL_CE);
+-		ioc_ctl |= IOC_CTRL_TC;	/* Astro: firmware enables this */
++		ioc_ctl |= IOC_CTRL_DD | IOC_CTRL_D4 | IOC_CTRL_TC;
++			/* j6700 v1.6 firmware sets 0x294f */
++			/* A500 firmware sets 0x4d */
+ 
+ 		WRITE_REG(ioc_ctl, sba_dev->sba_hpa+IOC_CTRL);
+ 
+@@ -1712,7 +1663,7 @@
+ 	if (IS_ASTRO(sba_dev->iodc)) {
+ 		int err;
+ 		/* PAT_PDC (L-class) also reports the same goofy base */
+-		sba_dev->ioc[0].ioc_hpa = ASTRO_IOC_OFFSET;
++		sba_dev->ioc[0].ioc_hpa = ioc_remap(sba_dev, ASTRO_IOC_OFFSET);
+ 		num_ioc = 1;
+ 
+ 		sba_dev->chip_resv.name = "Astro Intr Ack";
+@@ -1730,32 +1681,32 @@
+                  * corrected when we add it with IKE's IOC offset.
+ 		 * Doesnt look clean, but fewer code. 
+                  */
+-		sba_dev->ioc[0].ioc_hpa = -PLUTO_IOC_OFFSET;
++		sba_dev->ioc[0].ioc_hpa = ioc_remap(sba_dev, PLUTO_IOC_OFFSET);
+ 		num_ioc = 1;
+ 
+ 		sba_dev->chip_resv.name = "Pluto Intr/PIOP/VGA";
+ 		sba_dev->chip_resv.start = PCI_F_EXTEND | 0xfee00000UL;
+ 		sba_dev->chip_resv.end   = PCI_F_EXTEND | (0xff200000UL - 1);
+ 		err = request_resource(&iomem_resource, &(sba_dev->chip_resv));
+-		BUG_ON(err < 0);
++		WARN_ON(err < 0);
+ 
+ 		sba_dev->iommu_resv.name = "IOVA Space";
+ 		sba_dev->iommu_resv.start = 0x40000000UL;
+ 		sba_dev->iommu_resv.end   = 0x50000000UL - 1;
+ 		err = request_resource(&iomem_resource, &(sba_dev->iommu_resv));
+-		BUG_ON(err < 0);
++		WARN_ON(err < 0);
+ 	} else {
+ 		/* IS_IKE (ie N-class, L3000, L1500) */
+-		sba_dev->ioc[0].ioc_hpa = sba_dev->ioc[1].ioc_hpa = 0;
++		sba_dev->ioc[0].ioc_hpa = ioc_remap(sba_dev, IKE_IOC_OFFSET(0));
++		sba_dev->ioc[1].ioc_hpa = ioc_remap(sba_dev, IKE_IOC_OFFSET(1));
+ 		num_ioc = 2;
+ 
+ 		/* TODO - LOOKUP Ike/Stretch chipset mem map */
+ 	}
++	/* XXX: What about Reo? */
+ 
+ 	sba_dev->num_ioc = num_ioc;
+ 	for (i = 0; i < num_ioc; i++) {
+-		sba_dev->ioc[i].ioc_hpa += sba_dev->sba_hpa + IKE_IOC_OFFSET(i);
+-
+ 		/*
+ 		** Make sure the box crashes if we get any errors on a rope.
+ 		*/
+@@ -1771,6 +1722,16 @@
+ 		/* flush out the writes */
+ 		READ_REG(sba_dev->ioc[i].ioc_hpa + ROPE7_CTL);
+ 
++		DBG_INIT("	ioc[%d] ROPE_CFG 0x%Lx  ROPE_DBG 0x%Lx\n",
++				i,
++				READ_REG(sba_dev->ioc[i].ioc_hpa + 0x40),
++				READ_REG(sba_dev->ioc[i].ioc_hpa + 0x50)
++			);
++		DBG_INIT("	STATUS_CONTROL 0x%Lx  FLUSH_CTRL 0x%Lx\n",
++				READ_REG(sba_dev->ioc[i].ioc_hpa + 0x108),
++				READ_REG(sba_dev->ioc[i].ioc_hpa + 0x400)
++			);
++
+ 		if (IS_PLUTO(sba_dev->iodc)) {
+ 			sba_ioc_init_pluto(sba_dev->dev, &(sba_dev->ioc[i]), i);
+ 		} else {
+@@ -1984,16 +1945,6 @@
+ 	{ HPHW_BCPORT, HVERSION_REV_ANY_ID, REO_MERCED_PORT, 0xc },
+ 	{ HPHW_BCPORT, HVERSION_REV_ANY_ID, REOG_MERCED_PORT, 0xc },
+ 	{ HPHW_IOA, HVERSION_REV_ANY_ID, PLUTO_MCKINLEY_PORT, 0xc },
+-/* These two entries commented out because we don't find them in a
+- * buswalk yet.  If/when we do, they would cause us to think we had
+- * many more SBAs then we really do.
+- *	{ HPHW_BCPORT, HVERSION_REV_ANY_ID, ASTRO_ROPES_PORT, 0xc },
+- *	{ HPHW_BCPORT, HVERSION_REV_ANY_ID, IKE_ROPES_PORT, 0xc },
+- */
+-/* We shall also comment out Pluto Ropes Port since bus walk doesnt
+- * report it yet. 
+- *	{ HPHW_BCPORT, HVERSION_REV_ANY_ID, PLUTO_ROPES_PORT, 0xc },
+- */
+ 	{ 0, }
+ };
+ 
+@@ -2017,18 +1968,19 @@
+ 	u32 func_class;
+ 	int i;
+ 	char *version;
++	void __iomem *sba_addr = ioremap(dev->hpa, SBA_FUNC_SIZE);
+ 
+-	sba_dump_ranges(dev->hpa);
++	sba_dump_ranges(sba_addr);
+ 
+ 	/* Read HW Rev First */
+-	func_class = READ_REG(dev->hpa + SBA_FCLASS);
++	func_class = READ_REG(sba_addr + SBA_FCLASS);
+ 
+ 	if (IS_ASTRO(&dev->id)) {
+ 		unsigned long fclass;
+ 		static char astro_rev[]="Astro ?.?";
+ 
+ 		/* Astro is broken...Read HW Rev First */
+-		fclass = READ_REG(dev->hpa);
++		fclass = READ_REG(sba_addr);
+ 
+ 		astro_rev[6] = '1' + (char) (fclass & 0x7);
+ 		astro_rev[8] = '0' + (char) ((fclass & 0x18) >> 3);
+@@ -2061,12 +2013,12 @@
+ 		MODULE_NAME, version, dev->hpa);
+ 
+ 	sba_dev = kmalloc(sizeof(struct sba_device), GFP_KERNEL);
+-	if (NULL == sba_dev) {
++	if (!sba_dev) {
+ 		printk(KERN_ERR MODULE_NAME " - couldn't alloc sba_device\n");
+-		return(1);
++		return -ENOMEM;
+ 	}
+ 
+-	dev->sysdata = (void *) sba_dev;
++	parisc_set_drvdata(dev, sba_dev);
+ 	memset(sba_dev, 0, sizeof(struct sba_device));
+ 
+ 	for(i=0; i<MAX_IOC; i++)
+@@ -2076,7 +2028,7 @@
+ 	sba_dev->hw_rev = func_class;
+ 	sba_dev->iodc = &dev->id;
+ 	sba_dev->name = dev->name;
+-	sba_dev->sba_hpa = dev->hpa;  /* faster access */
++	sba_dev->sba_hpa = sba_addr;
+ 
+ 	sba_get_pat_resources(sba_dev);
+ 	sba_hw_init(sba_dev);
+@@ -2100,7 +2052,7 @@
+ #endif
+ 	parisc_vmerge_boundary = IOVP_SIZE;
+ 	parisc_vmerge_max_size = IOVP_SIZE * BITS_PER_LONG;
+-
++	parisc_has_iommu();
+ 	return 0;
+ }
+ 
+@@ -2129,7 +2081,7 @@
+ 	char t = sba_dev->id.hw_type;
+ 	int iocnum = (pci_hba->hw_path >> 3);	/* rope # */
+ 
+-	BUG_ON((t != HPHW_IOA) && (t != HPHW_BCPORT));
++	WARN_ON((t != HPHW_IOA) && (t != HPHW_BCPORT));
+ 
+ 	return &(sba->ioc[iocnum]);
+ }
+@@ -2159,7 +2111,7 @@
+ 	/* Astro has 4 directed ranges. Not sure about Ike/Pluto/et al */
+ 	for (i=0; i<4; i++) {
+ 		int base, size;
+-		unsigned long reg = sba->sba_hpa + i*0x18;
++		void __iomem *reg = sba->sba_hpa + i*0x18;
+ 
+ 		base = READ_REG32(reg + LMMIO_DIRECT0_BASE);
+ 		if ((base & 1) == 0)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/superio.c CVS2_6_11_PA2/drivers/parisc/superio.c
+--- LINUS_2_6_11/drivers/parisc/superio.c	2005-01-11 21:10:48.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/superio.c	2005-03-06 15:29:27.000000000 -0700
+@@ -495,7 +495,7 @@
+ 
+ static int __init superio_modinit(void)
+ {
+-	return pci_module_init(&superio_driver);
++	return pci_register_driver(&superio_driver);
+ }
+ 
+ static void __exit superio_exit(void)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parisc/wax.c CVS2_6_11_PA2/drivers/parisc/wax.c
+--- LINUS_2_6_11/drivers/parisc/wax.c	2005-03-02 04:19:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parisc/wax.c	2005-02-03 05:48:16.000000000 -0700
+@@ -25,20 +25,27 @@
+ #include "gsc.h"
+ 
+ #define WAX_GSC_IRQ	7	/* Hardcoded Interrupt for GSC */
+-#define WAX_GSC_NMI_IRQ	29
+ 
+ static void wax_choose_irq(struct parisc_device *dev, void *ctrl)
+ {
+ 	int irq;
+ 
+ 	switch (dev->id.sversion) {
+-		case 0x73:	irq =  1; break; /* HIL */
+-		case 0x8c:	irq =  6; break; /* RS232 */
+-		case 0x90:	irq = 10; break; /* WAX EISA BA */
++		case 0x73:	irq =  1; break; /* i8042 General */
++		case 0x8c:	irq =  6; break; /* Serial */
++		case 0x90:	irq = 10; break; /* EISA */
+ 		default:	return;		 /* Unknown */
+ 	}
+ 
+ 	gsc_asic_assign_irq(ctrl, irq, &dev->irq);
++
++	switch (dev->id.sversion) {
++		case 0x73:	irq =  2; break; /* i8042 High-priority */
++		case 0x90:	irq =  0; break; /* EISA NMI */
++		default:	return;		 /* No secondary IRQ */
++	}
++
++	gsc_asic_assign_irq(ctrl, irq, &dev->aux_irq);
+ }
+ 
+ static void __init
+@@ -46,7 +53,7 @@
+ {
+ 	unsigned long base = wax->hpa;
+ 
+-	/* Stop WAX barking for a bit */
++	/* Wax-off */
+ 	gsc_writel(0x00000000, base+OFFSET_IMR);
+ 
+ 	/* clear pending interrupts */
+@@ -59,11 +66,6 @@
+ 	/* Resets */
+ //	gsc_writel(0xFFFFFFFF, base+0x1000); /* HIL */
+ //	gsc_writel(0xFFFFFFFF, base+0x2000); /* RS232-B on Wax */
+-	
+-	/* Ok we hit it on the head with a hammer, our Dog is now
+-	** comatose and muzzled.  Devices will now unmask WAX
+-	** interrupts as they are registered as irq's in the WAX range.
+-	*/
+ }
+ 
+ int __init
+@@ -78,7 +80,7 @@
+ 	if (!wax)
+ 		return -ENOMEM;
+ 
+-	wax->name = "Wax";
++	wax->name = "wax";
+ 	wax->hpa = dev->hpa;
+ 
+ 	wax->version = 0;   /* gsc_readb(wax->hpa+WAX_VER); */
+@@ -132,7 +134,7 @@
+ MODULE_DEVICE_TABLE(parisc, wax_tbl);
+ 
+ struct parisc_driver wax_driver = {
+-	.name =		"Wax",
++	.name =		"wax",
+ 	.id_table =	wax_tbl,
+ 	.probe =	wax_init_chip,
+ };
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parport/parport_gsc.c CVS2_6_11_PA2/drivers/parport/parport_gsc.c
+--- LINUS_2_6_11/drivers/parport/parport_gsc.c	2005-03-02 04:19:12.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parport/parport_gsc.c	2005-01-03 16:44:27.000000000 -0700
+@@ -42,7 +42,7 @@
+ #include <asm/pdc.h>
+ #include <asm/parisc-device.h>
+ #include <asm/hardware.h>
+-#include <asm/parport_gsc.h>
++#include "parport_gsc.h"
+ 
+ 
+ MODULE_AUTHOR("Helge Deller <deller at gmx.de>");
+@@ -87,95 +87,6 @@
+ 	return IRQ_HANDLED;
+ }
+ 
+-void parport_gsc_write_data(struct parport *p, unsigned char d)
+-{
+-	parport_writeb (d, DATA (p));
+-}
+-
+-unsigned char parport_gsc_read_data(struct parport *p)
+-{
+-	unsigned char c = parport_readb (DATA (p));
+-	return c;
+-}
+-
+-void parport_gsc_write_control(struct parport *p, unsigned char d)
+-{
+-	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+-				  PARPORT_CONTROL_AUTOFD |
+-				  PARPORT_CONTROL_INIT |
+-				  PARPORT_CONTROL_SELECT);
+-
+-	/* Take this out when drivers have adapted to the newer interface. */
+-	if (d & 0x20) {
+-		pr_debug("%s (%s): use data_reverse for this!\n",
+-			    p->name, p->cad->name);
+-		parport_gsc_data_reverse (p);
+-	}
+-
+-	__parport_gsc_frob_control (p, wm, d & wm);
+-}
+-
+-unsigned char parport_gsc_read_control(struct parport *p)
+-{
+-	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+-				  PARPORT_CONTROL_AUTOFD |
+-				  PARPORT_CONTROL_INIT |
+-				  PARPORT_CONTROL_SELECT);
+-	const struct parport_gsc_private *priv = p->physport->private_data;
+-	return priv->ctr & wm; /* Use soft copy */
+-}
+-
+-unsigned char parport_gsc_frob_control (struct parport *p, unsigned char mask,
+-				       unsigned char val)
+-{
+-	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+-				  PARPORT_CONTROL_AUTOFD |
+-				  PARPORT_CONTROL_INIT |
+-				  PARPORT_CONTROL_SELECT);
+-
+-	/* Take this out when drivers have adapted to the newer interface. */
+-	if (mask & 0x20) {
+-		pr_debug("%s (%s): use data_%s for this!\n",
+-			p->name, p->cad->name,
+-			(val & 0x20) ? "reverse" : "forward");
+-		if (val & 0x20)
+-			parport_gsc_data_reverse (p);
+-		else
+-			parport_gsc_data_forward (p);
+-	}
+-
+-	/* Restrict mask and val to control lines. */
+-	mask &= wm;
+-	val &= wm;
+-
+-	return __parport_gsc_frob_control (p, mask, val);
+-}
+-
+-unsigned char parport_gsc_read_status(struct parport *p)
+-{
+-	return parport_readb (STATUS (p));
+-}
+-
+-void parport_gsc_disable_irq(struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x10, 0);
+-}
+-
+-void parport_gsc_enable_irq(struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x10, 0x10);
+-}
+-
+-void parport_gsc_data_forward (struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x20, 0);
+-}
+-
+-void parport_gsc_data_reverse (struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x20, 0x20);
+-}
+-
+ void parport_gsc_init_state(struct pardevice *dev, struct parport_state *s)
+ {
+ 	s->u.pc.ctr = 0xc | (dev->irq_func ? 0x10 : 0x0);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/parport/parport_gsc.h CVS2_6_11_PA2/drivers/parport/parport_gsc.h
+--- LINUS_2_6_11/drivers/parport/parport_gsc.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/drivers/parport/parport_gsc.h	2005-01-03 16:44:27.000000000 -0700
+@@ -0,0 +1,222 @@
++/*
++ *	Low-level parallel-support for PC-style hardware integrated in the
++ *	LASI-Controller (on GSC-Bus) for HP-PARISC Workstations
++ *
++ *	(C) 1999-2001 by Helge Deller <deller at gmx.de>
++ *
++ *
++ *	This program is free software; you can redistribute it and/or modify
++ *	it under the terms of the GNU General Public License as published by
++ *	the Free Software Foundation; either version 2 of the License, or
++ *	(at your option) any later version.
++ *
++ *	This program is distributed in the hope that it will be useful,
++ *	but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *	GNU General Public License for more details.
++ *
++ *	You should have received a copy of the GNU General Public License
++ *	along with this program; if not, write to the Free Software
++ *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ * based on parport_pc.c by
++ * 	    Grant Guenther <grant at torque.net>
++ * 	    Phil Blundell <Philip.Blundell at pobox.com>
++ *          Tim Waugh <tim at cyberelk.demon.co.uk>
++ *	    Jose Renau <renau at acm.org>
++ *          David Campbell <campbell at torque.net>
++ *          Andrea Arcangeli
++ */
++
++#ifndef	__DRIVERS_PARPORT_PARPORT_GSC_H
++#define	__DRIVERS_PARPORT_PARPORT_GSC_H
++
++#include <asm/io.h>
++#include <linux/delay.h>
++
++#undef	DEBUG_PARPORT	/* undefine for production */
++#define DELAY_TIME 	0
++
++#if DELAY_TIME == 0
++#define parport_readb	gsc_readb
++#define parport_writeb	gsc_writeb
++#else
++static __inline__ unsigned char parport_readb( unsigned long port )
++{
++    udelay(DELAY_TIME);
++    return gsc_readb(port);
++}
++
++static __inline__ void parport_writeb( unsigned char value, unsigned long port )
++{
++    gsc_writeb(value,port);
++    udelay(DELAY_TIME);
++}
++#endif
++
++/* --- register definitions ------------------------------- */
++
++#define EPPDATA(p)  ((p)->base    + 0x4)
++#define EPPADDR(p)  ((p)->base    + 0x3)
++#define CONTROL(p)  ((p)->base    + 0x2)
++#define STATUS(p)   ((p)->base    + 0x1)
++#define DATA(p)     ((p)->base    + 0x0)
++
++struct parport_gsc_private {
++	/* Contents of CTR. */
++	unsigned char ctr;
++
++	/* Bitmask of writable CTR bits. */
++	unsigned char ctr_writable;
++
++	/* Number of bytes per portword. */
++	int pword;
++
++	/* Not used yet. */
++	int readIntrThreshold;
++	int writeIntrThreshold;
++
++	/* buffer suitable for DMA, if DMA enabled */
++	char *dma_buf;
++	dma_addr_t dma_handle;
++	struct pci_dev *dev;
++};
++
++static inline void parport_gsc_write_data(struct parport *p, unsigned char d)
++{
++#ifdef DEBUG_PARPORT
++	printk (KERN_DEBUG "parport_gsc_write_data(%p,0x%02x)\n", p, d);
++#endif
++	parport_writeb(d, DATA(p));
++}
++
++static inline unsigned char parport_gsc_read_data(struct parport *p)
++{
++	unsigned char val = parport_readb (DATA (p));
++#ifdef DEBUG_PARPORT
++	printk (KERN_DEBUG "parport_gsc_read_data(%p) = 0x%02x\n",
++		p, val);
++#endif
++	return val;
++}
++
++/* __parport_gsc_frob_control differs from parport_gsc_frob_control in that
++ * it doesn't do any extra masking. */
++static inline unsigned char __parport_gsc_frob_control(struct parport *p,
++							unsigned char mask,
++							unsigned char val)
++{
++	struct parport_gsc_private *priv = p->physport->private_data;
++	unsigned char ctr = priv->ctr;
++#ifdef DEBUG_PARPORT
++	printk (KERN_DEBUG
++		"__parport_gsc_frob_control(%02x,%02x): %02x -> %02x\n",
++		mask, val, ctr, ((ctr & ~mask) ^ val) & priv->ctr_writable);
++#endif
++	ctr = (ctr & ~mask) ^ val;
++	ctr &= priv->ctr_writable; /* only write writable bits. */
++	parport_writeb (ctr, CONTROL (p));
++	priv->ctr = ctr;	/* Update soft copy */
++	return ctr;
++}
++
++static inline void parport_gsc_data_reverse(struct parport *p)
++{
++	__parport_gsc_frob_control (p, 0x20, 0x20);
++}
++
++static inline void parport_gsc_data_forward(struct parport *p)
++{
++	__parport_gsc_frob_control (p, 0x20, 0x00);
++}
++
++static inline void parport_gsc_write_control(struct parport *p,
++						 unsigned char d)
++{
++	const unsigned char wm = (PARPORT_CONTROL_STROBE |
++				  PARPORT_CONTROL_AUTOFD |
++				  PARPORT_CONTROL_INIT |
++				  PARPORT_CONTROL_SELECT);
++
++	/* Take this out when drivers have adapted to newer interface. */
++	if (d & 0x20) {
++		printk (KERN_DEBUG "%s (%s): use data_reverse for this!\n",
++			p->name, p->cad->name);
++		parport_gsc_data_reverse (p);
++	}
++
++	__parport_gsc_frob_control (p, wm, d & wm);
++}
++
++static inline unsigned char parport_gsc_read_control(struct parport *p)
++{
++	const unsigned char rm = (PARPORT_CONTROL_STROBE |
++				  PARPORT_CONTROL_AUTOFD |
++				  PARPORT_CONTROL_INIT |
++				  PARPORT_CONTROL_SELECT);
++	const struct parport_gsc_private *priv = p->physport->private_data;
++	return priv->ctr & rm; /* Use soft copy */
++}
++
++static inline unsigned char parport_gsc_frob_control(struct parport *p,
++							unsigned char mask,
++							unsigned char val)
++{
++	const unsigned char wm = (PARPORT_CONTROL_STROBE |
++				  PARPORT_CONTROL_AUTOFD |
++				  PARPORT_CONTROL_INIT |
++				  PARPORT_CONTROL_SELECT);
++
++	/* Take this out when drivers have adapted to newer interface. */
++	if (mask & 0x20) {
++		printk (KERN_DEBUG "%s (%s): use data_%s for this!\n",
++			p->name, p->cad->name,
++			(val & 0x20) ? "reverse" : "forward");
++		if (val & 0x20)
++			parport_gsc_data_reverse (p);
++		else
++			parport_gsc_data_forward (p);
++	}
++
++	/* Restrict mask and val to control lines. */
++	mask &= wm;
++	val &= wm;
++
++	return __parport_gsc_frob_control (p, mask, val);
++}
++
++static inline unsigned char parport_gsc_read_status(struct parport *p)
++{
++	return parport_readb (STATUS(p));
++}
++
++static inline void parport_gsc_disable_irq(struct parport *p)
++{
++	__parport_gsc_frob_control (p, 0x10, 0x00);
++}
++
++static inline void parport_gsc_enable_irq(struct parport *p)
++{
++	__parport_gsc_frob_control (p, 0x10, 0x10);
++}
++
++extern void parport_gsc_release_resources(struct parport *p);
++
++extern int parport_gsc_claim_resources(struct parport *p);
++
++extern void parport_gsc_init_state(struct pardevice *, struct parport_state *s);
++
++extern void parport_gsc_save_state(struct parport *p, struct parport_state *s);
++
++extern void parport_gsc_restore_state(struct parport *p, struct parport_state *s);
++
++extern void parport_gsc_inc_use_count(void);
++
++extern void parport_gsc_dec_use_count(void);
++
++extern struct parport *parport_gsc_probe_port(unsigned long base,
++						unsigned long base_hi,
++						int irq, int dma,
++						struct pci_dev *dev);
++
++#endif	/* __DRIVERS_PARPORT_PARPORT_GSC_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/pci/quirks.c CVS2_6_11_PA2/drivers/pci/quirks.c
+--- LINUS_2_6_11/drivers/pci/quirks.c	2005-03-02 04:19:12.000000000 -0700
++++ CVS2_6_11_PA2/drivers/pci/quirks.c	2005-02-13 19:55:21.000000000 -0700
+@@ -536,7 +536,7 @@
+ 		return;
+ 	pci_write_config_dword(dev, PCI_CB_LEGACY_MODE_BASE, 0);
+ }
+-DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID,		PCI_ANY_ID,			quirk_cardbus_legacy );
++DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy);
+ 
+ /*
+  * Following the PCI ordering rules is optional on the AMD762. I'm not
+@@ -654,7 +654,7 @@
+        printk(KERN_INFO "PCI: Ignoring BAR%d-%d of IDE controller %s\n",
+               first_bar, last_bar, pci_name(dev));
+ }
+-DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID,             PCI_ANY_ID,                     quirk_ide_bases );
++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, quirk_ide_bases);
+ 
+ /*
+  *	Ensure C0 rev restreaming is off. This is normally done by
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/pcmcia/Kconfig CVS2_6_11_PA2/drivers/pcmcia/Kconfig
+--- LINUS_2_6_11/drivers/pcmcia/Kconfig	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/pcmcia/Kconfig	2005-02-03 04:44:45.000000000 -0700
+@@ -166,7 +166,11 @@
+ 
+ config PCMCIA_PROBE
+ 	bool
+-	default y if ISA && !ARCH_SA1100 && !ARCH_CLPS711X
++	default y if ISA && !ARCH_SA1100 && !ARCH_CLPS711X && !PARISC
++
++config PCMCIA_PROBE_MEM
++	bool
++	default y if !PARISC
+ 
+ config M32R_PCC
+ 	bool "M32R PCMCIA I/F"
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/pcmcia/rsrc_nonstatic.c CVS2_6_11_PA2/drivers/pcmcia/rsrc_nonstatic.c
+--- LINUS_2_6_11/drivers/pcmcia/rsrc_nonstatic.c	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/pcmcia/rsrc_nonstatic.c	2005-02-03 04:44:45.000000000 -0700
+@@ -41,7 +41,11 @@
+ 
+ #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444)
+ 
++#ifdef CONFIG_PCMCIA_PROBE_MEM
+ INT_MODULE_PARM(probe_mem,	1);		/* memory probe? */
++#else
++INT_MODULE_PARM(probe_mem,	0);		/* memory probe? */
++#endif
+ #ifdef CONFIG_PCMCIA_PROBE
+ INT_MODULE_PARM(probe_io,	1);		/* IO port probe? */
+ INT_MODULE_PARM(mem_limit,	0x10000);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/53c700.c CVS2_6_11_PA2/drivers/scsi/53c700.c
+--- LINUS_2_6_11/drivers/scsi/53c700.c	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/53c700.c	2005-02-24 07:48:28.000000000 -0700
+@@ -303,6 +303,7 @@
+ 	__u8 *memory;
+ 	__u32 *script;
+ 	struct Scsi_Host *host;
++	const char *chipname;
+ 	static int banner = 0;
+ 	int j;
+ 
+@@ -407,15 +408,15 @@
+ 		printk(KERN_NOTICE "53c700: Version " NCR_700_VERSION " By James.Bottomley at HansenPartnership.com\n");
+ 		banner = 1;
+ 	}
++	chipname = hostdata->chip710 ? "53c710" : \
++		   (hostdata->fast ? "53c700-66" : "53c700");
+ 	printk(KERN_NOTICE "scsi%d: %s rev %d %s\n", host->host_no,
+-	       hostdata->chip710 ? "53c710" : 
+-	       (hostdata->fast ? "53c700-66" : "53c700"),
+-	       hostdata->rev, hostdata->differential ?
+-	       "(Differential)" : "");
++			chipname, hostdata->rev,
++			hostdata->differential ?  "(Differential)" : "");
+ 	/* reset the chip */
+ 	NCR_700_chip_reset(host);
+ 
+-	if (request_irq(irq, NCR_700_intr, SA_SHIRQ, dev->bus_id, host)) {
++	if (request_irq(irq, NCR_700_intr, SA_SHIRQ, chipname, host)) {
+ 		dev_printk(KERN_ERR, dev, "53c700: irq %lu request failed\n ",
+ 			   irq);
+ 		goto out_put_host;
+@@ -824,6 +825,7 @@
+ 	switch(hostdata->msgin[2]) {
+ 	case A_SDTR_MSG:
+ 		if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) {
++			struct scsi_target *starget = SCp->device->sdev_target;
+ 			__u8 period = hostdata->msgin[3];
+ 			__u8 offset = hostdata->msgin[4];
+ 
+@@ -831,22 +833,15 @@
+ 				offset = 0;
+ 				period = 0;
+ 			}
++
++			spi_offset(starget) = offset;
++			spi_period(starget) = period;
+ 			
+ 			if(NCR_700_is_flag_set(SCp->device, NCR_700_DEV_PRINT_SYNC_NEGOTIATION)) {
+-				if(spi_offset(SCp->device->sdev_target) != 0)
+-					printk(KERN_INFO "scsi%d: (%d:%d) Synchronous at offset %d, period %dns\n",
+-					       host->host_no, pun, lun,
+-					       offset, period*4);
+-				else
+-					printk(KERN_INFO "scsi%d: (%d:%d) Asynchronous\n",
+-					       host->host_no, pun, lun);
++				spi_display_xfer_agreement(starget);
+ 				NCR_700_clear_flag(SCp->device, NCR_700_DEV_PRINT_SYNC_NEGOTIATION);
+ 			}
+-				
+-			spi_offset(SCp->device->sdev_target) = offset;
+-			spi_period(SCp->device->sdev_target) = period;
+ 			
+-
+ 			NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
+ 			NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
+ 			
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/53c700.h CVS2_6_11_PA2/drivers/scsi/53c700.h
+--- LINUS_2_6_11/drivers/scsi/53c700.h	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/53c700.h	2005-02-14 11:04:39.000000000 -0700
+@@ -461,13 +461,13 @@
+ 	const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+ 		= (struct NCR_700_Host_Parameters *)host->hostdata[0];
+ 
+-	return readb(host->base + (reg^bE));
++	return readb((void __iomem *)host->base + (reg^bE));
+ }
+ 
+ static inline __u32
+ NCR_700_mem_readl(struct Scsi_Host *host, __u32 reg)
+ {
+-	__u32 value = __raw_readl(host->base + reg);
++	__u32 value = __raw_readl((void __iomem *)host->base + reg);
+ 	const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+ 		= (struct NCR_700_Host_Parameters *)host->hostdata[0];
+ #if 1
+@@ -485,7 +485,7 @@
+ 	const struct NCR_700_Host_Parameters *hostdata __attribute__((unused))
+ 		= (struct NCR_700_Host_Parameters *)host->hostdata[0];
+ 
+-	writeb(value, host->base + (reg^bE));
++	writeb(value, (void __iomem *)host->base + (reg^bE));
+ }
+ 
+ static inline void
+@@ -500,7 +500,7 @@
+ 		BUG();
+ #endif
+ 
+-	__raw_writel(bS_to_host(value), host->base + reg);
++	__raw_writel(bS_to_host(value), (void __iomem *)host->base + reg);
+ }
+ 
+ static inline __u8
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/lasi700.c CVS2_6_11_PA2/drivers/scsi/lasi700.c
+--- LINUS_2_6_11/drivers/scsi/lasi700.c	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/lasi700.c	2005-02-20 05:32:02.000000000 -0700
+@@ -112,7 +112,7 @@
+ 
+ 	hostdata->dev = &dev->dev;
+ 	dma_set_mask(&dev->dev, 0xffffffffUL);
+-	hostdata->base = base;
++	hostdata->base = ioremap(base, 0x100);
+ 	hostdata->differential = 0;
+ 
+ 	if (dev->id.sversion == LASI_700_SVERSION) {
+@@ -138,6 +138,7 @@
+ 	return 0;
+ 
+  out_kfree:
++	iounmap(hostdata->base);
+ 	kfree(hostdata);
+ 	return -ENODEV;
+ }
+@@ -152,6 +153,7 @@
+ 	scsi_remove_host(host);
+ 	NCR_700_release(host);
+ 	free_irq(host->irq, host);
++	iounmap(hostdata->base);
+ 	kfree(hostdata);
+ 
+ 	return 0;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/ncr53c8xx.c CVS2_6_11_PA2/drivers/scsi/ncr53c8xx.c
+--- LINUS_2_6_11/drivers/scsi/ncr53c8xx.c	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/ncr53c8xx.c	2005-02-24 07:48:28.000000000 -0700
+@@ -536,7 +536,7 @@
+ 	u_char	usrwide;
+ 	u_char	usrtags;
+ 	u_char	usrflag;
+-	struct scsi_target *starget;
++	struct scsi_device *sdev;
+ };
+ 
+ /*========================================================================
+@@ -1219,7 +1219,7 @@
+ static	struct lcb *	ncr_setup_lcb	(struct ncb *np, struct scsi_device *sdev);
+ static	void	ncr_getclock	(struct ncb *np, int mult);
+ static	void	ncr_selectclock	(struct ncb *np, u_char scntl3);
+-static	struct ccb *ncr_get_ccb	(struct ncb *np, u_char tn, u_char ln);
++static	struct ccb *ncr_get_ccb	(struct ncb *np, struct scsi_cmnd *cmd);
+ static	void	ncr_chip_reset	(struct ncb *np, int delay);
+ static	void	ncr_init	(struct ncb *np, int reset, char * msg, u_long code);
+ static	int	ncr_int_sbmc	(struct ncb *np);
+@@ -1238,8 +1238,6 @@
+ static	void	ncr_setsync	(struct ncb *np, struct ccb *cp, u_char scntl3, u_char sxfer);
+ static	void	ncr_setup_tags	(struct ncb *np, struct scsi_device *sdev);
+ static	void	ncr_setwide	(struct ncb *np, struct ccb *cp, u_char wide, u_char ack);
+-static	int	ncr_show_msg	(u_char * msg);
+-static  void    ncr_print_msg   (struct ccb *cp, char *label, u_char *msg);
+ static	int	ncr_snooptest	(struct ncb *np);
+ static	void	ncr_timeout	(struct ncb *np);
+ static  void    ncr_wakeup      (struct ncb *np, u_long code);
+@@ -2746,7 +2744,7 @@
+ 	for (i=0; i<MAX_START; i++) {
+ 		*p++ =SCR_CALL;
+ 		*p++ =PADDR (idle);
+-	};
++	}
+ 
+ 	BUG_ON((u_long)p != (u_long)&scrh->tryloop + sizeof (scrh->tryloop));
+ 
+@@ -2771,7 +2769,7 @@
+ 		*p++ =PADDR (dispatch);
+ 		*p++ =SCR_MOVE_TBL ^ SCR_DATA_IN;
+ 		*p++ =offsetof (struct dsb, data[i]);
+-	};
++	}
+ 
+ 	BUG_ON((u_long)p != (u_long)&scrh->hdata_in + sizeof (scrh->hdata_in));
+ 
+@@ -2781,7 +2779,7 @@
+ 		*p++ =PADDR (dispatch);
+ 		*p++ =SCR_MOVE_TBL ^ SCR_DATA_IN;
+ 		*p++ =offsetof (struct dsb, data[i]);
+-	};
++	}
+ 
+ 	BUG_ON((u_long)p != (u_long)&scr->data_in + sizeof (scr->data_in));
+ 
+@@ -2791,7 +2789,7 @@
+ 		*p++ =PADDR (dispatch);
+ 		*p++ =SCR_MOVE_TBL ^ SCR_DATA_OUT;
+ 		*p++ =offsetof (struct dsb, data[i]);
+-	};
++	}
+ 
+ 	BUG_ON((u_long)p != (u_long)&scrh->hdata_out + sizeof (scrh->hdata_out));
+ 
+@@ -2801,7 +2799,7 @@
+ 		*p++ =PADDR (dispatch);
+ 		*p++ =SCR_MOVE_TBL ^ SCR_DATA_OUT;
+ 		*p++ =offsetof (struct dsb, data[i]);
+-	};
++	}
+ 
+ 	BUG_ON((u_long) p != (u_long)&scr->data_out + sizeof (scr->data_out));
+ }
+@@ -2842,7 +2840,7 @@
+ 			printk (KERN_ERR "%s: ERROR0 IN SCRIPT at %d.\n",
+ 				ncr_name(np), (int) (src-start-1));
+ 			mdelay(1000);
+-		};
++		}
+ 
+ 		if (DEBUG_FLAGS & DEBUG_SCRIPT)
+ 			printk (KERN_DEBUG "%p:  <%x>\n",
+@@ -2911,7 +2909,7 @@
+ 		default:
+ 			relocs = 0;
+ 			break;
+-		};
++		}
+ 
+ 		if (relocs) {
+ 			while (relocs--) {
+@@ -2958,7 +2956,7 @@
+ 		} else
+ 			*dst++ = cpu_to_scr(*src++);
+ 
+-	};
++	}
+ }
+ 
+ /*
+@@ -2969,25 +2967,25 @@
+      struct ncb *ncb;
+ };
+ 
+-/*
+-**	Print something which allows to retrieve the controller type, unit,
+-**	target, lun concerned by a kernel message.
+-*/
++#define PRINT_ADDR(cmd, arg...) dev_info(&cmd->device->sdev_gendev , ## arg)
+ 
+-static void PRINT_TARGET(struct ncb *np, int target)
++static void ncr_print_msg(struct ccb *cp, char *label, u_char *msg)
+ {
+-	printk(KERN_INFO "%s-<%d,*>: ", ncr_name(np), target);
+-}
++	int i;
++	PRINT_ADDR(cp->cmd, "%s: ", label);
+ 
+-static void PRINT_LUN(struct ncb *np, int target, int lun)
+-{
+-	printk(KERN_INFO "%s-<%d,%d>: ", ncr_name(np), target, lun);
+-}
++	printk ("%x",*msg);
++	if (*msg == M_EXTENDED) {
++		for (i = 1; i < 8; i++) {
++			if (i - 1 > msg[1])
++				break;
++			printk ("-%x",msg[i]);
++		}
++	} else if ((*msg & 0xf0) == 0x20) {
++		printk ("-%x",msg[1]);
++	}
+ 
+-static void PRINT_ADDR(struct scsi_cmnd *cmd)
+-{
+-	struct host_data *host_data = (struct host_data *) cmd->device->host->hostdata;
+-	PRINT_LUN(host_data->ncb, cmd->device->id, cmd->device->lun);
++	printk(".\n");
+ }
+ 
+ /*==========================================================
+@@ -3367,36 +3365,25 @@
+ 	struct tcb *tp = &np->target[cp->target];
+ 	int msglen = 0;
+ 	int nego = 0;
+-	struct scsi_target *starget = tp->starget;
+-
+-	if (likely(starget)) {
+-
+-		/*
+-		**	negotiate wide transfers ?
+-		*/
+-
+-		if (!tp->widedone) {
+-			if (spi_support_wide(starget)) {
+-				nego = NS_WIDE;
+-			} else
+-				tp->widedone=1;
++	struct scsi_target *starget = tp->sdev->sdev_target;
+ 
+-		};
+-
+-		/*
+-		**	negotiate synchronous transfers?
+-		*/
++	/* negotiate wide transfers ?  */
++	if (!tp->widedone) {
++		if (spi_support_wide(starget)) {
++			nego = NS_WIDE;
++		} else
++			tp->widedone=1;
++	}
+ 
+-		if (!nego && !tp->period) {
+-			if (spi_support_sync(starget)) {
+-				nego = NS_SYNC;
+-			} else {
+-				tp->period  =0xffff;
+-				PRINT_TARGET(np, cp->target);
+-				printk ("target did not report SYNC.\n");
+-			};
+-		};
+-	};
++	/* negotiate synchronous transfers?  */
++	if (!nego && !tp->period) {
++		if (spi_support_sync(starget)) {
++			nego = NS_SYNC;
++		} else {
++			tp->period  =0xffff;
++			dev_info(&starget->dev, "target did not report SYNC.\n");
++		}
++	}
+ 
+ 	switch (nego) {
+ 	case NS_SYNC:
+@@ -3412,7 +3399,7 @@
+ 		msgptr[msglen++] = M_X_WIDE_REQ;
+ 		msgptr[msglen++] = tp->usrwide;
+ 		break;
+-	};
++	}
+ 
+ 	cp->nego_status = nego;
+ 
+@@ -3421,8 +3408,8 @@
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+ 			ncr_print_msg(cp, nego == NS_WIDE ?
+ 					  "wide msgout":"sync_msgout", msgptr);
+-		};
+-	};
++		}
++	}
+ 
+ 	return msglen;
+ }
+@@ -3440,9 +3427,9 @@
+ */
+ static int ncr_queue_command (struct ncb *np, struct scsi_cmnd *cmd)
+ {
+-/*	struct scsi_device        *device    = cmd->device; */
+-	struct tcb *tp                      = &np->target[cmd->device->id];
+-	struct lcb *lp		      = tp->lp[cmd->device->lun];
++	struct scsi_device *sdev = cmd->device;
++	struct tcb *tp = &np->target[sdev->id];
++	struct lcb *lp = tp->lp[sdev->lun];
+ 	struct ccb *cp;
+ 
+ 	int	segments;
+@@ -3457,9 +3444,9 @@
+ 	**
+ 	**---------------------------------------------
+ 	*/
+-	if ((cmd->device->id == np->myaddr	  ) ||
+-		(cmd->device->id >= MAX_TARGET) ||
+-		(cmd->device->lun    >= MAX_LUN   )) {
++	if ((sdev->id == np->myaddr	  ) ||
++		(sdev->id >= MAX_TARGET) ||
++		(sdev->lun    >= MAX_LUN   )) {
+ 		return(DID_BAD_TARGET);
+ 	}
+ 
+@@ -3479,8 +3466,7 @@
+ 	}
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TINY) {
+-		PRINT_ADDR(cmd);
+-		printk ("CMD=%x ", cmd->cmnd[0]);
++		PRINT_ADDR(cmd, "CMD=%x ", cmd->cmnd[0]);
+ 	}
+ 
+ 	/*---------------------------------------------------
+@@ -3499,7 +3485,7 @@
+ 			np->settle_time = tlimit;
+ 	}
+ 
+-	if (np->settle_time || !(cp=ncr_get_ccb (np, cmd->device->id, cmd->device->lun))) {
++	if (np->settle_time || !(cp=ncr_get_ccb (np, cmd))) {
+ 		insert_into_waiting_list(np, cmd);
+ 		return(DID_OK);
+ 	}
+@@ -3512,7 +3498,7 @@
+ 	**----------------------------------------------------
+ 	*/
+ 
+-	idmsg = M_IDENTIFY | cmd->device->lun;
++	idmsg = M_IDENTIFY | sdev->lun;
+ 
+ 	if (cp ->tag != NO_TAG ||
+ 		(cp != np->ccb && np->disc && !(tp->usrflag & UF_NODISC)))
+@@ -3533,8 +3519,8 @@
+ 			if (lp->tags_smap) {
+ 				order = M_ORDERED_TAG;
+ 				if ((DEBUG_FLAGS & DEBUG_TAGS)||bootverbose>2){ 
+-					PRINT_ADDR(cmd);
+-					printk("ordered tag forced.\n");
++					PRINT_ADDR(cmd,
++						"ordered tag forced.\n");
+ 				}
+ 			}
+ 			lp->tags_stime = ktime_get(3*HZ);
+@@ -3682,7 +3668,7 @@
+ 	/*
+ 	**	select
+ 	*/
+-	cp->phys.select.sel_id		= cmd->device->id;
++	cp->phys.select.sel_id		= sdev->id;
+ 	cp->phys.select.sel_scntl3	= tp->wval;
+ 	cp->phys.select.sel_sxfer	= tp->sval;
+ 	/*
+@@ -3719,9 +3705,7 @@
+ 	**----------------------------------------------------
+ 	*/
+ 
+-	/*
+-	**	activate this job.
+-	*/
++	/* activate this job.  */
+ 	cp->magic		= CCB_MAGIC;
+ 
+ 	/*
+@@ -3734,11 +3718,9 @@
+ 	else
+ 		ncr_put_start_queue(np, cp);
+ 
+-	/*
+-	**	Command is successfully queued.
+-	*/
++	/* Command is successfully queued.  */
+ 
+-	return(DID_OK);
++	return DID_OK;
+ }
+ 
+ 
+@@ -4203,8 +4185,7 @@
+ 	*/
+ 
+ 	if (cp->parity_status > 1) {
+-		PRINT_ADDR(cmd);
+-		printk ("%d parity error(s).\n",cp->parity_status);
++		PRINT_ADDR(cmd, "%d parity error(s).\n",cp->parity_status);
+ 	}
+ 
+ 	/*
+@@ -4212,16 +4193,16 @@
+ 	*/
+ 
+ 	if (cp->xerr_status != XE_OK) {
+-		PRINT_ADDR(cmd);
+ 		switch (cp->xerr_status) {
+ 		case XE_EXTRA_DATA:
+-			printk ("extraneous data discarded.\n");
++			PRINT_ADDR(cmd, "extraneous data discarded.\n");
+ 			break;
+ 		case XE_BAD_PHASE:
+-			printk ("invalid scsi phase (4/5).\n");
++			PRINT_ADDR(cmd, "invalid scsi phase (4/5).\n");
+ 			break;
+ 		default:
+-			printk ("extended error %d.\n", cp->xerr_status);
++			PRINT_ADDR(cmd, "extended error %d.\n",
++					cp->xerr_status);
+ 			break;
+ 		}
+ 		if (cp->host_status==HS_COMPLETE)
+@@ -4233,9 +4214,9 @@
+ 	*/
+ 	if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) {
+ 		if (cp->host_status!=HS_COMPLETE || cp->scsi_status!=S_GOOD) {
+-			PRINT_ADDR(cmd);
+-			printk ("ERROR: cmd=%x host_status=%x scsi_status=%x\n",
+-				cmd->cmnd[0], cp->host_status, cp->scsi_status);
++			PRINT_ADDR(cmd, "ERROR: cmd=%x host_status=%x "
++					"scsi_status=%x\n", cmd->cmnd[0],
++					cp->host_status, cp->scsi_status);
+ 		}
+ 	}
+ 
+@@ -4296,8 +4277,7 @@
+ 		if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) {
+ 			u_char * p = (u_char*) & cmd->sense_buffer;
+ 			int i;
+-			PRINT_ADDR(cmd);
+-			printk ("sense data:");
++			PRINT_ADDR(cmd, "sense data:");
+ 			for (i=0; i<14; i++) printk (" %x", *p++);
+ 			printk (".\n");
+ 		}
+@@ -4344,8 +4324,7 @@
+ 		/*
+ 		**  Other protocol messes
+ 		*/
+-		PRINT_ADDR(cmd);
+-		printk ("COMMAND FAILED (%x %x) @%p.\n",
++		PRINT_ADDR(cmd, "COMMAND FAILED (%x %x) @%p.\n",
+ 			cp->host_status, cp->scsi_status, cp);
+ 
+ 		cmd->result = ScsiResult(DID_ERROR, cp->scsi_status);
+@@ -4358,8 +4337,7 @@
+ 	if (tp->usrflag & UF_TRACE) {
+ 		u_char * p;
+ 		int i;
+-		PRINT_ADDR(cmd);
+-		printk (" CMD:");
++		PRINT_ADDR(cmd, " CMD:");
+ 		p = (u_char*) &cmd->cmnd[0];
+ 		for (i=0; i<cmd->cmd_len; i++) printk (" %x", *p++);
+ 
+@@ -4667,7 +4645,7 @@
+ 			}
+ 			else
+ 				tp->usrsync = 255;
+-		};
++		}
+ 
+ 		if (tp->usrwide > np->maxwide)
+ 			tp->usrwide = np->maxwide;
+@@ -4849,7 +4827,7 @@
+ #endif
+ 		cp->phys.select.sel_scntl3 = tp->wval;
+ 		cp->phys.select.sel_sxfer  = tp->sval;
+-	};
++	}
+ }
+ 
+ /*==========================================================
+@@ -4885,40 +4863,19 @@
+ 	else
+ 		tp->period = 0xffff;
+ 
+-	/*
+-	**	 Stop there if sync parameters are unchanged
+-	*/
+-	if (tp->sval == sxfer && tp->wval == scntl3) return;
++	/* Stop there if sync parameters are unchanged */
++	if (tp->sval == sxfer && tp->wval == scntl3)
++		return;
+ 	tp->sval = sxfer;
+ 	tp->wval = scntl3;
+ 
+-	/*
+-	**	Bells and whistles   ;-)
+-	*/
+-	PRINT_TARGET(np, target);
+ 	if (sxfer & 0x01f) {
+-		unsigned f10 = 100000 << (tp->widedone ? tp->widedone -1 : 0);
+-		unsigned mb10 = (f10 + tp->period/2) / tp->period;
+-		char *scsi;
+-
+-		/*
+-		**  Disable extended Sreq/Sack filtering
+-		*/
+-		if (tp->period <= 2000) OUTOFFB (nc_stest2, EXT);
+-
+-		/*
+-		**	Bells and whistles   ;-)
+-		*/
+-		if	(tp->period < 500)	scsi = "FAST-40";
+-		else if	(tp->period < 1000)	scsi = "FAST-20";
+-		else if	(tp->period < 2000)	scsi = "FAST-10";
+-		else				scsi = "FAST-5";
+-
+-		printk ("%s %sSCSI %d.%d MB/s (%d ns, offset %d)\n", scsi,
+-			tp->widedone > 1 ? "WIDE " : "",
+-			mb10 / 10, mb10 % 10, tp->period / 10, sxfer & 0x1f);
+-	} else
+-		printk ("%sasynchronous.\n", tp->widedone > 1 ? "wide " : "");
++		/* Disable extended Sreq/Sack filtering */
++		if (tp->period <= 2000)
++			OUTOFFB(nc_stest2, EXT);
++	}
++ 
++	spi_display_xfer_agreement(tp->sdev->sdev_target);
+ 
+ 	/*
+ 	**	set actual value and sync_status
+@@ -4964,11 +4921,8 @@
+ 	**	Bells and whistles   ;-)
+ 	*/
+ 	if (bootverbose >= 2) {
+-		PRINT_TARGET(np, target);
+-		if (scntl3 & EWS)
+-			printk ("WIDE SCSI (16 bit) enabled.\n");
+-		else
+-			printk ("WIDE SCSI disabled.\n");
++		dev_info(&cmd->device->sdev_target->dev, "WIDE SCSI %sabled.\n",
++				(scntl3 & EWS) ? "en" : "dis");
+ 	}
+ 
+ 	/*
+@@ -5023,7 +4977,7 @@
+ 		reqtags = lp->numtags;
+ 	} else {
+ 		reqtags = 1;
+-	};
++	}
+ 
+ 	/*
+ 	**	Update max number of tags
+@@ -5063,12 +5017,13 @@
+ 	**	Announce change to user.
+ 	*/
+ 	if (bootverbose) {
+-		PRINT_LUN(np, tn, ln);
+ 		if (lp->usetags) {
+-			printk("tagged command queue depth set to %d\n", reqtags);
+-		}
+-		else {
+-			printk("tagged command queueing disabled\n");
++			dev_info(&sdev->sdev_gendev,
++				"tagged command queue depth set to %d\n",
++				reqtags);
++		} else {
++			dev_info(&sdev->sdev_gendev,
++					"tagged command queueing disabled\n");
+ 		}
+ 	}
+ }
+@@ -5274,7 +5229,7 @@
+ 		istat = INB (nc_istat);
+ 		if (DEBUG_FLAGS & DEBUG_TINY) printk ("F ");
+ 		ncr_wakeup_done (np);
+-	};
++	}
+ 
+ 	if (!(istat & (SIP|DIP)))
+ 		return;
+@@ -5335,7 +5290,7 @@
+ 		}
+ 		OUTONB_STD ();
+ 		return;
+-	};
++	}
+ 
+ 	/*========================================================
+ 	**	Now, interrupts that need some fixing up.
+@@ -5355,7 +5310,7 @@
+ 	if (sist & RST) {
+ 		ncr_init (np, 1, bootverbose ? "scsi reset" : NULL, HS_RESET);
+ 		return;
+-	};
++	}
+ 
+ 	if ((sist & STO) &&
+ 		!(dstat & (MDPE|BF|ABRT))) {
+@@ -5366,7 +5321,7 @@
+ 
+ 		ncr_int_sto (np);
+ 		return;
+-	};
++	}
+ 
+ 	/*=========================================================
+ 	**	Now, interrupts we are not able to recover cleanly.
+@@ -5387,7 +5342,7 @@
+ 			((char*)&np->regdump)[i] = INB_OFF(i);
+ 		np->regdump.nc_dstat = dstat;
+ 		np->regdump.nc_sist  = sist;
+-	};
++	}
+ 
+ 	ncr_log_hard_error(np, sist, dstat);
+ 
+@@ -5399,20 +5354,20 @@
+ 		(dstat & (MDPE|BF|ABRT|IID))) {
+ 		ncr_start_reset(np);
+ 		return;
+-	};
++	}
+ 
+ 	if (sist & HTH) {
+ 		printk ("%s: handshake timeout\n", ncr_name(np));
+ 		ncr_start_reset(np);
+ 		return;
+-	};
++	}
+ 
+ 	if (sist & UDC) {
+ 		printk ("%s: unexpected disconnect\n", ncr_name(np));
+ 		OUTB (HS_PRT, HS_UNEXPECTED);
+ 		OUTL_DSP (NCB_SCRIPT_PHYS (np, cleanup));
+ 		return;
+-	};
++	}
+ 
+ 	/*=========================================================
+ 	**	We just miss the cause of the interrupt. :(
+@@ -5456,7 +5411,7 @@
+ 	if (cp) {
+ 		cp-> host_status = HS_SEL_TIMEOUT;
+ 		ncr_complete (np, cp);
+-	};
++	}
+ 
+ 	/*
+ 	**	repair start queue and jump to start point.
+@@ -5647,7 +5602,7 @@
+ 			ss2 = INB (nc_sstat2);
+ 			if (ss2 & OLF1) rest++;
+ 			if (ss2 & ORF1) rest++;
+-		};
++		}
+ 
+ 		if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_PHASE))
+ 			printk ("P%x%x RL=%d D=%d SS0=%x ", cmd&7, sbcl&7,
+@@ -5716,7 +5671,7 @@
+ 			cp, np->header.cp,
+ 			(unsigned)dsp,
+ 			(unsigned)nxtdsp, vdsp, cmd);
+-	};
++	}
+ 
+ 	/*
+ 	**	cp=0 means that the DSA does not point to a valid control 
+@@ -5744,7 +5699,7 @@
+ 	} else {
+ 		tblp = (u32 *) 0;
+ 		olen = scr_to_cpu(vdsp[0]) & 0xffffff;
+-	};
++	}
+ 
+ 	if (DEBUG_FLAGS & DEBUG_PHASE) {
+ 		printk ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n",
+@@ -5752,16 +5707,15 @@
+ 			tblp,
+ 			(unsigned) olen,
+ 			(unsigned) oadr);
+-	};
++	}
+ 
+ 	/*
+ 	**	check cmd against assumed interrupted script command.
+ 	*/
+ 
+ 	if (cmd != (scr_to_cpu(vdsp[0]) >> 24)) {
+-		PRINT_ADDR(cp->cmd);
+-		printk ("internal error: cmd=%02x != %02x=(vdsp[0] >> 24)\n",
+-			(unsigned)cmd, (unsigned)scr_to_cpu(vdsp[0]) >> 24);
++		PRINT_ADDR(cp->cmd, "internal error: cmd=%02x != %02x=(vdsp[0] "
++				">> 24)\n", cmd, scr_to_cpu(vdsp[0]) >> 24);
+ 
+ 		goto reset_all;
+ 	}
+@@ -5783,12 +5737,11 @@
+ 	*/
+ 
+ 	if (cmd & 0x06) {
+-		PRINT_ADDR(cp->cmd);
+-		printk ("phase change %x-%x %d@%08x resid=%d.\n",
++		PRINT_ADDR(cp->cmd, "phase change %x-%x %d@%08x resid=%d.\n",
+ 			cmd&7, sbcl&7, (unsigned)olen,
+ 			(unsigned)oadr, (unsigned)rest);
+ 		goto unexpected_phase;
+-	};
++	}
+ 
+ 	/*
+ 	**	choose the correct patch area.
+@@ -5812,8 +5765,7 @@
+ 	newcmd[3] = cpu_to_scr(nxtdsp);
+ 
+ 	if (DEBUG_FLAGS & DEBUG_PHASE) {
+-		PRINT_ADDR(cp->cmd);
+-		printk ("newcmd[%d] %x %x %x %x.\n",
++		PRINT_ADDR(cp->cmd, "newcmd[%d] %x %x %x %x.\n",
+ 			(int) (newcmd - cp->patch),
+ 			(unsigned)scr_to_cpu(newcmd[0]),
+ 			(unsigned)scr_to_cpu(newcmd[1]),
+@@ -5939,9 +5891,8 @@
+ 		if (!lp)
+ 			goto out;
+ 		if (bootverbose >= 1) {
+-			PRINT_ADDR(cmd);
+-			printk ("QUEUE FULL! %d busy, %d disconnected CCBs\n",
+-				busy_cnt, disc_cnt);
++			PRINT_ADDR(cmd, "QUEUE FULL! %d busy, %d disconnected "
++					"CCBs\n", busy_cnt, disc_cnt);
+ 		}
+ 		if (disc_cnt < lp->numtags) {
+ 			lp->numtags	= disc_cnt > 2 ? disc_cnt : 2;
+@@ -5978,7 +5929,7 @@
+ 		**
+ 		**	identify message
+ 		*/
+-		cp->scsi_smsg2[0]	= M_IDENTIFY | cmd->device->lun;
++		cp->scsi_smsg2[0]	= IDENTIFY(0, cmd->device->lun);
+ 		cp->phys.smsg.addr	= cpu_to_scr(CCB_PHYS (cp, scsi_smsg2));
+ 		cp->phys.smsg.size	= cpu_to_scr(1);
+ 
+@@ -6048,34 +5999,6 @@
+ **==========================================================
+ */
+ 
+-static int ncr_show_msg (u_char * msg)
+-{
+-	u_char i;
+-	printk ("%x",*msg);
+-	if (*msg==M_EXTENDED) {
+-		for (i=1;i<8;i++) {
+-			if (i-1>msg[1]) break;
+-			printk ("-%x",msg[i]);
+-		};
+-		return (i+1);
+-	} else if ((*msg & 0xf0) == 0x20) {
+-		printk ("-%x",msg[1]);
+-		return (2);
+-	};
+-	return (1);
+-}
+-
+-static void ncr_print_msg ( struct ccb *cp, char *label, u_char *msg)
+-{
+-	if (cp)
+-		PRINT_ADDR(cp->cmd);
+-	if (label)
+-		printk("%s: ", label);
+-	
+-	(void) ncr_show_msg (msg);
+-	printk(".\n");
+-}
+-
+ void ncr_int_sir (struct ncb *np)
+ {
+ 	u_char scntl3;
+@@ -6085,7 +6008,7 @@
+ 	u_long	dsa    = INL (nc_dsa);
+ 	u_char	target = INB (nc_sdid) & 0x0f;
+ 	struct tcb *tp     = &np->target[target];
+-	struct scsi_target *starget = tp->starget;
++	struct scsi_target *starget = tp->sdev->sdev_target;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TINY) printk ("I#%d", num);
+ 
+@@ -6230,10 +6153,9 @@
+ 		*/
+ 
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("negotiation failed sir=%x status=%x.\n",
+-				num, cp->nego_status);
+-		};
++			PRINT_ADDR(cp->cmd, "negotiation failed sir=%x "
++					"status=%x.\n", num, cp->nego_status);
++		}
+ 
+ 		/*
+ 		**	any error in negotiation:
+@@ -6242,37 +6164,26 @@
+ 		switch (cp->nego_status) {
+ 
+ 		case NS_SYNC:
+-			ncr_setsync (np, cp, 0, 0xe0);
+ 			spi_period(starget) = 0;
+ 			spi_offset(starget) = 0;
++			ncr_setsync (np, cp, 0, 0xe0);
+ 			break;
+ 
+ 		case NS_WIDE:
+-			ncr_setwide (np, cp, 0, 0);
+ 			spi_width(starget) = 0;
++			ncr_setwide (np, cp, 0, 0);
+ 			break;
+ 
+-		};
++		}
+ 		np->msgin [0] = M_NOOP;
+ 		np->msgout[0] = M_NOOP;
+ 		cp->nego_status = 0;
+ 		break;
+ 
+ 	case SIR_NEGO_SYNC:
+-		/*
+-		**	Synchronous request message received.
+-		*/
+-
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("sync msgin: ");
+-			(void) ncr_show_msg (np->msgin);
+-			printk (".\n");
+-		};
+-
+-		/*
+-		**	get requested values.
+-		*/
++			ncr_print_msg(cp, "sync msgin", np->msgin);
++		}
+ 
+ 		chg = 0;
+ 		per = np->msgin[3];
+@@ -6284,8 +6195,8 @@
+ 		**	      it CAN transfer synch.
+ 		*/
+ 
+-		if (ofs && tp->starget)
+-			spi_support_sync(tp->starget) = 1;
++		if (ofs && starget)
++			spi_support_sync(starget) = 1;
+ 
+ 		/*
+ 		**	check values against driver limits.
+@@ -6318,9 +6229,8 @@
+ 		}
+ 
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("sync: per=%d scntl3=0x%x ofs=%d fak=%d chg=%d.\n",
+-				per, scntl3, ofs, fak, chg);
++			PRINT_ADDR(cp->cmd, "sync: per=%d scntl3=0x%x ofs=%d "
++				"fak=%d chg=%d.\n", per, scntl3, ofs, fak, chg);
+ 		}
+ 
+ 		if (INB (HS_PRT) == HS_NEGOTIATE) {
+@@ -6328,43 +6238,37 @@
+ 			switch (cp->nego_status) {
+ 
+ 			case NS_SYNC:
+-				/*
+-				**      This was an answer message
+-				*/
++				/* This was an answer message */
+ 				if (chg) {
+-					/*
+-					**	Answer wasn't acceptable.
+-					*/
+-					ncr_setsync (np, cp, 0, 0xe0);
++					/* Answer wasn't acceptable.  */
+ 					spi_period(starget) = 0;
+ 					spi_offset(starget) = 0;
+-					OUTL_DSP (NCB_SCRIPT_PHYS (np, msg_bad));
++					ncr_setsync(np, cp, 0, 0xe0);
++					OUTL_DSP(NCB_SCRIPT_PHYS (np, msg_bad));
+ 				} else {
+-					/*
+-					**	Answer is ok.
+-					*/
+-					ncr_setsync (np, cp, scntl3, (fak<<5)|ofs);
++					/* Answer is ok.  */
+ 					spi_period(starget) = per;
+ 					spi_offset(starget) = ofs;
+-					OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
+-				};
++					ncr_setsync(np, cp, scntl3, (fak<<5)|ofs);
++					OUTL_DSP(NCB_SCRIPT_PHYS (np, clrack));
++				}
+ 				return;
+ 
+ 			case NS_WIDE:
+-				ncr_setwide (np, cp, 0, 0);
+ 				spi_width(starget) = 0;
++				ncr_setwide(np, cp, 0, 0);
+ 				break;
+-			};
+-		};
++			}
++		}
+ 
+ 		/*
+ 		**	It was a request. Set value and
+ 		**      prepare an answer message
+ 		*/
+ 
+-		ncr_setsync (np, cp, scntl3, (fak<<5)|ofs);
+ 		spi_period(starget) = per;
+ 		spi_offset(starget) = ofs;
++		ncr_setsync(np, cp, scntl3, (fak<<5)|ofs);
+ 
+ 		np->msgout[0] = M_EXTENDED;
+ 		np->msgout[1] = 3;
+@@ -6375,10 +6279,7 @@
+ 		cp->nego_status = NS_SYNC;
+ 
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("sync msgout: ");
+-			(void) ncr_show_msg (np->msgout);
+-			printk (".\n");
++			ncr_print_msg(cp, "sync msgout", np->msgout);
+ 		}
+ 
+ 		if (!ofs) {
+@@ -6394,11 +6295,8 @@
+ 		**	Wide request message received.
+ 		*/
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("wide msgin: ");
+-			(void) ncr_show_msg (np->msgin);
+-			printk (".\n");
+-		};
++			ncr_print_msg(cp, "wide msgin", np->msgin);
++		}
+ 
+ 		/*
+ 		**	get requested values.
+@@ -6412,8 +6310,8 @@
+ 		**	      it CAN transfer wide.
+ 		*/
+ 
+-		if (wide && tp->starget)
+-			spi_support_wide(tp->starget) = 1;
++		if (wide && starget)
++			spi_support_wide(starget) = 1;
+ 
+ 		/*
+ 		**	check values against driver limits.
+@@ -6423,8 +6321,8 @@
+ 			{chg = 1; wide = tp->usrwide;}
+ 
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("wide: wide=%d chg=%d.\n", wide, chg);
++			PRINT_ADDR(cp->cmd, "wide: wide=%d chg=%d.\n", wide,
++					chg);
+ 		}
+ 
+ 		if (INB (HS_PRT) == HS_NEGOTIATE) {
+@@ -6436,37 +6334,33 @@
+ 				**      This was an answer message
+ 				*/
+ 				if (chg) {
+-					/*
+-					**	Answer wasn't acceptable.
+-					*/
+-					ncr_setwide (np, cp, 0, 1);
++					/* Answer wasn't acceptable.  */
+ 					spi_width(starget) = 0;
++					ncr_setwide(np, cp, 0, 1);
+ 					OUTL_DSP (NCB_SCRIPT_PHYS (np, msg_bad));
+ 				} else {
+-					/*
+-					**	Answer is ok.
+-					*/
+-					ncr_setwide (np, cp, wide, 1);
++					/* Answer is ok.  */
+ 					spi_width(starget) = wide;
++					ncr_setwide(np, cp, wide, 1);
+ 					OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
+-				};
++				}
+ 				return;
+ 
+ 			case NS_SYNC:
+-				ncr_setsync (np, cp, 0, 0xe0);
+ 				spi_period(starget) = 0;
+ 				spi_offset(starget) = 0;
++				ncr_setsync(np, cp, 0, 0xe0);
+ 				break;
+-			};
+-		};
++			}
++		}
+ 
+ 		/*
+ 		**	It was a request, set value and
+ 		**      prepare an answer message
+ 		*/
+ 
+-		ncr_setwide (np, cp, wide, 1);
+ 		spi_width(starget) = wide;
++		ncr_setwide(np, cp, wide, 1);
+ 
+ 		np->msgout[0] = M_EXTENDED;
+ 		np->msgout[1] = 2;
+@@ -6478,10 +6372,7 @@
+ 		cp->nego_status = NS_WIDE;
+ 
+ 		if (DEBUG_FLAGS & DEBUG_NEGO) {
+-			PRINT_ADDR(cp->cmd);
+-			printk ("wide msgout: ");
+-			(void) ncr_show_msg (np->msgin);
+-			printk (".\n");
++			ncr_print_msg(cp, "wide msgout", np->msgin);
+ 		}
+ 		break;
+ 
+@@ -6500,8 +6391,7 @@
+ 		**-----------------------------------------------
+ 		*/
+ 
+-		PRINT_ADDR(cp->cmd);
+-		printk ("M_REJECT received (%x:%x).\n",
++		PRINT_ADDR(cp->cmd, "M_REJECT received (%x:%x).\n",
+ 			(unsigned)scr_to_cpu(np->lastmsg), np->msgout[0]);
+ 		break;
+ 
+@@ -6513,10 +6403,7 @@
+ 		**-----------------------------------------------
+ 		*/
+ 
+-		PRINT_ADDR(cp->cmd);
+-		printk ("M_REJECT sent for ");
+-		(void) ncr_show_msg (np->msgin);
+-		printk (".\n");
++		ncr_print_msg(cp, "M_REJECT sent for", np->msgin);
+ 		break;
+ 
+ /*--------------------------------------------------------------------
+@@ -6535,8 +6422,8 @@
+ 		**-----------------------------------------------
+ 		*/
+ 
+-		PRINT_ADDR(cp->cmd);
+-		printk ("M_IGN_RESIDUE received, but not yet implemented.\n");
++		PRINT_ADDR(cp->cmd, "M_IGN_RESIDUE received, but not yet "
++				"implemented.\n");
+ 		break;
+ #if 0
+ 	case SIR_MISSING_SAVE:
+@@ -6548,15 +6435,14 @@
+ 		**-----------------------------------------------
+ 		*/
+ 
+-		PRINT_ADDR(cp->cmd);
+-		printk ("M_DISCONNECT received, but datapointer not saved: "
+-			"data=%x save=%x goal=%x.\n",
++		PRINT_ADDR(cp->cmd, "M_DISCONNECT received, but datapointer "
++				"not saved: data=%x save=%x goal=%x.\n",
+ 			(unsigned) INL (nc_temp),
+ 			(unsigned) scr_to_cpu(np->header.savep),
+ 			(unsigned) scr_to_cpu(np->header.goalp));
+ 		break;
+ #endif
+-	};
++	}
+ 
+ out:
+ 	OUTONB_STD ();
+@@ -6571,8 +6457,10 @@
+ **==========================================================
+ */
+ 
+-static	struct ccb *ncr_get_ccb (struct ncb *np, u_char tn, u_char ln)
++static struct ccb *ncr_get_ccb(struct ncb *np, struct scsi_cmnd *cmd)
+ {
++	u_char tn = cmd->device->id;
++	u_char ln = cmd->device->lun;
+ 	struct tcb *tp = &np->target[tn];
+ 	struct lcb *lp = tp->lp[ln];
+ 	u_char tag = NO_TAG;
+@@ -6602,8 +6490,8 @@
+ 		if (qp) {
+ 			cp = list_entry(qp, struct ccb, link_ccbq);
+ 			if (cp->magic) {
+-				PRINT_LUN(np, tn, ln);
+-				printk ("ccb free list corrupted (@%p)\n", cp);
++				PRINT_ADDR(cmd, "ccb free list corrupted "
++						"(@%p)\n", cp);
+ 				cp = NULL;
+ 			} else {
+ 				list_add_tail(qp, &lp->wait_ccbq);
+@@ -6637,7 +6525,7 @@
+ 		if (flags & SCSI_NOSLEEP) break;
+ 		if (tsleep ((caddr_t)cp, PRIBIO|PCATCH, "ncr", 0))
+ 			break;
+-	};
++	}
+ #endif
+ 
+ 	if (cp->magic)
+@@ -6665,8 +6553,7 @@
+ 	cp->lun    = ln;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TAGS) {
+-		PRINT_LUN(np, tn, ln);
+-		printk ("ccb @%p using tag %d.\n", cp, tag);
++		PRINT_ADDR(cmd, "ccb @%p using tag %d.\n", cp, tag);
+ 	}
+ 
+ 	return cp;
+@@ -6687,8 +6574,7 @@
+ 	struct lcb *lp = tp->lp[cp->lun];
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TAGS) {
+-		PRINT_LUN(np, cp->target, cp->lun);
+-		printk ("ccb @%p freeing tag %d.\n", cp, cp->tag);
++		PRINT_ADDR(cp->cmd, "ccb @%p freeing tag %d.\n", cp, cp->tag);
+ 	}
+ 
+ 	/*
+@@ -7014,17 +6900,13 @@
+ 	unsigned char tn = sdev->id, ln = sdev->lun;
+ 	struct tcb *tp = &np->target[tn];
+ 	struct lcb *lp = tp->lp[ln];
+-	struct scsi_target *starget = tp->starget;
++	struct scsi_target *starget = sdev->sdev_target;
+ 
+-	/*
+-	**	If no lcb, try to allocate it.
+-	*/
++	/* If no lcb, try to allocate it.  */
+ 	if (!lp && !(lp = ncr_alloc_lcb(np, tn, ln)))
+ 		goto fail;
+ 
+-	/*
+-	**	Prepare negotiation
+-	*/
++	/* Prepare negotiation */
+ 	if (spi_support_wide(starget) || spi_support_sync(starget))
+ 		ncr_negotiate(np, tp);
+ 
+@@ -7170,7 +7052,7 @@
+ 		printk ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n",
+ 			(unsigned) data);
+ 		return (0x10);
+-	};
++	}
+ 	return (0);
+ }
+ 
+@@ -7223,7 +7105,7 @@
+ 	if (i>=NCR_SNOOP_TIMEOUT) {
+ 		printk ("CACHE TEST FAILED: timeout.\n");
+ 		return (0x20);
+-	};
++	}
+ 	/*
+ 	**	Check termination position.
+ 	*/
+@@ -7233,7 +7115,7 @@
+ 			(u_long) NCB_SCRIPTH_PHYS (np, snooptest), (u_long) pc,
+ 			(u_long) NCB_SCRIPTH_PHYS (np, snoopend) +8);
+ 		return (0x40);
+-	};
++	}
+ 	/*
+ 	**	Show results.
+ 	*/
+@@ -7241,17 +7123,17 @@
+ 		printk ("CACHE TEST FAILED: host wrote %d, ncr read %d.\n",
+ 			(int) host_wr, (int) ncr_rd);
+ 		err |= 1;
+-	};
++	}
+ 	if (host_rd != ncr_wr) {
+ 		printk ("CACHE TEST FAILED: ncr wrote %d, host read %d.\n",
+ 			(int) ncr_wr, (int) host_rd);
+ 		err |= 2;
+-	};
++	}
+ 	if (ncr_bk != ncr_wr) {
+ 		printk ("CACHE TEST FAILED: ncr wrote %d, read back %d.\n",
+ 			(int) ncr_wr, (int) ncr_bk);
+ 		err |= 4;
+-	};
++	}
+ 	return (err);
+ }
+ 
+@@ -7424,6 +7306,16 @@
+ 
+ /*===================== LINUX ENTRY POINTS SECTION ==========================*/
+ 
++static int ncr53c8xx_slave_alloc(struct scsi_device *device)
++{
++	struct Scsi_Host *host = device->host;
++	struct ncb *np = ((struct host_data *) host->hostdata)->ncb;
++	struct tcb *tp = &np->target[device->id];
++	tp->sdev = device;
++
++	return 0;
++}
++
+ static int ncr53c8xx_slave_configure(struct scsi_device *device)
+ {
+ 	struct Scsi_Host *host = device->host;
+@@ -7432,8 +7324,6 @@
+ 	struct lcb *lp = tp->lp[device->lun];
+ 	int numtags, depth_to_use;
+ 
+-	tp->starget = device->sdev_target;
+-
+ 	ncr_setup_lcb(np, device);
+ 
+ 	/*
+@@ -7778,6 +7668,7 @@
+ 
+ 	tpnt->queuecommand	= ncr53c8xx_queue_command;
+ 	tpnt->slave_configure	= ncr53c8xx_slave_configure;
++	tpnt->slave_alloc	= ncr53c8xx_slave_alloc;
+ 	tpnt->eh_bus_reset_handler = ncr53c8xx_bus_reset;
+ 	tpnt->can_queue		= SCSI_NCR_CAN_QUEUE;
+ 	tpnt->this_id		= 7;
+@@ -7925,7 +7816,7 @@
+ 	if (ncr_snooptest(np)) {
+ 		printk(KERN_ERR "CACHE INCORRECTLY CONFIGURED.\n");
+ 		goto attach_error;
+-	};
++	}
+ 
+ 	/* Install the interrupt handler.  */
+ 	np->irq = device->slot.irq;
+@@ -8057,6 +7948,25 @@
+ 	ncr_negotiate(np, tp);
+ }
+ 
++static void ncr53c8xx_get_signalling(struct Scsi_Host *shost)
++{
++	struct ncb *np = ((struct host_data *)shost->hostdata)->ncb;
++	enum spi_signal_type type;
++
++	switch (np->scsi_mode) {
++	case SMODE_SE:
++		type = SPI_SIGNAL_SE;
++		break;
++	case SMODE_HVD:
++		type = SPI_SIGNAL_HVD;
++		break;
++	default:
++		type = SPI_SIGNAL_UNKNOWN;
++		break;
++	}
++	spi_signalling(shost) = type;
++}
++
+ static struct spi_function_template ncr53c8xx_transport_functions =  {
+ 	.set_period	= ncr53c8xx_set_period,
+ 	.show_period	= 1,
+@@ -8064,6 +7974,7 @@
+ 	.show_offset	= 1,
+ 	.set_width	= ncr53c8xx_set_width,
+ 	.show_width	= 1,
++	.get_signalling	= ncr53c8xx_get_signalling,
+ };
+ 
+ int __init ncr53c8xx_init(void)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/scsi_transport_spi.c CVS2_6_11_PA2/drivers/scsi/scsi_transport_spi.c
+--- LINUS_2_6_11/drivers/scsi/scsi_transport_spi.c	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/scsi_transport_spi.c	2005-03-06 10:11:18.000000000 -0700
+@@ -18,15 +18,11 @@
+  *  along with this program; if not, write to the Free Software
+  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  */
+-#include <linux/module.h>
++#include <linux/ctype.h>
+ #include <linux/init.h>
+-#include <linux/smp_lock.h>
+-#include <linux/list.h>
+-#include <linux/spinlock.h>
+-#include <linux/mm.h>
++#include <linux/module.h>
+ #include <linux/workqueue.h>
+-#include <asm/scatterlist.h>
+-#include <asm/io.h>
++#include <asm/semaphore.h>
+ #include <scsi/scsi.h>
+ #include "scsi_priv.h"
+ #include <scsi/scsi_device.h>
+@@ -63,27 +59,47 @@
+ 
+ #define to_spi_internal(tmpl)	container_of(tmpl, struct spi_internal, t)
+ 
+-static const char *const ppr_to_ns[] = {
++static const int ppr_to_ps[] = {
+ 	/* The PPR values 0-6 are reserved, fill them in when
+ 	 * the committee defines them */
+-	NULL,			/* 0x00 */
+-	NULL,			/* 0x01 */
+-	NULL,			/* 0x02 */
+-	NULL,			/* 0x03 */
+-	NULL,			/* 0x04 */
+-	NULL,			/* 0x05 */
+-	NULL,			/* 0x06 */
+-	"3.125",		/* 0x07 */
+-	"6.25",			/* 0x08 */
+-	"12.5",			/* 0x09 */
+-	"25",			/* 0x0a */
+-	"30.3",			/* 0x0b */
+-	"50",			/* 0x0c */
++	-1,			/* 0x00 */
++	-1,			/* 0x01 */
++	-1,			/* 0x02 */
++	-1,			/* 0x03 */
++	-1,			/* 0x04 */
++	-1,			/* 0x05 */
++	-1,			/* 0x06 */
++	 3125,			/* 0x07 */
++	 6250,			/* 0x08 */
++	12500,			/* 0x09 */
++	25000,			/* 0x0a */
++	30300,			/* 0x0b */
++	50000,			/* 0x0c */
+ };
+ /* The PPR values at which you calculate the period in ns by multiplying
+  * by 4 */
+ #define SPI_STATIC_PPR	0x0c
+ 
++static int sprint_frac(char *dest, int value, int denom)
++{
++	int frac = value % denom;
++	int result = sprintf(dest, "%d", value / denom);
++
++	if (frac == 0)
++		return result;
++	dest[result++] = '.';
++
++	do {
++		denom /= 10;
++		sprintf(dest + result, "%d", frac / denom);
++		result++;
++		frac %= denom;
++	} while (frac);
++
++	dest[result++] = '\0';
++	return result;
++}
++
+ static struct {
+ 	enum spi_signal_type	value;
+ 	char			*name;
+@@ -261,7 +277,7 @@
+ 	struct scsi_target *starget = transport_class_to_starget(cdev);
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+ 	struct spi_transport_attrs *tp;
+-	const char *str;
++	int len, picosec;
+ 	struct spi_internal *i = to_spi_internal(shost->transportt);
+ 
+ 	tp = (struct spi_transport_attrs *)&starget->starget_data;
+@@ -269,22 +285,20 @@
+ 	if (i->f->get_period)
+ 		i->f->get_period(starget);
+ 
+-	switch(tp->period) {
+-
+-	case 0x07 ... SPI_STATIC_PPR:
+-		str = ppr_to_ns[tp->period];
+-		if(!str)
+-			str = "reserved";
+-		break;
+-
+-
+-	case (SPI_STATIC_PPR+1) ... 0xff:
+-		return sprintf(buf, "%d\n", tp->period * 4);
+-
+-	default:
+-		str = "unknown";
++	if (tp->period < 0 || tp->period > 0xff) {
++		picosec = -1;
++	} else if (tp->period <= SPI_STATIC_PPR) {
++		picosec = ppr_to_ps[tp->period];
++	} else {
++		picosec = tp->period * 4000;
+ 	}
+-	return sprintf(buf, "%s\n", str);
++
++	if (picosec == -1)
++		return sprintf(buf, "reserved");
++	len = sprint_frac(buf, picosec, 1000);
++	buf[len++] = '\n';
++	buf[len] = '\0';
++	return len;
+ }
+ 
+ static ssize_t
+@@ -294,34 +308,30 @@
+ 	struct scsi_target *starget = transport_class_to_starget(cdev);
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+ 	struct spi_internal *i = to_spi_internal(shost->transportt);
+-	int j, period = -1;
++	int j, picosec, period = -1;
++	char *endp;
+ 
+-	for (j = 0; j < SPI_STATIC_PPR; j++) {
+-		int len;
+-
+-		if(ppr_to_ns[j] == NULL)
+-			continue;
+-
+-		len = strlen(ppr_to_ns[j]);
+-
+-		if(strncmp(ppr_to_ns[j], buf, len) != 0)
+-			continue;
++	picosec = simple_strtoul(buf, &endp, 10) * 1000;
++	if (*endp == '.') {
++		int mult = 100;
++		do {
++			endp++;
++			if (!isdigit(*endp))
++				break;
++			picosec += (*endp - '0') * mult;
++			mult /= 10;
++		} while (mult > 0);
++	}
+ 
+-		if(buf[len] != '\n')
++	for (j = 0; j <= SPI_STATIC_PPR; j++) {
++		if (ppr_to_ps[j] < picosec)
+ 			continue;
+-		
+ 		period = j;
+ 		break;
+ 	}
+ 
+-	if (period == -1) {
+-		int val = simple_strtoul(buf, NULL, 0);
+-
+-
+-		/* Should probably check limits here, but this
+-		 * gets reasonably close to OK for most things */
+-		period = val/4;
+-	}
++	if (period == -1)
++		period = picosec / 4000;
+ 
+ 	if (period > 0xff)
+ 		period = 0xff;
+@@ -330,7 +340,7 @@
+ 
+ 	return count;
+ }
+-	
++
+ static CLASS_DEVICE_ATTR(period, S_IRUGO | S_IWUSR, 
+ 			 show_spi_transport_period,
+ 			 store_spi_transport_period);
+@@ -795,6 +805,61 @@
+ }
+ EXPORT_SYMBOL(spi_schedule_dv_device);
+ 
++/**
++ * spi_display_xfer_agreement - Print the current target transfer agreement
++ * @starget: The target for which to display the agreement
++ *
++ * Each SPI port is required to maintain a transfer agreement for each
++ * other port on the bus.  This function prints a one-line summary of
++ * the current agreement; more detailed information is available in sysfs.
++ */
++void spi_display_xfer_agreement(struct scsi_target *starget)
++{
++	struct spi_transport_attrs *tp;
++	tp = (struct spi_transport_attrs *)&starget->starget_data;
++
++	if (tp->offset > 0 && tp->period > 0) {
++		unsigned int picosec, kb100;
++		char *scsi = "FAST-?";
++		char tmp[8];
++
++		if (tp->period <= SPI_STATIC_PPR) {
++			picosec = ppr_to_ps[tp->period];
++			switch (tp->period) {
++				case  7: scsi = "FAST-320"; break;
++				case  8: scsi = "FAST-160"; break;
++				case  9: scsi = "FAST-80"; break;
++				case 10:
++				case 11: scsi = "FAST-40"; break;
++				case 12: scsi = "FAST-20"; break;
++			}
++		} else {
++			picosec = tp->period * 4000;
++			if (tp->period < 25)
++				scsi = "FAST-20";
++			else if (tp->period < 50)
++				scsi = "FAST-10";
++			else
++				scsi = "FAST-5";
++		}
++
++		kb100 = (10000000 + picosec / 2) / picosec;
++		if (tp->width)
++			kb100 *= 2;
++		sprint_frac(tmp, picosec, 1000);
++
++		dev_info(&starget->dev,
++			"%s %sSCSI %d.%d MB/s %s%s%s (%s ns, offset %d)\n",
++			scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10,
++			tp->dt ? "DT" : "ST", tp->iu ? " IU" : "",
++			tp->qas  ? " QAS" : "", tmp, tp->offset);
++	} else {
++		dev_info(&starget->dev, "%sasynchronous.\n",
++				tp->width ? "wide " : "");
++	}
++}
++EXPORT_SYMBOL(spi_display_xfer_agreement);
++
+ #define SETUP_ATTRIBUTE(field)						\
+ 	i->private_attrs[count] = class_device_attr_##field;		\
+ 	if (!i->f->set_##field) {					\
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/Makefile CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/Makefile
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/Makefile	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/Makefile	2005-02-26 22:14:50.000000000 -0700
+@@ -1,4 +1,4 @@
+ # Makefile for the NCR/SYMBIOS/LSI 53C8XX PCI SCSI controllers driver.
+ 
+-sym53c8xx-objs := sym_fw.o sym_glue.o sym_hipd.o sym_malloc.o sym_misc.o sym_nvram.o
++sym53c8xx-objs := sym_fw.o sym_glue.o sym_hipd.o sym_malloc.o sym_nvram.o
+ obj-$(CONFIG_SCSI_SYM53C8XX_2) := sym53c8xx.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym53c8xx.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym53c8xx.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym53c8xx.h	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym53c8xx.h	2005-03-04 08:54:42.000000000 -0700
+@@ -42,10 +42,6 @@
+ 
+ #include <linux/config.h>
+ 
+-#ifdef CONFIG_SCSI_SYM53C8XX_IOMAPPED
+-#define	SYM_CONF_IOMAPPED
+-#endif
+-
+ /*
+  *  DMA addressing mode.
+  *
+@@ -144,10 +140,6 @@
+ #define SYM_SETUP_HOST_ID		sym_driver_setup.host_id
+ #define boot_verbose			sym_driver_setup.verbose
+ 
+-/* Always enable parity. */
+-#define SYM_SETUP_PCI_PARITY		1
+-#define SYM_SETUP_SCSI_PARITY		1
+-
+ /*
+  *  Initial setup.
+  *
+@@ -170,4 +162,56 @@
+ extern unsigned int sym_debug_flags;
+ #define DEBUG_FLAGS	sym_debug_flags
+ 
++/*
++ *  Max number of targets.
++ *  Maximum is 16 and you are advised not to change this value.
++ */
++#ifndef SYM_CONF_MAX_TARGET
++#define SYM_CONF_MAX_TARGET	(16)
++#endif
++
++/*
++ *  Max number of logical units.
++ *  SPI-2 allows up to 64 logical units, but in real life, target
++ *  that implements more that 7 logical units are pretty rare.
++ *  Anyway, the cost of accepting up to 64 logical unit is low in 
++ *  this driver, thus going with the maximum is acceptable.
++ */
++#ifndef SYM_CONF_MAX_LUN
++#define SYM_CONF_MAX_LUN	(64)
++#endif
++
++/*
++ *  Max number of IO control blocks queued to the controller.
++ *  Each entry needs 8 bytes and the queues are allocated contiguously.
++ *  Since we donnot want to allocate more than a page, the theorical 
++ *  maximum is PAGE_SIZE/8. For safety, we announce a bit less to the 
++ *  access method. :)
++ *  When not supplied, as it is suggested, the driver compute some 
++ *  good value for this parameter.
++ */
++/* #define SYM_CONF_MAX_START	(PAGE_SIZE/8 - 16) */
++
++/*
++ *  Support for Immediate Arbitration.
++ *  Not advised.
++ */
++/* #define SYM_CONF_IARB_SUPPORT */
++
++/*
++ *  Only relevant if IARB support configured.
++ *  - Max number of successive settings of IARB hints.
++ *  - Set IARB on arbitration lost.
++ */
++#define SYM_CONF_IARB_MAX 3
++#define SYM_CONF_SET_IARB_ON_ARB_LOST 1
++
++/*
++ *  Returning wrong residuals may make problems.
++ *  When zero, this define tells the driver to 
++ *  always return 0 as transfer residual.
++ *  Btw, all my testings of residuals have succeeded.
++ */
++#define SYM_SETUP_RESIDUAL_SUPPORT 1
++
+ #endif /* SYM53C8XX_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_conf.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_conf.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_conf.h	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_conf.h	1969-12-31 17:00:00.000000000 -0700
+@@ -1,110 +0,0 @@
+-/*
+- * Device driver for the SYMBIOS/LSILOGIC 53C8XX and 53C1010 family 
+- * of PCI-SCSI IO processors.
+- *
+- * Copyright (C) 1999-2001  Gerard Roudier <groudier at free.fr>
+- *
+- * This driver is derived from the Linux sym53c8xx driver.
+- * Copyright (C) 1998-2000  Gerard Roudier
+- *
+- * The sym53c8xx driver is derived from the ncr53c8xx driver that had been 
+- * a port of the FreeBSD ncr driver to Linux-1.2.13.
+- *
+- * The original ncr driver has been written for 386bsd and FreeBSD by
+- *         Wolfgang Stanglmeier        <wolf at cologne.de>
+- *         Stefan Esser                <se at mi.Uni-Koeln.de>
+- * Copyright (C) 1994  Wolfgang Stanglmeier
+- *
+- * Other major contributions:
+- *
+- * NVRAM detection and reading.
+- * Copyright (C) 1997 Richard Waltham <dormouse at farsrobt.demon.co.uk>
+- *
+- *-----------------------------------------------------------------------------
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#ifndef SYM_CONF_H
+-#define SYM_CONF_H
+-
+-#include "sym53c8xx.h"
+-
+-/*
+- *  Max number of targets.
+- *  Maximum is 16 and you are advised not to change this value.
+- */
+-#ifndef SYM_CONF_MAX_TARGET
+-#define SYM_CONF_MAX_TARGET	(16)
+-#endif
+-
+-/*
+- *  Max number of logical units.
+- *  SPI-2 allows up to 64 logical units, but in real life, target
+- *  that implements more that 7 logical units are pretty rare.
+- *  Anyway, the cost of accepting up to 64 logical unit is low in 
+- *  this driver, thus going with the maximum is acceptable.
+- */
+-#ifndef SYM_CONF_MAX_LUN
+-#define SYM_CONF_MAX_LUN	(64)
+-#endif
+-
+-/*
+- *  Max number of IO control blocks queued to the controller.
+- *  Each entry needs 8 bytes and the queues are allocated contiguously.
+- *  Since we donnot want to allocate more than a page, the theorical 
+- *  maximum is PAGE_SIZE/8. For safety, we announce a bit less to the 
+- *  access method. :)
+- *  When not supplied, as it is suggested, the driver compute some 
+- *  good value for this parameter.
+- */
+-/* #define SYM_CONF_MAX_START	(PAGE_SIZE/8 - 16) */
+-
+-/*
+- *  Support for Immediate Arbitration.
+- *  Not advised.
+- */
+-/* #define SYM_CONF_IARB_SUPPORT */
+-
+-/*
+- *  Only relevant if IARB support configured.
+- *  - Max number of successive settings of IARB hints.
+- *  - Set IARB on arbitration lost.
+- */
+-#define SYM_CONF_IARB_MAX 3
+-#define SYM_CONF_SET_IARB_ON_ARB_LOST 1
+-
+-/*
+- *  Returning wrong residuals may make problems.
+- *  When zero, this define tells the driver to 
+- *  always return 0 as transfer residual.
+- *  Btw, all my testings of residuals have succeeded.
+- */
+-#define SYM_SETUP_RESIDUAL_SUPPORT 1
+-
+-/*
+- *  Supported maximum number of LUNs to announce to 
+- *  the access method.
+- *  The driver supports up to 64 LUNs per target as 
+- *  required by SPI-2/SPI-3. However some SCSI devices  
+- *  designed prior to these specifications or not being  
+- *  conformant may be highly confused when they are 
+- *  asked about a LUN > 7.
+- */
+-#ifndef SYM_SETUP_MAX_LUN
+-#define SYM_SETUP_MAX_LUN	(8)
+-#endif
+-
+-#endif /* SYM_CONF_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_defs.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_defs.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_defs.h	2004-12-29 12:42:24.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_defs.h	2005-03-04 08:35:58.000000000 -0700
+@@ -40,13 +40,13 @@
+ #ifndef SYM_DEFS_H
+ #define SYM_DEFS_H
+ 
+-#define SYM_VERSION "2.1.18n"
++#define SYM_VERSION "2.2.0"
+ #define SYM_DRIVER_NAME	"sym-" SYM_VERSION
+ 
+ /*
+  *	SYM53C8XX device features descriptor.
+  */
+-struct sym_pci_chip {
++struct sym_chip {
+ 	u_short	device_id;
+ 	u_short	revision_id;
+ 	char	*name;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_fw.c CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_fw.c
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_fw.c	2004-12-02 12:51:11.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_fw.c	2005-03-04 08:35:58.000000000 -0700
+@@ -361,7 +361,7 @@
+  *  Find the most appropriate firmware for a chip.
+  */
+ struct sym_fw * 
+-sym_find_firmware(struct sym_pci_chip *chip)
++sym_find_firmware(struct sym_chip *chip)
+ {
+ 	if (chip->features & FE_LDSTR)
+ 		return &sym_fw2;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_glue.c CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_glue.c
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_glue.c	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_glue.c	2005-03-04 08:35:58.000000000 -0700
+@@ -3,7 +3,7 @@
+  * of PCI-SCSI IO processors.
+  *
+  * Copyright (C) 1999-2001  Gerard Roudier <groudier at free.fr>
+- * Copyright (c) 2003-2004  Matthew Wilcox <matthew at wil.cx>
++ * Copyright (c) 2003-2005  Matthew Wilcox <matthew at wil.cx>
+  *
+  * This driver is derived from the Linux sym53c8xx driver.
+  * Copyright (C) 1998-2000  Gerard Roudier
+@@ -47,7 +47,6 @@
+ #include <scsi/scsi_tcq.h>
+ #include <scsi/scsi_device.h>
+ #include <scsi/scsi_transport.h>
+-#include <scsi/scsi_transport_spi.h>
+ 
+ #include "sym_glue.h"
+ #include "sym_nvram.h"
+@@ -135,81 +134,47 @@
+ 	}
+ }
+ 
++/*
++ * We used to try to deal with 64-bit BARs here, but don't any more.
++ * There are many parts of this driver which would need to be modified
++ * to handle a 64-bit base address, including scripts.  I'm uncomfortable
++ * with making those changes when I have no way of testing it, so I'm
++ * just going to disable it.
++ *
++ * Note that some machines (eg HP rx8620 and Superdome) have bus addresses
++ * below 4GB and physical addresses above 4GB.  These will continue to work.
++ */
+ static int __devinit
+-pci_get_base_address(struct pci_dev *pdev, int index, u_long *base)
++pci_get_base_address(struct pci_dev *pdev, int index, unsigned long *basep)
+ {
+ 	u32 tmp;
++	unsigned long base;
+ #define PCI_BAR_OFFSET(index) (PCI_BASE_ADDRESS_0 + (index<<2))
+ 
+-	pci_read_config_dword(pdev, PCI_BAR_OFFSET(index), &tmp);
+-	*base = tmp;
+-	++index;
++	pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp);
++	base = tmp;
+ 	if ((tmp & 0x7) == PCI_BASE_ADDRESS_MEM_TYPE_64) {
+-#if BITS_PER_LONG > 32
+-		pci_read_config_dword(pdev, PCI_BAR_OFFSET(index), &tmp);
+-		*base |= (((u_long)tmp) << 32);
+-#endif
+-		++index;
++		pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp);
++		if (tmp > 0)
++			dev_err(&pdev->dev,
++				"BAR %d is 64-bit, disabling\n", index - 1);
++		base = 0;
+ 	}
++
++	if ((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
++		base &= PCI_BASE_ADDRESS_IO_MASK;
++	} else {
++		base &= PCI_BASE_ADDRESS_MEM_MASK;
++	}
++
++	*basep = base;
+ 	return index;
+ #undef PCI_BAR_OFFSET
+ }
+ 
+-/* This lock protects only the memory allocation/free.  */
+-static DEFINE_SPINLOCK(sym53c8xx_lock);
+-
+ static struct scsi_transport_template *sym2_transport_template = NULL;
+ 
+ /*
+- *  Wrappers to the generic memory allocator.
+- */
+-void *sym_calloc(int size, char *name)
+-{
+-	unsigned long flags;
+-	void *m;
+-	spin_lock_irqsave(&sym53c8xx_lock, flags);
+-	m = sym_calloc_unlocked(size, name);
+-	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+-	return m;
+-}
+-
+-void sym_mfree(void *m, int size, char *name)
+-{
+-	unsigned long flags;
+-	spin_lock_irqsave(&sym53c8xx_lock, flags);
+-	sym_mfree_unlocked(m, size, name);
+-	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+-}
+-
+-void *__sym_calloc_dma(m_pool_ident_t dev_dmat, int size, char *name)
+-{
+-	unsigned long flags;
+-	void *m;
+-	spin_lock_irqsave(&sym53c8xx_lock, flags);
+-	m = __sym_calloc_dma_unlocked(dev_dmat, size, name);
+-	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+-	return m;
+-}
+-
+-void __sym_mfree_dma(m_pool_ident_t dev_dmat, void *m, int size, char *name)
+-{
+-	unsigned long flags;
+-	spin_lock_irqsave(&sym53c8xx_lock, flags);
+-	__sym_mfree_dma_unlocked(dev_dmat, m, size, name);
+-	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+-}
+-
+-m_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m)
+-{
+-	unsigned long flags;
+-	m_addr_t b;
+-	spin_lock_irqsave(&sym53c8xx_lock, flags);
+-	b = __vtobus_unlocked(dev_dmat, m);
+-	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+-	return b;
+-}
+-
+-/*
+  *  Used by the eh thread to wait for command completion.
+  *  It is allocated on the eh thread stack.
+  */
+@@ -231,8 +196,7 @@
+ };
+ 
+ #define SYM_UCMD_PTR(cmd)  ((struct sym_ucmd *)(&(cmd)->SCp))
+-#define SYM_SCMD_PTR(ucmd) sym_que_entry(ucmd, struct scsi_cmnd, SCp)
+-#define SYM_SOFTC_PTR(cmd) (((struct host_data *)cmd->device->host->hostdata)->ncb)
++#define SYM_SOFTC_PTR(cmd) sym_get_hcb(cmd->device->host)
+ 
+ static void __unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
+ {
+@@ -288,31 +252,20 @@
+ /*
+  *  Complete a pending CAM CCB.
+  */
+-void sym_xpt_done(struct sym_hcb *np, struct scsi_cmnd *ccb)
++void sym_xpt_done(struct sym_hcb *np, struct scsi_cmnd *cmd)
+ {
+-	unmap_scsi_data(np, ccb);
+-	ccb->scsi_done(ccb);
++	unmap_scsi_data(np, cmd);
++	cmd->scsi_done(cmd);
+ }
+ 
+-static void sym_xpt_done2(struct sym_hcb *np, struct scsi_cmnd *ccb, int cam_status)
++static void sym_xpt_done2(struct sym_hcb *np, struct scsi_cmnd *cmd, int cam_status)
+ {
+-	sym_set_cam_status(ccb, cam_status);
+-	sym_xpt_done(np, ccb);
++	sym_set_cam_status(cmd, cam_status);
++	sym_xpt_done(np, cmd);
+ }
+ 
+ 
+ /*
+- *  Print something that identifies the IO.
+- */
+-void sym_print_addr(struct sym_ccb *cp)
+-{
+-	struct scsi_cmnd *cmd = cp->cam_ccb;
+-	if (cmd)
+-		printf("%s:%d:%d:", sym_name(SYM_SOFTC_PTR(cmd)),
+-				cmd->device->id, cmd->device->lun);
+-}
+-
+-/*
+  *  Tell the SCSI layer about a BUS RESET.
+  */
+ void sym_xpt_async_bus_reset(struct sym_hcb *np)
+@@ -334,16 +287,6 @@
+ }
+ 
+ /*
+- *  Tell the SCSI layer about the new transfer parameters.
+- */
+-void sym_xpt_async_nego_wide(struct sym_hcb *np, int target)
+-{
+-	if (sym_verbose < 3)
+-		return;
+-	sym_announce_transfer_rate(np, target);
+-}
+-
+-/*
+  *  Choose the more appropriate CAM status if 
+  *  the IO encountered an extended error.
+  */
+@@ -367,7 +310,7 @@
+  */
+ void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid)
+ {
+-	struct scsi_cmnd *csio = cp->cam_ccb;
++	struct scsi_cmnd *cmd = cp->cmd;
+ 	u_int cam_status, scsi_status, drv_status;
+ 
+ 	drv_status  = 0;
+@@ -378,7 +321,7 @@
+ 		scsi_status = cp->sv_scsi_status;
+ 		resid = cp->sv_resid;
+ 		if (sym_verbose && cp->sv_xerr_status)
+-			sym_print_xerr(cp, cp->sv_xerr_status);
++			sym_print_xerr(cmd, cp->sv_xerr_status);
+ 		if (cp->host_status == HS_COMPLETE &&
+ 		    cp->ssss_status == S_GOOD &&
+ 		    cp->xerr_status == 0) {
+@@ -388,9 +331,9 @@
+ 			/*
+ 			 *  Bounce back the sense data to user.
+ 			 */
+-			memset(&csio->sense_buffer, 0, sizeof(csio->sense_buffer));
+-			memcpy(csio->sense_buffer, cp->sns_bbuf,
+-			      min(sizeof(csio->sense_buffer),
++			memset(&cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
++			memcpy(cmd->sense_buffer, cp->sns_bbuf,
++			      min(sizeof(cmd->sense_buffer),
+ 				  (size_t)SYM_SNS_BBUF_LEN));
+ #if 0
+ 			/*
+@@ -400,7 +343,7 @@
+ 			 */
+ 			if (1) {
+ 				u_char *p;
+-				p  = (u_char *) csio->sense_data;
++				p  = (u_char *) cmd->sense_data;
+ 				if (p[0]==0x70 && p[2]==0x6 && p[12]==0x29)
+ 					sym_clear_tasks(np, DID_ABORT,
+ 							cp->target,cp->lun, -1);
+@@ -413,7 +356,7 @@
+ 			 * condition otherwise the device will always return
+ 			 * BUSY.  Use a big stick.
+ 			 */
+-			sym_reset_scsi_target(np, csio->device->id);
++			sym_reset_scsi_target(np, cmd->device->id);
+ 			cam_status = DID_ERROR;
+ 		}
+ 	} else if (cp->host_status == HS_COMPLETE) 	/* Bad SCSI status */
+@@ -424,8 +367,7 @@
+ 		cam_status = DID_ERROR;
+ 	else {						/* Extended error */
+ 		if (sym_verbose) {
+-			PRINT_ADDR(cp);
+-			printf ("COMMAND FAILED (%x %x %x).\n",
++			sym_print_addr(cmd, "COMMAND FAILED (%x %x %x).\n",
+ 				cp->host_status, cp->ssss_status,
+ 				cp->xerr_status);
+ 		}
+@@ -434,8 +376,8 @@
+ 		 */
+ 		cam_status = sym_xerr_cam_status(DID_ERROR, cp->xerr_status);
+ 	}
+-	csio->resid = resid;
+-	csio->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
++	cmd->resid = resid;
++	cmd->result = (drv_status << 24) + (cam_status << 16) + scsi_status;
+ }
+ 
+ 
+@@ -502,9 +444,9 @@
+ /*
+  *  Queue a SCSI command.
+  */
+-static int sym_queue_command(struct sym_hcb *np, struct scsi_cmnd *ccb)
++static int sym_queue_command(struct sym_hcb *np, struct scsi_cmnd *cmd)
+ {
+-/*	struct scsi_device        *device    = ccb->device; */
++	struct scsi_device *sdev = cmd->device;
+ 	struct sym_tcb *tp;
+ 	struct sym_lcb *lp;
+ 	struct sym_ccb *cp;
+@@ -514,17 +456,17 @@
+ 	 *  Minimal checkings, so that we will not 
+ 	 *  go outside our tables.
+ 	 */
+-	if (ccb->device->id == np->myaddr ||
+-	    ccb->device->id >= SYM_CONF_MAX_TARGET ||
+-	    ccb->device->lun >= SYM_CONF_MAX_LUN) {
+-		sym_xpt_done2(np, ccb, CAM_DEV_NOT_THERE);
++	if (sdev->id == np->myaddr ||
++	    sdev->id >= SYM_CONF_MAX_TARGET ||
++	    sdev->lun >= SYM_CONF_MAX_LUN) {
++		sym_xpt_done2(np, cmd, CAM_DEV_NOT_THERE);
+ 		return 0;
+ 	}
+ 
+ 	/*
+ 	 *  Retrieve the target descriptor.
+ 	 */
+-	tp = &np->target[ccb->device->id];
++	tp = &np->target[sdev->id];
+ 
+ 	/*
+ 	 *  Complete the 1st INQUIRY command with error 
+@@ -538,12 +480,12 @@
+ 	 *  devices behave badly when asked for some non 
+ 	 *  zero LUN. Btw, this is an absolute hack.:-)
+ 	 */
+-	if (ccb->cmnd[0] == 0x12 || ccb->cmnd[0] == 0x0) {
++	if (cmd->cmnd[0] == 0x12 || cmd->cmnd[0] == 0x0) {
+ 		if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) ||
+ 		    ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) && 
+-		     ccb->device->lun != 0)) {
++		     sdev->lun != 0)) {
+ 			tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
+-			sym_xpt_done2(np, ccb, CAM_DEV_NOT_THERE);
++			sym_xpt_done2(np, cmd, CAM_DEV_NOT_THERE);
+ 			return 0;
+ 		}
+ 	}
+@@ -551,23 +493,23 @@
+ 	/*
+ 	 *  Select tagged/untagged.
+ 	 */
+-	lp = sym_lp(np, tp, ccb->device->lun);
++	lp = sym_lp(tp, sdev->lun);
+ 	order = (lp && lp->s.reqtags) ? M_SIMPLE_TAG : 0;
+ 
+ 	/*
+ 	 *  Queue the SCSI IO.
+ 	 */
+-	cp = sym_get_ccb(np, ccb->device->id, ccb->device->lun, order);
++	cp = sym_get_ccb(np, cmd, order);
+ 	if (!cp)
+ 		return 1;	/* Means resource shortage */
+-	sym_queue_scsiio(np, ccb, cp);
++	sym_queue_scsiio(np, cmd, cp);
+ 	return 0;
+ }
+ 
+ /*
+  *  Setup buffers and pointers that address the CDB.
+  */
+-static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *ccb, struct sym_ccb *cp)
++static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
+ {
+ 	u32	cmd_ba;
+ 	int	cmd_len;
+@@ -575,14 +517,14 @@
+ 	/*
+ 	 *  CDB is 16 bytes max.
+ 	 */
+-	if (ccb->cmd_len > sizeof(cp->cdb_buf)) {
+-		sym_set_cam_status(cp->cam_ccb, CAM_REQ_INVALID);
++	if (cmd->cmd_len > sizeof(cp->cdb_buf)) {
++		sym_set_cam_status(cp->cmd, CAM_REQ_INVALID);
+ 		return -1;
+ 	}
+ 
+-	memcpy(cp->cdb_buf, ccb->cmnd, ccb->cmd_len);
++	memcpy(cp->cdb_buf, cmd->cmnd, cmd->cmd_len);
+ 	cmd_ba  = CCB_BA (cp, cdb_buf[0]);
+-	cmd_len = ccb->cmd_len;
++	cmd_len = cmd->cmd_len;
+ 
+ 	cp->phys.cmd.addr	= cpu_to_scr(cmd_ba);
+ 	cp->phys.cmd.size	= cpu_to_scr(cmd_len);
+@@ -593,29 +535,29 @@
+ /*
+  *  Setup pointers that address the data and start the I/O.
+  */
+-int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *csio, struct sym_ccb *cp)
++int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
+ {
+ 	int dir;
+ 	struct sym_tcb *tp = &np->target[cp->target];
+-	struct sym_lcb *lp = sym_lp(np, tp, cp->lun);
++	struct sym_lcb *lp = sym_lp(tp, cp->lun);
+ 
+ 	/*
+ 	 *  Build the CDB.
+ 	 */
+-	if (sym_setup_cdb(np, csio, cp))
++	if (sym_setup_cdb(np, cmd, cp))
+ 		goto out_abort;
+ 
+ 	/*
+ 	 *  No direction means no data.
+ 	 */
+-	dir = csio->sc_data_direction;
++	dir = cmd->sc_data_direction;
+ 	if (dir != DMA_NONE) {
+-		cp->segments = sym_scatter(np, cp, csio);
++		cp->segments = sym_scatter(np, cp, cmd);
+ 		if (cp->segments < 0) {
+ 			if (cp->segments == -2)
+-				sym_set_cam_status(csio, CAM_RESRC_UNAVAIL);
++				sym_set_cam_status(cmd, CAM_RESRC_UNAVAIL);
+ 			else
+-				sym_set_cam_status(csio, CAM_REQ_TOO_BIG);
++				sym_set_cam_status(cmd, CAM_REQ_TOO_BIG);
+ 			goto out_abort;
+ 		}
+ 	} else {
+@@ -655,7 +597,7 @@
+ 
+ out_abort:
+ 	sym_free_ccb(np, cp);
+-	sym_xpt_done(np, csio);
++	sym_xpt_done(np, cmd);
+ 	return 0;
+ }
+ 
+@@ -855,11 +797,8 @@
+ 	int to_do = SYM_EH_DO_IGNORE;
+ 	int sts = -1;
+ 	struct sym_eh_wait eh, *ep = &eh;
+-	char devname[20];
+-
+-	sprintf(devname, "%s:%d:%d", sym_name(np), cmd->device->id, cmd->device->lun);
+ 
+-	printf_warning("%s: %s operation started.\n", devname, opname);
++	dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname);
+ 
+ #if 0
+ 	/* This one should be the result of some race, thus to ignore */
+@@ -870,7 +809,7 @@
+ 	/* This one is queued in some place -> to wait for completion */
+ 	FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
+ 		struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
+-		if (cp->cam_ccb == cmd) {
++		if (cp->cmd == cmd) {
+ 			to_do = SYM_EH_DO_WAIT;
+ 			goto prepare;
+ 		}
+@@ -939,9 +878,9 @@
+ 		if (ep->timed_out)
+ 			sts = -2;
+ 	}
+-	printf_warning("%s: %s operation %s.\n", devname, opname,
+-			sts==0?"complete":sts==-2?"timed-out":"failed");
+-	return sts? SCSI_FAILED : SCSI_SUCCESS;
++	dev_warn(&cmd->device->sdev_gendev, "%s operation %s.\n", opname,
++			sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed");
++	return sts ? SCSI_FAILED : SCSI_SUCCESS;
+ }
+ 
+ 
+@@ -971,10 +910,9 @@
+ /*
+  *  Tune device queuing depth, according to various limits.
+  */
+-static void sym_tune_dev_queuing(struct sym_hcb *np, int target, int lun, u_short reqtags)
++static void sym_tune_dev_queuing(struct sym_tcb *tp, int lun, u_short reqtags)
+ {
+-	struct sym_tcb *tp = &np->target[target];
+-	struct sym_lcb *lp = sym_lp(np, tp, lun);
++	struct sym_lcb *lp = sym_lp(tp, lun);
+ 	u_short	oldtags;
+ 
+ 	if (!lp)
+@@ -990,9 +928,8 @@
+ 	lp->s.reqtags     = reqtags;
+ 
+ 	if (reqtags != oldtags) {
+-		printf_info("%s:%d:%d: "
++		dev_info(&tp->sdev->sdev_target->dev,
+ 		         "tagged command queuing %s, command queue depth %d.\n",
+-		          sym_name(np), target, lun,
+ 		          lp->s.reqtags ? "enabled" : "disabled",
+  		          lp->started_limit);
+ 	}
+@@ -1051,21 +988,34 @@
+ 	return DEF_DEPTH;
+ }
+ 
++static int sym53c8xx_slave_alloc(struct scsi_device *device)
++{
++	struct sym_hcb *np = sym_get_hcb(device->host);
++	struct sym_tcb *tp = &np->target[device->id];
++	if (!tp->sdev)
++		tp->sdev = device;
++
++	return 0;
++}
++
++static void sym53c8xx_slave_destroy(struct scsi_device *device)
++{
++	struct sym_hcb *np = sym_get_hcb(device->host);
++	struct sym_tcb *tp = &np->target[device->id];
++	if (tp->sdev == device)
++		tp->sdev = NULL;
++}
++
+ /*
+  * Linux entry point for device queue sizing.
+  */
+ static int sym53c8xx_slave_configure(struct scsi_device *device)
+ {
+-	struct Scsi_Host *host = device->host;
+-	struct sym_hcb *np;
+-	struct sym_tcb *tp;
++	struct sym_hcb *np = sym_get_hcb(device->host);
++	struct sym_tcb *tp = &np->target[device->id];
+ 	struct sym_lcb *lp;
+ 	int reqtags, depth_to_use;
+ 
+-	np = ((struct host_data *) host->hostdata)->ncb;
+-	tp = &np->target[device->id];
+-	tp->sdev = device;
+-
+ 	/*
+ 	 *  Allocate the LCB if not yet.
+ 	 *  If it fail, we may well be in the sh*t. :)
+@@ -1102,7 +1052,7 @@
+ 				 MSG_SIMPLE_TAG : 0),
+ 				depth_to_use);
+ 	lp->s.scdev_depth = depth_to_use;
+-	sym_tune_dev_queuing(np, device->id, device->lun, reqtags);
++	sym_tune_dev_queuing(tp, device->lun, reqtags);
+ 
+ 	if (!spi_initial_dv(device->sdev_target))
+ 		spi_dv_device(device);
+@@ -1115,7 +1065,7 @@
+  */
+ static const char *sym53c8xx_info (struct Scsi_Host *host)
+ {
+-	return sym_driver_name();
++	return SYM_DRIVER_NAME;
+ }
+ 
+ 
+@@ -1178,44 +1128,47 @@
+ 
+ 			case UC_SETSYNC:
+ 				if (!uc->data || uc->data >= 255) {
+-					tp->tinfo.goal.options = 0;
+-					tp->tinfo.goal.offset  = 0;
+-					break;
+-				}
+-				if (uc->data <= 9 && np->minsync_dt) {
++					tp->tgoal.iu = tp->tgoal.dt =
++						tp->tgoal.qas = 0;
++					tp->tgoal.offset = 0;
++				} else if (uc->data <= 9 && np->minsync_dt) {
+ 					if (uc->data < np->minsync_dt)
+ 						uc->data = np->minsync_dt;
+-					tp->tinfo.goal.options = PPR_OPT_MASK;
+-					tp->tinfo.goal.width   = 1;
+-					tp->tinfo.goal.period = uc->data;
+-					tp->tinfo.goal.offset = np->maxoffs_dt;
++					tp->tgoal.iu = tp->tgoal.dt =
++						tp->tgoal.qas = 1;
++					tp->tgoal.width = 1;
++					tp->tgoal.period = uc->data;
++					tp->tgoal.offset = np->maxoffs_dt;
+ 				} else {
+ 					if (uc->data < np->minsync)
+ 						uc->data = np->minsync;
+-					tp->tinfo.goal.options = 0;
+-					tp->tinfo.goal.period = uc->data;
+-					tp->tinfo.goal.offset = np->maxoffs;
++					tp->tgoal.iu = tp->tgoal.dt =
++						tp->tgoal.qas = 0;
++					tp->tgoal.period = uc->data;
++					tp->tgoal.offset = np->maxoffs;
+ 				}
++				tp->tgoal.check_nego = 1;
+ 				break;
+ 			case UC_SETWIDE:
+-				tp->tinfo.goal.width = uc->data ? 1 : 0;
++				tp->tgoal.width = uc->data ? 1 : 0;
++				tp->tgoal.check_nego = 1;
+ 				break;
+ 			case UC_SETTAGS:
+ 				for (l = 0; l < SYM_CONF_MAX_LUN; l++)
+-					sym_tune_dev_queuing(np, t,l, uc->data);
++					sym_tune_dev_queuing(tp, l, uc->data);
+ 				break;
+ 			case UC_RESETDEV:
+ 				tp->to_reset = 1;
+ 				np->istat_sem = SEM;
+-				OUTB (nc_istat, SIGP|SEM);
++				OUTB(np, nc_istat, SIGP|SEM);
+ 				break;
+ 			case UC_CLEARDEV:
+ 				for (l = 0; l < SYM_CONF_MAX_LUN; l++) {
+-					struct sym_lcb *lp = sym_lp(np, tp, l);
++					struct sym_lcb *lp = sym_lp(tp, l);
+ 					if (lp) lp->to_clear = 1;
+ 				}
+ 				np->istat_sem = SEM;
+-				OUTB (nc_istat, SIGP|SEM);
++				OUTB(np, nc_istat, SIGP|SEM);
+ 				break;
+ 			case UC_SETFLAG:
+ 				tp->usrflags = uc->data;
+@@ -1226,8 +1179,6 @@
+ 	}
+ }
+ 
+-#define digit_to_bin(c)	((c) - '0')
+-
+ static int skip_spaces(char *ptr, int len)
+ {
+ 	int cnt, c;
+@@ -1239,17 +1190,10 @@
+ 
+ static int get_int_arg(char *ptr, int len, u_long *pv)
+ {
+-	int	cnt, c;
+-	u_long	v;
++	char *end;
+ 
+-	for (v = 0, cnt = len; cnt > 0 && (c = *ptr++) && isdigit(c); cnt--) {
+-		v = (v * 10) + digit_to_bin(c);
+-	}
+-
+-	if (pv)
+-		*pv = v;
+-
+-	return (len - cnt);
++	*pv = simple_strtoul(ptr, &end, 10);
++	return (end - ptr);
+ }
+ 
+ static int is_keyword(char *ptr, int len, char *verb)
+@@ -1260,15 +1204,14 @@
+ 		return verb_len;
+ 	else
+ 		return 0;
+-
+ }
+ 
+-#define SKIP_SPACES(min_spaces)						\
+-	if ((arg_len = skip_spaces(ptr, len)) < (min_spaces))		\
++#define SKIP_SPACES(ptr, len)						\
++	if ((arg_len = skip_spaces(ptr, len)) < 1)			\
+ 		return -EINVAL;						\
+ 	ptr += arg_len; len -= arg_len;
+ 
+-#define GET_INT_ARG(v)							\
++#define GET_INT_ARG(ptr, len, v)					\
+ 	if (!(arg_len = get_int_arg(ptr, len, &(v))))			\
+ 		return -EINVAL;						\
+ 	ptr += arg_len; len -= arg_len;
+@@ -1327,12 +1270,12 @@
+ 	case UC_SETFLAG:
+ 	case UC_RESETDEV:
+ 	case UC_CLEARDEV:
+-		SKIP_SPACES(1);
++		SKIP_SPACES(ptr, len);
+ 		if ((arg_len = is_keyword(ptr, len, "all")) != 0) {
+ 			ptr += arg_len; len -= arg_len;
+ 			uc->target = ~0;
+ 		} else {
+-			GET_INT_ARG(target);
++			GET_INT_ARG(ptr, len, target);
+ 			uc->target = (1<<target);
+ #ifdef DEBUG_PROC_INFO
+ printk("sym_user_command: target=%ld\n", target);
+@@ -1346,8 +1289,8 @@
+ 	case UC_SETSYNC:
+ 	case UC_SETTAGS:
+ 	case UC_SETWIDE:
+-		SKIP_SPACES(1);
+-		GET_INT_ARG(uc->data);
++		SKIP_SPACES(ptr, len);
++		GET_INT_ARG(ptr, len, uc->data);
+ #ifdef DEBUG_PROC_INFO
+ printk("sym_user_command: data=%ld\n", uc->data);
+ #endif
+@@ -1355,7 +1298,7 @@
+ #ifdef SYM_LINUX_DEBUG_CONTROL_SUPPORT
+ 	case UC_SETDEBUG:
+ 		while (len > 0) {
+-			SKIP_SPACES(1);
++			SKIP_SPACES(ptr, len);
+ 			if	((arg_len = is_keyword(ptr, len, "alloc")))
+ 				uc->data |= DEBUG_ALLOC;
+ 			else if	((arg_len = is_keyword(ptr, len, "phase")))
+@@ -1389,7 +1332,7 @@
+ #endif /* SYM_LINUX_DEBUG_CONTROL_SUPPORT */
+ 	case UC_SETFLAG:
+ 		while (len > 0) {
+-			SKIP_SPACES(1);
++			SKIP_SPACES(ptr, len);
+ 			if	((arg_len = is_keyword(ptr, len, "no_disc")))
+ 				uc->data &= ~SYM_DISC_ENABLED;
+ 			else
+@@ -1499,15 +1442,9 @@
+ static int sym53c8xx_proc_info(struct Scsi_Host *host, char *buffer,
+ 			char **start, off_t offset, int length, int func)
+ {
+-	struct host_data *host_data;
+-	struct sym_hcb *np = NULL;
++	struct sym_hcb *np = sym_get_hcb(host);
+ 	int retv;
+ 
+-	host_data = (struct host_data *) host->hostdata;
+-	np = host_data->ncb;
+-	if (!np)
+-		return -EINVAL;
+-
+ 	if (func) {
+ #ifdef	SYM_LINUX_USER_COMMAND_SUPPORT
+ 		retv = sym_user_command(np, buffer, length);
+@@ -1531,19 +1468,17 @@
+ /*
+  *	Free controller resources.
+  */
+-static void sym_free_resources(struct sym_hcb *np)
++static void sym_free_resources(struct sym_hcb *np, struct pci_dev *pdev)
+ {
+ 	/*
+ 	 *  Free O/S specific resources.
+ 	 */
+ 	if (np->s.irq)
+ 		free_irq(np->s.irq, np);
+-#ifndef SYM_CONF_IOMAPPED
+-	if (np->s.mmio_va)
+-		iounmap(np->s.mmio_va);
+-#endif
+-	if (np->s.ram_va)
+-		iounmap(np->s.ram_va);
++	if (np->s.ioaddr)
++		pci_iounmap(pdev, np->s.ioaddr);
++	if (np->s.ramaddr)
++		pci_iounmap(pdev, np->s.ramaddr);
+ 	/*
+ 	 *  Free O/S independent resources.
+ 	 */
+@@ -1592,13 +1527,14 @@
+ 	struct host_data *host_data;
+ 	struct sym_hcb *np = NULL;
+ 	struct Scsi_Host *instance = NULL;
++	struct pci_dev *pdev = dev->pdev;
+ 	unsigned long flags;
+ 	struct sym_fw *fw;
+ 
+ 	printk(KERN_INFO
+ 		"sym%d: <%s> rev 0x%x at pci %s irq " IRQ_FMT "\n",
+ 		unit, dev->chip.name, dev->chip.revision_id,
+-		pci_name(dev->pdev), IRQ_PRM(dev->s.irq));
++		pci_name(pdev), IRQ_PRM(pdev->irq));
+ 
+ 	/*
+ 	 *  Get the firmware for this chip.
+@@ -1621,22 +1557,22 @@
+ 	 *  We keep track in the HCB of all the resources that 
+ 	 *  are to be released on error.
+ 	 */
+-	np = __sym_calloc_dma(dev->pdev, sizeof(*np), "HCB");
++	np = __sym_calloc_dma(&pdev->dev, sizeof(*np), "HCB");
+ 	if (!np)
+ 		goto attach_failed;
+-	np->s.device = dev->pdev;
+-	np->bus_dmat = dev->pdev; /* Result in 1 DMA pool per HBA */
++	np->s.device = pdev;
++	np->bus_dmat = &pdev->dev; /* Result in 1 DMA pool per HBA */
+ 	host_data->ncb = np;
+ 	np->s.host = instance;
+ 
+-	pci_set_drvdata(dev->pdev, np);
++	pci_set_drvdata(pdev, np);
+ 
+ 	/*
+ 	 *  Copy some useful infos to the HCB.
+ 	 */
+ 	np->hcb_ba	= vtobus(np);
+ 	np->verbose	= sym_driver_setup.verbose;
+-	np->s.device	= dev->pdev;
++	np->s.device	= pdev;
+ 	np->s.unit	= unit;
+ 	np->device_id	= dev->chip.device_id;
+ 	np->revision_id	= dev->chip.revision_id;
+@@ -1659,58 +1595,35 @@
+ 	 *  Try to map the controller chip to
+ 	 *  virtual and physical memory.
+ 	 */
+-	np->mmio_ba	= (u32)dev->s.base;
+-	np->s.io_ws	= (np->features & FE_IO256)? 256 : 128;
+-
+-#ifndef SYM_CONF_IOMAPPED
+-	np->s.mmio_va = ioremap(dev->s.base_c, np->s.io_ws);
+-	if (!np->s.mmio_va) {
+-		printf_err("%s: can't map PCI MMIO region\n", sym_name(np));
+-		goto attach_failed;
+-	} else if (sym_verbose > 1)
+-		printf_info("%s: using memory mapped IO\n", sym_name(np));
+-#endif /* !defined SYM_CONF_IOMAPPED */
+-
+-	np->s.io_port = dev->s.io_port;
++	np->mmio_ba = (u32)dev->mmio_base;
++	np->s.ioaddr	= dev->s.ioaddr;
++	np->s.ramaddr	= dev->s.ramaddr;
++	np->s.io_ws = (np->features & FE_IO256) ? 256 : 128;
+ 
+ 	/*
+ 	 *  Map on-chip RAM if present and supported.
+ 	 */
+ 	if (!(np->features & FE_RAM))
+-		dev->s.base_2 = 0;
+-	if (dev->s.base_2) {
+-		np->ram_ba = (u32)dev->s.base_2;
+-		if (np->features & FE_RAM8K)
+-			np->ram_ws = 8192;
+-		else
+-			np->ram_ws = 4096;
+-		np->s.ram_va = ioremap(dev->s.base_2_c, np->ram_ws);
+-		if (!np->s.ram_va) {
+-			printf_err("%s: can't map PCI MEMORY region\n",
+-				sym_name(np));
+-			goto attach_failed;
+-		}
++		dev->ram_base = 0;
++	if (dev->ram_base) {
++		np->ram_ba = (u32)dev->ram_base;
++		np->ram_ws = (np->features & FE_RAM8K) ? 8192 : 4096;
+ 	}
+ 
+-	/*
+-	 *  Perform O/S independent stuff.
+-	 */
+-	if (sym_hcb_attach(np, fw, dev->nvram))
++	if (sym_hcb_attach(instance, fw, dev->nvram))
+ 		goto attach_failed;
+ 
+-
+ 	/*
+ 	 *  Install the interrupt handler.
+ 	 *  If we synchonize the C code with SCRIPTS on interrupt, 
+-	 *  we donnot want to share the INTR line at all.
++	 *  we do not want to share the INTR line at all.
+ 	 */
+-	if (request_irq(dev->s.irq, sym53c8xx_intr, SA_SHIRQ,
+-			NAME53C8XX, np)) {
++	if (request_irq(pdev->irq, sym53c8xx_intr, SA_SHIRQ, NAME53C8XX, np)) {
+ 		printf_err("%s: request irq %d failure\n",
+-			sym_name(np), dev->s.irq);
++			sym_name(np), pdev->irq);
+ 		goto attach_failed;
+ 	}
+-	np->s.irq = dev->s.irq;
++	np->s.irq = pdev->irq;
+ 
+ 	/*
+ 	 *  After SCSI devices have been opened, we cannot
+@@ -1742,14 +1655,7 @@
+ 	instance->this_id	= np->myaddr;
+ 	instance->max_id	= np->maxwide ? 16 : 8;
+ 	instance->max_lun	= SYM_CONF_MAX_LUN;
+-#ifndef SYM_CONF_IOMAPPED
+-	instance->base		= (unsigned long) np->s.mmio_va;
+-#endif
+-	instance->irq		= np->s.irq;
+-	instance->unique_id	= np->s.io_port;
+-	instance->io_port	= np->s.io_port;
+-	instance->n_io_port	= np->s.io_ws;
+-	instance->dma_channel	= 0;
++	instance->unique_id	= pci_resource_start(pdev, 0);
+ 	instance->cmd_per_lun	= SYM_CONF_MAX_TAG;
+ 	instance->can_queue	= (SYM_CONF_MAX_START-2);
+ 	instance->sg_tablesize	= SYM_CONF_MAX_SG;
+@@ -1770,7 +1676,7 @@
+ 		return NULL;
+ 	printf_info("%s: giving up ...\n", sym_name(np));
+ 	if (np)
+-		sym_free_resources(np);
++		sym_free_resources(np, pdev);
+ 	scsi_host_put(instance);
+ 
+ 	return NULL;
+@@ -1787,23 +1693,7 @@
+ 	devp->device_id = devp->chip.device_id;
+ 	nvp->type = 0;
+ 
+-	/*
+-	 *  Get access to chip IO registers
+-	 */
+-#ifndef SYM_CONF_IOMAPPED
+-	devp->s.mmio_va = ioremap(devp->s.base_c, 128);
+-	if (!devp->s.mmio_va)
+-		return;
+-#endif
+-
+ 	sym_read_nvram(devp, nvp);
+-
+-	/*
+-	 *  Release access to chip IO registers
+-	 */
+-#ifndef SYM_CONF_IOMAPPED
+-	iounmap(devp->s.mmio_va);
+-#endif
+ }
+ #else
+ static inline void sym_get_nvram(struct sym_device *devp, struct sym_nvram *nvp)
+@@ -1813,15 +1703,15 @@
+ 
+ static int __devinit sym_check_supported(struct sym_device *device)
+ {
+-	struct sym_pci_chip *chip;
++	struct sym_chip *chip;
+ 	struct pci_dev *pdev = device->pdev;
+ 	u_char revision;
+-	unsigned long io_port = device->s.io_port;
+-	unsigned long base = device->s.base;
++	unsigned long io_port = pci_resource_start(pdev, 0);
+ 	int i;
+ 
+ 	/*
+ 	 *  If user excluded this chip, do not initialize it.
++	 *  I hate this code so much.  Must kill it.
+ 	 */
+ 	if (io_port) {
+ 		for (i = 0 ; i < 8 ; i++) {
+@@ -1831,32 +1721,14 @@
+ 	}
+ 
+ 	/*
+-	 *  Check if the chip has been assigned resources we need.
+-	 *  XXX: can this still happen with Linux 2.6's PCI layer?
+-	 */
+-#ifdef SYM_CONF_IOMAPPED
+-	if (!io_port) {
+-		printf_info("%s: IO base address disabled.\n",
+-			    sym_name(device));
+-		return -ENODEV;
+-	}
+-#else
+-	if (!base) {
+-		printf_info("%s: MMIO base address disabled.\n",
+-			    sym_name(device));
+-		return -ENODEV;
+-	}
+-#endif
+-
+-	/*
+ 	 * Check if the chip is supported.  Then copy the chip description
+ 	 * to our device structure so we can make it match the actual device
+ 	 * and options.
+ 	 */
+ 	pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
+-	chip = sym_lookup_pci_chip_table(pdev->device, revision);
++	chip = sym_lookup_chip_table(pdev->device, revision);
+ 	if (!chip) {
+-		printf_info("%s: device not supported\n", sym_name(device));
++		dev_info(&pdev->dev, "device not supported\n");
+ 		return -ENODEV;
+ 	}
+ 	memcpy(&device->chip, chip, sizeof(device->chip));
+@@ -1871,11 +1743,9 @@
+  */
+ static int __devinit sym_check_raid(struct sym_device *device)
+ {
+-	unsigned long base_2_c = device->s.base_2_c;
+ 	unsigned int ram_size, ram_val;
+-	void __iomem *ram_ptr;
+ 
+-	if (!base_2_c)
++	if (!device->s.ramaddr)
+ 		return 0;
+ 
+ 	if (device->chip.features & FE_RAM8K)
+@@ -1883,23 +1753,18 @@
+ 	else
+ 		ram_size = 4096;
+ 
+-	ram_ptr = ioremap(base_2_c, ram_size);
+-	if (!ram_ptr)
+-		return 0;
+-
+-	ram_val = readl(ram_ptr + ram_size - 16);
+-	iounmap(ram_ptr);
++	ram_val = readl(device->s.ramaddr + ram_size - 16);
+ 	if (ram_val != 0x52414944)
+ 		return 0;
+ 
+-	printf_info("%s: not initializing, driven by RAID controller.\n",
+-		    sym_name(device));
++	dev_info(&device->pdev->dev,
++			"not initializing, driven by RAID controller.\n");
+ 	return -ENODEV;
+ }
+ 
+ static int __devinit sym_set_workarounds(struct sym_device *device)
+ {
+-	struct sym_pci_chip *chip = &device->chip;
++	struct sym_chip *chip = &device->chip;
+ 	struct pci_dev *pdev = device->pdev;
+ 	u_short status_reg;
+ 
+@@ -1952,26 +1817,25 @@
+ static void __devinit
+ sym_init_device(struct pci_dev *pdev, struct sym_device *device)
+ {
+-	unsigned long base, base_2; 
+ 	int i;
+ 
+ 	device->host_id = SYM_SETUP_HOST_ID;
+ 	device->pdev = pdev;
+-	device->s.irq = pdev->irq;
+-
+-	/* Choose some short name for this device */
+-	sprintf(device->s.inst_name, "sym.%d.%d.%d", pdev->bus->number,
+-			PCI_SLOT(pdev->devfn), PCI_FUNC(pdev->devfn));
+-
+-	device->s.io_port = pdev->resource[0].start;
+ 
+-	device->s.base_c = pdev->resource[1].start;
+-	i = pci_get_base_address(pdev, 1, &base);
+-	device->s.base = base & PCI_BASE_ADDRESS_MEM_MASK;
++	i = pci_get_base_address(pdev, 1, &device->mmio_base);
++	pci_get_base_address(pdev, i, &device->ram_base);
+ 
+-	device->s.base_2_c = pdev->resource[i].start;
+-	pci_get_base_address(pdev, i, &base_2);
+-	device->s.base_2 = base_2 & PCI_BASE_ADDRESS_MEM_MASK;
++#ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED
++	if (device->mmio_base)
++		device->s.ioaddr = pci_iomap(pdev, 1,
++						pci_resource_len(pdev, 1));
++#endif
++	if (!device->s.ioaddr)
++		device->s.ioaddr = pci_iomap(pdev, 0,
++						pci_resource_len(pdev, 0));
++	if (device->ram_base)
++		device->s.ramaddr = pci_iomap(pdev, i,
++						pci_resource_len(pdev, i));
+ }
+ 
+ /*
+@@ -2027,7 +1891,7 @@
+  *  Detach the host.
+  *  We have to free resources and halt the NCR chip.
+  */
+-static int sym_detach(struct sym_hcb *np)
++static int sym_detach(struct sym_hcb *np, struct pci_dev *pdev)
+ {
+ 	printk("%s: detaching ...\n", sym_name(np));
+ 
+@@ -2039,11 +1903,11 @@
+ 	 * so, since we may not be safe if interrupts occur.
+ 	 */
+ 	printk("%s: resetting chip\n", sym_name(np));
+-	OUTB (nc_istat, SRST);
+-	UDELAY (10);
+-	OUTB (nc_istat, 0);
++	OUTB(np, nc_istat, SRST);
++	udelay(10);
++	OUTB(np, nc_istat, 0);
+ 
+-	sym_free_resources(np);
++	sym_free_resources(np, pdev);
+ 
+ 	return 1;
+ }
+@@ -2056,7 +1920,9 @@
+ 	.name			= "sym53c8xx",
+ 	.info			= sym53c8xx_info, 
+ 	.queuecommand		= sym53c8xx_queue_command,
++	.slave_alloc		= sym53c8xx_slave_alloc,
+ 	.slave_configure	= sym53c8xx_slave_configure,
++	.slave_destroy		= sym53c8xx_slave_destroy,
+ 	.eh_abort_handler	= sym53c8xx_eh_abort_handler,
+ 	.eh_device_reset_handler = sym53c8xx_eh_device_reset_handler,
+ 	.eh_bus_reset_handler	= sym53c8xx_eh_bus_reset_handler,
+@@ -2116,7 +1982,7 @@
+ 	return 0;
+ 
+  detach:
+-	sym_detach(pci_get_drvdata(pdev));
++	sym_detach(pci_get_drvdata(pdev), pdev);
+  free:
+ 	pci_release_regions(pdev);
+  disable:
+@@ -2133,7 +1999,7 @@
+ 	scsi_remove_host(host);
+ 	scsi_host_put(host);
+ 
+-	sym_detach(np);
++	sym_detach(np, pdev);
+ 
+ 	pci_release_regions(pdev);
+ 	pci_disable_device(pdev);
+@@ -2143,12 +2009,12 @@
+ 
+ static void sym2_get_signalling(struct Scsi_Host *shost)
+ {
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	enum spi_signal_type type;
+ 
+ 	switch (np->scsi_mode) {
+ 	case SMODE_SE:
+-		type =  SPI_SIGNAL_SE;
++		type = SPI_SIGNAL_SE;
+ 		break;
+ 	case SMODE_LVD:
+ 		type = SPI_SIGNAL_LVD;
+@@ -2163,152 +2029,97 @@
+ 	spi_signalling(shost) = type;
+ }
+ 
+-static void sym2_get_offset(struct scsi_target *starget)
+-{
+-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
+-	struct sym_tcb *tp = &np->target[starget->id];
+-
+-	spi_offset(starget) = tp->tinfo.curr.offset;
+-}
+-
+ static void sym2_set_offset(struct scsi_target *starget, int offset)
+ {
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
+-	struct sym_tcb *tp = &np->target[starget->id];
+-
+-	tp->tinfo.goal.offset = offset;
+-}
+-
+-
+-static void sym2_get_period(struct scsi_target *starget)
+-{
+-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	struct sym_tcb *tp = &np->target[starget->id];
+ 
+-	spi_period(starget) = tp->tinfo.curr.period;
++	tp->tgoal.offset = offset;
++	tp->tgoal.check_nego = 1;
+ }
+ 
+ static void sym2_set_period(struct scsi_target *starget, int period)
+ {
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	struct sym_tcb *tp = &np->target[starget->id];
+ 
+ 	/* have to have DT for these transfers */
+ 	if (period <= np->minsync)
+-		tp->tinfo.goal.options |= PPR_OPT_DT;
++		tp->tgoal.dt = 1;
+ 
+-	tp->tinfo.goal.period = period;
+-}
+-
+-static void sym2_get_width(struct scsi_target *starget)
+-{
+-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
+-	struct sym_tcb *tp = &np->target[starget->id];
+-
+-	spi_width(starget) = tp->tinfo.curr.width ? 1 : 0;
++	tp->tgoal.period = period;
++	tp->tgoal.check_nego = 1;
+ }
+ 
+ static void sym2_set_width(struct scsi_target *starget, int width)
+ {
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	struct sym_tcb *tp = &np->target[starget->id];
+ 
+ 	/* It is illegal to have DT set on narrow transfers.  If DT is
+ 	 * clear, we must also clear IU and QAS.  */
+ 	if (width == 0)
+-		tp->tinfo.goal.options &= ~PPR_OPT_MASK;
++		tp->tgoal.iu = tp->tgoal.dt = tp->tgoal.qas = 0;
+ 
+-	tp->tinfo.goal.width = width;
+-}
+-
+-static void sym2_get_dt(struct scsi_target *starget)
+-{
+-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
+-	struct sym_tcb *tp = &np->target[starget->id];
+-
+-	spi_dt(starget) = (tp->tinfo.curr.options & PPR_OPT_DT) ? 1 : 0;
++	tp->tgoal.width = width;
++	tp->tgoal.check_nego = 1;
+ }
+ 
+ static void sym2_set_dt(struct scsi_target *starget, int dt)
+ {
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	struct sym_tcb *tp = &np->target[starget->id];
+ 
+ 	/* We must clear QAS and IU if DT is clear */
+ 	if (dt)
+-		tp->tinfo.goal.options |= PPR_OPT_DT;
++		tp->tgoal.dt = 1;
+ 	else
+-		tp->tinfo.goal.options &= ~PPR_OPT_MASK;
+-}
+-
+-static void sym2_get_iu(struct scsi_target *starget)
+-{
+-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
+-	struct sym_tcb *tp = &np->target[starget->id];
+-
+-	spi_iu(starget) = (tp->tinfo.curr.options & PPR_OPT_IU) ? 1 : 0;
++		tp->tgoal.iu = tp->tgoal.dt = tp->tgoal.qas = 0;
++	tp->tgoal.check_nego = 1;
+ }
+ 
+ static void sym2_set_iu(struct scsi_target *starget, int iu)
+ {
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	struct sym_tcb *tp = &np->target[starget->id];
+ 
+ 	if (iu)
+-		tp->tinfo.goal.options |= PPR_OPT_IU | PPR_OPT_DT;
++		tp->tgoal.iu = tp->tgoal.dt = 1;
+ 	else
+-		tp->tinfo.goal.options &= ~PPR_OPT_IU;
+-}
+-
+-static void sym2_get_qas(struct scsi_target *starget)
+-{
+-	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
+-	struct sym_tcb *tp = &np->target[starget->id];
+-
+-	spi_qas(starget) = (tp->tinfo.curr.options & PPR_OPT_QAS) ? 1 : 0;
++		tp->tgoal.iu = 0;
++	tp->tgoal.check_nego = 1;
+ }
+ 
+ static void sym2_set_qas(struct scsi_target *starget, int qas)
+ {
+ 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
+-	struct sym_hcb *np = ((struct host_data *)shost->hostdata)->ncb;
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	struct sym_tcb *tp = &np->target[starget->id];
+ 
+ 	if (qas)
+-		tp->tinfo.goal.options |= PPR_OPT_QAS | PPR_OPT_DT;
++		tp->tgoal.dt = tp->tgoal.qas = 1;
+ 	else
+-		tp->tinfo.goal.options &= ~PPR_OPT_QAS;
++		tp->tgoal.qas = 0;
++	tp->tgoal.check_nego = 1;
+ }
+ 
+ 
+ static struct spi_function_template sym2_transport_functions = {
+ 	.set_offset	= sym2_set_offset,
+-	.get_offset	= sym2_get_offset,
+ 	.show_offset	= 1,
+ 	.set_period	= sym2_set_period,
+-	.get_period	= sym2_get_period,
+ 	.show_period	= 1,
+ 	.set_width	= sym2_set_width,
+-	.get_width	= sym2_get_width,
+ 	.show_width	= 1,
+-	.get_dt		= sym2_get_dt,
+ 	.set_dt		= sym2_set_dt,
+ 	.show_dt	= 1,
+-	.get_iu		= sym2_get_iu,
+ 	.set_iu		= sym2_set_iu,
+ 	.show_iu	= 1,
+-	.get_qas	= sym2_get_qas,
+ 	.set_qas	= sym2_set_qas,
+ 	.show_qas	= 1,
+ 	.get_signalling	= sym2_get_signalling,
+@@ -2370,7 +2181,7 @@
+ 	if (!sym2_transport_template)
+ 		return -ENODEV;
+ 
+-	error = pci_module_init(&sym2_driver);
++	error = pci_register_driver(&sym2_driver);
+ 	if (error)
+ 		spi_release_transport(sym2_transport_template);
+ 	return error;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_glue.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_glue.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_glue.h	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_glue.h	2005-03-04 08:35:58.000000000 -0700
+@@ -56,9 +56,10 @@
+ #include <scsi/scsi.h>
+ #include <scsi/scsi_cmnd.h>
+ #include <scsi/scsi_device.h>
++#include <scsi/scsi_transport_spi.h>
+ #include <scsi/scsi_host.h>
+ 
+-#include "sym_conf.h"
++#include "sym53c8xx.h"
+ #include "sym_defs.h"
+ #include "sym_misc.h"
+ 
+@@ -70,7 +71,6 @@
+ #define SYM_OPT_HANDLE_DIR_UNKNOWN
+ #define SYM_OPT_HANDLE_DEVICE_QUEUEING
+ #define SYM_OPT_LIMIT_COMMAND_REORDERING
+-#define	SYM_OPT_ANNOUNCE_TRANSFER_RATE
+ 
+ /*
+  *  Print a message with severity.
+@@ -86,11 +86,6 @@
+ #define	printf(args...)		printk(args)
+ 
+ /*
+- *  Insert a delay in micro-seconds
+- */
+-#define sym_udelay(us)	udelay(us)
+-
+-/*
+  *  A 'read barrier' flushes any data that have been prefetched 
+  *  by the processor due to out of order execution. Such a barrier 
+  *  must notably be inserted prior to looking at data that have 
+@@ -111,23 +106,12 @@
+ #define MEMORY_WRITE_BARRIER()	wmb()
+ 
+ /*
+- *  Let the compiler know about driver data structure names.
+- */
+-typedef struct sym_tcb *tcb_p;
+-typedef struct sym_lcb *lcb_p;
+-typedef struct sym_ccb *ccb_p;
+-
+-/*
+  *  IO functions definition for big/little endian CPU support.
+  *  For now, PCI chips are only supported in little endian addressing mode, 
+  */
+ 
+ #ifdef	__BIG_ENDIAN
+ 
+-#define	inw_l2b		inw
+-#define	inl_l2b		inl
+-#define	outw_b2l	outw
+-#define	outl_b2l	outl
+ #define	readw_l2b	readw
+ #define	readl_l2b	readl
+ #define	writew_b2l	writew
+@@ -135,11 +119,6 @@
+ 
+ #else	/* little endian */
+ 
+-#define	inw_raw		inw
+-#define	inl_raw		inl
+-#define	outw_raw	outw
+-#define	outl_raw	outl
+-
+ #define	readw_raw	readw
+ #define	readl_raw	readl
+ #define	writew_raw	writew
+@@ -151,27 +130,6 @@
+ #error	"Chips in BIG ENDIAN addressing mode are not (yet) supported"
+ #endif
+ 
+-
+-/*
+- *  If the chip uses big endian addressing mode over the 
+- *  PCI, actual io register addresses for byte and word 
+- *  accesses must be changed according to lane routing.
+- *  Btw, sym_offb() and sym_offw() macros only apply to 
+- *  constants and so donnot generate bloated code.
+- */
+-
+-#if	defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+-#define sym_offb(o)	(((o)&~3)+((~((o)&3))&3))
+-#define sym_offw(o)	(((o)&~3)+((~((o)&3))&2))
+-
+-#else
+-
+-#define sym_offb(o)	(o)
+-#define sym_offw(o)	(o)
+-
+-#endif
+-
+ /*
+  *  If the CPU and the chip use same endian-ness addressing,
+  *  no byte reordering is needed for script patching.
+@@ -180,117 +138,9 @@
+  *  from the script.
+  */
+ 
+-#if	defined(__BIG_ENDIAN) && !defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+ #define cpu_to_scr(dw)	cpu_to_le32(dw)
+ #define scr_to_cpu(dw)	le32_to_cpu(dw)
+ 
+-#elif	defined(__LITTLE_ENDIAN) && defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+-#define cpu_to_scr(dw)	cpu_to_be32(dw)
+-#define scr_to_cpu(dw)	be32_to_cpu(dw)
+-
+-#else
+-
+-#define cpu_to_scr(dw)	(dw)
+-#define scr_to_cpu(dw)	(dw)
+-
+-#endif
+-
+-/*
+- *  Access to the controller chip.
+- *
+- *  If SYM_CONF_IOMAPPED is defined, the driver will use 
+- *  normal IOs instead of the MEMORY MAPPED IO method  
+- *  recommended by PCI specifications.
+- *  If all PCI bridges, host brigdes and architectures 
+- *  would have been correctly designed for PCI, this 
+- *  option would be useless.
+- *
+- *  If the CPU and the chip use same endian-ness addressing,
+- *  no byte reordering is needed for accessing chip io 
+- *  registers. Functions suffixed by '_raw' are assumed 
+- *  to access the chip over the PCI without doing byte 
+- *  reordering. Functions suffixed by '_l2b' are 
+- *  assumed to perform little-endian to big-endian byte 
+- *  reordering, those suffixed by '_b2l' blah, blah,
+- *  blah, ...
+- */
+-
+-#if defined(SYM_CONF_IOMAPPED)
+-
+-/*
+- *  IO mapped only input / ouput
+- */
+-
+-#define	INB_OFF(o)        inb (np->s.io_port + sym_offb(o))
+-#define	OUTB_OFF(o, val)  outb ((val), np->s.io_port + sym_offb(o))
+-
+-#if	defined(__BIG_ENDIAN) && !defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+-#define	INW_OFF(o)        inw_l2b (np->s.io_port + sym_offw(o))
+-#define	INL_OFF(o)        inl_l2b (np->s.io_port + (o))
+-
+-#define	OUTW_OFF(o, val)  outw_b2l ((val), np->s.io_port + sym_offw(o))
+-#define	OUTL_OFF(o, val)  outl_b2l ((val), np->s.io_port + (o))
+-
+-#elif	defined(__LITTLE_ENDIAN) && defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+-#define	INW_OFF(o)        inw_b2l (np->s.io_port + sym_offw(o))
+-#define	INL_OFF(o)        inl_b2l (np->s.io_port + (o))
+-
+-#define	OUTW_OFF(o, val)  outw_l2b ((val), np->s.io_port + sym_offw(o))
+-#define	OUTL_OFF(o, val)  outl_l2b ((val), np->s.io_port + (o))
+-
+-#else
+-
+-#define	INW_OFF(o)        inw_raw (np->s.io_port + sym_offw(o))
+-#define	INL_OFF(o)        inl_raw (np->s.io_port + (o))
+-
+-#define	OUTW_OFF(o, val)  outw_raw ((val), np->s.io_port + sym_offw(o))
+-#define	OUTL_OFF(o, val)  outl_raw ((val), np->s.io_port + (o))
+-
+-#endif	/* ENDIANs */
+-
+-#else	/* defined SYM_CONF_IOMAPPED */
+-
+-/*
+- *  MEMORY mapped IO input / output
+- */
+-
+-#define INB_OFF(o)        readb(np->s.mmio_va + sym_offb(o))
+-#define OUTB_OFF(o, val)  writeb((val), np->s.mmio_va + sym_offb(o))
+-
+-#if	defined(__BIG_ENDIAN) && !defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+-#define INW_OFF(o)        readw_l2b(np->s.mmio_va + sym_offw(o))
+-#define INL_OFF(o)        readl_l2b(np->s.mmio_va + (o))
+-
+-#define OUTW_OFF(o, val)  writew_b2l((val), np->s.mmio_va + sym_offw(o))
+-#define OUTL_OFF(o, val)  writel_b2l((val), np->s.mmio_va + (o))
+-
+-#elif	defined(__LITTLE_ENDIAN) && defined(SYM_CONF_CHIP_BIG_ENDIAN)
+-
+-#define INW_OFF(o)        readw_b2l(np->s.mmio_va + sym_offw(o))
+-#define INL_OFF(o)        readl_b2l(np->s.mmio_va + (o))
+-
+-#define OUTW_OFF(o, val)  writew_l2b((val), np->s.mmio_va + sym_offw(o))
+-#define OUTL_OFF(o, val)  writel_l2b((val), np->s.mmio_va + (o))
+-
+-#else
+-
+-#define INW_OFF(o)        readw_raw(np->s.mmio_va + sym_offw(o))
+-#define INL_OFF(o)        readl_raw(np->s.mmio_va + (o))
+-
+-#define OUTW_OFF(o, val)  writew_raw((val), np->s.mmio_va + sym_offw(o))
+-#define OUTL_OFF(o, val)  writel_raw((val), np->s.mmio_va + (o))
+-
+-#endif
+-
+-#endif	/* defined SYM_CONF_IOMAPPED */
+-
+-#define OUTRAM_OFF(o, a, l) memcpy_toio(np->s.ram_va + (o), (a), (l))
+-
+ /*
+  *  Remap some status field values.
+  */
+@@ -360,9 +210,8 @@
+ 
+ 	struct Scsi_Host *host;
+ 
+-	void __iomem *	mmio_va;	/* MMIO kernel virtual address	*/
+-	void __iomem *	ram_va;		/* RAM  kernel virtual address	*/
+-	u_long		io_port;	/* IO port address cookie	*/
++	void __iomem *	ioaddr;		/* MMIO kernel io address	*/
++	void __iomem *	ramaddr;	/* RAM  kernel io address	*/
+ 	u_short		io_ws;		/* IO window size		*/
+ 	int		irq;		/* IRQ number			*/
+ 
+@@ -377,29 +226,20 @@
+  */
+ #define sym_name(np) (np)->s.inst_name
+ 
+-/*
+- *  Data structure used as input for the NVRAM reading.
+- *  Must resolve the IO macros and sym_name(), when  
+- *  used as sub-field 's' of another structure.
+- */
+-struct sym_slot {
+-	u_long	base;
+-	u_long	base_2;
+-	u_long	base_c;
+-	u_long	base_2_c;
+-	int	irq;
+-/* port and address fields to fit INB, OUTB macros */
+-	u_long	io_port;
+-	void __iomem *	mmio_va;
+-	char	inst_name[16];
+-};
+-
+ struct sym_nvram;
+ 
++/*
++ * The IO macros require a struct called 's' and are abused in sym_nvram.c
++ */
+ struct sym_device {
+ 	struct pci_dev *pdev;
+-	struct sym_slot  s;
+-	struct sym_pci_chip chip;
++	unsigned long mmio_base;
++	unsigned long ram_base;
++	struct {
++		void __iomem *ioaddr;
++		void __iomem *ramaddr;
++	} s;
++	struct sym_chip chip;
+ 	struct sym_nvram *nvram;
+ 	u_short device_id;
+ 	u_char host_id;
+@@ -412,133 +252,48 @@
+ 	struct sym_hcb *ncb;
+ };
+ 
+-/*
+- *  The driver definitions (sym_hipd.h) must know about a 
+- *  couple of things related to the memory allocator.
+- */
+-typedef u_long m_addr_t;	/* Enough bits to represent any address */
+-#define SYM_MEM_PAGE_ORDER 0	/* 1 PAGE  maximum */
+-#define SYM_MEM_CLUSTER_SHIFT	(PAGE_SHIFT+SYM_MEM_PAGE_ORDER)
+-#ifdef	MODULE
+-#define SYM_MEM_FREE_UNUSED	/* Free unused pages immediately */
+-#endif
+-typedef struct pci_dev *m_pool_ident_t;
+-
+-/*
+- *  Include driver soft definitions.
+- */
+-#include "sym_fw.h"
+-#include "sym_hipd.h"
+-
+-/*
+- *  Memory allocator related stuff.
+- */
+-
+-#define SYM_MEM_GFP_FLAGS	GFP_ATOMIC
+-#define SYM_MEM_WARN	1	/* Warn on failed operations */
+-
+-#define sym_get_mem_cluster()	\
+-	__get_free_pages(SYM_MEM_GFP_FLAGS, SYM_MEM_PAGE_ORDER)
+-#define sym_free_mem_cluster(p)	\
+-	free_pages(p, SYM_MEM_PAGE_ORDER)
+-
+-void *sym_calloc(int size, char *name);
+-void sym_mfree(void *m, int size, char *name);
+-
+-/*
+- *  We have to provide the driver memory allocator with methods for 
+- *  it to maintain virtual to bus physical address translations.
+- */
+-
+-#define sym_m_pool_match(mp_id1, mp_id2)	(mp_id1 == mp_id2)
+-
+-static __inline m_addr_t sym_m_get_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
++static inline struct sym_hcb * sym_get_hcb(struct Scsi_Host *host)
+ {
+-	void *vaddr = NULL;
+-	dma_addr_t baddr = 0;
+-
+-	vaddr = pci_alloc_consistent(mp->dev_dmat,SYM_MEM_CLUSTER_SIZE, &baddr);
+-	if (vaddr) {
+-		vbp->vaddr = (m_addr_t) vaddr;
+-		vbp->baddr = (m_addr_t) baddr;
+-	}
+-	return (m_addr_t) vaddr;
++	return ((struct host_data *)host->hostdata)->ncb;
+ }
+ 
+-static __inline void sym_m_free_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
+-{
+-	pci_free_consistent(mp->dev_dmat, SYM_MEM_CLUSTER_SIZE,
+-	                    (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
+-}
+-
+-#define sym_m_create_dma_mem_tag(mp)	(0)
+-#define sym_m_delete_dma_mem_tag(mp)	do { ; } while (0)
+-
+-void *__sym_calloc_dma(m_pool_ident_t dev_dmat, int size, char *name);
+-void __sym_mfree_dma(m_pool_ident_t dev_dmat, void *m, int size, char *name);
+-m_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m);
++#include "sym_fw.h"
++#include "sym_hipd.h"
+ 
+ /*
+  *  Set the status field of a CAM CCB.
+  */
+ static __inline void 
+-sym_set_cam_status(struct scsi_cmnd *ccb, int status)
++sym_set_cam_status(struct scsi_cmnd *cmd, int status)
+ {
+-	ccb->result &= ~(0xff  << 16);
+-	ccb->result |= (status << 16);
++	cmd->result &= ~(0xff  << 16);
++	cmd->result |= (status << 16);
+ }
+ 
+ /*
+  *  Get the status field of a CAM CCB.
+  */
+ static __inline int 
+-sym_get_cam_status(struct scsi_cmnd *ccb)
++sym_get_cam_status(struct scsi_cmnd *cmd)
+ {
+-	return ((ccb->result >> 16) & 0xff);
++	return host_byte(cmd->result);
+ }
+ 
+ /*
+- *  The dma mapping is mostly handled by the 
+- *  SCSI layer and the driver glue under Linux.
+- */
+-#define sym_data_dmamap_create(np, cp)		(0)
+-#define sym_data_dmamap_destroy(np, cp)		do { ; } while (0)
+-#define sym_data_dmamap_unload(np, cp)		do { ; } while (0)
+-#define sym_data_dmamap_presync(np, cp)		do { ; } while (0)
+-#define sym_data_dmamap_postsync(np, cp)	do { ; } while (0)
+-
+-/*
+- *  Async handler for negotiations.
+- */
+-void sym_xpt_async_nego_wide(struct sym_hcb *np, int target);
+-#define sym_xpt_async_nego_sync(np, target)	\
+-	sym_announce_transfer_rate(np, target)
+-#define sym_xpt_async_nego_ppr(np, target)	\
+-	sym_announce_transfer_rate(np, target)
+-
+-/*
+  *  Build CAM result for a successful IO and for a failed IO.
+  */
+-static __inline void sym_set_cam_result_ok(struct sym_hcb *np, ccb_p cp, int resid)
++static __inline void sym_set_cam_result_ok(struct sym_ccb *cp, struct scsi_cmnd *cmd, int resid)
+ {
+-	struct scsi_cmnd *cmd = cp->cam_ccb;
+-
+ 	cmd->resid = resid;
+ 	cmd->result = (((DID_OK) << 16) + ((cp->ssss_status) & 0x7f));
+ }
+-void sym_set_cam_result_error(struct sym_hcb *np, ccb_p cp, int resid);
++void sym_set_cam_result_error(struct sym_hcb *np, struct sym_ccb *cp, int resid);
+ 
+-/*
+- *  Other O/S specific methods.
+- */
+-#define sym_cam_target_id(ccb)	(ccb)->target
+-#define sym_cam_target_lun(ccb)	(ccb)->lun
+-#define	sym_freeze_cam_ccb(ccb)	do { ; } while (0)
+ void sym_xpt_done(struct sym_hcb *np, struct scsi_cmnd *ccb);
+-void sym_print_addr (ccb_p cp);
++#define sym_print_addr(cmd, arg...) dev_info(&cmd->device->sdev_gendev , ## arg)
+ void sym_xpt_async_bus_reset(struct sym_hcb *np);
+ void sym_xpt_async_sent_bdr(struct sym_hcb *np, int target);
+-int  sym_setup_data_and_start (struct sym_hcb *np, struct scsi_cmnd *csio, ccb_p cp);
++int  sym_setup_data_and_start (struct sym_hcb *np, struct scsi_cmnd *csio, struct sym_ccb *cp);
+ void sym_log_bus_error(struct sym_hcb *np);
+ void sym_sniff_inquiry(struct sym_hcb *np, struct scsi_cmnd *cmd, int resid);
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_hipd.c CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_hipd.c
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_hipd.c	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_hipd.c	2005-03-04 10:02:40.000000000 -0700
+@@ -3,7 +3,7 @@
+  * of PCI-SCSI IO processors.
+  *
+  * Copyright (C) 1999-2001  Gerard Roudier <groudier at free.fr>
+- * Copyright (c) 2003-2004  Matthew Wilcox <matthew at wil.cx>
++ * Copyright (c) 2003-2005  Matthew Wilcox <matthew at wil.cx>
+  *
+  * This driver is derived from the Linux sym53c8xx driver.
+  * Copyright (C) 1998-2000  Gerard Roudier
+@@ -49,54 +49,24 @@
+  */
+ static void sym_int_ma (struct sym_hcb *np);
+ static void sym_int_sir (struct sym_hcb *np);
+-static ccb_p sym_alloc_ccb(struct sym_hcb *np);
+-static ccb_p sym_ccb_from_dsa(struct sym_hcb *np, u32 dsa);
++static struct sym_ccb *sym_alloc_ccb(struct sym_hcb *np);
++static struct sym_ccb *sym_ccb_from_dsa(struct sym_hcb *np, u32 dsa);
+ static void sym_alloc_lcb_tags (struct sym_hcb *np, u_char tn, u_char ln);
+-static void sym_complete_error (struct sym_hcb *np, ccb_p cp);
+-static void sym_complete_ok (struct sym_hcb *np, ccb_p cp);
+-static int sym_compute_residual(struct sym_hcb *np, ccb_p cp);
++static void sym_complete_error (struct sym_hcb *np, struct sym_ccb *cp);
++static void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp);
++static int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp);
+ 
+ /*
+- *  Returns the name of this driver.
++ *  Print a buffer in hexadecimal format with a ".\n" at end.
+  */
+-char *sym_driver_name(void)
+-{
+-	return SYM_DRIVER_NAME;
+-}
+-/*
+- *  Print a buffer in hexadecimal format.
+- */
+-static void sym_printb_hex (u_char *p, int n)
++static void sym_printl_hex(u_char *p, int n)
+ {
+ 	while (n-- > 0)
+ 		printf (" %x", *p++);
+-}
+-
+-/*
+- *  Same with a label at beginning and .\n at end.
+- */
+-static void sym_printl_hex (char *label, u_char *p, int n)
+-{
+-	printf ("%s", label);
+-	sym_printb_hex (p, n);
+ 	printf (".\n");
+ }
+ 
+ /*
+- *  Print something which allows to retrieve the controler type, 
+- *  unit, target, lun concerned by a kernel message.
+- */
+-static void sym_print_target (struct sym_hcb *np, int target)
+-{
+-	printf ("%s:%d:", sym_name(np), target);
+-}
+-
+-static void sym_print_lun(struct sym_hcb *np, int target, int lun)
+-{
+-	printf ("%s:%d:%d:", sym_name(np), target, lun);
+-}
+-
+-/*
+  *  Print out the content of a SCSI message.
+  */
+ static int sym_show_msg (u_char * msg)
+@@ -107,59 +77,51 @@
+ 		for (i=1;i<8;i++) {
+ 			if (i-1>msg[1]) break;
+ 			printf ("-%x",msg[i]);
+-		};
++		}
+ 		return (i+1);
+ 	} else if ((*msg & 0xf0) == 0x20) {
+ 		printf ("-%x",msg[1]);
+ 		return (2);
+-	};
++	}
+ 	return (1);
+ }
+ 
+-static void sym_print_msg (ccb_p cp, char *label, u_char *msg)
++static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg)
+ {
+-	PRINT_ADDR(cp);
+-	if (label)
+-		printf ("%s: ", label);
++	sym_print_addr(cp->cmd, "%s: ", label);
+ 
+-	(void) sym_show_msg (msg);
+-	printf (".\n");
++	sym_show_msg(msg);
++	printf(".\n");
+ }
+ 
+-static void sym_print_nego_msg (struct sym_hcb *np, int target, char *label, u_char *msg)
++static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_char *msg)
+ {
+-	PRINT_TARGET(np, target);
+-	if (label)
+-		printf ("%s: ", label);
++	struct sym_tcb *tp = &np->target[target];
++	dev_info(&tp->sdev->sdev_target->dev, "%s: ", label);
+ 
+-	(void) sym_show_msg (msg);
+-	printf (".\n");
++	sym_show_msg(msg);
++	printf(".\n");
+ }
+ 
+ /*
+  *  Print something that tells about extended errors.
+  */
+-void sym_print_xerr(ccb_p cp, int x_status)
++void sym_print_xerr(struct scsi_cmnd *cmd, int x_status)
+ {
+ 	if (x_status & XE_PARITY_ERR) {
+-		PRINT_ADDR(cp);
+-		printf ("unrecovered SCSI parity error.\n");
++		sym_print_addr(cmd, "unrecovered SCSI parity error.\n");
+ 	}
+ 	if (x_status & XE_EXTRA_DATA) {
+-		PRINT_ADDR(cp);
+-		printf ("extraneous data discarded.\n");
++		sym_print_addr(cmd, "extraneous data discarded.\n");
+ 	}
+ 	if (x_status & XE_BAD_PHASE) {
+-		PRINT_ADDR(cp);
+-		printf ("illegal scsi phase (4/5).\n");
++		sym_print_addr(cmd, "illegal scsi phase (4/5).\n");
+ 	}
+ 	if (x_status & XE_SODL_UNRUN) {
+-		PRINT_ADDR(cp);
+-		printf ("ODD transfer in DATA OUT phase.\n");
++		sym_print_addr(cmd, "ODD transfer in DATA OUT phase.\n");
+ 	}
+ 	if (x_status & XE_SWIDE_OVRUN) {
+-		PRINT_ADDR(cp);
+-		printf ("ODD transfer in DATA IN phase.\n");
++		sym_print_addr(cmd, "ODD transfer in DATA IN phase.\n");
+ 	}
+ }
+ 
+@@ -186,10 +148,10 @@
+  */
+ static void sym_chip_reset (struct sym_hcb *np)
+ {
+-	OUTB (nc_istat, SRST);
+-	UDELAY (10);
+-	OUTB (nc_istat, 0);
+-	UDELAY(2000);	/* For BUS MODE to settle */
++	OUTB(np, nc_istat, SRST);
++	udelay(10);
++	OUTB(np, nc_istat, 0);
++	udelay(2000);	/* For BUS MODE to settle */
+ }
+ 
+ /*
+@@ -206,27 +168,27 @@
+ 	u_char istat = 0;
+ 	int i;
+ 
+-	if (!(np->features & FE_ISTAT1) || !(INB (nc_istat1) & SCRUN))
++	if (!(np->features & FE_ISTAT1) || !(INB(np, nc_istat1) & SCRUN))
+ 		goto do_chip_reset;
+ 
+-	OUTB (nc_istat, CABRT);
++	OUTB(np, nc_istat, CABRT);
+ 	for (i = 100000 ; i ; --i) {
+-		istat = INB (nc_istat);
++		istat = INB(np, nc_istat);
+ 		if (istat & SIP) {
+-			INW (nc_sist);
++			INW(np, nc_sist);
+ 		}
+ 		else if (istat & DIP) {
+-			if (INB (nc_dstat) & ABRT)
++			if (INB(np, nc_dstat) & ABRT)
+ 				break;
+ 		}
+-		UDELAY(5);
++		udelay(5);
+ 	}
+-	OUTB (nc_istat, 0);
++	OUTB(np, nc_istat, 0);
+ 	if (!i)
+ 		printf("%s: unable to abort current chip operation, "
+ 		       "ISTAT=0x%02x.\n", sym_name(np), istat);
+ do_chip_reset:
+-	sym_chip_reset (np);
++	sym_chip_reset(np);
+ }
+ 
+ /*
+@@ -236,7 +198,7 @@
+  */
+ static void sym_start_reset(struct sym_hcb *np)
+ {
+-	(void) sym_reset_scsi_bus(np, 1);
++	sym_reset_scsi_bus(np, 1);
+ }
+  
+ int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int)
+@@ -246,15 +208,15 @@
+ 
+ 	sym_soft_reset(np);	/* Soft reset the chip */
+ 	if (enab_int)
+-		OUTW (nc_sien, RST);
++		OUTW(np, nc_sien, RST);
+ 	/*
+ 	 *  Enable Tolerant, reset IRQD if present and 
+ 	 *  properly set IRQ mode, prior to resetting the bus.
+ 	 */
+-	OUTB (nc_stest3, TE);
+-	OUTB (nc_dcntl, (np->rv_dcntl & IRQM));
+-	OUTB (nc_scntl1, CRST);
+-	UDELAY (200);
++	OUTB(np, nc_stest3, TE);
++	OUTB(np, nc_dcntl, (np->rv_dcntl & IRQM));
++	OUTB(np, nc_scntl1, CRST);
++	udelay(200);
+ 
+ 	if (!SYM_SETUP_SCSI_BUS_CHECK)
+ 		goto out;
+@@ -264,12 +226,12 @@
+ 	 *  We are expecting RESET to be TRUE and other signals to be 
+ 	 *  FALSE.
+ 	 */
+-	term =	INB(nc_sstat0);
++	term =	INB(np, nc_sstat0);
+ 	term =	((term & 2) << 7) + ((term & 1) << 17);	/* rst sdp0 */
+-	term |= ((INB(nc_sstat2) & 0x01) << 26) |	/* sdp1     */
+-		((INW(nc_sbdl) & 0xff)   << 9)  |	/* d7-0     */
+-		((INW(nc_sbdl) & 0xff00) << 10) |	/* d15-8    */
+-		INB(nc_sbcl);	/* req ack bsy sel atn msg cd io    */
++	term |= ((INB(np, nc_sstat2) & 0x01) << 26) |	/* sdp1     */
++		((INW(np, nc_sbdl) & 0xff)   << 9)  |	/* d7-0     */
++		((INW(np, nc_sbdl) & 0xff00) << 10) |	/* d15-8    */
++		INB(np, nc_sbcl);	/* req ack bsy sel atn msg cd io    */
+ 
+ 	if (!np->maxwide)
+ 		term &= 0x3ffff;
+@@ -286,7 +248,7 @@
+ 			retv = 1;
+ 	}
+ out:
+-	OUTB (nc_scntl1, 0);
++	OUTB(np, nc_scntl1, 0);
+ 	return retv;
+ }
+ 
+@@ -299,31 +261,31 @@
+ 	 *  If multiplier not present or not selected, leave here.
+ 	 */
+ 	if (np->multiplier <= 1) {
+-		OUTB(nc_scntl3,	scntl3);
++		OUTB(np, nc_scntl3, scntl3);
+ 		return;
+ 	}
+ 
+ 	if (sym_verbose >= 2)
+ 		printf ("%s: enabling clock multiplier\n", sym_name(np));
+ 
+-	OUTB(nc_stest1, DBLEN);	   /* Enable clock multiplier		  */
++	OUTB(np, nc_stest1, DBLEN);	   /* Enable clock multiplier */
+ 	/*
+ 	 *  Wait for the LCKFRQ bit to be set if supported by the chip.
+ 	 *  Otherwise wait 50 micro-seconds (at least).
+ 	 */
+ 	if (np->features & FE_LCKFRQ) {
+ 		int i = 20;
+-		while (!(INB(nc_stest4) & LCKFRQ) && --i > 0)
+-			UDELAY (20);
++		while (!(INB(np, nc_stest4) & LCKFRQ) && --i > 0)
++			udelay(20);
+ 		if (!i)
+ 			printf("%s: the chip cannot lock the frequency\n",
+ 				sym_name(np));
+ 	} else
+-		UDELAY ((50+10));
+-	OUTB(nc_stest3, HSC);		/* Halt the scsi clock		*/
+-	OUTB(nc_scntl3,	scntl3);
+-	OUTB(nc_stest1, (DBLEN|DBLSEL));/* Select clock multiplier	*/
+-	OUTB(nc_stest3, 0x00);		/* Restart scsi clock 		*/
++		udelay((50+10));
++	OUTB(np, nc_stest3, HSC);		/* Halt the scsi clock	*/
++	OUTB(np, nc_scntl3, scntl3);
++	OUTB(np, nc_stest1, (DBLEN|DBLSEL));/* Select clock multiplier	*/
++	OUTB(np, nc_stest3, 0x00);		/* Restart scsi clock 	*/
+ }
+ 
+ 
+@@ -368,38 +330,38 @@
+ 	 * performed trust the higher delay 
+ 	 * (lower frequency returned).
+ 	 */
+-	OUTW (nc_sien , 0);	/* mask all scsi interrupts */
+-	(void) INW (nc_sist);	/* clear pending scsi interrupt */
+-	OUTB (nc_dien , 0);	/* mask all dma interrupts */
+-	(void) INW (nc_sist);	/* another one, just to be sure :) */
++	OUTW(np, nc_sien, 0);	/* mask all scsi interrupts */
++	INW(np, nc_sist);	/* clear pending scsi interrupt */
++	OUTB(np, nc_dien, 0);	/* mask all dma interrupts */
++	INW(np, nc_sist);	/* another one, just to be sure :) */
+ 	/*
+ 	 * The C1010-33 core does not report GEN in SIST,
+ 	 * if this interrupt is masked in SIEN.
+ 	 * I don't know yet if the C1010-66 behaves the same way.
+ 	 */
+ 	if (np->features & FE_C10) {
+-		OUTW (nc_sien, GEN);
+-		OUTB (nc_istat1, SIRQD);
++		OUTW(np, nc_sien, GEN);
++		OUTB(np, nc_istat1, SIRQD);
+ 	}
+-	OUTB (nc_scntl3, 4);	/* set pre-scaler to divide by 3 */
+-	OUTB (nc_stime1, 0);	/* disable general purpose timer */
+-	OUTB (nc_stime1, gen);	/* set to nominal delay of 1<<gen * 125us */
+-	while (!(INW(nc_sist) & GEN) && ms++ < 100000)
+-		UDELAY (1000/4);/* count in 1/4 of ms */
+-	OUTB (nc_stime1, 0);	/* disable general purpose timer */
++	OUTB(np, nc_scntl3, 4);	   /* set pre-scaler to divide by 3 */
++	OUTB(np, nc_stime1, 0);	   /* disable general purpose timer */
++	OUTB(np, nc_stime1, gen);  /* set to nominal delay of 1<<gen * 125us */
++	while (!(INW(np, nc_sist) & GEN) && ms++ < 100000)
++		udelay(1000/4);    /* count in 1/4 of ms */
++	OUTB(np, nc_stime1, 0);    /* disable general purpose timer */
+ 	/*
+ 	 * Undo C1010-33 specific settings.
+ 	 */
+ 	if (np->features & FE_C10) {
+-		OUTW (nc_sien, 0);
+-		OUTB (nc_istat1, 0);
++		OUTW(np, nc_sien, 0);
++		OUTB(np, nc_istat1, 0);
+ 	}
+  	/*
+  	 * set prescaler to divide by whatever 0 means
+  	 * 0 ought to choose divide by 2, but appears
+  	 * to set divide by 3.5 mode in my 53c810 ...
+  	 */
+- 	OUTB (nc_scntl3, 0);
++ 	OUTB(np, nc_scntl3, 0);
+ 
+   	/*
+  	 * adjust for prescaler, and convert into KHz 
+@@ -425,7 +387,7 @@
+ 	u_int f1, f2;
+ 	int gen = 8;
+ 
+-	(void) getfreq (np, gen);	/* throw away first result */
++	getfreq (np, gen);	/* throw away first result */
+ 	f1 = getfreq (np, gen);
+ 	f2 = getfreq (np, gen);
+ 	if (f1 > f2) f1 = f2;		/* trust lower result	*/
+@@ -458,7 +420,7 @@
+ 	 *  Otherwise trust scntl3 BIOS setting.
+ 	 */
+ 	if (np->multiplier != mult || (scntl3 & 7) < 3 || !(scntl3 & 1)) {
+-		OUTB (nc_stest1, 0);		/* make sure doubler is OFF */
++		OUTB(np, nc_stest1, 0);		/* make sure doubler is OFF */
+ 		f1 = sym_getfreq (np);
+ 
+ 		if (sym_verbose)
+@@ -505,9 +467,9 @@
+ #else
+ 	if (1) {
+ #endif
+-		OUTB (nc_stest1, SCLK);	/* Use the PCI clock as SCSI clock */
+-		f = (int) sym_getfreq (np);
+-		OUTB (nc_stest1, 0);
++		OUTB(np, nc_stest1, SCLK); /* Use the PCI clock as SCSI clock */
++		f = sym_getfreq(np);
++		OUTB(np, nc_stest1, 0);
+ 	}
+ 	np->pciclk_khz = f;
+ 
+@@ -698,29 +660,29 @@
+  */
+ static void sym_save_initial_setting (struct sym_hcb *np)
+ {
+-	np->sv_scntl0	= INB(nc_scntl0) & 0x0a;
+-	np->sv_scntl3	= INB(nc_scntl3) & 0x07;
+-	np->sv_dmode	= INB(nc_dmode)  & 0xce;
+-	np->sv_dcntl	= INB(nc_dcntl)  & 0xa8;
+-	np->sv_ctest3	= INB(nc_ctest3) & 0x01;
+-	np->sv_ctest4	= INB(nc_ctest4) & 0x80;
+-	np->sv_gpcntl	= INB(nc_gpcntl);
+-	np->sv_stest1	= INB(nc_stest1);
+-	np->sv_stest2	= INB(nc_stest2) & 0x20;
+-	np->sv_stest4	= INB(nc_stest4);
++	np->sv_scntl0	= INB(np, nc_scntl0) & 0x0a;
++	np->sv_scntl3	= INB(np, nc_scntl3) & 0x07;
++	np->sv_dmode	= INB(np, nc_dmode)  & 0xce;
++	np->sv_dcntl	= INB(np, nc_dcntl)  & 0xa8;
++	np->sv_ctest3	= INB(np, nc_ctest3) & 0x01;
++	np->sv_ctest4	= INB(np, nc_ctest4) & 0x80;
++	np->sv_gpcntl	= INB(np, nc_gpcntl);
++	np->sv_stest1	= INB(np, nc_stest1);
++	np->sv_stest2	= INB(np, nc_stest2) & 0x20;
++	np->sv_stest4	= INB(np, nc_stest4);
+ 	if (np->features & FE_C10) {	/* Always large DMA fifo + ultra3 */
+-		np->sv_scntl4	= INB(nc_scntl4);
+-		np->sv_ctest5	= INB(nc_ctest5) & 0x04;
++		np->sv_scntl4	= INB(np, nc_scntl4);
++		np->sv_ctest5	= INB(np, nc_ctest5) & 0x04;
+ 	}
+ 	else
+-		np->sv_ctest5	= INB(nc_ctest5) & 0x24;
++		np->sv_ctest5	= INB(np, nc_ctest5) & 0x24;
+ }
+ 
+ /*
+  *  Prepare io register values used by sym_start_up() 
+  *  according to selected and supported features.
+  */
+-static int sym_prepare_setting(struct sym_hcb *np, struct sym_nvram *nvram)
++static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram)
+ {
+ 	u_char	burst_max;
+ 	u32	period;
+@@ -903,22 +865,20 @@
+ 	/*
+ 	 *  Select some other
+ 	 */
+-	if (SYM_SETUP_PCI_PARITY)
+-		np->rv_ctest4	|= MPEE; /* Master parity checking */
+-	if (SYM_SETUP_SCSI_PARITY)
+-		np->rv_scntl0	|= 0x0a; /*  full arb., ena parity, par->ATN  */
++	np->rv_ctest4	|= MPEE; /* Master parity checking */
++	np->rv_scntl0	|= 0x0a; /*  full arb., ena parity, par->ATN  */
+ 
+ 	/*
+ 	 *  Get parity checking, host ID and verbose mode from NVRAM
+ 	 */
+ 	np->myaddr = 255;
+-	sym_nvram_setup_host (np, nvram);
++	sym_nvram_setup_host(shost, np, nvram);
+ 
+ 	/*
+ 	 *  Get SCSI addr of host adapter (set by bios?).
+ 	 */
+ 	if (np->myaddr == 255) {
+-		np->myaddr = INB(nc_scid) & 0x07;
++		np->myaddr = INB(np, nc_scid) & 0x07;
+ 		if (!np->myaddr)
+ 			np->myaddr = SYM_SETUP_HOST_ID;
+ 	}
+@@ -946,7 +906,7 @@
+ 					np->scsi_mode = SMODE_HVD;
+ 			}
+ 			else if (nvram->type == SYM_SYMBIOS_NVRAM) {
+-				if (!(INB(nc_gpreg) & 0x08))
++				if (!(INB(np, nc_gpreg) & 0x08))
+ 					np->scsi_mode = SMODE_HVD;
+ 			}
+ 		}
+@@ -988,12 +948,12 @@
+ 	 *  If NVRAM present get targets setup from NVRAM.
+ 	 */
+ 	for (i = 0 ; i < SYM_CONF_MAX_TARGET ; i++) {
+-		tcb_p tp = &np->target[i];
++		struct sym_tcb *tp = &np->target[i];
+ 
+ 		tp->usrflags |= (SYM_DISC_ENABLED | SYM_TAGS_ENABLED);
+ 		tp->usrtags = SYM_SETUP_MAX_TAG;
+ 
+-		sym_nvram_setup_target (np, i, nvram);
++		sym_nvram_setup_target(np, i, nvram);
+ 
+ 		if (!tp->usrtags)
+ 			tp->usrflags &= ~SYM_TAGS_ENABLED;
+@@ -1002,11 +962,8 @@
+ 	/*
+ 	 *  Let user know about the settings.
+ 	 */
+-	i = nvram->type;
+-	printf("%s: %s NVRAM, ID %d, Fast-%d, %s, %s\n", sym_name(np),
+-		i  == SYM_SYMBIOS_NVRAM ? "Symbios" :
+-		(i == SYM_TEKRAM_NVRAM  ? "Tekram" : "No"),
+-		np->myaddr,
++	printf("%s: %s, ID %d, Fast-%d, %s, %s\n", sym_name(np),
++		sym_nvram_type(nvram), np->myaddr,
+ 		(np->features & FE_ULTRA3) ? 80 : 
+ 		(np->features & FE_ULTRA2) ? 40 : 
+ 		(np->features & FE_ULTRA)  ? 20 : 10,
+@@ -1055,7 +1012,7 @@
+  *
+  *  Has to be called with interrupts disabled.
+  */
+-#ifndef SYM_CONF_IOMAPPED
++#ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED
+ static int sym_regtest (struct sym_hcb *np)
+ {
+ 	register volatile u32 data;
+@@ -1065,8 +1022,8 @@
+ 	 *  and try to read it back.
+ 	 */
+ 	data = 0xffffffff;
+-	OUTL_OFF(offsetof(struct sym_reg, nc_dstat), data);
+-	data = INL_OFF(offsetof(struct sym_reg, nc_dstat));
++	OUTL(np, nc_dstat, data);
++	data = INL(np, nc_dstat);
+ #if 1
+ 	if (data == 0xffffffff) {
+ #else
+@@ -1075,7 +1032,7 @@
+ 		printf ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n",
+ 			(unsigned) data);
+ 		return (0x10);
+-	};
++	}
+ 	return (0);
+ }
+ #endif
+@@ -1084,7 +1041,7 @@
+ {
+ 	u32	sym_rd, sym_wr, sym_bk, host_rd, host_wr, pc, dstat;
+ 	int	i, err=0;
+-#ifndef SYM_CONF_IOMAPPED
++#ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED
+ 	err |= sym_regtest (np);
+ 	if (err) return (err);
+ #endif
+@@ -1093,37 +1050,37 @@
+ 	 *  Enable Master Parity Checking as we intend 
+ 	 *  to enable it for normal operations.
+ 	 */
+-	OUTB (nc_ctest4, (np->rv_ctest4 & MPEE));
++	OUTB(np, nc_ctest4, (np->rv_ctest4 & MPEE));
+ 	/*
+ 	 *  init
+ 	 */
+-	pc  = SCRIPTZ_BA (np, snooptest);
++	pc  = SCRIPTZ_BA(np, snooptest);
+ 	host_wr = 1;
+ 	sym_wr  = 2;
+ 	/*
+ 	 *  Set memory and register.
+ 	 */
+ 	np->scratch = cpu_to_scr(host_wr);
+-	OUTL (nc_temp, sym_wr);
++	OUTL(np, nc_temp, sym_wr);
+ 	/*
+ 	 *  Start script (exchange values)
+ 	 */
+-	OUTL (nc_dsa, np->hcb_ba);
+-	OUTL_DSP (pc);
++	OUTL(np, nc_dsa, np->hcb_ba);
++	OUTL_DSP(np, pc);
+ 	/*
+ 	 *  Wait 'til done (with timeout)
+ 	 */
+ 	for (i=0; i<SYM_SNOOP_TIMEOUT; i++)
+-		if (INB(nc_istat) & (INTF|SIP|DIP))
++		if (INB(np, nc_istat) & (INTF|SIP|DIP))
+ 			break;
+ 	if (i>=SYM_SNOOP_TIMEOUT) {
+ 		printf ("CACHE TEST FAILED: timeout.\n");
+ 		return (0x20);
+-	};
++	}
+ 	/*
+ 	 *  Check for fatal DMA errors.
+ 	 */
+-	dstat = INB (nc_dstat);
++	dstat = INB(np, nc_dstat);
+ #if 1	/* Band aiding for broken hardwares that fail PCI parity */
+ 	if ((dstat & MDPE) && (np->rv_ctest4 & MPEE)) {
+ 		printf ("%s: PCI DATA PARITY ERROR DETECTED - "
+@@ -1140,23 +1097,23 @@
+ 	/*
+ 	 *  Save termination position.
+ 	 */
+-	pc = INL (nc_dsp);
++	pc = INL(np, nc_dsp);
+ 	/*
+ 	 *  Read memory and register.
+ 	 */
+ 	host_rd = scr_to_cpu(np->scratch);
+-	sym_rd  = INL (nc_scratcha);
+-	sym_bk  = INL (nc_temp);
++	sym_rd  = INL(np, nc_scratcha);
++	sym_bk  = INL(np, nc_temp);
+ 	/*
+ 	 *  Check termination position.
+ 	 */
+-	if (pc != SCRIPTZ_BA (np, snoopend)+8) {
++	if (pc != SCRIPTZ_BA(np, snoopend)+8) {
+ 		printf ("CACHE TEST FAILED: script execution failed.\n");
+ 		printf ("start=%08lx, pc=%08lx, end=%08lx\n", 
+-			(u_long) SCRIPTZ_BA (np, snooptest), (u_long) pc,
+-			(u_long) SCRIPTZ_BA (np, snoopend) +8);
++			(u_long) SCRIPTZ_BA(np, snooptest), (u_long) pc,
++			(u_long) SCRIPTZ_BA(np, snoopend) +8);
+ 		return (0x40);
+-	};
++	}
+ 	/*
+ 	 *  Show results.
+ 	 */
+@@ -1164,17 +1121,17 @@
+ 		printf ("CACHE TEST FAILED: host wrote %d, chip read %d.\n",
+ 			(int) host_wr, (int) sym_rd);
+ 		err |= 1;
+-	};
++	}
+ 	if (host_rd != sym_wr) {
+ 		printf ("CACHE TEST FAILED: chip wrote %d, host read %d.\n",
+ 			(int) sym_wr, (int) host_rd);
+ 		err |= 2;
+-	};
++	}
+ 	if (sym_bk != sym_wr) {
+ 		printf ("CACHE TEST FAILED: chip wrote %d, read back %d.\n",
+ 			(int) sym_wr, (int) sym_bk);
+ 		err |= 4;
+-	};
++	}
+ 
+ 	return (err);
+ }
+@@ -1215,7 +1172,7 @@
+ 	u_char	*script_base;
+ 	int	i;
+ 
+-	dsp	= INL (nc_dsp);
++	dsp	= INL(np, nc_dsp);
+ 
+ 	if	(dsp > np->scripta_ba &&
+ 		 dsp <= np->scripta_ba + np->scripta_sz) {
+@@ -1238,12 +1195,12 @@
+ 	}
+ 
+ 	printf ("%s:%d: ERROR (%x:%x) (%x-%x-%x) (%x/%x/%x) @ (%s %x:%08x).\n",
+-		sym_name (np), (unsigned)INB (nc_sdid)&0x0f, dstat, sist,
+-		(unsigned)INB (nc_socl),   (unsigned)INB (nc_sbcl),
+-		(unsigned)INB (nc_sbdl),   (unsigned)INB (nc_sxfer),
+-		(unsigned)INB (nc_scntl3),
+-		(np->features & FE_C10) ?  (unsigned)INB (nc_scntl4) : 0,
+-		script_name, script_ofs,   (unsigned)INL (nc_dbc));
++		sym_name(np), (unsigned)INB(np, nc_sdid)&0x0f, dstat, sist,
++		(unsigned)INB(np, nc_socl), (unsigned)INB(np, nc_sbcl),
++		(unsigned)INB(np, nc_sbdl), (unsigned)INB(np, nc_sxfer),
++		(unsigned)INB(np, nc_scntl3),
++		(np->features & FE_C10) ?  (unsigned)INB(np, nc_scntl4) : 0,
++		script_name, script_ofs,   (unsigned)INL(np, nc_dbc));
+ 
+ 	if (((script_ofs & 3) == 0) &&
+ 	    (unsigned)script_ofs < script_size) {
+@@ -1253,7 +1210,7 @@
+ 
+         printf ("%s: regdump:", sym_name(np));
+         for (i=0; i<24;i++)
+-            printf (" %02x", (unsigned)INB_OFF(i));
++            printf (" %02x", (unsigned)INB_OFF(np, i));
+         printf (".\n");
+ 
+ 	/*
+@@ -1263,7 +1220,7 @@
+ 		sym_log_bus_error(np);
+ }
+ 
+-static struct sym_pci_chip sym_pci_dev_table[] = {
++static struct sym_chip sym_dev_table[] = {
+  {PCI_DEVICE_ID_NCR_53C810, 0x0f, "810", 4, 8, 4, 64,
+  FE_ERL}
+  ,
+@@ -1347,8 +1304,8 @@
+  FE_RAM|FE_IO256|FE_LEDC}
+ };
+ 
+-#define sym_pci_num_devs \
+-	(sizeof(sym_pci_dev_table) / sizeof(sym_pci_dev_table[0]))
++#define sym_num_devs \
++	(sizeof(sym_dev_table) / sizeof(sym_dev_table[0]))
+ 
+ /*
+  *  Look up the chip table.
+@@ -1356,14 +1313,14 @@
+  *  Return a pointer to the chip entry if found, 
+  *  zero otherwise.
+  */
+-struct sym_pci_chip *
+-sym_lookup_pci_chip_table (u_short device_id, u_char revision)
++struct sym_chip *
++sym_lookup_chip_table (u_short device_id, u_char revision)
+ {
+-	struct	sym_pci_chip *chip;
++	struct	sym_chip *chip;
+ 	int	i;
+ 
+-	for (i = 0; i < sym_pci_num_devs; i++) {
+-		chip = &sym_pci_dev_table[i];
++	for (i = 0; i < sym_num_devs; i++) {
++		chip = &sym_dev_table[i];
+ 		if (device_id != chip->device_id)
+ 			continue;
+ 		if (revision > chip->revision_id)
+@@ -1421,7 +1378,7 @@
+ 		return;
+ 	o = offsetof(struct sym_reg, nc_scrx[0]);
+ 	for (i = 0; i < SYM_DMAP_SIZE; i++) {
+-		OUTL_OFF(o, np->dmap_bah[i]);
++		OUTL_OFF(np, o, np->dmap_bah[i]);
+ 		o += 4;
+ 	}
+ 	np->dmap_dirty = 0;
+@@ -1429,52 +1386,52 @@
+ #endif
+ 
+ /* Enforce all the fiddly SPI rules and the chip limitations */
+-static void sym_check_goals(struct scsi_device *sdev)
++static void sym_check_goals(struct sym_hcb *np, struct scsi_target *starget,
++		struct sym_trans *goal)
+ {
+-	struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb;
+-	struct sym_trans *st = &np->target[sdev->id].tinfo.goal;
+-
+-	if (!scsi_device_wide(sdev))
+-		st->width = 0;
++	if (!spi_support_wide(starget))
++		goal->width = 0;
+ 
+-	if (!scsi_device_sync(sdev)) {
+-		st->options = 0;
+-		st->period = 0;
+-		st->offset = 0;
++	if (!spi_support_sync(starget)) {
++		goal->iu = 0;
++		goal->dt = 0;
++		goal->qas = 0;
++		goal->period = 0;
++		goal->offset = 0;
+ 		return;
+ 	}
+ 
+-	if (scsi_device_dt(sdev)) {
+-		if (scsi_device_dt_only(sdev))
+-			st->options |= PPR_OPT_DT;
++	if (spi_support_dt(starget)) {
++		if (spi_support_dt_only(starget))
++			goal->dt = 1;
+ 
+-		if (st->offset == 0)
+-			st->options &= ~PPR_OPT_DT;
++		if (goal->offset == 0)
++			goal->dt = 0;
+ 	} else {
+-		st->options &= ~PPR_OPT_DT;
++		goal->dt = 0;
+ 	}
+ 
+ 	/* Some targets fail to properly negotiate DT in SE mode */
+ 	if ((np->scsi_mode != SMODE_LVD) || !(np->features & FE_U3EN))
+-		st->options &= ~PPR_OPT_DT;
++		goal->dt = 0;
+ 
+-	if (st->options & PPR_OPT_DT) {
++	if (goal->dt) {
+ 		/* all DT transfers must be wide */
+-		st->width = 1;
+-		if (st->offset > np->maxoffs_dt)
+-			st->offset = np->maxoffs_dt;
+-		if (st->period < np->minsync_dt)
+-			st->period = np->minsync_dt;
+-		if (st->period > np->maxsync_dt)
+-			st->period = np->maxsync_dt;
++		goal->width = 1;
++		if (goal->offset > np->maxoffs_dt)
++			goal->offset = np->maxoffs_dt;
++		if (goal->period < np->minsync_dt)
++			goal->period = np->minsync_dt;
++		if (goal->period > np->maxsync_dt)
++			goal->period = np->maxsync_dt;
+ 	} else {
+-		st->options &= ~PPR_OPT_MASK;
+-		if (st->offset > np->maxoffs)
+-			st->offset = np->maxoffs;
+-		if (st->period < np->minsync)
+-			st->period = np->minsync;
+-		if (st->period > np->maxsync)
+-			st->period = np->maxsync;
++		goal->iu = goal->qas = 0;
++		if (goal->offset > np->maxoffs)
++			goal->offset = np->maxoffs;
++		if (goal->period < np->minsync)
++			goal->period = np->minsync;
++		if (goal->period > np->maxsync)
++			goal->period = np->maxsync;
+ 	}
+ }
+ 
+@@ -1485,30 +1442,29 @@
+  *  negotiation and the nego_status field of the CCB.
+  *  Returns the size of the message in bytes.
+  */
+-static int sym_prepare_nego(struct sym_hcb *np, ccb_p cp, u_char *msgptr)
++static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgptr)
+ {
+-	tcb_p tp = &np->target[cp->target];
+-	struct scsi_device *sdev = tp->sdev;
+-	struct sym_trans *goal = &tp->tinfo.goal;
+-	struct sym_trans *curr = &tp->tinfo.curr;
++	struct sym_tcb *tp = &np->target[cp->target];
++	struct scsi_target *starget = tp->sdev->sdev_target;
++	struct sym_trans *goal = &tp->tgoal;
+ 	int msglen = 0;
+ 	int nego;
+ 
+-	if (likely(sdev))
+-		sym_check_goals(sdev);
++	sym_check_goals(np, starget, goal);
+ 
+ 	/*
+ 	 * Many devices implement PPR in a buggy way, so only use it if we
+ 	 * really want to.
+ 	 */
+-	if ((goal->options & PPR_OPT_MASK) || (goal->period < 0xa)) {
++	if (goal->iu || goal->dt || goal->qas || (goal->period < 0xa)) {
+ 		nego = NS_PPR;
+-	} else if (curr->width != goal->width) {
++	} else if (spi_width(starget) != goal->width) {
+ 		nego = NS_WIDE;
+-	} else if (curr->period != goal->period ||
+-		   curr->offset != goal->offset) {
++	} else if (spi_period(starget) != goal->period ||
++		   spi_offset(starget) != goal->offset) {
+ 		nego = NS_SYNC;
+ 	} else {
++		goal->check_nego = 0;
+ 		nego = 0;
+ 	}
+ 
+@@ -1534,9 +1490,11 @@
+ 		msgptr[msglen++] = 0;
+ 		msgptr[msglen++] = goal->offset;
+ 		msgptr[msglen++] = goal->width;
+-		msgptr[msglen++] = goal->options & PPR_OPT_MASK;
++		msgptr[msglen++] = (goal->iu ? PPR_OPT_IU : 0) |
++					(goal->dt ? PPR_OPT_DT : 0) |
++					(goal->qas ? PPR_OPT_QAS : 0);
+ 		break;
+-	};
++	}
+ 
+ 	cp->nego_status = nego;
+ 
+@@ -1547,8 +1505,8 @@
+ 					  nego == NS_SYNC ? "sync msgout" :
+ 					  nego == NS_WIDE ? "wide msgout" :
+ 					  "ppr msgout", msgptr);
+-		};
+-	};
++		}
++	}
+ 
+ 	return msglen;
+ }
+@@ -1556,7 +1514,7 @@
+ /*
+  *  Insert a job into the start queue.
+  */
+-void sym_put_start_queue(struct sym_hcb *np, ccb_p cp)
++void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp)
+ {
+ 	u_short	qidx;
+ 
+@@ -1608,17 +1566,17 @@
+ 	 *  Wake it up.
+ 	 */
+ 	MEMORY_WRITE_BARRIER();
+-	OUTB (nc_istat, SIGP|np->istat_sem);
++	OUTB(np, nc_istat, SIGP|np->istat_sem);
+ }
+ 
+ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
+ /*
+  *  Start next ready-to-start CCBs.
+  */
+-void sym_start_next_ccbs(struct sym_hcb *np, lcb_p lp, int maxn)
++void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn)
+ {
+ 	SYM_QUEHEAD *qp;
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 
+ 	/* 
+ 	 *  Paranoia, as usual. :-)
+@@ -1643,7 +1601,7 @@
+ 			}
+ 			lp->itlq_tbl[cp->tag] = cpu_to_scr(cp->ccb_ba);
+ 			lp->head.resel_sa =
+-				cpu_to_scr(SCRIPTA_BA (np, resel_tag));
++				cpu_to_scr(SCRIPTA_BA(np, resel_tag));
+ 			++lp->started_tags;
+ 		} else {
+ 			if (lp->started_no_tag || lp->started_tags) {
+@@ -1652,7 +1610,7 @@
+ 			}
+ 			lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
+ 			lp->head.resel_sa =
+-			      cpu_to_scr(SCRIPTA_BA (np, resel_no_tag));
++			      cpu_to_scr(SCRIPTA_BA(np, resel_no_tag));
+ 			++lp->started_no_tag;
+ 		}
+ 		cp->started = 1;
+@@ -1671,7 +1629,7 @@
+  */
+ static int sym_wakeup_done (struct sym_hcb *np)
+ {
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 	int i, n;
+ 	u32 dsa;
+ 
+@@ -1719,22 +1677,22 @@
+ static void sym_flush_comp_queue(struct sym_hcb *np, int cam_status)
+ {
+ 	SYM_QUEHEAD *qp;
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 
+ 	while ((qp = sym_remque_head(&np->comp_ccbq)) != 0) {
+-		struct scsi_cmnd *ccb;
++		struct scsi_cmnd *cmd;
+ 		cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
+ 		sym_insque_tail(&cp->link_ccbq, &np->busy_ccbq);
+ 		/* Leave quiet CCBs waiting for resources */
+ 		if (cp->host_status == HS_WAIT)
+ 			continue;
+-		ccb = cp->cam_ccb;
++		cmd = cp->cmd;
+ 		if (cam_status)
+-			sym_set_cam_status(ccb, cam_status);
++			sym_set_cam_status(cmd, cam_status);
+ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
+-		if (sym_get_cam_status(ccb) == CAM_REQUEUE_REQ) {
+-			tcb_p tp = &np->target[cp->target];
+-			lcb_p lp = sym_lp(np, tp, cp->lun);
++		if (sym_get_cam_status(cmd) == CAM_REQUEUE_REQ) {
++			struct sym_tcb *tp = &np->target[cp->target];
++			struct sym_lcb *lp = sym_lp(tp, cp->lun);
+ 			if (lp) {
+ 				sym_remque(&cp->link2_ccbq);
+ 				sym_insque_tail(&cp->link2_ccbq,
+@@ -1751,8 +1709,7 @@
+ 		}
+ #endif
+ 		sym_free_ccb(np, cp);
+-		sym_freeze_cam_ccb(ccb);
+-		sym_xpt_done(np, ccb);
++		sym_xpt_done(np, cmd);
+ 	}
+ }
+ 
+@@ -1790,8 +1747,8 @@
+ 	if (reason == 1)
+ 		sym_soft_reset(np);
+ 	else {
+-		OUTB (nc_stest3, TE|CSF);
+-		OUTONB (nc_ctest3, CLF);
++		OUTB(np, nc_stest3, TE|CSF);
++		OUTONB(np, nc_ctest3, CLF);
+ 	}
+  
+ 	/*
+@@ -1839,39 +1796,39 @@
+ 	/*
+ 	 *  Init chip.
+ 	 */
+-	OUTB (nc_istat,  0x00   );	/*  Remove Reset, abort */
+-	UDELAY (2000);	/* The 895 needs time for the bus mode to settle */
++	OUTB(np, nc_istat,  0x00);			/*  Remove Reset, abort */
++	udelay(2000); /* The 895 needs time for the bus mode to settle */
+ 
+-	OUTB (nc_scntl0, np->rv_scntl0 | 0xc0);
++	OUTB(np, nc_scntl0, np->rv_scntl0 | 0xc0);
+ 					/*  full arb., ena parity, par->ATN  */
+-	OUTB (nc_scntl1, 0x00);		/*  odd parity, and remove CRST!! */
++	OUTB(np, nc_scntl1, 0x00);		/*  odd parity, and remove CRST!! */
+ 
+ 	sym_selectclock(np, np->rv_scntl3);	/* Select SCSI clock */
+ 
+-	OUTB (nc_scid  , RRE|np->myaddr);	/* Adapter SCSI address */
+-	OUTW (nc_respid, 1ul<<np->myaddr);	/* Id to respond to */
+-	OUTB (nc_istat , SIGP	);		/*  Signal Process */
+-	OUTB (nc_dmode , np->rv_dmode);		/* Burst length, dma mode */
+-	OUTB (nc_ctest5, np->rv_ctest5);	/* Large fifo + large burst */
+-
+-	OUTB (nc_dcntl , NOCOM|np->rv_dcntl);	/* Protect SFBR */
+-	OUTB (nc_ctest3, np->rv_ctest3);	/* Write and invalidate */
+-	OUTB (nc_ctest4, np->rv_ctest4);	/* Master parity checking */
++	OUTB(np, nc_scid  , RRE|np->myaddr);	/* Adapter SCSI address */
++	OUTW(np, nc_respid, 1ul<<np->myaddr);	/* Id to respond to */
++	OUTB(np, nc_istat , SIGP	);		/*  Signal Process */
++	OUTB(np, nc_dmode , np->rv_dmode);		/* Burst length, dma mode */
++	OUTB(np, nc_ctest5, np->rv_ctest5);	/* Large fifo + large burst */
++
++	OUTB(np, nc_dcntl , NOCOM|np->rv_dcntl);	/* Protect SFBR */
++	OUTB(np, nc_ctest3, np->rv_ctest3);	/* Write and invalidate */
++	OUTB(np, nc_ctest4, np->rv_ctest4);	/* Master parity checking */
+ 
+ 	/* Extended Sreq/Sack filtering not supported on the C10 */
+ 	if (np->features & FE_C10)
+-		OUTB (nc_stest2, np->rv_stest2);
++		OUTB(np, nc_stest2, np->rv_stest2);
+ 	else
+-		OUTB (nc_stest2, EXT|np->rv_stest2);
++		OUTB(np, nc_stest2, EXT|np->rv_stest2);
+ 
+-	OUTB (nc_stest3, TE);			/* TolerANT enable */
+-	OUTB (nc_stime0, 0x0c);			/* HTH disabled  STO 0.25 sec */
++	OUTB(np, nc_stest3, TE);			/* TolerANT enable */
++	OUTB(np, nc_stime0, 0x0c);			/* HTH disabled  STO 0.25 sec */
+ 
+ 	/*
+ 	 *  For now, disable AIP generation on C1010-66.
+ 	 */
+ 	if (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)
+-		OUTB (nc_aipcntl1, DISAIP);
++		OUTB(np, nc_aipcntl1, DISAIP);
+ 
+ 	/*
+ 	 *  C10101 rev. 0 errata.
+@@ -1882,7 +1839,7 @@
+ 	 */
+ 	if (np->device_id == PCI_DEVICE_ID_LSI_53C1010_33 &&
+ 	    np->revision_id < 1)
+-		OUTB (nc_stest1, INB(nc_stest1) | 0x30);
++		OUTB(np, nc_stest1, INB(np, nc_stest1) | 0x30);
+ 
+ 	/*
+ 	 *  DEL 441 - 53C876 Rev 5 - Part Number 609-0392787/2788 - ITEM 2.
+@@ -1890,7 +1847,7 @@
+ 	 *  regardless revision id (kind of post-chip-design feature. ;-))
+ 	 */
+ 	if (np->device_id == PCI_DEVICE_ID_NCR_53C875)
+-		OUTB (nc_ctest0, (1<<5));
++		OUTB(np, nc_ctest0, (1<<5));
+ 	else if (np->device_id == PCI_DEVICE_ID_NCR_53C896)
+ 		np->rv_ccntl0 |= DPR;
+ 
+@@ -1900,8 +1857,8 @@
+ 	 *  seem to support those IO registers.
+ 	 */
+ 	if (np->features & (FE_DAC|FE_NOPM)) {
+-		OUTB (nc_ccntl0, np->rv_ccntl0);
+-		OUTB (nc_ccntl1, np->rv_ccntl1);
++		OUTB(np, nc_ccntl0, np->rv_ccntl0);
++		OUTB(np, nc_ccntl1, np->rv_ccntl1);
+ 	}
+ 
+ #if	SYM_CONF_DMA_ADDRESSING_MODE == 2
+@@ -1911,8 +1868,8 @@
+ 	 */
+ 	if (np->use_dac) {
+ 		np->dmap_bah[0] = 0;	/* ??? */
+-		OUTL (nc_scrx[0], np->dmap_bah[0]);
+-		OUTL (nc_drs, np->dmap_bah[0]);
++		OUTL(np, nc_scrx[0], np->dmap_bah[0]);
++		OUTL(np, nc_drs, np->dmap_bah[0]);
+ 	}
+ #endif
+ 
+@@ -1921,8 +1878,8 @@
+ 	 *  set PM jump addresses.
+ 	 */
+ 	if (np->features & FE_NOPM) {
+-		OUTL (nc_pmjad1, SCRIPTB_BA (np, pm_handle));
+-		OUTL (nc_pmjad2, SCRIPTB_BA (np, pm_handle));
++		OUTL(np, nc_pmjad1, SCRIPTB_BA(np, pm_handle));
++		OUTL(np, nc_pmjad2, SCRIPTB_BA(np, pm_handle));
+ 	}
+ 
+ 	/*
+@@ -1930,15 +1887,15 @@
+ 	 *    Also set GPIO5 and clear GPIO6 if hardware LED control.
+ 	 */
+ 	if (np->features & FE_LED0)
+-		OUTB(nc_gpcntl, INB(nc_gpcntl) & ~0x01);
++		OUTB(np, nc_gpcntl, INB(np, nc_gpcntl) & ~0x01);
+ 	else if (np->features & FE_LEDC)
+-		OUTB(nc_gpcntl, (INB(nc_gpcntl) & ~0x41) | 0x20);
++		OUTB(np, nc_gpcntl, (INB(np, nc_gpcntl) & ~0x41) | 0x20);
+ 
+ 	/*
+ 	 *      enable ints
+ 	 */
+-	OUTW (nc_sien , STO|HTH|MA|SGE|UDC|RST|PAR);
+-	OUTB (nc_dien , MDPE|BF|SSI|SIR|IID);
++	OUTW(np, nc_sien , STO|HTH|MA|SGE|UDC|RST|PAR);
++	OUTB(np, nc_dien , MDPE|BF|SSI|SIR|IID);
+ 
+ 	/*
+ 	 *  For 895/6 enable SBMC interrupt and save current SCSI bus mode.
+@@ -1946,12 +1903,12 @@
+ 	 *  we reset the chip but not the SCSI BUS (at initialization).
+ 	 */
+ 	if (np->features & (FE_ULTRA2|FE_ULTRA3)) {
+-		OUTONW (nc_sien, SBMC);
++		OUTONW(np, nc_sien, SBMC);
+ 		if (reason == 0) {
+ 			mdelay(100);
+-			INW (nc_sist);
++			INW(np, nc_sist);
+ 		}
+-		np->scsi_mode = INB (nc_stest4) & SMODE;
++		np->scsi_mode = INB(np, nc_stest4) & SMODE;
+ 	}
+ 
+ 	/*
+@@ -1961,17 +1918,12 @@
+ 	 *  Prepare sync negotiation according to actual SCSI bus mode.
+ 	 */
+ 	for (i=0;i<SYM_CONF_MAX_TARGET;i++) {
+-		tcb_p tp = &np->target[i];
++		struct sym_tcb *tp = &np->target[i];
+ 
+ 		tp->to_reset  = 0;
+ 		tp->head.sval = 0;
+ 		tp->head.wval = np->rv_scntl3;
+ 		tp->head.uval = 0;
+-
+-		tp->tinfo.curr.period = 0;
+-		tp->tinfo.curr.offset = 0;
+-		tp->tinfo.curr.width  = BUS_8_BIT;
+-		tp->tinfo.curr.options = 0;
+ 	}
+ 
+ 	/*
+@@ -1981,29 +1933,25 @@
+ 	 *  For platforms that may not support PCI memory mapping,
+ 	 *  we use simple SCRIPTS that performs MEMORY MOVEs.
+ 	 */
++	phys = SCRIPTA_BA(np, init);
+ 	if (np->ram_ba) {
+ 		if (sym_verbose >= 2)
+-			printf ("%s: Downloading SCSI SCRIPTS.\n",
+-				sym_name(np));
++			printf("%s: Downloading SCSI SCRIPTS.\n", sym_name(np));
++		memcpy_toio(np->s.ramaddr, np->scripta0, np->scripta_sz);
+ 		if (np->ram_ws == 8192) {
+-			OUTRAM_OFF(4096, np->scriptb0, np->scriptb_sz);
+-			phys =  scr_to_cpu(np->scr_ram_seg);
+-			OUTL (nc_mmws, phys);
+-			OUTL (nc_mmrs, phys);
+-			OUTL (nc_sfs,  phys);
+-			phys = SCRIPTB_BA (np, start64);
++			memcpy_toio(np->s.ramaddr + 4096, np->scriptb0, np->scriptb_sz);
++			phys = scr_to_cpu(np->scr_ram_seg);
++			OUTL(np, nc_mmws, phys);
++			OUTL(np, nc_mmrs, phys);
++			OUTL(np, nc_sfs,  phys);
++			phys = SCRIPTB_BA(np, start64);
+ 		}
+-		else
+-			phys = SCRIPTA_BA (np, init);
+-		OUTRAM_OFF(0, np->scripta0, np->scripta_sz);
+ 	}
+-	else
+-		phys = SCRIPTA_BA (np, init);
+ 
+ 	np->istat_sem = 0;
+ 
+-	OUTL (nc_dsa, np->hcb_ba);
+-	OUTL_DSP (phys);
++	OUTL(np, nc_dsa, np->hcb_ba);
++	OUTL_DSP(np, phys);
+ 
+ 	/*
+ 	 *  Notify the XPT about the RESET condition.
+@@ -2013,16 +1961,16 @@
+ }
+ 
+ /*
+- *  Switch trans mode for current job and it's target.
++ *  Switch trans mode for current job and its target.
+  */
+ static void sym_settrans(struct sym_hcb *np, int target, u_char opts, u_char ofs,
+ 			 u_char per, u_char wide, u_char div, u_char fak)
+ {
+ 	SYM_QUEHEAD *qp;
+ 	u_char sval, wval, uval;
+-	tcb_p tp = &np->target[target];
++	struct sym_tcb *tp = &np->target[target];
+ 
+-	assert(target == (INB (nc_sdid) & 0x0f));
++	assert(target == (INB(np, nc_sdid) & 0x0f));
+ 
+ 	sval = tp->head.sval;
+ 	wval = tp->head.wval;
+@@ -2070,8 +2018,7 @@
+ 			assert(np->features & FE_U3EN);
+ 			uval |= U3EN;
+ 		}
+-	}
+-	else {
++	} else {
+ 		wval = wval & ~ULTRA;
+ 		if (per <= 12)	wval |= ULTRA;
+ 	}
+@@ -2092,23 +2039,23 @@
+ 	 *  Not supported on the C1010.
+ 	 */
+ 	if (per < 50 && !(np->features & FE_C10))
+-		OUTOFFB (nc_stest2, EXT);
++		OUTOFFB(np, nc_stest2, EXT);
+ 
+ 	/*
+ 	 *  set actual value and sync_status
+ 	 */
+-	OUTB (nc_sxfer,  tp->head.sval);
+-	OUTB (nc_scntl3, tp->head.wval);
++	OUTB(np, nc_sxfer,  tp->head.sval);
++	OUTB(np, nc_scntl3, tp->head.wval);
+ 
+ 	if (np->features & FE_C10) {
+-		OUTB (nc_scntl4, tp->head.uval);
++		OUTB(np, nc_scntl4, tp->head.uval);
+ 	}
+ 
+ 	/*
+ 	 *  patch ALL busy ccbs of this target.
+ 	 */
+ 	FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
+-		ccb_p cp;
++		struct sym_ccb *cp;
+ 		cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
+ 		if (cp->target != target)
+ 			continue;
+@@ -2126,16 +2073,24 @@
+  */
+ static void sym_setwide(struct sym_hcb *np, int target, u_char wide)
+ {
+-	tcb_p tp = &np->target[target];
++	struct sym_tcb *tp = &np->target[target];
++	struct scsi_target *starget = tp->sdev->sdev_target;
++
++	if (spi_width(starget) == wide)
++		return;
+ 
+ 	sym_settrans(np, target, 0, 0, 0, wide, 0, 0);
+ 
+-	tp->tinfo.goal.width = tp->tinfo.curr.width = wide;
+-	tp->tinfo.curr.offset = 0;
+-	tp->tinfo.curr.period = 0;
+-	tp->tinfo.curr.options = 0;
++	tp->tgoal.width = wide;
++	spi_offset(starget) = 0;
++	spi_period(starget) = 0;
++	spi_width(starget) = wide;
++	spi_iu(starget) = 0;
++	spi_dt(starget) = 0;
++	spi_qas(starget) = 0;
+ 
+-	sym_xpt_async_nego_wide(np, target);
++	if (sym_verbose >= 3)
++		spi_display_xfer_agreement(starget);
+ }
+ 
+ /*
+@@ -2146,22 +2101,23 @@
+ sym_setsync(struct sym_hcb *np, int target,
+             u_char ofs, u_char per, u_char div, u_char fak)
+ {
+-	tcb_p tp = &np->target[target];
++	struct sym_tcb *tp = &np->target[target];
++	struct scsi_target *starget = tp->sdev->sdev_target;
+ 	u_char wide = (tp->head.wval & EWS) ? BUS_16_BIT : BUS_8_BIT;
+ 
+ 	sym_settrans(np, target, 0, ofs, per, wide, div, fak);
+ 
+-	tp->tinfo.curr.period  = per;
+-	tp->tinfo.curr.offset  = ofs;
+-	tp->tinfo.curr.options = 0;
++	spi_period(starget) = per;
++	spi_offset(starget) = ofs;
++	spi_iu(starget) = spi_dt(starget) = spi_qas(starget) = 0;
+ 
+-	if (!(tp->tinfo.goal.options & PPR_OPT_MASK)) {
+-		tp->tinfo.goal.period	= per;
+-		tp->tinfo.goal.offset	= ofs;
+-		tp->tinfo.goal.options	= 0;
++	if (!tp->tgoal.dt && !tp->tgoal.iu && !tp->tgoal.qas) {
++		tp->tgoal.period = per;
++		tp->tgoal.offset = ofs;
++		tp->tgoal.check_nego = 0;
+ 	}
+ 
+-	sym_xpt_async_nego_sync(np, target);
++	spi_display_xfer_agreement(starget);
+ }
+ 
+ /*
+@@ -2172,16 +2128,20 @@
+ sym_setpprot(struct sym_hcb *np, int target, u_char opts, u_char ofs,
+              u_char per, u_char wide, u_char div, u_char fak)
+ {
+-	tcb_p tp = &np->target[target];
++	struct sym_tcb *tp = &np->target[target];
++	struct scsi_target *starget = tp->sdev->sdev_target;
+ 
+ 	sym_settrans(np, target, opts, ofs, per, wide, div, fak);
+ 
+-	tp->tinfo.goal.width	= tp->tinfo.curr.width  = wide;
+-	tp->tinfo.goal.period	= tp->tinfo.curr.period = per;
+-	tp->tinfo.goal.offset	= tp->tinfo.curr.offset = ofs;
+-	tp->tinfo.goal.options	= tp->tinfo.curr.options = opts;
++	spi_width(starget) = tp->tgoal.width = wide;
++	spi_period(starget) = tp->tgoal.period = per;
++	spi_offset(starget) = tp->tgoal.offset = ofs;
++	spi_iu(starget) = tp->tgoal.iu = !!(opts & PPR_OPT_IU);
++	spi_dt(starget) = tp->tgoal.dt = !!(opts & PPR_OPT_DT);
++	spi_qas(starget) = tp->tgoal.qas = !!(opts & PPR_OPT_QAS);
++	tp->tgoal.check_nego = 0;
+ 
+-	sym_xpt_async_nego_ppr(np, target);
++	spi_display_xfer_agreement(starget);
+ }
+ 
+ /*
+@@ -2212,25 +2172,25 @@
+  */
+ static void sym_recover_scsi_int (struct sym_hcb *np, u_char hsts)
+ {
+-	u32	dsp	= INL (nc_dsp);
+-	u32	dsa	= INL (nc_dsa);
+-	ccb_p cp	= sym_ccb_from_dsa(np, dsa);
++	u32	dsp	= INL(np, nc_dsp);
++	u32	dsa	= INL(np, nc_dsa);
++	struct sym_ccb *cp	= sym_ccb_from_dsa(np, dsa);
+ 
+ 	/*
+ 	 *  If we haven't been interrupted inside the SCRIPTS 
+ 	 *  critical pathes, we can safely restart the SCRIPTS 
+ 	 *  and trust the DSA value if it matches a CCB.
+ 	 */
+-	if ((!(dsp > SCRIPTA_BA (np, getjob_begin) &&
+-	       dsp < SCRIPTA_BA (np, getjob_end) + 1)) &&
+-	    (!(dsp > SCRIPTA_BA (np, ungetjob) &&
+-	       dsp < SCRIPTA_BA (np, reselect) + 1)) &&
+-	    (!(dsp > SCRIPTB_BA (np, sel_for_abort) &&
+-	       dsp < SCRIPTB_BA (np, sel_for_abort_1) + 1)) &&
+-	    (!(dsp > SCRIPTA_BA (np, done) &&
+-	       dsp < SCRIPTA_BA (np, done_end) + 1))) {
+-		OUTB (nc_ctest3, np->rv_ctest3 | CLF);	/* clear dma fifo  */
+-		OUTB (nc_stest3, TE|CSF);		/* clear scsi fifo */
++	if ((!(dsp > SCRIPTA_BA(np, getjob_begin) &&
++	       dsp < SCRIPTA_BA(np, getjob_end) + 1)) &&
++	    (!(dsp > SCRIPTA_BA(np, ungetjob) &&
++	       dsp < SCRIPTA_BA(np, reselect) + 1)) &&
++	    (!(dsp > SCRIPTB_BA(np, sel_for_abort) &&
++	       dsp < SCRIPTB_BA(np, sel_for_abort_1) + 1)) &&
++	    (!(dsp > SCRIPTA_BA(np, done) &&
++	       dsp < SCRIPTA_BA(np, done_end) + 1))) {
++		OUTB(np, nc_ctest3, np->rv_ctest3 | CLF); /* clear dma fifo  */
++		OUTB(np, nc_stest3, TE|CSF);		/* clear scsi fifo */
+ 		/*
+ 		 *  If we have a CCB, let the SCRIPTS call us back for 
+ 		 *  the handling of the error with SCRATCHA filled with 
+@@ -2239,14 +2199,14 @@
+ 		 */
+ 		if (cp) {
+ 			cp->host_status = hsts;
+-			OUTL_DSP (SCRIPTA_BA (np, complete_error));
++			OUTL_DSP(np, SCRIPTA_BA(np, complete_error));
+ 		}
+ 		/*
+ 		 *  Otherwise just restart the SCRIPTS.
+ 		 */
+ 		else {
+-			OUTL (nc_dsa, 0xffffff);
+-			OUTL_DSP (SCRIPTA_BA (np, start));
++			OUTL(np, nc_dsa, 0xffffff);
++			OUTL_DSP(np, SCRIPTA_BA(np, start));
+ 		}
+ 	}
+ 	else
+@@ -2263,11 +2223,11 @@
+  */
+ static void sym_int_sto (struct sym_hcb *np)
+ {
+-	u32 dsp	= INL (nc_dsp);
++	u32 dsp	= INL(np, nc_dsp);
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TINY) printf ("T");
+ 
+-	if (dsp == SCRIPTA_BA (np, wf_sel_done) + 8)
++	if (dsp == SCRIPTA_BA(np, wf_sel_done) + 8)
+ 		sym_recover_scsi_int(np, HS_SEL_TIMEOUT);
+ 	else
+ 		sym_start_reset(np);
+@@ -2294,7 +2254,7 @@
+  */
+ static void sym_int_sbmc (struct sym_hcb *np)
+ {
+-	u_char scsi_mode = INB (nc_stest4) & SMODE;
++	u_char scsi_mode = INB(np, nc_stest4) & SMODE;
+ 
+ 	/*
+ 	 *  Notify user.
+@@ -2335,14 +2295,14 @@
+  */
+ static void sym_int_par (struct sym_hcb *np, u_short sist)
+ {
+-	u_char	hsts	= INB (HS_PRT);
+-	u32	dsp	= INL (nc_dsp);
+-	u32	dbc	= INL (nc_dbc);
+-	u32	dsa	= INL (nc_dsa);
+-	u_char	sbcl	= INB (nc_sbcl);
++	u_char	hsts	= INB(np, HS_PRT);
++	u32	dsp	= INL(np, nc_dsp);
++	u32	dbc	= INL(np, nc_dbc);
++	u32	dsa	= INL(np, nc_dsa);
++	u_char	sbcl	= INB(np, nc_sbcl);
+ 	u_char	cmd	= dbc >> 24;
+ 	int phase	= cmd & 7;
+-	ccb_p	cp	= sym_ccb_from_dsa(np, dsa);
++	struct sym_ccb *cp	= sym_ccb_from_dsa(np, dsa);
+ 
+ 	printf("%s: SCSI parity error detected: SCR1=%d DBC=%x SBCL=%x\n",
+ 		sym_name(np), hsts, dbc, sbcl);
+@@ -2350,7 +2310,7 @@
+ 	/*
+ 	 *  Check that the chip is connected to the SCSI BUS.
+ 	 */
+-	if (!(INB (nc_scntl1) & ISCON)) {
++	if (!(INB(np, nc_scntl1) & ISCON)) {
+ 		sym_recover_scsi_int(np, HS_UNEXPECTED);
+ 		return;
+ 	}
+@@ -2372,7 +2332,7 @@
+ 	/*
+ 	 *  Keep track of the parity error.
+ 	 */
+-	OUTONB (HF_PRT, HF_EXT_ERR);
++	OUTONB(np, HF_PRT, HF_EXT_ERR);
+ 	cp->xerr_status |= XE_PARITY_ERR;
+ 
+ 	/*
+@@ -2389,25 +2349,25 @@
+ 	 */
+ 	if (phase == 1 || phase == 5) {
+ 		/* Phase mismatch handled by SCRIPTS */
+-		if (dsp == SCRIPTB_BA (np, pm_handle))
+-			OUTL_DSP (dsp);
++		if (dsp == SCRIPTB_BA(np, pm_handle))
++			OUTL_DSP(np, dsp);
+ 		/* Phase mismatch handled by the C code */
+ 		else if (sist & MA)
+ 			sym_int_ma (np);
+ 		/* No phase mismatch occurred */
+ 		else {
+ 			sym_set_script_dp (np, cp, dsp);
+-			OUTL_DSP (SCRIPTA_BA (np, dispatch));
++			OUTL_DSP(np, SCRIPTA_BA(np, dispatch));
+ 		}
+ 	}
+ 	else if (phase == 7)	/* We definitely cannot handle parity errors */
+ #if 1				/* in message-in phase due to the relection  */
+ 		goto reset_all; /* path and various message anticipations.   */
+ #else
+-		OUTL_DSP (SCRIPTA_BA (np, clrack));
++		OUTL_DSP(np, SCRIPTA_BA(np, clrack));
+ #endif
+ 	else
+-		OUTL_DSP (SCRIPTA_BA (np, dispatch));
++		OUTL_DSP(np, SCRIPTA_BA(np, dispatch));
+ 	return;
+ 
+ reset_all:
+@@ -2436,11 +2396,11 @@
+ 	u_char	cmd;
+ 	u_char	hflags, hflags0;
+ 	struct	sym_pmc *pm;
+-	ccb_p	cp;
++	struct sym_ccb *cp;
+ 
+-	dsp	= INL (nc_dsp);
+-	dbc	= INL (nc_dbc);
+-	dsa	= INL (nc_dsa);
++	dsp	= INL(np, nc_dsp);
++	dbc	= INL(np, nc_dbc);
++	dsa	= INL(np, nc_dsa);
+ 
+ 	cmd	= dbc >> 24;
+ 	rest	= dbc & 0xffffff;
+@@ -2461,14 +2421,14 @@
+ 		u_char ss0, ss2;
+ 
+ 		if (np->features & FE_DFBC)
+-			delta = INW (nc_dfbc);
++			delta = INW(np, nc_dfbc);
+ 		else {
+ 			u32 dfifo;
+ 
+ 			/*
+ 			 * Read DFIFO, CTEST[4-6] using 1 PCI bus ownership.
+ 			 */
+-			dfifo = INL(nc_dfifo);
++			dfifo = INL(np, nc_dfifo);
+ 
+ 			/*
+ 			 *  Calculate remaining bytes in DMA fifo.
+@@ -2488,29 +2448,29 @@
+ 		 *  Check the sstat2 register in case of wide transfer.
+ 		 */
+ 		rest += delta;
+-		ss0  = INB (nc_sstat0);
++		ss0  = INB(np, nc_sstat0);
+ 		if (ss0 & OLF) rest++;
+ 		if (!(np->features & FE_C10))
+ 			if (ss0 & ORF) rest++;
+ 		if (cp && (cp->phys.select.sel_scntl3 & EWS)) {
+-			ss2 = INB (nc_sstat2);
++			ss2 = INB(np, nc_sstat2);
+ 			if (ss2 & OLF1) rest++;
+ 			if (!(np->features & FE_C10))
+ 				if (ss2 & ORF1) rest++;
+-		};
++		}
+ 
+ 		/*
+ 		 *  Clear fifos.
+ 		 */
+-		OUTB (nc_ctest3, np->rv_ctest3 | CLF);	/* dma fifo  */
+-		OUTB (nc_stest3, TE|CSF);		/* scsi fifo */
++		OUTB(np, nc_ctest3, np->rv_ctest3 | CLF);	/* dma fifo  */
++		OUTB(np, nc_stest3, TE|CSF);		/* scsi fifo */
+ 	}
+ 
+ 	/*
+ 	 *  log the information
+ 	 */
+ 	if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_PHASE))
+-		printf ("P%x%x RL=%d D=%d ", cmd&7, INB(nc_sbcl)&7,
++		printf ("P%x%x RL=%d D=%d ", cmd&7, INB(np, nc_sbcl)&7,
+ 			(unsigned) rest, (unsigned) delta);
+ 
+ 	/*
+@@ -2536,7 +2496,7 @@
+ 	if (DEBUG_FLAGS & DEBUG_PHASE) {
+ 		printf ("\nCP=%p DSP=%x NXT=%x VDSP=%p CMD=%x ",
+ 			cp, (unsigned)dsp, (unsigned)nxtdsp, vdsp, cmd);
+-	};
++	}
+ 
+ 	if (!vdsp) {
+ 		printf ("%s: interrupted SCRIPT address not found.\n", 
+@@ -2562,7 +2522,7 @@
+ 	} else {
+ 		tblp = (u32 *) 0;
+ 		olen = scr_to_cpu(vdsp[0]) & 0xffffff;
+-	};
++	}
+ 
+ 	if (DEBUG_FLAGS & DEBUG_PHASE) {
+ 		printf ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n",
+@@ -2570,7 +2530,7 @@
+ 			tblp,
+ 			(unsigned) olen,
+ 			(unsigned) oadr);
+-	};
++	}
+ 
+ 	/*
+ 	 *  check cmd against assumed interrupted script command.
+@@ -2578,23 +2538,23 @@
+ 	 *  the phase.
+ 	 */
+ 	if (((cmd & 2) ? cmd : (cmd & ~4)) != (scr_to_cpu(vdsp[0]) >> 24)) {
+-		PRINT_ADDR(cp);
+-		printf ("internal error: cmd=%02x != %02x=(vdsp[0] >> 24)\n",
+-			(unsigned)cmd, (unsigned)scr_to_cpu(vdsp[0]) >> 24);
++		sym_print_addr(cp->cmd,
++			"internal error: cmd=%02x != %02x=(vdsp[0] >> 24)\n",
++			cmd, scr_to_cpu(vdsp[0]) >> 24);
+ 
+ 		goto reset_all;
+-	};
++	}
+ 
+ 	/*
+ 	 *  if old phase not dataphase, leave here.
+ 	 */
+ 	if (cmd & 2) {
+-		PRINT_ADDR(cp);
+-		printf ("phase change %x-%x %d@%08x resid=%d.\n",
+-			cmd&7, INB(nc_sbcl)&7, (unsigned)olen,
++		sym_print_addr(cp->cmd,
++			"phase change %x-%x %d@%08x resid=%d.\n",
++			cmd&7, INB(np, nc_sbcl)&7, (unsigned)olen,
+ 			(unsigned)oadr, (unsigned)rest);
+ 		goto unexpected_phase;
+-	};
++	}
+ 
+ 	/*
+ 	 *  Choose the correct PM save area.
+@@ -2604,7 +2564,7 @@
+ 	 *  SCRIPTS for the 895A, 896 and 1010 that are able to 
+ 	 *  handle PM from the SCRIPTS processor.
+ 	 */
+-	hflags0 = INB (HF_PRT);
++	hflags0 = INB(np, HF_PRT);
+ 	hflags = hflags0;
+ 
+ 	if (hflags & (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED)) {
+@@ -2619,16 +2579,16 @@
+ 
+ 	if (!(hflags & HF_ACT_PM)) {
+ 		pm = &cp->phys.pm0;
+-		newcmd = SCRIPTA_BA (np, pm0_data);
++		newcmd = SCRIPTA_BA(np, pm0_data);
+ 	}
+ 	else {
+ 		pm = &cp->phys.pm1;
+-		newcmd = SCRIPTA_BA (np, pm1_data);
++		newcmd = SCRIPTA_BA(np, pm1_data);
+ 	}
+ 
+ 	hflags &= ~(HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED);
+ 	if (hflags != hflags0)
+-		OUTB (HF_PRT, hflags);
++		OUTB(np, HF_PRT, hflags);
+ 
+ 	/*
+ 	 *  fillin the phase mismatch context
+@@ -2643,9 +2603,9 @@
+ 	 *  - compute the SCRIPTS address to restart from,
+ 	 *  - move current data pointer context by one byte.
+ 	 */
+-	nxtdsp = SCRIPTA_BA (np, dispatch);
++	nxtdsp = SCRIPTA_BA(np, dispatch);
+ 	if ((cmd & 7) == 1 && cp && (cp->phys.select.sel_scntl3 & EWS) &&
+-	    (INB (nc_scntl2) & WSR)) {
++	    (INB(np, nc_scntl2) & WSR)) {
+ 		u32 tmp;
+ 
+ 		/*
+@@ -2671,12 +2631,11 @@
+ 		 *  Prepare the address of SCRIPTS that will 
+ 		 *  move the residual byte to memory.
+ 		 */
+-		nxtdsp = SCRIPTB_BA (np, wsr_ma_helper);
++		nxtdsp = SCRIPTB_BA(np, wsr_ma_helper);
+ 	}
+ 
+ 	if (DEBUG_FLAGS & DEBUG_PHASE) {
+-		PRINT_ADDR(cp);
+-		printf ("PM %x %x %x / %x %x %x.\n",
++		sym_print_addr(cp->cmd, "PM %x %x %x / %x %x %x.\n",
+ 			hflags0, hflags, newcmd,
+ 			(unsigned)scr_to_cpu(pm->sg.addr),
+ 			(unsigned)scr_to_cpu(pm->sg.size),
+@@ -2687,7 +2646,7 @@
+ 	 *  Restart the SCRIPTS processor.
+ 	 */
+ 	sym_set_script_dp (np, cp, newcmd);
+-	OUTL_DSP (nxtdsp);
++	OUTL_DSP(np, nxtdsp);
+ 	return;
+ 
+ 	/*
+@@ -2723,11 +2682,11 @@
+ 
+ 	switch (cmd & 7) {
+ 	case 2:	/* COMMAND phase */
+-		nxtdsp = SCRIPTA_BA (np, dispatch);
++		nxtdsp = SCRIPTA_BA(np, dispatch);
+ 		break;
+ #if 0
+ 	case 3:	/* STATUS  phase */
+-		nxtdsp = SCRIPTA_BA (np, dispatch);
++		nxtdsp = SCRIPTA_BA(np, dispatch);
+ 		break;
+ #endif
+ 	case 6:	/* MSG OUT phase */
+@@ -2737,30 +2696,34 @@
+ 		 *  since we will not be able to handle reselect.
+ 		 *  Otherwise, we just don't care.
+ 		 */
+-		if	(dsp == SCRIPTA_BA (np, send_ident)) {
++		if	(dsp == SCRIPTA_BA(np, send_ident)) {
+ 			if (cp->tag != NO_TAG && olen - rest <= 3) {
+ 				cp->host_status = HS_BUSY;
+ 				np->msgout[0] = IDENTIFY(0, cp->lun);
+-				nxtdsp = SCRIPTB_BA (np, ident_break_atn);
++				nxtdsp = SCRIPTB_BA(np, ident_break_atn);
+ 			}
+ 			else
+-				nxtdsp = SCRIPTB_BA (np, ident_break);
++				nxtdsp = SCRIPTB_BA(np, ident_break);
+ 		}
+-		else if	(dsp == SCRIPTB_BA (np, send_wdtr) ||
+-			 dsp == SCRIPTB_BA (np, send_sdtr) ||
+-			 dsp == SCRIPTB_BA (np, send_ppr)) {
+-			nxtdsp = SCRIPTB_BA (np, nego_bad_phase);
++		else if	(dsp == SCRIPTB_BA(np, send_wdtr) ||
++			 dsp == SCRIPTB_BA(np, send_sdtr) ||
++			 dsp == SCRIPTB_BA(np, send_ppr)) {
++			nxtdsp = SCRIPTB_BA(np, nego_bad_phase);
++			if (dsp == SCRIPTB_BA(np, send_ppr)) {
++				struct scsi_device *dev = cp->cmd->device;
++				dev->ppr = 0;
++			}
+ 		}
+ 		break;
+ #if 0
+ 	case 7:	/* MSG IN  phase */
+-		nxtdsp = SCRIPTA_BA (np, clrack);
++		nxtdsp = SCRIPTA_BA(np, clrack);
+ 		break;
+ #endif
+ 	}
+ 
+ 	if (nxtdsp) {
+-		OUTL_DSP (nxtdsp);
++		OUTL_DSP(np, nxtdsp);
+ 		return;
+ 	}
+ 
+@@ -2848,20 +2811,20 @@
+ 	 *  Note that SCRIPTS also (dummy) read to memory 
+ 	 *  prior to deliver the INTF interrupt condition.
+ 	 */
+-	istat = INB (nc_istat);
++	istat = INB(np, nc_istat);
+ 	if (istat & INTF) {
+-		OUTB (nc_istat, (istat & SIGP) | INTF | np->istat_sem);
+-		istat = INB (nc_istat);		/* DUMMY READ */
++		OUTB(np, nc_istat, (istat & SIGP) | INTF | np->istat_sem);
++		istat = INB(np, nc_istat);		/* DUMMY READ */
+ 		if (DEBUG_FLAGS & DEBUG_TINY) printf ("F ");
+-		(void)sym_wakeup_done (np);
+-	};
++		sym_wakeup_done(np);
++	}
+ 
+ 	if (!(istat & (SIP|DIP)))
+ 		return;
+ 
+ #if 0	/* We should never get this one */
+ 	if (istat & CABRT)
+-		OUTB (nc_istat, CABRT);
++		OUTB(np, nc_istat, CABRT);
+ #endif
+ 
+ 	/*
+@@ -2879,19 +2842,19 @@
+ 	istatc	= istat;
+ 	do {
+ 		if (istatc & SIP)
+-			sist  |= INW (nc_sist);
++			sist  |= INW(np, nc_sist);
+ 		if (istatc & DIP)
+-			dstat |= INB (nc_dstat);
+-		istatc = INB (nc_istat);
++			dstat |= INB(np, nc_dstat);
++		istatc = INB(np, nc_istat);
+ 		istat |= istatc;
+ 	} while (istatc & (SIP|DIP));
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TINY)
+ 		printf ("<%d|%x:%x|%x:%x>",
+-			(int)INB(nc_scr0),
++			(int)INB(np, nc_scr0),
+ 			dstat,sist,
+-			(unsigned)INL(nc_dsp),
+-			(unsigned)INL(nc_dbc));
++			(unsigned)INL(np, nc_dsp),
++			(unsigned)INL(np, nc_dbc));
+ 	/*
+ 	 *  On paper, a memory read barrier may be needed here to 
+ 	 *  prevent out of order LOADs by the CPU from having 
+@@ -2918,10 +2881,10 @@
+ 		if	(sist & PAR)	sym_int_par (np, sist);
+ 		else if (sist & MA)	sym_int_ma (np);
+ 		else if (dstat & SIR)	sym_int_sir (np);
+-		else if (dstat & SSI)	OUTONB_STD ();
++		else if (dstat & SSI)	OUTONB_STD();
+ 		else			goto unknown_int;
+ 		return;
+-	};
++	}
+ 
+ 	/*
+ 	 *  Now, interrupts that donnot happen in normal 
+@@ -2938,10 +2901,10 @@
+ 		printf("%s: SCSI BUS reset detected.\n", sym_name(np));
+ 		sym_start_up (np, 1);
+ 		return;
+-	};
++	}
+ 
+-	OUTB (nc_ctest3, np->rv_ctest3 | CLF);	/* clear dma fifo  */
+-	OUTB (nc_stest3, TE|CSF);		/* clear scsi fifo */
++	OUTB(np, nc_ctest3, np->rv_ctest3 | CLF);	/* clear dma fifo  */
++	OUTB(np, nc_stest3, TE|CSF);		/* clear scsi fifo */
+ 
+ 	if (!(sist  & (GEN|HTH|SGE)) &&
+ 	    !(dstat & (MDPE|BF|ABRT|IID))) {
+@@ -2950,7 +2913,7 @@
+ 		else if (sist & UDC)	sym_int_udc (np);
+ 		else			goto unknown_int;
+ 		return;
+-	};
++	}
+ 
+ 	/*
+ 	 *  Now, interrupts we are not able to recover cleanly.
+@@ -2965,7 +2928,7 @@
+ 		(dstat & (MDPE|BF|ABRT|IID))) {
+ 		sym_start_reset(np);
+ 		return;
+-	};
++	}
+ 
+ unknown_int:
+ 	/*
+@@ -2989,7 +2952,7 @@
+ sym_dequeue_from_squeue(struct sym_hcb *np, int i, int target, int lun, int task)
+ {
+ 	int j;
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 
+ 	/*
+ 	 *  Make sure the starting index is within range.
+@@ -3011,7 +2974,7 @@
+ 		if ((target == -1 || cp->target == target) &&
+ 		    (lun    == -1 || cp->lun    == lun)    &&
+ 		    (task   == -1 || cp->tag    == task)) {
+-			sym_set_cam_status(cp->cam_ccb, CAM_REQUEUE_REQ);
++			sym_set_cam_status(cp->cmd, CAM_REQUEUE_REQ);
+ 			sym_remque(&cp->link_ccbq);
+ 			sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
+ 		}
+@@ -3047,9 +3010,8 @@
+  *  SCRATCHA is assumed to have been loaded with STARTPOS 
+  *  before the SCRIPTS called the C code.
+  */
+-static void sym_sir_bad_scsi_status(struct sym_hcb *np, int num, ccb_p cp)
++static void sym_sir_bad_scsi_status(struct sym_hcb *np, int num, struct sym_ccb *cp)
+ {
+-	tcb_p tp	= &np->target[cp->target];
+ 	u32		startp;
+ 	u_char		s_status = cp->ssss_status;
+ 	u_char		h_flags  = cp->host_flags;
+@@ -3059,7 +3021,7 @@
+ 	/*
+ 	 *  Compute the index of the next job to start from SCRIPTS.
+ 	 */
+-	i = (INL (nc_scratcha) - np->squeue_ba) / 4;
++	i = (INL(np, nc_scratcha) - np->squeue_ba) / 4;
+ 
+ 	/*
+ 	 *  The last CCB queued used for IARB hint may be 
+@@ -3077,8 +3039,7 @@
+ 	case S_BUSY:
+ 	case S_QUEUE_FULL:
+ 		if (sym_verbose >= 2) {
+-			PRINT_ADDR(cp);
+-			printf ("%s\n",
++			sym_print_addr(cp->cmd, "%s\n",
+ 			        s_status == S_BUSY ? "BUSY" : "QUEUE FULL\n");
+ 		}
+ 	default:	/* S_INT, S_INT_COND_MET, S_CONFLICT */
+@@ -3098,8 +3059,8 @@
+ 		 *  Dequeue all queued CCBs for that device not yet started,
+ 		 *  and restart the SCRIPTS processor immediately.
+ 		 */
+-		(void) sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
+-		OUTL_DSP (SCRIPTA_BA (np, start));
++		sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
++		OUTL_DSP(np, SCRIPTA_BA(np, start));
+ 
+  		/*
+ 		 *  Save some info of the actual IO.
+@@ -3132,13 +3093,13 @@
+ 		/*
+ 		 *  Message table indirect structure.
+ 		 */
+-		cp->phys.smsg.addr	= cpu_to_scr(CCB_BA (cp, scsi_smsg2));
++		cp->phys.smsg.addr	= cpu_to_scr(CCB_BA(cp, scsi_smsg2));
+ 		cp->phys.smsg.size	= cpu_to_scr(msglen);
+ 
+ 		/*
+ 		 *  sense command
+ 		 */
+-		cp->phys.cmd.addr	= cpu_to_scr(CCB_BA (cp, sensecmd));
++		cp->phys.cmd.addr	= cpu_to_scr(CCB_BA(cp, sensecmd));
+ 		cp->phys.cmd.size	= cpu_to_scr(6);
+ 
+ 		/*
+@@ -3146,7 +3107,7 @@
+ 		 */
+ 		cp->sensecmd[0]		= REQUEST_SENSE;
+ 		cp->sensecmd[1]		= 0;
+-		if (tp->tinfo.curr.scsi_version <= 2 && cp->lun <= 7)
++		if (cp->cmd->device->scsi_level <= SCSI_2 && cp->lun <= 7)
+ 			cp->sensecmd[1]	= cp->lun << 5;
+ 		cp->sensecmd[4]		= SYM_SNS_BBUF_LEN;
+ 		cp->data_len		= SYM_SNS_BBUF_LEN;
+@@ -3155,13 +3116,13 @@
+ 		 *  sense data
+ 		 */
+ 		memset(cp->sns_bbuf, 0, SYM_SNS_BBUF_LEN);
+-		cp->phys.sense.addr	= cpu_to_scr(vtobus(cp->sns_bbuf));
++		cp->phys.sense.addr	= cpu_to_scr(CCB_BA(cp, sns_bbuf));
+ 		cp->phys.sense.size	= cpu_to_scr(SYM_SNS_BBUF_LEN);
+ 
+ 		/*
+ 		 *  requeue the command.
+ 		 */
+-		startp = SCRIPTB_BA (np, sdata_in);
++		startp = SCRIPTB_BA(np, sdata_in);
+ 
+ 		cp->phys.head.savep	= cpu_to_scr(startp);
+ 		cp->phys.head.lastp	= cpu_to_scr(startp);
+@@ -3175,7 +3136,7 @@
+ 		cp->xerr_status = 0;
+ 		cp->extra_bytes = 0;
+ 
+-		cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA (np, select));
++		cp->phys.head.go.start = cpu_to_scr(SCRIPTA_BA(np, select));
+ 
+ 		/*
+ 		 *  Requeue the command.
+@@ -3208,7 +3169,7 @@
+ {
+ 	SYM_QUEHEAD qtmp, *qp;
+ 	int i = 0;
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 
+ 	/*
+ 	 *  Move the entire BUSY queue to our temporary queue.
+@@ -3223,9 +3184,9 @@
+ 	 *  the BUSY queue.
+ 	 */
+ 	while ((qp = sym_remque_head(&qtmp)) != 0) {
+-		struct scsi_cmnd *ccb;
++		struct scsi_cmnd *cmd;
+ 		cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
+-		ccb = cp->cam_ccb;
++		cmd = cp->cmd;
+ 		if (cp->host_status != HS_DISCONNECT ||
+ 		    cp->target != target	     ||
+ 		    (lun  != -1 && cp->lun != lun)   ||
+@@ -3237,8 +3198,8 @@
+ 		sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
+ 
+ 		/* Preserve the software timeout condition */
+-		if (sym_get_cam_status(ccb) != CAM_CMD_TIMEOUT)
+-			sym_set_cam_status(ccb, cam_status);
++		if (sym_get_cam_status(cmd) != CAM_CMD_TIMEOUT)
++			sym_set_cam_status(cmd, cam_status);
+ 		++i;
+ #if 0
+ printf("XXXX TASK @%p CLEARED\n", cp);
+@@ -3290,8 +3251,9 @@
+ static void sym_sir_task_recovery(struct sym_hcb *np, int num)
+ {
+ 	SYM_QUEHEAD *qp;
+-	ccb_p cp;
+-	tcb_p tp;
++	struct sym_ccb *cp;
++	struct sym_tcb *tp = NULL; /* gcc isn't quite smart enough yet */
++	struct scsi_target *starget;
+ 	int target=-1, lun=-1, task;
+ 	int i, k;
+ 
+@@ -3349,8 +3311,8 @@
+ 			np->abrt_sel.sel_id	= target;
+ 			np->abrt_sel.sel_scntl3 = tp->head.wval;
+ 			np->abrt_sel.sel_sxfer  = tp->head.sval;
+-			OUTL(nc_dsa, np->hcb_ba);
+-			OUTL_DSP (SCRIPTB_BA (np, sel_for_abort));
++			OUTL(np, nc_dsa, np->hcb_ba);
++			OUTL_DSP(np, SCRIPTB_BA(np, sel_for_abort));
+ 			return;
+ 		}
+ 
+@@ -3389,7 +3351,7 @@
+ 			 *  Remove the SEM flag from the ISTAT.
+ 			 */
+ 			np->istat_sem = 0;
+-			OUTB (nc_istat, SIGP);
++			OUTB(np, nc_istat, SIGP);
+ 			break;
+ 		}
+ 		/*
+@@ -3397,14 +3359,14 @@
+ 		 *  queue the SCRIPTS intends to start and dequeue 
+ 		 *  all CCBs for that device that haven't been started.
+ 		 */
+-		i = (INL (nc_scratcha) - np->squeue_ba) / 4;
++		i = (INL(np, nc_scratcha) - np->squeue_ba) / 4;
+ 		i = sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
+ 
+ 		/*
+ 		 *  Make sure at least our IO to abort has been dequeued.
+ 		 */
+ #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
+-		assert(i && sym_get_cam_status(cp->cam_ccb) == CAM_REQUEUE_REQ);
++		assert(i && sym_get_cam_status(cp->cmd) == CAM_REQUEUE_REQ);
+ #else
+ 		sym_remque(&cp->link_ccbq);
+ 		sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
+@@ -3413,9 +3375,9 @@
+ 		 *  Keep track in cam status of the reason of the abort.
+ 		 */
+ 		if (cp->to_abort == 2)
+-			sym_set_cam_status(cp->cam_ccb, CAM_CMD_TIMEOUT);
++			sym_set_cam_status(cp->cmd, CAM_CMD_TIMEOUT);
+ 		else
+-			sym_set_cam_status(cp->cam_ccb, CAM_REQ_ABORTED);
++			sym_set_cam_status(cp->cmd, CAM_REQ_ABORTED);
+ 
+ 		/*
+ 		 *  Complete with error everything that we have dequeued.
+@@ -3427,7 +3389,7 @@
+ 	 *  we may have some manual recovery to perform for.
+ 	 */
+ 	case SIR_TARGET_SELECTED:
+-		target = (INB (nc_sdid) & 0xf);
++		target = INB(np, nc_sdid) & 0xf;
+ 		tp = &np->target[target];
+ 
+ 		np->abrt_tbl.addr = cpu_to_scr(vtobus(np->abrt_msg));
+@@ -3463,7 +3425,7 @@
+ 		 *  an IDENTIFY(lun) + ABORT MESSAGE.
+ 		 */
+ 		if (lun != -1) {
+-			lcb_p lp = sym_lp(np, tp, lun);
++			struct sym_lcb *lp = sym_lp(tp, lun);
+ 			lp->to_clear = 0; /* We don't expect to fail here */
+ 			np->abrt_msg[0] = IDENTIFY(0, lun);
+ 			np->abrt_msg[1] = M_ABORT;
+@@ -3529,7 +3491,7 @@
+ 		 *  conditions not due to timeout.
+ 		 */
+ 		if (cp->to_abort == 2)
+-			sym_set_cam_status(cp->cam_ccb, CAM_CMD_TIMEOUT);
++			sym_set_cam_status(cp->cmd, CAM_CMD_TIMEOUT);
+ 		cp->to_abort = 0; /* We donnot expect to fail here */
+ 		break;
+ 
+@@ -3538,8 +3500,9 @@
+ 	 *  to BUS FREE phase as we expected.
+ 	 */
+ 	case SIR_ABORT_SENT:
+-		target = (INB (nc_sdid) & 0xf);
++		target = INB(np, nc_sdid) & 0xf;
+ 		tp = &np->target[target];
++		starget = tp->sdev->sdev_target;
+ 		
+ 		/*
+ 		**  If we didn't abort anything, leave here.
+@@ -3561,10 +3524,13 @@
+ 			tp->head.sval = 0;
+ 			tp->head.wval = np->rv_scntl3;
+ 			tp->head.uval = 0;
+-			tp->tinfo.curr.period = 0;
+-			tp->tinfo.curr.offset = 0;
+-			tp->tinfo.curr.width  = BUS_8_BIT;
+-			tp->tinfo.curr.options = 0;
++			spi_period(starget) = 0;
++			spi_offset(starget) = 0;
++			spi_width(starget) = 0;
++			spi_iu(starget) = 0;
++			spi_dt(starget) = 0;
++			spi_qas(starget) = 0;
++			tp->tgoal.check_nego = 1;
+ 		}
+ 
+ 		/*
+@@ -3583,9 +3549,9 @@
+ 		 *  Complete all the CCBs the device should have 
+ 		 *  aborted due to our 'kiss of death' message.
+ 		 */
+-		i = (INL (nc_scratcha) - np->squeue_ba) / 4;
+-		(void) sym_dequeue_from_squeue(np, i, target, lun, -1);
+-		(void) sym_clear_tasks(np, CAM_REQ_ABORTED, target, lun, task);
++		i = (INL(np, nc_scratcha) - np->squeue_ba) / 4;
++		sym_dequeue_from_squeue(np, i, target, lun, -1);
++		sym_clear_tasks(np, CAM_REQ_ABORTED, target, lun, task);
+ 		sym_flush_comp_queue(np, 0);
+ 
+  		/*
+@@ -3600,16 +3566,15 @@
+ 	 *  Print to the log the message we intend to send.
+ 	 */
+ 	if (num == SIR_TARGET_SELECTED) {
+-		PRINT_TARGET(np, target);
+-		sym_printl_hex("control msgout:", np->abrt_msg,
+-			      np->abrt_tbl.size);
++		dev_info(&tp->sdev->sdev_target->dev, "control msgout:");
++		sym_printl_hex(np->abrt_msg, np->abrt_tbl.size);
+ 		np->abrt_tbl.size = cpu_to_scr(np->abrt_tbl.size);
+ 	}
+ 
+ 	/*
+ 	 *  Let the SCRIPTS processor continue.
+ 	 */
+-	OUTONB_STD ();
++	OUTONB_STD();
+ }
+ 
+ /*
+@@ -3617,7 +3582,7 @@
+  *  pointer for both MDP and the residual calculation.
+  *
+  *  I didn't want to bloat the code by more than 200 
+- *  lignes for the handling of both MDP and the residual.
++ *  lines for the handling of both MDP and the residual.
+  *  This has been achieved by using a data pointer 
+  *  representation consisting in an index in the data 
+  *  array (dp_sg) and a negative offset (dp_ofs) that 
+@@ -3639,7 +3604,7 @@
+  *  the corresponding values of dp_sg and dp_ofs.
+  */
+ 
+-static int sym_evaluate_dp(struct sym_hcb *np, ccb_p cp, u32 scr, int *ofs)
++static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int *ofs)
+ {
+ 	u32	dp_scr;
+ 	int	dp_ofs, dp_sg, dp_sgmin;
+@@ -3652,9 +3617,9 @@
+ 	 */
+ 	dp_scr = scr;
+ 	dp_ofs = *ofs;
+-	if	(dp_scr == SCRIPTA_BA (np, pm0_data))
++	if	(dp_scr == SCRIPTA_BA(np, pm0_data))
+ 		pm = &cp->phys.pm0;
+-	else if (dp_scr == SCRIPTA_BA (np, pm1_data))
++	else if (dp_scr == SCRIPTA_BA(np, pm1_data))
+ 		pm = &cp->phys.pm1;
+ 	else
+ 		pm = NULL;
+@@ -3757,7 +3722,7 @@
+  *  is equivalent to a MODIFY DATA POINTER (offset=-1).
+  */
+ 
+-static void sym_modify_dp(struct sym_hcb *np, tcb_p tp, ccb_p cp, int ofs)
++static void sym_modify_dp(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp, int ofs)
+ {
+ 	int dp_ofs	= ofs;
+ 	u32	dp_scr	= sym_get_script_dp (np, cp);
+@@ -3800,23 +3765,23 @@
+ 	/*
+ 	 *  Get a context for the new current data pointer.
+ 	 */
+-	hflags = INB (HF_PRT);
++	hflags = INB(np, HF_PRT);
+ 
+ 	if (hflags & HF_DP_SAVED)
+ 		hflags ^= HF_ACT_PM;
+ 
+ 	if (!(hflags & HF_ACT_PM)) {
+ 		pm  = &cp->phys.pm0;
+-		dp_scr = SCRIPTA_BA (np, pm0_data);
++		dp_scr = SCRIPTA_BA(np, pm0_data);
+ 	}
+ 	else {
+ 		pm = &cp->phys.pm1;
+-		dp_scr = SCRIPTA_BA (np, pm1_data);
++		dp_scr = SCRIPTA_BA(np, pm1_data);
+ 	}
+ 
+ 	hflags &= ~(HF_DP_SAVED);
+ 
+-	OUTB (HF_PRT, hflags);
++	OUTB(np, HF_PRT, hflags);
+ 
+ 	/*
+ 	 *  Set up the new current data pointer.
+@@ -3833,11 +3798,11 @@
+ 
+ out_ok:
+ 	sym_set_script_dp (np, cp, dp_scr);
+-	OUTL_DSP (SCRIPTA_BA (np, clrack));
++	OUTL_DSP(np, SCRIPTA_BA(np, clrack));
+ 	return;
+ 
+ out_reject:
+-	OUTL_DSP (SCRIPTB_BA (np, msg_bad));
++	OUTL_DSP(np, SCRIPTB_BA(np, msg_bad));
+ }
+ 
+ 
+@@ -3856,7 +3821,7 @@
+  *  a relevant information. :)
+  */
+ 
+-int sym_compute_residual(struct sym_hcb *np, ccb_p cp)
++int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp)
+ {
+ 	int dp_sg, dp_sgmin, resid = 0;
+ 	int dp_ofs = 0;
+@@ -3956,13 +3921,14 @@
+  *  chip handler for SYNCHRONOUS DATA TRANSFER REQUEST (SDTR) message.
+  */
+ static int  
+-sym_sync_nego_check(struct sym_hcb *np, int req, int target)
++sym_sync_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp)
+ {
++	int target = cp->target;
+ 	u_char	chg, ofs, per, fak, div;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_NEGO) {
+ 		sym_print_nego_msg(np, target, "sync msgin", np->msgin);
+-	};
++	}
+ 
+ 	/*
+ 	 *  Get requested values.
+@@ -3992,9 +3958,9 @@
+ 		goto reject_it;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_NEGO) {
+-		PRINT_TARGET(np, target);
+-		printf ("sdtr: ofs=%d per=%d div=%d fak=%d chg=%d.\n",
+-			ofs, per, div, fak, chg);
++		sym_print_addr(cp->cmd,
++				"sdtr: ofs=%d per=%d div=%d fak=%d chg=%d.\n",
++				ofs, per, div, fak, chg);
+ 	}
+ 
+ 	/*
+@@ -4037,7 +4003,7 @@
+ 	return -1;
+ }
+ 
+-static void sym_sync_nego(struct sym_hcb *np, tcb_p tp, ccb_p cp)
++static void sym_sync_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
+ {
+ 	int req = 1;
+ 	int result;
+@@ -4045,8 +4011,8 @@
+ 	/*
+ 	 *  Request or answer ?
+ 	 */
+-	if (INB (HS_PRT) == HS_NEGOTIATE) {
+-		OUTB (HS_PRT, HS_BUSY);
++	if (INB(np, HS_PRT) == HS_NEGOTIATE) {
++		OUTB(np, HS_PRT, HS_BUSY);
+ 		if (cp->nego_status && cp->nego_status != NS_SYNC)
+ 			goto reject_it;
+ 		req = 0;
+@@ -4055,19 +4021,19 @@
+ 	/*
+ 	 *  Check and apply new values.
+ 	 */
+-	result = sym_sync_nego_check(np, req, cp->target);
++	result = sym_sync_nego_check(np, req, cp);
+ 	if (result)	/* Not acceptable, reject it */
+ 		goto reject_it;
+ 	if (req) {	/* Was a request, send response. */
+ 		cp->nego_status = NS_SYNC;
+-		OUTL_DSP (SCRIPTB_BA (np, sdtr_resp));
++		OUTL_DSP(np, SCRIPTB_BA(np, sdtr_resp));
+ 	}
+ 	else		/* Was a response, we are done. */
+-		OUTL_DSP (SCRIPTA_BA (np, clrack));
++		OUTL_DSP(np, SCRIPTA_BA(np, clrack));
+ 	return;
+ 
+ reject_it:
+-	OUTL_DSP (SCRIPTB_BA (np, msg_bad));
++	OUTL_DSP(np, SCRIPTB_BA(np, msg_bad));
+ }
+ 
+ /*
+@@ -4076,7 +4042,7 @@
+ static int 
+ sym_ppr_nego_check(struct sym_hcb *np, int req, int target)
+ {
+-	tcb_p tp = &np->target[target];
++	struct sym_tcb *tp = &np->target[target];
+ 	unsigned char fak, div;
+ 	int dt, chg = 0;
+ 
+@@ -4096,10 +4062,7 @@
+ 		chg = 1;
+ 		wide = np->maxwide;
+ 	}
+-	if (!wide || !(np->features & FE_ULTRA3))
+-		opts = 0;
+-
+-	if (!(np->features & FE_U3EN))	/* Broken U3EN bit not supported */
++	if (!wide || !(np->features & FE_U3EN))
+ 		opts = 0;
+ 
+ 	if (opts != (np->msgin[7] & PPR_OPT_MASK))
+@@ -4175,15 +4138,16 @@
+ 	 *  ST, we may want to try a legacy negotiation later.
+ 	 */
+ 	if (!req && !opts) {
+-		tp->tinfo.goal.options = 0;
+-		tp->tinfo.goal.width   = wide;
+-		tp->tinfo.goal.period  = per;
+-		tp->tinfo.goal.offset  = ofs;
++		tp->tgoal.period = per;
++		tp->tgoal.offset = ofs;
++		tp->tgoal.width = wide;
++		tp->tgoal.iu = tp->tgoal.dt = tp->tgoal.qas = 0;
++		tp->tgoal.check_nego = 1;
+ 	}
+ 	return -1;
+ }
+ 
+-static void sym_ppr_nego(struct sym_hcb *np, tcb_p tp, ccb_p cp)
++static void sym_ppr_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
+ {
+ 	int req = 1;
+ 	int result;
+@@ -4191,8 +4155,8 @@
+ 	/*
+ 	 *  Request or answer ?
+ 	 */
+-	if (INB (HS_PRT) == HS_NEGOTIATE) {
+-		OUTB (HS_PRT, HS_BUSY);
++	if (INB(np, HS_PRT) == HS_NEGOTIATE) {
++		OUTB(np, HS_PRT, HS_BUSY);
+ 		if (cp->nego_status && cp->nego_status != NS_PPR)
+ 			goto reject_it;
+ 		req = 0;
+@@ -4206,27 +4170,28 @@
+ 		goto reject_it;
+ 	if (req) {	/* Was a request, send response. */
+ 		cp->nego_status = NS_PPR;
+-		OUTL_DSP (SCRIPTB_BA (np, ppr_resp));
++		OUTL_DSP(np, SCRIPTB_BA(np, ppr_resp));
+ 	}
+ 	else		/* Was a response, we are done. */
+-		OUTL_DSP (SCRIPTA_BA (np, clrack));
++		OUTL_DSP(np, SCRIPTA_BA(np, clrack));
+ 	return;
+ 
+ reject_it:
+-	OUTL_DSP (SCRIPTB_BA (np, msg_bad));
++	OUTL_DSP(np, SCRIPTB_BA(np, msg_bad));
+ }
+ 
+ /*
+  *  chip handler for WIDE DATA TRANSFER REQUEST (WDTR) message.
+  */
+ static int  
+-sym_wide_nego_check(struct sym_hcb *np, int req, int target)
++sym_wide_nego_check(struct sym_hcb *np, int req, struct sym_ccb *cp)
+ {
++	int target = cp->target;
+ 	u_char	chg, wide;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_NEGO) {
+ 		sym_print_nego_msg(np, target, "wide msgin", np->msgin);
+-	};
++	}
+ 
+ 	/*
+ 	 *  Get requested values.
+@@ -4243,8 +4208,8 @@
+ 	}
+ 
+ 	if (DEBUG_FLAGS & DEBUG_NEGO) {
+-		PRINT_TARGET(np, target);
+-		printf ("wdtr: wide=%d chg=%d.\n", wide, chg);
++		sym_print_addr(cp->cmd, "wdtr: wide=%d chg=%d.\n",
++				wide, chg);
+ 	}
+ 
+ 	/*
+@@ -4285,7 +4250,7 @@
+ 	return -1;
+ }
+ 
+-static void sym_wide_nego(struct sym_hcb *np, tcb_p tp, ccb_p cp)
++static void sym_wide_nego(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
+ {
+ 	int req = 1;
+ 	int result;
+@@ -4293,8 +4258,8 @@
+ 	/*
+ 	 *  Request or answer ?
+ 	 */
+-	if (INB (HS_PRT) == HS_NEGOTIATE) {
+-		OUTB (HS_PRT, HS_BUSY);
++	if (INB(np, HS_PRT) == HS_NEGOTIATE) {
++		OUTB(np, HS_PRT, HS_BUSY);
+ 		if (cp->nego_status && cp->nego_status != NS_WIDE)
+ 			goto reject_it;
+ 		req = 0;
+@@ -4303,25 +4268,24 @@
+ 	/*
+ 	 *  Check and apply new values.
+ 	 */
+-	result = sym_wide_nego_check(np, req, cp->target);
++	result = sym_wide_nego_check(np, req, cp);
+ 	if (result)	/* Not acceptable, reject it */
+ 		goto reject_it;
+ 	if (req) {	/* Was a request, send response. */
+ 		cp->nego_status = NS_WIDE;
+-		OUTL_DSP (SCRIPTB_BA (np, wdtr_resp));
+-	}
+-	else {		/* Was a response. */
++		OUTL_DSP(np, SCRIPTB_BA(np, wdtr_resp));
++	} else {		/* Was a response. */
+ 		/*
+ 		 * Negotiate for SYNC immediately after WIDE response.
+ 		 * This allows to negotiate for both WIDE and SYNC on 
+ 		 * a single SCSI command (Suggested by Justin Gibbs).
+ 		 */
+-		if (tp->tinfo.goal.offset) {
++		if (tp->tgoal.offset) {
+ 			np->msgout[0] = M_EXTENDED;
+ 			np->msgout[1] = 3;
+ 			np->msgout[2] = M_X_SYNC_REQ;
+-			np->msgout[3] = tp->tinfo.goal.period;
+-			np->msgout[4] = tp->tinfo.goal.offset;
++			np->msgout[3] = tp->tgoal.period;
++			np->msgout[4] = tp->tgoal.offset;
+ 
+ 			if (DEBUG_FLAGS & DEBUG_NEGO) {
+ 				sym_print_nego_msg(np, cp->target,
+@@ -4329,18 +4293,17 @@
+ 			}
+ 
+ 			cp->nego_status = NS_SYNC;
+-			OUTB (HS_PRT, HS_NEGOTIATE);
+-			OUTL_DSP (SCRIPTB_BA (np, sdtr_resp));
++			OUTB(np, HS_PRT, HS_NEGOTIATE);
++			OUTL_DSP(np, SCRIPTB_BA(np, sdtr_resp));
+ 			return;
+-		}
+-		else
+-			OUTL_DSP (SCRIPTA_BA (np, clrack));
+-	};
++		} else
++			OUTL_DSP(np, SCRIPTA_BA(np, clrack));
++	}
+ 
+ 	return;
+ 
+ reject_it:
+-	OUTL_DSP (SCRIPTB_BA (np, msg_bad));
++	OUTL_DSP(np, SCRIPTB_BA(np, msg_bad));
+ }
+ 
+ /*
+@@ -4354,18 +4317,19 @@
+  *  So, if a PPR makes problems, we may just want to 
+  *  try a legacy negotiation later.
+  */
+-static void sym_nego_default(struct sym_hcb *np, tcb_p tp, ccb_p cp)
++static void sym_nego_default(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
+ {
+ 	switch (cp->nego_status) {
+ 	case NS_PPR:
+ #if 0
+ 		sym_setpprot (np, cp->target, 0, 0, 0, 0, 0, 0);
+ #else
+-		tp->tinfo.goal.options = 0;
+-		if (tp->tinfo.goal.period < np->minsync)
+-			tp->tinfo.goal.period = np->minsync;
+-		if (tp->tinfo.goal.offset > np->maxoffs)
+-			tp->tinfo.goal.offset = np->maxoffs;
++		if (tp->tgoal.period < np->minsync)
++			tp->tgoal.period = np->minsync;
++		if (tp->tgoal.offset > np->maxoffs)
++			tp->tgoal.offset = np->maxoffs;
++		tp->tgoal.iu = tp->tgoal.dt = tp->tgoal.qas = 0;
++		tp->tgoal.check_nego = 1;
+ #endif
+ 		break;
+ 	case NS_SYNC:
+@@ -4374,7 +4338,7 @@
+ 	case NS_WIDE:
+ 		sym_setwide (np, cp->target, 0);
+ 		break;
+-	};
++	}
+ 	np->msgin [0] = M_NOOP;
+ 	np->msgout[0] = M_NOOP;
+ 	cp->nego_status = 0;
+@@ -4384,10 +4348,10 @@
+  *  chip handler for MESSAGE REJECT received in response to 
+  *  PPR, WIDE or SYNCHRONOUS negotiation.
+  */
+-static void sym_nego_rejected(struct sym_hcb *np, tcb_p tp, ccb_p cp)
++static void sym_nego_rejected(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb *cp)
+ {
+ 	sym_nego_default(np, tp, cp);
+-	OUTB (HS_PRT, HS_BUSY);
++	OUTB(np, HS_PRT, HS_BUSY);
+ }
+ 
+ /*
+@@ -4395,11 +4359,11 @@
+  */
+ static void sym_int_sir (struct sym_hcb *np)
+ {
+-	u_char	num	= INB (nc_dsps);
+-	u32	dsa	= INL (nc_dsa);
+-	ccb_p	cp	= sym_ccb_from_dsa(np, dsa);
+-	u_char	target	= INB (nc_sdid) & 0x0f;
+-	tcb_p	tp	= &np->target[target];
++	u_char	num	= INB(np, nc_dsps);
++	u32	dsa	= INL(np, nc_dsa);
++	struct sym_ccb *cp	= sym_ccb_from_dsa(np, dsa);
++	u_char	target	= INB(np, nc_sdid) & 0x0f;
++	struct sym_tcb *tp	= &np->target[target];
+ 	int	tmp;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TINY) printf ("I#%d", num);
+@@ -4497,7 +4461,7 @@
+ 			if (cp) {
+ 				cp->xerr_status &= ~XE_PARITY_ERR;
+ 				if (!cp->xerr_status)
+-					OUTOFFB (HF_PRT, HF_EXT_ERR);
++					OUTOFFB(np, HF_PRT, HF_EXT_ERR);
+ 			}
+ 		}
+ 		goto out;
+@@ -4527,7 +4491,7 @@
+ 	 */
+ 	case SIR_SWIDE_OVERRUN:
+ 		if (cp) {
+-			OUTONB (HF_PRT, HF_EXT_ERR);
++			OUTONB(np, HF_PRT, HF_EXT_ERR);
+ 			cp->xerr_status |= XE_SWIDE_OVRUN;
+ 		}
+ 		goto out;
+@@ -4538,7 +4502,7 @@
+ 	 */
+ 	case SIR_SODL_UNDERRUN:
+ 		if (cp) {
+-			OUTONB (HF_PRT, HF_EXT_ERR);
++			OUTONB(np, HF_PRT, HF_EXT_ERR);
+ 			cp->xerr_status |= XE_SODL_UNRUN;
+ 		}
+ 		goto out;
+@@ -4550,9 +4514,9 @@
+ 	 */
+ 	case SIR_DATA_OVERRUN:
+ 		if (cp) {
+-			OUTONB (HF_PRT, HF_EXT_ERR);
++			OUTONB(np, HF_PRT, HF_EXT_ERR);
+ 			cp->xerr_status |= XE_EXTRA_DATA;
+-			cp->extra_bytes += INL (nc_scratcha);
++			cp->extra_bytes += INL(np, nc_scratcha);
+ 		}
+ 		goto out;
+ 	/*
+@@ -4560,7 +4524,7 @@
+ 	 */
+ 	case SIR_BAD_PHASE:
+ 		if (cp) {
+-			OUTONB (HF_PRT, HF_EXT_ERR);
++			OUTONB(np, HF_PRT, HF_EXT_ERR);
+ 			cp->xerr_status |= XE_BAD_PHASE;
+ 		}
+ 		goto out;
+@@ -4609,16 +4573,16 @@
+ 			if (DEBUG_FLAGS & DEBUG_POINTER)
+ 				sym_print_msg(cp,"ign wide residue", np->msgin);
+ 			if (cp->host_flags & HF_SENSE)
+-				OUTL_DSP (SCRIPTA_BA (np, clrack));
++				OUTL_DSP(np, SCRIPTA_BA(np, clrack));
+ 			else
+ 				sym_modify_dp(np, tp, cp, -1);
+ 			return;
+ 		case M_REJECT:
+-			if (INB (HS_PRT) == HS_NEGOTIATE)
++			if (INB(np, HS_PRT) == HS_NEGOTIATE)
+ 				sym_nego_rejected(np, tp, cp);
+ 			else {
+-				PRINT_ADDR(cp);
+-				printf ("M_REJECT received (%x:%x).\n",
++				sym_print_addr(cp->cmd,
++					"M_REJECT received (%x:%x).\n",
+ 					scr_to_cpu(np->lastmsg), np->msgout[0]);
+ 			}
+ 			goto out_clrack;
+@@ -4633,7 +4597,7 @@
+ 	 */
+ 	case SIR_MSG_WEIRD:
+ 		sym_print_msg(cp, "WEIRD message received", np->msgin);
+-		OUTL_DSP (SCRIPTB_BA (np, msg_weird));
++		OUTL_DSP(np, SCRIPTB_BA(np, msg_weird));
+ 		return;
+ 	/*
+ 	 *  Negotiation failed.
+@@ -4641,7 +4605,7 @@
+ 	 *  Remove the HS_NEGOTIATE status.
+ 	 */
+ 	case SIR_NEGO_FAILED:
+-		OUTB (HS_PRT, HS_BUSY);
++		OUTB(np, HS_PRT, HS_BUSY);
+ 	/*
+ 	 *  Negotiation failed.
+ 	 *  Target does not want answer message.
+@@ -4649,16 +4613,16 @@
+ 	case SIR_NEGO_PROTO:
+ 		sym_nego_default(np, tp, cp);
+ 		goto out;
+-	};
++	}
+ 
+ out:
+-	OUTONB_STD ();
++	OUTONB_STD();
+ 	return;
+ out_reject:
+-	OUTL_DSP (SCRIPTB_BA (np, msg_bad));
++	OUTL_DSP(np, SCRIPTB_BA(np, msg_bad));
+ 	return;
+ out_clrack:
+-	OUTL_DSP (SCRIPTA_BA (np, clrack));
++	OUTL_DSP(np, SCRIPTA_BA(np, clrack));
+ 	return;
+ out_stuck:
+ 	return;
+@@ -4667,19 +4631,21 @@
+ /*
+  *  Acquire a control block
+  */
+-ccb_p sym_get_ccb (struct sym_hcb *np, u_char tn, u_char ln, u_char tag_order)
++struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char tag_order)
+ {
+-	tcb_p tp = &np->target[tn];
+-	lcb_p lp = sym_lp(np, tp, ln);
++	u_char tn = cmd->device->id;
++	u_char ln = cmd->device->lun;
++	struct sym_tcb *tp = &np->target[tn];
++	struct sym_lcb *lp = sym_lp(tp, ln);
+ 	u_short tag = NO_TAG;
+ 	SYM_QUEHEAD *qp;
+-	ccb_p cp = (ccb_p) 0;
++	struct sym_ccb *cp = NULL;
+ 
+ 	/*
+ 	 *  Look for a free CCB
+ 	 */
+ 	if (sym_que_empty(&np->free_ccbq))
+-		(void) sym_alloc_ccb(np);
++		sym_alloc_ccb(np);
+ 	qp = sym_remque_head(&np->free_ccbq);
+ 	if (!qp)
+ 		goto out;
+@@ -4741,7 +4707,7 @@
+ #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
+ 				lp->itlq_tbl[tag] = cpu_to_scr(cp->ccb_ba);
+ 				lp->head.resel_sa =
+-					cpu_to_scr(SCRIPTA_BA (np, resel_tag));
++					cpu_to_scr(SCRIPTA_BA(np, resel_tag));
+ #endif
+ #ifdef SYM_OPT_LIMIT_COMMAND_REORDERING
+ 				cp->tags_si = lp->tags_si;
+@@ -4774,7 +4740,7 @@
+ 			if (lp->busy_itl == 1) {
+ 				lp->head.itl_task_sa = cpu_to_scr(cp->ccb_ba);
+ 				lp->head.resel_sa =
+-				      cpu_to_scr(SCRIPTA_BA (np, resel_no_tag));
++				      cpu_to_scr(SCRIPTA_BA(np, resel_no_tag));
+ 			}
+ 			else
+ 				goto out_free;
+@@ -4802,28 +4768,27 @@
+ 	cp->lun    = ln;
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TAGS) {
+-		PRINT_LUN(np, tn, ln);
+-		printf ("ccb @%p using tag %d.\n", cp, tag);
++		sym_print_addr(cmd, "ccb @%p using tag %d.\n", cp, tag);
+ 	}
+ 
+ out:
+ 	return cp;
+ out_free:
+ 	sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
+-	return (ccb_p) 0;
++	return NULL;
+ }
+ 
+ /*
+  *  Release one control block
+  */
+-void sym_free_ccb (struct sym_hcb *np, ccb_p cp)
++void sym_free_ccb (struct sym_hcb *np, struct sym_ccb *cp)
+ {
+-	tcb_p tp = &np->target[cp->target];
+-	lcb_p lp = sym_lp(np, tp, cp->lun);
++	struct sym_tcb *tp = &np->target[cp->target];
++	struct sym_lcb *lp = sym_lp(tp, cp->lun);
+ 
+ 	if (DEBUG_FLAGS & DEBUG_TAGS) {
+-		PRINT_LUN(np, cp->target, cp->lun);
+-		printf ("ccb @%p freeing tag %d.\n", cp, cp->tag);
++		sym_print_addr(cp->cmd, "ccb @%p freeing tag %d.\n",
++				cp, cp->tag);
+ 	}
+ 
+ 	/*
+@@ -4862,7 +4827,7 @@
+ 		 */
+ 		if (lp->busy_itlq == 0 && lp->busy_itl == 0)
+ 			lp->head.resel_sa =
+-				cpu_to_scr(SCRIPTB_BA (np, resel_bad_lun));
++				cpu_to_scr(SCRIPTB_BA(np, resel_bad_lun));
+ 	}
+ 	/*
+ 	 *  Otherwise, we only accept 1 IO per LUN.
+@@ -4889,14 +4854,9 @@
+ #endif
+ 
+ 	/*
+-	 *  Unmap user data from DMA map if needed.
+-	 */
+-	sym_data_dmamap_unload(np, cp);
+-
+-	/*
+ 	 *  Make this CCB available.
+ 	 */
+-	cp->cam_ccb = NULL;
++	cp->cmd = NULL;
+ 	cp->host_status = HS_IDLE;
+ 	sym_remque(&cp->link_ccbq);
+ 	sym_insque_head(&cp->link_ccbq, &np->free_ccbq);
+@@ -4919,9 +4879,9 @@
+ /*
+  *  Allocate a CCB from memory and initialize its fixed part.
+  */
+-static ccb_p sym_alloc_ccb(struct sym_hcb *np)
++static struct sym_ccb *sym_alloc_ccb(struct sym_hcb *np)
+ {
+-	ccb_p cp = NULL;
++	struct sym_ccb *cp = NULL;
+ 	int hcode;
+ 
+ 	/*
+@@ -4939,19 +4899,6 @@
+ 		goto out_free;
+ 
+ 	/*
+-	 *  Allocate a bounce buffer for sense data.
+-	 */
+-	cp->sns_bbuf = sym_calloc_dma(SYM_SNS_BBUF_LEN, "SNS_BBUF");
+-	if (!cp->sns_bbuf)
+-		goto out_free;
+-
+-	/*
+-	 *  Allocate a map for the DMA of user data.
+-	 */
+-	if (sym_data_dmamap_create(np, cp))
+-		goto out_free;
+-
+-	/*
+ 	 *  Count it.
+ 	 */
+ 	np->actccbs++;
+@@ -4971,8 +4918,8 @@
+ 	/*
+ 	 *  Initialyze the start and restart actions.
+ 	 */
+-	cp->phys.head.go.start   = cpu_to_scr(SCRIPTA_BA (np, idle));
+-	cp->phys.head.go.restart = cpu_to_scr(SCRIPTB_BA (np, bad_i_t_l));
++	cp->phys.head.go.start   = cpu_to_scr(SCRIPTA_BA(np, idle));
++	cp->phys.head.go.restart = cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
+ 
+  	/*
+ 	 *  Initilialyze some other fields.
+@@ -4992,21 +4939,18 @@
+ #endif
+ 	return cp;
+ out_free:
+-	if (cp) {
+-		if (cp->sns_bbuf)
+-			sym_mfree_dma(cp->sns_bbuf,SYM_SNS_BBUF_LEN,"SNS_BBUF");
++	if (cp)
+ 		sym_mfree_dma(cp, sizeof(*cp), "CCB");
+-	}
+ 	return NULL;
+ }
+ 
+ /*
+  *  Look up a CCB from a DSA value.
+  */
+-static ccb_p sym_ccb_from_dsa(struct sym_hcb *np, u32 dsa)
++static struct sym_ccb *sym_ccb_from_dsa(struct sym_hcb *np, u32 dsa)
+ {
+ 	int hcode;
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 
+ 	hcode = CCB_HASH_CODE(dsa);
+ 	cp = np->ccbh[hcode];
+@@ -5039,10 +4983,10 @@
+ /*
+  *  Lun control block allocation and initialization.
+  */
+-lcb_p sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln)
++struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln)
+ {
+-	tcb_p tp = &np->target[tn];
+-	lcb_p lp = sym_lp(np, tp, ln);
++	struct sym_tcb *tp = &np->target[tn];
++	struct sym_lcb *lp = sym_lp(tp, ln);
+ 
+ 	/*
+ 	 *  Already done, just return.
+@@ -5081,8 +5025,8 @@
+ 	 *  Allocate the table of pointers for LUN(s) > 0, if needed.
+ 	 */
+ 	if (ln && !tp->lunmp) {
+-		tp->lunmp = sym_calloc(SYM_CONF_MAX_LUN * sizeof(lcb_p),
+-				   "LUNMP");
++		tp->lunmp = kcalloc(SYM_CONF_MAX_LUN, sizeof(struct sym_lcb *),
++				GFP_KERNEL);
+ 		if (!tp->lunmp)
+ 			goto fail;
+ 	}
+@@ -5111,7 +5055,7 @@
+ 	/*
+ 	 *  Set the reselect pattern to our default. :)
+ 	 */
+-	lp->head.resel_sa = cpu_to_scr(SCRIPTB_BA (np, resel_bad_lun));
++	lp->head.resel_sa = cpu_to_scr(SCRIPTB_BA(np, resel_bad_lun));
+ 
+ 	/*
+ 	 *  Set user capabilities.
+@@ -5143,8 +5087,8 @@
+  */
+ static void sym_alloc_lcb_tags (struct sym_hcb *np, u_char tn, u_char ln)
+ {
+-	tcb_p tp = &np->target[tn];
+-	lcb_p lp = sym_lp(np, tp, ln);
++	struct sym_tcb *tp = &np->target[tn];
++	struct sym_lcb *lp = sym_lp(tp, ln);
+ 	int i;
+ 
+ 	/*
+@@ -5160,7 +5104,7 @@
+ 	lp->itlq_tbl = sym_calloc_dma(SYM_CONF_MAX_TASK*4, "ITLQ_TBL");
+ 	if (!lp->itlq_tbl)
+ 		goto fail;
+-	lp->cb_tags = sym_calloc(SYM_CONF_MAX_TASK, "CB_TAGS");
++	lp->cb_tags = kcalloc(SYM_CONF_MAX_TASK, 1, GFP_KERNEL);
+ 	if (!lp->cb_tags) {
+ 		sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4, "ITLQ_TBL");
+ 		lp->itlq_tbl = NULL;
+@@ -5193,10 +5137,11 @@
+ /*
+  *  Queue a SCSI IO to the controller.
+  */
+-int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *csio, ccb_p cp)
++int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
+ {
+-	tcb_p	tp;
+-	lcb_p	lp;
++	struct scsi_device *sdev = cmd->device;
++	struct sym_tcb *tp;
++	struct sym_lcb *lp;
+ 	u_char	*msgptr;
+ 	u_int   msglen;
+ 	int can_disconnect;
+@@ -5204,7 +5149,7 @@
+ 	/*
+ 	 *  Keep track of the IO in our CCB.
+ 	 */
+-	cp->cam_ccb = csio;
++	cp->cmd = cmd;
+ 
+ 	/*
+ 	 *  Retrieve the target descriptor.
+@@ -5214,14 +5159,14 @@
+ 	/*
+ 	 *  Retrieve the lun descriptor.
+ 	 */
+-	lp = sym_lp(np, tp, cp->lun);
++	lp = sym_lp(tp, sdev->lun);
+ 
+ 	can_disconnect = (cp->tag != NO_TAG) ||
+ 		(lp && (lp->curr_flags & SYM_DISC_ENABLED));
+ 
+ 	msgptr = cp->scsi_smsg;
+ 	msglen = 0;
+-	msgptr[msglen++] = IDENTIFY(can_disconnect, cp->lun);
++	msgptr[msglen++] = IDENTIFY(can_disconnect, sdev->lun);
+ 
+ 	/*
+ 	 *  Build the tag message if present.
+@@ -5249,8 +5194,8 @@
+ 			if (lp->tags_sum[lp->tags_si]) {
+ 				order = M_ORDERED_TAG;
+ 				if ((DEBUG_FLAGS & DEBUG_TAGS)||sym_verbose>1) {
+-					PRINT_ADDR(cp);
+-					printf("ordered tag forced.\n");
++					sym_print_addr(cmd,
++						"ordered tag forced.\n");
+ 				}
+ 			}
+ 			lp->tags_since = 0;
+@@ -5277,19 +5222,15 @@
+ 	 *  (nego_status is filled by sym_prepare_nego())
+ 	 */
+ 	cp->nego_status = 0;
+-	if (tp->tinfo.curr.width   != tp->tinfo.goal.width  ||
+-	    tp->tinfo.curr.period  != tp->tinfo.goal.period ||
+-	    tp->tinfo.curr.offset  != tp->tinfo.goal.offset ||
+-	    tp->tinfo.curr.options != tp->tinfo.goal.options) {
+-		if (!tp->nego_cp && lp)
+-			msglen += sym_prepare_nego(np, cp, msgptr + msglen);
++	if (tp->tgoal.check_nego && !tp->nego_cp && lp) {
++		msglen += sym_prepare_nego(np, cp, msgptr + msglen);
+ 	}
+ 
+ 	/*
+ 	 *  Startqueue
+ 	 */
+-	cp->phys.head.go.start   = cpu_to_scr(SCRIPTA_BA (np, select));
+-	cp->phys.head.go.restart = cpu_to_scr(SCRIPTA_BA (np, resel_dsa));
++	cp->phys.head.go.start   = cpu_to_scr(SCRIPTA_BA(np, select));
++	cp->phys.head.go.restart = cpu_to_scr(SCRIPTA_BA(np, resel_dsa));
+ 
+ 	/*
+ 	 *  select
+@@ -5302,7 +5243,7 @@
+ 	/*
+ 	 *  message
+ 	 */
+-	cp->phys.smsg.addr	= cpu_to_scr(CCB_BA (cp, scsi_smsg));
++	cp->phys.smsg.addr	= cpu_to_scr(CCB_BA(cp, scsi_smsg));
+ 	cp->phys.smsg.size	= cpu_to_scr(msglen);
+ 
+ 	/*
+@@ -5326,7 +5267,7 @@
+ 	 *  Build the CDB and DATA descriptor block 
+ 	 *  and start the IO.
+ 	 */
+-	return sym_setup_data_and_start(np, csio, cp);
++	return sym_setup_data_and_start(np, cmd, cp);
+ }
+ 
+ /*
+@@ -5334,7 +5275,7 @@
+  */
+ int sym_reset_scsi_target(struct sym_hcb *np, int target)
+ {
+-	tcb_p tp;
++	struct sym_tcb *tp;
+ 
+ 	if (target == np->myaddr || (u_int)target >= SYM_CONF_MAX_TARGET)
+ 		return -1;
+@@ -5343,7 +5284,7 @@
+ 	tp->to_reset = 1;
+ 
+ 	np->istat_sem = SEM;
+-	OUTB (nc_istat, SIGP|SEM);
++	OUTB(np, nc_istat, SIGP|SEM);
+ 
+ 	return 0;
+ }
+@@ -5351,7 +5292,7 @@
+ /*
+  *  Abort a SCSI IO.
+  */
+-int sym_abort_ccb(struct sym_hcb *np, ccb_p cp, int timed_out)
++static int sym_abort_ccb(struct sym_hcb *np, struct sym_ccb *cp, int timed_out)
+ {
+ 	/*
+ 	 *  Check that the IO is active.
+@@ -5377,13 +5318,13 @@
+ 	 *  Tell the SCRIPTS processor to stop and synchronize with us.
+ 	 */
+ 	np->istat_sem = SEM;
+-	OUTB (nc_istat, SIGP|SEM);
++	OUTB(np, nc_istat, SIGP|SEM);
+ 	return 0;
+ }
+ 
+-int sym_abort_scsiio(struct sym_hcb *np, struct scsi_cmnd *ccb, int timed_out)
++int sym_abort_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, int timed_out)
+ {
+-	ccb_p cp;
++	struct sym_ccb *cp;
+ 	SYM_QUEHEAD *qp;
+ 
+ 	/*
+@@ -5391,8 +5332,8 @@
+ 	 */
+ 	cp = NULL;
+ 	FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
+-		ccb_p cp2 = sym_que_entry(qp, struct sym_ccb, link_ccbq);
+-		if (cp2->cam_ccb == ccb) {
++		struct sym_ccb *cp2 = sym_que_entry(qp, struct sym_ccb, link_ccbq);
++		if (cp2->cmd == cmd) {
+ 			cp = cp2;
+ 			break;
+ 		}
+@@ -5411,37 +5352,40 @@
+  *  SCRATCHA is assumed to have been loaded with STARTPOS 
+  *  before the SCRIPTS called the C code.
+  */
+-void sym_complete_error (struct sym_hcb *np, ccb_p cp)
++void sym_complete_error(struct sym_hcb *np, struct sym_ccb *cp)
+ {
+-	tcb_p tp;
+-	lcb_p lp;
++	struct scsi_device *sdev;
++	struct scsi_cmnd *cmd;
++	struct sym_tcb *tp;
++	struct sym_lcb *lp;
+ 	int resid;
+ 	int i;
+ 
+ 	/*
+ 	 *  Paranoid check. :)
+ 	 */
+-	if (!cp || !cp->cam_ccb)
++	if (!cp || !cp->cmd)
+ 		return;
+ 
++	cmd = cp->cmd;
++	sdev = cmd->device;
+ 	if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_RESULT)) {
+-		printf ("CCB=%lx STAT=%x/%x/%x DEV=%d/%d\n", (unsigned long)cp,
+-			cp->host_status, cp->ssss_status, cp->host_flags,
+-			cp->target, cp->lun);
++		dev_info(&sdev->sdev_gendev, "CCB=%p STAT=%x/%x/%x\n", cp,
++			cp->host_status, cp->ssss_status, cp->host_flags);
+ 	}
+ 
+ 	/*
+ 	 *  Get target and lun pointers.
+ 	 */
+ 	tp = &np->target[cp->target];
+-	lp = sym_lp(np, tp, cp->lun);
++	lp = sym_lp(tp, sdev->lun);
+ 
+ 	/*
+ 	 *  Check for extended errors.
+ 	 */
+ 	if (cp->xerr_status) {
+ 		if (sym_verbose)
+-			sym_print_xerr(cp, cp->xerr_status);
++			sym_print_xerr(cmd, cp->xerr_status);
+ 		if (cp->host_status == HS_COMPLETE)
+ 			cp->host_status = HS_COMP_ERR;
+ 	}
+@@ -5464,13 +5408,13 @@
+ 	 *  Dequeue all queued CCBs for that device 
+ 	 *  not yet started by SCRIPTS.
+ 	 */
+-	i = (INL (nc_scratcha) - np->squeue_ba) / 4;
+-	i = sym_dequeue_from_squeue(np, i, cp->target, cp->lun, -1);
++	i = (INL(np, nc_scratcha) - np->squeue_ba) / 4;
++	i = sym_dequeue_from_squeue(np, i, cp->target, sdev->lun, -1);
+ 
+ 	/*
+ 	 *  Restart the SCRIPTS processor.
+ 	 */
+-	OUTL_DSP (SCRIPTA_BA (np, start));
++	OUTL_DSP(np, SCRIPTA_BA(np, start));
+ 
+ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
+ 	if (cp->host_status == HS_COMPLETE &&
+@@ -5484,8 +5428,8 @@
+ 		lp->num_sgood = 0;
+ 
+ 		if (sym_verbose >= 2) {
+-			PRINT_LUN(np, cp->target, cp->lun);
+-			printf(" queue depth is now %d\n", lp->started_max);
++			sym_print_addr(cmd, " queue depth is now %d\n",
++					lp->started_max);
+ 		}
+ 
+ 		/*
+@@ -5497,17 +5441,12 @@
+ 		/*
+ 		 *  Let's requeue it to device.
+ 		 */
+-		sym_set_cam_status(cp->cam_ccb, CAM_REQUEUE_REQ);
++		sym_set_cam_status(cmd, CAM_REQUEUE_REQ);
+ 		goto finish;
+ 	}
+ weirdness:
+ #endif
+ 	/*
+-	 *  Synchronize DMA map if needed.
+-	 */
+-	sym_data_dmamap_postsync(np, cp);
+-
+-	/*
+ 	 *  Build result in CAM ccb.
+ 	 */
+ 	sym_set_cam_result_error(np, cp, resid);
+@@ -5545,30 +5484,30 @@
+  *  The SCRIPTS processor is running while we are 
+  *  completing successful commands.
+  */
+-void sym_complete_ok (struct sym_hcb *np, ccb_p cp)
++void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp)
+ {
+-	tcb_p tp;
+-	lcb_p lp;
+-	struct scsi_cmnd *ccb;
++	struct sym_tcb *tp;
++	struct sym_lcb *lp;
++	struct scsi_cmnd *cmd;
+ 	int resid;
+ 
+ 	/*
+ 	 *  Paranoid check. :)
+ 	 */
+-	if (!cp || !cp->cam_ccb)
++	if (!cp || !cp->cmd)
+ 		return;
+ 	assert (cp->host_status == HS_COMPLETE);
+ 
+ 	/*
+ 	 *  Get user command.
+ 	 */
+-	ccb = cp->cam_ccb;
++	cmd = cp->cmd;
+ 
+ 	/*
+ 	 *  Get target and lun pointers.
+ 	 */
+ 	tp = &np->target[cp->target];
+-	lp = sym_lp(np, tp, cp->lun);
++	lp = sym_lp(tp, cp->lun);
+ 
+ 	/*
+ 	 *  Assume device discovered on first success.
+@@ -5586,8 +5525,8 @@
+ 
+ 	/*
+ 	 *  Wrong transfer residuals may be worse than just always 
+-	 *  returning zero. User can disable this feature from 
+-	 *  sym_conf.h. Residual support is enabled by default.
++	 *  returning zero. User can disable this feature in 
++	 *  sym53c8xx.h. Residual support is enabled by default.
+ 	 */
+ 	if (!SYM_SETUP_RESIDUAL_SUPPORT)
+ 		resid  = 0;
+@@ -5597,14 +5536,9 @@
+ #endif
+ 
+ 	/*
+-	 *  Synchronize DMA map if needed.
+-	 */
+-	sym_data_dmamap_postsync(np, cp);
+-
+-	/*
+ 	 *  Build result in CAM ccb.
+ 	 */
+-	sym_set_cam_result_ok(np, cp, resid);
++	sym_set_cam_result_ok(cp, cmd, resid);
+ 
+ #ifdef	SYM_OPT_SNIFF_INQUIRY
+ 	/*
+@@ -5612,7 +5546,7 @@
+ 	 *  not set), sniff out device capabilities.
+ 	 */
+ 	if (cp->cdb_buf[0] == INQUIRY && !(cp->cdb_buf[1] & 0x3))
+-		sym_sniff_inquiry(np, cp->cam_ccb, resid);
++		sym_sniff_inquiry(np, cmd, resid);
+ #endif
+ 
+ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
+@@ -5626,8 +5560,7 @@
+ 			lp->num_sgood = 0;
+ 			++lp->started_max;
+ 			if (sym_verbose >= 2) {
+-				PRINT_LUN(np, cp->target, cp->lun);
+-				printf(" queue depth is now %d\n",
++				sym_print_addr(cmd, " queue depth is now %d\n",
+ 				       lp->started_max);
+ 			}
+ 		}
+@@ -5649,14 +5582,15 @@
+ 	/*
+ 	 *  Complete the command.
+ 	 */
+-	sym_xpt_done(np, ccb);
++	sym_xpt_done(np, cmd);
+ }
+ 
+ /*
+  *  Soft-attach the controller.
+  */
+-int sym_hcb_attach(struct sym_hcb *np, struct sym_fw *fw, struct sym_nvram *nvram)
++int sym_hcb_attach(struct Scsi_Host *shost, struct sym_fw *fw, struct sym_nvram *nvram)
+ {
++	struct sym_hcb *np = sym_get_hcb(shost);
+ 	int i;
+ 
+ 	/*
+@@ -5680,13 +5614,13 @@
+ 	 *  that SCSI clock calibration may not work properly 
+ 	 *  if the chip is currently active.
+ 	 */
+-	sym_chip_reset (np);
++	sym_chip_reset(np);
+ 
+ 	/*
+ 	 *  Prepare controller and devices settings, according 
+ 	 *  to chip features, user set-up and driver set-up.
+ 	 */
+-	(void) sym_prepare_setting(np, nvram);
++	sym_prepare_setting(shost, np, nvram);
+ 
+ 	/*
+ 	 *  Check the PCI clock frequency.
+@@ -5701,7 +5635,7 @@
+ 	/*
+ 	 *  Allocate the start queue.
+ 	 */
+-	np->squeue = (u32 *) sym_calloc_dma(sizeof(u32)*(MAX_QUEUE*2),"SQUEUE");
++	np->squeue = sym_calloc_dma(sizeof(u32)*(MAX_QUEUE*2),"SQUEUE");
+ 	if (!np->squeue)
+ 		goto attach_failed;
+ 	np->squeue_ba = vtobus(np->squeue);
+@@ -5709,7 +5643,7 @@
+ 	/*
+ 	 *  Allocate the done queue.
+ 	 */
+-	np->dqueue = (u32 *) sym_calloc_dma(sizeof(u32)*(MAX_QUEUE*2),"DQUEUE");
++	np->dqueue = sym_calloc_dma(sizeof(u32)*(MAX_QUEUE*2),"DQUEUE");
+ 	if (!np->dqueue)
+ 		goto attach_failed;
+ 	np->dqueue_ba = vtobus(np->dqueue);
+@@ -5717,7 +5651,7 @@
+ 	/*
+ 	 *  Allocate the target bus address array.
+ 	 */
+-	np->targtbl = (u32 *) sym_calloc_dma(256, "TARGTBL");
++	np->targtbl = sym_calloc_dma(256, "TARGTBL");
+ 	if (!np->targtbl)
+ 		goto attach_failed;
+ 	np->targtbl_ba = vtobus(np->targtbl);
+@@ -5734,7 +5668,7 @@
+ 	/*
+ 	 *  Allocate the array of lists of CCBs hashed by DSA.
+ 	 */
+-	np->ccbh = sym_calloc(sizeof(ccb_p *)*CCB_HASH_SIZE, "CCBH");
++	np->ccbh = kcalloc(sizeof(struct sym_ccb **), CCB_HASH_SIZE, GFP_KERNEL);
+ 	if (!np->ccbh)
+ 		goto attach_failed;
+ 
+@@ -5817,20 +5751,20 @@
+ 	/*
+ 	 *  Prepare the idle and invalid task actions.
+ 	 */
+-	np->idletask.start	= cpu_to_scr(SCRIPTA_BA (np, idle));
+-	np->idletask.restart	= cpu_to_scr(SCRIPTB_BA (np, bad_i_t_l));
++	np->idletask.start	= cpu_to_scr(SCRIPTA_BA(np, idle));
++	np->idletask.restart	= cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
+ 	np->idletask_ba		= vtobus(&np->idletask);
+ 
+-	np->notask.start	= cpu_to_scr(SCRIPTA_BA (np, idle));
+-	np->notask.restart	= cpu_to_scr(SCRIPTB_BA (np, bad_i_t_l));
++	np->notask.start	= cpu_to_scr(SCRIPTA_BA(np, idle));
++	np->notask.restart	= cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
+ 	np->notask_ba		= vtobus(&np->notask);
+ 
+-	np->bad_itl.start	= cpu_to_scr(SCRIPTA_BA (np, idle));
+-	np->bad_itl.restart	= cpu_to_scr(SCRIPTB_BA (np, bad_i_t_l));
++	np->bad_itl.start	= cpu_to_scr(SCRIPTA_BA(np, idle));
++	np->bad_itl.restart	= cpu_to_scr(SCRIPTB_BA(np, bad_i_t_l));
+ 	np->bad_itl_ba		= vtobus(&np->bad_itl);
+ 
+-	np->bad_itlq.start	= cpu_to_scr(SCRIPTA_BA (np, idle));
+-	np->bad_itlq.restart	= cpu_to_scr(SCRIPTB_BA (np,bad_i_t_l_q));
++	np->bad_itlq.start	= cpu_to_scr(SCRIPTA_BA(np, idle));
++	np->bad_itlq.restart	= cpu_to_scr(SCRIPTB_BA(np,bad_i_t_l_q));
+ 	np->bad_itlq_ba		= vtobus(&np->bad_itlq);
+ 
+ 	/*
+@@ -5843,7 +5777,7 @@
+ 	if (!np->badluntbl)
+ 		goto attach_failed;
+ 
+-	np->badlun_sa = cpu_to_scr(SCRIPTB_BA (np, resel_bad_lun));
++	np->badlun_sa = cpu_to_scr(SCRIPTB_BA(np, resel_bad_lun));
+ 	for (i = 0 ; i < 64 ; i++)	/* 64 luns/target, no less */
+ 		np->badluntbl[i] = cpu_to_scr(vtobus(&np->badlun_sa));
+ 
+@@ -5866,7 +5800,7 @@
+ 	if (sym_snooptest (np)) {
+ 		printf("%s: CACHE INCORRECTLY CONFIGURED.\n", sym_name(np));
+ 		goto attach_failed;
+-	};
++	}
+ 
+ 	/*
+ 	 *  Sigh! we are done.
+@@ -5883,9 +5817,9 @@
+ void sym_hcb_free(struct sym_hcb *np)
+ {
+ 	SYM_QUEHEAD *qp;
+-	ccb_p cp;
+-	tcb_p tp;
+-	lcb_p lp;
++	struct sym_ccb *cp;
++	struct sym_tcb *tp;
++	struct sym_lcb *lp;
+ 	int target, lun;
+ 
+ 	if (np->scriptz0)
+@@ -5902,14 +5836,10 @@
+ 	if (np->actccbs) {
+ 		while ((qp = sym_remque_head(&np->free_ccbq)) != 0) {
+ 			cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
+-			sym_data_dmamap_destroy(np, cp);
+-			sym_mfree_dma(cp->sns_bbuf, SYM_SNS_BBUF_LEN,
+-				      "SNS_BBUF");
+ 			sym_mfree_dma(cp, sizeof(*cp), "CCB");
+ 		}
+ 	}
+-	if (np->ccbh)
+-		sym_mfree(np->ccbh, sizeof(ccb_p *)*CCB_HASH_SIZE, "CCBH");
++	kfree(np->ccbh);
+ 
+ 	if (np->badluntbl)
+ 		sym_mfree_dma(np->badluntbl, 256,"BADLUNTBL");
+@@ -5917,21 +5847,17 @@
+ 	for (target = 0; target < SYM_CONF_MAX_TARGET ; target++) {
+ 		tp = &np->target[target];
+ 		for (lun = 0 ; lun < SYM_CONF_MAX_LUN ; lun++) {
+-			lp = sym_lp(np, tp, lun);
++			lp = sym_lp(tp, lun);
+ 			if (!lp)
+ 				continue;
+ 			if (lp->itlq_tbl)
+ 				sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4,
+ 				       "ITLQ_TBL");
+-			if (lp->cb_tags)
+-				sym_mfree(lp->cb_tags, SYM_CONF_MAX_TASK,
+-				       "CB_TAGS");
++			kfree(lp->cb_tags);
+ 			sym_mfree_dma(lp, sizeof(*lp), "LCB");
+ 		}
+ #if SYM_CONF_MAX_LUN > 1
+-		if (tp->lunmp)
+-			sym_mfree(tp->lunmp, SYM_CONF_MAX_LUN*sizeof(lcb_p),
+-			       "LUNMP");
++		kfree(tp->lunmp);
+ #endif 
+ 	}
+ 	if (np->targtbl)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_hipd.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_hipd.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_hipd.h	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_hipd.h	2005-03-04 10:02:40.000000000 -0700
+@@ -188,36 +188,45 @@
+ /*
+  *  Common definitions for both bus space based and legacy IO methods.
+  */
+-#define INB(r)		INB_OFF(offsetof(struct sym_reg,r))
+-#define INW(r)		INW_OFF(offsetof(struct sym_reg,r))
+-#define INL(r)		INL_OFF(offsetof(struct sym_reg,r))
+-
+-#define OUTB(r, v)	OUTB_OFF(offsetof(struct sym_reg,r), (v))
+-#define OUTW(r, v)	OUTW_OFF(offsetof(struct sym_reg,r), (v))
+-#define OUTL(r, v)	OUTL_OFF(offsetof(struct sym_reg,r), (v))
+-
+-#define OUTONB(r, m)	OUTB(r, INB(r) | (m))
+-#define OUTOFFB(r, m)	OUTB(r, INB(r) & ~(m))
+-#define OUTONW(r, m)	OUTW(r, INW(r) | (m))
+-#define OUTOFFW(r, m)	OUTW(r, INW(r) & ~(m))
+-#define OUTONL(r, m)	OUTL(r, INL(r) | (m))
+-#define OUTOFFL(r, m)	OUTL(r, INL(r) & ~(m))
++
++#define INB_OFF(np, o)		ioread8(np->s.ioaddr + (o))
++#define INW_OFF(np, o)		ioread16(np->s.ioaddr + (o))
++#define INL_OFF(np, o)		ioread32(np->s.ioaddr + (o))
++
++#define OUTB_OFF(np, o, val)	iowrite8((val), np->s.ioaddr + (o))
++#define OUTW_OFF(np, o, val)	iowrite16((val), np->s.ioaddr + (o))
++#define OUTL_OFF(np, o, val)	iowrite32((val), np->s.ioaddr + (o))
++
++#define INB(np, r)		INB_OFF(np, offsetof(struct sym_reg, r))
++#define INW(np, r)		INW_OFF(np, offsetof(struct sym_reg, r))
++#define INL(np, r)		INL_OFF(np, offsetof(struct sym_reg, r))
++
++#define OUTB(np, r, v)		OUTB_OFF(np, offsetof(struct sym_reg, r), (v))
++#define OUTW(np, r, v)		OUTW_OFF(np, offsetof(struct sym_reg, r), (v))
++#define OUTL(np, r, v)		OUTL_OFF(np, offsetof(struct sym_reg, r), (v))
++
++#define OUTONB(np, r, m)	OUTB(np, r, INB(np, r) | (m))
++#define OUTOFFB(np, r, m)	OUTB(np, r, INB(np, r) & ~(m))
++#define OUTONW(np, r, m)	OUTW(np, r, INW(np, r) | (m))
++#define OUTOFFW(np, r, m)	OUTW(np, r, INW(np, r) & ~(m))
++#define OUTONL(np, r, m)	OUTL(np, r, INL(np, r) | (m))
++#define OUTOFFL(np, r, m)	OUTL(np, r, INL(np, r) & ~(m))
+ 
+ /*
+  *  We normally want the chip to have a consistent view
+  *  of driver internal data structures when we restart it.
+  *  Thus these macros.
+  */
+-#define OUTL_DSP(v)				\
++#define OUTL_DSP(np, v)				\
+ 	do {					\
+ 		MEMORY_WRITE_BARRIER();		\
+-		OUTL (nc_dsp, (v));		\
++		OUTL(np, nc_dsp, (v));		\
+ 	} while (0)
+ 
+ #define OUTONB_STD()				\
+ 	do {					\
+ 		MEMORY_WRITE_BARRIER();		\
+-		OUTONB (nc_dcntl, (STD|NOCOM));	\
++		OUTONB(np, nc_dcntl, (STD|NOCOM));	\
+ 	} while (0)
+ 
+ /*
+@@ -321,7 +330,6 @@
+  *  Host adapter miscellaneous flags.
+  */
+ #define SYM_AVOID_BUS_RESET	(1)
+-#define SYM_SCAN_TARGETS_HILO	(1<<1)
+ 
+ /*
+  *  Misc.
+@@ -334,20 +342,13 @@
+  *  Gather negotiable parameters value
+  */
+ struct sym_trans {
+-	u8 scsi_version;
+-	u8 spi_version;
+ 	u8 period;
+ 	u8 offset;
+-	u8 width;
+-	u8 options;	/* PPR options */
+-};
+-
+-struct sym_tinfo {
+-	struct sym_trans curr;
+-	struct sym_trans goal;
+-#ifdef	SYM_OPT_ANNOUNCE_TRANSFER_RATE
+-	struct sym_trans prev;
+-#endif
++	unsigned int width:1;
++	unsigned int iu:1;
++	unsigned int dt:1;
++	unsigned int qas:1;
++	unsigned int check_nego:1;
+ };
+ 
+ /*
+@@ -398,9 +399,9 @@
+ 	/*
+ 	 *  LUN table used by the C code.
+ 	 */
+-	lcb_p	lun0p;		/* LCB of LUN #0 (usual case)	*/
++	struct sym_lcb *lun0p;		/* LCB of LUN #0 (usual case)	*/
+ #if SYM_CONF_MAX_LUN > 1
+-	lcb_p	*lunmp;		/* Other LCBs [1..MAX_LUN]	*/
++	struct sym_lcb **lunmp;		/* Other LCBs [1..MAX_LUN]	*/
+ #endif
+ 
+ 	/*
+@@ -423,16 +424,14 @@
+ 	struct sym_stcb s;
+ #endif
+ 
+-	/*
+-	 *  Transfer capabilities (SIP)
+-	 */
+-	struct sym_tinfo tinfo;
++	/* Transfer goal */
++	struct sym_trans tgoal;
+ 
+ 	/*
+ 	 * Keep track of the CCB used for the negotiation in order
+ 	 * to ensure that only 1 negotiation is queued at a time.
+ 	 */
+-	ccb_p   nego_cp;	/* CCB used for the nego		*/
++	struct sym_ccb *  nego_cp;	/* CCB used for the nego		*/
+ 
+ 	/*
+ 	 *  Set when we want to reset the device.
+@@ -520,10 +519,8 @@
+ 	 *  Optionnaly the driver can handle device queueing, 
+ 	 *  and requeues internally command to redo.
+ 	 */
+-	SYM_QUEHEAD
+-		waiting_ccbq;
+-	SYM_QUEHEAD
+-		started_ccbq;
++	SYM_QUEHEAD waiting_ccbq;
++	SYM_QUEHEAD started_ccbq;
+ 	int	num_sgood;
+ 	u_short	started_tags;
+ 	u_short	started_no_tag;
+@@ -533,8 +530,8 @@
+ 
+ #ifdef SYM_OPT_LIMIT_COMMAND_REORDERING
+ 	/*
+-	 *  Optionnaly the driver can try to prevent SCSI 
+-	 *  IOs from being too much reordering.
++	 *  Optionally the driver can try to prevent SCSI 
++	 *  IOs from being reordered too much.
+ 	 */
+ 	u_char		tags_si;	/* Current index to tags sum	*/
+ 	u_short		tags_sum[2];	/* Tags sum counters		*/
+@@ -582,9 +579,9 @@
+  *  LUN(s) > 0.
+  */
+ #if SYM_CONF_MAX_LUN <= 1
+-#define sym_lp(np, tp, lun) (!lun) ? (tp)->lun0p : NULL
++#define sym_lp(tp, lun) (!lun) ? (tp)->lun0p : NULL
+ #else
+-#define sym_lp(np, tp, lun) \
++#define sym_lp(tp, lun) \
+ 	(!lun) ? (tp)->lun0p : (tp)->lunmp ? (tp)->lunmp[(lun)] : NULL
+ #endif
+ 
+@@ -749,12 +746,10 @@
+ 	/*
+ 	 *  Pointer to CAM ccb and related stuff.
+ 	 */
+-	struct scsi_cmnd *cam_ccb;	/* CAM scsiio ccb		*/
++	struct scsi_cmnd *cmd;	/* CAM scsiio ccb		*/
+ 	u8	cdb_buf[16];	/* Copy of CDB			*/
+-	u8	*sns_bbuf;	/* Bounce buffer for sense data	*/
+-#ifndef	SYM_SNS_BBUF_LEN
+-#define	SYM_SNS_BBUF_LEN (32)
+-#endif	
++#define	SYM_SNS_BBUF_LEN 32
++	u8	sns_bbuf[SYM_SNS_BBUF_LEN]; /* Bounce buffer for sense data */
+ 	int	data_len;	/* Total data length		*/
+ 	int	segments;	/* Number of SG segments	*/
+ 
+@@ -801,9 +796,8 @@
+ 				/*  NO_TAG means no tag		*/
+ 	u_char	target;
+ 	u_char	lun;
+-	ccb_p	link_ccbh;	/* Host adapter CCB hash chain	*/
+-	SYM_QUEHEAD
+-		link_ccbq;	/* Link to free/busy CCB queue	*/
++	struct sym_ccb *link_ccbh;	/* Host adapter CCB hash chain	*/
++	SYM_QUEHEAD link_ccbq;	/* Link to free/busy CCB queue	*/
+ 	u32	startp;		/* Initial data pointer		*/
+ 	u32	goalp;		/* Expected last data pointer	*/
+ #ifdef	SYM_OPT_HANDLE_DIR_UNKNOWN
+@@ -812,8 +806,7 @@
+ 	int	ext_sg;		/* Extreme data pointer, used	*/
+ 	int	ext_ofs;	/*  to calculate the residual.	*/
+ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
+-	SYM_QUEHEAD
+-		link2_ccbq;	/* Link for device queueing	*/
++	SYM_QUEHEAD link2_ccbq;	/* Link for device queueing	*/
+ 	u_char	started;	/* CCB queued to the squeue	*/
+ #endif
+ 	u_char	to_abort;	/* Want this IO to be aborted	*/
+@@ -830,6 +823,8 @@
+ #define	sym_goalp(cp) (cp->goalp)
+ #endif
+ 
++typedef struct device *m_pool_ident_t;
++
+ /*
+  *  Host Control Block
+  */
+@@ -1005,7 +1000,7 @@
+ 	/*
+ 	 *  CCB lists and queue.
+ 	 */
+-	ccb_p *ccbh;			/* CCBs hashed by DSA value	*/
++	struct sym_ccb **ccbh;			/* CCBs hashed by DSA value	*/
+ 					/* CCB_HASH_SIZE lists of CCBs	*/
+ 	SYM_QUEHEAD	free_ccbq;	/* Queue of available CCBs	*/
+ 	SYM_QUEHEAD	busy_ccbq;	/* Queue of busy CCBs		*/
+@@ -1037,7 +1032,7 @@
+ #ifdef SYM_CONF_IARB_SUPPORT
+ 	u_short		iarb_max;	/* Max. # consecutive IARB hints*/
+ 	u_short		iarb_count;	/* Actual # of these hints	*/
+-	ccb_p		last_cp;
++	struct sym_ccb *	last_cp;
+ #endif
+ 
+ 	/*
+@@ -1068,41 +1063,31 @@
+ /*
+  *  FIRMWARES (sym_fw.c)
+  */
+-struct sym_fw * sym_find_firmware(struct sym_pci_chip *chip);
+-void sym_fw_bind_script (struct sym_hcb *np, u32 *start, int len);
++struct sym_fw * sym_find_firmware(struct sym_chip *chip);
++void sym_fw_bind_script(struct sym_hcb *np, u32 *start, int len);
+ 
+ /*
+  *  Driver methods called from O/S specific code.
+  */
+ char *sym_driver_name(void);
+-void sym_print_xerr(ccb_p cp, int x_status);
++void sym_print_xerr(struct scsi_cmnd *cmd, int x_status);
+ int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int);
+-struct sym_pci_chip *
+-sym_lookup_pci_chip_table (u_short device_id, u_char revision);
+-void sym_put_start_queue(struct sym_hcb *np, ccb_p cp);
++struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision);
++void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp);
+ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
+-void sym_start_next_ccbs(struct sym_hcb *np, lcb_p lp, int maxn);
++void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn);
+ #endif
+-void sym_start_up (struct sym_hcb *np, int reason);
+-void sym_interrupt (struct sym_hcb *np);
++void sym_start_up(struct sym_hcb *np, int reason);
++void sym_interrupt(struct sym_hcb *np);
+ int sym_clear_tasks(struct sym_hcb *np, int cam_status, int target, int lun, int task);
+-ccb_p sym_get_ccb (struct sym_hcb *np, u_char tn, u_char ln, u_char tag_order);
+-void sym_free_ccb (struct sym_hcb *np, ccb_p cp);
+-lcb_p sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln);
+-int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *csio, ccb_p cp);
++struct sym_ccb *sym_get_ccb(struct sym_hcb *np, struct scsi_cmnd *cmd, u_char tag_order);
++void sym_free_ccb(struct sym_hcb *np, struct sym_ccb *cp);
++struct sym_lcb *sym_alloc_lcb(struct sym_hcb *np, u_char tn, u_char ln);
++int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *csio, struct sym_ccb *cp);
+ int sym_abort_scsiio(struct sym_hcb *np, struct scsi_cmnd *ccb, int timed_out);
+-int sym_abort_ccb(struct sym_hcb *np, ccb_p cp, int timed_out);
+ int sym_reset_scsi_target(struct sym_hcb *np, int target);
+ void sym_hcb_free(struct sym_hcb *np);
+-int sym_hcb_attach(struct sym_hcb *np, struct sym_fw *fw, struct sym_nvram *nvram);
+-
+-/*
+- *  Optionnaly, the driver may provide a function
+- *  to announce transfer rate changes.
+- */
+-#ifdef	SYM_OPT_ANNOUNCE_TRANSFER_RATE
+-void sym_announce_transfer_rate(struct sym_hcb *np, int target);
+-#endif
++int sym_hcb_attach(struct Scsi_Host *shost, struct sym_fw *fw, struct sym_nvram *nvram);
+ 
+ /*
+  *  Build a scatter/gather entry.
+@@ -1169,7 +1154,7 @@
+ 	case CAM_DIR_UNKNOWN:
+ #endif
+ 	case CAM_DIR_OUT:
+-		goalp = SCRIPTA_BA (np, data_out2) + 8;
++		goalp = SCRIPTA_BA(np, data_out2) + 8;
+ 		lastp = goalp - 8 - (cp->segments * (2*4));
+ #ifdef	SYM_OPT_HANDLE_DIR_UNKNOWN
+ 		cp->wgoalp = cpu_to_scr(goalp);
+@@ -1182,7 +1167,7 @@
+ #endif
+ 	case CAM_DIR_IN:
+ 		cp->host_flags |= HF_DATA_IN;
+-		goalp = SCRIPTA_BA (np, data_in2) + 8;
++		goalp = SCRIPTA_BA(np, data_in2) + 8;
+ 		lastp = goalp - 8 - (cp->segments * (2*4));
+ 		break;
+ 	case CAM_DIR_NONE:
+@@ -1190,7 +1175,7 @@
+ #ifdef	SYM_OPT_HANDLE_DIR_UNKNOWN
+ 		cp->host_flags |= HF_DATA_IN;
+ #endif
+-		lastp = goalp = SCRIPTB_BA (np, no_data);
++		lastp = goalp = SCRIPTB_BA(np, no_data);
+ 		break;
+ 	}
+ 
+@@ -1207,7 +1192,7 @@
+ 	 *  If direction is unknown, start at data_io.
+ 	 */
+ 	if (dir == CAM_DIR_UNKNOWN)
+-		cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA (np, data_io));
++		cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA(np, data_io));
+ #endif
+ }
+ 
+@@ -1215,6 +1200,17 @@
+  *  MEMORY ALLOCATOR.
+  */
+ 
++#define SYM_MEM_PAGE_ORDER 0	/* 1 PAGE  maximum */
++#define SYM_MEM_CLUSTER_SHIFT	(PAGE_SHIFT+SYM_MEM_PAGE_ORDER)
++#define SYM_MEM_FREE_UNUSED	/* Free unused pages immediately */
++
++#define SYM_MEM_WARN	1	/* Warn on failed operations */
++
++#define sym_get_mem_cluster()	\
++	(void *) __get_free_pages(GFP_ATOMIC, SYM_MEM_PAGE_ORDER)
++#define sym_free_mem_cluster(p)	\
++	free_pages((unsigned long)p, SYM_MEM_PAGE_ORDER)
++
+ /*
+  *  Link between free memory chunks of a given size.
+  */
+@@ -1228,11 +1224,8 @@
+  */
+ typedef struct sym_m_vtob {	/* Virtual to Bus address translation */
+ 	struct sym_m_vtob *next;
+-#ifdef	SYM_HAVE_M_SVTOB
+-	struct sym_m_svtob s;	/* OS specific data structure */
+-#endif
+-	m_addr_t	vaddr;	/* Virtual address */
+-	m_addr_t	baddr;	/* Bus physical address */
++	void *vaddr;		/* Virtual address */
++	dma_addr_t baddr;	/* Bus physical address */
+ } *m_vtob_p;
+ 
+ /* Hash this stuff a bit to speed up translations */
+@@ -1240,7 +1233,7 @@
+ #define VTOB_HASH_SIZE		(1UL << VTOB_HASH_SHIFT)
+ #define VTOB_HASH_MASK		(VTOB_HASH_SIZE-1)
+ #define VTOB_HASH_CODE(m)	\
+-	((((m_addr_t) (m)) >> SYM_MEM_CLUSTER_SHIFT) & VTOB_HASH_MASK)
++	((((unsigned long)(m)) >> SYM_MEM_CLUSTER_SHIFT) & VTOB_HASH_MASK)
+ 
+ /*
+  *  Memory pool of a given kind.
+@@ -1253,15 +1246,12 @@
+  */
+ typedef struct sym_m_pool {
+ 	m_pool_ident_t	dev_dmat;	/* Identifies the pool (see above) */
+-	m_addr_t (*get_mem_cluster)(struct sym_m_pool *);
++	void * (*get_mem_cluster)(struct sym_m_pool *);
+ #ifdef	SYM_MEM_FREE_UNUSED
+-	void (*free_mem_cluster)(struct sym_m_pool *, m_addr_t);
++	void (*free_mem_cluster)(struct sym_m_pool *, void *);
+ #endif
+ #define M_GET_MEM_CLUSTER()		mp->get_mem_cluster(mp)
+ #define M_FREE_MEM_CLUSTER(p)		mp->free_mem_cluster(mp, p)
+-#ifdef	SYM_HAVE_M_SPOOL
+-	struct sym_m_spool	s;	/* OS specific data structure */
+-#endif
+ 	int nump;
+ 	m_vtob_p vtob[VTOB_HASH_SIZE];
+ 	struct sym_m_pool *next;
+@@ -1269,19 +1259,12 @@
+ } *m_pool_p;
+ 
+ /*
+- *  Alloc and free non DMAable memory.
+- */
+-void sym_mfree_unlocked(void *ptr, int size, char *name);
+-void *sym_calloc_unlocked(int size, char *name);
+-
+-/*
+  *  Alloc, free and translate addresses to bus physical 
+  *  for DMAable memory.
+  */
+-void *__sym_calloc_dma_unlocked(m_pool_ident_t dev_dmat, int size, char *name);
+-void 
+-__sym_mfree_dma_unlocked(m_pool_ident_t dev_dmat, void *m,int size, char *name);
+-u32 __vtobus_unlocked(m_pool_ident_t dev_dmat, void *m);
++void *__sym_calloc_dma(m_pool_ident_t dev_dmat, int size, char *name);
++void __sym_mfree_dma(m_pool_ident_t dev_dmat, void *m, int size, char *name);
++dma_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m);
+ 
+ /*
+  * Verbs used by the driver code for DMAable memory handling.
+@@ -1295,15 +1278,33 @@
+ 			__sym_mfree_dma(np->bus_dmat, _uvptv_(p), l, n)
+ #define sym_calloc_dma(l, n)		_sym_calloc_dma(np, l, n)
+ #define sym_mfree_dma(p, l, n)		_sym_mfree_dma(np, p, l, n)
+-#define _vtobus(np, p)			__vtobus(np->bus_dmat, _uvptv_(p))
+-#define vtobus(p)			_vtobus(np, p)
++#define vtobus(p)			__vtobus(np->bus_dmat, _uvptv_(p))
+ 
+ /*
+- *  Override some function names.
++ *  We have to provide the driver memory allocator with methods for 
++ *  it to maintain virtual to bus physical address translations.
+  */
+-#define PRINT_ADDR	sym_print_addr
+-#define PRINT_TARGET	sym_print_target
+-#define PRINT_LUN	sym_print_lun
+-#define UDELAY		sym_udelay
++
++#define sym_m_pool_match(mp_id1, mp_id2)	(mp_id1 == mp_id2)
++
++static __inline void *sym_m_get_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
++{
++	void *vaddr = NULL;
++	dma_addr_t baddr = 0;
++
++	vaddr = dma_alloc_coherent(mp->dev_dmat, SYM_MEM_CLUSTER_SIZE, &baddr,
++			GFP_ATOMIC);
++	if (vaddr) {
++		vbp->vaddr = vaddr;
++		vbp->baddr = baddr;
++	}
++	return vaddr;
++}
++
++static __inline void sym_m_free_dma_mem_cluster(m_pool_p mp, m_vtob_p vbp)
++{
++	dma_free_coherent(mp->dev_dmat, SYM_MEM_CLUSTER_SIZE, vbp->vaddr,
++			vbp->baddr);
++}
+ 
+ #endif /* SYM_HIPD_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_malloc.c CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_malloc.c
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_malloc.c	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_malloc.c	2005-03-04 08:35:58.000000000 -0700
+@@ -66,7 +66,7 @@
+ 	int i = 0;
+ 	int s = (1 << SYM_MEM_SHIFT);
+ 	int j;
+-	m_addr_t a;
++	void *a;
+ 	m_link_p h = mp->h;
+ 
+ 	if (size > SYM_MEM_CLUSTER_SIZE)
+@@ -88,7 +88,7 @@
+ 		++j;
+ 		s <<= 1;
+ 	}
+-	a = (m_addr_t) h[j].next;
++	a = h[j].next;
+ 	if (a) {
+ 		h[j].next = h[j].next->next;
+ 		while (j > i) {
+@@ -101,7 +101,7 @@
+ #ifdef DEBUG
+ 	printf("___sym_malloc(%d) = %p\n", size, (void *) a);
+ #endif
+-	return (void *) a;
++	return a;
+ }
+ 
+ /*
+@@ -112,7 +112,7 @@
+ 	int i = 0;
+ 	int s = (1 << SYM_MEM_SHIFT);
+ 	m_link_p q;
+-	m_addr_t a, b;
++	unsigned long a, b;
+ 	m_link_p h = mp->h;
+ 
+ #ifdef DEBUG
+@@ -127,12 +127,12 @@
+ 		++i;
+ 	}
+ 
+-	a = (m_addr_t) ptr;
++	a = (unsigned long)ptr;
+ 
+ 	while (1) {
+ 		if (s == SYM_MEM_CLUSTER_SIZE) {
+ #ifdef SYM_MEM_FREE_UNUSED
+-			M_FREE_MEM_CLUSTER(a);
++			M_FREE_MEM_CLUSTER((void *)a);
+ #else
+ 			((m_link_p) a)->next = h[i].next;
+ 			h[i].next = (m_link_p) a;
+@@ -194,58 +194,40 @@
+  *  With DMA abstraction, we use functions (methods), to 
+  *  distinguish between non DMAable memory and DMAable memory.
+  */
+-static m_addr_t ___mp0_get_mem_cluster(m_pool_p mp)
++static void *___mp0_get_mem_cluster(m_pool_p mp)
+ {
+-	m_addr_t m = (m_addr_t) sym_get_mem_cluster();
++	void *m = sym_get_mem_cluster();
+ 	if (m)
+ 		++mp->nump;
+ 	return m;
+ }
+ 
+ #ifdef	SYM_MEM_FREE_UNUSED
+-static void ___mp0_free_mem_cluster(m_pool_p mp, m_addr_t m)
++static void ___mp0_free_mem_cluster(m_pool_p mp, void *m)
+ {
+ 	sym_free_mem_cluster(m);
+ 	--mp->nump;
+ }
+-#endif
+-
+-#ifdef	SYM_MEM_FREE_UNUSED
+-static struct sym_m_pool mp0 =
+-	{NULL, ___mp0_get_mem_cluster, ___mp0_free_mem_cluster};
+ #else
+-static struct sym_m_pool mp0 =
+-	{NULL, ___mp0_get_mem_cluster};
++#define ___mp0_free_mem_cluster NULL
+ #endif
+ 
+-/*
+- * Actual memory allocation routine for non-DMAed memory.
+- */
+-void *sym_calloc_unlocked(int size, char *name)
+-{
+-	void *m;
+-	m = __sym_calloc(&mp0, size, name);
+-	return m;
+-}
+-
+-/*
+- *  Its counter-part.
+- */
+-void sym_mfree_unlocked(void *ptr, int size, char *name)
+-{
+-	__sym_mfree(&mp0, ptr, size, name);
+-}
++static struct sym_m_pool mp0 = {
++	NULL,
++	___mp0_get_mem_cluster,
++	___mp0_free_mem_cluster
++};
+ 
+ /*
+  *  Methods that maintains DMAable pools according to user allocations.
+  *  New pools are created on the fly when a new pool id is provided.
+  *  They are deleted on the fly when they get emptied.
+  */
+-/* Get a memory cluster that matches the DMA contraints of a given pool */
+-static m_addr_t ___get_dma_mem_cluster(m_pool_p mp)
++/* Get a memory cluster that matches the DMA constraints of a given pool */
++static void * ___get_dma_mem_cluster(m_pool_p mp)
+ {
+ 	m_vtob_p vbp;
+-	m_addr_t vaddr;
++	void *vaddr;
+ 
+ 	vbp = __sym_calloc(&mp0, sizeof(*vbp), "VTOB");
+ 	if (!vbp)
+@@ -257,16 +239,15 @@
+ 		vbp->next = mp->vtob[hc];
+ 		mp->vtob[hc] = vbp;
+ 		++mp->nump;
+-		return (m_addr_t) vaddr;
+ 	}
+ 	return vaddr;
+ out_err:
+-	return 0;
++	return NULL;
+ }
+ 
+ #ifdef	SYM_MEM_FREE_UNUSED
+ /* Free a memory cluster and associated resources for DMA */
+-static void ___free_dma_mem_cluster(m_pool_p mp, m_addr_t m)
++static void ___free_dma_mem_cluster(m_pool_p mp, void *m)
+ {
+ 	m_vtob_p *vbpp, vbp;
+ 	int hc = VTOB_HASH_CODE(m);
+@@ -297,23 +278,17 @@
+ /* Create a new memory DMAable pool (when fetch failed) */
+ static m_pool_p ___cre_dma_pool(m_pool_ident_t dev_dmat)
+ {
+-	m_pool_p mp = NULL;
+-
+-	mp = __sym_calloc(&mp0, sizeof(*mp), "MPOOL");
++	m_pool_p mp = __sym_calloc(&mp0, sizeof(*mp), "MPOOL");
+ 	if (mp) {
+ 		mp->dev_dmat = dev_dmat;
+-		if (!sym_m_create_dma_mem_tag(mp)) {
+-			mp->get_mem_cluster = ___get_dma_mem_cluster;
++		mp->get_mem_cluster = ___get_dma_mem_cluster;
+ #ifdef	SYM_MEM_FREE_UNUSED
+-			mp->free_mem_cluster = ___free_dma_mem_cluster;
++		mp->free_mem_cluster = ___free_dma_mem_cluster;
+ #endif
+-			mp->next = mp0.next;
+-			mp0.next = mp;
+-			return mp;
+-		}
++		mp->next = mp0.next;
++		mp0.next = mp;
++		return mp;
+ 	}
+-	if (mp)
+-		__sym_mfree(&mp0, mp, sizeof(*mp), "MPOOL");
+ 	return NULL;
+ }
+ 
+@@ -327,68 +302,81 @@
+ 		pp = &(*pp)->next;
+ 	if (*pp) {
+ 		*pp = (*pp)->next;
+-		sym_m_delete_dma_mem_tag(p);
+ 		__sym_mfree(&mp0, p, sizeof(*p), "MPOOL");
+ 	}
+ }
+ #endif
+ 
++/* This lock protects only the memory allocation/free.  */
++static DEFINE_SPINLOCK(sym53c8xx_lock);
++
+ /*
+  *  Actual allocator for DMAable memory.
+  */
+-void *__sym_calloc_dma_unlocked(m_pool_ident_t dev_dmat, int size, char *name)
++void *__sym_calloc_dma(m_pool_ident_t dev_dmat, int size, char *name)
+ {
++	unsigned long flags;
+ 	m_pool_p mp;
+ 	void *m = NULL;
+ 
++	spin_lock_irqsave(&sym53c8xx_lock, flags);
+ 	mp = ___get_dma_pool(dev_dmat);
+ 	if (!mp)
+ 		mp = ___cre_dma_pool(dev_dmat);
+-	if (mp)
+-		m = __sym_calloc(mp, size, name);
++	if (!mp)
++		goto out;
++	m = __sym_calloc(mp, size, name);
+ #ifdef	SYM_MEM_FREE_UNUSED
+-	if (mp && !mp->nump)
++	if (!mp->nump)
+ 		___del_dma_pool(mp);
+ #endif
+ 
++ out:
++	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+ 	return m;
+ }
+ 
+-/*
+- *  Its counter-part.
+- */
+-void 
+-__sym_mfree_dma_unlocked(m_pool_ident_t dev_dmat, void *m, int size, char *name)
++void __sym_mfree_dma(m_pool_ident_t dev_dmat, void *m, int size, char *name)
+ {
++	unsigned long flags;
+ 	m_pool_p mp;
+ 
++	spin_lock_irqsave(&sym53c8xx_lock, flags);
+ 	mp = ___get_dma_pool(dev_dmat);
+-	if (mp)
+-		__sym_mfree(mp, m, size, name);
++	if (!mp)
++		goto out;
++	__sym_mfree(mp, m, size, name);
+ #ifdef	SYM_MEM_FREE_UNUSED
+-	if (mp && !mp->nump)
++	if (!mp->nump)
+ 		___del_dma_pool(mp);
+ #endif
++ out:
++	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
+ }
+ 
+ /*
+  *  Actual virtual to bus physical address translator 
+  *  for 32 bit addressable DMAable memory.
+  */
+-u32 __vtobus_unlocked(m_pool_ident_t dev_dmat, void *m)
++dma_addr_t __vtobus(m_pool_ident_t dev_dmat, void *m)
+ {
++	unsigned long flags;
+ 	m_pool_p mp;
+ 	int hc = VTOB_HASH_CODE(m);
+ 	m_vtob_p vp = NULL;
+-	m_addr_t a = ((m_addr_t) m) & ~SYM_MEM_CLUSTER_MASK;
++	void *a = (void *)((unsigned long)m & ~SYM_MEM_CLUSTER_MASK);
++	dma_addr_t b;
+ 
++	spin_lock_irqsave(&sym53c8xx_lock, flags);
+ 	mp = ___get_dma_pool(dev_dmat);
+ 	if (mp) {
+ 		vp = mp->vtob[hc];
+-		while (vp && (m_addr_t) vp->vaddr != a)
++		while (vp && vp->vaddr != a)
+ 			vp = vp->next;
+ 	}
+ 	if (!vp)
+ 		panic("sym: VTOBUS FAILED!\n");
+-	return (u32)(vp ? vp->baddr + (((m_addr_t) m) - a) : 0);
++	b = vp->baddr + (m - a);
++	spin_unlock_irqrestore(&sym53c8xx_lock, flags);
++	return b;
+ }
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_misc.c CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_misc.c
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_misc.c	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_misc.c	1969-12-31 17:00:00.000000000 -0700
+@@ -1,111 +0,0 @@
+-/*
+- * Device driver for the SYMBIOS/LSILOGIC 53C8XX and 53C1010 family 
+- * of PCI-SCSI IO processors.
+- *
+- * Copyright (C) 1999-2001  Gerard Roudier <groudier at free.fr>
+- *
+- * This driver is derived from the Linux sym53c8xx driver.
+- * Copyright (C) 1998-2000  Gerard Roudier
+- *
+- * The sym53c8xx driver is derived from the ncr53c8xx driver that had been 
+- * a port of the FreeBSD ncr driver to Linux-1.2.13.
+- *
+- * The original ncr driver has been written for 386bsd and FreeBSD by
+- *         Wolfgang Stanglmeier        <wolf at cologne.de>
+- *         Stefan Esser                <se at mi.Uni-Koeln.de>
+- * Copyright (C) 1994  Wolfgang Stanglmeier
+- *
+- * Other major contributions:
+- *
+- * NVRAM detection and reading.
+- * Copyright (C) 1997 Richard Waltham <dormouse at farsrobt.demon.co.uk>
+- *
+- *-----------------------------------------------------------------------------
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+- */
+-
+-#include "sym_glue.h"
+-
+-#ifdef	SYM_OPT_ANNOUNCE_TRANSFER_RATE
+-/*
+- *  Announce transfer rate if anything changed since last announcement.
+- */
+-void sym_announce_transfer_rate(struct sym_hcb *np, int target)
+-{
+-	tcb_p tp = &np->target[target];
+-
+-#define __tprev	tp->tinfo.prev
+-#define __tcurr	tp->tinfo.curr
+-
+-	if (__tprev.options  == __tcurr.options &&
+-	    __tprev.width    == __tcurr.width   &&
+-	    __tprev.offset   == __tcurr.offset  &&
+-	    !(__tprev.offset && __tprev.period != __tcurr.period))
+-		return;
+-
+-	__tprev.options  = __tcurr.options;
+-	__tprev.width    = __tcurr.width;
+-	__tprev.offset   = __tcurr.offset;
+-	__tprev.period   = __tcurr.period;
+-
+-	if (__tcurr.offset && __tcurr.period) {
+-		u_int period, f10, mb10;
+-		char *scsi;
+-
+-		period = f10 = mb10 = 0;
+-		scsi = "FAST-5";
+-
+-		if (__tcurr.period <= 9) {
+-			scsi = "FAST-80";
+-			period = 125;
+-			mb10 = 1600;
+-		}
+-		else {
+-			if	(__tcurr.period <= 11) {
+-				scsi = "FAST-40";
+-				period = 250;
+-				if (__tcurr.period == 11)
+-					period = 303;
+-			}
+-			else if	(__tcurr.period < 25) {
+-				scsi = "FAST-20";
+-				if (__tcurr.period == 12)
+-					period = 500;
+-			}
+-			else if	(__tcurr.period <= 50) {
+-				scsi = "FAST-10";
+-			}
+-			if (!period)
+-				period = 40 * __tcurr.period;
+-			f10 = 100000 << (__tcurr.width ? 1 : 0);
+-			mb10 = (f10 + period/2) / period;
+-		}
+-		printf_info (
+-		    "%s:%d: %s %sSCSI %d.%d MB/s %s%s%s (%d.%d ns, offset %d)\n",
+-		    sym_name(np), target, scsi, __tcurr.width? "WIDE " : "",
+-		    mb10/10, mb10%10,
+-		    (__tcurr.options & PPR_OPT_DT) ? "DT" : "ST",
+-		    (__tcurr.options & PPR_OPT_IU) ? " IU" : "",
+-		    (__tcurr.options & PPR_OPT_QAS) ? " QAS" : "",
+-		    period/10, period%10, __tcurr.offset);
+-	}
+-	else
+-		printf_info ("%s:%d: %sasynchronous.\n", 
+-		             sym_name(np), target, __tcurr.width? "wide " : "");
+-}
+-#undef __tprev
+-#undef __tcurr
+-#endif	/* SYM_OPT_ANNOUNCE_TRANSFER_RATE */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_nvram.c CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_nvram.c
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_nvram.c	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_nvram.c	2005-03-02 09:29:49.000000000 -0700
+@@ -47,7 +47,7 @@
+ /*
+  *  Get host setup from NVRAM.
+  */
+-void sym_nvram_setup_host(struct sym_hcb *np, struct sym_nvram *nvram)
++void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram)
+ {
+ 	/*
+ 	 *  Get parity checking, host ID, verbose mode 
+@@ -61,7 +61,7 @@
+ 		if (nvram->data.Symbios.flags & SYMBIOS_VERBOSE_MSGS)
+ 			np->verbose += 1;
+ 		if (nvram->data.Symbios.flags1 & SYMBIOS_SCAN_HI_LO)
+-			np->usrflags |= SYM_SCAN_TARGETS_HILO;
++			shost->reverse_ordering = 1;
+ 		if (nvram->data.Symbios.flags2 & SYMBIOS_AVOID_BUS_RESET)
+ 			np->usrflags |= SYM_AVOID_BUS_RESET;
+ 		break;
+@@ -253,7 +253,7 @@
+ static void S24C16_set_bit(struct sym_device *np, u_char write_bit, u_char *gpreg, 
+ 			  int bit_mode)
+ {
+-	UDELAY (5);
++	udelay(5);
+ 	switch (bit_mode) {
+ 	case SET_BIT:
+ 		*gpreg |= write_bit;
+@@ -269,8 +269,8 @@
+ 		break;
+ 
+ 	}
+-	OUTB (nc_gpreg, *gpreg);
+-	UDELAY (5);
++	OUTB(np, nc_gpreg, *gpreg);
++	udelay(5);
+ }
+ 
+ /*
+@@ -303,7 +303,7 @@
+ 	S24C16_set_bit(np, write_bit, gpreg, SET_BIT);
+ 	S24C16_set_bit(np, 0, gpreg, SET_CLK);
+ 	if (read_bit)
+-		*read_bit = INB (nc_gpreg);
++		*read_bit = INB(np, nc_gpreg);
+ 	S24C16_set_bit(np, 0, gpreg, CLR_CLK);
+ 	S24C16_set_bit(np, 0, gpreg, CLR_BIT);
+ }
+@@ -315,9 +315,9 @@
+ static void S24C16_write_ack(struct sym_device *np, u_char write_bit, u_char *gpreg, 
+ 			    u_char *gpcntl)
+ {
+-	OUTB (nc_gpcntl, *gpcntl & 0xfe);
++	OUTB(np, nc_gpcntl, *gpcntl & 0xfe);
+ 	S24C16_do_bit(np, NULL, write_bit, gpreg);
+-	OUTB (nc_gpcntl, *gpcntl);
++	OUTB(np, nc_gpcntl, *gpcntl);
+ }
+ 
+ /*
+@@ -327,9 +327,9 @@
+ static void S24C16_read_ack(struct sym_device *np, u_char *read_bit, u_char *gpreg, 
+ 			   u_char *gpcntl)
+ {
+-	OUTB (nc_gpcntl, *gpcntl | 0x01);
++	OUTB(np, nc_gpcntl, *gpcntl | 0x01);
+ 	S24C16_do_bit(np, read_bit, 1, gpreg);
+-	OUTB (nc_gpcntl, *gpcntl);
++	OUTB(np, nc_gpcntl, *gpcntl);
+ }
+ 
+ /*
+@@ -379,13 +379,13 @@
+ 	int	x;
+ 
+ 	/* save current state of GPCNTL and GPREG */
+-	old_gpreg	= INB (nc_gpreg);
+-	old_gpcntl	= INB (nc_gpcntl);
++	old_gpreg	= INB(np, nc_gpreg);
++	old_gpcntl	= INB(np, nc_gpcntl);
+ 	gpcntl		= old_gpcntl & 0x1c;
+ 
+ 	/* set up GPREG & GPCNTL to set GPIO0 and GPIO1 in to known state */
+-	OUTB (nc_gpreg,  old_gpreg);
+-	OUTB (nc_gpcntl, gpcntl);
++	OUTB(np, nc_gpreg,  old_gpreg);
++	OUTB(np, nc_gpcntl, gpcntl);
+ 
+ 	/* this is to set NVRAM into a known state with GPIO0/1 both low */
+ 	gpreg = old_gpreg;
+@@ -414,8 +414,8 @@
+ 	}
+ 
+ 	/* return GPIO0/1 to original states after having accessed NVRAM */
+-	OUTB (nc_gpcntl, old_gpcntl);
+-	OUTB (nc_gpreg,  old_gpreg);
++	OUTB(np, nc_gpcntl, old_gpcntl);
++	OUTB(np, nc_gpreg,  old_gpreg);
+ 
+ 	return 0;
+ }
+@@ -433,13 +433,13 @@
+ 	int	x;
+ 
+ 	/* save current state of GPCNTL and GPREG */
+-	old_gpreg	= INB (nc_gpreg);
+-	old_gpcntl	= INB (nc_gpcntl);
++	old_gpreg	= INB(np, nc_gpreg);
++	old_gpcntl	= INB(np, nc_gpcntl);
+ 	gpcntl		= old_gpcntl & 0x1c;
+ 
+ 	/* set up GPREG & GPCNTL to set GPIO0 and GPIO1 in to known state */
+-	OUTB (nc_gpreg,  old_gpreg);
+-	OUTB (nc_gpcntl, gpcntl);
++	OUTB(np, nc_gpreg,  old_gpreg);
++	OUTB(np, nc_gpcntl, gpcntl);
+ 
+ 	/* this is to set NVRAM into a known state with GPIO0/1 both low */
+ 	gpreg = old_gpreg;
+@@ -475,7 +475,7 @@
+ 
+ 	/* now set up GPIO0 for inputting data */
+ 	gpcntl |= 0x01;
+-	OUTB (nc_gpcntl, gpcntl);
++	OUTB(np, nc_gpcntl, gpcntl);
+ 		
+ 	/* input all requested data - only part of total NVRAM */
+ 	for (x = 0; x < len; x++) 
+@@ -483,13 +483,13 @@
+ 
+ 	/* finally put NVRAM back in inactive mode */
+ 	gpcntl &= 0xfe;
+-	OUTB (nc_gpcntl, gpcntl);
++	OUTB(np, nc_gpcntl, gpcntl);
+ 	S24C16_stop(np, &gpreg);
+ 	retv = 0;
+ out:
+ 	/* return GPIO0/1 to original states after having accessed NVRAM */
+-	OUTB (nc_gpcntl, old_gpcntl);
+-	OUTB (nc_gpreg,  old_gpreg);
++	OUTB(np, nc_gpcntl, old_gpcntl);
++	OUTB(np, nc_gpreg,  old_gpreg);
+ 
+ 	return retv;
+ }
+@@ -546,9 +546,9 @@
+  */
+ static void T93C46_Clk(struct sym_device *np, u_char *gpreg)
+ {
+-	OUTB (nc_gpreg, *gpreg | 0x04);
+-	UDELAY (2);
+-	OUTB (nc_gpreg, *gpreg);
++	OUTB(np, nc_gpreg, *gpreg | 0x04);
++	udelay(2);
++	OUTB(np, nc_gpreg, *gpreg);
+ }
+ 
+ /* 
+@@ -556,9 +556,9 @@
+  */
+ static void T93C46_Read_Bit(struct sym_device *np, u_char *read_bit, u_char *gpreg)
+ {
+-	UDELAY (2);
++	udelay(2);
+ 	T93C46_Clk(np, gpreg);
+-	*read_bit = INB (nc_gpreg);
++	*read_bit = INB(np, nc_gpreg);
+ }
+ 
+ /*
+@@ -573,8 +573,8 @@
+ 		
+ 	*gpreg |= 0x10;
+ 		
+-	OUTB (nc_gpreg, *gpreg);
+-	UDELAY (2);
++	OUTB(np, nc_gpreg, *gpreg);
++	udelay(2);
+ 
+ 	T93C46_Clk(np, gpreg);
+ }
+@@ -585,8 +585,8 @@
+ static void T93C46_Stop(struct sym_device *np, u_char *gpreg)
+ {
+ 	*gpreg &= 0xef;
+-	OUTB (nc_gpreg, *gpreg);
+-	UDELAY (2);
++	OUTB(np, nc_gpreg, *gpreg);
++	udelay(2);
+ 
+ 	T93C46_Clk(np, gpreg);
+ }
+@@ -603,7 +603,7 @@
+ 	for (x = 0; x < 9; x++)
+ 		T93C46_Write_Bit(np, (u_char) (write_data >> (8 - x)), gpreg);
+ 
+-	*read_bit = INB (nc_gpreg);
++	*read_bit = INB(np, nc_gpreg);
+ }
+ 
+ /*
+@@ -657,23 +657,23 @@
+ 	int retv = 1;
+ 
+ 	/* save current state of GPCNTL and GPREG */
+-	old_gpreg	= INB (nc_gpreg);
+-	old_gpcntl	= INB (nc_gpcntl);
++	old_gpreg	= INB(np, nc_gpreg);
++	old_gpcntl	= INB(np, nc_gpcntl);
+ 
+ 	/* set up GPREG & GPCNTL to set GPIO0/1/2/4 in to known state, 0 in,
+ 	   1/2/4 out */
+ 	gpreg = old_gpreg & 0xe9;
+-	OUTB (nc_gpreg, gpreg);
++	OUTB(np, nc_gpreg, gpreg);
+ 	gpcntl = (old_gpcntl & 0xe9) | 0x09;
+-	OUTB (nc_gpcntl, gpcntl);
++	OUTB(np, nc_gpcntl, gpcntl);
+ 
+ 	/* input all of NVRAM, 64 words */
+ 	retv = T93C46_Read_Data(np, (u_short *) nvram,
+ 				sizeof(*nvram) / sizeof(short), &gpreg);
+ 	
+ 	/* return GPIO0/1/2/4 to original states after having accessed NVRAM */
+-	OUTB (nc_gpcntl, old_gpcntl);
+-	OUTB (nc_gpreg,  old_gpreg);
++	OUTB(np, nc_gpcntl, old_gpcntl);
++	OUTB(np, nc_gpreg,  old_gpreg);
+ 
+ 	return retv;
+ }
+@@ -755,3 +755,17 @@
+ 	}
+ 	return nvp->type;
+ }
++
++char *sym_nvram_type(struct sym_nvram *nvp)
++{
++	switch (nvp->type) {
++	case SYM_SYMBIOS_NVRAM:
++		return "Symbios NVRAM";
++	case SYM_TEKRAM_NVRAM:
++		return "Tekram NVRAM";
++	case SYM_PARISC_PDC:
++		return "PA-RISC Firmware";
++	default:
++		return "No NVRAM";
++	}
++}
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_nvram.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_nvram.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_2/sym_nvram.h	2005-03-02 04:19:14.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_2/sym_nvram.h	2005-03-01 10:05:10.000000000 -0700
+@@ -40,7 +40,7 @@
+ #ifndef SYM_NVRAM_H
+ #define SYM_NVRAM_H
+ 
+-#include "sym_conf.h"
++#include "sym53c8xx.h"
+ 
+ /*
+  *	Symbios NVRAM data format
+@@ -193,17 +193,22 @@
+ };
+ 
+ #if SYM_CONF_NVRAM_SUPPORT
+-void sym_nvram_setup_host (struct sym_hcb *np, struct sym_nvram *nvram);
++void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram);
+ void sym_nvram_setup_target (struct sym_hcb *np, int target, struct sym_nvram *nvp);
+ int sym_read_nvram (struct sym_device *np, struct sym_nvram *nvp);
++char *sym_nvram_type(struct sym_nvram *nvp);
+ #else
+-static inline void sym_nvram_setup_host(struct sym_hcb *np, struct sym_nvram *nvram) { }
++static inline void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram) { }
+ static inline void sym_nvram_setup_target(struct sym_hcb *np, struct sym_nvram *nvram) { }
+ static inline int sym_read_nvram(struct sym_device *np, struct sym_nvram *nvp)
+ {
+ 	nvp->type = 0;
+ 	return 0;
+ }
++static inline char *sym_nvram_type(struct sym_nvram *nvp)
++{
++	return "No NVRAM";
++}
+ #endif
+ 
+ #endif /* SYM_NVRAM_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/sym53c8xx_defs.h CVS2_6_11_PA2/drivers/scsi/sym53c8xx_defs.h
+--- LINUS_2_6_11/drivers/scsi/sym53c8xx_defs.h	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/sym53c8xx_defs.h	2005-02-21 08:26:11.000000000 -0700
+@@ -314,9 +314,9 @@
+ #define	writew_b2l	__raw_writew
+ #define	writel_b2l	__raw_writel
+ #define	readw_raw	__raw_readw
+-#define	readl_raw(a)	__raw_readl((unsigned long)(a))
++#define	readl_raw	__raw_readl
+ #define	writew_raw	__raw_writew
+-#define	writel_raw(v,a)	__raw_writel(v,(unsigned long)(a))
++#define	writel_raw	__raw_writel
+ #else	/* Other big-endian */
+ #define	readw_l2b	readw
+ #define	readl_l2b	readl
+@@ -1281,34 +1281,34 @@
+ **	Messages
+ */
+ 
+-#define	M_COMPLETE	(0x00)
+-#define	M_EXTENDED	(0x01)
+-#define	M_SAVE_DP	(0x02)
+-#define	M_RESTORE_DP	(0x03)
+-#define	M_DISCONNECT	(0x04)
+-#define	M_ID_ERROR	(0x05)
+-#define	M_ABORT		(0x06)
+-#define	M_REJECT	(0x07)
+-#define	M_NOOP		(0x08)
+-#define	M_PARITY	(0x09)
+-#define	M_LCOMPLETE	(0x0a)
+-#define	M_FCOMPLETE	(0x0b)
+-#define	M_RESET		(0x0c)
+-#define	M_ABORT_TAG	(0x0d)
+-#define	M_CLEAR_QUEUE	(0x0e)
+-#define	M_INIT_REC	(0x0f)
+-#define	M_REL_REC	(0x10)
++#define	M_COMPLETE	COMMAND_COMPLETE
++#define	M_EXTENDED	EXTENDED_MESSAGE
++#define	M_SAVE_DP	SAVE_POINTERS
++#define	M_RESTORE_DP	RESTORE_POINTERS
++#define	M_DISCONNECT	DISCONNECT
++#define	M_ID_ERROR	INITIATOR_ERROR
++#define	M_ABORT		ABORT_TASK_SET
++#define	M_REJECT	MESSAGE_REJECT
++#define	M_NOOP		NOP
++#define	M_PARITY	MSG_PARITY_ERROR
++#define	M_LCOMPLETE	LINKED_CMD_COMPLETE
++#define	M_FCOMPLETE	LINKED_FLG_CMD_COMPLETE
++#define	M_RESET		TARGET_RESET
++#define	M_ABORT_TAG	ABORT_TASK
++#define	M_CLEAR_QUEUE	CLEAR_TASK_SET
++#define	M_INIT_REC	INITIATE_RECOVERY
++#define	M_REL_REC	RELEASE_RECOVERY
+ #define	M_TERMINATE	(0x11)
+-#define	M_SIMPLE_TAG	(0x20)
+-#define	M_HEAD_TAG	(0x21)
+-#define	M_ORDERED_TAG	(0x22)
+-#define	M_IGN_RESIDUE	(0x23)
++#define	M_SIMPLE_TAG	SIMPLE_QUEUE_TAG
++#define	M_HEAD_TAG	HEAD_OF_QUEUE_TAG
++#define	M_ORDERED_TAG	ORDERED_QUEUE_TAG
++#define	M_IGN_RESIDUE	IGNORE_WIDE_RESIDUE
+ #define	M_IDENTIFY   	(0x80)
+ 
+-#define	M_X_MODIFY_DP	(0x00)
+-#define	M_X_SYNC_REQ	(0x01)
+-#define	M_X_WIDE_REQ	(0x03)
+-#define	M_X_PPR_REQ	(0x04)
++#define	M_X_MODIFY_DP	EXTENDED_MODIFY_DATA_POINTER
++#define	M_X_SYNC_REQ	EXTENDED_SDTR
++#define	M_X_WIDE_REQ	EXTENDED_WDTR
++#define	M_X_PPR_REQ	EXTENDED_PPR
+ 
+ /*
+ **	Status
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/scsi/zalon.c CVS2_6_11_PA2/drivers/scsi/zalon.c
+--- LINUS_2_6_11/drivers/scsi/zalon.c	2005-03-02 04:19:13.000000000 -0700
++++ CVS2_6_11_PA2/drivers/scsi/zalon.c	2005-01-11 21:02:54.000000000 -0700
+@@ -88,31 +88,30 @@
+ 	struct gsc_irq gsc_irq;
+ 	u32 zalon_vers;
+ 	int error = -ENODEV;
+-	unsigned long zalon = dev->hpa;
+-	unsigned long io_port = zalon + GSC_SCSI_ZALON_OFFSET;
++	void __iomem *zalon = ioremap(dev->hpa, 4096);
++	void __iomem *io_port = zalon + GSC_SCSI_ZALON_OFFSET;
+ 	static int unit = 0;
+ 	struct Scsi_Host *host;
+ 	struct ncr_device device;
+ 
+ 	__raw_writel(CMD_RESET, zalon + IO_MODULE_IO_COMMAND);
+ 	while (!(__raw_readl(zalon + IO_MODULE_IO_STATUS) & IOSTATUS_RY))
+-		;
++		cpu_relax();
+ 	__raw_writel(IOIIDATA_MINT5EN | IOIIDATA_PACKEN | IOIIDATA_PREFETCHEN,
+ 		zalon + IO_MODULE_II_CDATA);
+ 
+ 	/* XXX: Save the Zalon version for bug workarounds? */
+-	zalon_vers = __raw_readl(dev->hpa + IO_MODULE_II_CDATA) & 0x07000000;
+-	zalon_vers >>= 24;
++	zalon_vers = (__raw_readl(zalon + IO_MODULE_II_CDATA) >> 24) & 0x07;
+ 
+ 	/* Setup the interrupts first.
+ 	** Later on request_irq() will register the handler.
+ 	*/
+ 	dev->irq = gsc_alloc_irq(&gsc_irq);
+ 
+-	printk("%s: Zalon vers field is 0x%x, IRQ %d\n", __FUNCTION__,
++	printk(KERN_INFO "%s: Zalon version %d, IRQ %d\n", __FUNCTION__,
+ 		zalon_vers, dev->irq);
+ 
+-	__raw_writel(gsc_irq.txn_addr | gsc_irq.txn_data, dev->hpa + IO_MODULE_EIM);
++	__raw_writel(gsc_irq.txn_addr | gsc_irq.txn_data, zalon + IO_MODULE_EIM);
+ 
+ 	if (zalon_vers == 0)
+ 		printk(KERN_WARNING "%s: Zalon 1.1 or earlier\n", __FUNCTION__);
+@@ -120,16 +119,16 @@
+ 	memset(&device, 0, sizeof(struct ncr_device));
+ 
+ 	/* The following three are needed before any other access. */
+-	writeb(0x20, io_port + 0x38); /* DCNTL_REG,  EA  */
+-	writeb(0x04, io_port + 0x1b); /* CTEST0_REG, EHP */
+-	writeb(0x80, io_port + 0x22); /* CTEST4_REG, MUX */
++	__raw_writeb(0x20, io_port + 0x38); /* DCNTL_REG,  EA  */
++	__raw_writeb(0x04, io_port + 0x1b); /* CTEST0_REG, EHP */
++	__raw_writeb(0x80, io_port + 0x22); /* CTEST4_REG, MUX */
+ 
+ 	/* Initialise ncr_device structure with items required by ncr_attach. */
+ 	device.chip		= zalon720_chip;
+ 	device.host_id		= 7;
+ 	device.dev		= &dev->dev;
+-	device.slot.base	= (u_long)io_port;
+-	device.slot.base_c	= (u_long)io_port;
++	device.slot.base	= dev->hpa + GSC_SCSI_ZALON_OFFSET;
++	device.slot.base_v	= io_port;
+ 	device.slot.irq		= dev->irq;
+ 	device.differential	= 2;
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/serial/mux.c CVS2_6_11_PA2/drivers/serial/mux.c
+--- LINUS_2_6_11/drivers/serial/mux.c	2005-03-02 04:19:15.000000000 -0700
++++ CVS2_6_11_PA2/drivers/serial/mux.c	2005-02-14 07:56:20.000000000 -0700
+@@ -27,6 +27,7 @@
+ #include <linux/delay.h> /* for udelay */
+ #include <linux/device.h>
+ #include <asm/io.h>
++#include <asm/irq.h>
+ #include <asm/parisc-device.h>
+ 
+ #ifdef CONFIG_MAGIC_SYSRQ
+@@ -404,7 +405,7 @@
+ 	.write =	mux_console_write,
+ 	.device =	mux_console_device,
+ 	.setup =	mux_console_setup,
+-	.flags =	CON_BOOT|CON_PRINTBUFFER|CON_ENABLED,
++	.flags =	CON_ENABLED | CON_PRINTBUFFER,
+ 	.index =	0,
+ };
+ 
+@@ -475,7 +476,7 @@
+ 		port->membase	= ioremap(port->mapbase, MUX_LINE_OFFSET);
+ 		port->iotype	= SERIAL_IO_MEM;
+ 		port->type	= PORT_MUX;
+-		port->irq	= SERIAL_IRQ_NONE;
++		port->irq	= NO_IRQ;
+ 		port->uartclk	= 0;
+ 		port->fifosize	= MUX_FIFO_SIZE;
+ 		port->ops	= &mux_pops;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/serial/serial_core.c CVS2_6_11_PA2/drivers/serial/serial_core.c
+--- LINUS_2_6_11/drivers/serial/serial_core.c	2005-03-02 04:19:15.000000000 -0700
++++ CVS2_6_11_PA2/drivers/serial/serial_core.c	2005-01-22 07:59:34.000000000 -0700
+@@ -1929,7 +1929,14 @@
+ 		printk("MMIO 0x%lx", port->mapbase);
+ 		break;
+ 	}
+-	printk(" (irq = %d) is a %s\n", port->irq, uart_type(port));
++#ifndef NO_IRQ
++#define NO_IRQ (-1)
++#endif
++	if (port->irq == NO_IRQ) {
++		printk(" (polled) is a %s\n", uart_type(port));
++	} else {
++		printk(" (irq = %d) is a %s\n", port->irq, uart_type(port));
++	}
+ }
+ 
+ static void
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/video/console/Kconfig CVS2_6_11_PA2/drivers/video/console/Kconfig
+--- LINUS_2_6_11/drivers/video/console/Kconfig	2005-03-02 04:19:17.000000000 -0700
++++ CVS2_6_11_PA2/drivers/video/console/Kconfig	2005-02-14 07:45:08.000000000 -0700
+@@ -65,30 +65,6 @@
+           card of your Indy.  Most people say Y here.
+ 
+ #  bool 'IODC console' CONFIG_IODC_CONSOLE
+-config STI_CONSOLE
+-        tristate "STI text console" 
+-        depends on PARISC && FRAMEBUFFER_CONSOLE
+-        default y
+-        help
+-          The STI console is the builtin display/keyboard on HP-PARISC
+-          machines.  Say Y here to build support for it into your kernel.
+-          The alternative is to use your primary serial port as a console.
+-
+-config DUMMY_CONSOLE_COLUMNS
+-        int "Initial number of console screen columns" if STI_CONSOLE
+-        depends on PARISC
+-        default "160"
+-        help
+-          The default value is 160, which should fit a 1280x1024 monitor.
+-          Select 80 if you use a 640x480 resolution by default.
+-
+-config DUMMY_CONSOLE_ROWS
+-        int "Initial number of console screen rows" if STI_CONSOLE
+-        depends on PARISC
+-        default "64"
+-        help
+-          The default value is 64, which should fit a 1280x1024 monitor.
+-          Select 25 if you use a 640x480 resolution by default.
+ 
+ config PROM_CONSOLE
+ 	bool "PROM console"
+@@ -102,11 +78,36 @@
+ 	depends on PROM_CONSOLE!=y || VGA_CONSOLE!=y || SGI_NEWPORT_CONSOLE!=y 
+ 	default y
+ 
++config DUMMY_CONSOLE_COLUMNS
++        int "Initial number of console screen columns"
++        depends on PARISC && DUMMY_CONSOLE
++        default "160"
++        help
++          The default value is 160, which should fit a 1280x1024 monitor.
++          Select 80 if you use a 640x480 resolution by default.
++
++config DUMMY_CONSOLE_ROWS
++        int "Initial number of console screen rows"
++        depends on PARISC && DUMMY_CONSOLE
++        default "64"
++        help
++          The default value is 64, which should fit a 1280x1024 monitor.
++          Select 25 if you use a 640x480 resolution by default.
++
+ config FRAMEBUFFER_CONSOLE
+ 	tristate "Framebuffer Console support"
+ 	depends on FB
+ 	select CRC32
+ 
++config STI_CONSOLE
++        tristate "STI text console" 
++        depends on PARISC && FRAMEBUFFER_CONSOLE
++        default y
++        help
++          The STI console is the builtin display/keyboard on HP-PARISC
++          machines.  Say Y here to build support for it into your kernel.
++          The alternative is to use your primary serial port as a console.
++
+ config FONTS
+ 	bool "Select compiled-in fonts"
+ 	depends on FRAMEBUFFER_CONSOLE
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/video/console/sticore.c CVS2_6_11_PA2/drivers/video/console/sticore.c
+--- LINUS_2_6_11/drivers/video/console/sticore.c	2005-03-02 04:19:17.000000000 -0700
++++ CVS2_6_11_PA2/drivers/video/console/sticore.c	2005-03-05 15:11:21.000000000 -0700
+@@ -249,13 +249,13 @@
+ 	/* this still needs to be revisited (see arch/parisc/mm/init.c:246) ! */
+ 	while (count >= 4) {
+ 		count -= 4;
+-		*(u32 *)dest = __raw_readl(base);
++		*(u32 *)dest = gsc_readl(base);
+ 		base += 4;
+ 		dest += 4;
+ 	}
+ 	while (count) {
+ 		count--;
+-		*(u8 *)dest = __raw_readb(base);
++		*(u8 *)dest = gsc_readb(base);
+ 		base++;
+ 		dest++;
+ 	}
+@@ -460,12 +460,20 @@
+ 		/* remap virtually */
+ 		/* FIXME: add BTLB support if btlb==1 */
+ 		len = sti->regions[i].region_desc.length * 4096;
+-		
++
++/* XXX: Enabling IOREMAP debugging causes a crash, so we must be passing
++ * a virtual address to something expecting a physical address that doesn't
++ * go through a readX macro */
++#if 0
+ 		if (len)
+ 		   glob_cfg->region_ptrs[i] = (unsigned long) (
+ 			sti->regions[i].region_desc.cache ?
+ 			ioremap(sti->regions_phys[i], len) :
+ 			ioremap_nocache(sti->regions_phys[i], len) );
++#else
++		if (len)
++			glob_cfg->region_ptrs[i] = sti->regions_phys[i];
++#endif
+ 		
+ 		DPRINTK(("region #%d: phys %08lx, virt %08x, len=%lukB, "
+ 			 "btlb=%d, sysonly=%d, cache=%d, last=%d\n",
+@@ -680,7 +688,7 @@
+ 
+ 	while (count) {
+ 		count--;
+-		*(u8 *)dest = __raw_readl(base);
++		*(u8 *)dest = gsc_readl(base);
+ 		base += 4;
+ 		dest++;
+ 	}
+@@ -730,7 +738,7 @@
+ 	unsigned long size;
+     
+ 	/* read the ROM size directly from the struct in ROM */ 
+-	size = __raw_readl(address + offsetof(struct sti_rom,last_addr));
++	size = gsc_readl(address + offsetof(struct sti_rom,last_addr));
+ 
+ 	raw = kmalloc(size, GFP_KERNEL);
+ 	if(raw)
+@@ -825,13 +833,13 @@
+ 	if (pdc_add_valid(address))
+ 		goto out_err;
+ 
+-	sig = __raw_readl(address);
++	sig = gsc_readl(address);
+ 
+ 	/* check for a PCI ROM structure */
+ 	if ((le32_to_cpu(sig)==0xaa55)) {
+ 		unsigned int i, rm_offset;
+ 		u32 *rm;
+-		i = __raw_readl(address+0x04);
++		i = gsc_readl(address+0x04);
+ 		if (i != 1) {
+ 			/* The ROM could have multiple architecture 
+ 			 * dependent images (e.g. i386, parisc,...) */
+@@ -842,17 +850,17 @@
+ 		
+ 		sti->pd = pd;
+ 
+-		i = __raw_readl(address+0x0c);
++		i = gsc_readl(address+0x0c);
+ 		DPRINTK(("PCI ROM size (from header) = %d kB\n",
+ 			le16_to_cpu(i>>16)*512/1024));
+ 		rm_offset = le16_to_cpu(i & 0xffff);
+ 		if (rm_offset) { 
+ 			/* read 16 bytes from the pci region mapper array */
+ 			rm = (u32*) &sti->rm_entry;
+-			*rm++ = __raw_readl(address+rm_offset+0x00);
+-			*rm++ = __raw_readl(address+rm_offset+0x04);
+-			*rm++ = __raw_readl(address+rm_offset+0x08);
+-			*rm++ = __raw_readl(address+rm_offset+0x0c);
++			*rm++ = gsc_readl(address+rm_offset+0x00);
++			*rm++ = gsc_readl(address+rm_offset+0x04);
++			*rm++ = gsc_readl(address+rm_offset+0x08);
++			*rm++ = gsc_readl(address+rm_offset+0x0c);
+ 			DPRINTK(("PCI region Mapper offset = %08x: ",
+ 				rm_offset));
+ 			for (i=0; i<16; i++)
+@@ -860,7 +868,7 @@
+ 			DPRINTK(("\n"));
+ 		}
+ 
+-		address += le32_to_cpu(__raw_readl(address+8));
++		address += le32_to_cpu(gsc_readl(address+8));
+ 		DPRINTK(("sig %04x, PCI STI ROM at %08lx\n", sig, address));
+ 		goto test_rom;
+ 	}
+@@ -1003,17 +1011,17 @@
+ 
+ 
+ static struct pci_device_id sti_pci_tbl[] = {
+-	{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_EG, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+-	{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+-	{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+-	{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+-	{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FXE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
++	{ PCI_DEVICE(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_EG) },
++	{ PCI_DEVICE(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX6) },
++	{ PCI_DEVICE(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX4) },
++	{ PCI_DEVICE(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX2) },
++	{ PCI_DEVICE(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FXE) },
+ 	{ 0, } /* terminate list */
+ };
+ MODULE_DEVICE_TABLE(pci, sti_pci_tbl);
+ 
+ static struct pci_driver pci_sti_driver = {
+-	.name		= "sti (pci)",
++	.name		= "sti",
+ 	.id_table	= sti_pci_tbl,
+ 	.probe		= sticore_pci_init,
+ 	.remove		= sticore_pci_remove,
+@@ -1026,7 +1034,7 @@
+ };
+ 
+ static struct parisc_driver pa_sti_driver = {
+-	.name		= "sti (native)",
++	.name		= "sti",
+ 	.id_table	= sti_pa_tbl,
+ 	.probe		= sticore_pa_init,
+ };
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/drivers/video/stifb.c CVS2_6_11_PA2/drivers/video/stifb.c
+--- LINUS_2_6_11/drivers/video/stifb.c	2005-03-02 04:19:16.000000000 -0700
++++ CVS2_6_11_PA2/drivers/video/stifb.c	2004-11-29 13:42:47.000000000 -0700
+@@ -112,11 +112,10 @@
+ 	ngle_rom_t ngle_rom;
+ 	struct sti_struct *sti;
+ 	int deviceSpecificConfig;
+-	u32 pseudo_palette[16];
++	u32 pseudo_palette[256];
+ };
+ 
+-static int __initdata bpp = 8;	/* parameter from modprobe */
+-static int __initdata stifb_force_bpp[MAX_STI_ROMS];
++static int __initdata stifb_bpp_pref[MAX_STI_ROMS];
+ 
+ /* ------------------- chipset specific functions -------------------------- */
+ 
+@@ -155,15 +154,15 @@
+ #define REG_44		0x210030
+ #define REG_45		0x210034
+ 
+-#define READ_BYTE(fb,reg)		__raw_readb((fb)->info.fix.mmio_start + (reg))
+-#define READ_WORD(fb,reg)		__raw_readl((fb)->info.fix.mmio_start + (reg))
++#define READ_BYTE(fb,reg)		gsc_readb((fb)->info.fix.mmio_start + (reg))
++#define READ_WORD(fb,reg)		gsc_readl((fb)->info.fix.mmio_start + (reg))
+ 
+ 
+ #ifndef DEBUG_STIFB_REGS
+ # define  DEBUG_OFF()
+ # define  DEBUG_ON()
+-# define WRITE_BYTE(value,fb,reg)	__raw_writeb((value),(fb)->info.fix.mmio_start + (reg))
+-# define WRITE_WORD(value,fb,reg)	__raw_writel((value),(fb)->info.fix.mmio_start + (reg))
++# define WRITE_BYTE(value,fb,reg)	gsc_writeb((value),(fb)->info.fix.mmio_start + (reg))
++# define WRITE_WORD(value,fb,reg)	gsc_writel((value),(fb)->info.fix.mmio_start + (reg))
+ #else
+   static int debug_on = 1;
+ # define  DEBUG_OFF() debug_on=0
+@@ -171,11 +170,11 @@
+ # define WRITE_BYTE(value,fb,reg)	do { if (debug_on) \
+ 						printk(KERN_DEBUG "%30s: WRITE_BYTE(0x%06x) = 0x%02x (old=0x%02x)\n", \
+ 							__FUNCTION__, reg, value, READ_BYTE(fb,reg)); 		  \
+-					__raw_writeb((value),(fb)->info.fix.mmio_start + (reg)); } while (0)
++					gsc_writeb((value),(fb)->info.fix.mmio_start + (reg)); } while (0)
+ # define WRITE_WORD(value,fb,reg)	do { if (debug_on) \
+ 						printk(KERN_DEBUG "%30s: WRITE_WORD(0x%06x) = 0x%08x (old=0x%08x)\n", \
+ 							__FUNCTION__, reg, value, READ_WORD(fb,reg)); 		  \
+-					__raw_writel((value),(fb)->info.fix.mmio_start + (reg)); } while (0)
++					gsc_writel((value),(fb)->info.fix.mmio_start + (reg)); } while (0)
+ #endif /* DEBUG_STIFB_REGS */
+ 
+ 
+@@ -1018,6 +1017,15 @@
+ 			 (blue));
+ 	}
+ 
++	if (info->var.bits_per_pixel == 32) {
++		((u32 *)(info->pseudo_palette))[regno] =
++			(red   << info->var.red.offset)   |
++			(green << info->var.green.offset) |
++			(blue  << info->var.blue.offset);
++	} else {
++		((u32 *)(info->pseudo_palette))[regno] = regno;
++	}
++
+ 	WRITE_IMAGE_COLOR(fb, regno, color);
+ 	
+ 	if (fb->id == S9000_ID_HCRX) {
+@@ -1031,14 +1039,6 @@
+ 				/* 0x100 is same as used in WRITE_IMAGE_COLOR() */
+ 		START_COLORMAPLOAD(fb, lutBltCtl.all);
+ 		SETUP_FB(fb);
+-
+-		/* info->var.bits_per_pixel == 32 */
+-		if (regno < 16) 
+-		  ((u32 *)(info->pseudo_palette))[regno] =
+-			(red   << info->var.red.offset)   |
+-			(green << info->var.green.offset) |
+-			(blue  << info->var.blue.offset);
+-
+ 	} else {
+ 		/* cleanup colormap hardware */
+ 		FINISH_IMAGE_COLORMAP_ACCESS(fb);
+@@ -1156,7 +1156,7 @@
+  */
+ 
+ int __init
+-stifb_init_fb(struct sti_struct *sti, int force_bpp)
++stifb_init_fb(struct sti_struct *sti, int bpp_pref)
+ {
+ 	struct fb_fix_screeninfo *fix;
+ 	struct fb_var_screeninfo *var;
+@@ -1257,10 +1257,10 @@
+ #ifdef __LP64__
+ 	        sti_rom_address |= 0xffffffff00000000;
+ #endif
+-		fb->deviceSpecificConfig = __raw_readl(sti_rom_address);
++		fb->deviceSpecificConfig = gsc_readl(sti_rom_address);
+ 		if (IS_24_DEVICE(fb)) {
+-			if (force_bpp == 8 || force_bpp == 32)
+-				bpp = force_bpp;
++			if (bpp_pref == 8 || bpp_pref == 32)
++				bpp = bpp_pref;
+ 			else
+ 				bpp = 32;
+ 		} else
+@@ -1409,21 +1409,24 @@
+ 	
+ 	def_sti = sti_get_rom(0);
+ 	if (def_sti) {
+-		for (i = 1; i < MAX_STI_ROMS; i++) {
++		for (i = 1; i <= MAX_STI_ROMS; i++) {
+ 			sti = sti_get_rom(i);
+-			if (sti == def_sti && bpp > 0)
+-				stifb_force_bpp[i] = bpp;
++			if (!sti)
++				break;
++			if (sti == def_sti) {
++				stifb_init_fb(sti, stifb_bpp_pref[i - 1]);
++				break;
++			}
+ 		}
+-		stifb_init_fb(def_sti, stifb_force_bpp[i]);
+ 	}
+ 
+-	for (i = 1; i < MAX_STI_ROMS; i++) {
++	for (i = 1; i <= MAX_STI_ROMS; i++) {
+ 		sti = sti_get_rom(i);
+-		if (!sti || sti==def_sti)
++		if (!sti)
+ 			break;
+-		if (bpp > 0)
+-			stifb_force_bpp[i] = bpp;
+-		stifb_init_fb(sti, stifb_force_bpp[i]);
++		if (sti == def_sti)
++			continue;
++		stifb_init_fb(sti, stifb_bpp_pref[i - 1]);
+ 	}
+ 	return 0;
+ }
+@@ -1438,7 +1441,7 @@
+ 	struct sti_struct *sti;
+ 	int i;
+ 	
+-	for (i = 1; i < MAX_STI_ROMS; i++) {
++	for (i = 1; i <= MAX_STI_ROMS; i++) {
+ 		sti = sti_get_rom(i);
+ 		if (!sti)
+ 			break;
+@@ -1470,11 +1473,9 @@
+ 	if (strncmp(options, "bpp", 3) == 0) {
+ 		options += 3;
+ 		for (i = 0; i < MAX_STI_ROMS; i++) {
+-			if (*options++ == ':') {
+-				stifb_force_bpp[i] = simple_strtoul(options, &options, 10);
+-				bpp = -1;
+-			} else
++			if (*options++ != ':')
+ 				break;
++			stifb_bpp_pref[i] = simple_strtoul(options, &options, 10);
+ 		}
+ 	}
+ 	return 0;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/fs/Kconfig CVS2_6_11_PA2/fs/Kconfig
+--- LINUS_2_6_11/fs/Kconfig	2005-03-02 04:19:17.000000000 -0700
++++ CVS2_6_11_PA2/fs/Kconfig	2005-02-13 19:55:28.000000000 -0700
+@@ -1400,6 +1400,7 @@
+ 	tristate "NFS server support"
+ 	depends on INET
+ 	select LOCKD
++	select EXPORTFS
+ 	select SUNRPC
+ 	select EXPORTFS
+ 	help
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/fs/smbfs/inode.c CVS2_6_11_PA2/fs/smbfs/inode.c
+--- LINUS_2_6_11/fs/smbfs/inode.c	2005-03-02 04:19:18.000000000 -0700
++++ CVS2_6_11_PA2/fs/smbfs/inode.c	2005-01-12 13:17:32.000000000 -0700
+@@ -564,6 +564,7 @@
+ 
+ 	mnt->ttl = SMB_TTL_DEFAULT;
+ 	if (ver == SMB_MOUNT_OLDVERSION) {
++#ifdef CONFIG_UID16
+ 		mnt->version = oldmnt->version;
+ 
+ 		SET_UID(mnt->uid, oldmnt->uid);
+@@ -574,6 +575,9 @@
+ 
+ 		mnt->flags = (oldmnt->file_mode >> 9) | SMB_MOUNT_UID |
+ 			SMB_MOUNT_GID | SMB_MOUNT_FMODE | SMB_MOUNT_DMODE;
++#else
++		goto out_bad_option;
++#endif
+ 	} else {
+ 		mnt->file_mode = S_IRWXU | S_IRGRP | S_IXGRP |
+ 				S_IROTH | S_IXOTH | S_IFREG;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-generic/compat_signal.h CVS2_6_11_PA2/include/asm-generic/compat_signal.h
+--- LINUS_2_6_11/include/asm-generic/compat_signal.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-generic/compat_signal.h	2004-01-27 22:12:47.000000000 -0700
+@@ -0,0 +1,25 @@
++#ifndef _ASM_GENERIC_COMPAT_SIGNAL_H
++#define _ASM_GENERIC_COMPAT_SIGNAL_H
++
++#ifndef __ASSEMBLY__
++#include <linux/compat.h>
++
++typedef compat_uptr_t compat_sighandler_t;
++
++typedef struct compat_sigaltstack {
++	compat_uptr_t ss_sp;
++	compat_int_t ss_flags;
++	compat_size_t ss_size;
++} compat_stack_t;
++
++/* Most things should be clean enough to redefine this at will, if care
++   is taken to make libc match.  */
++
++struct compat_sigaction {
++	compat_sighandler_t sa_handler;
++	compat_uint_t sa_flags;
++	compat_sigset_t sa_mask;		/* mask last for extensibility */
++};
++
++#endif /* !__ASSEMBLY__ */
++#endif /* !_ASM_GENERIC_COMPAT_SIGNAL_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-generic/siginfo.h CVS2_6_11_PA2/include/asm-generic/siginfo.h
+--- LINUS_2_6_11/include/asm-generic/siginfo.h	2005-03-02 04:19:19.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-generic/siginfo.h	2005-01-12 13:17:46.000000000 -0700
+@@ -237,9 +237,13 @@
+ #define SIGEV_THREAD	2	/* deliver via thread creation */
+ #define SIGEV_THREAD_ID 4	/* deliver to thread */
+ 
++#ifndef __ARCH_SIGEV_PREAMBLE_SIZE
++#define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(int) * 2 + sizeof(sigval_t))
++#endif
++
+ #define SIGEV_MAX_SIZE	64
+ #ifndef SIGEV_PAD_SIZE
+-#define SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE/sizeof(int)) - 3)
++#define SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE - __ARCH_SIGEV_PREAMBLE_SIZE)/sizeof(int))
+ #endif
+ 
+ typedef struct sigevent {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-ia64/compat.h CVS2_6_11_PA2/include/asm-ia64/compat.h
+--- LINUS_2_6_11/include/asm-ia64/compat.h	2005-03-02 04:19:19.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-ia64/compat.h	2004-10-11 15:41:31.000000000 -0600
+@@ -15,6 +15,9 @@
+ typedef s32		compat_pid_t;
+ typedef u16		compat_uid_t;
+ typedef u16		compat_gid_t;
++/* Define for use in compat_siginfo_t */
++#undef __ARCH_SI_COMPAT_UID_T
++#define __ARCH_SI_COMPAT_UID_T	compat_uid32_t
+ typedef u32		compat_uid32_t;
+ typedef u32		compat_gid32_t;
+ typedef u16		compat_mode_t;
+@@ -27,6 +30,7 @@
+ typedef s32		compat_daddr_t;
+ typedef u32		compat_caddr_t;
+ typedef __kernel_fsid_t	compat_fsid_t;
++typedef s32		compat_timer_t;
+ 
+ typedef s32		compat_int_t;
+ typedef s32		compat_long_t;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/assembly.h CVS2_6_11_PA2/include/asm-parisc/assembly.h
+--- LINUS_2_6_11/include/asm-parisc/assembly.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/assembly.h	2005-02-04 12:34:33.000000000 -0700
+@@ -37,6 +37,7 @@
+ #define LDREGX  ldwx,s
+ #define LDREGM	ldwm
+ #define STREGM	stwm
++#define SHRREG  shr
+ #define RP_OFFSET	20
+ #define FRAME_SIZE	64
+ #define CALLEE_SAVE_FRAME_SIZE	128
+@@ -44,7 +45,7 @@
+ 
+ #ifdef CONFIG_PA20
+ #define BL		b,l
+-# ifdef CONFIG_PARISC64
++# ifdef CONFIG_64BIT
+ #  define LEVEL		2.0w
+ # else
+ #  define LEVEL		2.0
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/bitops.h CVS2_6_11_PA2/include/asm-parisc/bitops.h
+--- LINUS_2_6_11/include/asm-parisc/bitops.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/bitops.h	2005-02-18 07:22:09.000000000 -0700
+@@ -446,14 +446,14 @@
+  * disabling interrupts.
+  */
+ #ifdef __LP64__
+-#define ext2_set_bit(nr, addr)		test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr)
++#define ext2_set_bit(nr, addr)		__test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr)
+ #define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr)
+-#define ext2_clear_bit(nr, addr)	test_and_clear_bit((nr) ^ 0x38, (unsigned long *)addr)
++#define ext2_clear_bit(nr, addr)	__test_and_clear_bit((nr) ^ 0x38, (unsigned long *)addr)
+ #define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x38, (unsigned long *)addr)
+ #else
+-#define ext2_set_bit(nr, addr)		test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr)
++#define ext2_set_bit(nr, addr)		__test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr)
+ #define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr)
+-#define ext2_clear_bit(nr, addr)	test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr)
++#define ext2_clear_bit(nr, addr)	__test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr)
+ #define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr)
+ #endif
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/checksum.h CVS2_6_11_PA2/include/asm-parisc/checksum.h
+--- LINUS_2_6_11/include/asm-parisc/checksum.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/checksum.h	2005-01-22 07:59:50.000000000 -0700
+@@ -30,8 +30,8 @@
+  * this is a new version of the above that records errors it finds in *errp,
+  * but continues and zeros the rest of the buffer.
+  */
+-extern unsigned int csum_partial_copy_from_user(const unsigned char *src, unsigned char *dst,
+-						int len, unsigned int sum, int *errp);
++extern unsigned int csum_partial_copy_from_user(const unsigned char __user *src,
++		unsigned char *dst, int len, unsigned int sum, int *errp);
+ 
+ /*
+  *	Optimized for IP headers, which always checksum on 4 octet boundaries.
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/compat.h CVS2_6_11_PA2/include/asm-parisc/compat.h
+--- LINUS_2_6_11/include/asm-parisc/compat.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/compat.h	2004-10-04 13:12:50.000000000 -0600
+@@ -131,15 +131,15 @@
+  */
+ typedef	u32		compat_uptr_t;
+ 
+-static inline void *compat_ptr(compat_uptr_t uptr)
++static inline void __user *compat_ptr(compat_uptr_t uptr)
+ {
+-	return (void *)(unsigned long)uptr;
++	return (void __user *)(unsigned long)uptr;
+ }
+ 
+-static __inline__ void *compat_alloc_user_space(long len)
++static __inline__ void __user *compat_alloc_user_space(long len)
+ {
+ 	struct pt_regs *regs = &current->thread.regs;
+-	return (void *)regs->gr[30];
++	return (void __user *)regs->gr[30];
+ }
+ 
+ #endif /* _ASM_PARISC_COMPAT_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/dma-mapping.h CVS2_6_11_PA2/include/asm-parisc/dma-mapping.h
+--- LINUS_2_6_11/include/asm-parisc/dma-mapping.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/dma-mapping.h	2004-09-14 09:07:26.000000000 -0600
+@@ -1,8 +1,8 @@
+ #ifndef _PARISC_DMA_MAPPING_H
+ #define _PARISC_DMA_MAPPING_H
+ 
+-#include <linux/mm.h>
+ #include <linux/config.h>
++#include <linux/mm.h>
+ #include <asm/cacheflush.h>
+ #include <asm/scatterlist.h>
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/eisa_eeprom.h CVS2_6_11_PA2/include/asm-parisc/eisa_eeprom.h
+--- LINUS_2_6_11/include/asm-parisc/eisa_eeprom.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/eisa_eeprom.h	2005-02-15 08:23:58.000000000 -0700
+@@ -13,6 +13,8 @@
+ #ifndef ASM_EISA_EEPROM_H
+ #define ASM_EISA_EEPROM_H
+ 
++extern void __iomem *eisa_eeprom_addr;
++
+ #define HPEE_MAX_LENGTH       0x2000	/* maximum eeprom length */
+ 
+ #define HPEE_SLOT_INFO(slot) (20+(48*slot))
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/hardirq.h CVS2_6_11_PA2/include/asm-parisc/hardirq.h
+--- LINUS_2_6_11/include/asm-parisc/hardirq.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/hardirq.h	2005-03-01 23:47:37.000000000 -0700
+@@ -15,9 +15,7 @@
+ #ifndef _PARISC_HARDIRQ_H
+ #define _PARISC_HARDIRQ_H
+ 
+-#include <linux/config.h>
+ #include <linux/threads.h>
+-#include <linux/cache.h>
+ #include <linux/irq.h>
+ 
+ typedef struct {
+@@ -26,16 +24,6 @@
+ 
+ #include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */
+ 
+-#define HARDIRQ_BITS	16
+-
+-/*
+- * The hardirq mask has to be large enough to have space for potentially all
+- * IRQ sources in the system nesting on a single CPU:
+- */
+-#if (1 << HARDIRQ_BITS) < NR_IRQS
+-# error HARDIRQ_BITS is too low!
+-#endif
+-
+ void ack_bad_irq(unsigned int irq);
+ 
+ #endif /* _PARISC_HARDIRQ_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/hardware.h CVS2_6_11_PA2/include/asm-parisc/hardware.h
+--- LINUS_2_6_11/include/asm-parisc/hardware.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/hardware.h	2005-01-26 09:23:27.000000000 -0700
+@@ -122,6 +122,7 @@
+ extern void get_pci_node_path(struct pci_dev *dev, struct hardware_path *path);
+ extern void init_parisc_bus(void);
+ extern struct device *hwpath_to_device(struct hardware_path *modpath);
++extern void device_to_hwpath(struct device *dev, struct hardware_path *path);
+ 
+ 
+ /* inventory.c: */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/ide.h CVS2_6_11_PA2/include/asm-parisc/ide.h
+--- LINUS_2_6_11/include/asm-parisc/ide.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/ide.h	2005-03-01 23:47:37.000000000 -0700
+@@ -13,8 +13,6 @@
+ 
+ #ifdef __KERNEL__
+ 
+-#include <linux/config.h>
+-
+ #ifndef MAX_HWIFS
+ #define MAX_HWIFS	2
+ #endif
+@@ -34,7 +32,7 @@
+ #define __ide_outsw	outsw
+ #define __ide_outsl	outsl
+ 
+-static __inline__ void __ide_mm_insw(unsigned long port, void *addr, u32 count)
++static __inline__ void __ide_mm_insw(void __iomem *port, void *addr, u32 count)
+ {
+ 	while (count--) {
+ 		*(u16 *)addr = __raw_readw(port);
+@@ -42,7 +40,7 @@
+ 	}
+ }
+ 
+-static __inline__ void __ide_mm_insl(unsigned long port, void *addr, u32 count)
++static __inline__ void __ide_mm_insl(void __iomem *port, void *addr, u32 count)
+ {
+ 	while (count--) {
+ 		*(u32 *)addr = __raw_readl(port);
+@@ -50,7 +48,7 @@
+ 	}
+ }
+ 
+-static __inline__ void __ide_mm_outsw(unsigned long port, void *addr, u32 count)
++static __inline__ void __ide_mm_outsw(void __iomem *port, void *addr, u32 count)
+ {
+ 	while (count--) {
+ 		__raw_writew(*(u16 *)addr, port);
+@@ -58,7 +56,7 @@
+ 	}
+ }
+ 
+-static __inline__ void __ide_mm_outsl(unsigned long port, void *addr, u32 count)
++static __inline__ void __ide_mm_outsl(void __iomem *port, void *addr, u32 count)
+ {
+ 	while (count--) {
+ 		__raw_writel(*(u32 *)addr, port);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/io.h CVS2_6_11_PA2/include/asm-parisc/io.h
+--- LINUS_2_6_11/include/asm-parisc/io.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/io.h	2005-02-15 16:26:13.000000000 -0700
+@@ -273,10 +273,11 @@
+ }
+ #endif /* !USE_HPPA_IOREMAP */
+ 
++/* readb can never be const, so use __fswab instead of le*_to_cpu */
+ #define readb(addr) __raw_readb(addr)
+-#define readw(addr) le16_to_cpu(__raw_readw(addr))
+-#define readl(addr) le32_to_cpu(__raw_readl(addr))
+-#define readq(addr) le64_to_cpu(__raw_readq(addr))
++#define readw(addr) __fswab16(__raw_readw(addr))
++#define readl(addr) __fswab32(__raw_readl(addr))
++#define readq(addr) __fswab64(__raw_readq(addr))
+ #define writeb(b, addr) __raw_writeb(b, addr)
+ #define writew(b, addr) __raw_writew(cpu_to_le16(b), addr)
+ #define writel(b, addr) __raw_writel(cpu_to_le32(b), addr)
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/irq.h CVS2_6_11_PA2/include/asm-parisc/irq.h
+--- LINUS_2_6_11/include/asm-parisc/irq.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/irq.h	2005-01-22 07:59:50.000000000 -0700
+@@ -40,10 +40,12 @@
+ void no_ack_irq(unsigned int irq);
+ void no_end_irq(unsigned int irq);
+ 
+-extern int txn_alloc_irq(void);
++extern int txn_alloc_irq(unsigned int nbits);
+ extern int txn_claim_irq(int);
+-extern unsigned int txn_alloc_data(int, unsigned int);
+-extern unsigned long txn_alloc_addr(int);
++extern unsigned int txn_alloc_data(unsigned int);
++extern unsigned long txn_alloc_addr(unsigned int);
++
++extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);
+ 
+ extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *);
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/led.h CVS2_6_11_PA2/include/asm-parisc/led.h
+--- LINUS_2_6_11/include/asm-parisc/led.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/led.h	2004-12-30 01:07:48.000000000 -0700
+@@ -21,19 +21,23 @@
+ #define DISPLAY_MODEL_LASI 2		/* LASI style 8 bit LED */
+ #define DISPLAY_MODEL_OLD_ASP 0x7F	/* faked: ASP style 8 x 1 bit LED (only very old ASP versions) */
+ 
+-#define LED_CMD_REG_NONE NULL		/* NULL == no addr for the cmd register */
++#define LED_CMD_REG_NONE 0		/* NULL == no addr for the cmd register */
+ 
+ /* led tasklet struct */
+ extern struct tasklet_struct led_tasklet;
+ 
+ /* register_led_driver() */
+-int __init register_led_driver( int model, char *cmd_reg, char *data_reg );
++int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long data_reg);
+ 
+ /* registers the LED regions for procfs */
+ void __init register_led_regions(void);
+ 
++#ifdef CONFIG_CHASSIS_LCD_LED
+ /* writes a string to the LCD display (if possible on this h/w) */
+ int lcd_print(char *str);
++#else
++#define lcd_print(str)
++#endif
+ 
+ /* main LED initialization function (uses PDC) */ 
+ int __init led_init(void);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/module.h CVS2_6_11_PA2/include/asm-parisc/module.h
+--- LINUS_2_6_11/include/asm-parisc/module.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/module.h	2005-02-25 07:54:20.000000000 -0700
+@@ -17,12 +17,16 @@
+ #define Elf_Rela Elf32_Rela
+ #endif
+ 
++struct unwind_table;
++
+ struct mod_arch_specific
+ {
+ 	unsigned long got_offset, got_count, got_max;
+ 	unsigned long fdesc_offset, fdesc_count, fdesc_max;
+ 	unsigned long stub_offset, stub_count, stub_max;
+ 	unsigned long init_stub_offset, init_stub_count, init_stub_max;
++	int unwind_section;
++	struct unwind_table *unwind;
+ };
+ 
+ #endif /* _ASM_PARISC_MODULE_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/numnodes.h CVS2_6_11_PA2/include/asm-parisc/numnodes.h
+--- LINUS_2_6_11/include/asm-parisc/numnodes.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/numnodes.h	2005-03-01 23:47:37.000000000 -0700
+@@ -1,8 +1,6 @@
+ #ifndef _ASM_MAX_NUMNODES_H
+ #define _ASM_MAX_NUMNODES_H
+ 
+-#include <linux/config.h>
+-
+ /* Max 8 Nodes */
+ #define NODES_SHIFT	3
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/parisc-device.h CVS2_6_11_PA2/include/asm-parisc/parisc-device.h
+--- LINUS_2_6_11/include/asm-parisc/parisc-device.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/parisc-device.h	2005-02-03 05:48:16.000000000 -0700
+@@ -6,6 +6,7 @@
+ 	struct parisc_driver *driver;	/* Driver for this device */
+ 	char		name[80];	/* The hardware description */
+ 	int		irq;
++	int		aux_irq;	/* Some devices have a second IRQ */
+ 
+ 	char		hw_path;        /* The module number on this bus */
+ 	unsigned int	num_addrs;	/* some devices have additional address ranges. */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/parport_gsc.h CVS2_6_11_PA2/include/asm-parisc/parport_gsc.h
+--- LINUS_2_6_11/include/asm-parisc/parport_gsc.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/parport_gsc.h	1969-12-31 17:00:00.000000000 -0700
+@@ -1,193 +0,0 @@
+-#ifndef __LINUX_PARPORT_GSC_H
+-#define __LINUX_PARPORT_GSC_H
+-
+-#include <asm/io.h>
+-#include <linux/delay.h>
+-
+-#undef	DEBUG_PARPORT	/* undefine for production */
+-#define DELAY_TIME 	0
+-
+-#if DELAY_TIME == 0
+-#define parport_readb	gsc_readb
+-#define parport_writeb	gsc_writeb
+-#else
+-static __inline__ unsigned char parport_readb( unsigned long port )
+-{
+-    udelay(DELAY_TIME);
+-    return gsc_readb(port);
+-}
+-
+-static __inline__ void parport_writeb( unsigned char value, unsigned long port )
+-{
+-    gsc_writeb(value,port);
+-    udelay(DELAY_TIME);
+-}
+-#endif
+-
+-/* --- register definitions ------------------------------- */
+-
+-#define EPPDATA(p)  ((p)->base    + 0x4)
+-#define EPPADDR(p)  ((p)->base    + 0x3)
+-#define CONTROL(p)  ((p)->base    + 0x2)
+-#define STATUS(p)   ((p)->base    + 0x1)
+-#define DATA(p)     ((p)->base    + 0x0)
+-
+-struct parport_gsc_private {
+-	/* Contents of CTR. */
+-	unsigned char ctr;
+-
+-	/* Bitmask of writable CTR bits. */
+-	unsigned char ctr_writable;
+-
+-	/* Number of bytes per portword. */
+-	int pword;
+-
+-	/* Not used yet. */
+-	int readIntrThreshold;
+-	int writeIntrThreshold;
+-
+-	/* buffer suitable for DMA, if DMA enabled */
+-	char *dma_buf;
+-	dma_addr_t dma_handle;
+-	struct pci_dev *dev;
+-};
+-
+-extern __inline__ void parport_gsc_write_data(struct parport *p, unsigned char d)
+-{
+-#ifdef DEBUG_PARPORT
+-	printk (KERN_DEBUG "parport_gsc_write_data(%p,0x%02x)\n", p, d);
+-#endif
+-	parport_writeb(d, DATA(p));
+-}
+-
+-extern __inline__ unsigned char parport_gsc_read_data(struct parport *p)
+-{
+-	unsigned char val = parport_readb (DATA (p));
+-#ifdef DEBUG_PARPORT
+-	printk (KERN_DEBUG "parport_gsc_read_data(%p) = 0x%02x\n",
+-		p, val);
+-#endif
+-	return val;
+-}
+-
+-/* __parport_gsc_frob_control differs from parport_gsc_frob_control in that
+- * it doesn't do any extra masking. */
+-static __inline__ unsigned char __parport_gsc_frob_control (struct parport *p,
+-							   unsigned char mask,
+-							   unsigned char val)
+-{
+-	struct parport_gsc_private *priv = p->physport->private_data;
+-	unsigned char ctr = priv->ctr;
+-#ifdef DEBUG_PARPORT
+-	printk (KERN_DEBUG
+-		"__parport_gsc_frob_control(%02x,%02x): %02x -> %02x\n",
+-		mask, val, ctr, ((ctr & ~mask) ^ val) & priv->ctr_writable);
+-#endif
+-	ctr = (ctr & ~mask) ^ val;
+-	ctr &= priv->ctr_writable; /* only write writable bits. */
+-	parport_writeb (ctr, CONTROL (p));
+-	priv->ctr = ctr;	/* Update soft copy */
+-	return ctr;
+-}
+-
+-extern __inline__ void parport_gsc_data_reverse (struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x20, 0x20);
+-}
+-
+-extern __inline__ void parport_gsc_data_forward (struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x20, 0x00);
+-}
+-
+-extern __inline__ void parport_gsc_write_control (struct parport *p,
+-						 unsigned char d)
+-{
+-	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+-				  PARPORT_CONTROL_AUTOFD |
+-				  PARPORT_CONTROL_INIT |
+-				  PARPORT_CONTROL_SELECT);
+-
+-	/* Take this out when drivers have adapted to newer interface. */
+-	if (d & 0x20) {
+-		printk (KERN_DEBUG "%s (%s): use data_reverse for this!\n",
+-			p->name, p->cad->name);
+-		parport_gsc_data_reverse (p);
+-	}
+-
+-	__parport_gsc_frob_control (p, wm, d & wm);
+-}
+-
+-extern __inline__ unsigned char parport_gsc_read_control(struct parport *p)
+-{
+-	const unsigned char rm = (PARPORT_CONTROL_STROBE |
+-				  PARPORT_CONTROL_AUTOFD |
+-				  PARPORT_CONTROL_INIT |
+-				  PARPORT_CONTROL_SELECT);
+-	const struct parport_gsc_private *priv = p->physport->private_data;
+-	return priv->ctr & rm; /* Use soft copy */
+-}
+-
+-extern __inline__ unsigned char parport_gsc_frob_control (struct parport *p,
+-							 unsigned char mask,
+-							 unsigned char val)
+-{
+-	const unsigned char wm = (PARPORT_CONTROL_STROBE |
+-				  PARPORT_CONTROL_AUTOFD |
+-				  PARPORT_CONTROL_INIT |
+-				  PARPORT_CONTROL_SELECT);
+-
+-	/* Take this out when drivers have adapted to newer interface. */
+-	if (mask & 0x20) {
+-		printk (KERN_DEBUG "%s (%s): use data_%s for this!\n",
+-			p->name, p->cad->name,
+-			(val & 0x20) ? "reverse" : "forward");
+-		if (val & 0x20)
+-			parport_gsc_data_reverse (p);
+-		else
+-			parport_gsc_data_forward (p);
+-	}
+-
+-	/* Restrict mask and val to control lines. */
+-	mask &= wm;
+-	val &= wm;
+-
+-	return __parport_gsc_frob_control (p, mask, val);
+-}
+-
+-extern __inline__ unsigned char parport_gsc_read_status(struct parport *p)
+-{
+-	return parport_readb (STATUS(p));
+-}
+-
+-
+-extern __inline__ void parport_gsc_disable_irq(struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x10, 0x00);
+-}
+-
+-extern __inline__ void parport_gsc_enable_irq(struct parport *p)
+-{
+-	__parport_gsc_frob_control (p, 0x10, 0x10);
+-}
+-
+-extern void parport_gsc_release_resources(struct parport *p);
+-
+-extern int parport_gsc_claim_resources(struct parport *p);
+-
+-extern void parport_gsc_init_state(struct pardevice *, struct parport_state *s);
+-
+-extern void parport_gsc_save_state(struct parport *p, struct parport_state *s);
+-
+-extern void parport_gsc_restore_state(struct parport *p, struct parport_state *s);
+-
+-extern void parport_gsc_inc_use_count(void);
+-
+-extern void parport_gsc_dec_use_count(void);
+-
+-extern struct parport *parport_gsc_probe_port (unsigned long base,
+-					      unsigned long base_hi,
+-					      int irq, int dma,
+-					      struct pci_dev *dev);
+-
+-#endif
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/pci.h CVS2_6_11_PA2/include/asm-parisc/pci.h
+--- LINUS_2_6_11/include/asm-parisc/pci.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/pci.h	2005-02-04 12:34:33.000000000 -0700
+@@ -28,7 +28,7 @@
+ ** Data needed by pcibios layer belongs here.
+ */
+ struct pci_hba_data {
+-	unsigned long	base_addr;	/* aka Host Physical Address */
++	void __iomem   *base_addr;	/* aka Host Physical Address */
+ 	const struct parisc_device *dev; /* device from PA bus walk */
+ 	struct pci_bus *hba_bus;	/* primary PCI bus below HBA */
+ 	int		hba_num;	/* I/O port space access "key" */
+@@ -69,7 +69,7 @@
+ #define PCI_PORT_HBA(a)		((a) >> HBA_PORT_SPACE_BITS)
+ #define PCI_PORT_ADDR(a)	((a) & (HBA_PORT_SPACE_SIZE - 1))
+ 
+-#if CONFIG_PARISC64
++#if CONFIG_64BIT
+ #define PCI_F_EXTEND		0xffffffff00000000UL
+ #define PCI_IS_LMMIO(hba,a)	pci_is_lmmio(hba,a)
+ 
+@@ -90,14 +90,14 @@
+ 		: (a))					/* GMMIO */
+ #define PCI_HOST_ADDR(hba,a)	((a) + hba->lmmio_space_offset)
+ 
+-#else	/* !CONFIG_PARISC64 */
++#else	/* !CONFIG_64BIT */
+ 
+ #define PCI_BUS_ADDR(hba,a)	(a)
+ #define PCI_HOST_ADDR(hba,a)	(a)
+ #define PCI_F_EXTEND		0UL
+ #define PCI_IS_LMMIO(hba,a)	(1)	/* 32-bit doesn't support GMMIO */
+ 
+-#endif /* !CONFIG_PARISC64 */
++#endif /* !CONFIG_64BIT */
+ 
+ /*
+ ** KLUGE: linux/pci.h include asm/pci.h BEFORE declaring struct pci_bus
+@@ -106,11 +106,28 @@
+ struct pci_bus;
+ struct pci_dev;
+ 
+-/* The PCI address space does equal the physical memory
+- * address space.  The networking and block device layers use
++/*
++ * If the PCI device's view of memory is the same as the CPU's view of memory,
++ * PCI_DMA_BUS_IS_PHYS is true.  The networking and block device layers use
+  * this boolean for bounce buffer decisions.
+  */
+-#define PCI_DMA_BUS_IS_PHYS     (1)
++#ifdef CONFIG_PA20
++/* All PA-2.0 machines have an IOMMU. */
++#define PCI_DMA_BUS_IS_PHYS	0
++#define parisc_has_iommu()	do { } while (0)
++#else
++
++#if defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA)
++extern int parisc_bus_is_phys; 	/* in arch/parisc/kernel/setup.c */
++#define PCI_DMA_BUS_IS_PHYS	parisc_bus_is_phys
++#define parisc_has_iommu()	do { parisc_bus_is_phys = 0; } while (0)
++#else
++#define PCI_DMA_BUS_IS_PHYS	1
++#define parisc_has_iommu()	do { } while (0)
++#endif
++
++#endif	/* !CONFIG_PA20 */
++
+ 
+ /*
+ ** Most PCI devices (eg Tulip, NCR720) also export the same registers
+@@ -182,16 +199,25 @@
+ #endif
+ 
+ /*
+-** used by drivers/pci/pci.c:pci_do_scan_bus()
+-**   0 == check if bridge is numbered before re-numbering.
+-**   1 == pci_do_scan_bus() should automatically number all PCI-PCI bridges.
+-**
+-** REVISIT:
+-**   To date, only alpha sets this to one. We'll need to set this
+-**   to zero for legacy platforms and one for PAT platforms.
+-*/
+-#define pcibios_assign_all_busses()     (pdc_type == PDC_TYPE_PAT)
+-#define pcibios_scan_all_fns(a, b)	0
++ * pcibios_assign_all_busses() is used in drivers/pci/pci.c:pci_do_scan_bus()
++ *   0 == check if bridge is numbered before re-numbering.
++ *   1 == pci_do_scan_bus() should automatically number all PCI-PCI bridges.
++ *
++ *   We *should* set this to zero for "legacy" platforms and one
++ *   for PAT platforms.
++ *
++ *   But legacy platforms also need to *re*-enumerate the busses below
++ *   a Host Bus controller.  Adding a 4-port Tulip card under dino (bus 0)
++ *   in a C200 resulted in the secondary bus being enumerated to 1.
++ *   The second PCI host bus controller (cujo) had been enumerated by
++ *   firmware as bus 1 and sysfs complained.
++ *
++ *   The firmware is correct since the second controller is a seperate
++ *   PCI domain.  This problem could have been fixed by making dino
++ *   support use seperate PCI domains but this is alot simpler/easier.
++ */
++#define pcibios_assign_all_busses()     (1)
++#define pcibios_scan_all_fns(a, b)	(0)
+ 
+ #define PCIBIOS_MIN_IO          0x10
+ #define PCIBIOS_MIN_MEM         0x1000 /* NBPG - but pci/setup-res.c dies */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/pdc_chassis.h CVS2_6_11_PA2/include/asm-parisc/pdc_chassis.h
+--- LINUS_2_6_11/include/asm-parisc/pdc_chassis.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/pdc_chassis.h	2005-01-13 08:38:43.000000000 -0700
+@@ -1,8 +1,8 @@
+ /*
+- *		include/asm-parisc/pdc_chassis.h
++ *	include/asm-parisc/pdc_chassis.h
+  *
+- *		Copyright (C) 2002 Laurent Canet <canetl at esiee.fr>
+- *		Copyright (C) 2002 Thibaut Varene <varenet at esiee.fr>
++ *	Copyright (C) 2002 Laurent Canet <canetl at esiee.fr>
++ *	Copyright (C) 2002 Thibaut Varene <varenet at parisc-linux.org>
+  *
+  *
+  *      This program is free software; you can redistribute it and/or modify
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/pdcpat.h CVS2_6_11_PA2/include/asm-parisc/pdcpat.h
+--- LINUS_2_6_11/include/asm-parisc/pdcpat.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/pdcpat.h	2005-02-04 12:34:33.000000000 -0700
+@@ -190,16 +190,16 @@
+ #ifndef __ASSEMBLY__
+ #include <linux/types.h>
+ 
+-#ifdef CONFIG_PARISC64
++#ifdef CONFIG_64BIT
+ #define is_pdc_pat()	(PDC_TYPE_PAT == pdc_type)
+ extern int pdc_pat_get_irt_size(unsigned long *num_entries, unsigned long cell_num);
+ extern int pdc_pat_get_irt(void *r_addr, unsigned long cell_num);
+-#else	/* ! CONFIG_PARISC64 */
++#else	/* ! CONFIG_64BIT */
+ /* No PAT support for 32-bit kernels...sorry */
+ #define is_pdc_pat()	(0)
+ #define pdc_pat_get_irt_size(num_entries, cell_numn)	PDC_BAD_PROC
+ #define pdc_pat_get_irt(r_addr, cell_num)		PDC_BAD_PROC
+-#endif	/* ! CONFIG_PARISC64 */
++#endif	/* ! CONFIG_64BIT */
+ 
+ 
+ struct pdc_pat_cell_num {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/serial.h CVS2_6_11_PA2/include/asm-parisc/serial.h
+--- LINUS_2_6_11/include/asm-parisc/serial.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/serial.h	2005-03-01 23:47:37.000000000 -0700
+@@ -2,8 +2,6 @@
+  * include/asm-parisc/serial.h
+  */
+ 
+-#include <linux/config.h>
+-
+ /*
+  * This assumes you have a 7.272727 MHz clock for your UART.
+  * The documentation implies a 40Mhz clock, and elsewhere a 7Mhz clock
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/signal.h CVS2_6_11_PA2/include/asm-parisc/signal.h
+--- LINUS_2_6_11/include/asm-parisc/signal.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/signal.h	2004-10-04 13:12:50.000000000 -0600
+@@ -123,13 +123,14 @@
+  * compiler doesn't support code which changes or tests the address of
+  * the function in the little struct.  This is really ugly -PB
+  */
+-typedef __kernel_caddr_t __sighandler_t;
++typedef char __user *__sighandler_t;
+ #else
+-typedef void (*__sighandler_t)(int);
++typedef void __signalfn_t(int);
++typedef __signalfn_t __user *__sighandler_t;
+ #endif
+ 
+ typedef struct sigaltstack {
+-	void *ss_sp;
++	void __user *ss_sp;
+ 	int ss_flags;
+ 	size_t ss_size;
+ } stack_t;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/system.h CVS2_6_11_PA2/include/asm-parisc/system.h
+--- LINUS_2_6_11/include/asm-parisc/system.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/system.h	2005-02-13 20:21:52.000000000 -0700
+@@ -125,7 +125,7 @@
+ ** The __asm__ op below simple prevents gcc/ld from reordering
+ ** instructions across the mb() "call".
+ */
+-#define mb()		__asm__ __volatile__("":::"memory");	/* barrier() */
++#define mb()		__asm__ __volatile__("":::"memory")	/* barrier() */
+ #define rmb()		mb()
+ #define wmb()		mb()
+ #define smp_mb()	mb()
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/thread_info.h CVS2_6_11_PA2/include/asm-parisc/thread_info.h
+--- LINUS_2_6_11/include/asm-parisc/thread_info.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/thread_info.h	2005-02-03 10:28:08.000000000 -0700
+@@ -23,7 +23,7 @@
+ 	.flags		= 0,			\
+ 	.cpu		= 0,			\
+ 	.addr_limit	= KERNEL_DS,		\
+-	.preempt_count	= 0,			\
++	.preempt_count	= 1,			\
+   	.restart_block	= {			\
+ 		.fn = do_no_restart_syscall	\
+ 	}					\
+@@ -52,7 +52,7 @@
+ 
+ #endif /* !__ASSEMBLY */
+ 
+-#define PREEMPT_ACTIVE          0x4000000
++#define PREEMPT_ACTIVE          0x10000000
+ 
+ /*
+  * thread information flags
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/uaccess.h CVS2_6_11_PA2/include/asm-parisc/uaccess.h
+--- LINUS_2_6_11/include/asm-parisc/uaccess.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/uaccess.h	2005-02-21 09:40:53.000000000 -0700
+@@ -34,7 +34,12 @@
+ extern int __put_kernel_bad(void);
+ extern int __put_user_bad(void);
+ 
+-#define access_ok(type,addr,size)   (1)
++static inline long access_ok(int type, const void __user * addr,
++		unsigned long size)
++{
++	return 1;
++}
++
+ #define verify_area(type,addr,size) (0)
+ 
+ #define put_user __put_user
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-parisc/unwind.h CVS2_6_11_PA2/include/asm-parisc/unwind.h
+--- LINUS_2_6_11/include/asm-parisc/unwind.h	2005-03-02 04:19:20.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-parisc/unwind.h	2005-03-01 18:20:47.000000000 -0700
+@@ -1,6 +1,8 @@
+ #ifndef _UNWIND_H_
+ #define _UNWIND_H_
+ 
++#include <linux/list.h>
++
+ /* From ABI specifications */
+ struct unwind_table_entry {
+ 	unsigned int region_start;
+@@ -39,7 +41,7 @@
+ };
+ 
+ struct unwind_table {
+-	struct unwind_table *next;
++	struct list_head list;
+ 	const char *name;
+ 	unsigned long gp;
+ 	unsigned long base_addr;
+@@ -55,15 +57,18 @@
+ 	   available; but for now we only try to get the sp and ip for each
+ 	   frame */
+ 	/* struct pt_regs regs; */
+-	unsigned long sp, ip, rp;
++	unsigned long sp, ip, rp, r31;
+ 	unsigned long prev_sp, prev_ip;
+ };
+ 
+-void * unwind_table_add(const char *name, unsigned long base_addr, 
+-		 unsigned long gp,
+-                 void *start, void *end);
++struct unwind_table *
++unwind_table_add(const char *name, unsigned long base_addr, 
++		 unsigned long gp, void *start, void *end);
++void
++unwind_table_remove(struct unwind_table *table);
++
+ void unwind_frame_init(struct unwind_frame_info *info, struct task_struct *t, 
+-		       unsigned long sp, unsigned long ip, unsigned long rp);
++		       struct pt_regs *regs);
+ void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct task_struct *t);
+ void unwind_frame_init_running(struct unwind_frame_info *info, struct pt_regs *regs);
+ int unwind_once(struct unwind_frame_info *info);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-s390/compat.h CVS2_6_11_PA2/include/asm-s390/compat.h
+--- LINUS_2_6_11/include/asm-s390/compat.h	2005-03-02 04:19:21.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-s390/compat.h	2004-10-10 15:23:29.000000000 -0600
+@@ -15,6 +15,9 @@
+ typedef s32		compat_pid_t;
+ typedef u16		compat_uid_t;
+ typedef u16		compat_gid_t;
++/* Define for use in compat_siginfo_t */
++#undef __ARCH_SI_COMPAT_UID_T
++#define __ARCH_SI_COMPAT_UID_T compat_uid32_t
+ typedef u32		compat_uid32_t;
+ typedef u32		compat_gid32_t;
+ typedef u16		compat_mode_t;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/asm-sparc64/compat.h CVS2_6_11_PA2/include/asm-sparc64/compat.h
+--- LINUS_2_6_11/include/asm-sparc64/compat.h	2005-03-02 04:19:21.000000000 -0700
++++ CVS2_6_11_PA2/include/asm-sparc64/compat.h	2005-02-24 06:57:13.000000000 -0700
+@@ -12,6 +12,9 @@
+ typedef s32		compat_time_t;
+ typedef s32		compat_clock_t;
+ typedef s32		compat_pid_t;
++/* Define for use in the compat_siginfo_t */
++#undef __ARCH_SI_COMPAT_UID_T
++#define __ARCH_SI_COMPAT_UID_T compat_uint_t
+ typedef u16		compat_uid_t;
+ typedef u16		compat_gid_t;
+ typedef u16		compat_mode_t;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/compat.h CVS2_6_11_PA2/include/linux/compat.h
+--- LINUS_2_6_11/include/linux/compat.h	2005-03-02 04:19:22.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/compat.h	2005-02-24 06:57:13.000000000 -0700
+@@ -6,10 +6,16 @@
+  */
+ #include <linux/config.h>
+ 
+-#ifdef CONFIG_COMPAT
++#ifndef CONFIG_COMPAT
++
++/* Non-native task requiring compat... doesn't exist */
++#define is_compat_task(x) 0
++
++#else
+ 
+ #include <linux/stat.h>
+ #include <linux/param.h>	/* for HZ */
++#include <linux/personality.h>  /* Conditional process compat */
+ #include <linux/sem.h>
+ 
+ #include <asm/compat.h>
+@@ -18,6 +24,11 @@
+ #define compat_jiffies_to_clock_t(x)	\
+ 		(((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
+ 
++/* Non-native task requiring compat */
++#ifndef HAVE_ARCH_IS_COMPAT_TASK
++#define is_compat_task(x) (personality(x->personality) == PER_LINUX32)
++#endif
++	
+ struct rusage;
+ 
+ struct compat_itimerspec { 
+@@ -90,27 +101,6 @@
+ 	char		d_name[256];
+ };
+ 
+-typedef union compat_sigval {
+-	compat_int_t	sival_int;
+-	compat_uptr_t	sival_ptr;
+-} compat_sigval_t;
+-
+-typedef struct compat_sigevent {
+-	compat_sigval_t sigev_value;
+-	compat_int_t sigev_signo;
+-	compat_int_t sigev_notify;
+-	union {
+-		compat_int_t _pad[SIGEV_PAD_SIZE];
+-		compat_int_t _tid;
+-
+-		struct {
+-			compat_uptr_t _function;
+-			compat_uptr_t _attribute;
+-		} _sigev_thread;
+-	} _sigev_un;
+-} compat_sigevent_t;
+-
+-
+ long compat_sys_semctl(int first, int second, int third, void __user *uptr);
+ long compat_sys_msgsnd(int first, int second, int third, void __user *uptr);
+ long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/compat_siginfo.h CVS2_6_11_PA2/include/linux/compat_siginfo.h
+--- LINUS_2_6_11/include/linux/compat_siginfo.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/compat_siginfo.h	2004-09-27 04:05:39.000000000 -0600
+@@ -0,0 +1,184 @@
++#ifndef _ASM_GENERIC_COMPAT_SIGINFO_H
++#define _ASM_GENERIC_COMPAT_SIGINFO_H
++
++#include <linux/config.h>
++#include <linux/compat.h>
++
++#ifndef CONFIG_COMPAT
++
++/* No compatibility layer required, add empty definitions for the compiler */
++
++typedef struct compat_siginfo{
++} compat_siginfo_t;
++
++static inline int compat_copy_siginfo_to_user(compat_siginfo_t __user *to, 
++						struct siginfo *from)
++{
++	return -1;
++}
++
++static inline int compat_copy_siginfo_from_user(struct siginfo *to,
++                                                compat_siginfo_t __user *from)
++{
++        return -1;
++}
++
++#else
++
++#include <linux/compiler.h>
++#include <asm/siginfo.h>
++
++/* compat view of sigval_t */
++typedef union compat_sigval {
++	compat_int_t sival_int;
++	compat_uptr_t sival_ptr;
++} compat_sigval_t;
++
++/*
++ * This is the size (including padding) of the part of the
++ * struct siginfo that is before the union.
++ */
++#ifndef __ARCH_SI_COMPAT_PREAMBLE_SIZE
++#define __ARCH_SI_COMPAT_PREAMBLE_SIZE	(3 * sizeof(compat_int_t))
++#endif
++
++#define SI_COMPAT_MAX_SIZE	128
++#ifndef SI_COMPAT_PAD_SIZE
++#define SI_COMPAT_PAD_SIZE \
++  ((SI_COMPAT_MAX_SIZE - __ARCH_SI_COMPAT_PREAMBLE_SIZE) / sizeof(compat_int_t))
++#endif
++
++/* 32-bit view of si.uid_t */
++#ifndef __ARCH_SI_COMPAT_UID_T
++#define __ARCH_SI_COMPAT_UID_T compat_uid_t
++#endif
++
++/* 32-bit view of si.band_t */
++#ifndef __ARCH_SI_COMPAT_BAND_T
++#define __ARCH_SI_COMPAT_BAND_T compat_int_t
++#endif
++
++#ifndef HAVE_ARCH_COMPAT_SIGINFO_T
++
++/* Compat view of siginfo_t */
++typedef struct compat_siginfo {
++	compat_int_t si_signo;
++	compat_int_t si_errno;
++	compat_int_t si_code;
++
++	union {
++		compat_int_t _pad[SI_COMPAT_PAD_SIZE];
++
++		/* kill() */
++		struct {
++			compat_pid_t _pid;	/* sender's pid */
++			__ARCH_SI_COMPAT_UID_T _uid;	/* sender's uid */
++		} _kill;
++
++		/* POSIX.1b timers */
++		struct {
++			compat_timer_t _tid;	/* timer id */
++			compat_int_t _overrun;		/* overrun count */
++			char _pad[sizeof(__ARCH_SI_COMPAT_UID_T) - sizeof(compat_int_t)];
++			compat_sigval_t _sigval;	/* same as below */
++			compat_int_t _sys_private;       /* not to be passed to user */
++		} _timer;
++
++		/* POSIX.1b signals */
++		struct {
++			compat_pid_t _pid;		/* sender's pid */
++			__ARCH_SI_COMPAT_UID_T _uid;	/* sender's uid */
++			compat_sigval_t _sigval;
++		} _rt;
++
++		/* SIGCHLD */
++		struct {
++			compat_pid_t _pid;		/* which child */
++			__ARCH_SI_COMPAT_UID_T _uid;	/* sender's uid */
++			compat_int_t _status;		/* exit code */
++			compat_clock_t _utime;
++			compat_clock_t _stime;
++		} _sigchld;
++
++		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
++		struct {
++			compat_uptr_t _addr; /* faulting insn/memory ref. */
++#ifdef __ARCH_SI_COMPAT_TRAPNO
++			compat_int_t _trapno;	/* TRAP # which caused the signal */
++#endif
++		} _sigfault;
++
++		/* SIGPOLL */
++		struct {
++			__ARCH_SI_COMPAT_BAND_T _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
++			compat_int_t _fd;
++		} _sigpoll;
++	} _sifields;
++} compat_siginfo_t;
++#endif /* !HAVE_ARCH_COMPAT_SIGINFO_T */
++
++#ifdef __ARCH_SI_COMPAT_TRAPNO
++#define si_trapno	_sifields._sigfault._trapno
++#endif
++
++/*
++ * sigevent definitions
++ * 
++ * It seems likely that SIGEV_THREAD will have to be handled from 
++ * userspace, libpthread transmuting it to SIGEV_SIGNAL, which the
++ * thread manager then catches and does the appropriate nonsense.
++ * However, everything is written out here so as to not get lost.
++ */
++
++#ifndef __ARCH_SIGEV_COMPAT_PREAMBLE_SIZE
++#define __ARCH_SIGEV_COMPAT_PREAMBLE_SIZE (sizeof(compat_int_t) * 2 + sizeof(compat_sigval_t))
++#endif
++
++#define SIGEV_COMPAT_MAX_SIZE	64
++#ifndef SIGEV_COMPAT_PAD_SIZE
++#define SIGEV_COMPAT_PAD_SIZE	((SIGEV_COMPAT_MAX_SIZE - __ARCH_SIGEV_COMPAT_PREAMBLE_SIZE)/sizeof(compat_int_t))
++#endif
++
++#ifndef HAVE_ARCH_COMPAT_SIGEVENT_T
++
++/* 32-bit view of sigevent_t */
++typedef struct compat_sigevent {
++	compat_sigval_t sigev_value;
++	compat_int_t sigev_signo;
++	compat_int_t sigev_notify;
++	union {
++		compat_int_t _pad[SIGEV_COMPAT_PAD_SIZE];
++		compat_int_t _tid;
++
++		struct {
++			compat_uptr_t _function;
++			compat_uptr_t _attribute;	/* really pthread_attr_t */
++		} _sigev_thread;
++	} _sigev_un;
++} compat_sigevent_t;
++
++#endif /* HAVE_ARCH_COMPAT_SIGEVENT_T */
++
++#ifndef HAVE_ARCH_COMPAT_COPY_SIGINFO
++
++#include <linux/string.h>
++
++static inline void compat_copy_siginfo(struct compat_siginfo *to, struct compat_siginfo *from)
++{
++	if (from->si_code < 0)
++		memcpy(to, from, sizeof(*to));
++	else
++		/* _sigchld is currently the largest know union member */
++		memcpy(to, from, __ARCH_SI_COMPAT_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
++}
++
++#endif /* !HAVE_ARCH_COMPAT_COPY_SIGINFO */
++
++extern int compat_copy_siginfo_to_user(compat_siginfo_t __user *to, struct siginfo *from);
++extern int compat_copy_siginfo_from_user(struct siginfo *to, compat_siginfo_t __user *from);
++
++extern int compat_copy_sigevent_from_user(struct sigevent *to, compat_sigevent_t __user *from);
++
++#endif /* CONFIG_COMPAT */
++#endif /* _ASM_GENERIC_COMPAT_SIGINFO_H */
++
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/console.h CVS2_6_11_PA2/include/linux/console.h
+--- LINUS_2_6_11/include/linux/console.h	2005-03-02 04:19:22.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/console.h	2005-02-13 19:55:34.000000000 -0700
+@@ -84,6 +84,7 @@
+ #define CON_PRINTBUFFER	(1)
+ #define CON_CONSDEV	(2) /* Last on the command line */
+ #define CON_ENABLED	(4)
++#define CON_BOOT	(8)
+ 
+ struct console
+ {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/hil.h CVS2_6_11_PA2/include/linux/hil.h
+--- LINUS_2_6_11/include/linux/hil.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/hil.h	2004-10-31 14:05:59.000000000 -0700
+@@ -0,0 +1,483 @@
++#ifndef _HIL_H_
++#define _HIL_H_
++
++/*
++ * Hewlett Packard Human Interface Loop (HP-HIL) Protocol -- header.
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ *
++ * A note of thanks to HP for providing and shipping reference materials
++ * free of charge to help in the development of HIL support for Linux.
++ *
++ */
++
++#include <asm/types.h>
++
++/* Physical constants relevant to raw loop/device timing. 
++ */ 
++
++#define HIL_CLOCK		8MHZ
++#define HIL_EK1_CLOCK		30HZ
++#define HIL_EK2_CLOCK		60HZ
++
++#define HIL_TIMEOUT_DEV         5	/* ms */
++#define HIL_TIMEOUT_DEVS	10	/* ms */
++#define HIL_TIMEOUT_NORESP	10	/* ms */
++#define HIL_TIMEOUT_DEVS_DATA	16	/* ms */
++#define HIL_TIMEOUT_SELFTEST	200	/* ms */
++
++
++/* Actual wire line coding.  These will only be useful if someone is 
++ * implementing a software MLC to run HIL devices on a non-parisc machine.
++ */
++
++#define HIL_WIRE_PACKET_LEN	15
++enum hil_wire_bitpos {
++	HIL_WIRE_START		= 0,
++	HIL_WIRE_ADDR2,
++	HIL_WIRE_ADDR1,
++	HIL_WIRE_ADDR0,
++	HIL_WIRE_COMMAND,
++	HIL_WIRE_DATA7,
++	HIL_WIRE_DATA6,
++	HIL_WIRE_DATA5,
++	HIL_WIRE_DATA4,
++	HIL_WIRE_DATA3,
++	HIL_WIRE_DATA2,
++	HIL_WIRE_DATA1,
++	HIL_WIRE_DATA0,
++	HIL_WIRE_PARITY,
++	HIL_WIRE_STOP
++};
++
++/* HP documentation uses these bit positions to refer to commands;
++ * we will call these "packets".
++ */
++enum hil_pkt_bitpos {
++	HIL_PKT_CMD		= 0x00000800,
++	HIL_PKT_ADDR2		= 0x00000400,
++	HIL_PKT_ADDR1		= 0x00000200,
++	HIL_PKT_ADDR0		= 0x00000100,
++	HIL_PKT_ADDR_MASK	= 0x00000700,
++	HIL_PKT_ADDR_SHIFT	= 8,
++	HIL_PKT_DATA7		= 0x00000080,
++	HIL_PKT_DATA6		= 0x00000040,
++	HIL_PKT_DATA5		= 0x00000020,
++	HIL_PKT_DATA4		= 0x00000010,
++	HIL_PKT_DATA3		= 0x00000008,
++	HIL_PKT_DATA2		= 0x00000004,
++	HIL_PKT_DATA1		= 0x00000002,
++	HIL_PKT_DATA0		= 0x00000001,
++	HIL_PKT_DATA_MASK	= 0x000000FF,
++	HIL_PKT_DATA_SHIFT	= 0
++};
++
++/* The HIL MLC also has several error/status/control bits.  We extend the 
++ * "packet" to include these when direct access to the MLC is available,
++ * or emulate them in cases where they are not available. 
++ *
++ * This way the device driver knows that the underlying MLC driver
++ * has had to deal with loop errors.
++ */
++enum hil_error_bitpos {
++	HIL_ERR_OB	= 0x00000800, /* MLC is busy sending an auto-poll, 
++					 or we have filled up the output 
++					 buffer and must wait. */
++	HIL_ERR_INT	= 0x00010000, /* A normal interrupt has occurred. */
++	HIL_ERR_NMI	= 0x00020000, /* An NMI has occurred. */
++	HIL_ERR_LERR	= 0x00040000, /* A poll didn't come back. */
++	HIL_ERR_PERR	= 0x01000000, /* There was a Parity Error. */
++	HIL_ERR_FERR	= 0x02000000, /* There was a Framing Error. */
++	HIL_ERR_FOF	= 0x04000000  /* Input FIFO Overflowed. */
++};
++
++enum hil_control_bitpos {
++	HIL_CTRL_TEST	= 0x00010000,
++	HIL_CTRL_IPF	= 0x00040000,
++	HIL_CTRL_APE	= 0x02000000
++};
++
++/* Bits 30,31 are unused, we use them to control write behavior. */
++#define HIL_DO_ALTER_CTRL  0x40000000 /* Write MSW of packet to control 
++                                          before writing LSW to loop */
++#define HIL_CTRL_ONLY      0xc0000000 /* *Only* alter the control registers */
++
++/* This gives us a 32-bit "packet" 
++ */
++typedef u32 hil_packet;
++
++
++/* HIL Loop commands 
++ */
++enum hil_command {
++	HIL_CMD_IFC	= 0x00,	/* Interface Clear */
++	HIL_CMD_EPT	= 0x01,	/* Enter Pass-Thru Mode */
++	HIL_CMD_ELB	= 0x02,	/* Enter Loop-Back Mode */
++	HIL_CMD_IDD	= 0x03,	/* Identify and Describe */
++	HIL_CMD_DSR	= 0x04,	/* Device Soft Reset */
++	HIL_CMD_PST	= 0x05,	/* Perform Self Test */
++	HIL_CMD_RRG	= 0x06,	/* Read Register */
++	HIL_CMD_WRG	= 0x07,	/* Write Register */
++	HIL_CMD_ACF	= 0x08,	/* Auto Configure */
++	HIL_CMDID_ACF	= 0x07,	/* Auto Configure bits with incremented ID */
++	HIL_CMD_POL	= 0x10,	/* Poll */
++	HIL_CMDCT_POL	= 0x0f,	/* Poll command bits with item count  */
++	HIL_CMD_RPL	= 0x20,	/* RePoll */
++	HIL_CMDCT_RPL	= 0x0f,	/* RePoll command bits with item count */
++	HIL_CMD_RNM	= 0x30,	/* Report Name */
++	HIL_CMD_RST	= 0x31,	/* Report Status */
++	HIL_CMD_EXD	= 0x32,	/* Extended Describe */
++	HIL_CMD_RSC	= 0x33,	/* Report Security Code */
++
++	/* 0x34 to 0x3c reserved for future use  */
++
++	HIL_CMD_DKA	= 0x3d,	/* Disable Keyswitch Autorepeat */
++	HIL_CMD_EK1	= 0x3e,	/* Enable Keyswitch Autorepeat 1 */
++	HIL_CMD_EK2	= 0x3f,	/* Enable Keyswitch Autorepeat 2 */
++	HIL_CMD_PR1	= 0x40,	/* Prompt1 */  
++	HIL_CMD_PR2	= 0x41,	/* Prompt2 */
++	HIL_CMD_PR3	= 0x42,	/* Prompt3 */
++	HIL_CMD_PR4	= 0x43,	/* Prompt4 */
++	HIL_CMD_PR5	= 0x44,	/* Prompt5 */
++	HIL_CMD_PR6	= 0x45,	/* Prompt6 */
++	HIL_CMD_PR7	= 0x46,	/* Prompt7 */
++	HIL_CMD_PRM	= 0x47,	/* Prompt (General Purpose) */
++	HIL_CMD_AK1	= 0x48,	/* Acknowlege1 */  
++	HIL_CMD_AK2	= 0x49,	/* Acknowlege2 */
++	HIL_CMD_AK3	= 0x4a,	/* Acknowlege3 */
++	HIL_CMD_AK4	= 0x4b,	/* Acknowlege4 */
++	HIL_CMD_AK5	= 0x4c,	/* Acknowlege5 */
++	HIL_CMD_AK6	= 0x4d,	/* Acknowlege6 */
++	HIL_CMD_AK7	= 0x4e,	/* Acknowlege7 */
++	HIL_CMD_ACK	= 0x4f,	/* Acknowlege (General Purpose) */
++
++	/* 0x50 to 0x78 reserved for future use  */
++	/* 0x80 to 0xEF device-specific commands */
++	/* 0xf0 to 0xf9 reserved for future use  */
++
++	HIL_CMD_RIO	= 0xfa,	/* Register I/O Error */
++	HIL_CMD_SHR	= 0xfb,	/* System Hard Reset */
++	HIL_CMD_TER	= 0xfc,	/* Transmission Error */
++	HIL_CMD_CAE	= 0xfd,	/* Configuration Address Error */
++	HIL_CMD_DHR	= 0xfe,	/* Device Hard Reset */
++
++	/* 0xff is prohibited from use. */
++};
++
++
++/* 
++ * Response "records" to HIL commands
++ */
++
++/* Device ID byte 
++ */
++#define HIL_IDD_DID_TYPE_MASK		0xe0	/* Primary type bits */
++#define HIL_IDD_DID_TYPE_KB_INTEGRAL	0xa0	/* Integral keyboard */
++#define HIL_IDD_DID_TYPE_KB_ITF		0xc0	/* ITD keyboard */
++#define HIL_IDD_DID_TYPE_KB_RSVD	0xe0	/* Reserved keyboard type */
++#define HIL_IDD_DID_TYPE_KB_LANG_MASK	0x1f	/* Keyboard locale bits */
++#define HIL_IDD_DID_KBLANG_USE_ESD	0x00	/* Use ESD Locale instead */
++#define HIL_IDD_DID_TYPE_ABS		0x80    /* Absolute Positioners */
++#define HIL_IDD_DID_ABS_RSVD1_MASK	0xf8	/* Reserved */
++#define HIL_IDD_DID_ABS_RSVD1		0x98
++#define HIL_IDD_DID_ABS_TABLET_MASK	0xf8	/* Tablets and digitizers */
++#define HIL_IDD_DID_ABS_TABLET		0x90
++#define HIL_IDD_DID_ABS_TSCREEN_MASK	0xfc	/* Touch screens */
++#define HIL_IDD_DID_ABS_TSCREEN		0x8c
++#define HIL_IDD_DID_ABS_RSVD2_MASK	0xfc	/* Reserved */
++#define HIL_IDD_DID_ABS_RSVD2		0x88
++#define HIL_IDD_DID_ABS_RSVD3_MASK	0xfc	/* Reserved */
++#define HIL_IDD_DID_ABS_RSVD3		0x80
++#define HIL_IDD_DID_TYPE_REL		0x60    /* Relative Positioners */
++#define HIL_IDD_DID_REL_RSVD1_MASK	0xf0	/* Reserved */
++#define HIL_IDD_DID_REL_RSVD1		0x70
++#define HIL_IDD_DID_REL_RSVD2_MASK	0xfc	/* Reserved */
++#define HIL_IDD_DID_REL_RSVD2		0x6c
++#define HIL_IDD_DID_REL_MOUSE_MASK	0xfc	/* Mouse */
++#define HIL_IDD_DID_REL_MOUSE		0x68
++#define HIL_IDD_DID_REL_QUAD_MASK	0xf8	/* Other Quadrature Devices */
++#define HIL_IDD_DID_REL_QUAD		0x60
++#define HIL_IDD_DID_TYPE_CHAR		0x40    /* Character Entry */
++#define HIL_IDD_DID_CHAR_BARCODE_MASK	0xfc	/* Barcode Reader */
++#define HIL_IDD_DID_CHAR_BARCODE	0x5c
++#define HIL_IDD_DID_CHAR_RSVD1_MASK	0xfc	/* Reserved */
++#define HIL_IDD_DID_CHAR_RSVD1		0x58
++#define HIL_IDD_DID_CHAR_RSVD2_MASK	0xf8	/* Reserved */
++#define HIL_IDD_DID_CHAR_RSVD2		0x50
++#define HIL_IDD_DID_CHAR_RSVD3_MASK	0xf0	/* Reserved */
++#define HIL_IDD_DID_CHAR_RSVD3		0x40
++#define HIL_IDD_DID_TYPE_OTHER		0x20    /* Miscellaneous */
++#define HIL_IDD_DID_OTHER_RSVD1_MASK	0xf0	/* Reserved */
++#define HIL_IDD_DID_OTHER_RSVD1		0x30
++#define HIL_IDD_DID_OTHER_BARCODE_MASK	0xfc	/* Tone Generator */
++#define HIL_IDD_DID_OTHER_BARCODE	0x2c
++#define HIL_IDD_DID_OTHER_RSVD2_MASK	0xfc	/* Reserved */
++#define HIL_IDD_DID_OTHER_RSVD2		0x28
++#define HIL_IDD_DID_OTHER_RSVD3_MASK	0xf8	/* Reserved */
++#define HIL_IDD_DID_OTHER_RSVD3		0x20
++#define HIL_IDD_DID_TYPE_KEYPAD		0x00	/* Vectra Keyboard */
++
++/* IDD record header 
++ */
++#define HIL_IDD_HEADER_AXSET_MASK	0x03    /* Number of axis in a set */
++#define HIL_IDD_HEADER_RSC		0x04	/* Supports RSC command */
++#define HIL_IDD_HEADER_EXD		0x08	/* Supports EXD command */
++#define HIL_IDD_HEADER_IOD		0x10	/* IOD byte to follow */
++#define HIL_IDD_HEADER_16BIT		0x20	/* 16 (vs. 8) bit resolution */
++#define HIL_IDD_HEADER_ABS		0x40	/* Reports Absolute Position */
++#define HIL_IDD_HEADER_2X_AXIS		0x80	/* Two sets of 1-3 axis */
++
++/* I/O Descriptor
++ */
++#define HIL_IDD_IOD_NBUTTON_MASK	0x07	/* Number of buttons */
++#define HIL_IDD_IOD_PROXIMITY		0x08	/* Proximity in/out events */
++#define HIL_IDD_IOD_PROMPT_MASK		0x70	/* Number of prompts/acks */
++#define HIL_IDD_IOD_PROMPT_SHIFT	4
++#define HIL_IDD_IOD_PROMPT		0x80	/* Generic prompt/ack */
++
++#define HIL_IDD_NUM_AXES_PER_SET(header_packet) \
++((header_packet) & HIL_IDD_HEADER_AXSET_MASK)
++
++#define HIL_IDD_NUM_AXSETS(header_packet) \
++(2 - !((header_packet) & HIL_IDD_HEADER_2X_AXIS))
++
++#define HIL_IDD_LEN(header_packet) \
++((4 - !(header_packet & HIL_IDD_HEADER_IOD) -			\
++  2 * !(HIL_IDD_NUM_AXES_PER_SET(header_packet))) +		\
++  2 * HIL_IDD_NUM_AXES_PER_SET(header_packet) *			\
++ !!((header_packet) & HIL_IDD_HEADER_ABS))
++
++/* The following HIL_IDD_* macros assume you have an array of 
++ * packets and/or unpacked 8-bit data in the order that they 
++ * were received.
++ */
++
++#define HIL_IDD_AXIS_COUNTS_PER_M(header_ptr) \
++(!(HIL_IDD_NUM_AXSETS(*(header_ptr))) ? -1 :			\
++(((*(header_ptr + 1) & HIL_PKT_DATA_MASK) +			\
++  ((*(header_ptr + 2) & HIL_PKT_DATA_MASK)) << 8)		\
++* ((*(header_ptr) & HIL_IDD_HEADER_16BIT) ? 100 : 1)))
++
++#define HIL_IDD_AXIS_MAX(header_ptr, __axnum) \
++((!(*(header_ptr) & HIL_IDD_HEADER_ABS) ||			\
++  (HIL_IDD_NUM_AXES_PER_SET(*(header_ptr)) <= __axnum)) ? 0 :	\
++ ((HIL_PKT_DATA_MASK & *((header_ptr) + 3 + 2 * __axnum)) +	\
++  ((HIL_PKT_DATA_MASK & *((header_ptr) + 4 + 2 * __axnum)) << 8)))
++
++#define HIL_IDD_IOD(header_ptr) \
++(*(header_ptr + HIL_IDD_LEN((*header_ptr)) - 1))
++
++#define HIL_IDD_HAS_GEN_PROMPT(header_ptr) \
++((*header_ptr & HIL_IDD_HEADER_IOD) &&				\
++ (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROMPT))
++
++#define HIL_IDD_HAS_GEN_PROXIMITY(header_ptr) \
++((*header_ptr & HIL_IDD_HEADER_IOD) &&				\
++ (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROXIMITY))
++
++#define HIL_IDD_NUM_BUTTONS(header_ptr) \
++((*header_ptr & HIL_IDD_HEADER_IOD) ?				\
++ (HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NBUTTON_MASK) : 0)
++
++#define HIL_IDD_NUM_PROMPTS(header_ptr) \
++((*header_ptr & HIL_IDD_HEADER_IOD) ?				\
++ ((HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NPROMPT_MASK)		\
++  >> HIL_IDD_IOD_PROMPT_SHIFT) : 0)
++
++/* The response to HIL EXD commands -- the "extended describe record" */
++#define	HIL_EXD_HEADER_WRG		0x03	/* Supports type2 WRG */
++#define HIL_EXD_HEADER_WRG_TYPE1	0x01	/* Supports type1 WRG */
++#define	HIL_EXD_HEADER_WRG_TYPE2	0x02	/* Supports type2 WRG */
++#define	HIL_EXD_HEADER_RRG		0x04	/* Supports RRG command */
++#define	HIL_EXD_HEADER_RNM		0x10	/* Supports RNM command */
++#define HIL_EXD_HEADER_RST		0x20	/* Supports RST command */
++#define HIL_EXD_HEADER_LOCALE		0x40	/* Contains locale code */
++
++#define HIL_EXD_NUM_RRG(header_ptr) \
++((*header_ptr & HIL_EXD_HEADER_RRG) ? \
++ (*(header_ptr + 1) & HIL_PKT_DATA_MASK) : 0)
++
++#define HIL_EXD_NUM_WWG(header_ptr) \
++((*header_ptr & HIL_EXD_HEADER_WRG) ?				\
++ (*(header_ptr + 2 - !(*header_ptr & HIL_EXD_HEADER_RRG)) &	\
++    HIL_PKT_DATA_MASK) : 0)
++
++#define HIL_EXD_LEN(header_ptr) \
++(!!(*header_ptr & HIL_EXD_HEADER_RRG) +				\
++ !!(*header_ptr & HIL_EXD_HEADER_WRG) +				\
++ !!(*header_ptr & HIL_EXD_HEADER_LOCALE) +			\
++ 2 * !!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) + 1)
++
++#define HIL_EXD_LOCALE(header_ptr) \
++(!(*header_ptr & HIL_EXD_HEADER_LOCALE) ? -1 :			\
++ (*(header_ptr + HIL_EXD_LEN(header_ptr) - 1) & HIL_PKT_DATA_MASK))
++
++#define HIL_EXD_WRG_TYPE2_LEN(header_ptr) \
++(!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) ? -1	:			\
++ (*(header_ptr + HIL_EXD_LEN(header_ptr) - 2 -                  	\
++    !!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) +	\
++ ((*(header_ptr + HIL_EXD_LEN(header_ptr) - 1 -				\
++     !!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) << 8))
++
++/* Device locale codes. */ 
++
++/* Last defined locale code.  Everything above this is "Reserved",
++   and note that this same table applies to the Device ID Byte where 
++   keyboards may have a nationality code which is only 5 bits. */
++#define HIL_LOCALE_MAX 0x1f
++
++/* Map to hopefully useful strings.  I was trying to make these look
++   like locale.aliases strings do; maybe that isn't the right table to
++   emulate.  In either case, I didn't have much to work on. */
++#define HIL_LOCALE_MAP \
++"",			/* 0x00 Reserved */		\
++"",			/* 0x01 Reserved */		\
++"",			/* 0x02 Reserved */		\
++"swiss.french",		/* 0x03 Swiss/French */		\
++"portuguese",		/* 0x04 Portuguese */		\
++"arabic",		/* 0x05 Arabic */		\
++"hebrew",		/* 0x06 Hebrew */		\
++"english.canadian",	/* 0x07 Canadian English */	\
++"turkish",		/* 0x08 Turkish */		\
++"greek",		/* 0x09 Greek */		\
++"thai",			/* 0x0a Thai (Thailand) */	\
++"italian",		/* 0x0b Italian */		\
++"korean",		/* 0x0c Hangul (Korea) */	\
++"dutch",		/* 0x0d Dutch */		\
++"swedish",		/* 0x0e Swedish */		\
++"german",		/* 0x0f German */		\
++"chinese",		/* 0x10 Chinese-PRC */		\
++"chinese",		/* 0x11 Chinese-ROC */		\
++"swiss.french",		/* 0x12 Swiss/French II */	\
++"spanish",		/* 0x13 Spanish */		\
++"swiss.german",		/* 0x14 Swiss/German II */	\
++"flemish",		/* 0x15 Belgian (Flemish) */	\
++"finnish",		/* 0x16 Finnish	*/		\
++"english.uk",		/* 0x17 United Kingdom */	\
++"french.canadian",	/* 0x18 French/Canadian */	\
++"swiss.german",		/* 0x19 Swiss/German */		\
++"norwegian",		/* 0x1a Norwegian */		\
++"french",		/* 0x1b French */		\
++"danish",		/* 0x1c Danish */		\
++"japanese",		/* 0x1d Katakana */		\
++"spanish",		/* 0x1e Latin American/Spanish*/\
++"english.us"		/* 0x1f United States */	\
++
++
++/* HIL keycodes */
++#define HIL_KEYCODES_SET1_TBLSIZE 128
++#define HIL_KEYCODES_SET1 	\
++   KEY_5,		KEY_RESERVED,	KEY_RIGHTALT,	KEY_LEFTALT,	\
++   KEY_RIGHTSHIFT,	KEY_LEFTSHIFT,	KEY_LEFTCTRL,	KEY_SYSRQ,	\
++   KEY_KP4,		KEY_KP8,	KEY_KP5,	KEY_KP9,	\
++   KEY_KP6,		KEY_KP7,	KEY_KPCOMMA,	KEY_KPENTER,	\
++   KEY_KP1,		KEY_KPSLASH,	KEY_KP2,	KEY_KPPLUS,	\
++   KEY_KP3,		KEY_KPASTERISK,	KEY_KP0,	KEY_KPMINUS,	\
++   KEY_B,		KEY_V,		KEY_C,		KEY_X,		\
++   KEY_Z,		KEY_RESERVED,	KEY_RESERVED,   KEY_ESC,	\
++   KEY_6,		KEY_F10,	KEY_3,		KEY_F11,	\
++   KEY_KPDOT,		KEY_F9,		KEY_TAB /*KP*/,	KEY_F12,	\
++   KEY_H,		KEY_G,		KEY_F,		KEY_D,		\
++   KEY_S,		KEY_A,		KEY_RESERVED,	KEY_CAPSLOCK,	\
++   KEY_U,		KEY_Y,		KEY_T,		KEY_R,		\
++   KEY_E,		KEY_W,		KEY_Q,		KEY_TAB,	\
++   KEY_7,		KEY_6,		KEY_5,		KEY_4,		\
++   KEY_3,		KEY_2,		KEY_1,		KEY_GRAVE,	\
++   KEY_F13,		KEY_F14,	KEY_F15,	KEY_F16,	\
++   KEY_F17,		KEY_F18,	KEY_F19,	KEY_F20,	\
++   KEY_MENU,		KEY_F4,		KEY_F3,		KEY_F2,		\
++   KEY_F1,		KEY_VOLUMEUP,	KEY_STOP,	KEY_SENDFILE,	\
++   KEY_SYSRQ,		KEY_F5,		KEY_F6,		KEY_F7,		\
++   KEY_F8,		KEY_VOLUMEDOWN,	KEY_DEL_EOL,	KEY_DEL_EOS,	\
++   KEY_8,		KEY_9,		KEY_0,		KEY_MINUS,	\
++   KEY_EQUAL,		KEY_BACKSPACE,	KEY_INS_LINE,	KEY_DEL_LINE,	\
++   KEY_I,		KEY_O,		KEY_P,		KEY_LEFTBRACE,	\
++   KEY_RIGHTBRACE,	KEY_BACKSLASH,	KEY_INSERT,	KEY_DELETE,	\
++   KEY_J,		KEY_K,		KEY_L,		KEY_SEMICOLON,	\
++   KEY_APOSTROPHE,	KEY_ENTER,	KEY_HOME,	KEY_PAGEUP,	\
++   KEY_M,		KEY_COMMA,	KEY_DOT,	KEY_SLASH,	\
++   KEY_BACKSLASH,	KEY_SELECT,	KEY_102ND,	KEY_PAGEDOWN,	\
++   KEY_N,		KEY_SPACE,	KEY_NEXT,	KEY_RESERVED,	\
++   KEY_LEFT,		KEY_DOWN,	KEY_UP,		KEY_RIGHT
++
++
++#define HIL_KEYCODES_SET3_TBLSIZE 128
++#define HIL_KEYCODES_SET3 	\
++  KEY_RESERVED,	KEY_ESC,	KEY_1,		KEY_2,			\
++  KEY_3,	KEY_4,		KEY_5,		KEY_6,			\
++  KEY_7,	KEY_8,		KEY_9,		KEY_0,			\
++  KEY_MINUS,	KEY_EQUAL,	KEY_BACKSPACE,	KEY_TAB,		\
++  KEY_Q,	KEY_W,		KEY_E,		KEY_R,			\
++  KEY_T,	KEY_Y,		KEY_U,		KEY_I,			\
++  KEY_O,	KEY_P,		KEY_LEFTBRACE,	KEY_RIGHTBRACE,		\
++  KEY_ENTER,	KEY_LEFTCTRL,	KEY_A,		KEY_S,			\
++  KEY_D,	KEY_F,		KEY_G,		KEY_H,			\
++  KEY_J,	KEY_K,		KEY_L,		KEY_SEMICOLON,		\
++  KEY_APOSTROPHE,KEY_GRAVE,	KEY_LEFTSHIFT,	KEY_BACKSLASH,		\
++  KEY_Z,	KEY_X,		KEY_C,		KEY_V,			\
++  KEY_B,	KEY_N,		KEY_M,		KEY_COMMA,		\
++  KEY_DOT,	KEY_SLASH,	KEY_RIGHTSHIFT,	KEY_KPASTERISK,		\
++  KEY_LEFTALT,	KEY_SPACE,	KEY_CAPSLOCK,	KEY_F1,			\
++  KEY_F2,	KEY_F3,		KEY_F4,		KEY_F5,			\
++  KEY_F6,	KEY_F7,		KEY_F8,		KEY_F9,			\
++  KEY_F10,	KEY_NUMLOCK,	KEY_SCROLLLOCK,	KEY_KP7,		\
++  KEY_KP8,	KEY_KP9,	KEY_KPMINUS,	KEY_KP4,		\
++  KEY_KP5,	KEY_KP6,	KEY_KPPLUS,	KEY_KP1,		\
++  KEY_KP2,	KEY_KP3,	KEY_KP0,	KEY_KPDOT,		\
++  KEY_SYSRQ,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
++  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
++  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
++  KEY_UP,	KEY_LEFT,	KEY_DOWN,	KEY_RIGHT,		\
++  KEY_HOME,	KEY_PAGEUP,	KEY_END,	KEY_PAGEDOWN,		\
++  KEY_INSERT,	KEY_DELETE,	KEY_102ND,	KEY_RESERVED,		\
++  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
++  KEY_F1,	KEY_F2,		KEY_F3,		KEY_F4,			\
++  KEY_F5,	KEY_F6,		KEY_F7,		KEY_F8,			\
++  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,		\
++  KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED,	KEY_RESERVED
++
++
++/* Response to POL command, the "poll record header" */
++
++#define HIL_POL_NUM_AXES_MASK	0x03	/* Number of axis reported */
++#define HIL_POL_CTS		0x04	/* Device ready to receive data */
++#define HIL_POL_STATUS_PENDING	0x08	/* Device has status to report */
++#define HIL_POL_CHARTYPE_MASK	0x70	/* Type of character data to follow */
++#define HIL_POL_CHARTYPE_NONE	0x00	/* No character data to follow */
++#define HIL_POL_CHARTYPE_RSVD1	0x10	/* Reserved Set 1 */
++#define HIL_POL_CHARTYPE_ASCII	0x20	/* U.S. ASCII */
++#define HIL_POL_CHARTYPE_BINARY	0x30	/* Binary data */
++#define HIL_POL_CHARTYPE_SET1	0x40	/* Keycode Set 1 */
++#define HIL_POL_CHARTYPE_RSVD2	0x50	/* Reserved Set 2 */
++#define HIL_POL_CHARTYPE_SET2	0x60	/* Keycode Set 2 */
++#define HIL_POL_CHARTYPE_SET3	0x70	/* Keycode Set 3 */
++#define HIL_POL_AXIS_ALT	0x80	/* Data is from axis set 2 */
++
++
++#endif /* _HIL_H_ */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/hil_mlc.h CVS2_6_11_PA2/include/linux/hil_mlc.h
+--- LINUS_2_6_11/include/linux/hil_mlc.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/hil_mlc.h	2004-10-30 13:51:51.000000000 -0600
+@@ -0,0 +1,168 @@
++/*
++ * HP Human Interface Loop Master Link Controller driver.
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ *
++ */
++
++#include <linux/hil.h>
++#include <linux/time.h>
++#include <linux/interrupt.h>
++#include <asm/semaphore.h>
++#include <linux/serio.h>
++#include <linux/list.h>
++
++typedef struct hil_mlc hil_mlc;
++
++/* The HIL has a complicated state engine.
++ * We define the structure of nodes in the state engine here.
++ */
++enum hilse_act {
++  	/* HILSE_OUT prepares to receive input if the next node
++	 * is an IN or EXPECT, and then sends the given packet.
++	 */
++	HILSE_OUT = 0,
++
++  	/* HILSE_CTS checks if the loop is busy. */
++	HILSE_CTS,
++
++	/* HILSE_OUT_LAST sends the given command packet to 
++	 * the last configured/running device on the loop.
++	 */
++	HILSE_OUT_LAST,
++
++	/* HILSE_OUT_DISC sends the given command packet to
++	 * the next device past the last configured/running one.
++	 */
++	HILSE_OUT_DISC,
++
++	/* HILSE_FUNC runs a callback function with given arguments.
++	 * a positive return value causes the "ugly" branch to be taken.
++	 */
++	HILSE_FUNC,
++
++  	/* HILSE_IN simply expects any non-errored packet to arrive 
++	 * within arg usecs.
++	 */
++	HILSE_IN		= 0x100,
++
++  	/* HILSE_EXPECT expects a particular packet to arrive 
++	 * within arg usecs, any other packet is considered an error.
++	 */
++	HILSE_EXPECT,
++
++  	/* HILSE_EXPECT_LAST as above but dev field should be last 
++	 * discovered/operational device.
++	 */
++	HILSE_EXPECT_LAST,
++
++  	/* HILSE_EXPECT_LAST as above but dev field should be first 
++	 * undiscovered/inoperational device.
++	 */
++	HILSE_EXPECT_DISC
++};
++
++typedef int	(hilse_func) (hil_mlc *mlc, int arg);
++struct hilse_node {
++	enum hilse_act		act;	/* How to process this node         */
++	union {
++		hilse_func	*func;	/* Function to call if HILSE_FUNC   */
++		hil_packet	packet;	/* Packet to send or to compare     */
++	} object;
++	int			arg;	/* Timeout in usec or parm for func */
++	int			good;	/* Node to jump to on success       */
++	int			bad;	/* Node to jump to on error         */
++	int			ugly;	/* Node to jump to on timeout       */
++};
++
++/* Methods for back-end drivers, e.g. hp_sdc_mlc */
++typedef int	(hil_mlc_cts) (hil_mlc *mlc);
++typedef void	(hil_mlc_out) (hil_mlc *mlc);
++typedef int	(hil_mlc_in)  (hil_mlc *mlc, suseconds_t timeout);
++
++struct hil_mlc_devinfo {
++	uint8_t	idd[16];	/* Device ID Byte and Describe Record */
++	uint8_t	rsc[16];	/* Security Code Header and Record */
++	uint8_t	exd[16];	/* Extended Describe Record */
++	uint8_t	rnm[16];	/* Device name as returned by RNM command */
++};
++
++struct hil_mlc_serio_map {
++	hil_mlc *mlc;
++	int di_revmap;
++	int didx;
++};
++
++/* How many (possibly old/detached) devices the we try to keep track of */
++#define HIL_MLC_DEVMEM 16
++
++struct hil_mlc {
++	struct list_head	list;	/* hil_mlc is organized as linked list */
++
++	rwlock_t		lock;
++
++	void *priv; /* Data specific to a particular type of MLC */
++
++	int 			seidx;	/* Current node in state engine */
++	int			istarted, ostarted;
++
++	hil_mlc_cts		*cts;
++	struct semaphore	csem;   /* Raised when loop idle */
++
++	hil_mlc_out		*out;
++	struct semaphore	osem;   /* Raised when outpacket dispatched */
++	hil_packet		opacket;
++
++	hil_mlc_in		*in;
++	struct semaphore	isem;   /* Raised when a packet arrives */
++	hil_packet		ipacket[16];
++	hil_packet		imatch;
++	int			icount;
++	struct timeval		instart;
++	suseconds_t		intimeout;
++
++	int			ddi;	/* Last operational device id */
++	int			lcv;	/* LCV to throttle loops */
++	struct timeval		lcv_tv; /* Time loop was started */
++
++	int			di_map[7]; /* Maps below items to live devs */
++	struct hil_mlc_devinfo	di[HIL_MLC_DEVMEM];
++	struct serio		*serio[HIL_MLC_DEVMEM];
++	struct hil_mlc_serio_map serio_map[HIL_MLC_DEVMEM];
++	hil_packet		serio_opacket[HIL_MLC_DEVMEM];
++	int			serio_oidx[HIL_MLC_DEVMEM];
++	struct hil_mlc_devinfo	di_scratch; /* Temporary area */
++
++	int			opercnt;
++
++	struct tasklet_struct	*tasklet;
++};
++
++int hil_mlc_register(hil_mlc *mlc);
++int hil_mlc_unregister(hil_mlc *mlc);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/hp_sdc.h CVS2_6_11_PA2/include/linux/hp_sdc.h
+--- LINUS_2_6_11/include/linux/hp_sdc.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/hp_sdc.h	2004-07-11 16:03:48.000000000 -0600
+@@ -0,0 +1,300 @@
++/*
++ * HP i8042 System Device Controller -- header
++ *
++ * Copyright (c) 2001 Brian S. Julin
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ *    notice, this list of conditions, and the following disclaimer,
++ *    without modification.
++ * 2. The name of the author may not be used to endorse or promote products
++ *    derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL").
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
++ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ *
++ * References:
++ * 
++ * HP-HIL Technical Reference Manual.  Hewlett Packard Product No. 45918A
++ *
++ * System Device Controller Microprocessor Firmware Theory of Operation
++ * 	for Part Number 1820-4784 Revision B.  Dwg No. A-1820-4784-2
++ *
++ */
++
++#ifndef _LINUX_HP_SDC_H
++#define _LINUX_HP_SDC_H
++
++#include <linux/interrupt.h>
++#include <linux/types.h>
++#include <linux/time.h>
++#include <linux/timer.h>
++#if defined(__hppa__)
++#include <asm/hardware.h>
++#endif
++
++
++/* No 4X status reads take longer than this (in usec).
++ */
++#define HP_SDC_MAX_REG_DELAY 20000
++
++typedef void (hp_sdc_irqhook) (int irq, void *dev_id, 
++			       uint8_t status, uint8_t data);
++
++int hp_sdc_request_timer_irq(hp_sdc_irqhook *callback);
++int hp_sdc_request_hil_irq(hp_sdc_irqhook *callback);
++int hp_sdc_request_cooked_irq(hp_sdc_irqhook *callback);
++int hp_sdc_release_timer_irq(hp_sdc_irqhook *callback);
++int hp_sdc_release_hil_irq(hp_sdc_irqhook *callback);
++int hp_sdc_release_cooked_irq(hp_sdc_irqhook *callback);
++
++typedef struct {
++	int actidx;	/* Start of act.  Acts are atomic WRT I/O to SDC */
++	int idx;	/* Index within the act */
++	int endidx;	/* transaction is over and done if idx == endidx */
++	uint8_t *seq;	/* commands/data for the transaction */
++	union {
++	  hp_sdc_irqhook   *irqhook;	/* Callback, isr or tasklet context */
++	  struct semaphore *semaphore;	/* Semaphore to sleep on. */
++	} act;
++} hp_sdc_transaction;
++int hp_sdc_enqueue_transaction(hp_sdc_transaction *this);
++int hp_sdc_dequeue_transaction(hp_sdc_transaction *this);
++
++/* The HP_SDC_ACT* values are peculiar to this driver.
++ * Nuance: never HP_SDC_ACT_DATAIN | HP_SDC_ACT_DEALLOC, use another
++ * act to perform the dealloc.
++ */
++#define HP_SDC_ACT_PRECMD	0x01		/* Send a command first */
++#define HP_SDC_ACT_DATAREG	0x02		/* Set data registers */
++#define HP_SDC_ACT_DATAOUT	0x04		/* Send data bytes */
++#define HP_SDC_ACT_POSTCMD      0x08            /* Send command after */
++#define HP_SDC_ACT_DATAIN	0x10		/* Collect data after */
++#define HP_SDC_ACT_DURING	0x1f
++#define HP_SDC_ACT_SEMAPHORE    0x20            /* Raise semaphore after */
++#define HP_SDC_ACT_CALLBACK	0x40		/* Pass data to IRQ handler */
++#define HP_SDC_ACT_DEALLOC	0x80		/* Destroy transaction after */
++#define HP_SDC_ACT_AFTER	0xe0
++#define HP_SDC_ACT_DEAD		0x60		/* Act timed out. */
++
++/* Rest of the flags are straightforward representation of the SDC interface */
++#define HP_SDC_STATUS_IBF	0x02	/* Input buffer full */
++
++#define HP_SDC_STATUS_IRQMASK	0xf0	/* Bits containing "level 1" irq */
++#define HP_SDC_STATUS_PERIODIC  0x10    /* Periodic 10ms timer */
++#define HP_SDC_STATUS_USERTIMER 0x20    /* "Special purpose" timer */
++#define HP_SDC_STATUS_TIMER     0x30    /* Both PERIODIC and USERTIMER */
++#define HP_SDC_STATUS_REG	0x40	/* Data from an i8042 register */
++#define HP_SDC_STATUS_HILCMD    0x50	/* Command from HIL MLC */
++#define HP_SDC_STATUS_HILDATA   0x60	/* Data from HIL MLC */
++#define HP_SDC_STATUS_PUP	0x70	/* Sucessful power-up self test */
++#define HP_SDC_STATUS_KCOOKED	0x80	/* Key from cooked kbd */
++#define HP_SDC_STATUS_KRPG	0xc0	/* Key from Repeat Gen */
++#define HP_SDC_STATUS_KMOD_SUP	0x10	/* Shift key is up */
++#define HP_SDC_STATUS_KMOD_CUP	0x20	/* Control key is up */
++
++#define HP_SDC_NMISTATUS_FHS	0x40	/* NMI is a fast handshake irq */
++
++/* Internal i8042 registers (there are more, but they are not too useful). */
++
++#define HP_SDC_USE		0x02	/* Resource usage (including OB bit) */
++#define HP_SDC_IM		0x04	/* Interrupt mask */
++#define HP_SDC_CFG		0x11	/* Configuration register */
++#define HP_SDC_KBLANGUAGE	0x12	/* Keyboard language */
++
++#define HP_SDC_D0		0x70	/* General purpose data buffer 0 */
++#define HP_SDC_D1		0x71	/* General purpose data buffer 1 */
++#define HP_SDC_D2		0x72	/* General purpose data buffer 2 */
++#define HP_SDC_D3		0x73	/* General purpose data buffer 3 */
++#define HP_SDC_VT1		0x74	/* Timer for voice 1 */
++#define HP_SDC_VT2		0x75	/* Timer for voice 2 */
++#define HP_SDC_VT3		0x76	/* Timer for voice 3 */
++#define HP_SDC_VT4		0x77	/* Timer for voice 4 */
++#define HP_SDC_KBN		0x78	/* Which HIL devs are Nimitz */
++#define HP_SDC_KBC		0x79	/* Which HIL devs are cooked kbds */
++#define HP_SDC_LPS		0x7a	/* i8042's view of HIL status */
++#define HP_SDC_LPC		0x7b	/* i8042's view of HIL "control" */
++#define HP_SDC_RSV  		0x7c	/* Reserved "for testing" */
++#define HP_SDC_LPR		0x7d    /* i8042 count of HIL reconfigs */
++#define HP_SDC_XTD		0x7e    /* "Extended Configuration" register */
++#define HP_SDC_STR		0x7f    /* i8042 self-test result */
++
++/* Bitfields for above registers */
++#define HP_SDC_USE_LOOP		0x04	/* Command is currently on the loop. */
++
++#define HP_SDC_IM_MASK          0x1f    /* these bits not part of cmd/status */
++#define HP_SDC_IM_FH		0x10	/* Mask the fast handshake irq */
++#define HP_SDC_IM_PT		0x08	/* Mask the periodic timer irq */
++#define HP_SDC_IM_TIMERS	0x04	/* Mask the MT/DT/CT irq */
++#define HP_SDC_IM_RESET		0x02	/* Mask the reset key irq */
++#define HP_SDC_IM_HIL		0x01	/* Mask the HIL MLC irq */
++
++#define HP_SDC_CFG_ROLLOVER	0x08	/* WTF is "N-key rollover"? */
++#define HP_SDC_CFG_KBD		0x10	/* There is a keyboard */
++#define HP_SDC_CFG_NEW		0x20	/* Supports/uses HIL MLC */
++#define HP_SDC_CFG_KBD_OLD	0x03	/* keyboard code for non-HIL */
++#define HP_SDC_CFG_KBD_NEW	0x07	/* keyboard code from HIL autoconfig */
++#define HP_SDC_CFG_REV		0x40	/* Code revision bit */
++#define HP_SDC_CFG_IDPROM	0x80	/* IDPROM present in kbd (not HIL) */
++
++#define HP_SDC_LPS_NDEV		0x07	/* # devices autoconfigured on HIL */
++#define HP_SDC_LPS_ACSUCC	0x08	/* loop autoconfigured successfully */
++#define HP_SDC_LPS_ACFAIL	0x80	/* last loop autoconfigure failed */
++
++#define HP_SDC_LPC_APE_IPF	0x01	/* HIL MLC APE/IPF (autopoll) set */
++#define HP_SDC_LPC_ARCONERR	0x02	/* i8042 autoreconfigs loop on err */
++#define HP_SDC_LPC_ARCQUIET	0x03	/* i8042 doesn't report autoreconfigs*/
++#define HP_SDC_LPC_COOK		0x10	/* i8042 cooks devices in _KBN */
++#define HP_SDC_LPC_RC		0x80	/* causes autoreconfig */
++
++#define HP_SDC_XTD_REV		0x07	/* contains revision code */
++#define HP_SDC_XTD_REV_STRINGS(val, str) \
++switch (val) {						\
++	case 0x1: str = "1820-3712"; break;		\
++	case 0x2: str = "1820-4379"; break;		\
++	case 0x3: str = "1820-4784"; break;		\
++	default: str = "unknown";			\
++};
++#define HP_SDC_XTD_BEEPER	0x08	/* TI SN76494 beeper available */
++#define HP_SDC_XTD_BBRTC	0x20	/* OKI MSM-58321 BBRTC present */
++
++#define HP_SDC_CMD_LOAD_RT	0x31	/* Load real time (from 8042) */
++#define HP_SDC_CMD_LOAD_FHS	0x36	/* Load the fast handshake timer */
++#define HP_SDC_CMD_LOAD_MT	0x38	/* Load the match timer */
++#define HP_SDC_CMD_LOAD_DT	0x3B	/* Load the delay timer */
++#define HP_SDC_CMD_LOAD_CT	0x3E	/* Load the cycle timer */
++
++#define HP_SDC_CMD_SET_IM	0x40    /* 010xxxxx == set irq mask */
++
++/* The documents provided do not explicitly state that all registers betweem 
++ * 0x01 and 0x1f inclusive can be read by sending their register index as a 
++ * command, but this is implied and appears to be the case.
++ */
++#define HP_SDC_CMD_READ_RAM	0x00	/* Load from i8042 RAM (autoinc) */
++#define HP_SDC_CMD_READ_USE	0x02	/* Undocumented! Load from usage reg */
++#define HP_SDC_CMD_READ_IM	0x04	/* Load current interrupt mask */
++#define HP_SDC_CMD_READ_KCC	0x11	/* Load primary kbd config code */
++#define HP_SDC_CMD_READ_KLC	0x12	/* Load primary kbd language code */
++#define HP_SDC_CMD_READ_T1	0x13	/* Load timer output buffer byte 1 */
++#define HP_SDC_CMD_READ_T2	0x14	/* Load timer output buffer byte 1 */
++#define HP_SDC_CMD_READ_T3	0x15	/* Load timer output buffer byte 1 */
++#define HP_SDC_CMD_READ_T4	0x16	/* Load timer output buffer byte 1 */
++#define HP_SDC_CMD_READ_T5	0x17	/* Load timer output buffer byte 1 */
++#define HP_SDC_CMD_READ_D0	0xf0	/* Load from i8042 RAM location 0x70 */
++#define HP_SDC_CMD_READ_D1	0xf1	/* Load from i8042 RAM location 0x71 */
++#define HP_SDC_CMD_READ_D2	0xf2	/* Load from i8042 RAM location 0x72 */
++#define HP_SDC_CMD_READ_D3	0xf3	/* Load from i8042 RAM location 0x73 */
++#define HP_SDC_CMD_READ_VT1	0xf4	/* Load from i8042 RAM location 0x74 */
++#define HP_SDC_CMD_READ_VT2	0xf5	/* Load from i8042 RAM location 0x75 */
++#define HP_SDC_CMD_READ_VT3	0xf6	/* Load from i8042 RAM location 0x76 */
++#define HP_SDC_CMD_READ_VT4	0xf7	/* Load from i8042 RAM location 0x77 */
++#define HP_SDC_CMD_READ_KBN	0xf8	/* Load from i8042 RAM location 0x78 */
++#define HP_SDC_CMD_READ_KBC	0xf9	/* Load from i8042 RAM location 0x79 */
++#define HP_SDC_CMD_READ_LPS	0xfa	/* Load from i8042 RAM location 0x7a */
++#define HP_SDC_CMD_READ_LPC	0xfb	/* Load from i8042 RAM location 0x7b */
++#define HP_SDC_CMD_READ_RSV	0xfc	/* Load from i8042 RAM location 0x7c */
++#define HP_SDC_CMD_READ_LPR	0xfd	/* Load from i8042 RAM location 0x7d */
++#define HP_SDC_CMD_READ_XTD	0xfe	/* Load from i8042 RAM location 0x7e */
++#define HP_SDC_CMD_READ_STR	0xff	/* Load from i8042 RAM location 0x7f */
++
++#define HP_SDC_CMD_SET_ARD	0xA0	/* Set emulated autorepeat delay */
++#define HP_SDC_CMD_SET_ARR	0xA2	/* Set emulated autorepeat rate */
++#define HP_SDC_CMD_SET_BELL	0xA3	/* Set voice 3 params for "beep" cmd */
++#define HP_SDC_CMD_SET_RPGR	0xA6	/* Set "RPG" irq rate (doesn't work) */
++#define HP_SDC_CMD_SET_RTMS	0xAD	/* Set the RTC time (milliseconds) */
++#define HP_SDC_CMD_SET_RTD	0xAF	/* Set the RTC time (days) */
++#define HP_SDC_CMD_SET_FHS	0xB2	/* Set fast handshake timer */
++#define HP_SDC_CMD_SET_MT	0xB4	/* Set match timer */
++#define HP_SDC_CMD_SET_DT	0xB7	/* Set delay timer */
++#define HP_SDC_CMD_SET_CT	0xBA	/* Set cycle timer */
++#define HP_SDC_CMD_SET_RAMP	0xC1	/* Reset READ_RAM autoinc counter */
++#define HP_SDC_CMD_SET_D0	0xe0	/* Load to i8042 RAM location 0x70 */
++#define HP_SDC_CMD_SET_D1	0xe1	/* Load to i8042 RAM location 0x71 */
++#define HP_SDC_CMD_SET_D2	0xe2	/* Load to i8042 RAM location 0x72 */
++#define HP_SDC_CMD_SET_D3	0xe3	/* Load to i8042 RAM location 0x73 */
++#define HP_SDC_CMD_SET_VT1	0xe4	/* Load to i8042 RAM location 0x74 */
++#define HP_SDC_CMD_SET_VT2	0xe5	/* Load to i8042 RAM location 0x75 */
++#define HP_SDC_CMD_SET_VT3	0xe6	/* Load to i8042 RAM location 0x76 */
++#define HP_SDC_CMD_SET_VT4	0xe7	/* Load to i8042 RAM location 0x77 */
++#define HP_SDC_CMD_SET_KBN	0xe8	/* Load to i8042 RAM location 0x78 */
++#define HP_SDC_CMD_SET_KBC	0xe9	/* Load to i8042 RAM location 0x79 */
++#define HP_SDC_CMD_SET_LPS	0xea	/* Load to i8042 RAM location 0x7a */
++#define HP_SDC_CMD_SET_LPC	0xeb	/* Load to i8042 RAM location 0x7b */
++#define HP_SDC_CMD_SET_RSV	0xec	/* Load to i8042 RAM location 0x7c */
++#define HP_SDC_CMD_SET_LPR	0xed	/* Load to i8042 RAM location 0x7d */
++#define HP_SDC_CMD_SET_XTD	0xee	/* Load to i8042 RAM location 0x7e */
++#define HP_SDC_CMD_SET_STR	0xef	/* Load to i8042 RAM location 0x7f */
++
++#define HP_SDC_CMD_DO_RTCW	0xc2	/* i8042 RAM 0x70 --> RTC */
++#define HP_SDC_CMD_DO_RTCR	0xc3	/* RTC[0x70 0:3] --> irq/status/data */
++#define HP_SDC_CMD_DO_BEEP	0xc4	/* i8042 RAM 0x70-74  --> beeper,VT3 */
++#define HP_SDC_CMD_DO_HIL	0xc5	/* i8042 RAM 0x70-73 --> 
++					   HIL MLC R0,R1 i8042 HIL watchdog */
++
++/* Values used to (de)mangle input/output to/from the HIL MLC */
++#define HP_SDC_DATA		0x40	/* Data from an 8042 register */
++#define HP_SDC_HIL_CMD		0x50	/* Data from HIL MLC R1/8042 */
++#define HP_SDC_HIL_R1MASK	0x0f	/* Contents of HIL MLC R1 0:3 */
++#define HP_SDC_HIL_AUTO		0x10	/* Set if POL results from i8042 */   
++#define HP_SDC_HIL_ISERR	0x80	/* Has meaning as in next 4 values */
++#define HP_SDC_HIL_RC_DONE	0x80	/* i8042 auto-configured loop */
++#define HP_SDC_HIL_ERR		0x81	/* HIL MLC R2 had a bit set */
++#define HP_SDC_HIL_TO		0x82	/* i8042 HIL watchdog expired */
++#define HP_SDC_HIL_RC		0x84	/* i8042 is auto-configuring loop */
++#define HP_SDC_HIL_DAT		0x60	/* Data from HIL MLC R0 */
++
++
++typedef struct {
++	rwlock_t	ibf_lock;
++	rwlock_t	lock;		/* user/tasklet lock */
++	rwlock_t	rtq_lock;	/* isr/tasklet lock */
++	rwlock_t	hook_lock;	/* isr/user lock for handler add/del */
++
++	unsigned int	irq, nmi;	/* Our IRQ lines */
++	unsigned long	base_io, status_io, data_io; /* Our IO ports */
++
++	uint8_t		im;		/* Interrupt mask */
++	int		set_im; 	/* Interrupt mask needs to be set. */
++
++	int		ibf;		/* Last known status of IBF flag */
++	uint8_t		wi;		/* current i8042 write index */
++	uint8_t		r7[4];          /* current i8042[0x70 - 0x74] values */
++	uint8_t		r11, r7e;	/* Values from version/revision regs */
++
++	hp_sdc_irqhook	*timer, *reg, *hil, *pup, *cooked;
++
++#define HP_SDC_QUEUE_LEN 16
++	hp_sdc_transaction *tq[HP_SDC_QUEUE_LEN]; /* All pending read/writes */
++
++	int		rcurr, rqty;	/* Current read transact in process */
++	struct timeval	rtv;		/* Time when current read started */
++	int		wcurr;		/* Current write transact in process */
++
++	int		dev_err;	/* carries status from registration */
++#if defined(__hppa__)
++	struct parisc_device	*dev;
++#elif defined(__mc68000__)
++	void		*dev;
++#else
++#error No support for device registration on this arch yet.
++#endif
++
++	struct timer_list kicker;	/* Keeps below task alive */
++	struct tasklet_struct	task;
++
++} hp_i8042_sdc;
++
++#endif /* _LINUX_HP_SDC_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/input.h CVS2_6_11_PA2/include/linux/input.h
+--- LINUS_2_6_11/include/linux/input.h	2005-03-02 04:19:22.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/input.h	2005-01-12 13:17:57.000000000 -0700
+@@ -615,6 +615,7 @@
+ #define BUS_ADB			0x17
+ #define BUS_I2C			0x18
+ #define BUS_HOST		0x19
++#define BUS_GSC			0x1A
+ 
+ /*
+  * Values describing the status of an effect
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/linux/signal.h CVS2_6_11_PA2/include/linux/signal.h
+--- LINUS_2_6_11/include/linux/signal.h	2005-03-02 04:19:22.000000000 -0700
++++ CVS2_6_11_PA2/include/linux/signal.h	2004-09-13 09:24:14.000000000 -0600
+@@ -220,6 +220,9 @@
+ extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
+ #endif
+ 
++int copy_siginfo_from_user(siginfo_t *to, siginfo_t __user *from);
++int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from);
++
+ #endif /* __KERNEL__ */
+ 
+ #endif /* _LINUX_SIGNAL_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/scsi/scsi_transport_spi.h CVS2_6_11_PA2/include/scsi/scsi_transport_spi.h
+--- LINUS_2_6_11/include/scsi/scsi_transport_spi.h	2005-03-02 04:19:23.000000000 -0700
++++ CVS2_6_11_PA2/include/scsi/scsi_transport_spi.h	2005-02-23 11:31:37.000000000 -0700
+@@ -130,5 +130,6 @@
+ void spi_release_transport(struct scsi_transport_template *);
+ void spi_schedule_dv_device(struct scsi_device *);
+ void spi_dv_device(struct scsi_device *);
++void spi_display_xfer_agreement(struct scsi_target *);
+ 
+ #endif /* SCSI_TRANSPORT_SPI_H */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/include/sound/opl3.h CVS2_6_11_PA2/include/sound/opl3.h
+--- LINUS_2_6_11/include/sound/opl3.h	2005-03-02 04:19:23.000000000 -0700
++++ CVS2_6_11_PA2/include/sound/opl3.h	2005-03-01 09:56:38.000000000 -0700
+@@ -261,8 +261,8 @@
+ } snd_opl3_voice_t;
+ 
+ struct snd_opl3 {
+-	unsigned long l_port;
+-	unsigned long r_port;
++	void __iomem *l_port;
++	void __iomem *r_port;
+ 	struct resource *res_l_port;
+ 	struct resource *res_r_port;
+ 	unsigned short hardware;
+@@ -319,6 +319,9 @@
+ void snd_opl3_interrupt(snd_hwdep_t * hw);
+ int snd_opl3_new(snd_card_t *card, unsigned short hardware, opl3_t **ropl3);
+ int snd_opl3_init(opl3_t *opl3);
++int snd_opl3_create_mapped(snd_card_t * card,
++			   void __iomem * l_port, void __iomem * r_port,
++			   unsigned short hardware, opl3_t ** opl3);
+ int snd_opl3_create(snd_card_t * card,
+ 		    unsigned long l_port, unsigned long r_port,
+ 		    unsigned short hardware,
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/ipc/compat_mq.c CVS2_6_11_PA2/ipc/compat_mq.c
+--- LINUS_2_6_11/ipc/compat_mq.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/ipc/compat_mq.c	2004-07-20 16:07:41.000000000 -0600
+@@ -7,6 +7,7 @@
+  */
+ 
+ #include <linux/compat.h>
++#include <linux/compat_siginfo.h>
+ #include <linux/fs.h>
+ #include <linux/kernel.h>
+ #include <linux/mqueue.h>
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/Makefile CVS2_6_11_PA2/kernel/Makefile
+--- LINUS_2_6_11/kernel/Makefile	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/kernel/Makefile	2004-11-29 12:56:52.000000000 -0700
+@@ -17,7 +17,7 @@
+ obj-$(CONFIG_KALLSYMS) += kallsyms.o
+ obj-$(CONFIG_PM) += power/
+ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
+-obj-$(CONFIG_COMPAT) += compat.o
++obj-$(CONFIG_COMPAT) += compat.o compat_signal.o
+ obj-$(CONFIG_IKCONFIG) += configs.o
+ obj-$(CONFIG_IKCONFIG_PROC) += configs.o
+ obj-$(CONFIG_STOP_MACHINE) += stop_machine.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/compat.c CVS2_6_11_PA2/kernel/compat.c
+--- LINUS_2_6_11/kernel/compat.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/kernel/compat.c	2005-01-22 07:59:56.000000000 -0700
+@@ -13,6 +13,7 @@
+ 
+ #include <linux/linkage.h>
+ #include <linux/compat.h>
++#include <linux/compat_siginfo.h>
+ #include <linux/errno.h>
+ #include <linux/time.h>
+ #include <linux/signal.h>
+@@ -601,6 +602,26 @@
+ 
+ /* timer_create is architecture specific because it needs sigevent conversion */
+ 
++long compat_sys_timer_create(clockid_t which_clock,
++			     compat_sigevent_t __user *timer_event_spec,
++			     compat_timer_t __user * created_timer_id)
++{
++	sigevent_t kevent;
++	mm_segment_t old_fs = get_fs();
++	long ret;
++
++	if (timer_event_spec != NULL)
++		if (compat_copy_sigevent_from_user(&kevent, timer_event_spec) != 0)
++			return -EFAULT;
++
++	set_fs(KERNEL_DS);
++	ret = sys_timer_create(which_clock, timer_event_spec ? (sigevent_t __user *)&kevent : NULL, created_timer_id);
++	set_fs(old_fs);
++
++	return ret;
++}
++
++
+ long compat_get_bitmap(unsigned long *mask, compat_ulong_t __user *umask,
+ 		       unsigned long bitmap_size)
+ {
+@@ -682,6 +703,40 @@
+ 	return 0;
+ }
+ 
++asmlinkage int compat_sys_waitid(int which, pid_t pid,
++				 compat_siginfo_t __user *infop, int options,
++				 struct compat_rusage __user *ru)
++{
++  	long ret;
++	siginfo_t ksiginfo;
++	struct rusage kru;
++	mm_segment_t old_fs = get_fs();
++	
++	memset(&ksiginfo, 0, sizeof(ksiginfo));
++
++	set_fs(KERNEL_DS);
++	ret = sys_waitid(which, pid, (siginfo_t __user *)&ksiginfo, options, (struct rusage __user *)&kru);
++	set_fs(old_fs);
++
++	/* If there was an error don't bother copying siginfo */
++	if (ret < 0 || ksiginfo.si_signo == 0)
++		return ret;
++
++	if (ru) {
++		ret = put_compat_rusage(&kru, ru);
++		if (ret)
++			return ret;
++	}
++
++	/* Tell copy_siginfo_to_user that it was __SI_CHLD */
++	ksiginfo.si_code |= __SI_CHLD;
++	
++	if (compat_copy_siginfo_to_user(infop, &ksiginfo) != 0)
++		return -EFAULT;
++
++	return 0;
++}
++
+ void
+ sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
+ {
+@@ -758,7 +813,7 @@
+ 	if (sig) {
+ 		ret = sig;
+ 		if (uinfo) {
+-			if (copy_siginfo_to_user32(uinfo, &info))
++			if (compat_copy_siginfo_to_user(uinfo, &info))
+ 				ret = -EFAULT;
+ 		}
+ 	}else {
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/compat_signal.c CVS2_6_11_PA2/kernel/compat_signal.c
+--- LINUS_2_6_11/kernel/compat_signal.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/kernel/compat_signal.c	2004-11-03 15:07:38.000000000 -0700
+@@ -0,0 +1,244 @@
++/*
++ *  Copyright (C) 2003 Carlos O'Donell
++ * 
++ *  2003-12-20  Carlos O'Donell
++ *              Copied linux/kernel/compat_signal.c (copy_siginfo_to_user)
++ *              and modified to use compat_siginfo_t for thunking down to
++ *              32-bit userspace from a 64-bit kernel.
++ *              
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at
++ * your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
++ * NON INFRINGEMENT.  See the GNU General Public License for more
++ * details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
++ *
++ */
++
++#include <linux/compat_siginfo.h>
++#include <asm/errno.h>
++#include <asm/uaccess.h>
++#include <asm/siginfo.h>
++
++#ifndef HAVE_ARCH_COMPAT_COPY_SIGINFO_TO_USER
++int compat_copy_siginfo_to_user(compat_siginfo_t __user *to, siginfo_t *from)
++{
++	int err;
++	compat_siginfo_t compat_from;	
++
++	if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
++		return -EFAULT;
++	
++	/*
++	 * If you change compat_siginfo_t structure *or* siginfo_t, 
++	 * please be sure this code is fixed accordingly.
++	 * It should never copy any pad contained in the structure
++	 * to avoid security leaks, but must copy the generic
++	 * 3 ints plus the relevant union member.
++	 */
++
++	/* Convert structure, don't leak anything in the copy */
++	memset(&compat_from,'\0',sizeof(compat_siginfo_t));
++
++        /* Always copy si_signo, si_errno, and si_code */
++	compat_from.si_signo = (compat_int_t)(from->si_signo);
++	compat_from.si_errno = (compat_int_t)(from->si_errno);
++	/* si_code is only a (short) value, remove kernel bits. */
++	compat_from.si_code = (short)(from->si_code);
++        
++	err = __put_user(compat_from.si_signo, &to->si_signo);
++	err |= __put_user(compat_from.si_errno, &to->si_errno);
++	err |= __put_user(compat_from.si_code, &to->si_code);
++
++        /* siginfo_t came from userspace, so it is the right
++         * size, no need for conversion
++         */        
++	if (from->si_code < 0) {
++		return __copy_to_user(&to->_sifields._pad, 
++                                      &from->_sifields._pad, 
++                                      SI_COMPAT_PAD_SIZE)
++			? -EFAULT : 0;
++        }
++	
++	switch (from->si_code & __SI_MASK) {
++	case __SI_KILL:
++		compat_from.si_pid = (compat_pid_t)(from->si_pid);
++		compat_from.si_uid = (__ARCH_SI_COMPAT_UID_T)(from->si_uid);
++		err |= __put_user(compat_from.si_pid, &to->si_pid);
++		err |= __put_user(compat_from.si_uid, &to->si_uid);
++		break;
++	case __SI_TIMER:
++		compat_from.si_pid = (compat_timer_t)(from->si_tid);
++		compat_from.si_overrun = (compat_int_t)(from->si_overrun);
++		compat_from.si_ptr = (compat_uptr_t)((u64 __force)(from->si_ptr) & 0xffffffffUL);
++		err |= __put_user(compat_from.si_tid, &to->si_tid);
++		err |= __put_user(compat_from.si_overrun, &to->si_overrun);
++		err |= __put_user(compat_from.si_ptr, &to->si_ptr);
++		break;
++	case __SI_POLL:
++		compat_from.si_band = (__ARCH_SI_COMPAT_BAND_T)(from->si_band);
++		compat_from.si_fd = (compat_int_t)(from->si_fd);
++		err |= __put_user(compat_from.si_band, &to->si_band);
++		err |= __put_user(compat_from.si_fd, &to->si_fd);
++		break;
++	case __SI_FAULT:
++		compat_from.si_addr = (compat_uptr_t)((u64 __force)(from->si_addr) & 0xffffffffUL);
++		err |= __put_user(compat_from.si_addr, &to->si_addr);
++#ifdef __ARCH_SI_COMPAT_TRAPNO
++		compat_from.si_trapno = (compat_int_t)(from->si_addr);
++		err |= __put_user(compat_from.si_trapno, &to->si_trapno);
++#endif
++		break;
++	case __SI_CHLD:
++		compat_from.si_pid = (compat_pid_t)(from->si_pid);
++		compat_from.si_uid = (__ARCH_SI_COMPAT_UID_T)(from->si_uid);
++		compat_from.si_status = (compat_int_t)(from->si_status);
++		compat_from.si_utime = (compat_clock_t)(from->si_utime);
++		compat_from.si_stime = (compat_clock_t)(from->si_stime);
++		err |= __put_user(compat_from.si_pid, &to->si_pid);
++		err |= __put_user(compat_from.si_uid, &to->si_uid);
++		err |= __put_user(compat_from.si_status, &to->si_status);
++		err |= __put_user(compat_from.si_utime, &to->si_utime);
++		err |= __put_user(compat_from.si_stime, &to->si_stime);
++		break;
++	case __SI_RT: /* This is not generated by the kernel as of now. */
++	case __SI_MESGQ: /* But this is */
++		compat_from.si_pid = (compat_pid_t)(from->si_pid);
++		compat_from.si_uid = (__ARCH_SI_COMPAT_UID_T)(from->si_uid);
++		compat_from.si_int = (compat_int_t)(from->si_int);
++		compat_from.si_ptr = (compat_uptr_t)((u64 __force)(from->si_ptr) & 0xffffffffUL);
++		err |= __put_user(compat_from.si_pid, &to->si_pid);
++		err |= __put_user(compat_from.si_uid, &to->si_uid);
++		err |= __put_user(compat_from.si_int, &to->si_int);
++		err |= __put_user(compat_from.si_ptr, &to->si_ptr);
++		break;
++	default: /* this is just in case for now ... */
++		compat_from.si_pid = (compat_pid_t)(from->si_pid);
++		compat_from.si_uid = (__ARCH_SI_COMPAT_UID_T)(from->si_uid);
++		err |= __put_user(compat_from.si_pid, &to->si_pid);
++		err |= __put_user(compat_from.si_uid, &to->si_uid);
++		break;
++	}
++	return err;
++}
++#endif
++
++#ifndef HAVE_ARCH_COPY_SIGINFO_FROM_USER
++int compat_copy_siginfo_from_user(siginfo_t *to, compat_siginfo_t __user *from)
++{
++	int err;
++        u64 scratch;
++
++	if (!access_ok (VERIFY_READ, from, sizeof(compat_siginfo_t)))
++		return -EFAULT;
++	
++	/*
++	 * If you change compat_siginfo_t structure *or* siginfo_t, 
++	 * please be sure this code is fixed accordingly.
++	 */
++
++        /* Always copy si_signo, si_errno, and si_code */
++	err = __get_user(to->si_signo, &from->si_signo);
++	err |= __get_user(to->si_errno, &from->si_errno);
++	err |= __get_user(to->si_code, &from->si_code);
++        
++        /* siginfo_t came from userspace, so it is the right
++         * size, no need for conversion
++         */        
++	if (to->si_code < 0) {
++		return __copy_from_user(&to->_sifields._pad, 
++                                        &from->_sifields._pad, 
++                                        SI_COMPAT_PAD_SIZE)
++			? -EFAULT : 0;
++        }
++	
++	switch (to->si_code & __SI_MASK) {
++	case __SI_KILL:
++		err |= __get_user(to->si_pid, &from->si_pid);
++		err |= __get_user(to->si_uid, &from->si_uid);
++		break;
++	case __SI_TIMER:
++		err |= __get_user(to->si_tid, &from->si_tid);
++		err |= __get_user(to->si_overrun, &from->si_overrun);
++		err |= __get_user(scratch, &from->si_ptr);
++                to->si_ptr = (u64 __user*)scratch;                
++		break;
++	case __SI_POLL:
++		err |= __get_user(to->si_band, &from->si_band);
++		err |= __get_user(to->si_fd, &from->si_fd);
++		break;
++	case __SI_FAULT:
++		err |= __get_user(scratch, &from->si_addr);
++                to->si_addr = (u64 __user*)scratch;
++#ifdef __ARCH_SI_COMPAT_TRAPNO
++		err |= __get_user(to->si_trapno, &from->si_trapno);
++#endif
++		break;
++	case __SI_CHLD:
++		err |= __get_user(to->si_pid, &from->si_pid);
++		err |= __get_user(to->si_uid, &from->si_uid);
++		err |= __get_user(to->si_status, &from->si_status);
++		err |= __get_user(to->si_utime, &from->si_utime);
++		err |= __get_user(to->si_stime, &from->si_stime);
++		break;
++	case __SI_RT: /* This is not generated by the kernel as of now. */
++	case __SI_MESGQ: /* But this is */
++		err |= __get_user(to->si_pid, &from->si_pid);
++		err |= __get_user(to->si_uid, &from->si_uid);
++		err |= __get_user(to->si_int, &from->si_int);
++		err |= __get_user(scratch, &from->si_ptr);
++                to->si_ptr = (u64 __user*)scratch;
++		break;
++	default: /* this is just in case for now ... */
++		err |= __get_user(to->si_pid, &from->si_pid);
++		err |= __get_user(to->si_uid, &from->si_uid);
++		break;
++	}
++	return err;
++}
++#endif
++
++#ifndef HAVE_ARCH_COPY_SIGEVENT_FROM_USER
++int compat_copy_sigevent_from_user(sigevent_t *to, compat_sigevent_t __user *from)
++{
++	int err;
++	u64 scratch;
++	
++	/* copy sigval_t sigev_value 
++	 	int_t sival_int		(same)
++	 	uptr_t sival_ptr	(32 vs 64)*/
++	err = __get_user(to->sigev_value.sival_int, 
++	    		 &from->sigev_value.sival_int);
++	err |= __get_user(scratch, &from->sigev_value.sival_ptr);
++	to->sigev_value.sival_ptr = (u64 __user *)scratch;
++	
++	/* copy int_t sigev_signo 	(same)*/
++	err |= __get_user(to->sigev_signo, &from->sigev_signo);
++	
++	/* copy int_t sigev_notify	(same)*/
++	err |= __get_user(to->sigev_notify, &from->sigev_notify);
++
++	/* never copy _sigev_un padding */
++
++	/* copy int_t _tid 		(same),
++	   good_sigevent() uses this value of */
++	err |= __get_user(to->sigev_notify_thread_id, &from->sigev_notify_thread_id);
++	
++	/* XXX: Do not copy these, they aren't used by
++	   anyone. We would need to distinguish the uses of the union.
++	   copy _sigev_thread
++	  	uptr_t _function	(32 vs 64)
++	  	uptr_t _attribute	(32 vs 64)*/
++	
++	return err;
++}
++#endif
++
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/printk.c CVS2_6_11_PA2/kernel/printk.c
+--- LINUS_2_6_11/kernel/printk.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/kernel/printk.c	2005-02-13 19:55:36.000000000 -0700
+@@ -92,8 +92,8 @@
+  * must be masked before subscripting
+  */
+ static unsigned long log_start;	/* Index into log_buf: next char to be read by syslog() */
+-static unsigned long con_start;	/* Index into log_buf: next char to be sent to consoles */
+-static unsigned long log_end;	/* Index into log_buf: most-recently-written-char + 1 */
++unsigned long con_start;	/* Index into log_buf: next char to be sent to consoles */
++unsigned long log_end;	/* Index into log_buf: most-recently-written-char + 1 */
+ static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */
+ 
+ /*
+@@ -804,6 +804,11 @@
+ 	if (!(console->flags & CON_ENABLED))
+ 		return;
+ 
++	if (console_drivers && (console_drivers->flags & CON_BOOT)) {
++		unregister_console(console_drivers);
++		console->flags &= ~CON_PRINTBUFFER;
++	}
++
+ 	/*
+ 	 *	Put this console in the list - keep the
+ 	 *	preferred driver at the head of the list.
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/ptrace.c CVS2_6_11_PA2/kernel/ptrace.c
+--- LINUS_2_6_11/kernel/ptrace.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/kernel/ptrace.c	2005-02-03 04:45:14.000000000 -0700
+@@ -343,7 +343,7 @@
+ 	siginfo_t newinfo;
+ 	int error = -ESRCH;
+ 
+-	if (copy_from_user(&newinfo, data, sizeof (siginfo_t)))
++	if (copy_siginfo_from_user(&newinfo, data) != 0)
+ 		return -EFAULT;
+ 
+ 	read_lock(&tasklist_lock);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/resource.c CVS2_6_11_PA2/kernel/resource.c
+--- LINUS_2_6_11/kernel/resource.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/kernel/resource.c	2005-01-12 13:18:05.000000000 -0700
+@@ -181,6 +181,8 @@
+ {
+ 	struct resource *tmp, **p;
+ 
++	BUG_ON(old->child);
++
+ 	p = &old->parent->child;
+ 	for (;;) {
+ 		tmp = *p;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/kernel/signal.c CVS2_6_11_PA2/kernel/signal.c
+--- LINUS_2_6_11/kernel/signal.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/kernel/signal.c	2005-02-03 04:45:14.000000000 -0700
+@@ -22,6 +22,7 @@
+ #include <linux/security.h>
+ #include <linux/syscalls.h>
+ #include <linux/ptrace.h>
++#include <linux/compat_siginfo.h>
+ #include <asm/param.h>
+ #include <asm/uaccess.h>
+ #include <asm/unistd.h>
+@@ -2083,17 +2084,35 @@
+ 	return do_sigpending(set, sigsetsize);
+ }
+ 
++#ifndef HAVE_ARCH_COPY_SIGINFO_FROM_USER
++
++int copy_siginfo_from_user(siginfo_t *to, siginfo_t __user *from)
++{
++        if(is_compat_task(current))
++                return compat_copy_siginfo_from_user(to,(compat_siginfo_t __user *)from);
++  
++        return copy_from_user(&to, from, sizeof(siginfo_t));
++}
++
++#endif
++
+ #ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER
+ 
+ int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from)
+ {
+ 	int err;
++	
++	/* Use compat_siginfo_t with 32-bit signals */
++	if(is_compat_task(current)){
++		return compat_copy_siginfo_to_user((compat_siginfo_t __user *)to,from);
++	}
+ 
+ 	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
+ 		return -EFAULT;
+ 	if (from->si_code < 0)
+ 		return __copy_to_user(to, from, sizeof(siginfo_t))
+ 			? -EFAULT : 0;
++	
+ 	/*
+ 	 * If you change siginfo_t structure, please be sure
+ 	 * this code is fixed accordingly.
+@@ -2330,7 +2349,7 @@
+ {
+ 	siginfo_t info;
+ 
+-	if (copy_from_user(&info, uinfo, sizeof(siginfo_t)))
++	if (copy_siginfo_from_user(&info, uinfo))
+ 		return -EFAULT;
+ 
+ 	/* Not even root can pretend to send signals from the kernel.
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/mm/shmem.c CVS2_6_11_PA2/mm/shmem.c
+--- LINUS_2_6_11/mm/shmem.c	2005-03-02 04:19:24.000000000 -0700
++++ CVS2_6_11_PA2/mm/shmem.c	2005-02-13 19:55:36.000000000 -0700
+@@ -461,7 +461,7 @@
+ 	} while (next);
+ }
+ 
+-static void shmem_truncate(struct inode *inode)
++/* static gcc-3.3 OPD bug - GGG */ void shmem_truncate(struct inode *inode)
+ {
+ 	struct shmem_inode_info *info = SHMEM_I(inode);
+ 	unsigned long idx;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/drivers/opl3/opl3_lib.c CVS2_6_11_PA2/sound/drivers/opl3/opl3_lib.c
+--- LINUS_2_6_11/sound/drivers/opl3/opl3_lib.c	2005-03-02 04:19:28.000000000 -0700
++++ CVS2_6_11_PA2/sound/drivers/opl3/opl3_lib.c	2005-03-01 09:56:38.000000000 -0700
+@@ -40,7 +40,7 @@
+ static void snd_opl2_command(opl3_t * opl3, unsigned short cmd, unsigned char val)
+ {
+ 	unsigned long flags;
+-	unsigned long port;
++	void __iomem *port;
+ 
+ 	/*
+ 	 * The original 2-OP synth requires a quite long delay
+@@ -51,10 +51,10 @@
+ 
+ 	spin_lock_irqsave(&opl3->reg_lock, flags);
+ 
+-	outb((unsigned char) cmd, port);
++	iowrite8((unsigned char) cmd, port);
+ 	udelay(10);
+ 
+-	outb((unsigned char) val, port + 1);
++	iowrite8((unsigned char) val, port + 1);
+ 	udelay(30);
+ 
+ 	spin_unlock_irqrestore(&opl3->reg_lock, flags);
+@@ -63,7 +63,7 @@
+ static void snd_opl3_command(opl3_t * opl3, unsigned short cmd, unsigned char val)
+ {
+ 	unsigned long flags;
+-	unsigned long port;
++	void __iomem *port;
+ 
+ 	/*
+ 	 * The OPL-3 survives with just two INBs
+@@ -74,13 +74,13 @@
+ 
+ 	spin_lock_irqsave(&opl3->reg_lock, flags);
+ 
+-	outb((unsigned char) cmd, port);
+-	inb(opl3->l_port);
+-	inb(opl3->l_port);
+-
+-	outb((unsigned char) val, port + 1);
+-	inb(opl3->l_port);
+-	inb(opl3->l_port);
++	iowrite8((unsigned char) cmd, port);
++	ioread8(opl3->l_port);
++	ioread8(opl3->l_port);
++
++	iowrite8((unsigned char) val, port + 1);
++	ioread8(opl3->l_port);
++	ioread8(opl3->l_port);
+ 
+ 	spin_unlock_irqrestore(&opl3->reg_lock, flags);
+ }
+@@ -104,7 +104,7 @@
+ 	opl3->command(opl3, OPL3_LEFT | OPL3_REG_TIMER_CONTROL, OPL3_TIMER1_MASK | OPL3_TIMER2_MASK);
+ 	/* Reset the IRQ of the FM chip */
+ 	opl3->command(opl3, OPL3_LEFT | OPL3_REG_TIMER_CONTROL, OPL3_IRQ_RESET);
+-	signature = stat1 = inb(opl3->l_port);	/* Status register */
++	signature = stat1 = ioread8(opl3->l_port);	/* Status register */
+ 	if ((stat1 & 0xe0) != 0x00) {	/* Should be 0x00 */
+ 		snd_printd("OPL3: stat1 = 0x%x\n", stat1);
+ 		return -ENODEV;
+@@ -116,7 +116,7 @@
+ 	/* Now we have to delay at least 80us */
+ 	udelay(200);
+ 	/* Read status after timers have expired */
+-	stat2 = inb(opl3->l_port);
++	stat2 = ioread8(opl3->l_port);
+ 	/* Stop the timers */
+ 	opl3->command(opl3, OPL3_LEFT | OPL3_REG_TIMER_CONTROL, OPL3_TIMER1_MASK | OPL3_TIMER2_MASK);
+ 	/* Reset the IRQ of the FM chip */
+@@ -299,7 +299,7 @@
+ 		return;
+ 
+ 	opl3 = hw->private_data;
+-	status = inb(opl3->l_port);
++	status = ioread8(opl3->l_port);
+ #if 0
+ 	snd_printk("AdLib IRQ status = 0x%x\n", status);
+ #endif
+@@ -333,6 +333,8 @@
+ 		release_resource(opl3->res_r_port);
+ 		kfree_nocheck(opl3->res_r_port);
+ 	}
++	iounmap(opl3->l_port);
++	iounmap(opl3->r_port);
+ 	kfree(opl3);
+ 	return 0;
+ }
+@@ -397,12 +399,13 @@
+ 	return 0;
+ }
+ 
+-int snd_opl3_create(snd_card_t * card,
+-		    unsigned long l_port,
+-		    unsigned long r_port,
+-		    unsigned short hardware,
+-		    int integrated,
+-		    opl3_t ** ropl3)
++static int snd_opl3_create_main(snd_card_t * card,
++				void __iomem *l_port,
++				void __iomem *r_port,
++				struct resource *res_l_port,
++				struct resource *res_r_port,
++				unsigned short hardware,
++				opl3_t ** ropl3)
+ {
+ 	opl3_t *opl3;
+ 	int err;
+@@ -410,21 +413,10 @@
+ 	*ropl3 = NULL;
+ 	if ((err = snd_opl3_new(card, hardware, &opl3)) < 0)
+ 		return err;
+-	if (! integrated) {
+-		if ((opl3->res_l_port = request_region(l_port, 2, "OPL2/3 (left)")) == NULL) {
+-			snd_printk(KERN_ERR "opl3: can't grab left port 0x%lx\n", l_port);
+-			snd_opl3_free(opl3);
+-			return -EBUSY;
+-		}
+-		if (r_port != 0 &&
+-		    (opl3->res_r_port = request_region(r_port, 2, "OPL2/3 (right)")) == NULL) {
+-			snd_printk(KERN_ERR "opl3: can't grab right port 0x%lx\n", r_port);
+-			snd_opl3_free(opl3);
+-			return -EBUSY;
+-		}
+-	}
+ 	opl3->l_port = l_port;
+ 	opl3->r_port = r_port;
++	opl3->res_l_port = res_l_port;
++	opl3->res_r_port = res_r_port;
+ 
+ 	switch (opl3->hardware) {
+ 	/* some hardware doesn't support timers */
+@@ -455,6 +447,67 @@
+ 	return 0;
+ }
+ 
++int snd_opl3_create_mapped(snd_card_t * card,
++			   void __iomem * l_port,
++			   void __iomem * r_port,
++			   unsigned short hardware,
++			   opl3_t ** ropl3)
++{
++	return snd_opl3_create_main(card, l_port, r_port, NULL, NULL, hardware, ropl3);
++}
++
++int snd_opl3_create(snd_card_t * card,
++		    unsigned long l_port,
++		    unsigned long r_port,
++		    unsigned short hardware,
++		    int integrated,
++		    opl3_t ** ropl3) {
++	struct resource *res_l_port = NULL;
++	struct resource *res_r_port = NULL;
++	void __iomem *l_mapped = NULL;
++	void __iomem *r_mapped = NULL;
++	
++	if (! integrated) {
++		if ((res_l_port = request_region(l_port, 2, "OPL2/3 (left)")) == NULL) {
++			snd_printk(KERN_ERR "opl3: can't grab left port 0x%lx\n", l_port);
++			goto fail;
++		}
++		if (r_port != 0 &&
++		    (res_r_port = request_region(r_port, 2, "OPL2/3 (right)")) == NULL) {
++			snd_printk(KERN_ERR "opl3: can't grab right port 0x%lx\n", r_port);
++			goto fail;
++		}
++	}
++	
++	l_mapped = ioport_map(l_port, 2);
++	if (l_mapped == NULL) {
++		snd_printk(KERN_ERR "opl3: failed to map port 0x%lx\n", l_port);
++		goto fail;
++	}
++	r_mapped = ioport_map(r_port, 2);
++	if (r_mapped == NULL) {
++		snd_printk(KERN_ERR "opl3: failed to map port 0x%lx\n", r_port);
++		goto fail;
++	}
++	
++	return snd_opl3_create_main(card, l_mapped, r_mapped, res_l_port, res_r_port, hardware, ropl3);
++
++fail:
++	if (res_l_port) {
++		release_resource(res_l_port);
++		kfree_nocheck(res_l_port);
++	}
++	if (res_r_port) {
++		release_resource(res_r_port);
++		kfree_nocheck(res_r_port);
++	}
++	if (l_mapped)
++		iounmap(l_mapped);
++	if (r_mapped)
++		iounmap(r_mapped);
++	return -EBUSY;
++}
++
+ int snd_opl3_timer_new(opl3_t * opl3, int timer1_dev, int timer2_dev)
+ {
+ 	int err;
+@@ -534,6 +587,7 @@
+ EXPORT_SYMBOL(snd_opl3_new);
+ EXPORT_SYMBOL(snd_opl3_init);
+ EXPORT_SYMBOL(snd_opl3_create);
++EXPORT_SYMBOL(snd_opl3_create_mapped);
+ EXPORT_SYMBOL(snd_opl3_timer_new);
+ EXPORT_SYMBOL(snd_opl3_hwdep_new);
+ 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/oss/ad1889.c CVS2_6_11_PA2/sound/oss/ad1889.c
+--- LINUS_2_6_11/sound/oss/ad1889.c	2005-03-02 04:19:28.000000000 -0700
++++ CVS2_6_11_PA2/sound/oss/ad1889.c	2005-03-01 16:00:56.000000000 -0700
+@@ -74,7 +74,7 @@
+ 
+ 	DBG("Setting WAV rate to %d\n", rate);
+ 	dev->state[AD_WAV_STATE].dmabuf.rate = rate;
+-	AD1889_WRITEW(dev, AD_DSWAS, rate);
++	AD1889_WRITEW(dev, AD_DS_WAS, rate);
+ 
+ 	/* Cycle the DAC to enable the new rate */
+ 	ac97_codec->codec_write(dev->ac97_codec, AC97_POWER_CONTROL, 0x0200);
+@@ -88,14 +88,14 @@
+ 
+ 	DBG("Setting WAV format to 0x%x\n", fmt);
+ 
+-	tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
++	tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC);
+ 	if (fmt & AFMT_S16_LE) {
+ 		//tmp |= 0x0100; /* set WA16 */
+ 		tmp |= 0x0300; /* set WA16 stereo */
+ 	} else if (fmt & AFMT_U8) {
+ 		tmp &= ~0x0100; /* clear WA16 */
+ 	} 
+-	AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
++	AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp);
+ }
+ 
+ static inline void ad1889_set_adc_fmt(ad1889_dev_t *dev, int fmt)
+@@ -104,13 +104,13 @@
+ 
+ 	DBG("Setting ADC format to 0x%x\n", fmt);
+ 
+-	tmp = AD1889_READW(ad1889_dev, AD_DSRAMC);
++	tmp = AD1889_READW(ad1889_dev, AD_DS_RAMC);
+ 	if (fmt & AFMT_S16_LE) {
+ 		tmp |= 0x0100; /* set WA16 */
+ 	} else if (fmt & AFMT_U8) {
+ 		tmp &= ~0x0100; /* clear WA16 */
+ 	} 
+-	AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp);
++	AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, tmp);
+ }
+ 
+ static void ad1889_start_wav(ad1889_state_t *state)
+@@ -144,21 +144,21 @@
+ 	    dmabuf->rd_ptr, dmabuf->dma_len);
+ 
+         /* load up the current register set */
+-	AD1889_WRITEL(ad1889_dev, AD_DMAWAVCC, cnt);
+-	AD1889_WRITEL(ad1889_dev, AD_DMAWAVICC, cnt);
+-	AD1889_WRITEL(ad1889_dev, AD_DMAWAVCA, dmabuf->dma_handle);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_WAVCC, cnt);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_WAVICC, cnt);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_WAVCA, dmabuf->dma_handle);
+ 
+ 	/* TODO: for now we load the base registers with the same thing */
+-	AD1889_WRITEL(ad1889_dev, AD_DMAWAVBC, cnt);
+-	AD1889_WRITEL(ad1889_dev, AD_DMAWAVIBC, cnt);
+-	AD1889_WRITEL(ad1889_dev, AD_DMAWAVBA, dmabuf->dma_handle);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_WAVBC, cnt);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_WAVIBC, cnt);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_WAVBA, dmabuf->dma_handle);
+ 
+ 	/* and we're off to the races... */
+-	AD1889_WRITEL(ad1889_dev, AD_DMACHSS, 0x8);
+-	tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
++	AD1889_WRITEL(ad1889_dev, AD_DMA_CHSS, 0x8);
++	tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC);
+ 	tmp |= 0x0400; /* set WAEN */
+-	AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
+-	(void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */
++	AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp);
++	(void) AD1889_READW(ad1889_dev, AD_DS_WSMC); /* flush posted PCI write */
+ 
+ 	dmabuf->enable |= DAC_RUNNING;
+ 
+@@ -178,10 +178,10 @@
+ 		u16 tmp;
+ 		unsigned long cnt = dmabuf->dma_len;
+ 
+-		tmp = AD1889_READW(ad1889_dev, AD_DSWSMC);
++		tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC);
+ 		tmp &= ~0x0400; /* clear WAEN */
+-		AD1889_WRITEW(ad1889_dev, AD_DSWSMC, tmp);
+-		(void) AD1889_READW(ad1889_dev, AD_DSWSMC); /* flush posted PCI write */
++		AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp);
++		(void) AD1889_READW(ad1889_dev, AD_DS_WSMC); /* flush posted PCI write */
+ 		pci_unmap_single(ad1889_dev->pci, dmabuf->dma_handle, 
+ 				cnt, PCI_DMA_TODEVICE);
+ 
+@@ -210,7 +210,7 @@
+ 
+ 	spin_lock_irqsave(&state->card->lock, flags);
+ 	
+-	tmp = AD1889_READW(ad1889_dev, AD_DSRAMC);
++	tmp = AD1889_READW(ad1889_dev, AD_DS_RAMC);
+ 	if (start) {
+ 		state->dmabuf.enable |= ADC_RUNNING;
+ 		tmp |= 0x0004; /* set ADEN */
+@@ -218,7 +218,7 @@
+ 		state->dmabuf.enable &= ~ADC_RUNNING;
+ 		tmp &= ~0x0004; /* clear ADEN */
+ 	}
+-	AD1889_WRITEW(ad1889_dev, AD_DSRAMC, tmp);
++	AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, tmp);
+ 
+ 	spin_unlock_irqrestore(&state->card->lock, flags);
+ }
+@@ -301,53 +301,53 @@
+ 	int len, i;
+ 	ad1889_dev_t *dev = data;
+ 	ad1889_reg_t regs[] = {
+-		{ "WSMC", AD_DSWSMC, 16 },
+-		{ "RAMC", AD_DSRAMC, 16 },
+-		{ "WADA", AD_DSWADA, 16 },
+-		{ "SYDA", AD_DSSYDA, 16 },
+-		{ "WAS", AD_DSWAS, 16 },
+-		{ "RES", AD_DSRES, 16 },
+-		{ "CCS", AD_DSCCS, 16 },
+-		{ "ADCBA", AD_DMAADCBA, 32 },
+-		{ "ADCCA", AD_DMAADCCA, 32 },
+-		{ "ADCBC", AD_DMAADCBC, 32 },
+-		{ "ADCCC", AD_DMAADCCC, 32 },
+-		{ "ADCIBC", AD_DMAADCIBC, 32 },
+-		{ "ADCICC", AD_DMAADCICC, 32 },
+-		{ "ADCCTRL", AD_DMAADCCTRL, 16 },
+-		{ "WAVBA", AD_DMAWAVBA, 32 },
+-		{ "WAVCA", AD_DMAWAVCA, 32 },
+-		{ "WAVBC", AD_DMAWAVBC, 32 },
+-		{ "WAVCC", AD_DMAWAVCC, 32 },
+-		{ "WAVIBC", AD_DMAWAVIBC, 32 },
+-		{ "WAVICC", AD_DMAWAVICC, 32 },
+-		{ "WAVCTRL", AD_DMAWAVCTRL, 16 },
+-		{ "DISR", AD_DMADISR, 32 },
+-		{ "CHSS", AD_DMACHSS, 32 },
+-		{ "IPC", AD_GPIOIPC, 16 },
+-		{ "OP", AD_GPIOOP, 16 },
+-		{ "IP", AD_GPIOIP, 16 },
+-		{ "ACIC", AD_ACIC, 16 },
+-		{ "AC97_RESET", 0x100 + AC97_RESET, 16 },
+-		{ "AC97_MASTER_VOL_STEREO", 0x100 + AC97_MASTER_VOL_STEREO, 16 },
+-		{ "AC97_HEADPHONE_VOL", 0x100 + AC97_HEADPHONE_VOL, 16 },
+-		{ "AC97_MASTER_VOL_MONO", 0x100 + AC97_MASTER_VOL_MONO, 16 },
+-		{ "AC97_MASTER_TONE", 0x100 + AC97_MASTER_TONE, 16 },
+-		{ "AC97_PCBEEP_VOL", 0x100 + AC97_PCBEEP_VOL, 16 },
+-		{ "AC97_PHONE_VOL", 0x100 + AC97_PHONE_VOL, 16 },
+-		{ "AC97_MIC_VOL", 0x100 + AC97_MIC_VOL, 16 },
+-		{ "AC97_LINEIN_VOL", 0x100 + AC97_LINEIN_VOL, 16 },
+-		{ "AC97_CD_VOL", 0x100 + AC97_CD_VOL, 16 },
+-		{ "AC97_VIDEO_VOL", 0x100 + AC97_VIDEO_VOL, 16 },
+-		{ "AC97_AUX_VOL", 0x100 + AC97_AUX_VOL, 16 },
+-		{ "AC97_PCMOUT_VOL", 0x100 + AC97_PCMOUT_VOL, 16 },
+-		{ "AC97_RECORD_SELECT", 0x100 + AC97_RECORD_SELECT, 16 },
+-		{ "AC97_RECORD_GAIN", 0x100 + AC97_RECORD_GAIN, 16 },
+-		{ "AC97_RECORD_GAIN_MIC", 0x100 + AC97_RECORD_GAIN_MIC, 16 },
+-		{ "AC97_GENERAL_PURPOSE", 0x100 + AC97_GENERAL_PURPOSE, 16 },
+-		{ "AC97_3D_CONTROL", 0x100 + AC97_3D_CONTROL, 16 },
+-		{ "AC97_MODEM_RATE", 0x100 + AC97_MODEM_RATE, 16 },
+-		{ "AC97_POWER_CONTROL", 0x100 + AC97_POWER_CONTROL, 16 },
++		{ "WSMC", AD_DS_WSMC, 16 },
++		{ "RAMC", AD_DS_RAMC, 16 },
++		{ "WADA", AD_DS_WADA, 16 },
++		{ "SYDA", AD_DS_SYDA, 16 },
++		{ "WAS", AD_DS_WAS, 16 },
++		{ "RES", AD_DS_RES, 16 },
++		{ "CCS", AD_DS_CCS, 16 },
++		{ "ADCBA", AD_DMA_ADCBA, 32 },
++		{ "ADCCA", AD_DMA_ADCCA, 32 },
++		{ "ADCBC", AD_DMA_ADCBC, 32 },
++		{ "ADCCC", AD_DMA_ADCCC, 32 },
++		{ "ADCIBC", AD_DMA_ADCIBC, 32 },
++		{ "ADCICC", AD_DMA_ADCICC, 32 },
++		{ "ADCCTRL", AD_DMA_ADCCTRL, 16 },
++		{ "WAVBA", AD_DMA_WAVBA, 32 },
++		{ "WAVCA", AD_DMA_WAVCA, 32 },
++		{ "WAVBC", AD_DMA_WAVBC, 32 },
++		{ "WAVCC", AD_DMA_WAVCC, 32 },
++		{ "WAVIBC", AD_DMA_WAVIBC, 32 },
++		{ "WAVICC", AD_DMA_WAVICC, 32 },
++		{ "WAVCTRL", AD_DMA_WAVCTRL, 16 },
++		{ "DISR", AD_DMA_DISR, 32 },
++		{ "CHSS", AD_DMA_CHSS, 32 },
++		{ "IPC", AD_GPIO_IPC, 16 },
++		{ "OP", AD_GPIO_OP, 16 },
++		{ "IP", AD_GPIO_IP, 16 },
++		{ "ACIC", AD_AC97_ACIC, 16 },
++		{ "AC97_RESET", AD_AC97_BASE + AC97_RESET, 16 },
++		{ "AC97_MASTER_VOL_STEREO", AD_AC97_BASE + AC97_MASTER_VOL_STEREO, 16 },
++		{ "AC97_HEADPHONE_VOL", AD_AC97_BASE + AC97_HEADPHONE_VOL, 16 },
++		{ "AC97_MASTER_VOL_MONO", AD_AC97_BASE + AC97_MASTER_VOL_MONO, 16 },
++		{ "AC97_MASTER_TONE", AD_AC97_BASE + AC97_MASTER_TONE, 16 },
++		{ "AC97_PCBEEP_VOL", AD_AC97_BASE + AC97_PCBEEP_VOL, 16 },
++		{ "AC97_PHONE_VOL", AD_AC97_BASE + AC97_PHONE_VOL, 16 },
++		{ "AC97_MIC_VOL", AD_AC97_BASE + AC97_MIC_VOL, 16 },
++		{ "AC97_LINEIN_VOL", AD_AC97_BASE + AC97_LINEIN_VOL, 16 },
++		{ "AC97_CD_VOL", AD_AC97_BASE + AC97_CD_VOL, 16 },
++		{ "AC97_VIDEO_VOL", AD_AC97_BASE + AC97_VIDEO_VOL, 16 },
++		{ "AC97_AUX_VOL", AD_AC97_BASE + AC97_AUX_VOL, 16 },
++		{ "AC97_PCMOUT_VOL", AD_AC97_BASE + AC97_PCMOUT_VOL, 16 },
++		{ "AC97_RECORD_SELECT", AD_AC97_BASE + AC97_RECORD_SELECT, 16 },
++		{ "AC97_RECORD_GAIN", AD_AC97_BASE + AC97_RECORD_GAIN, 16 },
++		{ "AC97_RECORD_GAIN_MIC", AD_AC97_BASE + AC97_RECORD_GAIN_MIC, 16 },
++		{ "AC97_GENERAL_PURPOSE", AD_AC97_BASE + AC97_GENERAL_PURPOSE, 16 },
++		{ "AC97_3D_CONTROL", AD_AC97_BASE + AC97_3D_CONTROL, 16 },
++		{ "AC97_MODEM_RATE", AD_AC97_BASE + AC97_MODEM_RATE, 16 },
++		{ "AC97_POWER_CONTROL", AD_AC97_BASE + AC97_POWER_CONTROL, 16 },
+ 		{ NULL }
+ 	};
+ 
+@@ -400,9 +400,9 @@
+ 	}
+ 	
+ 	if (dmabuf->enable & DAC_RUNNING)
+-		offset = le32_to_cpu(AD1889_READL(state->card, AD_DMAWAVBA));
++		offset = le32_to_cpu(AD1889_READL(state->card, AD_DMA_WAVBA));
+ 	else
+-		offset = le32_to_cpu(AD1889_READL(state->card, AD_DMAADCBA));
++		offset = le32_to_cpu(AD1889_READL(state->card, AD_DMA_ADCBA));
+ 
+ 	return (unsigned long)bus_to_virt((unsigned long)offset) - (unsigned long)dmabuf->rawbuf;
+ }
+@@ -639,9 +639,9 @@
+ 		if (val > 5400 && val < 48000)
+ 		{
+ 			if (file->f_mode & FMODE_WRITE)
+-				AD1889_WRITEW(ad1889_dev, AD_DSWAS, val);
++				AD1889_WRITEW(ad1889_dev, AD_DS_WAS, val);
+ 			if (file->f_mode & FMODE_READ)
+-				AD1889_WRITEW(ad1889_dev, AD_DSRES, val);
++				AD1889_WRITEW(ad1889_dev, AD_DS_RES, val);
+ 		}
+ 		return 0;
+ 
+@@ -649,22 +649,22 @@
+ 		if (get_user(val, p))
+ 			return -EFAULT;
+ 		if (file->f_mode & FMODE_READ) {
+-			val = AD1889_READW(ad1889_dev, AD_DSWSMC);
++			val = AD1889_READW(ad1889_dev, AD_DS_WSMC);
+ 			if (val) {
+ 				val |= 0x0200;  /* set WAST */
+ 			} else {
+ 				val &= ~0x0200; /* clear WAST */
+ 			}
+-			AD1889_WRITEW(ad1889_dev, AD_DSWSMC, val);
++			AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, val);
+ 		}
+ 		if (file->f_mode & FMODE_WRITE) {
+-			val = AD1889_READW(ad1889_dev, AD_DSRAMC);
++			val = AD1889_READW(ad1889_dev, AD_DS_RAMC);
+ 			if (val) {
+ 				val |= 0x0002;  /* set ADST */
+ 			} else {
+ 				val &= ~0x0002; /* clear ADST */
+ 			}
+-			AD1889_WRITEW(ad1889_dev, AD_DSRAMC, val);
++			AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, val);
+ 		}
+ 
+ 		return 0;
+@@ -739,7 +739,7 @@
+ 		break;
+ 
+ 	case SOUND_PCM_READ_RATE:
+-		return put_user(AD1889_READW(ad1889_dev, AD_DSWAS), p);
++		return put_user(AD1889_READW(ad1889_dev, AD_DS_WAS), p);
+ 
+ 	case SOUND_PCM_READ_CHANNELS:
+ 	case SOUND_PCM_READ_BITS:
+@@ -769,7 +769,7 @@
+ 
+ 	ad1889_set_wav_rate(ad1889_dev, 48000);
+ 	ad1889_set_wav_fmt(ad1889_dev, AFMT_S16_LE);
+-	AD1889_WRITEW(ad1889_dev, AD_DSWADA, 0x0404); /* attenuation */
++	AD1889_WRITEW(ad1889_dev, AD_DS_WADA, 0x0404); /* attenuation */
+ 	return nonseekable_open(inode, file);
+ }
+ 
+@@ -826,15 +826,15 @@
+ {
+ 	ad1889_dev_t *dev = ac97->private_data;
+ 
+-	//DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + 0x100 + reg);
+-	AD1889_WRITEW(dev, 0x100 + reg, val);
++	//DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + AD_AC97_BASE + reg);
++	AD1889_WRITEW(dev, AD_AC97_BASE + reg, val);
+ }
+ 
+ static u16 ad1889_codec_read(struct ac97_codec *ac97, u8 reg)
+ {
+ 	ad1889_dev_t *dev = ac97->private_data;
+-	//DBG("Reading from 0x%lx\n", dev->regbase + 0x100 + reg);
+-	return AD1889_READW(dev, 0x100 + reg);
++	//DBG("Reading from 0x%lx\n", dev->regbase + AD_AC97_BASE + reg);
++	return AD1889_READW(dev, AD_AC97_BASE + reg);
+ }	
+ 
+ static int ad1889_ac97_init(ad1889_dev_t *dev, int id)
+@@ -883,24 +883,24 @@
+ 	int retry = 200;
+ 	ad1889_dev_t *dev = pci_get_drvdata(pcidev);
+ 
+-	AD1889_WRITEW(dev, AD_DSCCS, 0x8000); /* turn on clock */
+-	AD1889_READW(dev, AD_DSCCS); 
++	AD1889_WRITEW(dev, AD_DS_CCS, 0x8000); /* turn on clock */
++	AD1889_READW(dev, AD_DS_CCS); 
+ 
+ 	WAIT_10MS();
+ 
+-	stat = AD1889_READW(dev, AD_ACIC);
++	stat = AD1889_READW(dev, AD_AC97_ACIC);
+ 	stat |= 0x0002;				/* Reset Disable */
+-	AD1889_WRITEW(dev, AD_ACIC, stat);
+-	(void) AD1889_READW(dev, AD_ACIC);	/* flush posted write */
++	AD1889_WRITEW(dev, AD_AC97_ACIC, stat);
++	(void) AD1889_READW(dev, AD_AC97_ACIC);	/* flush posted write */
+ 
+ 	udelay(10);
+ 
+-	stat = AD1889_READW(dev, AD_ACIC);
++	stat = AD1889_READW(dev, AD_AC97_ACIC);
+ 	stat |= 0x0001;				/* Interface Enable */
+-	AD1889_WRITEW(dev, AD_ACIC, stat);
++	AD1889_WRITEW(dev, AD_AC97_ACIC, stat);
+ 
+ 	do {
+-		if (AD1889_READW(dev, AD_ACIC) & 0x8000)	/* Ready */
++		if (AD1889_READW(dev, AD_AC97_ACIC) & 0x8000)	/* Ready */
+ 			break;
+ 		WAIT_10MS();
+ 		retry--;
+@@ -908,16 +908,16 @@
+ 
+ 	if (!retry) {
+ 		printk(KERN_ERR "ad1889_aclink_reset: codec is not ready [0x%x]\n",
+-			    AD1889_READW(dev, AD_ACIC));
++			    AD1889_READW(dev, AD_AC97_ACIC));
+ 		return -EBUSY;
+ 	}
+ 
+ 	/* TODO reset AC97 codec */
+ 	/* TODO set wave/adc pci ctrl status */
+ 
+-	stat = AD1889_READW(dev, AD_ACIC);
++	stat = AD1889_READW(dev, AD_AC97_ACIC);
+ 	stat |= 0x0004;				/* Audio Stream Output Enable */
+-	AD1889_WRITEW(dev, AD_ACIC, stat);
++	AD1889_WRITEW(dev, AD_AC97_ACIC, stat);
+ 	return 0;
+ }
+ 
+@@ -935,10 +935,10 @@
+ 	u32 stat;
+ 	ad1889_dev_t *dev = (ad1889_dev_t *)dev_id;
+ 
+-	stat = AD1889_READL(dev, AD_DMADISR);
++	stat = AD1889_READL(dev, AD_DMA_DISR);
+ 
+ 	/* clear ISR */
+-	AD1889_WRITEL(dev, AD_DMADISR, stat);
++	AD1889_WRITEL(dev, AD_DMA_DISR, stat);
+ 
+ 	if (stat & 0x8) {		/* WAVI */
+ 		DBG("WAV interrupt\n");
+@@ -964,15 +964,15 @@
+ 	u32 tmp32;
+ 
+ 	/* make sure the interrupt bits are setup the way we want */
+-	tmp32 = AD1889_READL(dev, AD_DMAWAVCTRL);
++	tmp32 = AD1889_READL(dev, AD_DMA_WAVCTRL);
+ 	tmp32 &= ~0xff; /* flat dma, no sg, mask out the intr bits */
+ 	tmp32 |= 0x6;  /* intr on count, loop */
+-	AD1889_WRITEL(dev, AD_DMAWAVCTRL, tmp32);
++	AD1889_WRITEL(dev, AD_DMA_WAVCTRL, tmp32);
+ 
+ 	/* unmute... */
+-	tmp16 = AD1889_READW(dev, AD_DSWADA);
++	tmp16 = AD1889_READW(dev, AD_DS_WADA);
+ 	tmp16 &= ~0x8080;
+-	AD1889_WRITEW(dev, AD_DSWADA, tmp16);
++	AD1889_WRITEW(dev, AD_DS_WADA, tmp16);
+ }
+ 
+ static int __devinit ad1889_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
+@@ -1005,7 +1005,7 @@
+ 		goto out1;
+ 	}
+ 
+-	dev->regbase = ioremap_nocache(bar, AD_DSIOMEMSIZE);
++	dev->regbase = ioremap_nocache(bar, AD_DS_IOMEMSIZE);
+ 	if (!dev->regbase) {
+ 		printk(KERN_ERR DEVNAME ": unable to remap iomem\n");
+ 		goto out2;
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/oss/ad1889.h CVS2_6_11_PA2/sound/oss/ad1889.h
+--- LINUS_2_6_11/sound/oss/ad1889.h	2005-03-02 04:19:28.000000000 -0700
++++ CVS2_6_11_PA2/sound/oss/ad1889.h	2005-03-01 16:00:56.000000000 -0700
+@@ -1,57 +1,58 @@
+ #ifndef _AD1889_H_
+ #define _AD1889_H_
+ 
+-#define AD_DSWSMC	0x00	/* DMA input wave/syn mixer control */
+-#define AD_DSRAMC	0x02	/* DMA output resamp/ADC mixer control */
+-#define AD_DSWADA	0x04	/* DMA input wave attenuation */
+-#define AD_DSSYDA	0x06	/* DMA input syn attentuation */
+-#define AD_DSWAS	0x08	/* wave input sample rate */
+-#define AD_DSRES	0x0a	/* resampler output sample rate */
+-#define AD_DSCCS	0x0c	/* chip control/status */
+-
+-#define AD_DMARESBA	0x40	/* RES base addr */
+-#define AD_DMARESCA	0x44	/* RES current addr */
+-#define AD_DMARESBC	0x48	/* RES base cnt */
+-#define AD_DMARESCC	0x4c	/* RES current count */
+-#define AD_DMAADCBA	0x50	/* ADC */
+-#define AD_DMAADCCA	0x54
+-#define AD_DMAADCBC	0x58
+-#define AD_DMAADCCC	0x5c
+-#define AD_DMASYNBA	0x60	/* SYN */
+-#define AD_DMASYNCA	0x64
+-#define AD_DMASYNBC	0x68
+-#define AD_DMASYNCC	0x6c
+-#define AD_DMAWAVBA	0x70	/* WAV */
+-#define AD_DMAWAVCA	0x74
+-#define AD_DMAWAVBC	0x78
+-#define AD_DMAWAVCC	0x7c
+-#define AD_DMARESICC	0x80	/* RES interrupt current count */
+-#define AD_DMARESIBC	0x84	/* RES interrupt base count */
+-#define AD_DMAADCICC	0x88	/* ADC interrupt current count */
+-#define AD_DMAADCIBC	0x8c	/* ADC interrupt base count */
+-#define AD_DMASYNICC	0x90	/* SYN interrupt current count */
+-#define AD_DMASYNIBC	0x94	/* SYN interrupt base count */
+-#define AD_DMAWAVICC	0x98	/* WAV interrupt current count */
+-#define AD_DMAWAVIBC	0x9c	/* WAV interrupt base count */
+-#define AD_DMARESCTRL	0xa0	/* RES PCI control/status */
+-#define AD_DMAADCCTRL	0xa8	/* ADC PCI control/status */
+-#define AD_DMASYNCTRL	0xb0	/* SYN PCI control/status */
+-#define AD_DMAWAVCTRL	0xb8	/* WAV PCI control/status */
+-#define AD_DMADISR	0xc0	/* PCI DMA intr status */
+-#define AD_DMACHSS	0xc4	/* PCI DMA channel stop status */
+-
+-#define AD_GPIOIPC	0xc8	/* IO port ctrl */
+-#define AD_GPIOOP	0xca	/* IO output status */
+-#define AD_GPIOIP	0xcc	/* IO input status */
++#define AD_DS_WSMC	0x00	/* DMA input wave/syn mixer control */
++#define AD_DS_RAMC	0x02	/* DMA output resamp/ADC mixer control */
++#define AD_DS_WADA	0x04	/* DMA input wave attenuation */
++#define AD_DS_SYDA	0x06	/* DMA input syn attentuation */
++#define AD_DS_WAS	0x08	/* wave input sample rate */
++#define AD_DS_RES	0x0a	/* resampler output sample rate */
++#define AD_DS_CCS	0x0c	/* chip control/status */
++
++#define AD_DMA_RESBA	0x40	/* RES base addr */
++#define AD_DMA_RESCA	0x44	/* RES current addr */
++#define AD_DMA_RESBC	0x48	/* RES base cnt */
++#define AD_DMA_RESCC	0x4c	/* RES current count */
++#define AD_DMA_ADCBA	0x50	/* ADC */
++#define AD_DMA_ADCCA	0x54
++#define AD_DMA_ADCBC	0x58
++#define AD_DMA_ADCCC	0x5c
++#define AD_DMA_SYNBA	0x60	/* SYN */
++#define AD_DMA_SYNCA	0x64
++#define AD_DMA_SYNBC	0x68
++#define AD_DMA_SYNCC	0x6c
++#define AD_DMA_WAVBA	0x70	/* WAV */
++#define AD_DMA_WAVCA	0x74
++#define AD_DMA_WAVBC	0x78
++#define AD_DMA_WAVCC	0x7c
++#define AD_DMA_RESICC	0x80	/* RES interrupt current count */
++#define AD_DMA_RESIBC	0x84	/* RES interrupt base count */
++#define AD_DMA_ADCICC	0x88	/* ADC interrupt current count */
++#define AD_DMA_ADCIBC	0x8c	/* ADC interrupt base count */
++#define AD_DMA_SYNICC	0x90	/* SYN interrupt current count */
++#define AD_DMA_SYNIBC	0x94	/* SYN interrupt base count */
++#define AD_DMA_WAVICC	0x98	/* WAV interrupt current count */
++#define AD_DMA_WAVIBC	0x9c	/* WAV interrupt base count */
++#define AD_DMA_RESCTRL	0xa0	/* RES PCI control/status */
++#define AD_DMA_ADCCTRL	0xa8	/* ADC PCI control/status */
++#define AD_DMA_SYNCTRL	0xb0	/* SYN PCI control/status */
++#define AD_DMA_WAVCTRL	0xb8	/* WAV PCI control/status */
++#define AD_DMA_DISR	0xc0	/* PCI DMA intr status */
++#define AD_DMA_CHSS	0xc4	/* PCI DMA channel stop status */
++
++#define AD_GPIO_IPC	0xc8	/* IO port ctrl */
++#define AD_GPIO_OP	0xca	/* IO output status */
++#define AD_GPIO_IP	0xcc	/* IO input status */
+ 
+ /* AC97 registers, 0x100 - 0x17f; see ac97.h */
+-#define AD_ACIC		0x180	/* AC Link interface ctrl */
++#define AD_AC97_BASE    0x100   /* ac97 base register */
++#define AD_AC97_ACIC	0x180	/* AC Link interface ctrl */
+ 
+ /* OPL3; BAR1 */
+-#define AD_OPLM0AS	0x00	/* Music0 address/status */
+-#define AD_OPLM0DATA	0x01	/* Music0 data */
+-#define AD_OPLM1A	0x02	/* Music1 address */
+-#define AD_OPLM1DATA	0x03	/* Music1 data */
++#define AD_OPL_M0AS	0x00	/* Music0 address/status */
++#define AD_OPL_M0DATA	0x01	/* Music0 data */
++#define AD_OPL_M1A	0x02	/* Music1 address */
++#define AD_OPL_M1DATA	0x03	/* Music1 data */
+ /* 0x04-0x0f reserved */
+ 
+ /* MIDI; BAR2 */
+@@ -59,9 +60,9 @@
+ #define AD_MISC		0x01	/* MIDI status/cmd */
+ /* 0x02-0xff reserved */
+ 
+-#define AD_DSIOMEMSIZE	512
+-#define AD_OPLMEMSIZE	16
+-#define AD_MIDIMEMSIZE	16
++#define AD_DS_IOMEMSIZE	512
++#define AD_OPL_MEMSIZE	16
++#define AD_MIDI_MEMSIZE	16
+ 
+ #define AD_WAV_STATE	0
+ #define AD_ADC_STATE	1
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/oss/harmony.c CVS2_6_11_PA2/sound/oss/harmony.c
+--- LINUS_2_6_11/sound/oss/harmony.c	2005-03-02 04:19:28.000000000 -0700
++++ CVS2_6_11_PA2/sound/oss/harmony.c	2005-02-28 19:08:15.000000000 -0700
+@@ -310,7 +310,7 @@
+ 	case 32000:	newrate = HARMONY_SR_32KHZ;	break; 
+ 	case 48000:	newrate = HARMONY_SR_48KHZ;	break; 
+ 	case 9600:	newrate = HARMONY_SR_9KHZ;	break; 
+-	case 5125:	newrate = HARMONY_SR_5KHZ;	break; 
++	case 5512:	newrate = HARMONY_SR_5KHZ;	break; 
+ 	case 11025:	newrate = HARMONY_SR_11KHZ;	break; 
+ 	case 18900:	newrate = HARMONY_SR_18KHZ;	break; 
+ 	case 22050:	newrate = HARMONY_SR_22KHZ;	break; 
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/parisc/Kconfig CVS2_6_11_PA2/sound/parisc/Kconfig
+--- LINUS_2_6_11/sound/parisc/Kconfig	2005-03-02 04:19:29.000000000 -0700
++++ CVS2_6_11_PA2/sound/parisc/Kconfig	2004-12-13 00:19:10.000000000 -0700
+@@ -1,6 +1,6 @@
+ # ALSA PA-RISC drivers
+ 
+-menu "ALSA GSC devices"
++menu "GSC devices"
+ 	depends on SND!=n && GSC
+ 
+ config SND_HARMONY
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/parisc/harmony.c CVS2_6_11_PA2/sound/parisc/harmony.c
+--- LINUS_2_6_11/sound/parisc/harmony.c	2005-03-02 04:19:29.000000000 -0700
++++ CVS2_6_11_PA2/sound/parisc/harmony.c	2005-03-01 08:28:41.000000000 -0700
+@@ -1,264 +1,88 @@
+-/*
+- *  Harmony chipset driver
++/* Hewlett-Packard Harmony audio driver
+  *
+- *	This is a sound driver for ASP's and Lasi's Harmony sound chip
+- *	and is unlikely to be used for anything other than on a HP PA-RISC.
++ *   This is a driver for the Harmony audio chipset found
++ *   on the LASI ASIC of various early HP PA-RISC workstations.
+  *
+- *	Harmony is found in HP 712s, 715/new and many other GSC based machines.
+- *	On older 715 machines you'll find the technically identical chip 
+- *	called 'Vivace'. Both Harmony and Vivace are supported by this driver.
++ *   Copyright (C) 2004, Kyle McMartin <kyle@{debian.org,parisc-linux.org}>
+  *
+- *  this ALSA driver is based on OSS driver by:
+- *	Copyright 2000 (c) Linuxcare Canada, Alex deVries <alex at linuxcare.com>
+- *	Copyright 2000-2002 (c) Helge Deller <deller at gmx.de>
+- *	Copyright 2001 (c) Matthieu Delahaye <delahaym at esiee.fr>
++ *     Based on the previous Harmony incarnations by,
++ *       Copyright 2000 (c) Linuxcare Canada, Alex deVries
++ *       Copyright 2000-2003 (c) Helge Deller
++ *       Copyright 2001 (c) Matthieu Delahaye
++ *       Copyright 2001 (c) Jean-Christophe Vaugeois
++ *       Copyright 2003 (c) Laurent Canet
++ *       Copyright 2004 (c) Stuart Brady
+  *
+- * TODO:
+- * - use generic DMA interface and ioremap()/iounmap()
+- * - capture is still untested (and probaby non-working)
+- * - spin locks
+- * - implement non-consistent DMA pages
+- * - implement gain meter
+- * - module parameters
+- * - correct cleaning sequence
+- * - better error checking
+- * - try to have a better quality.
+- *   
+- */
+-
+-/*
+- * Harmony chipset 'modus operandi'.
+- * - This chipset is found in some HP 32bit workstations, like 712, or B132 class.
+- * most of controls are done through registers. Register are found at a fixed offset
+- * from the hard physical adress, given in struct dev by register_parisc_driver.
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License, version 2, as
++ *   published by the Free Software Foundation.
+  *
+- * Playback and recording use 4kb pages (dma or not, depending on the machine).
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
+  *
+- * Most of PCM playback & capture is done through interrupt. When harmony needs
+- * a new buffer to put recorded data or read played PCM, it sends an interrupt.
+- * Bits 2 and 10 of DSTATUS register are '1' when harmony needs respectively
+- * a new page for recording and playing. 
+- * Interrupt are disabled/enabled by writing to bit 32 of DSTATUS. 
+- * Adresses of next page to be played is put in PNXTADD register, next page
+- * to be recorded is put in RNXTADD. There is 2 read-only registers, PCURADD and 
+- * RCURADD that provides adress of current page.
+- * 
+- * Harmony has no way to control full duplex or half duplex mode. It means
+- * that we always need to provide adresses of playback and capture data, even
+- * when this is not needed. That's why we statically alloc one graveyard
+- * buffer (to put recorded data in play-only mode) and a silence buffer.
+- * 
+- * Bitrate, number of channels and data format are controlled with
+- * the CNTL register.
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  *
+- * Mixer work is done through one register (GAINCTL). Only input gain,
+- * output attenuation and general attenuation control is provided. There is
+- * also controls for enabling/disabling internal speaker and line
+- * input.
++ * Notes:
++ *   - graveyard and silence buffers last for lifetime of
++ *     the driver. playback and capture buffers are allocated
++ *     per _open()/_close().
++ * 
++ * TODO:
+  *
+- * Buffers used by this driver are all DMA consistent.
+  */
+ 
+-#include <linux/delay.h>
+-#include <sound/driver.h>
+ #include <linux/init.h>
+-#include <linux/interrupt.h>
+ #include <linux/slab.h>
+ #include <linux/time.h>
+ #include <linux/wait.h>
+-#include <linux/moduleparam.h>
++#include <linux/delay.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/spinlock.h>
++#include <linux/dma-mapping.h>
++
++#include <sound/driver.h>
+ #include <sound/core.h>
+-#include <sound/control.h>
+ #include <sound/pcm.h>
++#include <sound/control.h>
+ #include <sound/rawmidi.h>
+ #include <sound/initval.h>
+ #include <sound/info.h>
+-#include <asm/hardware.h>
++
+ #include <asm/io.h>
++#include <asm/hardware.h>
+ #include <asm/parisc-device.h>
+ 
+-MODULE_AUTHOR("Laurent Canet <canetl at esiee.fr>");
+-MODULE_DESCRIPTION("ALSA Harmony sound driver");
+-MODULE_LICENSE("GPL");
+-MODULE_SUPPORTED_DEVICE("{{ALSA,Harmony soundcard}}");
+-
+-#undef DEBUG
+-#ifdef DEBUG
+-# define DPRINTK printk 
+-#else
+-# define DPRINTK(x,...)
+-#endif
+-
+-#define PFX	"harmony: "
+-
+-#define MAX_PCM_DEVICES		1
+-#define MAX_PCM_SUBSTREAMS	4
+-#define MAX_MIDI_DEVICES	0
+-
+-#define HARMONY_BUF_SIZE	4096
+-#define MAX_BUFS		10
+-#define MAX_BUFFER_SIZE		(MAX_BUFS * HARMONY_BUF_SIZE)
+-
+-/* number of silence & graveyard buffers */
+-#define GRAVEYARD_BUFS		3
+-#define SILENCE_BUFS		3
+-
+-#define HARMONY_CNTL_C		0x80000000
+-
+-#define HARMONY_DSTATUS_PN	0x00000200
+-#define HARMONY_DSTATUS_RN	0x00000002
+-#define HARMONY_DSTATUS_IE	0x80000000
+-
+-#define HARMONY_DF_16BIT_LINEAR	0x00000000
+-#define HARMONY_DF_8BIT_ULAW	0x00000001
+-#define HARMONY_DF_8BIT_ALAW	0x00000002
+-
+-#define HARMONY_SS_MONO		0x00000000
+-#define HARMONY_SS_STEREO	0x00000001
+-
+-/*
+- * Channels Mask in mixer register
+- * try some "reasonable" default gain values
+- */
+-
+-#define HARMONY_GAIN_TOTAL_SILENCE 0x00F00FFF
+-
+-/* the following should be enough (mixer is 
+- * very sensible on harmony)
+- */
+-#define HARMONY_GAIN_DEFAULT       0x0F2FF082
+-
+-
+-/* useless since only one card is supported ATM */
+-static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
+-static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
+-static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE;
+-
+-module_param_array(index, int, NULL, 0444);
+-MODULE_PARM_DESC(index, "Index value for Harmony device.");
+-module_param_array(id, charp, NULL, 0444);
+-MODULE_PARM_DESC(id, "ID string for Harmony device.");
+-module_param_array(enable, bool, NULL, 0444);
+-MODULE_PARM_DESC(enable, "Enable Harmony device.");
+-
+-/* Register offset (from base hpa) */
+-#define REG_ID		0x00
+-#define REG_RESET	0x04
+-#define REG_CNTL	0x08
+-#define REG_GAINCTL	0x0C
+-#define REG_PNXTADD	0x10
+-#define REG_PCURADD	0x14
+-#define REG_RNXTADD	0x18
+-#define REG_RCURADD	0x1C
+-#define REG_DSTATUS	0x20
+-#define REG_OV		0x24
+-#define REG_PIO		0x28
+-#define REG_DIAG	0x3C
+-
+-/*
+- * main harmony structure
+- */
+-
+-typedef struct snd_card_harmony {
+-
+-	/* spinlocks (To be done) */
+-	spinlock_t mixer_lock;
+-	spinlock_t control_lock;
+-
+-	/* parameters */	
+-	int irq;
+-	unsigned long hpa;
+-	int id;
+-	int rev;
+-	
+-	u32 current_gain;
+-	int data_format;		/* HARMONY_DF_xx_BIT_xxx */
+-	int sample_rate;		/* HARMONY_SR_xx_KHZ */
+-	int stereo_select;	/* HARMONY_SS_MONO or HARMONY_SS_STEREO */
+-	int format_initialized;
+-	
+-	unsigned long ply_buffer;
+-	int ply_buf;
+-	int ply_count;
+-	int ply_size;
+-	int ply_stopped;
+-	int ply_total;
+-	
+-	unsigned long cap_buffer;
+-	int cap_buf;
+-	int cap_count;
+-	int cap_size;
+-	int cap_stopped;
+-	int cap_total;
+-
+-	struct parisc_device *pa_dev;
+-
+-	struct snd_dma_device dma_dev;
+-
+-	/* the graveyard buffer is used as recording buffer when playback, 
+-	 * because harmony always want a buffer to put recorded data */
+-	struct snd_dma_buffer graveyard_dma;
+-	int graveyard_count;
+-	
+-	/* same thing for silence buffer */
+-	struct snd_dma_buffer silence_dma;
+-	int silence_count;
+-
+-	/* alsa stuff */
+-	snd_card_t *card;
+-	snd_pcm_t *pcm;
+-	snd_pcm_substream_t *playback_substream;
+-	snd_pcm_substream_t *capture_substream;
+-	snd_info_entry_t *proc_entry;
+-} snd_card_harmony_t;
++#include "harmony.h"
+ 
+-static snd_card_t *snd_harmony_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
++static struct parisc_device_id snd_harmony_devtable[] = {
++	/* bushmaster / flounder */
++	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007A }, 
++	/* 712 / 715 */
++	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007B }, 
++	/* pace */
++	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007E }, 
++	/* outfield / coral II */
++	{ HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007F },
++	{ 0, }
++};
+ 
+-/* wait to be out of control mode */
+-static inline void snd_harmony_wait_cntl(snd_card_harmony_t *harmony)
+-{
+-	int timeout = 5000;
++MODULE_DEVICE_TABLE(parisc, snd_harmony_devtable);
+ 
+-	while ( (gsc_readl(harmony->hpa+REG_CNTL) & HARMONY_CNTL_C) && --timeout)
+-	{
+-		/* Wait */ ;	
+-	}
+-	if (timeout == 0) DPRINTK(KERN_DEBUG PFX "Error: wait cntl timeouted\n");
+-}
++#define NAME "harmony"
++#define PFX  NAME ": "
+ 
+-
+-/*
+- * sample rate routines 
+- */
+-static unsigned int snd_card_harmony_rates[] = {
+-	5125, 6615, 8000, 9600,
++static unsigned int snd_harmony_rates[] = {
++	5512, 6615, 8000, 9600,
+ 	11025, 16000, 18900, 22050,
+ 	27428, 32000, 33075, 37800,
+ 	44100, 48000
+ };
+ 
+-static snd_pcm_hw_constraint_list_t hw_constraint_rates = {
+-	.count = ARRAY_SIZE(snd_card_harmony_rates),
+-	.list = snd_card_harmony_rates,
+-	.mask = 0,
+-};
+-
+-#define HARMONY_SR_8KHZ		0x08
+-#define HARMONY_SR_16KHZ	0x09
+-#define HARMONY_SR_27KHZ	0x0A
+-#define HARMONY_SR_32KHZ	0x0B
+-#define HARMONY_SR_48KHZ	0x0E
+-#define HARMONY_SR_9KHZ		0x0F
+-#define HARMONY_SR_5KHZ		0x10
+-#define HARMONY_SR_11KHZ	0x11
+-#define HARMONY_SR_18KHZ	0x12
+-#define HARMONY_SR_22KHZ	0x13
+-#define HARMONY_SR_37KHZ	0x14
+-#define HARMONY_SR_44KHZ	0x15
+-#define HARMONY_SR_33KHZ	0x16
+-#define HARMONY_SR_6KHZ		0x17
+-
+-/* bits corresponding to the entries of snd_card_harmony_rates */
+ static unsigned int rate_bits[14] = {
+ 	HARMONY_SR_5KHZ, HARMONY_SR_6KHZ, HARMONY_SR_8KHZ,
+ 	HARMONY_SR_9KHZ, HARMONY_SR_11KHZ, HARMONY_SR_16KHZ,
+@@ -267,642 +91,624 @@
+ 	HARMONY_SR_44KHZ, HARMONY_SR_48KHZ
+ };
+ 
+-/* snd_card_harmony_rate_bits
+- * @rate:	index of current data rate in list
+- * returns: harmony hex code for registers
+- */
+-static unsigned int snd_card_harmony_rate_bits(int rate)
++static snd_pcm_hw_constraint_list_t hw_constraint_rates = {
++	.count = ARRAY_SIZE(snd_harmony_rates),
++	.list = snd_harmony_rates,
++	.mask = 0,
++};
++
++inline unsigned long
++harmony_read(harmony_t *h, unsigned r)
+ {
+-	unsigned int idx;
+-	
+-	for (idx = 0; idx < ARRAY_SIZE(snd_card_harmony_rates); idx++)
+-		if (snd_card_harmony_rates[idx] == rate)
+-			return rate_bits[idx];
+-	return HARMONY_SR_44KHZ; /* fallback */
++	return __raw_readl(h->iobase + r);
+ }
+ 
+-/*
+- * update controls (data format, sample rate, number of channels)
+- * according to value supplied in data structure
+- */
+-void snd_harmony_update_control(snd_card_harmony_t *harmony) 
++inline void
++harmony_write(harmony_t *h, unsigned r, unsigned long v)
+ {
+-	u32 default_cntl;
+-	
+-	/* Set CNTL */
+-	default_cntl = (HARMONY_CNTL_C |  	/* The C bit */
+-		(harmony->data_format << 6) |	/* Set the data format */
+-		(harmony->stereo_select << 5) |	/* Stereo select */
+-		(harmony->sample_rate));		/* Set sample rate */
+-	
+-	/* initialize CNTL */
+- 	snd_harmony_wait_cntl(harmony);
+-	
+-	gsc_writel(default_cntl, harmony->hpa+REG_CNTL);
+-	
++	__raw_writel(v, h->iobase + r);
+ }
+ 
+-/*
+- * interruption controls routines
+- */
++static void
++harmony_wait_for_control(harmony_t *h)
++{
++	while (harmony_read(h, HARMONY_CNTL) & HARMONY_CNTL_C) ;
++}
+ 
+-static void snd_harmony_disable_interrupts(snd_card_harmony_t *chip) 
++inline void
++harmony_reset(harmony_t *h)
+ {
+- 	snd_harmony_wait_cntl(chip);
+-	gsc_writel(0, chip->hpa+REG_DSTATUS); 
++	harmony_write(h, HARMONY_RESET, 1);
++	mdelay(50);
++	harmony_write(h, HARMONY_RESET, 0);
+ }
+ 
+-static void snd_harmony_enable_interrupts(snd_card_harmony_t *chip) 
++static void
++harmony_disable_interrupts(harmony_t *h)
+ {
+- 	snd_harmony_wait_cntl(chip);
+-	gsc_writel(HARMONY_DSTATUS_IE, chip->hpa+REG_DSTATUS); 
++	u32 dstatus;
++	harmony_wait_for_control(h);
++	dstatus = harmony_read(h, HARMONY_DSTATUS);
++	dstatus &= ~HARMONY_DSTATUS_IE;
++	harmony_write(h, HARMONY_DSTATUS, dstatus);
+ }
+ 
+-/*
+- * interruption routine:
+- * The interrupt routine must provide adresse of next physical pages 
+- * used by harmony
+- */
+-static int snd_card_harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
++static void
++harmony_enable_interrupts(harmony_t *h)
+ {
+-	snd_card_harmony_t *harmony = (snd_card_harmony_t *)dev;
+-	u32 dstatus = 0;
+-	unsigned long hpa = harmony->hpa;
+-	
+-	/* Turn off interrupts */
+-	snd_harmony_disable_interrupts(harmony);
+-	
+-	/* wait for control to free */
+- 	snd_harmony_wait_cntl(harmony);
+-	
+-	/* Read dstatus and pcuradd (the current address) */
+-	dstatus = gsc_readl(hpa+REG_DSTATUS);
+-	
+-	/* Check if this is a request to get the next play buffer */
++	u32 dstatus;
++	harmony_wait_for_control(h);
++	dstatus = harmony_read(h, HARMONY_DSTATUS);
++	dstatus |= HARMONY_DSTATUS_IE;
++	harmony_write(h, HARMONY_DSTATUS, dstatus);
++}
++
++static void
++harmony_mute(harmony_t *h)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&h->mixer_lock, flags);
++	harmony_wait_for_control(h);
++	harmony_write(h, HARMONY_GAINCTL, HARMONY_GAIN_SILENCE);
++	spin_unlock_irqrestore(&h->mixer_lock, flags);
++}
++
++static void
++harmony_unmute(harmony_t *h)
++{
++	unsigned long flags;
++
++	spin_lock_irqsave(&h->mixer_lock, flags);
++	harmony_wait_for_control(h);
++	harmony_write(h, HARMONY_GAINCTL, h->st.gain);
++	spin_unlock_irqrestore(&h->mixer_lock, flags);
++}
++
++static void
++harmony_set_control(harmony_t *h)
++{
++	u32 ctrl;
++	unsigned long flags;
++
++	spin_lock_irqsave(&h->lock, flags);
++
++	ctrl = (HARMONY_CNTL_C      |
++		(h->st.format << 6) |
++		(h->st.stereo << 5) |
++		(h->st.rate));
++
++	harmony_wait_for_control(h);
++	harmony_write(h, HARMONY_CNTL, ctrl);
++
++	spin_unlock_irqrestore(&h->lock, flags);
++}
++
++static irqreturn_t
++snd_harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
++{
++	u32 dstatus;
++	harmony_t *h = dev;
++
++	spin_lock(&h->lock);
++	harmony_disable_interrupts(h);
++	harmony_wait_for_control(h);
++	dstatus = harmony_read(h, HARMONY_DSTATUS);
++	spin_unlock(&h->lock);
++
+ 	if (dstatus & HARMONY_DSTATUS_PN) {
+-		if (harmony->playback_substream) {
+-			harmony->ply_buf += harmony->ply_count;
+-			harmony->ply_buf %= harmony->ply_size;
+-		
+-			gsc_writel(harmony->ply_buffer + harmony->ply_buf,
+-					hpa+REG_PNXTADD);
+-		
+-			snd_pcm_period_elapsed(harmony->playback_substream);
+-			harmony->ply_total++;
++		if (h->psubs) {
++			spin_lock(&h->lock);
++			h->pbuf.buf += h->pbuf.count; /* PAGE_SIZE */
++			h->pbuf.buf %= h->pbuf.size; /* MAX_BUFS*PAGE_SIZE */
++
++			harmony_write(h, HARMONY_PNXTADD, 
++				      h->pbuf.addr + h->pbuf.buf);
++			h->stats.play_intr++;
++			spin_unlock(&h->lock);
++                        snd_pcm_period_elapsed(h->psubs);
+ 		} else {
+-			gsc_writel(harmony->silence_dma.addr + 
+-				   (HARMONY_BUF_SIZE*harmony->silence_count),
+-				   hpa+REG_PNXTADD);
+-			harmony->silence_count++;
+-			harmony->silence_count %= SILENCE_BUFS;
++			spin_lock(&h->lock);
++			harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);
++			h->stats.silence_intr++;
++			spin_unlock(&h->lock);
+ 		}
+ 	}
+-	
+-	/* Check if we're being asked to fill in a recording buffer */
++
+ 	if (dstatus & HARMONY_DSTATUS_RN) {
+-		if (harmony->capture_substream) {
+-			harmony->cap_buf += harmony->cap_count;
+-			harmony->cap_buf %= harmony->cap_size;
+-		
+-			gsc_writel(harmony->cap_buffer + harmony->cap_buf,
+-					hpa+REG_RNXTADD);
+-		
+-			snd_pcm_period_elapsed(harmony->capture_substream);
+-			harmony->cap_total++;
++		if (h->csubs) {
++			spin_lock(&h->lock);
++			h->cbuf.buf += h->cbuf.count;
++			h->cbuf.buf %= h->cbuf.size;
++
++			harmony_write(h, HARMONY_RNXTADD,
++				      h->cbuf.addr + h->cbuf.buf);
++			h->stats.rec_intr++;
++			spin_unlock(&h->lock);
++                        snd_pcm_period_elapsed(h->csubs);
+ 		} else {
+-			/* graveyard buffer */
+-			gsc_writel(harmony->graveyard_dma.addr +
+-				   (HARMONY_BUF_SIZE*harmony->graveyard_count),
+-				   hpa+REG_RNXTADD);
+-			harmony->graveyard_count++;
+-			harmony->graveyard_count %= GRAVEYARD_BUFS;
++			spin_lock(&h->lock);
++			harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);
++			h->stats.graveyard_intr++;
++			spin_unlock(&h->lock);
+ 		}
+ 	}
+-	snd_harmony_enable_interrupts(harmony);
++
++	spin_lock(&h->lock);
++	harmony_enable_interrupts(h);
++	spin_unlock(&h->lock);
+ 
+ 	return IRQ_HANDLED;
+ }
+ 
+-/* 
+- * proc entry
+- * this proc file will give some debugging info
+- */
+-
+-static void snd_harmony_proc_read(snd_info_entry_t *entry, snd_info_buffer_t *buffer)
++static unsigned int 
++snd_harmony_rate_bits(int rate)
+ {
+-	snd_card_harmony_t *harmony = (snd_card_harmony_t *)entry->private_data;
+-
+-	snd_iprintf(buffer, "LASI Harmony driver\nLaurent Canet <canetl at esiee.fr>\n\n");
+-	snd_iprintf(buffer, "IRQ %d, hpa %lx, id %d rev %d\n",
+-			harmony->irq, harmony->hpa,
+-			harmony->id, harmony->rev);
+-	snd_iprintf(buffer, "Current gain %lx\n", (unsigned long) harmony->current_gain);
+-	snd_iprintf(buffer, "\tsample rate=%d\n", harmony->sample_rate);
+-	snd_iprintf(buffer, "\tstereo select=%d\n", harmony->stereo_select);
+-	snd_iprintf(buffer, "\tbitperchan=%d\n\n", harmony->data_format);
+-	
+-	snd_iprintf(buffer, "Play status:\n");
+-	snd_iprintf(buffer, "\tstopped %d\n", harmony->ply_stopped);
+-	snd_iprintf(buffer, "\tbuffer %lx, count %d\n", harmony->ply_buffer, harmony->ply_count);
+-	snd_iprintf(buffer, "\tbuf %d size %d\n\n", harmony->ply_buf, harmony->ply_size);
+-	
+-	snd_iprintf(buffer, "Capture status:\n");
+-	snd_iprintf(buffer, "\tstopped %d\n", harmony->cap_stopped);
+-	snd_iprintf(buffer, "\tbuffer %lx, count %d\n", harmony->cap_buffer, harmony->cap_count);
+-	snd_iprintf(buffer, "\tbuf %d, size %d\n\n", harmony->cap_buf, harmony->cap_size);
+-
+-	snd_iprintf(buffer, "Funny stats: total played=%d, recorded=%d\n\n", harmony->ply_total, harmony->cap_total);
+-		
+-	snd_iprintf(buffer, "Register:\n");
+-	snd_iprintf(buffer, "\tgainctl: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_GAINCTL));
+-	snd_iprintf(buffer, "\tcntl: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_CNTL));
+-	snd_iprintf(buffer, "\tid: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_ID));
+-	snd_iprintf(buffer, "\tpcuradd: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_PCURADD));
+-	snd_iprintf(buffer, "\trcuradd: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_RCURADD));
+-	snd_iprintf(buffer, "\tpnxtadd: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_PNXTADD));
+-	snd_iprintf(buffer, "\trnxtadd: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_RNXTADD));
+-	snd_iprintf(buffer, "\tdstatus: %lx\n", (unsigned long) gsc_readl(harmony->hpa+REG_DSTATUS));
+-	snd_iprintf(buffer, "\tov: %lx\n\n", (unsigned long) gsc_readl(harmony->hpa+REG_OV));
++	unsigned int i;
+ 	
+-}
++	for (i = 0; i < ARRAY_SIZE(snd_harmony_rates); i++)
++		if (snd_harmony_rates[i] == rate)
++			return rate_bits[i];
++
++	return HARMONY_SR_44KHZ;
++}
++
++static snd_pcm_hardware_t snd_harmony_playback =
++{
++	.info =	(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 
++		 SNDRV_PCM_INFO_JOINT_DUPLEX | SNDRV_PCM_INFO_MMAP_VALID |
++		 SNDRV_PCM_INFO_BLOCK_TRANSFER),
++	.formats = (SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_MU_LAW |
++		    SNDRV_PCM_FMTBIT_A_LAW),
++	.rates = (SNDRV_PCM_RATE_5512 | SNDRV_PCM_RATE_8000_48000 |
++		  SNDRV_PCM_RATE_KNOT),
++	.rate_min = 5512,
++	.rate_max = 48000,
++	.channels_min =	1,
++	.channels_max =	2,
++	.buffer_bytes_max = MAX_BUF_SIZE,
++	.period_bytes_min = BUF_SIZE,
++	.period_bytes_max = BUF_SIZE,
++	.periods_min = 1,
++	.periods_max = MAX_BUFS,
++	.fifo_size = 0,
++};
+ 
+-static void __devinit snd_harmony_proc_init(snd_card_harmony_t *harmony)
++static snd_pcm_hardware_t snd_harmony_capture =
+ {
+-	snd_info_entry_t *entry;
+-	
+-	if (! snd_card_proc_new(harmony->card, "harmony", &entry))
+-		snd_info_set_text_ops(entry, harmony, 2048, snd_harmony_proc_read);
+-}
+-
+-/* 
+- * PCM Stuff
+- */
++        .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
++                 SNDRV_PCM_INFO_JOINT_DUPLEX | SNDRV_PCM_INFO_MMAP_VALID |
++                 SNDRV_PCM_INFO_BLOCK_TRANSFER),
++        .formats = (SNDRV_PCM_FMTBIT_S16_BE | SNDRV_PCM_FMTBIT_MU_LAW |
++                    SNDRV_PCM_FMTBIT_A_LAW),
++        .rates = (SNDRV_PCM_RATE_5512 | SNDRV_PCM_RATE_8000_48000 |
++		  SNDRV_PCM_RATE_KNOT),
++        .rate_min = 5512,
++        .rate_max = 48000,
++        .channels_min = 1,
++        .channels_max = 2,
++        .buffer_bytes_max = MAX_BUF_SIZE,
++        .period_bytes_min = BUF_SIZE,
++        .period_bytes_max = BUF_SIZE,
++        .periods_min = 1,
++        .periods_max = MAX_BUFS,
++        .fifo_size = 0,
++};
+ 
+-static int snd_card_harmony_playback_ioctl(snd_pcm_substream_t * substream,
+-				         unsigned int cmd,
+-				         void *arg)
++static int
++snd_harmony_playback_trigger(snd_pcm_substream_t *ss, int cmd)
+ {
+-	return snd_pcm_lib_ioctl(substream, cmd, arg);
+-}
++	harmony_t *h = snd_pcm_substream_chip(ss);
++	unsigned long flags;
+ 
+-static int snd_card_harmony_capture_ioctl(snd_pcm_substream_t * substream,
+-					unsigned int cmd,
+-					void *arg)
+-{
+-	return snd_pcm_lib_ioctl(substream, cmd, arg);
+-}
++	if (h->st.capturing)
++		return -EBUSY;
+ 
+-static int snd_card_harmony_playback_trigger(snd_pcm_substream_t * substream,
+-					   int cmd)
+-{
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	
++	spin_lock_irqsave(&h->lock, flags);
+ 	switch (cmd) {
+-		case SNDRV_PCM_TRIGGER_STOP:
+-			if (harmony->ply_stopped) 
+-				return -EBUSY;
+-			harmony->ply_stopped = 1;
+-			snd_harmony_disable_interrupts(harmony);
+-			break;
+-		case SNDRV_PCM_TRIGGER_START:
+-			if (!harmony->ply_stopped)
+-				return -EBUSY;
+-			harmony->ply_stopped = 0;
+-			/* write the location of the first buffer to play */
+-			gsc_writel(harmony->ply_buffer, harmony->hpa+REG_PNXTADD);
+-			snd_harmony_enable_interrupts(harmony);
+-			break;
+-		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+-		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+-		case SNDRV_PCM_TRIGGER_SUSPEND:
+-			DPRINTK(KERN_INFO PFX "received unimplemented trigger: %d\n", cmd);
+-		default:
+-			return -EINVAL;
++	case SNDRV_PCM_TRIGGER_START:
++		h->st.playing = 1;
++		harmony_write(h, HARMONY_PNXTADD, h->pbuf.addr);
++		harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);
++		harmony_unmute(h);
++		harmony_enable_interrupts(h);
++		break;
++	case SNDRV_PCM_TRIGGER_STOP:
++		h->st.playing = 0;
++		harmony_mute(h);
++		harmony_disable_interrupts(h);
++		break;
++	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
++	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
++	case SNDRV_PCM_TRIGGER_SUSPEND:
++	default:
++		spin_unlock_irqrestore(&h->lock, flags);
++		snd_BUG();
++		return -EINVAL;
+ 	}
++	spin_unlock_irqrestore(&h->lock, flags);
++	
+ 	return 0;
+ }
+ 
+-static int snd_card_harmony_capture_trigger(snd_pcm_substream_t * substream,
+-					  int cmd)
++static int
++snd_harmony_capture_trigger(snd_pcm_substream_t *ss, int cmd)
+ {
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	
+-	switch (cmd) {
+-		case SNDRV_PCM_TRIGGER_STOP:
+-			if (harmony->cap_stopped) 
+-				return -EBUSY;
+-			harmony->cap_stopped = 1;
+-			snd_harmony_disable_interrupts(harmony);
+-			break;
+-		case SNDRV_PCM_TRIGGER_START:
+-			if (!harmony->cap_stopped)
+-				return -EBUSY;
+-			harmony->cap_stopped = 0;
+-			snd_harmony_enable_interrupts(harmony);
+-			break;
+-		case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+-		case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+-		case SNDRV_PCM_TRIGGER_SUSPEND:
+-			DPRINTK(KERN_INFO PFX "Received unimplemented trigger: %d\n", cmd);
+-		default:
+-			return -EINVAL;
+-	}
+-	return 0;
++        harmony_t *h = snd_pcm_substream_chip(ss);
++	unsigned long flags;
++
++	if (h->st.playing)
++		return -EBUSY;
++
++	spin_lock_irqsave(&h->lock, flags);
++        switch (cmd) {
++        case SNDRV_PCM_TRIGGER_START:
++		h->st.capturing = 1;
++                harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);
++                harmony_write(h, HARMONY_RNXTADD, h->cbuf.addr);
++		harmony_unmute(h);
++                harmony_enable_interrupts(h);
++		break;
++        case SNDRV_PCM_TRIGGER_STOP:
++		h->st.capturing = 0;
++                harmony_mute(h);
++                harmony_disable_interrupts(h);
++		break;
++        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
++        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
++        case SNDRV_PCM_TRIGGER_SUSPEND:
++	default:
++		spin_unlock_irqrestore(&h->lock, flags);
++		snd_BUG();
++                return -EINVAL;
++        }
++	spin_unlock_irqrestore(&h->lock, flags);
++		
++        return 0;
+ }
+ 
+-/* set data format */
+-static int snd_harmony_set_data_format(snd_card_harmony_t *harmony, int pcm_format)
++static int
++snd_harmony_set_data_format(harmony_t *h, int fmt)
+ {
+-	int old_format = harmony->data_format;
+-	int new_format = old_format;
+-	switch (pcm_format) {
++	int o = h->st.format;
++	int n;
++
++	switch(fmt) {
+ 	case SNDRV_PCM_FORMAT_S16_BE:
+-		new_format = HARMONY_DF_16BIT_LINEAR;
++		n = HARMONY_DF_16BIT_LINEAR;
+ 		break;
+ 	case SNDRV_PCM_FORMAT_A_LAW:
+-		new_format = HARMONY_DF_8BIT_ALAW;
++		n = HARMONY_DF_8BIT_ALAW;
+ 		break;
+ 	case SNDRV_PCM_FORMAT_MU_LAW:
+-		new_format = HARMONY_DF_8BIT_ULAW;
++		n = HARMONY_DF_8BIT_ULAW;
+ 		break;
++	default:
++		n = HARMONY_DF_16BIT_LINEAR;
++		break;
++	}
++
++	if (o != n) {
++		snd_pcm_format_set_silence(fmt, h->sdma.area,
++					   SILENCE_BUFSZ / 
++					   snd_pcm_format_width(fmt));
+ 	}
+-	/* re-initialize silence buffer if needed */
+-	if (old_format != new_format)
+-		snd_pcm_format_set_silence(pcm_format, harmony->silence_dma.area,
+-					   (HARMONY_BUF_SIZE * SILENCE_BUFS * 8) / snd_pcm_format_width(pcm_format));
+ 
+-	return new_format;
++	return n;
+ }
+ 
+-static int snd_card_harmony_playback_prepare(snd_pcm_substream_t * substream)
++static int
++snd_harmony_playback_prepare(snd_pcm_substream_t *ss)
+ {
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	snd_pcm_runtime_t *runtime = substream->runtime;
++	harmony_t *h = snd_pcm_substream_chip(ss);
++	snd_pcm_runtime_t *rt = ss->runtime;
+ 	
+-	harmony->ply_size 			= snd_pcm_lib_buffer_bytes(substream);
+-	harmony->ply_count 			= snd_pcm_lib_period_bytes(substream);
+-	harmony->ply_buf			= 0;
+-	harmony->ply_stopped		= 1;
++	if (h->st.capturing)
++		return -EBUSY;
+ 	
+-	/* initialize given sample rate */
+-	harmony->sample_rate = snd_card_harmony_rate_bits(runtime->rate);
+-
+-	/* data format */
+-	harmony->data_format = snd_harmony_set_data_format(harmony, runtime->format);
++	h->pbuf.size = snd_pcm_lib_buffer_bytes(ss);
++	h->pbuf.count = snd_pcm_lib_period_bytes(ss);
++	h->pbuf.buf = 0;
++	h->st.playing = 0;
+ 
+-	/* number of channels */
+-	if (runtime->channels == 2)
+-		harmony->stereo_select = HARMONY_SS_STEREO;
+-	else
+-		harmony->stereo_select = HARMONY_SS_MONO;
+-	
+-	DPRINTK(KERN_INFO PFX "Playback_prepare, sr=%d(%x), df=%x, ss=%x hpa=%lx\n", runtime->rate,
+-				harmony->sample_rate, harmony->data_format, harmony->stereo_select, harmony->hpa);
+-	snd_harmony_update_control(harmony);
+-	harmony->format_initialized = 1;
+-	harmony->ply_buffer = runtime->dma_addr;
++	h->st.rate = snd_harmony_rate_bits(rt->rate);
++	h->st.format = snd_harmony_set_data_format(h, rt->format);
+ 	
++	if (rt->channels == 2)
++		h->st.stereo = HARMONY_SS_STEREO;
++	else
++		h->st.stereo = HARMONY_SS_MONO;
++
++	harmony_set_control(h);
++
++	h->pbuf.addr = rt->dma_addr;
++
+ 	return 0;
+ }
+ 
+-static int snd_card_harmony_capture_prepare(snd_pcm_substream_t * substream)
++static int
++snd_harmony_capture_prepare(snd_pcm_substream_t *ss)
+ {
+-	snd_pcm_runtime_t *runtime = substream->runtime;
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	
+-	harmony->cap_size 			= snd_pcm_lib_buffer_bytes(substream);
+-	harmony->cap_count 			= snd_pcm_lib_period_bytes(substream);
+-	harmony->cap_count			= 0;
+-	harmony->cap_stopped		= 1;
+-
+-	/* initialize given sample rate */
+-	harmony->sample_rate = snd_card_harmony_rate_bits(runtime->rate);
+-	
+-	/* data format */
+-	harmony->data_format = snd_harmony_set_data_format(harmony, runtime->format);
+-	
+-	/* number of channels */
+-	if (runtime->channels == 1)
+-		harmony->stereo_select = HARMONY_SS_MONO;
+-	else if (runtime->channels == 2)
+-		harmony->stereo_select = HARMONY_SS_STEREO;
+-		
+-	snd_harmony_update_control(harmony);
+-	harmony->format_initialized = 1;
+-	
+-	harmony->cap_buffer = runtime->dma_addr;
++        harmony_t *h = snd_pcm_substream_chip(ss);
++        snd_pcm_runtime_t *rt = ss->runtime;
+ 
+-	return 0;
++	if (h->st.playing)
++		return -EBUSY;
++
++        h->cbuf.size = snd_pcm_lib_buffer_bytes(ss);
++        h->cbuf.count = snd_pcm_lib_period_bytes(ss);
++        h->cbuf.buf = 0;
++	h->st.capturing = 0;
++
++        h->st.rate = snd_harmony_rate_bits(rt->rate);
++        h->st.format = snd_harmony_set_data_format(h, rt->format);
++
++        if (rt->channels == 2)
++                h->st.stereo = HARMONY_SS_STEREO;
++        else
++                h->st.stereo = HARMONY_SS_MONO;
++
++        harmony_set_control(h);
++
++        h->cbuf.addr = rt->dma_addr;
++
++        return 0;
+ }
+ 
+-static snd_pcm_uframes_t snd_card_harmony_capture_pointer(snd_pcm_substream_t * substream)
++static snd_pcm_uframes_t 
++snd_harmony_playback_pointer(snd_pcm_substream_t *ss)
+ {
+-	snd_pcm_runtime_t *runtime = substream->runtime;
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	unsigned long rcuradd;
+-	int recorded;
+-	
+-	if (harmony->cap_stopped) return 0;
+-	if (harmony->capture_substream == NULL) return 0;
+-
+-	rcuradd = gsc_readl(harmony->hpa+REG_RCURADD);
+-	recorded = (rcuradd - harmony->cap_buffer);
+-	recorded %= harmony->cap_size;
+-		
+-	return bytes_to_frames(runtime, recorded);
+-}
++	snd_pcm_runtime_t *rt = ss->runtime;
++	harmony_t *h = snd_pcm_substream_chip(ss);
++	unsigned long pcuradd;
++	unsigned long played;
+ 
+-/*
+- */
++	if (!(h->st.playing) || (h->psubs == NULL)) 
++		return 0;
+ 
+-static snd_pcm_uframes_t snd_card_harmony_playback_pointer(snd_pcm_substream_t * substream)
+-{
+-	snd_pcm_runtime_t *runtime = substream->runtime;
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	int played;
+-	long int pcuradd = gsc_readl(harmony->hpa+REG_PCURADD);
+-	
+-	if ((harmony->ply_stopped) || (harmony->playback_substream == NULL)) return 0;
+-	if ((harmony->ply_buffer == 0) || (harmony->ply_size == 0)) return 0;
+-	
+-	played = (pcuradd - harmony->ply_buffer);
+-	
+-	printk(KERN_DEBUG PFX "Pointer is %lx-%lx = %d\n", pcuradd, harmony->ply_buffer, played);	
+-
+-	if (pcuradd > harmony->ply_buffer + harmony->ply_size) return 0;
+-	
+-	return bytes_to_frames(runtime, played);
+-}
+-
+-static snd_pcm_hardware_t snd_card_harmony_playback =
+-{
+-	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 
+-					SNDRV_PCM_INFO_JOINT_DUPLEX | 
+-					SNDRV_PCM_INFO_MMAP_VALID |
+-					SNDRV_PCM_INFO_BLOCK_TRANSFER),
+-	.formats =		(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_BE | 
+-					SNDRV_PCM_FMTBIT_A_LAW | SNDRV_PCM_FMTBIT_MU_LAW),
+-	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
+-	.rate_min =		5500,
+-	.rate_max =		48000,
+-	.channels_min =		1,
+-	.channels_max =		2,
+-	.buffer_bytes_max =	MAX_BUFFER_SIZE,
+-	.period_bytes_min =	HARMONY_BUF_SIZE,
+-	.period_bytes_max =	HARMONY_BUF_SIZE,
+-	.periods_min =		1,
+-	.periods_max =		MAX_BUFS,
+-	.fifo_size =		0,
+-};
++	if ((h->pbuf.addr == 0) || (h->pbuf.size == 0))
++		return 0;
++	
++	pcuradd = harmony_read(h, HARMONY_PCURADD);
++	played = pcuradd - h->pbuf.addr;
++
++#ifdef HARMONY_DEBUG
++	printk(KERN_DEBUG PFX "playback_pointer is 0x%lx-0x%lx = %d bytes\n", 
++	       pcuradd, h->pbuf.addr, played);	
++#endif
++
++	if (pcuradd > h->pbuf.addr + h->pbuf.size) {
++		return 0;
++	}
++
++	return bytes_to_frames(rt, played);
++}
+ 
+-static snd_pcm_hardware_t snd_card_harmony_capture =
++static snd_pcm_uframes_t
++snd_harmony_capture_pointer(snd_pcm_substream_t *ss)
+ {
+-	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED | 
+-					SNDRV_PCM_INFO_JOINT_DUPLEX | 
+-					SNDRV_PCM_INFO_MMAP_VALID |
+-					SNDRV_PCM_INFO_BLOCK_TRANSFER),
+-	.formats =		(SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_BE | 
+-					SNDRV_PCM_FMTBIT_A_LAW | SNDRV_PCM_FMTBIT_MU_LAW),
+-	.rates =		SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
+-	.rate_min =		5500,
+-	.rate_max =		48000,
+-	.channels_min =		1,
+-	.channels_max =		2,
+-	.buffer_bytes_max =	MAX_BUFFER_SIZE,
+-	.period_bytes_min =	HARMONY_BUF_SIZE,
+-	.period_bytes_max =	HARMONY_BUF_SIZE,
+-	.periods_min =		1,
+-	.periods_max =		MAX_BUFS,
+-	.fifo_size =		0,
+-};
++        snd_pcm_runtime_t *rt = ss->runtime;
++        harmony_t *h = snd_pcm_substream_chip(ss);
++        unsigned long rcuradd;
++        unsigned long caught;
++
++        if (!(h->st.capturing) || (h->csubs == NULL))
++                return 0;
++
++        if ((h->cbuf.addr == 0) || (h->cbuf.size == 0))
++                return 0;
++
++        rcuradd = harmony_read(h, HARMONY_RCURADD);
++        caught = rcuradd - h->cbuf.addr;
+ 
+-static int snd_card_harmony_playback_open(snd_pcm_substream_t * substream)
++#ifdef HARMONY_DEBUG
++        printk(KERN_DEBUG PFX "capture_pointer is 0x%lx-0x%lx = %d bytes\n",
++               rcuradd, h->cbuf.addr, caught);
++#endif
++
++        if (rcuradd > h->cbuf.addr + h->cbuf.size) {
++		return 0;
++	}
++
++        return bytes_to_frames(rt, caught);
++}
++
++static int 
++snd_harmony_playback_open(snd_pcm_substream_t *ss)
+ {
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	snd_pcm_runtime_t *runtime = substream->runtime;
++	harmony_t *h = snd_pcm_substream_chip(ss);
++	snd_pcm_runtime_t *rt = ss->runtime;
+ 	int err;
+ 	
+-	harmony->playback_substream = substream;
+-	runtime->hw = snd_card_harmony_playback;
+-	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates);
++	h->psubs = ss;
++	rt->hw = snd_harmony_playback;
++	snd_pcm_hw_constraint_list(rt, 0, SNDRV_PCM_HW_PARAM_RATE, 
++				   &hw_constraint_rates);
+ 	
+-	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
++	err = snd_pcm_hw_constraint_integer(rt, SNDRV_PCM_HW_PARAM_PERIODS);
++	if (err < 0)
+ 		return err;
+ 	
+ 	return 0;
+ }
+ 
+-static int snd_card_harmony_capture_open(snd_pcm_substream_t * substream)
++static int
++snd_harmony_capture_open(snd_pcm_substream_t *ss)
+ {
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	snd_pcm_runtime_t *runtime = substream->runtime;
+-	int err;
+-	
+-	harmony->capture_substream = substream;
+-	runtime->hw = snd_card_harmony_capture;
+-	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, &hw_constraint_rates);
+-	if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
+-		return err;
+-	return 0;
++        harmony_t *h = snd_pcm_substream_chip(ss);
++        snd_pcm_runtime_t *rt = ss->runtime;
++        int err;
+ 
++        h->csubs = ss;
++        rt->hw = snd_harmony_capture;
++        snd_pcm_hw_constraint_list(rt, 0, SNDRV_PCM_HW_PARAM_RATE,
++                                   &hw_constraint_rates);
++
++        err = snd_pcm_hw_constraint_integer(rt, SNDRV_PCM_HW_PARAM_PERIODS);
++        if (err < 0)
++                return err;
++
++        return 0;
+ }
+ 
+-static int snd_card_harmony_playback_close(snd_pcm_substream_t * substream)
++static int 
++snd_harmony_playback_close(snd_pcm_substream_t *ss)
+ {
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	
+-	harmony->playback_substream = NULL;
+-	harmony->ply_size 			= 0;
+-	harmony->ply_buf			= 0;
+-	harmony->ply_buffer			= 0;
+-	harmony->ply_count			= 0;
+-	harmony->ply_stopped		= 1;
+-	harmony->format_initialized = 0;
+-	
++	harmony_t *h = snd_pcm_substream_chip(ss);
++	h->psubs = NULL;
+ 	return 0;
+ }
+ 
+-static int snd_card_harmony_capture_close(snd_pcm_substream_t * substream)
++static int
++snd_harmony_capture_close(snd_pcm_substream_t *ss)
+ {
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
+-	
+-	harmony->capture_substream = NULL;
+-	harmony->cap_size 			= 0;
+-	harmony->cap_buf			= 0;
+-	harmony->cap_buffer			= 0;
+-	harmony->cap_count			= 0;
+-	harmony->cap_stopped		= 1;
+-	harmony->format_initialized = 0;
+-	
+-	return 0;
++        harmony_t *h = snd_pcm_substream_chip(ss);
++        h->csubs = NULL;
++        return 0;
+ }
+ 
+-static int snd_card_harmony_hw_params(snd_pcm_substream_t *substream, 
+-	                   snd_pcm_hw_params_t * hw_params)
++static int 
++snd_harmony_hw_params(snd_pcm_substream_t *ss,
++		      snd_pcm_hw_params_t *hw)
+ {
+ 	int err;
+-	snd_card_harmony_t *harmony = snd_pcm_substream_chip(substream);
++	harmony_t *h = snd_pcm_substream_chip(ss);
++	
++	err = snd_pcm_lib_malloc_pages(ss, params_buffer_bytes(hw));
++	if (err > 0 && h->dma.type == SNDRV_DMA_TYPE_CONTINUOUS)
++		ss->runtime->dma_addr = __pa(ss->runtime->dma_area);
+ 	
+-	err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
+-	if (err > 0 && harmony->dma_dev.type == SNDRV_DMA_TYPE_CONTINUOUS)
+-		substream->runtime->dma_addr = __pa(substream->runtime->dma_area);
+-	DPRINTK(KERN_INFO PFX "HW Params returned %d, dma_addr %lx\n", err,
+-			(unsigned long)substream->runtime->dma_addr);
+ 	return err;
+ }
+ 
+-static int snd_card_harmony_hw_free(snd_pcm_substream_t *substream) 
++static int 
++snd_harmony_hw_free(snd_pcm_substream_t *ss) 
+ {
+-	snd_pcm_lib_free_pages(substream);		
+-	return 0;
++	return snd_pcm_lib_free_pages(ss);
+ }
+ 
+-static snd_pcm_ops_t snd_card_harmony_playback_ops = {
+-	.open =			snd_card_harmony_playback_open,
+-	.close =		snd_card_harmony_playback_close,
+-	.ioctl =		snd_card_harmony_playback_ioctl,
+-	.hw_params = 	snd_card_harmony_hw_params,
+-	.hw_free = 		snd_card_harmony_hw_free,
+-	.prepare =		snd_card_harmony_playback_prepare,
+-	.trigger =		snd_card_harmony_playback_trigger,
+- 	.pointer =		snd_card_harmony_playback_pointer,
++static snd_pcm_ops_t snd_harmony_playback_ops = {
++	.open =	snd_harmony_playback_open,
++	.close = snd_harmony_playback_close,
++	.ioctl = snd_pcm_lib_ioctl,
++	.hw_params = snd_harmony_hw_params,
++	.hw_free = snd_harmony_hw_free,
++	.prepare = snd_harmony_playback_prepare,
++	.trigger = snd_harmony_playback_trigger,
++ 	.pointer = snd_harmony_playback_pointer,
+ };
+ 
+-static snd_pcm_ops_t snd_card_harmony_capture_ops = {
+-	.open =			snd_card_harmony_capture_open,
+-	.close =		snd_card_harmony_capture_close,
+-	.ioctl =		snd_card_harmony_capture_ioctl,
+-	.hw_params = 	snd_card_harmony_hw_params,
+-	.hw_free = 		snd_card_harmony_hw_free,
+-	.prepare =		snd_card_harmony_capture_prepare,
+-	.trigger =		snd_card_harmony_capture_trigger,
+-	.pointer =		snd_card_harmony_capture_pointer,
++static snd_pcm_ops_t snd_harmony_capture_ops = {
++        .open = snd_harmony_capture_open,
++        .close = snd_harmony_capture_close,
++        .ioctl = snd_pcm_lib_ioctl,
++        .hw_params = snd_harmony_hw_params,
++        .hw_free = snd_harmony_hw_free,
++        .prepare = snd_harmony_capture_prepare,
++        .trigger = snd_harmony_capture_trigger,
++        .pointer = snd_harmony_capture_pointer,
+ };
+ 
+-static int snd_card_harmony_pcm_init(snd_card_harmony_t *harmony)
++static int 
++snd_harmony_pcm_init(harmony_t *h)
+ {
+ 	snd_pcm_t *pcm;
+ 	int err;
+ 
+-	/* Request that IRQ */
+-	if (request_irq(harmony->irq, snd_card_harmony_interrupt, 0 ,"harmony", harmony)) {
+-		printk(KERN_ERR PFX "Error requesting irq %d.\n", harmony->irq);
+-		return -EFAULT;
+-	}
+-	
+-	snd_harmony_disable_interrupts(harmony);
++	harmony_disable_interrupts(h);
+ 	
+-   	if ((err = snd_pcm_new(harmony->card, "Harmony", 0, 1, 1, &pcm)) < 0)
++   	err = snd_pcm_new(h->card, "harmony", 0, 1, 1, &pcm);
++	if (err < 0)
+ 		return err;
+ 	
+-	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_card_harmony_playback_ops);
+- 	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_harmony_capture_ops); 
+-	
+-	pcm->private_data = harmony;
++	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, 
++			&snd_harmony_playback_ops);
++	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
++			&snd_harmony_capture_ops);
++
++	pcm->private_data = h;
+ 	pcm->info_flags = 0;
+-	strcpy(pcm->name, "Harmony");
+-	harmony->pcm = pcm;
++	strcpy(pcm->name, "harmony");
++	h->pcm = pcm;
++
++	h->psubs = NULL;
++	h->csubs = NULL;
+ 	
+ 	/* initialize graveyard buffer */
+-	harmony->dma_dev.type = SNDRV_DMA_TYPE_DEV;
+-	harmony->dma_dev.dev = &harmony->pa_dev->dev;
+-	err = snd_dma_alloc_pages(harmony->dma_dev.type,
+-				  harmony->dma_dev.dev,
+-				  HARMONY_BUF_SIZE*GRAVEYARD_BUFS,
+-				  &harmony->graveyard_dma);
+-	if (err == -ENOMEM) {
+-		/* use continuous buffers */
+-		harmony->dma_dev.type = SNDRV_DMA_TYPE_CONTINUOUS;
+-		harmony->dma_dev.dev = snd_dma_continuous_data(GFP_KERNEL);
+-		err = snd_dma_alloc_pages(harmony->dma_dev.type,
+-					  harmony->dma_dev.dev,
+-					  HARMONY_BUF_SIZE*GRAVEYARD_BUFS,
+-					  &harmony->graveyard_dma);
+-	}
++	h->dma.type = SNDRV_DMA_TYPE_DEV;
++	h->dma.dev = &h->dev->dev;
++	err = snd_dma_alloc_pages(h->dma.type,
++				  h->dma.dev,
++				  BUF_SIZE*GRAVEYARD_BUFS,
++				  &h->gdma);
+ 	if (err < 0) {
+-		printk(KERN_ERR PFX "can't allocate graveyard buffer\n");
++		printk(KERN_ERR PFX "cannot allocate graveyard buffer!\n");
+ 		return err;
+ 	}
+-	harmony->graveyard_count = 0;
+ 	
+ 	/* initialize silence buffers */
+-	err = snd_dma_alloc_pages(harmony->dma_dev.type,
+-				  harmony->dma_dev.dev,
+-				  HARMONY_BUF_SIZE*SILENCE_BUFS,
+-				  &harmony->silence_dma);
++	err = snd_dma_alloc_pages(h->dma.type,
++				  h->dma.dev,
++				  BUF_SIZE*SILENCE_BUFS,
++				  &h->sdma);
+ 	if (err < 0) {
+-		printk(KERN_ERR PFX "can't allocate silence buffer\n");
++		printk(KERN_ERR PFX "cannot allocate silence buffer!\n");
+ 		return err;
+ 	}
+-	harmony->silence_count = 0;
+-
+-	if (harmony->dma_dev.type == SNDRV_DMA_TYPE_CONTINUOUS) {
+-		harmony->graveyard_dma.addr = __pa(harmony->graveyard_dma.area);
+-		harmony->silence_dma.addr = __pa(harmony->silence_dma.area);
+-	}
+-
+-	harmony->ply_stopped = harmony->cap_stopped = 1;
+-	
+-	harmony->playback_substream = NULL;
+-	harmony->capture_substream = NULL;
+-	harmony->graveyard_count = 0;
+ 
+-	err = snd_pcm_lib_preallocate_pages_for_all(pcm, harmony->dma_dev.type,
+-						    harmony->dma_dev.dev,
+-						    MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);
++	/* pre-allocate space for DMA */
++	err = snd_pcm_lib_preallocate_pages_for_all(pcm, h->dma.type,
++						    h->dma.dev,
++						    MAX_BUF_SIZE, 
++						    MAX_BUF_SIZE);
+ 	if (err < 0) {
+-		printk(KERN_ERR PFX "buffer allocation error %d\n", err);
+-		// return err;
++		printk(KERN_ERR PFX "buffer allocation error: %d\n", err);
++		return err;
+ 	}
+ 
+ 	return 0;
+ }
+ 
+-/*
+- * mixer routines
+- */
+-
+-static void snd_harmony_set_new_gain(snd_card_harmony_t *harmony)
++static void 
++snd_harmony_set_new_gain(harmony_t *h)
+ {
+-	DPRINTK(KERN_INFO PFX "Setting new gain %x at %lx\n", harmony->current_gain, harmony->hpa+REG_GAINCTL);
+-	/* Wait until we're out of control mode */
+- 	snd_harmony_wait_cntl(harmony);
+-	
+-	gsc_writel(harmony->current_gain, harmony->hpa+REG_GAINCTL);
++ 	harmony_wait_for_control(h);
++	harmony_write(h, HARMONY_GAINCTL, h->st.gain);
+ }
+ 
+-#define HARMONY_VOLUME(xname, left_shift, right_shift, mask, invert) \
+-{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
+-  .info = snd_harmony_mixercontrol_info, \
+-  .get = snd_harmony_volume_get, .put = snd_harmony_volume_put, \
+-  .private_value = ((left_shift) | ((right_shift) << 8) | ((mask) << 16) | ((invert) << 24)) }
+-
+-static int snd_harmony_mixercontrol_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
+-{
+-	int mask = (kcontrol->private_value >> 16) & 0xff;
+-	int left_shift = (kcontrol->private_value) & 0xff;
+-	int right_shift = (kcontrol->private_value >> 8) & 0xff;
++static int 
++snd_harmony_mixercontrol_info(snd_kcontrol_t *kc, 
++			      snd_ctl_elem_info_t *uinfo)
++{
++	int mask = (kc->private_value >> 16) & 0xff;
++	int left_shift = (kc->private_value) & 0xff;
++	int right_shift = (kc->private_value >> 8) & 0xff;
+ 	
+-	uinfo->type = (mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER);
+-	uinfo->count = (left_shift == right_shift) ? 1 : 2;
++	uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : 
++		       SNDRV_CTL_ELEM_TYPE_INTEGER;
++	uinfo->count = left_shift == right_shift ? 1 : 2;
+ 	uinfo->value.integer.min = 0;
+ 	uinfo->value.integer.max = mask;
++
+ 	return 0;
+ }
+- 
+-static int snd_harmony_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+-{
+-	snd_card_harmony_t *harmony = snd_kcontrol_chip(kcontrol);
+-	int shift_left = (kcontrol->private_value) & 0xff;
+-	int shift_right = (kcontrol->private_value >> 8) & 0xff;
+-	int mask = (kcontrol->private_value >> 16) & 0xff;
+-	int invert = (kcontrol->private_value >> 24) & 0xff;
+-	unsigned long flags;
++
++static int 
++snd_harmony_volume_get(snd_kcontrol_t *kc, 
++		       snd_ctl_elem_value_t *ucontrol)
++{
++	harmony_t *h = snd_kcontrol_chip(kc);
++	int shift_left = (kc->private_value) & 0xff;
++	int shift_right = (kc->private_value >> 8) & 0xff;
++	int mask = (kc->private_value >> 16) & 0xff;
++	int invert = (kc->private_value >> 24) & 0xff;
+ 	int left, right;
++	unsigned long flags;
+ 	
+-	spin_lock_irqsave(&harmony->mixer_lock, flags);
+-	left = (harmony->current_gain >> shift_left) & mask;
+-	right = (harmony->current_gain >> shift_right) & mask;
++	spin_lock_irqsave(&h->mixer_lock, flags);
++
++	left = (h->st.gain >> shift_left) & mask;
++	right = (h->st.gain >> shift_right) & mask;
+ 
+ 	if (invert) {
+ 		left = mask - left;
+@@ -910,21 +716,24 @@
+ 	}
+ 	ucontrol->value.integer.value[0] = left;
+ 	ucontrol->value.integer.value[1] = right;
+-	spin_unlock_irqrestore(&harmony->mixer_lock, flags);
++
++	spin_unlock_irqrestore(&h->mixer_lock, flags);
+ 
+ 	return 0;
+ }  
+ 
+-static int snd_harmony_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+-{
+-	snd_card_harmony_t *harmony = snd_kcontrol_chip(kcontrol);
+-	int shift_left = (kcontrol->private_value) & 0xff;
+-	int shift_right = (kcontrol->private_value >> 8) & 0xff;
+-	int mask = (kcontrol->private_value >> 16) & 0xff;
+-	int invert = (kcontrol->private_value >> 24) & 0xff;
+-	unsigned long flags;
++static int 
++snd_harmony_volume_put(snd_kcontrol_t *kc, 
++		       snd_ctl_elem_value_t *ucontrol)
++{
++	harmony_t *h = snd_kcontrol_chip(kc);
++	int shift_left = (kc->private_value) & 0xff;
++	int shift_right = (kc->private_value >> 8) & 0xff;
++	int mask = (kc->private_value >> 16) & 0xff;
++	int invert = (kc->private_value >> 24) & 0xff;
+ 	int left, right;
+-	int old_gain = harmony->current_gain;
++	int old_gain = h->st.gain;
++	unsigned long flags;
+ 	
+ 	left = ucontrol->value.integer.value[0] & mask;
+ 	right = ucontrol->value.integer.value[1] & mask;
+@@ -933,213 +742,249 @@
+ 		right = mask - right;
+ 	}
+ 	
+-	spin_lock_irqsave(&harmony->mixer_lock, flags);
+-	harmony->current_gain = harmony->current_gain & ~( (mask << shift_right) | (mask << shift_left));
+- 	harmony->current_gain = harmony->current_gain | ((left << shift_left) | (right << shift_right) );
+-	snd_harmony_set_new_gain(harmony);
+-	spin_unlock_irqrestore(&harmony->mixer_lock, flags);
++	spin_lock_irqsave(&h->mixer_lock, flags);
++
++	h->st.gain &= ~( (mask << shift_right) | (mask << shift_left) );
++ 	h->st.gain |=  ( (left << shift_left) | (right << shift_right) );
++	snd_harmony_set_new_gain(h);
++
++	spin_unlock_irqrestore(&h->mixer_lock, flags);
+ 	
+-	return (old_gain - harmony->current_gain);
++	return (old_gain - h->st.gain);
+ }
+ 
+-#define HARMONY_CONTROLS (sizeof(snd_harmony_controls)/sizeof(snd_kcontrol_new_t))
++#define HARMONY_CONTROLS (sizeof(snd_harmony_controls)/ \
++                          sizeof(snd_kcontrol_new_t))
++
++#define HARMONY_VOLUME(xname, left_shift, right_shift, mask, invert) \
++{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,                \
++  .info = snd_harmony_mixercontrol_info,                             \
++  .get = snd_harmony_volume_get, .put = snd_harmony_volume_put,      \
++  .private_value = ((left_shift) | ((right_shift) << 8) |            \
++                   ((mask) << 16) | ((invert) << 24)) }
+ 
+ static snd_kcontrol_new_t snd_harmony_controls[] = {
+-HARMONY_VOLUME("PCM Capture Volume", 12, 16, 0x0f, 0),
+-HARMONY_VOLUME("Master Volume", 20, 20, 0x0f, 1),
+-HARMONY_VOLUME("PCM Playback Volume", 6, 0, 0x3f, 1),
++	HARMONY_VOLUME("Playback Volume", HARMONY_GAIN_LO_SHIFT, 
++		       HARMONY_GAIN_RO_SHIFT, HARMONY_GAIN_OUT, 1),
++	HARMONY_VOLUME("Capture Volume", HARMONY_GAIN_LI_SHIFT,
++		       HARMONY_GAIN_RI_SHIFT, HARMONY_GAIN_IN, 0),
+ };
+ 
+-static void __init snd_harmony_reset_codec(snd_card_harmony_t *harmony)
+-{
+- 	snd_harmony_wait_cntl(harmony);
+-	gsc_writel(1, harmony->hpa+REG_RESET);
+-	mdelay(50);		/* wait 50 ms */
+-	gsc_writel(0, harmony->hpa+REG_RESET);
+-}
+-
+-/*
+- * Mute all the output and reset Harmony.
+- */
+-
+-static void __init snd_harmony_mixer_reset(snd_card_harmony_t *harmony)
++static void __init 
++snd_harmony_mixer_reset(harmony_t *h)
+ {
+-	harmony->current_gain = HARMONY_GAIN_TOTAL_SILENCE;
+-	snd_harmony_set_new_gain(harmony);
+-	snd_harmony_reset_codec(harmony);
+-	harmony->current_gain = HARMONY_GAIN_DEFAULT;
+-	snd_harmony_set_new_gain(harmony);
++	harmony_mute(h);
++	harmony_reset(h);
++	h->st.gain = HARMONY_GAIN_DEFAULT;
++	harmony_unmute(h);
+ }
+ 
+-
+-static int __init snd_card_harmony_mixer_init(snd_card_harmony_t *harmony)
++static int __init 
++snd_harmony_mixer_init(harmony_t *h)
+ {
+-	snd_card_t *card = harmony->card;
++	snd_card_t *card = h->card;
+ 	int idx, err;
+ 
+-	snd_assert(harmony != NULL, return -EINVAL);
++	snd_assert(h != NULL, return -EINVAL);
+ 	strcpy(card->mixername, "Harmony Gain control interface");
+ 
+ 	for (idx = 0; idx < HARMONY_CONTROLS; idx++) {
+-		if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_harmony_controls[idx], harmony))) < 0)
++		err = snd_ctl_add(card, 
++				  snd_ctl_new1(&snd_harmony_controls[idx], h));
++		if (err < 0)
+ 			return err;
+ 	}
+ 	
+-	snd_harmony_mixer_reset(harmony);
++	snd_harmony_mixer_reset(h);
+ 
+ 	return 0;
+ }
+ 
+-static int snd_card_harmony_create(snd_card_t *card, struct parisc_device *pa_dev, snd_card_harmony_t *harmony)
++static int
++snd_harmony_free(harmony_t *h)
+ {
+-	u32	cntl;
+-	
+-	harmony->card = card;
+-	
+-	harmony->pa_dev = pa_dev;
++        if (h->gdma.addr)
++                snd_dma_free_pages(&h->gdma);
++        if (h->sdma.addr)
++                snd_dma_free_pages(&h->sdma);
+ 
+-	/* Set the HPA of harmony */
+-	harmony->hpa = pa_dev->hpa;
+-	
+-	harmony->irq = pa_dev->irq;
+-	if (!harmony->irq) {
+-		printk(KERN_ERR PFX "no irq found\n");
+-		return -ENODEV;
+-	}
++	if (h->irq >= 0)
++		free_irq(h->irq, h);
+ 
+-	/* Grab the ID and revision from the device */
+-	harmony->id = (gsc_readl(harmony->hpa+REG_ID)&0x00ff0000) >> 16;
+-	if ((harmony->id | 1) != 0x15) {
+-		printk(KERN_WARNING PFX "wrong harmony id 0x%02x\n", harmony->id);
+-		return -EBUSY;
+-	}
+-	cntl = gsc_readl(harmony->hpa+REG_CNTL);
+-	harmony->rev = (cntl>>20) & 0xff;
++	if (h->iobase)
++		iounmap(h->iobase);
+ 
+-	printk(KERN_INFO "Lasi Harmony Audio driver h/w id %i, rev. %i at 0x%lx, IRQ %i\n",	harmony->id, harmony->rev, pa_dev->hpa, harmony->irq);
+-	
+-	/* Make sure the control bit isn't set, although I don't think it 
+-	   ever is. */
+-	if (cntl & HARMONY_CNTL_C) {
+-		printk(KERN_WARNING PFX "CNTL busy\n");
+-		harmony->hpa = 0;
+-		return -EBUSY;
++	parisc_set_drvdata(h->dev, NULL);
++
++	kfree(h);
++	return 0;
++}
++
++static int
++snd_harmony_dev_free(snd_device_t *dev)
++{
++	harmony_t *h = dev->device_data;
++	return snd_harmony_free(h);
++}
++
++static int __devinit
++snd_harmony_create(snd_card_t *card, 
++		   struct parisc_device *padev, 
++		   harmony_t **rchip)
++{
++	int err;
++	harmony_t *h;
++	static snd_device_ops_t ops = {
++		.dev_free = snd_harmony_dev_free,
++	};
++
++	*rchip = NULL;
++
++	h = kmalloc(sizeof(*h), GFP_KERNEL);
++	if (h == NULL)
++		return -ENOMEM;
++
++	memset(&h->st, 0, sizeof(h->st));
++	memset(&h->stats, 0, sizeof(h->stats));
++	memset(&h->pbuf, 0, sizeof(h->pbuf));
++	memset(&h->cbuf, 0, sizeof(h->cbuf));
++
++	h->hpa = padev->hpa;
++	h->card = card;
++	h->dev = padev;
++	h->irq = padev->irq;
++	h->iobase = ioremap_nocache(padev->hpa, HARMONY_SIZE);
++	if (h->iobase == NULL) {
++		printk(KERN_ERR PFX "unable to remap hpa 0x%lx\n",
++		       padev->hpa);
++		err = -EBUSY;
++		goto free_and_ret;
+ 	}
+-	
++		
++	err = request_irq(h->irq, snd_harmony_interrupt, 0,
++			  "harmony", h);
++	if (err) {
++		printk(KERN_ERR PFX "could not obtain interrupt %d",
++		       h->irq);
++		goto free_and_ret;
++	}
++
++	spin_lock_init(&h->mixer_lock);
++	spin_lock_init(&h->lock);
++
++        if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL,
++                                  h, &ops)) < 0) {
++                goto free_and_ret;
++        }
++
++	*rchip = h;
++
+ 	return 0;
++
++free_and_ret:
++	snd_harmony_free(h);
++	return err;
+ }
+-	
+-static int __init snd_card_harmony_probe(struct parisc_device *pa_dev)
++
++static int __devinit
++snd_harmony_probe(struct parisc_device *padev)
+ {
++	int err;
+ 	static int dev;
+-	snd_card_harmony_t *chip;
+ 	snd_card_t *card;
+-	int err;
+-	
+-	if (dev >= SNDRV_CARDS)
++	harmony_t *h;
++	static int index = SNDRV_DEFAULT_IDX1;
++	static char *id = SNDRV_DEFAULT_STR1;
++
++	h = parisc_get_drvdata(padev);
++	if (h != NULL) {
+ 		return -ENODEV;
+-	if (!enable[dev]) {
+-		dev++;
+-		return -ENOENT;
+ 	}
+-	
+-	snd_harmony_cards[dev] = snd_card_new(index[dev], id[dev], THIS_MODULE,
+-			    sizeof(snd_card_harmony_t));
+-	card = snd_harmony_cards[dev];
+-				
++
++	card = snd_card_new(index, id, THIS_MODULE, 0);
+ 	if (card == NULL)
+ 		return -ENOMEM;
+-	chip = (struct snd_card_harmony *)card->private_data;
+-	spin_lock_init(&chip->control_lock);
+-	spin_lock_init(&chip->mixer_lock);
+-	
+-	if ((err = snd_card_harmony_create(card, pa_dev, chip)) < 0) {
+-		printk(KERN_ERR PFX "Creation failed\n");
+-		snd_card_free(card);
+-		return err;
++
++	err = snd_harmony_create(card, padev, &h);
++	if (err < 0) {
++		goto free_and_ret;
+ 	}
+-	if ((err = snd_card_harmony_pcm_init(chip)) < 0) {
+-		printk(KERN_ERR PFX "PCM Init failed\n");
+-		snd_card_free(card);
+-		return err;
++
++	err = snd_harmony_pcm_init(h);
++	if (err < 0) {
++		goto free_and_ret;
+ 	}
+-	if ((err = snd_card_harmony_mixer_init(chip)) < 0) {
+-		printk(KERN_ERR PFX "Mixer init failed\n");
+-		snd_card_free(card);
+-		return err;
++
++	err = snd_harmony_mixer_init(h);
++	if (err < 0) {
++		goto free_and_ret;
+ 	}
+-	
+-	snd_harmony_proc_init(chip);
+-	
+-	strcpy(card->driver, "Harmony");
+-	strcpy(card->shortname, "ALSA driver for LASI Harmony");
+-	sprintf(card->longname, "%s at h/w, id %i, rev. %i hpa 0x%lx, IRQ %i\n",card->shortname, chip->id, chip->rev, pa_dev->hpa, chip->irq);
+ 
+-	if ((err = snd_card_register(card)) < 0) {
+-		snd_card_free(card);
+-		return err;
++	strcpy(card->driver, "harmony");
++	strcpy(card->shortname, "Harmony");
++	sprintf(card->longname, "%s at 0x%lx, irq %i",
++		card->shortname, h->hpa, h->irq);
++
++	err = snd_card_register(card);
++	if (err < 0) {
++		goto free_and_ret;
+ 	}
+ 
+-	printk(KERN_DEBUG PFX "Successfully registered harmony pcm backend & mixer %d\n", dev);
+ 	dev++;
+-	return 0;
+-}
++	parisc_set_drvdata(padev, h);
+ 
+-static struct parisc_device_id snd_card_harmony_devicetbl[] = {
+- { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007A }, /* Bushmaster/Flounder */
+- { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007B }, /* 712/715 Audio */
+- { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007E }, /* Pace Audio */
+- { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007F }, /* Outfield / Coral II */
+- { 0, }
+-};
++	return 0;
+ 
+-MODULE_DEVICE_TABLE(parisc, snd_card_harmony_devicetbl);
++free_and_ret:
++	snd_card_free(card);
++	return err;
++}
+ 
+-/*
+- * bloc device parisc. c'est une structure qui definit un device
+- * que l'on trouve sur parisc. 
+- * On y trouve les differents numeros HVERSION correspondant au device
+- * en question (ce qui permet a l'inventory de l'identifier) et la fonction
+- * d'initialisation du chose 
+- */
++static int __devexit
++snd_harmony_remove(struct parisc_device *padev)
++{
++	harmony_t *h = parisc_get_drvdata(padev);
++	snd_card_free(h->card);
++	return 0;
++}
+ 
+-static struct parisc_driver snd_card_harmony_driver = {
+-	.name		= "Lasi ALSA Harmony",
+-	.id_table	= snd_card_harmony_devicetbl,
+-	.probe		= snd_card_harmony_probe,
++static struct parisc_driver snd_harmony_driver = {
++	.name = "harmony",
++	.id_table = snd_harmony_devtable,
++	.probe = snd_harmony_probe,
++	.remove = snd_harmony_remove,
+ };
+ 
+-static int __init alsa_card_harmony_init(void)
++static int __init 
++alsa_harmony_init(void)
+ {
+ 	int err;
+-	
+-	if ((err = register_parisc_driver(&snd_card_harmony_driver)) < 0) {
+-		printk(KERN_ERR "Harmony soundcard not found or device busy\n");
++
++	err = register_parisc_driver(&snd_harmony_driver);
++	if (err < 0) {
++		printk(KERN_ERR PFX "device not found\n");
+ 		return err;
+ 	}
+ 
+ 	return 0;
+ }
+ 
+-static void __exit alsa_card_harmony_exit(void)
++static void __exit
++alsa_harmony_fini(void)
+ {
+-	int idx;
+-	snd_card_harmony_t *harmony;
++	int err;
++
++	err = unregister_parisc_driver(&snd_harmony_driver);
++	if (err < 0) {
++		printk(KERN_ERR PFX "failed to unregister\n");
++	}
+ 	
+-	for (idx = 0; idx < SNDRV_CARDS; idx++)
+-	{
+-		if (snd_harmony_cards[idx] != NULL)
+-		{	
+-			DPRINTK(KERN_INFO PFX "Freeing card %d\n", idx);
+-			harmony = snd_harmony_cards[idx]->private_data;
+-			free_irq(harmony->irq, harmony);
+-			printk(KERN_INFO PFX "Card unloaded %d, irq=%d\n", idx, harmony->irq);
+-			snd_card_free(snd_harmony_cards[idx]);
+-		}
+-	}	
+-	if (unregister_parisc_driver(&snd_card_harmony_driver) < 0)
+-		printk(KERN_ERR PFX "Failed to unregister Harmony driver\n");
++	return;
+ }
+ 
+-module_init(alsa_card_harmony_init)
+-module_exit(alsa_card_harmony_exit)
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Kyle McMartin <kyle at parisc-linux.org>");
++MODULE_DESCRIPTION("Harmony sound driver");
++
++module_init(alsa_harmony_init);
++module_exit(alsa_harmony_fini);
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/parisc/harmony.h CVS2_6_11_PA2/sound/parisc/harmony.h
+--- LINUS_2_6_11/sound/parisc/harmony.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/sound/parisc/harmony.h	2005-02-28 20:03:11.000000000 -0700
+@@ -0,0 +1,151 @@
++/* Hewlett-Packard Harmony audio driver
++ * Copyright (C) 2004, Kyle McMartin <kyle at parisc-linux.org>
++ */
++
++#ifndef __HARMONY_H__
++#define __HARMONY_H__
++
++struct harmony_buffer {
++        unsigned long addr;
++        int buf;
++        int count;
++        int size;
++        int coherent;
++};
++
++typedef struct snd_card_harmony {
++        int irq;
++
++        unsigned long hpa; /* hard physical address */
++        void __iomem *iobase; /* remapped io address */
++
++        struct parisc_device *dev;
++
++        struct {
++                u32 gain;
++                u32 rate;
++                u32 format;
++                u32 stereo;
++		int playing;
++		int capturing;
++        } st;
++
++        struct snd_dma_device dma; /* playback/capture */
++        struct harmony_buffer pbuf;
++	struct harmony_buffer cbuf;
++
++        struct snd_dma_buffer gdma; /* graveyard */
++        struct snd_dma_buffer sdma; /* silence */
++
++        struct {
++                unsigned long play_intr;
++	        unsigned long rec_intr;
++                unsigned long graveyard_intr;
++                unsigned long silence_intr;
++        } stats;
++
++        snd_pcm_t *pcm;
++        snd_card_t *card;
++        snd_pcm_substream_t *psubs;
++	snd_pcm_substream_t *csubs;
++        snd_info_entry_t *proc;
++
++        spinlock_t lock;
++        spinlock_t mixer_lock;
++} harmony_t;
++
++#define MAX_PCM_DEVICES     1
++#define MAX_PCM_SUBSTREAMS  4
++#define MAX_MIDI_DEVICES    0
++
++#define HARMONY_SIZE       64
++
++#define BUF_SIZE     PAGE_SIZE
++#define MAX_BUFS     10
++#define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE)
++
++#define PLAYBACK_BUFS    MAX_BUFS
++#define RECORD_BUFS      MAX_BUFS
++#define GRAVEYARD_BUFS   1
++#define GRAVEYARD_BUFSZ  (GRAVEYARD_BUFS*BUF_SIZE)
++#define SILENCE_BUFS     1
++#define SILENCE_BUFSZ    (SILENCE_BUFS*BUF_SIZE)
++
++#define HARMONY_ID       0x000
++#define HARMONY_RESET    0x004
++#define HARMONY_CNTL     0x008
++#define HARMONY_GAINCTL  0x00c
++#define HARMONY_PNXTADD  0x010
++#define HARMONY_PCURADD  0x014
++#define HARMONY_RNXTADD  0x018
++#define HARMONY_RCURADD  0x01c
++#define HARMONY_DSTATUS  0x020
++#define HARMONY_OV       0x024
++#define HARMONY_PIO      0x028
++#define HARMONY_DIAG     0x03c
++
++#define HARMONY_CNTL_C          0x80000000
++#define HARMONY_CNTL_ST         0x00000020
++#define HARMONY_CNTL_44100      0x00000015      /* HARMONY_SR_44KHZ */
++#define HARMONY_CNTL_8000       0x00000008      /* HARMONY_SR_8KHZ */
++
++#define HARMONY_DSTATUS_ID      0x00000000 /* interrupts off */
++#define HARMONY_DSTATUS_PN      0x00000200 /* playback fill */
++#define HARMONY_DSTATUS_RN      0x00000002 /* record fill */
++#define HARMONY_DSTATUS_IE      0x80000000 /* interrupts on */
++
++#define HARMONY_DF_16BIT_LINEAR 0x00000000
++#define HARMONY_DF_8BIT_ULAW    0x00000001
++#define HARMONY_DF_8BIT_ALAW    0x00000002
++
++#define HARMONY_SS_MONO         0x00000000
++#define HARMONY_SS_STEREO       0x00000001
++
++#define HARMONY_GAIN_SILENCE    0x00F00FFF
++#define HARMONY_GAIN_DEFAULT    0x0FF00000
++
++#define HARMONY_GAIN_HE_SHIFT   27
++#define HARMONY_GAIN_HE_MASK    (1 << HARMONY_GAIN_HE_SHIFT)
++#define HARMONY_GAIN_LE_SHIFT   26
++#define HARMONY_GAIN_LE_MASK    (1 << HARMONY_GAIN_LE_SHIFT)
++#define HARMONY_GAIN_SE_SHIFT   25
++#define HARMONY_GAIN_SE_MASK    (1 << HARMONY_GAIN_SE_SHIFT)
++#define HARMONY_GAIN_IS_SHIFT   24
++#define HARMONY_GAIN_IS_MASK    (1 << HARMONY_GAIN_IS_SHIFT)
++
++#define HARMONY_GAIN_MA         0x0f
++#define HARMONY_GAIN_MA_SHIFT   20
++#define HARMONY_GAIN_MA_MASK    (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT)
++
++#define HARMONY_GAIN_IN         0x0f
++#define HARMONY_GAIN_LI_SHIFT   16
++#define HARMONY_GAIN_LI_MASK    (HARMONY_GAIN_IN << HARMONY_GAIN_LI_SHIFT)
++#define HARMONY_GAIN_RI_SHIFT   12
++#define HARMONY_GAIN_RI_MASK    (HARMONY_GAIN_IN << HARMONY_GAIN_RI_SHIFT)
++
++#define HARMONY_GAIN_OUT        0x3f
++#define HARMONY_GAIN_LO_SHIFT   6
++#define HARMONY_GAIN_LO_MASK    (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT)
++#define HARMONY_GAIN_RO_SHIFT   0
++#define HARMONY_GAIN_RO_MASK    (HARMONY_GAIN_OUT << HARMONY_GAIN_RO_SHIFT)
++
++#define HARMONY_MAX_OUT (HARMONY_GAIN_RO_MASK >> HARMONY_GAIN_RO_SHIFT)
++#define HARMONY_MAX_IN  (HARMONY_GAIN_RI_MASK >> HARMONY_GAIN_RI_SHIFT)
++#define HARMONY_MAX_MON (HARMONY_GAIN_MA_MASK >> HARMONY_GAIN_MA_SHIFT)
++
++#define HARMONY_SR_8KHZ         0x08
++#define HARMONY_SR_16KHZ        0x09
++#define HARMONY_SR_27KHZ        0x0A
++#define HARMONY_SR_32KHZ        0x0B
++#define HARMONY_SR_48KHZ        0x0E
++#define HARMONY_SR_9KHZ         0x0F
++#define HARMONY_SR_5KHZ         0x10
++#define HARMONY_SR_11KHZ        0x11
++#define HARMONY_SR_18KHZ        0x12
++#define HARMONY_SR_22KHZ        0x13
++#define HARMONY_SR_37KHZ        0x14
++#define HARMONY_SR_44KHZ        0x15
++#define HARMONY_SR_33KHZ        0x16
++#define HARMONY_SR_6KHZ         0x17
++
++#endif /* __HARMONY_H__ */
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/pci/Kconfig CVS2_6_11_PA2/sound/pci/Kconfig
+--- LINUS_2_6_11/sound/pci/Kconfig	2005-03-02 04:19:29.000000000 -0700
++++ CVS2_6_11_PA2/sound/pci/Kconfig	2005-03-01 09:56:38.000000000 -0700
+@@ -21,6 +21,26 @@
+ 	  To compile this driver as a module, choose M here: the module
+ 	  will be called snd-ali5451.
+ 
++config SND_AD1889
++	tristate "Analog Devices AD1889"
++	depends on SND && PARISC && EXPERIMENTAL
++	select SND_AC97_CODEC
++	help
++	  Say Y here to include support for the integrated AC97 sound
++	  device on the Hewlett-Packard BCJ-xxx0 class workstations.
++	  FTSO Analog Devices.
++
++	  To compile this as a module, choose M here: the module
++	  will be called snd-ad1889.
++
++config SND_AD1889_OPL3
++	bool "Analog Devices AD1889 OPL3 Support"
++	depends on SND_AD1889
++	select SND_OPL3_LIB
++	help
++	  Say Y here to include support for the OPL3-compatible interface
++	  provided on an Analog Devices AD1889.
++
+ config SND_ATIIXP
+ 	tristate "ATI IXP AC97 Controller"
+ 	depends on SND
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/pci/Makefile CVS2_6_11_PA2/sound/pci/Makefile
+--- LINUS_2_6_11/sound/pci/Makefile	2005-03-02 04:19:29.000000000 -0700
++++ CVS2_6_11_PA2/sound/pci/Makefile	2005-02-19 17:56:46.000000000 -0700
+@@ -4,6 +4,7 @@
+ #
+ 
+ snd-als4000-objs := als4000.o
++snd-ad1889-objs := ad1889.o
+ snd-atiixp-objs := atiixp.o
+ snd-atiixp-modem-objs := atiixp_modem.o
+ snd-azt3328-objs := azt3328.o
+@@ -26,6 +27,7 @@
+ 
+ # Toplevel Module Dependency
+ obj-$(CONFIG_SND_ALS4000) += snd-als4000.o
++obj-$(CONFIG_SND_AD1889) += snd-ad1889.o
+ obj-$(CONFIG_SND_ATIIXP) += snd-atiixp.o
+ obj-$(CONFIG_SND_ATIIXP_MODEM) += snd-atiixp-modem.o
+ obj-$(CONFIG_SND_AZT3328) += snd-azt3328.o
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/pci/ad1889.c CVS2_6_11_PA2/sound/pci/ad1889.c
+--- LINUS_2_6_11/sound/pci/ad1889.c	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/sound/pci/ad1889.c	2005-03-01 13:51:08.000000000 -0700
+@@ -0,0 +1,780 @@
++/* Analog Devices 1889 audio driver
++ *
++ *   This is a driver for the AD1889 PCI audio chipset found
++ *   on the HP PA-RISC [BCJ]-xxx0 workstations.
++ *
++ *   Copyright (C) 2004-2005, Kyle McMartin <kyle at parisc-linux.org>
++ *     Based on the OSS AD1889 driver by Randolph Chung <tausq at debian.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License, version 2, as
++ *   published by the Free Software Foundation.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * TODO:
++ *   - SYN/RES support.
++ *   - Scatter-Gather DMA. 
++ * 
++ */
++
++#include <linux/init.h>
++#include <linux/pci.h>
++#include <linux/slab.h>
++#include <linux/interrupt.h>
++#include <linux/compiler.h>
++#include <linux/delay.h>
++
++#include <sound/driver.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/initval.h>
++#include <sound/ac97_codec.h>
++
++#ifdef CONFIG_SND_AD1889_OPL3
++#include <sound/opl3.h>
++#endif
++
++#include <asm/io.h>
++
++#include "ad1889.h"
++
++MODULE_AUTHOR("Kyle McMartin <kyle at parisc-linux.org>");
++MODULE_DESCRIPTION("Analog Devices AD1889 sound driver");
++MODULE_LICENSE("GPL");
++
++static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
++module_param_array(index, int, NULL, 0444);
++MODULE_PARM_DESC(index, "Index value for the AD1889 soundcard.");
++
++static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
++module_param_array(id, charp, NULL, 0444);
++MODULE_PARM_DESC(id, "ID string for the AD1889 soundcard.");
++
++static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
++module_param_array(enable, bool, NULL, 0444);
++MODULE_PARM_DESC(enable, "Enable AD1889 soundcard.");
++
++#define DEVNAME "ad1889"
++#define PFX     DEVNAME ": "
++
++/* keep track of each hw register */
++struct ad1889_register_state {
++	u16 reg;
++	u32 addr;
++	u16 rate;
++	unsigned long pos;
++	unsigned long buf;
++	unsigned long size;
++	unsigned long count;
++};
++
++struct snd_ad1889 {
++	snd_card_t *card;
++	struct pci_dev *pci;
++
++	int irq;
++	unsigned long bar;
++	void __iomem *iobase;
++
++#ifdef CONFIG_SND_AD1889_OPL3
++	unsigned long opl3_bar;
++	void __iomem *opl3_iobase;
++#endif
++
++	ac97_t *ac97;
++	ac97_bus_t *ac97_bus;
++	snd_pcm_t *pcm;
++	snd_info_entry_t *proc;
++	
++#ifdef CONFIG_SND_AD1889_OPL3
++	opl3_t *opl3;
++	snd_hwdep_t *opl3hwdep;
++#endif
++
++	struct snd_dma_device dma;
++	snd_pcm_substream_t *psubs; /* playback substream */
++
++	/* playback register state */
++	struct ad1889_register_state play;
++
++	struct {
++		unsigned long wav_intr;
++		unsigned long adc_intr;
++		unsigned long syn_intr;
++		unsigned long res_intr;
++	} stats;
++
++	spinlock_t lock;
++};
++
++static u16
++ad1889_readw(struct snd_ad1889 *dev, unsigned reg)
++{
++	return readw(dev->iobase + reg);
++}
++
++static void
++ad1889_writew(struct snd_ad1889 *dev, unsigned reg, u16 val)
++{
++	writew(val, dev->iobase + reg);
++}
++
++static u32
++ad1889_readl(struct snd_ad1889 *dev, unsigned reg)
++{
++	return readl(dev->iobase + reg);
++}
++
++static void
++ad1889_writel(struct snd_ad1889 *dev, unsigned reg, u32 val)
++{
++	writel(val, dev->iobase + reg);
++}
++
++static void
++ad1889_power_on(struct snd_ad1889 *dev)
++{
++	u16 st;
++	st = ad1889_readw(dev, AD_DS_CCS) | AD_DS_CCS_PDALL;
++	ad1889_writew(dev, AD_DS_CCS, st);
++	ad1889_readw(dev, AD_DS_CCS);
++}
++
++static void
++ad1889_power_off(struct snd_ad1889 *dev)
++{
++	u16 st;
++	st = ad1889_readw(dev, AD_DS_CCS) & ~AD_DS_CCS_PDALL;
++	ad1889_writew(dev, AD_DS_CCS, st);
++	ad1889_readw(dev, AD_DS_CCS);
++}
++
++static void
++ad1889_clock_on(struct snd_ad1889 *dev)
++{
++	u16 st;
++	st = ad1889_readw(dev, AD_DS_CCS) | AD_DS_CCS_CLKEN;
++	ad1889_writew(dev, AD_DS_CCS, st);
++	ad1889_readw(dev, AD_DS_CCS);
++}
++
++static void
++ad1889_clock_off(struct snd_ad1889 *dev)
++{
++	unsigned short st;
++	st = ad1889_readw(dev, AD_DS_CCS) & ~AD_DS_CCS_CLKEN;
++	ad1889_writew(dev, AD_DS_CCS, st);
++	ad1889_readw(dev, AD_DS_CCS);
++}
++
++static void
++ad1889_mute(struct snd_ad1889 *dev)
++{
++	u16 st;
++	st = ad1889_readw(dev, AD_DS_WADA) & 
++		~(AD_DS_WADA_RWAM | AD_DS_WADA_LWAM);
++	ad1889_writew(dev, AD_DS_WADA, st);
++	ad1889_readw(dev, AD_DS_WADA);
++}
++
++static void
++ad1889_unmute(struct snd_ad1889 *dev)
++{
++	u16 st;
++	st = ad1889_readw(dev, AD_DS_WADA) | AD_DS_WADA_RWAM | AD_DS_WADA_LWAM;
++	ad1889_writew(dev, AD_DS_WADA, st);
++	ad1889_readw(dev, AD_DS_WADA);
++}
++
++static u16
++snd_ad1889_ac97_read(ac97_t *ac97,
++		     unsigned short reg)
++{
++	u16 val;
++	struct snd_ad1889 *dev = ac97->private_data;
++	return ad1889_readw(dev, AD_AC97_BASE + reg);
++}
++
++static void
++snd_ad1889_ac97_write(ac97_t *ac97,
++		      unsigned short reg,
++		      unsigned short val)
++{
++	struct snd_ad1889 *dev = ac97->private_data;
++	ad1889_writew(dev, AD_AC97_BASE + reg, val);
++}
++
++static int 
++snd_ad1889_hw_params(snd_pcm_substream_t *substream,
++		     snd_pcm_hw_params_t *hw_params)
++{
++	return snd_pcm_lib_malloc_pages(substream, 
++					params_buffer_bytes(hw_params));
++}
++
++static int
++snd_ad1889_hw_free(snd_pcm_substream_t *substream)
++{
++	return snd_pcm_lib_free_pages(substream);
++}
++
++static snd_pcm_hardware_t snd_ad1889_playback =
++{
++        .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
++                 SNDRV_PCM_INFO_JOINT_DUPLEX | SNDRV_PCM_INFO_MMAP_VALID |
++                 SNDRV_PCM_INFO_BLOCK_TRANSFER),
++        .formats = (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_BE),
++        .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
++        .rate_min = 5500,
++        .rate_max = 48000,
++        .channels_min = 1,
++        .channels_max = 2,
++        .buffer_bytes_max = DMA_SIZE,
++        .period_bytes_min = BUF_SIZE,
++        .period_bytes_max = BUF_SIZE,
++        .periods_min = 1,
++        .periods_max = MAX_BUFS,
++        .fifo_size = 0,
++};
++
++static unsigned int rates[] = {
++	5500,  8000,  9600, 11025,
++	16000, 19200, 22050, 32000,
++	38400, 44100, 48000
++};
++
++static snd_pcm_hw_constraint_list_t hw_constraints_rates = {
++	.count = ARRAY_SIZE(rates),
++	.list = rates,
++	.mask = 0,
++};
++
++static unsigned int channels[] = {
++	2
++};
++
++static snd_pcm_hw_constraint_list_t hw_constraints_channels = {
++	.count = ARRAY_SIZE(channels),
++	.list = channels,
++	.mask = 0,
++};
++
++static int
++snd_ad1889_playback_open(snd_pcm_substream_t *ss)
++{
++	struct snd_ad1889 *dev = snd_pcm_substream_chip(ss);
++	snd_pcm_runtime_t *rt = ss->runtime;
++	int err;
++
++	dev->psubs = ss;
++	rt->hw = snd_ad1889_playback;
++	snd_pcm_hw_constraint_list(rt, 0, SNDRV_PCM_HW_PARAM_RATE,
++				   &hw_constraints_rates);
++
++	err = snd_pcm_hw_constraint_integer(rt, SNDRV_PCM_HW_PARAM_PERIODS);
++	if (err < 0)
++		return err;
++
++	return 0;
++}
++
++static int
++snd_ad1889_playback_close(snd_pcm_substream_t *substream)
++{
++	struct snd_ad1889 *dev = snd_pcm_substream_chip(substream);
++	dev->psubs = NULL;
++	return 0;
++}
++
++static int
++snd_ad1889_playback_prepare(snd_pcm_substream_t *ss)
++{
++	struct snd_ad1889 *dev = snd_pcm_substream_chip(ss);
++	snd_pcm_runtime_t *rt = ss->runtime;
++
++	spin_lock_irq(&dev->lock);
++
++	dev->play.size = snd_pcm_lib_buffer_bytes(ss);
++	dev->play.count = snd_pcm_lib_period_bytes(ss);
++
++	if (snd_pcm_format_width(rt->format) == 16)
++		dev->play.reg |= AD_DS_WSMC_WA16;
++	if (rt->channels > 1)
++		dev->play.reg |= AD_DS_WSMC_WAST;
++
++	dev->play.buf = 0;
++	dev->play.rate = rt->rate;
++	dev->play.addr = rt->dma_addr;
++
++	ad1889_writew(dev, AD_DS_WSMC, dev->play.reg);
++	ad1889_writew(dev, AD_DS_WAS, dev->play.rate);
++
++	ad1889_writel(dev, AD_DMA_WAVBA, dev->play.addr);
++	ad1889_writel(dev, AD_DMA_WAVCA, dev->play.addr);
++
++	ad1889_writel(dev, AD_DMA_WAVBC, dev->play.count);
++	ad1889_writel(dev, AD_DMA_WAVCC, dev->play.count);
++
++	spin_unlock_irq(&dev->lock);
++
++	return 0;
++}
++
++static int
++snd_ad1889_playback_trigger(snd_pcm_substream_t *ss,
++			    int cmd)
++{
++	u16 wsmc;
++	unsigned long flags;
++	struct snd_ad1889 *dev = snd_pcm_substream_chip(ss);
++
++	spin_lock_irqsave(&dev->lock, flags);
++	wsmc = ad1889_readw(dev, AD_DS_WSMC);
++	switch (cmd) {
++	case SNDRV_PCM_TRIGGER_START:
++		wsmc |= AD_DS_WSMC_WAEN;
++		ad1889_unmute(dev);
++		break;
++	case SNDRV_PCM_TRIGGER_STOP:
++		wsmc &= ~AD_DS_WSMC_WAEN;
++		ad1889_mute(dev);
++		break;
++	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
++	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
++		break;
++	default:
++		spin_unlock_irqrestore(&dev->lock, flags);
++		snd_BUG();
++		return -EINVAL;
++	}
++	ad1889_writew(dev, AD_DS_WSMC, wsmc);
++	spin_unlock_irqrestore(&dev->lock, flags);
++
++	return 0;
++}
++
++static snd_pcm_uframes_t
++snd_ad1889_playback_pointer(snd_pcm_substream_t *ss)
++{
++	size_t ptr = 0;
++	struct snd_ad1889 *dev = snd_pcm_substream_chip(ss);
++
++	if (!(dev->play.reg & AD_DS_WSMC_WAEN))
++		return 0;
++
++	spin_lock(&dev->lock);
++
++	/* XXX: */
++
++	spin_unlock(&dev->lock);
++
++	return bytes_to_frames(ss->runtime, ptr);
++}
++
++static snd_pcm_ops_t snd_ad1889_playback_ops = {
++	.open = snd_ad1889_playback_open,
++	.close = snd_ad1889_playback_close,
++	.ioctl = snd_pcm_lib_ioctl,
++	.hw_params = snd_ad1889_hw_params,
++	.hw_free = snd_ad1889_hw_free,
++	.prepare = snd_ad1889_playback_prepare,
++	.trigger = snd_ad1889_playback_trigger,
++	.pointer = snd_ad1889_playback_pointer, 
++};
++
++static void 
++snd_ad1889_pcm_free(snd_pcm_t *pcm)
++{
++	struct snd_ad1889 *dev = pcm->private_data;
++	dev->pcm = NULL;
++	snd_pcm_lib_preallocate_free_for_all(pcm);
++}
++
++static int __devinit
++snd_ad1889_pcm_init(struct snd_ad1889 *dev, int device, snd_pcm_t **rpcm)
++{
++	int err;
++	snd_pcm_t *pcm;
++
++	if (rpcm)
++		*rpcm = NULL;
++
++	err = snd_pcm_new(dev->card, "ad1889", device, 1, 1, &pcm);
++	if (err < 0)
++		return err;
++
++	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, 
++			&snd_ad1889_playback_ops);
++
++	pcm->private_data = dev;
++	pcm->private_free = snd_ad1889_pcm_free;
++	pcm->info_flags = 0;
++	strcpy(pcm->name, "ad1889");
++	dev->pcm = pcm;
++	dev->psubs = NULL;
++
++	dev->dma.dev = dev;
++	dev->dma.type = SNDRV_DMA_TYPE_DEV;
++
++	err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
++						    snd_dma_pci_data(dev->pci),
++						    DMA_SIZE, DMA_SIZE);
++	if (err < 0) {
++		printk(KERN_ERR PFX "buffer allocation error: %d\n", err);
++		return err;
++	}
++	
++	if (rpcm)
++		*rpcm = pcm;
++	
++	return 0;
++}
++
++static int
++snd_ad1889_ac97_init(struct snd_ad1889 *dev)
++{
++	int err;
++	ac97_bus_t *bus;
++	ac97_template_t ac97;
++	static ac97_bus_ops_t ops = {
++		.write = snd_ad1889_ac97_write,
++		.read = snd_ad1889_ac97_read,
++	};
++
++	err = snd_ac97_bus(dev->card, 0, &ops, NULL, &bus);
++	if (err < 0) {
++		return err;
++	}
++
++	memset(&ac97, 0, sizeof(ac97));
++	ac97.private_data = dev;
++	dev->ac97_bus = bus;
++
++	return snd_ac97_mixer(bus, &ac97, &dev->ac97);
++}
++
++static irqreturn_t
++snd_ad1889_interrupt(int irq, 
++		     void *dev_id, 
++		     struct pt_regs *regs)
++{
++	unsigned long st;
++	unsigned long next;
++	struct snd_ad1889 *dev = dev_id;
++
++	spin_lock(&dev->lock);
++	
++	st = ad1889_readl(dev, AD_DMA_DISR);
++	st &= AD_INTR_MASK;
++
++	if (!st)
++		return IRQ_NONE;
++
++	ad1889_writel(dev, AD_DMA_DISR, st);
++
++	if (dev->pcm && (st & AD_DMA_DISR_WAVI) && dev->psubs) {
++		dev->stats.wav_intr++;
++
++		dev->play.buf++;
++		dev->play.pos += dev->play.count;
++		dev->play.pos %= dev->play.size;
++		next = dev->play.pos + dev->play.count;
++		next %= dev->play.size;
++
++		ad1889_writel(dev, AD_DMA_WAVCA, dev->play.addr + next);
++
++		spin_unlock(&dev->lock);
++		snd_pcm_period_elapsed(dev->psubs);
++		spin_lock(&dev->lock);
++	}
++
++	spin_unlock(&dev->lock);
++
++	return IRQ_HANDLED;
++}
++
++static int
++snd_ad1889_free(struct snd_ad1889 *dev)
++{
++	if (dev->irq >= 0)
++		free_irq(dev->irq, (void*)dev);
++	if (dev->iobase)
++		iounmap(dev->iobase);
++	pci_release_regions(dev->pci);
++	kfree(dev);
++	return 0;
++}
++
++static int
++snd_ad1889_dev_free(snd_device_t *device) 
++{
++	struct snd_ad1889 *dev = device->device_data;
++	return snd_ad1889_free(dev);
++}
++
++static int
++snd_ad1889_init(struct snd_ad1889 *dev) 
++{
++	u32 dma_wav;
++
++	spin_lock(&dev->lock);
++
++	dma_wav = ad1889_readl(dev, AD_DMA_WAV);
++	dma_wav &= ~0xff; /* mask off lower byte */
++	/* interrupt on count, loop enabled */
++	dma_wav |= (AD_DMA_WAV_IM_CNT | AD_DMA_WAV_LOOP);
++	ad1889_writel(dev, AD_DMA_WAV, dma_wav);
++	ad1889_readl(dev, AD_DMA_WAV);
++	ad1889_unmute(dev);
++
++	spin_unlock(&dev->lock);
++
++	return 0;
++}
++
++static int __devinit
++snd_ad1889_create(snd_card_t *card,
++		  struct pci_dev *pci,
++		  struct snd_ad1889 **rchip)
++{
++	int err;
++
++	struct snd_ad1889 *dev;
++	static snd_device_ops_t ops = {
++		.dev_free = snd_ad1889_dev_free,
++	};
++
++	*rchip = NULL;
++
++	if ((err = pci_enable_device(pci)) < 0)
++		return err;
++	if (pci_set_dma_mask(pci, 0xffffffff) < 0 ||
++	    pci_set_consistent_dma_mask(pci, 0xffffffff) < 0) {
++		printk(KERN_ERR PFX "error setting 32-bit DMA mask.\n");
++		return -ENXIO;
++	}
++	
++	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
++	if (dev == NULL)
++		return -ENOMEM;
++
++	dev->card = card;
++	card->private_data = dev;
++	dev->pci = pci;
++	dev->irq = -1;
++
++	/* zero out stats */
++	memset(&dev->stats, 0, sizeof(dev->stats));
++
++	if ((err = pci_request_regions(pci, "ad1889")) < 0) {
++		kfree(dev);
++		return err;
++	}
++
++	dev->bar = pci_resource_start(pci, 0);
++	dev->iobase = ioremap_nocache(dev->bar, pci_resource_len(pci, 0));
++	if (dev->iobase == NULL) {
++		printk(KERN_ERR PFX "unable to reserve region.\n");
++		err = -EBUSY;
++		goto free_and_ret;
++	}
++
++#ifdef CONFIG_SND_AD1889_OPL3
++	dev->opl3_bar = pci_resource_start(pci, 1);
++	dev->opl3_iobase = ioremap_nocache(dev->opl3_bar, pci_resource_len(pci, 1));
++	if (dev->opl3_iobase == NULL) {
++		printk(KERN_ERR PFX "unable to reserve region.\n");
++		err = -EBUSY;
++		goto free_and_ret;
++	}
++#endif
++
++	if (request_irq(pci->irq, snd_ad1889_interrupt,
++			SA_INTERRUPT|SA_SHIRQ, "ad1889", (void*)dev)) {
++		printk(KERN_ERR PFX "cannot obtain IRQ %d\n", pci->irq);
++		err = -EBUSY;
++		goto free_and_ret;
++	}
++
++	dev->irq = pci->irq;
++
++	snd_ad1889_init(dev);
++
++	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, 
++				  dev, &ops)) < 0) {
++		goto free_and_ret;
++	}
++
++	*rchip = dev;
++
++	return 0;
++
++free_and_ret:
++	snd_ad1889_free(dev);
++
++	return err;
++}
++
++/* FIXME */
++#define WAIT_100MS()  do { int __i; for (__i = 0; __i < 100; __i++) udelay(1000); } while(0)
++
++static int
++snd_ad1889_aclink_reset(struct snd_ad1889 *dev)
++{
++	u16 stat;
++	int retry = 200;
++
++	ad1889_writew(dev, AD_DS_CCS, AD_DS_CCS_CLKEN); /* turn on clock */
++	ad1889_readw(dev, AD_DS_CCS); 
++
++	WAIT_100MS();
++
++	stat = ad1889_readw(dev, AD_AC97_ACIC);
++	stat |= AD_AC97_ACIC_ACRD;		/* Reset Disable */
++	ad1889_writew(dev, AD_AC97_ACIC, stat);
++	(void) ad1889_readw(dev, AD_AC97_ACIC);	/* flush posted write */
++
++	udelay(10);
++
++	stat = ad1889_readw(dev, AD_AC97_ACIC);
++	stat |= AD_AC97_ACIC_ACIE;		/* Interface Enable */
++	ad1889_writew(dev, AD_AC97_ACIC, stat);
++
++	do {
++		if (ad1889_readw(dev, AD_AC97_ACIC) & AD_AC97_ACIC_ACRDY)	/* Ready */
++			break;
++		WAIT_100MS();
++		retry--;
++	} while (retry > 0);
++
++	if (!retry) {
++		printk(KERN_ERR "snd_ad1889_aclink_reset: codec is not ready [0x%x]\n",
++			    ad1889_readw(dev, AD_AC97_ACIC));
++		return -EBUSY;
++	}
++
++	/* TODO reset AC97 codec */
++	/* TODO set wave/adc pci ctrl status */
++
++	stat = ad1889_readw(dev, AD_AC97_ACIC);
++	stat |= AD_AC97_ACIC_ASOE;		/* Audio Stream Output Enable */
++	ad1889_writew(dev, AD_AC97_ACIC, stat);
++	(void) ad1889_readw(dev, AD_AC97_ACIC);	/* flush posted write */
++	return 0;
++}
++
++static int __devinit
++snd_ad1889_probe(struct pci_dev *pci,
++		 const struct pci_device_id *pci_id)
++{
++	int err;
++	static int devno;
++	
++	snd_card_t *card;
++	struct snd_ad1889 *dev;
++
++	if (devno >= SNDRV_CARDS)
++		return -ENODEV;
++	if (!enable[devno]) {
++		devno++;
++		return -ENOENT;
++	}
++
++	card = snd_card_new(index[devno], id[devno], THIS_MODULE, 0);
++	if (card == NULL)
++		return -ENOMEM;
++
++	if ((err = snd_ad1889_create(card, pci, &dev)) < 0) {
++		snd_card_free(card);
++		return err;
++	}
++
++	strcpy(card->driver, "ad1889");
++	strcpy(card->shortname, "Analog Devices AD1889");
++	sprintf(card->longname, "%s at 0x%lx irq %i",
++		card->shortname, dev->bar, dev->irq);
++
++	if ((err = snd_ad1889_aclink_reset(dev)) < 0) {
++		snd_card_free(card);
++		return err;
++	}
++
++	if ((err = snd_ad1889_ac97_init(dev)) < 0) {
++		snd_card_free(card);
++		return err;
++	}
++
++#ifdef CONFIG_SND_AD1889_OPL3
++	if ((err = snd_opl3_create_mapped(card, dev->opl3_iobase, dev->opl3_iobase + 2,
++					  OPL3_HW_OPL3, &dev->opl3))) {
++		printk(KERN_ERR PFX "failed to create opl3\n");
++		snd_card_free(card);
++		return err;
++	}
++
++	if ((err = snd_opl3_hwdep_new(dev->opl3, 0, 0, &dev->opl3hwdep))) {
++		printk(KERN_ERR PFX "failed to create opl3hwdep\n");
++		snd_card_free(card);
++		return err;
++	}
++#endif
++
++	if ((err = snd_ad1889_pcm_init(dev, 0, NULL)) < 0) {
++		snd_card_free(card);
++		return err;
++	}
++
++	if ((err = snd_card_register(card)) < 0) {
++		snd_card_free(card);
++		return err;
++	}
++
++	pci_set_drvdata(pci, card);
++
++	devno++;
++	return 0;
++}
++
++static void __devexit
++snd_ad1889_remove(struct pci_dev *pci)
++{
++	snd_card_free(pci_get_drvdata(pci));
++	pci_set_drvdata(pci, NULL);
++}
++
++static struct pci_device_id snd_ad1889_ids[] = {
++	{ PCI_DEVICE(PCI_VENDOR_ID_ANALOG_DEVICES, PCI_DEVICE_ID_AD1889JS) },
++	{ },
++};
++MODULE_DEVICE_TABLE(pci, snd_ad1889_ids);
++
++static struct pci_driver ad1889_pci = {
++        .name = "ad1889",
++        .id_table = snd_ad1889_ids,
++        .probe = snd_ad1889_probe,
++        .remove = __devexit_p(snd_ad1889_remove),
++};
++
++static int __init
++alsa_ad1889_init(void)
++{
++	return pci_module_init(&ad1889_pci);
++}
++
++static void __exit
++alsa_ad1889_fini(void)
++{
++	pci_unregister_driver(&ad1889_pci);
++}
++
++module_init(alsa_ad1889_init);
++module_exit(alsa_ad1889_fini);
++
+diff -urN --exclude-from=/var/www/download/linux-2.6/autobuild/build-tools/dontdiff LINUS_2_6_11/sound/pci/ad1889.h CVS2_6_11_PA2/sound/pci/ad1889.h
+--- LINUS_2_6_11/sound/pci/ad1889.h	1969-12-31 17:00:00.000000000 -0700
++++ CVS2_6_11_PA2/sound/pci/ad1889.h	2005-03-01 09:16:54.000000000 -0700
+@@ -0,0 +1,156 @@
++/* Analog Devices 1889 audio driver
++ * Copyright (C) 2004, Kyle McMartin <kyle at parisc-linux.org>
++ */
++
++#ifndef __AD1889_H__
++#define __AD1889_H__
++
++#define AD_DS_WSMC        0x00 /* wave/synthesis channel mixer control */
++#define AD_DS_WSMC_SYEN 0x0004 /* synthesis channel enable */
++#define AD_DS_WSMC_SYRQ 0x0030 /* synth. fifo request point */
++#define AD_DS_WSMC_WA16 0x0100 /* wave channel 16bit select */
++#define AD_DS_WSMC_WAST 0x0200 /* wave channel stereo select */
++#define AD_DS_WSMC_WAEN 0x0400 /* wave channel enable */
++#define AD_DS_WSMC_WARQ 0x3000 /* wave fifo request point */
++
++#define AD_DS_RAMC        0x02 /* resampler/ADC channel mixer control */
++#define AD_DS_RAMC_AD16 0x0001 /* ADC channel 16bit select */
++#define AD_DS_RAMC_ADST 0x0002 /* ADC channel stereo select */
++#define AD_DS_RAMC_ADEN 0x0004 /* ADC channel enable */
++#define AD_DS_RAMC_ACRQ 0x0030 /* ADC fifo request point */
++#define AD_DS_RAMC_REEN 0x0400 /* resampler channel enable */
++#define AD_DS_RAMC_RERQ 0x3000 /* res. fifo request point */
++
++#define AD_DS_WADA        0x04 /* wave channel mix attenuation */
++#define AD_DS_WADA_RWAM 0x0080 /* right wave mute */
++#define AD_DS_WADA_RWAA 0x001f /* right wave attenuation */
++#define AD_DS_WADA_LWAM 0x8000 /* left wave mute */
++#define AD_DS_WADA_LWAA 0x3e00 /* left wave attenuation */
++
++#define AD_DS_SYDA        0x06 /* synthesis channel mix attenuation */
++#define AD_DS_SYDA_RSYM 0x0080 /* right synthesis mute */
++#define AD_DS_SYDA_RSYA 0x001f /* right synthesis attenuation */
++#define AD_DS_SYDA_LSYM 0x8000 /* left synthesis mute */
++#define AD_DS_SYDA_LSYA 0x3e00 /* left synthesis attenuation */
++
++#define AD_DS_WAS         0x08 /* wave channel sample rate */
++#define AD_DS_WAS_WAS   0xffff /* sample rate mask */
++
++#define AD_DS_RES         0x0a /* resampler channel sample rate */
++#define AD_DS_RES_RES   0xffff /* sample rate mask */
++
++#define AD_DS_CCS	  0x0c /* chip control/status */
++#define AD_DS_CCS_ADO   0x0001 /* ADC channel overflow */
++#define AD_DS_CCS_REO   0x0002 /* resampler channel overflow */
++#define AD_DS_CCS_SYU   0x0004 /* synthesis channel underflow */
++#define AD_DS_CCS_WAU   0x0008 /* wave channel underflow */
++/* bits 4 -> 7, 9, 11 -> 14 reserved */
++#define AD_DS_CCS_XTD   0x0100 /* xtd delay control (4096 clock cycles) */
++#define AD_DS_CCS_PDALL 0x0400 /* power */
++#define AD_DS_CCS_CLKEN 0x8000 /* clock */
++
++#define AD_DMA_WAV        0xb8 /* wave dma control */
++#define AD_DMA_WAV_SGDE 0x0001 /* SGD mode enable */
++#define AD_DMA_WAV_LOOP 0x0002 /* loop enable */
++#define AD_DMA_WAV_IM   0x000c /* interrupt mode mask */
++#define AD_DMA_WAV_IM_DIS (~0x0c) /* interrupt disabled */
++#define AD_DMA_WAV_IM_CNT 0x04 /* interrupt on count */
++#define AD_DMA_WAV_IM_SGD 0x08 /* interrupt on SGD flag */
++#define AD_DMA_WAV_IM_EOL 0x0c /* interrupt on End of Linked List */
++#define AD_DMA_WAV_SGDS 0x0030 /* SGD status */
++#define AD_DMA_WAV_SFLG 0x0040 /* SGD flag */
++#define AD_DMA_WAV_EOL  0x0080 /* SGD end of list */
++/* bits 8 -> 15 reserved */
++
++#define AD_DMA_WAVIC         0x98 /* wave dma interrupt current byte count */
++#define AD_DMA_WAVIC_ICC 0xffffff /* current byte count mask */
++/* bits 24 -> 31 reserved */
++
++#define AD_DMA_WAVIB         0x9c /* wave dma interrupt base byte count */
++#define AD_DMA_WAVIB_IBC 0xffffff /* base byte count mask */
++/* bits 24 -> 31 reserved */
++
++#define AD_DMA_WAVBA         0x70 /* wave base address */
++#define AD_DMA_WAVCA         0x74 /* wave current address */
++#define AD_DMA_WAVBC         0x78 /* wave base count */
++#define AD_DMA_WAVCC         0x7c /* wave current count */
++
++#define AD_DMA_DISR          0xc0 /* dma interrupt status */
++#define AD_DMA_DISR_RESI 0x000001 /* resampler channel interrupt */
++#define AD_DMA_DISR_ADCI 0x000002 /* ADC channel interrupt */
++#define AD_DMA_DISR_SYNI 0x000004 /* synthesis channel interrupt */
++#define AD_DMA_DISR_WAVI 0x000008 /* wave channel interrupt */
++/* bits 4, 5 reserved */
++#define AD_DMA_DISR_SEPS 0x000040 /* serial eeprom status */
++/* bits 7 -> 13 reserved */
++#define AD_DMA_DISR_PMAI 0x004000 /* pci master abort interrupt */
++#define AD_DMA_DISR_PTAI 0x008000 /* pci target abort interrupt */
++#define AD_DMA_DISR_PTAE 0x010000 /* pci target abort interrupt enable */
++#define AD_DMA_DISR_PMAE 0x020000 /* pci master abort interrupt enable */
++/* bits 19 -> 31 reserved */
++
++/* interrupt mask */
++#define AD_INTR_MASK     (AD_DMA_DISR_RESI|AD_DMA_DISR_ADCI| \
++                          AD_DMA_DISR_WAVI|AD_DMA_DISR_SYNI)
++
++#define AD_DMA_CHSS          0xc4 /* dma channel stop status */
++#define AD_DMA_CHSS_RESS 0x000001 /* resampler channel stopped */
++#define AD_DMA_CHSS_ADCS 0x000002 /* ADC channel stopped */
++#define AD_DMA_CHSS_SYNS 0x000004 /* synthesis channel stopped */
++#define AD_DMA_CHSS_WAVS 0x000008 /* wave channel stopped */
++
++#define AD_AC97_BASE        0x100 /* ac97 base register */
++#define AD_AC97_ACIC        0x180 /* ac97 codec interface control */
++#define AD_AC97_ACIC_ACIE  0x0001 /* analog codec interface enable */
++#define AD_AC97_ACIC_ACRD  0x0002 /* analog codec reset disable */
++#define AD_AC97_ACIC_ASOE  0x0004 /* audio stream output enable */
++#define AD_AC97_ACIC_VSRM  0x0008 /* variable sample rate mode */
++#define AD_AC97_ACIC_FSDH  0x0100 /* force SDATA_OUT high */
++#define AD_AC97_ACIC_FSYH  0x0200 /* force sync high */
++#define AD_AC97_ACIC_ACRDY 0x8000 /* analog codec ready status */
++/* bits 10 -> 14 reserved */
++
++#define AD_GPIO_IPC        0xc8 /* gpio port control */
++#define AD_GPIO_IPC_IPC1 0x0001 /* 1 */
++#define AD_GPIO_IPC_IPC2 0x0002 /* 2 */
++#define AD_GPIO_IPC_IPC3 0x0004 /* 3 */
++#define AD_GPIO_IPC_IPC4 0x0008 /* 4 */
++#define AD_GPIO_IPC_IPC5 0x0010 /* 5 */
++#define AD_GPIO_IPC_IPC6 0x0020 /* 6 */
++#define AD_GPIO_IPC_IPC7 0x0040 /* 7 */
++#define AD_GPIO_IPC_IPC8 0x0080 /* 8 */
++
++#define AD_GPIO_OP         0xca /* gpio output port status */
++#define AD_GPIO_OP_OP1   0x0001 /* 1 */
++#define AD_GPIO_OP_OP2   0x0002 /* 2 */
++#define AD_GPIO_OP_OP3   0x0004 /* 3 */
++#define AD_GPIO_OP_OP4   0x0008 /* 4 */
++#define AD_GPIO_OP_OP5   0x0010 /* 5 */
++#define AD_GPIO_OP_OP6   0x0020 /* 6 */
++#define AD_GPIO_OP_OP7   0x0040 /* 7 */
++#define AD_GPIO_OP_OP8   0x0080 /* 8 */
++
++#define AD_GPIO_IP         0xcc /* gpio input port status */
++#define AD_GPIO_IP_IP1   0x0001 /* 1 */
++#define AD_GPIO_IP_IP2   0x0002 /* 2 */
++#define AD_GPIO_IP_IP3   0x0004 /* 3 */
++#define AD_GPIO_IP_IP4   0x0008 /* 4 */
++#define AD_GPIO_IP_IP5   0x0010 /* 5 */
++#define AD_GPIO_IP_IP6   0x0020 /* 6 */
++#define AD_GPIO_IP_IP7   0x0040 /* 7 */
++#define AD_GPIO_IP_IP8   0x0080 /* 8 */
++
++#define AD_DS_MEMSIZE	512
++#define AD_OPL_MEMSIZE	16
++#define AD_MIDI_MEMSIZE	16
++
++#define AD_WAV_STATE	0
++#define AD_ADC_STATE	1
++#define AD_MAX_STATES	2
++
++#define BUF_SIZE        1024
++#define MAX_BUFS        128
++#define DMA_SIZE	(MAX_BUFS*BUF_SIZE)
++#define NR_HW_CHAN      4
++
++#endif /* __AD1889_H__ */




More information about the Kernel-svn-changes mailing list