10910 lines
324 KiB
Diff
10910 lines
324 KiB
Diff
Index: linux-2.6-2.6.12/CREDITS
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/CREDITS 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/CREDITS 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -611,8 +611,7 @@
|
|
N: Randolph Chung
|
|
E: tausq@debian.org
|
|
D: Linux/PA-RISC hacker
|
|
-S: Los Altos, CA 94022
|
|
-S: USA
|
|
+S: Hong Kong
|
|
|
|
N: Juan Jose Ciarlante
|
|
W: http://juanjox.kernelnotes.org/
|
|
Index: linux-2.6-2.6.12/Documentation/parisc/todo
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/Documentation/parisc/todo 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -0,0 +1,82 @@
|
|
+Status 2005-03-07 :
|
|
+-------------------
|
|
+ - Merged to 2.6.11
|
|
+
|
|
+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
|
|
+ - 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)
|
|
Index: linux-2.6-2.6.12/MAINTAINERS
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/MAINTAINERS 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/MAINTAINERS 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -191,6 +191,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
|
|
Index: linux-2.6-2.6.12/arch/ia64/ia32/ia32_signal.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/ia64/ia32/ia32_signal.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/ia64/ia32/ia32_signal.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -24,6 +24,7 @@
|
|
#include <linux/unistd.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/compat.h>
|
|
+#include <linux/compat_siginfo.h>
|
|
|
|
#include <asm/intrinsics.h>
|
|
#include <asm/uaccess.h>
|
|
Index: linux-2.6-2.6.12/arch/ia64/ia32/ia32priv.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/ia64/ia32/ia32priv.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/ia64/ia32/ia32priv.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -225,58 +225,6 @@
|
|
unsigned int st_ino_hi;
|
|
};
|
|
|
|
-typedef struct compat_siginfo {
|
|
- int si_signo;
|
|
- int si_errno;
|
|
- int si_code;
|
|
-
|
|
- union {
|
|
- int _pad[((128/sizeof(int)) - 3)];
|
|
-
|
|
- /* kill() */
|
|
- struct {
|
|
- unsigned int _pid; /* sender's pid */
|
|
- unsigned int _uid; /* sender's uid */
|
|
- } _kill;
|
|
-
|
|
- /* POSIX.1b timers */
|
|
- struct {
|
|
- timer_t _tid; /* timer id */
|
|
- int _overrun; /* overrun count */
|
|
- char _pad[sizeof(unsigned int) - sizeof(int)];
|
|
- compat_sigval_t _sigval; /* same as below */
|
|
- int _sys_private; /* not to be passed to user */
|
|
- } _timer;
|
|
-
|
|
- /* POSIX.1b signals */
|
|
- struct {
|
|
- unsigned int _pid; /* sender's pid */
|
|
- unsigned int _uid; /* sender's uid */
|
|
- compat_sigval_t _sigval;
|
|
- } _rt;
|
|
-
|
|
- /* SIGCHLD */
|
|
- struct {
|
|
- unsigned int _pid; /* which child */
|
|
- unsigned int _uid; /* sender's uid */
|
|
- int _status; /* exit code */
|
|
- compat_clock_t _utime;
|
|
- compat_clock_t _stime;
|
|
- } _sigchld;
|
|
-
|
|
- /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
|
- struct {
|
|
- unsigned int _addr; /* faulting insn/memory ref. */
|
|
- } _sigfault;
|
|
-
|
|
- /* SIGPOLL */
|
|
- struct {
|
|
- int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
|
- int _fd;
|
|
- } _sigpoll;
|
|
- } _sifields;
|
|
-} compat_siginfo_t;
|
|
-
|
|
struct old_linux32_dirent {
|
|
u32 d_ino;
|
|
u32 d_offset;
|
|
Index: linux-2.6-2.6.12/arch/parisc/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -150,7 +150,7 @@
|
|
|
|
config DISCONTIGMEM
|
|
bool "Discontiguous memory support (EXPERIMENTAL)"
|
|
- depends on EXPERIMENTAL
|
|
+ depends on 64BIT && EXPERIMENTAL
|
|
help
|
|
Say Y to support efficient handling of discontiguous physical memory,
|
|
for architectures which are either NUMA (Non-Uniform Memory Access)
|
|
Index: linux-2.6-2.6.12/arch/parisc/Makefile
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/Makefile 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/Makefile 2005-08-09 17:53:47.000000000 -0400
|
|
@@ -20,13 +20,13 @@
|
|
CHECKFLAGS += -D__hppa__=1
|
|
|
|
ifdef CONFIG_64BIT
|
|
-CROSS_COMPILE := hppa64-linux-
|
|
+CROSS_COMPILE := hppa64-linux-gnu-
|
|
UTS_MACHINE := parisc64
|
|
CHECKFLAGS += -D__LP64__=1 -m64
|
|
else
|
|
MACHINE := $(subst 64,,$(shell uname -m))
|
|
ifneq ($(MACHINE),parisc)
|
|
-CROSS_COMPILE := hppa-linux-
|
|
+CROSS_COMPILE := hppa-linux-gnu-
|
|
endif
|
|
endif
|
|
|
|
@@ -34,6 +34,11 @@
|
|
|
|
OBJCOPY_FLAGS =-O binary -R .note -R .comment -S
|
|
|
|
+GCC_VERSION := $(call cc-version)
|
|
+ifneq ($(shell if [ $(GCC_VERSION) -lt 0303 ] ; then echo "bad"; fi ;),)
|
|
+$(error Sorry, your compiler is too old ($(GCC_VERSION)). GCC v3.3 or above is required.)
|
|
+endif
|
|
+
|
|
cflags-y := -pipe
|
|
|
|
# These flags should be implied by an hppa-linux configuration, but they
|
|
@@ -43,7 +48,7 @@
|
|
# Currently we save and restore fpregs on all kernel entry/interruption paths.
|
|
# If that gets optimized, we might need to disable the use of fpregs in the
|
|
# kernel.
|
|
-#cflags-y += -mdisable-fpregs
|
|
+cflags-y += -mdisable-fpregs
|
|
|
|
# Without this, "ld -r" results in .text sections that are too big
|
|
# (> 0x40000) for branches to reach stubs.
|
|
Index: linux-2.6-2.6.12/arch/parisc/configs/712_defconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/configs/712_defconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/configs/712_defconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1,12 +1,16 @@
|
|
#
|
|
# Automatically generated make config: don't edit
|
|
-# Linux kernel version: 2.6.10-pa5
|
|
-# Wed Jan 5 13:20:32 2005
|
|
+# Linux kernel version: 2.6.12-rc4-pa2
|
|
+# Wed May 11 23:02:52 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
|
|
+CONFIG_ISA_DMA_API=y
|
|
|
|
#
|
|
# Code maturity level options
|
|
@@ -15,6 +19,7 @@
|
|
# CONFIG_CLEAN_COMPILE is not set
|
|
CONFIG_BROKEN=y
|
|
CONFIG_BROKEN_ON_SMP=y
|
|
+CONFIG_INIT_ENV_ARG_LIMIT=32
|
|
|
|
#
|
|
# General setup
|
|
@@ -26,7 +31,6 @@
|
|
# 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
|
|
@@ -35,15 +39,18 @@
|
|
CONFIG_KALLSYMS=y
|
|
CONFIG_KALLSYMS_ALL=y
|
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
|
+CONFIG_PRINTK=y
|
|
+CONFIG_BUG=y
|
|
+CONFIG_BASE_FULL=y
|
|
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
|
|
+CONFIG_BASE_SMALL=0
|
|
|
|
#
|
|
# Loadable module support
|
|
@@ -65,9 +72,7 @@
|
|
# CONFIG_PA7300LC is not set
|
|
# CONFIG_PA8X00 is not set
|
|
CONFIG_PA11=y
|
|
-# CONFIG_64BIT is not set
|
|
# CONFIG_SMP is not set
|
|
-# CONFIG_DISCONTIGMEM is not set
|
|
# CONFIG_PREEMPT is not set
|
|
# CONFIG_HPUX is not set
|
|
|
|
@@ -81,8 +86,6 @@
|
|
# CONFIG_GSC_WAX is not set
|
|
# CONFIG_EISA is not set
|
|
# CONFIG_PCI is not set
|
|
-CONFIG_CHASSIS_LCD_LED=y
|
|
-# CONFIG_PDC_CHASSIS is not set
|
|
|
|
#
|
|
# PCCARD (PCMCIA/CardBus) support
|
|
@@ -90,12 +93,15 @@
|
|
# CONFIG_PCCARD is not set
|
|
|
|
#
|
|
-# PC-card bridges
|
|
+# PCI Hotplug Support
|
|
#
|
|
|
|
#
|
|
-# PCI Hotplug Support
|
|
+# PA-RISC specific drivers
|
|
#
|
|
+CONFIG_CHASSIS_LCD_LED=y
|
|
+# CONFIG_PDC_CHASSIS is not set
|
|
+CONFIG_PDC_STABLE=y
|
|
|
|
#
|
|
# Executable file formats
|
|
@@ -125,11 +131,9 @@
|
|
#
|
|
CONFIG_PARPORT=y
|
|
CONFIG_PARPORT_PC=m
|
|
-CONFIG_PARPORT_PC_CML1=m
|
|
# CONFIG_PARPORT_PC_FIFO is not set
|
|
# CONFIG_PARPORT_PC_SUPERIO is not set
|
|
CONFIG_PARPORT_GSC=y
|
|
-# CONFIG_PARPORT_OTHER is not set
|
|
# CONFIG_PARPORT_1284 is not set
|
|
|
|
#
|
|
@@ -141,6 +145,7 @@
|
|
#
|
|
# CONFIG_BLK_DEV_FD is not set
|
|
# CONFIG_PARIDE is not set
|
|
+# CONFIG_BLK_DEV_COW_COMMON is not set
|
|
CONFIG_BLK_DEV_LOOP=y
|
|
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
|
# CONFIG_BLK_DEV_NBD is not set
|
|
@@ -158,6 +163,7 @@
|
|
CONFIG_IOSCHED_AS=y
|
|
CONFIG_IOSCHED_DEADLINE=y
|
|
CONFIG_IOSCHED_CFQ=y
|
|
+CONFIG_ATA_OVER_ETH=m
|
|
|
|
#
|
|
# ATA/ATAPI/MFM/RLL support
|
|
@@ -192,6 +198,7 @@
|
|
#
|
|
CONFIG_SCSI_SPI_ATTRS=y
|
|
# CONFIG_SCSI_FC_ATTRS is not set
|
|
+CONFIG_SCSI_ISCSI_ATTRS=m
|
|
|
|
#
|
|
# SCSI low-level drivers
|
|
@@ -200,7 +207,6 @@
|
|
# CONFIG_SCSI_PPA is not set
|
|
# CONFIG_SCSI_IMM is not set
|
|
CONFIG_SCSI_LASI700=y
|
|
-CONFIG_53C700_MEM_MAPPED=y
|
|
CONFIG_53C700_LE_ON_BE=y
|
|
# CONFIG_SCSI_ZALON is not set
|
|
CONFIG_SCSI_DEBUG=m
|
|
@@ -243,7 +249,6 @@
|
|
#
|
|
CONFIG_PACKET=y
|
|
CONFIG_PACKET_MMAP=y
|
|
-CONFIG_NETLINK_DEV=y
|
|
CONFIG_UNIX=y
|
|
CONFIG_NET_KEY=m
|
|
CONFIG_INET=y
|
|
@@ -321,7 +326,6 @@
|
|
CONFIG_IP_NF_TARGET_REDIRECT=m
|
|
CONFIG_IP_NF_TARGET_NETMAP=m
|
|
CONFIG_IP_NF_TARGET_SAME=m
|
|
-# CONFIG_IP_NF_NAT_LOCAL is not set
|
|
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
|
CONFIG_IP_NF_NAT_IRC=m
|
|
CONFIG_IP_NF_NAT_FTP=m
|
|
@@ -340,8 +344,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
|
|
|
|
@@ -383,7 +385,6 @@
|
|
CONFIG_BONDING=m
|
|
# CONFIG_EQUALIZER is not set
|
|
CONFIG_TUN=m
|
|
-# CONFIG_ETHERTAP is not set
|
|
|
|
#
|
|
# Ethernet (10 or 100Mbit)
|
|
@@ -460,19 +461,6 @@
|
|
# CONFIG_INPUT_EVBUG is not set
|
|
|
|
#
|
|
-# Input I/O drivers
|
|
-#
|
|
-# CONFIG_GAMEPORT is not set
|
|
-CONFIG_SOUND_GAMEPORT=y
|
|
-CONFIG_SERIO=y
|
|
-CONFIG_SERIO_SERPORT=y
|
|
-# CONFIG_SERIO_PARKBD is not set
|
|
-CONFIG_SERIO_GSCPS2=y
|
|
-CONFIG_HP_SDC=y
|
|
-CONFIG_HIL_MLC=y
|
|
-# CONFIG_SERIO_RAW is not set
|
|
-
|
|
-#
|
|
# Input Device Drivers
|
|
#
|
|
CONFIG_INPUT_KEYBOARD=y
|
|
@@ -483,6 +471,7 @@
|
|
# CONFIG_KEYBOARD_LKKBD is not set
|
|
# CONFIG_KEYBOARD_XTKBD is not set
|
|
# CONFIG_KEYBOARD_NEWTON is not set
|
|
+CONFIG_KEYBOARD_HIL_OLD=y
|
|
# CONFIG_KEYBOARD_HIL is not set
|
|
CONFIG_INPUT_MOUSE=y
|
|
CONFIG_MOUSE_PS2=y
|
|
@@ -494,6 +483,20 @@
|
|
# CONFIG_INPUT_MISC is not set
|
|
|
|
#
|
|
+# Hardware I/O ports
|
|
+#
|
|
+CONFIG_SERIO=y
|
|
+CONFIG_SERIO_SERPORT=y
|
|
+# CONFIG_SERIO_PARKBD is not set
|
|
+CONFIG_SERIO_GSCPS2=y
|
|
+CONFIG_HP_SDC=y
|
|
+CONFIG_HIL_MLC=y
|
|
+CONFIG_SERIO_LIBPS2=y
|
|
+# CONFIG_SERIO_RAW is not set
|
|
+# CONFIG_GAMEPORT is not set
|
|
+CONFIG_SOUND_GAMEPORT=y
|
|
+
|
|
+#
|
|
# Character devices
|
|
#
|
|
CONFIG_VT=y
|
|
@@ -546,12 +549,15 @@
|
|
#
|
|
# 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
|
|
|
|
#
|
|
+# TPM devices
|
|
+#
|
|
+
|
|
+#
|
|
# I2C support
|
|
#
|
|
# CONFIG_I2C is not set
|
|
@@ -579,19 +585,25 @@
|
|
# Graphics support
|
|
#
|
|
CONFIG_FB=y
|
|
+CONFIG_FB_CFB_FILLRECT=y
|
|
+CONFIG_FB_CFB_COPYAREA=y
|
|
+CONFIG_FB_CFB_IMAGEBLIT=y
|
|
+CONFIG_FB_SOFT_CURSOR=y
|
|
+# CONFIG_FB_MACMODES is not set
|
|
CONFIG_FB_MODE_HELPERS=y
|
|
CONFIG_FB_TILEBLITTING=y
|
|
CONFIG_FB_STI=y
|
|
+# CONFIG_FB_S1D13XXX is not set
|
|
# CONFIG_FB_VIRTUAL is not set
|
|
|
|
#
|
|
# Console display driver support
|
|
#
|
|
-CONFIG_STI_CONSOLE=y
|
|
+CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_DUMMY_CONSOLE_COLUMNS=128
|
|
CONFIG_DUMMY_CONSOLE_ROWS=48
|
|
-CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
+CONFIG_STI_CONSOLE=y
|
|
CONFIG_FONTS=y
|
|
CONFIG_FONT_8x8=y
|
|
CONFIG_FONT_8x16=y
|
|
@@ -610,6 +622,7 @@
|
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
|
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
|
CONFIG_LOGO_PARISC_CLUT224=y
|
|
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
|
|
|
#
|
|
# Sound
|
|
@@ -657,10 +670,6 @@
|
|
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
|
|
|
#
|
|
-# 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
|
|
@@ -671,6 +680,11 @@
|
|
# CONFIG_MMC is not set
|
|
|
|
#
|
|
+# InfiniBand support
|
|
+#
|
|
+# CONFIG_INFINIBAND is not set
|
|
+
|
|
+#
|
|
# File systems
|
|
#
|
|
CONFIG_EXT2_FS=y
|
|
@@ -682,10 +696,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
|
|
@@ -838,13 +858,18 @@
|
|
#
|
|
# Kernel hacking
|
|
#
|
|
+# CONFIG_PRINTK_TIME is not set
|
|
CONFIG_DEBUG_KERNEL=y
|
|
CONFIG_MAGIC_SYSRQ=y
|
|
+CONFIG_LOG_BUF_SHIFT=16
|
|
# CONFIG_SCHEDSTATS is not set
|
|
# CONFIG_DEBUG_SLAB is not set
|
|
# CONFIG_DEBUG_SPINLOCK is not set
|
|
+# CONFIG_DEBUG_SPINLOCK_SLEEP 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
|
|
|
|
#
|
|
# Security options
|
|
@@ -865,6 +890,7 @@
|
|
CONFIG_CRYPTO_SHA256=m
|
|
CONFIG_CRYPTO_SHA512=m
|
|
CONFIG_CRYPTO_WP512=m
|
|
+CONFIG_CRYPTO_TGR192=m
|
|
CONFIG_CRYPTO_DES=y
|
|
CONFIG_CRYPTO_BLOWFISH=m
|
|
CONFIG_CRYPTO_TWOFISH=m
|
|
@@ -882,6 +908,10 @@
|
|
CONFIG_CRYPTO_TEST=m
|
|
|
|
#
|
|
+# Hardware crypto devices
|
|
+#
|
|
+
|
|
+#
|
|
# Library routines
|
|
#
|
|
CONFIG_CRC_CCITT=m
|
|
Index: linux-2.6-2.6.12/arch/parisc/configs/a500_defconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/configs/a500_defconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/configs/a500_defconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1,7 +1,7 @@
|
|
#
|
|
# Automatically generated make config: don't edit
|
|
-# Linux kernel version: 2.6.11-rc4-pa1
|
|
-# Wed Feb 16 11:32:49 2005
|
|
+# Linux kernel version: 2.6.12-rc4-pa2
|
|
+# Wed May 11 23:04:06 2005
|
|
#
|
|
CONFIG_PARISC=y
|
|
CONFIG_MMU=y
|
|
@@ -10,6 +10,7 @@
|
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|
CONFIG_GENERIC_HARDIRQS=y
|
|
CONFIG_GENERIC_IRQ_PROBE=y
|
|
+CONFIG_ISA_DMA_API=y
|
|
|
|
#
|
|
# Code maturity level options
|
|
@@ -19,6 +20,7 @@
|
|
CONFIG_BROKEN=y
|
|
CONFIG_BROKEN_ON_SMP=y
|
|
CONFIG_LOCK_KERNEL=y
|
|
+CONFIG_INIT_ENV_ARG_LIMIT=32
|
|
|
|
#
|
|
# General setup
|
|
@@ -30,15 +32,18 @@
|
|
# 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_CPUSETS is not set
|
|
CONFIG_EMBEDDED=y
|
|
CONFIG_KALLSYMS=y
|
|
CONFIG_KALLSYMS_ALL=y
|
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
|
+CONFIG_PRINTK=y
|
|
+CONFIG_BUG=y
|
|
+CONFIG_BASE_FULL=y
|
|
CONFIG_FUTEX=y
|
|
CONFIG_EPOLL=y
|
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
@@ -48,6 +53,7 @@
|
|
CONFIG_CC_ALIGN_LOOPS=0
|
|
CONFIG_CC_ALIGN_JUMPS=0
|
|
# CONFIG_TINY_SHMEM is not set
|
|
+CONFIG_BASE_SMALL=0
|
|
|
|
#
|
|
# Loadable module support
|
|
@@ -86,6 +92,7 @@
|
|
CONFIG_PCI=y
|
|
CONFIG_PCI_LEGACY_PROC=y
|
|
CONFIG_PCI_NAMES=y
|
|
+# CONFIG_PCI_DEBUG is not set
|
|
CONFIG_PCI_LBA=y
|
|
CONFIG_IOSAPIC=y
|
|
CONFIG_IOMMU_SBA=y
|
|
@@ -259,6 +266,7 @@
|
|
CONFIG_SCSI_QLA2300=m
|
|
CONFIG_SCSI_QLA2322=m
|
|
CONFIG_SCSI_QLA6312=m
|
|
+# CONFIG_SCSI_LPFC is not set
|
|
# CONFIG_SCSI_DC395x is not set
|
|
# CONFIG_SCSI_DC390T is not set
|
|
CONFIG_SCSI_DEBUG=m
|
|
@@ -312,7 +320,6 @@
|
|
#
|
|
CONFIG_PACKET=y
|
|
CONFIG_PACKET_MMAP=y
|
|
-CONFIG_NETLINK_DEV=y
|
|
CONFIG_UNIX=y
|
|
CONFIG_NET_KEY=m
|
|
CONFIG_INET=y
|
|
@@ -449,7 +456,6 @@
|
|
CONFIG_BONDING=m
|
|
# CONFIG_EQUALIZER is not set
|
|
CONFIG_TUN=m
|
|
-# CONFIG_ETHERTAP is not set
|
|
|
|
#
|
|
# ARCnet devices
|
|
@@ -491,7 +497,6 @@
|
|
# CONFIG_DGRS is not set
|
|
CONFIG_EEPRO100=m
|
|
CONFIG_E100=m
|
|
-CONFIG_E100_NAPI=y
|
|
# CONFIG_FEALNX is not set
|
|
CONFIG_NATSEMI=m
|
|
# CONFIG_NE2K_PCI is not set
|
|
@@ -633,13 +638,6 @@
|
|
# 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
|
|
@@ -649,6 +647,13 @@
|
|
# CONFIG_INPUT_MISC is not set
|
|
|
|
#
|
|
+# Hardware I/O ports
|
|
+#
|
|
+# CONFIG_SERIO is not set
|
|
+# CONFIG_GAMEPORT is not set
|
|
+CONFIG_SOUND_GAMEPORT=y
|
|
+
|
|
+#
|
|
# Character devices
|
|
#
|
|
CONFIG_VT=y
|
|
@@ -677,6 +682,7 @@
|
|
CONFIG_PDC_CONSOLE=y
|
|
CONFIG_SERIAL_CORE=y
|
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
|
+# CONFIG_SERIAL_JSM is not set
|
|
CONFIG_UNIX98_PTYS=y
|
|
# CONFIG_LEGACY_PTYS is not set
|
|
|
|
@@ -708,6 +714,11 @@
|
|
CONFIG_MAX_RAW_DEVS=256
|
|
|
|
#
|
|
+# TPM devices
|
|
+#
|
|
+# CONFIG_TCG_TPM is not set
|
|
+
|
|
+#
|
|
# I2C support
|
|
#
|
|
# CONFIG_I2C is not set
|
|
@@ -742,6 +753,10 @@
|
|
CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_DUMMY_CONSOLE_COLUMNS=160
|
|
CONFIG_DUMMY_CONSOLE_ROWS=64
|
|
+CONFIG_STI_CONSOLE=y
|
|
+# CONFIG_FONTS is not set
|
|
+CONFIG_FONT_8x8=y
|
|
+CONFIG_FONT_8x16=y
|
|
|
|
#
|
|
# Sound
|
|
@@ -751,13 +766,9 @@
|
|
#
|
|
# 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
|
|
-#
|
|
+# CONFIG_USB is not set
|
|
|
|
#
|
|
# USB Gadget Support
|
|
@@ -950,11 +961,14 @@
|
|
#
|
|
# Kernel hacking
|
|
#
|
|
+# CONFIG_PRINTK_TIME is not set
|
|
CONFIG_DEBUG_KERNEL=y
|
|
CONFIG_MAGIC_SYSRQ=y
|
|
+CONFIG_LOG_BUF_SHIFT=16
|
|
# CONFIG_SCHEDSTATS is not set
|
|
# CONFIG_DEBUG_SLAB is not set
|
|
# CONFIG_DEBUG_SPINLOCK is not set
|
|
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
|
# CONFIG_DEBUG_KOBJECT is not set
|
|
# CONFIG_DEBUG_INFO is not set
|
|
# CONFIG_DEBUG_IOREMAP is not set
|
|
@@ -980,6 +994,7 @@
|
|
CONFIG_CRYPTO_SHA256=m
|
|
CONFIG_CRYPTO_SHA512=m
|
|
CONFIG_CRYPTO_WP512=m
|
|
+CONFIG_CRYPTO_TGR192=m
|
|
CONFIG_CRYPTO_DES=m
|
|
CONFIG_CRYPTO_BLOWFISH=m
|
|
CONFIG_CRYPTO_TWOFISH=m
|
|
Index: linux-2.6-2.6.12/arch/parisc/configs/b180_defconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/configs/b180_defconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/configs/b180_defconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1,12 +1,16 @@
|
|
#
|
|
# Automatically generated make config: don't edit
|
|
-# Linux kernel version: 2.6.10-pa5
|
|
-# Wed Jan 5 13:35:54 2005
|
|
+# Linux kernel version: 2.6.12-rc4-pa2
|
|
+# Wed May 11 23:04:20 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
|
|
+CONFIG_ISA_DMA_API=y
|
|
|
|
#
|
|
# Code maturity level options
|
|
@@ -14,6 +18,7 @@
|
|
# CONFIG_EXPERIMENTAL is not set
|
|
CONFIG_CLEAN_COMPILE=y
|
|
CONFIG_BROKEN_ON_SMP=y
|
|
+CONFIG_INIT_ENV_ARG_LIMIT=32
|
|
|
|
#
|
|
# General setup
|
|
@@ -24,23 +29,26 @@
|
|
# CONFIG_BSD_PROCESS_ACCT is not set
|
|
CONFIG_SYSCTL=y
|
|
# CONFIG_AUDIT is not set
|
|
-CONFIG_LOG_BUF_SHIFT=16
|
|
# CONFIG_HOTPLUG is not set
|
|
CONFIG_KOBJECT_UEVENT=y
|
|
-# CONFIG_IKCONFIG is not set
|
|
+CONFIG_IKCONFIG=y
|
|
+CONFIG_IKCONFIG_PROC=y
|
|
# CONFIG_EMBEDDED is not set
|
|
CONFIG_KALLSYMS=y
|
|
# CONFIG_KALLSYMS_ALL is not set
|
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
|
+CONFIG_PRINTK=y
|
|
+CONFIG_BUG=y
|
|
+CONFIG_BASE_FULL=y
|
|
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
|
|
+CONFIG_BASE_SMALL=0
|
|
|
|
#
|
|
# Loadable module support
|
|
@@ -60,7 +68,6 @@
|
|
# CONFIG_PA7300LC is not set
|
|
# CONFIG_PA8X00 is not set
|
|
CONFIG_PA11=y
|
|
-# CONFIG_64BIT is not set
|
|
# CONFIG_SMP is not set
|
|
# CONFIG_PREEMPT is not set
|
|
# CONFIG_HPUX is not set
|
|
@@ -79,10 +86,25 @@
|
|
CONFIG_PCI=y
|
|
CONFIG_PCI_LEGACY_PROC=y
|
|
CONFIG_PCI_NAMES=y
|
|
+# CONFIG_PCI_DEBUG is not set
|
|
CONFIG_GSC_DINO=y
|
|
# CONFIG_PCI_LBA is not set
|
|
+
|
|
+#
|
|
+# PCCARD (PCMCIA/CardBus) support
|
|
+#
|
|
+# CONFIG_PCCARD is not set
|
|
+
|
|
+#
|
|
+# PCI Hotplug Support
|
|
+#
|
|
+
|
|
+#
|
|
+# PA-RISC specific drivers
|
|
+#
|
|
CONFIG_CHASSIS_LCD_LED=y
|
|
# CONFIG_PDC_CHASSIS is not set
|
|
+CONFIG_PDC_STABLE=y
|
|
|
|
#
|
|
# Executable file formats
|
|
@@ -99,6 +121,7 @@
|
|
#
|
|
CONFIG_STANDALONE=y
|
|
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
|
+# CONFIG_FW_LOADER is not set
|
|
# CONFIG_DEBUG_DRIVER is not set
|
|
|
|
#
|
|
@@ -111,10 +134,8 @@
|
|
#
|
|
CONFIG_PARPORT=y
|
|
CONFIG_PARPORT_PC=y
|
|
-CONFIG_PARPORT_PC_CML1=y
|
|
# CONFIG_PARPORT_SERIAL is not set
|
|
CONFIG_PARPORT_GSC=y
|
|
-# CONFIG_PARPORT_OTHER is not set
|
|
# CONFIG_PARPORT_1284 is not set
|
|
|
|
#
|
|
@@ -131,6 +152,7 @@
|
|
# 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_COW_COMMON is not set
|
|
CONFIG_BLK_DEV_LOOP=y
|
|
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
|
# CONFIG_BLK_DEV_NBD is not set
|
|
@@ -149,6 +171,7 @@
|
|
CONFIG_IOSCHED_AS=y
|
|
CONFIG_IOSCHED_DEADLINE=y
|
|
CONFIG_IOSCHED_CFQ=y
|
|
+CONFIG_ATA_OVER_ETH=y
|
|
|
|
#
|
|
# ATA/ATAPI/MFM/RLL support
|
|
@@ -183,6 +206,7 @@
|
|
#
|
|
CONFIG_SCSI_SPI_ATTRS=y
|
|
# CONFIG_SCSI_FC_ATTRS is not set
|
|
+# CONFIG_SCSI_ISCSI_ATTRS is not set
|
|
|
|
#
|
|
# SCSI low-level drivers
|
|
@@ -207,7 +231,6 @@
|
|
# CONFIG_SCSI_DMX3191D is not set
|
|
# CONFIG_SCSI_DTC3280 is not set
|
|
# CONFIG_SCSI_EATA is not set
|
|
-# CONFIG_SCSI_EATA_PIO is not set
|
|
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
|
# CONFIG_SCSI_GDTH is not set
|
|
# CONFIG_SCSI_GENERIC_NCR5380 is not set
|
|
@@ -219,7 +242,6 @@
|
|
# CONFIG_SCSI_IMM is not set
|
|
# CONFIG_SCSI_NCR53C406A is not set
|
|
CONFIG_SCSI_LASI700=y
|
|
-CONFIG_53C700_MEM_MAPPED=y
|
|
CONFIG_53C700_LE_ON_BE=y
|
|
CONFIG_SCSI_SYM53C8XX_2=y
|
|
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
|
|
@@ -231,7 +253,6 @@
|
|
# CONFIG_SCSI_PAS16 is not set
|
|
# CONFIG_SCSI_PSI240I is not set
|
|
# CONFIG_SCSI_QLOGIC_FAS is not set
|
|
-# CONFIG_SCSI_QLOGIC_ISP is not set
|
|
# CONFIG_SCSI_QLOGIC_FC is not set
|
|
# CONFIG_SCSI_QLOGIC_1280 is not set
|
|
CONFIG_SCSI_QLA2XXX=y
|
|
@@ -240,7 +261,7 @@
|
|
# CONFIG_SCSI_QLA2300 is not set
|
|
# CONFIG_SCSI_QLA2322 is not set
|
|
# CONFIG_SCSI_QLA6312 is not set
|
|
-# CONFIG_SCSI_QLA6322 is not set
|
|
+# CONFIG_SCSI_LPFC is not set
|
|
# CONFIG_SCSI_SIM710 is not set
|
|
# CONFIG_SCSI_SYM53C416 is not set
|
|
# CONFIG_SCSI_DC390T is not set
|
|
@@ -263,6 +284,7 @@
|
|
CONFIG_MD_RAID0=y
|
|
CONFIG_MD_RAID1=y
|
|
CONFIG_MD_RAID5=y
|
|
+CONFIG_MD_RAID6=y
|
|
# CONFIG_MD_MULTIPATH is not set
|
|
# CONFIG_MD_FAULTY is not set
|
|
# CONFIG_BLK_DEV_DM is not set
|
|
@@ -292,7 +314,6 @@
|
|
#
|
|
CONFIG_PACKET=y
|
|
CONFIG_PACKET_MMAP=y
|
|
-CONFIG_NETLINK_DEV=y
|
|
CONFIG_UNIX=y
|
|
# CONFIG_NET_KEY is not set
|
|
CONFIG_INET=y
|
|
@@ -311,7 +332,14 @@
|
|
# CONFIG_INET_IPCOMP is not set
|
|
# CONFIG_INET_TUNNEL is not set
|
|
CONFIG_IP_TCPDIAG=y
|
|
-# CONFIG_IP_TCPDIAG_IPV6 is not set
|
|
+CONFIG_IP_TCPDIAG_IPV6=y
|
|
+CONFIG_IPV6=y
|
|
+# CONFIG_IPV6_PRIVACY is not set
|
|
+# CONFIG_INET6_AH is not set
|
|
+# CONFIG_INET6_ESP is not set
|
|
+# CONFIG_INET6_IPCOMP is not set
|
|
+# CONFIG_INET6_TUNNEL is not set
|
|
+# CONFIG_IPV6_TUNNEL is not set
|
|
# CONFIG_NETFILTER is not set
|
|
# CONFIG_BRIDGE is not set
|
|
# CONFIG_VLAN_8021Q is not set
|
|
@@ -464,23 +492,12 @@
|
|
# CONFIG_INPUT_EVBUG is not set
|
|
|
|
#
|
|
-# Input I/O drivers
|
|
-#
|
|
-# CONFIG_GAMEPORT is not set
|
|
-CONFIG_SOUND_GAMEPORT=y
|
|
-CONFIG_SERIO=y
|
|
-# CONFIG_SERIO_SERPORT is not set
|
|
-# CONFIG_SERIO_PARKBD is not set
|
|
-CONFIG_SERIO_GSCPS2=y
|
|
-# CONFIG_HP_SDC is not set
|
|
-# CONFIG_SERIO_PCIPS2 is not set
|
|
-# CONFIG_SERIO_RAW is not set
|
|
-
|
|
-#
|
|
# Input Device Drivers
|
|
#
|
|
CONFIG_INPUT_KEYBOARD=y
|
|
-# CONFIG_KEYBOARD_ATKBD is not set
|
|
+CONFIG_KEYBOARD_ATKBD=y
|
|
+CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
|
|
+# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
|
|
# CONFIG_KEYBOARD_SUNKBD is not set
|
|
# CONFIG_KEYBOARD_LKKBD is not set
|
|
# CONFIG_KEYBOARD_XTKBD is not set
|
|
@@ -488,7 +505,7 @@
|
|
# CONFIG_KEYBOARD_HIL_OLD is not set
|
|
# CONFIG_KEYBOARD_HIL is not set
|
|
CONFIG_INPUT_MOUSE=y
|
|
-# CONFIG_MOUSE_PS2 is not set
|
|
+CONFIG_MOUSE_PS2=y
|
|
# CONFIG_MOUSE_SERIAL is not set
|
|
# CONFIG_MOUSE_INPORT is not set
|
|
# CONFIG_MOUSE_LOGIBM is not set
|
|
@@ -502,6 +519,20 @@
|
|
# CONFIG_HP_SDC_RTC is not set
|
|
|
|
#
|
|
+# Hardware I/O ports
|
|
+#
|
|
+CONFIG_SERIO=y
|
|
+# CONFIG_SERIO_SERPORT is not set
|
|
+# CONFIG_SERIO_PARKBD is not set
|
|
+CONFIG_SERIO_GSCPS2=y
|
|
+# CONFIG_HP_SDC is not set
|
|
+# CONFIG_SERIO_PCIPS2 is not set
|
|
+CONFIG_SERIO_LIBPS2=y
|
|
+# CONFIG_SERIO_RAW is not set
|
|
+# CONFIG_GAMEPORT is not set
|
|
+CONFIG_SOUND_GAMEPORT=y
|
|
+
|
|
+#
|
|
# Character devices
|
|
#
|
|
CONFIG_VT=y
|
|
@@ -529,6 +560,7 @@
|
|
# CONFIG_PDC_CONSOLE is not set
|
|
CONFIG_SERIAL_CORE=y
|
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
|
+# CONFIG_SERIAL_JSM is not set
|
|
CONFIG_UNIX98_PTYS=y
|
|
CONFIG_LEGACY_PTYS=y
|
|
CONFIG_LEGACY_PTY_COUNT=256
|
|
@@ -555,11 +587,14 @@
|
|
#
|
|
# Ftape, the floppy tape device driver
|
|
#
|
|
-# CONFIG_AGP is not set
|
|
# CONFIG_DRM is not set
|
|
# CONFIG_RAW_DRIVER is not set
|
|
|
|
#
|
|
+# TPM devices
|
|
+#
|
|
+
|
|
+#
|
|
# I2C support
|
|
#
|
|
# CONFIG_I2C is not set
|
|
@@ -587,6 +622,11 @@
|
|
# Graphics support
|
|
#
|
|
CONFIG_FB=y
|
|
+CONFIG_FB_CFB_FILLRECT=y
|
|
+CONFIG_FB_CFB_COPYAREA=y
|
|
+CONFIG_FB_CFB_IMAGEBLIT=y
|
|
+CONFIG_FB_SOFT_CURSOR=y
|
|
+# CONFIG_FB_MACMODES is not set
|
|
# CONFIG_FB_MODE_HELPERS is not set
|
|
# CONFIG_FB_TILEBLITTING is not set
|
|
# CONFIG_FB_CIRRUS is not set
|
|
@@ -595,6 +635,7 @@
|
|
# CONFIG_FB_ASILIANT is not set
|
|
# CONFIG_FB_IMSTT is not set
|
|
CONFIG_FB_STI=y
|
|
+# CONFIG_FB_NVIDIA is not set
|
|
# CONFIG_FB_RIVA is not set
|
|
# CONFIG_FB_MATROX is not set
|
|
# CONFIG_FB_RADEON_OLD is not set
|
|
@@ -607,17 +648,17 @@
|
|
# CONFIG_FB_3DFX is not set
|
|
# CONFIG_FB_VOODOO1 is not set
|
|
# CONFIG_FB_TRIDENT is not set
|
|
+# CONFIG_FB_S1D13XXX is not set
|
|
# CONFIG_FB_VIRTUAL is not set
|
|
|
|
#
|
|
# Console display driver support
|
|
#
|
|
-# CONFIG_MDA_CONSOLE is not set
|
|
-CONFIG_STI_CONSOLE=y
|
|
+CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_DUMMY_CONSOLE_COLUMNS=160
|
|
CONFIG_DUMMY_CONSOLE_ROWS=64
|
|
-CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
+CONFIG_STI_CONSOLE=y
|
|
# CONFIG_FONTS is not set
|
|
CONFIG_FONT_8x8=y
|
|
CONFIG_FONT_8x16=y
|
|
@@ -630,6 +671,7 @@
|
|
CONFIG_LOGO_LINUX_VGA16=y
|
|
CONFIG_LOGO_LINUX_CLUT224=y
|
|
CONFIG_LOGO_PARISC_CLUT224=y
|
|
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
|
|
|
#
|
|
# Sound
|
|
@@ -639,13 +681,9 @@
|
|
#
|
|
# 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
|
|
-#
|
|
+# CONFIG_USB is not set
|
|
|
|
#
|
|
# USB Gadget Support
|
|
@@ -658,6 +696,11 @@
|
|
# CONFIG_MMC is not set
|
|
|
|
#
|
|
+# InfiniBand support
|
|
+#
|
|
+# CONFIG_INFINIBAND is not set
|
|
+
|
|
+#
|
|
# File systems
|
|
#
|
|
CONFIG_EXT2_FS=y
|
|
@@ -668,6 +711,10 @@
|
|
# CONFIG_JBD_DEBUG is not set
|
|
# CONFIG_REISERFS_FS is not set
|
|
# CONFIG_JFS_FS is not set
|
|
+
|
|
+#
|
|
+# XFS support
|
|
+#
|
|
# CONFIG_XFS_FS is not set
|
|
# CONFIG_MINIX_FS is not set
|
|
# CONFIG_ROMFS_FS is not set
|
|
@@ -727,7 +774,8 @@
|
|
CONFIG_LOCKD_V4=y
|
|
CONFIG_EXPORTFS=y
|
|
CONFIG_SUNRPC=y
|
|
-# CONFIG_SMB_FS is not set
|
|
+CONFIG_SMB_FS=y
|
|
+# CONFIG_SMB_NLS_DEFAULT is not set
|
|
# CONFIG_CIFS is not set
|
|
# CONFIG_NCP_FS is not set
|
|
# CONFIG_CODA_FS is not set
|
|
@@ -785,13 +833,18 @@
|
|
#
|
|
# Kernel hacking
|
|
#
|
|
+# CONFIG_PRINTK_TIME is not set
|
|
CONFIG_DEBUG_KERNEL=y
|
|
CONFIG_MAGIC_SYSRQ=y
|
|
+CONFIG_LOG_BUF_SHIFT=16
|
|
# CONFIG_SCHEDSTATS is not set
|
|
# CONFIG_DEBUG_SLAB is not set
|
|
# CONFIG_DEBUG_SPINLOCK is not set
|
|
+# CONFIG_DEBUG_SPINLOCK_SLEEP 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
|
|
|
|
#
|
|
# Security options
|
|
@@ -815,6 +868,7 @@
|
|
# CONFIG_CRYPTO_SHA256 is not set
|
|
# CONFIG_CRYPTO_SHA512 is not set
|
|
# CONFIG_CRYPTO_WP512 is not set
|
|
+# CONFIG_CRYPTO_TGR192 is not set
|
|
# CONFIG_CRYPTO_DES is not set
|
|
# CONFIG_CRYPTO_BLOWFISH is not set
|
|
# CONFIG_CRYPTO_TWOFISH is not set
|
|
@@ -832,6 +886,10 @@
|
|
# CONFIG_CRYPTO_TEST is not set
|
|
|
|
#
|
|
+# Hardware crypto devices
|
|
+#
|
|
+
|
|
+#
|
|
# Library routines
|
|
#
|
|
# CONFIG_CRC_CCITT is not set
|
|
Index: linux-2.6-2.6.12/arch/parisc/configs/c3000_defconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/configs/c3000_defconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/configs/c3000_defconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1,12 +1,16 @@
|
|
#
|
|
# Automatically generated make config: don't edit
|
|
-# Linux kernel version: 2.6.10-pa5
|
|
-# Wed Jan 5 13:26:49 2005
|
|
+# Linux kernel version: 2.6.12-rc4-pa2
|
|
+# Wed May 11 23:06:15 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
|
|
+CONFIG_ISA_DMA_API=y
|
|
|
|
#
|
|
# Code maturity level options
|
|
@@ -15,6 +19,7 @@
|
|
# CONFIG_CLEAN_COMPILE is not set
|
|
CONFIG_BROKEN=y
|
|
CONFIG_BROKEN_ON_SMP=y
|
|
+CONFIG_INIT_ENV_ARG_LIMIT=32
|
|
|
|
#
|
|
# General setup
|
|
@@ -26,7 +31,6 @@
|
|
# 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
|
|
@@ -35,6 +39,9 @@
|
|
CONFIG_KALLSYMS=y
|
|
CONFIG_KALLSYMS_ALL=y
|
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
|
+CONFIG_PRINTK=y
|
|
+CONFIG_BUG=y
|
|
+CONFIG_BASE_FULL=y
|
|
CONFIG_FUTEX=y
|
|
CONFIG_EPOLL=y
|
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
@@ -44,6 +51,7 @@
|
|
CONFIG_CC_ALIGN_LOOPS=0
|
|
CONFIG_CC_ALIGN_JUMPS=0
|
|
# CONFIG_TINY_SHMEM is not set
|
|
+CONFIG_BASE_SMALL=0
|
|
|
|
#
|
|
# Loadable module support
|
|
@@ -66,10 +74,8 @@
|
|
CONFIG_PA8X00=y
|
|
CONFIG_PA20=y
|
|
CONFIG_PREFETCH=y
|
|
-# CONFIG_PARISC64 is not set
|
|
# CONFIG_64BIT is not set
|
|
# CONFIG_SMP is not set
|
|
-# CONFIG_DISCONTIGMEM is not set
|
|
# CONFIG_PREEMPT is not set
|
|
# CONFIG_HPUX is not set
|
|
|
|
@@ -80,12 +86,10 @@
|
|
CONFIG_PCI=y
|
|
CONFIG_PCI_LEGACY_PROC=y
|
|
CONFIG_PCI_NAMES=y
|
|
+# CONFIG_PCI_DEBUG is not set
|
|
CONFIG_PCI_LBA=y
|
|
CONFIG_IOSAPIC=y
|
|
CONFIG_IOMMU_SBA=y
|
|
-CONFIG_SUPERIO=y
|
|
-CONFIG_CHASSIS_LCD_LED=y
|
|
-# CONFIG_PDC_CHASSIS is not set
|
|
|
|
#
|
|
# PCCARD (PCMCIA/CardBus) support
|
|
@@ -93,13 +97,17 @@
|
|
# CONFIG_PCCARD is not set
|
|
|
|
#
|
|
-# PC-card bridges
|
|
+# PCI Hotplug Support
|
|
#
|
|
+# CONFIG_HOTPLUG_PCI is not set
|
|
|
|
#
|
|
-# PCI Hotplug Support
|
|
+# PA-RISC specific drivers
|
|
#
|
|
-# CONFIG_HOTPLUG_PCI is not set
|
|
+CONFIG_SUPERIO=y
|
|
+CONFIG_CHASSIS_LCD_LED=y
|
|
+# CONFIG_PDC_CHASSIS is not set
|
|
+CONFIG_PDC_STABLE=y
|
|
|
|
#
|
|
# Executable file formats
|
|
@@ -141,6 +149,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
|
|
@@ -158,6 +167,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
|
|
@@ -243,6 +253,7 @@
|
|
#
|
|
CONFIG_SCSI_SPI_ATTRS=y
|
|
CONFIG_SCSI_FC_ATTRS=m
|
|
+CONFIG_SCSI_ISCSI_ATTRS=m
|
|
|
|
#
|
|
# SCSI low-level drivers
|
|
@@ -264,6 +275,7 @@
|
|
CONFIG_SCSI_ATA_PIIX=m
|
|
# CONFIG_SCSI_SATA_NV is not set
|
|
CONFIG_SCSI_SATA_PROMISE=m
|
|
+# CONFIG_SCSI_SATA_QSTOR is not set
|
|
# CONFIG_SCSI_SATA_SX4 is not set
|
|
CONFIG_SCSI_SATA_SIL=m
|
|
# CONFIG_SCSI_SATA_SIS is not set
|
|
@@ -299,7 +311,7 @@
|
|
CONFIG_SCSI_QLA2300=m
|
|
CONFIG_SCSI_QLA2322=m
|
|
CONFIG_SCSI_QLA6312=m
|
|
-CONFIG_SCSI_QLA6322=m
|
|
+# CONFIG_SCSI_LPFC is not set
|
|
# CONFIG_SCSI_DC395x is not set
|
|
# CONFIG_SCSI_DC390T is not set
|
|
# CONFIG_SCSI_NSP32 is not set
|
|
@@ -323,6 +335,8 @@
|
|
# CONFIG_DM_SNAPSHOT is not set
|
|
# CONFIG_DM_MIRROR is not set
|
|
# CONFIG_DM_ZERO is not set
|
|
+CONFIG_DM_MULTIPATH=m
|
|
+# CONFIG_DM_MULTIPATH_EMC is not set
|
|
|
|
#
|
|
# Fusion MPT device support
|
|
@@ -351,7 +365,6 @@
|
|
#
|
|
CONFIG_PACKET=y
|
|
CONFIG_PACKET_MMAP=y
|
|
-CONFIG_NETLINK_DEV=y
|
|
CONFIG_UNIX=y
|
|
CONFIG_NET_KEY=m
|
|
CONFIG_INET=y
|
|
@@ -443,8 +456,6 @@
|
|
CONFIG_IP_NF_ARPTABLES=m
|
|
CONFIG_IP_NF_ARPFILTER=m
|
|
CONFIG_IP_NF_ARP_MANGLE=m
|
|
-CONFIG_IP_NF_COMPAT_IPCHAINS=m
|
|
-CONFIG_IP_NF_COMPAT_IPFWADM=m
|
|
CONFIG_XFRM=y
|
|
CONFIG_XFRM_USER=m
|
|
|
|
@@ -486,7 +497,6 @@
|
|
CONFIG_BONDING=m
|
|
# CONFIG_EQUALIZER is not set
|
|
CONFIG_TUN=m
|
|
-# CONFIG_ETHERTAP is not set
|
|
|
|
#
|
|
# ARCnet devices
|
|
@@ -524,9 +534,7 @@
|
|
# 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 is not set
|
|
# CONFIG_FEALNX is not set
|
|
CONFIG_NATSEMI=m
|
|
# CONFIG_NE2K_PCI is not set
|
|
@@ -622,16 +630,6 @@
|
|
# CONFIG_INPUT_EVBUG is not set
|
|
|
|
#
|
|
-# Input I/O drivers
|
|
-#
|
|
-# CONFIG_GAMEPORT is not set
|
|
-CONFIG_SOUND_GAMEPORT=y
|
|
-CONFIG_SERIO=m
|
|
-CONFIG_SERIO_SERPORT=m
|
|
-# CONFIG_SERIO_PCIPS2 is not set
|
|
-# CONFIG_SERIO_RAW is not set
|
|
-
|
|
-#
|
|
# Input Device Drivers
|
|
#
|
|
CONFIG_INPUT_KEYBOARD=y
|
|
@@ -649,6 +647,17 @@
|
|
# CONFIG_INPUT_MISC is not set
|
|
|
|
#
|
|
+# Hardware I/O ports
|
|
+#
|
|
+CONFIG_SERIO=m
|
|
+CONFIG_SERIO_SERPORT=m
|
|
+# CONFIG_SERIO_PCIPS2 is not set
|
|
+CONFIG_SERIO_LIBPS2=m
|
|
+# CONFIG_SERIO_RAW is not set
|
|
+# CONFIG_GAMEPORT is not set
|
|
+CONFIG_SOUND_GAMEPORT=y
|
|
+
|
|
+#
|
|
# Character devices
|
|
#
|
|
CONFIG_VT=y
|
|
@@ -676,6 +685,7 @@
|
|
# CONFIG_PDC_CONSOLE is not set
|
|
CONFIG_SERIAL_CORE=y
|
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
|
+# CONFIG_SERIAL_JSM is not set
|
|
CONFIG_UNIX98_PTYS=y
|
|
CONFIG_LEGACY_PTYS=y
|
|
CONFIG_LEGACY_PTY_COUNT=256
|
|
@@ -698,12 +708,16 @@
|
|
#
|
|
# 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
|
|
|
|
#
|
|
+# TPM devices
|
|
+#
|
|
+# CONFIG_TCG_TPM is not set
|
|
+
|
|
+#
|
|
# I2C support
|
|
#
|
|
# CONFIG_I2C is not set
|
|
@@ -731,6 +745,11 @@
|
|
# Graphics support
|
|
#
|
|
CONFIG_FB=y
|
|
+CONFIG_FB_CFB_FILLRECT=y
|
|
+CONFIG_FB_CFB_COPYAREA=y
|
|
+CONFIG_FB_CFB_IMAGEBLIT=y
|
|
+CONFIG_FB_SOFT_CURSOR=y
|
|
+# CONFIG_FB_MACMODES is not set
|
|
# CONFIG_FB_MODE_HELPERS is not set
|
|
# CONFIG_FB_TILEBLITTING is not set
|
|
# CONFIG_FB_CIRRUS is not set
|
|
@@ -739,6 +758,7 @@
|
|
# CONFIG_FB_ASILIANT is not set
|
|
# CONFIG_FB_IMSTT is not set
|
|
CONFIG_FB_STI=y
|
|
+# CONFIG_FB_NVIDIA is not set
|
|
# CONFIG_FB_RIVA is not set
|
|
# CONFIG_FB_MATROX is not set
|
|
# CONFIG_FB_RADEON_OLD is not set
|
|
@@ -753,16 +773,17 @@
|
|
# CONFIG_FB_VOODOO1 is not set
|
|
# CONFIG_FB_TRIDENT is not set
|
|
# CONFIG_FB_PM3 is not set
|
|
+# CONFIG_FB_S1D13XXX is not set
|
|
# CONFIG_FB_VIRTUAL is not set
|
|
|
|
#
|
|
# Console display driver support
|
|
#
|
|
-CONFIG_STI_CONSOLE=y
|
|
+CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_DUMMY_CONSOLE_COLUMNS=160
|
|
CONFIG_DUMMY_CONSOLE_ROWS=64
|
|
-CONFIG_DUMMY_CONSOLE=y
|
|
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
+CONFIG_STI_CONSOLE=y
|
|
# CONFIG_FONTS is not set
|
|
CONFIG_FONT_8x8=y
|
|
CONFIG_FONT_8x16=y
|
|
@@ -775,6 +796,7 @@
|
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
|
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
|
CONFIG_LOGO_PARISC_CLUT224=y
|
|
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
|
|
|
#
|
|
# Sound
|
|
@@ -794,6 +816,8 @@
|
|
#
|
|
# USB support
|
|
#
|
|
+CONFIG_USB_ARCH_HAS_HCD=y
|
|
+CONFIG_USB_ARCH_HAS_OHCI=y
|
|
CONFIG_USB=y
|
|
CONFIG_USB_DEBUG=y
|
|
|
|
@@ -804,14 +828,14 @@
|
|
# CONFIG_USB_BANDWIDTH is not set
|
|
# CONFIG_USB_DYNAMIC_MINORS is not set
|
|
# CONFIG_USB_OTG is not set
|
|
-CONFIG_USB_ARCH_HAS_HCD=y
|
|
-CONFIG_USB_ARCH_HAS_OHCI=y
|
|
|
|
#
|
|
# USB Host Controller Drivers
|
|
#
|
|
# CONFIG_USB_EHCI_HCD is not set
|
|
CONFIG_USB_OHCI_HCD=y
|
|
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
|
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
|
# CONFIG_USB_UHCI_HCD is not set
|
|
# CONFIG_USB_SL811_HCD is not set
|
|
|
|
@@ -829,12 +853,11 @@
|
|
#
|
|
CONFIG_USB_STORAGE=m
|
|
# CONFIG_USB_STORAGE_DEBUG is not set
|
|
-# CONFIG_USB_STORAGE_RW_DETECT is not set
|
|
CONFIG_USB_STORAGE_DATAFAB=y
|
|
CONFIG_USB_STORAGE_FREECOM=y
|
|
# CONFIG_USB_STORAGE_ISD200 is not set
|
|
CONFIG_USB_STORAGE_DPCM=y
|
|
-CONFIG_USB_STORAGE_HP8200e=y
|
|
+CONFIG_USB_STORAGE_USBAT=y
|
|
CONFIG_USB_STORAGE_SDDR09=y
|
|
CONFIG_USB_STORAGE_SDDR55=y
|
|
CONFIG_USB_STORAGE_JUMPSHOT=y
|
|
@@ -860,7 +883,6 @@
|
|
#
|
|
CONFIG_USB_MDC800=m
|
|
CONFIG_USB_MICROTEK=m
|
|
-CONFIG_USB_HPUSBSCSI=m
|
|
|
|
#
|
|
# USB Multimedia devices
|
|
@@ -879,6 +901,7 @@
|
|
# CONFIG_USB_PEGASUS is not set
|
|
# CONFIG_USB_RTL8150 is not set
|
|
# CONFIG_USB_USBNET is not set
|
|
+CONFIG_USB_MON=m
|
|
|
|
#
|
|
# USB port drivers
|
|
@@ -894,7 +917,6 @@
|
|
#
|
|
# CONFIG_USB_EMI62 is not set
|
|
# CONFIG_USB_EMI26 is not set
|
|
-# CONFIG_USB_TIGL is not set
|
|
# CONFIG_USB_AUERSWALD is not set
|
|
# CONFIG_USB_RIO500 is not set
|
|
CONFIG_USB_LEGOTOWER=m
|
|
@@ -903,6 +925,7 @@
|
|
# CONFIG_USB_CYTHERM is not set
|
|
# CONFIG_USB_PHIDGETKIT is not set
|
|
# CONFIG_USB_PHIDGETSERVO is not set
|
|
+# CONFIG_USB_IDMOUSE is not set
|
|
# CONFIG_USB_TEST is not set
|
|
|
|
#
|
|
@@ -920,6 +943,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
|
|
@@ -930,7 +962,12 @@
|
|
# CONFIG_JBD_DEBUG is not set
|
|
# CONFIG_REISERFS_FS is not set
|
|
# CONFIG_JFS_FS is not set
|
|
+
|
|
+#
|
|
+# 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
|
|
@@ -1074,13 +1111,18 @@
|
|
#
|
|
# Kernel hacking
|
|
#
|
|
+# CONFIG_PRINTK_TIME is not set
|
|
CONFIG_DEBUG_KERNEL=y
|
|
CONFIG_MAGIC_SYSRQ=y
|
|
+CONFIG_LOG_BUF_SHIFT=16
|
|
# CONFIG_SCHEDSTATS is not set
|
|
# CONFIG_DEBUG_SLAB is not set
|
|
# CONFIG_DEBUG_SPINLOCK is not set
|
|
+# CONFIG_DEBUG_SPINLOCK_SLEEP 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
|
|
|
|
#
|
|
# Security options
|
|
@@ -1100,6 +1142,7 @@
|
|
CONFIG_CRYPTO_SHA256=m
|
|
# CONFIG_CRYPTO_SHA512 is not set
|
|
# CONFIG_CRYPTO_WP512 is not set
|
|
+CONFIG_CRYPTO_TGR192=m
|
|
CONFIG_CRYPTO_DES=m
|
|
CONFIG_CRYPTO_BLOWFISH=m
|
|
CONFIG_CRYPTO_TWOFISH=m
|
|
@@ -1117,6 +1160,10 @@
|
|
CONFIG_CRYPTO_TEST=m
|
|
|
|
#
|
|
+# Hardware crypto devices
|
|
+#
|
|
+
|
|
+#
|
|
# Library routines
|
|
#
|
|
CONFIG_CRC_CCITT=m
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/entry.S
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/entry.S 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/entry.S 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -30,14 +30,14 @@
|
|
* - save registers to kernel stack and handle in assembly or C */
|
|
|
|
|
|
+#include <asm/psw.h>
|
|
#include <asm/assembly.h> /* for LDREG/STREG defines */
|
|
#include <asm/pgtable.h>
|
|
-#include <asm/psw.h>
|
|
#include <asm/signal.h>
|
|
#include <asm/unistd.h>
|
|
#include <asm/thread_info.h>
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
#define CMPIB cmpib,*
|
|
#define CMPB cmpb,*
|
|
#define COND(x) *x
|
|
@@ -67,19 +67,22 @@
|
|
|
|
/* Switch to virtual mapping, trashing only %r1 */
|
|
.macro virt_map
|
|
- rsm PSW_SM_Q,%r0
|
|
- tovirt_r1 %r29
|
|
- mfsp %sr7, %r1
|
|
- or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */
|
|
- mtsp %r1, %sr3
|
|
+ /* pcxt_ssm_bug */
|
|
+ rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */
|
|
mtsp %r0, %sr4
|
|
mtsp %r0, %sr5
|
|
+ mfsp %sr7, %r1
|
|
+ or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */
|
|
+ mtsp %r1, %sr3
|
|
+ tovirt_r1 %r29
|
|
+ load32 KERNEL_PSW, %r1
|
|
+
|
|
+ rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */
|
|
mtsp %r0, %sr6
|
|
mtsp %r0, %sr7
|
|
- load32 KERNEL_PSW, %r1
|
|
- mtctl %r1, %cr22
|
|
mtctl %r0, %cr17 /* Clear IIASQ tail */
|
|
mtctl %r0, %cr17 /* Clear IIASQ head */
|
|
+ mtctl %r1, %ipsw
|
|
load32 4f, %r1
|
|
mtctl %r1, %cr18 /* Set IIAOQ tail */
|
|
ldo 4(%r1), %r1
|
|
@@ -214,7 +217,7 @@
|
|
va = r8 /* virtual address for which the trap occured */
|
|
spc = r24 /* space for which the trap occured */
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
|
|
/*
|
|
* itlb miss interruption handler (parisc 1.1 - 32 bit)
|
|
@@ -236,7 +239,7 @@
|
|
|
|
.macro itlb_20 code
|
|
mfctl %pcsq, spc
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
b itlb_miss_20w
|
|
#else
|
|
b itlb_miss_20
|
|
@@ -246,7 +249,7 @@
|
|
.align 32
|
|
.endm
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
/*
|
|
* naitlb miss interruption handler (parisc 1.1 - 32 bit)
|
|
*
|
|
@@ -283,7 +286,7 @@
|
|
.macro naitlb_20 code
|
|
|
|
mfctl %isr,spc
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
b itlb_miss_20w
|
|
#else
|
|
b itlb_miss_20
|
|
@@ -296,7 +299,7 @@
|
|
.align 32
|
|
.endm
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
/*
|
|
* dtlb miss interruption handler (parisc 1.1 - 32 bit)
|
|
*/
|
|
@@ -318,7 +321,7 @@
|
|
.macro dtlb_20 code
|
|
|
|
mfctl %isr, spc
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
b dtlb_miss_20w
|
|
#else
|
|
b dtlb_miss_20
|
|
@@ -328,7 +331,7 @@
|
|
.align 32
|
|
.endm
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
/* nadtlb miss interruption handler (parisc 1.1 - 32 bit) */
|
|
|
|
.macro nadtlb_11 code
|
|
@@ -346,7 +349,7 @@
|
|
.macro nadtlb_20 code
|
|
|
|
mfctl %isr,spc
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
b nadtlb_miss_20w
|
|
#else
|
|
b nadtlb_miss_20
|
|
@@ -356,7 +359,7 @@
|
|
.align 32
|
|
.endm
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
/*
|
|
* dirty bit trap interruption handler (parisc 1.1 - 32 bit)
|
|
*/
|
|
@@ -378,7 +381,7 @@
|
|
.macro dbit_20 code
|
|
|
|
mfctl %isr,spc
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
b dbit_trap_20w
|
|
#else
|
|
b dbit_trap_20
|
|
@@ -391,7 +394,7 @@
|
|
/* The following are simple 32 vs 64 bit instruction
|
|
* abstractions for the macros */
|
|
.macro EXTR reg1,start,length,reg2
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
extrd,u \reg1,32+\start,\length,\reg2
|
|
#else
|
|
extrw,u \reg1,\start,\length,\reg2
|
|
@@ -399,7 +402,7 @@
|
|
.endm
|
|
|
|
.macro DEP reg1,start,length,reg2
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depd \reg1,32+\start,\length,\reg2
|
|
#else
|
|
depw \reg1,\start,\length,\reg2
|
|
@@ -407,7 +410,7 @@
|
|
.endm
|
|
|
|
.macro DEPI val,start,length,reg
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi \val,32+\start,\length,\reg
|
|
#else
|
|
depwi \val,\start,\length,\reg
|
|
@@ -418,7 +421,7 @@
|
|
* fault. We have to extract this and place it in the va,
|
|
* zeroing the corresponding bits in the space register */
|
|
.macro space_adjust spc,va,tmp
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
extrd,u \spc,63,SPACEID_SHIFT,\tmp
|
|
depd %r0,63,SPACEID_SHIFT,\spc
|
|
depd \tmp,31,SPACEID_SHIFT,\va
|
|
@@ -476,7 +479,7 @@
|
|
bb,>=,n \pmd,_PxD_PRESENT_BIT,\fault
|
|
DEP %r0,31,PxD_FLAG_SHIFT,\pmd /* clear flags */
|
|
copy \pmd,%r9
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
shld %r9,PxD_VALUE_SHIFT,\pmd
|
|
#else
|
|
shlw %r9,PxD_VALUE_SHIFT,\pmd
|
|
@@ -607,7 +610,7 @@
|
|
.macro do_alias spc,tmp,tmp1,va,pte,prot,fault
|
|
cmpib,COND(<>),n 0,\spc,\fault
|
|
ldil L%(TMPALIAS_MAP_START),\tmp
|
|
-#if defined(__LP64__) && (TMPALIAS_MAP_START >= 0x80000000)
|
|
+#if defined(CONFIG_64BIT) && (TMPALIAS_MAP_START >= 0x80000000)
|
|
/* on LP64, ldi will sign extend into the upper 32 bits,
|
|
* which is behaviour we don't want */
|
|
depdi 0,31,32,\tmp
|
|
@@ -621,7 +624,7 @@
|
|
* OK, it is in the temp alias region, check whether "from" or "to".
|
|
* Check "subtle" note in pacache.S re: r23/r26.
|
|
*/
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
extrd,u,*= \va,41,1,%r0
|
|
#else
|
|
extrw,u,= \va,9,1,%r0
|
|
@@ -688,7 +691,7 @@
|
|
def 30
|
|
def 31
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
|
|
.export fault_vector_11
|
|
|
|
@@ -761,7 +764,7 @@
|
|
|
|
copy %r30, %r1
|
|
ldo PT_SZ_ALGN(%r30),%r30
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* Yo, function pointers in wide mode are little structs... -PB */
|
|
ldd 24(%r26), %r2
|
|
STREG %r2, PT_GR27(%r1) /* Store childs %dp */
|
|
@@ -777,7 +780,7 @@
|
|
or %r26, %r24, %r26 /* will have kernel mappings. */
|
|
ldi 1, %r25 /* stack_start, signals kernel thread */
|
|
stw %r0, -52(%r30) /* user_tid */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
BL do_fork, %r2
|
|
@@ -806,7 +809,7 @@
|
|
|
|
LDREG TI_TASK-THREAD_SZ_ALGN(%r30), %r1
|
|
LDREG TASK_PT_GR25(%r1), %r26
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
LDREG TASK_PT_GR27(%r1), %r27
|
|
LDREG TASK_PT_GR22(%r1), %r22
|
|
#endif
|
|
@@ -814,11 +817,16 @@
|
|
ble 0(%sr7, %r1)
|
|
copy %r31, %r2
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
loadgp /* Thread could have been in a module */
|
|
#endif
|
|
+#ifndef CONFIG_64BIT
|
|
b sys_exit
|
|
+#else
|
|
+ load32 sys_exit, %r1
|
|
+ bv %r0(%r1)
|
|
+#endif
|
|
ldi 0, %r26
|
|
|
|
.import sys_execve, code
|
|
@@ -830,7 +838,7 @@
|
|
STREG %r26, PT_GR26(%r16)
|
|
STREG %r25, PT_GR25(%r16)
|
|
STREG %r24, PT_GR24(%r16)
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
BL sys_execve, %r2
|
|
@@ -888,9 +896,6 @@
|
|
* this way, then we will need to copy %sr3 in to PT_SR[3..7], and
|
|
* adjust IASQ[0..1].
|
|
*
|
|
- * Note that the following code uses a "relied upon translation".
|
|
- * See the parisc ACD for details. The ssm is necessary due to a
|
|
- * PCXT bug.
|
|
*/
|
|
|
|
.align 4096
|
|
@@ -911,7 +916,7 @@
|
|
STREG %r19,PT_IAOQ1(%r16)
|
|
LDREG PT_PSW(%r16),%r19
|
|
load32 USER_PSW_MASK,%r1
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
load32 USER_PSW_HI_MASK,%r20
|
|
depd %r20,31,32,%r1
|
|
#endif
|
|
@@ -955,7 +960,7 @@
|
|
/* shift left ____cacheline_aligned (aka L1_CACHE_BYTES) amount
|
|
** irq_stat[] is defined using ____cacheline_aligned.
|
|
*/
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
shld %r1, 6, %r20
|
|
#else
|
|
shlw %r1, 5, %r20
|
|
@@ -985,24 +990,19 @@
|
|
rest_fp %r1
|
|
rest_general %r29
|
|
|
|
- /* Create a "relied upon translation" PA 2.0 Arch. F-5 */
|
|
- ssm 0,%r0
|
|
- nop
|
|
- nop
|
|
- nop
|
|
- nop
|
|
- nop
|
|
- nop
|
|
- nop
|
|
+ /* inverse of virt_map */
|
|
+ pcxt_ssm_bug
|
|
+ rsm PSW_SM_QUIET,%r0 /* prepare for rfi */
|
|
tophys_r1 %r29
|
|
- rsm (PSW_SM_Q|PSW_SM_P|PSW_SM_D|PSW_SM_I),%r0
|
|
|
|
/* Restore space id's and special cr's from PT_REGS
|
|
- * structure pointed to by r29 */
|
|
+ * structure pointed to by r29
|
|
+ */
|
|
rest_specials %r29
|
|
|
|
- /* Important: Note that rest_stack restores r29
|
|
- * last (we are using it)! It also restores r1 and r30. */
|
|
+ /* IMPORTANT: rest_stack restores r29 last (we are using it)!
|
|
+ * It also restores r1 and r30.
|
|
+ */
|
|
rest_stack
|
|
|
|
rfi
|
|
@@ -1017,8 +1017,8 @@
|
|
|
|
.import do_softirq,code
|
|
intr_do_softirq:
|
|
- bl do_softirq,%r2
|
|
-#ifdef __LP64__
|
|
+ BL do_softirq,%r2
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#else
|
|
nop
|
|
@@ -1036,12 +1036,17 @@
|
|
CMPIB= 0,%r20,intr_restore /* backward */
|
|
nop
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
ldil L%intr_check_sig, %r2
|
|
+#ifndef CONFIG_64BIT
|
|
b schedule
|
|
+#else
|
|
+ load32 schedule, %r20
|
|
+ bv %r0(%r20)
|
|
+#endif
|
|
ldo R%intr_check_sig(%r2), %r2
|
|
|
|
|
|
@@ -1064,7 +1069,7 @@
|
|
|
|
copy %r0, %r24 /* unsigned long in_syscall */
|
|
copy %r16, %r25 /* struct pt_regs *regs */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
@@ -1088,7 +1093,7 @@
|
|
mfctl %cr31,%r1
|
|
copy %r30,%r17
|
|
/* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi 0,63,15,%r17
|
|
#else
|
|
depi 0,31,15,%r17
|
|
@@ -1115,7 +1120,7 @@
|
|
|
|
ldil L%intr_return, %r2
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
@@ -1153,15 +1158,17 @@
|
|
|
|
CMPIB=,n 6,%r26,skip_save_ior
|
|
|
|
- /* save_specials left ipsw value in r8 for us to test */
|
|
|
|
mfctl %cr20, %r16 /* isr */
|
|
+ nop /* serialize mfctl on PA 2.0 to avoid 4 cycle penalty */
|
|
mfctl %cr21, %r17 /* ior */
|
|
|
|
-#ifdef __LP64__
|
|
+
|
|
+#ifdef CONFIG_64BIT
|
|
/*
|
|
* If the interrupted code was running with W bit off (32 bit),
|
|
* clear the b bits (bits 0 & 1) in the ior.
|
|
+ * save_specials left ipsw value in r8 for us to test.
|
|
*/
|
|
extrd,u,*<> %r8,PSW_W_BIT,1,%r0
|
|
depdi 0,1,2,%r17
|
|
@@ -1192,7 +1199,7 @@
|
|
loadgp
|
|
|
|
copy %r29, %r25 /* arg1 is pt_regs */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
@@ -1230,7 +1237,7 @@
|
|
spc = r24 /* space for which the trap occured */
|
|
ptp = r25 /* page directory/page table pointer */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
|
|
dtlb_miss_20w:
|
|
space_adjust spc,va,t0
|
|
@@ -1487,10 +1494,10 @@
|
|
add,l %r1,%r24,%r1 /* doesn't affect c/b bits */
|
|
|
|
nadtlb_nullify:
|
|
- mfctl %cr22,%r8 /* Get ipsw */
|
|
+ mfctl %ipsw,%r8
|
|
ldil L%PSW_N,%r9
|
|
or %r8,%r9,%r8 /* Set PSW_N */
|
|
- mtctl %r8,%cr22
|
|
+ mtctl %r8,%ipsw
|
|
|
|
rfir
|
|
nop
|
|
@@ -1521,7 +1528,7 @@
|
|
nop
|
|
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
itlb_miss_20w:
|
|
|
|
/*
|
|
@@ -1588,7 +1595,7 @@
|
|
|
|
#endif
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
|
|
dbit_trap_20w:
|
|
space_adjust spc,va,t0
|
|
@@ -1797,7 +1804,7 @@
|
|
|
|
STREG %r2,-RP_OFFSET(%r30)
|
|
ldo FRAME_SIZE(%r30),%r30
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
@@ -1847,7 +1854,7 @@
|
|
|
|
STREG %r2,-RP_OFFSET(%r30)
|
|
ldo FRAME_SIZE(%r30),%r30
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
@@ -1869,7 +1876,7 @@
|
|
|
|
STREG %r2,-RP_OFFSET(%r30)
|
|
ldo FRAME_SIZE(%r30),%r30
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
|
|
@@ -1897,10 +1904,10 @@
|
|
|
|
STREG %r2,-RP_OFFSET(%r30)
|
|
ldo FRAME_SIZE(%r30),%r30
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
- bl \execve,%r2
|
|
+ BL \execve,%r2
|
|
copy %r1,%arg0
|
|
|
|
ldo -FRAME_SIZE(%r30),%r30
|
|
@@ -1923,7 +1930,7 @@
|
|
sys_execve_wrapper:
|
|
execve_wrapper sys_execve
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
.export sys32_execve_wrapper
|
|
.import sys32_execve
|
|
|
|
@@ -1937,7 +1944,7 @@
|
|
ldo TASK_REGS(%r26),%r26 /* get pt regs */
|
|
/* Don't save regs, we are going to restore them from sigcontext. */
|
|
STREG %r2, -RP_OFFSET(%r30)
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo FRAME_SIZE(%r30), %r30
|
|
BL sys_rt_sigreturn,%r2
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
@@ -1968,7 +1975,7 @@
|
|
ldo TASK_REGS(%r1),%r24 /* get pt regs */
|
|
LDREG TASK_PT_GR30(%r24),%r24
|
|
STREG %r2, -RP_OFFSET(%r30)
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo FRAME_SIZE(%r30), %r30
|
|
b,l do_sigaltstack,%r2
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
@@ -1982,7 +1989,7 @@
|
|
bv %r0(%r2)
|
|
nop
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
.export sys32_sigaltstack_wrapper
|
|
sys32_sigaltstack_wrapper:
|
|
/* Get the user stack pointer */
|
|
@@ -2006,7 +2013,7 @@
|
|
reg_save %r24
|
|
|
|
STREG %r2, -RP_OFFSET(%r30)
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo FRAME_SIZE(%r30), %r30
|
|
b,l sys_rt_sigsuspend,%r2
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
@@ -2079,7 +2086,7 @@
|
|
ldw TI_CPU-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 /* cpu # */
|
|
|
|
/* shift left ____cacheline_aligned (aka L1_CACHE_BYTES) bits */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
shld %r26, 6, %r20
|
|
#else
|
|
shlw %r26, 5, %r20
|
|
@@ -2144,7 +2151,7 @@
|
|
|
|
depi 3,31,2,%r31 /* ensure return to user mode. */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* decide whether to reset the wide mode bit
|
|
*
|
|
* For a syscall, the W bit is stored in the lowest bit
|
|
@@ -2229,7 +2236,7 @@
|
|
|
|
.import do_softirq,code
|
|
syscall_do_softirq:
|
|
- bl do_softirq,%r2
|
|
+ BL do_softirq,%r2
|
|
nop
|
|
/* NOTE: We enable I-bit incase we schedule later,
|
|
* and we might be going back to userspace if we were
|
|
@@ -2240,7 +2247,7 @@
|
|
.import schedule,code
|
|
syscall_do_resched:
|
|
BL schedule,%r2
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#else
|
|
nop
|
|
@@ -2260,7 +2267,7 @@
|
|
|
|
ldi 1, %r24 /* unsigned long in_syscall */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
BL do_signal,%r2
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/head.S
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/head.S 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/head.S 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -12,7 +12,7 @@
|
|
* Initial Version 04-23-1999 by Helge Deller <deller@gmx.de>
|
|
*/
|
|
|
|
-#include <linux/autoconf.h> /* for CONFIG_SMP */
|
|
+#include <linux/config.h> /* for CONFIG_SMP */
|
|
|
|
#include <asm/offsets.h>
|
|
#include <asm/psw.h>
|
|
@@ -36,10 +36,10 @@
|
|
.align 4
|
|
.import init_thread_union,data
|
|
.import fault_vector_20,code /* IVA parisc 2.0 32 bit */
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
.import fault_vector_11,code /* IVA parisc 1.1 32 bit */
|
|
.import $global$ /* forward declaration */
|
|
-#endif /*!LP64*/
|
|
+#endif /*!CONFIG_64BIT*/
|
|
.export stext
|
|
.export _stext,data /* Kernel want it this way! */
|
|
_stext:
|
|
@@ -76,7 +76,7 @@
|
|
mtctl %r4,%cr24 /* Initialize kernel root pointer */
|
|
mtctl %r4,%cr25 /* Initialize user root pointer */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* Set pmd in pgd */
|
|
load32 PA(pmd0),%r5
|
|
shrd %r5,PxD_VALUE_SHIFT,%r3
|
|
@@ -99,7 +99,7 @@
|
|
stw %r3,0(%r4)
|
|
ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
|
|
addib,> -1,%r1,1b
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo ASM_PMD_ENTRY_SIZE(%r4),%r4
|
|
#else
|
|
ldo ASM_PGD_ENTRY_SIZE(%r4),%r4
|
|
@@ -170,7 +170,7 @@
|
|
stw %r0,0x28(%r0) /* MEM_RENDEZ_HI */
|
|
#endif /*CONFIG_SMP*/
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
tophys_r1 %sp
|
|
|
|
/* Save the rfi target address */
|
|
@@ -224,8 +224,6 @@
|
|
mtctl %r0,%cr12
|
|
mtctl %r0,%cr13
|
|
|
|
- /* Prepare to RFI! Man all the cannons! */
|
|
-
|
|
/* Initialize the global data pointer */
|
|
loadgp
|
|
|
|
@@ -235,7 +233,7 @@
|
|
* following short sequence of instructions can determine this
|
|
* (without being illegal on a PA1.1 machine).
|
|
*/
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
ldi 32,%r10
|
|
mtctl %r10,%cr11
|
|
.level 2.0
|
|
@@ -248,52 +246,22 @@
|
|
|
|
$is_pa20:
|
|
.level LEVEL /* restore 1.1 || 2.0w */
|
|
-#endif /*!LP64*/
|
|
+#endif /*!CONFIG_64BIT*/
|
|
load32 PA(fault_vector_20),%r10
|
|
|
|
$install_iva:
|
|
mtctl %r10,%cr14
|
|
|
|
-#ifdef __LP64__
|
|
- b aligned_rfi
|
|
+ b aligned_rfi /* Prepare to RFI! Man all the cannons! */
|
|
nop
|
|
|
|
- .align 256
|
|
+ .align 128
|
|
aligned_rfi:
|
|
- ssm 0,0
|
|
- nop /* 1 */
|
|
- nop /* 2 */
|
|
- nop /* 3 */
|
|
- nop /* 4 */
|
|
- nop /* 5 */
|
|
- nop /* 6 */
|
|
- nop /* 7 */
|
|
- nop /* 8 */
|
|
-#endif
|
|
-
|
|
-#ifdef __LP64__ /* move to psw.h? */
|
|
-#define PSW_BITS PSW_Q+PSW_I+PSW_D+PSW_P+PSW_R
|
|
-#else
|
|
-#define PSW_BITS PSW_SM_Q
|
|
-#endif
|
|
+ pcxt_ssm_bug
|
|
|
|
-$rfi:
|
|
- /* turn off troublesome PSW bits */
|
|
- rsm PSW_BITS,%r0
|
|
-
|
|
- /* kernel PSW:
|
|
- * - no interruptions except HPMC and TOC (which are handled by PDC)
|
|
- * - Q bit set (IODC / PDC interruptions)
|
|
- * - big-endian
|
|
- * - virtually mapped
|
|
- */
|
|
- load32 KERNEL_PSW,%r10
|
|
- mtctl %r10,%ipsw
|
|
+ rsm PSW_SM_QUIET,%r0 /* off troublesome PSW bits */
|
|
+ /* Don't need NOPs, have 8 compliant insn before rfi */
|
|
|
|
- /* Set the space pointers for the post-RFI world
|
|
- ** Clear the two-level IIA Space Queue, effectively setting
|
|
- ** Kernel space.
|
|
- */
|
|
mtctl %r0,%cr17 /* Clear IIASQ tail */
|
|
mtctl %r0,%cr17 /* Clear IIASQ head */
|
|
|
|
@@ -301,8 +269,11 @@
|
|
mtctl %r11,%cr18 /* IIAOQ head */
|
|
ldo 4(%r11),%r11
|
|
mtctl %r11,%cr18 /* IIAOQ tail */
|
|
+
|
|
+ load32 KERNEL_PSW,%r10
|
|
+ mtctl %r10,%ipsw
|
|
|
|
- /* Jump to hyperspace */
|
|
+ /* Jump through hyperspace to Virt Mode */
|
|
rfi
|
|
nop
|
|
|
|
@@ -313,7 +284,7 @@
|
|
.import smp_init_current_idle_task,data
|
|
.import smp_callin,code
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
smp_callin_rtn:
|
|
.proc
|
|
.callinfo
|
|
@@ -321,7 +292,7 @@
|
|
nop
|
|
nop
|
|
.procend
|
|
-#endif /*!LP64*/
|
|
+#endif /*!CONFIG_64BIT*/
|
|
|
|
/***************************************************************************
|
|
* smp_slave_stext is executed by all non-monarch Processors when the Monarch
|
|
@@ -356,7 +327,7 @@
|
|
mtctl %r4,%cr24 /* Initialize kernel root pointer */
|
|
mtctl %r4,%cr25 /* Initialize user root pointer */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* Setup PDCE_PROC entry */
|
|
copy %arg0,%r3
|
|
#else
|
|
@@ -373,7 +344,7 @@
|
|
|
|
.procend
|
|
#endif /* CONFIG_SMP */
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
.data
|
|
|
|
.align 4
|
|
@@ -383,4 +354,4 @@
|
|
.size $global$,4
|
|
$global$:
|
|
.word 0
|
|
-#endif /*!LP64*/
|
|
+#endif /*!CONFIG_64BIT*/
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/ioctl32.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/ioctl32.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/ioctl32.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -104,12 +104,9 @@
|
|
}
|
|
|
|
out:
|
|
- if (kversion.name)
|
|
- kfree(kversion.name);
|
|
- if (kversion.date)
|
|
- kfree(kversion.date);
|
|
- if (kversion.desc)
|
|
- kfree(kversion.desc);
|
|
+ kfree(kversion.name);
|
|
+ kfree(kversion.date);
|
|
+ kfree(kversion.desc);
|
|
return ret;
|
|
}
|
|
|
|
@@ -166,9 +163,7 @@
|
|
ret = -EFAULT;
|
|
}
|
|
|
|
- if (karg.unique != NULL)
|
|
- kfree(karg.unique);
|
|
-
|
|
+ kfree(karg.unique);
|
|
return ret;
|
|
}
|
|
|
|
@@ -265,7 +260,6 @@
|
|
}
|
|
|
|
kfree(karg.list);
|
|
-
|
|
return ret;
|
|
}
|
|
|
|
@@ -305,7 +299,6 @@
|
|
|
|
out:
|
|
kfree(karg.list);
|
|
-
|
|
return ret;
|
|
}
|
|
|
|
@@ -494,15 +487,10 @@
|
|
}
|
|
|
|
out:
|
|
- if (karg.send_indices)
|
|
- kfree(karg.send_indices);
|
|
- if (karg.send_sizes)
|
|
- kfree(karg.send_sizes);
|
|
- if (karg.request_indices)
|
|
- kfree(karg.request_indices);
|
|
- if (karg.request_sizes)
|
|
- kfree(karg.request_sizes);
|
|
-
|
|
+ kfree(karg.send_indices);
|
|
+ kfree(karg.send_sizes);
|
|
+ kfree(karg.request_indices);
|
|
+ kfree(karg.request_sizes);
|
|
return ret;
|
|
}
|
|
|
|
@@ -555,9 +543,7 @@
|
|
ret = -EFAULT;
|
|
}
|
|
|
|
- if (karg.contexts)
|
|
- kfree(karg.contexts);
|
|
-
|
|
+ kfree(karg.contexts);
|
|
return ret;
|
|
}
|
|
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/pacache.S
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/pacache.S 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/pacache.S 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -26,7 +26,7 @@
|
|
* can be used.
|
|
*/
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
#define ADDIB addib,*
|
|
#define CMPB cmpb,*
|
|
#define ANDCM andcm,*
|
|
@@ -40,8 +40,10 @@
|
|
.level 2.0
|
|
#endif
|
|
|
|
-#include <asm/assembly.h>
|
|
+#include <linux/config.h>
|
|
+
|
|
#include <asm/psw.h>
|
|
+#include <asm/assembly.h>
|
|
#include <asm/pgtable.h>
|
|
#include <asm/cache.h>
|
|
|
|
@@ -62,32 +64,23 @@
|
|
* to happen in real mode with all interruptions disabled.
|
|
*/
|
|
|
|
- /*
|
|
- * Once again, we do the rfi dance ... some day we need examine
|
|
- * all of our uses of this type of code and see what can be
|
|
- * consolidated.
|
|
- */
|
|
-
|
|
- rsm PSW_SM_I, %r19 /* relied upon translation! PA 2.0 Arch. F-5 */
|
|
+ /* pcxt_ssm_bug - relied upon translation! PA 2.0 Arch. F-4 and F-5 */
|
|
+ rsm PSW_SM_I, %r19 /* save I-bit state */
|
|
+ load32 PA(1f), %r1
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
- 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
|
|
+
|
|
+ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
|
|
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 */
|
|
+ load32 REAL_MODE_PSW, %r1
|
|
+ mtctl %r1, %ipsw
|
|
rfi
|
|
nop
|
|
|
|
@@ -178,29 +171,36 @@
|
|
ADDIB> -1, %r22, fdtoneloop /* Outer loop count decr */
|
|
add %r21, %r20, %r20 /* increment space */
|
|
|
|
-fdtdone:
|
|
|
|
- /* Switch back to virtual mode */
|
|
+fdtdone:
|
|
+ /*
|
|
+ * Switch back to virtual mode
|
|
+ */
|
|
+ /* pcxt_ssm_bug */
|
|
+ rsm PSW_SM_I, %r0
|
|
+ load32 2f, %r1
|
|
+ nop
|
|
+ nop
|
|
+ nop
|
|
+ nop
|
|
+ nop
|
|
|
|
- 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
|
|
+ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
|
|
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 */
|
|
+ load32 KERNEL_PSW, %r1
|
|
+ or %r1, %r19, %r1 /* I-bit to state on entry */
|
|
+ mtctl %r1, %ipsw /* restore I-bit (entire PSW) */
|
|
rfi
|
|
nop
|
|
|
|
2: bv %r0(%r2)
|
|
nop
|
|
- .exit
|
|
|
|
+ .exit
|
|
.procend
|
|
|
|
.export flush_instruction_cache_local,code
|
|
@@ -238,7 +238,7 @@
|
|
|
|
fisync:
|
|
sync
|
|
- mtsm %r22
|
|
+ mtsm %r22 /* restore I-bit */
|
|
bv %r0(%r2)
|
|
nop
|
|
.exit
|
|
@@ -281,7 +281,7 @@
|
|
fdsync:
|
|
syncdma
|
|
sync
|
|
- mtsm %r22
|
|
+ mtsm %r22 /* restore I-bit */
|
|
bv %r0(%r2)
|
|
nop
|
|
.exit
|
|
@@ -296,7 +296,7 @@
|
|
.callinfo NO_CALLS
|
|
.entry
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* 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.
|
|
@@ -351,7 +351,11 @@
|
|
std %r22, 120(%r26)
|
|
ldo 128(%r26), %r26
|
|
|
|
- ADDIB> -1, %r1, 1b /* bundle 10 */
|
|
+ /* conditional branches nullify on forward taken branch, and on
|
|
+ * non-taken backward branch. Note that .+4 is a backwards branch.
|
|
+ * The ldd should only get executed if the branch is taken.
|
|
+ */
|
|
+ ADDIB>,n -1, %r1, 1b /* bundle 10 */
|
|
ldd 0(%r25), %r19 /* start next loads */
|
|
|
|
#else
|
|
@@ -363,10 +367,10 @@
|
|
* the full 64 bit register values on interrupt, we can't
|
|
* use ldd/std on a 32 bit kernel.
|
|
*/
|
|
+ ldw 0(%r25), %r19
|
|
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
|
|
|
|
1:
|
|
- ldw 0(%r25), %r19
|
|
ldw 4(%r25), %r20
|
|
ldw 8(%r25), %r21
|
|
ldw 12(%r25), %r22
|
|
@@ -396,11 +400,12 @@
|
|
ldw 60(%r25), %r22
|
|
stw %r19, 48(%r26)
|
|
stw %r20, 52(%r26)
|
|
+ ldo 64(%r25), %r25
|
|
stw %r21, 56(%r26)
|
|
stw %r22, 60(%r26)
|
|
ldo 64(%r26), %r26
|
|
- ADDIB> -1, %r1, 1b
|
|
- ldo 64(%r25), %r25
|
|
+ ADDIB>,n -1, %r1, 1b
|
|
+ ldw 0(%r25), %r19
|
|
#endif
|
|
bv %r0(%r2)
|
|
nop
|
|
@@ -456,7 +461,7 @@
|
|
sub %r25, %r1, %r23 /* move physical addr into non shadowed reg */
|
|
|
|
ldil L%(TMPALIAS_MAP_START), %r28
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
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' */
|
|
@@ -543,7 +548,7 @@
|
|
tophys_r1 %r26
|
|
|
|
ldil L%(TMPALIAS_MAP_START), %r28
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
#if (TMPALIAS_MAP_START >= 0x80000000)
|
|
depdi 0, 31,32, %r28 /* clear any sign extension */
|
|
#endif
|
|
@@ -560,7 +565,7 @@
|
|
|
|
pdtlb 0(%r28)
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldi 32, %r1 /* PAGE_SIZE/128 == 32 */
|
|
|
|
/* PREFETCH (Write) has not (yet) been proven to help here */
|
|
@@ -585,7 +590,7 @@
|
|
ADDIB> -1, %r1, 1b
|
|
ldo 128(%r28), %r28
|
|
|
|
-#else /* ! __LP64 */
|
|
+#else /* ! CONFIG_64BIT */
|
|
|
|
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
|
|
|
|
@@ -608,7 +613,7 @@
|
|
stw %r0, 60(%r28)
|
|
ADDIB> -1, %r1, 1b
|
|
ldo 64(%r28), %r28
|
|
-#endif /* __LP64 */
|
|
+#endif /* CONFIG_64BIT */
|
|
|
|
bv %r0(%r2)
|
|
nop
|
|
@@ -626,7 +631,7 @@
|
|
ldil L%dcache_stride, %r1
|
|
ldw R%dcache_stride(%r1), %r23
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi,z 1, 63-PAGE_SHIFT,1, %r25
|
|
#else
|
|
depwi,z 1, 31-PAGE_SHIFT,1, %r25
|
|
@@ -670,7 +675,7 @@
|
|
ldil L%dcache_stride, %r1
|
|
ldw R%dcache_stride(%r1), %r23
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi,z 1,63-PAGE_SHIFT,1, %r25
|
|
#else
|
|
depwi,z 1,31-PAGE_SHIFT,1, %r25
|
|
@@ -714,7 +719,7 @@
|
|
ldil L%dcache_stride, %r1
|
|
ldw R%dcache_stride(%r1), %r23
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi,z 1, 63-PAGE_SHIFT,1, %r25
|
|
#else
|
|
depwi,z 1, 31-PAGE_SHIFT,1, %r25
|
|
@@ -759,7 +764,7 @@
|
|
ldil L%dcache_stride, %r1
|
|
ldw R%dcache_stride(%r1), %r23
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi,z 1, 63-PAGE_SHIFT,1, %r25
|
|
#else
|
|
depwi,z 1, 31-PAGE_SHIFT,1, %r25
|
|
@@ -807,7 +812,7 @@
|
|
tophys_r1 %r26
|
|
|
|
ldil L%(TMPALIAS_MAP_START), %r28
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
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 */
|
|
@@ -824,7 +829,7 @@
|
|
ldil L%dcache_stride, %r1
|
|
ldw R%dcache_stride(%r1), %r23
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi,z 1, 63-PAGE_SHIFT,1, %r29
|
|
#else
|
|
depwi,z 1, 31-PAGE_SHIFT,1, %r29
|
|
@@ -935,7 +940,7 @@
|
|
ldil L%icache_stride, %r1
|
|
ldw R%icache_stride(%r1), %r23
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
depdi,z 1, 63-PAGE_SHIFT,1, %r25
|
|
#else
|
|
depwi,z 1, 31-PAGE_SHIFT,1, %r25
|
|
@@ -988,11 +993,12 @@
|
|
bv %r0(%r2)
|
|
nop
|
|
.exit
|
|
-
|
|
.procend
|
|
|
|
- .align 128
|
|
-
|
|
+ /* align should cover use of rfi in disable_sr_hashing_asm and
|
|
+ * srdis_done.
|
|
+ */
|
|
+ .align 256
|
|
.export disable_sr_hashing_asm,code
|
|
|
|
disable_sr_hashing_asm:
|
|
@@ -1000,28 +1006,26 @@
|
|
.callinfo NO_CALLS
|
|
.entry
|
|
|
|
- /* Switch to real mode */
|
|
-
|
|
- ssm 0, %r0 /* relied upon translation! */
|
|
- nop
|
|
- nop
|
|
+ /*
|
|
+ * Switch to real mode
|
|
+ */
|
|
+ /* pcxt_ssm_bug */
|
|
+ rsm PSW_SM_I, %r0
|
|
+ load32 PA(1f), %r1
|
|
nop
|
|
nop
|
|
nop
|
|
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
|
|
+
|
|
+ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
|
|
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 */
|
|
+ load32 REAL_MODE_PSW, %r1
|
|
+ mtctl %r1, %ipsw
|
|
rfi
|
|
nop
|
|
|
|
@@ -1053,27 +1057,31 @@
|
|
|
|
srdis_pa20:
|
|
|
|
- /* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+ */
|
|
+ /* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+,PCXW2 */
|
|
|
|
.word 0x144008bc /* mfdiag %dr2, %r28 */
|
|
depdi 0, 54,1, %r28 /* clear DIAG_SPHASH_ENAB (bit 54) */
|
|
.word 0x145c1840 /* mtdiag %r28, %dr2 */
|
|
|
|
-srdis_done:
|
|
|
|
+srdis_done:
|
|
/* Switch back to virtual mode */
|
|
+ rsm PSW_SM_I, %r0 /* prep to load iia queue */
|
|
+ load32 2f, %r1
|
|
+ nop
|
|
+ nop
|
|
+ nop
|
|
+ nop
|
|
+ nop
|
|
|
|
- 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
|
|
+ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
|
|
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 */
|
|
+ load32 KERNEL_PSW, %r1
|
|
+ mtctl %r1, %ipsw
|
|
rfi
|
|
nop
|
|
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/pci-dma.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/pci-dma.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/pci-dma.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -31,7 +31,7 @@
|
|
#include <asm/page.h> /* get_order */
|
|
#include <asm/pgalloc.h>
|
|
#include <asm/uaccess.h>
|
|
-
|
|
+#include <asm/tlbflush.h> /* for purge_tlb_*() macros */
|
|
|
|
static struct proc_dir_entry * proc_gsc_root = NULL;
|
|
static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/pci.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/pci.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/pci.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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* */
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/pdc_cons.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/pdc_cons.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/pdc_cons.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -41,7 +41,7 @@
|
|
|
|
/* Define EARLY_BOOTUP_DEBUG to debug kernel related boot problems.
|
|
* On production kernels EARLY_BOOTUP_DEBUG should be undefined. */
|
|
-#undef EARLY_BOOTUP_DEBUG
|
|
+#define EARLY_BOOTUP_DEBUG
|
|
|
|
|
|
#include <linux/config.h>
|
|
@@ -49,14 +49,8 @@
|
|
#include <linux/console.h>
|
|
#include <linux/string.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/delay.h>
|
|
-#include <linux/sched.h>
|
|
-#include <linux/interrupt.h>
|
|
#include <linux/major.h>
|
|
#include <linux/tty.h>
|
|
-#include <asm/page.h>
|
|
-#include <asm/types.h>
|
|
-#include <asm/system.h>
|
|
#include <asm/pdc.h> /* for iodc_call() proto and friends */
|
|
|
|
|
|
@@ -96,7 +90,6 @@
|
|
}
|
|
|
|
#if defined(CONFIG_PDC_CONSOLE)
|
|
-#define PDC_CONSOLE_DEVICE pdc_console_device
|
|
static struct tty_driver * pdc_console_device (struct console *c, int *index)
|
|
{
|
|
extern struct tty_driver console_driver;
|
|
@@ -104,22 +97,19 @@
|
|
return &console_driver;
|
|
}
|
|
#else
|
|
-#define PDC_CONSOLE_DEVICE NULL
|
|
+#define pdc_console_device NULL
|
|
#endif
|
|
|
|
static struct console pdc_cons = {
|
|
.name = "ttyB",
|
|
.write = pdc_console_write,
|
|
- .device = PDC_CONSOLE_DEVICE,
|
|
+ .device = pdc_console_device,
|
|
.setup = pdc_console_setup,
|
|
- .flags = CON_BOOT|CON_PRINTBUFFER|CON_ENABLED,
|
|
+ .flags = CON_BOOT | CON_PRINTBUFFER | CON_ENABLED,
|
|
.index = -1,
|
|
};
|
|
|
|
static int pdc_console_initialized;
|
|
-extern unsigned long con_start; /* kernel/printk.c */
|
|
-extern unsigned long log_end; /* kernel/printk.c */
|
|
-
|
|
|
|
static void pdc_console_init_force(void)
|
|
{
|
|
@@ -146,27 +136,11 @@
|
|
}
|
|
|
|
|
|
-/* Unregister the pdc console with the printk console layer */
|
|
-void pdc_console_die(void)
|
|
-{
|
|
- if (!pdc_console_initialized)
|
|
- return;
|
|
- --pdc_console_initialized;
|
|
-
|
|
- printk(KERN_INFO "Switching from PDC console\n");
|
|
-
|
|
- /* Don't repeat what we've already printed */
|
|
- con_start = log_end;
|
|
-
|
|
- unregister_console(&pdc_cons);
|
|
-}
|
|
-
|
|
-
|
|
/*
|
|
* Used for emergencies. Currently only used if an HPMC occurs. If an
|
|
* HPMC occurs, it is possible that the current console may not be
|
|
- * properly initialed after the PDC IO reset. This routine unregisters all
|
|
- * of the current consoles, reinitializes the pdc console and
|
|
+ * properly initialised after the PDC IO reset. This routine unregisters
|
|
+ * all of the current consoles, reinitializes the pdc console and
|
|
* registers it.
|
|
*/
|
|
|
|
@@ -177,13 +151,13 @@
|
|
if (pdc_console_initialized)
|
|
return;
|
|
|
|
+ /* If we've already seen the output, don't bother to print it again */
|
|
+ if (console_drivers != NULL)
|
|
+ pdc_cons.flags &= ~CON_PRINTBUFFER;
|
|
+
|
|
while ((console = console_drivers) != NULL)
|
|
unregister_console(console_drivers);
|
|
|
|
- /* Don't repeat what we've already printed */
|
|
- con_start = log_end;
|
|
-
|
|
/* force registering the pdc console */
|
|
pdc_console_init_force();
|
|
}
|
|
-
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/perf.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/perf.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/perf.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -746,7 +746,8 @@
|
|
uint64_t *bptr;
|
|
uint32_t dwords;
|
|
uint32_t *intrigue_rdr;
|
|
- uint64_t *intrigue_bitmask, tmp64, proc_hpa;
|
|
+ uint64_t *intrigue_bitmask, tmp64;
|
|
+ void __iomem *runway;
|
|
struct rdr_tbl_ent *tentry;
|
|
int i;
|
|
|
|
@@ -798,15 +799,16 @@
|
|
return -1;
|
|
}
|
|
|
|
- proc_hpa = cpu_device->hpa;
|
|
+ runway = ioremap(cpu_device->hpa, 4096);
|
|
|
|
/* Merge intrigue bits into Runway STATUS 0 */
|
|
- tmp64 = __raw_readq(proc_hpa + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
|
- __raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul), proc_hpa + RUNWAY_STATUS);
|
|
+ tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
|
+ __raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
|
|
+ runway + RUNWAY_STATUS);
|
|
|
|
/* Write RUNWAY DEBUG registers */
|
|
for (i = 0; i < 8; i++) {
|
|
- __raw_writeq(*memaddr++, proc_hpa + RUNWAY_DEBUG + i);
|
|
+ __raw_writeq(*memaddr++, runway + RUNWAY_DEBUG);
|
|
}
|
|
|
|
return 0;
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/process.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/process.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/process.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -9,7 +9,7 @@
|
|
* Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org>
|
|
* Copyright (C) 2000 Philipp Rumpf <prumpf with tux.org>
|
|
* Copyright (C) 2000 David Kennedy <dkennedy with linuxcare.com>
|
|
- * Copyright (C) 2000 Richard Hirst <rhirst with parisc-lixux.org>
|
|
+ * Copyright (C) 2000 Richard Hirst <rhirst with parisc-linux.org>
|
|
* Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org>
|
|
* Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org>
|
|
* Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org>
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/real2.S
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/real2.S 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/real2.S 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -7,8 +7,10 @@
|
|
* Copyright (C) 2000 Hewlett Packard (Paul Bame bame@puffin.external.hp.com)
|
|
*
|
|
*/
|
|
-#include <asm/assembly.h>
|
|
+#include <linux/config.h>
|
|
+
|
|
#include <asm/psw.h>
|
|
+#include <asm/assembly.h>
|
|
|
|
.section .bss
|
|
.export real_stack
|
|
@@ -20,7 +22,7 @@
|
|
real64_stack:
|
|
.block 8192
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
# define REG_SZ 8
|
|
#else
|
|
# define REG_SZ 4
|
|
@@ -50,7 +52,7 @@
|
|
|
|
real32_call_asm:
|
|
STREG %rp, -RP_OFFSET(%sp) /* save RP */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
callee_save
|
|
ldo 2*REG_SZ(%sp), %sp /* room for a couple more saves */
|
|
STREG %r27, -1*REG_SZ(%sp)
|
|
@@ -77,7 +79,7 @@
|
|
b,l save_control_regs,%r2 /* modifies r1, r2, r28 */
|
|
nop
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
rsm PSW_SM_W, %r0 /* go narrow */
|
|
#endif
|
|
|
|
@@ -85,7 +87,7 @@
|
|
bv 0(%r31)
|
|
nop
|
|
ric_ret:
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ssm PSW_SM_W, %r0 /* go wide */
|
|
#endif
|
|
/* restore CRs before going virtual in case we page fault */
|
|
@@ -97,7 +99,7 @@
|
|
|
|
tovirt_r1 %sp
|
|
LDREG -REG_SZ(%sp), %sp /* restore SP */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
LDREG -1*REG_SZ(%sp), %r27
|
|
LDREG -2*REG_SZ(%sp), %r29
|
|
ldo -2*REG_SZ(%sp), %sp
|
|
@@ -143,24 +145,21 @@
|
|
/* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for
|
|
* more general-purpose use by the several places which need RFIs
|
|
*/
|
|
- .align 128
|
|
.text
|
|
+ .align 128
|
|
rfi_virt2real:
|
|
/* switch to real mode... */
|
|
- ssm 0,0 /* See "relied upon translation" */
|
|
- nop /* PA 2.0 Arch. F-5 */
|
|
- nop
|
|
- nop
|
|
+ rsm PSW_SM_I,%r0
|
|
+ load32 PA(rfi_v2r_1), %r1
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
- rsm (PSW_SM_Q|PSW_SM_I),%r0 /* disable Q & I bits to load iia queue */
|
|
+ rsm PSW_SM_Q,%r0 /* disable Q & I bits to load iia queue */
|
|
mtctl %r0, %cr17 /* Clear IIASQ tail */
|
|
mtctl %r0, %cr17 /* Clear IIASQ head */
|
|
- load32 PA(rfi_v2r_1), %r1
|
|
mtctl %r1, %cr18 /* IIAOQ head */
|
|
ldo 4(%r1), %r1
|
|
mtctl %r1, %cr18 /* IIAOQ tail */
|
|
@@ -184,10 +183,8 @@
|
|
.text
|
|
.align 128
|
|
rfi_real2virt:
|
|
- ssm 0,0 /* See "relied upon translation" */
|
|
- nop /* PA 2.0 Arch. F-5 */
|
|
- nop
|
|
- nop
|
|
+ rsm PSW_SM_I,%r0
|
|
+ load32 (rfi_r2v_1), %r1
|
|
nop
|
|
nop
|
|
nop
|
|
@@ -197,7 +194,6 @@
|
|
rsm PSW_SM_Q,%r0 /* disable Q bit to load iia queue */
|
|
mtctl %r0, %cr17 /* Clear IIASQ tail */
|
|
mtctl %r0, %cr17 /* Clear IIASQ head */
|
|
- load32 (rfi_r2v_1), %r1
|
|
mtctl %r1, %cr18 /* IIAOQ head */
|
|
ldo 4(%r1), %r1
|
|
mtctl %r1, %cr18 /* IIAOQ tail */
|
|
@@ -218,7 +214,7 @@
|
|
bv 0(%r2)
|
|
nop
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
|
|
/************************ 64-bit real-mode calls ***********************/
|
|
/* This is only usable in wide kernels right now and will probably stay so */
|
|
@@ -296,7 +292,7 @@
|
|
** comparing function pointers.
|
|
*/
|
|
__canonicalize_funcptr_for_compare:
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
bve (%r2)
|
|
#else
|
|
bv %r0(%r2)
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/signal.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/signal.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/signal.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -637,6 +637,7 @@
|
|
/* Stack is 64-byte aligned, and we only
|
|
* need to flush 1 cache line */
|
|
asm("fdc 0(%%sr3, %0)\n"
|
|
+ "sync\n"
|
|
"fic 0(%%sr3, %0)\n"
|
|
"sync\n"
|
|
: : "r"(regs->gr[30]));
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/smp.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/smp.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/smp.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -18,7 +18,7 @@
|
|
*/
|
|
#undef ENTRY_SYS_CPUS /* syscall support for iCOD-like functionality */
|
|
|
|
-#include <linux/autoconf.h>
|
|
+#include <linux/config.h>
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/spinlock.h>
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/syscall.S
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/syscall.S 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/syscall.S 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -4,8 +4,9 @@
|
|
* System call entry code Copyright (c) Matthew Wilcox 1999 <willy@bofh.ai>
|
|
* Licensed under the GNU GPL.
|
|
* thanks to Philipp Rumpf, Mike Shaver and various others
|
|
- * sorry about the wall, puffin..
|
|
+ * sorry about the wall, puffin.
|
|
*/
|
|
+#include <linux/config.h> /* for CONFIG_SMP */
|
|
|
|
#include <asm/offsets.h>
|
|
#include <asm/unistd.h>
|
|
@@ -22,15 +23,13 @@
|
|
*/
|
|
#define KILL_INSN break 0,0
|
|
|
|
-#include <linux/config.h> /* for CONFIG_SMP */
|
|
-
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
.level 2.0w
|
|
#else
|
|
.level 1.1
|
|
#endif
|
|
|
|
-#ifndef __LP64__
|
|
+#ifndef CONFIG_64BIT
|
|
.macro fixup_branch,lbl
|
|
b \lbl
|
|
.endm
|
|
@@ -103,7 +102,7 @@
|
|
mfsp %sr7,%r1 /* save user sr7 */
|
|
mtsp %r1,%sr3 /* and store it in sr3 */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* for now we can *always* set the W bit on entry to the syscall
|
|
* since we don't support wide userland processes. We could
|
|
* also save the current SM other than in r0 and restore it on
|
|
@@ -155,7 +154,7 @@
|
|
STREG %r19, TASK_PT_GR19(%r1)
|
|
|
|
LDREGM -FRAME_SIZE(%r30), %r2 /* get users sp back */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
extrd,u %r2,63,1,%r19 /* W hidden in bottom bit */
|
|
#if 0
|
|
xor %r19,%r2,%r2 /* clear bottom bit */
|
|
@@ -186,7 +185,7 @@
|
|
|
|
loadgp
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
copy %r19,%r2 /* W bit back to r2 */
|
|
#else
|
|
@@ -205,7 +204,7 @@
|
|
/* Note! We cannot use the syscall table that is mapped
|
|
nearby since the gateway page is mapped execute-only. */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldil L%sys_call_table, %r1
|
|
or,= %r2,%r2,%r2
|
|
addil L%(sys_call_table64-sys_call_table), %r1
|
|
@@ -321,7 +320,7 @@
|
|
LDREG TASK_PT_GR25(%r1), %r25
|
|
LDREG TASK_PT_GR24(%r1), %r24
|
|
LDREG TASK_PT_GR23(%r1), %r23
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
LDREG TASK_PT_GR22(%r1), %r22
|
|
LDREG TASK_PT_GR21(%r1), %r21
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
@@ -350,7 +349,7 @@
|
|
tracesys_exit:
|
|
ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */
|
|
LDREG TI_TASK(%r1), %r1
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
bl syscall_trace, %r2
|
|
@@ -371,7 +370,7 @@
|
|
tracesys_sigexit:
|
|
ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */
|
|
LDREG 0(%r1), %r1
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
ldo -16(%r30),%r29 /* Reference param save area */
|
|
#endif
|
|
bl syscall_trace, %r2
|
|
@@ -404,7 +403,7 @@
|
|
gate .+8, %r0
|
|
depi 3, 31, 2, %r31 /* Ensure we return to userspace */
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* FIXME: If we are a 64-bit kernel just
|
|
* turn this on unconditionally.
|
|
*/
|
|
@@ -440,7 +439,7 @@
|
|
/* Fall through: Return to userspace */
|
|
|
|
lws_exit:
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* decide whether to reset the wide mode bit
|
|
*
|
|
* For a syscall, the W bit is stored in the lowest bit
|
|
@@ -486,7 +485,7 @@
|
|
|
|
/* ELF64 Process entry path */
|
|
lws_compare_and_swap64:
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
b,n lws_compare_and_swap
|
|
#else
|
|
/* If we are not a 64-bit kernel, then we don't
|
|
@@ -497,7 +496,7 @@
|
|
|
|
/* ELF32 Process entry path */
|
|
lws_compare_and_swap32:
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* Clip all the input registers */
|
|
depdi 0, 31, 32, %r26
|
|
depdi 0, 31, 32, %r25
|
|
@@ -528,6 +527,7 @@
|
|
We *must* giveup this call and fail.
|
|
*/
|
|
ldw 4(%sr2,%r20), %r28 /* Load thread register */
|
|
+ /* WARNING: If cr27 cycles to the same value we have problems */
|
|
mfctl %cr27, %r21 /* Get current thread register */
|
|
cmpb,<>,n %r21, %r28, cas_lock /* Called recursive? */
|
|
b lws_exit /* Return error! */
|
|
@@ -608,7 +608,7 @@
|
|
the other for the store. Either return -EFAULT.
|
|
Each of the entries must be relocated. */
|
|
.section __ex_table,"aw"
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* Pad the address calculation */
|
|
.word 0,(2b - linux_gateway_page)
|
|
.word 0,(3b - linux_gateway_page)
|
|
@@ -619,7 +619,7 @@
|
|
.previous
|
|
|
|
.section __ex_table,"aw"
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* Pad the address calculation */
|
|
.word 0,(1b - linux_gateway_page)
|
|
.word 0,(3b - linux_gateway_page)
|
|
@@ -638,7 +638,7 @@
|
|
|
|
/* Relocate symbols assuming linux_gateway_page is mapped
|
|
to virtual address 0x0 */
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/* FIXME: The code will always be on the gateay page
|
|
and thus it will be on the first 4k, the
|
|
assembler seems to think that the final
|
|
@@ -666,7 +666,7 @@
|
|
sys_call_table:
|
|
#include "syscall_table.S"
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
.align 4096
|
|
.export sys_call_table64
|
|
.Lsys_call_table64:
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/syscall_table.S
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/syscall_table.S 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/syscall_table.S 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -35,7 +35,7 @@
|
|
#undef ENTRY_UHOH
|
|
#undef ENTRY_COMP
|
|
#undef ENTRY_OURS
|
|
-#if defined(__LP64__) && !defined(SYSCALL_TABLE_64BIT)
|
|
+#if defined(CONFIG_64BIT) && !defined(SYSCALL_TABLE_64BIT)
|
|
/* Use ENTRY_SAME for 32-bit syscalls which are the same on wide and
|
|
* narrow palinux. Use ENTRY_DIFF for those where a 32-bit specific
|
|
* implementation is required on wide palinux. Use ENTRY_COMP where
|
|
@@ -46,7 +46,7 @@
|
|
#define ENTRY_UHOH(_name_) .dword sys32_##unimplemented
|
|
#define ENTRY_OURS(_name_) .dword parisc_##_name_
|
|
#define ENTRY_COMP(_name_) .dword compat_sys_##_name_
|
|
-#elif defined(__LP64__) && defined(SYSCALL_TABLE_64BIT)
|
|
+#elif defined(CONFIG_64BIT) && defined(SYSCALL_TABLE_64BIT)
|
|
#define ENTRY_SAME(_name_) .dword sys_##_name_
|
|
#define ENTRY_DIFF(_name_) .dword sys_##_name_
|
|
#define ENTRY_UHOH(_name_) .dword sys_##_name_
|
|
@@ -368,5 +368,9 @@
|
|
ENTRY_COMP(mbind) /* 260 */
|
|
ENTRY_COMP(get_mempolicy)
|
|
ENTRY_COMP(set_mempolicy)
|
|
+ ENTRY_SAME(ni_syscall) /* 263: reserved for vserver */
|
|
+ ENTRY_SAME(add_key)
|
|
+ ENTRY_SAME(request_key) /* 265 */
|
|
+ ENTRY_SAME(keyctl)
|
|
/* Nothing yet */
|
|
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/time.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/time.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/time.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -89,14 +89,6 @@
|
|
}
|
|
}
|
|
|
|
-#ifdef CONFIG_CHASSIS_LCD_LED
|
|
- /* Only schedule the led tasklet on cpu 0, and only if it
|
|
- * is enabled.
|
|
- */
|
|
- if (cpu == 0 && !atomic_read(&led_tasklet.count))
|
|
- tasklet_schedule(&led_tasklet);
|
|
-#endif
|
|
-
|
|
/* check soft power switch status */
|
|
if (cpu == 0 && !atomic_read(&power_tasklet.count))
|
|
tasklet_schedule(&power_tasklet);
|
|
@@ -104,6 +96,24 @@
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
+
|
|
+unsigned long profile_pc(struct pt_regs *regs)
|
|
+{
|
|
+ unsigned long pc = instruction_pointer(regs);
|
|
+
|
|
+ if (regs->gr[0] & PSW_N)
|
|
+ pc -= 4;
|
|
+
|
|
+#ifdef CONFIG_SMP
|
|
+ if (in_lock_functions(pc))
|
|
+ pc = regs->gr[2];
|
|
+#endif
|
|
+
|
|
+ return pc;
|
|
+}
|
|
+EXPORT_SYMBOL(profile_pc);
|
|
+
|
|
+
|
|
/*** converted from ia64 ***/
|
|
/*
|
|
* Return the number of micro-seconds that elapsed since the last
|
|
Index: linux-2.6-2.6.12/arch/parisc/kernel/unaligned.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/kernel/unaligned.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/kernel/unaligned.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -513,15 +513,18 @@
|
|
register int flop=0; /* true if this is a flop */
|
|
|
|
/* log a message with pacing */
|
|
- if (user_mode(regs))
|
|
- {
|
|
- if (unaligned_count > 5 && jiffies - last_time > 5*HZ)
|
|
- {
|
|
+ if (user_mode(regs)) {
|
|
+ if (current->thread.flags & PARISC_UAC_SIGBUS) {
|
|
+ goto force_sigbus;
|
|
+ }
|
|
+
|
|
+ if (unaligned_count > 5 && jiffies - last_time > 5*HZ) {
|
|
unaligned_count = 0;
|
|
last_time = jiffies;
|
|
}
|
|
- if (++unaligned_count < 5)
|
|
- {
|
|
+
|
|
+ if (!(current->thread.flags & PARISC_UAC_NOPRINT)
|
|
+ && ++unaligned_count < 5) {
|
|
char buf[256];
|
|
sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n",
|
|
current->comm, current->pid, regs->ior, regs->iaoq[0]);
|
|
@@ -530,6 +533,7 @@
|
|
show_regs(regs);
|
|
#endif
|
|
}
|
|
+
|
|
if (!unaligned_enabled)
|
|
goto force_sigbus;
|
|
}
|
|
Index: linux-2.6-2.6.12/arch/parisc/lib/memcpy.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/arch/parisc/lib/memcpy.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/arch/parisc/lib/memcpy.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -339,6 +339,7 @@
|
|
pds = (double *)pcs;
|
|
pdd = (double *)pcd;
|
|
|
|
+#if 0
|
|
/* Copy 8 doubles at a time */
|
|
while (len >= 8*sizeof(double)) {
|
|
register double r1, r2, r3, r4, r5, r6, r7, r8;
|
|
@@ -366,6 +367,7 @@
|
|
fstdma(d_space, r8, pdd, pmc_store_exc);
|
|
len -= 8*sizeof(double);
|
|
}
|
|
+#endif
|
|
|
|
pws = (unsigned int *)pds;
|
|
pwd = (unsigned int *)pdd;
|
|
Index: linux-2.6-2.6.12/drivers/block/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/block/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/block/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -6,7 +6,7 @@
|
|
|
|
config BLK_DEV_FD
|
|
tristate "Normal floppy disk support"
|
|
- depends on (!ARCH_S390 && !M68K && !IA64 && !UML && !ARM) || Q40 || (SUN3X && BROKEN) || ARCH_RPC || ARCH_EBSA285
|
|
+ depends on (!ARCH_S390 && !M68K && !IA64 && !UML && !ARM) || Q40 || (SUN3X && BROKEN) || ARCH_RPC || ARCH_EBSA285 || (PARISC && BROKEN)
|
|
---help---
|
|
If you want to use the floppy disk drive(s) of your PC under Linux,
|
|
say Y. Information about this driver, especially important for IBM
|
|
Index: linux-2.6-2.6.12/drivers/ide/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/ide/Kconfig 2005-08-09 17:50:50.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/ide/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -610,7 +610,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>.
|
|
|
|
Index: linux-2.6-2.6.12/drivers/input/keyboard/hil_kbd.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/input/keyboard/hil_kbd.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/input/keyboard/hil_kbd.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -204,7 +204,7 @@
|
|
hil_packet packet;
|
|
int idx;
|
|
|
|
- kbd = (struct hil_kbd *)serio->private;
|
|
+ kbd = serio_get_drvdata(serio);
|
|
if (kbd == NULL) {
|
|
BUG();
|
|
return IRQ_HANDLED;
|
|
@@ -234,7 +234,7 @@
|
|
{
|
|
struct hil_kbd *kbd;
|
|
|
|
- kbd = (struct hil_kbd *)serio->private;
|
|
+ kbd = serio_get_drvdata(serio);
|
|
if (kbd == NULL) {
|
|
BUG();
|
|
return;
|
|
@@ -245,20 +245,20 @@
|
|
kfree(kbd);
|
|
}
|
|
|
|
-static void hil_kbd_connect(struct serio *serio, struct serio_driver *drv)
|
|
+static int 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;
|
|
+ kbd = kmalloc(sizeof(*kbd), GFP_KERNEL);
|
|
+ if (!kbd)
|
|
+ return -ENOMEM;
|
|
memset(kbd, 0, sizeof(struct hil_kbd));
|
|
|
|
if (serio_open(serio, drv)) goto bail0;
|
|
|
|
- serio->private = kbd;
|
|
+ serio_set_drvdata(serio, kbd);
|
|
kbd->serio = serio;
|
|
kbd->dev.private = kbd;
|
|
|
|
@@ -342,19 +342,31 @@
|
|
down(&(kbd->sem));
|
|
up(&(kbd->sem));
|
|
|
|
- return;
|
|
+ return 0;
|
|
bail1:
|
|
serio_close(serio);
|
|
bail0:
|
|
kfree(kbd);
|
|
+ serio_set_drvdata(serio, NULL);
|
|
+ return -EIO;
|
|
}
|
|
|
|
+static struct serio_device_id hil_kbd_ids[] = {
|
|
+ {
|
|
+ .type = SERIO_HIL_MLC,
|
|
+ .proto = SERIO_HIL,
|
|
+ .id = SERIO_ANY,
|
|
+ .extra = SERIO_ANY,
|
|
+ },
|
|
+ { 0 }
|
|
+};
|
|
|
|
struct serio_driver hil_kbd_serio_drv = {
|
|
.driver = {
|
|
.name = "hil_kbd",
|
|
},
|
|
.description = "HP HIL keyboard driver",
|
|
+ .id_table = hil_kbd_ids,
|
|
.connect = hil_kbd_connect,
|
|
.disconnect = hil_kbd_disconnect,
|
|
.interrupt = hil_kbd_interrupt
|
|
Index: linux-2.6-2.6.12/drivers/input/keyboard/hilkbd.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/input/keyboard/hilkbd.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/input/keyboard/hilkbd.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -22,7 +22,7 @@
|
|
#include <linux/errno.h>
|
|
#include <linux/input.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/irq.h>
|
|
+#include <linux/interrupt.h>
|
|
#include <linux/hil.h>
|
|
#include <linux/spinlock.h>
|
|
|
|
Index: linux-2.6-2.6.12/drivers/input/mouse/hil_ptr.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/input/mouse/hil_ptr.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/input/mouse/hil_ptr.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -196,7 +196,7 @@
|
|
hil_packet packet;
|
|
int idx;
|
|
|
|
- ptr = (struct hil_ptr *)serio->private;
|
|
+ ptr = serio_get_drvdata(serio);
|
|
if (ptr == NULL) {
|
|
BUG();
|
|
return IRQ_HANDLED;
|
|
@@ -227,7 +227,7 @@
|
|
{
|
|
struct hil_ptr *ptr;
|
|
|
|
- ptr = (struct hil_ptr *)serio->private;
|
|
+ ptr = serio_get_drvdata(serio);
|
|
if (ptr == NULL) {
|
|
BUG();
|
|
return;
|
|
@@ -238,21 +238,19 @@
|
|
kfree(ptr);
|
|
}
|
|
|
|
-static void hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
|
|
+static int 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;
|
|
+ if (!(ptr = kmalloc(sizeof(struct hil_ptr), GFP_KERNEL))) return -ENOMEM;
|
|
memset(ptr, 0, sizeof(struct hil_ptr));
|
|
|
|
if (serio_open(serio, driver)) goto bail0;
|
|
|
|
- serio->private = ptr;
|
|
+ serio_set_drvdata(serio, ptr);
|
|
ptr->serio = serio;
|
|
ptr->dev.private = ptr;
|
|
|
|
@@ -380,23 +378,34 @@
|
|
(btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad",
|
|
did);
|
|
|
|
- return;
|
|
+ return 0;
|
|
bail1:
|
|
serio_close(serio);
|
|
bail0:
|
|
kfree(ptr);
|
|
- return;
|
|
+ serio_set_drvdata(serio, NULL);
|
|
+ return -ENODEV;
|
|
}
|
|
|
|
+static struct serio_device_id hil_ptr_ids[] = {
|
|
+ {
|
|
+ .type = SERIO_HIL_MLC,
|
|
+ .proto = SERIO_HIL,
|
|
+ .id = SERIO_ANY,
|
|
+ .extra = SERIO_ANY,
|
|
+ },
|
|
+ { 0 }
|
|
+};
|
|
|
|
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
|
|
+ .id_table = hil_ptr_ids,
|
|
+ .connect = hil_ptr_connect,
|
|
+ .disconnect = hil_ptr_disconnect,
|
|
+ .interrupt = hil_ptr_interrupt
|
|
};
|
|
|
|
static int __init hil_ptr_init(void)
|
|
Index: linux-2.6-2.6.12/drivers/input/serio/hil_mlc.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/input/serio/hil_mlc.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/input/serio/hil_mlc.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -801,7 +801,8 @@
|
|
struct hil_mlc_serio_map *map;
|
|
struct hil_mlc *mlc;
|
|
|
|
- if (serio->private != NULL) return -EBUSY;
|
|
+ if (serio_get_drvdata(serio) != NULL)
|
|
+ return -EBUSY;
|
|
|
|
map = serio->port_data;
|
|
if (map == NULL) {
|
|
@@ -832,11 +833,18 @@
|
|
return;
|
|
}
|
|
|
|
- serio->private = NULL;
|
|
+ serio_set_drvdata(serio, NULL);
|
|
serio->drv = NULL;
|
|
/* TODO wake up interruptable */
|
|
}
|
|
|
|
+static struct serio_device_id hil_mlc_serio_id = {
|
|
+ .type = SERIO_HIL_MLC,
|
|
+ .proto = SERIO_HIL,
|
|
+ .extra = SERIO_ANY,
|
|
+ .id = SERIO_ANY,
|
|
+};
|
|
+
|
|
int hil_mlc_register(hil_mlc *mlc) {
|
|
int i;
|
|
unsigned long flags;
|
|
@@ -867,7 +875,7 @@
|
|
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->id = hil_mlc_serio_id;
|
|
mlc_serio->write = hil_mlc_serio_write;
|
|
mlc_serio->open = hil_mlc_serio_open;
|
|
mlc_serio->close = hil_mlc_serio_close;
|
|
Index: linux-2.6-2.6.12/drivers/isdn/hisax/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/isdn/hisax/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/isdn/hisax/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -110,7 +110,7 @@
|
|
|
|
config HISAX_TELESPCI
|
|
bool "Teles PCI"
|
|
- depends on PCI && (BROKEN || !(SPARC64 || PPC))
|
|
+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
|
|
help
|
|
This enables HiSax support for the Teles PCI.
|
|
See <file:Documentation/isdn/README.HiSax> on how to configure it.
|
|
@@ -237,7 +237,7 @@
|
|
|
|
config HISAX_NETJET
|
|
bool "NETjet card"
|
|
- depends on PCI && (BROKEN || !(SPARC64 || PPC))
|
|
+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
|
|
help
|
|
This enables HiSax support for the NetJet from Traverse
|
|
Technologies.
|
|
@@ -248,7 +248,7 @@
|
|
|
|
config HISAX_NETJET_U
|
|
bool "NETspider U card"
|
|
- depends on PCI && (BROKEN || !(SPARC64 || PPC))
|
|
+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
|
|
help
|
|
This enables HiSax support for the Netspider U interface ISDN card
|
|
from Traverse Technologies.
|
|
@@ -316,7 +316,7 @@
|
|
|
|
config HISAX_HFC_PCI
|
|
bool "HFC PCI-Bus cards"
|
|
- depends on PCI && (BROKEN || !(SPARC64 || PPC))
|
|
+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
|
|
help
|
|
This enables HiSax support for the HFC-S PCI 2BDS0 based cards.
|
|
|
|
@@ -343,14 +343,14 @@
|
|
|
|
config HISAX_ENTERNOW_PCI
|
|
bool "Formula-n enter:now PCI card"
|
|
- depends on PCI && (BROKEN || !(SPARC64 || PPC))
|
|
+ depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K))
|
|
help
|
|
This enables HiSax support for the Formula-n enter:now PCI
|
|
ISDN card.
|
|
|
|
config HISAX_AMD7930
|
|
bool "Am7930 (EXPERIMENTAL)"
|
|
- depends on EXPERIMENTAL && (SPARC32 || SPARC64)
|
|
+ depends on EXPERIMENTAL && SPARC
|
|
help
|
|
This enables HiSax support for the AMD7930 chips on some SPARCs.
|
|
This code is not finished yet.
|
|
Index: linux-2.6-2.6.12/drivers/isdn/pcbit/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/isdn/pcbit/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/isdn/pcbit/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -3,7 +3,7 @@
|
|
#
|
|
config ISDN_DRV_PCBIT
|
|
tristate "PCBIT-D support"
|
|
- depends on ISDN_I4L && ISA && (BROKEN || !PPC)
|
|
+ depends on ISDN_I4L && ISA && (BROKEN || X86)
|
|
help
|
|
This enables support for the PCBIT ISDN-card. This card is
|
|
manufactured in Portugal by Octal. For running this card,
|
|
Index: linux-2.6-2.6.12/drivers/net/tulip/media.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/net/tulip/media.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/net/tulip/media.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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)
|
|
{
|
|
@@ -297,24 +299,56 @@
|
|
u16 *reset_sequence = &((u16*)(p+3))[init_length];
|
|
int reset_length = p[2 + init_length*2];
|
|
misc_info = reset_sequence + reset_length;
|
|
- if (startup)
|
|
+ if (startup) {
|
|
+ int timeout = 10; /* max 1 ms */
|
|
for (i = 0; i < reset_length; i++)
|
|
iowrite32(get_u16(&reset_sequence[i]) << 16, ioaddr + CSR15);
|
|
+
|
|
+ /* flush posted writes */
|
|
+ ioread32(ioaddr + CSR15);
|
|
+
|
|
+ /* 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(get_u16(&init_sequence[i]) << 16, ioaddr + CSR15);
|
|
+
|
|
+ ioread32(ioaddr + CSR15); /* flush posted writes */
|
|
} else {
|
|
u8 *init_sequence = p + 2;
|
|
u8 *reset_sequence = p + 3 + init_length;
|
|
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;
|
|
Index: linux-2.6-2.6.12/drivers/net/tulip/tulip.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/net/tulip/tulip.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/net/tulip/tulip.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -475,8 +475,11 @@
|
|
udelay(10);
|
|
|
|
if (!i)
|
|
- printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed\n",
|
|
- pci_name(tp->pdev));
|
|
+ printk(KERN_DEBUG "%s: tulip_stop_rxtx() failed"
|
|
+ " (CSR5 0x%x CSR6 0x%x)\n",
|
|
+ pci_name(tp->pdev),
|
|
+ ioread32(ioaddr + CSR5),
|
|
+ ioread32(ioaddr + CSR6));
|
|
}
|
|
}
|
|
|
|
Index: linux-2.6-2.6.12/drivers/net/tulip/tulip_core.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/net/tulip/tulip_core.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/net/tulip/tulip_core.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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>
|
|
@@ -148,7 +148,7 @@
|
|
HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM | HAS_PCI_MWI, tulip_timer },
|
|
|
|
/* DC21142, DC21143 */
|
|
- { "Digital DS21143 Tulip", 128, 0x0801fbff,
|
|
+ { "Digital DS21142/DS21143 Tulip", 128, 0x0801fbff,
|
|
HAS_MII | HAS_MEDIA_TABLE | ALWAYS_CHECK_MII | HAS_ACPI | HAS_NWAY
|
|
| HAS_INTR_MITIGATION | HAS_PCI_MWI, t21142_timer },
|
|
|
|
Index: linux-2.6-2.6.12/drivers/parisc/ccio-dma.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/parisc/ccio-dma.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/parisc/ccio-dma.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -100,9 +100,9 @@
|
|
#define DBG_RUN_SG(x...)
|
|
#endif
|
|
|
|
-#define CCIO_INLINE /* inline */
|
|
-#define WRITE_U32(value, addr) gsc_writel(value, (u32 *)(addr))
|
|
-#define READ_U32(addr) gsc_readl((u32 *)(addr))
|
|
+#define CCIO_INLINE inline
|
|
+#define WRITE_U32(value, addr) __raw_writel(value, addr)
|
|
+#define READ_U32(addr) __raw_readl(addr)
|
|
|
|
#define U2_IOA_RUNWAY 0x580
|
|
#define U2_BC_GSC 0x501
|
|
@@ -115,28 +115,28 @@
|
|
|
|
struct ioa_registers {
|
|
/* Runway Supervisory Set */
|
|
- volatile int32_t unused1[12];
|
|
- volatile uint32_t io_command; /* Offset 12 */
|
|
- volatile uint32_t io_status; /* Offset 13 */
|
|
- volatile uint32_t io_control; /* Offset 14 */
|
|
- volatile int32_t unused2[1];
|
|
+ int32_t unused1[12];
|
|
+ uint32_t io_command; /* Offset 12 */
|
|
+ uint32_t io_status; /* Offset 13 */
|
|
+ uint32_t io_control; /* Offset 14 */
|
|
+ int32_t unused2[1];
|
|
|
|
/* Runway Auxiliary Register Set */
|
|
- volatile uint32_t io_err_resp; /* Offset 0 */
|
|
- volatile uint32_t io_err_info; /* Offset 1 */
|
|
- volatile uint32_t io_err_req; /* Offset 2 */
|
|
- volatile uint32_t io_err_resp_hi; /* Offset 3 */
|
|
- volatile uint32_t io_tlb_entry_m; /* Offset 4 */
|
|
- volatile uint32_t io_tlb_entry_l; /* Offset 5 */
|
|
- volatile uint32_t unused3[1];
|
|
- volatile uint32_t io_pdir_base; /* Offset 7 */
|
|
- volatile uint32_t io_io_low_hv; /* Offset 8 */
|
|
- volatile uint32_t io_io_high_hv; /* Offset 9 */
|
|
- volatile uint32_t unused4[1];
|
|
- volatile uint32_t io_chain_id_mask; /* Offset 11 */
|
|
- volatile uint32_t unused5[2];
|
|
- volatile uint32_t io_io_low; /* Offset 14 */
|
|
- volatile uint32_t io_io_high; /* Offset 15 */
|
|
+ uint32_t io_err_resp; /* Offset 0 */
|
|
+ uint32_t io_err_info; /* Offset 1 */
|
|
+ uint32_t io_err_req; /* Offset 2 */
|
|
+ uint32_t io_err_resp_hi; /* Offset 3 */
|
|
+ uint32_t io_tlb_entry_m; /* Offset 4 */
|
|
+ uint32_t io_tlb_entry_l; /* Offset 5 */
|
|
+ uint32_t unused3[1];
|
|
+ uint32_t io_pdir_base; /* Offset 7 */
|
|
+ uint32_t io_io_low_hv; /* Offset 8 */
|
|
+ uint32_t io_io_high_hv; /* Offset 9 */
|
|
+ uint32_t unused4[1];
|
|
+ uint32_t io_chain_id_mask; /* Offset 11 */
|
|
+ uint32_t unused5[2];
|
|
+ uint32_t io_io_low; /* Offset 14 */
|
|
+ uint32_t io_io_high; /* Offset 15 */
|
|
};
|
|
|
|
/*
|
|
@@ -226,7 +226,7 @@
|
|
*/
|
|
|
|
struct ioc {
|
|
- struct ioa_registers *ioc_hpa; /* I/O MMU base address */
|
|
+ struct ioa_registers __iomem *ioc_regs; /* I/O MMU base address */
|
|
u8 *res_map; /* resource map, bit == pdir entry */
|
|
u64 *pdir_base; /* physical base address */
|
|
u32 pdir_size; /* bytes, function of IOV Space size */
|
|
@@ -636,7 +636,7 @@
|
|
byte_cnt += chain_size;
|
|
|
|
while(byte_cnt > chain_size) {
|
|
- WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_hpa->io_command);
|
|
+ WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_regs->io_command);
|
|
iovp += chain_size;
|
|
byte_cnt -= chain_size;
|
|
}
|
|
@@ -1314,14 +1314,13 @@
|
|
|
|
ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);
|
|
|
|
- BUG_ON(ioc->pdir_size >= 4 * 1024 * 1024); /* max pdir size < 4MB */
|
|
+ BUG_ON(ioc->pdir_size > 8 * 1024 * 1024); /* max pdir size <= 8MB */
|
|
|
|
/* 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%lx mem %luMB IOV %dMB (%d bits)\n",
|
|
- __FUNCTION__,
|
|
- ioc->ioc_hpa,
|
|
+ DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",
|
|
+ __FUNCTION__, ioc->ioc_regs,
|
|
(unsigned long) num_physpages >> (20 - PAGE_SHIFT),
|
|
iova_space_size>>20,
|
|
iov_order + PAGE_SHIFT);
|
|
@@ -1329,13 +1328,12 @@
|
|
ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL,
|
|
get_order(ioc->pdir_size));
|
|
if(NULL == ioc->pdir_base) {
|
|
- panic("%s:%s() could not allocate I/O Page Table\n", __FILE__,
|
|
- __FUNCTION__);
|
|
+ panic("%s() could not allocate I/O Page Table\n", __FUNCTION__);
|
|
}
|
|
memset(ioc->pdir_base, 0, ioc->pdir_size);
|
|
|
|
BUG_ON((((unsigned long)ioc->pdir_base) & PAGE_MASK) != (unsigned long)ioc->pdir_base);
|
|
- DBG_INIT(" base %p", ioc->pdir_base);
|
|
+ DBG_INIT(" base %p\n", ioc->pdir_base);
|
|
|
|
/* resource map size dictated by pdir_size */
|
|
ioc->res_size = (ioc->pdir_size / sizeof(u64)) >> 3;
|
|
@@ -1344,8 +1342,7 @@
|
|
ioc->res_map = (u8 *)__get_free_pages(GFP_KERNEL,
|
|
get_order(ioc->res_size));
|
|
if(NULL == ioc->res_map) {
|
|
- panic("%s:%s() could not allocate resource map\n", __FILE__,
|
|
- __FUNCTION__);
|
|
+ panic("%s() could not allocate resource map\n", __FUNCTION__);
|
|
}
|
|
memset(ioc->res_map, 0, ioc->res_size);
|
|
|
|
@@ -1366,44 +1363,52 @@
|
|
** Initialize IOA hardware
|
|
*/
|
|
WRITE_U32(CCIO_CHAINID_MASK << ioc->chainid_shift,
|
|
- &ioc->ioc_hpa->io_chain_id_mask);
|
|
+ &ioc->ioc_regs->io_chain_id_mask);
|
|
|
|
WRITE_U32(virt_to_phys(ioc->pdir_base),
|
|
- &ioc->ioc_hpa->io_pdir_base);
|
|
+ &ioc->ioc_regs->io_pdir_base);
|
|
|
|
/*
|
|
** Go to "Virtual Mode"
|
|
*/
|
|
- WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_hpa->io_control);
|
|
+ WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_regs->io_control);
|
|
|
|
/*
|
|
** Initialize all I/O TLB entries to 0 (Valid bit off).
|
|
*/
|
|
- WRITE_U32(0, &ioc->ioc_hpa->io_tlb_entry_m);
|
|
- WRITE_U32(0, &ioc->ioc_hpa->io_tlb_entry_l);
|
|
+ WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_m);
|
|
+ WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_l);
|
|
|
|
for(i = 1 << CCIO_CHAINID_SHIFT; i ; i--) {
|
|
WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioc->chainid_shift)),
|
|
- &ioc->ioc_hpa->io_command);
|
|
+ &ioc->ioc_regs->io_command);
|
|
}
|
|
}
|
|
|
|
static void
|
|
-ccio_init_resource(struct resource *res, char *name, unsigned long ioaddr)
|
|
+ccio_init_resource(struct resource *res, char *name, void __iomem *ioaddr)
|
|
{
|
|
int result;
|
|
|
|
res->parent = NULL;
|
|
res->flags = IORESOURCE_MEM;
|
|
- res->start = (unsigned long)(signed) __raw_readl(ioaddr) << 16;
|
|
- res->end = (unsigned long)(signed) (__raw_readl(ioaddr + 4) << 16) - 1;
|
|
+ /*
|
|
+ * bracing ((signed) ...) are required for 64bit kernel because
|
|
+ * we only want to sign extend the lower 16 bits of the register.
|
|
+ * The upper 16-bits of range registers are hardcoded to 0xffff.
|
|
+ */
|
|
+ res->start = (unsigned long)((signed) READ_U32(ioaddr) << 16);
|
|
+ res->end = (unsigned long)((signed) (READ_U32(ioaddr + 4) << 16) - 1);
|
|
res->name = name;
|
|
+ /*
|
|
+ * Check if this MMIO range is disable
|
|
+ */
|
|
if (res->end + 1 == res->start)
|
|
return;
|
|
result = request_resource(&iomem_resource, res);
|
|
if (result < 0) {
|
|
- printk(KERN_ERR "%s: failed to claim CCIO bus address space (%08lx,%08lx)\n",
|
|
- __FILE__, res->start, res->end);
|
|
+ printk(KERN_ERR "%s() failed to claim CCIO bus address space (%08lx,%08lx)\n",
|
|
+ __FUNCTION__, res->start, res->end);
|
|
}
|
|
}
|
|
|
|
@@ -1414,9 +1419,8 @@
|
|
|
|
sprintf(name, "GSC Bus [%d/]", ioc->hw_path);
|
|
|
|
- ccio_init_resource(res, name, (unsigned long)&ioc->ioc_hpa->io_io_low);
|
|
- ccio_init_resource(res + 1, name,
|
|
- (unsigned long)&ioc->ioc_hpa->io_io_low_hv);
|
|
+ ccio_init_resource(res, name, &ioc->ioc_regs->io_io_low);
|
|
+ ccio_init_resource(res + 1, name, &ioc->ioc_regs->io_io_low_hv);
|
|
}
|
|
|
|
static int new_ioc_area(struct resource *res, unsigned long size,
|
|
@@ -1486,15 +1490,15 @@
|
|
|
|
if (!expand_ioc_area(parent, size, min, max, align)) {
|
|
__raw_writel(((parent->start)>>16) | 0xffff0000,
|
|
- (unsigned long)&(ioc->ioc_hpa->io_io_low));
|
|
+ &ioc->ioc_regs->io_io_low);
|
|
__raw_writel(((parent->end)>>16) | 0xffff0000,
|
|
- (unsigned long)&(ioc->ioc_hpa->io_io_high));
|
|
+ &ioc->ioc_regs->io_io_high);
|
|
} else if (!expand_ioc_area(parent + 1, size, min, max, align)) {
|
|
parent++;
|
|
__raw_writel(((parent->start)>>16) | 0xffff0000,
|
|
- (unsigned long)&(ioc->ioc_hpa->io_io_low_hv));
|
|
+ &ioc->ioc_regs->io_io_low_hv);
|
|
__raw_writel(((parent->end)>>16) | 0xffff0000,
|
|
- (unsigned long)&(ioc->ioc_hpa->io_io_high_hv));
|
|
+ &ioc->ioc_regs->io_io_high_hv);
|
|
} else {
|
|
return -EBUSY;
|
|
}
|
|
@@ -1554,7 +1558,7 @@
|
|
*ioc_p = ioc;
|
|
|
|
ioc->hw_path = dev->hw_path;
|
|
- ioc->ioc_hpa = (struct ioa_registers *)dev->hpa;
|
|
+ ioc->ioc_regs = ioremap(dev->hpa, 4096);
|
|
ccio_ioc_init(ioc);
|
|
ccio_init_resources(ioc);
|
|
hppa_dma_ops = &ccio_ops;
|
|
Index: linux-2.6-2.6.12/drivers/parisc/led.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/parisc/led.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/parisc/led.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -18,6 +18,9 @@
|
|
* Changes:
|
|
* - Audit copy_from_user in led_proc_write.
|
|
* Daniele Bellucci <bellucda@tiscali.it>
|
|
+ * - Switch from using a tasklet to a work queue, so the led_LCD_driver
|
|
+ * can sleep.
|
|
+ * David Pye <dmp@davidmpye.dyndns.org>
|
|
*/
|
|
|
|
#include <linux/config.h>
|
|
@@ -37,6 +40,7 @@
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/ctype.h>
|
|
#include <linux/blkdev.h>
|
|
+#include <linux/workqueue.h>
|
|
#include <asm/io.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/hardware.h>
|
|
@@ -46,25 +50,30 @@
|
|
#include <asm/uaccess.h>
|
|
|
|
/* The control of the LEDs and LCDs on PARISC-machines have to be done
|
|
- completely in software. The necessary calculations are done in a tasklet
|
|
- which is scheduled at every timer interrupt and since the calculations
|
|
- may consume relatively much CPU-time some of the calculations can be
|
|
+ completely in software. The necessary calculations are done in a work queue
|
|
+ task which is scheduled regularly, and since the calculations may consume a
|
|
+ relatively large amount of CPU time, some of the calculations can be
|
|
turned off with the following variables (controlled via procfs) */
|
|
|
|
static int led_type = -1;
|
|
-static int led_heartbeat = 1;
|
|
-static int led_diskio = 1;
|
|
-static int led_lanrxtx = 1;
|
|
+static unsigned char lastleds; /* LED state from most recent update */
|
|
+static unsigned int led_heartbeat = 1;
|
|
+static unsigned int led_diskio = 1;
|
|
+static unsigned int led_lanrxtx = 1;
|
|
static char lcd_text[32];
|
|
static char lcd_text_default[32];
|
|
|
|
+
|
|
+static struct workqueue_struct *led_wq;
|
|
+static void led_work_func(void *);
|
|
+static DECLARE_WORK(led_task, led_work_func, NULL);
|
|
+
|
|
#if 0
|
|
#define DPRINTK(x) printk x
|
|
#else
|
|
#define DPRINTK(x)
|
|
#endif
|
|
|
|
-
|
|
struct lcd_block {
|
|
unsigned char command; /* stores the command byte */
|
|
unsigned char on; /* value for turning LED on */
|
|
@@ -115,12 +124,27 @@
|
|
#define LCD_DATA_REG lcd_info.lcd_data_reg_addr
|
|
#define LED_DATA_REG lcd_info.lcd_cmd_reg_addr /* LASI & ASP only */
|
|
|
|
+#define LED_HASLCD 1
|
|
+#define LED_NOLCD 0
|
|
+
|
|
+/* The workqueue must be created at init-time */
|
|
+static int start_task(void)
|
|
+{
|
|
+ /* Display the default text now */
|
|
+ if (led_type == LED_HASLCD) lcd_print( lcd_text_default );
|
|
+
|
|
+ /* Create the work queue and queue the LED task */
|
|
+ led_wq = create_singlethread_workqueue("led_wq");
|
|
+ queue_work(led_wq, &led_task);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+device_initcall(start_task);
|
|
|
|
/* ptr to LCD/LED-specific function */
|
|
static void (*led_func_ptr) (unsigned char);
|
|
|
|
-#define LED_HASLCD 1
|
|
-#define LED_NOLCD 0
|
|
#ifdef CONFIG_PROC_FS
|
|
static int led_proc_read(char *page, char **start, off_t off, int count,
|
|
int *eof, void *data)
|
|
@@ -285,52 +309,35 @@
|
|
/*
|
|
**
|
|
** led_LCD_driver()
|
|
- **
|
|
- ** The logic of the LCD driver is, that we write at every scheduled call
|
|
- ** only to one of LCD_CMD_REG _or_ LCD_DATA_REG - registers.
|
|
- ** That way we don't need to let this tasklet busywait for min_cmd_delay
|
|
- ** milliseconds.
|
|
- **
|
|
- ** TODO: check the value of "min_cmd_delay" against the value of HZ.
|
|
**
|
|
*/
|
|
static void led_LCD_driver(unsigned char leds)
|
|
{
|
|
- static int last_index; /* 0:heartbeat, 1:disk, 2:lan_in, 3:lan_out */
|
|
- static int last_was_cmd;/* 0: CMD was written last, 1: DATA was last */
|
|
- struct lcd_block *block_ptr;
|
|
- int value;
|
|
-
|
|
- switch (last_index) {
|
|
- case 0: block_ptr = &lcd_info.heartbeat;
|
|
- value = leds & LED_HEARTBEAT;
|
|
- break;
|
|
- case 1: block_ptr = &lcd_info.disk_io;
|
|
- value = leds & LED_DISK_IO;
|
|
- break;
|
|
- case 2: block_ptr = &lcd_info.lan_rcv;
|
|
- value = leds & LED_LAN_RCV;
|
|
- break;
|
|
- case 3: block_ptr = &lcd_info.lan_tx;
|
|
- value = leds & LED_LAN_TX;
|
|
- break;
|
|
- default: /* should never happen: */
|
|
- return;
|
|
- }
|
|
+ static int i;
|
|
+ static unsigned char mask[4] = { LED_HEARTBEAT, LED_DISK_IO,
|
|
+ LED_LAN_RCV, LED_LAN_TX };
|
|
+
|
|
+ static struct lcd_block * blockp[4] = {
|
|
+ &lcd_info.heartbeat,
|
|
+ &lcd_info.disk_io,
|
|
+ &lcd_info.lan_rcv,
|
|
+ &lcd_info.lan_tx
|
|
+ };
|
|
|
|
- if (last_was_cmd) {
|
|
- /* write the value to the LCD data port */
|
|
- gsc_writeb( value ? block_ptr->on : block_ptr->off, LCD_DATA_REG );
|
|
- } else {
|
|
- /* write the command-byte to the LCD command register */
|
|
- gsc_writeb( block_ptr->command, LCD_CMD_REG );
|
|
- }
|
|
-
|
|
- /* now update the vars for the next interrupt iteration */
|
|
- if (++last_was_cmd == 2) { /* switch between cmd & data */
|
|
- last_was_cmd = 0;
|
|
- if (++last_index == 4)
|
|
- last_index = 0; /* switch back to heartbeat index */
|
|
+ /* Convert min_cmd_delay to milliseconds */
|
|
+ unsigned int msec_cmd_delay = 1 + (lcd_info.min_cmd_delay / 1000);
|
|
+
|
|
+ for (i=0; i<4; ++i)
|
|
+ {
|
|
+ if ((leds & mask[i]) != (lastleds & mask[i]))
|
|
+ {
|
|
+ gsc_writeb( blockp[i]->command, LCD_CMD_REG );
|
|
+ msleep(msec_cmd_delay);
|
|
+
|
|
+ gsc_writeb( leds & mask[i] ? blockp[i]->on :
|
|
+ blockp[i]->off, LCD_DATA_REG );
|
|
+ msleep(msec_cmd_delay);
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -355,7 +362,7 @@
|
|
|
|
rx_total = tx_total = 0;
|
|
|
|
- /* we are running as tasklet, so locking dev_base
|
|
+ /* we are running as a workqueue task, so locking dev_base
|
|
* for reading should be OK */
|
|
read_lock(&dev_base_lock);
|
|
for (dev = dev_base; dev; dev = dev->next) {
|
|
@@ -402,7 +409,7 @@
|
|
static unsigned long last_pgpgin, last_pgpgout;
|
|
struct page_state pgstat;
|
|
int changed;
|
|
-
|
|
+
|
|
get_full_page_state(&pgstat); /* get no of sectors in & out */
|
|
|
|
/* Just use a very simple calculation here. Do not care about overflow,
|
|
@@ -410,86 +417,70 @@
|
|
changed = (pgstat.pgpgin != last_pgpgin) || (pgstat.pgpgout != last_pgpgout);
|
|
last_pgpgin = pgstat.pgpgin;
|
|
last_pgpgout = pgstat.pgpgout;
|
|
-
|
|
+
|
|
return (changed ? LED_DISK_IO : 0);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
- ** led_tasklet_func()
|
|
+ ** led_work_func()
|
|
**
|
|
- ** is scheduled at every timer interrupt from time.c and
|
|
- ** updates the chassis LCD/LED
|
|
+ ** manages when and which chassis LCD/LED gets updated
|
|
|
|
TODO:
|
|
- display load average (older machines like 715/64 have 4 "free" LED's for that)
|
|
- optimizations
|
|
*/
|
|
|
|
-#define HEARTBEAT_LEN (HZ*6/100)
|
|
-#define HEARTBEAT_2ND_RANGE_START (HZ*22/100)
|
|
+#define HEARTBEAT_LEN (HZ*10/100)
|
|
+#define HEARTBEAT_2ND_RANGE_START (HZ*28/100)
|
|
#define HEARTBEAT_2ND_RANGE_END (HEARTBEAT_2ND_RANGE_START + HEARTBEAT_LEN)
|
|
|
|
-#define NORMALIZED_COUNT(count) (count/(HZ/100))
|
|
+#define LED_UPDATE_INTERVAL (1 + (HZ*19/1000))
|
|
|
|
-static void led_tasklet_func(unsigned long unused)
|
|
+static void led_work_func (void *unused)
|
|
{
|
|
- static unsigned char lastleds;
|
|
- unsigned char currentleds; /* stores current value of the LEDs */
|
|
- static unsigned long count; /* static incremented value, not wrapped */
|
|
+ static unsigned long last_jiffies;
|
|
static unsigned long count_HZ; /* counter in range 0..HZ */
|
|
+ unsigned char currentleds = 0; /* stores current value of the LEDs */
|
|
|
|
/* exit if not initialized */
|
|
if (!led_func_ptr)
|
|
return;
|
|
|
|
- /* increment the local counters */
|
|
- ++count;
|
|
- if (++count_HZ == HZ)
|
|
+ /* increment the heartbeat timekeeper */
|
|
+ count_HZ += jiffies - last_jiffies;
|
|
+ last_jiffies = jiffies;
|
|
+ if (count_HZ >= HZ)
|
|
count_HZ = 0;
|
|
|
|
- currentleds = lastleds;
|
|
-
|
|
- if (led_heartbeat)
|
|
- {
|
|
- /* flash heartbeat-LED like a real heart (2 x short then a long delay) */
|
|
- if (count_HZ<HEARTBEAT_LEN ||
|
|
- (count_HZ>=HEARTBEAT_2ND_RANGE_START && count_HZ<HEARTBEAT_2ND_RANGE_END))
|
|
- currentleds |= LED_HEARTBEAT;
|
|
- else
|
|
- currentleds &= ~LED_HEARTBEAT;
|
|
- }
|
|
-
|
|
- /* look for network activity and flash LEDs respectively */
|
|
- if (led_lanrxtx && ((NORMALIZED_COUNT(count)+(8/2)) & 7) == 0)
|
|
+ if (likely(led_heartbeat))
|
|
{
|
|
- currentleds &= ~(LED_LAN_RCV | LED_LAN_TX);
|
|
- currentleds |= led_get_net_activity();
|
|
+ /* flash heartbeat-LED like a real heart
|
|
+ * (2 x short then a long delay)
|
|
+ */
|
|
+ if (count_HZ < HEARTBEAT_LEN ||
|
|
+ (count_HZ >= HEARTBEAT_2ND_RANGE_START &&
|
|
+ count_HZ < HEARTBEAT_2ND_RANGE_END))
|
|
+ currentleds |= LED_HEARTBEAT;
|
|
}
|
|
|
|
- /* avoid to calculate diskio-stats at same irq as netio-stats */
|
|
- if (led_diskio && (NORMALIZED_COUNT(count) & 7) == 0)
|
|
- {
|
|
- currentleds &= ~LED_DISK_IO;
|
|
- currentleds |= led_get_diskio_activity();
|
|
- }
|
|
+ if (likely(led_lanrxtx)) currentleds |= led_get_net_activity();
|
|
+ if (likely(led_diskio)) currentleds |= led_get_diskio_activity();
|
|
|
|
/* blink all LEDs twice a second if we got an Oops (HPMC) */
|
|
- if (oops_in_progress) {
|
|
+ if (unlikely(oops_in_progress))
|
|
currentleds = (count_HZ<=(HZ/2)) ? 0 : 0xff;
|
|
- }
|
|
-
|
|
- /* update the LCD/LEDs */
|
|
- if (currentleds != lastleds) {
|
|
- led_func_ptr(currentleds);
|
|
- lastleds = currentleds;
|
|
- }
|
|
-}
|
|
|
|
-/* main led tasklet struct (scheduled from time.c) */
|
|
-DECLARE_TASKLET_DISABLED(led_tasklet, led_tasklet_func, 0);
|
|
+ if (currentleds != lastleds)
|
|
+ {
|
|
+ led_func_ptr(currentleds); /* Update the LCD/LEDs */
|
|
+ lastleds = currentleds;
|
|
+ }
|
|
|
|
+ queue_delayed_work(led_wq, &led_task, LED_UPDATE_INTERVAL);
|
|
+}
|
|
|
|
/*
|
|
** led_halt()
|
|
@@ -519,9 +510,13 @@
|
|
default: return NOTIFY_DONE;
|
|
}
|
|
|
|
- /* completely stop the LED/LCD tasklet */
|
|
- tasklet_disable(&led_tasklet);
|
|
-
|
|
+ /* Cancel the work item and delete the queue */
|
|
+ if (led_wq) {
|
|
+ cancel_rearming_delayed_workqueue(led_wq, &led_task);
|
|
+ destroy_workqueue(led_wq);
|
|
+ led_wq = NULL;
|
|
+ }
|
|
+
|
|
if (lcd_info.model == DISPLAY_MODEL_LCD)
|
|
lcd_print(txt);
|
|
else
|
|
@@ -556,7 +551,6 @@
|
|
printk(KERN_INFO "LCD display at %lx,%lx registered\n",
|
|
LCD_CMD_REG , LCD_DATA_REG);
|
|
led_func_ptr = led_LCD_driver;
|
|
- lcd_print( lcd_text_default );
|
|
led_type = LED_HASLCD;
|
|
break;
|
|
|
|
@@ -586,9 +580,11 @@
|
|
initialized++;
|
|
register_reboot_notifier(&led_notifier);
|
|
|
|
- /* start the led tasklet for the first time */
|
|
- tasklet_enable(&led_tasklet);
|
|
-
|
|
+ /* Ensure the work is queued */
|
|
+ if (led_wq) {
|
|
+ queue_work(led_wq, &led_task);
|
|
+ }
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -623,8 +619,8 @@
|
|
** lcd_print()
|
|
**
|
|
** Displays the given string on the LCD-Display of newer machines.
|
|
- ** lcd_print() disables the timer-based led tasklet during its
|
|
- ** execution and enables it afterwards again.
|
|
+ ** lcd_print() disables/enables the timer-based led work queue to
|
|
+ ** avoid a race condition while writing the CMD/DATA register pair.
|
|
**
|
|
*/
|
|
int lcd_print( char *str )
|
|
@@ -634,12 +630,13 @@
|
|
if (!led_func_ptr || lcd_info.model != DISPLAY_MODEL_LCD)
|
|
return 0;
|
|
|
|
- /* temporarily disable the led tasklet */
|
|
- tasklet_disable(&led_tasklet);
|
|
+ /* temporarily disable the led work task */
|
|
+ if (led_wq)
|
|
+ cancel_rearming_delayed_workqueue(led_wq, &led_task);
|
|
|
|
/* copy display string to buffer for procfs */
|
|
strlcpy(lcd_text, str, sizeof(lcd_text));
|
|
-
|
|
+
|
|
/* Set LCD Cursor to 1st character */
|
|
gsc_writeb(lcd_info.reset_cmd1, LCD_CMD_REG);
|
|
udelay(lcd_info.min_cmd_delay);
|
|
@@ -653,8 +650,10 @@
|
|
udelay(lcd_info.min_cmd_delay);
|
|
}
|
|
|
|
- /* re-enable the led tasklet */
|
|
- tasklet_enable(&led_tasklet);
|
|
+ /* re-queue the work */
|
|
+ if (led_wq) {
|
|
+ queue_work(led_wq, &led_task);
|
|
+ }
|
|
|
|
return lcd_info.lcd_width;
|
|
}
|
|
Index: linux-2.6-2.6.12/drivers/parisc/pdc_stable.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/parisc/pdc_stable.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/parisc/pdc_stable.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -536,7 +536,7 @@
|
|
|
|
out += sprintf(out, "Memory tested: ");
|
|
if ((result & 0x0F) < 0x0E)
|
|
- out += sprintf(out, "%.3f MB", 0.256*(1<<(result & 0x0F)));
|
|
+ out += sprintf(out, "%d kB", (1<<(result & 0x0F))*256);
|
|
else
|
|
out += sprintf(out, "All");
|
|
out += sprintf(out, "\n");
|
|
Index: linux-2.6-2.6.12/drivers/parisc/sba_iommu.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/parisc/sba_iommu.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/parisc/sba_iommu.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -91,7 +91,7 @@
|
|
#define DBG_RES(x...)
|
|
#endif
|
|
|
|
-#if defined(__LP64__) && !defined(CONFIG_PDC_NARROW)
|
|
+#if defined(CONFIG_64BIT) && !defined(CONFIG_PDC_NARROW)
|
|
/* "low end" PA8800 machines use ZX1 chipset */
|
|
#define ZX1_SUPPORT
|
|
#endif
|
|
@@ -231,7 +231,7 @@
|
|
spinlock_t res_lock;
|
|
unsigned int res_bitshift; /* from the LEFT! */
|
|
unsigned int res_size; /* size of resource map in bytes */
|
|
-#if SBA_HINT_SUPPORT
|
|
+#ifdef SBA_HINT_SUPPORT
|
|
/* FIXME : DMA HINTs not used */
|
|
unsigned long hint_mask_pdir; /* bits used for DMA hints */
|
|
unsigned int hint_shift_pdir;
|
|
@@ -294,7 +294,7 @@
|
|
/* Looks nice and keeps the compiler happy */
|
|
#define SBA_DEV(d) ((struct sba_device *) (d))
|
|
|
|
-#if SBA_AGP_SUPPORT
|
|
+#ifdef SBA_AGP_SUPPORT
|
|
static int reserve_sba_gart = 1;
|
|
#endif
|
|
|
|
@@ -314,7 +314,7 @@
|
|
#define WRITE_REG32(val, addr) __raw_writel(cpu_to_le32(val), addr)
|
|
#define WRITE_REG64(val, addr) __raw_writeq(cpu_to_le64(val), addr)
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
#define READ_REG(addr) READ_REG64(addr)
|
|
#define WRITE_REG(value, addr) WRITE_REG64(value, addr)
|
|
#else
|
|
@@ -324,7 +324,7 @@
|
|
|
|
#ifdef DEBUG_SBA_INIT
|
|
|
|
-/* NOTE: When __LP64__ isn't defined, READ_REG64() is two 32-bit reads */
|
|
+/* NOTE: When CONFIG_64BIT isn't defined, READ_REG64() is two 32-bit reads */
|
|
|
|
/**
|
|
* sba_dump_ranges - debugging only - print ranges assigned to this IOA
|
|
@@ -364,7 +364,7 @@
|
|
#else
|
|
#define sba_dump_ranges(x)
|
|
#define sba_dump_tlb(x)
|
|
-#endif
|
|
+#endif /* DEBUG_SBA_INIT */
|
|
|
|
|
|
#ifdef ASSERT_PDIR_SANITY
|
|
@@ -674,7 +674,7 @@
|
|
*
|
|
***************************************************************/
|
|
|
|
-#if SBA_HINT_SUPPORT
|
|
+#ifdef SBA_HINT_SUPPORT
|
|
#define SBA_DMA_HINT(ioc, val) ((val) << (ioc)->hint_shift_pdir)
|
|
#endif
|
|
|
|
@@ -819,18 +819,29 @@
|
|
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);
|
|
}
|
|
|
|
- ioc = GET_IOC(dev);
|
|
+ /* Documentation/DMA-mapping.txt tells drivers to try 64-bit first,
|
|
+ * then fall back to 32-bit if that fails.
|
|
+ * We are just "encouraging" 32-bit DMA masks here since we can
|
|
+ * never allow IOMMU bypass unless we add special support for ZX1.
|
|
+ */
|
|
+ if (mask > ~0U)
|
|
+ return 0;
|
|
|
|
- /* check if mask is > than the largest IO Virt Address */
|
|
+ ioc = GET_IOC(dev);
|
|
|
|
- return((int) (mask >= (ioc->ibase +
|
|
- (ioc->pdir_size / sizeof(u64) * IOVP_SIZE) )));
|
|
+ /*
|
|
+ * check if mask is >= than the current max IO Virt Address
|
|
+ * The max IO Virt address will *always* < 30 bits.
|
|
+ */
|
|
+ return((int)(mask >= (ioc->ibase - 1 +
|
|
+ (ioc->pdir_size / sizeof(u64) * IOVP_SIZE) )));
|
|
}
|
|
|
|
|
|
@@ -1234,8 +1245,10 @@
|
|
unsigned long pdir_order = get_order(pdir_size);
|
|
|
|
pdir_base = __get_free_pages(GFP_KERNEL, pdir_order);
|
|
- if (NULL == (void *) pdir_base)
|
|
- panic("sba_ioc_init() could not allocate I/O Page Table\n");
|
|
+ if (NULL == (void *) pdir_base) {
|
|
+ panic("%s() could not allocate I/O Page Table\n",
|
|
+ __FUNCTION__);
|
|
+ }
|
|
|
|
/* If this is not PA8700 (PCX-W2)
|
|
** OR newer than ver 2.2
|
|
@@ -1343,7 +1356,7 @@
|
|
u32 iova_space_mask;
|
|
u32 iova_space_size;
|
|
int iov_order, tcnfg;
|
|
-#if SBA_AGP_SUPPORT
|
|
+#ifdef SBA_AGP_SUPPORT
|
|
int agp_found = 0;
|
|
#endif
|
|
/*
|
|
@@ -1380,7 +1393,7 @@
|
|
DBG_INIT("%s() pdir %p size %x\n",
|
|
__FUNCTION__, ioc->pdir_base, ioc->pdir_size);
|
|
|
|
-#if SBA_HINT_SUPPORT
|
|
+#ifdef SBA_HINT_SUPPORT
|
|
ioc->hint_shift_pdir = iov_order + PAGE_SHIFT;
|
|
ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT));
|
|
|
|
@@ -1404,7 +1417,7 @@
|
|
|
|
WRITE_REG(ioc->imask, ioc->ioc_hpa + IOC_IMASK);
|
|
|
|
-#ifdef __LP64__
|
|
+#ifdef CONFIG_64BIT
|
|
/*
|
|
** Setting the upper bits makes checking for bypass addresses
|
|
** a little faster later on.
|
|
@@ -1437,7 +1450,7 @@
|
|
*/
|
|
WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);
|
|
|
|
-#if SBA_AGP_SUPPORT
|
|
+#ifdef SBA_AGP_SUPPORT
|
|
/*
|
|
** If an AGP device is present, only use half of the IOV space
|
|
** for PCI DMA. Unfortunately we can't know ahead of time
|
|
@@ -1489,11 +1502,9 @@
|
|
if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
|
|
iova_space_size = 1 << (20 - PAGE_SHIFT);
|
|
}
|
|
-#ifdef __LP64__
|
|
else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) {
|
|
iova_space_size = 1 << (30 - PAGE_SHIFT);
|
|
}
|
|
-#endif
|
|
|
|
/*
|
|
** iova space must be log2() in size.
|
|
@@ -1519,7 +1530,7 @@
|
|
DBG_INIT("%s() pdir %p size %x\n",
|
|
__FUNCTION__, ioc->pdir_base, pdir_size);
|
|
|
|
-#if SBA_HINT_SUPPORT
|
|
+#ifdef SBA_HINT_SUPPORT
|
|
/* FIXME : DMA HINTs not used */
|
|
ioc->hint_shift_pdir = iov_order + PAGE_SHIFT;
|
|
ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT));
|
|
Index: linux-2.6-2.6.12/drivers/pcmcia/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/pcmcia/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/pcmcia/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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"
|
|
Index: linux-2.6-2.6.12/drivers/pcmcia/rsrc_nonstatic.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/pcmcia/rsrc_nonstatic.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/pcmcia/rsrc_nonstatic.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -43,7 +43,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);
|
|
Index: linux-2.6-2.6.12/drivers/scsi/53c700.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/53c700.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/53c700.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -302,6 +302,7 @@
|
|
__u8 *memory;
|
|
__u32 *script;
|
|
struct Scsi_Host *host;
|
|
+ const char *chipname;
|
|
static int banner = 0;
|
|
int j;
|
|
|
|
@@ -403,11 +404,11 @@
|
|
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);
|
|
|
|
Index: linux-2.6-2.6.12/drivers/scsi/lasi700.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/lasi700.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/lasi700.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -125,8 +125,6 @@
|
|
hostdata->dmode_extra = DMODE_FC2;
|
|
}
|
|
|
|
- NCR_700_set_mem_mapped(hostdata);
|
|
-
|
|
host = NCR_700_detect(&lasi700_template, hostdata, &dev->dev);
|
|
if (!host)
|
|
goto out_kfree;
|
|
Index: linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_defs.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/sym53c8xx_2/sym_defs.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_defs.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -40,7 +40,7 @@
|
|
#ifndef SYM_DEFS_H
|
|
#define SYM_DEFS_H
|
|
|
|
-#define SYM_VERSION "2.2.0"
|
|
+#define SYM_VERSION "2.2.1"
|
|
#define SYM_DRIVER_NAME "sym-" SYM_VERSION
|
|
|
|
/*
|
|
Index: linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_glue.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/sym53c8xx_2/sym_glue.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_glue.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -155,10 +155,11 @@
|
|
base = tmp;
|
|
if ((tmp & 0x7) == PCI_BASE_ADDRESS_MEM_TYPE_64) {
|
|
pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp);
|
|
- if (tmp > 0)
|
|
+ if (tmp > 0) {
|
|
dev_err(&pdev->dev,
|
|
"BAR %d is 64-bit, disabling\n", index - 1);
|
|
- base = 0;
|
|
+ base = 0;
|
|
+ }
|
|
}
|
|
|
|
if ((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
|
|
@@ -389,13 +390,20 @@
|
|
{
|
|
struct sym_tblmove *data = &cp->phys.data[SYM_CONF_MAX_SG-1];
|
|
int segment;
|
|
+ unsigned int len = cmd->request_bufflen;
|
|
|
|
- cp->data_len = cmd->request_bufflen;
|
|
-
|
|
- if (cmd->request_bufflen) {
|
|
+ if (len) {
|
|
dma_addr_t baddr = map_scsi_single_data(np, cmd);
|
|
if (baddr) {
|
|
- sym_build_sge(np, data, baddr, cmd->request_bufflen);
|
|
+ if (len & 1) {
|
|
+ struct sym_tcb *tp = &np->target[cp->target];
|
|
+ if (tp->head.wval & EWS) {
|
|
+ len++;
|
|
+ cp->odd_byte_adjustment++;
|
|
+ }
|
|
+ }
|
|
+ cp->data_len = len;
|
|
+ sym_build_sge(np, data, baddr, len);
|
|
segment = 1;
|
|
} else {
|
|
segment = -2;
|
|
@@ -418,6 +426,7 @@
|
|
segment = sym_scatter_no_sglist(np, cp, cmd);
|
|
else if ((use_sg = map_scsi_sg_data(np, cmd)) > 0) {
|
|
struct scatterlist *scatter = (struct scatterlist *)cmd->buffer;
|
|
+ struct sym_tcb *tp = &np->target[cp->target];
|
|
struct sym_tblmove *data;
|
|
|
|
if (use_sg > SYM_CONF_MAX_SG) {
|
|
@@ -431,6 +440,11 @@
|
|
dma_addr_t baddr = sg_dma_address(&scatter[segment]);
|
|
unsigned int len = sg_dma_len(&scatter[segment]);
|
|
|
|
+ if ((len & 1) && (tp->head.wval & EWS)) {
|
|
+ len++;
|
|
+ cp->odd_byte_adjustment++;
|
|
+ }
|
|
+
|
|
sym_build_sge(np, &data[segment], baddr, len);
|
|
cp->data_len += len;
|
|
}
|
|
@@ -456,10 +470,8 @@
|
|
* Minimal checkings, so that we will not
|
|
* go outside our tables.
|
|
*/
|
|
- 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);
|
|
+ if (sdev->id == np->myaddr) {
|
|
+ sym_xpt_done2(np, cmd, DID_NO_CONNECT);
|
|
return 0;
|
|
}
|
|
|
|
@@ -469,28 +481,6 @@
|
|
tp = &np->target[sdev->id];
|
|
|
|
/*
|
|
- * Complete the 1st INQUIRY command with error
|
|
- * condition if the device is flagged NOSCAN
|
|
- * at BOOT in the NVRAM. This may speed up
|
|
- * the boot and maintain coherency with BIOS
|
|
- * device numbering. Clearing the flag allows
|
|
- * user to rescan skipped devices later.
|
|
- * We also return error for devices not flagged
|
|
- * for SCAN LUNS in the NVRAM since some mono-lun
|
|
- * devices behave badly when asked for some non
|
|
- * zero LUN. Btw, this is an absolute hack.:-)
|
|
- */
|
|
- if (cmd->cmnd[0] == 0x12 || cmd->cmnd[0] == 0x0) {
|
|
- if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) ||
|
|
- ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) &&
|
|
- sdev->lun != 0)) {
|
|
- tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
|
|
- sym_xpt_done2(np, cmd, CAM_DEV_NOT_THERE);
|
|
- return 0;
|
|
- }
|
|
- }
|
|
-
|
|
- /*
|
|
* Select tagged/untagged.
|
|
*/
|
|
lp = sym_lp(tp, sdev->lun);
|
|
@@ -511,23 +501,10 @@
|
|
*/
|
|
static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp)
|
|
{
|
|
- u32 cmd_ba;
|
|
- int cmd_len;
|
|
-
|
|
- /*
|
|
- * CDB is 16 bytes max.
|
|
- */
|
|
- if (cmd->cmd_len > sizeof(cp->cdb_buf)) {
|
|
- sym_set_cam_status(cp->cmd, CAM_REQ_INVALID);
|
|
- return -1;
|
|
- }
|
|
-
|
|
memcpy(cp->cdb_buf, cmd->cmnd, cmd->cmd_len);
|
|
- cmd_ba = CCB_BA (cp, cdb_buf[0]);
|
|
- cmd_len = cmd->cmd_len;
|
|
|
|
- cp->phys.cmd.addr = cpu_to_scr(cmd_ba);
|
|
- cp->phys.cmd.size = cpu_to_scr(cmd_len);
|
|
+ cp->phys.cmd.addr = CCB_BA(cp, cdb_buf[0]);
|
|
+ cp->phys.cmd.size = cpu_to_scr(cmd->cmd_len);
|
|
|
|
return 0;
|
|
}
|
|
@@ -554,10 +531,7 @@
|
|
if (dir != DMA_NONE) {
|
|
cp->segments = sym_scatter(np, cp, cmd);
|
|
if (cp->segments < 0) {
|
|
- if (cp->segments == -2)
|
|
- sym_set_cam_status(cmd, CAM_RESRC_UNAVAIL);
|
|
- else
|
|
- sym_set_cam_status(cmd, CAM_REQ_TOO_BIG);
|
|
+ sym_set_cam_status(cmd, DID_ERROR);
|
|
goto out_abort;
|
|
}
|
|
} else {
|
|
@@ -855,7 +829,7 @@
|
|
ep->to_do = to_do;
|
|
/* Complete the command with locks held as required by the driver */
|
|
if (to_do == SYM_EH_DO_COMPLETE)
|
|
- sym_xpt_done2(np, cmd, CAM_REQ_ABORTED);
|
|
+ sym_xpt_done2(np, cmd, DID_ABORT);
|
|
|
|
/* Wait for completion with locks released, as required by kernel */
|
|
if (to_do == SYM_EH_DO_WAIT) {
|
|
@@ -921,7 +895,7 @@
|
|
lp->s.reqtags = reqtags;
|
|
|
|
if (reqtags != oldtags) {
|
|
- dev_info(&tp->sdev->sdev_target->dev,
|
|
+ dev_info(&tp->starget->dev,
|
|
"tagged command queuing %s, command queue depth %d.\n",
|
|
lp->s.reqtags ? "enabled" : "disabled",
|
|
lp->started_limit);
|
|
@@ -981,22 +955,34 @@
|
|
return DEF_DEPTH;
|
|
}
|
|
|
|
-static int sym53c8xx_slave_alloc(struct scsi_device *device)
|
|
+static int sym53c8xx_slave_alloc(struct scsi_device *sdev)
|
|
{
|
|
- struct sym_hcb *np = sym_get_hcb(device->host);
|
|
- struct sym_tcb *tp = &np->target[device->id];
|
|
- if (!tp->sdev)
|
|
- tp->sdev = device;
|
|
+ struct sym_hcb *np;
|
|
+ struct sym_tcb *tp;
|
|
|
|
- return 0;
|
|
-}
|
|
+ if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN)
|
|
+ return -ENXIO;
|
|
|
|
-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;
|
|
+ np = sym_get_hcb(sdev->host);
|
|
+ tp = &np->target[sdev->id];
|
|
+
|
|
+ /*
|
|
+ * Fail the device init if the device is flagged NOSCAN at BOOT in
|
|
+ * the NVRAM. This may speed up boot and maintain coherency with
|
|
+ * BIOS device numbering. Clearing the flag allows the user to
|
|
+ * rescan skipped devices later. We also return an error for
|
|
+ * devices not flagged for SCAN LUNS in the NVRAM since some single
|
|
+ * lun devices behave badly when asked for a non zero LUN.
|
|
+ */
|
|
+
|
|
+ if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) ||
|
|
+ ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) && sdev->lun != 0)) {
|
|
+ tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED;
|
|
+ return -ENXIO;
|
|
+ }
|
|
+
|
|
+ tp->starget = sdev->sdev_target;
|
|
+ return 0;
|
|
}
|
|
|
|
/*
|
|
@@ -1897,6 +1883,7 @@
|
|
*/
|
|
printk("%s: resetting chip\n", sym_name(np));
|
|
OUTB(np, nc_istat, SRST);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(10);
|
|
OUTB(np, nc_istat, 0);
|
|
|
|
@@ -1915,7 +1902,6 @@
|
|
.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,
|
|
Index: linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_glue.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/sym53c8xx_2/sym_glue.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_glue.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -142,33 +142,6 @@
|
|
#define scr_to_cpu(dw) le32_to_cpu(dw)
|
|
|
|
/*
|
|
- * Remap some status field values.
|
|
- */
|
|
-#define CAM_REQ_CMP DID_OK
|
|
-#define CAM_SEL_TIMEOUT DID_NO_CONNECT
|
|
-#define CAM_CMD_TIMEOUT DID_TIME_OUT
|
|
-#define CAM_REQ_ABORTED DID_ABORT
|
|
-#define CAM_UNCOR_PARITY DID_PARITY
|
|
-#define CAM_SCSI_BUS_RESET DID_RESET
|
|
-#define CAM_REQUEUE_REQ DID_SOFT_ERROR
|
|
-#define CAM_UNEXP_BUSFREE DID_ERROR
|
|
-#define CAM_SCSI_BUSY DID_BUS_BUSY
|
|
-
|
|
-#define CAM_DEV_NOT_THERE DID_NO_CONNECT
|
|
-#define CAM_REQ_INVALID DID_ERROR
|
|
-#define CAM_REQ_TOO_BIG DID_ERROR
|
|
-
|
|
-#define CAM_RESRC_UNAVAIL DID_ERROR
|
|
-
|
|
-/*
|
|
- * Remap data direction values.
|
|
- */
|
|
-#define CAM_DIR_NONE DMA_NONE
|
|
-#define CAM_DIR_IN DMA_FROM_DEVICE
|
|
-#define CAM_DIR_OUT DMA_TO_DEVICE
|
|
-#define CAM_DIR_UNKNOWN DMA_BIDIRECTIONAL
|
|
-
|
|
-/*
|
|
* These ones are used as return code from
|
|
* error recovery handlers under Linux.
|
|
*/
|
|
Index: linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_hipd.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/sym53c8xx_2/sym_hipd.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_hipd.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -97,7 +97,7 @@
|
|
static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_char *msg)
|
|
{
|
|
struct sym_tcb *tp = &np->target[target];
|
|
- dev_info(&tp->sdev->sdev_target->dev, "%s: ", label);
|
|
+ dev_info(&tp->starget->dev, "%s: ", label);
|
|
|
|
sym_show_msg(msg);
|
|
printf(".\n");
|
|
@@ -149,8 +149,10 @@
|
|
static void sym_chip_reset (struct sym_hcb *np)
|
|
{
|
|
OUTB(np, nc_istat, SRST);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(10);
|
|
OUTB(np, nc_istat, 0);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(2000); /* For BUS MODE to settle */
|
|
}
|
|
|
|
@@ -216,6 +218,7 @@
|
|
OUTB(np, nc_stest3, TE);
|
|
OUTB(np, nc_dcntl, (np->rv_dcntl & IRQM));
|
|
OUTB(np, nc_scntl1, CRST);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(200);
|
|
|
|
if (!SYM_SETUP_SCSI_BUS_CHECK)
|
|
@@ -280,8 +283,10 @@
|
|
if (!i)
|
|
printf("%s: the chip cannot lock the frequency\n",
|
|
sym_name(np));
|
|
- } else
|
|
- udelay((50+10));
|
|
+ } else {
|
|
+ INB(np, nc_mbox1);
|
|
+ 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 */
|
|
@@ -1445,7 +1450,7 @@
|
|
static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgptr)
|
|
{
|
|
struct sym_tcb *tp = &np->target[cp->target];
|
|
- struct scsi_target *starget = tp->sdev->sdev_target;
|
|
+ struct scsi_target *starget = tp->starget;
|
|
struct sym_trans *goal = &tp->tgoal;
|
|
int msglen = 0;
|
|
int nego;
|
|
@@ -1690,7 +1695,7 @@
|
|
if (cam_status)
|
|
sym_set_cam_status(cmd, cam_status);
|
|
#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
|
|
- if (sym_get_cam_status(cmd) == CAM_REQUEUE_REQ) {
|
|
+ if (sym_get_cam_status(cmd) == DID_SOFT_ERROR) {
|
|
struct sym_tcb *tp = &np->target[cp->target];
|
|
struct sym_lcb *lp = sym_lp(tp, cp->lun);
|
|
if (lp) {
|
|
@@ -1791,12 +1796,13 @@
|
|
/*
|
|
* Wakeup all pending jobs.
|
|
*/
|
|
- sym_flush_busy_queue(np, CAM_SCSI_BUS_RESET);
|
|
+ sym_flush_busy_queue(np, DID_RESET);
|
|
|
|
/*
|
|
* Init chip.
|
|
*/
|
|
OUTB(np, nc_istat, 0x00); /* Remove Reset, abort */
|
|
+ INB(np, nc_mbox1);
|
|
udelay(2000); /* The 895 needs time for the bus mode to settle */
|
|
|
|
OUTB(np, nc_scntl0, np->rv_scntl0 | 0xc0);
|
|
@@ -1905,6 +1911,7 @@
|
|
if (np->features & (FE_ULTRA2|FE_ULTRA3)) {
|
|
OUTONW(np, nc_sien, SBMC);
|
|
if (reason == 0) {
|
|
+ INB(np, nc_mbox1);
|
|
mdelay(100);
|
|
INW(np, nc_sist);
|
|
}
|
|
@@ -2074,7 +2081,7 @@
|
|
static void sym_setwide(struct sym_hcb *np, int target, u_char wide)
|
|
{
|
|
struct sym_tcb *tp = &np->target[target];
|
|
- struct scsi_target *starget = tp->sdev->sdev_target;
|
|
+ struct scsi_target *starget = tp->starget;
|
|
|
|
if (spi_width(starget) == wide)
|
|
return;
|
|
@@ -2102,7 +2109,7 @@
|
|
u_char ofs, u_char per, u_char div, u_char fak)
|
|
{
|
|
struct sym_tcb *tp = &np->target[target];
|
|
- struct scsi_target *starget = tp->sdev->sdev_target;
|
|
+ struct scsi_target *starget = tp->starget;
|
|
u_char wide = (tp->head.wval & EWS) ? BUS_16_BIT : BUS_8_BIT;
|
|
|
|
sym_settrans(np, target, 0, ofs, per, wide, div, fak);
|
|
@@ -2129,7 +2136,7 @@
|
|
u_char per, u_char wide, u_char div, u_char fak)
|
|
{
|
|
struct sym_tcb *tp = &np->target[target];
|
|
- struct scsi_target *starget = tp->sdev->sdev_target;
|
|
+ struct scsi_target *starget = tp->starget;
|
|
|
|
sym_settrans(np, target, opts, ofs, per, wide, div, fak);
|
|
|
|
@@ -2944,7 +2951,7 @@
|
|
* Dequeue from the START queue all CCBs that match
|
|
* a given target/lun/task condition (-1 means all),
|
|
* and move them from the BUSY queue to the COMP queue
|
|
- * with CAM_REQUEUE_REQ status condition.
|
|
+ * with DID_SOFT_ERROR status condition.
|
|
* This function is used during error handling/recovery.
|
|
* It is called with SCRIPTS not running.
|
|
*/
|
|
@@ -2974,7 +2981,7 @@
|
|
if ((target == -1 || cp->target == target) &&
|
|
(lun == -1 || cp->lun == lun) &&
|
|
(task == -1 || cp->tag == task)) {
|
|
- sym_set_cam_status(cp->cmd, CAM_REQUEUE_REQ);
|
|
+ sym_set_cam_status(cp->cmd, DID_SOFT_ERROR);
|
|
sym_remque(&cp->link_ccbq);
|
|
sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
|
|
}
|
|
@@ -3093,13 +3100,13 @@
|
|
/*
|
|
* Message table indirect structure.
|
|
*/
|
|
- cp->phys.smsg.addr = cpu_to_scr(CCB_BA(cp, scsi_smsg2));
|
|
+ cp->phys.smsg.addr = 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 = CCB_BA(cp, sensecmd);
|
|
cp->phys.cmd.size = cpu_to_scr(6);
|
|
|
|
/*
|
|
@@ -3116,7 +3123,7 @@
|
|
* sense data
|
|
*/
|
|
memset(cp->sns_bbuf, 0, SYM_SNS_BBUF_LEN);
|
|
- cp->phys.sense.addr = cpu_to_scr(CCB_BA(cp, sns_bbuf));
|
|
+ cp->phys.sense.addr = CCB_BA(cp, sns_bbuf);
|
|
cp->phys.sense.size = cpu_to_scr(SYM_SNS_BBUF_LEN);
|
|
|
|
/*
|
|
@@ -3198,7 +3205,7 @@
|
|
sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
|
|
|
|
/* Preserve the software timeout condition */
|
|
- if (sym_get_cam_status(cmd) != CAM_CMD_TIMEOUT)
|
|
+ if (sym_get_cam_status(cmd) != DID_TIME_OUT)
|
|
sym_set_cam_status(cmd, cam_status);
|
|
++i;
|
|
#if 0
|
|
@@ -3366,7 +3373,7 @@
|
|
* Make sure at least our IO to abort has been dequeued.
|
|
*/
|
|
#ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING
|
|
- assert(i && sym_get_cam_status(cp->cmd) == CAM_REQUEUE_REQ);
|
|
+ assert(i && sym_get_cam_status(cp->cmd) == DID_SOFT_ERROR);
|
|
#else
|
|
sym_remque(&cp->link_ccbq);
|
|
sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
|
|
@@ -3375,9 +3382,9 @@
|
|
* Keep track in cam status of the reason of the abort.
|
|
*/
|
|
if (cp->to_abort == 2)
|
|
- sym_set_cam_status(cp->cmd, CAM_CMD_TIMEOUT);
|
|
+ sym_set_cam_status(cp->cmd, DID_TIME_OUT);
|
|
else
|
|
- sym_set_cam_status(cp->cmd, CAM_REQ_ABORTED);
|
|
+ sym_set_cam_status(cp->cmd, DID_ABORT);
|
|
|
|
/*
|
|
* Complete with error everything that we have dequeued.
|
|
@@ -3491,7 +3498,7 @@
|
|
* conditions not due to timeout.
|
|
*/
|
|
if (cp->to_abort == 2)
|
|
- sym_set_cam_status(cp->cmd, CAM_CMD_TIMEOUT);
|
|
+ sym_set_cam_status(cp->cmd, DID_TIME_OUT);
|
|
cp->to_abort = 0; /* We donnot expect to fail here */
|
|
break;
|
|
|
|
@@ -3502,7 +3509,7 @@
|
|
case SIR_ABORT_SENT:
|
|
target = INB(np, nc_sdid) & 0xf;
|
|
tp = &np->target[target];
|
|
- starget = tp->sdev->sdev_target;
|
|
+ starget = tp->starget;
|
|
|
|
/*
|
|
** If we didn't abort anything, leave here.
|
|
@@ -3551,7 +3558,7 @@
|
|
*/
|
|
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_clear_tasks(np, DID_ABORT, target, lun, task);
|
|
sym_flush_comp_queue(np, 0);
|
|
|
|
/*
|
|
@@ -3566,7 +3573,7 @@
|
|
* Print to the log the message we intend to send.
|
|
*/
|
|
if (num == SIR_TARGET_SELECTED) {
|
|
- dev_info(&tp->sdev->sdev_target->dev, "control msgout:");
|
|
+ dev_info(&tp->starget->dev, "control msgout:");
|
|
sym_printl_hex(np->abrt_msg, np->abrt_tbl.size);
|
|
np->abrt_tbl.size = cpu_to_scr(np->abrt_tbl.size);
|
|
}
|
|
@@ -3877,6 +3884,8 @@
|
|
resid += (tmp & 0xffffff);
|
|
}
|
|
|
|
+ resid -= cp->odd_byte_adjustment;
|
|
+
|
|
/*
|
|
* Hopefully, the result is not too wrong.
|
|
*/
|
|
@@ -4758,10 +4767,8 @@
|
|
}
|
|
|
|
#endif
|
|
- /*
|
|
- * Remember all informations needed to free this CCB.
|
|
- */
|
|
cp->to_abort = 0;
|
|
+ cp->odd_byte_adjustment = 0;
|
|
cp->tag = tag;
|
|
cp->order = tag_order;
|
|
cp->target = tn;
|
|
@@ -5104,7 +5111,7 @@
|
|
lp->itlq_tbl = sym_calloc_dma(SYM_CONF_MAX_TASK*4, "ITLQ_TBL");
|
|
if (!lp->itlq_tbl)
|
|
goto fail;
|
|
- lp->cb_tags = kcalloc(SYM_CONF_MAX_TASK, 1, GFP_KERNEL);
|
|
+ lp->cb_tags = kcalloc(SYM_CONF_MAX_TASK, 1, GFP_ATOMIC);
|
|
if (!lp->cb_tags) {
|
|
sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4, "ITLQ_TBL");
|
|
lp->itlq_tbl = NULL;
|
|
@@ -5243,7 +5250,7 @@
|
|
/*
|
|
* message
|
|
*/
|
|
- cp->phys.smsg.addr = cpu_to_scr(CCB_BA(cp, scsi_smsg));
|
|
+ cp->phys.smsg.addr = CCB_BA(cp, scsi_smsg);
|
|
cp->phys.smsg.size = cpu_to_scr(msglen);
|
|
|
|
/*
|
|
@@ -5343,7 +5350,7 @@
|
|
}
|
|
|
|
/*
|
|
- * Complete execution of a SCSI command with extented
|
|
+ * Complete execution of a SCSI command with extended
|
|
* error, SCSI status error, or having been auto-sensed.
|
|
*
|
|
* The SCRIPTS processor is not running there, so we
|
|
@@ -5441,7 +5448,7 @@
|
|
/*
|
|
* Let's requeue it to device.
|
|
*/
|
|
- sym_set_cam_status(cmd, CAM_REQUEUE_REQ);
|
|
+ sym_set_cam_status(cmd, DID_SOFT_ERROR);
|
|
goto finish;
|
|
}
|
|
weirdness:
|
|
Index: linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_hipd.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/sym53c8xx_2/sym_hipd.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_hipd.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -444,7 +444,7 @@
|
|
*/
|
|
u_char usrflags;
|
|
u_short usrtags;
|
|
- struct scsi_device *sdev;
|
|
+ struct scsi_target *starget;
|
|
};
|
|
|
|
/*
|
|
@@ -754,10 +754,8 @@
|
|
int segments; /* Number of SG segments */
|
|
|
|
u8 order; /* Tag type (if tagged command) */
|
|
+ unsigned char odd_byte_adjustment; /* odd-sized req on wide bus */
|
|
|
|
- /*
|
|
- * Miscellaneous status'.
|
|
- */
|
|
u_char nego_status; /* Negotiation status */
|
|
u_char xerr_status; /* Extended error flags */
|
|
u32 extra_bytes; /* Extraneous bytes transferred */
|
|
@@ -809,7 +807,7 @@
|
|
#endif
|
|
};
|
|
|
|
-#define CCB_BA(cp,lbl) (cp->ccb_ba + offsetof(struct sym_ccb, lbl))
|
|
+#define CCB_BA(cp,lbl) cpu_to_scr(cp->ccb_ba + offsetof(struct sym_ccb, lbl))
|
|
|
|
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
|
#define sym_goalp(cp) ((cp->host_flags & HF_DATA_IN) ? cp->goalp : cp->wgoalp)
|
|
@@ -1138,33 +1136,33 @@
|
|
* No segments means no data.
|
|
*/
|
|
if (!cp->segments)
|
|
- dir = CAM_DIR_NONE;
|
|
+ dir = DMA_NONE;
|
|
|
|
/*
|
|
* Set the data pointer.
|
|
*/
|
|
switch(dir) {
|
|
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
|
- case CAM_DIR_UNKNOWN:
|
|
+ case DMA_BIDIRECTIONAL:
|
|
#endif
|
|
- case CAM_DIR_OUT:
|
|
+ case DMA_TO_DEVICE:
|
|
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);
|
|
- if (dir != CAM_DIR_UNKNOWN)
|
|
+ if (dir != DMA_BIDIRECTIONAL)
|
|
break;
|
|
cp->phys.head.wlastp = cpu_to_scr(lastp);
|
|
/* fall through */
|
|
#else
|
|
break;
|
|
#endif
|
|
- case CAM_DIR_IN:
|
|
+ case DMA_FROM_DEVICE:
|
|
cp->host_flags |= HF_DATA_IN;
|
|
goalp = SCRIPTA_BA(np, data_in2) + 8;
|
|
lastp = goalp - 8 - (cp->segments * (2*4));
|
|
break;
|
|
- case CAM_DIR_NONE:
|
|
+ case DMA_NONE:
|
|
default:
|
|
#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN
|
|
cp->host_flags |= HF_DATA_IN;
|
|
@@ -1185,7 +1183,7 @@
|
|
/*
|
|
* If direction is unknown, start at data_io.
|
|
*/
|
|
- if (dir == CAM_DIR_UNKNOWN)
|
|
+ if (dir == DMA_BIDIRECTIONAL)
|
|
cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA(np, data_io));
|
|
#endif
|
|
}
|
|
Index: linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_nvram.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/scsi/sym53c8xx_2/sym_nvram.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/scsi/sym53c8xx_2/sym_nvram.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -270,6 +270,7 @@
|
|
|
|
}
|
|
OUTB(np, nc_gpreg, *gpreg);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(5);
|
|
}
|
|
|
|
@@ -547,6 +548,7 @@
|
|
static void T93C46_Clk(struct sym_device *np, u_char *gpreg)
|
|
{
|
|
OUTB(np, nc_gpreg, *gpreg | 0x04);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(2);
|
|
OUTB(np, nc_gpreg, *gpreg);
|
|
}
|
|
@@ -574,6 +576,7 @@
|
|
*gpreg |= 0x10;
|
|
|
|
OUTB(np, nc_gpreg, *gpreg);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(2);
|
|
|
|
T93C46_Clk(np, gpreg);
|
|
@@ -586,6 +589,7 @@
|
|
{
|
|
*gpreg &= 0xef;
|
|
OUTB(np, nc_gpreg, *gpreg);
|
|
+ INB(np, nc_mbox1);
|
|
udelay(2);
|
|
|
|
T93C46_Clk(np, gpreg);
|
|
@@ -733,7 +737,8 @@
|
|
return SYM_PARISC_PDC;
|
|
}
|
|
#else
|
|
-static int sym_read_parisc_pdc(struct sym_device *np, struct pdc_initiator *x)
|
|
+static inline int sym_read_parisc_pdc(struct sym_device *np,
|
|
+ struct pdc_initiator *x)
|
|
{
|
|
return 0;
|
|
}
|
|
Index: linux-2.6-2.6.12/drivers/serial/mux.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/serial/mux.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/serial/mux.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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
|
|
@@ -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;
|
|
Index: linux-2.6-2.6.12/drivers/serial/serial_core.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/serial/serial_core.c 2005-08-09 17:50:50.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/serial/serial_core.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1930,7 +1930,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
|
|
Index: linux-2.6-2.6.12/drivers/usb/input/hid-core.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/usb/input/hid-core.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/usb/input/hid-core.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -759,21 +759,31 @@
|
|
}
|
|
|
|
/*
|
|
- * Extract/implement a data field from/to a report.
|
|
+ * Extract/implement a data field from/to a little endian report (bit array).
|
|
*/
|
|
|
|
static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n)
|
|
{
|
|
- report += (offset >> 5) << 2; offset &= 31;
|
|
- return (le64_to_cpu(get_unaligned((__le64*)report)) >> offset) & ((1 << n) - 1);
|
|
+ u32 x;
|
|
+
|
|
+ report += offset >> 3; /* adjust byte index */
|
|
+ offset &= 8 - 1;
|
|
+ x = get_unaligned((u32 *) report);
|
|
+ x = le32_to_cpu(x);
|
|
+ x = (x >> offset) & ((1 << n) - 1);
|
|
+ return x;
|
|
}
|
|
|
|
static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value)
|
|
{
|
|
- report += (offset >> 5) << 2; offset &= 31;
|
|
- put_unaligned((get_unaligned((__le64*)report)
|
|
- & cpu_to_le64(~((((__u64) 1 << n) - 1) << offset)))
|
|
- | cpu_to_le64((__u64)value << offset), (__le64*)report);
|
|
+ u32 x;
|
|
+
|
|
+ report += offset >> 3;
|
|
+ offset &= 8 - 1;
|
|
+ x = get_unaligned((u32 *)report);
|
|
+ x &= cpu_to_le32(~((((__u32) 1 << n) - 1) << offset));
|
|
+ x |= cpu_to_le32(value << offset);
|
|
+ put_unaligned(x,(u32 *)report);
|
|
}
|
|
|
|
/*
|
|
Index: linux-2.6-2.6.12/drivers/usb/storage/transport.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/usb/storage/transport.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/usb/storage/transport.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -266,8 +266,9 @@
|
|
NULL, 0, 3*HZ);
|
|
|
|
/* reset the endpoint toggle */
|
|
- usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
|
|
- usb_pipeout(pipe), 0);
|
|
+ if (result >= 0)
|
|
+ usb_settoggle(us->pusb_dev, usb_pipeendpoint(pipe),
|
|
+ usb_pipeout(pipe), 0);
|
|
|
|
US_DEBUGP("%s: result = %d\n", __FUNCTION__, result);
|
|
return result;
|
|
@@ -1124,7 +1125,7 @@
|
|
* It's handy that every transport mechanism uses the control endpoint for
|
|
* resets.
|
|
*
|
|
- * Basically, we send a reset with a 20-second timeout, so we don't get
|
|
+ * Basically, we send a reset with a 5-second timeout, so we don't get
|
|
* jammed attempting to do the reset.
|
|
*/
|
|
static int usb_stor_reset_common(struct us_data *us,
|
|
@@ -1145,13 +1146,9 @@
|
|
clear_bit(US_FLIDX_ABORTING, &us->flags);
|
|
scsi_unlock(us_to_host(us));
|
|
|
|
- /* A 20-second timeout may seem rather long, but a LaCie
|
|
- * StudioDrive USB2 device takes 16+ seconds to get going
|
|
- * following a powerup or USB attach event.
|
|
- */
|
|
result = usb_stor_control_msg(us, us->send_ctrl_pipe,
|
|
request, requesttype, value, index, data, size,
|
|
- 20*HZ);
|
|
+ 5*HZ);
|
|
if (result < 0) {
|
|
US_DEBUGP("Soft reset failed: %d\n", result);
|
|
goto Done;
|
|
@@ -1173,8 +1170,10 @@
|
|
US_DEBUGP("Soft reset: clearing bulk-out endpoint halt\n");
|
|
result2 = usb_stor_clear_halt(us, us->send_bulk_pipe);
|
|
|
|
- /* return a result code based on the result of the control message */
|
|
- if (result < 0 || result2 < 0) {
|
|
+ /* return a result code based on the result of the clear-halts */
|
|
+ if (result >= 0)
|
|
+ result = result2;
|
|
+ if (result < 0) {
|
|
US_DEBUGP("Soft reset failed\n");
|
|
goto Done;
|
|
}
|
|
Index: linux-2.6-2.6.12/drivers/video/console/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/drivers/video/console/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/drivers/video/console/Kconfig 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -110,7 +110,7 @@
|
|
|
|
config FONTS
|
|
bool "Select compiled-in fonts"
|
|
- depends on FRAMEBUFFER_CONSOLE
|
|
+ depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
|
|
help
|
|
Say Y here if you would like to use fonts other than the default
|
|
your frame buffer console usually use.
|
|
@@ -123,7 +123,7 @@
|
|
|
|
config FONT_8x8
|
|
bool "VGA 8x8 font" if FONTS
|
|
- depends on FRAMEBUFFER_CONSOLE
|
|
+ depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
|
|
default y if !SPARC32 && !SPARC64 && !FONTS
|
|
help
|
|
This is the "high resolution" font for the VGA frame buffer (the one
|
|
@@ -137,7 +137,7 @@
|
|
|
|
config FONT_8x16
|
|
bool "VGA 8x16 font" if FONTS
|
|
- depends on FRAMEBUFFER_CONSOLE || SGI_NEWPORT_CONSOLE=y
|
|
+ depends on FRAMEBUFFER_CONSOLE || SGI_NEWPORT_CONSOLE=y || STI_CONSOLE
|
|
default y if !SPARC32 && !SPARC64 && !FONTS
|
|
help
|
|
This is the "high resolution" font for the VGA frame buffer (the one
|
|
@@ -147,7 +147,7 @@
|
|
|
|
config FONT_6x11
|
|
bool "Mac console 6x11 font (not supported by all drivers)" if FONTS
|
|
- depends on FRAMEBUFFER_CONSOLE
|
|
+ depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
|
|
default y if !SPARC32 && !SPARC64 && !FONTS && MAC
|
|
help
|
|
Small console font with Macintosh-style high-half glyphs. Some Mac
|
|
Index: linux-2.6-2.6.12/fs/ioctl.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/fs/ioctl.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/fs/ioctl.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -71,7 +71,11 @@
|
|
return -EBADF;
|
|
return put_user(inode->i_sb->s_blocksize, p);
|
|
case FIONREAD:
|
|
- return put_user(i_size_read(inode) - filp->f_pos, p);
|
|
+ {
|
|
+ int sz;
|
|
+ sz = i_size_read(inode) - filp->f_pos;
|
|
+ return put_user(sz, p);
|
|
+ }
|
|
}
|
|
|
|
return do_ioctl(filp, cmd, arg);
|
|
Index: linux-2.6-2.6.12/include/asm-generic/compat_signal.h
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/include/asm-generic/compat_signal.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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 */
|
|
Index: linux-2.6-2.6.12/include/asm-ia64/compat.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-ia64/compat.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-ia64/compat.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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;
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/assembly.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/assembly.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/assembly.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -450,5 +450,30 @@
|
|
REST_CR (%cr22, PT_PSW (\regs))
|
|
.endm
|
|
|
|
+
|
|
+ /* First step to create a "relied upon translation"
|
|
+ * See PA 2.0 Arch. page F-4 and F-5.
|
|
+ *
|
|
+ * The ssm was originally necessary due to a "PCxT bug".
|
|
+ * But someone decided it needed to be added to the architecture
|
|
+ * and this "feature" went into rev3 of PA-RISC 1.1 Arch Manual.
|
|
+ * It's been carried forward into PA 2.0 Arch as well. :^(
|
|
+ *
|
|
+ * "ssm 0,%r0" is a NOP with side effects (prefetch barrier).
|
|
+ * rsm/ssm prevents the ifetch unit from speculatively fetching
|
|
+ * instructions past this line in the code stream.
|
|
+ * PA 2.0 processor will single step all insn in the same QUAD (4 insn).
|
|
+ */
|
|
+ .macro pcxt_ssm_bug
|
|
+ rsm PSW_SM_I,%r0
|
|
+ nop /* 1 */
|
|
+ nop /* 2 */
|
|
+ nop /* 3 */
|
|
+ nop /* 4 */
|
|
+ nop /* 5 */
|
|
+ nop /* 6 */
|
|
+ nop /* 7 */
|
|
+ .endm
|
|
+
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/bitops.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/bitops.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/bitops.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -2,6 +2,7 @@
|
|
#define _PARISC_BITOPS_H
|
|
|
|
#include <linux/compiler.h>
|
|
+#include <asm/types.h> /* for BITS_PER_LONG/SHIFT_PER_LONG */
|
|
#include <asm/system.h>
|
|
#include <asm/byteorder.h>
|
|
#include <asm/atomic.h>
|
|
@@ -12,193 +13,157 @@
|
|
* to include/asm-i386/bitops.h or kerneldoc
|
|
*/
|
|
|
|
-#ifdef __LP64__
|
|
-# define SHIFT_PER_LONG 6
|
|
-#ifndef BITS_PER_LONG
|
|
-# define BITS_PER_LONG 64
|
|
-#endif
|
|
-#else
|
|
-# define SHIFT_PER_LONG 5
|
|
-#ifndef BITS_PER_LONG
|
|
-# define BITS_PER_LONG 32
|
|
-#endif
|
|
-#endif
|
|
-
|
|
-#define CHOP_SHIFTCOUNT(x) ((x) & (BITS_PER_LONG - 1))
|
|
+#define CHOP_SHIFTCOUNT(x) (((unsigned long) (x)) & (BITS_PER_LONG - 1))
|
|
|
|
|
|
#define smp_mb__before_clear_bit() smp_mb()
|
|
#define smp_mb__after_clear_bit() smp_mb()
|
|
|
|
-static __inline__ void set_bit(int nr, volatile unsigned long * address)
|
|
+/* See http://marc.theaimsgroup.com/?t=108826637900003 for discussion
|
|
+ * on use of volatile and __*_bit() (set/clear/change):
|
|
+ * *_bit() want use of volatile.
|
|
+ * __*_bit() are "relaxed" and don't use spinlock or volatile.
|
|
+ */
|
|
+
|
|
+static __inline__ void set_bit(int nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
unsigned long flags;
|
|
|
|
addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
_atomic_spin_lock_irqsave(addr, flags);
|
|
*addr |= mask;
|
|
_atomic_spin_unlock_irqrestore(addr, flags);
|
|
}
|
|
|
|
-static __inline__ void __set_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ void __set_bit(unsigned long nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
+ unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG);
|
|
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
- *addr |= mask;
|
|
+ *m |= 1UL << CHOP_SHIFTCOUNT(nr);
|
|
}
|
|
|
|
-static __inline__ void clear_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ void clear_bit(int nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
+ unsigned long mask = ~(1UL << CHOP_SHIFTCOUNT(nr));
|
|
unsigned long flags;
|
|
|
|
addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
_atomic_spin_lock_irqsave(addr, flags);
|
|
- *addr &= ~mask;
|
|
+ *addr &= mask;
|
|
_atomic_spin_unlock_irqrestore(addr, flags);
|
|
}
|
|
|
|
-static __inline__ void __clear_bit(unsigned long nr, volatile unsigned long * address)
|
|
+static __inline__ void __clear_bit(unsigned long nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
+ unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG);
|
|
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
- *addr &= ~mask;
|
|
+ *m &= ~(1UL << CHOP_SHIFTCOUNT(nr));
|
|
}
|
|
|
|
-static __inline__ void change_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ void change_bit(int nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
unsigned long flags;
|
|
|
|
addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
_atomic_spin_lock_irqsave(addr, flags);
|
|
*addr ^= mask;
|
|
_atomic_spin_unlock_irqrestore(addr, flags);
|
|
}
|
|
|
|
-static __inline__ void __change_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ void __change_bit(unsigned long nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
+ unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG);
|
|
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
- *addr ^= mask;
|
|
+ *m ^= 1UL << CHOP_SHIFTCOUNT(nr);
|
|
}
|
|
|
|
-static __inline__ int test_and_set_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
- int oldbit;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long oldbit;
|
|
unsigned long flags;
|
|
|
|
addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
_atomic_spin_lock_irqsave(addr, flags);
|
|
- oldbit = (*addr & mask) ? 1 : 0;
|
|
- *addr |= mask;
|
|
+ oldbit = *addr;
|
|
+ *addr = oldbit | mask;
|
|
_atomic_spin_unlock_irqrestore(addr, flags);
|
|
|
|
- return oldbit;
|
|
+ return (oldbit & mask) ? 1 : 0;
|
|
}
|
|
|
|
static __inline__ int __test_and_set_bit(int nr, volatile unsigned long * address)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
- int oldbit;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long oldbit;
|
|
+ unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG);
|
|
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
- oldbit = (*addr & mask) ? 1 : 0;
|
|
- *addr |= mask;
|
|
+ oldbit = *addr;
|
|
+ *addr = oldbit | mask;
|
|
|
|
- return oldbit;
|
|
+ return (oldbit & mask) ? 1 : 0;
|
|
}
|
|
|
|
-static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
- int oldbit;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long oldbit;
|
|
unsigned long flags;
|
|
|
|
addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
_atomic_spin_lock_irqsave(addr, flags);
|
|
- oldbit = (*addr & mask) ? 1 : 0;
|
|
- *addr &= ~mask;
|
|
+ oldbit = *addr;
|
|
+ *addr = oldbit & ~mask;
|
|
_atomic_spin_unlock_irqrestore(addr, flags);
|
|
|
|
- return oldbit;
|
|
+ return (oldbit & mask) ? 1 : 0;
|
|
}
|
|
|
|
static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long * address)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
- int oldbit;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG);
|
|
+ unsigned long oldbit;
|
|
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
- oldbit = (*addr & mask) ? 1 : 0;
|
|
- *addr &= ~mask;
|
|
+ oldbit = *addr;
|
|
+ *addr = oldbit & ~mask;
|
|
|
|
- return oldbit;
|
|
+ return (oldbit & mask) ? 1 : 0;
|
|
}
|
|
|
|
-static __inline__ int test_and_change_bit(int nr, volatile unsigned long * address)
|
|
+static __inline__ int test_and_change_bit(int nr, volatile unsigned long * addr)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
- int oldbit;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long oldbit;
|
|
unsigned long flags;
|
|
|
|
addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
_atomic_spin_lock_irqsave(addr, flags);
|
|
- oldbit = (*addr & mask) ? 1 : 0;
|
|
- *addr ^= mask;
|
|
+ oldbit = *addr;
|
|
+ *addr = oldbit ^ mask;
|
|
_atomic_spin_unlock_irqrestore(addr, flags);
|
|
|
|
- return oldbit;
|
|
+ return (oldbit & mask) ? 1 : 0;
|
|
}
|
|
|
|
static __inline__ int __test_and_change_bit(int nr, volatile unsigned long * address)
|
|
{
|
|
- unsigned long mask;
|
|
- unsigned long *addr = (unsigned long *) address;
|
|
- int oldbit;
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG);
|
|
+ unsigned long oldbit;
|
|
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
- oldbit = (*addr & mask) ? 1 : 0;
|
|
- *addr ^= mask;
|
|
+ oldbit = *addr;
|
|
+ *addr = oldbit ^ mask;
|
|
|
|
- return oldbit;
|
|
+ return (oldbit & mask) ? 1 : 0;
|
|
}
|
|
|
|
static __inline__ int test_bit(int nr, const volatile unsigned long *address)
|
|
{
|
|
- unsigned long mask;
|
|
- const unsigned long *addr = (const unsigned long *)address;
|
|
-
|
|
- addr += (nr >> SHIFT_PER_LONG);
|
|
- mask = 1L << CHOP_SHIFTCOUNT(nr);
|
|
+ unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
|
|
+ const unsigned long *addr = (const unsigned long *)address + (nr >> SHIFT_PER_LONG);
|
|
|
|
return !!(*addr & mask);
|
|
}
|
|
@@ -229,7 +194,7 @@
|
|
unsigned long ret;
|
|
|
|
__asm__(
|
|
-#if BITS_PER_LONG > 32
|
|
+#ifdef __LP64__
|
|
" ldi 63,%1\n"
|
|
" extrd,u,*<> %0,63,32,%%r0\n"
|
|
" extrd,u,*TR %0,31,32,%0\n" /* move top 32-bits down */
|
|
@@ -304,14 +269,7 @@
|
|
* hweightN: returns the hamming weight (i.e. the number
|
|
* of bits set) of a N-bit word
|
|
*/
|
|
-#define hweight64(x) \
|
|
-({ \
|
|
- unsigned long __x = (x); \
|
|
- unsigned int __w; \
|
|
- __w = generic_hweight32((unsigned int) __x); \
|
|
- __w += generic_hweight32((unsigned int) (__x>>32)); \
|
|
- __w; \
|
|
-})
|
|
+#define hweight64(x) generic_hweight64(x)
|
|
#define hweight32(x) generic_hweight32(x)
|
|
#define hweight16(x) generic_hweight16(x)
|
|
#define hweight8(x) generic_hweight8(x)
|
|
@@ -324,7 +282,13 @@
|
|
*/
|
|
static inline int sched_find_first_bit(const unsigned long *b)
|
|
{
|
|
-#ifndef __LP64__
|
|
+#ifdef __LP64__
|
|
+ if (unlikely(b[0]))
|
|
+ return __ffs(b[0]);
|
|
+ if (unlikely(b[1]))
|
|
+ return __ffs(b[1]) + 64;
|
|
+ return __ffs(b[2]) + 128;
|
|
+#else
|
|
if (unlikely(b[0]))
|
|
return __ffs(b[0]);
|
|
if (unlikely(b[1]))
|
|
@@ -334,14 +298,6 @@
|
|
if (b[3])
|
|
return __ffs(b[3]) + 96;
|
|
return __ffs(b[4]) + 128;
|
|
-#else
|
|
- if (unlikely(b[0]))
|
|
- return __ffs(b[0]);
|
|
- if (unlikely(((unsigned int)b[1])))
|
|
- return __ffs(b[1]) + 64;
|
|
- if (b[1] >> 32)
|
|
- return __ffs(b[1] >> 32) + 96;
|
|
- return __ffs(b[2]) + 128;
|
|
#endif
|
|
}
|
|
|
|
@@ -391,7 +347,7 @@
|
|
|
|
static __inline__ unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset)
|
|
{
|
|
- const unsigned long *p = addr + (offset >> 6);
|
|
+ const unsigned long *p = addr + (offset >> SHIFT_PER_LONG);
|
|
unsigned long result = offset & ~(BITS_PER_LONG-1);
|
|
unsigned long tmp;
|
|
|
|
@@ -445,71 +401,90 @@
|
|
* test_and_{set,clear}_bit guarantee atomicity without
|
|
* disabling interrupts.
|
|
*/
|
|
-#ifdef __LP64__
|
|
-#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_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_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_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr)
|
|
-#endif
|
|
|
|
-#endif /* __KERNEL__ */
|
|
+/* '3' is bits per byte */
|
|
+#define LE_BYTE_ADDR ((sizeof(unsigned long) - 1) << 3)
|
|
|
|
-static __inline__ int ext2_test_bit(int nr, __const__ void * addr)
|
|
-{
|
|
- __const__ unsigned char *ADDR = (__const__ unsigned char *) addr;
|
|
+#define ext2_test_bit(nr, addr) \
|
|
+ test_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
|
|
+#define ext2_set_bit(nr, addr) \
|
|
+ __test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
|
|
+#define ext2_clear_bit(nr, addr) \
|
|
+ __test_and_clear_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
|
|
+
|
|
+#define ext2_set_bit_atomic(l,nr,addr) \
|
|
+ test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
|
|
+#define ext2_clear_bit_atomic(l,nr,addr) \
|
|
+ test_and_clear_bit( (nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
|
|
|
|
- return (ADDR[nr >> 3] >> (nr & 7)) & 1;
|
|
-}
|
|
+#endif /* __KERNEL__ */
|
|
|
|
-/*
|
|
- * This implementation of ext2_find_{first,next}_zero_bit was stolen from
|
|
- * Linus' asm-alpha/bitops.h and modified for a big-endian machine.
|
|
- */
|
|
|
|
#define ext2_find_first_zero_bit(addr, size) \
|
|
- ext2_find_next_zero_bit((addr), (size), 0)
|
|
+ ext2_find_next_zero_bit((addr), (size), 0)
|
|
+
|
|
+/* include/linux/byteorder does not support "unsigned long" type */
|
|
+static inline unsigned long ext2_swabp(unsigned long * x)
|
|
+{
|
|
+#ifdef __LP64__
|
|
+ return (unsigned long) __swab64p((u64 *) x);
|
|
+#else
|
|
+ return (unsigned long) __swab32p((u32 *) x);
|
|
+#endif
|
|
+}
|
|
+
|
|
+/* include/linux/byteorder doesn't support "unsigned long" type */
|
|
+static inline unsigned long ext2_swab(unsigned long y)
|
|
+{
|
|
+#ifdef __LP64__
|
|
+ return (unsigned long) __swab64((u64) y);
|
|
+#else
|
|
+ return (unsigned long) __swab32((u32) y);
|
|
+#endif
|
|
+}
|
|
|
|
-extern __inline__ unsigned long ext2_find_next_zero_bit(void *addr,
|
|
- unsigned long size, unsigned long offset)
|
|
+static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
|
|
{
|
|
- unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
|
|
- unsigned int result = offset & ~31UL;
|
|
- unsigned int tmp;
|
|
+ unsigned long *p = (unsigned long *) addr + (offset >> SHIFT_PER_LONG);
|
|
+ unsigned long result = offset & ~(BITS_PER_LONG - 1);
|
|
+ unsigned long tmp;
|
|
|
|
if (offset >= size)
|
|
return size;
|
|
size -= result;
|
|
- offset &= 31UL;
|
|
+ offset &= (BITS_PER_LONG - 1UL);
|
|
if (offset) {
|
|
- tmp = cpu_to_le32p(p++);
|
|
- tmp |= ~0UL >> (32-offset);
|
|
- if (size < 32)
|
|
+ tmp = ext2_swabp(p++);
|
|
+ tmp |= (~0UL >> (BITS_PER_LONG - offset));
|
|
+ if (size < BITS_PER_LONG)
|
|
goto found_first;
|
|
- if (tmp != ~0U)
|
|
+ if (~tmp)
|
|
goto found_middle;
|
|
- size -= 32;
|
|
- result += 32;
|
|
+ size -= BITS_PER_LONG;
|
|
+ result += BITS_PER_LONG;
|
|
}
|
|
- while (size >= 32) {
|
|
- if ((tmp = cpu_to_le32p(p++)) != ~0U)
|
|
- goto found_middle;
|
|
- result += 32;
|
|
- size -= 32;
|
|
+
|
|
+ while (size & ~(BITS_PER_LONG - 1)) {
|
|
+ if (~(tmp = *(p++)))
|
|
+ goto found_middle_swap;
|
|
+ result += BITS_PER_LONG;
|
|
+ size -= BITS_PER_LONG;
|
|
}
|
|
if (!size)
|
|
return result;
|
|
- tmp = cpu_to_le32p(p);
|
|
+ tmp = ext2_swabp(p);
|
|
found_first:
|
|
- tmp |= ~0U << size;
|
|
+ tmp |= ~0UL << size;
|
|
+ if (tmp == ~0UL) /* Are any bits zero? */
|
|
+ return result + size; /* Nope. Skip ffz */
|
|
found_middle:
|
|
return result + ffz(tmp);
|
|
+
|
|
+found_middle_swap:
|
|
+ return result + ffz(ext2_swab(tmp));
|
|
}
|
|
|
|
+
|
|
/* Bitmap functions for the minix filesystem. */
|
|
#define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr)
|
|
#define minix_set_bit(nr,addr) ((void)ext2_set_bit(nr,addr))
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/errno.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/errno.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/errno.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -114,6 +114,7 @@
|
|
|
|
#define ENOTSUP 252 /* Function not implemented (POSIX.4 / HPUX) */
|
|
#define ECANCELLED 253 /* aio request was canceled before complete (POSIX.4 / HPUX) */
|
|
+#define ECANCELED ECANCELLED /* SuSv3 and Solaris wants one 'L' */
|
|
|
|
/* for robust mutexes */
|
|
#define EOWNERDEAD 254 /* Owner died */
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/led.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/led.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/led.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -23,9 +23,6 @@
|
|
|
|
#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, unsigned long cmd_reg, unsigned long data_reg);
|
|
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/processor.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/processor.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/processor.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -121,8 +121,27 @@
|
|
};
|
|
|
|
/* Thread struct flags. */
|
|
+#define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */
|
|
+#define PARISC_UAC_SIGBUS (1UL << 1)
|
|
#define PARISC_KERNEL_DEATH (1UL << 31) /* see die_if_kernel()... */
|
|
|
|
+#define PARISC_UAC_SHIFT 0
|
|
+#define PARISC_UAC_MASK (PARISC_UAC_NOPRINT|PARISC_UAC_SIGBUS)
|
|
+
|
|
+#define SET_UNALIGN_CTL(task,value) \
|
|
+ ({ \
|
|
+ (task)->thread.flags = (((task)->thread.flags & ~PARISC_UAC_MASK) \
|
|
+ | (((value) << PARISC_UAC_SHIFT) & \
|
|
+ PARISC_UAC_MASK)); \
|
|
+ 0; \
|
|
+ })
|
|
+
|
|
+#define GET_UNALIGN_CTL(task,addr) \
|
|
+ ({ \
|
|
+ put_user(((task)->thread.flags & PARISC_UAC_MASK) \
|
|
+ >> PARISC_UAC_SHIFT, (int __user *) (addr)); \
|
|
+ })
|
|
+
|
|
#define INIT_THREAD { \
|
|
regs: { gr: { 0, }, \
|
|
fr: { 0, }, \
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/psw.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/psw.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/psw.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1,4 +1,7 @@
|
|
#ifndef _PARISC_PSW_H
|
|
+
|
|
+#include <linux/config.h>
|
|
+
|
|
#define PSW_I 0x00000001
|
|
#define PSW_D 0x00000002
|
|
#define PSW_P 0x00000004
|
|
@@ -9,6 +12,16 @@
|
|
#define PSW_G 0x00000040 /* PA1.x only */
|
|
#define PSW_O 0x00000080 /* PA2.0 only */
|
|
|
|
+/* ssm/rsm instructions number PSW_W and PSW_E differently */
|
|
+#define PSW_SM_I PSW_I /* Enable External Interrupts */
|
|
+#define PSW_SM_D PSW_D
|
|
+#define PSW_SM_P PSW_P
|
|
+#define PSW_SM_Q PSW_Q /* Enable Interrupt State Collection */
|
|
+#define PSW_SM_R PSW_R /* Enable Recover Counter Trap */
|
|
+#define PSW_SM_W 0x200 /* PA2.0 only : Enable Wide Mode */
|
|
+
|
|
+#define PSW_SM_QUIET PSW_SM_R+PSW_SM_Q+PSW_SM_P+PSW_SM_D+PSW_SM_I
|
|
+
|
|
#define PSW_CB 0x0000ff00
|
|
|
|
#define PSW_M 0x00010000
|
|
@@ -30,33 +43,21 @@
|
|
#define PSW_Z 0x40000000 /* PA1.x only */
|
|
#define PSW_Y 0x80000000 /* PA1.x only */
|
|
|
|
-#ifdef __LP64__
|
|
-#define PSW_HI_CB 0x000000ff /* PA2.0 only */
|
|
+#ifdef CONFIG_64BIT
|
|
+# define PSW_HI_CB 0x000000ff /* PA2.0 only */
|
|
#endif
|
|
|
|
-/* PSW bits to be used with ssm/rsm */
|
|
-#define PSW_SM_I 0x1
|
|
-#define PSW_SM_D 0x2
|
|
-#define PSW_SM_P 0x4
|
|
-#define PSW_SM_Q 0x8
|
|
-#define PSW_SM_R 0x10
|
|
-#define PSW_SM_F 0x20
|
|
-#define PSW_SM_G 0x40
|
|
-#define PSW_SM_O 0x80
|
|
-#define PSW_SM_E 0x100
|
|
-#define PSW_SM_W 0x200
|
|
-
|
|
-#ifdef __LP64__
|
|
-# define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
|
|
-# define KERNEL_PSW (PSW_W | PSW_C | PSW_Q | PSW_P | PSW_D)
|
|
-# define REAL_MODE_PSW (PSW_W | PSW_Q)
|
|
-# define USER_PSW_MASK (PSW_W | PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
|
|
-# define USER_PSW_HI_MASK (PSW_HI_CB)
|
|
-#else
|
|
-# define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
|
|
-# define KERNEL_PSW (PSW_C | PSW_Q | PSW_P | PSW_D)
|
|
-# define REAL_MODE_PSW (PSW_Q)
|
|
-# define USER_PSW_MASK (PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
|
|
+#ifdef CONFIG_64BIT
|
|
+# define USER_PSW_HI_MASK PSW_HI_CB
|
|
+# define WIDE_PSW PSW_W
|
|
+#else
|
|
+# define WIDE_PSW 0
|
|
#endif
|
|
|
|
+/* Used when setting up for rfi */
|
|
+#define KERNEL_PSW (WIDE_PSW | PSW_C | PSW_Q | PSW_P | PSW_D)
|
|
+#define REAL_MODE_PSW (WIDE_PSW | PSW_Q)
|
|
+#define USER_PSW_MASK (WIDE_PSW | PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
|
|
+#define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
|
|
+
|
|
#endif
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/ptrace.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/ptrace.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/ptrace.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -49,7 +49,7 @@
|
|
#define user_mode(regs) (((regs)->iaoq[0] & 3) ? 1 : 0)
|
|
#define user_space(regs) (((regs)->iasq[1] != 0) ? 1 : 0)
|
|
#define instruction_pointer(regs) ((regs)->iaoq[0] & ~3)
|
|
-#define profile_pc(regs) instruction_pointer(regs)
|
|
+unsigned long profile_pc(struct pt_regs *);
|
|
extern void show_regs(struct pt_regs *);
|
|
#endif
|
|
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/spinlock.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/spinlock.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/spinlock.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -8,9 +8,15 @@
|
|
* the semaphore address has to be 16-byte aligned.
|
|
*/
|
|
|
|
+#ifdef CONFIG_PA20
|
|
+#define __SPIN_FIELD_UNLOCKED 1
|
|
+#else
|
|
+#define __SPIN_FIELD_UNLOCKED { 1, 1, 1, 1 }
|
|
+#endif
|
|
+
|
|
#ifndef CONFIG_DEBUG_SPINLOCK
|
|
|
|
-#define __SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 } }
|
|
+#define __SPIN_LOCK_UNLOCKED { .lock = __SPIN_FIELD_UNLOCKED, }
|
|
#undef SPIN_LOCK_UNLOCKED
|
|
#define SPIN_LOCK_UNLOCKED (spinlock_t) __SPIN_LOCK_UNLOCKED
|
|
|
|
@@ -64,7 +70,15 @@
|
|
|
|
#define SPINLOCK_MAGIC 0x1D244B3C
|
|
|
|
-#define __SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 }, SPINLOCK_MAGIC, 10, __FILE__ , NULL, 0, -1, NULL, NULL }
|
|
+#define __SPIN_LOCK_UNLOCKED { .lock = __SPIN_FIELD_UNLOCKED, \
|
|
+ .magic = SPINLOCK_MAGIC, \
|
|
+ .babble = 10, \
|
|
+ .module = __FILE__, \
|
|
+ .bfile = NULL, \
|
|
+ .bline = 0, \
|
|
+ .oncpu = -1, \
|
|
+ .previous = NULL, \
|
|
+ .task = NULL }
|
|
#undef SPIN_LOCK_UNLOCKED
|
|
#define SPIN_LOCK_UNLOCKED (spinlock_t) __SPIN_LOCK_UNLOCKED
|
|
|
|
@@ -72,7 +86,7 @@
|
|
|
|
#define CHECK_LOCK(x) \
|
|
do { \
|
|
- if (unlikely((x)->magic != SPINLOCK_MAGIC)) { \
|
|
+ if (unlikely((x)->magic != SPINLOCK_MAGIC)) { \
|
|
printk(KERN_ERR "%s:%d: spin_is_locked" \
|
|
" on uninitialized spinlock %p.\n", \
|
|
__FILE__, __LINE__, (x)); \
|
|
@@ -81,9 +95,10 @@
|
|
|
|
#define spin_is_locked(x) \
|
|
({ \
|
|
+ volatile unsigned int *a; \
|
|
CHECK_LOCK(x); \
|
|
- volatile unsigned int *a = __ldcw_align(x); \
|
|
- if (unlikely((*a == 0) && (x)->babble)) { \
|
|
+ a = __ldcw_align(x); \
|
|
+ if (unlikely((*a == 0) && (x)->babble)) { \
|
|
(x)->babble--; \
|
|
printk("KERN_WARNING \
|
|
%s:%d: spin_is_locked(%s/%p) already" \
|
|
@@ -97,9 +112,10 @@
|
|
|
|
#define spin_unlock_wait(x) \
|
|
do { \
|
|
+ volatile unsigned int *a; \
|
|
CHECK_LOCK(x); \
|
|
- volatile unsigned int *a = __ldcw_align(x); \
|
|
- if (unlikely((*a == 0) && (x)->babble)) { \
|
|
+ a = __ldcw_align(x); \
|
|
+ if (unlikely((*a == 0) && (x)->babble)) { \
|
|
(x)->babble--; \
|
|
printk("KERN_WARNING \
|
|
%s:%d: spin_unlock_wait(%s/%p)" \
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/system.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/system.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/system.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -138,13 +138,7 @@
|
|
#define set_wmb(var, value) do { var = value; wmb(); } while (0)
|
|
|
|
|
|
-/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */
|
|
-#define __ldcw(a) ({ \
|
|
- unsigned __ret; \
|
|
- __asm__ __volatile__("ldcw 0(%1),%0" : "=r" (__ret) : "r" (a)); \
|
|
- __ret; \
|
|
-})
|
|
-
|
|
+#ifndef CONFIG_PA20
|
|
/* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data,
|
|
and GCC only guarantees 8-byte alignment for stack locals, we can't
|
|
be assured of 16-byte alignment for atomic lock data even if we
|
|
@@ -152,12 +146,35 @@
|
|
we use a struct containing an array of four ints for the atomic lock
|
|
type and dynamically select the 16-byte aligned int from the array
|
|
for the semaphore. */
|
|
+
|
|
#define __PA_LDCW_ALIGNMENT 16
|
|
#define __ldcw_align(a) ({ \
|
|
unsigned long __ret = (unsigned long) &(a)->lock[0]; \
|
|
__ret = (__ret + __PA_LDCW_ALIGNMENT - 1) & ~(__PA_LDCW_ALIGNMENT - 1); \
|
|
(volatile unsigned int *) __ret; \
|
|
})
|
|
+#define LDCW "ldcw"
|
|
+
|
|
+#else /*CONFIG_PA20*/
|
|
+/* From: "Jim Hull" <jim.hull of hp.com>
|
|
+ I've attached a summary of the change, but basically, for PA 2.0, as
|
|
+ long as the ",CO" (coherent operation) completer is specified, then the
|
|
+ 16-byte alignment requirement for ldcw and ldcd is relaxed, and instead
|
|
+ they only require "natural" alignment (4-byte for ldcw, 8-byte for
|
|
+ ldcd). */
|
|
+
|
|
+#define __PA_LDCW_ALIGNMENT 4
|
|
+#define __ldcw_align(a) ((volatile unsigned int *)a)
|
|
+#define LDCW "ldcw,co"
|
|
+
|
|
+#endif /*!CONFIG_PA20*/
|
|
+
|
|
+/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */
|
|
+#define __ldcw(a) ({ \
|
|
+ unsigned __ret; \
|
|
+ __asm__ __volatile__(LDCW " 0(%1),%0" : "=r" (__ret) : "r" (a)); \
|
|
+ __ret; \
|
|
+})
|
|
|
|
#ifdef CONFIG_SMP
|
|
/*
|
|
@@ -165,7 +182,11 @@
|
|
*/
|
|
|
|
typedef struct {
|
|
- volatile unsigned int lock[4];
|
|
+#ifdef CONFIG_PA20
|
|
+ volatile unsigned int lock;
|
|
+#else
|
|
+ volatile unsigned int lock[4];
|
|
+#endif
|
|
#ifdef CONFIG_DEBUG_SPINLOCK
|
|
unsigned long magic;
|
|
volatile unsigned int babble;
|
|
@@ -186,25 +207,6 @@
|
|
#endif
|
|
|
|
#define KERNEL_START (0x10100000 - 0x1000)
|
|
-
|
|
-/* This is for the serialisation of PxTLB broadcasts. At least on the
|
|
- * N class systems, only one PxTLB inter processor broadcast can be
|
|
- * active at any one time on the Merced bus. This tlb purge
|
|
- * synchronisation is fairly lightweight and harmless so we activate
|
|
- * it on all SMP systems not just the N class. */
|
|
-#ifdef CONFIG_SMP
|
|
-extern spinlock_t pa_tlb_lock;
|
|
-
|
|
-#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
|
|
-#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
|
|
-
|
|
-#else
|
|
-
|
|
-#define purge_tlb_start(x) do { } while(0)
|
|
-#define purge_tlb_end(x) do { } while (0)
|
|
-
|
|
-#endif
|
|
-
|
|
#define arch_align_stack(x) (x)
|
|
|
|
#endif
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/tlbflush.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/tlbflush.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/tlbflush.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -7,6 +7,26 @@
|
|
#include <linux/mm.h>
|
|
#include <asm/mmu_context.h>
|
|
|
|
+
|
|
+/* This is for the serialisation of PxTLB broadcasts. At least on the
|
|
+ * N class systems, only one PxTLB inter processor broadcast can be
|
|
+ * active at any one time on the Merced bus. This tlb purge
|
|
+ * synchronisation is fairly lightweight and harmless so we activate
|
|
+ * it on all SMP systems not just the N class. */
|
|
+#ifdef CONFIG_SMP
|
|
+extern spinlock_t pa_tlb_lock;
|
|
+
|
|
+#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
|
|
+#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
|
|
+
|
|
+#else
|
|
+
|
|
+#define purge_tlb_start(x) do { } while(0)
|
|
+#define purge_tlb_end(x) do { } while (0)
|
|
+
|
|
+#endif
|
|
+
|
|
+
|
|
extern void flush_tlb_all(void);
|
|
|
|
/*
|
|
@@ -64,29 +84,26 @@
|
|
{
|
|
unsigned long npages;
|
|
|
|
-
|
|
npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
|
|
- if (npages >= 512) /* XXX arbitrary, should be tuned */
|
|
+ if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */
|
|
flush_tlb_all();
|
|
else {
|
|
|
|
mtsp(vma->vm_mm->context,1);
|
|
+ purge_tlb_start();
|
|
if (split_tlb) {
|
|
- purge_tlb_start();
|
|
while (npages--) {
|
|
pdtlb(start);
|
|
pitlb(start);
|
|
start += PAGE_SIZE;
|
|
}
|
|
- purge_tlb_end();
|
|
} else {
|
|
- purge_tlb_start();
|
|
while (npages--) {
|
|
pdtlb(start);
|
|
start += PAGE_SIZE;
|
|
}
|
|
- purge_tlb_end();
|
|
}
|
|
+ purge_tlb_end();
|
|
}
|
|
}
|
|
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/types.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/types.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/types.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -33,8 +33,10 @@
|
|
|
|
#ifdef __LP64__
|
|
#define BITS_PER_LONG 64
|
|
+#define SHIFT_PER_LONG 6
|
|
#else
|
|
#define BITS_PER_LONG 32
|
|
+#define SHIFT_PER_LONG 5
|
|
#endif
|
|
|
|
#ifndef __ASSEMBLY__
|
|
Index: linux-2.6-2.6.12/include/asm-parisc/unistd.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-parisc/unistd.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-parisc/unistd.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -687,8 +687,8 @@
|
|
#define __NR_shmget (__NR_Linux + 194)
|
|
#define __NR_shmctl (__NR_Linux + 195)
|
|
|
|
-#define __NR_getpmsg (__NR_Linux + 196) /* some people actually want streams */
|
|
-#define __NR_putpmsg (__NR_Linux + 197) /* some people actually want streams */
|
|
+#define __NR_getpmsg (__NR_Linux + 196) /* Somebody *wants* streams? */
|
|
+#define __NR_putpmsg (__NR_Linux + 197)
|
|
|
|
#define __NR_lstat64 (__NR_Linux + 198)
|
|
#define __NR_truncate64 (__NR_Linux + 199)
|
|
@@ -755,8 +755,12 @@
|
|
#define __NR_mbind (__NR_Linux + 260)
|
|
#define __NR_get_mempolicy (__NR_Linux + 261)
|
|
#define __NR_set_mempolicy (__NR_Linux + 262)
|
|
+#define __NR_vserver (__NR_Linux + 263)
|
|
+#define __NR_add_key (__NR_Linux + 264)
|
|
+#define __NR_request_key (__NR_Linux + 265)
|
|
+#define __NR_keyctl (__NR_Linux + 266)
|
|
|
|
-#define __NR_Linux_syscalls 263
|
|
+#define __NR_Linux_syscalls 267
|
|
|
|
#define HPUX_GATEWAY_ADDR 0xC0000004
|
|
#define LINUX_GATEWAY_ADDR 0x100
|
|
@@ -807,10 +811,10 @@
|
|
#define K_INLINE_SYSCALL(name, nr, args...) ({ \
|
|
long __sys_res; \
|
|
{ \
|
|
- register unsigned long __res asm("r28"); \
|
|
+ register unsigned long __res __asm__("r28"); \
|
|
K_LOAD_ARGS_##nr(args) \
|
|
/* FIXME: HACK stw/ldw r19 around syscall */ \
|
|
- asm volatile( \
|
|
+ __asm__ volatile( \
|
|
K_STW_ASM_PIC \
|
|
" ble 0x100(%%sr2, %%r0)\n" \
|
|
" ldi %1, %%r20\n" \
|
|
Index: linux-2.6-2.6.12/include/asm-s390/compat.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-s390/compat.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-s390/compat.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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;
|
|
Index: linux-2.6-2.6.12/include/asm-sparc64/compat.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/asm-sparc64/compat.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/asm-sparc64/compat.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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;
|
|
Index: linux-2.6-2.6.12/include/linux/compat.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/linux/compat.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/linux/compat.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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 {
|
|
@@ -96,28 +107,6 @@
|
|
char d_name[256];
|
|
};
|
|
|
|
-typedef union compat_sigval {
|
|
- compat_int_t sival_int;
|
|
- compat_uptr_t sival_ptr;
|
|
-} compat_sigval_t;
|
|
-
|
|
-#define COMPAT_SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
|
|
-
|
|
-typedef struct compat_sigevent {
|
|
- compat_sigval_t sigev_value;
|
|
- compat_int_t sigev_signo;
|
|
- compat_int_t sigev_notify;
|
|
- union {
|
|
- compat_int_t _pad[COMPAT_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);
|
|
@@ -153,10 +142,6 @@
|
|
unsigned long bitmap_size);
|
|
long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
|
|
unsigned long bitmap_size);
|
|
-int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from);
|
|
-int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from);
|
|
-int get_compat_sigevent(struct sigevent *event,
|
|
- const struct compat_sigevent __user *u_event);
|
|
|
|
#endif /* CONFIG_COMPAT */
|
|
#endif /* _LINUX_COMPAT_H */
|
|
Index: linux-2.6-2.6.12/include/linux/compat_siginfo.h
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/include/linux/compat_siginfo.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -0,0 +1,181 @@
|
|
+#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 COMPAT_SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
|
|
+
|
|
+#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[COMPAT_SIGEV_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 */
|
|
+
|
|
Index: linux-2.6-2.6.12/include/linux/hil.h
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/include/linux/hil.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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_ */
|
|
Index: linux-2.6-2.6.12/include/linux/hil_mlc.h
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/include/linux/hil_mlc.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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);
|
|
Index: linux-2.6-2.6.12/include/linux/hp_sdc.h
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/include/linux/hp_sdc.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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 */
|
|
Index: linux-2.6-2.6.12/include/linux/input.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/linux/input.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/linux/input.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -620,6 +620,7 @@
|
|
#define BUS_ADB 0x17
|
|
#define BUS_I2C 0x18
|
|
#define BUS_HOST 0x19
|
|
+#define BUS_GSC 0x1A
|
|
|
|
/*
|
|
* Values describing the status of an effect
|
|
Index: linux-2.6-2.6.12/include/linux/serio.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/linux/serio.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/linux/serio.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -179,7 +179,7 @@
|
|
#define SERIO_8042_XL 0x06
|
|
|
|
/*
|
|
- * Serio types
|
|
+ * Serio protos
|
|
*/
|
|
#define SERIO_UNKNOWN 0x00
|
|
#define SERIO_MSC 0x01
|
|
Index: linux-2.6-2.6.12/include/linux/signal.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/linux/signal.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/linux/signal.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -234,6 +234,9 @@
|
|
struct pt_regs;
|
|
extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
|
|
|
|
+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 */
|
|
Index: linux-2.6-2.6.12/include/sound/opl3.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/include/sound/opl3.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/include/sound/opl3.h 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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,
|
|
Index: linux-2.6-2.6.12/ipc/compat_mq.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/ipc/compat_mq.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/ipc/compat_mq.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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>
|
|
Index: linux-2.6-2.6.12/kernel/Makefile
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/Makefile 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/Makefile 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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_CPUSETS) += cpuset.o
|
|
obj-$(CONFIG_IKCONFIG) += configs.o
|
|
obj-$(CONFIG_IKCONFIG_PROC) += configs.o
|
|
Index: linux-2.6-2.6.12/kernel/compat.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/compat.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/compat.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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>
|
|
@@ -441,7 +442,11 @@
|
|
|
|
BUG_ON(info.si_code & __SI_MASK);
|
|
info.si_code |= __SI_CHLD;
|
|
- return copy_siginfo_to_user32(uinfo, &info);
|
|
+
|
|
+ if (compat_copy_siginfo_to_user(uinfo, &info) != 0)
|
|
+ return -EFAULT;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static int compat_get_user_cpu_mask(compat_ulong_t __user *user_mask_ptr,
|
|
@@ -653,6 +658,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)
|
|
{
|
|
@@ -810,7 +835,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 {
|
|
Index: linux-2.6-2.6.12/kernel/compat_signal.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/kernel/compat_signal.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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
|
|
+
|
|
Index: linux-2.6-2.6.12/kernel/posix-cpu-timers.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/posix-cpu-timers.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/posix-cpu-timers.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -1270,8 +1270,6 @@
|
|
LIST_HEAD(firing);
|
|
struct k_itimer *timer, *next;
|
|
|
|
- BUG_ON(!irqs_disabled());
|
|
-
|
|
#define UNEXPIRED(clock) \
|
|
(cputime_eq(tsk->it_##clock##_expires, cputime_zero) || \
|
|
cputime_lt(clock##_ticks(tsk), tsk->it_##clock##_expires))
|
|
Index: linux-2.6-2.6.12/kernel/ptrace.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/ptrace.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/ptrace.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -344,7 +344,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);
|
|
Index: linux-2.6-2.6.12/kernel/resource.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/resource.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/resource.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -181,6 +181,8 @@
|
|
{
|
|
struct resource *tmp, **p;
|
|
|
|
+ BUG_ON(old->child);
|
|
+
|
|
p = &old->parent->child;
|
|
for (;;) {
|
|
tmp = *p;
|
|
Index: linux-2.6-2.6.12/kernel/signal.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/signal.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/signal.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -22,6 +22,7 @@
|
|
#include <linux/security.h>
|
|
#include <linux/syscalls.h>
|
|
#include <linux/ptrace.h>
|
|
+#include <linux/compat_siginfo.h>
|
|
#include <linux/posix-timers.h>
|
|
#include <linux/signal.h>
|
|
#include <asm/param.h>
|
|
@@ -2107,17 +2108,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.
|
|
@@ -2356,7 +2375,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.
|
|
Index: linux-2.6-2.6.12/kernel/sys.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/kernel/sys.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/kernel/sys.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -30,6 +30,7 @@
|
|
#include <linux/compat.h>
|
|
#include <linux/syscalls.h>
|
|
|
|
+#include <asm/processor.h>
|
|
#include <asm/uaccess.h>
|
|
#include <asm/io.h>
|
|
#include <asm/unistd.h>
|
|
Index: linux-2.6-2.6.12/mm/shmem.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/mm/shmem.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/mm/shmem.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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;
|
|
Index: linux-2.6-2.6.12/sound/drivers/opl3/opl3_lib.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/drivers/opl3/opl3_lib.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/drivers/opl3/opl3_lib.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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);
|
|
|
|
Index: linux-2.6-2.6.12/sound/oss/ad1889.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/oss/ad1889.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/oss/ad1889.c 2005-08-09 17:53:35.000000000 -0400
|
|
@@ -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;
|
|
Index: linux-2.6-2.6.12/sound/oss/ad1889.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/oss/ad1889.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/oss/ad1889.h 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -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
|
|
Index: linux-2.6-2.6.12/sound/parisc/harmony.c
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/parisc/harmony.c 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/parisc/harmony.c 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -197,7 +197,7 @@
|
|
spin_unlock(&h->lock);
|
|
|
|
if (dstatus & HARMONY_DSTATUS_PN) {
|
|
- if (h->psubs) {
|
|
+ if (h->psubs && h->st.playing) {
|
|
spin_lock(&h->lock);
|
|
h->pbuf.buf += h->pbuf.count; /* PAGE_SIZE */
|
|
h->pbuf.buf %= h->pbuf.size; /* MAX_BUFS*PAGE_SIZE */
|
|
@@ -216,7 +216,7 @@
|
|
}
|
|
|
|
if (dstatus & HARMONY_DSTATUS_RN) {
|
|
- if (h->csubs) {
|
|
+ if (h->csubs && h->st.capturing) {
|
|
spin_lock(&h->lock);
|
|
h->cbuf.buf += h->cbuf.count;
|
|
h->cbuf.buf %= h->cbuf.size;
|
|
@@ -316,6 +316,7 @@
|
|
case SNDRV_PCM_TRIGGER_STOP:
|
|
h->st.playing = 0;
|
|
harmony_mute(h);
|
|
+ harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);
|
|
harmony_disable_interrupts(h);
|
|
break;
|
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
@@ -351,8 +352,9 @@
|
|
break;
|
|
case SNDRV_PCM_TRIGGER_STOP:
|
|
h->st.capturing = 0;
|
|
- harmony_mute(h);
|
|
- harmony_disable_interrupts(h);
|
|
+ harmony_mute(h);
|
|
+ harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);
|
|
+ harmony_disable_interrupts(h);
|
|
break;
|
|
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
|
@@ -408,7 +410,8 @@
|
|
|
|
h->pbuf.size = snd_pcm_lib_buffer_bytes(ss);
|
|
h->pbuf.count = snd_pcm_lib_period_bytes(ss);
|
|
- h->pbuf.buf = 0;
|
|
+ if (h->pbuf.buf >= h->pbuf.size)
|
|
+ h->pbuf.buf = 0;
|
|
h->st.playing = 0;
|
|
|
|
h->st.rate = snd_harmony_rate_bits(rt->rate);
|
|
@@ -437,7 +440,8 @@
|
|
|
|
h->cbuf.size = snd_pcm_lib_buffer_bytes(ss);
|
|
h->cbuf.count = snd_pcm_lib_period_bytes(ss);
|
|
- h->cbuf.buf = 0;
|
|
+ if (h->cbuf.buf >= h->cbuf.size)
|
|
+ h->cbuf.buf = 0;
|
|
h->st.capturing = 0;
|
|
|
|
h->st.rate = snd_harmony_rate_bits(rt->rate);
|
|
@@ -712,13 +716,14 @@
|
|
|
|
left = (h->st.gain >> shift_left) & mask;
|
|
right = (h->st.gain >> shift_right) & mask;
|
|
-
|
|
if (invert) {
|
|
left = mask - left;
|
|
right = mask - right;
|
|
}
|
|
+
|
|
ucontrol->value.integer.value[0] = left;
|
|
- ucontrol->value.integer.value[1] = right;
|
|
+ if (shift_left != shift_right)
|
|
+ ucontrol->value.integer.value[1] = right;
|
|
|
|
spin_unlock_irqrestore(&h->mixer_lock, flags);
|
|
|
|
@@ -738,22 +743,82 @@
|
|
int old_gain = h->st.gain;
|
|
unsigned long flags;
|
|
|
|
+ spin_lock_irqsave(&h->mixer_lock, flags);
|
|
+
|
|
left = ucontrol->value.integer.value[0] & mask;
|
|
- right = ucontrol->value.integer.value[1] & mask;
|
|
- if (invert) {
|
|
+ if (invert)
|
|
left = mask - left;
|
|
- right = mask - right;
|
|
+ h->st.gain &= ~( (mask << shift_left ) );
|
|
+ h->st.gain |= (left << shift_left);
|
|
+
|
|
+ if (shift_left != shift_right) {
|
|
+ right = ucontrol->value.integer.value[1] & mask;
|
|
+ if (invert)
|
|
+ right = mask - right;
|
|
+ h->st.gain &= ~( (mask << shift_right) );
|
|
+ h->st.gain |= (right << shift_right);
|
|
}
|
|
+
|
|
+ snd_harmony_set_new_gain(h);
|
|
+
|
|
+ spin_unlock_irqrestore(&h->mixer_lock, flags);
|
|
+
|
|
+ return h->st.gain != old_gain;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_harmony_captureroute_info(snd_kcontrol_t *kc,
|
|
+ snd_ctl_elem_info_t *uinfo)
|
|
+{
|
|
+ static char *texts[2] = { "Line", "Mic" };
|
|
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
|
|
+ uinfo->count = 1;
|
|
+ uinfo->value.enumerated.items = 2;
|
|
+ if (uinfo->value.enumerated.item > 1)
|
|
+ uinfo->value.enumerated.item = 1;
|
|
+ strcpy(uinfo->value.enumerated.name,
|
|
+ texts[uinfo->value.enumerated.item]);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_harmony_captureroute_get(snd_kcontrol_t *kc,
|
|
+ snd_ctl_elem_value_t *ucontrol)
|
|
+{
|
|
+ harmony_t *h = snd_kcontrol_chip(kc);
|
|
+ int value;
|
|
+ unsigned long 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) );
|
|
+ value = (h->st.gain >> HARMONY_GAIN_IS_SHIFT) & 1;
|
|
+ ucontrol->value.enumerated.item[0] = value;
|
|
+
|
|
+ spin_unlock_irqrestore(&h->mixer_lock, flags);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_harmony_captureroute_put(snd_kcontrol_t *kc,
|
|
+ snd_ctl_elem_value_t *ucontrol)
|
|
+{
|
|
+ harmony_t *h = snd_kcontrol_chip(kc);
|
|
+ int value;
|
|
+ int old_gain = h->st.gain;
|
|
+ unsigned long flags;
|
|
+
|
|
+ spin_lock_irqsave(&h->mixer_lock, flags);
|
|
+
|
|
+ value = ucontrol->value.enumerated.item[0] & 1;
|
|
+ h->st.gain &= ~HARMONY_GAIN_IS_MASK;
|
|
+ h->st.gain |= value << HARMONY_GAIN_IS_SHIFT;
|
|
+
|
|
snd_harmony_set_new_gain(h);
|
|
|
|
spin_unlock_irqrestore(&h->mixer_lock, flags);
|
|
|
|
- return (old_gain - h->st.gain);
|
|
+ return h->st.gain != old_gain;
|
|
}
|
|
|
|
#define HARMONY_CONTROLS (sizeof(snd_harmony_controls)/ \
|
|
@@ -767,10 +832,25 @@
|
|
((mask) << 16) | ((invert) << 24)) }
|
|
|
|
static snd_kcontrol_new_t snd_harmony_controls[] = {
|
|
- HARMONY_VOLUME("Playback Volume", HARMONY_GAIN_LO_SHIFT,
|
|
+ HARMONY_VOLUME("Master 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),
|
|
+ HARMONY_VOLUME("Monitor Volume", HARMONY_GAIN_MA_SHIFT,
|
|
+ HARMONY_GAIN_MA_SHIFT, HARMONY_GAIN_MA, 1),
|
|
+ {
|
|
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
+ .name = "Input Route",
|
|
+ .info = snd_harmony_captureroute_info,
|
|
+ .get = snd_harmony_captureroute_get,
|
|
+ .put = snd_harmony_captureroute_put
|
|
+ },
|
|
+ HARMONY_VOLUME("Internal Speaker Switch", HARMONY_GAIN_SE_SHIFT,
|
|
+ HARMONY_GAIN_SE_SHIFT, 1, 0),
|
|
+ HARMONY_VOLUME("Line-Out Switch", HARMONY_GAIN_LE_SHIFT,
|
|
+ HARMONY_GAIN_LE_SHIFT, 1, 0),
|
|
+ HARMONY_VOLUME("Headphones Switch", HARMONY_GAIN_HE_SHIFT,
|
|
+ HARMONY_GAIN_HE_SHIFT, 1, 0),
|
|
};
|
|
|
|
static void __init
|
|
Index: linux-2.6-2.6.12/sound/parisc/harmony.h
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/parisc/harmony.h 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/parisc/harmony.h 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -61,7 +61,7 @@
|
|
#define HARMONY_SIZE 64
|
|
|
|
#define BUF_SIZE PAGE_SIZE
|
|
-#define MAX_BUFS 10
|
|
+#define MAX_BUFS 16
|
|
#define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE)
|
|
|
|
#define PLAYBACK_BUFS MAX_BUFS
|
|
@@ -101,28 +101,31 @@
|
|
#define HARMONY_SS_MONO 0x00000000
|
|
#define HARMONY_SS_STEREO 0x00000001
|
|
|
|
-#define HARMONY_GAIN_SILENCE 0x00F00FFF
|
|
-#define HARMONY_GAIN_DEFAULT 0x0FF00000
|
|
+#define HARMONY_GAIN_SILENCE 0x01F00FFF
|
|
+#define HARMONY_GAIN_DEFAULT 0x01F00FFF
|
|
|
|
-#define HARMONY_GAIN_HE_SHIFT 27
|
|
+#define HARMONY_GAIN_HE_SHIFT 27 /* headphones enabled */
|
|
#define HARMONY_GAIN_HE_MASK (1 << HARMONY_GAIN_HE_SHIFT)
|
|
-#define HARMONY_GAIN_LE_SHIFT 26
|
|
+#define HARMONY_GAIN_LE_SHIFT 26 /* line-out enabled */
|
|
#define HARMONY_GAIN_LE_MASK (1 << HARMONY_GAIN_LE_SHIFT)
|
|
-#define HARMONY_GAIN_SE_SHIFT 25
|
|
+#define HARMONY_GAIN_SE_SHIFT 25 /* internal-speaker enabled */
|
|
#define HARMONY_GAIN_SE_MASK (1 << HARMONY_GAIN_SE_SHIFT)
|
|
-#define HARMONY_GAIN_IS_SHIFT 24
|
|
+#define HARMONY_GAIN_IS_SHIFT 24 /* input select - 0 for line, 1 for mic */
|
|
#define HARMONY_GAIN_IS_MASK (1 << HARMONY_GAIN_IS_SHIFT)
|
|
|
|
+/* monitor attenuation */
|
|
#define HARMONY_GAIN_MA 0x0f
|
|
#define HARMONY_GAIN_MA_SHIFT 20
|
|
#define HARMONY_GAIN_MA_MASK (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT)
|
|
|
|
+/* input gain */
|
|
#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)
|
|
|
|
+/* output gain (master volume) */
|
|
#define HARMONY_GAIN_OUT 0x3f
|
|
#define HARMONY_GAIN_LO_SHIFT 6
|
|
#define HARMONY_GAIN_LO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT)
|
|
Index: linux-2.6-2.6.12/sound/pci/Kconfig
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/pci/Kconfig 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/pci/Kconfig 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -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
|
|
+ select SND_AC97_CODEC
|
|
+ help
|
|
+ Say Y here to include support for the integrated AC97 sound
|
|
+ device on the Hewlett-Packard [BCJ]-xxx0 class PA-RISC
|
|
+ workstations, using the AD1819 codec.
|
|
+
|
|
+ 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
|
|
Index: linux-2.6-2.6.12/sound/pci/Makefile
|
|
===================================================================
|
|
--- linux-2.6-2.6.12.orig/sound/pci/Makefile 2005-08-09 09:52:27.000000000 -0400
|
|
+++ linux-2.6-2.6.12/sound/pci/Makefile 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -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
|
|
Index: linux-2.6-2.6.12/sound/pci/ad1889.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/sound/pci/ad1889.c 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -0,0 +1,1210 @@
|
|
+/* 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>
|
|
+ * Copyright (C) 2005, Thibaut Varene <varenet@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:
|
|
+ * Do we need to take care of CCS register?
|
|
+ * Maybe we could use finer grained locking (separate locks for pb/cap)?
|
|
+ * Wishlist:
|
|
+ * Control Interface (mixer) support
|
|
+ * Better AC97 support (VSR...)?
|
|
+ * PM support
|
|
+ * MIDI support
|
|
+ * Game Port support
|
|
+ * SG DMA support (this will need *alot* of work)
|
|
+ */
|
|
+
|
|
+#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"
|
|
+#include "ac97/ac97_id.h"
|
|
+
|
|
+#define AD1889_DRVVER "$Revision: 1.31 $"
|
|
+
|
|
+MODULE_AUTHOR("Kyle McMartin <kyle@parisc-linux.org>, Thibaut Varene <t-bone@parisc-linux.org>");
|
|
+MODULE_DESCRIPTION("Analog Devices AD1889 ALSA sound driver");
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_VERSION(AD1889_DRVVER);
|
|
+MODULE_SUPPORTED_DEVICE("{{Analog Devices,AD1889}}");
|
|
+
|
|
+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.");
|
|
+
|
|
+static char *ac97_quirk[SNDRV_CARDS];
|
|
+module_param_array(ac97_quirk, charp, NULL, 0444);
|
|
+MODULE_PARM_DESC(ac97_quirk, "AC'97 workaround for strange hardware.");
|
|
+
|
|
+#define DEVNAME "ad1889"
|
|
+#define PFX DEVNAME ": "
|
|
+
|
|
+/* let's use the global sound debug interfaces */
|
|
+#define ad1889_debug(fmt, arg...) snd_printd(KERN_DEBUG fmt, ## arg)
|
|
+
|
|
+/* keep track of each hw register */
|
|
+struct ad1889_register_state {
|
|
+ u16 reg; /* reg setup */
|
|
+ u32 addr; /* dma base address */
|
|
+ u16 rate; /* sample rate */
|
|
+ unsigned long pos; /* last recorded DMA buffer position */
|
|
+ unsigned long buf; /* period # */
|
|
+ unsigned long size; /* DMA buffer size */
|
|
+ unsigned long count; /* period size, aka nb bytes sent in the current DMA transfer */
|
|
+};
|
|
+
|
|
+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;
|
|
+
|
|
+ opl3_t *opl3;
|
|
+ snd_hwdep_t *opl3hwdep;
|
|
+#endif
|
|
+
|
|
+ ac97_t *ac97;
|
|
+ ac97_bus_t *ac97_bus;
|
|
+ snd_pcm_t *pcm;
|
|
+ snd_info_entry_t *proc;
|
|
+
|
|
+ struct snd_dma_device dma;
|
|
+ snd_pcm_substream_t *psubs;
|
|
+ snd_pcm_substream_t *csubs;
|
|
+
|
|
+ /* playback register state */
|
|
+ struct ad1889_register_state wave;
|
|
+ struct ad1889_register_state ramc;
|
|
+
|
|
+ struct {
|
|
+ unsigned long wav_intr;
|
|
+ unsigned long adc_intr;
|
|
+ unsigned long syn_intr;
|
|
+ unsigned long res_intr;
|
|
+ } stats;
|
|
+
|
|
+ spinlock_t lock;
|
|
+};
|
|
+
|
|
+static inline u16
|
|
+ad1889_readw(struct snd_ad1889 *chip, unsigned reg)
|
|
+{
|
|
+ return ioread16(chip->iobase + reg);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+ad1889_writew(struct snd_ad1889 *chip, unsigned reg, u16 val)
|
|
+{
|
|
+ iowrite16(val, chip->iobase + reg);
|
|
+}
|
|
+
|
|
+static inline u32
|
|
+ad1889_readl(struct snd_ad1889 *chip, unsigned reg)
|
|
+{
|
|
+ return ioread32(chip->iobase + reg);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+ad1889_writel(struct snd_ad1889 *chip, unsigned reg, u32 val)
|
|
+{
|
|
+ iowrite32(val, chip->iobase + reg);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+ad1889_unmute(struct snd_ad1889 *chip)
|
|
+{
|
|
+ u16 st;
|
|
+ st = ad1889_readw(chip, AD_DS_WADA) &
|
|
+ ~(AD_DS_WADA_RWAM | AD_DS_WADA_LWAM);
|
|
+ ad1889_writew(chip, AD_DS_WADA, st);
|
|
+ ad1889_readw(chip, AD_DS_WADA);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+ad1889_mute(struct snd_ad1889 *chip)
|
|
+{
|
|
+ u16 st;
|
|
+ st = ad1889_readw(chip, AD_DS_WADA) | AD_DS_WADA_RWAM | AD_DS_WADA_LWAM;
|
|
+ ad1889_writew(chip, AD_DS_WADA, st);
|
|
+ ad1889_readw(chip, AD_DS_WADA);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+ad1889_load_adc_count(struct snd_ad1889 *chip, u32 count)
|
|
+{
|
|
+ ad1889_writel(chip, AD_DMA_ADCBC, count);
|
|
+ ad1889_writel(chip, AD_DMA_ADCCC, count);
|
|
+ ad1889_writel(chip, AD_DMA_ADCIB, count);
|
|
+ ad1889_writel(chip, AD_DMA_ADCIC, count);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+ad1889_load_wave_count(struct snd_ad1889 *chip, u32 count)
|
|
+{
|
|
+ ad1889_writel(chip, AD_DMA_WAVBC, count);
|
|
+ ad1889_writel(chip, AD_DMA_WAVCC, count);
|
|
+ ad1889_writel(chip, AD_DMA_WAVIB, count);
|
|
+ ad1889_writel(chip, AD_DMA_WAVIC, count);
|
|
+}
|
|
+
|
|
+static void
|
|
+ad1889_channel_reset(struct snd_ad1889 *chip, unsigned int channel)
|
|
+{
|
|
+ u16 reg;
|
|
+
|
|
+ if (channel & AD_CHAN_WAV) {
|
|
+ /* Disable wave channel */
|
|
+ reg = ad1889_readw(chip, AD_DS_WSMC) & ~AD_DS_WSMC_WAEN;
|
|
+ ad1889_writew(chip, AD_DS_WSMC, reg);
|
|
+ chip->wave.reg = reg;
|
|
+
|
|
+ /* disable IRQs */
|
|
+ reg = ad1889_readw(chip, AD_DMA_WAV);
|
|
+ reg &= AD_DMA_IM_DIS;
|
|
+ reg &= ~AD_DMA_LOOP;
|
|
+ ad1889_writew(chip, AD_DMA_WAV, reg);
|
|
+
|
|
+ /* clear IRQ and address counters and pointers */
|
|
+ ad1889_load_wave_count(chip, 0x0);
|
|
+ ad1889_writel(chip, AD_DMA_WAVBA, 0x0);
|
|
+ ad1889_writel(chip, AD_DMA_WAVCA, 0x0);
|
|
+
|
|
+ /* flush */
|
|
+ ad1889_readw(chip, AD_DMA_WAV);
|
|
+ }
|
|
+
|
|
+ if (channel & AD_CHAN_ADC) {
|
|
+ /* Disable ADC channel */
|
|
+ reg = ad1889_readw(chip, AD_DS_RAMC) & ~AD_DS_RAMC_ADEN;
|
|
+ ad1889_writew(chip, AD_DS_RAMC, reg);
|
|
+ chip->ramc.reg = reg;
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_DMA_ADC);
|
|
+ reg &= AD_DMA_IM_DIS;
|
|
+ reg &= ~AD_DMA_LOOP;
|
|
+ ad1889_writew(chip, AD_DMA_ADC, reg);
|
|
+
|
|
+ ad1889_load_adc_count(chip, 0x0);
|
|
+ ad1889_writel(chip, AD_DMA_ADCBA, 0x0);
|
|
+ ad1889_writel(chip, AD_DMA_ADCCA, 0x0);
|
|
+
|
|
+ /* flush */
|
|
+ ad1889_readw(chip, AD_DMA_ADC);
|
|
+ }
|
|
+}
|
|
+
|
|
+static inline u16
|
|
+snd_ad1889_ac97_read(ac97_t *ac97, unsigned short reg)
|
|
+{
|
|
+ struct snd_ad1889 *chip = ac97->private_data;
|
|
+ return ad1889_readw(chip, AD_AC97_BASE + reg);
|
|
+}
|
|
+
|
|
+static inline void
|
|
+snd_ad1889_ac97_write(ac97_t *ac97, unsigned short reg, unsigned short val)
|
|
+{
|
|
+ struct snd_ad1889 *chip = ac97->private_data;
|
|
+ ad1889_writew(chip, AD_AC97_BASE + reg, val);
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_ac97_ready(struct snd_ad1889 *chip)
|
|
+{
|
|
+ int retry = 400; /* average needs 352 msec */
|
|
+
|
|
+ while (!(ad1889_readw(chip, AD_AC97_ACIC) & AD_AC97_ACIC_ACRDY)
|
|
+ && --retry)
|
|
+ mdelay(1);
|
|
+ if (!retry) {
|
|
+ snd_printk(KERN_ERR PFX "[%s] Link is not ready.\n",
|
|
+ __FUNCTION__);
|
|
+ return -EIO;
|
|
+ }
|
|
+ ad1889_debug("[%s] ready after %d ms\n", __FUNCTION__, 400 - retry);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+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_hw = {
|
|
+ .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
|
|
+ SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BLOCK_TRANSFER,
|
|
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
|
|
+ .rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
|
|
+ .rate_min = 8000, /* docs say 7000, but we're lazy */
|
|
+ .rate_max = 48000,
|
|
+ .channels_min = 1,
|
|
+ .channels_max = 2,
|
|
+ .buffer_bytes_max = DMA_SIZE, /* max DMA buffer size in bytes */
|
|
+ .period_bytes_min = BUF_SIZE, /* min size of period in bytes */
|
|
+ .period_bytes_max = DMA_SIZE, /* max size of period in bytes */
|
|
+ .periods_min = 1, /* min nb of periods in buffer */
|
|
+ .periods_max = MAX_BUFS,
|
|
+ /*.fifo_size = 0,*/
|
|
+};
|
|
+
|
|
+static snd_pcm_hardware_t snd_ad1889_capture_hw = {
|
|
+ .info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
|
|
+ SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_BLOCK_TRANSFER,
|
|
+ .formats = SNDRV_PCM_FMTBIT_S16_LE,
|
|
+ .rates = SNDRV_PCM_RATE_48000,
|
|
+ .rate_min = 48000, /* docs say we could to VSR, but we're lazy */
|
|
+ .rate_max = 48000,
|
|
+ .channels_min = 1,
|
|
+ .channels_max = 2,
|
|
+ .buffer_bytes_max = DMA_SIZE, /* max DMA buffer size in bytes */
|
|
+ .period_bytes_min = BUF_SIZE, /* min size of period in bytes */
|
|
+ .period_bytes_max = DMA_SIZE, /* max size of period in bytes */
|
|
+ .periods_min = 1, /* min nb of periods in buffer */
|
|
+ .periods_max = MAX_BUFS,
|
|
+ /*.fifo_size = 0,*/
|
|
+};
|
|
+
|
|
+static int
|
|
+snd_ad1889_playback_open(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+ snd_pcm_runtime_t *rt = ss->runtime;
|
|
+
|
|
+ chip->psubs = ss;
|
|
+ rt->hw = snd_ad1889_playback_hw;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_capture_open(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+ snd_pcm_runtime_t *rt = ss->runtime;
|
|
+
|
|
+ chip->csubs = ss;
|
|
+ rt->hw = snd_ad1889_capture_hw;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_playback_close(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+ chip->psubs = NULL;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_capture_close(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+ chip->csubs = NULL;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_playback_prepare(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+ snd_pcm_runtime_t *rt = ss->runtime;
|
|
+ unsigned int size = snd_pcm_lib_buffer_bytes(ss);
|
|
+ unsigned int count = snd_pcm_lib_period_bytes(ss);
|
|
+ u16 reg;
|
|
+
|
|
+ ad1889_channel_reset(chip, AD_CHAN_WAV);
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_DS_WSMC);
|
|
+
|
|
+ /* Mask out 16-bit / Stereo */
|
|
+ reg &= ~(AD_DS_WSMC_WA16 | AD_DS_WSMC_WAST);
|
|
+
|
|
+ if (snd_pcm_format_width(rt->format) == 16)
|
|
+ reg |= AD_DS_WSMC_WA16;
|
|
+
|
|
+ if (rt->channels > 1)
|
|
+ reg |= AD_DS_WSMC_WAST;
|
|
+
|
|
+ /* let's make sure we don't clobber ourselves */
|
|
+ spin_lock_irq(&chip->lock);
|
|
+
|
|
+ chip->wave.size = size;
|
|
+ chip->wave.count = count;
|
|
+ chip->wave.reg = reg;
|
|
+ chip->wave.buf = 0;
|
|
+ chip->wave.pos = 0;
|
|
+ chip->wave.rate = rt->rate;
|
|
+ chip->wave.addr = rt->dma_addr;
|
|
+
|
|
+ ad1889_writew(chip, AD_DS_WSMC, chip->wave.reg);
|
|
+
|
|
+ /* Set sample rates on the codec */
|
|
+ ad1889_writew(chip, AD_DS_WAS, chip->wave.rate);
|
|
+
|
|
+ /* Set up DMA: first chunk address in curr addr, next one in base addr.
|
|
+ Base will be loaded into curr by the hardware upon interrupt
|
|
+ (as we use LOOP). Count holds the size of the chunk. */
|
|
+ ad1889_writel(chip, AD_DMA_WAVCA, chip->wave.addr);
|
|
+ ad1889_writel(chip, AD_DMA_WAVBA, chip->wave.addr + (count % size));
|
|
+ ad1889_load_wave_count(chip, chip->wave.count);
|
|
+
|
|
+ /* writes flush */
|
|
+ ad1889_readw(chip, AD_DS_WSMC);
|
|
+
|
|
+ spin_unlock_irq(&chip->lock);
|
|
+
|
|
+ ad1889_debug("prepare playback: addr = 0x%x, count = %u, "
|
|
+ "size = %u, reg = 0x%x, rate = %u\n", chip->wave.addr,
|
|
+ count, size, reg, chip->wave.rate);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_capture_prepare(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+ snd_pcm_runtime_t *rt = ss->runtime;
|
|
+ unsigned int size = snd_pcm_lib_buffer_bytes(ss);
|
|
+ unsigned int count = snd_pcm_lib_period_bytes(ss);
|
|
+ u16 reg;
|
|
+
|
|
+ ad1889_channel_reset(chip, AD_CHAN_ADC);
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_DS_RAMC);
|
|
+
|
|
+ /* Mask out 16-bit / Stereo */
|
|
+ reg &= ~(AD_DS_RAMC_AD16 | AD_DS_RAMC_ADST);
|
|
+
|
|
+ if (snd_pcm_format_width(rt->format) == 16)
|
|
+ reg |= AD_DS_RAMC_AD16;
|
|
+
|
|
+ if (rt->channels > 1)
|
|
+ reg |= AD_DS_RAMC_ADST;
|
|
+
|
|
+ /* let's make sure we don't clobber ourselves */
|
|
+ spin_lock_irq(&chip->lock);
|
|
+
|
|
+ chip->ramc.size = size;
|
|
+ chip->ramc.count = count;
|
|
+ chip->ramc.reg = reg;
|
|
+ chip->ramc.buf = 0;
|
|
+ chip->ramc.pos = 0;
|
|
+ chip->ramc.rate = rt->rate;
|
|
+ chip->ramc.addr = rt->dma_addr;
|
|
+
|
|
+ ad1889_writew(chip, AD_DS_RAMC, chip->ramc.reg);
|
|
+
|
|
+ /* Set up DMA: first chunk address in curr addr, next one in base addr.
|
|
+ Base will be loaded into curr by the hardware upon interrupt
|
|
+ (as we use LOOP). Count holds the size of the chunk. */
|
|
+ ad1889_writel(chip, AD_DMA_ADCCA, chip->ramc.addr);
|
|
+ ad1889_writel(chip, AD_DMA_ADCBA, chip->ramc.addr + (count % size));
|
|
+ ad1889_load_adc_count(chip, chip->ramc.count);
|
|
+
|
|
+ /* writes flush */
|
|
+ ad1889_readw(chip, AD_DS_RAMC);
|
|
+
|
|
+ spin_unlock_irq(&chip->lock);
|
|
+
|
|
+ ad1889_debug("prepare capture: addr = 0x%x, count = %u, "
|
|
+ "size = %u, reg = 0x%x, rate = %u\n", chip->ramc.addr,
|
|
+ count, size, reg, chip->ramc.rate);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* this is called in atomic context with IRQ disabled.
|
|
+ Must be as fast as possible and not sleep.
|
|
+ DMA should be *triggered* by this call.
|
|
+ The WSMC "WAEN" bit triggers DMA Wave On/Off */
|
|
+static int
|
|
+snd_ad1889_playback_trigger(snd_pcm_substream_t *ss, int cmd)
|
|
+{
|
|
+ u16 wsmc;
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+
|
|
+ wsmc = ad1889_readw(chip, AD_DS_WSMC);
|
|
+
|
|
+ switch (cmd) {
|
|
+ case SNDRV_PCM_TRIGGER_START:
|
|
+ /* enable DMA loop & interrupts */
|
|
+ ad1889_writew(chip, AD_DMA_WAV, AD_DMA_LOOP | AD_DMA_IM_CNT);
|
|
+ wsmc |= AD_DS_WSMC_WAEN;
|
|
+ /* 1 to clear CHSS bit */
|
|
+ ad1889_writel(chip, AD_DMA_CHSS, AD_DMA_CHSS_WAVS);
|
|
+ ad1889_unmute(chip);
|
|
+ break;
|
|
+ case SNDRV_PCM_TRIGGER_STOP:
|
|
+ ad1889_mute(chip);
|
|
+ wsmc &= ~AD_DS_WSMC_WAEN;
|
|
+ break;
|
|
+ default:
|
|
+ snd_BUG();
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ chip->wave.reg = wsmc;
|
|
+ ad1889_writew(chip, AD_DS_WSMC, wsmc);
|
|
+ ad1889_readw(chip, AD_DS_WSMC); /* flush */
|
|
+
|
|
+ /* reset the chip when STOP - will disable IRQs */
|
|
+ if (cmd == SNDRV_PCM_TRIGGER_STOP)
|
|
+ ad1889_channel_reset(chip, AD_CHAN_WAV);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* this is called in atomic context with IRQ disabled.
|
|
+ Must be as fast as possible and not sleep.
|
|
+ DMA should be *triggered* by this call.
|
|
+ The RAMC "ADEN" bit triggers DMA ADC On/Off */
|
|
+static int
|
|
+snd_ad1889_capture_trigger(snd_pcm_substream_t *ss, int cmd)
|
|
+{
|
|
+ u16 ramc;
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+
|
|
+ ramc = ad1889_readw(chip, AD_DS_RAMC);
|
|
+
|
|
+ switch (cmd) {
|
|
+ case SNDRV_PCM_TRIGGER_START:
|
|
+ /* enable DMA loop & interrupts */
|
|
+ ad1889_writew(chip, AD_DMA_ADC, AD_DMA_LOOP | AD_DMA_IM_CNT);
|
|
+ ramc |= AD_DS_RAMC_ADEN;
|
|
+ /* 1 to clear CHSS bit */
|
|
+ ad1889_writel(chip, AD_DMA_CHSS, AD_DMA_CHSS_ADCS);
|
|
+ break;
|
|
+ case SNDRV_PCM_TRIGGER_STOP:
|
|
+ ramc &= ~AD_DS_RAMC_ADEN;
|
|
+ break;
|
|
+ default:
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ chip->ramc.reg = ramc;
|
|
+ ad1889_writew(chip, AD_DS_RAMC, ramc);
|
|
+ ad1889_readw(chip, AD_DS_RAMC); /* flush */
|
|
+
|
|
+ /* reset the chip when STOP - will disable IRQs */
|
|
+ if (cmd == SNDRV_PCM_TRIGGER_STOP)
|
|
+ ad1889_channel_reset(chip, AD_CHAN_ADC);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+/* Called in atomic context with IRQ disabled */
|
|
+static snd_pcm_uframes_t
|
|
+snd_ad1889_playback_pointer(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ size_t ptr = 0;
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+
|
|
+ if (unlikely(!(chip->wave.reg & AD_DS_WSMC_WAEN)))
|
|
+ return 0;
|
|
+
|
|
+ ptr = ad1889_readl(chip, AD_DMA_WAVCA);
|
|
+ ptr -= chip->wave.addr;
|
|
+
|
|
+ snd_assert((ptr >= 0) && (ptr < chip->wave.size), return 0);
|
|
+
|
|
+ return bytes_to_frames(ss->runtime, ptr);
|
|
+}
|
|
+
|
|
+/* Called in atomic context with IRQ disabled */
|
|
+static snd_pcm_uframes_t
|
|
+snd_ad1889_capture_pointer(snd_pcm_substream_t *ss)
|
|
+{
|
|
+ size_t ptr = 0;
|
|
+ struct snd_ad1889 *chip = snd_pcm_substream_chip(ss);
|
|
+
|
|
+ if (unlikely(!(chip->ramc.reg & AD_DS_RAMC_ADEN)))
|
|
+ return 0;
|
|
+
|
|
+ ptr = ad1889_readl(chip, AD_DMA_ADCCA);
|
|
+ ptr -= chip->ramc.addr;
|
|
+
|
|
+ snd_assert((ptr >= 0) && (ptr < chip->ramc.size), return 0);
|
|
+
|
|
+ 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 snd_pcm_ops_t snd_ad1889_capture_ops = {
|
|
+ .open = snd_ad1889_capture_open,
|
|
+ .close = snd_ad1889_capture_close,
|
|
+ .ioctl = snd_pcm_lib_ioctl,
|
|
+ .hw_params = snd_ad1889_hw_params,
|
|
+ .hw_free = snd_ad1889_hw_free,
|
|
+ .prepare = snd_ad1889_capture_prepare,
|
|
+ .trigger = snd_ad1889_capture_trigger,
|
|
+ .pointer = snd_ad1889_capture_pointer,
|
|
+};
|
|
+
|
|
+static irqreturn_t
|
|
+snd_ad1889_interrupt(int irq,
|
|
+ void *dev_id,
|
|
+ struct pt_regs *regs)
|
|
+{
|
|
+ unsigned long st;
|
|
+ unsigned long next;
|
|
+ struct snd_ad1889 *chip = dev_id;
|
|
+
|
|
+ st = ad1889_readl(chip, AD_DMA_DISR);
|
|
+
|
|
+ /* clear ISR */
|
|
+ ad1889_writel(chip, AD_DMA_DISR, st);
|
|
+
|
|
+ st &= AD_INTR_MASK;
|
|
+
|
|
+ if (unlikely(!st))
|
|
+ return IRQ_NONE;
|
|
+
|
|
+ if (st & (AD_DMA_DISR_PMAI|AD_DMA_DISR_PTAI))
|
|
+ ad1889_debug("Unexpected master or target abort interrupt!\n");
|
|
+
|
|
+ if (chip->pcm && (st & AD_DMA_DISR_WAVI) && chip->psubs) {
|
|
+ spin_lock(&chip->lock);
|
|
+
|
|
+ chip->stats.wav_intr++;
|
|
+
|
|
+ chip->wave.buf++;
|
|
+
|
|
+ /* calculate the current position: we get interrupts everytime
|
|
+ the buffer empties, thus every wave.count bytes transfered */
|
|
+ chip->wave.pos += chip->wave.count;
|
|
+ chip->wave.pos %= chip->wave.size;
|
|
+
|
|
+ /* the next buffer will thus be current position + wave.count
|
|
+ bytes away */
|
|
+ next = chip->wave.pos + chip->wave.count;
|
|
+ next %= chip->wave.size;
|
|
+
|
|
+ /* Load new DMA parameters (aka "the next chunk" in Base
|
|
+ registers: upon next interrupt, they'll be automatically
|
|
+ loaded in the Current registers, and we'll end up here
|
|
+ preparing the new ones. Since "count" never gets modified
|
|
+ elsewhere than in _prepare, we don't need to rewrite it. */
|
|
+ ad1889_writel(chip, AD_DMA_WAVBA, chip->wave.addr + next);
|
|
+
|
|
+ ad1889_readl(chip, AD_DMA_WAVBA); /* flush all those writes */
|
|
+
|
|
+ spin_unlock(&chip->lock);
|
|
+
|
|
+ snd_pcm_period_elapsed(chip->psubs);
|
|
+#if 0
|
|
+ ad1889_debug("chip->wave.pos = %d, chip->wave.count = %d, "
|
|
+ "chip->wave.size = %d\n", chip->wave.pos,
|
|
+ chip->wave.count, chip->wave.size);
|
|
+ ad1889_debug("chip->wave.addr (0x%lx) + next (0x%lx) = 0x%lx\n",
|
|
+ chip->wave.addr, next, chip->wave.addr + next);
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ if (chip->pcm && (st & AD_DMA_DISR_ADCI) && chip->csubs) {
|
|
+ spin_lock(&chip->lock);
|
|
+
|
|
+ chip->stats.adc_intr++;
|
|
+
|
|
+ chip->ramc.buf++;
|
|
+
|
|
+ /* calculate the current position: we get interrupts everytime
|
|
+ the buffer empties, thus every wave.count bytes transfered */
|
|
+ chip->ramc.pos += chip->ramc.count;
|
|
+ chip->ramc.pos %= chip->ramc.size;
|
|
+
|
|
+ /* the next buffer will thus be current position + wave.count
|
|
+ bytes away */
|
|
+ next = chip->ramc.pos + chip->ramc.count;
|
|
+ next %= chip->ramc.size;
|
|
+
|
|
+ /* Load new DMA parameters (aka "the next chunk" in Base
|
|
+ registers: upon next interrupt, they'll be automatically
|
|
+ loaded in the Current registers, and we'll end up here
|
|
+ preparing the new ones. Since "count" never gets modified
|
|
+ elsewhere than in _prepare, we don't need to rewrite it. */
|
|
+ ad1889_writel(chip, AD_DMA_ADCBA, chip->ramc.addr + next);
|
|
+
|
|
+ ad1889_readl(chip, AD_DMA_ADCBA); /* flush all those writes */
|
|
+
|
|
+ spin_unlock(&chip->lock);
|
|
+
|
|
+ snd_pcm_period_elapsed(chip->csubs);
|
|
+#if 0
|
|
+ ad1889_debug("chip->ramc.pos = %d, chip->ramc.count = %d, "
|
|
+ "chip->ramc.size = %d\n", chip->ramc.pos,
|
|
+ chip->ramc.count, chip->ramc.size);
|
|
+ ad1889_debug("chip->ramc.addr (0x%lx) + next (0x%lx) = 0x%lx\n",
|
|
+ chip->ramc.addr, next, chip->ramc.addr + next);
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ /* XXX under some circumstances the DISR write flush may not happen */
|
|
+
|
|
+ return IRQ_HANDLED;
|
|
+}
|
|
+
|
|
+static void
|
|
+snd_ad1889_pcm_free(snd_pcm_t *pcm)
|
|
+{
|
|
+ struct snd_ad1889 *chip = pcm->private_data;
|
|
+ chip->pcm = NULL;
|
|
+ snd_pcm_lib_preallocate_free_for_all(pcm);
|
|
+}
|
|
+
|
|
+static int __devinit
|
|
+snd_ad1889_pcm_init(struct snd_ad1889 *chip, int device, snd_pcm_t **rpcm)
|
|
+{
|
|
+ int err;
|
|
+ snd_pcm_t *pcm;
|
|
+
|
|
+ if (rpcm)
|
|
+ *rpcm = NULL;
|
|
+
|
|
+ err = snd_pcm_new(chip->card, chip->card->driver, device, 1, 1, &pcm);
|
|
+ if (err < 0)
|
|
+ return err;
|
|
+
|
|
+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
|
+ &snd_ad1889_playback_ops);
|
|
+ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
|
|
+ &snd_ad1889_capture_ops);
|
|
+
|
|
+ pcm->private_data = chip;
|
|
+ pcm->private_free = snd_ad1889_pcm_free;
|
|
+ pcm->info_flags = 0;
|
|
+ strcpy(pcm->name, chip->card->shortname);
|
|
+
|
|
+ chip->pcm = pcm;
|
|
+ chip->psubs = NULL;
|
|
+ chip->csubs = NULL;
|
|
+
|
|
+ chip->dma.dev = &chip->pci->dev;
|
|
+ chip->dma.type = SNDRV_DMA_TYPE_DEV;
|
|
+
|
|
+ err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
|
|
+ snd_dma_pci_data(chip->pci),
|
|
+ DMA_SIZE, DMA_SIZE);
|
|
+
|
|
+ if (err < 0) {
|
|
+ snd_printk(KERN_ERR PFX "buffer allocation error: %d\n", err);
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ if (rpcm)
|
|
+ *rpcm = pcm;
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static void
|
|
+snd_ad1889_proc_read(snd_info_entry_t *entry, snd_info_buffer_t *buffer)
|
|
+{
|
|
+ struct snd_ad1889 *chip = entry->private_data;
|
|
+ u16 reg;
|
|
+ int tmp;
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_DS_WSMC);
|
|
+ snd_iprintf(buffer, "Wave output: %s\n",
|
|
+ (reg & AD_DS_WSMC_WAEN) ? "enabled" : "disabled");
|
|
+ snd_iprintf(buffer, "Wave Channels: %s\n",
|
|
+ (reg & AD_DS_WSMC_WAST) ? "stereo" : "mono");
|
|
+ snd_iprintf(buffer, "Wave Quality: %d-bit linear\n",
|
|
+ (reg & AD_DS_WSMC_WA16) ? 16 : 8);
|
|
+
|
|
+ /* WARQ is at offset 12 */
|
|
+ tmp = (reg & AD_DS_WSMC_WARQ) ?
|
|
+ (((reg & AD_DS_WSMC_WARQ >> 12) & 0x01) ? 12 : 18) : 4;
|
|
+ tmp /= (reg & AD_DS_WSMC_WAST) ? 2 : 1;
|
|
+
|
|
+ snd_iprintf(buffer, "Wave FIFO: %d %s words\n\n", tmp,
|
|
+ (reg & AD_DS_WSMC_WAST) ? "stereo" : "mono");
|
|
+
|
|
+
|
|
+ snd_iprintf(buffer, "Synthesis output: %s\n",
|
|
+ reg & AD_DS_WSMC_SYEN ? "enabled" : "disabled");
|
|
+
|
|
+ /* SYRQ is at offset 4 */
|
|
+ tmp = (reg & AD_DS_WSMC_SYRQ) ?
|
|
+ (((reg & AD_DS_WSMC_SYRQ >> 4) & 0x01) ? 12 : 18) : 4;
|
|
+ tmp /= (reg & AD_DS_WSMC_WAST) ? 2 : 1;
|
|
+
|
|
+ snd_iprintf(buffer, "Synthesis FIFO: %d %s words\n\n", tmp,
|
|
+ (reg & AD_DS_WSMC_WAST) ? "stereo" : "mono");
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_DS_RAMC);
|
|
+ snd_iprintf(buffer, "ADC input: %s\n",
|
|
+ (reg & AD_DS_RAMC_ADEN) ? "enabled" : "disabled");
|
|
+ snd_iprintf(buffer, "ADC Channels: %s\n",
|
|
+ (reg & AD_DS_RAMC_ADST) ? "stereo" : "mono");
|
|
+ snd_iprintf(buffer, "ADC Quality: %d-bit linear\n",
|
|
+ (reg & AD_DS_RAMC_AD16) ? 16 : 8);
|
|
+
|
|
+ /* ACRQ is at offset 4 */
|
|
+ tmp = (reg & AD_DS_RAMC_ACRQ) ?
|
|
+ (((reg & AD_DS_RAMC_ACRQ >> 4) & 0x01) ? 12 : 18) : 4;
|
|
+ tmp /= (reg & AD_DS_RAMC_ADST) ? 2 : 1;
|
|
+
|
|
+ snd_iprintf(buffer, "ADC FIFO: %d %s words\n\n", tmp,
|
|
+ (reg & AD_DS_RAMC_ADST) ? "stereo" : "mono");
|
|
+
|
|
+ snd_iprintf(buffer, "Resampler input: %s\n",
|
|
+ reg & AD_DS_RAMC_REEN ? "enabled" : "disabled");
|
|
+
|
|
+ /* RERQ is at offset 12 */
|
|
+ tmp = (reg & AD_DS_RAMC_RERQ) ?
|
|
+ (((reg & AD_DS_RAMC_RERQ >> 12) & 0x01) ? 12 : 18) : 4;
|
|
+ tmp /= (reg & AD_DS_RAMC_ADST) ? 2 : 1;
|
|
+
|
|
+ snd_iprintf(buffer, "Resampler FIFO: %d %s words\n\n", tmp,
|
|
+ (reg & AD_DS_WSMC_WAST) ? "stereo" : "mono");
|
|
+
|
|
+
|
|
+ /* doc says LSB represents -1.5dB, but the max value (-94.5dB)
|
|
+ suggests that LSB is -3dB, which is more coherent with the logarithmic
|
|
+ nature of the dB scale */
|
|
+ reg = ad1889_readw(chip, AD_DS_WADA);
|
|
+ snd_iprintf(buffer, "Left: %s, -%d dB\n",
|
|
+ (reg & AD_DS_WADA_LWAM) ? "mute" : "unmute",
|
|
+ ((reg & AD_DS_WADA_LWAA) >> 8) * 3);
|
|
+ reg = ad1889_readw(chip, AD_DS_WADA);
|
|
+ snd_iprintf(buffer, "Right: %s, -%d dB\n",
|
|
+ (reg & AD_DS_WADA_RWAM) ? "mute" : "unmute",
|
|
+ ((reg & AD_DS_WADA_RWAA) >> 8) * 3);
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_DS_WAS);
|
|
+ snd_iprintf(buffer, "Wave samplerate: %u Hz\n", reg);
|
|
+ reg = ad1889_readw(chip, AD_DS_RES);
|
|
+ snd_iprintf(buffer, "Resampler samplerate: %u Hz\n", reg);
|
|
+}
|
|
+
|
|
+static void __devinit
|
|
+snd_ad1889_proc_init(struct snd_ad1889 *chip)
|
|
+{
|
|
+ snd_info_entry_t *entry;
|
|
+
|
|
+ if (!snd_card_proc_new(chip->card, chip->card->driver, &entry))
|
|
+ snd_info_set_text_ops(entry, chip, 1024, snd_ad1889_proc_read);
|
|
+}
|
|
+
|
|
+static struct ac97_quirk ac97_quirks[] = {
|
|
+ {
|
|
+ .vendor = 0x11d4, /* AD */
|
|
+ .device = 0x1889, /* AD1889 */
|
|
+ .codec_id = AC97_ID_AD1819,
|
|
+ .name = "AD1889",
|
|
+ .type = AC97_TUNE_HP_ONLY
|
|
+ },
|
|
+ { } /* terminator */
|
|
+};
|
|
+
|
|
+static void __devinit
|
|
+snd_ad1889_ac97_xinit(struct snd_ad1889 *chip)
|
|
+{
|
|
+ u16 reg;
|
|
+
|
|
+ reg = ad1889_readw(chip, AD_AC97_ACIC);
|
|
+ reg |= AD_AC97_ACIC_ACRD; /* Reset Disable */
|
|
+ ad1889_writew(chip, AD_AC97_ACIC, reg);
|
|
+ ad1889_readw(chip, AD_AC97_ACIC); /* flush posted write */
|
|
+ udelay(10);
|
|
+ /* Interface Enable */
|
|
+ reg |= AD_AC97_ACIC_ACIE;
|
|
+ ad1889_writew(chip, AD_AC97_ACIC, reg);
|
|
+
|
|
+ snd_ad1889_ac97_ready(chip);
|
|
+
|
|
+ /* Audio Stream Output | Variable Sample Rate Mode */
|
|
+ reg = ad1889_readw(chip, AD_AC97_ACIC);
|
|
+ reg |= AD_AC97_ACIC_ASOE | AD_AC97_ACIC_VSRM;
|
|
+ ad1889_writew(chip, AD_AC97_ACIC, reg);
|
|
+ ad1889_readw(chip, AD_AC97_ACIC); /* flush posted write */
|
|
+
|
|
+}
|
|
+
|
|
+static void
|
|
+snd_ad1889_ac97_bus_free(ac97_bus_t *bus)
|
|
+{
|
|
+ struct snd_ad1889 *chip = bus->private_data;
|
|
+ chip->ac97_bus = NULL;
|
|
+}
|
|
+
|
|
+static void
|
|
+snd_ad1889_ac97_free(ac97_t *ac97)
|
|
+{
|
|
+ struct snd_ad1889 *chip = ac97->private_data;
|
|
+ chip->ac97 = NULL;
|
|
+}
|
|
+
|
|
+static int __devinit
|
|
+snd_ad1889_ac97_init(struct snd_ad1889 *chip, const char *quirk_override)
|
|
+{
|
|
+ int err;
|
|
+ ac97_template_t ac97;
|
|
+ static ac97_bus_ops_t ops = {
|
|
+ .write = snd_ad1889_ac97_write,
|
|
+ .read = snd_ad1889_ac97_read,
|
|
+ };
|
|
+
|
|
+ /* doing that here, it works. */
|
|
+ snd_ad1889_ac97_xinit(chip);
|
|
+
|
|
+ err = snd_ac97_bus(chip->card, 0, &ops, chip, &chip->ac97_bus);
|
|
+ if (err < 0)
|
|
+ return err;
|
|
+
|
|
+ chip->ac97_bus->private_free = snd_ad1889_ac97_bus_free;
|
|
+
|
|
+ memset(&ac97, 0, sizeof(ac97));
|
|
+ ac97.private_data = chip;
|
|
+ ac97.private_free = snd_ad1889_ac97_free;
|
|
+ ac97.pci = chip->pci;
|
|
+
|
|
+ err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97);
|
|
+ if (err < 0)
|
|
+ return err;
|
|
+
|
|
+ snd_ac97_tune_hardware(chip->ac97, ac97_quirks, quirk_override);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int
|
|
+snd_ad1889_free(struct snd_ad1889 *chip)
|
|
+{
|
|
+ if (chip->irq < 0)
|
|
+ goto skip_hw;
|
|
+
|
|
+ spin_lock_irq(&chip->lock);
|
|
+
|
|
+ ad1889_mute(chip);
|
|
+
|
|
+ /* Turn off interrupt on count and zero DMA registers */
|
|
+ ad1889_channel_reset(chip, AD_CHAN_WAV | AD_CHAN_ADC);
|
|
+
|
|
+ /* clear DISR. If we don't, we'd better jump off the Eiffel Tower */
|
|
+ ad1889_writel(chip, AD_DMA_DISR, AD_DMA_DISR_PTAI | AD_DMA_DISR_PMAI);
|
|
+ ad1889_readl(chip, AD_DMA_DISR); /* flush, dammit! */
|
|
+
|
|
+ spin_unlock_irq(&chip->lock);
|
|
+
|
|
+ synchronize_irq(chip->irq);
|
|
+
|
|
+ if (chip->irq >= 0)
|
|
+ free_irq(chip->irq, (void*)chip);
|
|
+
|
|
+skip_hw:
|
|
+ if (chip->iobase)
|
|
+ iounmap(chip->iobase);
|
|
+
|
|
+#ifdef CONFIG_SND_AD1889_OPL3
|
|
+ if (chip->opl3_iobase)
|
|
+ iounmap(chip->opl3_iobase);
|
|
+#endif
|
|
+
|
|
+ pci_release_regions(chip->pci);
|
|
+ pci_disable_device(chip->pci);
|
|
+
|
|
+ kfree(chip);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static inline int
|
|
+snd_ad1889_dev_free(snd_device_t *device)
|
|
+{
|
|
+ struct snd_ad1889 *chip = device->device_data;
|
|
+ return snd_ad1889_free(chip);
|
|
+}
|
|
+
|
|
+static int __devinit
|
|
+snd_ad1889_init(struct snd_ad1889 *chip)
|
|
+{
|
|
+ ad1889_writew(chip, AD_DS_CCS, AD_DS_CCS_CLKEN); /* turn on clock */
|
|
+ ad1889_readw(chip, AD_DS_CCS); /* flush posted write */
|
|
+
|
|
+ mdelay(10);
|
|
+
|
|
+ /* enable Master and Target abort interrupts */
|
|
+ ad1889_writel(chip, AD_DMA_DISR, AD_DMA_DISR_PMAE | AD_DMA_DISR_PTAE);
|
|
+
|
|
+ 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 *chip;
|
|
+ static snd_device_ops_t ops = {
|
|
+ .dev_free = snd_ad1889_dev_free,
|
|
+ };
|
|
+
|
|
+ *rchip = NULL;
|
|
+
|
|
+ if ((err = pci_enable_device(pci)) < 0)
|
|
+ return err;
|
|
+
|
|
+ /* check PCI availability (32bit DMA) */
|
|
+ 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");
|
|
+ pci_disable_device(pci);
|
|
+ return -ENXIO;
|
|
+ }
|
|
+
|
|
+ /* allocate chip specific data with zero-filled memory */
|
|
+ if ((chip = kcalloc(1, sizeof(*chip), GFP_KERNEL)) == NULL) {
|
|
+ pci_disable_device(pci);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
+
|
|
+ chip->card = card;
|
|
+ card->private_data = chip;
|
|
+ chip->pci = pci;
|
|
+ chip->irq = -1;
|
|
+
|
|
+ /* (1) PCI resource allocation */
|
|
+ if ((err = pci_request_regions(pci, card->driver)) < 0)
|
|
+ goto free_and_ret;
|
|
+
|
|
+ chip->bar = pci_resource_start(pci, 0);
|
|
+ chip->iobase = ioremap_nocache(chip->bar, pci_resource_len(pci, 0));
|
|
+ if (chip->iobase == NULL) {
|
|
+ printk(KERN_ERR PFX "unable to reserve region.\n");
|
|
+ err = -EBUSY;
|
|
+ goto free_and_ret;
|
|
+ }
|
|
+
|
|
+ pci_set_master(pci);
|
|
+
|
|
+ spin_lock_init(&chip->lock); /* only now can we call ad1889_free */
|
|
+
|
|
+#ifdef CONFIG_SND_AD1889_OPL3
|
|
+ chip->opl3_bar = pci_resource_start(pci, 1);
|
|
+ chip->opl3_iobase = ioremap_nocache(chip->opl3_bar,
|
|
+ pci_resource_len(pci, 1));
|
|
+ if (chip->opl3_iobase == NULL) {
|
|
+ printk(KERN_ERR PFX "unable to reserve region.\n");
|
|
+ snd_ad1889_free(chip);
|
|
+ return -EBUSY;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ if (request_irq(pci->irq, snd_ad1889_interrupt,
|
|
+ SA_INTERRUPT|SA_SHIRQ, card->driver, (void*)chip)) {
|
|
+ printk(KERN_ERR PFX "cannot obtain IRQ %d\n", pci->irq);
|
|
+ snd_ad1889_free(chip);
|
|
+ return -EBUSY;
|
|
+ }
|
|
+
|
|
+ chip->irq = pci->irq;
|
|
+ synchronize_irq(chip->irq);
|
|
+
|
|
+ /* (2) initialization of the chip hardware */
|
|
+ if ((err = snd_ad1889_init(chip)) < 0) {
|
|
+ snd_ad1889_free(chip);
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
|
|
+ snd_ad1889_free(chip);
|
|
+ return err;
|
|
+ }
|
|
+
|
|
+ snd_card_set_dev(card, &pci->dev);
|
|
+
|
|
+ *rchip = chip;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+free_and_ret:
|
|
+ if (chip)
|
|
+ kfree(chip);
|
|
+ pci_disable_device(pci);
|
|
+
|
|
+ return err;
|
|
+}
|
|
+
|
|
+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 *chip;
|
|
+
|
|
+ /* (1) */
|
|
+ if (devno >= SNDRV_CARDS)
|
|
+ return -ENODEV;
|
|
+ if (!enable[devno]) {
|
|
+ devno++;
|
|
+ return -ENOENT;
|
|
+ }
|
|
+
|
|
+ /* (2) */
|
|
+ card = snd_card_new(index[devno], id[devno], THIS_MODULE, 0);
|
|
+ /* XXX REVISIT: we can probably allocate chip in this call */
|
|
+ if (card == NULL)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ strcpy(card->driver, "AD1889");
|
|
+ strcpy(card->shortname, "Analog Devices AD1889");
|
|
+
|
|
+ /* (3) */
|
|
+ err = snd_ad1889_create(card, pci, &chip);
|
|
+ if (err < 0)
|
|
+ goto free_and_ret;
|
|
+
|
|
+ /* (4) */
|
|
+ sprintf(card->longname, "%s at 0x%lx irq %i",
|
|
+ card->shortname, chip->bar, chip->irq);
|
|
+
|
|
+ /* (5) */
|
|
+ /* register AC97 mixer */
|
|
+ err = snd_ad1889_ac97_init(chip, ac97_quirk[devno]);
|
|
+ if (err < 0)
|
|
+ goto free_and_ret;
|
|
+
|
|
+#ifdef CONFIG_SND_AD1889_OPL3
|
|
+ err = snd_opl3_create_mapped(card, chip->opl3_iobase,
|
|
+ chip->opl3_iobase + 2, OPL3_HW_OPL3,
|
|
+ &chip->opl3);
|
|
+ if (err) {
|
|
+ printk(KERN_ERR PFX "failed to create opl3\n");
|
|
+ goto free_and_ret;
|
|
+ }
|
|
+
|
|
+ err = snd_opl3_hwdep_new(chip->opl3, 0, 0, &chip->opl3hwdep);
|
|
+ if (err) {
|
|
+ printk(KERN_ERR PFX "failed to create opl3hwdep\n");
|
|
+ goto free_and_ret;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ err = snd_ad1889_pcm_init(chip, 0, NULL);
|
|
+ if (err < 0)
|
|
+ goto free_and_ret;
|
|
+
|
|
+ /* register proc interface */
|
|
+ snd_ad1889_proc_init(chip);
|
|
+
|
|
+ /* (6) */
|
|
+ err = snd_card_register(card);
|
|
+ if (err < 0)
|
|
+ goto free_and_ret;
|
|
+
|
|
+ /* (7) */
|
|
+ pci_set_drvdata(pci, card);
|
|
+
|
|
+ devno++;
|
|
+ return 0;
|
|
+
|
|
+free_and_ret:
|
|
+ snd_card_free(card);
|
|
+ return err;
|
|
+}
|
|
+
|
|
+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) },
|
|
+ { 0, },
|
|
+};
|
|
+MODULE_DEVICE_TABLE(pci, snd_ad1889_ids);
|
|
+
|
|
+static struct pci_driver ad1889_pci = {
|
|
+ .name = "AD1889 Audio",
|
|
+ .id_table = snd_ad1889_ids,
|
|
+ .probe = snd_ad1889_probe,
|
|
+ .remove = __devexit_p(snd_ad1889_remove),
|
|
+};
|
|
+
|
|
+static int __init
|
|
+alsa_ad1889_init(void)
|
|
+{
|
|
+ return pci_register_driver(&ad1889_pci);
|
|
+}
|
|
+
|
|
+static void __exit
|
|
+alsa_ad1889_fini(void)
|
|
+{
|
|
+ pci_unregister_driver(&ad1889_pci);
|
|
+}
|
|
+
|
|
+module_init(alsa_ad1889_init);
|
|
+module_exit(alsa_ad1889_fini);
|
|
Index: linux-2.6-2.6.12/sound/pci/ad1889.h
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ linux-2.6-2.6.12/sound/pci/ad1889.h 2005-08-09 17:53:36.000000000 -0400
|
|
@@ -0,0 +1,187 @@
|
|
+/* 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_RESBA 0x40 /* RES base address */
|
|
+#define AD_DMA_RESCA 0x44 /* RES current address */
|
|
+#define AD_DMA_RESBC 0x48 /* RES base count */
|
|
+#define AD_DMA_RESCC 0x4c /* RES current count */
|
|
+
|
|
+#define AD_DMA_ADCBA 0x50 /* ADC base address */
|
|
+#define AD_DMA_ADCCA 0x54 /* ADC current address */
|
|
+#define AD_DMA_ADCBC 0x58 /* ADC base count */
|
|
+#define AD_DMA_ADCCC 0x5c /* ADC current count */
|
|
+
|
|
+#define AD_DMA_SYNBA 0x60 /* synth base address */
|
|
+#define AD_DMA_SYNCA 0x64 /* synth current address */
|
|
+#define AD_DMA_SYNBC 0x68 /* synth base count */
|
|
+#define AD_DMA_SYNCC 0x6c /* synth current count */
|
|
+
|
|
+#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_RESIC 0x80 /* RES dma interrupt current byte count */
|
|
+#define AD_DMA_RESIB 0x84 /* RES dma interrupt base byte count */
|
|
+
|
|
+#define AD_DMA_ADCIC 0x88 /* ADC dma interrupt current byte count */
|
|
+#define AD_DMA_ADCIB 0x8c /* ADC dma interrupt base byte count */
|
|
+
|
|
+#define AD_DMA_SYNIC 0x90 /* synth dma interrupt current byte count */
|
|
+#define AD_DMA_SYNIB 0x94 /* synth dma interrupt base byte count */
|
|
+
|
|
+#define AD_DMA_WAVIC 0x98 /* wave dma interrupt current byte count */
|
|
+#define AD_DMA_WAVIB 0x9c /* wave dma interrupt base byte count */
|
|
+
|
|
+#define AD_DMA_ICC 0xffffff /* current byte count mask */
|
|
+#define AD_DMA_IBC 0xffffff /* base byte count mask */
|
|
+/* bits 24 -> 31 reserved */
|
|
+
|
|
+/* 4 bytes pad */
|
|
+#define AD_DMA_ADC 0xa8 /* ADC dma control and status */
|
|
+#define AD_DMA_SYNTH 0xb0 /* Synth dma control and status */
|
|
+#define AD_DMA_WAV 0xb8 /* wave dma control and status */
|
|
+#define AD_DMA_RES 0xa0 /* Resample dma control and status */
|
|
+
|
|
+#define AD_DMA_SGDE 0x0001 /* SGD mode enable */
|
|
+#define AD_DMA_LOOP 0x0002 /* loop enable */
|
|
+#define AD_DMA_IM 0x000c /* interrupt mode mask */
|
|
+#define AD_DMA_IM_DIS (~AD_DMA_IM) /* disable */
|
|
+#define AD_DMA_IM_CNT 0x0004 /* interrupt on count */
|
|
+#define AD_DMA_IM_SGD 0x0008 /* interrupt on SGD flag */
|
|
+#define AD_DMA_IM_EOL 0x000c /* interrupt on End of Linked List */
|
|
+#define AD_DMA_SGDS 0x0030 /* SGD status */
|
|
+#define AD_DMA_SFLG 0x0040 /* SGD flag */
|
|
+#define AD_DMA_EOL 0x0080 /* SGD end of list */
|
|
+/* bits 8 -> 15 reserved */
|
|
+
|
|
+#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| \
|
|
+ AD_DMA_DISR_PMAI|AD_DMA_DISR_PTAI)
|
|
+
|
|
+#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_GPIO_IPC 0xc8 /* gpio port control */
|
|
+#define AD_GPIO_OP 0xca /* gpio output port status */
|
|
+#define AD_GPIO_IP 0xcc /* gpio input port status */
|
|
+
|
|
+#define AD_AC97_BASE 0x100 /* ac97 base register */
|
|
+
|
|
+#define AD_AC97_RESET 0x100 /* reset */
|
|
+
|
|
+#define AD_AC97_PWR_CTL 0x126 /* == AC97_POWERDOWN */
|
|
+#define AD_AC97_PWR_ADC 0x0001 /* ADC ready status */
|
|
+#define AD_AC97_PWR_DAC 0x0002 /* DAC ready status */
|
|
+#define AD_AC97_PWR_PR0 0x0100 /* PR0 (ADC) powerdown */
|
|
+#define AD_AC97_PWR_PR1 0x0200 /* PR1 (DAC) powerdown */
|
|
+
|
|
+#define AD_MISC_CTL 0x176 /* misc control */
|
|
+#define AD_MISC_CTL_DACZ 0x8000 /* set for zero fill, unset for repeat */
|
|
+#define AD_MISC_CTL_ARSR 0x0001 /* set for SR1, unset for SR0 */
|
|
+#define AD_MISC_CTL_ALSR 0x0100
|
|
+#define AD_MISC_CTL_DLSR 0x0400
|
|
+#define AD_MISC_CTL_DRSR 0x0004
|
|
+
|
|
+#define AD_AC97_SR0 0x178 /* sample rate 0, 0xbb80 == 48K */
|
|
+#define AD_AC97_SR0_48K 0xbb80 /* 48KHz */
|
|
+#define AD_AC97_SR1 0x17a /* sample rate 1 */
|
|
+
|
|
+#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_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
|
|
+
|
|
+/* "<ggg> T-Bone: parisc IOMMU can start DMA at any address.
|
|
+ But the IOMMU can only map at page size granularity."
|
|
+ This affects in particular .period_bytes_min */
|
|
+#define BUF_SIZE PAGE_SIZE
|
|
+#define MAX_BUFS 32
|
|
+#define DMA_SIZE (MAX_BUFS*BUF_SIZE)
|
|
+
|
|
+#define AD_CHAN_WAV 0x0001
|
|
+#define AD_CHAN_ADC 0x0002
|
|
+#define AD_CHAN_RES 0x0004
|
|
+#define AD_CHAN_SYN 0x0008
|
|
+
|
|
+#endif /* __AD1889_H__ */
|