linux/debian/patches-arch/hppa.diff

28835 lines
854 KiB
Diff

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@parisc-linux.org
+W: http://www.parisc-linux.org/~kyle/ad1889/
+L: parisc-linux@lists.parisc-linux.org
+S: Maintained
+
ADM1025 HARDWARE MONITOR DRIVER
P: Jean Delvare
M: khali@linux-fr.org
@@ -916,6 +923,13 @@
W: http://hq.pm.waw.pl/hdlc/
S: Maintained
+HARMONY SOUND DRIVER
+P: Kyle McMartin
+M: kyle@parisc-linux.org
+W: http://www.parisc-linux.org/~kyle/harmony/
+L: parisc-linux@lists.parisc-linux.org
+S: Maintained
+
HAYES ESP SERIAL DRIVER
P: Andrew J. Robinson
M: arobinso@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@gmx.de>
* Copyright (c) 2001,2002 Ryan Bradetich
- * Copyright (c) 2004 Thibaut VARENE <varenet@parisc-linux.org>
+ * Copyright (c) 2004-2005 Thibaut VARENE <varenet@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@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@esiee.fr>
- * Copyright (C) 2002-2004 Thibaut VARENE <varenet@esiee.fr>
+ * Copyright (C) 2002-2004 Thibaut VARENE <varenet@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@esiee.fr>
+ * Copyright (C) 2004 Thibaut VARENE <varenet@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@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@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@gnu.org>
+ * Copyright (C) 1999 Matthew Wilcox <willy@bofh.ai>
+ * Copyright (C) 1999-2003 Helge Deller <deller@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@gmx.de>
* Copyright (c) 2002 Laurent Canet <canetl@esiee.fr>
- * Copyright (c) 2002 Thibaut Varene <varenet@esiee.fr>
+ * Copyright (c) 2002 Thibaut Varene <varenet@parisc-linux.org>
* Copyright (c) 2000 Xavier Debacker <debackex@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@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@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@gmx.de>
* Copyright (c) 2002 Laurent Canet <canetl@esiee.fr>
- * Copyright (c) 2002 Thibaut Varene <varenet@esiee.fr>
+ * Copyright (c) 2002 Thibaut Varene <varenet@parisc-linux.org>
*
* Pieces of code based on linux-2.4's hp_mouse.c & hp_keyb.c
* Copyright (c) 1999 Alex deVries <alex@onefishtwo.ca>
@@ -37,8 +37,8 @@
#include <asm/io.h>
#include <asm/parisc-device.h>
-MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@esiee.fr>, Helge Deller <deller@gmx.de>");
-MODULE_DESCRIPTION("HP GSC PS/2 port driver");
+MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@parisc-linux.org>, Helge Deller <deller@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@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@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@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@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@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@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@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@torque.net>
+ * Phil Blundell <Philip.Blundell@pobox.com>
+ * Tim Waugh <tim@cyberelk.demon.co.uk>
+ * Jose Renau <renau@acm.org>
+ * David Campbell <campbell@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@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@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@cologne.de>
- * Stefan Esser <se@mi.Uni-Koeln.de>
- * Copyright (C) 1994 Wolfgang Stanglmeier
- *
- * Other major contributions:
- *
- * NVRAM detection and reading.
- * Copyright (C) 1997 Richard Waltham <dormouse@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@free.fr>
- * Copyright (c) 2003-2004 Matthew Wilcox <matthew@wil.cx>
+ * Copyright (c) 2003-2005 Matthew Wilcox <matthew@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@free.fr>
- * Copyright (c) 2003-2004 Matthew Wilcox <matthew@wil.cx>
+ * Copyright (c) 2003-2005 Matthew Wilcox <matthew@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@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@cologne.de>
- * Stefan Esser <se@mi.Uni-Koeln.de>
- * Copyright (C) 1994 Wolfgang Stanglmeier
- *
- * Other major contributions:
- *
- * NVRAM detection and reading.
- * Copyright (C) 1997 Richard Waltham <dormouse@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@esiee.fr>
- * Copyright (C) 2002 Thibaut Varene <varenet@esiee.fr>
+ * Copyright (C) 2002 Laurent Canet <canetl@esiee.fr>
+ * Copyright (C) 2002 Thibaut Varene <varenet@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@linuxcare.com>
- * Copyright 2000-2002 (c) Helge Deller <deller@gmx.de>
- * Copyright 2001 (c) Matthieu Delahaye <delahaym@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@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@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@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@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@parisc-linux.org>
+ * Based on the OSS AD1889 driver by Randolph Chung <tausq@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@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@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__ */