diff -u --recursive --new-file v2.4.13/linux/Documentation/Configure.help linux/Documentation/Configure.help --- v2.4.13/linux/Documentation/Configure.help Tue Oct 23 22:48:49 2001 +++ linux/Documentation/Configure.help Tue Oct 30 15:08:12 2001 @@ -1412,6 +1412,12 @@ have a high-level driver for the type of device that you want to support. +Shuttle EPAT c7/c8 extension +CONFIG_PARIDE_EPATC8 + This option enables support for the newer Shuttle EP1284 (aka c7 and + c8) chip. You need this if you are using any recent Imation SuperDisk + (LS-120) drive. + Shuttle EPIA protocol CONFIG_PARIDE_EPIA This option enables support for the (obsolete) EPIA parallel port @@ -1934,6 +1940,20 @@ If you want to compile it as a module, say M here and read Documentation/modules.txt. If unsure, say `N'. +IRC Send/Chat support +CONFIG_IP_NF_IRC + There is a commonly-used extension to IRC called + Direct Client-to-Client Protocol (DCC). This enables users to send + files to each other, and also chat to each other without the need + of a server. DCC Sending is used anywhere you send files over IRC, + and DCC Chat is most commonly used by Eggdrop bots. If you are + using NAT, this extension will enable you to send files and initiate + chats. Note that you do NOT need this extension to get files or + have others initiate chats, or everything else in IRC. + + If you want to compile it as a module, say 'M' here and read + Documentation/modules.txt. If unsure, say 'N'. + FTP protocol support CONFIG_IP_NF_FTP Tracking FTP connections is problematic: special helpers are @@ -1960,6 +1980,40 @@ If you want to compile it as a module, say M here and read Documentation/modules.txt. If unsure, say `N'. +CONFIG_IP6_NF_MATCH_LIMIT + limit matching allows you to control the rate at which a rule can be + matched: mainly useful in combination with the LOG target ("LOG + target support", below) and to avoid some Denial of Service attacks. + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + +MAC address match support +CONFIG_IP6_NF_MATCH_MAC + mac matching allows you to match packets based on the source + ethernet address of the packet. + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + +Multiple port match support +CONFIG_IP6_NF_MATCH_MULTIPORT + Multiport matching allows you to match TCP or UDP packets based on + a series of source or destination ports: normally a rule can only + match a single range of ports. + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + +Owner match support (EXPERIMENTAL) +CONFIG_IP6_NF_MATCH_OWNER + Packet owner matching allows you to match locally-generated packets + based on who created them: the user, group, process or session. + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + + limit match support CONFIG_IP_NF_MATCH_LIMIT @@ -1996,6 +2050,22 @@ If you want to compile it as a module, say M here and read Documentation/modules.txt. If unsure, say `N'. +TTL match support +CONFIG_IP_NF_MATCH_TTL + This adds CONFIG_IP_NF_MATCH_TTL option, which enabled the user + to match packets by their TTL value. + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + +length match support +CONFIG_IP_NF_MATCH_LENGTH + This option allows you to match the length of a packet against a + specific value or range of values. + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + TOS match support CONFIG_IP_NF_MATCH_TOS TOS matching allows you to match packets based on the Type Of @@ -2075,6 +2145,20 @@ If you want to compile it as a module, say M here and read Documentation/modules.txt. If unsure, say `N'. +Basic SNMP-ALG support +CONFIG_IP_NF_NAT_SNMP_BASIC + + This module implements an Application Layer Gateway (ALG) for + SNMP payloads. In conjunction with NAT, it allows a network + management system to access multiple private networks with + conflicting addresses. It works by modifying IP addresses + inside SNMP payloads to match IP-layer NAT mapping. + + This is the "basic" form of SNMP-ALG, as described in RFC 2962 + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + REDIRECT target support CONFIG_IP_NF_TARGET_REDIRECT REDIRECT is a special case of NAT: all incoming connections are @@ -2211,6 +2295,14 @@ Netfilter mark matching allows you to match packets based on the `nfmark' value in the packet. This can be set by the MARK target (see below). + + If you want to compile it as a module, say M here and read + Documentation/modules.txt. If unsure, say `N'. + +LOG target support +CONFIG_IP6_NF_TARGET_LOG + This option adds a `LOG' target, which allows you to create rules in + any ip6tables table which records the packet header to the syslog. If you want to compile it as a module, say M here and read Documentation/modules.txt. If unsure, say `N'. diff -u --recursive --new-file v2.4.13/linux/Documentation/DocBook/Makefile linux/Documentation/DocBook/Makefile --- v2.4.13/linux/Documentation/DocBook/Makefile Tue Oct 9 17:06:51 2001 +++ linux/Documentation/DocBook/Makefile Thu Oct 25 00:07:40 2001 @@ -8,7 +8,7 @@ HTML := $(patsubst %.sgml, %, $(BOOKS)) IMG-parportbook := parport-share.fig parport-multi.fig parport-structure.fig EPS-parportbook := $(patsubst %.fig, %.eps, $(IMG-parportbook)) -JPG-parportbook := $(patsubst %.fig, %.jpeg, $(IMG-parportbook)) +PNG-parportbook := $(patsubst %.fig, %.png, $(IMG-parportbook)) C-procfs-example = procfs_example.sgml books: $(BOOKS) @@ -26,8 +26,8 @@ %.eps: %.fig fig2dev -Leps $< $@ -%.jpeg: %.fig - fig2dev -Ljpeg $< $@ +%.png: %.fig + fig2dev -Lpng $< $@ %.sgml: %.c echo "" > $@ @@ -129,8 +129,8 @@ $(TOPDIR)/scripts/kernel-doc -man $^ | \ $(PERL) $(TOPDIR)/scripts/split-man $(TOPDIR)/Documentation/man -parportbook: $(JPG-parportbook) -parportbook.ps parportbook.pdf: $(EPS-parportbook) +parportbook parportbook.pdf: $(PNG-parportbook) +parportbook.ps: $(EPS-parportbook) parportbook.sgml: parportbook.tmpl $(TOPDIR)/drivers/parport/init.c $(TOPDIR)/scripts/docgen $(TOPDIR)/drivers/parport/init.c <$< >$@ diff -u --recursive --new-file v2.4.13/linux/Documentation/DocBook/parportbook.tmpl linux/Documentation/DocBook/parportbook.tmpl --- v2.4.13/linux/Documentation/DocBook/parportbook.tmpl Sun Sep 23 11:40:54 2001 +++ linux/Documentation/DocBook/parportbook.tmpl Thu Oct 25 00:07:40 2001 @@ -1,5 +1,5 @@ - + @@ -184,10 +184,10 @@ - + - + @@ -270,10 +270,10 @@ - + - + @@ -461,10 +461,10 @@ - + - + diff -u --recursive --new-file v2.4.13/linux/Documentation/arm/SA1100/Assabet linux/Documentation/arm/SA1100/Assabet --- v2.4.13/linux/Documentation/arm/SA1100/Assabet Tue Oct 9 17:06:51 2001 +++ linux/Documentation/arm/SA1100/Assabet Thu Oct 25 13:53:44 2001 @@ -245,32 +245,58 @@ June 12, 2001 -Status of peripherals in -rmk tree ----------------------------------- +Status of peripherals in -rmk tree (updated 14/10/2001) +------------------------------------------------------- Assabet: Serial ports: - Radio: TX, RX, CTS, DSR, DCD, RI - COM: TX, RX, CTS, DSR, DCD, RTS, DTR, PM - I2C: TX, RX - L3: No + Radio: TX, RX, CTS, DSR, DCD, RI + PM: Not tested. + COM: TX, RX, CTS, DSR, DCD, RTS, DTR, PM + PM: Not tested. + I2C: Implemented, not fully tested. + L3: Fully tested, pass. + PM: Not tested. Video: - LCD: PM - Video out: Not fully - Touchscreen: No + LCD: Fully tested. PM + (LCD doesn't like being blanked with + neponset connected) + Video out: Not fully Audio: - Codec: No - POTS: No + UDA1341: + Playback: Fully tested, pass. + Record: Implemented, not tested. + PM: Not tested. + + UCB1200: + Audio play: Implemented, not heavily tested. + Audio rec: Implemented, not heavily tested. + Telco audio play: Implemented, not heavily tested. + Telco audio rec: Implemented, not heavily tested. + POTS control: No + Touchscreen: Yes + PM: Not tested. Other: - PCMCIA: Yes - USB: No + PCMCIA: + LPE: Fully tested, pass. + USB: No + IRDA: + SIR: Fully tested, pass. + FIR: Fully tested, pass. + PM: Not tested. Neponset: Serial ports: COM1,2: TX, RX, CTS, DSR, DCD, RTS, DTR + PM: Not tested. + USB: Implemented, not heavily tested. + PCMCIA: Implemented, not heavily tested. + PM: Not tested. + CF: Implemented, not heavily tested. + PM: Not tested. More stuff can be found in the -np (Nicolas Pitre's) tree. diff -u --recursive --new-file v2.4.13/linux/Documentation/computone.txt linux/Documentation/computone.txt --- v2.4.13/linux/Documentation/computone.txt Fri Jul 28 12:50:51 2000 +++ linux/Documentation/computone.txt Wed Oct 24 12:05:18 2001 @@ -4,16 +4,15 @@ Release Notes For Linux Kernel 2.2 and higher. These notes are for the drivers which have already been integrated into the -kernel and have been tested on Linux kernels 2.0, 2.2, and 2.3. +kernel and have been tested on Linux kernels 2.0, 2.2, 2.3, and 2.4. -Version: 1.2.9 -Date: 04/12/2000 -Author: Andrew Manison +Version: 1.2.12 +Date: 10/24/2001 +Historical Author: Andrew Manison +Primary Author: Doug McNash Testing: larryg@computone.com Support: support@computone.com -Fixes and Updates: Doug McNash -Proc Filesystem and Kernel Integration: Mike Warfield - +Fixes and Updates: Mike Warfield This file assumes that you are using the Computone drivers which are integrated into the kernel sources. For updating the drivers or installing @@ -42,7 +41,7 @@ before or after drivers installation. Note the hardware address from the Computone ISA cards installed into - the system. These are required for editing ip2.h or editing + the system. These are required for editing ip2.c or editing /etc/modules.conf, or for specification on the modprobe command line. @@ -58,7 +57,7 @@ Select (m) module for CONFIG_COMPUTONE under character devices. CONFIG_PCI and CONFIG_MODULES also may need to be set. c) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h if needed + edit /usr/src/linux/drivers/char/ip2.c if needed or edit /etc/modules.conf if needed (module). or both to match this setting. @@ -77,7 +76,8 @@ Select (y) kernel for CONFIG_COMPUTONE under character devices. CONFIG_PCI may need to be set if you have PCI bus. c) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h + edit /usr/src/linux/drivers/char/ip2.c + (Optional - may be specified on kernel command line now) d) Run "make dep" e) Run "make zImage" or whatever target you prefer. f) mv /usr/src/linux/arch/i386/boot/zImage to /boot. @@ -86,6 +86,41 @@ h) Reboot using this kernel i) run ip2mkdev (either the script below or the binary version) +Kernel command line options: + +When compiling the driver into the kernel, io and irq may be +compiled into the driver by editing ip2.c and setting the values for +io and irq in the appropriate array. An alternative is to specify +a command line parameter to the kernel at boot up. + + ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3 + +Note that this order is very different from the specifications for the +modload parameters which have separate IRQ and IO specifiers. + +The io port also selects PCI (1) and EISA (2) boards. + + io=0 No board + io=1 PCI board + io=2 EISA board + else ISA board io address + +You only need to specify the boards which are present. + + Examples: + + 2 PCI boards: + + ip2=1,0,1,0 + + 1 ISA board at 0x310 irq 5: + + ip2=0x310,5 + +This can be added to and "append" option in lilo.conf similar to this: + + append="ip2=1,0,1,0" + 3. INSTALLATION @@ -100,7 +135,7 @@ The driver can be installed as a module (recommended) or built into the kernel. This is selected as for other drivers through the `make config` command from the root of the Linux source tree. If the driver is built -into the kernel you will need to edit the file ip2.h to match the boards +into the kernel you will need to edit the file ip2.c to match the boards you are installing. See that file for instructions. If the driver is installed as a module the configuration can also be specified on the modprobe command line as follows: @@ -109,13 +144,13 @@ where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11, 12,15) and addr1-4 are the base addresses for up to four controllers. If -the irqs are not specified the driver uses the default in ip2/ip2.h (which +the irqs are not specified the driver uses the default in ip2.c (which selects polled mode). If no base addresses are specified the defaults in -ip2.h are used. If you are autoloading the driver module with kerneld or -kmod the base addresses and interrupt number must also be set in ip2/ip2.h +ip2.c are used. If you are autoloading the driver module with kerneld or +kmod the base addresses and interrupt number must also be set in ip2.c and recompile or just insert and options line in /etc/modules.conf or both. The options line is equivalent to the command line and takes precidence over -what is in ip2.h. +what is in ip2.c. /etc/modules.conf sample: options ip2 io=1,0x328 irq=1,10 @@ -123,22 +158,18 @@ alias char-major-72 ip2 alias char-major-73 ip2 -equivelant ip2.h: -static ip2config_t ip2config = -{ - {1,10,0,0}, - { - 0x0001, // Board 0, ttyF0 - ttyF63 /* PCI card */ - 0x0328, // Board 1, ttyF64 - ttyF127 /* ISA card */ - 0x0000, // Board 2, ttyF128 - ttyF191 /* empty */ - 0x0000 // Board 3, ttyF192 - ttyF255 /* empty */ - } -}; +The equivalent in ip2.c: + +static int io[IP2_MAX_BOARDS]= { 1, 0x328, 0, 0 }; +static int irq[IP2_MAX_BOARDS] = { 1, 10, -1, -1 }; + +The equivalent for the kernel command line (in lilo.conf): + + append="ip2=1,1,0x328,10" Note: Both io and irq should be updated to reflect YOUR system. An "io" - address of "1/2" indicates a PCI/EISA card in the board table. The - PCI or EISA irq will be assigned automatically. + address of 1 or 2 indicates a PCI or EISA card in the board table. The PCI or EISA irq will be assigned automatically. Specifying an invalid or in-use irq will default the driver into running in polled mode for that card. If all irq entries are 0 then diff -u --recursive --new-file v2.4.13/linux/Documentation/filesystems/vfat.txt linux/Documentation/filesystems/vfat.txt --- v2.4.13/linux/Documentation/filesystems/vfat.txt Wed Apr 11 19:02:27 2001 +++ linux/Documentation/filesystems/vfat.txt Thu Oct 25 13:53:44 2001 @@ -48,8 +48,15 @@ r: relaxed, case insensitive n: normal, default setting, currently case insensitive -nocase -- Returning with having the 8.3 format alias kept in - the disk. Default, return lowercase letter. +shortname=lower|win95|winnt|mixed + -- Shortname display/create setting. + lower: convert to lowercase for display, + emulate the Windows 95 rule for create. + win95: emulate the Windows 95 rule for display/create. + winnt: emulate the Windows NT rule for display/create. + mixed: emulate the Windows NT rule for display, + emulate the Windows 95 rule for create. + Default setting is `lower'. : 0,1,yes,no,true,false diff -u --recursive --new-file v2.4.13/linux/Documentation/networking/8139too.txt linux/Documentation/networking/8139too.txt --- v2.4.13/linux/Documentation/networking/8139too.txt Tue Oct 23 22:48:49 2001 +++ linux/Documentation/networking/8139too.txt Thu Oct 25 14:01:51 2001 @@ -17,9 +17,6 @@ Disclaimer ---------- -THIS DRIVER IS A DEVELOPMENT RELEASE FOR A DEVELOPMENT KERNEL. DO NOT -USE IN A PRODUCTION ENVIRONMENT. - DO NOT CONTACT DONALD BECKER FOR SUPPORT OF THIS DRIVER, his driver is completely different and maintained independently of the 8139too code base. @@ -95,6 +92,7 @@ Tested Adapters --------------- AOpen ALN-325C +AT-2500TX 10/100 PCI Fast Ethernet Network Adapter Card KTI KF-230TX KTI KF-230TX/2 Lantech FastNet TX diff -u --recursive --new-file v2.4.13/linux/MAINTAINERS linux/MAINTAINERS --- v2.4.13/linux/MAINTAINERS Tue Oct 23 22:48:49 2001 +++ linux/MAINTAINERS Thu Oct 25 14:05:51 2001 @@ -93,7 +93,12 @@ L: linux-hams@vger.kernel.org S: Maintained -8139TOO ETHERNET DRIVER +8139CP 10/100 FAST ETHERNET DRIVER +P: Jeff Garzik +M: jgarzik@mandrakesoft.com +S: Maintained + +8139TOO 10/100 FAST ETHERNET DRIVER P: Jeff Garzik M: jgarzik@mandrakesoft.com W: http://sourceforge.net/projects/gkernel/ @@ -296,9 +301,7 @@ S: Supported COMPUTONE INTELLIPORT MULTIPORT CARD -P: Doug McNash P: Michael H. Warfield -M: Doug McNash M: Michael H. Warfield W: http://www.computone.com/ W: http://www.wittsend.com/computone.html @@ -640,6 +643,13 @@ P: Riley H. Williams M: rhw@memalpha.cx L: Linux-Kernel@vger.kernel.org +S: Maintained + +i386 SETUP CODE / CPU ERRATA WORKAROUNDS +P: Dave Jones +M: davej@suse.de +P: H. Peter Anvin +M: hpa@zytor.com S: Maintained i810 TCO TIMER WATCHDOG diff -u --recursive --new-file v2.4.13/linux/Makefile linux/Makefile --- v2.4.13/linux/Makefile Tue Oct 23 22:48:49 2001 +++ linux/Makefile Wed Oct 31 16:27:38 2001 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 4 -SUBLEVEL = 13 -EXTRAVERSION = +SUBLEVEL = 14 +EXTRAVERSION =-pre7 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) diff -u --recursive --new-file v2.4.13/linux/arch/alpha/kernel/osf_sys.c linux/arch/alpha/kernel/osf_sys.c --- v2.4.13/linux/arch/alpha/kernel/osf_sys.c Mon Aug 27 12:41:37 2001 +++ linux/arch/alpha/kernel/osf_sys.c Thu Oct 25 14:00:32 2001 @@ -1320,3 +1320,62 @@ return ret; } + +/* Get an address range which is currently unmapped. Similar to the + generic version except that we know how to honor ADDR_LIMIT_32BIT. */ + +static unsigned long +arch_get_unmapped_area_1(unsigned long addr, unsigned long len, + unsigned long limit) +{ + struct vm_area_struct *vma = find_vma(current->mm, addr); + + while (1) { + /* At this point: (!vma || addr < vma->vm_end). */ + if (limit - len < addr) + return -ENOMEM; + if (!vma || addr + len <= vma->vm_start) + return addr; + addr = vma->vm_end; + vma = vma->vm_next; + } +} + +unsigned long +arch_get_unmapped_area(struct file *filp, unsigned long addr, + unsigned long len, unsigned long pgoff, + unsigned long flags) +{ + unsigned long limit; + + /* "32 bit" actually means 31 bit, since pointers sign extend. */ + if (current->personality & ADDR_LIMIT_32BIT) + limit = 0x80000000; + else + limit = TASK_SIZE; + + if (len > limit) + return -ENOMEM; + + /* First, see if the given suggestion fits. */ + if (addr) { + struct vm_area_struct *vma; + + addr = PAGE_ALIGN(addr); + vma = find_vma(current->mm, addr); + if (limit - len >= addr && + (!vma || addr + len <= vma->vm_start)) + return addr; + } + + /* Next, try allocating at TASK_UNMAPPED_BASE. */ + addr = arch_get_unmapped_area_1 (PAGE_ALIGN(TASK_UNMAPPED_BASE), + len, limit); + if (addr != -ENOMEM) + return addr; + + /* Finally, try allocating in low memory. */ + addr = arch_get_unmapped_area_1 (PAGE_SIZE, len, limit); + + return addr; +} diff -u --recursive --new-file v2.4.13/linux/arch/arm/config.in linux/arch/arm/config.in --- v2.4.13/linux/arch/arm/config.in Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/config.in Thu Oct 25 13:53:44 2001 @@ -39,6 +39,7 @@ CLPS711x/EP721x-based CONFIG_ARCH_CLPS711X \ Co-EBSA285 CONFIG_ARCH_CO285 \ EBSA-110 CONFIG_ARCH_EBSA110 \ + Epxa10db CONFIG_ARCH_CAMELOT \ FootBridge CONFIG_ARCH_FOOTBRIDGE \ Integrator CONFIG_ARCH_INTEGRATOR \ LinkUp-L7200 CONFIG_ARCH_L7200 \ @@ -73,7 +74,16 @@ dep_bool ' Brutus' CONFIG_SA1100_BRUTUS $CONFIG_ARCH_SA1100 dep_bool ' CerfBoard' CONFIG_SA1100_CERF $CONFIG_ARCH_SA1100 if [ "$CONFIG_SA1100_CERF" = "y" ]; then - bool ' 32MB Cerf support' CONFIG_SA1100_CERF_32MB + choice 'Cerf RAM available' \ + "8MB CONFIG_SA1100_CERF_8MB \ + 16MB CONFIG_SA1100_CERF_16MB \ + 32MB CONFIG_SA1100_CERF_32MB \ + 64MB CONFIG_SA1100_CERF_64MB" CerfRam + choice 'Cerf Flash available' \ + "8MB CONFIG_SA1100_CERF_FLASH_8MB \ + 16MB CONFIG_SA1100_CERF_FLASH_16MB \ + 32MB CONFIG_SA1100_CERF_FLASH_32MB" CerfFlash + bool 'Cerf w/CPLD support (CerfPDA)' CONFIG_SA1100_CERF_CPLD fi dep_bool ' Compaq iPAQ H3600' CONFIG_SA1100_H3600 $CONFIG_ARCH_SA1100 #dep_bool ' Empeg' CONFIG_SA1100_EMPEG $CONFIG_ARCH_SA1100 @@ -194,7 +204,8 @@ "$CONFIG_ARCH_TBOX" = "y" -o "$CONFIG_ARCH_SHARK" = "y" -o \ "$CONFIG_ARCH_NEXUSPCI" = "y" -o "$CONFIG_ARCH_CLPS711X" = "y" -o \ "$CONFIG_ARCH_INTEGRATOR" = "y" -o "$CONFIG_ARCH_SA1100" = "y" -o \ - "$CONFIG_ARCH_L7200" = "y" -o "$CONFIG_ARCH_ANAKIN" = "y" ]; then + "$CONFIG_ARCH_L7200" = "y" -o "$CONFIG_ARCH_ANAKIN" = "y" -o \ + "$CONFIG_ARCH_CAMELOT" = "y" ]; then define_bool CONFIG_CPU_32v4 y else define_bool CONFIG_CPU_32v4 n @@ -369,6 +380,7 @@ "$CONFIG_ARCH_CATS" = "y" -o \ "$CONFIG_ARCH_P720T" = "y" -o \ "$CONFIG_ARCH_CDB89712" = "y" -o \ + "$CONFIG_ARCH_CAMELOT" = "y" -o \ "$CONFIG_ARCH_ANAKIN" = "y" ]; then string 'Default kernel command string' CONFIG_CMDLINE "" fi @@ -562,7 +574,9 @@ bool 'Verbose kernel error messages' CONFIG_DEBUG_ERRORS bool 'Verbose user fault messages' CONFIG_DEBUG_USER bool 'Include debugging information in kernel binary' CONFIG_DEBUG_INFO +bool 'Debug memory allocations' CONFIG_DEBUG_SLAB bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ +bool 'Spinlock debugging' CONFIG_DEBUG_SPINLOCK dep_bool 'Disable pgtable cache' CONFIG_NO_PGT_CACHE $CONFIG_CPU_26 # These options are only for real kernel hackers who want to get their hands dirty. dep_bool 'Kernel low-level debugging functions' CONFIG_DEBUG_LL $CONFIG_EXPERIMENTAL diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/adsbitsy linux/arch/arm/def-configs/adsbitsy --- v2.4.13/linux/arch/arm/def-configs/adsbitsy Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/adsbitsy Thu Oct 25 13:53:44 2001 @@ -0,0 +1,674 @@ +# +# Automatically generated by make menuconfig: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# System Type +# +# CONFIG_ARCH_ANAKIN is not set +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_RPC is not set +CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_SHARK is not set + +# +# Archimedes/A5000 Implementations +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# +# Footbridge Implementations +# +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_BRUTUS is not set +# CONFIG_SA1100_CERF is not set +# CONFIG_SA1100_BITSY is not set +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set +# CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_XP860 is not set +# CONFIG_SA1100_YOPY is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +CONFIG_SA1100_ADSBITSY=y +CONFIG_SA1111=y +# CONFIG_SA1100_USB is not set +# CONFIG_SA1100_USB_NETLINK is not set +# CONFIG_SA1100_USB_CHAR is not set + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_ACORN is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +CONFIG_CPU_SA1100=y +CONFIG_DISCONTIGMEM=y +# CONFIG_CPU_BIG_ENDIAN is not set + +# +# General setup +# +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +# CONFIG_CPU_FREQ is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=y +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +# CONFIG_PCMCIA_CLPS6700 is not set +CONFIG_PCMCIA_SA1100=y +CONFIG_NET=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_APM is not set +# CONFIG_ARTHUR is not set +CONFIG_CMDLINE="ip=off" +# CONFIG_PFS168_CMDLINE is not set +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK is not set +# CONFIG_NETFILTER is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_FMVJ18X is not set +CONFIG_PCMCIA_PCNET=y +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_ARCNET_COM20020_CS is not set +# CONFIG_PCMCIA_IBMTR is not set +# CONFIG_NET_PCMCIA_RADIO is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set +# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set +# CONFIG_BLK_DEV_IDEDISK_IBM is not set +# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set +# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set +# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set +# CONFIG_BLK_DEV_IDEDISK_WD is not set +# CONFIG_BLK_DEV_COMMERIAL is not set +# CONFIG_BLK_DEV_TIVO is not set +CONFIG_BLK_DEV_IDECS=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_IDE_CHIPSETS is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_IDE_MODES is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +CONFIG_INPUT=y +# CONFIG_INPUT_KEYBDEV is not set +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +CONFIG_VT=y +# CONFIG_VT_CONSOLE is not set +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +CONFIG_SERIAL_SA1100=y +CONFIG_SERIAL_SA1100_CONSOLE=y +CONFIG_SA1100_DEFAULT_BAUDRATE=38400 +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +CONFIG_UCB1200=y +CONFIG_TOUCHSCREEN_UCB1200=y +CONFIG_AUDIO_UCB1200=y +CONFIG_ADC_UCB1200=y +# CONFIG_TOUCHSCREEN_BITSY is not set +# CONFIG_PROFILER is not set +# CONFIG_PFS168_SPI is not set +# CONFIG_PFS168_DTMF is not set +# CONFIG_PFS168_MISC is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_JOYSTICK is not set +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_SA1100_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set +CONFIG_CRAMFS=y +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Console drivers +# +CONFIG_PC_KEYMAP=y +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +CONFIG_FB=y +CONFIG_DUMMY_CONSOLE=y +# CONFIG_FB_ACORN is not set +# CONFIG_FB_CLPS711X is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_SA1100=y +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_E1355 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FBCON_ADVANCED is not set +CONFIG_FBCON_CFB2=y +CONFIG_FBCON_CFB4=y +CONFIG_FBCON_CFB8=y +CONFIG_FBCON_CFB16=y +CONFIG_FBCON_FONTWIDTH8_ONLY=y +CONFIG_FBCON_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x16=y +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +CONFIG_USB_OHCI=y +CONFIG_USB_OHCI_NOPCI=y +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_HID is not set +# CONFIG_USB_KBD is not set +CONFIG_USB_MOUSE=y +# CONFIG_USB_WACOM is not set +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_IBMCAM is not set +# CONFIG_USB_OV511 is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_SE401 is not set +# CONFIG_USB_DSBR is not set +# CONFIG_USB_DABUSB is not set +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_NET1080 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_RIO500 is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +# CONFIG_NO_FRAME_POINTER is not set +CONFIG_DEBUG_ERRORS=y +# CONFIG_DEBUG_USER is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_NO_PGT_CACHE is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/assabet linux/arch/arm/def-configs/assabet --- v2.4.13/linux/arch/arm/def-configs/assabet Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/assabet Thu Oct 25 13:53:44 2001 @@ -8,6 +8,8 @@ CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_GENERIC_BUST_SPINLOCK is not set +# CONFIG_GENERIC_ISA_DMA is not set # # Code maturity level options @@ -31,6 +33,7 @@ # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_L7200 is not set @@ -62,13 +65,15 @@ # CONFIG_SA1100_ASSABET=y # CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set # CONFIG_SA1100_BRUTUS is not set # CONFIG_SA1100_CERF is not set -# CONFIG_SA1100_BITSY is not set +# CONFIG_SA1100_H3600 is not set # CONFIG_SA1100_EXTENEX1 is not set # CONFIG_SA1100_FLEXANET is not set # CONFIG_SA1100_FREEBIRD is not set # CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set # CONFIG_SA1100_JORNADA720 is not set # CONFIG_SA1100_HUW_WEBPANEL is not set # CONFIG_SA1100_ITSY is not set @@ -90,7 +95,12 @@ # # CLPS711X/EP721X Implementations # +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set # CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set # CONFIG_ARCH_ACORN is not set # CONFIG_FOOTBRIDGE is not set # CONFIG_FOOTBRIDGE_HOST is not set @@ -110,14 +120,14 @@ # CONFIG_CPU_ARM1020 is not set # CONFIG_CPU_SA110 is not set CONFIG_CPU_SA1100=y +# CONFIG_ARM_THUMB is not set CONFIG_DISCONTIGMEM=y -# CONFIG_CPU_BIG_ENDIAN is not set # # General setup # # CONFIG_PCI is not set -# CONFIG_ISA is not set +CONFIG_ISA=y # CONFIG_ISA_DMA is not set CONFIG_CPU_FREQ=y CONFIG_HOTPLUG=y @@ -134,6 +144,10 @@ CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# CONFIG_FPE_NWFPE=y # CONFIG_FPE_FASTFPE is not set CONFIG_KCORE_ELF=y @@ -142,10 +156,8 @@ CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set CONFIG_PM=y -# CONFIG_APM is not set # CONFIG_ARTHUR is not set CONFIG_CMDLINE="" -# CONFIG_PFS168_CMDLINE is not set CONFIG_LEDS=y CONFIG_LEDS_TIMER=y CONFIG_LEDS_CPU=y @@ -178,6 +190,8 @@ # RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y CONFIG_MTD_CFI_ADV_OPTIONS=y CONFIG_MTD_CFI_NOSWAP=y # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set @@ -191,47 +205,31 @@ # CONFIG_MTD_CFI_I4 is not set CONFIG_MTD_CFI_INTELEXT=y # CONFIG_MTD_CFI_AMDSTD is not set -# CONFIG_MTD_AMDSTD is not set -# CONFIG_MTD_SHARP is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set # CONFIG_MTD_JEDEC is not set # # Mapping drivers for chip access # # CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_SUN_UFLASH is not set # CONFIG_MTD_NORA is not set -# CONFIG_MTD_PNC2000 is not set -# CONFIG_MTD_RPXLITE is not set -# CONFIG_MTD_TQM8XXL is not set -# CONFIG_MTD_SC520CDP is not set -# CONFIG_MTD_NETSC520 is not set -# CONFIG_MTD_SBC_GXX is not set -# CONFIG_MTD_ELAN_104NC is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set CONFIG_MTD_SA1100=y -CONFIG_MTD_SA1100_REDBOOT_PARTITIONS=y -# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set # CONFIG_MTD_DC21285 is not set # CONFIG_MTD_IQ80310 is not set -# CONFIG_MTD_DBOX2 is not set -# CONFIG_MTD_CSTM_MIPS_IXX is not set -# CONFIG_MTD_CFI_FLAGADM is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set -# CONFIG_MTD_SOLUTIONENGINE is not set -# CONFIG_MTD_MIXMEM is not set -# CONFIG_MTD_OCTAGON is not set -# CONFIG_MTD_VMAX is not set -# CONFIG_MTD_OCELOT is not set -# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_PCI is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_LART is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLKMTD is not set @@ -253,6 +251,7 @@ # # CONFIG_PNP is not set # CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set # # Block devices @@ -262,6 +261,7 @@ # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set # CONFIG_BLK_DEV_DAC960 is not set CONFIG_BLK_DEV_LOOP=m # CONFIG_BLK_DEV_NBD is not set @@ -278,6 +278,7 @@ # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set # CONFIG_BLK_DEV_LVM is not set # @@ -339,6 +340,7 @@ # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y +# CONFIG_ARM_AM79C961A is not set # CONFIG_SUNLANCE is not set # CONFIG_SUNBMAC is not set # CONFIG_SUNQE is not set @@ -348,6 +350,9 @@ # CONFIG_LANCE is not set # CONFIG_NET_VENDOR_SMC is not set # CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set +# CONFIG_HP100 is not set # CONFIG_NET_ISA is not set # CONFIG_NET_PCI is not set # CONFIG_NET_POCKET is not set @@ -356,8 +361,9 @@ # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set -# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_DL2K is not set # CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set @@ -442,6 +448,8 @@ # CONFIG_WINBOND_FIR is not set # CONFIG_TOSHIBA_FIR is not set # CONFIG_SMC_IRCC_FIR is not set +# CONFIG_ALI_FIR is not set +# CONFIG_VLSI_FIR is not set CONFIG_SA1100_FIR=m # @@ -486,6 +494,9 @@ # CONFIG_IDEDMA_AUTO is not set # CONFIG_DMA_NONPCI is not set # CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set # # SCSI support @@ -510,6 +521,10 @@ # Input core support # # CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set # # Character devices @@ -519,31 +534,36 @@ # CONFIG_SERIAL is not set # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_21285 is not set -# CONFIG_SERIAL_21285_OLD is not set -# CONFIG_SERIAL_21285_CONSOLE is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set # CONFIG_SERIAL_AMBA is not set # CONFIG_SERIAL_AMBA_CONSOLE is not set # CONFIG_SERIAL_CLPS711X is not set # CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_UART00 is not set +# CONFIG_SERIAL_UART00_CONSOLE is not set CONFIG_SERIAL_SA1100=y CONFIG_SERIAL_SA1100_CONSOLE=y CONFIG_SA1100_DEFAULT_BAUDRATE=38400 CONFIG_SERIAL_8250=m # CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=32 -CONFIG_UCB1200=y -CONFIG_TOUCHSCREEN_UCB1200=y -# CONFIG_AUDIO_UCB1200 is not set -CONFIG_ADC_UCB1200=y -# CONFIG_TOUCHSCREEN_BITSY is not set -# CONFIG_PROFILER is not set -# CONFIG_PFS168_SPI is not set -# CONFIG_PFS168_DTMF is not set -# CONFIG_PFS168_MISC is not set # # I2C support @@ -551,6 +571,19 @@ # CONFIG_I2C is not set # +# L3 serial bus support +# +CONFIG_L3=y +CONFIG_L3_ALGOBIT=y +CONFIG_L3_BIT_SA1100_GPIO=y + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set +CONFIG_BIT_SA1100_GPIO=y + +# # Mice # # CONFIG_BUSMOUSE is not set @@ -559,7 +592,11 @@ # # Joysticks # -# CONFIG_JOYSTICK is not set +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# # # Input core support is needed for joysticks @@ -588,6 +625,8 @@ # # PCMCIA character devices # +CONFIG_PCMCIA_SERIAL_CS=m +# CONFIG_MWAVE is not set # # Multimedia devices @@ -607,13 +646,16 @@ # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y # CONFIG_UMSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_EFS_FS is not set -CONFIG_JFFS_FS=m -CONFIG_JFFS_FS_VERBOSE=0 +# CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 # CONFIG_CRAMFS is not set @@ -621,8 +663,9 @@ # CONFIG_RAMFS is not set # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set -# CONFIG_VXFS_FS is not set +# CONFIG_FREEVXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -645,6 +688,7 @@ # Network File Systems # # CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y # CONFIG_NFS_V3 is not set # CONFIG_ROOT_NFS is not set @@ -662,6 +706,8 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -677,6 +723,7 @@ # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set @@ -736,11 +783,10 @@ CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y # CONFIG_FB_ACORN is not set +# CONFIG_FB_ANAKIN is not set # CONFIG_FB_CLPS711X is not set -# CONFIG_FB_CYBER2000 is not set CONFIG_FB_SA1100=y -# CONFIG_FB_ANAKIN is not set -# CONFIG_FB_E1355 is not set +# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FBCON_ADVANCED is not set CONFIG_FBCON_CFB2=y @@ -759,12 +805,10 @@ # Sound # CONFIG_SOUND=y -CONFIG_SOUND_ASSABET_UDA1341=y -# CONFIG_SOUND_BITSY_UDA1341 is not set -# CONFIG_SOUND_SA1111_UDA1341 is not set -# CONFIG_SOUND_SA1100SSP is not set +# CONFIG_SOUND_BT878 is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set +# CONFIG_MIDI_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set # CONFIG_SOUND_CS4281 is not set # CONFIG_SOUND_ES1370 is not set @@ -773,21 +817,138 @@ # CONFIG_SOUND_MAESTRO is not set # CONFIG_SOUND_MAESTRO3 is not set # CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_VIA82CXXX is not set # CONFIG_MIDI_VIA82CXXX is not set +CONFIG_SOUND_SA1100=y +CONFIG_SOUND_UDA1341=y +CONFIG_SOUND_ASSABET_UDA1341=y +# CONFIG_SOUND_H3600_UDA1341 is not set +# CONFIG_SOUND_PANGOLIN_UDA1341 is not set +# CONFIG_SOUND_SA1111_UDA1341 is not set +# CONFIG_SOUND_SA1100SSP is not set # CONFIG_SOUND_OSS is not set +# CONFIG_SOUND_WAVEARTIST is not set # CONFIG_SOUND_TVMIXER is not set # +# Multimedia Capabilities Port drivers +# +CONFIG_MCP=y +CONFIG_MCP_SA1100=y +CONFIG_MCP_UCB1200=y +CONFIG_MCP_UCB1200_AUDIO=m +CONFIG_MCP_UCB1200_TS=y + +# # USB support # # CONFIG_USB is not set # +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set + +# # Bluetooth support # # CONFIG_BLUEZ is not set @@ -799,7 +960,9 @@ CONFIG_DEBUG_ERRORS=y CONFIG_DEBUG_USER=y # CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SLAB is not set CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_NO_PGT_CACHE is not set # CONFIG_DEBUG_LL is not set # CONFIG_DEBUG_DC21285_PORT is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/bitsy linux/arch/arm/def-configs/bitsy --- v2.4.13/linux/arch/arm/def-configs/bitsy Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/bitsy Wed Dec 31 16:00:00 1969 @@ -1,763 +0,0 @@ -# -# Automatically generated make config: don't edit -# -CONFIG_ARM=y -# CONFIG_EISA is not set -# CONFIG_SBUS is not set -# CONFIG_MCA is not set -CONFIG_UID16=y -CONFIG_RWSEM_GENERIC_SPINLOCK=y -# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set - -# -# Code maturity level options -# -CONFIG_EXPERIMENTAL=y -# CONFIG_OBSOLETE is not set - -# -# Loadable module support -# -CONFIG_MODULES=y -# CONFIG_MODVERSIONS is not set -# CONFIG_KMOD is not set - -# -# System Type -# -# CONFIG_ARCH_ANAKIN is not set -# CONFIG_ARCH_ARCA5K is not set -# CONFIG_ARCH_CLPS7500 is not set -# CONFIG_ARCH_CLPS711X is not set -# CONFIG_ARCH_CO285 is not set -# CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_INTEGRATOR is not set -# CONFIG_ARCH_L7200 is not set -# CONFIG_ARCH_RPC is not set -CONFIG_ARCH_SA1100=y -# CONFIG_ARCH_SHARK is not set - -# -# Archimedes/A5000 Implementations -# - -# -# Archimedes/A5000 Implementations (select only ONE) -# -# CONFIG_ARCH_ARC is not set -# CONFIG_ARCH_A5K is not set - -# -# Footbridge Implementations -# -# CONFIG_ARCH_CATS is not set -# CONFIG_ARCH_PERSONAL_SERVER is not set -# CONFIG_ARCH_EBSA285_ADDIN is not set -# CONFIG_ARCH_EBSA285_HOST is not set -# CONFIG_ARCH_NETWINDER is not set - -# -# SA11x0 Implementations -# -# CONFIG_SA1100_ASSABET is not set -# CONFIG_ASSABET_NEPONSET is not set -# CONFIG_SA1100_BRUTUS is not set -# CONFIG_SA1100_CERF is not set -CONFIG_SA1100_BITSY=y -# CONFIG_SA1100_EXTENEX1 is not set -# CONFIG_SA1100_FLEXANET is not set -# CONFIG_SA1100_FREEBIRD is not set -# CONFIG_SA1100_GRAPHICSCLIENT is not set -# CONFIG_SA1100_JORNADA720 is not set -# CONFIG_SA1100_HUW_WEBPANEL is not set -# CONFIG_SA1100_ITSY is not set -# CONFIG_SA1100_LART is not set -# CONFIG_SA1100_NANOENGINE is not set -# CONFIG_SA1100_OMNIMETER is not set -# CONFIG_SA1100_PANGOLIN is not set -# CONFIG_SA1100_PLEB is not set -# CONFIG_SA1100_SHERMAN is not set -# CONFIG_SA1100_SIMPAD is not set -# CONFIG_SA1100_PFS168 is not set -# CONFIG_SA1100_VICTOR is not set -# CONFIG_SA1100_XP860 is not set -# CONFIG_SA1100_YOPY is not set -CONFIG_SA1100_USB=m -CONFIG_SA1100_USB_NETLINK=m -# CONFIG_SA1100_USB_CHAR is not set - -# -# CLPS711X/EP721X Implementations -# -# CONFIG_ARCH_P720T is not set -# CONFIG_ARCH_ACORN is not set -# CONFIG_FOOTBRIDGE is not set -# CONFIG_FOOTBRIDGE_HOST is not set -# CONFIG_FOOTBRIDGE_ADDIN is not set -CONFIG_CPU_32=y -# CONFIG_CPU_26 is not set - -# -# Processor Type -# -# CONFIG_CPU_32v3 is not set -CONFIG_CPU_32v4=y -# CONFIG_CPU_ARM610 is not set -# CONFIG_CPU_ARM710 is not set -# CONFIG_CPU_ARM720T is not set -# CONFIG_CPU_ARM920T is not set -# CONFIG_CPU_ARM1020 is not set -# CONFIG_CPU_SA110 is not set -CONFIG_CPU_SA1100=y -CONFIG_DISCONTIGMEM=y -# CONFIG_CPU_BIG_ENDIAN is not set - -# -# General setup -# -# CONFIG_PCI is not set -# CONFIG_ISA is not set -# CONFIG_ISA_DMA is not set -CONFIG_CPU_FREQ=y -CONFIG_HOTPLUG=y - -# -# PCMCIA/CardBus support -# -CONFIG_PCMCIA=y -# CONFIG_I82365 is not set -# CONFIG_TCIC is not set -# CONFIG_PCMCIA_CLPS6700 is not set -CONFIG_PCMCIA_SA1100=y -CONFIG_NET=y -CONFIG_SYSVIPC=y -# CONFIG_BSD_PROCESS_ACCT is not set -CONFIG_SYSCTL=y -CONFIG_FPE_NWFPE=y -# CONFIG_FPE_FASTFPE is not set -CONFIG_KCORE_ELF=y -# CONFIG_KCORE_AOUT is not set -# CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_MISC is not set -CONFIG_PM=y -CONFIG_APM=m -# CONFIG_ARTHUR is not set -CONFIG_CMDLINE="" -# CONFIG_PFS168_CMDLINE is not set -# CONFIG_LEDS is not set -CONFIG_ALIGNMENT_TRAP=y - -# -# Parallel port support -# -# CONFIG_PARPORT is not set - -# -# Memory Technology Devices (MTD) -# -CONFIG_MTD=y -# CONFIG_MTD_DEBUG is not set -CONFIG_MTD_PARTITIONS=y -CONFIG_MTD_REDBOOT_PARTS=y -CONFIG_MTD_BOOTLDR_PARTS=y -# CONFIG_MTD_AFS_PARTS is not set - -# -# User Modules And Translation Layers -# -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -# CONFIG_FTL is not set -# CONFIG_NFTL is not set - -# -# RAM/ROM/Flash chip drivers -# -CONFIG_MTD_CFI=y -CONFIG_MTD_CFI_ADV_OPTIONS=y -CONFIG_MTD_CFI_NOSWAP=y -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -# CONFIG_MTD_CFI_GEOMETRY is not set -CONFIG_MTD_CFI_INTELEXT=y -# CONFIG_MTD_CFI_AMDSTD is not set -# CONFIG_MTD_AMDSTD is not set -# CONFIG_MTD_SHARP is not set -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_JEDEC is not set - -# -# Mapping drivers for chip access -# -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_SUN_UFLASH is not set -# CONFIG_MTD_NORA is not set -# CONFIG_MTD_PNC2000 is not set -# CONFIG_MTD_RPXLITE is not set -# CONFIG_MTD_TQM8XXL is not set -# CONFIG_MTD_SC520CDP is not set -# CONFIG_MTD_NETSC520 is not set -# CONFIG_MTD_SBC_GXX is not set -# CONFIG_MTD_ELAN_104NC is not set -# CONFIG_MTD_SA1100 is not set -# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set -# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set -# CONFIG_MTD_DC21285 is not set -# CONFIG_MTD_IQ80310 is not set -# CONFIG_MTD_DBOX2 is not set -# CONFIG_MTD_CSTM_MIPS_IXX is not set -# CONFIG_MTD_CFI_FLAGADM is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set -# CONFIG_MTD_SOLUTIONENGINE is not set -# CONFIG_MTD_MIXMEM is not set -# CONFIG_MTD_OCTAGON is not set -# CONFIG_MTD_VMAX is not set -# CONFIG_MTD_OCELOT is not set -# CONFIG_MTD_L440GX is not set - -# -# Self-contained MTD device drivers -# -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_LART is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_BLKMTD is not set - -# -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOC1000 is not set -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOCPROBE is not set - -# -# NAND Flash Device Drivers -# -# CONFIG_MTD_NAND is not set - -# -# Plug and Play configuration -# -# CONFIG_PNP is not set -# CONFIG_ISAPNP is not set - -# -# Block devices -# -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_XD is not set -# CONFIG_PARIDE is not set -# CONFIG_BLK_CPQ_DA is not set -# CONFIG_BLK_CPQ_CISS_DA is not set -# CONFIG_BLK_DEV_DAC960 is not set -CONFIG_BLK_DEV_LOOP=m -# CONFIG_BLK_DEV_NBD is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=8192 -CONFIG_BLK_DEV_INITRD=y - -# -# Multi-device support (RAID and LVM) -# -# CONFIG_MD is not set -# CONFIG_BLK_DEV_MD is not set -# CONFIG_MD_LINEAR is not set -# CONFIG_MD_RAID0 is not set -# CONFIG_MD_RAID1 is not set -# CONFIG_MD_RAID5 is not set -# CONFIG_BLK_DEV_LVM is not set - -# -# Networking options -# -# CONFIG_PACKET is not set -# CONFIG_NETLINK is not set -# CONFIG_NETFILTER is not set -# CONFIG_FILTER is not set -CONFIG_UNIX=y -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -# CONFIG_IP_PNP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_INET_ECN is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_IPV6 is not set -# CONFIG_KHTTPD is not set -# CONFIG_ATM is not set - -# -# -# -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_LLC is not set -# CONFIG_NET_DIVERT is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_NET_FASTROUTE is not set -# CONFIG_NET_HW_FLOWCONTROL is not set - -# -# QoS and/or fair queueing -# -# CONFIG_NET_SCHED is not set - -# -# Network device support -# -CONFIG_NETDEVICES=y - -# -# ARCnet devices -# -# CONFIG_ARCNET is not set -# CONFIG_DUMMY is not set -# CONFIG_BONDING is not set -# CONFIG_EQUALIZER is not set -# CONFIG_TUN is not set - -# -# Ethernet (10 or 100Mbit) -# -# CONFIG_NET_ETHERNET is not set - -# -# Ethernet (1000 Mbit) -# -# CONFIG_ACENIC is not set -# CONFIG_ACENIC_OMIT_TIGON_I is not set -# CONFIG_MYRI_SBUS is not set -# CONFIG_HAMACHI is not set -# CONFIG_YELLOWFIN is not set -# CONFIG_SK98LIN is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -# CONFIG_PLIP is not set -CONFIG_PPP=m -# CONFIG_PPP_MULTILINK is not set -# CONFIG_PPP_FILTER is not set -CONFIG_PPP_ASYNC=m -# CONFIG_PPP_SYNC_TTY is not set -CONFIG_PPP_DEFLATE=m -CONFIG_PPP_BSDCOMP=m -# CONFIG_PPPOE is not set -# CONFIG_SLIP is not set - -# -# Wireless LAN (non-hamradio) -# -# CONFIG_NET_RADIO is not set - -# -# Token Ring devices -# -# CONFIG_TR is not set -# CONFIG_NET_FC is not set -# CONFIG_RCPCI is not set -# CONFIG_SHAPER is not set - -# -# Wan interfaces -# -# CONFIG_WAN is not set - -# -# PCMCIA network device support -# -CONFIG_NET_PCMCIA=y -# CONFIG_PCMCIA_3C589 is not set -# CONFIG_PCMCIA_3C574 is not set -# CONFIG_PCMCIA_FMVJ18X is not set -CONFIG_PCMCIA_PCNET=y -# CONFIG_PCMCIA_NMCLAN is not set -# CONFIG_PCMCIA_SMC91C92 is not set -# CONFIG_PCMCIA_XIRC2PS is not set -# CONFIG_ARCNET_COM20020_CS is not set -# CONFIG_PCMCIA_IBMTR is not set -# CONFIG_NET_PCMCIA_RADIO is not set - -# -# Amateur Radio support -# -# CONFIG_HAMRADIO is not set - -# -# IrDA (infrared) support -# -# CONFIG_IRDA is not set - -# -# ATA/IDE/MFM/RLL support -# -CONFIG_IDE=m - -# -# IDE, ATA and ATAPI Block devices -# -CONFIG_BLK_DEV_IDE=m - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_IDE is not set -# CONFIG_BLK_DEV_HD is not set -CONFIG_BLK_DEV_IDEDISK=m -# CONFIG_IDEDISK_MULTI_MODE is not set -# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set -# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set -# CONFIG_BLK_DEV_IDEDISK_IBM is not set -# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set -# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set -# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set -# CONFIG_BLK_DEV_IDEDISK_WD is not set -# CONFIG_BLK_DEV_COMMERIAL is not set -# CONFIG_BLK_DEV_TIVO is not set -# CONFIG_BLK_DEV_IDECS is not set -CONFIG_BLK_DEV_IDECD=m -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -# CONFIG_BLK_DEV_IDESCSI is not set - -# -# IDE chipset support/bugfixes -# -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -# CONFIG_BLK_DEV_ISAPNP is not set -# CONFIG_IDE_CHIPSETS is not set -# CONFIG_IDEDMA_AUTO is not set -# CONFIG_DMA_NONPCI is not set -# CONFIG_BLK_DEV_IDE_MODES is not set - -# -# SCSI support -# -# CONFIG_SCSI is not set - -# -# I2O device support -# -# CONFIG_I2O is not set -# CONFIG_I2O_BLOCK is not set -# CONFIG_I2O_LAN is not set -# CONFIG_I2O_SCSI is not set -# CONFIG_I2O_PROC is not set - -# -# ISDN subsystem -# -# CONFIG_ISDN is not set - -# -# Input core support -# -# CONFIG_INPUT is not set - -# -# Character devices -# -CONFIG_VT=y -# CONFIG_VT_CONSOLE is not set -CONFIG_SERIAL=m -# CONFIG_SERIAL_EXTENDED is not set -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_21285 is not set -# CONFIG_SERIAL_21285_OLD is not set -# CONFIG_SERIAL_21285_CONSOLE is not set -# CONFIG_SERIAL_AMBA is not set -# CONFIG_SERIAL_AMBA_CONSOLE is not set -# CONFIG_SERIAL_CLPS711X is not set -# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -CONFIG_SERIAL_SA1100=y -CONFIG_SERIAL_SA1100_CONSOLE=y -CONFIG_SA1100_DEFAULT_BAUDRATE=38400 -CONFIG_SERIAL_8250=m -# CONFIG_SERIAL_8250_CONSOLE is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=32 -# CONFIG_UCB1200 is not set -# CONFIG_TOUCHSCREEN_UCB1200 is not set -# CONFIG_AUDIO_UCB1200 is not set -# CONFIG_ADC_UCB1200 is not set -CONFIG_TOUCHSCREEN_BITSY=y -CONFIG_PROFILER=m -# CONFIG_PFS168_SPI is not set -# CONFIG_PFS168_DTMF is not set -# CONFIG_PFS168_MISC is not set - -# -# I2C support -# -# CONFIG_I2C is not set - -# -# Mice -# -# CONFIG_BUSMOUSE is not set -CONFIG_MOUSE=m -# CONFIG_PSMOUSE is not set -# CONFIG_82C710_MOUSE is not set -# CONFIG_PC110_PAD is not set - -# -# Joysticks -# -# CONFIG_JOYSTICK is not set - -# -# Input core support is needed for joysticks -# -# CONFIG_QIC02_TAPE is not set - -# -# Watchdog Cards -# -# CONFIG_WATCHDOG is not set -# CONFIG_INTEL_RNG is not set -# CONFIG_NVRAM is not set -# CONFIG_RTC is not set -CONFIG_SA1100_RTC=m -# CONFIG_DTLK is not set -# CONFIG_R3964 is not set -# CONFIG_APPLICOM is not set - -# -# Ftape, the floppy tape device driver -# -# CONFIG_FTAPE is not set -# CONFIG_AGP is not set -# CONFIG_DRM is not set - -# -# PCMCIA character devices -# - -# -# Multimedia devices -# -# CONFIG_VIDEO_DEV is not set - -# -# File systems -# -# CONFIG_QUOTA is not set -# CONFIG_AUTOFS_FS is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_REISERFS_FS is not set -# CONFIG_REISERFS_CHECK is not set -# CONFIG_ADFS_FS is not set -# CONFIG_ADFS_FS_RW is not set -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_BFS_FS is not set -CONFIG_FAT_FS=m -CONFIG_MSDOS_FS=m -# CONFIG_UMSDOS_FS is not set -CONFIG_VFAT_FS=m -# CONFIG_EFS_FS is not set -CONFIG_JFFS_FS=m -CONFIG_JFFS_FS_VERBOSE=2 -CONFIG_JFFS2_FS=m -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_CRAMFS=m -# CONFIG_TMPFS is not set -CONFIG_RAMFS=y -# CONFIG_ISO9660_FS is not set -# CONFIG_JOLIET is not set -# CONFIG_MINIX_FS is not set -# CONFIG_VXFS_FS is not set -# CONFIG_NTFS_FS is not set -# CONFIG_NTFS_RW is not set -# CONFIG_HPFS_FS is not set -CONFIG_PROC_FS=y -# CONFIG_DEVFS_FS is not set -# CONFIG_DEVFS_MOUNT is not set -# CONFIG_DEVFS_DEBUG is not set -CONFIG_DEVPTS_FS=y -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX4FS_RW is not set -# CONFIG_ROMFS_FS is not set -CONFIG_EXT2_FS=y -# CONFIG_SYSV_FS is not set -# CONFIG_UDF_FS is not set -# CONFIG_UDF_RW is not set -# CONFIG_UFS_FS is not set -# CONFIG_UFS_FS_WRITE is not set - -# -# Network File Systems -# -# CONFIG_CODA_FS is not set -CONFIG_NFS_FS=y -# CONFIG_NFS_V3 is not set -# CONFIG_ROOT_NFS is not set -CONFIG_NFSD=m -# CONFIG_NFSD_V3 is not set -CONFIG_SUNRPC=y -CONFIG_LOCKD=y -CONFIG_SMB_FS=m -# CONFIG_SMB_NLS_DEFAULT is not set -# CONFIG_NCP_FS is not set -# CONFIG_NCPFS_PACKET_SIGNING is not set -# CONFIG_NCPFS_IOCTL_LOCKING is not set -# CONFIG_NCPFS_STRONG is not set -# CONFIG_NCPFS_NFS_NS is not set -# CONFIG_NCPFS_OS2_NS is not set -# CONFIG_NCPFS_SMALLDOS is not set -# CONFIG_NCPFS_NLS is not set -# CONFIG_NCPFS_EXTRAS is not set - -# -# Partition Types -# -# CONFIG_PARTITION_ADVANCED is not set -CONFIG_MSDOS_PARTITION=y -CONFIG_SMB_NLS=y -CONFIG_NLS=y - -# -# Native Language Support -# -CONFIG_NLS_DEFAULT="iso8859-1" -# CONFIG_NLS_CODEPAGE_437 is not set -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_UTF8 is not set - -# -# Console drivers -# -CONFIG_PC_KEYMAP=y -# CONFIG_VGA_CONSOLE is not set - -# -# Frame-buffer support -# -CONFIG_FB=y -CONFIG_DUMMY_CONSOLE=y -# CONFIG_FB_ACORN is not set -# CONFIG_FB_CLPS711X is not set -# CONFIG_FB_CYBER2000 is not set -CONFIG_FB_SA1100=y -# CONFIG_FB_ANAKIN is not set -# CONFIG_FB_E1355 is not set -# CONFIG_FB_VIRTUAL is not set -CONFIG_FBCON_ADVANCED=y -# CONFIG_FBCON_MFB is not set -# CONFIG_FBCON_CFB2 is not set -# CONFIG_FBCON_CFB4 is not set -# CONFIG_FBCON_CFB8 is not set -CONFIG_FBCON_CFB16=y -# CONFIG_FBCON_CFB24 is not set -# CONFIG_FBCON_CFB32 is not set -# CONFIG_FBCON_AFB is not set -# CONFIG_FBCON_ILBM is not set -# CONFIG_FBCON_IPLAN2P2 is not set -# CONFIG_FBCON_IPLAN2P4 is not set -# CONFIG_FBCON_IPLAN2P8 is not set -# CONFIG_FBCON_MAC is not set -# CONFIG_FBCON_VGA_PLANES is not set -# CONFIG_FBCON_VGA is not set -# CONFIG_FBCON_HGA is not set -CONFIG_FBCON_FONTWIDTH8_ONLY=y -CONFIG_FBCON_FONTS=y -CONFIG_FONT_8x8=y -# CONFIG_FONT_8x16 is not set -# CONFIG_FONT_SUN8x16 is not set -# CONFIG_FONT_PEARL_8x8 is not set -# CONFIG_FONT_ACORN_8x8 is not set - -# -# Sound -# -CONFIG_SOUND=y -# CONFIG_SOUND_ASSABET_UDA1341 is not set -CONFIG_SOUND_BITSY_UDA1341=m -# CONFIG_SOUND_SA1111_UDA1341 is not set -# CONFIG_SOUND_SA1100SSP is not set -# CONFIG_SOUND_CMPCI is not set -# CONFIG_SOUND_EMU10K1 is not set -# CONFIG_SOUND_FUSION is not set -# CONFIG_SOUND_CS4281 is not set -# CONFIG_SOUND_ES1370 is not set -# CONFIG_SOUND_ES1371 is not set -# CONFIG_SOUND_ESSSOLO1 is not set -# CONFIG_SOUND_MAESTRO is not set -# CONFIG_SOUND_MAESTRO3 is not set -# CONFIG_SOUND_ICH is not set -# CONFIG_SOUND_SONICVIBES is not set -# CONFIG_SOUND_TRIDENT is not set -# CONFIG_SOUND_MSNDCLAS is not set -# CONFIG_SOUND_MSNDPIN is not set -# CONFIG_SOUND_VIA82CXXX is not set -# CONFIG_MIDI_VIA82CXXX is not set -# CONFIG_SOUND_OSS is not set -# CONFIG_SOUND_TVMIXER is not set - -# -# USB support -# -# CONFIG_USB is not set - -# -# Bluetooth support -# -# CONFIG_BLUEZ is not set - -# -# Kernel hacking -# -# CONFIG_NO_FRAME_POINTER is not set -CONFIG_DEBUG_ERRORS=y -# CONFIG_DEBUG_USER is not set -# CONFIG_DEBUG_INFO is not set -CONFIG_MAGIC_SYSRQ=y -# CONFIG_NO_PGT_CACHE is not set -# CONFIG_DEBUG_LL is not set -# CONFIG_DEBUG_DC21285_PORT is not set -# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/cerf linux/arch/arm/def-configs/cerf --- v2.4.13/linux/arch/arm/def-configs/cerf Mon Nov 27 17:07:59 2000 +++ linux/arch/arm/def-configs/cerf Wed Dec 31 16:00:00 1969 @@ -1,434 +0,0 @@ -# -# Automatically generated make config: don't edit -# -CONFIG_ARM=y -# CONFIG_SBUS is not set -CONFIG_UID16=y - -# -# Code maturity level options -# -CONFIG_EXPERIMENTAL=y -# CONFIG_OBSOLETE is not set - -# -# Loadable module support -# -CONFIG_MODULES=y -# CONFIG_MODVERSIONS is not set -# CONFIG_KMOD is not set - -# -# System Type -# -# CONFIG_ARCH_ARCA5K is not set -# CONFIG_ARCH_CLPS7500 is not set -# CONFIG_ARCH_CO285 is not set -# CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_RPC is not set -CONFIG_ARCH_SA1100=y - -# -# SA11x0 Implementations -# -# CONFIG_SA1100_ASSABET is not set -# CONFIG_SA1100_BRUTUS is not set -CONFIG_SA1100_CERF=y -CONFIG_SA1100_CERF_32MB=y -# CONFIG_SA1100_BITSY is not set -# CONFIG_SA1100_LART is not set -# CONFIG_SA1100_THINCLIENT is not set -# CONFIG_SA1100_GRAPHICSCLIENT is not set -# CONFIG_SA1100_NANOENGINE is not set -# CONFIG_SA1100_VICTOR is not set -# CONFIG_SA1100_XP860 is not set -# CONFIG_ANGELBOOT is not set -# CONFIG_SA1100_FREQUENCY_SCALE is not set -# CONFIG_SA1100_VOLTAGE_SCALE is not set -# CONFIG_ARCH_ACORN is not set -# CONFIG_FOOTBRIDGE is not set -# CONFIG_FOOTBRIDGE_HOST is not set -# CONFIG_FOOTBRIDGE_ADDIN is not set -CONFIG_CPU_32=y -# CONFIG_CPU_26 is not set -CONFIG_CPU_32v4=y -CONFIG_CPU_SA1100=y -CONFIG_DISCONTIGMEM=y -# CONFIG_PCI is not set -# CONFIG_ISA is not set -# CONFIG_ISA_DMA is not set -CONFIG_PC_KEYMAP=y - -# -# General setup -# -# CONFIG_SA1100_CERF_CMDLINE is not set -CONFIG_HOTPLUG=y - -# -# PCMCIA/CardBus support -# -CONFIG_PCMCIA=y -# CONFIG_PCMCIA_DEBUG is not set -CONFIG_SA1100_PCMCIA=y -CONFIG_VIRTUAL_BUS=y -CONFIG_NET=y -CONFIG_SYSVIPC=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_SYSCTL=y -CONFIG_NWFPE=y -CONFIG_KCORE_ELF=y -# CONFIG_KCORE_AOUT is not set -# CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_MISC is not set -# CONFIG_PM is not set -# CONFIG_ARTHUR is not set -CONFIG_CMDLINE="console=ttyS0,38400" -CONFIG_LEDS=y -CONFIG_LEDS_TIMER=y -CONFIG_LEDS_CPU=y -CONFIG_ALIGNMENT_TRAP=y - -# -# Parallel port support -# -# CONFIG_PARPORT is not set - -# -# Memory Technology Devices (MTD) -# -# CONFIG_MTD is not set - -# -# Plug and Play configuration -# -# CONFIG_PNP is not set - -# -# Block devices -# -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_LOOP is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_LVM is not set -# CONFIG_BLK_DEV_MD is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=4096 -CONFIG_BLK_DEV_INITRD=y -CONFIG_BLK_DEV_FLASH=y - -# -# Networking options -# -CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -# CONFIG_NETLINK is not set -# CONFIG_NETFILTER is not set -# CONFIG_FILTER is not set -CONFIG_UNIX=y -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_PNP=y -CONFIG_IP_PNP_BOOTP=y -# CONFIG_IP_PNP_RARP is not set -# CONFIG_IP_ROUTER is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_IP_ALIAS is not set -# CONFIG_INET_ECN is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_IPV6 is not set -# CONFIG_KHTTPD is not set -# CONFIG_ATM is not set - -# -# -# -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_LLC is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_NET_FASTROUTE is not set -# CONFIG_NET_HW_FLOWCONTROL is not set - -# -# QoS and/or fair queueing -# -# CONFIG_NET_SCHED is not set - -# -# Network device support -# -CONFIG_NETDEVICES=y - -# -# ARCnet devices -# -# CONFIG_ARCNET is not set -# CONFIG_DUMMY is not set -# CONFIG_BONDING is not set -# CONFIG_EQUALIZER is not set -# CONFIG_NET_SB1000 is not set - -# -# Ethernet (10 or 100Mbit) -# -CONFIG_NET_ETHERNET=y -CONFIG_CERF_CS8900A=y -# CONFIG_ARM_AM79C961A is not set -# CONFIG_NET_VENDOR_3COM is not set -# CONFIG_LANCE is not set -# CONFIG_NET_VENDOR_SMC is not set -# CONFIG_NET_VENDOR_RACAL is not set -# CONFIG_AT1700 is not set -# CONFIG_DEPCA is not set -# CONFIG_NET_ISA is not set -# CONFIG_NET_PCI is not set -# CONFIG_NET_POCKET is not set - -# -# Ethernet (1000 Mbit) -# -# CONFIG_YELLOWFIN is not set -# CONFIG_ACENIC is not set -# CONFIG_SK98LIN is not set -# CONFIG_FDDI is not set -# CONFIG_HIPPI is not set -# CONFIG_PPP is not set -# CONFIG_SLIP is not set - -# -# Wireless LAN (non-hamradio) -# -# CONFIG_NET_RADIO is not set - -# -# Token Ring devices -# -# CONFIG_TR is not set -# CONFIG_NET_FC is not set -# CONFIG_RCPCI is not set -# CONFIG_SHAPER is not set - -# -# Wan interfaces -# -# CONFIG_WAN is not set - -# -# PCMCIA network device support -# -# CONFIG_NET_PCMCIA is not set - -# -# Amateur Radio support -# -# CONFIG_HAMRADIO is not set - -# -# IrDA (infrared) support -# -# CONFIG_IRDA is not set - -# -# ATA/IDE/MFM/RLL support -# -CONFIG_IDE=y - -# -# IDE, ATA and ATAPI Block devices -# -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# -# CONFIG_BLK_DEV_HD_IDE is not set -# CONFIG_BLK_DEV_HD is not set -CONFIG_BLK_DEV_IDEDISK=y -# CONFIG_IDEDISK_MULTI_MODE is not set -# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set -# CONFIG_BLK_DEV_COMMERIAL is not set -CONFIG_BLK_DEV_IDECS=y -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set - -# -# IDE chipset support/bugfixes -# -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_IDE_CHIPSETS is not set -# CONFIG_IDEDMA_AUTO is not set -# CONFIG_DMA_NONPCI is not set -# CONFIG_BLK_DEV_IDE_MODES is not set - -# -# SCSI support -# -# CONFIG_SCSI is not set - -# -# I2O device support -# -# CONFIG_I2O is not set - -# -# ISDN subsystem -# -# CONFIG_ISDN is not set - -# -# Character devices -# -CONFIG_VT=y -# CONFIG_VT_CONSOLE is not set -CONFIG_SERIAL_SA1100=y -CONFIG_SERIAL_SA1100_CONSOLE=y -CONFIG_TOUCHSCREEN_UCB1200=y -# CONFIG_TOUCHSCREEN_BITSY is not set -# CONFIG_SERIAL is not set -# CONFIG_SERIAL_EXTENDED is not set -# CONFIG_SERIAL_NONSTANDARD is not set -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=32 - -# -# I2C support -# -# CONFIG_I2C is not set - -# -# Mice -# -# CONFIG_BUSMOUSE is not set -# CONFIG_MOUSE is not set - -# -# Joysticks -# -# CONFIG_JOYSTICK is not set -# CONFIG_QIC02_TAPE is not set - -# -# Watchdog Cards -# -# CONFIG_WATCHDOG is not set -# CONFIG_NVRAM is not set -# CONFIG_RTC is not set - -# -# Video For Linux -# -# CONFIG_VIDEO_DEV is not set -# CONFIG_DTLK is not set -# CONFIG_R3964 is not set -# CONFIG_APPLICOM is not set - -# -# Ftape, the floppy tape device driver -# -# CONFIG_FTAPE is not set -# CONFIG_AGP is not set -# CONFIG_DRM is not set -# CONFIG_PCMCIA_SERIAL is not set - -# -# File systems -# -# CONFIG_QUOTA is not set -# CONFIG_AUTOFS_FS is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_FAT_FS is not set -# CONFIG_EFS_FS is not set -CONFIG_JFFS_FS_VERBOSE=0 -# CONFIG_CRAMFS is not set -# CONFIG_RAMFS is not set -# CONFIG_ISO9660_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_NTFS_FS is not set -# CONFIG_HPFS_FS is not set -CONFIG_PROC_FS=y -# CONFIG_DEVFS_FS is not set -CONFIG_DEVPTS_FS=y -# CONFIG_QNX4FS_FS is not set -# CONFIG_ROMFS_FS is not set -CONFIG_EXT2_FS=y -# CONFIG_SYSV_FS is not set -# CONFIG_UDF_FS is not set -# CONFIG_UFS_FS is not set - -# -# Network File Systems -# -# CONFIG_CODA_FS is not set -CONFIG_NFS_FS=y -# CONFIG_NFS_V3 is not set -# CONFIG_ROOT_NFS is not set -# CONFIG_NFSD is not set -CONFIG_SUNRPC=y -CONFIG_LOCKD=y -# CONFIG_SMB_FS is not set -# CONFIG_NCP_FS is not set - -# -# Partition Types -# -# CONFIG_PARTITION_ADVANCED is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_NLS is not set - -# -# Console drivers -# -# CONFIG_VGA_CONSOLE is not set -CONFIG_FB=y - -# -# Frame-buffer support -# -CONFIG_FB=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_FB_SA1100=y -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FBCON_ADVANCED is not set -CONFIG_FBCON_CFB2=y -CONFIG_FBCON_CFB4=y -CONFIG_FBCON_CFB8=y -CONFIG_FBCON_CFB16=y -# CONFIG_FBCON_FONTWIDTH8_ONLY is not set -# CONFIG_FBCON_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y - -# -# Sound -# -# CONFIG_SOUND is not set - -# -# USB support -# -# CONFIG_USB is not set - -# -# Kernel hacking -# -CONFIG_FRAME_POINTER=y -CONFIG_DEBUG_ERRORS=y -CONFIG_DEBUG_USER=y -# CONFIG_DEBUG_INFO is not set -# CONFIG_MAGIC_SYSRQ is not set -# CONFIG_DEBUG_LL is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/cerfcube linux/arch/arm/def-configs/cerfcube --- v2.4.13/linux/arch/arm/def-configs/cerfcube Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/cerfcube Thu Oct 25 13:53:44 2001 @@ -0,0 +1,887 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# System Type +# +# CONFIG_ARCH_ANAKIN is not set +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_RPC is not set +CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_SHARK is not set + +# +# Archimedes/A5000 Implementations +# + +# +# Archimedes/A5000 Implementations (select only ONE) +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# +# Footbridge Implementations +# +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set +# CONFIG_SA1100_BRUTUS is not set +CONFIG_SA1100_CERF=y +# CONFIG_SA1100_CERF_8MB is not set +# CONFIG_SA1100_CERF_16MB is not set +CONFIG_SA1100_CERF_32MB=y +# CONFIG_SA1100_CERF_64MB is not set +# CONFIG_SA1100_CERF_FLASH_8MB is not set +CONFIG_SA1100_CERF_FLASH_16MB=y +# CONFIG_SA1100_CERF_FLASH_32MB is not set +# CONFIG_SA1100_CERF_CPLD is not set +# CONFIG_SA1100_H3600 is not set +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set +# CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_XP860 is not set +# CONFIG_SA1100_YOPY is not set +CONFIG_SA1100_USB=y +CONFIG_SA1100_USB_NETLINK=y +CONFIG_SA1100_USB_CHAR=y + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set +# CONFIG_ARCH_ACORN is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set + +# +# Processor Type +# +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +CONFIG_CPU_SA1100=y +# CONFIG_ARM_THUMB is not set +CONFIG_DISCONTIGMEM=y + +# +# General setup +# +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +CONFIG_CPU_FREQ=y +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=y +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +# CONFIG_PCMCIA_CLPS6700 is not set +CONFIG_PCMCIA_SA1100=y +CONFIG_NET=y +CONFIG_SYSVIPC=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_APM is not set +# CONFIG_ARTHUR is not set +CONFIG_CMDLINE="console=ttySA0 root=1f03 rw" +# CONFIG_PFS168_CMDLINE is not set +CONFIG_LEDS=y +CONFIG_LEDS_TIMER=y +CONFIG_LEDS_CPU=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_BOOTLDR_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_SUN_UFLASH is not set +# CONFIG_MTD_NORA is not set +# CONFIG_MTD_PNC2000 is not set +# CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set +# CONFIG_MTD_SC520CDP is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set +# CONFIG_MTD_ELAN_104NC is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_SOLUTIONENGINE is not set +# CONFIG_MTD_MIXMEM is not set +# CONFIG_MTD_OCTAGON is not set +# CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set +CONFIG_MTD_SA1100=y +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK=y +CONFIG_RTNETLINK=y +# CONFIG_NETLINK_DEV is not set +# CONFIG_NETFILTER is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set + +# +# +# +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set +CONFIG_NET_VENDOR_3COM=y +# CONFIG_EL1 is not set +# CONFIG_EL2 is not set +# CONFIG_ELPLUS is not set +# CONFIG_EL16 is not set +# CONFIG_ELMC is not set +# CONFIG_ELMC_II is not set +CONFIG_CERF_CS8900A=y +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_FMVJ18X is not set +CONFIG_PCMCIA_PCNET=m +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_ARCNET_COM20020_CS is not set +# CONFIG_PCMCIA_IBMTR is not set +# CONFIG_NET_PCMCIA_RADIO is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set +# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set +# CONFIG_BLK_DEV_IDEDISK_IBM is not set +# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set +# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set +# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set +# CONFIG_BLK_DEV_IDEDISK_WD is not set +# CONFIG_BLK_DEV_COMMERIAL is not set +# CONFIG_BLK_DEV_TIVO is not set +CONFIG_BLK_DEV_IDECS=m +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_IDE_CHIPSETS is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +CONFIG_VT=y +# CONFIG_VT_CONSOLE is not set +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +CONFIG_SERIAL_SA1100=y +CONFIG_SERIAL_SA1100_CONSOLE=y +CONFIG_SA1100_DEFAULT_BAUDRATE=9600 +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +# CONFIG_UCB1200 is not set +# CONFIG_TOUCHSCREEN_UCB1200 is not set +# CONFIG_AUDIO_UCB1200 is not set +# CONFIG_ADC_UCB1200 is not set +# CONFIG_TOUCHSCREEN_H3600 is not set +# CONFIG_PROFILER is not set +# CONFIG_PFS168_SPI is not set +# CONFIG_PFS168_DTMF is not set +# CONFIG_PFS168_MISC is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set +# CONFIG_BIT_SA1100_UCB1200 is not set + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set + +# +# L3 driver support +# +# CONFIG_L3_DRV_UDA1341 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# + +# +# Input core support is needed for joysticks +# +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +CONFIG_SA1100_RTC=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +CONFIG_AUTOFS_FS=y +CONFIG_AUTOFS4_FS=y +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_UMSDOS_FS=y +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_MINIX_FS is not set +# CONFIG_FREEVXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +CONFIG_ROMFS_FS=y +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Console drivers +# +CONFIG_PC_KEYMAP=y +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +# CONFIG_FB is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# +# CONFIG_USB_DABUSB is not set + +# +# USB Network adaptors +# +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# Miscellaneous USB drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +# CONFIG_NO_FRAME_POINTER is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_INFO is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_NO_PGT_CACHE is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/cerfpda linux/arch/arm/def-configs/cerfpda --- v2.4.13/linux/arch/arm/def-configs/cerfpda Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/cerfpda Thu Oct 25 13:53:44 2001 @@ -0,0 +1,981 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# System Type +# +# CONFIG_ARCH_ANAKIN is not set +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_RPC is not set +CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_SHARK is not set + +# +# Archimedes/A5000 Implementations +# + +# +# Archimedes/A5000 Implementations (select only ONE) +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# +# Footbridge Implementations +# +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set +# CONFIG_SA1100_BRUTUS is not set +CONFIG_SA1100_CERF=y +# CONFIG_SA1100_CERF_8MB is not set +# CONFIG_SA1100_CERF_16MB is not set +# CONFIG_SA1100_CERF_32MB is not set +CONFIG_SA1100_CERF_64MB=y +# CONFIG_SA1100_CERF_FLASH_8MB is not set +# CONFIG_SA1100_CERF_FLASH_16MB is not set +CONFIG_SA1100_CERF_FLASH_32MB=y +CONFIG_SA1100_CERF_CPLD=y +# CONFIG_SA1100_H3600 is not set +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set +# CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_XP860 is not set +# CONFIG_SA1100_YOPY is not set +CONFIG_SA1100_USB=y +CONFIG_SA1100_USB_NETLINK=y +CONFIG_SA1100_USB_CHAR=y + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set +# CONFIG_ARCH_ACORN is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set + +# +# Processor Type +# +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +CONFIG_CPU_SA1100=y +# CONFIG_ARM_THUMB is not set +CONFIG_DISCONTIGMEM=y + +# +# General setup +# +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +CONFIG_CPU_FREQ=y +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=y +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +# CONFIG_PCMCIA_CLPS6700 is not set +CONFIG_PCMCIA_SA1100=y +CONFIG_NET=y +CONFIG_SYSVIPC=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_APM is not set +# CONFIG_ARTHUR is not set +CONFIG_CMDLINE="console=ttySA0 cpufreq_max=221200 root=1f03 rw" +# CONFIG_PFS168_CMDLINE is not set +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_BOOTLDR_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_B1 is not set +# CONFIG_MTD_CFI_B2 is not set +CONFIG_MTD_CFI_B4=y +# CONFIG_MTD_CFI_I1 is not set +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_SUN_UFLASH is not set +# CONFIG_MTD_NORA is not set +# CONFIG_MTD_PNC2000 is not set +# CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set +# CONFIG_MTD_SC520CDP is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set +# CONFIG_MTD_ELAN_104NC is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_SOLUTIONENGINE is not set +# CONFIG_MTD_MIXMEM is not set +# CONFIG_MTD_OCTAGON is not set +# CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set +CONFIG_MTD_SA1100=y +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK=y +CONFIG_RTNETLINK=y +# CONFIG_NETLINK_DEV is not set +# CONFIG_NETFILTER is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set + +# +# +# +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set +CONFIG_NET_VENDOR_3COM=y +# CONFIG_EL1 is not set +# CONFIG_EL2 is not set +# CONFIG_ELPLUS is not set +# CONFIG_EL16 is not set +# CONFIG_ELMC is not set +# CONFIG_ELMC_II is not set +CONFIG_CERF_CS8900A=y +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y +CONFIG_STRIP=m +CONFIG_WAVELAN=m +CONFIG_ARLAN=m +CONFIG_AIRONET4500=m +CONFIG_AIRONET4500_NONCS=m +# CONFIG_AIRONET4500_PNP is not set +# CONFIG_AIRONET4500_PCI is not set +# CONFIG_AIRONET4500_ISA is not set +# CONFIG_AIRONET4500_I365 is not set +CONFIG_AIRONET4500_PROC=m + +# +# Wireless Pcmcia cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_NET_WIRELESS=y + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +# CONFIG_ARCNET_COM20020_CS is not set +# CONFIG_PCMCIA_IBMTR is not set +CONFIG_NET_PCMCIA_RADIO=y +CONFIG_PCMCIA_RAYCS=m +CONFIG_PCMCIA_NETWAVE=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_AIRONET4500_CS=m + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set +# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set +# CONFIG_BLK_DEV_IDEDISK_IBM is not set +# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set +# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set +# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set +# CONFIG_BLK_DEV_IDEDISK_WD is not set +# CONFIG_BLK_DEV_COMMERIAL is not set +# CONFIG_BLK_DEV_TIVO is not set +CONFIG_BLK_DEV_IDECS=m +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_IDE_CHIPSETS is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +CONFIG_SERIAL_SA1100=y +CONFIG_SERIAL_SA1100_CONSOLE=y +CONFIG_SA1100_DEFAULT_BAUDRATE=38400 +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +CONFIG_UCB1200=y +CONFIG_TOUCHSCREEN_UCB1200=y +CONFIG_CERF_TS_MANUAL=y +CONFIG_CERF_TS_MAXX="924" +CONFIG_CERF_TS_MAXY="920" +CONFIG_CERF_TS_MINX="57" +CONFIG_CERF_TS_MINY="52" +CONFIG_CERF_TS_RESX="240" +CONFIG_CERF_TS_RESY="320" +# CONFIG_AUDIO_UCB1200 is not set +# CONFIG_ADC_UCB1200 is not set +# CONFIG_TOUCHSCREEN_H3600 is not set +# CONFIG_PROFILER is not set +# CONFIG_PFS168_SPI is not set +# CONFIG_PFS168_DTMF is not set +# CONFIG_PFS168_MISC is not set +CONFIG_SA1100_CERF_KEYPAD=y + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set +# CONFIG_BIT_SA1100_UCB1200 is not set + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set + +# +# L3 driver support +# +# CONFIG_L3_DRV_UDA1341 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# + +# +# Input core support is needed for joysticks +# +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +CONFIG_SA1100_RTC=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_UMSDOS_FS=y +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_MINIX_FS is not set +# CONFIG_FREEVXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +CONFIG_ROMFS_FS=y +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Console drivers +# +CONFIG_PC_KEYMAP=y +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +CONFIG_FB=y +CONFIG_DUMMY_CONSOLE=y +# CONFIG_FB_ACORN is not set +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_CLPS711X is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_SA1100=y +CONFIG_CERF_LCD_38_A=y +# CONFIG_CERF_LCD_57_A is not set +# CONFIG_CERF_LCD_72_A is not set +CONFIG_SA1100_CERF_LCD_BACKLIGHT=y +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FBCON_ADVANCED is not set +CONFIG_FBCON_CFB2=y +CONFIG_FBCON_CFB4=y +CONFIG_FBCON_CFB8=y +CONFIG_FBCON_CFB16=y +# CONFIG_FBCON_FONTWIDTH8_ONLY is not set +# CONFIG_FBCON_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Sound +# +CONFIG_SOUND=y +# CONFIG_SOUND_BT878 is not set +# CONFIG_SOUND_CMPCI is not set +# CONFIG_SOUND_EMU10K1 is not set +# CONFIG_MIDI_EMU10K1 is not set +# CONFIG_SOUND_FUSION is not set +# CONFIG_SOUND_CS4281 is not set +# CONFIG_SOUND_ES1370 is not set +# CONFIG_SOUND_ES1371 is not set +# CONFIG_SOUND_ESSSOLO1 is not set +# CONFIG_SOUND_MAESTRO is not set +# CONFIG_SOUND_MAESTRO3 is not set +# CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set +# CONFIG_SOUND_SONICVIBES is not set +# CONFIG_SOUND_TRIDENT is not set +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +# CONFIG_SOUND_VIA82CXXX is not set +# CONFIG_MIDI_VIA82CXXX is not set +# CONFIG_SOUND_ASSABET_UDA1341 is not set +# CONFIG_SOUND_H3600_UDA1341 is not set +# CONFIG_SOUND_PANGOLIN_UDA1341 is not set +# CONFIG_SOUND_SA1111_UDA1341 is not set +CONFIG_SOUND_CERF_UDA1341=y +# CONFIG_SOUND_SA1100SSP is not set +# CONFIG_SOUND_OSS is not set +# CONFIG_SOUND_WAVEARTIST is not set +# CONFIG_SOUND_TVMIXER is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# +# CONFIG_USB_DABUSB is not set + +# +# USB Network adaptors +# +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# Miscellaneous USB drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set + +# +# Bluetooth support +# +CONFIG_BLUEZ=y +CONFIG_BLUEZ_L2CAP=y + +# +# Bluetooth device drivers +# +# CONFIG_BLUEZ_HCIUSB is not set +CONFIG_BLUEZ_HCIUART=y +# CONFIG_BLUEZ_HCIVHCI is not set + +# +# Kernel hacking +# +# CONFIG_NO_FRAME_POINTER is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_INFO is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_NO_PGT_CACHE is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/cerfpod linux/arch/arm/def-configs/cerfpod --- v2.4.13/linux/arch/arm/def-configs/cerfpod Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/cerfpod Thu Oct 25 13:53:44 2001 @@ -0,0 +1,908 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# System Type +# +# CONFIG_ARCH_ANAKIN is not set +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_RPC is not set +CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_SHARK is not set + +# +# Archimedes/A5000 Implementations +# + +# +# Archimedes/A5000 Implementations (select only ONE) +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# +# Footbridge Implementations +# +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set +# CONFIG_SA1100_BRUTUS is not set +CONFIG_SA1100_CERF=y +# CONFIG_SA1100_CERF_8MB is not set +# CONFIG_SA1100_CERF_16MB is not set +CONFIG_SA1100_CERF_32MB=y +# CONFIG_SA1100_CERF_64MB is not set +# CONFIG_SA1100_CERF_FLASH_8MB is not set +CONFIG_SA1100_CERF_FLASH_16MB=y +# CONFIG_SA1100_CERF_FLASH_32MB is not set +# CONFIG_SA1100_CERF_CPLD is not set +# CONFIG_SA1100_H3600 is not set +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set +# CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_XP860 is not set +# CONFIG_SA1100_YOPY is not set +CONFIG_SA1100_USB=y +CONFIG_SA1100_USB_NETLINK=y +CONFIG_SA1100_USB_CHAR=y + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set +# CONFIG_ARCH_ACORN is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set + +# +# Processor Type +# +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +CONFIG_CPU_SA1100=y +# CONFIG_ARM_THUMB is not set +CONFIG_DISCONTIGMEM=y + +# +# General setup +# +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +CONFIG_CPU_FREQ=y +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=y +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +# CONFIG_PCMCIA_CLPS6700 is not set +CONFIG_PCMCIA_SA1100=y +CONFIG_NET=y +CONFIG_SYSVIPC=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_APM is not set +# CONFIG_ARTHUR is not set +CONFIG_CMDLINE="console=ttySA0 root=1f03 rw" +# CONFIG_PFS168_CMDLINE is not set +CONFIG_LEDS=y +CONFIG_LEDS_TIMER=y +CONFIG_LEDS_CPU=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_BOOTLDR_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_SUN_UFLASH is not set +# CONFIG_MTD_NORA is not set +# CONFIG_MTD_PNC2000 is not set +# CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set +# CONFIG_MTD_SC520CDP is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set +# CONFIG_MTD_ELAN_104NC is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_SOLUTIONENGINE is not set +# CONFIG_MTD_MIXMEM is not set +# CONFIG_MTD_OCTAGON is not set +# CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set +CONFIG_MTD_SA1100=y +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK=y +CONFIG_RTNETLINK=y +# CONFIG_NETLINK_DEV is not set +# CONFIG_NETFILTER is not set +CONFIG_FILTER=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_IP_MROUTE is not set +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set + +# +# +# +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set +CONFIG_NET_VENDOR_3COM=y +# CONFIG_EL1 is not set +# CONFIG_EL2 is not set +# CONFIG_ELPLUS is not set +# CONFIG_EL16 is not set +# CONFIG_ELMC is not set +# CONFIG_ELMC_II is not set +CONFIG_CERF_CS8900A=y +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_FMVJ18X is not set +CONFIG_PCMCIA_PCNET=y +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_ARCNET_COM20020_CS is not set +# CONFIG_PCMCIA_IBMTR is not set +# CONFIG_NET_PCMCIA_RADIO is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set +# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set +# CONFIG_BLK_DEV_IDEDISK_IBM is not set +# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set +# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set +# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set +# CONFIG_BLK_DEV_IDEDISK_WD is not set +# CONFIG_BLK_DEV_COMMERIAL is not set +# CONFIG_BLK_DEV_TIVO is not set +CONFIG_BLK_DEV_IDECS=m +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_IDE_CHIPSETS is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +CONFIG_VT=y +# CONFIG_VT_CONSOLE is not set +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +CONFIG_SERIAL_SA1100=y +CONFIG_SERIAL_SA1100_CONSOLE=y +CONFIG_SA1100_DEFAULT_BAUDRATE=38400 +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +CONFIG_UCB1200=y +CONFIG_TOUCHSCREEN_UCB1200=y +# CONFIG_CERF_TS_MANUAL is not set +CONFIG_AUDIO_UCB1200=y +# CONFIG_ADC_UCB1200 is not set +# CONFIG_TOUCHSCREEN_H3600 is not set +# CONFIG_PROFILER is not set +# CONFIG_PFS168_SPI is not set +# CONFIG_PFS168_DTMF is not set +# CONFIG_PFS168_MISC is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set +# CONFIG_BIT_SA1100_UCB1200 is not set + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set + +# +# L3 driver support +# +# CONFIG_L3_DRV_UDA1341 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# + +# +# Input core support is needed for joysticks +# +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +CONFIG_SA1100_RTC=y +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_UMSDOS_FS=y +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_MINIX_FS is not set +# CONFIG_FREEVXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +CONFIG_ROMFS_FS=y +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Console drivers +# +CONFIG_PC_KEYMAP=y +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +CONFIG_FB=y +CONFIG_DUMMY_CONSOLE=y +# CONFIG_FB_ACORN is not set +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_CLPS711X is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_SA1100=y +# CONFIG_CERF_LCD_38_A is not set +CONFIG_CERF_LCD_57_A=y +# CONFIG_CERF_LCD_72_A is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FBCON_ADVANCED is not set +CONFIG_FBCON_CFB2=y +CONFIG_FBCON_CFB4=y +CONFIG_FBCON_CFB8=y +CONFIG_FBCON_CFB16=y +# CONFIG_FBCON_FONTWIDTH8_ONLY is not set +# CONFIG_FBCON_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# +# CONFIG_USB_DABUSB is not set + +# +# USB Network adaptors +# +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# Miscellaneous USB drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +# CONFIG_NO_FRAME_POINTER is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_INFO is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_NO_PGT_CACHE is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/edb7211 linux/arch/arm/def-configs/edb7211 --- v2.4.13/linux/arch/arm/def-configs/edb7211 Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/edb7211 Thu Oct 25 13:53:44 2001 @@ -0,0 +1,401 @@ +# +# Automatically generated by make menuconfig: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +# CONFIG_MODULES is not set + +# +# System Type +# +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +CONFIG_ARCH_CLPS711X=y + +# +# Archimedes/A5000 Implementations +# + +# +# Footbridge Implementations +# + +# +# SA11x0 Implementations +# + +# +# CLPS711X/EP721X Implementations +# +CONFIG_ARCH_EDB7211=y +CONFIG_EP7211_BOOT_MODE=y +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_ACORN is not set +CONFIG_ARCH_EP7211=y +# CONFIG_ARCH_EP7212 is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +CONFIG_CPU_ARM720T=y +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +# CONFIG_CPU_SA1100 is not set +CONFIG_DISCONTIGMEM=y + +# +# General setup +# +# CONFIG_ANGELBOOT is not set +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +# CONFIG_HOTPLUG is not set +# CONFIG_PCMCIA is not set +CONFIG_NET=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_NWFPE=y +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_ARTHUR is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_INITRD=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK is not set +# CONFIG_NETFILTER is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_NET_SB1000 is not set + +# +# Ethernet (10 or 100Mbit) +# +# CONFIG_NET_ETHERNET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set + +# +# Character devices +# +# CONFIG_VT is not set +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_SERIAL_CLPS711X=y +CONFIG_SERIAL_CLPS711X_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_JOYSTICK is not set +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_FAT_FS is not set +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +# CONFIG_CRAMFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +CONFIG_MINIX_FS=y +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_SYSV_FS_WRITE is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_NFS_FS is not set +# CONFIG_NFS_V3 is not set +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_SUNRPC is not set +# CONFIG_LOCKD is not set +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +# CONFIG_MSDOS_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Kernel hacking +# +CONFIG_FRAME_POINTER=y +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_INFO is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_LL=y diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/epxa10db linux/arch/arm/def-configs/epxa10db --- v2.4.13/linux/arch/arm/def-configs/epxa10db Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/epxa10db Thu Oct 25 13:53:44 2001 @@ -0,0 +1,662 @@ +# +# Automatically generated by make menuconfig: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# System Type +# +# CONFIG_ARCH_ANAKIN is not set +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +CONFIG_ARCH_CAMELOT=y +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_SHARK is not set + +# +# Archimedes/A5000 Implementations +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# +# Footbridge Implementations +# +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set +# CONFIG_SA1100_BRUTUS is not set +# CONFIG_SA1100_CERF is not set +# CONFIG_SA1100_H3600 is not set +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set +# CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_XP860 is not set +# CONFIG_SA1100_YOPY is not set + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set +# CONFIG_ARCH_ACORN is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +CONFIG_CPU_ARM922T=y +CONFIG_CPU_ARM92X_CPU_IDLE=y +CONFIG_CPU_ARM92X_I_CACHE_ON=y +CONFIG_CPU_ARM92X_D_CACHE_ON=y +# CONFIG_CPU_ARM92X_WRITETHROUGH is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +# CONFIG_CPU_SA1100 is not set +# CONFIG_ARM_THUMB is not set +# CONFIG_DISCONTIGMEM is not set + +# +# General setup +# +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +# CONFIG_HOTPLUG is not set +# CONFIG_PCMCIA is not set +CONFIG_NET=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +CONFIG_BINFMT_AOUT=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_ARTHUR is not set +CONFIG_CMDLINE="console=ttyUA0,38400 root=/dev/mtdblock0 rw" +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +CONFIG_MTD_DEBUG=y +CONFIG_MTD_DEBUG_VERBOSE=0 +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_BOOTLDR_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_SUN_UFLASH is not set +# CONFIG_MTD_NORA is not set +# CONFIG_MTD_PNC2000 is not set +# CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set +# CONFIG_MTD_SC520CDP is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set +# CONFIG_MTD_ELAN_104NC is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +CONFIG_MTD_EPXA10DB=y +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_SOLUTIONENGINE is not set +# CONFIG_MTD_MIXMEM is not set +# CONFIG_MTD_OCTAGON is not set +# CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set +# CONFIG_MTD_SA1100 is not set +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_LOOP is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +# CONFIG_BLK_DEV_INITRD is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK is not set +# CONFIG_NETFILTER is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_ETHER00=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +CONFIG_PPP=y +CONFIG_PPP_MULTILINK=y +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_BSDCOMP=y +# CONFIG_PPPOE is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +# CONFIG_VT is not set +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +CONFIG_SERIAL_UART00=y +CONFIG_SERIAL_UART00_CONSOLE=y +# CONFIG_SERIAL_SA1100 is not set +# CONFIG_SERIAL_SA1100_CONSOLE is not set +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=256 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set +# CONFIG_L3_SA1111 is not set +# CONFIG_L3_DRV_UDA1341 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +# CONFIG_FAT_FS is not set +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_EFS_FS is not set +CONFIG_JFFS_FS=y +CONFIG_JFFS_FS_VERBOSE=0 +# CONFIG_JFFS2_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_TMPFS is not set +# CONFIG_RAMFS is not set +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_MINIX_FS is not set +# CONFIG_FREEVXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +CONFIG_ROMFS_FS=y +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_ROOT_NFS is not set +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# USB support +# +# CONFIG_USB is not set +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set +# CONFIG_USB_DABUSB is not set +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OMNINET is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +# CONFIG_NO_FRAME_POINTER is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_USER=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_NO_PGT_CACHE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/graphicsclient linux/arch/arm/def-configs/graphicsclient --- v2.4.13/linux/arch/arm/def-configs/graphicsclient Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/graphicsclient Thu Oct 25 13:53:44 2001 @@ -6,6 +6,8 @@ # CONFIG_SBUS is not set # CONFIG_MCA is not set CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set # # Code maturity level options @@ -23,16 +25,18 @@ # # System Type # +# CONFIG_ARCH_ANAKIN is not set # CONFIG_ARCH_ARCA5K is not set # CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_RPC is not set CONFIG_ARCH_SA1100=y -# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_SHARK is not set # # Archimedes/A5000 Implementations @@ -62,23 +66,28 @@ # CONFIG_SA1100_CERF is not set # CONFIG_SA1100_BITSY is not set # CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set # CONFIG_SA1100_FREEBIRD is not set CONFIG_SA1100_GRAPHICSCLIENT=y +# CONFIG_SA1100_JORNADA720 is not set # CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set # CONFIG_SA1100_LART is not set -# CONFIG_SA1100_PLEB is not set # CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set # CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set # CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set # CONFIG_SA1100_VICTOR is not set # CONFIG_SA1100_XP860 is not set # CONFIG_SA1100_YOPY is not set -# CONFIG_SA1100_PFS168 is not set -CONFIG_SA1100_USB=m -CONFIG_SA1100_USB_NETLINK=m -CONFIG_SA1100_USB_CHAR=m -# CONFIG_SA1100_FREQUENCY_SCALE is not set -# CONFIG_SA1100_VOLTAGE_SCALE is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +# CONFIG_SA1100_ADSBITSY is not set +# CONFIG_SA1100_USB is not set +# CONFIG_SA1100_USB_NETLINK is not set +# CONFIG_SA1100_USB_CHAR is not set # # CLPS711X/EP721X Implementations @@ -104,18 +113,15 @@ # CONFIG_CPU_SA110 is not set CONFIG_CPU_SA1100=y CONFIG_DISCONTIGMEM=y +# CONFIG_CPU_BIG_ENDIAN is not set # # General setup # - -# -# Please ensure that you have read the help on the next option -# -# CONFIG_ANGELBOOT is not set # CONFIG_PCI is not set # CONFIG_ISA is not set # CONFIG_ISA_DMA is not set +# CONFIG_CPU_FREQ is not set CONFIG_HOTPLUG=y # @@ -125,7 +131,7 @@ # CONFIG_I82365 is not set # CONFIG_TCIC is not set # CONFIG_PCMCIA_CLPS6700 is not set -CONFIG_PCMCIA_SA1100=m +CONFIG_PCMCIA_SA1100=y CONFIG_NET=y CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set @@ -138,12 +144,14 @@ CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set # CONFIG_PM is not set +# CONFIG_APM is not set # CONFIG_ARTHUR is not set -CONFIG_CMDLINE="root=nfs" +CONFIG_CMDLINE="ip=off" # CONFIG_PFS168_CMDLINE is not set -# CONFIG_LEDS is not set +CONFIG_LEDS=y +CONFIG_LEDS_TIMER=y +CONFIG_LEDS_CPU=y CONFIG_ALIGNMENT_TRAP=y -# CONFIG_UCB1200 is not set # # Parallel port support @@ -153,65 +161,87 @@ # # Memory Technology Devices (MTD) # -CONFIG_MTD=m +CONFIG_MTD=y # CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_BOOTLDR_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set # -# Disk-On-Chip Device Drivers +# User Modules And Translation Layers # -# CONFIG_MTD_DOC1000 is not set -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOCPROBE is not set +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set # -# RAM/ROM Device Drivers +# RAM/ROM/Flash chip drivers # -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_SLRAM is not set +CONFIG_MTD_CFI=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set -# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_JEDEC is not set # -# Linearly Mapped Flash Device Drivers +# Mapping drivers for chip access # -CONFIG_MTD_CFI=m -# CONFIG_MTD_CFI_ADV_OPTIONS is not set -CONFIG_MTD_CFI_INTELEXT=m -# CONFIG_MTD_CFI_AMDSTD is not set -# CONFIG_MTD_AMDSTD is not set -# CONFIG_MTD_SHARP is not set -# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=800000 +CONFIG_MTD_PHYSMAP_LEN=1000000 +CONFIG_MTD_PHYSMAP_BUSWIDTH=4 +# CONFIG_MTD_SUN_UFLASH is not set # CONFIG_MTD_NORA is not set # CONFIG_MTD_PNC2000 is not set # CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set # CONFIG_MTD_SC520CDP is not set -# CONFIG_MTD_SBC_MEDIAGX is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set # CONFIG_MTD_ELAN_104NC is not set -CONFIG_MTD_SA1100=m +CONFIG_MTD_SA1100=y +# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set +# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set # CONFIG_MTD_DC21285 is not set # CONFIG_MTD_IQ80310 is not set -# CONFIG_MTD_CSTM_CFI_JEDEC is not set -# CONFIG_MTD_JEDEC is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_SOLUTIONENGINE is not set # CONFIG_MTD_MIXMEM is not set # CONFIG_MTD_OCTAGON is not set # CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set # -# NAND Flash Device Drivers +# Self-contained MTD device drivers # -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_NAND_SPIA is not set +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set # -# User Modules And Translation Layers +# Disk-On-Chip Device Drivers # -CONFIG_MTD_CHAR=m -CONFIG_MTD_BLOCK=m -# CONFIG_MTD_BLOCK_RO is not set -# CONFIG_FTL is not set -# CONFIG_NFTL is not set +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set # # Plug and Play configuration @@ -258,6 +288,7 @@ # CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set CONFIG_IP_PNP_BOOTP=y # CONFIG_IP_PNP_RARP is not set # CONFIG_NET_IPIP is not set @@ -302,22 +333,25 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_NET_SB1000 is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_LANCE is not set CONFIG_NET_VENDOR_SMC=y # CONFIG_WD80x3 is not set +# CONFIG_ULTRAMCA is not set # CONFIG_ULTRA is not set # CONFIG_ULTRA32 is not set CONFIG_SMC9194=y # CONFIG_NET_VENDOR_RACAL is not set -# CONFIG_AT1700 is not set -# CONFIG_DEPCA is not set # CONFIG_NET_ISA is not set # CONFIG_NET_PCI is not set # CONFIG_NET_POCKET is not set @@ -326,11 +360,14 @@ # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set +# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_MYRI_SBUS is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set +# CONFIG_PLIP is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set @@ -359,7 +396,7 @@ # CONFIG_PCMCIA_3C589 is not set # CONFIG_PCMCIA_3C574 is not set # CONFIG_PCMCIA_FMVJ18X is not set -CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_PCNET=y # CONFIG_PCMCIA_NMCLAN is not set # CONFIG_PCMCIA_SMC91C92 is not set # CONFIG_PCMCIA_XIRC2PS is not set @@ -380,19 +417,19 @@ # # ATA/IDE/MFM/RLL support # -CONFIG_IDE=m +CONFIG_IDE=y # # IDE, ATA and ATAPI Block devices # -CONFIG_BLK_DEV_IDE=m +CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_HD_IDE is not set # CONFIG_BLK_DEV_HD is not set -CONFIG_BLK_DEV_IDEDISK=m +CONFIG_BLK_DEV_IDEDISK=y # CONFIG_IDEDISK_MULTI_MODE is not set # CONFIG_BLK_DEV_IDEDISK_VENDOR is not set # CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set @@ -403,7 +440,7 @@ # CONFIG_BLK_DEV_IDEDISK_WD is not set # CONFIG_BLK_DEV_COMMERIAL is not set # CONFIG_BLK_DEV_TIVO is not set -CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECS=y # CONFIG_BLK_DEV_IDECD is not set # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set @@ -452,19 +489,31 @@ # CONFIG_SERIAL is not set # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set CONFIG_SERIAL_SA1100=y CONFIG_SERIAL_SA1100_CONSOLE=y -CONFIG_SA1100_DEFAULT_BAUDRATE=9600 -# CONFIG_TOUCHSCREEN_UCB1200 is not set +CONFIG_SA1100_DEFAULT_BAUDRATE=38400 +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +CONFIG_UCB1200=y +CONFIG_TOUCHSCREEN_UCB1200=y +CONFIG_AUDIO_UCB1200=y +CONFIG_ADC_UCB1200=y # CONFIG_TOUCHSCREEN_BITSY is not set # CONFIG_PROFILER is not set # CONFIG_PFS168_SPI is not set # CONFIG_PFS168_DTMF is not set # CONFIG_PFS168_MISC is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=32 # # I2C support @@ -505,7 +554,10 @@ # CONFIG_FTAPE is not set # CONFIG_AGP is not set # CONFIG_DRM is not set -# CONFIG_PCMCIA_SERIAL is not set + +# +# PCMCIA character devices +# # # Multimedia devices @@ -525,20 +577,22 @@ # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set -CONFIG_FAT_FS=m -CONFIG_MSDOS_FS=m +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set # CONFIG_UMSDOS_FS is not set -CONFIG_VFAT_FS=m +CONFIG_VFAT_FS=y # CONFIG_EFS_FS is not set -CONFIG_JFFS_FS=m +CONFIG_JFFS_FS=y CONFIG_JFFS_FS_VERBOSE=0 -CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_CRAMFS is not set -CONFIG_RAMFS=m +CONFIG_CRAMFS=y +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set # CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -552,7 +606,6 @@ # CONFIG_ROMFS_FS is not set CONFIG_EXT2_FS=y # CONFIG_SYSV_FS is not set -# CONFIG_SYSV_FS_WRITE is not set # CONFIG_UDF_FS is not set # CONFIG_UDF_RW is not set # CONFIG_UFS_FS is not set @@ -607,11 +660,13 @@ # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set @@ -619,11 +674,12 @@ # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # @@ -631,7 +687,6 @@ # CONFIG_PC_KEYMAP=y # CONFIG_VGA_CONSOLE is not set -CONFIG_FB=y # # Frame-buffer support @@ -642,6 +697,8 @@ # CONFIG_FB_CLPS711X is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_SA1100=y +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_E1355 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FBCON_ADVANCED is not set CONFIG_FBCON_CFB2=y @@ -665,6 +722,11 @@ # USB support # # CONFIG_USB is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set # # Kernel hacking diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/graphicsmaster linux/arch/arm/def-configs/graphicsmaster --- v2.4.13/linux/arch/arm/def-configs/graphicsmaster Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/def-configs/graphicsmaster Thu Oct 25 13:53:44 2001 @@ -0,0 +1,755 @@ +# +# Automatically generated by make menuconfig: don't edit +# +CONFIG_ARM=y +# CONFIG_EISA is not set +# CONFIG_SBUS is not set +# CONFIG_MCA is not set +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_OBSOLETE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# System Type +# +# CONFIG_ARCH_ANAKIN is not set +# CONFIG_ARCH_ARCA5K is not set +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 is not set +# CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_FOOTBRIDGE is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_RPC is not set +CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_SHARK is not set + +# +# Archimedes/A5000 Implementations +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# +# Footbridge Implementations +# +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_BRUTUS is not set +# CONFIG_SA1100_CERF is not set +# CONFIG_SA1100_BITSY is not set +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set +# CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_XP860 is not set +# CONFIG_SA1100_YOPY is not set +CONFIG_SA1100_GRAPHICSMASTER=y +# CONFIG_SA1100_ADSBITSY is not set +CONFIG_SA1111=y +# CONFIG_SA1100_USB is not set +# CONFIG_SA1100_USB_NETLINK is not set +# CONFIG_SA1100_USB_CHAR is not set + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_ACORN is not set +# CONFIG_FOOTBRIDGE is not set +# CONFIG_FOOTBRIDGE_HOST is not set +# CONFIG_FOOTBRIDGE_ADDIN is not set +CONFIG_CPU_32=y +# CONFIG_CPU_26 is not set +# CONFIG_CPU_32v3 is not set +CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set +CONFIG_CPU_SA1100=y +CONFIG_DISCONTIGMEM=y +# CONFIG_CPU_BIG_ENDIAN is not set + +# +# General setup +# +# CONFIG_PCI is not set +# CONFIG_ISA is not set +# CONFIG_ISA_DMA is not set +# CONFIG_CPU_FREQ is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=y +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +# CONFIG_PCMCIA_CLPS6700 is not set +CONFIG_PCMCIA_SA1100=y +CONFIG_NET=y +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set +# CONFIG_APM is not set +# CONFIG_ARTHUR is not set +CONFIG_CMDLINE="ip=off" +# CONFIG_PFS168_CMDLINE is not set +CONFIG_LEDS=y +CONFIG_LEDS_TIMER=y +CONFIG_LEDS_CPU=y +CONFIG_ALIGNMENT_TRAP=y + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_BOOTLDR_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_JEDEC is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=800000 +CONFIG_MTD_PHYSMAP_LEN=1000000 +CONFIG_MTD_PHYSMAP_BUSWIDTH=4 +# CONFIG_MTD_SUN_UFLASH is not set +# CONFIG_MTD_NORA is not set +# CONFIG_MTD_PNC2000 is not set +# CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set +# CONFIG_MTD_SC520CDP is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set +# CONFIG_MTD_ELAN_104NC is not set +CONFIG_MTD_SA1100=y +# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set +# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_SOLUTIONENGINE is not set +# CONFIG_MTD_MIXMEM is not set +# CONFIG_MTD_OCTAGON is not set +# CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_BLK_DEV_DAC960 is not set +CONFIG_BLK_DEV_LOOP=m +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +# CONFIG_NETLINK is not set +# CONFIG_NETFILTER is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_IPV6 is not set +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +# CONFIG_NET_SCHED is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +CONFIG_NET_VENDOR_SMC=y +# CONFIG_WD80x3 is not set +# CONFIG_ULTRAMCA is not set +# CONFIG_ULTRA is not set +# CONFIG_ULTRA32 is not set +CONFIG_SMC9194=y +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +# CONFIG_SHAPER is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +# CONFIG_PCMCIA_3C589 is not set +# CONFIG_PCMCIA_3C574 is not set +# CONFIG_PCMCIA_FMVJ18X is not set +CONFIG_PCMCIA_PCNET=y +# CONFIG_PCMCIA_NMCLAN is not set +# CONFIG_PCMCIA_SMC91C92 is not set +# CONFIG_PCMCIA_XIRC2PS is not set +# CONFIG_ARCNET_COM20020_CS is not set +# CONFIG_PCMCIA_IBMTR is not set +# CONFIG_NET_PCMCIA_RADIO is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ATA/IDE/MFM/RLL support +# +CONFIG_IDE=y + +# +# IDE, ATA and ATAPI Block devices +# +CONFIG_BLK_DEV_IDE=y +# CONFIG_BLK_DEV_HD_IDE is not set +# CONFIG_BLK_DEV_HD is not set +CONFIG_BLK_DEV_IDEDISK=y +# CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set +# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set +# CONFIG_BLK_DEV_IDEDISK_IBM is not set +# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set +# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set +# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set +# CONFIG_BLK_DEV_IDEDISK_WD is not set +# CONFIG_BLK_DEV_COMMERIAL is not set +# CONFIG_BLK_DEV_TIVO is not set +CONFIG_BLK_DEV_IDECS=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_BLK_DEV_CMD640 is not set +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +# CONFIG_BLK_DEV_ISAPNP is not set +# CONFIG_IDE_CHIPSETS is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_IDE_MODES is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +CONFIG_INPUT=y +# CONFIG_INPUT_KEYBDEV is not set +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +CONFIG_VT=y +# CONFIG_VT_CONSOLE is not set +# CONFIG_SERIAL is not set +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +CONFIG_SERIAL_SA1100=y +CONFIG_SERIAL_SA1100_CONSOLE=y +CONFIG_SA1100_DEFAULT_BAUDRATE=38400 +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +CONFIG_UCB1200=y +CONFIG_TOUCHSCREEN_UCB1200=y +CONFIG_AUDIO_UCB1200=y +CONFIG_ADC_UCB1200=y +# CONFIG_TOUCHSCREEN_BITSY is not set +# CONFIG_PROFILER is not set +# CONFIG_PFS168_SPI is not set +# CONFIG_PFS168_DTMF is not set +# CONFIG_PFS168_MISC is not set + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_JOYSTICK is not set +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +# CONFIG_WATCHDOG is not set +# CONFIG_INTEL_RNG is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_SA1100_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# PCMCIA character devices +# + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# File systems +# +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BFS_FS is not set +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +CONFIG_VFAT_FS=y +# CONFIG_EFS_FS is not set +CONFIG_JFFS_FS=y +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_CRAMFS=y +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +# CONFIG_DEVFS_FS is not set +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS=y +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +CONFIG_EXT2_FS=y +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +CONFIG_SUNRPC=y +CONFIG_LOCKD=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_SMB_NLS is not set +CONFIG_NLS=y + +# +# Native Language Support +# +CONFIG_NLS_DEFAULT="iso8859-1" +# CONFIG_NLS_CODEPAGE_437 is not set +# CONFIG_NLS_CODEPAGE_737 is not set +# CONFIG_NLS_CODEPAGE_775 is not set +# CONFIG_NLS_CODEPAGE_850 is not set +# CONFIG_NLS_CODEPAGE_852 is not set +# CONFIG_NLS_CODEPAGE_855 is not set +# CONFIG_NLS_CODEPAGE_857 is not set +# CONFIG_NLS_CODEPAGE_860 is not set +# CONFIG_NLS_CODEPAGE_861 is not set +# CONFIG_NLS_CODEPAGE_862 is not set +# CONFIG_NLS_CODEPAGE_863 is not set +# CONFIG_NLS_CODEPAGE_864 is not set +# CONFIG_NLS_CODEPAGE_865 is not set +# CONFIG_NLS_CODEPAGE_866 is not set +# CONFIG_NLS_CODEPAGE_869 is not set +# CONFIG_NLS_CODEPAGE_936 is not set +# CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set +# CONFIG_NLS_ISO8859_1 is not set +# CONFIG_NLS_ISO8859_2 is not set +# CONFIG_NLS_ISO8859_3 is not set +# CONFIG_NLS_ISO8859_4 is not set +# CONFIG_NLS_ISO8859_5 is not set +# CONFIG_NLS_ISO8859_6 is not set +# CONFIG_NLS_ISO8859_7 is not set +# CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set +# CONFIG_NLS_ISO8859_14 is not set +# CONFIG_NLS_ISO8859_15 is not set +# CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set +# CONFIG_NLS_UTF8 is not set + +# +# Console drivers +# +CONFIG_PC_KEYMAP=y +# CONFIG_VGA_CONSOLE is not set + +# +# Frame-buffer support +# +CONFIG_FB=y +CONFIG_DUMMY_CONSOLE=y +# CONFIG_FB_ACORN is not set +# CONFIG_FB_CLPS711X is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_SA1100=y +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_E1355 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FBCON_ADVANCED is not set +CONFIG_FBCON_CFB2=y +CONFIG_FBCON_CFB4=y +CONFIG_FBCON_CFB8=y +CONFIG_FBCON_CFB16=y +CONFIG_FBCON_FONTWIDTH8_ONLY=y +CONFIG_FBCON_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x16=y +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +CONFIG_USB_OHCI=y +CONFIG_USB_OHCI_NOPCI=y +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# CONFIG_USB_HID is not set +# CONFIG_USB_KBD is not set +CONFIG_USB_MOUSE=y +# CONFIG_USB_WACOM is not set +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_IBMCAM is not set +# CONFIG_USB_OV511 is not set +# CONFIG_USB_PWC is not set +# CONFIG_USB_SE401 is not set +# CONFIG_USB_DSBR is not set +# CONFIG_USB_DABUSB is not set +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_NET1080 is not set +# CONFIG_USB_USBNET is not set +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_RIO500 is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +# CONFIG_NO_FRAME_POINTER is not set +CONFIG_DEBUG_ERRORS=y +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_NO_PGT_CACHE is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/h3600 linux/arch/arm/def-configs/h3600 --- v2.4.13/linux/arch/arm/def-configs/h3600 Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/h3600 Thu Oct 25 13:53:44 2001 @@ -2,8 +2,14 @@ # Automatically generated make config: don't edit # CONFIG_ARM=y +# CONFIG_EISA is not set # CONFIG_SBUS is not set +# CONFIG_MCA is not set CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_GENERIC_BUST_SPINLOCK is not set +# CONFIG_GENERIC_ISA_DMA is not set # # Code maturity level options @@ -16,46 +22,85 @@ # CONFIG_MODULES=y # CONFIG_MODVERSIONS is not set -CONFIG_KMOD=y +# CONFIG_KMOD is not set # # System Type # +# CONFIG_ARCH_ANAKIN is not set # CONFIG_ARCH_ARCA5K is not set # CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_RPC is not set CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_SHARK is not set # # Archimedes/A5000 Implementations # # +# Archimedes/A5000 Implementations (select only ONE) +# +# CONFIG_ARCH_ARC is not set +# CONFIG_ARCH_A5K is not set + +# # Footbridge Implementations # +# CONFIG_ARCH_CATS is not set +# CONFIG_ARCH_PERSONAL_SERVER is not set +# CONFIG_ARCH_EBSA285_ADDIN is not set +# CONFIG_ARCH_EBSA285_HOST is not set +# CONFIG_ARCH_NETWINDER is not set # # SA11x0 Implementations # # CONFIG_SA1100_ASSABET is not set +# CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set # CONFIG_SA1100_BRUTUS is not set # CONFIG_SA1100_CERF is not set -CONFIG_SA1100_BITSY=y -# CONFIG_SA1100_LART is not set +CONFIG_SA1100_H3600=y +# CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set +# CONFIG_SA1100_FREEBIRD is not set # CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set +# CONFIG_SA1100_LART is not set # CONFIG_SA1100_NANOENGINE is not set -# CONFIG_SA1100_VICTOR is not set +# CONFIG_SA1100_OMNIMETER is not set +# CONFIG_SA1100_PANGOLIN is not set +# CONFIG_SA1100_PLEB is not set # CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_PFS168 is not set +# CONFIG_SA1100_VICTOR is not set # CONFIG_SA1100_XP860 is not set -# CONFIG_SA1100_PANGOLIN is not set -# CONFIG_ANGELBOOT is not set +# CONFIG_SA1100_YOPY is not set CONFIG_SA1100_USB=m -CONFIG_SA1100_FREQUENCY_SCALE=y -# CONFIG_SA1100_VOLTAGE_SCALE is not set +CONFIG_SA1100_USB_NETLINK=m +# CONFIG_SA1100_USB_CHAR is not set + +# +# CLPS711X/EP721X Implementations +# +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set +# CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set # CONFIG_ARCH_ACORN is not set # CONFIG_FOOTBRIDGE is not set # CONFIG_FOOTBRIDGE_HOST is not set @@ -66,42 +111,55 @@ # # Processor Type # +# CONFIG_CPU_32v3 is not set CONFIG_CPU_32v4=y +# CONFIG_CPU_ARM610 is not set +# CONFIG_CPU_ARM710 is not set +# CONFIG_CPU_ARM720T is not set +# CONFIG_CPU_ARM920T is not set +# CONFIG_CPU_ARM1020 is not set +# CONFIG_CPU_SA110 is not set CONFIG_CPU_SA1100=y +# CONFIG_ARM_THUMB is not set CONFIG_DISCONTIGMEM=y # # General setup # # CONFIG_PCI is not set -# CONFIG_ISA is not set +CONFIG_ISA=y # CONFIG_ISA_DMA is not set -CONFIG_PC_KEYMAP=y +CONFIG_CPU_FREQ=y CONFIG_HOTPLUG=y # # PCMCIA/CardBus support # -CONFIG_PCMCIA=m -CONFIG_PCMCIA_DEBUG=y -PCMCIA_DEBUG=1 -CONFIG_SA1100_PCMCIA=y -CONFIG_VIRTUAL_BUS=y +CONFIG_PCMCIA=y +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +# CONFIG_PCMCIA_CLPS6700 is not set +CONFIG_PCMCIA_SA1100=y CONFIG_NET=y CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y -CONFIG_NWFPE=y + +# +# At least one math emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_FASTFPE is not set CONFIG_KCORE_ELF=y # CONFIG_KCORE_AOUT is not set -CONFIG_BINFMT_AOUT=y +# CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set CONFIG_PM=y # CONFIG_ARTHUR is not set CONFIG_CMDLINE="" # CONFIG_LEDS is not set -# CONFIG_ALIGNMENT_TRAP is not set +CONFIG_ALIGNMENT_TRAP=y # # Parallel port support @@ -112,50 +170,86 @@ # Memory Technology Devices (MTD) # CONFIG_MTD=y -# CONFIG_MTD_DOC1000 is not set -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOCPROBE is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_REDBOOT_PARTS=y +CONFIG_MTD_BOOTLDR_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set # -# MTD drivers for mapped chips +# User Modules And Translation Layers # -CONFIG_MTD_CFI=m -CONFIG_MTD_CFI_INTELEXT=m -CONFIG_MTD_CFI_AMDSTD=m -# CONFIG_MTD_JEDEC is not set +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_B1 is not set +# CONFIG_MTD_CFI_B2 is not set +CONFIG_MTD_CFI_B4=y +# CONFIG_MTD_CFI_I1 is not set +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +CONFIG_MTD_CFI_INTELEXT=y +# CONFIG_MTD_CFI_AMDSTD is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set -CONFIG_MTD_PHYSMAP=m -CONFIG_MTD_PHYSMAP_START=0 -CONFIG_MTD_PHYSMAP_LEN=0 +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set +# CONFIG_MTD_JEDEC is not set # -# Drivers for chip mappings +# Mapping drivers for chip access # -# CONFIG_MTD_MIXMEM is not set +# CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_NORA is not set -# CONFIG_MTD_OCTAGON is not set -# CONFIG_MTD_PNC2000 is not set -# CONFIG_MTD_RPXLITE is not set -# CONFIG_MTD_VMAX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set +CONFIG_MTD_SA1100=y +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set +# CONFIG_MTD_PCI is not set # -# User modules and translation layers for MTD devices +# Self-contained MTD device drivers # -CONFIG_MTD_CHAR=m -CONFIG_MTD_BLOCK=m -# CONFIG_FTL is not set -# CONFIG_NFTL is not set +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set # # Plug and Play configuration # # CONFIG_PNP is not set # CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set # # Block devices @@ -164,39 +258,41 @@ # CONFIG_BLK_DEV_XD is not set # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set # CONFIG_BLK_DEV_DAC960 is not set CONFIG_BLK_DEV_LOOP=m -CONFIG_BLK_DEV_NBD=m -# CONFIG_BLK_DEV_LVM is not set +# CONFIG_BLK_DEV_NBD is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set # CONFIG_BLK_DEV_MD is not set # CONFIG_MD_LINEAR is not set # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID5 is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_SIZE=4096 -CONFIG_BLK_DEV_INITRD=y -CONFIG_BLK_DEV_FLASH=y +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set # # Networking options # -CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -CONFIG_NETLINK=y -CONFIG_RTNETLINK=y -CONFIG_NETLINK_DEV=y +# CONFIG_PACKET is not set +# CONFIG_NETLINK is not set # CONFIG_NETFILTER is not set # CONFIG_FILTER is not set CONFIG_UNIX=y CONFIG_INET=y -CONFIG_IP_MULTICAST=y +# CONFIG_IP_MULTICAST is not set # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set -# CONFIG_IP_MROUTE is not set -# CONFIG_ARPD is not set # CONFIG_INET_ECN is not set # CONFIG_SYN_COOKIES is not set # CONFIG_IPV6 is not set @@ -213,6 +309,7 @@ # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_NET_FASTROUTE is not set @@ -236,8 +333,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set -# CONFIG_NET_SB1000 is not set # # Ethernet (10 or 100Mbit) @@ -247,13 +342,19 @@ # # Ethernet (1000 Mbit) # -# CONFIG_YELLOWFIN is not set # CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set +# CONFIG_PLIP is not set CONFIG_PPP=m # CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set CONFIG_PPP_ASYNC=m # CONFIG_PPP_SYNC_TTY is not set CONFIG_PPP_DEFLATE=m @@ -286,17 +387,13 @@ # CONFIG_PCMCIA_3C589 is not set # CONFIG_PCMCIA_3C574 is not set # CONFIG_PCMCIA_FMVJ18X is not set -CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_PCNET=y # CONFIG_PCMCIA_NMCLAN is not set # CONFIG_PCMCIA_SMC91C92 is not set # CONFIG_PCMCIA_XIRC2PS is not set # CONFIG_ARCNET_COM20020_CS is not set # CONFIG_PCMCIA_IBMTR is not set -CONFIG_NET_PCMCIA_RADIO=y -# CONFIG_PCMCIA_RAYCS is not set -# CONFIG_PCMCIA_NETWAVE is not set -# CONFIG_PCMCIA_WAVELAN is not set -# CONFIG_AIRONET4500_CS is not set +# CONFIG_NET_PCMCIA_RADIO is not set # # Amateur Radio support @@ -306,7 +403,43 @@ # # IrDA (infrared) support # -# CONFIG_IRDA is not set +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set +# CONFIG_IRDA_OPTIONS is not set + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +# CONFIG_IRTTY_SIR is not set +# CONFIG_IRPORT_SIR is not set + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_NSC_FIR is not set +# CONFIG_WINBOND_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_SMC_IRCC_FIR is not set +# CONFIG_ALI_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_SA1100_FIR=m # # ATA/IDE/MFM/RLL support @@ -334,10 +467,10 @@ # CONFIG_BLK_DEV_IDEDISK_WD is not set # CONFIG_BLK_DEV_COMMERIAL is not set # CONFIG_BLK_DEV_TIVO is not set -CONFIG_BLK_DEV_IDECS=m +# CONFIG_BLK_DEV_IDECS is not set CONFIG_BLK_DEV_IDECD=m -CONFIG_BLK_DEV_IDETAPE=m -CONFIG_BLK_DEV_IDEFLOPPY=m +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set # @@ -350,6 +483,9 @@ # CONFIG_IDEDMA_AUTO is not set # CONFIG_DMA_NONPCI is not set # CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set # # SCSI support @@ -374,20 +510,47 @@ # Input core support # # CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set # # Character devices # CONFIG_VT=y -CONFIG_VT_CONSOLE=y -# CONFIG_SERIAL is not set +# CONFIG_VT_CONSOLE is not set +CONFIG_SERIAL=m # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_UART00 is not set +# CONFIG_SERIAL_UART00_CONSOLE is not set CONFIG_SERIAL_SA1100=y CONFIG_SERIAL_SA1100_CONSOLE=y -CONFIG_SA1100_DEFAULT_BAUDRATE=115200 -# CONFIG_TOUCHSCREEN_UCB1200 is not set -CONFIG_TOUCHSCREEN_BITSY=y +CONFIG_SA1100_DEFAULT_BAUDRATE=38400 +CONFIG_SERIAL_8250=m +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=32 @@ -397,15 +560,35 @@ # CONFIG_I2C is not set # +# L3 serial bus support +# +CONFIG_L3=y +CONFIG_L3_ALGOBIT=y +CONFIG_L3_BIT_SA1100_GPIO=y + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set +CONFIG_BIT_SA1100_GPIO=y + +# # Mice # # CONFIG_BUSMOUSE is not set -# CONFIG_MOUSE is not set +CONFIG_MOUSE=m +# CONFIG_PSMOUSE is not set +# CONFIG_82C710_MOUSE is not set +# CONFIG_PC110_PAD is not set # # Joysticks # -# CONFIG_JOYSTICK is not set +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# # # Input core support is needed for joysticks @@ -419,6 +602,7 @@ # CONFIG_INTEL_RNG is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set +CONFIG_SA1100_RTC=m # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set @@ -429,7 +613,17 @@ # CONFIG_FTAPE is not set # CONFIG_AGP is not set # CONFIG_DRM is not set -# CONFIG_PCMCIA_SERIAL is not set + +# +# PCMCIA character devices +# +# CONFIG_PCMCIA_SERIAL_CS is not set +# CONFIG_MWAVE is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set # # File systems @@ -437,23 +631,33 @@ # CONFIG_QUOTA is not set # CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set # CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m # CONFIG_UMSDOS_FS is not set CONFIG_VFAT_FS=m # CONFIG_EFS_FS is not set -CONFIG_JFFS_FS=m -CONFIG_JFFS_FS_VERBOSE=2 -CONFIG_CRAMFS=y +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_CRAMFS=m +# CONFIG_TMPFS is not set CONFIG_RAMFS=y # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set +# CONFIG_FREEVXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -467,7 +671,6 @@ # CONFIG_ROMFS_FS is not set CONFIG_EXT2_FS=y # CONFIG_SYSV_FS is not set -# CONFIG_SYSV_FS_WRITE is not set # CONFIG_UDF_FS is not set # CONFIG_UDF_RW is not set # CONFIG_UFS_FS is not set @@ -477,15 +680,16 @@ # Network File Systems # # CONFIG_CODA_FS is not set -CONFIG_NFS_FS=m +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=y # CONFIG_NFS_V3 is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=m # CONFIG_NFSD_V3 is not set -CONFIG_SUNRPC=m -CONFIG_LOCKD=m +CONFIG_SUNRPC=y +CONFIG_LOCKD=y CONFIG_SMB_FS=m -CONFIG_SMB_NLS_REMOTE="" +# CONFIG_SMB_NLS_DEFAULT is not set # CONFIG_NCP_FS is not set # CONFIG_NCPFS_PACKET_SIGNING is not set # CONFIG_NCPFS_IOCTL_LOCKING is not set @@ -493,16 +697,17 @@ # CONFIG_NCPFS_NFS_NS is not set # CONFIG_NCPFS_OS2_NS is not set # CONFIG_NCPFS_SMALLDOS is not set -# CONFIG_NCPFS_MOUNT_SUBDIR is not set -# CONFIG_NCPFS_NDS_DOMAINS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +CONFIG_ZLIB_FS_INFLATE=m # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y +CONFIG_SMB_NLS=y CONFIG_NLS=y # @@ -524,11 +729,13 @@ # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_950 is not set +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set @@ -536,69 +743,219 @@ # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # # Console drivers # +CONFIG_PC_KEYMAP=y # CONFIG_VGA_CONSOLE is not set -CONFIG_FB=y # # Frame-buffer support # CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y -# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ACORN is not set +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_CLPS711X is not set CONFIG_FB_SA1100=y +# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_VIRTUAL is not set -# CONFIG_FBCON_ADVANCED is not set -CONFIG_FBCON_CFB2=y -CONFIG_FBCON_CFB4=y -CONFIG_FBCON_CFB8=y +CONFIG_FBCON_ADVANCED=y +# CONFIG_FBCON_MFB is not set +# CONFIG_FBCON_CFB2 is not set +# CONFIG_FBCON_CFB4 is not set +# CONFIG_FBCON_CFB8 is not set CONFIG_FBCON_CFB16=y -# CONFIG_FBCON_FONTWIDTH8_ONLY is not set -# CONFIG_FBCON_FONTS is not set +# CONFIG_FBCON_CFB24 is not set +# CONFIG_FBCON_CFB32 is not set +# CONFIG_FBCON_AFB is not set +# CONFIG_FBCON_ILBM is not set +# CONFIG_FBCON_IPLAN2P2 is not set +# CONFIG_FBCON_IPLAN2P4 is not set +# CONFIG_FBCON_IPLAN2P8 is not set +# CONFIG_FBCON_MAC is not set +# CONFIG_FBCON_VGA_PLANES is not set +# CONFIG_FBCON_VGA is not set +# CONFIG_FBCON_HGA is not set +CONFIG_FBCON_FONTWIDTH8_ONLY=y +CONFIG_FBCON_FONTS=y CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y +# CONFIG_FONT_8x16 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set # # Sound # -CONFIG_SOUND=m -CONFIG_SOUND_UDA1341=m -# CONFIG_SOUND_SA1100_SSP is not set +CONFIG_SOUND=y +# CONFIG_SOUND_BT878 is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set +# CONFIG_MIDI_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set +# CONFIG_SOUND_CS4281 is not set # CONFIG_SOUND_ES1370 is not set # CONFIG_SOUND_ES1371 is not set # CONFIG_SOUND_ESSSOLO1 is not set # CONFIG_SOUND_MAESTRO is not set +# CONFIG_SOUND_MAESTRO3 is not set +# CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_VIA82CXXX is not set +# CONFIG_MIDI_VIA82CXXX is not set +CONFIG_SOUND_SA1100=y +CONFIG_SOUND_UDA1341=y +# CONFIG_SOUND_ASSABET_UDA1341 is not set +CONFIG_SOUND_H3600_UDA1341=y +# CONFIG_SOUND_PANGOLIN_UDA1341 is not set +# CONFIG_SOUND_SA1111_UDA1341 is not set +# CONFIG_SOUND_SA1100SSP is not set # CONFIG_SOUND_OSS is not set +# CONFIG_SOUND_WAVEARTIST is not set # CONFIG_SOUND_TVMIXER is not set # +# Multimedia Capabilities Port drivers +# +# CONFIG_MCP is not set +# CONFIG_MCP_SA1100 is not set +# CONFIG_MCP_UCB1200 is not set +# CONFIG_MCP_UCB1200_AUDIO is not set +# CONFIG_MCP_UCB1200_TS is not set + +# # USB support # # CONFIG_USB is not set # +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network adaptors +# +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# # Kernel hacking # -CONFIG_FRAME_POINTER=y +# CONFIG_NO_FRAME_POINTER is not set CONFIG_DEBUG_ERRORS=y # CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_INFO is not set -# CONFIG_MAGIC_SYSRQ is not set -CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_NO_PGT_CACHE is not set +# CONFIG_DEBUG_LL is not set +# CONFIG_DEBUG_DC21285_PORT is not set +# CONFIG_DEBUG_CLPS711X_UART2 is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/lart linux/arch/arm/def-configs/lart --- v2.4.13/linux/arch/arm/def-configs/lart Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/lart Thu Oct 25 13:53:44 2001 @@ -62,13 +62,15 @@ # # CONFIG_SA1100_ASSABET is not set # CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set # CONFIG_SA1100_BRUTUS is not set # CONFIG_SA1100_CERF is not set -# CONFIG_SA1100_BITSY is not set +# CONFIG_SA1100_H3600 is not set # CONFIG_SA1100_EXTENEX1 is not set # CONFIG_SA1100_FLEXANET is not set # CONFIG_SA1100_FREEBIRD is not set # CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set # CONFIG_SA1100_JORNADA720 is not set # CONFIG_SA1100_HUW_WEBPANEL is not set # CONFIG_SA1100_ITSY is not set @@ -90,7 +92,12 @@ # # CLPS711X/EP721X Implementations # +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set # CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set # CONFIG_ARCH_ACORN is not set # CONFIG_FOOTBRIDGE is not set # CONFIG_FOOTBRIDGE_HOST is not set @@ -126,6 +133,10 @@ CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# CONFIG_FPE_NWFPE=y # CONFIG_FPE_FASTFPE is not set CONFIG_KCORE_ELF=y @@ -136,7 +147,7 @@ CONFIG_PM=y CONFIG_APM=m # CONFIG_ARTHUR is not set -CONFIG_CMDLINE="console=ttySA0,9600" +CONFIG_CMDLINE="console=ttySA0,9600 root=/dev/ram" # CONFIG_PFS168_CMDLINE is not set CONFIG_LEDS=y # CONFIG_LEDS_TIMER is not set @@ -151,10 +162,10 @@ # # Memory Technology Devices (MTD) # -CONFIG_MTD=m +CONFIG_MTD=y CONFIG_MTD_DEBUG=y CONFIG_MTD_DEBUG_VERBOSE=1 -# CONFIG_MTD_PARTITIONS is not set +CONFIG_MTD_PARTITIONS=y # CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_BOOTLDR_PARTS is not set # CONFIG_MTD_AFS_PARTS is not set @@ -162,28 +173,16 @@ # # User Modules And Translation Layers # -CONFIG_MTD_CHAR=m -CONFIG_MTD_BLOCK=m -CONFIG_MTD_BLOCK_RO=m +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y # CONFIG_FTL is not set # CONFIG_NFTL is not set # # RAM/ROM/Flash chip drivers # -CONFIG_MTD_CFI=m -CONFIG_MTD_CFI_ADV_OPTIONS=y -CONFIG_MTD_CFI_NOSWAP=y -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -CONFIG_MTD_CFI_GEOMETRY=y -# CONFIG_MTD_CFI_B1 is not set -# CONFIG_MTD_CFI_B2 is not set -CONFIG_MTD_CFI_B4=y -# CONFIG_MTD_CFI_I1 is not set -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -CONFIG_MTD_CFI_INTELEXT=m +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_CFI_INTELEXT is not set # CONFIG_MTD_CFI_AMDSTD is not set # CONFIG_MTD_AMDSTD is not set # CONFIG_MTD_SHARP is not set @@ -204,28 +203,27 @@ # CONFIG_MTD_NETSC520 is not set # CONFIG_MTD_SBC_GXX is not set # CONFIG_MTD_ELAN_104NC is not set -# CONFIG_MTD_SA1100 is not set -# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set -# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set -# CONFIG_MTD_DC21285 is not set -# CONFIG_MTD_IQ80310 is not set # CONFIG_MTD_DBOX2 is not set # CONFIG_MTD_CSTM_MIPS_IXX is not set # CONFIG_MTD_CFI_FLAGADM is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set # CONFIG_MTD_SOLUTIONENGINE is not set # CONFIG_MTD_MIXMEM is not set # CONFIG_MTD_OCTAGON is not set # CONFIG_MTD_VMAX is not set # CONFIG_MTD_OCELOT is not set # CONFIG_MTD_L440GX is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set +# CONFIG_MTD_SA1100 is not set +# CONFIG_MTD_DC21285 is not set +# CONFIG_MTD_IQ80310 is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_LART is not set +CONFIG_MTD_LART=y # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLKMTD is not set @@ -247,6 +245,7 @@ # # CONFIG_PNP is not set # CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set # # Block devices @@ -296,7 +295,7 @@ # CONFIG_ATM is not set # -# +# # # CONFIG_IPX is not set # CONFIG_ATALK is not set @@ -351,8 +350,9 @@ # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set -# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_DL2K is not set # CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set @@ -439,6 +439,8 @@ # CONFIG_WINBOND_FIR is not set # CONFIG_TOSHIBA_FIR is not set # CONFIG_SMC_IRCC_FIR is not set +# CONFIG_ALI_FIR is not set +# CONFIG_VLSI_FIR is not set CONFIG_SA1100_FIR=m # @@ -483,6 +485,9 @@ # CONFIG_IDEDMA_AUTO is not set # CONFIG_DMA_NONPCI is not set # CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set # # SCSI support @@ -507,6 +512,10 @@ # Input core support # # CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set # # Character devices @@ -515,18 +524,30 @@ # CONFIG_SERIAL is not set # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_21285 is not set -# CONFIG_SERIAL_21285_OLD is not set -# CONFIG_SERIAL_21285_CONSOLE is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set # CONFIG_SERIAL_AMBA is not set # CONFIG_SERIAL_AMBA_CONSOLE is not set # CONFIG_SERIAL_CLPS711X is not set # CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set CONFIG_SERIAL_SA1100=y CONFIG_SERIAL_SA1100_CONSOLE=y CONFIG_SA1100_DEFAULT_BAUDRATE=9600 # CONFIG_SERIAL_8250 is not set # CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y @@ -535,7 +556,7 @@ CONFIG_TOUCHSCREEN_UCB1200=m CONFIG_AUDIO_UCB1200=m CONFIG_ADC_UCB1200=m -# CONFIG_TOUCHSCREEN_BITSY is not set +# CONFIG_TOUCHSCREEN_H3600 is not set CONFIG_PROFILER=m # CONFIG_PFS168_SPI is not set # CONFIG_PFS168_DTMF is not set @@ -547,6 +568,24 @@ # CONFIG_I2C is not set # +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set + +# +# L3 driver support +# +# CONFIG_L3_DRV_UDA1341 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# # Mice # # CONFIG_BUSMOUSE is not set @@ -555,7 +594,11 @@ # # Joysticks # -# CONFIG_JOYSTICK is not set +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# # # Input core support is needed for joysticks @@ -573,6 +616,7 @@ # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set # # Ftape, the floppy tape device driver @@ -594,18 +638,22 @@ # CONFIG_AUTOFS4_FS is not set CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set # CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +CONFIG_EXT3_FS=m +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set # CONFIG_FAT_FS is not set # CONFIG_MSDOS_FS is not set # CONFIG_UMSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_EFS_FS is not set -CONFIG_JFFS_FS=m -CONFIG_JFFS_FS_VERBOSE=1 +# CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=m CONFIG_JFFS2_FS_DEBUG=1 CONFIG_CRAMFS=m @@ -614,7 +662,7 @@ CONFIG_ISO9660_FS=m CONFIG_JOLIET=y # CONFIG_MINIX_FS is not set -# CONFIG_VXFS_FS is not set +# CONFIG_FREEVXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -637,6 +685,7 @@ # Network File Systems # # CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=m CONFIG_NFS_V3=y # CONFIG_ROOT_NFS is not set @@ -709,10 +758,7 @@ # Sound # CONFIG_SOUND=m -# CONFIG_SOUND_ASSABET_UDA1341 is not set -# CONFIG_SOUND_BITSY_UDA1341 is not set -# CONFIG_SOUND_SA1111_UDA1341 is not set -CONFIG_SOUND_SA1100SSP=m +# CONFIG_SOUND_BT878 is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set @@ -723,19 +769,120 @@ # CONFIG_SOUND_MAESTRO is not set # CONFIG_SOUND_MAESTRO3 is not set # CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_VIA82CXXX is not set # CONFIG_MIDI_VIA82CXXX is not set +# CONFIG_SOUND_ASSABET_UDA1341 is not set +# CONFIG_SOUND_H3600_UDA1341 is not set +# CONFIG_SOUND_PANGOLIN_UDA1341 is not set +# CONFIG_SOUND_SA1111_UDA1341 is not set +CONFIG_SOUND_SA1100SSP=m # CONFIG_SOUND_OSS is not set +# CONFIG_SOUND_WAVEARTIST is not set # CONFIG_SOUND_TVMIXER is not set # # USB support # # CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# +# CONFIG_USB_DABUSB is not set + +# +# USB Network adaptors +# +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# Miscellaneous USB drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set # # Bluetooth support diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/neponset linux/arch/arm/def-configs/neponset --- v2.4.13/linux/arch/arm/def-configs/neponset Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/neponset Thu Oct 25 13:53:45 2001 @@ -8,6 +8,8 @@ CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_GENERIC_BUST_SPINLOCK is not set +# CONFIG_GENERIC_ISA_DMA is not set # # Code maturity level options @@ -31,6 +33,7 @@ # CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set +# CONFIG_ARCH_CAMELOT is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_L7200 is not set @@ -62,13 +65,15 @@ # CONFIG_SA1100_ASSABET=y CONFIG_ASSABET_NEPONSET=y +# CONFIG_SA1100_ADSBITSY is not set # CONFIG_SA1100_BRUTUS is not set # CONFIG_SA1100_CERF is not set -# CONFIG_SA1100_BITSY is not set +# CONFIG_SA1100_H3600 is not set # CONFIG_SA1100_EXTENEX1 is not set # CONFIG_SA1100_FLEXANET is not set # CONFIG_SA1100_FREEBIRD is not set # CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set # CONFIG_SA1100_JORNADA720 is not set # CONFIG_SA1100_HUW_WEBPANEL is not set # CONFIG_SA1100_ITSY is not set @@ -84,6 +89,7 @@ # CONFIG_SA1100_XP860 is not set # CONFIG_SA1100_YOPY is not set CONFIG_SA1111=y +CONFIG_FORCE_MAX_ZONEORDER=9 CONFIG_SA1100_USB=m CONFIG_SA1100_USB_NETLINK=m CONFIG_SA1100_USB_CHAR=m @@ -91,7 +97,12 @@ # # CLPS711X/EP721X Implementations # +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set # CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set # CONFIG_ARCH_ACORN is not set # CONFIG_FOOTBRIDGE is not set # CONFIG_FOOTBRIDGE_HOST is not set @@ -111,16 +122,16 @@ # CONFIG_CPU_ARM1020 is not set # CONFIG_CPU_SA110 is not set CONFIG_CPU_SA1100=y +# CONFIG_ARM_THUMB is not set CONFIG_DISCONTIGMEM=y -# CONFIG_CPU_BIG_ENDIAN is not set # # General setup # # CONFIG_PCI is not set -# CONFIG_ISA is not set +CONFIG_ISA=y # CONFIG_ISA_DMA is not set -# CONFIG_CPU_FREQ is not set +CONFIG_CPU_FREQ=y CONFIG_HOTPLUG=y # @@ -135,6 +146,10 @@ CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# CONFIG_FPE_NWFPE=y # CONFIG_FPE_FASTFPE is not set CONFIG_KCORE_ELF=y @@ -143,10 +158,8 @@ CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set # CONFIG_PM is not set -# CONFIG_APM is not set # CONFIG_ARTHUR is not set CONFIG_CMDLINE="" -# CONFIG_PFS168_CMDLINE is not set CONFIG_LEDS=y CONFIG_LEDS_TIMER=y CONFIG_LEDS_CPU=y @@ -180,50 +193,36 @@ # RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=m +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=m # CONFIG_MTD_CFI_ADV_OPTIONS is not set CONFIG_MTD_CFI_INTELEXT=m # CONFIG_MTD_CFI_AMDSTD is not set -# CONFIG_MTD_AMDSTD is not set -# CONFIG_MTD_SHARP is not set # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set # CONFIG_MTD_JEDEC is not set # # Mapping drivers for chip access # # CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_SUN_UFLASH is not set # CONFIG_MTD_NORA is not set -# CONFIG_MTD_PNC2000 is not set -# CONFIG_MTD_RPXLITE is not set -# CONFIG_MTD_TQM8XXL is not set -# CONFIG_MTD_SC520CDP is not set -# CONFIG_MTD_NETSC520 is not set -# CONFIG_MTD_SBC_GXX is not set -# CONFIG_MTD_ELAN_104NC is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_CDB89712 is not set CONFIG_MTD_SA1100=m -# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set -# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set # CONFIG_MTD_DC21285 is not set # CONFIG_MTD_IQ80310 is not set -# CONFIG_MTD_DBOX2 is not set -# CONFIG_MTD_CSTM_MIPS_IXX is not set -# CONFIG_MTD_CFI_FLAGADM is not set -# CONFIG_MTD_ARM_INTEGRATOR is not set -# CONFIG_MTD_SOLUTIONENGINE is not set -# CONFIG_MTD_MIXMEM is not set -# CONFIG_MTD_OCTAGON is not set -# CONFIG_MTD_VMAX is not set -# CONFIG_MTD_OCELOT is not set -# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_PCI is not set # # Self-contained MTD device drivers # # CONFIG_MTD_PMC551 is not set # CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_LART is not set # CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_BLKMTD is not set @@ -245,6 +244,7 @@ # # CONFIG_PNP is not set # CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set # # Block devices @@ -254,6 +254,7 @@ # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set # CONFIG_BLK_DEV_DAC960 is not set CONFIG_BLK_DEV_LOOP=m # CONFIG_BLK_DEV_NBD is not set @@ -270,6 +271,7 @@ # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set # CONFIG_BLK_DEV_LVM is not set # @@ -331,6 +333,7 @@ # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y +# CONFIG_ARM_AM79C961A is not set # CONFIG_SUNLANCE is not set # CONFIG_SUNBMAC is not set # CONFIG_SUNQE is not set @@ -345,6 +348,9 @@ # CONFIG_ULTRA32 is not set CONFIG_SMC9194=y # CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set +# CONFIG_HP100 is not set # CONFIG_NET_ISA is not set # CONFIG_NET_PCI is not set # CONFIG_NET_POCKET is not set @@ -353,8 +359,9 @@ # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set -# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_DL2K is not set # CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set @@ -449,6 +456,9 @@ # CONFIG_IDEDMA_AUTO is not set # CONFIG_DMA_NONPCI is not set # CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set # # SCSI support @@ -488,31 +498,36 @@ # CONFIG_SERIAL is not set # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_21285 is not set -# CONFIG_SERIAL_21285_OLD is not set -# CONFIG_SERIAL_21285_CONSOLE is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set # CONFIG_SERIAL_AMBA is not set # CONFIG_SERIAL_AMBA_CONSOLE is not set # CONFIG_SERIAL_CLPS711X is not set # CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_UART00 is not set +# CONFIG_SERIAL_UART00_CONSOLE is not set CONFIG_SERIAL_SA1100=y CONFIG_SERIAL_SA1100_CONSOLE=y CONFIG_SA1100_DEFAULT_BAUDRATE=9600 CONFIG_SERIAL_8250=m # CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=32 -CONFIG_UCB1200=y -CONFIG_TOUCHSCREEN_UCB1200=y -# CONFIG_AUDIO_UCB1200 is not set -# CONFIG_ADC_UCB1200 is not set -# CONFIG_TOUCHSCREEN_BITSY is not set -# CONFIG_PROFILER is not set -# CONFIG_PFS168_SPI is not set -# CONFIG_PFS168_DTMF is not set -# CONFIG_PFS168_MISC is not set # # I2C support @@ -520,6 +535,19 @@ # CONFIG_I2C is not set # +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# # Mice # # CONFIG_BUSMOUSE is not set @@ -528,11 +556,37 @@ # # Joysticks # -# CONFIG_JOYSTICK is not set +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_INPUT_NS558 is not set +# CONFIG_INPUT_LIGHTNING is not set +# CONFIG_INPUT_PCIGAME is not set +# CONFIG_INPUT_CS461X is not set +# CONFIG_INPUT_EMU10K1 is not set +# CONFIG_INPUT_SERIO is not set +# CONFIG_INPUT_SERPORT is not set # -# Input core support is needed for joysticks +# Joysticks # +# CONFIG_INPUT_ANALOG is not set +# CONFIG_INPUT_A3D is not set +# CONFIG_INPUT_ADI is not set +# CONFIG_INPUT_COBRA is not set +# CONFIG_INPUT_GF2K is not set +# CONFIG_INPUT_GRIP is not set +# CONFIG_INPUT_INTERACT is not set +# CONFIG_INPUT_TMDC is not set +# CONFIG_INPUT_SIDEWINDER is not set +# CONFIG_INPUT_IFORCE_USB is not set +# CONFIG_INPUT_IFORCE_232 is not set +# CONFIG_INPUT_WARRIOR is not set +# CONFIG_INPUT_MAGELLAN is not set +# CONFIG_INPUT_SPACEORB is not set +# CONFIG_INPUT_SPACEBALL is not set +# CONFIG_INPUT_STINGER is not set +# CONFIG_INPUT_DB9 is not set +# CONFIG_INPUT_GAMECON is not set +# CONFIG_INPUT_TURBOGRAFX is not set # CONFIG_QIC02_TAPE is not set # @@ -557,6 +611,8 @@ # # PCMCIA character devices # +CONFIG_PCMCIA_SERIAL_CS=m +# CONFIG_MWAVE is not set # # Multimedia devices @@ -576,13 +632,16 @@ # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y # CONFIG_UMSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_EFS_FS is not set -CONFIG_JFFS_FS=m -CONFIG_JFFS_FS_VERBOSE=0 +# CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=m CONFIG_JFFS2_FS_DEBUG=0 # CONFIG_CRAMFS is not set @@ -590,8 +649,9 @@ # CONFIG_RAMFS is not set # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set -# CONFIG_VXFS_FS is not set +# CONFIG_FREEVXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -614,6 +674,7 @@ # Network File Systems # # CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y # CONFIG_NFS_V3 is not set # CONFIG_ROOT_NFS is not set @@ -631,6 +692,8 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -646,6 +709,7 @@ # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set @@ -705,11 +769,10 @@ CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y # CONFIG_FB_ACORN is not set +# CONFIG_FB_ANAKIN is not set # CONFIG_FB_CLPS711X is not set -# CONFIG_FB_CYBER2000 is not set CONFIG_FB_SA1100=y -# CONFIG_FB_ANAKIN is not set -# CONFIG_FB_E1355 is not set +# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FBCON_ADVANCED is not set CONFIG_FBCON_CFB2=y @@ -728,12 +791,10 @@ # Sound # CONFIG_SOUND=y -CONFIG_SOUND_ASSABET_UDA1341=m -# CONFIG_SOUND_BITSY_UDA1341 is not set -CONFIG_SOUND_SA1111_UDA1341=m -# CONFIG_SOUND_SA1100SSP is not set +# CONFIG_SOUND_BT878 is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set +# CONFIG_MIDI_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set # CONFIG_SOUND_CS4281 is not set # CONFIG_SOUND_ES1370 is not set @@ -742,16 +803,34 @@ # CONFIG_SOUND_MAESTRO is not set # CONFIG_SOUND_MAESTRO3 is not set # CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_VIA82CXXX is not set # CONFIG_MIDI_VIA82CXXX is not set +CONFIG_SOUND_SA1100=y +# CONFIG_SOUND_UDA1341 is not set +# CONFIG_SOUND_ASSABET_UDA1341 is not set +# CONFIG_SOUND_H3600_UDA1341 is not set +# CONFIG_SOUND_PANGOLIN_UDA1341 is not set +# CONFIG_SOUND_SA1111_UDA1341 is not set +# CONFIG_SOUND_SA1100SSP is not set # CONFIG_SOUND_OSS is not set +# CONFIG_SOUND_WAVEARTIST is not set # CONFIG_SOUND_TVMIXER is not set # +# Multimedia Capabilities Port drivers +# +CONFIG_MCP=y +CONFIG_MCP_SA1100=y +CONFIG_MCP_UCB1200=y +CONFIG_MCP_UCB1200_AUDIO=m +CONFIG_MCP_UCB1200_TS=y + +# # USB support # CONFIG_USB=y @@ -762,6 +841,8 @@ # # CONFIG_USB_DEVICEFS is not set # CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_LONG_TIMEOUT is not set +# CONFIG_USB_LARGE_CONFIG is not set # # USB Controllers @@ -769,7 +850,7 @@ # CONFIG_USB_UHCI is not set # CONFIG_USB_UHCI_ALT is not set CONFIG_USB_OHCI=y -CONFIG_USB_OHCI_NOPCI=y +CONFIG_USB_OHCI_SA1111=y # # USB Device Class drivers @@ -777,6 +858,14 @@ # CONFIG_USB_AUDIO is not set # CONFIG_USB_BLUETOOTH is not set # CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set @@ -784,6 +873,7 @@ # USB Human Interface Devices (HID) # CONFIG_USB_HID=y +# CONFIG_USB_HIDDEV is not set # CONFIG_USB_WACOM is not set # @@ -793,24 +883,23 @@ # CONFIG_USB_MDC800 is not set # CONFIG_USB_SCANNER is not set # CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set # # USB Multimedia devices # -# CONFIG_USB_IBMCAM is not set -# CONFIG_USB_OV511 is not set -# CONFIG_USB_PWC is not set -# CONFIG_USB_SE401 is not set -# CONFIG_USB_DSBR is not set -# CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# # # USB Network adaptors # -# CONFIG_USB_PLUSB is not set # CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set -# CONFIG_USB_NET1080 is not set +# CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set # @@ -822,11 +911,36 @@ # USB Serial Converter support # # CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set # -# USB misc drivers +# USB Miscellaneous drivers # # CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set # # Bluetooth support @@ -840,7 +954,9 @@ CONFIG_DEBUG_ERRORS=y CONFIG_DEBUG_USER=y # CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SLAB is not set CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_NO_PGT_CACHE is not set # CONFIG_DEBUG_LL is not set # CONFIG_DEBUG_DC21285_PORT is not set diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/pangolin linux/arch/arm/def-configs/pangolin --- v2.4.13/linux/arch/arm/def-configs/pangolin Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/pangolin Thu Oct 25 13:53:45 2001 @@ -1,11 +1,13 @@ # -# Automatically generated make config: don't edit +# Automatically generated by make menuconfig: don't edit # CONFIG_ARM=y # CONFIG_EISA is not set # CONFIG_SBUS is not set # CONFIG_MCA is not set CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set # # Code maturity level options @@ -23,24 +25,22 @@ # # System Type # +# CONFIG_ARCH_ANAKIN is not set # CONFIG_ARCH_ARCA5K is not set # CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_L7200 is not set # CONFIG_ARCH_RPC is not set CONFIG_ARCH_SA1100=y -# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_SHARK is not set # # Archimedes/A5000 Implementations # - -# -# Archimedes/A5000 Implementations (select only ONE) -# # CONFIG_ARCH_ARC is not set # CONFIG_ARCH_A5K is not set @@ -62,14 +62,20 @@ # CONFIG_SA1100_CERF is not set # CONFIG_SA1100_BITSY is not set # CONFIG_SA1100_EXTENEX1 is not set +# CONFIG_SA1100_FLEXANET is not set # CONFIG_SA1100_FREEBIRD is not set # CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_JORNADA720 is not set # CONFIG_SA1100_HUW_WEBPANEL is not set +# CONFIG_SA1100_ITSY is not set # CONFIG_SA1100_LART is not set # CONFIG_SA1100_NANOENGINE is not set +# CONFIG_SA1100_OMNIMETER is not set CONFIG_SA1100_PANGOLIN=y +CONFIG_SA1100_PANGOLIN_PCMCIA_IDE=y # CONFIG_SA1100_PLEB is not set # CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set # CONFIG_SA1100_PFS168 is not set # CONFIG_SA1100_VICTOR is not set # CONFIG_SA1100_XP860 is not set @@ -77,8 +83,6 @@ # CONFIG_SA1100_USB is not set # CONFIG_SA1100_USB_NETLINK is not set # CONFIG_SA1100_USB_CHAR is not set -# CONFIG_SA1100_FREQUENCY_SCALE is not set -# CONFIG_SA1100_VOLTAGE_SCALE is not set # # CLPS711X/EP721X Implementations @@ -90,10 +94,6 @@ # CONFIG_FOOTBRIDGE_ADDIN is not set CONFIG_CPU_32=y # CONFIG_CPU_26 is not set - -# -# Processor Type -# # CONFIG_CPU_32v3 is not set CONFIG_CPU_32v4=y # CONFIG_CPU_ARM610 is not set @@ -104,18 +104,15 @@ # CONFIG_CPU_SA110 is not set CONFIG_CPU_SA1100=y CONFIG_DISCONTIGMEM=y +# CONFIG_CPU_BIG_ENDIAN is not set # # General setup # - -# -# Please ensure that you have read the help on the next option -# -# CONFIG_ANGELBOOT is not set # CONFIG_PCI is not set # CONFIG_ISA is not set # CONFIG_ISA_DMA is not set +# CONFIG_CPU_FREQ is not set CONFIG_HOTPLUG=y # @@ -130,20 +127,20 @@ CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y -CONFIG_FPE_NWFPE=y -# CONFIG_FPE_FASTFPE is not set +# CONFIG_FPE_NWFPE is not set +CONFIG_FPE_FASTFPE=y CONFIG_KCORE_ELF=y # CONFIG_KCORE_AOUT is not set # CONFIG_BINFMT_AOUT is not set CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set # CONFIG_PM is not set +# CONFIG_APM is not set # CONFIG_ARTHUR is not set CONFIG_CMDLINE="keepinitrd" # CONFIG_PFS168_CMDLINE is not set # CONFIG_LEDS is not set CONFIG_ALIGNMENT_TRAP=y -# CONFIG_UCB1200 is not set # # Parallel port support @@ -155,62 +152,84 @@ # CONFIG_MTD=y # CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +# CONFIG_MTD_BOOTLDR_PARTS is not set +# CONFIG_MTD_AFS_PARTS is not set +CONFIG_MTD_CHAR=y +CONFIG_MTD_BLOCK=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set # -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOC1000 is not set -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOCPROBE is not set - -# -# RAM/ROM Device Drivers -# -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_MTDRAM is not set - -# -# Linearly Mapped Flash Device Drivers +# RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=y -# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_B1 is not set +# CONFIG_MTD_CFI_B2 is not set +CONFIG_MTD_CFI_B4=y +# CONFIG_MTD_CFI_I1 is not set +# CONFIG_MTD_CFI_I2 is not set +CONFIG_MTD_CFI_I4=y CONFIG_MTD_CFI_INTELEXT=y # CONFIG_MTD_CFI_AMDSTD is not set # CONFIG_MTD_AMDSTD is not set # CONFIG_MTD_SHARP is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_JEDEC is not set + +# +# Mapping drivers for chip access +# # CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_SUN_UFLASH is not set # CONFIG_MTD_NORA is not set # CONFIG_MTD_PNC2000 is not set # CONFIG_MTD_RPXLITE is not set +# CONFIG_MTD_TQM8XXL is not set # CONFIG_MTD_SC520CDP is not set -# CONFIG_MTD_SBC_MEDIAGX is not set +# CONFIG_MTD_NETSC520 is not set +# CONFIG_MTD_SBC_GXX is not set # CONFIG_MTD_ELAN_104NC is not set CONFIG_MTD_SA1100=y +# CONFIG_MTD_SA1100_REDBOOT_PARTITIONS is not set +# CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS is not set # CONFIG_MTD_DC21285 is not set # CONFIG_MTD_IQ80310 is not set -# CONFIG_MTD_CSTM_CFI_JEDEC is not set -# CONFIG_MTD_JEDEC is not set +# CONFIG_MTD_DBOX2 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_CFI_FLAGADM is not set +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_SOLUTIONENGINE is not set # CONFIG_MTD_MIXMEM is not set # CONFIG_MTD_OCTAGON is not set # CONFIG_MTD_VMAX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_L440GX is not set # -# NAND Flash Device Drivers +# Self-contained MTD device drivers # -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_NAND_SPIA is not set +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_LART is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set # -# User Modules And Translation Layers +# NAND Flash Device Drivers # -CONFIG_MTD_CHAR=y -CONFIG_MTD_BLOCK=y -# CONFIG_FTL is not set -# CONFIG_NFTL is not set +# CONFIG_MTD_NAND is not set # # Plug and Play configuration @@ -264,10 +283,6 @@ # CONFIG_IPV6 is not set # CONFIG_KHTTPD is not set # CONFIG_ATM is not set - -# -# -# # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_DECNET is not set @@ -295,22 +310,29 @@ # ARCnet devices # # CONFIG_ARCNET is not set -CONFIG_DUMMY=y +# CONFIG_DUMMY is not set # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_NET_SB1000 is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNLANCE is not set +# CONFIG_SUNGEM is not set # CONFIG_NET_VENDOR_3COM is not set # CONFIG_LANCE is not set -# CONFIG_NET_VENDOR_SMC is not set +CONFIG_NET_VENDOR_SMC=y +# CONFIG_WD80x3 is not set +# CONFIG_ULTRAMCA is not set +# CONFIG_ULTRA is not set +# CONFIG_ULTRA32 is not set +CONFIG_SMC9194=y # CONFIG_NET_VENDOR_RACAL is not set -# CONFIG_AT1700 is not set -# CONFIG_DEPCA is not set # CONFIG_NET_ISA is not set # CONFIG_NET_PCI is not set # CONFIG_NET_POCKET is not set @@ -319,11 +341,14 @@ # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set +# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_MYRI_SBUS is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set +# CONFIG_PLIP is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set @@ -358,8 +383,12 @@ # CONFIG_PCMCIA_XIRC2PS is not set # CONFIG_ARCNET_COM20020_CS is not set # CONFIG_PCMCIA_IBMTR is not set -# CONFIG_NET_PCMCIA_RADIO is not set -CONFIG_PCMCIA_NETCARD=y +CONFIG_NET_PCMCIA_RADIO=y +# CONFIG_PCMCIA_RAYCS is not set +# CONFIG_PCMCIA_NETWAVE is not set +# CONFIG_PCMCIA_WAVELAN is not set +# CONFIG_AIRONET4500_CS is not set +CONFIG_PCMCIA_WVLAN=y # # Amateur Radio support @@ -374,19 +403,15 @@ # # ATA/IDE/MFM/RLL support # -CONFIG_IDE=y +CONFIG_IDE=m # # IDE, ATA and ATAPI Block devices # -CONFIG_BLK_DEV_IDE=y - -# -# Please see Documentation/ide.txt for help/info on IDE drives -# +CONFIG_BLK_DEV_IDE=m # CONFIG_BLK_DEV_HD_IDE is not set # CONFIG_BLK_DEV_HD is not set -CONFIG_BLK_DEV_IDEDISK=y +CONFIG_BLK_DEV_IDEDISK=m # CONFIG_IDEDISK_MULTI_MODE is not set # CONFIG_BLK_DEV_IDEDISK_VENDOR is not set # CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set @@ -397,15 +422,12 @@ # CONFIG_BLK_DEV_IDEDISK_WD is not set # CONFIG_BLK_DEV_COMMERIAL is not set # CONFIG_BLK_DEV_TIVO is not set -CONFIG_BLK_DEV_IDECS=y +CONFIG_BLK_DEV_IDECS=m +# CONFIG_BLK_DEV_PANGOLIN is not set # CONFIG_BLK_DEV_IDECD is not set # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDESCSI is not set - -# -# IDE chipset support/bugfixes -# # CONFIG_BLK_DEV_CMD640 is not set # CONFIG_BLK_DEV_CMD640_ENHANCED is not set # CONFIG_BLK_DEV_ISAPNP is not set @@ -446,19 +468,31 @@ # CONFIG_SERIAL is not set # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set +# CONFIG_SERIAL_AMBA is not set +# CONFIG_SERIAL_AMBA_CONSOLE is not set +# CONFIG_SERIAL_CLPS711X is not set +# CONFIG_SERIAL_CLPS711X_CONSOLE is not set CONFIG_SERIAL_SA1100=y CONFIG_SERIAL_SA1100_CONSOLE=y CONFIG_SA1100_DEFAULT_BAUDRATE=115200 +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=32 +# CONFIG_UCB1200 is not set # CONFIG_TOUCHSCREEN_UCB1200 is not set +# CONFIG_AUDIO_UCB1200 is not set +# CONFIG_ADC_UCB1200 is not set # CONFIG_TOUCHSCREEN_BITSY is not set CONFIG_PROFILER=y # CONFIG_PFS168_SPI is not set # CONFIG_PFS168_DTMF is not set # CONFIG_PFS168_MISC is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -CONFIG_UNIX98_PTYS=y -CONFIG_UNIX98_PTY_COUNT=32 # # I2C support @@ -475,10 +509,6 @@ # Joysticks # # CONFIG_JOYSTICK is not set - -# -# Input core support is needed for joysticks -# # CONFIG_QIC02_TAPE is not set # @@ -503,7 +533,6 @@ # # PCMCIA character devices # -# CONFIG_PCMCIA_SERIAL_CS is not set # # Multimedia devices @@ -532,10 +561,12 @@ CONFIG_JFFS_FS_VERBOSE=0 # CONFIG_JFFS2_FS is not set CONFIG_CRAMFS=y +# CONFIG_TMPFS is not set CONFIG_RAMFS=y # CONFIG_ISO9660_FS is not set # CONFIG_JOLIET is not set # CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -549,7 +580,6 @@ # CONFIG_ROMFS_FS is not set CONFIG_EXT2_FS=y # CONFIG_SYSV_FS is not set -# CONFIG_SYSV_FS_WRITE is not set # CONFIG_UDF_FS is not set # CONFIG_UDF_RW is not set # CONFIG_UFS_FS is not set @@ -604,11 +634,13 @@ # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_949 is not set CONFIG_NLS_CODEPAGE_950=y +# CONFIG_NLS_CODEPAGE_932 is not set +# CONFIG_NLS_CODEPAGE_949 is not set +# CONFIG_NLS_CODEPAGE_874 is not set +# CONFIG_NLS_ISO8859_8 is not set +# CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set @@ -616,11 +648,12 @@ # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_ISO8859_9 is not set +# CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set +# CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_UTF8 is not set # @@ -628,7 +661,6 @@ # CONFIG_PC_KEYMAP=y # CONFIG_VGA_CONSOLE is not set -CONFIG_FB=y # # Frame-buffer support @@ -640,12 +672,14 @@ # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_SA1100 is not set CONFIG_FB_MQ200=y +# CONFIG_FB_ANAKIN is not set +# CONFIG_FB_E1355 is not set # CONFIG_FB_VIRTUAL is not set CONFIG_FBCON_ADVANCED=y # CONFIG_FBCON_MFB is not set -# CONFIG_FBCON_CFB2 is not set -# CONFIG_FBCON_CFB4 is not set -# CONFIG_FBCON_CFB8 is not set +CONFIG_FBCON_CFB2=y +CONFIG_FBCON_CFB4=y +CONFIG_FBCON_CFB8=y CONFIG_FBCON_CFB16=y # CONFIG_FBCON_CFB24 is not set # CONFIG_FBCON_CFB32 is not set @@ -670,8 +704,11 @@ # Sound # CONFIG_SOUND=y -CONFIG_SOUND_UDA1341=y -# CONFIG_SOUND_SA1100_SSP is not set +# CONFIG_SOUND_ASSABET_UDA1341 is not set +CONFIG_SOUND_PANGOLIN_UDA1341=y +# CONFIG_SOUND_BITSY_UDA1341 is not set +# CONFIG_SOUND_SA1111_UDA1341 is not set +# CONFIG_SOUND_SA1100SSP is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set @@ -687,6 +724,7 @@ # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_VIA82CXXX is not set +# CONFIG_MIDI_VIA82CXXX is not set # CONFIG_SOUND_OSS is not set # CONFIG_SOUND_TVMIXER is not set @@ -694,6 +732,11 @@ # USB support # # CONFIG_USB is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set # # Kernel hacking diff -u --recursive --new-file v2.4.13/linux/arch/arm/def-configs/shark linux/arch/arm/def-configs/shark --- v2.4.13/linux/arch/arm/def-configs/shark Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/def-configs/shark Thu Oct 25 13:53:45 2001 @@ -8,6 +8,7 @@ CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +# CONFIG_GENERIC_BUST_SPINLOCK is not set # # Code maturity level options @@ -62,13 +63,15 @@ # # CONFIG_SA1100_ASSABET is not set # CONFIG_ASSABET_NEPONSET is not set +# CONFIG_SA1100_ADSBITSY is not set # CONFIG_SA1100_BRUTUS is not set # CONFIG_SA1100_CERF is not set -# CONFIG_SA1100_BITSY is not set +# CONFIG_SA1100_H3600 is not set # CONFIG_SA1100_EXTENEX1 is not set # CONFIG_SA1100_FLEXANET is not set # CONFIG_SA1100_FREEBIRD is not set # CONFIG_SA1100_GRAPHICSCLIENT is not set +# CONFIG_SA1100_GRAPHICSMASTER is not set # CONFIG_SA1100_JORNADA720 is not set # CONFIG_SA1100_HUW_WEBPANEL is not set # CONFIG_SA1100_ITSY is not set @@ -78,6 +81,7 @@ # CONFIG_SA1100_PANGOLIN is not set # CONFIG_SA1100_PLEB is not set # CONFIG_SA1100_SHERMAN is not set +# CONFIG_SA1100_SIMPAD is not set # CONFIG_SA1100_PFS168 is not set # CONFIG_SA1100_VICTOR is not set # CONFIG_SA1100_XP860 is not set @@ -86,7 +90,12 @@ # # CLPS711X/EP721X Implementations # +# CONFIG_ARCH_CDB89712 is not set +# CONFIG_ARCH_CLEP7312 is not set +# CONFIG_ARCH_EDB7211 is not set # CONFIG_ARCH_P720T is not set +# CONFIG_ARCH_EP7211 is not set +# CONFIG_ARCH_EP7212 is not set # CONFIG_ARCH_ACORN is not set # CONFIG_FOOTBRIDGE is not set # CONFIG_FOOTBRIDGE_HOST is not set @@ -106,6 +115,7 @@ # CONFIG_CPU_ARM1020 is not set CONFIG_CPU_SA110=y # CONFIG_CPU_SA1100 is not set +# CONFIG_ARM_THUMB is not set # CONFIG_DISCONTIGMEM is not set # @@ -121,6 +131,10 @@ CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y + +# +# At least one math emulation must be selected +# # CONFIG_FPE_NWFPE is not set CONFIG_FPE_FASTFPE=y CONFIG_KCORE_ELF=y @@ -140,12 +154,15 @@ # CONFIG_PARPORT=y CONFIG_PARPORT_PC=y +CONFIG_PARPORT_PC_CML1=y +# CONFIG_PARPORT_SERIAL is not set # CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set # CONFIG_PARPORT_ARC is not set # CONFIG_PARPORT_AMIGA is not set # CONFIG_PARPORT_MFC3 is not set # CONFIG_PARPORT_ATARI is not set +# CONFIG_PARPORT_GSC is not set # CONFIG_PARPORT_SUNBPP is not set # CONFIG_PARPORT_OTHER is not set # CONFIG_PARPORT_1284 is not set @@ -155,6 +172,7 @@ # # CONFIG_PNP is not set # CONFIG_ISAPNP is not set +# CONFIG_PNPBIOS is not set # # Block devices @@ -180,6 +198,7 @@ # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set # CONFIG_BLK_DEV_LVM is not set # @@ -262,8 +281,6 @@ # CONFIG_APRICOT is not set CONFIG_CS89x0=y # CONFIG_TULIP is not set -# CONFIG_TULIP_MWI is not set -# CONFIG_TULIP_MMIO is not set # CONFIG_DE4X5 is not set # CONFIG_DGRS is not set # CONFIG_DM9102 is not set @@ -290,8 +307,9 @@ # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set -# CONFIG_ACENIC_OMIT_TIGON_I is not set +# CONFIG_DL2K is not set # CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_SK98LIN is not set @@ -374,6 +392,9 @@ # CONFIG_IDEDMA_AUTO is not set # CONFIG_DMA_NONPCI is not set # CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_ATARAID is not set +# CONFIG_BLK_DEV_ATARAID_PDC is not set +# CONFIG_BLK_DEV_ATARAID_HPT is not set # # SCSI support @@ -411,6 +432,7 @@ # CONFIG_SCSI_AHA1740 is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_AM53C974 is not set @@ -449,7 +471,7 @@ # CONFIG_SCSI_DEBUG is not set # -# IEEE 1394 (FireWire) support +# IEEE 1394 (FireWire) support (EXPERIMENTAL) # # CONFIG_IEEE1394 is not set @@ -472,6 +494,10 @@ # Input core support # # CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set # # Character devices @@ -482,17 +508,29 @@ CONFIG_SERIAL_CONSOLE=y # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_21285 is not set -# CONFIG_SERIAL_21285_OLD is not set -# CONFIG_SERIAL_21285_CONSOLE is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_ANAKIN is not set +# CONFIG_SERIAL_ANAKIN_CONSOLE is not set # CONFIG_SERIAL_AMBA is not set # CONFIG_SERIAL_AMBA_CONSOLE is not set # CONFIG_SERIAL_CLPS711X is not set # CONFIG_SERIAL_CLPS711X_CONSOLE is not set +# CONFIG_SERIAL_21285 is not set +# CONFIG_SERIAL_21285_OLD is not set +# CONFIG_SERIAL_21285_CONSOLE is not set # CONFIG_SERIAL_SA1100 is not set # CONFIG_SERIAL_SA1100_CONSOLE is not set # CONFIG_SERIAL_8250 is not set # CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_EXTENDED is not set +# CONFIG_SERIAL_8250_MANY_PORTS is not set +# CONFIG_SERIAL_8250_SHARE_IRQ is not set +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +# CONFIG_SERIAL_8250_MULTIPORT is not set +# CONFIG_SERIAL_8250_HUB6 is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 CONFIG_PRINTER=m @@ -505,6 +543,19 @@ # CONFIG_I2C is not set # +# L3 serial bus support +# +# CONFIG_L3 is not set +# CONFIG_L3_ALGOBIT is not set +# CONFIG_L3_BIT_SA1100_GPIO is not set + +# +# Other L3 adapters +# +# CONFIG_L3_SA1111 is not set +# CONFIG_BIT_SA1100_GPIO is not set + +# # Mice # # CONFIG_BUSMOUSE is not set @@ -516,7 +567,11 @@ # # Joysticks # -# CONFIG_JOYSTICK is not set +# CONFIG_INPUT_GAMEPORT is not set + +# +# Input core support is needed for gameports +# # # Input core support is needed for joysticks @@ -533,6 +588,7 @@ # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set +# CONFIG_SONYPI is not set # # Ftape, the floppy tape device driver @@ -540,6 +596,7 @@ # CONFIG_FTAPE is not set # CONFIG_AGP is not set # CONFIG_DRM is not set +# CONFIG_MWAVE is not set # # Multimedia devices @@ -554,11 +611,16 @@ # CONFIG_AUTOFS4_FS is not set # CONFIG_REISERFS_FS is not set # CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set # CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_BFS_FS is not set +# CONFIG_CMS_FS is not set +CONFIG_EXT3_FS=y +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y # CONFIG_UMSDOS_FS is not set @@ -571,8 +633,9 @@ # CONFIG_RAMFS is not set CONFIG_ISO9660_FS=y CONFIG_JOLIET=y +# CONFIG_ZISOFS is not set # CONFIG_MINIX_FS is not set -# CONFIG_VXFS_FS is not set +# CONFIG_FREEVXFS_FS is not set # CONFIG_NTFS_FS is not set # CONFIG_NTFS_RW is not set # CONFIG_HPFS_FS is not set @@ -595,6 +658,7 @@ # Network File Systems # # CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y # CONFIG_NFS_V3 is not set # CONFIG_ROOT_NFS is not set @@ -612,6 +676,8 @@ # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set +# CONFIG_ZLIB_FS_INFLATE is not set # # Partition Types @@ -627,6 +693,7 @@ # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set @@ -689,17 +756,19 @@ # CONFIG_FB_RIVA is not set # CONFIG_FB_CLGEN is not set # CONFIG_FB_PM2 is not set +# CONFIG_FB_PM3 is not set # CONFIG_FB_ACORN is not set +# CONFIG_FB_ANAKIN is not set # CONFIG_FB_CLPS711X is not set -CONFIG_FB_CYBER2000=y # CONFIG_FB_SA1100 is not set -# CONFIG_FB_ANAKIN is not set -# CONFIG_FB_E1355 is not set +CONFIG_FB_CYBER2000=y # CONFIG_FB_MATROX is not set # CONFIG_FB_ATY is not set +# CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set -# CONFIG_FB_3DFX is not set # CONFIG_FB_SIS is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_FBCON_ADVANCED is not set CONFIG_FBCON_CFB8=y @@ -714,8 +783,10 @@ # Sound # CONFIG_SOUND=m +# CONFIG_SOUND_BT878 is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set +# CONFIG_MIDI_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set # CONFIG_SOUND_CS4281 is not set # CONFIG_SOUND_ES1370 is not set @@ -724,6 +795,7 @@ # CONFIG_SOUND_MAESTRO is not set # CONFIG_SOUND_MAESTRO3 is not set # CONFIG_SOUND_ICH is not set +# CONFIG_SOUND_RME96XX is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set @@ -764,9 +836,117 @@ # CONFIG_SOUND_TVMIXER is not set # +# Multimedia Capabilities Port drivers +# +# CONFIG_MCP is not set +# CONFIG_MCP_SA1100 is not set +# CONFIG_MCP_UCB1200 is not set +# CONFIG_MCP_UCB1200_AUDIO is not set +# CONFIG_MCP_UCB1200_TS is not set + +# # USB support # # CONFIG_USB is not set + +# +# USB Controllers +# +# CONFIG_USB_UHCI is not set +# CONFIG_USB_UHCI_ALT is not set +# CONFIG_USB_OHCI is not set +# CONFIG_USB_OHCI_SA1111 is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_AUDIO is not set +# CONFIG_USB_BLUETOOTH is not set +# CONFIG_USB_STORAGE is not set +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_HP8200e is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# USB Human Interface Devices (HID) +# + +# +# Input core support is needed for USB HID +# + +# +# USB Imaging devices +# +# CONFIG_USB_DC2XX is not set +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_SCANNER is not set +# CONFIG_USB_MICROTEK is not set +# CONFIG_USB_HPUSBSCSI is not set + +# +# USB Multimedia devices +# + +# +# Video4Linux support is needed for USB Multimedia device support +# +# CONFIG_USB_DABUSB is not set + +# +# USB Network adaptors +# +# CONFIG_USB_PLUSB is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_CATC is not set +# CONFIG_USB_CDCETHER is not set +# CONFIG_USB_USBNET is not set + +# +# USB port drivers +# +# CONFIG_USB_USS720 is not set + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set +# CONFIG_USB_SERIAL_GENERIC is not set +# CONFIG_USB_SERIAL_BELKIN is not set +# CONFIG_USB_SERIAL_WHITEHEAT is not set +# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set +# CONFIG_USB_SERIAL_EMPEG is not set +# CONFIG_USB_SERIAL_FTDI_SIO is not set +# CONFIG_USB_SERIAL_VISOR is not set +# CONFIG_USB_SERIAL_IR is not set +# CONFIG_USB_SERIAL_EDGEPORT is not set +# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set +# CONFIG_USB_SERIAL_KEYSPAN is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set +# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set +# CONFIG_USB_SERIAL_MCT_U232 is not set +# CONFIG_USB_SERIAL_PL2303 is not set +# CONFIG_USB_SERIAL_CYBERJACK is not set +# CONFIG_USB_SERIAL_XIRCOM is not set +# CONFIG_USB_SERIAL_OMNINET is not set + +# +# Miscellaneous USB drivers +# +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_ID75 is not set # # Bluetooth support diff -u --recursive --new-file v2.4.13/linux/arch/arm/kernel/Makefile linux/arch/arm/kernel/Makefile --- v2.4.13/linux/arch/arm/kernel/Makefile Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/kernel/Makefile Thu Oct 25 13:53:45 2001 @@ -42,7 +42,7 @@ no-irq-arch := $(CONFIG_ARCH_INTEGRATOR) $(CONFIG_ARCH_CLPS711X) \ $(CONFIG_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) \ - $(CONFIG_ARCH_SA1100) + $(CONFIG_ARCH_SA1100) $(CONFIG_ARCH_CAMELOT) ifneq ($(findstring y,$(no-irq-arch)),y) obj-y += irq-arch.o diff -u --recursive --new-file v2.4.13/linux/arch/arm/kernel/debug-armv.S linux/arch/arm/kernel/debug-armv.S --- v2.4.13/linux/arch/arm/kernel/debug-armv.S Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/kernel/debug-armv.S Thu Oct 25 13:53:45 2001 @@ -333,6 +333,37 @@ bne 1001b .endm +#elif defined(CONFIG_ARCH_CAMELOT) + +#include +#define UART00_TYPE +#include + + .macro addruart,rx + mrc p15, 0, \rx, c1, c0 + tst \rx, #1 @ MMU enabled? + ldr \rx, =EXC_UART00_BASE @ physical base address + orrne \rx, \rx, #0xff000000 @ virtual base + orrne \rx, \rx, #0x00f00000 + .endm + + .macro senduart,rd,rx + str \rd, [\rx, #UART_TD(0)] + .endm + + .macro waituart,rd,rx +1001: ldr \rd, [\rx, #UART_TSR(0)] + and \rd, \rd, #UART_TSR_TX_LEVEL_MSK + cmp \rd, #15 + beq 1001b + .endm + + .macro busyuart,rd,rx +1001: ldr \rd, [\rx, #UART_TSR(0)] + ands \rd, \rd, #UART_TSR_TX_LEVEL_MSK + bne 1001b + .endm + #else #error Unknown architecture #endif diff -u --recursive --new-file v2.4.13/linux/arch/arm/kernel/entry-armv.S linux/arch/arm/kernel/entry-armv.S --- v2.4.13/linux/arch/arm/kernel/entry-armv.S Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/kernel/entry-armv.S Thu Oct 25 13:53:45 2001 @@ -16,6 +16,7 @@ #include #include "entry-header.S" + #ifdef IOC_BASE /* IOC / IOMD based hardware */ #include @@ -494,6 +495,27 @@ addeq \irqnr, \irqnr, #1 moveq \stat, \stat, lsr #1 tst \stat, #1 @ bit 0 should be set + .endm + + .macro irq_prio_table + .endm + +#elif defined (CONFIG_ARCH_CAMELOT) +#include +#undef IRQ_MODE /* same name defined in asm/proc/ptrace.h */ +#include + + .macro disable_fiq + .endm + + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp + + ldr \irqstat, =INT_ID(IO_ADDRESS(EXC_INT_CTRL00_BASE)) + ldr \irqnr,[\irqstat] + cmp \irqnr,#0 + subne \irqnr,\irqnr,#1 + + .endm .macro irq_prio_table diff -u --recursive --new-file v2.4.13/linux/arch/arm/lib/backtrace.S linux/arch/arm/lib/backtrace.S --- v2.4.13/linux/arch/arm/lib/backtrace.S Thu Apr 12 12:20:31 2001 +++ linux/arch/arm/lib/backtrace.S Thu Oct 25 13:53:45 2001 @@ -44,33 +44,33 @@ 1: moveq r0, #-2 LOADREGS(eqfd, sp!, {r4 - r8, pc}) -2: stmfd sp!, {pc} @ calculate offset of PC in STMIA instruction +2: stmfd sp!, {pc} @ calculate offset of PC in STMIA instruction ldr r0, [sp], #4 adr r1, 2b - 4 sub offset, r0, r1 -3: tst frame, mask @ Check for address exceptions... +3: tst frame, mask @ Check for address exceptions... bne 1b - ldmda frame, {r0, r1, r2, r3} @ fp, sp, lr, pc +1001: ldmda frame, {r0, r1, r2, r3} @ fp, sp, lr, pc mov next, r0 - sub save, r3, offset @ Correct PC for prefetching + sub save, r3, offset @ Correct PC for prefetching bic save, save, mask adr r0, .Lfe mov r1, save bic r2, r2, mask - bl SYMBOL_NAME(printk) + bl SYMBOL_NAME(printk) @ print pc and link register sub r0, frame, #16 - ldr r1, [save, #4] +1002: ldr r1, [save, #4] @ get instruction at function+4 mov r3, r1, lsr #10 ldr r2, .Ldsi+4 teq r3, r2 @ Check for stmia sp!, {args} addeq save, save, #4 @ next instruction bleq .Ldumpstm - ldr r1, [save, #4] @ Get 'stmia sp!, {rlist, fp, ip, lr, pc}' instruction +1003: ldr r1, [save, #4] @ Get 'stmia sp!, {rlist, fp, ip, lr, pc}' instruction mov r3, r1, lsr #10 ldr r2, .Ldsi teq r3, r2 @@ -82,6 +82,24 @@ bne 3b LOADREGS(fd, sp!, {r4 - r8, pc}) +/* + * Fixup for LDMDB + */ + .section .fixup,"ax" + .align 0 +1004: ldr r0, =.Lbad + mov r1, frame + bl SYMBOL_NAME(printk) + LOADREGS(fd, sp!, {r4 - r8, pc}) + .ltorg + .previous + + .section __ex_table,"a" + .align 3 + .long 1001b, 1004b + .long 1002b, 1004b + .long 1003b, 1004b + .previous #define instr r4 #define reg r5 @@ -115,6 +133,7 @@ .Lfe: .asciz "Function entered at [<%p>] from [<%p>]\n" .Lfp: .asciz " r%d = %08X%c" .Lcr: .asciz "\n" +.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n" .align .Ldsi: .word 0x00e92dd8 >> 2 .word 0x00e92d00 >> 2 diff -u --recursive --new-file v2.4.13/linux/arch/arm/lib/io-acorn.S linux/arch/arm/lib/io-acorn.S --- v2.4.13/linux/arch/arm/lib/io-acorn.S Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/lib/io-acorn.S Thu Oct 25 13:53:45 2001 @@ -54,39 +54,6 @@ mov r1, lr b SYMBOL_NAME(printk) -/* Purpose: read a block of data from a hardware register to memory. - * Proto : void insw(int from_port, void *to, int len_in_words); - * Notes : increment to, 'to' must be 16-bit aligned - */ - -ENTRY(insw) - addr r0 - teq r2, #0 - bne __raw_readsw - RETINSTR(mov, pc, lr) - -ENTRY(insb) - addr r0 - teq r2, #0 - bne __raw_readsb - RETINSTR(mov, pc, lr) - -@ Purpose: write a block of data from memory to a hardware register. -@ Proto : outsw(int to_reg, void *from, int len_in_words); -@ Notes : increments from - -ENTRY(outsw) - addr r0 - teq r2, #0 - bne __raw_writesw - RETINSTR(mov, pc, lr) - -ENTRY(outsb) - addr r0 - teq r2, #0 - bne __raw_writesb - RETINSTR(mov, pc, lr) - @ Purpose: write a memc register @ Proto : void memc_write(int register, int value); @ Returns: nothing diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-epxa10db/Makefile linux/arch/arm/mach-epxa10db/Makefile --- v2.4.13/linux/arch/arm/mach-epxa10db/Makefile Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-epxa10db/Makefile Thu Oct 25 13:53:45 2001 @@ -0,0 +1,22 @@ +# +# Makefile for the linux kernel. +# +# Note! Dependencies are done automagically by 'make dep', which also +# removes any old dependencies. DON'T put your own dependencies here +# unless it's something special (ie not a .c file). + +USE_STANDARD_AS_RULE := true + +O_TARGET := epxa10db.o + +# Object file lists. + +obj-y := arch.o irq.o mm.o time.o +obj-m := +obj-n := +obj- := + +export-objs := + + +include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-epxa10db/arch.c linux/arch/arm/mach-epxa10db/arch.c --- v2.4.13/linux/arch/arm/mach-epxa10db/arch.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-epxa10db/arch.c Thu Oct 25 13:53:45 2001 @@ -0,0 +1,62 @@ +/* + * linux/arch/arm/mach-epxa10db/arch.c + * + * Copyright (C) 2000 Deep Blue Solutions Ltd + * Copyright (C) 2001 Altera Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +extern void epxa10db_map_io(void); +extern void epxa10db_init_irq(void); + + +static void __init +epxa10db_fixup(struct machine_desc *desc, struct param_struct *params, + char **cmdline, struct meminfo *mi) +{ + + mi->nr_banks = 1; + mi->bank[0].start = 0; + mi->bank[0].size = (32*1024*1024); + mi->bank[0].node = 0; + +/* + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk( 1, 0, 0, 8192 ); + setup_initrd(0xc0200000, 6*1024*1024); +*/ +} + +MACHINE_START(CAMELOT, "Altera Epxa10db") + MAINTAINER("Altera Corporation") + BOOT_MEM(0x00000000, 0x7fffc000, 0xffffc000) + FIXUP(epxa10db_fixup) + MAPIO(epxa10db_map_io) + INITIRQ(epxa10db_init_irq) + +MACHINE_END diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-epxa10db/dma.c linux/arch/arm/mach-epxa10db/dma.c --- v2.4.13/linux/arch/arm/mach-epxa10db/dma.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-epxa10db/dma.c Thu Oct 25 13:53:45 2001 @@ -0,0 +1,36 @@ +/* + * linux/arch/arm/mach-epxa10db/dma.c + * + * Copyright (C) 1999 ARM Limited + * Copyright (C) 2000 Deep Blue Solutions Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +void __init arch_dma_init(dma_t *dma) +{ +} diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-epxa10db/irq.c linux/arch/arm/mach-epxa10db/irq.c --- v2.4.13/linux/arch/arm/mach-epxa10db/irq.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-epxa10db/irq.c Thu Oct 25 13:53:45 2001 @@ -0,0 +1,70 @@ +/* + * linux/arch/arm/mach-epxa10db/irq.c + * + * Copyright (C) 2001 Altera Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include +#include +#include + + +static void mask_irq(unsigned int irq) +{ + __raw_writel(1 << irq, INT_MC(IO_ADDRESS(EXC_INT_CTRL00_BASE))); +} + +static void unmask_irq(unsigned int irq) +{ + __raw_writel(1 << irq, INT_MS(IO_ADDRESS(EXC_INT_CTRL00_BASE))); +} + +void __init epxa10db_init_irq(void) +{ + unsigned int i; + + /* + * This bit sets up the interrupt controller using + * the 6 PLD interrupts mode (the default) each + * irqs is assigned a priority which is the same + * as its interrupt number. This scheme is used because + * its easy, but you may want to change it depending + * on the contents of your PLD + */ + + __raw_writel(3,INT_MODE(IO_ADDRESS(EXC_INT_CTRL00_BASE))); + for (i = 0; i < NR_IRQS; i++){ + __raw_writel(i+1, INT_PRIORITY_P0(IO_ADDRESS(EXC_INT_CTRL00_BASE)) + (4*i)); + } + + + for (i = 0; i < NR_IRQS; i++) { + + irq_desc[i].valid = 1; + irq_desc[i].probe_ok = 1; + irq_desc[i].mask_ack = mask_irq; + irq_desc[i].mask = mask_irq; + irq_desc[i].unmask = unmask_irq; + } + + /* Disable all interrupt */ + __raw_writel(-1,INT_MC(IO_ADDRESS(EXC_INT_CTRL00_BASE))); + +} diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-epxa10db/mm.c linux/arch/arm/mach-epxa10db/mm.c --- v2.4.13/linux/arch/arm/mach-epxa10db/mm.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-epxa10db/mm.c Thu Oct 25 13:53:45 2001 @@ -0,0 +1,48 @@ +/* + * linux/arch/arm/mach-epxa10db/mm.c + * + * MM routines for Altera'a Epxa10db board + * + * Copyright (C) 2001 Altera Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include + +#include +#include +#include +#include + +#include + +/* Page table mapping for I/O region */ + +static struct map_desc epxa10db_io_desc[] __initdata = { + { IO_ADDRESS(EXC_REGISTERS_BASE), EXC_REGISTERS_BASE, SZ_16K , DOMAIN_IO, 0, 1}, +{IO_ADDRESS(EXC_PLD_BLOCK0_BASE), EXC_PLD_BLOCK0_BASE, SZ_16K , DOMAIN_IO, 0, 1}, +{IO_ADDRESS(EXC_PLD_BLOCK1_BASE), EXC_PLD_BLOCK1_BASE, SZ_16K , DOMAIN_IO, 0, 1}, +{IO_ADDRESS(EXC_PLD_BLOCK2_BASE), EXC_PLD_BLOCK2_BASE, SZ_16K , DOMAIN_IO, 0, 1}, +{IO_ADDRESS(EXC_PLD_BLOCK3_BASE), EXC_PLD_BLOCK3_BASE, SZ_16K , DOMAIN_IO, 0, 1}, +{ FLASH_VADDR(EXC_EBI_BLOCK0_BASE), EXC_EBI_BLOCK0_BASE, SZ_16M , DOMAIN_IO, 0, 1}, + LAST_DESC +}; + +void __init epxa10db_map_io(void) +{ + iotable_init(epxa10db_io_desc); +} diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-epxa10db/time.c linux/arch/arm/mach-epxa10db/time.c --- v2.4.13/linux/arch/arm/mach-epxa10db/time.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-epxa10db/time.c Thu Oct 25 13:53:45 2001 @@ -0,0 +1,33 @@ +/* + * linux/arch/arm/mach-epxa10db/time.c + * + * Copyright (C) 2000 Deep Blue Solutions + * Copyright (C) 2001 Altera Corporation + * + * 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. + */ +#include +#include +#include + +#include + + + +extern int (*set_rtc)(void); + +static int epxa10db_set_rtc(void) +{ + return 1; +} + +static int epxa10db_rtc_init(void) +{ + set_rtc = epxa10db_set_rtc; + + return 0; +} + +__initcall(epxa10db_rtc_init); diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/Makefile linux/arch/arm/mach-sa1100/Makefile --- v2.4.13/linux/arch/arm/mach-sa1100/Makefile Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/Makefile Thu Oct 25 13:53:45 2001 @@ -14,9 +14,12 @@ obj-n := obj- := -export-objs := assabet.o h3600.o freebird.o huw_webpanel.o yopy.o \ - generic.o hwtimer.o irq.o usb_ctl.o usb_recv.o usb_send.o \ - dma-sa1100.o dma-sa1111.o pcipool.o sa1111-pcibuf.o +export-objs := assabet.o dma-sa1100.o dma-sa1111.o freebird.o generic.o \ + h3600.o huw_webpanel.o irq.o pcipool.o sa1111-pcibuf.o \ + yopy.o + +# These aren't present yet, and prevents a plain -ac kernel building. +# hwtimer.o usb_ctl.o usb_recv.o usb_send.o # Common support (must be linked before board specific support) obj-y += generic.o irq.o dma-sa1100.o @@ -27,6 +30,7 @@ # We link the CPU support next, so that RAM timings can be tuned. ifeq ($(CONFIG_CPU_FREQ),y) obj-$(CONFIG_SA1100_ASSABET) += cpu-sa1110.o +obj-$(CONFIG_SA1100_CERF) += cpu-sa1110.o obj-$(CONFIG_SA1100_LART) += cpu-sa1100.o endif @@ -63,14 +67,19 @@ # LEDs support leds-y := leds.o +leds-$(CONFIG_SA1100_ADSBITSY) += leds-adsbitsy.o leds-$(CONFIG_SA1100_ASSABET) += leds-assabet.o leds-$(CONFIG_SA1100_BRUTUS) += leds-brutus.o leds-$(CONFIG_SA1100_CERF) += leds-cerf.o leds-$(CONFIG_SA1100_FLEXANET) += leds-flexanet.o leds-$(CONFIG_SA1100_GRAPHICSCLIENT) += leds-graphicsclient.o +leds-$(CONFIG_SA1100_GRAPHICSMASTER) += leds-graphicsmaster.o leds-$(CONFIG_SA1100_LART) += leds-lart.o leds-$(CONFIG_SA1100_PFS168) += leds-pfs168.o -leds-$(CONFIG_SA1100_GRAPHICSMASTER) += leds-graphicsmaster.o +leds-$(CONFIG_SA1100_SIMPAD) += leds-simpad.o obj-$(CONFIG_LEDS) += $(leds-y) + +# Miscelaneous functions +obj-$(CONFIG_PM) += pm.o sleep.o include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/assabet.c linux/arch/arm/mach-sa1100/assabet.c --- v2.4.13/linux/arch/arm/mach-sa1100/assabet.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/assabet.c Thu Oct 25 13:53:45 2001 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -26,13 +27,13 @@ #include #include #include -#include +#include #include "generic.h" -unsigned long BCR_value = BCR_DB1110; -unsigned long SCR_value = SCR_INIT; +unsigned long BCR_value = ASSABET_BCR_DB1110; +unsigned long SCR_value = ASSABET_SCR_INIT; EXPORT_SYMBOL(BCR_value); EXPORT_SYMBOL(SCR_value); @@ -46,7 +47,7 @@ * This must precede any driver calls to BCR_set() * or BCR_clear(). */ - BCR = BCR_value = BCR_DB1111; + ASSABET_BCR = BCR_value = ASSABET_BCR_DB1111; NCR_0 = 0; #ifndef CONFIG_ASSABET_NEPONSET @@ -68,7 +69,7 @@ */ static void __init map_sa1100_gpio_regs( void ) { - unsigned long phys = _GPLR & PMD_MASK; + unsigned long phys = __PREG(GPLR) & PMD_MASK; unsigned long virt = io_p2v(phys); int prot = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_DOMAIN(DOMAIN_IO); pmd_t pmd; @@ -185,17 +186,17 @@ { if (port->mapbase == _Ser1UTCR0) { if (state) - BCR_clear(BCR_RS232EN); + ASSABET_BCR_clear(ASSABET_BCR_RS232EN); else - BCR_set(BCR_RS232EN); + ASSABET_BCR_set(ASSABET_BCR_RS232EN); } } /* * Note! this can be called from IRQ context. - * FIXME: You _need_ to handle BCR carefully, which doesn't + * FIXME: You _need_ to handle ASSABET_BCR carefully, which doesn't * happen at the moment. Suggest putting interrupt save/restore - * in BCR_set/clear. + * in ASSABET_BCR_set/clear. * * NB: Assabet uses COM_RTS and COM_DTR for both UART1 (com port) * and UART3 (radio module). We only handle them for UART1 here. @@ -206,43 +207,43 @@ u_int set = 0, clear = 0; if (mctrl & TIOCM_RTS) - set |= BCR_COM_RTS; + set |= ASSABET_BCR_COM_RTS; else - clear |= BCR_COM_RTS; + clear |= ASSABET_BCR_COM_RTS; if (mctrl & TIOCM_DTR) - set |= BCR_COM_DTR; + set |= ASSABET_BCR_COM_DTR; else - clear |= BCR_COM_DTR; + clear |= ASSABET_BCR_COM_DTR; - BCR_clear(clear); - BCR_set(set); + ASSABET_BCR_clear(clear); + ASSABET_BCR_set(set); } } static int assabet_get_mctrl(struct uart_port *port) { u_int ret = 0; - u_int bsr = BSR; + u_int bsr = ASSABET_BSR; /* need 2 reads to read current value */ - bsr = BSR; + bsr = ASSABET_BSR; if (port->mapbase == _Ser1UTCR0) { - if (bsr & BSR_COM_DCD) + if (bsr & ASSABET_BSR_COM_DCD) ret |= TIOCM_CD; - if (bsr & BSR_COM_CTS) + if (bsr & ASSABET_BSR_COM_CTS) ret |= TIOCM_CTS; - if (bsr & BSR_COM_DSR) + if (bsr & ASSABET_BSR_COM_DSR) ret |= TIOCM_DSR; } else if (port->mapbase == _Ser3UTCR0) { - if (bsr & BSR_RAD_DCD) + if (bsr & ASSABET_BSR_RAD_DCD) ret |= TIOCM_CD; - if (bsr & BSR_RAD_CTS) + if (bsr & ASSABET_BSR_RAD_CTS) ret |= TIOCM_CTS; - if (bsr & BSR_RAD_DSR) + if (bsr & ASSABET_BSR_RAD_DSR) ret |= TIOCM_DSR; - if (bsr & BSR_RAD_RI) + if (bsr & ASSABET_BSR_RAD_RI) ret |= TIOCM_RI; } else { ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR; @@ -304,6 +305,18 @@ */ GPDR |= GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; GPCR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM; + + /* + * Set up registers for sleep mode. + */ + PWER = PWER_GPIO0; + PGSR = 0; + PCFR = 0; + + /* + * Clear all possible wakeup reasons. + */ + RCSR = RCSR_HWR | RCSR_SWR | RCSR_WDR | RCSR_SMR; } diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/cerf.c linux/arch/arm/mach-sa1100/cerf.c --- v2.4.13/linux/arch/arm/mach-sa1100/cerf.c Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mach-sa1100/cerf.c Thu Oct 25 13:53:46 2001 @@ -16,31 +16,60 @@ #include "generic.h" +static void __init cerf_init_irq (void) +{ + sa1100_init_irq(); + + /* Need to register these as rising edge interrupts + * For standard 16550 serial driver support + * Basically - I copied it from pfs168.c :) + */ +#ifdef CONFIG_SA1100_CERF_CPLD + set_GPIO_IRQ_edge(GPIO_GPIO(3), GPIO_RISING_EDGE); /* PDA Full serial port */ + set_GPIO_IRQ_edge(GPIO_GPIO(2), GPIO_RISING_EDGE); /* PDA Bluetooth */ + GPDR &= ~(GPIO_GPIO(3)); /* Set the direction of serial port GPIO pin to in */ + GPDR &= ~(GPIO_GPIO(2)); /* Set the direction of bluetooth GPIO pin to in */ +#endif /* CONFIG_SA1100_CERF_CPLD */ +} + static void __init fixup_cerf(struct machine_desc *desc, struct param_struct *params, char **cmdline, struct meminfo *mi) { -#ifdef CONFIG_SA1100_CERF_32MB - // 32MB RAM +#if defined(CONFIG_SA1100_CERF_64MB) + // 64MB RAM + SET_BANK( 0, 0xc0000000, 64*1024*1024 ); + mi->nr_banks = 1; +#elif defined(CONFIG_SA1100_CERF_32MB) // 32MB RAM SET_BANK( 0, 0xc0000000, 32*1024*1024 ); mi->nr_banks = 1; -#else - // 16Meg Ram. +#elif defined(CONFIG_SA1100_CERF_16MB) // 16Meg Ram. SET_BANK( 0, 0xc0000000, 8*1024*1024 ); - SET_BANK( 1, 0xc8000000, 8*1024*1024 ); // comment this out for 8MB Cerfs + SET_BANK( 1, 0xc8000000, 8*1024*1024 ); mi->nr_banks = 2; +#elif defined(CONFIG_SA1100_CERF_8MB) + // 8Meg Ram. + SET_BANK( 0, 0xc0000000, 8*1024*1024 ); + mi->nr_banks = 1; +#else + #error "Undefined memory size for Cerfboard." #endif - ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); - setup_ramdisk(1, 0, 0, 8192); - // Save 2Meg for RAMDisk - setup_initrd(0xc0500000, 3*1024*1024); +// ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); +// setup_ramdisk(1, 0, 0, 8192); +// // Save 2Meg for RAMDisk +// setup_initrd(0xc0500000, 3*1024*1024); } static struct map_desc cerf_io_desc[] __initdata = { - /* virtual physical length domain r w c b */ - { 0xe8000000, 0x00000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ - { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Crystal Chip */ + /* virtual physical length domain r w c b */ + { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ + { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Crystal Ethernet Chip */ +#ifdef CONFIG_SA1100_CERF_CPLD + { 0xf1000000, 0x40000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* CPLD Chip */ + { 0xf2000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* CerfPDA Bluetooth */ + { 0xf3000000, 0x18000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* CerfPDA Serial */ +#endif LAST_DESC }; @@ -49,14 +78,19 @@ sa1100_map_io(); iotable_init(cerf_io_desc); - sa1100_register_uart(0, 3); + sa1100_register_uart(0, 3); +#ifdef CONFIG_SA1100_CERF_IRDA_ENABLED sa1100_register_uart(1, 1); +#else + sa1100_register_uart(1, 2); + sa1100_register_uart(2, 1); +#endif } -MACHINE_START(CERF, "Intrinsyc CerfBoard") - MAINTAINER("Pieter Truter") +MACHINE_START(CERF, "Intrinsyc's Cerf Family of Products") + MAINTAINER("support@intrinsyc.com") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) FIXUP(fixup_cerf) MAPIO(cerf_map_io) - INITIRQ(sa1100_init_irq) + INITIRQ(cerf_init_irq) MACHINE_END diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/dma-sa1100.c linux/arch/arm/mach-sa1100/dma-sa1100.c --- v2.4.13/linux/arch/arm/mach-sa1100/dma-sa1100.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/dma-sa1100.c Thu Oct 25 13:53:46 2001 @@ -611,7 +611,7 @@ int channel; for (channel = 0; channel < SA1100_DMA_CHANNELS; channel++) { dma_chan[channel].regs = - (dma_regs_t *) io_p2v(_DDAR(channel)); + (dma_regs_t *) &DDAR(channel); dma_chan[channel].irq = IRQ_DMA0 + channel; } return 0; diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/dma-sa1111.c linux/arch/arm/mach-sa1100/dma-sa1111.c --- v2.4.13/linux/arch/arm/mach-sa1100/dma-sa1111.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/dma-sa1111.c Thu Oct 25 13:53:46 2001 @@ -23,7 +23,6 @@ #include #include - // #define DEBUG #ifdef DEBUG #define DPRINTK( s, arg... ) printk( "dma<%s>: " s, dma->device_id , ##arg ) @@ -305,7 +304,7 @@ * SDRAM bank 1 on Neponset). The default configuration selects * Assabet, so any address in bank 1 is necessarily invalid. */ - if((machine_is_assabet() || machine_is_pfs168()) && addr >= _DRAMBnk1) + if((machine_is_assabet() || machine_is_pfs168()) && addr >= 0xc8000000) return -1; /* The bug only applies to buffers located more than one megabyte @@ -340,7 +339,7 @@ return -1; break; default: - printk(KERN_ERR "%s(): invalid SMCR DRAC value 0%o\n", + printk(KERN_ERR "%s(): invalid SMCR DRAC value 0%lo\n", __FUNCTION__, FExtr(SBI_SMCR, SMCR_DRAC)); return -1; } diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/freebird.c linux/arch/arm/mach-sa1100/freebird.c --- v2.4.13/linux/arch/arm/mach-sa1100/freebird.c Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mach-sa1100/freebird.c Thu Oct 25 13:53:46 2001 @@ -50,6 +50,11 @@ sa1100_register_uart(0, 3); sa1100_register_uart(1, 1); + + /* Set up sleep mode registers */ + PWER = 0x1; + PGSR = 0x0; + PCFR = PCFR_OPDE | PCFR_FP | PCFR_FS; } MACHINE_START(FREEBIRD, "Freebird-HPC-1.1") diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/graphicsclient.c linux/arch/arm/mach-sa1100/graphicsclient.c --- v2.4.13/linux/arch/arm/mach-sa1100/graphicsclient.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/graphicsclient.c Thu Oct 25 13:53:46 2001 @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -143,11 +144,185 @@ LAST_DESC }; +static struct gc_uart_ctrl_data_t gc_uart_ctrl_data[] = { + { GPIO_GC_UART0_CTS, 0, NULL,NULL }, + { GPIO_GC_UART1_CTS, 0, NULL,NULL }, + { GPIO_GC_UART2_CTS, 0, NULL,NULL } +}; + +static void +graphicsclient_cts_intr(int irq, void *dev_id, struct pt_regs *regs) +{ + struct gc_uart_ctrl_data_t * uart_data = (struct gc_uart_ctrl_data_t *)dev_id; + int cts = !(GPLR & uart_data->cts_gpio); + + /* NOTE: I supose that we will no get any interrupt + if the GPIO is not changed, so maybe + the cts_prev_state can be removed ... */ + if (cts != uart_data->cts_prev_state) { + uart_data->cts_prev_state = cts; + + uart_handle_cts_change(uart_data->info, cts); + } +} + +static int +graphicsclient_register_cts_intr(int gpio, int irq, + struct gc_uart_ctrl_data_t *uart_data) +{ + int ret = 0; + + set_GPIO_IRQ_edge(gpio, GPIO_BOTH_EDGES); + + ret = request_irq(irq, graphicsclient_cts_intr, + 0, "GC RS232 CTS", uart_data); + if (ret) { + printk(KERN_ERR "uart_open: failed to register CTS irq (%d)\n", + ret); + free_irq(irq, uart_data); + } + + return ret; +} + +static int +graphicsclient_uart_open(struct uart_port *port, struct uart_info *info) +{ + int ret = 0; + + if (port->mapbase == _Ser1UTCR0) { + Ser1SDCR0 |= SDCR0_UART; + /* Set RTS Output */ + GPDR |= GPIO_GC_UART0_RTS; + GPSR = GPIO_GC_UART0_RTS; + + /* Set CTS Input */ + GPDR &= ~GPIO_GC_UART0_CTS; + + gc_uart_ctrl_data[0].cts_prev_state = 0; + gc_uart_ctrl_data[0].info = info; + gc_uart_ctrl_data[0].port = port; + + /* register uart0 CTS irq */ + ret = graphicsclient_register_cts_intr(GPIO_GC_UART0_CTS, + IRQ_GC_UART0_CTS, + &gc_uart_ctrl_data[0]); + } else if (port->mapbase == _Ser2UTCR0) { + Ser2UTCR4 = Ser2HSCR0 = 0; + /* Set RTS Output */ + GPDR |= GPIO_GC_UART1_RTS; + GPSR = GPIO_GC_UART1_RTS; + + /* Set CTS Input */ + GPDR &= ~GPIO_GC_UART1_RTS; + + gc_uart_ctrl_data[1].cts_prev_state = 0; + gc_uart_ctrl_data[1].info = info; + gc_uart_ctrl_data[1].port = port; + + /* register uart1 CTS irq */ + ret = graphicsclient_register_cts_intr(GPIO_GC_UART1_CTS, + IRQ_GC_UART1_CTS, + &gc_uart_ctrl_data[1]); + } else if (port->mapbase == _Ser3UTCR0) { + /* Set RTS Output */ + GPDR |= GPIO_GC_UART2_RTS; + GPSR = GPIO_GC_UART2_RTS; + + /* Set CTS Input */ + GPDR &= ~GPIO_GC_UART2_RTS; + + gc_uart_ctrl_data[2].cts_prev_state = 0; + gc_uart_ctrl_data[2].info = info; + gc_uart_ctrl_data[2].port = port; + + /* register uart2 CTS irq */ + ret = graphicsclient_register_cts_intr(GPIO_GC_UART2_CTS, + IRQ_GC_UART2_CTS, + &gc_uart_ctrl_data[2]); + } + return ret; +} + +static int +graphicsclient_uart_close(struct uart_port *port, struct uart_info *info) +{ + if (port->mapbase == _Ser1UTCR0) { + free_irq(IRQ_GC_UART0_CTS, &gc_uart_ctrl_data[0]); + } else if (port->mapbase == _Ser2UTCR0) { + free_irq(IRQ_GC_UART1_CTS, &gc_uart_ctrl_data[1]); + } else if (port->mapbase == _Ser3UTCR0) { + free_irq(IRQ_GC_UART2_CTS, &gc_uart_ctrl_data[2]); + } + + return 0; +} + +static int graphicsclient_get_mctrl(struct uart_port *port) +{ + int result = TIOCM_CD | TIOCM_DSR; + + if (port->mapbase == _Ser1UTCR0) { + if (!(GPLR & GPIO_GC_UART0_CTS)) + result |= TIOCM_CTS; + } else if (port->mapbase == _Ser2UTCR0) { + if (!(GPLR & GPIO_GC_UART1_CTS)) + result |= TIOCM_CTS; + } else if (port->mapbase == _Ser3UTCR0) { + if (!(GPLR & GPIO_GC_UART2_CTS)) + result |= TIOCM_CTS; + } else { + result = TIOCM_CTS; + } + + return result; +} + +static void graphicsclient_set_mctrl(struct uart_port *port, u_int mctrl) +{ + if (port->mapbase == _Ser1UTCR0) { + if (mctrl & TIOCM_RTS) + GPCR = GPIO_GC_UART0_RTS; + else + GPSR = GPIO_GC_UART0_RTS; + } else if (port->mapbase == _Ser2UTCR0) { + if (mctrl & TIOCM_RTS) + GPCR = GPIO_GC_UART1_RTS; + else + GPSR = GPIO_GC_UART1_RTS; + } else if (port->mapbase == _Ser3UTCR0) { + if (mctrl & TIOCM_RTS) + GPCR = GPIO_GC_UART2_RTS; + else + GPSR = GPIO_GC_UART2_RTS; + } +} + +static void +graphicsclient_uart_pm(struct uart_port *port, u_int state, u_int oldstate) +{ + if (!state) { + /* make serial ports work ... */ + Ser2UTCR4 = 0; + Ser2HSCR0 = 0; + Ser1SDCR0 |= SDCR0_UART; + } +} + +static struct sa1100_port_fns graphicsclient_port_fns __initdata = { + open: graphicsclient_uart_open, + close: graphicsclient_uart_close, + get_mctrl: graphicsclient_get_mctrl, + set_mctrl: graphicsclient_set_mctrl, + pm: graphicsclient_uart_pm, +}; + static void __init graphicsclient_map_io(void) { sa1100_map_io(); iotable_init(graphicsclient_io_desc); + sa1100_register_uart_fns(&graphicsclient_port_fns); sa1100_register_uart(0, 3); sa1100_register_uart(1, 1); sa1100_register_uart(2, 2); diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/graphicsmaster.c linux/arch/arm/mach-sa1100/graphicsmaster.c --- v2.4.13/linux/arch/arm/mach-sa1100/graphicsmaster.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/graphicsmaster.c Thu Oct 25 13:53:46 2001 @@ -207,11 +207,100 @@ LAST_DESC }; +static int graphicsmaster_uart_open(struct uart_port *port, struct uart_info *info) +{ + int ret = 0; + + if (port->mapbase == _Ser1UTCR0) { + Ser1SDCR0 |= SDCR0_UART; + /* Set RTS Output */ + GPSR = GPIO_GPIO15; + GPDR |= GPIO_GPIO15; + /* Set CTS Input */ + GPDR &= ~GPIO_GPIO14; + } + else if (port->mapbase == _Ser2UTCR0) { + Ser2UTCR4 = Ser2HSCR0 = 0; + /* Set RTS Output */ + GPSR = GPIO_GPIO17; + GPDR |= GPIO_GPIO17; + /* Set CTS Input */ + GPDR &= ~GPIO_GPIO16; + } + else if (port->mapbase == _Ser3UTCR0) { + /* Set RTS Output */ + GPSR = GPIO_GPIO19; + GPDR |= GPIO_GPIO19; + /* Set CTS Input */ + GPDR &= ~GPIO_GPIO18; + } + return ret; +} + +static int graphicsmaster_get_mctrl(struct uart_port *port) +{ + int result = TIOCM_CD | TIOCM_DSR; + + if (port->mapbase == _Ser1UTCR0) { + if (!(GPLR & GPIO_GPIO14)) + result |= TIOCM_CTS; + } else if (port->mapbase == _Ser2UTCR0) { + if (!(GPLR & GPIO_GPIO16)) + result |= TIOCM_CTS; + } else if (port->mapbase == _Ser3UTCR0) { + if (!(GPLR & GPIO_GPIO17)) + result |= TIOCM_CTS; + } else { + result = TIOCM_CTS; + } + + return result; +} + +static void graphicsmaster_set_mctrl(struct uart_port *port, u_int mctrl) +{ + if (port->mapbase == _Ser1UTCR0) { + if (mctrl & TIOCM_RTS) + GPCR = GPIO_GPIO15; + else + GPSR = GPIO_GPIO15; + } else if (port->mapbase == _Ser2UTCR0) { + if (mctrl & TIOCM_RTS) + GPCR = GPIO_GPIO17; + else + GPSR = GPIO_GPIO17; + } else if (port->mapbase == _Ser3UTCR0) { + if (mctrl & TIOCM_RTS) + GPCR = GPIO_GPIO19; + else + GPSR = GPIO_GPIO19; + } +} + +static void +graphicsmaster_uart_pm(struct uart_port *port, u_int state, u_int oldstate) +{ + if (!state) { + /* make serial ports work ... */ + Ser2UTCR4 = 0; + Ser2HSCR0 = 0; + Ser1SDCR0 |= SDCR0_UART; + } +} + +static struct sa1100_port_fns graphicsmaster_port_fns __initdata = { + open: graphicsmaster_uart_open, + get_mctrl: graphicsmaster_get_mctrl, + set_mctrl: graphicsmaster_set_mctrl, + pm: graphicsmaster_uart_pm, +}; + static void __init graphicsmaster_map_io(void) { sa1100_map_io(); iotable_init(graphicsmaster_io_desc); + sa1100_register_uart_fns(&graphicsmaster_port_fns); sa1100_register_uart(0, 3); sa1100_register_uart(1, 1); sa1100_register_uart(2, 2); diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/h3600.c linux/arch/arm/mach-sa1100/h3600.c --- v2.4.13/linux/arch/arm/mach-sa1100/h3600.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/h3600.c Thu Oct 25 13:53:46 2001 @@ -27,14 +27,62 @@ static int h3600_egpio = EGPIO_H3600_RS232_ON; +void init_h3600_egpio(void) +{ +#ifdef CONFIG_IPAQ_H3100 + int h3100_controls = (GPIO_H3100_BT_ON + | GPIO_H3100_QMUTE + | GPIO_H3100_LCD_3V_ON + | GPIO_H3100_AUD_ON + | GPIO_H3100_AUD_PWR_ON + | GPIO_H3100_IR_ON + | GPIO_H3100_IR_FSEL); + GPDR |= h3100_controls; + GPCR = h3100_controls; + GAFR = GPIO_SSP_CLK; +#endif +} + void clr_h3600_egpio(unsigned long x) { +#ifdef CONFIG_IPAQ_H3100 + unsigned long gpcr = 0; + if (x&EGPIO_H3600_QMUTE) + gpcr |= GPIO_H3100_QMUTE; + if (x&EGPIO_H3600_LCD_ON) + gpcr |= GPIO_H3100_LCD_3V_ON; + if (x&EGPIO_H3600_AUD_AMP_ON) + gpcr |= GPIO_H3100_AUD_ON; + if (x&EGPIO_H3600_AUD_PWR_ON) + gpcr |= GPIO_H3100_AUD_PWR_ON; + if (x&EGPIO_H3600_IR_ON) + gpcr |= GPIO_H3100_IR_ON; + if (x&EGPIO_H3600_IR_FSEL) + gpcr |= GPIO_H3100_IR_FSEL; + GPCR = gpcr; +#endif h3600_egpio &= ~x; H3600_EGPIO = h3600_egpio; } void set_h3600_egpio(unsigned long x) { +#ifdef CONFIG_IPAQ_H3100 + unsigned long gpsr = 0; + if (x&EGPIO_H3600_QMUTE) + gpsr |= GPIO_H3100_QMUTE; + if (x&EGPIO_H3600_LCD_ON) + gpsr |= GPIO_H3100_LCD_3V_ON; + if (x&EGPIO_H3600_AUD_AMP_ON) + gpsr |= GPIO_H3100_AUD_ON; + if (x&EGPIO_H3600_AUD_PWR_ON) + gpsr |= GPIO_H3100_AUD_PWR_ON; + if (x&EGPIO_H3600_IR_ON) + gpsr |= GPIO_H3100_IR_ON; + if (x&EGPIO_H3600_IR_FSEL) + gpsr |= GPIO_H3100_IR_FSEL; + GPSR = gpsr; +#endif h3600_egpio |= x; H3600_EGPIO = h3600_egpio; } @@ -153,8 +201,8 @@ /* virtual physical length domain r w c b */ { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ { 0xf0000000, 0x49000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* EGPIO 0 */ - { 0xf1000000, 0x10000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* static memory bank 2 */ - { 0xf3000000, 0x40000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* static memory bank 4 */ + { 0xf1000000, 0x10000000, 0x02800000, DOMAIN_IO, 1, 1, 0, 0 }, /* static memory bank 2 */ + { 0xf3800000, 0x40000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* static memory bank 4 */ LAST_DESC }; @@ -166,7 +214,7 @@ sa1100_register_uart_fns(&h3600_port_fns); sa1100_register_uart(0, 3); sa1100_register_uart(1, 1); /* isn't this one driven elsewhere? */ - sa1100_register_uart(2, 2); + init_h3600_egpio(); /* * Default GPIO settings. @@ -179,6 +227,11 @@ */ PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM; PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM); + + /* Configure suspend conditions */ + PGSR = 0; + PWER = 0x1 | (1 << 31); + PCFR = PCFR_OPDE | PCFR_FP | PCFR_FS; } MACHINE_START(H3600, "Compaq iPAQ") diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/leds-adsbitsy.c linux/arch/arm/mach-sa1100/leds-adsbitsy.c --- v2.4.13/linux/arch/arm/mach-sa1100/leds-adsbitsy.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-sa1100/leds-adsbitsy.c Thu Oct 25 13:53:46 2001 @@ -0,0 +1,96 @@ +/* + * linux/arch/arm/mach-sa1100/leds-adsbitsy.c + * + * ADS Bitsy LED + * 7/25/01 Woojung Huh + */ +#include +#include + +#include +#include +#include + +#include "leds.h" + + +#define LED_STATE_ENABLED 1 +#define LED_STATE_CLAIMED 2 + +static unsigned int led_state; +static unsigned int hw_led_state; + +#define LED_TIMER GPIO_GPIO20 /* green heartbeat */ + +#define LED_MASK (LED_TIMER) + +void adsbitsy_leds_event(led_event_t evt) +{ + unsigned long flags; + + save_flags_cli(flags); + + switch (evt) { + case led_start: + hw_led_state = 0; /* gc leds are positive logic */ + led_state = LED_STATE_ENABLED; + break; + + case led_stop: + led_state &= ~LED_STATE_ENABLED; + break; + + case led_claim: + led_state |= LED_STATE_CLAIMED; + hw_led_state = LED_MASK; + break; + + case led_release: + led_state &= ~LED_STATE_CLAIMED; + hw_led_state = LED_MASK; + break; + +#ifdef CONFIG_LEDS_TIMER + case led_timer: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state ^= LED_TIMER; + break; +#endif + +#ifdef CONFIG_LEDS_CPU + case led_idle_start: + break; + + case led_idle_end: + break; +#endif + + case led_green_on: + break; + + case led_green_off: + break; + + case led_amber_on: + break; + + case led_amber_off: + break; + + case led_red_on: + break; + + case led_red_off: + break; + + default: + break; + } + + if (led_state & LED_STATE_ENABLED) { + GPSR = hw_led_state; + GPCR = hw_led_state ^ LED_MASK; + } + + restore_flags(flags); +} diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/leds-assabet.c linux/arch/arm/mach-sa1100/leds-assabet.c --- v2.4.13/linux/arch/arm/mach-sa1100/leds-assabet.c Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mach-sa1100/leds-assabet.c Thu Oct 25 13:53:46 2001 @@ -15,6 +15,7 @@ #include #include #include +#include #include "leds.h" @@ -25,7 +26,7 @@ static unsigned int led_state; static unsigned int hw_led_state; -#define BCR_LED_MASK (BCR_LED_GREEN | BCR_LED_RED) +#define ASSABET_BCR_LED_MASK (ASSABET_BCR_LED_GREEN | ASSABET_BCR_LED_RED) void assabet_leds_event(led_event_t evt) { @@ -35,7 +36,7 @@ switch (evt) { case led_start: - hw_led_state = BCR_LED_RED | BCR_LED_GREEN; + hw_led_state = ASSABET_BCR_LED_RED | ASSABET_BCR_LED_GREEN; led_state = LED_STATE_ENABLED; break; @@ -45,30 +46,30 @@ case led_claim: led_state |= LED_STATE_CLAIMED; - hw_led_state = BCR_LED_RED | BCR_LED_GREEN; + hw_led_state = ASSABET_BCR_LED_RED | ASSABET_BCR_LED_GREEN; break; case led_release: led_state &= ~LED_STATE_CLAIMED; - hw_led_state = BCR_LED_RED | BCR_LED_GREEN; + hw_led_state = ASSABET_BCR_LED_RED | ASSABET_BCR_LED_GREEN; break; #ifdef CONFIG_LEDS_TIMER case led_timer: if (!(led_state & LED_STATE_CLAIMED)) - hw_led_state ^= BCR_LED_GREEN; + hw_led_state ^= ASSABET_BCR_LED_GREEN; break; #endif #ifdef CONFIG_LEDS_CPU case led_idle_start: if (!(led_state & LED_STATE_CLAIMED)) - hw_led_state |= BCR_LED_RED; + hw_led_state |= ASSABET_BCR_LED_RED; break; case led_idle_end: if (!(led_state & LED_STATE_CLAIMED)) - hw_led_state &= ~BCR_LED_RED; + hw_led_state &= ~ASSABET_BCR_LED_RED; break; #endif @@ -77,12 +78,12 @@ case led_green_on: if (led_state & LED_STATE_CLAIMED) - hw_led_state &= ~BCR_LED_GREEN; + hw_led_state &= ~ASSABET_BCR_LED_GREEN; break; case led_green_off: if (led_state & LED_STATE_CLAIMED) - hw_led_state |= BCR_LED_GREEN; + hw_led_state |= ASSABET_BCR_LED_GREEN; break; case led_amber_on: @@ -93,12 +94,12 @@ case led_red_on: if (led_state & LED_STATE_CLAIMED) - hw_led_state &= ~BCR_LED_RED; + hw_led_state &= ~ASSABET_BCR_LED_RED; break; case led_red_off: if (led_state & LED_STATE_CLAIMED) - hw_led_state |= BCR_LED_RED; + hw_led_state |= ASSABET_BCR_LED_RED; break; default: @@ -106,7 +107,8 @@ } if (led_state & LED_STATE_ENABLED) - BCR = BCR_value = (BCR_value & ~BCR_LED_MASK) | hw_led_state; + ASSABET_BCR = BCR_value = (BCR_value & ~ASSABET_BCR_LED_MASK) | + hw_led_state; local_irq_restore(flags); } diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/leds-cerf.c linux/arch/arm/mach-sa1100/leds-cerf.c --- v2.4.13/linux/arch/arm/mach-sa1100/leds-cerf.c Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mach-sa1100/leds-cerf.c Thu Oct 25 13:53:46 2001 @@ -19,11 +19,23 @@ static unsigned int led_state; static unsigned int hw_led_state; +#ifdef CONFIG_SA1100_CERF_CPLD + +#define LED_D0 GPIO_GPIO(0) +#define LED_D1 GPIO_GPIO(0) +#define LED_D2 GPIO_GPIO(0) +#define LED_D3 GPIO_GPIO(0) +#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3) + +#else + #define LED_D0 GPIO_GPIO(0) #define LED_D1 GPIO_GPIO(1) #define LED_D2 GPIO_GPIO(2) #define LED_D3 GPIO_GPIO(3) #define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3) + +#endif void cerf_leds_event(led_event_t evt) { diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/leds-simpad.c linux/arch/arm/mach-sa1100/leds-simpad.c --- v2.4.13/linux/arch/arm/mach-sa1100/leds-simpad.c Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mach-sa1100/leds-simpad.c Thu Oct 25 13:53:46 2001 @@ -22,13 +22,16 @@ #define LED_GREEN (1) #define LED_MASK (1) +extern void set_cs3_bit(int value); +extern void clear_cs3_bit(int value); + void simpad_leds_event(led_event_t evt) { unsigned long flags; //local_irq_save(flags); - switch (evt) + switch (evt) { case led_start: hw_led_state = LED_GREEN; @@ -94,8 +97,9 @@ } if (led_state & LED_STATE_ENABLED) - cs3_shadow |= LED2_ON; - + set_cs3_bit(LED2_ON); + else + clear_cs3_bit(LED2_ON); //local_irq_restore(flags); } diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/leds.c linux/arch/arm/mach-sa1100/leds.c --- v2.4.13/linux/arch/arm/mach-sa1100/leds.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/leds.c Thu Oct 25 13:53:46 2001 @@ -32,6 +32,8 @@ leds_event = pfs168_leds_event; if (machine_is_graphicsmaster()) leds_event = graphicsmaster_leds_event; + if (machine_is_adsbitsy()) + leds_event = adsbitsy_leds_event; leds_event(led_start); return 0; diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/leds.h linux/arch/arm/mach-sa1100/leds.h --- v2.4.13/linux/arch/arm/mach-sa1100/leds.h Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/leds.h Thu Oct 25 13:53:46 2001 @@ -6,3 +6,4 @@ extern void lart_leds_event(led_event_t evt); extern void pfs168_leds_event(led_event_t evt); extern void graphicsmaster_leds_event(led_event_t evt); +extern void adsbitsy_leds_event(led_event_t evt); diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/neponset.c linux/arch/arm/mach-sa1100/neponset.c --- v2.4.13/linux/arch/arm/mach-sa1100/neponset.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mach-sa1100/neponset.c Thu Oct 25 13:53:46 2001 @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -14,7 +15,7 @@ #include #include #include -#include +#include #include "sa1111.h" @@ -68,8 +69,8 @@ irq = NEPONSET_USAR_IRQ; irq_desc[irq].valid = 1; irq_desc[irq].probe_ok = 1; - set_GPIO_IRQ_edge( GPIO_NEP_IRQ, GPIO_RISING_EDGE ); - setup_arm_irq( IRQ_GPIO_NEP_IRQ, &neponset_irq ); + set_GPIO_IRQ_edge(ASSABET_GPIO_NEP_IRQ, GPIO_RISING_EDGE); + setup_arm_irq(ASSABET_IRQ_GPIO_NEP_IRQ, &neponset_irq); } static int __init neponset_init(void) diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/pm.c linux/arch/arm/mach-sa1100/pm.c --- v2.4.13/linux/arch/arm/mach-sa1100/pm.c Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-sa1100/pm.c Thu Oct 25 13:53:46 2001 @@ -0,0 +1,183 @@ +/* + * SA1100 Power Management Routines + * + * Copyright (c) 2001 Cliff Brake + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License. + * + * History: + * + * 2001-02-06: Cliff Brake Initial code + * + * 2001-02-25: Sukjae Cho & + * Chester Kuo + * Save more value for the resume function! Support + * Bitsy/Assabet/Freebird board + * + * 2001-08-29: Nicolas Pitre + * Cleaned up, pushed platform dependent stuff + * in the platform specific files. + */ + +/* + * Debug macros + */ +#define DEBUG 1 +#ifdef DEBUG +# define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args) +#else +# define DPRINTK(fmt, args...) +#endif + + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "sleep.h" + +extern void sa1100_cpu_suspend(void); +extern void sa1100_cpu_resume(void); + +extern unsigned long *sleep_save; /* virtual address */ +extern unsigned long sleep_save_p; /* physical address */ + +#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x +#define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] + +int pm_do_suspend(void) +{ + int retval; + + /* set up pointer to sleep parameters */ + sleep_save = kmalloc (SLEEP_SAVE_SIZE*sizeof(long), GFP_ATOMIC); + if (!sleep_save) + return -ENOMEM; + sleep_save_p = virt_to_phys(sleep_save); + + retval = pm_send_all(PM_SUSPEND, (void *)2); + if (retval) { + kfree(sleep_save); + return retval; + } + + cli(); + + /* preserve current time */ + RCNR = xtime.tv_sec; + + /* save vital registers */ + SAVE(OSCR); + SAVE(OSMR0); + SAVE(OSMR1); + SAVE(OSMR2); + SAVE(OSMR3); + SAVE(OIER); + + SAVE(GPDR); + SAVE(GRER); + SAVE(GFER); + SAVE(GAFR); + + SAVE(PPDR); + SAVE(PPSR); + SAVE(PPAR); + SAVE(PSDR); + + SAVE(Ser1SDCR0); + + SAVE(ICMR); + + /* ... maybe a global variable initialized by arch code to set this? */ + GRER = PWER; + GFER = 0; + GEDR = GEDR; + + /* Clear previous reset status */ + RCSR = RCSR_HWR | RCSR_SWR | RCSR_WDR | RCSR_SMR; + + /* set resume return address */ + PSPR = virt_to_phys(sa1100_cpu_resume); + + /* go zzz */ + sa1100_cpu_suspend(); + + /* ensure not to come back here if it wasn't intended */ + PSPR = 0; + + DPRINTK("*** made it back from resume\n"); + + /* restore registers */ + RESTORE(GPDR); + RESTORE(GRER); + RESTORE(GFER); + RESTORE(GAFR); + + /* clear any edge detect bit */ + GEDR = GEDR; + + RESTORE(PPDR); + RESTORE(PPSR); + RESTORE(PPAR); + RESTORE(PSDR); + + RESTORE(Ser1SDCR0); + + PSSR = PSSR_PH; + + RESTORE(OSMR0); + RESTORE(OSMR1); + RESTORE(OSMR2); + RESTORE(OSMR3); + RESTORE(OSCR); + RESTORE(OIER); + + ICLR = 0; + ICCR = 1; + RESTORE(ICMR); + + /* restore current time */ + xtime.tv_sec = RCNR; + + sti(); + + kfree (sleep_save); + + retval = pm_send_all(PM_RESUME, (void *)0); + if (retval) + return retval; + + return 0; +} + + +static struct ctl_table pm_table[] = +{ + {ACPI_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL, (proc_handler *)&pm_do_suspend}, + {0} +}; + +static struct ctl_table pm_dir_table[] = +{ + {CTL_ACPI, "pm", NULL, 0, 0555, pm_table}, + {0} +}; + +/* + * Initialize power interface + */ +static int __init pm_init(void) +{ + register_sysctl_table(pm_dir_table, 1); + return 0; +} + +__initcall(pm_init); + diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/simpad.c linux/arch/arm/mach-sa1100/simpad.c --- v2.4.13/linux/arch/arm/mach-sa1100/simpad.c Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mach-sa1100/simpad.c Thu Oct 25 13:53:46 2001 @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -15,32 +17,46 @@ #include #include #include +#include #include "generic.h" -void init_simpad_cs3() +long cs3_shadow; + +static int __init simpad_init(void) +{ + PSPR = 0xc0008000; + GPDR &= ~GPIO_GPIO0; + cs3_shadow = (EN1 | EN0 | LED2_ON | DISPLAY_ON | RS232_ON | + ENABLE_5V | RESET_SIMCARD); + *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow; + return 0; +} + +__initcall(simpad_init); + +long get_cs3_shadow() { - cs3_shadow =(DISPLAY_ON | RS232_ON | PCMCIA_BUFF_DIS | RESET_SIMCARD); - printk("\nCall CS3 init:%x\n",cs3_shadow); - *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow; - cs3_shadow =(DISPLAY_ON| RS232_ON |RESET_SIMCARD); + return cs3_shadow; } -void PCMCIA_setbit(int value) +void set_cs3_bit(int value) { - cs3_shadow |= value; + cs3_shadow |= value; + *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow; } -void PCMCIA_clearbit(int value) +void clear_cs3_bit(int value) { - cs3_shadow &= ~value; + cs3_shadow &= ~value; + *(CS3BUSTYPE *)(CS3_BASE) = cs3_shadow; } static void __init fixup_simpad(struct machine_desc *desc, struct param_struct *params, char **cmdline, struct meminfo *mi) { -#ifdef CONFIG_SA1100_SIMPAD_64MB +#ifdef CONFIG_SA1100_SIMPAD_DRAM_64MB /* DRAM */ SET_BANK( 0, 0xc0000000, 64*1024*1024 ); #else SET_BANK( 0, 0xc0000000, 32*1024*1024 ); @@ -48,27 +64,109 @@ mi->nr_banks = 1; ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); setup_ramdisk( 1, 0, 0, 8192 ); - setup_initrd( __phys_to_virt(0xc0800000), 8*1024*1024 ); + setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 ); } static struct map_desc simpad_io_desc[] __initdata = { - /* virtual physical length domain r w c b */ - { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0, neccessary for mtd */ - { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */ + /* virtual physical length domain r w c b */ + { 0xe8000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, + { 0xf2800000, 0x4b800000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* MQ200 */ { 0xf1000000, 0x18000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* Paules CS3, write only */ LAST_DESC }; + +static void simpad_uart_pm(struct uart_port *port, u_int state, u_int oldstate) +{ + if (port->mapbase == (u_int)&Ser1UTCR0) { + if (state) + clear_cs3_bit(RS232_ON); + else + set_cs3_bit(RS232_ON); + } +} + +static struct sa1100_port_fns simpad_port_fns __initdata = { + pm: simpad_uart_pm, +}; + static void __init simpad_map_io(void) { sa1100_map_io(); iotable_init(simpad_io_desc); +#ifndef CONFIG_SERIAL_SA1100_OLD + //It is only possible to register 3 UART in serial_sa1100.c sa1100_register_uart(0, 3); - sa1100_register_uart(1, 1); + sa1100_register_uart(1, 1); +#endif +} + +#ifdef CONFIG_PROC_FS + +static char* name[]={ + "VCC_5V_EN", + "VCC_3V_EN", + "EN1", + "EN0", + "DISPLAY_ON", + "PCMCIA_BUFF_DIS", + "MQ_RESET", + "PCMCIA_RESET", + "DECT_POWER_ON", + "IRDA_SD", + "RS232_ON", + "SD_MEDIAQ", + "LED2_ON", + "IRDA_MODE", + "ENABLE_5V", + "RESET_SIMCARD" +}; + +static int proc_cs3_read(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + char *p = page; + int len, i; + + p += sprintf(p, "Chipselect3 : %x\n", cs3_shadow); + for (i = 0; i <= 15; i++) { + if(cs3_shadow & (1<read_proc = proc_cs3_read; + return 0; +} + +static int __exit cs3_exit(void) +{ + if (proc_cs3) + remove_proc_entry( "cs3", 0); + return 0; +} +__initcall(cs3_init); +#endif // CONFIG_PROC_FS MACHINE_START(SIMPAD, "Simpad") MAINTAINER("Juergen Messerer") diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/sleep.S linux/arch/arm/mach-sa1100/sleep.S --- v2.4.13/linux/arch/arm/mach-sa1100/sleep.S Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-sa1100/sleep.S Thu Oct 25 13:53:46 2001 @@ -0,0 +1,238 @@ +/* + * SA11x0 Assembler Sleep/WakeUp Management Routines + * + * Copyright (c) 2001 Cliff Brake + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License. + * + * History: + * + * 2001-02-06: Cliff Brake Initial code + * + * 2001-08-29: Nicolas Pitre Simplified. + */ + +#include +#include +#include +#include "sleep.h" + +/* + * sa1100_cpu_suspend() + * + * Causes sa11x0 to enter sleep state + * + */ + + .text + +ENTRY(sleep_save) .word 0 @ virtual address of parameter array +ENTRY(sleep_save_p) .word 0 @ physical address of parameter array + +ENTRY(sa1100_cpu_suspend) + + @ save registers on stack + stmfd sp!, {r4 - r12, lr} + + @ load virtual address for sleep_save array + ldr r4, sleep_save + + @ save stack pointer + str sp, [r4, #(SLEEP_SAVE_SP*4)] + + @ save coprocessor registers + mrc p15, 0, r1, c1, c0, 0 + str r1, [r4, #(SLEEP_SAVE_CP15_R1*4)] + mrc p15, 0, r1, c2, c0, 0 + str r1, [r4, #(SLEEP_SAVE_CP15_R2*4)] + mrc p15, 0, r1, c3, c0, 0 + str r1, [r4, #(SLEEP_SAVE_CP15_R3*4)] + mrc p15, 0, r1, c5, c0, 0 + str r1, [r4, #(SLEEP_SAVE_CP15_R5*4)] + mrc p15, 0, r1, c6, c0, 0 + str r1, [r4, #(SLEEP_SAVE_CP15_R6*4)] + mrc p15, 0, r1, c13, c0, 0 + str r1, [r4, #(SLEEP_SAVE_CP15_R13*4)] + + @ clean data cache and invalidate WB + bl cpu_sa1100_cache_clean_invalidate_all + + @ disable clock switching + mcr p15, 0, r1, c15, c2, 2 + + @ Adjust memory timing before lowering CPU clock + @ Clock speed adjustment without changing memory timing makes + @ CPU hang in some cases + ldr r0, =MDREFR + ldr r1, [r0] + orr r1, r1, #MDREFR_K1DB2 + str r1, [r0] + + @ delay 90us and set CPU PLL to lowest speed + @ fixes resume problem on high speed SA1110 + mov r0, #90 + bl SYMBOL_NAME(udelay) + ldr r0, =PPCR + mov r1, #0 + str r1, [r0] + mov r0, #90 + bl SYMBOL_NAME(udelay) + + +/* setup up register contents for jump to page containing SA1110 SDRAM controller bug fix suspend code + * + * r0 points to MSC0 register + * r1 points to MSC1 register + * r2 points to MSC2 register + * r3 is MSC0 value + * r4 is MSC1 value + * r5 is MSC2 value + * r6 points to MDREFR register + * r7 is first MDREFR value + * r8 is second MDREFR value + * r9 is pointer to MDCNFG register + * r10 is MDCNFG value + * r11 is third MDREFR value + * r12 is pointer to PMCR register + * r13 is PMCR value (1) + * + */ + + ldr r0, =MSC0 + ldr r1, =MSC1 + ldr r2, =MSC2 + + ldr r3, [r0] + bic r3, r3, #FMsk(MSC_RT) + bic r3, r3, #FMsk(MSC_RT)<<16 + + ldr r4, [r1] + bic r4, r4, #FMsk(MSC_RT) + bic r4, r4, #FMsk(MSC_RT)<<16 + + ldr r5, [r2] + bic r5, r5, #FMsk(MSC_RT) + bic r5, r5, #FMsk(MSC_RT)<<16 + + ldr r6, =MDREFR + + ldr r7, [r6] + bic r7, r7, #0x0000FF00 + bic r7, r7, #0x000000F0 + orr r8, r7, #MDREFR_SLFRSH + + ldr r9, =MDCNFG + ldr r10, [r9] + bic r10, r10, #(MDCNFG_DE0+MDCNFG_DE1) + bic r10, r10, #(MDCNFG_DE2+MDCNFG_DE3) + + bic r11, r8, #MDREFR_SLFRSH + bic r11, r11, #MDREFR_E1PIN + + ldr r12, =PMCR + + mov r13, #PMCR_SF + + b sa1110_sdram_controller_fix + + .align 5 +sa1110_sdram_controller_fix: + + @ Step 1 clear RT field of all MSCx registers + str r3, [r0] + str r4, [r1] + str r5, [r2] + + @ Step 2 clear DRI field in MDREFR + str r7, [r6] + + @ Step 3 set SLFRSH bit in MDREFR + str r8, [r6] + + @ Step 4 clear DE bis in MDCNFG + str r10, [r9] + + @ Step 5 clear DRAM refresh control register + str r11, [r6] + + @ Wow, now the hardware suspend request pins can be used, that makes them functional for + @ about 7 ns out of the entire time that the CPU is running! + + @ Step 6 set force sleep bit in PMCR + + str r13, [r12] + +20: b 20b @ loop waiting for sleep + +/* + * cpu_sa1100_resume() + * + * entry point from bootloader into kernel during resume + * + */ + + .align 5 +ENTRY(sa1100_cpu_resume) + + @ set SVC, irqs off + mov r0, #I_BIT | MODE_SVC + msr cpsr_c, r0 + + @ load physical address of sleep_save + ldr r4, sleep_save_p + + @ restore cp15_r3, domain id + ldr r1, [r4, #(SLEEP_SAVE_CP15_R3*4)] + mcr p15, 0, r1, c3, c0 ,0 + + @ restore cp15_r2, translation table base address + ldr r1, [r4, #(SLEEP_SAVE_CP15_R2*4)] + mcr p15, 0, r1, c2, c0 ,0 + + mov r1, #0 + mcr p15, 0, r1, c8, c7, 0 @ flush I+D TLBs + mcr p15, 0, r1, c7, c7, 0 @ flush I&D cache + + @ get saved cp15 r1 (control register) + ldr r1, [r4, #(SLEEP_SAVE_CP15_R1*4)] + + @ get address to jump to after turning on MMU + ldr r2, =resume_after_mmu + + cmp r2, #0 + + b resume_turn_on_mmu + + .align 5 +resume_turn_on_mmu: + + @ turn on mmu + mcr p15, 0, r1, c1, c0 ,0 + + @ jump to resume_after_mmu + mov pc, r2 + nop + nop + + .align 5 +resume_after_mmu: + + @ load virtual address for sleep_save array + ldr r4, sleep_save + + @ restore the rest of CPU state + ldr r1, [r4, #(SLEEP_SAVE_CP15_R13*4)] + mcr p15, 0, r1, c13, c0, 0 + ldr r1, [r4, #(SLEEP_SAVE_CP15_R5*4)] + mcr p15, 0, r1, c5, c0 ,0 + ldr r1, [r4, #(SLEEP_SAVE_CP15_R6*4)] + mcr p15, 0, r1, c6, c0 ,0 + + @ restore stack pointer + ldr sp, [r4, #(SLEEP_SAVE_SP*4)] + + @ return to caller + ldmfd sp!, {r4 - r12, pc} + + diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-sa1100/sleep.h linux/arch/arm/mach-sa1100/sleep.h --- v2.4.13/linux/arch/arm/mach-sa1100/sleep.h Wed Dec 31 16:00:00 1969 +++ linux/arch/arm/mach-sa1100/sleep.h Thu Oct 25 13:53:46 2001 @@ -0,0 +1,30 @@ +/* + * Offsets for register values preserved in RAM while in sleep mode + */ + +#define SLEEP_SAVE_OSCR 0 +#define SLEEP_SAVE_OSMR0 1 +#define SLEEP_SAVE_OSMR1 2 +#define SLEEP_SAVE_OSMR2 3 +#define SLEEP_SAVE_OSMR3 4 +#define SLEEP_SAVE_OIER 5 +#define SLEEP_SAVE_GPDR 6 +#define SLEEP_SAVE_GRER 7 +#define SLEEP_SAVE_GFER 8 +#define SLEEP_SAVE_GAFR 9 +#define SLEEP_SAVE_PPDR 10 +#define SLEEP_SAVE_PPSR 11 +#define SLEEP_SAVE_PPAR 12 +#define SLEEP_SAVE_PSDR 13 +#define SLEEP_SAVE_Ser1SDCR0 14 +#define SLEEP_SAVE_ICMR 15 +#define SLEEP_SAVE_SP 16 +#define SLEEP_SAVE_CP15_R1 17 +#define SLEEP_SAVE_CP15_R2 18 +#define SLEEP_SAVE_CP15_R3 19 +#define SLEEP_SAVE_CP15_R5 20 +#define SLEEP_SAVE_CP15_R6 21 +#define SLEEP_SAVE_CP15_R13 22 + +#define SLEEP_SAVE_SIZE 23 + diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-shark/dma.c linux/arch/arm/mach-shark/dma.c --- v2.4.13/linux/arch/arm/mach-shark/dma.c Thu Apr 12 12:20:31 2001 +++ linux/arch/arm/mach-shark/dma.c Thu Oct 25 13:53:46 2001 @@ -1,7 +1,7 @@ /* * linux/arch/arm/mach-shark/dma.c * - * by Alexander Schulz + * by Alexander Schulz * * derived from: * arch/arm/kernel/dma-ebsa285.c diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-shark/leds.c linux/arch/arm/mach-shark/leds.c --- v2.4.13/linux/arch/arm/mach-shark/leds.c Thu Apr 12 12:20:31 2001 +++ linux/arch/arm/mach-shark/leds.c Thu Oct 25 13:53:46 2001 @@ -1,6 +1,6 @@ /* * arch/arm/kernel/leds-shark.c - * by Alexander Schulz + * by Alexander Schulz * * derived from: * arch/arm/kernel/leds-footbridge.c diff -u --recursive --new-file v2.4.13/linux/arch/arm/mach-shark/mm.c linux/arch/arm/mach-shark/mm.c --- v2.4.13/linux/arch/arm/mach-shark/mm.c Thu Apr 12 12:20:31 2001 +++ linux/arch/arm/mach-shark/mm.c Thu Oct 25 13:53:46 2001 @@ -1,7 +1,7 @@ /* * linux/arch/arm/mach-shark/mm.c * - * by Alexander Schulz + * by Alexander Schulz * * 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 diff -u --recursive --new-file v2.4.13/linux/arch/arm/mm/fault-armv.c linux/arch/arm/mm/fault-armv.c --- v2.4.13/linux/arch/arm/mm/fault-armv.c Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/mm/fault-armv.c Thu Oct 25 13:53:46 2001 @@ -514,7 +514,7 @@ * Oops, we didn't handle the instruction. */ printk(KERN_ERR "Alignment trap: not handling instruction " - "%08lx at [<%08lx>]", instr, instrptr); + "%08lx at [<%08lx>]\n", instr, instrptr); ai_skipped += 1; return 1; diff -u --recursive --new-file v2.4.13/linux/arch/arm/mm/proc-arm920.S linux/arch/arm/mm/proc-arm920.S --- v2.4.13/linux/arch/arm/mm/proc-arm920.S Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mm/proc-arm920.S Thu Oct 25 13:53:46 2001 @@ -73,7 +73,7 @@ sbc r1, r1, r1 @ r1 = C - 1 and r3, r3, #255 mov pc, lr - + /* * cpu_arm920_check_bugs() */ @@ -150,7 +150,7 @@ mov r2, #1 cpu_arm920_cache_clean_invalidate_all_r2: mov ip, #0 -#ifdef CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH +#ifdef CONFIG_CPU_ARM920_WRITETHROUGH mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache #else /* @@ -180,21 +180,33 @@ * end: Area end address * flags: nonzero for I cache as well */ - .align 5 + .align 5 ENTRY(cpu_arm920_cache_clean_invalidate_range) bic r0, r0, #DCACHELINESIZE - 1 @ && added by PGM + bic r1, r1, #DCACHELINESIZE - 1 @ && added by DHM sub r3, r1, r0 cmp r3, #MAX_AREA_SIZE bgt cpu_arm920_cache_clean_invalidate_all_r2 -1: mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry +1: teq r2, #0 +#ifdef CONFIG_CPU_ARM920_WRITETHROUGH + mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry + mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry + add r0, r0, #DCACHELINESIZE + mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry + mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry + add r0, r0, #DCACHELINESIZE +#else + mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry + mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry add r0, r0, #DCACHELINESIZE mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry + mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry add r0, r0, #DCACHELINESIZE +#endif cmp r0, r1 blt 1b - teq r2, #0 - movne r0, #0 - mcrne p15, 0, r0, c7, c5, 0 @ invalidate I cache + + mcr p15, 0, r1, c7, c10, 4 @ drain WB mov pc, lr /* @@ -207,10 +219,17 @@ .align 5 ENTRY(cpu_arm920_flush_ram_page) mov r1, #PAGESIZE +#ifdef CONFIG_CPU_ARM920_WRITETHROUGH +1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry + add r0, r0, #DCACHELINESIZE + mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry + add r0, r0, #DCACHELINESIZE +#else 1: mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry add r0, r0, #DCACHELINESIZE mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry add r0, r0, #DCACHELINESIZE +#endif subs r1, r1, #2 * DCACHELINESIZE bne 1b mcr p15, 0, r1, c7, c10, 4 @ drain WB @@ -231,11 +250,14 @@ */ .align 5 ENTRY(cpu_arm920_dcache_invalidate_range) +#ifndef CONFIG_CPU_ARM920_WRITETHROUGH tst r0, #DCACHELINESIZE - 1 - bic r0, r0, #DCACHELINESIZE - 1 mcrne p15, 0, r0, c7, c10, 1 @ clean D entry tst r1, #DCACHELINESIZE - 1 mcrne p15, 0, r1, c7, c10, 1 @ clean D entry +#endif @ clean D entry + bic r0, r0, #DCACHELINESIZE - 1 + bic r1, r1, #DCACHELINESIZE - 1 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry add r0, r0, #DCACHELINESIZE cmp r0, r1 @@ -254,18 +276,21 @@ */ .align 5 ENTRY(cpu_arm920_dcache_clean_range) +#ifndef CONFIG_CPU_ARM920_WRITETHROUGH bic r0, r0, #DCACHELINESIZE - 1 sub r1, r1, r0 cmp r1, #MAX_AREA_SIZE mov r2, #0 bgt cpu_arm920_cache_clean_invalidate_all_r2 + bic r1, r1, #DCACHELINESIZE -1 + add r1, r1, #DCACHELINESIZE + 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry add r0, r0, #DCACHELINESIZE - mcr p15, 0, r0, c7, c10, 1 @ clean D entry - add r0, r0, #DCACHELINESIZE - subs r1, r1, #2 * DCACHELINESIZE + subs r1, r1, #DCACHELINESIZE bpl 1b +#endif mcr p15, 0, r2, c7, c10, 4 @ drain WB mov pc, lr @@ -284,7 +309,7 @@ */ .align 5 ENTRY(cpu_arm920_dcache_clean_page) -#ifndef CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH +#ifndef CONFIG_CPU_ARM920_WRITETHROUGH mov r1, #PAGESIZE 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry add r0, r0, #DCACHELINESIZE @@ -305,7 +330,7 @@ */ .align 5 ENTRY(cpu_arm920_dcache_clean_entry) -#ifndef CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH +#ifndef CONFIG_CPU_ARM920_WRITETHROUGH mcr p15, 0, r0, c7, c10, 1 @ clean D entry #endif mcr p15, 0, r0, c7, c10, 4 @ drain WB @@ -318,22 +343,44 @@ * * invalidate a range of virtual addresses from the Icache * + * This is a little misleading, it is not intended to clean out + * the i-cache but to make sure that any data written to the + * range is made consistant. This means that when we execute code + * in that region, everything works as we expect. + * + * This generally means writing back data in the Dcache and + * write buffer and flushing the Icache over that region + * * start: virtual start address * end: virtual end address + * + * NOTE: ICACHELINESIZE == DCACHELINESIZE (so we don't need to + * loop twice, once for i-cache, once for d-cache) */ .align 5 ENTRY(cpu_arm920_icache_invalidate_range) -1: mcr p15, 0, r0, c7, c10, 1 @ Clean D entry - add r0, r0, #DCACHELINESIZE - cmp r0, r1 - blo 1b + bic r0, r0, #ICACHELINESIZE - 1 @ Safety check + sub r1, r1, r0 + cmp r1, #MAX_AREA_SIZE + bgt cpu_arm920_cache_clean_invalidate_all_r2 + + bic r1, r1, #ICACHELINESIZE - 1 + add r1, r1, #ICACHELINESIZE + +1: mcr p15, 0, r0, c7, c5, 1 @ Clean I entry + mcr p15, 0, r0, c7, c10, 1 @ Clean D entry + add r0, r0, #ICACHELINESIZE + subs r1, r1, #ICACHELINESIZE + bne 1b + mov r0, #0 mcr p15, 0, r0, c7, c10, 4 @ drain WB + mov pc, lr + ENTRY(cpu_arm920_icache_invalidate_page) mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache mov pc, lr - /* ================================== TLB ================================= */ /* @@ -360,6 +407,12 @@ ENTRY(cpu_arm920_tlb_invalidate_range) mov r3, #0 mcr p15, 0, r3, c7, c10, 4 @ drain WB + + mov r3, #PAGESIZE + sub r3, r3, #1 + bic r0, r0, r3 + bic r1, r1, r3 + 1: mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry mcr p15, 0, r0, c8, c5, 1 @ invalidate I TLB entry add r0, r0, #PAGESIZE @@ -396,7 +449,7 @@ .align 5 ENTRY(cpu_arm920_set_pgd) mov ip, #0 -#ifdef CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH +#ifdef CONFIG_CPU_ARM920_WRITETHROUGH /* Any reason why we don't use mcr p15, 0, r0, c7, c7, 0 here? --rmk */ mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache #else @@ -429,7 +482,7 @@ */ .align 5 ENTRY(cpu_arm920_set_pmd) -#ifdef CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH +#ifdef CONFIG_CPU_ARM920_WRITETHROUGH eor r2, r1, #0x0a @ C & Section tst r2, #0x0b biceq r1, r1, #4 @ clear bufferable bit @@ -463,8 +516,8 @@ tst r1, #LPTE_PRESENT | LPTE_YOUNG @ Present and Young? movne r2, #0 -#ifdef CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH - eor r3, r1, #0x0a @ C & small page? +#ifdef CONFIG_CPU_ARM920_WRITETHROUGH + eor r3, r2, #0x0a @ C & small page? tst r3, #0x0b biceq r2, r2, #4 #endif @@ -476,9 +529,9 @@ cpu_manu_name: - .asciz "ARM/VLSI" + .asciz "ARM/CIRRUS" ENTRY(cpu_arm920_name) - .ascii "Arm920" + .ascii "Arm920T" #if defined(CONFIG_CPU_ARM920_CPU_IDLE) .ascii "s" #endif @@ -487,7 +540,7 @@ #endif #if defined(CONFIG_CPU_ARM920_D_CACHE_ON) .ascii "d" -#if defined(CONFIG_CPU_ARM920_FORCE_WRITE_THROUGH) +#if defined(CONFIG_CPU_ARM920_WRITETHROUGH) .ascii "(wt)" #else .ascii "(wb)" diff -u --recursive --new-file v2.4.13/linux/arch/arm/mm/proc-sa110.S linux/arch/arm/mm/proc-sa110.S --- v2.4.13/linux/arch/arm/mm/proc-sa110.S Mon Aug 27 12:41:38 2001 +++ linux/arch/arm/mm/proc-sa110.S Thu Oct 25 13:53:46 2001 @@ -271,7 +271,7 @@ bic r0, r0, #DCACHELINESIZE - 1 sub r3, r1, r0 cmp r3, #MAX_AREA_SIZE - bgt cpu_sa110_cache_clean_invalidate_all_r2 + bhi cpu_sa110_cache_clean_invalidate_all_r2 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry add r0, r0, #DCACHELINESIZE @@ -279,7 +279,7 @@ mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry add r0, r0, #DCACHELINESIZE cmp r0, r1 - blt 1b + blo 1b teq r2, #0 movne r0, #0 mcrne p15, 0, r0, c7, c5, 0 @ invalidate I cache @@ -288,7 +288,7 @@ ENTRY(cpu_sa1100_cache_clean_invalidate_range) sub r3, r1, r0 cmp r3, #MAX_AREA_SIZE - bgt cpu_sa1100_cache_clean_invalidate_all_r2 + bhi cpu_sa1100_cache_clean_invalidate_all_r2 b 1b /* @@ -335,7 +335,7 @@ 1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry add r0, r0, #DCACHELINESIZE cmp r0, r1 - blt 1b + blo 1b mov pc, lr /* @@ -354,7 +354,7 @@ sub r1, r1, r0 cmp r1, #MAX_AREA_SIZE mov r2, #0 - bgt cpu_sa110_cache_clean_invalidate_all_r2 + bhi cpu_sa110_cache_clean_invalidate_all_r2 1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry add r0, r0, #DCACHELINESIZE mcr p15, 0, r0, c7, c10, 1 @ clean D entry @@ -369,7 +369,7 @@ sub r1, r1, r0 cmp r1, #MAX_AREA_SIZE mov r2, #0 - bgt cpu_sa1100_cache_clean_invalidate_all_r2 + bhi cpu_sa1100_cache_clean_invalidate_all_r2 b 1b /* @@ -423,6 +423,7 @@ .align 5 ENTRY(cpu_sa110_icache_invalidate_range) ENTRY(cpu_sa1100_icache_invalidate_range) + bic r0, r0, #DCACHELINESIZE - 1 1: mcr p15, 0, r0, c7, c10, 1 @ Clean D entry add r0, r0, #DCACHELINESIZE cmp r0, r1 @@ -460,12 +461,14 @@ .align 5 ENTRY(cpu_sa110_tlb_invalidate_range) ENTRY(cpu_sa1100_tlb_invalidate_range) + bic r0, r0, #0x0ff + bic r0, r0, #0xf00 mov r3, #0 mcr p15, 0, r3, c7, c10, 4 @ drain WB 1: mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry add r0, r0, #PAGESIZE cmp r0, r1 - blt 1b + blo 1b mcr p15, 0, r3, c8, c5, 0 @ invalidate I TLB mov pc, lr diff -u --recursive --new-file v2.4.13/linux/arch/arm/tools/mach-types linux/arch/arm/tools/mach-types --- v2.4.13/linux/arch/arm/tools/mach-types Tue Oct 23 22:48:49 2001 +++ linux/arch/arm/tools/mach-types Thu Oct 25 13:53:46 2001 @@ -6,7 +6,7 @@ # To add an entry into this database, please see Documentation/arm/README, # or contact rmk@arm.linux.org.uk # -# Last update: Fri Oct 5 18:40:53 2001 +# Last update: Mon Oct 22 09:49:06 2001 # # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number # @@ -114,7 +114,7 @@ gator SA1100_GATOR GATOR 103 granite ARCH_GRANITE GRANITE 104 consus SA1100_CONSUS CONSUS 105 -agilent_aaed2000 ARCH_AAEC2000_AAED2000 AAEC2000_AAED2000 106 +aaed2000 ARCH_AAED2000 AAED2000 106 cdb89712 ARCH_CDB89712 CDB89712 107 graphicsmaster SA1100_GRAPHICSMASTER GRAPHICSMASTER 108 adsbitsy SA1100_ADSBITSY ADSBITSY 109 @@ -131,3 +131,6 @@ bluestem SA1100_BLUESTEM BLUESTEM 120 xingu8 ARCH_XINGU8 XINGU8 121 bushstb ARCH_BUSHSTB BUSHSTB 122 +epsilon1 SA1100_EPSILON1 EPSILON1 123 +balloon SA1100_BALLOON BALLOON 124 +puppy ARCH_PUPPY PUPPY 125 diff -u --recursive --new-file v2.4.13/linux/arch/i386/defconfig linux/arch/i386/defconfig --- v2.4.13/linux/arch/i386/defconfig Tue Oct 23 22:48:49 2001 +++ linux/arch/i386/defconfig Thu Oct 25 14:40:08 2001 @@ -84,6 +84,7 @@ # CONFIG_PCMCIA=y CONFIG_CARDBUS=y +# CONFIG_I82092 is not set # CONFIG_I82365 is not set # CONFIG_TCIC is not set CONFIG_SYSVIPC=y diff -u --recursive --new-file v2.4.13/linux/arch/i386/kernel/apic.c linux/arch/i386/kernel/apic.c --- v2.4.13/linux/arch/i386/kernel/apic.c Tue Oct 9 17:06:51 2001 +++ linux/arch/i386/kernel/apic.c Sat Oct 27 15:39:24 2001 @@ -588,6 +588,7 @@ goto no_apic; case X86_VENDOR_INTEL: if (boot_cpu_data.x86 == 6 || + (boot_cpu_data.x86 == 15 && cpu_has_apic) || (boot_cpu_data.x86 == 5 && cpu_has_apic)) break; goto no_apic; diff -u --recursive --new-file v2.4.13/linux/arch/i386/kernel/io_apic.c linux/arch/i386/kernel/io_apic.c --- v2.4.13/linux/arch/i386/kernel/io_apic.c Tue Oct 9 17:06:51 2001 +++ linux/arch/i386/kernel/io_apic.c Thu Oct 25 13:53:46 2001 @@ -750,6 +750,7 @@ ) UNEXPECTED_IO_APIC(); + printk(KERN_DEBUG "....... : PRQ implemented: %X\n", reg_01.PRQ); printk(KERN_DEBUG "....... : IO APIC version: %04X\n", reg_01.version); if ( (reg_01.version != 0x01) && /* 82489DX IO-APICs */ (reg_01.version != 0x10) && /* oldest IO-APICs */ @@ -1237,14 +1238,17 @@ ack_APIC_irq(); if (!(v & (1 << (i & 0x1f)))) { +#ifdef APIC_LOCKUP_DEBUG + struct irq_pin_list *entry; +#endif + #ifdef APIC_MISMATCH_DEBUG atomic_inc(&irq_mis_count); #endif spin_lock(&ioapic_lock); __mask_and_edge_IO_APIC_irq(irq); #ifdef APIC_LOCKUP_DEBUG - for (;;) { - struct irq_pin_list *entry = irq_2_pin + irq; + for (entry = irq_2_pin + irq;;) { unsigned int reg; if (entry->pin == -1) diff -u --recursive --new-file v2.4.13/linux/arch/i386/kernel/irq.c linux/arch/i386/kernel/irq.c --- v2.4.13/linux/arch/i386/kernel/irq.c Sun Sep 23 11:40:55 2001 +++ linux/arch/i386/kernel/irq.c Thu Oct 25 13:53:46 2001 @@ -512,6 +512,7 @@ if (!local_irq_count(smp_processor_id())) { do { barrier(); + cpu_relax(); } while (irq_desc[irq].status & IRQ_INPROGRESS); } } @@ -766,8 +767,10 @@ #ifdef CONFIG_SMP /* Wait to make sure it's not being used on another CPU */ - while (desc->status & IRQ_INPROGRESS) + while (desc->status & IRQ_INPROGRESS) { barrier(); + cpu_relax(); + } #endif kfree(action); return; diff -u --recursive --new-file v2.4.13/linux/arch/i386/kernel/microcode.c linux/arch/i386/kernel/microcode.c --- v2.4.13/linux/arch/i386/kernel/microcode.c Tue Oct 23 22:48:49 2001 +++ linux/arch/i386/kernel/microcode.c Tue Oct 30 15:13:17 2001 @@ -47,6 +47,10 @@ * 1.08 11 Dec 2000, Richard Schaal and * Tigran Aivazian * Intel Pentium 4 processor support and bugfixes. + * 1.09 30 Oct 2001, Tigran Aivazian + * Bugfix for HT (Hyper-Threading) enabled processors + * whereby processor resources are shared by all logical processors + * in a single CPU package. */ #include @@ -61,7 +65,7 @@ #include #include -#define MICROCODE_VERSION "1.08" +#define MICROCODE_VERSION "1.09" MODULE_DESCRIPTION("Intel CPU (IA-32) microcode update driver"); MODULE_AUTHOR("Tigran Aivazian "); @@ -240,10 +244,6 @@ printk(KERN_ERR "microcode: CPU%d not 'upgrading' to earlier revision" " %d (current=%d)\n", cpu_num, microcode[i].rev, rev); - } else if (microcode[i].rev == rev) { - printk(KERN_ERR - "microcode: CPU%d already up-to-date (revision %d)\n", - cpu_num, rev); } else { int sum = 0; struct microcode *m = µcode[i]; diff -u --recursive --new-file v2.4.13/linux/arch/i386/kernel/mtrr.c linux/arch/i386/kernel/mtrr.c --- v2.4.13/linux/arch/i386/kernel/mtrr.c Tue Oct 23 22:48:49 2001 +++ linux/arch/i386/kernel/mtrr.c Thu Oct 25 14:05:52 2001 @@ -473,25 +473,16 @@ unsigned long config, dummy; struct pci_dev *dev = NULL; - /* ServerWorks LE chipsets have problems with write-combining - Don't allow it and leave room for other chipsets to be tagged */ + /* ServerWorks LE chipsets have problems with write-combining + Don't allow it and leave room for other chipsets to be tagged */ - if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) { - switch(dev->vendor) { - case PCI_VENDOR_ID_SERVERWORKS: - switch (dev->device) { - case PCI_DEVICE_ID_SERVERWORKS_LE: + if ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8, NULL)) != NULL) { + if ((dev->vendor == PCI_VENDOR_ID_SERVERWORKS) && + (dev->device == PCI_DEVICE_ID_SERVERWORKS_LE)) { + printk (KERN_INFO "mtrr: Serverworks LE detected. Write-combining disabled.\n"); return 0; - break; - default: - break; - } - break; - default: - break; + } } - } - switch ( mtrr_if ) { diff -u --recursive --new-file v2.4.13/linux/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c --- v2.4.13/linux/arch/i386/kernel/setup.c Tue Oct 23 22:48:49 2001 +++ linux/arch/i386/kernel/setup.c Thu Oct 25 13:53:46 2001 @@ -229,8 +229,7 @@ #define SIO_PM_GP_EN 0x80 -static void -visws_get_board_type_and_rev(void) +static void __init visws_get_board_type_and_rev(void) { int raw; @@ -402,7 +401,7 @@ } } -void __init add_memory_region(unsigned long long start, +static void __init add_memory_region(unsigned long long start, unsigned long long size, int type) { int x = e820.nr_map; @@ -667,7 +666,7 @@ */ #define LOWMEMSIZE() (0x9f000) -void __init setup_memory_region(void) +static void __init setup_memory_region(void) { char *who = "BIOS-e820"; @@ -699,7 +698,7 @@ } /* setup_memory_region */ -static inline void parse_mem_cmdline (char ** cmdline_p) +static void __init parse_mem_cmdline (char ** cmdline_p) { char c = ' ', *to = command_line, *from = COMMAND_LINE; int len = 0; @@ -1263,11 +1262,11 @@ /* * Read Cyrix DEVID registers (DIR) to get more detailed info. about the CPU */ -static void do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) +static void __init do_cyrix_devid(unsigned char *dir0, unsigned char *dir1) { unsigned char ccr2, ccr3; unsigned long flags; - + /* we test for DEVID by checking whether CCR3 is writable */ local_irq_save(flags); ccr3 = getCx86(CX86_CCR3); @@ -1303,7 +1302,7 @@ * Actually since bugs.h doesnt even reference this perhaps someone should * fix the documentation ??? */ -unsigned char Cx86_dir0_msb __initdata = 0; +static unsigned char Cx86_dir0_msb __initdata = 0; static char Cx86_model[][9] __initdata = { "Cx486", "Cx486", "5x86 ", "6x86", "MediaGX ", "6x86MX ", @@ -1336,7 +1335,7 @@ static void __init check_cx686_slop(struct cpuinfo_x86 *c) { unsigned long flags; - + if (Cx86_dir0_msb == 3) { unsigned char ccr3, ccr5; @@ -1503,6 +1502,248 @@ return; } +#ifdef CONFIG_X86_OOSTORE + +static u32 __init power2(u32 x) +{ + u32 s=1; + while(s<=x) + s<<=1; + return s>>=1; +} + +/* + * Set up an actual MCR + */ + +static void __init winchip_mcr_insert(int reg, u32 base, u32 size, int key) +{ + u32 lo, hi; + + hi = base & ~0xFFF; + lo = ~(size-1); /* Size is a power of 2 so this makes a mask */ + lo &= ~0xFFF; /* Remove the ctrl value bits */ + lo |= key; /* Attribute we wish to set */ + wrmsr(reg+MSR_IDT_MCR0, lo, hi); + mtrr_centaur_report_mcr(reg, lo, hi); /* Tell the mtrr driver */ +} + +/* + * Figure what we can cover with MCR's + * + * Shortcut: We know you can't put 4Gig of RAM on a winchip + */ + +static u32 __init ramtop(void) /* 16388 */ +{ + int i; + u32 top = 0; + u32 clip = 0xFFFFFFFFUL; + + for (i = 0; i < e820.nr_map; i++) { + unsigned long start, end; + + if (e820.map[i].addr > 0xFFFFFFFFUL) + continue; + /* + * Don't MCR over reserved space. Ignore the ISA hole + * we frob around that catastrophy already + */ + + if (e820.map[i].type == E820_RESERVED) + { + if(e820.map[i].addr >= 0x100000UL && e820.map[i].addr < clip) + clip = e820.map[i].addr; + continue; + } + start = e820.map[i].addr; + end = e820.map[i].addr + e820.map[i].size; + if (start >= end) + continue; + if (end > top) + top = end; + } + /* Everything below 'top' should be RAM except for the ISA hole. + Because of the limited MCR's we want to map NV/ACPI into our + MCR range for gunk in RAM + + Clip might cause us to MCR insufficient RAM but that is an + acceptable failure mode and should only bite obscure boxes with + a VESA hole at 15Mb + + The second case Clip sometimes kicks in is when the EBDA is marked + as reserved. Again we fail safe with reasonable results + */ + + if(top>clip) + top=clip; + + return top; +} + +/* + * Compute a set of MCR's to give maximum coverage + */ + +static int __init winchip_mcr_compute(int nr, int key) +{ + u32 mem = ramtop(); + u32 root = power2(mem); + u32 base = root; + u32 top = root; + u32 floor = 0; + int ct = 0; + + while(ct high && fspace > low) + { + winchip_mcr_insert(ct, floor, fspace, key); + floor += fspace; + } + else if(high > low) + { + winchip_mcr_insert(ct, top, high, key); + top += high; + } + else if(low > 0) + { + base -= low; + winchip_mcr_insert(ct, base, low, key); + } + else break; + ct++; + } + /* + * We loaded ct values. We now need to set the mask. The caller + * must do this bit. + */ + + return ct; +} + +static void __init winchip_create_optimal_mcr(void) +{ + int i; + /* + * Allocate up to 6 mcrs to mark as much of ram as possible + * as write combining and weak write ordered. + * + * To experiment with: Linux never uses stack operations for + * mmio spaces so we could globally enable stack operation wc + * + * Load the registers with type 31 - full write combining, all + * writes weakly ordered. + */ + int used = winchip_mcr_compute(6, 31); + + /* + * Wipe unused MCRs + */ + + for(i=used;i<8;i++) + wrmsr(MSR_IDT_MCR0+i, 0, 0); +} + +static void __init winchip2_create_optimal_mcr(void) +{ + u32 lo, hi; + int i; + + /* + * Allocate up to 6 mcrs to mark as much of ram as possible + * as write combining, weak store ordered. + * + * Load the registers with type 25 + * 8 - weak write ordering + * 16 - weak read ordering + * 1 - write combining + */ + + int used = winchip_mcr_compute(6, 25); + + /* + * Mark the registers we are using. + */ + + rdmsr(MSR_IDT_MCR_CTRL, lo, hi); + for(i=0;i>17) & 7; + lo |= key<<6; /* replace with unlock key */ + wrmsr(MSR_IDT_MCR_CTRL, lo, hi); +} + +static void __init winchip2_protect_mcr(void) +{ + u32 lo, hi; + + rdmsr(MSR_IDT_MCR_CTRL, lo, hi); + lo&=~0x1C0; /* blank bits 8-6 */ + wrmsr(MSR_IDT_MCR_CTRL, lo, hi); +} + +#endif + static void __init init_centaur(struct cpuinfo_x86 *c) { enum { @@ -1546,6 +1787,19 @@ fcr_clr=DPDC; printk(KERN_NOTICE "Disabling bugged TSC.\n"); clear_bit(X86_FEATURE_TSC, &c->x86_capability); +#ifdef CONFIG_X86_OOSTORE + winchip_create_optimal_mcr(); + /* Enable + write combining on non-stack, non-string + write combining on string, all types + weak write ordering + + The C6 original lacks weak read order + + Note 0x120 is write only on Winchip 1 */ + + wrmsr(MSR_IDT_MCR_CTRL, 0x01F0001F, 0); +#endif break; case 8: switch(c->x86_mask) { @@ -1561,11 +1815,37 @@ } fcr_set=ECX8|DSMC|DTLOCK|EMMX|EBRPRED|ERETSTK|E2MMX|EAMD3D; fcr_clr=DPDC; +#ifdef CONFIG_X86_OOSTORE + winchip2_unprotect_mcr(); + winchip2_create_optimal_mcr(); + rdmsr(MSR_IDT_MCR_CTRL, lo, hi); + /* Enable + write combining on non-stack, non-string + write combining on string, all types + weak write ordering + */ + lo|=31; + wrmsr(MSR_IDT_MCR_CTRL, lo, hi); + winchip2_protect_mcr(); +#endif break; case 9: name="3"; fcr_set=ECX8|DSMC|DTLOCK|EMMX|EBRPRED|ERETSTK|E2MMX|EAMD3D; fcr_clr=DPDC; +#ifdef CONFIG_X86_OOSTORE + winchip2_unprotect_mcr(); + winchip2_create_optimal_mcr(); + rdmsr(MSR_IDT_MCR_CTRL, lo, hi); + /* Enable + write combining on non-stack, non-string + write combining on string, all types + weak write ordering + */ + lo|=31; + wrmsr(MSR_IDT_MCR_CTRL, lo, hi); + winchip2_protect_mcr(); +#endif break; case 10: name="4"; diff -u --recursive --new-file v2.4.13/linux/arch/sparc/defconfig linux/arch/sparc/defconfig --- v2.4.13/linux/arch/sparc/defconfig Wed Jul 25 17:10:19 2001 +++ linux/arch/sparc/defconfig Tue Oct 30 15:08:11 2001 @@ -70,7 +70,6 @@ CONFIG_FB=y CONFIG_DUMMY_CONSOLE=y # CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_E1355 is not set CONFIG_FB_SBUS=y CONFIG_FB_CGSIX=y CONFIG_FB_BWTWO=y @@ -128,6 +127,7 @@ # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set # CONFIG_BLK_DEV_LVM is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 @@ -153,6 +153,7 @@ CONFIG_IPV6=m # CONFIG_KHTTPD is not set # CONFIG_ATM is not set +# CONFIG_VLAN_8021Q is not set # # @@ -280,6 +281,7 @@ CONFIG_VFAT_FS=m CONFIG_EFS_FS=m # CONFIG_JFFS_FS is not set +# CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set # CONFIG_TMPFS is not set # CONFIG_RAMFS is not set diff -u --recursive --new-file v2.4.13/linux/arch/sparc/kernel/check_asm.sh linux/arch/sparc/kernel/check_asm.sh --- v2.4.13/linux/arch/sparc/kernel/check_asm.sh Wed Aug 23 09:30:13 2000 +++ linux/arch/sparc/kernel/check_asm.sh Tue Oct 30 15:08:11 2001 @@ -11,7 +11,7 @@ echo " sizeof(struct $2_struct)," >> $4 ;; -ints) - sed -n -e '/check_asm_data:/,/\.size/p' <$2 | sed -e 's/check_asm_data://' -e 's/\.size.*//' -e 's/\.long[ ]\([0-9]*\)/\1,/' >>$3 + sed -n -e '/check_asm_data:/,/\.size/p' <$2 | sed -e 's/check_asm_data://' -e 's/\.size.*//' -e 's/\.ident.*//' -e 's/\.long[ ]\([0-9]*\)/\1,/' >>$3 ;; *) exit 1 diff -u --recursive --new-file v2.4.13/linux/arch/sparc/kernel/ioport.c linux/arch/sparc/kernel/ioport.c --- v2.4.13/linux/arch/sparc/kernel/ioport.c Sun Feb 18 19:49:44 2001 +++ linux/arch/sparc/kernel/ioport.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: ioport.c,v 1.44 2001/02/13 04:07:38 davem Exp $ +/* $Id: ioport.c,v 1.45 2001/10/30 04:54:21 davem Exp $ * ioport.c: Simple io mapping allocator. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -703,7 +703,7 @@ } } } -#endif CONFIG_PCI +#endif /* CONFIG_PCI */ #ifdef CONFIG_PROC_FS @@ -725,7 +725,7 @@ return p-buf; } -#endif CONFIG_PROC_FS +#endif /* CONFIG_PROC_FS */ /* * This is a version of find_resource and it belongs to kernel/resource.c. diff -u --recursive --new-file v2.4.13/linux/arch/sparc/kernel/sparc-stub.c linux/arch/sparc/kernel/sparc-stub.c --- v2.4.13/linux/arch/sparc/kernel/sparc-stub.c Tue Oct 10 10:33:51 2000 +++ linux/arch/sparc/kernel/sparc-stub.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: sparc-stub.c,v 1.27 2000/10/03 07:28:49 anton Exp $ +/* $Id: sparc-stub.c,v 1.28 2001/10/30 04:54:21 davem Exp $ * sparc-stub.c: KGDB support for the Linux kernel. * * Modifications to run under Linux @@ -330,17 +330,19 @@ * to arrange for a "return 0" upon a memory fault */ __asm__( - "1: ldub [%0], %1 - inc %0 - .section .fixup,#alloc,#execinstr - .align 4 - 2: retl - mov 0, %%o0 - .section __ex_table, #alloc - .align 4 - .word 1b, 2b - .text" - : "=r" (mem), "=r" (ch) : "0" (mem)); + "\n1:\n\t" + "ldub [%0], %1\n\t" + "inc %0\n\t" + ".section .fixup,#alloc,#execinstr\n\t" + ".align 4\n" + "2:\n\t" + "retl\n\t" + " mov 0, %%o0\n\t" + ".section __ex_table, #alloc\n\t" + ".align 4\n\t" + ".word 1b, 2b\n\t" + ".text\n" + : "=r" (mem), "=r" (ch) : "0" (mem)); *buf++ = hexchars[ch >> 4]; *buf++ = hexchars[ch & 0xf]; } @@ -364,17 +366,19 @@ ch |= hex(*buf++); /* Assembler code is *mem++ = ch; with return 0 on fault */ __asm__( - "1: stb %1, [%0] - inc %0 - .section .fixup,#alloc,#execinstr - .align 4 - 2: retl - mov 0, %%o0 - .section __ex_table, #alloc - .align 4 - .word 1b, 2b - .text" - : "=r" (mem) : "r" (ch) , "0" (mem)); + "\n1:\n\t" + "stb %1, [%0]\n\t" + "inc %0\n\t" + ".section .fixup,#alloc,#execinstr\n\t" + ".align 4\n" + "2:\n\t" + "retl\n\t" + " mov 0, %%o0\n\t" + ".section __ex_table, #alloc\n\t" + ".align 4\n\t" + ".word 1b, 2b\n\t" + ".text\n" + : "=r" (mem) : "r" (ch) , "0" (mem)); } return mem; } @@ -715,14 +719,12 @@ /* Again, watch those c-prefixes for ELF kernels */ #if defined(__svr4__) || defined(__ELF__) - asm(" .globl breakinst - - breakinst: ta 1 - "); + asm(".globl breakinst\n" + "breakinst:\n\t" + "ta 1\n"); #else - asm(" .globl _breakinst - - _breakinst: ta 1 - "); + asm(".globl _breakinst\n" + "_breakinst:\n\t" + "ta 1\n"); #endif } diff -u --recursive --new-file v2.4.13/linux/arch/sparc/kernel/time.c linux/arch/sparc/kernel/time.c --- v2.4.13/linux/arch/sparc/kernel/time.c Mon Jan 22 13:30:20 2001 +++ linux/arch/sparc/kernel/time.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: time.c,v 1.58 2001/01/11 15:07:09 davem Exp $ +/* $Id: time.c,v 1.59 2001/10/30 04:54:21 davem Exp $ * linux/arch/sparc/kernel/time.c * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -475,36 +475,39 @@ * is guarenteed to be atomic, this is why we can run this * with interrupts on full blast. Don't touch this... -DaveM */ - __asm__ __volatile__(" - sethi %hi(master_l10_counter), %o1 - ld [%o1 + %lo(master_l10_counter)], %g3 - sethi %hi(xtime), %g2 -1: ldd [%g2 + %lo(xtime)], %o4 - ld [%g3], %o1 - ldd [%g2 + %lo(xtime)], %o2 - xor %o4, %o2, %o2 - xor %o5, %o3, %o3 - orcc %o2, %o3, %g0 - bne 1b - cmp %o1, 0 - bge 1f - srl %o1, 0xa, %o1 - sethi %hi(tick), %o3 - ld [%o3 + %lo(tick)], %o3 - sethi %hi(0x1fffff), %o2 - or %o2, %lo(0x1fffff), %o2 - add %o5, %o3, %o5 - and %o1, %o2, %o1 -1: add %o5, %o1, %o5 - sethi %hi(1000000), %o2 - or %o2, %lo(1000000), %o2 - cmp %o5, %o2 - bl,a 1f - st %o4, [%o0 + 0x0] - add %o4, 0x1, %o4 - sub %o5, %o2, %o5 - st %o4, [%o0 + 0x0] -1: st %o5, [%o0 + 0x4]"); + __asm__ __volatile__( + "sethi %hi(master_l10_counter), %o1\n\t" + "ld [%o1 + %lo(master_l10_counter)], %g3\n\t" + "sethi %hi(xtime), %g2\n" + "1:\n\t" + "ldd [%g2 + %lo(xtime)], %o4\n\t" + "ld [%g3], %o1\n\t" + "ldd [%g2 + %lo(xtime)], %o2\n\t" + "xor %o4, %o2, %o2\n\t" + "xor %o5, %o3, %o3\n\t" + "orcc %o2, %o3, %g0\n\t" + "bne 1b\n\t" + " cmp %o1, 0\n\t" + "bge 1f\n\t" + " srl %o1, 0xa, %o1\n\t" + "sethi %hi(tick), %o3\n\t" + "ld [%o3 + %lo(tick)], %o3\n\t" + "sethi %hi(0x1fffff), %o2\n\t" + "or %o2, %lo(0x1fffff), %o2\n\t" + "add %o5, %o3, %o5\n\t" + "and %o1, %o2, %o1\n" + "1:\n\t" + "add %o5, %o1, %o5\n\t" + "sethi %hi(1000000), %o2\n\t" + "or %o2, %lo(1000000), %o2\n\t" + "cmp %o5, %o2\n\t" + "bl,a 1f\n\t" + " st %o4, [%o0 + 0x0]\n\t" + "add %o4, 0x1, %o4\n\t" + "sub %o5, %o2, %o5\n\t" + "st %o4, [%o0 + 0x0]\n" + "1:\n\t" + "st %o5, [%o0 + 0x4]\n"); } void do_settimeofday(struct timeval *tv) diff -u --recursive --new-file v2.4.13/linux/arch/sparc/kernel/windows.c linux/arch/sparc/kernel/windows.c --- v2.4.13/linux/arch/sparc/kernel/windows.c Tue Aug 31 11:23:29 1999 +++ linux/arch/sparc/kernel/windows.c Tue Oct 30 15:08:11 2001 @@ -19,17 +19,17 @@ register int ctr asm("g5"); ctr = 0; - __asm__ __volatile__(" -1: - ld [%%g6 + %2], %%g4 - orcc %%g0, %%g4, %%g0 - add %0, 1, %0 - bne 1b - save %%sp, -64, %%sp -2: - subcc %0, 1, %0 - bne 2b - restore %%g0, %%g0, %%g0" + __asm__ __volatile__( + "\n1:\n\t" + "ld [%%g6 + %2], %%g4\n\t" + "orcc %%g0, %%g4, %%g0\n\t" + "add %0, 1, %0\n\t" + "bne 1b\n\t" + " save %%sp, -64, %%sp\n" + "2:\n\t" + "subcc %0, 1, %0\n\t" + "bne 2b\n\t" + " restore %%g0, %%g0, %%g0\n" : "=&r" (ctr) : "0" (ctr), "i" ((const unsigned long)(&(((struct task_struct *)0)->thread.uwinmask))) diff -u --recursive --new-file v2.4.13/linux/arch/sparc/mm/fault.c linux/arch/sparc/mm/fault.c --- v2.4.13/linux/arch/sparc/mm/fault.c Sun Aug 12 13:27:59 2001 +++ linux/arch/sparc/mm/fault.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: fault.c,v 1.120 2001/07/18 13:40:05 anton Exp $ +/* $Id: fault.c,v 1.121 2001/10/30 04:54:22 davem Exp $ * fault.c: Page fault handlers for the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -177,11 +177,11 @@ memset (®s, 0, sizeof (regs)); regs.pc = pc; regs.npc = pc + 4; - __asm__ __volatile__ (" - rd %%psr, %0 - nop - nop - nop" : "=r" (regs.psr)); + __asm__ __volatile__ ( + "rd %%psr, %0\n\t" + "nop\n\t" + "nop\n\t" + "nop\n" : "=r" (regs.psr)); unhandled_fault (address, current, ®s); /* Not reached */ return 0; diff -u --recursive --new-file v2.4.13/linux/arch/sparc/mm/srmmu.c linux/arch/sparc/mm/srmmu.c --- v2.4.13/linux/arch/sparc/mm/srmmu.c Sun Sep 23 11:40:56 2001 +++ linux/arch/sparc/mm/srmmu.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: srmmu.c,v 1.231 2001/09/20 00:35:31 davem Exp $ +/* $Id: srmmu.c,v 1.232 2001/10/30 04:54:22 davem Exp $ * srmmu.c: SRMMU specific routines for memory management. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -393,6 +393,7 @@ static pte_t *srmmu_pte_alloc_one(struct mm_struct *mm, unsigned long address) { BUG(); + return NULL; } static void srmmu_free_pte_fast(pte_t *pte) @@ -812,11 +813,11 @@ static void cypress_flush_tlb_mm(struct mm_struct *mm) { FLUSH_BEGIN(mm) - __asm__ __volatile__(" - lda [%0] %3, %%g5 - sta %2, [%0] %3 - sta %%g0, [%1] %4 - sta %%g5, [%0] %3" + __asm__ __volatile__( + "lda [%0] %3, %%g5\n\t" + "sta %2, [%0] %3\n\t" + "sta %%g0, [%1] %4\n\t" + "sta %%g5, [%0] %3\n" : /* no outputs */ : "r" (SRMMU_CTX_REG), "r" (0x300), "r" (mm->context), "i" (ASI_M_MMUREGS), "i" (ASI_M_FLUSH_PROBE) @@ -831,13 +832,14 @@ FLUSH_BEGIN(mm) start &= SRMMU_PGDIR_MASK; size = SRMMU_PGDIR_ALIGN(end) - start; - __asm__ __volatile__(" - lda [%0] %5, %%g5 - sta %1, [%0] %5 - 1: subcc %3, %4, %3 - bne 1b - sta %%g0, [%2 + %3] %6 - sta %%g5, [%0] %5" + __asm__ __volatile__( + "lda [%0] %5, %%g5\n\t" + "sta %1, [%0] %5\n" + "1:\n\t" + "subcc %3, %4, %3\n\t" + "bne 1b\n\t" + " sta %%g0, [%2 + %3] %6\n\t" + "sta %%g5, [%0] %5\n" : /* no outputs */ : "r" (SRMMU_CTX_REG), "r" (mm->context), "r" (start | 0x200), "r" (size), "r" (SRMMU_PGDIR_SIZE), "i" (ASI_M_MMUREGS), @@ -851,11 +853,11 @@ struct mm_struct *mm = vma->vm_mm; FLUSH_BEGIN(mm) - __asm__ __volatile__(" - lda [%0] %3, %%g5 - sta %1, [%0] %3 - sta %%g0, [%2] %4 - sta %%g5, [%0] %3" + __asm__ __volatile__( + "lda [%0] %3, %%g5\n\t" + "sta %1, [%0] %3\n\t" + "sta %%g0, [%2] %4\n\t" + "sta %%g5, [%0] %3\n" : /* no outputs */ : "r" (SRMMU_CTX_REG), "r" (mm->context), "r" (page & PAGE_MASK), "i" (ASI_M_MMUREGS), "i" (ASI_M_FLUSH_PROBE) diff -u --recursive --new-file v2.4.13/linux/arch/sparc/mm/sun4c.c linux/arch/sparc/mm/sun4c.c --- v2.4.13/linux/arch/sparc/mm/sun4c.c Wed Jul 25 17:10:19 2001 +++ linux/arch/sparc/mm/sun4c.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: sun4c.c,v 1.207 2001/07/17 16:17:33 anton Exp $ +/* $Id: sun4c.c,v 1.208 2001/10/30 04:54:22 davem Exp $ * sun4c.c: Doing in software what should be done in hardware. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -135,25 +135,26 @@ unsigned long nbytes = SUN4C_VAC_SIZE; unsigned long lsize = sun4c_vacinfo.linesize; - __asm__ __volatile__(" - add %2, %2, %%g1 - add %2, %%g1, %%g2 - add %2, %%g2, %%g3 - add %2, %%g3, %%g4 - add %2, %%g4, %%g5 - add %2, %%g5, %%o4 - add %2, %%o4, %%o5 -1: subcc %0, %%o5, %0 - sta %%g0, [%0] %3 - sta %%g0, [%0 + %2] %3 - sta %%g0, [%0 + %%g1] %3 - sta %%g0, [%0 + %%g2] %3 - sta %%g0, [%0 + %%g3] %3 - sta %%g0, [%0 + %%g4] %3 - sta %%g0, [%0 + %%g5] %3 - bg 1b - sta %%g0, [%1 + %%o4] %3 -" : "=&r" (nbytes) + __asm__ __volatile__( + "add %2, %2, %%g1\n\t" + "add %2, %%g1, %%g2\n\t" + "add %2, %%g2, %%g3\n\t" + "add %2, %%g3, %%g4\n\t" + "add %2, %%g4, %%g5\n\t" + "add %2, %%g5, %%o4\n\t" + "add %2, %%o4, %%o5\n" + "1:\n\t" + "subcc %0, %%o5, %0\n\t" + "sta %%g0, [%0] %3\n\t" + "sta %%g0, [%0 + %2] %3\n\t" + "sta %%g0, [%0 + %%g1] %3\n\t" + "sta %%g0, [%0 + %%g2] %3\n\t" + "sta %%g0, [%0 + %%g3] %3\n\t" + "sta %%g0, [%0 + %%g4] %3\n\t" + "sta %%g0, [%0 + %%g5] %3\n\t" + "bg 1b\n\t" + " sta %%g0, [%1 + %%o4] %3\n" + : "=&r" (nbytes) : "0" (nbytes), "r" (lsize), "i" (ASI_FLUSHCTX) : "g1", "g2", "g3", "g4", "g5", "o4", "o5", "cc"); } @@ -165,26 +166,27 @@ unsigned long nbytes = SUN4C_VAC_SIZE; unsigned long lsize = sun4c_vacinfo.linesize; - __asm__ __volatile__(" - add %2, %2, %%g1 - add %2, %%g1, %%g2 - add %2, %%g2, %%g3 - add %2, %%g3, %%g4 - add %2, %%g4, %%g5 - add %2, %%g5, %%o4 - add %2, %%o4, %%o5 -1: subcc %1, %%o5, %1 - sta %%g0, [%0] %6 - sta %%g0, [%0 + %2] %6 - sta %%g0, [%0 + %%g1] %6 - sta %%g0, [%0 + %%g2] %6 - sta %%g0, [%0 + %%g3] %6 - sta %%g0, [%0 + %%g4] %6 - sta %%g0, [%0 + %%g5] %6 - sta %%g0, [%0 + %%o4] %6 - bg 1b - add %0, %%o5, %0 -" : "=&r" (addr), "=&r" (nbytes), "=&r" (lsize) + __asm__ __volatile__( + "add %2, %2, %%g1\n\t" + "add %2, %%g1, %%g2\n\t" + "add %2, %%g2, %%g3\n\t" + "add %2, %%g3, %%g4\n\t" + "add %2, %%g4, %%g5\n\t" + "add %2, %%g5, %%o4\n\t" + "add %2, %%o4, %%o5\n" + "1:\n\t" + "subcc %1, %%o5, %1\n\t" + "sta %%g0, [%0] %6\n\t" + "sta %%g0, [%0 + %2] %6\n\t" + "sta %%g0, [%0 + %%g1] %6\n\t" + "sta %%g0, [%0 + %%g2] %6\n\t" + "sta %%g0, [%0 + %%g3] %6\n\t" + "sta %%g0, [%0 + %%g4] %6\n\t" + "sta %%g0, [%0 + %%g5] %6\n\t" + "sta %%g0, [%0 + %%o4] %6\n\t" + "bg 1b\n\t" + " add %0, %%o5, %0\n" + : "=&r" (addr), "=&r" (nbytes), "=&r" (lsize) : "0" (addr), "1" (nbytes), "2" (lsize), "i" (ASI_FLUSHSEG) : "g1", "g2", "g3", "g4", "g5", "o4", "o5", "cc"); @@ -242,26 +244,27 @@ unsigned long left = PAGE_SIZE; unsigned long lsize = sun4c_vacinfo.linesize; - __asm__ __volatile__(" - add %2, %2, %%g1 - add %2, %%g1, %%g2 - add %2, %%g2, %%g3 - add %2, %%g3, %%g4 - add %2, %%g4, %%g5 - add %2, %%g5, %%o4 - add %2, %%o4, %%o5 -1: subcc %1, %%o5, %1 - sta %%g0, [%0] %6 - sta %%g0, [%0 + %2] %6 - sta %%g0, [%0 + %%g1] %6 - sta %%g0, [%0 + %%g2] %6 - sta %%g0, [%0 + %%g3] %6 - sta %%g0, [%0 + %%g4] %6 - sta %%g0, [%0 + %%g5] %6 - sta %%g0, [%0 + %%o4] %6 - bg 1b - add %0, %%o5, %0 -" : "=&r" (addr), "=&r" (left), "=&r" (lsize) + __asm__ __volatile__( + "add %2, %2, %%g1\n\t" + "add %2, %%g1, %%g2\n\t" + "add %2, %%g2, %%g3\n\t" + "add %2, %%g3, %%g4\n\t" + "add %2, %%g4, %%g5\n\t" + "add %2, %%g5, %%o4\n\t" + "add %2, %%o4, %%o5\n" + "1:\n\t" + "subcc %1, %%o5, %1\n\t" + "sta %%g0, [%0] %6\n\t" + "sta %%g0, [%0 + %2] %6\n\t" + "sta %%g0, [%0 + %%g1] %6\n\t" + "sta %%g0, [%0 + %%g2] %6\n\t" + "sta %%g0, [%0 + %%g3] %6\n\t" + "sta %%g0, [%0 + %%g4] %6\n\t" + "sta %%g0, [%0 + %%g5] %6\n\t" + "sta %%g0, [%0 + %%o4] %6\n\t" + "bg 1b\n\t" + " add %0, %%o5, %0\n" + : "=&r" (addr), "=&r" (left), "=&r" (lsize) : "0" (addr), "1" (left), "2" (lsize), "i" (ASI_FLUSHPG) : "g1", "g2", "g3", "g4", "g5", "o4", "o5", "cc"); @@ -1402,46 +1405,46 @@ if (sun4c_vacinfo.linesize == 32) { while (begin < end) { - __asm__ __volatile__(" - ld [%0 + 0x00], %%g0 - ld [%0 + 0x20], %%g0 - ld [%0 + 0x40], %%g0 - ld [%0 + 0x60], %%g0 - ld [%0 + 0x80], %%g0 - ld [%0 + 0xa0], %%g0 - ld [%0 + 0xc0], %%g0 - ld [%0 + 0xe0], %%g0 - ld [%0 + 0x100], %%g0 - ld [%0 + 0x120], %%g0 - ld [%0 + 0x140], %%g0 - ld [%0 + 0x160], %%g0 - ld [%0 + 0x180], %%g0 - ld [%0 + 0x1a0], %%g0 - ld [%0 + 0x1c0], %%g0 - ld [%0 + 0x1e0], %%g0 - " : : "r" (begin)); + __asm__ __volatile__( + "ld [%0 + 0x00], %%g0\n\t" + "ld [%0 + 0x20], %%g0\n\t" + "ld [%0 + 0x40], %%g0\n\t" + "ld [%0 + 0x60], %%g0\n\t" + "ld [%0 + 0x80], %%g0\n\t" + "ld [%0 + 0xa0], %%g0\n\t" + "ld [%0 + 0xc0], %%g0\n\t" + "ld [%0 + 0xe0], %%g0\n\t" + "ld [%0 + 0x100], %%g0\n\t" + "ld [%0 + 0x120], %%g0\n\t" + "ld [%0 + 0x140], %%g0\n\t" + "ld [%0 + 0x160], %%g0\n\t" + "ld [%0 + 0x180], %%g0\n\t" + "ld [%0 + 0x1a0], %%g0\n\t" + "ld [%0 + 0x1c0], %%g0\n\t" + "ld [%0 + 0x1e0], %%g0\n" + : : "r" (begin)); begin += 512; } } else { while (begin < end) { - __asm__ __volatile__(" - ld [%0 + 0x00], %%g0 - ld [%0 + 0x10], %%g0 - ld [%0 + 0x20], %%g0 - ld [%0 + 0x30], %%g0 - ld [%0 + 0x40], %%g0 - ld [%0 + 0x50], %%g0 - ld [%0 + 0x60], %%g0 - ld [%0 + 0x70], %%g0 - ld [%0 + 0x80], %%g0 - ld [%0 + 0x90], %%g0 - ld [%0 + 0xa0], %%g0 - ld [%0 + 0xb0], %%g0 - ld [%0 + 0xc0], %%g0 - ld [%0 + 0xd0], %%g0 - ld [%0 + 0xe0], %%g0 - ld [%0 + 0xf0], %%g0 - " : : "r" (begin)); + __asm__ __volatile__( + "ld [%0 + 0x00], %%g0\n\t" + "ld [%0 + 0x10], %%g0\n\t" + "ld [%0 + 0x20], %%g0\n\t" + "ld [%0 + 0x30], %%g0\n\t" + "ld [%0 + 0x40], %%g0\n\t" + "ld [%0 + 0x50], %%g0\n\t" + "ld [%0 + 0x60], %%g0\n\t" + "ld [%0 + 0x70], %%g0\n\t" + "ld [%0 + 0x80], %%g0\n\t" + "ld [%0 + 0x90], %%g0\n\t" + "ld [%0 + 0xa0], %%g0\n\t" + "ld [%0 + 0xb0], %%g0\n\t" + "ld [%0 + 0xc0], %%g0\n\t" + "ld [%0 + 0xd0], %%g0\n\t" + "ld [%0 + 0xe0], %%g0\n\t" + "ld [%0 + 0xf0], %%g0\n" + : : "r" (begin)); begin += 256; } } diff -u --recursive --new-file v2.4.13/linux/arch/sparc/prom/console.c linux/arch/sparc/prom/console.c --- v2.4.13/linux/arch/sparc/prom/console.c Tue May 1 20:59:24 2001 +++ linux/arch/sparc/prom/console.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.24 2001/04/27 07:02:42 davem Exp $ +/* $Id: console.c,v 1.25 2001/10/30 04:54:22 davem Exp $ * console.c: Routines that deal with sending and receiving IO * to/from the current console device using the PROM. * @@ -207,6 +207,7 @@ } break; default: - } + ; + }; return PROMDEV_O_UNK; } diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/defconfig linux/arch/sparc64/defconfig --- v2.4.13/linux/arch/sparc64/defconfig Tue Oct 23 22:48:50 2001 +++ linux/arch/sparc64/defconfig Tue Oct 30 15:08:11 2001 @@ -172,8 +172,10 @@ # Networking options # CONFIG_PACKET=y -# CONFIG_PACKET_MMAP is not set -# CONFIG_NETLINK is not set +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK=y +CONFIG_RTNETLINK=y +CONFIG_NETLINK_DEV=y # CONFIG_NETFILTER is not set # CONFIG_FILTER is not set CONFIG_UNIX=y @@ -183,11 +185,13 @@ # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set +CONFIG_ARPD=y CONFIG_INET_ECN=y # CONFIG_SYN_COOKIES is not set CONFIG_IPV6=m # CONFIG_KHTTPD is not set # CONFIG_ATM is not set +CONFIG_VLAN_8021Q=m # # @@ -411,6 +415,7 @@ CONFIG_BONDING=m CONFIG_EQUALIZER=m CONFIG_TUN=m +# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -453,6 +458,7 @@ CONFIG_NE2K_PCI=m # CONFIG_NE3210 is not set # CONFIG_ES3210 is not set +# CONFIG_8139CP is not set CONFIG_8139TOO=m # CONFIG_8139TOO_PIO is not set # CONFIG_8139TOO_TUNE_TWISTER is not set @@ -566,7 +572,7 @@ CONFIG_EFS_FS=m # CONFIG_JFFS_FS is not set # CONFIG_JFFS2_FS is not set -CONFIG_CRAMFS=m +# CONFIG_CRAMFS is not set # CONFIG_TMPFS is not set CONFIG_RAMFS=m CONFIG_ISO9660_FS=m diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/kernel/setup.c linux/arch/sparc64/kernel/setup.c --- v2.4.13/linux/arch/sparc64/kernel/setup.c Tue Oct 23 22:48:50 2001 +++ linux/arch/sparc64/kernel/setup.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: setup.c,v 1.69 2001/10/18 09:40:00 davem Exp $ +/* $Id: setup.c,v 1.70 2001/10/25 18:48:03 davem Exp $ * linux/arch/sparc64/kernel/setup.c * * Copyright (C) 1995,1996 David S. Miller (davem@caip.rutgers.edu) @@ -195,7 +195,14 @@ pgd_t *pgdp; pmd_t *pmdp; pte_t *ptep; + int error; + if ((va >= LOW_OBP_ADDRESS) && (va < HI_OBP_ADDRESS)) { + tte = prom_virt_to_phys(va, &error); + if (!error) + res = PROM_TRUE; + goto done; + } pgdp = pgd_offset_k(va); if (pgd_none(*pgdp)) goto done; diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/kernel/smp.c linux/arch/sparc64/kernel/smp.c --- v2.4.13/linux/arch/sparc64/kernel/smp.c Tue Oct 23 22:48:50 2001 +++ linux/arch/sparc64/kernel/smp.c Tue Oct 30 15:08:11 2001 @@ -585,14 +585,12 @@ extern unsigned long xcall_flush_dcache_page_cheetah; extern unsigned long xcall_flush_dcache_page_spitfire; -static spinlock_t dcache_xcall_lock = SPIN_LOCK_UNLOCKED; -static struct page *dcache_page; #ifdef DCFLUSH_DEBUG extern atomic_t dcpage_flushes; extern atomic_t dcpage_flushes_xcall; #endif -static __inline__ void __smp_flush_dcache_page_client(struct page *page) +static __inline__ void __local_flush_dcache_page(struct page *page) { #if (L1DCACHE_SIZE > PAGE_SIZE) __flush_dcache_page(page->virtual, @@ -605,37 +603,31 @@ #endif } -void smp_flush_dcache_page_client(void) -{ - __smp_flush_dcache_page_client(dcache_page); - spin_unlock(&dcache_xcall_lock); -} - -void smp_flush_dcache_page_impl(struct page *page) +void smp_flush_dcache_page_impl(struct page *page, int cpu) { if (smp_processors_ready) { - int cpu = dcache_dirty_cpu(page); unsigned long mask = 1UL << cpu; #ifdef DCFLUSH_DEBUG atomic_inc(&dcpage_flushes); #endif if (cpu == smp_processor_id()) { - __smp_flush_dcache_page_client(page); + __local_flush_dcache_page(page); } else if ((cpu_present_map & mask) != 0) { u64 data0; if (tlb_type == spitfire) { - spin_lock(&dcache_xcall_lock); - dcache_page = page; data0 = ((u64)&xcall_flush_dcache_page_spitfire); - spitfire_xcall_deliver(data0, 0, 0, mask); - /* Target cpu drops dcache_xcall_lock. */ + if (page->mapping != NULL) + data0 |= ((u64)1 << 32); + spitfire_xcall_deliver(data0, + __pa(page->virtual), + (u64) page->virtual, + mask); } else { - /* Look mom, no locks... */ data0 = ((u64)&xcall_flush_dcache_page_cheetah); cheetah_xcall_deliver(data0, - (u64) page->virtual, + __pa(page->virtual), 0, mask); } #ifdef DCFLUSH_DEBUG diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/kernel/sparc64_ksyms.c linux/arch/sparc64/kernel/sparc64_ksyms.c --- v2.4.13/linux/arch/sparc64/kernel/sparc64_ksyms.c Tue Oct 23 22:48:50 2001 +++ linux/arch/sparc64/kernel/sparc64_ksyms.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: sparc64_ksyms.c,v 1.113 2001/10/17 18:26:58 davem Exp $ +/* $Id: sparc64_ksyms.c,v 1.116 2001/10/26 15:49:21 davem Exp $ * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -126,7 +126,9 @@ /* Hard IRQ locking */ EXPORT_SYMBOL(global_irq_holder); +#ifdef CONFIG_SMP EXPORT_SYMBOL(synchronize_irq); +#endif EXPORT_SYMBOL(__global_cli); EXPORT_SYMBOL(__global_sti); EXPORT_SYMBOL(__global_save_flags); @@ -136,7 +138,9 @@ EXPORT_SYMBOL(cpu_data); /* Misc SMP information */ +#ifdef CONFIG_SMP EXPORT_SYMBOL(smp_num_cpus); +#endif EXPORT_SYMBOL(__cpu_number_map); EXPORT_SYMBOL(__cpu_logical_map); @@ -151,7 +155,9 @@ EXPORT_SYMBOL(_do_write_unlock); #endif +#ifdef CONFIG_SMP EXPORT_SYMBOL(smp_call_function); +#endif #endif @@ -307,8 +313,6 @@ EXPORT_SYMBOL(sys_ioctl); EXPORT_SYMBOL(sys32_ioctl); EXPORT_SYMBOL(sparc32_open); -EXPORT_SYMBOL(move_addr_to_kernel); -EXPORT_SYMBOL(move_addr_to_user); #endif /* Special internal versions of library functions. */ diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/kernel/sys_sparc.c linux/arch/sparc64/kernel/sys_sparc.c --- v2.4.13/linux/arch/sparc64/kernel/sys_sparc.c Fri Apr 13 20:15:55 2001 +++ linux/arch/sparc64/kernel/sys_sparc.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: sys_sparc.c,v 1.52 2001/04/14 01:12:02 davem Exp $ +/* $Id: sys_sparc.c,v 1.54 2001/10/28 20:49:13 davem Exp $ * linux/arch/sparc64/kernel/sys_sparc.c * * This file contains various random system calls that @@ -255,13 +255,27 @@ asmlinkage int sparc64_personality(unsigned long personality) { - int ret; - if (current->personality == PER_LINUX32 && personality == PER_LINUX) - personality = PER_LINUX32; - ret = sys_personality(personality); - if (ret == PER_LINUX32) + unsigned long ret, trying, orig_ret; + + trying = ret = personality; + + if (current->personality == PER_LINUX32 && + trying == PER_LINUX) + trying = ret = PER_LINUX32; + + /* For PER_LINUX32 we want to retain &default_exec_domain. */ + if (trying == PER_LINUX32) ret = PER_LINUX; - return ret; + + orig_ret = ret; + ret = sys_personality(ret); + + if (orig_ret == PER_LINUX && trying == PER_LINUX32) { + current->personality = PER_LINUX32; + ret = PER_LINUX; + } + + return (int) ret; } /* Linux version of mmap */ diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/mm/init.c linux/arch/sparc64/mm/init.c --- v2.4.13/linux/arch/sparc64/mm/init.c Tue Oct 23 22:48:50 2001 +++ linux/arch/sparc64/mm/init.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: init.c,v 1.194 2001/10/17 18:26:58 davem Exp $ +/* $Id: init.c,v 1.199 2001/10/25 18:48:03 davem Exp $ * arch/sparc64/mm/init.c * * Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu) @@ -132,21 +132,69 @@ #endif } +#define PG_dcache_dirty PG_arch_1 + +#define dcache_dirty_cpu(page) \ + (((page)->flags >> 24) & (NR_CPUS - 1UL)) + +static __inline__ void set_dcache_dirty(struct page *page) +{ + unsigned long mask = smp_processor_id(); + unsigned long non_cpu_bits = (1UL << 24UL) - 1UL; + mask = (mask << 24) | (1UL << PG_dcache_dirty); + __asm__ __volatile__("1:\n\t" + "ldx [%2], %%g7\n\t" + "and %%g7, %1, %%g5\n\t" + "or %%g5, %0, %%g5\n\t" + "casx [%2], %%g7, %%g5\n\t" + "cmp %%g7, %%g5\n\t" + "bne,pn %%xcc, 1b\n\t" + " nop" + : /* no outputs */ + : "r" (mask), "r" (non_cpu_bits), "r" (&page->flags) + : "g5", "g7"); +} + +static __inline__ void clear_dcache_dirty_cpu(struct page *page, unsigned long cpu) +{ + unsigned long mask = (1UL << PG_dcache_dirty); + + __asm__ __volatile__("! test_and_clear_dcache_dirty\n" + "1:\n\t" + "ldx [%2], %%g7\n\t" + "srlx %%g7, 24, %%g5\n\t" + "cmp %%g5, %0\n\t" + "bne,pn %%icc, 2f\n\t" + " andn %%g7, %1, %%g5\n\t" + "casx [%2], %%g7, %%g5\n\t" + "cmp %%g7, %%g5\n\t" + "bne,pn %%xcc, 1b\n\t" + " nop\n" + "2:" + : /* no outputs */ + : "r" (cpu), "r" (mask), "r" (&page->flags) + : "g5", "g7"); +} + void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) { struct page *page = pte_page(pte); + unsigned long pg_flags; + + if (VALID_PAGE(page) && + page->mapping && + ((pg_flags = page->flags) & (1UL << PG_dcache_dirty))) { + int cpu = (pg_flags >> 24); - if (VALID_PAGE(page) && page->mapping && - test_bit(PG_dcache_dirty, &page->flags)) { /* This is just to optimize away some function calls * in the SMP case. */ - if (dcache_dirty_cpu(page) == smp_processor_id()) + if (cpu == smp_processor_id()) flush_dcache_page_impl(page); else - smp_flush_dcache_page_impl(page); + smp_flush_dcache_page_impl(page, cpu); - clear_dcache_dirty(page); + clear_dcache_dirty_cpu(page, cpu); } __update_mmu_cache(vma, address, pte); } @@ -162,7 +210,7 @@ if (dirty) { if (dirty_cpu == smp_processor_id()) return; - smp_flush_dcache_page_impl(page); + smp_flush_dcache_page_impl(page, dirty_cpu); } set_dcache_dirty(page); } else { @@ -244,12 +292,44 @@ prom_halt(); } +#define BASE_PAGE_SIZE 8192 +static pmd_t *prompmd; + +/* + * Translate PROM's mapping we capture at boot time into physical address. + * The second parameter is only set from prom_callback() invocations. + */ +unsigned long prom_virt_to_phys(unsigned long promva, int *error) +{ + pmd_t *pmdp = prompmd + ((promva >> 23) & 0x7ff); + pte_t *ptep; + unsigned long base; + + if (pmd_none(*pmdp)) { + if (error) + *error = 1; + return(0); + } + ptep = (pte_t *)pmd_page(*pmdp) + ((promva >> 13) & 0x3ff); + if (!pte_present(*ptep)) { + if (error) + *error = 1; + return(0); + } + if (error) { + *error = 0; + return(pte_val(*ptep)); + } + base = pte_val(*ptep) & _PAGE_PADDR; + return(base + (promva & (BASE_PAGE_SIZE - 1))); +} + static void inherit_prom_mappings(void) { struct linux_prom_translation *trans; unsigned long phys_page, tte_vaddr, tte_data; void (*remap_func)(unsigned long, unsigned long, int); - pmd_t *pmdp, *pmd; + pmd_t *pmdp; pte_t *ptep; int node, n, i, tsz; extern unsigned int obp_iaddr_patch[2], obp_daddr_patch[2]; @@ -283,21 +363,21 @@ * in inherit_locked_prom_mappings()). */ #define OBP_PMD_SIZE 2048 -#define BASE_PAGE_SIZE 8192 - pmd = __alloc_bootmem(OBP_PMD_SIZE, OBP_PMD_SIZE, 0UL); - if (pmd == NULL) + prompmd = __alloc_bootmem(OBP_PMD_SIZE, OBP_PMD_SIZE, 0UL); + if (prompmd == NULL) early_pgtable_allocfail("pmd"); - memset(pmd, 0, OBP_PMD_SIZE); + memset(prompmd, 0, OBP_PMD_SIZE); for (i = 0; i < n; i++) { unsigned long vaddr; - if (trans[i].virt >= 0xf0000000 && trans[i].virt < 0x100000000) { + if (trans[i].virt >= LOW_OBP_ADDRESS && trans[i].virt < HI_OBP_ADDRESS) { for (vaddr = trans[i].virt; - vaddr < trans[i].virt + trans[i].size; + ((vaddr < trans[i].virt + trans[i].size) && + (vaddr < HI_OBP_ADDRESS)); vaddr += BASE_PAGE_SIZE) { unsigned long val; - pmdp = pmd + ((vaddr >> 23) & 0x7ff); + pmdp = prompmd + ((vaddr >> 23) & 0x7ff); if (pmd_none(*pmdp)) { ptep = __alloc_bootmem(BASE_PAGE_SIZE, BASE_PAGE_SIZE, @@ -321,7 +401,7 @@ } } } - phys_page = __pa(pmd); + phys_page = __pa(prompmd); obp_iaddr_patch[0] |= (phys_page >> 10); obp_iaddr_patch[1] |= (phys_page & 0x3ff); flushi((long)&obp_iaddr_patch[0]); diff -u --recursive --new-file v2.4.13/linux/arch/sparc64/mm/ultra.S linux/arch/sparc64/mm/ultra.S --- v2.4.13/linux/arch/sparc64/mm/ultra.S Tue Oct 23 22:48:50 2001 +++ linux/arch/sparc64/mm/ultra.S Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: ultra.S,v 1.63 2001/10/17 19:30:21 davem Exp $ +/* $Id: ultra.S,v 1.67 2001/10/23 14:28:20 davem Exp $ * ultra.S: Don't expand these all over the place... * * Copyright (C) 1997, 2000 David S. Miller (davem@redhat.com) @@ -505,7 +505,7 @@ .align 32 .globl xcall_flush_dcache_page_cheetah -xcall_flush_dcache_page_cheetah: +xcall_flush_dcache_page_cheetah: /* %g1 == physical page address */ sethi %hi(PAGE_SIZE), %g3 1: subcc %g3, (1 << 5), %g3 stxa %g0, [%g1 + %g3] ASI_DCACHE_INVALIDATE @@ -516,18 +516,39 @@ nop .globl xcall_flush_dcache_page_spitfire -xcall_flush_dcache_page_spitfire: - rdpr %pstate, %g2 - wrpr %g2, PSTATE_IG | PSTATE_AG, %pstate - rdpr %pil, %g2 - wrpr %g0, 15, %pil - sethi %hi(109f), %g7 - b,pt %xcc, etrap_irq -109: or %g7, %lo(109b), %g7 - call smp_flush_dcache_page_client +xcall_flush_dcache_page_spitfire: /* %g1 == physical page address + %g7 == kernel page virtual address + %g5 == (page->mapping != NULL) */ +#if (L1DCACHE_SIZE > PAGE_SIZE) + srlx %g1, (13 - 2), %g1 ! Form tag comparitor + sethi %hi(L1DCACHE_SIZE), %g3 ! D$ size == 16K + sub %g3, (1 << 5), %g3 ! D$ linesize == 32 +1: ldxa [%g3] ASI_DCACHE_TAG, %g2 + andcc %g2, 0x3, %g0 + be,pn %xcc, 2f + andn %g2, 0x3, %g2 + cmp %g2, %g1 + + bne,pt %xcc, 2f nop - b,pt %xcc, rtrap - clr %l6 + stxa %g0, [%g3] ASI_DCACHE_TAG + membar #Sync +2: cmp %g3, 0 + bne,pt %xcc, 1b + sub %g3, (1 << 5), %g3 + + brz,pn %g5, 2f +#endif /* L1DCACHE_SIZE > PAGE_SIZE */ + sethi %hi(PAGE_SIZE), %g3 + +1: flush %g7 + subcc %g3, (1 << 5), %g3 + bne,pt %icc, 1b + add %g7, (1 << 5), %g7 + +2: retry + nop + nop .globl xcall_capture xcall_capture: diff -u --recursive --new-file v2.4.13/linux/drivers/acorn/block/mfmhd.c linux/drivers/acorn/block/mfmhd.c --- v2.4.13/linux/drivers/acorn/block/mfmhd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/acorn/block/mfmhd.c Thu Oct 25 13:58:35 2001 @@ -1208,11 +1208,6 @@ return -EFAULT; return 0; - case BLKGETSIZE: - return put_user (mfm[minor].nr_sects, (unsigned long *)arg); - case BLKGETSIZE64: - return put_user ((u64)mfm[minor].nr_sects << 9, (u64 *)arg); - case BLKFRASET: if (!capable(CAP_SYS_ADMIN)) return -EACCES; @@ -1230,6 +1225,8 @@ return -EACCES; return mfm_reread_partitions(dev); + case BLKGETSIZE: + case BLKGETSIZE64: case BLKFLSBUF: case BLKROSET: case BLKROGET: @@ -1250,7 +1247,6 @@ if (dev >= mfm_drives) return -ENODEV; - MOD_INC_USE_COUNT; while (mfm_info[dev].busy) sleep_on (&mfm_wait_open); @@ -1265,7 +1261,6 @@ static int mfm_release(struct inode *inode, struct file *file) { mfm_info[DEVICE_NR(MINOR(inode->i_rdev))].access_count--; - MOD_DEC_USE_COUNT; return 0; } @@ -1324,6 +1319,7 @@ static struct block_device_operations mfm_fops = { + owner: THIS_MODULE, open: mfm_open, release: mfm_release, ioctl: mfm_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/acorn/char/keyb_ps2.c linux/drivers/acorn/char/keyb_ps2.c --- v2.4.13/linux/drivers/acorn/char/keyb_ps2.c Tue Jul 3 17:08:19 2001 +++ linux/drivers/acorn/char/keyb_ps2.c Thu Oct 25 13:53:46 2001 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -212,7 +213,7 @@ }; #ifdef CONFIG_MAGIC_SYSRQ -unsigned char ps2kbd_sysrq_xlate[] = +static unsigned char ps2kbd_sysrq_xlate[] = { 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -360,7 +361,7 @@ status = 0; } -void ps2kbd_leds(unsigned int leds) +static void ps2kbd_leds(unsigned char leds) { ps2kbd_sendbyte(KBD_SETLEDS); ps2kbd_sendbyte(leds); @@ -380,6 +381,17 @@ { } +static int ps2kbd_translate(unsigned char scancode, unsigned char *keycode, char rawmode) +{ + *keycode = scancode; + return 1; +} + +static char ps2kbd_unexpected_up(unsigned char scancode) +{ + return 0200; +} + int __init ps2kbd_init_hw(void) { /* Reset the keyboard state machine. */ @@ -391,6 +403,14 @@ panic("Could not allocate keyboard receive IRQ!"); if (request_irq (IRQ_KEYBOARDTX, ps2kbd_tx, 0, "keyboard", NULL) != 0) panic("Could not allocate keyboard transmit IRQ!"); + + k_translate = ps2kbd_translate; + k_unexpected_up = ps2kbd_unexpected_up; + k_leds = ps2kbd_leds; +#ifdef CONFIG_MAGIC_SYSRQ + k_sysrq_xlate = ps2kbd_sysrq_xlate; + k_sysrq_key = 13; +#endif return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/acorn/scsi/ecoscsi.c linux/drivers/acorn/scsi/ecoscsi.c --- v2.4.13/linux/drivers/acorn/scsi/ecoscsi.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/acorn/scsi/ecoscsi.c Thu Oct 25 13:53:46 2001 @@ -232,7 +232,6 @@ #endif #undef STAT -#ifndef HOSTS_C #define NCR5380_implementation_fields \ int port, ctrl diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/Makefile linux/drivers/acpi/Makefile --- v2.4.13/linux/drivers/acpi/Makefile Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/Makefile Wed Oct 24 14:06:21 2001 @@ -36,12 +36,11 @@ subdir-$(CONFIG_ACPI) += $(acpi-subdirs) subdir-$(CONFIG_ACPI_BUSMGR) += ospm -obj-$(CONFIG_ACPI) += os.o acpi_ksyms.o +obj-$(CONFIG_ACPI) += driver.o os.o acpi_ksyms.o obj-$(CONFIG_ACPI) += $(foreach dir,$(acpi-subdirs),$(dir)/$(dir).o) ifdef CONFIG_ACPI_KERNEL_CONFIG obj-$(CONFIG_ACPI) += acpiconf.o osconf.o endif -obj-$(CONFIG_ACPI) += driver.o ifeq ($(CONFIG_ACPI_BUSMGR),y) obj-y += ospm/ospm.o diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/acpi_ksyms.c linux/drivers/acpi/acpi_ksyms.c --- v2.4.13/linux/drivers/acpi/acpi_ksyms.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/acpi_ksyms.c Wed Oct 24 14:06:21 2001 @@ -38,6 +38,14 @@ EXPORT_SYMBOL(acpi_db_user_commands); #endif +#ifdef ACPI_DEBUG +EXPORT_SYMBOL(acpi_ut_debug_print_raw); +EXPORT_SYMBOL(acpi_ut_debug_print); +EXPORT_SYMBOL(acpi_ut_status_exit); +EXPORT_SYMBOL(acpi_ut_exit); +EXPORT_SYMBOL(acpi_ut_trace); +#endif + EXPORT_SYMBOL(acpi_gbl_FADT); EXPORT_SYMBOL(acpi_os_free); @@ -103,6 +111,5 @@ EXPORT_SYMBOL(acpi_hw_register_read); EXPORT_SYMBOL(acpi_set_firmware_waking_vector); EXPORT_SYMBOL(acpi_subsystem_status); - EXPORT_SYMBOL(acpi_os_signal); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbcmds.c linux/drivers/acpi/debugger/dbcmds.c --- v2.4.13/linux/drivers/acpi/debugger/dbcmds.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbcmds.c Wed Oct 24 14:06:21 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbcmds - debug commands and output routines - * $Revision: 65 $ + * $Revision: 66 $ * ******************************************************************************/ @@ -422,7 +422,7 @@ /* Display the subtree */ acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT); - acpi_ns_dump_objects (ACPI_TYPE_ANY, max_depth, ACPI_UINT32_MAX, subtree_entry); + acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, ACPI_UINT32_MAX, subtree_entry); acpi_db_set_output_destination (DB_CONSOLE_OUTPUT); } @@ -466,7 +466,7 @@ /* Display the subtree */ acpi_db_set_output_destination (DB_REDIRECTABLE_OUTPUT); - acpi_ns_dump_objects (ACPI_TYPE_ANY, max_depth, owner_id, subtree_entry); + acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, max_depth, owner_id, subtree_entry); acpi_db_set_output_destination (DB_CONSOLE_OUTPUT); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbdisasm.c linux/drivers/acpi/debugger/dbdisasm.c --- v2.4.13/linux/drivers/acpi/debugger/dbdisasm.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbdisasm.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbdisasm - parser op tree display routines - * $Revision: 48 $ + * $Revision: 50 $ * ******************************************************************************/ @@ -97,6 +97,7 @@ acpi_status acpi_ps_display_object_pathname ( + acpi_walk_state *walk_state, acpi_parse_object *op) { acpi_parse_object *target_op; @@ -130,26 +131,43 @@ acpi_status acpi_ps_display_object_pathname ( + acpi_walk_state *walk_state, acpi_parse_object *op) { acpi_status status; acpi_namespace_node *node; NATIVE_CHAR buffer[MAX_SHOW_ENTRY]; u32 buffer_size = MAX_SHOW_ENTRY; + u32 debug_level; - acpi_os_printf (" (Path "); + /* Save current debug level so we don't get extraneous debug output */ + + debug_level = acpi_dbg_level; + acpi_dbg_level = 0; /* Just get the Node out of the Op object */ node = op->node; if (!node) { - /* - * No Named obj, so we can't get the pathname since the object - * is not in the namespace. This can happen during single - * stepping where a dynamic named object is *about* to be created. - */ - return (AE_OK); + /* Node not defined in this scope, look it up */ + + status = acpi_ns_lookup (walk_state->scope_info, op->value.string, ACPI_TYPE_ANY, + IMODE_EXECUTE, NS_SEARCH_PARENT, walk_state, &(node)); + + if (ACPI_FAILURE (status)) { + /* + * We can't get the pathname since the object + * is not in the namespace. This can happen during single + * stepping where a dynamic named object is *about* to be created. + */ + acpi_os_printf (" [Path not found]"); + goto exit; + } + + /* Save it for next time. */ + + op->node = node; } /* Convert Named_desc/handle to a full pathname */ @@ -157,11 +175,17 @@ status = acpi_ns_handle_to_pathname (node, &buffer_size, buffer); if (ACPI_FAILURE (status)) { acpi_os_printf ("****Could not get pathname****)"); - return (status); + goto exit; } - acpi_os_printf ("%s)", buffer); - return (AE_OK); + acpi_os_printf (" (Path %s)", buffer); + + +exit: + /* Restore the debug level */ + + acpi_dbg_level = debug_level; + return (status); } #endif @@ -275,7 +299,7 @@ if ((op->opcode == AML_INT_NAMEPATH_OP && op->value.name) && (op->parent) && (acpi_gbl_db_opt_verbose)) { - acpi_ps_display_object_pathname (op); + acpi_ps_display_object_pathname (walk_state, op); } acpi_os_printf ("\n"); @@ -561,7 +585,7 @@ case AML_QWORD_OP: if (acpi_gbl_db_opt_verbose) { - acpi_os_printf ("(UINT64) 0x%8.8X%8.8X", op->value.integer64.hi, + acpi_os_printf ("(u64) 0x%8.8X%8.8X", op->value.integer64.hi, op->value.integer64.lo); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbdisply.c linux/drivers/acpi/debugger/dbdisply.c --- v2.4.13/linux/drivers/acpi/debugger/dbdisply.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbdisply.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbdisply - debug display commands - * $Revision: 52 $ + * $Revision: 57 $ * ******************************************************************************/ @@ -246,7 +246,7 @@ } else { - acpi_os_printf ("Object Pathname: %s\n", ret_buf.pointer); + acpi_os_printf ("Object (%p) Pathname: %s\n", node, ret_buf.pointer); } if (!acpi_os_readable (node, sizeof (acpi_namespace_node))) { @@ -264,7 +264,7 @@ return; } - acpi_ut_dump_buffer (node->object, sizeof (acpi_operand_object), display, ACPI_UINT32_MAX); + acpi_ut_dump_buffer ((void *) node->object, sizeof (acpi_operand_object), display, ACPI_UINT32_MAX); acpi_ex_dump_object_descriptor (node->object, 1); } } @@ -402,7 +402,7 @@ break; case AML_REVISION_OP: - acpi_os_printf ("[Const] Revision (%X)", ACPI_CA_VERSION); + acpi_os_printf ("[Const] Revision (%X)", ACPI_CA_SUPPORT_LEVEL); break; case AML_LOCAL_OP: @@ -520,28 +520,22 @@ num_remaining_ops++; } - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - /* Bad opcode or ASCII character */ - - continue; - } - - /* Decode the opcode */ - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ + op_info = acpi_ps_get_opcode_info (op->opcode); + switch (op_info->class) { + case AML_CLASS_ARGUMENT: if (count_remaining) { num_remaining_operands++; } num_operands++; break; + + case AML_CLASS_UNKNOWN: + /* Bad opcode or ASCII character */ + + continue; default: if (count_remaining) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbfileio.c linux/drivers/acpi/debugger/dbfileio.c --- v2.4.13/linux/drivers/acpi/debugger/dbfileio.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbfileio.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: dbfileio - Debugger file I/O commands. These can't usually * be used when running the debugger in Ring 0 (Kernel mode) - * $Revision: 48 $ + * $Revision: 53 $ * ******************************************************************************/ @@ -38,16 +38,18 @@ MODULE_NAME ("dbfileio") +/* + * NOTE: this is here for lack of a better place. It is used in all + * flavors of the debugger, need LCD file + */ #ifdef ACPI_APPLICATION #include FILE *acpi_gbl_debug_file = NULL; #endif -/* - * NOTE: this is here for lack of a better place. It is used in all - * flavors of the debugger, need LCD file - */ +acpi_table_header *acpi_gbl_db_table_ptr = NULL; + /******************************************************************************* * @@ -172,7 +174,7 @@ u32 *table_length) { acpi_table_header table_header; - u8 *aml_ptr; + u8 *aml_start; u32 aml_length; u32 actual; acpi_status status; @@ -209,7 +211,7 @@ /* Allocate a buffer for the table */ *table_length = table_header.length; - *table_ptr = ACPI_MEM_ALLOCATE ((size_t) *table_length); + *table_ptr = acpi_os_allocate ((size_t) *table_length); if (!*table_ptr) { acpi_os_printf ("Could not allocate memory for ACPI table %4.4s (size=%X)\n", table_header.signature, table_header.length); @@ -217,8 +219,8 @@ } - aml_ptr = (u8 *) *table_ptr + sizeof (table_header); - aml_length = *table_length - sizeof (table_header); + aml_start = (u8 *) *table_ptr + sizeof (table_header); + aml_length = *table_length - sizeof (table_header); /* Copy the header to the buffer */ @@ -226,19 +228,19 @@ /* Get the rest of the table */ - actual = fread (aml_ptr, 1, (size_t) aml_length, fp); + actual = fread (aml_start, 1, (size_t) aml_length, fp); if (actual == aml_length) { return (AE_OK); } if (actual > 0) { acpi_os_printf ("Warning - reading table, asked for %X got %X\n", aml_length, actual); - return (AE_OK); + return (AE_OK); } acpi_os_printf ("Error - could not read the table file\n"); - ACPI_MEM_FREE (*table_ptr); + acpi_os_free (*table_ptr); *table_ptr = NULL; *table_length = 0; @@ -325,7 +327,6 @@ #ifdef ACPI_APPLICATION FILE *fp; acpi_status status; - acpi_table_header *table_ptr; u32 table_length; @@ -341,7 +342,7 @@ /* Get the entire file */ acpi_os_printf ("Loading Acpi table from file %s\n", filename); - status = acpi_db_load_table (fp, &table_ptr, &table_length); + status = acpi_db_load_table (fp, &acpi_gbl_db_table_ptr, &table_length); fclose(fp); if (ACPI_FAILURE (status)) { @@ -349,27 +350,25 @@ return (status); } - /* Attempt to recognize and install the table */ - status = ae_local_load_table (table_ptr); + status = ae_local_load_table (acpi_gbl_db_table_ptr); if (ACPI_FAILURE (status)) { if (status == AE_EXIST) { acpi_os_printf ("Table %4.4s is already installed\n", - &table_ptr->signature); + &acpi_gbl_db_table_ptr->signature); } - else { acpi_os_printf ("Could not install table, %s\n", acpi_format_exception (status)); } - ACPI_MEM_FREE (table_ptr); + acpi_os_free (acpi_gbl_db_table_ptr); return (status); } acpi_os_printf ("%4.4s at %p successfully installed and loaded\n", - &table_ptr->signature, table_ptr); + &acpi_gbl_db_table_ptr->signature, acpi_gbl_db_table_ptr); acpi_gbl_acpi_hardware_present = FALSE; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbinput.c linux/drivers/acpi/debugger/dbinput.c --- v2.4.13/linux/drivers/acpi/debugger/dbinput.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbinput.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbinput - user front-end to the AML debugger - * $Revision: 68 $ + * $Revision: 72 $ * ******************************************************************************/ @@ -47,11 +47,10 @@ NATIVE_CHAR acpi_gbl_db_scope_buf[40]; NATIVE_CHAR acpi_gbl_db_debug_filename[40]; NATIVE_CHAR *acpi_gbl_db_args[DB_MAX_ARGS]; -NATIVE_CHAR *acpi_gbl_db_buffer; +NATIVE_CHAR *acpi_gbl_db_buffer = NULL; NATIVE_CHAR *acpi_gbl_db_filename = NULL; u8 acpi_gbl_db_output_to_file = FALSE; - u32 acpi_gbl_db_debug_level = ACPI_LV_VERBOSITY2; u32 acpi_gbl_db_console_debug_level = NORMAL_DEFAULT | ACPI_LV_TABLES; u8 acpi_gbl_db_output_flags = DB_CONSOLE_OUTPUT; @@ -525,7 +524,7 @@ case CMD_ALLOCATIONS: #ifdef ACPI_DBG_TRACK_ALLOCATIONS - acpi_ut_dump_current_allocations ((u32) -1, NULL); + acpi_ut_dump_allocations ((u32) -1, NULL); #endif break; @@ -917,7 +916,6 @@ * because all the semaphores are deleted during termination */ acpi_terminate (); - return (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbstats.c linux/drivers/acpi/debugger/dbstats.c --- v2.4.13/linux/drivers/acpi/debugger/dbstats.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbstats.c Wed Oct 24 14:06:22 2001 @@ -368,11 +368,11 @@ if (acpi_gbl_memory_lists[i].object_size) { - size = ROUND_UP_TO_1_k (outstanding * acpi_gbl_memory_lists[i].object_size); + size = ROUND_UP_TO_1K (outstanding * acpi_gbl_memory_lists[i].object_size); } else { - size = ROUND_UP_TO_1_k (acpi_gbl_memory_lists[i].current_total_size); + size = ROUND_UP_TO_1K (acpi_gbl_memory_lists[i].current_total_size); } acpi_os_printf (" Mem: [Alloc Free Outstanding Size] % 7d % 7d % 7d % 7d Kb\n", diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbutils.c linux/drivers/acpi/debugger/dbutils.c --- v2.4.13/linux/drivers/acpi/debugger/dbutils.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbutils - AML debugger utilities - * $Revision: 43 $ + * $Revision: 45 $ * ******************************************************************************/ @@ -135,7 +135,7 @@ case ACPI_TYPE_INTEGER: - acpi_os_printf ("[Integer] = %X%8.8X\n", HIDWORD (obj_desc->integer.value), + acpi_os_printf ("[Integer] = %8.8X%8.8X\n", HIDWORD (obj_desc->integer.value), LODWORD (obj_desc->integer.value)); break; @@ -265,15 +265,37 @@ acpi_parse_object *start_op; acpi_status status = AE_OK; u32 base_aml_offset; + acpi_walk_state *walk_state; + + + FUNCTION_ENTRY (); acpi_os_printf ("Pass two parse ....\n"); + while (op) { if (op->opcode == AML_METHOD_OP) { method = (acpi_parse2_object *) op; - status = acpi_ps_parse_aml (op, method->data, method->length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return (AE_NO_MEMORY); + } + + + walk_state->parser_state.aml = + walk_state->parser_state.aml_start = method->data; + walk_state->parser_state.aml_end = + walk_state->parser_state.pkg_end = method->data + method->length; + walk_state->parser_state.start_scope = op; + + walk_state->descending_callback = acpi_ds_load1_begin_op; + walk_state->ascending_callback = acpi_ds_load1_end_op; + + + status = acpi_ps_parse_aml (walk_state); base_aml_offset = (method->value.arg)->aml_offset + 1; @@ -297,7 +319,7 @@ } if (ACPI_FAILURE (status)) { - return (status); + break; } op = acpi_ps_get_depth_next (root, op); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/debugger/dbxface.c linux/drivers/acpi/debugger/dbxface.c --- v2.4.13/linux/drivers/acpi/debugger/dbxface.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/debugger/dbxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dbxface - AML Debugger external interfaces - * $Revision: 41 $ + * $Revision: 45 $ * ******************************************************************************/ @@ -46,7 +46,7 @@ * * PARAMETERS: Walk_state - Current walk * Op - Current executing op - * Op_type - Type of the current AML Opcode + * Opcode_class - Class of the current AML Opcode * * RETURN: Status * @@ -58,7 +58,7 @@ acpi_db_single_step ( acpi_walk_state *walk_state, acpi_parse_object *op, - u8 op_type) + u32 opcode_class) { acpi_parse_object *next; acpi_status status = AE_OK; @@ -91,22 +91,11 @@ return (AE_OK); } - switch (op_type) { - case OPTYPE_UNDEFINED: - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ + switch (opcode_class) { + case AML_CLASS_UNKNOWN: + case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ return (AE_OK); break; - - case OPTYPE_NAMED_OBJECT: - switch (op->opcode) { - case AML_INT_NAMEPATH_OP: - return (AE_OK); - break; - } } /* @@ -270,7 +259,7 @@ /* Init globals */ - acpi_gbl_db_buffer = acpi_os_allocate (ACPI_DEBUG_BUFFER_SIZE); + acpi_gbl_db_buffer = acpi_os_callocate (ACPI_DEBUG_BUFFER_SIZE); /* Initial scope is the root */ @@ -301,6 +290,31 @@ } return (0); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_db_terminate + * + * PARAMETERS: None + * + * RETURN: Status + * + * DESCRIPTION: Stop debugger + * + ******************************************************************************/ + +void +acpi_db_terminate (void) +{ + + if (acpi_gbl_db_table_ptr) { + acpi_os_free (acpi_gbl_db_table_ptr); + } + if (acpi_gbl_db_buffer) { + acpi_os_free (acpi_gbl_db_buffer); + } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsfield.c linux/drivers/acpi/dispatcher/dsfield.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsfield.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsfield.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsfield - Dispatcher field routines - * $Revision: 44 $ + * $Revision: 46 $ * *****************************************************************************/ @@ -29,78 +29,178 @@ #include "acdispat.h" #include "acinterp.h" #include "acnamesp.h" +#include "acparser.h" #define _COMPONENT ACPI_DISPATCHER MODULE_NAME ("dsfield") -/* - * Field flags: Bits 00 - 03 : Access_type (Any_acc, Byte_acc, etc.) - * 04 : Lock_rule (1 == Lock) - * 05 - 06 : Update_rule - */ - -#define FIELD_ACCESS_TYPE_MASK 0x0F -#define FIELD_LOCK_RULE_MASK 0x10 -#define FIELD_UPDATE_RULE_MASK 0x60 - - /******************************************************************************* * - * FUNCTION: Acpi_ds_create_field + * FUNCTION: Acpi_ds_create_buffer_field * - * PARAMETERS: Op - Op containing the Field definition and args - * Region_node - Object for the containing Operation Region - * ` Walk_state - Current method state + * PARAMETERS: Opcode - The opcode to be executed + * Operands - List of operands for the opcode + * Walk_state - Current state * * RETURN: Status * - * DESCRIPTION: Create a new field in the specified operation region + * DESCRIPTION: Execute the Create_field operators: + * Create_bit_field_op, + * Create_byte_field_op, + * Create_word_field_op, + * Create_dWord_field_op, + * Create_qWord_field_op, + * Create_field_op (all of which define fields in buffers) * ******************************************************************************/ acpi_status -acpi_ds_create_field ( +acpi_ds_create_buffer_field ( acpi_parse_object *op, - acpi_namespace_node *region_node, acpi_walk_state *walk_state) { - acpi_status status = AE_AML_ERROR; acpi_parse_object *arg; acpi_namespace_node *node; - u8 field_flags; - u32 field_bit_position = 0; + acpi_status status; + acpi_operand_object *obj_desc; - FUNCTION_TRACE_PTR ("Ds_create_field", op); + FUNCTION_TRACE ("Ds_create_buffer_field"); - /* First arg is the name of the parent Op_region */ + /* Get the Name_string argument */ - arg = op->value.arg; - if (!region_node) { - status = acpi_ns_lookup (walk_state->scope_info, arg->value.name, - ACPI_TYPE_REGION, IMODE_EXECUTE, - NS_SEARCH_PARENT, walk_state, ®ion_node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + if (op->opcode == AML_CREATE_FIELD_OP) { + arg = acpi_ps_get_arg (op, 3); } + else { + /* Create Bit/Byte/Word/Dword field */ - /* Second arg is the field flags */ + arg = acpi_ps_get_arg (op, 2); + } - arg = arg->next; - field_flags = (u8) arg->value.integer; + if (!arg) { + return_ACPI_STATUS (AE_AML_NO_OPERAND); + } - /* Each remaining arg is a Named Field */ + /* + * Enter the Name_string into the namespace + */ + status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, + INTERNAL_TYPE_DEF_ANY, IMODE_LOAD_PASS1, + NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, + walk_state, &(node)); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* We could put the returned object (Node) on the object stack for later, but + * for now, we will put it in the "op" object that the parser uses, so we + * can get it again at the end of this scope + */ + op->node = node; + + /* + * If there is no object attached to the node, this node was just created and + * we need to create the field object. Otherwise, this was a lookup of an + * existing node and we don't want to create the field object again. + */ + if (node->object) { + return_ACPI_STATUS (AE_OK); + } + + /* + * The Field definition is not fully parsed at this time. + * (We must save the address of the AML for the buffer and index operands) + */ + + /* Create the buffer field object */ + + obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER_FIELD); + if (!obj_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* + * Allocate a method object for this field unit + */ + obj_desc->buffer_field.extra = acpi_ut_create_internal_object ( + INTERNAL_TYPE_EXTRA); + if (!obj_desc->buffer_field.extra) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* + * Remember location in AML stream of the field unit + * opcode and operands -- since the buffer and index + * operands must be evaluated. + */ + obj_desc->buffer_field.extra->extra.aml_start = ((acpi_parse2_object *) op)->data; + obj_desc->buffer_field.extra->extra.aml_length = ((acpi_parse2_object *) op)->length; + obj_desc->buffer_field.node = node; + + /* Attach constructed field descriptor to parent node */ + + status = acpi_ns_attach_object (node, obj_desc, ACPI_TYPE_BUFFER_FIELD); + + +cleanup: + + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ds_get_field_names + * + * PARAMETERS: Info - Create_field info structure + * ` Walk_state - Current method state + * Arg - First parser arg for the field name list + * + * RETURN: Status + * + * DESCRIPTION: Process all named fields in a field declaration. Names are + * entered into the namespace. + * + ******************************************************************************/ + +acpi_status +acpi_ds_get_field_names ( + ACPI_CREATE_FIELD_INFO *info, + acpi_walk_state *walk_state, + acpi_parse_object *arg) +{ + acpi_status status; + + + FUNCTION_TRACE_U32 ("Ds_get_field_names", info); + + + /* First field starts at bit zero */ + + info->field_bit_position = 0; + + /* Process all elements in the field list (of parse nodes) */ - arg = arg->next; while (arg) { + /* + * Three types of field elements are handled: + * 1) Offset - specifies a bit offset + * 2) Access_as - changes the access mode + * 3) Name - Enters a new named field into the namespace + */ switch (arg->opcode) { case AML_INT_RESERVEDFIELD_OP: - field_bit_position += arg->value.size; + info->field_bit_position += arg->value.size; break; @@ -110,48 +210,57 @@ * Get a new Access_type and Access_attribute for all * entries (until end or another Access_as keyword) */ - field_flags = (u8) ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); + info->field_flags = (u8) ((info->field_flags & FIELD_ACCESS_TYPE_MASK) || + ((u8) (arg->value.integer >> 8))); break; case AML_INT_NAMEDFIELD_OP: + /* Enter a new field name into the namespace */ + status = acpi_ns_lookup (walk_state->scope_info, (NATIVE_CHAR *) &((acpi_parse2_object *)arg)->name, - INTERNAL_TYPE_REGION_FIELD, IMODE_LOAD_PASS1, + info->field_type, IMODE_LOAD_PASS1, NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); + NULL, &info->field_node); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* - * Initialize an object for the new Node that is on - * the object stack - */ - status = acpi_ex_prep_region_field_value (node, region_node, field_flags, - field_bit_position, arg->value.size); + /* Create and initialize an object for the new Field Node */ + + info->field_bit_length = arg->value.size; + + status = acpi_ex_prep_field_value (info); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* Keep track of bit position for *next* field */ + /* Keep track of bit position for the next field */ + + info->field_bit_position += info->field_bit_length; + break; + + + default: - field_bit_position += arg->value.size; + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid opcode in field list: %X\n", + arg->opcode)); + return_ACPI_STATUS (AE_AML_ERROR); break; } arg = arg->next; } - return_ACPI_STATUS (status); + return_ACPI_STATUS (AE_OK); } /******************************************************************************* * - * FUNCTION: Acpi_ds_create_bank_field + * FUNCTION: Acpi_ds_create_field * * PARAMETERS: Op - Op containing the Field definition and args * Region_node - Object for the containing Operation Region @@ -159,29 +268,25 @@ * * RETURN: Status * - * DESCRIPTION: Create a new bank field in the specified operation region + * DESCRIPTION: Create a new field in the specified operation region * ******************************************************************************/ acpi_status -acpi_ds_create_bank_field ( +acpi_ds_create_field ( acpi_parse_object *op, acpi_namespace_node *region_node, acpi_walk_state *walk_state) { acpi_status status = AE_AML_ERROR; acpi_parse_object *arg; - acpi_namespace_node *register_node; - acpi_namespace_node *node; - u32 bank_value; - u8 field_flags; - u32 field_bit_position = 0; + ACPI_CREATE_FIELD_INFO info; - FUNCTION_TRACE_PTR ("Ds_create_bank_field", op); + FUNCTION_TRACE_PTR ("Ds_create_field", op); - /* First arg is the name of the parent Op_region */ + /* First arg is the name of the parent Op_region (must already exist) */ arg = op->value.arg; if (!region_node) { @@ -193,82 +298,88 @@ } } - /* Second arg is the Bank Register */ + /* Second arg is the field flags */ arg = arg->next; + info.field_flags = arg->value.integer8; - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_BANK_FIELD_DEFN, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, ®ister_node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + /* Each remaining arg is a Named Field */ - /* Third arg is the Bank_value */ + info.field_type = INTERNAL_TYPE_REGION_FIELD; + info.region_node = region_node; - arg = arg->next; - bank_value = arg->value.integer32; + status = acpi_ds_get_field_names (&info, walk_state, arg->next); + return_ACPI_STATUS (status); +} - /* Next arg is the field flags */ - arg = arg->next; - field_flags = arg->value.integer8; +/******************************************************************************* + * + * FUNCTION: Acpi_ds_create_bank_field + * + * PARAMETERS: Op - Op containing the Field definition and args + * Region_node - Object for the containing Operation Region + * ` Walk_state - Current method state + * + * RETURN: Status + * + * DESCRIPTION: Create a new bank field in the specified operation region + * + ******************************************************************************/ - /* Each remaining arg is a Named Field */ +acpi_status +acpi_ds_create_bank_field ( + acpi_parse_object *op, + acpi_namespace_node *region_node, + acpi_walk_state *walk_state) +{ + acpi_status status = AE_AML_ERROR; + acpi_parse_object *arg; + ACPI_CREATE_FIELD_INFO info; - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_INT_RESERVEDFIELD_OP: - field_bit_position += arg->value.size; - break; + FUNCTION_TRACE_PTR ("Ds_create_bank_field", op); - case AML_INT_ACCESSFIELD_OP: + /* First arg is the name of the parent Op_region (must already exist) */ - /* - * Get a new Access_type and Access_attribute for - * all entries (until end or another Access_as keyword) - */ - field_flags = (u8) ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; + arg = op->value.arg; + if (!region_node) { + status = acpi_ns_lookup (walk_state->scope_info, arg->value.name, + ACPI_TYPE_REGION, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, ®ion_node); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + /* Second arg is the Bank Register (must already exist) */ - case AML_INT_NAMEDFIELD_OP: + arg = arg->next; + status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, + INTERNAL_TYPE_BANK_FIELD_DEFN, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, &info.register_node); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((acpi_parse2_object *)arg)->name, - INTERNAL_TYPE_REGION_FIELD, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + /* Third arg is the Bank_value */ - /* - * Initialize an object for the new Node that is on - * the object stack - */ - status = acpi_ex_prep_bank_field_value (node, region_node, register_node, - bank_value, field_flags, field_bit_position, - arg->value.size); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } + arg = arg->next; + info.bank_value = arg->value.integer32; - /* Keep track of bit position for the *next* field */ + /* Fourth arg is the field flags */ - field_bit_position += arg->value.size; - break; + arg = arg->next; + info.field_flags = arg->value.integer8; - } + /* Each remaining arg is a Named Field */ - arg = arg->next; - } + info.field_type = INTERNAL_TYPE_BANK_FIELD; + info.region_node = region_node; + + status = acpi_ds_get_field_names (&info, walk_state, arg->next); return_ACPI_STATUS (status); } @@ -296,107 +407,44 @@ { acpi_status status; acpi_parse_object *arg; - acpi_namespace_node *node; - acpi_namespace_node *index_register_node; - acpi_namespace_node *data_register_node; - u8 field_flags; - u32 field_bit_position = 0; + ACPI_CREATE_FIELD_INFO info; FUNCTION_TRACE_PTR ("Ds_create_index_field", op); - arg = op->value.arg; - - /* First arg is the name of the Index register */ + /* First arg is the name of the Index register (must already exist) */ + arg = op->value.arg; status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - ACPI_TYPE_ANY, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &index_register_node); + ACPI_TYPE_ANY, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, &info.register_node); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* Second arg is the data register */ + /* Second arg is the data register (must already exist) */ arg = arg->next; - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_INDEX_FIELD_DEFN, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &data_register_node); + INTERNAL_TYPE_INDEX_FIELD_DEFN, IMODE_EXECUTE, + NS_SEARCH_PARENT, walk_state, &info.data_register_node); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } - /* Next arg is the field flags */ arg = arg->next; - field_flags = (u8) arg->value.integer; + info.field_flags = arg->value.integer8; /* Each remaining arg is a Named Field */ - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_INT_RESERVEDFIELD_OP: - - field_bit_position += arg->value.size; - break; - - - case AML_INT_ACCESSFIELD_OP: - - /* - * Get a new Access_type and Access_attribute for all - * entries (until end or another Access_as keyword) - */ - field_flags = (u8) ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; - + info.field_type = INTERNAL_TYPE_INDEX_FIELD; + info.region_node = region_node; - case AML_INT_NAMEDFIELD_OP: - - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((acpi_parse2_object *)arg)->name, - INTERNAL_TYPE_INDEX_FIELD, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* - * Initialize an object for the new Node that is on - * the object stack - */ - status = acpi_ex_prep_index_field_value (node, index_register_node, - data_register_node, field_flags, - field_bit_position, arg->value.size); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Keep track of bit position for the *next* field */ - - field_bit_position += arg->value.size; - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid opcode in field list: %X\n", - arg->opcode)); - status = AE_AML_ERROR; - break; - } - - arg = arg->next; - } + status = acpi_ds_get_field_names (&info, walk_state, arg->next); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsmethod.c linux/drivers/acpi/dispatcher/dsmethod.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsmethod.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsmethod.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsmethod - Parser/Interpreter interface - control method parsing - * $Revision: 65 $ + * $Revision: 69 $ * *****************************************************************************/ @@ -65,6 +65,7 @@ acpi_parse_object *op; acpi_namespace_node *node; acpi_owner_id owner_id; + acpi_walk_state *walk_state; FUNCTION_TRACE_PTR ("Ds_parse_method", obj_handle); @@ -77,7 +78,7 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Parsing [%4.4s] **** Named_obj=%p\n", - &((acpi_namespace_node *)obj_handle)->name, obj_handle)); + (char*)&((acpi_namespace_node *)obj_handle)->name, obj_handle)); /* Extract the method object from the method Node */ @@ -88,7 +89,7 @@ return_ACPI_STATUS (AE_NULL_OBJECT); } - /* Create a mutex for the method if there is a concurrency limit */ + /* Create a mutex for the method if there is a concurrency limit */ if ((obj_desc->method.concurrency != INFINITE_CONCURRENCY) && (!obj_desc->method.semaphore)) { @@ -114,6 +115,20 @@ acpi_ps_set_name (op, node->name); op->node = node; + /* Create and initialize a new walk state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, node, obj_desc->method.aml_start, + obj_desc->method.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } /* * Parse the method, first pass @@ -125,12 +140,7 @@ * method so that operands to the named objects can * take on dynamic run-time values. */ - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - node, NULL, NULL, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - + status = acpi_ps_parse_aml (walk_state); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -141,10 +151,7 @@ obj_desc->method.owning_id = owner_id; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** [%4.4s] Parsed **** Named_obj=%p Op=%p\n", - &((acpi_namespace_node *)obj_handle)->name, obj_handle, op)); - - /* Install the parsed tree in the method object */ - /* TBD: [Restructure] Obsolete field? */ + (char*)&((acpi_namespace_node *)obj_handle)->name, obj_handle, op)); acpi_ps_delete_parse_tree (op); @@ -242,13 +249,12 @@ acpi_ds_call_control_method ( acpi_walk_list *walk_list, acpi_walk_state *this_walk_state, - acpi_parse_object *op) + acpi_parse_object *op) /* TBD: This operand is obsolete */ { acpi_status status; acpi_namespace_node *method_node; acpi_operand_object *obj_desc; acpi_walk_state *next_walk_state; - acpi_parse_state *parser_state; u32 i; @@ -270,7 +276,6 @@ return_ACPI_STATUS (AE_NULL_OBJECT); } - /* Init for new method, wait on concurrency semaphore */ status = acpi_ds_begin_method_execution (method_node, obj_desc, @@ -279,78 +284,62 @@ return_ACPI_STATUS (status); } - /* Create and initialize a new parser state */ - - parser_state = acpi_ps_create_state (obj_desc->method.pcode, - obj_desc->method.pcode_length); - if (!parser_state) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - acpi_ps_init_scope (parser_state, NULL); - parser_state->start_node = method_node; - - /* Create a new state for the preempting walk */ + /* 1) Parse: Create a new walk state for the preempting walk */ next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id, - NULL, obj_desc, walk_list); + op, obj_desc, NULL); if (!next_walk_state) { - /* TBD: delete parser state */ - return_ACPI_STATUS (AE_NO_MEMORY); + goto cleanup; } - next_walk_state->walk_type = WALK_METHOD; - next_walk_state->method_node = method_node; - next_walk_state->parser_state = parser_state; - next_walk_state->parse_flags = this_walk_state->parse_flags; - next_walk_state->descending_callback = this_walk_state->descending_callback; - next_walk_state->ascending_callback = this_walk_state->ascending_callback; - - /* The Next_op of the Next_walk will be the beginning of the method */ - /* TBD: [Restructure] -- obsolete? */ - - next_walk_state->next_op = NULL; + /* Create and init a Root Node */ - /* Open a new scope */ + op = acpi_ps_alloc_op (AML_SCOPE_OP); + if (!op) { + status = AE_NO_MEMORY; + goto cleanup; + } - status = acpi_ds_scope_stack_push (method_node, - ACPI_TYPE_METHOD, next_walk_state); + status = acpi_ds_init_aml_walk (next_walk_state, op, method_node, + obj_desc->method.aml_start, obj_desc->method.aml_length, + NULL, NULL, 1); if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ goto cleanup; } + /* Begin AML parse */ + + status = acpi_ps_parse_aml (next_walk_state); + acpi_ps_delete_parse_tree (op); + + + /* 2) Execute: Create a new state for the preempting walk */ + + next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id, + NULL, obj_desc, walk_list); + if (!next_walk_state) { + status = AE_NO_MEMORY; + goto cleanup; + } /* - * Initialize the arguments for the method. The resolved - * arguments were put on the previous walk state's operand + * The resolved arguments were put on the previous walk state's operand * stack. Operands on the previous walk state stack always * start at index 0. + * Null terminate the list of arguments */ - status = acpi_ds_method_data_init_args (&this_walk_state->operands[0], - this_walk_state->num_operands, - next_walk_state); + this_walk_state->operands [this_walk_state->num_operands] = NULL; + + status = acpi_ds_init_aml_walk (next_walk_state, NULL, method_node, + obj_desc->method.aml_start, obj_desc->method.aml_length, + &this_walk_state->operands[0], NULL, 3); if (ACPI_FAILURE (status)) { goto cleanup; } - - /* Create and init a Root Node */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - method_node, NULL, NULL, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - acpi_ps_delete_parse_tree (op); - - /* * Delete the operands on the previous walkstate operand stack * (they were copied to new objects) @@ -363,7 +352,6 @@ /* Clear the operand stack */ this_walk_state->num_operands = 0; - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Starting nested execution, newstate=%p\n", next_walk_state)); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsobject.c linux/drivers/acpi/dispatcher/dsobject.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsobject.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsobject.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dsobject - Dispatcher object management routines - * $Revision: 75 $ + * $Revision: 81 $ * *****************************************************************************/ @@ -64,7 +64,7 @@ { acpi_object_type8 type; acpi_status status; - ACPI_INIT_WALK_INFO *info = (ACPI_INIT_WALK_INFO *) context; + acpi_init_walk_info *info = (acpi_init_walk_info *) context; u8 table_revision; @@ -118,15 +118,14 @@ * Always parse methods to detect errors, we may delete * the parse tree below */ - status = acpi_ds_parse_method (obj_handle); - - /* TBD: [Errors] what do we do with an error? */ - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] parse failed! %s\n", - obj_handle, &((acpi_namespace_node *)obj_handle)->name, + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Method %p [%4.4s] - parse failure, %s\n", + obj_handle, (char*)&((acpi_namespace_node *)obj_handle)->name, acpi_format_exception (status))); + + /* This parse failed, but we will continue parsing more methods */ + break; } @@ -168,7 +167,7 @@ acpi_namespace_node *start_node) { acpi_status status; - ACPI_INIT_WALK_INFO info; + acpi_init_walk_info info; FUNCTION_TRACE ("Ds_initialize_objects"); @@ -241,7 +240,7 @@ obj_desc = *ret_obj_desc; op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Unknown opcode */ return (AE_TYPE); @@ -308,7 +307,7 @@ byte_list = (acpi_parse2_object *) arg->next; if (byte_list) { if (byte_list->opcode != AML_INT_BYTELIST_OP) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Expecting bytelist, got: %x\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Expecting bytelist, got: %p\n", byte_list)); return (AE_TYPE); } @@ -356,8 +355,8 @@ case INTERNAL_TYPE_REFERENCE: - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_LOCAL_VARIABLE: + switch (op_info->type) { + case AML_TYPE_LOCAL_VARIABLE: /* Split the opcode into a base opcode + offset */ @@ -366,7 +365,7 @@ break; - case OPTYPE_METHOD_ARGUMENT: + case AML_TYPE_METHOD_ARGUMENT: /* Split the opcode into a base opcode + offset */ @@ -655,6 +654,15 @@ FUNCTION_TRACE_PTR ("Ds_create_node", op); + /* + * Because of the execution pass through the non-control-method + * parts of the table, we can arrive here twice. Only init + * the named object node the first time through + */ + if (node->object) { + return_ACPI_STATUS (AE_OK); + } + if (!op->value.arg) { /* No arguments, there is nothing to do */ @@ -675,14 +683,8 @@ /* Init obj */ status = acpi_ns_attach_object (node, obj_desc, (u8) node->type); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - return_ACPI_STATUS (status); - -cleanup: + /* Remove local reference to the object */ acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsopcode.c linux/drivers/acpi/dispatcher/dsopcode.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsopcode.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsopcode.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: dsopcode - Dispatcher Op Region support and handling of * "control" opcodes - * $Revision: 52 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -61,6 +61,7 @@ acpi_parse_object *field_op; acpi_status status; acpi_table_desc *table_desc; + acpi_walk_state *walk_state; FUNCTION_TRACE_PTR ("Ds_get_buffer_field_arguments", obj_desc); @@ -78,7 +79,7 @@ DEBUG_EXEC(acpi_ut_display_init_pathname (node, " [Field]")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] Buffer_field JIT Init\n", - &node->name)); + (char*)&node->name)); /* @@ -101,17 +102,34 @@ return_ACPI_STATUS (status); } + /* Create and initialize a new parser state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + /* TBD: No Walk flags?? */ + + walk_state->parse_flags = 0; + /* Pass1: Parse the entire Buffer_field declaration */ - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + status = acpi_ps_parse_aml (walk_state); if (ACPI_FAILURE (status)) { acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); } - /* Get and init the actual Fiel_unit_op created above */ + /* Get and init the actual Field_unit Op created above */ field_op = op->value.arg; op->node = node; @@ -121,7 +139,7 @@ field_op->node = node; acpi_ps_delete_parse_tree (op); - /* Acpi_evaluate the address and length arguments for the Op_region */ + /* Evaluate the address and length arguments for the Op_region */ op = acpi_ps_alloc_op (AML_SCOPE_OP); if (!op) { @@ -130,15 +148,23 @@ op->node = acpi_ns_get_parent_object (node); - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - NULL /*Method_desc*/, NULL, NULL, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); - /* All done with the parse tree, delete it */ + /* Create and initialize a new parser state */ - acpi_ps_delete_parse_tree (op); + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 3); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + status = acpi_ps_parse_aml (walk_state); + acpi_ps_delete_parse_tree (op); /* * The pseudo-method object is no longer needed since the region is @@ -174,6 +200,7 @@ acpi_parse_object *region_op; acpi_status status; acpi_table_desc *table_desc; + acpi_walk_state *walk_state; FUNCTION_TRACE_PTR ("Ds_get_region_arguments", obj_desc); @@ -191,9 +218,8 @@ DEBUG_EXEC(acpi_ut_display_init_pathname (node, " [Operation Region]")); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] Op_region Init at AML %p[%x]\n", - &node->name, extra_desc->extra.pcode, - *(u32*) extra_desc->extra.pcode)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] Op_region Init at AML %p\n", + (char*)&node->name, extra_desc->extra.aml_start)); /* * Allocate a new parser op to be the root of the parsed @@ -215,11 +241,28 @@ return_ACPI_STATUS (status); } + /* Create and initialize a new parser state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + op, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + /* TBD: No Walk flags?? */ + + walk_state->parse_flags = 0; + /* Parse the entire Op_region declaration, creating a parse tree */ - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + status = acpi_ps_parse_aml (walk_state); if (ACPI_FAILURE (status)) { acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); @@ -244,14 +287,22 @@ op->node = acpi_ns_get_parent_object (node); - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - NULL /*Method_desc*/, NULL, NULL, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); + /* Create and initialize a new parser state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + op, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } - /* All done with the parse tree, delete it */ + status = acpi_ds_init_aml_walk (walk_state, op, NULL, extra_desc->extra.aml_start, + extra_desc->extra.aml_length, NULL, NULL, 3); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); @@ -668,7 +719,7 @@ acpi_ut_remove_reference (operand_desc); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Rgn_obj %p Addr %8.8lX%8.8lX Len %X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Rgn_obj %p Addr %8.8X%8.8X Len %X\n", obj_desc, HIDWORD(obj_desc->region.address), LODWORD(obj_desc->region.address), obj_desc->region.length)); @@ -731,7 +782,7 @@ * of a loop */ walk_state->control_state->control.aml_predicate_start = - walk_state->parser_state->aml - 1; + walk_state->parser_state.aml - 1; /* TBD: can this be removed? */ /*Acpi_ps_pkg_length_encoding_size (GET8 (Walk_state->Parser_state->Aml));*/ break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dsutils.c linux/drivers/acpi/dispatcher/dsutils.c --- v2.4.13/linux/drivers/acpi/dispatcher/dsutils.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dsutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: dsutils - Dispatcher utilities - * $Revision: 72 $ + * $Revision: 80 $ * ******************************************************************************/ @@ -85,8 +85,8 @@ */ parent_info = acpi_ps_get_opcode_info (op->parent->opcode); - if (ACPI_GET_OP_TYPE (parent_info) != ACPI_OP_TYPE_OPCODE) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%X\n", op)); + if (parent_info->class == AML_CLASS_UNKNOWN) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%p\n", op)); return_VALUE (FALSE); } @@ -97,11 +97,11 @@ * Otherwise leave it as is, it will be deleted when it is used * as an operand later. */ - switch (ACPI_GET_OP_CLASS (parent_info)) { + switch (parent_info->class) { /* * In these cases, the parent will never use the return object */ - case OPTYPE_CONTROL: /* IF, ELSE, WHILE only */ + case AML_CLASS_CONTROL: /* IF, ELSE, WHILE only */ switch (op->parent->opcode) { case AML_RETURN_OP: @@ -109,7 +109,7 @@ /* Never delete the return value associated with a return opcode */ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used, [RETURN] opcode=%X Op=%X\n", op->opcode, op)); + "Result used, [RETURN] opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (TRUE); break; @@ -123,7 +123,7 @@ if ((walk_state->control_state->common.state == CONTROL_PREDICATE_EXECUTING) && (walk_state->control_state->control.predicate_op == op)) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used as a predicate, [IF/WHILE] opcode=%X Op=%X\n", + "Result used as a predicate, [IF/WHILE] opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (TRUE); } @@ -135,7 +135,8 @@ /* Fall through to not used case below */ - case OPTYPE_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_CREATE: /* * These opcodes allow Term_arg(s) as operands and therefore @@ -149,13 +150,13 @@ (op->parent->opcode == AML_CREATE_DWORD_FIELD_OP) || (op->parent->opcode == AML_CREATE_QWORD_FIELD_OP)) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result used, [Region or Create_field] opcode=%X Op=%X\n", + "Result used, [Region or Create_field] opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (TRUE); } ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Result not used, Parent opcode=%X Op=%X\n", op->opcode, op)); + "Result not used, Parent opcode=%X Op=%p\n", op->opcode, op)); return_VALUE (FALSE); break; @@ -338,6 +339,11 @@ * very serious error at this point */ status = AE_AML_NAME_NOT_FOUND; + + /* TBD: Externalize Name_string and print */ + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Object name was not found in namespace\n")); } } @@ -580,16 +586,21 @@ op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Unknown opcode */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown AML opcode: %x\n", opcode)); return (data_type); } - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_LITERAL: +/* + * TBD: Use op class + */ + + switch (op_info->type) { + + case AML_TYPE_LITERAL: switch (opcode) { case AML_BYTE_OP: @@ -618,7 +629,7 @@ break; - case OPTYPE_DATA_TERM: + case AML_TYPE_DATA_TERM: switch (opcode) { case AML_BUFFER_OP: @@ -640,44 +651,49 @@ break; - case OPTYPE_CONSTANT: - case OPTYPE_METHOD_ARGUMENT: - case OPTYPE_LOCAL_VARIABLE: + case AML_TYPE_CONSTANT: + case AML_TYPE_METHOD_ARGUMENT: + case AML_TYPE_LOCAL_VARIABLE: data_type = INTERNAL_TYPE_REFERENCE; break; - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_TRIADIC: - case OPTYPE_QUADRADIC: - case OPTYPE_HEXADIC: - case OPTYPE_RETURN: + case AML_TYPE_EXEC_1A_0T_1R: + case AML_TYPE_EXEC_1A_1T_1R: + case AML_TYPE_EXEC_2A_0T_1R: + case AML_TYPE_EXEC_2A_1T_1R: + case AML_TYPE_EXEC_2A_2T_1R: + case AML_TYPE_EXEC_3A_1T_1R: + case AML_TYPE_EXEC_6A_0T_1R: + case AML_TYPE_RETURN: flags = OP_HAS_RETURN_VALUE; data_type = ACPI_TYPE_ANY; break; - case OPTYPE_METHOD_CALL: + case AML_TYPE_METHOD_CALL: flags = OP_HAS_RETURN_VALUE; data_type = ACPI_TYPE_METHOD; break; - case OPTYPE_NAMED_OBJECT: + case AML_TYPE_NAMED_FIELD: + case AML_TYPE_NAMED_SIMPLE: + case AML_TYPE_NAMED_COMPLEX: + case AML_TYPE_NAMED_NO_OBJ: data_type = acpi_ds_map_named_opcode_to_data_type (opcode); break; - case OPTYPE_DYADIC1: - case OPTYPE_CONTROL: + case AML_TYPE_EXEC_1A_0T_0R: + case AML_TYPE_EXEC_2A_0T_0R: + case AML_TYPE_EXEC_3A_0T_0R: + case AML_TYPE_EXEC_1A_1T_0R: + case AML_TYPE_CONTROL: /* No mapping needed at this time */ @@ -784,6 +800,7 @@ data_type = ACPI_TYPE_EVENT; break; + case AML_DATA_REGION_OP: case AML_REGION_OP: data_type = ACPI_TYPE_REGION; break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswexec.c linux/drivers/acpi/dispatcher/dswexec.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswexec.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswexec.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: dswexec - Dispatcher method execution callbacks; * dispatch to interpreter. - * $Revision: 70 $ + * $Revision: 79 $ * *****************************************************************************/ @@ -37,6 +37,21 @@ #define _COMPONENT ACPI_DISPATCHER MODULE_NAME ("dswexec") +/* + * Dispatch tables for opcode classes + */ +ACPI_EXECUTE_OP acpi_gbl_op_type_dispatch [] = { + acpi_ex_opcode_1A_0T_0R, + acpi_ex_opcode_1A_0T_1R, + acpi_ex_opcode_1A_1T_0R, + acpi_ex_opcode_1A_1T_1R, + acpi_ex_opcode_2A_0T_0R, + acpi_ex_opcode_2A_0T_1R, + acpi_ex_opcode_2A_1T_1R, + acpi_ex_opcode_2A_2T_1R, + acpi_ex_opcode_3A_0T_0R, + acpi_ex_opcode_3A_1T_1R, + acpi_ex_opcode_6A_0T_1R}; /***************************************************************************** * @@ -53,9 +68,7 @@ acpi_status acpi_ds_get_predicate_value ( acpi_walk_state *walk_state, - acpi_parse_object *op, - u32 has_result_obj) -{ + u32 has_result_obj) { acpi_status status = AE_OK; acpi_operand_object *obj_desc; @@ -77,7 +90,7 @@ } else { - status = acpi_ds_create_operand (walk_state, op, 0); + status = acpi_ds_create_operand (walk_state, walk_state->op, 0); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -91,7 +104,7 @@ } if (!obj_desc) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No predicate Obj_desc=%X State=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No predicate Obj_desc=%p State=%p\n", obj_desc, walk_state)); return_ACPI_STATUS (AE_AML_NO_OPERAND); @@ -104,7 +117,7 @@ */ if (obj_desc->common.type != ACPI_TYPE_INTEGER) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Bad predicate (not a number) Obj_desc=%X State=%X Type=%X\n", + "Bad predicate (not a number) Obj_desc=%p State=%p Type=%X\n", obj_desc, walk_state, obj_desc->common.type)); status = AE_AML_OPERAND_TYPE; @@ -136,8 +149,8 @@ cleanup: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%X\n", - walk_state->control_state->common.value, op)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%pn", + walk_state->control_state->common.value, walk_state->op)); /* Break to debugger to display result */ @@ -159,8 +172,7 @@ * FUNCTION: Acpi_ds_exec_begin_op * * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been reached in the - * walk; Arguments have not been evaluated yet. + * Out_op - Return op if a new one is created * * RETURN: Status * @@ -172,26 +184,28 @@ acpi_status acpi_ds_exec_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { - const acpi_opcode_info *op_info; + acpi_parse_object *op; acpi_status status = AE_OK; - u8 opcode_class; + u32 opcode_class; - FUNCTION_TRACE_PTR ("Ds_exec_begin_op", op); + FUNCTION_TRACE_PTR ("Ds_exec_begin_op", walk_state); + op = walk_state->op; if (!op) { - status = acpi_ds_load2_begin_op (opcode, NULL, walk_state, out_op); + status = acpi_ds_load2_begin_op (walk_state, out_op); if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } op = *out_op; + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; } if (op == walk_state->origin) { @@ -210,7 +224,7 @@ if ((walk_state->control_state) && (walk_state->control_state->common.state == CONTROL_CONDITIONAL_EXECUTING)) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%X State=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%p State=%p\n", op, walk_state)); walk_state->control_state->common.state = CONTROL_PREDICATE_EXECUTING; @@ -221,20 +235,19 @@ } - op_info = acpi_ps_get_opcode_info (op->opcode); - opcode_class = (u8) ACPI_GET_OP_CLASS (op_info); + opcode_class = walk_state->op_info->class; /* We want to send namepaths to the load code */ if (op->opcode == AML_INT_NAMEPATH_OP) { - opcode_class = OPTYPE_NAMED_OBJECT; + opcode_class = AML_CLASS_NAMED_OBJECT; } /* * Handle the opcode based upon the opcode type */ switch (opcode_class) { - case OPTYPE_CONTROL: + case AML_CLASS_CONTROL: status = acpi_ds_result_stack_push (walk_state); if (ACPI_FAILURE (status)) { @@ -245,7 +258,7 @@ break; - case OPTYPE_NAMED_OBJECT: + case AML_CLASS_NAMED_OBJECT: if (walk_state->walk_type == WALK_METHOD) { /* @@ -255,7 +268,7 @@ * will be deleted upon completion of the execution * of this method. */ - status = acpi_ds_load2_begin_op (op->opcode, op, walk_state, NULL); + status = acpi_ds_load2_begin_op (walk_state, NULL); } @@ -268,18 +281,8 @@ /* most operators with arguments */ - case OPTYPE_MONADIC1: - case OPTYPE_DYADIC1: - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_RECONFIGURATION: - case OPTYPE_TRIADIC: - case OPTYPE_QUADRADIC: - case OPTYPE_HEXADIC: - case OPTYPE_CREATE_FIELD: + case AML_CLASS_EXECUTE: + case AML_CLASS_CREATE: /* Start a new result/operand state */ @@ -315,85 +318,53 @@ acpi_status acpi_ds_exec_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { + acpi_parse_object *op; acpi_status status = AE_OK; - u16 opcode; - u8 optype; + u32 op_type; + u32 op_class; acpi_parse_object *next_op; acpi_parse_object *first_arg; - acpi_operand_object *result_obj = NULL; - const acpi_opcode_info *op_info; u32 i; - FUNCTION_TRACE_PTR ("Ds_exec_end_op", op); - + FUNCTION_TRACE_PTR ("Ds_exec_end_op", walk_state); - opcode = (u16) op->opcode; + op = walk_state->op; + op_type = walk_state->op_info->type; + op_class = walk_state->op_info->class; - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_class == AML_CLASS_UNKNOWN) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode %X\n", op->opcode)); return_ACPI_STATUS (AE_NOT_IMPLEMENTED); } - optype = (u8) ACPI_GET_OP_CLASS (op_info); first_arg = op->value.arg; /* Init the walk state */ walk_state->num_operands = 0; walk_state->return_desc = NULL; - walk_state->op_info = op_info; - walk_state->opcode = opcode; + walk_state->result_obj = NULL; /* Call debugger for single step support (DEBUG build only) */ - DEBUGGER_EXEC (status = acpi_db_single_step (walk_state, op, optype)); + DEBUGGER_EXEC (status = acpi_db_single_step (walk_state, op, op_class)); DEBUGGER_EXEC (if (ACPI_FAILURE (status)) {return_ACPI_STATUS (status);}); - /* Decode the opcode */ - - switch (optype) { - case OPTYPE_UNDEFINED: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Undefined opcode type Op=%X\n", op)); - return_ACPI_STATUS (AE_NOT_IMPLEMENTED); - break; - - - case OPTYPE_BOGUS: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Internal opcode=%X type Op=%X\n", - opcode, op)); - break; + switch (op_class) { + /* Decode the Opcode Class */ - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ + case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */ break; - /* most operators with arguments */ - case OPTYPE_MONADIC1: - case OPTYPE_DYADIC1: - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_RECONFIGURATION: - case OPTYPE_TRIADIC: - case OPTYPE_QUADRADIC: - case OPTYPE_HEXADIC: - + case AML_CLASS_EXECUTE: /* Build resolved operand stack */ @@ -411,14 +382,14 @@ /* Resolve all operands */ - status = acpi_ex_resolve_operands (opcode, + status = acpi_ex_resolve_operands (walk_state->opcode, &(walk_state->operands [walk_state->num_operands -1]), walk_state); if (ACPI_FAILURE (status)) { /* TBD: must pop and delete operands */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "[%s]: Could not resolve operands, %s\n", - acpi_ps_get_opcode_name (opcode), acpi_format_exception (status))); + acpi_ps_get_opcode_name (walk_state->opcode), acpi_format_exception (status))); /* * On error, we must delete all the operands and clear the @@ -430,103 +401,31 @@ } walk_state->num_operands = 0; - goto cleanup; } - DUMP_OPERANDS (WALK_OPERANDS, IMODE_EXECUTE, acpi_ps_get_opcode_name (opcode), + DUMP_OPERANDS (WALK_OPERANDS, IMODE_EXECUTE, acpi_ps_get_opcode_name (walk_state->opcode), walk_state->num_operands, "after Ex_resolve_operands"); - switch (optype) { - case OPTYPE_MONADIC1: - - /* 1 Operand, 0 External_result, 0 Internal_result */ - - status = acpi_ex_monadic1 (opcode, walk_state); - break; - - - case OPTYPE_MONADIC2: - - /* 1 Operand, 0 External_result, 1 Internal_result */ - - status = acpi_ex_monadic2 (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_MONADIC2_r: - - /* 1 Operand, 1 External_result, 1 Internal_result */ - - status = acpi_ex_monadic2_r (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC1: - - /* 2 Operands, 0 External_result, 0 Internal_result */ - - status = acpi_ex_dyadic1 (opcode, walk_state); - break; - - - case OPTYPE_DYADIC2: - - /* 2 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_ex_dyadic2 (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC2_r: - - /* 2 Operands, 1 or 2 External_results, 1 Internal_result */ - - status = acpi_ex_dyadic2_r (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC2_s: /* Synchronization Operator */ - - /* 2 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_ex_dyadic2_s (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_TRIADIC: /* Opcode with 3 operands */ - - /* 3 Operands, 1 External_result, 1 Internal_result */ - - status = acpi_ex_triadic (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_QUADRADIC: /* Opcode with 4 operands */ - break; - - - case OPTYPE_HEXADIC: /* Opcode with 6 operands */ - - /* 6 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_ex_hexadic (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_RECONFIGURATION: - - /* 1 or 2 operands, 0 Internal Result */ + /* + * Dispatch the request to the appropriate interpreter handler + * routine. There is one routine per opcode "type" based upon the + * number of opcode arguments and return type. + */ + status = acpi_gbl_op_type_dispatch [op_type] (walk_state); - status = acpi_ex_reconfiguration (opcode, walk_state); - break; - } - /* Clear the operand stack */ + /* Delete argument objects and clear the operand stack */ for (i = 0; i < walk_state->num_operands; i++) { + /* + * Remove a reference to all operands, including both + * "Arguments" and "Targets". + */ + acpi_ut_remove_reference (walk_state->operands[i]); walk_state->operands[i] = NULL; } + walk_state->num_operands = 0; /* @@ -534,144 +433,140 @@ * current result stack */ if (ACPI_SUCCESS (status) && - result_obj) { - status = acpi_ds_result_push (result_obj, walk_state); + walk_state->result_obj) { + status = acpi_ds_result_push (walk_state->result_obj, walk_state); } break; - case OPTYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ + default: - /* 1 Operand, 0 External_result, 0 Internal_result */ + switch (op_type) { + case AML_TYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ - status = acpi_ds_exec_end_control_op (walk_state, op); + /* 1 Operand, 0 External_result, 0 Internal_result */ - acpi_ds_result_stack_pop (walk_state); - break; + status = acpi_ds_exec_end_control_op (walk_state, op); + acpi_ds_result_stack_pop (walk_state); + break; - case OPTYPE_METHOD_CALL: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%X\n", op)); + case AML_TYPE_METHOD_CALL: - /* - * (AML_METHODCALL) Op->Value->Arg->Node contains - * the method Node pointer - */ - /* Next_op points to the op that holds the method name */ + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%p\n", op)); - next_op = first_arg; + /* + * (AML_METHODCALL) Op->Value->Arg->Node contains + * the method Node pointer + */ + /* Next_op points to the op that holds the method name */ - /* Next_op points to first argument op */ + next_op = first_arg; - next_op = next_op->next; + /* Next_op points to first argument op */ - /* - * Get the method's arguments and put them on the operand stack - */ - status = acpi_ds_create_operands (walk_state, next_op); - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Since the operands will be passed to another - * control method, we must resolve all local - * references here (Local variables, arguments - * to *this* method, etc.) - */ - status = acpi_ds_resolve_operands (walk_state); - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Tell the walk loop to preempt this running method and - * execute the new method - */ - status = AE_CTRL_TRANSFER; - - /* - * Return now; we don't want to disturb anything, - * especially the operand count! - */ - return_ACPI_STATUS (status); - break; + next_op = next_op->next; + /* + * Get the method's arguments and put them on the operand stack + */ + status = acpi_ds_create_operands (walk_state, next_op); + if (ACPI_FAILURE (status)) { + break; + } - case OPTYPE_CREATE_FIELD: + /* + * Since the operands will be passed to another + * control method, we must resolve all local + * references here (Local variables, arguments + * to *this* method, etc.) + */ + status = acpi_ds_resolve_operands (walk_state); + if (ACPI_FAILURE (status)) { + break; + } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Executing Create_field Buffer/Index Op=%X\n", op)); + /* + * Tell the walk loop to preempt this running method and + * execute the new method + */ + status = AE_CTRL_TRANSFER; - status = acpi_ds_load2_end_op (walk_state, op); - if (ACPI_FAILURE (status)) { + /* + * Return now; we don't want to disturb anything, + * especially the operand count! + */ + return_ACPI_STATUS (status); break; - } - status = acpi_ds_eval_buffer_field_operands (walk_state, op); - break; + case AML_TYPE_CREATE_FIELD: - case OPTYPE_NAMED_OBJECT: + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Executing Create_field Buffer/Index Op=%p\n", op)); - status = acpi_ds_load2_end_op (walk_state, op); - if (ACPI_FAILURE (status)) { + status = acpi_ds_load2_end_op (walk_state); + if (ACPI_FAILURE (status)) { + break; + } + + status = acpi_ds_eval_buffer_field_operands (walk_state, op); break; - } - switch (op->opcode) { - case AML_REGION_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "Executing Op_region Address/Length Op=%X\n", op)); + case AML_TYPE_NAMED_FIELD: + case AML_TYPE_NAMED_COMPLEX: + case AML_TYPE_NAMED_SIMPLE: - status = acpi_ds_eval_region_operands (walk_state, op); + status = acpi_ds_load2_end_op (walk_state); if (ACPI_FAILURE (status)) { break; } - status = acpi_ds_result_stack_pop (walk_state); - break; + if (op->opcode == AML_REGION_OP) { + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, + "Executing Op_region Address/Length Op=%p\n", op)); + + status = acpi_ds_eval_region_operands (walk_state, op); + if (ACPI_FAILURE (status)) { + break; + } + status = acpi_ds_result_stack_pop (walk_state); + } - case AML_METHOD_OP: break; + case AML_TYPE_UNDEFINED: - case AML_ALIAS_OP: - - /* Alias creation was already handled by call - to psxload above */ + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Undefined opcode type Op=%p\n", op)); + return_ACPI_STATUS (AE_NOT_IMPLEMENTED); break; - default: - /* Nothing needs to be done */ - - status = AE_OK; + case AML_TYPE_BOGUS: + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Internal opcode=%X type Op=%p\n", + walk_state->opcode, op)); break; - } - - break; - default: + default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Unimplemented opcode, type=%X Opcode=%X Op=%X\n", - optype, op->opcode, op)); + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p\n", + op_class, op_type, op->opcode, op)); - status = AE_NOT_IMPLEMENTED; - break; + status = AE_NOT_IMPLEMENTED; + break; + } } - /* * ACPI 2.0 support for 64-bit integers: * Truncate numeric result value if we are executing from a 32-bit ACPI table */ - acpi_ex_truncate_for32bit_table (result_obj, walk_state); + acpi_ex_truncate_for32bit_table (walk_state->result_obj, walk_state); /* * Check if we just completed the evaluation of a @@ -682,23 +577,23 @@ (walk_state->control_state->common.state == CONTROL_PREDICATE_EXECUTING) && (walk_state->control_state->control.predicate_op == op)) { - status = acpi_ds_get_predicate_value (walk_state, op, (u32) result_obj); - result_obj = NULL; + status = acpi_ds_get_predicate_value (walk_state, (u32) walk_state->result_obj); + walk_state->result_obj = NULL; } cleanup: - if (result_obj) { + if (walk_state->result_obj) { /* Break to debugger to display result */ - DEBUGGER_EXEC (acpi_db_display_result_object (result_obj, walk_state)); + DEBUGGER_EXEC (acpi_db_display_result_object (walk_state->result_obj, walk_state)); /* * Delete the result op if and only if: * Parent will not use the result -- such as any * non-nested type2 op in a method (parent will be method) */ - acpi_ds_delete_result_if_not_used (op, result_obj, walk_state); + acpi_ds_delete_result_if_not_used (op, walk_state->result_obj, walk_state); } /* Always clear the object stack */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswload.c linux/drivers/acpi/dispatcher/dswload.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswload.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswload.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswload - Dispatcher namespace load callbacks - * $Revision: 44 $ + * $Revision: 50 $ * *****************************************************************************/ @@ -39,6 +39,53 @@ /******************************************************************************* * + * FUNCTION: Acpi_ds_init_callbacks + * + * PARAMETERS: Walk_state - Current state of the parse tree walk + * Pass_number - 1, 2, or 3 + * + * RETURN: Status + * + * DESCRIPTION: Init walk state callbacks + * + ******************************************************************************/ + +acpi_status +acpi_ds_init_callbacks ( + acpi_walk_state *walk_state, + u32 pass_number) +{ + + switch (pass_number) { + case 1: + walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; + walk_state->descending_callback = acpi_ds_load1_begin_op; + walk_state->ascending_callback = acpi_ds_load1_end_op; + break; + + case 2: + walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE; + walk_state->descending_callback = acpi_ds_load2_begin_op; + walk_state->ascending_callback = acpi_ds_load2_end_op; + break; + + case 3: + walk_state->parse_flags |= ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE; + walk_state->descending_callback = acpi_ds_exec_begin_op; + walk_state->ascending_callback = acpi_ds_exec_end_op; + break; + + default: + return (AE_BAD_PARAMETER); + break; + } + + return (AE_OK); +} + + +/******************************************************************************* + * * FUNCTION: Acpi_ds_load1_begin_op * * PARAMETERS: Walk_state - Current state of the parse tree walk @@ -53,49 +100,50 @@ acpi_status acpi_ds_load1_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { + acpi_parse_object *op; acpi_namespace_node *node; acpi_status status; acpi_object_type8 data_type; NATIVE_CHAR *path; - const acpi_opcode_info *op_info; PROC_NAME ("Ds_load1_begin_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); /* We are only interested in opcodes that have an associated name */ - op_info = acpi_ps_get_opcode_info (opcode); - if (!(op_info->flags & AML_NAMED)) { - *out_op = op; - return (AE_OK); - } + if (walk_state->op) { + if (!(walk_state->op_info->flags & AML_NAMED)) { + *out_op = op; + return (AE_OK); + } - /* Check if this object has already been installed in the namespace */ + /* Check if this object has already been installed in the namespace */ - if (op && op->node) { - *out_op = op; - return (AE_OK); + if (op->node) { + *out_op = op; + return (AE_OK); + } } - path = acpi_ps_get_next_namestring (walk_state->parser_state); + path = acpi_ps_get_next_namestring (&walk_state->parser_state); /* Map the raw opcode into an internal object type */ - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); + data_type = acpi_ds_map_named_opcode_to_data_type (walk_state->opcode); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", walk_state, op, data_type)); - if (opcode == AML_SCOPE_OP) { + if (walk_state->opcode == AML_SCOPE_OP) { ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", walk_state, op, data_type)); } @@ -115,7 +163,7 @@ if (!op) { /* Create a new op */ - op = acpi_ps_alloc_op (opcode); + op = acpi_ps_alloc_op (walk_state->opcode); if (!op) { return (AE_NO_MEMORY); } @@ -130,7 +178,7 @@ * can get it again quickly when this scope is closed */ op->node = node; - acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op); + acpi_ps_append_arg (acpi_ps_get_parent_scope (&walk_state->parser_state), op); *out_op = op; return (status); @@ -154,21 +202,21 @@ acpi_status acpi_ds_load1_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { + acpi_parse_object *op; acpi_object_type8 data_type; - const acpi_opcode_info *op_info; PROC_NAME ("Ds_load1_end_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); /* We are only interested in opcodes that have an associated name */ - op_info = acpi_ps_get_opcode_info (op->opcode); - if (!(op_info->flags & AML_NAMED)) { + if (!(walk_state->op_info->flags & AML_NAMED)) { return (AE_OK); } @@ -216,42 +264,41 @@ acpi_status acpi_ds_load2_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { + acpi_parse_object *op; acpi_namespace_node *node; acpi_status status; acpi_object_type8 data_type; NATIVE_CHAR *buffer_ptr; void *original = NULL; - const acpi_opcode_info *op_info; PROC_NAME ("Ds_load2_begin_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); - /* We only care about Namespace opcodes here */ + if (op) { + /* We only care about Namespace opcodes here */ - op_info = acpi_ps_get_opcode_info (opcode); - if (!(op_info->flags & AML_NSOPCODE) && - opcode != AML_INT_NAMEPATH_OP) { - return (AE_OK); - } + if (!(walk_state->op_info->flags & AML_NSOPCODE) && + walk_state->opcode != AML_INT_NAMEPATH_OP) { + return (AE_OK); + } - /* TBD: [Restructure] Temp! same code as in psparse */ + /* TBD: [Restructure] Temp! same code as in psparse */ - if (!(op_info->flags & AML_NAMED)) { - return (AE_OK); - } + if (!(walk_state->op_info->flags & AML_NAMED)) { + return (AE_OK); + } - if (op) { /* * Get the name we are going to enter or lookup in the namespace */ - if (opcode == AML_INT_NAMEPATH_OP) { + if (walk_state->opcode == AML_INT_NAMEPATH_OP) { /* For Namepath op, get the path string */ buffer_ptr = op->value.string; @@ -261,35 +308,33 @@ return (AE_OK); } } - else { /* Get name from the op */ buffer_ptr = (NATIVE_CHAR *) &((acpi_parse2_object *)op)->name; } } - else { - buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state); + buffer_ptr = acpi_ps_get_next_namestring (&walk_state->parser_state); } /* Map the raw opcode into an internal object type */ - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); + data_type = acpi_ds_map_named_opcode_to_data_type (walk_state->opcode); ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "State=%p Op=%p Type=%x\n", walk_state, op, data_type)); - if (opcode == AML_FIELD_OP || - opcode == AML_BANK_FIELD_OP || - opcode == AML_INDEX_FIELD_OP) { + if (walk_state->opcode == AML_FIELD_OP || + walk_state->opcode == AML_BANK_FIELD_OP || + walk_state->opcode == AML_INDEX_FIELD_OP) { node = NULL; status = AE_OK; } - else if (opcode == AML_INT_NAMEPATH_OP) { + else if (walk_state->opcode == AML_INT_NAMEPATH_OP) { /* * The Name_path is an object reference to an existing object. Don't enter the * name into the namespace, but look it up for use later @@ -326,7 +371,7 @@ if (!op) { /* Create a new op */ - op = acpi_ps_alloc_op (opcode); + op = acpi_ps_alloc_op (walk_state->opcode); if (!op) { return (AE_NO_MEMORY); } @@ -374,25 +419,26 @@ acpi_status acpi_ds_load2_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { + acpi_parse_object *op; acpi_status status = AE_OK; acpi_object_type8 data_type; acpi_namespace_node *node; acpi_parse_object *arg; acpi_namespace_node *new_node; - const acpi_opcode_info *op_info; + u32 i; PROC_NAME ("Ds_load2_end_op"); + + op = walk_state->op; ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op, walk_state)); /* Only interested in opcodes that have namespace objects */ - op_info = acpi_ps_get_opcode_info (op->opcode); - if (!(op_info->flags & AML_NSOBJECT)) { + if (!(walk_state->op_info->flags & AML_NSOBJECT)) { return (AE_OK); } @@ -435,323 +481,210 @@ /* * Named operations are as follows: * - * AML_SCOPE - * AML_DEVICE - * AML_THERMALZONE - * AML_METHOD - * AML_POWERRES - * AML_PROCESSOR - * AML_FIELD - * AML_INDEXFIELD - * AML_BANKFIELD - * AML_NAMEDFIELD - * AML_NAME * AML_ALIAS - * AML_MUTEX - * AML_EVENT - * AML_OPREGION - * AML_CREATEFIELD + * AML_BANKFIELD * AML_CREATEBITFIELD * AML_CREATEBYTEFIELD - * AML_CREATEWORDFIELD * AML_CREATEDWORDFIELD + * AML_CREATEFIELD * AML_CREATEQWORDFIELD + * AML_CREATEWORDFIELD + * AML_DATA_REGION + * AML_DEVICE + * AML_EVENT + * AML_FIELD + * AML_INDEXFIELD + * AML_METHOD * AML_METHODCALL + * AML_MUTEX + * AML_NAME + * AML_NAMEDFIELD + * AML_OPREGION + * AML_POWERRES + * AML_PROCESSOR + * AML_SCOPE + * AML_THERMALZONE */ + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "Create-Load [%s] State=%p Op=%p Named_obj=%p\n", + acpi_ps_get_opcode_name (op->opcode), walk_state, op, node)); /* Decode the opcode */ arg = op->value.arg; - switch (op->opcode) { - - case AML_CREATE_FIELD_OP: - case AML_CREATE_BIT_FIELD_OP: - case AML_CREATE_BYTE_FIELD_OP: - case AML_CREATE_WORD_FIELD_OP: - case AML_CREATE_DWORD_FIELD_OP: - case AML_CREATE_QWORD_FIELD_OP: + switch (walk_state->op_info->type) { + case AML_TYPE_CREATE_FIELD: /* * Create the field object, but the field buffer and index must * be evaluated later during the execution phase */ - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Create_xxx_field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - - /* Get the Name_string argument */ - - if (op->opcode == AML_CREATE_FIELD_OP) { - arg = acpi_ps_get_arg (op, 3); - } - else { - /* Create Bit/Byte/Word/Dword field */ - - arg = acpi_ps_get_arg (op, 2); - } - - if (!arg) { - status = AE_AML_NO_OPERAND; - goto cleanup; - } - - /* - * Enter the Name_string into the namespace - */ - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_DEF_ANY, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - walk_state, &(new_node)); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* We could put the returned object (Node) on the object stack for later, but - * for now, we will put it in the "op" object that the parser uses, so we - * can get it again at the end of this scope - */ - op->node = new_node; - - /* - * If there is no object attached to the node, this node was just created and - * we need to create the field object. Otherwise, this was a lookup of an - * existing node and we don't want to create the field object again. - */ - if (!new_node->object) { - /* - * The Field definition is not fully parsed at this time. - * (We must save the address of the AML for the buffer and index operands) - */ - status = acpi_ex_create_buffer_field (((acpi_parse2_object *) op)->data, - ((acpi_parse2_object *) op)->length, - new_node, walk_state); - } + status = acpi_ds_create_buffer_field (op, walk_state); break; - case AML_INT_METHODCALL_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "RESOLVING-Method_call: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - - /* - * Lookup the method name and save the Node - */ - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - ACPI_TYPE_ANY, IMODE_LOAD_PASS2, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, - walk_state, &(new_node)); - if (ACPI_SUCCESS (status)) { - /* TBD: has name already been resolved by here ??*/ - - /* TBD: [Restructure] Make sure that what we found is indeed a method! */ - /* We didn't search for a method on purpose, to see if the name would resolve! */ + case AML_TYPE_NAMED_FIELD: - /* We could put the returned object (Node) on the object stack for later, but - * for now, we will put it in the "op" object that the parser uses, so we - * can get it again at the end of this scope - */ - op->node = new_node; - } + arg = op->value.arg; + switch (op->opcode) { + case AML_INDEX_FIELD_OP: + status = acpi_ds_create_index_field (op, (acpi_handle) arg->node, + walk_state); + break; - break; + case AML_BANK_FIELD_OP: - case AML_PROCESSOR_OP: + status = acpi_ds_create_bank_field (op, arg->node, walk_state); + break; - /* Nothing to do other than enter object into namespace */ - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Processor: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + case AML_FIELD_OP: - status = acpi_ex_create_processor (op, node); - if (ACPI_FAILURE (status)) { - goto cleanup; + status = acpi_ds_create_field (op, arg->node, walk_state); + break; } - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Completed Processor Init, Op=%p State=%p entry=%p\n", - op, walk_state, node)); break; - case AML_POWER_RES_OP: + case AML_TYPE_NAMED_SIMPLE: - /* Nothing to do other than enter object into namespace */ - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Power_resource: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - - status = acpi_ex_create_power_resource (op, node); + status = acpi_ds_create_operands (walk_state, arg); if (ACPI_FAILURE (status)) { goto cleanup; } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Completed Power_resource Init, Op=%p State=%p entry=%p\n", - op, walk_state, node)); - break; - - - case AML_THERMAL_ZONE_OP: - - /* Nothing to do other than enter object into namespace */ - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Thermal_zone: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - break; + switch (op->opcode) { + case AML_PROCESSOR_OP: + status = acpi_ex_create_processor (walk_state); + break; - case AML_FIELD_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + case AML_POWER_RES_OP: - arg = op->value.arg; + status = acpi_ex_create_power_resource (walk_state); + break; - status = acpi_ds_create_field (op, arg->node, walk_state); - break; + case AML_MUTEX_OP: - case AML_INDEX_FIELD_OP: + status = acpi_ex_create_mutex (walk_state); + break; - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Index_field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); - arg = op->value.arg; - - status = acpi_ds_create_index_field (op, (acpi_handle) arg->node, - walk_state); - break; + case AML_EVENT_OP: + status = acpi_ex_create_event (walk_state); + break; - case AML_BANK_FIELD_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Bank_field: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + case AML_DATA_REGION_OP: - arg = op->value.arg; - status = acpi_ds_create_bank_field (op, arg->node, walk_state); - break; + status = acpi_ex_create_table_region (walk_state); + break; + case AML_ALIAS_OP: - /* - * Method_op Pkg_length Names_string Method_flags Term_list - */ - case AML_METHOD_OP: + status = acpi_ex_create_alias (walk_state); + break; - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Method: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); + default: + /* Unknown opcode */ - if (!node->object) { - status = acpi_ex_create_method (((acpi_parse2_object *) op)->data, - ((acpi_parse2_object *) op)->length, - arg->value.integer32, node); + status = AE_OK; + goto cleanup; + break; } - break; + /* Delete operands */ - case AML_MUTEX_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Mutex: Op=%p State=%p\n", op, walk_state)); - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; + for (i = 1; i < walk_state->num_operands; i++) { + acpi_ut_remove_reference (walk_state->operands[i]); + walk_state->operands[i] = NULL; } - status = acpi_ex_create_mutex (walk_state); break; - case AML_EVENT_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Event: Op=%p State=%p\n", op, walk_state)); + case AML_TYPE_NAMED_COMPLEX: - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } + switch (op->opcode) { + case AML_METHOD_OP: + /* + * Method_op Pkg_length Names_string Method_flags Term_list + */ + ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, + "LOADING-Method: State=%p Op=%p Named_obj=%p\n", + walk_state, op, node)); - status = acpi_ex_create_event (walk_state); - break; + if (!node->object) { + status = acpi_ds_create_operands (walk_state, arg); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + status = acpi_ex_create_method (((acpi_parse2_object *) op)->data, + ((acpi_parse2_object *) op)->length, + walk_state); + } + break; - case AML_REGION_OP: - if (node->object) { + case AML_REGION_OP: + /* + * The Op_region is not fully parsed at this time. Only valid argument is the Space_id. + * (We must save the address of the AML of the address and length operands) + */ + status = acpi_ex_create_region (((acpi_parse2_object *) op)->data, + ((acpi_parse2_object *) op)->length, + (ACPI_ADR_SPACE_TYPE) arg->value.integer, walk_state); break; - } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Opregion: Op=%p State=%p Named_obj=%p\n", - op, walk_state, node)); - /* - * The Op_region is not fully parsed at this time. Only valid argument is the Space_id. - * (We must save the address of the AML of the address and length operands) - */ - status = acpi_ex_create_region (((acpi_parse2_object *) op)->data, - ((acpi_parse2_object *) op)->length, - (ACPI_ADR_SPACE_TYPE) arg->value.integer, walk_state); + case AML_NAME_OP: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "Completed Op_region Init, Op=%p State=%p entry=%p\n", - op, walk_state, node)); + status = acpi_ds_create_node (walk_state, node, op); + break; + } break; - /* Namespace Modifier Opcodes */ - - case AML_ALIAS_OP: + case AML_CLASS_INTERNAL: - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Alias: Op=%p State=%p\n", op, walk_state)); - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_ex_create_alias (walk_state); + /* case AML_INT_NAMEPATH_OP: */ break; - case AML_NAME_OP: + case AML_CLASS_METHOD_CALL: ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Name: Op=%p State=%p\n", op, walk_state)); + "RESOLVING-Method_call: State=%p Op=%p Named_obj=%p\n", + walk_state, op, node)); /* - * Because of the execution pass through the non-control-method - * parts of the table, we can arrive here twice. Only init - * the named object node the first time through + * Lookup the method name and save the Node */ - if (!node->object) { - status = acpi_ds_create_node (walk_state, node, op); - } - - break; + status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, + ACPI_TYPE_ANY, IMODE_LOAD_PASS2, + NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, + walk_state, &(new_node)); + if (ACPI_SUCCESS (status)) { + /* TBD: has name already been resolved by here ??*/ + /* TBD: [Restructure] Make sure that what we found is indeed a method! */ + /* We didn't search for a method on purpose, to see if the name would resolve! */ - case AML_INT_NAMEPATH_OP: + /* We could put the returned object (Node) on the object stack for later, but + * for now, we will put it in the "op" object that the parser uses, so we + * can get it again at the end of this scope + */ + op->node = new_node; + } - ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, - "LOADING-Name_path object: State=%p Op=%p Named_obj=%p\n", - walk_state, op, node)); break; @@ -764,7 +697,8 @@ /* Remove the Node pushed at the very beginning */ - acpi_ds_obj_stack_pop (1, walk_state); + walk_state->operands[0] = NULL; + walk_state->num_operands = 0; return (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswscope.c linux/drivers/acpi/dispatcher/dswscope.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswscope.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswscope.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswscope - Scope stack manipulation - * $Revision: 48 $ + * $Revision: 49 $ * *****************************************************************************/ @@ -116,8 +116,9 @@ /* Init new scope object */ - scope_info->scope.node = node; - scope_info->common.value = (u16) type; + scope_info->common.data_type = ACPI_DESC_TYPE_STATE_WSCOPE; + scope_info->scope.node = node; + scope_info->common.value = (u16) type; /* Push new scope object onto stack */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/dispatcher/dswstate.c linux/drivers/acpi/dispatcher/dswstate.c --- v2.4.13/linux/drivers/acpi/dispatcher/dswstate.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/dispatcher/dswstate.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: dswstate - Dispatcher parse tree walk management routines - * $Revision: 51 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -368,6 +368,7 @@ return (AE_NO_MEMORY); } + state->common.data_type = ACPI_DESC_TYPE_STATE_RESULT; acpi_ut_push_generic_state (&walk_state->results, state); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Results=%p State=%p\n", @@ -744,7 +745,7 @@ * ******************************************************************************/ -static void +void acpi_ds_push_walk_state ( acpi_walk_state *walk_state, acpi_walk_list *walk_list) @@ -855,12 +856,103 @@ /* Put the new state at the head of the walk list */ - acpi_ds_push_walk_state (walk_state, walk_list); + if (walk_list) { + acpi_ds_push_walk_state (walk_state, walk_list); + } return_PTR (walk_state); } +#ifndef _ACPI_ASL_COMPILER +/******************************************************************************* + * + * FUNCTION: Acpi_ds_init_aml_walk + * + * PARAMETERS: Walk_state - New state to be initialized + * + * RETURN: None + * + * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk + * + ******************************************************************************/ + +acpi_status +acpi_ds_init_aml_walk ( + acpi_walk_state *walk_state, + acpi_parse_object *op, + acpi_namespace_node *method_node, + u8 *aml_start, + u32 aml_length, + acpi_operand_object **params, + acpi_operand_object **return_obj_desc, + u32 pass_number) +{ + acpi_status status; + acpi_parse_state *parser_state = &walk_state->parser_state; + + + FUNCTION_TRACE ("Ds_init_aml_walk"); + + + walk_state->parser_state.aml = + walk_state->parser_state.aml_start = aml_start; + walk_state->parser_state.aml_end = + walk_state->parser_state.pkg_end = aml_start + aml_length; + + /* The Next_op of the Next_walk will be the beginning of the method */ + /* TBD: [Restructure] -- obsolete? */ + + walk_state->next_op = NULL; + walk_state->params = params; + walk_state->caller_return_desc = return_obj_desc; + + status = acpi_ps_init_scope (&walk_state->parser_state, op); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + if (method_node) { + walk_state->parser_state.start_node = method_node; + walk_state->walk_type = WALK_METHOD; + walk_state->method_node = method_node; + walk_state->method_desc = acpi_ns_get_attached_object (method_node); + + + /* Push start scope on scope stack and make it current */ + + status = acpi_ds_scope_stack_push (method_node, ACPI_TYPE_METHOD, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* Init the method arguments */ + + acpi_ds_method_data_init_args (params, MTH_NUM_ARGS, walk_state); + } + + else { + /* Setup the current scope */ + + parser_state->start_node = parser_state->start_op->node; + if (parser_state->start_node) { + /* Push start scope on scope stack and make it current */ + + status = acpi_ds_scope_stack_push (parser_state->start_node, + parser_state->start_node->type, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + } + + acpi_ds_init_callbacks (walk_state, pass_number); + + return_ACPI_STATUS (AE_OK); +} +#endif + + /******************************************************************************* * * FUNCTION: Acpi_ds_delete_walk_state @@ -893,7 +985,11 @@ } - /* Always must free any linked control states */ + if (walk_state->parser_state.scope) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state)); + } + + /* Always must free any linked control states */ while (walk_state->control_state) { state = walk_state->control_state; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/driver.c linux/drivers/acpi/driver.c --- v2.4.13/linux/drivers/acpi/driver.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/driver.c Wed Oct 24 14:06:22 2001 @@ -40,7 +40,6 @@ #include #include #include "acpi.h" -#include "driver.h" #define _COMPONENT OS_DEPENDENT @@ -50,6 +49,70 @@ static int acpi_disabled = 0; +enum acpi_blacklist_predicates +{ + all_versions, + less_than_or_equal, + equal, + greater_than_or_equal, +}; + +struct acpi_blacklist_item +{ + char oem_id[7]; + char oem_table_id[9]; + u32 oem_revision; + enum acpi_blacklist_predicates oem_revision_predicate; +}; + +/* + * Currently, this blacklists based on items in the FADT. We may want to + * expand this to using other ACPI tables in the future, too. + */ +static struct acpi_blacklist_item acpi_blacklist[] __initdata = +{ + {"TOSHIB", "750 ", 0x970814, less_than_or_equal}, /* Portege 7020, BIOS 8.10 */ + {""} +}; + +int +acpi_blacklisted(FADT_DESCRIPTOR *fadt) +{ + int i = 0; + + while (acpi_blacklist[i].oem_id[0] != '\0') + { + if (strncmp(acpi_blacklist[i].oem_id, fadt->header.oem_id, 6)) { + i++; + continue; + } + + if (strncmp(acpi_blacklist[i].oem_table_id, fadt->header.oem_table_id, 8)) { + i++; + continue; + } + + if (acpi_blacklist[i].oem_revision_predicate == all_versions) + return TRUE; + + if (acpi_blacklist[i].oem_revision_predicate == less_than_or_equal + && fadt->header.oem_revision <= acpi_blacklist[i].oem_revision) + return TRUE; + + if (acpi_blacklist[i].oem_revision_predicate == greater_than_or_equal + && fadt->header.oem_revision >= acpi_blacklist[i].oem_revision) + return TRUE; + + if (acpi_blacklist[i].oem_revision_predicate == equal + && fadt->header.oem_revision == acpi_blacklist[i].oem_revision) + return TRUE; + + i++; + } + + return FALSE; +} + /* * Start the interpreter */ @@ -64,7 +127,6 @@ return -ENODEV; } - if (acpi_disabled) { printk(KERN_NOTICE "ACPI: disabled by cmdline, exiting\n"); return -ENODEV; @@ -89,6 +151,12 @@ if (!ACPI_SUCCESS(acpi_get_table(ACPI_TABLE_FADT, 1, &buffer))) { printk(KERN_ERR "ACPI: Could not get FADT\n"); + acpi_terminate(); + return -ENODEV; + } + + if (acpi_blacklisted(&acpi_fadt)) { + printk(KERN_ERR "ACPI: On blacklist -- BIOS not fully ACPI compliant\n"); acpi_terminate(); return -ENODEV; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/driver.h linux/drivers/acpi/driver.h --- v2.4.13/linux/drivers/acpi/driver.h Tue Jul 3 17:08:19 2001 +++ linux/drivers/acpi/driver.h Wed Dec 31 16:00:00 1969 @@ -1,72 +0,0 @@ -/* - * driver.h - ACPI driver - * - * Copyright (C) 2000 Andrew Henroid - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __DRIVER_H -#define __DRIVER_H - -#include -#include -#include -#include -#include - -#define ACPI_MAX_THROTTLE 10 -#define ACPI_INVALID ~0UL -#define ACPI_INFINITE ~0UL - -/* - * cpu.c - */ -int acpi_cpu_init(void); -u32 acpi_read_pm_timer(void); - -extern u32 acpi_c2_exit_latency; -extern u32 acpi_c3_exit_latency; -extern u32 acpi_c2_enter_latency; -extern u32 acpi_c3_enter_latency; -extern u32 acpi_use_idle; -extern u32 acpi_c1_count; -extern u32 acpi_c2_count; -extern u32 acpi_c3_count; - -/* - * driver.c - */ -int acpi_run(void (*callback)(void*), void *context); - -/* - * ec.c - */ -int acpi_ec_init(void); - -/* - * power.c - */ -int acpi_power_init(void); - -/* - * sys.c - */ -int acpi_sys_init(void); -int acpi_enter_sx(acpi_sstate_t state); - -extern volatile acpi_sstate_t acpi_sleep_state; - -#endif /* __DRIVER_H */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evevent.c linux/drivers/acpi/events/evevent.c --- v2.4.13/linux/drivers/acpi/events/evevent.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evevent.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: evevent - Fixed and General Purpose Acpi_event * handling and dispatch - * $Revision: 50 $ + * $Revision: 51 $ * *****************************************************************************/ @@ -354,7 +354,7 @@ * Allocate the Gpe information block */ acpi_gbl_gpe_registers = ACPI_MEM_CALLOCATE (acpi_gbl_gpe_register_count * - sizeof (ACPI_GPE_REGISTERS)); + sizeof (acpi_gpe_registers)); if (!acpi_gbl_gpe_registers) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not allocate the Gpe_registers block\n")); @@ -442,9 +442,9 @@ register_index++; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE registers: %X@%p (Blk0) %X@%p (Blk1)\n", - gpe0register_count, acpi_gbl_FADT->Xgpe0blk.address, gpe1_register_count, - acpi_gbl_FADT->Xgpe1_blk.address)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "GPE registers: %X@%8.8X%8.8X (Blk0) %X@%8.8X%8.8X (Blk1)\n", + gpe0register_count, HIDWORD(acpi_gbl_FADT->Xgpe0blk.address), LODWORD(acpi_gbl_FADT->Xgpe0blk.address), + gpe1_register_count, HIDWORD(acpi_gbl_FADT->Xgpe1_blk.address), LODWORD(acpi_gbl_FADT->Xgpe1_blk.address))); return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evmisc.c linux/drivers/acpi/events/evmisc.c --- v2.4.13/linux/drivers/acpi/events/evmisc.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evmisc.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: evmisc - ACPI device notification handler dispatch * and ACPI Global Lock support - * $Revision: 33 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -88,7 +88,7 @@ break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unknown Notify Value: %lx \n", notify_value)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unknown Notify Value: %X \n", notify_value)); break; } @@ -134,6 +134,7 @@ return (AE_NO_MEMORY); } + notify_info->common.data_type = ACPI_DESC_TYPE_STATE_NOTIFY; notify_info->notify.node = node; notify_info->notify.value = (u16) notify_value; notify_info->notify.handler_obj = handler_obj; @@ -173,7 +174,7 @@ void *context) { acpi_generic_state *notify_info = (acpi_generic_state *) context; - ACPI_NOTIFY_HANDLER global_handler = NULL; + acpi_notify_handler global_handler = NULL; void *global_context = NULL; acpi_operand_object *handler_obj; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evregion.c linux/drivers/acpi/events/evregion.c --- v2.4.13/linux/drivers/acpi/events/evregion.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evregion.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evregion - ACPI Address_space (Op_region) handler dispatch - * $Revision: 110 $ + * $Revision: 113 $ * *****************************************************************************/ @@ -147,17 +147,16 @@ params[1] = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); if (!params[1]) { - acpi_ut_remove_reference (params[0]); - return_ACPI_STATUS (AE_NO_MEMORY); + status = AE_NO_MEMORY; + goto cleanup; } - params[2] = NULL; - /* * Set up the parameter objects */ params[0]->integer.value = region_obj->region.space_id; params[1]->integer.value = function; + params[2] = NULL; /* * Execute the method, no return value @@ -165,9 +164,10 @@ DEBUG_EXEC(acpi_ut_display_init_pathname (region_obj->region.extra->extra.method_REG, " [Method]")); status = acpi_ns_evaluate_by_handle (region_obj->region.extra->extra.method_REG, params, NULL); + acpi_ut_remove_reference (params[1]); +cleanup: acpi_ut_remove_reference (params[0]); - acpi_ut_remove_reference (params[1]); return_ACPI_STATUS (status); } @@ -200,8 +200,8 @@ u32 *value) { acpi_status status; - ACPI_ADR_SPACE_HANDLER handler; - ACPI_ADR_SPACE_SETUP region_setup; + acpi_adr_space_handler handler; + acpi_adr_space_setup region_setup; acpi_operand_object *handler_desc; void *region_context = NULL; @@ -276,7 +276,7 @@ handler = handler_desc->addr_handler.handler; ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, - "Addrhandler %p (%p), Address %8.8lX%8.8lX\n", + "Addrhandler %p (%p), Address %8.8X%8.8X\n", ®ion_obj->region.addr_handler->addr_handler, handler, HIDWORD(address), LODWORD(address))); @@ -335,7 +335,7 @@ acpi_operand_object *handler_obj; acpi_operand_object *obj_desc; acpi_operand_object **last_obj_ptr; - ACPI_ADR_SPACE_SETUP region_setup; + acpi_adr_space_setup region_setup; void *region_context; acpi_status status; @@ -548,7 +548,7 @@ /* Convert and validate the device handle */ - node = acpi_ns_convert_handle_to_entry (obj_handle); + node = acpi_ns_map_handle_to_node (obj_handle); if (!node) { return (AE_BAD_PARAMETER); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evrgnini.c linux/drivers/acpi/events/evrgnini.c --- v2.4.13/linux/drivers/acpi/events/evrgnini.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evrgnini.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evrgnini- ACPI Address_space (Op_region) init - * $Revision: 46 $ + * $Revision: 48 $ * *****************************************************************************/ @@ -145,7 +145,7 @@ acpi_operand_object *handler_obj; acpi_namespace_node *node; acpi_operand_object *region_obj = (acpi_operand_object *) handle; - ACPI_DEVICE_ID object_hID; + acpi_device_id object_hID; FUNCTION_TRACE ("Ev_pci_config_region_setup"); @@ -158,7 +158,7 @@ * routine checks before we get here, but we check again just in case. */ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, - "Attempting to init a region %X, with no handler\n", region_obj)); + "Attempting to init a region %p, with no handler\n", region_obj)); return_ACPI_STATUS (AE_NOT_EXIST); } @@ -257,6 +257,70 @@ } *region_context = pci_id; + return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ev_pci_bar_region_setup + * + * PARAMETERS: Region_obj - region we are interested in + * Function - start or stop + * Handler_context - Address space handler context + * Region_context - Region specific context + * + * RETURN: Status + * + * DESCRIPTION: Do any prep work for region handling + * + * MUTEX: Assumes namespace is not locked + * + ******************************************************************************/ + +acpi_status +acpi_ev_pci_bar_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context) +{ + + FUNCTION_TRACE ("Ev_pci_bar_region_setup"); + + + return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ev_cmos_region_setup + * + * PARAMETERS: Region_obj - region we are interested in + * Function - start or stop + * Handler_context - Address space handler context + * Region_context - Region specific context + * + * RETURN: Status + * + * DESCRIPTION: Do any prep work for region handling + * + * MUTEX: Assumes namespace is not locked + * + ******************************************************************************/ + +acpi_status +acpi_ev_cmos_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context) +{ + + FUNCTION_TRACE ("Ev_cmos_region_setup"); + + return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evxface.c linux/drivers/acpi/events/evxface.c --- v2.4.13/linux/drivers/acpi/events/evxface.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxface - External interfaces for ACPI events - * $Revision: 112 $ + * $Revision: 116 $ * *****************************************************************************/ @@ -54,7 +54,7 @@ acpi_status acpi_install_fixed_event_handler ( u32 event, - ACPI_EVENT_HANDLER handler, + acpi_event_handler handler, void *context) { acpi_status status; @@ -63,13 +63,6 @@ FUNCTION_TRACE ("Acpi_install_fixed_event_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (event > ACPI_EVENT_MAX) { @@ -86,12 +79,12 @@ } - /* Install the handler before enabling the event - just in case... */ + /* Install the handler before enabling the event */ acpi_gbl_fixed_event_handlers[event].handler = handler; acpi_gbl_fixed_event_handlers[event].context = context; - status = acpi_enable_event (event, ACPI_EVENT_FIXED); + status = acpi_enable_event (event, ACPI_EVENT_FIXED, 0); if (!ACPI_SUCCESS (status)) { ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Could not enable fixed event.\n")); @@ -129,7 +122,7 @@ acpi_status acpi_remove_fixed_event_handler ( u32 event, - ACPI_EVENT_HANDLER handler) + acpi_event_handler handler) { acpi_status status = AE_OK; @@ -137,13 +130,6 @@ FUNCTION_TRACE ("Acpi_remove_fixed_event_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (event > ACPI_EVENT_MAX) { @@ -152,21 +138,19 @@ acpi_ut_acquire_mutex (ACPI_MTX_EVENTS); - /* Disable the event before removing the handler - just in case... */ + /* Disable the event before removing the handler */ - status = acpi_disable_event(event, ACPI_EVENT_FIXED); + status = acpi_disable_event(event, ACPI_EVENT_FIXED, 0); /* Always Remove the handler */ acpi_gbl_fixed_event_handlers[event].handler = NULL; acpi_gbl_fixed_event_handlers[event].context = NULL; - - if (!ACPI_SUCCESS(status)) { + if (!ACPI_SUCCESS (status)) { ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Could not write to fixed event enable register.\n")); } - else { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Disabled fixed event %X.\n", event)); } @@ -197,7 +181,7 @@ acpi_install_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler, + acpi_notify_handler handler, void *context) { acpi_operand_object *obj_desc; @@ -209,13 +193,6 @@ FUNCTION_TRACE ("Acpi_install_notify_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!handler) || @@ -227,7 +204,7 @@ /* Convert and validate the device handle */ - device_node = acpi_ns_convert_handle_to_entry (device); + device_node = acpi_ns_map_handle_to_node (device); if (!device_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -235,7 +212,6 @@ /* * Root Object: - * ------------ * Registering a notify handler on the root object indicates that the * caller wishes to receive notifications for all objects. Note that * only one global handler can be regsitered (per notify type). @@ -266,8 +242,7 @@ } /* - * Other Objects: - * -------------- + * All Other Objects: * Caller will only receive notifications specific to the target object. * Note that only certain object types can receive notifications. */ @@ -338,6 +313,7 @@ } } + unlock_and_exit: acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return_ACPI_STATUS (status); @@ -363,7 +339,7 @@ acpi_remove_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler) + acpi_notify_handler handler) { acpi_operand_object *notify_obj; acpi_operand_object *obj_desc; @@ -374,13 +350,6 @@ FUNCTION_TRACE ("Acpi_remove_notify_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!handler) || @@ -392,18 +361,16 @@ /* Convert and validate the device handle */ - device_node = acpi_ns_convert_handle_to_entry (device); + device_node = acpi_ns_map_handle_to_node (device); if (!device_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; } /* - * Root Object: - * ------------ + * Root Object */ if (device == ACPI_ROOT_OBJECT) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n")); if (((handler_type == ACPI_SYSTEM_NOTIFY) && @@ -415,20 +382,19 @@ } if (handler_type == ACPI_SYSTEM_NOTIFY) { - acpi_gbl_sys_notify.node = NULL; + acpi_gbl_sys_notify.node = NULL; acpi_gbl_sys_notify.handler = NULL; acpi_gbl_sys_notify.context = NULL; } else { - acpi_gbl_drv_notify.node = NULL; + acpi_gbl_drv_notify.node = NULL; acpi_gbl_drv_notify.handler = NULL; acpi_gbl_drv_notify.context = NULL; } } /* - * Other Objects: - * -------------- + * All Other Objects */ else { /* @@ -505,7 +471,7 @@ acpi_install_gpe_handler ( u32 gpe_number, u32 type, - ACPI_GPE_HANDLER handler, + acpi_gpe_handler handler, void *context) { acpi_status status = AE_OK; @@ -514,13 +480,6 @@ FUNCTION_TRACE ("Acpi_install_gpe_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (!handler || (gpe_number > ACPI_GPE_MAX)) { @@ -553,6 +512,7 @@ acpi_hw_clear_gpe (gpe_number); acpi_hw_enable_gpe (gpe_number); + cleanup: acpi_ut_release_mutex (ACPI_MTX_EVENTS); return_ACPI_STATUS (status); @@ -575,7 +535,7 @@ acpi_status acpi_remove_gpe_handler ( u32 gpe_number, - ACPI_GPE_HANDLER handler) + acpi_gpe_handler handler) { acpi_status status = AE_OK; @@ -583,13 +543,6 @@ FUNCTION_TRACE ("Acpi_remove_gpe_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (!handler || (gpe_number > ACPI_GPE_MAX)) { @@ -621,6 +574,7 @@ acpi_gbl_gpe_info[gpe_number].handler = NULL; acpi_gbl_gpe_info[gpe_number].context = NULL; + cleanup: acpi_ut_release_mutex (ACPI_MTX_EVENTS); return_ACPI_STATUS (status); @@ -639,6 +593,7 @@ * DESCRIPTION: Acquire the ACPI Global Lock * ******************************************************************************/ + acpi_status acpi_acquire_global_lock ( void) @@ -646,13 +601,6 @@ acpi_status status; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - status = acpi_ex_enter_interpreter (); if (ACPI_FAILURE (status)) { return (status); @@ -685,15 +633,6 @@ acpi_release_global_lock ( void) { - acpi_status status; - - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } acpi_ev_release_global_lock (); return (AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evxfevnt.c linux/drivers/acpi/events/evxfevnt.c --- v2.4.13/linux/drivers/acpi/events/evxfevnt.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evxfevnt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable - * $Revision: 36 $ + * $Revision: 38 $ * *****************************************************************************/ @@ -106,13 +106,6 @@ FUNCTION_TRACE ("Acpi_disable"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Restore original mode */ status = acpi_hw_set_mode (acpi_gbl_original_mode); @@ -136,6 +129,7 @@ * * PARAMETERS: Event - The fixed event or GPE to be enabled * Type - The type of event + * Flags - Just enable, or also wake enable? * * RETURN: Status * @@ -146,7 +140,8 @@ acpi_status acpi_enable_event ( u32 event, - u32 type) + u32 type, + u32 flags) { acpi_status status = AE_OK; u32 register_id; @@ -155,13 +150,6 @@ FUNCTION_TRACE ("Acpi_enable_event"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* The Type must be either Fixed Acpi_event or GPE */ switch (type) { @@ -223,7 +211,13 @@ /* Enable the requested GPE number */ - acpi_hw_enable_gpe (event); + if (flags & ACPI_EVENT_ENABLE) { + acpi_hw_enable_gpe (event); + } + if (flags & ACPI_EVENT_WAKE_ENABLE) { + acpi_hw_enable_gpe_for_wakeup (event); + } + break; @@ -242,7 +236,8 @@ * FUNCTION: Acpi_disable_event * * PARAMETERS: Event - The fixed event or GPE to be enabled - * Type - The type of event + * Type - The type of event, fixed or general purpose + * Flags - Wake disable vs. non-wake disable * * RETURN: Status * @@ -253,7 +248,8 @@ acpi_status acpi_disable_event ( u32 event, - u32 type) + u32 type, + u32 flags) { acpi_status status = AE_OK; u32 register_id; @@ -262,13 +258,6 @@ FUNCTION_TRACE ("Acpi_disable_event"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* The Type must be either Fixed Acpi_event or GPE */ switch (type) { @@ -329,7 +318,13 @@ /* Disable the requested GPE number */ - acpi_hw_disable_gpe (event); + if (flags & ACPI_EVENT_DISABLE) { + acpi_hw_disable_gpe (event); + } + if (flags & ACPI_EVENT_WAKE_DISABLE) { + acpi_hw_disable_gpe_for_wakeup (event); + } + break; @@ -366,13 +361,6 @@ FUNCTION_TRACE ("Acpi_clear_event"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* The Type must be either Fixed Acpi_event or GPE */ switch (type) { @@ -466,13 +454,6 @@ FUNCTION_TRACE ("Acpi_get_event_status"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } if (!event_status) { return_ACPI_STATUS (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/events/evxfregn.c linux/drivers/acpi/events/evxfregn.c --- v2.4.13/linux/drivers/acpi/events/evxfregn.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/events/evxfregn.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and * Address Spaces. - * $Revision: 36 $ + * $Revision: 40 $ * *****************************************************************************/ @@ -56,8 +56,8 @@ acpi_install_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler, - ACPI_ADR_SPACE_SETUP setup, + acpi_adr_space_handler handler, + acpi_adr_space_setup setup, void *context) { acpi_operand_object *obj_desc; @@ -71,13 +71,6 @@ FUNCTION_TRACE ("Acpi_install_address_space_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!device) || @@ -90,16 +83,16 @@ /* Convert and validate the device handle */ - node = acpi_ns_convert_handle_to_entry (device); + node = acpi_ns_map_handle_to_node (device); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; } /* - * This registration is valid for only the types below - * and the root. This is where the default handlers - * get placed. + * This registration is valid for only the types below + * and the root. This is where the default handlers + * get placed. */ if ((node->type != ACPI_TYPE_DEVICE) && (node->type != ACPI_TYPE_PROCESSOR) && @@ -115,17 +108,27 @@ switch (space_id) { case ACPI_ADR_SPACE_SYSTEM_MEMORY: handler = acpi_ex_system_memory_space_handler; - setup = acpi_ev_system_memory_region_setup; + setup = acpi_ev_system_memory_region_setup; break; case ACPI_ADR_SPACE_SYSTEM_IO: handler = acpi_ex_system_io_space_handler; - setup = acpi_ev_io_space_region_setup; + setup = acpi_ev_io_space_region_setup; break; case ACPI_ADR_SPACE_PCI_CONFIG: handler = acpi_ex_pci_config_space_handler; - setup = acpi_ev_pci_config_region_setup; + setup = acpi_ev_pci_config_region_setup; + break; + + case ACPI_ADR_SPACE_CMOS: + handler = acpi_ex_cmos_space_handler; + setup = acpi_ev_cmos_region_setup; + break; + + case ACPI_ADR_SPACE_PCI_BAR_TARGET: + handler = acpi_ex_pci_bar_space_handler; + setup = acpi_ev_pci_bar_region_setup; break; default: @@ -136,20 +139,20 @@ } /* - * If the caller hasn't specified a setup routine, use the default + * If the caller hasn't specified a setup routine, use the default */ if (!setup) { setup = acpi_ev_default_region_setup; } /* - * Check for an existing internal object + * Check for an existing internal object */ obj_desc = acpi_ns_get_attached_object (node); if (obj_desc) { /* - * The object exists. - * Make sure the handler is not already installed. + * The object exists. + * Make sure the handler is not already installed. */ /* check the address handler the user requested */ @@ -157,8 +160,8 @@ handler_obj = obj_desc->device.addr_handler; while (handler_obj) { /* - * We have an Address handler, see if user requested this - * address space. + * We have an Address handler, see if user requested this + * address space. */ if(handler_obj->addr_handler.space_id == space_id) { status = AE_EXIST; @@ -166,7 +169,7 @@ } /* - * Move through the linked list of handlers + * Move through the linked list of handlers */ handler_obj = handler_obj->addr_handler.next; } @@ -181,7 +184,6 @@ if (node->type == ACPI_TYPE_ANY) { type = ACPI_TYPE_DEVICE; } - else { type = node->type; } @@ -210,11 +212,11 @@ acpi_ut_get_region_name (space_id), space_id, node, obj_desc)); /* - * Now we can install the handler + * Now we can install the handler * - * At this point we know that there is no existing handler. - * So, we just allocate the object for the handler and link it - * into the list. + * At this point we know that there is no existing handler. + * So, we just allocate the object for the handler and link it + * into the list. */ handler_obj = acpi_ut_create_internal_object (INTERNAL_TYPE_ADDRESS_HANDLER); if (!handler_obj) { @@ -232,16 +234,16 @@ handler_obj->addr_handler.setup = setup; /* - * Now walk the namespace finding all of the regions this - * handler will manage. + * Now walk the namespace finding all of the regions this + * handler will manage. * - * We start at the device and search the branch toward - * the leaf nodes until either the leaf is encountered or - * a device is detected that has an address handler of the - * same type. + * We start at the device and search the branch toward + * the leaf nodes until either the leaf is encountered or + * a device is detected that has an address handler of the + * same type. * - * In either case we back up and search down the remainder - * of the branch + * In either case we back up and search down the remainder + * of the branch */ status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX, NS_WALK_UNLOCK, @@ -249,7 +251,7 @@ handler_obj, NULL); /* - * Place this handler 1st on the list + * Place this handler 1st on the list */ handler_obj->common.reference_count = (u16) (handler_obj->common.reference_count + @@ -280,7 +282,7 @@ acpi_remove_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler) + acpi_adr_space_handler handler) { acpi_operand_object *obj_desc; acpi_operand_object *handler_obj; @@ -293,13 +295,6 @@ FUNCTION_TRACE ("Acpi_remove_address_space_handler"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((!device) || @@ -312,7 +307,7 @@ /* Convert and validate the device handle */ - node = acpi_ns_convert_handle_to_entry (device); + node = acpi_ns_map_handle_to_node (device); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -323,25 +318,22 @@ obj_desc = acpi_ns_get_attached_object (node); if (!obj_desc) { - /* - * The object DNE. - */ status = AE_NOT_EXIST; goto unlock_and_exit; } /* - * find the address handler the user requested + * find the address handler the user requested */ handler_obj = obj_desc->device.addr_handler; last_obj_ptr = &obj_desc->device.addr_handler; while (handler_obj) { /* - * We have a handler, see if user requested this one + * We have a handler, see if user requested this one */ - if(handler_obj->addr_handler.space_id == space_id) { + if (handler_obj->addr_handler.space_id == space_id) { /* - * Got it, first dereference this in the Regions + * Got it, first dereference this in the Regions */ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, "Removing address handler %p(%p) for region %s on Device %p(%p)\n", @@ -354,30 +346,30 @@ while (region_obj) { /* - * First disassociate the handler from the region. + * First disassociate the handler from the region. * - * NOTE: this doesn't mean that the region goes away - * The region is just inaccessible as indicated to - * the _REG method + * NOTE: this doesn't mean that the region goes away + * The region is just inaccessible as indicated to + * the _REG method */ acpi_ev_disassociate_region_from_handler(region_obj, TRUE); /* - * Walk the list, since we took the first region and it - * was removed from the list by the dissassociate call - * we just get the first item on the list again + * Walk the list, since we took the first region and it + * was removed from the list by the dissassociate call + * we just get the first item on the list again */ region_obj = handler_obj->addr_handler.region_list; } /* - * Remove this Handler object from the list + * Remove this Handler object from the list */ *last_obj_ptr = handler_obj->addr_handler.next; /* - * Now we can delete the handler object + * Now we can delete the handler object */ acpi_ut_remove_reference (handler_obj); acpi_ut_remove_reference (handler_obj); @@ -386,7 +378,7 @@ } /* - * Move through the linked list of handlers + * Move through the linked list of handlers */ last_obj_ptr = &handler_obj->addr_handler.next; handler_obj = handler_obj->addr_handler.next; @@ -394,7 +386,7 @@ /* - * The handler does not exist + * The handler does not exist */ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, "Unable to remove address handler %p for %s(%X), Dev_node %p, obj %p\n", diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exconfig.c linux/drivers/acpi/executer/exconfig.c --- v2.4.13/linux/drivers/acpi/executer/exconfig.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exconfig.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes) - * $Revision: 41 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -51,10 +51,10 @@ * ****************************************************************************/ -static acpi_status -acpi_ex_load_table_op ( +acpi_status +acpi_ex_load_op ( acpi_operand_object *rgn_desc, - acpi_operand_object **ddb_handle) + acpi_operand_object *ddb_handle) { acpi_status status; acpi_operand_object *table_desc = NULL; @@ -65,7 +65,7 @@ u32 i; - FUNCTION_TRACE ("Ex_load_table"); + FUNCTION_TRACE ("Ex_load_op"); /* TBD: [Unhandled] Object can be either a field or an opregion */ @@ -117,7 +117,7 @@ acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].sig_length))) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Table has invalid signature [%4.4s], must be SSDT or PSDT\n", - table_header.signature)); + (char*)table_header.signature)); status = AE_BAD_SIGNATURE; goto cleanup; } @@ -165,7 +165,8 @@ table_desc->reference.opcode = AML_LOAD_OP; table_desc->reference.object = table_info.installed_desc; - *ddb_handle = table_desc; + /* TBD: store the tabledesc into the Ddb_handle target */ + /* Ddb_handle = Table_desc; */ return_ACPI_STATUS (status); @@ -175,7 +176,6 @@ ACPI_MEM_FREE (table_desc); ACPI_MEM_FREE (table_ptr); return_ACPI_STATUS (status); - } @@ -191,7 +191,7 @@ * ****************************************************************************/ -static acpi_status +acpi_status acpi_ex_unload_table ( acpi_operand_object *ddb_handle) { @@ -236,60 +236,6 @@ /* Delete the table descriptor (Ddb_handle) */ acpi_ut_remove_reference (table_desc); - - return_ACPI_STATUS (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ex_reconfiguration - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current state of the parse tree walk - * - * RETURN: Status - * - * DESCRIPTION: Reconfiguration opcodes such as LOAD and UNLOAD - * - ****************************************************************************/ - -acpi_status -acpi_ex_reconfiguration ( - u16 opcode, - acpi_walk_state *walk_state) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_status status; - - - FUNCTION_TRACE ("Ex_reconfiguration"); - -#define ddb_handle operand[0] -#define region_desc operand[1] - - - switch (opcode) { - - case AML_LOAD_OP: - - status = acpi_ex_load_table_op (region_desc, &ddb_handle); - break; - - - case AML_UNLOAD_OP: - - status = acpi_ex_unload_table (ddb_handle); - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "bad opcode=%X\n", opcode)); - status = AE_AML_BAD_OPCODE; - break; - } - return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exconvrt.c linux/drivers/acpi/executer/exconvrt.c --- v2.4.13/linux/drivers/acpi/executer/exconvrt.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exconvrt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exconvrt - Object conversion routines - * $Revision: 22 $ + * $Revision: 24 $ * *****************************************************************************/ @@ -230,7 +230,7 @@ new_buf = ACPI_MEM_CALLOCATE (integer_size); if (!new_buf) { REPORT_ERROR - (("Ex_dyadic2_r/Concat_op: Buffer allocation failure\n")); + (("Ex_convert_to_buffer: Buffer allocation failure\n")); acpi_ut_remove_reference (ret_desc); return (AE_NO_MEMORY); } @@ -296,8 +296,9 @@ u32 k = 0; u8 hex_digit; acpi_integer digit; - u8 leading_zero = TRUE; + u32 remainder; u32 length = sizeof (acpi_integer); + u8 leading_zero = TRUE; FUNCTION_ENTRY (); @@ -306,12 +307,13 @@ switch (base) { case 10: + remainder = 0; for (i = ACPI_MAX_DECIMAL_DIGITS; i > 0 ; i--) { /* Divide by nth factor of 10 */ digit = integer; for (j = 1; j < i; j++) { - digit = ACPI_DIVIDE (digit, 10); + acpi_ut_short_divide (&digit, 10, &digit, &remainder); } /* Create the decimal digit */ @@ -321,7 +323,7 @@ } if (!leading_zero) { - string[k] = (u8) (ASCII_ZERO + ACPI_MODULO (digit, 10)); + string[k] = (u8) (ASCII_ZERO + remainder); k++; } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/excreate.c linux/drivers/acpi/executer/excreate.c --- v2.4.13/linux/drivers/acpi/executer/excreate.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/excreate.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: excreate - Named object creation - * $Revision: 66 $ + * $Revision: 71 $ * *****************************************************************************/ @@ -37,162 +37,6 @@ MODULE_NAME ("excreate") -/******************************************************************************* - * - * FUNCTION: Acpi_ex_create_buffer_field - * - * PARAMETERS: Opcode - The opcode to be executed - * Operands - List of operands for the opcode - * - * RETURN: Status - * - * DESCRIPTION: Execute Create_field operators: Create_bit_field_op, - * Create_byte_field_op, Create_word_field_op, Create_dWord_field_op, - * Create_field_op (which define fields in buffers) - * - * ALLOCATION: Deletes Create_field_op's count operand descriptor - * - * - * ACPI SPECIFICATION REFERENCES: - * Def_create_bit_field := Create_bit_field_op Src_buf Bit_idx Name_string - * Def_create_byte_field := Create_byte_field_op Src_buf Byte_idx Name_string - * Def_create_dWord_field := Create_dWord_field_op Src_buf Byte_idx Name_string - * Def_create_field := Create_field_op Src_buf Bit_idx Num_bits Name_string - * Def_create_word_field := Create_word_field_op Src_buf Byte_idx Name_string - * Bit_index := Term_arg=>Integer - * Byte_index := Term_arg=>Integer - * Num_bits := Term_arg=>Integer - * Source_buff := Term_arg=>Buffer - * - ******************************************************************************/ - -acpi_status -acpi_ex_create_buffer_field ( - u8 *aml_ptr, - u32 aml_length, - acpi_namespace_node *node, - acpi_walk_state *walk_state) -{ - acpi_status status; - acpi_operand_object *obj_desc; - acpi_operand_object *tmp_desc; - - - FUNCTION_TRACE ("Ex_create_buffer_field"); - - - /* Create the descriptor */ - - obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER_FIELD); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - - /* - * Allocate a method object for this field unit - */ - obj_desc->buffer_field.extra = acpi_ut_create_internal_object ( - INTERNAL_TYPE_EXTRA); - if (!obj_desc->buffer_field.extra) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Remember location in AML stream of the field unit - * opcode and operands -- since the buffer and index - * operands must be evaluated. - */ - obj_desc->buffer_field.extra->extra.pcode = aml_ptr; - obj_desc->buffer_field.extra->extra.pcode_length = aml_length; - obj_desc->buffer_field.node = node; - - - /* - * This operation is supposed to cause the destination Name to refer - * to the defined Buffer_field -- it must not store the constructed - * Buffer_field object (or its current value) in some location that the - * Name may already be pointing to. So, if the Name currently contains - * a reference which would cause Acpi_ex_store() to perform an indirect - * store rather than setting the value of the Name itself, clobber that - * reference before calling Acpi_ex_store(). - */ - - /* Type of Name's existing value */ - - switch (acpi_ns_get_type (node)) { - - case ACPI_TYPE_BUFFER_FIELD: - case INTERNAL_TYPE_ALIAS: - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - - tmp_desc = acpi_ns_get_attached_object (node); - if (tmp_desc) { - /* - * There is an existing object here; delete it and zero out the - * object field within the Node - */ - DUMP_PATHNAME (node, - "Ex_create_buffer_field: Removing Current Reference", - ACPI_LV_BFIELD, _COMPONENT); - - DUMP_ENTRY (node, ACPI_LV_BFIELD); - DUMP_STACK_ENTRY (tmp_desc); - - acpi_ut_remove_reference (tmp_desc); - acpi_ns_attach_object ((acpi_namespace_node *) node, NULL, - ACPI_TYPE_ANY); - } - - /* Set the type to ANY (or the store below will fail) */ - - ((acpi_namespace_node *) node)->type = ACPI_TYPE_ANY; - - break; - - - default: - - break; - } - - - /* Store constructed field descriptor in result location */ - - status = acpi_ex_store (obj_desc, (acpi_operand_object *) node, - walk_state); - - /* - * If the field descriptor was not physically stored (or if a failure - * above), we must delete it - */ - if (obj_desc->common.reference_count <= 1) { - acpi_ut_remove_reference (obj_desc); - } - - - return_ACPI_STATUS (AE_OK); - - -cleanup: - - /* Delete region object and method subobject */ - - if (obj_desc) { - /* Remove deletes both objects! */ - - acpi_ut_remove_reference (obj_desc); - obj_desc = NULL; - } - - return_ACPI_STATUS (status); -} - - /***************************************************************************** * * FUNCTION: Acpi_ex_create_alias @@ -211,7 +55,6 @@ acpi_walk_state *walk_state) { acpi_namespace_node *source_node; - acpi_namespace_node *alias_node; acpi_status status; @@ -220,29 +63,19 @@ /* Get the source/alias operands (both namespace nodes) */ - source_node = (acpi_namespace_node *) walk_state->operands[walk_state->num_operands -1]; - walk_state->num_operands--; - - /* - * Don't pop it, it gets removed in the calling routine - */ - alias_node = acpi_ds_obj_stack_get_value (0, walk_state); + source_node = (acpi_namespace_node *) walk_state->operands[1]; - /* Add an additional reference to the object */ - acpi_ut_add_reference (source_node->object); + /* Attach the original source object to the new Alias Node */ - /* - * Attach the original source Node to the new Alias Node. - */ - status = acpi_ns_attach_object (alias_node, source_node->object, + status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], + source_node->object, source_node->type); - /* * The new alias assumes the type of the source, but it points - * to the same object. The reference count of the object has two - * additional references to prevent deletion out from under either the + * to the same object. The reference count of the object has an + * additional reference to prevent deletion out from under either the * source or the alias Node */ @@ -256,7 +89,7 @@ * * FUNCTION: Acpi_ex_create_event * - * PARAMETERS: None + * PARAMETERS: Walk_state - Current state * * RETURN: Status * @@ -288,23 +121,20 @@ status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 1, &obj_desc->event.semaphore); if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (obj_desc); goto cleanup; } /* Attach object to the Node */ - status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state), + status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], obj_desc, (u8) ACPI_TYPE_EVENT); - if (ACPI_FAILURE (status)) { - acpi_os_delete_semaphore (obj_desc->event.semaphore); - acpi_ut_remove_reference (obj_desc); - goto cleanup; - } - cleanup: - + /* + * Remove local reference to the object (on error, will cause deletion + * of both object and semaphore if present.) + */ + acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } @@ -313,13 +143,14 @@ * * FUNCTION: Acpi_ex_create_mutex * - * PARAMETERS: Interpreter_mode - Current running mode (load1/Load2/Exec) - * Operands - List of operands for the opcode + * PARAMETERS: Walk_state - Current state * * RETURN: Status * * DESCRIPTION: Create a new mutex object * + * Mutex (Name[0], Sync_level[1]) + * ****************************************************************************/ acpi_status @@ -327,19 +158,13 @@ acpi_walk_state *walk_state) { acpi_status status = AE_OK; - acpi_operand_object *sync_desc; acpi_operand_object *obj_desc; FUNCTION_TRACE_PTR ("Ex_create_mutex", WALK_OPERANDS); - /* Get the operand */ - - sync_desc = walk_state->operands[walk_state->num_operands -1]; - walk_state->num_operands--; - - /* Attempt to allocate a new object */ + /* Create the new mutex object */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_MUTEX); if (!obj_desc) { @@ -351,29 +176,23 @@ status = acpi_os_create_semaphore (1, 1, &obj_desc->mutex.semaphore); if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (obj_desc); goto cleanup; } - obj_desc->mutex.sync_level = (u8) sync_desc->integer.value; + /* Init object and attach to NS node */ - /* Obj_desc was on the stack top, and the name is below it */ + obj_desc->mutex.sync_level = (u8) walk_state->operands[1]->integer.value; - status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state), + status = acpi_ns_attach_object ((acpi_namespace_node *) walk_state->operands[0], obj_desc, (u8) ACPI_TYPE_MUTEX); - if (ACPI_FAILURE (status)) { - acpi_os_delete_semaphore (obj_desc->mutex.semaphore); - acpi_ut_remove_reference (obj_desc); - goto cleanup; - } cleanup: - - /* Always delete the operand */ - - acpi_ut_remove_reference (sync_desc); - + /* + * Remove local reference to the object (on error, will cause deletion + * of both object and semaphore if present.) + */ + acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } @@ -382,10 +201,10 @@ * * FUNCTION: Acpi_ex_create_region * - * PARAMETERS: Aml_ptr - Pointer to the region declaration AML + * PARAMETERS: Aml_start - Pointer to the region declaration AML * Aml_length - Max length of the declaration AML * Operands - List of operands for the opcode - * Interpreter_mode - Load1/Load2/Execute + * Walk_state - Current state * * RETURN: Status * @@ -395,7 +214,7 @@ acpi_status acpi_ex_create_region ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, u8 region_space, acpi_walk_state *walk_state) @@ -408,6 +227,18 @@ FUNCTION_TRACE ("Ex_create_region"); + /* Get the Node from the object stack */ + + node = (acpi_namespace_node *) walk_state->operands[0]; + + /* + * If the region object is already attached to this node, + * just return + */ + if (node->object) { + return_ACPI_STATUS (AE_OK); + } + /* * Space ID must be one of the predefined IDs, or in the user-defined * range @@ -422,10 +253,6 @@ acpi_ut_get_region_name (region_space), region_space)); - /* Get the Node from the object stack */ - - node = (acpi_namespace_node *) acpi_ds_obj_stack_get_value (0, walk_state); - /* Create the region descriptor */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION); @@ -434,9 +261,8 @@ goto cleanup; } - /* - * Allocate a method object for this region. - */ + /* Allocate a method object for this region */ + obj_desc->region.extra = acpi_ut_create_internal_object ( INTERNAL_TYPE_EXTRA); if (!obj_desc->region.extra) { @@ -448,23 +274,20 @@ * Remember location in AML stream of address & length * operands since they need to be evaluated at run time. */ - obj_desc->region.extra->extra.pcode = aml_ptr; - obj_desc->region.extra->extra.pcode_length = aml_length; + obj_desc->region.extra->extra.aml_start = aml_start; + obj_desc->region.extra->extra.aml_length = aml_length; /* Init the region from the operands */ - obj_desc->region.space_id = region_space; - obj_desc->region.address = 0; - obj_desc->region.length = 0; - + obj_desc->region.space_id = region_space; + obj_desc->region.address = 0; + obj_desc->region.length = 0; + obj_desc->region.node = node; /* Install the new region object in the parent Node */ - obj_desc->region.node = node; - status = acpi_ns_attach_object (node, obj_desc, (u8) ACPI_TYPE_REGION); - if (ACPI_FAILURE (status)) { goto cleanup; } @@ -474,7 +297,6 @@ * Namespace is NOT locked at this point. */ status = acpi_ev_initialize_region (obj_desc, FALSE); - if (ACPI_FAILURE (status)) { /* * If AE_NOT_EXIST is returned, it is not fatal @@ -488,17 +310,48 @@ cleanup: - if (ACPI_FAILURE (status)) { - /* Delete region object and method subobject */ + /* Remove local reference to the object */ - if (obj_desc) { - /* Remove deletes both objects! */ + acpi_ut_remove_reference (obj_desc); - acpi_ut_remove_reference (obj_desc); - obj_desc = NULL; - } + return_ACPI_STATUS (status); +} + + +/***************************************************************************** + * + * FUNCTION: Acpi_ex_create_table_region + * + * PARAMETERS: Walk_state - Current state + * + * RETURN: Status + * + * DESCRIPTION: Create a new Data_table_region object + * + ****************************************************************************/ + +acpi_status +acpi_ex_create_table_region ( + acpi_walk_state *walk_state) +{ + acpi_status status = AE_OK; + + + FUNCTION_TRACE ("Ex_create_table_region"); + +/* + acpi_operand_object *Obj_desc; + Obj_desc = Acpi_ut_create_internal_object (ACPI_TYPE_REGION); + if (!Obj_desc) + { + Status = AE_NO_MEMORY; + goto Cleanup; } + +Cleanup: +*/ + return_ACPI_STATUS (status); } @@ -515,68 +368,46 @@ * * DESCRIPTION: Create a new processor object and populate the fields * + * Processor (Name[0], Cpu_iD[1], Pblock_addr[2], Pblock_length[3]) + * ****************************************************************************/ acpi_status acpi_ex_create_processor ( - acpi_parse_object *op, - acpi_namespace_node *processor_node) + acpi_walk_state *walk_state) { - acpi_status status; - acpi_parse_object *arg; + acpi_operand_object **operand = &walk_state->operands[0]; acpi_operand_object *obj_desc; + acpi_status status; + + FUNCTION_TRACE_PTR ("Ex_create_processor", walk_state); - FUNCTION_TRACE_PTR ("Ex_create_processor", op); + /* Create the processor object */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_PROCESSOR); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } - /* Install the new processor object in the parent Node */ - - status = acpi_ns_attach_object (processor_node, obj_desc, - (u8) ACPI_TYPE_PROCESSOR); - if (ACPI_FAILURE (status)) { - acpi_ut_delete_object_desc (obj_desc); - return_ACPI_STATUS (status); - } - - /* Get first arg and verify existence */ - - arg = op->value.arg; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* First arg is the Processor ID */ - - obj_desc->processor.proc_id = (u8) arg->value.integer; - - /* Get second arg and verify existence */ - - arg = arg->next; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* Second arg is the PBlock Address */ + /* + * Initialize the processor object from the operands + */ + obj_desc->processor.proc_id = (u8) operand[1]->integer.value; + obj_desc->processor.address = (ACPI_IO_ADDRESS) operand[2]->integer.value; + obj_desc->processor.length = (u8) operand[3]->integer.value; - obj_desc->processor.address = (ACPI_IO_ADDRESS) arg->value.integer; + /* Install the processor object in the parent Node */ - /* Get third arg and verify existence */ + status = acpi_ns_attach_object ((acpi_namespace_node *) operand[0], + obj_desc, (u8) ACPI_TYPE_PROCESSOR); - arg = arg->next; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - /* Third arg is the PBlock Length */ + /* Remove local reference to the object */ - obj_desc->processor.length = (u8) arg->value.integer; - return_ACPI_STATUS (AE_OK); + acpi_ut_remove_reference (obj_desc); + return_ACPI_STATUS (status); } @@ -592,58 +423,44 @@ * * DESCRIPTION: Create a new Power_resource object and populate the fields * + * Power_resource (Name[0], System_level[1], Resource_order[2]) + * ****************************************************************************/ acpi_status acpi_ex_create_power_resource ( - acpi_parse_object *op, - acpi_namespace_node *power_node) + acpi_walk_state *walk_state) { + acpi_operand_object **operand = &walk_state->operands[0]; acpi_status status; - acpi_parse_object *arg; acpi_operand_object *obj_desc; - FUNCTION_TRACE_PTR ("Ex_create_power_resource", op); + FUNCTION_TRACE_PTR ("Ex_create_power_resource", walk_state); + + /* Create the power resource object */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_POWER); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } - /* Install the new power resource object in the parent Node */ - - status = acpi_ns_attach_object (power_node, obj_desc, - (u8) ACPI_TYPE_POWER); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS(status); - } + /* Initialize the power object from the operands */ + obj_desc->power_resource.system_level = (u8) operand[1]->integer.value; + obj_desc->power_resource.resource_order = (u16) operand[2]->integer.value; - /* Get first arg and verify existence */ + /* Install the power resource object in the parent Node */ - arg = op->value.arg; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* First arg is the System_level */ - - obj_desc->power_resource.system_level = (u8) arg->value.integer; - - /* Get second arg and check existence */ - - arg = arg->next; - if (!arg) { - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + status = acpi_ns_attach_object ((acpi_namespace_node *) operand[0], + obj_desc, (u8) ACPI_TYPE_POWER); - /* Second arg is the PBlock Address */ - obj_desc->power_resource.resource_order = (u16) arg->value.integer; + /* Remove local reference to the object */ - return_ACPI_STATUS (AE_OK); + acpi_ut_remove_reference (obj_desc); + return_ACPI_STATUS (status); } @@ -651,7 +468,7 @@ * * FUNCTION: Acpi_ex_create_method * - * PARAMETERS: Aml_ptr - First byte of the method's AML + * PARAMETERS: Aml_start - First byte of the method's AML * Aml_length - AML byte count for this method * Method_flags - AML method flag byte * Method - Method Node @@ -664,16 +481,17 @@ acpi_status acpi_ex_create_method ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, - u32 method_flags, - acpi_namespace_node *method) + acpi_walk_state *walk_state) { + acpi_operand_object **operand = &walk_state->operands[0]; acpi_operand_object *obj_desc; acpi_status status; + u8 method_flags; - FUNCTION_TRACE_PTR ("Ex_create_method", method); + FUNCTION_TRACE_PTR ("Ex_create_method", walk_state); /* Create a new method object */ @@ -683,18 +501,17 @@ return_ACPI_STATUS (AE_NO_MEMORY); } - /* Get the method's AML pointer/length from the Op */ + /* Save the method's AML pointer and length */ - obj_desc->method.pcode = aml_ptr; - obj_desc->method.pcode_length = aml_length; + obj_desc->method.aml_start = aml_start; + obj_desc->method.aml_length = aml_length; - /* - * First argument is the Method Flags (contains parameter count for the - * method) - */ - obj_desc->method.method_flags = (u8) method_flags; - obj_desc->method.param_count = (u8) (method_flags & - METHOD_FLAGS_ARG_COUNT); + /* disassemble the method flags */ + + method_flags = (u8) operand[1]->integer.value; + + obj_desc->method.method_flags = method_flags; + obj_desc->method.param_count = (u8) (method_flags & METHOD_FLAGS_ARG_COUNT); /* * Get the concurrency count. If required, a semaphore will be @@ -715,11 +532,16 @@ /* Attach the new object to the method Node */ - status = acpi_ns_attach_object (method, obj_desc, (u8) ACPI_TYPE_METHOD); - if (ACPI_FAILURE (status)) { - acpi_ut_delete_object_desc (obj_desc); - } + status = acpi_ns_attach_object ((acpi_namespace_node *) operand[0], + obj_desc, (u8) ACPI_TYPE_METHOD); + + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); + + /* Remove a reference to the operand */ + acpi_ut_remove_reference (operand[1]); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exdump.c linux/drivers/acpi/executer/exdump.c --- v2.4.13/linux/drivers/acpi/executer/exdump.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exdump.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exdump - Interpreter debug output routines - * $Revision: 123 $ + * $Revision: 126 $ * *****************************************************************************/ @@ -46,12 +46,12 @@ * FUNCTION: Acpi_ex_show_hex_value * * PARAMETERS: Byte_count - Number of bytes to print (1, 2, or 4) - * *Aml_ptr - Address in AML stream of bytes to print + * *Aml_start - Address in AML stream of bytes to print * Interpreter_mode - Current running mode (load1/Load2/Exec) * Lead_space - # of spaces to print ahead of value * 0 => none ahead but one behind * - * DESCRIPTION: Print Byte_count byte(s) starting at Aml_ptr as a single + * DESCRIPTION: Print Byte_count byte(s) starting at Aml_start as a single * value, in hex. If Byte_count > 1 or the value printed is > 9, also * print in decimal. * @@ -60,7 +60,7 @@ void acpi_ex_show_hex_value ( u32 byte_count, - u8 *aml_ptr, + u8 *aml_start, u32 lead_space) { u32 value; /* Value retrieved from AML stream */ @@ -72,7 +72,7 @@ FUNCTION_TRACE ("Ex_show_hex_value"); - if (!aml_ptr) { + if (!aml_start) { REPORT_ERROR (("Ex_show_hex_value: null pointer\n")); } @@ -80,9 +80,9 @@ * AML numbers are always stored little-endian, * even if the processor is big-endian. */ - for (current_aml_ptr = aml_ptr + byte_count, + for (current_aml_ptr = aml_start + byte_count, value = 0; - current_aml_ptr > aml_ptr; ) { + current_aml_ptr > aml_start; ) { value = (value << 8) + (u32)* --current_aml_ptr; } @@ -96,14 +96,12 @@ length += 3 + acpi_ex_digits_needed (value, 10); } - ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "")); - for (length = lead_space; length; --length ) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); } while (byte_count--) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, "%02x", *aml_ptr++)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, "%02x", *aml_start++)); if (byte_count) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " ")); @@ -111,7 +109,7 @@ } if (show_decimal_value) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " [%ld]", value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_LOAD, " [%d]", value)); } if (0 == lead_space) { @@ -163,12 +161,6 @@ return (AE_OK); } - if (acpi_tb_system_table_pointer (entry_desc)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%p is an AML pointer\n", - entry_desc)); - return (AE_OK); - } - if (!VALID_DESCRIPTOR_TYPE (entry_desc, ACPI_DESC_TYPE_INTERNAL)) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%p Is not a local object \n", entry_desc)); DUMP_BUFFER (entry_desc, sizeof (acpi_operand_object)); @@ -236,8 +228,9 @@ if (ACPI_TYPE_INTEGER == entry_desc->common.type) { /* Value is a Number */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%ld]", - entry_desc->integer.value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%8.8X%8.8x]", + HIDWORD(entry_desc->integer.value), + LODWORD(entry_desc->integer.value))); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); @@ -253,8 +246,9 @@ /* Value is a Number */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%ld]", - entry_desc->integer.value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " value is [%8.8X%8.8x]", + HIDWORD(entry_desc->integer.value), + LODWORD(entry_desc->integer.value))); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); @@ -262,7 +256,7 @@ case AML_INT_NAMEPATH_OP: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference.Node->Name %x\n", + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Reference.Node->Name %X\n", entry_desc->reference.node->name)); break; @@ -297,8 +291,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "Buffer Contents: ")); for (buf = entry_desc->buffer.pointer; length--; ++buf) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - length ? " %02x" : " %02x", *buf)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " %02x", *buf)); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO,"\n")); } @@ -371,8 +364,10 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " base %p Length %X\n", - entry_desc->region.address, entry_desc->region.length)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, " base %8.8X%8.8X Length %X\n", + HIDWORD(entry_desc->region.address), + LODWORD(entry_desc->region.address), + entry_desc->region.length)); } break; @@ -400,7 +395,7 @@ case INTERNAL_TYPE_REGION_FIELD: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "Region_field: bits=%X bitaccwidth=%X lock=%X update=%X at byte=%lX bit=%X of below:\n", + "Region_field: bits=%X bitaccwidth=%X lock=%X update=%X at byte=%X bit=%X of below:\n", entry_desc->field.bit_length, entry_desc->field.access_bit_width, entry_desc->field.lock_rule, entry_desc->field.update_rule, entry_desc->field.base_byte_offset, entry_desc->field.start_field_bit_offset)); @@ -417,7 +412,7 @@ case ACPI_TYPE_BUFFER_FIELD: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "Buffer_field: %X bits at byte %lX bit %X of \n", + "Buffer_field: %X bits at byte %X bit %X of \n", entry_desc->buffer_field.bit_length, entry_desc->buffer_field.base_byte_offset, entry_desc->buffer_field.start_field_bit_offset)); @@ -449,9 +444,9 @@ case ACPI_TYPE_METHOD: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, - "Method(%X) @ %p:%lX\n", + "Method(%X) @ %p:%X\n", entry_desc->method.param_count, - entry_desc->method.pcode, entry_desc->method.pcode_length)); + entry_desc->method.aml_start, entry_desc->method.aml_length)); break; @@ -608,7 +603,7 @@ } - acpi_os_printf ("%20s : %4.4s\n", "Name", &node->name); + acpi_os_printf ("%20s : %4.4s\n", "Name", (char*)&node->name); acpi_os_printf ("%20s : %s\n", "Type", acpi_ut_get_type_name (node->type)); acpi_os_printf ("%20s : %X\n", "Flags", node->flags); acpi_os_printf ("%20s : %X\n", "Owner Id", node->owner_id); @@ -730,8 +725,8 @@ acpi_os_printf ("%20s : %X\n", "Param_count", obj_desc->method.param_count); acpi_os_printf ("%20s : %X\n", "Concurrency", obj_desc->method.concurrency); acpi_os_printf ("%20s : %p\n", "Semaphore", obj_desc->method.semaphore); - acpi_os_printf ("%20s : %X\n", "Pcode_length", obj_desc->method.pcode_length); - acpi_os_printf ("%20s : %X\n", "Pcode", obj_desc->method.pcode); + acpi_os_printf ("%20s : %X\n", "Aml_length", obj_desc->method.aml_length); + acpi_os_printf ("%20s : %X\n", "Aml_start", obj_desc->method.aml_start); break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exdyadic.c linux/drivers/acpi/executer/exdyadic.c --- v2.4.13/linux/drivers/acpi/executer/exdyadic.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exdyadic.c Wed Dec 31 16:00:00 1969 @@ -1,874 +0,0 @@ -/****************************************************************************** - * - * Module Name: exdyadic - ACPI AML execution for dyadic (2-operand) operators - * $Revision: 88 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "acpi.h" -#include "acparser.h" -#include "acnamesp.h" -#include "acinterp.h" -#include "acevents.h" -#include "amlcode.h" -#include "acdispat.h" - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("exdyadic") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_do_concatenate - * - * PARAMETERS: *Obj_desc - Object to be converted. Must be an - * Integer, Buffer, or String - * Walk_state - Current walk state - * - * RETURN: Status - * - * DESCRIPTION: Concatenate two objects OF THE SAME TYPE. - * - ******************************************************************************/ - -acpi_status -acpi_ex_do_concatenate ( - acpi_operand_object *obj_desc, - acpi_operand_object *obj_desc2, - acpi_operand_object **actual_ret_desc, - acpi_walk_state *walk_state) -{ - acpi_status status; - u32 i; - acpi_integer this_integer; - acpi_operand_object *ret_desc; - NATIVE_CHAR *new_buf; - u32 integer_size = sizeof (acpi_integer); - - - FUNCTION_ENTRY (); - - - /* - * There are three cases to handle: - * 1) Two Integers concatenated to produce a buffer - * 2) Two Strings concatenated to produce a string - * 3) Two Buffers concatenated to produce a buffer - */ - switch (obj_desc->common.type) { - case ACPI_TYPE_INTEGER: - - /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper - * 32-bit field - */ - integer_size = sizeof (u32); - } - - /* Result of two integers is a buffer */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Need enough space for two integers */ - - ret_desc->buffer.length = integer_size * 2; - new_buf = ACPI_MEM_CALLOCATE (ret_desc->buffer.length); - if (!new_buf) { - REPORT_ERROR - (("Ex_do_concatenate: Buffer allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->buffer.pointer = (u8 *) new_buf; - - /* Convert the first integer */ - - this_integer = obj_desc->integer.value; - for (i = 0; i < integer_size; i++) { - new_buf[i] = (u8) this_integer; - this_integer >>= 8; - } - - /* Convert the second integer */ - - this_integer = obj_desc2->integer.value; - for (; i < (integer_size * 2); i++) { - new_buf[i] = (u8) this_integer; - this_integer >>= 8; - } - - break; - - - case ACPI_TYPE_STRING: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Operand1 is string */ - - new_buf = ACPI_MEM_ALLOCATE (obj_desc->string.length + - obj_desc2->string.length + 1); - if (!new_buf) { - REPORT_ERROR - (("Ex_do_concatenate: String allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - STRCPY (new_buf, obj_desc->string.pointer); - STRCPY (new_buf + obj_desc->string.length, - obj_desc2->string.pointer); - - /* Point the return object to the new string */ - - ret_desc->string.pointer = new_buf; - ret_desc->string.length = obj_desc->string.length += - obj_desc2->string.length; - break; - - - case ACPI_TYPE_BUFFER: - - /* Operand1 is a buffer */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - new_buf = ACPI_MEM_ALLOCATE (obj_desc->buffer.length + - obj_desc2->buffer.length); - if (!new_buf) { - REPORT_ERROR - (("Ex_do_concatenate: Buffer allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - MEMCPY (new_buf, obj_desc->buffer.pointer, - obj_desc->buffer.length); - MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer, - obj_desc2->buffer.length); - - /* - * Point the return object to the new buffer - */ - - ret_desc->buffer.pointer = (u8 *) new_buf; - ret_desc->buffer.length = obj_desc->buffer.length + - obj_desc2->buffer.length; - break; - - default: - status = AE_AML_INTERNAL; - ret_desc = NULL; - } - - - *actual_ret_desc = ret_desc; - return (AE_OK); - - -cleanup: - - acpi_ut_remove_reference (ret_desc); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic1 - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 1 dyadic operator with numeric operands: - * Notify_op - * - * ALLOCATION: Deletes both operands - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic1 ( - u16 opcode, - acpi_walk_state *walk_state) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_namespace_node *node; - acpi_status status = AE_OK; - - - FUNCTION_TRACE_PTR ("Ex_dyadic1", WALK_OPERANDS); - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_notify := Notify_op (0)Notify_object (1)Notify_value */ - - case AML_NOTIFY_OP: - - /* The Obj_desc is actually an Node */ - - node = (acpi_namespace_node *) operand[0]; - operand[0] = NULL; - - /* Object must be a device or thermal zone */ - - if (node && operand[1]) { - switch (node->type) { - case ACPI_TYPE_DEVICE: - case ACPI_TYPE_THERMAL: - - /* - * Dispatch the notify to the appropriate handler - * NOTE: the request is queued for execution after this method - * completes. The notify handlers are NOT invoked synchronously - * from this thread -- because handlers may in turn run other - * control methods. - */ - status = acpi_ev_queue_notify_request (node, - (u32) operand[1]->integer.value); - break; - - default: - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unexpected notify object type %X\n", - operand[0]->common.type)); - - status = AE_AML_OPERAND_TYPE; - break; - } - } - break; - - default: - - REPORT_ERROR (("Acpi_ex_dyadic1: Unknown dyadic opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - } - - - /* Always delete both operands */ - - acpi_ut_remove_reference (operand[1]); - acpi_ut_remove_reference (operand[0]); - - - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic2_r - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and - * one or two result operands. - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_operand_object *ret_desc2 = NULL; - acpi_status status = AE_OK; - - - FUNCTION_TRACE_U32 ("Ex_dyadic2_r", opcode); - - - /* Create an internal return object if necessary */ - - switch (opcode) { - case AML_ADD_OP: - case AML_BIT_AND_OP: - case AML_BIT_NAND_OP: - case AML_BIT_OR_OP: - case AML_BIT_NOR_OP: - case AML_BIT_XOR_OP: - case AML_DIVIDE_OP: - case AML_MOD_OP: - case AML_MULTIPLY_OP: - case AML_SHIFT_LEFT_OP: - case AML_SHIFT_RIGHT_OP: - case AML_SUBTRACT_OP: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - break; - } - - - /* - * Execute the opcode - */ - switch (opcode) { - - /* Def_add := Add_op Operand1 Operand2 Result */ - - case AML_ADD_OP: - - ret_desc->integer.value = operand[0]->integer.value + - operand[1]->integer.value; - break; - - - /* Def_and := And_op Operand1 Operand2 Result */ - - case AML_BIT_AND_OP: - - ret_desc->integer.value = operand[0]->integer.value & - operand[1]->integer.value; - break; - - - /* Def_nAnd := NAnd_op Operand1 Operand2 Result */ - - case AML_BIT_NAND_OP: - - ret_desc->integer.value = ~(operand[0]->integer.value & - operand[1]->integer.value); - break; - - - /* Def_or := Or_op Operand1 Operand2 Result */ - - case AML_BIT_OR_OP: - - ret_desc->integer.value = operand[0]->integer.value | - operand[1]->integer.value; - break; - - - /* Def_nOr := NOr_op Operand1 Operand2 Result */ - - case AML_BIT_NOR_OP: - - ret_desc->integer.value = ~(operand[0]->integer.value | - operand[1]->integer.value); - break; - - - /* Def_xOr := XOr_op Operand1 Operand2 Result */ - - case AML_BIT_XOR_OP: - - ret_desc->integer.value = operand[0]->integer.value ^ - operand[1]->integer.value; - break; - - - /* Def_divide := Divide_op Dividend Divisor Remainder Quotient */ - - case AML_DIVIDE_OP: - - if (!operand[1]->integer.value) { - REPORT_ERROR - (("Divide_op: Divide by zero\n")); - - status = AE_AML_DIVIDE_BY_ZERO; - goto cleanup; - } - - ret_desc2 = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc2) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Remainder (modulo) */ - - ret_desc->integer.value = ACPI_MODULO (operand[0]->integer.value, - operand[1]->integer.value); - - /* Result (what we used to call the quotient) */ - - ret_desc2->integer.value = ACPI_DIVIDE (operand[0]->integer.value, - operand[1]->integer.value); - break; - - - /* Def_mod := Mod_op Dividend Divisor Remainder */ - - case AML_MOD_OP: /* ACPI 2.0 */ - - if (!operand[1]->integer.value) { - REPORT_ERROR - (("Mod_op: Divide by zero\n")); - - status = AE_AML_DIVIDE_BY_ZERO; - goto cleanup; - } - - /* Remainder (modulo) */ - - ret_desc->integer.value = ACPI_MODULO (operand[0]->integer.value, - operand[1]->integer.value); - break; - - - /* Def_multiply := Multiply_op Operand1 Operand2 Result */ - - case AML_MULTIPLY_OP: - - ret_desc->integer.value = operand[0]->integer.value * - operand[1]->integer.value; - break; - - - /* Def_shift_left := Shift_left_op Operand Shift_count Result */ - - case AML_SHIFT_LEFT_OP: - - ret_desc->integer.value = operand[0]->integer.value << - operand[1]->integer.value; - break; - - - /* Def_shift_right := Shift_right_op Operand Shift_count Result */ - - case AML_SHIFT_RIGHT_OP: - - ret_desc->integer.value = operand[0]->integer.value >> - operand[1]->integer.value; - break; - - - /* Def_subtract := Subtract_op Operand1 Operand2 Result */ - - case AML_SUBTRACT_OP: - - ret_desc->integer.value = operand[0]->integer.value - - operand[1]->integer.value; - break; - - - /* Def_concat := Concat_op Data1 Data2 Result */ - - case AML_CONCAT_OP: - - /* - * Convert the second operand if necessary. The first operand - * determines the type of the second operand, (See the Data Types - * section of the ACPI specification.) Both object types are - * guaranteed to be either Integer/String/Buffer by the operand - * resolution mechanism above. - */ - switch (operand[0]->common.type) { - case ACPI_TYPE_INTEGER: - status = acpi_ex_convert_to_integer (operand[1], &operand[1], walk_state); - break; - - case ACPI_TYPE_STRING: - status = acpi_ex_convert_to_string (operand[1], &operand[1], 16, ACPI_UINT32_MAX, walk_state); - break; - - case ACPI_TYPE_BUFFER: - status = acpi_ex_convert_to_buffer (operand[1], &operand[1], walk_state); - break; - - default: - status = AE_AML_INTERNAL; - } - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* - * Both operands are now known to be the same object type - * (Both are Integer, String, or Buffer), and we can now perform the - * concatenation. - */ - status = acpi_ex_do_concatenate (operand[0], operand[1], &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - break; - - - /* Def_to_string := Buffer, Length, Result */ - - case AML_TO_STRING_OP: /* ACPI 2.0 */ - - status = acpi_ex_convert_to_string (operand[0], &ret_desc, 16, - (u32) operand[1]->integer.value, walk_state); - break; - - - /* Def_concat_res := Buffer, Buffer, Result */ - - case AML_CONCAT_RES_OP: /* ACPI 2.0 */ - - status = AE_NOT_IMPLEMENTED; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_ex_dyadic2_r: Unknown dyadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Store the result of the operation (which is now in Operand[0]) into - * the result descriptor, or the location pointed to by the result - * descriptor (Operand[2]). - */ - status = acpi_ex_store (ret_desc, operand[2], walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - if (AML_DIVIDE_OP == opcode) { - status = acpi_ex_store (ret_desc2, operand[3], walk_state); - - /* - * Since the remainder is not returned, remove a reference to - * the object we created earlier - */ - acpi_ut_remove_reference (ret_desc); - *return_desc = ret_desc2; - } - - else { - *return_desc = ret_desc; - } - - -cleanup: - - /* Always delete the operands */ - - acpi_ut_remove_reference (operand[0]); - acpi_ut_remove_reference (operand[1]); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status)) { - /* On failure, delete the result ops */ - - acpi_ut_remove_reference (operand[2]); - acpi_ut_remove_reference (operand[3]); - - if (ret_desc) { - /* And delete the internal return object */ - - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic2_s - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic synchronization operator - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic2_s ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_status status; - - - FUNCTION_TRACE_PTR ("Ex_dyadic2_s", WALK_OPERANDS); - - - /* Create the internal return object */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Default return value is FALSE, operation did not time out */ - - ret_desc->integer.value = 0; - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_acquire := Acquire_op Mutex_object Timeout */ - - case AML_ACQUIRE_OP: - - status = acpi_ex_acquire_mutex (operand[1], operand[0], walk_state); - break; - - - /* Def_wait := Wait_op Acpi_event_object Timeout */ - - case AML_WAIT_OP: - - status = acpi_ex_system_wait_event (operand[1], operand[0]); - break; - - - default: - - REPORT_ERROR (("Acpi_ex_dyadic2_s: Unknown dyadic synchronization opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Return a boolean indicating if operation timed out - * (TRUE) or not (FALSE) - */ - if (status == AE_TIME) { - ret_desc->integer.value = ACPI_INTEGER_MAX; /* TRUE, op timed out */ - status = AE_OK; - } - - -cleanup: - - /* Delete params */ - - acpi_ut_remove_reference (operand[1]); - acpi_ut_remove_reference (operand[0]); - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_dyadic2 - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and - * no result operands - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * containing result value - * - ******************************************************************************/ - -acpi_status -acpi_ex_dyadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_status status = AE_OK; - u8 lboolean; - - - FUNCTION_TRACE_PTR ("Ex_dyadic2", WALK_OPERANDS); - - - /* Create the internal return object */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Execute the Opcode - */ - lboolean = FALSE; - switch (opcode) { - - /* Def_lAnd := LAnd_op Operand1 Operand2 */ - - case AML_LAND_OP: - - lboolean = (u8) (operand[0]->integer.value && - operand[1]->integer.value); - break; - - - /* Def_lEqual := LEqual_op Operand1 Operand2 */ - - case AML_LEQUAL_OP: - - lboolean = (u8) (operand[0]->integer.value == - operand[1]->integer.value); - break; - - - /* Def_lGreater := LGreater_op Operand1 Operand2 */ - - case AML_LGREATER_OP: - - lboolean = (u8) (operand[0]->integer.value > - operand[1]->integer.value); - break; - - - /* Def_lLess := LLess_op Operand1 Operand2 */ - - case AML_LLESS_OP: - - lboolean = (u8) (operand[0]->integer.value < - operand[1]->integer.value); - break; - - - /* Def_lOr := LOr_op Operand1 Operand2 */ - - case AML_LOR_OP: - - lboolean = (u8) (operand[0]->integer.value || - operand[1]->integer.value); - break; - - - /* Def_copy := Source, Destination */ - - case AML_COPY_OP: /* ACPI 2.0 */ - - status = AE_NOT_IMPLEMENTED; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_ex_dyadic2: Unknown dyadic opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - break; - } - - - /* Set return value to logical TRUE (all ones) or FALSE (zero) */ - - if (lboolean) { - ret_desc->integer.value = ACPI_INTEGER_MAX; - } - else { - ret_desc->integer.value = 0; - } - - -cleanup: - - /* Always delete operands */ - - acpi_ut_remove_reference (operand[0]); - acpi_ut_remove_reference (operand[1]); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - - diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exfldio.c linux/drivers/acpi/executer/exfldio.c --- v2.4.13/linux/drivers/acpi/executer/exfldio.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exfldio.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: exfldio - Aml Field I/O - * $Revision: 64 $ + * $Revision: 66 $ * *****************************************************************************/ @@ -71,7 +71,6 @@ return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } - /* * If the Region Address and Length have not been previously evaluated, * evaluate them now and save the results. @@ -84,7 +83,6 @@ } } - /* * Validate the request. The entire request from the byte offset for a * length of one field datum (access width) must fit within the region. @@ -158,7 +156,6 @@ *value = 0; - /* * Buffer_fields - Read from a Buffer * Other Fields - Read from a Operation Region. @@ -189,7 +186,6 @@ return_ACPI_STATUS (status); } - /* * The physical address of this field datum is: * @@ -201,13 +197,12 @@ address = rgn_desc->region.address + obj_desc->common_field.base_byte_offset + field_datum_byte_offset; - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Region %s(%X) width %X base:off %X:%X at %8.8lX%8.8lX\n", + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Region %s(%X) width %X base:off %X:%X at %8.8X%8.8X\n", acpi_ut_get_region_name (rgn_desc->region.space_id), rgn_desc->region.space_id, obj_desc->common_field.access_bit_width, obj_desc->common_field.base_byte_offset, field_datum_byte_offset, HIDWORD(address), LODWORD(address))); - /* Invoke the appropriate Address_space/Op_region handler */ status = acpi_ev_address_space_dispatch (rgn_desc, ACPI_READ_ADR_SPACE, @@ -235,7 +230,7 @@ } - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Returned value=%08lX \n", *value)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Returned value=%08X \n", *value)); return_ACPI_STATUS (status); } @@ -381,7 +376,6 @@ byte_field_length, datum_count, obj_desc->common_field.access_bit_width, obj_desc->common_field.access_byte_width)); - /* * Clear the caller's buffer (the whole buffer length as given) * This is very important, especially in the cases where a byte is read, @@ -485,7 +479,6 @@ } } - /* * Store the merged field datum in the caller's buffer, according to * the granularity of the field (size of each datum). @@ -501,7 +494,6 @@ datum_offset++; } - return_ACPI_STATUS (AE_OK); } @@ -576,7 +568,7 @@ field_datum_byte_offset; ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, - "Store %X in Region %s(%X) at %8.8lX%8.8lX width %X\n", + "Store %X in Region %s(%X) at %8.8X%8.8X width %X\n", value, acpi_ut_get_region_name (rgn_desc->region.space_id), rgn_desc->region.space_id, HIDWORD(address), LODWORD(address), obj_desc->common_field.access_bit_width)); @@ -612,7 +604,7 @@ } - ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value written=%08lX \n", value)); + ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Value written=%08X \n", value)); return_ACPI_STATUS (status); } @@ -649,16 +641,13 @@ merged_value = field_value; - /* If the mask is all ones, we don't need to worry about the update rule */ if (mask != ACPI_UINT32_MAX) { /* Decode the update rule */ switch (obj_desc->common_field.update_rule) { - case UPDATE_PRESERVE: - /* * Check if update rule needs to be applied (not if mask is all * ones) The left shift drops the bits we want to ignore. @@ -772,7 +761,6 @@ byte_field_length, datum_count, obj_desc->common_field.access_bit_width, obj_desc->common_field.access_byte_width)); - /* * Break the request into up to three parts (similar to an I/O request): * 1) non-aligned part at start @@ -868,31 +856,34 @@ merged_datum = this_raw_datum; } - /* * Special handling for the last datum if the field does NOT end on * a datum boundary. Update Rule must be applied to the bits outside * the field. */ - if ((datum_offset == datum_count) && - obj_desc->common_field.end_field_valid_bits) { + if (datum_offset == datum_count) { /* - * Part3: - * This is the last datum and the field does not end on a datum boundary. - * Build the partial datum and write with the update rule. + * If there are dangling non-aligned bits, perform one more merged write + * Else - field is aligned at the end, no need for any more writes */ + if (obj_desc->common_field.end_field_valid_bits) { + /* + * Part3: + * This is the last datum and the field does not end on a datum boundary. + * Build the partial datum and write with the update rule. + * + * Mask off the unused bits above (after) the end-of-field + */ + mask = MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits); + merged_datum &= mask; - /* Mask off the unused bits above (after) the end-of-field */ - - mask = MASK_BITS_ABOVE (obj_desc->common_field.end_field_valid_bits); - merged_datum &= mask; - - /* Write the last datum with the update rule */ + /* Write the last datum with the update rule */ - status = acpi_ex_write_field_datum_with_update_rule (obj_desc, mask, - merged_datum, field_datum_byte_offset); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); + status = acpi_ex_write_field_datum_with_update_rule (obj_desc, mask, + merged_datum, field_datum_byte_offset); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } } } @@ -912,7 +903,6 @@ */ previous_raw_datum = this_raw_datum; } - return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exmisc.c linux/drivers/acpi/executer/exmisc.c --- v2.4.13/linux/drivers/acpi/executer/exmisc.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exmisc.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes - * $Revision: 83 $ + * $Revision: 92 $ * *****************************************************************************/ @@ -38,424 +38,403 @@ /******************************************************************************* * - * FUNCTION: Acpi_ex_triadic + * FUNCTION: Acpi_ex_get_object_reference * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current walk state - * Return_desc - Where to store the return object + * PARAMETERS: Obj_desc - Create a reference to this object + * Return_desc - Where to store the reference * * RETURN: Status * - * DESCRIPTION: Execute Triadic operator (3 operands) - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack + * DESCRIPTION: Obtain and return a "reference" to the target object + * Common code for the Ref_of_op and the Cond_ref_of_op. * ******************************************************************************/ acpi_status -acpi_ex_triadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) +acpi_ex_get_object_reference ( + acpi_operand_object *obj_desc, + acpi_operand_object **return_desc, + acpi_walk_state *walk_state) { - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_operand_object *tmp_desc; - ACPI_SIGNAL_FATAL_INFO *fatal; acpi_status status = AE_OK; - FUNCTION_TRACE ("Ex_triadic"); - - -#define obj_desc1 operand[0] -#define obj_desc2 operand[1] -#define res_desc operand[2] - - - switch (opcode) { - - case AML_FATAL_OP: - - /* Def_fatal := Fatal_op Fatal_type Fatal_code Fatal_arg */ + FUNCTION_TRACE_PTR ("Ex_get_object_reference", obj_desc); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "Fatal_op: Type %x Code %x Arg %x <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", - (u32) obj_desc1->integer.value, (u32) obj_desc2->integer.value, - (u32) res_desc->integer.value)); - - fatal = ACPI_MEM_ALLOCATE (sizeof (ACPI_SIGNAL_FATAL_INFO)); - if (fatal) { - fatal->type = (u32) obj_desc1->integer.value; - fatal->code = (u32) obj_desc2->integer.value; - fatal->argument = (u32) res_desc->integer.value; + if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { + if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) { + *return_desc = NULL; + status = AE_TYPE; + goto cleanup; } /* - * Signal the OS + * Not a Name -- an indirect name pointer would have + * been converted to a direct name pointer in Acpi_ex_resolve_operands */ - acpi_os_signal (ACPI_SIGNAL_FATAL, fatal); - - /* Might return while OS is shutting down */ - - ACPI_MEM_FREE (fatal); - break; - + switch (obj_desc->reference.opcode) { + case AML_LOCAL_OP: + case AML_ARG_OP: - case AML_MID_OP: - - /* Def_mid := Mid_op Source Index Length Result */ - - /* Create the internal return object (string or buffer) */ - - break; - - - case AML_INDEX_OP: - - /* Def_index := Index_op Source Index Destination */ + *return_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode, + obj_desc->reference.offset, walk_state); + break; - /* Create the internal return object */ + default: - ret_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!ret_desc) { - status = AE_NO_MEMORY; + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(Internal) Unknown Ref subtype %02x\n", + obj_desc->reference.opcode)); + *return_desc = NULL; + status = AE_AML_INTERNAL; goto cleanup; } - /* - * At this point, the Obj_desc1 operand is either a Package or a Buffer - */ - if (obj_desc1->common.type == ACPI_TYPE_PACKAGE) { - /* Object to be indexed is a Package */ + } - if (obj_desc2->integer.value >= obj_desc1->package.count) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond package end\n")); - status = AE_AML_PACKAGE_LIMIT; - goto cleanup; - } - - if ((res_desc->common.type == INTERNAL_TYPE_REFERENCE) && - (res_desc->reference.opcode == AML_ZERO_OP)) { - /* - * There is no actual result descriptor (the Zero_op Result - * descriptor is a placeholder), so just delete the placeholder and - * return a reference to the package element - */ - acpi_ut_remove_reference (res_desc); - } - - else { - /* - * Each element of the package is an internal object. Get the one - * we are after. - */ - tmp_desc = obj_desc1->package.elements[obj_desc2->integer.value]; - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = tmp_desc->common.type; - ret_desc->reference.object = tmp_desc; - - status = acpi_ex_store (ret_desc, res_desc, walk_state); - ret_desc->reference.object = NULL; - } + else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { + /* Must be a named object; Just return the Node */ - /* - * The local return object must always be a reference to the package element, - * not the element itself. - */ - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = ACPI_TYPE_PACKAGE; - ret_desc->reference.where = &obj_desc1->package.elements[obj_desc2->integer.value]; - } - - else { - /* Object to be indexed is a Buffer */ - - if (obj_desc2->integer.value >= obj_desc1->buffer.length) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond end of buffer\n")); - status = AE_AML_BUFFER_LIMIT; - goto cleanup; - } - - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = ACPI_TYPE_BUFFER_FIELD; - ret_desc->reference.object = obj_desc1; - ret_desc->reference.offset = (u32) obj_desc2->integer.value; + *return_desc = obj_desc; + } - status = acpi_ex_store (ret_desc, res_desc, walk_state); - } - break; + else { + *return_desc = NULL; + status = AE_TYPE; } cleanup: - /* Always delete operands */ - - acpi_ut_remove_reference (obj_desc1); - acpi_ut_remove_reference (obj_desc2); - - /* Delete return object on error */ - - if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (res_desc); - - if (ret_desc) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p Ref=%p\n", obj_desc, *return_desc)); return_ACPI_STATUS (status); } /******************************************************************************* * - * FUNCTION: Acpi_ex_hexadic + * FUNCTION: Acpi_ex_do_concatenate * - * PARAMETERS: Opcode - The opcode to be executed + * PARAMETERS: *Obj_desc - Object to be converted. Must be an + * Integer, Buffer, or String * Walk_state - Current walk state - * Return_desc - Where to store the return object * * RETURN: Status * - * DESCRIPTION: Execute Match operator + * DESCRIPTION: Concatenate two objects OF THE SAME TYPE. * ******************************************************************************/ acpi_status -acpi_ex_hexadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) +acpi_ex_do_concatenate ( + acpi_operand_object *obj_desc, + acpi_operand_object *obj_desc2, + acpi_operand_object **actual_return_desc, + acpi_walk_state *walk_state) { - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_status status = AE_OK; - u32 index; - u32 match_value = (u32) -1; + acpi_status status; + u32 i; + acpi_integer this_integer; + acpi_operand_object *return_desc; + NATIVE_CHAR *new_buf; + u32 integer_size = sizeof (acpi_integer); - FUNCTION_TRACE ("Ex_hexadic"); + FUNCTION_ENTRY (); -#define pkg_desc operand[0] -#define op1_desc operand[1] -#define V1_desc operand[2] -#define op2_desc operand[3] -#define V2_desc operand[4] -#define start_desc operand[5] + /* + * There are three cases to handle: + * 1) Two Integers concatenated to produce a buffer + * 2) Two Strings concatenated to produce a string + * 3) Two Buffers concatenated to produce a buffer + */ + switch (obj_desc->common.type) { + case ACPI_TYPE_INTEGER: - switch (opcode) { + /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - case AML_MATCH_OP: + if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { + /* + * We are running a method that exists in a 32-bit ACPI table. + * Truncate the value to 32 bits by zeroing out the upper + * 32-bit field + */ + integer_size = sizeof (u32); + } - /* Validate match comparison sub-opcodes */ + /* Result of two integers is a buffer */ - if ((op1_desc->integer.value > MAX_MATCH_OPERATOR) || - (op2_desc->integer.value > MAX_MATCH_OPERATOR)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "operation encoding out of range\n")); - status = AE_AML_OPERAND_VALUE; - goto cleanup; + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); + if (!return_desc) { + return (AE_NO_MEMORY); } - index = (u32) start_desc->integer.value; - if (index >= (u32) pkg_desc->package.count) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Start position value out of range\n")); - status = AE_AML_PACKAGE_LIMIT; + /* Need enough space for two integers */ + + return_desc->buffer.length = integer_size * 2; + new_buf = ACPI_MEM_CALLOCATE (return_desc->buffer.length); + if (!new_buf) { + REPORT_ERROR + (("Ex_do_concatenate: Buffer allocation failure\n")); + status = AE_NO_MEMORY; goto cleanup; } - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { + return_desc->buffer.pointer = (u8 *) new_buf; + + /* Convert the first integer */ + + this_integer = obj_desc->integer.value; + for (i = 0; i < integer_size; i++) { + new_buf[i] = (u8) this_integer; + this_integer >>= 8; + } + + /* Convert the second integer */ + + this_integer = obj_desc2->integer.value; + for (; i < (integer_size * 2); i++) { + new_buf[i] = (u8) this_integer; + this_integer >>= 8; + } + + break; + + + case ACPI_TYPE_STRING: + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_STRING); + if (!return_desc) { + return (AE_NO_MEMORY); + } + + /* Operand0 is string */ + + new_buf = ACPI_MEM_ALLOCATE (obj_desc->string.length + + obj_desc2->string.length + 1); + if (!new_buf) { + REPORT_ERROR + (("Ex_do_concatenate: String allocation failure\n")); status = AE_NO_MEMORY; goto cleanup; + } + + STRCPY (new_buf, obj_desc->string.pointer); + STRCPY (new_buf + obj_desc->string.length, + obj_desc2->string.pointer); + + /* Point the return object to the new string */ + + return_desc->string.pointer = new_buf; + return_desc->string.length = obj_desc->string.length += + obj_desc2->string.length; + break; + + + case ACPI_TYPE_BUFFER: + + /* Operand0 is a buffer */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_BUFFER); + if (!return_desc) { + return (AE_NO_MEMORY); + } + new_buf = ACPI_MEM_ALLOCATE (obj_desc->buffer.length + + obj_desc2->buffer.length); + if (!new_buf) { + REPORT_ERROR + (("Ex_do_concatenate: Buffer allocation failure\n")); + status = AE_NO_MEMORY; + goto cleanup; } + MEMCPY (new_buf, obj_desc->buffer.pointer, + obj_desc->buffer.length); + MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer, + obj_desc2->buffer.length); + /* - * Examine each element until a match is found. Within the loop, - * "continue" signifies that the current element does not match - * and the next should be examined. - * Upon finding a match, the loop will terminate via "break" at - * the bottom. If it terminates "normally", Match_value will be -1 - * (its initial value) indicating that no match was found. When - * returned as a Number, this will produce the Ones value as specified. + * Point the return object to the new buffer */ - for ( ; index < pkg_desc->package.count; ++index) { - /* - * Treat any NULL or non-numeric elements as non-matching. - * TBD [Unhandled] - if an element is a Name, - * should we examine its value? - */ - if (!pkg_desc->package.elements[index] || - ACPI_TYPE_INTEGER != pkg_desc->package.elements[index]->common.type) { - continue; - } - /* - * Within these switch statements: - * "break" (exit from the switch) signifies a match; - * "continue" (proceed to next iteration of enclosing - * "for" loop) signifies a non-match. - */ - switch (op1_desc->integer.value) { + return_desc->buffer.pointer = (u8 *) new_buf; + return_desc->buffer.length = obj_desc->buffer.length + + obj_desc2->buffer.length; + break; - case MATCH_MTR: /* always true */ - break; + default: + status = AE_AML_INTERNAL; + return_desc = NULL; + } - case MATCH_MEQ: /* true if equal */ + *actual_return_desc = return_desc; + return (AE_OK); - if (pkg_desc->package.elements[index]->integer.value - != V1_desc->integer.value) { - continue; - } - break; +cleanup: - case MATCH_MLE: /* true if less than or equal */ + acpi_ut_remove_reference (return_desc); + return (status); +} - if (pkg_desc->package.elements[index]->integer.value - > V1_desc->integer.value) { - continue; - } - break; +/******************************************************************************* + * + * FUNCTION: Acpi_ex_do_math_op + * + * PARAMETERS: Opcode - AML opcode + * Operand0 - Integer operand #0 + * Operand0 - Integer operand #1 + * + * RETURN: Integer result of the operation + * + * DESCRIPTION: Execute a math AML opcode. The purpose of having all of the + * math functions here is to prevent a lot of pointer dereferencing + * to obtain the operands. + * + ******************************************************************************/ - case MATCH_MLT: /* true if less than */ +acpi_integer +acpi_ex_do_math_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1) +{ - if (pkg_desc->package.elements[index]->integer.value - >= V1_desc->integer.value) { - continue; - } - break; + switch (opcode) { + case AML_ADD_OP: /* Add (Operand0, Operand1, Result) */ - case MATCH_MGE: /* true if greater than or equal */ + return (operand0 + operand1); - if (pkg_desc->package.elements[index]->integer.value - < V1_desc->integer.value) { - continue; - } - break; + case AML_BIT_AND_OP: /* And (Operand0, Operand1, Result) */ - case MATCH_MGT: /* true if greater than */ + return (operand0 & operand1); - if (pkg_desc->package.elements[index]->integer.value - <= V1_desc->integer.value) { - continue; - } - break; + case AML_BIT_NAND_OP: /* NAnd (Operand0, Operand1, Result) */ - default: /* undefined */ + return (~(operand0 & operand1)); - continue; - } + case AML_BIT_OR_OP: /* Or (Operand0, Operand1, Result) */ - switch(op2_desc->integer.value) { + return (operand0 | operand1); - case MATCH_MTR: - break; + case AML_BIT_NOR_OP: /* NOr (Operand0, Operand1, Result) */ + return (~(operand0 | operand1)); - case MATCH_MEQ: - if (pkg_desc->package.elements[index]->integer.value - != V2_desc->integer.value) { - continue; - } - break; + case AML_BIT_XOR_OP: /* XOr (Operand0, Operand1, Result) */ + return (operand0 ^ operand1); - case MATCH_MLE: - if (pkg_desc->package.elements[index]->integer.value - > V2_desc->integer.value) { - continue; - } - break; + case AML_MULTIPLY_OP: /* Multiply (Operand0, Operand1, Result) */ + return (operand0 * operand1); - case MATCH_MLT: - if (pkg_desc->package.elements[index]->integer.value - >= V2_desc->integer.value) { - continue; - } - break; + case AML_SHIFT_LEFT_OP: /* Shift_left (Operand, Shift_count, Result) */ + return (operand0 << operand1); - case MATCH_MGE: - if (pkg_desc->package.elements[index]->integer.value - < V2_desc->integer.value) { - continue; - } - break; + case AML_SHIFT_RIGHT_OP: /* Shift_right (Operand, Shift_count, Result) */ + return (operand0 >> operand1); - case MATCH_MGT: - if (pkg_desc->package.elements[index]->integer.value - <= V2_desc->integer.value) { - continue; - } - break; + case AML_SUBTRACT_OP: /* Subtract (Operand0, Operand1, Result) */ + return (operand0 - operand1); - default: + default: - continue; - } + return (0); + } +} - /* Match found: exit from loop */ - match_value = index; - break; +/******************************************************************************* + * + * FUNCTION: Acpi_ex_do_logical_op + * + * PARAMETERS: Opcode - AML opcode + * Operand0 - Integer operand #0 + * Operand0 - Integer operand #1 + * + * RETURN: TRUE/FALSE result of the operation + * + * DESCRIPTION: Execute a logical AML opcode. The purpose of having all of the + * functions here is to prevent a lot of pointer dereferencing + * to obtain the operands and to simplify the generation of the + * logical value. + * + * Note: cleanest machine code seems to be produced by the code + * below, rather than using statements of the form: + * Result = (Operand0 == Operand1); + * + ******************************************************************************/ + +u8 +acpi_ex_do_logical_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1) +{ + + + switch (opcode) { + + case AML_LAND_OP: /* LAnd (Operand0, Operand1) */ + + if (operand0 && operand1) { + return (TRUE); } + break; - /* Match_value is the return value */ - ret_desc->integer.value = match_value; + case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */ + + if (operand0 == operand1) { + return (TRUE); + } break; - } + case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */ -cleanup: + if (operand0 > operand1) { + return (TRUE); + } + break; - /* Free the operands */ - acpi_ut_remove_reference (start_desc); - acpi_ut_remove_reference (V2_desc); - acpi_ut_remove_reference (op2_desc); - acpi_ut_remove_reference (V1_desc); - acpi_ut_remove_reference (op1_desc); - acpi_ut_remove_reference (pkg_desc); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } + case AML_LLESS_OP: /* LLess (Operand0, Operand1) */ + if (operand0 < operand1) { + return (TRUE); + } + break; - /* Set the return object and exit */ - *return_desc = ret_desc; - return_ACPI_STATUS (status); + case AML_LOR_OP: /* LOr (Operand0, Operand1) */ + + if (operand0 || operand1) { + return (TRUE); + } + break; + } + + return (FALSE); } + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exmonad.c linux/drivers/acpi/executer/exmonad.c --- v2.4.13/linux/drivers/acpi/executer/exmonad.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exmonad.c Wed Dec 31 16:00:00 1969 @@ -1,970 +0,0 @@ - -/****************************************************************************** - * - * Module Name: exmonad - ACPI AML execution for monadic (1 operand) operators - * $Revision: 111 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "acpi.h" -#include "acparser.h" -#include "acdispat.h" -#include "acinterp.h" -#include "amlcode.h" -#include "acnamesp.h" - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("exmonad") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_get_object_reference - * - * PARAMETERS: Obj_desc - Create a reference to this object - * Ret_desc - Where to store the reference - * - * RETURN: Status - * - * DESCRIPTION: Obtain and return a "reference" to the target object - * Common code for the Ref_of_op and the Cond_ref_of_op. - * - ******************************************************************************/ - -static acpi_status -acpi_ex_get_object_reference ( - acpi_operand_object *obj_desc, - acpi_operand_object **ret_desc, - acpi_walk_state *walk_state) -{ - acpi_status status = AE_OK; - - - FUNCTION_TRACE_PTR ("Ex_get_object_reference", obj_desc); - - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { - if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) { - *ret_desc = NULL; - status = AE_TYPE; - goto cleanup; - } - - /* - * Not a Name -- an indirect name pointer would have - * been converted to a direct name pointer in Acpi_ex_resolve_operands - */ - switch (obj_desc->reference.opcode) { - case AML_LOCAL_OP: - case AML_ARG_OP: - - *ret_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state); - break; - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(Internal) Unknown Ref subtype %02x\n", - obj_desc->reference.opcode)); - *ret_desc = NULL; - status = AE_AML_INTERNAL; - goto cleanup; - } - - } - - else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Must be a named object; Just return the Node */ - - *ret_desc = obj_desc; - } - - else { - *ret_desc = NULL; - status = AE_TYPE; - } - - -cleanup: - - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p Ref=%p\n", obj_desc, *ret_desc)); - return_ACPI_STATUS (status); -} - -#define obj_desc operand[0] -#define res_desc operand[1] - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_monadic1 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on - * object stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_monadic1 ( - u16 opcode, - acpi_walk_state *walk_state) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_status status; - - - FUNCTION_TRACE_PTR ("Ex_monadic1", WALK_OPERANDS); - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_release := Release_op Mutex_object */ - - case AML_RELEASE_OP: - - status = acpi_ex_release_mutex (obj_desc, walk_state); - break; - - - /* Def_reset := Reset_op Acpi_event_object */ - - case AML_RESET_OP: - - status = acpi_ex_system_reset_event (obj_desc); - break; - - - /* Def_signal := Signal_op Acpi_event_object */ - - case AML_SIGNAL_OP: - - status = acpi_ex_system_signal_event (obj_desc); - break; - - - /* Def_sleep := Sleep_op Msec_time */ - - case AML_SLEEP_OP: - - acpi_ex_system_do_suspend ((u32) obj_desc->integer.value); - break; - - - /* Def_stall := Stall_op Usec_time */ - - case AML_STALL_OP: - - acpi_ex_system_do_stall ((u32) obj_desc->integer.value); - break; - - - /* Unknown opcode */ - - default: - - REPORT_ERROR (("Acpi_ex_monadic1: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - break; - - } /* switch */ - - - /* Always delete the operand */ - - acpi_ut_remove_reference (obj_desc); - - return_ACPI_STATUS (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_monadic2_r - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 monadic operator with numeric operand and - * result operand on operand stack - * - ******************************************************************************/ - -acpi_status -acpi_ex_monadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *ret_desc = NULL; - acpi_operand_object *ret_desc2 = NULL; - u32 res_val; - acpi_status status = AE_OK; - u32 i; - u32 j; - acpi_integer digit; - - - FUNCTION_TRACE_PTR ("Ex_monadic2_r", WALK_OPERANDS); - - - /* Create a return object of type NUMBER for most opcodes */ - - switch (opcode) { - case AML_BIT_NOT_OP: - case AML_FIND_SET_LEFT_BIT_OP: - case AML_FIND_SET_RIGHT_BIT_OP: - case AML_FROM_BCD_OP: - case AML_TO_BCD_OP: - case AML_COND_REF_OF_OP: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - break; - } - - - switch (opcode) { - /* Def_not := Not_op Operand Result */ - - case AML_BIT_NOT_OP: - - ret_desc->integer.value = ~obj_desc->integer.value; - break; - - - /* Def_find_set_left_bit := Find_set_left_bit_op Operand Result */ - - case AML_FIND_SET_LEFT_BIT_OP: - - ret_desc->integer.value = obj_desc->integer.value; - - /* - * Acpi specification describes Integer type as a little - * endian unsigned value, so this boundary condition is valid. - */ - for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) { - ret_desc->integer.value >>= 1; - } - - ret_desc->integer.value = res_val; - break; - - - /* Def_find_set_right_bit := Find_set_right_bit_op Operand Result */ - - case AML_FIND_SET_RIGHT_BIT_OP: - - ret_desc->integer.value = obj_desc->integer.value; - - /* - * Acpi specification describes Integer type as a little - * endian unsigned value, so this boundary condition is valid. - */ - for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) { - ret_desc->integer.value <<= 1; - } - - /* Since returns must be 1-based, subtract from 33 (65) */ - - ret_desc->integer.value = res_val == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - res_val; - break; - - - /* Def_from_bDC := From_bCDOp BCDValue Result */ - - case AML_FROM_BCD_OP: - - /* - * The 64-bit ACPI integer can hold 16 4-bit BCD integers - */ - ret_desc->integer.value = 0; - for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { - /* Get one BCD digit */ - - digit = (acpi_integer) ((obj_desc->integer.value >> (i * 4)) & 0xF); - - /* Check the range of the digit */ - - if (digit > 9) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD digit too large: \n", - digit)); - status = AE_AML_NUMERIC_OVERFLOW; - goto cleanup; - } - - if (digit > 0) { - /* Sum into the result with the appropriate power of 10 */ - - for (j = 0; j < i; j++) { - digit *= 10; - } - - ret_desc->integer.value += digit; - } - } - break; - - - /* Def_to_bDC := To_bCDOp Operand Result */ - - case AML_TO_BCD_OP: - - - if (obj_desc->integer.value > ACPI_MAX_BCD_VALUE) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD overflow: %d\n", - obj_desc->integer.value)); - status = AE_AML_NUMERIC_OVERFLOW; - goto cleanup; - } - - ret_desc->integer.value = 0; - for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { - /* Divide by nth factor of 10 */ - - digit = obj_desc->integer.value; - for (j = 0; j < i; j++) { - digit = ACPI_DIVIDE (digit, 10); - } - - /* Create the BCD digit */ - - if (digit > 0) { - ret_desc->integer.value += (ACPI_MODULO (digit, 10) << (i * 4)); - } - } - break; - - - /* Def_cond_ref_of := Cond_ref_of_op Source_object Result */ - - case AML_COND_REF_OF_OP: - - /* - * This op is a little strange because the internal return value is - * different than the return value stored in the result descriptor - * (There are really two return values) - */ - if ((acpi_namespace_node *) obj_desc == acpi_gbl_root_node) { - /* - * This means that the object does not exist in the namespace, - * return FALSE - */ - ret_desc->integer.value = 0; - - /* - * Must delete the result descriptor since there is no reference - * being returned - */ - acpi_ut_remove_reference (res_desc); - goto cleanup; - } - - /* Get the object reference and store it */ - - status = acpi_ex_get_object_reference (obj_desc, &ret_desc2, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_ex_store (ret_desc2, res_desc, walk_state); - - /* The object exists in the namespace, return TRUE */ - - ret_desc->integer.value = ACPI_INTEGER_MAX; - goto cleanup; - break; - - - case AML_STORE_OP: - - /* - * A store operand is typically a number, string, buffer or lvalue - * TBD: [Unhandled] What about a store to a package? - */ - - /* - * Do the store, and be careful about deleting the source object, - * since the object itself may have been stored. - */ - status = acpi_ex_store (obj_desc, res_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* On failure, just delete the Obj_desc */ - - acpi_ut_remove_reference (obj_desc); - return_ACPI_STATUS (status); - } - - /* - * Normally, we would remove a reference on the Obj_desc parameter; - * But since it is being used as the internal return object - * (meaning we would normally increment it), the two cancel out, - * and we simply don't do anything. - */ - *return_desc = obj_desc; - return_ACPI_STATUS (status); - break; - - - case AML_DEBUG_OP: - - /* Reference, returning an Reference */ - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Debug_op should never get here!\n")); - return_ACPI_STATUS (AE_OK); - break; - - - /* - * ACPI 2.0 Opcodes - */ - case AML_TO_DECSTRING_OP: - status = acpi_ex_convert_to_string (obj_desc, &ret_desc, 10, ACPI_UINT32_MAX, walk_state); - break; - - - case AML_TO_HEXSTRING_OP: - status = acpi_ex_convert_to_string (obj_desc, &ret_desc, 16, ACPI_UINT32_MAX, walk_state); - break; - - case AML_TO_BUFFER_OP: - status = acpi_ex_convert_to_buffer (obj_desc, &ret_desc, walk_state); - break; - - case AML_TO_INTEGER_OP: - status = acpi_ex_convert_to_integer (obj_desc, &ret_desc, walk_state); - break; - - - /* - * These are obsolete opcodes - */ - - /* Def_shift_left_bit := Shift_left_bit_op Source Bit_num */ - /* Def_shift_right_bit := Shift_right_bit_op Source Bit_num */ - - case AML_SHIFT_LEFT_BIT_OP: - case AML_SHIFT_RIGHT_BIT_OP: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s is unimplemented\n", - acpi_ps_get_opcode_name (opcode))); - status = AE_SUPPORT; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_ex_monadic2_r: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - status = acpi_ex_store (ret_desc, res_desc, walk_state); - - -cleanup: - /* Always delete the operand object */ - - acpi_ut_remove_reference (obj_desc); - - /* Delete return object(s) on error */ - - if (ACPI_FAILURE (status)) { - acpi_ut_remove_reference (res_desc); /* Result descriptor */ - if (ret_desc) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_monadic2 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 monadic operator with numeric operand: - * Deref_of_op, Ref_of_op, Size_of_op, Type_op, Increment_op, - * Decrement_op, LNot_op, - * - ******************************************************************************/ - -acpi_status -acpi_ex_monadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc) -{ - acpi_operand_object **operand = &walk_state->operands[0]; - acpi_operand_object *tmp_desc; - acpi_operand_object *ret_desc = NULL; - acpi_status status = AE_OK; - u32 type; - acpi_integer value; - - - FUNCTION_TRACE_PTR ("Ex_monadic2", WALK_OPERANDS); - - - /* Get the operand and decode the opcode */ - - switch (opcode) { - - /* Def_lNot := LNot_op Operand */ - - case AML_LNOT_OP: - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = !obj_desc->integer.value; - break; - - - /* Def_decrement := Decrement_op Target */ - /* Def_increment := Increment_op Target */ - - case AML_DECREMENT_OP: - case AML_INCREMENT_OP: - - /* - * Since we are expecting an Reference on the top of the stack, it - * can be either an Node or an internal object. - * - * TBD: [Future] This may be the prototype code for all cases where - * a Reference is expected!! 10/99 - */ - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - ret_desc = obj_desc; - } - - else { - /* - * Duplicate the Reference in a new object so that we can resolve it - * without destroying the original Reference object - */ - ret_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->reference.opcode = obj_desc->reference.opcode; - ret_desc->reference.offset = obj_desc->reference.offset; - ret_desc->reference.object = obj_desc->reference.object; - } - - - /* - * Convert the Ret_desc Reference to a Number - * (This deletes the original Ret_desc) - */ - status = acpi_ex_resolve_operands (AML_LNOT_OP, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s: bad operand(s) %s\n", - acpi_ps_get_opcode_name (opcode), acpi_format_exception(status))); - - goto cleanup; - } - - /* Do the actual increment or decrement */ - - if (AML_INCREMENT_OP == opcode) { - ret_desc->integer.value++; - } - else { - ret_desc->integer.value--; - } - - /* Store the result back in the original descriptor */ - - status = acpi_ex_store (ret_desc, obj_desc, walk_state); - - /* Objdesc was just deleted (because it is an Reference) */ - - obj_desc = NULL; - - break; - - - /* Def_object_type := Object_type_op Source_object */ - - case AML_TYPE_OP: - - if (INTERNAL_TYPE_REFERENCE == obj_desc->common.type) { - /* - * Not a Name -- an indirect name pointer would have - * been converted to a direct name pointer in Resolve_operands - */ - switch (obj_desc->reference.opcode) { - case AML_ZERO_OP: - case AML_ONE_OP: - case AML_ONES_OP: - case AML_REVISION_OP: - - /* Constants are of type Number */ - - type = ACPI_TYPE_INTEGER; - break; - - - case AML_DEBUG_OP: - - /* Per 1.0b spec, Debug object is of type Debug_object */ - - type = ACPI_TYPE_DEBUG_OBJECT; - break; - - - case AML_INDEX_OP: - - /* Get the type of this reference (index into another object) */ - - type = obj_desc->reference.target_type; - if (type == ACPI_TYPE_PACKAGE) { - /* - * The main object is a package, we want to get the type - * of the individual package element that is referenced by - * the index. - */ - type = (*(obj_desc->reference.where))->common.type; - } - - break; - - - case AML_LOCAL_OP: - case AML_ARG_OP: - - type = acpi_ds_method_data_get_type (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state); - break; - - - default: - - REPORT_ERROR (("Acpi_ex_monadic2/Type_op: Internal error - Unknown Reference subtype %X\n", - obj_desc->reference.opcode)); - status = AE_AML_INTERNAL; - goto cleanup; - } - } - - else { - /* - * It's not a Reference, so it must be a direct name pointer. - */ - type = acpi_ns_get_type ((acpi_namespace_node *) obj_desc); - - /* Convert internal types to external types */ - - switch (type) { - case INTERNAL_TYPE_REGION_FIELD: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - - type = ACPI_TYPE_FIELD_UNIT; - } - - } - - /* Allocate a descriptor to hold the type. */ - - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = type; - break; - - - /* Def_size_of := Size_of_op Source_object */ - - case AML_SIZE_OF_OP: - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - obj_desc = acpi_ns_get_attached_object ((acpi_namespace_node *) obj_desc); - } - - if (!obj_desc) { - value = 0; - } - - else { - switch (obj_desc->common.type) { - - case ACPI_TYPE_BUFFER: - - value = obj_desc->buffer.length; - break; - - - case ACPI_TYPE_STRING: - - value = obj_desc->string.length; - break; - - - case ACPI_TYPE_PACKAGE: - - value = obj_desc->package.count; - break; - - case INTERNAL_TYPE_REFERENCE: - - value = 4; - break; - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Not Buf/Str/Pkg - found type %X\n", - obj_desc->common.type)); - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - } - - /* - * Now that we have the size of the object, create a result - * object to hold the value - */ - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = value; - break; - - - /* Def_ref_of := Ref_of_op Source_object */ - - case AML_REF_OF_OP: - - status = acpi_ex_get_object_reference (obj_desc, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - break; - - - /* Def_deref_of := Deref_of_op Obj_reference */ - - case AML_DEREF_OF_OP: - - - /* Check for a method local or argument */ - - if (!VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* - * Must resolve/dereference the local/arg reference first - */ - switch (obj_desc->reference.opcode) { - /* Set Obj_desc to the value of the local/arg */ - - case AML_LOCAL_OP: - case AML_ARG_OP: - - acpi_ds_method_data_get_value (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state, &tmp_desc); - - /* - * Delete our reference to the input object and - * point to the object just retrieved - */ - acpi_ut_remove_reference (obj_desc); - obj_desc = tmp_desc; - break; - - default: - - /* Index op - handled below */ - break; - } - } - - - /* Obj_desc may have changed from the code above */ - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Get the actual object from the Node (This is the dereference) */ - - ret_desc = ((acpi_namespace_node *) obj_desc)->object; - - /* Returning a pointer to the object, add another reference! */ - - acpi_ut_add_reference (ret_desc); - } - - else { - /* - * This must be a reference object produced by the Index - * ASL operation -- check internal opcode - */ - if ((obj_desc->reference.opcode != AML_INDEX_OP) && - (obj_desc->reference.opcode != AML_REF_OF_OP)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n", - obj_desc, obj_desc->reference.opcode)); - - status = AE_TYPE; - goto cleanup; - } - - - switch (obj_desc->reference.opcode) { - case AML_INDEX_OP: - - /* - * Supported target types for the Index operator are - * 1) A Buffer - * 2) A Package - */ - if (obj_desc->reference.target_type == ACPI_TYPE_BUFFER_FIELD) { - /* - * The target is a buffer, we must create a new object that - * contains one element of the buffer, the element pointed - * to by the index. - * - * NOTE: index into a buffer is NOT a pointer to a - * sub-buffer of the main buffer, it is only a pointer to a - * single element (byte) of the buffer! - */ - ret_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - tmp_desc = obj_desc->reference.object; - ret_desc->integer.value = - tmp_desc->buffer.pointer[obj_desc->reference.offset]; - - /* TBD: [Investigate] (see below) Don't add an additional - * ref! - */ - } - - else if (obj_desc->reference.target_type == ACPI_TYPE_PACKAGE) { - /* - * The target is a package, we want to return the referenced - * element of the package. We must add another reference to - * this object, however. - */ - ret_desc = *(obj_desc->reference.where); - if (!ret_desc) { - /* - * We can't return a NULL dereferenced value. This is - * an uninitialized package element and is thus a - * severe error. - */ - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "NULL package element obj %p\n", - obj_desc)); - status = AE_AML_UNINITIALIZED_ELEMENT; - goto cleanup; - } - - acpi_ut_add_reference (ret_desc); - } - - else { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Target_type %X in obj %p\n", - obj_desc->reference.target_type, obj_desc)); - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - break; - - - case AML_REF_OF_OP: - - ret_desc = obj_desc->reference.object; - - /* Add another reference to the object! */ - - acpi_ut_add_reference (ret_desc); - break; - } - } - - break; - - - default: - - REPORT_ERROR (("Acpi_ex_monadic2: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - -cleanup: - - if (obj_desc) { - acpi_ut_remove_reference (obj_desc); - } - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_ut_remove_reference (ret_desc); - ret_desc = NULL; - } - - *return_desc = ret_desc; - return_ACPI_STATUS (status); -} - diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg1.c linux/drivers/acpi/executer/exoparg1.c --- v2.4.13/linux/drivers/acpi/executer/exoparg1.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg1.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,878 @@ + +/****************************************************************************** + * + * Module Name: exoparg1 - AML execution - opcodes with 1 argument + * $Revision: 120 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acparser.h" +#include "acdispat.h" +#include "acinterp.h" +#include "amlcode.h" +#include "acnamesp.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg1") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_0T_0R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on + * object stack + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_0T_0R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Examine the opcode */ + + switch (walk_state->opcode) { + case AML_RELEASE_OP: /* Release (Mutex_object) */ + + status = acpi_ex_release_mutex (operand[0], walk_state); + break; + + + case AML_RESET_OP: /* Reset (Event_object) */ + + status = acpi_ex_system_reset_event (operand[0]); + break; + + + case AML_SIGNAL_OP: /* Signal (Event_object) */ + + status = acpi_ex_system_signal_event (operand[0]); + break; + + + case AML_SLEEP_OP: /* Sleep (Msec_time) */ + + acpi_ex_system_do_suspend ((u32) operand[0]->integer.value); + break; + + + case AML_STALL_OP: /* Stall (Usec_time) */ + + acpi_ex_system_do_stall ((u32) operand[0]->integer.value); + break; + + + case AML_UNLOAD_OP: /* Unload (Handle) */ + + status = acpi_ex_unload_table (operand[0]); + break; + + + default: /* Unknown opcode */ + + REPORT_ERROR (("Acpi_ex_opcode_1A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + break; + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_1T_0R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with one argument, one target, and no + * return value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_1T_0R ( + acpi_walk_state *walk_state) +{ + acpi_status status = AE_OK; + acpi_operand_object **operand = &walk_state->operands[0]; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_1T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + + case AML_LOAD_OP: + + status = acpi_ex_load_op (operand[0], operand[1]); + break; + + default: /* Unknown opcode */ + + REPORT_ERROR (("Acpi_ex_opcode_1A_1T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + } + + +cleanup: + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_1T_1R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with one argument, one target, and a + * return value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_1T_1R ( + acpi_walk_state *walk_state) +{ + acpi_status status = AE_OK; + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_operand_object *return_desc2 = NULL; + u32 temp32; + u32 i; + u32 j; + acpi_integer digit; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_1T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Create a return object of type Integer for most opcodes */ + + switch (walk_state->opcode) { + case AML_BIT_NOT_OP: + case AML_FIND_SET_LEFT_BIT_OP: + case AML_FIND_SET_RIGHT_BIT_OP: + case AML_FROM_BCD_OP: + case AML_TO_BCD_OP: + case AML_COND_REF_OF_OP: + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + break; + } + + + switch (walk_state->opcode) { + + case AML_BIT_NOT_OP: /* Not (Operand, Result) */ + + return_desc->integer.value = ~operand[0]->integer.value; + break; + + + case AML_FIND_SET_LEFT_BIT_OP: /* Find_set_left_bit (Operand, Result) */ + + + return_desc->integer.value = operand[0]->integer.value; + + /* + * Acpi specification describes Integer type as a little + * endian unsigned value, so this boundary condition is valid. + */ + for (temp32 = 0; return_desc->integer.value && temp32 < ACPI_INTEGER_BIT_SIZE; ++temp32) { + return_desc->integer.value >>= 1; + } + + return_desc->integer.value = temp32; + break; + + + case AML_FIND_SET_RIGHT_BIT_OP: /* Find_set_right_bit (Operand, Result) */ + + + return_desc->integer.value = operand[0]->integer.value; + + /* + * The Acpi specification describes Integer type as a little + * endian unsigned value, so this boundary condition is valid. + */ + for (temp32 = 0; return_desc->integer.value && temp32 < ACPI_INTEGER_BIT_SIZE; ++temp32) { + return_desc->integer.value <<= 1; + } + + /* Since the bit position is one-based, subtract from 33 (65) */ + + return_desc->integer.value = temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - temp32; + break; + + + case AML_FROM_BCD_OP: /* From_bcd (BCDValue, Result) */ + + /* + * The 64-bit ACPI integer can hold 16 4-bit BCD integers + */ + return_desc->integer.value = 0; + for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { + /* Get one BCD digit */ + + digit = (acpi_integer) ((operand[0]->integer.value >> (i * 4)) & 0xF); + + /* Check the range of the digit */ + + if (digit > 9) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD digit too large: %d\n", + (u32) digit)); + status = AE_AML_NUMERIC_OVERFLOW; + goto cleanup; + } + + if (digit > 0) { + /* Sum into the result with the appropriate power of 10 */ + + for (j = 0; j < i; j++) { + digit *= 10; + } + + return_desc->integer.value += digit; + } + } + break; + + + case AML_TO_BCD_OP: /* To_bcd (Operand, Result) */ + + if (operand[0]->integer.value > ACPI_MAX_BCD_VALUE) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "BCD overflow: %8.8X%8.8X\n", + HIDWORD(operand[0]->integer.value), LODWORD(operand[0]->integer.value))); + status = AE_AML_NUMERIC_OVERFLOW; + goto cleanup; + } + + return_desc->integer.value = 0; + for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { + /* Divide by nth factor of 10 */ + + temp32 = 0; + digit = operand[0]->integer.value; + for (j = 0; j < i; j++) { + acpi_ut_short_divide (&digit, 10, &digit, &temp32); + } + + /* Create the BCD digit from the remainder above */ + + if (digit > 0) { + return_desc->integer.value += (temp32 << (i * 4)); + } + } + break; + + + case AML_COND_REF_OF_OP: /* Cond_ref_of (Source_object, Result) */ + + /* + * This op is a little strange because the internal return value is + * different than the return value stored in the result descriptor + * (There are really two return values) + */ + if ((acpi_namespace_node *) operand[0] == acpi_gbl_root_node) { + /* + * This means that the object does not exist in the namespace, + * return FALSE + */ + return_desc->integer.value = 0; + + /* + * Must delete the result descriptor since there is no reference + * being returned + */ + acpi_ut_remove_reference (operand[1]); + goto cleanup; + } + + /* Get the object reference and store it */ + + status = acpi_ex_get_object_reference (operand[0], &return_desc2, walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + status = acpi_ex_store (return_desc2, operand[1], walk_state); + + /* The object exists in the namespace, return TRUE */ + + return_desc->integer.value = ACPI_INTEGER_MAX; + goto cleanup; + break; + + + case AML_STORE_OP: /* Store (Source, Target) */ + + /* + * A store operand is typically a number, string, buffer or lvalue + * Be careful about deleting the source object, + * since the object itself may have been stored. + */ + status = acpi_ex_store (operand[0], operand[1], walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* + * Normally, we would remove a reference on the Operand[0] parameter; + * But since it is being used as the internal return object + * (meaning we would normally increment it), the two cancel out, + * and we simply don't do anything. + */ + walk_state->result_obj = operand[0]; + walk_state->operands[0] = NULL; /* Prevent deletion */ + return_ACPI_STATUS (status); + break; + + + /* + * ACPI 2.0 Opcodes + */ + case AML_COPY_OP: /* Copy (Source, Target) */ + + status = AE_NOT_IMPLEMENTED; + goto cleanup; + break; + + + case AML_TO_DECSTRING_OP: /* To_decimal_string (Data, Result) */ + + status = acpi_ex_convert_to_string (operand[0], &return_desc, 10, ACPI_UINT32_MAX, walk_state); + break; + + + case AML_TO_HEXSTRING_OP: /* To_hex_string (Data, Result) */ + + status = acpi_ex_convert_to_string (operand[0], &return_desc, 16, ACPI_UINT32_MAX, walk_state); + break; + + + case AML_TO_BUFFER_OP: /* To_buffer (Data, Result) */ + + status = acpi_ex_convert_to_buffer (operand[0], &return_desc, walk_state); + break; + + + case AML_TO_INTEGER_OP: /* To_integer (Data, Result) */ + + status = acpi_ex_convert_to_integer (operand[0], &return_desc, walk_state); + break; + + + /* + * These are two obsolete opcodes + */ + case AML_SHIFT_LEFT_BIT_OP: /* Shift_left_bit (Source, Bit_num) */ + case AML_SHIFT_RIGHT_BIT_OP: /* Shift_right_bit (Source, Bit_num) */ + + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s is obsolete and not implemented\n", + acpi_ps_get_opcode_name (walk_state->opcode))); + status = AE_SUPPORT; + goto cleanup; + break; + + + default: /* Unknown opcode */ + + REPORT_ERROR (("Acpi_ex_opcode_1A_1T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + } + + + /* + * Store the return value computed above into the target object + */ + status = acpi_ex_store (return_desc, operand[1], walk_state); + + +cleanup: + + walk_state->result_obj = return_desc; + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_1A_0T_1R + * + * PARAMETERS: Walk_state - Current state (contains AML opcode) + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with one argument, no target, and a return value + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_1A_0T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *temp_desc; + acpi_operand_object *return_desc = NULL; + acpi_status status = AE_OK; + u32 type; + acpi_integer value; + + + FUNCTION_TRACE_STR ("Ex_opcode_1A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Get the operand and decode the opcode */ + + switch (walk_state->opcode) { + + case AML_LNOT_OP: /* LNot (Operand) */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = !operand[0]->integer.value; + break; + + + case AML_DECREMENT_OP: /* Decrement (Operand) */ + case AML_INCREMENT_OP: /* Increment (Operand) */ + + /* + * Since we are expecting a Reference operand, it + * can be either a Node or an internal object. + */ + return_desc = operand[0]; + if (VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_INTERNAL)) { + /* Internal reference object - prevent deletion */ + + acpi_ut_add_reference (return_desc); + } + + /* + * Convert the Return_desc Reference to a Number + * (This removes a reference on the Return_desc object) + */ + status = acpi_ex_resolve_operands (AML_LNOT_OP, &return_desc, walk_state); + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s: bad operand(s) %s\n", + acpi_ps_get_opcode_name (walk_state->opcode), acpi_format_exception(status))); + + goto cleanup; + } + + /* + * Return_desc is now guaranteed to be an Integer object + * Do the actual increment or decrement + */ + if (AML_INCREMENT_OP == walk_state->opcode) { + return_desc->integer.value++; + } + else { + return_desc->integer.value--; + } + + /* Store the result back in the original descriptor */ + + status = acpi_ex_store (return_desc, operand[0], walk_state); + break; + + + case AML_TYPE_OP: /* Object_type (Source_object) */ + + if (INTERNAL_TYPE_REFERENCE == operand[0]->common.type) { + /* + * Not a Name -- an indirect name pointer would have + * been converted to a direct name pointer in Resolve_operands + */ + switch (operand[0]->reference.opcode) { + case AML_ZERO_OP: + case AML_ONE_OP: + case AML_ONES_OP: + case AML_REVISION_OP: + + /* Constants are of type Integer */ + + type = ACPI_TYPE_INTEGER; + break; + + + case AML_DEBUG_OP: + + /* Per 1.0b spec, Debug object is of type "Debug_object" */ + + type = ACPI_TYPE_DEBUG_OBJECT; + break; + + + case AML_INDEX_OP: + + /* Get the type of this reference (index into another object) */ + + type = operand[0]->reference.target_type; + if (type == ACPI_TYPE_PACKAGE) { + /* + * The main object is a package, we want to get the type + * of the individual package element that is referenced by + * the index. + */ + type = (*(operand[0]->reference.where))->common.type; + } + + break; + + + case AML_LOCAL_OP: + case AML_ARG_OP: + + type = acpi_ds_method_data_get_type (operand[0]->reference.opcode, + operand[0]->reference.offset, walk_state); + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_1A_0T_1R/Type_op: Internal error - Unknown Reference subtype %X\n", + operand[0]->reference.opcode)); + status = AE_AML_INTERNAL; + goto cleanup; + } + } + + else { + /* + * It's not a Reference, so it must be a direct name pointer. + */ + type = acpi_ns_get_type ((acpi_namespace_node *) operand[0]); + + /* Convert internal types to external types */ + + switch (type) { + case INTERNAL_TYPE_REGION_FIELD: + case INTERNAL_TYPE_BANK_FIELD: + case INTERNAL_TYPE_INDEX_FIELD: + + type = ACPI_TYPE_FIELD_UNIT; + } + + } + + /* Allocate a descriptor to hold the type. */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = type; + break; + + + case AML_SIZE_OF_OP: /* Size_of (Source_object) */ + + temp_desc = operand[0]; + if (VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_NAMED)) { + temp_desc = acpi_ns_get_attached_object ((acpi_namespace_node *) operand[0]); + } + + if (!temp_desc) { + value = 0; + } + + else { + switch (temp_desc->common.type) { + case ACPI_TYPE_BUFFER: + value = temp_desc->buffer.length; + break; + + case ACPI_TYPE_STRING: + value = temp_desc->string.length; + break; + + case ACPI_TYPE_PACKAGE: + value = temp_desc->package.count; + break; + + case INTERNAL_TYPE_REFERENCE: + + /* TBD: this must be a reference to a buf/str/pkg?? */ + + value = 4; + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Not Buf/Str/Pkg - found type %X\n", + temp_desc->common.type)); + status = AE_AML_OPERAND_TYPE; + goto cleanup; + } + } + + /* + * Now that we have the size of the object, create a result + * object to hold the value + */ + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = value; + break; + + + case AML_REF_OF_OP: /* Ref_of (Source_object) */ + + status = acpi_ex_get_object_reference (operand[0], &return_desc, walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + break; + + + case AML_DEREF_OF_OP: /* Deref_of (Obj_reference) */ + + /* Check for a method local or argument */ + + if (!VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_NAMED)) { + /* + * Must resolve/dereference the local/arg reference first + */ + switch (operand[0]->reference.opcode) { + /* Set Operand[0] to the value of the local/arg */ + + case AML_LOCAL_OP: + case AML_ARG_OP: + + acpi_ds_method_data_get_value (operand[0]->reference.opcode, + operand[0]->reference.offset, walk_state, &temp_desc); + + /* + * Delete our reference to the input object and + * point to the object just retrieved + */ + acpi_ut_remove_reference (operand[0]); + operand[0] = temp_desc; + break; + + default: + + /* Index op - handled below */ + break; + } + } + + + /* Operand[0] may have changed from the code above */ + + if (VALID_DESCRIPTOR_TYPE (operand[0], ACPI_DESC_TYPE_NAMED)) { + /* Get the actual object from the Node (This is the dereference) */ + + return_desc = ((acpi_namespace_node *) operand[0])->object; + + /* Returning a pointer to the object, add another reference! */ + + acpi_ut_add_reference (return_desc); + } + + else { + /* + * This must be a reference object produced by the Index + * ASL operation -- check internal opcode + */ + if ((operand[0]->reference.opcode != AML_INDEX_OP) && + (operand[0]->reference.opcode != AML_REF_OF_OP)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown opcode in ref(%p) - %X\n", + operand[0], operand[0]->reference.opcode)); + + status = AE_TYPE; + goto cleanup; + } + + + switch (operand[0]->reference.opcode) { + case AML_INDEX_OP: + + /* + * Supported target types for the Index operator are + * 1) A Buffer + * 2) A Package + */ + if (operand[0]->reference.target_type == ACPI_TYPE_BUFFER_FIELD) { + /* + * The target is a buffer, we must create a new object that + * contains one element of the buffer, the element pointed + * to by the index. + * + * NOTE: index into a buffer is NOT a pointer to a + * sub-buffer of the main buffer, it is only a pointer to a + * single element (byte) of the buffer! + */ + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + temp_desc = operand[0]->reference.object; + return_desc->integer.value = + temp_desc->buffer.pointer[operand[0]->reference.offset]; + + /* TBD: [Investigate] (see below) Don't add an additional + * ref! + */ + } + + else if (operand[0]->reference.target_type == ACPI_TYPE_PACKAGE) { + /* + * The target is a package, we want to return the referenced + * element of the package. We must add another reference to + * this object, however. + */ + return_desc = *(operand[0]->reference.where); + if (!return_desc) { + /* + * We can't return a NULL dereferenced value. This is + * an uninitialized package element and is thus a + * severe error. + */ + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "NULL package element obj %p\n", + operand[0])); + status = AE_AML_UNINITIALIZED_ELEMENT; + goto cleanup; + } + + acpi_ut_add_reference (return_desc); + } + + else { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown Target_type %X in obj %p\n", + operand[0]->reference.target_type, operand[0])); + status = AE_AML_OPERAND_TYPE; + goto cleanup; + } + + break; + + + case AML_REF_OF_OP: + + return_desc = operand[0]->reference.object; + + /* Add another reference to the object! */ + + acpi_ut_add_reference (return_desc); + break; + } + } + + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_1A_0T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + } + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + walk_state->result_obj = return_desc; + return_ACPI_STATUS (status); +} + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg2.c linux/drivers/acpi/executer/exoparg2.c --- v2.4.13/linux/drivers/acpi/executer/exoparg2.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg2.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,564 @@ +/****************************************************************************** + * + * Module Name: exoparg2 - AML execution - opcodes with 2 arguments + * $Revision: 97 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acparser.h" +#include "acnamesp.h" +#include "acinterp.h" +#include "acevents.h" +#include "amlcode.h" +#include "acdispat.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg2") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_0T_0R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with two arguments, no target, and no return + * value. + * + * ALLOCATION: Deletes both operands + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_0T_0R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_namespace_node *node; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Examine the opcode */ + + switch (walk_state->opcode) { + + case AML_NOTIFY_OP: /* Notify (Notify_object, Notify_value) */ + + /* The first operand is a namespace node */ + + node = (acpi_namespace_node *) operand[0]; + + /* The node must refer to a device or thermal zone */ + + if (node && operand[1]) /* TBD: is this check necessary? */ { + switch (node->type) { + case ACPI_TYPE_DEVICE: + case ACPI_TYPE_THERMAL: + + /* + * Dispatch the notify to the appropriate handler + * NOTE: the request is queued for execution after this method + * completes. The notify handlers are NOT invoked synchronously + * from this thread -- because handlers may in turn run other + * control methods. + */ + status = acpi_ev_queue_notify_request (node, + (u32) operand[1]->integer.value); + break; + + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unexpected notify object type %X\n", + node->type)); + + status = AE_AML_OPERAND_TYPE; + break; + } + } + break; + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_0T_0R: Unknown opcode %X\n", walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_2T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute a dyadic operator (2 operands) with 2 output targets + * and one implicit return value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_2T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc1 = NULL; + acpi_operand_object *return_desc2 = NULL; + acpi_status status; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_2T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* + * Execute the opcode + */ + switch (walk_state->opcode) { + case AML_DIVIDE_OP: /* Divide (Dividend, Divisor, Remainder_result Quotient_result) */ + + return_desc1 = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc1) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc2 = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc2) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* Quotient to Return_desc1, remainder to Return_desc2 */ + + status = acpi_ut_divide (&operand[0]->integer.value, &operand[1]->integer.value, + &return_desc1->integer.value, &return_desc2->integer.value); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_2T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + + /* Store the results to the target reference operands */ + + status = acpi_ex_store (return_desc2, operand[2], walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + status = acpi_ex_store (return_desc1, operand[3], walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + /* Return the remainder */ + + walk_state->result_obj = return_desc1; + + +cleanup: + /* + * Since the remainder is not returned indirectly, remove a reference to + * it. Only the quotient is returned indirectly. + */ + acpi_ut_remove_reference (return_desc2); + + if (ACPI_FAILURE (status)) { + /* Delete the return object */ + + acpi_ut_remove_reference (return_desc1); + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_1T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with two arguments, one target, and a return + * value. + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_1T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_operand_object *temp_desc; + u32 index; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_1T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* + * Execute the opcode + */ + if (walk_state->op_info->flags & AML_MATH) { + /* All simple math opcodes (add, etc.) */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + return_desc->integer.value = acpi_ex_do_math_op (walk_state->opcode, + operand[0]->integer.value, + operand[1]->integer.value); + goto store_result_to_target; + } + + + switch (walk_state->opcode) { + case AML_MOD_OP: /* Mod (Dividend, Divisor, Remainder_result (ACPI 2.0) */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* Return_desc will contain the remainder */ + + status = acpi_ut_divide (&operand[0]->integer.value, &operand[1]->integer.value, + NULL, &return_desc->integer.value); + + break; + + + case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */ + + /* + * Convert the second operand if necessary. The first operand + * determines the type of the second operand, (See the Data Types + * section of the ACPI specification.) Both object types are + * guaranteed to be either Integer/String/Buffer by the operand + * resolution mechanism above. + */ + switch (operand[0]->common.type) { + case ACPI_TYPE_INTEGER: + status = acpi_ex_convert_to_integer (operand[1], &operand[1], walk_state); + break; + + case ACPI_TYPE_STRING: + status = acpi_ex_convert_to_string (operand[1], &operand[1], 16, ACPI_UINT32_MAX, walk_state); + break; + + case ACPI_TYPE_BUFFER: + status = acpi_ex_convert_to_buffer (operand[1], &operand[1], walk_state); + break; + + default: + status = AE_AML_INTERNAL; + } + + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + /* + * Both operands are now known to be the same object type + * (Both are Integer, String, or Buffer), and we can now perform the + * concatenation. + */ + status = acpi_ex_do_concatenate (operand[0], operand[1], &return_desc, walk_state); + break; + + + case AML_TO_STRING_OP: /* To_string (Buffer, Length, Result) (ACPI 2.0) */ + + status = acpi_ex_convert_to_string (operand[0], &return_desc, 16, + (u32) operand[1]->integer.value, walk_state); + break; + + + case AML_CONCAT_RES_OP: /* Concatenate_res_template (Buffer, Buffer, Result) (ACPI 2.0) */ + + status = AE_NOT_IMPLEMENTED; + break; + + + case AML_INDEX_OP: /* Index (Source Index Result) */ + + /* Create the internal return object */ + + return_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REFERENCE); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + index = (u32) operand[1]->integer.value; + + /* + * At this point, the Source operand is either a Package or a Buffer + */ + if (operand[0]->common.type == ACPI_TYPE_PACKAGE) { + /* Object to be indexed is a Package */ + + if (index >= operand[0]->package.count) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond package end\n")); + status = AE_AML_PACKAGE_LIMIT; + goto cleanup; + } + + if ((operand[2]->common.type == INTERNAL_TYPE_REFERENCE) && + (operand[2]->reference.opcode == AML_ZERO_OP)) { + /* + * There is no actual result descriptor (the Zero_op Result + * descriptor is a placeholder), so just delete the placeholder and + * return a reference to the package element + */ + acpi_ut_remove_reference (operand[2]); + } + + else { + /* + * Each element of the package is an internal object. Get the one + * we are after. + */ + temp_desc = operand[0]->package.elements [index]; + return_desc->reference.opcode = AML_INDEX_OP; + return_desc->reference.target_type = temp_desc->common.type; + return_desc->reference.object = temp_desc; + + status = acpi_ex_store (return_desc, operand[2], walk_state); + return_desc->reference.object = NULL; + } + + /* + * The local return object must always be a reference to the package element, + * not the element itself. + */ + return_desc->reference.opcode = AML_INDEX_OP; + return_desc->reference.target_type = ACPI_TYPE_PACKAGE; + return_desc->reference.where = &operand[0]->package.elements [index]; + } + + else { + /* Object to be indexed is a Buffer */ + + if (index >= operand[0]->buffer.length) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index value beyond end of buffer\n")); + status = AE_AML_BUFFER_LIMIT; + goto cleanup; + } + + return_desc->reference.opcode = AML_INDEX_OP; + return_desc->reference.target_type = ACPI_TYPE_BUFFER_FIELD; + return_desc->reference.object = operand[0]; + return_desc->reference.offset = index; + + status = acpi_ex_store (return_desc, operand[2], walk_state); + } + + walk_state->result_obj = return_desc; + goto cleanup; + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_1T_1R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + break; + } + + +store_result_to_target: + + if (ACPI_SUCCESS (status)) { + /* + * Store the result of the operation (which is now in Return_desc) into + * the Target descriptor. + */ + status = acpi_ex_store (return_desc, operand[2], walk_state); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + walk_state->result_obj = return_desc; + } + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_2A_0T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with 2 arguments, no target, and a return value + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_2A_0T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_status status = AE_OK; + u8 logical_result = FALSE; + + + FUNCTION_TRACE_STR ("Ex_opcode_2A_0T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + /* Create the internal return object */ + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* + * Execute the Opcode + */ + if (walk_state->op_info->flags & AML_LOGICAL) /* Logical_op (Operand0, Operand1) */ { + logical_result = acpi_ex_do_logical_op (walk_state->opcode, + operand[0]->integer.value, + operand[1]->integer.value); + goto store_logical_result; + } + + + switch (walk_state->opcode) { + case AML_ACQUIRE_OP: /* Acquire (Mutex_object, Timeout) */ + + status = acpi_ex_acquire_mutex (operand[1], operand[0], walk_state); + if (status == AE_TIME) { + logical_result = TRUE; /* TRUE = Acquire timed out */ + status = AE_OK; + } + break; + + + case AML_WAIT_OP: /* Wait (Event_object, Timeout) */ + + status = acpi_ex_system_wait_event (operand[1], operand[0]); + if (status == AE_TIME) { + logical_result = TRUE; /* TRUE, Wait timed out */ + status = AE_OK; + } + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_2A_0T_1R: Unknown opcode %X\n", walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + +store_logical_result: + /* + * Set return value to according to Logical_result. logical TRUE (all ones) + * Default is FALSE (zero) + */ + if (logical_result) { + return_desc->integer.value = ACPI_INTEGER_MAX; + } + + walk_state->result_obj = return_desc; + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg3.c linux/drivers/acpi/executer/exoparg3.c --- v2.4.13/linux/drivers/acpi/executer/exoparg3.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg3.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,235 @@ + +/****************************************************************************** + * + * Module Name: exoparg3 - AML execution - opcodes with 3 arguments + * $Revision: 3 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acinterp.h" +#include "acparser.h" +#include "amlcode.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg3") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_3A_0T_0R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute Triadic operator (3 operands) + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_3A_0T_0R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + ACPI_SIGNAL_FATAL_INFO *fatal; + acpi_status status = AE_OK; + + + FUNCTION_TRACE_STR ("Ex_opcode_3A_0T_0R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + + case AML_FATAL_OP: /* Fatal (Fatal_type Fatal_code Fatal_arg) */ + + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Fatal_op: Type %x Code %x Arg %x <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", + (u32) operand[0]->integer.value, (u32) operand[1]->integer.value, + (u32) operand[2]->integer.value)); + + + fatal = ACPI_MEM_ALLOCATE (sizeof (ACPI_SIGNAL_FATAL_INFO)); + if (fatal) { + fatal->type = (u32) operand[0]->integer.value; + fatal->code = (u32) operand[1]->integer.value; + fatal->argument = (u32) operand[2]->integer.value; + } + + /* + * Always signal the OS! + */ + acpi_os_signal (ACPI_SIGNAL_FATAL, fatal); + + /* Might return while OS is shutting down, just continue */ + + ACPI_MEM_FREE (fatal); + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + +cleanup: + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_3A_1T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute Triadic operator (3 operands) + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_3A_1T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + char *buffer; + acpi_status status = AE_OK; + u32 index; + u32 length; + + + FUNCTION_TRACE_STR ("Ex_opcode_3A_1T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */ + + /* + * Create the return object. The Source operand is guaranteed to be + * either a String or a Buffer, so just use its type. + */ + return_desc = acpi_ut_create_internal_object (operand[0]->common.type); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + } + + /* Get the Integer values from the objects */ + + index = (u32) operand[1]->integer.value; + length = (u32) operand[2]->integer.value; + + /* + * If the index is beyond the length of the String/Buffer, or if the + * requested length is zero, return a zero-length String/Buffer + */ + if ((index < operand[0]->string.length) && + (length > 0)) { + /* Truncate request if larger than the actual String/Buffer */ + + if ((index + length) > + operand[0]->string.length) { + length = operand[0]->string.length - index; + } + + /* Allocate a new buffer for the String/Buffer */ + + buffer = ACPI_MEM_CALLOCATE (length + 1); + if (!buffer) { + return (AE_NO_MEMORY); + } + + /* Copy the portion requested */ + + MEMCPY (buffer, operand[0]->string.pointer + index, + length); + + /* Set the length of the new String/Buffer */ + + return_desc->string.pointer = buffer; + return_desc->string.length = length; + } + + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + /* Store the result in the target */ + + status = acpi_ex_store (return_desc, operand[3], walk_state); + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + /* Set the return object and exit */ + + walk_state->result_obj = return_desc; + return_ACPI_STATUS (status); +} + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exoparg6.c linux/drivers/acpi/executer/exoparg6.c --- v2.4.13/linux/drivers/acpi/executer/exoparg6.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/executer/exoparg6.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,276 @@ + +/****************************************************************************** + * + * Module Name: exoparg6 - AML execution - opcodes with 6 arguments + * $Revision: 4 $ + * + *****************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" +#include "acinterp.h" +#include "acparser.h" +#include "amlcode.h" + + +#define _COMPONENT ACPI_EXECUTER + MODULE_NAME ("exoparg6") + + +/*! + * Naming convention for AML interpreter execution routines. + * + * The routines that begin execution of AML opcodes are named with a common + * convention based upon the number of arguments, the number of target operands, + * and whether or not a value is returned: + * + * AcpiExOpcode_xA_yT_zR + * + * Where: + * + * xA - ARGUMENTS: The number of arguments (input operands) that are + * required for this opcode type (1 through 6 args). + * yT - TARGETS: The number of targets (output operands) that are required + * for this opcode type (0, 1, or 2 targets). + * zR - RETURN VALUE: Indicates whether this opcode type returns a value + * as the function return (0 or 1). + * + * The AcpiExOpcode* functions are called via the Dispatcher component with + * fully resolved operands. +!*/ + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_do_match + * + * PARAMETERS: Match_op - The AML match operand + * Package_value - Value from the target package + * Match_value - Value to be matched + * + * RETURN: TRUE if the match is successful, FALSE otherwise + * + * DESCRIPTION: Implements the low-level match for the ASL Match operator + * + ******************************************************************************/ + +u8 +acpi_ex_do_match ( + u32 match_op, + acpi_integer package_value, + acpi_integer match_value) +{ + + switch (match_op) { + case MATCH_MTR: /* always true */ + + break; + + + case MATCH_MEQ: /* true if equal */ + + if (package_value != match_value) { + return (FALSE); + } + break; + + + case MATCH_MLE: /* true if less than or equal */ + + if (package_value > match_value) { + return (FALSE); + } + break; + + + case MATCH_MLT: /* true if less than */ + + if (package_value >= match_value) { + return (FALSE); + } + break; + + + case MATCH_MGE: /* true if greater than or equal */ + + if (package_value < match_value) { + return (FALSE); + } + break; + + + case MATCH_MGT: /* true if greater than */ + + if (package_value <= match_value) { + return (FALSE); + } + break; + + + default: /* undefined */ + + return (FALSE); + } + + + return TRUE; +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_opcode_6A_0T_1R + * + * PARAMETERS: Walk_state - Current walk state + * + * RETURN: Status + * + * DESCRIPTION: Execute opcode with 6 arguments, no target, and a return value + * + ******************************************************************************/ + +acpi_status +acpi_ex_opcode_6A_0T_1R ( + acpi_walk_state *walk_state) +{ + acpi_operand_object **operand = &walk_state->operands[0]; + acpi_operand_object *return_desc = NULL; + acpi_status status = AE_OK; + u32 index; + acpi_operand_object *this_element; + + + FUNCTION_TRACE_STR ("Ex_opcode_6A_0T_1R", acpi_ps_get_opcode_name (walk_state->opcode)); + + + switch (walk_state->opcode) { + case AML_MATCH_OP: + /* + * Match (Search_package[0], Match_op1[1], Match_object1[2], + * Match_op2[3], Match_object2[4], Start_index[5]) + */ + + /* Validate match comparison sub-opcodes */ + + if ((operand[1]->integer.value > MAX_MATCH_OPERATOR) || + (operand[3]->integer.value > MAX_MATCH_OPERATOR)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "operation encoding out of range\n")); + status = AE_AML_OPERAND_VALUE; + goto cleanup; + } + + index = (u32) operand[5]->integer.value; + if (index >= (u32) operand[0]->package.count) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Index beyond package end\n")); + status = AE_AML_PACKAGE_LIMIT; + goto cleanup; + } + + return_desc = acpi_ut_create_internal_object (ACPI_TYPE_INTEGER); + if (!return_desc) { + status = AE_NO_MEMORY; + goto cleanup; + + } + + /* Default return value if no match found */ + + return_desc->integer.value = ACPI_INTEGER_MAX; + + /* + * Examine each element until a match is found. Within the loop, + * "continue" signifies that the current element does not match + * and the next should be examined. + * Upon finding a match, the loop will terminate via "break" at + * the bottom. If it terminates "normally", Match_value will be -1 + * (its initial value) indicating that no match was found. When + * returned as a Number, this will produce the Ones value as specified. + */ + for ( ; index < operand[0]->package.count; index++) { + this_element = operand[0]->package.elements[index]; + + /* + * Treat any NULL or non-numeric elements as non-matching. + * TBD [Unhandled] - if an element is a Name, + * should we examine its value? + */ + if (!this_element || + this_element->common.type != ACPI_TYPE_INTEGER) { + continue; + } + + + /* + * Within these switch statements: + * "break" (exit from the switch) signifies a match; + * "continue" (proceed to next iteration of enclosing + * "for" loop) signifies a non-match. + */ + if (!acpi_ex_do_match ((u32) operand[1]->integer.value, + this_element->integer.value, operand[2]->integer.value)) { + continue; + } + + + if (!acpi_ex_do_match ((u32) operand[3]->integer.value, + this_element->integer.value, operand[4]->integer.value)) { + continue; + } + + /* Match found: Index is the return value */ + + return_desc->integer.value = index; + break; + } + + break; + + + case AML_LOAD_TABLE_OP: + + status = AE_NOT_IMPLEMENTED; + goto cleanup; + break; + + + default: + + REPORT_ERROR (("Acpi_ex_opcode_3A_0T_0R: Unknown opcode %X\n", + walk_state->opcode)); + status = AE_AML_BAD_OPCODE; + goto cleanup; + break; + } + + + walk_state->result_obj = return_desc; + + +cleanup: + + /* Delete return object on error */ + + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + } + + return_ACPI_STATUS (status); +} diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exprep.c linux/drivers/acpi/executer/exprep.c --- v2.4.13/linux/drivers/acpi/executer/exprep.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exprep.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities - * $Revision: 95 $ + * $Revision: 99 $ * *****************************************************************************/ @@ -243,7 +243,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ex_prep_region_field_value + * FUNCTION: Acpi_ex_prep_field_value * * PARAMETERS: Node - Owning Node * Region_node - Region in which field is being defined @@ -253,280 +253,128 @@ * * RETURN: Status * - * DESCRIPTION: Construct an acpi_operand_object of type Def_field and + * DESCRIPTION: Construct an acpi_operand_object of type Def_field and * connect it to the parent Node. * ******************************************************************************/ acpi_status -acpi_ex_prep_region_field_value ( - acpi_namespace_node *node, - acpi_handle region_node, - u8 field_flags, - u32 field_bit_position, - u32 field_bit_length) +acpi_ex_prep_field_value ( + ACPI_CREATE_FIELD_INFO *info) { acpi_operand_object *obj_desc; u32 type; acpi_status status; - FUNCTION_TRACE ("Ex_prep_region_field_value"); + FUNCTION_TRACE ("Ex_prep_field_value"); /* Parameter validation */ - if (!region_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + if (info->field_type != INTERNAL_TYPE_INDEX_FIELD) { + if (!info->region_node) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); + return_ACPI_STATUS (AE_AML_NO_OPERAND); + } + + type = acpi_ns_get_type (info->region_node); + if (type != ACPI_TYPE_REGION) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", + type, acpi_ut_get_type_name (type))); - type = acpi_ns_get_type (region_node); - if (type != ACPI_TYPE_REGION) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", - type, acpi_ut_get_type_name (type))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + return_ACPI_STATUS (AE_AML_OPERAND_TYPE); + } } - /* Allocate a new object */ + /* Allocate a new region object */ - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_REGION_FIELD); + obj_desc = acpi_ut_create_internal_object (info->field_type); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } - - /* Obj_desc and Region valid */ - - DUMP_OPERANDS ((acpi_operand_object **) &node, IMODE_EXECUTE, - "Ex_prep_region_field_value", 1, "case Region_field"); - DUMP_OPERANDS ((acpi_operand_object **) ®ion_node, IMODE_EXECUTE, - "Ex_prep_region_field_value", 1, "case Region_field"); - /* Initialize areas of the object that are common to all fields */ - status = acpi_ex_prep_common_field_object (obj_desc, field_flags, - field_bit_position, field_bit_length); + status = acpi_ex_prep_common_field_object (obj_desc, info->field_flags, + info->field_bit_position, info->field_bit_length); if (ACPI_FAILURE (status)) { + acpi_ut_delete_object_desc (obj_desc); return_ACPI_STATUS (status); } - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->field.region_obj = acpi_ns_get_attached_object (region_node); - - /* An additional reference for the container */ + /* Initialize areas of the object that are specific to the field type */ - acpi_ut_add_reference (obj_desc->field.region_obj); + switch (info->field_type) { + case INTERNAL_TYPE_REGION_FIELD: + obj_desc->field.region_obj = acpi_ns_get_attached_object (info->region_node); - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bitoff=%X Off=%X Gran=%X Region %p\n", - obj_desc->field.start_field_bit_offset, obj_desc->field.base_byte_offset, - obj_desc->field.access_bit_width, obj_desc->field.region_obj)); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set Named_obj %p (%4.4s) val = %p\n", - node, &(node->name), obj_desc)); + /* An additional reference for the container */ + acpi_ut_add_reference (obj_desc->field.region_obj); - /* - * Store the constructed descriptor (Obj_desc) into the parent Node, - * preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object (node, obj_desc, (u8) acpi_ns_get_type (node)); - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_prep_bank_field_value - * - * PARAMETERS: Node - Owning Node - * Region_node - Region in which field is being defined - * Bank_register_node - Bank selection register node - * Bank_val - Value to store in selection register - * Field_flags - Access, Lock_rule, and Update_rule - * Field_bit_position - Field start position - * Field_bit_length - Field length in number of bits - * - * RETURN: Status - * - * DESCRIPTION: Construct an object of type Bank_field and attach it to the - * parent Node. - * - ******************************************************************************/ - -acpi_status -acpi_ex_prep_bank_field_value ( - acpi_namespace_node *node, - acpi_namespace_node *region_node, - acpi_namespace_node *bank_register_node, - u32 bank_val, - u8 field_flags, - u32 field_bit_position, - u32 field_bit_length) -{ - acpi_operand_object *obj_desc; - u32 type; - acpi_status status; + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Region_field: Bitoff=%X Off=%X Gran=%X Region %p\n", + obj_desc->field.start_field_bit_offset, obj_desc->field.base_byte_offset, + obj_desc->field.access_bit_width, obj_desc->field.region_obj)); + break; - FUNCTION_TRACE ("Ex_prep_bank_field_value"); + case INTERNAL_TYPE_BANK_FIELD: + obj_desc->bank_field.value = info->bank_value; + obj_desc->bank_field.region_obj = acpi_ns_get_attached_object (info->region_node); + obj_desc->bank_field.bank_register_obj = acpi_ns_get_attached_object (info->register_node); - /* Parameter validation */ + /* An additional reference for the attached objects */ - if (!region_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Region_node\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } + acpi_ut_add_reference (obj_desc->bank_field.region_obj); + acpi_ut_add_reference (obj_desc->bank_field.bank_register_obj); - type = acpi_ns_get_type (region_node); - if (type != ACPI_TYPE_REGION) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Needed Region, found type %X %s\n", - type, acpi_ut_get_type_name (type))); - return_ACPI_STATUS (AE_AML_OPERAND_TYPE); - } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bank Field: Bit_off=%X Off=%X Gran=%X Region %p Bank_reg %p\n", + obj_desc->bank_field.start_field_bit_offset, obj_desc->bank_field.base_byte_offset, + obj_desc->field.access_bit_width, obj_desc->bank_field.region_obj, + obj_desc->bank_field.bank_register_obj)); + break; - /* Allocate a new object */ - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_BANK_FIELD); - if (!obj_desc) { - return_ACPI_STATUS (AE_NO_MEMORY); - } + case INTERNAL_TYPE_INDEX_FIELD: - /* Obj_desc and Region valid */ + obj_desc->index_field.index_obj = acpi_ns_get_attached_object (info->register_node); + obj_desc->index_field.data_obj = acpi_ns_get_attached_object (info->data_register_node); + obj_desc->index_field.value = (u32) (info->field_bit_position / + obj_desc->field.access_bit_width); + + if (!obj_desc->index_field.data_obj || !obj_desc->index_field.index_obj) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null Index Object\n")); + return_ACPI_STATUS (AE_AML_INTERNAL); + } - DUMP_OPERANDS ((acpi_operand_object **) &node, IMODE_EXECUTE, - "Ex_prep_bank_field_value", 1, "case Bank_field"); - DUMP_OPERANDS ((acpi_operand_object **) ®ion_node, IMODE_EXECUTE, - "Ex_prep_bank_field_value", 1, "case Bank_field"); + /* An additional reference for the attached objects */ - /* Initialize areas of the object that are common to all fields */ + acpi_ut_add_reference (obj_desc->index_field.data_obj); + acpi_ut_add_reference (obj_desc->index_field.index_obj); - status = acpi_ex_prep_common_field_object (obj_desc, field_flags, - field_bit_position, field_bit_length); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Index_field: bitoff=%X off=%X gran=%X Index %p Data %p\n", + obj_desc->index_field.start_field_bit_offset, obj_desc->index_field.base_byte_offset, + obj_desc->field.access_bit_width, obj_desc->index_field.index_obj, + obj_desc->index_field.data_obj)); + break; } - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->bank_field.value = bank_val; - obj_desc->bank_field.region_obj = acpi_ns_get_attached_object (region_node); - obj_desc->bank_field.bank_register_obj = acpi_ns_get_attached_object (bank_register_node); - - /* An additional reference for the attached objects */ - - acpi_ut_add_reference (obj_desc->bank_field.region_obj); - acpi_ut_add_reference (obj_desc->bank_field.bank_register_obj); - - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Bit_off=%X Off=%X Gran=%X Region %p Bank_reg %p\n", - obj_desc->bank_field.start_field_bit_offset, obj_desc->bank_field.base_byte_offset, - obj_desc->field.access_bit_width, obj_desc->bank_field.region_obj, - obj_desc->bank_field.bank_register_obj)); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Set Named_obj %p (%4.4s) val=%p\n", - node, &(node->name), obj_desc)); - - /* * Store the constructed descriptor (Obj_desc) into the parent Node, * preserving the current type of that Named_obj. */ - status = acpi_ns_attach_object (node, obj_desc, (u8) acpi_ns_get_type (node)); - return_ACPI_STATUS (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_prep_index_field_value - * - * PARAMETERS: Node - Owning Node - * Index_reg - Index register - * Data_reg - Data register - * Field_flags - Access, Lock_rule, and Update_rule - * Field_bit_position - Field start position - * Field_bit_length - Field length in number of bits - * - * RETURN: Status - * - * DESCRIPTION: Construct an acpi_operand_object of type Index_field and - * connect it to the parent Node. - * - ******************************************************************************/ - -acpi_status -acpi_ex_prep_index_field_value ( - acpi_namespace_node *node, - acpi_namespace_node *index_reg, - acpi_namespace_node *data_reg, - u8 field_flags, - u32 field_bit_position, - u32 field_bit_length) -{ - acpi_operand_object *obj_desc; - acpi_status status; - - - FUNCTION_TRACE ("Ex_prep_index_field_value"); - - - /* Parameter validation */ - - if (!index_reg || !data_reg) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null handle\n")); - return_ACPI_STATUS (AE_AML_NO_OPERAND); - } - - /* Allocate a new object descriptor */ - - obj_desc = acpi_ut_create_internal_object (INTERNAL_TYPE_INDEX_FIELD); - if (!obj_desc) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - /* Initialize areas of the object that are common to all fields */ - - status = acpi_ex_prep_common_field_object (obj_desc, field_flags, - field_bit_position, field_bit_length); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->index_field.data_obj = acpi_ns_get_attached_object (data_reg); - obj_desc->index_field.index_obj = acpi_ns_get_attached_object (index_reg); - obj_desc->index_field.value = (u32) (field_bit_position / - obj_desc->field.access_bit_width); - - /* An additional reference for the attached objects */ - - acpi_ut_add_reference (obj_desc->index_field.data_obj); - acpi_ut_add_reference (obj_desc->index_field.index_obj); - - /* Debug info */ - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "bitoff=%X off=%X gran=%X Index %p Data %p\n", - obj_desc->index_field.start_field_bit_offset, obj_desc->index_field.base_byte_offset, - obj_desc->field.access_bit_width, obj_desc->index_field.index_obj, - obj_desc->index_field.data_obj)); + status = acpi_ns_attach_object (info->field_node, obj_desc, + (u8) acpi_ns_get_type (info->field_node)); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "set Named_obj %p (%4.4s) val = %p\n", - node, &(node->name), obj_desc)); + info->field_node, (char*)&(info->field_node->name), obj_desc)); + /* Remove local reference to the object */ - /* - * Store the constructed descriptor (Obj_desc) into the parent Node, - * preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object (node, obj_desc, (u8) acpi_ns_get_type (node)); + acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exregion.c linux/drivers/acpi/executer/exregion.c --- v2.4.13/linux/drivers/acpi/executer/exregion.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exregion.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exregion - ACPI default Op_region (address space) handlers - * $Revision: 58 $ + * $Revision: 61 $ * *****************************************************************************/ @@ -47,7 +47,7 @@ * Value - Pointer to in or out value * Handler_context - Pointer to Handler's context * Region_context - Pointer to context specific to the - * accessed region + * accessed region * * RETURN: Status * @@ -143,7 +143,7 @@ ((acpi_integer) address - (acpi_integer) mem_info->mapped_physical_address); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "IO %d (%d width) Address=%8.8lX%8.8lX\n", function, bit_width, + "System_memory %d (%d width) Address=%8.8X%8.8X\n", function, bit_width, HIDWORD (address), LODWORD (address))); /* Perform the memory read or write */ @@ -207,7 +207,7 @@ * Value - Pointer to in or out value * Handler_context - Pointer to Handler's context * Region_context - Pointer to context specific to the - * accessed region + * accessed region * * RETURN: Status * @@ -231,7 +231,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "IO %d (%d width) Address=%8.8lX%8.8lX\n", function, bit_width, + "System_iO %d (%d width) Address=%8.8X%8.8X\n", function, bit_width, HIDWORD (address), LODWORD (address))); /* Decode the function parameter */ @@ -270,7 +270,7 @@ * Value - Pointer to in or out value * Handler_context - Pointer to Handler's context * Region_context - Pointer to context specific to the - * accessed region + * accessed region * * RETURN: Status * @@ -311,7 +311,7 @@ pci_register = (u16) address; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "IO %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", + "Pci_config %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", function, bit_width, pci_id->segment, pci_id->bus, pci_id->device, pci_id->function, pci_register)); @@ -335,6 +335,80 @@ status = AE_BAD_PARAMETER; break; } + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_cmos_space_handler + * + * PARAMETERS: Function - Read or Write operation + * Address - Where in the space to read or write + * Bit_width - Field width in bits (8, 16, or 32) + * Value - Pointer to in or out value + * Handler_context - Pointer to Handler's context + * Region_context - Pointer to context specific to the + * accessed region + * + * RETURN: Status + * + * DESCRIPTION: Handler for the CMOS address space (Op Region) + * + ******************************************************************************/ + +acpi_status +acpi_ex_cmos_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context) +{ + acpi_status status = AE_OK; + + + FUNCTION_TRACE ("Ex_cmos_space_handler"); + + + return_ACPI_STATUS (status); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ex_pci_bar_space_handler + * + * PARAMETERS: Function - Read or Write operation + * Address - Where in the space to read or write + * Bit_width - Field width in bits (8, 16, or 32) + * Value - Pointer to in or out value + * Handler_context - Pointer to Handler's context + * Region_context - Pointer to context specific to the + * accessed region + * + * RETURN: Status + * + * DESCRIPTION: Handler for the PCI Bar_target address space (Op Region) + * + ******************************************************************************/ + +acpi_status +acpi_ex_pci_bar_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context) +{ + acpi_status status = AE_OK; + + + FUNCTION_TRACE ("Ex_pci_bar_space_handler"); + return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exresnte.c linux/drivers/acpi/executer/exresnte.c --- v2.4.13/linux/drivers/acpi/executer/exresnte.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exresnte.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresnte - AML Interpreter object resolution - * $Revision: 41 $ + * $Revision: 43 $ * *****************************************************************************/ @@ -43,14 +43,15 @@ * * FUNCTION: Acpi_ex_resolve_node_to_value * - * PARAMETERS: Stack_ptr - Pointer to a location on a stack that contains - * a pointer to a Node - * Walk_state - Current state + * PARAMETERS: Object_ptr - Pointer to a location that contains + * a pointer to a NS node, and will recieve a + * pointer to the resolved object. + * Walk_state - Current state. Valid only if executing AML + * code. NULL if simply resolving an object * * RETURN: Status * - * DESCRIPTION: Resolve a Namespace node (AKA a "direct name pointer") to - * a valued object + * DESCRIPTION: Resolve a Namespace node to a valued object * * Note: for some of the data types, the pointer attached to the Node * can be either a pointer to an actual internal object or a pointer into the @@ -66,12 +67,12 @@ acpi_status acpi_ex_resolve_node_to_value ( - acpi_namespace_node **stack_ptr, + acpi_namespace_node **object_ptr, acpi_walk_state *walk_state) { acpi_status status = AE_OK; - acpi_operand_object *val_desc; + acpi_operand_object *source_desc; acpi_operand_object *obj_desc = NULL; acpi_namespace_node *node; acpi_object_type8 entry_type; @@ -85,12 +86,12 @@ * The stack pointer points to a acpi_namespace_node (Node). Get the * object that is attached to the Node. */ - node = *stack_ptr; - val_desc = acpi_ns_get_attached_object (node); + node = *object_ptr; + source_desc = acpi_ns_get_attached_object (node); entry_type = acpi_ns_get_type ((acpi_handle) node); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p Val_desc=%p Type=%X\n", - node, val_desc, entry_type)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p Source_desc=%p Type=%X\n", + node, source_desc, entry_type)); /* @@ -103,7 +104,7 @@ return_ACPI_STATUS (AE_OK); } - if (!val_desc) { + if (!source_desc) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No object attached to node %p\n", node)); return_ACPI_STATUS (AE_AML_NO_OPERAND); @@ -117,60 +118,60 @@ case ACPI_TYPE_PACKAGE: - if (ACPI_TYPE_PACKAGE != val_desc->common.type) { + if (ACPI_TYPE_PACKAGE != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Package, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; case ACPI_TYPE_BUFFER: - if (ACPI_TYPE_BUFFER != val_desc->common.type) { + if (ACPI_TYPE_BUFFER != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Buffer, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; case ACPI_TYPE_STRING: - if (ACPI_TYPE_STRING != val_desc->common.type) { + if (ACPI_TYPE_STRING != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a String, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; case ACPI_TYPE_INTEGER: - if (ACPI_TYPE_INTEGER != val_desc->common.type) { + if (ACPI_TYPE_INTEGER != source_desc->common.type) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Object not a Integer, type %s\n", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); return_ACPI_STATUS (AE_AML_OPERAND_TYPE); } /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; @@ -180,10 +181,10 @@ case INTERNAL_TYPE_BANK_FIELD: case INTERNAL_TYPE_INDEX_FIELD: - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Field_read Node=%p Val_desc=%p Type=%X\n", - node, val_desc, entry_type)); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Field_read Node=%p Source_desc=%p Type=%X\n", + node, source_desc, entry_type)); - status = acpi_ex_read_data_from_field (val_desc, &obj_desc); + status = acpi_ex_read_data_from_field (source_desc, &obj_desc); break; @@ -200,7 +201,7 @@ /* Return an additional reference to the object */ - obj_desc = val_desc; + obj_desc = source_desc; acpi_ut_add_reference (obj_desc); break; @@ -222,7 +223,7 @@ */ case INTERNAL_TYPE_REFERENCE: - switch (val_desc->reference.opcode) { + switch (source_desc->reference.opcode) { case AML_ZERO_OP: @@ -241,13 +242,13 @@ case AML_REVISION_OP: - temp_val = ACPI_CA_VERSION; + temp_val = ACPI_CA_SUPPORT_LEVEL; break; default: ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unsupported reference opcode %X\n", - val_desc->reference.opcode)); + source_desc->reference.opcode)); return_ACPI_STATUS (AE_AML_BAD_OPCODE); } @@ -261,9 +262,15 @@ obj_desc->integer.value = temp_val; - /* Truncate value if we are executing from a 32-bit ACPI table */ - - acpi_ex_truncate_for32bit_table (obj_desc, walk_state); + /* + * Truncate value if we are executing from a 32-bit ACPI table + * AND actually executing AML code. If we are resolving + * an object in the namespace via an external call to the + * subsystem, we will have a null Walk_state + */ + if (walk_state) { + acpi_ex_truncate_for32bit_table (obj_desc, walk_state); + } break; @@ -281,7 +288,7 @@ /* Put the object descriptor on the stack */ - *stack_ptr = (void *) obj_desc; + *object_ptr = (void *) obj_desc; return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exresolv.c linux/drivers/acpi/executer/exresolv.c --- v2.4.13/linux/drivers/acpi/executer/exresolv.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exresolv.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresolv - AML Interpreter object resolution - * $Revision: 99 $ + * $Revision: 101 $ * *****************************************************************************/ @@ -131,12 +131,14 @@ (result_desc->integer.value >> obj_desc->buffer_field.start_field_bit_offset) & mask; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "** Read from buffer %p byte %ld bit %d width %d addr %p mask %08lx val %08lx\n", + "** Read from buffer %p byte %d bit %d width %d addr %p mask %08X val %8.8X%8.8X\n", obj_desc->buffer_field.buffer_obj->buffer.pointer, obj_desc->buffer_field.base_byte_offset, obj_desc->buffer_field.start_field_bit_offset, obj_desc->buffer_field.bit_length, - location, mask, result_desc->integer.value)); + location, mask, + HIDWORD(result_desc->integer.value), + LODWORD(result_desc->integer.value))); return_ACPI_STATUS (AE_OK); } @@ -323,7 +325,7 @@ break; case AML_REVISION_OP: - obj_desc->integer.value = ACPI_CA_VERSION; + obj_desc->integer.value = ACPI_CA_SUPPORT_LEVEL; break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exresop.c linux/drivers/acpi/executer/exresop.c --- v2.4.13/linux/drivers/acpi/executer/exresop.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exresop.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exresop - AML Interpreter operand/object resolution - * $Revision: 38 $ + * $Revision: 41 $ * *****************************************************************************/ @@ -120,7 +120,7 @@ op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { return_ACPI_STATUS (AE_AML_BAD_OPCODE); } @@ -146,7 +146,7 @@ */ while (GET_CURRENT_ARG_TYPE (arg_types)) { if (!stack_ptr || !*stack_ptr) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null stack entry at %X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null stack entry at %p\n", stack_ptr)); return_ACPI_STATUS (AE_AML_INTERNAL); @@ -183,7 +183,7 @@ * Decode the Reference */ op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { return_ACPI_STATUS (AE_AML_BAD_OPCODE); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exstore.c linux/drivers/acpi/executer/exstore.c --- v2.4.13/linux/drivers/acpi/executer/exstore.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exstore.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exstore - AML Interpreter object store support - * $Revision: 148 $ + * $Revision: 150 $ * *****************************************************************************/ @@ -42,15 +42,14 @@ * * FUNCTION: Acpi_ex_store * - * PARAMETERS: *Val_desc - Value to be stored + * PARAMETERS: *Source_desc - Value to be stored * *Dest_desc - Where to store it. Must be an NS node * or an acpi_operand_object of type - * Reference; if the latter the descriptor - * will be either reused or deleted. + * Reference; * * RETURN: Status * - * DESCRIPTION: Store the value described by Val_desc into the location + * DESCRIPTION: Store the value described by Source_desc into the location * described by Dest_desc. Called by various interpreter * functions to store the result of an operation into * the destination operand. @@ -59,7 +58,7 @@ acpi_status acpi_ex_store ( - acpi_operand_object *val_desc, + acpi_operand_object *source_desc, acpi_operand_object *dest_desc, acpi_walk_state *walk_state) { @@ -72,7 +71,7 @@ /* Validate parameters */ - if (!val_desc || !dest_desc) { + if (!source_desc || !dest_desc) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Internal - null pointer\n")); return_ACPI_STATUS (AE_AML_NO_OPERAND); } @@ -84,7 +83,7 @@ * Dest is a namespace node, * Storing an object into a Name "container" */ - status = acpi_ex_store_object_to_node (val_desc, + status = acpi_ex_store_object_to_node (source_desc, (acpi_namespace_node *) dest_desc, walk_state); /* All done, that's it */ @@ -101,7 +100,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Destination is not a Reference_obj [%p]\n", dest_desc)); - DUMP_STACK_ENTRY (val_desc); + DUMP_STACK_ENTRY (source_desc); DUMP_STACK_ENTRY (dest_desc); DUMP_OPERANDS (&dest_desc, IMODE_EXECUTE, "Ex_store", 2, "Target is not a Reference_obj"); @@ -125,7 +124,7 @@ /* Storing an object into a Name "container" */ - status = acpi_ex_store_object_to_node (val_desc, ref_desc->reference.object, + status = acpi_ex_store_object_to_node (source_desc, ref_desc->reference.object, walk_state); break; @@ -134,7 +133,7 @@ /* Storing to an Index (pointer into a packager or buffer) */ - status = acpi_ex_store_object_to_index (val_desc, ref_desc, walk_state); + status = acpi_ex_store_object_to_index (source_desc, ref_desc, walk_state); break; @@ -144,7 +143,7 @@ /* Store to a method local/arg */ status = acpi_ds_store_object_to_local (ref_desc->reference.opcode, - ref_desc->reference.offset, val_desc, walk_state); + ref_desc->reference.offset, source_desc, walk_state); break; @@ -157,39 +156,39 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Write to Debug Object: ****:\n\n")); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %s: ", - acpi_ut_get_type_name (val_desc->common.type))); + acpi_ut_get_type_name (source_desc->common.type))); - switch (val_desc->common.type) { + switch (source_desc->common.type) { case ACPI_TYPE_INTEGER: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%X (%d)\n", - (u32) val_desc->integer.value, (u32) val_desc->integer.value)); + (u32) source_desc->integer.value, (u32) source_desc->integer.value)); break; case ACPI_TYPE_BUFFER: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Length 0x%X\n", - (u32) val_desc->buffer.length)); + (u32) source_desc->buffer.length)); break; case ACPI_TYPE_STRING: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s\n", val_desc->string.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s\n", source_desc->string.pointer)); break; case ACPI_TYPE_PACKAGE: ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "Elements - 0x%X\n", - (u32) val_desc->package.elements)); + (u32) source_desc->package.elements)); break; default: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "@0x%p\n", val_desc)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "@0x%p\n", source_desc)); break; } @@ -224,12 +223,6 @@ } /* switch (Ref_desc->Reference.Opcode) */ - /* Always delete the reference descriptor object */ - - if (ref_desc) { - acpi_ut_remove_reference (ref_desc); - } - return_ACPI_STATUS (status); } @@ -238,7 +231,7 @@ * * FUNCTION: Acpi_ex_store_object_to_index * - * PARAMETERS: *Val_desc - Value to be stored + * PARAMETERS: *Source_desc - Value to be stored * *Node - Named object to receive the value * * RETURN: Status @@ -249,7 +242,7 @@ acpi_status acpi_ex_store_object_to_index ( - acpi_operand_object *val_desc, + acpi_operand_object *source_desc, acpi_operand_object *dest_desc, acpi_walk_state *walk_state) { @@ -278,7 +271,7 @@ if (dest_desc->reference.target_type == ACPI_TYPE_PACKAGE) { /* * The object at *(Dest_desc->Reference.Where) is the - * element within the package that is to be modified. + * element within the package that is to be modified. */ obj_desc = *(dest_desc->reference.where); if (obj_desc) { @@ -288,16 +281,12 @@ * * TBD: [Investigate] Should both the src and dest be required * to be packages? - * && (Val_desc->Common.Type == ACPI_TYPE_PACKAGE) + * && (Source_desc->Common.Type == ACPI_TYPE_PACKAGE) */ if (obj_desc->common.type == ACPI_TYPE_PACKAGE) { - /* - * Take away the reference for being part of a package and - * delete - */ - acpi_ut_remove_reference (obj_desc); - acpi_ut_remove_reference (obj_desc); + /* Take away the reference for being part of a package */ + acpi_ut_remove_reference (obj_desc); obj_desc = NULL; } } @@ -307,9 +296,9 @@ * If the Obj_desc is NULL, it means that an uninitialized package * element has been used as a destination (this is OK), therefore, * we must create the destination element to match the type of the - * source element NOTE: Val_desc can be of any type. + * source element NOTE: Source_desccan be of any type. */ - obj_desc = acpi_ut_create_internal_object (val_desc->common.type); + obj_desc = acpi_ut_create_internal_object (source_desc->common.type); if (!obj_desc) { return_ACPI_STATUS (AE_NO_MEMORY); } @@ -318,29 +307,25 @@ * If the source is a package, copy the source to the new dest */ if (ACPI_TYPE_PACKAGE == obj_desc->common.type) { - status = acpi_ut_copy_ipackage_to_ipackage (val_desc, obj_desc, walk_state); + status = acpi_ut_copy_ipackage_to_ipackage (source_desc, obj_desc, walk_state); if (ACPI_FAILURE (status)) { acpi_ut_remove_reference (obj_desc); return_ACPI_STATUS (status); } } - /* - * Install the new descriptor into the package and add a - * reference to the newly created descriptor for now being - * part of the parent package - */ + /* Install the new descriptor into the package */ + *(dest_desc->reference.where) = obj_desc; - acpi_ut_add_reference (obj_desc); } if (ACPI_TYPE_PACKAGE != obj_desc->common.type) { /* * The destination element is not a package, so we need to - * convert the contents of the source (Val_desc) and copy into + * convert the contents of the source (Source_desc) and copy into * the destination (Obj_desc) */ - status = acpi_ex_store_object_to_object (val_desc, obj_desc, + status = acpi_ex_store_object_to_object (source_desc, obj_desc, walk_state); if (ACPI_FAILURE (status)) { /* @@ -380,7 +365,7 @@ * The assignment of the individual elements will be slightly * different for each source type. */ - switch (val_desc->common.type) { + switch (source_desc->common.type) { case ACPI_TYPE_INTEGER: /* * Type is Integer, assign bytewise @@ -389,7 +374,7 @@ */ length = sizeof (acpi_integer); for (i = length; i != 0; i--) { - value = (u8)(val_desc->integer.value >> (MUL_8 (i - 1))); + value = (u8)(source_desc->integer.value >> (MUL_8 (i - 1))); obj_desc->buffer.pointer[dest_desc->reference.offset] = value; } break; @@ -400,9 +385,9 @@ * Type is Buffer, the Length is in the structure. * Just loop through the elements and assign each one in turn. */ - length = val_desc->buffer.length; + length = source_desc->buffer.length; for (i = 0; i < length; i++) { - value = val_desc->buffer.pointer[i]; + value = source_desc->buffer.pointer[i]; obj_desc->buffer.pointer[dest_desc->reference.offset] = value; } break; @@ -413,9 +398,9 @@ * Type is String, the Length is in the structure. * Just loop through the elements and assign each one in turn. */ - length = val_desc->string.length; + length = source_desc->string.length; for (i = 0; i < length; i++) { - value = val_desc->string.pointer[i]; + value = source_desc->string.pointer[i]; obj_desc->buffer.pointer[dest_desc->reference.offset] = value; } break; @@ -427,7 +412,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Source must be Number/Buffer/String type, not %X\n", - val_desc->common.type)); + source_desc->common.type)); status = AE_AML_OPERAND_TYPE; break; } @@ -548,6 +533,7 @@ * Source_desc reference count is incremented by Attach_object. */ status = acpi_ns_attach_object (node, target_desc, target_type); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Store %s into %s via Convert/Attach\n", acpi_ut_get_type_name (target_desc->common.type), @@ -564,7 +550,6 @@ /* No conversions for all other types. Just attach the source object */ status = acpi_ns_attach_object (node, source_desc, source_desc->common.type); - break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exutils.c linux/drivers/acpi/executer/exutils.c --- v2.4.13/linux/drivers/acpi/executer/exutils.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exutils.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: exutils - interpreter/scanner utilities - * $Revision: 84 $ + * $Revision: 85 $ * *****************************************************************************/ @@ -265,16 +265,16 @@ * * FUNCTION: Acpi_ex_digits_needed * - * PARAMETERS: val - Value to be represented - * base - Base of representation + * PARAMETERS: Value - Value to be represented + * Base - Base of representation * - * RETURN: the number of digits needed to represent val in base + * RETURN: the number of digits needed to represent Value in Base * ******************************************************************************/ u32 acpi_ex_digits_needed ( - acpi_integer val, + acpi_integer value, u32 base) { u32 num_digits = 0; @@ -289,9 +289,11 @@ else { /* - * acpi_integer is unsigned, which is why we don't worry about the '-' + * acpi_integer is unsigned, which is why we don't worry about a '-' */ - for (num_digits = 1; (val = ACPI_DIVIDE (val,base)); ++num_digits) { ; } + for (num_digits = 1; + (acpi_ut_short_divide (&value, base, &value, NULL)); + ++num_digits) { ; } } return_VALUE (num_digits); @@ -394,17 +396,18 @@ { u32 count; u32 digits_needed; + u32 remainder; FUNCTION_ENTRY (); digits_needed = acpi_ex_digits_needed (value, 10); - out_string[digits_needed] = '\0'; + out_string[digits_needed] = 0; for (count = digits_needed; count > 0; count--) { - out_string[count-1] = (NATIVE_CHAR) ('0' + (ACPI_MODULO (value, 10))); - value = ACPI_DIVIDE (value, 10); + acpi_ut_short_divide (&value, 10, &value, &remainder); + out_string[count-1] = (NATIVE_CHAR) ('0' + remainder); } return (AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/executer/exxface.c linux/drivers/acpi/executer/exxface.c --- v2.4.13/linux/drivers/acpi/executer/exxface.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/executer/exxface.c Wed Dec 31 16:00:00 1969 @@ -1,102 +0,0 @@ - -/****************************************************************************** - * - * Module Name: exxface - External interpreter interfaces - * $Revision: 29 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "acpi.h" -#include "acinterp.h" - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("exxface") - -#if 0 - -/* - * DEFINE_AML_GLOBALS is tested in amlcode.h - * to determine whether certain global names should be "defined" or only - * "declared" in the current compilation. This enhances maintainability - * by enabling a single header file to embody all knowledge of the names - * in question. - * - * Exactly one module of any executable should #define DEFINE_GLOBALS - * before #including the header files which use this convention. The - * names in question will be defined and initialized in that module, - * and declared as extern in all other modules which #include those - * header files. - */ - -#define DEFINE_AML_GLOBALS -#include "amlcode.h" -#include "acparser.h" -#include "acnamesp.h" - - -/******************************************************************************* - * - * FUNCTION: Acpi_ex_execute_method - * - * PARAMETERS: Pcode - Pointer to the pcode stream - * Pcode_length - Length of pcode that comprises the method - * **Params - List of parameters to pass to method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * - * RETURN: Status - * - * DESCRIPTION: Execute a control method - * - ******************************************************************************/ - -acpi_status -acpi_ex_execute_method ( - acpi_namespace_node *method_node, - acpi_operand_object **params, - acpi_operand_object **return_obj_desc) -{ - acpi_status status; - - - FUNCTION_TRACE ("Ex_execute_method"); - - - /* - * The point here is to lock the interpreter and call the low - * level execute. - */ - status = acpi_ex_enter_interpreter (); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - status = acpi_psx_execute (method_node, params, return_obj_desc); - - acpi_ex_exit_interpreter (); - - return_ACPI_STATUS (status); -} - - -#endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwacpi.c linux/drivers/acpi/hardware/hwacpi.c --- v2.4.13/linux/drivers/acpi/hardware/hwacpi.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwacpi.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface - * $Revision: 45 $ + * $Revision: 46 $ * *****************************************************************************/ @@ -220,7 +220,7 @@ /* Give the platform some time to react */ - acpi_os_stall (5000); + acpi_os_stall (20000); if (acpi_hw_get_mode () == mode) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n", mode)); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwgpe.c linux/drivers/acpi/hardware/hwgpe.c --- v2.4.13/linux/drivers/acpi/hardware/hwgpe.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwgpe.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Module Name: hwgpe - Low level GPE enable/disable/clear functions - * $Revision: 32 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -77,6 +77,45 @@ (in_byte | bit_mask), 8); } +/****************************************************************************** + * + * FUNCTION: Acpi_hw_enable_gpe_for_wakeup + * + * PARAMETERS: Gpe_number - The GPE + * + * RETURN: None + * + * DESCRIPTION: Keep track of which GPEs the OS has requested not be + * disabled when going to sleep. + * + ******************************************************************************/ + +void +acpi_hw_enable_gpe_for_wakeup ( + u32 gpe_number) +{ + u32 register_index; + u32 bit_mask; + + + FUNCTION_ENTRY (); + + + /* + * Translate GPE number to index into global registers array. + */ + register_index = acpi_gbl_gpe_valid[gpe_number]; + + /* + * Figure out the bit offset for this GPE within the target register. + */ + bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; + + /* + * Set the bit so we will not disable this when sleeping + */ + acpi_gbl_gpe_registers[register_index].wake_enable |= bit_mask; +} /****************************************************************************** * @@ -120,8 +159,49 @@ acpi_os_read_port (acpi_gbl_gpe_registers[register_index].enable_addr, &in_byte, 8); acpi_os_write_port (acpi_gbl_gpe_registers[register_index].enable_addr, (in_byte & ~bit_mask), 8); + + acpi_hw_disable_gpe_for_wakeup(gpe_number); } +/****************************************************************************** + * + * FUNCTION: Acpi_hw_disable_gpe_for_wakeup + * + * PARAMETERS: Gpe_number - The GPE + * + * RETURN: None + * + * DESCRIPTION: Keep track of which GPEs the OS has requested not be + * disabled when going to sleep. + * + ******************************************************************************/ + +void +acpi_hw_disable_gpe_for_wakeup ( + u32 gpe_number) +{ + u32 register_index; + u32 bit_mask; + + + FUNCTION_ENTRY (); + + + /* + * Translate GPE number to index into global registers array. + */ + register_index = acpi_gbl_gpe_valid[gpe_number]; + + /* + * Figure out the bit offset for this GPE within the target register. + */ + bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; + + /* + * Clear the bit so we will disable this when sleeping + */ + acpi_gbl_gpe_registers[register_index].wake_enable &= ~bit_mask; +} /****************************************************************************** * @@ -215,11 +295,88 @@ } /* + * Enabled for wake?: + */ + if (bit_mask & acpi_gbl_gpe_registers[register_index].wake_enable) { + (*event_status) |= ACPI_EVENT_FLAG_WAKE_ENABLED; + } + + /* * Set? */ in_byte = 0; acpi_os_read_port (acpi_gbl_gpe_registers[register_index].status_addr, &in_byte, 8); if (bit_mask & in_byte) { (*event_status) |= ACPI_EVENT_FLAG_SET; + } +} + +/****************************************************************************** + * + * FUNCTION: Acpi_hw_disable_non_wakeup_gpes + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Disable all non-wakeup GPEs + * Call with interrupts disabled. The interrupt handler also + * modifies Acpi_gbl_Gpe_registers[i].Enable, so it should not be + * given the chance to run until after non-wake GPEs are + * re-enabled. + * + ******************************************************************************/ + +void +acpi_hw_disable_non_wakeup_gpes ( + void) +{ + u32 i; + + FUNCTION_ENTRY (); + + for (i = 0; i < acpi_gbl_gpe_register_count; i++) { + /* + * Read the enabled status of all GPEs. We + * will be using it to restore all the GPEs later. + */ + acpi_os_read_port (acpi_gbl_gpe_registers[i].enable_addr, + &acpi_gbl_gpe_registers[i].enable, 8); + + /* + * Disable all GPEs but wakeup GPEs. + */ + acpi_os_write_port(acpi_gbl_gpe_registers[i].enable_addr, + acpi_gbl_gpe_registers[i].wake_enable, 8); + } +} + +/****************************************************************************** + * + * FUNCTION: Acpi_hw_enable_non_wakeup_gpes + * + * PARAMETERS: None + * + * RETURN: None + * + * DESCRIPTION: Enable all non-wakeup GPEs we previously enabled. + * + ******************************************************************************/ + +void +acpi_hw_enable_non_wakeup_gpes ( + void) +{ + u32 i; + + FUNCTION_ENTRY (); + + for (i = 0; i < acpi_gbl_gpe_register_count; i++) { + /* + * We previously stored the enabled status of all GPEs. + * Blast them back in. + */ + acpi_os_write_port(acpi_gbl_gpe_registers[i].enable_addr, + acpi_gbl_gpe_registers[i].enable, 8); } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwregs.c linux/drivers/acpi/hardware/hwregs.c --- v2.4.13/linux/drivers/acpi/hardware/hwregs.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwregs.c Wed Oct 24 14:06:22 2001 @@ -3,7 +3,7 @@ * * Module Name: hwregs - Read/write access functions for the various ACPI * control and status registers. - * $Revision: 109 $ + * $Revision: 110 $ * ******************************************************************************/ @@ -453,8 +453,9 @@ register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL); - ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %p\n", - register_value, ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm2_cnt_blk.address))); + ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n", + register_value, HIDWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address), + LODWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address))); if (read_write == ACPI_WRITE) { register_value &= ~mask; @@ -462,8 +463,10 @@ value &= mask; register_value |= value; - ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %p\n", register_value, - acpi_gbl_FADT->Xpm2_cnt_blk.address)); + ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %8.8X%8.8X\n", + register_value, + HIDWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address), + LODWORD(acpi_gbl_FADT->Xpm2_cnt_blk.address))); acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL, (u8) (register_value)); @@ -476,8 +479,10 @@ mask = TMR_VAL_MASK; register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM_TIMER); - ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM_TIMER: Read %X from %p\n", - register_value, ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address))); + ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM_TIMER: Read %X from %8.8X%8.8X\n", + register_value, + HIDWORD(acpi_gbl_FADT->Xpm_tmr_blk.address), + LODWORD(acpi_gbl_FADT->Xpm_tmr_blk.address))); break; @@ -732,13 +737,13 @@ break; - case PM1_a_CONTROL: /* 16-bit access */ + case PM1A_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); break; - case PM1_b_CONTROL: /* 16-bit access */ + case PM1B_CONTROL: /* 16-bit access */ acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); break; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwsleep.c linux/drivers/acpi/hardware/hwsleep.c --- v2.4.13/linux/drivers/acpi/hardware/hwsleep.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwsleep.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 21 $ + * $Revision: 22 $ * *****************************************************************************/ @@ -137,8 +137,8 @@ acpi_object arg; u8 type_a; u8 type_b; - u16 PM1_acontrol; - u16 PM1_bcontrol; + u16 PM1Acontrol; + u16 PM1Bcontrol; FUNCTION_TRACE ("Acpi_enter_sleep_state"); @@ -171,31 +171,31 @@ disable (); - /* TODO: disable all non-wake GPEs here */ + acpi_hw_disable_non_wakeup_gpes(); - PM1_acontrol = (u16) acpi_hw_register_read (ACPI_MTX_LOCK, PM1_CONTROL); + PM1Acontrol = (u16) acpi_hw_register_read (ACPI_MTX_LOCK, PM1_CONTROL); ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Entering S%d\n", sleep_state)); /* mask off SLP_EN and SLP_TYP fields */ - PM1_acontrol &= ~(SLP_TYPE_X_MASK | SLP_EN_MASK); - PM1_bcontrol = PM1_acontrol; + PM1Acontrol &= ~(SLP_TYPE_X_MASK | SLP_EN_MASK); + PM1Bcontrol = PM1Acontrol; /* mask in SLP_TYP */ - PM1_acontrol |= (type_a << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); - PM1_bcontrol |= (type_b << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); + PM1Acontrol |= (type_a << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); + PM1Bcontrol |= (type_b << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); /* write #1: fill in SLP_TYP data */ - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_a_CONTROL, PM1_acontrol); - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_b_CONTROL, PM1_bcontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1A_CONTROL, PM1Acontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1B_CONTROL, PM1Bcontrol); /* mask in SLP_EN */ - PM1_acontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); - PM1_bcontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); + PM1Acontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); + PM1Bcontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); /* flush caches */ @@ -203,8 +203,8 @@ /* write #2: SLP_TYP + SLP_EN */ - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_a_CONTROL, PM1_acontrol); - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_b_CONTROL, PM1_bcontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1A_CONTROL, PM1Acontrol); + acpi_hw_register_write (ACPI_MTX_LOCK, PM1B_CONTROL, PM1Bcontrol); /* * Wait a second, then try again. This is to get S4/5 to work on all machines. @@ -223,6 +223,8 @@ } while (!acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, WAK_STS)); + acpi_hw_enable_non_wakeup_gpes(); + enable (); return_ACPI_STATUS (AE_OK); @@ -264,7 +266,7 @@ /* _WAK returns stuff - do we want to look at it? */ - /* Re-enable GPEs */ + acpi_hw_enable_non_wakeup_gpes(); return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/hardware/hwtimer.c linux/drivers/acpi/hardware/hwtimer.c --- v2.4.13/linux/drivers/acpi/hardware/hwtimer.c Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/hardware/hwtimer.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: hwtimer.c - ACPI Power Management Timer Interface - * $Revision: 12 $ + * $Revision: 14 $ * *****************************************************************************/ @@ -47,19 +47,9 @@ acpi_get_timer_resolution ( u32 *resolution) { - acpi_status status; - - FUNCTION_TRACE ("Acpi_get_timer_resolution"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - if (!resolution) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -92,18 +82,8 @@ acpi_get_timer ( u32 *ticks) { - acpi_status status; - - FUNCTION_TRACE ("Acpi_get_timer"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } if (!ticks) { return_ACPI_STATUS (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acconfig.h linux/drivers/acpi/include/acconfig.h --- v2.4.13/linux/drivers/acpi/include/acconfig.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acconfig.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acconfig.h - Global configuration constants - * $Revision: 69 $ + * $Revision: 74 $ * *****************************************************************************/ @@ -53,7 +53,11 @@ /* Version string */ -#define ACPI_CA_VERSION 0x20010831 +#define ACPI_CA_VERSION 0x20011018 + +/* Version of ACPI supported */ + +#define ACPI_CA_SUPPORT_LEVEL 2 /* Maximum objects in the various object caches */ @@ -78,7 +82,7 @@ /* Max reference count (for debug only) */ -#define MAX_REFERENCE_COUNT 0x200 +#define MAX_REFERENCE_COUNT 0x400 /* Size of cached memory mapping for system memory operation region */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acdebug.h linux/drivers/acpi/include/acdebug.h --- v2.4.13/linux/drivers/acpi/include/acdebug.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acdebug.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acdebug.h - ACPI/AML debugger - * $Revision: 47 $ + * $Revision: 50 $ * *****************************************************************************/ @@ -35,7 +35,7 @@ extern int optind; extern NATIVE_CHAR *optarg; -extern u8 *aml_ptr; +extern u8 *aml_start; extern u32 aml_length; extern u8 acpi_gbl_db_opt_tables; @@ -57,6 +57,7 @@ extern u8 acpi_gbl_db_output_flags; extern u32 acpi_gbl_db_debug_level; extern u32 acpi_gbl_db_console_debug_level; +extern acpi_table_header *acpi_gbl_db_table_ptr; /* * Statistic globals @@ -119,11 +120,15 @@ acpi_db_initialize ( void); +void +acpi_db_terminate ( + void); + acpi_status acpi_db_single_step ( acpi_walk_state *walk_state, acpi_parse_object *op, - u8 op_type); + u32 op_type); /* diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acdispat.h linux/drivers/acpi/include/acdispat.h --- v2.4.13/linux/drivers/acpi/include/acdispat.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acdispat.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acdispat.h - dispatcher (parser to interpreter interface) - * $Revision: 40 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -86,25 +86,20 @@ acpi_status acpi_ds_get_predicate_value ( acpi_walk_state *walk_state, - acpi_parse_object *op, u32 has_result_obj); acpi_status acpi_ds_exec_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); acpi_status acpi_ds_exec_end_op ( - acpi_walk_state *state, - acpi_parse_object *op); + acpi_walk_state *state); /* dsfield - Parser/Interpreter interface for AML fields */ - acpi_status acpi_ds_create_field ( acpi_parse_object *op, @@ -123,44 +118,36 @@ acpi_namespace_node *region_node, acpi_walk_state *walk_state); +acpi_status +acpi_ds_create_buffer_field ( + acpi_parse_object *op, + acpi_walk_state *walk_state); + /* dsload - Parser/Interpreter interface, namespace load callbacks */ acpi_status acpi_ds_load1_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); acpi_status acpi_ds_load1_end_op ( - acpi_walk_state *walk_state, - acpi_parse_object *op); + acpi_walk_state *walk_state); acpi_status acpi_ds_load2_begin_op ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); acpi_status acpi_ds_load2_end_op ( - acpi_walk_state *state, - acpi_parse_object *op); + acpi_walk_state *walk_state); acpi_status -acpi_ds_load3_begin_op ( - u16 opcode, - acpi_parse_object *op, +acpi_ds_init_callbacks ( acpi_walk_state *walk_state, - acpi_parse_object **out_op); - -acpi_status -acpi_ds_load3_end_op ( - acpi_walk_state *state, - acpi_parse_object *op); + u32 pass_number); /* dsmthdat - method data (locals/args) */ @@ -374,7 +361,7 @@ acpi_walk_state *walk_state); -/* Acpi_dswstate - parser WALK_STATE management routines */ +/* dswstate - parser WALK_STATE management routines */ acpi_walk_state * acpi_ds_create_walk_state ( @@ -384,6 +371,17 @@ acpi_walk_list *walk_list); acpi_status +acpi_ds_init_aml_walk ( + acpi_walk_state *walk_state, + acpi_parse_object *op, + acpi_namespace_node *method_node, + u8 *aml_start, + u32 aml_length, + acpi_operand_object **params, + acpi_operand_object **return_obj_desc, + u32 pass_number); + +acpi_status acpi_ds_obj_stack_delete_all ( acpi_walk_state *walk_state); @@ -398,6 +396,11 @@ acpi_walk_state * acpi_ds_pop_walk_state ( + acpi_walk_list *walk_list); + +void +acpi_ds_push_walk_state ( + acpi_walk_state *walk_state, acpi_walk_list *walk_list); acpi_status diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acevents.h linux/drivers/acpi/include/acevents.h --- v2.4.13/linux/drivers/acpi/include/acevents.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acevents.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acevents.h - Event subcomponent prototypes and defines - * $Revision: 65 $ + * $Revision: 66 $ * *****************************************************************************/ @@ -157,6 +157,20 @@ acpi_status acpi_ev_pci_config_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context); + +acpi_status +acpi_ev_cmos_region_setup ( + acpi_handle handle, + u32 function, + void *handler_context, + void **region_context); + +acpi_status +acpi_ev_pci_bar_region_setup ( acpi_handle handle, u32 function, void *handler_context, diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acglobal.h linux/drivers/acpi/include/acglobal.h --- v2.4.13/linux/drivers/acpi/include/acglobal.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acglobal.h Wed Oct 24 14:06:22 2001 @@ -94,7 +94,7 @@ * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs. * (The table maps local handles to the real OS handles) */ -ACPI_EXTERN ACPI_MUTEX_INFO acpi_gbl_acpi_mutex_info [NUM_MTX]; +ACPI_EXTERN acpi_mutex_info acpi_gbl_acpi_mutex_info [NUM_MTX]; /***************************************************************************** @@ -172,7 +172,7 @@ /* Address Space handlers */ -ACPI_EXTERN ACPI_ADR_SPACE_INFO acpi_gbl_address_spaces[ACPI_NUM_ADDRESS_SPACES]; +ACPI_EXTERN acpi_adr_space_info acpi_gbl_address_spaces[ACPI_NUM_ADDRESS_SPACES]; /* Control method single step flag */ @@ -194,10 +194,10 @@ * ****************************************************************************/ -ACPI_EXTERN ACPI_FIXED_EVENT_INFO acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS]; +ACPI_EXTERN acpi_fixed_event_info acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS]; ACPI_EXTERN acpi_handle acpi_gbl_gpe_obj_handle; ACPI_EXTERN u32 acpi_gbl_gpe_register_count; -ACPI_EXTERN ACPI_GPE_REGISTERS *acpi_gbl_gpe_registers; +ACPI_EXTERN acpi_gpe_registers *acpi_gbl_gpe_registers; ACPI_EXTERN acpi_gpe_level_info *acpi_gbl_gpe_info; /* diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/achware.h linux/drivers/acpi/include/achware.h --- v2.4.13/linux/drivers/acpi/include/achware.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/achware.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: achware.h -- hardware specific interfaces - * $Revision: 55 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -105,20 +105,37 @@ void acpi_hw_enable_gpe ( - u32 gpe_index); + u32 gpe_number); + +void +acpi_hw_enable_gpe_for_wakeup ( + u32 gpe_number); void acpi_hw_disable_gpe ( - u32 gpe_index); + u32 gpe_number); + +void +acpi_hw_disable_gpe_for_wakeup ( + u32 gpe_number); void acpi_hw_clear_gpe ( - u32 gpe_index); + u32 gpe_number); void acpi_hw_get_gpe_status ( u32 gpe_number, acpi_event_status *event_status); + +void +acpi_hw_disable_non_wakeup_gpes ( + void); + +void +acpi_hw_enable_non_wakeup_gpes ( + void); + /* Sleep Prototypes */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acinterp.h linux/drivers/acpi/include/acinterp.h --- v2.4.13/linux/drivers/acpi/include/acinterp.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acinterp.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acinterp.h - Interpreter subcomponent prototypes and defines - * $Revision: 106 $ + * $Revision: 116 $ * *****************************************************************************/ @@ -179,51 +179,75 @@ */ acpi_status -acpi_ex_triadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_3A_0T_0R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_hexadic ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_3A_1T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_create_buffer_field ( - u8 *aml_ptr, - u32 aml_length, - acpi_namespace_node *node, +acpi_ex_opcode_6A_0T_1R ( acpi_walk_state *walk_state); acpi_status -acpi_ex_reconfiguration ( - u16 opcode, +acpi_ex_get_object_reference ( + acpi_operand_object *obj_desc, + acpi_operand_object **return_desc, acpi_walk_state *walk_state); acpi_status +acpi_ex_do_concatenate ( + acpi_operand_object *obj_desc, + acpi_operand_object *obj_desc2, + acpi_operand_object **actual_return_desc, + acpi_walk_state *walk_state); + +u8 +acpi_ex_do_logical_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1); + +acpi_integer +acpi_ex_do_math_op ( + u16 opcode, + acpi_integer operand0, + acpi_integer operand1); + +acpi_status +acpi_ex_load_op ( + acpi_operand_object *rgn_desc, + acpi_operand_object *ddb_handle); + +acpi_status +acpi_ex_unload_table ( + acpi_operand_object *ddb_handle); + +acpi_status acpi_ex_create_mutex ( acpi_walk_state *walk_state); acpi_status acpi_ex_create_processor ( - acpi_parse_object *op, - acpi_namespace_node *processor_node); + acpi_walk_state *walk_state); acpi_status acpi_ex_create_power_resource ( - acpi_parse_object *op, - acpi_namespace_node *power_node); + acpi_walk_state *walk_state); acpi_status acpi_ex_create_region ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, u8 region_space, acpi_walk_state *walk_state); acpi_status +acpi_ex_create_table_region ( + acpi_walk_state *walk_state); + +acpi_status acpi_ex_create_event ( acpi_walk_state *walk_state); @@ -233,10 +257,9 @@ acpi_status acpi_ex_create_method ( - u8 *aml_ptr, + u8 *aml_start, u32 aml_length, - u32 method_flags, - acpi_namespace_node *method); + acpi_walk_state *walk_state); /* @@ -301,6 +324,9 @@ u32 field_position, u32 field_length); +acpi_status +acpi_ex_prep_field_value ( + ACPI_CREATE_FIELD_INFO *info); /* * amsystem - Interface to OS services @@ -352,49 +378,40 @@ */ acpi_status -acpi_ex_monadic1 ( - u16 opcode, +acpi_ex_opcode_1A_0T_0R ( acpi_walk_state *walk_state); acpi_status -acpi_ex_monadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_1A_0T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_monadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_1A_1T_1R ( + acpi_walk_state *walk_state); +acpi_status +acpi_ex_opcode_1A_1T_0R ( + acpi_walk_state *walk_state); /* * amdyadic - ACPI AML (p-code) execution, dyadic operators */ acpi_status -acpi_ex_dyadic1 ( - u16 opcode, +acpi_ex_opcode_2A_0T_0R ( acpi_walk_state *walk_state); acpi_status -acpi_ex_dyadic2 ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_2A_0T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_dyadic2_r ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_2A_1T_1R ( + acpi_walk_state *walk_state); acpi_status -acpi_ex_dyadic2_s ( - u16 opcode, - acpi_walk_state *walk_state, - acpi_operand_object **return_desc); +acpi_ex_opcode_2A_2T_1R ( + acpi_walk_state *walk_state); /* @@ -429,7 +446,7 @@ void acpi_ex_show_hex_value ( u32 byte_count, - u8 *aml_ptr, + u8 *aml_start, u32 lead_space); @@ -640,6 +657,24 @@ acpi_status acpi_ex_pci_config_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context); + +acpi_status +acpi_ex_cmos_space_handler ( + u32 function, + ACPI_PHYSICAL_ADDRESS address, + u32 bit_width, + u32 *value, + void *handler_context, + void *region_context); + +acpi_status +acpi_ex_pci_bar_space_handler ( u32 function, ACPI_PHYSICAL_ADDRESS address, u32 bit_width, diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/aclocal.h linux/drivers/acpi/include/aclocal.h --- v2.4.13/linux/drivers/acpi/include/aclocal.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/aclocal.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: aclocal.h - Internal data types used across the ACPI subsystem - * $Revision: 130 $ + * $Revision: 138 $ * *****************************************************************************/ @@ -29,7 +29,7 @@ #define WAIT_FOREVER ((u32) -1) -typedef void* ACPI_MUTEX; +typedef void* acpi_mutex; typedef u32 ACPI_MUTEX_HANDLE; @@ -40,7 +40,15 @@ /* Object descriptor types */ #define ACPI_CACHED_OBJECT 0x11 /* ORed in when object is cached */ -#define ACPI_DESC_TYPE_STATE 0x22 +#define ACPI_DESC_TYPE_STATE 0x20 +#define ACPI_DESC_TYPE_STATE_UPDATE 0x21 +#define ACPI_DESC_TYPE_STATE_PACKAGE 0x22 +#define ACPI_DESC_TYPE_STATE_CONTROL 0x23 +#define ACPI_DESC_TYPE_STATE_RPSCOPE 0x24 +#define ACPI_DESC_TYPE_STATE_PSCOPE 0x25 +#define ACPI_DESC_TYPE_STATE_WSCOPE 0x26 +#define ACPI_DESC_TYPE_STATE_RESULT 0x27 +#define ACPI_DESC_TYPE_STATE_NOTIFY 0x28 #define ACPI_DESC_TYPE_WALK 0x44 #define ACPI_DESC_TYPE_PARSER 0x66 #define ACPI_DESC_TYPE_INTERNAL 0x88 @@ -112,11 +120,11 @@ typedef struct acpi_mutex_info { - ACPI_MUTEX mutex; + acpi_mutex mutex; u32 use_count; u32 owner_id; -} ACPI_MUTEX_INFO; +} acpi_mutex_info; /* This owner ID means that the mutex is not in use (unlocked) */ @@ -181,7 +189,7 @@ u32 name; /* ACPI Name, always 4 chars per ACPI spec */ - void *object; /* Pointer to attached ACPI object (optional) */ + union acpi_operand_obj *object; /* Pointer to attached ACPI object (optional) */ struct acpi_node *child; /* first child */ struct acpi_node *peer; /* Next peer*/ u16 reference_count; /* Current count of references and children */ @@ -216,8 +224,8 @@ struct acpi_table_desc *installed_desc; acpi_table_header *pointer; void *base_pointer; - u8 *aml_pointer; - UINT64 physical_address; + u8 *aml_start; + u64 physical_address; u32 aml_length; u32 length; u32 count; @@ -235,13 +243,13 @@ acpi_handle *list; u32 *count; -} FIND_CONTEXT; +} find_context; typedef struct { acpi_namespace_node *node; -} NS_SEARCH_DATA; +} ns_search_data; /* @@ -274,7 +282,34 @@ u32 num_carats; u8 fully_qualified; -} ACPI_NAMESTRING_INFO; +} acpi_namestring_info; + + +/* Field creation info */ + +typedef struct +{ + acpi_namespace_node *region_node; + acpi_namespace_node *field_node; + acpi_namespace_node *register_node; + acpi_namespace_node *data_register_node; + u32 bank_value; + u32 field_bit_position; + u32 field_bit_length; + u8 field_flags; + u8 field_type; + +} ACPI_CREATE_FIELD_INFO; + +/* + * Field flags: Bits 00 - 03 : Access_type (Any_acc, Byte_acc, etc.) + * 04 : Lock_rule (1 == Lock) + * 05 - 06 : Update_rule + */ + +#define FIELD_ACCESS_TYPE_MASK 0x0F +#define FIELD_LOCK_RULE_MASK 0x10 +#define FIELD_UPDATE_RULE_MASK 0x60 /***************************************************************************** @@ -308,23 +343,24 @@ typedef struct { - ACPI_ADR_SPACE_HANDLER handler; + acpi_adr_space_handler handler; void *context; -} ACPI_ADR_SPACE_INFO; +} acpi_adr_space_info; /* Values and addresses of the GPE registers (both banks) */ typedef struct { - u8 status; /* Current value of status reg */ - u8 enable; /* Current value of enable reg */ u16 status_addr; /* Address of status reg */ u16 enable_addr; /* Address of enable reg */ + u8 status; /* Current value of status reg */ + u8 enable; /* Current value of enable reg */ + u8 wake_enable; /* Mask of bits to keep enabled when sleeping */ u8 gpe_base; /* Base GPE number */ -} ACPI_GPE_REGISTERS; +} acpi_gpe_registers; #define ACPI_GPE_LEVEL_TRIGGERED 1 @@ -338,7 +374,7 @@ u8 type; /* Level or Edge */ acpi_handle method_handle; /* Method handle for direct (fast) execution */ - ACPI_GPE_HANDLER handler; /* Address of handler, if any */ + acpi_gpe_handler handler; /* Address of handler, if any */ void *context; /* Context to be passed to handler */ } acpi_gpe_level_info; @@ -348,10 +384,10 @@ typedef struct { - ACPI_EVENT_HANDLER handler; /* Address of handler. */ + acpi_event_handler handler; /* Address of handler. */ void *context; /* Context to be passed to handler */ -} ACPI_FIXED_EVENT_INFO; +} acpi_fixed_event_info; /* Information used during field processing */ @@ -362,7 +398,7 @@ u8 field_flag; u32 pkg_length; -} ACPI_FIELD_INFO; +} acpi_field_info; /***************************************************************************** @@ -397,7 +433,7 @@ typedef struct acpi_common_state { ACPI_STATE_COMMON -} ACPI_COMMON_STATE; +} acpi_common_state; /* @@ -408,7 +444,7 @@ ACPI_STATE_COMMON union acpi_operand_obj *object; -} ACPI_UPDATE_STATE; +} acpi_update_state; /* @@ -424,7 +460,7 @@ u32 num_packages; u16 index; -} ACPI_PKG_STATE; +} acpi_pkg_state; /* @@ -437,7 +473,7 @@ struct acpi_parse_obj *predicate_op; u8 *aml_predicate_start; /* Start of if/while predicate */ -} ACPI_CONTROL_STATE; +} acpi_control_state; /* @@ -448,7 +484,7 @@ ACPI_STATE_COMMON acpi_namespace_node *node; -} ACPI_SCOPE_STATE; +} acpi_scope_state; typedef struct acpi_pscope_state @@ -460,7 +496,7 @@ u32 arg_list; /* next argument to parse */ u32 arg_count; /* Number of fixed arguments */ -} ACPI_PSCOPE_STATE; +} acpi_pscope_state; /* @@ -474,7 +510,17 @@ u8 num_results; u8 last_insert; -} ACPI_RESULT_VALUES; +} acpi_result_values; + + +typedef +acpi_status (*acpi_parse_downwards) ( + struct acpi_walk_state *walk_state, + struct acpi_parse_obj **out_op); + +typedef +acpi_status (*acpi_parse_upwards) ( + struct acpi_walk_state *walk_state); /* @@ -487,36 +533,34 @@ acpi_namespace_node *node; union acpi_operand_obj *handler_obj; -} ACPI_NOTIFY_INFO; +} acpi_notify_info; /* Generic state is union of structs above */ typedef union acpi_gen_state { - ACPI_COMMON_STATE common; - ACPI_CONTROL_STATE control; - ACPI_UPDATE_STATE update; - ACPI_SCOPE_STATE scope; - ACPI_PSCOPE_STATE parse_scope; - ACPI_PKG_STATE pkg; - ACPI_RESULT_VALUES results; - ACPI_NOTIFY_INFO notify; + acpi_common_state common; + acpi_control_state control; + acpi_update_state update; + acpi_scope_state scope; + acpi_pscope_state parse_scope; + acpi_pkg_state pkg; + acpi_result_values results; + acpi_notify_info notify; } acpi_generic_state; -typedef -acpi_status (*acpi_parse_downwards) ( - u16 opcode, - struct acpi_parse_obj *op, - struct acpi_walk_state *walk_state, - struct acpi_parse_obj **out_op); +/***************************************************************************** + * + * Interpreter typedefs and structs + * + ****************************************************************************/ typedef -acpi_status (*acpi_parse_upwards) ( - struct acpi_walk_state *walk_state, - struct acpi_parse_obj *op); +acpi_status (*ACPI_EXECUTE_OP) ( + struct acpi_walk_state *walk_state); /***************************************************************************** @@ -525,35 +569,6 @@ * ****************************************************************************/ -#define ACPI_OP_CLASS_MASK 0x1F -#define ACPI_OP_ARGS_MASK 0x20 -#define ACPI_OP_TYPE_MASK 0xC0 - -#define ACPI_OP_TYPE_OPCODE 0x00 -#define ACPI_OP_TYPE_ASCII 0x40 -#define ACPI_OP_TYPE_PREFIX 0x80 -#define ACPI_OP_TYPE_UNKNOWN 0xC0 - -#define ACPI_GET_OP_CLASS(a) ((a)->flags & ACPI_OP_CLASS_MASK) -#define ACPI_GET_OP_ARGS(a) ((a)->flags & ACPI_OP_ARGS_MASK) -#define ACPI_GET_OP_TYPE(a) ((a)->flags & ACPI_OP_TYPE_MASK) - -/* - * Flags byte: 0-4 (5 bits) = Opcode Class (0x001F - * 5 (1 bit) = Has arguments flag - * 6-7 (2 bits) = Reserved - */ -#define AML_NO_ARGS 0 -#define AML_HAS_ARGS 0x0020 -#define AML_NSOBJECT 0x0100 -#define AML_NSOPCODE 0x0200 -#define AML_NSNODE 0x0400 -#define AML_NAMED 0x0800 -#define AML_DEFER 0x1000 -#define AML_FIELD 0x2000 -#define AML_CREATE 0x4000 - - /* * AML opcode, name, and argument layout */ @@ -561,7 +576,9 @@ { u32 parse_args; /* Grammar/Parse time arguments */ u32 runtime_args; /* Interpret time arguments */ - u16 flags; /* Opcode type, Has_args flag */ + u16 flags; /* Misc flags */ + u8 class; /* Opcode class */ + u8 type; /* Opcode type */ #ifdef _OPCODE_NAMES NATIVE_CHAR *name; /* op name (debug only) */ @@ -583,7 +600,7 @@ NATIVE_CHAR *name; /* NULL terminated string */ struct acpi_parse_obj *arg; /* arguments and contained ops */ -} ACPI_PARSE_VALUE; +} acpi_parse_value; #define ACPI_PARSE_COMMON \ @@ -597,7 +614,7 @@ NATIVE_CHAR op_name[16]) /* op name (debug only) */\ /* NON-DEBUG members below: */\ acpi_namespace_node *node; /* for use by interpreter */\ - ACPI_PARSE_VALUE value; /* Value or args associated with the opcode */\ + acpi_parse_value value; /* Value or args associated with the opcode */\ /* @@ -627,18 +644,22 @@ * Parse state - one state per parser invocation and each control * method. */ - typedef struct acpi_parse_state { + u32 aml_size; u8 *aml_start; /* first AML byte */ u8 *aml; /* next AML byte */ u8 *aml_end; /* (last + 1) AML byte */ u8 *pkg_start; /* current package begin */ u8 *pkg_end; /* current package end */ - acpi_parse_object *start_op; /* root of parse tree */ + + struct acpi_parse_obj *start_op; /* root of parse tree */ struct acpi_node *start_node; - acpi_generic_state *scope; /* current scope */ - struct acpi_parse_state *next; + union acpi_gen_state *scope; /* current scope */ + + + struct acpi_parse_obj *start_scope; + } acpi_parse_state; @@ -683,8 +704,8 @@ #define PM1_STS 0x0100 #define PM1_EN 0x0200 #define PM1_CONTROL 0x0300 -#define PM1_a_CONTROL 0x0400 -#define PM1_b_CONTROL 0x0500 +#define PM1A_CONTROL 0x0400 +#define PM1B_CONTROL 0x0500 #define PM2_CONTROL 0x0600 #define PM_TIMER 0x0700 #define PROCESSOR_BLOCK 0x0800 @@ -838,7 +859,7 @@ { char buffer[ACPI_DEVICE_ID_LENGTH]; -} ACPI_DEVICE_ID; +} acpi_device_id; /***************************************************************************** @@ -879,7 +900,7 @@ NATIVE_CHAR *proc_name; NATIVE_CHAR *module_name; -} ACPI_DEBUG_PRINT_INFO; +} acpi_debug_print_info; /* Entry for a memory allocation (debug only) */ @@ -903,14 +924,14 @@ { ACPI_COMMON_DEBUG_MEM_HEADER -} ACPI_DEBUG_MEM_HEADER; +} acpi_debug_mem_header; typedef struct acpi_debug_mem_block { ACPI_COMMON_DEBUG_MEM_HEADER - UINT64 user_space; + u64 user_space; -} ACPI_DEBUG_MEM_BLOCK; +} acpi_debug_mem_block; #define ACPI_MEM_LIST_GLOBAL 0 diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acmacros.h linux/drivers/acpi/include/acmacros.h --- v2.4.13/linux/drivers/acpi/include/acmacros.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acmacros.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acmacros.h - C macros for the entire subsystem. - * $Revision: 94 $ + * $Revision: 97 $ * *****************************************************************************/ @@ -104,7 +104,7 @@ * Full 64-bit address/integer on both 32-bit and 64-bit platforms */ #ifndef LODWORD -#define LODWORD(l) ((u32)(UINT64)(l)) +#define LODWORD(l) ((u32)(u64)(l)) #endif #ifndef HIDWORD @@ -142,7 +142,7 @@ #define MOVE_UNALIGNED16_TO_16(d,s) *(u16*)(d) = *(u16*)(s) #define MOVE_UNALIGNED32_TO_32(d,s) *(u32*)(d) = *(u32*)(s) #define MOVE_UNALIGNED16_TO_32(d,s) *(u32*)(d) = *(u16*)(s) -#define MOVE_UNALIGNED64_TO_64(d,s) *(UINT64*)(d) = *(UINT64*)(s) +#define MOVE_UNALIGNED64_TO_64(d,s) *(u64*)(d) = *(u64*)(s) #else /* @@ -197,11 +197,6 @@ #define MUL_16(a) _MUL(a,4) #define MOD_16(a) _MOD(a,16) -/* - * Divide and Modulo - */ -#define ACPI_DIVIDE(n,d) ((n) / (d)) -#define ACPI_MODULO(n,d) ((n) % (d)) /* * Rounding macros (Power of two boundaries only) @@ -223,7 +218,7 @@ #define ROUND_BITS_UP_TO_BYTES(a) DIV_8((a) + 7) #define ROUND_BITS_DOWN_TO_BYTES(a) DIV_8((a)) -#define ROUND_UP_TO_1_k(a) (((a) + 1023) >> 10) +#define ROUND_UP_TO_1K(a) (((a) + 1023) >> 10) /* Generic (non-power-of-two) rounding */ @@ -243,9 +238,9 @@ #ifndef _IA16 -#define ACPI_PCI_DEVICE_MASK (UINT64) 0x0000FFFF00000000 -#define ACPI_PCI_FUNCTION_MASK (UINT64) 0x00000000FFFF0000 -#define ACPI_PCI_REGISTER_MASK (UINT64) 0x000000000000FFFF +#define ACPI_PCI_DEVICE_MASK (u64) 0x0000FFFF00000000 +#define ACPI_PCI_FUNCTION_MASK (u64) 0x00000000FFFF0000 +#define ACPI_PCI_REGISTER_MASK (u64) 0x000000000000FFFF #define ACPI_PCI_FUNCTION(a) (u16) ((((a) & ACPI_PCI_FUNCTION_MASK) >> 16)) #define ACPI_PCI_DEVICE(a) (u16) ((((a) & ACPI_PCI_DEVICE_MASK) >> 32)) @@ -279,10 +274,6 @@ #define IS_SINGLE_TABLE(x) (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0) -/* Check if ACPI has been initialized properly */ - -#define ACPI_IS_INITIALIZATION_COMPLETE(s) {if (acpi_gbl_root_node) s = AE_OK; else s=AE_NO_NAMESPACE;} - /* * Macro to check if a pointer is within an ACPI table. * Parameter (a) is the pointer to check. Parameter (b) must be defined @@ -303,9 +294,9 @@ * Macros for the master AML opcode table */ #ifdef ACPI_DEBUG -#define ACPI_OP(name,Pargs,Iargs,flags) {Pargs,Iargs,flags,name} +#define ACPI_OP(name,Pargs,Iargs,class,type,flags) {Pargs,Iargs,flags,class,type,name} #else -#define ACPI_OP(name,Pargs,Iargs,flags) {Pargs,Iargs,flags} +#define ACPI_OP(name,Pargs,Iargs,class,type,flags) {Pargs,Iargs,flags,class,type} #endif #define ARG_TYPE_WIDTH 5 @@ -409,7 +400,7 @@ * as a local string ("_Proc_name) so that it can be also used by the function exit macros below. */ -#define PROC_NAME(a) ACPI_DEBUG_PRINT_INFO _dbg; \ +#define PROC_NAME(a) acpi_debug_print_info _dbg; \ _dbg.component_id = _COMPONENT; \ _dbg.proc_name = a; \ _dbg.module_name = _THIS_MODULE; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acnamesp.h linux/drivers/acpi/include/acnamesp.h --- v2.4.13/linux/drivers/acpi/include/acnamesp.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acnamesp.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acnamesp.h - Namespace subcomponent prototypes and defines - * $Revision: 107 $ + * $Revision: 110 $ * *****************************************************************************/ @@ -98,18 +98,16 @@ acpi_handle start_object, u32 max_depth, u8 unlock_before_callback, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value); - acpi_namespace_node * -acpi_ns_get_next_object ( +acpi_ns_get_next_node ( acpi_object_type8 type, acpi_namespace_node *parent, acpi_namespace_node *child); - acpi_status acpi_ns_delete_namespace_by_owner ( u16 table_id); @@ -224,6 +222,7 @@ void acpi_ns_dump_objects ( acpi_object_type8 type, + u8 display_type, u32 max_depth, u32 ownder_id, acpi_handle start_handle); @@ -304,7 +303,6 @@ acpi_namespace_node *obj_node, NATIVE_CHAR *search_for); - acpi_status acpi_ns_get_node ( NATIVE_CHAR *pathname, @@ -382,11 +380,11 @@ acpi_status acpi_ns_build_internal_name ( - ACPI_NAMESTRING_INFO *info); + acpi_namestring_info *info); acpi_status acpi_ns_get_internal_name_length ( - ACPI_NAMESTRING_INFO *info); + acpi_namestring_info *info); acpi_status acpi_ns_internalize_name ( @@ -401,7 +399,7 @@ NATIVE_CHAR **converted_name); acpi_namespace_node * -acpi_ns_convert_handle_to_entry ( +acpi_ns_map_handle_to_node ( acpi_handle handle); acpi_handle @@ -418,7 +416,7 @@ acpi_namespace_node * -acpi_ns_get_next_valid_object ( +acpi_ns_get_next_valid_node ( acpi_namespace_node *node); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acobject.h linux/drivers/acpi/include/acobject.h --- v2.4.13/linux/drivers/acpi/include/acobject.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acobject.h Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ /****************************************************************************** * * Name: acobject.h - Definition of acpi_operand_object (Internal object only) - * $Revision: 90 $ + * $Revision: 93 $ * *****************************************************************************/ @@ -98,6 +98,13 @@ #define AFIELD_SINGLE_DATUM 0x1 +/* + * Fields common to both Strings and Buffers + */ +#define ACPI_COMMON_BUFFER_INFO \ + u32 length; + + /****************************************************************************** * * Individual Object Descriptors @@ -132,8 +139,7 @@ typedef struct /* STRING - has length and pointer - Null terminated, ASCII characters only */ { ACPI_OBJECT_COMMON_HEADER - - u32 length; + ACPI_COMMON_BUFFER_INFO NATIVE_CHAR *pointer; /* String value in AML stream or in allocated space */ } ACPI_OBJECT_STRING; @@ -142,9 +148,8 @@ typedef struct /* BUFFER - has length and pointer - not null terminated */ { ACPI_OBJECT_COMMON_HEADER - - u32 length; - u8 *pointer; /* points to the buffer in allocated space */ + ACPI_COMMON_BUFFER_INFO + u8 *pointer; /* Buffer value in AML stream or in allocated space */ } ACPI_OBJECT_BUFFER; @@ -154,7 +159,6 @@ ACPI_OBJECT_COMMON_HEADER u32 count; /* # of elements in package */ - union acpi_operand_obj **elements; /* Array of pointers to Acpi_objects */ union acpi_operand_obj **next_element; /* used only while initializing */ @@ -188,10 +192,10 @@ u8 method_flags; u8 param_count; - u32 pcode_length; + u32 aml_length; void *semaphore; - u8 *pcode; + u8 *aml_start; u8 concurrency; u8 thread_count; @@ -341,7 +345,7 @@ ACPI_OBJECT_COMMON_HEADER acpi_namespace_node *node; /* Parent device */ - ACPI_NOTIFY_HANDLER handler; + acpi_notify_handler handler; void *context; } ACPI_OBJECT_NOTIFY_HANDLER; @@ -358,11 +362,11 @@ u8 space_id; u16 hflags; - ACPI_ADR_SPACE_HANDLER handler; + acpi_adr_space_handler handler; acpi_namespace_node *node; /* Parent device */ void *context; - ACPI_ADR_SPACE_SETUP setup; + acpi_adr_space_setup setup; union acpi_operand_obj *region_list; /* regions using this handler */ union acpi_operand_obj *next; @@ -402,8 +406,8 @@ ACPI_OBJECT_COMMON_HEADER u8 byte_fill1; u16 word_fill1; - u32 pcode_length; - u8 *pcode; + u32 aml_length; + u8 *aml_start; acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ void *region_context; /* Region-specific data */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acparser.h linux/drivers/acpi/include/acparser.h --- v2.4.13/linux/drivers/acpi/include/acparser.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acparser.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: acparser.h - AML Parser subcomponent prototypes and defines - * $Revision: 51 $ + * $Revision: 54 $ * *****************************************************************************/ @@ -121,8 +121,6 @@ acpi_status acpi_ps_find_object ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op); @@ -136,15 +134,7 @@ acpi_status acpi_ps_parse_aml ( - acpi_parse_object *start_scope, - u8 *aml, - u32 aml_size, - u32 parse_flags, - acpi_namespace_node *method_node, - acpi_operand_object **params, - acpi_operand_object **caller_return_desc, - acpi_parse_downwards descending_callback, - acpi_parse_upwards ascending_callback); + acpi_walk_state *walk_state); acpi_status acpi_ps_parse_table ( @@ -245,12 +235,6 @@ /* psutils - parser utilities */ - - -acpi_parse_state * -acpi_ps_create_state ( - u8 *aml, - u32 aml_size); void acpi_ps_init_op ( diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acpixf.h linux/drivers/acpi/include/acpixf.h --- v2.4.13/linux/drivers/acpi/include/acpixf.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acpixf.h Wed Oct 24 14:06:22 2001 @@ -135,14 +135,14 @@ acpi_object_type type, acpi_handle start_object, u32 max_depth, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void * *return_value); acpi_status acpi_get_devices ( NATIVE_CHAR *HID, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value); @@ -200,46 +200,46 @@ acpi_status acpi_install_fixed_event_handler ( u32 acpi_event, - ACPI_EVENT_HANDLER handler, + acpi_event_handler handler, void *context); acpi_status acpi_remove_fixed_event_handler ( u32 acpi_event, - ACPI_EVENT_HANDLER handler); + acpi_event_handler handler); acpi_status acpi_install_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler, + acpi_notify_handler handler, void *context); acpi_status acpi_remove_notify_handler ( acpi_handle device, u32 handler_type, - ACPI_NOTIFY_HANDLER handler); + acpi_notify_handler handler); acpi_status acpi_install_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler, - ACPI_ADR_SPACE_SETUP setup, + acpi_adr_space_handler handler, + acpi_adr_space_setup setup, void *context); acpi_status acpi_remove_address_space_handler ( acpi_handle device, ACPI_ADR_SPACE_TYPE space_id, - ACPI_ADR_SPACE_HANDLER handler); + acpi_adr_space_handler handler); acpi_status acpi_install_gpe_handler ( u32 gpe_number, u32 type, - ACPI_GPE_HANDLER handler, + acpi_gpe_handler handler, void *context); acpi_status @@ -253,17 +253,19 @@ acpi_status acpi_remove_gpe_handler ( u32 gpe_number, - ACPI_GPE_HANDLER handler); + acpi_gpe_handler handler); acpi_status acpi_enable_event ( u32 acpi_event, - u32 type); + u32 type, + u32 flags); acpi_status acpi_disable_event ( u32 acpi_event, - u32 type); + u32 type, + u32 flags); acpi_status acpi_clear_event ( diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acstruct.h linux/drivers/acpi/include/acstruct.h --- v2.4.13/linux/drivers/acpi/include/acstruct.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acstruct.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acstruct.h - Internal structs - * $Revision: 5 $ + * $Revision: 10 $ * *****************************************************************************/ @@ -51,46 +51,50 @@ u8 data_type; /* To differentiate various internal objs MUST BE FIRST!*/\ acpi_owner_id owner_id; /* Owner of objects created during the walk */ u8 last_predicate; /* Result of last predicate */ + u8 current_result; /* */ u8 next_op_info; /* Info about Next_op */ u8 num_operands; /* Stack pointer for Operands[] array */ - u8 current_result; /* */ + u8 return_used; + u8 walk_type; + u16 current_sync_level; /* Mutex Sync (nested acquire) level */ + u16 opcode; /* Current AML opcode */ + u32 arg_count; /* push for fixed or var args */ + u32 aml_offset; + u32 arg_types; + u32 method_breakpoint; /* For single stepping */ + u32 parse_flags; + u32 prev_arg_types; - struct acpi_walk_state *next; /* Next Walk_state in list */ + + u8 *aml_last_while; + struct acpi_node arguments[MTH_NUM_ARGS]; /* Control method arguments */ + union acpi_operand_obj **caller_return_desc; + acpi_generic_state *control_state; /* List of control states (nested IFs) */ + struct acpi_node local_variables[MTH_NUM_LOCALS]; /* Control method locals */ + struct acpi_node *method_call_node; /* Called method Node*/ + acpi_parse_object *method_call_op; /* Method_call Op if running a method */ + union acpi_operand_obj *method_desc; /* Method descriptor if running a method */ + struct acpi_node *method_node; /* Method Node if running a method */ + acpi_parse_object *op; /* Current parser op */ + union acpi_operand_obj *operands[OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ + const acpi_opcode_info *op_info; /* Info on current opcode */ acpi_parse_object *origin; /* Start of walk [Obsolete] */ + union acpi_operand_obj **params; + acpi_parse_state parser_state; /* Current state of parser */ + union acpi_operand_obj *result_obj; + acpi_generic_state *results; /* Stack of accumulated results */ + union acpi_operand_obj *return_desc; /* Return object, if any */ + acpi_generic_state *scope_info; /* Stack of nested scopes */ /* TBD: Obsolete with removal of WALK procedure ? */ acpi_parse_object *prev_op; /* Last op that was processed */ acpi_parse_object *next_op; /* next op to be processed */ - acpi_generic_state *results; /* Stack of accumulated results */ - acpi_generic_state *control_state; /* List of control states (nested IFs) */ - acpi_generic_state *scope_info; /* Stack of nested scopes */ - acpi_parse_state *parser_state; /* Current state of parser */ - u8 *aml_last_while; - const acpi_opcode_info *op_info; /* Info on current opcode */ acpi_parse_downwards descending_callback; acpi_parse_upwards ascending_callback; - - union acpi_operand_obj *return_desc; /* Return object, if any */ - union acpi_operand_obj *method_desc; /* Method descriptor if running a method */ - struct acpi_node *method_node; /* Method Node if running a method */ - acpi_parse_object *method_call_op; /* Method_call Op if running a method */ - struct acpi_node *method_call_node; /* Called method Node*/ - union acpi_operand_obj *operands[OBJ_NUM_OPERANDS]; /* Operands passed to the interpreter */ - struct acpi_node arguments[MTH_NUM_ARGS]; /* Control method arguments */ - struct acpi_node local_variables[MTH_NUM_LOCALS]; /* Control method locals */ struct acpi_walk_list *walk_list; - u32 parse_flags; - u8 walk_type; - u8 return_used; - u16 opcode; /* Current AML opcode */ - u32 prev_arg_types; - u16 current_sync_level; /* Mutex Sync (nested acquire) level */ - - /* Debug support */ - - u32 method_breakpoint; + struct acpi_walk_state *next; /* Next Walk_state in list */ } acpi_walk_state; @@ -121,7 +125,7 @@ u16 object_count; acpi_table_desc *table_desc; -} ACPI_INIT_WALK_INFO; +} acpi_init_walk_info; /* Info used by TBD */ @@ -133,7 +137,7 @@ u16 num_INI; acpi_table_desc *table_desc; -} ACPI_DEVICE_WALK_INFO; +} acpi_device_walk_info; /* TBD: [Restructure] Merge with struct above */ @@ -142,16 +146,54 @@ { u32 debug_level; u32 owner_id; + u8 display_type; + +} acpi_walk_info; + +/* Display Types */ -} ACPI_WALK_INFO; +#define ACPI_DISPLAY_SUMMARY 0 +#define ACPI_DISPLAY_OBJECTS 1 typedef struct acpi_get_devices_info { - ACPI_WALK_CALLBACK user_function; + acpi_walk_callback user_function; void *context; NATIVE_CHAR *hid; -} ACPI_GET_DEVICES_INFO; +} acpi_get_devices_info; + + +typedef union acpi_aml_operands +{ + acpi_operand_object *operands[7]; + + struct + { + ACPI_OBJECT_INTEGER *type; + ACPI_OBJECT_INTEGER *code; + ACPI_OBJECT_INTEGER *argument; + + } fatal; + + struct + { + acpi_operand_object *source; + ACPI_OBJECT_INTEGER *index; + acpi_operand_object *target; + + } index; + + struct + { + acpi_operand_object *source; + ACPI_OBJECT_INTEGER *index; + ACPI_OBJECT_INTEGER *length; + acpi_operand_object *target; + + } mid; + +} ACPI_AML_OPERANDS; #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actables.h linux/drivers/acpi/include/actables.h --- v2.4.13/linux/drivers/acpi/include/actables.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actables.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: actables.h - ACPI table management - * $Revision: 31 $ + * $Revision: 32 $ * *****************************************************************************/ @@ -176,10 +176,6 @@ /* * tbutils - common table utilities */ - -u8 -acpi_tb_system_table_pointer ( - void *where); acpi_status acpi_tb_map_acpi_table ( diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl.h linux/drivers/acpi/include/actbl.h --- v2.4.13/linux/drivers/acpi/include/actbl.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl.h Wed Oct 24 14:06:22 2001 @@ -84,7 +84,7 @@ u8 revision; /* Must be 0 for 1.0, 2 for 2.0 */ u32 rsdt_physical_address; /* 32-bit physical address of RSDT */ u32 length; /* XSDT Length in bytes including hdr */ - UINT64 xsdt_physical_address; /* 64-bit physical address of XSDT */ + u64 xsdt_physical_address; /* 64-bit physical address of XSDT */ u8 extended_checksum; /* Checksum of entire table */ NATIVE_CHAR reserved [3]; /* reserved field must be 0 */ @@ -110,7 +110,7 @@ typedef struct /* Common FACS for internal use */ { u32 *global_lock; - UINT64 *firmware_waking_vector; + u64 *firmware_waking_vector; u8 vector_width; } acpi_common_facs; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl1.h linux/drivers/acpi/include/actbl1.h --- v2.4.13/linux/drivers/acpi/include/actbl1.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl1.h Wed Oct 24 14:06:22 2001 @@ -51,7 +51,7 @@ u32 hardware_signature; /* hardware configuration signature */ u32 firmware_waking_vector; /* ACPI OS waking vector */ u32 global_lock; /* Global Lock */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ + u32 S4bios_f : 1; /* Indicates if S4BIOS support is present */ u32 reserved1 : 31; /* must be 0 */ u8 resverved3 [40]; /* reserved - must be zero */ @@ -73,7 +73,7 @@ u32 smi_cmd; /* Port address of SMI command port */ u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ u8 reserved2; /* reserved - must be zero */ u32 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ u32 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl2.h linux/drivers/acpi/include/actbl2.h --- v2.4.13/linux/drivers/acpi/include/actbl2.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl2.h Wed Oct 24 14:06:22 2001 @@ -65,7 +65,7 @@ typedef struct { acpi_table_header header; /* Table header */ - UINT64 table_offset_entry [1]; /* Array of pointers to */ + u64 table_offset_entry [1]; /* Array of pointers to */ /* other tables' headers */ } XSDT_DESCRIPTOR_REV2; @@ -80,9 +80,9 @@ u32 hardware_signature; /* hardware configuration signature */ u32 firmware_waking_vector; /* 32bit physical address of the Firmware Waking Vector. */ u32 global_lock; /* Global Lock used to synchronize access to shared hardware resources */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ + u32 S4bios_f : 1; /* Indicates if S4BIOS support is present */ u32 reserved1 : 31; /* must be 0 */ - UINT64 Xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */ + u64 Xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */ u8 version; /* Version of this table */ u8 reserved3 [31]; /* reserved - must be zero */ @@ -98,7 +98,7 @@ u8 register_bit_width; /* Size in bits of given register */ u8 register_bit_offset; /* Bit offset within the register */ u8 reserved; /* Must be 0 */ - UINT64 address; /* 64-bit address of struct or register */ + u64 address; /* 64-bit address of struct or register */ } acpi_generic_address; @@ -117,7 +117,7 @@ u32 smi_cmd; /* Port address of SMI command port */ u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ u8 pstate_cnt; /* processor performance state control*/ u32 V1_pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ u32 V1_pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ @@ -139,8 +139,8 @@ u16 plvl3_lat; /* worst case HW latency to enter/exit C3 state */ u16 flush_size; /* number of flush strides that need to be read */ u16 flush_stride; /* Processor's memory cache line width, in bytes */ - u8 duty_offset; /* Processor’s duty cycle index in processor's P_CNT reg*/ - u8 duty_width; /* Processor’s duty cycle value bit width in P_CNT register.*/ + u8 duty_offset; /* Processor_’s duty cycle index in processor's P_CNT reg*/ + u8 duty_width; /* Processor_’s duty cycle value bit width in P_CNT register.*/ u8 day_alrm; /* index to day-of-month alarm in RTC CMOS RAM */ u8 mon_alrm; /* index to month-of-year alarm in RTC CMOS RAM */ u8 century; /* index to century in RTC CMOS RAM */ @@ -166,8 +166,8 @@ acpi_generic_address reset_register; /* Reset register address in GAS format */ u8 reset_value; /* Value to write to the Reset_register port to reset the system. */ u8 reserved7[3]; /* These three bytes must be zero */ - UINT64 Xfirmware_ctrl; /* 64-bit physical address of FACS */ - UINT64 Xdsdt; /* 64-bit physical address of DSDT */ + u64 Xfirmware_ctrl; /* 64-bit physical address of FACS */ + u64 Xdsdt; /* 64-bit physical address of DSDT */ acpi_generic_address Xpm1a_evt_blk; /* Extended Power Mgt 1a Acpi_event Reg Blk address */ acpi_generic_address Xpm1b_evt_blk; /* Extended Power Mgt 1b Acpi_event Reg Blk address */ acpi_generic_address Xpm1a_cnt_blk; /* Extended Power Mgt 1a Control Reg Blk address */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actbl71.h linux/drivers/acpi/include/actbl71.h --- v2.4.13/linux/drivers/acpi/include/actbl71.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actbl71.h Wed Oct 24 14:06:22 2001 @@ -41,7 +41,7 @@ /* Only for clarity in declarations */ -typedef UINT64 IO_ADDRESS; +typedef u64 IO_ADDRESS; #pragma pack(1) @@ -51,7 +51,7 @@ u8 checksum; /* to make sum of struct == 0 */ NATIVE_CHAR oem_id [6]; /* OEM identification */ u8 reserved; /* Must be 0 for 1.0, 2 for 2.0 */ - UINT64 rsdt_physical_address; /* 64-bit physical address of RSDT */ + u64 rsdt_physical_address; /* 64-bit physical address of RSDT */ } RSDP_DESCRIPTOR_REV071; @@ -63,7 +63,7 @@ { acpi_table_header header; /* Table header */ u32 reserved_pad; /* IA64 alignment, must be 0 */ - UINT64 table_offset_entry [1]; /* Array of pointers to other */ + u64 table_offset_entry [1]; /* Array of pointers to other */ /* tables' headers */ } RSDT_DESCRIPTOR_REV071; @@ -78,9 +78,9 @@ u32 length; /* length of structure, in bytes */ u32 hardware_signature; /* hardware configuration signature */ u32 reserved4; /* must be 0 */ - UINT64 firmware_waking_vector; /* ACPI OS waking vector */ - UINT64 global_lock; /* Global Lock */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ + u64 firmware_waking_vector; /* ACPI OS waking vector */ + u64 global_lock; /* Global Lock */ + u32 S4bios_f : 1; /* Indicates if S4BIOS support is present */ u32 reserved1 : 31; /* must be 0 */ u8 reserved3 [28]; /* reserved - must be zero */ @@ -95,24 +95,24 @@ { acpi_table_header header; /* table header */ u32 reserved_pad; /* IA64 alignment, must be 0 */ - UINT64 firmware_ctrl; /* 64-bit Physical address of FACS */ - UINT64 dsdt; /* 64-bit Physical address of DSDT */ + u64 firmware_ctrl; /* 64-bit Physical address of FACS */ + u64 dsdt; /* 64-bit Physical address of DSDT */ u8 model; /* System Interrupt Model */ u8 address_space; /* Address Space Bitmask */ u16 sci_int; /* System vector of SCI interrupt */ u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ + u8 S4bios_req; /* Value to write to SMI CMD to enter S4BIOS state */ u8 reserved2; /* reserved - must be zero */ - UINT64 smi_cmd; /* Port address of SMI command port */ - UINT64 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ - UINT64 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ - UINT64 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ - UINT64 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ - UINT64 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ - UINT64 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ - UINT64 gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ - UINT64 gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ + u64 smi_cmd; /* Port address of SMI command port */ + u64 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ + u64 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ + u64 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ + u64 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ + u64 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ + u64 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ + u64 gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ + u64 gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ u8 pm1_evt_len; /* Byte Length of ports at pm1_x_evt_blk */ u8 pm1_cnt_len; /* Byte Length of ports at pm1_x_cnt_blk */ u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/actypes.h linux/drivers/acpi/include/actypes.h --- v2.4.13/linux/drivers/acpi/include/actypes.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/actypes.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: actypes.h - Common data types for the entire ACPI subsystem - * $Revision: 188 $ + * $Revision: 193 $ * *****************************************************************************/ @@ -68,9 +68,8 @@ typedef UINT64 ACPI_IO_ADDRESS; typedef UINT64 ACPI_PHYSICAL_ADDRESS; -#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 - -/* (No hardware alignment support in IA64) */ +#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 /* No hardware alignment support in IA64 */ +#define ACPI_USE_NATIVE_DIVIDE /* Native 64-bit integer support */ #elif _IA16 @@ -101,6 +100,7 @@ #define ALIGNED_ADDRESS_BOUNDARY 0x00000002 #define _HW_ALIGNMENT_SUPPORT +#define ACPI_USE_NATIVE_DIVIDE /* No 64-bit integers, ok to use native divide */ /* * (16-bit only) internal integers must be 32-bits, so @@ -196,11 +196,18 @@ typedef struct { - u32 lo; - u32 hi; + u32 lo; + u32 hi; } uint64_struct; +typedef union +{ + u64 full; + uint64_struct part; + +} uint64_overlay; + /* * Acpi integer width. In ACPI version 1, integers are @@ -220,17 +227,23 @@ #define ACPI_MAX_BCD_DIGITS 8 #define ACPI_MAX_DECIMAL_DIGITS 10 +#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 32-bit divide */ + + #else /* 64-bit integers */ -typedef UINT64 acpi_integer; +typedef u64 acpi_integer; #define ACPI_INTEGER_MAX ACPI_UINT64_MAX #define ACPI_INTEGER_BIT_SIZE 64 #define ACPI_MAX_BCD_VALUE 9999999999999999 #define ACPI_MAX_BCD_DIGITS 16 #define ACPI_MAX_DECIMAL_DIGITS 19 +#ifdef _IA64 +#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 64-bit divide */ +#endif #endif @@ -453,24 +466,36 @@ #define ACPI_EVENT_EDGE_TRIGGERED (acpi_event_type) 2 /* + * GPEs + */ +#define ACPI_EVENT_ENABLE 0x1 +#define ACPI_EVENT_WAKE_ENABLE 0x2 + +#define ACPI_EVENT_DISABLE 0x1 +#define ACPI_EVENT_WAKE_DISABLE 0x2 + + +/* * Acpi_event Status: * ------------- * The encoding of acpi_event_status is illustrated below. * Note that a set bit (1) indicates the property is TRUE * (e.g. if bit 0 is set then the event is enabled). - * +---------------+-+-+ - * | Bits 31:2 |1|0| - * +---------------+-+-+ - * | | | - * | | +- Enabled? - * | +--- Set? + * +-------------+-+-+-+ + * | Bits 31:3 |2|1|0| + * +-------------+-+-+-+ + * | | | | + * | | | +- Enabled? + * | | +--- Enabled for wake? + * | +----- Set? * +----------- */ typedef u32 acpi_event_status; #define ACPI_EVENT_FLAG_DISABLED (acpi_event_status) 0x00 #define ACPI_EVENT_FLAG_ENABLED (acpi_event_status) 0x01 -#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x02 +#define ACPI_EVENT_FLAG_WAKE_ENABLED (acpi_event_status) 0x02 +#define ACPI_EVENT_FLAG_SET (acpi_event_status) 0x04 /* Notify types */ @@ -604,7 +629,7 @@ { u32 count; -} ACPI_TABLE_INFO; +} acpi_table_info; /* @@ -621,7 +646,7 @@ u32 debug_level; u32 debug_layer; u32 num_table_types; - ACPI_TABLE_INFO table_info [NUM_ACPI_TABLES]; + acpi_table_info table_info [NUM_ACPI_TABLES]; } acpi_system_info; @@ -631,15 +656,15 @@ */ typedef -u32 (*ACPI_EVENT_HANDLER) ( +u32 (*acpi_event_handler) ( void *context); typedef -void (*ACPI_GPE_HANDLER) ( +void (*acpi_gpe_handler) ( void *context); typedef -void (*ACPI_NOTIFY_HANDLER) ( +void (*acpi_notify_handler) ( acpi_handle device, u32 value, void *context); @@ -651,7 +676,7 @@ #define ACPI_WRITE_ADR_SPACE 2 typedef -acpi_status (*ACPI_ADR_SPACE_HANDLER) ( +acpi_status (*acpi_adr_space_handler) ( u32 function, ACPI_PHYSICAL_ADDRESS address, u32 bit_width, @@ -659,11 +684,11 @@ void *handler_context, void *region_context); -#define ACPI_DEFAULT_HANDLER ((ACPI_ADR_SPACE_HANDLER) NULL) +#define ACPI_DEFAULT_HANDLER ((acpi_adr_space_handler) NULL) typedef -acpi_status (*ACPI_ADR_SPACE_SETUP) ( +acpi_status (*acpi_adr_space_setup) ( acpi_handle region_handle, u32 function, void *handler_context, @@ -673,7 +698,7 @@ #define ACPI_REGION_DEACTIVATE 1 typedef -acpi_status (*ACPI_WALK_CALLBACK) ( +acpi_status (*acpi_walk_callback) ( acpi_handle obj_handle, u32 nesting_level, void *context, @@ -758,7 +783,7 @@ /* * IO Attributes - * The ISA IO ranges are: n000-n0FFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. + * The ISA IO ranges are: n000-n0FFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. * The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cD0-n_fFFh. */ #define NON_ISA_ONLY_RANGES (u8) 0x01 @@ -988,11 +1013,11 @@ u32 min_address_fixed; u32 max_address_fixed; acpi_resource_attribute attribute; - UINT64 granularity; - UINT64 min_address_range; - UINT64 max_address_range; - UINT64 address_translation_offset; - UINT64 address_length; + u64 granularity; + u64 min_address_range; + u64 max_address_range; + u64 address_translation_offset; + u64 address_length; acpi_resource_source resource_source; } acpi_resource_address64; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/acutils.h linux/drivers/acpi/include/acutils.h --- v2.4.13/linux/drivers/acpi/include/acutils.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/acutils.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures - * $Revision: 113 $ + * $Revision: 117 $ * *****************************************************************************/ @@ -270,47 +270,47 @@ void acpi_ut_trace ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info); + acpi_debug_print_info *dbg_info); void acpi_ut_trace_ptr ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, void *pointer); void acpi_ut_trace_u32 ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u32 integer); void acpi_ut_trace_str ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, NATIVE_CHAR *string); void acpi_ut_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info); + acpi_debug_print_info *dbg_info); void acpi_ut_status_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_status status); void acpi_ut_value_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_integer value); void acpi_ut_ptr_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u8 *ptr); void @@ -342,17 +342,17 @@ acpi_ut_debug_print ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, - ...); + ...) ACPI_PRINTF_LIKE_FUNC; void acpi_ut_debug_print_raw ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, - ...); + ...) ACPI_PRINTF_LIKE_FUNC; /* @@ -389,6 +389,7 @@ #define METHOD_NAME__REG "_REG" #define METHOD_NAME__SEG "_SEG" #define METHOD_NAME__BBN "_BBN" +#define METHOD_NAME__PRT "_PRT" acpi_status @@ -400,7 +401,7 @@ acpi_status acpi_ut_execute_HID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *hid); + acpi_device_id *hid); acpi_status acpi_ut_execute_STA ( @@ -410,7 +411,7 @@ acpi_status acpi_ut_execute_UID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *uid); + acpi_device_id *uid); /* @@ -562,9 +563,23 @@ void); /* - * Ututils + * utmisc */ +acpi_status +acpi_ut_divide ( + acpi_integer *in_dividend, + acpi_integer *in_divisor, + acpi_integer *out_quotient, + acpi_integer *out_remainder); + +acpi_status +acpi_ut_short_divide ( + acpi_integer *in_dividend, + u32 divisor, + acpi_integer *out_quotient, + u32 *out_remainder); + u8 acpi_ut_valid_acpi_name ( u32 name); @@ -638,7 +653,7 @@ void); void -acpi_ut_dump_current_allocations ( +acpi_ut_dump_allocations ( u32 component, NATIVE_CHAR *module); #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/amlcode.h linux/drivers/acpi/include/amlcode.h --- v2.4.13/linux/drivers/acpi/include/amlcode.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/amlcode.h Wed Oct 24 14:06:22 2001 @@ -3,7 +3,7 @@ * Name: amlcode.h - Definitions for AML, as included in "definition blocks" * Declarations and definitions contained herein are derived * directly from the ACPI specification. - * $Revision: 53 $ + * $Revision: 58 $ * *****************************************************************************/ @@ -266,47 +266,96 @@ #define OPGRP_FIELD 0x02 #define OPGRP_BYTELIST 0x04 -#define OPTYPE_UNDEFINED 0 +/* + * Opcode information + */ -#define OPTYPE_LITERAL 1 -#define OPTYPE_CONSTANT 2 -#define OPTYPE_METHOD_ARGUMENT 3 -#define OPTYPE_LOCAL_VARIABLE 4 -#define OPTYPE_DATA_TERM 5 - -/* Type 1 opcodes */ - -#define OPTYPE_MONADIC1 6 -#define OPTYPE_DYADIC1 7 - -/* Type 2 opcodes */ +/* Opcode flags */ -#define OPTYPE_MONADIC2 8 -#define OPTYPE_MONADIC2_r 9 -#define OPTYPE_DYADIC2 10 -#define OPTYPE_DYADIC2_r 11 -#define OPTYPE_DYADIC2_s 12 +#define AML_HAS_ARGS 0x0800 +#define AML_HAS_TARGET 0x0400 +#define AML_HAS_RETVAL 0x0200 +#define AML_NSOBJECT 0x0100 +#define AML_NSOPCODE 0x0080 +#define AML_NSNODE 0x0040 +#define AML_NAMED 0x0020 +#define AML_DEFER 0x0010 +#define AML_FIELD 0x0008 +#define AML_CREATE 0x0004 +#define AML_MATH 0x0002 +#define AML_LOGICAL 0x0001 + +/* Convenient flag groupings */ + +#define AML_FLAGS_EXEC_1A_0T_0R AML_HAS_ARGS /* Monadic1 */ +#define AML_FLAGS_EXEC_1A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Monadic2 */ +#define AML_FLAGS_EXEC_1A_1T_0R AML_HAS_ARGS | AML_HAS_TARGET +#define AML_FLAGS_EXEC_1A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* Monadic2_r */ +#define AML_FLAGS_EXEC_2A_0T_0R AML_HAS_ARGS /* Dyadic1 */ +#define AML_FLAGS_EXEC_2A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Dyadic2 */ +#define AML_FLAGS_EXEC_2A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* Dyadic2_r */ +#define AML_FLAGS_EXEC_2A_2T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL +#define AML_FLAGS_EXEC_3A_0T_0R AML_HAS_ARGS +#define AML_FLAGS_EXEC_3A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL +#define AML_FLAGS_EXEC_6A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL -/* Multi-operand (>=3) opcodes */ -#define OPTYPE_TRIADIC 13 -#define OPTYPE_QUADRADIC 14 -#define OPTYPE_HEXADIC 15 +/* + * The opcode Type is used in a dispatch table, do not change + * without updating the table. + */ +#define AML_TYPE_EXEC_1A_0T_0R 0x00 /* Monadic1 */ +#define AML_TYPE_EXEC_1A_0T_1R 0x01 /* Monadic2 */ +#define AML_TYPE_EXEC_1A_1T_0R 0x02 +#define AML_TYPE_EXEC_1A_1T_1R 0x03 /* Monadic2_r */ +#define AML_TYPE_EXEC_2A_0T_0R 0x04 /* Dyadic1 */ +#define AML_TYPE_EXEC_2A_0T_1R 0x05 /* Dyadic2 */ +#define AML_TYPE_EXEC_2A_1T_1R 0x06 /* Dyadic2_r */ +#define AML_TYPE_EXEC_2A_2T_1R 0x07 +#define AML_TYPE_EXEC_3A_0T_0R 0x08 +#define AML_TYPE_EXEC_3A_1T_1R 0x09 +#define AML_TYPE_EXEC_6A_0T_1R 0x0A +/* End of types used in dispatch table */ + +#define AML_TYPE_LITERAL 0x0B +#define AML_TYPE_CONSTANT 0x0C +#define AML_TYPE_METHOD_ARGUMENT 0x0D +#define AML_TYPE_LOCAL_VARIABLE 0x0E +#define AML_TYPE_DATA_TERM 0x0F /* Generic for an op that returns a value */ -#define OPTYPE_METHOD_CALL 16 +#define AML_TYPE_METHOD_CALL 0x10 /* Misc */ -#define OPTYPE_CREATE_FIELD 17 -#define OPTYPE_CONTROL 18 -#define OPTYPE_RECONFIGURATION 19 -#define OPTYPE_NAMED_OBJECT 20 -#define OPTYPE_RETURN 21 +#define AML_TYPE_CREATE_FIELD 0x11 +#define AML_TYPE_CONTROL 0x12 +#define AML_TYPE_NAMED_NO_OBJ 0x13 +#define AML_TYPE_NAMED_FIELD 0x14 +#define AML_TYPE_NAMED_SIMPLE 0x15 +#define AML_TYPE_NAMED_COMPLEX 0x16 +#define AML_TYPE_RETURN 0x17 + +#define AML_TYPE_UNDEFINED 0x18 +#define AML_TYPE_BOGUS 0x19 + -#define OPTYPE_BOGUS 22 +/* + * Opcode classes + */ +#define AML_CLASS_EXECUTE 0x00 +#define AML_CLASS_CREATE 0x01 +#define AML_CLASS_ARGUMENT 0x02 +#define AML_CLASS_NAMED_OBJECT 0x03 +#define AML_CLASS_CONTROL 0x04 +#define AML_CLASS_ASCII 0x05 +#define AML_CLASS_PREFIX 0x06 +#define AML_CLASS_INTERNAL 0x07 +#define AML_CLASS_RETURN_VALUE 0x08 +#define AML_CLASS_METHOD_CALL 0x09 +#define AML_CLASS_UNKNOWN 0x0A /* Predefined Operation Region Space_iDs */ @@ -406,18 +455,5 @@ #define USER_REGION_BEGIN 0x80 -/* - * AML tables - */ - -#ifdef DEFINE_AML_GLOBALS - -/* External declarations for the AML tables */ - -extern u8 acpi_gbl_aml [NUM_OPCODES]; -extern u16 acpi_gbl_pfx [NUM_OPCODES]; - - -#endif /* DEFINE_AML_GLOBALS */ #endif /* __AMLCODE_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/platform/acenv.h linux/drivers/acpi/include/platform/acenv.h --- v2.4.13/linux/drivers/acpi/include/platform/acenv.h Sun Sep 23 11:40:56 2001 +++ linux/drivers/acpi/include/platform/acenv.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acenv.h - Generation environment specific items - * $Revision: 76 $ + * $Revision: 77 $ * *****************************************************************************/ @@ -126,6 +126,12 @@ /* Name of host operating system (returned by the _OS_ namespace object) */ #define ACPI_OS_NAME "Intel ACPI/CA Core Subsystem" + +/* This macro is used to tag functions as "printf-like" because + * some compilers can catch printf format string problems. MSVC + * doesn't, so this is proprocessed away. + */ +#define ACPI_PRINTF_LIKE_FUNC #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/platform/acgcc.h linux/drivers/acpi/include/platform/acgcc.h --- v2.4.13/linux/drivers/acpi/include/platform/acgcc.h Tue Oct 23 22:48:50 2001 +++ linux/drivers/acpi/include/platform/acgcc.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: acgcc.h - GCC specific defines, etc. - * $Revision: 9 $ + * $Revision: 14 $ * *****************************************************************************/ @@ -93,6 +93,7 @@ #else /* DO IA32 */ + #define COMPILER_DEPENDENT_UINT64 unsigned long long #define ACPI_ASM_MACROS #define causeinterrupt(level) @@ -100,7 +101,6 @@ #define disable() __cli() #define enable() __sti() #define halt() __asm__ __volatile__ ("sti; hlt":::"memory") -#define wbinvd() __asm__ __volatile__ ("wbinvd":::"memory") /*! [Begin] no source code translation * @@ -139,8 +139,30 @@ :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ } while(0) + +/* + * Math helper asm macros + */ +#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ + asm("divl %2;" \ + :"=a"(q32), "=d"(r32) \ + :"r"(d32), \ + "0"(n_lo), "1"(n_hi)) + + +#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ + asm("shrl $1,%2;" \ + "rcrl $1,%3;" \ + :"=r"(n_hi), "=r"(n_lo) \ + :"0"(n_hi), "1"(n_lo)) + /*! [End] no source code translation !*/ #endif /* IA 32 */ + +/* This macro is used to tag functions as "printf-like" because + * some compilers (like GCC) can catch printf format string problems. + */ +#define ACPI_PRINTF_LIKE_FUNC __attribute__ ((__format__ (__printf__, 4, 5))) #endif /* __ACGCC_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/include/platform/aclinux.h linux/drivers/acpi/include/platform/aclinux.h --- v2.4.13/linux/drivers/acpi/include/platform/aclinux.h Tue Jul 3 17:08:19 2001 +++ linux/drivers/acpi/include/platform/aclinux.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Name: aclinux.h - OS specific defines, etc. - * $Revision: 13 $ + * $Revision: 14 $ * *****************************************************************************/ @@ -57,15 +57,6 @@ #undef DEBUGGER_THREADING #define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED - -#ifndef _IA64 -/* Linux ia32 can't do int64 well */ -#define ACPI_NO_INTEGER64_SUPPORT -/* And the ia32 kernel doesn't include 64-bit divide support */ -#define ACPI_DIV64(dividend, divisor) do_div(dividend, divisor) -#else -#define ACPI_DIV64(dividend, divisor) ACPI_DIVIDE(dividend, divisor) -#endif #endif /* __ACLINUX_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsaccess.c linux/drivers/acpi/namespace/nsaccess.c --- v2.4.13/linux/drivers/acpi/namespace/nsaccess.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsaccess.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsaccess - Top-level functions for accessing ACPI namespace - * $Revision: 133 $ + * $Revision: 135 $ * ******************************************************************************/ @@ -185,6 +185,10 @@ /* Store pointer to value descriptor in the Node */ acpi_ns_attach_object (new_node, obj_desc, obj_desc->common.type); + + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); } } @@ -434,7 +438,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[")); for (i = 0; i < num_segments; i++) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%4.4s/", &pathname[i * 4])); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "%4.4s/", (char*)&pathname[i * 4])); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_NAMES, "]\n")); #endif @@ -474,8 +478,8 @@ /* Name not found in ACPI namespace */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Name [%4.4s] not found in scope %X\n", - &simple_name, current_node)); + "Name [%4.4s] not found in scope %p\n", + (char*)&simple_name, current_node)); } return_ACPI_STATUS (status); @@ -507,7 +511,7 @@ REPORT_WARNING ( ("Ns_lookup: %4.4s, type %X, checking for type %X\n", - &simple_name, this_node->type, type_to_check_for)); + (char*)&simple_name, this_node->type, type_to_check_for)); } /* @@ -525,7 +529,7 @@ * More segments or the type implies enclosed scope, * and the next scope has not been allocated. */ - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Load mode=%X This_node=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Load mode=%X This_node=%p\n", interpreter_mode, this_node)); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsalloc.c linux/drivers/acpi/namespace/nsalloc.c --- v2.4.13/linux/drivers/acpi/namespace/nsalloc.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsalloc.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsalloc - Namespace allocation and deletion utilities - * $Revision: 56 $ + * $Revision: 60 $ * ******************************************************************************/ @@ -210,7 +210,7 @@ * real definition is found later. */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "[%4.4s] is a forward reference\n", - &node->name)); + (char*)&node->name)); } /* @@ -235,7 +235,7 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s added to %p at %p\n", - &node->name, parent_node, node)); + (char*)&node->name, parent_node, node)); /* * Increment the reference count(s) of all parents up to @@ -297,7 +297,7 @@ /* Grandchildren should have all been deleted already */ if (child_node->child) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Found a grandchild! P=%X C=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Found a grandchild! P=%p C=%p\n", parent_node, child_node)); } @@ -309,12 +309,9 @@ child_node, acpi_gbl_current_node_count)); /* - * Detach an object if there is one + * Detach an object if there is one, then free the child node */ - if (child_node->object) { - acpi_ns_detach_object (child_node); - } - + acpi_ns_detach_object (child_node); ACPI_MEM_FREE (child_node); /* And move on to the next child in the list */ @@ -349,9 +346,8 @@ acpi_ns_delete_namespace_subtree ( acpi_namespace_node *parent_node) { - acpi_namespace_node *child_node; - acpi_operand_object *obj_desc; - u32 level; + acpi_namespace_node *child_node = NULL; + u32 level = 1; FUNCTION_TRACE ("Ns_delete_namespace_subtree"); @@ -361,39 +357,26 @@ return_ACPI_STATUS (AE_OK); } - - child_node = 0; - level = 1; - /* * Traverse the tree of objects until we bubble back up * to where we started. */ while (level > 0) { - /* - * Get the next typed object in this scope. - * Null returned if not found - */ - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node, + /* Get the next node in this scope (NULL if none) */ + + child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, child_node); if (child_node) { - /* - * Found an object - delete the object within - * the Value field - */ - obj_desc = acpi_ns_get_attached_object (child_node); - if (obj_desc) { - acpi_ns_detach_object (child_node); - acpi_ut_remove_reference (obj_desc); - } + /* Found a child node - detach any attached object */ + acpi_ns_detach_object (child_node); - /* Check if this object has any children */ + /* Check if this node has any children */ - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) { + if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, 0)) { /* - * There is at least one child of this object, - * visit the object + * There is at least one child of this node, + * visit the node */ level++; parent_node = child_node; @@ -403,8 +386,8 @@ else { /* - * No more children in this object. - * We will move up to the grandparent. + * No more children of this parent node. + * Move up to the grandparent. */ level--; @@ -414,17 +397,16 @@ */ acpi_ns_delete_children (parent_node); - /* New "last child" is this parent object */ + /* New "last child" is this parent node */ child_node = parent_node; - /* Now we can move up the tree to the grandparent */ + /* Move up the tree to the grandparent */ parent_node = acpi_ns_get_parent_object (parent_node); } } - return_ACPI_STATUS (AE_OK); } @@ -433,13 +415,13 @@ * * FUNCTION: Acpi_ns_remove_reference * - * PARAMETERS: Node - Named object whose reference count is to be + * PARAMETERS: Node - Named node whose reference count is to be * decremented * * RETURN: None. * * DESCRIPTION: Remove a Node reference. Decrements the reference count - * of all parent Nodes up to the root. Any object along + * of all parent Nodes up to the root. Any node along * the way that reaches zero references is freed. * ******************************************************************************/ @@ -455,19 +437,19 @@ /* - * Decrement the reference count(s) of this object and all - * objects up to the root, Delete anything with zero remaining references. + * Decrement the reference count(s) of this node and all + * nodes up to the root, Delete anything with zero remaining references. */ next_node = node; while (next_node) { - /* Decrement the reference count on this object*/ + /* Decrement the reference count on this node*/ next_node->reference_count--; - /* Delete the object if no more references */ + /* Delete the node if no more references */ if (!next_node->reference_count) { - /* Delete all children and delete the object */ + /* Delete all children and delete the node */ acpi_ns_delete_children (next_node); acpi_ns_delete_node (next_node); @@ -500,7 +482,6 @@ { acpi_namespace_node *child_node; u32 level; - acpi_operand_object *obj_desc; acpi_namespace_node *parent_node; @@ -512,38 +493,28 @@ level = 1; /* - * Traverse the tree of objects until we bubble back up + * Traverse the tree of nodes until we bubble back up * to where we started. */ while (level > 0) { - /* - * Get the next typed object in this scope. - * Null returned if not found - */ - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node, - child_node); + /* Get the next node in this scope (NULL if none) */ + child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, + child_node); if (child_node) { if (child_node->owner_id == owner_id) { - /* - * Found an object - delete the object within - * the Value field - */ - obj_desc = acpi_ns_get_attached_object (child_node); - if (obj_desc) { - acpi_ns_detach_object (child_node); - acpi_ut_remove_reference (obj_desc); - } + /* Found a child node - detach any attached object */ + + acpi_ns_detach_object (child_node); } - /* Check if this object has any children */ + /* Check if this node has any children */ - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) { + if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, 0)) { /* - * There is at least one child of this object, - * visit the object + * There is at least one child of this node, + * visit the node */ - level++; parent_node = child_node; child_node = 0; @@ -556,7 +527,8 @@ else { /* - * No more children in this object. Move up to grandparent. + * No more children of this parent node. + * Move up to the grandparent. */ level--; @@ -566,16 +538,15 @@ } } - /* New "last child" is this parent object */ + /* New "last child" is this parent node */ child_node = parent_node; - /* Now we can move up the tree to the grandparent */ + /* Move up the tree to the grandparent */ parent_node = acpi_ns_get_parent_object (parent_node); } } - return_ACPI_STATUS (AE_OK); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsdump.c linux/drivers/acpi/namespace/nsdump.c --- v2.4.13/linux/drivers/acpi/namespace/nsdump.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsdump.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsdump - table dumping routines for debug - * $Revision: 99 $ + * $Revision: 105 $ * *****************************************************************************/ @@ -28,6 +28,7 @@ #include "acinterp.h" #include "acnamesp.h" #include "actables.h" +#include "acparser.h" #define _COMPONENT ACPI_NAMESPACE @@ -108,9 +109,8 @@ void *context, void **return_value) { - ACPI_WALK_INFO *info = (ACPI_WALK_INFO *) context; + acpi_walk_info *info = (acpi_walk_info *) context; acpi_namespace_node *this_node; - u8 *value; acpi_operand_object *obj_desc = NULL; acpi_object_type8 obj_type; acpi_object_type8 type; @@ -118,12 +118,13 @@ u32 downstream_sibling_mask = 0; u32 level_tmp; u32 which_bit; + u32 i; PROC_NAME ("Ns_dump_one_object"); - this_node = acpi_ns_convert_handle_to_entry (obj_handle); + this_node = acpi_ns_map_handle_to_node (obj_handle); level_tmp = level; type = this_node->type; @@ -204,56 +205,198 @@ /* * Now we can print out the pertinent information */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %4.4s %-9s ", &this_node->name, acpi_ut_get_type_name (type))); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "%p S:%p O:%p", this_node, this_node->child, this_node->object)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %4.4s %-12s %p", + (char*)&this_node->name, acpi_ut_get_type_name (type), this_node)); + obj_desc = this_node->object; - if (!this_node->object) { - /* No attached object, we are done */ + switch (info->display_type) { + case ACPI_DISPLAY_SUMMARY: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); - return (AE_OK); - } + if (!obj_desc) { + /* No attached object, we are done */ - switch (type) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + return (AE_OK); + } - case ACPI_TYPE_METHOD: - /* Name is a Method and its AML offset/length are set */ + switch (type) { + case ACPI_TYPE_PROCESSOR: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ID %d Addr %.4X Len %.4X\n", + obj_desc->processor.proc_id, + obj_desc->processor.address, + obj_desc->processor.length)); + break; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " M:%p-%X\n", - ((acpi_operand_object *) this_node->object)->method.pcode, - ((acpi_operand_object *) this_node->object)->method.pcode_length)); + case ACPI_TYPE_DEVICE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Notification object: %p", obj_desc)); + break; - break; + case ACPI_TYPE_METHOD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Args %d Len %.4X Aml %p \n", + obj_desc->method.param_count, + obj_desc->method.aml_length, + obj_desc->method.aml_start)); + break; + case ACPI_TYPE_INTEGER: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " = %8.8X%8.8X\n", + HIDWORD (obj_desc->integer.value), + LODWORD (obj_desc->integer.value))); + break; - case ACPI_TYPE_INTEGER: + case ACPI_TYPE_PACKAGE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Elements %.2X\n", + obj_desc->package.count)); + break; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " N:%X\n", - ((acpi_operand_object *) this_node->object)->integer.value)); - break; + case ACPI_TYPE_BUFFER: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Len %.2X", + obj_desc->buffer.length)); + /* Dump some of the buffer */ - case ACPI_TYPE_STRING: + if (obj_desc->buffer.length > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " =")); + for (i = 0; (i < obj_desc->buffer.length && i < 12); i++) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " %.2X", + obj_desc->buffer.pointer[i])); + } + } + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + break; - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " S:%p-%X\n", - ((acpi_operand_object *) this_node->object)->string.pointer, - ((acpi_operand_object *) this_node->object)->string.length)); - break; + case ACPI_TYPE_STRING: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Len %.2X", + obj_desc->string.length)); + if (obj_desc->string.length > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " = \"%.32s\"...", + obj_desc->string.pointer)); + } + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + break; - case ACPI_TYPE_BUFFER: + case ACPI_TYPE_REGION: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [%s]", + acpi_ut_get_region_name (obj_desc->region.space_id))); + if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Addr %8.8X%8.8X Len %.4X\n", + HIDWORD(obj_desc->region.address), + LODWORD(obj_desc->region.address), + obj_desc->region.length)); + } + else { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [Address/Length not evaluated]\n")); + } + break; + + case INTERNAL_TYPE_REFERENCE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " [%s]\n", + acpi_ps_get_opcode_name (obj_desc->reference.opcode))); + break; + + case ACPI_TYPE_BUFFER_FIELD: + + /* TBD: print Buffer name when we can easily get it */ + break; + + case INTERNAL_TYPE_REGION_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", + (char *) &obj_desc->common_field.region_obj->region.node->name)); + break; + + case INTERNAL_TYPE_BANK_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", + (char *) &obj_desc->common_field.region_obj->region.node->name)); + break; + + case INTERNAL_TYPE_INDEX_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Rgn [%4.4s]", + (char *) &obj_desc->index_field.index_obj->common_field.region_obj->region.node->name)); + break; + + default: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Object %p\n", obj_desc)); + break; + } + + /* Common field handling */ + + switch (type) { + case ACPI_TYPE_BUFFER_FIELD: + case INTERNAL_TYPE_REGION_FIELD: + case INTERNAL_TYPE_BANK_FIELD: + case INTERNAL_TYPE_INDEX_FIELD: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Off %.2X Len %.2X Acc %.2d\n", + (obj_desc->common_field.base_byte_offset * 8) + obj_desc->common_field.start_field_bit_offset, + obj_desc->common_field.bit_length, + obj_desc->common_field.access_bit_width)); + break; + } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " B:%p-%X\n", - ((acpi_operand_object *) this_node->object)->buffer.pointer, - ((acpi_operand_object *) this_node->object)->buffer.length)); break; - default: + case ACPI_DISPLAY_OBJECTS: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "%p O:%p", + this_node, obj_desc)); + + if (!obj_desc) { + /* No attached object, we are done */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + return (AE_OK); + } + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(R%d)", + obj_desc->common.reference_count)); + + switch (type) { + + case ACPI_TYPE_METHOD: + + /* Name is a Method and its AML offset/length are set */ + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " M:%p-%X\n", + obj_desc->method.aml_start, + obj_desc->method.aml_length)); + + break; + + + case ACPI_TYPE_INTEGER: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " N:%X%X\n", + HIDWORD(obj_desc->integer.value), + LODWORD(obj_desc->integer.value))); + break; + + + case ACPI_TYPE_STRING: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " S:%p-%X\n", + obj_desc->string.pointer, + obj_desc->string.length)); + break; + + + case ACPI_TYPE_BUFFER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " B:%p-%X\n", + obj_desc->buffer.pointer, + obj_desc->buffer.length)); + break; + + + default: + + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "\n")); + break; + } break; } @@ -266,30 +409,24 @@ /* If there is an attached object, display it */ - value = this_node->object; + obj_desc = this_node->object; /* Dump attached objects */ - while (value) { + while (obj_desc) { obj_type = INTERNAL_TYPE_INVALID; /* Decode the type of attached object and dump the contents */ - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Attached Object %p: ", value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " Attached Object %p: ", obj_desc)); - if (acpi_tb_system_table_pointer (value)) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to AML Code)\n")); - bytes_to_dump = 16; - } - - else if (VALID_DESCRIPTOR_TYPE (value, ACPI_DESC_TYPE_NAMED)) { + if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to Node)\n")); bytes_to_dump = sizeof (acpi_namespace_node); } - else if (VALID_DESCRIPTOR_TYPE (value, ACPI_DESC_TYPE_INTERNAL)) { - obj_desc = (acpi_operand_object *) value; + else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { obj_type = obj_desc->common.type; if (obj_type > INTERNAL_TYPE_MAX) { @@ -298,23 +435,22 @@ } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to ACPI Object type %X [%s])\n", + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(Ptr to ACPI Object type %2.2X [%s])\n", obj_type, acpi_ut_get_type_name (obj_type))); bytes_to_dump = sizeof (acpi_operand_object); } } else { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(String or Buffer - not descriptor)\n", value)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, "(String or Buffer - not descriptor)\n")); bytes_to_dump = 16; } - DUMP_BUFFER (value, bytes_to_dump); + DUMP_BUFFER (obj_desc, bytes_to_dump); /* If value is NOT an internal object, we are done */ - if ((acpi_tb_system_table_pointer (value)) || - (VALID_DESCRIPTOR_TYPE (value, ACPI_DESC_TYPE_NAMED))) { + if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { goto cleanup; } @@ -323,35 +459,35 @@ */ switch (obj_type) { case ACPI_TYPE_STRING: - value = (u8 *) obj_desc->string.pointer; + obj_desc = (acpi_operand_object *) obj_desc->string.pointer; break; case ACPI_TYPE_BUFFER: - value = (u8 *) obj_desc->buffer.pointer; + obj_desc = (acpi_operand_object *) obj_desc->buffer.pointer; break; case ACPI_TYPE_BUFFER_FIELD: - value = (u8 *) obj_desc->buffer_field.buffer_obj; + obj_desc = (acpi_operand_object *) obj_desc->buffer_field.buffer_obj; break; case ACPI_TYPE_PACKAGE: - value = (u8 *) obj_desc->package.elements; + obj_desc = (acpi_operand_object *) obj_desc->package.elements; break; case ACPI_TYPE_METHOD: - value = (u8 *) obj_desc->method.pcode; + obj_desc = (acpi_operand_object *) obj_desc->method.aml_start; break; case INTERNAL_TYPE_REGION_FIELD: - value = (u8 *) obj_desc->field.region_obj; + obj_desc = (acpi_operand_object *) obj_desc->field.region_obj; break; case INTERNAL_TYPE_BANK_FIELD: - value = (u8 *) obj_desc->bank_field.region_obj; + obj_desc = (acpi_operand_object *) obj_desc->bank_field.region_obj; break; case INTERNAL_TYPE_INDEX_FIELD: - value = (u8 *) obj_desc->index_field.index_obj; + obj_desc = (acpi_operand_object *) obj_desc->index_field.index_obj; break; default: @@ -386,11 +522,12 @@ void acpi_ns_dump_objects ( acpi_object_type8 type, + u8 display_type, u32 max_depth, u32 owner_id, acpi_handle start_handle) { - ACPI_WALK_INFO info; + acpi_walk_info info; FUNCTION_ENTRY (); @@ -398,6 +535,8 @@ info.debug_level = ACPI_LV_TABLES; info.owner_id = owner_id; + info.display_type = display_type; + acpi_ns_walk_namespace (type, start_handle, max_depth, NS_WALK_NO_UNLOCK, acpi_ns_dump_one_object, (void *) &info, NULL); @@ -441,8 +580,8 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ")); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %.8X, ADR: %.8X, Status: %x\n", - info.hardware_id, info.address, info.current_status)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %s, ADR: %8.8X%8.8X, Status: %x\n", + info.hardware_id, HIDWORD(info.address), LODWORD(info.address), info.current_status)); } return (status); @@ -524,7 +663,8 @@ } - acpi_ns_dump_objects (ACPI_TYPE_ANY, max_depth, ACPI_UINT32_MAX, search_handle); + acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth, + ACPI_UINT32_MAX, search_handle); return_VOID; } @@ -545,7 +685,7 @@ acpi_handle handle, u32 debug_level) { - ACPI_WALK_INFO info; + acpi_walk_info info; FUNCTION_ENTRY (); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nseval.c linux/drivers/acpi/namespace/nseval.c --- v2.4.13/linux/drivers/acpi/namespace/nseval.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nseval.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nseval - Object evaluation interfaces -- includes control * method lookup and execution. - * $Revision: 97 $ + * $Revision: 102 $ * ******************************************************************************/ @@ -93,7 +93,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - prefix_node = acpi_ns_convert_handle_to_entry (handle); + prefix_node = acpi_ns_map_handle_to_node (handle); if (!prefix_node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); status = AE_BAD_PARAMETER; @@ -271,7 +271,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return_ACPI_STATUS (AE_BAD_PARAMETER); @@ -378,17 +378,18 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No attached method object\n")); acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); - return_ACPI_STATUS (AE_ERROR); + return_ACPI_STATUS (AE_NULL_OBJECT); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Control method at Offset %x Length %lx]\n", - obj_desc->method.pcode + 1, obj_desc->method.pcode_length - 1)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Control method at Offset %p Length %x]\n", + obj_desc->method.aml_start + 1, obj_desc->method.aml_length - 1)); DUMP_PATHNAME (method_node, "Ns_execute_control_method: Executing", ACPI_LV_NAMES, _COMPONENT); - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %8XH\n", obj_desc->method.pcode + 1)); + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "At offset %p\n", + obj_desc->method.aml_start + 1)); /* @@ -437,7 +438,7 @@ { acpi_status status = AE_OK; acpi_operand_object *obj_desc; - acpi_operand_object *val_desc; + acpi_operand_object *source_desc; FUNCTION_TRACE ("Ns_get_object_value"); @@ -460,8 +461,8 @@ /* * Get the attached object */ - val_desc = acpi_ns_get_attached_object (node); - if (!val_desc) { + source_desc = acpi_ns_get_attached_object (node); + if (!source_desc) { status = AE_NULL_OBJECT; goto unlock_and_exit; } @@ -472,7 +473,7 @@ * TBD: [Future] - need a low-level object copy that handles * the reference count automatically. (Don't want to copy it) */ - MEMCPY (obj_desc, val_desc, sizeof (acpi_operand_object)); + MEMCPY (obj_desc, source_desc, sizeof (acpi_operand_object)); obj_desc->common.reference_count = 1; acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsinit.c linux/drivers/acpi/namespace/nsinit.c --- v2.4.13/linux/drivers/acpi/namespace/nsinit.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsinit.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsinit - namespace initialization - * $Revision: 31 $ + * $Revision: 33 $ * *****************************************************************************/ @@ -51,7 +51,7 @@ void) { acpi_status status; - ACPI_INIT_WALK_INFO info; + acpi_init_walk_info info; FUNCTION_TRACE ("Ns_initialize_objects"); @@ -112,7 +112,7 @@ void) { acpi_status status; - ACPI_DEVICE_WALK_INFO info; + acpi_device_walk_info info; FUNCTION_TRACE ("Ns_initialize_devices"); @@ -170,7 +170,7 @@ { acpi_object_type8 type; acpi_status status; - ACPI_INIT_WALK_INFO *info = (ACPI_INIT_WALK_INFO *) context; + acpi_init_walk_info *info = (acpi_init_walk_info *) context; acpi_namespace_node *node = (acpi_namespace_node *) obj_handle; acpi_operand_object *obj_desc; @@ -218,7 +218,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n")); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s while getting region arguments [%4.4s]\n", - acpi_format_exception (status), &node->name)); + acpi_format_exception (status), (char*)&node->name)); } if (!(acpi_dbg_level & ACPI_LV_INIT)) { @@ -241,7 +241,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR, "\n")); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s while getting buffer field arguments [%4.4s]\n", - acpi_format_exception (status), &node->name)); + acpi_format_exception (status), (char*)&node->name)); } if (!(acpi_dbg_level & ACPI_LV_INIT)) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, ".")); @@ -268,7 +268,7 @@ * * FUNCTION: Acpi_ns_init_one_device * - * PARAMETERS: ACPI_WALK_CALLBACK + * PARAMETERS: acpi_walk_callback * * RETURN: acpi_status * @@ -288,7 +288,7 @@ acpi_status status; acpi_namespace_node *node; u32 flags; - ACPI_DEVICE_WALK_INFO *info = (ACPI_DEVICE_WALK_INFO *) context; + acpi_device_walk_info *info = (acpi_device_walk_info *) context; FUNCTION_TRACE ("Ns_init_one_device"); @@ -302,7 +302,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (obj_handle); + node = acpi_ns_map_handle_to_node (obj_handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsload.c linux/drivers/acpi/namespace/nsload.c --- v2.4.13/linux/drivers/acpi/namespace/nsload.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsload.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nsload - namespace loading/expanding/contracting procedures - * $Revision: 43 $ + * $Revision: 47 $ * *****************************************************************************/ @@ -109,35 +109,14 @@ u32 pass_number, acpi_table_desc *table_desc) { - acpi_parse_downwards descending_callback; - acpi_parse_upwards ascending_callback; acpi_parse_object *parse_root; acpi_status status; + acpi_walk_state *walk_state; FUNCTION_TRACE ("Ns_one_complete_parse"); - switch (pass_number) { - case 1: - descending_callback = acpi_ds_load1_begin_op; - ascending_callback = acpi_ds_load1_end_op; - break; - - case 2: - descending_callback = acpi_ds_load2_begin_op; - ascending_callback = acpi_ds_load2_end_op; - break; - - case 3: - descending_callback = acpi_ds_exec_begin_op; - ascending_callback = acpi_ds_exec_end_op; - break; - - default: - return (AE_BAD_PARAMETER); - } - /* Create and init a Root Node */ parse_root = acpi_ps_alloc_op (AML_SCOPE_OP); @@ -148,15 +127,26 @@ ((acpi_parse2_object *) parse_root)->name = ACPI_ROOT_NAME; - /* Pass 1: Parse everything except control method bodies */ + /* Create and initialize a new walk state */ - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "*PARSE* pass %d parse\n", pass_number)); + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + acpi_ps_free_op (parse_root); + return_ACPI_STATUS (AE_NO_MEMORY); + } - status = acpi_ps_parse_aml (parse_root, table_desc->aml_pointer, - table_desc->aml_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - NULL, NULL, NULL, descending_callback, - ascending_callback); + status = acpi_ds_init_aml_walk (walk_state, parse_root, NULL, table_desc->aml_start, + table_desc->aml_length, NULL, NULL, pass_number); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (walk_state); + return_ACPI_STATUS (status); + } + + /* Parse the AML */ + + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "*PARSE* pass %d parse\n", pass_number)); + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (parse_root); return_ACPI_STATUS (status); @@ -225,8 +215,8 @@ * * FUNCTION: Acpi_ns_load_table * - * PARAMETERS: *Pcode_addr - Address of pcode block - * Pcode_length - Length of pcode block + * PARAMETERS: Table_desc - Descriptor for table to be loaded + * Node - Owning NS node * * RETURN: Status * @@ -245,12 +235,12 @@ FUNCTION_TRACE ("Ns_load_table"); - if (!table_desc->aml_pointer) { + if (!table_desc->aml_start) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null AML pointer\n")); return_ACPI_STATUS (AE_BAD_PARAMETER); } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AML block at %p\n", table_desc->aml_pointer)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AML block at %p\n", table_desc->aml_start)); if (!table_desc->aml_length) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsnames.c linux/drivers/acpi/namespace/nsnames.c --- v2.4.13/linux/drivers/acpi/namespace/nsnames.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsnames.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nsnames - Name manipulation and search - * $Revision: 63 $ + * $Revision: 64 $ * ******************************************************************************/ @@ -203,7 +203,7 @@ return_ACPI_STATUS (AE_NO_NAMESPACE); } - node = acpi_ns_convert_handle_to_entry (target_handle); + node = acpi_ns_map_handle_to_node (target_handle); if (!node) { return_ACPI_STATUS (AE_BAD_PARAMETER); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsobject.c linux/drivers/acpi/namespace/nsobject.c --- v2.4.13/linux/drivers/acpi/namespace/nsobject.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsobject.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsobject - Utilities for objects attached to namespace * table entries - * $Revision: 65 $ + * $Revision: 67 $ * ******************************************************************************/ @@ -63,7 +63,6 @@ acpi_operand_object *previous_obj_desc; acpi_object_type8 obj_type = ACPI_TYPE_ANY; u8 flags; - u16 opcode; FUNCTION_TRACE ("Ns_attach_object"); @@ -158,87 +157,6 @@ obj_type = type; } - /* - * Type is TYPE_Any, we must try to determinte the - * actual type of the object. - * Check if value points into the AML code - */ - else if (acpi_tb_system_table_pointer (object)) { - /* - * Object points into the AML stream. - * Set a flag bit in the Node to indicate this - */ - flags |= ANOBJ_AML_ATTACHMENT; - - /* - * The next byte (perhaps the next two bytes) - * will be the AML opcode - */ - MOVE_UNALIGNED16_TO_16 (&opcode, object); - - /* Check for a recognized Opcode */ - - switch ((u8) opcode) { - - case AML_OP_PREFIX: - - if (opcode != AML_REVISION_OP) { - /* - * Op_prefix is unrecognized unless part - * of Revision_op - */ - break; - } - - /* case AML_REVISION_OP: fall through and set the type to Integer */ - - case AML_ZERO_OP: - case AML_ONES_OP: - case AML_ONE_OP: - case AML_BYTE_OP: - case AML_WORD_OP: - case AML_DWORD_OP: - case AML_QWORD_OP: - - obj_type = ACPI_TYPE_INTEGER; - break; - - - case AML_STRING_OP: - - obj_type = ACPI_TYPE_STRING; - break; - - - case AML_BUFFER_OP: - - obj_type = ACPI_TYPE_BUFFER; - break; - - - case AML_MUTEX_OP: - - obj_type = ACPI_TYPE_MUTEX; - break; - - - case AML_PACKAGE_OP: - - obj_type = ACPI_TYPE_PACKAGE; - break; - - - default: - - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "AML Opcode/Type [%x] not supported in attach\n", - (u8) opcode)); - - return_ACPI_STATUS (AE_TYPE); - break; - } - } - else { /* * Cannot figure out the type -- set to Def_any which @@ -249,12 +167,7 @@ "Ns_attach_object confused: setting bogus type for ", ACPI_LV_INFO, _COMPONENT); - if (acpi_tb_system_table_pointer (object)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "AML-stream code %02x\n", *(u8 *) object)); - } - - else if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) { + if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) { DUMP_PATHNAME (object, "name ", ACPI_LV_INFO, _COMPONENT); } @@ -270,7 +183,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n", - obj_desc, node, &node->name)); + obj_desc, node, (char*)&node->name)); /* @@ -340,21 +253,12 @@ node->object = NULL; - /* Found a valid value */ - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Object=%p Value=%p Name %4.4s\n", - node, obj_desc, &node->name)); + node, obj_desc, (char*)&node->name)); - /* - * Not every value is an object allocated via ACPI_MEM_CALLOCATE, - * - must check - */ - if (!acpi_tb_system_table_pointer (obj_desc)) { - /* Attempt to delete the object (and all subobjects) */ - - acpi_ut_remove_reference (obj_desc); - } + /* Remove one reference on the object (and all subobjects) */ + acpi_ut_remove_reference (obj_desc); return_VOID; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nssearch.c linux/drivers/acpi/namespace/nssearch.c --- v2.4.13/linux/drivers/acpi/namespace/nssearch.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nssearch.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: nssearch - Namespace search - * $Revision: 74 $ + * $Revision: 75 $ * ******************************************************************************/ @@ -80,7 +80,7 @@ scope_name = acpi_ns_get_table_pathname (node); if (scope_name) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (type %X)\n", - scope_name, node, &target_name, type)); + scope_name, node, (char*)&target_name, type)); ACPI_MEM_FREE (scope_name); } @@ -124,7 +124,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s (actual type %X) found at %p\n", - &target_name, next_node->type, next_node)); + (char*)&target_name, next_node->type, next_node)); *return_node = next_node; return_ACPI_STATUS (AE_OK); @@ -150,7 +150,7 @@ /* Searched entire table, not found */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s (type %X) not found at %p\n", - &target_name, type, next_node)); + (char*)&target_name, type, next_node)); return_ACPI_STATUS (AE_NOT_FOUND); } @@ -205,12 +205,12 @@ (!parent_node)) { if (!parent_node) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n", - &target_name)); + (char*)&target_name)); } if (acpi_ns_local (type)) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] type %X is local(no search)\n", - &target_name, type)); + (char*)&target_name, type)); } return_ACPI_STATUS (AE_NOT_FOUND); @@ -219,7 +219,7 @@ /* Search the parent tree */ - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching parent for %4.4s\n", &target_name)); + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching parent for %4.4s\n", (char*)&target_name)); /* * Search parents until found the target or we have backed up to @@ -295,7 +295,7 @@ /* Parameter validation */ if (!node || !target_name || !return_node) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null param- Table %p Name %p Return %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Null param- Table %p Name %X Return %p\n", node, target_name, return_node)); REPORT_ERROR (("Ns_search_and_enter: bad (null) parameter\n")); @@ -306,7 +306,7 @@ /* Name must consist of printable characters */ if (!acpi_ut_valid_acpi_name (target_name)) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "*** Bad character in name: %08lx *** \n", + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "*** Bad character in name: %08x *** \n", target_name)); REPORT_ERROR (("Ns_search_and_enter: Bad character in ACPI Name\n")); @@ -364,7 +364,7 @@ */ if (interpreter_mode == IMODE_EXECUTE) { ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%4.4s Not found in %p [Not adding]\n", - &target_name, node)); + (char*)&target_name, node)); return_ACPI_STATUS (AE_NOT_FOUND); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsutils.c linux/drivers/acpi/namespace/nsutils.c --- v2.4.13/linux/drivers/acpi/namespace/nsutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsutils.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing * parents and siblings and Scope manipulation - * $Revision: 89 $ + * $Revision: 92 $ * *****************************************************************************/ @@ -148,7 +148,7 @@ acpi_status acpi_ns_get_internal_name_length ( - ACPI_NAMESTRING_INFO *info) + acpi_namestring_info *info) { NATIVE_CHAR *next_external_char; u32 i; @@ -225,7 +225,7 @@ acpi_status acpi_ns_build_internal_name ( - ACPI_NAMESTRING_INFO *info) + acpi_namestring_info *info) { u32 num_segments = info->num_segments; NATIVE_CHAR *internal_name = info->internal_name; @@ -356,7 +356,7 @@ NATIVE_CHAR **converted_name) { NATIVE_CHAR *internal_name; - ACPI_NAMESTRING_INFO info; + acpi_namestring_info info; acpi_status status; @@ -549,7 +549,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ns_convert_handle_to_entry + * FUNCTION: Acpi_ns_map_handle_to_node * * PARAMETERS: Handle - Handle to be converted to an Node * @@ -560,7 +560,7 @@ ******************************************************************************/ acpi_namespace_node * -acpi_ns_convert_handle_to_entry ( +acpi_ns_map_handle_to_node ( acpi_handle handle) { @@ -829,7 +829,7 @@ parent_node = acpi_ns_get_parent_object (child_node); if (parent_node) { ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Parent of %p [%4.4s] is %p [%4.4s]\n", - child_node, &child_node->name, parent_node, &parent_node->name)); + child_node, (char*)&child_node->name, parent_node, (char*)&parent_node->name)); if (parent_node->name) { return_VALUE (parent_node->name); @@ -837,7 +837,7 @@ } ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "unable to find parent of %p (%4.4s)\n", - child_node, &child_node->name)); + child_node, (char*)&child_node->name)); } return_VALUE (ACPI_UNKNOWN_NAME); @@ -925,21 +925,21 @@ /******************************************************************************* * - * FUNCTION: Acpi_ns_get_next_valid_object + * FUNCTION: Acpi_ns_get_next_valid_node * * PARAMETERS: Node - Current table entry * - * RETURN: Next valid object in the table. NULL if no more valid - * objects + * RETURN: Next valid Node in the linked node list. NULL if no more valid + * nodess * - * DESCRIPTION: Find the next valid object within a name table. + * DESCRIPTION: Find the next valid node within a name table. * Useful for implementing NULL-end-of-list loops. * ******************************************************************************/ acpi_namespace_node * -acpi_ns_get_next_valid_object ( +acpi_ns_get_next_valid_node ( acpi_namespace_node *node) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nswalk.c linux/drivers/acpi/namespace/nswalk.c --- v2.4.13/linux/drivers/acpi/namespace/nswalk.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nswalk.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: nswalk - Functions for walking the ACPI namespace - * $Revision: 24 $ + * $Revision: 26 $ * *****************************************************************************/ @@ -33,27 +33,27 @@ MODULE_NAME ("nswalk") -/**************************************************************************** +/******************************************************************************* * - * FUNCTION: Acpi_get_next_object + * FUNCTION: Acpi_ns_get_next_node * - * PARAMETERS: Type - Type of object to be searched for - * Parent - Parent object whose children we are - * getting - * Last_child - Previous child that was found. + * PARAMETERS: Type - Type of node to be searched for + * Parent_node - Parent node whose children we are + * getting + * Child_node - Previous child that was found. * The NEXT child will be returned * * RETURN: acpi_namespace_node - Pointer to the NEXT child or NULL if - * none is found. + * none is found. * - * DESCRIPTION: Return the next peer object within the namespace. If Handle - * is valid, Scope is ignored. Otherwise, the first object + * DESCRIPTION: Return the next peer node within the namespace. If Handle + * is valid, Scope is ignored. Otherwise, the first node * within Scope is returned. * - ****************************************************************************/ + ******************************************************************************/ acpi_namespace_node * -acpi_ns_get_next_object ( +acpi_ns_get_next_node ( acpi_object_type8 type, acpi_namespace_node *parent_node, acpi_namespace_node *child_node) @@ -73,12 +73,11 @@ } else { - /* Start search at the NEXT object */ + /* Start search at the NEXT node */ - next_node = acpi_ns_get_next_valid_object (child_node); + next_node = acpi_ns_get_next_valid_node (child_node); } - /* If any type is OK, we are done */ if (type == ACPI_TYPE_ANY) { @@ -87,8 +86,7 @@ return (next_node); } - - /* Must search for the object -- but within this scope only */ + /* Must search for the node -- but within this scope only */ while (next_node) { /* If type matches, we are done */ @@ -97,19 +95,18 @@ return (next_node); } - /* Otherwise, move on to the next object */ + /* Otherwise, move on to the next node */ - next_node = acpi_ns_get_next_valid_object (next_node); + next_node = acpi_ns_get_next_valid_node (next_node); } - /* Not found */ return (NULL); } -/****************************************************************************** +/******************************************************************************* * * FUNCTION: Acpi_ns_walk_namespace * @@ -120,13 +117,13 @@ * the callback routine * User_function - Called when an object of "Type" is found * Context - Passed to user function - * - * RETURNS Return value from the User_function if terminated early. - * Otherwise, returns NULL. + * Return_value - from the User_function if terminated early. + * Otherwise, returns NULL. + * RETURNS: Status * * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, - * starting (and ending) at the object specified by Start_handle. - * The User_function is called whenever an object that matches + * starting (and ending) at the node specified by Start_handle. + * The User_function is called whenever a node that matches * the type parameter is found. If the user function returns * a non-zero value, the search is terminated immediately and this * value is returned to the caller. @@ -145,7 +142,7 @@ acpi_handle start_node, u32 max_depth, u8 unlock_before_callback, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value) { @@ -165,32 +162,26 @@ start_node = acpi_gbl_root_node; } - - /* Null child means "get first object" */ + /* Null child means "get first node" */ parent_node = start_node; - child_node = 0; + child_node = 0; child_type = ACPI_TYPE_ANY; level = 1; /* - * Traverse the tree of objects until we bubble back up to where we + * Traverse the tree of nodes until we bubble back up to where we * started. When Level is zero, the loop is done because we have * bubbled up to (and passed) the original parent handle (Start_entry) */ while (level > 0) { - /* - * Get the next typed object in this scope. Null returned - * if not found - */ - status = AE_OK; - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, - parent_node, - child_node); + /* Get the next node in this scope. Null if not found */ + status = AE_OK; + child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, child_node); if (child_node) { /* - * Found an object, Get the type if we are not + * Found node, Get the type if we are not * searching for ANY */ if (type != ACPI_TYPE_ANY) { @@ -199,7 +190,7 @@ if (child_type == type) { /* - * Found a matching object, invoke the user + * Found a matching node, invoke the user * callback function */ if (unlock_before_callback) { @@ -245,11 +236,10 @@ * maximum depth has been reached. */ if ((level < max_depth) && (status != AE_CTRL_DEPTH)) { - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, - child_node, 0)) { + if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, 0)) { /* * There is at least one child of this - * object, visit the object + * node, visit the onde */ level++; parent_node = child_node; @@ -260,9 +250,9 @@ else { /* - * No more children in this object (Acpi_ns_get_next_object + * No more children of this node (Acpi_ns_get_next_node * failed), go back upwards in the namespace tree to - * the object's parent. + * the node's parent. */ level--; child_node = parent_node; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsxfname.c linux/drivers/acpi/namespace/nsxfname.c --- v2.4.13/linux/drivers/acpi/namespace/nsxfname.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsxfname.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsxfname - Public interfaces to the ACPI subsystem * ACPI Namespace oriented interfaces - * $Revision: 80 $ + * $Revision: 82 $ * *****************************************************************************/ @@ -70,13 +70,6 @@ FUNCTION_ENTRY (); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Parameter Validation */ if (!ret_handle || !pathname) { @@ -88,7 +81,7 @@ if (parent) { acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - prefix_node = acpi_ns_convert_handle_to_entry (parent); + prefix_node = acpi_ns_map_handle_to_node (parent); if (!prefix_node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); @@ -144,13 +137,6 @@ acpi_namespace_node *node; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Buffer pointer must be valid always */ if (!ret_path_ptr || (name_type > ACPI_NAME_TYPE_MAX)) { @@ -177,7 +163,7 @@ * Validate handle and convert to an Node */ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -226,21 +212,14 @@ acpi_handle handle, acpi_device_info *info) { - ACPI_DEVICE_ID hid; - ACPI_DEVICE_ID uid; + acpi_device_id hid; + acpi_device_id uid; acpi_status status; u32 device_status = 0; acpi_integer address = 0; acpi_namespace_node *node; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Parameter validation */ if (!handle || !info) { @@ -249,7 +228,7 @@ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/namespace/nsxfobj.c linux/drivers/acpi/namespace/nsxfobj.c --- v2.4.13/linux/drivers/acpi/namespace/nsxfobj.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/namespace/nsxfobj.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: nsxfobj - Public interfaces to the ACPI subsystem * ACPI Object oriented interfaces - * $Revision: 90 $ + * $Revision: 95 $ * ******************************************************************************/ @@ -41,12 +41,10 @@ * * PARAMETERS: Handle - Object handle (optional) * *Pathname - Object pathname (optional) - * **Params - List of parameters to pass to - * method, terminated by NULL. - * Params itself may be NULL - * if no parameters are being - * passed. - * *Return_object - Where to put method's return value (if + * **External_params - List of parameters to pass to method, + * terminated by NULL. May be NULL + * if no parameters are being passed. + * *Return_buffer - Where to put method's return value (if * any). If NULL, no value is returned. * * RETURN: Status @@ -61,12 +59,12 @@ acpi_evaluate_object ( acpi_handle handle, acpi_string pathname, - acpi_object_list *param_objects, + acpi_object_list *external_params, acpi_buffer *return_buffer) { acpi_status status; - acpi_operand_object **param_ptr = NULL; - acpi_operand_object *return_obj = NULL; + acpi_operand_object **internal_params = NULL; + acpi_operand_object *internal_return_obj = NULL; u32 buffer_space_needed; u32 user_buffer_length; u32 i; @@ -75,25 +73,18 @@ FUNCTION_TRACE ("Acpi_evaluate_object"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * If there are parameters to be passed to the object * (which must be a control method), the external objects * must be converted to internal objects */ - if (param_objects && param_objects->count) { + if (external_params && external_params->count) { /* * Allocate a new parameter block for the internal objects * Add 1 to count to allow for null terminated internal list */ - param_ptr = ACPI_MEM_CALLOCATE ((param_objects->count + 1) * sizeof (void *)); - if (!param_ptr) { + internal_params = ACPI_MEM_CALLOCATE ((external_params->count + 1) * sizeof (void *)); + if (!internal_params) { return_ACPI_STATUS (AE_NO_MEMORY); } @@ -102,16 +93,16 @@ * Convert each external object in the list to an * internal object */ - for (i = 0; i < param_objects->count; i++) { - status = acpi_ut_copy_eobject_to_iobject (¶m_objects->pointer[i], - ¶m_ptr[i]); + for (i = 0; i < external_params->count; i++) { + status = acpi_ut_copy_eobject_to_iobject (&external_params->pointer[i], + &internal_params[i]); if (ACPI_FAILURE (status)) { - acpi_ut_delete_internal_object_list (param_ptr); + acpi_ut_delete_internal_object_list (internal_params); return_ACPI_STATUS (status); } } - param_ptr[param_objects->count] = NULL; + internal_params[external_params->count] = NULL; } @@ -126,7 +117,7 @@ /* * The path is fully qualified, just evaluate by name */ - status = acpi_ns_evaluate_by_name (pathname, param_ptr, &return_obj); + status = acpi_ns_evaluate_by_name (pathname, internal_params, &internal_return_obj); } else if (!handle) { @@ -157,15 +148,15 @@ * The null pathname case means the handle is for * the actual object to be evaluated */ - status = acpi_ns_evaluate_by_handle (handle, param_ptr, &return_obj); + status = acpi_ns_evaluate_by_handle (handle, internal_params, &internal_return_obj); } else { /* * Both a Handle and a relative Pathname */ - status = acpi_ns_evaluate_relative (handle, pathname, param_ptr, - &return_obj); + status = acpi_ns_evaluate_relative (handle, pathname, internal_params, + &internal_return_obj); } } @@ -179,8 +170,8 @@ user_buffer_length = return_buffer->length; return_buffer->length = 0; - if (return_obj) { - if (VALID_DESCRIPTOR_TYPE (return_obj, ACPI_DESC_TYPE_NAMED)) { + if (internal_return_obj) { + if (VALID_DESCRIPTOR_TYPE (internal_return_obj, ACPI_DESC_TYPE_NAMED)) { /* * If we got an Node as a return object, * this means the object we are evaluating @@ -193,7 +184,7 @@ * types at a later date if necessary. */ status = AE_TYPE; - return_obj = NULL; /* No need to delete an Node */ + internal_return_obj = NULL; /* No need to delete an Node */ } if (ACPI_SUCCESS (status)) { @@ -201,7 +192,7 @@ * Find out how large a buffer is needed * to contain the returned object */ - status = acpi_ut_get_object_size (return_obj, + status = acpi_ut_get_object_size (internal_return_obj, &buffer_space_needed); if (ACPI_SUCCESS (status)) { /* @@ -226,7 +217,7 @@ /* * We have enough space for the object, build it */ - status = acpi_ut_copy_iobject_to_eobject (return_obj, + status = acpi_ut_copy_iobject_to_eobject (internal_return_obj, return_buffer); return_buffer->length = buffer_space_needed; } @@ -238,21 +229,21 @@ /* Delete the return and parameter objects */ - if (return_obj) { + if (internal_return_obj) { /* * Delete the internal return object. (Or at least * decrement the reference count by one) */ - acpi_ut_remove_reference (return_obj); + acpi_ut_remove_reference (internal_return_obj); } /* * Free the input parameter list (if we created one), */ - if (param_ptr) { + if (internal_params) { /* Free the allocated parameter block */ - acpi_ut_delete_internal_object_list (param_ptr); + acpi_ut_delete_internal_object_list (internal_params); } return_ACPI_STATUS (status); @@ -290,13 +281,6 @@ acpi_namespace_node *child_node = NULL; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - /* Parameter validation */ if (type > ACPI_TYPE_MAX) { @@ -310,7 +294,7 @@ if (!child) { /* Start search at the beginning of the specified scope */ - parent_node = acpi_ns_convert_handle_to_entry (parent); + parent_node = acpi_ns_map_handle_to_node (parent); if (!parent_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -322,7 +306,7 @@ else { /* Convert and validate the handle */ - child_node = acpi_ns_convert_handle_to_entry (child); + child_node = acpi_ns_map_handle_to_node (child); if (!child_node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -332,7 +316,7 @@ /* Internal function does the real work */ - node = acpi_ns_get_next_object ((acpi_object_type8) type, + node = acpi_ns_get_next_node ((acpi_object_type8) type, parent_node, child_node); if (!node) { status = AE_NOT_FOUND; @@ -370,15 +354,7 @@ acpi_object_type *ret_type) { acpi_namespace_node *node; - acpi_status status; - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } /* Parameter Validation */ @@ -399,7 +375,7 @@ /* Convert and validate the handle */ - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); return (AE_BAD_PARAMETER); @@ -436,13 +412,6 @@ acpi_status status = AE_OK; - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return (status); - } - if (!ret_handle) { return (AE_BAD_PARAMETER); } @@ -458,7 +427,7 @@ /* Convert and validate the handle */ - node = acpi_ns_convert_handle_to_entry (handle); + node = acpi_ns_map_handle_to_node (handle); if (!node) { status = AE_BAD_PARAMETER; goto unlock_and_exit; @@ -519,7 +488,7 @@ acpi_object_type type, acpi_handle start_object, u32 max_depth, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value) { @@ -529,13 +498,6 @@ FUNCTION_TRACE ("Acpi_walk_namespace"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if ((type > ACPI_TYPE_MAX) || @@ -551,11 +513,9 @@ * must be allowed to make Acpi calls itself. */ acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - status = acpi_ns_walk_namespace ((acpi_object_type8) type, - start_object, max_depth, - NS_WALK_UNLOCK, - user_function, context, - return_value); + status = acpi_ns_walk_namespace ((acpi_object_type8) type, start_object, + max_depth, NS_WALK_UNLOCK, user_function, context, + return_value); acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); @@ -587,14 +547,14 @@ acpi_status status; acpi_namespace_node *node; u32 flags; - ACPI_DEVICE_ID device_id; - ACPI_GET_DEVICES_INFO *info; + acpi_device_id device_id; + acpi_get_devices_info *info; info = context; acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (obj_handle); + node = acpi_ns_map_handle_to_node (obj_handle); acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); if (!node) { @@ -665,23 +625,16 @@ acpi_status acpi_get_devices ( NATIVE_CHAR *HID, - ACPI_WALK_CALLBACK user_function, + acpi_walk_callback user_function, void *context, void **return_value) { acpi_status status; - ACPI_GET_DEVICES_INFO info; + acpi_get_devices_info info; FUNCTION_TRACE ("Acpi_get_devices"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* Parameter validation */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/os.c linux/drivers/acpi/os.c --- v2.4.13/linux/drivers/acpi/os.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/os.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: os.c - Linux OSL functions - * $Revision: 46 $ + * $Revision: 49 $ * *****************************************************************************/ @@ -40,7 +40,6 @@ #include #include #include -#include "driver.h" #ifdef CONFIG_ACPI_EFI #include @@ -191,14 +190,7 @@ } if ((unsigned long) phys < virt_to_phys(high_memory)) { - struct page *page; *virt = phys_to_virt((unsigned long) phys); - - /* Check for stamping */ - page = virt_to_page(*virt); - if(page && !test_bit(PG_reserved, &page->flags)) - printk(KERN_WARNING "ACPI attempting to access kernel owned memory at %08lX.\n", (unsigned long)phys); - return AE_OK; } @@ -322,7 +314,7 @@ acpi_status acpi_os_write_port( ACPI_IO_ADDRESS port, - u32 value, + NATIVE_UINT value, u32 width) { switch (width) diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac.c linux/drivers/acpi/ospm/ac_adapter/ac.c --- v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ac_adapter/ac.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ac.c - * $Revision: 22 $ + * $Revision: 23 $ * *****************************************************************************/ @@ -76,7 +76,7 @@ * Print out basic adapter information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| AC Adapter[%02x]:[%p] %s\n", ac_adapter->device_handle, ac_adapter->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| AC Adapter[%02x]:[%p] %s\n", ac_adapter->device_handle, ac_adapter->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); acpi_os_free(buffer.pointer); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac_osl.c linux/drivers/acpi/ospm/ac_adapter/ac_osl.c --- v2.4.13/linux/drivers/acpi/ospm/ac_adapter/ac_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ac_adapter/ac_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ac_osl.c - * $Revision: 9 $ + * $Revision: 10 $ * *****************************************************************************/ @@ -35,7 +35,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - AC Adapter Driver"); -MODULE_LICENSE("GPL"); #define AC_PROC_ROOT "ac_adapter" @@ -122,7 +121,7 @@ return(AE_BAD_PARAMETER); } - printk(KERN_INFO "AC Adapter: found\n"); + printk(KERN_INFO "ACPI: AC Adapter found\n"); proc_entry = proc_mkdir(ac_adapter->uid, ac_proc_root); if (!proc_entry) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/battery/bt.c linux/drivers/acpi/ospm/battery/bt.c --- v2.4.13/linux/drivers/acpi/ospm/battery/bt.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/battery/bt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: bt.c - * $Revision: 27 $ + * $Revision: 29 $ * *****************************************************************************/ @@ -76,7 +76,7 @@ */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Battery[%02x]:[%p] %s\n", battery->device_handle, battery->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Battery[%02x]:[%p] %s\n", battery->device_handle, battery->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| uid[%s] is_present[%d] power_units[%s]\n", battery->uid, battery->is_present, battery->power_units)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); @@ -116,7 +116,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - MEMSET(&bif_buffer, 0, sizeof(acpi_buffer)); + memset(&bif_buffer, 0, sizeof(acpi_buffer)); /* * Evalute _BIF: @@ -147,7 +147,7 @@ package_format.length = sizeof("NNNNNNNNNSSSS"); package_format.pointer = "NNNNNNNNNSSSS"; - MEMSET(&package_data, 0, sizeof(acpi_buffer)); + memset(&package_data, 0, sizeof(acpi_buffer)); status = bm_extract_package_data(package, &package_format, &package_data); @@ -206,7 +206,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - MEMSET(&bst_buffer, 0, sizeof(acpi_buffer)); + memset(&bst_buffer, 0, sizeof(acpi_buffer)); /* * Evalute _BST: @@ -237,7 +237,7 @@ package_format.length = sizeof("NNNN"); package_format.pointer = "NNNN"; - MEMSET(&package_data, 0, sizeof(acpi_buffer)); + memset(&package_data, 0, sizeof(acpi_buffer)); status = bm_extract_package_data(package, &package_format, &package_data); @@ -495,8 +495,8 @@ FUNCTION_TRACE("bt_initialize"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Register driver for driver method battery devices. @@ -533,8 +533,8 @@ FUNCTION_TRACE("bt_terminate"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Unregister driver for driver method battery devices. diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/battery/bt_osl.c linux/drivers/acpi/ospm/battery/bt_osl.c --- v2.4.13/linux/drivers/acpi/ospm/battery/bt_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/battery/bt_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bt_osl.c - * $Revision: 22 $ + * $Revision: 24 $ * *****************************************************************************/ @@ -44,7 +44,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Control Method Battery Driver"); -MODULE_LICENSE("GPL"); #define BT_PROC_ROOT "battery" @@ -107,7 +106,7 @@ } else { p += sprintf(p, "Design Capacity: %d %sh\n", - battery_info->design_capacity, + (u32)battery_info->design_capacity, battery->power_units); } @@ -116,7 +115,7 @@ } else { p += sprintf(p, "Last Full Capacity: %d %sh\n", - battery_info->last_full_capacity, + (u32)battery_info->last_full_capacity, battery->power_units); } @@ -135,20 +134,20 @@ } else { p += sprintf(p, "Design Voltage: %d mV\n", - battery_info->design_voltage); + (u32)battery_info->design_voltage); } p += sprintf(p, "Design Capacity Warning: %d %sh\n", - battery_info->design_capacity_warning, + (u32)battery_info->design_capacity_warning, battery->power_units); p += sprintf(p, "Design Capacity Low: %d %sh\n", - battery_info->design_capacity_low, + (u32)battery_info->design_capacity_low, battery->power_units); p += sprintf(p, "Capacity Granularity 1: %d %sh\n", - battery_info->battery_capacity_granularity_1, + (u32)battery_info->battery_capacity_granularity_1, battery->power_units); p += sprintf(p, "Capacity Granularity 2: %d %sh\n", - battery_info->battery_capacity_granularity_2, + (u32)battery_info->battery_capacity_granularity_2, battery->power_units); p += sprintf(p, "Model Number: %s\n", battery_info->model_number); @@ -242,7 +241,7 @@ } else { p += sprintf(p, "Present Rate: %d %s\n", - battery_status->present_rate, + (u32)battery_status->present_rate, battery->power_units); } @@ -251,7 +250,7 @@ } else { p += sprintf(p, "Remaining Capacity: %d %sh\n", - battery_status->remaining_capacity, + (u32)battery_status->remaining_capacity, battery->power_units); } @@ -260,7 +259,7 @@ } else { p += sprintf(p, "Battery Voltage: %d mV\n", - battery_status->present_voltage); + (u32)battery_status->present_voltage); } end: @@ -294,10 +293,10 @@ } if (battery->is_present) { - printk("Battery: socket found, battery present\n"); + printk("ACPI: Battery socket found, battery present\n"); } else { - printk("Battery: socket found, battery absent\n"); + printk("ACPI: Battery socket found, battery absent\n"); } proc_entry = proc_mkdir(battery->uid, bt_proc_root); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/busmgr/bm.c linux/drivers/acpi/ospm/busmgr/bm.c --- v2.4.13/linux/drivers/acpi/ospm/busmgr/bm.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/busmgr/bm.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bm.c - * $Revision: 47 $ + * $Revision: 48 $ * *****************************************************************************/ @@ -223,7 +223,7 @@ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+-------------------------------------------------------------------------------\n")); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| %s[%02x]:[%p] flags[%02x] hid[%s] %s\n", type_string, device->handle, device->acpi_handle, device->flags, (device->id.hid[0] ? device->id.hid : " "), buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| %s[%02x]:[%p] flags[%02x] hid[%s] %s\n", type_string, device->handle, device->acpi_handle, device->flags, (device->id.hid[0] ? device->id.hid : " "), (char*)buffer.pointer)); if (flags & BM_PRINT_IDENTIFICATION) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| identification: uid[%s] adr[%08x]\n", device->id.uid, device->id.adr)); @@ -919,7 +919,7 @@ for (i=0; idevice_handle, pr->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Power_resource[%02x]:[%p] %s\n", pr->device_handle, pr->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| system_level[S%d] resource_order[%d]\n", pr->system_level, pr->resource_order)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| state[D%d] reference_count[%d]\n", pr->state, pr->reference_count)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/busmgr/bmutils.c linux/drivers/acpi/ospm/busmgr/bmutils.c --- v2.4.13/linux/drivers/acpi/ospm/busmgr/bmutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/busmgr/bmutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: bmutils.c - * $Revision: 38 $ + * $Revision: 43 $ * *****************************************************************************/ @@ -81,11 +81,11 @@ } if (pathname) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Evaluate object [%s.%s], %s\n", buffer.pointer, pathname, + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluate object [%s.%s], %s\n", (char*)buffer.pointer, pathname, acpi_format_exception(status))); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Evaluate object [%s], %s\n", buffer.pointer, + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Evaluate object [%s], %s\n", (char*)buffer.pointer, acpi_format_exception(status))); } @@ -175,68 +175,70 @@ * ****************************************************************************/ -/* - * TBD: Don't assume numbers (in ASL) are 32-bit values!!!! (IA64) - * TBD: Issue with 'assumed' types coming out of interpreter... - * (e.g. toshiba _BIF) - */ - acpi_status bm_extract_package_data ( acpi_object *package, - acpi_buffer *package_format, + acpi_buffer *format, acpi_buffer *buffer) { - acpi_status status = AE_OK; - u8 *head = NULL; - u8 *tail = NULL; - u8 **pointer = NULL; u32 tail_offset = 0; - acpi_object *element = NULL; u32 size_required = 0; - char* format = NULL; + char *format_string = NULL; u32 format_count = 0; u32 i = 0; + u8 *head = NULL; + u8 *tail = NULL; FUNCTION_TRACE("bm_extract_package_data"); - if (!package || (package->type != ACPI_TYPE_PACKAGE) || - (package->package.count == 0) || !package_format || - (package_format->length < 1) || - (!package_format->pointer) || !buffer) { + if (!package || (package->type != ACPI_TYPE_PACKAGE) || (package->package.count < 1)) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid 'package' argument\n")); return_ACPI_STATUS(AE_BAD_PARAMETER); } - format_count = package_format->length - 1; + if (!format || !format->pointer || (format->length < 1)) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid 'format' argument\n")); + return_ACPI_STATUS(AE_BAD_PARAMETER); + } + + if (!buffer) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid 'buffer' argument\n")); + return_ACPI_STATUS(AE_BAD_PARAMETER); + } + format_count = (format->length/sizeof(char)) - 1; if (format_count > package->package.count) { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Format specifies more objects [%d] than exist in package [%d].", format_count, package->package.count)); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Format specifies more objects [%d] than exist in package [%d].", format_count, package->package.count)); return_ACPI_STATUS(AE_BAD_DATA); } - format = (char*)package_format->pointer; + format_string = (char*)format->pointer; /* * Calculate size_required. */ for (i=0; ipackage.elements[i]); + + acpi_object *element = &(package->package.elements[i]); + + if (!element) { + return_ACPI_STATUS(AE_BAD_DATA); + } switch (element->type) { case ACPI_TYPE_INTEGER: - switch (format[i]) { + switch (format_string[i]) { case 'N': size_required += sizeof(acpi_integer); tail_offset += sizeof(acpi_integer); break; case 'S': - size_required += sizeof(u8*) + - sizeof(acpi_integer) + 1; - tail_offset += sizeof(acpi_integer); + size_required += sizeof(char*) + sizeof(acpi_integer) + sizeof(char); + tail_offset += sizeof(char*); break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Invalid package element [%d]: got number, expecing [%c].\n", i, format[i])); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid package element [%d]: got number, expecing [%c].\n", i, format_string[i])); return_ACPI_STATUS(AE_BAD_DATA); break; } @@ -244,19 +246,17 @@ case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - switch (format[i]) { + switch (format_string[i]) { case 'S': - size_required += sizeof(u8*) + - element->string.length + 1; - tail_offset += sizeof(u8*); + size_required += sizeof(char*) + (element->string.length * sizeof(char)) + sizeof(char); + tail_offset += sizeof(char*); break; case 'B': - size_required += sizeof(u8*) + - element->buffer.length; + size_required += sizeof(u8*) + (element->buffer.length * sizeof(u8)); tail_offset += sizeof(u8*); break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Invalid package element [%d] got string/buffer, expecing [%c].\n", i, format[i])); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid package element [%d] got string/buffer, expecing [%c].\n", i, format_string[i])); return_ACPI_STATUS(AE_BAD_DATA); break; } @@ -264,52 +264,52 @@ case ACPI_TYPE_PACKAGE: default: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unsupported element at index=%d\n", i)); /* TBD: handle nested packages... */ return_ACPI_STATUS(AE_SUPPORT); break; } } - if (size_required > buffer->length) { + /* + * Validate output buffer. + */ + if (buffer->length < size_required) { buffer->length = size_required; return_ACPI_STATUS(AE_BUFFER_OVERFLOW); } - - buffer->length = size_required; - - if (!buffer->pointer) { + else if (buffer->length != size_required || !buffer->pointer) { return_ACPI_STATUS(AE_BAD_PARAMETER); } head = buffer->pointer; tail = buffer->pointer + tail_offset; - /* - * Extract package data: + /* + * Extract package data. */ for (i=0; ipackage.elements[i]); + u8 **pointer = NULL; + acpi_object *element = &(package->package.elements[i]); switch (element->type) { case ACPI_TYPE_INTEGER: - switch (format[i]) { + switch (format_string[i]) { case 'N': - *((acpi_integer*)head) = - element->integer.value; + *((acpi_integer*)head) = element->integer.value; head += sizeof(acpi_integer); break; case 'S': pointer = (u8**)head; *pointer = tail; - *((acpi_integer*)tail) = - element->integer.value; + *((acpi_integer*)tail) = element->integer.value; head += sizeof(acpi_integer*); tail += sizeof(acpi_integer); /* NULL terminate string */ - *tail = 0; - tail++; + *tail = (char)0; + tail += sizeof(char); break; default: /* Should never get here */ @@ -319,25 +319,23 @@ case ACPI_TYPE_STRING: case ACPI_TYPE_BUFFER: - switch (format[i]) { + switch (format_string[i]) { case 'S': pointer = (u8**)head; *pointer = tail; - memcpy(tail, element->string.pointer, - element->string.length); - head += sizeof(u8*); - tail += element->string.length; + memcpy(tail, element->string.pointer, element->string.length); + head += sizeof(char*); + tail += element->string.length * sizeof(char); /* NULL terminate string */ - *tail = 0; - tail++; + *tail = (char)0; + tail += sizeof(char); break; case 'B': pointer = (u8**)head; *pointer = tail; - memcpy(tail, element->buffer.pointer, - element->buffer.length); + memcpy(tail, element->buffer.pointer, element->buffer.length); head += sizeof(u8*); - tail += element->buffer.length; + tail += element->buffer.length * sizeof(u8); break; default: /* Should never get here */ @@ -353,7 +351,7 @@ } } - return_ACPI_STATUS(status); + return_ACPI_STATUS(AE_OK); } @@ -465,7 +463,7 @@ */ status = bm_evaluate_object(handle, pathname, NULL, &buffer); if (ACPI_FAILURE(status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "failed to evaluate object (%s)\n", + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "failed to evaluate object (%s)\n", acpi_format_exception(status))); goto end; } @@ -569,7 +567,7 @@ if (!element || (element->type != ACPI_TYPE_STRING)) { status = AE_BAD_DATA; - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Invalid element in package (not a device reference).\n")); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Invalid element in package (not a device reference).\n")); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } @@ -582,7 +580,7 @@ element->string.pointer, &reference_handle); if (ACPI_FAILURE(status)) { status = AE_BAD_DATA; - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to resolve device reference [%s].\n", element->string.pointer)); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Unable to resolve device reference [%s].\n", element->string.pointer)); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } @@ -594,12 +592,12 @@ &(reference_list->handles[i])); if (ACPI_FAILURE(status)) { status = AE_BAD_DATA; - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to resolve device reference for [%p].\n", reference_handle)); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Unable to resolve device reference for [%p].\n", reference_handle)); DEBUG_EVAL_ERROR (ACPI_LV_WARN, handle, pathname, status); break; } - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Resolved reference [%s]->[%p]->[%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i])); + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resolved reference [%s]->[%p]->[%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i])); (reference_list->count)++; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/button/bn.c linux/drivers/acpi/ospm/button/bn.c --- v2.4.13/linux/drivers/acpi/ospm/button/bn.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/button/bn.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: bn.c - * $Revision: 25 $ + * $Revision: 27 $ * *****************************************************************************/ @@ -81,16 +81,16 @@ case BN_TYPE_POWER_BUTTON: case BN_TYPE_POWER_BUTTON_FIXED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Power_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Power_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, (char*)buffer.pointer)); break; case BN_TYPE_SLEEP_BUTTON: case BN_TYPE_SLEEP_BUTTON_FIXED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Sleep_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Sleep_button[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, (char*)buffer.pointer)); break; case BN_TYPE_LID_SWITCH: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Lid_switch[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Lid_switch[%02x]:[%p] %s\n", button->device_handle, button->acpi_handle, (char*)buffer.pointer)); break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/button/bn_osl.c linux/drivers/acpi/ospm/button/bn_osl.c --- v2.4.13/linux/drivers/acpi/ospm/button/bn_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/button/bn_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bn_osl.c - * $Revision: 14 $ + * $Revision: 16 $ * *****************************************************************************/ @@ -35,7 +35,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Button Driver"); -MODULE_LICENSE("GPL"); #define BN_PROC_ROOT "button" @@ -47,6 +46,15 @@ static struct proc_dir_entry *bn_proc_root = NULL; +#define BN_TYPE_UNKNOWN 0 +#define BN_TYPE_FIXED 1 +#define BN_TYPE_GENERIC 2 + +static int bn_power_button = BN_TYPE_UNKNOWN; +static int bn_sleep_button = BN_TYPE_UNKNOWN; +static int bn_lid_switch = BN_TYPE_UNKNOWN; + + /**************************************************************************** * * FUNCTION: bn_osl_add_device @@ -65,24 +73,77 @@ switch (button->type) { - case BN_TYPE_POWER_BUTTON: case BN_TYPE_POWER_BUTTON_FIXED: - printk(KERN_INFO "Power Button: found\n"); + bn_power_button = BN_TYPE_FIXED; + printk(KERN_INFO "ACPI: Power Button (FF) found\n"); if (!proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root)) { status = AE_ERROR; } break; - case BN_TYPE_SLEEP_BUTTON: + case BN_TYPE_POWER_BUTTON: + /* + * Avoid creating multiple /proc entries when (buggy) ACPI + * BIOS tables erroneously list both fixed- and generic- + * feature buttons. Note that fixed-feature buttons are + * always enumerated first (and there can only be one) so + * we only need to check here. + */ + switch (bn_power_button) { + case BN_TYPE_GENERIC: + printk(KERN_WARNING "ACPI: Multiple generic-space power buttons detected, using first\n"); + break; + case BN_TYPE_FIXED: + printk(KERN_WARNING "ACPI: Multiple power buttons detected, ignoring fixed-feature\n"); + default: + printk(KERN_INFO "ACPI: Power Button (CM) found\n"); + bn_power_button = BN_TYPE_GENERIC; + if (!proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root)) { + status = AE_ERROR; + } + break; + } + break; + case BN_TYPE_SLEEP_BUTTON_FIXED: - printk(KERN_INFO "Sleep Button: found\n"); + bn_sleep_button = BN_TYPE_FIXED; + printk(KERN_INFO "ACPI: Sleep Button (FF) found\n"); if (!proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root)) { status = AE_ERROR; } break; + case BN_TYPE_SLEEP_BUTTON: + /* + * Avoid creating multiple /proc entries when (buggy) ACPI + * BIOS tables erroneously list both fixed- and generic- + * feature buttons. Note that fixed-feature buttons are + * always enumerated first (and there can only be one) so + * we only need to check here. + */ + switch (bn_sleep_button) { + case BN_TYPE_GENERIC: + printk(KERN_WARNING "ACPI: Multiple generic-space sleep buttons detected, using first\n"); + break; + case BN_TYPE_FIXED: + printk(KERN_WARNING "ACPI: Multiple sleep buttons detected, ignoring fixed-feature\n"); + default: + bn_sleep_button = BN_TYPE_GENERIC; + printk(KERN_INFO "ACPI: Sleep Button (CM) found\n"); + if (!proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root)) { + status = AE_ERROR; + } + break; + } + break; + case BN_TYPE_LID_SWITCH: - printk(KERN_INFO "Lid Switch: found\n"); + if (bn_lid_switch) { + printk(KERN_WARNING "ACPI: Multiple generic-space lid switches detected, using first\n"); + break; + } + bn_lid_switch = BN_TYPE_GENERIC; + printk(KERN_INFO "ACPI: Lid Switch (CM) found\n"); if (!proc_mkdir(BN_PROC_LID_SWITCH, bn_proc_root)) { status = AE_ERROR; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ec/ec_osl.c linux/drivers/acpi/ospm/ec/ec_osl.c --- v2.4.13/linux/drivers/acpi/ospm/ec/ec_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ec/ec_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ec_osl.c - * $Revision: 10 $ + * $Revision: 11 $ * *****************************************************************************/ @@ -36,25 +36,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Embedded Controller Driver"); -MODULE_LICENSE("GPL"); - -#ifdef ACPI_DEBUG - -static int dbg_layer = ACPI_COMPONENT_DEFAULT; -MODULE_PARM(dbg_layer, "i"); -MODULE_PARM_DESC(dbg_layer, "Controls debug output (see acpi_dbg_layer).\n"); - -static int dbg_level = DEBUG_DEFAULT; -MODULE_PARM(dbg_level, "i"); -MODULE_PARM_DESC(dbg_level, "Controls debug output (see acpi_dbg_level).\n"); - -#endif /*ACPI_DEBUG*/ - - -#ifdef ACPI_DEBUG -static u32 save_dbg_layer; -static u32 save_dbg_level; -#endif /*ACPI_DEBUG*/ extern struct proc_dir_entry *bm_proc_root; @@ -80,14 +61,6 @@ if (!bm_proc_root) return -ENODEV; -#ifdef ACPI_DEBUG - save_dbg_layer = acpi_dbg_layer; - acpi_dbg_layer = dbg_layer; - - save_dbg_level = acpi_dbg_level; - acpi_dbg_level = dbg_level; -#endif /*ACPI_DEBUG*/ - status = ec_initialize(); return (ACPI_SUCCESS(status)) ? 0 : -ENODEV; @@ -109,11 +82,6 @@ ec_osl_cleanup(void) { ec_terminate(); - -#ifdef ACPI_DEBUG - acpi_dbg_layer = save_dbg_layer; - acpi_dbg_level = save_dbg_level; -#endif /*ACPI_DEBUG*/ return; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ec/ecmain.c linux/drivers/acpi/ospm/ec/ecmain.c --- v2.4.13/linux/drivers/acpi/ospm/ec/ecmain.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ec/ecmain.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ecmain.c - * $Revision: 28 $ + * $Revision: 29 $ * *****************************************************************************/ @@ -79,7 +79,7 @@ * Print out basic thermal zone information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Embedded_controller[%02x]:[%p] %s\n", ec->device_handle, ec->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Embedded_controller[%02x]:[%p] %s\n", ec->device_handle, ec->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| gpe_bit[%02x] status/command_port[%02x] data_port[%02x]\n", ec->gpe_bit, ec->status_port, ec->data_port)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/ec/ecspace.c linux/drivers/acpi/ospm/ec/ecspace.c --- v2.4.13/linux/drivers/acpi/ospm/ec/ecspace.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/ec/ecspace.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: ecspace.c - * $Revision: 22 $ + * $Revision: 23 $ * *****************************************************************************/ @@ -113,7 +113,7 @@ break; default: - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Received request with invalid function [%p].\n", function)); + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Received request with invalid function [%X].\n", function)); return_ACPI_STATUS(AE_BAD_PARAMETER); break; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/bn.h linux/drivers/acpi/ospm/include/bn.h --- v2.4.13/linux/drivers/acpi/ospm/include/bn.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/bn.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bn.h - * $Revision: 10 $ + * $Revision: 12 $ * *****************************************************************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/bt.h linux/drivers/acpi/ospm/include/bt.h --- v2.4.13/linux/drivers/acpi/ospm/include/bt.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/bt.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: bt.h - * $Revision: 16 $ + * $Revision: 18 $ * *****************************************************************************/ @@ -66,15 +66,15 @@ */ typedef struct { - u32 power_unit; - u32 design_capacity; - u32 last_full_capacity; - u32 battery_technology; - u32 design_voltage; - u32 design_capacity_warning; - u32 design_capacity_low; - u32 battery_capacity_granularity_1; - u32 battery_capacity_granularity_2; + acpi_integer power_unit; + acpi_integer design_capacity; + acpi_integer last_full_capacity; + acpi_integer battery_technology; + acpi_integer design_voltage; + acpi_integer design_capacity_warning; + acpi_integer design_capacity_low; + acpi_integer battery_capacity_granularity_1; + acpi_integer battery_capacity_granularity_2; acpi_string model_number; acpi_string serial_number; acpi_string battery_type; @@ -89,10 +89,10 @@ */ typedef struct { - u32 state; - u32 present_rate; - u32 remaining_capacity; - u32 present_voltage; + acpi_integer state; + acpi_integer present_rate; + acpi_integer remaining_capacity; + acpi_integer present_voltage; } BT_BATTERY_STATUS; @@ -137,7 +137,7 @@ acpi_status bt_get_status ( - BT_CONTEXT *battery, + BT_CONTEXT *battery, BT_BATTERY_STATUS **battery_status); acpi_status diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/pr.h linux/drivers/acpi/ospm/include/pr.h --- v2.4.13/linux/drivers/acpi/ospm/include/pr.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/pr.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: processor.h - * $Revision: 9 $ + * $Revision: 13 $ * *****************************************************************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/include/tz.h linux/drivers/acpi/ospm/include/tz.h --- v2.4.13/linux/drivers/acpi/ospm/include/tz.h Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/include/tz.h Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: tz.h - * $Revision: 21 $ + * $Revision: 24 $ * *****************************************************************************/ @@ -116,68 +116,42 @@ typedef u32 TZ_STATE; #define TZ_STATE_OK ((TZ_STATE) 0x00000000) +#define TZ_STATE_HOT ((TZ_STATE) 0x10000000) #define TZ_STATE_ACTIVE ((TZ_STATE) 0x20000000) #define TZ_STATE_PASSIVE ((TZ_STATE) 0x40000000) #define TZ_STATE_CRITICAL ((TZ_STATE) 0x80000000) - -/* - * TZ_THRESHOLD: - * ------------- - * Information on an individual threshold. - */ typedef struct { - TZ_THRESHOLD_TYPE type; - u32 index; u32 temperature; - TZ_COOLING_STATE cooling_state; - BM_HANDLE_LIST cooling_devices; -} TZ_THRESHOLD; - - -/* - * TZ_THRESHOLD_LIST: - * ------------------ - * Container for the thresholds of a given thermal zone. - * Note that thresholds are always ordered by increasing - * temperature value to simplify use by thermal policy. - */ -typedef struct { - u32 count; - TZ_THRESHOLD thresholds[TZ_MAX_THRESHOLDS]; -} TZ_THRESHOLD_LIST; - +} TZ_CRITICAL_THRESHOLD; -/* - * TZ_CRITICAL_POLICY: - * ------------------- - */ typedef struct { - TZ_THRESHOLD *threshold; -} TZ_CRITICAL_POLICY; - + u8 is_valid; + u32 temperature; +} TZ_HOT_THRESHOLD; -/* - * TZ_PASSIVE_POLICY: - * ------------------ - */ typedef struct { + u8 is_valid; + u32 temperature; u32 tc1; u32 tc2; u32 tsp; - TZ_THRESHOLD *threshold; -} TZ_PASSIVE_POLICY; - + BM_HANDLE_LIST devices; +} TZ_PASSIVE_THRESHOLD; -/* - * TZ_ACTIVE_POLICY: - * ----------------- - */ typedef struct { - u32 threshold_count; - TZ_THRESHOLD *threshold[TZ_MAX_ACTIVE_THRESHOLDS]; -} TZ_ACTIVE_POLICY; + u8 is_valid; + u32 temperature; + TZ_COOLING_STATE cooling_state; + BM_HANDLE_LIST devices; +} TZ_ACTIVE_THRESHOLD; +typedef struct { + TZ_CRITICAL_THRESHOLD critical; + TZ_HOT_THRESHOLD hot; + TZ_PASSIVE_THRESHOLD passive; + TZ_ACTIVE_THRESHOLD active[TZ_MAX_ACTIVE_THRESHOLDS]; +} TZ_THRESHOLDS; /* * TZ_POLICY: @@ -188,11 +162,7 @@ TZ_STATE state; TZ_COOLING_MODE cooling_mode; u32 polling_freq; - TZ_THRESHOLD_LIST threshold_list; - TZ_CRITICAL_POLICY critical; - TZ_PASSIVE_POLICY passive; - TZ_ACTIVE_POLICY active; - /* TBD: Linux-specific */ + TZ_THRESHOLDS thresholds; struct timer_list timer; } TZ_POLICY; @@ -213,7 +183,7 @@ * Function Prototypes *****************************************************************************/ -/* thermal_zone.c */ +/* tz.c */ acpi_status tz_initialize (void); @@ -234,46 +204,49 @@ acpi_status tz_get_temperature ( - TZ_CONTEXT *thermal_zone, - u32 *temperature); + TZ_CONTEXT *tz); acpi_status tz_get_thresholds ( - TZ_CONTEXT *thermal_zone, - TZ_THRESHOLD_LIST *threshold_list); + TZ_CONTEXT *tz); + +acpi_status +tz_set_cooling_preference ( + TZ_CONTEXT *tz, + TZ_COOLING_MODE cooling_mode); void tz_print ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); /* tzpolicy.c */ acpi_status tz_policy_add_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); acpi_status tz_policy_remove_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); void tz_policy_check ( void *context); -/* Thermal Zone Driver OSL */ +/* tz_osl.c */ acpi_status tz_osl_add_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); acpi_status tz_osl_remove_device ( - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); acpi_status tz_osl_generate_event ( u32 event, - TZ_CONTEXT *thermal_zone); + TZ_CONTEXT *tz); #endif /* __TZ_H__ */ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/pr.c linux/drivers/acpi/ospm/processor/pr.c --- v2.4.13/linux/drivers/acpi/ospm/processor/pr.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/pr.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: pr.c - * $Revision: 32 $ + * $Revision: 34 $ * *****************************************************************************/ @@ -63,7 +63,7 @@ #ifdef ACPI_DEBUG acpi_buffer buffer; - PROC_NAME("pr_print"); + FUNCTION_TRACE("pr_print"); buffer.length = 256; buffer.pointer = acpi_os_callocate(buffer.length); @@ -80,7 +80,7 @@ * Print out basic processor information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Processor[%02x]:[%p] uid[%02x] %s\n", processor->device_handle, processor->acpi_handle, processor->uid, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Processor[%02x]:[%p] uid[%02x] %s\n", processor->device_handle, processor->acpi_handle, processor->uid, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| power: %cC0 %cC1 %cC2[%d] %cC3[%d]\n", (processor->power.state[0].is_valid?'+':'-'), (processor->power.state[1].is_valid?'+':'-'), (processor->power.state[2].is_valid?'+':'-'), processor->power.state[2].latency, (processor->power.state[3].is_valid?'+':'-'), processor->power.state[3].latency)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| performance: states[%d]\n", processor->performance.state_count)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); @@ -140,7 +140,7 @@ * Processor Block: * ---------------- */ - MEMSET(&acpi_object, 0, sizeof(acpi_object)); + memset(&acpi_object, 0, sizeof(acpi_object)); buffer.length = sizeof(acpi_object); buffer.pointer = &acpi_object; @@ -261,8 +261,8 @@ FUNCTION_TRACE("pr_initialize"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Initialize power (Cx state) policy. @@ -307,8 +307,8 @@ FUNCTION_TRACE("pr_terminate"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Terminate power (Cx state) policy. diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/pr_osl.c linux/drivers/acpi/ospm/processor/pr_osl.c --- v2.4.13/linux/drivers/acpi/ospm/processor/pr_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/pr_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pr_osl.c - * $Revision: 18 $ + * $Revision: 21 $ * *****************************************************************************/ @@ -37,7 +37,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - IA32 Processor Driver"); -MODULE_LICENSE("GPL"); #define PR_PROC_ROOT "processor" @@ -157,14 +156,10 @@ printk(" C%d", i); } } - - if (processor->performance.state_count > 1) { - printk(", throttling states: %d", processor->performance.state_count); - } - - if (acpi_piix4_bmisx) - printk(", PIIX workaround active"); - + if (processor->performance.state_count > 1) + printk(", %d throttling states", processor->performance.state_count); + if (acpi_piix4_bmisx && processor->power.state[3].is_valid) + printk(" (PIIX errata enabled)"); printk("\n"); sprintf(processor_uid, "%d", processor->uid); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/prperf.c linux/drivers/acpi/ospm/processor/prperf.c --- v2.4.13/linux/drivers/acpi/ospm/processor/prperf.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/prperf.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: prperf.c - * $Revision: 19 $ + * $Revision: 21 $ * *****************************************************************************/ @@ -179,7 +179,8 @@ return_ACPI_STATUS(AE_BAD_DATA); } - if (processor->performance.state_count == 1) { + if ((state == processor->performance.active_state) || + (processor->performance.state_count == 1)) { return_ACPI_STATUS(AE_OK); } @@ -233,6 +234,8 @@ acpi_os_write_port(processor->pblk.address, pblk_value, 32); } + processor->performance.active_state = state; + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Processor [%02x] set to performance state [%d%%].\n", processor->device_handle, processor->performance.state[state].performance)); return_ACPI_STATUS(AE_OK); @@ -279,14 +282,14 @@ if (performance->active_state < (performance->state_count-1)) { status = pr_perf_set_state(processor, - (performance->active_state-1)); + (performance->active_state+1)); } break; case PR_PERF_INC: if (performance->active_state > 0) { status = pr_perf_set_state(processor, - (performance->active_state+1)); + (performance->active_state-1)); } break; @@ -302,7 +305,7 @@ } if (ACPI_SUCCESS(status)) { - performance->thermal_limit = limit; + performance->thermal_limit = performance->active_state; } ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Processor [%02x] thermal performance limit set to [%d%%].\n", processor->device_handle, processor->performance.state[performance->active_state].performance)); @@ -403,8 +406,20 @@ * Get Current State: * ------------------ */ - status = pr_perf_get_state(processor, - &(processor->performance.active_state)); + status = pr_perf_get_state(processor, &(processor->performance.active_state)); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); + } + + /* + * Set to Maximum Performance: + * --------------------------- + * We'll let subsequent policy (e.g. thermal/power) decide to lower + * performance if it so chooses, but for now crank up the speed. + */ + if (0 != processor->performance.active_state) { + status = pr_perf_set_state(processor, 0); + } return_ACPI_STATUS(status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/processor/prpower.c linux/drivers/acpi/ospm/processor/prpower.c --- v2.4.13/linux/drivers/acpi/ospm/processor/prpower.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/processor/prpower.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: prpower.c - * $Revision: 30 $ + * $Revision: 32 $ * *****************************************************************************/ @@ -41,7 +41,7 @@ * Globals ****************************************************************************/ -extern fadt_descriptor_rev2 acpi_fadt; +extern FADT_DESCRIPTOR acpi_fadt; static u32 last_idle_jiffies = 0; static PR_CONTEXT *processor_list[NR_CPUS]; static void (*pr_pm_idle_save)(void) = NULL; @@ -207,7 +207,10 @@ case PR_C1: /* Invoke C1 */ enable(); halt(); - /* no C1 time measurement, so just enter some number of times */ + /* + * TBD: Can't get time duration while in C1, as resumes + * go to an ISR rather than here. + */ time_elapsed = 0xFFFFFFFF; break; @@ -217,8 +220,7 @@ /* Invoke C2 */ acpi_os_read_port(processor->power.p_lvl2, NULL, 8); /* Dummy op - must do something useless after P_LVL2 read */ - acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, - BM_STS); + acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS); /* Compute time elapsed */ acpi_get_timer(&end_ticks); /* Re-enable interrupts */ @@ -228,15 +230,13 @@ case PR_C3: /* Disable bus master arbitration */ - acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, - ARB_DIS, 1); + acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, ARB_DIS, 1); /* See how long we're asleep for */ acpi_get_timer(&start_ticks); /* Invoke C3 */ acpi_os_read_port(processor->power.p_lvl3, NULL, 8); /* Dummy op - must do something useless after P_LVL3 read */ - acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, - BM_STS); + acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS); /* Compute time elapsed */ acpi_get_timer(&end_ticks); /* Enable bus master arbitration */ @@ -266,18 +266,14 @@ c_state->promotion.count++; c_state->demotion.count = 0; - if (c_state->promotion.count >= - c_state->promotion.count_threshold) { - + if (c_state->promotion.count >= c_state->promotion.count_threshold) { /* * Bus Mastering Activity, if active and used * by this state's promotion policy, prevents * promotions from occuring. */ - if (bm_control && !(processor->power.bm_activity & - c_state->promotion.bm_threshold)) { + if (!bm_control || !(processor->power.bm_activity & c_state->promotion.bm_threshold)) next_state = c_state->promotion.target_state; - } } } @@ -305,10 +301,8 @@ * state's promotion policy, causes an immediate demotion * to occur. */ - if (bm_control && (processor->power.bm_activity & - c_state->demotion.bm_threshold)) { + if (bm_control && (processor->power.bm_activity & c_state->demotion.bm_threshold)) next_state = c_state->demotion.target_state; - } } /* @@ -627,7 +621,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Max CPUs[%d], this CPU[%d].\n", NR_CPUS, smp_processor_id())); - /* only use C3 if we can control busmastering */ + /* Only use C3 if we can control bus mastering. */ if (acpi_fadt.V1_pm2_cnt_blk && acpi_fadt.pm2_cnt_len) bm_control = 1; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/system/sm.c linux/drivers/acpi/ospm/system/sm.c --- v2.4.13/linux/drivers/acpi/ospm/system/sm.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/system/sm.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: sm.c - * $Revision: 19 $ + * $Revision: 20 $ * *****************************************************************************/ @@ -71,7 +71,7 @@ * Print out basic system information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| System[%02x]:[%p] %s\n", system->device_handle, system->acpi_handle, buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| System[%02x]:[%p] %s\n", system->device_handle, system->acpi_handle, (char*)buffer.pointer)); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5\n", (system->states[0]?'+':'-'), (system->states[1]?'+':'-'), (system->states[2]?'+':'-'), (system->states[3]?'+':'-'), (system->states[4]?'+':'-'), (system->states[5]?'+':'-'))); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/system/sm_osl.c linux/drivers/acpi/ospm/system/sm_osl.c --- v2.4.13/linux/drivers/acpi/ospm/system/sm_osl.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/system/sm_osl.c Wed Oct 24 14:06:22 2001 @@ -42,7 +42,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - ACPI System Driver"); -MODULE_LICENSE("GPL"); #define SM_PROC_INFO "info" diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/thermal/tz.c linux/drivers/acpi/ospm/thermal/tz.c --- v2.4.13/linux/drivers/acpi/ospm/thermal/tz.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/thermal/tz.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /***************************************************************************** * * Module Name: tz.c - * $Revision: 40 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -23,22 +23,24 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * TBD: 1. Finish /proc interface (threshold values, _SCP changes, etc.) - * 2. Update policy for ACPI 2.0 compliance - * 3. Check for all required methods prior to enabling a threshold - * 4. Support for multiple processors in a zone (passive cooling devices) - */ #include #include #include "tz.h" + #define _COMPONENT ACPI_THERMAL MODULE_NAME ("tz") /**************************************************************************** + * Globals + ****************************************************************************/ + +extern int TZP; + + +/**************************************************************************** * Internal Functions ****************************************************************************/ @@ -46,73 +48,63 @@ * * FUNCTION: tz_print * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Prints out information on a specific thermal zone. - * ****************************************************************************/ void tz_print ( - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { #ifdef ACPI_DEBUG acpi_buffer buffer; u32 i,j = 0; - TZ_THRESHOLD *threshold = NULL; + TZ_THRESHOLDS *thresholds = NULL; - PROC_NAME("tz_print"); + FUNCTION_TRACE("tz_print"); - if (!thermal_zone) { + if (!tz) return; - } + + thresholds = &(tz->policy.thresholds); buffer.length = 256; buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) { + if (!buffer.pointer) return; - } /* * Get the full pathname for this ACPI object. */ - acpi_get_name(thermal_zone->acpi_handle, ACPI_FULL_PATHNAME, &buffer); + acpi_get_name(tz->acpi_handle, ACPI_FULL_PATHNAME, &buffer); /* * Print out basic thermal zone information. */ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "+------------------------------------------------------------\n")); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Thermal_zone[%02x]:[%p] %s\n", thermal_zone->device_handle, thermal_zone->acpi_handle, buffer.pointer)); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| temperature[%d] state[%08x]\n", thermal_zone->policy.temperature, thermal_zone->policy.state)); - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| cooling_mode[%08x] polling_freq[%d]\n", thermal_zone->policy.cooling_mode, thermal_zone->policy.polling_freq)); - - for (i=0; ipolicy.threshold_list.count; i++) { - - threshold = &(thermal_zone->policy.threshold_list.thresholds[i]); - - switch (threshold->type) { - case TZ_THRESHOLD_CRITICAL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| critical[%d]\n", threshold->temperature)); - break; - case TZ_THRESHOLD_PASSIVE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| passive[%d]: tc1[%d] tc2[%d] tsp[%d]\n", threshold->temperature, thermal_zone->policy.passive.tc1, thermal_zone->policy.passive.tc2, thermal_zone->policy.passive.tsp)); - break; - case TZ_THRESHOLD_ACTIVE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| active[%d]: index[%d]\n", threshold->temperature, threshold->index)); - break; - default: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| unknown[%d]\n", threshold->temperature)); - break; + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| Thermal_zone[%02x]:[%p] %s\n", tz->device_handle, tz->acpi_handle, (char*)buffer.pointer)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| temperature[%d] state[%08x]\n", tz->policy.temperature, tz->policy.state)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| cooling_mode[%08x] polling_freq[%d]\n", tz->policy.cooling_mode, tz->policy.polling_freq)); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| critical[%d]\n", thresholds->critical.temperature)); + if (thresholds->hot.is_valid) + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| hot[%d]\n", thresholds->hot.temperature)); + if (thresholds->passive.is_valid) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| passive[%d]: tc1[%d] tc2[%d] tsp[%d]\n", thresholds->passive.temperature, thresholds->passive.tc1, thresholds->passive.tc2, thresholds->passive.tsp)); + if (thresholds->passive.devices.count > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| devices")); + for (j=0; (jpassive.devices.count && j<10); j++) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "[%02x]", thresholds->passive.devices.handles[j])); + } + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); } - - if (threshold->cooling_devices.count > 0) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| cooling_devices")); - for (j=0; (jcooling_devices.count && j<10); j++) { - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "[%02x]", threshold->cooling_devices.handles[j])); + } + for (i=0; iactive[i].is_valid) + break; + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| active[%d]: index[%d]\n", thresholds->active[i].temperature, i)); + if (thresholds->active[i].devices.count > 0) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "| devices")); + for (j=0; (jactive[i].devices.count && j<10); j++) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "[%02x]", thresholds->active[i].devices.handles[j])); } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INFO, "\n")); } } @@ -130,32 +122,29 @@ * * FUNCTION: tz_get_temperaturee * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status tz_get_temperature ( - TZ_CONTEXT *thermal_zone, - u32 *temperature) + TZ_CONTEXT *tz) { acpi_status status = AE_OK; FUNCTION_TRACE("tz_get_temperature"); - if (!thermal_zone || !temperature) { + if (!tz) { return_ACPI_STATUS(AE_BAD_PARAMETER); } /* - * Evaluate the _TMP driver method to get the current temperature. + * Evaluate the _TMP method to get the current temperature. */ - status = bm_evaluate_simple_integer(thermal_zone->acpi_handle, - "_TMP", temperature); + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TMP", &(tz->policy.temperature)); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %d d_k\n", tz->policy.temperature)); return_ACPI_STATUS(status); } @@ -165,17 +154,11 @@ * * FUNCTION: tz_set_cooling_preference * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status tz_set_cooling_preference ( - TZ_CONTEXT *thermal_zone, + TZ_CONTEXT *tz, TZ_COOLING_MODE cooling_mode) { acpi_status status = AE_OK; @@ -184,8 +167,7 @@ FUNCTION_TRACE("tz_set_cooling_preference"); - if (!thermal_zone || ((cooling_mode != TZ_COOLING_MODE_ACTIVE) && - (cooling_mode != TZ_COOLING_MODE_PASSIVE))) { + if (!tz || ((cooling_mode != TZ_COOLING_MODE_ACTIVE) && (cooling_mode != TZ_COOLING_MODE_PASSIVE))) { return_ACPI_STATUS(AE_BAD_PARAMETER); } @@ -193,204 +175,143 @@ * Build the argument list, which simply consists of the current * cooling preference. */ - MEMSET(&arg_list, 0, sizeof(acpi_object)); + memset(&arg_list, 0, sizeof(acpi_object)); arg_list.count = 1; arg_list.pointer = &arg0; - MEMSET(&arg0, 0, sizeof(acpi_object)); + memset(&arg0, 0, sizeof(acpi_object)); arg0.type = ACPI_TYPE_INTEGER; arg0.integer.value = cooling_mode; /* * Evaluate "_SCP" - setting the new cooling preference. */ - status = acpi_evaluate_object(thermal_zone->acpi_handle, "_SCP", - &arg_list, NULL); + status = acpi_evaluate_object(tz->acpi_handle, "_SCP", &arg_list, NULL); + if (ACPI_FAILURE(status)) { + tz->policy.cooling_mode = -1; + return_ACPI_STATUS(status); + } + + tz->policy.cooling_mode = cooling_mode; return_ACPI_STATUS(status); } -/*************************************************************************** - * - * FUNCTION: tz_get_single_threshold - * - * PARAMETERS: - * - * RETURN: +/**************************************************************************** * - * DESCRIPTION: + * FUNCTION: tz_get_thresholds * ****************************************************************************/ acpi_status -tz_get_single_threshold ( - TZ_CONTEXT *thermal_zone, - TZ_THRESHOLD *threshold) +tz_get_thresholds ( + TZ_CONTEXT *tz) { - acpi_status status = AE_OK; + acpi_status status = AE_OK; + TZ_THRESHOLDS *thresholds = NULL; + u32 value = 0; + u32 i = 0; - FUNCTION_TRACE("tz_get_single_threshold"); + FUNCTION_TRACE("acpi_tz_get_thresholds"); - if (!thermal_zone || !threshold) { + if (!tz) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - switch (threshold->type) { + thresholds = &(tz->policy.thresholds); - /* - * Critical Threshold: - * ------------------- - */ - case TZ_THRESHOLD_CRITICAL: - threshold->index = 0; - threshold->cooling_devices.count = 0; - status = bm_evaluate_simple_integer( - thermal_zone->acpi_handle, "_CRT", - &(threshold->temperature)); - break; - - /* - * Passive Threshold: - * ------------------ - * Evaluate _PSV to get the threshold temperature and _PSL to get - * references to all passive cooling devices. - */ - case TZ_THRESHOLD_PASSIVE: - threshold->index = 0; - threshold->cooling_devices.count = 0; - status = bm_evaluate_simple_integer( - thermal_zone->acpi_handle, "_PSV", - &(threshold->temperature)); - if (ACPI_SUCCESS(status)) { - status = bm_evaluate_reference_list( - thermal_zone->acpi_handle, "_PSL", - &(threshold->cooling_devices)); - } + /* Critical Shutdown (required) */ - break; - - /* - * Active Thresholds: - * ------------------ - * Evaluate _ACx to get all threshold temperatures, and _ALx to get - * references to all passive cooling devices. - */ - case TZ_THRESHOLD_ACTIVE: - { - char object_name[5] = {'_','A', 'C', - ('0'+threshold->index),'\0'}; - status = bm_evaluate_simple_integer( - thermal_zone->acpi_handle, object_name, - &(threshold->temperature)); - if (ACPI_SUCCESS(status)) { - object_name[2] = 'L'; - status = bm_evaluate_reference_list( - thermal_zone->acpi_handle, - object_name, - &(threshold->cooling_devices)); - } - } - break; + status = bm_evaluate_simple_integer(tz->acpi_handle, "_CRT", &value); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No critical threshold\n")); + return_ACPI_STATUS(status); + } + else { + thresholds->critical.temperature = value; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found critical threshold [%d]\n", thresholds->critical.temperature)); - default: - status = AE_SUPPORT; - break; } - return_ACPI_STATUS(status); -} + /* Critical Sleep (optional) */ + status = bm_evaluate_simple_integer(tz->acpi_handle, "_HOT", &value); + if (ACPI_FAILURE(status)) { + thresholds->hot.is_valid = 0; + thresholds->hot.temperature = 0; + } + else { + thresholds->hot.is_valid = 1; + thresholds->hot.temperature = value; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found hot threshold [%d]\n", thresholds->hot.temperature)); + } -/**************************************************************************** - * - * FUNCTION: tz_get_thresholds - * - * PARAMETERS: thermal_zone - Identifies the thermal zone to parse. - * buffer - Output buffer. - * - * RETURN: acpi_status result code. - * - * DESCRIPTION: Builds a TZ_THRESHOLD_LIST structure containing information - * on all thresholds for a given thermal zone. - * - * NOTES: The current design limits the number of cooling devices - * per theshold to the value specified by BM_MAX_HANDLES. - * This simplifies parsing of thresholds by allowing a maximum - * threshold list size to be computed (and enforced) -- which - * allows all thresholds to be parsed in a single pass (since - * memory must be contiguous when returned in the acpi_buffer). - * - ****************************************************************************/ + /* Passive: Processors (optional) */ -acpi_status -tz_get_thresholds ( - TZ_CONTEXT *thermal_zone, - TZ_THRESHOLD_LIST *threshold_list) -{ - acpi_status status = AE_OK; - TZ_THRESHOLD *threshold = NULL; - u32 i = 0; + status = bm_evaluate_simple_integer(tz->acpi_handle, "_PSV", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + thresholds->passive.temperature = 0; + } + else { + thresholds->passive.is_valid = 1; + thresholds->passive.temperature = value; - FUNCTION_TRACE("tz_get_thresholds"); + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TC1", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } + thresholds->passive.tc1 = value; - if (!thermal_zone || !threshold_list) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TC2", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } + thresholds->passive.tc2 = value; - threshold_list->count = 0; + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TSP", &value); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } + thresholds->passive.tsp = value; - /* - * Critical threshold: - * ------------------- - * Every thermal zone must have one! - */ - threshold = &(threshold_list->thresholds[threshold_list->count]); - threshold->type = TZ_THRESHOLD_CRITICAL; + status = bm_evaluate_reference_list(tz->acpi_handle, "_PSL", &(thresholds->passive.devices)); + if (ACPI_FAILURE(status)) { + thresholds->passive.is_valid = 0; + } - status = tz_get_single_threshold(thermal_zone, threshold); - if (ACPI_SUCCESS(status)) { - (threshold_list->count)++; - } - else { - return_ACPI_STATUS(status); + if (thresholds->passive.is_valid) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found passive threshold [%d]\n", thresholds->passive.temperature)); + } + else { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid passive threshold\n")); + } } + /* Active: Fans, etc. (optional) */ - /* - * Passive threshold: - * ------------------ - */ - threshold = &(threshold_list->thresholds[threshold_list->count]); - threshold->type = TZ_THRESHOLD_PASSIVE; + for (i=0; icount)++; - } + char name[5] = {'_','A','C',('0'+i),'\0'}; - /* - * Active threshold: - * ----------------- - * Note that active thresholds are sorted by index (e.g. _AC0, - * _AC1, ...), and thus from highest (_AC0) to lowest (_AC9) - * temperature. - */ - for (i = 0; i < TZ_MAX_ACTIVE_THRESHOLDS; i++) { + status = bm_evaluate_simple_integer(tz->acpi_handle, name, &value); + if (ACPI_FAILURE(status)) { + thresholds->active[i].is_valid = 0; + thresholds->active[i].temperature = 0; + break; + } - threshold = &(threshold_list->thresholds[threshold_list->count]); - threshold->type = TZ_THRESHOLD_ACTIVE; - threshold->index = i; + thresholds->active[i].temperature = value; + name[2] = 'L'; - status = tz_get_single_threshold(thermal_zone, threshold); + status = bm_evaluate_reference_list(tz->acpi_handle, name, &(thresholds->active[i].devices)); if (ACPI_SUCCESS(status)) { - (threshold_list->count)++; + thresholds->active[i].is_valid = 1; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found active threshold [%d]:[%d]\n", i, thresholds->active[i].temperature)); } else { - threshold->type = TZ_THRESHOLD_UNKNOWN; - threshold->index = 0; - thermal_zone->policy.active.threshold_count = i; - break; + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid active threshold [%d]\n", i)); } } @@ -402,12 +323,6 @@ * * FUNCTION: tz_add_device * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -416,7 +331,7 @@ void **context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; BM_DEVICE *device = NULL; acpi_handle tmp_handle = NULL; static u32 zone_count = 0; @@ -441,50 +356,67 @@ /* * Allocate a new Thermal Zone device. */ - thermal_zone = acpi_os_callocate(sizeof(TZ_CONTEXT)); - if (!thermal_zone) { - return AE_NO_MEMORY; + tz = acpi_os_callocate(sizeof(TZ_CONTEXT)); + if (!tz) { + return_ACPI_STATUS(AE_NO_MEMORY); } - thermal_zone->device_handle = device->handle; - thermal_zone->acpi_handle = device->acpi_handle; + tz->device_handle = device->handle; + tz->acpi_handle = device->acpi_handle; /* TBD: How to manage 'uid' when zones are Pn_p? */ - sprintf(thermal_zone->uid, "%d", zone_count++); + sprintf(tz->uid, "%d", zone_count++); /* - * _TMP? - * ----- + * Temperature: + * ------------ + * Make sure we can read the zone's current temperature (_TMP). + * If we can't, there's no use in doing any policy (abort). */ - status = acpi_get_handle(thermal_zone->acpi_handle, "_TMP", - &tmp_handle); - if (ACPI_FAILURE(status)) { + status = tz_get_temperature(tz); + if (ACPI_FAILURE(status)) goto end; - } /* - * Initialize Policy: + * Polling Frequency: * ------------------ - * TBD: Move all thermal zone policy to user-mode daemon... + * If _TZP doesn't exist use the OS default polling frequency. */ - status = tz_policy_add_device(thermal_zone); + status = bm_evaluate_simple_integer(tz->acpi_handle, "_TZP", &(tz->policy.polling_freq)); if (ACPI_FAILURE(status)) { - goto end; + tz->policy.polling_freq = TZP; } + status = AE_OK; - status = tz_osl_add_device(thermal_zone); - if (ACPI_FAILURE(status)) { + /* + * Cooling Preference: + * ------------------- + * Default to ACTIVE (noisy) cooling until policy decides otherwise. + * Note that _SCP is optional. + */ + tz_set_cooling_preference(tz, TZ_COOLING_MODE_ACTIVE); + + /* + * Start Policy: + * ------------- + * Thermal policy is included in the kernel (this driver) because + * of the critical role it plays in avoiding nuclear meltdown. =O + */ + status = tz_policy_add_device(tz); + if (ACPI_FAILURE(status)) goto end; - } - *context = thermal_zone; + status = tz_osl_add_device(tz); + if (ACPI_FAILURE(status)) + goto end; - tz_print(thermal_zone); + *context = tz; + + tz_print(tz); end: - if (ACPI_FAILURE(status)) { - acpi_os_free(thermal_zone); - } + if (ACPI_FAILURE(status)) + acpi_os_free(tz); return_ACPI_STATUS(status); } @@ -494,12 +426,6 @@ * * FUNCTION: tz_remove_device * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -507,7 +433,7 @@ void **context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; FUNCTION_TRACE("tz_remove_device"); @@ -515,23 +441,23 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - thermal_zone = (TZ_CONTEXT*)(*context); + tz = (TZ_CONTEXT*)(*context); - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing thermal zone [%02x].\n", thermal_zone->device_handle)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing thermal zone [%02x].\n", tz->device_handle)); - status = tz_osl_remove_device(thermal_zone); + status = tz_osl_remove_device(tz); /* * Remove Policy: * -------------- * TBD: Move all thermal zone policy to user-mode daemon... */ - status = tz_policy_remove_device(thermal_zone); + status = tz_policy_remove_device(tz); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } - acpi_os_free(thermal_zone); + acpi_os_free(tz); return_ACPI_STATUS(status); } @@ -545,12 +471,6 @@ * * FUNCTION: tz_initialize * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -562,8 +482,8 @@ FUNCTION_TRACE("tz_initialize"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Register driver for thermal zone devices. @@ -583,12 +503,6 @@ * * FUNCTION: tz_terminate * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -600,8 +514,8 @@ FUNCTION_TRACE("tz_terminate"); - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); + memset(&criteria, 0, sizeof(BM_DEVICE_ID)); + memset(&driver, 0, sizeof(BM_DRIVER)); /* * Unregister driver for thermal zone devices. @@ -621,13 +535,8 @@ * * FUNCTION: tz_notify * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * ****************************************************************************/ + acpi_status tz_notify ( BM_NOTIFY notify_type, @@ -635,7 +544,7 @@ void **context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; FUNCTION_TRACE("tz_notify"); @@ -643,7 +552,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - thermal_zone = (TZ_CONTEXT*)*context; + tz = (TZ_CONTEXT*)*context; switch (notify_type) { @@ -657,40 +566,29 @@ case TZ_NOTIFY_TEMPERATURE_CHANGE: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Temperature (_TMP) change event detected.\n")); - /* -------------------------------------------- */ - /* TBD: Remove when policy moves to user-mode. */ tz_policy_check(*context); - /* -------------------------------------------- */ - status = tz_get_temperature(thermal_zone, - &(thermal_zone->policy.temperature)); + status = tz_get_temperature(tz); if (ACPI_SUCCESS(status)) { - status = tz_osl_generate_event(notify_type, - thermal_zone); + status = tz_osl_generate_event(notify_type, tz); } break; case TZ_NOTIFY_THRESHOLD_CHANGE: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Threshold (_SCP) change event detected.\n")); - /* -------------------------------------------- */ - /* TBD: Remove when policy moves to user-mode. */ - status = tz_policy_remove_device(thermal_zone); + status = tz_policy_remove_device(tz); if (ACPI_SUCCESS(status)) { - status = tz_policy_add_device(thermal_zone); + status = tz_policy_add_device(tz); } - /* -------------------------------------------- */ - status = tz_osl_generate_event(notify_type, thermal_zone); + status = tz_osl_generate_event(notify_type, tz); break; case TZ_NOTIFY_DEVICE_LISTS_CHANGE: ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Device lists (_ALx, _PSL, _TZD) change event detected.\n")); - /* -------------------------------------------- */ - /* TBD: Remove when policy moves to user-mode. */ - status = tz_policy_remove_device(thermal_zone); + status = tz_policy_remove_device(tz); if (ACPI_SUCCESS(status)) { - status = tz_policy_add_device(thermal_zone); + status = tz_policy_add_device(tz); } - /* -------------------------------------------- */ - status = tz_osl_generate_event(notify_type, thermal_zone); + status = tz_osl_generate_event(notify_type, tz); break; default: @@ -706,12 +604,6 @@ * * FUNCTION: tz_request * - * PARAMETERS: - * - * RETURN: Exception code. - * - * DESCRIPTION: - * ****************************************************************************/ acpi_status @@ -720,7 +612,7 @@ void *context) { acpi_status status = AE_OK; - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; FUNCTION_TRACE("tz_request"); @@ -731,7 +623,7 @@ return_ACPI_STATUS(AE_BAD_PARAMETER); } - thermal_zone = (TZ_CONTEXT*)context; + tz = (TZ_CONTEXT*)context; /* * Handle request: diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/thermal/tz_osl.c linux/drivers/acpi/ospm/thermal/tz_osl.c --- v2.4.13/linux/drivers/acpi/ospm/thermal/tz_osl.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/acpi/ospm/thermal/tz_osl.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tz_osl.c - * $Revision: 21 $ + * $Revision: 25 $ * *****************************************************************************/ @@ -35,7 +35,6 @@ MODULE_AUTHOR("Andrew Grover"); MODULE_DESCRIPTION("ACPI Component Architecture (CA) - Thermal Zone Driver"); -MODULE_LICENSE("GPL"); int TZP = 0; MODULE_PARM(TZP, "i"); @@ -65,17 +64,64 @@ int *eof, void *context) { - TZ_CONTEXT *thermal_zone = NULL; + acpi_status status = AE_OK; + char name[5]; + acpi_buffer buffer = {sizeof(name), &name}; + TZ_CONTEXT *tz = NULL; + TZ_THRESHOLDS *thresholds = NULL; char *p = page; int len = 0; + u32 i,j; + u32 t = 0; - if (!context || (off != 0)) { + if (!context || (off != 0)) goto end; + + tz = (TZ_CONTEXT*)context; + + thresholds = &(tz->policy.thresholds); + + p += sprintf(p, "critical (S5): trip=%d\n", thresholds->critical.temperature); + + if (thresholds->hot.is_valid) + p += sprintf(p, "critical (S4): trip=%d\n", thresholds->hot.temperature); + + if (thresholds->passive.is_valid) { + p += sprintf(p, "passive: trip=%d tc1=%d tc2=%d tsp=%d devices=", thresholds->passive.temperature, thresholds->passive.tc1, thresholds->passive.tc2, thresholds->passive.tsp); + for (j=0; jpassive.devices.count; j++) + p += sprintf(p, "%08x%c", thresholds->passive.devices.handles[j], (j==thresholds->passive.devices.count-1)?'\n':','); } - thermal_zone = (TZ_CONTEXT*)context; + for (i=0; iactive[i].is_valid)) + break; + p += sprintf(p, "active[%d]: trip=%d devices=", i, thresholds->active[i].temperature); + for (j=0; jactive[i].devices.count; j++) + p += sprintf(p, "%08x%c", thresholds->active[i].devices.handles[j], (j==thresholds->passive.devices.count-1)?'\n':','); + } - p += sprintf(p, "\n"); + p += sprintf(p, "cooling mode: "); + switch (tz->policy.cooling_mode) { + case TZ_COOLING_MODE_ACTIVE: + p += sprintf(p, "active (noisy)\n"); + break; + case TZ_COOLING_MODE_PASSIVE: + p += sprintf(p, "passive (quiet)\n"); + break; + default: + p += sprintf(p, "unknown\n"); + break; + } + + p += sprintf(p, "polling: "); + switch (tz->policy.polling_freq) { + case 0: + p += sprintf(p, "disabled\n"); + break; + default: + p += sprintf(p, "%d dS\n", tz->policy.polling_freq); + break; + } end: len = (p - page); @@ -85,7 +131,49 @@ if (len>count) len = count; if (len<0) len = 0; - return(len); + return len; +} + + +/**************************************************************************** + * + * FUNCTION: tz_osl_proc_write_info + * + ****************************************************************************/ + +static int tz_osl_proc_write_info ( + struct file *file, + const char *buffer, + unsigned long count, + void *data) +{ + TZ_CONTEXT *tz = NULL; + u32 state = 0; + u32 size = 0; + + if (!buffer || (count==0) || !data) { + goto end; + } + + tz = (TZ_CONTEXT*)data; + + size = strlen(buffer); + if (size < 4) + goto end; + + /* Cooling preference: "scp=0" (active) or "scp=1" (passive) */ + if (0 == strncmp(buffer, "scp=", 4)) { + tz_set_cooling_preference(tz, (buffer[4] - '0')); + } + + /* Polling frequency: "tzp=X" (poll every X [0-9] seconds) */ + else if (0 == strncmp(buffer, "tzp=", 4)) { + tz->policy.polling_freq = (buffer[4] - '0') * 10; + tz_policy_check(tz); + } + +end: + return count; } @@ -104,7 +192,7 @@ int *eof, void *context) { - TZ_CONTEXT *thermal_zone = NULL; + TZ_CONTEXT *tz = NULL; char *p = page; int len = 0; @@ -112,47 +200,27 @@ goto end; } - thermal_zone = (TZ_CONTEXT*)context; + tz = (TZ_CONTEXT*)context; - p += sprintf(p, "Temperature: %d (1/10th degrees Kelvin)\n", - thermal_zone->policy.temperature); + /* Temperature */ - p += sprintf(p, "State: "); - if (thermal_zone->policy.state & TZ_STATE_ACTIVE) { - p += sprintf(p, "active[%d] ", thermal_zone->policy.state & 0x07); - } - if (thermal_zone->policy.state & TZ_STATE_PASSIVE) { - p += sprintf(p, "passive "); - } - if (thermal_zone->policy.state & TZ_STATE_CRITICAL) { - p += sprintf(p, "critical "); - } - if (thermal_zone->policy.state == 0) { - p += sprintf(p, "ok "); - } - p += sprintf(p, "\n"); + tz_get_temperature(tz); - p += sprintf(p, "Cooling Mode: "); - switch (thermal_zone->policy.cooling_mode) { - case TZ_COOLING_MODE_ACTIVE: - p += sprintf(p, "active (noisy)\n"); - break; - case TZ_COOLING_MODE_PASSIVE: - p += sprintf(p, "passive (quiet)\n"); - break; - default: - p += sprintf(p, "unknown\n"); - break; - } + p += sprintf(p, "temperature: %d dK\n", tz->policy.temperature); - p += sprintf(p, "Polling Frequency: "); - switch (thermal_zone->policy.polling_freq) { - case 0: - p += sprintf(p, "n/a\n"); - break; - default: - p += sprintf(p, "%d (1/10th seconds)\n", thermal_zone->policy.polling_freq); - break; + p += sprintf(p, "state: "); + if (tz->policy.state == 0) + p += sprintf(p, "ok\n"); + else if (tz->policy.state & TZ_STATE_CRITICAL) + p += sprintf(p, "critical\n"); + else if (tz->policy.state & TZ_STATE_HOT) + p += sprintf(p, "hot\n"); + else { + if (tz->policy.state & TZ_STATE_ACTIVE) + p += sprintf(p, "active[%d] ", tz->policy.state & 0x07); + if (tz->policy.state & TZ_STATE_PASSIVE) + p += sprintf(p, "passive "); + p += sprintf(p, "\n"); } end: @@ -175,30 +243,33 @@ acpi_status tz_osl_add_device( - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { - struct proc_dir_entry *proc_entry = NULL, *proc; + struct proc_dir_entry *proc_entry = NULL; + struct proc_dir_entry *proc_child_entry = NULL; - if (!thermal_zone) { + if (!tz) { return(AE_BAD_PARAMETER); } - printk("Thermal Zone: found\n"); + printk("ACPI: Thermal Zone found\n"); - proc_entry = proc_mkdir(thermal_zone->uid, tz_proc_root); - if (!proc_entry) + proc_entry = proc_mkdir(tz->uid, tz_proc_root); + if (!proc_entry) return(AE_ERROR); - proc = create_proc_read_entry(TZ_PROC_STATUS, S_IFREG | S_IRUGO, - proc_entry, tz_osl_proc_read_status, (void*)thermal_zone); - if (!proc) + proc_child_entry = create_proc_read_entry(TZ_PROC_STATUS, S_IFREG | S_IRUGO, proc_entry, tz_osl_proc_read_status, (void*)tz); + if (!proc_child_entry) return(AE_ERROR); - proc = create_proc_read_entry(TZ_PROC_INFO, S_IFREG | S_IRUGO, - proc_entry, tz_osl_proc_read_info, (void*)thermal_zone); - if (!proc) + proc_child_entry = create_proc_entry(TZ_PROC_INFO, S_IFREG | 0644, proc_entry); + if (!proc_child_entry) return(AE_ERROR); + proc_child_entry->read_proc = tz_osl_proc_read_info; + proc_child_entry->write_proc = tz_osl_proc_write_info; + proc_child_entry->data = (void*)tz; + return(AE_OK); } @@ -211,21 +282,21 @@ acpi_status tz_osl_remove_device ( - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { char proc_entry[64]; - if (!thermal_zone) { + if (!tz) { return(AE_BAD_PARAMETER); } - sprintf(proc_entry, "%s/%s", thermal_zone->uid, TZ_PROC_INFO); + sprintf(proc_entry, "%s/%s", tz->uid, TZ_PROC_INFO); remove_proc_entry(proc_entry, tz_proc_root); - sprintf(proc_entry, "%s/%s", thermal_zone->uid, TZ_PROC_STATUS); + sprintf(proc_entry, "%s/%s", tz->uid, TZ_PROC_STATUS); remove_proc_entry(proc_entry, tz_proc_root); - sprintf(proc_entry, "%s", thermal_zone->uid); + sprintf(proc_entry, "%s", tz->uid); remove_proc_entry(proc_entry, tz_proc_root); return(AE_OK); @@ -241,26 +312,26 @@ acpi_status tz_osl_generate_event ( u32 event, - TZ_CONTEXT *thermal_zone) + TZ_CONTEXT *tz) { acpi_status status = AE_OK; - if (!thermal_zone) { + if (!tz) { return(AE_BAD_PARAMETER); } switch (event) { case TZ_NOTIFY_TEMPERATURE_CHANGE: - status = bm_osl_generate_event(thermal_zone->device_handle, - TZ_PROC_ROOT, thermal_zone->uid, event, - thermal_zone->policy.temperature); + status = bm_osl_generate_event(tz->device_handle, + TZ_PROC_ROOT, tz->uid, event, + tz->policy.temperature); break; case TZ_NOTIFY_THRESHOLD_CHANGE: case TZ_NOTIFY_DEVICE_LISTS_CHANGE: - status = bm_osl_generate_event(thermal_zone->device_handle, - TZ_PROC_ROOT, thermal_zone->uid, event, 0); + status = bm_osl_generate_event(tz->device_handle, + TZ_PROC_ROOT, tz->uid, event, 0); break; default: @@ -276,12 +347,6 @@ * * FUNCTION: tz_osl_init * - * PARAMETERS: - * - * RETURN: 0: Success - * - * DESCRIPTION: Module initialization. - * ****************************************************************************/ static int __init @@ -312,12 +377,6 @@ /**************************************************************************** * * FUNCTION: tz_osl_cleanup - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Module cleanup. * ****************************************************************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/ospm/thermal/tzpolicy.c linux/drivers/acpi/ospm/thermal/tzpolicy.c --- v2.4.13/linux/drivers/acpi/ospm/thermal/tzpolicy.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/ospm/thermal/tzpolicy.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /**************************************************************************** * * Module Name: tzpolicy.c - - * $Revision: 28 $ + * $Revision: 30 $ * ****************************************************************************/ @@ -24,13 +24,10 @@ */ /* - * TBD: 1. Move to user-space! - * 2. Support ACPI 2.0 items (e.g. _TZD, _HOT). - * 3. Support performance-limit control for non-processor devices + * TBD: 1. Support performance-limit control for non-processor devices * (those listed in _TZD, e.g. graphics). */ -/* TBD: Linux specific */ #include #include #include @@ -48,8 +45,6 @@ * Globals ****************************************************************************/ -extern int TZP; - void tz_policy_run ( unsigned long data); @@ -75,12 +70,10 @@ status = bm_request(&request); - if (ACPI_FAILURE(status)) { + if (ACPI_FAILURE(status)) return status; - } - else { + else return request.status; - } } @@ -102,14 +95,44 @@ { FUNCTION_TRACE("tz_policy_critical"); - if (!tz || !tz->policy.critical.threshold) { + if (!tz) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - if (tz->policy.temperature >= - tz->policy.critical.threshold->temperature) { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Critical threshold reached - shutting down system.\n")); - /* TBD: Need method for calling 'halt' - OSL function? */ + if (tz->policy.temperature >= tz->policy.thresholds.critical.temperature) { + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Critical (S5) threshold reached.\n")); + /* TBD: Need method for shutting down system. */ + } + + return_ACPI_STATUS(AE_OK); +} + + +/**************************************************************************** + * + * FUNCTION: tz_policy_hot + * + * PARAMETERS: + * + * RETURN: + * + * DESCRIPTION: + * + ****************************************************************************/ + +acpi_status +tz_policy_hot( + TZ_CONTEXT *tz) +{ + FUNCTION_TRACE("tz_policy_hot"); + + if (!tz || !tz->policy.thresholds.hot.is_valid) { + return_ACPI_STATUS(AE_BAD_PARAMETER); + } + + if (tz->policy.temperature >= tz->policy.thresholds.hot.temperature) { + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Critical (S4) threshold reached.\n")); + /* TBD: Need method for invoking OS-level critical suspend. */ } return_ACPI_STATUS(AE_OK); @@ -132,20 +155,20 @@ tz_policy_passive( TZ_CONTEXT *tz) { - TZ_PASSIVE_POLICY *passive = NULL; + TZ_PASSIVE_THRESHOLD *passive = NULL; static u32 last_temperature = 0; s32 trend = 0; u32 i = 0; FUNCTION_TRACE("tz_policy_passive"); - if (!tz || !tz->policy.passive.threshold) { + if (!tz || !tz->policy.thresholds.passive.is_valid) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - passive = &(tz->policy.passive); + passive = &(tz->policy.thresholds.passive); - if (tz->policy.temperature >= passive->threshold->temperature) { + if (tz->policy.temperature >= passive->temperature) { /* * Thermal trend? * -------------- @@ -153,15 +176,8 @@ * Specification), calculate the current thermal trend * (a.k.a. performance delta). */ - trend = passive->tc1 * - (tz->policy.temperature - last_temperature) + - passive->tc2 * - (tz->policy.temperature - passive->threshold->temperature); - - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "trend[%d] = TC1[%d]*(temp[%d]-last[%d]) + TC2[%d]*(temp[%d]-passive[%d])\n", - trend, passive->tc1, tz->policy.temperature, - last_temperature, passive->tc2, tz->policy.temperature, - passive->threshold->temperature)); + trend = passive->tc1 * (tz->policy.temperature - last_temperature) + passive->tc2 * (tz->policy.temperature - passive->temperature); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "trend[%d] = TC1[%d]*(temp[%d]-last[%d]) + TC2[%d]*(temp[%d]-passive[%d])\n", trend, passive->tc1, tz->policy.temperature, last_temperature, passive->tc2, tz->policy.temperature, passive->temperature)); last_temperature = tz->policy.temperature; @@ -172,11 +188,8 @@ * cooling devices (processors). */ if (trend > 0) { - for (i=0; ithreshold->cooling_devices.count; i++) { - set_performance_limit( - passive->threshold->cooling_devices.handles[i], - PR_PERF_DEC); - } + for (i=0; idevices.count; i++) + set_performance_limit(passive->devices.handles[i], PR_PERF_DEC); } /* * Cooling Off? @@ -185,11 +198,8 @@ * cooling devices (processors). */ else if (trend < 0) { - for (i=0; ithreshold->cooling_devices.count; i++) { - set_performance_limit( - passive->threshold->cooling_devices.handles[i], - PR_PERF_INC); - } + for (i=0; idevices.count; i++) + set_performance_limit(passive->devices.handles[i], PR_PERF_INC); } } @@ -214,21 +224,20 @@ TZ_CONTEXT *tz) { acpi_status status = AE_OK; - TZ_THRESHOLD *active = NULL; + TZ_ACTIVE_THRESHOLD *active = NULL; u32 i,j = 0; FUNCTION_TRACE("tz_policy_active"); - if (!tz || !tz->policy.active.threshold) { + if (!tz || !tz->policy.thresholds.active[0].is_valid) { return_ACPI_STATUS(AE_BAD_PARAMETER); } - for (i = 0; i < TZ_MAX_ACTIVE_THRESHOLDS; i++) { + for (i=0; ipolicy.active.threshold[i]; - if (!active) { + active = &(tz->policy.thresholds.active[i]); + if (!active || !active->is_valid) break; - } /* * Above Threshold? @@ -236,24 +245,17 @@ * If not already enabled, turn ON all cooling devices * associated with this active threshold. */ - if ((tz->policy.temperature >= active->temperature) && - (active->cooling_state != TZ_COOLING_ENABLED)) { - - for (j = 0; j < active->cooling_devices.count; j++) { - - status = bm_set_device_power_state( - active->cooling_devices.handles[j], - ACPI_STATE_D0); - + if ((tz->policy.temperature >= active->temperature) && (active->cooling_state != TZ_COOLING_ENABLED)) { + for (j = 0; j < active->devices.count; j++) { + status = bm_set_device_power_state(active->devices.handles[j], ACPI_STATE_D0); if (ACPI_SUCCESS(status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now ON.\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now ON.\n", active->devices.handles[j])); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to turn ON cooling device [%02x].\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "Unable to turn ON cooling device [%02x].\n", active->devices.handles[j])); } } - - active->cooling_state = TZ_COOLING_ENABLED; + active->cooling_state = TZ_COOLING_ENABLED; } /* * Below Threshold? @@ -265,21 +267,15 @@ * during the first pass. */ else if (active->cooling_state != TZ_COOLING_DISABLED) { - - for (j = 0; j < active->cooling_devices.count; j++) { - - status = bm_set_device_power_state( - active->cooling_devices.handles[j], - ACPI_STATE_D3); - + for (j = 0; j < active->devices.count; j++) { + status = bm_set_device_power_state(active->devices.handles[j], ACPI_STATE_D3); if (ACPI_SUCCESS(status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now OFF.\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Cooling device [%02x] now OFF.\n", active->devices.handles[j])); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unable to turn OFF cooling device [%02x].\n", active->cooling_devices.handles[j])); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Unable to turn OFF cooling device [%02x].\n", active->devices.handles[j])); } } - active->cooling_state = TZ_COOLING_DISABLED; } } @@ -308,6 +304,8 @@ { acpi_status status = AE_OK; TZ_CONTEXT *tz = NULL; + TZ_POLICY *policy = NULL; + TZ_THRESHOLDS *thresholds = NULL; u32 previous_temperature = 0; u32 previous_state = 0; u32 active_index = 0; @@ -322,6 +320,8 @@ } tz = (TZ_CONTEXT*)context; + policy = &(tz->policy); + thresholds = &(tz->policy.thresholds); /* * Preserve Previous State: @@ -334,7 +334,7 @@ * Get Temperature: * ---------------- */ - status = tz_get_temperature(tz, &(tz->policy.temperature)); + status = tz_get_temperature(tz); if (ACPI_FAILURE(status)) { return_VOID; } @@ -343,32 +343,30 @@ * Calculate State: * ---------------- */ - tz->policy.state = TZ_STATE_OK; + policy->state = TZ_STATE_OK; /* Critical? */ - if ((tz->policy.critical.threshold) && - (tz->policy.temperature >= tz->policy.critical.threshold->temperature)) { - tz->policy.state |= TZ_STATE_CRITICAL; - } + if (policy->temperature >= thresholds->critical.temperature) + policy->state |= TZ_STATE_CRITICAL; + + /* Hot? */ + if ((thresholds->hot.is_valid) && (policy->temperature >= thresholds->hot.temperature)) + policy->state |= TZ_STATE_CRITICAL; /* Passive? */ - if ((tz->policy.passive.threshold) && - (tz->policy.temperature >= tz->policy.passive.threshold->temperature)) { - tz->policy.state |= TZ_STATE_PASSIVE; - } + if ((thresholds->passive.is_valid) && (policy->temperature >= thresholds->passive.temperature)) + policy->state |= TZ_STATE_PASSIVE; /* Active? */ - if (tz->policy.active.threshold[0]) { - for (i=0; ipolicy.active.threshold_count; i++) { - if ((tz->policy.active.threshold[i]) && - (tz->policy.temperature >= tz->policy.active.threshold[i]->temperature)) { - tz->policy.state |= TZ_STATE_ACTIVE; - if (tz->policy.active.threshold[i]->index > active_index) { - active_index = tz->policy.active.threshold[i]->index; - } + if (thresholds->active[0].is_valid) { + for (i=0; iactive[i].is_valid) && (policy->temperature >= thresholds->active[i].temperature)) { + policy->state |= TZ_STATE_ACTIVE; + if (i > active_index) + active_index = i; } } - tz->policy.state |= active_index; + policy->state |= active_index; } /* @@ -379,17 +377,14 @@ * out of' a policy state (e.g. to allow fans to be turned off); * thus we must preserve the previous state. */ - if (tz->policy.state & TZ_STATE_CRITICAL) { + if (policy->state & TZ_STATE_CRITICAL) tz_policy_critical(tz); - } - if ((tz->policy.state & TZ_STATE_PASSIVE) || - (previous_state & TZ_STATE_PASSIVE)) { + if (policy->state & TZ_STATE_HOT) + tz_policy_hot(tz); + if ((policy->state & TZ_STATE_PASSIVE) || (previous_state & TZ_STATE_PASSIVE)) tz_policy_passive(tz); - } - if ((tz->policy.state & TZ_STATE_ACTIVE) || - (previous_state & TZ_STATE_ACTIVE)) { + if ((policy->state & TZ_STATE_ACTIVE) || (previous_state & TZ_STATE_ACTIVE)) tz_policy_active(tz); - } /* * Calculate Sleep Time: @@ -400,42 +395,33 @@ * a thermal event occurs -- e.g. never poll). Note that _TSP * and _TZD values are given in 1/10th seconds. */ - if (tz->policy.state & TZ_STATE_PASSIVE) { - sleep_time = tz->policy.passive.tsp * 100; - } - else if (tz->policy.polling_freq > 0) { - sleep_time = tz->policy.polling_freq * 100; - } - else { + if (policy->state & TZ_STATE_PASSIVE) + sleep_time = thresholds->passive.tsp * 100; + else if (policy->polling_freq > 0) + sleep_time = policy->polling_freq * 100; + else sleep_time = WAIT_FOREVER; - } -#ifdef ACPI_DEBUG - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Thermal_zone[%02x]: temperature[%d] state[%08x]\n", tz->device_handle, tz->policy.temperature, tz->policy.state)); + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Thermal_zone[%02x]: temperature[%d] state[%08x]\n", tz->device_handle, policy->temperature, policy->state)); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Scheduling next poll in [%d]ms.\n", sleep_time)); -#endif /*ACPI_DEBUG*/ /* * Schedule Next Poll: * ------------------- */ if (sleep_time < WAIT_FOREVER) { - if (timer_pending(&(tz->policy.timer))) { - mod_timer(&(tz->policy.timer), - (HZ*sleep_time)/1000); - } + if (timer_pending(&(policy->timer))) + mod_timer(&(policy->timer), (HZ*sleep_time)/1000); else { - tz->policy.timer.data = (u32)tz; - tz->policy.timer.function = tz_policy_run; - tz->policy.timer.expires = - jiffies + (HZ*sleep_time)/1000; - add_timer(&(tz->policy.timer)); + policy->timer.data = (u32)tz; + policy->timer.function = tz_policy_run; + policy->timer.expires = jiffies + (HZ*sleep_time)/1000; + add_timer(&(policy->timer)); } } else { - if (timer_pending(&(tz->policy.timer))) { - del_timer(&(tz->policy.timer)); - } + if (timer_pending(&(policy->timer))) + del_timer(&(policy->timer)); } return_VOID; @@ -454,6 +440,7 @@ * ****************************************************************************/ + void tz_policy_run ( unsigned long data) @@ -472,8 +459,7 @@ * ----------------------------- * Note that all Linux kernel timers run at interrupt-level (ack!). */ - status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, - tz_policy_check, (void*)data); + status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, tz_policy_check, (void*)data); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Error invoking thermal policy.\n")); } @@ -499,7 +485,7 @@ TZ_CONTEXT *tz) { acpi_status status = AE_OK; - TZ_THRESHOLD *threshold = NULL; + TZ_THRESHOLDS *thresholds = NULL; u32 i,j = 0; FUNCTION_TRACE("tz_policy_add_device"); @@ -511,36 +497,10 @@ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Adding policy for thermal zone [%02x].\n", tz->device_handle)); /* - * Temperature: - * ------------ - * Make sure we can read the zone's current temperature (_TMP). - * If we can't, there's no use in doing any policy (abort). - */ - status = tz_get_temperature(tz, &(tz->policy.temperature)); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Polling Frequency: - * ------------------ - * If a _TZP object doesn't exist, use the OS default polling - * frequency. - */ - status = bm_evaluate_simple_integer(tz->acpi_handle, "_TZP", - &(tz->policy.polling_freq)); - if (ACPI_FAILURE(status)) { - tz->policy.polling_freq = TZP; - } - status = AE_OK; - - /* * Get Thresholds: * --------------- - * Get all of the zone's thresholds, parse, and organize for - * later use. */ - status = tz_get_thresholds(tz, &(tz->policy.threshold_list)); + status = tz_get_thresholds(tz); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } @@ -549,70 +509,17 @@ * Initialize Policies: * -------------------- */ - for (i = 0; i < tz->policy.threshold_list.count; i++) { - - threshold = &(tz->policy.threshold_list.thresholds[i]); - - switch (threshold->type) { - - case TZ_THRESHOLD_CRITICAL: - tz->policy.critical.threshold = threshold; - break; - - case TZ_THRESHOLD_PASSIVE: - - /* - * Set thermal performance limit on all processors - * to max. - */ - for (j=0; jcooling_devices.count; j++) { - set_performance_limit( - threshold->cooling_devices.handles[j], - PR_PERF_MAX); - } - - /* - * Get passive cooling constants. - */ - status = bm_evaluate_simple_integer(tz->acpi_handle, - "_TC1", &(tz->policy.passive.tc1)); - if (ACPI_FAILURE(status)) { - break; - } - - status = bm_evaluate_simple_integer(tz->acpi_handle, - "_TC2", &(tz->policy.passive.tc2)); - if (ACPI_FAILURE(status)) { - break; - } - - status = bm_evaluate_simple_integer(tz->acpi_handle, - "_TSP", &(tz->policy.passive.tsp)); - if (ACPI_FAILURE(status)) { - break; - } - - tz->policy.passive.threshold = threshold; - - tz_policy_passive(tz); - - break; - - case TZ_THRESHOLD_ACTIVE: - tz->policy.active.threshold[threshold->index] = threshold; - tz_policy_active(tz); - break; - } - } - - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); + if (tz->policy.thresholds.passive.is_valid) { + for (i=0; ipolicy.thresholds.passive.devices.count; i++) + set_performance_limit(tz->policy.thresholds.passive.devices.handles[i], PR_PERF_MAX); + tz_policy_passive(tz); } + if (tz->policy.thresholds.active[0].is_valid) + tz_policy_active(tz); /* * Initialize Policy Timer: * ------------------------ - * TBD: Linux-specific - remove when policy moves to user-space. */ init_timer(&(tz->policy.timer)); @@ -623,7 +530,7 @@ */ tz_policy_check(tz); - return_ACPI_STATUS(status); + return_ACPI_STATUS(AE_OK); } @@ -656,19 +563,15 @@ /* * Delete the thermal zone policy timer entry, if exists. */ - if (timer_pending(&(tz->policy.timer))) { + if (timer_pending(&(tz->policy.timer))) del_timer(&(tz->policy.timer)); - } /* * Reset thermal performance limit on all processors back to max. */ - if (tz->policy.passive.threshold) { - for (i=0; ipolicy.passive.threshold->cooling_devices.count; i++) { - set_performance_limit( - tz->policy.passive.threshold->cooling_devices.handles[i], - PR_PERF_MAX); - } + if (tz->policy.thresholds.passive.is_valid) { + for (i=0; ipolicy.thresholds.passive.devices.count; i++) + set_performance_limit(tz->policy.thresholds.passive.devices.handles[i], PR_PERF_MAX); } return_ACPI_STATUS(AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psargs.c linux/drivers/acpi/parser/psargs.c --- v2.4.13/linux/drivers/acpi/parser/psargs.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psargs.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psargs - Parse AML opcode arguments - * $Revision: 51 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -391,11 +391,11 @@ name_op->node = method_node; acpi_ps_append_arg (arg, name_op); - if (!(acpi_operand_object *) method_node->object) { + if (!method_node->object) { return_VOID; } - *arg_count = ((acpi_operand_object *) method_node->object)->method.param_count; + *arg_count = (method_node->object)->method.param_count; } return_VOID; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psopcode.c linux/drivers/acpi/parser/psopcode.c --- v2.4.13/linux/drivers/acpi/parser/psopcode.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psopcode.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * - * Module Name: psopcode - Parser opcode information table - * $Revision: 41 $ + * Module Name: psopcode - Parser/Interpreter opcode information table + * $Revision: 49 $ * *****************************************************************************/ @@ -67,28 +67,11 @@ * into a 32-bit number and stored in the master opcode table at the end of this file. */ -#define ARGP_ZERO_OP ARG_NONE -#define ARGP_ONE_OP ARG_NONE + +#define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA) +#define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_ALIAS_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_NAME) -#define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ) -#define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA) -#define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) -#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA) -#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST) -#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) -#define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) -#define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST) -#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) -#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) -#define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST) -#define ARGP_LOCAL0 ARG_NONE -#define ARGP_LOCAL1 ARG_NONE -#define ARGP_LOCAL2 ARG_NONE -#define ARGP_LOCAL3 ARG_NONE -#define ARGP_LOCAL4 ARG_NONE -#define ARGP_LOCAL5 ARG_NONE -#define ARGP_LOCAL6 ARG_NONE -#define ARGP_LOCAL7 ARG_NONE #define ARGP_ARG0 ARG_NONE #define ARGP_ARG1 ARG_NONE #define ARGP_ARG2 ARG_NONE @@ -96,98 +79,116 @@ #define ARGP_ARG4 ARG_NONE #define ARGP_ARG5 ARG_NONE #define ARGP_ARG6 ARG_NONE -#define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME) -#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET) -#define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST) #define ARGP_BIT_AND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_BIT_NAND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_BIT_NOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_BIT_NOT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_BREAK_OP ARG_NONE +#define ARGP_BREAK_POINT_OP ARG_NONE +#define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST) +#define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA) +#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) -#define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_CREATE_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) +#define ARGP_CONTINUE_OP ARG_NONE +#define ARGP_COPY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SIMPLENAME) #define ARGP_CREATE_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) #define ARGP_CREATE_QWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_CREATE_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) +#define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_DEBUG_OP ARG_NONE +#define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) +#define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET) +#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA) +#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST) +#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME) +#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG) +#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST) +#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) +#define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST) +#define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_LAND_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG) #define ARGP_LEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) #define ARGP_LGREATER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) #define ARGP_LLESS_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_COPY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SIMPLENAME) +#define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME) +#define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_LOCAL0 ARG_NONE +#define ARGP_LOCAL1 ARG_NONE +#define ARGP_LOCAL2 ARG_NONE +#define ARGP_LOCAL3 ARG_NONE +#define ARGP_LOCAL4 ARG_NONE +#define ARGP_LOCAL5 ARG_NONE +#define ARGP_LOCAL6 ARG_NONE +#define ARGP_LOCAL7 ARG_NONE +#define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST) +#define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_MID_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_CONTINUE_OP ARG_NONE -#define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) -#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST) -#define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) +#define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA) +#define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ) +#define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_NOOP_OP ARG_NONE -#define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_BREAK_OP ARG_NONE -#define ARGP_BREAK_POINT_OP ARG_NONE +#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) +#define ARGP_ONE_OP ARG_NONE #define ARGP_ONES_OP ARG_NONE -#define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA) -#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME) -#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) -#define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME) -#define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA) -#define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) -#define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_REVISION_OP ARG_NONE -#define ARGP_DEBUG_OP ARG_NONE -#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG) -#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) -#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) +#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) #define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST) -#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) -#define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAMESTRING, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) +#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) +#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) +#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_REVISION_OP ARG_NONE +#define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) +#define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG) +#define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG) #define ARGP_STATICSTRING_OP ARGP_LIST1 (ARGP_NAMESTRING) +#define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME) +#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST) +#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) +#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) +#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) +#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) +#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) +#define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) +#define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) +#define ARGP_ZERO_OP ARG_NONE /* @@ -197,28 +198,11 @@ * (Used by Prep_operands procedure and the ASL Compiler) */ -#define ARGI_ZERO_OP ARG_NONE -#define ARGI_ONE_OP ARG_NONE + +#define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE +#define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER) +#define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_ALIAS_OP ARGI_INVALID_OPCODE -#define ARGI_NAME_OP ARGI_INVALID_OPCODE -#define ARGI_BYTE_OP ARGI_INVALID_OPCODE -#define ARGI_WORD_OP ARGI_INVALID_OPCODE -#define ARGI_DWORD_OP ARGI_INVALID_OPCODE -#define ARGI_STRING_OP ARGI_INVALID_OPCODE -#define ARGI_QWORD_OP ARGI_INVALID_OPCODE -#define ARGI_SCOPE_OP ARGI_INVALID_OPCODE -#define ARGI_BUFFER_OP ARGI_INVALID_OPCODE -#define ARGI_PACKAGE_OP ARGI_INVALID_OPCODE -#define ARGI_VAR_PACKAGE_OP ARGI_INVALID_OPCODE -#define ARGI_METHOD_OP ARGI_INVALID_OPCODE -#define ARGI_LOCAL0 ARG_NONE -#define ARGI_LOCAL1 ARG_NONE -#define ARGI_LOCAL2 ARG_NONE -#define ARGI_LOCAL3 ARG_NONE -#define ARGI_LOCAL4 ARG_NONE -#define ARGI_LOCAL5 ARG_NONE -#define ARGI_LOCAL6 ARG_NONE -#define ARGI_LOCAL7 ARG_NONE #define ARGI_ARG0 ARG_NONE #define ARGI_ARG1 ARG_NONE #define ARGI_ARG2 ARG_NONE @@ -226,98 +210,116 @@ #define ARGI_ARG4 ARG_NONE #define ARGI_ARG5 ARG_NONE #define ARGI_ARG6 ARG_NONE -#define ARGI_STORE_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_TARGETREF) -#define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF) -#define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) -#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) -#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) -#define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF) -#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE #define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_BIT_NOT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REFERENCE) +#define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_BREAK_OP ARG_NONE +#define ARGI_BREAK_POINT_OP ARG_NONE +#define ARGI_BUFFER_OP ARGI_INVALID_OPCODE +#define ARGI_BYTE_OP ARGI_INVALID_OPCODE +#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE +#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) -#define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) -#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT) -#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_CREATE_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_CREATE_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) +#define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE +#define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) #define ARGI_CREATE_BIT_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE) +#define ARGI_CREATE_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_CREATE_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) #define ARGI_CREATE_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) +#define ARGI_DEBUG_OP ARG_NONE +#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) +#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REFERENCE) +#define ARGI_DEVICE_OP ARGI_INVALID_OPCODE +#define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF) +#define ARGI_DWORD_OP ARGI_INVALID_OPCODE +#define ARGI_ELSE_OP ARGI_INVALID_OPCODE +#define ARGI_EVENT_OP ARGI_INVALID_OPCODE +#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_FIELD_OP ARGI_INVALID_OPCODE +#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_IF_OP ARGI_INVALID_OPCODE +#define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) +#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE +#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) #define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) #define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE #define ARGI_LLESS_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) -#define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) +#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE +#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) +#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE +#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION, ARGI_TARGETREF) +#define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_TARGETREF) +#define ARGI_LOCAL0 ARG_NONE +#define ARGI_LOCAL1 ARG_NONE +#define ARGI_LOCAL2 ARG_NONE +#define ARGI_LOCAL3 ARG_NONE +#define ARGI_LOCAL4 ARG_NONE +#define ARGI_LOCAL5 ARG_NONE +#define ARGI_LOCAL6 ARG_NONE +#define ARGI_LOCAL7 ARG_NONE +#define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_METHOD_OP ARGI_INVALID_OPCODE +#define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE #define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFERSTRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE -#define ARGI_IF_OP ARGI_INVALID_OPCODE -#define ARGI_ELSE_OP ARGI_INVALID_OPCODE -#define ARGI_WHILE_OP ARGI_INVALID_OPCODE +#define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_MUTEX_OP ARGI_INVALID_OPCODE +#define ARGI_NAME_OP ARGI_INVALID_OPCODE +#define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE +#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE #define ARGI_NOOP_OP ARG_NONE -#define ARGI_RETURN_OP ARGI_INVALID_OPCODE -#define ARGI_BREAK_OP ARG_NONE -#define ARGI_BREAK_POINT_OP ARG_NONE +#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) +#define ARGI_ONE_OP ARG_NONE #define ARGI_ONES_OP ARG_NONE -#define ARGI_MUTEX_OP ARGI_INVALID_OPCODE -#define ARGI_EVENT_OP ARGI_INVALID_OPCODE -#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) -#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_TARGETREF) -#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION, ARGI_TARGETREF) -#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER) -#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT) -#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) -#define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT) -#define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX) -#define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) -#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) -#define ARGI_REVISION_OP ARG_NONE -#define ARGI_DEBUG_OP ARG_NONE -#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_DEVICE_OP ARGI_INVALID_OPCODE -#define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE +#define ARGI_PACKAGE_OP ARGI_INVALID_OPCODE #define ARGI_POWER_RES_OP ARGI_INVALID_OPCODE -#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE -#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) -#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE -#define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE -#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE +#define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE +#define ARGI_QWORD_OP ARGI_INVALID_OPCODE +#define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF) +#define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +#define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX) #define ARGI_RESERVEDFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE +#define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT) +#define ARGI_RETURN_OP ARGI_INVALID_OPCODE +#define ARGI_REVISION_OP ARG_NONE +#define ARGI_SCOPE_OP ARGI_INVALID_OPCODE +#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT) +#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT) +#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) +#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE +#define ARGI_STORE_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_TARGETREF) +#define ARGI_STRING_OP ARGI_INVALID_OPCODE +#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) +#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE +#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) +#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) +#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) +#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE) +#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) +#define ARGI_VAR_PACKAGE_OP ARGI_INVALID_OPCODE +#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) +#define ARGI_WHILE_OP ARGI_INVALID_OPCODE +#define ARGI_WORD_OP ARGI_INVALID_OPCODE +#define ARGI_ZERO_OP ARG_NONE /* @@ -447,143 +449,143 @@ static const acpi_opcode_info aml_op_info[] = { -/* Index Name Parser Args Interpreter Args Flags */ +/* Index Name Parser Args Interpreter Args Class Type Flags */ -/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 04 */ ACPI_OP ("Byte_const", ARGP_BYTE_OP, ARGI_BYTE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 05 */ ACPI_OP ("Word_const", ARGP_WORD_OP, ARGI_WORD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 06 */ ACPI_OP ("Dword_const", ARGP_DWORD_OP, ARGI_DWORD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS), -/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS), -/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED|AML_DEFER), -/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS ), -/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 1_a */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS ), -/* 1_b */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 1_c */ ACPI_OP ("Ref_of", ARGP_REF_OF_OP, ARGI_REF_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 1_d */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 1_e */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 1_f */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 24 */ ACPI_OP ("Shift_left", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 25 */ ACPI_OP ("Shift_right", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 2_a */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 2_b */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 2_c */ ACPI_OP ("Find_set_left_bit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 2_d */ ACPI_OP ("Find_set_right_bit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 2_e */ ACPI_OP ("Deref_of", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 2_f */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC1| AML_HAS_ARGS), -/* 30 */ ACPI_OP ("Size_of", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_TRIADIC| AML_HAS_ARGS), -/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_HEXADIC| AML_HAS_ARGS), -/* 33 */ ACPI_OP ("Create_dWord_field", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 34 */ ACPI_OP ("Create_word_field", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 35 */ ACPI_OP ("Create_byte_field", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 36 */ ACPI_OP ("Create_bit_field", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 37 */ ACPI_OP ("Object_type", ARGP_TYPE_OP, ARGI_TYPE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_a */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS), -/* 3_b */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_c */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_d */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS), -/* 3_e */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 3_f */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS), -/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 44 */ ACPI_OP ("Break_point", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), +/* 00 */ ACPI_OP ("Zero", ARGP_ZERO_OP, ARGI_ZERO_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 01 */ ACPI_OP ("One", ARGP_ONE_OP, ARGI_ONE_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 02 */ ACPI_OP ("Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 03 */ ACPI_OP ("Name", ARGP_NAME_OP, ARGI_NAME_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 04 */ ACPI_OP ("Byte_const", ARGP_BYTE_OP, ARGI_BYTE_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 05 */ ACPI_OP ("Word_const", ARGP_WORD_OP, ARGI_WORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 06 */ ACPI_OP ("Dword_const", ARGP_DWORD_OP, ARGI_DWORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 07 */ ACPI_OP ("String", ARGP_STRING_OP, ARGI_STRING_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 08 */ ACPI_OP ("Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 09 */ ACPI_OP ("Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), +/* 0A */ ACPI_OP ("Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS), +/* 0B */ ACPI_OP ("Method", ARGP_METHOD_OP, ARGI_METHOD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 0C */ ACPI_OP ("Local0", ARGP_LOCAL0, ARGI_LOCAL0, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0D */ ACPI_OP ("Local1", ARGP_LOCAL1, ARGI_LOCAL1, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0E */ ACPI_OP ("Local2", ARGP_LOCAL2, ARGI_LOCAL2, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 0F */ ACPI_OP ("Local3", ARGP_LOCAL3, ARGI_LOCAL3, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 10 */ ACPI_OP ("Local4", ARGP_LOCAL4, ARGI_LOCAL4, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 11 */ ACPI_OP ("Local5", ARGP_LOCAL5, ARGI_LOCAL5, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 12 */ ACPI_OP ("Local6", ARGP_LOCAL6, ARGI_LOCAL6, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 13 */ ACPI_OP ("Local7", ARGP_LOCAL7, ARGI_LOCAL7, AML_CLASS_ARGUMENT, AML_TYPE_LOCAL_VARIABLE, 0), +/* 14 */ ACPI_OP ("Arg0", ARGP_ARG0, ARGI_ARG0, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 15 */ ACPI_OP ("Arg1", ARGP_ARG1, ARGI_ARG1, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 16 */ ACPI_OP ("Arg2", ARGP_ARG2, ARGI_ARG2, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 17 */ ACPI_OP ("Arg3", ARGP_ARG3, ARGI_ARG3, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 18 */ ACPI_OP ("Arg4", ARGP_ARG4, ARGI_ARG4, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 19 */ ACPI_OP ("Arg5", ARGP_ARG5, ARGI_ARG5, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1_a */ ACPI_OP ("Arg6", ARGP_ARG6, ARGI_ARG6, AML_CLASS_ARGUMENT, AML_TYPE_METHOD_ARGUMENT, 0), +/* 1_b */ ACPI_OP ("Store", ARGP_STORE_OP, ARGI_STORE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 1_c */ ACPI_OP ("Ref_of", ARGP_REF_OF_OP, ARGI_REF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 1_d */ ACPI_OP ("Add", ARGP_ADD_OP, ARGI_ADD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 1_e */ ACPI_OP ("Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 1_f */ ACPI_OP ("Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 20 */ ACPI_OP ("Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 21 */ ACPI_OP ("Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 22 */ ACPI_OP ("Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 23 */ ACPI_OP ("Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_2T_1R, AML_FLAGS_EXEC_2A_2T_1R), +/* 24 */ ACPI_OP ("Shift_left", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 25 */ ACPI_OP ("Shift_right", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 26 */ ACPI_OP ("And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 27 */ ACPI_OP ("NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 28 */ ACPI_OP ("Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 29 */ ACPI_OP ("NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 2_a */ ACPI_OP ("XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R | AML_MATH), +/* 2_b */ ACPI_OP ("Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2_c */ ACPI_OP ("Find_set_left_bit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2_d */ ACPI_OP ("Find_set_right_bit", ARGP_FIND_SET_RIGHT_BIT_OP,ARGI_FIND_SET_RIGHT_BIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 2_e */ ACPI_OP ("Deref_of", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 2_f */ ACPI_OP ("Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_0R, AML_FLAGS_EXEC_2A_0T_0R), +/* 30 */ ACPI_OP ("Size_of", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 31 */ ACPI_OP ("Index", ARGP_INDEX_OP, ARGI_INDEX_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 32 */ ACPI_OP ("Match", ARGP_MATCH_OP, ARGI_MATCH_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), +/* 33 */ ACPI_OP ("Create_dWord_field", ARGP_CREATE_DWORD_FIELD_OP,ARGI_CREATE_DWORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 34 */ ACPI_OP ("Create_word_field", ARGP_CREATE_WORD_FIELD_OP, ARGI_CREATE_WORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 35 */ ACPI_OP ("Create_byte_field", ARGP_CREATE_BYTE_FIELD_OP, ARGI_CREATE_BYTE_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 36 */ ACPI_OP ("Create_bit_field", ARGP_CREATE_BIT_FIELD_OP, ARGI_CREATE_BIT_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 37 */ ACPI_OP ("Object_type", ARGP_TYPE_OP, ARGI_TYPE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 38 */ ACPI_OP ("LAnd", ARGP_LAND_OP, ARGI_LAND_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 39 */ ACPI_OP ("LOr", ARGP_LOR_OP, ARGI_LOR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_a */ ACPI_OP ("LNot", ARGP_LNOT_OP, ARGI_LNOT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_1R, AML_FLAGS_EXEC_1A_0T_1R), +/* 3_b */ ACPI_OP ("LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_c */ ACPI_OP ("LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_d */ ACPI_OP ("LLess", ARGP_LLESS_OP, ARGI_LLESS_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R | AML_LOGICAL), +/* 3_e */ ACPI_OP ("If", ARGP_IF_OP, ARGI_IF_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 3_f */ ACPI_OP ("Else", ARGP_ELSE_OP, ARGI_ELSE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 40 */ ACPI_OP ("While", ARGP_WHILE_OP, ARGI_WHILE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 41 */ ACPI_OP ("Noop", ARGP_NOOP_OP, ARGI_NOOP_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 42 */ ACPI_OP ("Return", ARGP_RETURN_OP, ARGI_RETURN_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, AML_HAS_ARGS), +/* 43 */ ACPI_OP ("Break", ARGP_BREAK_OP, ARGI_BREAK_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 44 */ ACPI_OP ("Break_point", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 45 */ ACPI_OP ("Ones", ARGP_ONES_OP, ARGI_ONES_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), /* Prefixed opcodes (Two-byte opcodes with a prefix op) */ -/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_NO_ARGS |AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED ), -/* 48 */ ACPI_OP ("Cond_ref_of", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 49 */ ACPI_OP ("Create_field", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_FIELD|AML_CREATE), -/* 4_a */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS), -/* 4_b */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 4_c */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 4_d */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s| AML_HAS_ARGS), -/* 4_e */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 4_f */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s| AML_HAS_ARGS), -/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS), -/* 52 */ ACPI_OP ("From_bCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 53 */ ACPI_OP ("To_bCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS), -/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS ), -/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_TRIADIC| AML_HAS_ARGS), -/* 58 */ ACPI_OP ("Op_region", ARGP_REGION_OP, ARGI_REGION_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED|AML_DEFER), -/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_FIELD), -/* 5_a */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_b */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_c */ ACPI_OP ("Power_resource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_d */ ACPI_OP ("Thermal_zone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED), -/* 5_e */ ACPI_OP ("Index_field", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_FIELD), -/* 5_f */ ACPI_OP ("Bank_field", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_FIELD), +/* 46 */ ACPI_OP ("Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 47 */ ACPI_OP ("Event", ARGP_EVENT_OP, ARGI_EVENT_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 48 */ ACPI_OP ("Cond_ref_of", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 49 */ ACPI_OP ("Create_field", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_FIELD | AML_CREATE), +/* 4_a */ ACPI_OP ("Load", ARGP_LOAD_OP, ARGI_LOAD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_0R, AML_FLAGS_EXEC_1A_1T_0R), +/* 4_b */ ACPI_OP ("Stall", ARGP_STALL_OP, ARGI_STALL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4_c */ ACPI_OP ("Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4_d */ ACPI_OP ("Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 4_e */ ACPI_OP ("Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 4_f */ ACPI_OP ("Wait", ARGP_WAIT_OP, ARGI_WAIT_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_0T_1R, AML_FLAGS_EXEC_2A_0T_1R), +/* 50 */ ACPI_OP ("Reset", ARGP_RESET_OP, ARGI_RESET_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 51 */ ACPI_OP ("Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 52 */ ACPI_OP ("From_bCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 53 */ ACPI_OP ("To_bCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 54 */ ACPI_OP ("Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_0T_0R, AML_FLAGS_EXEC_1A_0T_0R), +/* 55 */ ACPI_OP ("Revision", ARGP_REVISION_OP, ARGI_REVISION_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 56 */ ACPI_OP ("Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP, AML_CLASS_ARGUMENT, AML_TYPE_CONSTANT, 0), +/* 57 */ ACPI_OP ("Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R), +/* 58 */ ACPI_OP ("Op_region", ARGP_REGION_OP, ARGI_REGION_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_COMPLEX, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED | AML_DEFER), +/* 59 */ ACPI_OP ("Field", ARGP_FIELD_OP, ARGI_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5_a */ ACPI_OP ("Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_b */ ACPI_OP ("Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_c */ ACPI_OP ("Power_resource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_SIMPLE, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_d */ ACPI_OP ("Thermal_zone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED), +/* 5_e */ ACPI_OP ("Index_field", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), +/* 5_f */ ACPI_OP ("Bank_field", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_FIELD), /* Internal opcodes that map to invalid AML opcodes */ -/* 60 */ ACPI_OP ("LNot_equal", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 61 */ ACPI_OP ("LLess_equal", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 62 */ ACPI_OP ("LGreater_equal", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 63 */ ACPI_OP ("[Name_path]", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS|AML_NSOBJECT|AML_NSNODE ), -/* 64 */ ACPI_OP ("[Method_call]", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_CALL| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE), -/* 65 */ ACPI_OP ("[Byte_list]", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 66 */ ACPI_OP ("[Reserved_field]", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS ), -/* 67 */ ACPI_OP ("[Named_field]", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS|AML_NSOBJECT|AML_NSOPCODE|AML_NSNODE|AML_NAMED ), -/* 68 */ ACPI_OP ("[Access_field]", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS ), -/* 69 */ ACPI_OP ("[Static_string", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS ), -/* 6_a */ ACPI_OP ("[Return Value]", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_OPCODE | OPTYPE_RETURN| AML_HAS_ARGS), -/* 6_b */ ACPI_OP ("UNKNOWN_OP!", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_UNKNOWN | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 6_c */ ACPI_OP ("ASCII_ONLY!", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_ASCII | OPTYPE_BOGUS| AML_HAS_ARGS), -/* 6_d */ ACPI_OP ("PREFIX_ONLY!", ARG_NONE, ARG_NONE, ACPI_OP_TYPE_PREFIX | OPTYPE_BOGUS| AML_HAS_ARGS), - - -/* ACPI 2.0 (new) opcodes */ - -/* 6_e */ ACPI_OP ("Qword_const", ARGP_QWORD_OP, ARGI_QWORD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS ), -/* 6_f */ ACPI_OP ("Var_package", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS|AML_DEFER), -/* 70 */ ACPI_OP ("Concat_res", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 72 */ ACPI_OP ("Create_qWord_field", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS|AML_NSOBJECT|AML_NSNODE|AML_DEFER|AML_CREATE), -/* 73 */ ACPI_OP ("To_buffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 74 */ ACPI_OP ("To_decimal_string", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 75 */ ACPI_OP ("To_hex_string", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 76 */ ACPI_OP ("To_integer", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 77 */ ACPI_OP ("To_string", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS), -/* 78 */ ACPI_OP ("Copy_object", ARGP_COPY_OP, ARGI_COPY_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 7_a */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS ), -/* 7_b */ ACPI_OP ("Load_table", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), -/* 7_c */ ACPI_OP ("Data_op_region", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS), +/* 60 */ ACPI_OP ("LNot_equal", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 61 */ ACPI_OP ("LLess_equal", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 62 */ ACPI_OP ("LGreater_equal", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 63 */ ACPI_OP ("[Name_path]", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, AML_NSOBJECT | AML_NSNODE ), +/* 64 */ ACPI_OP ("[Method_call]", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP, AML_CLASS_METHOD_CALL, AML_TYPE_METHOD_CALL, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE), +/* 65 */ ACPI_OP ("[Byte_list]", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 66 */ ACPI_OP ("[Reserved_field]", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 67 */ ACPI_OP ("[Named_field]", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE | AML_NAMED ), +/* 68 */ ACPI_OP ("[Access_field]", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 69 */ ACPI_OP ("[Static_string", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0), +/* 6_a */ ACPI_OP ("[Return Value]", ARG_NONE, ARG_NONE, AML_CLASS_RETURN_VALUE, AML_TYPE_RETURN, AML_HAS_ARGS | AML_HAS_RETVAL), +/* 6_b */ ACPI_OP ("UNKNOWN_OP!", ARG_NONE, ARG_NONE, AML_CLASS_UNKNOWN, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 6_c */ ACPI_OP ("ASCII_ONLY!", ARG_NONE, ARG_NONE, AML_CLASS_ASCII, AML_TYPE_BOGUS, AML_HAS_ARGS), +/* 6_d */ ACPI_OP ("PREFIX_ONLY!", ARG_NONE, ARG_NONE, AML_CLASS_PREFIX, AML_TYPE_BOGUS, AML_HAS_ARGS), + + +/* ACPI 2.0 opcodes */ + +/* 6_e */ ACPI_OP ("Qword_const", ARGP_QWORD_OP, ARGI_QWORD_OP, AML_CLASS_ARGUMENT, AML_TYPE_LITERAL, 0), +/* 6_f */ ACPI_OP ("Var_package", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP, AML_CLASS_ARGUMENT, AML_TYPE_DATA_TERM, AML_HAS_ARGS | AML_DEFER), +/* 70 */ ACPI_OP ("Concat_res", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 71 */ ACPI_OP ("Mod", ARGP_MOD_OP, ARGI_MOD_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 72 */ ACPI_OP ("Create_qWord_field", ARGP_CREATE_QWORD_FIELD_OP,ARGI_CREATE_QWORD_FIELD_OP, AML_CLASS_CREATE, AML_TYPE_CREATE_FIELD, AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_DEFER | AML_CREATE), +/* 73 */ ACPI_OP ("To_buffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 74 */ ACPI_OP ("To_decimal_string", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 75 */ ACPI_OP ("To_hex_string", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 76 */ ACPI_OP ("To_integer", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 77 */ ACPI_OP ("To_string", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_2A_1T_1R, AML_FLAGS_EXEC_2A_1T_1R), +/* 78 */ ACPI_OP ("Copy_object", ARGP_COPY_OP, ARGI_COPY_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), +/* 79 */ ACPI_OP ("Mid", ARGP_MID_OP, ARGI_MID_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_3A_1T_1R, AML_FLAGS_EXEC_3A_1T_1R), +/* 7_a */ ACPI_OP ("Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP, AML_CLASS_CONTROL, AML_TYPE_CONTROL, 0), +/* 7_b */ ACPI_OP ("Load_table", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_6A_0T_1R, AML_FLAGS_EXEC_6A_0T_1R), +/* 7_c */ ACPI_OP ("Data_op_region", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP, AML_CLASS_EXECUTE, AML_TYPE_EXEC_1A_1T_1R, AML_FLAGS_EXEC_1A_1T_1R), }; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psparse.c linux/drivers/acpi/parser/psparse.c --- v2.4.13/linux/drivers/acpi/parser/psparse.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psparse.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psparse - Parser top level AML parse routines - * $Revision: 96 $ + * $Revision: 104 $ * *****************************************************************************/ @@ -122,10 +122,8 @@ /* Extended opcode */ opcode = (u16) ((opcode << 8) | GET8 (aml)); - aml++; } - /* don't convert bare name to a namepath */ return (opcode); } @@ -133,45 +131,6 @@ /******************************************************************************* * - * FUNCTION: Acpi_ps_create_state - * - * PARAMETERS: Aml - Aml code pointer - * Aml_size - Length of AML code - * - * RETURN: A new parser state object - * - * DESCRIPTION: Create and initialize a new parser state object - * - ******************************************************************************/ - -acpi_parse_state * -acpi_ps_create_state ( - u8 *aml, - u32 aml_size) -{ - acpi_parse_state *parser_state; - - - FUNCTION_TRACE ("Ps_create_state"); - - - parser_state = ACPI_MEM_CALLOCATE (sizeof (acpi_parse_state)); - if (!parser_state) { - return_PTR (NULL); - } - - parser_state->aml = aml; - parser_state->aml_end = aml + aml_size; - parser_state->pkg_end = parser_state->aml_end; - parser_state->aml_start = aml; - - - return_PTR (parser_state); -} - - -/******************************************************************************* - * * FUNCTION: Acpi_ps_find_object * * PARAMETERS: Opcode - Current opcode @@ -192,29 +151,25 @@ acpi_status acpi_ps_find_object ( - u16 opcode, - acpi_parse_object *op, acpi_walk_state *walk_state, acpi_parse_object **out_op) { NATIVE_CHAR *path; - const acpi_opcode_info *op_info; /* We are only interested in opcodes that have an associated name */ - op_info = acpi_ps_get_opcode_info (opcode); - if (!(op_info->flags & AML_NAMED)) { - *out_op = op; + if (!(walk_state->op_info->flags & AML_NAMED)) { + *out_op = walk_state->op; return (AE_OK); } /* Find the name in the parse tree */ - path = acpi_ps_get_next_namestring (walk_state->parser_state); + path = acpi_ps_get_next_namestring (&walk_state->parser_state); - *out_op = acpi_ps_find (acpi_ps_get_parent_scope (walk_state->parser_state), - path, opcode, 1); + *out_op = acpi_ps_find (acpi_ps_get_parent_scope (&walk_state->parser_state), + path, walk_state->opcode, 1); if (!(*out_op)) { return (AE_NOT_FOUND); @@ -247,28 +202,17 @@ #ifndef PARSER_ONLY acpi_parse_object *prev; acpi_parse_object *next; - const acpi_opcode_info *op_info; const acpi_opcode_info *parent_info; - u32 opcode_class; acpi_parse_object *replacement_op = NULL; FUNCTION_TRACE_PTR ("Ps_complete_this_op", op); - op_info = acpi_ps_get_opcode_info (op->opcode); - opcode_class = ACPI_GET_OP_CLASS (op_info); - - /* Delete this op and the subtree below it if asked to */ if (((walk_state->parse_flags & ACPI_PARSE_TREE_MASK) == ACPI_PARSE_DELETE_TREE) && - (opcode_class != OPTYPE_CONSTANT) && - (opcode_class != OPTYPE_LITERAL) && - (opcode_class != OPTYPE_LOCAL_VARIABLE) && - (opcode_class != OPTYPE_METHOD_ARGUMENT) && - (opcode_class != OPTYPE_DATA_TERM) && - (op->opcode != AML_INT_NAMEPATH_OP)) { + (walk_state->op_info->class != AML_CLASS_ARGUMENT)) { /* Make sure that we only delete this subtree */ if (op->parent) { @@ -278,11 +222,12 @@ */ parent_info = acpi_ps_get_opcode_info (op->parent->opcode); - switch (ACPI_GET_OP_CLASS (parent_info)) { - case OPTYPE_CONTROL: /* IF, ELSE, WHILE only */ + switch (parent_info->class) { + case AML_CLASS_CONTROL: /* IF, ELSE, WHILE only */ break; - case OPTYPE_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_NAMED_OBJECT: /* Scope, method, etc. */ + case AML_CLASS_CREATE: /* * These opcodes contain Term_arg operands. The current @@ -385,7 +330,7 @@ acpi_parse_object *op, acpi_status callback_status) { - acpi_parse_state *parser_state = walk_state->parser_state; + acpi_parse_state *parser_state = &walk_state->parser_state; acpi_status status = AE_CTRL_PENDING; u8 *start; u32 package_length; @@ -500,13 +445,7 @@ { acpi_status status = AE_OK; acpi_parse_object *op = NULL; /* current op */ - const acpi_opcode_info *op_info; acpi_parse_object *arg = NULL; - acpi_parse2_object *deferred_op; - u32 arg_count; /* push for fixed or var args */ - u32 arg_types = 0; - u32 aml_offset; - u16 opcode; acpi_parse_object pre_op; acpi_parse_state *parser_state; u8 *aml_op_start; @@ -515,7 +454,8 @@ FUNCTION_TRACE_PTR ("Ps_parse_loop", walk_state); - parser_state = walk_state->parser_state; + parser_state = &walk_state->parser_state; + walk_state->arg_types = 0; #ifndef PARSER_ONLY if (walk_state->walk_type & WALK_METHOD_RESTART) { @@ -527,7 +467,7 @@ * was just completed */ if ((parser_state->scope->parse_scope.op) && - ((parser_state->scope->parse_scope.op->opcode == AML_IF_OP) || + ((parser_state->scope->parse_scope.op->opcode == AML_IF_OP) || (parser_state->scope->parse_scope.op->opcode == AML_WHILE_OP)) && (walk_state->control_state) && (walk_state->control_state->common.state == @@ -537,7 +477,8 @@ * A predicate was just completed, get the value of the * predicate and branch based on that value */ - status = acpi_ds_get_predicate_value (walk_state, NULL, TRUE); + walk_state->op = NULL; + status = acpi_ds_get_predicate_value (walk_state, TRUE); if (ACPI_FAILURE (status) && ((status & AE_CODE_MASK) != AE_CODE_CONTROL)) { if (status == AE_AML_NO_RETURN_VALUE) { @@ -554,7 +495,7 @@ status = acpi_ps_next_parse_state (walk_state, op, status); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); } @@ -562,7 +503,7 @@ /* We were in the middle of an op */ op = walk_state->prev_op; - arg_types = walk_state->prev_arg_types; + walk_state->arg_types = walk_state->prev_arg_types; } } #endif @@ -575,8 +516,8 @@ /* Get the next opcode from the AML stream */ aml_op_start = parser_state->aml; - aml_offset = parser_state->aml - parser_state->aml_start; - opcode = acpi_ps_peek_opcode (parser_state); + walk_state->aml_offset = parser_state->aml - parser_state->aml_start; + walk_state->opcode = acpi_ps_peek_opcode (parser_state); /* * First cut to determine what we have found: @@ -584,33 +525,25 @@ * 2) A name string * 3) An unknown/invalid opcode */ - op_info = acpi_ps_get_opcode_info (opcode); - switch (ACPI_GET_OP_TYPE (op_info)) { - case ACPI_OP_TYPE_OPCODE: - - /* Found opcode info, this is a normal opcode */ - - parser_state->aml += acpi_ps_get_opcode_size (opcode); - arg_types = op_info->parse_args; - break; - - case ACPI_OP_TYPE_ASCII: - case ACPI_OP_TYPE_PREFIX: + walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); + switch (walk_state->op_info->class) { + case AML_CLASS_ASCII: + case AML_CLASS_PREFIX: /* * Starts with a valid prefix or ASCII char, this is a name * string. Convert the bare name string to a namepath. */ - opcode = AML_INT_NAMEPATH_OP; - arg_types = ARGP_NAMESTRING; + walk_state->opcode = AML_INT_NAMEPATH_OP; + walk_state->arg_types = ARGP_NAMESTRING; break; - case ACPI_OP_TYPE_UNKNOWN: + case AML_CLASS_UNKNOWN: /* The opcode is unrecognized. Just skip unknown opcodes */ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Found unknown opcode %lX at AML offset %X, ignoring\n", - opcode, aml_offset)); + "Found unknown opcode %X at AML offset %X, ignoring\n", + walk_state->opcode, walk_state->aml_offset)); DUMP_BUFFER (parser_state->aml, 128); @@ -618,34 +551,54 @@ parser_state->aml++; continue; + + default: + + /* Found opcode info, this is a normal opcode */ + + parser_state->aml += acpi_ps_get_opcode_size (walk_state->opcode); + walk_state->arg_types = walk_state->op_info->parse_args; + break; + } /* Create Op structure and append to parent's argument list */ - if (op_info->flags & AML_NAMED) { + if (walk_state->op_info->flags & AML_NAMED) { pre_op.value.arg = NULL; - pre_op.opcode = opcode; + pre_op.opcode = walk_state->opcode; - while (GET_CURRENT_ARG_TYPE (arg_types) != ARGP_NAME) { + while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) != ARGP_NAME) { arg = acpi_ps_get_next_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), - &arg_count); + GET_CURRENT_ARG_TYPE (walk_state->arg_types), + &walk_state->arg_count); acpi_ps_append_arg (&pre_op, arg); - INCREMENT_ARG_LIST (arg_types); + INCREMENT_ARG_LIST (walk_state->arg_types); } /* We know that this arg is a name, move to next arg */ - INCREMENT_ARG_LIST (arg_types); + INCREMENT_ARG_LIST (walk_state->arg_types); if (walk_state->descending_callback != NULL) { /* * Find the object. This will either insert the object into * the namespace or simply look it up */ - status = walk_state->descending_callback (opcode, NULL, walk_state, &op); + walk_state->op = NULL; + + status = walk_state->descending_callback (walk_state, &op); + + /* TBD: check status here? */ + + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "During name lookup/catalog, %s\n", + acpi_format_exception (status))); + goto close_this_op; + } + if (op == NULL) { continue; } @@ -665,8 +618,6 @@ if (op->opcode == AML_REGION_OP) { - deferred_op = (acpi_parse2_object *) op; - /* * Defer final parsing of an Operation_region body, * because we don't have enough info in the first pass @@ -679,8 +630,8 @@ * * (Length is unknown until parse of the body complete) */ - deferred_op->data = aml_op_start; - deferred_op->length = 0; + ((acpi_parse2_object * ) op)->data = aml_op_start; + ((acpi_parse2_object * ) op)->length = 0; } } @@ -688,22 +639,20 @@ else { /* Not a named opcode, just allocate Op and append to parent */ - op_info = acpi_ps_get_opcode_info (opcode); - op = acpi_ps_alloc_op (opcode); + walk_state->op_info = acpi_ps_get_opcode_info (walk_state->opcode); + op = acpi_ps_alloc_op (walk_state->opcode); if (!op) { return_ACPI_STATUS (AE_NO_MEMORY); } - if (op_info->flags & AML_CREATE) { + if (walk_state->op_info->flags & AML_CREATE) { /* * Backup to beginning of Create_xXXfield declaration * Body_length is unknown until we parse the body */ - deferred_op = (acpi_parse2_object *) op; - - deferred_op->data = aml_op_start; - deferred_op->length = 0; + ((acpi_parse2_object * ) op)->data = aml_op_start; + ((acpi_parse2_object * ) op)->length = 0; } acpi_ps_append_arg (acpi_ps_get_parent_scope (parser_state), op); @@ -713,7 +662,9 @@ * Find the object. This will either insert the object into * the namespace or simply look it up */ - status = walk_state->descending_callback (opcode, op, walk_state, &op); + walk_state->op = op; + + status = walk_state->descending_callback (walk_state, &op); status = acpi_ps_next_parse_state (walk_state, op, status); if (status == AE_CTRL_PENDING) { status = AE_OK; @@ -726,11 +677,11 @@ } } - op->aml_offset = aml_offset; + op->aml_offset = walk_state->aml_offset; - if (op_info) { + if (walk_state->op_info) { ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, - "Op=%p Opcode=%4.4lX Aml %p Oft=%5.5lX\n", + "Op=%p Opcode=%4.4X Aml %p Oft=%5.5X\n", op, op->opcode, parser_state->aml, op->aml_offset)); } } @@ -738,10 +689,10 @@ /* Start Arg_count at zero because we don't know if there are any args yet */ - arg_count = 0; + walk_state->arg_count = 0; - if (arg_types) /* Are there any arguments that must be processed? */ { + if (walk_state->arg_types) /* Are there any arguments that must be processed? */ { /* get arguments */ switch (op->opcode) { @@ -754,13 +705,13 @@ /* fill in constant or string argument directly */ acpi_ps_get_next_simple_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), op); + GET_CURRENT_ARG_TYPE (walk_state->arg_types), op); break; case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ - acpi_ps_get_next_namepath (parser_state, op, &arg_count, 1); - arg_types = 0; + acpi_ps_get_next_namepath (parser_state, op, &walk_state->arg_count, 1); + walk_state->arg_types = 0; break; @@ -768,32 +719,30 @@ /* Op is not a constant or string, append each argument */ - while (GET_CURRENT_ARG_TYPE (arg_types) && !arg_count) { - aml_offset = parser_state->aml - parser_state->aml_start; + while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && !walk_state->arg_count) { + walk_state->aml_offset = parser_state->aml - parser_state->aml_start; arg = acpi_ps_get_next_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), - &arg_count); + GET_CURRENT_ARG_TYPE (walk_state->arg_types), + &walk_state->arg_count); if (arg) { - arg->aml_offset = aml_offset; + arg->aml_offset = walk_state->aml_offset; acpi_ps_append_arg (op, arg); } - INCREMENT_ARG_LIST (arg_types); + INCREMENT_ARG_LIST (walk_state->arg_types); } /* For a method, save the length and address of the body */ if (op->opcode == AML_METHOD_OP) { - deferred_op = (acpi_parse2_object *) op; - /* * Skip parsing of control method or opregion body, * because we don't have enough info in the first pass * to parse them correctly. */ - deferred_op->data = parser_state->aml; - deferred_op->length = (u32) (parser_state->pkg_end - + ((acpi_parse2_object * ) op)->data = parser_state->aml; + ((acpi_parse2_object * ) op)->length = (u32) (parser_state->pkg_end - parser_state->aml); /* @@ -802,7 +751,7 @@ * package (We don't know where the end is). */ parser_state->aml = parser_state->pkg_end; - arg_count = 0; + walk_state->arg_count = 0; } break; @@ -813,18 +762,16 @@ /* * Zero Arg_count means that all arguments for this op have been processed */ - if (!arg_count) { + if (!walk_state->arg_count) { /* completed Op, prepare for next */ - op_info = acpi_ps_get_opcode_info (op->opcode); - if (op_info->flags & AML_NAMED) { + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + if (walk_state->op_info->flags & AML_NAMED) { if (acpi_gbl_depth) { acpi_gbl_depth--; } if (op->opcode == AML_REGION_OP) { - deferred_op = (acpi_parse2_object *) op; - /* * Skip parsing of control method or opregion body, * because we don't have enough info in the first pass @@ -833,27 +780,29 @@ * Completed parsing an Op_region declaration, we now * know the length. */ - deferred_op->length = (u32) (parser_state->aml - - deferred_op->data); + ((acpi_parse2_object * ) op)->length = (u32) (parser_state->aml - + ((acpi_parse2_object * ) op)->data); } } - if (op_info->flags & AML_CREATE) { + if (walk_state->op_info->flags & AML_CREATE) { /* * Backup to beginning of Create_xXXfield declaration (1 for * Opcode) * * Body_length is unknown until we parse the body */ - deferred_op = (acpi_parse2_object *) op; - deferred_op->length = (u32) (parser_state->aml - - deferred_op->data); + ((acpi_parse2_object * ) op)->length = (u32) (parser_state->aml - + ((acpi_parse2_object * ) op)->data); } /* This op complete, notify the dispatcher */ if (walk_state->ascending_callback != NULL) { - status = walk_state->ascending_callback (walk_state, op); + walk_state->op = op; + walk_state->opcode = op->opcode; + + status = walk_state->ascending_callback (walk_state); status = acpi_ps_next_parse_state (walk_state, op, status); if (status == AE_CTRL_PENDING) { status = AE_OK; @@ -887,16 +836,20 @@ * We are about to transfer to a called method. */ walk_state->prev_op = op; - walk_state->prev_arg_types = arg_types; + walk_state->prev_arg_types = walk_state->arg_types; return_ACPI_STATUS (status); break; case AE_CTRL_END: - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); + + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; - status = walk_state->ascending_callback (walk_state, op); + status = walk_state->ascending_callback (walk_state); status = acpi_ps_next_parse_state (walk_state, op, status); acpi_ps_complete_this_op (walk_state, op); @@ -915,7 +868,7 @@ acpi_ps_complete_this_op (walk_state, op); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } while (op); return_ACPI_STATUS (status); @@ -925,10 +878,10 @@ default: /* All other non-AE_OK status */ if (op == NULL) { - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } walk_state->prev_op = op; - walk_state->prev_arg_types = arg_types; + walk_state->prev_arg_types = walk_state->arg_types; /* * TEMP: @@ -941,7 +894,7 @@ /* This scope complete? */ if (acpi_ps_has_completed_scope (parser_state)) { - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", op)); } @@ -957,7 +910,7 @@ else { /* complex argument, push Op and prepare for argument */ - acpi_ps_push_scope (parser_state, op, arg_types, arg_count); + acpi_ps_push_scope (parser_state, op, walk_state->arg_types, walk_state->arg_count); op = NULL; } @@ -967,14 +920,18 @@ /* * Complete the last Op (if not completed), and clear the scope stack. * It is easily possible to end an AML "package" with an unbounded number - * of open scopes (such as when several AML blocks are closed with + * of open scopes (such as when several ASL blocks are closed with * sequential closing braces). We want to terminate each one cleanly. */ - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Package complete at Op %p\n", op)); + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", op)); do { if (op) { if (walk_state->ascending_callback != NULL) { - status = walk_state->ascending_callback (walk_state, op); + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; + + status = walk_state->ascending_callback (walk_state); status = acpi_ps_next_parse_state (walk_state, op, status); if (status == AE_CTRL_PENDING) { status = AE_OK; @@ -990,7 +947,7 @@ acpi_ps_complete_this_op (walk_state, op); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } while (op); @@ -1006,7 +963,7 @@ acpi_ps_complete_this_op (walk_state, op); } - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); + acpi_ps_pop_scope (parser_state, &op, &walk_state->arg_types, &walk_state->arg_count); } while (op); @@ -1032,101 +989,34 @@ acpi_status acpi_ps_parse_aml ( - acpi_parse_object *start_scope, - u8 *aml, - u32 aml_size, - u32 parse_flags, - acpi_namespace_node *method_node, - acpi_operand_object **params, - acpi_operand_object **caller_return_desc, - acpi_parse_downwards descending_callback, - acpi_parse_upwards ascending_callback) + acpi_walk_state *walk_state) { acpi_status status; - acpi_parse_state *parser_state; - acpi_walk_state *walk_state; acpi_walk_list walk_list; acpi_walk_list *prev_walk_list = acpi_gbl_current_walk_list; - acpi_operand_object *return_desc; - acpi_operand_object *mth_desc = NULL; + acpi_walk_state *previous_walk_state; FUNCTION_TRACE ("Ps_parse_aml"); - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Entered with Scope=%p Aml=%p size=%lX\n", - start_scope, aml, aml_size)); - + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Entered with Walk_state=%p Aml=%p size=%X\n", + walk_state, walk_state->parser_state.aml, walk_state->parser_state.aml_size)); - /* Create and initialize a new parser state */ - - parser_state = acpi_ps_create_state (aml, aml_size); - if (!parser_state) { - return_ACPI_STATUS (AE_NO_MEMORY); - } - - acpi_ps_init_scope (parser_state, start_scope); - - if (method_node) { - mth_desc = acpi_ns_get_attached_object (method_node); - } /* Create and initialize a new walk list */ - walk_list.walk_state = NULL; + walk_list.walk_state = NULL; walk_list.acquired_mutex_list.prev = NULL; walk_list.acquired_mutex_list.next = NULL; - walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, parser_state->start_op, - mth_desc, &walk_list); - if (!walk_state) { - status = AE_NO_MEMORY; - goto cleanup; - } + walk_state->walk_list = &walk_list; + acpi_ds_push_walk_state (walk_state, &walk_list); - walk_state->method_node = method_node; - walk_state->parser_state = parser_state; - walk_state->parse_flags = parse_flags; - walk_state->descending_callback = descending_callback; - walk_state->ascending_callback = ascending_callback; /* TBD: [Restructure] TEMP until we pass Walk_state to the interpreter */ acpi_gbl_current_walk_list = &walk_list; - - if (method_node) { - parser_state->start_node = method_node; - walk_state->walk_type = WALK_METHOD; - - /* Push start scope on scope stack and make it current */ - - status = acpi_ds_scope_stack_push (method_node, ACPI_TYPE_METHOD, walk_state); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Init arguments if this is a control method */ - /* TBD: [Restructure] add walkstate as a param */ - - acpi_ds_method_data_init_args (params, MTH_NUM_ARGS, walk_state); - } - - else { - /* Setup the current scope */ - - parser_state->start_node = parser_state->start_op->node; - if (parser_state->start_node) { - /* Push start scope on scope stack and make it current */ - - status = acpi_ds_scope_stack_push (parser_state->start_node, - parser_state->start_node->type, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - } - } - /* * Execute the walk loop as long as there is a valid Walk State. This * handles nested control method invocations without recursion. @@ -1136,6 +1026,10 @@ status = AE_OK; while (walk_state) { if (ACPI_SUCCESS (status)) { + /* + * The Parse_loop executes AML until the method terminates + * or calls another method. + */ status = acpi_ps_parse_loop (walk_state); } @@ -1165,13 +1059,6 @@ walk_state = acpi_ds_pop_walk_state (&walk_list); - /* Extract return value before we delete Walk_state */ - - return_desc = walk_state->return_desc; - - ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Return_value=%p, State=%p\n", - walk_state->return_desc, walk_state)); - /* Reset the current scope to the beginning of scope stack */ acpi_ds_scope_stack_clear (walk_state); @@ -1186,38 +1073,44 @@ /* Delete this walk state and all linked control states */ - acpi_ps_cleanup_scope (walk_state->parser_state); - ACPI_MEM_FREE (walk_state->parser_state); - acpi_ds_delete_walk_state (walk_state); + acpi_ps_cleanup_scope (&walk_state->parser_state); + + previous_walk_state = walk_state; + + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Return_value=%p, State=%p\n", + walk_state->return_desc, walk_state)); /* Check if we have restarted a preempted walk */ walk_state = acpi_ds_get_current_walk_state (&walk_list); - if (walk_state && - ACPI_SUCCESS (status)) { - /* There is another walk state, restart it */ + if (walk_state) { + if (ACPI_SUCCESS (status)) { + /* There is another walk state, restart it */ - /* - * If the method returned value is not used by the parent, - * The object is deleted - */ - acpi_ds_restart_control_method (walk_state, return_desc); - walk_state->walk_type |= WALK_METHOD_RESTART; + /* + * If the method returned value is not used by the parent, + * The object is deleted + */ + acpi_ds_restart_control_method (walk_state, previous_walk_state->return_desc); + walk_state->walk_type |= WALK_METHOD_RESTART; + } } /* * Just completed a 1st-level method, save the final internal return * value (if any) */ - else if (caller_return_desc) { - *caller_return_desc = return_desc; /* NULL if no return value */ + else if (previous_walk_state->caller_return_desc) { + *(previous_walk_state->caller_return_desc) = previous_walk_state->return_desc; /* NULL if no return value */ } - else if (return_desc) { + else if (previous_walk_state->return_desc) { /* Caller doesn't want it, must delete it */ - acpi_ut_remove_reference (return_desc); + acpi_ut_remove_reference (previous_walk_state->return_desc); } + + acpi_ds_delete_walk_state (previous_walk_state); } @@ -1225,20 +1118,6 @@ acpi_ex_release_all_mutexes ((acpi_operand_object *) &walk_list.acquired_mutex_list); acpi_gbl_current_walk_list = prev_walk_list; - return_ACPI_STATUS (status); - - -cleanup: - - /* Cleanup */ - - acpi_ds_delete_walk_state (walk_state); - acpi_ps_cleanup_scope (parser_state); - ACPI_MEM_FREE (parser_state); - - acpi_ex_release_all_mutexes ((acpi_operand_object *)&walk_list.acquired_mutex_list); - acpi_gbl_current_walk_list = prev_walk_list; - return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psscope.c linux/drivers/acpi/parser/psscope.c --- v2.4.13/linux/drivers/acpi/parser/psscope.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psscope.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psscope - Parser scope stack management routines - * $Revision: 29 $ + * $Revision: 30 $ * *****************************************************************************/ @@ -103,6 +103,7 @@ return_ACPI_STATUS (AE_NO_MEMORY); } + scope->common.data_type = ACPI_DESC_TYPE_STATE_RPSCOPE; scope->parse_scope.op = root_op; scope->parse_scope.arg_count = ACPI_VAR_ARGS; scope->parse_scope.arg_end = parser_state->aml_end; @@ -149,6 +150,7 @@ } + scope->common.data_type = ACPI_DESC_TYPE_STATE_PSCOPE; scope->parse_scope.op = op; scope->parse_scope.arg_list = remaining_args; scope->parse_scope.arg_count = arg_count; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/pstree.c linux/drivers/acpi/parser/pstree.c --- v2.4.13/linux/drivers/acpi/parser/pstree.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/pstree.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pstree - Parser op tree manipulation/traversal/search - * $Revision: 32 $ + * $Revision: 35 $ * *****************************************************************************/ @@ -60,7 +60,7 @@ /* Get the info structure for this opcode */ op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Invalid opcode or ASCII character */ return (NULL); @@ -68,7 +68,7 @@ /* Check if this opcode requires argument sub-objects */ - if (!(ACPI_GET_OP_ARGS (op_info))) { + if (!(op_info->flags & AML_HAS_ARGS)) { /* Has no linked argument objects */ return (NULL); @@ -118,15 +118,16 @@ /* Get the info structure for this opcode */ op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { + if (op_info->class == AML_CLASS_UNKNOWN) { /* Invalid opcode */ + REPORT_ERROR (("Ps_append_arg: Invalid AML Opcode: 0x%2.2X\n", op->opcode)); return; } /* Check if this opcode requires argument sub-objects */ - if (!(ACPI_GET_OP_ARGS (op_info))) { + if (!(op_info->flags & AML_HAS_ARGS)) { /* Has no linked argument objects */ return; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psutils.c linux/drivers/acpi/parser/psutils.c --- v2.4.13/linux/drivers/acpi/parser/psutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psutils - Parser miscellaneous utilities (Parser only) - * $Revision: 43 $ + * $Revision: 44 $ * *****************************************************************************/ @@ -34,8 +34,8 @@ #define PARSEOP_GENERIC 0x01 #define PARSEOP_NAMED 0x02 -#define PARSEOP_DEFERRED 0x03 -#define PARSEOP_BYTELIST 0x04 +#define PARSEOP_DEFERRED 0x04 +#define PARSEOP_BYTELIST 0x08 #define PARSEOP_IN_CACHE 0x80 diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/pswalk.c linux/drivers/acpi/parser/pswalk.c --- v2.4.13/linux/drivers/acpi/parser/pswalk.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/pswalk.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: pswalk - Parser routines to walk parsed op tree(s) - * $Revision: 56 $ + * $Revision: 58 $ * *****************************************************************************/ @@ -88,7 +88,11 @@ next = op->next; parent = op->parent; - status = ascending_callback (walk_state, op); + walk_state->op = op; + walk_state->op_info = acpi_ps_get_opcode_info (op->opcode); + walk_state->opcode = op->opcode; + + status = ascending_callback (walk_state); /* * If we are back to the starting point, the walk is complete. @@ -144,7 +148,11 @@ grand_parent = parent->parent; next = parent->next; - status = ascending_callback (walk_state, parent); + walk_state->op = parent; + walk_state->op_info = acpi_ps_get_opcode_info (parent->opcode); + walk_state->opcode = parent->opcode; + + status = ascending_callback (walk_state); /* * If we are back to the starting point, the walk is complete. @@ -206,11 +214,10 @@ static acpi_status acpi_ps_delete_completed_op ( - acpi_walk_state *state, - acpi_parse_object *op) + acpi_walk_state *walk_state) { - acpi_ps_free_op (op); + acpi_ps_free_op (walk_state->op); return (AE_OK); } @@ -253,7 +260,6 @@ return_VOID; } - walk_state->parser_state = NULL; walk_state->parse_flags = 0; walk_state->descending_callback = NULL; walk_state->ascending_callback = NULL; diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/parser/psxface.c linux/drivers/acpi/parser/psxface.c --- v2.4.13/linux/drivers/acpi/parser/psxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/parser/psxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: psxface - Parser external interfaces - * $Revision: 47 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -64,6 +64,7 @@ acpi_operand_object *obj_desc; u32 i; acpi_parse_object *op; + acpi_walk_state *walk_state; FUNCTION_TRACE ("Psx_execute"); @@ -98,11 +99,11 @@ } /* - * Perform the first pass parse of the method to enter any + * 1) Perform the first pass parse of the method to enter any * named objects that it creates into the namespace */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "**** Begin Method Execution **** Entry=%p obj=%p\n", + "**** Begin Method Parse **** Entry=%p obj=%p\n", method_node, obj_desc)); /* Create and init a Root Node */ @@ -112,13 +113,34 @@ return_ACPI_STATUS (AE_NO_MEMORY); } - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - method_node, params, return_obj_desc, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); + /* Create and initialize a new walk state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start, + obj_desc->method.aml_length, NULL, NULL, 1); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + + /* Parse the AML */ + + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); + + /* + * 2) Execute the method. Performs second pass parse simultaneously + */ + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "**** Begin Method Execution **** Entry=%p obj=%p\n", + method_node, obj_desc)); + /* Create and init a Root Node */ op = acpi_ps_alloc_op (AML_SCOPE_OP); @@ -126,20 +148,30 @@ return_ACPI_STATUS (AE_NO_MEMORY); } - /* Init new op with the method name and pointer back to the NS node */ acpi_ps_set_name (op, method_node->name); op->node = method_node; + /* Create and initialize a new walk state */ + + walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, + NULL, NULL, NULL); + if (!walk_state) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + + status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start, + obj_desc->method.aml_length, params, return_obj_desc, 3); + if (ACPI_FAILURE (status)) { + /* TBD: delete walk state */ + return_ACPI_STATUS (status); + } + /* * The walk of the parse tree is where we actually execute the method */ - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - method_node, params, return_obj_desc, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); + status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); if (params) { @@ -151,12 +183,18 @@ } + if (ACPI_FAILURE (status)) { + DUMP_PATHNAME (method_node, "Ps_execute: method failed -", + ACPI_LV_ERROR, _COMPONENT); + } + + /* * If the method has returned an object, signal this to the caller with * a control exception code */ if (*return_obj_desc) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Method returned Obj_desc=%X\n", + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Method returned Obj_desc=%p\n", *return_obj_desc)); DUMP_STACK_ENTRY (*return_obj_desc); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/resources/rsutils.c linux/drivers/acpi/resources/rsutils.c --- v2.4.13/linux/drivers/acpi/resources/rsutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/resources/rsutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsutils - Utilities for the resource manager - * $Revision: 22 $ + * $Revision: 23 $ * ******************************************************************************/ @@ -384,7 +384,6 @@ */ cleanup: - ACPI_MEM_FREE (byte_stream); return_ACPI_STATUS (status); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/resources/rsxface.c linux/drivers/acpi/resources/rsxface.c --- v2.4.13/linux/drivers/acpi/resources/rsxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/resources/rsxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: rsxface - Public interfaces to the resource manager - * $Revision: 14 $ + * $Revision: 15 $ * ******************************************************************************/ @@ -67,13 +67,6 @@ FUNCTION_TRACE ("Acpi_get_irq_routing_table "); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length @@ -126,13 +119,6 @@ FUNCTION_TRACE ("Acpi_get_current_resources"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length @@ -182,13 +168,6 @@ FUNCTION_TRACE ("Acpi_get_possible_resources"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* * Must have a valid handle and buffer, So we have to have a handle * and a return buffer structure, and if there is a non-zero buffer length @@ -234,13 +213,6 @@ FUNCTION_TRACE ("Acpi_set_current_resources"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* * Must have a valid handle and buffer diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbconvrt.c linux/drivers/acpi/tables/tbconvrt.c --- v2.4.13/linux/drivers/acpi/tables/tbconvrt.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbconvrt.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbconvrt - ACPI Table conversion utilities - * $Revision: 27 $ + * $Revision: 28 $ * *****************************************************************************/ @@ -66,7 +66,7 @@ else #endif { - pointer_size = sizeof (UINT64); + pointer_size = sizeof (u64); } /* @@ -109,7 +109,7 @@ /* Compute size of the converted XSDT */ - table_size = (*number_of_tables * sizeof (UINT64)) + sizeof (acpi_table_header); + table_size = (*number_of_tables * sizeof (u64)) + sizeof (acpi_table_header); /* Allocate an XSDT */ @@ -239,7 +239,7 @@ FADT2->sci_int = FADT71->sci_int; FADT2->acpi_enable = FADT71->acpi_enable; FADT2->acpi_disable = FADT71->acpi_disable; - FADT2->S4_bios_req = FADT71->S4_bios_req; + FADT2->S4bios_req = FADT71->S4bios_req; FADT2->plvl2_lat = FADT71->plvl2_lat; FADT2->plvl3_lat = FADT71->plvl3_lat; FADT2->day_alrm = FADT71->day_alrm; @@ -476,7 +476,7 @@ /* Dump the entire FADT */ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, - "Hex dump of common internal FADT, size %ld (%lX)\n", + "Hex dump of common internal FADT, size %d (%X)\n", acpi_gbl_FADT->header.length, acpi_gbl_FADT->header.length)); DUMP_BUFFER ((u8 *) (acpi_gbl_FADT), acpi_gbl_FADT->header.length); @@ -540,7 +540,7 @@ FACS1 = (facs_descriptor_rev1 *) acpi_gbl_FACS; common_facs->global_lock = &(FACS1->global_lock); - common_facs->firmware_waking_vector = (UINT64 *) &FACS1->firmware_waking_vector; + common_facs->firmware_waking_vector = (u64 *) &FACS1->firmware_waking_vector; common_facs->vector_width = 32; #endif diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbget.c linux/drivers/acpi/tables/tbget.c --- v2.4.13/linux/drivers/acpi/tables/tbget.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbget.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbget - ACPI Table get* routines - * $Revision: 55 $ + * $Revision: 56 $ * *****************************************************************************/ @@ -617,7 +617,7 @@ * Get the RSDT from the RSDP */ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "RSDP located at %p, RSDT physical=%8.8lX%8.8lX \n", + "RSDP located at %p, RSDT physical=%8.8X%8.8X \n", acpi_gbl_RSDP, HIDWORD(acpi_gbl_RSDP->rsdt_physical_address), LODWORD(acpi_gbl_RSDP->rsdt_physical_address))); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbinstal.c linux/drivers/acpi/tables/tbinstal.c --- v2.4.13/linux/drivers/acpi/tables/tbinstal.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbinstal.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbinstal - ACPI table installation and removal - * $Revision: 42 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -142,7 +142,7 @@ status = acpi_gbl_acpi_table_data[i].status; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Found %4.4s\n", - acpi_gbl_acpi_table_data[i].signature)); + (char*)acpi_gbl_acpi_table_data[i].signature)); break; } } @@ -266,7 +266,7 @@ table_desc->base_pointer = table_info->base_pointer; table_desc->length = table_info->length; table_desc->allocation = table_info->allocation; - table_desc->aml_pointer = (u8 *) (table_desc->pointer + 1), + table_desc->aml_start = (u8 *) (table_desc->pointer + 1), table_desc->aml_length = (u32) (table_desc->length - (u32) sizeof (acpi_table_header)); table_desc->table_id = acpi_ut_allocate_owner_id (OWNER_TYPE_TABLE); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbutils.c linux/drivers/acpi/tables/tbutils.c --- v2.4.13/linux/drivers/acpi/tables/tbutils.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbutils.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbutils - Table manipulation utilities - * $Revision: 40 $ + * $Revision: 42 $ * *****************************************************************************/ @@ -196,10 +196,10 @@ MOVE_UNALIGNED32_TO_32 (&signature, &table_header->signature); if (!acpi_ut_valid_acpi_name (signature)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Table signature at %p [%X] has invalid characters\n", + "Table signature at %p [%p] has invalid characters\n", table_header, &signature)); - REPORT_WARNING (("Invalid table signature %4.4s found\n", &signature)); + REPORT_WARNING (("Invalid table signature %4.4s found\n", (char*)&signature)); DUMP_BUFFER (table_header, sizeof (acpi_table_header)); return (AE_BAD_SIGNATURE); } @@ -210,7 +210,7 @@ if (table_header->length < sizeof (acpi_table_header)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid length in table header %p name %4.4s\n", - table_header, &signature)); + table_header, (char*)&signature)); REPORT_WARNING (("Invalid table header length found\n")); DUMP_BUFFER (table_header, sizeof (acpi_table_header)); @@ -334,7 +334,7 @@ if (checksum) { REPORT_WARNING (("Invalid checksum (%X) in table %4.4s\n", - checksum, &table_header->signature)); + checksum, (char*)&table_header->signature)); status = AE_BAD_CHECKSUM; } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbxface.c linux/drivers/acpi/tables/tbxface.c --- v2.4.13/linux/drivers/acpi/tables/tbxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbxface.c Wed Oct 24 14:06:22 2001 @@ -2,7 +2,7 @@ * * Module Name: tbxface - Public interfaces to the ACPI subsystem * ACPI table oriented interfaces - * $Revision: 43 $ + * $Revision: 45 $ * *****************************************************************************/ @@ -59,14 +59,6 @@ FUNCTION_TRACE ("Acpi_load_tables"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - - /* Get the RSDP */ status = acpi_os_get_root_pointer (ACPI_LOGICAL_ADDRESSING, @@ -154,13 +146,6 @@ FUNCTION_TRACE ("Acpi_load_table"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - if (!table_ptr) { return_ACPI_STATUS (AE_BAD_PARAMETER); } @@ -213,19 +198,11 @@ acpi_table_type table_type) { acpi_table_desc *list_head; - acpi_status status; FUNCTION_TRACE ("Acpi_unload_table"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Parameter validation */ if (table_type > ACPI_TABLE_MAX) { @@ -289,13 +266,6 @@ FUNCTION_TRACE ("Acpi_get_table_header"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - if ((instance == 0) || (table_type == ACPI_TABLE_RSDP) || (!out_table_header)) { @@ -371,13 +341,6 @@ FUNCTION_TRACE ("Acpi_get_table"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* * If we have a buffer, we must have a length too diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/tables/tbxfroot.c linux/drivers/acpi/tables/tbxfroot.c --- v2.4.13/linux/drivers/acpi/tables/tbxfroot.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/tables/tbxfroot.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: tbxfroot - Find the root ACPI table (RSDT) - * $Revision: 49 $ + * $Revision: 52 $ * *****************************************************************************/ @@ -152,7 +152,7 @@ { u8 *table_ptr; u8 *mem_rover; - UINT64 phys_addr; + u64 phys_addr; acpi_status status = AE_OK; @@ -277,10 +277,10 @@ acpi_table_header **table_pointer) { ACPI_PHYSICAL_ADDRESS physical_address; - acpi_table_header *rsdt_ptr; + acpi_table_header *rsdt_ptr = NULL; acpi_table_header *table_ptr; acpi_status status; - u32 rsdt_size; + u32 rsdt_size = 0; u32 table_size; u32 table_count; u32 i; @@ -304,18 +304,49 @@ return_ACPI_STATUS (AE_BAD_PARAMETER); } - /* Get the RSDP */ + if (!acpi_gbl_RSDP) { + /* Get the RSDP */ - status = acpi_os_get_root_pointer (flags, &physical_address); - if (ACPI_FAILURE (status)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n")); - return_ACPI_STATUS (AE_NO_ACPI_TABLES); + status = acpi_os_get_root_pointer (flags, &physical_address); + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n")); + return_ACPI_STATUS (AE_NO_ACPI_TABLES); + } + + /* Map and validate the RSDP */ + + if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) { + status = acpi_os_map_memory (physical_address, sizeof (RSDP_DESCRIPTOR), + (void **) &acpi_gbl_RSDP); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + else { + acpi_gbl_RSDP = (void *) (NATIVE_UINT) physical_address; + } + + /* + * The signature and checksum must both be correct + */ + if (STRNCMP ((NATIVE_CHAR *) acpi_gbl_RSDP, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) { + /* Nope, BAD Signature */ + + status = AE_BAD_SIGNATURE; + goto cleanup; + } + + if (acpi_tb_checksum (acpi_gbl_RSDP, RSDP_CHECKSUM_LENGTH) != 0) { + /* Nope, BAD Checksum */ + + status = AE_BAD_CHECKSUM; + goto cleanup; + } } - acpi_gbl_RSDP = (RSDP_DESCRIPTOR *) (ACPI_TBLPTR) physical_address; ACPI_DEBUG_PRINT ((ACPI_DB_INFO, - "RSDP located at %p, RSDT physical=%8.8lX%8.8lX \n", + "RSDP located at %p, RSDT physical=%8.8X%8.8X \n", acpi_gbl_RSDP, HIDWORD(acpi_gbl_RSDP->rsdt_physical_address), LODWORD(acpi_gbl_RSDP->rsdt_physical_address))); @@ -377,7 +408,8 @@ /* Delete table mapping if using virtual addressing */ - if (table_size) { + if ((table_size) && + ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING)) { acpi_os_unmap_memory (table_ptr, table_size); } } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utalloc.c linux/drivers/acpi/utilities/utalloc.c --- v2.4.13/linux/drivers/acpi/utilities/utalloc.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utalloc.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utalloc - local cache and memory allocation routines - * $Revision: 100 $ + * $Revision: 106 $ * *****************************************************************************/ @@ -75,6 +75,7 @@ /* Mark the object as cached */ MEMSET (object, 0xCA, cache_info->object_size); + ((acpi_operand_object *) object)->common.data_type = ACPI_CACHED_OBJECT; /* Put the object at the head of the cache list */ @@ -200,14 +201,14 @@ * Each memory allocation is tracked via a doubly linked list. Each * element contains the caller's component, module name, function name, and * line number. Acpi_ut_allocate and Acpi_ut_callocate call - * Acpi_ut_add_element_to_alloc_list to add an element to the list; deletion + * Acpi_ut_track_allocation to add an element to the list; deletion * occurs in the body of Acpi_ut_free. */ /******************************************************************************* * - * FUNCTION: Acpi_ut_search_alloc_list + * FUNCTION: Acpi_ut_find_allocation * * PARAMETERS: Address - Address of allocated memory * @@ -217,12 +218,12 @@ * ******************************************************************************/ -ACPI_DEBUG_MEM_BLOCK * -acpi_ut_search_alloc_list ( +acpi_debug_mem_block * +acpi_ut_find_allocation ( u32 list_id, void *address) { - ACPI_DEBUG_MEM_BLOCK *element; + acpi_debug_mem_block *element; FUNCTION_ENTRY (); @@ -250,7 +251,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ut_add_element_to_alloc_list + * FUNCTION: Acpi_ut_track_allocation * * PARAMETERS: Address - Address of allocated memory * Size - Size of the allocation @@ -266,9 +267,9 @@ ******************************************************************************/ acpi_status -acpi_ut_add_element_to_alloc_list ( +acpi_ut_track_allocation ( u32 list_id, - ACPI_DEBUG_MEM_BLOCK *address, + acpi_debug_mem_block *address, u32 size, u8 alloc_type, u32 component, @@ -276,11 +277,11 @@ u32 line) { ACPI_MEMORY_LIST *mem_list; - ACPI_DEBUG_MEM_BLOCK *element; + acpi_debug_mem_block *element; acpi_status status = AE_OK; - FUNCTION_TRACE_PTR ("Ut_add_element_to_alloc_list", address); + FUNCTION_TRACE_PTR ("Ut_track_allocation", address); if (list_id > ACPI_MEM_LIST_MAX) { @@ -295,9 +296,9 @@ * This will catch several kinds of problems. */ - element = acpi_ut_search_alloc_list (list_id, address); + element = acpi_ut_find_allocation (list_id, address); if (element) { - REPORT_ERROR (("Ut_add_element_to_alloc_list: Address already present in list! (%p)\n", + REPORT_ERROR (("Ut_track_allocation: Address already present in list! (%p)\n", address)); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Element %p Address %p\n", element, address)); @@ -317,7 +318,7 @@ /* Insert at list head */ if (mem_list->list_head) { - ((ACPI_DEBUG_MEM_BLOCK *)(mem_list->list_head))->previous = address; + ((acpi_debug_mem_block *)(mem_list->list_head))->previous = address; } address->next = mem_list->list_head; @@ -334,7 +335,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ut_delete_element_from_alloc_list + * FUNCTION: Acpi_ut_remove_allocation * * PARAMETERS: Address - Address of allocated memory * Component - Component type of caller @@ -348,9 +349,9 @@ ******************************************************************************/ acpi_status -acpi_ut_delete_element_from_alloc_list ( +acpi_ut_remove_allocation ( u32 list_id, - ACPI_DEBUG_MEM_BLOCK *address, + acpi_debug_mem_block *address, u32 component, NATIVE_CHAR *module, u32 line) @@ -358,7 +359,7 @@ ACPI_MEMORY_LIST *mem_list; - FUNCTION_TRACE ("Ut_delete_element_from_alloc_list"); + FUNCTION_TRACE ("Ut_remove_allocation"); if (list_id > ACPI_MEM_LIST_MAX) { @@ -370,7 +371,7 @@ /* No allocations! */ _REPORT_ERROR (module, line, component, - ("Ut_delete_element_from_alloc_list: Empty allocation list, nothing to free!\n")); + ("Ut_remove_allocation: Empty allocation list, nothing to free!\n")); return_ACPI_STATUS (AE_OK); } @@ -429,34 +430,34 @@ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Current allocations", Mem_list->Current_count, - ROUND_UP_TO_1_k (Mem_list->Current_size))); + ROUND_UP_TO_1K (Mem_list->Current_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Max concurrent allocations", Mem_list->Max_concurrent_count, - ROUND_UP_TO_1_k (Mem_list->Max_concurrent_size))); + ROUND_UP_TO_1K (Mem_list->Max_concurrent_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Total (all) internal objects", Running_object_count, - ROUND_UP_TO_1_k (Running_object_size))); + ROUND_UP_TO_1K (Running_object_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Total (all) allocations", Running_alloc_count, - ROUND_UP_TO_1_k (Running_alloc_size))); + ROUND_UP_TO_1K (Running_alloc_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Current Nodes", Acpi_gbl_Current_node_count, - ROUND_UP_TO_1_k (Acpi_gbl_Current_node_size))); + ROUND_UP_TO_1K (Acpi_gbl_Current_node_size))); ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES, ("%30s: %4d (%3d Kb)\n", "Max Nodes", Acpi_gbl_Max_concurrent_node_count, - ROUND_UP_TO_1_k ((Acpi_gbl_Max_concurrent_node_count * sizeof (acpi_namespace_node))))); + ROUND_UP_TO_1K ((Acpi_gbl_Max_concurrent_node_count * sizeof (acpi_namespace_node))))); */ return_VOID; } @@ -464,7 +465,7 @@ /******************************************************************************* * - * FUNCTION: Acpi_ut_dump_current_allocations + * FUNCTION: Acpi_ut_dump_allocations * * PARAMETERS: Component - Component(s) to dump info for. * Module - Module to dump info for. NULL means all. @@ -476,20 +477,20 @@ ******************************************************************************/ void -acpi_ut_dump_current_allocations ( +acpi_ut_dump_allocations ( u32 component, NATIVE_CHAR *module) { - ACPI_DEBUG_MEM_BLOCK *element; + acpi_debug_mem_block *element; u32 i; - FUNCTION_TRACE ("Ut_dump_current_allocations"); + FUNCTION_TRACE ("Ut_dump_allocations"); element = acpi_gbl_memory_lists[0].list_head; if (element == NULL) { - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "No outstanding allocations.\n")); return_VOID; } @@ -500,46 +501,89 @@ */ acpi_ut_acquire_mutex (ACPI_MTX_MEMORY); - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Outstanding allocations:\n")); for (i = 1; ; i++) /* Just a counter */ { if ((element->component & component) && ((module == NULL) || (0 == STRCMP (module, element->module)))) { - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, - "%p Len %04lX %9.9s-%ld", - &element->user_space, element->size, element->module, - element->line)); - - /* Most of the elements will be internal objects. */ - - switch (((acpi_operand_object *) - (&element->user_space))->common.data_type) { - case ACPI_DESC_TYPE_INTERNAL: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " Obj_type %s", - acpi_ut_get_type_name (((acpi_operand_object *)(&element->user_space))->common.type))); - break; - - case ACPI_DESC_TYPE_PARSER: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " Parse_obj Opcode %04X", - ((acpi_parse_object *)(&element->user_space))->opcode)); - break; - - case ACPI_DESC_TYPE_NAMED: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " Node %4.4s", - &((acpi_namespace_node *)(&element->user_space))->name)); - break; - - case ACPI_DESC_TYPE_STATE: - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, - " State_obj")); - break; - } + if (((acpi_operand_object *)(&element->user_space))->common.type != ACPI_CACHED_OBJECT) { + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + "%p Len %04X %9.9s-%d", + &element->user_space, element->size, element->module, + element->line)); + + /* Most of the elements will be internal objects. */ + + switch (((acpi_operand_object *) + (&element->user_space))->common.data_type) { + case ACPI_DESC_TYPE_INTERNAL: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Obj_type %12.12s R%d", + acpi_ut_get_type_name (((acpi_operand_object *)(&element->user_space))->common.type), + ((acpi_operand_object *)(&element->user_space))->common.reference_count)); + break; + + case ACPI_DESC_TYPE_PARSER: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Parse_obj Opcode %04X", + ((acpi_parse_object *)(&element->user_space))->opcode)); + break; + + case ACPI_DESC_TYPE_NAMED: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Node %4.4s", + (char*)&((acpi_namespace_node *)(&element->user_space))->name)); + break; + + case ACPI_DESC_TYPE_STATE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " Untyped State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_UPDATE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " UPDATE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_PACKAGE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " PACKAGE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_CONTROL: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " CONTROL State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_RPSCOPE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " ROOT-PARSE-SCOPE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_PSCOPE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " PARSE-SCOPE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_WSCOPE: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " WALK-SCOPE State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_RESULT: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " RESULT State_obj")); + break; + + case ACPI_DESC_TYPE_STATE_NOTIFY: + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, + " NOTIFY State_obj")); + break; + } - ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ALLOCATIONS, "\n")); + ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OK, "\n")); + } } if (element->next == NULL) { @@ -551,7 +595,7 @@ acpi_ut_release_mutex (ACPI_MTX_MEMORY); - ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, + ACPI_DEBUG_PRINT ((ACPI_DB_OK, "Total number of unfreed allocations = %d(%X)\n", i,i)); @@ -582,7 +626,7 @@ NATIVE_CHAR *module, u32 line) { - ACPI_DEBUG_MEM_BLOCK *address; + acpi_debug_mem_block *address; acpi_status status; @@ -597,7 +641,7 @@ size = 1; } - address = acpi_os_allocate (size + sizeof (ACPI_DEBUG_MEM_BLOCK)); + address = acpi_os_allocate (size + sizeof (acpi_debug_mem_block)); if (!address) { /* Report allocation error */ @@ -607,7 +651,7 @@ return_PTR (NULL); } - status = acpi_ut_add_element_to_alloc_list (ACPI_MEM_LIST_GLOBAL, address, size, + status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, address, size, MEM_MALLOC, component, module, line); if (ACPI_FAILURE (status)) { acpi_os_free (address); @@ -645,7 +689,7 @@ NATIVE_CHAR *module, u32 line) { - ACPI_DEBUG_MEM_BLOCK *address; + acpi_debug_mem_block *address; acpi_status status; @@ -661,7 +705,7 @@ } - address = acpi_os_callocate (size + sizeof (ACPI_DEBUG_MEM_BLOCK)); + address = acpi_os_callocate (size + sizeof (acpi_debug_mem_block)); if (!address) { /* Report allocation error */ @@ -670,7 +714,7 @@ return_PTR (NULL); } - status = acpi_ut_add_element_to_alloc_list (ACPI_MEM_LIST_GLOBAL, address, size, + status = acpi_ut_track_allocation (ACPI_MEM_LIST_GLOBAL, address, size, MEM_CALLOC, component, module, line); if (ACPI_FAILURE (status)) { acpi_os_free (address); @@ -707,7 +751,7 @@ NATIVE_CHAR *module, u32 line) { - ACPI_DEBUG_MEM_BLOCK *debug_block; + acpi_debug_mem_block *debug_block; FUNCTION_TRACE_PTR ("Ut_free", address); @@ -720,13 +764,13 @@ return_VOID; } - debug_block = (ACPI_DEBUG_MEM_BLOCK *) - (((char *) address) - sizeof (ACPI_DEBUG_MEM_HEADER)); + debug_block = (acpi_debug_mem_block *) + (((char *) address) - sizeof (acpi_debug_mem_header)); acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].total_freed++; acpi_gbl_memory_lists[ACPI_MEM_LIST_GLOBAL].current_total_size -= debug_block->size; - acpi_ut_delete_element_from_alloc_list (ACPI_MEM_LIST_GLOBAL, debug_block, + acpi_ut_remove_allocation (ACPI_MEM_LIST_GLOBAL, debug_block, component, module, line); acpi_os_free (debug_block); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utcopy.c linux/drivers/acpi/utilities/utcopy.c --- v2.4.13/linux/drivers/acpi/utilities/utcopy.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utcopy.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utcopy - Internal to external object translation utilities - * $Revision: 82 $ + * $Revision: 83 $ * *****************************************************************************/ @@ -135,7 +135,7 @@ case AML_REVISION_OP: external_object->type = ACPI_TYPE_INTEGER; - external_object->integer.value = ACPI_CA_VERSION; + external_object->integer.value = ACPI_CA_SUPPORT_LEVEL; break; case AML_INT_NAMEPATH_OP: diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utdebug.c linux/drivers/acpi/utilities/utdebug.c --- v2.4.13/linux/drivers/acpi/utilities/utdebug.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utdebug.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utdebug - Debug print routines - * $Revision: 87 $ + * $Revision: 90 $ * *****************************************************************************/ @@ -87,10 +87,6 @@ if (acpi_gbl_nesting_level > acpi_gbl_deepest_nesting) { acpi_gbl_deepest_nesting = acpi_gbl_nesting_level; - - if (acpi_gbl_deepest_nesting == 34) { - acpi_os_printf ("hit deepest nesting\n"); - } } } @@ -119,7 +115,7 @@ acpi_ut_debug_print ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, ...) { @@ -192,7 +188,7 @@ acpi_ut_debug_print_raw ( u32 requested_debug_level, u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, char *format, ...) { @@ -230,7 +226,7 @@ void acpi_ut_trace ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info) + acpi_debug_print_info *dbg_info) { acpi_gbl_nesting_level++; @@ -262,7 +258,7 @@ void acpi_ut_trace_ptr ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, void *pointer) { acpi_gbl_nesting_level++; @@ -294,7 +290,7 @@ void acpi_ut_trace_str ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, NATIVE_CHAR *string) { @@ -327,7 +323,7 @@ void acpi_ut_trace_u32 ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u32 integer) { @@ -359,7 +355,7 @@ void acpi_ut_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info) + acpi_debug_print_info *dbg_info) { acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info, @@ -390,7 +386,7 @@ void acpi_ut_status_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_status status) { @@ -430,12 +426,12 @@ void acpi_ut_value_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, acpi_integer value) { acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info, - "%s %08X\n", acpi_gbl_fn_exit_str, value); + "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str, HIDWORD(value), LODWORD(value)); acpi_gbl_nesting_level--; } @@ -462,7 +458,7 @@ void acpi_ut_ptr_exit ( u32 line_number, - ACPI_DEBUG_PRINT_INFO *dbg_info, + acpi_debug_print_info *dbg_info, u8 *ptr) { diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utdelete.c linux/drivers/acpi/utilities/utdelete.c --- v2.4.13/linux/drivers/acpi/utilities/utdelete.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utdelete.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utdelete - object deletion and reference count utilities - * $Revision: 76 $ + * $Revision: 81 $ * ******************************************************************************/ @@ -183,14 +183,10 @@ * Delete any allocated memory found above */ if (obj_pointer) { - if (!acpi_tb_system_table_pointer (obj_pointer)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting Obj Ptr %p \n", obj_pointer)); - - ACPI_MEM_FREE (obj_pointer); - } + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Deleting Obj Ptr %p \n", obj_pointer)); + ACPI_MEM_FREE (obj_pointer); } - /* Only delete the object if it was dynamically allocated */ if (object->common.flags & AOPOBJ_STATIC_ALLOCATION) { @@ -346,8 +342,8 @@ */ if (count > MAX_REFERENCE_COUNT) { - ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "**** AE_ERROR **** Invalid Reference Count (%X) in object %p\n\n", + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, + "**** Warning **** Large Reference Count (%X) in object %p\n\n", count, object)); } @@ -408,11 +404,6 @@ return_ACPI_STATUS (AE_OK); } - if (acpi_tb_system_table_pointer (object)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Object %p is Pcode Ptr\n", object)); - return_ACPI_STATUS (AE_OK); - } - state = acpi_ut_create_update_state (object, action); @@ -529,24 +520,9 @@ case ACPI_TYPE_REGION: - - /* TBD: [Investigate] - Acpi_ut_update_ref_count (Object->Region.Addr_handler, Action); - */ -/* - Status = - Acpi_ut_create_update_state_and_push (Object->Region.Addr_handler, - Action, &State_list); - if (ACPI_FAILURE (Status)) - { - return_ACPI_STATUS (Status); - } -*/ - break; - - case INTERNAL_TYPE_REFERENCE: + /* No subobjects */ break; } @@ -625,6 +601,15 @@ FUNCTION_TRACE_PTR ("Ut_remove_reference", object); + /* + * Allow a NULL pointer to be passed in, just ignore it. This saves + * each caller from having to check. Also, ignore NS nodes. + * + */ + if (!object || + (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED))) { + return_VOID; + } /* * Ensure that we have a valid object diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/uteval.c linux/drivers/acpi/utilities/uteval.c --- v2.4.13/linux/drivers/acpi/utilities/uteval.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/uteval.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: uteval - Object evaluation - * $Revision: 30 $ + * $Revision: 31 $ * *****************************************************************************/ @@ -69,11 +69,11 @@ if (ACPI_FAILURE (status)) { if (status == AE_NOT_FOUND) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s on %4.4s was not found\n", - object_name, &device_node->name)); + object_name, (char*)&device_node->name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%s on %4.4s failed with status %s\n", - object_name, &device_node->name, + object_name, (char*)&device_node->name, acpi_format_exception (status))); } @@ -132,7 +132,7 @@ acpi_status acpi_ut_execute_HID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *hid) + acpi_device_id *hid) { acpi_operand_object *obj_desc; acpi_status status; @@ -148,12 +148,12 @@ if (ACPI_FAILURE (status)) { if (status == AE_NOT_FOUND) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_HID on %4.4s was not found\n", - &device_node->name)); + (char*)&device_node->name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_HID on %4.4s failed %s\n", - &device_node->name, acpi_format_exception (status))); + (char*)&device_node->name, acpi_format_exception (status))); } return_ACPI_STATUS (status); @@ -220,7 +220,7 @@ acpi_status acpi_ut_execute_UID ( acpi_namespace_node *device_node, - ACPI_DEVICE_ID *uid) + acpi_device_id *uid) { acpi_operand_object *obj_desc; acpi_status status; @@ -236,13 +236,13 @@ if (ACPI_FAILURE (status)) { if (status == AE_NOT_FOUND) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_UID on %4.4s was not found\n", - &device_node->name)); + (char*)&device_node->name)); } else { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_UID on %4.4s failed %s\n", - &device_node->name, acpi_format_exception (status))); + (char*)&device_node->name, acpi_format_exception (status))); } return (status); @@ -325,7 +325,7 @@ if (AE_NOT_FOUND == status) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "_STA on %4.4s was not found, assuming present.\n", - &device_node->name)); + (char*)&device_node->name)); *flags = 0x0F; status = AE_OK; @@ -333,7 +333,7 @@ else if (ACPI_FAILURE (status)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "_STA on %4.4s failed %s\n", - &device_node->name, + (char*)&device_node->name, acpi_format_exception (status))); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utglobal.c linux/drivers/acpi/utilities/utglobal.c --- v2.4.13/linux/drivers/acpi/utilities/utglobal.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utglobal.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utglobal - Global variables for the ACPI subsystem - * $Revision: 131 $ + * $Revision: 133 $ * *****************************************************************************/ @@ -147,7 +147,7 @@ const NATIVE_CHAR *acpi_gbl_db_sleep_states[ACPI_NUM_SLEEP_STATES] = { "\\_S0_","\\_S1_","\\_S2_","\\_S3_", - "\\_S4_","\\_S5_","\\_S4_b"}; + "\\_S4_","\\_S5_","\\_S4B"}; /****************************************************************************** @@ -331,7 +331,7 @@ */ static const NATIVE_CHAR acpi_gbl_bad_type[] = "UNDEFINED"; -#define TYPE_NAME_LENGTH 9 /* Maximum length of each string */ +#define TYPE_NAME_LENGTH 12 /* Maximum length of each string */ static const NATIVE_CHAR *acpi_gbl_ns_type_names[] = /* printable names of ACPI types */ { @@ -349,21 +349,21 @@ /* 11 */ "Power", /* 12 */ "Processor", /* 13 */ "Thermal", - /* 14 */ "Buff_field", + /* 14 */ "Buffer_field", /* 15 */ "Ddb_handle", - /* 16 */ "Debug_obj", - /* 17 */ "Regn_field", + /* 16 */ "Debug_object", + /* 17 */ "Region_field", /* 18 */ "Bank_field", - /* 19 */ "Indx_field", + /* 19 */ "Index_field", /* 20 */ "Reference", /* 21 */ "Alias", /* 22 */ "Notify", - /* 23 */ "Addr_hndlr", - /* 24 */ "Rsrc_desc", - /* 25 */ "Rsrc_field", - /* 26 */ "Rgn_fld_dfn", - /* 27 */ "Bnk_fld_dfn", - /* 28 */ "Idx_fld_dfn", + /* 23 */ "Addr_handler", + /* 24 */ "Resource_desc", + /* 25 */ "Resource_fld", + /* 26 */ "Region_fld_dfn", + /* 27 */ "Bank_fld_dfn", + /* 28 */ "Index_fld_dfn", /* 29 */ "If", /* 30 */ "Else", /* 31 */ "While", diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utinit.c linux/drivers/acpi/utilities/utinit.c --- v2.4.13/linux/drivers/acpi/utilities/utinit.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utinit.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utinit - Common ACPI subsystem initialization - * $Revision: 101 $ + * $Revision: 102 $ * *****************************************************************************/ @@ -245,7 +245,7 @@ /* Debug only - display leftover memory allocation, if any */ #ifdef ACPI_DBG_TRACK_ALLOCATIONS - acpi_ut_dump_current_allocations (ACPI_UINT32_MAX, NULL); + acpi_ut_dump_allocations (ACPI_UINT32_MAX, NULL); #endif return_ACPI_STATUS (AE_OK); diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utmath.c linux/drivers/acpi/utilities/utmath.c --- v2.4.13/linux/drivers/acpi/utilities/utmath.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/acpi/utilities/utmath.c Wed Oct 24 14:06:22 2001 @@ -0,0 +1,314 @@ +/******************************************************************************* + * + * Module Name: utmath - Integer math support routines + * $Revision: 7 $ + * + ******************************************************************************/ + +/* + * Copyright (C) 2000, 2001 R. Byron Moore + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "acpi.h" + + +#define _COMPONENT ACPI_UTILITIES + MODULE_NAME ("utmath") + +/* + * Support for double-precision integer divide. This code is included here + * in order to support kernel environments where the double-precision math + * library is not available. + */ + +#ifndef ACPI_USE_NATIVE_DIVIDE +/******************************************************************************* + * + * FUNCTION: Acpi_ut_short_divide + * + * PARAMETERS: In_dividend - Pointer to the dividend + * Divisor - 32-bit divisor + * Out_quotient - Pointer to where the quotient is returned + * Out_remainder - Pointer to where the remainder is returned + * + * RETURN: Status (Checks for divide-by-zero) + * + * DESCRIPTION: Perform a short (maximum 64 bits divided by 32 bits) + * divide and modulo. The result is a 64-bit quotient and a + * 32-bit remainder. + * + ******************************************************************************/ + +acpi_status +acpi_ut_short_divide ( + acpi_integer *in_dividend, + u32 divisor, + acpi_integer *out_quotient, + u32 *out_remainder) +{ + uint64_overlay dividend; + uint64_overlay quotient; + u32 remainder32; + + + FUNCTION_TRACE ("Ut_short_divide"); + + dividend.full = *in_dividend; + + /* Always check for a zero divisor */ + + if (divisor == 0) { + REPORT_ERROR (("Acpi_ut_short_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + /* + * The quotient is 64 bits, the remainder is always 32 bits, + * and is generated by the second divide. + */ + ACPI_DIV_64_BY_32 (0, dividend.part.hi, divisor, + quotient.part.hi, remainder32); + ACPI_DIV_64_BY_32 (remainder32, dividend.part.lo, divisor, + quotient.part.lo, remainder32); + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = quotient.full; + } + if (out_remainder) { + *out_remainder = remainder32; + } + + return_ACPI_STATUS (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: Acpi_ut_divide + * + * PARAMETERS: In_dividend - Pointer to the dividend + * In_divisor - Pointer to the divisor + * Out_quotient - Pointer to where the quotient is returned + * Out_remainder - Pointer to where the remainder is returned + * + * RETURN: Status (Checks for divide-by-zero) + * + * DESCRIPTION: Perform a divide and modulo. + * + ******************************************************************************/ + +acpi_status +acpi_ut_divide ( + acpi_integer *in_dividend, + acpi_integer *in_divisor, + acpi_integer *out_quotient, + acpi_integer *out_remainder) +{ + uint64_overlay dividend; + uint64_overlay divisor; + uint64_overlay quotient; + uint64_overlay remainder; + uint64_overlay normalized_dividend; + uint64_overlay normalized_divisor; + u32 partial1; + uint64_overlay partial2; + uint64_overlay partial3; + + + FUNCTION_TRACE ("Ut_divide"); + + + /* Always check for a zero divisor */ + + if (*in_divisor == 0) { + REPORT_ERROR (("Acpi_ut_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + divisor.full = *in_divisor; + dividend.full = *in_dividend; + if (divisor.part.hi == 0) { + /* + * 1) Simplest case is where the divisor is 32 bits, we can + * just do two divides + */ + remainder.part.hi = 0; + + /* + * The quotient is 64 bits, the remainder is always 32 bits, + * and is generated by the second divide. + */ + ACPI_DIV_64_BY_32 (0, dividend.part.hi, divisor.part.lo, + quotient.part.hi, partial1); + ACPI_DIV_64_BY_32 (partial1, dividend.part.lo, divisor.part.lo, + quotient.part.lo, remainder.part.lo); + } + + else { + /* + * 2) The general case where the divisor is a full 64 bits + * is more difficult + */ + quotient.part.hi = 0; + normalized_dividend = dividend; + normalized_divisor = divisor; + + /* Normalize the operands (shift until the divisor is < 32 bits) */ + + do { + ACPI_SHIFT_RIGHT_64 (normalized_divisor.part.hi, + normalized_divisor.part.lo); + ACPI_SHIFT_RIGHT_64 (normalized_dividend.part.hi, + normalized_dividend.part.lo); + + } while (normalized_divisor.part.hi != 0); + + /* Partial divide */ + + ACPI_DIV_64_BY_32 (normalized_dividend.part.hi, + normalized_dividend.part.lo, + normalized_divisor.part.lo, + quotient.part.lo, partial1); + + /* + * The quotient is always 32 bits, and simply requires adjustment. + * The 64-bit remainder must be generated. + */ + partial1 = quotient.part.lo * divisor.part.hi; + partial2.full = (acpi_integer) quotient.part.lo * divisor.part.lo; + partial3.full = partial2.part.hi + partial1; + + remainder.part.hi = partial3.part.lo; + remainder.part.lo = partial2.part.lo; + + if (partial3.part.hi == 0) { + if (partial3.part.lo >= dividend.part.hi) { + if (partial3.part.lo == dividend.part.hi) { + if (partial2.part.lo > dividend.part.lo) { + quotient.part.lo--; + remainder.full -= divisor.full; + } + } + else { + quotient.part.lo--; + remainder.full -= divisor.full; + } + } + + remainder.full = remainder.full - dividend.full; + remainder.part.hi = -((s32) remainder.part.hi); + remainder.part.lo = -((s32) remainder.part.lo); + + if (remainder.part.lo) { + remainder.part.hi--; + } + } + } + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = quotient.full; + } + if (out_remainder) { + *out_remainder = remainder.full; + } + + return_ACPI_STATUS (AE_OK); +} + +#else + +/******************************************************************************* + * + * FUNCTION: Acpi_ut_short_divide, Acpi_ut_divide + * + * DESCRIPTION: Native versions of the Ut_divide functions. Use these if either + * 1) The target is a 64-bit platform and therefore 64-bit + * integer math is supported directly by the machine. + * 2) The target is a 32-bit or 16-bit platform, and the + * double-precision integer math library is available to + * perform the divide. + * + ******************************************************************************/ + +acpi_status +acpi_ut_short_divide ( + acpi_integer *in_dividend, + u32 divisor, + acpi_integer *out_quotient, + u32 *out_remainder) +{ + + FUNCTION_TRACE ("Ut_short_divide"); + + + /* Always check for a zero divisor */ + + if (divisor == 0) { + REPORT_ERROR (("Acpi_ut_short_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = *in_dividend / divisor; + } + if (out_remainder) { + *out_remainder = (u32) *in_dividend % divisor; + } + + return_ACPI_STATUS (AE_OK); +} + +acpi_status +acpi_ut_divide ( + acpi_integer *in_dividend, + acpi_integer *in_divisor, + acpi_integer *out_quotient, + acpi_integer *out_remainder) +{ + FUNCTION_TRACE ("Ut_divide"); + + + /* Always check for a zero divisor */ + + if (*in_divisor == 0) { + REPORT_ERROR (("Acpi_ut_divide: Divide by zero\n")); + return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO); + } + + + /* Return only what was requested */ + + if (out_quotient) { + *out_quotient = *in_dividend / *in_divisor; + } + if (out_remainder) { + *out_remainder = *in_dividend % *in_divisor; + } + + return_ACPI_STATUS (AE_OK); +} + +#endif + + diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utmisc.c linux/drivers/acpi/utilities/utmisc.c --- v2.4.13/linux/drivers/acpi/utilities/utmisc.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utmisc.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /******************************************************************************* * * Module Name: utmisc - common utility procedures - * $Revision: 50 $ + * $Revision: 52 $ * ******************************************************************************/ @@ -662,6 +662,7 @@ /* Init fields specific to the update struct */ + state->common.data_type = ACPI_DESC_TYPE_STATE_UPDATE; state->update.object = object; state->update.value = action; @@ -679,9 +680,7 @@ * * RETURN: Status * - * DESCRIPTION: Create an "Update State" - a flavor of the generic state used - * to update reference counts and delete complex objects such - * as packages. + * DESCRIPTION: Create a "Package State" * ******************************************************************************/ @@ -706,6 +705,7 @@ /* Init fields specific to the update struct */ + state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE; state->pkg.source_object = (acpi_operand_object *) internal_object; state->pkg.dest_object = external_object; state->pkg.index = index; @@ -748,7 +748,8 @@ /* Init fields specific to the control struct */ - state->common.state = CONTROL_CONDITIONAL_EXECUTING; + state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL; + state->common.state = CONTROL_CONDITIONAL_EXECUTING; return_PTR (state); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utobject.c linux/drivers/acpi/utilities/utobject.c --- v2.4.13/linux/drivers/acpi/utilities/utobject.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utobject.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utobject - ACPI object create/delete/size/cache routines - * $Revision: 55 $ + * $Revision: 57 $ * *****************************************************************************/ @@ -116,13 +116,6 @@ if (!object) { ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n")); - return (FALSE); - } - - /* Check for a pointer within one of the ACPI tables */ - - if (acpi_tb_system_table_pointer (object)) { - ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Object %p is a Pcode Ptr\n", object)); return (FALSE); } diff -u --recursive --new-file v2.4.13/linux/drivers/acpi/utilities/utxface.c linux/drivers/acpi/utilities/utxface.c --- v2.4.13/linux/drivers/acpi/utilities/utxface.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/acpi/utilities/utxface.c Wed Oct 24 14:06:22 2001 @@ -1,7 +1,7 @@ /****************************************************************************** * * Module Name: utxface - External interfaces for "global" ACPI functions - * $Revision: 80 $ + * $Revision: 82 $ * *****************************************************************************/ @@ -240,19 +240,9 @@ acpi_status acpi_terminate (void) { - acpi_status status; - - FUNCTION_TRACE ("Acpi_terminate"); - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } - /* Terminate the AML Debugger if present */ DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE); @@ -271,10 +261,18 @@ acpi_ut_mutex_terminate (); +#ifdef ENABLE_DEBUGGER + + /* Shut down the debugger */ + + acpi_db_terminate (); +#endif + /* Now we can shutdown the OS-dependent layer */ acpi_os_terminate (); + return_ACPI_STATUS (AE_OK); } @@ -330,18 +328,10 @@ { acpi_system_info *info_ptr; u32 i; - acpi_status status; FUNCTION_TRACE ("Acpi_get_system_info"); - - /* Ensure that ACPI has been initialized */ - - ACPI_IS_INITIALIZATION_COMPLETE (status); - if (ACPI_FAILURE (status)) { - return_ACPI_STATUS (status); - } /* * Must have a valid buffer diff -u --recursive --new-file v2.4.13/linux/drivers/atm/Config.in linux/drivers/atm/Config.in --- v2.4.13/linux/drivers/atm/Config.in Fri Feb 16 16:02:35 2001 +++ linux/drivers/atm/Config.in Thu Oct 25 13:53:46 2001 @@ -7,6 +7,7 @@ tristate 'ATM over TCP' CONFIG_ATM_TCP fi if [ "$CONFIG_PCI" = "y" ]; then + tristate 'Efficient Networks Speedstream 3010' CONFIG_ATM_LANAI tristate 'Efficient Networks ENI155P' CONFIG_ATM_ENI if [ "$CONFIG_ATM_ENI" != "n" ]; then bool ' Enable extended debugging' CONFIG_ATM_ENI_DEBUG diff -u --recursive --new-file v2.4.13/linux/drivers/atm/Makefile linux/drivers/atm/Makefile --- v2.4.13/linux/drivers/atm/Makefile Sun Sep 23 11:40:57 2001 +++ linux/drivers/atm/Makefile Thu Oct 25 13:53:46 2001 @@ -26,6 +26,7 @@ obj-$(CONFIG_ATM_TCP) += atmtcp.o obj-$(CONFIG_ATM_IA) += iphase.o suni.o obj-$(CONFIG_ATM_FIRESTREAM) += firestream.o +obj-$(CONFIG_ATM_LANAI) += lanai.o ifeq ($(CONFIG_ATM_FORE200E_PCA),y) FORE200E_FW_OBJS += fore200e_pca_fw.o diff -u --recursive --new-file v2.4.13/linux/drivers/atm/atmdev_init.c linux/drivers/atm/atmdev_init.c --- v2.4.13/linux/drivers/atm/atmdev_init.c Fri Dec 29 14:35:47 2000 +++ linux/drivers/atm/atmdev_init.c Thu Oct 25 13:53:46 2001 @@ -25,6 +25,9 @@ #ifdef CONFIG_ATM_FORE200E extern int fore200e_detect(void); #endif +#ifdef CONFIG_ATM_LANAI +extern int lanai_detect(void); +#endif /* @@ -55,6 +58,9 @@ #endif #ifdef CONFIG_ATM_FORE200E devs += fore200e_detect(); +#endif +#ifdef CONFIG_ATM_LANAI + devs += lanai_detect(); #endif return devs; } diff -u --recursive --new-file v2.4.13/linux/drivers/atm/lanai.c linux/drivers/atm/lanai.c --- v2.4.13/linux/drivers/atm/lanai.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/atm/lanai.c Thu Oct 25 13:53:46 2001 @@ -0,0 +1,2917 @@ +/* lanai.c -- Copyright 1999 by Mitchell Blank Jr + * + * 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 driver supports ATM cards based on the Efficient "Lanai" + * chipset such as the Speedstream 3010 and the ENI-25p. The + * Speedstream 3060 is currently not supported since we don't + * have the code to drive the on-board Alcatel DSL chipset (yet). + * + * Thanks to Efficient for supporting this project with hardware, + * documentation, and by answering my questions. + * + * Things not working yet: + * + * o We're only set up to compile as a module currently. i.e. + * you should put the source in drivers/atm/lanai.c and then + * just do "make drivers/atm/lanai.o" from the main + * source directory. This will produce a drivers/atm/lanai.o + * file suitable for insmod'ing + * + * o We don't support the Speedstream 3060 yet - this card has + * an on-board DSL modem chip by Alcatel and the driver will + * need some extra code added to handle it + * + * o Note that due to limitations of the Lanai only one VCC can be + * in CBR at once + * + * o We don't currently parse the EEPROM at all. The code is all + * there as per the spec, but it doesn't actually work. I think + * there may be some issues with the docs. Anyway, do NOT + * enable it yet - bugs in that code may actually damage your + * hardware! Because of this you should hardware an ESI before + * trying to use this in a LANE or MPOA environment. + * + * o AAL0 is stubbed in but the actual rx/tx path isn't written yet: + * vcc_tx_aal0() needs to send or queue a SKB + * vcc_tx_unqueue_aal0() needs to attempt to send queued SKBs + * vcc_rx_aal0() needs to handle AAL0 interrupts + * This isn't too much work - I just wanted to get other things + * done first. + * + * o lanai_change_qos() isn't written yet + * + * o There aren't any ioctl's yet -- I'd like to eventually support + * setting loopback and LED modes that way. (see lanai_ioctl) + * + * o If the segmentation engine or DMA gets shut down we should restart + * card as per section 17.0i. (see lanai_reset) + * + * o setsockopt(SO_CIRANGE) isn't done (although despite what the + * API says it isn't exactly commonly implemented) + */ + +/* Version history: + * v.0.02 -- 11-JAN-2000 -- Endian fixes + * v.0.01 -- 30-NOV-1999 -- Initial release + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef PCI_VENDOR_ID_EF_ATM_LANAI2 +/* These need to eventually go into - they're here for now */ +#define PCI_VENDOR_ID_EF_ATM_LANAI2 0x0003 +#define PCI_VENDOR_ID_EF_ATM_LANAIHB 0x0005 +#endif + +/* -------------------- TUNABLE PARAMATERS: */ + +/* + * Maximum number of VCIs per card. Setting it lower could theoretically + * save some memory, but since we allocate our vcc list with get_free_pages, + * it's not really likely for most architectures + */ +#define NUM_VCI (1024) + +/* + * Enable extra debugging + */ +#define DEBUG +/* + * Debug _all_ register operations with card, except the memory test. + * Also disables the timed poll to prevent extra chattiness. This + * isn't for normal use + */ +#undef DEBUG_RW + +/* + * The programming guide specifies a full test of the on-board SRAM + * at initialization time. Undefine to remove this + */ +#define FULL_MEMORY_TEST + +/* + * This is the number of (4 byte) service entries that we will + * try to allocate at startup. Note that we will end up with + * one PAGE_SIZE's worth regardless of what this is set to + */ +#define SERVICE_ENTRIES (1024) +/* TODO: make above a module load-time option */ + +/* + * We normally read the onboard EEPROM in order to discover our MAC + * address. Undefine to _not_ do this + */ +/* #define READ_EEPROM */ /* ***DONT ENABLE YET*** */ +/* TODO: make above a module load-time option (also) */ + +/* + * Depth of TX fifo (in 128 byte units; range 2-31) + * Smaller numbers are better for network latency + * Larger numbers are better for PCI latency + * I'm really sure where the best tradeoff is, but the BSD driver uses + * 7 and it seems to work ok. + */ +#define TX_FIFO_DEPTH (7) +/* TODO: make above a module load-time option */ + +/* + * How often (in jiffies) we will try to unstick stuck connections - + * shouldn't need to happen much + */ +#define LANAI_POLL_PERIOD (10*HZ) +/* TODO: make above a module load-time option */ + +/* + * When allocating an AAL5 receiving buffer, try to make it at least + * large enough to hold this many max_sdu sized PDUs + */ +#define AAL5_RX_MULTIPLIER (3) +/* TODO: make above a module load-time option */ + +/* + * Same for transmitting buffer + */ +#define AAL5_TX_MULTIPLIER (3) +/* TODO: make above a module load-time option */ + +/* + * When allocating an AAL0 transmiting buffer, how many cells should fit. + * Remember we'll end up with a PAGE_SIZE of them anyway, so this isn't + * really critical + */ +#define AAL0_TX_MULTIPLIER (40) +/* TODO: make above a module load-time option */ + +/* + * How large should we make the AAL0 receiving buffer. Remember that this + * is shared between all AAL0 VC's + */ +#define AAL0_RX_BUFFER_SIZE (PAGE_SIZE) +/* TODO: make above a module load-time option */ + +/* + * Should we use Lanai's "powerdown" feature when no vcc's are bound? + */ +/* #define USE_POWERDOWN */ +/* TODO: make above a module load-time option (also) */ + +/* -------------------- DEBUGGING AIDS: */ + +#define DEV_LABEL "lanai" + +#ifdef DEBUG + +#define DPRINTK(format, args...) \ + printk(KERN_DEBUG DEV_LABEL ": " format, ##args) +#define APRINTK(truth, format, args...) \ + do { \ + if (!(truth)) \ + printk(KERN_ERR DEV_LABEL ": " format, ##args); \ + } while (0) + +#else /* !DEBUG */ + +#define DPRINTK(format, args...) +#define APRINTK(truth, format, args...) + +#endif /* DEBUG */ + +#ifdef DEBUG_RW +#define RWDEBUG(format, args...) \ + printk(KERN_DEBUG DEV_LABEL ": " format, ##args) +#else /* !DEBUG_RW */ +#define RWDEBUG(format, args...) +#endif + +/* -------------------- DATA DEFINITIONS: */ + +#define LANAI_MAPPING_SIZE (0x40000) +#define LANAI_EEPROM_SIZE (128) + +typedef int vci_t; +typedef unsigned long bus_addr_t; + +/* A bitfield large enough for NUM_VCI */ +#define VCI_BITFIELD_NELEM ((NUM_VCI + BITS_PER_LONG - 1) / BITS_PER_LONG) +typedef struct { + unsigned long ul[VCI_BITFIELD_NELEM]; +} vci_bitfield; + +/* DMA buffer in host memory for TX, RX, or service list. */ +struct lanai_buffer { + u32 *start; /* From get_free_pages */ + u32 *end; /* One past last byte */ + u32 *ptr; /* Pointer to current host location */ + int order; /* log2(size/PAGE_SIZE) */ +}; + +struct lanai_vcc_stats { + unsigned rx_nomem; + union { + struct { + unsigned rx_badlen; + unsigned service_trash; + unsigned service_stream; + unsigned service_rxcrc; + } aal5; + struct { + } aal0; + } x; +}; + +struct lanai_dev; /* Forward declaration */ + +/* + * This is the card-specific per-vcc data. Note that unlike some other + * drivers there is NOT a 1-to-1 correspondance between these and + * atm_vcc's - each one of these represents an actual 2-way vcc, but + * an atm_vcc can be 1-way and share with a 1-way vcc in the other + * direction. To make it weirder, there can even be 0-way vccs + * bound to us, waiting to do a change_qos + */ +struct lanai_vcc { + bus_addr_t vbase; /* Base of VCC's registers */ + struct lanai_vcc_stats stats; + int nref; /* # of atm_vcc's who reference us */ + vci_t vci; + struct { + struct lanai_buffer buf; + struct atm_vcc *atmvcc; /* atm_vcc who is receiver */ + } rx; + struct { + struct lanai_buffer buf; + struct atm_vcc *atmvcc; /* atm_vcc who is transmitter */ + int endptr; /* last endptr from service entry */ + struct sk_buff_head backlog; + struct sk_buff *inprogress; /* We're streaming this PDU */ + unsigned char *pptr; /* Where we are in above */ + int inprogleft; /* Bytes left to send "inprogress" */ + void (*unqueue)(struct lanai_dev *, struct lanai_vcc *, int); + } tx; +}; + +enum lanai_type { + lanai2 = PCI_VENDOR_ID_EF_ATM_LANAI2, + lanaihb = PCI_VENDOR_ID_EF_ATM_LANAIHB +}; + +struct lanai_dev_stats { + unsigned ovfl_trash; /* # of cells dropped - buffer overflow */ + unsigned vci_trash; /* # of cells dropped - closed vci */ + unsigned hec_err; /* # of cells dropped - bad HEC */ + unsigned atm_ovfl; /* # of cells dropped - rx fifo overflow */ + unsigned pcierr_parity_detect; + unsigned pcierr_serr_set; + unsigned pcierr_master_abort; + unsigned pcierr_m_target_abort; + unsigned pcierr_s_target_abort; + unsigned pcierr_master_parity; + unsigned service_novcc_rx; + unsigned service_novcc_tx; + unsigned service_notx; + unsigned service_norx; + unsigned service_rxnotaal5; + unsigned dma_reenable; + unsigned card_reset; +}; + +struct lanai_dev { + bus_addr_t base; + struct lanai_dev_stats stats; + struct lanai_buffer service; + struct lanai_vcc **vccs; +#ifdef USE_POWERDOWN + int nbound; /* number of bound vccs */ +#endif + enum lanai_type type; + vci_t num_vci; /* Currently just NUM_VCI */ + u8 eeprom[LANAI_EEPROM_SIZE]; + u32 serialno, magicno; + struct pci_dev *pci; + vci_bitfield backlog_vccs; /* VCCs that are backlogged */ + vci_bitfield transmit_ready; /* VCCs that have transmit space */ + struct timer_list timer; + int naal0; + struct lanai_buffer aal0buf; /* AAL0 RX buffers */ + u32 conf1, conf2; /* CONFIG[12] registers */ + u32 status; /* STATUS register */ + spinlock_t txlock; + spinlock_t servicelock; + struct atm_vcc *cbrvcc; + int number; + int board_rev; + u8 pci_revision; +/* TODO - look at race conditions with maintence of conf1/conf2 */ +/* TODO - transmit locking: should we use _irq not _irqsave? */ +/* TODO - organize above in some rational fashion (see ) */ +}; + +/* -------------------- VCI_BITFIELD UTILITIES: */ + +/* + * These functions assume that BITS_PER_LONG is a power of two, which + * should be safe + */ +#if (BITS_PER_LONG & (BITS_PER_LONG - 1)) +#error lanai driver requires type long to have a power of two number of bits +#endif + +/* + * In vci_bitfield_{set,clear} we do the operation in three + * parts to ensure that gcc doesn't cast anything down to + * 32 bits (and then sign extend them later) on 64-bit + * platforms like the alpha + */ +static inline void vci_bitfield_set(vci_bitfield *bf, vci_t vci) +{ + unsigned long bit = 1; + bit <<= (unsigned long) (vci & (BITS_PER_LONG - 1)); + bf->ul[vci / BITS_PER_LONG] |= bit; +} + +static inline void vci_bitfield_clear(vci_bitfield *bf, vci_t vci) +{ + unsigned long bit = 1; + bit <<= (unsigned long) (vci & (BITS_PER_LONG - 1)); + bf->ul[vci / BITS_PER_LONG] &= ~bit; +} + +static inline void vci_bitfield_init(vci_bitfield *bf) +{ + memset(bf, 0, sizeof(*bf)); +} + +static void vci_bitfield_iterate(struct lanai_dev *lanai, + const vci_bitfield *bf, void (*func)(struct lanai_dev *,vci_t vci)) +{ + vci_t vci; + unsigned long mask; + const unsigned long *lp = &(bf->ul[0]); + for (vci = 0; vci < NUM_VCI; lp++) + if (*lp == 0) + vci += BITS_PER_LONG; + else + for (mask = 1; mask != 0; mask <<= 1, vci++) + if (*lp & mask) + func(lanai, vci); +} + +/* -------------------- BUFFER UTILITIES: */ + +/* + * Lanai needs DMA buffers aligned to 256 bytes of at least 1024 bytes - + * we assume that any page allocation will do. I'm sure this is + * never going to be a problem, but it's good to document assumtions + */ +#if PAGE_SIZE < 1024 +#error PAGE_SIZE too small to support LANAI chipset +#endif +/* + * We also assume that the maximum buffer size will be some number + * of whole pages, although that wouldn't be too hard to fix + */ +#if PAGE_SIZE > (128 * 1024) +#error PAGE_SIZE too large to support LANAI chipset +#endif + +/* Convert a size to "order" for __get_free_pages */ +static int bytes_to_order(int bytes) +{ + int order = 0; + if (bytes > (128 * 1024)) + bytes = 128 * 1024; /* Max buffer size for lanai */ + while ((PAGE_SIZE << order) < bytes) + order++; + return order; +} + +/* + * Allocate a buffer in host RAM for service list, RX, or TX + * Returns buf->order<0 if no memory + * Note that the size will be rounded up to an "order" of pages, and + * if we can't allocate that we'll settle for something smaller + * until minbytes + * + * NOTE: buffer must be 32-bit DMA capable - when linux can + * make distinction, this will need tweaking for this + * to work on BIG memory machines. + */ +static void lanai_buf_allocate(struct lanai_buffer *buf, + int bytes, int minbytes) +{ + unsigned long address; + int order = bytes_to_order(bytes); + do { + address = __get_free_pages(GFP_KERNEL, order); + if (address != 0) { /* Success */ + bytes = PAGE_SIZE << order; + buf->start = buf->ptr = (u32 *) address; + buf->end = (u32 *) (address + bytes); + memset((void *) address, 0, bytes); + break; + } + if ((PAGE_SIZE << --order) < minbytes) + order = -1; /* Too small - give up */ + } while (order >= 0); + buf->order = order; +} + +static inline void lanai_buf_deallocate(struct lanai_buffer *buf) +{ + if (buf->order >= 0) { + APRINTK(buf->start != 0, "lanai_buf_deallocate: start==0!\n"); + free_pages((unsigned long) buf->start, buf->order); + buf->start = buf->end = buf->ptr = 0; + } +} + +/* size of buffer in bytes */ +static inline int lanai_buf_size(const struct lanai_buffer *buf) +{ + return ((unsigned long) buf->end) - ((unsigned long) buf->start); +} + +/* size of buffer as "card order" (0=1k .. 7=128k) */ +static inline int lanai_buf_size_cardorder(const struct lanai_buffer *buf) +{ + return buf->order + PAGE_SHIFT - 10; +} + +/* DMA-able address for this buffer */ +static unsigned long lanai_buf_dmaaddr(const struct lanai_buffer *buf) +{ + unsigned long r = virt_to_bus(buf->start); + APRINTK((r & ~0xFFFFFF00) == 0, "bad dmaaddr: 0x%lx\n", (long) r); + return r; +} + +/* -------------------- HANDLE BACKLOG_VCCS BITFIELD: */ + +static inline void vcc_mark_backlogged(struct lanai_dev *lanai, + const struct lanai_vcc *lvcc) +{ + APRINTK(lvcc->vbase != 0, "vcc_mark_backlogged: zero vbase!\n"); + vci_bitfield_set(&lanai->backlog_vccs, lvcc->vci); +} + +static inline void vcc_unmark_backlogged(struct lanai_dev *lanai, + const struct lanai_vcc *lvcc) +{ + APRINTK(lvcc->vbase != 0, "vcc_unmark_backlogged: zero vbase!\n"); + vci_bitfield_clear(&lanai->backlog_vccs, lvcc->vci); +} + +static inline void vcc_backlog_init(struct lanai_dev *lanai) +{ + vci_bitfield_init(&lanai->backlog_vccs); +} + +static inline int vcc_is_backlogged(/*const*/ struct lanai_vcc *lvcc) +{ + return lvcc->tx.inprogress != NULL || + !skb_queue_empty(&lvcc->tx.backlog); +} + +/* -------------------- PORT I/O UTILITIES: */ + +/* Registers (and their bit-fields) */ +enum lanai_register { + Reset_Reg = 0x00, /* Reset; read for chip type; bits: */ +#define RESET_GET_BOARD_REV(x) (((x)>> 0)&0x03) /* Board revision */ +#define RESET_GET_BOARD_ID(x) (((x)>> 2)&0x03) /* Board ID */ +#define BOARD_ID_LANAI256 (0) /* 25.6M adaptor card */ + Endian_Reg = 0x04, /* Endian setting */ + IntStatus_Reg = 0x08, /* Interrupt status */ + IntStatusMasked_Reg = 0x0C, /* Interrupt status (masked) */ + IntAck_Reg = 0x10, /* Interrupt acknowledge */ + IntAckMasked_Reg = 0x14, /* Interrupt acknowledge (masked) */ + IntStatusSet_Reg = 0x18, /* Get status + enable/disable */ + IntStatusSetMasked_Reg = 0x1C, /* Get status + en/di (masked) */ + IntControlEna_Reg = 0x20, /* Interrupt control enable */ + IntControlDis_Reg = 0x24, /* Interrupt control disable */ + Status_Reg = 0x28, /* Status */ +#define STATUS_PROMDATA (0x00000001) /* PROM_DATA pin */ +#define STATUS_WAITING (0x00000002) /* Interrupt being delayed */ +#define STATUS_SOOL (0x00000004) /* SOOL alarm */ +#define STATUS_LOCD (0x00000008) /* LOCD alarm */ +#define STATUS_LED (0x00000010) /* LED (HAPPI) output */ +#define STATUS_GPIN (0x00000020) /* GPIN pin */ +#define STATUS_BUTTBUSY (0x00000040) /* Butt register is pending */ + Config1_Reg = 0x2C, /* Config word 1; bits: */ +#define CONFIG1_PROMDATA (0x00000001) /* PROM_DATA pin */ +#define CONFIG1_PROMCLK (0x00000002) /* PROM_CLK pin */ +#define CONFIG1_SET_READMODE(x) ((x)*0x004) /* PCI BM reads; values: */ +#define READMODE_PLAIN (0) /* Plain memory read */ +#define READMODE_LINE (2) /* Memory read line */ +#define READMODE_MULTIPLE (3) /* Memory read multiple */ +#define CONFIG1_DMA_ENABLE (0x00000010) /* Turn on DMA */ +#define CONFIG1_POWERDOWN (0x00000020) /* Turn off clocks */ +#define CONFIG1_SET_LOOPMODE(x) ((x)*0x080) /* Clock&loop mode; values: */ +#define LOOPMODE_NORMAL (0) /* Normal - no loop */ +#define LOOPMODE_TIME (1) +#define LOOPMODE_DIAG (2) +#define LOOPMODE_LINE (3) +#define CONFIG1_MASK_LOOPMODE (0x00000180) +#define CONFIG1_SET_LEDMODE(x) ((x)*0x0200) /* Mode of LED; values: */ +#define LEDMODE_NOT_SOOL (0) /* !SOOL */ +#define LEDMODE_OFF (1) /* 0 */ +#define LEDMODE_ON (2) /* 1 */ +#define LEDMODE_NOT_LOCD (3) /* !LOCD */ +#define LEDMORE_GPIN (4) /* GPIN */ +#define LEDMODE_NOT_GPIN (7) /* !GPIN */ +#define CONFIG1_MASK_LEDMODE (0x00000E00) +#define CONFIG1_GPOUT1 (0x00001000) /* Toggle for reset */ +#define CONFIG1_GPOUT2 (0x00002000) /* Loopback PHY */ +#define CONFIG1_GPOUT3 (0x00004000) /* Loopback lanai */ + Config2_Reg = 0x30, /* Config word 2; bits: */ +#define CONFIG2_HOWMANY (0x00000001) /* >512 VCIs? */ +#define CONFIG2_PTI7_MODE (0x00000002) /* Make PTI=7 RM, not OAM */ +#define CONFIG2_VPI_CHK_DIS (0x00000004) /* Ignore RX VPI value */ +#define CONFIG2_HEC_DROP (0x00000008) /* Drop cells w/ HEC errors */ +#define CONFIG2_VCI0_NORMAL (0x00000010) /* Treat VCI=0 normally */ +#define CONFIG2_CBR_ENABLE (0x00000020) /* Deal with CBR traffic */ +#define CONFIG2_TRASH_ALL (0x00000040) /* Trashing incoming cells */ +#define CONFIG2_TX_DISABLE (0x00000080) /* Trashing outgoing cells */ +#define CONFIG2_SET_TRASH (0x00000100) /* Turn trashing on */ + Statistics_Reg = 0x34, /* Statistics; bits: */ +#define STATS_GET_FIFO_OVFL(x) (((x)>> 0)&0xFF) /* FIFO overflowed */ +#define STATS_GET_HEC_ERR(x) (((x)>> 8)&0xFF) /* HEC was bad */ +#define STATS_GET_BAD_VCI(x) (((x)>>16)&0xFF) /* VCI not open */ +#define STATS_GET_BUF_OVFL(x) (((x)>>24)&0xFF) /* VCC buffer full */ + ServiceStuff_Reg = 0x38, /* Service stuff; bits: */ +#define SSTUFF_SET_SIZE(x) ((x)*0x20000000) /* size of service buffer */ +#define SSTUFF_SET_ADDR(x) ((x)>>8) /* set address of buffer */ + ServWrite_Reg = 0x3C, /* ServWrite Pointer */ + ServRead_Reg = 0x40, /* ServRead Pointer */ + TxDepth_Reg = 0x44, /* FIFO Transmit Depth */ + Butt_Reg = 0x48, /* Butt register */ + CBR_ICG_Reg = 0x50, + CBR_PTR_Reg = 0x54, + PingCount_Reg = 0x58, /* Ping count */ + DMA_Addr_Reg = 0x5C /* DMA address */ +}; + +static inline bus_addr_t reg_addr(const struct lanai_dev *lanai, + enum lanai_register reg) +{ + return lanai->base + (bus_addr_t) reg; +} + + +static inline u32 reg_read(const struct lanai_dev *lanai, + enum lanai_register reg) +{ + u32 t; + t = readl(reg_addr(lanai, reg)); + RWDEBUG("R [0x%08X] 0x%02X = 0x%08X\n", (unsigned int) lanai->base, + (int) reg, t); + return t; +} + +static inline void reg_write(const struct lanai_dev *lanai, u32 val, + enum lanai_register reg) +{ + RWDEBUG("W [0x%08X] 0x%02X < 0x%08X\n", (unsigned int) lanai->base, + (int) reg, val); + writel(val, reg_addr(lanai, reg)); + mdelay(1); +} + +static inline void conf1_write(const struct lanai_dev *lanai) +{ + reg_write(lanai, lanai->conf1, Config1_Reg); +} + +static inline void conf2_write(const struct lanai_dev *lanai) +{ + reg_write(lanai, lanai->conf2, Config2_Reg); +} + +static inline void reset_board(const struct lanai_dev *lanai) +{ + DPRINTK("about to reset board\n"); + reg_write(lanai, 0, Reset_Reg); + /* + * If we don't delay a little while here then we can end up + * leaving the card in a VERY weird state and lock up the + * PCI bus. This isn't documented anywhere but I've convinced + * myself after a lot of painful experimentation + */ + udelay(5); +} + +/* -------------------- VCC LIST LOCK: */ + +/* + * The linux-atm code disables local IRQs while managing the list of + * VCCs on a card. This is good, but it doesn't save us against + * SMP. Unfortunately, fixing this will require changes in the + * API which will have to wait a little bit. It's a hard race to + * trigger accidentally, so it isn't TOO horrible so far. + * + * One possible solution would be to have an rwlock which is + * always grabbed _irq-style on writing. This would automatically + * be grabbed (for writing) by the higher layers on things that + * would result in a change in the vcc list (_open, _close, + * probably _change_qos) - thus it would also protect the + * higher-level list of vccs on each device (atm_dev->vccs). + * The driver would be responsible for grabbing it as a read_lock + * anytime it wants to consult its table of vccs - for instance + * when handling an incoming PDU. This also explains why we would + * probably want the write_lock while in _change_qos - to prevent + * handling of PDUs while possibly in an inconsistant state. + * Also, _send would grab the lock for reading. + * + * One problem with this is that _open and _close could no longer + * do anything that might provoke a schedule. First, it would + * force us to use GFP_ATOMIC memory (which is bad), but also + * some devices pretty much require scheduling due to long + * delays (see lanai_close for an example). So in this case + * we need a way to schedule without losing the spinlock. + * The cleanest way to do this is probably have a way to mark a + * VCC as "in progress" so that the interrupt handler can + * still disregard any traffic for it while _open or _close + * are sleeping on it. Then it will need to be _open and + * _close's job to relinquish the write_lock. Thus, the + * lock could be dropped around the times that scheduling + * might occur. Perhaps the _READY flag can be used for + * this purpose. + * + * One short note about this "upper layer grabs, driver + * relinquishes" write lock - since this needs to be + * an _irq lock we're going to have problem saving + * and restoring flags (_irqsave/_irqrestore). This + * shouldn't be a problem, however - we must just + * require that those syscalls are never called with + * interrupts disabled so we can use the non-flags-saving + * versions. + * + * Anyway, all of the above is vaporware currently - fixing + * this right will require changes in the API and all of + * the drivers - this will wait until 2.5.x most likely. + * The following NOP macros are just here to mark where + * the locks will be needed in the future. + */ +#define vcclist_read_lock() do {} while (0) +#define vcclist_read_unlock() do {} while (0) +#define vcclist_write_lock() do {} while (0) +#define vcclist_write_unlock() do {} while (0) + +/* -------------------- CARD SRAM UTILITIES: */ + +/* The SRAM is mapped into normal PCI memory space - the only catch is + * that it is only 16-bits wide but must be accessed as 32-bit. The + * 16 high bits will be zero. We don't hide this, since they get + * programmed mostly like discrete registers anyway + */ +#define SRAM_START (0x20000) +#define SRAM_BYTES (0x20000) /* Again, half don't really exist */ + +static inline bus_addr_t sram_addr(const struct lanai_dev *lanai, int offset) +{ + return lanai->base + SRAM_START + offset; +} + +static inline u32 sram_read(const struct lanai_dev *lanai, int offset) +{ + return readl(sram_addr(lanai, offset)); +} + +static inline void sram_write(const struct lanai_dev *lanai, + u32 val, int offset) +{ + writel(val, sram_addr(lanai, offset)); +} + +static int __init sram_test_word( + const struct lanai_dev *lanai, int offset, u32 pattern) +{ + u32 readback; + sram_write(lanai, pattern, offset); + readback = sram_read(lanai, offset); + if (readback == pattern) + return 0; + printk(KERN_ERR DEV_LABEL + "(itf %d): SRAM word at %d bad: wrote 0x%X, read 0x%X\n", + lanai->number, offset, pattern, readback); + return -EIO; +} + +static int __init sram_test_pass(const struct lanai_dev *lanai, u32 pattern) +{ + int offset, result = 0; + for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4) + result = sram_test_word(lanai, offset, pattern); + return result; +} + +static int __init sram_test_and_clear(const struct lanai_dev *lanai) +{ +#ifdef FULL_MEMORY_TEST + int result; + DPRINTK("testing SRAM\n"); + if ((result = sram_test_pass(lanai, 0x5555)) != 0) + return result; + if ((result = sram_test_pass(lanai, 0xAAAA)) != 0) + return result; +#endif + DPRINTK("clearing SRAM\n"); + return sram_test_pass(lanai, 0x0000); +} + +/* -------------------- CARD-BASED VCC TABLE UTILITIES: */ + +/* vcc table */ +enum lanai_vcc_offset { + vcc_rxaddr1 = 0x00, /* Location1, plus bits: */ +#define RXADDR1_SET_SIZE(x) ((x)*0x0000100) /* size of RX buffer */ +#define RXADDR1_SET_RMMODE(x) ((x)*0x00800) /* RM cell action; values: */ +#define RMMODE_TRASH (0) /* discard */ +#define RMMODE_PRESERVE (1) /* input as AAL0 */ +#define RMMODE_PIPE (2) /* pipe to coscheduler */ +#define RMMODE_PIPEALL (3) /* pipe non-RM too */ +#define RXADDR1_OAM_PRESERVE (0x00002000) /* Input OAM cells as AAL0 */ +#define RXADDR1_SET_MODE(x) ((x)*0x0004000) /* Reassembly mode */ +#define RXMODE_TRASH (0) /* discard */ +#define RXMODE_AAL0 (1) /* non-AAL5 mode */ +#define RXMODE_AAL5 (2) /* AAL5, intr. each PDU */ +#define RXMODE_AAL5_STREAM (3) /* AAL5 w/o per-PDU intr */ + vcc_rxaddr2 = 0x04, /* Location2 */ + vcc_rxcrc1 = 0x08, /* RX CRC claculation space */ + vcc_rxcrc2 = 0x0C, + vcc_rxwriteptr = 0x10, /* RX writeptr, plus bits: */ +#define RXWRITEPTR_LASTEFCI (0x00002000) /* Last PDU had EFCI bit */ +#define RXWRITEPTR_DROPPING (0x00004000) /* Had error, dropping */ +#define RXWRITEPTR_TRASHING (0x00008000) /* Trashing */ + vcc_rxbufstart = 0x14, /* RX bufstart, plus bits: */ +#define RXBUFSTART_CLP (0x00004000) +#define RXBUFSTART_CI (0x00008000) + vcc_rxreadptr = 0x18, /* RX readptr */ + vcc_txicg = 0x1C, /* TX ICG */ + vcc_txaddr1 = 0x20, /* Location1, plus bits: */ +#define TXADDR1_SET_SIZE(x) ((x)*0x0000100) /* size of TX buffer */ +#define TXADDR1_ABR (0x00008000) /* use ABR (doesn't work) */ + vcc_txaddr2 = 0x24, /* Location2 */ + vcc_txcrc1 = 0x28, /* TX CRC claculation space */ + vcc_txcrc2 = 0x2C, + vcc_txreadptr = 0x30, /* TX Readptr, plus bits: */ +#define TXREADPTR_GET_PTR(x) ((x)&0x01FFF) +#define TXREADPTR_MASK_DELTA (0x0000E000) /* ? */ + vcc_txendptr = 0x34, /* TX Endptr, plus bits: */ +#define TXENDPTR_CLP (0x00002000) +#define TXENDPTR_MASK_PDUMODE (0x0000C000) /* PDU mode; values: */ +#define PDUMODE_AAL0 (0*0x04000) +#define PDUMODE_AAL5 (2*0x04000) +#define PDUMODE_AAL5STREAM (3*0x04000) + vcc_txwriteptr = 0x38, /* TX Writeptr */ +#define TXWRITEPTR_GET_PTR(x) ((x)&0x1FFF) + vcc_txcbr_next = 0x3C /* # of next CBR VCI in ring */ +#define TXCBR_NEXT_BOZO (0x00008000) /* "bozo bit" */ +}; + +#define CARDVCC_SIZE (0x40) + +static inline bus_addr_t cardvcc_addr(const struct lanai_dev *lanai, + vci_t vci) +{ + return sram_addr(lanai, vci * CARDVCC_SIZE); +} + +static inline u32 cardvcc_read(const struct lanai_vcc *lvcc, + enum lanai_vcc_offset offset) +{ + u32 val; + APRINTK(lvcc->vbase != 0, "cardvcc_read: unbound vcc!\n"); + val= readl(lvcc->vbase + (bus_addr_t) offset); + RWDEBUG("VR vci=%04d 0x%02X = 0x%08X\n", + lvcc->vci, (int) offset, val); + return val; +} + +static inline void cardvcc_write(const struct lanai_vcc *lvcc, + u32 val, enum lanai_vcc_offset offset) +{ + APRINTK(lvcc->vbase != 0, "cardvcc_write: unbound vcc!\n"); + APRINTK((val & ~0xFFFF) == 0, + "cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)\n", + val, lvcc->vci, (int) offset); + RWDEBUG("VW vci=%04d 0x%02X > 0x%08X\n", + lvcc->vci, (int) offset, val); + writel(val, lvcc->vbase + (bus_addr_t) offset); +} + +/* -------------------- COMPUTE SIZE OF AN AAL5 PDU: */ + +/* How many bytes will an AAL5 PDU take to transmit - remember that: + * o we need to add 8 bytes for length, CPI, UU, and CRC + * o we need to round up to 48 bytes for cells + */ +static inline int aal5_size(int size) +{ + int cells = (size + 8 + 47) / 48; + return cells * 48; +} + +/* How many bytes can we send if we have "space" space, assuming we have + * to send full cells + */ +static inline int aal5_spacefor(int space) +{ + int cells = space / 48; + return cells * 48; +} + +/* -------------------- FREE AN ATM SKB: */ + +static inline void lanai_free_skb(struct atm_vcc *atmvcc, struct sk_buff *skb) +{ + if (atmvcc->pop != NULL) + atmvcc->pop(atmvcc, skb); + else + dev_kfree_skb_any(skb); +} + +/* -------------------- TURN VCCS ON AND OFF: */ + +static void host_vcc_start_rx(const struct lanai_vcc *lvcc) +{ + u32 addr1; + if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5) { + unsigned long dmaaddr = lanai_buf_dmaaddr(&lvcc->rx.buf); + cardvcc_write(lvcc, 0xFFFF, vcc_rxcrc1); + cardvcc_write(lvcc, 0xFFFF, vcc_rxcrc2); + cardvcc_write(lvcc, 0, vcc_rxwriteptr); + cardvcc_write(lvcc, 0, vcc_rxbufstart); + cardvcc_write(lvcc, 0, vcc_rxreadptr); + cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF, vcc_rxaddr2); + addr1 = ((dmaaddr >> 8) & 0xFF) | + RXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->rx.buf))| + RXADDR1_SET_RMMODE(RMMODE_TRASH) | /* ??? */ + /* RXADDR1_OAM_PRESERVE | --- no OAM support yet */ + RXADDR1_SET_MODE(RXMODE_AAL5); + } else + addr1 = RXADDR1_SET_RMMODE(RMMODE_PRESERVE) | /* ??? */ + RXADDR1_OAM_PRESERVE | /* ??? */ + RXADDR1_SET_MODE(RXMODE_AAL0); + /* This one must be last! */ + cardvcc_write(lvcc, addr1, vcc_rxaddr1); +} + +static void host_vcc_start_tx(const struct lanai_vcc *lvcc) +{ + unsigned long dmaaddr = lanai_buf_dmaaddr(&lvcc->tx.buf); + cardvcc_write(lvcc, 0, vcc_txicg); + cardvcc_write(lvcc, 0xFFFF, vcc_txcrc1); + cardvcc_write(lvcc, 0xFFFF, vcc_txcrc2); + cardvcc_write(lvcc, 0, vcc_txreadptr); + cardvcc_write(lvcc, 0, vcc_txendptr); + cardvcc_write(lvcc, 0, vcc_txwriteptr); + cardvcc_write(lvcc, + (lvcc->tx.atmvcc->qos.txtp.traffic_class == ATM_CBR) ? + TXCBR_NEXT_BOZO | lvcc->vci : 0, vcc_txcbr_next); + cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF, vcc_txaddr2); + cardvcc_write(lvcc, + ((dmaaddr >> 8) & 0xFF) | + TXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->tx.buf)), + vcc_txaddr1); +} + +/* Shutdown receiving on card */ +static void lanai_shutdown_rx_vci(const struct lanai_vcc *lvcc) +{ + if (lvcc->vbase == 0) /* We were never bound to a VCI */ + return; + /* 15.1.1 - set to trashing, wait one cell time (15us) */ + cardvcc_write(lvcc, + RXADDR1_SET_RMMODE(RMMODE_TRASH) | + RXADDR1_SET_MODE(RXMODE_TRASH), vcc_rxaddr1); + udelay(15); + /* 15.1.2 - clear rest of entries */ + cardvcc_write(lvcc, 0, vcc_rxaddr2); + cardvcc_write(lvcc, 0, vcc_rxcrc1); + cardvcc_write(lvcc, 0, vcc_rxcrc2); + cardvcc_write(lvcc, 0, vcc_rxwriteptr); + cardvcc_write(lvcc, 0, vcc_rxbufstart); + cardvcc_write(lvcc, 0, vcc_rxreadptr); +} + +/* Shutdown transmitting on card. + * Unfortunately the lanai needs us to wait until all the data + * drains out of the buffer before we can dealloc it, so this + * can take awhile -- up to 370ms for a full 128KB buffer + * assuming everone else is quiet. In theory the time is + * boundless if there's a CBR VCC holding things up. + */ +static void lanai_shutdown_tx_vci(struct lanai_dev *lanai, + struct lanai_vcc *lvcc) +{ + struct sk_buff *skb; + unsigned long flags, timeout; + int read, write, lastread = -1; + APRINTK(!in_interrupt(), + "lanai_shutdown_tx_vci called w/o process context!\n"); + if (lvcc->vbase == 0) /* We were never bound to a VCI */ + return; + /* 15.2.1 - wait for queue to drain */ + spin_lock_irqsave(&lanai->txlock, flags); + if (lvcc->tx.inprogress != NULL) { + lanai_free_skb(lvcc->tx.atmvcc, lvcc->tx.inprogress); + lvcc->tx.inprogress = NULL; + } + while ((skb = skb_dequeue(&lvcc->tx.backlog)) != NULL) + lanai_free_skb(lvcc->tx.atmvcc, skb); + vcc_unmark_backlogged(lanai, lvcc); + spin_unlock_irqrestore(&lanai->txlock, flags); + timeout = jiffies + ((lanai_buf_size(&lvcc->tx.buf) * HZ) >> 17); + write = TXWRITEPTR_GET_PTR(cardvcc_read(lvcc, vcc_txwriteptr)); + goto start; + while (time_before_eq(jiffies, timeout)) { + schedule_timeout(HZ / 25); + start: + read = TXREADPTR_GET_PTR(cardvcc_read(lvcc, vcc_txreadptr)); + if (read == write && /* Is TX buffer empty? */ + (lvcc->tx.atmvcc->qos.txtp.traffic_class != ATM_CBR || + (cardvcc_read(lvcc, vcc_txcbr_next) & + TXCBR_NEXT_BOZO) == 0)) + goto done; + if (read != lastread) { /* Has there been any progress? */ + lastread = read; + timeout += HZ / 10; + } + } + printk(KERN_ERR DEV_LABEL "(itf %d): Timed out on backlog closing " + "vci %d\n", lvcc->tx.atmvcc->dev->number, lvcc->vci); + DPRINTK("read, write = %d, %d\n", read, write); + done: + /* 15.2.2 - clear out all tx registers */ + cardvcc_write(lvcc, 0, vcc_txreadptr); + cardvcc_write(lvcc, 0, vcc_txwriteptr); + cardvcc_write(lvcc, 0, vcc_txendptr); + cardvcc_write(lvcc, 0, vcc_txcrc1); + cardvcc_write(lvcc, 0, vcc_txcrc2); + cardvcc_write(lvcc, 0, vcc_txaddr2); + cardvcc_write(lvcc, 0, vcc_txaddr1); +} + +/* -------------------- MANAGING AAL0 RX BUFFER: */ + +static inline int aal0_buffer_allocate(struct lanai_dev *lanai) +{ + DPRINTK("aal0_buffer_allocate: allocating AAL0 RX buffer\n"); + lanai_buf_allocate(&lanai->aal0buf, AAL0_RX_BUFFER_SIZE, 80); + return (lanai->aal0buf.order < 0) ? -ENOMEM : 0; +} + +static inline void aal0_buffer_free(struct lanai_dev *lanai) +{ + DPRINTK("aal0_buffer_allocate: freeing AAL0 RX buffer\n"); + lanai_buf_deallocate(&lanai->aal0buf); +} + +/* -------------------- EEPROM UTILITIES: */ + +/* Offsets of data in the EEPROM */ +#define EEPROM_COPYRIGHT (0) +#define EEPROM_COPYRIGHT_LEN (44) +#define EEPROM_CHECKSUM (62) +#define EEPROM_CHECKSUM_REV (63) +#define EEPROM_MAC (64) +#define EEPROM_MAC_REV (70) +#define EEPROM_SERIAL (112) +#define EEPROM_SERIAL_REV (116) +#define EEPROM_MAGIC (120) +#define EEPROM_MAGIC_REV (124) + +#define EEPROM_MAGIC_VALUE (0x5AB478D2) + +#ifndef READ_EEPROM + +/* Stub functions to use if EEPROM reading is disabled */ +static int __init eeprom_read(struct lanai_dev *lanai) +{ + printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROM\n", + lanai->number); + memset(&lanai->eeprom[EEPROM_MAC], 0, 6); + return 0; +} + +static int __init eeprom_validate(struct lanai_dev *lanai) +{ + lanai->serialno = 0; + lanai->magicno = EEPROM_MAGIC_VALUE; + return 0; +} + +#else /* READ_EEPROM */ + +static int __init eeprom_read(struct lanai_dev *lanai) +{ + int i, address; + u8 data; + u32 tmp; +#define set_config1(x) do { lanai->conf1 = x; conf1_write(lanai); \ + } while (0) +#define clock_h() set_config1(lanai->conf1 | CONFIG1_PROMCLK) +#define clock_l() set_config1(lanai->conf1 &~ CONFIG1_PROMCLK) +#define data_h() set_config1(lanai->conf1 | CONFIG1_PROMDATA) +#define data_l() set_config1(lanai->conf1 &~ CONFIG1_PROMDATA) +#define pre_read() do { data_h(); clock_h(); udelay(5); } while (0) +#define read_pin() (reg_read(lanai, Status_Reg) & STATUS_PROMDATA) +#define send_stop() do { data_l(); udelay(5); clock_h(); udelay(5); \ + data_h(); udelay(5); } while (0) + /* start with both clock and data high */ + data_h(); clock_h(); udelay(5); + for (address = 0; address < LANAI_EEPROM_SIZE; address++) { + data = (address << 1) | 1; /* Command=read + address */ + /* send start bit */ + data_l(); udelay(5); + clock_l(); udelay(5); + for (i = 128; i != 0; i >>= 1) { /* write command out */ + tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) | + (data & i) ? CONFIG1_PROMDATA : 0; + if (lanai->conf1 != tmp) { + set_config1(tmp); + udelay(5); /* Let new data settle */ + } + clock_h(); udelay(5); clock_l(); udelay(5); + } + /* look for ack */ + data_h(); clock_h(); udelay(5); + if (read_pin() != 0) + goto error; /* No ack seen */ + clock_l(); udelay(5); + /* read back result */ + for (data = 0, i = 7; i >= 0; i--) { + data_h(); clock_h(); udelay(5); + data = (data << 1) | !!read_pin(); + clock_l(); udelay(5); + } + /* look again for ack */ + data_h(); clock_h(); udelay(5); + if (read_pin() == 0) + goto error; /* Spurious ack */ + clock_l(); udelay(5); + send_stop(); + lanai->eeprom[address] = data; + DPRINTK("EEPROM 0x%04X %02X\n", address, data); + } + return 0; + error: + clock_l(); udelay(5); /* finish read */ + send_stop(); + printk(KERN_ERR DEV_LABEL "(itf %d): error reading EEPROM byte %d\n", + lanai->number, address); + return -EIO; +#undef set_config1 +#undef clock_h +#undef clock_l +#undef data_h +#undef data_l +#undef pre_read +#undef read_pin +#undef send_stop +} + +/* read a big-endian 4-byte value out of eeprom */ +static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address) +{ + return be32_to_cpup((u32 *) (&lanai->eeprom[address])); +} + +/* Checksum/validate EEPROM contents */ +static int __init eeprom_validate(struct lanai_dev *lanai) +{ + int i, s; + u32 v; + const u8 *e = lanai->eeprom; +#ifdef DEBUG + /* First, see if we can get an ASCIIZ string out of the copyright */ + for (i = EEPROM_COPYRIGHT; + i < (EEPROM_COPYRIGHT + EEPROM_COPYRIGHT_LEN); i++) + if (e[i] < 0x20 || e[i] > 0x7E) + break; + if ( i != EEPROM_COPYRIGHT && + i != EEPROM_COPYRIGHT + EEPROM_COPYRIGHT_LEN && e[i] == '\0') + DPRINTK("eeprom: copyright = \"%s\"\n", + (char *) &e[EEPROM_COPYRIGHT]); + else + DPRINTK("eeprom: copyright not found\n"); +#endif + /* Validate checksum */ + for (i = s = 0; i < EEPROM_CHECKSUM; i++) + s += e[i]; + s &= 0xFF; + if (s != e[EEPROM_CHECKSUM]) { + printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM checksum bad " + "(wanted 0x%02X, got 0x%02X)\n", lanai->number, + s, e[EEPROM_CHECKSUM]); + return -EIO; + } + s ^= 0xFF; + if (s != e[EEPROM_CHECKSUM_REV]) { + printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM inverse checksum " + "bad (wanted 0x%02X, got 0x%02X)\n", lanai->number, + s, e[EEPROM_CHECKSUM_REV]); + return -EIO; + } + /* Verify MAC address */ + for (i = 0; i < 6; i++) + if ((e[EEPROM_MAC + i] ^ e[EEPROM_MAC_REV + i]) != 0xFF) { + printk(KERN_ERR DEV_LABEL + "(itf %d) : EEPROM MAC addresses don't match " + "(0x%02X, inverse 0x%02X)\n", lanai->number, + e[EEPROM_MAC + i], e[EEPROM_MAC_REV + i]); + return -EIO; + } + DPRINTK("eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X\n", + e[EEPROM_MAC + 0], e[EEPROM_MAC + 1], e[EEPROM_MAC + 2], + e[EEPROM_MAC + 3], e[EEPROM_MAC + 4], e[EEPROM_MAC + 5]); + /* Verify serial number */ + lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL); + v = eeprom_be4(lanai, EEPROM_SERIAL_REV); + if ((lanai->serialno ^ v) != 0xFFFFFFFF) { + printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM serial numbers " + "don't match (0x%08X, inverse 0x%08X)\n", lanai->number, + lanai->serialno, v); + return -EIO; + } + DPRINTK("eeprom: Serial number = %d\n", lanai->serialno); + /* Verify magic number */ + lanai->magicno = eeprom_be4(lanai, EEPROM_MAGIC); + v = eeprom_be4(lanai, EEPROM_MAGIC_REV); + if ((lanai->magicno ^ v) != 0xFFFFFFFF) { + printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM magic numbers " + "don't match (0x%08X, inverse 0x%08X)\n", lanai->number, + lanai->magicno, v); + return -EIO; + } + DPRINTK("eeprom: Magic number = 0x%08X\n", lanai->magicno); + if (lanai->magicno != EEPROM_MAGIC_VALUE) + printk(KERN_WARNING DEV_LABEL "(itf %d): warning - EEPROM " + "magic not what expected (got 0x%08X, not 0x%08X)\n", + lanai->number, lanai->magicno, EEPROM_MAGIC_VALUE); + return 0; +} + +#endif /* READ_EEPROM */ + +static inline const u8 *eeprom_mac(const struct lanai_dev *lanai) +{ + return &lanai->eeprom[EEPROM_MAC]; +} + +/* -------------------- INTERRUPT HANDLING UTILITIES: */ + +/* Interrupt types */ +#define INT_STATS (0x00000002) /* Statistics counter overflow */ +#define INT_SOOL (0x00000004) /* SOOL changed state */ +#define INT_LOCD (0x00000008) /* LOCD changed state */ +#define INT_LED (0x00000010) /* LED (HAPPI) changed state */ +#define INT_GPIN (0x00000020) /* GPIN changed state */ +#define INT_PING (0x00000040) /* PING_COUNT fulfilled */ +#define INT_WAKE (0x00000080) /* Lanai wants bus */ +#define INT_CBR0 (0x00000100) /* CBR sched hit VCI 0 */ +#define INT_LOCK (0x00000200) /* Service list overflow */ +#define INT_MISMATCH (0x00000400) /* TX magic list mismatch */ +#define INT_AAL0_STR (0x00000800) /* Non-AAL5 buffer half filled */ +#define INT_AAL0 (0x00001000) /* Non-AAL5 data available */ +#define INT_SERVICE (0x00002000) /* Service list entries available */ +#define INT_TABORTSENT (0x00004000) /* Target abort sent by lanai */ +#define INT_TABORTBM (0x00008000) /* Abort rcv'd as bus master */ +#define INT_TIMEOUTBM (0x00010000) /* No response to bus master */ +#define INT_PCIPARITY (0x00020000) /* Parity error on PCI */ + +/* Sets of the above */ +#define INT_ALL (0x0003FFFE) /* All interrupts */ +#define INT_STATUS (0x0000003C) /* Some status pin changed */ +#define INT_DMASHUT (0x00038000) /* DMA engine got shut down */ +#define INT_SEGSHUT (0x00000700) /* Segmentation got shut down */ + +static inline u32 intr_pending(const struct lanai_dev *lanai) +{ + return reg_read(lanai, IntStatusMasked_Reg); +} + +static inline void intr_enable(const struct lanai_dev *lanai, u32 i) +{ + reg_write(lanai, i, IntControlEna_Reg); +} + +static inline void intr_disable(const struct lanai_dev *lanai, u32 i) +{ + reg_write(lanai, i, IntControlDis_Reg); +} + +/* -------------------- CARD/PCI STATUS: */ + +static void status_message(int itf, const char *name, int status) +{ + static const char *onoff[2] = { "off to on", "on to off" }; + printk(KERN_INFO DEV_LABEL "(itf %d): %s changed from %s\n", + itf, name, onoff[!status]); +} + +static void lanai_check_status(struct lanai_dev *lanai) +{ + u32 new = reg_read(lanai, Status_Reg); + u32 changes = new ^ lanai->status; + lanai->status = new; +#define e(flag, name) \ + if (changes & flag) \ + status_message(lanai->number, name, new & flag) + e(STATUS_SOOL, "SOOL"); + e(STATUS_LOCD, "LOCD"); + e(STATUS_LED, "LED"); + e(STATUS_GPIN, "GPIN"); +#undef e +} + +static void pcistatus_got(int itf, const char *name) +{ + printk(KERN_INFO DEV_LABEL "(itf %d): PCI got %s error\n", itf, name); +} + +static void pcistatus_check(struct lanai_dev *lanai, int clearonly) +{ + u16 s; + int result; + result = pci_read_config_word(lanai->pci, PCI_STATUS, &s); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't read PCI_STATUS: " + "%d\n", lanai->number, result); + return; + } + s &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR | + PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT | + PCI_STATUS_SIG_TARGET_ABORT | PCI_STATUS_PARITY; + if (s == 0) + return; + result = pci_write_config_word(lanai->pci, PCI_STATUS, s); + if (result != PCIBIOS_SUCCESSFUL) + printk(KERN_ERR DEV_LABEL "(itf %d): can't write PCI_STATUS: " + "%d\n", lanai->number, result); + if (clearonly) + return; +#define e(flag, name, stat) \ + if (s & flag) { \ + pcistatus_got(lanai->number, name); \ + ++lanai->stats.pcierr_##stat; \ + } + e(PCI_STATUS_DETECTED_PARITY, "parity", parity_detect); + e(PCI_STATUS_SIG_SYSTEM_ERROR, "signalled system", serr_set); + e(PCI_STATUS_REC_MASTER_ABORT, "master", master_abort); + e(PCI_STATUS_REC_TARGET_ABORT, "master target", m_target_abort); + e(PCI_STATUS_SIG_TARGET_ABORT, "slave", s_target_abort); + e(PCI_STATUS_PARITY, "master parity", master_parity); +#undef e +} + +/* -------------------- VCC TX BUFFER UTILITIES: */ + +/* space left in tx buffer in bytes */ +static inline int vcc_tx_space(const struct lanai_vcc *lvcc, int endptr) +{ + int r; + r = endptr * 16; + r -= ((unsigned long) lvcc->tx.buf.ptr) - + ((unsigned long) lvcc->tx.buf.start); + r -= 16; /* Leave "bubble" - if start==end it looks empty */ + if (r < 0) + r += lanai_buf_size(&lvcc->tx.buf); + return r; +} + +/* Bit fields in the segmentation buffer descriptor */ +#define DESCRIPTOR_MAGIC (0xD0000000) +#define DESCRIPTOR_AAL5 (0x00008000) +#define DESCRIPTOR_AAL5_STREAM (0x00004000) +#define DESCRIPTOR_CLP (0x00002000) + +/* Add 32-bit descriptor with it's padding */ +static inline void vcc_tx_add_aal5_descriptor(struct lanai_vcc *lvcc, + u32 flags, int len) +{ + int pos; + APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 0, + "vcc_tx_add_aal5_descriptor: bad ptr=%p\n", lvcc->tx.buf.ptr); + lvcc->tx.buf.ptr += 4; /* Hope the values REALLY don't matter */ + pos = ((unsigned char *) lvcc->tx.buf.ptr) - + (unsigned char *) lvcc->tx.buf.start; + APRINTK((pos & ~0x0001FFF0) == 0, + "vcc_tx_add_aal5_descriptor: bad pos (%d) before, vci=%d, " + "start,ptr,end=%p,%p,%p\n", pos, lvcc->vci, + lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end); + pos = (pos + len) & (lanai_buf_size(&lvcc->tx.buf) - 1); + APRINTK((pos & ~0x0001FFF0) == 0, + "vcc_tx_add_aal5_descriptor: bad pos (%d) after, vci=%d, " + "start,ptr,end=%p,%p,%p\n", pos, lvcc->vci, + lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end); + lvcc->tx.buf.ptr[-1] = + cpu_to_le32(DESCRIPTOR_MAGIC | DESCRIPTOR_AAL5 | + ((lvcc->tx.atmvcc->atm_options & ATM_ATMOPT_CLP) ? + DESCRIPTOR_CLP : 0) | flags | pos >> 4); + if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end) + lvcc->tx.buf.ptr = lvcc->tx.buf.start; +} + +/* Add 32-bit AAL5 trailer and leave room for its CRC */ +static inline void vcc_tx_add_aal5trailer(struct lanai_vcc *lvcc, + int len, int cpi, int uu) +{ + APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 8, + "vcc_tx_add_aal5_descriptor: bad ptr=%p\n", lvcc->tx.buf.ptr); + lvcc->tx.buf.ptr += 2; + lvcc->tx.buf.ptr[-2] = cpu_to_be32((uu << 24) | (cpi << 16) | len); + if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end) + lvcc->tx.buf.ptr = lvcc->tx.buf.start; +} + +static inline void vcc_tx_memcpy(struct lanai_vcc *lvcc, + const unsigned char *src, int n) +{ + unsigned char *e; + int m; + e = ((unsigned char *) lvcc->tx.buf.ptr) + n; + m = e - (unsigned char *) lvcc->tx.buf.end; + if (m < 0) + m = 0; + memcpy(lvcc->tx.buf.ptr, src, n - m); + if (m != 0) { + memcpy(lvcc->tx.buf.start, src + n - m, m); + e = ((unsigned char *) lvcc->tx.buf.start) + m; + } + lvcc->tx.buf.ptr = (u32 *) e; +} + +static inline void vcc_tx_memzero(struct lanai_vcc *lvcc, int n) +{ + unsigned char *e; + int m; + if (n == 0) + return; + e = ((unsigned char *) lvcc->tx.buf.ptr) + n; + m = e - (unsigned char *) lvcc->tx.buf.end; + if (m < 0) + m = 0; + memset(lvcc->tx.buf.ptr, 0, n - m); + if (m != 0) { + memset(lvcc->tx.buf.start, 0, m); + e = ((unsigned char *) lvcc->tx.buf.start) + m; + } + lvcc->tx.buf.ptr = (u32 *) e; +} + +/* Update "butt" register to specify new WritePtr */ +static inline void lanai_endtx(const struct lanai_dev *lanai, + const struct lanai_vcc *lvcc) +{ + int i, ptr = ((unsigned char *) lvcc->tx.buf.ptr) - + (unsigned char *) lvcc->tx.buf.start; + APRINTK((ptr & ~0x0001FFF0) == 0, + "lanai_endtx: bad ptr (%d), vci=%d, start,ptr,end=%p,%p,%p\n", + ptr, lvcc->vci, lvcc->tx.buf.start, lvcc->tx.buf.ptr, + lvcc->tx.buf.end); + /* + * We need to check if the "butt busy" bit is set before + * updating the butt register. In theory this should + * never happen because the ATM card is plenty fast at + * updating the register. Still, we should make sure + */ + for (i = 0; reg_read(lanai, Status_Reg) & STATUS_BUTTBUSY; i++) { + if (i > 50) { + printk(KERN_ERR DEV_LABEL "(itf %d): butt register " + "always busy!\n", lanai->number); + break; + } + udelay(5); + } + reg_write(lanai, (ptr << 12) | lvcc->vci, Butt_Reg); +} + +/* Try to fill the buffer - don't call unless there is backlog */ +static void vcc_tx_unqueue_aal5(struct lanai_dev *lanai, + struct lanai_vcc *lvcc, int endptr) +{ + int pad, n; + struct sk_buff *skb; + int space = vcc_tx_space(lvcc, endptr); + APRINTK(vcc_is_backlogged(lvcc), + "vcc_tx_unqueue() called with empty backlog (vci=%d)\n", + lvcc->vci); + if (space < 64) + return; /* No space for even 1 cell+descriptor */ + if (lvcc->tx.inprogress != NULL) { + APRINTK((lvcc->tx.inprogleft % 48) == 0, + "vcc_tx_unqueue_aal5: bad progleft=%d\n", + lvcc->tx.inprogleft); + if (lvcc->tx.inprogleft + 16 > space) { /* Can't send all? */ + n = aal5_spacefor(space - 16); /* Bytes to send */ + vcc_tx_add_aal5_descriptor(lvcc, + DESCRIPTOR_AAL5_STREAM, n); + pad = lvcc->tx.pptr + n - lvcc->tx.inprogress->tail; + if (pad < 0) + pad = 0; + vcc_tx_memcpy(lvcc, lvcc->tx.pptr, n - pad); + vcc_tx_memzero(lvcc, pad); + lvcc->tx.pptr += n; + lvcc->tx.inprogleft -= n; + goto end; /* Buffer is now full */ + } + /* OK, there's at least space for all of "inprogress" skb */ + vcc_tx_add_aal5_descriptor(lvcc, 0, + lvcc->tx.inprogleft); + pad = lvcc->tx.pptr + lvcc->tx.inprogleft - + lvcc->tx.inprogress->tail; + if (pad >= lvcc->tx.inprogleft) { /* Nothing but pad left */ + APRINTK(lvcc->tx.inprogleft == 48, + "vcc_tx_unqueue_aal5: bad pure-pad=%d\n", + lvcc->tx.inprogleft); + pad = 48; + } else + vcc_tx_memcpy(lvcc, lvcc->tx.pptr, + lvcc->tx.inprogleft - pad); + vcc_tx_memzero(lvcc, pad - 8); + vcc_tx_add_aal5trailer(lvcc, lvcc->tx.inprogress->len, 0, 0); + lanai_free_skb(lvcc->tx.atmvcc, lvcc->tx.inprogress); + lvcc->tx.inprogress = NULL; + space -= lvcc->tx.inprogleft + 16; + atomic_inc(&lvcc->tx.atmvcc->stats->tx); + } + while (space >= 64) { + if ((skb = skb_dequeue(&lvcc->tx.backlog)) == NULL) + break; + n = aal5_size(skb->len); + if (n + 16 > space) { /* Can only send part */ + int m = aal5_spacefor(space - 16); /* Bytes to send */ + vcc_tx_add_aal5_descriptor(lvcc, + DESCRIPTOR_AAL5_STREAM, m); + lvcc->tx.pptr = skb->data + m; + pad = lvcc->tx.pptr - skb->tail; + if (pad < 0) + pad = 0; + vcc_tx_memcpy(lvcc, skb->data, m - pad); + vcc_tx_memzero(lvcc, pad); + lvcc->tx.inprogleft = n - m; + lvcc->tx.inprogress = skb; + goto end; + } + vcc_tx_add_aal5_descriptor(lvcc, 0, n); + pad = n - skb->len - 8; + vcc_tx_memcpy(lvcc, skb->data, skb->len); + vcc_tx_memzero(lvcc, pad); + lanai_free_skb(lvcc->tx.atmvcc, skb); + vcc_tx_add_aal5trailer(lvcc, skb->len, 0, 0); + space -= n + 16; + atomic_inc(&lvcc->tx.atmvcc->stats->tx); + } + if (skb_queue_empty(&lvcc->tx.backlog)) + vcc_unmark_backlogged(lanai, lvcc); + end: + lanai_endtx(lanai, lvcc); +} + +/* Given an skb that we want to transmit either send it now or queue */ +static void vcc_tx_aal5(struct lanai_dev *lanai, struct lanai_vcc *lvcc, + struct sk_buff *skb) +{ + int space, n, pad; + if (vcc_is_backlogged(lvcc)) /* Already backlogged */ + goto queue_it; + space = vcc_tx_space(lvcc, TXREADPTR_GET_PTR(cardvcc_read(lvcc, + vcc_txreadptr))); + if (space < 64) { + vcc_mark_backlogged(lanai, lvcc); /* No space */ + goto queue_it; + } + if (space >= 16 + (n = aal5_size(skb->len))) { + /* We can send the whole thing now */ + vcc_tx_add_aal5_descriptor(lvcc, 0, n); + pad = n - skb->len; + vcc_tx_memcpy(lvcc, skb->data, skb->len); + vcc_tx_memzero(lvcc, pad - 8); + vcc_tx_add_aal5trailer(lvcc, skb->len, 0, 0); + lanai_free_skb(lvcc->tx.atmvcc, skb); + atomic_inc(&lvcc->tx.atmvcc->stats->tx); + } else { /* Space for only part of skb */ + int bytes = aal5_spacefor(space - 16); /* Bytes to send */ + vcc_tx_add_aal5_descriptor(lvcc, + DESCRIPTOR_AAL5_STREAM, bytes); + pad = bytes - skb->len; + if (pad < 0) + pad = 0; + vcc_tx_memcpy(lvcc, skb->data, bytes - pad); + vcc_tx_memzero(lvcc, pad); + lvcc->tx.inprogress = skb; + lvcc->tx.inprogleft = n - bytes; + lvcc->tx.pptr = skb->data + bytes; + vcc_mark_backlogged(lanai, lvcc); + } + lanai_endtx(lanai, lvcc); + return; + queue_it: + skb_queue_tail(&lvcc->tx.backlog, skb); +} + +static void vcc_tx_unqueue_aal0(struct lanai_dev *lanai, + struct lanai_vcc *lvcc, int endptr) +{ + printk(KERN_INFO DEV_LABEL + ": vcc_tx_unqueue_aal0: not implemented\n"); +} + +static void vcc_tx_aal0(struct lanai_dev *lanai, struct lanai_vcc *lvcc, + struct sk_buff *skb) +{ + printk(KERN_INFO DEV_LABEL ": vcc_tx_aal0: not implemented\n"); + /* Remember to increment lvcc->tx.atmvcc->stats->tx */ + lanai_free_skb(lvcc->tx.atmvcc, skb); +} + +/* Try to undequeue 1 backlogged vcc */ +static void iter_dequeue(struct lanai_dev *lanai, vci_t vci) +{ + struct lanai_vcc *lvcc = lanai->vccs[vci]; + int endptr; + if (lvcc == NULL || !vcc_is_backlogged(lvcc)) { + vci_bitfield_clear(&lanai->backlog_vccs, vci); + return; + } + endptr = TXREADPTR_GET_PTR(cardvcc_read(lvcc, vcc_txreadptr)); + lvcc->tx.unqueue(lanai, lvcc, endptr); +} + +/* Try a dequeue on all backlogged connections */ +static inline void vcc_tx_dequeue_all(struct lanai_dev *lanai) +{ + unsigned long flags; + spin_lock_irqsave(&lanai->txlock, flags); + vci_bitfield_iterate(lanai, &lanai->backlog_vccs, iter_dequeue); + spin_unlock_irqrestore(&lanai->txlock, flags); +} + +/* -------------------- VCC RX BUFFER UTILITIES: */ + +/* unlike the _tx_ cousins, this doesn't update ptr */ +static inline void vcc_rx_memcpy(unsigned char *dest, + const struct lanai_vcc *lvcc, int n) +{ + int m = ((const unsigned char *) lvcc->rx.buf.ptr) + n - + ((const unsigned char *) (lvcc->rx.buf.end)); + if (m < 0) + m = 0; + memcpy(dest, lvcc->rx.buf.ptr, n - m); + memcpy(dest + n - m, lvcc->rx.buf.start, m); +} + +/* Receive AAL5 data on a VCC with a particular endptr */ +static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr) +{ + int size; + struct sk_buff *skb; + /*const*/ u32 *x, *end = &lvcc->rx.buf.start[endptr * 4]; + int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr); + if (n < 0) + n += lanai_buf_size(&lvcc->rx.buf); + APRINTK(n >= 0 && n < lanai_buf_size(&lvcc->rx.buf) && !(n & 15), + "vcc_rx_aal5: n out of range (%d/%d)\n", + n, lanai_buf_size(&lvcc->rx.buf)); + /* Recover the second-to-last word to get true pdu length */ + if ((x = &end[-2]) < lvcc->rx.buf.start) + x = &lvcc->rx.buf.end[-2]; + size = be32_to_cpup(x) & 0xffff; + if (n != aal5_size(size)) { /* Make sure size matches padding */ + printk(KERN_INFO DEV_LABEL "(itf %d): Got bad AAL5 length " + "on vci=%d - size=%d n=%d\n", + lvcc->rx.atmvcc->dev->number, lvcc->vci, size, n); + lvcc->stats.x.aal5.rx_badlen++; + goto out; + } + skb = atm_alloc_charge(lvcc->rx.atmvcc, size, GFP_ATOMIC); + if (skb == NULL) { + lvcc->stats.rx_nomem++; + goto out; + } + skb_put(skb, size); + ATM_SKB(skb)->vcc = lvcc->rx.atmvcc; + skb->stamp = xtime; + vcc_rx_memcpy(skb->data, lvcc, size); + lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb); + atomic_inc(&lvcc->rx.atmvcc->stats->rx); + out: + lvcc->rx.buf.ptr = end; + cardvcc_write(lvcc, endptr, vcc_rxreadptr); +} + +static void vcc_rx_aal0(struct lanai_dev *lanai) +{ + printk(KERN_INFO DEV_LABEL ": vcc_rx_aal0: not implemented\n"); + /* Remember to get vcclist_read_lock while looking up VC */ + /* Remember to increment lvcc->rx.atmvcc->stats->rx */ +} + +/* -------------------- MANAGING HOST-BASED VCC TABLE: */ + +/* Decide whether to use vmalloc or get_free_page for VCC table */ +#if (NUM_VCI * BITS_PER_LONG) <= PAGE_SIZE +#define VCCTABLE_GETFREEPAGE +#else +#include +#endif + +static int __init vcc_table_allocate(struct lanai_dev *lanai) +{ +#ifdef VCCTABLE_GETFREEPAGE + APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE, + "vcc table > PAGE_SIZE!"); + lanai->vccs = (struct lanai_vcc **) get_free_page(GFP_KERNEL); + return (lanai->vccs == NULL) ? -ENOMEM : 0; +#else + int bytes = (lanai->num_vci) * sizeof(struct lanai_vcc *); + lanai->vccs = (struct lanai_vcc **) vmalloc(bytes); + if (lanai->vccs == NULL) + return -ENOMEM; + memset(lanai->vccs, 0, bytes); + return 0; +#endif +} + +static inline void vcc_table_deallocate(const struct lanai_dev *lanai) +{ +#ifdef VCCTABLE_GETFREEPAGE + free_page((unsigned long) lanai->vccs); +#else + vfree(lanai->vccs); +#endif +} + +/* Allocate a fresh lanai_vcc, with the appropriate things cleared */ +static inline struct lanai_vcc *new_lanai_vcc(void) +{ + struct lanai_vcc *lvcc; + lvcc = (struct lanai_vcc *) kmalloc(sizeof(*lvcc), GFP_KERNEL); + if (lvcc != NULL) { + lvcc->vbase = 0; + lvcc->rx.atmvcc = lvcc->tx.atmvcc = NULL; + lvcc->nref = 0; + memset(&lvcc->stats, 0, sizeof lvcc->stats); + lvcc->rx.buf.start = lvcc->tx.buf.start = NULL; + skb_queue_head_init(&lvcc->tx.backlog); + lvcc->tx.inprogress = NULL; +#ifdef DEBUG + lvcc->tx.unqueue = NULL; + lvcc->vci = -1; +#endif + } + return lvcc; +} + +static int lanai_get_sized_buffer(int number, struct lanai_buffer *buf, + int max_sdu, int multiplier, int min, const char *name) +{ + int size; + if (max_sdu < 1) + max_sdu = 1; + max_sdu = aal5_size(max_sdu); + size = (max_sdu + 16) * multiplier + 16; + lanai_buf_allocate(buf, size, min); + if (buf->order < 0) + return -ENOMEM; + if (lanai_buf_size(buf) < size) + printk(KERN_WARNING DEV_LABEL "(itf %d): wanted %d bytes " + "for %s buffer, got only %d\n", number, size, name, + lanai_buf_size(buf)); + DPRINTK("Allocated %d byte %s buffer\n", lanai_buf_size(buf), name); + return 0; +} + +/* Setup a RX buffer for a currently unbound AAL5 vci */ +static inline int lanai_setup_rx_vci_aal5(int number, struct lanai_vcc *lvcc, + const struct atm_qos *qos) +{ + return lanai_get_sized_buffer(number, &lvcc->rx.buf, + qos->rxtp.max_sdu, AAL5_RX_MULTIPLIER, qos->rxtp.max_sdu + 32, + "RX"); +} + +/* Setup a TX buffer for a currently unbound AAL5 vci */ +static int lanai_setup_tx_vci(int number, struct lanai_vcc *lvcc, + const struct atm_qos *qos) +{ + int max_sdu, multiplier; + if (qos->aal == ATM_AAL0) { + lvcc->tx.unqueue = vcc_tx_unqueue_aal0; + max_sdu = ATM_CELL_SIZE - 1; + multiplier = AAL0_TX_MULTIPLIER; + } else { + lvcc->tx.unqueue = vcc_tx_unqueue_aal5; + max_sdu = qos->txtp.max_sdu; + multiplier = AAL5_TX_MULTIPLIER; + } + return lanai_get_sized_buffer(number, &lvcc->tx.buf, max_sdu, + multiplier, 80, "TX"); +} + +static inline void host_vcc_bind(struct lanai_dev *lanai, + struct lanai_vcc *lvcc, vci_t vci) +{ + if (lvcc->vbase != 0) + return; /* We already were bound in the other direction */ + DPRINTK("Binding vci %d\n", vci); +#ifdef USE_POWERDOWN + if (lanai->nbound++ == 0) { + DPRINTK("Coming out of powerdown\n"); + lanai->conf1 &= ~CONFIG1_POWERDOWN; + conf1_write(lanai); + conf2_write(lanai); + } +#endif + lvcc->vbase = cardvcc_addr(lanai, vci); + lanai->vccs[lvcc->vci = vci] = lvcc; +} + +static inline void host_vcc_unbind(struct lanai_dev *lanai, + struct lanai_vcc *lvcc) +{ + if (lvcc->vbase == 0) + return; /* This vcc was never bound */ + DPRINTK("Unbinding vci %d\n", lvcc->vci); + lvcc->vbase = 0; + lanai->vccs[lvcc->vci] = NULL; +#ifdef USE_POWERDOWN + if (--lanai->nbound == 0) { + DPRINTK("Going into powerdown\n"); + lanai->conf1 |= CONFIG1_POWERDOWN; + conf1_write(lanai); + } +#endif +} + +/* -------------------- RESET CARD: */ + +static void lanai_reset(struct lanai_dev *lanai) +{ + printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* reseting - not " + "implemented\n", lanai->number); + /* TODO */ + /* The following is just a hack until we write the real + * resetter - at least ack whatever interrupt sent us + * here + */ + reg_write(lanai, INT_ALL, IntAck_Reg); + lanai->stats.card_reset++; +} + +/* -------------------- SERVICE LIST UTILITIES: */ + +/* + * Allocate service buffer and tell card about it + */ +static int __init service_buffer_allocate(struct lanai_dev *lanai) +{ + lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 0); + if (lanai->service.order < 0) + return -ENOMEM; + DPRINTK("allocated service buffer at 0x%08lX, size %d(%d)\n", + (unsigned long) lanai->service.start, + lanai_buf_size(&lanai->service), + lanai_buf_size_cardorder(&lanai->service)); + /* Clear ServWrite register to be safe */ + reg_write(lanai, 0, ServWrite_Reg); + /* ServiceStuff register contains size and address of buffer */ + reg_write(lanai, + SSTUFF_SET_SIZE(lanai_buf_size_cardorder(&lanai->service)) | + SSTUFF_SET_ADDR(lanai_buf_dmaaddr(&lanai->service)), + ServiceStuff_Reg); + return 0; +} + +static inline void service_buffer_deallocate(struct lanai_dev *lanai) +{ + lanai_buf_deallocate(&lanai->service); +} + +/* Bitfields in service list */ +#define SERVICE_TX (0x80000000) /* Was from transmission */ +#define SERVICE_TRASH (0x40000000) /* RXed PDU was trashed */ +#define SERVICE_CRCERR (0x20000000) /* RXed PDU had CRC error */ +#define SERVICE_CI (0x10000000) /* RXed PDU had CI set */ +#define SERVICE_CLP (0x08000000) /* RXed PDU had CLP set */ +#define SERVICE_STREAM (0x04000000) /* RX Stream mode */ +#define SERVICE_GET_VCI(x) (((x)>>16)&0x3FF) +#define SERVICE_GET_END(x) ((x)&0x1FFF) + +/* Handle one thing from the service list - returns true if it marked a + * VCC ready for xmit + */ +static int handle_service(struct lanai_dev *lanai, u32 s) +{ + vci_t vci = SERVICE_GET_VCI(s); + struct lanai_vcc *lvcc; + vcclist_read_lock(); + lvcc = lanai->vccs[vci]; + if (lvcc == NULL) { + vcclist_read_unlock(); + DPRINTK("(itf %d) got service entry 0x%X for nonexistent " + "vcc %d\n", lanai->number, s, vci); + if (s & SERVICE_TX) + lanai->stats.service_novcc_tx++; + else + lanai->stats.service_novcc_rx++; + return 0; + } + if (s & SERVICE_TX) { /* segmentation interrupt */ + if (lvcc->tx.atmvcc == NULL) { + vcclist_read_unlock(); + DPRINTK("(itf %d) got service entry 0x%X for non-TX " + "vcc %d\n", lanai->number, s, vci); + lanai->stats.service_notx++; + return 0; + } + vci_bitfield_set(&lanai->transmit_ready, vci); + lvcc->tx.endptr = SERVICE_GET_END(s); + vcclist_read_unlock(); + return 1; + } + if (lvcc->rx.atmvcc == NULL) { + vcclist_read_unlock(); + DPRINTK("(itf %d) got service entry 0x%X for non-RX " + "vcc %d\n", lanai->number, s, vci); + lanai->stats.service_norx++; + return 0; + } + if (lvcc->rx.atmvcc->qos.aal != ATM_AAL5) { + vcclist_read_unlock(); + DPRINTK("(itf %d) got RX service entry 0x%X for non-AAL5 " + "vcc %d\n", lanai->number, s, vci); + lanai->stats.service_rxnotaal5++; + atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); + return 0; + } + if ((s & (SERVICE_TRASH | SERVICE_STREAM | SERVICE_CRCERR)) == 0) { + vcc_rx_aal5(lvcc, SERVICE_GET_END(s)); + vcclist_read_unlock(); + return 0; + } + if (s & SERVICE_TRASH) { + int bytes; + vcclist_read_unlock(); + DPRINTK("got trashed rx pdu on vci %d\n", vci); + atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); + lvcc->stats.x.aal5.service_trash++; + bytes = (SERVICE_GET_END(s) * 16) - + (((unsigned long) lvcc->rx.buf.ptr) - + ((unsigned long) lvcc->rx.buf.start)) + 47; + if (bytes < 0) + bytes += lanai_buf_size(&lvcc->rx.buf); + lanai->stats.ovfl_trash += (bytes / 48); + return 0; + } + if (s & SERVICE_STREAM) { + vcclist_read_unlock(); + atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); + lvcc->stats.x.aal5.service_stream++; + printk(KERN_ERR DEV_LABEL "(itf %d): Got AAL5 stream " + "PDU on VCI %d!\n", lanai->number, vci); + lanai_reset(lanai); + return 0; + } + DPRINTK("got rx crc error on vci %d\n", vci); + atomic_inc(&lvcc->rx.atmvcc->stats->rx_err); + lvcc->stats.x.aal5.service_rxcrc++; + lvcc->rx.buf.ptr = &lvcc->rx.buf.start[SERVICE_GET_END(s) * 4]; + cardvcc_write(lvcc, SERVICE_GET_END(s), vcc_rxreadptr); + vcclist_read_unlock(); + return 0; +} + +/* Try transmitting on all VCIs that we marked ready to serve */ +static void iter_transmit(struct lanai_dev *lanai, vci_t vci) +{ + struct lanai_vcc *lvcc = lanai->vccs[vci]; + if (!vcc_is_backlogged(lvcc)) + return; + lvcc->tx.unqueue(lanai, lvcc, lvcc->tx.endptr); +} + +/* Run service queue -- called from interrupt context or with + * interrupts otherwise disabled and with the lanai->servicelock + * lock held + */ +static void run_service(struct lanai_dev *lanai) +{ + int ntx = 0; + u32 wreg = reg_read(lanai, ServWrite_Reg); + const u32 *end = lanai->service.start + wreg; + while (lanai->service.ptr != end) { + ntx += handle_service(lanai, + le32_to_cpup(lanai->service.ptr++)); + if (lanai->service.ptr >= lanai->service.end) + lanai->service.ptr = lanai->service.start; + } + reg_write(lanai, wreg, ServRead_Reg); + if (ntx != 0) { + spin_lock(&lanai->txlock); + vcclist_read_lock(); + vci_bitfield_iterate(lanai, &lanai->transmit_ready, + iter_transmit); + vci_bitfield_init(&lanai->transmit_ready); + vcclist_read_unlock(); + spin_unlock(&lanai->txlock); + } +} + +/* -------------------- GATHER STATISTICS: */ + +static void get_statistics(struct lanai_dev *lanai) +{ + u32 statreg = reg_read(lanai, Statistics_Reg); + lanai->stats.atm_ovfl += STATS_GET_FIFO_OVFL(statreg); + lanai->stats.hec_err += STATS_GET_HEC_ERR(statreg); + lanai->stats.vci_trash += STATS_GET_BAD_VCI(statreg); + lanai->stats.ovfl_trash += STATS_GET_BUF_OVFL(statreg); +} + +/* -------------------- POLLING TIMER: */ + +static void lanai_timed_poll(unsigned long arg) +{ +#ifndef DEBUG_RW + struct lanai_dev *lanai = (struct lanai_dev *) arg; + unsigned long flags; +#ifdef USE_POWERDOWN + if (lanai->conf1 & CONFIG1_POWERDOWN) + return; +#endif + spin_lock_irqsave(&lanai->servicelock, flags); + run_service(lanai); + spin_unlock_irqrestore(&lanai->servicelock, flags); + vcc_tx_dequeue_all(lanai); + get_statistics(lanai); + mod_timer(&lanai->timer, jiffies + LANAI_POLL_PERIOD); +#endif /* DEBUG_RW */ +} + +static inline void lanai_timed_poll_start(struct lanai_dev *lanai) +{ + init_timer(&lanai->timer); + lanai->timer.expires = jiffies + LANAI_POLL_PERIOD; + lanai->timer.data = (unsigned long) lanai; + lanai->timer.function = lanai_timed_poll; + add_timer(&lanai->timer); +} + +static inline void lanai_timed_poll_stop(struct lanai_dev *lanai) +{ + del_timer(&lanai->timer); +} + +/* -------------------- INTERRUPT SERVICE: */ + +static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason) +{ + u32 ack = 0; + if (reason & INT_SERVICE) { + ack = INT_SERVICE; + spin_lock(&lanai->servicelock); + run_service(lanai); + spin_unlock(&lanai->servicelock); + } + if (reason & (INT_AAL0_STR | INT_AAL0)) { + ack |= reason & (INT_AAL0_STR | INT_AAL0); + vcc_rx_aal0(lanai); + } + if (reason & INT_STATS) { + reason &= ~INT_STATS; /* No need to ack */ + get_statistics(lanai); + } + if (reason & INT_STATUS) { + ack |= reason & INT_STATUS; + lanai_check_status(lanai); + } + if (reason & INT_DMASHUT) { + printk(KERN_ERR DEV_LABEL "(itf %d): driver error - DMA " + "shutdown, reason=0x%08X, address=0x%08X\n", + lanai->number, reason & INT_DMASHUT, + reg_read(lanai, DMA_Addr_Reg)); + if (reason & INT_TABORTBM) { + lanai_reset(lanai); + return; + } + ack |= (reason & INT_DMASHUT); + printk(KERN_ERR DEV_LABEL "(itf %d): re-enabling DMA\n", + lanai->number); + conf1_write(lanai); + lanai->stats.dma_reenable++; + pcistatus_check(lanai, 0); + } + if (reason & INT_TABORTSENT) { + ack |= (reason & INT_TABORTSENT); + printk(KERN_ERR DEV_LABEL "(itf %d): sent PCI target abort\n", + lanai->number); + pcistatus_check(lanai, 0); + } + if (reason & INT_SEGSHUT) { + printk(KERN_ERR DEV_LABEL "(itf %d): driver error - " + "segmentation shutdown, reason=0x%08X\n", lanai->number, + reason & INT_SEGSHUT); + lanai_reset(lanai); + return; + } + if (reason & (INT_PING | INT_WAKE)) { + printk(KERN_ERR DEV_LABEL "(itf %d): driver error - " + "unexpected interrupt 0x%08X, resetting\n", + lanai->number, reason & (INT_PING | INT_WAKE)); + lanai_reset(lanai); + return; + } +#ifdef DEBUG + if (ack != reason) { + DPRINTK("unacked ints: 0x%08X\n", reason & ~ack); + ack = reason; + } +#endif + if (ack != 0) + reg_write(lanai, ack, IntAck_Reg); +} + +static void lanai_int(int irq, void *devid, struct pt_regs *regs) +{ + struct lanai_dev *lanai = (struct lanai_dev *) devid; + u32 reason; + (void) irq; (void) regs; /* unused variables */ +#ifdef USE_POWERDOWN + if (lanai->conf1 & CONFIG1_POWERDOWN) { + lanai->conf1 &= ~CONFIG1_POWERDOWN; + conf1_write(lanai); + printk(KERN_WARNING DEV_LABEL "(itf %d): Got interrupt " + "0x%08X while in POWERDOWN, powering up\n", lanai->conf1, + intr_pending(lanai)); + conf2_write(lanai); + } +#endif + while ((reason = intr_pending(lanai)) != 0) + lanai_int_1(lanai, reason); +} + +/* TODO - it would be nice if we could use the "delayed interrupt" system + * to some advantage + */ + +/* -------------------- CHECK BOARD ID/REV: */ + +/* + * The board id and revision are stored both in the reset register and + * in the PCI configuration space - the documentation says to check + * each of them. If revp!=NULL we store the revision there + */ +static int check_board_id_and_rev(const char *name, u32 val, int *revp) +{ + DPRINTK("%s says board_id=%d, board_rev=%d\n", name, + RESET_GET_BOARD_ID(val), RESET_GET_BOARD_REV(val)); + if (RESET_GET_BOARD_ID(val) != BOARD_ID_LANAI256) { + printk(KERN_ERR DEV_LABEL ": Found %s board-id %d -- not a " + "Lanai 25.6\n", name, RESET_GET_BOARD_ID(val)); + return -ENODEV; + } + if (revp != NULL) + *revp = RESET_GET_BOARD_REV(val); + return 0; +} + +/* -------------------- PCI INITIALIZATION/SHUTDOWN: */ + +static inline int __init lanai_pci_start(struct lanai_dev *lanai) +{ + struct pci_dev *pci = lanai->pci; + int result; + u16 w; + /* Get the pci revision byte */ + result = pci_read_config_byte(pci, PCI_REVISION_ID, + &lanai->pci_revision); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't read " + "PCI_REVISION_ID: %d\n", lanai->number, result); + return -EINVAL; + } + result = pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &w); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't read "" + PCI_SUBSYSTEM_ID: %d\n", lanai->number, result); + return -EINVAL; + } + if ((result = check_board_id_and_rev("PCI", w, NULL)) != 0) + return result; + /* Set latency timer to zero as per lanai docs */ + result = pci_write_config_byte(pci, PCI_LATENCY_TIMER, 0); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't write " + "PCI_LATENCY_TIMER: %d\n", lanai->number, result); + return -EINVAL; + } + result = pci_read_config_word(pci, PCI_COMMAND, &w); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't read " + "PCI_COMMAND: %d\n", lanai->number, result); + return -EINVAL; + } + w |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_SERR | + PCI_COMMAND_PARITY); + result = pci_write_config_word(pci, PCI_COMMAND, w); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't " + "write PCI_COMMAND: %d\n", lanai->number, result); + return -EINVAL; + } + pcistatus_check(lanai, 1); + pcistatus_check(lanai, 0); + return 0; +} + +static void lanai_pci_stop(struct lanai_dev *lanai) +{ + struct pci_dev *pci = lanai->pci; + int result; + u16 pci_command; + result = pci_read_config_word(pci, PCI_COMMAND, &pci_command); + if (result != PCIBIOS_SUCCESSFUL) { + printk(KERN_ERR DEV_LABEL "(itf %d): can't " + "read PCI_COMMAND: %d\n", lanai->number, result); + return; + } + pci_command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); + result = pci_write_config_word(pci, PCI_COMMAND, pci_command); + if (result != PCIBIOS_SUCCESSFUL) + printk(KERN_ERR DEV_LABEL "(itf %d): can't " + "write PCI_COMMAND: %d\n", lanai->number, result); +} + +/* -------------------- VPI/VCI ALLOCATION: */ + +/* + * We _can_ use VCI==0 for normal traffic, but only for UBR (or we'll + * get a CBRZERO interrupt), and we can use it only if noone is receiving + * AAL0 traffic (since they will use the same queue) - according to the + * docs we shouldn't even use it for AAL0 traffic + */ +static inline int vci0_is_ok(struct lanai_dev *lanai, + const struct atm_qos *qos) +{ + if (qos->txtp.traffic_class == ATM_CBR || qos->aal == ATM_AAL0) + return 0; + if (qos->rxtp.traffic_class != ATM_NONE) { + if (lanai->naal0 != 0) + return 0; + lanai->conf2 |= CONFIG2_VCI0_NORMAL; +#ifdef USE_POWERDOWN + if ((lanai->conf1 & CONFIG1_POWERDOWN) == 0) +#endif + conf2_write(lanai); + } + return 1; +} + +/* return true if vci is currently unused, or if requested qos is + * compatible + */ +static int vci_is_ok(struct lanai_dev *lanai, vci_t vci, + const struct atm_vcc *atmvcc) +{ + const struct atm_qos *qos = &atmvcc->qos; + const struct lanai_vcc *lvcc = lanai->vccs[vci]; + if (vci == 0 && !vci0_is_ok(lanai, qos)) + return 0; + if (lvcc != NULL) { + if (qos->rxtp.traffic_class != ATM_NONE && + lvcc->rx.atmvcc != NULL && lvcc->rx.atmvcc != atmvcc) + return 0; + if (qos->txtp.traffic_class != ATM_NONE && + lvcc->tx.atmvcc != NULL && lvcc->tx.atmvcc != atmvcc) + return 0; + if (qos->txtp.traffic_class == ATM_CBR && + lanai->cbrvcc != NULL && lanai->cbrvcc != atmvcc) + return 0; + } + if (qos->aal == ATM_AAL0 && lanai->naal0 == 0 && + qos->rxtp.traffic_class != ATM_NONE) { + const struct lanai_vcc *vci0 = lanai->vccs[0]; + if (vci0 != NULL && vci0->rx.atmvcc != NULL) + return 0; + lanai->conf2 &= ~CONFIG2_VCI0_NORMAL; +#ifdef USE_POWERDOWN + if ((lanai->conf1 & CONFIG1_POWERDOWN) == 0) +#endif + conf2_write(lanai); + } + return 1; +} + +static int lanai_normalize_ci(struct lanai_dev *lanai, + const struct atm_vcc *atmvcc, short *vpip, vci_t *vcip) +{ + switch (*vpip) { + case ATM_VPI_ANY: + *vpip = 0; + /* FALLTHROUGH */ + case 0: + break; + default: + return -EADDRINUSE; + } + switch (*vcip) { + case ATM_VCI_ANY: + for (*vcip = ATM_NOT_RSV_VCI; *vcip < lanai->num_vci; + (*vcip)++) + if (vci_is_ok(lanai, *vcip, atmvcc)) + return 0; + return -EADDRINUSE; + default: + if (*vcip >= lanai->num_vci || *vcip < 0 || + !vci_is_ok(lanai, *vcip, atmvcc)) + return -EADDRINUSE; + } + return 0; +} + +/* -------------------- MANAGE CBR: */ + +/* + * CBR ICG is stored as a fixed-point number with 4 fractional bits. + * Note that storing a number greater than 2046.0 will result in + * incorrect shaping + */ +#define CBRICG_FRAC_BITS (4) +#define CBRICG_MAX (2046 << CBRICG_FRAC_BITS) + +/* + * ICG is related to PCR with the formula PCR = MAXPCR / (ICG + 1) + * where MAXPCR is (according to the docs) 25600000/(54*8), + * which is equal to (3125<<9)/27. + * + * Solving for ICG, we get: + * ICG = MAXPCR/PCR - 1 + * ICG = (3125<<9)/(27*PCR) - 1 + * ICG = ((3125<<9) - (27*PCR)) / (27*PCR) + * + * The end result is supposed to be a fixed-point number with FRAC_BITS + * bits of a fractional part, so we keep everything in the numerator + * shifted by that much as we compute + * + */ +static int pcr_to_cbricg(/*const*/ struct atm_qos *qos) +{ + int rounddown = 0; /* 1 = Round PCR down, i.e. round ICG _up_ */ + int x, icg, pcr = atm_pcr_goal(&qos->txtp); + if (pcr == 0) /* Use maximum bandwidth */ + return 0; + if (pcr < 0) { + rounddown = 1; + pcr = -pcr; + } + x = pcr * 27; + icg = (3125 << (9 + CBRICG_FRAC_BITS)) - (x << CBRICG_FRAC_BITS); + if (rounddown) + icg += x - 1; + icg /= x; + if (icg > CBRICG_MAX) + icg = CBRICG_MAX; + DPRINTK("pcr_to_cbricg: pcr=%d rounddown=%c icg=%d\n", + pcr, rounddown ? 'Y' : 'N', icg); + return icg; +} + +static inline void lanai_cbr_setup(struct lanai_dev *lanai) +{ + reg_write(lanai, pcr_to_cbricg(&lanai->cbrvcc->qos), CBR_ICG_Reg); + reg_write(lanai, lanai->cbrvcc->vci, CBR_PTR_Reg); + lanai->conf2 |= CONFIG2_CBR_ENABLE; + conf2_write(lanai); +} + +static inline void lanai_cbr_shutdown(struct lanai_dev *lanai) +{ + lanai->conf2 &= ~CONFIG2_CBR_ENABLE; + conf2_write(lanai); +} + +/* -------------------- OPERATIONS: */ + +/* setup a newly detected device */ +static int __init lanai_dev_open(struct atm_dev *atmdev) +{ + struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; + unsigned long raw_base; + int result; + + DPRINTK("In lanai_dev_open()\n"); + /* Basic device fields */ + lanai->number = atmdev->number; + lanai->num_vci = NUM_VCI; + vci_bitfield_init(&lanai->backlog_vccs); + vci_bitfield_init(&lanai->transmit_ready); + lanai->naal0 = 0; +#ifdef USE_POWERDOWN + lanai->nbound = 0; +#endif + lanai->cbrvcc = NULL; + memset(&lanai->stats, 0, sizeof lanai->stats); + spin_lock_init(&lanai->txlock); + spin_lock_init(&lanai->servicelock); + atmdev->ci_range.vpi_bits = 0; + atmdev->ci_range.vci_bits = 0; + while (1 << atmdev->ci_range.vci_bits < lanai->num_vci) + atmdev->ci_range.vci_bits++; + atmdev->link_rate = ((25600000 / 8 - 8000) / 54); + + /* 3.2: PCI initialization */ + if ((result = lanai_pci_start(lanai)) != 0) + goto error; + raw_base = (bus_addr_t) lanai->pci->resource[0].start; + lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE); + if (lanai->base == 0) { + printk(KERN_ERR DEV_LABEL ": couldn't remap I/O space\n"); + goto error_pci; + } + /* 3.3: Reset lanai and PHY */ + reset_board(lanai); + lanai->conf1 = reg_read(lanai, Config1_Reg); + lanai->conf1 &= ~(CONFIG1_GPOUT1 | CONFIG1_POWERDOWN | + CONFIG1_MASK_LEDMODE); + lanai->conf1 |= CONFIG1_SET_LEDMODE(LEDMODE_NOT_SOOL); + reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg); + udelay(1000); + conf1_write(lanai); + + /* + * 3.4: Turn on endian mode for big-endian hardware + * We don't actually want to do this - the actual bit fields + * in the endian register are not documented anywhere. + * Instead we do the bit-flipping ourselves on big-endian + * hardware. + * + * 3.5: get the board ID/rev by reading the reset register + */ + result = check_board_id_and_rev("register", + reg_read(lanai, Reset_Reg), &lanai->board_rev); + if (result != 0) + goto error_unmap; + + /* 3.6: read EEPROM */ + if ((result = eeprom_read(lanai)) != 0) + goto error_unmap; + if ((result = eeprom_validate(lanai)) != 0) + goto error_unmap; + + /* 3.7: re-reset PHY, do loopback tests, setup PHY */ + reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg); + udelay(1000); + conf1_write(lanai); + /* TODO - loopback tests */ + lanai->conf1 |= (CONFIG1_GPOUT2 | CONFIG1_GPOUT3 | CONFIG1_DMA_ENABLE); + conf1_write(lanai); + + /* 3.8/3.9: test and initialize card SRAM */ + if ((result = sram_test_and_clear(lanai)) != 0) + goto error_unmap; + + /* 3.10: initialize lanai registers */ + lanai->conf1 |= CONFIG1_DMA_ENABLE; + conf1_write(lanai); + if ((result = service_buffer_allocate(lanai)) != 0) + goto error_unmap; + if ((result = vcc_table_allocate(lanai)) != 0) + goto error_service; + lanai->conf2 = (lanai->num_vci >= 512 ? CONFIG2_HOWMANY : 0) | + CONFIG2_HEC_DROP | /* ??? */ CONFIG2_PTI7_MODE; + conf2_write(lanai); + reg_write(lanai, TX_FIFO_DEPTH, TxDepth_Reg); + reg_write(lanai, 0, CBR_ICG_Reg); /* CBR defaults to no limit */ + if ((result = request_irq(lanai->pci->irq, lanai_int, SA_SHIRQ, + "lanai", lanai)) != 0) { + printk(KERN_ERR DEV_LABEL ": can't allocate interrupt\n"); + goto error_vcctable; + } + MOD_INC_USE_COUNT; /* At this point we can't fail */ + intr_enable(lanai, INT_ALL & ~(INT_PING | INT_WAKE)); + /* 3.11: initialize loop mode (i.e. turn looping off) */ + lanai->conf1 = (lanai->conf1 & ~CONFIG1_MASK_LOOPMODE) | + CONFIG1_SET_LOOPMODE(LOOPMODE_NORMAL) | + CONFIG1_GPOUT2 | CONFIG1_GPOUT3; + conf1_write(lanai); + lanai->status = reg_read(lanai, Status_Reg); + /* We're now done initializing this card */ +#ifdef USE_POWERDOWN + lanai->conf1 |= CONFIG1_POWERDOWN; + conf1_write(lanai); +#endif + memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN); + lanai_timed_poll_start(lanai); + printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d, base=0x%lx, irq=%d " + "(%02X-%02X-%02X-%02X-%02X-%02X)\n", lanai->number, + lanai->pci_revision, (long) lanai->base, lanai->pci->irq, + atmdev->esi[0], atmdev->esi[1], atmdev->esi[2], + atmdev->esi[3], atmdev->esi[4], atmdev->esi[5]); + printk(KERN_NOTICE DEV_LABEL "(itf %d): LANAI%s, serialno=%d(0x%X), " + "board_rev=%d\n", lanai->number, + lanai->type==lanai2 ? "2" : "HB", lanai->serialno, + lanai->serialno, lanai->board_rev); + return 0; + + error_vcctable: + vcc_table_deallocate(lanai); + error_service: + service_buffer_deallocate(lanai); + error_unmap: + reset_board(lanai); +#ifdef USE_POWERDOWN + lanai->conf1 = reg_read(lanai, Config1_Reg) | CONFIG1_POWERDOWN; + conf1_write(lanai); +#endif + iounmap((void *) lanai->base); + error_pci: + lanai_pci_stop(lanai); + error: + return result; +} + +/* called when device is being shutdown, and all vcc's are gone - higher + * levels will deallocate the atm device for us + */ +static void lanai_dev_close(struct atm_dev *atmdev) +{ + struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; + printk(KERN_INFO DEV_LABEL "(itf %d): shutting down interface\n", + lanai->number); + lanai_timed_poll_stop(lanai); +#ifdef USE_POWERDOWN + lanai->conf1 = reg_read(lanai, Config1_Reg) & ~CONFIG1_POWERDOWN; + conf1_write(lanai); +#endif + intr_disable(lanai, INT_ALL); + free_irq(lanai->pci->irq, lanai); + reset_board(lanai); +#ifdef USE_POWERDOWN + lanai->conf1 |= CONFIG1_POWERDOWN; + conf1_write(lanai); +#endif + lanai_pci_stop(lanai); + vcc_table_deallocate(lanai); + service_buffer_deallocate(lanai); + iounmap((void *) lanai->base); + kfree(lanai); + MOD_DEC_USE_COUNT; +} + +/* close a vcc */ +static void lanai_close(struct atm_vcc *atmvcc) +{ + struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data; + struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data; + if (lvcc == NULL) + return; + clear_bit(ATM_VF_READY, &atmvcc->flags); + clear_bit(ATM_VF_PARTIAL, &atmvcc->flags); + if (lvcc->rx.atmvcc == atmvcc) { + lanai_shutdown_rx_vci(lvcc); + if (atmvcc->qos.aal == ATM_AAL0) { + if (--lanai->naal0 <= 0) + aal0_buffer_free(lanai); + } else + lanai_buf_deallocate(&lvcc->rx.buf); + lvcc->rx.atmvcc = NULL; + } + if (lvcc->tx.atmvcc == atmvcc) { + if (atmvcc == lanai->cbrvcc) { + if (lvcc->vbase != 0) + lanai_cbr_shutdown(lanai); + lanai->cbrvcc = NULL; + } + lanai_shutdown_tx_vci(lanai, lvcc); + lanai_buf_deallocate(&lvcc->tx.buf); + lvcc->tx.atmvcc = NULL; + } + if (--lvcc->nref == 0) { + host_vcc_unbind(lanai, lvcc); + kfree(lvcc); + } + atmvcc->dev_data = NULL; + clear_bit(ATM_VF_ADDR, &atmvcc->flags); +} + +/* open a vcc on the card to vpi/vci */ +static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci) +{ + struct lanai_dev *lanai; + struct lanai_vcc *lvcc; + int result = 0; + /* we don't support partial open - it's not really useful anyway */ + if ((test_bit(ATM_VF_PARTIAL, &atmvcc->flags)) || + (vpi == ATM_VPI_UNSPEC) || (vci == ATM_VCI_UNSPEC)) + return -EINVAL; + lanai = (struct lanai_dev *) atmvcc->dev->dev_data; + if ((result = lanai_normalize_ci(lanai, atmvcc, &vpi, &vci)) != 0) + goto out; + atmvcc->vpi = vpi; + atmvcc->vci = vci; + set_bit(ATM_VF_ADDR, &atmvcc->flags); + lvcc = lanai->vccs[vci]; + if (atmvcc->qos.aal != ATM_AAL0 && atmvcc->qos.aal != ATM_AAL5) + return -EINVAL; +#if 0 + DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%X\n", + lanai->number, vpi, vci, (unsigned long) atmvcc->flags); +#else + DPRINTK(DEV_LABEL "(itf %d): open %d.%d\n", lanai->number, vpi, vci); +#endif + if (lvcc == NULL && (lvcc = new_lanai_vcc()) == NULL) + return -ENOMEM; + atmvcc->dev_data = lvcc; + lvcc->nref++; + if (atmvcc->qos.rxtp.traffic_class != ATM_NONE) { + APRINTK(lvcc->rx.atmvcc == NULL, "rx.atmvcc!=NULL, vci=%d\n", + vci); + if (atmvcc->qos.aal == ATM_AAL0) { + if (lanai->naal0 == 0) + result = aal0_buffer_allocate(lanai); + } else + result = lanai_setup_rx_vci_aal5( + lanai->number, lvcc, &atmvcc->qos); + if (result != 0) + goto out_free; + lvcc->rx.atmvcc = atmvcc; + lvcc->stats.rx_nomem = 0; + lvcc->stats.x.aal5.rx_badlen = 0; + lvcc->stats.x.aal5.service_trash = 0; + lvcc->stats.x.aal5.service_stream = 0; + lvcc->stats.x.aal5.service_rxcrc = 0; + if (atmvcc->qos.aal == ATM_AAL0) + lanai->naal0++; + } + if (atmvcc->qos.txtp.traffic_class != ATM_NONE) { + APRINTK(lvcc->tx.atmvcc == NULL, "tx.atmvcc!=NULL, vci=%d\n", + vci); + result = lanai_setup_tx_vci(lanai->number, lvcc, &atmvcc->qos); + if (result != 0) + goto out_free; + lvcc->tx.atmvcc = atmvcc; + if (atmvcc->qos.txtp.traffic_class == ATM_CBR) { + APRINTK(lanai->cbrvcc == NULL, + "cbrvcc!=NULL, vci=%d\n", vci); + lanai->cbrvcc = atmvcc; + } + } + host_vcc_bind(lanai, lvcc, vci); + if (atmvcc == lvcc->rx.atmvcc) + host_vcc_start_rx(lvcc); + if (atmvcc == lvcc->tx.atmvcc) { + host_vcc_start_tx(lvcc); + if (lanai->cbrvcc == atmvcc) + lanai_cbr_setup(lanai); + } + set_bit(ATM_VF_READY, &atmvcc->flags); + return 0; + out_free: + lanai_close(atmvcc); + out: + return result; +} + +/* ioctl operations for card */ +/* NOTE: these are all DEBUGGING ONLY currently */ +static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg) +{ + int result = 0; + struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; + switch(cmd) { + case 2106275: + shutdown_atm_dev(atmdev); + return 0; + case 2200000: { + unsigned long flags; + spin_lock_irqsave(&lanai->servicelock, flags); + run_service(lanai); + spin_unlock_irqrestore(&lanai->servicelock, flags); + return 0; } + case 2200001: + vcc_tx_dequeue_all(lanai); + return 0; + case 2200002: + get_statistics(lanai); + return 0; + case 2200003: { + int i; + for (i = 0; i <= 0x5C ; i += 4) { + if (i==0x48) /* Write-only butt reg */ + continue; + printk(KERN_CRIT DEV_LABEL " 0x%02X: " + "0x%08X\n", i, + (u32) readl(lanai->base + i)); + barrier(); mb(); + pcistatus_check(lanai, 0); + barrier(); mb(); + } + return 0; } + case 2200004: { + u8 b; + u16 w; + u32 dw; + struct pci_dev *pci = lanai->pci; + (void) pci_read_config_word(pci, PCI_VENDOR_ID, &w); + DPRINTK("vendor = 0x%X\n", w); + (void) pci_read_config_word(pci, PCI_DEVICE_ID, &w); + DPRINTK("device = 0x%X\n", w); + (void) pci_read_config_word(pci, PCI_COMMAND, &w); + DPRINTK("command = 0x%X\n", w); + (void) pci_read_config_word(pci, PCI_STATUS, &w); + DPRINTK("status = 0x%X\n", w); + (void) pci_read_config_dword(pci, + PCI_CLASS_REVISION, &dw); + DPRINTK("class/revision = 0x%X\n", dw); + (void) pci_read_config_byte(pci, + PCI_CACHE_LINE_SIZE, &b); + DPRINTK("cache line size = 0x%X\n", b); + (void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b); + DPRINTK("latency = %d (0x%X)\n", b, b); + (void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b); + DPRINTK("header type = 0x%X\n", b); + (void) pci_read_config_byte(pci, PCI_BIST, &b); + DPRINTK("bist = 0x%X\n", b); + /* skipping a few here */ + (void) pci_read_config_byte(pci, + PCI_INTERRUPT_LINE, &b); + DPRINTK("pci_int_line = 0x%X\n", b); + (void) pci_read_config_byte(pci, + PCI_INTERRUPT_PIN, &b); + DPRINTK("pci_int_pin = 0x%X\n", b); + (void) pci_read_config_byte(pci, PCI_MIN_GNT, &b); + DPRINTK("min_gnt = 0x%X\n", b); + (void) pci_read_config_byte(pci, PCI_MAX_LAT, &b); + DPRINTK("max_lat = 0x%X\n", b); } + return 0; +#ifdef USE_POWERDOWN + case 2200005: + DPRINTK("Coming out of powerdown\n"); + lanai->conf1 &= ~CONFIG1_POWERDOWN; + conf1_write(lanai); + return 0; +#endif + default: + result = -EINVAL; + } + return result; +} + +static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb) +{ + struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data; + struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data; + unsigned long flags; + if (lvcc == NULL || lvcc->vbase == 0 || lvcc->tx.atmvcc != atmvcc) + goto einval; +#ifdef DEBUG + if (skb == NULL) { + DPRINTK("lanai_send: skb==NULL for vci=%d\n", atmvcc->vci); + goto einval; + } + if (lanai == NULL) { + DPRINTK("lanai_send: lanai==NULL for vci=%d\n", atmvcc->vci); + goto einval; + } +#endif + ATM_SKB(skb)->vcc = atmvcc; + switch (atmvcc->qos.aal) { + case ATM_AAL5: + spin_lock_irqsave(&lanai->txlock, flags); + vcc_tx_aal5(lanai, lvcc, skb); + spin_unlock_irqrestore(&lanai->txlock, flags); + return 0; + case ATM_AAL0: + if (skb->len != ATM_CELL_SIZE-1) + goto einval; + /* NOTE - this next line is technically invalid - we haven't unshared skb */ + cpu_to_be32s((u32 *) skb->data); + spin_lock_irqsave(&lanai->txlock, flags); + vcc_tx_aal0(lanai, lvcc, skb); + spin_unlock_irqrestore(&lanai->txlock, flags); + return 0; + } + DPRINTK("lanai_send: bad aal=%d on vci=%d\n", atmvcc->qos.aal, + atmvcc->vci); + einval: + lanai_free_skb(atmvcc, skb); + return -EINVAL; +} + +static int lanai_change_qos(struct atm_vcc *atmvcc, + /*const*/ struct atm_qos *qos, int flags) +{ + return -EBUSY; /* TODO: need to write this */ +} + +#ifndef CONFIG_PROC_FS +#define lanai_proc_read NULL +#else +static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page) +{ + struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; + loff_t left = *pos; + struct lanai_vcc *lvcc; + if (left-- == 0) + return sprintf(page, DEV_LABEL "(itf %d): chip=LANAI%s, " + "serial=%d, magic=0x%08X, num_vci=%d\n", + atmdev->number, lanai->type==lanai2 ? "2" : "HB", + lanai->serialno, lanai->magicno, lanai->num_vci); + if (left-- == 0) + return sprintf(page, "revision: board=%d, pci_if=%d\n", + lanai->board_rev, lanai->pci_revision); + if (left-- == 0) + return sprintf(page, "EEPROM ESI: " + "%02X:%02X:%02X:%02X:%02X:%02X\n", + lanai->eeprom[EEPROM_MAC + 0], + lanai->eeprom[EEPROM_MAC + 1], + lanai->eeprom[EEPROM_MAC + 2], + lanai->eeprom[EEPROM_MAC + 3], + lanai->eeprom[EEPROM_MAC + 4], + lanai->eeprom[EEPROM_MAC + 5]); + if (left-- == 0) + return sprintf(page, "status: SOOL=%d, LOCD=%d, LED=%d, " + "GPIN=%d\n", (lanai->status & STATUS_SOOL) ? 1 : 0, + (lanai->status & STATUS_LOCD) ? 1 : 0, + (lanai->status & STATUS_LED) ? 1 : 0, + (lanai->status & STATUS_GPIN) ? 1 : 0); + if (left-- == 0) + return sprintf(page, "global buffer sizes: service=%d, " + "aal0_rx=%d\n", lanai_buf_size(&lanai->service), + lanai->naal0 ? lanai_buf_size(&lanai->aal0buf) : 0); + if (left-- == 0) { + get_statistics(lanai); + return sprintf(page, "cells in error: overflow=%d, " + "closed_vci=%d, bad_HEC=%d, rx_fifo=%d\n", + lanai->stats.ovfl_trash, lanai->stats.vci_trash, + lanai->stats.hec_err, lanai->stats.atm_ovfl); + } + if (left-- == 0) + return sprintf(page, "PCI errors: parity_detect=%d, " + "master_abort=%d, master_target_abort=%d,\n", + lanai->stats.pcierr_parity_detect, + lanai->stats.pcierr_serr_set, + lanai->stats.pcierr_m_target_abort); + if (left-- == 0) + return sprintf(page, " slave_target_abort=%d, " + "master_parity=%d\n", lanai->stats.pcierr_s_target_abort, + lanai->stats.pcierr_master_parity); + if (left-- == 0) + return sprintf(page, "service list errors: no_vcc_rx=%d, " + "no_vcc_tx=%d,\n", lanai->stats.service_novcc_rx, + lanai->stats.service_novcc_tx); + if (left-- == 0) + return sprintf(page, " no_tx=%d, " + "no_rx=%d, bad_rx_aal=%d\n", lanai->stats.service_norx, + lanai->stats.service_notx, + lanai->stats.service_rxnotaal5); + if (left-- == 0) + return sprintf(page, "resets: dma=%d, card=%d\n", + lanai->stats.dma_reenable, lanai->stats.card_reset); + /* At this point, "left" should be the VCI we're looking for */ + vcclist_read_lock(); + for (; ; left++) { + if (left >= NUM_VCI) { + left = 0; + goto out; + } + if ((lvcc = lanai->vccs[left]) != NULL) + break; + (*pos)++; + } + /* Note that we re-use "left" here since we're done with it */ + left = sprintf(page, "VCI %4d: nref=%d, rx_nomem=%d", (vci_t) left, + lvcc->nref, lvcc->stats.rx_nomem); + if (lvcc->rx.atmvcc != NULL) { + left += sprintf(&page[left], ",\n rx_AAL=%d", + lvcc->rx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0); + if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5) + left += sprintf(&page[left], ", rx_buf_size=%d, " + "rx_bad_len=%d,\n rx_service_trash=%d, " + "rx_service_stream=%d, rx_bad_crc=%d", + lanai_buf_size(&lvcc->rx.buf), + lvcc->stats.x.aal5.rx_badlen, + lvcc->stats.x.aal5.service_trash, + lvcc->stats.x.aal5.service_stream, + lvcc->stats.x.aal5.service_rxcrc); + } + if (lvcc->tx.atmvcc != NULL) + left += sprintf(&page[left], ",\n tx_AAL=%d, " + "tx_buf_size=%d, tx_qos=%cBR, tx_backlogged=%c", + lvcc->tx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0, + lanai_buf_size(&lvcc->tx.buf), + lvcc->tx.atmvcc == lanai->cbrvcc ? 'C' : 'U', + vcc_is_backlogged(lvcc) ? 'Y' : 'N'); + page[left++] = '\n'; + page[left] = '\0'; + out: + vcclist_read_unlock(); + return left; +} +#endif /* CONFIG_PROC_FS */ + +/* -------------------- HOOKS: */ + +static const struct atmdev_ops ops = { + dev_close: lanai_dev_close, + open: lanai_open, + close: lanai_close, + ioctl: lanai_ioctl, + getsockopt: NULL, + setsockopt: NULL, + send: lanai_send, + sg_send: NULL, /* no scatter-gather on card */ + send_oam: NULL, /* OAM support not in linux yet */ + phy_put: NULL, + phy_get: NULL, + feedback: NULL, + change_qos: lanai_change_qos, + free_rx_skb: NULL, + proc_read: lanai_proc_read +}; + +/* detect one type of card LANAI2 or LANAIHB */ +static int __init lanai_detect_1(unsigned int vendor, unsigned int device) +{ + struct pci_dev *pci = NULL; + struct lanai_dev *lanai; + struct atm_dev *atmdev; + int count = 0, result; + while ((pci = pci_find_device(vendor, device, pci)) != NULL) { + lanai = (struct lanai_dev *) + kmalloc(sizeof *lanai, GFP_KERNEL); + if (lanai == NULL) { + printk(KERN_ERR DEV_LABEL ": couldn't allocate " + "dev_data structure!\n"); + break; + } + atmdev = atm_dev_register(DEV_LABEL, &ops, -1, 0); + if (atmdev == NULL) { + printk(KERN_ERR DEV_LABEL ": couldn't register " + "atm device!\n"); + kfree(lanai); + break; + } + atmdev->dev_data = lanai; + lanai->pci = pci; + lanai->type = (enum lanai_type) device; + if ((result = lanai_dev_open(atmdev)) != 0) { + DPRINTK("lanai_start() failed, err=%d\n", -result); + atm_dev_deregister(atmdev); + kfree(lanai); + continue; + } + count++; + } + return count; +} + +#ifdef MODULE +static +#endif +int __init lanai_detect(void) +{ + return lanai_detect_1(PCI_VENDOR_ID_EF, PCI_VENDOR_ID_EF_ATM_LANAI2) + + lanai_detect_1(PCI_VENDOR_ID_EF, PCI_VENDOR_ID_EF_ATM_LANAIHB); +} + +#ifdef MODULE + +int init_module(void) +{ + if (lanai_detect() == 0) { + printk(KERN_ERR DEV_LABEL ": no adaptor found\n"); + return -ENODEV; + } + return 0; +} + +void cleanup_module(void) +{ + /* We'll only get called when all the interfaces are already + * gone, so there isn't much to do + */ + DPRINTK("cleanup_module()\n"); +} + +MODULE_AUTHOR("Mitchell Blank Jr "); +MODULE_DESCRIPTION("Efficient Networks Speedstream 3010 driver"); +MODULE_LICENSE("GPL"); + +#endif /* MODULE */ diff -u --recursive --new-file v2.4.13/linux/drivers/atm/nicstar.h linux/drivers/atm/nicstar.h --- v2.4.13/linux/drivers/atm/nicstar.h Fri Feb 16 16:02:35 2001 +++ linux/drivers/atm/nicstar.h Thu Oct 25 13:53:46 2001 @@ -625,7 +625,7 @@ #define NS_CFG_LGBUFSIZE NS_CFG_LGBUFSIZE_2048 #elif (NS_LGBUFSIZE == 4096) #define NS_CFG_LGBUFSIZE NS_CFG_LGBUFSIZE_4096 -#eliif (NS_LGBUFSIZE == 8192) +#elif (NS_LGBUFSIZE == 8192) #define NS_CFG_LGBUFSIZE NS_CFG_LGBUFSIZE_8192 #elif (NS_LGBUFSIZE == 16384) #define NS_CFG_LGBUFSIZE NS_CFG_LGBUFSIZE_16384 diff -u --recursive --new-file v2.4.13/linux/drivers/block/DAC960.c linux/drivers/block/DAC960.c --- v2.4.13/linux/drivers/block/DAC960.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/DAC960.c Thu Oct 25 13:58:35 2001 @@ -82,7 +82,8 @@ static BlockDeviceOperations_T DAC960_BlockDeviceOperations = - { open: DAC960_Open, + { owner: THIS_MODULE, + open: DAC960_Open, release: DAC960_Release, ioctl: DAC960_IOCTL }; @@ -5378,7 +5379,6 @@ Controller->ControllerUsageCount++; Controller->LogicalDriveUsageCount[LogicalDriveNumber]++; ModuleOnly: - MOD_INC_USE_COUNT; return 0; } @@ -5401,7 +5401,6 @@ Controller->LogicalDriveUsageCount[LogicalDriveNumber]--; Controller->ControllerUsageCount--; ModuleOnly: - MOD_DEC_USE_COUNT; return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/block/acsi.c linux/drivers/block/acsi.c --- v2.4.13/linux/drivers/block/acsi.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/acsi.c Thu Oct 25 13:58:35 2001 @@ -1196,7 +1196,6 @@ acsi_prevent_removal(device, 1); } access_count[device]++; - MOD_INC_USE_COUNT; if (filp && filp->f_mode) { check_disk_change( inode->i_rdev ); @@ -1221,7 +1220,6 @@ int device = DEVICE_NR(MINOR(inode->i_rdev)); if (--access_count[device] == 0 && acsi_info[device].removable) acsi_prevent_removal(device, 0); - MOD_DEC_USE_COUNT; return( 0 ); } @@ -1657,6 +1655,7 @@ #endif static struct block_device_operations acsi_fops = { + owner: THIS_MODULE, open: acsi_open, release: acsi_release, ioctl: acsi_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/block/amiflop.c linux/drivers/block/amiflop.c --- v2.4.13/linux/drivers/block/amiflop.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/amiflop.c Thu Oct 25 13:58:34 2001 @@ -1738,6 +1738,7 @@ } static struct block_device_operations floppy_fops = { + owner: THIS_MODULE, open: floppy_open, release: floppy_release, ioctl: fd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/block/ataflop.c linux/drivers/block/ataflop.c --- v2.4.13/linux/drivers/block/ataflop.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/ataflop.c Thu Oct 25 13:58:35 2001 @@ -1910,8 +1910,6 @@ if (fd_ref[drive] == -1 || (fd_ref[drive] && filp->f_flags & O_EXCL)) return -EBUSY; - MOD_INC_USE_COUNT; - if (filp->f_flags & O_EXCL) fd_ref[drive] = -1; else @@ -1950,11 +1948,11 @@ fd_ref[drive] = 0; } - MOD_DEC_USE_COUNT; return 0; } static struct block_device_operations floppy_fops = { + owner: THIS_MODULE, open: floppy_open, release: floppy_release, ioctl: fd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/block/cciss.c linux/drivers/block/cciss.c --- v2.4.13/linux/drivers/block/cciss.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/cciss.c Thu Oct 25 13:58:35 2001 @@ -119,6 +119,7 @@ #endif /* CONFIG_PROC_FS */ static struct block_device_operations cciss_fops = { + owner: THIS_MODULE, open: cciss_open, release: cciss_release, ioctl: cciss_ioctl, @@ -347,7 +348,6 @@ hba[ctlr]->drv[dsk].usage_count++; hba[ctlr]->usage_count++; - MOD_INC_USE_COUNT; return 0; } /* @@ -366,7 +366,6 @@ hba[ctlr]->drv[dsk].usage_count--; hba[ctlr]->usage_count--; - MOD_DEC_USE_COUNT; return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/block/cpqarray.c linux/drivers/block/cpqarray.c --- v2.4.13/linux/drivers/block/cpqarray.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/cpqarray.c Thu Oct 25 13:58:35 2001 @@ -188,6 +188,7 @@ } static struct block_device_operations ida_fops = { + owner: THIS_MODULE, open: ida_open, release: ida_release, ioctl: ida_ioctl, @@ -853,7 +854,6 @@ hba[ctlr]->drv[dsk].usage_count++; hba[ctlr]->usage_count++; - MOD_INC_USE_COUNT; return 0; } @@ -869,7 +869,6 @@ hba[ctlr]->drv[dsk].usage_count--; hba[ctlr]->usage_count--; - MOD_DEC_USE_COUNT; return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/block/floppy.c linux/drivers/block/floppy.c --- v2.4.13/linux/drivers/block/floppy.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/floppy.c Thu Oct 25 13:58:34 2001 @@ -397,6 +397,7 @@ static struct floppy_drive_params drive_params[N_DRIVE]; static struct floppy_drive_struct drive_state[N_DRIVE]; static struct floppy_write_errors write_errors[N_DRIVE]; +static struct timer_list motor_off_timer[N_DRIVE]; static struct floppy_raw_cmd *raw_cmd, default_raw_cmd; /* @@ -927,17 +928,6 @@ set_dor(FDC(nr), mask, 0); } -static struct timer_list motor_off_timer[N_DRIVE] = { - { data: 0, function: motor_off_callback }, - { data: 1, function: motor_off_callback }, - { data: 2, function: motor_off_callback }, - { data: 3, function: motor_off_callback }, - { data: 4, function: motor_off_callback }, - { data: 5, function: motor_off_callback }, - { data: 6, function: motor_off_callback }, - { data: 7, function: motor_off_callback } -}; - /* schedules motor off */ static void floppy_off(unsigned int drive) { @@ -3902,6 +3892,7 @@ } static struct block_device_operations floppy_fops = { + owner: THIS_MODULE, open: floppy_open, release: floppy_release, ioctl: fd_ioctl, @@ -4067,8 +4058,10 @@ DPRINT("bad drive for set_cmos\n"); return; } +#if N_FDC > 1 if (current_drive >= 4 && !FDC2) FDC2 = 0x370; +#endif DP->cmos = ints[2]; DPRINT("setting CMOS code to %d\n", ints[2]); } @@ -4088,10 +4081,10 @@ { "dma", 0, &FLOPPY_DMA, 2, 0 }, { "daring", daring, 0, 1, 0}, - +#if N_FDC > 1 { "two_fdc", 0, &FDC2, 0x370, 0 }, { "one_fdc", 0, &FDC2, 0, 0 }, - +#endif { "thinkpad", floppy_set_flags, 0, 1, FD_INVERTED_DCL }, { "broken_dcl", floppy_set_flags, 0, 1, FD_BROKEN_DCL }, { "messages", floppy_set_flags, 0, 1, FTD_MSG }, @@ -4112,6 +4105,8 @@ { "unexpected_interrupts", 0, &print_unex, 1, 0 }, { "no_unexpected_interrupts", 0, &print_unex, 0, 0 }, { "L40SX", 0, &print_unex, 0, 0 } + + EXTRA_FLOPPY_PARAMS }; static int __init floppy_setup(char *str) @@ -4275,6 +4270,8 @@ } for (drive = 0; drive < N_DRIVE; drive++) { + motor_off_timer[drive].data = drive; + motor_off_timer[drive].function = motor_off_callback; if (!(allowed_drive_mask & (1 << drive))) continue; if (fdc_state[FDC(drive)].version == FDC_NONE) diff -u --recursive --new-file v2.4.13/linux/drivers/block/ll_rw_blk.c linux/drivers/block/ll_rw_blk.c --- v2.4.13/linux/drivers/block/ll_rw_blk.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/ll_rw_blk.c Mon Oct 29 12:11:17 2001 @@ -140,21 +140,23 @@ return &blk_dev[MAJOR(dev)].request_queue; } -static int __blk_cleanup_queue(struct list_head *head) +static int __blk_cleanup_queue(struct request_list *list) { + struct list_head *head = &list->free; struct request *rq; int i = 0; - if (list_empty(head)) - return 0; - - do { + while (!list_empty(head)) { rq = list_entry(head->next, struct request, queue); list_del(&rq->queue); kmem_cache_free(request_cachep, rq); i++; - } while (!list_empty(head)); + }; + + if (i != list->count) + printk("request list leak!\n"); + list->count = 0; return i; } @@ -176,10 +178,8 @@ { int count = queue_nr_requests; - count -= __blk_cleanup_queue(&q->request_freelist[READ]); - count -= __blk_cleanup_queue(&q->request_freelist[WRITE]); - count -= __blk_cleanup_queue(&q->pending_freelist[READ]); - count -= __blk_cleanup_queue(&q->pending_freelist[WRITE]); + count -= __blk_cleanup_queue(&q->rq[READ]); + count -= __blk_cleanup_queue(&q->rq[WRITE]); if (count) printk("blk_cleanup_queue: leaked requests (%d)\n", count); @@ -331,11 +331,10 @@ struct request *rq; int i; - INIT_LIST_HEAD(&q->request_freelist[READ]); - INIT_LIST_HEAD(&q->request_freelist[WRITE]); - INIT_LIST_HEAD(&q->pending_freelist[READ]); - INIT_LIST_HEAD(&q->pending_freelist[WRITE]); - q->pending_free[READ] = q->pending_free[WRITE] = 0; + INIT_LIST_HEAD(&q->rq[READ].free); + INIT_LIST_HEAD(&q->rq[WRITE].free); + q->rq[READ].count = 0; + q->rq[WRITE].count = 0; /* * Divide requests in half between read and write @@ -349,7 +348,8 @@ } memset(rq, 0, sizeof(struct request)); rq->rq_status = RQ_INACTIVE; - list_add(&rq->queue, &q->request_freelist[i & 1]); + list_add(&rq->queue, &q->rq[i&1].free); + q->rq[i&1].count++; } init_waitqueue_head(&q->wait_for_request); @@ -423,10 +423,12 @@ static inline struct request *get_request(request_queue_t *q, int rw) { struct request *rq = NULL; + struct request_list *rl = q->rq + rw; - if (!list_empty(&q->request_freelist[rw])) { - rq = blkdev_free_rq(&q->request_freelist[rw]); + if (!list_empty(&rl->free)) { + rq = blkdev_free_rq(&rl->free); list_del(&rq->queue); + rl->count--; rq->rq_status = RQ_ACTIVE; rq->special = NULL; rq->q = q; @@ -443,17 +445,16 @@ register struct request *rq; DECLARE_WAITQUEUE(wait, current); - add_wait_queue_exclusive(&q->wait_for_request, &wait); - for (;;) { - __set_current_state(TASK_UNINTERRUPTIBLE); + generic_unplug_device(q); + add_wait_queue(&q->wait_for_request, &wait); + do { + set_current_state(TASK_UNINTERRUPTIBLE); + if (q->rq[rw].count < batch_requests) + schedule(); spin_lock_irq(&io_request_lock); - rq = get_request(q, rw); + rq = get_request(q,rw); spin_unlock_irq(&io_request_lock); - if (rq) - break; - generic_unplug_device(q); - schedule(); - } + } while (rq == NULL); remove_wait_queue(&q->wait_for_request, &wait); current->state = TASK_RUNNING; return rq; @@ -542,15 +543,6 @@ list_add(&req->queue, insert_here); } -inline void blk_refill_freelist(request_queue_t *q, int rw) -{ - if (q->pending_free[rw]) { - list_splice(&q->pending_freelist[rw], &q->request_freelist[rw]); - INIT_LIST_HEAD(&q->pending_freelist[rw]); - q->pending_free[rw] = 0; - } -} - /* * Must be called with io_request_lock held and interrupts disabled */ @@ -564,19 +556,12 @@ /* * Request may not have originated from ll_rw_blk. if not, - * asumme it has free buffers and check waiters + * assume it has free buffers and check waiters */ if (q) { - /* - * Add to pending free list and batch wakeups - */ - list_add(&req->queue, &q->pending_freelist[rw]); - - if (++q->pending_free[rw] >= batch_requests) { - int wake_up = q->pending_free[rw]; - blk_refill_freelist(q, rw); - wake_up_nr(&q->wait_for_request, wake_up); - } + list_add(&req->queue, &q->rq[rw].free); + if (++q->rq[rw].count >= batch_requests && waitqueue_active(&q->wait_for_request)) + wake_up(&q->wait_for_request); } } @@ -1135,7 +1120,7 @@ /* * Batch frees according to queue length */ - batch_requests = queue_nr_requests >> 3; + batch_requests = queue_nr_requests/4; printk("block: %d slots per queue, batch=%d\n", queue_nr_requests, batch_requests); #ifdef CONFIG_AMIGA_Z2RAM diff -u --recursive --new-file v2.4.13/linux/drivers/block/loop.c linux/drivers/block/loop.c --- v2.4.13/linux/drivers/block/loop.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/loop.c Thu Oct 25 13:58:34 2001 @@ -941,6 +941,7 @@ } static struct block_device_operations lo_fops = { + owner: THIS_MODULE, open: lo_open, release: lo_release, ioctl: lo_ioctl, @@ -951,6 +952,7 @@ */ MODULE_PARM(max_loop, "i"); MODULE_PARM_DESC(max_loop, "Maximum number of loop devices (1-255)"); +MODULE_LICENSE("GPL"); int loop_register_transfer(struct loop_func_table *funcs) { diff -u --recursive --new-file v2.4.13/linux/drivers/block/nbd.c linux/drivers/block/nbd.c --- v2.4.13/linux/drivers/block/nbd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/nbd.c Fri Oct 26 15:39:02 2001 @@ -82,7 +82,6 @@ return -ENODEV; nbd_dev[dev].refcnt++; - MOD_INC_USE_COUNT; return 0; } @@ -467,12 +466,12 @@ printk(KERN_ALERT "nbd_release: refcount(%d) <= 0\n", lo->refcnt); lo->refcnt--; /* N.B. Doesn't lo->file need an fput?? */ - MOD_DEC_USE_COUNT; return 0; } static struct block_device_operations nbd_fops = { + owner: THIS_MODULE, open: nbd_open, release: nbd_release, ioctl: nbd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/Config.in linux/drivers/block/paride/Config.in --- v2.4.13/linux/drivers/block/paride/Config.in Fri Apr 6 10:42:55 2001 +++ linux/drivers/block/paride/Config.in Thu Oct 25 00:07:39 2001 @@ -27,6 +27,12 @@ dep_tristate ' FIT TD-2000 protocol' CONFIG_PARIDE_FIT2 $CONFIG_PARIDE dep_tristate ' FIT TD-3000 protocol' CONFIG_PARIDE_FIT3 $CONFIG_PARIDE dep_tristate ' Shuttle EPAT/EPEZ protocol' CONFIG_PARIDE_EPAT $CONFIG_PARIDE +if [ "$CONFIG_PARIDE_EPAT" != "n" ]; then + if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + bool ' Support c7/c8 chips (EXPERIMENTAL)' CONFIG_PARIDE_EPATC8 $CONFIG_PARIDE + fi +fi + dep_tristate ' Shuttle EPIA protocol' CONFIG_PARIDE_EPIA $CONFIG_PARIDE dep_tristate ' Freecom IQ ASIC-2 protocol' CONFIG_PARIDE_FRIQ $CONFIG_PARIDE dep_tristate ' FreeCom power protocol' CONFIG_PARIDE_FRPW $CONFIG_PARIDE diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/epat.c linux/drivers/block/paride/epat.c --- v2.4.13/linux/drivers/block/paride/epat.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/paride/epat.c Thu Oct 25 00:07:39 2001 @@ -12,10 +12,11 @@ /* Changes: 1.01 GRG 1998.05.06 init_proto, release_proto + 1.02 Joshua b. Jore CPP(renamed), epat_connect, epat_disconnect */ -#define EPAT_VERSION "1.01" +#define EPAT_VERSION "1.02" #include #include @@ -197,30 +198,50 @@ #define WRi(r,v) epat_write_regr(pi,0,r,v) #define RRi(r) (epat_read_regr(pi,0,r)) -/* FIXME: the CCP stuff should be fixed to handle multiple EPATs on a chain */ +/* FIXME: the CPP stuff should be fixed to handle multiple EPATs on a chain */ -#define CCP(x) w2(4);w0(0x22);w0(0xaa);w0(0x55);w0(0);w0(0xff);\ +#define CPP(x) w2(4);w0(0x22);w0(0xaa);w0(0x55);w0(0);w0(0xff);\ w0(0x87);w0(0x78);w0(x);w2(4);w2(5);w2(4);w0(0xff); static void epat_connect ( PIA *pi ) { pi->saved_r0 = r0(); pi->saved_r2 = r2(); - CCP(0); CCP(0xe0); + +#ifdef CONFIG_PARIDE_EPATC8 + /* Initialize the chip */ + CPP(0);CPP(0x40);CPP(0xe0); + w0(0);w2(1);w2(4); + WR(0x8,0x12);WR(0xc,0x14);WR(0x12,0x10); + WR(0xe,0xf);WR(0xf,4); + /* WR(0xe,0xa);WR(0xf,4); */ + WR(0xe,0xd);WR(0xf,0); + /* CPP(0x30); */ + + /* Connect to the chip */ + CPP(0xe0); + w0(0);w2(1);w2(4); /* Idle into SPP */ + if (pi->mode >= 3) { + w0(0);w2(1);w2(4);w2(0xc); + /* Request EPP */ + w0(0x40);w2(6);w2(7);w2(4);w2(0xc);w2(4); + } +#else + CPP(0); CPP(0xe0); w0(0); w2(1); w2(4); if (pi->mode >= 3) { w0(0); w2(1); w2(4); w2(0xc); w0(0x40); w2(6); w2(7); w2(4); w2(0xc); w2(4); } WR(8,0x10); WR(0xc,0x14); WR(0xa,0x38); WR(0x12,0x10); +#endif } -static void epat_disconnect ( PIA *pi ) - -{ CCP(0x30); - w0(pi->saved_r0); - w2(pi->saved_r2); -} +static void epat_disconnect (PIA *pi) +{ CPP(0x30); + w0(pi->saved_r0); + w2(pi->saved_r2); +} static int epat_test_proto( PIA *pi, char * scratch, int verbose ) @@ -282,6 +303,7 @@ static void epat_init_proto( PIA *pi) { MOD_INC_USE_COUNT; + printk("epat_init_proto"); } static void epat_release_proto( PIA *pi) diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/pcd.c linux/drivers/block/paride/pcd.c --- v2.4.13/linux/drivers/block/paride/pcd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/paride/pcd.c Sat Oct 27 02:03:47 2001 @@ -265,6 +265,14 @@ /* kernel glue structures */ +static struct block_device_operations pcd_bdops = { + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static struct cdrom_device_ops pcd_dops = { pcd_open, pcd_release, @@ -335,13 +343,17 @@ /* get the atapi capabilities page */ pcd_probe_capabilities(); - if (register_blkdev(MAJOR_NR,name,&cdrom_fops)) { + if (register_blkdev(MAJOR_NR,name,&pcd_bdops)) { printk("pcd: unable to get major number %d\n",MAJOR_NR); return -1; } - for (unit=0;unit= PCD_UNITS) || (!PCD.present)) return -ENODEV; - MOD_INC_USE_COUNT; - return 0; } static void pcd_release(struct cdrom_device_info *cdi) -{ MOD_DEC_USE_COUNT; +{ } #ifdef MODULE diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/pd.c linux/drivers/block/paride/pd.c --- v2.4.13/linux/drivers/block/paride/pd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/paride/pd.c Thu Oct 25 13:58:35 2001 @@ -354,6 +354,7 @@ }; static struct block_device_operations pd_fops = { + owner: THIS_MODULE, open: pd_open, release: pd_release, ioctl: pd_ioctl, @@ -430,8 +431,6 @@ if ((unit >= PD_UNITS) || (!PD.present)) return -ENODEV; - MOD_INC_USE_COUNT; - wait_event (pd_wait_open, pd_valid); PD.access++; @@ -515,8 +514,6 @@ if (!PD.access && PD.removable) pd_doorlock(unit,IDE_DOORUNLOCK); - - MOD_DEC_USE_COUNT; return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/block/paride/pf.c linux/drivers/block/paride/pf.c --- v2.4.13/linux/drivers/block/paride/pf.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/paride/pf.c Thu Oct 25 13:58:35 2001 @@ -312,6 +312,7 @@ /* kernel glue structures */ static struct block_device_operations pf_fops = { + owner: THIS_MODULE, open: pf_open, release: pf_release, ioctl: pf_ioctl, @@ -427,19 +428,13 @@ if ((unit >= PF_UNITS) || (!PF.present)) return -ENODEV; - MOD_INC_USE_COUNT; - pf_identify(unit); - if (PF.media_status == PF_NM) { - MOD_DEC_USE_COUNT; + if (PF.media_status == PF_NM) return -ENODEV; - } - if ((PF.media_status == PF_RO) && (file ->f_mode & 2)) { - MOD_DEC_USE_COUNT; + if ((PF.media_status == PF_RO) && (file ->f_mode & 2)) return -EROFS; - } PF.access++; if (PF.removable) pf_lock(unit,1); @@ -512,8 +507,6 @@ if (!PF.access && PF.removable) pf_lock(unit,0); - - MOD_DEC_USE_COUNT; return 0; diff -u --recursive --new-file v2.4.13/linux/drivers/block/ps2esdi.c linux/drivers/block/ps2esdi.c --- v2.4.13/linux/drivers/block/ps2esdi.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/ps2esdi.c Thu Oct 25 13:58:34 2001 @@ -150,6 +150,7 @@ static struct block_device_operations ps2esdi_fops = { + owner: THIS_MODULE, open: ps2esdi_open, release: ps2esdi_release, ioctl: ps2esdi_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/block/rd.c linux/drivers/block/rd.c --- v2.4.13/linux/drivers/block/rd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/rd.c Thu Oct 25 13:58:35 2001 @@ -203,17 +203,6 @@ return 0; } -/* - * Writing: just make sure the page gets marked dirty, so that - * the page stealer won't grab it. - */ -static int ramdisk_writepage(struct page *page) -{ - SetPageDirty(page); - UnlockPage(page); - return 0; -} - static int ramdisk_prepare_write(struct file *file, struct page *page, unsigned offset, unsigned to) { if (!Page_Uptodate(page)) { @@ -233,7 +222,7 @@ static struct address_space_operations ramdisk_aops = { readpage: ramdisk_readpage, - writepage: ramdisk_writepage, + writepage: fail_writepage, prepare_write: ramdisk_prepare_write, commit_write: ramdisk_commit_write, }; @@ -463,20 +452,12 @@ rd_bdev[unit]->bd_inode->i_mapping->a_ops = &ramdisk_aops; } - MOD_INC_USE_COUNT; - - return 0; -} - -static int rd_release(struct inode * inode, struct file * filp) -{ - MOD_DEC_USE_COUNT; return 0; } static struct block_device_operations rd_bd_op = { + owner: THIS_MODULE, open: rd_open, - release: rd_release, ioctl: rd_ioctl, }; diff -u --recursive --new-file v2.4.13/linux/drivers/block/xd.c linux/drivers/block/xd.c --- v2.4.13/linux/drivers/block/xd.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/block/xd.c Thu Oct 25 13:58:35 2001 @@ -137,6 +137,7 @@ }; static struct block_device_operations xd_fops = { + owner: THIS_MODULE, open: xd_open, release: xd_release, ioctl: xd_ioctl, @@ -264,8 +265,6 @@ { int dev = DEVICE_NR(inode->i_rdev); - MOD_INC_USE_COUNT; - if (dev < xd_drives) { while (!xd_valid[dev]) sleep_on(&xd_wait_open); @@ -275,7 +274,6 @@ return (0); } - MOD_DEC_USE_COUNT; return -ENXIO; } @@ -374,10 +372,8 @@ static int xd_release (struct inode *inode, struct file *file) { int target = DEVICE_NR(inode->i_rdev); - if (target < xd_drives) { + if (target < xd_drives) xd_access[target]--; - MOD_DEC_USE_COUNT; - } return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/block/z2ram.c linux/drivers/block/z2ram.c --- v2.4.13/linux/drivers/block/z2ram.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/block/z2ram.c Thu Oct 25 13:58:35 2001 @@ -168,8 +168,6 @@ sizeof( z2ram_map[0] ); int rc = -ENOMEM; - MOD_INC_USE_COUNT; - device = DEVICE_NR( inode->i_rdev ); if ( current_device != -1 && current_device != device ) @@ -319,7 +317,6 @@ err_out_kfree: kfree( z2ram_map ); err_out: - MOD_DEC_USE_COUNT; return rc; } @@ -333,13 +330,12 @@ * FIXME: unmap memory */ - MOD_DEC_USE_COUNT; - return 0; } static struct block_device_operations z2_fops = { + owner: THIS_MODULE, open: z2_open, release: z2_release, }; diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/aztcd.c linux/drivers/cdrom/aztcd.c --- v2.4.13/linux/drivers/cdrom/aztcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/aztcd.c Thu Oct 25 13:58:35 2001 @@ -355,6 +355,7 @@ int aztcd_init(void); static struct block_device_operations azt_fops = { + owner:THIS_MODULE, open:aztcd_open, release:aztcd_release, ioctl:aztcd_ioctl, @@ -1658,8 +1659,6 @@ if (aztPresent == 0) return -ENXIO; /* no hardware */ - MOD_INC_USE_COUNT; - if (!azt_open_count && azt_state == AZT_S_IDLE) { azt_invalidate_buffers(); @@ -1691,7 +1690,6 @@ return 0; err_out: - MOD_DEC_USE_COUNT; return -EIO; } @@ -1706,7 +1704,6 @@ printk("inode: %p, inode->i_rdev: %x file: %p\n", inode, inode->i_rdev, file); #endif - MOD_DEC_USE_COUNT; if (!--azt_open_count) { azt_invalidate_buffers(); aztUnlockDoor(); diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c --- v2.4.13/linux/drivers/cdrom/cdrom.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/cdrom/cdrom.c Wed Oct 24 14:04:02 2001 @@ -310,11 +310,6 @@ #define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret /* Not-exported routines. */ -static int cdrom_open(struct inode *ip, struct file *fp); -static int cdrom_release(struct inode *ip, struct file *fp); -static int cdrom_ioctl(struct inode *ip, struct file *fp, - unsigned int cmd, unsigned long arg); -static int cdrom_media_changed(kdev_t dev); static int open_for_data(struct cdrom_device_info * cdi); static int check_for_audio_disc(struct cdrom_device_info * cdi, struct cdrom_device_ops * cdo); @@ -333,14 +328,6 @@ static devfs_handle_t devfs_handle; static struct unique_numspace cdrom_numspace = UNIQUE_NUMBERSPACE_INITIALISER; -struct block_device_operations cdrom_fops = -{ - open: cdrom_open, - release: cdrom_release, - ioctl: cdrom_ioctl, - check_media_change: cdrom_media_changed, -}; - /* This macro makes sure we don't have to check on cdrom_device_ops * existence in the run-time routines below. Change_capability is a * hack to have the capability flags defined const, while we can still @@ -354,7 +341,6 @@ int major = MAJOR(cdi->dev); struct cdrom_device_ops *cdo = cdi->ops; int *change_capability = (int *)&cdo->capability; /* hack */ - char vname[16]; cdinfo(CD_OPEN, "entering register_cdrom\n"); @@ -396,7 +382,6 @@ if (!devfs_handle) devfs_handle = devfs_mk_dir (NULL, "cdroms", NULL); cdi->number = devfs_alloc_unique_number (&cdrom_numspace); - sprintf (vname, "cdrom%d", cdi->number); if (cdi->de) { int pos; devfs_handle_t slave; @@ -405,6 +390,8 @@ pos = devfs_generate_path (cdi->de, rname + 3, sizeof rname - 3); if (pos >= 0) { + char vname[16]; + sprintf (vname, "cdrom%d", cdi->number); strncpy (rname + pos, "../", 3); devfs_mk_symlink (devfs_handle, vname, DEVFS_FL_DEFAULT, @@ -412,13 +399,6 @@ devfs_auto_unregister (cdi->de, slave); } } - else { - cdi->de = - devfs_register (devfs_handle, vname, DEVFS_FL_DEFAULT, - MAJOR (cdi->dev), MINOR (cdi->dev), - S_IFBLK | S_IRUGO | S_IWUGO, - &cdrom_fops, NULL); - } cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name); cdi->next = topCdromPtr; topCdromPtr = cdi; @@ -475,7 +455,6 @@ * is in their own interest: device control becomes a lot easier * this way. */ -static int cdrom_open(struct inode *ip, struct file *fp) { struct cdrom_device_info *cdi; @@ -669,7 +648,6 @@ /* Admittedly, the logic below could be performed in a nicer way. */ -static int cdrom_release(struct inode *ip, struct file *fp) { kdev_t dev = ip->i_rdev; @@ -867,7 +845,7 @@ return ret; } -static int cdrom_media_changed(kdev_t dev) +int cdrom_media_changed(kdev_t dev) { struct cdrom_device_info *cdi = cdrom_find_device(dev); /* This talks to the VFS, which doesn't like errors - just 1 or 0. @@ -1480,7 +1458,7 @@ * these days. ATAPI / SCSI specific code now mainly resides in * mmc_ioct(). */ -static int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, +int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd, unsigned long arg) { kdev_t dev = ip->i_rdev; @@ -2391,7 +2369,10 @@ EXPORT_SYMBOL(cdrom_count_tracks); EXPORT_SYMBOL(register_cdrom); EXPORT_SYMBOL(unregister_cdrom); -EXPORT_SYMBOL(cdrom_fops); +EXPORT_SYMBOL(cdrom_open); +EXPORT_SYMBOL(cdrom_release); +EXPORT_SYMBOL(cdrom_ioctl); +EXPORT_SYMBOL(cdrom_media_changed); EXPORT_SYMBOL(cdrom_number_of_slots); EXPORT_SYMBOL(cdrom_select_disc); EXPORT_SYMBOL(cdrom_mode_select); diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/cdu31a.c linux/drivers/cdrom/cdu31a.c --- v2.4.13/linux/drivers/cdrom/cdu31a.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/cdu31a.c Thu Oct 25 13:58:35 2001 @@ -3112,17 +3112,13 @@ unsigned int res_size; unsigned char params[2]; - MOD_INC_USE_COUNT; if (sony_usage == 0) { - if (scd_spinup() != 0) { - MOD_DEC_USE_COUNT; + if (scd_spinup() != 0) return -EIO; - } sony_get_toc(); if (!sony_toc_read) { do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size); - MOD_DEC_USE_COUNT; return -EIO; } @@ -3183,9 +3179,17 @@ sony_spun_up = 0; } sony_usage--; - MOD_DEC_USE_COUNT; } +struct block_device_operations scd_bdops = +{ + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static struct cdrom_device_ops scd_dops = { open:scd_open, release:scd_release, @@ -3383,7 +3387,7 @@ request_region(cdu31a_port, 4, "cdu31a"); - if (devfs_register_blkdev(MAJOR_NR, "cdu31a", &cdrom_fops)) { + if (devfs_register_blkdev(MAJOR_NR, "cdu31a", &scd_bdops)) { printk("Unable to get major %d for CDU-31a\n", MAJOR_NR); goto errout2; @@ -3465,6 +3469,7 @@ if (register_cdrom(&scd_info)) { goto errout0; } + devfs_plain_cdrom(&scd_info, &scd_bdops); } diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/cm206.c linux/drivers/cdrom/cm206.c --- v2.4.13/linux/drivers/cdrom/cm206.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/cm206.c Thu Oct 25 13:58:35 2001 @@ -765,11 +765,19 @@ } } +struct block_device_operations cm206_bdops = +{ + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + /* The new open. The real opening strategy is defined in cdrom.c. */ static int cm206_open(struct cdrom_device_info *cdi, int purpose) { - MOD_INC_USE_COUNT; if (!cd->openfiles) { /* reset only first time */ cd->background = 0; reset_cm260(); @@ -792,7 +800,6 @@ FIRST_TRACK = 0; /* No valid disc status */ } --cd->openfiles; - MOD_DEC_USE_COUNT; } /* Empty buffer empties $sectors$ sectors of the adapter card buffer, @@ -1478,7 +1485,7 @@ return -EIO; } printk(".\n"); - if (devfs_register_blkdev(MAJOR_NR, "cm206", &cdrom_fops) != 0) { + if (devfs_register_blkdev(MAJOR_NR, "cm206", &cm206_bdops) != 0) { printk(KERN_INFO "Cannot register for major %d!\n", MAJOR_NR); cleanup(3); @@ -1491,6 +1498,7 @@ cleanup(3); return -EIO; } + devfs_plain_cdrom(&cm206_info, &cm206_bdops); blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST); blksize_size[MAJOR_NR] = cm206_blocksizes; read_ahead[MAJOR_NR] = 16; /* reads ahead what? */ diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/gscd.c linux/drivers/cdrom/gscd.c --- v2.4.13/linux/drivers/cdrom/gscd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/gscd.c Thu Oct 25 13:58:35 2001 @@ -164,6 +164,7 @@ static struct timer_list gscd_timer; static struct block_device_operations gscd_fops = { + owner:THIS_MODULE, open:gscd_open, release:gscd_release, ioctl:gscd_ioctl, @@ -381,13 +382,10 @@ if (gscdPresent == 0) return -ENXIO; /* no hardware */ - MOD_INC_USE_COUNT; - get_status(); st = disk_state & (ST_NO_DISK | ST_DOOR_OPEN); if (st) { printk("GSCD: no disk or door open\n"); - MOD_DEC_USE_COUNT; return -ENXIO; } @@ -412,7 +410,6 @@ gscd_bn = -1; - MOD_DEC_USE_COUNT; return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/mcd.c linux/drivers/cdrom/mcd.c --- v2.4.13/linux/drivers/cdrom/mcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/mcd.c Thu Oct 25 13:58:35 2001 @@ -189,6 +189,15 @@ void *arg); int mcd_drive_status(struct cdrom_device_info *cdi, int slot_nr); +struct block_device_operations mcd_bdops = +{ + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static struct timer_list mcd_timer; static struct cdrom_device_ops mcd_dops = { @@ -978,8 +987,6 @@ if (mcdPresent == 0) return -ENXIO; /* no hardware */ - MOD_INC_USE_COUNT; - if (mcd_open_count || mcd_state != MCD_S_IDLE) goto bump_count; @@ -1002,7 +1009,6 @@ return 0; err_out: - MOD_DEC_USE_COUNT; return -EIO; } @@ -1015,7 +1021,6 @@ if (!--mcd_open_count) { mcd_invalidate_buffers(); } - MOD_DEC_USE_COUNT; } @@ -1060,7 +1065,7 @@ return -EIO; } - if (devfs_register_blkdev(MAJOR_NR, "mcd", &cdrom_fops) != 0) { + if (devfs_register_blkdev(MAJOR_NR, "mcd", &mcd_bdops) != 0) { printk(KERN_ERR "mcd: Unable to get major %d for Mitsumi CD-ROM\n", MAJOR_NR); return -EIO; } @@ -1152,6 +1157,7 @@ cleanup(3); return -EIO; } + devfs_plain_cdrom(&mcd_info, &mcd_bdops); printk(msg); return 0; diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/mcdx.c linux/drivers/cdrom/mcdx.c --- v2.4.13/linux/drivers/cdrom/mcdx.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/mcdx.c Thu Oct 25 13:58:35 2001 @@ -219,6 +219,15 @@ int mcdx_init(void); void do_mcdx_request(request_queue_t * q); +struct block_device_operations mcdx_bdops = +{ + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + /* Indirect exported functions. These functions are exported by their addresses, such as mcdx_open and mcdx_close in the @@ -640,13 +649,10 @@ /* Make the modules looking used ... (thanx bjorn). * But we shouldn't forget to decrement the module counter * on error return */ - MOD_INC_USE_COUNT; /* this is only done to test if the drive talks with us */ - if (-1 == mcdx_getstatus(stuffp, 1)) { - MOD_DEC_USE_COUNT; + if (-1 == mcdx_getstatus(stuffp, 1)) return -EIO; - } if (stuffp->xxx) { @@ -705,10 +711,8 @@ } xtrace(OPENCLOSE, "open() init irq generation\n"); - if (-1 == mcdx_config(stuffp, 1)) { - MOD_DEC_USE_COUNT; + if (-1 == mcdx_config(stuffp, 1)) return -EIO; - } #if FALLBACK /* Set the read speed */ xwarn("AAA %x AAA\n", stuffp->readcmd); @@ -745,7 +749,7 @@ MODE2 : MODE1, 1))) { - /* MOD_DEC_USE_COUNT, return -EIO; */ + /* return -EIO; */ stuffp->xa = 0; break; } @@ -765,10 +769,8 @@ /* xa disks will be read in raw mode, others not */ if (-1 == mcdx_setdrivemode(stuffp, stuffp->xa ? RAW : COOKED, - 1)) { - MOD_DEC_USE_COUNT; + 1)) return -EIO; - } if (stuffp->audio) { xinfo("open() audio disk found\n"); } else if (stuffp->lastsector >= 0) { @@ -792,8 +794,6 @@ stuffp = mcdx_stuffp[MINOR(cdi->dev)]; --stuffp->users; - - MOD_DEC_USE_COUNT; } static int mcdx_media_changed(struct cdrom_device_info *cdi, int disc_nr) @@ -1180,7 +1180,7 @@ } xtrace(INIT, "init() register blkdev\n"); - if (devfs_register_blkdev(MAJOR_NR, "mcdx", &cdrom_fops) != 0) { + if (devfs_register_blkdev(MAJOR_NR, "mcdx", &mcdx_bdops) != 0) { xwarn("%s=0x%3p,%d: Init failed. Can't get major %d.\n", MCDX, stuffp->wreg_data, stuffp->irq, MAJOR_NR); kfree(stuffp); @@ -1240,6 +1240,7 @@ blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR)); return 2; } + devfs_plain_cdrom(&mcdx_info, &mcdx_bdops); printk(msg); return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/optcd.c linux/drivers/cdrom/optcd.c --- v2.4.13/linux/drivers/cdrom/optcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/optcd.c Thu Oct 25 13:58:35 2001 @@ -1871,8 +1871,6 @@ { DEBUG((DEBUG_VFS, "starting opt_open")); - MOD_INC_USE_COUNT; - if (!open_count && state == S_IDLE) { int status; @@ -1916,7 +1914,6 @@ return 0; err_out: - MOD_DEC_USE_COUNT; return -EIO; } @@ -1944,7 +1941,6 @@ del_timer(&delay_timer); del_timer(&req_timer); } - MOD_DEC_USE_COUNT; return 0; } @@ -2005,6 +2001,7 @@ static struct block_device_operations opt_fops = { + owner: THIS_MODULE, open: opt_open, release: opt_release, ioctl: opt_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/sbpcd.c linux/drivers/cdrom/sbpcd.c --- v2.4.13/linux/drivers/cdrom/sbpcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/sbpcd.c Thu Oct 25 13:58:35 2001 @@ -5418,6 +5418,15 @@ return (1); } /*==========================================================================*/ + +static struct block_device_operations sbpcd_bdops = +{ + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; /*==========================================================================*/ /* * Open the device special file. Check that a disk is in. Read TOC. @@ -5428,7 +5437,6 @@ i = MINOR(cdi->dev); - MOD_INC_USE_COUNT; down(&ioctl_read_sem); switch_drive(i); @@ -5495,7 +5503,6 @@ } } up(&ioctl_read_sem); - MOD_DEC_USE_COUNT; return ; } /*==========================================================================*/ @@ -5848,7 +5855,7 @@ OUT(MIXER_data,0xCC); /* one nibble per channel, max. value: 0xFF */ #endif /* SOUND_BASE */ - if (devfs_register_blkdev(MAJOR_NR, major_name, &cdrom_fops) != 0) + if (devfs_register_blkdev(MAJOR_NR, major_name, &sbpcd_bdops) != 0) { msg(DBG_INF, "Can't get MAJOR %d for Matsushita CDROM\n", MAJOR_NR); #ifdef MODULE @@ -5923,7 +5930,7 @@ sbpcd_infop->de = devfs_register (devfs_handle, nbuff, DEVFS_FL_DEFAULT, MAJOR_NR, j, S_IFBLK | S_IRUGO | S_IWUGO, - &cdrom_fops, NULL); + &sbpcd_bdops, NULL); if (register_cdrom(sbpcd_infop)) { printk(" sbpcd: Unable to register with Uniform CD-ROm driver\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/sjcd.c linux/drivers/cdrom/sjcd.c --- v2.4.13/linux/drivers/cdrom/sjcd.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/sjcd.c Thu Oct 25 13:58:35 2001 @@ -1551,8 +1551,6 @@ if (fp->f_mode & 2) return (-EROFS); - MOD_INC_USE_COUNT; - if (sjcd_open_count == 0) { int s, sjcd_open_tries; /* We don't know that, do we? */ @@ -1618,7 +1616,6 @@ return (0); err_out: - MOD_DEC_USE_COUNT; return (-EIO); } @@ -1632,9 +1629,6 @@ #if defined( SJCD_TRACE ) printk("SJCD: release\n"); #endif -#ifdef MODULE - MOD_DEC_USE_COUNT; -#endif if (--sjcd_open_count == 0) { sjcd_invalidate_buffers(); s = sjcd_tray_unlock(); @@ -1662,6 +1656,7 @@ * A list of file operations allowed for this cdrom. */ static struct block_device_operations sjcd_fops = { + owner:THIS_MODULE, open:sjcd_open, release:sjcd_release, ioctl:sjcd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/cdrom/sonycd535.c linux/drivers/cdrom/sonycd535.c --- v2.4.13/linux/drivers/cdrom/sonycd535.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/cdrom/sonycd535.c Thu Oct 25 13:58:35 2001 @@ -1399,13 +1399,11 @@ if (check_drive_status() != 0) return -EIO; sony_inuse = 1; - MOD_INC_USE_COUNT; if (spin_up_drive(status) != 0) { printk(CDU535_MESSAGE_NAME " error 0x%.2x (cdu_open, spin up)\n", status[0]); sony_inuse = 0; - MOD_DEC_USE_COUNT; return -EIO; } sony_get_toc(); @@ -1413,7 +1411,6 @@ cmd_buff[0] = SONY535_SPIN_DOWN; do_sony_cmd(cmd_buff, 1, status, NULL, 0, 0); sony_inuse = 0; - MOD_DEC_USE_COUNT; return -EIO; } if (inode) { @@ -1442,7 +1439,6 @@ Byte status[2], cmd_no; sony_inuse = 0; - MOD_DEC_USE_COUNT; if (0 < sony_usage) { sony_usage--; @@ -1463,9 +1459,9 @@ return 0; } - static struct block_device_operations cdu_fops = { + owner: THIS_MODULE, open: cdu_open, release: cdu_release, ioctl: cdu_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/char/Config.in linux/drivers/char/Config.in --- v2.4.13/linux/drivers/char/Config.in Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/Config.in Thu Oct 25 14:01:51 2001 @@ -221,6 +221,8 @@ source drivers/char/pcmcia/Config.in fi -tristate 'ACP Modem (Mwave) support' CONFIG_MWAVE +if [ "$CONFIG_X86" = "y" ]; then + tristate 'ACP Modem (Mwave) support' CONFIG_MWAVE +fi endmenu diff -u --recursive --new-file v2.4.13/linux/drivers/char/README.computone linux/drivers/char/README.computone --- v2.4.13/linux/drivers/char/README.computone Fri Feb 16 16:02:36 2001 +++ linux/drivers/char/README.computone Wed Oct 24 12:05:18 2001 @@ -1,227 +1,10 @@ - Computone Intelliport II/Plus Multiport Serial Driver ----------------------------------------------------- -Release Notes For Linux Kernel 2.2 -These notes have been tested on Linux kernels 2.0 and 2.2. - -Please refer to Documentation/computone.txt for information on the driver -that is included with the kernel sources. - - -Version: 1.2.9 -Date: 04/12/2000 -Fixes and Updates: Doug McNash -Historical Author: Andrew Manison -Kernel Integration: Mike Warfield - -1. INTRODUCTION - -This driver supports the entire family of Intelliport II/Plus controllers -with the exception of the MicroChannel controllers. - -This driver was developed on the v2.0.x Linux source tree and has been -tested up to v2.2.14; it will probably not work with earlier v1.X kernels, -and has not yet been tested on the v2.1.x tree. The most likely problems -will be in patching the kernel sources to support the driver. For this -reason there are 2 different patch files for 2.0.XX and 2.2.XX kernels. -Make sure you use the right one! -Note that a version (1.2.5) is included in the 2.2.12+ kernels so this -will not be a new install but and upgrade. - - -2. QUICK INSTALLATION - -Hardware - If you have an ISA card, find a free interrupt and io port. - List those in use with `cat /proc/interrupts` and - `cat /proc/ioports`. Set the card dip switches to that free - address. You may need to configure your BIOS to reserve the - irq for the ISA card. PCI and EISA parameters are set - automagically and need only be set to nonzero values. - Insert card into computer with the power off before or after - driver installation. - -Software - New Installation - -Module installation: - -a) Obtain driver-kernel patch file -b) Copy to the linux source tree root, Run ip2build (if not patch) -c) Determine free irq/address to use if any (configure BIOS if need be) -d) Run "make config" or "make menuconfig" or "make xconfig" - Select (m) module for CONFIG_COMPUTONE under character - devices. CONFIG_PCI and CONFIG_MODULES also may need to be set. -e) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h if needed - or - edit /etc/modules.conf if needed (module). - or both to match this setting. -f) Run "make dep" -g) Run "make modules" -h) Run "make modules_install" -i) Run "/sbin/depmod -a" -i) install driver using `modprobe ip2 ` (options listed below) -j) run mkip2dev - - -Kernel installation: - -a) Obtain driver-kernel patch file -b) Copy to the linux source tree root, Run ip2build (if not patch) -c) Determine free irq/address to use if any (configure BIOS if need be) -d) Run "make config" or "make menuconfig" or "make xconfig" - Select (y) kernel for CONFIG_COMPUTONE under character - devices. CONFIG_PCI may need to be set if you have PCI bus. -e) Set address on ISA cards then: - edit /usr/src/linux/drivers/char/ip2/ip2.h -f) Run "make dep" -g) Run "make zImage" or whatever target you prefer. -h) mv /usr/src/linux/arch/i386/boot/zImage to /boot. -i) add new config for this kernel into /etc/lilo.conf, run "lilo" -j) reboot using this kernel -k) make and run ip2/mkip2dev - -Software - Upgrades - -a) Install new sources in proper location, usually /usr/src/linux/drivers/char -b) Follow steps above to create new kernel or modules - -3. INSTALLATION - -Previously, the driver sources were packaged with a set of patch files -to update the character drivers' makefile and configuration file, and other -kernel source files. A build script (ip2build) was included which applies -the patches if needed, and build any utilities needed. -What you receive may be a single patch file in conventional kernel -patch format build script. That form can also be applied by -running patch -p1 < ThePatchFile. Otherwise the drivers source may be -a tar file, then untar and run ip2build if a new installation. - -The driver can be installed as a module (recommended) or built into the -kernel. This is selected as for other drivers through the `make config` -command from the root of the Linux source tree. If the driver is built -into the kernel you will need to edit the file ip2.h to match the boards -you are installing. See that file for instructions. If the driver is -installed as a module the configuration can also be specified on the -modprobe command line as follows: - - modprobe ip2 irq=irq1,irq2,irq3,irq4 io=addr1,addr2,addr3,addr4 - -where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11, -12,15) and addr1-4 are the base addresses for up to four controllers. If -the irqs are not specified the driver uses the default in ip2/ip2.h (which -selects polled mode). The io addresses are set to io=1 for PCI cards,i -io=2 for EISA cards or io=[some valid ISA address] for ISA cards. If no -base addresses are specified the defaults in ip2.h are used. If you are -autoloading the driver module with kerneld or kmod the base addresses and -interrupt number must also be set in ip2/ip2.h and recompile or just insert -an options line in /etc/modules.conf or both. The command line takes -precidence over the options line which takes precidence over the defaults -in ip2.h. - -command line sample: - - modprobe ip2 io=1,0x328 irq=1,10 - -/etc/modules.conf sample: - - options ip2 io=1,0x328 irq=1,10 - alias char-major-71 ip2 - alias char-major-72 ip2 - alias char-major-73 ip2 - -the equivelant ip2.h: - -static ip2config_t ip2config = -{ - {1,10,0,0}, - { - 0x0001, // Board 0, ttyF0 - ttyF63 /* PCI card */ - 0x0328, // Board 1, ttyF64 - ttyF127 /* ISA card */ - 0x0000, // Board 2, ttyF128 - ttyF191 /* empty */ - 0x0000 // Board 3, ttyF192 - ttyF255 /* empty */ - } -}; - -Specifying an invalid or in-use ISA irq will default the driver into -running in polled mode for that card. If all irq entries are 0 then -all cards will operate in polled mode. Note that the PCI will be -assigned it's irq by the BIOS and may not match what you specify. -It must be non-zero otherwise it will be polled. - -Tarball Install: - -The whole tarfile should be untarred in the /usr/src/linux/drivers/char/ -directory. Most files required for the driver are placed in the ip2 -subdirectory. Then execute the script (for a new install only) - - ip2build - -which will patch the files. - -Kernel Patch Install: - - cd to the Linux source root, run patch -p1 < ThePatchFile. - -Now return to the root directory of the Linux -source tree and run make config or make menuconfig. You will be prompted -for the Computone drivers, either as a module or part of the kernel. -If you have a PCI card you many need to select PCI bios support (CONFIG_PCI) -if not enabled already. Ditto for CONFIG_MODULES if you use modules. - -If you select the driver as part of the kernel run : - - make depend - make bzImage(,zlilo or whatever you do to create a bootable kernel) - -If you selected a module run : - - make modules && make modules_install - -The utility ip2mkdev creates all the device nodes required by the driver. -For a device to be created it must be configured in the driver and the -board must be installed. Only devices corresponding to real IntelliPort II -ports are created. With multiple boards and expansion boxes this will -leave gaps in the sequence of device names. ip2mkdev uses Linux tty naming -conventions: ttyF0 - ttyF255 for normal devices, and cuf0 - cuf255 for -callout devices. Note that the callout devices are going away in the -future and that is what the warning messages are trying to tell you. - -4. USING THE DRIVERS - -As noted above, the driver implements the ports in accordance with Linux -conventions, and the devices should be interchangeable with the standard -serial devices. (This is a key point for problem reporting: please make -sure that what you are trying do works on the ttySx/cuax ports first; then -tell us what went wrong with the ip2 ports!) - -Higher speeds can be obtained using the setserial utility which remaps -38,400 bps (extb) to 57,600 bps, 115,200 bps, or a custom speed. -Intelliport II installations using the PowerPort expansion module can -use the custom speed setting to select the highest speeds: 153,600 bps, -230,400 bps, 307,200 bps, 460,800bps and 921,600 bps. The base for -custom baud rate configuration is fixed at 921,600 for cards/expantion -modules with ST654's and 115200 for those with Cirrus CD1400's. This -corresponds to the maximum bit rates those chips are capable. -For example if the baud base is 921600 and the baud divisor is 18 then -the custom rate is 921600/18 = 51200 bps. See the setserial man page for -complete details. Of course, if stty accepts the higher rates now you can -use that as well as the standard ioctls(). - -5. NOTES - -This is a release version of the driver, but it is impossible to test it -in all configurations of Linux. If there is any anomalous behaviour that -does not match the standard serial port's behaviour please let us know. - -Some installations report that characters fail to echo immediatly at a -terminal if the kernel/modules are compiled with the CONFIG_M386 and -the card is run in polling mode on a pentium class machine. Compiling -with a more appropriate processor flag or running on interrupt would be -the fix as well as the wise thing to do. +Release Notes For Linux Kernel 2.2 and higher +This file is now deprecated and will be removed at some point. +Please refer to the file Documentation/computone.txt instead. -Author: dougm@computone.com -Testing: larryg@computone.com -Support: support@computone.com +Michael H. Warfield 08/12/2001 diff -u --recursive --new-file v2.4.13/linux/drivers/char/applicom.c linux/drivers/char/applicom.c --- v2.4.13/linux/drivers/char/applicom.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/applicom.c Thu Oct 25 13:53:47 2001 @@ -72,6 +72,17 @@ "PCI2000PFB" }; +static struct pci_device_id applicom_pci_tbl[] = { + { PCI_VENDOR_ID_APPLICOM, PCI_DEVICE_ID_APPLICOM_PCIGENERIC, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_APPLICOM, PCI_DEVICE_ID_APPLICOM_PCI2000IBS_CAN, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VENDOR_ID_APPLICOM, PCI_DEVICE_ID_APPLICOM_PCI2000PFB, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0 } +}; +MODULE_DEVICE_TABLE(pci, applicom_pci_tbl); + MODULE_AUTHOR("David Woodhouse & Applicom International"); MODULE_DESCRIPTION("Driver for Applicom Profibus card"); MODULE_LICENSE("GPL"); @@ -437,7 +448,7 @@ } /* We may not have actually slept */ - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); remove_wait_queue(&apbs[IndexCard].FlagSleepSend, &wait); writeb(1, apbs[IndexCard].RamIO + DATA_FROM_PC_READY); diff -u --recursive --new-file v2.4.13/linux/drivers/char/drm/drmP.h linux/drivers/char/drm/drmP.h --- v2.4.13/linux/drivers/char/drm/drmP.h Thu Oct 18 13:48:13 2001 +++ linux/drivers/char/drm/drmP.h Wed Oct 31 15:35:44 2001 @@ -781,30 +781,30 @@ #if LINUX_VERSION_CODE < 0x020317 extern unsigned long DRM(vm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); extern unsigned long DRM(vm_shm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); extern unsigned long DRM(vm_dma_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); extern unsigned long DRM(vm_sg_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); #else /* Return type changed in 2.3.23 */ extern struct page *DRM(vm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); extern struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); extern struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); extern struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access); + int unused); #endif extern void DRM(vm_open)(struct vm_area_struct *vma); extern void DRM(vm_close)(struct vm_area_struct *vma); diff -u --recursive --new-file v2.4.13/linux/drivers/char/drm/drm_vm.h linux/drivers/char/drm/drm_vm.h --- v2.4.13/linux/drivers/char/drm/drm_vm.h Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/drm/drm_vm.h Wed Oct 31 15:35:44 2001 @@ -59,12 +59,12 @@ #if LINUX_VERSION_CODE < 0x020317 unsigned long DRM(vm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #else /* Return type changed in 2.3.23 */ struct page *DRM(vm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #endif { #if __REALLY_HAVE_AGP @@ -137,12 +137,12 @@ #if LINUX_VERSION_CODE < 0x020317 unsigned long DRM(vm_shm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #else /* Return type changed in 2.3.23 */ struct page *DRM(vm_shm_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #endif { #if LINUX_VERSION_CODE >= 0x020300 @@ -273,12 +273,12 @@ #if LINUX_VERSION_CODE < 0x020317 unsigned long DRM(vm_dma_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #else /* Return type changed in 2.3.23 */ struct page *DRM(vm_dma_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #endif { drm_file_t *priv = vma->vm_file->private_data; @@ -310,12 +310,12 @@ #if LINUX_VERSION_CODE < 0x020317 unsigned long DRM(vm_sg_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #else /* Return type changed in 2.3.23 */ struct page *DRM(vm_sg_nopage)(struct vm_area_struct *vma, unsigned long address, - int write_access) + int unused) #endif { #if LINUX_VERSION_CODE >= 0x020300 diff -u --recursive --new-file v2.4.13/linux/drivers/char/eurotechwdt.c linux/drivers/char/eurotechwdt.c --- v2.4.13/linux/drivers/char/eurotechwdt.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/char/eurotechwdt.c Thu Oct 25 13:53:47 2001 @@ -0,0 +1,480 @@ +/* + * Eurotech CPU-1220/1410 on board WDT driver for Linux 2.4.x + * + * (c) Copyright 2001 Ascensit + * (c) Copyright 2001 Rodolfo Giometti + * + * Based on wdt.c. + * Original copyright messages: + * + * (c) Copyright 1996-1997 Alan Cox , All Rights Reserved. + * http://www.redhat.com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * Neither Alan Cox nor CymruNet Ltd. admit liability nor provide + * warranty for any of this software. This material is provided + * "AS-IS" and at no charge. + * + * (c) Copyright 1995 Alan Cox * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int eurwdt_is_open; +static int eurwdt_timeout; +static spinlock_t eurwdt_lock; + +/* + * You must set these - there is no sane way to probe for this board. + * You can use wdt=x,y to set these now. + */ + +static int io = 0x3f0; +static int irq = 10; +static char *ev = "int"; + +#define WDT_TIMEOUT 60 /* 1 minute */ + + +/* + * Some symbolic names + */ + +#define WDT_CTRL_REG 0x30 +#define WDT_OUTPIN_CFG 0xe2 + #define WDT_EVENT_INT 0x00 + #define WDT_EVENT_REBOOT 0x08 +#define WDT_UNIT_SEL 0xf1 + #define WDT_UNIT_SECS 0x80 +#define WDT_TIMEOUT_VAL 0xf2 +#define WDT_TIMER_CFG 0xf3 + + +#ifndef MODULE + +/** + * eurwdt_setup: + * @str: command line string + * + * Setup options. The board isn't really probe-able so we have to + * get the user to tell us the configuration. Sane people build it + * modular but the others come here. + */ + +static int __init eurwdt_setup(char *str) +{ + int ints[4]; + + str = get_options (str, ARRAY_SIZE(ints), ints); + + if (ints[0] > 0) { + io = ints[1]; + if (ints[0] > 1) + irq = ints[2]; + } + + return 1; +} + +__setup("wdt=", eurwdt_setup); + +#endif /* !MODULE */ + +MODULE_PARM(io, "i"); +MODULE_PARM_DESC(io, "Eurotech WDT io port (default=0x3f0)"); +MODULE_PARM(irq, "i"); +MODULE_PARM_DESC(irq, "Eurotech WDT irq (default=10)"); +MODULE_PARM(ev, "s"); +MODULE_PARM_DESC(ev, "Eurotech WDT event type (default is `reboot')"); + + +/* + * Programming support + */ + +static inline void eurwdt_write_reg(u8 index, u8 data) +{ + outb(index, io); + outb(data, io+1); +} + +static inline void eurwdt_lock_chip(void) +{ + outb(0xaa, io); +} + +static inline void eurwdt_unlock_chip(void) +{ + outb(0x55, io); + eurwdt_write_reg(0x07, 0x08); /* set the logical device */ +} + +static inline void eurwdt_set_timeout(int timeout) +{ + eurwdt_write_reg(WDT_TIMEOUT_VAL, (u8) timeout); +} + +static inline void eurwdt_disable_timer(void) +{ + eurwdt_set_timeout(0); +} + +static void eurwdt_activate_timer(void) +{ + eurwdt_disable_timer(); + eurwdt_write_reg(WDT_CTRL_REG, 0x01); /* activate the WDT */ + eurwdt_write_reg(WDT_OUTPIN_CFG, !strcmp("int", ev) ? + WDT_EVENT_INT : WDT_EVENT_REBOOT); + /* Setting interrupt line */ + if (irq == 2 || irq > 15 || irq < 0) { + printk(KERN_ERR ": invalid irq number\n"); + irq = 0; /* if invalid we disable interrupt */ + } + if (irq == 0) + printk(KERN_INFO ": interrupt disabled\n"); + eurwdt_write_reg(WDT_TIMER_CFG, irq<<4); + + eurwdt_write_reg(WDT_UNIT_SEL, WDT_UNIT_SECS); /* we use seconds */ + eurwdt_set_timeout(0); /* the default timeout */ +} + + +/* + * Kernel methods. + */ + +void eurwdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + printk(KERN_CRIT "timeout WDT timeout\n"); + +#ifdef ONLY_TESTING + printk(KERN_CRIT "Would Reboot.\n"); +#else + printk(KERN_CRIT "Initiating system reboot.\n"); + machine_restart(NULL); +#endif +} + + +/** + * eurwdt_ping: + * + * Reload counter one with the watchdog timeout. + */ + +static void eurwdt_ping(void) +{ + /* Write the watchdog default value */ + eurwdt_set_timeout(eurwdt_timeout); +} + +/** + * eurwdt_write: + * @file: file handle to the watchdog + * @buf: buffer to write (unused as data does not matter here + * @count: count of bytes + * @ppos: pointer to the position to write. No seeks allowed + * + * A write to a watchdog device is defined as a keepalive signal. Any + * write of data will do, as we we don't define content meaning. + */ + +static ssize_t eurwdt_write(struct file *file, const char *buf, size_t count, +loff_t *ppos) +{ + /* Can't seek (pwrite) on this device */ + if (ppos != &file->f_pos) + return -ESPIPE; + + if (count) { + eurwdt_ping(); /* the default timeout */ + return 1; + } + + return 0; +} + +/** + * eurwdt_ioctl: + * @inode: inode of the device + * @file: file handle to the device + * @cmd: watchdog command + * @arg: argument pointer + * + * The watchdog API defines a common set of functions for all watchdogs + * according to their available features. + */ + +static int eurwdt_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + static struct watchdog_info ident = { + options : WDIOF_CARDRESET, + firmware_version : 1, + identity : "WDT Eurotech CPU-1220/1410" + }; + + int time; + + switch(cmd) { + default: + return -ENOTTY; + + case WDIOC_GETSUPPORT: + return copy_to_user((struct watchdog_info *)arg, &ident, + sizeof(ident)) ? -EFAULT : 0; + + case WDIOC_GETBOOTSTATUS: + return put_user(0, (int *) arg); + + case WDIOC_KEEPALIVE: + eurwdt_ping(); + return 0; + + case WDIOC_SETTIMEOUT: + if (copy_from_user(&time, (int *) arg, sizeof(int))) + return -EFAULT; + + /* Sanity check */ + if (time < 0 || time > 255) + return -EINVAL; + + eurwdt_timeout = time; + eurwdt_set_timeout(time); + return 0; + } +} + +/** + * eurwdt_open: + * @inode: inode of device + * @file: file handle to device + * + * The misc device has been opened. The watchdog device is single + * open and on opening we load the counter. + */ + +static int eurwdt_open(struct inode *inode, struct file *file) +{ + switch (MINOR(inode->i_rdev)) { + case WATCHDOG_MINOR: + spin_lock(&eurwdt_lock); + if (eurwdt_is_open) { + spin_unlock(&eurwdt_lock); + return -EBUSY; + } + + eurwdt_is_open = 1; + eurwdt_timeout = WDT_TIMEOUT; /* initial timeout */ + + /* Activate the WDT */ + eurwdt_activate_timer(); + + spin_unlock(&eurwdt_lock); + + MOD_INC_USE_COUNT; + + return 0; + + case TEMP_MINOR: + return 0; + + default: + return -ENODEV; + } +} + +/** + * eurwdt_release: + * @inode: inode to board + * @file: file handle to board + * + * The watchdog has a configurable API. There is a religious dispute + * between people who want their watchdog to be able to shut down and + * those who want to be sure if the watchdog manager dies the machine + * reboots. In the former case we disable the counters, in the latter + * case you have to open it again very soon. + */ + +static int eurwdt_release(struct inode *inode, struct file *file) +{ + if (MINOR(inode->i_rdev) == WATCHDOG_MINOR) { +#ifndef CONFIG_WATCHDOG_NOWAYOUT + eurwdt_disable_timer(); +#endif + eurwdt_is_open = 0; + + MOD_DEC_USE_COUNT; + } + + return 0; +} + +/** + * eurwdt_notify_sys: + * @this: our notifier block + * @code: the event being reported + * @unused: unused + * + * Our notifier is called on system shutdowns. We want to turn the card + * off at reboot otherwise the machine will reboot again during memory + * test or worse yet during the following fsck. This would suck, in fact + * trust me - if it happens it does suck. + */ + +static int eurwdt_notify_sys(struct notifier_block *this, unsigned long code, + void *unused) +{ + if (code == SYS_DOWN || code == SYS_HALT) { + /* Turn the card off */ + eurwdt_disable_timer(); + } + + return NOTIFY_DONE; +} + +/* + * Kernel Interfaces + */ + + +static struct file_operations eurwdt_fops = { + owner: THIS_MODULE, + llseek: no_llseek, + write: eurwdt_write, + ioctl: eurwdt_ioctl, + open: eurwdt_open, + release: eurwdt_release, +}; + +static struct miscdevice eurwdt_miscdev = +{ + WATCHDOG_MINOR, + "watchdog", + &eurwdt_fops +}; + +/* + * The WDT card needs to learn about soft shutdowns in order to + * turn the timebomb registers off. + */ + +static struct notifier_block eurwdt_notifier = +{ + eurwdt_notify_sys, + NULL, + 0 +}; + +/** + * cleanup_module: + * + * Unload the watchdog. You cannot do this with any file handles open. + * If your watchdog is set to continue ticking on close and you unload + * it, well it keeps ticking. We won't get the interrupt but the board + * will not touch PC memory so all is fine. You just have to load a new + * module in 60 seconds or reboot. + */ + +static void __exit eurwdt_exit(void) +{ + eurwdt_lock_chip(); + + misc_deregister(&eurwdt_miscdev); + + unregister_reboot_notifier(&eurwdt_notifier); + release_region(io, 2); + free_irq(irq, NULL); +} + +/** + * eurwdt_init: + * + * Set up the WDT watchdog board. After grabbing the resources + * we require we need also to unlock the device. + * The open() function will actually kick the board off. + */ + +static int __init eurwdt_init(void) +{ + int ret; + + ret = misc_register(&eurwdt_miscdev); + if (ret) { + printk(KERN_ERR "eurwdt: can't misc_register on minor=%d\n", + WATCHDOG_MINOR); + goto out; + } + + ret = request_irq(irq, eurwdt_interrupt, SA_INTERRUPT, "eurwdt", NULL); + if(ret) { + printk(KERN_ERR "eurwdt: IRQ %d is not free.\n", irq); + goto outmisc; + } + + if (!request_region(io, 2, "eurwdt")) { + printk(KERN_ERR "eurwdt: IO %X is not free.\n", io); + ret = -EBUSY; + goto outirq; + } + + ret = register_reboot_notifier(&eurwdt_notifier); + if (ret) { + printk(KERN_ERR "eurwdt: can't register reboot notifier (err=%d)\n", ret); + goto outreg; + } + + eurwdt_unlock_chip(); + + ret = 0; + printk(KERN_INFO "Eurotech WDT driver 0.01 at %X (Interrupt %d)" + " - timeout event: %s\n", + io, irq, (!strcmp("int", ev) ? "int" : "reboot")); + + spin_lock_init(&eurwdt_lock); + + out: + return ret; + + outreg: + release_region(io, 2); + + outirq: + free_irq(irq, NULL); + + outmisc: + misc_deregister(&eurwdt_miscdev); + goto out; +} + +module_init(eurwdt_init); +module_exit(eurwdt_exit); + +MODULE_AUTHOR("Rodolfo Giometti"); +MODULE_DESCRIPTION("Driver for Eurotech CPU-1220/1410 on board watchdog"); +MODULE_LICENSE("GPL"); +EXPORT_NO_SYMBOLS; diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2cmd.c linux/drivers/char/ip2/i2cmd.c --- v2.4.13/linux/drivers/char/ip2/i2cmd.c Wed Jul 25 17:10:19 2001 +++ linux/drivers/char/ip2/i2cmd.c Wed Oct 24 12:05:18 2001 @@ -139,7 +139,7 @@ //static UCHAR ct86[]={ 2, BTH, 0x56,0 }; // RCV_ENABLE static UCHAR ct87[] = { 1, BYP, 0x57 }; // HW_TEST //static UCHAR ct88[]={ 3, BTH, 0x58,0,0 }; // RCV_THRESHOLD -//static UCHAR ct89[]={ 1, BYP, 0x59 }; // DSS_NOW +static UCHAR ct89[]={ 1, BYP, 0x59 }; // DSS_NOW //static UCHAR ct90[]={ 3, BYP, 0x5A,0,0 }; // Set SILO //static UCHAR ct91[]={ 2, BYP, 0x5B,0 }; // timed break diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2ellis.c linux/drivers/char/ip2/i2ellis.c --- v2.4.13/linux/drivers/char/ip2/i2ellis.c Mon Oct 16 12:58:51 2000 +++ linux/drivers/char/ip2/i2ellis.c Wed Oct 24 12:05:18 2001 @@ -552,6 +552,9 @@ pB->i2eStartMail = iiGetMail(pB); + // Throw it away and clear the mailbox structure element + pB->i2eStartMail = NO_MAIL_HERE; + // Everything is ok now, return with good status/ pB->i2eValid = I2E_MAGIC; @@ -592,14 +595,27 @@ static void ii2DelayTimer(unsigned int mseconds) { + wait_queue_t wait; + + init_waitqueue_entry(&wait, current); + init_timer ( pDelayTimer ); + add_wait_queue(&pDelayWait, &wait); + + set_current_state( TASK_INTERRUPTIBLE ); + pDelayTimer->expires = jiffies + ( mseconds + 9 ) / 10; pDelayTimer->function = ii2DelayWakeup; pDelayTimer->data = 0; add_timer ( pDelayTimer ); - interruptible_sleep_on ( &pDelayWait ); + + schedule(); + + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pDelayWait, &wait); + del_timer ( pDelayTimer ); } diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2ellis.h linux/drivers/char/ip2/i2ellis.h --- v2.4.13/linux/drivers/char/ip2/i2ellis.h Wed Jul 5 11:00:22 2000 +++ linux/drivers/char/ip2/i2ellis.h Wed Oct 24 12:05:18 2001 @@ -400,6 +400,12 @@ rwlock_t read_fifo_spinlock; rwlock_t write_fifo_spinlock; +// For queuing interupt bottom half handlers. /\/\|=mhw=|\/\/ + struct tq_struct tqueue_interrupt; + + struct timer_list SendPendingTimer; // Used by iiSendPending + unsigned int SendPendingRetry; + #ifdef CONFIG_DEVFS_FS /* Device handles into devfs */ devfs_handle_t devfs_ipl_handle; diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/i2lib.c linux/drivers/char/ip2/i2lib.c --- v2.4.13/linux/drivers/char/ip2/i2lib.c Wed Jul 5 11:00:22 2000 +++ linux/drivers/char/ip2/i2lib.c Wed Oct 24 12:05:18 2001 @@ -174,6 +174,25 @@ pB->i2eWaitingForEmptyFifo |= (pB->i2eOutMailWaiting & MB_OUT_STUFFED); pB->i2eOutMailWaiting = 0; + pB->SendPendingRetry = 0; + } else { +/* The only time we hit this area is when "iiTrySendMail" has + failed. That only occurs when the outbound mailbox is + still busy with the last message. We take a short breather + to let the board catch up with itself and then try again. + 16 Retries is the limit - then we got a borked board. + /\/\|=mhw=|\/\/ */ + + if( ++pB->SendPendingRetry < 16 ) { + + init_timer( &(pB->SendPendingTimer) ); + pB->SendPendingTimer.expires = jiffies + 1; + pB->SendPendingTimer.function = (void*)(unsigned long)iiSendPendingMail; + pB->SendPendingTimer.data = (unsigned long)pB; + add_timer( &(pB->SendPendingTimer) ); + } else { + printk( KERN_ERR "IP2: iiSendPendingMail unable to queue outbound mail\n" ); + } } } } @@ -225,6 +244,8 @@ pB->i2Dbuf_strip = pB->i2Dbuf_stuff = 0; pB->i2Bbuf_strip = pB->i2Bbuf_stuff = 0; + pB->SendPendingRetry = 0; + memset ( pCh, 0, sizeof (i2ChanStr) * nChannels ); for (index = stuffIndex = 0, ppCh = (i2ChanStrPtr *)(pB->i2Fbuf); @@ -311,13 +332,11 @@ pCh->ClosingDelay = 5*HZ/10; pCh->ClosingWaitTime = 30*HZ; -#ifdef USE_IQ // Initialize task queue objects pCh->tqueue_input.routine = (void(*)(void*)) do_input; pCh->tqueue_input.data = pCh; pCh->tqueue_status.routine = (void(*)(void*)) do_status; pCh->tqueue_status.data = pCh; -#endif pCh->trace = ip2trace; @@ -1294,6 +1313,7 @@ static void i2DrainOutput(i2ChanStrPtr pCh, int timeout) { + wait_queue_t wait; i2eBordStrPtr pB; #ifdef IP2DEBUG_TRACE @@ -1323,9 +1343,18 @@ } i2QueueCommands( PTYPE_INLINE, pCh, -1, 1, CMD_BMARK_REQ ); + + init_waitqueue_entry(&wait, current); + add_wait_queue(&(pCh->pBookmarkWait), &wait); + set_current_state( TASK_INTERRUPTIBLE ); + serviceOutgoingFifo( pB ); - interruptible_sleep_on( &(pCh->pBookmarkWait) ); + schedule(); // Now we take our interruptible sleep on + + // Clean up the queue + set_current_state( TASK_RUNNING ); + remove_wait_queue(&(pCh->pBookmarkWait), &wait); // if expires == 0 then timer poped, then do not need to del_timer if ((timeout > 0) && pCh->BookmarkTimer.expires && @@ -2212,7 +2241,11 @@ unsigned long flags; - inmail = iiGetMail(pB); + /* This should be atomic because of the way we are called... */ + if (NO_MAIL_HERE == ( inmail = pB->i2eStartMail ) ) { + inmail = iiGetMail(pB); + } + pB->i2eStartMail = NO_MAIL_HERE; #ifdef IP2DEBUG_TRACE ip2trace (ITRC_NO_PORT, ITRC_INTR, 2, 1, inmail ); diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2/ip2.h linux/drivers/char/ip2/ip2.h --- v2.4.13/linux/drivers/char/ip2/ip2.h Sat Nov 6 10:38:40 1999 +++ linux/drivers/char/ip2/ip2.h Wed Oct 24 12:05:18 2001 @@ -94,10 +94,20 @@ * /etc/modules.conf and load with modprobe, kerneld or kmod, the kernel * module loader */ + + /* This structure is NOW always initialized when the driver is initialized. + * Compiled in defaults MUST be added to the io and irq arrays in + * ip2.c. Those values are configurable from insmod parameters in the + * case of modules or from command line parameters (ip2=io,irq) when + * compiled in. + */ + static ip2config_t ip2config = { {0,0,0,0}, // irqs { // Addresses + /* Do NOT set compile time defaults HERE! Use the arrays in + ip2.c! These WILL be overwritten! =mhw= */ 0x0000, // Board 0, ttyF0 - ttyF63 0x0000, // Board 1, ttyF64 - ttyF127 0x0000, // Board 2, ttyF128 - ttyF191 diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2.c linux/drivers/char/ip2.c --- v2.4.13/linux/drivers/char/ip2.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/ip2.c Wed Oct 24 12:05:18 2001 @@ -27,10 +27,15 @@ int ip2_loadmain(int *, int *, unsigned char *, int ); // ref into ip2main.c -#ifdef MODULE +/* Note: Add compiled in defaults to these arrays, not to the structure + in ip2/ip2.h any longer. That structure WILL get overridden + by these values, or command line values, or insmod values!!! =mhw= +*/ +static int io[IP2_MAX_BOARDS]= { 0, 0, 0, 0 }; +static int irq[IP2_MAX_BOARDS] = { -1, -1, -1, -1 }; +static int poll_only = 0; -static int io[IP2_MAX_BOARDS]= { 0,}; -static int irq[IP2_MAX_BOARDS] = { 0,}; +#ifdef MODULE # if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) MODULE_AUTHOR("Doug McNash"); @@ -39,6 +44,8 @@ MODULE_PARM_DESC(irq,"Interrupts for IntelliPort Cards"); MODULE_PARM(io,"1-"__MODULE_STRING(IP2_MAX_BOARDS) "i"); MODULE_PARM_DESC(io,"I/O ports for IntelliPort Cards"); + MODULE_PARM(poll_only,"1i"); + MODULE_PARM_DESC(poll_only,"Do not use card interrupts"); # endif /* LINUX_VERSION */ @@ -50,6 +57,11 @@ MOD_INC_USE_COUNT; // hold till done + if( poll_only ) { + /* Hard lock the interrupts to zero */ + irq[0] = irq[1] = irq[2] = irq[3] = 0; + } + rc = ip2_loadmain(io,irq,(unsigned char *)fip_firm,sizeof(fip_firm)); // The call to lock and load main, create dep @@ -61,7 +73,7 @@ int ip2_init(void) { - // call to this is int tty_io.c so we need this + // call to this is in tty_io.c so we need this return 0; } @@ -79,9 +91,61 @@ # define NULL ((void *) 0) #endif +/****************************************************************************** + * ip2_setup: + * str: kernel command line string + * + * Can't autoprobe the boards so user must specify configuration on + * kernel command line. Sane people build it modular but the others + * come here. + * + * Alternating pairs of io,irq for up to 4 boards. + * ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3 + * + * io=0 => No board + * io=1 => PCI + * io=2 => EISA + * else => ISA I/O address + * + * irq=0 or invalid for ISA will revert to polling mode + * + * Any value = -1, do not overwrite compiled in value. + * + ******************************************************************************/ +static int __init ip2_setup(char *str) +{ + int ints[10]; /* 4 boards, 2 parameters + 2 */ + int i, j; + + str = get_options (str, ARRAY_SIZE(ints), ints); + + for( i = 0, j = 1; i < 4; i++ ) { + if( j > ints[0] ) { + break; + } + if( ints[j] >= 0 ) { + io[i] = ints[j]; + } + j++; + if( j > ints[0] ) { + break; + } + if( ints[j] >= 0 ) { + irq[i] = ints[j]; + } + j++; + } + return 1; +} + int ip2_init(void) { - return ip2_loadmain(NULL,NULL,(unsigned char *)fip_firm,sizeof(fip_firm)); + return ip2_loadmain(io,irq,(unsigned char *)fip_firm,sizeof(fip_firm)); } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,13)) +__setup("ip2=", ip2_setup); +__initcall(ip2_init); +#endif #endif /* !MODULE */ diff -u --recursive --new-file v2.4.13/linux/drivers/char/ip2main.c linux/drivers/char/ip2main.c --- v2.4.13/linux/drivers/char/ip2main.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/ip2main.c Wed Oct 24 12:05:18 2001 @@ -12,8 +12,30 @@ *******************************************************************************/ // ToDo: // +// Fix the immediate DSS_NOW problem. +// // Done: // +// 1.2.12 /\/\|=mhw=|\/\/ +// Cleaned up some remove queue cut and paste errors +// +// 1.2.11 /\/\|=mhw=|\/\/ +// Clean up potential NULL pointer dereferences +// Clean up devfs registration +// Add kernel command line parsing for io and irq +// Compile defaults for io and irq are now set in ip2.c not ip2/ip2.h! +// Reworked poll_only hack for explicit parameter setting +// You must now EXPLICITLY set poll_only = 1 or set all irqs to 0 +// Merged ip2_loadmain and old_ip2_init +// Converted all instances of interruptible_sleep_on into queue calls +// Most of these had no race conditions but better to clean up now +// +// 1.2.10 /\/\|=mhw=|\/\/ +// Fixed the bottom half interrupt handler and enabled USE_IQI +// to split the interrupt handler into a formal top-half / bottom-half +// Fixed timing window on high speed processors that queued messages to +// the outbound mail fifo faster than the board could handle. +// // 1.2.9 // Four box EX was barfing on >128k kmalloc, made structure smaller by // reducing output buffer size @@ -193,7 +215,7 @@ /* String constants to identify ourselves */ static char *pcName = "Computone IntelliPort Plus multiport driver"; -static char *pcVersion = "1.2.9"; +static char *pcVersion = "1.2.11"; /* String constants for port names */ static char *pcDriver_name = "ip2"; @@ -225,8 +247,6 @@ void cleanup_module(void); #endif -int old_ip2_init(void); - /* Private (static) functions */ static int ip2_open(PTTY, struct file *); static void ip2_close(PTTY, struct file *); @@ -246,6 +266,7 @@ static void ip2_hangup(PTTY); static void set_irq(int, int); +static void ip2_interrupt_bh(i2eBordStrPtr pB); static void ip2_interrupt(int irq, void *dev_id, struct pt_regs * regs); static void ip2_poll(unsigned long arg); static inline void service_all_boards(void); @@ -310,11 +331,11 @@ open: ip2_ipl_open, }; -static long irq_counter; -static long bh_counter; +static unsigned long irq_counter = 0; +static unsigned long bh_counter = 0; // Use immediate queue to service interrupts -//#define USE_IQI // PCI&2.2 needs work +#define USE_IQI //#define USE_IQ // PCI&2.2 needs work /* The timer_list entry for our poll routine. If interrupt operation is not @@ -364,7 +385,7 @@ # endif /* LINUX_VERSION */ #endif /* MODULE */ -static int poll_only; +static int poll_only = 0; static int Eisa_irq; static int Eisa_slot; @@ -373,32 +394,6 @@ static char rirqs[IP2_MAX_BOARDS]; static int Valid_Irqs[] = { 3, 4, 5, 7, 10, 11, 12, 15, 0}; -/******************************************************************************/ -/* Initialisation Section */ -/******************************************************************************/ -int -ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) -{ - int i; - /* process command line arguments to modprobe or insmod i.e. iop & irqp */ - /* otherwise ip2config is initialized by what's in ip2/ip2.h */ - /* command line trumps initialization in ip2.h */ - /* first two args are null if builtin to kernel */ - if ((irqp != NULL) || (iop != NULL)) { - for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { - if (irqp && irqp[i]) { - ip2config.irq[i] = irqp[i]; - } - if (iop && iop[i]) { - ip2config.addr[i] = iop[i]; - } - } - } - Fip_firmware = firmware; - Fip_firmware_size = firmsize; - return old_ip2_init(); -} - // Some functions to keep track of what irq's we have static int __init @@ -461,7 +456,6 @@ #ifdef IP2DEBUG_INIT printk (KERN_DEBUG "Loading module ...\n" ); #endif - //was return old_ip2_init(); return 0; } #endif /* MODULE */ @@ -559,8 +553,9 @@ #endif /* MODULE */ /******************************************************************************/ -/* Function: old_ip2_init() */ +/* Function: ip2_loadmain() */ /* Parameters: irq, io from command line of insmod et. al. */ +/* pointer to fip firmware and firmware size for boards */ /* Returns: Success (0) */ /* */ /* Description: */ @@ -575,7 +570,7 @@ #define IP2_SA_FLAGS 0 int __init -old_ip2_init(void) +ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize) { #ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_handle; @@ -592,6 +587,39 @@ ip2trace (ITRC_NO_PORT, ITRC_INIT, ITRC_ENTER, 0 ); #endif + /* process command line arguments to modprobe or + insmod i.e. iop & irqp */ + /* irqp and iop should ALWAYS be specified now... But we check + them individually just to be sure, anyways... */ + for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { + if (iop) { + ip2config.addr[i] = iop[i]; + if (irqp) { + if( irqp[i] >= 0 ) { + ip2config.irq[i] = irqp[i]; + } else { + ip2config.irq[i] = 0; + } + // This is a little bit of a hack. If poll_only=1 on command + // line back in ip2.c OR all IRQs on all specified boards are + // explicitly set to 0, then drop to poll only mode and override + // PCI or EISA interrupts. This superceeds the old hack of + // triggering if all interrupts were zero (like da default). + // Still a hack but less prone to random acts of terrorism. + // + // What we really should do, now that the IRQ default is set + // to -1, is to use 0 as a hard coded, do not probe. + // + // /\/\|=mhw=|\/\/ + poll_only |= irqp[i]; + } + } + } + poll_only = !poll_only; + + Fip_firmware = firmware; + Fip_firmware_size = firmsize; + /* Announce our presence */ printk( KERN_INFO "%s version %s\n", pcName, pcVersion ); @@ -604,12 +632,6 @@ } loaded++; - /* if all irq config is zero we shall poll_only */ - for ( i = 0; i < IP2_MAX_BOARDS; ++i ) { - poll_only |= ip2config.irq[i]; - } - poll_only = !poll_only; - /* Initialise the iiEllis subsystem. */ iiEllisInit(); @@ -672,10 +694,13 @@ pcibios_read_config_byte(pci_bus, pci_devfn, PCI_INTERRUPT_LINE, &pci_irq); - if (!is_valid_irq(pci_irq)) { - printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); - pci_irq = 0; - } +// If the PCI BIOS assigned it, lets try and use it. If we +// can't acquire it or it screws up, deal with it then. + +// if (!is_valid_irq(pci_irq)) { +// printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); +// pci_irq = 0; +// } ip2config.irq[i] = pci_irq; } else { // ann error ip2config.addr[i] = 0; @@ -706,10 +731,13 @@ status = pci_read_config_byte(pci_dev_i, PCI_INTERRUPT_LINE, &pci_irq); - if (!is_valid_irq(pci_irq)) { - printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); - pci_irq = 0; - } +// If the PCI BIOS assigned it, lets try and use it. If we +// can't acquire it or it screws up, deal with it then. + +// if (!is_valid_irq(pci_irq)) { +// printk( KERN_ERR "IP2: Bad PCI BIOS IRQ(%d)\n",pci_irq); +// pci_irq = 0; +// } ip2config.irq[i] = pci_irq; } else { // ann error ip2config.addr[i] = 0; @@ -868,41 +896,45 @@ } #ifdef CONFIG_DEVFS_FS - sprintf( name, "ipl%d", i ); - i2BoardPtrTable[i]->devfs_ipl_handle = - devfs_register (devfs_handle, name, - DEVFS_FL_DEFAULT, - IP2_IPL_MAJOR, 4 * i, - S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, - &ip2_ipl, NULL); - - sprintf( name, "stat%d", i ); - i2BoardPtrTable[i]->devfs_stat_handle = - devfs_register (devfs_handle, name, - DEVFS_FL_DEFAULT, - IP2_IPL_MAJOR, 4 * i + 1, - S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, - &ip2_ipl, NULL); - - for ( box = 0; box < ABS_MAX_BOXES; ++box ) - { - for ( j = 0; j < ABS_BIGGEST_BOX; ++j ) + if ( NULL != ( pB = i2BoardPtrTable[i] ) ) { + sprintf( name, "ipl%d", i ); + pB->devfs_ipl_handle = + devfs_register (devfs_handle, name, + DEVFS_FL_DEFAULT, + IP2_IPL_MAJOR, 4 * i, + S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, + &ip2_ipl, NULL); + + sprintf( name, "stat%d", i ); + pB->devfs_stat_handle = + devfs_register (devfs_handle, name, + DEVFS_FL_DEFAULT, + IP2_IPL_MAJOR, 4 * i + 1, + S_IRUSR | S_IWUSR | S_IRGRP | S_IFCHR, + &ip2_ipl, NULL); + + for ( box = 0; box < ABS_MAX_BOXES; ++box ) { - if ( pB->i2eChannelMap[box] & (1 << j) ) - { - tty_register_devfs(&ip2_tty_driver, - 0, j + ABS_BIGGEST_BOX * - (box+i*ABS_MAX_BOXES)); - tty_register_devfs(&ip2_callout_driver, - 0, j + ABS_BIGGEST_BOX * - (box+i*ABS_MAX_BOXES)); - } + for ( j = 0; j < ABS_BIGGEST_BOX; ++j ) + { + if ( pB->i2eChannelMap[box] & (1 << j) ) + { + tty_register_devfs(&ip2_tty_driver, + 0, j + ABS_BIGGEST_BOX * + (box+i*ABS_MAX_BOXES)); + tty_register_devfs(&ip2_callout_driver, + 0, j + ABS_BIGGEST_BOX * + (box+i*ABS_MAX_BOXES)); + } + } } } #endif if (poll_only) { - ip2config.irq[i] = CIR_POLL; +// Poll only forces driver to only use polling and +// to ignore the probed PCI or EISA interrupts. + ip2config.irq[i] = CIR_POLL; } if ( ip2config.irq[i] == CIR_POLL ) { retry: @@ -963,26 +995,24 @@ if ( !iiInitialize ( pB ) ) { printk ( KERN_ERR "IP2: Failed to initialize board at 0x%x, error %d\n", pB->i2eBase, pB->i2eError ); - kfree ( pB ); - i2BoardPtrTable[boardnum] = NULL; - return; + goto err_initialize; } - printk(KERN_INFO "Board %d: addr=0x%x irq=%d ", boardnum + 1, + printk(KERN_INFO "IP2: Board %d: addr=0x%x irq=%d\n", boardnum + 1, ip2config.addr[boardnum], ip2config.irq[boardnum] ); if (0 != ( rc = check_region( ip2config.addr[boardnum], 8))) { - i2BoardPtrTable[boardnum] = NULL; - printk(KERN_ERR "bad addr=0x%x rc = %d\n", + printk(KERN_ERR "IP2: bad addr=0x%x rc = %d\n", ip2config.addr[boardnum], rc ); - return; + goto err_initialize; } request_region( ip2config.addr[boardnum], 8, pcName ); if ( iiDownloadAll ( pB, (loadHdrStrPtr)Fip_firmware, 1, Fip_firmware_size ) != II_DOWN_GOOD ) { - printk ( KERN_ERR "IP2:failed to download loadware " ); + printk ( KERN_ERR "IP2: failed to download loadware\n" ); + goto err_release_region; } else { - printk ( KERN_INFO "fv=%d.%d.%d lv=%d.%d.%d\n", + printk ( KERN_INFO "IP2: fv=%d.%d.%d lv=%d.%d.%d\n", pB->i2ePom.e.porVersion, pB->i2ePom.e.porRevision, pB->i2ePom.e.porSubRev, pB->i2eLVersion, @@ -992,24 +1022,24 @@ switch ( pB->i2ePom.e.porID & ~POR_ID_RESERVED ) { default: - printk( KERN_ERR "IP2: Unknown board type, ID = %x", + printk( KERN_ERR "IP2: Unknown board type, ID = %x\n", pB->i2ePom.e.porID ); nports = 0; - goto ex_exit; + goto err_release_region; break; case POR_ID_II_4: /* IntelliPort-II, ISA-4 (4xRJ45) */ - printk ( KERN_INFO "ISA-4" ); + printk ( KERN_INFO "IP2: ISA-4\n" ); nports = 4; break; case POR_ID_II_8: /* IntelliPort-II, 8-port using standard brick. */ - printk ( KERN_INFO "ISA-8 std" ); + printk ( KERN_INFO "IP2: ISA-8 std\n" ); nports = 8; break; case POR_ID_II_8R: /* IntelliPort-II, 8-port using RJ11's (no CTS) */ - printk ( KERN_INFO "ISA-8 RJ11" ); + printk ( KERN_INFO "IP2: ISA-8 RJ11\n" ); nports = 8; break; @@ -1030,8 +1060,14 @@ } DevTableMem[boardnum] = pCh = kmalloc( sizeof(i2ChanStr) * nports, GFP_KERNEL ); + if ( !pCh ) { + printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n"); + goto err_release_region; + } if ( !i2InitChannels( pB, nports, pCh ) ) { - printk(KERN_ERR "i2InitChannels failed: %d\n",pB->i2eError); + printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError); + kfree ( pCh ); + goto err_release_region; } pB->i2eChannelPtr = &DevTable[portnum]; pB->i2eChannelCnt = ABS_MOST_PORTS; @@ -1045,17 +1081,24 @@ } } } - printk(KERN_INFO "IP2: EX box=%d ports=%d %d bit", + printk(KERN_INFO "IP2: EX box=%d ports=%d %d bit\n", nboxes, nports, pB->i2eDataWidth16 ? 16 : 8 ); } goto ex_exit; - break; } DevTableMem[boardnum] = pCh = kmalloc ( sizeof (i2ChanStr) * nports, GFP_KERNEL ); + if ( !pCh ) { + printk ( KERN_ERR "IP2: (i2_init_channel:) Out of memory.\n"); + goto err_release_region; + } pB->i2eChannelPtr = pCh; pB->i2eChannelCnt = nports; - i2InitChannels ( pB, pB->i2eChannelCnt, pCh ); + if ( !i2InitChannels( pB, nports, pCh ) ) { + printk(KERN_ERR "IP2: i2InitChannels failed: %d\n",pB->i2eError); + kfree ( pCh ); + goto err_release_region; + } pB->i2eChannelPtr = &DevTable[IP2_PORTS_PER_BOARD * boardnum]; for( i = 0; i < pB->i2eChannelCnt; ++i ) { @@ -1064,7 +1107,16 @@ pCh++; } ex_exit: - printk ( KERN_INFO "\n" ); + pB->tqueue_interrupt.routine = (void(*)(void*)) ip2_interrupt_bh; + pB->tqueue_interrupt.data = pB; + return; + +err_release_region: + release_region(ip2config.addr[boardnum], 8); +err_initialize: + kfree ( pB ); + i2BoardPtrTable[boardnum] = NULL; + return; } /******************************************************************************/ @@ -1262,16 +1314,34 @@ } -#ifdef USE_IQI -static struct tq_struct -senior_service = -{ // it's the death that worse than fate - NULL, - 0, - (void(*)(void*)) service_all_boards, - NULL, //later - board address XXX -}; -#endif +/******************************************************************************/ +/* Function: ip2_interrupt_bh(pB) */ +/* Parameters: pB - pointer to the board structure */ +/* Returns: Nothing */ +/* */ +/* Description: */ +/* Service the board in a bottom half interrupt handler and then */ +/* reenable the board's interrupts if it has an IRQ number */ +/* */ +/******************************************************************************/ +static void +ip2_interrupt_bh(i2eBordStrPtr pB) +{ +// pB better well be set or we have a problem! We can only get +// here from the IMMEDIATE queue. Here, we process the boards. +// Checking pB doesn't cost much and it saves us from the sanity checkers. + + bh_counter++; + + if ( pB ) { + i2ServiceBoard( pB ); + if( pB->i2eUsingIrq ) { +// Re-enable his interrupts + iiEnableMailIrq(pB); + } + } +} + /******************************************************************************/ /* Function: ip2_interrupt(int irq, void *dev_id, struct pt_regs * regs) */ @@ -1282,6 +1352,14 @@ /* */ /* Description: */ /* */ +/* Our task here is simply to identify each board which needs servicing. */ +/* If we are queuing then, queue it to be serviced, and disable its irq */ +/* mask otherwise process the board directly. */ +/* */ +/* We could queue by IRQ but that just complicates things on both ends */ +/* with very little gain in performance (how many instructions does */ +/* it take to iterate on the immediate queue). */ +/* */ /* */ /******************************************************************************/ static void @@ -1294,22 +1372,36 @@ ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, irq ); #endif -#ifdef USE_IQI - - queue_task(&senior_service, &tq_immediate); - mark_bh(IMMEDIATE_BH); - -#else /* Service just the boards on the list using this irq */ for( i = 0; i < i2nBoards; ++i ) { pB = i2BoardPtrTable[i]; + +// Only process those boards which match our IRQ. +// IRQ = 0 for polled boards, we won't poll "IRQ" boards + if ( pB && (pB->i2eUsingIrq == irq) ) { +#ifdef USE_IQI + + if (NO_MAIL_HERE != ( pB->i2eStartMail = iiGetMail(pB))) { +// Disable his interrupt (will be enabled when serviced) +// This is mostly to protect from reentrancy. + iiDisableMailIrq(pB); + +// Park the board on the immediate queue for processing. + queue_task(&pB->tqueue_interrupt, &tq_immediate); + +// Make sure the immediate queue is flagged to fire. + mark_bh(IMMEDIATE_BH); + } +#else +// We are using immediate servicing here. This sucks and can +// cause all sorts of havoc with ppp and others. The failsafe +// check on iiSendPendingMail could also throw a hairball. i2ServiceBoard( pB ); +#endif /* USE_IQI */ } } -#endif /* USE_IQI */ - ++irq_counter; #ifdef IP2DEBUG_TRACE @@ -1335,19 +1427,11 @@ #endif TimerOn = 0; // it's the truth but not checked in service - bh_counter++; - -#ifdef USE_IQI - - queue_task(&senior_service, &tq_immediate); - mark_bh(IMMEDIATE_BH); - -#else - // Just polled boards, service_all might be better + // Just polled boards, IRQ = 0 will hit all non-interrupt boards. + // It will NOT poll boards handled by hard interrupts. + // The issue of queued BH interrups is handled in ip2_interrupt(). ip2_interrupt(0, NULL, NULL); -#endif /* USE_IQI */ - PollTimer.expires = POLL_TIMEOUT; add_timer( &PollTimer ); TimerOn = 1; @@ -1515,6 +1599,7 @@ static int ip2_open( PTTY tty, struct file *pFile ) { + wait_queue_t wait; int rc = 0; int do_clocal = 0; i2ChanStrPtr pCh = DevTable[MINOR(tty->device)]; @@ -1548,14 +1633,23 @@ * 1. If the port is in the middle of closing wait for the completion * and then return the appropriate error. */ + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->close_wait, &wait); + set_current_state( TASK_INTERRUPTIBLE ); + if ( tty_hung_up_p(pFile) || ( pCh->flags & ASYNC_CLOSING )) { if ( pCh->flags & ASYNC_CLOSING ) { - interruptible_sleep_on( &pCh->close_wait); + schedule(); } if ( tty_hung_up_p(pFile) ) { + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->close_wait, &wait); return( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS; } } + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->close_wait, &wait); + /* * 2. If this is a callout device, make sure the normal port is not in * use, and that someone else doesn't have the callout device locked. @@ -1608,13 +1702,20 @@ #endif ++pCh->wopen; + + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->open_wait, &wait); + for(;;) { if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE)) { i2QueueCommands(PTYPE_INLINE, pCh, 100, 2, CMD_DTRUP, CMD_RTSUP); pCh->dataSetOut |= (I2_DTR | I2_RTS); + set_current_state( TASK_INTERRUPTIBLE ); serviceOutgoingFifo( pCh->pMyBord ); } if ( tty_hung_up_p(pFile) ) { + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->open_wait, &wait); return ( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EBUSY : -ERESTARTSYS; } if ( !(pCh->flags & ASYNC_CALLOUT_ACTIVE) && @@ -1640,8 +1741,11 @@ rc = (( pCh->flags & ASYNC_HUP_NOTIFY ) ? -EAGAIN : -ERESTARTSYS); break; } - interruptible_sleep_on(&pCh->open_wait); + schedule(); } + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->open_wait, &wait); + --pCh->wopen; //why count? #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_OPEN, 4, 0 ); @@ -1814,6 +1918,10 @@ { i2ChanStrPtr pCh = tty->driver_data; + if( !pCh ) { + return; + } + #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_HANGUP, ITRC_ENTER, 0 ); #endif @@ -1824,7 +1932,7 @@ i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_DCD_NREP); i2QueueCommands(PTYPE_INLINE, pCh, 0, 2, CMD_CTSFL_DSAB, CMD_RTSFL_DSAB); - if ( !tty || (tty->termios->c_cflag & HUPCL) ) { + if ( (tty->termios->c_cflag & HUPCL) ) { i2QueueCommands(PTYPE_BYPASS, pCh, 0, 2, CMD_RTSDN, CMD_DTRDN); pCh->dataSetOut &= ~(I2_DTR | I2_RTS); i2QueueCommands( PTYPE_INLINE, pCh, 100, 1, CMD_PAUSE(25)); @@ -2173,6 +2281,7 @@ static int ip2_ioctl ( PTTY tty, struct file *pFile, UINT cmd, ULONG arg ) { + wait_queue_t wait; i2ChanStrPtr pCh = DevTable[MINOR(tty->device)]; struct async_icount cprev, cnow; /* kernel counter temps */ struct serial_icounter_struct *p_cuser; /* user space */ @@ -2296,14 +2405,29 @@ to return the DSS signal status immediately. Why doesn't it do the same thing in 2.2.14? */ -/* + +/* This thing is still busted in the 1.2.12 driver on 2.4.x + and even hoses the serial console so the oops can be trapped. + /\/\|=mhw=|\/\/ */ + +#ifdef ENABLE_DSSNOW i2QueueCommands(PTYPE_BYPASS, pCh, 100, 1, CMD_DSS_NOW); + + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->dss_now_wait, &wait); + set_current_state( TASK_INTERRUPTIBLE ); + serviceOutgoingFifo( pCh->pMyBord ); - interruptible_sleep_on(&pCh->dss_now_wait); + + schedule(); + + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->dss_now_wait, &wait); + if (signal_pending(current)) { return -EINTR; } -*/ +#endif PUT_USER(rc, ((pCh->dataSetOut & I2_RTS) ? TIOCM_RTS : 0) | ((pCh->dataSetOut & I2_DTR) ? TIOCM_DTR : 0) @@ -2334,12 +2458,16 @@ restore_flags(flags); i2QueueCommands(PTYPE_BYPASS, pCh, 100, 4, CMD_DCD_REP, CMD_CTS_REP, CMD_DSR_REP, CMD_RI_REP); + init_waitqueue_entry(&wait, current); + add_wait_queue(&pCh->delta_msr_wait, &wait); + set_current_state( TASK_INTERRUPTIBLE ); + serviceOutgoingFifo( pCh->pMyBord ); for(;;) { #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_IOCTL, 10, 0 ); #endif - interruptible_sleep_on(&pCh->delta_msr_wait); + schedule(); #ifdef IP2DEBUG_TRACE ip2trace (CHANN, ITRC_IOCTL, 11, 0 ); #endif @@ -2365,6 +2493,9 @@ } cprev = cnow; } + set_current_state( TASK_RUNNING ); + remove_wait_queue(&pCh->delta_msr_wait, &wait); + i2QueueCommands(PTYPE_BYPASS, pCh, 100, 3, CMD_CTS_NREP, CMD_DSR_NREP, CMD_RI_NREP); if ( ! (pCh->flags & ASYNC_CHECK_CD)) { diff -u --recursive --new-file v2.4.13/linux/drivers/char/istallion.c linux/drivers/char/istallion.c --- v2.4.13/linux/drivers/char/istallion.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/istallion.c Thu Oct 25 13:53:47 2001 @@ -431,6 +431,12 @@ #endif #endif +static struct pci_device_id istallion_pci_tbl[] = { + { PCI_VENDOR_ID_STALLION, PCI_DEVICE_ID_ECRA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0 } +}; +MODULE_DEVICE_TABLE(pci, istallion_pci_tbl); + /*****************************************************************************/ /* @@ -1529,9 +1535,9 @@ printk("stli_delay(len=%d)\n", len); #endif if (len > 0) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(len); - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); } } diff -u --recursive --new-file v2.4.13/linux/drivers/char/joystick/analog.c linux/drivers/char/joystick/analog.c --- v2.4.13/linux/drivers/char/joystick/analog.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/joystick/analog.c Thu Oct 25 14:01:51 2001 @@ -146,7 +146,7 @@ #define DELTA(x,y) ((y)-(x)) #define TIME_NAME "TSC" #elif __alpha__ -#define GET_TIME(x) get_cycles(x) +#define GET_TIME(x) ((x) = get_cycles()) #define DELTA(x,y) ((y)-(x)) #define TIME_NAME "PCC" #else diff -u --recursive --new-file v2.4.13/linux/drivers/char/lp.c linux/drivers/char/lp.c --- v2.4.13/linux/drivers/char/lp.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/lp.c Thu Oct 25 00:07:39 2001 @@ -153,6 +153,10 @@ #undef LP_DEBUG +/* Bits used to manage claiming the parport device */ +#define LP_PREEMPT_REQUEST 1 +#define LP_PARPORT_CLAIMED 2 + /* --- low-level port access ----------------------------------- */ #define r_dtr(x) (parport_read_data(lp_table[(x)].dev->port)) @@ -160,15 +164,55 @@ #define w_ctr(x,y) do { parport_write_control(lp_table[(x)].dev->port, (y)); } while (0) #define w_dtr(x,y) do { parport_write_data(lp_table[(x)].dev->port, (y)); } while (0) +/* Claim the parport or block trying unless we've already claimed it */ +static void lp_claim_parport_or_block(struct lp_struct *this_lp) +{ + if (!test_and_set_bit(LP_PARPORT_CLAIMED, &this_lp->bits)) { + parport_claim_or_block (this_lp->dev); + } +} + +/* Claim the parport or block trying unless we've already claimed it */ +static void lp_release_parport(struct lp_struct *this_lp) +{ + if (test_and_clear_bit(LP_PARPORT_CLAIMED, &this_lp->bits)) { + parport_release (this_lp->dev); + } +} + + + +static int lp_preempt(void *handle) +{ + struct lp_struct *this_lp = (struct lp_struct *)handle; + set_bit(LP_PREEMPT_REQUEST, &this_lp->bits); + return (1); +} + + +/* + * Try to negotiate to a new mode; if unsuccessful negotiate to + * compatibility mode. Return the mode we ended up in. + */ +static int lp_negotiate(struct parport * port, int mode) +{ + if (parport_negotiate (port, mode) != 0) { + mode = IEEE1284_MODE_COMPAT; + parport_negotiate (port, mode); + } + + return (mode); +} + static int lp_reset(int minor) { int retval; - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); w_ctr(minor, LP_PSELECP); udelay (LP_DELAY); w_ctr(minor, LP_PSELECP | LP_PINITP); retval = r_str(minor); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); return retval; } @@ -180,10 +224,10 @@ return; polling = lp_table[minor].dev->port->irq == PARPORT_IRQ_NONE; - if (polling) parport_release (lp_table[minor].dev); + if (polling) lp_release_parport (&lp_table[minor]); interruptible_sleep_on_timeout (&lp_table[minor].waitq, LP_TIMEOUT_POLLED); - if (polling) parport_claim_or_block (lp_table[minor].dev); + if (polling) lp_claim_parport_or_block (&lp_table[minor]); else parport_yield_blocking (lp_table[minor].dev); } @@ -229,6 +273,12 @@ static int lp_wait_ready(int minor) { int error = 0; + + /* If we're not in compatibility mode, we're ready now! */ + if (lp_table[minor].current_mode != IEEE1284_MODE_COMPAT) { + return (0); + } + do { error = lp_check_status (minor); if (error && (LP_F(minor) & LP_ABORT)) @@ -270,10 +320,10 @@ /* Claim Parport or sleep until it becomes available */ - parport_claim_or_block (lp_table[minor].dev); - - /* Go to compatibility mode. */ - parport_negotiate (port, IEEE1284_MODE_COMPAT); + lp_claim_parport_or_block (&lp_table[minor]); + /* Go to the proper mode. */ + lp_table[minor].current_mode = lp_negotiate (port, + lp_table[minor].best_mode); parport_set_timeout (lp_table[minor].dev, lp_table[minor].timeout); @@ -298,7 +348,13 @@ if (copy_size > 0) { /* incomplete write -> check error ! */ - int error = lp_wait_ready (minor); + int error; + + parport_negotiate (lp_table[minor].dev->port, + IEEE1284_MODE_COMPAT); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; + + error = lp_wait_ready (minor); if (error) { if (retv == 0) @@ -307,6 +363,10 @@ } parport_yield_blocking (lp_table[minor].dev); + lp_table[minor].current_mode + = lp_negotiate (port, + lp_table[minor].best_mode); + } else if (current->need_resched) schedule (); @@ -323,7 +383,14 @@ } } while (count > 0); - parport_release (lp_table[minor].dev); + if (test_and_clear_bit(LP_PREEMPT_REQUEST, + &lp_table[minor].bits)) { + printk(KERN_INFO "lp%d releasing parport\n", minor); + parport_negotiate (lp_table[minor].dev->port, + IEEE1284_MODE_COMPAT); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; + lp_release_parport (&lp_table[minor]); + } up (&lp_table[minor].port_mutex); @@ -347,9 +414,9 @@ if (down_interruptible (&lp_table[minor].port_mutex)) return -EINTR; - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); retval = parport_read (port, kbuf, count); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); if (retval > 0 && copy_to_user (buf, kbuf, retval)) retval = -EFAULT; @@ -379,9 +446,9 @@ should most likely only ever be used by the tunelp application. */ if ((LP_F(minor) & LP_ABORTOPEN) && !(file->f_flags & O_NONBLOCK)) { int status; - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); status = r_str(minor); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); if (status & LP_POUTPA) { printk(KERN_INFO "lp%d out of paper\n", minor); LP_F(minor) &= ~LP_BUSY; @@ -401,6 +468,21 @@ LP_F(minor) &= ~LP_BUSY; return -ENOMEM; } + /* Determine if the peripheral supports ECP mode */ + lp_claim_parport_or_block (&lp_table[minor]); + if ( (lp_table[minor].dev->port->modes & PARPORT_MODE_ECP) && + !parport_negotiate (lp_table[minor].dev->port, + IEEE1284_MODE_ECP)) { + printk (KERN_INFO "lp%d: ECP mode\n", minor); + lp_table[minor].best_mode = IEEE1284_MODE_ECP; + } else { + printk (KERN_INFO "lp%d: compatibility mode\n", minor); + lp_table[minor].best_mode = IEEE1284_MODE_COMPAT; + } + /* Leave peripheral in compatibility mode */ + parport_negotiate (lp_table[minor].dev->port, IEEE1284_MODE_COMPAT); + lp_release_parport (&lp_table[minor]); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; return 0; } @@ -408,6 +490,10 @@ { unsigned int minor = MINOR(inode->i_rdev); + lp_claim_parport_or_block (&lp_table[minor]); + parport_negotiate (lp_table[minor].dev->port, IEEE1284_MODE_COMPAT); + lp_table[minor].current_mode = IEEE1284_MODE_COMPAT; + lp_release_parport (&lp_table[minor]); lock_kernel(); kfree(lp_table[minor].lp_buffer); lp_table[minor].lp_buffer = NULL; @@ -470,9 +556,9 @@ return -EFAULT; break; case LPGETSTATUS: - parport_claim_or_block (lp_table[minor].dev); + lp_claim_parport_or_block (&lp_table[minor]); status = r_str(minor); - parport_release (lp_table[minor].dev); + lp_release_parport (&lp_table[minor]); if (copy_to_user((int *) arg, &status, sizeof(int))) return -EFAULT; @@ -657,7 +743,7 @@ char name[8]; lp_table[nr].dev = parport_register_device(port, "lp", - NULL, NULL, NULL, 0, + lp_preempt, NULL, NULL, 0, (void *) &lp_table[nr]); if (lp_table[nr].dev == NULL) return 1; diff -u --recursive --new-file v2.4.13/linux/drivers/char/moxa.c linux/drivers/char/moxa.c --- v2.4.13/linux/drivers/char/moxa.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/moxa.c Thu Oct 25 13:53:47 2001 @@ -105,18 +105,16 @@ "CP-204J series", }; -typedef struct { - unsigned short vendor_id; - unsigned short device_id; - unsigned short board_type; -} moxa_pciinfo; - -static moxa_pciinfo moxa_pcibrds[] = -{ - {PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C218, MOXA_BOARD_C218_PCI}, - {PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C320, MOXA_BOARD_C320_PCI}, - {PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_CP204J, MOXA_BOARD_CP204J}, +static struct pci_device_id moxa_pcibrds[] = { + { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C218, PCI_ANY_ID, PCI_ANY_ID, + 0, 0, MOXA_BOARD_C218_PCI }, + { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C320, PCI_ANY_ID, PCI_ANY_ID, + 0, 0, MOXA_BOARD_C320_PCI }, + { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_CP204J, PCI_ANY_ID, PCI_ANY_ID, + 0, 0, MOXA_BOARD_CP204J }, + { 0 } }; +MODULE_DEVICE_TABLE(pci, moxa_pcibrds); typedef struct _moxa_isa_board_conf { int boardType; @@ -487,10 +485,10 @@ #ifdef CONFIG_PCI { struct pci_dev *p = NULL; - n = sizeof(moxa_pcibrds) / sizeof(moxa_pciinfo); + n = (sizeof(moxa_pcibrds) / sizeof(moxa_pcibrds[0])) - 1; i = 0; while (i < n) { - while((p = pci_find_device(moxa_pcibrds[i].vendor_id, moxa_pcibrds[i].device_id, p))!=NULL) + while ((p = pci_find_device(moxa_pcibrds[i].vendor, moxa_pcibrds[i].device, p))!=NULL) { if (pci_enable_device(p)) continue; @@ -498,7 +496,7 @@ if (verbose) printk("More than %d MOXA Intellio family boards found. Board is ignored.", MAX_BOARDS); } else { - moxa_get_PCI_conf(p, moxa_pcibrds[i].board_type, + moxa_get_PCI_conf(p, moxa_pcibrds[i].driver_data, &moxa_boards[numBoards]); numBoards++; } @@ -686,7 +684,7 @@ ch->tty = 0; if (ch->blocked_open) { if (ch->close_delay) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(ch->close_delay); } wake_up_interruptible(&ch->open_wait); @@ -1140,7 +1138,7 @@ restore_flags(flags); ch->blocked_open++; while (1) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); if (tty_hung_up_p(filp) || !(ch->asyncflags & ASYNC_INITIALIZED)) { #ifdef SERIAL_DO_RESTART @@ -1164,7 +1162,7 @@ } schedule(); } - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); remove_wait_queue(&ch->open_wait, &wait); if (!tty_hung_up_p(filp)) ch->count++; diff -u --recursive --new-file v2.4.13/linux/drivers/char/mxser.c linux/drivers/char/mxser.c --- v2.4.13/linux/drivers/char/mxser.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/mxser.c Thu Oct 25 13:53:47 2001 @@ -159,17 +159,14 @@ #define MOXA_GET_CUMAJOR (MOXA + 64) #define MOXA_GETMSTATUS (MOXA + 65) -typedef struct { - unsigned short vendor_id; - unsigned short device_id; - unsigned short board_type; -} mxser_pciinfo; - -static mxser_pciinfo mxser_pcibrds[] = -{ - {PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C168, MXSER_BOARD_C168_PCI}, - {PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C104, MXSER_BOARD_C104_PCI}, +static struct pci_device_id mxser_pcibrds[] = { + { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C168, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + MXSER_BOARD_C168_PCI }, + { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C104, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + MXSER_BOARD_C104_PCI }, + { 0 } }; +MODULE_DEVICE_TABLE(pci, mxser_pcibrds); static int ioaddr[MXSER_BOARDS]; static int ttymajor = MXSERMAJOR; @@ -614,22 +611,22 @@ { struct pci_dev *pdev = NULL; - n = sizeof(mxser_pcibrds) / sizeof(mxser_pciinfo); + n = (sizeof(mxser_pcibrds) / sizeof(mxser_pcibrds[0])) - 1; index = 0; for (b = 0; b < n; b++) { - pdev = pci_find_device(mxser_pcibrds[b].vendor_id, - mxser_pcibrds[b].device_id, pdev); + pdev = pci_find_device(mxser_pcibrds[b].vendor, + mxser_pcibrds[b].device, pdev); if (!pdev || pci_enable_device(pdev)) continue; hwconf.pdev = pdev; printk("Found MOXA %s board(BusNo=%d,DevNo=%d)\n", - mxser_brdname[mxser_pcibrds[b].board_type], + mxser_brdname[mxser_pcibrds[b].driver_data], pdev->bus->number, PCI_SLOT(pdev->devfn)); if (m >= MXSER_BOARDS) { printk("Too many Smartio family boards found (maximum %d),board not configured\n", MXSER_BOARDS); } else { retval = mxser_get_PCI_conf(pdev, - mxser_pcibrds[b].board_type, &hwconf); + mxser_pcibrds[b].driver_data, &hwconf); if (retval < 0) { if (retval == MXSER_ERR_IRQ) printk("Invalid interrupt number,board not configured\n"); @@ -848,7 +845,7 @@ */ timeout = jiffies + HZ; while (!(inb(info->base + UART_LSR) & UART_LSR_TEMT)) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(5); if (jiffies > timeout) break; @@ -864,7 +861,7 @@ info->tty = 0; if (info->blocked_open) { if (info->close_delay) { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(info->close_delay); } wake_up_interruptible(&info->open_wait); @@ -1622,7 +1619,7 @@ outb(inb(info->base + UART_MCR) | UART_MCR_DTR | UART_MCR_RTS, info->base + UART_MCR); restore_flags(flags); - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); if (tty_hung_up_p(filp) || !(info->flags & ASYNC_INITIALIZED)) { #ifdef SERIAL_DO_RESTART if (info->flags & ASYNC_HUP_NOTIFY) @@ -1644,7 +1641,7 @@ } schedule(); } - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); remove_wait_queue(&info->open_wait, &wait); if (!tty_hung_up_p(filp)) info->count++; @@ -2227,7 +2224,7 @@ unsigned long flags; if (!info->base) return; - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); save_flags(flags); cli(); outb(inb(info->base + UART_LCR) | UART_LCR_SBC, info->base + UART_LCR); diff -u --recursive --new-file v2.4.13/linux/drivers/char/random.c linux/drivers/char/random.c --- v2.4.13/linux/drivers/char/random.c Tue Oct 23 22:48:50 2001 +++ linux/drivers/char/random.c Tue Oct 30 15:08:12 2001 @@ -569,7 +569,7 @@ __u32 w; while (nwords--) { - w = rotate_left(r->input_rotate, *in); + w = rotate_left(r->input_rotate, *in++); i = r->add_ptr = (r->add_ptr - 1) & wordmask; /* * Normally, we add 7 bits of rotation to the pool. @@ -1245,15 +1245,16 @@ if (r->entropy_count < nbytes * 8 && r->entropy_count < r->poolinfo.POOLBITS) { - int nwords = min(r->poolinfo.poolwords - r->entropy_count/32, - sizeof(tmp) / 4); + int nwords = min_t(int, + r->poolinfo.poolwords - r->entropy_count/32, + sizeof(tmp) / 4); DEBUG_ENT("xfer %d from primary to %s (have %d, need %d)\n", nwords * 32, r == sec_random_state ? "secondary" : "unknown", r->entropy_count, nbytes * 8); - extract_entropy(random_state, tmp, nwords, 0); + extract_entropy(random_state, tmp, nwords * 4, 0); add_entropy_words(r, tmp, nwords); credit_entropy_store(r, nwords * 32); } diff -u --recursive --new-file v2.4.13/linux/drivers/char/rio/rio_linux.c linux/drivers/char/rio/rio_linux.c --- v2.4.13/linux/drivers/char/rio/rio_linux.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/rio/rio_linux.c Thu Oct 25 13:53:47 2001 @@ -63,6 +63,9 @@ #include #include +#if BITS_PER_LONG != 32 +# error FIXME: this driver only works on 32-bit platforms +#endif #include "linux_compat.h" #include "typdef.h" diff -u --recursive --new-file v2.4.13/linux/drivers/char/vt.c linux/drivers/char/vt.c --- v2.4.13/linux/drivers/char/vt.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/char/vt.c Fri Oct 26 13:33:47 2001 @@ -1184,6 +1184,24 @@ switch_screen(new_console); /* + * This can't appear below a successful kill_proc(). If it did, + * then the *blank_screen operation could occur while X, having + * received acqsig, is waking up on another processor. This + * condition can lead to overlapping accesses to the VGA range + * and the framebuffer (causing system lockups). + * + * To account for this we duplicate this code below only if the + * controlling process is gone and we've called reset_vc. + */ + if (old_vc_mode != vt_cons[new_console]->vc_mode) + { + if (vt_cons[new_console]->vc_mode == KD_TEXT) + unblank_screen(); + else + do_blank_screen(1); + } + + /* * If this new console is under process control, send it a signal * telling it that it has acquired. Also check if it has died and * clean up (similar to logic employed in change_console()) @@ -1209,19 +1227,15 @@ * to account for and tracking tty count may be undesirable. */ reset_vc(new_console); - } - } - /* - * We do this here because the controlling process above may have - * gone, and so there is now a new vc_mode - */ - if (old_vc_mode != vt_cons[new_console]->vc_mode) - { - if (vt_cons[new_console]->vc_mode == KD_TEXT) - unblank_screen(); - else - do_blank_screen(1); + if (old_vc_mode != vt_cons[new_console]->vc_mode) + { + if (vt_cons[new_console]->vc_mode == KD_TEXT) + unblank_screen(); + else + do_blank_screen(1); + } + } } /* diff -u --recursive --new-file v2.4.13/linux/drivers/ide/ataraid.c linux/drivers/ide/ataraid.c --- v2.4.13/linux/drivers/ide/ataraid.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/ide/ataraid.c Thu Oct 25 13:58:35 2001 @@ -51,6 +51,7 @@ static int ataraid_readahead[256]; static struct block_device_operations ataraid_fops = { + owner: THIS_MODULE, open: ataraid_open, release: ataraid_release, ioctl: ataraid_ioctl, @@ -208,11 +209,9 @@ int ataraid_get_device(struct raid_device_operations *fops) { int bit; - MOD_INC_USE_COUNT; down(&ataraid_sem); if (ataraiduse==~0U) { up(&ataraid_sem); - MOD_DEC_USE_COUNT; return -ENODEV; } bit=ffz(ataraiduse); @@ -232,7 +231,6 @@ ataraiduse &= ~(1<io_ports[IDE_IRQ_OFFSET]); + ch = z_readb(hwif->io_ports[IDE_IRQ_OFFSET]); if (!(ch & 0x80)) - return 0; + return 0; return 1; } - - /* - * Any Buddha or Catweasel boards present? - */ - -static int __init find_buddha(void) +static int xsurf_ack_intr(ide_hwif_t *hwif) { - struct zorro_dev *z = NULL; + unsigned char ch; - buddha_num_hwifs = 0; - while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { - unsigned long board; - if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) - buddha_num_hwifs = BUDDHA_NUM_HWIFS; - else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_CATWEASEL) - buddha_num_hwifs = CATWEASEL_NUM_HWIFS; - else - continue; - board = z->resource.start; - if (!request_mem_region(board+BUDDHA_BASE1, 0x800, "IDE")) - continue; - buddha_board = ZTWO_VADDR(board); - /* write to BUDDHA_IRQ_MR to enable the board IRQ */ - *(char *)(buddha_board+BUDDHA_IRQ_MR) = 0; - break; - } - return buddha_num_hwifs; + ch = z_readb(hwif->io_ports[IDE_IRQ_OFFSET]); + /* X-Surf needs a 0 written to IRQ register to ensure ISA bit A11 stays at 0 */ + z_writeb(0, hwif->io_ports[IDE_IRQ_OFFSET]); + if (!(ch & 0x80)) + return 0; + return 1; } - /* * Probe for a Buddha or Catweasel IDE interface - * We support only _one_ of them, no multiple boards! */ void __init buddha_init(void) { - hw_regs_t hw; - int i, index; - - if (buddha_num_hwifs < 0 && !find_buddha()) - return; + hw_regs_t hw; + int i, index; - for (i = 0; i < buddha_num_hwifs; i++) { - ide_setup_ports(&hw, (ide_ioreg_t)(buddha_board+buddha_bases[i]), - buddha_offsets, 0, - (ide_ioreg_t)(buddha_board+buddha_irqports[i]), - buddha_ack_intr, IRQ_AMIGA_PORTS); - index = ide_register_hw(&hw, NULL); - if (index != -1) - printk("ide%d: %s IDE interface\n", index, - buddha_num_hwifs == BUDDHA_NUM_HWIFS ? "Buddha" : - "Catweasel"); - } + struct zorro_dev *z = NULL; + u_long buddha_board = 0; + BuddhaType type; + int buddha_num_hwifs; + + while ((z = zorro_find_device(ZORRO_WILDCARD, z))) { + unsigned long board; + if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) { + buddha_num_hwifs = BUDDHA_NUM_HWIFS; + type=BOARD_BUDDHA; + } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_CATWEASEL) { + buddha_num_hwifs = CATWEASEL_NUM_HWIFS; + type=BOARD_CATWEASEL; + } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF) { + buddha_num_hwifs = XSURF_NUM_HWIFS; + type=BOARD_XSURF; + } else + continue; + + board = z->resource.start; + + if(type != BOARD_XSURF) { + if (!request_mem_region(board+BUDDHA_BASE1, 0x800, "IDE")) + continue; + } else { + if (!request_mem_region(board+XSURF_BASE1, 0x1000, "IDE")) + continue; + if (!request_mem_region(board+XSURF_BASE2, 0x1000, "IDE")) + continue; + if (!request_mem_region(board+XSURF_IRQ1, 0x8, "IDE")) + continue; + } + buddha_board = ZTWO_VADDR(board); + + /* write to BUDDHA_IRQ_MR to enable the board IRQ */ + /* X-Surf doesn't have this. IRQs are always on */ + if(type != BOARD_XSURF) *(char *)(buddha_board+BUDDHA_IRQ_MR) = 0; + + for(i=0;i #include #include #include @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -41,7 +42,7 @@ #define ATA_HD_STATUS 0x1d /* see status-bits */ #define ATA_HD_CONTROL 0x39 -static int __init falconide_offsets[IDE_NR_PORTS] = { +static int falconide_offsets[IDE_NR_PORTS] __initdata = { ATA_HD_DATA, ATA_HD_ERROR, ATA_HD_NSECTOR, ATA_HD_SECTOR, ATA_HD_LCYL, ATA_HD_HCYL, ATA_HD_SELECT, ATA_HD_STATUS, ATA_HD_CONTROL, -1 }; diff -u --recursive --new-file v2.4.13/linux/drivers/ide/icside.c linux/drivers/ide/icside.c --- v2.4.13/linux/drivers/ide/icside.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/ide/icside.c Thu Oct 25 13:53:47 2001 @@ -318,6 +318,117 @@ return icside_config_if(drive, speed); } +/* + * dma_intr() is the handler for disk read/write DMA interrupts + */ +static ide_startstop_t icside_dmaintr(ide_drive_t *drive) +{ + int i; + byte stat, dma_stat; + + dma_stat = HWIF(drive)->dmaproc(ide_dma_end, drive); + stat = GET_STAT(); /* get drive status */ + if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { + if (!dma_stat) { + struct request *rq = HWGROUP(drive)->rq; + rq = HWGROUP(drive)->rq; + for (i = rq->nr_sectors; i > 0;) { + i -= rq->current_nr_sectors; + ide_end_request(1, HWGROUP(drive)); + } + return ide_stopped; + } + printk("%s: dma_intr: bad DMA status (dma_stat=%x)\n", + drive->name, dma_stat); + } + return ide_error(drive, "dma_intr", stat); +} + +/* + * The following is a sick duplication from ide-dma.c ;( + * + * This should be defined in one place only. + */ +struct drive_list_entry { + char * id_model; + char * id_firmware; +}; + +static struct drive_list_entry drive_whitelist [] = { + { "Micropolis 2112A", "ALL" }, + { "CONNER CTMA 4000", "ALL" }, + { "CONNER CTT8000-A", "ALL" }, + { "ST34342A", "ALL" }, + { NULL, 0 } +}; + +static struct drive_list_entry drive_blacklist [] = { + { "WDC AC11000H", "ALL" }, + { "WDC AC22100H", "ALL" }, + { "WDC AC32500H", "ALL" }, + { "WDC AC33100H", "ALL" }, + { "WDC AC31600H", "ALL" }, + { "WDC AC32100H", "24.09P07" }, + { "WDC AC23200L", "21.10N21" }, + { "Compaq CRD-8241B", "ALL" }, + { "CRD-8400B", "ALL" }, + { "CRD-8480B", "ALL" }, + { "CRD-8480C", "ALL" }, + { "CRD-8482B", "ALL" }, + { "CRD-84", "ALL" }, + { "SanDisk SDP3B", "ALL" }, + { "SanDisk SDP3B-64", "ALL" }, + { "SANYO CD-ROM CRD", "ALL" }, + { "HITACHI CDR-8", "ALL" }, + { "HITACHI CDR-8335", "ALL" }, + { "HITACHI CDR-8435", "ALL" }, + { "Toshiba CD-ROM XM-6202B", "ALL" }, + { "CD-532E-A", "ALL" }, + { "E-IDE CD-ROM CR-840", "ALL" }, + { "CD-ROM Drive/F5A", "ALL" }, + { "RICOH CD-R/RW MP7083A", "ALL" }, + { "WPI CDD-820", "ALL" }, + { "SAMSUNG CD-ROM SC-148C", "ALL" }, + { "SAMSUNG CD-ROM SC-148F", "ALL" }, + { "SAMSUNG CD-ROM SC", "ALL" }, + { "SanDisk SDP3B-64", "ALL" }, + { "SAMSUNG CD-ROM SN-124", "ALL" }, + { "PLEXTOR CD-R PX-W8432T", "ALL" }, + { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, + { "_NEC DV5800A", "ALL" }, + { NULL, 0 } +}; + +static int in_drive_list(struct hd_driveid *id, struct drive_list_entry * drive_table) +{ + for ( ; drive_table->id_model ; drive_table++) + if ((!strcmp(drive_table->id_model, id->model)) && + ((!strstr(drive_table->id_firmware, id->fw_rev)) || + (!strcmp(drive_table->id_firmware, "ALL")))) + return 1; + return 0; +} + +/* + * For both Blacklisted and Whitelisted drives. + * This is setup to be called as an extern for future support + * to other special driver code. + */ +static int check_drive_lists(ide_drive_t *drive, int good_bad) +{ + struct hd_driveid *id = drive->id; + + if (good_bad) { + return in_drive_list(id, drive_whitelist); + } else { + int blacklist = in_drive_list(id, drive_blacklist); + if (blacklist) + printk("%s: Disabling DMA for %s\n", drive->name, id->model); + return(blacklist); + } + return 0; +} + static int icside_dma_check(ide_drive_t *drive) { @@ -333,7 +444,7 @@ /* * Consult the list of known "bad" drives */ - if (ide_dmaproc(ide_dma_bad_drive, drive)) { + if (check_drive_lists(drive, 0)) { func = ide_dma_off; goto out; } @@ -358,7 +469,7 @@ /* * Consult the list of known "good" drives */ - if (ide_dmaproc(ide_dma_good_drive, drive)) { + if (check_drive_lists(drive, 1)) { if (id->eide_dma_time > 150) goto out; xfer_mode = XFER_MW_DMA_1; @@ -372,12 +483,28 @@ } static int +icside_dma_verbose(ide_drive_t *drive) +{ + printk(", DMA"); + return 1; +} + +static int icside_dmaproc(ide_dma_action_t func, ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); int count, reading = 0; switch (func) { + case ide_dma_off: + printk("%s: DMA disabled\n", drive->name); + /*FALLTHROUGH*/ + + case ide_dma_off_quietly: + case ide_dma_on: + drive->using_dma = (func == ide_dma_on); + return 0; + case ide_dma_check: return icside_dma_check(drive); @@ -407,7 +534,7 @@ if (drive->media != ide_disk) return 0; - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL); + ide_set_handler(drive, &icside_dmaintr, WAIT_CMD, NULL); OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG); @@ -424,9 +551,19 @@ case ide_dma_test_irq: return inb((unsigned long)hwif->hw.priv) & 1; + case ide_dma_bad_drive: + case ide_dma_good_drive: + return check_drive_lists(drive, (func == ide_dma_good_drive)); + + case ide_dma_verbose: + return icside_dma_verbose(drive); + + case ide_dma_timeout: default: - return ide_dmaproc(func, drive); + printk("icside_dmaproc: unsupported %s func: %d\n", + ide_dmafunc_verbose(func), func); } + return 1; } static int @@ -464,13 +601,13 @@ for (index = 0; index < MAX_HWIFS; ++index) { hwif = &ide_hwifs[index]; - if (hwif->hw.io_ports[IDE_DATA_OFFSET] == (ide_ioreg_t)dataport) + if (hwif->io_ports[IDE_DATA_OFFSET] == (ide_ioreg_t)dataport) goto found; } for (index = 0; index < MAX_HWIFS; ++index) { hwif = &ide_hwifs[index]; - if (!hwif->hw.io_ports[IDE_DATA_OFFSET]) + if (!hwif->io_ports[IDE_DATA_OFFSET]) goto found; } @@ -493,10 +630,13 @@ for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { hwif->hw.io_ports[i] = (ide_ioreg_t)port; + hwif->io_ports[i] = (ide_ioreg_t)port; port += 1 << info->stepping; } hwif->hw.io_ports[IDE_CONTROL_OFFSET] = base + info->ctrloffset; + hwif->io_ports[IDE_CONTROL_OFFSET] = base + info->ctrloffset; hwif->hw.irq = irq; + hwif->irq = irq; hwif->hw.dma = NO_DMA; hwif->noprobe = 0; hwif->chipset = ide_acorn; @@ -579,9 +719,8 @@ icside_setup_dma(mate, autodma); } } -#endif - no_dma: +#endif return hwif || mate ? 0 : -1; } diff -u --recursive --new-file v2.4.13/linux/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c --- v2.4.13/linux/drivers/ide/ide-cd.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/ide/ide-cd.c Wed Oct 24 23:53:51 2001 @@ -2863,7 +2863,7 @@ struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { - return cdrom_fops.ioctl (inode, file, cmd, arg); + return cdrom_ioctl (inode, file, cmd, arg); } static @@ -2875,7 +2875,7 @@ MOD_INC_USE_COUNT; if (info->buffer == NULL) info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL); - if ((info->buffer == NULL) || (rc = cdrom_fops.open(ip, fp))) { + if ((info->buffer == NULL) || (rc = cdrom_open(ip, fp))) { drive->usage--; MOD_DEC_USE_COUNT; } @@ -2886,14 +2886,14 @@ void ide_cdrom_release (struct inode *inode, struct file *file, ide_drive_t *drive) { - cdrom_fops.release (inode, file); + cdrom_release (inode, file); MOD_DEC_USE_COUNT; } static int ide_cdrom_check_media_change (ide_drive_t *drive) { - return cdrom_fops.check_media_change(MKDEV (HWIF (drive)->major, + return cdrom_media_changed(MKDEV (HWIF (drive)->major, (drive->select.b.unit) << PARTN_BITS)); } diff -u --recursive --new-file v2.4.13/linux/drivers/ide/ide-pci.c linux/drivers/ide/ide-pci.c --- v2.4.13/linux/drivers/ide/ide-pci.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/ide/ide-pci.c Thu Oct 25 13:53:47 2001 @@ -37,6 +37,7 @@ #define DEVID_PIIX4NX ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX}) #define DEVID_PIIX4U3 ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_9}) #define DEVID_PIIX4U4 ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_8}) +#define DEVID_PIIX4U5 ((ide_pci_devid_t){PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_10}) #define DEVID_VIA_IDE ((ide_pci_devid_t){PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561}) #define DEVID_MR_IDE ((ide_pci_devid_t){PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576_1}) #define DEVID_VP_IDE ((ide_pci_devid_t){PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1}) @@ -385,6 +386,7 @@ {DEVID_PIIX4NX, "PIIX4", PCI_PIIX, NULL, INIT_PIIX, NULL, {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, ON_BOARD, 0 }, {DEVID_PIIX4U3, "PIIX4", PCI_PIIX, ATA66_PIIX, INIT_PIIX, NULL, {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, ON_BOARD, 0 }, {DEVID_PIIX4U4, "PIIX4", PCI_PIIX, ATA66_PIIX, INIT_PIIX, NULL, {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, ON_BOARD, 0 }, + {DEVID_PIIX4U5, "PIIX4", PCI_PIIX, ATA66_PIIX, INIT_PIIX, NULL, {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, ON_BOARD, 0 }, {DEVID_VIA_IDE, "VIA_IDE", NULL, NULL, NULL, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, ON_BOARD, 0 }, {DEVID_MR_IDE, "VP_IDE", PCI_VIA82CXXX, ATA66_VIA82CXXX,INIT_VIA82CXXX, DMA_VIA82CXXX, {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, ON_BOARD, 0 }, {DEVID_VP_IDE, "VP_IDE", PCI_VIA82CXXX, ATA66_VIA82CXXX,INIT_VIA82CXXX, DMA_VIA82CXXX, {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, ON_BOARD, 0 }, diff -u --recursive --new-file v2.4.13/linux/drivers/ide/ide.c linux/drivers/ide/ide.c --- v2.4.13/linux/drivers/ide/ide.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/ide/ide.c Thu Oct 25 13:58:35 2001 @@ -1950,11 +1950,9 @@ static int ide_open (struct inode * inode, struct file * filp) { ide_drive_t *drive; - int rc; if ((drive = get_info_ptr(inode->i_rdev)) == NULL) return -ENXIO; - MOD_INC_USE_COUNT; if (drive->driver == NULL) ide_driver_module(); #ifdef CONFIG_KMOD @@ -1972,14 +1970,10 @@ while (drive->busy) sleep_on(&drive->wqueue); drive->usage++; - if (drive->driver != NULL) { - if ((rc = DRIVER(drive)->open(inode, filp, drive))) - MOD_DEC_USE_COUNT; - return rc; - } + if (drive->driver != NULL) + return DRIVER(drive)->open(inode, filp, drive); printk ("%s: driver not present\n", drive->name); drive->usage--; - MOD_DEC_USE_COUNT; return -ENXIO; } @@ -1995,7 +1989,6 @@ drive->usage--; if (drive->driver != NULL) DRIVER(drive)->release(inode, file, drive); - MOD_DEC_USE_COUNT; } return 0; } @@ -3643,6 +3636,7 @@ } struct block_device_operations ide_fops[] = {{ + owner: THIS_MODULE, open: ide_open, release: ide_release, ioctl: ide_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/ide/pdc202xx.c linux/drivers/ide/pdc202xx.c --- v2.4.13/linux/drivers/ide/pdc202xx.c Sun Sep 23 11:40:57 2001 +++ linux/drivers/ide/pdc202xx.c Thu Oct 25 13:53:47 2001 @@ -563,7 +563,7 @@ if (((ultra_66) || (ultra_100)) && (EP & c_mask)) { #ifdef DEBUG - printk("ULTRA66: %s channel of Ultra 66 requires an 80-pin cable for Ultra66 operation.\n", hwif->channel ? "Secondary", "Primary"); + printk("ULTRA66: %s channel of Ultra 66 requires an 80-pin cable for Ultra66 operation.\n", hwif->channel ? "Secondary" : "Primary"); printk(" Switching to Ultra33 mode.\n"); #endif /* DEBUG */ /* Primary : zero out second bit */ diff -u --recursive --new-file v2.4.13/linux/drivers/ide/piix.c linux/drivers/ide/piix.c --- v2.4.13/linux/drivers/ide/piix.c Mon Aug 27 12:41:41 2001 +++ linux/drivers/ide/piix.c Thu Oct 25 13:53:47 2001 @@ -91,6 +91,7 @@ switch(bmide_dev->device) { case PCI_DEVICE_ID_INTEL_82801BA_8: case PCI_DEVICE_ID_INTEL_82801BA_9: + case PCI_DEVICE_ID_INTEL_82801CA_10: p += sprintf(p, "\n Intel PIIX4 Ultra 100 Chipset.\n"); break; case PCI_DEVICE_ID_INTEL_82372FB_1: @@ -364,7 +365,8 @@ byte udma_66 = eighty_ninty_three(drive); int ultra100 = ((dev->device == PCI_DEVICE_ID_INTEL_82801BA_8) || - (dev->device == PCI_DEVICE_ID_INTEL_82801BA_9)) ? 1 : 0; + (dev->device == PCI_DEVICE_ID_INTEL_82801BA_9) || + (dev->device == PCI_DEVICE_ID_INTEL_82801CA_10)) ? 1 : 0; int ultra66 = ((ultra100) || (dev->device == PCI_DEVICE_ID_INTEL_82801AA_1) || (dev->device == PCI_DEVICE_ID_INTEL_82372FB_1)) ? 1 : 0; diff -u --recursive --new-file v2.4.13/linux/drivers/ide/q40ide.c linux/drivers/ide/q40ide.c --- v2.4.13/linux/drivers/ide/q40ide.c Tue Dec 5 12:43:47 2000 +++ linux/drivers/ide/q40ide.c Thu Oct 25 13:53:47 2001 @@ -41,8 +41,11 @@ * Offsets from one of the above bases */ + +/* HD_DATA was redefined in asm-m68k/ide.h */ #undef HD_DATA #define HD_DATA 0x1f0 + #define PCIDE_REG(x) ((q40ide_ioreg_t)(HD_##x-PCIDE_BASE1)) diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/md5sums.asc linux/drivers/isdn/hisax/md5sums.asc --- v2.4.13/linux/drivers/isdn/hisax/md5sums.asc Sun Aug 12 13:27:59 2001 +++ linux/drivers/isdn/hisax/md5sums.asc Wed Oct 24 15:34:51 2001 @@ -6,17 +6,17 @@ # in the moment. # Read ../../../Documentation/isdn/HiSax.cert for more informations. # -6f9433a8b696076562562d090e3c420f isac.c -13c3eed869f5139f44c563e3a8fea1f5 isdnl1.c -addcff863b0ff1e366c0f2ae9fa6e81e isdnl2.c -7076deb94a363945c21ea27aca4a720a isdnl3.c -51c603829b6cc4f8421f744ad657ceff tei.c -669050ab5079f02887ed0239d86e5474 callc.c -ecacd146b8f8881ef9349935dab3df4a cert.c -fadeb3b85bb23bc1ac48470c0848d6fa l3dss1.c -cf7dec9fac6283716904d26b99188476 l3_1tr6.c -2f75c8765e1be13d114d5f4433cf364b elsa.c -b4cf8a4dceed9ea6dcba65a85b4eecc7 diva.c -dee3f8f40c6fe78a4b57729804b7e6cd sedlbauer.c -0d79fe6dfc5bfaa4826970c41a6d273d hfc_pci.c +d08b59f56fb9ed1fbd17713342c75081 isac.c +e81e6e96f307e55f8b9777aca2b356d9 isdnl1.c +cfd2527d9fb01885484cba74bfc67121 isdnl2.c +8c6829f11459f9d044b5768803fb646d isdnl3.c +d40f88dff4191d2660240749cbdcb688 tei.c +3bd3bd05ee4cb25ffe046200b569a83a callc.c +d518f52402ebc3f1be84e09af375313c cert.c +c425de1f8be86e84006de63c9bb3cc5f l3dss1.c +4c411e29d4103ba60e9af4e3e1234a99 l3_1tr6.c +68c6cc2784f208e3247a5a555918d014 elsa.c +8d63a85d7222cf7b40e663e543191d8f diva.c +8c8cb4ce621fb84d8e337a696e75b0df sedlbauer.c +ebe5613d535748409407568435b2be97 hfc_pci.c # end of md5sums diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/niccy.c linux/drivers/isdn/hisax/niccy.c --- v2.4.13/linux/drivers/isdn/hisax/niccy.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/hisax/niccy.c Wed Oct 24 15:34:51 2001 @@ -1,4 +1,4 @@ -/* $Id: niccy.c,v 1.15.6.5 2001/09/23 22:24:50 kai Exp $ +/* $Id: niccy.c,v 1.15.6.6 2001/10/20 22:08:24 kai Exp $ * * low level stuff for Dr. Neuhaus NICCY PnP and NICCY PCI and * compatible (SAGEM cybermodem) @@ -24,7 +24,7 @@ #include extern const char *CardType[]; -const char *niccy_revision = "$Revision: 1.15.6.5 $"; +const char *niccy_revision = "$Revision: 1.15.6.6 $"; #define byteout(addr,val) outb(val,addr) #define bytein(addr) inb(addr) @@ -197,7 +197,7 @@ val = inl(cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG); val &= PCI_IRQ_DISABLE; outl(val, cs->hw.niccy.cfg_reg + PCI_IRQ_CTRL_REG); - release_region(cs->hw.niccy.cfg_reg, 0x80); + release_region(cs->hw.niccy.cfg_reg, 0x40); release_region(cs->hw.niccy.isac, 4); } else { release_region(cs->hw.niccy.isac, 2); @@ -324,16 +324,16 @@ return (0); } else request_region(cs->hw.niccy.isac, 4, "niccy"); - if (check_region(cs->hw.niccy.cfg_reg, 0x80)) { + if (check_region(cs->hw.niccy.cfg_reg, 0x40)) { printk(KERN_WARNING "HiSax: %s pci port %x-%x already in use\n", CardType[card->typ], cs->hw.niccy.cfg_reg, - cs->hw.niccy.cfg_reg + 0x80); + cs->hw.niccy.cfg_reg + 0x40); release_region(cs->hw.niccy.isac, 4); return (0); } else { - request_region(cs->hw.niccy.cfg_reg, 0x80, "niccy pci"); + request_region(cs->hw.niccy.cfg_reg, 0x40, "niccy pci"); } #else printk(KERN_WARNING "Niccy: io0 0 and NO_PCI_BIOS\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/st5481_d.c linux/drivers/isdn/hisax/st5481_d.c --- v2.4.13/linux/drivers/isdn/hisax/st5481_d.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/hisax/st5481_d.c Wed Oct 24 15:34:51 2001 @@ -174,7 +174,6 @@ va_start(args, fmt); vsprintf(buf, fmt, args); - printk("buf %s\n", buf); DBG(8, "%s", buf); va_end(args); } diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/hisax/st5481_usb.c linux/drivers/isdn/hisax/st5481_usb.c --- v2.4.13/linux/drivers/isdn/hisax/st5481_usb.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/hisax/st5481_usb.c Wed Oct 24 15:34:51 2001 @@ -427,8 +427,8 @@ // Fill the isochronous URB fill_isoc_urb(urb[j], dev, pipe, buf, - num_packets, packet_size, complete, - context); + num_packets, packet_size, complete, + context); } return 0; diff -u --recursive --new-file v2.4.13/linux/drivers/isdn/isdn_ppp.c linux/drivers/isdn/isdn_ppp.c --- v2.4.13/linux/drivers/isdn/isdn_ppp.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/isdn/isdn_ppp.c Wed Oct 24 15:34:51 2001 @@ -2453,10 +2453,15 @@ /* if we RECEIVE an ackowledge we enable the decompressor */ if(is->debug & 0x10) printk(KERN_DEBUG "Enable decompression here!\n"); - if(proto == PPP_CCP) + if(proto == PPP_CCP) { + if (!mis->decompressor) + break; mis->compflags |= SC_DECOMP_ON; - else + } else { + if (!is->decompressor) + break; is->compflags |= SC_LINK_DECOMP_ON; + } break; case CCP_RESETACK: @@ -2620,10 +2625,15 @@ /* if we SEND an ackowledge we can/must enable the compressor */ if(is->debug & 0x10) printk(KERN_DEBUG "Enable compression here!\n"); - if(proto == PPP_CCP) + if(proto == PPP_CCP) { + if (!is->compressor) + break; is->compflags |= SC_COMP_ON; - else + } else { + if (!is->compressor) + break; is->compflags |= SC_LINK_COMP_ON; + } break; case CCP_RESETACK: /* If we send a ACK we should reset our compressor */ diff -u --recursive --new-file v2.4.13/linux/drivers/md/lvm.c linux/drivers/md/lvm.c --- v2.4.13/linux/drivers/md/lvm.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/md/lvm.c Thu Oct 25 13:58:35 2001 @@ -357,6 +357,7 @@ static struct file_operations lvm_chr_fops = { + owner: THIS_MODULE, open: lvm_chr_open, release: lvm_chr_close, ioctl: lvm_chr_ioctl, @@ -366,6 +367,7 @@ /* block device operations structure needed for 2.3.38? and above */ static struct block_device_operations lvm_blk_dops = { + owner: THIS_MODULE, open: lvm_blk_open, release: lvm_blk_close, ioctl: lvm_blk_ioctl, @@ -544,8 +546,6 @@ lvm_chr_open_count++; - MOD_INC_USE_COUNT; - return 0; } /* lvm_chr_open() */ @@ -786,8 +786,6 @@ wake_up_interruptible(&lvm_wait); } - MOD_DEC_USE_COUNT; - return 0; } /* lvm_chr_close() */ @@ -840,8 +838,6 @@ if (lv_ptr->lv_open == 0) vg_ptr->lv_open++; lv_ptr->lv_open++; - MOD_INC_USE_COUNT; - #ifdef DEBUG_LVM_BLK_OPEN printk(KERN_DEBUG "%s -- lvm_blk_open MINOR: %d VG#: %d LV#: %d size: %d\n", @@ -1042,8 +1038,6 @@ if (lv_ptr->lv_open == 1) vg_ptr->lv_open--; lv_ptr->lv_open--; - - MOD_DEC_USE_COUNT; return 0; } /* lvm_blk_close() */ diff -u --recursive --new-file v2.4.13/linux/drivers/md/md.c linux/drivers/md/md.c --- v2.4.13/linux/drivers/md/md.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/md/md.c Thu Oct 25 13:58:34 2001 @@ -2895,6 +2895,7 @@ static struct block_device_operations md_fops= { + owner: THIS_MODULE, open: md_open, release: md_release, ioctl: md_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/media/video/cpia.c linux/drivers/media/video/cpia.c --- v2.4.13/linux/drivers/media/video/cpia.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/media/video/cpia.c Thu Oct 25 13:53:47 2001 @@ -56,8 +56,9 @@ #ifdef MODULE MODULE_PARM(video_nr,"i"); -MODULE_AUTHOR("Scott J. Bertin & Peter Pregler & Johannes Erdfelt "); +MODULE_AUTHOR("Scott J. Bertin & Peter Pregler & Johannes Erdfelt "); MODULE_DESCRIPTION("V4L-driver for Vision CPiA based cameras"); +MODULE_LICENSE("GPL"); MODULE_SUPPORTED_DEVICE("video"); #endif @@ -2869,7 +2870,7 @@ /* set video size */ video_size = match_videosize(vm.width, vm.height); - if (cam->video_size < 0) { + if (video_size < 0) { retval = -EINVAL; break; } @@ -3253,41 +3254,7 @@ } } -/**************************************************************************** - * - * Module routines - * - ***************************************************************************/ - -#ifdef MODULE -int init_module(void) -{ - printk(KERN_INFO "%s v%d.%d.%d\n", ABOUT, - CPIA_MAJ_VER, CPIA_MIN_VER, CPIA_PATCH_VER); -#ifdef CONFIG_PROC_FS - proc_cpia_create(); -#endif -#ifdef CONFIG_KMOD -#ifdef CONFIG_VIDEO_CPIA_PP_MODULE - request_module("cpia_pp"); -#endif -#ifdef CONFIG_VIDEO_CPIA_USB_MODULE - request_module("cpia_usb"); -#endif -#endif -return 0; -} - -void cleanup_module(void) -{ -#ifdef CONFIG_PROC_FS - proc_cpia_destroy(); -#endif -} - -#else - -int cpia_init(struct video_init *unused) +static int __init cpia_init(void) { printk(KERN_INFO "%s v%d.%d.%d\n", ABOUT, CPIA_MAJ_VER, CPIA_MIN_VER, CPIA_PATCH_VER); @@ -3313,9 +3280,17 @@ return 0; } +static void __exit cpia_exit(void) +{ +#ifdef CONFIG_PROC_FS + proc_cpia_destroy(); +#endif +} + +module_init(cpia_init); +module_exit(cpia_exit); + /* Exported symbols for modules. */ EXPORT_SYMBOL(cpia_register_camera); EXPORT_SYMBOL(cpia_unregister_camera); - -#endif diff -u --recursive --new-file v2.4.13/linux/drivers/media/video/cpia.h linux/drivers/media/video/cpia.h --- v2.4.13/linux/drivers/media/video/cpia.h Fri Mar 2 11:12:10 2001 +++ linux/drivers/media/video/cpia.h Thu Oct 25 13:53:47 2001 @@ -416,6 +416,26 @@ } while (0) +static inline void cpia_add_to_list(struct cam_data* l, struct cam_data* drv) +{ + drv->next = l; + drv->previous = &l; + l = drv; +} + + +static inline void cpia_remove_from_list(struct cam_data* drv) +{ + if (drv->previous != NULL) { + if (drv->next != NULL) + drv->next->previous = drv->previous; + *(drv->previous) = drv->next; + drv->previous = NULL; + drv->next = NULL; + } +} + + #endif /* __KERNEL__ */ #endif /* cpia_h */ diff -u --recursive --new-file v2.4.13/linux/drivers/media/video/cpia_pp.c linux/drivers/media/video/cpia_pp.c --- v2.4.13/linux/drivers/media/video/cpia_pp.c Fri Mar 2 11:12:10 2001 +++ linux/drivers/media/video/cpia_pp.c Thu Oct 25 13:53:47 2001 @@ -123,6 +123,8 @@ MODULE_AUTHOR("B. Huisman & Peter Pregler "); MODULE_DESCRIPTION("Parallel port driver for Vision CPiA based cameras"); +MODULE_LICENSE("GPL"); + MODULE_PARM(parport, "1-" __MODULE_STRING(PARPORT_MAX) "s"); MODULE_PARM_DESC(parport, "'auto' or a list of parallel port numbers. Just like lp."); #else @@ -158,6 +160,7 @@ }; static struct cam_data *cam_list; +static spinlock_t cam_list_lock_pp; #ifdef _CPIA_DEBUG_ #define DEB_PORT(port) { \ @@ -582,7 +585,9 @@ kfree(cam); return -ENXIO; } - ADD_TO_LIST(cam_list, cpia); + spin_lock( &cam_list_lock_pp ); + cpia_add_to_list(cam_list, cpia); + spin_unlock( &cam_list_lock_pp ); return 0; } @@ -591,11 +596,12 @@ { struct cam_data *cpia; + spin_lock( &cam_list_lock_pp ); for(cpia = cam_list; cpia != NULL; cpia = cpia->next) { struct pp_cam_entry *cam = cpia->lowlevel_data; if (cam && cam->port->number == port->number) { - REMOVE_FROM_LIST(cpia); - + cpia_remove_from_list(cpia); + spin_unlock( &cam_list_lock_pp ); cpia_unregister_camera(cpia); if(cam->open_count > 0) { @@ -660,6 +666,9 @@ LOG ("unable to register with parport\n"); return -EIO; } + + cam_list = NULL; + spin_lock_init( &cam_list_lock_pp ); return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/media/video/cpia_usb.c linux/drivers/media/video/cpia_usb.c --- v2.4.13/linux/drivers/media/video/cpia_usb.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/media/video/cpia_usb.c Thu Oct 25 13:53:47 2001 @@ -104,6 +104,7 @@ }; static struct cam_data *cam_list; +static spinlock_t cam_list_lock_usb; static void cpia_usb_complete(struct urb *urb) { @@ -536,7 +537,9 @@ goto fail_all; } - ADD_TO_LIST(cam_list, cam); + spin_lock( &cam_list_lock_usb ); + cpia_add_to_list(cam_list, cam); + spin_unlock( &cam_list_lock_usb ); return cam; @@ -563,6 +566,8 @@ }; MODULE_DEVICE_TABLE (usb, cpia_id_table); +MODULE_LICENSE("GPL"); + static struct usb_driver cpia_driver = { name: "cpia", @@ -579,8 +584,10 @@ struct cam_data *cam = (struct cam_data *) ptr; struct usb_cpia *ucpia = (struct usb_cpia *) cam->lowlevel_data; - REMOVE_FROM_LIST(cam); - + spin_lock( &cam_list_lock_usb ); + cpia_remove_from_list(cam); + spin_unlock( &cam_list_lock_usb ); + /* Don't even try to reset the altsetting if we're disconnected */ cpia_usb_free_resources(ucpia, 0); @@ -620,7 +627,7 @@ static int __init usb_cpia_init(void) { cam_list = NULL; - + spin_lock_init(&cam_list_lock_usb); return usb_register(&cpia_driver); } diff -u --recursive --new-file v2.4.13/linux/drivers/media/video/meye.c linux/drivers/media/video/meye.c --- v2.4.13/linux/drivers/media/video/meye.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/media/video/meye.c Thu Oct 25 13:53:47 2001 @@ -35,6 +35,7 @@ #include #include #include +#include #include "meye.h" #include "linux/meye.h" @@ -1482,6 +1483,7 @@ MODULE_DESCRIPTION("video4linux driver for the MotionEye camera"); MODULE_LICENSE("GPL"); +EXPORT_NO_SYMBOLS; MODULE_PARM(gbuffers,"i"); MODULE_PARM_DESC(gbuffers,"number of capture buffers, default is 2 (32 max)"); diff -u --recursive --new-file v2.4.13/linux/drivers/media/video/planb.c linux/drivers/media/video/planb.c --- v2.4.13/linux/drivers/media/video/planb.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/media/video/planb.c Thu Oct 25 13:53:47 2001 @@ -64,7 +64,7 @@ #if 0 #define IDEBUG(x...) printk(KERN_DEBUG ## x) /* Debug interrupt part */ -#endif +#else #define IDEBUG(x...) /* Don't debug interrupt part */ #endif diff -u --recursive --new-file v2.4.13/linux/drivers/message/i2o/i2o_block.c linux/drivers/message/i2o/i2o_block.c --- v2.4.13/linux/drivers/message/i2o/i2o_block.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/message/i2o/i2o_block.c Thu Oct 25 13:58:35 2001 @@ -1247,7 +1247,6 @@ DEBUG("Unclaim\n"); } - MOD_DEC_USE_COUNT; return 0; } @@ -1306,7 +1305,6 @@ i2o_post_wait(dev->controller, msg, 20, 2); DEBUG("Ready.\n"); } - MOD_INC_USE_COUNT; return 0; } @@ -1371,34 +1369,34 @@ for(i=unit;i<=unit+15;i++) { - if(d->controller->type == I2O_TYPE_PCI && d->controller->bus.pci.queue_buggy) + i2ob_max_sectors[i] = 256; + i2ob_dev[i].max_segments = (d->controller->status_block->inbound_frame_size - 8)/2; + + if(d->controller->type == I2O_TYPE_PCI && d->controller->bus.pci.queue_buggy == 2) + i2ob_dev[i].depth = 32; + + if(d->controller->type == I2O_TYPE_PCI && d->controller->bus.pci.queue_buggy == 1) { i2ob_max_sectors[i] = 32; i2ob_dev[i].max_segments = 8; i2ob_dev[i].depth = 4; } - else if(d->controller->type == I2O_TYPE_PCI && d->controller->bus.pci.short_req) + + if(d->controller->type == I2O_TYPE_PCI && d->controller->bus.pci.short_req) { i2ob_max_sectors[i] = 8; i2ob_dev[i].max_segments = 8; } - else - { - /* MAX_SECTORS was used but 255 is a dumb number for - striped RAID */ - i2ob_max_sectors[i]=256; - i2ob_dev[i].max_segments = (d->controller->status_block->inbound_frame_size - 8)/2; - } } - printk(KERN_INFO "Max segments set to %d\n", - i2ob_dev[unit].max_segments); - printk(KERN_INFO "Byte limit is %d.\n", limit); - i2ob_query_device(dev, 0x0000, 0, &type, 1); - sprintf(d->dev_name, "%s%c", i2ob_gendisk.major_name, 'a' + (unit>>4)); + printk(KERN_INFO "%s: Max segments %d, queue depth %d, byte limit %d.\n", + d->dev_name, i2ob_dev[unit].max_segments, i2ob_dev[unit].depth, limit); + + i2ob_query_device(dev, 0x0000, 0, &type, 1); + printk(KERN_INFO "%s: ", d->dev_name); switch(type) { @@ -1417,7 +1415,7 @@ printk(KERN_INFO " Not loaded.\n"); return 1; } - printk("- %dMb, %d byte sectors", + printk(": %dMB, %d byte sectors", (int)(size>>20), blocksize); if(status&(1<<0)) { @@ -1838,6 +1836,7 @@ static struct block_device_operations i2ob_fops = { + owner: THIS_MODULE, open: i2ob_open, release: i2ob_release, ioctl: i2ob_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/message/i2o/i2o_pci.c linux/drivers/message/i2o/i2o_pci.c --- v2.4.13/linux/drivers/message/i2o/i2o_pci.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/message/i2o/i2o_pci.c Thu Oct 25 13:53:47 2001 @@ -192,6 +192,8 @@ if(dev->subsystem_vendor == PCI_VENDOR_ID_PROMISE) { c->bus.pci.queue_buggy=1; + if (dev->subsystem_device == 0x0000) /* SX6000 ???? */ + c->bus.pci.queue_buggy=2; printk(KERN_INFO "I2O: Promise workarounds activated.\n"); } diff -u --recursive --new-file v2.4.13/linux/drivers/message/i2o/i2o_proc.c linux/drivers/message/i2o/i2o_proc.c --- v2.4.13/linux/drivers/message/i2o/i2o_proc.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/message/i2o/i2o_proc.c Thu Oct 25 13:53:47 2001 @@ -955,13 +955,14 @@ i2o_driver_result_table *result; i2o_driver_store_table *dst; - spin_lock(&i2o_proc_lock); len = 0; result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL); if(result == NULL) return -ENOMEM; + + spin_lock(&i2o_proc_lock); token = i2o_query_table(I2O_PARAMS_TABLE_GET, c, ADAPTER_TID, 0x0005, -1, NULL, 0, diff -u --recursive --new-file v2.4.13/linux/drivers/mtd/chips/cfi_cmdset_0002.c linux/drivers/mtd/chips/cfi_cmdset_0002.c --- v2.4.13/linux/drivers/mtd/chips/cfi_cmdset_0002.c Tue Oct 9 17:06:51 2001 +++ linux/drivers/mtd/chips/cfi_cmdset_0002.c Thu Oct 25 00:07:09 2001 @@ -8,7 +8,7 @@ * * This code is GPL * - * $Id: cfi_cmdset_0002.c,v 1.51 2001/10/02 15:05:12 dwmw2 Exp $ + * $Id: cfi_cmdset_0002.c,v 1.52 2001/10/24 09:37:30 dwmw2 Exp $ * */ @@ -66,7 +66,7 @@ major = cfi_read_query(map, base + (adr+3)*ofs_factor); minor = cfi_read_query(map, base + (adr+4)*ofs_factor); - printk(" Amd/Fujitsu Extended Query Table v%c.%c at 0x%4.4X\n", + printk(KERN_NOTICE " Amd/Fujitsu Extended Query Table v%c.%c at 0x%4.4X\n", major, minor, adr); cfi_send_gen_cmd(0xf0, 0x55, base, map, cfi, cfi->device_type, NULL); @@ -148,10 +148,10 @@ unsigned long devsize = (1<cfiq->DevSize) * cfi->interleave; mtd = kmalloc(sizeof(*mtd), GFP_KERNEL); - printk("number of %s chips: %d\n", (cfi->cfi_mode)?"JEDEC":"CFI",cfi->numchips); + printk(KERN_NOTICE "number of %s chips: %d\n", (cfi->cfi_mode)?"CFI":"JEDEC",cfi->numchips); if (!mtd) { - printk("Failed to allocate memory for MTD device\n"); + printk(KERN_WARNING "Failed to allocate memory for MTD device\n"); kfree(cfi->cmdset_priv); return NULL; } @@ -172,7 +172,7 @@ mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips; mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info) * mtd->numeraseregions, GFP_KERNEL); if (!mtd->eraseregions) { - printk("Failed to allocate memory for MTD erase region info\n"); + printk(KERN_WARNING "Failed to allocate memory for MTD erase region info\n"); kfree(cfi->cmdset_priv); return NULL; } @@ -194,11 +194,12 @@ } if (offset != devsize) { /* Argh */ - printk("Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize); + printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize); kfree(mtd->eraseregions); kfree(cfi->cmdset_priv); return NULL; } +#if 0 // debug for (i=0; inumeraseregions;i++){ printk("%d: offset=0x%x,size=0x%x,blocks=%d\n", @@ -206,6 +207,7 @@ mtd->eraseregions[i].erasesize, mtd->eraseregions[i].numblocks); } +#endif } switch (CFIDEV_BUSWIDTH) @@ -224,7 +226,7 @@ break; default: - printk("Unsupported buswidth\n"); + printk(KERN_WARNING "Unsupported buswidth\n"); kfree(mtd); kfree(cfi->cmdset_priv); return NULL; @@ -249,7 +251,9 @@ cfi_spin_lock(chip->mutex); if (chip->state != FL_READY){ - printk("Waiting for chip to read, status = %d\n", chip->state); +#if 0 + printk(KERN_DEBUG "Waiting for chip to read, status = %d\n", chip->state); +#endif set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); @@ -332,7 +336,9 @@ cfi_spin_lock(chip->mutex); if (chip->state != FL_READY){ - printk("Waiting for chip to write, status = %d\n", chip->state); +#if 0 + printk(KERN_DEBUG "Waiting for chip to write, status = %d\n", chip->state); +#endif set_current_state(TASK_UNINTERRUPTIBLE); add_wait_queue(&chip->wq, &wait); @@ -340,8 +346,8 @@ schedule(); remove_wait_queue(&chip->wq, &wait); - printk("Wake up to write:\n"); #if 0 + printk(KERN_DEBUG "Wake up to write:\n"); if(signal_pending(current)) return -EINTR; #endif @@ -386,7 +392,7 @@ } if (Last[(Count - 1) % 4] != datum){ - printk("Last[%ld] is %x, datum is %x\n",(Count - 1) % 4,Last[(Count - 1) % 4],datum); + printk(KERN_WARNING "Last[%ld] is %x, datum is %x\n",(Count - 1) % 4,Last[(Count - 1) % 4],datum); cfi_send_gen_cmd(0xF0, 0, chip->start, map, cfi, cfi->device_type, NULL); DISABLE_VPP(map); ret = -EIO; @@ -600,7 +606,7 @@ add_wait_queue(&chip->wq, &wait); cfi_spin_unlock(chip->mutex); - printk("erase suspended. Sleeping\n"); + printk(KERN_DEBUG "erase suspended. Sleeping\n"); schedule(); remove_wait_queue(&chip->wq, &wait); @@ -617,7 +623,7 @@ if (time_after(jiffies, timeo)) { chip->state = FL_READY; cfi_spin_unlock(chip->mutex); - printk("waiting for erase to complete timed out."); + printk(KERN_WARNING "waiting for erase to complete timed out."); DISABLE_VPP(map); return -EIO; } @@ -627,7 +633,7 @@ z++; if ( 0 && !(z % 100 )) - printk("chip not ready yet after erase. looping\n"); + printk(KERN_WARNING "chip not ready yet after erase. looping\n"); cfi_udelay(1); @@ -914,7 +920,7 @@ wake_up(&chip->wq); } else - printk("Argh. Chip not in PM_SUSPENDED state upon resume()\n"); + printk(KERN_ERR "Argh. Chip not in PM_SUSPENDED state upon resume()\n"); cfi_spin_unlock(chip->mutex); } diff -u --recursive --new-file v2.4.13/linux/drivers/mtd/ftl.c linux/drivers/mtd/ftl.c --- v2.4.13/linux/drivers/mtd/ftl.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/mtd/ftl.c Thu Oct 25 13:58:35 2001 @@ -235,6 +235,7 @@ }; #else static struct block_device_operations ftl_blk_fops = { + owner: THIS_MODULE, open: ftl_open, release: ftl_close, ioctl: ftl_ioctl, @@ -894,16 +895,11 @@ if (ftl_gendisk.part[minor].nr_sects == 0) return -ENXIO; - MOD_INC_USE_COUNT; - - if (!get_mtd_device(partition->mtd, -1)) { - MOD_DEC_USE_COUNT; + if (!get_mtd_device(partition->mtd, -1)) return /* -E'SBUGGEREDOFF */ -ENXIO; - } - + if ((file->f_mode & 2) && !(partition->mtd->flags & MTD_CLEAR_BITS) ) { put_mtd_device(partition->mtd); - MOD_DEC_USE_COUNT; return -EROFS; } @@ -939,7 +935,6 @@ atomic_dec(&part->open); put_mtd_device(part->mtd); - MOD_DEC_USE_COUNT; release_return(0); } /* ftl_close */ diff -u --recursive --new-file v2.4.13/linux/drivers/mtd/mtdblock.c linux/drivers/mtd/mtdblock.c --- v2.4.13/linux/drivers/mtd/mtdblock.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/mtd/mtdblock.c Thu Oct 25 13:58:35 2001 @@ -295,8 +295,6 @@ return -ENODEV; } - MOD_INC_USE_COUNT; - spin_lock(&mtdblks_lock); /* If it's already open, no need to piss about. */ @@ -316,7 +314,6 @@ mtdblk = kmalloc(sizeof(struct mtdblk_dev), GFP_KERNEL); if (!mtdblk) { put_mtd_device(mtd); - MOD_DEC_USE_COUNT; return -ENOMEM; } memset(mtdblk, 0, sizeof(*mtdblk)); @@ -332,7 +329,6 @@ if (!mtdblk->cache_data) { put_mtd_device(mtdblk->mtd); kfree(mtdblk); - MOD_DEC_USE_COUNT; return -ENOMEM; } } @@ -400,7 +396,6 @@ DEBUG(MTD_DEBUG_LEVEL1, "ok\n"); - MOD_DEC_USE_COUNT; release_return(0); } @@ -574,6 +569,7 @@ #else static struct block_device_operations mtd_fops = { + owner: THIS_MODULE, open: mtdblock_open, release: mtdblock_release, ioctl: mtdblock_ioctl diff -u --recursive --new-file v2.4.13/linux/drivers/mtd/mtdblock_ro.c linux/drivers/mtd/mtdblock_ro.c --- v2.4.13/linux/drivers/mtd/mtdblock_ro.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/mtd/mtdblock_ro.c Thu Oct 25 13:58:35 2001 @@ -62,8 +62,6 @@ return -EINVAL; } - MOD_INC_USE_COUNT; - mtd_sizes[dev] = mtd->size>>9; DEBUG(1, "ok\n"); @@ -88,7 +86,6 @@ if (!mtd) { printk(KERN_WARNING "MTD device is absent on mtd_release!\n"); - MOD_DEC_USE_COUNT; release_return(-ENODEV); } @@ -99,7 +96,6 @@ DEBUG(1, "ok\n"); - MOD_DEC_USE_COUNT; release_return(0); } @@ -244,6 +240,7 @@ #else static struct block_device_operations mtd_fops = { + owner: THIS_MODULE, open: mtdblock_open, release: mtdblock_release, ioctl: mtdblock_ioctl diff -u --recursive --new-file v2.4.13/linux/drivers/mtd/nftlcore.c linux/drivers/mtd/nftlcore.c --- v2.4.13/linux/drivers/mtd/nftlcore.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/mtd/nftlcore.c Thu Oct 25 13:58:35 2001 @@ -984,11 +984,8 @@ #endif /* !CONFIG_NFTL_RW */ thisNFTL->usecount++; - MOD_INC_USE_COUNT; - if (!get_mtd_device(thisNFTL->mtd, -1)) { - MOD_DEC_USE_COUNT; + if (!get_mtd_device(thisNFTL->mtd, -1)) return /* -E'SBUGGEREDOFF */ -ENXIO; - } return 0; } @@ -1006,7 +1003,6 @@ if (thisNFTL->mtd->sync) thisNFTL->mtd->sync(thisNFTL->mtd); thisNFTL->usecount--; - MOD_DEC_USE_COUNT; put_mtd_device(thisNFTL->mtd); @@ -1024,6 +1020,7 @@ #else static struct block_device_operations nftl_fops = { + owner: THIS_MODULE, open: nftl_open, release: nftl_release, ioctl: nftl_ioctl diff -u --recursive --new-file v2.4.13/linux/drivers/net/8139cp.c linux/drivers/net/8139cp.c --- v2.4.13/linux/drivers/net/8139cp.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/8139cp.c Thu Oct 25 14:01:51 2001 @@ -17,23 +17,24 @@ See the file COPYING in this distribution for more information. - TODO: + TODO, in rough priority order: * dev->tx_timeout + * LinkChg interrupt + * ETHTOOL_[GS]SET + * Support forcing media type with a module parameter, + like dl2k.c/sundance.c + * Implement PCI suspend/resume * Constants (module parms?) for Rx work limit * support 64-bit PCI DMA - * ETHTOOL_[GS]SET, ETHTOOL_GREGS, ETHTOOL_[GS]WOL, - ETHTOOL_[GS]MSGLVL, ETHTOOL_NWAY_RST * Complete reset on PciErr - * LinkChg and LenChg interrupts * Consider Rx interrupt mitigation using TimerIntr - * Implement 8139C+ statistics dump - * Support forcing media type with a module parameter, - like dl2k.c/sundance.c + * Implement 8139C+ statistics dump; maybe not... + h/w stats can be reset only by software reset * Rx checksumming * Tx checksumming + * ETHTOOL_GREGS, ETHTOOL_[GS]WOL, + ETHTOOL_[GS]MSGLVL, ETHTOOL_NWAY_RST * Jumbo frames / dev->change_mtu - * Tx abort stops Tx DMA? - * Investigate IntrStatus bit 10 purpose and use * Investigate using skb->priority with h/w VLAN priority * Investigate using High Priority Tx Queue with skb->priority * Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error diff -u --recursive --new-file v2.4.13/linux/drivers/net/acenic.c linux/drivers/net/acenic.c --- v2.4.13/linux/drivers/net/acenic.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/acenic.c Wed Oct 24 14:02:56 2001 @@ -1051,7 +1051,8 @@ struct ace_private *ap; struct ace_regs *regs; struct ace_info *info = NULL; - unsigned long tmp_ptr, myjif; + u64 tmp_ptr; + unsigned long myjif; u32 tig_ver, mac1, mac2, tmp, pci_state; int board_idx, ecode = 0; short i; diff -u --recursive --new-file v2.4.13/linux/drivers/net/hamradio/scc.c linux/drivers/net/hamradio/scc.c --- v2.4.13/linux/drivers/net/hamradio/scc.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/hamradio/scc.c Thu Oct 25 13:58:15 2001 @@ -1,3 +1,5 @@ +#define RCS_ID "$Id: scc.c,v 1.75 1998/11/04 15:15:01 jreuter Exp jreuter $" + #define VERSION "3.0" /* @@ -16,7 +18,7 @@ ******************************************************************** - Copyright (c) 1993, 2001 Joerg Reuter DL1BKE + Copyright (c) 1993, 2000 Joerg Reuter DL1BKE portions (c) 1993 Guido ten Dolle PE1NNZ @@ -104,10 +106,6 @@ 2000-02-13 Fixed for new network driver interface changes, still does TX timeouts itself since it uses its own queue scheme. - 2001-10-05 Set skb to NULL on Rx_OVR in scc_spint() (tnx everybody - who insisted that the skb gets in fact re-used by the - following code otherwise. I think we have another Z8530 - bug here...) Thanks to all who contributed to this driver with ideas and bug reports! @@ -585,7 +583,6 @@ if (skb != NULL) dev_kfree_skb_irq(skb); scc->rx_buff = skb = NULL; - skb = NULL; /* avoid skb being reused */ } if(status & END_FR && skb != NULL) /* end of frame */ diff -u --recursive --new-file v2.4.13/linux/drivers/net/irda/Config.in linux/drivers/net/irda/Config.in --- v2.4.13/linux/drivers/net/irda/Config.in Mon Aug 27 12:41:42 2001 +++ linux/drivers/net/irda/Config.in Thu Oct 25 13:53:47 2001 @@ -14,6 +14,9 @@ dep_tristate ' Greenwich GIrBIL dongle' CONFIG_GIRBIL_DONGLE $CONFIG_IRDA dep_tristate ' Parallax LiteLink dongle' CONFIG_LITELINK_DONGLE $CONFIG_IRDA dep_tristate ' Old Belkin dongle' CONFIG_OLD_BELKIN_DONGLE $CONFIG_IRDA + if [ "$CONFIG_ARCH_EP7211" = "y" ]; then + dep_tristate ' EP7211 I/R support' CONFIG_EP7211_IR $CONFIG_IRDA + fi fi comment 'FIR device drivers' @@ -25,6 +28,9 @@ dep_tristate 'SMC IrCC (Experimental)' CONFIG_SMC_IRCC_FIR $CONFIG_IRDA dep_tristate 'ALi M5123 FIR (Experimental)' CONFIG_ALI_FIR $CONFIG_IRDA dep_tristate 'VLSI 82C147 SIR/MIR/FIR (Experimental)' CONFIG_VLSI_FIR $CONFIG_IRDA +fi +if [ "$CONFIG_ARCH_SA1100" = "y" ]; then + dep_tristate 'SA1100 Internal IR' CONFIG_SA1100_FIR $CONFIG_IRDA fi endmenu diff -u --recursive --new-file v2.4.13/linux/drivers/net/irda/Makefile linux/drivers/net/irda/Makefile --- v2.4.13/linux/drivers/net/irda/Makefile Mon Aug 27 12:41:42 2001 +++ linux/drivers/net/irda/Makefile Thu Oct 25 13:53:47 2001 @@ -1,3 +1,4 @@ +# File: drivers/irda/Makefile # # Makefile for the Linux IrDA infrared port device drivers. # @@ -15,6 +16,7 @@ obj-$(CONFIG_USB_IRDA) += irda-usb.o obj-$(CONFIG_NSC_FIR) += nsc-ircc.o obj-$(CONFIG_WINBOND_FIR) += w83977af_ir.o +obj-$(CONFIG_SA1100_FIR) += sa1100_ir.o obj-$(CONFIG_TOSHIBA_FIR) += toshoboe.o obj-$(CONFIG_SMC_IRCC_FIR) += smc-ircc.o irport.o obj-$(CONFIG_ALI_FIR) += ali-ircc.o @@ -25,5 +27,6 @@ obj-$(CONFIG_GIRBIL_DONGLE) += girbil.o obj-$(CONFIG_LITELINK_DONGLE) += litelink.o obj-$(CONFIG_OLD_BELKIN_DONGLE) += old_belkin.o +obj-$(CONFIG_EP7211_IR) += ep7211_ir.o include $(TOPDIR)/Rules.make diff -u --recursive --new-file v2.4.13/linux/drivers/net/irda/ep7211_ir.c linux/drivers/net/irda/ep7211_ir.c --- v2.4.13/linux/drivers/net/irda/ep7211_ir.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/irda/ep7211_ir.c Thu Oct 25 13:53:47 2001 @@ -0,0 +1,129 @@ +/* + * IR port driver for the Cirrus Logic EP7211 processor. + * + * Copyright 2001, Blue Mug Inc. All rights reserved. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#define MIN_DELAY 25 /* 15 us, but wait a little more to be sure */ +#define MAX_DELAY 10000 /* 1 ms */ + +static void ep7211_ir_open(dongle_t *self, struct qos_info *qos); +static void ep7211_ir_close(dongle_t *self); +static int ep7211_ir_change_speed(struct irda_task *task); +static int ep7211_ir_reset(struct irda_task *task); + +static struct dongle_reg dongle = { + Q_NULL, + IRDA_EP7211_IR, + ep7211_ir_open, + ep7211_ir_close, + ep7211_ir_reset, + ep7211_ir_change_speed, +}; + +static void ep7211_ir_open(dongle_t *self, struct qos_info *qos) +{ + unsigned int syscon1, flags; + + save_flags(flags); cli(); + + /* Turn on the SIR encoder. */ + syscon1 = clps_readl(SYSCON1); + syscon1 |= SYSCON1_SIREN; + clps_writel(syscon1, SYSCON1); + + /* XXX: We should disable modem status interrupts on the first + UART (interrupt #14). */ + + restore_flags(flags); + + MOD_INC_USE_COUNT; +} + +static void ep7211_ir_close(dongle_t *self) +{ + unsigned int syscon1, flags; + + save_flags(flags); cli(); + + /* Turn off the SIR encoder. */ + syscon1 = clps_readl(SYSCON1); + syscon1 &= ~SYSCON1_SIREN; + clps_writel(syscon1, SYSCON1); + + /* XXX: If we've disabled the modem status interrupts, we should + reset them back to their original state. */ + + restore_flags(flags); + + MOD_DEC_USE_COUNT; +} + +/* + * Function ep7211_ir_change_speed (task) + * + * Change speed of the EP7211 I/R port. We don't really have to do anything + * for the EP7211 as long as the rate is being changed at the serial port + * level. + */ +static int ep7211_ir_change_speed(struct irda_task *task) +{ + irda_task_next_state(task, IRDA_TASK_DONE); + return 0; +} + +/* + * Function ep7211_ir_reset (task) + * + * Reset the EP7211 I/R. We don't really have to do anything. + * + */ +static int ep7211_ir_reset(struct irda_task *task) +{ + irda_task_next_state(task, IRDA_TASK_DONE); + return 0; +} + +/* + * Function ep7211_ir_init(void) + * + * Initialize EP7211 I/R module + * + */ +int __init ep7211_ir_init(void) +{ + return irda_device_register_dongle(&dongle); +} + +/* + * Function ep7211_ir_cleanup(void) + * + * Cleanup EP7211 I/R module + * + */ +static void __exit ep7211_ir_cleanup(void) +{ + irda_device_unregister_dongle(&dongle); +} + +MODULE_AUTHOR("Jon McClintock "); +MODULE_DESCRIPTION("EP7211 I/R driver"); +MODULE_LICENSE("GPL"); + +#ifdef MODULE +module_init(ep7211_ir_init); +#endif /* MODULE */ +module_exit(ep7211_ir_cleanup); diff -u --recursive --new-file v2.4.13/linux/drivers/net/irda/sa1100_ir.c linux/drivers/net/irda/sa1100_ir.c --- v2.4.13/linux/drivers/net/irda/sa1100_ir.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/net/irda/sa1100_ir.c Thu Oct 25 13:53:47 2001 @@ -0,0 +1,1163 @@ +/* + * linux/drivers/net/irda/sa1100_ir.c + * + * Copyright (C) 2000-2001 Russell King + * + * 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. + * + * Infra-red driver for the StrongARM SA1100 embedded microprocessor + * + * Note that we don't have to worry about the SA1111's DMA bugs in here, + * so we use the straight forward pci_map_* functions with a null pointer. + * IMHO we should really be using our own machine specific set. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#ifndef CONFIG_SA1100_H3600 +#define clr_h3600_egpio(x) do { } while (0) +#define set_h3600_egpio(x) do { } while (0) +#endif + +#ifndef GPIO_IRDA_FIR +#define GPIO_IRDA_FIR (0) +#endif + +#ifndef GPIO_IRDA_POWER +#define GPIO_IRDA_POWER (0) +#endif + +static int power_level = 3; +static int tx_lpm = 0; + +/* + * Our netdevice. There is only ever one of these. + */ +static struct net_device *netdev; + +struct sa1100_irda { + unsigned char hscr0; + unsigned char utcr4; + unsigned char power; + unsigned char open; + + int speed; + int newspeed; + + struct sk_buff *txskb; + struct sk_buff *rxskb; + dma_addr_t txbuf_dma; + dma_addr_t rxbuf_dma; + int txdma; + int rxdma; + + struct net_device_stats stats; + struct irlap_cb *irlap; + struct pm_dev *pmdev; + struct qos_info qos; + + iobuff_t tx_buff; + iobuff_t rx_buff; +}; + +#define IS_FIR(si) ((si)->speed >= 4000000) + +#define HPSIR_MAX_RXLEN 2047 + +/* + * Allocate and map the receive buffer, unless it is already allocated. + */ +static int sa1100_irda_rx_alloc(struct sa1100_irda *si) +{ + if (si->rxskb) + return 0; + + si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC); + + if (!si->rxskb) { + printk(KERN_ERR "sa1100_ir: out of memory for RX SKB\n"); + return -ENOMEM; + } + + /* + * Align any IP headers that may be contained + * within the frame. + */ + skb_reserve(si->rxskb, 1); + + si->rxbuf_dma = pci_map_single(NULL, si->rxskb->data, + HPSIR_MAX_RXLEN, + PCI_DMA_FROMDEVICE); + return 0; +} + +/* + * We want to get here as soon as possible, and get the receiver setup. + * We use the existing buffer. + */ +static void sa1100_irda_rx_dma_start(struct sa1100_irda *si) +{ + if (!si->rxskb) { + printk(KERN_ERR "sa1100_ir: rx buffer went missing\n"); + return; + } + + /* + * First empty receive FIFO + */ + Ser2HSCR0 = si->hscr0 | HSCR0_HSSP; + + /* + * Enable the DMA, receiver and recieve interrupt. + */ + sa1100_dma_flush_all(si->rxdma); + sa1100_dma_queue_buffer(si->rxdma, NULL, si->rxbuf_dma, HPSIR_MAX_RXLEN); + Ser2HSCR0 = si->hscr0 | HSCR0_HSSP | HSCR0_RXE; +} + +/* + * Set the IrDA communications speed. + */ +static int sa1100_irda_set_speed(struct sa1100_irda *si, int speed) +{ + unsigned long flags; + int brd, ret = -EINVAL; + + switch (speed) { + case 9600: case 19200: case 38400: + case 57600: case 115200: + brd = 3686400 / (16 * speed) - 1; + + /* + * Stop the receive DMA. + */ + if (IS_FIR(si)) + sa1100_dma_stop(si->rxdma); + + local_irq_save(flags); + + Ser2UTCR3 = 0; + Ser2HSCR0 = HSCR0_UART; + + Ser2UTCR1 = brd >> 8; + Ser2UTCR2 = brd; + + /* + * Clear status register + */ + Ser2UTSR0 = UTSR0_REB | UTSR0_RBB | UTSR0_RID; + Ser2UTCR3 = UTCR3_RIE | UTCR3_RXE | UTCR3_TXE; + + if (machine_is_assabet()) + ASSABET_BCR_clear(ASSABET_BCR_IRDA_FSEL); + if (machine_is_h3600()) + clr_h3600_egpio(EGPIO_H3600_IR_FSEL); + if (machine_is_yopy()) + PPSR &= ~GPIO_IRDA_FIR; + + si->speed = speed; + + local_irq_restore(flags); + ret = 0; + break; + + case 4000000: + save_flags(flags); + cli(); + + si->hscr0 = 0; + + Ser2HSSR0 = 0xff; + Ser2HSCR0 = si->hscr0 | HSCR0_HSSP; + Ser2UTCR3 = 0; + + si->speed = speed; + + if (machine_is_assabet()) + ASSABET_BCR_set(ASSABET_BCR_IRDA_FSEL); + if (machine_is_h3600()) + set_h3600_egpio(EGPIO_H3600_IR_FSEL); + if (machine_is_yopy()) + PPSR |= GPIO_IRDA_FIR; + + sa1100_irda_rx_alloc(si); + sa1100_irda_rx_dma_start(si); + + restore_flags(flags); + + break; + + default: + break; + } + + return ret; +} + +/* + * This sets the IRDA power level on the Assabet. + */ +static inline int +sa1100_irda_set_power_assabet(struct sa1100_irda *si, unsigned int state) +{ + static unsigned int bcr_state[4] = { + ASSABET_BCR_IRDA_MD0, + ASSABET_BCR_IRDA_MD1|ASSABET_BCR_IRDA_MD0, + ASSABET_BCR_IRDA_MD1, + 0 + }; + + if (state < 4) { + state = bcr_state[state]; + ASSABET_BCR_clear(state ^ (ASSABET_BCR_IRDA_MD1| + ASSABET_BCR_IRDA_MD0)); + ASSABET_BCR_set(state); + } + return 0; +} + +/* + * This turns the IRDA power on or off on the Compaq H3600 + */ +static inline int +sa1100_irda_set_power_h3600(struct sa1100_irda *si, unsigned int state) +{ + if (state) + set_h3600_egpio(EGPIO_H3600_IR_ON); + else + clr_h3600_egpio(EGPIO_H3600_IR_ON); + return 0; +} + +/* + * This turns the IRDA power on or off on the Yopy + */ +static inline int +sa1100_irda_set_power_yopy(struct sa1100_irda *si, unsigned int state) +{ + if (state) + PPSR &= ~GPIO_IRDA_POWER; + else + PPSR |= GPIO_IRDA_POWER; + return 0; +} + +/* + * Control the power state of the IrDA transmitter. + * State: + * 0 - off + * 1 - short range, lowest power + * 2 - medium range, medium power + * 3 - maximum range, high power + * + * Currently, only assabet is known to support this. + */ +static int +__sa1100_irda_set_power(struct sa1100_irda *si, unsigned int state) +{ + int ret = 0; + + if (machine_is_assabet()) + ret = sa1100_irda_set_power_assabet(si, state); + if (machine_is_h3600()) + ret = sa1100_irda_set_power_h3600(si, state); + if (machine_is_yopy()) + ret = sa1100_irda_set_power_yopy(si, state); + + return ret; +} + +static inline int +sa1100_set_power(struct sa1100_irda *si, unsigned int state) +{ + int ret; + + ret = __sa1100_irda_set_power(si, state); + if (ret == 0) + si->power = state; + + return ret; +} + +static int sa1100_irda_startup(struct sa1100_irda *si) +{ + int ret; + + /* + * Ensure that the ports for this device are setup correctly. + */ + if (machine_is_yopy()) { + PPDR |= GPIO_IRDA_POWER | GPIO_IRDA_FIR; + PPSR |= GPIO_IRDA_POWER | GPIO_IRDA_FIR; + PSDR |= GPIO_IRDA_POWER | GPIO_IRDA_FIR; + } + + /* + * Configure PPC for IRDA - we want to drive TXD2 low. + * We also want to drive this pin low during sleep. + */ + PPSR &= ~PPC_TXD2; + PSDR &= ~PPC_TXD2; + PPDR |= PPC_TXD2; + + /* + * Enable HP-SIR modulation, and ensure that the port is disabled. + */ + Ser2UTCR3 = 0; + Ser2HSCR0 = HSCR0_UART; + Ser2UTCR4 = si->utcr4; + Ser2UTCR0 = UTCR0_8BitData; + Ser2HSCR2 = HSCR2_TrDataH | HSCR2_RcDataL; + + /* + * Clear status register + */ + Ser2UTSR0 = UTSR0_REB | UTSR0_RBB | UTSR0_RID; + + ret = sa1100_irda_set_speed(si, si->speed = 9600); + if (ret) + return ret; + + return 0; +} + +static void sa1100_irda_shutdown(struct sa1100_irda *si) +{ + /* + * Stop all DMA activity. + */ + sa1100_dma_stop(si->rxdma); + sa1100_dma_stop(si->txdma); + + /* Disable the port. */ + Ser2UTCR3 = 0; + Ser2HSCR0 = 0; +} + +#ifdef CONFIG_PM +/* + * Suspend the IrDA interface. + */ +static int sa1100_irda_suspend(struct net_device *dev, int state) +{ + struct sa1100_irda *si = dev->priv; + + if (si && si->open) { + /* + * Stop the transmit queue + */ + netif_device_detach(dev); + disable_irq(dev->irq); + sa1100_irda_shutdown(si); + __sa1100_irda_set_power(si, 0); + } + + return 0; +} + +/* + * Resume the IrDA interface. + */ +static int sa1100_irda_resume(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + + if (si && si->open) { + /* + * If we missed a speed change, initialise at the new speed + * directly. It is debatable whether this is actually + * required, but in the interests of continuing from where + * we left off it is desireable. The converse argument is + * that we should re-negotiate at 9600 baud again. + */ + if (si->newspeed) { + si->speed = si->newspeed; + si->newspeed = 0; + } + + sa1100_irda_startup(si); + __sa1100_irda_set_power(si, si->power); + enable_irq(dev->irq); + + /* + * This automatically wakes up the queue + */ + netif_device_attach(dev); + } + + return 0; +} + +static int sa1100_irda_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data) +{ + int ret; + + if (!dev->data) + return -EINVAL; + + switch (rqst) { + case PM_SUSPEND: + ret = sa1100_irda_suspend((struct net_device *)dev->data, + (int)data); + break; + + case PM_RESUME: + ret = sa1100_irda_resume((struct net_device *)dev->data); + break; + + default: + ret = -EINVAL; + break; + } + + return ret; +} +#endif + +/* + * HP-SIR format interrupt service routines. + */ +static void sa1100_irda_hpsir_irq(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + int status; + + status = Ser2UTSR0; + + /* + * Deal with any receive errors first. The bytes in error may be + * the only bytes in the receive FIFO, so we do this first. + */ + while (status & UTSR0_EIF) { + int stat, data; + + stat = Ser2UTSR1; + data = Ser2UTDR; + + if (stat & (UTSR1_FRE | UTSR1_ROR)) { + si->stats.rx_errors++; + if (stat & UTSR1_FRE) + si->stats.rx_frame_errors++; + if (stat & UTSR1_ROR) + si->stats.rx_fifo_errors++; + } else + async_unwrap_char(dev, &si->stats, &si->rx_buff, data); + + status = Ser2UTSR0; + } + + /* + * We must clear certain bits. + */ + Ser2UTSR0 = status & (UTSR0_RID | UTSR0_RBB | UTSR0_REB); + + if (status & UTSR0_RFS) { + /* + * There are at least 4 bytes in the FIFO. Read 3 bytes + * and leave the rest to the block below. + */ + async_unwrap_char(dev, &si->stats, &si->rx_buff, Ser2UTDR); + async_unwrap_char(dev, &si->stats, &si->rx_buff, Ser2UTDR); + async_unwrap_char(dev, &si->stats, &si->rx_buff, Ser2UTDR); + } + + if (status & (UTSR0_RFS | UTSR0_RID)) { + /* + * Fifo contains more than 1 character. + */ + do { + async_unwrap_char(dev, &si->stats, &si->rx_buff, + Ser2UTDR); + } while (Ser2UTSR1 & UTSR1_RNE); + + dev->last_rx = jiffies; + } + + if (status & UTSR0_TFS && si->tx_buff.len) { + /* + * Transmitter FIFO is not full + */ + do { + Ser2UTDR = *si->tx_buff.data++; + si->tx_buff.len -= 1; + } while (Ser2UTSR1 & UTSR1_TNF && si->tx_buff.len); + + if (si->tx_buff.len == 0) { + si->stats.tx_packets++; + si->stats.tx_bytes += si->tx_buff.data - + si->tx_buff.head; + + /* + * We need to ensure that the transmitter has + * finished. + */ + do + rmb(); + while (Ser2UTSR1 & UTSR1_TBY); + + /* + * Ok, we've finished transmitting. Now enable + * the receiver. Sometimes we get a receive IRQ + * immediately after a transmit... + */ + Ser2UTSR0 = UTSR0_REB | UTSR0_RBB | UTSR0_RID; + Ser2UTCR3 = UTCR3_RIE | UTCR3_RXE | UTCR3_TXE; + + if (si->newspeed) { + sa1100_irda_set_speed(si, si->newspeed); + si->newspeed = 0; + } + + /* I'm hungry! */ + netif_wake_queue(dev); + } + } +} + +static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev) +{ + struct sk_buff *skb = si->rxskb; + dma_addr_t dma_addr; + unsigned int len, stat, data; + + if (!skb) { + printk(KERN_ERR "sa1100_ir: SKB is NULL!\n"); + return; + } + + /* + * Get the current data position. + */ + sa1100_dma_get_current(si->rxdma, NULL, &dma_addr); + len = dma_addr - si->rxbuf_dma; + pci_unmap_single(NULL, si->rxbuf_dma, len, PCI_DMA_FROMDEVICE); + + do { + /* + * Read Status, and then Data. + */ + stat = Ser2HSSR1; + rmb(); + data = Ser2HSDR; + + if (stat & (HSSR1_CRE | HSSR1_ROR)) { + si->stats.rx_errors++; + if (stat & HSSR1_CRE) + si->stats.rx_crc_errors++; + if (stat & HSSR1_ROR) + si->stats.rx_frame_errors++; + } else + skb->data[len++] = data; + + /* + * If we hit the end of frame, there's + * no point in continuing. + */ + if (stat & HSSR1_EOF) + break; + } while (Ser2HSSR0 & HSSR0_EIF); + + if (stat & HSSR1_EOF) { + si->rxskb = NULL; + + skb_put(skb, len); + skb->dev = dev; + skb->mac.raw = skb->data; + skb->protocol = htons(ETH_P_IRDA); + si->stats.rx_packets++; + si->stats.rx_bytes += len; + + /* + * Before we pass the buffer up, allocate a new one. + */ + sa1100_irda_rx_alloc(si); + + netif_rx(skb); + } else { + /* + * Remap the buffer. + */ + si->rxbuf_dma = pci_map_single(NULL, si->rxskb->data, + HPSIR_MAX_RXLEN, + PCI_DMA_FROMDEVICE); + } +} + +/* + * FIR format interrupt service routine. We only have to + * handle RX events; transmit events go via the TX DMA handler. + * + * No matter what, we disable RX, process, and the restart RX. + */ +static void sa1100_irda_fir_irq(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + + /* + * Stop RX DMA + */ + sa1100_dma_stop(si->rxdma); + + /* + * Framing error - we throw away the packet completely. + * Clearing RXE flushes the error conditions and data + * from the fifo. + */ + if (Ser2HSSR0 & (HSSR0_FRE | HSSR0_RAB)) { + si->stats.rx_errors++; + + if (Ser2HSSR0 & HSSR0_FRE) + si->stats.rx_frame_errors++; + + /* + * Clear out the DMA... + */ + Ser2HSCR0 = si->hscr0 | HSCR0_HSSP; + + /* + * Clear selected status bits now, so we + * don't miss them next time around. + */ + Ser2HSSR0 = HSSR0_FRE | HSSR0_RAB; + } + + /* + * Deal with any receive errors. The any of the lowest + * 8 bytes in the FIFO may contain an error. We must read + * them one by one. The "error" could even be the end of + * packet! + */ + if (Ser2HSSR0 & HSSR0_EIF) + sa1100_irda_fir_error(si, dev); + + /* + * No matter what happens, we must restart reception. + */ + sa1100_irda_rx_dma_start(si); +} + +static void sa1100_irda_irq(int irq, void *dev_id, struct pt_regs *regs) +{ + struct net_device *dev = dev_id; + if (IS_FIR(((struct sa1100_irda *)dev->priv))) + sa1100_irda_fir_irq(dev); + else + sa1100_irda_hpsir_irq(dev); +} + +/* + * TX DMA completion handler. + */ +static void sa1100_irda_txdma_irq(void *id, int len) +{ + struct net_device *dev = id; + struct sa1100_irda *si = dev->priv; + struct sk_buff *skb = si->txskb; + + si->txskb = NULL; + + /* + * Wait for the transmission to complete. Unfortunately, + * the hardware doesn't give us an interrupt to indicate + * "end of frame". + */ + do + rmb(); + while (!(Ser2HSSR0 & HSSR0_TUR) || Ser2HSSR1 & HSSR1_TBY); + + /* + * Clear the transmit underrun bit. + */ + Ser2HSSR0 = HSSR0_TUR; + + /* + * Do we need to change speed? Note that we're lazy + * here - we don't free the old rxskb. We don't need + * to allocate a buffer either. + */ + if (si->newspeed) { + sa1100_irda_set_speed(si, si->newspeed); + si->newspeed = 0; + } + + /* + * Start reception. This disables the transmitter for + * us. This will be using the existing RX buffer. + */ + sa1100_irda_rx_dma_start(si); + + /* + * Account and free the packet. + */ + if (skb) { + pci_unmap_single(NULL, si->txbuf_dma, len, PCI_DMA_TODEVICE); + si->stats.tx_packets ++; + si->stats.tx_bytes += len; + dev_kfree_skb_irq(skb); + } + + /* + * Make sure that the TX queue is available for sending + * (for retries). TX has priority over RX at all times. + */ + netif_wake_queue(dev); +} + +/* + * Note that we will never build up a backlog of frames; the protocol is a + * half duplex protocol which basically means we transmit a frame, we + * receive a frame, we transmit the next frame etc. + */ +static int sa1100_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + int speed = irda_get_next_speed(skb); + + /* + * Does this packet contain a request to change the interface + * speed? If so, remember it until we complete the transmission + * of this frame. + */ + if (speed != si->speed && speed != -1) + si->newspeed = speed; + + /* + * If this is an empty frame, we can bypass a lot. + */ + if (skb->len == 0) { + if (si->newspeed) { + si->newspeed = 0; + sa1100_irda_set_speed(si, speed); + } + dev_kfree_skb(skb); + return 0; + } + + if (!IS_FIR(si)) { + si->tx_buff.data = si->tx_buff.head; + si->tx_buff.len = async_wrap_skb(skb, si->tx_buff.data, + si->tx_buff.truesize); + + /* + * Set the transmit interrupt enable. This will fire + * off an interrupt immediately. Note that we disable + * the receiver so we won't get spurious characteres + * received. + */ + Ser2UTCR3 = UTCR3_TIE | UTCR3_TXE; + + dev_kfree_skb(skb); + } else { + int mtt = irda_get_mtt(skb); + + /* + * We must not be transmitting... + */ + if (si->txskb) + BUG(); + + netif_stop_queue(dev); + + si->txskb = skb; + si->txbuf_dma = pci_map_single(NULL, skb->data, + skb->len, PCI_DMA_TODEVICE); + + sa1100_dma_queue_buffer(si->txdma, dev, si->txbuf_dma, + skb->len); + + /* + * If we have a mean turn-around time, impose the specified + * specified delay. We could shorten this by timing from + * the point we received the packet. + */ + if (mtt) + udelay(mtt); + + Ser2HSCR0 = si->hscr0 | HSCR0_HSSP | HSCR0_TXE; + } + + dev->trans_start = jiffies; + + return 0; +} + +static int +sa1100_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd) +{ + struct if_irda_req *rq = (struct if_irda_req *)ifreq; + struct sa1100_irda *si = dev->priv; + int ret = -EOPNOTSUPP; + + switch (cmd) { + case SIOCSBANDWIDTH: + if (capable(CAP_NET_ADMIN)) { + /* + * We are unable to set the speed if the + * device is not running. + */ + if (si->open) { + ret = sa1100_irda_set_speed(si, + rq->ifr_baudrate); + } else { + printk("sa1100_irda_ioctl: SIOCSBANDWIDTH: !netif_running\n"); + ret = 0; + } + } + break; + + case SIOCSMEDIABUSY: + ret = -EPERM; + if (capable(CAP_NET_ADMIN)) { + irda_device_set_media_busy(dev, TRUE); + ret = 0; + } + break; + + case SIOCGRECEIVING: + rq->ifr_receiving = IS_FIR(si) ? 0 + : si->rx_buff.state != OUTSIDE_FRAME; + break; + + default: + break; + } + + return ret; +} + +static struct net_device_stats *sa1100_irda_stats(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + return &si->stats; +} + +static int sa1100_irda_start(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + int err; + + MOD_INC_USE_COUNT; + + si->speed = 9600; + + err = request_irq(dev->irq, sa1100_irda_irq, 0, dev->name, dev); + if (err) + goto err_irq; + + err = sa1100_request_dma(&si->rxdma, "IrDA receive", DMA_Ser2HSSPRd); + if (err) + goto err_rx_dma; + + err = sa1100_request_dma(&si->txdma, "IrDA transmit", DMA_Ser2HSSPWr); + if (err) + goto err_tx_dma; + + /* + * The interrupt must remain disabled for now. + */ + disable_irq(dev->irq); + + /* + * Setup the serial port for the specified speed. + */ + err = sa1100_irda_startup(si); + if (err) + goto err_startup; + + /* + * Open a new IrLAP layer instance. + */ + si->irlap = irlap_open(dev, &si->qos, "sa1100"); + err = -ENOMEM; + if (!si->irlap) + goto err_irlap; + + sa1100_dma_set_callback(si->txdma, sa1100_irda_txdma_irq); + + /* + * Now enable the interrupt and start the queue + */ + si->open = 1; + sa1100_set_power(si, power_level); /* low power mode */ + enable_irq(dev->irq); + netif_start_queue(dev); + return 0; + +err_irlap: + si->open = 0; + sa1100_irda_shutdown(si); +err_startup: + sa1100_free_dma(si->txdma); +err_tx_dma: + sa1100_free_dma(si->rxdma); +err_rx_dma: + free_irq(dev->irq, dev); +err_irq: + MOD_DEC_USE_COUNT; + return err; +} + +static int sa1100_irda_stop(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + + disable_irq(dev->irq); + sa1100_irda_shutdown(si); + + /* + * If we have been doing DMA receive, make sure we + * tidy that up cleanly. + */ + if (si->rxskb) { + pci_unmap_single(NULL, si->rxbuf_dma, HPSIR_MAX_RXLEN, + PCI_DMA_FROMDEVICE); + dev_kfree_skb(si->rxskb); + si->rxskb = NULL; + } + + /* Stop IrLAP */ + if (si->irlap) { + irlap_close(si->irlap); + si->irlap = NULL; + } + + netif_stop_queue(dev); + si->open = 0; + + /* + * Free resources + */ + sa1100_free_dma(si->txdma); + sa1100_free_dma(si->rxdma); + free_irq(dev->irq, dev); + + sa1100_set_power(si, 0); + + MOD_DEC_USE_COUNT; + + return 0; +} + +static int sa1100_irda_init_iobuf(iobuff_t *io, int size) +{ + io->head = kmalloc(size, GFP_KERNEL | GFP_DMA); + if (io->head != NULL) { + io->truesize = size; + io->in_frame = FALSE; + io->state = OUTSIDE_FRAME; + io->data = io->head; + } + return io->head ? 0 : -ENOMEM; +} + +static int sa1100_irda_net_init(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + unsigned int baudrate_mask; + int err = -ENOMEM; + + si = kmalloc(sizeof(struct sa1100_irda), GFP_KERNEL); + if (!si) + goto out; + + memset(si, 0, sizeof(*si)); + + /* + * Initialise the HP-SIR buffers + */ + err = sa1100_irda_init_iobuf(&si->rx_buff, 14384); + if (err) + goto out; + err = sa1100_irda_init_iobuf(&si->tx_buff, 4000); + if (err) + goto out_free_rx; + + dev->priv = si; + dev->hard_start_xmit = sa1100_irda_hard_xmit; + dev->open = sa1100_irda_start; + dev->stop = sa1100_irda_stop; + dev->do_ioctl = sa1100_irda_ioctl; + dev->get_stats = sa1100_irda_stats; + + irda_device_setup(dev); + irda_init_max_qos_capabilies(&si->qos); + + /* + * We support original IRDA up to 115k2. (we don't currently + * support 4Mbps). Min Turn Time set to 1ms or greater. + */ + baudrate_mask = IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; + baudrate_mask |= IR_4000000 << 8; + si->qos.baud_rate.bits &= baudrate_mask; + si->qos.min_turn_time.bits = 7; + + irda_qos_bits_to_value(&si->qos); + + si->utcr4 = UTCR4_HPSIR; + if (tx_lpm) + si->utcr4 |= UTCR4_Z1_6us; + + /* + * Initially enable HP-SIR modulation, and ensure that the port + * is disabled. + */ + Ser2UTCR3 = 0; + Ser2UTCR4 = si->utcr4; + Ser2HSCR0 = HSCR0_UART; + +#ifdef CONFIG_PM + /* + * Power-Management is optional. + */ + si->pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, sa1100_irda_pmproc); + if (si->pmdev) + si->pmdev->data = dev; +#endif + + return 0; + + kfree(si->tx_buff.head); +out_free_rx: + kfree(si->rx_buff.head); +out: + kfree(si); + + return err; +} + +/* + * Remove all traces of this driver module from the kernel, so we can't be + * called. Note that the device has already been stopped, so we don't have + * to worry about interrupts or dma. + */ +static void sa1100_irda_net_uninit(struct net_device *dev) +{ + struct sa1100_irda *si = dev->priv; + + dev->hard_start_xmit = NULL; + dev->open = NULL; + dev->stop = NULL; + dev->do_ioctl = NULL; + dev->get_stats = NULL; + dev->priv = NULL; + + pm_unregister(si->pmdev); + + kfree(si->tx_buff.head); + kfree(si->rx_buff.head); + kfree(si); +} + +#ifdef MODULE +static +#endif +int __init sa1100_irda_init(void) +{ + struct net_device *dev; + int err; + + /* + * Limit power level a sensible range. + */ + if (power_level < 1) + power_level = 1; + if (power_level > 3) + power_level = 3; + + err = request_mem_region(__PREG(Ser2UTCR0), 0x24, "IrDA") ? 0 : -EBUSY; + if (err) + goto err_mem_1; + err = request_mem_region(__PREG(Ser2HSCR0), 0x1c, "IrDA") ? 0 : -EBUSY; + if (err) + goto err_mem_2; + err = request_mem_region(__PREG(Ser2HSCR2), 0x04, "IrDA") ? 0 : -EBUSY; + if (err) + goto err_mem_3; + + rtnl_lock(); + dev = dev_alloc("irda%d", &err); + if (dev) { + dev->irq = IRQ_Ser2ICP; + dev->init = sa1100_irda_net_init; + dev->uninit = sa1100_irda_net_uninit; + + err = register_netdevice(dev); + + if (err) + kfree(dev); + else + netdev = dev; + } + rtnl_unlock(); + + if (err) { + release_mem_region(__PREG(Ser2HSCR2), 0x04); +err_mem_3: + release_mem_region(__PREG(Ser2HSCR0), 0x1c); +err_mem_2: + release_mem_region(__PREG(Ser2UTCR0), 0x24); + } +err_mem_1: + return err; +} + +static void __exit sa1100_irda_exit(void) +{ + struct net_device *dev = netdev; + + netdev = NULL; + if (dev) { + rtnl_lock(); + unregister_netdevice(dev); + rtnl_unlock(); + } + + release_mem_region(__PREG(Ser2HSCR2), 0x04); + release_mem_region(__PREG(Ser2HSCR0), 0x1c); + release_mem_region(__PREG(Ser2UTCR0), 0x24); + + /* + * We now know that the netdevice is no longer in use, and all + * references to our driver have been removed. The only structure + * which may still be present is the netdevice, which will get + * cleaned up by net/core/dev.c + */ +} + +#ifdef MODULE +module_init(sa1100_irda_init); +module_exit(sa1100_irda_exit); +#endif + +MODULE_AUTHOR("Russell King "); +MODULE_DESCRIPTION("StrongARM SA1100 IrDA driver"); +MODULE_LICENSE("GPL"); +MODULE_PARM(power_level, "i"); +MODULE_PARM_DESC(power_level, "IrDA power level, 1 (low) to 3 (high)"); +MODULE_PARM(tx_lpm, "i"); +MODULE_PARM_DESC(tx_lpm, "Enable transmitter low power (1.6us) mode"); +EXPORT_NO_SYMBOLS; diff -u --recursive --new-file v2.4.13/linux/drivers/net/natsemi.c linux/drivers/net/natsemi.c --- v2.4.13/linux/drivers/net/natsemi.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/net/natsemi.c Thu Oct 25 14:01:51 2001 @@ -85,6 +85,15 @@ * use long for ee_addr (various) * print pointers properly (DaveM) * include asm/irq.h (?) + + version 1.0.11: + * check and reset if PHY errors appear (Adrian Sun) + * WoL cleanup (Tim Hockin) + * Magic number cleanup (Tim Hockin) + * Don't reload EEPROM on every reset (Tim Hockin) + * Save and restore EEPROM state across reset (Tim Hockin) + * MDIO Cleanup (Tim Hockin) + * Reformat register offsets/bits (jgarzik) TODO: * big endian support with CFG:BEM instead of cpu_to_le32 @@ -93,9 +102,8 @@ */ #define DRV_NAME "natsemi" -#define DRV_VERSION "1.07+LK1.0.10" -#define DRV_RELDATE "Oct 09, 2001" - +#define DRV_VERSION "1.07+LK1.0.11" +#define DRV_RELDATE "Oct 19, 2001" /* Updated to recommendations in pci-skeleton v2.03. */ @@ -106,7 +114,7 @@ c-help-name: National Semiconductor DP8381x series PCI Ethernet support c-help-symbol: CONFIG_NATSEMI c-help: This driver is for the National Semiconductor DP8381x series, -c-help: including the 83815 chip. +c-help: including the 8381[56] chips. c-help: More specific information and updates are available from c-help: http://www.scyld.com/network/natsemi.html */ @@ -114,10 +122,12 @@ /* The user-configurable values. These may be modified when a driver module is loaded.*/ -static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ +static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ + /* Maximum events (Rx packets, etc.) to handle at each interrupt. */ static int max_interrupt_work = 20; static int mtu; + /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). This chip uses a 512 element hash table based on the Ethernet CRC. */ static int multicast_filter_limit = 100; @@ -143,16 +153,17 @@ bonding and packet priority. There are no ill effects from too-large receive rings. */ #define TX_RING_SIZE 16 -#define TX_QUEUE_LEN 10 /* Limit ring entries actually used, min 4. */ -#define RX_RING_SIZE 32 +#define TX_QUEUE_LEN 10 /* Limit ring entries actually used, min 4. */ +#define RX_RING_SIZE 64 /* Operational parameters that usually are not changed. */ /* Time in jiffies before concluding the transmitter is hung. */ #define TX_TIMEOUT (2*HZ) #define NATSEMI_HW_TIMEOUT 400 +#define NATSEMI_TIMER_FREQ 3*HZ -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer. */ #if !defined(__OPTIMIZE__) #warning You must compile this file with the correct options! @@ -179,7 +190,7 @@ #include #include #include -#include /* Processor type for cache alignment. */ +#include /* Processor type for cache alignment. */ #include #include #include @@ -308,11 +319,11 @@ const char *name; unsigned long flags; } natsemi_pci_info[] __devinitdata = { - { "NatSemi DP83815", PCI_IOTYPE }, + { "NatSemi DP8381[56]", PCI_IOTYPE }, }; static struct pci_device_id natsemi_pci_tbl[] __devinitdata = { - { 0x100B, 0x0020, PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_83815, PCI_ANY_ID, PCI_ANY_ID, }, { 0, }, }; MODULE_DEVICE_TABLE(pci, natsemi_pci_tbl); @@ -323,88 +334,222 @@ device. */ enum register_offsets { - ChipCmd=0x00, ChipConfig=0x04, EECtrl=0x08, PCIBusCfg=0x0C, - IntrStatus=0x10, IntrMask=0x14, IntrEnable=0x18, - TxRingPtr=0x20, TxConfig=0x24, - RxRingPtr=0x30, RxConfig=0x34, ClkRun=0x3C, - WOLCmd=0x40, PauseCmd=0x44, RxFilterAddr=0x48, RxFilterData=0x4C, - BootRomAddr=0x50, BootRomData=0x54, SiliconRev=0x58, StatsCtrl=0x5C, - StatsData=0x60, RxPktErrs=0x60, RxMissed=0x68, RxCRCErrs=0x64, - BasicControl=0x80, BasicStatus=0x84, - AnegAdv=0x90, AnegPeer = 0x94, PhyStatus=0xC0, MIntrCtrl=0xC4, - MIntrStatus=0xC8, PhyCtrl=0xE4, + ChipCmd = 0x00, + ChipConfig = 0x04, + EECtrl = 0x08, + PCIBusCfg = 0x0C, + IntrStatus = 0x10, + IntrMask = 0x14, + IntrEnable = 0x18, + TxRingPtr = 0x20, + TxConfig = 0x24, + RxRingPtr = 0x30, + RxConfig = 0x34, + ClkRun = 0x3C, + WOLCmd = 0x40, + PauseCmd = 0x44, + RxFilterAddr = 0x48, + RxFilterData = 0x4C, + BootRomAddr = 0x50, + BootRomData = 0x54, + SiliconRev = 0x58, + StatsCtrl = 0x5C, + StatsData = 0x60, + RxPktErrs = 0x60, + RxMissed = 0x68, + RxCRCErrs = 0x64, + BasicControl = 0x80, + BasicStatus = 0x84, + AnegAdv = 0x90, + AnegPeer = 0x94, + PhyStatus = 0xC0, + MIntrCtrl = 0xC4, + MIntrStatus = 0xC8, + PhyCtrl = 0xE4, /* These are from the spec, around page 78... on a separate table. * The meaning of these registers depend on the value of PGSEL. */ - PGSEL=0xCC, PMDCSR=0xE4, TSTDAT=0xFC, DSPCFG=0xF4, SDCFG=0x8C + PGSEL = 0xCC, + PMDCSR = 0xE4, + TSTDAT = 0xFC, + DSPCFG = 0xF4, + SDCFG = 0xF8 }; +/* the values for the 'magic' registers above (PGSEL=1) */ +#define PMDCSR_VAL 0x189C +#define TSTDAT_VAL 0x0 +#define DSPCFG_VAL 0x5040 +#define SDCFG_VAL 0x008c /* misc PCI space registers */ -enum PCISpaceRegs { - PCIPM=0x44, +enum pci_register_offsets { + PCIPM = 0x44, +}; + +enum ChipCmd_bits { + ChipReset = 0x100, + RxReset = 0x20, + TxReset = 0x10, + RxOff = 0x08, + RxOn = 0x04, + TxOff = 0x02, + TxOn = 0x01, +}; + +enum ChipConfig_bits { + CfgPhyDis = 0x200, + CfgPhyRst = 0x400, + CfgAnegEnable = 0x2000, + CfgAneg100 = 0x4000, + CfgAnegFull = 0x8000, + CfgAnegDone = 0x8000000, + CfgFullDuplex = 0x20000000, + CfgSpeed100 = 0x40000000, + CfgLink = 0x80000000, }; -/* Bit in ChipCmd. */ -enum ChipCmdBits { - ChipReset=0x100, RxReset=0x20, TxReset=0x10, RxOff=0x08, RxOn=0x04, - TxOff=0x02, TxOn=0x01, +enum EECtrl_bits { + EE_ShiftClk = 0x04, + EE_DataIn = 0x01, + EE_ChipSelect = 0x08, + EE_DataOut = 0x02, }; -enum PCIBusCfgBits { - EepromReload=0x4, +enum PCIBusCfg_bits { + EepromReload = 0x4, }; /* Bits in the interrupt status/mask registers. */ -enum intr_status_bits { - IntrRxDone=0x0001, IntrRxIntr=0x0002, IntrRxErr=0x0004, IntrRxEarly=0x0008, - IntrRxIdle=0x0010, IntrRxOverrun=0x0020, - IntrTxDone=0x0040, IntrTxIntr=0x0080, IntrTxErr=0x0100, - IntrTxIdle=0x0200, IntrTxUnderrun=0x0400, - StatsMax=0x0800, LinkChange=0x4000, - WOLPkt=0x2000, - RxResetDone=0x1000000, TxResetDone=0x2000000, - IntrPCIErr=0x00f00000, - IntrNormalSummary=0x025f, IntrAbnormalSummary=0xCD20, +enum IntrStatus_bits { + IntrRxDone = 0x0001, + IntrRxIntr = 0x0002, + IntrRxErr = 0x0004, + IntrRxEarly = 0x0008, + IntrRxIdle = 0x0010, + IntrRxOverrun = 0x0020, + IntrTxDone = 0x0040, + IntrTxIntr = 0x0080, + IntrTxErr = 0x0100, + IntrTxIdle = 0x0200, + IntrTxUnderrun = 0x0400, + StatsMax = 0x0800, + SWInt = 0x1000, + WOLPkt = 0x2000, + LinkChange = 0x4000, + IntrHighBits = 0x8000, + RxStatusFIFOOver = 0x10000, + IntrPCIErr = 0xf00000, + RxResetDone = 0x1000000, + TxResetDone = 0x2000000, + IntrAbnormalSummary = 0xCD20, }; +/* + * Default Interrupts: + * Rx OK, Rx Packet Error, Rx Overrun, + * Tx OK, Tx Packet Error, Tx Underrun, + * MIB Service, Phy Interrupt, High Bits, + * Rx Status FIFO overrun, + * Received Target Abort, Received Master Abort, + * Signalled System Error, Received Parity Error + */ #define DEFAULT_INTR 0x00f1cd65 -/* Bits in the RxMode register. */ -enum rx_mode_bits { - AcceptErr=0x20, AcceptRunt=0x10, - AcceptBroadcast=0xC0000000, - AcceptMulticast=0x00200000, AcceptAllMulticast=0x20000000, - AcceptAllPhys=0x10000000, AcceptMyPhys=0x08000000, -}; - -/* Bits in WOLCmd register. */ -enum wol_bits { - WakePhy=0x1, WakeUnicast=0x2, WakeMulticast=0x4, WakeBroadcast=0x8, - WakeArp=0x10, WakePMatch0=0x20, WakePMatch1=0x40, WakePMatch2=0x80, - WakePMatch3=0x100, WakeMagic=0x200, WakeMagicSecure=0x400, - SecureHack=0x100000, WokePhy=0x400000, WokeUnicast=0x800000, - WokeMulticast=0x1000000, WokeBroadcast=0x2000000, WokeArp=0x4000000, - WokePMatch0=0x8000000, WokePMatch1=0x10000000, WokePMatch2=0x20000000, - WokePMatch3=0x40000000, WokeMagic=0x80000000, WakeOptsSummary=0x7ff -}; - -enum aneg_bits { - Aneg10BaseT=0x20, Aneg10BaseTFull=0x40, - Aneg100BaseT=0x80, Aneg100BaseTFull=0x100, -}; - -enum config_bits { - CfgPhyDis=0x200, CfgPhyRst=0x400, CfgAnegEnable=0x2000, - CfgAneg100=0x4000, CfgAnegFull=0x8000, CfgAnegDone=0x8000000, - CfgFullDuplex=0x20000000, - CfgSpeed100=0x40000000, CfgLink=0x80000000, -}; - -enum bmcr_bits { - BMCRDuplex=0x100, BMCRAnegRestart=0x200, BMCRAnegEnable=0x1000, - BMCRSpeed=0x2000, BMCRPhyReset=0x8000, +enum TxConfig_bits { + TxDrthMask = 0x3f, + TxFlthMask = 0x3f00, + TxMxdmaMask = 0x700000, + TxMxdma_512 = 0x0, + TxMxdma_4 = 0x100000, + TxMxdma_8 = 0x200000, + TxMxdma_16 = 0x300000, + TxMxdma_32 = 0x400000, + TxMxdma_64 = 0x500000, + TxMxdma_128 = 0x600000, + TxMxdma_256 = 0x700000, + TxCollRetry = 0x800000, + TxAutoPad = 0x10000000, + TxMacLoop = 0x20000000, + TxHeartIgn = 0x40000000, + TxCarrierIgn = 0x80000000 +}; + +enum RxConfig_bits { + RxDrthMask = 0x3e, + RxMxdmaMask = 0x700000, + RxMxdma_512 = 0x0, + RxMxdma_4 = 0x100000, + RxMxdma_8 = 0x200000, + RxMxdma_16 = 0x300000, + RxMxdma_32 = 0x400000, + RxMxdma_64 = 0x500000, + RxMxdma_128 = 0x600000, + RxMxdma_256 = 0x700000, + RxAcceptLong = 0x8000000, + RxAcceptTx = 0x10000000, + RxAcceptRunt = 0x40000000, + RxAcceptErr = 0x80000000 +}; + +enum ClkRun_bits { + PMEEnable = 0x100, + PMEStatus = 0x8000, +}; + +enum WolCmd_bits { + WakePhy = 0x1, + WakeUnicast = 0x2, + WakeMulticast = 0x4, + WakeBroadcast = 0x8, + WakeArp = 0x10, + WakePMatch0 = 0x20, + WakePMatch1 = 0x40, + WakePMatch2 = 0x80, + WakePMatch3 = 0x100, + WakeMagic = 0x200, + WakeMagicSecure = 0x400, + SecureHack = 0x100000, + WokePhy = 0x400000, + WokeUnicast = 0x800000, + WokeMulticast = 0x1000000, + WokeBroadcast = 0x2000000, + WokeArp = 0x4000000, + WokePMatch0 = 0x8000000, + WokePMatch1 = 0x10000000, + WokePMatch2 = 0x20000000, + WokePMatch3 = 0x40000000, + WokeMagic = 0x80000000, + WakeOptsSummary = 0x7ff }; +enum RxFilterAddr_bits { + RFCRAddressMask = 0x3ff, + AcceptMulticast = 0x00200000, + AcceptMyPhys = 0x08000000, + AcceptAllPhys = 0x10000000, + AcceptAllMulticast = 0x20000000, + AcceptBroadcast = 0x40000000, + RxFilterEnable = 0x80000000 +}; + +enum StatsCtrl_bits { + StatsWarn = 0x1, + StatsFreeze = 0x2, + StatsClear = 0x4, + StatsStrobe = 0x8, +}; + +enum MIntrCtrl_bits { + MICRIntEn = 0x2, +}; + +enum PhyCtrl_bits { + PhyAddrMask = 0xf, +}; + +#define SRR_REV_C 0x0302 +#define SRR_REV_D 0x0403 + /* The Rx and Tx buffer descriptors. */ /* Note that using only 32 bit fields simplifies conversion to big-endian architectures. */ @@ -418,8 +563,19 @@ /* Bits in network_desc.status */ enum desc_status_bits { DescOwn=0x80000000, DescMore=0x40000000, DescIntr=0x20000000, - DescNoCRC=0x10000000, - DescPktOK=0x08000000, RxTooLong=0x00400000, + DescNoCRC=0x10000000, DescPktOK=0x08000000, + DescSizeMask=0xfff, + + DescTxAbort=0x04000000, DescTxFIFO=0x02000000, + DescTxCarrier=0x01000000, DescTxDefer=0x00800000, + DescTxExcDefer=0x00400000, DescTxOOWCol=0x00200000, + DescTxExcColl=0x00100000, DescTxCollCount=0x000f0000, + + DescRxAbort=0x04000000, DescRxOver=0x02000000, + DescRxDest=0x01800000, DescRxLong=0x00400000, + DescRxRunt=0x00200000, DescRxInvalid=0x00100000, + DescRxCRC=0x00080000, DescRxAlign=0x00040000, + DescRxLoop=0x00020000, DesRxColl=0x00010000, }; struct netdev_private { @@ -450,17 +606,21 @@ u32 tx_config, rx_config; /* original contents of ClkRun register */ u32 SavedClkRun; + /* silicon revision */ + u32 srr; /* MII transceiver section. */ - u16 advertising; /* NWay media advertisement */ + u16 advertising; /* NWay media advertisement */ unsigned int iosize; spinlock_t lock; }; -static int eeprom_read(long ioaddr, int location); -static int mdio_read(struct net_device *dev, int phy_id, int location); +static int eeprom_read(long ioaddr, int location); +static int mdio_read(struct net_device *dev, int phy_id, int reg); +static void mdio_write(struct net_device *dev, int phy_id, int reg, u16 data); static void natsemi_reset(struct net_device *dev); +static void natsemi_reload_eeprom(struct net_device *dev); static void natsemi_stop_rxtx(struct net_device *dev); -static int netdev_open(struct net_device *dev); +static int netdev_open(struct net_device *dev); static void check_link(struct net_device *dev); static void netdev_timer(unsigned long data); static void tx_timeout(struct net_device *dev); @@ -469,7 +629,7 @@ static void drain_ring(struct net_device *dev); static void free_ring(struct net_device *dev); static void init_registers(struct net_device *dev); -static int start_tx(struct sk_buff *skb, struct net_device *dev); +static int start_tx(struct sk_buff *skb, struct net_device *dev); static void intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static void netdev_error(struct net_device *dev, int intr_status); static void netdev_rx(struct net_device *dev); @@ -486,7 +646,7 @@ static int netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd); static int netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd); static void enable_wol_mode(struct net_device *dev, int enable_intr); -static int netdev_close(struct net_device *dev); +static int netdev_close(struct net_device *dev); static int __devinit natsemi_probe1 (struct pci_dev *pdev, @@ -516,9 +676,9 @@ * to be brought to D0 in this manner. */ pci_read_config_dword(pdev, PCIPM, &tmp); - if (tmp & (0x03|0x100)) { + if (tmp & PCI_PM_CTRL_STATE_MASK) { /* D0 state, disable PME assertion */ - u32 newtmp = tmp & ~(0x03|0x100); + u32 newtmp = tmp & ~PCI_PM_CTRL_STATE_MASK; pci_write_config_dword(pdev, PCIPM, newtmp); } @@ -571,7 +731,9 @@ spin_lock_init(&np->lock); /* Reset the chip to erase previous misconfiguration. */ + natsemi_reload_eeprom(dev); natsemi_reset(dev); + option = find_cnt < MAX_UNITS ? options[find_cnt] : 0; if (dev->mem_start) option = dev->mem_start; @@ -616,20 +778,23 @@ printk("%2.2x:", dev->dev_addr[i]); printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], irq); - np->advertising = mdio_read(dev, 1, 4); + np->advertising = mdio_read(dev, 1, MII_ADVERTISE); if ((readl(ioaddr + ChipConfig) & 0xe000) != 0xe000) { u32 chip_config = readl(ioaddr + ChipConfig); printk(KERN_INFO "%s: Transceiver default autonegotiation %s " "10%s %s duplex.\n", dev->name, - chip_config & 0x2000 ? "enabled, advertise" : "disabled, force", - chip_config & 0x4000 ? "0" : "", - chip_config & 0x8000 ? "full" : "half"); + chip_config & CfgAnegEnable ? "enabled, advertise" : "disabled, force", + chip_config & CfgAneg100 ? "0" : "", + chip_config & CfgAnegFull ? "full" : "half"); } printk(KERN_INFO "%s: Transceiver status 0x%4.4x advertising %4.4x.\n", - dev->name, (int)readl(ioaddr + BasicStatus), + dev->name, (int)mdio_read(dev, 1, MII_BMSR), np->advertising); + /* save the silicon revision for later querying */ + np->srr = readl(ioaddr + SiliconRev); + return 0; } @@ -646,9 +811,6 @@ */ #define eeprom_delay(ee_addr) readl(ee_addr) -enum EEPROM_Ctrl_Bits { - EE_ShiftClk=0x04, EE_DataIn=0x01, EE_ChipSelect=0x08, EE_DataOut=0x02, -}; #define EE_Write0 (EE_ChipSelect) #define EE_Write1 (EE_ChipSelect | EE_DataIn) @@ -694,18 +856,67 @@ The 83815 series has an internal transceiver, and we present the management registers as if they were MII connected. */ -static int mdio_read(struct net_device *dev, int phy_id, int location) +static int mdio_read(struct net_device *dev, int phy_id, int reg) { - if (phy_id == 1 && location < 32) - return readl(dev->base_addr+BasicControl+(location<<2))&0xffff; + if (phy_id == 1 && reg < 32) + return readl(dev->base_addr+BasicControl+(reg<<2))&0xffff; else return 0xffff; } +static void mdio_write(struct net_device *dev, int phy_id, int reg, u16 data) +{ + struct netdev_private *np = dev->priv; + if (phy_id == 1 && reg < 32) { + writew(data, dev->base_addr+BasicControl+(reg<<2)); + switch (reg) { + case MII_ADVERTISE: np->advertising = data; break; + } + } +} + +/* CFG bits [13:16] [18:23] */ +#define CFG_RESET_SAVE 0xfde000 +/* WCSR bits [0:4] [9:10] */ +#define WCSR_RESET_SAVE 0x61f +/* RFCR bits [20] [22] [27:31] */ +#define RFCR_RESET_SAVE 0xf8500000; + static void natsemi_reset(struct net_device *dev) { int i; + u32 cfg; + u32 wcsr; + u32 rfcr; + u16 pmatch[3]; + u16 sopass[3]; + + /* + * Resetting the chip causes some registers to be lost. + * Natsemi suggests NOT reloading the EEPROM while live, so instead + * we save the state that would have been loaded from EEPROM + * on a normal power-up (see the spec EEPROM map). This assumes + * whoever calls this will follow up with init_registers() eventually. + */ + /* CFG */ + cfg = readl(dev->base_addr + ChipConfig) & CFG_RESET_SAVE; + /* WCSR */ + wcsr = readl(dev->base_addr + WOLCmd) & WCSR_RESET_SAVE; + /* RFCR */ + rfcr = readl(dev->base_addr + RxFilterAddr) & RFCR_RESET_SAVE; + /* PMATCH */ + for (i = 0; i < 3; i++) { + writel(i*2, dev->base_addr + RxFilterAddr); + pmatch[i] = readw(dev->base_addr + RxFilterData); + } + /* SOPAS */ + for (i = 0; i < 3; i++) { + writel(0xa+(i*2), dev->base_addr + RxFilterAddr); + sopass[i] = readw(dev->base_addr + RxFilterData); + } + + /* now whack the chip */ writel(ChipReset, dev->base_addr + ChipCmd); for (i=0;ibase_addr + ChipCmd) & ChipReset)) @@ -720,6 +931,32 @@ dev->name, i*5); } + /* restore CFG */ + cfg |= readl(dev->base_addr + ChipConfig) & ~CFG_RESET_SAVE; + writel(cfg, dev->base_addr + ChipConfig); + /* restore WCSR */ + wcsr |= readl(dev->base_addr + WOLCmd) & ~WCSR_RESET_SAVE; + writel(wcsr, dev->base_addr + WOLCmd); + /* read RFCR */ + rfcr |= readl(dev->base_addr + RxFilterAddr) & ~RFCR_RESET_SAVE; + /* restore PMATCH */ + for (i = 0; i < 3; i++) { + writel(i*2, dev->base_addr + RxFilterAddr); + writew(pmatch[i], dev->base_addr + RxFilterData); + } + for (i = 0; i < 3; i++) { + writel(0xa+(i*2), dev->base_addr + RxFilterAddr); + writew(sopass[i], dev->base_addr + RxFilterData); + } + /* restore RFCR */ + writel(rfcr, dev->base_addr + RxFilterAddr); + +} + +static void natsemi_reload_eeprom(struct net_device *dev) +{ + int i; + writel(EepromReload, dev->base_addr + PCIBusCfg); for (i=0;ibase_addr + PCIBusCfg) & EepromReload)) @@ -788,9 +1025,9 @@ /* Set the timer to check for link beat. */ init_timer(&np->timer); - np->timer.expires = jiffies + 3*HZ; + np->timer.expires = jiffies + NATSEMI_TIMER_FREQ; np->timer.data = (unsigned long)dev; - np->timer.function = &netdev_timer; /* timer handler */ + np->timer.function = &netdev_timer; /* timer handler */ add_timer(&np->timer); return 0; @@ -803,7 +1040,7 @@ int duplex; int chipcfg = readl(ioaddr + ChipConfig); - if(!(chipcfg & 0x80000000)) { + if(!(chipcfg & CfgLink)) { if (netif_carrier_ok(dev)) { if (debug) printk(KERN_INFO "%s: no link. Disabling watchdog.\n", @@ -819,20 +1056,20 @@ netif_carrier_on(dev); } - duplex = np->full_duplex || (chipcfg & 0x20000000 ? 1 : 0); + duplex = np->full_duplex || (chipcfg & CfgFullDuplex ? 1 : 0); /* if duplex is set then bit 28 must be set, too */ - if (duplex ^ !!(np->rx_config & 0x10000000)) { + if (duplex ^ !!(np->rx_config & RxAcceptTx)) { if (debug) printk(KERN_INFO "%s: Setting %s-duplex based on negotiated link" " capability.\n", dev->name, duplex ? "full" : "half"); if (duplex) { - np->rx_config |= 0x10000000; - np->tx_config |= 0xC0000000; + np->rx_config |= RxAcceptTx; + np->tx_config |= TxCarrierIgn | TxHeartIgn; } else { - np->rx_config &= ~0x10000000; - np->tx_config &= ~0xC0000000; + np->rx_config &= ~RxAcceptTx; + np->tx_config &= ~(TxCarrierIgn | TxHeartIgn); } writel(np->tx_config, ioaddr + TxConfig); writel(np->rx_config, ioaddr + RxConfig); @@ -845,9 +1082,21 @@ long ioaddr = dev->base_addr; int i; + /* save the silicon revision for later */ if (debug > 4) printk(KERN_DEBUG "%s: found silicon revision %xh.\n", - dev->name, readl(ioaddr + SiliconRev)); + dev->name, np->srr); + + for (i=0;ibase_addr + ChipConfig) & CfgAnegDone) + break; + udelay(10); + } + if (i==NATSEMI_HW_TIMEOUT && debug) { + printk(KERN_INFO + "%s: autonegotiation did not complete in %d usec.\n", + dev->name, i*10); + } /* On page 78 of the spec, they recommend some settings for "optimum performance" to be done in sequence. These settings optimize some @@ -856,26 +1105,26 @@ Kennedy) recommends always setting them. If you don't, you get errors on some autonegotiations that make the device unusable. */ - writew(0x0001, ioaddr + PGSEL); - writew(0x189C, ioaddr + PMDCSR); - writew(0x0000, ioaddr + TSTDAT); - writew(0x5040, ioaddr + DSPCFG); - writew(0x008C, ioaddr + SDCFG); - writew(0x0000, ioaddr + PGSEL); + writew(1, ioaddr + PGSEL); + writew(PMDCSR_VAL, ioaddr + PMDCSR); + writew(TSTDAT_VAL, ioaddr + TSTDAT); + writew(DSPCFG_VAL, ioaddr + DSPCFG); + writew(SDCFG_VAL, ioaddr + SDCFG); + writew(0, ioaddr + PGSEL); /* Enable PHY Specific event based interrupts. Link state change and Auto-Negotiation Completion are among the affected. + Read the intr status to clear it (needed for wake events). */ - writew(0x0002, ioaddr + MIntrCtrl); + readw(ioaddr + MIntrStatus); + writew(MICRIntEn, ioaddr + MIntrCtrl); - writel(np->ring_dma, ioaddr + RxRingPtr); - writel(np->ring_dma + RX_RING_SIZE * sizeof(struct netdev_desc), ioaddr + TxRingPtr); + /* clear any interrupts that are pending, such as wake events */ + readl(ioaddr + IntrStatus); - for (i = 0; i < ETH_ALEN; i += 2) { - writel(i, ioaddr + RxFilterAddr); - writew(dev->dev_addr[i] + (dev->dev_addr[i+1] << 8), - ioaddr + RxFilterData); - } + writel(np->ring_dma, ioaddr + RxRingPtr); + writel(np->ring_dma + RX_RING_SIZE * sizeof(struct netdev_desc), + ioaddr + TxRingPtr); /* Initialize other registers. * Configure the PCI bus bursts and FIFO thresholds. @@ -891,12 +1140,13 @@ * ECRETRY=1 * ATP=1 */ - np->tx_config = 0x10f01002; + np->tx_config = TxAutoPad | TxCollRetry | TxMxdma_256 | (0x1002); + writel(np->tx_config, ioaddr + TxConfig); + /* DRTH 0x10: start copying to memory if 128 bytes are in the fifo * MXDMA 0: up to 256 byte bursts */ - np->rx_config = 0x700020; - writel(np->tx_config, ioaddr + TxConfig); + np->rx_config = RxMxdma_256 | 0x20; writel(np->rx_config, ioaddr + RxConfig); /* Disable PME: @@ -906,24 +1156,37 @@ * With PME set the chip will scan incoming packets but * nothing will be written to memory. */ np->SavedClkRun = readl(ioaddr + ClkRun); - writel(np->SavedClkRun & ~0x100, ioaddr + ClkRun); + writel(np->SavedClkRun & ~PMEEnable, ioaddr + ClkRun); + if (np->SavedClkRun & PMEStatus) { + printk(KERN_NOTICE "%s: Wake-up event %8.8x\n", + dev->name, readl(ioaddr + WOLCmd)); + } check_link(dev); __set_rx_mode(dev); /* Enable interrupts by setting the interrupt mask. */ - writel(DEFAULT_INTR, ioaddr + IntrMask); + writel(DEFAULT_INTR, ioaddr + IntrMask); writel(1, ioaddr + IntrEnable); writel(RxOn | TxOn, ioaddr + ChipCmd); - writel(4, ioaddr + StatsCtrl); /* Clear Stats */ + writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ } +/* + * The frequency on this has been increased because of a nasty little problem. + * It seems that a reference set for this chip went out with incorrect info, + * and there exist boards that aren't quite right. An unexpected voltage drop + * can cause the PHY to get itself in a weird state (basically reset..). + * NOTE: this only seems to affect revC chips. + */ static void netdev_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; struct netdev_private *np = dev->priv; - int next_tick = 60*HZ; + int next_tick = 5*HZ; + long ioaddr = dev->base_addr; + u16 dspcfg; if (debug > 3) { /* DO NOT read the IntrStatus register, @@ -932,11 +1195,32 @@ printk(KERN_DEBUG "%s: Media selection timer tick.\n", dev->name); } - spin_lock_irq(&np->lock); - check_link(dev); - spin_unlock_irq(&np->lock); - np->timer.expires = jiffies + next_tick; - add_timer(&np->timer); + + /* check for a nasty random phy-reset - use dspcfg as a flag */ + writew(1, ioaddr+PGSEL); + dspcfg = readw(ioaddr+DSPCFG); + writew(0, ioaddr+PGSEL); + if (dspcfg != DSPCFG_VAL) { + if (!netif_queue_stopped(dev)) { + printk(KERN_INFO + "%s: possible phy reset: re-initializing\n", + dev->name); + disable_irq(dev->irq); + spin_lock_irq(&np->lock); + init_registers(dev); + spin_unlock_irq(&np->lock); + enable_irq(dev->irq); + } else { + /* hurry back */ + next_tick = HZ; + } + } else { + /* init_registers() calls check_link() for the above case */ + spin_lock_irq(&np->lock); + check_link(dev); + spin_unlock_irq(&np->lock); + } + mod_timer(&np->timer, jiffies + next_tick); } static void dump_ring(struct net_device *dev) @@ -946,15 +1230,18 @@ if (debug > 2) { int i; printk(KERN_DEBUG " Tx ring at %p:\n", np->tx_ring); - for (i = 0; i < TX_RING_SIZE; i++) + for (i = 0; i < TX_RING_SIZE; i++) { printk(KERN_DEBUG " #%d desc. %8.8x %8.8x %8.8x.\n", i, np->tx_ring[i].next_desc, - np->tx_ring[i].cmd_status, np->tx_ring[i].addr); + np->tx_ring[i].cmd_status, + np->tx_ring[i].addr); + } printk(KERN_DEBUG " Rx ring %p:\n", np->rx_ring); for (i = 0; i < RX_RING_SIZE; i++) { printk(KERN_DEBUG " #%d desc. %8.8x %8.8x %8.8x.\n", i, np->rx_ring[i].next_desc, - np->rx_ring[i].cmd_status, np->rx_ring[i].addr); + np->rx_ring[i].cmd_status, + np->rx_ring[i].addr); } } } @@ -964,12 +1251,12 @@ struct netdev_private *np = dev->priv; long ioaddr = dev->base_addr; - disable_irq(dev->irq); spin_lock_irq(&np->lock); if (netif_device_present(dev)) { printk(KERN_WARNING "%s: Transmit timed out, status %8.8x," - " resetting...\n", dev->name, readl(ioaddr + IntrStatus)); + " resetting...\n", + dev->name, readl(ioaddr + IntrStatus)); dump_ring(dev); natsemi_reset(dev); @@ -977,8 +1264,9 @@ init_ring(dev); init_registers(dev); } else { - printk(KERN_WARNING "%s: tx_timeout while in suspended state?\n", - dev->name); + printk(KERN_WARNING + "%s: tx_timeout while in suspended state?\n", + dev->name); } spin_unlock_irq(&np->lock); enable_irq(dev->irq); @@ -1019,7 +1307,7 @@ for (i = 0; i < RX_RING_SIZE; i++) { np->rx_ring[i].next_desc = cpu_to_le32(np->ring_dma +sizeof(struct netdev_desc) - *((i+1)%RX_RING_SIZE)); + *((i+1)%RX_RING_SIZE)); np->rx_ring[i].cmd_status = cpu_to_le32(DescOwn); np->rx_skbuff[i] = NULL; } @@ -1107,7 +1395,8 @@ if (netif_device_present(dev)) { np->tx_ring[entry].cmd_status = cpu_to_le32(DescOwn | skb->len); - /* StrongARM: Explicitly cache flush np->tx_ring and skb->data,skb->len. */ + /* StrongARM: Explicitly cache flush np->tx_ring and + * skb->data,skb->len. */ wmb(); np->cur_tx++; if (np->cur_tx - np->dirty_tx >= TX_QUEUE_LEN - 1) { @@ -1148,15 +1437,19 @@ printk(KERN_DEBUG "%s: tx frame #%d finished with status %8.8xh.\n", dev->name, np->dirty_tx, le32_to_cpu(np->tx_ring[entry].cmd_status)); - if (np->tx_ring[entry].cmd_status & cpu_to_le32(0x08000000)) { + if (np->tx_ring[entry].cmd_status & cpu_to_le32(DescPktOK)) { np->stats.tx_packets++; np->stats.tx_bytes += np->tx_skbuff[entry]->len; - } else { /* Various Tx errors */ + } else { /* Various Tx errors */ int tx_status = le32_to_cpu(np->tx_ring[entry].cmd_status); - if (tx_status & 0x04010000) np->stats.tx_aborted_errors++; - if (tx_status & 0x02000000) np->stats.tx_fifo_errors++; - if (tx_status & 0x01000000) np->stats.tx_carrier_errors++; - if (tx_status & 0x00200000) np->stats.tx_window_errors++; + if (tx_status & (DescTxAbort|DescTxExcColl)) + np->stats.tx_aborted_errors++; + if (tx_status & DescTxFIFO) + np->stats.tx_fifo_errors++; + if (tx_status & DescTxCarrier) + np->stats.tx_carrier_errors++; + if (tx_status & DescTxOOWCol) + np->stats.tx_window_errors++; np->stats.tx_errors++; } pci_unmap_single(np->pci_dev,np->tx_dma[entry], @@ -1219,7 +1512,7 @@ } } while (1); - if (debug > 3) + if (debug > 4) printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name); } @@ -1240,7 +1533,7 @@ entry, desc_status); if (--boguscnt < 0) break; - if ((desc_status & (DescMore|DescPktOK|RxTooLong)) != DescPktOK) { + if ((desc_status & (DescMore|DescPktOK|DescRxLong)) != DescPktOK) { if (desc_status & DescMore) { printk(KERN_WARNING "%s: Oversized(?) Ethernet frame spanned " "multiple buffers, entry %#x status %x.\n", @@ -1252,14 +1545,19 @@ printk(KERN_DEBUG " netdev_rx() Rx error was %8.8x.\n", desc_status); np->stats.rx_errors++; - if (desc_status & 0x06000000) np->stats.rx_over_errors++; - if (desc_status & 0x00600000) np->stats.rx_length_errors++; - if (desc_status & 0x00140000) np->stats.rx_frame_errors++; - if (desc_status & 0x00080000) np->stats.rx_crc_errors++; + if (desc_status & (DescRxAbort|DescRxOver)) + np->stats.rx_over_errors++; + if (desc_status & (DescRxLong|DescRxRunt)) + np->stats.rx_length_errors++; + if (desc_status & (DescRxInvalid|DescRxAlign)) + np->stats.rx_frame_errors++; + if (desc_status & DescRxCRC) + np->stats.rx_crc_errors++; } } else { struct sk_buff *skb; - int pkt_len = (desc_status & 0x0fff) - 4; /* Omit CRC size. */ + /* Omit CRC size. */ + int pkt_len = (desc_status & DescSizeMask) - 4; /* Check if the packet is long enough to accept without copying to a minimally-sized skbuff. */ if (pkt_len < rx_copybreak @@ -1324,10 +1622,11 @@ spin_lock(&np->lock); if (intr_status & LinkChange) { - printk(KERN_NOTICE "%s: Link changed: Autonegotiation advertising" - " %4.4x partner %4.4x.\n", dev->name, - (int)readl(ioaddr + AnegAdv), - (int)readl(ioaddr + AnegPeer)); + printk(KERN_NOTICE + "%s: Link changed: Autonegotiation advertising" + " %4.4x partner %4.4x.\n", dev->name, + (int)mdio_read(dev, 1, MII_ADVERTISE), + (int)mdio_read(dev, 1, MII_LPA)); /* read MII int status to clear the flag */ readw(ioaddr + MIntrStatus); check_link(dev); @@ -1336,7 +1635,7 @@ __get_stats(dev); } if (intr_status & IntrTxUnderrun) { - if ((np->tx_config & 0x3f) < 62) + if ((np->tx_config & TxDrthMask) < 62) np->tx_config += 2; if (debug > 2) printk(KERN_NOTICE "%s: increasing Tx theshold, new tx cfg %8.8xh.\n", @@ -1348,12 +1647,15 @@ printk(KERN_NOTICE "%s: Link wake-up event %8.8x\n", dev->name, wol_status); } - if ((intr_status & ~(LinkChange|StatsMax|RxResetDone|TxResetDone|0xA7ff)) - && debug) - printk(KERN_ERR "%s: Something Wicked happened! %4.4x.\n", - dev->name, intr_status); + if (intr_status & RxStatusFIFOOver && debug) { + printk(KERN_NOTICE "%s: Rx status FIFO overrun\n", dev->name); + } /* Hmmmmm, it's not clear how to recover from PCI faults. */ if (intr_status & IntrPCIErr) { + if (debug) { + printk(KERN_NOTICE "%s: PCI error %08x\n", dev->name, + intr_status & IntrPCIErr); + } np->stats.tx_fifo_errors++; np->stats.rx_fifo_errors++; } @@ -1453,11 +1755,12 @@ if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ /* Unconditionally log net taps. */ printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name); - rx_mode = AcceptBroadcast | AcceptAllMulticast | AcceptAllPhys - | AcceptMyPhys; + rx_mode = RxFilterEnable | AcceptBroadcast + | AcceptAllMulticast | AcceptAllPhys | AcceptMyPhys; } else if ((dev->mc_count > multicast_filter_limit) || (dev->flags & IFF_ALLMULTI)) { - rx_mode = AcceptBroadcast | AcceptAllMulticast | AcceptMyPhys; + rx_mode = RxFilterEnable | AcceptBroadcast + | AcceptAllMulticast | AcceptMyPhys; } else { struct dev_mc_list *mclist; int i; @@ -1467,10 +1770,12 @@ set_bit_le(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x1ff, mc_filter); } - rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys; + rx_mode = RxFilterEnable | AcceptBroadcast + | AcceptMulticast | AcceptMyPhys; for (i = 0; i < 64; i += 2) { writew(HASH_TABLE + i, ioaddr + RxFilterAddr); - writew((mc_filter[i+1]<<8) + mc_filter[i], ioaddr + RxFilterData); + writew((mc_filter[i+1]<<8) + mc_filter[i], + ioaddr + RxFilterData); } } writel(rx_mode, ioaddr + RxFilterAddr); @@ -1550,6 +1855,7 @@ static int netdev_set_wol(struct net_device *dev, u32 newval) { + struct netdev_private *np = dev->priv; u32 data = readl(dev->base_addr + WOLCmd) & ~WakeOptsSummary; /* translate to bitmasks this chip understands */ @@ -1565,49 +1871,65 @@ data |= WakeArp; if (newval & WAKE_MAGIC) data |= WakeMagic; - if (newval & WAKE_MAGICSECURE) - data |= WakeMagicSecure; + if (np->srr >= SRR_REV_D) { + if (newval & WAKE_MAGICSECURE) { + data |= WakeMagicSecure; + } + } writel(data, dev->base_addr + WOLCmd); - /* should we burn these into the EEPROM? */ - return 0; } static int netdev_get_wol(struct net_device *dev, u32 *supported, u32 *cur) { + struct netdev_private *np = dev->priv; u32 regval = readl(dev->base_addr + WOLCmd); *supported = (WAKE_PHY | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST - | WAKE_ARP | WAKE_MAGIC | WAKE_MAGICSECURE); + | WAKE_ARP | WAKE_MAGIC); + + if (np->srr >= SRR_REV_D) { + /* SOPASS works on revD and higher */ + *supported |= WAKE_MAGICSECURE; + } *cur = 0; + /* translate from chip bitmasks */ - if (regval & 0x1) + if (regval & WakePhy) *cur |= WAKE_PHY; - if (regval & 0x2) + if (regval & WakeUnicast) *cur |= WAKE_UCAST; - if (regval & 0x4) + if (regval & WakeMulticast) *cur |= WAKE_MCAST; - if (regval & 0x8) + if (regval & WakeBroadcast) *cur |= WAKE_BCAST; - if (regval & 0x10) + if (regval & WakeArp) *cur |= WAKE_ARP; - if (regval & 0x200) + if (regval & WakeMagic) *cur |= WAKE_MAGIC; - if (regval & 0x400) + if (regval & WakeMagicSecure) { + /* this can be on in revC, but it's broken */ *cur |= WAKE_MAGICSECURE; + } return 0; } static int netdev_set_sopass(struct net_device *dev, u8 *newval) { + struct netdev_private *np = dev->priv; u16 *sval = (u16 *)newval; - u32 addr = readl(dev->base_addr + RxFilterAddr) & ~0x3ff; + u32 addr; + + if (np->srr < SRR_REV_D) { + return 0; + } /* enable writing to these registers by disabling the RX filter */ - addr &= ~0x80000000; + addr = readl(dev->base_addr + RxFilterAddr) & ~RFCRAddressMask; + addr &= ~RxFilterEnable; writel(addr, dev->base_addr + RxFilterAddr); /* write the three words to (undocumented) RFCR vals 0xa, 0xc, 0xe */ @@ -1621,19 +1943,25 @@ writew(sval[2], dev->base_addr + RxFilterData); /* re-enable the RX filter */ - writel(addr | 0x80000000, dev->base_addr + RxFilterAddr); - - /* should we burn this into the EEPROM? */ + writel(addr | RxFilterEnable, dev->base_addr + RxFilterAddr); return 0; } static int netdev_get_sopass(struct net_device *dev, u8 *data) { + struct netdev_private *np = dev->priv; u16 *sval = (u16 *)data; - u32 addr = readl(dev->base_addr + RxFilterAddr) & ~0x3ff; + u32 addr; + + if (np->srr < SRR_REV_D) { + sval[0] = sval[1] = sval[2] = 0; + return 0; + } /* read the three words from (undocumented) RFCR vals 0xa, 0xc, 0xe */ + addr = readl(dev->base_addr + RxFilterAddr) & ~RFCRAddressMask; + writel(addr | 0xa, dev->base_addr + RxFilterAddr); sval[0] = readw(dev->base_addr + RxFilterData); @@ -1643,6 +1971,8 @@ writel(addr | 0xe, dev->base_addr + RxFilterAddr); sval[2] = readw(dev->base_addr + RxFilterData); + writel(addr, dev->base_addr + RxFilterAddr); + return 0; } @@ -1662,17 +1992,17 @@ ecmd->transceiver = XCVR_INTERNAL; /* this isn't fully supported at higher layers */ - ecmd->phy_address = readw(dev->base_addr + PhyCtrl) & 0xf; + ecmd->phy_address = readw(dev->base_addr + PhyCtrl) & PhyAddrMask; - tmp = readl(dev->base_addr + AnegAdv); ecmd->advertising = ADVERTISED_TP; - if (tmp & Aneg10BaseT) + tmp = mdio_read(dev, 1, MII_ADVERTISE); + if (tmp & ADVERTISE_10HALF) ecmd->advertising |= ADVERTISED_10baseT_Half; - if (tmp & Aneg10BaseTFull) + if (tmp & ADVERTISE_10FULL) ecmd->advertising |= ADVERTISED_10baseT_Full; - if (tmp & Aneg100BaseT) + if (tmp & ADVERTISE_100HALF) ecmd->advertising |= ADVERTISED_100baseT_Half; - if (tmp & Aneg100BaseTFull) + if (tmp & ADVERTISE_100FULL) ecmd->advertising |= ADVERTISED_100baseT_Full; tmp = readl(dev->base_addr + ChipConfig); @@ -1734,30 +2064,29 @@ } writel(tmp, dev->base_addr + ChipConfig); /* turn on autonegotiation, and force a renegotiate */ - tmp = readl(dev->base_addr + BasicControl); - tmp |= BMCRAnegEnable | BMCRAnegRestart; - writel(tmp, dev->base_addr + BasicControl); - np->advertising = mdio_read(dev, 1, 4); + tmp = mdio_read(dev, 1, MII_BMCR); + tmp |= (BMCR_ANENABLE | BMCR_ANRESTART); + mdio_write(dev, 1, MII_BMCR, tmp); + np->advertising = mdio_read(dev, 1, MII_ADVERTISE); } else { /* turn off auto negotiation, set speed and duplexity */ - tmp = readl(dev->base_addr + BasicControl); - tmp &= ~(BMCRAnegEnable | BMCRSpeed | BMCRDuplex); + tmp = mdio_read(dev, 1, MII_BMCR); + tmp &= ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX); if (ecmd->speed == SPEED_100) { - tmp |= BMCRSpeed; + tmp |= BMCR_SPEED100; } if (ecmd->duplex == DUPLEX_FULL) { - tmp |= BMCRDuplex; + tmp |= BMCR_FULLDPLX; } else { np->full_duplex = 0; } - writel(tmp, dev->base_addr + BasicControl); + mdio_write(dev, 1, MII_BMCR, tmp); } return 0; } static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct netdev_private *np = dev->priv; struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; switch(cmd) { @@ -1770,22 +2099,16 @@ case SIOCGMIIREG: /* Read MII PHY register. */ case SIOCDEVPRIVATE+1: /* for binary compat, remove in 2.5 */ - data->val_out = mdio_read(dev, data->phy_id & 0x1f, data->reg_num & 0x1f); + data->val_out = mdio_read(dev, data->phy_id & 0x1f, + data->reg_num & 0x1f); return 0; case SIOCSMIIREG: /* Write MII PHY register. */ case SIOCDEVPRIVATE+2: /* for binary compat, remove in 2.5 */ if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (data->phy_id == 1) { - u16 miireg = data->reg_num & 0x1f; - u16 value = data->val_in; - writew(value, dev->base_addr + BasicControl - + (miireg << 2)); - switch (miireg) { - case 4: np->advertising = value; break; - } - } + mdio_write(dev, data->phy_id & 0x1f, data->reg_num & 0x1f, + data->val_in); return 0; default: return -EOPNOTSUPP; @@ -1795,16 +2118,24 @@ static void enable_wol_mode(struct net_device *dev, int enable_intr) { long ioaddr = dev->base_addr; + struct netdev_private *np = dev->priv; if (debug > 1) printk(KERN_INFO "%s: remaining active for wake-on-lan\n", dev->name); + /* For WOL we must restart the rx process in silent mode. * Write NULL to the RxRingPtr. Only possible if * rx process is stopped */ writel(0, ioaddr + RxRingPtr); + /* read WoL status to clear */ + readl(ioaddr + WOLCmd); + + /* PME on, clear status */ + writel(np->SavedClkRun | PMEEnable | PMEStatus, ioaddr + ClkRun); + /* and restart the rx process */ writel(RxOn, ioaddr + ChipCmd); @@ -1822,9 +2153,10 @@ struct netdev_private *np = dev->priv; netif_stop_queue(dev); + netif_carrier_off(dev); if (debug > 1) { - printk(KERN_DEBUG "%s: Shutting down ethercard, status was %4.4x.\n", + printk(KERN_DEBUG "%s: Shutting down ethercard, status was %4.4x.\n", dev->name, (int)readl(ioaddr + ChipCmd)); printk(KERN_DEBUG "%s: Queue pointers were Tx %d / %d, Rx %d / %d.\n", dev->name, np->cur_tx, np->dirty_tx, np->cur_rx, np->dirty_rx); @@ -1835,9 +2167,13 @@ disable_irq(dev->irq); spin_lock_irq(&np->lock); + /* Disable and clear interrupts */ writel(0, ioaddr + IntrEnable); - writel(0, ioaddr + IntrMask); - writel(2, ioaddr + StatsCtrl); /* Freeze Stats */ + readl(ioaddr + IntrMask); + readw(ioaddr + MIntrStatus); + + /* Freeze Stats */ + writel(StatsFreeze, ioaddr + StatsCtrl); /* Stop the chip's Tx and Rx processes. */ natsemi_stop_rxtx(dev); @@ -1865,20 +2201,15 @@ { u32 wol = readl(ioaddr + WOLCmd) & WakeOptsSummary; - u32 clkrun = np->SavedClkRun; - /* Restore PME enable bit */ if (wol) { /* restart the NIC in WOL mode. * The nic must be stopped for this. */ enable_wol_mode(dev, 0); - /* make sure to enable PME */ - clkrun |= 0x100; + } else { + /* Restore PME enable bit unmolested */ + writel(np->SavedClkRun, ioaddr + ClkRun); } - writel(clkrun, ioaddr + ClkRun); -#if 0 - writel(0x0200, ioaddr + ChipConfig); /* Power down Xcvr. */ -#endif } return 0; } @@ -1913,8 +2244,8 @@ * * intr_handler: doesn't acquire the spinlock. suspend calls * disable_irq() to enforce synchronization. * - * netif_device_detach must occur under spin_unlock_irq(), interrupts from a detached - * device would cause an irq storm. + * netif_device_detach must occur under spin_unlock_irq(), interrupts from a + * detached device would cause an irq storm. */ static int natsemi_suspend (struct pci_dev *pdev, u32 state) @@ -1945,7 +2276,6 @@ drain_ring(dev); { u32 wol = readl(ioaddr + WOLCmd) & WakeOptsSummary; - u32 clkrun = np->SavedClkRun; /* Restore PME enable bit */ if (wol) { /* restart the NIC in WOL mode. @@ -1953,10 +2283,10 @@ * FIXME: use the WOL interupt */ enable_wol_mode(dev, 0); - /* make sure to enable PME */ - clkrun |= 0x100; + } else { + /* Restore PME enable bit unmolested */ + writel(np->SavedClkRun, ioaddr + ClkRun); } - writel(clkrun, ioaddr + ClkRun); } } else { netif_device_detach(dev); @@ -1985,8 +2315,7 @@ netif_device_attach(dev); spin_unlock_irq(&np->lock); - np->timer.expires = jiffies + 1*HZ; - add_timer(&np->timer); + mod_timer(&np->timer, jiffies + 1*HZ); } else { netif_device_attach(dev); } diff -u --recursive --new-file v2.4.13/linux/drivers/net/pcmcia/xircom_tulip_cb.c linux/drivers/net/pcmcia/xircom_tulip_cb.c --- v2.4.13/linux/drivers/net/pcmcia/xircom_tulip_cb.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/pcmcia/xircom_tulip_cb.c Thu Oct 25 14:01:57 2001 @@ -101,7 +101,9 @@ #include #include #include -#include /* Processor type for cache alignment. */ + +#include +#include /* Processor type for cache alignment. */ #include diff -u --recursive --new-file v2.4.13/linux/drivers/net/sunbmac.c linux/drivers/net/sunbmac.c --- v2.4.13/linux/drivers/net/sunbmac.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/sunbmac.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: sunbmac.c,v 1.27 2001/04/23 03:57:48 davem Exp $ +/* $Id: sunbmac.c,v 1.28 2001/10/21 06:35:29 davem Exp $ * sunbmac.c: Driver for Sparc BigMAC 100baseT ethernet adapters. * * Copyright (C) 1997, 1998, 1999 David S. Miller (davem@redhat.com) diff -u --recursive --new-file v2.4.13/linux/drivers/net/sunlance.c linux/drivers/net/sunlance.c --- v2.4.13/linux/drivers/net/sunlance.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/net/sunlance.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: sunlance.c,v 1.108 2001/04/19 22:32:41 davem Exp $ +/* $Id: sunlance.c,v 1.109 2001/10/21 06:35:29 davem Exp $ * lance.c: Linux/Sparc/Lance driver * * Written 1995, 1996 by Miguel de Icaza diff -u --recursive --new-file v2.4.13/linux/drivers/net/wireless/hermes.h linux/drivers/net/wireless/hermes.h --- v2.4.13/linux/drivers/net/wireless/hermes.h Tue Oct 9 17:06:52 2001 +++ linux/drivers/net/wireless/hermes.h Thu Oct 25 14:01:57 2001 @@ -31,6 +31,7 @@ #include #include +#include /* * Limits and constants diff -u --recursive --new-file v2.4.13/linux/drivers/parport/ChangeLog linux/drivers/parport/ChangeLog --- v2.4.13/linux/drivers/parport/ChangeLog Thu Oct 11 08:02:26 2001 +++ linux/drivers/parport/ChangeLog Thu Oct 25 00:07:40 2001 @@ -1,3 +1,27 @@ +2001-10-24 Dave Strauss + + * parport_pc.c (parport_pc_compat_write_block_pio, + parport_pc_ecp_write_block_pio): Allow a few seconds for an ECP + transfer to finish up. + +2001-10-11 Tim Waugh + + * parport_pc (sio_ite_8872_probe): New function, submitted by Rich + Liu from ITE. Cleaned up, removed bogus phys_to_virt calls. + +2001-10-24 Tim Waugh + + * parport_pc.c: Support for AKS AladdinCARD. Patch from + Aladdin Knowledge Systems (Christian Groessler). + +2001-10-24 Tim Waugh + + * ieee1284_ops.c (parport_ieee1284_ecp_read_data): Try to minimise + turnaround time. + + * ieee1284.c (parport_poll_peripheral): Try a couple of times + first without delaying. + 2001-10-10 Tim Waugh * parport_pc.c: Support for OX16PCI954 PCI card. diff -u --recursive --new-file v2.4.13/linux/drivers/parport/ieee1284.c linux/drivers/parport/ieee1284.c --- v2.4.13/linux/drivers/parport/ieee1284.c Sat May 19 18:07:04 2001 +++ linux/drivers/parport/ieee1284.c Thu Oct 25 00:07:39 2001 @@ -119,9 +119,10 @@ int usec) { /* Zero return code is success, >0 is timeout. */ - int counter = usec / 5; + int count = usec / 5 + 2; + int i; unsigned char status; - for (; counter > 0; counter--) { + for (i = 0; i < count; i++) { status = parport_read_status (port); if ((status & mask) == result) return 0; @@ -129,7 +130,8 @@ return -EINTR; if (current->need_resched) break; - udelay (5); + if (i >= 2) + udelay (5); } return 1; diff -u --recursive --new-file v2.4.13/linux/drivers/parport/ieee1284_ops.c linux/drivers/parport/ieee1284_ops.c --- v2.4.13/linux/drivers/parport/ieee1284_ops.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/parport/ieee1284_ops.c Thu Oct 25 00:07:39 2001 @@ -500,6 +500,7 @@ struct pardevice *dev = port->cad; unsigned char *buf = buffer; int rle_count = 0; /* shut gcc up */ + unsigned char ctl; int rle = 0; ssize_t count = 0; @@ -512,11 +513,10 @@ port->ieee1284.phase = IEEE1284_PH_REV_DATA; /* Set HostAck low to start accepting data. */ - parport_frob_control (port, - PARPORT_CONTROL_AUTOFD - | PARPORT_CONTROL_STROBE - | PARPORT_CONTROL_INIT, - PARPORT_CONTROL_AUTOFD); + ctl = parport_read_control (port); + ctl &= ~(PARPORT_CONTROL_STROBE | PARPORT_CONTROL_INIT); + parport_write_control (port, + ctl | PARPORT_CONTROL_AUTOFD); while (count < len) { long expire = jiffies + dev->timeout; unsigned char byte; @@ -592,7 +592,7 @@ } /* Event 44: Set HostAck high, acknowledging handshake. */ - parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0); + parport_write_control (port, ctl); /* Event 45: The peripheral has 35ms to set nAck high. */ if (parport_wait_peripheral (port, PARPORT_STATUS_ACK, @@ -610,9 +610,8 @@ } /* Event 46: Set HostAck low and accept the data. */ - parport_frob_control (port, - PARPORT_CONTROL_AUTOFD, - PARPORT_CONTROL_AUTOFD); + parport_write_control (port, + ctl | PARPORT_CONTROL_AUTOFD); /* If we just read a run-length count, fetch the data. */ if (command) diff -u --recursive --new-file v2.4.13/linux/drivers/parport/parport_pc.c linux/drivers/parport/parport_pc.c --- v2.4.13/linux/drivers/parport/parport_pc.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/parport/parport_pc.c Thu Oct 25 00:07:40 2001 @@ -798,6 +798,8 @@ { size_t written; int r; + long int expire; + const struct parport_pc_private *priv = port->physport->private_data; /* Special case: a timeout of zero means we cannot call schedule(). */ if (!port->physport->cad->timeout) @@ -819,9 +821,19 @@ written = parport_pc_fifo_write_block_pio (port, buf, length); /* Finish up. */ - if (change_mode (port, ECR_PS2) == -EBUSY) { - const struct parport_pc_private *priv = - port->physport->private_data; + /* For some hardware we don't want to touch the mode until + * the FIFO is empty, so allow 4 seconds for each position + * in the fifo. + */ + expire = jiffies + (priv->fifo_depth * HZ * 4); + do { + /* Wait for the FIFO to empty */ + r = change_mode (port, ECR_PS2); + if (r != -EBUSY) { + break; + } + } while (time_before (jiffies, expire)); + if (r == -EBUSY) { printk (KERN_DEBUG "%s: FIFO is stuck\n", port->name); @@ -862,6 +874,8 @@ { size_t written; int r; + long int expire; + const struct parport_pc_private *priv = port->physport->private_data; /* Special case: a timeout of zero means we cannot call schedule(). */ if (!port->physport->cad->timeout) @@ -904,9 +918,19 @@ written = parport_pc_fifo_write_block_pio (port, buf, length); /* Finish up. */ - if (change_mode (port, ECR_PS2) == -EBUSY) { - const struct parport_pc_private *priv = - port->physport->private_data; + /* For some hardware we don't want to touch the mode until + * the FIFO is empty, so allow 4 seconds for each position + * in the fifo. + */ + expire = jiffies + (priv->fifo_depth * (HZ * 4)); + do { + /* Wait for the FIFO to empty */ + r = change_mode (port, ECR_PS2); + if (r != -EBUSY) { + break; + } + } while (time_before (jiffies, expire)); + if (r == -EBUSY) { printk (KERN_DEBUG "%s: FIFO is stuck\n", port->name); @@ -2382,6 +2406,105 @@ } #ifdef CONFIG_PCI + +/* ITE support maintained by Rich Liu */ +static int __devinit sio_ite_8872_probe (struct pci_dev *pdev, int autoirq, + int autodma) +{ + short inta_addr[6] = { 0x2A0, 0x2C0, 0x220, 0x240, 0x1E0 }; + u32 ite8872set; + u32 ite8872_lpt, ite8872_lpthi; + u8 ite8872_irq, type; + int irq; + int i; + + DPRINTK (KERN_DEBUG "sio_ite_8872_probe()\n"); + + // make sure which one chip + for(i = 0; i < 5; i++) { + if (check_region (inta_addr[i], 0x8) >= 0) { + int test; + pci_write_config_dword (pdev, 0x60, + 0xe7000000 | inta_addr[i]); + pci_write_config_dword (pdev, 0x78, + 0x00000000 | inta_addr[i]); + test = inb (inta_addr[i]); + if (test != 0xff) break; + } + } + if(i >= 5) { + printk (KERN_INFO "parport_pc: cannot find ITE8872 INTA\n"); + return 0; + } + + type = inb (inta_addr[i] + 0x18); + type &= 0x0f; + + switch (type) { + case 0x2: + printk (KERN_INFO "parport_pc: ITE8871 found (1P)\n"); + ite8872set = 0x64200000; + break; + case 0xa: + printk (KERN_INFO "parport_pc: ITE8875 found (1P)\n"); + ite8872set = 0x64200000; + break; + case 0xe: + printk (KERN_INFO "parport_pc: ITE8872 found (2S1P)\n"); + ite8872set = 0x64e00000; + break; + case 0x6: + printk (KERN_INFO "parport_pc: ITE8873 found (1S1P)\n"); + ite8872set = 0x64a00000; + break; + case 0x8: + DPRINTK (KERN_DEBUG "parport_pc: ITE8874 found (2S)\n"); + return 0; + default: + printk (KERN_INFO "parport_pc: unknown ITE887x\n"); + printk (KERN_INFO "parport_pc: please mail 'lspci -nvv' " + "output to Rich.Liu@ite.com.tw\n"); + return 0; + } + + pci_read_config_byte (pdev, 0x3c, &ite8872_irq); + pci_read_config_dword (pdev, 0x1c, &ite8872_lpt); + ite8872_lpt &= 0x0000ff00; + pci_read_config_dword (pdev, 0x20, &ite8872_lpthi); + ite8872_lpthi &= 0x0000ff00; + pci_write_config_dword (pdev, 0x6c, 0xe3000000 | ite8872_lpt); + pci_write_config_dword (pdev, 0x70, 0xe3000000 | ite8872_lpthi); + pci_write_config_dword (pdev, 0x80, (ite8872_lpthi<<16) | ite8872_lpt); + // SET SPP&EPP , Parallel Port NO DMA , Enable All Function + // SET Parallel IRQ + pci_write_config_dword (pdev, 0x9c, + ite8872set | (ite8872_irq * 0x11111)); + + DPRINTK (KERN_DEBUG "ITE887x: The IRQ is %d.\n", ite8872_irq); + DPRINTK (KERN_DEBUG "ITE887x: The PARALLEL I/O port is 0x%x.\n", + ite8872_lpt); + DPRINTK (KERN_DEBUG "ITE887x: The PARALLEL I/O porthi is 0x%x.\n", + ite8872_lpthi); + + /* Let the user (or defaults) steer us away from interrupts */ + irq = ite8872_irq; + if (autoirq != PARPORT_IRQ_AUTO) + irq = PARPORT_IRQ_NONE; + + if (parport_pc_probe_port (ite8872_lpt, ite8872_lpthi, + irq, PARPORT_DMA_NONE, NULL)) { + printk (KERN_INFO + "parport_pc: ITE 8872 parallel port: io=0x%X", + ite8872_lpt); + if (irq != PARPORT_IRQ_NONE) + printk (", irq=%d", irq); + printk ("\n"); + return 1; + } + + return 0; +} + /* Via support maintained by Jeff Garzik */ static int __devinit sio_via_686a_probe (struct pci_dev *pdev, int autoirq, int autodma) @@ -2492,6 +2615,7 @@ enum parport_pc_sio_types { sio_via_686a = 0, /* Via VT82C686A motherboard Super I/O */ + sio_ite_8872, last_sio }; @@ -2500,6 +2624,7 @@ int (*probe) (struct pci_dev *pdev, int autoirq, int autodma); } parport_pc_superio_info[] __devinitdata = { { sio_via_686a_probe, }, + { sio_ite_8872_probe, }, }; @@ -2559,6 +2684,7 @@ avlab_2p, oxsemi_954, oxsemi_840, + aks_0100, }; @@ -2632,11 +2758,14 @@ * and 840 locks up if you write 1 to bit 2! */ /* oxsemi_954 */ { 1, { { 0, -1 }, } }, /* oxsemi_840 */ { 1, { { 0, -1 }, } }, + /* aks_0100 */ { 1, { { 0, 1 }, } }, }; static struct pci_device_id parport_pc_pci_tbl[] __devinitdata = { /* Super-IO onboard chips */ { 0x1106, 0x0686, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sio_via_686a }, + { PCI_VENDOR_ID_ITE, PCI_DEVICE_ID_ITE_8872, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, sio_ite_8872 }, /* PCI cards */ { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_1S1P_10x_550, @@ -2725,6 +2854,8 @@ PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_954 }, { PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_12PCI840, PCI_ANY_ID, PCI_ANY_ID, 0, 0, oxsemi_840 }, + { PCI_VENDOR_ID_AKS, PCI_DEVICE_ID_AKS_ALADDINCARD, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, aks_0100 }, { 0, } /* terminate list */ }; MODULE_DEVICE_TABLE(pci,parport_pc_pci_tbl); diff -u --recursive --new-file v2.4.13/linux/drivers/pci/pci.ids linux/drivers/pci/pci.ids --- v2.4.13/linux/drivers/pci/pci.ids Tue Oct 23 22:48:51 2001 +++ linux/drivers/pci/pci.ids Thu Oct 25 14:01:51 2001 @@ -275,6 +275,7 @@ 0011 National PCI System I/O 0012 USB Controller 0020 DP83815 + 0022 DP83820 d001 87410 IDE 100c Tseng Labs Inc 3202 ET4000/W32p rev A @@ -3669,6 +3670,7 @@ 1384 Reality Simulation Systems Inc 1385 Netgear 620a GA620 + 622a GA622 f311 FA311 1386 Video Domain Technologies 1387 Systran Corp @@ -4618,6 +4620,8 @@ 4033 Addtron Technology Co, Inc. 4143 Digital Equipment Corp 416c Aladdin Knowledge Systems + 0100 AladdinCARD + 0200 CPC 4444 Internext Compression Inc 4468 Bridgeport machines 4594 Cogetec Informatique Inc diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/Config.in linux/drivers/pcmcia/Config.in --- v2.4.13/linux/drivers/pcmcia/Config.in Fri Feb 16 16:02:36 2001 +++ linux/drivers/pcmcia/Config.in Thu Oct 25 13:53:48 2001 @@ -17,6 +17,7 @@ if [ "$CONFIG_PCI" != "n" ]; then bool ' CardBus support' CONFIG_CARDBUS fi + bool ' i82092 compatible bridge support' CONFIG_I82092 bool ' i82365 compatible bridge support' CONFIG_I82365 bool ' Databook TCIC host bridge support' CONFIG_TCIC if [ "$CONFIG_HD64465" = "y" ]; then diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/Makefile linux/drivers/pcmcia/Makefile --- v2.4.13/linux/drivers/pcmcia/Makefile Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/Makefile Thu Oct 25 13:53:48 2001 @@ -29,6 +29,9 @@ ifeq ($(CONFIG_I82365),y) obj-y += i82365.o endif + ifeq ($(CONFIG_I82092),y) + obj-y += i82092.o + endif ifeq ($(CONFIG_TCIC),y) obj-y += tcic.o endif @@ -40,6 +43,9 @@ obj-m := pcmcia_core.o ds.o ifeq ($(CONFIG_I82365),y) obj-m += i82365.o + endif + ifeq ($(CONFIG_I82092),y) + obj-m += i82092.o endif ifeq ($(CONFIG_TCIC),y) obj-m += tcic.o diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/ds.c linux/drivers/pcmcia/ds.c --- v2.4.13/linux/drivers/pcmcia/ds.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/pcmcia/ds.c Thu Oct 25 13:53:47 2001 @@ -640,8 +640,8 @@ if (signal_pending(current)) return -EINTR; } - put_user(get_queued_event(user), (int *)buf); - return 4; + + return put_user(get_queued_event(user), (int *)buf) ? -EFAULT : 4; } /* ds_read */ /*====================================================================*/ diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/i82092.c linux/drivers/pcmcia/i82092.c --- v2.4.13/linux/drivers/pcmcia/i82092.c Wed Dec 31 16:00:00 1969 +++ linux/drivers/pcmcia/i82092.c Thu Oct 25 13:53:48 2001 @@ -0,0 +1,909 @@ +/* + * Driver for Intel I82092AA PCI-PCMCIA bridge. + * + * (C) 2001 Red Hat, Inc. + * + * Author: Arjan Van De Ven + * Loosly based on i82365.c from the pcmcia-cs package + * + * $Id: i82092aa.c,v 1.2 2001/10/23 14:43:34 arjanv Exp $ + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "i82092aa.h" +#include "i82365.h" + +/* PCI core routines */ +static struct pci_device_id i82092aa_pci_ids[] = { + { + vendor:PCI_VENDOR_ID_INTEL, + device:PCI_DEVICE_ID_INTEL_82092AA_0, + subvendor:PCI_ANY_ID, + subdevice:PCI_ANY_ID, + class: 0, class_mask:0, + + }, + {} +}; + +static struct pci_driver i82092aa_pci_drv = { + name: "i82092aa", + id_table: i82092aa_pci_ids, + probe: i82092aa_pci_probe, + remove: i82092aa_pci_remove, + suspend: NULL, + resume: NULL +}; + + +/* the pccard structure and its functions */ +static struct pccard_operations i82092aa_operations = { + init: i82092aa_init, + suspend: i82092aa_suspend, + register_callback: i82092aa_register_callback, + inquire_socket: i82092aa_inquire_socket, + get_status: i82092aa_get_status, + get_socket: i82092aa_get_socket, + set_socket: i82092aa_set_socket, + get_io_map: i82092aa_get_io_map, + set_io_map: i82092aa_set_io_map, + get_mem_map: i82092aa_get_mem_map, + set_mem_map: i82092aa_set_mem_map, + proc_setup: i82092aa_proc_setup, +}; + +/* The card can do upto 4 sockets, allocate a structure for each of them */ + +struct socket_info { + int card_state; /* 0 = no socket, + 1 = empty socket, + 2 = card but not initialized, + 3 = operational card */ + int io_base; /* base io address of the socket */ + socket_cap_t cap; + + unsigned int pending_events; /* Pending events on this interface */ + + void (*handler)(void *info, u_int events); + /* callback to the driver of the card */ + void *info; /* to be passed to the handler */ + + struct pci_dev *dev; /* The PCI device for the socket */ +}; + +#define MAX_SOCKETS 4 +static struct socket_info sockets[MAX_SOCKETS]; +static int socket_count; /* shortcut */ + + +static int __init i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + unsigned char configbyte; + int i; + + enter("i82092aa_pci_probe"); + + if (pci_enable_device(dev)) + return -EIO; + + pci_read_config_byte(dev, 0x40, &configbyte); /* PCI Configuration Control */ + switch(configbyte&6) { + case 0: + printk(KERN_INFO "i82092aa: configured as a 2 socket device.\n"); + socket_count = 2; + break; + case 2: + printk(KERN_INFO "i82092aa: configured as a 1 socket device.\n"); + socket_count = 1; + break; + case 4: + case 6: + printk(KERN_INFO "i82092aa: configured as a 4 socket device.\n"); + socket_count = 4; + break; + + default: + printk(KERN_ERR "i82092aa: Oops, you did something we didn't think of.\n"); + return -EIO; + break; + } + + for (i = 0;iresource[0].start & ~1); + if (sockets[i].io_base > 0) + request_region(sockets[i].io_base, 2, "i82092aa"); + + + sockets[i].cap.features |= SS_CAP_PCCARD; + sockets[i].cap.map_size = 0x1000; + sockets[i].cap.irq_mask = 0; + sockets[i].cap.pci_irq = dev->irq; + + if (card_present(i)) { + sockets[i].card_state = 3; + dprintk(KERN_DEBUG "i82092aa: slot %i is occupied\n",i); + } else { + dprintk(KERN_DEBUG "i82092aa: slot %i is vacant\n",i); + } + } + + /* Now, specifiy that all interrupts are to be done as PCI interrupts */ + configbyte = 0xFF; /* bitmask, one bit per event, 1 = PCI interrupt, 0 = ISA interrupt */ + pci_write_config_byte(dev, 0x50, configbyte); /* PCI Interrupt Routing Register */ + + + /* Register the interrupt handler */ + dprintk(KERN_DEBUG "Requesting interrupt %i \n",dev->irq); + if (request_irq(dev->irq, i82092aa_interrupt, SA_SHIRQ, "i82092aa", i82092aa_interrupt)) { + printk(KERN_ERR "i82092aa: Failed to register IRQ %d, aborting\n", dev->irq); + return -EIO; + } + + + if (register_ss_entry(socket_count, &i82092aa_operations) != 0) + printk(KERN_NOTICE "i82092aa: register_ss_entry() failed\n"); + + leave("i82092aa_pci_probe"); + return 0; +} + +static void __exit i82092aa_pci_remove(struct pci_dev *dev) +{ + enter("i82092aa_pci_remove"); + + free_irq(dev->irq, i82092aa_interrupt); + + leave("i82092aa_pci_remove"); +} + +static spinlock_t port_lock = SPIN_LOCK_UNLOCKED; + +/* basic value read/write functions */ + +static unsigned char indirect_read(int socket, unsigned short reg) +{ + unsigned short int port; + unsigned char val; + unsigned long flags; + spin_lock_irqsave(&port_lock,flags); + reg += socket * 0x40; + port = sockets[socket].io_base; + outb(reg,port); + val = inb(port+1); + spin_unlock_irqrestore(&port_lock,flags); + return val; +} + +static unsigned short indirect_read16(int socket, unsigned short reg) +{ + unsigned short int port; + unsigned short tmp; + unsigned long flags; + spin_lock_irqsave(&port_lock,flags); + reg = reg + socket * 0x40; + port = sockets[socket].io_base; + outb(reg,port); + tmp = inb(port+1); + reg++; + outb(reg,port); + tmp = tmp | (inb(port+1)<<8); + spin_unlock_irqrestore(&port_lock,flags); + return tmp; +} + +static void indirect_write(int socket, unsigned short reg, unsigned char value) +{ + unsigned short int port; + unsigned long flags; + spin_lock_irqsave(&port_lock,flags); + reg = reg + socket * 0x40; + port = sockets[socket].io_base; + outb(reg,port); + outb(value,port+1); + spin_unlock_irqrestore(&port_lock,flags); +} + +static void indirect_setbit(int socket, unsigned short reg, unsigned char mask) +{ + unsigned short int port; + unsigned char val; + unsigned long flags; + spin_lock_irqsave(&port_lock,flags); + reg = reg + socket * 0x40; + port = sockets[socket].io_base; + outb(reg,port); + val = inb(port+1); + val |= mask; + outb(reg,port); + outb(val,port+1); + spin_unlock_irqrestore(&port_lock,flags); +} + + +static void indirect_resetbit(int socket, unsigned short reg, unsigned char mask) +{ + unsigned short int port; + unsigned char val; + unsigned long flags; + spin_lock_irqsave(&port_lock,flags); + reg = reg + socket * 0x40; + port = sockets[socket].io_base; + outb(reg,port); + val = inb(port+1); + val &= ~mask; + outb(reg,port); + outb(val,port+1); + spin_unlock_irqrestore(&port_lock,flags); +} + +static void indirect_write16(int socket, unsigned short reg, unsigned short value) +{ + unsigned short int port; + unsigned char val; + unsigned long flags; + spin_lock_irqsave(&port_lock,flags); + reg = reg + socket * 0x40; + port = sockets[socket].io_base; + + outb(reg,port); + val = value & 255; + outb(val,port+1); + + reg++; + + outb(reg,port); + val = value>>8; + outb(val,port+1); + spin_unlock_irqrestore(&port_lock,flags); +} + +/* simple helper functions */ +/* External clock time, in nanoseconds. 120 ns = 8.33 MHz */ +static int cycle_time = 120; + +static int to_cycles(int ns) +{ + if (cycle_time!=0) + return ns/cycle_time; + else + return 0; +} + +static int to_ns(int cycles) +{ + return cycle_time*cycles; +} + + +/* Interrupt handler functionality */ + +static void i82092aa_bh(void *dummy) +{ + unsigned int events; + int i; + + for (i=0; i < socket_count; i++) { + events = xchg(&(sockets[i].pending_events),0); + printk("events = %x \n",events); + if (sockets[i].handler) + sockets[i].handler(sockets[i].info, events); + } +} + + +static struct tq_struct i82092aa_task = { + routine: i82092aa_bh +}; + + +static void i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs) +{ + int i; + int loopcount = 0; + + unsigned int events, active=0; + +/* enter("i82092aa_interrupt");*/ + + while (1) { + loopcount++; + if (loopcount>20) { + printk(KERN_ERR "i82092aa: infinite eventloop in interrupt \n"); + break; + } + + active = 0; + + for (i=0;i MAX_SOCKETS)) + return 0; + if (sockets[socketno].io_base == 0) + return 0; + + + val = indirect_read(socketno, 1); /* Interface status register */ + if ((val&12)==12) { + leave("card_present 1"); + return 1; + } + + leave("card_present 0"); + return 0; +} + +static void set_bridge_state(int sock) +{ + enter("set_bridge_state"); + indirect_write(sock, I365_GBLCTL,0x00); + indirect_write(sock, I365_GENCTL,0x00); + + indirect_setbit(sock, I365_INTCTL,0x08); + leave("set_bridge_state"); +} + + + + + + +static int i82092aa_init(unsigned int s) +{ + int i; + pccard_io_map io = { 0, 0, 0, 0, 1 }; + pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 }; + + enter("i82092aa_init"); + + mem.sys_stop = 0x0fff; + i82092aa_set_socket(s, &dead_socket); + for (i = 0; i < 2; i++) { + io.map = i; + i82092aa_set_io_map(s, &io); + } + for (i = 0; i < 5; i++) { + mem.map = i; + i82092aa_set_mem_map(s, &mem); + } + + leave("i82092aa_init"); + return 0; +} + +static int i82092aa_suspend(unsigned int sock) +{ + int retval; + enter("i82092aa_suspend"); + retval = i82092aa_set_socket(sock, &dead_socket); + leave("i82092aa_suspend"); + return retval; +} + +static int i82092aa_register_callback(unsigned int sock, void (*handler)(void *, unsigned int), void * info) +{ + enter("i82092aa_register_callback"); + sockets[sock].handler = handler; + sockets[sock].info = info; + if (handler == NULL) { + MOD_DEC_USE_COUNT; + } else { + MOD_INC_USE_COUNT; + } + leave("i82092aa_register_callback"); + return 0; +} /* i82092aa_register_callback */ + +static int i82092aa_inquire_socket(unsigned int sock, socket_cap_t *cap) +{ + enter("i82092aa_inquire_socket"); + *cap = sockets[sock].cap; + leave("i82092aa_inquire_socket"); + return 0; +} /* i82092aa_inquire_socket */ + + +static int i82092aa_get_status(unsigned int sock, u_int *value) +{ + unsigned int status; + + enter("i82092aa_get_status"); + + status = indirect_read(sock,I365_STATUS); /* Interface Status Register */ + *value = 0; + + if ((status & I365_CS_DETECT) == I365_CS_DETECT) { + *value |= SS_DETECT; + } + + /* IO cards have a different meaning of bits 0,1 */ + /* Also notice the inverse-logic on the bits */ + if (indirect_read(sock, I365_INTCTL) & I365_PC_IOCARD) { + /* IO card */ + if (!(status & I365_CS_STSCHG)) + *value |= SS_STSCHG; + } else { /* non I/O card */ + if (!(status & I365_CS_BVD1)) + *value |= SS_BATDEAD; + if (!(status & I365_CS_BVD2)) + *value |= SS_BATWARN; + + } + + if (status & I365_CS_WRPROT) + (*value) |= SS_WRPROT; /* card is write protected */ + + if (status & I365_CS_READY) + (*value) |= SS_READY; /* card is not busy */ + + if (status & I365_CS_POWERON) + (*value) |= SS_POWERON; /* power is applied to the card */ + + + leave("i82092aa_get_status"); + return 0; +} + + +static int i82092aa_get_socket(unsigned int sock, socket_state_t *state) +{ + unsigned char reg,vcc,vpp; + + enter("i82092aa_get_socket"); + state->flags = 0; + state->Vcc = 0; + state->Vpp = 0; + state->io_irq = 0; + state->csc_mask = 0; + + /* First the power status of the socket */ + reg = indirect_read(sock,I365_POWER); /* PCTRL - Power Control Register */ + + if (reg & I365_PWR_AUTO) + state->flags |= SS_PWR_AUTO; /* Automatic Power Switch */ + + if (reg & I365_PWR_OUT) + state->flags |= SS_OUTPUT_ENA; /* Output signals are enabled */ + + vcc = reg & I365_VCC_MASK; vpp = reg & I365_VPP1_MASK; + + if (reg & I365_VCC_5V) { /* Can still be 3.3V, in this case the Vcc value will be overwritten later */ + state->Vcc = 50; + + if (vpp == I365_VPP1_5V) + state->Vpp = 50; + if (vpp == I365_VPP1_12V) + state->Vpp = 120; + + } + + if ((reg & I365_VCC_3V)==I365_VCC_3V) + state->Vcc = 33; + + + /* Now the IO card, RESET flags and IO interrupt */ + + reg = indirect_read(sock, I365_INTCTL); /* IGENC, Interrupt and General Control */ + + if ((reg & I365_PC_RESET)==0) + state->flags |= SS_RESET; + if (reg & I365_PC_IOCARD) + state->flags |= SS_IOCARD; /* This is an IO card */ + + /* Set the IRQ number */ + if (sockets[sock].dev!=NULL) + state->io_irq = sockets[sock].dev->irq; + + /* Card status change */ + reg = indirect_read(sock, I365_CSCINT); /* CSCICR, Card Status Change Interrupt Configuration */ + + if (reg & I365_CSC_DETECT) + state->csc_mask |= SS_DETECT; /* Card detect is enabled */ + + if (state->flags & SS_IOCARD) {/* IO Cards behave different */ + if (reg & I365_CSC_STSCHG) + state->csc_mask |= SS_STSCHG; + } else { + if (reg & I365_CSC_BVD1) + state->csc_mask |= SS_BATDEAD; + if (reg & I365_CSC_BVD2) + state->csc_mask |= SS_BATWARN; + if (reg & I365_CSC_READY) + state->csc_mask |= SS_READY; + } + + leave("i82092aa_get_socket"); + return 0; +} + +static int i82092aa_set_socket(unsigned int sock, socket_state_t *state) +{ + unsigned char reg; + + enter("i82092aa_set_socket"); + + /* First, set the global controller options */ + + set_bridge_state(sock); + + /* Values for the IGENC register */ + + reg = 0; + if (!(state->flags & SS_RESET)) /* The reset bit has "inverse" logic */ + reg = reg | I365_PC_RESET; + if (state->flags & SS_IOCARD) + reg = reg | I365_PC_IOCARD; + + indirect_write(sock,I365_INTCTL,reg); /* IGENC, Interrupt and General Control Register */ + + /* Power registers */ + + reg = I365_PWR_NORESET; /* default: disable resetdrv on resume */ + + if (state->flags & SS_PWR_AUTO) { + printk("Auto power\n"); + reg |= I365_PWR_AUTO; /* automatic power mngmnt */ + } + if (state->flags & SS_OUTPUT_ENA) { + printk("Power Enabled \n"); + reg |= I365_PWR_OUT; /* enable power */ + } + + switch (state->Vcc) { + case 0: + break; + case 50: + printk("setting voltage to Vcc to 5V on socket %i\n",sock); + reg |= I365_VCC_5V; + break; + default: + printk("i82092aa: i82092aa_set_socket called with invalid VCC power value: %i ", state->Vcc); + leave("i82092aa_set_socket"); + return -EINVAL; + } + + + switch (state->Vpp) { + case 0: + printk("not setting Vpp on socket %i\n",sock); + break; + case 50: + printk("setting Vpp to 5.0 for socket %i\n",sock); + reg |= I365_VPP1_5V | I365_VPP2_5V; + break; + case 120: + printk("setting Vpp to 12.0\n"); + reg |= I365_VPP1_12V | I365_VPP2_12V; + break; + default: + printk("i82092aa: i82092aa_set_socket called with invalid VPP power value: %i ", state->Vcc); + leave("i82092aa_set_socket"); + return -EINVAL; + } + + if (reg != indirect_read(sock,I365_POWER)) /* only write if changed */ + indirect_write(sock,I365_POWER,reg); + + /* Enable specific interrupt events */ + + reg = 0x00; + if (state->csc_mask & SS_DETECT) { + reg |= I365_CSC_DETECT; + } + if (state->flags & SS_IOCARD) { + if (state->csc_mask & SS_STSCHG) + reg |= I365_CSC_STSCHG; + } else { + if (state->csc_mask & SS_BATDEAD) + reg |= I365_CSC_BVD1; + if (state->csc_mask & SS_BATWARN) + reg |= I365_CSC_BVD2; + if (state->csc_mask & SS_READY) + reg |= I365_CSC_READY; + + } + + /* now write the value and clear the (probably bogus) pending stuff by doing a dummy read*/ + + indirect_write(sock,I365_CSCINT,reg); + (void)indirect_read(sock,I365_CSC); + + leave("i82092aa_set_socket"); + return 0; +} + +static int i82092aa_get_io_map(unsigned int sock, struct pccard_io_map *io) +{ + unsigned char map, ioctl, addr; + + enter("i82092aa_get_io_map"); + map = io->map; + if (map > 1) { + leave("i82092aa_get_io_map with -EINVAL"); + return -EINVAL; + } + + /* FIXME: How does this fit in with the PCI resource (re)allocation */ + io->start = indirect_read16(sock, I365_IO(map)+I365_W_START); + io->stop = indirect_read16(sock, I365_IO(map)+I365_W_START); + + ioctl = indirect_read(sock,I365_IOCTL); /* IOCREG: I/O Control Register */ + addr = indirect_read(sock,I365_ADDRWIN); /* */ + + io->speed = to_ns(ioctl & I365_IOCTL_WAIT(map)) ? 1 : 0; /* check this out later */ + io->flags = 0; + + if (addr & I365_IOCTL_16BIT(map)) + io->flags |= MAP_AUTOSZ; + + leave("i82092aa_get_io_map"); + return 0; +} + +static int i82092aa_set_io_map(unsigned sock, struct pccard_io_map *io) +{ + unsigned char map, ioctl; + + enter("i82092aa_set_io_map"); + + map = io->map; + + /* Check error conditions */ + if (map > 1) { + leave("i82092aa_set_io_map with invalid map"); + return -EINVAL; + } + if ((io->start > 0xffff) || (io->stop > 0xffff) || (io->stop < io->start)){ + leave("i82092aa_set_io_map with invalid io"); + return -EINVAL; + } + + /* Turn off the window before changing anything */ + if (indirect_read(sock, I365_ADDRWIN) & I365_ENA_IO(map)) + indirect_resetbit(sock, I365_ADDRWIN, I365_ENA_IO(map)); + +/* printk("set_io_map: Setting range to %x - %x \n",io->start,io->stop); */ + + /* write the new values */ + indirect_write16(sock,I365_IO(map)+I365_W_START,io->start); + indirect_write16(sock,I365_IO(map)+I365_W_STOP,io->stop); + + ioctl = indirect_read(sock,I365_IOCTL) & ~I365_IOCTL_MASK(map); + + if (io->flags & (MAP_16BIT|MAP_AUTOSZ)) + ioctl |= I365_IOCTL_16BIT(map); + + indirect_write(sock,I365_IOCTL,ioctl); + + /* Turn the window back on if needed */ + if (io->flags & MAP_ACTIVE) + indirect_setbit(sock,I365_ADDRWIN,I365_ENA_IO(map)); + + leave("i82092aa_set_io_map"); + return 0; +} + +static int i82092aa_get_mem_map(unsigned sock, struct pccard_mem_map *mem) +{ + unsigned short base, i; + unsigned char map, addr; + + enter("i82092aa_get_mem_map"); + + mem->flags = 0; + mem->speed = 0; + map = mem->map; + if (map > 4) { + leave("i82092aa_get_mem_map: -EINVAL"); + return -EINVAL; + } + + addr = indirect_read(sock, I365_ADDRWIN); + + if (addr & I365_ENA_MEM(map)) + mem->flags |= MAP_ACTIVE; /* yes this mapping is active */ + + base = I365_MEM(map); + + /* Find the start address - this register also has mapping info */ + + i = indirect_read16(sock,base+I365_W_START); + if (i & I365_MEM_16BIT) + mem->flags |= MAP_16BIT; + if (i & I365_MEM_0WS) + mem->flags |= MAP_0WS; + + mem->sys_start = ((unsigned long)(i & 0x0fff) << 12); + + /* Find the end address - this register also has speed info */ + i = indirect_read16(sock,base+I365_W_STOP); + if (i & I365_MEM_WS0) + mem->speed = 1; + if (i & I365_MEM_WS1) + mem->speed += 2; + mem->speed = to_ns(mem->speed); + mem->sys_stop = ( (unsigned long)(i & 0x0fff) << 12) + 0x0fff; + + /* Find the card start address, also some more MAP attributes */ + + i = indirect_read16(sock, base+I365_W_OFF); + if (i & I365_MEM_WRPROT) + mem->flags |= MAP_WRPROT; + if (i & I365_MEM_REG) + mem->flags |= MAP_ATTRIB; + mem->card_start = ( (unsigned long)(i & 0x3fff)<12) + mem->sys_start; + mem->card_start &= 0x3ffffff; + + printk("Card %i is from %x to %x \n",sock,mem->sys_start,mem->sys_stop); + + leave("i82092aa_get_mem_map"); + return 0; + +} + +static int i82092aa_set_mem_map(unsigned sock, struct pccard_mem_map *mem) +{ + unsigned short base, i; + unsigned char map; + + enter("i82092aa_set_mem_map"); + + map = mem->map; + if (map > 4) { + leave("i82092aa_set_mem_map: invalid map"); + return -EINVAL; + } + + + if ( (mem->card_start > 0x3ffffff) || (mem->sys_start > mem->sys_stop) || + (mem->speed > 1000) ) { + leave("i82092aa_set_mem_map: invalid address / speed"); + printk("invalid mem map for socket %i : %x to %x with a start of %x \n",sock,mem->sys_start, mem->sys_stop, mem->card_start); + return -EINVAL; + } + + /* Turn off the window before changing anything */ + if (indirect_read(sock, I365_ADDRWIN) & I365_ENA_MEM(map)) + indirect_resetbit(sock, I365_ADDRWIN, I365_ENA_MEM(map)); + + +/* printk("set_mem_map: Setting map %i range to %x - %x on socket %i, speed is %i, active = %i \n",map, mem->sys_start,mem->sys_stop,sock,mem->speed,mem->flags & MAP_ACTIVE); */ + + /* write the start address */ + base = I365_MEM(map); + i = (mem->sys_start >> 12) & 0x0fff; + if (mem->flags & MAP_16BIT) + i |= I365_MEM_16BIT; + if (mem->flags & MAP_0WS) + i |= I365_MEM_0WS; + indirect_write16(sock,base+I365_W_START,i); + + /* write the stop address */ + + i= (mem->sys_stop >> 12) & 0x0fff; + switch (to_cycles(mem->speed)) { + case 0: + break; + case 1: + i |= I365_MEM_WS0; + break; + case 2: + i |= I365_MEM_WS1; + break; + default: + i |= I365_MEM_WS1 | I365_MEM_WS0; + break; + } + + indirect_write16(sock,base+I365_W_STOP,i); + + /* card start */ + + i = ((mem->card_start - mem->sys_start) >> 12) & 0x3fff; + if (mem->flags & MAP_WRPROT) + i |= I365_MEM_WRPROT; + if (mem->flags & MAP_ATTRIB) { +/* printk("requesting attribute memory for socket %i\n",sock);*/ + i |= I365_MEM_REG; + } else { +/* printk("requesting normal memory for socket %i\n",sock);*/ + } + indirect_write16(sock,base+I365_W_OFF,i); + + /* Enable the window if necessary */ + if (mem->flags & MAP_ACTIVE) + indirect_setbit(sock, I365_ADDRWIN, I365_ENA_MEM(map)); + + leave("i82092aa_set_mem_map"); + return 0; +} + +static void i82092aa_proc_setup(unsigned int sock, struct proc_dir_entry *base) +{ + +} +/* Module stuff */ + +static int i82092aa_module_init(void) +{ + enter("i82092aa_module_init"); + pci_register_driver(&i82092aa_pci_drv); + leave("i82092aa_module_init"); + return 0; +} + +static void i82092aa_module_exit(void) +{ + int i; + enter("i82092aa_module_exit"); + pci_unregister_driver(&i82092aa_pci_drv); + unregister_ss_entry(&i82092aa_operations); + if (sockets[0].io_base>0) + release_region(sockets[0].io_base, 2); + leave("i82092aa_module_exit"); +} + +module_init(i82092aa_module_init); +module_exit(i82092aa_module_exit); + diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/i82092aa.h linux/drivers/pcmcia/i82092aa.h --- v2.4.13/linux/drivers/pcmcia/i82092aa.h Wed Dec 31 16:00:00 1969 +++ linux/drivers/pcmcia/i82092aa.h Thu Oct 25 13:53:48 2001 @@ -0,0 +1,43 @@ +#ifndef _INCLUDE_GUARD_i82092aa_H_ +#define _INCLUDE_GUARD_i82092aa_H_ + +/* $Id: i82092aa.h,v 1.1.1.1 2001/09/19 14:53:15 dwmw2 Exp $ */ + +/* Debuging defines */ +#ifdef NOTRACE +#define enter(x) printk("Enter: %s, %s line %i\n",x,__FILE__,__LINE__) +#define leave(x) printk("Leave: %s, %s line %i\n",x,__FILE__,__LINE__) +#define dprintk printk +#else +#define enter(x) do {} while (0) +#define leave(x) do {} while (0) +#define dprintk(...) do {} while (0) +#endif + + + +/* prototypes */ + +static int i82092aa_pci_probe(struct pci_dev *dev, const struct pci_device_id *id); +static void i82092aa_pci_remove(struct pci_dev *dev); +static int card_present(int socketno); +static void i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs); + + + + +static int i82092aa_get_status(unsigned int sock, u_int *value); +static int i82092aa_get_socket(unsigned int sock, socket_state_t *state); +static int i82092aa_set_socket(unsigned int sock, socket_state_t *state); +static int i82092aa_get_io_map(unsigned int sock, struct pccard_io_map *io); +static int i82092aa_set_io_map(unsigned int sock, struct pccard_io_map *io); +static int i82092aa_get_mem_map(unsigned int sock, struct pccard_mem_map *mem); +static int i82092aa_set_mem_map(unsigned int sock, struct pccard_mem_map *mem); +static int i82092aa_init(unsigned int s); +static int i82092aa_suspend(unsigned int sock); +static int i82092aa_register_callback(unsigned int sock, void (*handler)(void *, unsigned int), void * info); +static int i82092aa_inquire_socket(unsigned int sock, socket_cap_t *cap); +static void i82092aa_proc_setup(unsigned int sock, struct proc_dir_entry *base); + +#endif + diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/sa1100_assabet.c linux/drivers/pcmcia/sa1100_assabet.c --- v2.4.13/linux/drivers/pcmcia/sa1100_assabet.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/sa1100_assabet.c Thu Oct 25 13:53:48 2001 @@ -10,29 +10,29 @@ #include #include #include - +#include static int assabet_pcmcia_init(struct pcmcia_init *init){ int irq, res; /* Enable CF bus: */ - BCR_clear(BCR_CF_BUS_OFF); + ASSABET_BCR_clear(ASSABET_BCR_CF_BUS_OFF); /* All those are inputs */ - GPDR &= ~(GPIO_CF_CD | GPIO_CF_BVD2 | GPIO_CF_BVD1 | GPIO_CF_IRQ); + GPDR &= ~(ASSABET_GPIO_CF_CD | ASSABET_GPIO_CF_BVD2 | ASSABET_GPIO_CF_BVD1 | ASSABET_GPIO_CF_IRQ); /* Set transition detect */ - set_GPIO_IRQ_edge( GPIO_CF_CD|GPIO_CF_BVD2|GPIO_CF_BVD1, GPIO_BOTH_EDGES ); - set_GPIO_IRQ_edge( GPIO_CF_IRQ, GPIO_FALLING_EDGE ); + set_GPIO_IRQ_edge( ASSABET_GPIO_CF_CD|ASSABET_GPIO_CF_BVD2|ASSABET_GPIO_CF_BVD1, GPIO_BOTH_EDGES ); + set_GPIO_IRQ_edge( ASSABET_GPIO_CF_IRQ, GPIO_FALLING_EDGE ); /* Register interrupts */ - irq = IRQ_GPIO_CF_CD; + irq = ASSABET_IRQ_GPIO_CF_CD; res = request_irq( irq, init->handler, SA_INTERRUPT, "CF_CD", NULL ); if( res < 0 ) goto irq_err; - irq = IRQ_GPIO_CF_BVD2; + irq = ASSABET_IRQ_GPIO_CF_BVD2; res = request_irq( irq, init->handler, SA_INTERRUPT, "CF_BVD2", NULL ); if( res < 0 ) goto irq_err; - irq = IRQ_GPIO_CF_BVD1; + irq = ASSABET_IRQ_GPIO_CF_BVD1; res = request_irq( irq, init->handler, SA_INTERRUPT, "CF_BVD1", NULL ); if( res < 0 ) goto irq_err; @@ -47,12 +47,12 @@ static int assabet_pcmcia_shutdown(void) { /* disable IRQs */ - free_irq( IRQ_GPIO_CF_CD, NULL ); - free_irq( IRQ_GPIO_CF_BVD2, NULL ); - free_irq( IRQ_GPIO_CF_BVD1, NULL ); + free_irq( ASSABET_IRQ_GPIO_CF_CD, NULL ); + free_irq( ASSABET_IRQ_GPIO_CF_BVD2, NULL ); + free_irq( ASSABET_IRQ_GPIO_CF_BVD1, NULL ); /* Disable CF bus: */ - BCR_set(BCR_CF_BUS_OFF); + ASSABET_BCR_set(ASSABET_BCR_CF_BUS_OFF); return 0; } @@ -68,13 +68,13 @@ levels=GPLR; - state_array->state[1].detect=((levels & GPIO_CF_CD)==0)?1:0; + state_array->state[1].detect=((levels & ASSABET_GPIO_CF_CD)==0)?1:0; - state_array->state[1].ready=(levels & GPIO_CF_IRQ)?1:0; + state_array->state[1].ready=(levels & ASSABET_GPIO_CF_IRQ)?1:0; - state_array->state[1].bvd1=(levels & GPIO_CF_BVD1)?1:0; + state_array->state[1].bvd1=(levels & ASSABET_GPIO_CF_BVD1)?1:0; - state_array->state[1].bvd2=(levels & GPIO_CF_BVD2)?1:0; + state_array->state[1].bvd2=(levels & ASSABET_GPIO_CF_BVD2)?1:0; state_array->state[1].wrprot=0; /* Not available on Assabet. */ @@ -90,7 +90,7 @@ if(info->sock>1) return -1; if(info->sock==1) - info->irq=IRQ_GPIO_CF_IRQ; + info->irq=ASSABET_IRQ_GPIO_CF_IRQ; return 0; } @@ -110,7 +110,7 @@ switch(configure->vcc){ case 0: - value &= ~BCR_CF_PWR; + value &= ~ASSABET_BCR_CF_PWR; break; case 50: @@ -118,7 +118,7 @@ __FUNCTION__); case 33: /* Can only apply 3.3V to the CF slot. */ - value |= BCR_CF_PWR; + value |= ASSABET_BCR_CF_PWR; break; default: @@ -128,11 +128,11 @@ return -1; } - value = (configure->reset) ? (value | BCR_CF_RST) : (value & ~BCR_CF_RST); + value = (configure->reset) ? (value | ASSABET_BCR_CF_RST) : (value & ~ASSABET_BCR_CF_RST); /* Silently ignore Vpp, output enable, speaker enable. */ - BCR = BCR_value = value; + ASSABET_BCR = BCR_value = value; restore_flags(flags); diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/sa1100_cerf.c linux/drivers/pcmcia/sa1100_cerf.c --- v2.4.13/linux/drivers/pcmcia/sa1100_cerf.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/sa1100_cerf.c Thu Oct 25 13:53:48 2001 @@ -16,17 +16,12 @@ static int cerf_pcmcia_init(struct pcmcia_init *init){ int irq, res; - /* Enable CF bus: */ -// BCR_clear(BCR_CF_BUS_OFF); - - /* All those are inputs */ GPDR &= ~(GPIO_CF_CD | GPIO_CF_BVD2 | GPIO_CF_BVD1 | GPIO_CF_IRQ); + GPDR |= (GPIO_CF_RESET); - /* Set transition detect */ set_GPIO_IRQ_edge( GPIO_CF_CD|GPIO_CF_BVD2|GPIO_CF_BVD1, GPIO_BOTH_EDGES ); set_GPIO_IRQ_edge( GPIO_CF_IRQ, GPIO_FALLING_EDGE ); - /* Register interrupts */ irq = IRQ_GPIO_CF_CD; res = request_irq( irq, init->handler, SA_INTERRUPT, "CF_CD", NULL ); if( res < 0 ) goto irq_err; @@ -37,7 +32,6 @@ res = request_irq( irq, init->handler, SA_INTERRUPT, "CF_BVD1", NULL ); if( res < 0 ) goto irq_err; - /* There's only one slot, but it's "Slot 1": */ return 2; irq_err: @@ -47,13 +41,9 @@ static int cerf_pcmcia_shutdown(void) { - /* disable IRQs */ free_irq( IRQ_GPIO_CF_CD, NULL ); free_irq( IRQ_GPIO_CF_BVD2, NULL ); free_irq( IRQ_GPIO_CF_BVD1, NULL ); - - /* Disable CF bus: */ -// BCR_set(BCR_CF_BUS_OFF); return 0; } @@ -61,6 +51,11 @@ static int cerf_pcmcia_socket_state(struct pcmcia_state_array *state_array){ unsigned long levels; +#ifdef CONFIG_SA1100_CERF_CPLD + int i = 0; +#else + int i = 1; +#endif if(state_array->size<2) return -1; @@ -69,19 +64,19 @@ levels=GPLR; - state_array->state[1].detect=((levels & GPIO_CF_CD)==0)?1:0; + state_array->state[i].detect=((levels & GPIO_CF_CD)==0)?1:0; - state_array->state[1].ready=(levels & GPIO_CF_IRQ)?1:0; + state_array->state[i].ready=(levels & GPIO_CF_IRQ)?1:0; - state_array->state[1].bvd1=(levels & GPIO_CF_BVD1)?1:0; + state_array->state[i].bvd1=(levels & GPIO_CF_BVD1)?1:0; - state_array->state[1].bvd2=(levels & GPIO_CF_BVD2)?1:0; + state_array->state[i].bvd2=(levels & GPIO_CF_BVD2)?1:0; - state_array->state[1].wrprot=0; /* Not available on Assabet. */ + state_array->state[i].wrprot=0; - state_array->state[1].vs_3v=1; /* Can only apply 3.3V on Assabet. */ + state_array->state[i].vs_3v=1; - state_array->state[1].vs_Xv=0; + state_array->state[i].vs_Xv=0; return 1; } @@ -90,7 +85,11 @@ if(info->sock>1) return -1; +#ifdef CONFIG_SA1100_CERF_CPLD + if(info->sock==0) +#else if(info->sock==1) +#endif info->irq=IRQ_GPIO_CF_IRQ; return 0; @@ -99,28 +98,31 @@ static int cerf_pcmcia_configure_socket(const struct pcmcia_configure *configure) { - unsigned long value, flags; + unsigned long flags; - if(configure->sock>1) return -1; + if(configure->sock>1) + return -1; - if(configure->sock==0) return 0; +#ifdef CONFIG_SA1100_CERF_CPLD + if(configure->sock==1) +#else + if(configure->sock==0) +#endif + return 0; save_flags_cli(flags); -// value = BCR_value; - switch(configure->vcc){ case 0: -// value &= ~BCR_CF_PWR; break; case 50: - printk(KERN_WARNING "%s(): CS asked for 5V, applying 3.3V...\n", - __FUNCTION__); - - case 33: /* Can only apply 3.3V to the CF slot. */ -// value |= BCR_CF_PWR; - break; + case 33: +#ifdef CONFIG_SA1100_CERF_CPLD + GPDR |= GPIO_PWR_SHUTDOWN; + GPCR |= GPIO_PWR_SHUTDOWN; +#endif + break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, @@ -129,11 +131,20 @@ return -1; } -// value = (configure->reset) ? (value | BCR_CF_RST) : (value & ~BCR_CF_RST); - - /* Silently ignore Vpp, output enable, speaker enable. */ - -// BCR = BCR_value = value; + if(configure->reset) + { +#ifdef CONFIG_SA1100_CERF_CPLD + GPDR |= GPIO_CF_RESET; + GPSR |= GPIO_CF_RESET; +#endif + } + else + { +#ifdef CONFIG_SA1100_CERF_CPLD + GPDR |= GPIO_CF_RESET; + GPCR |= GPIO_CF_RESET; +#endif + } restore_flags(flags); diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/sa1100_generic.c linux/drivers/pcmcia/sa1100_generic.c --- v2.4.13/linux/drivers/pcmcia/sa1100_generic.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/sa1100_generic.c Thu Oct 25 13:53:48 2001 @@ -54,6 +54,7 @@ #include #include #include +#include #include "sa1100.h" @@ -375,11 +376,26 @@ * * Returns: 0 */ -static int sa1100_pcmcia_suspend(unsigned int sock){ +static int sa1100_pcmcia_suspend(unsigned int sock) +{ + struct pcmcia_configure conf; + int ret; DEBUG(2, "%s(): suspending socket %u\n", __FUNCTION__, sock); - return 0; + conf.sock = sock; + conf.vcc = 0; + conf.vpp = 0; + conf.output = 0; + conf.speaker = 0; + conf.reset = 1; + + ret = pcmcia_low_level->configure_socket(&conf); + + if (ret == 0) + sa1100_pcmcia_socket[sock].cs_state = dead_socket; + + return ret; } diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/sa1100_neponset.c linux/drivers/pcmcia/sa1100_neponset.c --- v2.4.13/linux/drivers/pcmcia/sa1100_neponset.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/sa1100_neponset.c Thu Oct 25 13:53:48 2001 @@ -11,6 +11,7 @@ #include #include #include +#include static int neponset_pcmcia_init(struct pcmcia_init *init){ int return_val=0; diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/sa1100_simpad.c linux/drivers/pcmcia/sa1100_simpad.c --- v2.4.13/linux/drivers/pcmcia/sa1100_simpad.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/sa1100_simpad.c Thu Oct 25 13:53:48 2001 @@ -1,5 +1,5 @@ /* - * drivers/pcmcia/sa1100_pangolin.c + * drivers/pcmcia/sa1100_simpad.c * * PCMCIA implementation routines for simpad * @@ -10,16 +10,23 @@ #include #include #include + +extern long get_cs3_shadow(void); +extern void set_cs3_bit(int value); +extern void clear_cs3_bit(int value); + static int simpad_pcmcia_init(struct pcmcia_init *init){ int irq, res; /* set GPIO_CF_CD & GPIO_CF_IRQ as inputs */ GPDR &= ~(GPIO_CF_CD|GPIO_CF_IRQ); - //init_simpad_cs3(); - printk("\nCS3:%x\n",cs3_shadow); - PCMCIA_setbit(PCMCIA_RESET); - PCMCIA_clearbit(PCMCIA_BUFF_DIS); + + set_cs3_bit(PCMCIA_RESET); + clear_cs3_bit(PCMCIA_BUFF_DIS); + clear_cs3_bit(PCMCIA_RESET); + + clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1); /* Set transition detect */ set_GPIO_IRQ_edge( GPIO_CF_CD, GPIO_BOTH_EDGES ); @@ -42,11 +49,12 @@ { /* disable IRQs */ free_irq( IRQ_GPIO_CF_CD, NULL ); - + /* Disable CF bus: */ - - PCMCIA_setbit(PCMCIA_BUFF_DIS); - PCMCIA_clearbit(PCMCIA_RESET); + + //set_cs3_bit(PCMCIA_BUFF_DIS); + clear_cs3_bit(PCMCIA_RESET); + return 0; } @@ -54,10 +62,11 @@ *state_array) { unsigned long levels; + unsigned long *cs3reg = CS3_BASE; if(state_array->size<2) return -1; - memset(state_array->state, 0, + memset(state_array->state, 0, (state_array->size)*sizeof(struct pcmcia_state)); levels=GPLR; @@ -72,10 +81,15 @@ state_array->state[1].wrprot=0; /* Not available on Simpad. */ - state_array->state[1].vs_3v=1; /* Can only apply 3.3V on Simpad. */ - - state_array->state[1].vs_Xv=0; - + + if((*cs3reg & 0x0c) == 0x0c) { + state_array->state[1].vs_3v=0; + state_array->state[1].vs_Xv=0; + } else + { + state_array->state[1].vs_3v=1; + state_array->state[1].vs_Xv=0; + } return 1; } @@ -100,21 +114,27 @@ save_flags_cli(flags); - /* Murphy: BUS_ON different from POWER ? */ + /* Murphy: see table of MIC2562a-1 */ switch(configure->vcc){ case 0: - PCMCIA_setbit(PCMCIA_BUFF_DIS); + clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1); + break; + + case 33: + clear_cs3_bit(VCC_3V_EN|EN0); + set_cs3_bit(VCC_5V_EN|EN1); break; - case 33: case 50: - PCMCIA_setbit(PCMCIA_BUFF_DIS); + clear_cs3_bit(VCC_5V_EN|EN1); + set_cs3_bit(VCC_3V_EN|EN0); break; default: printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, configure->vcc); + clear_cs3_bit(VCC_3V_EN|VCC_5V_EN|EN0|EN1); restore_flags(flags); return -1; } @@ -126,7 +146,7 @@ return 0; } -struct pcmcia_low_level simpad_pcmcia_ops = { +struct pcmcia_low_level simpad_pcmcia_ops = { simpad_pcmcia_init, simpad_pcmcia_shutdown, simpad_pcmcia_socket_state, diff -u --recursive --new-file v2.4.13/linux/drivers/pcmcia/sa1100_stork.c linux/drivers/pcmcia/sa1100_stork.c --- v2.4.13/linux/drivers/pcmcia/sa1100_stork.c Tue Oct 23 22:48:51 2001 +++ linux/drivers/pcmcia/sa1100_stork.c Thu Oct 25 13:53:48 2001 @@ -161,7 +161,7 @@ */ switch (configure->vcc) { case 0: - storkClearLatchA(STORK_PCMCIA_PULL_UPS_POWER_ON); +/* storkClearLatchA(STORK_PCMCIA_PULL_UPS_POWER_ON); */ storkClearLatchA(POWER); break; diff -u --recursive --new-file v2.4.13/linux/drivers/pnp/Config.in linux/drivers/pnp/Config.in --- v2.4.13/linux/drivers/pnp/Config.in Sun Aug 12 13:27:59 2001 +++ linux/drivers/pnp/Config.in Thu Oct 25 14:01:51 2001 @@ -8,8 +8,4 @@ dep_tristate ' ISA Plug and Play support' CONFIG_ISAPNP $CONFIG_PNP -if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then - dep_bool ' PNPBIOS support (EXPERIMENTAL)' CONFIG_PNPBIOS $CONFIG_PNP -fi - endmenu diff -u --recursive --new-file v2.4.13/linux/drivers/s390/block/dasd.c linux/drivers/s390/block/dasd.c --- v2.4.13/linux/drivers/s390/block/dasd.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/s390/block/dasd.c Thu Oct 25 13:58:35 2001 @@ -2563,7 +2563,6 @@ unsigned long flags; dasd_device_t *device; - MOD_INC_USE_COUNT; if ((!inp) || !(inp->i_rdev)) { rc = -EINVAL; goto fail; @@ -2595,13 +2594,10 @@ if (atomic_inc_return (&device->open_count) == 1 ) { if ( device->discipline->owner ) __MOD_INC_USE_COUNT(device->discipline->owner); - } else { - MOD_DEC_USE_COUNT; } unlock: spin_unlock_irqrestore(&discipline_lock,flags); fail: - if (rc) MOD_DEC_USE_COUNT; return rc; } @@ -2637,13 +2633,11 @@ rc = -ENODEV; goto out; } - // fsync_dev (inp->i_rdev); /* sync the device */ count = atomic_dec_return (&device->open_count); if ( count == 0) { invalidate_buffers (inp->i_rdev); if ( device->discipline->owner ) __MOD_DEC_USE_COUNT(device->discipline->owner); - MOD_DEC_USE_COUNT; } else if ( count == -1 ) { /* paranoia only */ atomic_set (&device->open_count,0); printk (KERN_WARNING PRINTK_HEADER @@ -2656,6 +2650,7 @@ static struct block_device_operations dasd_device_operations = { + owner:THIS_MODULE, open:dasd_open, release:dasd_release, ioctl:dasd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/s390/block/xpram.c linux/drivers/s390/block/xpram.c --- v2.4.13/linux/drivers/s390/block/xpram.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/s390/block/xpram.c Thu Oct 25 13:58:35 2001 @@ -608,7 +608,6 @@ dev->size,dev->device_name, atomic_read(&(dev->usage))); atomic_inc(&(dev->usage)); - MOD_INC_USE_COUNT; return 0; /* success */ } @@ -627,7 +626,6 @@ /* but flush it right now */ /* Everything is already flushed by caller -- AV */ } - MOD_DEC_USE_COUNT; return(0); } @@ -740,6 +738,7 @@ #if (XPRAM_VERSION == 24) struct block_device_operations xpram_devops = { + owner: THIS_MODULE, ioctl: xpram_ioctl, open: xpram_open, release: xpram_release, diff -u --recursive --new-file v2.4.13/linux/drivers/s390/char/tapeblock.c linux/drivers/s390/char/tapeblock.c --- v2.4.13/linux/drivers/s390/char/tapeblock.c Sun Aug 12 13:28:00 2001 +++ linux/drivers/s390/char/tapeblock.c Thu Oct 25 13:58:35 2001 @@ -40,6 +40,7 @@ #else static struct file_operations tapeblock_fops = { #endif + owner : THIS_MODULE, open : tapeblock_open, /* open */ release : tapeblock_release, /* release */ }; @@ -184,9 +185,6 @@ ti->cqr=NULL; s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags); -#ifdef MODULE - MOD_INC_USE_COUNT; -#endif /* MODULE */ return 0; } @@ -221,9 +219,6 @@ s390irq_spin_lock_irqsave (ti->devinfo.irq, lockflags); tapestate_set (ti, TS_UNUSED); s390irq_spin_unlock_irqrestore (ti->devinfo.irq, lockflags); -#ifdef MODULE - MOD_DEC_USE_COUNT; -#endif /* MODULE */ invalidate_buffers(inode->i_rdev); return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/sbus/char/aurora.c linux/drivers/sbus/char/aurora.c --- v2.4.13/linux/drivers/sbus/char/aurora.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/sbus/char/aurora.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: aurora.c,v 1.17 2001/10/13 08:27:50 davem Exp $ +/* $Id: aurora.c,v 1.18 2001/10/26 17:59:31 davem Exp $ * linux/drivers/sbus/char/aurora.c -- Aurora multiport driver * * Copyright (c) 1999 by Oliver Aldulea (oli at bv dot ro) @@ -2454,7 +2454,7 @@ #ifdef AURORA_DEBUG printk("cleanup_module: aurora_release_drivers\n"); -#endif; +#endif aurora_release_drivers(); for (i = 0; i < AURORA_NBOARD; i++) diff -u --recursive --new-file v2.4.13/linux/drivers/sbus/char/jsflash.c linux/drivers/sbus/char/jsflash.c --- v2.4.13/linux/drivers/sbus/char/jsflash.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/sbus/char/jsflash.c Thu Oct 25 13:58:35 2001 @@ -501,7 +501,6 @@ jdp = &jsf0.dv[dev]; jdp->refcnt++; - MOD_INC_USE_COUNT; return 0; } @@ -531,7 +530,6 @@ --jdp->refcnt; } /* N.B. Doesn't lo->file need an fput?? */ - MOD_DEC_USE_COUNT; return 0; } @@ -549,6 +547,7 @@ static struct miscdevice jsf_dev = { JSF_MINOR, "jsflash", &jsf_fops }; static struct block_device_operations jsfd_fops = { + owner: THIS_MODULE, open: jsfd_open, release: jsfd_release, ioctl: jsfd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/sbus/char/zs.c linux/drivers/sbus/char/zs.c --- v2.4.13/linux/drivers/sbus/char/zs.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/sbus/char/zs.c Tue Oct 30 15:08:11 2001 @@ -1,4 +1,4 @@ -/* $Id: zs.c,v 1.67 2001/10/13 08:27:50 davem Exp $ +/* $Id: zs.c,v 1.68 2001/10/25 18:48:03 davem Exp $ * zs.c: Zilog serial port driver for the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -1933,7 +1933,7 @@ static void show_serial_version(void) { - char *revision = "$Revision: 1.67 $"; + char *revision = "$Revision: 1.68 $"; char *version, *p; version = strchr(revision, ' '); @@ -2058,16 +2058,7 @@ if (mapped_addr != 0) { return (struct sun_zslayout *) mapped_addr; } else { - pgd_t *pgd = pgd_offset_k((unsigned long)vaddr[0]); - pmd_t *pmd = pmd_offset(pgd, (unsigned long)vaddr[0]); - pte_t *pte = pte_offset(pmd, (unsigned long)vaddr[0]); - unsigned long base = pte_val(*pte) & _PAGE_PADDR; - - /* Translate PROM's mapping we captured at boot - * time into physical address. - */ - base += ((unsigned long)vaddr[0] & ~PAGE_MASK); - return (struct sun_zslayout *) base; + return (struct sun_zslayout *) prom_virt_to_phys((unsigned long)vaddr[0], 0); } } #else /* !(__sparc_v9__) */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/53c7,8xx.c linux/drivers/scsi/53c7,8xx.c --- v2.4.13/linux/drivers/scsi/53c7,8xx.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/53c7,8xx.c Thu Oct 25 13:53:48 2001 @@ -1867,8 +1867,10 @@ */ timeout = jiffies + 5 * HZ / 10; - while ((hostdata->test_completed == -1) && jiffies < timeout) + while ((hostdata->test_completed == -1) && jiffies < timeout) { barrier(); + cpu_relax(); + } failed = 1; if (hostdata->test_completed == -1) @@ -1951,8 +1953,10 @@ restore_flags(flags); timeout = jiffies + 5 * HZ; /* arbitrary */ - while ((hostdata->test_completed == -1) && jiffies < timeout) + while ((hostdata->test_completed == -1) && jiffies < timeout) { barrier(); + cpu_relax(); + } NCR53c7x0_write32 (DSA_REG, 0); if (hostdata->test_completed == 2) { diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/53c7xx.c linux/drivers/scsi/53c7xx.c --- v2.4.13/linux/drivers/scsi/53c7xx.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/53c7xx.c Thu Oct 25 13:53:48 2001 @@ -6119,6 +6119,3 @@ return 1; } #endif /* def MODULE */ - -static Scsi_Host_Template driver_template = NCR53c7xx; -#include "scsi_module.c" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/53c7xx.h linux/drivers/scsi/53c7xx.h --- v2.4.13/linux/drivers/scsi/53c7xx.h Mon Sep 18 14:09:49 2000 +++ linux/drivers/scsi/53c7xx.h Thu Oct 25 13:53:48 2001 @@ -51,33 +51,6 @@ #ifndef NCR53c710_H #define NCR53c710_H -#include - -/* - * Prevent name space pollution in hosts.c, and only provide the - * define we need to get the NCR53c7x0 driver into the host template - * array. - */ - -#include - -extern int NCR53c7xx_abort(Scsi_Cmnd *); -extern int NCR53c7xx_detect(Scsi_Host_Template *tpnt); -extern int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -extern int NCR53c7xx_reset(Scsi_Cmnd *, unsigned int); -#ifdef MODULE -extern int NCR53c7xx_release(struct Scsi_Host *); -#else -#define NCR53c7xx_release NULL -#endif - -#define NCR53c7xx {NULL, NULL, NULL, NULL, \ - "NCR53c{7,8}xx (rel 17)", NCR53c7xx_detect,\ - NULL, /* info */ NULL, /* command, deprecated */ NULL, \ - NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset, \ - NULL /* slave attach */, scsicam_bios_param, /* can queue */ 24, \ - /* id */ 7, 127 /* old SG_ALL */, /* cmd per lun */ 3, \ - /* present */ 0, /* unchecked isa dma */ 0, DISABLE_CLUSTERING} #ifndef HOSTS_C @@ -1503,6 +1476,13 @@ /* These could be more efficient, given that we are always memory mapped, * but they don't give the same problems as the write macros, so leave * them. */ +#ifdef __mc68000__ +#define NCR53c7x0_read8(address) \ + ((unsigned int)raw_inb((u32)NCR53c7x0_address_memory + ((u32)(address)^3)) ) + +#define NCR53c7x0_read16(address) \ + ((unsigned int)raw_inw((u32)NCR53c7x0_address_memory + ((u32)(address)^2))) +#else #define NCR53c7x0_read8(address) \ (NCR53c7x0_memory_mapped ? \ (unsigned int)readb((u32)NCR53c7x0_address_memory + ((u32)(address)^3)) : \ @@ -1512,6 +1492,7 @@ (NCR53c7x0_memory_mapped ? \ (unsigned int)readw((u32)NCR53c7x0_address_memory + ((u32)(address)^2)) : \ inw(NCR53c7x0_address_io + (address))) +#endif /* mc68000 */ #else #define NCR53c7x0_read8(address) \ (NCR53c7x0_memory_mapped ? \ @@ -1523,10 +1504,16 @@ (unsigned int)readw((u32)NCR53c7x0_address_memory + (u32)(address)) : \ inw(NCR53c7x0_address_io + (address))) #endif + +#ifdef __mc68000__ +#define NCR53c7x0_read32(address) \ + ((unsigned int) raw_inl((u32)NCR53c7x0_address_memory + (u32)(address))) +#else #define NCR53c7x0_read32(address) \ (NCR53c7x0_memory_mapped ? \ (unsigned int) readl((u32)NCR53c7x0_address_memory + (u32)(address)) : \ inl(NCR53c7x0_address_io + (address))) +#endif /* mc68000*/ #ifdef BIG_ENDIAN /* If we are big-endian, then we are not Intel, so probably don't have diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/a2091.c linux/drivers/scsi/a2091.c --- v2.4.13/linux/drivers/scsi/a2091.c Mon Nov 27 17:57:34 2000 +++ linux/drivers/scsi/a2091.c Thu Oct 25 13:53:48 2001 @@ -190,6 +190,7 @@ struct Scsi_Host *instance; unsigned long address; struct zorro_dev *z = NULL; + wd33c93_regs regs; if (!MACH_IS_AMIGA || called) return 0; @@ -215,8 +216,9 @@ instance->irq = IRQ_AMIGA_PORTS; instance->unique_id = z->slotaddr; DMA(instance)->DAWR = DAWR_A2091; - wd33c93_init(instance, (wd33c93_regs *)&(DMA(instance)->SASR), - dma_setup, dma_stop, WD33C93_FS_8_10); + regs.SASR = &(DMA(instance)->SASR); + regs.SCMD = &(DMA(instance)->SCMD); + wd33c93_init(instance, regs, dma_setup, dma_stop, WD33C93_FS_8_10); if (num_a2091++ == 0) { first_instance = instance; a2091_template = instance->hostt; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/a3000.c linux/drivers/scsi/a3000.c --- v2.4.13/linux/drivers/scsi/a3000.c Mon Nov 27 17:57:34 2000 +++ linux/drivers/scsi/a3000.c Thu Oct 25 13:53:48 2001 @@ -171,35 +171,41 @@ int __init a3000_detect(Scsi_Host_Template *tpnt) { - static unsigned char called = 0; - - if (called) - return 0; + wd33c93_regs regs; if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(A3000_SCSI)) return 0; if (!request_mem_region(0xDD0000, 256, "wd33c93")) - return -EBUSY; + return 0; tpnt->proc_name = "A3000"; tpnt->proc_info = &wd33c93_proc_info; a3000_host = scsi_register (tpnt, sizeof(struct WD33C93_hostdata)); - if (a3000_host == NULL) { - release_mem_region(0xDD0000, 256); - return 0; - } + if (a3000_host == NULL) + goto fail_register; + a3000_host->base = ZTWO_VADDR(0xDD0000); a3000_host->irq = IRQ_AMIGA_PORTS; DMA(a3000_host)->DAWR = DAWR_A3000; - wd33c93_init(a3000_host, (wd33c93_regs *)&(DMA(a3000_host)->SASR), - dma_setup, dma_stop, WD33C93_FS_12_15); - request_irq(IRQ_AMIGA_PORTS, a3000_intr, SA_SHIRQ, "A3000 SCSI", - a3000_intr); + regs.SASR = &(DMA(a3000_host)->SASR); + regs.SCMD = &(DMA(a3000_host)->SCMD); + wd33c93_init(a3000_host, regs, dma_setup, dma_stop, WD33C93_FS_12_15); + if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, SA_SHIRQ, "A3000 SCSI", + a3000_intr)) + goto fail_irq; DMA(a3000_host)->CNTR = CNTR_PDMD | CNTR_INTEN; - called = 1; return 1; + +fail_irq: +#ifdef MODULE + wd33c93_release(); +#endif /* MODULE */ + scsi_unregister(a3000_host); +fail_register: + release_mem_region(0xDD0000, 256); + return 0; } #define HOSTS_C @@ -208,13 +214,13 @@ #include "scsi_module.c" -int a3000_release(struct Scsi_Host *instance) +int __exit a3000_release(struct Scsi_Host *instance) { #ifdef MODULE wd33c93_release(); +#endif /* MODULE*/ DMA(instance)->CNTR = 0; release_mem_region(0xDD0000, 256); free_irq(IRQ_AMIGA_PORTS, a3000_intr); -#endif return 1; } diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7770.c linux/drivers/scsi/aic7xxx/aic7770.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7770.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7770.c Thu Oct 25 13:53:48 2001 @@ -9,27 +9,35 @@ * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright - * notice immediately at the beginning of the file, without modification, - * this list of conditions, and the following disclaimer. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aic7770.c#12 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#14 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7770.c,v 1.1 2000/09/16 20:02:27 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7770_linux.c linux/drivers/scsi/aic7xxx/aic7770_linux.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7770_linux.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7770_linux.c Thu Oct 25 13:53:48 2001 @@ -1,7 +1,7 @@ /* * Linux driver attachment glue for aic7770 based controllers. * - * Copyright (c) 2000 Adaptec Inc. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +10,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7770_linux.c#7 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_linux.c#9 $ */ #include "aic7xxx_osm.h" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.c linux/drivers/scsi/aic7xxx/aic7xxx.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx.c Thu Oct 25 13:53:48 2001 @@ -2,6 +2,7 @@ * Core routines and tables shareable across OS platforms. * * Copyright (c) 1994-2001 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +11,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aic7xxx.c#44 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#50 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.c,v 1.61 2000/11/13 03:35:43 gibbs Exp $ */ @@ -129,6 +138,7 @@ #include "aic7xxx_seq.h" /**************************** Function Declarations ***************************/ +static void ahc_force_renegotiation(struct ahc_softc *ahc); static struct ahc_tmode_tstate* ahc_alloc_tstate(struct ahc_softc *ahc, u_int scsi_id, char channel); @@ -203,9 +213,6 @@ static void ahc_add_curscb_to_free_list(struct ahc_softc *ahc); static u_int ahc_rem_wscb(struct ahc_softc *ahc, u_int scbpos, u_int prev); -static int ahc_abort_scbs(struct ahc_softc *ahc, int target, - char channel, int lun, u_int tag, - role_t role, uint32_t status); static void ahc_reset_current_bus(struct ahc_softc *ahc); #ifdef AHC_DUMP_SEQ static void ahc_dumpseq(struct ahc_softc *ahc); @@ -240,6 +247,7 @@ ahc_outb(ahc, SCSISIGO, 0); /* De-assert BSY */ ahc_outb(ahc, MSG_OUT, MSG_NOOP); /* No message to send */ ahc_outb(ahc, SXFRCTL1, ahc_inb(ahc, SXFRCTL1) & ~BITBUCKET); + ahc_outb(ahc, LASTPHASE, P_BUSFREE); /* * Ensure that the sequencer's idea of TQINPOS @@ -705,19 +713,20 @@ MSG_TYPE_INITIATOR_MSGIN; ahc->msgin_index = 0; } - } else { + } +#if AHC_TARGET_MODE + else { if (bus_phase == P_MESGOUT) { ahc->msg_type = MSG_TYPE_TARGET_MSGOUT; ahc->msgin_index = 0; } -#if AHC_TARGET_MODE else ahc_setup_target_msgin(ahc, &devinfo, scb); -#endif } +#endif } ahc_handle_message_phase(ahc); @@ -1063,10 +1072,16 @@ else ahc_outb(ahc, MSG_OUT, mesg_out); } + /* + * Force a renegotiation with this target just in + * case we are out of sync for some external reason + * unknown (or unreported) by the target. + */ + ahc_force_renegotiation(ahc); ahc_outb(ahc, CLRINT, CLRSCSIINT); ahc_unpause(ahc); } else if ((status & SELTO) != 0) { - u_int scbptr; + u_int scbptr; /* Stop the selection */ ahc_outb(ahc, SCSISEQ, 0); @@ -1102,6 +1117,16 @@ ahc_freeze_devq(ahc, scb); } ahc_outb(ahc, CLRINT, CLRSCSIINT); + /* + * Force a renegotiation with this target just in + * case the cable was pulled and will later be + * re-attached. The target may forget its negotiation + * settings with us should it attempt to reselect + * during the interruption. The target will not issue + * a unit attention in this case, so we must always + * renegotiate. + */ + ahc_force_renegotiation(ahc); ahc_restart(ahc); } else if ((status & BUSFREE) != 0 && (ahc_inb(ahc, SIMODE1) & ENBUSFREE) != 0) { @@ -1167,7 +1192,6 @@ printerror = 0; } else if (ahc_sent_msg(ahc, AHCMSG_1B, MSG_BUS_DEV_RESET, TRUE)) { - struct ahc_devinfo devinfo; #ifdef __FreeBSD__ /* * Don't mark the user's request for this BDR @@ -1277,6 +1301,27 @@ } } +/* + * Force renegotiation to occur the next time we initiate + * a command to the current device. + */ +static void +ahc_force_renegotiation(struct ahc_softc *ahc) +{ + struct ahc_devinfo devinfo; + struct ahc_initiator_tinfo *targ_info; + struct ahc_tmode_tstate *tstate; + + ahc_fetch_devinfo(ahc, &devinfo); + targ_info = ahc_fetch_transinfo(ahc, + devinfo.channel, + devinfo.our_scsiid, + devinfo.target, + &tstate); + ahc_update_neg_request(ahc, &devinfo, tstate, + targ_info, /*force*/TRUE); +} + #define AHC_MAX_STEPS 2000 void ahc_clear_critical_section(struct ahc_softc *ahc) @@ -1382,21 +1427,9 @@ hscb->scsiid, hscb->lun, hscb->cdb_len); - printf("Shared Data: %#02x %#02x %#02x %#02x\n", - hscb->shared_data.cdb[0], - hscb->shared_data.cdb[1], - hscb->shared_data.cdb[2], - hscb->shared_data.cdb[3]); - printf(" %#02x %#02x %#02x %#02x\n", - hscb->shared_data.cdb[4], - hscb->shared_data.cdb[5], - hscb->shared_data.cdb[6], - hscb->shared_data.cdb[7]); - printf(" %#02x %#02x %#02x %#02x\n", - hscb->shared_data.cdb[8], - hscb->shared_data.cdb[9], - hscb->shared_data.cdb[10], - hscb->shared_data.cdb[11]); + printf("Shared Data: "); + for (i = 0; i < sizeof(hscb->shared_data.cdb); i++) + printf("%#02x", hscb->shared_data.cdb[i]); printf(" dataptr:%#x datacnt:%#x sgptr:%#x tag:%#x\n", ahc_le32toh(hscb->dataptr), ahc_le32toh(hscb->datacnt), @@ -2296,7 +2329,7 @@ } /* - * Build a wide negotiateion message in our message + * Build a wide negotiation message in our message * buffer based on the input parameters. */ static void @@ -2358,6 +2391,8 @@ ahc_outb(ahc, CLRSINT1, CLRATNO); } ahc_outb(ahc, MSG_OUT, MSG_NOOP); + ahc_outb(ahc, SEQ_FLAGS2, + ahc_inb(ahc, SEQ_FLAGS2) & ~TARGET_MSG_PENDING); } /* @@ -2994,6 +3029,7 @@ } break; } +#ifdef AHC_TARGET_MODE case MSG_BUS_DEV_RESET: ahc_handle_devreset(ahc, devinfo, CAM_BDR_SENT, @@ -3005,18 +3041,20 @@ case MSG_ABORT_TAG: case MSG_ABORT: case MSG_CLEAR_QUEUE: -#ifdef AHC_TARGET_MODE + { + int tag; + /* Target mode messages */ if (devinfo->role != ROLE_TARGET) { reject = TRUE; break; } + tag = SCB_LIST_NULL; + if (ahc->msgin_buf[0] == MSG_ABORT_TAG) + tag = ahc_inb(ahc, INITIATOR_TAG); ahc_abort_scbs(ahc, devinfo->target, devinfo->channel, - devinfo->lun, - ahc->msgin_buf[0] == MSG_ABORT_TAG - ? SCB_LIST_NULL - : ahc_inb(ahc, INITIATOR_TAG), - ROLE_TARGET, CAM_REQ_ABORTED); + devinfo->lun, tag, ROLE_TARGET, + CAM_REQ_ABORTED); tstate = ahc->enabled_targets[devinfo->our_scsiid]; if (tstate != NULL) { @@ -3027,12 +3065,14 @@ ahc_queue_lstate_event(ahc, lstate, devinfo->our_scsiid, ahc->msgin_buf[0], - /*arg*/0); + /*arg*/tag); ahc_send_lstate_events(ahc, lstate); } } - done = MSGLOOP_MSGCOMPLETE; + ahc_restart(ahc); + done = MSGLOOP_TERMINATED; break; + } #endif case MSG_TERM_IO_PROC: default: @@ -3501,8 +3541,10 @@ { /* The IRQMS bit is only valid on VL and EISA chips */ - if ((ahc->chip & AHC_PCI) != 0) - ahc->unpause &= ~IRQMS; + if ((ahc->chip & AHC_PCI) == 0) + ahc->unpause = ahc_inb(ahc, HCNTRL) & IRQMS; + else + ahc->unpause = 0; ahc->pause = ahc->unpause | PAUSE; /* XXX The shared scb data stuff should be deprecated */ if (ahc->scb_data == NULL) { @@ -3842,11 +3884,11 @@ /* Allocate SCB resources */ scb_data->scbarray = - (struct scb *)malloc(sizeof(struct scb) * AHC_SCB_MAX, + (struct scb *)malloc(sizeof(struct scb) * AHC_SCB_MAX_ALLOC, M_DEVBUF, M_NOWAIT); if (scb_data->scbarray == NULL) return (ENOMEM); - memset(scb_data->scbarray, 0, sizeof(struct scb) * AHC_SCB_MAX); + memset(scb_data->scbarray, 0, sizeof(struct scb) * AHC_SCB_MAX_ALLOC); /* Determine the number of hardware SCBs and initialize them */ @@ -3881,7 +3923,7 @@ /*lowaddr*/BUS_SPACE_MAXADDR_32BIT, /*highaddr*/BUS_SPACE_MAXADDR, /*filter*/NULL, /*filterarg*/NULL, - AHC_SCB_MAX * sizeof(struct hardware_scb), + AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb), /*nsegments*/1, /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT, /*flags*/0, &scb_data->hscb_dmat) != 0) { @@ -3902,7 +3944,7 @@ /* And permanently map them */ ahc_dmamap_load(ahc, scb_data->hscb_dmat, scb_data->hscb_dmamap, scb_data->hscbs, - AHC_SCB_MAX * sizeof(struct hardware_scb), + AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb), ahc_dmamap_cb, &scb_data->hscb_busaddr, /*flags*/0); scb_data->init_level++; @@ -3913,7 +3955,7 @@ /*lowaddr*/BUS_SPACE_MAXADDR_32BIT, /*highaddr*/BUS_SPACE_MAXADDR, /*filter*/NULL, /*filterarg*/NULL, - AHC_SCB_MAX * sizeof(struct scsi_sense_data), + AHC_SCB_MAX_ALLOC * sizeof(struct scsi_sense_data), /*nsegments*/1, /*maxsegsz*/BUS_SPACE_MAXSIZE_32BIT, /*flags*/0, &scb_data->sense_dmat) != 0) { @@ -3934,7 +3976,7 @@ /* And permanently map them */ ahc_dmamap_load(ahc, scb_data->sense_dmat, scb_data->sense_dmamap, scb_data->sense, - AHC_SCB_MAX * sizeof(struct scsi_sense_data), + AHC_SCB_MAX_ALLOC * sizeof(struct scsi_sense_data), ahc_dmamap_cb, &scb_data->sense_busaddr, /*flags*/0); scb_data->init_level++; @@ -3954,7 +3996,8 @@ scb_data->init_level++; /* Perform initial CCB allocation */ - memset(scb_data->hscbs, 0, AHC_SCB_MAX * sizeof(struct hardware_scb)); + memset(scb_data->hscbs, 0, + AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb)); ahc_alloc_scbs(ahc); if (scb_data->numscbs == 0) { @@ -4046,7 +4089,7 @@ int i; scb_data = ahc->scb_data; - if (scb_data->numscbs >= AHC_SCB_MAX) + if (scb_data->numscbs >= AHC_SCB_MAX_ALLOC) /* Can't allocate any more */ return; @@ -4075,7 +4118,8 @@ physaddr = sg_map->sg_physaddr; newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg))); - for (i = 0; scb_data->numscbs < AHC_SCB_MAX && i < newcount; i++) { + newcount = MIN(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs)); + for (i = 0; i < newcount; i++) { struct scb_platform_data *pdata; #ifndef __linux__ int error; @@ -4147,7 +4191,7 @@ if ((ahc->flags & AHC_PAGESCBS) != 0) sprintf(buf, "%d/%d SCBs", - ahc->scb_data->maxhscbs, AHC_SCB_MAX); + ahc->scb_data->maxhscbs, AHC_MAX_QUEUE); else sprintf(buf, "%d SCBs", ahc->scb_data->maxhscbs); } @@ -4313,7 +4357,7 @@ ahc_outb(ahc, SEQ_FLAGS, 0); ahc_outb(ahc, SEQ_FLAGS2, 0); - if (ahc->scb_data->maxhscbs < AHC_SCB_MAX) { + if (ahc->scb_data->maxhscbs < AHC_SCB_MAX_ALLOC) { ahc->flags |= AHC_PAGESCBS; } else { ahc->flags &= ~AHC_PAGESCBS; @@ -5517,24 +5561,40 @@ maxlun = lun + 1; } - for (;i < maxtarget; i++) { - for (j = minlun;j < maxlun; j++) - ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, j)); - } + if (role != ROLE_TARGET) { + for (;i < maxtarget; i++) { + for (j = minlun;j < maxlun; j++) { + u_int scbid; + u_int tcl; - /* - * Go through the disconnected list and remove any entries we - * have queued for completion, 0'ing their control byte too. - * We save the active SCB and restore it ourselves, so there - * is no reason for this search to restore it too. - */ - ahc_search_disc_list(ahc, target, channel, lun, tag, - /*stop_on_first*/FALSE, /*remove*/TRUE, - /*save_state*/FALSE); + tcl = BUILD_TCL(i << 4, j); + scbid = ahc_index_busy_tcl(ahc, tcl); + scbp = ahc_lookup_scb(ahc, scbid); + if (scbp == NULL + || ahc_match_scb(ahc, scbp, target, channel, + lun, tag, role) == 0) + continue; + ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, j)); + } + } + + /* + * Go through the disconnected list and remove any entries we + * have queued for completion, 0'ing their control byte too. + * We save the active SCB and restore it ourselves, so there + * is no reason for this search to restore it too. + */ + ahc_search_disc_list(ahc, target, channel, lun, tag, + /*stop_on_first*/FALSE, /*remove*/TRUE, + /*save_state*/FALSE); + } /* * Go through the hardware SCB array looking for commands that - * were active but not on any list. + * were active but not on any list. In some cases, these remnants + * might not still have mappings in the scbindex array (e.g. unexpected + * bus free with the same scb queued for an abort). Don't hold this + * against them. */ for (i = 0; i < ahc->scb_data->maxhscbs; i++) { u_int scbid; @@ -5542,8 +5602,9 @@ ahc_outb(ahc, SCBPTR, i); scbid = ahc_inb(ahc, SCB_TAG); scbp = ahc_lookup_scb(ahc, scbid); - if (scbp != NULL - && ahc_match_scb(ahc, scbp, target, channel, lun, tag, role)) + if ((scbp == NULL && scbid != SCB_LIST_NULL) + || (scbp != NULL + && ahc_match_scb(ahc, scbp, target, channel, lun, tag, role))) ahc_add_curscb_to_free_list(ahc); } diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.h linux/drivers/scsi/aic7xxx/aic7xxx.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.h Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx.h Thu Oct 25 13:53:49 2001 @@ -2,6 +2,7 @@ * Core definitions and data structures shareable across OS platforms. * * Copyright (c) 1994-2001 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +11,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aic7xxx.h#29 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#34 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.h,v 1.30 2000/11/10 20:13:40 gibbs Exp $ */ @@ -147,6 +156,13 @@ #define AHC_MAX_QUEUE 253 /* + * The maximum amount of SCB storage we allocate in host memory. This + * number should reflect the 1 additional SCB we require to handle our + * qinfifo mechanism. + */ +#define AHC_SCB_MAX_ALLOC (AHC_MAX_QUEUE+1) + +/* * Ring Buffer of incoming target commands. * We allocate 256 to simplify the logic in the sequencer * by using the natural wrap point of an 8bit counter. @@ -373,10 +389,12 @@ * Target mode version of the shared data SCB segment. */ struct target_data { - uint8_t target_phases; /* Bitmap of phases to execute */ - uint8_t data_phase; /* Data-In or Data-Out */ - uint8_t scsi_status; /* SCSI status to give to initiator */ - uint8_t initiator_tag; /* Initiator's transaction tag */ + uint32_t residual_datacnt; /* Residual in the current S/G seg */ + uint32_t residual_sg_ptr; /* The next S/G for this transfer */ + uint8_t scsi_status; /* SCSI status to give to initiator */ + uint8_t target_phases; /* Bitmap of phases to execute */ + uint8_t data_phase; /* Data-In or Data-Out */ + uint8_t initiator_tag; /* Initiator's transaction tag */ }; struct hardware_scb { @@ -387,10 +405,10 @@ * of the cdb payload as seen by the chip and a DMA * is used to pull it in. */ - uint8_t cdb[12]; - uint32_t cdb_ptr; - struct status_pkt status; - struct target_data tdata; + uint8_t cdb[12]; + uint32_t cdb_ptr; + struct status_pkt status; + struct target_data tdata; } shared_data; /* * A word about residuals. @@ -544,7 +562,15 @@ * Pool of SCBs ready to be assigned * commands to execute. */ - struct scb *scbindex[AHC_SCB_MAX + 1];/* Mapping from tag to SCB */ + struct scb *scbindex[256]; /* + * Mapping from tag to SCB. + * As tag identifiers are an + * 8bit value, we provide space + * for all possible tag values. + * Any lookups to entries at or + * above AHC_SCB_MAX_ALLOC will + * always fail. + */ struct hardware_scb *hscbs; /* Array of hardware SCBs */ struct scb *scbarray; /* Array of kernel SCBs */ struct scsi_sense_data *sense; /* Per SCB sense data */ @@ -1127,6 +1153,9 @@ void ahc_freeze_devq(struct ahc_softc *ahc, struct scb *scb); int ahc_reset_channel(struct ahc_softc *ahc, char channel, int initiate_reset); +int ahc_abort_scbs(struct ahc_softc *ahc, int target, + char channel, int lun, u_int tag, + role_t role, uint32_t status); void ahc_restart(struct ahc_softc *ahc); void ahc_calc_residual(struct scb *scb); /*************************** Utility Functions ********************************/ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.reg linux/drivers/scsi/aic7xxx/aic7xxx.reg --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.reg Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx.reg Thu Oct 25 13:53:49 2001 @@ -1,7 +1,8 @@ /* * Aic7xxx register and scratch ram definitions. * - * Copyright (c) 1994-2001 Justin Gibbs. + * Copyright (c) 1994-2001 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,27 +11,35 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.reg,v 1.31 2000/11/10 20:13:40 gibbs Exp $ */ -VERSION = "$Id: //depot/src/aic7xxx/aic7xxx.reg#19 $" +VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#24 $" /* * This file is processed by the aic7xxx_asm utility for use in assembling @@ -328,6 +337,7 @@ access_mode RO mask SCSICNT 0xf0 mask OFFCNT 0x0f + mask U2OFFCNT 0x7f } /* @@ -1004,7 +1014,6 @@ size 4 alias SCB_RESIDUAL_DATACNT alias SCB_CDB_STORE - alias SCB_TARGET_INFO } SCB_RESIDUAL_SGPTR { size 4 @@ -1012,8 +1021,14 @@ SCB_SCSI_STATUS { size 1 } - SCB_CDB_STORE_PAD { - size 3 + SCB_TARGET_PHASES { + size 1 + } + SCB_TARGET_DATA_DIR { + size 1 + } + SCB_TARGET_ITAG { + size 1 } SCB_DATAPTR { size 4 @@ -1464,7 +1479,8 @@ SEQ_FLAGS2 { size 1 - bit SCB_DMA 0x01 + bit SCB_DMA 0x01 + bit TARGET_MSG_PENDING 0x02 } /* * These are reserved registers in the card's scratch ram. Some of @@ -1529,10 +1545,6 @@ const STATUS_BUSY 0x08 const STATUS_QUEUE_FULL 0x28 -const SCB_TARGET_PHASES 0 -const SCB_TARGET_DATA_DIR 1 -const SCB_TARGET_STATUS 2 -const SCB_INITIATOR_TAG 3 const TARGET_DATA_IN 1 /* diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.seq linux/drivers/scsi/aic7xxx/aic7xxx.seq --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx.seq Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx.seq Thu Oct 25 13:53:49 2001 @@ -1,7 +1,8 @@ /* * Adaptec 274x/284x/294x device driver firmware for Linux and FreeBSD. * - * Copyright (c) 1994-2001 Justin Gibbs. + * Copyright (c) 1994-2001 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,28 +11,36 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.seq,v 1.106 2000/11/12 05:19:46 gibbs Exp $ */ -VERSION = "$Id: //depot/src/aic7xxx/aic7xxx.seq#33 $" +VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#37 $" #include "aic7xxx.reg" #include "scsi_message.h" @@ -242,6 +251,7 @@ } else { mov DFDAT, DINDEX; } + and SAVED_LUN, MSG_IDENTIFY_LUNMASK, DINDEX; /* Remember for disconnection decision */ test DINDEX, MSG_IDENTIFY_DISCFLAG jnz . + 2; @@ -257,9 +267,10 @@ * < MSG_IGN_WIDE_RESIDUE. */ add A, -MSG_SIMPLE_Q_TAG, DINDEX; - jnc ident_messages_done; + jnc ident_messages_done_msg_pending; add A, -MSG_IGN_WIDE_RESIDUE, DINDEX; - jc ident_messages_done; + jc ident_messages_done_msg_pending; + /* Store for host */ if ((ahc->features & AHC_CMD_CHAN) != 0) { mov CCSCBRAM, DINDEX; @@ -285,9 +296,23 @@ } mov INITIATOR_TAG, DINDEX; or SEQ_FLAGS, TARGET_CMD_IS_TAGGED; - test SCSISIGI, ATNI jz . + 2; - /* Initiator still wants to give us messages */ - call target_inb; + +ident_messages_done: + /* Terminate the ident list */ + if ((ahc->features & AHC_CMD_CHAN) != 0) { + mvi CCSCBRAM, SCB_LIST_NULL; + } else { + mvi DFDAT, SCB_LIST_NULL; + } + or SEQ_FLAGS, TARG_CMD_PENDING|IDENTIFY_SEEN; + test SEQ_FLAGS2, TARGET_MSG_PENDING + jnz target_mesgout_pending; + test SCSISIGI, ATNI jnz target_mesgout_continue; + jmp target_ITloop; + + +ident_messages_done_msg_pending: + or SEQ_FLAGS2, TARGET_MSG_PENDING; jmp ident_messages_done; /* @@ -299,31 +324,6 @@ cmp RETURN_1, EXIT_MSG_LOOP je target_ITloop; test SSTAT0, SPIORDY jz .; jmp host_target_message_loop; - -ident_messages_done: - /* If ring buffer is full, return busy or queue full */ - if ((ahc->features & AHC_HS_MAILBOX) != 0) { - and A, HOST_TQINPOS, HS_MAILBOX; - } else { - mov A, KERNEL_TQINPOS; - } - cmp TQINPOS, A jne tqinfifo_has_space; - mvi P_STATUS|BSYO call change_phase; - test SEQ_FLAGS, TARGET_CMD_IS_TAGGED jz . + 3; - mvi STATUS_QUEUE_FULL call target_outb; - jmp target_busfree_wait; - mvi STATUS_BUSY call target_outb; - jmp target_busfree_wait; -tqinfifo_has_space: - /* Terminate the ident list */ - if ((ahc->features & AHC_CMD_CHAN) != 0) { - mvi CCSCBRAM, SCB_LIST_NULL; - } else { - mvi DFDAT, SCB_LIST_NULL; - } - or SEQ_FLAGS, TARG_CMD_PENDING|IDENTIFY_SEEN; - test SCSISIGI, ATNI jnz target_mesgout_pending; - jmp target_ITloop; } if ((ahc->flags & AHC_INITIATORROLE) != 0) { @@ -464,13 +464,13 @@ */ test SCB_CONTROL, TAG_ENB jz . + 3; mvi MSG_SIMPLE_Q_TAG call target_outb; - mov SCB_TARGET_INFO[SCB_INITIATOR_TAG] call target_outb; + mov SCB_TARGET_ITAG call target_outb; target_synccmd: /* * Now determine what phases the host wants us * to go through. */ - mov SEQ_FLAGS, SCB_TARGET_INFO[SCB_TARGET_PHASES]; + mov SEQ_FLAGS, SCB_TARGET_PHASES; test SCB_CONTROL, MK_MESSAGE jz target_ITloop; mvi P_MESGIN|BSYO call change_phase; @@ -528,6 +528,24 @@ jmp poll_for_work; target_cmdphase: + /* + * The target has dropped ATN (doesn't want to abort or BDR) + * and we believe this selection to be valid. If the ring + * buffer for new commands is full, return busy or queue full. + */ + if ((ahc->features & AHC_HS_MAILBOX) != 0) { + and A, HOST_TQINPOS, HS_MAILBOX; + } else { + mov A, KERNEL_TQINPOS; + } + cmp TQINPOS, A jne tqinfifo_has_space; + mvi P_STATUS|BSYO call change_phase; + test SEQ_FLAGS, TARGET_CMD_IS_TAGGED jz . + 3; + mvi STATUS_QUEUE_FULL call target_outb; + jmp target_busfree_wait; + mvi STATUS_BUSY call target_outb; + jmp target_busfree_wait; +tqinfifo_has_space: mvi P_COMMAND|BSYO call change_phase; call target_inb; mov A, DINDEX; @@ -576,15 +594,14 @@ * data direction of the DMA. Toggle it for * target transfers. */ - xor LASTPHASE, IOI, SCB_TARGET_INFO[SCB_TARGET_DATA_DIR]; - or SCB_TARGET_INFO[SCB_TARGET_DATA_DIR], BSYO - call change_phase; + xor LASTPHASE, IOI, SCB_TARGET_DATA_DIR; + or SCB_TARGET_DATA_DIR, BSYO call change_phase; jmp p_data; target_sphase: mvi P_STATUS|BSYO call change_phase; mvi LASTPHASE, P_STATUS; - mov SCB_TARGET_INFO[SCB_TARGET_STATUS] call target_outb; + mov SCB_SCSI_STATUS call target_outb; /* XXX Watch for ATN or parity errors??? */ mvi SCSISIGO, P_MESGIN|BSYO; /* MSG_CMDCMPLT is 0, but we can't do an immediate of 0 */ @@ -1318,10 +1335,19 @@ and SEQ_FLAGS, ~DPHASE_PENDING; /* * For data-in phases, wait for any pending acks from the - * initiator before changing phase. + * initiator before changing phase. We only need to + * send Ignore Wide Residue messages for data-in phases. */ test DFCNTRL, DIRECTION jz target_ITloop; test SSTAT1, REQINIT jnz .; + test DATA_COUNT_ODD, 0x1 jz target_ITloop; + test SCSIRATE, WIDEXFER jz target_ITloop; + /* + * Issue an Ignore Wide Residue Message. + */ + mvi P_MESGIN|BSYO call change_phase; + mvi MSG_IGN_WIDE_RESIDUE call target_outb; + mvi 1 call target_outb; jmp target_ITloop; } else { jmp ITloop; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.c Thu Oct 25 13:53:49 2001 @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/aic7xxx/aic7xxx_93cx6.c#8 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_93cx6.c#10 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_93cx6.c,v 1.9 2000/11/10 20:13:41 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.h linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.h Sun Mar 4 14:30:18 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_93cx6.h Thu Oct 25 13:53:49 2001 @@ -12,25 +12,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aic7xxx_93cx6.h#5 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_93cx6.h#7 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_93cx6.h,v 1.8 2000/11/10 20:13:41 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_inline.h linux/drivers/scsi/aic7xxx/aic7xxx_inline.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_inline.h Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_inline.h Thu Oct 25 13:53:49 2001 @@ -2,6 +2,7 @@ * Inline routines shareable across OS platforms. * * Copyright (c) 1994-2001 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +11,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aic7xxx_inline.h#27 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#31 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_inline.h,v 1.8 2000/11/12 05:19:46 gibbs Exp $ */ @@ -482,7 +491,6 @@ ahc_intr(struct ahc_softc *ahc) { u_int intstat; - u_int queuestat; /* * Instead of directly reading the interrupt status register, @@ -491,15 +499,10 @@ * most cases. */ if ((ahc->flags & (AHC_ALL_INTERRUPTS|AHC_EDGE_INTERRUPT)) == 0 - && (queuestat = ahc_check_cmdcmpltqueues(ahc)) != 0) + && (ahc_check_cmdcmpltqueues(ahc) != 0)) intstat = CMDCMPLT; else { intstat = ahc_inb(ahc, INTSTAT); - queuestat = AHC_RUN_QOUTFIFO; -#ifdef AHC_TARGET_MODE - if ((ahc->flags & AHC_TARGETROLE) != 0) - queuestat |= AHC_RUN_TQINFIFO; -#endif } if (intstat & CMDCMPLT) { @@ -515,11 +518,11 @@ */ ahc_flush_device_writes(ahc); #ifdef AHC_TARGET_MODE - if ((queuestat & AHC_RUN_QOUTFIFO) != 0) + if ((ahc->flags & AHC_INITIATORROLE) != 0) #endif ahc_run_qoutfifo(ahc); #ifdef AHC_TARGET_MODE - if ((queuestat & AHC_RUN_TQINFIFO) != 0) + if ((ahc->flags & AHC_TARGETROLE) != 0) ahc_run_tqinfifo(ahc, /*paused*/FALSE); #endif } diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c linux/drivers/scsi/aic7xxx/aic7xxx_linux.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_linux.c Thu Oct 25 13:53:49 2001 @@ -1,7 +1,7 @@ /* * Adaptec AIC7xxx device driver for Linux. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c#72 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_linux.c#79 $ * * Copyright (c) 1994 John Aycock * The University of Calgary Department of Computer Science. @@ -38,8 +38,8 @@ * SCB paging, and other rework of the code. * * -------------------------------------------------------------------------- - * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000 Justin T. Gibbs. - * Copyright (c) 2000 Adaptec Inc. + * Copyright (c) 1994-2000 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,23 +48,31 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * *--------------------------------------------------------------------------- * @@ -79,8 +87,6 @@ * * Form: aic7xxx=extended * aic7xxx=no_reset - * aic7xxx=ultra - * aic7xxx=irq_trigger:[0,1] # 0 edge, 1 level * aic7xxx=verbose * * Daniel M. Eischen, deischen@iworks.InterWorks.org, 1/23/97 @@ -113,15 +119,6 @@ * */ -/* - * The next three defines are user configurable. These should be the only - * defines a user might need to get in here and change. There are other - * defines buried deeper in the code, but those really shouldn't need touched - * under normal conditions. - */ - -#include - #include "aic7xxx_osm.h" #include "aic7xxx_inline.h" @@ -324,83 +321,6 @@ static uint32_t aic7xxx_extended = 0; /* - * The IRQ trigger method used on EISA controllers. Does not effect PCI cards. - * -1 = Use detected settings. - * 0 = Force Edge triggered mode. - * 1 = Force Level triggered mode. - */ -static int aic7xxx_irq_trigger = -1; - -/* - * This variable is used to override the termination settings on a controller. - * This should not be used under normal conditions. However, in the case - * that a controller does not have a readable SEEPROM (so that we can't - * read the SEEPROM settings directly) and that a controller has a buggered - * version of the cable detection logic, this can be used to force the - * correct termination. It is preferable to use the manual termination - * settings in the BIOS if possible, but some motherboard controllers store - * those settings in a format we can't read. In other cases, auto term - * should also work, but the chipset was put together with no auto term - * logic (common on motherboard controllers). In those cases, we have - * 32 bits here to work with. That's good for 8 controllers/channels. The - * bits are organized as 4 bits per channel, with scsi0 getting the lowest - * 4 bits in the int. A 1 in a bit position indicates the termination setting - * that corresponds to that bit should be enabled, a 0 is disabled. - * It looks something like this: - * - * 0x0f = 1111-Single Ended Low Byte Termination on/off - * ||\-Single Ended High Byte Termination on/off - * |\-LVD Low Byte Termination on/off - * \-LVD High Byte Termination on/off - * - * For non-Ultra2 controllers, the upper 2 bits are not important. So, to - * enable both high byte and low byte termination on scsi0, I would need to - * make sure that the override_term variable was set to 0x03 (bits 0011). - * To make sure that all termination is enabled on an Ultra2 controller at - * scsi2 and only high byte termination on scsi1 and high and low byte - * termination on scsi0, I would set override_term=0xf23 (bits 1111 0010 0011) - * - * For the most part, users should never have to use this, that's why I - * left it fairly cryptic instead of easy to understand. If you need it, - * most likely someone will be telling you what your's needs to be set to. - */ -static int aic7xxx_override_term = -1; - -/* - * Certain motherboard chipset controllers tend to screw - * up the polarity of the term enable output pin. Use this variable - * to force the correct polarity for your system. This is a bitfield variable - * similar to the previous one, but this one has one bit per channel instead - * of four. - * 0 = Force the setting to active low. - * 1 = Force setting to active high. - * Most Adaptec cards are active high, several motherboards are active low. - * To force a 2940 card at SCSI 0 to active high and a motherboard 7895 - * controller at scsi1 and scsi2 to active low, and a 2910 card at scsi3 - * to active high, you would need to set stpwlev=0x9 (bits 1001). - * - * People shouldn't need to use this, but if you are experiencing lots of - * SCSI timeout problems, this may help. There is one sure way to test what - * this option needs to be. Using a boot floppy to boot the system, configure - * your system to enable all SCSI termination (in the Adaptec SCSI BIOS) and - * if needed then also pass a value to override_term to make sure that the - * driver is enabling SCSI termination, then set this variable to either 0 - * or 1. When the driver boots, make sure there are *NO* SCSI cables - * connected to your controller. If it finds and inits the controller - * without problem, then the setting you passed to stpwlev was correct. If - * the driver goes into a reset loop and hangs the system, then you need the - * other setting for this variable. If neither setting lets the machine - * boot then you have definite termination problems that may not be fixable. - */ -static int aic7xxx_stpwlev = -1; - -/* - * Set this to non-0 in order to force the driver to panic the kernel - * and print out debugging info on a SCSI abort or reset cycle. - */ -static int aic7xxx_panic_on_abort = 0; - -/* * PCI bus parity checking of the Adaptec controllers. This is somewhat * dubious at best. To my knowledge, this option has never actually * solved a PCI parity problem, but on certain machines with broken PCI @@ -418,15 +338,6 @@ static int aic7xxx_pci_parity = 0; /* - * Set this to a non-0 value to make us dump out the 32 bit instruction - * registers on the card after completing the sequencer download. This - * allows the actual sequencer download to be verified. It is possible - * to use this option and still boot up and run your system. This is - * only intended for debugging purposes. - */ -static int aic7xxx_dump_sequencer = 0; - -/* * Certain newer motherboards have put new PCI based devices into the * IO spaces that used to typically be occupied by VLB or EISA cards. * This overlap can cause these newer motherboards to lock up when scanned @@ -458,13 +369,20 @@ static int aic7xxx_seltime = 0x00; /* - * So that insmod can find the variable and make it point to something + * Certain devices do not perform any aging on commands. Should the + * device be saturated by commands in one portion of the disk, it is + * possible for transactions on far away sectors to never be serviced. + * To handle these devices, we can periodically send an ordered tag to + * force all outstanding transactions to be serviced prior to a new + * transaction. + */ +int aic7xxx_periodic_otag; + +/* + * Module information and settable options. */ #ifdef MODULE static char *aic7xxx = NULL; - -MODULE_PARM(aic7xxx, "s"); - /* * Just in case someone uses commas to separate items on the insmod * command line, we define a dummy buffer here to avoid having insmod @@ -472,6 +390,32 @@ */ static char dummy_buffer[60] = "Please don't trounce on me insmod!!\n"; +MODULE_AUTHOR("Maintainer: Justin T. Gibbs "); +MODULE_DESCRIPTION("Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver"); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,10) +MODULE_LICENSE("Dual BSD/GPL"); +#endif +MODULE_PARM(aic7xxx, "s"); +MODULE_PARM_DESC(aic7xxx, "period delimited, options string. + verbose Enable verbose/diagnostic logging + no_probe Disable EISA/VLB controller probing + no_reset Supress initial bus resets + extended Enable extended geometry on all controllers + periodic_otag Send an ordered tagged transaction periodically + to prevent tag starvation. This may be + required by some older disk drives/RAID arrays. + reverse_scan Sort PCI devices highest Bus/Slot to lowest + tag_info: Set per-target tag depth + seltime: Selection Timeout(0/256ms,1/128ms,2/64ms,3/32ms) + + Sample /etc/modules.conf line: + Enable verbose logging + Disable EISA/VLB probing + Set tag depth on Controller 2/Target 2 to 10 tags + Shorten the selection timeout to 128ms from its default of 256 + + options aic7xxx='\"verbose.no_probe.tag_info:{{}.{}.{..10}}.seltime:1\"' +"); #endif static void ahc_linux_handle_scsi_status(struct ahc_softc *, @@ -661,11 +605,17 @@ sg = (struct scatterlist *)cmd->request_buffer; pci_unmap_sg(ahc->dev_softc, sg, cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); - } else if (cmd->request_bufflen != 0) + } else if (cmd->request_bufflen != 0) { + u_int32_t high_addr; + + high_addr = ahc_le32toh(scb->sg_list[0].len) + & AHC_SG_HIGH_ADDR_MASK; pci_unmap_single(ahc->dev_softc, - ahc_le32toh(scb->sg_list[0].addr), + ahc_le32toh(scb->sg_list[0].addr) + | (((dma_addr_t)high_addr) << 8), cmd->request_bufflen, scsi_to_pci_dma_dir(cmd->sc_data_direction)); + } } static __inline int @@ -722,8 +672,10 @@ { struct ahc_softc *ahc; - TAILQ_FOREACH(ahc, &ahc_tailq, links) { - ahc_shutdown(ahc); + if (event == SYS_DOWN || event == SYS_HALT) { + TAILQ_FOREACH(ahc, &ahc_tailq, links) { + ahc_shutdown(ahc); + } } return (NOTIFY_OK); } @@ -786,22 +738,24 @@ * address). For this reason, we have to reset * our dma mask when doing allocations. */ + if(ahc->dev_softc) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3) - pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF); + pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF); #else - ahc->dev_softc->dma_mask = 0xFFFFFFFF; + ahc->dev_softc->dma_mask = 0xFFFFFFFF; #endif *vaddr = pci_alloc_consistent(ahc->dev_softc, dmat->maxsize, &map->bus_addr); + if (ahc->dev_softc) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3) - pci_set_dma_mask(ahc->dev_softc, ahc->platform_data->hw_dma_mask); + pci_set_dma_mask(ahc->dev_softc, ahc->platform_data->hw_dma_mask); #else - ahc->dev_softc->dma_mask = ahc->platform_data->hw_dma_mask; + ahc->dev_softc->dma_mask = ahc->platform_data->hw_dma_mask; #endif #else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */ /* * At least in 2.2.14, malloc is a slab allocator so all - * allocations are aligned. We assume, for these kernel versions + * allocations are aligned. We assume for these kernel versions * that all allocations will be bellow 4Gig, physically contiguous, * and accessable via DMA by the controller. */ @@ -906,12 +860,20 @@ { char primary_channel; - value = ahc_get_pci_bus(lahc->dev_softc) - - ahc_get_pci_bus(rahc->dev_softc); + if (aic7xxx_reverse_scan != 0) + value = ahc_get_pci_bus(rahc->dev_softc) + - ahc_get_pci_bus(lahc->dev_softc); + else + value = ahc_get_pci_bus(lahc->dev_softc) + - ahc_get_pci_bus(rahc->dev_softc); if (value != 0) break; - value = ahc_get_pci_slot(lahc->dev_softc) - - ahc_get_pci_slot(rahc->dev_softc); + if (aic7xxx_reverse_scan != 0) + value = ahc_get_pci_slot(rahc->dev_softc) + - ahc_get_pci_slot(lahc->dev_softc); + else + value = ahc_get_pci_slot(lahc->dev_softc) + - ahc_get_pci_slot(rahc->dev_softc); if (value != 0) break; /* @@ -1028,7 +990,7 @@ /* * Handle Linux boot parameters. This routine allows for assigning a value * to a parameter with a ':' between the parameter and the value. - * ie. aic7xxx=unpause:0x0A,extended + * ie. aic7xxx=stpwlev:1,extended */ int aic7xxx_setup(char *s) @@ -1043,15 +1005,11 @@ } options[] = { { "extended", &aic7xxx_extended }, { "no_reset", &aic7xxx_no_reset }, - { "irq_trigger", &aic7xxx_irq_trigger }, { "verbose", &aic7xxx_verbose }, { "reverse_scan", &aic7xxx_reverse_scan }, - { "override_term", &aic7xxx_override_term }, - { "stpwlev", &aic7xxx_stpwlev }, { "no_probe", &aic7xxx_no_probe }, - { "panic_on_abort", &aic7xxx_panic_on_abort }, + { "periodic_otag", &aic7xxx_periodic_otag }, { "pci_parity", &aic7xxx_pci_parity }, - { "dump_sequencer", &aic7xxx_dump_sequencer }, { "seltime", &aic7xxx_seltime }, { "tag_info", NULL } }; @@ -1133,7 +1091,8 @@ ahc_linux_pci_probe(template); #endif - aic7770_linux_probe(template); + if (aic7xxx_no_probe == 0) + aic7770_linux_probe(template); /* * Register with the SCSI layer all @@ -1174,8 +1133,8 @@ host->this_id = ahc->our_id; host->irq = ahc->platform_data->irq; host->max_id = (ahc->features & AHC_WIDE) ? 16 : 8; - host->max_channel = (ahc->features & AHC_TWIN) ? 1 : 0; host->max_lun = AHC_NUM_LUNS; + host->max_channel = (ahc->features & AHC_TWIN) ? 1 : 0; ahc_set_unit(ahc, ahc_linux_next_unit()); sprintf(buf, "scsi%d", host->host_no); new_name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT); @@ -1387,7 +1346,7 @@ dev->qfrozen++; } - dev->flags &= ~(AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED); + dev->flags &= ~(AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED|AHC_DEV_PERIODIC_OTAG); if (now_queuing) { if (!was_queuing) { @@ -1399,9 +1358,11 @@ dev->maxtags = AHC_MAX_QUEUE; dev->openings = dev->maxtags - dev->active; } - if (alg == AHC_QUEUE_TAGGED) + if (alg == AHC_QUEUE_TAGGED) { dev->flags |= AHC_DEV_Q_TAGGED; - else + if (aic7xxx_periodic_otag != 0) + dev->flags |= AHC_DEV_PERIODIC_OTAG; + } else dev->flags |= AHC_DEV_Q_BASIC; } else { /* We can only have one opening */ @@ -1548,8 +1509,8 @@ if (tags != 0) { device->queue_depth = tags; ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED); - printf("scsi%d:%d:%d:%d: Tagged Queuing enabled. Depth %d\n", - ahc->platform_data->host->host_no, device->channel, + printf("scsi%d:%c:%d:%d: Tagged Queuing enabled. Depth %d\n", + ahc->platform_data->host->host_no, device->channel + 'A', device->id, device->lun, tags); } else { /* @@ -1770,7 +1731,8 @@ dev->openings--; dev->active++; dev->commands_issued++; - dev->commands_since_idle_or_otag++; + if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0) + dev->commands_since_idle_or_otag++; /* * We only allow one untagged transaction @@ -2324,10 +2286,10 @@ * are not large enough for us to pull the spi3 bits. * In this case, we assume that a device that tells us * they can provide inquiry data that spans the SPI3 - * bits can handle a PPR request. If the inquiry - * request has sufficient buffer space to cover these - * bits, we check them to see if any ppr options are - * available. + * bits and says its SCSI3 can handle a PPR request. + * If the inquiry request has sufficient buffer space to + * cover these bits, we check them to see if any ppr options + * are available. */ if ((sid->additional_length + 4) >= minlen) { if (transferred_len >= minlen @@ -2336,6 +2298,8 @@ if (targ_info->curr.protocol_version > SCSI_REV_2) targ_info->curr.transport_version = 3; + else + ppr_options = 0; } else { ppr_options = 0; } @@ -2536,8 +2500,7 @@ ahc->flags &= ~AHC_ALL_INTERRUPTS; paused = TRUE; - if (bootverbose) - ahc_dump_card_state(ahc); + ahc_dump_card_state(ahc); if ((pending_scb->flags & SCB_ACTIVE) == 0) { printf("%s:%d:%d:%d: Command already completed\n", @@ -2597,7 +2560,7 @@ * Actually re-queue this SCB in an attempt * to select the device before it reconnects. * In either case (selection or reselection), - * we will now issue a the approprate message + * we will now issue the approprate message * to the timed-out device. * * Set the MK_MESSAGE control bit indicating @@ -2672,7 +2635,7 @@ if (paused) ahc_unpause(ahc); if (wait) { - struct timer_list timer; + struct timer_list timer; int ret; ahc_unlock(ahc, &s); @@ -2711,7 +2674,7 @@ error = ahc_linux_queue_recovery_cmd(cmd, SCB_ABORT); if (error != 0) - printf("aic7xxx_abort returns %d\n", error); + printf("aic7xxx_abort returns 0x%x\n", error); return (error); } @@ -2725,7 +2688,7 @@ error = ahc_linux_queue_recovery_cmd(cmd, SCB_DEVICE_RESET); if (error != 0) - printf("aic7xxx_dev_reset returns %d\n", error); + printf("aic7xxx_dev_reset returns 0x%x\n", error); return (error); } @@ -2792,7 +2755,9 @@ sectors = 32; cylinders = disk->capacity / (heads * sectors); - if (disk->device->channel == 0) + if (aic7xxx_extended != 0) + extended = 1; + else if (disk->device->channel == 0) extended = (ahc->flags & AHC_EXTENDED_TRANS_A) != 0; else extended = (ahc->flags & AHC_EXTENDED_TRANS_B) != 0; @@ -2868,8 +2833,6 @@ } } } - -MODULE_LICENSE("Dual BSD/GPL"); #if defined(MODULE) || LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) static Scsi_Host_Template driver_template = AIC7XXX; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_linux_host.h linux/drivers/scsi/aic7xxx/aic7xxx_linux_host.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_linux_host.h Fri May 4 15:16:28 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_linux_host.h Thu Oct 25 13:53:49 2001 @@ -1,7 +1,7 @@ /* * Adaptec AIC7xxx device driver host template for Linux. * - * Copyright (c) 2000 Adaptec Inc. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +10,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux_host.h#3 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_linux_host.h#5 $ */ #ifndef _AIC7XXX_LINUX_HOST_H_ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c Thu Oct 25 13:53:49 2001 @@ -1,7 +1,7 @@ /* * Linux driver attachment glue for PCI based controllers. * - * Copyright (c) 2000, 2001 Adaptec Inc. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +10,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c#23 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_linux_pci.c#27 $ */ #include "aic7xxx_osm.h" @@ -41,6 +49,11 @@ static int ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent); +static int ahc_linux_pci_reserve_io_region(struct ahc_softc *ahc, + u_long *base); +static int ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc, + u_long *bus_addr, + uint8_t **maddr); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) static void ahc_linux_pci_dev_remove(struct pci_dev *pdev); @@ -56,6 +69,7 @@ }, { 0 } }; +MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table); struct pci_driver aic7xxx_pci_driver = { name: "aic7xxx", @@ -88,12 +102,28 @@ static int ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { - char buf[80]; - struct ahc_softc *ahc; - ahc_dev_softc_t pci; - struct ahc_pci_identity *entry; - char *name; - int error; + char buf[80]; + struct ahc_softc *ahc; + ahc_dev_softc_t pci; + struct ahc_pci_identity *entry; + char *name; + int error; + + /* + * Some BIOSen report the same device multiple times. + */ + TAILQ_FOREACH(ahc, &ahc_tailq, links) { + struct pci_dev *probed_pdev; + + probed_pdev = ahc->dev_softc; + if (probed_pdev->bus->number == pdev->bus->number + && probed_pdev->devfn == pdev->devfn) + break; + } + if (ahc != NULL) { + /* Skip duplicate. */ + return (-ENODEV); + } pci = pdev; entry = ahc_find_pci_device(pci); @@ -129,14 +159,13 @@ && pci_set_dma_mask(pdev, 0x7FFFFFFFFFULL) == 0) { #else && ahc_linux_get_memsize() > 0x80000000) { + ahc->dev_softc->dma_mask = - (bus_addr_t)(0x7FFFFFFFFFULL - & ((1ULL << (sizeof(bus_addr_t) * 8))-1)); + (bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0); #endif ahc->flags |= AHC_39BIT_ADDRESSING; ahc->platform_data->hw_dma_mask = - (bus_addr_t)(0x7FFFFFFFFFULL - & ((1ULL << (sizeof(bus_addr_t) * 8))-1)); + (bus_addr_t)(0x7FFFFFFFFFULL & (bus_addr_t)~0); } #endif ahc->dev_softc = pci; @@ -172,28 +201,10 @@ pdev = NULL; class = PCI_CLASS_STORAGE_SCSI << 8; while ((pdev = pci_find_class(class, pdev)) != NULL) { - struct ahc_softc *ahc; ahc_dev_softc_t pci; int error; pci = pdev; - - /* - * Some BIOSen report the same device multiple times. - */ - TAILQ_FOREACH(ahc, &ahc_tailq, links) { - struct pci_dev *probed_pdev; - - probed_pdev = ahc->dev_softc; - if (probed_pdev->bus->number == pdev->bus->number - && probed_pdev->devfn == pdev->devfn) - break; - } - if (ahc != NULL) { - /* Skip duplicate. */ - continue; - } - error = ahc_linux_pci_dev_probe(pdev, /*pci_devid*/NULL); if (error == 0) found++; @@ -202,22 +213,40 @@ #endif } -int -ahc_pci_map_registers(struct ahc_softc *ahc) +static int +ahc_linux_pci_reserve_io_region(struct ahc_softc *ahc, u_long *base) { - uint32_t command; - u_long base; -#ifdef MMAPIO - u_long start; - u_long base_page; - u_long base_offset; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) + *base = pci_resource_start(ahc->dev_softc, 0); +#else + *base = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4); + *base &= PCI_BASE_ADDRESS_IO_MASK; #endif - uint8_t *maddr; + if (base == 0) + return (ENOMEM); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) + if (check_region(*base, 256) != 0) + return (ENOMEM); + else + request_region(*base, 256, "aic7xxx"); +#else + if (request_region(*base, 256, "aic7xxx") == 0) + return (ENOMEM); +#endif + return (0); +} - command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4); - base = 0; - maddr = NULL; -#ifdef MMAPIO +static int +ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc, + u_long *bus_addr, + uint8_t **maddr) +{ + u_long start; + u_long base_page; + u_long base_offset; + int error; + + error = 0; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) start = pci_resource_start(ahc->dev_softc, 1); base_page = start & PAGE_MASK; @@ -229,43 +258,70 @@ base_offset -= base_page; #endif if (start != 0) { - ahc->platform_data->mem_busaddr = start; + *bus_addr = start; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) - if (request_mem_region(start, 0x1000, "aic7xxx") == 0) { - printf("aic7xxx: PCI%d:%d:%d MEM region 0x%lx " - "in use. Cannot map device.\n", + if (request_mem_region(start, 0x1000, "aic7xxx") == 0) + error = ENOMEM; +#endif + if (error == 0) { + *maddr = ioremap_nocache(base_page, base_offset + 256); + if (*maddr == NULL) + error = ENOMEM; + else + *maddr += base_offset; + } + } else + error = ENOMEM; + return (error); +} + +int +ahc_pci_map_registers(struct ahc_softc *ahc) +{ + uint32_t command; + u_long base; + uint8_t *maddr; + int error; + int io_error; + + /* + * We always reserve both our register spaces to avoid + * other devices claiming them. + */ + command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4); + command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN); + base = 0; + maddr = NULL; +#ifdef MMAPIO + error = ahc_linux_pci_reserve_mem_region(ahc, &base, &maddr); + if (error == 0) { + ahc->platform_data->mem_busaddr = base; + ahc->tag = BUS_SPACE_MEMIO; + ahc->bsh.maddr = maddr; + ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, + command | PCIM_CMD_MEMEN, 4); + + /* + * Do a quick test to see if memory mapped + * I/O is functioning correctly. + */ + if (ahc_inb(ahc, HCNTRL) == 0xFF) { + + printf("aic7xxx: PCI Device %d:%d:%d " + "failed memory mapped test\n", ahc_get_pci_bus(ahc->dev_softc), ahc_get_pci_slot(ahc->dev_softc), - ahc_get_pci_function(ahc->dev_softc), - start); + ahc_get_pci_function(ahc->dev_softc)); + maddr = NULL; } else -#endif - maddr = ioremap_nocache(base_page, base_offset + 256); - if (maddr != NULL) { - ahc->tag = BUS_SPACE_MEMIO; - ahc->bsh.maddr = maddr + base_offset; command |= PCIM_CMD_MEMEN; - ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, - command, 4); - - /* - * Do a quick test to see if memory mapped - * I/O is functioning correctly. - */ - if (ahc_inb(ahc, HCNTRL) == 0xFF) { - printf("aic7xxx: PCI Device %d:%d:%d " - "failed memory mapped test\n", - ahc_get_pci_bus(ahc->dev_softc), - ahc_get_pci_slot(ahc->dev_softc), - ahc_get_pci_function(ahc->dev_softc)); - iounmap((void *)base_page); - maddr = NULL; - } else { - command &= ~PCIM_CMD_PORTEN; - ahc_pci_write_config(ahc->dev_softc, - PCIR_COMMAND, command, 4); - } - } + } else { + printf("aic7xxx: PCI%d:%d:%d MEM region 0x%lx " + "unavailable. Cannot map device.\n", + ahc_get_pci_bus(ahc->dev_softc), + ahc_get_pci_slot(ahc->dev_softc), + ahc_get_pci_function(ahc->dev_softc), + base); } #endif @@ -274,46 +330,25 @@ * complain about our ioport conflicting with * another device if we are going to use it. */ + io_error = ahc_linux_pci_reserve_io_region(ahc, &base); if (maddr == NULL) { - ahc->tag = BUS_SPACE_PIO; - command &= ~(PCIM_CMD_MEMEN|PCIM_CMD_PORTEN); - ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) - base = pci_resource_start(ahc->dev_softc, 0); -#else - base = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4); - base &= PCI_BASE_ADDRESS_IO_MASK; -#endif - if (base == 0) { - printf("aic7xxx: PCI%d:%d:%d No mapping available. " - "Cannot map device.\n", - ahc_get_pci_bus(ahc->dev_softc), - ahc_get_pci_slot(ahc->dev_softc), - ahc_get_pci_function(ahc->dev_softc)); - return (ENXIO); - } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) - if (check_region(base, 256) != 0) { -#else - if (request_region(base, 256, "aic7xxx") == 0) { -#endif + error = io_error; + if (error != 0) { printf("aic7xxx: PCI%d:%d:%d IO region 0x%lx[0..255] " - "in use. Cannot map device.\n", + "unavailable. Cannot map device.\n", ahc_get_pci_bus(ahc->dev_softc), ahc_get_pci_slot(ahc->dev_softc), ahc_get_pci_function(ahc->dev_softc), base); base = 0; - return (EBUSY); + } else { + ahc->tag = BUS_SPACE_PIO; + ahc->bsh.ioport = base; + command |= PCIM_CMD_PORTEN; } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) - request_region(base, 256, "aic7xxx"); -#endif - ahc->bsh.ioport = base; - command |= PCIM_CMD_PORTEN; - ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4); } - return (0); + ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4); + return (error); } int diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h linux/drivers/scsi/aic7xxx/aic7xxx_osm.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h Sun Sep 23 11:40:59 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_osm.h Thu Oct 25 13:53:49 2001 @@ -18,9 +18,9 @@ * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#65 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#72 $ * - * Copyright (c) 2000, 2001 Adaptec Inc. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,25 +29,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#65 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_linux.h#72 $ * */ #ifndef _AIC7XXX_LINUX_H_ @@ -61,6 +69,8 @@ #include #include #include +#include +#include #ifndef KERNEL_VERSION #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z)) @@ -103,6 +113,23 @@ #define ahc_le32toh(x) le32_to_cpu(x) #define ahc_le64toh(x) le64_to_cpu(x) +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif + +#ifndef BYTE_ORDER +#if defined(__BIG_ENDIAN) +#define BYTE_ORDER BIG_ENDIAN +#endif +#if defined(__LITTLE_ENDIAN) +#define BYTE_ORDER LITTLE_ENDIAN +#endif +#endif /* BYTE_ORDER */ + /************************* Configuration Data *********************************/ extern int aic7xxx_no_probe; extern int aic7xxx_detect_complete; @@ -376,7 +403,7 @@ #include #endif -#define AIC7XXX_DRIVER_VERSION "6.2.1" +#define AIC7XXX_DRIVER_VERSION "6.2.4" /**************************** Front End Queues ********************************/ /* @@ -422,7 +449,8 @@ AHC_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */ AHC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */ AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */ - AHC_DEV_Q_TAGGED = 0x20 /* Allow full SCSI2 command queueing */ + AHC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */ + AHC_DEV_PERIODIC_OTAG = 0x40 /* Send OTAG to prevent starvation */ } ahc_dev_flags; struct ahc_linux_target; @@ -491,10 +519,14 @@ /* * How many transactions have been queued * without the device going idle. We use - * this statistic to + * this statistic to determine when to issue + * an ordered tag to prevent transaction + * starvation. This statistic is only updated + * if the AHC_DEV_PERIODIC_OTAG flag is set + * on this device. */ u_int commands_since_idle_or_otag; -#define AHC_OTAG_THRESH 250 +#define AHC_OTAG_THRESH 500 int lun; struct ahc_linux_target *target; @@ -580,7 +612,7 @@ /***************************** Low Level I/O **********************************/ -#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__) || defined(__x86_64__) +#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__) #define MMAPIO #endif @@ -594,19 +626,19 @@ static __inline uint8_t ahc_inb(struct ahc_softc * ahc, long port) { -#ifdef MMAPIO uint8_t x; +#ifdef MMAPIO if (ahc->tag == BUS_SPACE_MEMIO) { x = readb(ahc->bsh.maddr + port); } else { x = inb(ahc->bsh.ioport + port); } - mb(); - return (x); #else - return (inb(ahc->bsh.ioport + port)); + x = inb(ahc->bsh.ioport + port); #endif + mb(); + return (x); } static __inline void @@ -618,10 +650,10 @@ } else { outb(val, ahc->bsh.ioport + port); } - mb(); #else outb(val, ahc->bsh.ioport + port); #endif + mb(); } static __inline void diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_pci.c linux/drivers/scsi/aic7xxx/aic7xxx_pci.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_pci.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_pci.c Thu Oct 25 13:53:49 2001 @@ -3,7 +3,8 @@ * 3940, 2940, aic7895, aic7890, aic7880, * aic7870, aic7860 and aic7850 SCSI controllers * - * Copyright (c) 1995-2000 Justin T. Gibbs + * Copyright (c) 1994-2001 Justin T. Gibbs. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -11,26 +12,34 @@ * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aic7xxx_pci.c#28 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#32 $ * * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_pci.c,v 1.6 2000/11/10 20:13:41 gibbs Exp $ */ @@ -137,7 +146,7 @@ #define DEVID_9005_TYPE(id) ((id) & 0xF) #define DEVID_9005_TYPE_HBA 0x0 /* Standard Card */ #define DEVID_9005_TYPE_AAA 0x3 /* RAID Card */ -#define DEVID_9005_TYPE_SISL 0x5 /* Low Cost Card */ +#define DEVID_9005_TYPE_SISL 0x5 /* Container ROMB */ #define DEVID_9005_TYPE_MB 0xF /* On Motherboard */ #define DEVID_9005_MAXRATE(id) (((id) & 0x30) >> 4) @@ -645,6 +654,8 @@ #define CACHESIZE 0x0000003ful /* only 5 bits */ #define LATTIME 0x0000ff00ul +static int ahc_9005_subdevinfo_valid(uint16_t vendor, uint16_t device, + uint16_t subvendor, uint16_t subdevice); static int ahc_ext_scbram_present(struct ahc_softc *ahc); static void ahc_scbram_config(struct ahc_softc *ahc, int enable, int pcheck, int fast, int large); @@ -674,6 +685,40 @@ static void write_brdctl(struct ahc_softc *ahc, uint8_t value); static uint8_t read_brdctl(struct ahc_softc *ahc); +static int +ahc_9005_subdevinfo_valid(uint16_t device, uint16_t vendor, + uint16_t subdevice, uint16_t subvendor) +{ + int result; + + /* Default to invalid. */ + result = 0; + if (vendor == 0x9005 + && subvendor == 0x9005 + && subdevice != device + && SUBID_9005_TYPE_KNOWN(subdevice) != 0) { + + switch (SUBID_9005_TYPE(subdevice)) { + case SUBID_9005_TYPE_MB: + break; + case SUBID_9005_TYPE_CARD: + case SUBID_9005_TYPE_LCCARD: + /* + * Currently only trust Adaptec cards to + * get the sub device info correct. + */ + if (DEVID_9005_TYPE(device) == DEVID_9005_TYPE_HBA) + result = 1; + break; + case SUBID_9005_TYPE_RAID: + break; + default: + break; + } + } + return (result); +} + struct ahc_pci_identity * ahc_find_pci_device(ahc_dev_softc_t pci) { @@ -702,9 +747,7 @@ * ID as valid. */ if (ahc_get_pci_function(pci) > 0 - && subvendor == 0x9005 - && subdevice != device - && SUBID_9005_TYPE_KNOWN(subdevice) != 0 + && ahc_9005_subdevinfo_valid(vendor, device, subvendor, subdevice) && SUBID_9005_MFUNCENB(subdevice) == 0) return (NULL); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c linux/drivers/scsi/aic7xxx/aic7xxx_proc.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_proc.c Thu Oct 25 13:53:49 2001 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001 Adaptec Inc. + * Copyright (c) 2000-2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -8,28 +8,36 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * * String handling code courtesy of Gerard Roudier's * sym driver. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#11 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#13 $ */ #include "aic7xxx_osm.h" #include "aic7xxx_inline.h" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_reg.h linux/drivers/scsi/aic7xxx/aic7xxx_reg.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_reg.h Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_reg.h Thu Oct 25 13:53:49 2001 @@ -2,8 +2,8 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $Id: //depot/src/aic7xxx/aic7xxx.seq#33 $ - * $Id: //depot/src/aic7xxx/aic7xxx.reg#19 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#37 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#24 $ */ #define SCSISEQ 0x00 @@ -127,6 +127,7 @@ #define SSTAT3 0x0e #define SCSICNT 0xf0 +#define U2OFFCNT 0x7f #define OFFCNT 0x0f #define SCSIID_ULTRA2 0x0f @@ -331,6 +332,7 @@ #define INITIATOR_TAG 0x56 #define SEQ_FLAGS2 0x57 +#define TARGET_MSG_PENDING 0x02 #define SCB_DMA 0x01 #define SCSICONF 0x5a @@ -541,13 +543,16 @@ #define SCB_CDB_PTR 0xa0 #define SCB_RESIDUAL_DATACNT 0xa0 #define SCB_CDB_STORE 0xa0 -#define SCB_TARGET_INFO 0xa0 #define SCB_RESIDUAL_SGPTR 0xa4 #define SCB_SCSI_STATUS 0xa8 -#define SCB_CDB_STORE_PAD 0xa9 +#define SCB_TARGET_PHASES 0xa9 + +#define SCB_TARGET_DATA_DIR 0xaa + +#define SCB_TARGET_ITAG 0xab #define SCB_DATAPTR 0xac @@ -677,9 +682,6 @@ #define SG_CACHE_PRE 0xfc -#define SCB_INITIATOR_TAG 0x03 -#define SCB_TARGET_DATA_DIR 0x01 -#define SCB_TARGET_PHASES 0x00 #define MAX_OFFSET_ULTRA2 0x7f #define MAX_OFFSET_16BIT 0x08 #define BUS_8_BIT 0x00 @@ -692,7 +694,6 @@ #define TID_SHIFT 0x04 #define SCB_DOWNLOAD_SIZE_64 0x30 #define HOST_MAILBOX_SHIFT 0x04 -#define SCB_TARGET_STATUS 0x02 #define CMD_GROUP_CODE_SHIFT 0x05 #define CCSGRAM_MAXSEGS 0x10 #define SCB_LIST_NULL 0xff diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_seq.h linux/drivers/scsi/aic7xxx/aic7xxx_seq.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aic7xxx_seq.h Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aic7xxx_seq.h Thu Oct 25 13:53:49 2001 @@ -2,13 +2,13 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $Id: //depot/src/aic7xxx/aic7xxx.seq#33 $ - * $Id: //depot/src/aic7xxx/aic7xxx.reg#19 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#37 $ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#24 $ */ static uint8_t seqprog[] = { 0xb2, 0x00, 0x00, 0x08, 0xf7, 0x11, 0x22, 0x08, - 0x00, 0x65, 0xde, 0x59, + 0x00, 0x65, 0xe0, 0x59, 0xf7, 0x01, 0x02, 0x08, 0xff, 0x6a, 0x24, 0x08, 0x40, 0x00, 0x40, 0x68, @@ -21,15 +21,15 @@ 0x01, 0x4d, 0xc8, 0x30, 0x00, 0x4c, 0x12, 0x70, 0x01, 0x39, 0xa2, 0x30, - 0x00, 0x6a, 0xa6, 0x5e, + 0x00, 0x6a, 0xb2, 0x5e, 0x01, 0x51, 0x20, 0x31, 0x01, 0x57, 0xae, 0x00, 0x0d, 0x6a, 0x76, 0x00, - 0x00, 0x51, 0xf8, 0x5d, + 0x00, 0x51, 0x04, 0x5e, 0x01, 0x51, 0xc8, 0x30, - 0x00, 0x39, 0xd8, 0x60, + 0x00, 0x39, 0xc8, 0x60, 0x00, 0xbb, 0x30, 0x70, - 0xc1, 0x6a, 0xbe, 0x5e, + 0xc1, 0x6a, 0xca, 0x5e, 0x01, 0xbf, 0x72, 0x30, 0x01, 0x40, 0x7e, 0x31, 0x01, 0x90, 0x80, 0x30, @@ -37,22 +37,22 @@ 0x01, 0x4d, 0x9a, 0x18, 0xfe, 0x57, 0xae, 0x08, 0x01, 0x40, 0x20, 0x31, - 0x00, 0x65, 0xdc, 0x58, + 0x00, 0x65, 0xcc, 0x58, 0x60, 0x0b, 0x40, 0x78, 0x08, 0x6a, 0x18, 0x00, 0x08, 0x11, 0x22, 0x00, 0x60, 0x0b, 0x00, 0x78, - 0x40, 0x0b, 0x0c, 0x69, - 0x80, 0x0b, 0xc6, 0x78, + 0x40, 0x0b, 0xfc, 0x68, + 0x80, 0x0b, 0xb6, 0x78, 0x20, 0x6a, 0x16, 0x00, 0xa4, 0x6a, 0x06, 0x00, 0x08, 0x3c, 0x78, 0x00, 0x01, 0x50, 0xc8, 0x30, 0xe0, 0x6a, 0xcc, 0x00, - 0x48, 0x6a, 0xe2, 0x5d, + 0x48, 0x6a, 0xee, 0x5d, 0x01, 0x6a, 0xdc, 0x01, 0x88, 0x6a, 0xcc, 0x00, - 0x48, 0x6a, 0xe2, 0x5d, + 0x48, 0x6a, 0xee, 0x5d, 0x01, 0x6a, 0x26, 0x01, 0xf0, 0x19, 0x7a, 0x08, 0x0f, 0x18, 0xc8, 0x08, @@ -63,81 +63,73 @@ 0x80, 0x3d, 0x7a, 0x00, 0x01, 0x3d, 0xd8, 0x31, 0x01, 0x3d, 0x32, 0x31, - 0x10, 0x03, 0x56, 0x79, - 0x00, 0x65, 0x04, 0x59, - 0x80, 0x66, 0xa2, 0x78, + 0x10, 0x03, 0x46, 0x79, + 0x00, 0x65, 0xf4, 0x58, + 0x80, 0x66, 0xae, 0x78, 0x01, 0x66, 0xd8, 0x31, 0x01, 0x66, 0x32, 0x31, - 0x40, 0x66, 0x80, 0x68, + 0x3f, 0x66, 0x7c, 0x08, + 0x40, 0x66, 0x82, 0x68, 0x01, 0x3c, 0x78, 0x00, - 0x10, 0x03, 0xaa, 0x78, - 0x00, 0x65, 0x04, 0x59, + 0x10, 0x03, 0x9e, 0x78, + 0x00, 0x65, 0xf4, 0x58, 0xe0, 0x66, 0xc8, 0x18, 0x00, 0x65, 0xaa, 0x50, 0xdd, 0x66, 0xc8, 0x18, 0x00, 0x65, 0xaa, 0x48, 0x01, 0x66, 0xd8, 0x31, 0x01, 0x66, 0x32, 0x31, - 0x10, 0x03, 0x56, 0x79, - 0x00, 0x65, 0x04, 0x59, + 0x10, 0x03, 0x46, 0x79, + 0x00, 0x65, 0xf4, 0x58, 0x01, 0x66, 0xd8, 0x31, 0x01, 0x66, 0x32, 0x31, 0x01, 0x66, 0xac, 0x30, 0x40, 0x3c, 0x78, 0x00, - 0x10, 0x03, 0xa0, 0x78, - 0x00, 0x65, 0x04, 0x59, - 0x00, 0x65, 0xaa, 0x40, - 0x61, 0x6a, 0xbe, 0x5e, - 0x08, 0x51, 0x2e, 0x71, - 0x02, 0x0b, 0xa6, 0x78, - 0x00, 0x65, 0xa2, 0x40, - 0x80, 0x86, 0xc8, 0x08, - 0x01, 0x4f, 0xc8, 0x30, - 0x00, 0x50, 0xbc, 0x60, - 0xc4, 0x6a, 0x54, 0x5d, - 0x40, 0x3c, 0xb8, 0x78, - 0x28, 0x6a, 0x6a, 0x5d, - 0x00, 0x65, 0x54, 0x41, - 0x08, 0x6a, 0x6a, 0x5d, - 0x00, 0x65, 0x54, 0x41, 0xff, 0x6a, 0xd8, 0x01, 0xff, 0x6a, 0x32, 0x01, 0x90, 0x3c, 0x78, 0x00, - 0x10, 0x03, 0x4a, 0x69, - 0x00, 0x65, 0x2e, 0x41, + 0x02, 0x57, 0x3a, 0x69, + 0x10, 0x03, 0x38, 0x69, + 0x00, 0x65, 0x1e, 0x41, + 0x02, 0x57, 0xae, 0x00, + 0x00, 0x65, 0x9e, 0x40, + 0x61, 0x6a, 0xca, 0x5e, + 0x08, 0x51, 0x1e, 0x71, + 0x02, 0x0b, 0xb2, 0x78, + 0x00, 0x65, 0xae, 0x40, 0x1a, 0x01, 0x02, 0x00, 0xf0, 0x19, 0x7a, 0x08, 0x0f, 0x0f, 0xc8, 0x08, 0x0f, 0x05, 0xc8, 0x08, 0x00, 0x3d, 0x7a, 0x00, - 0x08, 0x1f, 0xd4, 0x78, + 0x08, 0x1f, 0xc4, 0x78, 0x80, 0x3d, 0x7a, 0x00, 0x20, 0x6a, 0x16, 0x00, - 0x00, 0x65, 0xbe, 0x41, - 0x00, 0x65, 0x98, 0x5e, + 0x00, 0x65, 0xc0, 0x41, + 0x00, 0x65, 0xa4, 0x5e, 0x00, 0x65, 0x12, 0x40, - 0x20, 0x11, 0xe2, 0x68, + 0x20, 0x11, 0xd2, 0x68, 0x20, 0x6a, 0x18, 0x00, 0x20, 0x11, 0x22, 0x00, 0xf7, 0x1f, 0xca, 0x08, - 0x80, 0xb9, 0xe8, 0x78, + 0x80, 0xb9, 0xd8, 0x78, 0x08, 0x65, 0xca, 0x00, 0x01, 0x65, 0x3e, 0x30, 0x01, 0xb9, 0x1e, 0x30, 0x7f, 0xb9, 0x0a, 0x08, 0x01, 0xb9, 0x0a, 0x30, 0x01, 0x54, 0xca, 0x30, - 0x80, 0xb8, 0xf6, 0x78, + 0x80, 0xb8, 0xe6, 0x78, 0x80, 0x65, 0xca, 0x00, 0x01, 0x65, 0x00, 0x34, 0x01, 0x54, 0x00, 0x34, 0x1a, 0x01, 0x02, 0x00, - 0x08, 0xb8, 0x00, 0x79, + 0x08, 0xb8, 0xf0, 0x78, 0x20, 0x01, 0x02, 0x00, 0x02, 0xbd, 0x08, 0x34, 0x01, 0xbd, 0x08, 0x34, 0x08, 0x01, 0x02, 0x00, - 0x02, 0x0b, 0x06, 0x79, + 0x02, 0x0b, 0xf6, 0x78, 0xf7, 0x01, 0x02, 0x08, 0x01, 0x06, 0xcc, 0x34, 0xb2, 0x00, 0x00, 0x08, @@ -146,105 +138,114 @@ 0x01, 0xbf, 0x80, 0x30, 0x01, 0xb9, 0x7a, 0x30, 0x01, 0xba, 0x7c, 0x30, - 0x00, 0x65, 0xfa, 0x58, - 0x80, 0x0b, 0xba, 0x79, - 0xe4, 0x6a, 0x54, 0x5d, - 0x80, 0xba, 0x6a, 0x5d, - 0x20, 0xb8, 0x26, 0x79, - 0x20, 0x6a, 0x6a, 0x5d, - 0x00, 0xa3, 0x6a, 0x5d, - 0x01, 0xa0, 0x78, 0x30, - 0x10, 0xb8, 0x2e, 0x79, - 0xe4, 0x6a, 0x54, 0x5d, - 0x00, 0x65, 0xa2, 0x40, - 0x10, 0x03, 0x46, 0x69, - 0x08, 0x3c, 0x62, 0x69, - 0x04, 0x3c, 0x88, 0x69, - 0x02, 0x3c, 0x8e, 0x69, - 0x01, 0x3c, 0x4c, 0x79, + 0x00, 0x65, 0xea, 0x58, + 0x80, 0x0b, 0xbc, 0x79, + 0xe4, 0x6a, 0x60, 0x5d, + 0x80, 0xba, 0x76, 0x5d, + 0x20, 0xb8, 0x16, 0x79, + 0x20, 0x6a, 0x76, 0x5d, + 0x00, 0xab, 0x76, 0x5d, + 0x01, 0xa9, 0x78, 0x30, + 0x10, 0xb8, 0x1e, 0x79, + 0xe4, 0x6a, 0x60, 0x5d, + 0x00, 0x65, 0xae, 0x40, + 0x10, 0x03, 0x36, 0x69, + 0x08, 0x3c, 0x52, 0x69, + 0x04, 0x3c, 0x8a, 0x69, + 0x02, 0x3c, 0x90, 0x69, + 0x01, 0x3c, 0x3c, 0x79, 0x01, 0x6a, 0xa2, 0x30, - 0x00, 0x65, 0x9a, 0x59, - 0x04, 0x51, 0x3c, 0x61, - 0x00, 0x6a, 0xa6, 0x5e, + 0x00, 0x65, 0x9c, 0x59, + 0x04, 0x51, 0x2c, 0x61, + 0x00, 0x6a, 0xb2, 0x5e, 0x0d, 0x6a, 0x76, 0x00, - 0x00, 0xbb, 0xf8, 0x5d, - 0x00, 0x65, 0x26, 0x41, + 0x00, 0xbb, 0x04, 0x5e, + 0x00, 0x65, 0x16, 0x41, 0xa4, 0x6a, 0x06, 0x00, - 0x00, 0x65, 0x04, 0x59, - 0x00, 0x65, 0xa2, 0x40, - 0xe4, 0x6a, 0x54, 0x5d, - 0x20, 0x3c, 0x52, 0x79, - 0x02, 0x6a, 0x6a, 0x5d, - 0x04, 0x6a, 0x6a, 0x5d, - 0x01, 0x03, 0x54, 0x69, + 0x00, 0x65, 0xf4, 0x58, + 0x00, 0x65, 0xae, 0x40, + 0xe4, 0x6a, 0x60, 0x5d, + 0x20, 0x3c, 0x42, 0x79, + 0x02, 0x6a, 0x76, 0x5d, + 0x04, 0x6a, 0x76, 0x5d, + 0x01, 0x03, 0x44, 0x69, 0xf7, 0x11, 0x22, 0x08, 0xff, 0x6a, 0x24, 0x08, 0xff, 0x6a, 0x06, 0x08, 0x01, 0x6a, 0x7e, 0x00, - 0x00, 0x65, 0x9a, 0x59, + 0x00, 0x65, 0x9c, 0x59, 0x00, 0x65, 0x04, 0x40, - 0x84, 0x6a, 0x54, 0x5d, - 0x00, 0x65, 0x04, 0x59, + 0x80, 0x86, 0xc8, 0x08, + 0x01, 0x4f, 0xc8, 0x30, + 0x00, 0x50, 0x64, 0x61, + 0xc4, 0x6a, 0x60, 0x5d, + 0x40, 0x3c, 0x60, 0x79, + 0x28, 0x6a, 0x76, 0x5d, + 0x00, 0x65, 0x44, 0x41, + 0x08, 0x6a, 0x76, 0x5d, + 0x00, 0x65, 0x44, 0x41, + 0x84, 0x6a, 0x60, 0x5d, + 0x00, 0x65, 0xf4, 0x58, 0x01, 0x66, 0xc8, 0x30, 0x01, 0x64, 0xd8, 0x31, 0x01, 0x64, 0x32, 0x31, 0x5b, 0x64, 0xc8, 0x28, 0x30, 0x64, 0xca, 0x18, 0x01, 0x6c, 0xc8, 0x30, - 0xff, 0x64, 0x84, 0x79, + 0xff, 0x64, 0x86, 0x79, 0x08, 0x01, 0x02, 0x00, - 0x02, 0x0b, 0x76, 0x79, - 0x01, 0x64, 0x7c, 0x61, + 0x02, 0x0b, 0x78, 0x79, + 0x01, 0x64, 0x7e, 0x61, 0xf7, 0x01, 0x02, 0x08, 0x01, 0x06, 0xd8, 0x31, 0x01, 0x06, 0x32, 0x31, 0xff, 0x64, 0xc8, 0x18, - 0xff, 0x64, 0x76, 0x69, + 0xff, 0x64, 0x78, 0x69, 0xf7, 0x3c, 0x78, 0x08, - 0x00, 0x65, 0x2e, 0x41, - 0x40, 0xa1, 0x7e, 0x10, - 0x04, 0xa1, 0x54, 0x5d, - 0x00, 0x65, 0x50, 0x42, - 0xc4, 0x6a, 0x54, 0x5d, + 0x00, 0x65, 0x1e, 0x41, + 0x40, 0xaa, 0x7e, 0x10, + 0x04, 0xaa, 0x60, 0x5d, + 0x00, 0x65, 0x52, 0x42, + 0xc4, 0x6a, 0x60, 0x5d, 0xc0, 0x6a, 0x7e, 0x00, - 0x00, 0xa2, 0x6a, 0x5d, + 0x00, 0xa8, 0x76, 0x5d, 0xe4, 0x6a, 0x06, 0x00, - 0x00, 0x6a, 0x6a, 0x5d, - 0x00, 0x65, 0x54, 0x41, - 0x10, 0x3c, 0x9e, 0x69, - 0x00, 0xbb, 0x74, 0x44, + 0x00, 0x6a, 0x76, 0x5d, + 0x00, 0x65, 0x44, 0x41, + 0x10, 0x3c, 0xa0, 0x69, + 0x00, 0xbb, 0x80, 0x44, 0x18, 0x6a, 0xda, 0x01, 0x01, 0x69, 0xd8, 0x31, 0x1c, 0x6a, 0xd0, 0x01, 0x09, 0xee, 0xdc, 0x01, - 0x80, 0xee, 0xa6, 0x79, + 0x80, 0xee, 0xa8, 0x79, 0xff, 0x6a, 0xdc, 0x09, 0x01, 0x93, 0x26, 0x01, 0x03, 0x6a, 0x2a, 0x01, 0x01, 0x69, 0x32, 0x31, - 0x1c, 0x6a, 0xc6, 0x5d, + 0x1c, 0x6a, 0xd2, 0x5d, 0x0a, 0x93, 0x26, 0x01, - 0x00, 0x65, 0x8e, 0x5e, + 0x00, 0x65, 0x9a, 0x5e, 0x01, 0x50, 0xa0, 0x18, 0x02, 0x6a, 0x22, 0x05, 0x80, 0x6a, 0x74, 0x00, 0x80, 0x3c, 0x78, 0x00, - 0x00, 0x65, 0xbe, 0x5d, + 0x00, 0x65, 0xca, 0x5d, 0x01, 0x3f, 0xc8, 0x30, - 0xbf, 0x64, 0x50, 0x7a, - 0x80, 0x64, 0x9a, 0x73, - 0xa0, 0x64, 0xf8, 0x73, - 0xc0, 0x64, 0xec, 0x73, - 0xe0, 0x64, 0x28, 0x74, - 0x01, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0xbe, 0x41, + 0xbf, 0x64, 0x52, 0x7a, + 0x80, 0x64, 0xa6, 0x73, + 0xa0, 0x64, 0x04, 0x74, + 0xc0, 0x64, 0xf8, 0x73, + 0xe0, 0x64, 0x34, 0x74, + 0x01, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0xc0, 0x41, 0xf7, 0x11, 0x22, 0x08, 0x01, 0x06, 0xd4, 0x30, 0xff, 0x6a, 0x24, 0x08, 0xf7, 0x01, 0x02, 0x08, - 0x09, 0x0c, 0xd8, 0x79, + 0x09, 0x0c, 0xda, 0x79, 0x08, 0x0c, 0x04, 0x68, - 0xb1, 0x6a, 0xbe, 0x5e, + 0xb1, 0x6a, 0xca, 0x5e, 0xff, 0x6a, 0x26, 0x09, 0x12, 0x01, 0x02, 0x00, 0x02, 0x6a, 0x08, 0x30, @@ -257,33 +258,33 @@ 0x00, 0xa5, 0x4a, 0x21, 0x00, 0xa6, 0x4c, 0x21, 0x00, 0xa7, 0x4e, 0x25, - 0x08, 0xeb, 0xc2, 0x7e, - 0x80, 0xeb, 0xf8, 0x79, + 0x08, 0xeb, 0xce, 0x7e, + 0x80, 0xeb, 0xfa, 0x79, 0xff, 0x6a, 0xd6, 0x09, - 0x08, 0xeb, 0xfc, 0x69, + 0x08, 0xeb, 0xfe, 0x69, 0xff, 0x6a, 0xd4, 0x0c, - 0x80, 0xa3, 0xc2, 0x6e, - 0x88, 0xeb, 0x12, 0x72, - 0x08, 0xeb, 0xc2, 0x6e, - 0x04, 0xea, 0x16, 0xe2, - 0x08, 0xee, 0xc2, 0x6e, + 0x80, 0xa3, 0xce, 0x6e, + 0x88, 0xeb, 0x14, 0x72, + 0x08, 0xeb, 0xce, 0x6e, + 0x04, 0xea, 0x18, 0xe2, + 0x08, 0xee, 0xce, 0x6e, 0x04, 0x6a, 0xd0, 0x81, 0x05, 0xa4, 0xc0, 0x89, 0x03, 0xa5, 0xc2, 0x31, 0x09, 0x6a, 0xd6, 0x05, - 0x00, 0x65, 0xfa, 0x59, + 0x00, 0x65, 0xfc, 0x59, 0x06, 0xa4, 0xd4, 0x89, - 0x80, 0x94, 0xc2, 0x7e, + 0x80, 0x94, 0xce, 0x7e, 0x07, 0xe9, 0x10, 0x31, - 0x01, 0x8c, 0x1e, 0x7a, + 0x01, 0x8c, 0x20, 0x7a, 0x01, 0x55, 0xaa, 0x10, 0x01, 0xe9, 0x46, 0x31, - 0x00, 0xa3, 0xa0, 0x5e, - 0x00, 0x65, 0xec, 0x59, + 0x00, 0xa3, 0xac, 0x5e, + 0x00, 0x65, 0xee, 0x59, 0x01, 0xa4, 0xca, 0x30, - 0x01, 0x55, 0x2a, 0x7a, + 0x01, 0x55, 0x2c, 0x7a, 0x04, 0x65, 0xca, 0x00, - 0x80, 0xa3, 0x2e, 0x7a, + 0x80, 0xa3, 0x30, 0x7a, 0x02, 0x65, 0xca, 0x00, 0x01, 0x65, 0xf8, 0x31, 0x80, 0x93, 0x26, 0x01, @@ -291,168 +292,168 @@ 0x01, 0x8c, 0xc8, 0x30, 0x00, 0x88, 0xc8, 0x18, 0x02, 0x64, 0xc8, 0x88, - 0xff, 0x64, 0xc2, 0x7e, - 0xff, 0x8d, 0x44, 0x6a, - 0xff, 0x8e, 0x44, 0x6a, + 0xff, 0x64, 0xce, 0x7e, + 0xff, 0x8d, 0x46, 0x6a, + 0xff, 0x8e, 0x46, 0x6a, 0x03, 0x8c, 0xd4, 0x98, - 0x00, 0x65, 0xc2, 0x56, + 0x00, 0x65, 0xce, 0x56, 0x01, 0x64, 0x70, 0x30, 0xff, 0x64, 0xc8, 0x10, 0x01, 0x64, 0xc8, 0x18, 0x00, 0x8c, 0x18, 0x19, 0xff, 0x8d, 0x1a, 0x21, 0xff, 0x8e, 0x1c, 0x25, - 0x80, 0x3c, 0x54, 0x6a, - 0x21, 0x6a, 0xbe, 0x46, + 0x80, 0x3c, 0x56, 0x6a, + 0x21, 0x6a, 0xca, 0x46, 0xa8, 0x6a, 0x76, 0x00, 0x79, 0x6a, 0x76, 0x00, - 0x40, 0x3f, 0x5c, 0x6a, + 0x40, 0x3f, 0x5e, 0x6a, 0x04, 0x3b, 0x76, 0x00, 0x04, 0x6a, 0xd4, 0x81, - 0x20, 0x3c, 0x64, 0x7a, - 0x51, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0x7e, 0x42, + 0x20, 0x3c, 0x66, 0x7a, + 0x51, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0x80, 0x42, 0x20, 0x3c, 0x78, 0x00, - 0x00, 0xb3, 0xa0, 0x5e, + 0x00, 0xb3, 0xac, 0x5e, 0x07, 0xac, 0x10, 0x31, 0x05, 0xb3, 0x46, 0x31, 0x88, 0x6a, 0xcc, 0x00, - 0xac, 0x6a, 0xd4, 0x5d, + 0xac, 0x6a, 0xe0, 0x5d, 0xa3, 0x6a, 0xcc, 0x00, - 0xb3, 0x6a, 0xd8, 0x5d, - 0x00, 0x65, 0x34, 0x5a, + 0xb3, 0x6a, 0xe4, 0x5d, + 0x00, 0x65, 0x36, 0x5a, 0xfd, 0xa4, 0x48, 0x09, 0x01, 0x8c, 0xaa, 0x08, 0x03, 0x8c, 0x10, 0x30, - 0x00, 0x65, 0xcc, 0x5d, - 0x01, 0xa4, 0x90, 0x7a, + 0x00, 0x65, 0xd8, 0x5d, + 0x01, 0xa4, 0x92, 0x7a, 0x04, 0x3b, 0x76, 0x08, 0x01, 0x3b, 0x26, 0x31, 0x80, 0x02, 0x04, 0x00, - 0x10, 0x0c, 0x86, 0x7a, - 0x03, 0x9e, 0x88, 0x6a, + 0x10, 0x0c, 0x88, 0x7a, + 0x03, 0x9e, 0x8a, 0x6a, 0x7f, 0x02, 0x04, 0x08, - 0x91, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0xbe, 0x41, + 0x91, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0xc0, 0x41, 0x01, 0xa4, 0xca, 0x30, - 0x80, 0xa3, 0x96, 0x7a, + 0x80, 0xa3, 0x98, 0x7a, 0x02, 0x65, 0xca, 0x00, - 0x01, 0x55, 0x9a, 0x7a, + 0x01, 0x55, 0x9c, 0x7a, 0x04, 0x65, 0xca, 0x00, 0x01, 0x65, 0xf8, 0x31, 0x01, 0x3b, 0x26, 0x31, - 0x00, 0x65, 0x00, 0x5a, - 0x01, 0xfc, 0xa8, 0x6a, - 0x80, 0x0b, 0x9e, 0x6a, - 0x10, 0x0c, 0x9e, 0x7a, - 0x20, 0x93, 0x9e, 0x6a, + 0x00, 0x65, 0x02, 0x5a, + 0x01, 0xfc, 0xaa, 0x6a, + 0x80, 0x0b, 0xa0, 0x6a, + 0x10, 0x0c, 0xa0, 0x7a, + 0x20, 0x93, 0xa0, 0x6a, 0x02, 0x93, 0x26, 0x01, - 0x02, 0xfc, 0xb2, 0x7a, - 0x40, 0x0d, 0xcc, 0x6a, + 0x02, 0xfc, 0xb4, 0x7a, + 0x40, 0x0d, 0xce, 0x6a, 0x01, 0xa4, 0x48, 0x01, - 0x00, 0x65, 0xcc, 0x42, - 0x40, 0x0d, 0xb8, 0x6a, - 0x00, 0x65, 0x00, 0x5a, - 0x00, 0x65, 0xaa, 0x42, - 0x80, 0xfc, 0xc2, 0x7a, - 0x80, 0xa4, 0xc2, 0x6a, + 0x00, 0x65, 0xce, 0x42, + 0x40, 0x0d, 0xba, 0x6a, + 0x00, 0x65, 0x02, 0x5a, + 0x00, 0x65, 0xac, 0x42, + 0x80, 0xfc, 0xc4, 0x7a, + 0x80, 0xa4, 0xc4, 0x6a, 0xff, 0xa5, 0x4a, 0x19, 0xff, 0xa6, 0x4c, 0x21, 0xff, 0xa7, 0x4e, 0x21, 0xf8, 0xfc, 0x48, 0x09, 0xff, 0x6a, 0xaa, 0x08, - 0x04, 0xfc, 0xca, 0x7a, + 0x04, 0xfc, 0xcc, 0x7a, 0x01, 0x55, 0xaa, 0x00, 0xff, 0x6a, 0x46, 0x09, - 0x04, 0x3b, 0xe4, 0x6a, + 0x04, 0x3b, 0xe6, 0x6a, 0x02, 0x93, 0x26, 0x01, - 0x01, 0x94, 0xce, 0x7a, - 0x01, 0x94, 0xce, 0x7a, - 0x01, 0x94, 0xce, 0x7a, - 0x01, 0x94, 0xce, 0x7a, - 0x01, 0x94, 0xce, 0x7a, - 0x01, 0xa4, 0xe2, 0x7a, - 0x01, 0xfc, 0xdc, 0x7a, - 0x01, 0x94, 0xe4, 0x6a, - 0x00, 0x65, 0x7e, 0x42, - 0x01, 0x94, 0xe2, 0x7a, - 0x10, 0x94, 0xe4, 0x6a, + 0x01, 0x94, 0xd0, 0x7a, + 0x01, 0x94, 0xd0, 0x7a, + 0x01, 0x94, 0xd0, 0x7a, + 0x01, 0x94, 0xd0, 0x7a, + 0x01, 0x94, 0xd0, 0x7a, + 0x01, 0xa4, 0xe4, 0x7a, + 0x01, 0xfc, 0xde, 0x7a, + 0x01, 0x94, 0xe6, 0x6a, + 0x00, 0x65, 0x80, 0x42, + 0x01, 0x94, 0xe4, 0x7a, + 0x10, 0x94, 0xe6, 0x6a, 0xd7, 0x93, 0x26, 0x09, - 0x28, 0x93, 0xe8, 0x6a, + 0x28, 0x93, 0xea, 0x6a, 0x01, 0x85, 0x0a, 0x01, - 0x02, 0xfc, 0xf0, 0x6a, + 0x02, 0xfc, 0xf2, 0x6a, 0x01, 0x14, 0x46, 0x31, 0xff, 0x6a, 0x10, 0x09, 0xfe, 0x85, 0x0a, 0x09, - 0xff, 0x38, 0xfe, 0x6a, - 0x80, 0xa3, 0xfe, 0x7a, - 0x80, 0x0b, 0xfc, 0x7a, - 0x04, 0x3b, 0xfe, 0x7a, + 0xff, 0x38, 0x00, 0x6b, + 0x80, 0xa3, 0x00, 0x7b, + 0x80, 0x0b, 0xfe, 0x7a, + 0x04, 0x3b, 0x00, 0x7b, 0xbf, 0x3b, 0x76, 0x08, 0x01, 0x3b, 0x26, 0x31, - 0x00, 0x65, 0x00, 0x5a, - 0x01, 0x0b, 0x0c, 0x6b, - 0x10, 0x0c, 0x00, 0x7b, - 0x04, 0x93, 0x0a, 0x6b, - 0x01, 0x94, 0x08, 0x7b, - 0x10, 0x94, 0x0a, 0x6b, + 0x00, 0x65, 0x02, 0x5a, + 0x01, 0x0b, 0x0e, 0x6b, + 0x10, 0x0c, 0x02, 0x7b, + 0x04, 0x93, 0x0c, 0x6b, + 0x01, 0x94, 0x0a, 0x7b, + 0x10, 0x94, 0x0c, 0x6b, 0xc7, 0x93, 0x26, 0x09, 0x01, 0x99, 0xd4, 0x30, - 0x38, 0x93, 0x0e, 0x6b, - 0xff, 0x08, 0x60, 0x6b, - 0xff, 0x09, 0x60, 0x6b, - 0xff, 0x0a, 0x60, 0x6b, - 0xff, 0x38, 0x2a, 0x7b, + 0x38, 0x93, 0x10, 0x6b, + 0xff, 0x08, 0x62, 0x6b, + 0xff, 0x09, 0x62, 0x6b, + 0xff, 0x0a, 0x62, 0x6b, + 0xff, 0x38, 0x2c, 0x7b, 0x04, 0x14, 0x10, 0x31, 0x01, 0x38, 0x18, 0x31, 0x02, 0x6a, 0x1a, 0x31, 0x88, 0x6a, 0xcc, 0x00, - 0x14, 0x6a, 0xda, 0x5d, - 0x00, 0x38, 0xc6, 0x5d, + 0x14, 0x6a, 0xe6, 0x5d, + 0x00, 0x38, 0xd2, 0x5d, 0xff, 0x6a, 0x70, 0x08, - 0x00, 0x65, 0x56, 0x43, - 0x80, 0xa3, 0x30, 0x7b, + 0x00, 0x65, 0x58, 0x43, + 0x80, 0xa3, 0x32, 0x7b, 0x01, 0xa4, 0x48, 0x01, - 0x00, 0x65, 0x60, 0x43, - 0x08, 0xeb, 0x36, 0x7b, - 0x00, 0x65, 0x00, 0x5a, - 0x08, 0xeb, 0x32, 0x6b, + 0x00, 0x65, 0x62, 0x43, + 0x08, 0xeb, 0x38, 0x7b, + 0x00, 0x65, 0x02, 0x5a, + 0x08, 0xeb, 0x34, 0x6b, 0x07, 0xe9, 0x10, 0x31, 0x01, 0xe9, 0xca, 0x30, 0x01, 0x65, 0x46, 0x31, - 0x00, 0x6a, 0xa0, 0x5e, + 0x00, 0x6a, 0xac, 0x5e, 0x88, 0x6a, 0xcc, 0x00, - 0xa4, 0x6a, 0xda, 0x5d, - 0x08, 0x6a, 0xc6, 0x5d, + 0xa4, 0x6a, 0xe6, 0x5d, + 0x08, 0x6a, 0xd2, 0x5d, 0x0d, 0x93, 0x26, 0x01, - 0x00, 0x65, 0x8e, 0x5e, + 0x00, 0x65, 0x9a, 0x5e, 0x88, 0x6a, 0xcc, 0x00, - 0x00, 0x65, 0x70, 0x5e, + 0x00, 0x65, 0x7c, 0x5e, 0x01, 0x99, 0x46, 0x31, - 0x00, 0xa3, 0xa0, 0x5e, + 0x00, 0xa3, 0xac, 0x5e, 0x01, 0x88, 0x10, 0x31, - 0x00, 0x65, 0x34, 0x5a, - 0x00, 0x65, 0xec, 0x59, + 0x00, 0x65, 0x36, 0x5a, + 0x00, 0x65, 0xee, 0x59, 0x03, 0x8c, 0x10, 0x30, - 0x00, 0x65, 0xcc, 0x5d, - 0x01, 0x8c, 0x5e, 0x7b, + 0x00, 0x65, 0xd8, 0x5d, + 0x01, 0x8c, 0x60, 0x7b, 0x01, 0x55, 0xaa, 0x10, - 0x80, 0x0b, 0x7e, 0x6a, - 0x80, 0x0b, 0x68, 0x6b, - 0x01, 0x0c, 0x62, 0x7b, - 0x10, 0x0c, 0x7e, 0x7a, - 0x03, 0x9e, 0x7e, 0x6a, - 0x00, 0x65, 0xf6, 0x59, - 0x00, 0x6a, 0xa0, 0x5e, - 0x01, 0xa4, 0x88, 0x6b, - 0xff, 0x38, 0x7e, 0x7b, + 0x80, 0x0b, 0x80, 0x6a, + 0x80, 0x0b, 0x6a, 0x6b, + 0x01, 0x0c, 0x64, 0x7b, + 0x10, 0x0c, 0x80, 0x7a, + 0x03, 0x9e, 0x80, 0x6a, + 0x00, 0x65, 0xf8, 0x59, + 0x00, 0x6a, 0xac, 0x5e, + 0x01, 0xa4, 0x8a, 0x6b, + 0xff, 0x38, 0x80, 0x7b, 0x01, 0x38, 0xc8, 0x30, 0x00, 0x08, 0x40, 0x19, 0xff, 0x6a, 0xc8, 0x08, 0x00, 0x09, 0x42, 0x21, 0x00, 0x0a, 0x44, 0x21, 0xff, 0x6a, 0x70, 0x08, - 0x00, 0x65, 0x80, 0x43, + 0x00, 0x65, 0x82, 0x43, 0x03, 0x08, 0x40, 0x31, 0x03, 0x08, 0x40, 0x31, 0x01, 0x08, 0x40, 0x31, @@ -461,14 +462,19 @@ 0xfd, 0xb4, 0x68, 0x09, 0x12, 0x01, 0x02, 0x00, 0x12, 0x01, 0x02, 0x00, - 0x04, 0x3c, 0xbe, 0x79, + 0x04, 0x3c, 0xc0, 0x79, 0xfb, 0x3c, 0x78, 0x08, - 0x04, 0x93, 0x2e, 0x79, - 0x01, 0x0c, 0x94, 0x6b, - 0x00, 0x65, 0x2e, 0x41, - 0x00, 0x65, 0xbe, 0x41, - 0x80, 0x3c, 0x9e, 0x6b, - 0x21, 0x6a, 0xbe, 0x46, + 0x04, 0x93, 0x1e, 0x79, + 0x01, 0x0c, 0x96, 0x6b, + 0x01, 0x55, 0x1e, 0x79, + 0x80, 0x04, 0x1e, 0x79, + 0xe4, 0x6a, 0x60, 0x5d, + 0x23, 0x6a, 0x76, 0x5d, + 0x01, 0x6a, 0x76, 0x5d, + 0x00, 0x65, 0x1e, 0x41, + 0x00, 0x65, 0xc0, 0x41, + 0x80, 0x3c, 0xaa, 0x6b, + 0x21, 0x6a, 0xca, 0x46, 0x01, 0xbc, 0x18, 0x31, 0x02, 0x6a, 0x1a, 0x31, 0x02, 0x6a, 0xf8, 0x01, @@ -478,16 +484,16 @@ 0xff, 0x6a, 0x12, 0x08, 0xff, 0x6a, 0x14, 0x08, 0xf3, 0xbc, 0xd4, 0x18, - 0xa0, 0x6a, 0xc4, 0x53, + 0xa0, 0x6a, 0xd0, 0x53, 0x04, 0xa0, 0x10, 0x31, 0xac, 0x6a, 0x26, 0x01, 0x04, 0xa0, 0x10, 0x31, 0x03, 0x08, 0x18, 0x31, 0x88, 0x6a, 0xcc, 0x00, - 0xa0, 0x6a, 0xda, 0x5d, - 0x00, 0xbc, 0xc6, 0x5d, + 0xa0, 0x6a, 0xe6, 0x5d, + 0x00, 0xbc, 0xd2, 0x5d, 0x3d, 0x6a, 0x26, 0x01, - 0x00, 0x65, 0xdc, 0x43, + 0x00, 0x65, 0xe8, 0x43, 0xff, 0x6a, 0x10, 0x09, 0xa4, 0x6a, 0x26, 0x01, 0x0c, 0xa0, 0x32, 0x31, @@ -497,117 +503,117 @@ 0x36, 0x6a, 0x26, 0x01, 0x02, 0x93, 0x26, 0x01, 0x35, 0x6a, 0x26, 0x01, - 0x00, 0x65, 0x82, 0x5e, - 0x00, 0x65, 0x82, 0x5e, + 0x00, 0x65, 0x8e, 0x5e, + 0x00, 0x65, 0x8e, 0x5e, 0x02, 0x93, 0x26, 0x01, - 0x04, 0x0b, 0xe0, 0x6b, - 0x10, 0x0c, 0xdc, 0x7b, - 0x01, 0x03, 0xe0, 0x6b, - 0x20, 0x93, 0xdc, 0x6b, + 0x04, 0x0b, 0xec, 0x6b, + 0x10, 0x0c, 0xe8, 0x7b, + 0x01, 0x03, 0xec, 0x6b, + 0x20, 0x93, 0xe8, 0x6b, 0xc7, 0x93, 0x26, 0x09, - 0x38, 0x93, 0xe6, 0x6b, + 0x38, 0x93, 0xf2, 0x6b, 0x10, 0x01, 0x02, 0x00, - 0x00, 0x65, 0xbe, 0x41, - 0x80, 0x3c, 0xf0, 0x6b, - 0x21, 0x6a, 0xbe, 0x46, + 0x00, 0x65, 0xc0, 0x41, + 0x80, 0x3c, 0xfc, 0x6b, + 0x21, 0x6a, 0xca, 0x46, 0x01, 0x06, 0x50, 0x31, - 0x00, 0x65, 0xbe, 0x41, + 0x00, 0x65, 0xc0, 0x41, 0x10, 0x3f, 0x06, 0x00, 0x10, 0x6a, 0x06, 0x00, 0x01, 0x3a, 0xca, 0x30, - 0x80, 0x65, 0x14, 0x64, - 0x10, 0xb8, 0x38, 0x6c, + 0x80, 0x65, 0x20, 0x64, + 0x10, 0xb8, 0x44, 0x6c, 0xc0, 0xba, 0xca, 0x00, - 0x40, 0xb8, 0x04, 0x6c, + 0x40, 0xb8, 0x10, 0x6c, 0xbf, 0x65, 0xca, 0x08, - 0x20, 0xb8, 0x18, 0x7c, + 0x20, 0xb8, 0x24, 0x7c, 0x01, 0x65, 0x0c, 0x30, - 0x00, 0x65, 0xbe, 0x5d, - 0xa0, 0x3f, 0x20, 0x64, + 0x00, 0x65, 0xca, 0x5d, + 0xa0, 0x3f, 0x2c, 0x64, 0x23, 0xb8, 0x0c, 0x08, - 0x00, 0x65, 0xbe, 0x5d, - 0xa0, 0x3f, 0x20, 0x64, - 0x00, 0xbb, 0x18, 0x44, - 0xff, 0x65, 0x18, 0x64, - 0x00, 0x65, 0x38, 0x44, + 0x00, 0x65, 0xca, 0x5d, + 0xa0, 0x3f, 0x2c, 0x64, + 0x00, 0xbb, 0x24, 0x44, + 0xff, 0x65, 0x24, 0x64, + 0x00, 0x65, 0x44, 0x44, 0x40, 0x6a, 0x18, 0x00, 0x01, 0x65, 0x0c, 0x30, - 0x00, 0x65, 0xbe, 0x5d, - 0xa0, 0x3f, 0xf4, 0x73, + 0x00, 0x65, 0xca, 0x5d, + 0xa0, 0x3f, 0x00, 0x74, 0x40, 0x6a, 0x18, 0x00, 0x01, 0x3a, 0xa6, 0x30, 0x08, 0x6a, 0x74, 0x00, - 0x00, 0x65, 0xbe, 0x41, - 0x64, 0x6a, 0x4e, 0x5d, - 0x80, 0x64, 0xbe, 0x6c, - 0x04, 0x64, 0x84, 0x74, - 0x02, 0x64, 0x92, 0x74, - 0x00, 0x6a, 0x54, 0x74, - 0x03, 0x64, 0xb0, 0x74, - 0x23, 0x64, 0x40, 0x74, - 0x08, 0x64, 0x50, 0x74, - 0x61, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0xbe, 0x5d, - 0x08, 0x51, 0xc0, 0x71, - 0x00, 0x65, 0x38, 0x44, - 0x80, 0x04, 0x4e, 0x7c, - 0x51, 0x6a, 0x44, 0x5d, - 0x01, 0x51, 0x4e, 0x64, - 0x01, 0xa4, 0x4a, 0x7c, - 0x01, 0x55, 0x50, 0x7c, - 0x41, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0x50, 0x44, - 0x07, 0x6a, 0x3a, 0x5d, + 0x00, 0x65, 0xc0, 0x41, + 0x64, 0x6a, 0x5a, 0x5d, + 0x80, 0x64, 0xca, 0x6c, + 0x04, 0x64, 0x90, 0x74, + 0x02, 0x64, 0x9e, 0x74, + 0x00, 0x6a, 0x60, 0x74, + 0x03, 0x64, 0xbc, 0x74, + 0x23, 0x64, 0x4c, 0x74, + 0x08, 0x64, 0x5c, 0x74, + 0x61, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0xca, 0x5d, + 0x08, 0x51, 0xc2, 0x71, + 0x00, 0x65, 0x44, 0x44, + 0x80, 0x04, 0x5a, 0x7c, + 0x51, 0x6a, 0x50, 0x5d, + 0x01, 0x51, 0x5a, 0x64, + 0x01, 0xa4, 0x56, 0x7c, + 0x01, 0x55, 0x5c, 0x7c, + 0x41, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0x5c, 0x44, + 0x07, 0x6a, 0x46, 0x5d, 0x01, 0x06, 0xd4, 0x30, - 0x00, 0x65, 0xbe, 0x41, - 0x10, 0xb8, 0x58, 0x7c, - 0xa1, 0x6a, 0xbe, 0x5e, - 0x01, 0xb4, 0x5e, 0x6c, - 0x02, 0xb4, 0x60, 0x6c, - 0x01, 0xa4, 0x60, 0x7c, - 0xff, 0xa8, 0x70, 0x7c, + 0x00, 0x65, 0xc0, 0x41, + 0x10, 0xb8, 0x64, 0x7c, + 0xa1, 0x6a, 0xca, 0x5e, + 0x01, 0xb4, 0x6a, 0x6c, + 0x02, 0xb4, 0x6c, 0x6c, + 0x01, 0xa4, 0x6c, 0x7c, + 0xff, 0xa8, 0x7c, 0x7c, 0x04, 0xb4, 0x68, 0x01, 0x01, 0x6a, 0x76, 0x00, - 0x00, 0xbb, 0xf8, 0x5d, - 0xff, 0xa8, 0x70, 0x7c, - 0x71, 0x6a, 0xbe, 0x5e, - 0x40, 0x51, 0x70, 0x64, - 0x00, 0x65, 0x98, 0x5e, - 0x00, 0x65, 0xd0, 0x41, - 0x00, 0xbb, 0x74, 0x5c, - 0x00, 0x65, 0xd0, 0x41, - 0x00, 0x65, 0x98, 0x5e, + 0x00, 0xbb, 0x04, 0x5e, + 0xff, 0xa8, 0x7c, 0x7c, + 0x71, 0x6a, 0xca, 0x5e, + 0x40, 0x51, 0x7c, 0x64, + 0x00, 0x65, 0xa4, 0x5e, + 0x00, 0x65, 0xd2, 0x41, + 0x00, 0xbb, 0x80, 0x5c, + 0x00, 0x65, 0xd2, 0x41, + 0x00, 0x65, 0xa4, 0x5e, 0x01, 0x65, 0xa2, 0x30, 0x01, 0xf8, 0xc8, 0x30, 0x01, 0x4e, 0xc8, 0x30, - 0x00, 0x6a, 0x9c, 0xdd, - 0x00, 0x51, 0xae, 0x5d, + 0x00, 0x6a, 0xa8, 0xdd, + 0x00, 0x51, 0xba, 0x5d, 0x01, 0x4e, 0x9c, 0x18, 0x02, 0x6a, 0x22, 0x05, 0x04, 0xb8, 0x70, 0x01, - 0x00, 0x65, 0xba, 0x5e, - 0x20, 0xb8, 0xd0, 0x69, + 0x00, 0x65, 0xc6, 0x5e, + 0x20, 0xb8, 0xd2, 0x69, 0x01, 0xbb, 0xa2, 0x30, 0x01, 0xba, 0x7c, 0x30, - 0x00, 0xb9, 0xb4, 0x5c, - 0x00, 0x65, 0xd0, 0x41, + 0x00, 0xb9, 0xc0, 0x5c, + 0x00, 0x65, 0xd2, 0x41, 0x01, 0x06, 0xd4, 0x30, - 0x20, 0x3c, 0xbe, 0x79, - 0x20, 0x3c, 0x50, 0x7c, - 0x01, 0xa4, 0xa0, 0x7c, + 0x20, 0x3c, 0xc0, 0x79, + 0x20, 0x3c, 0x5c, 0x7c, + 0x01, 0xa4, 0xac, 0x7c, 0x01, 0xb4, 0x68, 0x01, - 0x00, 0x65, 0xbe, 0x41, - 0x00, 0x65, 0x50, 0x44, + 0x00, 0x65, 0xc0, 0x41, + 0x00, 0x65, 0x5c, 0x44, 0x04, 0x14, 0x58, 0x31, 0x01, 0x06, 0xd4, 0x30, 0x08, 0xa0, 0x60, 0x31, 0xac, 0x6a, 0xcc, 0x00, - 0x14, 0x6a, 0xda, 0x5d, + 0x14, 0x6a, 0xe6, 0x5d, 0x01, 0x06, 0xd4, 0x30, - 0xa0, 0x6a, 0xd2, 0x5d, - 0x00, 0x65, 0xbe, 0x41, + 0xa0, 0x6a, 0xde, 0x5d, + 0x00, 0x65, 0xc0, 0x41, 0xdf, 0x3c, 0x78, 0x08, - 0x00, 0x65, 0x50, 0x44, + 0x00, 0x65, 0x5c, 0x44, 0x4c, 0x65, 0xcc, 0x28, 0x01, 0x3e, 0x20, 0x31, 0xd0, 0x66, 0xcc, 0x18, @@ -618,102 +624,102 @@ 0xd0, 0x65, 0xca, 0x18, 0x01, 0x3e, 0x20, 0x31, 0x30, 0x65, 0xd4, 0x18, - 0x00, 0x65, 0xcc, 0x4c, + 0x00, 0x65, 0xd8, 0x4c, 0xe1, 0x6a, 0x22, 0x01, 0xff, 0x6a, 0xd4, 0x08, 0x20, 0x65, 0xd4, 0x18, - 0x00, 0x65, 0xd4, 0x54, + 0x00, 0x65, 0xe0, 0x54, 0xe1, 0x6a, 0x22, 0x01, 0xff, 0x6a, 0xd4, 0x08, 0x20, 0x65, 0xca, 0x18, 0xe0, 0x65, 0xd4, 0x18, - 0x00, 0x65, 0xde, 0x4c, + 0x00, 0x65, 0xea, 0x4c, 0xe1, 0x6a, 0x22, 0x01, 0xff, 0x6a, 0xd4, 0x08, 0xd0, 0x65, 0xd4, 0x18, - 0x00, 0x65, 0xe6, 0x54, + 0x00, 0x65, 0xf2, 0x54, 0xe1, 0x6a, 0x22, 0x01, 0xff, 0x6a, 0xd4, 0x08, 0x01, 0x6c, 0xa2, 0x30, - 0xff, 0x51, 0xf8, 0x74, - 0x00, 0x51, 0x74, 0x5d, + 0xff, 0x51, 0x04, 0x75, + 0x00, 0x51, 0x80, 0x5d, 0x01, 0x51, 0x20, 0x31, - 0x00, 0x65, 0x1a, 0x45, + 0x00, 0x65, 0x26, 0x45, 0x01, 0xba, 0xc8, 0x30, - 0x00, 0x3e, 0x1a, 0x75, - 0x00, 0x65, 0x96, 0x5e, + 0x00, 0x3e, 0x26, 0x75, + 0x00, 0x65, 0xa2, 0x5e, 0x80, 0x3c, 0x78, 0x00, 0x01, 0x06, 0xd4, 0x30, - 0x00, 0x65, 0xbe, 0x5d, + 0x00, 0x65, 0xca, 0x5d, 0x01, 0x3c, 0x78, 0x00, - 0xe0, 0x3f, 0x36, 0x65, + 0xe0, 0x3f, 0x42, 0x65, 0x02, 0x3c, 0x78, 0x00, - 0x20, 0x12, 0x36, 0x65, - 0x51, 0x6a, 0x44, 0x5d, - 0x00, 0x51, 0x74, 0x5d, - 0x51, 0x6a, 0x44, 0x5d, + 0x20, 0x12, 0x42, 0x65, + 0x51, 0x6a, 0x50, 0x5d, + 0x00, 0x51, 0x80, 0x5d, + 0x51, 0x6a, 0x50, 0x5d, 0x01, 0x51, 0x20, 0x31, 0x04, 0x3c, 0x78, 0x00, 0x01, 0xb9, 0xc8, 0x30, - 0x00, 0x3d, 0x34, 0x65, + 0x00, 0x3d, 0x40, 0x65, 0x08, 0x3c, 0x78, 0x00, 0x01, 0xba, 0xc8, 0x30, - 0x00, 0x3e, 0x34, 0x65, + 0x00, 0x3e, 0x40, 0x65, 0x10, 0x3c, 0x78, 0x00, - 0x04, 0xb8, 0x34, 0x7d, + 0x04, 0xb8, 0x40, 0x7d, 0xfb, 0xb8, 0x70, 0x09, - 0x20, 0xb8, 0x2a, 0x6d, + 0x20, 0xb8, 0x36, 0x6d, 0x01, 0x90, 0xc8, 0x30, 0xff, 0x6a, 0xa2, 0x00, - 0x00, 0x3d, 0xb4, 0x5c, + 0x00, 0x3d, 0xc0, 0x5c, 0x01, 0x64, 0x20, 0x31, 0x80, 0x6a, 0x78, 0x00, - 0x00, 0x65, 0xfc, 0x58, - 0x10, 0xb8, 0x50, 0x7c, - 0xff, 0x6a, 0x3a, 0x5d, - 0x00, 0x65, 0x50, 0x44, - 0x00, 0x65, 0x96, 0x5e, - 0x31, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0x50, 0x44, + 0x00, 0x65, 0xec, 0x58, + 0x10, 0xb8, 0x5c, 0x7c, + 0xff, 0x6a, 0x46, 0x5d, + 0x00, 0x65, 0x5c, 0x44, + 0x00, 0x65, 0xa2, 0x5e, + 0x31, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0x5c, 0x44, 0x10, 0x3f, 0x06, 0x00, 0x10, 0x6a, 0x06, 0x00, 0x01, 0x65, 0x74, 0x34, - 0x81, 0x6a, 0xbe, 0x5e, - 0x00, 0x65, 0x46, 0x45, + 0x81, 0x6a, 0xca, 0x5e, + 0x00, 0x65, 0x52, 0x45, 0x01, 0x06, 0xd4, 0x30, - 0x01, 0x0c, 0x46, 0x7d, - 0x04, 0x0c, 0x40, 0x6d, + 0x01, 0x0c, 0x52, 0x7d, + 0x04, 0x0c, 0x4c, 0x6d, 0xe0, 0x03, 0x7e, 0x08, - 0xe0, 0x3f, 0xbe, 0x61, + 0xe0, 0x3f, 0xc0, 0x61, 0x01, 0x65, 0xcc, 0x30, 0x01, 0x12, 0xda, 0x34, 0x01, 0x06, 0xd4, 0x34, - 0x01, 0x03, 0x54, 0x6d, + 0x01, 0x03, 0x60, 0x6d, 0x40, 0x03, 0xcc, 0x08, 0x01, 0x65, 0x06, 0x30, 0x40, 0x65, 0xc8, 0x08, - 0x00, 0x66, 0x62, 0x75, - 0x40, 0x65, 0x62, 0x7d, - 0x00, 0x65, 0x62, 0x5d, + 0x00, 0x66, 0x6e, 0x75, + 0x40, 0x65, 0x6e, 0x7d, + 0x00, 0x65, 0x6e, 0x5d, 0xff, 0x6a, 0xd4, 0x08, 0xff, 0x6a, 0xd4, 0x08, 0xff, 0x6a, 0xd4, 0x08, 0xff, 0x6a, 0xd4, 0x0c, 0x08, 0x01, 0x02, 0x00, - 0x02, 0x0b, 0x6c, 0x7d, + 0x02, 0x0b, 0x78, 0x7d, 0x01, 0x65, 0x0c, 0x30, - 0x02, 0x0b, 0x70, 0x7d, + 0x02, 0x0b, 0x7c, 0x7d, 0xf7, 0x01, 0x02, 0x0c, 0x01, 0x65, 0xc8, 0x30, - 0xff, 0x41, 0x94, 0x75, + 0xff, 0x41, 0xa0, 0x75, 0x01, 0x41, 0x20, 0x31, 0xff, 0x6a, 0xa4, 0x00, - 0x00, 0x65, 0x84, 0x45, - 0xff, 0xbf, 0x94, 0x75, + 0x00, 0x65, 0x90, 0x45, + 0xff, 0xbf, 0xa0, 0x75, 0x01, 0x90, 0xa4, 0x30, 0x01, 0xbf, 0x20, 0x31, - 0x00, 0xbb, 0x7e, 0x65, - 0xff, 0x52, 0x92, 0x75, + 0x00, 0xbb, 0x8a, 0x65, + 0xff, 0x52, 0x9e, 0x75, 0x01, 0xbf, 0xcc, 0x30, 0x01, 0x90, 0xca, 0x30, 0x01, 0x52, 0x20, 0x31, @@ -721,28 +727,28 @@ 0x01, 0x65, 0x20, 0x35, 0x01, 0xbf, 0x82, 0x34, 0x01, 0x64, 0xa2, 0x30, - 0x00, 0x6a, 0xa6, 0x5e, + 0x00, 0x6a, 0xb2, 0x5e, 0x0d, 0x6a, 0x76, 0x00, - 0x00, 0x51, 0xf8, 0x45, + 0x00, 0x51, 0x04, 0x46, 0x01, 0x65, 0xa4, 0x30, 0xe0, 0x6a, 0xcc, 0x00, - 0x48, 0x6a, 0xec, 0x5d, + 0x48, 0x6a, 0xf8, 0x5d, 0x01, 0x6a, 0xd0, 0x01, 0x01, 0x6a, 0xdc, 0x05, 0x88, 0x6a, 0xcc, 0x00, - 0x48, 0x6a, 0xec, 0x5d, - 0x01, 0x6a, 0xc6, 0x5d, + 0x48, 0x6a, 0xf8, 0x5d, + 0x01, 0x6a, 0xd2, 0x5d, 0x01, 0x6a, 0x26, 0x05, 0x01, 0x65, 0xd8, 0x31, 0x09, 0xee, 0xdc, 0x01, - 0x80, 0xee, 0xb2, 0x7d, + 0x80, 0xee, 0xbe, 0x7d, 0xff, 0x6a, 0xdc, 0x0d, 0x01, 0x65, 0x32, 0x31, 0x0a, 0x93, 0x26, 0x01, - 0x00, 0x65, 0x8e, 0x46, - 0x81, 0x6a, 0xbe, 0x5e, - 0x01, 0x0c, 0xbe, 0x7d, - 0x04, 0x0c, 0xbc, 0x6d, + 0x00, 0x65, 0x9a, 0x46, + 0x81, 0x6a, 0xca, 0x5e, + 0x01, 0x0c, 0xca, 0x7d, + 0x04, 0x0c, 0xc8, 0x6d, 0xe0, 0x03, 0x06, 0x08, 0xe0, 0x03, 0x7e, 0x0c, 0x01, 0x65, 0x18, 0x31, @@ -761,7 +767,7 @@ 0x01, 0x6c, 0xda, 0x34, 0x3d, 0x64, 0xa4, 0x28, 0x55, 0x64, 0xc8, 0x28, - 0x00, 0x65, 0xec, 0x45, + 0x00, 0x65, 0xf8, 0x45, 0x2e, 0x64, 0xa4, 0x28, 0x66, 0x64, 0xc8, 0x28, 0x00, 0x6c, 0xda, 0x18, @@ -772,63 +778,63 @@ 0x00, 0x6c, 0xda, 0x24, 0x01, 0x65, 0xc8, 0x30, 0xe0, 0x6a, 0xcc, 0x00, - 0x44, 0x6a, 0xe8, 0x5d, + 0x44, 0x6a, 0xf4, 0x5d, 0x01, 0x90, 0xe2, 0x31, - 0x04, 0x3b, 0x0c, 0x7e, + 0x04, 0x3b, 0x18, 0x7e, 0x30, 0x6a, 0xd0, 0x01, 0x20, 0x6a, 0xd0, 0x01, 0x1d, 0x6a, 0xdc, 0x01, - 0xdc, 0xee, 0x08, 0x66, - 0x00, 0x65, 0x24, 0x46, + 0xdc, 0xee, 0x14, 0x66, + 0x00, 0x65, 0x30, 0x46, 0x20, 0x6a, 0xd0, 0x01, 0x01, 0x6a, 0xdc, 0x01, 0x20, 0xa0, 0xd8, 0x31, 0x09, 0xee, 0xdc, 0x01, - 0x80, 0xee, 0x14, 0x7e, + 0x80, 0xee, 0x20, 0x7e, 0x11, 0x6a, 0xdc, 0x01, - 0x50, 0xee, 0x18, 0x66, + 0x50, 0xee, 0x24, 0x66, 0x20, 0x6a, 0xd0, 0x01, 0x09, 0x6a, 0xdc, 0x01, - 0x88, 0xee, 0x1e, 0x66, + 0x88, 0xee, 0x2a, 0x66, 0x19, 0x6a, 0xdc, 0x01, - 0xd8, 0xee, 0x22, 0x66, + 0xd8, 0xee, 0x2e, 0x66, 0xff, 0x6a, 0xdc, 0x09, - 0x18, 0xee, 0x26, 0x6e, + 0x18, 0xee, 0x32, 0x6e, 0xff, 0x6a, 0xd4, 0x0c, 0x88, 0x6a, 0xcc, 0x00, - 0x44, 0x6a, 0xe8, 0x5d, - 0x20, 0x6a, 0xc6, 0x5d, + 0x44, 0x6a, 0xf4, 0x5d, + 0x20, 0x6a, 0xd2, 0x5d, 0x01, 0x3b, 0x26, 0x31, - 0x04, 0x3b, 0x40, 0x6e, + 0x04, 0x3b, 0x4c, 0x6e, 0xa0, 0x6a, 0xca, 0x00, 0x20, 0x65, 0xc8, 0x18, - 0x00, 0x65, 0x7e, 0x5e, - 0x00, 0x65, 0x38, 0x66, + 0x00, 0x65, 0x8a, 0x5e, + 0x00, 0x65, 0x44, 0x66, 0x0a, 0x93, 0x26, 0x01, - 0x00, 0x65, 0x8e, 0x46, + 0x00, 0x65, 0x9a, 0x46, 0xa0, 0x6a, 0xcc, 0x00, 0xff, 0x6a, 0xc8, 0x08, - 0x20, 0x94, 0x44, 0x6e, - 0x10, 0x94, 0x46, 0x6e, - 0x08, 0x94, 0x60, 0x6e, - 0x08, 0x94, 0x60, 0x6e, - 0x08, 0x94, 0x60, 0x6e, + 0x20, 0x94, 0x50, 0x6e, + 0x10, 0x94, 0x52, 0x6e, + 0x08, 0x94, 0x6c, 0x6e, + 0x08, 0x94, 0x6c, 0x6e, + 0x08, 0x94, 0x6c, 0x6e, 0xff, 0x8c, 0xc8, 0x10, 0xc1, 0x64, 0xc8, 0x18, 0xf8, 0x64, 0xc8, 0x08, 0x01, 0x99, 0xda, 0x30, - 0x00, 0x66, 0x54, 0x66, - 0xc0, 0x66, 0x90, 0x76, + 0x00, 0x66, 0x60, 0x66, + 0xc0, 0x66, 0x9c, 0x76, 0x60, 0x66, 0xc8, 0x18, 0x3d, 0x64, 0xc8, 0x28, - 0x00, 0x65, 0x44, 0x46, + 0x00, 0x65, 0x50, 0x46, 0xf7, 0x93, 0x26, 0x09, - 0x08, 0x93, 0x62, 0x6e, + 0x08, 0x93, 0x6e, 0x6e, 0x00, 0x62, 0xc4, 0x18, - 0x00, 0x65, 0x8e, 0x5e, - 0x00, 0x65, 0x6e, 0x5e, - 0x00, 0x65, 0x6e, 0x5e, - 0x00, 0x65, 0x6e, 0x5e, + 0x00, 0x65, 0x9a, 0x5e, + 0x00, 0x65, 0x7a, 0x5e, + 0x00, 0x65, 0x7a, 0x5e, + 0x00, 0x65, 0x7a, 0x5e, 0x01, 0x99, 0xda, 0x30, 0x01, 0x99, 0xda, 0x30, 0x01, 0x99, 0xda, 0x30, @@ -845,11 +851,11 @@ 0x01, 0x6c, 0x32, 0x31, 0x01, 0x6c, 0x32, 0x31, 0x01, 0x6c, 0x32, 0x35, - 0x08, 0x94, 0x8e, 0x7e, + 0x08, 0x94, 0x9a, 0x7e, 0xf7, 0x93, 0x26, 0x09, - 0x08, 0x93, 0x92, 0x6e, + 0x08, 0x93, 0x9e, 0x6e, 0xff, 0x6a, 0xd4, 0x0c, - 0x04, 0xb8, 0xba, 0x6e, + 0x04, 0xb8, 0xc6, 0x6e, 0x01, 0x42, 0x7e, 0x31, 0xff, 0x6a, 0x76, 0x01, 0x01, 0x90, 0x84, 0x34, @@ -857,14 +863,14 @@ 0x01, 0x85, 0x0a, 0x01, 0x7f, 0x65, 0x10, 0x09, 0xfe, 0x85, 0x0a, 0x0d, - 0xff, 0x42, 0xb6, 0x66, - 0xff, 0x41, 0xae, 0x66, - 0xd1, 0x6a, 0xbe, 0x5e, + 0xff, 0x42, 0xc2, 0x66, + 0xff, 0x41, 0xba, 0x66, + 0xd1, 0x6a, 0xca, 0x5e, 0xff, 0x6a, 0xca, 0x04, 0x01, 0x41, 0x20, 0x31, 0x01, 0xbf, 0x82, 0x30, 0x01, 0x6a, 0x76, 0x00, - 0x00, 0xbb, 0xf8, 0x45, + 0x00, 0xbb, 0x04, 0x46, 0x01, 0x42, 0x20, 0x31, 0x01, 0xbf, 0x84, 0x34, 0x01, 0x41, 0x7e, 0x31, @@ -967,7 +973,7 @@ static int ahc_patch12_func(struct ahc_softc *ahc) { - return ((ahc->features & AHC_ULTRA) != 0); + return ((ahc->features & AHC_HS_MAILBOX) != 0); } static int ahc_patch11_func(struct ahc_softc *ahc); @@ -975,7 +981,7 @@ static int ahc_patch11_func(struct ahc_softc *ahc) { - return ((ahc->features & AHC_HS_MAILBOX) != 0); + return ((ahc->features & AHC_ULTRA) != 0); } static int ahc_patch10_func(struct ahc_softc *ahc); @@ -1084,7 +1090,7 @@ { ahc_patch3_func, 27, 1, 2 }, { ahc_patch0_func, 28, 1, 1 }, { ahc_patch6_func, 34, 1, 1 }, - { ahc_patch7_func, 37, 62, 21 }, + { ahc_patch7_func, 37, 54, 19 }, { ahc_patch8_func, 37, 1, 1 }, { ahc_patch9_func, 42, 3, 2 }, { ahc_patch0_func, 45, 3, 1 }, @@ -1097,185 +1103,185 @@ { ahc_patch0_func, 56, 1, 1 }, { ahc_patch9_func, 60, 1, 2 }, { ahc_patch0_func, 61, 1, 1 }, - { ahc_patch9_func, 70, 1, 2 }, - { ahc_patch0_func, 71, 1, 1 }, - { ahc_patch9_func, 74, 1, 2 }, - { ahc_patch0_func, 75, 1, 1 }, - { ahc_patch11_func, 85, 1, 2 }, - { ahc_patch0_func, 86, 1, 1 }, - { ahc_patch9_func, 94, 1, 2 }, - { ahc_patch0_func, 95, 1, 1 }, - { ahc_patch8_func, 99, 9, 4 }, - { ahc_patch1_func, 101, 1, 2 }, - { ahc_patch0_func, 102, 1, 1 }, - { ahc_patch2_func, 104, 2, 1 }, - { ahc_patch2_func, 113, 4, 1 }, - { ahc_patch1_func, 117, 1, 2 }, - { ahc_patch0_func, 118, 2, 3 }, - { ahc_patch2_func, 118, 1, 2 }, - { ahc_patch0_func, 119, 1, 1 }, - { ahc_patch7_func, 120, 4, 2 }, - { ahc_patch0_func, 124, 1, 1 }, - { ahc_patch12_func, 126, 2, 1 }, - { ahc_patch1_func, 128, 1, 2 }, - { ahc_patch0_func, 129, 1, 1 }, - { ahc_patch7_func, 130, 4, 1 }, - { ahc_patch7_func, 141, 80, 9 }, - { ahc_patch4_func, 159, 1, 1 }, - { ahc_patch1_func, 172, 1, 1 }, - { ahc_patch9_func, 180, 1, 2 }, - { ahc_patch0_func, 181, 1, 1 }, - { ahc_patch9_func, 190, 1, 2 }, - { ahc_patch0_func, 191, 1, 1 }, - { ahc_patch9_func, 207, 6, 2 }, - { ahc_patch0_func, 213, 6, 1 }, - { ahc_patch8_func, 221, 18, 2 }, - { ahc_patch1_func, 234, 1, 1 }, - { ahc_patch1_func, 241, 1, 2 }, - { ahc_patch0_func, 242, 2, 2 }, - { ahc_patch12_func, 243, 1, 1 }, - { ahc_patch9_func, 251, 31, 3 }, - { ahc_patch1_func, 267, 14, 2 }, - { ahc_patch13_func, 272, 1, 1 }, - { ahc_patch14_func, 282, 14, 1 }, - { ahc_patch1_func, 298, 1, 2 }, - { ahc_patch0_func, 299, 1, 1 }, - { ahc_patch9_func, 302, 1, 1 }, - { ahc_patch13_func, 307, 1, 1 }, - { ahc_patch9_func, 308, 2, 2 }, - { ahc_patch0_func, 310, 4, 1 }, - { ahc_patch14_func, 314, 1, 1 }, - { ahc_patch15_func, 317, 2, 3 }, - { ahc_patch9_func, 317, 1, 2 }, - { ahc_patch0_func, 318, 1, 1 }, - { ahc_patch6_func, 323, 1, 2 }, - { ahc_patch0_func, 324, 1, 1 }, - { ahc_patch1_func, 328, 50, 11 }, - { ahc_patch6_func, 337, 2, 4 }, - { ahc_patch7_func, 337, 1, 1 }, - { ahc_patch8_func, 338, 1, 1 }, - { ahc_patch0_func, 339, 1, 1 }, - { ahc_patch16_func, 340, 1, 1 }, - { ahc_patch6_func, 359, 6, 3 }, - { ahc_patch16_func, 359, 5, 1 }, - { ahc_patch0_func, 365, 5, 1 }, - { ahc_patch13_func, 373, 5, 1 }, - { ahc_patch0_func, 378, 54, 17 }, - { ahc_patch14_func, 378, 1, 1 }, - { ahc_patch7_func, 380, 2, 2 }, - { ahc_patch17_func, 381, 1, 1 }, - { ahc_patch9_func, 384, 1, 1 }, - { ahc_patch18_func, 391, 1, 1 }, - { ahc_patch14_func, 396, 9, 3 }, - { ahc_patch9_func, 397, 3, 2 }, - { ahc_patch0_func, 400, 3, 1 }, - { ahc_patch9_func, 408, 6, 2 }, - { ahc_patch0_func, 414, 9, 2 }, - { ahc_patch13_func, 414, 1, 1 }, - { ahc_patch13_func, 423, 2, 1 }, - { ahc_patch14_func, 425, 1, 1 }, - { ahc_patch9_func, 427, 1, 2 }, - { ahc_patch0_func, 428, 1, 1 }, - { ahc_patch7_func, 431, 1, 1 }, + { ahc_patch9_func, 71, 1, 2 }, + { ahc_patch0_func, 72, 1, 1 }, + { ahc_patch9_func, 75, 1, 2 }, + { ahc_patch0_func, 76, 1, 1 }, + { ahc_patch9_func, 79, 1, 2 }, + { ahc_patch0_func, 80, 1, 1 }, + { ahc_patch8_func, 91, 9, 4 }, + { ahc_patch1_func, 93, 1, 2 }, + { ahc_patch0_func, 94, 1, 1 }, + { ahc_patch2_func, 96, 2, 1 }, + { ahc_patch2_func, 105, 4, 1 }, + { ahc_patch1_func, 109, 1, 2 }, + { ahc_patch0_func, 110, 2, 3 }, + { ahc_patch2_func, 110, 1, 2 }, + { ahc_patch0_func, 111, 1, 1 }, + { ahc_patch7_func, 112, 4, 2 }, + { ahc_patch0_func, 116, 1, 1 }, + { ahc_patch11_func, 118, 2, 1 }, + { ahc_patch1_func, 120, 1, 2 }, + { ahc_patch0_func, 121, 1, 1 }, + { ahc_patch7_func, 122, 4, 1 }, + { ahc_patch7_func, 133, 89, 11 }, + { ahc_patch4_func, 151, 1, 1 }, + { ahc_patch1_func, 164, 1, 1 }, + { ahc_patch12_func, 169, 1, 2 }, + { ahc_patch0_func, 170, 1, 1 }, + { ahc_patch9_func, 181, 1, 2 }, + { ahc_patch0_func, 182, 1, 1 }, + { ahc_patch9_func, 191, 1, 2 }, + { ahc_patch0_func, 192, 1, 1 }, + { ahc_patch9_func, 208, 6, 2 }, + { ahc_patch0_func, 214, 6, 1 }, + { ahc_patch8_func, 222, 18, 2 }, + { ahc_patch1_func, 235, 1, 1 }, + { ahc_patch1_func, 242, 1, 2 }, + { ahc_patch0_func, 243, 2, 2 }, + { ahc_patch11_func, 244, 1, 1 }, + { ahc_patch9_func, 252, 31, 3 }, + { ahc_patch1_func, 268, 14, 2 }, + { ahc_patch13_func, 273, 1, 1 }, + { ahc_patch14_func, 283, 14, 1 }, + { ahc_patch1_func, 299, 1, 2 }, + { ahc_patch0_func, 300, 1, 1 }, + { ahc_patch9_func, 303, 1, 1 }, + { ahc_patch13_func, 308, 1, 1 }, + { ahc_patch9_func, 309, 2, 2 }, + { ahc_patch0_func, 311, 4, 1 }, + { ahc_patch14_func, 315, 1, 1 }, + { ahc_patch15_func, 318, 2, 3 }, + { ahc_patch9_func, 318, 1, 2 }, + { ahc_patch0_func, 319, 1, 1 }, + { ahc_patch6_func, 324, 1, 2 }, + { ahc_patch0_func, 325, 1, 1 }, + { ahc_patch1_func, 329, 50, 11 }, + { ahc_patch6_func, 338, 2, 4 }, + { ahc_patch7_func, 338, 1, 1 }, + { ahc_patch8_func, 339, 1, 1 }, + { ahc_patch0_func, 340, 1, 1 }, + { ahc_patch16_func, 341, 1, 1 }, + { ahc_patch6_func, 360, 6, 3 }, + { ahc_patch16_func, 360, 5, 1 }, + { ahc_patch0_func, 366, 5, 1 }, + { ahc_patch13_func, 374, 5, 1 }, + { ahc_patch0_func, 379, 54, 17 }, + { ahc_patch14_func, 379, 1, 1 }, + { ahc_patch7_func, 381, 2, 2 }, + { ahc_patch17_func, 382, 1, 1 }, + { ahc_patch9_func, 385, 1, 1 }, + { ahc_patch18_func, 392, 1, 1 }, + { ahc_patch14_func, 397, 9, 3 }, + { ahc_patch9_func, 398, 3, 2 }, + { ahc_patch0_func, 401, 3, 1 }, + { ahc_patch9_func, 409, 6, 2 }, + { ahc_patch0_func, 415, 9, 2 }, + { ahc_patch13_func, 415, 1, 1 }, + { ahc_patch13_func, 424, 2, 1 }, + { ahc_patch14_func, 426, 1, 1 }, + { ahc_patch9_func, 428, 1, 2 }, + { ahc_patch0_func, 429, 1, 1 }, { ahc_patch7_func, 432, 1, 1 }, - { ahc_patch8_func, 433, 3, 3 }, - { ahc_patch6_func, 434, 1, 2 }, - { ahc_patch0_func, 435, 1, 1 }, - { ahc_patch9_func, 436, 1, 1 }, - { ahc_patch15_func, 437, 1, 2 }, - { ahc_patch13_func, 437, 1, 1 }, - { ahc_patch14_func, 439, 9, 4 }, - { ahc_patch9_func, 439, 1, 1 }, - { ahc_patch9_func, 446, 2, 1 }, - { ahc_patch0_func, 448, 4, 3 }, - { ahc_patch9_func, 448, 1, 2 }, - { ahc_patch0_func, 449, 3, 1 }, - { ahc_patch1_func, 453, 2, 1 }, - { ahc_patch7_func, 455, 5, 2 }, - { ahc_patch0_func, 460, 1, 1 }, - { ahc_patch8_func, 461, 109, 23 }, - { ahc_patch1_func, 463, 3, 2 }, - { ahc_patch0_func, 466, 5, 3 }, - { ahc_patch9_func, 466, 2, 2 }, - { ahc_patch0_func, 468, 3, 1 }, - { ahc_patch1_func, 473, 2, 2 }, - { ahc_patch0_func, 475, 6, 3 }, - { ahc_patch9_func, 475, 2, 2 }, - { ahc_patch0_func, 477, 3, 1 }, - { ahc_patch1_func, 483, 2, 2 }, - { ahc_patch0_func, 485, 9, 7 }, - { ahc_patch9_func, 485, 5, 6 }, - { ahc_patch19_func, 485, 1, 2 }, - { ahc_patch0_func, 486, 1, 1 }, - { ahc_patch19_func, 488, 1, 2 }, - { ahc_patch0_func, 489, 1, 1 }, - { ahc_patch0_func, 490, 4, 1 }, - { ahc_patch6_func, 494, 3, 2 }, - { ahc_patch0_func, 497, 1, 1 }, - { ahc_patch1_func, 500, 1, 1 }, - { ahc_patch6_func, 506, 1, 2 }, - { ahc_patch0_func, 507, 1, 1 }, - { ahc_patch20_func, 544, 7, 1 }, - { ahc_patch3_func, 572, 1, 2 }, - { ahc_patch0_func, 573, 1, 1 }, - { ahc_patch21_func, 576, 1, 1 }, - { ahc_patch8_func, 578, 104, 33 }, - { ahc_patch4_func, 579, 1, 1 }, - { ahc_patch1_func, 585, 2, 2 }, - { ahc_patch0_func, 587, 1, 1 }, - { ahc_patch1_func, 590, 1, 2 }, - { ahc_patch0_func, 591, 1, 1 }, - { ahc_patch9_func, 592, 3, 3 }, - { ahc_patch15_func, 593, 1, 1 }, - { ahc_patch0_func, 595, 4, 1 }, - { ahc_patch19_func, 603, 2, 2 }, - { ahc_patch0_func, 605, 1, 1 }, - { ahc_patch19_func, 609, 10, 3 }, - { ahc_patch5_func, 611, 8, 1 }, - { ahc_patch0_func, 619, 9, 2 }, - { ahc_patch5_func, 620, 8, 1 }, - { ahc_patch4_func, 630, 1, 2 }, - { ahc_patch0_func, 631, 1, 1 }, - { ahc_patch19_func, 632, 1, 2 }, - { ahc_patch0_func, 633, 3, 2 }, - { ahc_patch4_func, 635, 1, 1 }, - { ahc_patch5_func, 636, 1, 1 }, - { ahc_patch5_func, 639, 1, 1 }, - { ahc_patch5_func, 641, 1, 1 }, - { ahc_patch4_func, 643, 2, 2 }, - { ahc_patch0_func, 645, 2, 1 }, + { ahc_patch7_func, 433, 1, 1 }, + { ahc_patch8_func, 434, 3, 3 }, + { ahc_patch6_func, 435, 1, 2 }, + { ahc_patch0_func, 436, 1, 1 }, + { ahc_patch9_func, 437, 1, 1 }, + { ahc_patch15_func, 438, 1, 2 }, + { ahc_patch13_func, 438, 1, 1 }, + { ahc_patch14_func, 440, 9, 4 }, + { ahc_patch9_func, 440, 1, 1 }, + { ahc_patch9_func, 447, 2, 1 }, + { ahc_patch0_func, 449, 4, 3 }, + { ahc_patch9_func, 449, 1, 2 }, + { ahc_patch0_func, 450, 3, 1 }, + { ahc_patch1_func, 454, 2, 1 }, + { ahc_patch7_func, 456, 10, 2 }, + { ahc_patch0_func, 466, 1, 1 }, + { ahc_patch8_func, 467, 109, 23 }, + { ahc_patch1_func, 469, 3, 2 }, + { ahc_patch0_func, 472, 5, 3 }, + { ahc_patch9_func, 472, 2, 2 }, + { ahc_patch0_func, 474, 3, 1 }, + { ahc_patch1_func, 479, 2, 2 }, + { ahc_patch0_func, 481, 6, 3 }, + { ahc_patch9_func, 481, 2, 2 }, + { ahc_patch0_func, 483, 3, 1 }, + { ahc_patch1_func, 489, 2, 2 }, + { ahc_patch0_func, 491, 9, 7 }, + { ahc_patch9_func, 491, 5, 6 }, + { ahc_patch19_func, 491, 1, 2 }, + { ahc_patch0_func, 492, 1, 1 }, + { ahc_patch19_func, 494, 1, 2 }, + { ahc_patch0_func, 495, 1, 1 }, + { ahc_patch0_func, 496, 4, 1 }, + { ahc_patch6_func, 500, 3, 2 }, + { ahc_patch0_func, 503, 1, 1 }, + { ahc_patch1_func, 506, 1, 1 }, + { ahc_patch6_func, 512, 1, 2 }, + { ahc_patch0_func, 513, 1, 1 }, + { ahc_patch20_func, 550, 7, 1 }, + { ahc_patch3_func, 578, 1, 2 }, + { ahc_patch0_func, 579, 1, 1 }, + { ahc_patch21_func, 582, 1, 1 }, + { ahc_patch8_func, 584, 104, 33 }, + { ahc_patch4_func, 585, 1, 1 }, + { ahc_patch1_func, 591, 2, 2 }, + { ahc_patch0_func, 593, 1, 1 }, + { ahc_patch1_func, 596, 1, 2 }, + { ahc_patch0_func, 597, 1, 1 }, + { ahc_patch9_func, 598, 3, 3 }, + { ahc_patch15_func, 599, 1, 1 }, + { ahc_patch0_func, 601, 4, 1 }, + { ahc_patch19_func, 609, 2, 2 }, + { ahc_patch0_func, 611, 1, 1 }, + { ahc_patch19_func, 615, 10, 3 }, + { ahc_patch5_func, 617, 8, 1 }, + { ahc_patch0_func, 625, 9, 2 }, + { ahc_patch5_func, 626, 8, 1 }, + { ahc_patch4_func, 636, 1, 2 }, + { ahc_patch0_func, 637, 1, 1 }, + { ahc_patch19_func, 638, 1, 2 }, + { ahc_patch0_func, 639, 3, 2 }, + { ahc_patch4_func, 641, 1, 1 }, + { ahc_patch5_func, 642, 1, 1 }, + { ahc_patch5_func, 645, 1, 1 }, { ahc_patch5_func, 647, 1, 1 }, - { ahc_patch5_func, 650, 1, 1 }, + { ahc_patch4_func, 649, 2, 2 }, + { ahc_patch0_func, 651, 2, 1 }, { ahc_patch5_func, 653, 1, 1 }, - { ahc_patch19_func, 657, 1, 1 }, - { ahc_patch19_func, 660, 1, 1 }, - { ahc_patch4_func, 666, 1, 1 }, - { ahc_patch6_func, 669, 1, 2 }, - { ahc_patch0_func, 670, 1, 1 }, - { ahc_patch7_func, 682, 16, 1 }, - { ahc_patch4_func, 698, 20, 1 }, - { ahc_patch9_func, 719, 4, 2 }, - { ahc_patch0_func, 723, 4, 1 }, - { ahc_patch9_func, 727, 4, 2 }, - { ahc_patch0_func, 731, 3, 1 }, - { ahc_patch6_func, 737, 1, 1 }, - { ahc_patch22_func, 739, 14, 1 }, - { ahc_patch7_func, 753, 3, 1 }, - { ahc_patch9_func, 765, 24, 8 }, - { ahc_patch19_func, 769, 1, 2 }, - { ahc_patch0_func, 770, 1, 1 }, - { ahc_patch15_func, 775, 4, 2 }, - { ahc_patch0_func, 779, 7, 3 }, - { ahc_patch23_func, 779, 5, 2 }, - { ahc_patch0_func, 784, 2, 1 }, - { ahc_patch0_func, 789, 42, 3 }, - { ahc_patch18_func, 801, 18, 2 }, - { ahc_patch0_func, 819, 1, 1 }, - { ahc_patch4_func, 843, 1, 1 }, - { ahc_patch4_func, 844, 3, 2 }, - { ahc_patch0_func, 847, 1, 1 }, - { ahc_patch13_func, 848, 3, 1 }, - { ahc_patch4_func, 851, 12, 1 } + { ahc_patch5_func, 656, 1, 1 }, + { ahc_patch5_func, 659, 1, 1 }, + { ahc_patch19_func, 663, 1, 1 }, + { ahc_patch19_func, 666, 1, 1 }, + { ahc_patch4_func, 672, 1, 1 }, + { ahc_patch6_func, 675, 1, 2 }, + { ahc_patch0_func, 676, 1, 1 }, + { ahc_patch7_func, 688, 16, 1 }, + { ahc_patch4_func, 704, 20, 1 }, + { ahc_patch9_func, 725, 4, 2 }, + { ahc_patch0_func, 729, 4, 1 }, + { ahc_patch9_func, 733, 4, 2 }, + { ahc_patch0_func, 737, 3, 1 }, + { ahc_patch6_func, 743, 1, 1 }, + { ahc_patch22_func, 745, 14, 1 }, + { ahc_patch7_func, 759, 3, 1 }, + { ahc_patch9_func, 771, 24, 8 }, + { ahc_patch19_func, 775, 1, 2 }, + { ahc_patch0_func, 776, 1, 1 }, + { ahc_patch15_func, 781, 4, 2 }, + { ahc_patch0_func, 785, 7, 3 }, + { ahc_patch23_func, 785, 5, 2 }, + { ahc_patch0_func, 790, 2, 1 }, + { ahc_patch0_func, 795, 42, 3 }, + { ahc_patch18_func, 807, 18, 2 }, + { ahc_patch0_func, 825, 1, 1 }, + { ahc_patch4_func, 849, 1, 1 }, + { ahc_patch4_func, 850, 3, 2 }, + { ahc_patch0_func, 853, 1, 1 }, + { ahc_patch13_func, 854, 3, 1 }, + { ahc_patch4_func, 857, 12, 1 } }; struct cs { u_int16_t begin; @@ -1283,11 +1289,11 @@ } critical_sections[] = { { 11, 18 }, { 21, 30 }, - { 698, 714 }, - { 844, 847 }, - { 851, 857 }, - { 859, 861 }, - { 861, 863 } + { 704, 720 }, + { 850, 853 }, + { 857, 863 }, + { 865, 867 }, + { 867, 869 } }; const int num_critical_sections = sizeof(critical_sections) / sizeof(*critical_sections); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/Makefile linux/drivers/scsi/aic7xxx/aicasm/Makefile --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/Makefile Fri May 4 15:16:28 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/Makefile Thu Oct 25 13:53:49 2001 @@ -1,8 +1,9 @@ PROG= aicasm +.SUFFIXES= .l .y .c + CSRCS= aicasm.c aicasm_symbol.c GENSRCS= aicasm_gram.c aicasm_scan.c -DEPHDRS= aicdb.h GENHDRS= y.tab.h aicdb.h SRCS= ${GENSRCS} ${CSRCS} @@ -25,9 +26,7 @@ LFLAGS= -d endif -.SUFFIXES= .l .y .c - -$(PROG): $(SRCS) $(DEPHDRS) +$(PROG): $(SRCS) $(GENHDRS) $(AICASM_CC) $(AICASM_CFLAGS) $(SRCS) -o $(PROG) aicdb.h: @@ -45,3 +44,9 @@ clean: rm -f $(CLEANFILES) $(PROG) + +y.tab.h aicasm_gram.c: aicasm_gram.y + $(YACC) $(YFLAGS) aicasm_gram.y + mv y.tab.c aicasm_gram.c + +aicasm_scan.c: y.tab.h diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm.c linux/drivers/scsi/aic7xxx/aicasm/aicasm.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm.c Thu Oct 25 13:53:49 2001 @@ -1,7 +1,8 @@ /* * Aic7xxx SCSI host adapter firmware asssembler * - * Copyright (c) 1997, 1998, 2000 Justin T. Gibbs. + * Copyright (c) 1997, 1998, 2000, 2001 Justin T. Gibbs. + * Copyright (c) 2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -9,26 +10,34 @@ * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, - * without modification, immediately at the beginning of the file. - * 2. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * without modification. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm.c#8 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.c#11 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm.c,v 1.29 2000/10/05 04:25:42 gibbs Exp $ */ @@ -42,6 +51,12 @@ #include #include #include + +#if linux +#include +#else +#include +#endif #include "aicasm.h" #include "aicasm_symbol.h" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm.h linux/drivers/scsi/aic7xxx/aicasm/aicasm.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm.h Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm.h Thu Oct 25 13:53:49 2001 @@ -2,6 +2,7 @@ * Assembler for the sequencer program downloaded to Aic7xxx SCSI host adapters * * Copyright (c) 1997 Justin T. Gibbs. + * Copyright (c) 2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,25 +11,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm.h#5 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm.h#7 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm.h,v 1.11 2000/09/22 22:19:54 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_gram.y Thu Oct 25 13:53:49 2001 @@ -3,6 +3,7 @@ * Parser for the Aic7xxx SCSI Host adapter sequencer assembler. * * Copyright (c) 1997, 1998, 2000 Justin T. Gibbs. + * Copyright (c) 2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -11,25 +12,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_gram.y#7 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_gram.y#9 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_gram.y,v 1.12 2000/10/31 18:44:32 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h linux/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h Sun Mar 4 14:30:18 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_insformat.h Thu Oct 25 13:53:49 2001 @@ -11,34 +11,36 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_insformat.h#4 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#7 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_insformat.h,v 1.3 2000/09/22 22:19:54 gibbs Exp $ */ - -#if linux -#include -#else -#include -#endif struct ins_format1 { #if BYTE_ORDER == LITTLE_ENDIAN diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l Thu Oct 25 13:53:49 2001 @@ -2,7 +2,8 @@ /* * Lexical Analyzer for the Aic7xxx SCSI Host adapter sequencer assembler. * - * Copyright (c) 1997, 1998 Justin T. Gibbs. + * Copyright (c) 1997, 1998, 2000 Justin T. Gibbs. + * Copyright (c) 2001 Adaptec Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -11,25 +12,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#5 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_scan.l#7 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_scan.l,v 1.13 2000/09/22 22:19:54 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.c Thu Oct 25 13:53:49 2001 @@ -10,25 +10,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.c#7 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.c#9 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_symbol.c,v 1.11 2000/09/22 22:19:54 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.h linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.h --- v2.4.13/linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.h Sun Mar 4 14:30:18 2001 +++ linux/drivers/scsi/aic7xxx/aicasm/aicasm_symbol.h Thu Oct 25 13:53:49 2001 @@ -10,25 +10,33 @@ * 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. + * 2. Redistributions in binary form must reproduce at minimum a disclaimer + * substantially similar to the "NO WARRANTY" disclaimer below + * ("Disclaimer") and any redistribution must be conditioned upon + * including a substantially similar Disclaimer requirement for further + * binary redistribution. + * 3. Neither the names of the above-listed copyright holders nor the names + * of any contributors may 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 Public License ("GPL"). + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. * - * 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 + * NO WARRANTY + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.h#4 $ + * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_symbol.h#6 $ * * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_symbol.h,v 1.11 2000/09/22 22:19:55 gibbs Exp $ */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/aic7xxx/cam.h linux/drivers/scsi/aic7xxx/cam.h --- v2.4.13/linux/drivers/scsi/aic7xxx/cam.h Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/aic7xxx/cam.h Thu Oct 25 13:53:49 2001 @@ -15,7 +15,7 @@ * derived from this software without specific prior written permission. * * Alternatively, this software may be distributed under the terms of the - * GNU Public License ("GPL"). + * 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 @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/linux/drivers/scsi/aic7xxx/cam.h#10 $ + * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/cam.h#11 $ */ #ifndef _AIC7XXX_CAM_H diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/amiga7xx.c linux/drivers/scsi/amiga7xx.c --- v2.4.13/linux/drivers/scsi/amiga7xx.c Fri Dec 29 14:07:22 2000 +++ linux/drivers/scsi/amiga7xx.c Thu Oct 25 13:53:49 2001 @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include "scsi.h" @@ -133,3 +133,6 @@ called = 1; return num; } + +static Scsi_Host_Template driver_template = AMIGA7XX_SCSI; +#include "scsi_module.c" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/blz1230.c linux/drivers/scsi/blz1230.c --- v2.4.13/linux/drivers/scsi/blz1230.c Tue Mar 6 19:44:37 2001 +++ linux/drivers/scsi/blz1230.c Thu Oct 25 13:53:49 2001 @@ -51,7 +51,7 @@ static int dma_ports_p(struct NCR_ESP *esp); static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write); -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are transferred to the ESP chip * via PIO. @@ -64,6 +64,7 @@ struct zorro_dev *z = NULL; unsigned long address; struct ESP_regs *eregs; + unsigned long board; #if MKIV #define REAL_BLZ1230_ID ZORRO_PROD_PHASE5_BLIZZARD_1230_IV_1260 @@ -76,7 +77,7 @@ #endif if ((z = zorro_find_device(REAL_BLZ1230_ID, z))) { - unsigned long board = z->resource.start; + board = z->resource.start; if (request_mem_region(board+REAL_BLZ1230_ESP_ADDR, sizeof(struct ESP_regs), "NCR53C9x")) { /* Do some magic to figure out if the blizzard is diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/blz2060.c linux/drivers/scsi/blz2060.c --- v2.4.13/linux/drivers/scsi/blz2060.c Fri Mar 2 18:38:38 2001 +++ linux/drivers/scsi/blz2060.c Thu Oct 25 13:53:49 2001 @@ -51,7 +51,7 @@ static int dma_ports_p(struct NCR_ESP *esp); static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write); -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are transferred to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/bvme6000.c linux/drivers/scsi/bvme6000.c --- v2.4.13/linux/drivers/scsi/bvme6000.c Thu Nov 11 16:57:30 1999 +++ linux/drivers/scsi/bvme6000.c Thu Oct 25 13:53:49 2001 @@ -50,3 +50,6 @@ called = 1; return 1; } + +static Scsi_Host_Template driver_template = BVME6000_SCSI; +#include "scsi_module.c" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/constants.c linux/drivers/scsi/constants.c --- v2.4.13/linux/drivers/scsi/constants.c Tue Jul 3 17:08:20 2001 +++ linux/drivers/scsi/constants.c Thu Oct 25 13:53:50 2001 @@ -74,6 +74,18 @@ }; +/* The following are 16 byte commands in group 4 */ +static const char *group_4_commands[] = { +/* 80-84 */ unknown, unknown, unknown, unknown, unknown, +/* 85-89 */ "Memory Export In (16)", unknown, unknown, unknown, + "Memory Export Out (16)", +/* 8a-8f */ unknown, unknown, unknown, unknown, unknown, unknown, +/* 90-94 */ unknown, unknown, unknown, unknown, unknown, +/* 95-99 */ unknown, unknown, unknown, unknown, unknown, +/* 9a-9f */ unknown, unknown, unknown, unknown, unknown, unknown, +}; + + /* The following are 12 byte commands in group 5 */ static const char *group_5_commands[] = { /* a0-a5 */ unknown, unknown, unknown, unknown, unknown, @@ -97,7 +109,7 @@ static const char **commands[] = { group_0_commands, group_1_commands, group_2_commands, - (const char **) RESERVED_GROUP, (const char **) RESERVED_GROUP, + (const char **) RESERVED_GROUP, group_4_commands, group_5_commands, (const char **) VENDOR_GROUP, (const char **) VENDOR_GROUP }; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/cpqfc.Readme linux/drivers/scsi/cpqfc.Readme --- v2.4.13/linux/drivers/scsi/cpqfc.Readme Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/cpqfc.Readme Thu Oct 25 13:53:50 2001 @@ -7,6 +7,21 @@ SEST size 512 Exchanges (simultaneous I/Os) limited by module kmalloc() max of 128k bytes contiguous. +Ver 2.1.1 Oct 18, 2001 + * reinitialize Cmnd->SCp.sent_command (used to identify commands as + passthrus) on calling scsi_done, since the scsi mid layer does not + use (or reinitialize) this field to prevent subsequent comands from + having it set incorrectly. + +Ver 2.1.0 Aug 27, 2001 + * Revise driver to use new kernel 2.4.x PCI DMA API, instead of + virt_to_bus(). (enables driver to work w/ ia64 systems with >2Gb RAM.) + Rework main scatter-gather code to handle cases where SG element + lengths are larger than 0x7FFFF bytes and use as many scatter + gather pages as necessary. (Steve Cameron) + * Makefile changes to bring cpqfc into line w/ rest of SCSI drivers + (thanks to Keith Owens) + Ver 2.0.5 Aug 06, 2001 * Reject non-existent luns in the driver rather than letting the hardware do it. (some HW behaves differently than others in this area.) diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/cpqfcTScontrol.c linux/drivers/scsi/cpqfcTScontrol.c --- v2.4.13/linux/drivers/scsi/cpqfcTScontrol.c Sun Aug 12 13:28:00 2001 +++ linux/drivers/scsi/cpqfcTScontrol.c Thu Oct 25 13:53:50 2001 @@ -55,6 +55,21 @@ static void CpqTsGetSFQEntry(TACHYON * fcChip, USHORT pi, ULONG * buffr, BOOLEAN UpdateChip); +static void +cpqfc_free_dma_consistent(CPQFCHBA *cpqfcHBAdata) +{ + // free up the primary EXCHANGES struct and Link Q + PTACHYON fcChip = &cpqfcHBAdata->fcChip; + + if (fcChip->Exchanges != NULL) + pci_free_consistent(cpqfcHBAdata->PciDev, sizeof(FC_EXCHANGES), + fcChip->Exchanges, fcChip->exch_dma_handle); + fcChip->Exchanges = NULL; + if (cpqfcHBAdata->fcLQ != NULL) + pci_free_consistent(cpqfcHBAdata->PciDev, sizeof(FC_LINK_QUE), + cpqfcHBAdata->fcLQ, cpqfcHBAdata->fcLQ_dma_handle); + cpqfcHBAdata->fcLQ = NULL; +} // Note special requirements for Q alignment! (TL/TS UG pg. 190) // We place critical index pointers at end of QUE elements to assist @@ -68,7 +83,8 @@ int iStatus=0; unsigned long ulAddr; - + dma_addr_t ERQdma, IMQdma, SPQdma, SESTdma; + int i; // NOTE! fcMemManager() will return system virtual addresses. // System (kernel) virtual addresses, though non-paged, still @@ -78,15 +94,18 @@ // Allocate primary EXCHANGES array... + fcChip->Exchanges = NULL; + cpqfcHBAdata->fcLQ = NULL; printk("Allocating %u for %u Exchanges ", (ULONG)sizeof(FC_EXCHANGES), TACH_MAX_XID); - fcChip->Exchanges = kmalloc( sizeof( FC_EXCHANGES), GFP_KERNEL ); + fcChip->Exchanges = pci_alloc_consistent(cpqfcHBAdata->PciDev, + sizeof(FC_EXCHANGES), &fcChip->exch_dma_handle); printk("@ %p\n", fcChip->Exchanges); if( fcChip->Exchanges == NULL ) // fatal error!! { - printk("kmalloc failure on Exchanges: fatal error\n"); + printk("pci_alloc_consistent failure on Exchanges: fatal error\n"); return -1; } // zero out the entire EXCHANGE space @@ -94,25 +113,24 @@ printk("Allocating %u for LinkQ ", (ULONG)sizeof(FC_LINK_QUE)); - cpqfcHBAdata->fcLQ = kmalloc( sizeof( FC_LINK_QUE), GFP_KERNEL ); + cpqfcHBAdata->fcLQ = pci_alloc_consistent(cpqfcHBAdata->PciDev, + sizeof( FC_LINK_QUE), &cpqfcHBAdata->fcLQ_dma_handle); printk("@ %p (%u elements)\n", cpqfcHBAdata->fcLQ, FC_LINKQ_DEPTH); memset( cpqfcHBAdata->fcLQ, 0, sizeof( FC_LINK_QUE)); if( cpqfcHBAdata->fcLQ == NULL ) // fatal error!! { - printk("kmalloc failure on fc Link Que: fatal error\n"); + cpqfc_free_dma_consistent(cpqfcHBAdata); + printk("pci_alloc_consistent() failure on fc Link Que: fatal error\n"); return -1; } // zero out the entire EXCHANGE space memset( cpqfcHBAdata->fcLQ, 0, sizeof( FC_LINK_QUE)); - - - // Verify that basic Tach I/O registers are not NULL - if( !fcChip->Registers.ReMapMemBase ) { + cpqfc_free_dma_consistent(cpqfcHBAdata); printk("HBA base address NULL: fatal error\n"); return -1; } @@ -125,18 +143,21 @@ // Allocate Tach's Exchange Request Queue (each ERQ entry 32 bytes) - fcChip->ERQ = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - sizeof( TachLiteERQ ), 32*(ERQ_LEN), 0L ); + fcChip->ERQ = fcMemManager( cpqfcHBAdata->PciDev, + &cpqfcHBAdata->dynamic_mem[0], + sizeof( TachLiteERQ ), 32*(ERQ_LEN), 0L, &ERQdma); if( !fcChip->ERQ ) { - printk("kmalloc/alignment failure on ERQ: fatal error\n"); + cpqfc_free_dma_consistent(cpqfcHBAdata); + printk("pci_alloc_consistent/alignment failure on ERQ: fatal error\n"); return -1; } fcChip->ERQ->length = ERQ_LEN-1; - ulAddr = virt_to_bus( fcChip->ERQ); + ulAddr = (ULONG) ERQdma; #if BITS_PER_LONG > 32 if( (ulAddr >> 32) ) { + cpqfc_free_dma_consistent(cpqfcHBAdata); printk(" FATAL! ERQ ptr %p exceeds Tachyon's 32-bit register size\n", (void*)ulAddr); return -1; // failed @@ -147,19 +168,22 @@ // Allocate Tach's Inbound Message Queue (32 bytes per entry) - fcChip->IMQ = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - sizeof( TachyonIMQ ), 32*(IMQ_LEN), 0L ); + fcChip->IMQ = fcMemManager( cpqfcHBAdata->PciDev, + &cpqfcHBAdata->dynamic_mem[0], + sizeof( TachyonIMQ ), 32*(IMQ_LEN), 0L, &IMQdma ); if( !fcChip->IMQ ) { - printk("kmalloc/alignment failure on IMQ: fatal error\n"); + cpqfc_free_dma_consistent(cpqfcHBAdata); + printk("pci_alloc_consistent/alignment failure on IMQ: fatal error\n"); return -1; } fcChip->IMQ->length = IMQ_LEN-1; - ulAddr = virt_to_bus( fcChip->IMQ); + ulAddr = IMQdma; #if BITS_PER_LONG > 32 if( (ulAddr >> 32) ) { + cpqfc_free_dma_consistent(cpqfcHBAdata); printk(" FATAL! IMQ ptr %p exceeds Tachyon's 32-bit register size\n", (void*)ulAddr); return -1; // failed @@ -169,20 +193,23 @@ // Allocate Tach's Single Frame Queue (64 bytes per entry) - fcChip->SFQ = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - sizeof( TachLiteSFQ ), 64*(SFQ_LEN),0L ); + fcChip->SFQ = fcMemManager( cpqfcHBAdata->PciDev, + &cpqfcHBAdata->dynamic_mem[0], + sizeof( TachLiteSFQ ), 64*(SFQ_LEN),0L, &SPQdma ); if( !fcChip->SFQ ) { - printk("kmalloc/alignment failure on SFQ: fatal error\n"); + cpqfc_free_dma_consistent(cpqfcHBAdata); + printk("pci_alloc_consistent/alignment failure on SFQ: fatal error\n"); return -1; } fcChip->SFQ->length = SFQ_LEN-1; // i.e. Que length [# entries - // min. 32; max. 4096 (0xffff)] - ulAddr = virt_to_bus( fcChip->SFQ); + ulAddr = SPQdma; #if BITS_PER_LONG > 32 if( (ulAddr >> 32) ) { + cpqfc_free_dma_consistent(cpqfcHBAdata); printk(" FATAL! SFQ ptr %p exceeds Tachyon's 32-bit register size\n", (void*)ulAddr); return -1; // failed @@ -197,22 +224,28 @@ // be on physical page (e.g. 4k) boundary. printk("Allocating %u for TachSEST for %u Exchanges\n", (ULONG)sizeof(TachSEST), TACH_SEST_LEN); - fcChip->SEST = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - sizeof(TachSEST), 4, 0L ); + fcChip->SEST = fcMemManager( cpqfcHBAdata->PciDev, + &cpqfcHBAdata->dynamic_mem[0], + sizeof(TachSEST), 4, 0L, &SESTdma ); // sizeof(TachSEST), 64*TACH_SEST_LEN, 0L ); if( !fcChip->SEST ) { - printk("kmalloc/alignment failure on SEST: fatal error\n"); + cpqfc_free_dma_consistent(cpqfcHBAdata); + printk("pci_alloc_consistent/alignment failure on SEST: fatal error\n"); return -1; } + for( i=0; i < TACH_SEST_LEN; i++) // for each exchange + fcChip->SEST->sgPages[i] = NULL; + fcChip->SEST->length = TACH_SEST_LEN; // e.g. DON'T subtract one // (TL/TS UG, pg 153) - ulAddr = virt_to_bus( fcChip->SEST); + ulAddr = SESTdma; #if BITS_PER_LONG > 32 if( (ulAddr >> 32) ) { + cpqfc_free_dma_consistent(cpqfcHBAdata); printk(" FATAL! SFQ ptr %p exceeds Tachyon's 32-bit register size\n", (void*)ulAddr); return -1; // failed @@ -241,7 +274,8 @@ // NOTE! write consumer index last, since the write // causes Tachyon to process the other registers - ulAddr = virt_to_bus( &fcChip->ERQ->consumerIndex); + ulAddr = ((unsigned long)&fcChip->ERQ->consumerIndex - + (unsigned long)fcChip->ERQ) + (unsigned long) ERQdma; // NOTE! Tachyon DMAs to the ERQ consumer Index host // address; must be correctly aligned @@ -269,10 +303,13 @@ // NOTE: TachLite DMAs to the producerIndex host address // must be correctly aligned with address bits 1-0 cleared // Writing the BASE register clears the PI register, so write it last - ulAddr = virt_to_bus( &fcChip->IMQ->producerIndex); + ulAddr = ((unsigned long)&fcChip->IMQ->producerIndex - + (unsigned long)fcChip->IMQ) + (unsigned long) IMQdma; + #if BITS_PER_LONG > 32 if( (ulAddr >> 32) ) { + cpqfc_free_dma_consistent(cpqfcHBAdata); printk(" FATAL! IMQ ptr %p exceeds Tachyon's 32-bit register size\n", (void*)ulAddr); return -1; // failed @@ -1225,7 +1262,7 @@ #endif Exchanges->fcExchange[i].status |= INITIATOR_ABORT; - cpqfcTSCompleteExchange( fcChip, i); // abort on LDn + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, i); // abort on LDn } } @@ -1505,7 +1542,7 @@ if( RPCset ) // SEST transaction Response frame rec'd { // complete the command in our driver... - cpqfcTSCompleteExchange( fcChip, x_ID); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev,fcChip, x_ID); } // end "RPCset" @@ -1709,16 +1746,15 @@ case 3: // allocate mem, set Tachyon Que registers iStatus = CpqTsCreateTachLiteQues( cpqfcHBAdata, opcode2); + if( iStatus ) + break; + // now that the Queues exist, Tach can DMA to them, so // we can begin processing INTs // INTEN register - enable INT (TachLite interrupt) writeb( 0x1F, fcChip->Registers.ReMapMemBase + IINTEN); - - if( iStatus ) - break; - - + // Fall through case 4: // Config Fame Manager, Init Loop Command, laser on // L_PORT or loopback @@ -1750,9 +1786,11 @@ { CPQFCHBA *cpqfcHBAdata = (CPQFCHBA*)pHBA; PTACHYON fcChip = &cpqfcHBAdata->fcChip; - USHORT i, j, iStatus=0; + USHORT i, iStatus=0; void* vPtr; // mem Align manager sets this to the freed address on success unsigned long ulPtr; // for 64-bit pointer cast (e.g. Alpa machine) + FC_EXCHANGES *Exchanges = fcChip->Exchanges; + PSGPAGES j, next; ENTER("DestroyTachLiteQues"); @@ -1760,19 +1798,25 @@ { // search out and free Pool for Extended S/G list pages - for( i=0, j=0; i < TACH_SEST_LEN; i++, j=0) // for each exchange + for( i=0; i < TACH_SEST_LEN; i++) // for each exchange { - // It's possible that extended S/G pages were allocated and + // It's possible that extended S/G pages were allocated, mapped, and // not cleared due to error conditions or O/S driver termination. // Make sure they're all gone. - while( fcChip->SEST->sgPages[i].PoolPage[j] && - (j < TL_MAX_SGPAGES)) - kfree( fcChip->SEST->sgPages[i].PoolPage[j++]); - + if (Exchanges->fcExchange[i].Cmnd != NULL) + cpqfc_pci_unmap(cpqfcHBAdata->PciDev, Exchanges->fcExchange[i].Cmnd, + fcChip, i); // undo DMA mappings. + + for (j=fcChip->SEST->sgPages[i] ; j != NULL ; j = next) { + next = j->next; + kfree(j); + } + fcChip->SEST->sgPages[i] = NULL; } ulPtr = (unsigned long)fcChip->SEST; - vPtr = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - 0,0, (ULONG)ulPtr ); // 'free' mem + vPtr = fcMemManager( cpqfcHBAdata->PciDev, + &cpqfcHBAdata->dynamic_mem[0], + 0,0, (ULONG)ulPtr, NULL ); // 'free' mem fcChip->SEST = 0L; // null invalid ptr if( !vPtr ) { @@ -1785,8 +1829,9 @@ { ulPtr = (unsigned long)fcChip->SFQ; - vPtr = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - 0,0, (ULONG)ulPtr ); // 'free' mem + vPtr = fcMemManager( cpqfcHBAdata->PciDev, + &cpqfcHBAdata->dynamic_mem[0], + 0,0, (ULONG)ulPtr, NULL ); // 'free' mem fcChip->SFQ = 0L; // null invalid ptr if( !vPtr ) { @@ -1803,8 +1848,8 @@ fcChip->IMQ->consumerIndex = 0; ulPtr = (unsigned long)fcChip->IMQ; - vPtr = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - 0,0, (ULONG)ulPtr ); // 'free' mem + vPtr = fcMemManager( cpqfcHBAdata->PciDev, &cpqfcHBAdata->dynamic_mem[0], + 0,0, (ULONG)ulPtr, NULL ); // 'free' mem fcChip->IMQ = 0L; // null invalid ptr if( !vPtr ) { @@ -1816,8 +1861,8 @@ if( fcChip->ERQ ) // release memory blocks used by the queues { ulPtr = (unsigned long)fcChip->ERQ; - vPtr = fcMemManager( &cpqfcHBAdata->dynamic_mem[0], - 0,0, (ULONG)ulPtr ); // 'free' mem + vPtr = fcMemManager( cpqfcHBAdata->PciDev, &cpqfcHBAdata->dynamic_mem[0], + 0,0, (ULONG)ulPtr, NULL ); // 'free' mem fcChip->ERQ = 0L; // null invalid ptr if( !vPtr ) { @@ -1826,19 +1871,8 @@ } } - // free up the primary EXCHANGES struct - if( fcChip->Exchanges != NULL) - { -// printk("kfree() on Exchanges @%p\n", fcChip->Exchanges); - kfree( fcChip->Exchanges); - } - - // free up Link Q - if( cpqfcHBAdata->fcLQ != NULL ) - { -// printk("kfree() on LinkQ @%p\n", fcChip->fcLQ); - kfree( cpqfcHBAdata->fcLQ); - } + // free up the primary EXCHANGES struct and Link Q + cpqfc_free_dma_consistent(cpqfcHBAdata); LEAVE("DestroyTachLiteQues"); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/cpqfcTSinit.c linux/drivers/scsi/cpqfcTSinit.c --- v2.4.13/linux/drivers/scsi/cpqfcTSinit.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/cpqfcTSinit.c Thu Oct 25 13:53:50 2001 @@ -67,7 +67,7 @@ /* Embedded module documentation macros - see module.h */ MODULE_AUTHOR("Compaq Computer Corporation"); -MODULE_DESCRIPTION("Driver for Compaq 64-bit/66Mhz PCI Fibre Channel HBA"); +MODULE_DESCRIPTION("Driver for Compaq 64-bit/66Mhz PCI Fibre Channel HBA v. 2.1.1"); MODULE_LICENSE("GPL"); int cpqfcTS_TargetDeviceReset( Scsi_Device *ScsiDev, unsigned int reset_flags); @@ -304,6 +304,13 @@ while( (PciDev = pci_find_device( PCIids[i].vendor_id, PCIids[i].device_id, PciDev) )) { + + if (pci_set_dma_mask(PciDev, CPQFCTS_DMA_MASK) != 0) { + printk(KERN_WARNING + "cpqfc: HBA cannot support required DMA mask, skipping.\n"); + continue; + } + // NOTE: (kernel 2.2.12-32) limits allocation to 128k bytes... printk(" scsi_register allocating %d bytes for FC HBA\n", (ULONG)sizeof(CPQFCHBA)); @@ -415,8 +422,10 @@ // now initialize our hardware... - - cpqfcHBAdata->fcChip.InitializeTachyon( cpqfcHBAdata, 1,1); + if (cpqfcHBAdata->fcChip.InitializeTachyon( cpqfcHBAdata, 1,1)) { + printk(KERN_WARNING "cpqfc: initialization of HBA hardware failed.\n"); + // FIXME: might want to do something better than nothing here. + } cpqfcHBAdata->fcStatsTime = jiffies; // (for FC Statistics delta) @@ -660,7 +669,7 @@ - case SCSI_IOCTL_FC_TARGET_ADDRESS: + case CPQFC_IOCTL_FC_TARGET_ADDRESS: result = verify_area(VERIFY_WRITE, arg, sizeof(Scsi_FCTargAddress)); if (result) @@ -678,7 +687,7 @@ break; - case SCSI_IOCTL_FC_TDR: + case CPQFC_IOCTL_FC_TDR: result = cpqfcTS_TargetDeviceReset( ScsiDev, 0); @@ -880,7 +889,6 @@ cpqfcTSDecodeGBICtype( &cpqfcHBA->fcChip, &buf[0]); cpqfcTSGetLPSM( &cpqfcHBA->fcChip, &buf[ strlen(buf)]); copy_info(&info, "%s\n", buf); - #define DISPLAY_WWN_INFO #ifdef DISPLAY_WWN_INFO @@ -905,6 +913,9 @@ } } #endif + + + // Unfortunately, the proc_info buffer isn't big enough @@ -1191,6 +1202,9 @@ // The file "hosts.h" says not to call scsi_done from // inside _queuecommand, so we'll do it from the heartbeat timer +// (clarification: Turns out it's ok to call scsi_done from queuecommand +// for cases that don't go to the hardware like scsi cmds destined +// for LUNs we know don't exist, so this code might be simplified...) static void QueBadTargetCmnd( CPQFCHBA *cpqfcHBAdata, Scsi_Cmnd *Cmnd) { @@ -1675,8 +1689,15 @@ printk(" cpqfcTS adapter PCI master address crossed 45-bit boundary\n"); if( IntPending & 0x2 ) printk(" cpqfcTS adapter DMA error detected\n"); - if( IntPending & 0x1 ) + if( IntPending & 0x1 ) { + UCHAR IntStat; printk(" cpqfcTS adapter PCI error detected\n"); + IntStat = readb( cpqfcHBA->fcChip.Registers.INTSTAT.address); + if (IntStat & 0x4) printk("(INT)\n"); + if (IntStat & 0x8) + printk("CRS: PCI master address crossed 46 bit bouandary\n"); + if (IntStat & 0x10) printk("MRE: external memory parity error.\n"); + } } } spin_unlock_irqrestore( &io_request_lock, flags); @@ -1859,8 +1880,9 @@ // we need about 8 allocations per HBA. Figuring at most 10 HBAs per server // size the dynamic_mem array at 80. -void* fcMemManager( ALIGNED_MEM *dynamic_mem, ULONG n_alloc, ULONG ab, - ULONG u32_AlignedAddress) +void* fcMemManager( struct pci_dev *pdev, ALIGNED_MEM *dynamic_mem, + ULONG n_alloc, ULONG ab, ULONG u32_AlignedAddress, + dma_addr_t *dma_handle) { USHORT allocBoundary=1; // compiler specific - worst case 1 // best case - replace malloc() call @@ -1882,38 +1904,51 @@ if( dynamic_mem[i].AlignedAddress == u32_AlignedAddress ) { alloc_address = dynamic_mem[i].BaseAllocated; // 'success' status - kfree( dynamic_mem[i].BaseAllocated); // return pages to kernel + pci_free_consistent(pdev,dynamic_mem[i].size, + alloc_address, + dynamic_mem[i].dma_handle); dynamic_mem[i].BaseAllocated = 0; // clear for next use dynamic_mem[i].AlignedAddress = 0; + dynamic_mem[i].size = 0; break; // quit for loop; done } } } else if( n_alloc ) // want new memory? { + dma_addr_t handle; t_alloc = n_alloc + (ab - allocBoundary); // pad bytes for alignment -// printk("kmalloc() for Tach alignment: %ld bytes\n", t_alloc); +// printk("pci_alloc_consistent() for Tach alignment: %ld bytes\n", t_alloc); +// (would like to) allow thread block to free pages alloc_address = // total bytes (NumberOfBytes) - kmalloc( t_alloc, GFP_KERNEL); // allow thread block to free pages - + pci_alloc_consistent(pdev, t_alloc, &handle); // now mask off least sig. bits of address if( alloc_address ) // (only if non-NULL) { // find place to store ptr, so we // can free it later... + + mask = (LONG)(ab - 1); // mask all low-order bits + mask = ~mask; // invert bits for( i=0; i jiffies ;) ; } + #define CPQFCTS_DRIVER_VER(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) +// don't forget to also change MODULE_DESCRIPTION in cpqfcTSinit.c #define VER_MAJOR 2 -#define VER_MINOR 0 -#define VER_SUBMINOR 5 +#define VER_MINOR 1 +#define VER_SUBMINOR 1 // Macros for kernel (esp. SMP) tracing using a PCI analyzer // (e.g. x86). @@ -413,11 +415,23 @@ // struct is sized for largest expected cmnd (LOGIN) } TachLiteERQ; +// for now, just 32 bit DMA, eventually 40something, with code changes +#define CPQFCTS_DMA_MASK ((unsigned long) (0x00000000FFFFFFFF)) + +#define TL_MAX_SG_ELEM_LEN 0x7ffff // Max buffer length a single S/G entry + // may represent (a hardware limitation). The + // only reason to ever change this is if you + // want to exercise very-hard-to-reach code in + // cpqfcTSworker.c:build_SEST_sglist(). + +#define TL_DANGER_SGPAGES 7 // arbitrary high water mark for # of S/G pages + // we must exceed to elicit a warning indicative + // of EXTREMELY large data transfers or + // EXTREME memory fragmentation. + // (means we just used up 2048 S/G elements, + // Never seen this is real life, only in + // testing with tricked up driver.) -#define TL_MAX_SGPAGES 4 // arbitrary limit to # of TL Ext. S/G pages - // stores array of allocated page blocks used - // in extended S/G lists. Affects amount of static - // memory consumed by driver. #define TL_EXT_SG_PAGE_COUNT 256 // Number of Extended Scatter/Gather a/l PAIRS // Tachyon register (IOBaseU 0x68) // power-of-2 value ONLY! 4 min, 256 max @@ -435,6 +449,8 @@ ULONG RSP_Len; ULONG RSP_Addr; ULONG Buff_Off; +#define USES_EXTENDED_SGLIST(this_sest, x_ID) \ + (!((this_sest)->u[ x_ID ].IWE.Buff_Off & 0x80000000)) ULONG Link; ULONG RX_ID; ULONG Data_Len; @@ -514,12 +530,14 @@ ULONG GAddr3; } TachLiteTRE; -typedef struct +typedef struct ext_sg_page_ptr_t *PSGPAGES; +typedef struct ext_sg_page_ptr_t { - void *PoolPage[TL_MAX_SGPAGES]; -} SGPAGES, *PSGPAGES; // linked list of S/G pairs, by Exchange - - + unsigned char page[TL_EXT_SG_PAGE_BYTELEN * 2]; // 2x for alignment + dma_addr_t busaddr; // need the bus addresses and + unsigned int maplen; // lengths for later pci unmapping. + PSGPAGES next; +} SGPAGES; // linked list of S/G pairs, by Exchange typedef struct // SCSI Exchange State Table { @@ -533,7 +551,7 @@ TachFCHDR DataHDR[TACH_SEST_LEN]; // for SEST FCP_DATA frame hdr (no pl) TachFCHDR_RSP RspHDR[TACH_SEST_LEN]; // space for SEST FCP_RSP frame - SGPAGES sgPages[TACH_SEST_LEN]; // array of Pool-allocations + PSGPAGES sgPages[TACH_SEST_LEN]; // head of linked list of Pool-allocations ULONG length; // Length register ULONG base; // copy of base ptr for debug } TachSEST; @@ -642,6 +660,8 @@ { void *BaseAllocated; // address as allocated from O/S; unsigned long AlignedAddress; // aligned address (used by Tachyon DMA) + dma_addr_t dma_handle; + size_t size; } ALIGNED_MEM; @@ -785,6 +805,8 @@ TachLiteSFQ *SFQ; // Single Frame Queue TachSEST *SEST; // SCSI Exchange State Table + dma_addr_t exch_dma_handle; + // these function pointers are for "generic" functions, which are // replaced with Host Bus Adapter types at // runtime. @@ -834,8 +856,9 @@ // define misc functions int cpqfcTSGetLPSM( PTACHYON fcChip, char cErrorString[]); int cpqfcTSDecodeGBICtype( PTACHYON fcChip, char cErrorString[]); -void* fcMemManager( ALIGNED_MEM *dyn_mem_pair, ULONG n_alloc, ULONG ab, - ULONG ulAlignedAddress); +void* fcMemManager( struct pci_dev *pdev, + ALIGNED_MEM *dyn_mem_pair, ULONG n_alloc, ULONG ab, + ULONG ulAlignedAddress, dma_addr_t *dma_handle); void BigEndianSwap( UCHAR *source, UCHAR *dest, USHORT cnt); @@ -903,6 +926,7 @@ ALIGNED_MEM dynamic_mem[DYNAMIC_ALLOCATIONS]; struct pci_dev *PciDev; + dma_addr_t fcLQ_dma_handle; Scsi_Cmnd *LinkDnCmnd[CPQFCTS_REQ_QUEUE_LEN]; // collects Cmnds during LDn // (for Acceptable targets) @@ -964,6 +988,7 @@ LONG ExchangeID ); void cpqfcTSCompleteExchange( + struct pci_dev *pcidev, PTACHYON fcChip, ULONG exchange_ID); @@ -993,9 +1018,10 @@ void fcSestReset( CPQFCHBA *); - - - +void cpqfc_pci_unmap(struct pci_dev *pcidev, + Scsi_Cmnd *cmd, + PTACHYON fcChip, + ULONG x_ID); extern const UCHAR valid_al_pa[]; extern const int number_of_al_pa; @@ -1376,6 +1402,12 @@ ULONG s_id; } ADISC_PAYLOAD; + +struct ext_sg_entry_t { + __u32 len:18; /* buffer length, bits 0-17 */ + __u32 uba:13; /* upper bus address bits 18-31 */ + __u32 lba; /* lower bus address bits 0-31 */ +}; // J. McCarty's LINK.H // diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/cpqfcTSworker.c linux/drivers/scsi/cpqfcTSworker.c --- v2.4.13/linux/drivers/scsi/cpqfcTSworker.c Mon Aug 27 12:41:44 2001 +++ linux/drivers/scsi/cpqfcTSworker.c Thu Oct 25 13:53:50 2001 @@ -703,8 +703,7 @@ { // printk(" *Terminating x_ID %Xh on %Xh* ", // x_ID, Exchanges->fcExchange[x_ID].status); - cpqfcTSCompleteExchange( fcChip, x_ID); - + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, x_ID); } } // end of ABTS case @@ -2061,7 +2060,7 @@ Done: // Regardless of whether the Reply is valid or not, the // the exchange is done - complete - cpqfcTSCompleteExchange( fcChip, (fchs->ox_rx_id >>16)); // complete + cpqfcTSCompleteExchange(cpqfcHBAdata->PciDev, fcChip, (fchs->ox_rx_id >>16)); Quit: return; @@ -2146,7 +2145,7 @@ // Regardless of whether the Reply is valid or not, the // the exchange is done - complete - cpqfcTSCompleteExchange( fcChip, (fchs->ox_rx_id >>16)); // complete + cpqfcTSCompleteExchange(cpqfcHBAdata->PciDev, fcChip, (fchs->ox_rx_id >>16)); Quit: return; @@ -2328,7 +2327,7 @@ !(fcChip->SEST->u[ ExchangeID].IWE.Hdr_Len & 0x80000000)) { - cpqfcTSCompleteExchange( fcChip, ExchangeID); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, ExchangeID); } else { @@ -2370,7 +2369,7 @@ ((Exchanges->fcExchange[ ExchangeID].fchs.d_id & 0xFFFFFF) == (fchs->s_id & 0xFFFFFF)) ) { - cpqfcTSCompleteExchange( fcChip, ExchangeID ); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, ExchangeID ); } } } @@ -2409,7 +2408,7 @@ // already completed the exchange... // printk("complete x_ID %Xh on ABTS RJT\n", ExchangeID); - cpqfcTSCompleteExchange( fcChip, ExchangeID ); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, ExchangeID ); } } } // end of ABTS check @@ -2672,7 +2671,7 @@ printk("completing x_ID %X on status %Xh\n", ExchangeID, Exchanges->fcExchange[ExchangeID].status); #endif - cpqfcTSCompleteExchange( fcChip, ExchangeID); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, ExchangeID); } } else // Xchange setup failed... @@ -2915,6 +2914,22 @@ Done: } +static void +call_scsi_done(Scsi_Cmnd *Cmnd) +{ + // We have to reinitialize sent_command here, so the scsi-mid + // layer won't re-use the scsi command leaving it set incorrectly. + // (incorrectly for our purposes...it's normally unused.) + + if (Cmnd->SCp.sent_command != 0) { // was it a passthru? + Cmnd->SCp.sent_command = 0; + Cmnd->result &= 0xff00ffff; + Cmnd->result |= (DID_PASSTHROUGH << 16); // prevents retry + } + if (Cmnd->scsi_done != NULL) + (*Cmnd->scsi_done)(Cmnd); +} + // After successfully getting a "Process Login" (PRLI) from an // FC port, we want to Discover the LUNs so that we know the // addressing type (e.g., FCP-SCSI Volume Set Address, Peripheral @@ -3035,8 +3050,7 @@ Cmnd->result = (DID_SOFT_ERROR << 16); // ask for retry // printk(" BoardLockCmnd[%d] %p Complete, chnl/target/lun %d/%d/%d\n", // i,Cmnd, Cmnd->channel, Cmnd->target, Cmnd->lun); - if( Cmnd->scsi_done != NULL) - (*Cmnd->scsi_done)(Cmnd); + call_scsi_done(Cmnd); } } } @@ -3083,7 +3097,9 @@ // Complete the "bad target" commands (normally only used during // initialization, since we aren't supposed to call "scsi_done" - // inside the queuecommand() function). + // inside the queuecommand() function). (this is overly contorted, + // scsi_done can be safely called from queuecommand for + // this bad target case. May want to simplify this later) for( i=0; i< CPQFCTS_MAX_TARGET_ID; i++) { @@ -3092,8 +3108,7 @@ Scsi_Cmnd *Cmnd = cpqfcHBAdata->BadTargetCmnd[i]; cpqfcHBAdata->BadTargetCmnd[i] = NULL; Cmnd->result = (DID_BAD_TARGET << 16); - if( Cmnd->scsi_done != NULL) - (*Cmnd->scsi_done)(Cmnd); + call_scsi_done(Cmnd); } else break; @@ -3153,7 +3168,7 @@ if( i >= TACH_SEST_LEN ) // Link Service Exchange { - cpqfcTSCompleteExchange( fcChip, i); // Don't "abort" LinkService + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, i); // Don't "abort" LinkService } else // SEST Exchange TO -- may post ABTS to Worker Thread Que @@ -3511,11 +3526,14 @@ (Cmnd->channel == pLoggedInPort->ScsiNexus.channel) ) { Cmnd->result = (DID_SOFT_ERROR <<16); // force retry - if( Cmnd->scsi_done != NULL) - (*Cmnd->scsi_done)(Cmnd); - else + if( Cmnd->scsi_done == NULL) + { printk("LinkDnCmnd scsi_done ptr null, port_id %Xh\n", pLoggedInPort->port_id); + Cmnd->SCp.sent_command = 0; + } + else + call_scsi_done(Cmnd); *SCptr = NULL; // free this slot for next use } } @@ -4035,10 +4053,11 @@ static LONG FindFreeExchange( PTACHYON fcChip, ULONG type ); static ULONG build_SEST_sgList( + struct pci_dev *pcidev, ULONG *SESTalPairStart, Scsi_Cmnd *Cmnd, ULONG *sgPairs, - PSGPAGES sgPages // link list of TL Ext. S/G pages from O/S Pool + PSGPAGES *sgPages_head // link list of TL Ext. S/G pages from O/S Pool ); static int build_FCP_payload( Scsi_Cmnd *Cmnd, @@ -4202,7 +4221,6 @@ // assign tmp ptr (shorthand) CMDfchs = &Exchanges->fcExchange[ *fcExchangeIndex].fchs; - if( Cmnd != NULL ) // (necessary for ABTS cases) { Exchanges->fcExchange[ *fcExchangeIndex].Cmnd = Cmnd; // Linux Scsi @@ -4575,21 +4593,26 @@ pIWE->Hdr_Len |= fl; // add xmit FC frame len for data phase - pIWE->Hdr_Addr = virt_to_bus( dataHDR ); + pIWE->Hdr_Addr = fcChip->SEST->base + + ((unsigned long)&fcChip->SEST->DataHDR[*fcExchangeIndex] - + (unsigned long)fcChip->SEST); + pIWE->RSP_Len = sizeof(TachFCHDR_RSP) ; // hdr+data (recv'd RSP frame) pIWE->RSP_Len |= (InFCHS->s_id << 8); // MS 24 bits Remote_ID memset( &fcChip->SEST->RspHDR[ *fcExchangeIndex].pl, 0, sizeof( FCP_STATUS_RESPONSE) ); // clear out previous status - - pIWE->RSP_Addr = virt_to_bus( - &fcChip->SEST->RspHDR[ *fcExchangeIndex ]); + + pIWE->RSP_Addr = fcChip->SEST->base + + ((unsigned long)&fcChip->SEST->RspHDR[*fcExchangeIndex] - + (unsigned long)fcChip->SEST); // Do we need local or extended gather list? // depends on size - we can handle 3 len/addr pairs // locally. fcp_dl = build_SEST_sgList( + cpqfcHBAdata->PciDev, &pIWE->GLen1, Cmnd, // S/G list &sgPairs, // return # of pairs in S/G list (from "Data" descriptor) @@ -4690,16 +4713,16 @@ pIRE->RSP_Len = sizeof(TachFCHDR_RSP) ; // hdr+data (recv'd RSP frame) pIRE->RSP_Len |= (InFCHS->s_id << 8); // MS 24 bits Remote_ID - - pIRE->RSP_Addr = virt_to_bus( - &fcChip->SEST->RspHDR[ *fcExchangeIndex ]); - + pIRE->RSP_Addr = fcChip->SEST->base + + ((unsigned long)&fcChip->SEST->RspHDR[*fcExchangeIndex] - + (unsigned long)fcChip->SEST); // Do we need local or extended gather list? // depends on size - we can handle 3 len/addr pairs // locally. fcp_dl = build_SEST_sgList( + cpqfcHBAdata->PciDev, &pIRE->SLen1, Cmnd, // SCSI command Data desc. with S/G list &sgPairs, // return # of pairs in S/G list (from "Data" descriptor) @@ -4806,6 +4829,7 @@ // locally. fcp_dl = build_SEST_sgList( + cpqfcHBAdata->PciDev, &pTWE->SLen1, Cmnd, // S/G list &sgPairs, // return # of pairs in S/G list (from "Data" descriptor) @@ -4900,17 +4924,24 @@ // VALid entry:Dir outbound:enable CM:enal INT: pTRE->Hdr_Len = 0x86010020L; // data frame Len always 32 bytes - pTRE->Hdr_Addr = virt_to_bus( dataHDR ); + pTRE->Hdr_Addr = // bus address of dataHDR; + fcChip->SEST->base + + ((unsigned long)&fcChip->SEST->DataHDR[ *fcExchangeIndex ] - + (unsigned long)fcChip->SEST); + pTRE->RSP_Len = 64L; // hdr+data (TL assisted RSP frame) pTRE->RSP_Len |= (InFCHS->s_id << 8); // MS 24 bits Remote_ID - pTRE->RSP_Addr = virt_to_bus( rspHDR ); - + pTRE->RSP_Addr = // bus address of rspHDR + fcChip->SEST->base + + ((unsigned long)&fcChip->SEST->RspHDR[ *fcExchangeIndex ] - + (unsigned long)fcChip->SEST); // Do we need local or extended gather list? // depends on size - we can handle 3 len/addr pairs // locally. fcp_dl = build_SEST_sgList( + cpqfcHBAdata->PciDev, &pTRE->GLen1, Cmnd, // S/G list &sgPairs, // return # of pairs in S/G list (from "Data" descriptor) @@ -5001,8 +5032,10 @@ // len & flags according to command type above pIRB->Req_A_SFS_Len = SfsLen; // includes IRB flags & len - pIRB->Req_A_SFS_Addr = virt_to_bus(CMDfchs); // TL needs physical addr - // of frame to send + pIRB->Req_A_SFS_Addr = // TL needs physical addr of frame to send + fcChip->exch_dma_handle + (unsigned long)CMDfchs - + (unsigned long)Exchanges; + pIRB->Req_A_SFS_D_ID = CMDfchs->d_id << 8; // Dest_ID must be consistent! // Exchange is complete except for "fix-up" fields to be set @@ -5017,7 +5050,7 @@ printk( "FC Error: SEST build Pool Allocation failed\n"); #endif // return resources... - cpqfcTSCompleteExchange( fcChip, *fcExchangeIndex); // SEST build failed + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, *fcExchangeIndex); // SEST build failed } } else // no Exchanges available @@ -5059,7 +5092,61 @@ } +static dma_addr_t +cpqfc_pci_map_sg_page( + struct pci_dev *pcidev, + ULONG *hw_paddr, // where to put phys addr for HW use + void *sgp_vaddr, // the virtual address of the sg page + dma_addr_t *umap_paddr, // where to put phys addr for unmap + unsigned int *maplen, // where to store sg entry length + int PairCount) // number of sg pairs used in the page. +{ + unsigned long aligned_addr = (unsigned long) sgp_vaddr; + + *maplen = PairCount * 8; + aligned_addr += TL_EXT_SG_PAGE_BYTELEN; + aligned_addr &= ~(TL_EXT_SG_PAGE_BYTELEN -1); + + *umap_paddr = pci_map_single(pcidev, (void *) aligned_addr, + *maplen, PCI_DMA_TODEVICE); + *hw_paddr = (ULONG) *umap_paddr; + +# if BITS_PER_LONG > 32 + if( *umap_paddr >>32 ) { + printk("cqpfcTS:Tach SG DMA addr %p>32 bits\n", + (void*)umap_paddr); + return 0; + } +# endif + return *umap_paddr; +} + +static void +cpqfc_undo_SEST_mappings(struct pci_dev *pcidev, + unsigned long contigaddr, int len, int dir, + struct scatterlist *sgl, int use_sg, + PSGPAGES *sgPages_head, + int allocated_pages) +{ + PSGPAGES i, next; + + if (contigaddr != (unsigned long) NULL) + pci_unmap_single(pcidev, contigaddr, len, dir); + + if (sgl != NULL) + pci_unmap_sg(pcidev, sgl, use_sg, dir); + for (i=*sgPages_head; i != NULL ;i = next) + { + pci_unmap_single(pcidev, i->busaddr, i->maplen, + scsi_to_pci_dma_dir(PCI_DMA_TODEVICE)); + i->busaddr = (dma_addr_t) NULL; + i->maplen = 0L; + next = i->next; + kfree(i); + } + *sgPages_head = NULL; +} // This routine builds scatter/gather lists into SEST entries // INPUTS: @@ -5077,263 +5164,380 @@ //#define DBG_SEST_SGLIST 1 // for printing out S/G pairs with Ext. pages +static int ap_hi_water = TL_DANGER_SGPAGES; + static ULONG build_SEST_sgList( + struct pci_dev *pcidev, ULONG *SESTalPairStart, // the 3 len/address buffers in SEST Scsi_Cmnd *Cmnd, ULONG *sgPairs, - PSGPAGES sgPages) // link list of TL Ext. S/G pages from O/S Pool + PSGPAGES *sgPages_head) // link list of TL Ext. S/G pages from O/S Pool { ULONG i, AllocatedPages=0; // Tach Ext. S/G page allocations ULONG* alPair = SESTalPairStart; - ULONG alignedPageAddress; // TL hardware alignment requirement + ULONG* ext_sg_page_phys_addr_place = NULL; int PairCount; - unsigned long ulBuff; + unsigned long ulBuff, contigaddr; ULONG total_data_len=0; // (in bytes) ULONG bytes_to_go = Cmnd->request_bufflen; // total xfer (S/G sum) ULONG thisMappingLen; - struct scatterlist *sgl; // S/G list (Linux format) - + struct scatterlist *sgl = NULL; // S/G list (Linux format) + int sg_count, totalsgs; + dma_addr_t busaddr; + unsigned long thislen, offset; + PSGPAGES *sgpage = sgPages_head; + PSGPAGES prev_page = NULL; +# define WE_HAVE_SG_LIST (sgl != (unsigned long) NULL) + contigaddr = (unsigned long) NULL; if( !Cmnd->use_sg ) // no S/G list? { - *sgPairs = 1; // use "local" S/G pair in SEST entry - // (for now, ignore address bits above #31) - *alPair++ = bytes_to_go & 0x7ffff; // bits 18-0, length - ulBuff = virt_to_bus( Cmnd->request_buffer); -#if BITS_PER_LONG > 32 - if( ulBuff >>32 ) - { - printk("FATAL! Tachyon DMA address %p exceeds 32 bits\n", (void*)ulBuff ); - return 0; - } -#endif - *alPair = (ULONG)ulBuff; - return bytes_to_go; - } + if (bytes_to_go <= TL_MAX_SG_ELEM_LEN) + { + *sgPairs = 1; // use "local" S/G pair in SEST entry + // (for now, ignore address bits above #31) + *alPair++ = bytes_to_go; // bits 18-0, length - // [TBD - update for Linux to support > 32 bits addressing] - // since the format for local & extended S/G lists is different, - // check if S/G pairs exceeds 3. - *sgPairs = Cmnd->use_sg; - sgl = (struct scatterlist*)Cmnd->request_buffer; - - if( *sgPairs <= 3 ) // need "local" SEST list + if (bytes_to_go != 0) { + contigaddr = ulBuff = pci_map_single(pcidev, + Cmnd->request_buffer, + Cmnd->request_bufflen, + scsi_to_pci_dma_dir(Cmnd->sc_data_direction)); + // printk("ms %p ", ulBuff); + } + else { + // No data transfer, (e.g.: Test Unit Ready) + // printk("btg=0 "); + *sgPairs = 0; + memset(alPair, 0, sizeof(*alPair)); + return 0; + } + +# if BITS_PER_LONG > 32 + if( ulBuff >>32 ) { + printk("FATAL! Tachyon DMA address %p " + "exceeds 32 bits\n", (void*)ulBuff ); + return 0; + } +# endif + *alPair = (ULONG)ulBuff; + return bytes_to_go; + } + else // We have a single large (too big) contiguous buffer. + { // We will have to break it up. We'll use the scatter + // gather code way below, but use contigaddr instead + // of sg_dma_addr(). (this is a very rare case). + + unsigned long btg; + contigaddr = pci_map_single(pcidev, Cmnd->request_buffer, + Cmnd->request_bufflen, + scsi_to_pci_dma_dir(Cmnd->sc_data_direction)); + + // printk("contigaddr = %p, len = %d\n", + // (void *) contigaddr, bytes_to_go); + totalsgs = 0; + for (btg = bytes_to_go; btg > 0; ) { + btg -= ( btg > TL_MAX_SG_ELEM_LEN ? + TL_MAX_SG_ELEM_LEN : btg ); + totalsgs++; + } + sgl = NULL; + *sgPairs = totalsgs; + } + } + else // we do have a scatter gather list + { + // [TBD - update for Linux to support > 32 bits addressing] + // since the format for local & extended S/G lists is different, + // check if S/G pairs exceeds 3. + // *sgPairs = Cmnd->use_sg; Nope, that's wrong. + + sgl = (struct scatterlist*)Cmnd->request_buffer; + sg_count = pci_map_sg(pcidev, sgl, Cmnd->use_sg, + scsi_to_pci_dma_dir(Cmnd->sc_data_direction)); + // printk("sgl = %p, sg_count = %d\n", (void *) sgl, sg_count); + if( sg_count <= 3 ) { + + // we need to be careful here that no individual mapping + // is too large, and if any is, that breaking it up + // doesn't push us over 3 sgs, or, if it does, that we + // handle that case. Tachyon can take 0x7FFFF bits for length, + // but sg structure uses "unsigned int", on the face of it, + // up to 0xFFFFFFFF or even more. + + int i; + unsigned long thislen; + + totalsgs = 0; + for (i=0;i= TL_MAX_SG_ELEM_LEN) { + totalsgs++; + thislen -= TL_MAX_SG_ELEM_LEN; + } + if (thislen > 0) totalsgs++; + } + *sgPairs = totalsgs; + } else totalsgs = 999; // as a first estimate, definitely >3, + + // if (totalsgs != sg_count) + // printk("totalsgs = %d, sgcount=%d\n",totalsgs,sg_count); + } + + // printk("totalsgs = %d, sgcount=%d\n", totalsgs, sg_count); + if( totalsgs <= 3 ) // can (must) use "local" SEST list { while( bytes_to_go) { - thisMappingLen = sgl->length; // we want them ALL on every pass - bytes_to_go = bytes_to_go - thisMappingLen; + offset = 0L; - // we have L/A pair; L = thisMappingLen, A = physicalAddress - // load into SEST... - total_data_len += thisMappingLen & 0x7ffff; // mask in valid bits - // per SEST format - *alPair = thisMappingLen & 0x7ffff; // bits 18-0, length -// physicalAddress.HighPart <= 19; // shift to bit 19 - - // pick up bits 44-32 of upper 64-bit address - // and load into 31-19 LBAU (upper addr) of SEST entry -// *alPair++ |=(ULONG)((physicalAddress.HighPart & 0xFFF8)); - // on Tachlite TS's local S/G, we can handle 13 extra address bits - // i.e., bits 31-19 are actually bits 44-32 of physicalAddress - - alPair++; - - ulBuff = virt_to_bus( sgl->address); -#if BITS_PER_LONG > 32 - if( ulBuff >>32 ) - { - printk("cqpfcTS: Tach DMA address %p > 32 bits\n", (void*)ulBuff ); - return 0; - } -#endif - *alPair++ = (ULONG)ulBuff; // lower 32 bits (31-0) + if ( WE_HAVE_SG_LIST ) + thisMappingLen = sg_dma_len(sgl); + else // or contiguous buffer? + thisMappingLen = bytes_to_go; - ++sgl; // next S/G pair -#ifdef DBG_SEST_SGLIST - printk(" thisLen %d ", thisMappingLen); - printk(" remain %d\n", bytes_to_go); -#endif + while (thisMappingLen > 0) + { + thislen = thisMappingLen > TL_MAX_SG_ELEM_LEN ? + TL_MAX_SG_ELEM_LEN : thisMappingLen; + bytes_to_go = bytes_to_go - thislen; - } - } + // we have L/A pair; L = thislen, A = physicalAddress + // load into SEST... + + total_data_len += thislen; + *alPair = thislen; // bits 18-0, length + + alPair++; + if ( WE_HAVE_SG_LIST ) + ulBuff = sg_dma_address(sgl) + offset; + else + ulBuff = contigaddr + offset; + offset += thislen; +# if BITS_PER_LONG > 32 + if( ulBuff >>32 ) { + printk("cqpfcTS: 2Tach DMA address %p > 32 bits\n", + (void*)ulBuff ); + printk("%s = %p, offset = %ld\n", + WE_HAVE_SG_LIST ? "ulBuff" : "contigaddr", + WE_HAVE_SG_LIST ? (void *) ulBuff : (void *) contigaddr, + offset); + return 0; + } +# endif + *alPair++ = (ULONG)ulBuff; // lower 32 bits (31-0) + thisMappingLen -= thislen; + } + + if ( WE_HAVE_SG_LIST ) ++sgl; // next S/G pair + else if (bytes_to_go != 0) printk("BTG not zero!\n"); + +# ifdef DBG_SEST_SGLIST + printk("L=%d ", thisMappingLen); + printk("btg=%d ", bytes_to_go); +# endif + } + // printk("i:%d\n", *sgPairs); + } else // more than 3 pairs requires Extended S/G page (Pool Allocation) { // clear out SEST DWORDs (local S/G addr) C-F (A-B set in following logic) - - - for( i=2; i<6; i++) alPair[i] = 0; PairCount = TL_EXT_SG_PAGE_COUNT; // forces initial page allocation - + totalsgs = 0; while( bytes_to_go ) { - - - // Per SEST format, we can support 524287 byte lenghts per + // Per SEST format, we can support 524287 byte lengths per // S/G pair. Typical user buffers are 4k, and very rarely // exceed 12k due to fragmentation of physical memory pages. // However, on certain O/S system (not "user") buffers (on platforms - // with huge memories like 256Meg), it's possible to exceed this - // length in a single S/G address/len mapping. - // - // Check for Tachyon length boundary - // - if( sgl->length > 0x7ffff ) - { - // never ask for more than we can handle - thisMappingLen = sgl->length & 0x7ffff; - } + // with huge memories), it's possible to exceed this + // length in a single S/G address/len mapping, so we have to handle + // that. + + offset = 0L; + if ( WE_HAVE_SG_LIST ) + thisMappingLen = sg_dma_len(sgl); else - thisMappingLen = sgl->length; - + thisMappingLen = bytes_to_go; - - // should we load into "this" extended S/G page, or allocate - // new page? - - if( PairCount >= TL_EXT_SG_PAGE_COUNT ) + while (thisMappingLen > 0) { - // have we exceeded the max possible extended pages? - if( AllocatedPages >= TL_MAX_SGPAGES) - { - printk("Error: aborted loop on %d Ext. S/G page allocations\n", - AllocatedPages); - - total_data_len = 0; // failure!! Ext. S/G is All-or-none affair - break; // failed - } - - // Allocate the TL Extended S/G list page from O/S pool. We have - // to allocated twice what we want to ensure required TL alignment - // (Tachlite TL/TS User Man. Rev 6.0, p 168) - // We store the original allocated PVOID so we can free later - - sgPages->PoolPage[ AllocatedPages] = - kmalloc( TL_EXT_SG_PAGE_BYTELEN*2,GFP_ATOMIC); // double for alignment - - - if( !sgPages->PoolPage[ AllocatedPages] ) // Allocation failed? - { - - printk("Error: Allocation failed @ %d S/G page allocations\n", - AllocatedPages); - - total_data_len = 0; // failure!! Ext. S/G is All-or-none affair - break; // give up - } - // clear out memory we just allocated - memset( sgPages->PoolPage[AllocatedPages], 0, - TL_EXT_SG_PAGE_BYTELEN*2); - + thislen = thisMappingLen > TL_MAX_SG_ELEM_LEN ? + TL_MAX_SG_ELEM_LEN : thisMappingLen; + // printk("%d/%d/%d\n", thislen, thisMappingLen, bytes_to_go); - // align the memory - TL requires sizeof() Ext. S/G page alignment. - // We doubled the actual required size so we could mask off LSBs - // to get desired offset - - ulBuff = virt_to_bus( sgPages->PoolPage[AllocatedPages]); - -#if BITS_PER_LONG > 32 - if( ulBuff >>32 ) - { - printk("cqpfcTS: Tach ext. S/G DMA address %p > 32 bits\n", - (void*)ulBuff ); - return 0; - } -#endif - - ulBuff += TL_EXT_SG_PAGE_BYTELEN; // ensures we pass align. boundary - ulBuff &= (0xFFFFFFFF - (TL_EXT_SG_PAGE_BYTELEN -1) );// mask off LSBs - - alignedPageAddress = (ULONG)ulBuff; -#ifdef DBG_SEST_SGLIST - printk("new PoolPage: %p, alignedPageAddress %lXh\n", - sgPages->PoolPage[AllocatedPages], ulBuff); -#endif - + // should we load into "this" extended S/G page, or allocate + // new page? - // set pointer, in SEST if first Ext. S/G page, or in last pair - // of linked Ext. S/G pages... - // (Only 32-bit PVOIDs, so just load lower 32 bits) - // NOTE: the Len field must be '0' if this is the first Ext. S/G - // pointer in SEST, and not 0 otherwise. - if( alPair == SESTalPairStart) // initial Ext. S/G list? - *alPair = 0; - else // not the SEST entry... Len must be non-0, so - // arbitrarily set it to number bytes remaining - *alPair = ( bytes_to_go & 0x7ffff); - -#ifdef DBG_SEST_SGLIST - printk("PairCount %d @%p even %Xh, ", - PairCount, alPair, *alPair); -#endif - alPair++; // next DWORD + if( PairCount >= TL_EXT_SG_PAGE_COUNT ) + { + // Now, we have to map the previous page, (triggering buffer bounce) + // The first time thru the loop, there won't be a previous page. + if (prev_page != NULL) // is there a prev page? + { + // this code is normally kind of hard to trigger, + // you have to use up more than 256 scatter gather + // elements to get here. Cranking down TL_MAX_SG_ELEM_LEN + // to an absurdly low value (128 bytes or so) to artificially + // break i/o's into a zillion pieces is how I tested it. + busaddr = cpqfc_pci_map_sg_page(pcidev, + ext_sg_page_phys_addr_place, + prev_page->page, + &prev_page->busaddr, + &prev_page->maplen, + PairCount); + } + // Allocate the TL Extended S/G list page. We have + // to allocate twice what we want to ensure required TL alignment + // (Tachlite TL/TS User Man. Rev 6.0, p 168) + // We store the original allocated PVOID so we can free later + *sgpage = kmalloc( sizeof(SGPAGES), GFP_ATOMIC); + if ( ! *sgpage ) + { + printk("cpqfc: Allocation failed @ %d S/G page allocations\n", + AllocatedPages); + total_data_len = 0; // failure!! Ext. S/G is All-or-none affair + + // unmap the previous mappings, if any. + + cpqfc_undo_SEST_mappings(pcidev, contigaddr, + Cmnd->request_bufflen, + scsi_to_pci_dma_dir(Cmnd->sc_data_direction), + sgl, Cmnd->use_sg, sgPages_head, AllocatedPages+1); + + // FIXME: testing shows that if we get here, + // it's bad news. (this has been this way for a long + // time though, AFAIK. Not that that excuses it.) - *alPair = alignedPageAddress; // TL needs 32-bit physical -#ifdef DBG_SEST_SGLIST - printk("odd %Xh\n", *alPair); -#endif - - // now reset the pointer to the ACTUAL (Extended) S/G page - // which will accept the Len/ PhysicalAddress pairs - alPair = bus_to_virt(alignedPageAddress); - - AllocatedPages++; - PairCount = 1; // starting new Ext. S/G page - } // end of new TL Ext. S/G page allocation + return 0; // give up (and probably hang the system) + } + // clear out memory we just allocated + memset( (*sgpage)->page,0,TL_EXT_SG_PAGE_BYTELEN*2); + (*sgpage)->next = NULL; + (*sgpage)->busaddr = (dma_addr_t) NULL; + (*sgpage)->maplen = 0L; + + // align the memory - TL requires sizeof() Ext. S/G page alignment. + // We doubled the actual required size so we could mask off LSBs + // to get desired offset + + ulBuff = (unsigned long) (*sgpage)->page; + ulBuff += TL_EXT_SG_PAGE_BYTELEN; + ulBuff &= ~(TL_EXT_SG_PAGE_BYTELEN -1); + + // set pointer, in SEST if first Ext. S/G page, or in last pair + // of linked Ext. S/G pages... (Only 32-bit PVOIDs, so just + // load lower 32 bits) + // NOTE: the Len field must be '0' if this is the first Ext. S/G + // pointer in SEST, and not 0 otherwise (we know thislen != 0). + + *alPair = (alPair != SESTalPairStart) ? thislen : 0; + +# ifdef DBG_SEST_SGLIST + printk("PairCount %d @%p even %Xh, ", + PairCount, alPair, *alPair); +# endif + + // Save the place where we need to store the physical + // address of this scatter gather page which we get when we map it + // (and mapping we can do only after we fill it in.) + alPair++; // next DWORD, will contain phys addr of the ext page + ext_sg_page_phys_addr_place = alPair; + + // Now, set alPair = the virtual addr of the (Extended) S/G page + // which will accept the Len/ PhysicalAddress pairs + alPair = (ULONG *) ulBuff; - - *alPair = thisMappingLen; // bits 18-0, length (range check above) - - -// physicalAddress.HighPart <= 19; // shift to bit 19 - - // pick up bits 44-32 of upper 64-bit address - // and load into 31-19 LBAU (upper addr) of SEST entry -// *alPair |=(ULONG)((physicalAddress.HighPart & 0xFFF8)); + AllocatedPages++; + if (AllocatedPages >= ap_hi_water) + { + // This message should rarely, if ever, come out. + // Previously (cpqfc version <= 2.0.5) the driver would + // just puke if more than 4 SG pages were used, and nobody + // ever complained about that. This only comes out if + // more than 8 pages are used. + + printk(KERN_WARNING + "cpqfc: Possible danger. %d scatter gather pages used.\n" + "cpqfc: detected seemingly extreme memory " + "fragmentation or huge data transfers.\n", + AllocatedPages); + ap_hi_water = AllocatedPages+1; + } + + PairCount = 1; // starting new Ext. S/G page + prev_page = (*sgpage); // remember this page, for next time thru + sgpage = &((*sgpage)->next); + } // end of new TL Ext. S/G page allocation + *alPair = thislen; // bits 18-0, length (range check above) -#ifdef DBG_SEST_SGLIST - printk("PairCount %d @%p, even %Xh, ", - PairCount, alPair, *alPair); -#endif +# ifdef DBG_SEST_SGLIST + printk("PairCount %d @%p, even %Xh, ", PairCount, alPair, *alPair); +# endif - alPair++; // next DWORD - // on Tachlite TS's local S/G, we can handle 13 extra address bits - // i.e., bits 31-19 are actually bits 44-32 of physicalAddress + alPair++; // next DWORD, physical address + if ( WE_HAVE_SG_LIST ) + ulBuff = sg_dma_address(sgl) + offset; + else + ulBuff = contigaddr + offset; + offset += thislen; - ulBuff = virt_to_bus( sgl->address); -#if BITS_PER_LONG > 32 - if( ulBuff >>32 ) - { - printk("cqpfcTS: Tach DMA address %p > 32 bits\n", (void*)ulBuff ); - return 0; - } -#endif - *alPair = (ULONG)ulBuff; // lower 32 bits (31-0) +# if BITS_PER_LONG > 32 + if( ulBuff >>32 ) + { + printk("cqpfcTS: 1Tach DMA address %p > 32 bits\n", (void*)ulBuff ); + printk("%s = %p, offset = %ld\n", + WE_HAVE_SG_LIST ? "ulBuff" : "contigaddr", + WE_HAVE_SG_LIST ? (void *) ulBuff : (void *) contigaddr, + offset); + return 0; + } +# endif + *alPair = (ULONG) ulBuff; // lower 32 bits (31-0) -#ifdef DBG_SEST_SGLIST - printk("odd %Xh\n", *alPair); -#endif - alPair++; // next DWORD +# ifdef DBG_SEST_SGLIST + printk("odd %Xh\n", *alPair); +# endif + alPair++; // next DWORD, next address/length pair + PairCount++; // next Length/Address pair - PairCount++; // next Length/Address pair - bytes_to_go -= thisMappingLen; - total_data_len += thisMappingLen; - sgl++; // next S/G pair - } + // if (PairCount > pc_hi_water) + // { + // printk("pc hi = %d ", PairCount); + // pc_hi_water = PairCount; + // } + bytes_to_go -= thislen; + total_data_len += thislen; + thisMappingLen -= thislen; + totalsgs++; + } // while (thisMappingLen > 0) + if ( WE_HAVE_SG_LIST ) sgl++; // next S/G pair + } // while (bytes_to_go) + + // printk("Totalsgs=%d\n", totalsgs); + *sgPairs = totalsgs; + + // PCI map (and bounce) the last (and usually only) extended SG page + busaddr = cpqfc_pci_map_sg_page(pcidev, + ext_sg_page_phys_addr_place, + prev_page->page, + &prev_page->busaddr, + &prev_page->maplen, + PairCount); } return total_data_len; } @@ -5584,7 +5788,7 @@ if( CompleteExchange || // flag from Reply frames pExchange->status ) // typically, can get FRAME_TO { - cpqfcTSCompleteExchange( fcChip, ExchangeID); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, ExchangeID); } } @@ -5594,7 +5798,7 @@ if( CompleteExchange ) // by Type of exchange (e.g. end-of-xchng) { - cpqfcTSCompleteExchange( fcChip, ExchangeID); + cpqfcTSCompleteExchange( cpqfcHBAdata->PciDev, fcChip, ExchangeID); } else @@ -5738,9 +5942,46 @@ return i; } +static void +cpqfc_pci_unmap_extended_sg(struct pci_dev *pcidev, + PTACHYON fcChip, + ULONG x_ID) +{ + // Unmaps the memory regions used to hold the scatter gather lists + PSGPAGES i; + // Were there any such regions needing unmapping? + if (! USES_EXTENDED_SGLIST(fcChip->SEST, x_ID)) + return; // No such regions, we're outta here. + + // for each extended scatter gather region needing unmapping... + for (i=fcChip->SEST->sgPages[x_ID] ; i != NULL ; i = i->next) + pci_unmap_single(pcidev, i->busaddr, i->maplen, + scsi_to_pci_dma_dir(PCI_DMA_TODEVICE)); +} +// Called also from cpqfcTScontrol.o, so can't be static +void +cpqfc_pci_unmap(struct pci_dev *pcidev, + Scsi_Cmnd *cmd, + PTACHYON fcChip, + ULONG x_ID) +{ + // Undo the DMA mappings + if (cmd->use_sg) { // Used scatter gather list for data buffer? + cpqfc_pci_unmap_extended_sg(pcidev, fcChip, x_ID); + pci_unmap_sg(pcidev, cmd->buffer, cmd->use_sg, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + // printk("umsg %d\n", cmd->use_sg); + } + else if (cmd->request_bufflen) { + // printk("ums %p ", fcChip->SEST->u[ x_ID ].IWE.GAddr1); + pci_unmap_single(pcidev, fcChip->SEST->u[ x_ID ].IWE.GAddr1, + cmd->request_bufflen, + scsi_to_pci_dma_dir(cmd->sc_data_direction)); + } +} // We call this routine to free an Exchange for any reason: // completed successfully, completed with error, aborted, etc. @@ -5751,10 +5992,12 @@ //scompleteexchange void cpqfcTSCompleteExchange( + struct pci_dev *pcidev, PTACHYON fcChip, ULONG x_ID) { FC_EXCHANGES *Exchanges = fcChip->Exchanges; + int already_unmapped = 0; if( x_ID < TACH_SEST_LEN ) // SEST-based (or LinkServ for FCP exchange) { @@ -5883,9 +6126,38 @@ // case for. Need code maintenance! Return "ERROR" else { - printk("DEFAULT result %Xh, x_ID %Xh, Cmnd %p\n", + unsigned int stat = Exchanges->fcExchange[ x_ID ].status; + printk("DEFAULT result %Xh, x_ID %Xh, Cmnd %p", Exchanges->fcExchange[ x_ID ].status, x_ID, Exchanges->fcExchange[ x_ID ].Cmnd); + + if (stat & INVALID_ARGS) printk(" INVALID_ARGS "); + if (stat & LNKDWN_OSLS) printk(" LNKDWN_OSLS "); + if (stat & LNKDWN_LASER) printk(" LNKDWN_LASER "); + if (stat & OUTQUE_FULL) printk(" OUTQUE_FULL "); + if (stat & DRIVERQ_FULL) printk(" DRIVERQ_FULL "); + if (stat & SEST_FULL) printk(" SEST_FULL "); + if (stat & BAD_ALPA) printk(" BAD_ALPA "); + if (stat & OVERFLOW) printk(" OVERFLOW "); + if (stat & COUNT_ERROR) printk(" COUNT_ERROR "); + if (stat & LINKFAIL_RX) printk(" LINKFAIL_RX "); + if (stat & ABORTSEQ_NOTIFY) printk(" ABORTSEQ_NOTIFY "); + if (stat & LINKFAIL_TX) printk(" LINKFAIL_TX "); + if (stat & HOSTPROG_ERR) printk(" HOSTPROG_ERR "); + if (stat & FRAME_TO) printk(" FRAME_TO "); + if (stat & INV_ENTRY) printk(" INV_ENTRY "); + if (stat & SESTPROG_ERR) printk(" SESTPROG_ERR "); + if (stat & OUTBOUND_TIMEOUT) printk(" OUTBOUND_TIMEOUT "); + if (stat & INITIATOR_ABORT) printk(" INITIATOR_ABORT "); + if (stat & MEMPOOL_FAIL) printk(" MEMPOOL_FAIL "); + if (stat & FC2_TIMEOUT) printk(" FC2_TIMEOUT "); + if (stat & TARGET_ABORT) printk(" TARGET_ABORT "); + if (stat & EXCHANGE_QUEUED) printk(" EXCHANGE_QUEUED "); + if (stat & PORTID_CHANGED) printk(" PORTID_CHANGED "); + if (stat & DEVICE_REMOVED) printk(" DEVICE_REMOVED "); + if (stat & SFQ_FRAME) printk(" SFQ_FRAME "); + printk("\n"); + Exchanges->fcExchange[ x_ID ].Cmnd->result = (DID_ERROR <<16); } } @@ -5896,6 +6168,10 @@ cpqfcTSCheckandSnoopFCP( fcChip, x_ID); // (will set ->result) } + cpqfc_pci_unmap(pcidev, Exchanges->fcExchange[x_ID].Cmnd, + fcChip, x_ID); // undo DMA mappings. + already_unmapped = 1; + // OK, we've set the Scsi "->result" field, so proceed with calling // Linux Scsi "done" (if not NULL), and free any kernel memory we // may have allocated for the exchange. @@ -5910,17 +6186,17 @@ if( Exchanges->fcExchange[ x_ID ].Cmnd->result != (DID_ABORT<<16) ) { PCI_TRACE(0xAC) - (*Exchanges->fcExchange[ x_ID ].Cmnd->scsi_done) - (Exchanges->fcExchange[ x_ID ].Cmnd); + call_scsi_done(Exchanges->fcExchange[ x_ID ].Cmnd); } else { - + Exchanges->fcExchange[ x_ID ].Cmnd->SCp.sent_command = 0; // printk(" not calling scsi_done on x_ID %Xh, Cmnd %p\n", // x_ID, Exchanges->fcExchange[ x_ID ].Cmnd); } } else{ + Exchanges->fcExchange[ x_ID ].Cmnd->SCp.sent_command = 0; printk(" x_ID %Xh, type %Xh, Cdb0 %Xh\n", x_ID, Exchanges->fcExchange[ x_ID ].type, Exchanges->fcExchange[ x_ID ].Cmnd->cmnd[0]); @@ -5930,22 +6206,23 @@ // Now, clean up non-Scsi_Cmnd items... CleanUpSestResources: - + + if (!already_unmapped) + cpqfc_pci_unmap(pcidev, Exchanges->fcExchange[x_ID].Cmnd, + fcChip, x_ID); // undo DMA mappings. + // Was an Extended Scatter/Gather page allocated? We know // this by checking DWORD 4, bit 31 ("LOC") of SEST entry if( !(fcChip->SEST->u[ x_ID ].IWE.Buff_Off & 0x80000000)) { - int i = 0; + PSGPAGES p, next; // extended S/G list was used -- Free the allocated ext. S/G pages - - while( fcChip->SEST->sgPages[x_ID].PoolPage[i] && - (i < TL_MAX_SGPAGES) ) - { - kfree( fcChip->SEST->sgPages[x_ID].PoolPage[i]); - fcChip->SEST->sgPages[x_ID].PoolPage[i] = NULL; - i++; + for (p = fcChip->SEST->sgPages[x_ID]; p != NULL; p = next) { + next = p->next; + kfree(p); } + fcChip->SEST->sgPages[x_ID] = NULL; } Exchanges->fcExchange[ x_ID ].Cmnd = NULL; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/cyberstorm.c linux/drivers/scsi/cyberstorm.c --- v2.4.13/linux/drivers/scsi/cyberstorm.c Fri Mar 2 18:38:38 2001 +++ linux/drivers/scsi/cyberstorm.c Thu Oct 25 13:53:50 2001 @@ -60,7 +60,7 @@ * the hardware register! */ -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are transferred to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/cyberstormII.c linux/drivers/scsi/cyberstormII.c --- v2.4.13/linux/drivers/scsi/cyberstormII.c Fri Mar 2 18:38:38 2001 +++ linux/drivers/scsi/cyberstormII.c Thu Oct 25 13:53:50 2001 @@ -50,7 +50,7 @@ static int dma_ports_p(struct NCR_ESP *esp); static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write); -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are transferred to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/dtc.h linux/drivers/scsi/dtc.h --- v2.4.13/linux/drivers/scsi/dtc.h Mon Sep 18 14:12:01 2000 +++ linux/drivers/scsi/dtc.h Thu Oct 25 13:53:51 2001 @@ -80,29 +80,29 @@ #define DTC_address(reg) (base + DTC_5380_OFFSET + reg) #define dbNCR5380_read(reg) \ - (rval=readb(DTC_address(reg)), \ + (rval=isa_readb(DTC_address(reg)), \ (((unsigned char) printk("DTC : read register %d at addr %08x is: %02x\n"\ , (reg), (int)DTC_address(reg), rval)), rval ) ) #define dbNCR5380_write(reg, value) do { \ printk("DTC : write %02x to register %d at address %08x\n", \ (value), (reg), (int)DTC_address(reg)); \ - writeb(value, DTC_address(reg));} while(0) + isa_writeb(value, DTC_address(reg));} while(0) #if !(DTCDEBUG & DTCDEBUG_TRANSFER) -#define NCR5380_read(reg) (readb(DTC_address(reg))) -#define NCR5380_write(reg, value) (writeb(value, DTC_address(reg))) +#define NCR5380_read(reg) (isa_readb(DTC_address(reg))) +#define NCR5380_write(reg, value) (isa_writeb(value, DTC_address(reg))) #else -#define NCR5380_read(reg) (readb(DTC_address(reg))) +#define NCR5380_read(reg) (isa_readb(DTC_address(reg))) #define xNCR5380_read(reg) \ (((unsigned char) printk("DTC : read register %d at address %08x\n"\ - , (reg), DTC_address(reg))), readb(DTC_address(reg))) + , (reg), DTC_address(reg))), isa_readb(DTC_address(reg))) #define NCR5380_write(reg, value) do { \ printk("DTC : write %02x to register %d at address %08x\n", \ (value), (reg), (int)DTC_address(reg)); \ - writeb(value, DTC_address(reg));} while(0) + isa_writeb(value, DTC_address(reg));} while(0) #endif #define NCR5380_intr dtc_intr diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/fastlane.c linux/drivers/scsi/fastlane.c --- v2.4.13/linux/drivers/scsi/fastlane.c Wed Apr 11 19:02:37 2001 +++ linux/drivers/scsi/fastlane.c Thu Oct 25 13:53:51 2001 @@ -41,7 +41,7 @@ #include #include -#include + #include #include @@ -74,7 +74,7 @@ * the hardware register! */ -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are transferred to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/gdth.c linux/drivers/scsi/gdth.c --- v2.4.13/linux/drivers/scsi/gdth.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/gdth.c Thu Oct 25 13:53:51 2001 @@ -4574,7 +4574,7 @@ Scsi_Device sdev; #endif char cmnd[MAX_COMMAND_SIZE]; - memset(cmnd, 0xff, 12); + memset(cmnd, 0xff, MAX_COMMAND_SIZE); TRACE2(("gdth_flush() hanum %d\n",hanum)); ha = HADATA(gdth_ctr_tab[hanum]); @@ -4652,7 +4652,7 @@ #ifndef __alpha__ /* controller reset */ - memset(cmnd, 0xff, 12); + memset(cmnd, 0xff, MAX_COMMAND_SIZE); #if LINUX_VERSION_CODE >= 0x020322 sdev = scsi_get_host_dev(gdth_ctr_tab[hanum]); scp = scsi_allocate_device(sdev, 1, FALSE); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/gvp11.c linux/drivers/scsi/gvp11.c --- v2.4.13/linux/drivers/scsi/gvp11.c Mon Nov 27 17:57:34 2000 +++ linux/drivers/scsi/gvp11.c Thu Oct 25 13:53:51 2001 @@ -186,6 +186,7 @@ unsigned int epc; struct zorro_dev *z = NULL; unsigned int default_dma_xfer_mask; + wd33c93_regs regs; #ifdef CHECK_WD33C93 volatile unsigned char *sasr_3393, *scmd_3393; unsigned char save_sasr; @@ -329,12 +330,11 @@ /* * Check for 14MHz SCSI clock */ - if (epc & GVP_SCSICLKMASK) - wd33c93_init(instance, (wd33c93_regs *)&(DMA(instance)->SASR), - dma_setup, dma_stop, WD33C93_FS_8_10); - else - wd33c93_init(instance, (wd33c93_regs *)&(DMA(instance)->SASR), - dma_setup, dma_stop, WD33C93_FS_12_15); + regs.SASR = &(DMA(instance)->SASR); + regs.SCMD = &(DMA(instance)->SCMD); + wd33c93_init(instance, regs, dma_setup, dma_stop, + (epc & GVP_SCSICLKMASK) ? WD33C93_FS_8_10 + : WD33C93_FS_12_15); if (num_gvp11++ == 0) { first_instance = instance; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/jazz_esp.c linux/drivers/scsi/jazz_esp.c --- v2.4.13/linux/drivers/scsi/jazz_esp.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/scsi/jazz_esp.c Thu Oct 25 13:53:51 2001 @@ -46,7 +46,7 @@ static void dma_led_on(struct NCR_ESP *); -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are trasfered to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/mac_esp.c linux/drivers/scsi/mac_esp.c --- v2.4.13/linux/drivers/scsi/mac_esp.c Fri Mar 2 18:38:38 2001 +++ linux/drivers/scsi/mac_esp.c Thu Oct 25 13:53:51 2001 @@ -65,7 +65,7 @@ static int esp_dafb_dma_irq_p(struct NCR_ESP * espdev); static int esp_iosb_dma_irq_p(struct NCR_ESP * espdev); -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are transferred to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/mca_53c9x.c linux/drivers/scsi/mca_53c9x.c --- v2.4.13/linux/drivers/scsi/mca_53c9x.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/scsi/mca_53c9x.c Thu Oct 25 13:53:51 2001 @@ -68,7 +68,7 @@ * 53c9x via PIO. */ -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* * We keep the structure that is used to access the registers on the 53c9x diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/megaraid.c linux/drivers/scsi/megaraid.c --- v2.4.13/linux/drivers/scsi/megaraid.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/megaraid.c Thu Oct 25 13:53:51 2001 @@ -9,9 +9,9 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * - * Version : v1.17a (July 13, 2001) + * Version : v1.18 (Oct 11, 2001) * - * Description: Linux device driver for AMI MegaRAID controller + * Description: Linux device driver for LSI Logic MegaRAID controller * * Supported controllers: MegaRAID 418, 428, 438, 466, 762, 467, 471, 490 * 493. @@ -427,12 +427,39 @@ * our current formula working to calculate logical drive number, return * failure for LUN > 7 * + * + * Version 1.17b + * Mon Jul 30 19:24:02 EDT 2001 - AM + * + * Added support for random deletion of logical drives + * + * Version 1.17c + * Tue Sep 25 09:37:49 EDT 2001 - Atul Mukker + * + * With single and dual channel controllers, some virtaul channels are + * displayed negative. + * * Version 1.17a-ac * Mon Aug 6 14:59:29 BST 2001 - "Michael Johnson" * * Make the HP print formatting and check for buggy firmware runtime not * ifdef dependant. * + * + * Version 1.17d + * Thu Oct 11 10:48:45 EDT 2001 - Atul Mukker + * + * Driver 1.17c oops when loaded without controller. + * + * Special case for "use_sg == 1" removed while building the scatter gather + * list. + * + * Version 1.18 + * Thu Oct 11 15:02:53 EDT 2001 - Atul Mukker + * + * References to AMI have been changed to LSI Logic. + * + * * BUGS: * Some older 2.1 kernels (eg. 2.1.90) have a bug in pci.c that * fails to detect the controller as a pci device on the system. @@ -550,16 +577,15 @@ * queue task is a simple api without irq forms */ -MODULE_AUTHOR ("American Megatrends Inc."); -MODULE_DESCRIPTION ("AMI MegaRAID driver"); -MODULE_LICENSE("GPL"); - +MODULE_AUTHOR ("LSI Logic Corporation"); +MODULE_DESCRIPTION ("LSI Logic MegaRAID driver"); +MODULE_LICENSE ("GPL"); #define DRIVER_LOCK_T #define DRIVER_LOCK_INIT(p) #define DRIVER_LOCK(p) #define DRIVER_UNLOCK(p) -#define IO_LOCK_T unsigned long io_flags = 0; +#define IO_LOCK_T unsigned long io_flags = 0 #define IO_LOCK spin_lock_irqsave(&io_request_lock,io_flags); #define IO_UNLOCK spin_unlock_irqrestore(&io_request_lock,io_flags); @@ -578,14 +604,14 @@ */ static char kernel_version[] = UTS_RELEASE; -MODULE_AUTHOR ("American Megatrends Inc."); -MODULE_DESCRIPTION ("AMI MegaRAID driver"); +MODULE_AUTHOR ("LSI Logic Corporation"); +MODULE_DESCRIPTION ("LSI Logic MegaRAID driver"); #define DRIVER_LOCK_T #define DRIVER_LOCK_INIT(p) #define DRIVER_LOCK(p) #define DRIVER_UNLOCK(p) -#define IO_LOCK_T unsigned long io_flags = 0; +#define IO_LOCK_T unsigned long io_flags = 0 #define IO_LOCK spin_lock_irqsave(&io_request_lock,io_flags); #define IO_UNLOCK spin_unlock_irqrestore(&io_request_lock,io_flags); @@ -746,7 +772,7 @@ static struct mcontroller mcontroller[MAX_CONTROLLERS]; /* The current driver version */ -static u32 driver_ver = 117; +static u32 driver_ver = 114; /* major number used by the device for character interface */ static int major; @@ -1050,7 +1076,11 @@ panic(KERN_ERR "megaraid:Problem...!\n"); } + islogical = ( (SCpnt->channel >= megaCfg->productInfo.SCSIChanPresent) && + (SCpnt->channel <= megaCfg->host->max_channel) ); +#if 0 islogical = (SCpnt->channel == megaCfg->host->max_channel); +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /* Special Case to handle PassThrough->XferAddrress > 4GB */ @@ -1174,7 +1204,8 @@ mega_ext_passthru *epthru; long seg; char islogical; - char lun = SCpnt->lun; + int lun = SCpnt->lun; + int max_lun; if ((SCpnt->cmnd[0] == MEGADEVIOC)) return megadev_doioctl (megaCfg, SCpnt); @@ -1191,8 +1222,12 @@ } #endif + islogical = ( (SCpnt->channel >= megaCfg->productInfo.SCSIChanPresent) && + (SCpnt->channel <= megaCfg->host->max_channel) ); +#if 0 islogical = (IS_RAID_CH(SCpnt->channel) && /* virtual ch is raid - AM */ (SCpnt->channel == megaCfg->host->max_channel)); +#endif if ( ! megaCfg->support_ext_cdb ) { if (!islogical && lun != 0) { @@ -1208,21 +1243,28 @@ return NULL; } - /* - * Return error for LUN > 7. The way we calculate logical drive number - * requires it to be so. - */ - if( lun > 7 ) { - SCpnt->result = (DID_BAD_TARGET << 16); - callDone (SCpnt); - return NULL; - } - if (islogical) { - lun = (SCpnt->target * 8) + lun; + /* have just LUN 0 for each target on virtual channels */ + if( SCpnt->lun != 0 ) { + SCpnt->result = (DID_BAD_TARGET << 16); + callDone (SCpnt); + return NULL; + } + + lun = mega_get_lun(megaCfg, SCpnt); - if(lun >= megaCfg->numldrv ) { + max_lun = (megaCfg->flag & BOARD_40LD) ? + FC_MAX_LOGICAL_DRIVES : MAX_LOGICAL_DRIVES; + + /* + * max_lun increases by 0x80 if some logical drive was deleted. + */ + if(megaCfg->read_ldidmap) { + max_lun += 0x80; + } + + if( lun > max_lun ) { SCpnt->result = (DID_BAD_TARGET << 16); callDone (SCpnt); return NULL; @@ -1241,6 +1283,13 @@ } } } + } else { + if ( lun > 7) { + /* Do not support lun >7 for physically accessed devices */ + SCpnt->result = (DID_BAD_TARGET << 16); + callDone (SCpnt); + return NULL; + } } /*----------------------------------------------------- * @@ -1503,6 +1552,44 @@ return NULL; } +static int +mega_get_lun(mega_host_config *this_hba, Scsi_Cmnd *sc) +{ + int tgt; + int lun; + int virt_chan; + + tgt = sc->target; + + if ( tgt > 7 ) tgt--; /* we do not get inquires for tgt 7 */ + + virt_chan = sc->channel - this_hba->productInfo.SCSIChanPresent; + lun = (virt_chan * 15) + tgt; + + /* + * If "delete logical drive" feature is enabled on this controller. + * Do only if at least one delete logical drive operation was done. + * + * Also, after logical drive deletion, instead of logical drive number, + * the value returned should be 0x80+logical drive id. + * + * These is valid only for IO commands. + */ + + if( this_hba->support_random_del && this_hba->read_ldidmap ) { + switch(sc->cmnd[0]) { + case READ_6: /* fall through */ + case WRITE_6: /* fall through */ + case READ_10: /* fall through */ + case WRITE_10: + lun += 0x80; + } + } + + return lun; +} + + static mega_passthru * mega_prepare_passthru(mega_host_config *megacfg, mega_scb *scb, Scsi_Cmnd *sc) { @@ -1969,7 +2056,7 @@ *--------------------------------------------------------------------*/ static void megaraid_isr (int irq, void *devp, struct pt_regs *regs) { - IO_LOCK_T + IO_LOCK_T; mega_host_config * megaCfg; u_char byte, idx, sIdx, tmpBox[MAILBOX_SIZE]; u32 dword = 0; @@ -2367,7 +2454,7 @@ } sgList = (struct scatterlist *) scb->SCpnt->request_buffer; - +#if 0 if (scb->SCpnt->use_sg == 1) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) @@ -2395,7 +2482,7 @@ return 0; } - +#endif /* Copy Scatter-Gather list info into controller structure */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) sgcnt = pci_map_sg (megaCfg->dev, @@ -2640,7 +2727,7 @@ mboxData[2] = NC_SUBOP_PRODUCT_INFO; /* i.e. 0x0E */ if ((retval = megaIssueCmd (megaCfg, mboxData, NULL, 0)) != 0) - printk ("ami:Product_info cmd failed with error: %d\n", + printk ("megaraid: Product_info cmd failed with error: %d\n", retval); pci_unmap_single (megaCfg->dev, @@ -2649,12 +2736,21 @@ PCI_DMA_FROMDEVICE); } - megaCfg->host->max_channel = megaCfg->productInfo.SCSIChanPresent; + /* + * kernel scans the channels from 0 to <= max_channel + */ + megaCfg->host->max_channel = + megaCfg->productInfo.SCSIChanPresent + NVIRT_CHAN -1; + megaCfg->host->max_id = 16; /* max targets per channel */ /*(megaCfg->flag & BOARD_40LD)?FC_MAX_TARGETS_PER_CHANNEL:MAX_TARGET+1; */ +#if 0 megaCfg->host->max_lun = /* max lun */ - (megaCfg-> - flag & BOARD_40LD) ? FC_MAX_LOGICAL_DRIVES : MAX_LOGICAL_DRIVES; + (megaCfg->flag & BOARD_40LD) ? + FC_MAX_LOGICAL_DRIVES : MAX_LOGICAL_DRIVES; +#endif + megaCfg->host->max_lun = 7; /* Upto 7 luns for non disk devices */ + megaCfg->host->cmd_per_lun = MAX_CMD_PER_LUN; megaCfg->numldrv = enquiry3Pnt->numLDrv; @@ -2670,27 +2766,27 @@ } #endif - /* use HP firmware and bios version encoding */ -if (megaCfg->productInfo.subSystemVendorID == HP_SUBSYS_ID) { - sprintf (megaCfg->fwVer, "%c%d%d.%d%d", - megaCfg->productInfo.FwVer[2], - megaCfg->productInfo.FwVer[1] >> 8, - megaCfg->productInfo.FwVer[1] & 0x0f, - megaCfg->productInfo.FwVer[2] >> 8, - megaCfg->productInfo.FwVer[2] & 0x0f); - sprintf (megaCfg->biosVer, "%c%d%d.%d%d", - megaCfg->productInfo.BiosVer[2], - megaCfg->productInfo.BiosVer[1] >> 8, - megaCfg->productInfo.BiosVer[1] & 0x0f, - megaCfg->productInfo.BiosVer[2] >> 8, - megaCfg->productInfo.BiosVer[2] & 0x0f); -} else { - memcpy (megaCfg->fwVer, (char *) megaCfg->productInfo.FwVer, 4); - megaCfg->fwVer[4] = 0; + /* use HP firmware and bios version encoding */ + if (megaCfg->productInfo.subSystemVendorID == HP_SUBSYS_ID) { + sprintf (megaCfg->fwVer, "%c%d%d.%d%d", + megaCfg->productInfo.FwVer[2], + megaCfg->productInfo.FwVer[1] >> 8, + megaCfg->productInfo.FwVer[1] & 0x0f, + megaCfg->productInfo.FwVer[0] >> 8, + megaCfg->productInfo.FwVer[0] & 0x0f); + sprintf (megaCfg->biosVer, "%c%d%d.%d%d", + megaCfg->productInfo.BiosVer[2], + megaCfg->productInfo.BiosVer[1] >> 8, + megaCfg->productInfo.BiosVer[1] & 0x0f, + megaCfg->productInfo.BiosVer[0] >> 8, + megaCfg->productInfo.BiosVer[0] & 0x0f); + } else { + memcpy (megaCfg->fwVer, (char *) megaCfg->productInfo.FwVer, 4); + megaCfg->fwVer[4] = 0; - memcpy (megaCfg->biosVer, (char *) megaCfg->productInfo.BiosVer, 4); - megaCfg->biosVer[4] = 0; -} + memcpy (megaCfg->biosVer, (char *) megaCfg->productInfo.BiosVer, 4); + megaCfg->biosVer[4] = 0; + } megaCfg->support_ext_cdb = mega_support_ext_cdb(megaCfg); printk (KERN_NOTICE "megaraid: [%s:%s] detected %d logical drives" M_RD_CRLFSTR, @@ -2737,7 +2833,7 @@ u32 magic64; #endif - int i; + int i; #ifdef __LP64__ u64 megaBase; @@ -2859,7 +2955,6 @@ if (!host) goto err_unmap; -#if 0 /* * Comment the following initialization if you know 'max_sectors' is * not defined for this kernel. @@ -2867,7 +2962,6 @@ * greatly increases the IO performance - AM */ host->max_sectors = 1024; -#endif scsi_set_pci_device(host, pdev); megaCfg = (mega_host_config *) host->hostdata; @@ -2894,6 +2988,9 @@ megaCfg->lock_pend = SPIN_LOCK_UNLOCKED; megaCfg->lock_scsicmd = SPIN_LOCK_UNLOCKED; megaCfg->flag = flag; + megaCfg->int_qh = NULL; + megaCfg->int_qt = NULL; + megaCfg->int_qlen = 0; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) megaCfg->dev = pdev; @@ -2999,7 +3096,7 @@ * Find out which channel is raid and which is scsi */ mega_enum_raid_scsi(megaCfg); - for( i = 0; i < megaCfg->host->max_channel; i++ ) { + for( i = 0; i < megaCfg->productInfo.SCSIChanPresent; i++ ) { if(IS_RAID_CH(i)) printk(KERN_NOTICE"megaraid: channel[%d] is raid.\n", i+1); else @@ -3014,6 +3111,12 @@ mega_hbas[numCtlrs].hostdata_addr = megaCfg; + /* + * Do we support random deletion and addition of logical drives + */ + megaCfg->read_ldidmap = 0; /* set it after first logdrv delete cmd */ + megaCfg->support_random_del = mega_support_random_del(megaCfg); + /* Initialize SCBs */ if (mega_init_scb (megaCfg)) { pci_free_consistent (megaCfg->dev, @@ -3100,7 +3203,7 @@ skip_id = (skip_id > 15) ? -1 : skip_id; } - printk (KERN_NOTICE "megaraid: " MEGARAID_VERSION M_RD_CRLFSTR); + printk (KERN_NOTICE "megaraid: " MEGARAID_VERSION); memset (mega_hbas, 0, sizeof (mega_hbas)); @@ -3267,6 +3370,7 @@ { mega_mailbox *mboxp; unsigned char mbox[16]; + int i; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) dma_addr_t dma_handle; @@ -3299,8 +3403,10 @@ if( megaIssueCmd(megacfg, mbox, NULL, 0) == 0 ) { mega_ch_class = *((char *)megacfg->mega_buffer); - /* logical drives channel is RAID */ - mega_ch_class |= (0x01 << megacfg->host->max_channel); + for( i = 0; i < NVIRT_CHAN; i++ ) { + /* logical drives channel is RAID */ + mega_ch_class |= (0x01 << (megacfg->productInfo.SCSIChanPresent+i)); + } } else { mega_ch_class = 0xFF; @@ -3572,7 +3678,7 @@ megaCfg = (mega_host_config *) pSHost->hostdata; sprintf (buffer, - "AMI MegaRAID %s %d commands %d targs %d chans %d luns", + "LSI Logic MegaRAID %s %d commands %d targs %d chans %d luns", megaCfg->fwVer, megaCfg->productInfo.MaxConcCmds, megaCfg->host->max_id, megaCfg->host->max_channel, megaCfg->host->max_lun); @@ -3604,14 +3710,15 @@ DRIVER_LOCK (megaCfg); if (!(megaCfg->flag & (1L << SCpnt->channel))) { - if (SCpnt->channel < SCpnt->host->max_channel) + if (SCpnt->channel < megaCfg->productInfo.SCSIChanPresent) printk ( KERN_NOTICE - "scsi%d: scanning channel %c for devices.\n", - megaCfg->host->host_no, SCpnt->channel + '1'); + "scsi%d: scanning channel %d for devices.\n", + megaCfg->host->host_no, SCpnt->channel); else printk ( KERN_NOTICE - "scsi%d: scanning virtual channel for logical drives.\n", - megaCfg->host->host_no); + "scsi%d: scanning virtual channel %d for logical drives.\n", + megaCfg->host->host_no, + SCpnt->channel-megaCfg->productInfo.SCSIChanPresent+1); megaCfg->flag |= (1L << SCpnt->channel); } @@ -3657,21 +3764,38 @@ megaCfg->flag |= IN_QUEUE; /* Allocate and build a SCB request */ if ((pScb = mega_build_cmd (megaCfg, SCpnt)) != NULL) { - /*build SCpnt for M_RD_IOCTL_CMD_NEW cmd in mega_ioctl() */ - /* Add SCB to the head of the pending queue */ - /* Add SCB to the head of the pending queue */ - if (megaCfg->qPendingH == NULL) { - megaCfg->qPendingH = megaCfg->qPendingT = pScb; - } else { - megaCfg->qPendingT->next = pScb; - megaCfg->qPendingT = pScb; - } - megaCfg->qPendingT->next = NULL; - megaCfg->qPcnt++; - if (mega_runpendq (megaCfg) == -1) { - DRIVER_UNLOCK (megaCfg); - return 0; + /* + * Check if the HBA is in quiescent state, e.g., during a delete + * logical drive opertion. If it is, queue the commands in the + * internal queue until the delete operation is complete. + */ + if( ! megaCfg->quiescent ) { + /* Add SCB to the head of the pending queue */ + if (megaCfg->qPendingH == NULL) { + megaCfg->qPendingH = megaCfg->qPendingT = pScb; + } else { + megaCfg->qPendingT->next = pScb; + megaCfg->qPendingT = pScb; + } + megaCfg->qPendingT->next = NULL; + megaCfg->qPcnt++; + + if (mega_runpendq (megaCfg) == -1) { + DRIVER_UNLOCK (megaCfg); + return 0; + } + } + else { + /* Add SCB to the internal queue */ + if (megaCfg->int_qh == NULL) { + megaCfg->int_qh = megaCfg->int_qt = pScb; + } else { + megaCfg->int_qt->next = pScb; + megaCfg->int_qt = pScb; + } + megaCfg->int_qt->next = NULL; + megaCfg->int_qlen++; } if (pScb->SCpnt->cmnd[0] == M_RD_IOCTL_CMD_NEW) { @@ -4184,6 +4308,7 @@ return -1; if( *(unsigned short *)(bh->b_data + 510) == 0xAA55 ) { + for( largest_cyl = -1, p = (struct partition *)(0x1BE + bh->b_data), i = 0; i < 4; ++i, ++p) { @@ -4197,6 +4322,7 @@ } } } + if (largest) { heads = largest->end_head + 1; sectors = largest->end_sector & 0x3f; @@ -4519,6 +4645,14 @@ break; case M_RD_IOCTL_CMD_NEW: + + /* + * Deletion of logical drives is only handled in 0x80 commands + */ + if( ioc.mbox[0] == FC_DEL_LOGDRV && ioc.mbox[2] == OP_DEL_LOGDRV ) { + return -EINVAL; + } + /* which adapter? */ adapno = ioc.ui.fcs.adapno; @@ -4686,6 +4820,28 @@ } if(shpnt == NULL) return -ENODEV; + /* + * ioctls for deleting logical drives is a special case, so check + * for it first + */ + if( ioc.mbox[0] == FC_DEL_LOGDRV && ioc.mbox[2] == OP_DEL_LOGDRV ) { + + if( !megacfg->support_random_del ) { + printk("megaraid: logdrv delete on non supporting f/w.\n"); + return -EINVAL; + } + + uioc = (struct uioctl_t *)arg; + + ret = mega_del_logdrv(megacfg, ioc.mbox[3]); + + put_user(1, &uioc->mbox[16]); /* numstatus */ + put_user(ret, &uioc->mbox[17]); /* status */ + + /* if deletion failed, let the user know by failing ioctl */ + return ret; + } + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) scsicmd = (Scsi_Cmnd *)kmalloc(sizeof(Scsi_Cmnd), GFP_KERNEL|GFP_DMA); #else @@ -4760,8 +4916,7 @@ put_user (scsicmd->result, &uioc->pthru.scsistatus); } else { put_user (1, &uioc->mbox[16]); /* numstatus */ - /* status */ - put_user (scsicmd->result, &uioc->mbox[17]); + put_user (scsicmd->result, &uioc->mbox[17]); /* status */ } if (kvaddr) { @@ -4918,6 +5073,139 @@ return !ret; } + +/* + * Find out if this controller supports random deletion and addition of + * logical drives + */ +static int +mega_support_random_del(mega_host_config *this_hba) +{ + mega_mailbox *mboxpnt; + unsigned char mbox[16]; + int ret; + + mboxpnt = (mega_mailbox *)mbox; + + memset(mbox, 0, sizeof(mbox)); + + /* + * issue command + */ + mbox[0] = FC_DEL_LOGDRV; + mbox[2] = OP_SUP_DEL_LOGDRV; + + ret = megaIssueCmd(this_hba, mbox, NULL, 0); + + return !ret; +} + +static int +mega_del_logdrv(mega_host_config *this_hba, int logdrv) +{ + int rval; + IO_LOCK_T; + DECLARE_WAIT_QUEUE_HEAD(wq); + mega_scb *scbp; + + /* + * Stop sending commands to the controller, queue them internally. + * When deletion is complete, ISR will flush the queue. + */ + IO_LOCK; + this_hba->quiescent = 1; + IO_UNLOCK; + + while( this_hba->qPcnt ) { + sleep_on_timeout( &wq, 1*HZ ); /* sleep for 1s */ + } + rval = mega_do_del_logdrv(this_hba, logdrv); + + IO_LOCK; + /* + * Attach the internal queue to the pending queue + */ + if( this_hba->qPendingH == NULL ) { + /* + * If pending queue head is null, make internal queue as + * pending queue + */ + this_hba->qPendingH = this_hba->int_qh; + this_hba->qPendingT = this_hba->int_qt; + this_hba->qPcnt = this_hba->int_qlen; + } + else { + /* + * Append pending queue to internal queue + */ + if( this_hba->int_qt ) { + this_hba->int_qt->next = this_hba->qPendingH; + + this_hba->qPendingH = this_hba->int_qh; + this_hba->qPcnt += this_hba->int_qlen; + } + } + + this_hba->int_qh = this_hba->int_qt = NULL; + this_hba->int_qlen = 0; + + /* + * If delete operation was successful, add 0x80 to the logical drive + * ids for commands in the pending queue. + */ + if( this_hba->read_ldidmap) { + for( scbp = this_hba->qPendingH; scbp; scbp = scbp->next ) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) + if( scbp->pthru->logdrv < 0x80 ) + scbp->pthru->logdrv += 0x80; +#else + if( scbp->pthru.logdrv < 0x80 ) + scbp->pthru.logdrv += 0x80; +#endif + } + } + this_hba->quiescent = 0; + + IO_UNLOCK; + + return rval; +} + + +static int +mega_do_del_logdrv(mega_host_config *this_hba, int logdrv) +{ + mega_mailbox *mboxpnt; + unsigned char mbox[16]; + int rval; + + mboxpnt = (mega_mailbox *)mbox; + + memset(mbox, 0, sizeof(mbox)); + + mbox[0] = FC_DEL_LOGDRV; + mbox[2] = OP_DEL_LOGDRV; + mbox[3] = logdrv; + + rval = megaIssueCmd(this_hba, mbox, NULL, 0); + + /* log this event */ + if( rval != 0 ) { + printk("megaraid: Attempt to delete logical drive %d failed.", + logdrv); + return rval; + } + + printk("megaraid: logical drive %d deleted.\n", logdrv); + + /* + * After deleting first logical drive, the logical drives must be + * addressed by adding 0x80 to the logical drive id. + */ + this_hba->read_ldidmap = 1; + + return rval; +} #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) void * diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/megaraid.h linux/drivers/scsi/megaraid.h --- v2.4.13/linux/drivers/scsi/megaraid.h Sun Aug 12 13:28:00 2001 +++ linux/drivers/scsi/megaraid.h Thu Oct 25 13:53:51 2001 @@ -5,11 +5,14 @@ #include #endif +/* + * For state flag. Do not use LSB(8 bits) which are + * reserved for storing info about channels. + */ #define IN_ISR 0x80000000L #define IN_ABORT 0x40000000L #define IN_RESET 0x20000000L #define IN_QUEUE 0x10000000L - #define BOARD_QUARTZ 0x08000000L #define BOARD_40LD 0x04000000L #define BOARD_64BIT 0x02000000L @@ -27,7 +30,7 @@ #define M_RD_IOCTL_CMD_NEW 0x81 #define M_RD_DRIVER_IOCTL_INTERFACE 0x82 -#define MEGARAID_VERSION "v1.17a (Release Date: Fri Jul 13 18:44:01 EDT 2001)" +#define MEGARAID_VERSION "v1.18 (Release Date: Thu Oct 11 15:02:53 EDT 2001\n)" #define MEGARAID_IOCTL_VERSION 114 @@ -767,6 +770,17 @@ int support_ext_cdb; int boot_ldrv_enabled; int boot_ldrv; + + int support_random_del; /* Do we support random deletion of logdrvs */ + int read_ldidmap; /* set after logical drive deltion. The logical + drive number must be read from the map */ + int quiescent; /* a stage reached when delete logical drive needs to + be done. Stop sending requests to the hba till + delete operation is completed */ + + mega_scb *int_qh; /* commands are queued in the internal queue */ + mega_scb *int_qt; /* while the hba is quiescent */ + int int_qlen; } mega_host_config; typedef struct _driver_info { @@ -911,6 +925,16 @@ }; #pragma pack() +#define NVIRT_CHAN 4 /* # of virtual channels to represent 60 logical + drives */ + +/* + * Command for random deletion of logical drives + */ +#define FC_DEL_LOGDRV 0xA4 /* f/w command */ +#define OP_SUP_DEL_LOGDRV 0x2A /* is feature supported */ +#define OP_GET_LDID_MAP 0x18 /* get logdrv id and logdrv number map */ +#define OP_DEL_LOGDRV 0x1C /* delete logical drive */ /*================================================================ * @@ -975,6 +999,10 @@ static void mega_enum_raid_scsi(mega_host_config *); static int mega_partsize(Disk *, kdev_t, int *); static void mega_get_boot_ldrv(mega_host_config *); +static int mega_get_lun(mega_host_config *, Scsi_Cmnd *); +static int mega_support_random_del(mega_host_config *); +static int mega_del_logdrv(mega_host_config *, int); +static int mega_do_del_logdrv(mega_host_config *, int); #endif diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/mvme147.c linux/drivers/scsi/mvme147.c --- v2.4.13/linux/drivers/scsi/mvme147.c Mon Nov 27 17:57:34 2000 +++ linux/drivers/scsi/mvme147.c Thu Oct 25 13:53:51 2001 @@ -65,6 +65,7 @@ int mvme147_detect(Scsi_Host_Template *tpnt) { static unsigned char called = 0; + wd33c93_regs regs; if (!MACH_IS_MVME147 || called) return 0; @@ -74,13 +75,19 @@ tpnt->proc_info = &wd33c93_proc_info; mvme147_host = scsi_register (tpnt, sizeof(struct WD33C93_hostdata)); + if (!mvme147_host) + goto err_out; + mvme147_host->base = 0xfffe4000; mvme147_host->irq = MVME147_IRQ_SCSI_PORT; - wd33c93_init(mvme147_host, (wd33c93_regs *)0xfffe4000, - dma_setup, dma_stop, WD33C93_FS_8_10); - - request_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr, 0, "MVME147 SCSI PORT", mvme147_intr); - request_irq(MVME147_IRQ_SCSI_DMA, mvme147_intr, 0, "MVME147 SCSI DMA", mvme147_intr); + regs.SASR = (volatile unsigned char *)0xfffe4000; + regs.SCMD = (volatile unsigned char *)0xfffe4001; + wd33c93_init(mvme147_host, regs, dma_setup, dma_stop, WD33C93_FS_8_10); + + if (request_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr, 0, "MVME147 SCSI PORT", mvme147_intr)) + goto err_unregister; + if (request_irq(MVME147_IRQ_SCSI_DMA, mvme147_intr, 0, "MVME147 SCSI DMA", mvme147_intr)) + goto err_free_irq; #if 0 /* Disabled; causes problems booting */ m147_pcc->scsi_interrupt = 0x10; /* Assert SCSI bus reset */ udelay(100); @@ -94,6 +101,14 @@ m147_pcc->dma_intr = 0x89; /* Ack and enable ints */ return 1; + + err_free_irq: + free_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr); + err_unregister: + wd33c93_release(); + scsi_unregister(mvme147_host); + err_out: + return 0; } #define HOSTS_C diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/mvme16x.c linux/drivers/scsi/mvme16x.c --- v2.4.13/linux/drivers/scsi/mvme16x.c Sun Feb 13 11:21:42 2000 +++ linux/drivers/scsi/mvme16x.c Thu Oct 25 13:53:51 2001 @@ -52,3 +52,6 @@ called = 1; return 1; } + +static Scsi_Host_Template driver_template = MVME16x_SCSI; +#include "scsi_module.c" diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/oktagon_esp.c linux/drivers/scsi/oktagon_esp.c --- v2.4.13/linux/drivers/scsi/oktagon_esp.c Fri Feb 9 11:30:23 2001 +++ linux/drivers/scsi/oktagon_esp.c Thu Oct 25 13:53:51 2001 @@ -27,7 +27,7 @@ #include #include #include -#include + #include "scsi.h" #include "hosts.h" @@ -106,7 +106,7 @@ static struct NCR_ESP *current_esp; -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are trasfered to the ESP chip * via PIO. diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/qlogicfas.c linux/drivers/scsi/qlogicfas.c --- v2.4.13/linux/drivers/scsi/qlogicfas.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/qlogicfas.c Thu Oct 25 13:53:51 2001 @@ -271,8 +271,10 @@ int i,k; k = 0; i = jiffies + WATCHDOG; - while ( i > jiffies && !qabort && !((k = inb(qbase + 4)) & 0xe0)) + while ( i > jiffies && !qabort && !((k = inb(qbase + 4)) & 0xe0)) { barrier(); + cpu_relax(); + } if (i <= jiffies) return (DID_TIME_OUT); if (qabort) @@ -431,6 +433,7 @@ i = inb(qbase + 5); /* should be bus service */ while (!qabort && ((i & 0x20) != 0x20)) { barrier(); + cpu_relax(); i |= inb(qbase + 5); } rtrc(0) @@ -513,8 +516,10 @@ cmd->scsi_done = done; /* wait for the last command's interrupt to finish */ - while (qlcmd != NULL) + while (qlcmd != NULL) { barrier(); + cpu_relax(); + } ql_icmd(cmd); return 0; } diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/qlogicfc.c linux/drivers/scsi/qlogicfc.c --- v2.4.13/linux/drivers/scsi/qlogicfc.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/scsi/qlogicfc.c Thu Oct 25 13:53:51 2001 @@ -803,9 +803,10 @@ outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR); isp2x00_enable_irqs(host); /* wait for the loop to come up */ - for (wait_time = jiffies + 10 * HZ; wait_time > jiffies && hostdata->adapter_state == AS_LOOP_DOWN;) + for (wait_time = jiffies + 10 * HZ; wait_time > jiffies && hostdata->adapter_state == AS_LOOP_DOWN;) { barrier(); - + cpu_relax(); + } if (hostdata->adapter_state == AS_LOOP_DOWN) { printk("qlogicfc%d : link is not up\n", hostdata->host_id); } @@ -819,8 +820,10 @@ some time before recognizing it is attached to a fabric */ #if ISP2x00_FABRIC - for (wait_time = jiffies + 5 * HZ; wait_time > jiffies;) + for (wait_time = jiffies + 5 * HZ; wait_time > jiffies;) { barrier(); + cpu_relax(); + } #endif LEAVE("isp2x00_detect"); @@ -1840,8 +1843,10 @@ outw(HCCR_BIOS_DISABLE, host->io_port + HOST_HCCR); loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && inw(host->io_port + HOST_HCCR) == RISC_BUSY) + while (--loop_count && inw(host->io_port + HOST_HCCR) == RISC_BUSY) { barrier(); + cpu_relax(); + } if (!loop_count) printk("qlogicfc%d : reset_hardware loop timeout\n", hostdata->host_id); @@ -2118,8 +2123,10 @@ return 1; loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && inw(host->io_port + HOST_HCCR) & 0x0080) + while (--loop_count && inw(host->io_port + HOST_HCCR) & 0x0080) { barrier(); + cpu_relax(); + } if (!loop_count) { printk("qlogicfc%d : mbox_command loop timeout #1\n", hostdata->host_id); param[0] = 0x4006; @@ -2153,8 +2160,9 @@ while (1) { loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && !(inw(host->io_port + PCI_INTER_STS) & 0x08)) { + while (--loop_count && !(inw(host->io_port + PCI_INTER_STS) & 0x08)) { barrier(); + cpu_relax(); } if (!loop_count) { @@ -2172,6 +2180,7 @@ loop_count = DEFAULT_LOOP_COUNT; while (--loop_count && inw(host->io_port + MBOX0) == 0x04) { barrier(); + cpu_relax(); } if (!loop_count) printk("qlogicfc%d : mbox_command loop timeout #3\n", hostdata->host_id); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/qlogicisp.c linux/drivers/scsi/qlogicisp.c --- v2.4.13/linux/drivers/scsi/qlogicisp.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/qlogicisp.c Thu Oct 25 13:53:51 2001 @@ -1279,8 +1279,10 @@ isp_outw(HCCR_BIOS_DISABLE, host, HOST_HCCR); loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && isp_inw(host, HOST_HCCR) == RISC_BUSY) + while (--loop_count && isp_inw(host, HOST_HCCR) == RISC_BUSY) { barrier(); + cpu_relax(); + } if (!loop_count) printk("qlogicisp: reset_hardware loop timeout\n"); @@ -1904,8 +1906,10 @@ return 1; loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && isp_inw(host, HOST_HCCR) & 0x0080) + while (--loop_count && isp_inw(host, HOST_HCCR) & 0x0080) { barrier(); + cpu_relax(); + } if (!loop_count) printk("qlogicisp: mbox_command loop timeout #1\n"); @@ -1925,14 +1929,18 @@ isp_outw(HCCR_SET_HOST_INTR, host, HOST_HCCR); loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && !(isp_inw(host, PCI_INTF_STS) & 0x04)) + while (--loop_count && !(isp_inw(host, PCI_INTF_STS) & 0x04)) { barrier(); + cpu_relax(); + } if (!loop_count) printk("qlogicisp: mbox_command loop timeout #2\n"); loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && isp_inw(host, MBOX0) == 0x04) + while (--loop_count && isp_inw(host, MBOX0) == 0x04) { barrier(); + cpu_relax(); + } if (!loop_count) printk("qlogicisp: mbox_command loop timeout #3\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/qlogicpti.c linux/drivers/scsi/qlogicpti.c --- v2.4.13/linux/drivers/scsi/qlogicpti.c Wed Jul 25 17:10:23 2001 +++ linux/drivers/scsi/qlogicpti.c Tue Oct 30 15:08:11 2001 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -184,8 +183,10 @@ /* Wait for host IRQ bit to clear. */ loop_count = DEFAULT_LOOP_COUNT; - while (--loop_count && (sbus_readw(qpti->qregs + HCCTRL) & HCCTRL_HIRQ)) + while (--loop_count && (sbus_readw(qpti->qregs + HCCTRL) & HCCTRL_HIRQ)) { barrier(); + cpu_relax(); + } if (!loop_count) printk(KERN_EMERG "qlogicpti: mbox_command loop timeout #1\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/scsi_merge.c linux/drivers/scsi/scsi_merge.c --- v2.4.13/linux/drivers/scsi/scsi_merge.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/scsi/scsi_merge.c Thu Oct 25 14:05:31 2001 @@ -943,6 +943,7 @@ } count++; sgpnt[count - 1].address = bh->b_data; + sgpnt[count - 1].page = NULL; sgpnt[count - 1].length += bh->b_size; if (!dma_host) { SCpnt->request_bufflen += bh->b_size; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/sd.c linux/drivers/scsi/sd.c --- v2.4.13/linux/drivers/scsi/sd.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/scsi/sd.c Thu Oct 25 13:58:35 2001 @@ -555,6 +555,7 @@ static struct block_device_operations sd_fops = { + owner: THIS_MODULE, open: sd_open, release: sd_release, ioctl: sd_ioctl, diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/sr.c linux/drivers/scsi/sr.c --- v2.4.13/linux/drivers/scsi/sr.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/scsi/sr.c Thu Oct 25 13:58:35 2001 @@ -484,6 +484,15 @@ return 1; } +struct block_device_operations sr_bdops = +{ + owner: THIS_MODULE, + open: cdrom_open, + release: cdrom_release, + ioctl: cdrom_ioctl, + check_media_change: cdrom_media_changed, +}; + static int sr_open(struct cdrom_device_info *cdi, int purpose) { check_disk_change(cdi->dev); @@ -778,7 +787,7 @@ return 0; if (!sr_registered) { - if (devfs_register_blkdev(MAJOR_NR, "sr", &cdrom_fops)) { + if (devfs_register_blkdev(MAJOR_NR, "sr", &sr_bdops)) { printk("Unable to get major %d for SCSI-CD\n", MAJOR_NR); return 1; } @@ -875,7 +884,7 @@ devfs_register (scsi_CDs[i].device->de, "cd", DEVFS_FL_DEFAULT, MAJOR_NR, i, S_IFBLK | S_IRUGO | S_IWUGO, - &cdrom_fops, NULL); + &sr_bdops, NULL); register_cdrom(&scsi_CDs[i].cdi); } diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/st.c linux/drivers/scsi/st.c --- v2.4.13/linux/drivers/scsi/st.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/scsi/st.c Tue Oct 30 15:08:12 2001 @@ -3233,6 +3233,7 @@ break; } } + tb->sg[0].page = NULL; if (tb->sg[segs].address == NULL) { kfree(tb); tb = NULL; @@ -3264,6 +3265,7 @@ tb = NULL; break; } + tb->sg[segs].page = NULL; tb->sg[segs].length = b_size; got += b_size; segs++; @@ -3337,6 +3339,7 @@ normalize_buffer(STbuffer); return FALSE; } + STbuffer->sg[segs].page = NULL; STbuffer->sg[segs].length = b_size; STbuffer->sg_segs += 1; got += b_size; diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/sun3_NCR5380.c linux/drivers/scsi/sun3_NCR5380.c --- v2.4.13/linux/drivers/scsi/sun3_NCR5380.c Fri Dec 29 14:07:22 2000 +++ linux/drivers/scsi/sun3_NCR5380.c Thu Oct 25 13:53:51 2001 @@ -647,10 +647,10 @@ static volatile int main_running = 0; static struct tq_struct NCR5380_tqueue = { - NULL, /* next */ - 0, /* sync */ - (void (*)(void*))NCR5380_main, /* routine, must have (void *) arg... */ - NULL /* data */ +// NULL, /* next */ + sync: 0, /* sync */ + routine: (void (*)(void*))NCR5380_main, /* routine, must have (void *) arg... */ + data: NULL /* data */ }; static __inline__ void queue_main(void) @@ -1217,7 +1217,7 @@ HOSTNO, NCR5380_read(BUS_AND_STATUS_REG), NCR5380_read(STATUS_REG)); - if((sun3scsi_dma_finish())) { + if((sun3scsi_dma_finish(hostdata->connected->request.cmd))) { printk("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n", HOSTNO); printk("please e-mail sammy@oh.verio.com with a description of how this\n"); printk("error was produced.\n"); diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/sun3_scsi.c linux/drivers/scsi/sun3_scsi.c --- v2.4.13/linux/drivers/scsi/sun3_scsi.c Fri Mar 2 18:38:39 2001 +++ linux/drivers/scsi/sun3_scsi.c Thu Oct 25 13:53:51 2001 @@ -68,6 +68,9 @@ #include #include +#include +#include + /* dma on! */ #define REAL_DMA @@ -113,7 +116,7 @@ #define AFTER_RESET_DELAY (HZ/2) /* ms to wait after hitting dma regs */ -#define SUN3_DMA_DELAY 5 +#define SUN3_DMA_DELAY 10 /* dvma buffer to allocate -- 32k should hopefully be more than sufficient */ #define SUN3_DVMA_BUFSIZE 0xe000 @@ -125,9 +128,10 @@ static volatile struct sun3_dma_regs *dregs; static unsigned char *dmabuf = NULL; /* dma memory buffer */ static struct sun3_udc_regs *udc_regs = NULL; -static void *sun3_dma_orig_addr = NULL; +static unsigned char *sun3_dma_orig_addr = NULL; static unsigned long sun3_dma_orig_count = 0; static int sun3_dma_active = 0; +static unsigned long last_residual = 0; /* * NCR 5380 register access functions @@ -189,6 +193,16 @@ static int called = 0; struct Scsi_Host *instance; + /* check that this machine has an onboard 5380 */ + switch(idprom->id_machtype) { + case SM_SUN3|SM_3_50: + case SM_SUN3|SM_3_60: + break; + + default: + return 0; + } + if(called) return 0; @@ -233,17 +247,17 @@ sun3_scsi_regp = (unsigned char *)ioaddr; dregs = (struct sun3_dma_regs *)(((unsigned char *)ioaddr) + 8); - if((dmabuf = sun3_dvma_malloc(SUN3_DVMA_BUFSIZE)) == NULL) { + if((udc_regs = dvma_malloc(sizeof(struct sun3_udc_regs))) + == NULL) { printk("SUN3 Scsi couldn't allocate DVMA memory!\n"); return 0; } - - if((udc_regs = sun3_dvma_malloc(sizeof(struct sun3_udc_regs))) - == NULL) { +#ifdef OLDDMA + if((dmabuf = dvma_malloc_align(SUN3_DVMA_BUFSIZE, 0x10000)) == NULL) { printk("SUN3 Scsi couldn't allocate DVMA memory!\n"); return 0; } - +#endif #ifdef SUPPORT_TAGS if (setup_use_tagged_queuing < 0) setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING; @@ -403,13 +417,21 @@ /* sun3scsi_dma_setup() -- initialize the dma controller for a read/write */ static unsigned long sun3scsi_dma_setup(void *data, unsigned long count, int write_flag) { +#ifdef OLDDMA if(write_flag) memcpy(dmabuf, data, count); else { sun3_dma_orig_addr = data; sun3_dma_orig_count = count; } +#else + void *addr; +// addr = sun3_dvma_page((unsigned long)data, (unsigned long)dmabuf); + addr = (void *)dvma_map((unsigned long) data, count); + sun3_dma_orig_addr = addr; + sun3_dma_orig_count = count; +#endif dregs->fifo_count = 0; sun3_udc_write(UDC_RESET, UDC_CSR); @@ -441,8 +463,13 @@ } /* setup udc */ - udc_regs->addr_hi = ((sun3_dvma_vtop(dmabuf) & 0xff0000) >> 8); - udc_regs->addr_lo = (sun3_dvma_vtop(dmabuf) & 0xffff); +#ifdef OLDDMA + udc_regs->addr_hi = ((dvma_vtob(dmabuf) & 0xff0000) >> 8); + udc_regs->addr_lo = (dvma_vtob(dmabuf) & 0xffff); +#else + udc_regs->addr_hi = (((unsigned long)(addr) & 0xff0000) >> 8); + udc_regs->addr_lo = ((unsigned long)(addr) & 0xffff); +#endif udc_regs->count = count/2; /* count in words */ udc_regs->mode_hi = UDC_MODE_HIWORD; if(write_flag) { @@ -456,10 +483,10 @@ } /* announce location of regs block */ - sun3_udc_write(((sun3_dvma_vtop(udc_regs) & 0xff0000) >> 8), + sun3_udc_write(((dvma_vtob(udc_regs) & 0xff0000) >> 8), UDC_CHN_HI); - sun3_udc_write((sun3_dvma_vtop(udc_regs) & 0xffff), UDC_CHN_LO); + sun3_udc_write((dvma_vtob(udc_regs) & 0xffff), UDC_CHN_LO); /* set dma master on */ sun3_udc_write(0xd, UDC_MODE); @@ -471,7 +498,7 @@ } -static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance) +static inline unsigned long sun3scsi_dma_count(struct Scsi_Host *instance) { unsigned short resid; @@ -484,6 +511,11 @@ return (unsigned long) resid; } +static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance) +{ + return last_residual; +} + static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd, int write_flag) { @@ -494,15 +526,33 @@ } /* clean up after our dma is done */ -static int sun3scsi_dma_finish(void) +static int sun3scsi_dma_finish(int write_flag) { unsigned short count; + unsigned short fifo; int ret = 0; - count = sun3scsi_dma_residual(default_instance); - sun3_dma_active = 0; + // check to empty the fifo on a read + if(!write_flag) { + int tmo = 200000; /* 2 sec */ + + while(1) { + if(dregs->csr & CSR_FIFO_EMPTY) + break; + + if(--tmo <= 0) + return 1; + + udelay(10); + } + } + + + count = sun3scsi_dma_count(default_instance); +#ifdef OLDDMA + /* if we've finished a read, copy out the data we read */ if(sun3_dma_orig_addr) { /* check for residual bytes after dma end */ @@ -518,9 +568,29 @@ sun3_dma_orig_addr = NULL; } - +#else + + fifo = dregs->fifo_count; + last_residual = fifo; + + /* empty bytes from the fifo which didn't make it */ + if((!write_flag) && (count - fifo) == 2) { + unsigned short data; + unsigned char *vaddr; + + data = dregs->fifo_data; + vaddr = (unsigned char *)dvma_btov(sun3_dma_orig_addr); + + vaddr += (sun3_dma_orig_count - fifo); + + vaddr[-2] = (data & 0xff00) >> 8; + vaddr[-1] = (data & 0xff); + } + + dvma_unmap(sun3_dma_orig_addr); +#endif sun3_udc_write(UDC_RESET, UDC_CSR); - + dregs->fifo_count = 0; dregs->csr &= ~CSR_SEND; /* reset fifo */ diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/sun3x_esp.c linux/drivers/scsi/sun3x_esp.c --- v2.4.13/linux/drivers/scsi/sun3x_esp.c Tue Mar 6 19:44:37 2001 +++ linux/drivers/scsi/sun3x_esp.c Thu Oct 25 13:53:51 2001 @@ -21,6 +21,7 @@ #include "sun3x_esp.h" #include #include +#include extern struct NCR_ESP *espchain; @@ -28,6 +29,7 @@ static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count); static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp); static void dma_drain(struct NCR_ESP *esp); +static void dma_invalidate(struct NCR_ESP *esp); static void dma_dump_state(struct NCR_ESP *esp); static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length); static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length); @@ -44,7 +46,7 @@ static void dma_mmu_release_scsi_sgl (struct NCR_ESP *esp, Scsi_Cmnd *sp); static void dma_advance_sg (Scsi_Cmnd *sp); -volatile unsigned char cmd_buffer[16]; +static volatile unsigned char cmd_buffer[16]; /* This is where all commands are put * before they are trasfered to the ESP chip * via PIO. @@ -78,9 +80,10 @@ /* Optional functions */ esp->dma_barrier = &dma_barrier; + esp->dma_invalidate = &dma_invalidate; esp->dma_drain = &dma_drain; - esp->dma_irq_entry = &dma_ints_off; - esp->dma_irq_exit = &dma_ints_on; + esp->dma_irq_entry = 0; + esp->dma_irq_exit = 0; esp->dma_led_on = 0; esp->dma_led_off = 0; esp->dma_poll = &dma_poll; @@ -98,9 +101,14 @@ esp->eregs = (struct ESP_regs *)(SUN3X_ESP_BASE); esp->dregs = (void *)SUN3X_ESP_DMA; - esp->esp_command = (volatile unsigned char *)cmd_buffer; - esp->esp_command_dvma = dvma_alloc(virt_to_phys(cmd_buffer), - sizeof (cmd_buffer)); +#if 0 + esp->esp_command = (volatile unsigned char *)cmd_buffer; + esp->esp_command_dvma = dvma_map((unsigned long)cmd_buffer, + sizeof (cmd_buffer)); +#else + esp->esp_command = (volatile unsigned char *)dvma_malloc(DVMA_PAGE_SIZE); + esp->esp_command_dvma = dvma_vtob((unsigned long)esp->esp_command); +#endif esp->irq = 2; if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, @@ -114,20 +122,57 @@ esp_initialize(esp); + /* for reasons beyond my knowledge (and which should likely be fixed) + sync mode doesn't work on a 3/80 at 5mhz. but it does at 4. */ + esp->sync_defp = 0x3f; + printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use); esps_running = esps_in_use; return esps_in_use; } +static void dma_do_drain(struct NCR_ESP *esp) +{ + struct sparc_dma_registers *dregs = + (struct sparc_dma_registers *) esp->dregs; + + int count = 500000; + + while((dregs->cond_reg & DMA_PEND_READ) && (--count > 0)) + udelay(1); + + if(!count) { + printk("%s:%d timeout CSR %08lx\n", __FILE__, __LINE__, dregs->cond_reg); + } + + dregs->cond_reg |= DMA_FIFO_STDRAIN; + + count = 500000; + + while((dregs->cond_reg & DMA_FIFO_ISDRAIN) && (--count > 0)) + udelay(1); + + if(!count) { + printk("%s:%d timeout CSR %08lx\n", __FILE__, __LINE__, dregs->cond_reg); + } + +} + static void dma_barrier(struct NCR_ESP *esp) { - struct sparc_dma_registers *dregs = - (struct sparc_dma_registers *) esp->dregs; - - while(dregs->cond_reg & DMA_PEND_READ) - udelay(1); - dregs->cond_reg &= ~(DMA_ENABLE); + struct sparc_dma_registers *dregs = + (struct sparc_dma_registers *) esp->dregs; + int count = 500000; + + while((dregs->cond_reg & DMA_PEND_READ) && (--count > 0)) + udelay(1); + + if(!count) { + printk("%s:%d timeout CSR %08lx\n", __FILE__, __LINE__, dregs->cond_reg); + } + + dregs->cond_reg &= ~(DMA_ENABLE); } /* This uses various DMA csr fields and the fifo flags count value to @@ -145,27 +190,44 @@ static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp) { - __u32 base, end, sz; - - base = ((__u32)sp->SCp.ptr); - base &= (0x1000000 - 1); - end = (base + sp->SCp.this_residual); - if(end > 0x1000000) - end = 0x1000000; - sz = (end - base); - return sz; + return sp->SCp.this_residual; } static void dma_drain(struct NCR_ESP *esp) { struct sparc_dma_registers *dregs = (struct sparc_dma_registers *) esp->dregs; + int count = 500000; if(dregs->cond_reg & DMA_FIFO_ISDRAIN) { dregs->cond_reg |= DMA_FIFO_STDRAIN; - while(dregs->cond_reg & DMA_FIFO_ISDRAIN) + while((dregs->cond_reg & DMA_FIFO_ISDRAIN) && (--count > 0)) udelay(1); + if(!count) { + printk("%s:%d timeout CSR %08lx\n", __FILE__, __LINE__, dregs->cond_reg); + } + + } +} + +static void dma_invalidate(struct NCR_ESP *esp) +{ + struct sparc_dma_registers *dregs = + (struct sparc_dma_registers *) esp->dregs; + + __u32 tmp; + int count = 500000; + + while(((tmp = dregs->cond_reg) & DMA_PEND_READ) && (--count > 0)) + udelay(1); + + if(!count) { + printk("%s:%d timeout CSR %08lx\n", __FILE__, __LINE__, dregs->cond_reg); } + + dregs->cond_reg = tmp | DMA_FIFO_INV; + dregs->cond_reg &= ~DMA_FIFO_INV; + } static void dma_dump_state(struct NCR_ESP *esp) @@ -173,7 +235,7 @@ struct sparc_dma_registers *dregs = (struct sparc_dma_registers *) esp->dregs; - ESPLOG(("esp%d: dma -- cond_reg<%08lx> addr<%p>\n", + ESPLOG(("esp%d: dma -- cond_reg<%08lx> addr<%08lx>\n", esp->esp_id, dregs->cond_reg, dregs->st_addr)); } @@ -182,8 +244,8 @@ struct sparc_dma_registers *dregs = (struct sparc_dma_registers *) esp->dregs; - dregs->cond_reg |= (DMA_ST_WRITE | DMA_ENABLE); dregs->st_addr = vaddress; + dregs->cond_reg |= (DMA_ST_WRITE | DMA_ENABLE); } static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length) @@ -192,8 +254,9 @@ (struct sparc_dma_registers *) esp->dregs; /* Set up the DMA counters */ - dregs->cond_reg = ((dregs->cond_reg & ~(DMA_ST_WRITE)) | DMA_ENABLE); + dregs->st_addr = vaddress; + dregs->cond_reg = ((dregs->cond_reg & ~(DMA_ST_WRITE)) | DMA_ENABLE); } static void dma_ints_off(struct NCR_ESP *esp) @@ -213,11 +276,21 @@ static void dma_poll(struct NCR_ESP *esp, unsigned char *vaddr) { - dma_drain(esp); + int count = 50; + dma_do_drain(esp); /* Wait till the first bits settle. */ - while(vaddr[0] == 0xff) + while((*(volatile unsigned char *)vaddr == 0xff) && (--count > 0)) udelay(1); + + if(!count) { +// printk("%s:%d timeout expire (data %02x)\n", __FILE__, __LINE__, +// esp_read(esp->eregs->esp_fdata)); + //mach_halt(); + vaddr[0] = esp_read(esp->eregs->esp_fdata); + vaddr[1] = esp_read(esp->eregs->esp_fdata); + } + } static int dma_ports_p(struct NCR_ESP *esp) @@ -244,10 +317,17 @@ (struct sparc_dma_registers *) esp->dregs; unsigned long nreg = dregs->cond_reg; +// printk("dma_setup %c addr %08x cnt %08x\n", +// write ? 'W' : 'R', addr, count); + + dma_do_drain(esp); + if(write) nreg |= DMA_ST_WRITE; - else + else { nreg &= ~(DMA_ST_WRITE); + } + nreg |= DMA_ENABLE; dregs->cond_reg = nreg; dregs->st_addr = addr; @@ -255,7 +335,7 @@ static void dma_mmu_get_scsi_one (struct NCR_ESP *esp, Scsi_Cmnd *sp) { - sp->SCp.have_data_in = dvma_alloc(virt_to_phys(sp->SCp.buffer), + sp->SCp.have_data_in = dvma_map((unsigned long)sp->SCp.buffer, sp->SCp.this_residual); sp->SCp.ptr = (char *)((unsigned long)sp->SCp.have_data_in); } @@ -266,7 +346,7 @@ struct mmu_sglist *sg = (struct mmu_sglist *) sp->SCp.buffer; while (sz >= 0) { - sg[sz].dvma_addr = dvma_alloc(virt_to_phys(sg[sz].addr), sg[sz].len); + sg[sz].dvma_addr = dvma_map((unsigned long)sg[sz].addr, sg[sz].len); sz--; } sp->SCp.ptr=(char *)((unsigned long)sp->SCp.buffer->dvma_address); @@ -274,7 +354,7 @@ static void dma_mmu_release_scsi_one (struct NCR_ESP *esp, Scsi_Cmnd *sp) { - dvma_free(sp->SCp.have_data_in, sp->request_bufflen); + dvma_unmap(sp->SCp.have_data_in); } static void dma_mmu_release_scsi_sgl (struct NCR_ESP *esp, Scsi_Cmnd *sp) @@ -283,7 +363,7 @@ struct mmu_sglist *sg = (struct mmu_sglist *)sp->buffer; while(sz >= 0) { - dvma_free(sg[sz].dvma_addr,sg[sz].len); + dvma_unmap(sg[sz].dvma_addr); sz--; } } diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/u14-34f.c linux/drivers/scsi/u14-34f.c --- v2.4.13/linux/drivers/scsi/u14-34f.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/scsi/u14-34f.c Thu Oct 25 13:53:51 2001 @@ -334,6 +334,7 @@ * the driver sets host->wish_block = TRUE for all ISA boards. */ +#include #include #ifndef LinuxVersionCode @@ -342,9 +343,6 @@ #define MAX_INT_PARAM 10 -#if defined(MODULE) -#include - MODULE_PARM(boot_options, "s"); MODULE_PARM(io_port, "1-" __MODULE_STRING(MAX_INT_PARAM) "i"); MODULE_PARM(linked_comm, "i"); @@ -353,8 +351,6 @@ MODULE_PARM(max_queue_depth, "i"); MODULE_PARM(ext_tran, "i"); MODULE_AUTHOR("Dario Ballabio"); - -#endif #include #include diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/wd33c93.c linux/drivers/scsi/wd33c93.c --- v2.4.13/linux/drivers/scsi/wd33c93.c Tue Dec 5 12:43:48 2000 +++ linux/drivers/scsi/wd33c93.c Thu Oct 25 13:53:51 2001 @@ -175,71 +175,72 @@ -static inline uchar read_wd33c93(wd33c93_regs *regp,uchar reg_num) +static inline uchar read_wd33c93(const wd33c93_regs regs, uchar reg_num) { - regp->SASR = reg_num; + *regs.SASR = reg_num; mb(); - return(regp->SCMD); + return(*regs.SCMD); } -#define READ_AUX_STAT() (regp->SASR) +#define READ_AUX_STAT() (*regs.SASR) -static inline void write_wd33c93(wd33c93_regs *regp,uchar reg_num, uchar value) +static inline void write_wd33c93(const wd33c93_regs regs, uchar reg_num, + uchar value) { - regp->SASR = reg_num; + *regs.SASR = reg_num; mb(); - regp->SCMD = value; + *regs.SCMD = value; mb(); } -static inline void write_wd33c93_cmd(wd33c93_regs *regp, uchar cmd) +static inline void write_wd33c93_cmd(const wd33c93_regs regs, uchar cmd) { - regp->SASR = WD_COMMAND; + *regs.SASR = WD_COMMAND; mb(); - regp->SCMD = cmd; + *regs.SCMD = cmd; mb(); } -static inline uchar read_1_byte(wd33c93_regs *regp) +static inline uchar read_1_byte(const wd33c93_regs regs) { uchar asr; uchar x = 0; - write_wd33c93(regp, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); - write_wd33c93_cmd(regp, WD_CMD_TRANS_INFO|0x80); + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); + write_wd33c93_cmd(regs, WD_CMD_TRANS_INFO|0x80); do { asr = READ_AUX_STAT(); if (asr & ASR_DBR) - x = read_wd33c93(regp, WD_DATA); + x = read_wd33c93(regs, WD_DATA); } while (!(asr & ASR_INT)); return x; } -static void write_wd33c93_count(wd33c93_regs *regp,unsigned long value) +static void write_wd33c93_count(const wd33c93_regs regs, unsigned long value) { - regp->SASR = WD_TRANSFER_COUNT_MSB; + *regs.SASR = WD_TRANSFER_COUNT_MSB; mb(); - regp->SCMD = value >> 16; - regp->SCMD = value >> 8; - regp->SCMD = value; + *regs.SCMD = value >> 16; + *regs.SCMD = value >> 8; + *regs.SCMD = value; mb(); } -static unsigned long read_wd33c93_count(wd33c93_regs *regp) +static unsigned long read_wd33c93_count(const wd33c93_regs regs) { unsigned long value; - regp->SASR = WD_TRANSFER_COUNT_MSB; + *regs.SASR = WD_TRANSFER_COUNT_MSB; mb(); - value = regp->SCMD << 16; - value |= regp->SCMD << 8; - value |= regp->SCMD; + value = *regs.SCMD << 16; + value |= *regs.SCMD << 8; + value |= *regs.SCMD; mb(); return value; } @@ -423,14 +424,11 @@ */ static void wd33c93_execute (struct Scsi_Host *instance) { -struct WD33C93_hostdata *hostdata; -wd33c93_regs *regp; +struct WD33C93_hostdata *hostdata = (struct WD33C93_hostdata *)instance->hostdata; +const wd33c93_regs regs = hostdata->regs; Scsi_Cmnd *cmd, *prev; int i; - hostdata = (struct WD33C93_hostdata *)instance->hostdata; - regp = hostdata->regp; - DB(DB_EXECUTE,printk("EX(")) if (hostdata->selecting || hostdata->connected) { @@ -479,9 +477,9 @@ */ if (is_dir_out(cmd)) - write_wd33c93(regp, WD_DESTINATION_ID, cmd->target); + write_wd33c93(regs, WD_DESTINATION_ID, cmd->target); else - write_wd33c93(regp, WD_DESTINATION_ID, cmd->target | DSTID_DPD); + write_wd33c93(regs, WD_DESTINATION_ID, cmd->target | DSTID_DPD); /* Now we need to figure out whether or not this command is a good * candidate for disconnect/reselect. We guess to the best of our @@ -537,10 +535,10 @@ no: - write_wd33c93(regp, WD_SOURCE_ID, ((cmd->SCp.phase)?SRCID_ER:0)); + write_wd33c93(regs, WD_SOURCE_ID, ((cmd->SCp.phase)?SRCID_ER:0)); - write_wd33c93(regp, WD_TARGET_LUN, cmd->lun); - write_wd33c93(regp,WD_SYNCHRONOUS_TRANSFER,hostdata->sync_xfer[cmd->target]); + write_wd33c93(regs, WD_TARGET_LUN, cmd->lun); + write_wd33c93(regs, WD_SYNCHRONOUS_TRANSFER,hostdata->sync_xfer[cmd->target]); hostdata->busy[cmd->target] |= (1 << cmd->lun); if ((hostdata->level2 == L2_NONE) || @@ -571,8 +569,8 @@ if (hostdata->sync_stat[cmd->target] == SS_UNSET) hostdata->sync_stat[cmd->target] = SS_FIRST; hostdata->state = S_SELECTING; - write_wd33c93_count(regp,0); /* guarantee a DATA_PHASE interrupt */ - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN); + write_wd33c93_count(regs, 0); /* guarantee a DATA_PHASE interrupt */ + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN); } else { @@ -586,15 +584,15 @@ */ hostdata->connected = cmd; - write_wd33c93(regp, WD_COMMAND_PHASE, 0); + write_wd33c93(regs, WD_COMMAND_PHASE, 0); /* copy command_descriptor_block into WD chip * (take advantage of auto-incrementing) */ - regp->SASR = WD_CDB_1; + *regs.SASR = WD_CDB_1; for (i=0; icmd_len; i++) - regp->SCMD = cmd->cmnd[i]; + *regs.SCMD = cmd->cmnd[i]; /* The wd33c93 only knows about Group 0, 1, and 5 commands when * it's doing a 'select-and-transfer'. To be safe, we write the @@ -602,7 +600,7 @@ * way there won't be problems with vendor-unique, audio, etc. */ - write_wd33c93(regp, WD_OWN_ID, cmd->cmd_len); + write_wd33c93(regs, WD_OWN_ID, cmd->cmd_len); /* When doing a non-disconnect command with DMA, we can save * ourselves a DATA phase interrupt later by setting everything @@ -612,18 +610,18 @@ if ((cmd->SCp.phase == 0) && (hostdata->no_dma == 0)) { if (hostdata->dma_setup(cmd, (is_dir_out(cmd))?DATA_OUT_DIR:DATA_IN_DIR)) - write_wd33c93_count(regp,0); /* guarantee a DATA_PHASE interrupt */ + write_wd33c93_count(regs, 0); /* guarantee a DATA_PHASE interrupt */ else { - write_wd33c93_count(regp, cmd->SCp.this_residual); - write_wd33c93(regp,WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_DMA); + write_wd33c93_count(regs, cmd->SCp.this_residual); + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_DMA); hostdata->dma = D_DMA_RUNNING; } } else - write_wd33c93_count(regp,0); /* guarantee a DATA_PHASE interrupt */ + write_wd33c93_count(regs, 0); /* guarantee a DATA_PHASE interrupt */ hostdata->state = S_RUNNING_LEVEL2; - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN_XFER); + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); } /* @@ -638,28 +636,28 @@ -static void transfer_pio(wd33c93_regs *regp, uchar *buf, int cnt, - int data_in_dir, struct WD33C93_hostdata *hostdata) +static void transfer_pio(const wd33c93_regs regs, uchar *buf, int cnt, + int data_in_dir, struct WD33C93_hostdata *hostdata) { uchar asr; DB(DB_TRANSFER,printk("(%p,%d,%s:",buf,cnt,data_in_dir?"in":"out")) - write_wd33c93(regp, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); - write_wd33c93_count(regp,cnt); - write_wd33c93_cmd(regp, WD_CMD_TRANS_INFO); + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); + write_wd33c93_count(regs, cnt); + write_wd33c93_cmd(regs, WD_CMD_TRANS_INFO); if (data_in_dir) { do { asr = READ_AUX_STAT(); if (asr & ASR_DBR) - *buf++ = read_wd33c93(regp, WD_DATA); + *buf++ = read_wd33c93(regs, WD_DATA); } while (!(asr & ASR_INT)); } else { do { asr = READ_AUX_STAT(); if (asr & ASR_DBR) - write_wd33c93(regp, WD_DATA, *buf++); + write_wd33c93(regs, WD_DATA, *buf++); } while (!(asr & ASR_INT)); } @@ -674,7 +672,8 @@ -static void transfer_bytes(wd33c93_regs *regp, Scsi_Cmnd *cmd, int data_in_dir) +static void transfer_bytes(const wd33c93_regs regs, Scsi_Cmnd *cmd, + int data_in_dir) { struct WD33C93_hostdata *hostdata; unsigned long length; @@ -696,7 +695,7 @@ cmd->SCp.ptr = cmd->SCp.buffer->address; } - write_wd33c93(regp,WD_SYNCHRONOUS_TRANSFER,hostdata->sync_xfer[cmd->target]); + write_wd33c93(regs, WD_SYNCHRONOUS_TRANSFER,hostdata->sync_xfer[cmd->target]); /* 'hostdata->no_dma' is TRUE if we don't even want to try DMA. * Update 'this_residual' and 'ptr' after 'transfer_pio()' returns. @@ -714,10 +713,10 @@ #ifdef PROC_STATISTICS hostdata->pio_cnt++; #endif - transfer_pio(regp, (uchar *)cmd->SCp.ptr, cmd->SCp.this_residual, + transfer_pio(regs, (uchar *)cmd->SCp.ptr, cmd->SCp.this_residual, data_in_dir, hostdata); length = cmd->SCp.this_residual; - cmd->SCp.this_residual = read_wd33c93_count(regp); + cmd->SCp.this_residual = read_wd33c93_count(regs); cmd->SCp.ptr += (length - cmd->SCp.this_residual); } @@ -734,17 +733,17 @@ #ifdef PROC_STATISTICS hostdata->dma_cnt++; #endif - write_wd33c93(regp, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_DMA); - write_wd33c93_count(regp,cmd->SCp.this_residual); + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_DMA); + write_wd33c93_count(regs, cmd->SCp.this_residual); if ((hostdata->level2 >= L2_DATA) || (hostdata->level2 == L2_BASIC && cmd->SCp.phase == 0)) { - write_wd33c93(regp, WD_COMMAND_PHASE, 0x45); - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN_XFER); + write_wd33c93(regs, WD_COMMAND_PHASE, 0x45); + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); hostdata->state = S_RUNNING_LEVEL2; } else - write_wd33c93_cmd(regp, WD_CMD_TRANS_INFO); + write_wd33c93_cmd(regs, WD_CMD_TRANS_INFO); hostdata->dma = D_DMA_RUNNING; } @@ -754,15 +753,12 @@ void wd33c93_intr (struct Scsi_Host *instance) { -struct WD33C93_hostdata *hostdata; +struct WD33C93_hostdata *hostdata = (struct WD33C93_hostdata *)instance->hostdata; +const wd33c93_regs regs = hostdata->regs; Scsi_Cmnd *patch, *cmd; -wd33c93_regs *regp; uchar asr, sr, phs, id, lun, *ucp, msg; unsigned long length, flags; - hostdata = (struct WD33C93_hostdata *)instance->hostdata; - regp = hostdata->regp; - asr = READ_AUX_STAT(); if (!(asr & ASR_INT) || (asr & ASR_BSY)) return; @@ -774,8 +770,8 @@ #endif cmd = (Scsi_Cmnd *)hostdata->connected; /* assume we're connected */ - sr = read_wd33c93(regp, WD_SCSI_STATUS); /* clear the interrupt */ - phs = read_wd33c93(regp, WD_COMMAND_PHASE); + sr = read_wd33c93(regs, WD_SCSI_STATUS); /* clear the interrupt */ + phs = read_wd33c93(regs, WD_COMMAND_PHASE); DB(DB_INTR,printk("{%02x:%02x-",asr,sr)) @@ -799,7 +795,7 @@ hostdata->dma_stop(cmd->host, cmd, 1); hostdata->dma = D_DMA_OFF; length = cmd->SCp.this_residual; - cmd->SCp.this_residual = read_wd33c93_count(regp); + cmd->SCp.this_residual = read_wd33c93_count(regs); cmd->SCp.ptr += (length - cmd->SCp.this_residual); DB(DB_TRANSFER,printk("%p/%d]",cmd->SCp.ptr,cmd->SCp.this_residual)) } @@ -894,7 +890,7 @@ case CSR_UNEXP |PHS_DATA_IN: case CSR_SRV_REQ |PHS_DATA_IN: DB(DB_INTR,printk("IN-%d.%d",cmd->SCp.this_residual,cmd->SCp.buffers_residual)) - transfer_bytes(regp, cmd, DATA_IN_DIR); + transfer_bytes(regs, cmd, DATA_IN_DIR); if (hostdata->state != S_RUNNING_LEVEL2) hostdata->state = S_CONNECTED; break; @@ -904,7 +900,7 @@ case CSR_UNEXP |PHS_DATA_OUT: case CSR_SRV_REQ |PHS_DATA_OUT: DB(DB_INTR,printk("OUT-%d.%d",cmd->SCp.this_residual,cmd->SCp.buffers_residual)) - transfer_bytes(regp, cmd, DATA_OUT_DIR); + transfer_bytes(regs, cmd, DATA_OUT_DIR); if (hostdata->state != S_RUNNING_LEVEL2) hostdata->state = S_CONNECTED; break; @@ -916,7 +912,7 @@ case CSR_UNEXP |PHS_COMMAND: case CSR_SRV_REQ |PHS_COMMAND: DB(DB_INTR,printk("CMND-%02x,%ld",cmd->cmnd[0],cmd->pid)) - transfer_pio(regp, cmd->cmnd, cmd->cmd_len, DATA_OUT_DIR, hostdata); + transfer_pio(regs, cmd->cmnd, cmd->cmd_len, DATA_OUT_DIR, hostdata); hostdata->state = S_CONNECTED; break; @@ -926,13 +922,13 @@ case CSR_SRV_REQ |PHS_STATUS: DB(DB_INTR,printk("STATUS=")) - cmd->SCp.Status = read_1_byte(regp); + cmd->SCp.Status = read_1_byte(regs); DB(DB_INTR,printk("%02x",cmd->SCp.Status)) if (hostdata->level2 >= L2_BASIC) { - sr = read_wd33c93(regp, WD_SCSI_STATUS); /* clear interrupt */ + sr = read_wd33c93(regs, WD_SCSI_STATUS); /* clear interrupt */ hostdata->state = S_RUNNING_LEVEL2; - write_wd33c93(regp, WD_COMMAND_PHASE, 0x50); - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN_XFER); + write_wd33c93(regs, WD_COMMAND_PHASE, 0x50); + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); } else { hostdata->state = S_CONNECTED; @@ -945,8 +941,8 @@ case CSR_SRV_REQ |PHS_MESS_IN: DB(DB_INTR,printk("MSG_IN=")) - msg = read_1_byte(regp); - sr = read_wd33c93(regp, WD_SCSI_STATUS); /* clear interrupt */ + msg = read_1_byte(regs); + sr = read_wd33c93(regs, WD_SCSI_STATUS); /* clear interrupt */ hostdata->incoming_msg[hostdata->incoming_ptr] = msg; if (hostdata->incoming_msg[0] == EXTENDED_MESSAGE) @@ -959,25 +955,25 @@ case COMMAND_COMPLETE: DB(DB_INTR,printk("CCMP-%ld",cmd->pid)) - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_PRE_CMP_DISC; break; case SAVE_POINTERS: DB(DB_INTR,printk("SDP")) - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; break; case RESTORE_POINTERS: DB(DB_INTR,printk("RDP")) if (hostdata->level2 >= L2_BASIC) { - write_wd33c93(regp, WD_COMMAND_PHASE, 0x45); - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN_XFER); + write_wd33c93(regs, WD_COMMAND_PHASE, 0x45); + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); hostdata->state = S_RUNNING_LEVEL2; } else { - write_wd33c93_cmd(regp, WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; } break; @@ -985,7 +981,7 @@ case DISCONNECT: DB(DB_INTR,printk("DIS")) cmd->device->disconnect = 1; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_PRE_TMP_DISC; break; @@ -996,7 +992,7 @@ #endif if (hostdata->sync_stat[cmd->target] == SS_WAITING) hostdata->sync_stat[cmd->target] = SS_SET; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; break; @@ -1027,7 +1023,7 @@ * specifically ask for sync transfers, we won't do any. */ - write_wd33c93_cmd(regp,WD_CMD_ASSERT_ATN); /* want MESS_OUT */ + write_wd33c93_cmd(regs, WD_CMD_ASSERT_ATN); /* want MESS_OUT */ hostdata->outgoing_msg[0] = EXTENDED_MESSAGE; hostdata->outgoing_msg[1] = 3; hostdata->outgoing_msg[2] = EXTENDED_SDTR; @@ -1044,26 +1040,26 @@ printk("sync_xfer=%02x",hostdata->sync_xfer[cmd->target]); #endif hostdata->sync_stat[cmd->target] = SS_SET; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; break; case EXTENDED_WDTR: - write_wd33c93_cmd(regp,WD_CMD_ASSERT_ATN); /* want MESS_OUT */ + write_wd33c93_cmd(regs, WD_CMD_ASSERT_ATN); /* want MESS_OUT */ printk("sending WDTR "); hostdata->outgoing_msg[0] = EXTENDED_MESSAGE; hostdata->outgoing_msg[1] = 2; hostdata->outgoing_msg[2] = EXTENDED_WDTR; hostdata->outgoing_msg[3] = 0; /* 8 bit transfer width */ hostdata->outgoing_len = 4; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; break; default: - write_wd33c93_cmd(regp,WD_CMD_ASSERT_ATN); /* want MESS_OUT */ + write_wd33c93_cmd(regs, WD_CMD_ASSERT_ATN); /* want MESS_OUT */ printk("Rejecting Unknown Extended Message(%02x). ",ucp[2]); hostdata->outgoing_msg[0] = MESSAGE_REJECT; hostdata->outgoing_len = 1; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; break; } @@ -1074,17 +1070,17 @@ else { hostdata->incoming_ptr++; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; } break; default: printk("Rejecting Unknown Message(%02x) ",msg); - write_wd33c93_cmd(regp,WD_CMD_ASSERT_ATN); /* want MESS_OUT */ + write_wd33c93_cmd(regs, WD_CMD_ASSERT_ATN); /* want MESS_OUT */ hostdata->outgoing_msg[0] = MESSAGE_REJECT; hostdata->outgoing_len = 1; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); hostdata->state = S_CONNECTED; } restore_flags(flags); @@ -1099,11 +1095,11 @@ * have been turned off for the command that just completed. */ - write_wd33c93(regp,WD_SOURCE_ID, SRCID_ER); + write_wd33c93(regs, WD_SOURCE_ID, SRCID_ER); if (phs == 0x60) { DB(DB_INTR,printk("SX-DONE-%ld",cmd->pid)) cmd->SCp.Message = COMMAND_COMPLETE; - lun = read_wd33c93(regp, WD_TARGET_LUN); + lun = read_wd33c93(regs, WD_TARGET_LUN); DB(DB_INTR,printk(":%d.%d",cmd->SCp.Status,lun)) hostdata->connected = NULL; hostdata->busy[cmd->target] &= ~(1 << cmd->lun); @@ -1133,8 +1129,8 @@ case CSR_SDP: DB(DB_INTR,printk("SDP")) hostdata->state = S_RUNNING_LEVEL2; - write_wd33c93(regp, WD_COMMAND_PHASE, 0x41); - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN_XFER); + write_wd33c93(regs, WD_COMMAND_PHASE, 0x41); + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); break; @@ -1160,7 +1156,7 @@ hostdata->outgoing_len = 1; hostdata->outgoing_msg[0] = NOP; } - transfer_pio(regp, hostdata->outgoing_msg, hostdata->outgoing_len, + transfer_pio(regs, hostdata->outgoing_msg, hostdata->outgoing_len, DATA_OUT_DIR, hostdata); DB(DB_INTR,printk("%02x",hostdata->outgoing_msg[0])) hostdata->outgoing_len = 0; @@ -1182,7 +1178,7 @@ * have been turned off for the command that just completed. */ - write_wd33c93(regp,WD_SOURCE_ID, SRCID_ER); + write_wd33c93(regs, WD_SOURCE_ID, SRCID_ER); if (cmd == NULL) { printk(" - Already disconnected! "); hostdata->state = S_UNCONNECTED; @@ -1213,7 +1209,7 @@ * have been turned off for the command that just completed. */ - write_wd33c93(regp,WD_SOURCE_ID, SRCID_ER); + write_wd33c93(regs, WD_SOURCE_ID, SRCID_ER); DB(DB_INTR,printk("DISC-%ld",cmd->pid)) if (cmd == NULL) { printk(" - Already disconnected! "); @@ -1298,7 +1294,7 @@ /* OK - find out which device reselected us. */ - id = read_wd33c93(regp, WD_SOURCE_ID); + id = read_wd33c93(regs, WD_SOURCE_ID); id &= SRCID_MASK; /* and extract the lun from the ID message. (Note that we don't @@ -1307,9 +1303,9 @@ */ if (sr == CSR_RESEL_AM) { - lun = read_wd33c93(regp, WD_DATA); + lun = read_wd33c93(regs, WD_DATA); if (hostdata->level2 < L2_RESELECT) - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); lun &= 7; } else { @@ -1325,12 +1321,12 @@ } else { /* Verify this is a change to MSG_IN and read the message */ - sr = read_wd33c93(regp, WD_SCSI_STATUS); + sr = read_wd33c93(regs, WD_SCSI_STATUS); if (sr == (CSR_ABORT | PHS_MESS_IN) || sr == (CSR_UNEXP | PHS_MESS_IN) || sr == (CSR_SRV_REQ | PHS_MESS_IN)) { /* Got MSG_IN, grab target LUN */ - lun = read_1_byte(regp); + lun = read_1_byte(regs); /* Now we expect a 'paused with ACK asserted' int.. */ asr = READ_AUX_STAT(); if (!(asr & ASR_INT)) { @@ -1340,12 +1336,12 @@ printk("wd33c93: No int after LUN on RESEL (%02x)\n", asr); } - sr = read_wd33c93(regp, WD_SCSI_STATUS); + sr = read_wd33c93(regs, WD_SCSI_STATUS); if (sr != CSR_MSGIN) printk("wd33c93: Not paused with ACK on RESEL (%02x)\n", sr); lun &= 7; - write_wd33c93_cmd(regp,WD_CMD_NEGATE_ACK); + write_wd33c93_cmd(regs, WD_CMD_NEGATE_ACK); } else { printk("wd33c93: Not MSG_IN on reselect (%02x)\n", sr); @@ -1386,13 +1382,13 @@ */ if (is_dir_out(cmd)) - write_wd33c93(regp, WD_DESTINATION_ID, cmd->target); + write_wd33c93(regs, WD_DESTINATION_ID, cmd->target); else - write_wd33c93(regp, WD_DESTINATION_ID, cmd->target | DSTID_DPD); + write_wd33c93(regs, WD_DESTINATION_ID, cmd->target | DSTID_DPD); if (hostdata->level2 >= L2_RESELECT) { - write_wd33c93_count(regp, 0); /* we want a DATA_PHASE interrupt */ - write_wd33c93(regp, WD_COMMAND_PHASE, 0x45); - write_wd33c93_cmd(regp, WD_CMD_SEL_ATN_XFER); + write_wd33c93_count(regs, 0); /* we want a DATA_PHASE interrupt */ + write_wd33c93(regs, WD_COMMAND_PHASE, 0x45); + write_wd33c93_cmd(regs, WD_CMD_SEL_ATN_XFER); hostdata->state = S_RUNNING_LEVEL2; } else @@ -1413,36 +1409,33 @@ static void reset_wd33c93(struct Scsi_Host *instance) { -struct WD33C93_hostdata *hostdata; -wd33c93_regs *regp; +struct WD33C93_hostdata *hostdata = (struct WD33C93_hostdata *)instance->hostdata; +const wd33c93_regs regs = hostdata->regs; uchar sr; - hostdata = (struct WD33C93_hostdata *)instance->hostdata; - regp = hostdata->regp; - - write_wd33c93(regp, WD_OWN_ID, OWNID_EAF | OWNID_RAF | + write_wd33c93(regs, WD_OWN_ID, OWNID_EAF | OWNID_RAF | instance->this_id | hostdata->clock_freq); - write_wd33c93(regp, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); - write_wd33c93(regp, WD_SYNCHRONOUS_TRANSFER, + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); + write_wd33c93(regs, WD_SYNCHRONOUS_TRANSFER, calc_sync_xfer(hostdata->default_sx_per/4,DEFAULT_SX_OFF)); - write_wd33c93(regp, WD_COMMAND, WD_CMD_RESET); + write_wd33c93(regs, WD_COMMAND, WD_CMD_RESET); #ifdef CONFIG_MVME147_SCSI udelay(25); /* The old wd33c93 on MVME147 needs this, at least */ #endif while (!(READ_AUX_STAT() & ASR_INT)) ; - sr = read_wd33c93(regp, WD_SCSI_STATUS); + sr = read_wd33c93(regs, WD_SCSI_STATUS); - hostdata->microcode = read_wd33c93(regp, WD_CDB_1); + hostdata->microcode = read_wd33c93(regs, WD_CDB_1); if (sr == 0x00) hostdata->chip = C_WD33C93; else if (sr == 0x01) { - write_wd33c93(regp, WD_QUEUE_TAG, 0xa5); /* any random number */ - sr = read_wd33c93(regp, WD_QUEUE_TAG); + write_wd33c93(regs, WD_QUEUE_TAG, 0xa5); /* any random number */ + sr = read_wd33c93(regs, WD_QUEUE_TAG); if (sr == 0xa5) { hostdata->chip = C_WD33C93B; - write_wd33c93(regp, WD_QUEUE_TAG, 0); + write_wd33c93(regs, WD_QUEUE_TAG, 0); } else hostdata->chip = C_WD33C93A; @@ -1450,8 +1443,8 @@ else hostdata->chip = C_UNKNOWN_CHIP; - write_wd33c93(regp, WD_TIMEOUT_PERIOD, TIMEOUT_PERIOD_VALUE); - write_wd33c93(regp, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); + write_wd33c93(regs, WD_TIMEOUT_PERIOD, TIMEOUT_PERIOD_VALUE); + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); } @@ -1495,14 +1488,14 @@ { struct Scsi_Host *instance; struct WD33C93_hostdata *hostdata; -wd33c93_regs *regp; +wd33c93_regs regs; Scsi_Cmnd *tmp, *prev; disable_irq(cmd->host->irq); instance = cmd->host; hostdata = (struct WD33C93_hostdata *)instance->hostdata; - regp = hostdata->regp; + regs = hostdata->regs; /* * Case 1 : If the command hasn't been issued yet, we simply remove it @@ -1554,8 +1547,8 @@ } printk("sending wd33c93 ABORT command - "); - write_wd33c93(regp, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); - write_wd33c93_cmd(regp, WD_CMD_ABORT); + write_wd33c93(regs, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED); + write_wd33c93_cmd(regs, WD_CMD_ABORT); /* Now we have to attempt to flush out the FIFO... */ @@ -1564,11 +1557,11 @@ do { asr = READ_AUX_STAT(); if (asr & ASR_DBR) - read_wd33c93(regp, WD_DATA); + read_wd33c93(regs, WD_DATA); } while (!(asr & ASR_INT) && timeout-- > 0); - sr = read_wd33c93(regp, WD_SCSI_STATUS); + sr = read_wd33c93(regs, WD_SCSI_STATUS); printk("asr=%02x, sr=%02x, %ld bytes un-transferred (timeout=%ld) - ", - asr, sr, read_wd33c93_count(regp), timeout); + asr, sr, read_wd33c93_count(regs), timeout); /* * Abort command processed. @@ -1577,13 +1570,13 @@ */ printk("sending wd33c93 DISCONNECT command - "); - write_wd33c93_cmd(regp, WD_CMD_DISCONNECT); + write_wd33c93_cmd(regs, WD_CMD_DISCONNECT); timeout = 1000000; asr = READ_AUX_STAT(); while ((asr & ASR_CIP) && timeout-- > 0) asr = READ_AUX_STAT(); - sr = read_wd33c93(regp, WD_SCSI_STATUS); + sr = read_wd33c93(regs, WD_SCSI_STATUS); printk("asr=%02x, sr=%02x.",asr,sr); hostdata->busy[cmd->target] &= ~(1 << cmd->lun); @@ -1733,8 +1726,8 @@ -void wd33c93_init (struct Scsi_Host *instance, wd33c93_regs *regs, - dma_setup_t setup, dma_stop_t stop, int clock_freq) +void wd33c93_init(struct Scsi_Host *instance, const wd33c93_regs regs, + dma_setup_t setup, dma_stop_t stop, int clock_freq) { struct WD33C93_hostdata *hostdata; int i; @@ -1747,7 +1740,7 @@ hostdata = (struct WD33C93_hostdata *)instance->hostdata; - hostdata->regp = regs; + hostdata->regs = regs; hostdata->clock_freq = clock_freq; hostdata->dma_setup = setup; hostdata->dma_stop = stop; @@ -2036,8 +2029,8 @@ #ifdef MODULE int init_module(void) { return 0; } void cleanup_module(void) {} +#endif void wd33c93_release(void) { -MOD_DEC_USE_COUNT; + MOD_DEC_USE_COUNT; } -#endif diff -u --recursive --new-file v2.4.13/linux/drivers/scsi/wd33c93.h linux/drivers/scsi/wd33c93.h --- v2.4.13/linux/drivers/scsi/wd33c93.h Mon Nov 27 17:57:34 2000 +++ linux/drivers/scsi/wd33c93.h Thu Oct 25 13:53:51 2001 @@ -189,14 +189,8 @@ /* This is what the 3393 chip looks like to us */ typedef struct { - volatile unsigned char SASR; -#if !defined(CONFIG_MVME147_SCSI) - char pad; -#endif -#ifdef CONFIG_SGI_IP22 - char pad2,pad3; -#endif - volatile unsigned char SCMD; + volatile unsigned char *SASR; + volatile unsigned char *SCMD; } wd33c93_regs; @@ -225,7 +219,7 @@ struct WD33C93_hostdata { struct Scsi_Host *next; - wd33c93_regs *regp; + wd33c93_regs regs; uchar clock_freq; uchar chip; /* what kind of wd33c93? */ uchar microcode; /* microcode rev */ @@ -336,7 +330,7 @@ #define PR_STOP 1<<7 -void wd33c93_init (struct Scsi_Host *instance, wd33c93_regs *regs, +void wd33c93_init (struct Scsi_Host *instance, const wd33c93_regs regs, dma_setup_t setup, dma_stop_t stop, int clock_freq); int wd33c93_abort (Scsi_Cmnd *cmd); int wd33c93_queuecommand (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/dmasound/dmasound_atari.c linux/drivers/sound/dmasound/dmasound_atari.c --- v2.4.13/linux/drivers/sound/dmasound/dmasound_atari.c Sun Sep 23 11:40:59 2001 +++ linux/drivers/sound/dmasound/dmasound_atari.c Thu Oct 25 13:53:52 2001 @@ -1559,3 +1559,4 @@ module_init(dmasound_atari_init); module_exit(dmasound_atari_cleanup); +MODULE_LICENSE("GPL"); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/dmasound/dmasound_awacs.c linux/drivers/sound/dmasound/dmasound_awacs.c --- v2.4.13/linux/drivers/sound/dmasound/dmasound_awacs.c Sun Sep 23 11:40:59 2001 +++ linux/drivers/sound/dmasound/dmasound_awacs.c Thu Oct 25 13:53:52 2001 @@ -2180,3 +2180,4 @@ module_init(dmasound_awacs_init); module_exit(dmasound_awacs_cleanup); +MODULE_LICENSE("GPL"); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/dmasound/dmasound_core.c linux/drivers/sound/dmasound/dmasound_core.c --- v2.4.13/linux/drivers/sound/dmasound/dmasound_core.c Mon Aug 27 12:41:45 2001 +++ linux/drivers/sound/dmasound/dmasound_core.c Thu Oct 25 13:53:52 2001 @@ -135,6 +135,7 @@ MODULE_PARM(writeBufSize, "i"); MODULE_PARM(numReadBufs, "i"); MODULE_PARM(readBufSize, "i"); +MODULE_LICENSE("GPL"); #ifdef MODULE static int sq_unit = -1; diff -u --recursive --new-file v2.4.13/linux/drivers/sound/dmasound/dmasound_paula.c linux/drivers/sound/dmasound/dmasound_paula.c --- v2.4.13/linux/drivers/sound/dmasound/dmasound_paula.c Sun Sep 23 11:40:59 2001 +++ linux/drivers/sound/dmasound/dmasound_paula.c Thu Oct 25 13:53:52 2001 @@ -720,3 +720,4 @@ module_init(dmasound_paula_init); module_exit(dmasound_paula_cleanup); +MODULE_LICENSE("GPL"); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/dmasound/dmasound_q40.c linux/drivers/sound/dmasound/dmasound_q40.c --- v2.4.13/linux/drivers/sound/dmasound/dmasound_q40.c Sun Sep 23 11:40:59 2001 +++ linux/drivers/sound/dmasound/dmasound_q40.c Thu Oct 25 13:53:52 2001 @@ -585,3 +585,4 @@ module_init(dmasound_q40_init); module_exit(dmasound_q40_cleanup); +MODULE_LICENSE("GPL"); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/emu10k1/hwaccess.h linux/drivers/sound/emu10k1/hwaccess.h --- v2.4.13/linux/drivers/sound/emu10k1/hwaccess.h Tue Oct 9 17:06:52 2001 +++ linux/drivers/sound/emu10k1/hwaccess.h Thu Oct 25 14:01:57 2001 @@ -37,6 +37,9 @@ #include #include #include +#include +#include +#include #include "efxmgr.h" #include "passthrough.h" diff -u --recursive --new-file v2.4.13/linux/drivers/sound/i810_audio.c linux/drivers/sound/i810_audio.c --- v2.4.13/linux/drivers/sound/i810_audio.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/sound/i810_audio.c Thu Oct 25 13:53:52 2001 @@ -247,6 +247,12 @@ MODULE_DEVICE_TABLE (pci, i810_pci_tbl); +#ifdef CONFIG_PM +#define PM_SUSPENDED(card) (card->pm_suspended) +#else +#define PM_SUSPENDED(card) (0) +#endif + /* "software" or virtual channel, an instance of opened /dev/dsp */ struct i810_state { unsigned int magic; @@ -262,6 +268,9 @@ /* virtual channel number */ int virt; +#ifdef CONFIG_PM + unsigned int pm_saved_dac_rate,pm_saved_adc_rate; +#endif struct dmabuf { /* wave sample stuff */ unsigned int rate; @@ -322,7 +331,11 @@ /* PCI device stuff */ struct pci_dev * pci_dev; u16 pci_id; - +#ifdef CONFIG_PM + u16 pm_suspended; + u32 pm_save_state[64/sizeof(u32)]; + int pm_saved_mixer_settings[SOUND_MIXER_NRDEVICES][NR_AC97]; +#endif /* soundcore stuff */ int dev_audio; @@ -451,7 +464,7 @@ if(!(state->card->ac97_features & 4)) { #ifdef DEBUG - printk(KERN_WARNING "i810_audio: S/PDIF transmitter not avalible.\n"); + printk(KERN_WARNING "i810_audio: S/PDIF transmitter not available.\n"); #endif state->card->ac97_status &= ~SPDIF_ON; } else { @@ -572,6 +585,10 @@ if(!(state->card->ac97_features&0x0001)) { dmabuf->rate = clocking; +#ifdef DEBUG + printk("Asked for %d Hz, but ac97_features says we only do %dHz. Sorry!\n", + rate,clocking); +#endif return clocking; } @@ -594,11 +611,11 @@ if(new_rate != rate) { dmabuf->rate = (new_rate * 48000)/clocking; - rate = new_rate; } #ifdef DEBUG - printk("i810_audio: called i810_set_dac_rate : rate = %d/%d\n", dmabuf->rate, rate); + printk("i810_audio: called i810_set_dac_rate : asked for %d, got %d\n", rate, dmabuf->rate); #endif + rate = new_rate; return dmabuf->rate; } @@ -1066,7 +1083,7 @@ for (;;) { /* It seems that we have to set the current state to TASK_INTERRUPTIBLE every time to make the process really go to sleep */ - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); spin_lock_irqsave(&state->card->lock, flags); i810_update_ptr(state); @@ -1085,7 +1102,7 @@ if (nonblock) { remove_wait_queue(&dmabuf->wait, &wait); - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); return -EBUSY; } @@ -1099,7 +1116,7 @@ stop_dac(state); synchronize_irq(); remove_wait_queue(&dmabuf->wait, &wait); - current->state = TASK_RUNNING; + set_current_state(TASK_RUNNING); if (signal_pending(current)) return -ERESTARTSYS; @@ -1201,16 +1218,20 @@ spin_unlock(&card->lock); } -/* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to - the user's buffer. it is filled by the dma machine and drained by this loop. */ +/* in this loop, dmabuf.count signifies the amount of data that is + waiting to be copied to the user's buffer. It is filled by the dma + machine and drained by this loop. */ + static ssize_t i810_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct i810_state *state = (struct i810_state *)file->private_data; + struct i810_card *card=state ? state->card : 0; struct dmabuf *dmabuf = &state->dmabuf; ssize_t ret; unsigned long flags; unsigned int swptr; int cnt; + DECLARE_WAITQUEUE(waita, current); #ifdef DEBUG2 printk("i810_audio: i810_read called, count = %d\n", count); @@ -1224,7 +1245,7 @@ return -ENODEV; if (!dmabuf->read_channel) { dmabuf->ready = 0; - dmabuf->read_channel = state->card->alloc_rec_pcm_channel(state->card); + dmabuf->read_channel = card->alloc_rec_pcm_channel(card); if (!dmabuf->read_channel) { return -EBUSY; } @@ -1236,8 +1257,19 @@ dmabuf->trigger &= ~PCM_ENABLE_OUTPUT; ret = 0; + add_wait_queue(&dmabuf->wait, &waita); while (count > 0) { - spin_lock_irqsave(&state->card->lock, flags); + spin_lock_irqsave(&card->lock, flags); + if (PM_SUSPENDED(card)) { + spin_unlock_irqrestore(&card->lock, flags); + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + if (signal_pending(current)) { + if (!ret) ret = -EAGAIN; + break; + } + continue; + } swptr = dmabuf->swptr; if (dmabuf->count > dmabuf->dmasize) { dmabuf->count = dmabuf->dmasize; @@ -1246,7 +1278,7 @@ // this is to make the copy_to_user simpler below if(cnt > (dmabuf->dmasize - swptr)) cnt = dmabuf->dmasize - swptr; - spin_unlock_irqrestore(&state->card->lock, flags); + spin_unlock_irqrestore(&card->lock, flags); if (cnt > count) cnt = count; @@ -1290,15 +1322,20 @@ if (copy_to_user(buffer, dmabuf->rawbuf + swptr, cnt)) { if (!ret) ret = -EFAULT; - return ret; + goto done; } swptr = (swptr + cnt) % dmabuf->dmasize; - spin_lock_irqsave(&state->card->lock, flags); + spin_lock_irqsave(&card->lock, flags); + + if (PM_SUSPENDED(card)) { + spin_unlock_irqrestore(&card->lock, flags); + continue; + } dmabuf->swptr = swptr; dmabuf->count -= cnt; - spin_unlock_irqrestore(&state->card->lock, flags); + spin_unlock_irqrestore(&card->lock, flags); count -= cnt; buffer += cnt; @@ -1307,6 +1344,10 @@ i810_update_lvi(state,1); if(!(dmabuf->enable & ADC_RUNNING)) start_adc(state); + done: + set_current_state(TASK_RUNNING); + remove_wait_queue(&dmabuf->wait, &waita); + return ret; } @@ -1315,11 +1356,13 @@ static ssize_t i810_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct i810_state *state = (struct i810_state *)file->private_data; + struct i810_card *card=state ? state->card : 0; struct dmabuf *dmabuf = &state->dmabuf; ssize_t ret; unsigned long flags; unsigned int swptr = 0; int cnt, x; + DECLARE_WAITQUEUE(waita, current); #ifdef DEBUG2 printk("i810_audio: i810_write called, count = %d\n", count); @@ -1333,7 +1376,7 @@ return -ENODEV; if (!dmabuf->write_channel) { dmabuf->ready = 0; - dmabuf->write_channel = state->card->alloc_pcm_channel(state->card); + dmabuf->write_channel = card->alloc_pcm_channel(card); if(!dmabuf->write_channel) return -EBUSY; } @@ -1344,8 +1387,20 @@ dmabuf->trigger &= ~PCM_ENABLE_INPUT; ret = 0; + add_wait_queue(&dmabuf->wait, &waita); while (count > 0) { spin_lock_irqsave(&state->card->lock, flags); + if (PM_SUSPENDED(card)) { + spin_unlock_irqrestore(&card->lock, flags); + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + if (signal_pending(current)) { + if (!ret) ret = -EAGAIN; + break; + } + continue; + } + swptr = dmabuf->swptr; if (dmabuf->count < 0) { dmabuf->count = 0; @@ -1376,7 +1431,7 @@ i810_update_lvi(state,0); if (file->f_flags & O_NONBLOCK) { if (!ret) ret = -EAGAIN; - return ret; + goto ret; } /* Not strictly correct but works */ tmo = (dmabuf->dmasize * HZ) / (dmabuf->rate * 4); @@ -1400,25 +1455,30 @@ } if (signal_pending(current)) { if (!ret) ret = -ERESTARTSYS; - return ret; + goto ret; } continue; } if (copy_from_user(dmabuf->rawbuf+swptr,buffer,cnt)) { if (!ret) ret = -EFAULT; - return ret; + goto ret; } swptr = (swptr + cnt) % dmabuf->dmasize; spin_lock_irqsave(&state->card->lock, flags); + if (PM_SUSPENDED(card)) { + spin_unlock_irqrestore(&card->lock, flags); + continue; + } + dmabuf->swptr = swptr; dmabuf->count += cnt; - spin_unlock_irqrestore(&state->card->lock, flags); count -= cnt; buffer += cnt; ret += cnt; + spin_unlock_irqrestore(&state->card->lock, flags); } if (swptr % dmabuf->fragsize) { x = dmabuf->fragsize - (swptr % dmabuf->fragsize); @@ -1427,6 +1487,9 @@ i810_update_lvi(state,0); if (!dmabuf->enable && dmabuf->count >= dmabuf->userfragsize) start_dac(state); + ret: + set_current_state(TASK_RUNNING); + remove_wait_queue(&dmabuf->wait, &waita); return ret; } @@ -2310,18 +2373,52 @@ open: i810_open_mixdev, }; -/* AC97 codec initialisation. */ -static int __init i810_ac97_init(struct i810_card *card) +/* AC97 codec initialisation. These small functions exist so we don't + duplicate code between module init and apm resume */ + +static inline int i810_ac97_exists(struct i810_card *card,int ac97_number) { - int num_ac97 = 0; - int total_channels = 0; - struct ac97_codec *codec; - u16 eid; - int i=0; - u32 reg; + u32 reg = inl(card->iobase + GLOB_STA); + return (reg & (0x100 << ac97_number)); +} - reg = inl(card->iobase + GLOB_CNT); +static inline int i810_ac97_enable_variable_rate(struct ac97_codec *codec) +{ + i810_ac97_set(codec, AC97_EXTENDED_STATUS, 9); + i810_ac97_set(codec,AC97_EXTENDED_STATUS, + i810_ac97_get(codec, AC97_EXTENDED_STATUS)|0xE800); + return (i810_ac97_get(codec, AC97_EXTENDED_STATUS)&1); +} + + +static int i810_ac97_probe_and_powerup(struct i810_card *card,struct ac97_codec *codec) +{ + /* Returns 0 on failure */ + int i; + + if (ac97_probe_codec(codec) == 0) return 0; + + /* power it all up */ + i810_ac97_set(codec, AC97_POWER_CONTROL, + i810_ac97_get(codec, AC97_POWER_CONTROL) & ~0x7f00); + /* wait for analog ready */ + for (i=10; + i && ((i810_ac97_get(codec, AC97_POWER_CONTROL) & 0xf) != 0xf); + i--) + { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/20); + } + return i; +} + +/* if I knew what this did, I'd give it a better name */ +static int i810_ac97_random_init_stuff(struct i810_card *card) +{ + u32 reg = inl(card->iobase + GLOB_CNT); + int i; + if((reg&2)==0) /* Cold required */ reg|=2; else @@ -2330,13 +2427,13 @@ reg&=~8; /* ACLink on */ outl(reg , card->iobase + GLOB_CNT); - while(i<10) + for(i=0;i<10;i++) { if((inl(card->iobase+GLOB_CNT)&4)==0) break; - current->state = TASK_UNINTERRUPTIBLE; + + set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ/20); - i++; } if(i==10) { @@ -2344,8 +2441,22 @@ return 0; } - current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout(HZ/5); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ/2); + reg = inl(card->iobase + GLOB_STA); + inw(card->ac97base); + return 1; +} + +static int __init i810_ac97_init(struct i810_card *card) +{ + int num_ac97 = 0; + int total_channels = 0; + struct ac97_codec *codec; + u16 eid; + u32 reg; + + if(!i810_ac97_random_init_stuff(card)) return 0; /* Number of channels supported */ /* What about the codec? Just because the ICH supports */ @@ -2371,10 +2482,10 @@ /* check the ready status before probing. So we chk */ /* What do we do if it's not ready? Wait and try */ /* again, or abort? */ - reg = inl(card->iobase + GLOB_STA); - if (!(reg & (0x100 << num_ac97))) { + if (!i810_ac97_exists(card,num_ac97)) { if(num_ac97 == 0) printk(KERN_ERR "i810_audio: Primary codec not ready.\n"); + card->ac97_codec[num_ac97] = 0; break; /* I think this works, if not ready stop */ } @@ -2390,24 +2501,13 @@ codec->codec_read = i810_ac97_get; codec->codec_write = i810_ac97_set; - if (ac97_probe_codec(codec) == 0) - break; - - /* power up everything, modify this when implementing power saving */ - i810_ac97_set(codec, AC97_POWER_CONTROL, - i810_ac97_get(codec, AC97_POWER_CONTROL) & ~0x7f00); - /* wait for analog ready */ - for (i=10; - i && ((i810_ac97_get(codec, AC97_POWER_CONTROL) & 0xf) != 0xf); - i--) - { - current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout(HZ/20); + if(!i810_ac97_probe_and_powerup(card,codec)) { + printk("i810_audio: timed out waiting for codec %d analog ready", num_ac97); + break; /* it didn't work */ } - /* Store state information about S/PDIF transmitter */ card->ac97_status = 0; - + /* Don't attempt to get eid until powerup is complete */ eid = i810_ac97_get(codec, AC97_EXTENDED_ID); @@ -2427,16 +2527,10 @@ printk(KERN_WARNING "i810_audio: only 48Khz playback available.\n"); else { - /* Enable variable rate mode */ - i810_ac97_set(codec, AC97_EXTENDED_STATUS, 9); - i810_ac97_set(codec,AC97_EXTENDED_STATUS, - i810_ac97_get(codec, AC97_EXTENDED_STATUS)|0xE800); - - if(!(i810_ac97_get(codec, AC97_EXTENDED_STATUS)&1)) - { + if(!i810_ac97_enable_variable_rate(codec)) { printk(KERN_WARNING "i810_audio: Codec refused to allow VRA, using 48Khz only.\n"); card->ac97_features&=~1; - } + } } /* Determine how many channels the codec(s) support */ @@ -2609,6 +2703,9 @@ card->irq = pci_dev->irq; card->next = devs; card->magic = I810_CARD_MAGIC; +#ifdef CONFIG_PM + card->pm_suspended=0; +#endif spin_lock_init(&card->lock); devs = card; @@ -2697,6 +2794,131 @@ kfree(card); } +#ifdef CONFIG_PM +static int i810_pm_suspend(struct pci_dev *dev, u32 pm_state) +{ + struct i810_card *card = dev->driver_data; + struct i810_state *state; + unsigned long flags; + struct dmabuf *dmabuf; + int i,num_ac97; +#ifdef DEBUG + printk("i810_audio: i810_pm_suspend called\n"); +#endif + if(!card) return 0; + spin_lock_irqsave(&card->lock, flags); + card->pm_suspended=1; + for(i=0;istates[i]; + if(!state) continue; + /* this happens only if there are open files */ + dmabuf = &state->dmabuf; + if(dmabuf->enable & DAC_RUNNING || + (dmabuf->count && (dmabuf->trigger & PCM_ENABLE_OUTPUT))) { + state->pm_saved_dac_rate=dmabuf->rate; + stop_dac(state); + } else { + state->pm_saved_dac_rate=0; + } + if(dmabuf->enable & ADC_RUNNING) { + state->pm_saved_adc_rate=dmabuf->rate; + stop_adc(state); + } else { + state->pm_saved_adc_rate=0; + } + dmabuf->ready = 0; + dmabuf->swptr = dmabuf->hwptr = 0; + dmabuf->count = dmabuf->total_bytes = 0; + } + + spin_unlock_irqrestore(&card->lock, flags); + + /* save mixer settings */ + for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) { + struct ac97_codec *codec = card->ac97_codec[num_ac97]; + if(!codec) continue; + for(i=0;i< SOUND_MIXER_NRDEVICES ;i++) { + if((supported_mixer(codec,i)) && + (codec->read_mixer)) { + card->pm_saved_mixer_settings[i][num_ac97]= + codec->read_mixer(codec,i); + } + } + } + pci_save_state(dev,card->pm_save_state); /* XXX do we need this? */ + pci_disable_device(dev); /* disable busmastering */ + pci_set_power_state(dev,3); /* Zzz. */ + + return 0; +} + + +static int i810_pm_resume(struct pci_dev *dev) +{ + int num_ac97,i=0; + struct i810_card *card=(struct i810_card *)dev->driver_data; + pci_enable_device(dev); + pci_restore_state (dev,card->pm_save_state); + + /* observation of a toshiba portege 3440ct suggests that the + hardware has to be more or less completely reinitialized from + scratch after an apm suspend. Works For Me. -dan */ + + i810_ac97_random_init_stuff(card); + + for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) { + struct ac97_codec *codec = card->ac97_codec[num_ac97]; + /* check they haven't stolen the hardware while we were + away */ + if(!i810_ac97_exists(card,num_ac97)) { + if(num_ac97) continue; + else BUG(); + } + if(!i810_ac97_probe_and_powerup(card,codec)) BUG(); + + if((card->ac97_features&0x0001)) { + /* at probe time we found we could do variable + rates, but APM suspend has made it forget + its magical powers */ + if(!i810_ac97_enable_variable_rate(codec)) BUG(); + } + /* we lost our mixer settings, so restore them */ + for(i=0;i< SOUND_MIXER_NRDEVICES ;i++) { + if(supported_mixer(codec,i)){ + int val=card-> + pm_saved_mixer_settings[i][num_ac97]; + codec->mixer_state[i]=val; + codec->write_mixer(codec,i, + (val & 0xff) , + ((val >> 8) & 0xff) ); + } + } + } + + /* we need to restore the sample rate from whatever it was */ + for(i=0;istates[i]; + if(state) { + if(state->pm_saved_adc_rate) + i810_set_adc_rate(state,state->pm_saved_adc_rate); + if(state->pm_saved_dac_rate) + i810_set_dac_rate(state,state->pm_saved_dac_rate); + } + } + + + card->pm_suspended = 0; + + /* any processes that were reading/writing during the suspend + probably ended up here */ + for(i=0;istates[i]; + if(state) wake_up(&state->dmabuf.wait); + } + + return 0; +} +#endif /* CONFIG_PM */ MODULE_AUTHOR(""); MODULE_DESCRIPTION("Intel 810 audio support"); @@ -2713,6 +2935,10 @@ id_table: i810_pci_tbl, probe: i810_probe, remove: i810_remove, +#ifdef CONFIG_PM + suspend: i810_pm_suspend, + resume: i810_pm_resume, +#endif /* CONFIG_PM */ }; @@ -2753,3 +2979,9 @@ module_init(i810_init_module); module_exit(i810_cleanup_module); + +/* +Local Variables: +c-basic-offset: 8 +End: +*/ diff -u --recursive --new-file v2.4.13/linux/drivers/sound/ite8172.c linux/drivers/sound/ite8172.c --- v2.4.13/linux/drivers/sound/ite8172.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/sound/ite8172.c Thu Oct 25 13:53:52 2001 @@ -1721,6 +1721,7 @@ MODULE_AUTHOR("Monta Vista Software, stevel@mvista.com"); MODULE_DESCRIPTION("IT8172 AudioPCI97 Driver"); +MODULE_LICENSE("GPL"); /* --------------------------------------------------------------------- */ diff -u --recursive --new-file v2.4.13/linux/drivers/sound/nec_vrc5477.c linux/drivers/sound/nec_vrc5477.c --- v2.4.13/linux/drivers/sound/nec_vrc5477.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/sound/nec_vrc5477.c Thu Oct 25 13:53:52 2001 @@ -1774,6 +1774,7 @@ MODULE_AUTHOR("Monta Vista Software, jsun@mvista.com or jsun@junsun.net"); MODULE_DESCRIPTION("NEC Vrc5477 audio (AC97) Driver"); +MODULE_LICENSE("GPL"); /* --------------------------------------------------------------------- */ extern void jsun_scan_pci_bus(void); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/rme96xx.c linux/drivers/sound/rme96xx.c --- v2.4.13/linux/drivers/sound/rme96xx.c Tue Oct 9 17:06:52 2001 +++ linux/drivers/sound/rme96xx.c Thu Oct 25 13:53:52 2001 @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include #include #include diff -u --recursive --new-file v2.4.13/linux/drivers/sound/sb_ess.c linux/drivers/sound/sb_ess.c --- v2.4.13/linux/drivers/sound/sb_ess.c Fri Feb 16 16:02:37 2001 +++ linux/drivers/sound/sb_ess.c Thu Oct 25 13:53:52 2001 @@ -352,7 +352,8 @@ *speedp = speed1; retval = 1; } else { - *divp = div2; + /* *divp = div2; */ + *divp = 0x80 | div2; *speedp = speed2; retval = 2; } @@ -376,10 +377,19 @@ /* * The 0x80 is important for the first audio channel */ - div = 0x80 | ess_calc_div (795500, 128, speedp, &diff); + if (devc->submodel == SUBMDL_ES1888) { + div = 0x80 | ess_calc_div (795500, 256, speedp, &diff); + } else { + div = 0x80 | ess_calc_div (795500, 128, speedp, &diff); + } } else if(devc->caps & SB_CAP_ES18XX_RATE) { - ess_calc_best_speed(ES18XX_CLOCK1, 128, ES18XX_CLOCK2, 256, + if (devc->submodel == SUBMDL_ES1888) { + ess_calc_best_speed(397700, 128, 795500, 256, &div, speedp); + } else { + ess_calc_best_speed(ES18XX_CLOCK1, 128, ES18XX_CLOCK2, 256, + &div, speedp); + } } else { if (*speedp > 22000) { div = 0x80 | ess_calc_div (ES1688_CLOCK1, 256, speedp, &diff); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/trident.c linux/drivers/sound/trident.c --- v2.4.13/linux/drivers/sound/trident.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/sound/trident.c Thu Oct 25 13:53:52 2001 @@ -4104,7 +4104,7 @@ if ((hwrpb->sys_type) == 201) { printk(KERN_INFO "trident: Running on Alpha system type Nautilus\n"); ac97_data = ali_ac97_get(card, 0, AC97_POWER_CONTROL); - ali_ac97_set(card, 0, AC97_POWER_CONTROL, ac97_data | + ali_ac97_set(card, 0, AC97_POWER_CONTROL, ac97_data | ALI_EAPD_POWER_DOWN); } } #endif diff -u --recursive --new-file v2.4.13/linux/drivers/sound/waveartist.c linux/drivers/sound/waveartist.c --- v2.4.13/linux/drivers/sound/waveartist.c Fri Apr 13 20:26:07 2001 +++ linux/drivers/sound/waveartist.c Thu Oct 25 13:53:52 2001 @@ -39,26 +39,22 @@ #include #include #include -#include #include +#include -#include -#include #include #include "sound_config.h" #include "waveartist.h" -#ifndef _ISA_DMA -#define _ISA_DMA(x) (x) -#endif -#ifndef _ISA_IRQ -#define _ISA_IRQ(x) (x) +#ifdef CONFIG_ARM +#include +#include #endif -#define POSSIBLE_RECORDING_DEVICES (SOUND_MASK_LINE |\ - SOUND_MASK_MIC |\ - SOUND_MASK_LINE1) +#ifndef NO_DMA +#define NO_DMA 255 +#endif #define SUPPORTED_MIXER_DEVICES (SOUND_MASK_SYNTH |\ SOUND_MASK_PCM |\ @@ -75,15 +71,15 @@ 0x0000, /* Treble */ 0x2323, /* Synth (FM) */ 0x4b4b, /* PCM */ - 0x0000, /* PC Speaker */ + 0x6464, /* PC Speaker */ 0x0000, /* Ext Line */ 0x0000, /* Mic */ 0x0000, /* CD */ - 0x0000, /* Recording monitor */ + 0x6464, /* Recording monitor */ 0x0000, /* SB PCM (ALT PCM) */ 0x0000, /* Recording level */ - 0x0000, /* Input gain */ - 0x0000, /* Output gain */ + 0x6464, /* Input gain */ + 0x6464, /* Output gain */ 0x0000, /* Line1 (Aux1) */ 0x0000, /* Line2 (Aux2) */ 0x0000, /* Line3 (Aux3) */ @@ -91,7 +87,7 @@ 0x0000, /* Digital2 */ 0x0000, /* Digital3 */ 0x0000, /* Phone In */ - 0x0000, /* Phone Out */ + 0x6464, /* Phone Out */ 0x0000, /* Video */ 0x0000, /* Radio */ 0x0000 /* Monitor */ @@ -110,10 +106,10 @@ int dev_no; /* Mixer parameters */ + const struct waveartist_mixer_info *mix; + unsigned short *levels; /* cache of volume settings */ int recmask; /* currently enabled recording device! */ - int supported_devices; /* SUPPORTED_MIXER_DEVICES */ - int rec_devices; /* POSSIBLE_RECORDING_DEVICES */ #ifdef CONFIG_ARCH_NETWINDER signed int slider_vol; /* hardware slider volume */ @@ -126,6 +122,21 @@ #endif } wavnc_info; +/* + * This is the implementation specific mixer information. + */ +struct waveartist_mixer_info { + unsigned int supported_devs; /* Supported devices */ + unsigned int recording_devs; /* Recordable devies */ + unsigned int stereo_devs; /* Stereo devices */ + + unsigned int (*select_input)(wavnc_info *, unsigned int, + unsigned char *, unsigned char *); + int (*decode_mixer)(wavnc_info *, int, + unsigned char, unsigned char); + int (*get_mixer)(wavnc_info *, int); +}; + typedef struct wavnc_port_info { int open_mode; int speed; @@ -137,14 +148,14 @@ static wavnc_info adev_info[MAX_AUDIO_DEV]; static spinlock_t waveartist_lock = SPIN_LOCK_UNLOCKED; -#ifndef machine_is_netwinder +#ifndef CONFIG_ARCH_NETWINDER #define machine_is_netwinder() 0 -#endif - +#else static struct timer_list vnc_timer; -static void vnc_configure_mixer(wavnc_info *devc); +static void vnc_configure_mixer(wavnc_info *devc, unsigned int input_mask); static int vnc_private_ioctl(int dev, unsigned int cmd, caddr_t arg); static void vnc_slider_tick(unsigned long data); +#endif static inline void waveartist_set_ctlr(struct address_info *hw, unsigned char clear, unsigned char set) @@ -176,7 +187,7 @@ unsigned int timeout = timeout_ms * 10 * HZ / 100; do { - current->state = TASK_INTERRUPTIBLE; + set_current_state(TASK_INTERRUPTIBLE); timeout = schedule_timeout(timeout); } while (timeout); @@ -804,21 +815,21 @@ } static struct audio_driver waveartist_audio_driver = { - owner: THIS_MODULE, - open: waveartist_open, - close: waveartist_close, - output_block: waveartist_output_block, - start_input: waveartist_start_input, - ioctl: waveartist_ioctl, + owner: THIS_MODULE, + open: waveartist_open, + close: waveartist_close, + output_block: waveartist_output_block, + start_input: waveartist_start_input, + ioctl: waveartist_ioctl, prepare_for_input: waveartist_prepare_for_input, prepare_for_output: waveartist_prepare_for_output, - halt_io: waveartist_halt, - halt_input: waveartist_halt_input, - halt_output: waveartist_halt_output, - trigger: waveartist_trigger, - set_speed: waveartist_set_speed, - set_bits: waveartist_set_bits, - set_channels: waveartist_set_channels + halt_io: waveartist_halt, + halt_input: waveartist_halt_input, + halt_output: waveartist_halt_output, + trigger: waveartist_trigger, + set_speed: waveartist_set_speed, + set_bits: waveartist_set_bits, + set_channels: waveartist_set_channels }; @@ -864,220 +875,338 @@ /* ------------------------------------------------------------------------- * Mixer stuff */ +struct mix_ent { + unsigned char reg_l; + unsigned char reg_r; + unsigned char shift; + unsigned char max; +}; + +static const struct mix_ent mix_devs[SOUND_MIXER_NRDEVICES] = { + { 2, 6, 1, 7 }, /* SOUND_MIXER_VOLUME */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_BASS */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_TREBLE */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_SYNTH */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_PCM */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_SPEAKER */ + { 0, 4, 6, 31 }, /* SOUND_MIXER_LINE */ + { 2, 6, 4, 3 }, /* SOUND_MIXER_MIC */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_CD */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_IMIX */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_ALTPCM */ +#if 0 + { 3, 7, 0, 10 }, /* SOUND_MIXER_RECLEV */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_IGAIN */ +#else + { 0, 0, 0, 0 }, /* SOUND_MIXER_RECLEV */ + { 3, 7, 0, 7 }, /* SOUND_MIXER_IGAIN */ +#endif + { 0, 0, 0, 0 }, /* SOUND_MIXER_OGAIN */ + { 0, 4, 1, 31 }, /* SOUND_MIXER_LINE1 */ + { 1, 5, 6, 31 }, /* SOUND_MIXER_LINE2 */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_LINE3 */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_DIGITAL1 */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_DIGITAL2 */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_DIGITAL3 */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_PHONEIN */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_PHONEOUT */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_VIDEO */ + { 0, 0, 0, 0 }, /* SOUND_MIXER_RADIO */ + { 0, 0, 0, 0 } /* SOUND_MIXER_MONITOR */ +}; + static void waveartist_mixer_update(wavnc_info *devc, int whichDev) { - unsigned int mask, reg_l, reg_r; unsigned int lev_left, lev_right; - unsigned int vals[3]; lev_left = devc->levels[whichDev] & 0xff; lev_right = devc->levels[whichDev] >> 8; + if (lev_left > 100) + lev_left = 100; + if (lev_right > 100) + lev_right = 100; + #define SCALE(lev,max) ((lev) * (max) / 100) if (machine_is_netwinder() && whichDev == SOUND_MIXER_PHONEOUT) whichDev = SOUND_MIXER_VOLUME; - switch(whichDev) { - case SOUND_MIXER_VOLUME: - mask = 0x000e; - reg_l = 0x200; - reg_r = 0x600; - lev_left = SCALE(lev_left, 7) << 1; - lev_right = SCALE(lev_right, 7) << 1; - break; + if (mix_devs[whichDev].reg_l || mix_devs[whichDev].reg_r) { + const struct mix_ent *mix = mix_devs + whichDev; + unsigned int mask, left, right; + + mask = mix->max << mix->shift; + lev_left = SCALE(lev_left, mix->max) << mix->shift; + lev_right = SCALE(lev_right, mix->max) << mix->shift; + + /* read left setting */ + left = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | + mix->reg_l << 8); + + /* read right setting */ + right = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | + mix->reg_r << 8); + + left = (left & ~mask) | (lev_left & mask); + right = (right & ~mask) | (lev_right & mask); + + /* write left,right back */ + waveartist_cmd3(devc, WACMD_SET_MIXER, left, right); + } else { + switch(whichDev) { + case SOUND_MIXER_PCM: + waveartist_cmd3(devc, WACMD_SET_LEVEL, + SCALE(lev_left, 32767), + SCALE(lev_right, 32767)); + break; - case SOUND_MIXER_LINE: - if ((devc->recmask & SOUND_MASK_LINE) == 0) - return; - mask = 0x07c0; - reg_l = 0x000; - reg_r = 0x400; - lev_left = SCALE(lev_left, 31) << 6; - lev_right = SCALE(lev_right, 31) << 6; - break; + case SOUND_MIXER_SYNTH: + waveartist_cmd3(devc, 0x0100 | WACMD_SET_LEVEL, + SCALE(lev_left, 32767), + SCALE(lev_right, 32767)); + break; + } + } +} - case SOUND_MIXER_MIC: - if ((devc->recmask & SOUND_MASK_MIC) == 0) - return; - mask = 0x0030; - reg_l = 0x200; - reg_r = 0x600; - lev_left = SCALE(lev_left, 3) << 4; - lev_right = SCALE(lev_right, 3) << 4; - break; +/* + * Set the ADC MUX to the specified values. We do NOT do any + * checking of the values passed, since we assume that the + * relevant *_select_input function has done that for us. + */ +static void +waveartist_set_adc_mux(wavnc_info *devc, char left_dev, char right_dev) +{ + unsigned int reg_08, reg_09; - case SOUND_MIXER_RECLEV: - mask = 0x000f; - reg_l = 0x300; - reg_r = 0x700; - lev_left = SCALE(lev_left, 10); - lev_right = SCALE(lev_right, 10); - break; + reg_08 = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | 0x0800); + reg_09 = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | 0x0900); - case SOUND_MIXER_LINE1: - if ((devc->recmask & SOUND_MASK_LINE1) == 0) - return; - mask = 0x003e; - reg_l = 0x000; - reg_r = 0x400; - lev_left = SCALE(lev_left, 31) << 1; - lev_right = SCALE(lev_right, 31) << 1; - break; + reg_08 = (reg_08 & ~0x3f) | right_dev << 3 | left_dev; - case SOUND_MIXER_PCM: - waveartist_cmd3(devc, WACMD_SET_LEVEL, - SCALE(lev_left, 32767), - SCALE(lev_right, 32767)); - return; + waveartist_cmd3(devc, WACMD_SET_MIXER, reg_08, reg_09); +} - case SOUND_MIXER_SYNTH: - waveartist_cmd3(devc, 0x0100 | WACMD_SET_LEVEL, - SCALE(lev_left, 32767), - SCALE(lev_right, 32767)); - return; +/* + * Decode a recording mask into a mixer selection as follows: + * + * OSS Source WA Source Actual source + * SOUND_MASK_IMIX Mixer Mixer output (same as AD1848) + * SOUND_MASK_LINE Line Line in + * SOUND_MASK_LINE1 Aux 1 Aux 1 in + * SOUND_MASK_LINE2 Aux 2 Aux 2 in + * SOUND_MASK_MIC Mic Microphone + */ +static unsigned int +waveartist_select_input(wavnc_info *devc, unsigned int recmask, + unsigned char *dev_l, unsigned char *dev_r) +{ + unsigned int recdev = ADC_MUX_NONE; - default: - return; + if (recmask & SOUND_MASK_IMIX) { + recmask = SOUND_MASK_IMIX; + recdev = ADC_MUX_MIXER; + } else if (recmask & SOUND_MASK_LINE2) { + recmask = SOUND_MASK_LINE2; + recdev = ADC_MUX_AUX2; + } else if (recmask & SOUND_MASK_LINE1) { + recmask = SOUND_MASK_LINE1; + recdev = ADC_MUX_AUX1; + } else if (recmask & SOUND_MASK_LINE) { + recmask = SOUND_MASK_LINE; + recdev = ADC_MUX_LINE; + } else if (recmask & SOUND_MASK_MIC) { + recmask = SOUND_MASK_MIC; + recdev = ADC_MUX_MIC; } - /* read left setting */ - vals[0] = reg_l + WACMD_GET_LEVEL; - waveartist_cmd(devc, 1, vals, 1, vals + 1); + *dev_l = *dev_r = recdev; + + return recmask; +} + +static int +waveartist_decode_mixer(wavnc_info *devc, int dev, unsigned char lev_l, + unsigned char lev_r) +{ + switch (dev) { + case SOUND_MIXER_VOLUME: + case SOUND_MIXER_SYNTH: + case SOUND_MIXER_PCM: + case SOUND_MIXER_LINE: + case SOUND_MIXER_MIC: + case SOUND_MIXER_IGAIN: + case SOUND_MIXER_LINE1: + case SOUND_MIXER_LINE2: + devc->levels[dev] = lev_l | lev_r << 8; + break; + + case SOUND_MIXER_IMIX: + break; - /* read right setting */ - vals[0] = reg_r + 0x30; - waveartist_cmd(devc, 1, vals, 1, vals + 2); + default: + dev = -EINVAL; + break; + } - vals[1] = (vals[1] & ~mask) | (lev_left & mask); - vals[2] = (vals[2] & ~mask) | (lev_right & mask); + return dev; +} - /* write left,right back */ - vals[0] = WACMD_SET_MIXER; - waveartist_cmd(devc, 3, vals, 0, NULL); +static int waveartist_get_mixer(wavnc_info *devc, int dev) +{ + return devc->levels[dev]; } +static const struct waveartist_mixer_info waveartist_mixer = { + supported_devs: SUPPORTED_MIXER_DEVICES | SOUND_MASK_IGAIN, + recording_devs: SOUND_MASK_LINE | SOUND_MASK_MIC | + SOUND_MASK_LINE1 | SOUND_MASK_LINE2 | + SOUND_MASK_IMIX, + stereo_devs: (SUPPORTED_MIXER_DEVICES | SOUND_MASK_IGAIN) & ~ + (SOUND_MASK_SPEAKER | SOUND_MASK_IMIX), + select_input: waveartist_select_input, + decode_mixer: waveartist_decode_mixer, + get_mixer: waveartist_get_mixer, +}; + static void -waveartist_select_input(wavnc_info *devc, unsigned int input) +waveartist_set_recmask(wavnc_info *devc, unsigned int recmask) { - unsigned int vals[3]; + unsigned char dev_l, dev_r; - /* - * Get reg 9 - */ - vals[0] = 0x0830; - waveartist_cmd(devc, 1, vals, 1, vals + 1); + recmask &= devc->mix->recording_devs; /* - * Get reg 10, only so that we can write it back. + * If more than one recording device selected, + * disable the device that is currently in use. */ - vals[0] = 0x0930; - waveartist_cmd(devc, 1, vals, 1, vals + 2); - - if (debug_flg & DEBUG_MIXER) - printk("RECSRC: old left: 0x%04X, old right: 0x%04X.\n", - vals[1] & 0x07, (vals[1] >> 3) & 0x07); + if (hweight32(recmask) > 1) + recmask &= ~devc->recmask; /* - * kill current left/right mux input select + * Translate the recording device mask into + * the ADC multiplexer settings. */ - vals[1] &= ~0x03F; + devc->recmask = devc->mix->select_input(devc, recmask, + &dev_l, &dev_r); - switch (input) { - case SOUND_MASK_MIC: - /* - * right=mic, left=mic - */ - vals[1] |= 0x002D; - break; - - case SOUND_MASK_LINE1: - /* - * right=none, left=Aux1; - */ - vals[1] |= 0x0004; - break; + waveartist_set_adc_mux(devc, dev_l, dev_r); +} - case SOUND_MASK_LINE: - /* - * right=Line, left=Line; - */ - vals[1] |= 0x0012; - break; - } +static int +waveartist_set_mixer(wavnc_info *devc, int dev, unsigned int level) +{ + unsigned int lev_left = level & 0x00ff; + unsigned int lev_right = (level & 0xff00) >> 8; - if (debug_flg & DEBUG_MIXER) - printk("RECSRC %d: left=0x%04X, right=0x%04X.\n", input, - vals[1] & 0x07, (vals[1] >> 3) & 0x07); + if (lev_left > 100) + lev_left = 100; + if (lev_right > 100) + lev_right = 100; /* - * and finally - write the reg pair back.... + * Mono devices have their right volume forced to their + * left volume. (from ALSA driver OSS emulation). */ - vals[0] = WACMD_SET_MIXER; + if (!(devc->mix->stereo_devs & (1 << dev))) + lev_right = lev_left; - waveartist_cmd(devc, 3, vals, 0, NULL); + dev = devc->mix->decode_mixer(devc, dev, lev_left, lev_right); + + if (dev >= 0) + waveartist_mixer_update(devc, dev); + + return dev < 0 ? dev : 0; } static int -waveartist_mixer_set(wavnc_info *devc, int whichDev, unsigned int level) +waveartist_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) { - unsigned int lev_left = level & 0x007f; - unsigned int lev_right = (level & 0x7f00) >> 8; - int left, right, devmask; - - left = level & 0x7f; - right = (level & 0x7f00) >> 8; - - if (debug_flg & DEBUG_MIXER) - printk("wa_mixer_set(dev=%d, level=%X)\n", - whichDev, level); - - switch (whichDev) { - case SOUND_MIXER_VOLUME: /* master volume (0-7) */ - case SOUND_MIXER_LINE: /* external line (0-31) */ - case SOUND_MIXER_MIC: /* mono mic (0-3) */ - case SOUND_MIXER_RECLEV: /* recording level (0-7) */ - case SOUND_MIXER_LINE1: /* mono external aux1 (0-31) */ - case SOUND_MIXER_PCM: /* Waveartist PCM (0-32767) */ - case SOUND_MIXER_SYNTH: /* internal synth (0-31) */ - case SOUND_MIXER_IMIX: /* recording feedback */ - devc->levels[whichDev] = lev_left | lev_right << 8; - waveartist_mixer_update(devc, whichDev); - break; + wavnc_info *devc = (wavnc_info *)audio_devs[dev]->devc; + int ret = 0, val, nr; - /* Select recording input source + /* + * All SOUND_MIXER_* ioctls use type 'M' */ - case SOUND_MIXER_RECSRC: - devmask = level & devc->rec_devices; + if (((cmd >> 8) & 255) != 'M') + return -ENOIOCTLCMD; #ifdef CONFIG_ARCH_NETWINDER - if (machine_is_netwinder()) - vnc_configure_mixer(devc); + if (machine_is_netwinder()) { + ret = vnc_private_ioctl(dev, cmd, arg); + if (ret != -ENOIOCTLCMD) + return ret; else + ret = 0; + } #endif - { - waveartist_select_input(devc, level); - /* - * if record monitoring is on, make sure the bit is set - */ - if (devc->levels[SOUND_MIXER_IMIX]) - waveartist_mixer_update(devc, SOUND_MIXER_IMIX); + nr = cmd & 0xff; + + if (_SIOC_DIR(cmd) & _SIOC_WRITE) { + if (get_user(val, (int *)arg)) + return -EFAULT; + + switch (nr) { + case SOUND_MIXER_RECSRC: + waveartist_set_recmask(devc, val); + break; + + default: + ret = -EINVAL; + if (nr < SOUND_MIXER_NRDEVICES && + devc->mix->supported_devs & (1 << nr)) + ret = waveartist_set_mixer(devc, nr, val); } + } - /* - * do not save in "levels", return current setting - */ - return devc->recmask; + if (ret == 0 && _SIOC_DIR(cmd) & _SIOC_READ) { + ret = -EINVAL; - default: - return -EINVAL; + switch (nr) { + case SOUND_MIXER_RECSRC: + ret = devc->recmask; + break; + + case SOUND_MIXER_DEVMASK: + ret = devc->mix->supported_devs; + break; + + case SOUND_MIXER_STEREODEVS: + ret = devc->mix->stereo_devs; + break; + + case SOUND_MIXER_RECMASK: + ret = devc->mix->recording_devs; + break; + + case SOUND_MIXER_CAPS: + ret = SOUND_CAP_EXCL_INPUT; + break; + + default: + if (nr < SOUND_MIXER_NRDEVICES) + ret = devc->mix->get_mixer(devc, nr); + break; + } + + if (ret >= 0) + ret = put_user(ret, (int *)arg) ? -EFAULT : 0; } - return devc->levels[whichDev]; + return ret; } +static struct mixer_operations waveartist_mixer_operations = +{ + owner: THIS_MODULE, + id: "WaveArtist", + name: "WaveArtist", + ioctl: waveartist_mixer_ioctl +}; + static void waveartist_mixer_reset(wavnc_info *devc) { @@ -1098,7 +1227,7 @@ waveartist_cmd3(devc, WACMD_SET_MIXER, 0x9800, 0xa836); /* - * set mixer input select to none, RX filter gains 0 db + * set mixer input select to none, RX filter gains 0 dB */ waveartist_cmd3(devc, WACMD_SET_MIXER, 0x4c00, 0x8c00); @@ -1110,90 +1239,12 @@ /* set default input device = internal mic * current recording device = none */ - devc->recmask = 0; + waveartist_set_recmask(devc, 0); for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) waveartist_mixer_update(devc, i); - - devc->supported_devices = SUPPORTED_MIXER_DEVICES; - devc->rec_devices = POSSIBLE_RECORDING_DEVICES; - - if (machine_is_netwinder()) { - devc->supported_devices |= SOUND_MASK_PHONEIN | SOUND_MASK_PHONEOUT; - devc->rec_devices |= SOUND_MASK_PHONEIN; - } } -static int -waveartist_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) -{ - wavnc_info *devc = (wavnc_info *)audio_devs[dev]->devc; - int ret; - -#ifdef CONFIG_ARCH_NETWINDER - if (machine_is_netwinder()) { - ret = vnc_private_ioctl(dev, cmd, arg); - if (ret != -ENOIOCTLCMD) - return ret; - } -#endif - - if (((cmd >> 8) & 0xff) == 'M') { - if (_SIOC_DIR(cmd) & _SIOC_WRITE) { - int val; - - if (get_user(val, (int *)arg)) - return -EFAULT; - - return waveartist_mixer_set(devc, cmd & 0xff, val); - } else { - /* - * Return parameters - */ - switch (cmd & 0xff) { - case SOUND_MIXER_RECSRC: - ret = devc->recmask; - break; - - case SOUND_MIXER_DEVMASK: - ret = devc->supported_devices; - break; - - case SOUND_MIXER_STEREODEVS: - ret = devc->supported_devices & - ~(SOUND_MASK_SPEAKER|SOUND_MASK_IMIX); - break; - - case SOUND_MIXER_RECMASK: - ret = devc->rec_devices; - break; - - case SOUND_MIXER_CAPS: - ret = SOUND_CAP_EXCL_INPUT; - break; - - default: - if ((cmd & 0xff) < SOUND_MIXER_NRDEVICES) - ret = devc->levels[cmd & 0xff]; - else - return -EINVAL; - } - - return put_user(ret, (int *)arg) ? -EFAULT : 0; - } - } - - return -ENOIOCTLCMD; -} - -static struct mixer_operations waveartist_mixer_operations = -{ - owner: THIS_MODULE, - id: "WaveArtist", - name: "WaveArtist NetWinder", - ioctl: waveartist_mixer_ioctl -}; - static int __init waveartist_init(wavnc_info *devc) { wavnc_port_info *portc; @@ -1297,13 +1348,13 @@ return 0; } - if (hw_config->irq > _ISA_IRQ(15) || hw_config->irq < _ISA_IRQ(0)) { + if (hw_config->irq > 15 || hw_config->irq < 0) { printk(KERN_WARNING "WaveArtist: Bad IRQ %d\n", hw_config->irq); return 0; } - if (hw_config->dma != _ISA_DMA(3)) { + if (hw_config->dma != 3) { printk(KERN_WARNING "WaveArtist: Bad DMA %d\n", hw_config->dma); return 0; @@ -1317,7 +1368,8 @@ return 1; } -static void __init attach_waveartist(struct address_info *hw) +static void __init +attach_waveartist(struct address_info *hw, const struct waveartist_mixer_info *mix) { wavnc_info *devc = &adev_info[nr_waveartist_devs]; @@ -1339,6 +1391,7 @@ request_region(hw->io_base, 15, devc->hw.name); + devc->mix = mix; devc->dev_no = waveartist_init(devc); if (devc->dev_no < 0) @@ -1352,7 +1405,9 @@ vnc_timer.data = nr_waveartist_devs; add_timer(&vnc_timer); - vnc_configure_mixer(devc); + vnc_configure_mixer(devc, 0); + + devc->no_autoselect = 1; } #endif nr_waveartist_devs += 1; @@ -1408,10 +1463,14 @@ "to unload\n"); } +#ifdef CONFIG_ARCH_NETWINDER + /* * Rebel.com Netwinder specifics... */ +#include + #define VNC_TIMER_PERIOD (HZ/4) //check slider 4 times/sec #define MIXER_PRIVATE3_RESET 0x53570000 @@ -1427,7 +1486,7 @@ extern spinlock_t gpio_lock; static inline void -vnc_update_spkr_mute(wavnc_info *devc) +vnc_mute_spkr(wavnc_info *devc) { unsigned long flags; @@ -1437,8 +1496,22 @@ } static void -vnc_mute_lout(wavnc_info *devc, int mute) +vnc_mute_lout(wavnc_info *devc) { + unsigned int left, right; + + left = waveartist_cmd1_r(devc, WACMD_GET_LEVEL); + right = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | 0x400); + + if (devc->line_mute_state) { + left &= ~1; + right &= ~1; + } else { + left |= 1; + right |= 1; + } + waveartist_cmd3(devc, WACMD_SET_MIXER, left, right); + } static int @@ -1491,67 +1564,177 @@ return old_slider_volume; } -static void -vnc_configure_mixer(wavnc_info *devc) +/* + * Decode a recording mask into a mixer selection on the NetWinder + * as follows: + * + * OSS Source WA Source Actual source + * SOUND_MASK_IMIX Mixer Mixer output (same as AD1848) + * SOUND_MASK_LINE Line Line in + * SOUND_MASK_LINE1 Left Mic Handset + * SOUND_MASK_PHONEIN Left Aux Telephone microphone + * SOUND_MASK_MIC Right Mic Builtin microphone + */ +static unsigned int +netwinder_select_input(wavnc_info *devc, unsigned int recmask, + unsigned char *dev_l, unsigned char *dev_r) { - u_int vals[3]; + unsigned int recdev_l = ADC_MUX_NONE, recdev_r = ADC_MUX_NONE; - if (!devc->no_autoselect) { - if (devc->handset_detect) { - devc->recmask = SOUND_MASK_LINE1; - devc->spkr_mute_state = devc->line_mute_state = 1; - } else if (devc->telephone_detect) { - devc->recmask = SOUND_MASK_PHONEIN; - devc->spkr_mute_state = devc->line_mute_state = 1; - } else { - /* unless someone has asked for LINE-IN, - * we default to MIC - */ - if ((devc->recmask & SOUND_MASK_LINE) == 0) - devc->recmask = SOUND_MASK_MIC; - devc->spkr_mute_state = devc->line_mute_state = 0; - } - vnc_update_spkr_mute(devc); - vnc_mute_lout(devc, devc->spkr_mute_state); + if (recmask & SOUND_MASK_IMIX) { + recmask = SOUND_MASK_IMIX; + recdev_l = ADC_MUX_MIXER; + recdev_r = ADC_MUX_MIXER; + } else if (recmask & SOUND_MASK_LINE) { + recmask = SOUND_MASK_LINE; + recdev_l = ADC_MUX_LINE; + recdev_r = ADC_MUX_LINE; + } else if (recmask & SOUND_MASK_LINE1) { + recmask = SOUND_MASK_LINE1; + waveartist_cmd1(devc, WACMD_SET_MONO); /* left */ + recdev_l = ADC_MUX_MIC; + recdev_r = ADC_MUX_NONE; + } else if (recmask & SOUND_MASK_PHONEIN) { + recmask = SOUND_MASK_PHONEIN; + waveartist_cmd1(devc, WACMD_SET_MONO); /* left */ + recdev_l = ADC_MUX_AUX1; + recdev_r = ADC_MUX_NONE; + } else if (recmask & SOUND_MASK_MIC) { + recmask = SOUND_MASK_MIC; + waveartist_cmd1(devc, WACMD_SET_MONO | 0x100); /* right */ + recdev_l = ADC_MUX_NONE; + recdev_r = ADC_MUX_MIC; } - /* Ok. At this point, we have done the autoswitch logic, or we - * have had a command from an ioctl. We have a valid devc->recmask. - * Now we have to connect up the hardware to reflect the recmask. - */ - vals[1] = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | 0x800); - vals[2] = waveartist_cmd1_r(devc, WACMD_GET_LEVEL | 0x900); + *dev_l = recdev_l; + *dev_r = recdev_r; - vals[1] &= ~0x3f; + return recmask; +} - switch(devc->recmask) { - case SOUND_MASK_MIC: /* builtin mic */ - waveartist_cmd1(devc, WACMD_SET_MONO | 0x100); /* right */ - vals[1] |= 0x28; +static int +netwinder_decode_mixer(wavnc_info *devc, int dev, unsigned char lev_l, + unsigned char lev_r) +{ + switch (dev) { + case SOUND_MIXER_VOLUME: + case SOUND_MIXER_SYNTH: + case SOUND_MIXER_PCM: + case SOUND_MIXER_LINE: + case SOUND_MIXER_IGAIN: + devc->levels[dev] = lev_l | lev_r << 8; break; - case SOUND_MASK_LINE1: /* out handset */ - waveartist_cmd1(devc, WACMD_SET_MONO); /* left */ - vals[1] |= 0x05; + case SOUND_MIXER_MIC: /* right mic only */ + devc->levels[SOUND_MIXER_MIC] &= 0xff; + devc->levels[SOUND_MIXER_MIC] |= lev_l << 8; break; - case SOUND_MASK_PHONEIN: /* our telephone mic */ - waveartist_cmd1(devc, WACMD_SET_MONO); /* left */ - vals[1] |= 0x04; + case SOUND_MIXER_LINE1: /* left mic only */ + devc->levels[SOUND_MIXER_MIC] &= 0xff00; + devc->levels[SOUND_MIXER_MIC] |= lev_l; + dev = SOUND_MIXER_MIC; break; - case SOUND_MASK_LINE: /* stereo line in */ - vals[1] |= 12; + case SOUND_MIXER_PHONEIN: /* left aux only */ + devc->levels[SOUND_MIXER_LINE1] = lev_l; + dev = SOUND_MIXER_LINE1; + break; + + case SOUND_MIXER_IMIX: + case SOUND_MIXER_PHONEOUT: break; default: - return; + dev = -EINVAL; + break; } + return dev; +} + +static int netwinder_get_mixer(wavnc_info *devc, int dev) +{ + int levels; + + switch (dev) { + case SOUND_MIXER_VOLUME: + case SOUND_MIXER_SYNTH: + case SOUND_MIXER_PCM: + case SOUND_MIXER_LINE: + case SOUND_MIXER_IGAIN: + levels = devc->levels[dev]; + break; + + case SOUND_MIXER_MIC: /* builtin mic: right mic only */ + levels = devc->levels[SOUND_MIXER_MIC] >> 8; + levels |= levels << 8; + break; - vals[0] = WACMD_SET_MIXER; - waveartist_cmd(devc, 3, vals, 0, NULL); + case SOUND_MIXER_LINE1: /* handset mic: left mic only */ + levels = devc->levels[SOUND_MIXER_MIC] & 0xff; + levels |= levels << 8; + break; + + case SOUND_MIXER_PHONEIN: /* phone mic: left aux1 only */ + levels = devc->levels[SOUND_MIXER_LINE1] & 0xff; + levels |= levels << 8; + break; - waveartist_mixer_update(devc, SOUND_MIXER_IMIX); + default: + levels = 0; + } + + return levels; +} + +/* + * Waveartist specific mixer information. + */ +static const struct waveartist_mixer_info netwinder_mixer = { + supported_devs: SOUND_MASK_VOLUME | SOUND_MASK_SYNTH | + SOUND_MASK_PCM | SOUND_MASK_SPEAKER | + SOUND_MASK_LINE | SOUND_MASK_MIC | + SOUND_MASK_IMIX | SOUND_MASK_LINE1 | + SOUND_MASK_PHONEIN | SOUND_MASK_PHONEOUT| + SOUND_MASK_IGAIN, + + recording_devs: SOUND_MASK_LINE | SOUND_MASK_MIC | + SOUND_MASK_IMIX | SOUND_MASK_LINE1 | + SOUND_MASK_PHONEIN, + + stereo_devs: SOUND_MASK_VOLUME | SOUND_MASK_SYNTH | + SOUND_MASK_PCM | SOUND_MASK_LINE | + SOUND_MASK_IMIX | SOUND_MASK_IGAIN, + + select_input: netwinder_select_input, + decode_mixer: netwinder_decode_mixer, + get_mixer: netwinder_get_mixer, +}; + +static void +vnc_configure_mixer(wavnc_info *devc, unsigned int recmask) +{ + if (!devc->no_autoselect) { + if (devc->handset_detect) { + recmask = SOUND_MASK_LINE1; + devc->spkr_mute_state = devc->line_mute_state = 1; + } else if (devc->telephone_detect) { + recmask = SOUND_MASK_PHONEIN; + devc->spkr_mute_state = devc->line_mute_state = 1; + } else { + /* unless someone has asked for LINE-IN, + * we default to MIC + */ + if ((devc->recmask & SOUND_MASK_LINE) == 0) + devc->recmask = SOUND_MASK_MIC; + devc->spkr_mute_state = devc->line_mute_state = 0; + } + vnc_mute_spkr(devc); + vnc_mute_lout(devc); + + if (recmask != devc->recmask) + waveartist_set_recmask(devc, recmask); + } } static int @@ -1562,10 +1745,10 @@ /* * read the "buttons" state. - * Bit 4 = handset present, - * Bit 5 = offhook + * Bit 4 = 0 means handset present + * Bit 5 = 1 means phone offhook */ - temp = inb(0x201) & 0x30; + temp = inb(0x201); old_hs = devc->handset_detect; old_td = devc->telephone_detect; @@ -1576,7 +1759,7 @@ if (!devc->no_autoselect && (old_hs != devc->handset_detect || old_td != devc->telephone_detect)) - vnc_configure_mixer(devc); + vnc_configure_mixer(devc, devc->recmask); slider_volume = vnc_volume_slider(devc); @@ -1596,7 +1779,7 @@ if (slider_volume != temp && devc->use_slider) { devc->slider_vol = slider_volume; - waveartist_mixer_set(devc, SOUND_MIXER_VOLUME, + waveartist_set_mixer(devc, SOUND_MIXER_VOLUME, slider_volume | slider_volume << 8); return 1; @@ -1648,13 +1831,13 @@ devc->line_mute_state = (val & VNC_MUTE_LINE_OUT) ? 1 : 0; if (prev_spkr_mute != devc->spkr_mute_state) - vnc_update_spkr_mute(devc); + vnc_mute_spkr(devc); if (prev_line_mute != devc->line_mute_state) - vnc_mute_lout(devc, devc->line_mute_state); + vnc_mute_lout(devc); if (prev_auto_state != devc->no_autoselect) - vnc_configure_mixer(devc); + vnc_configure_mixer(devc, devc->recmask); return 0; } @@ -1735,32 +1918,40 @@ return put_user(val, (int *)arg) ? -EFAULT : 0; } - if (((cmd >> 8) & 0xff) == 'M') { - if (_SIOC_DIR(cmd) & _SIOC_WRITE) { - /* - * special case for master volume: if we - * received this call - switch from hw - * volume control to a software volume - * control, till the hw volume is modified - * to signal that user wants to be back in - * hardware... - */ - if ((cmd & 0xff) == SOUND_MIXER_VOLUME) - devc->use_slider = 0; - } else if ((cmd & 0xff) == SOUND_MIXER_STEREODEVS) { - val = devc->supported_devices & - ~(SOUND_MASK_IMIX | - SOUND_MASK_MIC | - SOUND_MASK_LINE1 | - SOUND_MASK_PHONEIN | - SOUND_MASK_PHONEOUT); - return put_user(val, (int *)arg) ? -EFAULT : 0; + if (_SIOC_DIR(cmd) & _SIOC_WRITE) { + /* + * special case for master volume: if we + * received this call - switch from hw + * volume control to a software volume + * control, till the hw volume is modified + * to signal that user wants to be back in + * hardware... + */ + if ((cmd & 0xff) == SOUND_MIXER_VOLUME) + devc->use_slider = 0; + + /* speaker output */ + if ((cmd & 0xff) == SOUND_MIXER_SPEAKER) { + unsigned int val, l, r; + + if (get_user(val, (int *)arg)) + return -EFAULT; + + l = val & 0x7f; + r = (val & 0x7f00) >> 8; + val = (l + r) / 2; + devc->levels[SOUND_MIXER_SPEAKER] = val | (val << 8); + devc->spkr_mute_state = (val <= 50); + vnc_mute_spkr(devc); + return 0; } } return -ENOIOCTLCMD; } +#endif + static struct address_info cfg; static int attached; @@ -1771,13 +1962,10 @@ static int __initdata dma2 = 0; -MODULE_PARM(io, "i"); /* IO base */ -MODULE_PARM(irq, "i"); /* IRQ */ -MODULE_PARM(dma, "i"); /* DMA */ -MODULE_PARM(dma2, "i"); /* DMA2 */ - static int __init init_waveartist(void) { + const struct waveartist_mixer_info *mix; + if (!io && machine_is_netwinder()) { /* * The NetWinder WaveArtist is at a fixed address. @@ -1790,6 +1978,12 @@ dma2 = 7; } + mix = &waveartist_mixer; +#ifdef CONFIG_ARCH_NETWINDER + if (machine_is_netwinder()) + mix = &netwinder_mixer; +#endif + cfg.io_base = io; cfg.irq = irq; cfg.dma = dma; @@ -1798,7 +1992,7 @@ if (!probe_waveartist(&cfg)) return -ENODEV; - attach_waveartist(&cfg); + attach_waveartist(&cfg, mix); attached = 1; return 0; @@ -1830,3 +2024,10 @@ } __setup("waveartist=", setup_waveartist); #endif + +MODULE_DESCRIPTION("Rockwell WaveArtist RWA-010 sound driver"); +MODULE_PARM(io, "i"); /* IO base */ +MODULE_PARM(irq, "i"); /* IRQ */ +MODULE_PARM(dma, "i"); /* DMA */ +MODULE_PARM(dma2, "i"); /* DMA2 */ +MODULE_LICENSE("GPL"); diff -u --recursive --new-file v2.4.13/linux/drivers/sound/waveartist.h linux/drivers/sound/waveartist.h --- v2.4.13/linux/drivers/sound/waveartist.h Thu Oct 21 13:38:12 1999 +++ linux/drivers/sound/waveartist.h Thu Oct 25 13:53:52 2001 @@ -66,5 +66,27 @@ #define WACMD_RST_MIXER 0x33 #define WACMD_SET_MONO 0x34 +/* + * Definitions for left/right recording input mux + */ +#define ADC_MUX_NONE 0 +#define ADC_MUX_MIXER 1 +#define ADC_MUX_LINE 2 +#define ADC_MUX_AUX2 3 +#define ADC_MUX_AUX1 4 +#define ADC_MUX_MIC 5 + +/* + * Definitions for mixer gain settings + */ +#define MIX_GAIN_LINE 0 /* line in */ +#define MIX_GAIN_AUX1 1 /* aux1 */ +#define MIX_GAIN_AUX2 2 /* aux2 */ +#define MIX_GAIN_XMIC 3 /* crossover mic */ +#define MIX_GAIN_MIC 4 /* normal mic */ +#define MIX_GAIN_PREMIC 5 /* preamp mic */ +#define MIX_GAIN_OUT 6 /* output */ +#define MIX_GAIN_MONO 7 /* mono in */ + int wa_sendcmd(unsigned int cmd); int wa_writecmd(unsigned int cmd, unsigned int arg); diff -u --recursive --new-file v2.4.13/linux/drivers/telephony/ixj.c linux/drivers/telephony/ixj.c --- v2.4.13/linux/drivers/telephony/ixj.c Sun Sep 23 11:41:00 2001 +++ linux/drivers/telephony/ixj.c Thu Oct 25 13:53:52 2001 @@ -387,7 +387,7 @@ #ifdef PERFMON_STATS #define ixj_perfmon(x) ((x)++) #else -#deifne ixj_perfmon(x) do {} while(0); +#define ixj_perfmon(x) do {} while(0); #endif static int ixj_convert_loaded; diff -u --recursive --new-file v2.4.13/linux/drivers/usb/usb-ohci.h linux/drivers/usb/usb-ohci.h --- v2.4.13/linux/drivers/usb/usb-ohci.h Mon Aug 27 12:41:45 2001 +++ linux/drivers/usb/usb-ohci.h Wed Oct 24 08:26:12 2001 @@ -373,7 +373,7 @@ typedef struct ohci { struct ohci_hcca *hcca; /* hcca */ - u32 hcca_dma; + dma_addr_t hcca_dma; int irq; int disabled; /* e.g. got a UE, we're hung */ diff -u --recursive --new-file v2.4.13/linux/drivers/usb/usb-uhci-debug.h linux/drivers/usb/usb-uhci-debug.h --- v2.4.13/linux/drivers/usb/usb-uhci-debug.h Wed May 16 10:31:27 2001 +++ linux/drivers/usb/usb-uhci-debug.h Tue Oct 30 15:08:12 2001 @@ -5,7 +5,7 @@ dbg("qh has not QH_TYPE"); return; } - dbg("QH @ %p/%08X:", qh, qh->dma_addr); + dbg("QH @ %p/%08llX:", qh, (unsigned long long)qh->dma_addr); if (qh->hw.qh.head & UHCI_PTR_TERM) dbg(" Head Terminate"); diff -u --recursive --new-file v2.4.13/linux/drivers/video/Makefile linux/drivers/video/Makefile --- v2.4.13/linux/drivers/video/Makefile Sun Sep 23 11:41:00 2001 +++ linux/drivers/video/Makefile Thu Oct 25 13:53:52 2001 @@ -15,7 +15,7 @@ fbcon-iplan2p8.o fbcon-vga-planes.o fbcon-cfb16.o \ fbcon-cfb2.o fbcon-cfb24.o fbcon-cfb32.o fbcon-cfb4.o \ fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o \ - cyber2000fb.o fbcon-hga.o + cyber2000fb.o sa1100fb.o fbcon-hga.o # Each configuration option enables a list of files. diff -u --recursive --new-file v2.4.13/linux/drivers/video/aty/atyfb_base.c linux/drivers/video/aty/atyfb_base.c --- v2.4.13/linux/drivers/video/aty/atyfb_base.c Tue Oct 23 22:48:52 2001 +++ linux/drivers/video/aty/atyfb_base.c Tue Oct 30 15:08:11 2001 @@ -2521,7 +2521,7 @@ if (!options || !*options) return 0; - while (this_opt = strsep(&options, ",")) { + while ((this_opt = strsep(&options, ",")) != NULL) { if (!strncmp(this_opt, "font:", 5)) { char *p; int i; diff -u --recursive --new-file v2.4.13/linux/drivers/video/aty/mach64_cursor.c linux/drivers/video/aty/mach64_cursor.c --- v2.4.13/linux/drivers/video/aty/mach64_cursor.c Sun Aug 12 13:28:00 2001 +++ linux/drivers/video/aty/mach64_cursor.c Thu Oct 25 13:53:52 2001 @@ -3,7 +3,7 @@ * ATI Mach64 CT/VT/GT/LT Cursor Support */ -#include +#include #include #include #include diff -u --recursive --new-file v2.4.13/linux/drivers/video/clgenfb.c linux/drivers/video/clgenfb.c --- v2.4.13/linux/drivers/video/clgenfb.c Tue Oct 9 17:06:53 2001 +++ linux/drivers/video/clgenfb.c Thu Oct 25 13:53:52 2001 @@ -56,6 +56,12 @@ #ifdef CONFIG_AMIGA #include #endif +#ifdef CONFIG_ALL_PPC +#include +#define isPReP (_machine == _MACH_prep) +#else +#define isPReP 0 +#endif #include