linux-cvs-patches
[Top] [All Lists]

CVS Update@linux-mips.org: linux

To: linux-cvs-patches@linux-mips.org
Subject: CVS Update@linux-mips.org: linux
From: ralf@linux-mips.org
Date: Sun, 09 Jan 2005 19:34:11 +0000
Reply-to: linux-mips@linux-mips.org
Sender: linux-cvs-patches-bounce@linux-mips.org
CVSROOT:        /home/cvs
Module name:    linux
Changes by:     ralf@ftp.linux-mips.org 05/01/09 19:34:04

Modified files:
        .              : Tag: linux_2_4 Makefile 
        Documentation  : Tag: linux_2_4 computone.txt 
        Documentation/networking: Tag: linux_2_4 e1000.txt 
        arch/mips      : Tag: linux_2_4 defconfig defconfig-atlas 
                         defconfig-bosporus defconfig-capcella 
                         defconfig-cobalt defconfig-csb250 
                         defconfig-db1000 defconfig-db1100 
                         defconfig-db1500 defconfig-db1550 
                         defconfig-ddb5476 defconfig-ddb5477 
                         defconfig-decstation defconfig-e55 
                         defconfig-eagle defconfig-ev64120 
                         defconfig-ev96100 defconfig-hp-lj 
                         defconfig-hydrogen3 defconfig-ip22 
                         defconfig-it8172 defconfig-ivr 
                         defconfig-jmr3927 defconfig-lasat 
                         defconfig-malta defconfig-mirage 
                         defconfig-mpc30x defconfig-mtx-1 defconfig-nino 
                         defconfig-ocelot defconfig-osprey 
                         defconfig-pb1000 defconfig-pb1100 
                         defconfig-pb1500 defconfig-pb1550 
                         defconfig-rbtx4927 defconfig-rm200 
                         defconfig-sb1250-swarm defconfig-stretch 
                         defconfig-tb0226 defconfig-tb0229 
                         defconfig-ti1500 defconfig-workpad 
                         defconfig-xxs1500 defconfig-yosemite 
        arch/mips/kernel: Tag: linux_2_4 irixelf.c 
        arch/mips64    : Tag: linux_2_4 defconfig-atlas 
                         defconfig-decstation defconfig-ip22 
                         defconfig-jaguar defconfig-malta 
                         defconfig-ocelotc defconfig-sb1250-swarm 
        arch/mips64/kernel: Tag: linux_2_4 ioctl32.c 
        arch/parisc/kernel: Tag: linux_2_4 ioctl32.c 
        arch/ppc64/kernel: Tag: linux_2_4 ioctl32.c signal.c signal32.c 
        arch/sparc64/kernel: Tag: linux_2_4 binfmt_aout32.c ioctl32.c 
        arch/x86_64/ia32: Tag: linux_2_4 ia32_ioctl.c ptrace32.c 
        drivers/char   : Tag: linux_2_4 ip2main.c 
        drivers/char/ip2: Tag: linux_2_4 i2ellis.c i2ellis.h i2lib.c 
                          ip2types.h 
        drivers/media/video: Tag: linux_2_4 bttv-if.c tvmixer.c 
        drivers/net    : Tag: linux_2_4 8139cp.c 8390.c pcnet32.c 
        drivers/net/e1000: Tag: linux_2_4 e1000.h e1000_ethtool.c 
                           e1000_hw.c e1000_hw.h e1000_main.c 
                           e1000_osdep.h e1000_param.c 
        drivers/net/wireless/prism54: Tag: linux_2_4 isl_38xx.c 
                                      isl_38xx.h isl_ioctl.c 
                                      islpci_dev.c islpci_dev.h 
                                      islpci_hotplug.c prismcompat.h 
                                      prismcompat24.h 
        drivers/scsi   : Tag: linux_2_4 ahci.c ata_piix.c libata-core.c 
                         libata-scsi.c libata.h sata_nv.c sata_uli.c 
        drivers/usb/serial: Tag: linux_2_4 ftdi_sio.c 
        fs             : Tag: linux_2_4 binfmt_aout.c binfmt_elf.c 
        include/linux  : Tag: linux_2_4 auto_fs4.h libata.h mm.h 
                         pci_ids.h 
        kernel         : Tag: linux_2_4 ksyms.c 
        mm             : Tag: linux_2_4 mmap.c 
        net            : Tag: linux_2_4 Config.in 

Log message:
        Merge with Linux 2.4.29-rc3.
        
        See http://isec.pl/vulnerabilities/isec-0021-uselib.txt for a critical
        security issues fixed by this patch.

diff -urN linux/Makefile linux/Makefile
--- linux/Makefile      2004/12/27 04:13:37     1.119.2.30
+++ linux/Makefile      2005/01/09 19:33:59     1.119.2.31
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 4
 SUBLEVEL = 29
-EXTRAVERSION = -pre3
+EXTRAVERSION = -rc1
 
 KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
diff -urN linux/Documentation/computone.txt linux/Documentation/computone.txt
--- linux/Documentation/computone.txt   2001/11/06 07:55:44     1.7
+++ linux/Documentation/computone.txt   2005/01/09 19:33:59     1.7.2.1
@@ -6,11 +6,11 @@
 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, 2.3, and 2.4.
 
-Version: 1.2.14
-Date: 11/01/2001
+Version: 1.2.18
+Date: 12/22/2004
 Historical Author: Andrew Manison <amanison@america.net>
 Primary Author: Doug McNash
-Support: support@computone.com
+Support: mhw@wittsend.com
 Fixes and Updates: Mike Warfield <mhw@wittsend.com>
 
 This file assumes that you are using the Computone drivers which are
@@ -26,7 +26,7 @@
 products previous to the Intelliport II.
 
 This driver was developed on the v2.0.x Linux tree and has been tested up
-to v2.4.14; it will probably not work with earlier v1.X kernels,.
+to v2.4.28; it will probably not work with earlier v1.X kernels,.
 
 
 2. QUICK INSTALLATION
diff -urN linux/Documentation/networking/e1000.txt 
linux/Documentation/networking/e1000.txt
--- linux/Documentation/networking/e1000.txt    2004/11/29 17:47:15     1.1.2.4
+++ linux/Documentation/networking/e1000.txt    2005/01/09 19:33:59     1.1.2.5
@@ -1,14 +1,14 @@
 Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
 ===============================================================
 
-September 13, 2004
+November 17, 2004
 
 
 Contents
 ========
 
 - In This Release
-- Supported Adapters
+- Identifying Your Adapter
 - Command Line Parameters
 - Speed and Duplex Configuration
 - Additional Configurations
@@ -20,8 +20,7 @@
 ===============
 
 This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family
-of Adapters, version 5.x.x.  This driver includes support for Itanium(TM)2 
-and EM64T systems.
+of Adapters, version 5.x.x.  
 
 For questions related to hardware requirements, refer to the documentation 
 supplied with your Intel PRO/1000 adapter. All hardware requirements listed 
@@ -145,9 +144,11 @@
 Default Value: 256
     This value is the number of receive descriptors allocated by the driver. 
     Increasing this value allows the driver to buffer more incoming packets. 
-    Each descriptor is 16 bytes.  A receive buffer is also allocated for each
-    descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending 
-    on the MTU setting. The maximum MTU size is 16110.
+    Each descriptor is 16 bytes.  A receive buffer is allocated for each
+    descriptor and can either be 2048 or 4096 bytes long, depending on the MTU 
+
+    setting. An incoming packet can span one or more receive descriptors. 
+    The maximum MTU size is 16110.
 
     NOTE: MTU designates the frame size. It only needs to be set for Jumbo 
           Frames.
@@ -251,17 +252,18 @@
   also be forced.
 
 The AutoNeg parameter is used when more control is required over the auto-
-negotiation process.  When this parameter is used, Speed and Duplex must not 
-be specified.  This parameter is a bitmap that specifies which speed and 
-duplex settings are advertised to the link partner.
-
-Bit            7      6      5       4       3      2      1       0
-Speed (Mbps)   N/A    N/A    1000    N/A     100    100    10      10
-Duplex                       Full            Full   Half   Full    Half
-
-For example to limit the negotiated speed/duplex on the interface to 10 Mbps 
-Half or Full duplex, set AutoNeg to 0x02: 
-    insmod e1000 AutoNeg=0x02
+negotiation process. When this parameter is used, Speed and Duplex parameters 
+must not be specified. The following table describes supported values for the 
+AutoNeg parameter:
+
+
+Speed (Mbps)             1000    100    100    10      10
+Duplex                   Full    Full   Half   Full    Half
+Value (in base 16)       0x20    0x08   0x04   0x02    0x01
+
+
+Example: insmod e1000 AutoNeg=0x03, loads e1000 and specifies (10 full duplex, 
+10 half duplex) for negotiation with the peer.
 
 Note that setting AutoNeg does not guarantee that the board will link at the 
 highest specified speed or duplex mode, but the board will link at the 
@@ -333,11 +335,7 @@
   version 1.6 or later is required for this functionality.
 
   The latest release of ethtool can be found from
-  http://sf.net/projects/gkernel.  After ethtool is installed,
-  ethtool-copy.h must be copied and renamed to ethtool.h in your kernel
-  source tree at <linux_kernel_src>/include/linux.  Backup the original
-  ethtool.h as needed before copying.  The driver then must be recompiled
-  in order to take advantage of the latest ethtool features.
+  http://sf.net/projects/gkernel.  
 
   NOTE: Ethtool 1.6 only supports a limited set of ethtool options. Support 
   for a more complete ethtool feature set can be enabled by upgrading 
diff -urN linux/arch/mips/defconfig linux/arch/mips/defconfig
--- linux/arch/mips/defconfig   2004/11/29 17:47:15     1.117.2.82
+++ linux/arch/mips/defconfig   2005/01/09 19:33:59     1.117.2.83
@@ -235,11 +235,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-atlas linux/arch/mips/defconfig-atlas
--- linux/arch/mips/Attic/defconfig-atlas       2004/11/29 17:47:15     
1.48.2.75
+++ linux/arch/mips/Attic/defconfig-atlas       2005/01/09 19:33:59     
1.48.2.76
@@ -235,11 +235,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-bosporus linux/arch/mips/defconfig-bosporus
--- linux/arch/mips/Attic/defconfig-bosporus    2004/11/29 17:47:15     1.1.2.39
+++ linux/arch/mips/Attic/defconfig-bosporus    2005/01/09 19:33:59     1.1.2.40
@@ -374,11 +374,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-capcella linux/arch/mips/defconfig-capcella
--- linux/arch/mips/Attic/defconfig-capcella    2004/11/19 00:28:32     1.1.2.61
+++ linux/arch/mips/Attic/defconfig-capcella    2005/01/09 19:33:59     1.1.2.62
@@ -228,11 +228,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-cobalt linux/arch/mips/defconfig-cobalt
--- linux/arch/mips/Attic/defconfig-cobalt      2004/11/19 00:28:32     
1.17.2.69
+++ linux/arch/mips/Attic/defconfig-cobalt      2005/01/09 19:33:59     
1.17.2.70
@@ -222,11 +222,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-csb250 linux/arch/mips/defconfig-csb250
--- linux/arch/mips/Attic/defconfig-csb250      2004/11/19 00:28:32     1.1.2.26
+++ linux/arch/mips/Attic/defconfig-csb250      2005/01/09 19:33:59     1.1.2.27
@@ -268,11 +268,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-db1000 linux/arch/mips/defconfig-db1000
--- linux/arch/mips/Attic/defconfig-db1000      2004/11/19 00:28:32     1.1.2.53
+++ linux/arch/mips/Attic/defconfig-db1000      2005/01/09 19:33:59     1.1.2.54
@@ -342,11 +342,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-db1100 linux/arch/mips/defconfig-db1100
--- linux/arch/mips/Attic/defconfig-db1100      2004/11/19 00:28:32     1.1.2.44
+++ linux/arch/mips/Attic/defconfig-db1100      2005/01/09 19:33:59     1.1.2.45
@@ -342,11 +342,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-db1500 linux/arch/mips/defconfig-db1500
--- linux/arch/mips/Attic/defconfig-db1500      2004/11/19 00:28:32     1.1.2.57
+++ linux/arch/mips/Attic/defconfig-db1500      2005/01/09 19:33:59     1.1.2.58
@@ -267,11 +267,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-db1550 linux/arch/mips/defconfig-db1550
--- linux/arch/mips/Attic/defconfig-db1550      2004/11/19 00:28:32     1.1.2.11
+++ linux/arch/mips/Attic/defconfig-db1550      2005/01/09 19:33:59     1.1.2.12
@@ -343,11 +343,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ddb5476 linux/arch/mips/defconfig-ddb5476
--- linux/arch/mips/Attic/defconfig-ddb5476     2004/11/19 00:28:32     
1.54.2.69
+++ linux/arch/mips/Attic/defconfig-ddb5476     2005/01/09 19:33:59     
1.54.2.70
@@ -226,11 +226,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ddb5477 linux/arch/mips/defconfig-ddb5477
--- linux/arch/mips/Attic/defconfig-ddb5477     2004/11/19 00:28:32     
1.24.2.72
+++ linux/arch/mips/Attic/defconfig-ddb5477     2005/01/09 19:33:59     
1.24.2.73
@@ -226,11 +226,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-decstation 
linux/arch/mips/defconfig-decstation
--- linux/arch/mips/Attic/defconfig-decstation  2004/11/29 17:47:15     
1.76.2.75
+++ linux/arch/mips/Attic/defconfig-decstation  2005/01/09 19:33:59     
1.76.2.76
@@ -223,11 +223,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-e55 linux/arch/mips/defconfig-e55
--- linux/arch/mips/Attic/defconfig-e55 2004/11/19 00:28:32     1.1.2.51
+++ linux/arch/mips/Attic/defconfig-e55 2005/01/09 19:33:59     1.1.2.52
@@ -222,11 +222,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-eagle linux/arch/mips/defconfig-eagle
--- linux/arch/mips/Attic/defconfig-eagle       2004/11/19 00:28:32     1.1.2.64
+++ linux/arch/mips/Attic/defconfig-eagle       2005/01/09 19:33:59     1.1.2.65
@@ -327,11 +327,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ev64120 linux/arch/mips/defconfig-ev64120
--- linux/arch/mips/Attic/defconfig-ev64120     2004/10/20 00:00:40     
1.45.2.67
+++ linux/arch/mips/Attic/defconfig-ev64120     2005/01/09 19:33:59     
1.45.2.68
@@ -230,11 +230,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ev96100 linux/arch/mips/defconfig-ev96100
--- linux/arch/mips/Attic/defconfig-ev96100     2004/10/20 00:00:40     
1.51.2.68
+++ linux/arch/mips/Attic/defconfig-ev96100     2005/01/09 19:33:59     
1.51.2.69
@@ -232,11 +232,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-hp-lj linux/arch/mips/defconfig-hp-lj
--- linux/arch/mips/Attic/defconfig-hp-lj       2004/11/19 00:28:32     1.4.2.72
+++ linux/arch/mips/Attic/defconfig-hp-lj       2005/01/09 19:33:59     1.4.2.73
@@ -304,11 +304,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-hydrogen3 
linux/arch/mips/defconfig-hydrogen3
--- linux/arch/mips/Attic/defconfig-hydrogen3   2004/11/19 00:28:32     1.1.2.23
+++ linux/arch/mips/Attic/defconfig-hydrogen3   2005/01/09 19:33:59     1.1.2.24
@@ -340,11 +340,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ip22 linux/arch/mips/defconfig-ip22
--- linux/arch/mips/Attic/defconfig-ip22        2004/11/29 17:47:15     
1.92.2.83
+++ linux/arch/mips/Attic/defconfig-ip22        2005/01/09 19:33:59     
1.92.2.84
@@ -235,11 +235,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-it8172 linux/arch/mips/defconfig-it8172
--- linux/arch/mips/Attic/defconfig-it8172      2004/11/19 00:28:32     
1.39.2.75
+++ linux/arch/mips/Attic/defconfig-it8172      2005/01/09 19:33:59     
1.39.2.76
@@ -304,11 +304,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ivr linux/arch/mips/defconfig-ivr
--- linux/arch/mips/Attic/defconfig-ivr 2004/11/19 00:28:32     1.3.2.71
+++ linux/arch/mips/Attic/defconfig-ivr 2005/01/09 19:33:59     1.3.2.72
@@ -226,11 +226,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-jmr3927 linux/arch/mips/defconfig-jmr3927
--- linux/arch/mips/Attic/defconfig-jmr3927     2004/10/20 00:00:40     1.2.2.72
+++ linux/arch/mips/Attic/defconfig-jmr3927     2005/01/09 19:33:59     1.2.2.73
@@ -225,11 +225,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-lasat linux/arch/mips/defconfig-lasat
--- linux/arch/mips/Attic/defconfig-lasat       2004/11/19 00:28:32     1.1.2.49
+++ linux/arch/mips/Attic/defconfig-lasat       2005/01/09 19:33:59     1.1.2.50
@@ -303,11 +303,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-malta linux/arch/mips/defconfig-malta
--- linux/arch/mips/Attic/defconfig-malta       2004/11/29 17:47:15     
1.51.2.76
+++ linux/arch/mips/Attic/defconfig-malta       2005/01/09 19:33:59     
1.51.2.77
@@ -237,11 +237,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-mirage linux/arch/mips/defconfig-mirage
--- linux/arch/mips/Attic/defconfig-mirage      2004/11/19 00:28:32     1.1.2.35
+++ linux/arch/mips/Attic/defconfig-mirage      2005/01/09 19:33:59     1.1.2.36
@@ -335,11 +335,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-mpc30x linux/arch/mips/defconfig-mpc30x
--- linux/arch/mips/Attic/defconfig-mpc30x      2004/10/20 00:00:40     1.1.2.51
+++ linux/arch/mips/Attic/defconfig-mpc30x      2005/01/09 19:33:59     1.1.2.52
@@ -228,11 +228,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-mtx-1 linux/arch/mips/defconfig-mtx-1
--- linux/arch/mips/Attic/defconfig-mtx-1       2004/11/29 17:47:15     1.1.2.30
+++ linux/arch/mips/Attic/defconfig-mtx-1       2005/01/09 19:33:59     1.1.2.31
@@ -372,11 +372,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 CONFIG_BRIDGE=m
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-nino linux/arch/mips/defconfig-nino
--- linux/arch/mips/Attic/defconfig-nino        2004/10/20 00:00:40     
1.30.2.69
+++ linux/arch/mips/Attic/defconfig-nino        2005/01/09 19:33:59     
1.30.2.70
@@ -226,11 +226,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ocelot linux/arch/mips/defconfig-ocelot
--- linux/arch/mips/Attic/defconfig-ocelot      2004/11/19 00:28:32     
1.36.2.70
+++ linux/arch/mips/Attic/defconfig-ocelot      2005/01/09 19:33:59     
1.36.2.71
@@ -307,11 +307,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-osprey linux/arch/mips/defconfig-osprey
--- linux/arch/mips/Attic/defconfig-osprey      2004/11/19 00:28:32     
1.13.2.70
+++ linux/arch/mips/Attic/defconfig-osprey      2005/01/09 19:33:59     
1.13.2.71
@@ -227,11 +227,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-pb1000 linux/arch/mips/defconfig-pb1000
--- linux/arch/mips/Attic/defconfig-pb1000      2004/11/19 00:28:32     
1.29.2.86
+++ linux/arch/mips/Attic/defconfig-pb1000      2005/01/09 19:33:59     
1.29.2.87
@@ -324,11 +324,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-pb1100 linux/arch/mips/defconfig-pb1100
--- linux/arch/mips/Attic/defconfig-pb1100      2004/11/19 00:28:32     1.1.2.66
+++ linux/arch/mips/Attic/defconfig-pb1100      2005/01/09 19:33:59     1.1.2.67
@@ -324,11 +324,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-pb1500 linux/arch/mips/defconfig-pb1500
--- linux/arch/mips/Attic/defconfig-pb1500      2004/11/19 00:28:32     1.1.2.76
+++ linux/arch/mips/Attic/defconfig-pb1500      2005/01/09 19:33:59     1.1.2.77
@@ -341,11 +341,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-pb1550 linux/arch/mips/defconfig-pb1550
--- linux/arch/mips/Attic/defconfig-pb1550      2004/11/19 00:28:32     1.1.2.17
+++ linux/arch/mips/Attic/defconfig-pb1550      2005/01/09 19:33:59     1.1.2.18
@@ -343,11 +343,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-rbtx4927 linux/arch/mips/defconfig-rbtx4927
--- linux/arch/mips/Attic/defconfig-rbtx4927    2004/10/20 00:00:40     1.1.2.26
+++ linux/arch/mips/Attic/defconfig-rbtx4927    2005/01/09 19:33:59     1.1.2.27
@@ -223,11 +223,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-rm200 linux/arch/mips/defconfig-rm200
--- linux/arch/mips/Attic/defconfig-rm200       2004/10/20 00:00:40     
1.67.2.64
+++ linux/arch/mips/Attic/defconfig-rm200       2005/01/09 19:33:59     
1.67.2.65
@@ -229,11 +229,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-sb1250-swarm 
linux/arch/mips/defconfig-sb1250-swarm
--- linux/arch/mips/Attic/defconfig-sb1250-swarm        2004/11/29 17:47:15     
1.12.2.83
+++ linux/arch/mips/Attic/defconfig-sb1250-swarm        2005/01/09 19:33:59     
1.12.2.84
@@ -254,11 +254,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-stretch linux/arch/mips/defconfig-stretch
--- linux/arch/mips/Attic/defconfig-stretch     2004/11/29 17:47:15     1.1.2.5
+++ linux/arch/mips/Attic/defconfig-stretch     2005/01/09 19:33:59     1.1.2.6
@@ -240,11 +240,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-tb0226 linux/arch/mips/defconfig-tb0226
--- linux/arch/mips/Attic/defconfig-tb0226      2004/11/29 17:47:15     1.1.2.43
+++ linux/arch/mips/Attic/defconfig-tb0226      2005/01/09 19:34:00     1.1.2.44
@@ -228,11 +228,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-tb0229 linux/arch/mips/defconfig-tb0229
--- linux/arch/mips/Attic/defconfig-tb0229      2004/11/19 00:28:32     1.1.2.36
+++ linux/arch/mips/Attic/defconfig-tb0229      2005/01/09 19:34:00     1.1.2.37
@@ -230,11 +230,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-ti1500 linux/arch/mips/defconfig-ti1500
--- linux/arch/mips/Attic/defconfig-ti1500      2004/11/19 00:28:32     1.1.2.30
+++ linux/arch/mips/Attic/defconfig-ti1500      2005/01/09 19:34:00     1.1.2.31
@@ -339,11 +339,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-workpad linux/arch/mips/defconfig-workpad
--- linux/arch/mips/Attic/defconfig-workpad     2004/11/19 00:28:32     1.1.2.52
+++ linux/arch/mips/Attic/defconfig-workpad     2005/01/09 19:34:00     1.1.2.53
@@ -222,11 +222,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-xxs1500 linux/arch/mips/defconfig-xxs1500
--- linux/arch/mips/Attic/defconfig-xxs1500     2004/11/19 00:28:32     1.1.2.35
+++ linux/arch/mips/Attic/defconfig-xxs1500     2005/01/09 19:34:00     1.1.2.36
@@ -339,11 +339,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/defconfig-yosemite linux/arch/mips/defconfig-yosemite
--- linux/arch/mips/Attic/defconfig-yosemite    2004/11/29 17:47:15     1.1.2.14
+++ linux/arch/mips/Attic/defconfig-yosemite    2005/01/09 19:34:00     1.1.2.15
@@ -227,11 +227,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips/kernel/irixelf.c linux/arch/mips/kernel/irixelf.c
--- linux/arch/mips/kernel/irixelf.c    2002/12/02 00:24:48     1.40.2.3
+++ linux/arch/mips/kernel/irixelf.c    2005/01/09 19:34:01     1.40.2.4
@@ -130,7 +130,7 @@
        end = PAGE_ALIGN(end);
        if (end <= start)
                return;
-       do_brk(start, end - start);
+       do_brk_locked(start, end - start);
 }
 
 
@@ -379,7 +379,7 @@
 
        /* Map the last of the bss segment */
        if (last_bss > len) {
-               do_brk(len, (last_bss - len));
+               do_brk_locked(len, (last_bss - len));
        }
        kfree(elf_phdata);
 
@@ -567,7 +567,7 @@
        unsigned long v;
        struct prda *pp;
 
-       v =  do_brk (PRDA_ADDRESS, PAGE_SIZE);
+       v =  do_brk_locked (PRDA_ADDRESS, PAGE_SIZE);
 
        if (v < 0)
                return;
@@ -859,7 +859,7 @@
        len = (elf_phdata->p_filesz + elf_phdata->p_vaddr+ 0xfff) & 0xfffff000;
        bss = elf_phdata->p_memsz + elf_phdata->p_vaddr;
        if (bss > len)
-         do_brk(len, bss-len);
+         do_brk_locked(len, bss-len);
        kfree(elf_phdata);
        return 0;
 }
diff -urN linux/arch/mips64/defconfig-atlas linux/arch/mips64/defconfig-atlas
--- linux/arch/mips64/Attic/defconfig-atlas     2004/11/29 17:47:15     1.1.2.75
+++ linux/arch/mips64/Attic/defconfig-atlas     2005/01/09 19:34:01     1.1.2.76
@@ -232,11 +232,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/defconfig-decstation 
linux/arch/mips64/defconfig-decstation
--- linux/arch/mips64/Attic/defconfig-decstation        2004/11/29 17:47:15     
1.1.2.43
+++ linux/arch/mips64/Attic/defconfig-decstation        2005/01/09 19:34:01     
1.1.2.44
@@ -224,11 +224,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/defconfig-ip22 linux/arch/mips64/defconfig-ip22
--- linux/arch/mips64/Attic/defconfig-ip22      2004/11/29 17:47:15     
1.56.2.85
+++ linux/arch/mips64/Attic/defconfig-ip22      2005/01/09 19:34:01     
1.56.2.86
@@ -235,11 +235,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/defconfig-jaguar linux/arch/mips64/defconfig-jaguar
--- linux/arch/mips64/Attic/defconfig-jaguar    2004/10/20 00:00:51     1.1.2.19
+++ linux/arch/mips64/Attic/defconfig-jaguar    2005/01/09 19:34:01     1.1.2.20
@@ -227,11 +227,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/defconfig-malta linux/arch/mips64/defconfig-malta
--- linux/arch/mips64/Attic/defconfig-malta     2004/11/29 17:47:15     1.1.2.72
+++ linux/arch/mips64/Attic/defconfig-malta     2005/01/09 19:34:01     1.1.2.73
@@ -235,11 +235,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/defconfig-ocelotc 
linux/arch/mips64/defconfig-ocelotc
--- linux/arch/mips64/Attic/defconfig-ocelotc   2004/10/20 00:00:51     1.1.2.21
+++ linux/arch/mips64/Attic/defconfig-ocelotc   2005/01/09 19:34:01     1.1.2.22
@@ -231,11 +231,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/defconfig-sb1250-swarm 
linux/arch/mips64/defconfig-sb1250-swarm
--- linux/arch/mips64/Attic/defconfig-sb1250-swarm      2004/11/29 17:47:15     
1.6.2.81
+++ linux/arch/mips64/Attic/defconfig-sb1250-swarm      2005/01/09 19:34:01     
1.6.2.82
@@ -254,11 +254,6 @@
 #
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
diff -urN linux/arch/mips64/kernel/ioctl32.c linux/arch/mips64/kernel/ioctl32.c
--- linux/arch/mips64/kernel/Attic/ioctl32.c    2004/05/31 14:33:03     
1.10.2.29
+++ linux/arch/mips64/kernel/Attic/ioctl32.c    2005/01/09 19:34:01     
1.10.2.30
@@ -2352,6 +2352,10 @@
        IOCTL32_HANDLER(AUTOFS_IOC_SETTIMEOUT32, ioc_settimeout),
        IOCTL32_DEFAULT(AUTOFS_IOC_EXPIRE),
        IOCTL32_DEFAULT(AUTOFS_IOC_EXPIRE_MULTI),
+       IOCTL32_DEFAULT(AUTOFS_IOC_PROTSUBVER),
+       IOCTL32_DEFAULT(AUTOFS_IOC_ASKREGHOST),
+       IOCTL32_DEFAULT(AUTOFS_IOC_TOGGLEREGHOST),
+       IOCTL32_DEFAULT(AUTOFS_IOC_ASKUMOUNT),
 
        /* DEVFS */
        IOCTL32_DEFAULT(DEVFSDIOC_GET_PROTO_REV),
diff -urN linux/arch/parisc/kernel/ioctl32.c linux/arch/parisc/kernel/ioctl32.c
--- linux/arch/parisc/kernel/ioctl32.c  2003/08/13 17:19:10     1.1.2.3
+++ linux/arch/parisc/kernel/ioctl32.c  2005/01/09 19:34:01     1.1.2.4
@@ -3375,6 +3375,12 @@
 COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC)
 COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
+COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
+COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOSUBVER)
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKREGHOST)
+COMPATIBLE_IOCTL(AUTOFS_IOC_TOGGLEREGHOST)
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKUMOUNT)
+
 /* DEVFS */
 COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV)
 COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK)
diff -urN linux/arch/ppc64/kernel/ioctl32.c linux/arch/ppc64/kernel/ioctl32.c
--- linux/arch/ppc64/kernel/ioctl32.c   2003/12/22 22:44:35     1.1.2.6
+++ linux/arch/ppc64/kernel/ioctl32.c   2005/01/09 19:34:01     1.1.2.7
@@ -4278,6 +4278,11 @@
 COMPATIBLE_IOCTL(AUTOFS_IOC_CATATONIC),
 COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER),
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE),
+COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI),
+COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOSUBVER),
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKREGHOST),
+COMPATIBLE_IOCTL(AUTOFS_IOC_TOGGLEREGHOST),
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKUMOUNT),
 /* DEVFS */
 COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV),
 COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK),
diff -urN linux/arch/ppc64/kernel/signal.c linux/arch/ppc64/kernel/signal.c
--- linux/arch/ppc64/kernel/signal.c    2003/12/22 22:44:36     1.1.2.6
+++ linux/arch/ppc64/kernel/signal.c    2005/01/09 19:34:01     1.1.2.7
@@ -31,8 +31,8 @@
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
-#include <asm/ppcdebug.h>
 #include <asm/unistd.h>
+#include <asm/processor.h>
 
 #define DEBUG_SIG 0
 
@@ -138,7 +138,7 @@
        regs->gpr[3] = EINTR;
        regs->ccr |= 0x10000000;
        while (1) {
-               current->state = TASK_INTERRUPTIBLE;
+               set_current_state(TASK_INTERRUPTIBLE);
                schedule();
                if (do_signal(&saveset, regs))
                        /*
@@ -236,22 +236,16 @@
 
        if (regs->msr & MSR_FP)
                giveup_fpu(current);
-
-       current->thread.saved_msr = regs->msr & ~(MSR_FP | MSR_FE0 | MSR_FE1);
-       regs->msr = current->thread.saved_msr | current->thread.fpexc_mode;
-       current->thread.saved_softe = regs->softe;
-
        err |= __put_user(&sc->gp_regs, &sc->regs);
        err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
        err |= __copy_to_user(&sc->fp_regs, &current->thread.fpr, FP_REGS_SIZE);
+       current->thread.fpscr = 0;
+
        err |= __put_user(signr, &sc->signal);
        err |= __put_user(handler, &sc->handler);
        if (set != NULL)
                err |=  __put_user(set->sig[0], &sc->oldmask);
 
-       regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
-       current->thread.fpscr = 0;
-
        return err;
 }
 
@@ -263,20 +257,33 @@
 restore_sigcontext(struct pt_regs *regs, sigset_t *set, struct sigcontext *sc)
 {
        unsigned int err = 0;
+       int i;
+       elf_greg_t *gregs = (elf_greg_t *)regs;
+       unsigned long msr;
+
+       /* copy up to but not including MSR */
+       err |= __copy_from_user(regs, &sc->gp_regs,
+                               PT_MSR * sizeof(elf_greg_t));
+       /* get the MSR value from the stack but don't put it in regs->msr */
+       err |= __get_user(msr, &sc->gp_regs[PT_MSR]);
+       /* copy from orig_r3 (the word after the MSR) to the end,
+        * but don't copy softe */
+       for (i = PT_ORIG_R3; err == 0 && i <= PT_RESULT; ++i)
+               if (i != PT_SOFTE)
+                       err |= __get_user(gregs[i], &sc->gp_regs[i]);
 
-       if (regs->msr & MSR_FP)
-               giveup_fpu(current);
-
-       err |= __copy_from_user(regs, &sc->gp_regs, GP_REGS_SIZE);
+       /* make the process reload FP regs if it executes an FP instr */
+       regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
+#ifndef CONFIG_SMP
+       if (last_task_used_math == current)
+               last_task_used_math = NULL;
+#endif
        err |= __copy_from_user(&current->thread.fpr, &sc->fp_regs, 
FP_REGS_SIZE);
-       current->thread.fpexc_mode = regs->msr & (MSR_FE0 | MSR_FE1);
+
+       /* restore the signal mask */
        if (set != NULL)
                err |=  __get_user(set->sig[0], &sc->oldmask);
 
-       /* Don't allow the signal handler to change these modulo FE{0,1} */
-       regs->msr = current->thread.saved_msr & ~(MSR_FP | MSR_FE0 | MSR_FE1);
-       regs->softe = current->thread.saved_softe;
-
        return err;
 }
 
diff -urN linux/arch/ppc64/kernel/signal32.c linux/arch/ppc64/kernel/signal32.c
--- linux/arch/ppc64/kernel/signal32.c  2003/12/22 22:44:36     1.1.2.5
+++ linux/arch/ppc64/kernel/signal32.c  2005/01/09 19:34:01     1.1.2.6
@@ -48,7 +48,6 @@
 #include <asm/uaccess.h>
 #include <linux/elf.h>
 #include <asm/ppc32.h>
-#include <asm/ppcdebug.h>
 #include <asm/unistd.h>
 #include <asm/ucontext.h>
 
@@ -141,23 +140,22 @@
 {
        struct k_sigaction new_ka, old_ka;
        int ret;
+       u32 handler, restorer;
        
-       PPCDBG(PPCDBG_SYS32, "sys32_sigaction - entered - pid=%ld current=%lx 
comm=%s\n", current->pid, current, current->comm);
-
        if (sig < 0)
                sig = -sig;
 
        if (act) {
                old_sigset_t32 mask;
 
-               ret = get_user((long)new_ka.sa.sa_handler, &act->sa_handler);
-               ret |= __get_user((long)new_ka.sa.sa_restorer, 
&act->sa_restorer);
+               ret = get_user(handler, &act->sa_handler);
+               ret |= __get_user(restorer, &act->sa_restorer);
                ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
                ret |= __get_user(mask, &act->sa_mask);
                if (ret)
                        return ret;
-               PPCDBG(PPCDBG_SIGNAL, "sys32_sigaction flags =%lx  \n", 
new_ka.sa.sa_flags);
-
+               new_ka.sa.sa_handler = (__sighandler_t)(long) handler;
+               new_ka.sa.sa_restorer = (void (*)(void))(long) restorer;
                siginitset(&new_ka.sa.sa_mask, mask);
        }
 
@@ -171,9 +169,6 @@
                ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
        }
 
-       
-       PPCDBG(PPCDBG_SYS32, "sys32_sigaction - exited - pid=%ld current=%lx 
comm=%s\n", current->pid, current, current->comm);
-
        return ret;
 }
 
@@ -188,15 +183,11 @@
        int ret;
        mm_segment_t old_fs = get_fs();
        
-       PPCDBG(PPCDBG_SYS32, "sys32_sigpending - entered - pid=%ld current=%lx 
comm=%s\n", current->pid, current, current->comm);
-               
        set_fs (KERNEL_DS);
        ret = sys_sigpending(&s);
        set_fs (old_fs);
        if (put_user (s, set)) return -EFAULT;
        
-       PPCDBG(PPCDBG_SYS32, "sys32_sigpending - exited - pid=%ld current=%lx 
comm=%s\n", current->pid, current, current->comm);
-
        return ret;
 }
 
@@ -216,16 +207,12 @@
        int ret;
        mm_segment_t old_fs = get_fs();
        
-       PPCDBG(PPCDBG_SYS32, "sys32_sigprocmask - entered - pid=%ld current=%lx 
comm=%s\n", current->pid, current, current->comm);
-       
        if (set && get_user(s, set))
                return -EFAULT;
        set_fs (KERNEL_DS);
        ret = sys_sigprocmask((int)how, set ? &s : NULL, oset ? &s : NULL);
        set_fs (old_fs);
        
-       PPCDBG(PPCDBG_SYS32, "sys32_sigprocmask - exited - pid=%ld current=%lx 
comm=%s\n", current->pid, current, current->comm);
-
        if (ret)
                return ret;
        if (oset && put_user (s, oset))
@@ -256,14 +243,10 @@
 {
        struct sigcontext32 *sc, sigctx;
        struct sigregs32 *sr;
-       int ret;
        elf_gregset_t32 saved_regs;  /* an array of ELF_NGREG unsigned ints (32 
bits) */
        sigset_t set;
-       unsigned int prevsp;
        int i;
 
-       PPCDBG(PPCDBG_SIGNAL, "sys32_sigreturn - entered - pid=%ld current=%lx 
comm=%s \n", current->pid, current, current->comm);
-
        sc = (struct sigcontext32 *)(regs->gpr[1] + __SIGNAL_FRAMESIZE32);
        if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
                goto badframe;
@@ -279,107 +262,67 @@
        recalc_sigpending(current);
        spin_unlock_irq(&current->sigmask_lock);
 
-       sc++;                   /* Look at next sigcontext */
-       /* If the next sigcontext is actually the sigregs (frame)  */
-       /*   - then no more sigcontexts on the user stack          */  
-       if (sc == (struct sigcontext32*)(u64)sigctx.regs)
-       {
-               /* Last stacked signal - restore registers */
-               sr = (struct sigregs32*)(u64)sigctx.regs;
-               if (regs->msr & MSR_FP )
-                       giveup_fpu(current);
-               /* 
-                * Copy the 32 bit register values off the user stack
-                * into the 32 bit register area
-                */
-               if (copy_from_user(saved_regs, 
&sr->gp_regs,sizeof(sr->gp_regs)))
-                       goto badframe;
-               /*
-                * The saved reg structure in the frame is an elf_grepset_t32,
-                * it is a 32 bit register save of the registers in the
-                * pt_regs structure that was stored on the kernel stack
-                * during the system call when the system call was interrupted
-                * for the signal. Only 32 bits are saved because the
-                * sigcontext contains a pointer to the regs and the sig
-                * context address is passed as a pointer to the signal
-                * handler.  
-                *
-                * The entries in the elf_grepset have the same index as the
-                * elements in the pt_regs structure.
-                */
-               saved_regs[PT_MSR] = (regs->msr & ~MSR_USERCHANGE)
-                       | (saved_regs[PT_MSR] & MSR_USERCHANGE);
-               /*
-                * Register 2 is the kernel toc - should be reset on
-                * any calls into the kernel 
-                */
-               for (i = 0; i < 32; i++)
-                       regs->gpr[i] = (u64)(saved_regs[i]) & 0xFFFFFFFF;
-
-               /*
-                *  restore the non gpr registers 
-                */
-               regs->msr = (u64)(saved_regs[PT_MSR]) & 0xFFFFFFFF;
-               /*
-                * Insure that the interrupt mode is 64 bit, during 32 bit
-                * execution. (This is necessary because we only saved
-                * lower 32 bits of msr.)
-                */
-               regs->msr = regs->msr | MSR_ISF;
-
-               regs->nip = (u64)(saved_regs[PT_NIP]) & 0xFFFFFFFF;
-               regs->orig_gpr3 = (u64)(saved_regs[PT_ORIG_R3]) & 0xFFFFFFFF; 
-               regs->ctr = (u64)(saved_regs[PT_CTR]) & 0xFFFFFFFF; 
-               regs->link = (u64)(saved_regs[PT_LNK]) & 0xFFFFFFFF; 
-               regs->xer = (u64)(saved_regs[PT_XER]) & 0xFFFFFFFF; 
-               regs->ccr = (u64)(saved_regs[PT_CCR]) & 0xFFFFFFFF;
-               /* regs->softe is left unchanged (like the MSR.EE bit) */
-               /******************************************************/
-               /* the DAR and the DSISR are only relevant during a   */
-               /*   data or instruction storage interrupt. The value */
-               /*   will be set to zero.                             */
-               /******************************************************/
-               regs->dar = 0; 
-               regs->dsisr = 0;
-               regs->result = (u64)(saved_regs[PT_RESULT]) & 0xFFFFFFFF;
+       sr = (struct sigregs32*)(u64)sigctx.regs;
+       /*
+        * Copy the 32 bit register values off the user stack
+        * into the 32 bit register area
+        */
+       if (copy_from_user(saved_regs, &sr->gp_regs,sizeof(sr->gp_regs)))
+               goto badframe;
 
-               if (copy_from_user(current->thread.fpr, &sr->fp_regs, 
sizeof(sr->fp_regs)))
-                       goto badframe;
+       /*
+        * The saved reg structure in the frame is an elf_grepset_t32,
+        * it is a 32 bit register save of the registers in the
+        * pt_regs structure that was stored on the kernel stack
+        * during the system call when the system call was interrupted
+        * for the signal. Only 32 bits are saved because the
+        * sigcontext contains a pointer to the regs and the sig
+        * context address is passed as a pointer to the signal
+        * handler.  
+        *
+        * The entries in the elf_grepset have the same index as the
+        * elements in the pt_regs structure.
+        */
+       for (i = 0; i < 32; i++)
+               regs->gpr[i] = (u64)(saved_regs[i]) & 0xFFFFFFFF;
 
-               ret = regs->result;
-       } else {
-               /* More signals to go */
-               regs->gpr[1] = (unsigned long)sc - __SIGNAL_FRAMESIZE32;
-               if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
-                       goto badframe;
-               sr = (struct sigregs32*)(u64)sigctx.regs;
-               regs->gpr[3] = ret = sigctx.signal;
-               regs->gpr[4] = (unsigned long) sc;
-               regs->link = (unsigned long) &sr->tramp;
-               regs->nip = sigctx.handler;
+       /*
+        *  restore the non gpr registers 
+        */
+       regs->nip = (u64)(saved_regs[PT_NIP]) & 0xFFFFFFFF;
+       regs->orig_gpr3 = (u64)(saved_regs[PT_ORIG_R3]) & 0xFFFFFFFF; 
+       regs->ctr = (u64)(saved_regs[PT_CTR]) & 0xFFFFFFFF; 
+       regs->link = (u64)(saved_regs[PT_LNK]) & 0xFFFFFFFF; 
+       regs->xer = (u64)(saved_regs[PT_XER]) & 0xFFFFFFFF; 
+       regs->ccr = (u64)(saved_regs[PT_CCR]) & 0xFFFFFFFF;
+       /* regs->softe is left unchanged (like the MSR.EE bit) */
+       regs->result = (u64)(saved_regs[PT_RESULT]) & 0xFFFFFFFF;
+
+       /* force the process to reload the FP registers from
+          current->thread when it next does FP instructions */
+       regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
+#ifndef CONFIG_SMP
+       if (last_task_used_math == current)
+               last_task_used_math = NULL;
+#endif
+       if (copy_from_user(current->thread.fpr, &sr->fp_regs,
+                          sizeof(sr->fp_regs)))
+               goto badframe;
 
-               if (get_user(prevsp, &sr->gp_regs[PT_R1])
-                   || put_user(prevsp, (unsigned int*) regs->gpr[1]))
-                       goto badframe;
-               current->thread.fpscr = 0;
-       }
-  
-       PPCDBG(PPCDBG_SIGNAL, "sys32_sigreturn - normal exit returning %ld - 
pid=%ld current=%lx comm=%s \n", ret, current->pid, current, current->comm);
-       return ret;
+       return regs->result;
 
 badframe:
-       PPCDBG(PPCDBG_SYS32NI, "sys32_sigreturn - badframe - pid=%ld 
current=%lx comm=%s \n", current->pid, current, current->comm);
-       do_exit(SIGSEGV);
+       force_sig(SIGSEGV, current);
+       return 0;
 }      
 
 /*
  * Set up a signal frame.
  */
 static void
-setup_frame32(struct pt_regs *regs, struct sigregs32 *frame,
-            unsigned int newsp)
+setup_frame32(struct pt_regs *regs, int sig, struct k_sigaction *ka,
+             struct sigregs32 *frame, unsigned int newsp)
 {
-       struct sigcontext32 *sc = (struct sigcontext32 *)(u64)newsp;
        int i;
 
        if (verify_area(VERIFY_WRITE, frame, sizeof(*frame)))
@@ -425,30 +368,32 @@
                           (unsigned long) &frame->tramp[2]);
        current->thread.fpscr = 0;      /* turn off all fp exceptions */
 
-       newsp -= __SIGNAL_FRAMESIZE32;
-       if (put_user(regs->gpr[1], (u32*)(u64)newsp)
-           || get_user(regs->nip, &sc->handler)
-           || get_user(regs->gpr[3], &sc->signal))
-               goto badframe;
-
-       regs->gpr[1] = newsp & 0xFFFFFFFF;
        /*
         * first parameter to the signal handler is the signal number
         *  - the value is in gpr3
         * second parameter to the signal handler is the sigcontext
         *   - set the value into gpr4
         */
-       regs->gpr[4] = (unsigned long) sc;
+       regs->gpr[3] = sig;
+       regs->gpr[4] = newsp;
+       regs->nip = (u64)ka->sa.sa_handler & 0xFFFFFFFF;
        regs->link = (unsigned long) frame->tramp;
+
+       newsp -= __SIGNAL_FRAMESIZE32;
+       if (put_user(regs->gpr[1], (u32*)(u64)newsp))
+               goto badframe;
+       regs->gpr[1] = newsp;
+
        return;
 
  badframe:
-       udbg_printf("setup_frame32 - badframe in setup_frame, regs=%p frame=%p 
newsp=%lx\n", regs, frame, newsp);  PPCDBG_ENTER_DEBUGGER();
 #if DEBUG_SIG
        printk("badframe in setup_frame32, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
-       do_exit(SIGSEGV);
+       if (sig == SIGSEGV)
+               ka->sa.sa_handler = SIG_DFL;
+       force_sig(SIGSEGV, current);
 }
 
 
@@ -485,14 +430,12 @@
        struct sigcontext32 sigctx;
        struct sigregs32 *signalregs;
  
-       int i, ret;
+       int i;
        elf_gregset_t32 saved_regs;   /* an array of 32 bit register values */
        sigset_t signal_set; 
        stack_t stack;
-       unsigned int previous_stack;
 
-       ret = 0;
-       /* Adjust the inputted reg1 to point to the first rt signal frame */
+       /* Adjust the inputted reg1 to point to the rt signal frame */
        rt_stack_frame = (struct rt_sigframe_32 *)(regs->gpr[1] + 
__SIGNAL_FRAMESIZE32);
        /* Copy the information from the user stack  */
        if (copy_from_user(&sigctx, 
&rt_stack_frame->uc.uc_mcontext,sizeof(sigctx))
@@ -514,100 +457,54 @@
        recalc_sigpending(current);
        spin_unlock_irq(&current->sigmask_lock);
 
-       /* Set to point to the next rt_sigframe - this is used to determine 
whether this 
-        *   is the last signal to process
-        */
-       rt_stack_frame ++;
-
-       if (rt_stack_frame == (struct rt_sigframe_32 *)(u64)(sigctx.regs)) {
-               signalregs = (struct sigregs32 *) (u64)sigctx.regs;
-               /* If currently owning the floating point - give them up */
-               if (regs->msr & MSR_FP)
-                       giveup_fpu(current);
+       signalregs = (struct sigregs32 *) (u64)sigctx.regs;
 
-               if 
(copy_from_user(saved_regs,&signalregs->gp_regs,sizeof(signalregs->gp_regs))) 
-                       goto badframe;
-
-               /*
-                * The saved reg structure in the frame is an elf_grepset_t32,
-                * it is a 32 bit register save of the registers in the
-                * pt_regs structure that was stored on the kernel stack
-                * during the system call when the system call was interrupted
-                * for the signal. Only 32 bits are saved because the
-                * sigcontext contains a pointer to the regs and the sig
-                * context address is passed as a pointer to the signal handler
-                *
-                * The entries in the elf_grepset have the same index as
-                * the elements in the pt_regs structure.
-                */
-               saved_regs[PT_MSR] = (regs->msr & ~MSR_USERCHANGE)
-                       | (saved_regs[PT_MSR] & MSR_USERCHANGE);
-               /*
-                * Register 2 is the kernel toc - should be reset on any
-                * calls into the kernel
-                */
-               for (i = 0; i < 32; i++)
-                       regs->gpr[i] = (u64)(saved_regs[i]) & 0xFFFFFFFF;
-               /*
-                * restore the non gpr registers
-                */
-               regs->msr = (u64)(saved_regs[PT_MSR]) & 0xFFFFFFFF;
-               regs->nip = (u64)(saved_regs[PT_NIP]) & 0xFFFFFFFF;
-               regs->orig_gpr3 = (u64)(saved_regs[PT_ORIG_R3]) & 0xFFFFFFFF; 
-               regs->ctr = (u64)(saved_regs[PT_CTR]) & 0xFFFFFFFF; 
-               regs->link = (u64)(saved_regs[PT_LNK]) & 0xFFFFFFFF; 
-               regs->xer = (u64)(saved_regs[PT_XER]) & 0xFFFFFFFF; 
-               regs->ccr = (u64)(saved_regs[PT_CCR]) & 0xFFFFFFFF;
-               /* regs->softe is left unchanged (like MSR.EE) */
-               /*
-                * the DAR and the DSISR are only relevant during a
-                *   data or instruction storage interrupt. The value
-                *   will be set to zero.
-                */
-               regs->dar = 0; 
-               regs->dsisr = 0;
-               regs->result = (u64)(saved_regs[PT_RESULT]) & 0xFFFFFFFF;
-
-               if (copy_from_user(current->thread.fpr, &signalregs->fp_regs, 
sizeof(signalregs->fp_regs))) 
-                       goto badframe;
-
-               ret = regs->result;
-       }
-       else  /* more signals to go  */
-       {
-               regs->gpr[1] = (u64)rt_stack_frame - __SIGNAL_FRAMESIZE32;
-               if (copy_from_user(&sigctx, 
&rt_stack_frame->uc.uc_mcontext,sizeof(sigctx)))
-               {
-                       goto badframe;
-               }
-               signalregs = (struct sigregs32 *) (u64)sigctx.regs;
-               /* first parm to signal handler is the signal number */
-               regs->gpr[3] = ret = sigctx.signal;
-               /* second parm is a pointer to sig info */
-               get_user(regs->gpr[4], &rt_stack_frame->pinfo);
-               /* third parm is a pointer to the ucontext */
-               get_user(regs->gpr[5], &rt_stack_frame->puc);
-               /* fourth parm is the stack frame */
-               regs->gpr[6] = (u64)rt_stack_frame;
-               /* Set up link register to return to sigreturn when the */
-               /*  signal handler completes */
-               regs->link = (u64)&signalregs->tramp;
-               /* Set next instruction to the start fo the signal handler */
-               regs->nip = sigctx.handler;
-               /* Set the reg1 to look like a call to the signal handler */

[%d lines skipped]
292diff -urN linux/arch/sparc64/kernel/binfmt_aout32.c 
linux/arch/sparc64/kernel/binfmt_aout32.c
--- linux/arch/sparc64/kernel/binfmt_aout32.c   2002/06/26 22:35:29     1.20.2.1
+++ linux/arch/sparc64/kernel/binfmt_aout32.c   2005/01/09 19:34:02     1.20.2.2
@@ -49,7 +49,7 @@
        end = PAGE_ALIGN(end);
        if (end <= start)
                return;
-       do_brk(start, end - start);
+       do_brk_locked(start, end - start);
 }
 
 /*
@@ -246,10 +246,10 @@
        if (N_MAGIC(ex) == NMAGIC) {
                loff_t pos = fd_offset;
                /* Fuck me plenty... */
-               error = do_brk(N_TXTADDR(ex), ex.a_text);
+               error = do_brk_locked(N_TXTADDR(ex), ex.a_text);
                bprm->file->f_op->read(bprm->file, (char *) N_TXTADDR(ex),
                          ex.a_text, &pos);
-               error = do_brk(N_DATADDR(ex), ex.a_data);
+               error = do_brk_locked(N_DATADDR(ex), ex.a_data);
                bprm->file->f_op->read(bprm->file, (char *) N_DATADDR(ex),
                          ex.a_data, &pos);
                goto beyond_if;
@@ -257,7 +257,7 @@
 
        if (N_MAGIC(ex) == OMAGIC) {
                loff_t pos = fd_offset;
-               do_brk(N_TXTADDR(ex) & PAGE_MASK,
+               do_brk_locked(N_TXTADDR(ex) & PAGE_MASK,
                        ex.a_text+ex.a_data + PAGE_SIZE - 1);
                bprm->file->f_op->read(bprm->file, (char *) N_TXTADDR(ex),
                          ex.a_text+ex.a_data, &pos);
@@ -272,7 +272,7 @@
 
                if (!bprm->file->f_op->mmap) {
                        loff_t pos = fd_offset;
-                       do_brk(0, ex.a_text+ex.a_data);
+                       do_brk_locked(0, ex.a_text+ex.a_data);
                        bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
                                  ex.a_text+ex.a_data, &pos);
                        goto beyond_if;
@@ -388,7 +388,7 @@
        len = PAGE_ALIGN(ex.a_text + ex.a_data);
        bss = ex.a_text + ex.a_data + ex.a_bss;
        if (bss > len) {
-               error = do_brk(start_addr + len, bss - len);
+               error = do_brk_locked(start_addr + len, bss - len);
                retval = error;
                if (error != start_addr + len)
                        goto out;
diff -urN linux/arch/sparc64/kernel/ioctl32.c 
linux/arch/sparc64/kernel/ioctl32.c
--- linux/arch/sparc64/kernel/ioctl32.c 2004/12/27 04:13:40     1.47.2.14
+++ linux/arch/sparc64/kernel/ioctl32.c 2005/01/09 19:34:02     1.47.2.15
@@ -4918,6 +4918,10 @@
 COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
+COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOSUBVER)
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKREGHOST)
+COMPATIBLE_IOCTL(AUTOFS_IOC_TOGGLEREGHOST)
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKUMOUNT)
 /* DEVFS */
 COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV)
 COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK)
diff -urN linux/arch/x86_64/ia32/ia32_ioctl.c 
linux/arch/x86_64/ia32/ia32_ioctl.c
--- linux/arch/x86_64/ia32/ia32_ioctl.c 2004/11/19 00:28:35     1.6.2.9
+++ linux/arch/x86_64/ia32/ia32_ioctl.c 2005/01/09 19:34:02     1.6.2.10
@@ -4099,6 +4099,10 @@
 COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOVER)
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE)
 COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI)
+COMPATIBLE_IOCTL(AUTOFS_IOC_PROTOSUBVER)
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKREGHOST)
+COMPATIBLE_IOCTL(AUTOFS_IOC_TOGGLEREGHOST)
+COMPATIBLE_IOCTL(AUTOFS_IOC_ASKUMOUNT)
 /* DEVFS */
 COMPATIBLE_IOCTL(DEVFSDIOC_GET_PROTO_REV)
 COMPATIBLE_IOCTL(DEVFSDIOC_SET_EVENT_MASK)
diff -urN linux/arch/x86_64/ia32/ptrace32.c linux/arch/x86_64/ia32/ptrace32.c
--- linux/arch/x86_64/ia32/ptrace32.c   2004/04/16 03:14:13     1.2.2.5
+++ linux/arch/x86_64/ia32/ptrace32.c   2005/01/09 19:34:02     1.2.2.6
@@ -185,12 +185,12 @@
                        goto out;
                *err = ptrace_check_attach(child, request == PTRACE_KILL); 
                if (*err < 0) 
-                               goto out;
+                       goto out;
                return child; 
-       } 
 
  out:
-       free_task_struct(child);
+               free_task_struct(child);
+       } 
        return NULL; 
        
 } 
diff -urN linux/drivers/char/ip2main.c linux/drivers/char/ip2main.c
--- linux/drivers/char/ip2main.c        2004/12/27 04:13:42     1.16.2.4
+++ linux/drivers/char/ip2main.c        2005/01/09 19:34:02     1.16.2.5
@@ -19,6 +19,26 @@
 //
 // Done:
 //
+// 1.2.18      /\/\|=mhw=|\/\/
+// Fixed jiffies math in ii2DelayTimer...
+//     How long has THIS been broken?  Delay was basically a noop...
+// Dumped some groady tracing code that hasn't been used (or tested) in
+//     years and was only a source of warning messages.
+//
+// 1.2.17      /\/\|=mhw=|\/\/
+// PCI fixes submitted by Bjorn Helgaas
+//     Added calls to Add pci_enable_device()/pci_disable_device() per
+//     submitted patches.  My thanks to Bjorn Helgaas <bjorn.helgaas@hp.com>.
+//
+// 1.2.16      /\/\|=mhw=|\/\/
+// Yet another shot at the busy board timing window (use the poll timer).
+//     Because of this, the poll timer is always enabled...
+// Cleaned up some comments on immediate interrupt mode (ppp code elsewhere
+//     has been fixed and the new busy board logic won't throw a hairball).
+//
+// 1.2.15      dmc
+// Fixed jiffy wrap, PCI card may now be set to poll.
+//
 // 1.2.14      /\/\|=mhw=|\/\/
 // Added bounds checking to ip2_ipl_ioctl to avoid potential terroristic acts.
 // Changed the definition of ip2trace to be more consistant with kernel style
@@ -227,7 +247,7 @@
 
 /* String constants to identify ourselves */
 static char *pcName    = "Computone IntelliPort Plus multiport driver";
-static char *pcVersion = "1.2.14";
+static char *pcVersion = "1.2.18";
 
 /* String constants for port names */
 static char *pcDriver_name   = "ip2";
@@ -437,7 +457,7 @@
        }
        return 0;
 }
-#endif
+#endif /* MODULE */
 
 static int __init
 have_requested_irq( char irq )
@@ -545,6 +565,12 @@
        // free memory
        for (i = 0; i < IP2_MAX_BOARDS; i++) {
                void *pB;
+#ifdef CONFIG_PCI
+               if (ip2config.type[i] == PCI && ip2config.pci_dev[i]) {
+                       pci_disable_device(ip2config.pci_dev[i]);
+                       ip2config.pci_dev[i] = NULL;
+               }
+#endif
                if ((pB = i2BoardPtrTable[i]) != 0 ) {
                        kfree ( pB );
                        i2BoardPtrTable[i] = NULL;
@@ -604,17 +630,12 @@
                if (iop) {
                        ip2config.addr[i] = iop[i];
                        if (irqp) {
-                               if( irqp[i] >= 0 ) {
-                                       ip2config.irq[i] = irqp[i];
-                               } else {
-                                       ip2config.irq[i] = 0;
-                               }
+                               ip2config.irq[i] = irqp[i];
        // 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.
@@ -700,17 +721,12 @@
                                        } else {
                                                printk( KERN_ERR "IP2: PCI I/O 
address error\n");
                                        }
-                                       pcibios_read_config_byte(pci_bus, 
pci_devfn,
+                                       if (ip2config.irq[i] != 0) {
+                                               
pcibios_read_config_byte(pci_bus, pci_devfn,
                                                                  
PCI_INTERRUPT_LINE, &pci_irq);
 
-//             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;
+                                               ip2config.irq[i] = pci_irq;
+                                       }
                                } else {        // ann error
                                        ip2config.addr[i] = 0;
                                        if (status == PCIBIOS_DEVICE_NOT_FOUND) 
{
@@ -727,9 +743,15 @@
                                                          
PCI_DEVICE_ID_COMPUTONE_IP2EX, pci_dev_i);
                                if (pci_dev_i != NULL) {
                                        unsigned int addr;
-                                       unsigned char pci_irq;
+
+                                       if (pci_enable_device(pci_dev_i)) {
+                                               printk( KERN_ERR "IP2: can't 
enable PCI device at %s\n",
+                                               pci_name(pci_dev_i));
+                                               break;
+                                       }
 
                                        ip2config.type[i] = PCI;
+                                       ip2config.pci_dev[i] = pci_dev_i;
                                        status =
                                        pci_read_config_dword(pci_dev_i, 
PCI_BASE_ADDRESS_1, &addr);
                                        if ( addr & 1 ) {
@@ -737,18 +759,8 @@
                                        } else {
                                                printk( KERN_ERR "IP2: PCI I/O 
address error\n");
                                        }
-                                       status =
-                                       pci_read_config_byte(pci_dev_i, 
PCI_INTERRUPT_LINE, &pci_irq);
-
-//             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.irq[i] = pci_dev_i->irq;
+                               } else {        // an error
                                        ip2config.addr[i] = 0;
                                        if (status == PCIBIOS_DEVICE_NOT_FOUND) 
{
                                                printk( KERN_ERR "IP2: PCI 
board %d not found\n", i );
@@ -964,6 +976,14 @@
                                /* Initialise the interrupt handler bottom half 
(aka slih). */
                        }
                }
+
+               if (!TimerOn) {
+//                     Kick the timer on for stuck board safeties...
+                       PollTimer.expires = POLL_TIMEOUT;
+                       add_timer ( &PollTimer );
+                       TimerOn = 1;
+               }
+
                for( i = 0; i < IP2_MAX_BOARDS; ++i ) {
                        if ( i2BoardPtrTable[i] ) {
                                set_irq( i, ip2config.irq[i] ); /* set and 
enable board interrupt */
@@ -1375,8 +1395,10 @@
 
 //             Only process those boards which match our IRQ.
 //                     IRQ = 0 for polled boards, we won't poll "IRQ" boards
+//             Add an additional "check" if the irq is zero for boards
+//             which are "stuck"
 
-               if ( pB && (pB->i2eUsingIrq == irq) ) {
+               if ( pB && ( pB->i2eUsingIrq == irq || ( 0 == irq && 0 != 
pB->SendPendingRetry ) ) ) {
 #ifdef USE_IQI
 
                    if (NO_MAIL_HERE != ( pB->i2eStartMail = iiGetMail(pB))) {
@@ -1391,9 +1413,8 @@
                        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.
+//             We are using immediate servicing here.  Suboptimal
+//                     to say the least...
                        i2ServiceBoard( pB );
 #endif /* USE_IQI */
                }
@@ -1417,6 +1438,9 @@
 static void
 ip2_poll(unsigned long arg)
 {
+       int i;
+       i2eBordStrPtr  pB;
+
        ip2trace (ITRC_NO_PORT, ITRC_INTR, 100, 0 );
 
        TimerOn = 0; // it's the truth but not checked in service
@@ -1424,7 +1448,15 @@
        // 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);
+
+       for( i = 0; i < i2nBoards; ++i ) {
+               pB = i2BoardPtrTable[i];
+       // Service the board if the irq indicates a polled board
+       // OR if the SendPendingRetry indicates a retry state in the board
+               if ( pB && ( 0 == pB->i2eUsingIrq || 0 != pB->SendPendingRetry 
) ) {
+                       i2ServiceBoard( pB );
+               }
+       }
 
        PollTimer.expires = POLL_TIMEOUT;
        add_timer( &PollTimer );
@@ -3196,7 +3228,16 @@
        case 2:     // Ping device
                rc = -EINVAL;
                break;
+
+#ifdef IP2_TRACE_DEVICE
        case 3:     // Trace device
+/*
+       This may have been useful at one time during early development
+       but has not been used for years and is just a source of excess
+       baggage and unused code and warnings.  The client programs that
+       understood this returned "blob" don't even currently compile...
+       Disabled until needed in the future.  /\/\|=mhw=|\/\/  12/22/2004
+*/
                if ( cmd == 1 ) {
                        PUT_USER(rc, iiSendPendingMail, pIndex++ );
                        PUT_USER(rc, i2InitChannels, pIndex++ );
@@ -3257,6 +3298,7 @@
                }
 
                break;
+#endif
 
        default:
                rc = -ENODEV;
diff -urN linux/drivers/char/ip2/i2ellis.c linux/drivers/char/ip2/i2ellis.c
--- linux/drivers/char/ip2/i2ellis.c    2001/11/06 07:55:58     1.5
+++ linux/drivers/char/ip2/i2ellis.c    2005/01/09 19:34:02     1.5.2.1
@@ -605,7 +605,7 @@
 
        set_current_state( TASK_INTERRUPTIBLE );
 
-       pDelayTimer->expires  = jiffies + ( mseconds + 9 ) / 10;
+       pDelayTimer->expires  = jiffies + ((HZ * mseconds + 999) / 1000);
        pDelayTimer->function = ii2DelayWakeup;
        pDelayTimer->data     = 0;
 
diff -urN linux/drivers/char/ip2/i2ellis.h linux/drivers/char/ip2/i2ellis.h
--- linux/drivers/char/ip2/i2ellis.h    2001/11/06 07:55:59     1.5
+++ linux/drivers/char/ip2/i2ellis.h    2005/01/09 19:34:02     1.5.2.1
@@ -403,7 +403,6 @@
 //     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
diff -urN linux/drivers/char/ip2/i2lib.c linux/drivers/char/ip2/i2lib.c
--- linux/drivers/char/ip2/i2lib.c      2004/12/27 04:13:45     1.5.2.2
+++ linux/drivers/char/ip2/i2lib.c      2005/01/09 19:34:02     1.5.2.3
@@ -174,8 +174,12 @@
                        pB->i2eWaitingForEmptyFifo |=
                                (pB->i2eOutMailWaiting & MB_OUT_STUFFED);
                        pB->i2eOutMailWaiting = 0;
+                       if( pB->SendPendingRetry ) {
+                               printk( KERN_DEBUG "IP2: iiSendPendingMail: 
busy board pickup on %d\n", pB->SendPendingRetry );
+                       }
                        pB->SendPendingRetry = 0;
                } else {
+#ifdef IP2_USE_TIMER_WAIT
 /*             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
@@ -193,6 +197,11 @@
                        } else {
                                printk( KERN_ERR "IP2: iiSendPendingMail unable 
to queue outbound mail\n" );
                        }
+#endif
+                       pB->SendPendingRetry++;
+                       if( 0 == ( pB->SendPendingRetry % 8 ) ) {
+                               printk( KERN_ERR "IP2: iiSendPendingMail: board 
busy, retry %d\n", pB->SendPendingRetry );
+                       }
                }
        }
 }
@@ -1329,8 +1338,9 @@
        remove_wait_queue(&(pCh->pBookmarkWait), &wait);
 
        // if expires == 0 then timer poped, then do not need to del_timer
+       // jiffy wrap per Tim Schmielau (tim@physik3.uni-rostock.de)
        if ((timeout > 0) && pCh->BookmarkTimer.expires && 
-                            time_before(jiffies, pCh->BookmarkTimer.expires)) {
+                       time_before(jiffies, pCh->BookmarkTimer.expires)) {
                del_timer( &(pCh->BookmarkTimer) );
                pCh->BookmarkTimer.expires = 0;
 
diff -urN linux/drivers/char/ip2/ip2types.h linux/drivers/char/ip2/ip2types.h
--- linux/drivers/char/ip2/ip2types.h   1999/10/09 00:01:15     1.2
+++ linux/drivers/char/ip2/ip2types.h   2005/01/09 19:34:02     1.2.4.1
@@ -49,6 +49,10 @@
        short irq[IP2_MAX_BOARDS]; 
        unsigned short addr[IP2_MAX_BOARDS];
        int type[IP2_MAX_BOARDS];
+#ifdef CONFIG_PCI
+       struct pci_dev *pci_dev[IP2_MAX_BOARDS];
+#endif
+
 } ip2config_t;
 
 #endif
diff -urN linux/drivers/media/video/bttv-if.c 
linux/drivers/media/video/bttv-if.c
--- linux/drivers/media/video/bttv-if.c 2003/11/17 01:07:38     1.5.2.4
+++ linux/drivers/media/video/bttv-if.c 2005/01/09 19:34:02     1.5.2.5
@@ -190,7 +190,6 @@
        return state;
 }
 
-#ifndef I2C_PEC
 static void bttv_inc_use(struct i2c_adapter *adap)
 {
        MOD_INC_USE_COUNT;
@@ -200,7 +199,6 @@
 {
        MOD_DEC_USE_COUNT;
 }
-#endif
 
 static int attach_inform(struct i2c_client *client)
 {
@@ -243,12 +241,8 @@
 };
 
 static struct i2c_adapter bttv_i2c_adap_template = {
-#ifdef I2C_PEC
-       .owner             = THIS_MODULE,
-#else
        .inc_use           = bttv_inc_use,
        .dec_use           = bttv_dec_use,
-#endif
 #ifdef I2C_ADAP_CLASS_TV_ANALOG
        .class             = I2C_ADAP_CLASS_TV_ANALOG,
 #endif
diff -urN linux/drivers/media/video/tvmixer.c 
linux/drivers/media/video/tvmixer.c
--- linux/drivers/media/video/tvmixer.c 2003/11/17 01:07:38     1.6.2.5
+++ linux/drivers/media/video/tvmixer.c 2005/01/09 19:34:02     1.6.2.6
@@ -193,10 +193,8 @@
 
        /* lock bttv in memory while the mixer is in use  */
        file->private_data = mix;
-#ifndef I2C_PEC
        if (client->adapter->inc_use)
                client->adapter->inc_use(client->adapter);
-#endif
         return 0;
 }
 
@@ -210,17 +208,12 @@
                return -ENODEV;
        }
 
-#ifndef I2C_PEC
        if (client->adapter->dec_use)
                client->adapter->dec_use(client->adapter);
-#endif
        return 0;
 }
 
 static struct i2c_driver driver = {
-#ifdef I2C_PEC
-       .owner           = THIS_MODULE,
-#endif
        .name            = "tv card mixer driver",
         .id              = I2C_DRIVERID_TVMIXER,
 #ifdef I2C_DF_DUMMY
diff -urN linux/drivers/net/8139cp.c linux/drivers/net/8139cp.c
--- linux/drivers/net/8139cp.c  2004/08/14 18:38:51     1.3.2.10
+++ linux/drivers/net/8139cp.c  2005/01/09 19:34:02     1.3.2.11
@@ -398,6 +398,8 @@
 static struct pci_device_id cp_pci_tbl[] = {
        { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+       { PCI_VENDOR_ID_TTTECH, PCI_DEVICE_ID_TTTECH_MC322,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
        { },
 };
 MODULE_DEVICE_TABLE(pci, cp_pci_tbl);
diff -urN linux/drivers/net/8390.c linux/drivers/net/8390.c
--- linux/drivers/net/8390.c    2004/08/14 18:38:51     1.27.2.4
+++ linux/drivers/net/8390.c    2005/01/09 19:34:02     1.27.2.5
@@ -1143,7 +1143,7 @@
    
        outb_p(E8390_NODMA+E8390_PAGE0, e8390_base+E8390_CMD);
     
-       if (inb_p(e8390_base) & E8390_TRANS) 
+       if (inb_p(e8390_base+E8390_CMD) & E8390_TRANS) 
        {
                printk(KERN_WARNING "%s: trigger_send() called with the 
transmitter busy.\n",
                        dev->name);
diff -urN linux/drivers/net/pcnet32.c linux/drivers/net/pcnet32.c
--- linux/drivers/net/pcnet32.c 2004/11/19 00:28:39     1.33.2.11
+++ linux/drivers/net/pcnet32.c 2005/01/09 19:34:02     1.33.2.12
@@ -1007,7 +1007,11 @@
        return -EBUSY;
     }
 
-    return pcnet32_probe1(ioaddr, 1, pdev);
+    err = pcnet32_probe1(ioaddr, 1, pdev);
+    if (err < 0) {
+       pci_disable_device(pdev);
+    }
+    return err;
 }
 
 
@@ -2241,6 +2245,7 @@
        release_region(dev->base_addr, PCNET32_TOTAL_SIZE);
        pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr);
        free_netdev(dev);
+       pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
     }
 }
diff -urN linux/drivers/net/e1000/e1000.h linux/drivers/net/e1000/e1000.h
--- linux/drivers/net/e1000/e1000.h     2004/11/19 00:28:40     1.2.2.10
+++ linux/drivers/net/e1000/e1000.h     2005/01/09 19:34:03     1.2.2.11
@@ -86,7 +86,7 @@
 
 #include "e1000_hw.h"
 
-#if DBG
+#ifdef DBG
 #define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
 #else
 #define E1000_DBG(args...)
@@ -204,7 +204,7 @@
        spinlock_t stats_lock;
        atomic_t irq_sem;
        struct tq_struct tx_timeout_task;
-       uint8_t fc_autoneg;
+       uint8_t fc_autoneg;
 
        struct timer_list blink_timer;
        unsigned long led_status;
diff -urN linux/drivers/net/e1000/e1000_ethtool.c 
linux/drivers/net/e1000/e1000_ethtool.c
--- linux/drivers/net/e1000/e1000_ethtool.c     2004/11/29 17:47:16     1.2.2.11
+++ linux/drivers/net/e1000/e1000_ethtool.c     2005/01/09 19:34:03     1.2.2.12
@@ -776,7 +776,7 @@
 e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
 {
        struct net_device *netdev = adapter->netdev;
-       uint32_t icr, mask, i=0, shared_int = TRUE;
+       uint32_t mask, i=0, shared_int = TRUE;
        uint32_t irq = adapter->pdev->irq;
 
        *data = 0;
@@ -784,7 +784,8 @@
        /* Hook up test interrupt handler just for this test */
        if(!request_irq(irq, &e1000_test_intr, 0, netdev->name, netdev)) {
                shared_int = FALSE;
-       } else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ, netdev->name, 
netdev)){
+       } else if(request_irq(irq, &e1000_test_intr, SA_SHIRQ, 
+                       netdev->name, netdev)){
                *data = 1;
                return -1;
        }
@@ -793,21 +794,6 @@
        E1000_WRITE_REG(&adapter->hw, IMC, 0xFFFFFFFF);
        msec_delay(10);
 
-       /* Interrupts are disabled, so read interrupt cause
-        * register (icr) twice to verify that there are no interrupts
-        * pending.  icr is clear on read.
-        */
-       icr = E1000_READ_REG(&adapter->hw, ICR);
-       icr = E1000_READ_REG(&adapter->hw, ICR);
-
-       if(icr != 0) {
-               /* if icr is non-zero, there is no point
-                * running other interrupt tests.
-                */
-               *data = 2;
-               i = 10;
-       }
-
        /* Test each interrupt */
        for(; i < 10; i++) {
 
@@ -856,8 +842,10 @@
                         * test failed.
                         */
                        adapter->test_icr = 0;
-                       E1000_WRITE_REG(&adapter->hw, IMC, ~mask);
-                       E1000_WRITE_REG(&adapter->hw, ICS, ~mask);
+                       E1000_WRITE_REG(&adapter->hw, IMC, 
+                                       (~mask & 0x00007FFF));
+                       E1000_WRITE_REG(&adapter->hw, ICS, 
+                                       (~mask & 0x00007FFF));
                        msec_delay(10);
 
                        if(adapter->test_icr) {
@@ -1335,10 +1323,17 @@
 
        msec_delay(200);
 
-       pci_dma_sync_single(pdev, rxdr->buffer_info[0].dma,
-                           rxdr->buffer_info[0].length, PCI_DMA_FROMDEVICE);
+       i = 0;
+       do {
+               pci_dma_sync_single(pdev, rxdr->buffer_info[i].dma,
+                                           rxdr->buffer_info[i].length,
+                                           PCI_DMA_FROMDEVICE);
+
+               if (!e1000_check_lbtest_frame(rxdr->buffer_info[i++].skb, 1024))
+                       return 0;
+       } while (i < 64);
 
-       return e1000_check_lbtest_frame(rxdr->buffer_info[0].skb, 1024);
+       return 13;
 }
 
 static int
@@ -1357,10 +1352,27 @@
 e1000_link_test(struct e1000_adapter *adapter, uint64_t *data)
 {
        *data = 0;
-       e1000_check_for_link(&adapter->hw);
 
-       if(!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
-               *data = 1;
+       if (adapter->hw.media_type == e1000_media_type_internal_serdes) {
+               int i = 0;
+               adapter->hw.serdes_link_down = TRUE;
+
+               /* on some blade server designs link establishment */
+               /* could take as long as 2-3 minutes.              */
+               do {
+                       e1000_check_for_link(&adapter->hw);
+                       if (adapter->hw.serdes_link_down == FALSE)
+                               return *data;
+                       msec_delay(20);
+               } while (i++ < 3750);
+
+               *data = 1; 
+       } else {
+               e1000_check_for_link(&adapter->hw);
+
+               if(!(E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU)) {
+                       *data = 1;
+               }
        }
        return *data;
 }
@@ -1489,6 +1501,8 @@
        case E1000_DEV_ID_82543GC_COPPER:
        case E1000_DEV_ID_82544EI_FIBER:
        case E1000_DEV_ID_82546EB_QUAD_COPPER:
+       case E1000_DEV_ID_82545EM_FIBER:
+       case E1000_DEV_ID_82545EM_COPPER:
                return wol->wolopts ? -EOPNOTSUPP : 0;
 
        case E1000_DEV_ID_82546EB_FIBER:
diff -urN linux/drivers/net/e1000/e1000_hw.c linux/drivers/net/e1000/e1000_hw.c
--- linux/drivers/net/e1000/e1000_hw.c  2004/11/29 17:47:17     1.1.2.9
+++ linux/drivers/net/e1000/e1000_hw.c  2005/01/09 19:34:03     1.1.2.10
@@ -123,17 +123,31 @@
 static void
 e1000_phy_init_script(struct e1000_hw *hw)
 {
+    uint32_t ret_val;
+    uint16_t phy_saved_data;
+
     DEBUGFUNC("e1000_phy_init_script");
 
-    
+
     if(hw->phy_init_script) {
         msec_delay(20);
 
+        /* Save off the current value of register 0x2F5B to be restored at
+         * the end of this routine. */
+        ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
+
+        /* Disabled the PHY transmitter */
+        e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
+
+        msec_delay(20);
+
         e1000_write_phy_reg(hw,0x0000,0x0140);
 
         msec_delay(5);
 
-        if(hw->mac_type == e1000_82541 || hw->mac_type == e1000_82547) {
+        switch(hw->mac_type) {
+        case e1000_82541:
+        case e1000_82547:
             e1000_write_phy_reg(hw, 0x1F95, 0x0001);
 
             e1000_write_phy_reg(hw, 0x1F71, 0xBD21);
@@ -151,12 +165,23 @@
             e1000_write_phy_reg(hw, 0x1F96, 0x003F);
 
             e1000_write_phy_reg(hw, 0x2010, 0x0008);
-        } else {
+            break;
+
+        case e1000_82541_rev_2:
+        case e1000_82547_rev_2:
             e1000_write_phy_reg(hw, 0x1F73, 0x0099);
+            break;
+        default:
+            break;
         }
 
         e1000_write_phy_reg(hw, 0x0000, 0x3300);
 
+        msec_delay(20);
+
+        /* Now enable the transmitter */
+        e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
+
         if(hw->mac_type == e1000_82547) {
             uint16_t fused, fine, coarse;
 
@@ -245,6 +270,7 @@
     case E1000_DEV_ID_82546GB_COPPER:
     case E1000_DEV_ID_82546GB_FIBER:
     case E1000_DEV_ID_82546GB_SERDES:
+    case E1000_DEV_ID_82546GB_PCIE:
         hw->mac_type = e1000_82546_rev_3;
         break;
     case E1000_DEV_ID_82541EI:
@@ -968,7 +994,7 @@
 
             if((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) 
{
                 hw->dsp_config_state = e1000_dsp_config_disabled;
-                /* Force MDI for IGP B-0 PHY */
+                /* Force MDI for earlier revs of the IGP PHY */
                 phy_data &= ~(IGP01E1000_PSCR_AUTO_MDIX |
                               IGP01E1000_PSCR_FORCE_MDI_MDIX);
                 hw->mdix = 1;
@@ -2113,7 +2139,7 @@
          * at gigabit speed, then TBI compatibility is not needed.  If we are
          * at gigabit speed, we turn on TBI compatibility.
          */
-       if(hw->tbi_compatibility_en) {
+        if(hw->tbi_compatibility_en) {
             uint16_t speed, duplex;
             e1000_get_speed_and_duplex(hw, &speed, &duplex);
             if(speed != SPEED_1000) {
@@ -2473,8 +2499,9 @@
        (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
         ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
                                          (uint16_t)reg_addr);
-        if(ret_val)
+        if(ret_val) {
             return ret_val;
+        }
     }
 
     ret_val = e1000_read_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT & reg_addr,
@@ -2578,8 +2605,9 @@
        (reg_addr > MAX_PHY_MULTI_PAGE_REG)) {
         ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT,
                                          (uint16_t)reg_addr);
-        if(ret_val)
+        if(ret_val) {
             return ret_val;
+        }
     }
 
     ret_val = e1000_write_phy_reg_ex(hw, IGP01E1000_PHY_PAGE_SELECT & reg_addr,
@@ -3482,7 +3510,7 @@
     /* A check for invalid values:  offset too large, too many words, and not
      * enough words.
      */
-    if((offset > eeprom->word_size) || (words > eeprom->word_size - offset) ||
+    if((offset >= eeprom->word_size) || (words > eeprom->word_size - offset) ||
        (words == 0)) {
         DEBUGOUT("\"words\" parameter out of bounds\n");
         return -E1000_ERR_EEPROM;
@@ -3628,11 +3656,10 @@
 
     DEBUGFUNC("e1000_write_eeprom");
 
-
     /* A check for invalid values:  offset too large, too many words, and not
      * enough words.
      */
-    if((offset > eeprom->word_size) || (words > eeprom->word_size - offset) ||
+    if((offset >= eeprom->word_size) || (words > eeprom->word_size - offset) ||
        (words == 0)) {
         DEBUGOUT("\"words\" parameter out of bounds\n");
         return -E1000_ERR_EEPROM;
@@ -4924,7 +4951,7 @@
                                    boolean_t link_up)
 {
     int32_t ret_val;
-    uint16_t phy_data, speed, duplex, i;
+    uint16_t phy_data, phy_saved_data, speed, duplex, i;
     uint16_t dsp_reg_array[IGP01E1000_PHY_CHANNEL_NUM] =
                                         {IGP01E1000_PHY_AGC_PARAM_A,
                                         IGP01E1000_PHY_AGC_PARAM_B,
@@ -5005,6 +5032,21 @@
         }
     } else {
         if(hw->dsp_config_state == e1000_dsp_config_activated) {
+            /* Save off the current value of register 0x2F5B to be restored at
+             * the end of the routines. */
+            ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
+
+            if(ret_val)
+                return ret_val;
+
+            /* Disable the PHY transmitter */
+            ret_val = e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
+
+            if(ret_val)
+                return ret_val;
+
+            msec_delay(20);
+
             ret_val = e1000_write_phy_reg(hw, 0x0000,
                                           IGP01E1000_IEEE_FORCE_GIGA);
             if(ret_val)
@@ -5027,10 +5069,33 @@
             if(ret_val)
                 return ret_val;
 
+            msec_delay(20);
+
+            /* Now enable the transmitter */
+            ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
+
+            if(ret_val)
+                return ret_val;
+
             hw->dsp_config_state = e1000_dsp_config_enabled;
         }
 
         if(hw->ffe_config_state == e1000_ffe_config_active) {
+            /* Save off the current value of register 0x2F5B to be restored at
+             * the end of the routines. */
+            ret_val = e1000_read_phy_reg(hw, 0x2F5B, &phy_saved_data);
+
+            if(ret_val)
+                return ret_val;
+
+            /* Disable the PHY transmitter */
+            ret_val = e1000_write_phy_reg(hw, 0x2F5B, 0x0003);
+
+            if(ret_val)
+                return ret_val;
+
+            msec_delay(20);
+
             ret_val = e1000_write_phy_reg(hw, 0x0000,
                                           IGP01E1000_IEEE_FORCE_GIGA);
             if(ret_val)
@@ -5044,6 +5109,15 @@
                                           IGP01E1000_IEEE_RESTART_AUTONEG);
             if(ret_val)
                 return ret_val;
+
+            msec_delay(20);
+
+            /* Now enable the transmitter */
+            ret_val = e1000_write_phy_reg(hw, 0x2F5B, phy_saved_data);
+
+            if(ret_val)
+                return ret_val;
+
             hw->ffe_config_state = e1000_ffe_config_enabled;
         }
     }
@@ -5132,14 +5206,29 @@
          * Dx states where the power conservation is most important.  During
          * driver activity we should enable SmartSpeed, so performance is
          * maintained. */
-        ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 
&phy_data);
-        if(ret_val)
-            return ret_val;
+        if (hw->smart_speed == e1000_smart_speed_on) {
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                         &phy_data);
+            if(ret_val)
+                return ret_val;
 
-        phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
-        ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG, 
phy_data);
-        if(ret_val)
-            return ret_val;
+            phy_data |= IGP01E1000_PSCFR_SMART_SPEED;
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                          phy_data);
+            if(ret_val)
+                return ret_val;
+        } else if (hw->smart_speed == e1000_smart_speed_off) {
+            ret_val = e1000_read_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                         &phy_data);
+           if (ret_val)
+                return ret_val;
+
+            phy_data &= ~IGP01E1000_PSCFR_SMART_SPEED;
+            ret_val = e1000_write_phy_reg(hw, IGP01E1000_PHY_PORT_CONFIG,
+                                          phy_data);
+            if(ret_val)
+                return ret_val;
+        }
 
     } else if((hw->autoneg_advertised == AUTONEG_ADVERTISE_SPEED_DEFAULT) ||
               (hw->autoneg_advertised == AUTONEG_ADVERTISE_10_ALL ) ||
diff -urN linux/drivers/net/e1000/e1000_hw.h linux/drivers/net/e1000/e1000_hw.h
--- linux/drivers/net/e1000/e1000_hw.h  2004/11/19 00:28:40     1.1.2.8
+++ linux/drivers/net/e1000/e1000_hw.h  2005/01/09 19:34:03     1.1.2.9
@@ -169,6 +169,12 @@
 } e1000_downshift;
 
 typedef enum {
+    e1000_smart_speed_default = 0,
+    e1000_smart_speed_on,
+    e1000_smart_speed_off
+} e1000_smart_speed;
+
+typedef enum {
     e1000_polarity_reversal_enabled = 0,
     e1000_polarity_reversal_disabled,
     e1000_polarity_reversal_undefined = 0xFF
@@ -362,6 +368,7 @@
 #define E1000_DEV_ID_82546GB_COPPER      0x1079
 #define E1000_DEV_ID_82546GB_FIBER       0x107A
 #define E1000_DEV_ID_82546GB_SERDES      0x107B
+#define E1000_DEV_ID_82546GB_PCIE        0x108A
 #define E1000_DEV_ID_82547EI             0x1019
 #define NODE_ADDRESS_SIZE 6
 #define ETH_LENGTH_OF_ADDRESS 6
@@ -1027,6 +1034,7 @@
     uint8_t perm_mac_addr[NODE_ADDRESS_SIZE];
     boolean_t disable_polarity_correction;
     boolean_t speed_downgraded;
+    e1000_smart_speed smart_speed;
     e1000_dsp_config dsp_config_state;
     boolean_t get_link_status;
     boolean_t serdes_link_down;
diff -urN linux/drivers/net/e1000/e1000_main.c 
linux/drivers/net/e1000/e1000_main.c
--- linux/drivers/net/e1000/e1000_main.c        2004/11/29 17:47:17     1.4.2.11
+++ linux/drivers/net/e1000/e1000_main.c        2005/01/09 19:34:03     1.4.2.12
@@ -34,11 +34,15 @@
  * - if_mii support and associated kcompat for older kernels
  * - More errlogging support from Jon Mason <jonmason@us.ibm.com>
  * - Fix TSO issues on PPC64 machines -- Jon Mason <jonmason@us.ibm.com>
- *
- * 5.3.11      6/4/04
- * - ethtool register dump reads MANC register conditionally.
- *
- * 5.3.10      6/1/04
+ * 5.6.5       11/01/04
+ * - Enabling NETIF_F_SG without checksum offload is illegal - 
+     John Mason <jdmason@us.ibm.com>
+ * 5.6.3        10/26/04
+ * - Remove redundant initialization - Jamal Hadi
+ * - Reset buffer_info->dma in tx resource cleanup logic
+ * 5.6.2       10/12/04
+ * - Sparse cleanup - shemminger@osdl.org
+ * - Fix tx resource cleanup logic
  */
 
 char e1000_driver_name[] = "e1000";
@@ -48,7 +52,7 @@
 #else
 #define DRIVERNAPI "-NAPI"
 #endif
-char e1000_driver_version[] = "5.5.4-k1"DRIVERNAPI;
+char e1000_driver_version[] = "5.6.10.1-k1"DRIVERNAPI;
 char e1000_copyright[] = "Copyright (c) 1999-2004 Intel Corporation.";
 
 /* e1000_pci_tbl - PCI Device ID Table
@@ -90,6 +94,7 @@
        INTEL_E1000_ETHERNET_DEVICE(0x107A),
        INTEL_E1000_ETHERNET_DEVICE(0x107B),
        INTEL_E1000_ETHERNET_DEVICE(0x107C),
+       INTEL_E1000_ETHERNET_DEVICE(0x108A),
        /* required last entry */
        {0,}
 };
@@ -128,8 +133,6 @@
 static struct net_device_stats * e1000_get_stats(struct net_device *netdev);
 static int e1000_change_mtu(struct net_device *netdev, int new_mtu);
 static int e1000_set_mac(struct net_device *netdev, void *p);
-static void e1000_irq_disable(struct e1000_adapter *adapter);
-static void e1000_irq_enable(struct e1000_adapter *adapter);
 static irqreturn_t e1000_intr(int irq, void *data, struct pt_regs *regs);
 static boolean_t e1000_clean_tx_irq(struct e1000_adapter *adapter);
 #ifdef CONFIG_E1000_NAPI
@@ -146,9 +149,6 @@
 void set_ethtool_ops(struct net_device *netdev);
 static void e1000_enter_82542_rst(struct e1000_adapter *adapter);
 static void e1000_leave_82542_rst(struct e1000_adapter *adapter);
-static void e1000_rx_checksum(struct e1000_adapter *adapter,
-                              struct e1000_rx_desc *rx_desc,
-                              struct sk_buff *skb);
 static void e1000_tx_timeout(struct net_device *dev);
 static void e1000_tx_timeout_task(struct net_device *dev);
 static void e1000_smartspeed(struct e1000_adapter *adapter);
@@ -242,6 +242,33 @@
 
 module_exit(e1000_exit_module);
 
+/**
+ * e1000_irq_disable - Mask off interrupt generation on the NIC
+ * @adapter: board private structure
+ **/
+
+static inline void
+e1000_irq_disable(struct e1000_adapter *adapter)
+{
+       atomic_inc(&adapter->irq_sem);
+       E1000_WRITE_REG(&adapter->hw, IMC, ~0);
+       E1000_WRITE_FLUSH(&adapter->hw);
+       synchronize_irq();
+}
+
+/**
+ * e1000_irq_enable - Enable default interrupt generation settings
+ * @adapter: board private structure
+ **/
+
+static inline void
+e1000_irq_enable(struct e1000_adapter *adapter)
+{
+       if(likely(atomic_dec_and_test(&adapter->irq_sem))) {
+               E1000_WRITE_REG(&adapter->hw, IMS, IMS_ENABLE_MASK);
+               E1000_WRITE_FLUSH(&adapter->hw);
+       }
+}
 
 int
 e1000_up(struct e1000_adapter *adapter)
@@ -475,8 +502,6 @@
                                   NETIF_F_HW_VLAN_TX |
                                   NETIF_F_HW_VLAN_RX |
                                   NETIF_F_HW_VLAN_FILTER;
-       } else {
-               netdev->features = NETIF_F_SG;
        }
 
 #ifdef NETIF_F_TSO
@@ -1056,6 +1081,24 @@
        adapter->tx_ring.desc = NULL;
 }
 
+static inline void
+e1000_unmap_and_free_tx_resource(struct e1000_adapter *adapter,
+                       struct e1000_buffer *buffer_info)
+{
+       struct pci_dev *pdev = adapter->pdev;
+       if(buffer_info->dma) {
+               pci_unmap_page(pdev,
+                              buffer_info->dma,
+                              buffer_info->length,
+                              PCI_DMA_TODEVICE);
+               buffer_info->dma = 0;
+       }
+       if(buffer_info->skb) {
+               dev_kfree_skb_any(buffer_info->skb);
+               buffer_info->skb = NULL;
+       }
+}
+
 /**
  * e1000_clean_tx_ring - Free Tx Buffers
  * @adapter: board private structure
@@ -1066,7 +1109,6 @@
 {
        struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
        struct e1000_buffer *buffer_info;
-       struct pci_dev *pdev = adapter->pdev;
        unsigned long size;
        unsigned int i;
 
@@ -1074,17 +1116,7 @@
 
        for(i = 0; i < tx_ring->count; i++) {
                buffer_info = &tx_ring->buffer_info[i];
-               if(buffer_info->skb) {
-
-                       pci_unmap_page(pdev,
-                                      buffer_info->dma,
-                                      buffer_info->length,
-                                      PCI_DMA_TODEVICE);
-
-                       dev_kfree_skb(buffer_info->skb);
-
-                       buffer_info->skb = NULL;
-               }
+               e1000_unmap_and_free_tx_resource(adapter, buffer_info);
        }
 
        size = sizeof(struct e1000_buffer) * tx_ring->count;
@@ -1262,9 +1294,12 @@
        uint32_t rctl;
        uint32_t hash_value;
        int i;
+       unsigned long flags;
 
        /* Check for Promiscuous and All Multicast modes */
 
+       spin_lock_irqsave(&adapter->tx_lock, flags);
+
        rctl = E1000_READ_REG(hw, RCTL);
 
        if(netdev->flags & IFF_PROMISC) {
@@ -1313,6 +1348,8 @@
 
        if(hw->mac_type == e1000_82542_rev2_0)
                e1000_leave_82542_rst(adapter);
+
+       spin_unlock_irqrestore(&adapter->tx_lock, flags);
 }
 
 /* Need to wait a few seconds after link up to get diagnostic information from
@@ -1752,7 +1789,6 @@
        unsigned int mss = 0;
        int count = 0;
        unsigned int f;
-       nr_frags = skb_shinfo(skb)->nr_frags;
        len -= skb->data_len;
 
        if(unlikely(skb->len <= 0)) {
@@ -1796,22 +1832,22 @@
 
        /* need: count + 2 desc gap to keep tail from touching
         * head, otherwise try next time */
-       if(E1000_DESC_UNUSED(&adapter->tx_ring) < count + 2) {
+       if(unlikely(E1000_DESC_UNUSED(&adapter->tx_ring) < count + 2)) {
                netif_stop_queue(netdev);
                spin_unlock_irqrestore(&adapter->tx_lock, flags);
                return 1;
        }
 
-       spin_unlock_irqrestore(&adapter->tx_lock, flags);
-
        if(unlikely(adapter->hw.mac_type == e1000_82547)) {
                if(unlikely(e1000_82547_fifo_workaround(adapter, skb))) {
                        netif_stop_queue(netdev);
                        mod_timer(&adapter->tx_fifo_stall_timer, jiffies);
                        return 1;
+                       spin_unlock_irqrestore(&adapter->tx_lock, flags);
                }
        }
 
+       spin_unlock_irqrestore(&adapter->tx_lock, flags);
        if(unlikely(adapter->vlgrp && vlan_tx_tag_present(skb))) {
                tx_flags |= E1000_TX_FLAGS_VLAN;
                tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
@@ -1889,9 +1925,9 @@
        int max_frame = new_mtu + ENET_HEADER_SIZE + ETHERNET_FCS_SIZE;
 
        if((max_frame < MINIMUM_ETHERNET_FRAME_SIZE) ||
-          (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-               DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
-               return -EINVAL;
+               (max_frame > MAX_JUMBO_FRAME_SIZE)) {
+                       DPRINTK(PROBE, ERR, "Invalid MTU setting\n");
+                       return -EINVAL;
        }
 
        if(max_frame <= MAXIMUM_ETHERNET_FRAME_SIZE) {
@@ -2059,34 +2095,6 @@
 }
 
 /**
- * e1000_irq_disable - Mask off interrupt generation on the NIC
- * @adapter: board private structure
- **/
-
-static void
-e1000_irq_disable(struct e1000_adapter *adapter)
-{
-       atomic_inc(&adapter->irq_sem);
-       E1000_WRITE_REG(&adapter->hw, IMC, ~0);
-       E1000_WRITE_FLUSH(&adapter->hw);
-       synchronize_irq();
-}
-
-/**
- * e1000_irq_enable - Enable default interrupt generation settings
- * @adapter: board private structure
- **/
-
-static void
-e1000_irq_enable(struct e1000_adapter *adapter)
-{
-       if(likely(atomic_dec_and_test(&adapter->irq_sem))) {
-               E1000_WRITE_REG(&adapter->hw, IMS, IMS_ENABLE_MASK);
-               E1000_WRITE_FLUSH(&adapter->hw);
-       }
-}
-
-/**
  * e1000_intr - Interrupt Handler
  * @irq: interrupt number
  * @data: pointer to a network interface device structure
@@ -2147,6 +2155,9 @@
        int tx_cleaned;
        int work_done = 0;
        
+       if (!netif_carrier_ok(netdev))
+               goto quit_polling;
+
        tx_cleaned = e1000_clean_tx_irq(adapter);
        e1000_clean_rx_irq(adapter, &work_done, work_to_do);
 
@@ -2156,7 +2167,7 @@
        /* if no Rx and Tx cleanup work was done, exit the polling mode */
        if(!tx_cleaned || (work_done < work_to_do) || 
                                !netif_running(netdev)) {
-               netif_rx_complete(netdev);
+quit_polling:  netif_rx_complete(netdev);
                e1000_irq_enable(adapter);
                return 0;
        }
@@ -2175,7 +2186,6 @@
 {
        struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
        struct net_device *netdev = adapter->netdev;
-       struct pci_dev *pdev = adapter->pdev;
        struct e1000_tx_desc *tx_desc, *eop_desc;
        struct e1000_buffer *buffer_info;
        unsigned int i, eop;
@@ -2190,20 +2200,7 @@
                        tx_desc = E1000_TX_DESC(*tx_ring, i);
                        buffer_info = &tx_ring->buffer_info[i];
 
-                       if(likely(buffer_info->dma)) {
-                               pci_unmap_page(pdev,
-                                              buffer_info->dma,
-                                              buffer_info->length,
-                                              PCI_DMA_TODEVICE);
-
-                               buffer_info->dma = 0;
-                       }
-
-                       if(buffer_info->skb) {
-                               dev_kfree_skb_any(buffer_info->skb);
-                               buffer_info->skb = NULL;
-                       }
-
+                       e1000_unmap_and_free_tx_resource(adapter, buffer_info);
                        tx_desc->buffer_addr = 0;
                        tx_desc->lower.data = 0;
                        tx_desc->upper.data = 0;
@@ -2230,6 +2227,41 @@
 }
 
 /**
+ * e1000_rx_checksum - Receive Checksum Offload for 82543
+ * @adapter: board private structure
+ * @rx_desc: receive descriptor
+ * @sk_buff: socket buffer with received data
+ **/
+
+static inline void
+e1000_rx_checksum(struct e1000_adapter *adapter,
+                  struct e1000_rx_desc *rx_desc,
+                  struct sk_buff *skb)
+{
+       /* 82543 or newer only */
+       if(unlikely((adapter->hw.mac_type < e1000_82543) ||
+       /* Ignore Checksum bit is set */
+       (rx_desc->status & E1000_RXD_STAT_IXSM) ||
+       /* TCP Checksum has not been calculated */
+       (!(rx_desc->status & E1000_RXD_STAT_TCPCS)))) {
+               skb->ip_summed = CHECKSUM_NONE;
+               return;
+       }
+
+       /* At this point we know the hardware did the TCP checksum */
+       /* now look at the TCP checksum error bit */
+       if(rx_desc->errors & E1000_RXD_ERR_TCPE) {
+               /* let the stack verify checksum errors */
+               skb->ip_summed = CHECKSUM_NONE;
+               adapter->hw_csum_err++;
+       } else {
+               /* TCP checksum is good */
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+               adapter->hw_csum_good++;
+       }
+}
+
+/**
  * e1000_clean_rx_irq - Send received data up the network stack
  * @adapter: board private structure
  **/
@@ -2277,7 +2309,7 @@
                if(unlikely(!(rx_desc->status & E1000_RXD_STAT_EOP))) {
                        /* All receives must fit into a single buffer */
                        E1000_DBG("%s: Receive packet consumed multiple"
-                                 " buffers\n", netdev->name);
+                                       " buffers\n", netdev->name);
                        dev_kfree_skb_irq(skb);
                        goto next_desc;
                }
@@ -2575,41 +2607,6 @@
        return E1000_SUCCESS;
 }
 
-/**
- * e1000_rx_checksum - Receive Checksum Offload for 82543
- * @adapter: board private structure
- * @rx_desc: receive descriptor
- * @sk_buff: socket buffer with received data
- **/
-
-static void
-e1000_rx_checksum(struct e1000_adapter *adapter,
-                  struct e1000_rx_desc *rx_desc,
-                  struct sk_buff *skb)
-{
-       /* 82543 or newer only */
-       if(unlikely((adapter->hw.mac_type < e1000_82543) ||
-       /* Ignore Checksum bit is set */
-       (rx_desc->status & E1000_RXD_STAT_IXSM) ||
-       /* TCP Checksum has not been calculated */
-       (!(rx_desc->status & E1000_RXD_STAT_TCPCS)))) {
-               skb->ip_summed = CHECKSUM_NONE;
-               return;
-       }
-
-       /* At this point we know the hardware did the TCP checksum */
-       /* now look at the TCP checksum error bit */
-       if(rx_desc->errors & E1000_RXD_ERR_TCPE) {
-               /* let the stack verify checksum errors */
-               skb->ip_summed = CHECKSUM_NONE;
-               adapter->hw_csum_err++;
-       } else {
-               /* TCP checksum is good */
-               skb->ip_summed = CHECKSUM_UNNECESSARY;
-               adapter->hw_csum_good++;
-       }
-}
-
 void
 e1000_pci_set_mwi(struct e1000_hw *hw)
 {
diff -urN linux/drivers/net/e1000/e1000_osdep.h 
linux/drivers/net/e1000/e1000_osdep.h
--- linux/drivers/net/e1000/e1000_osdep.h       2004/11/19 00:28:40     1.2.2.9
+++ linux/drivers/net/e1000/e1000_osdep.h       2005/01/09 19:34:03     1.2.2.10
@@ -69,7 +69,7 @@
 
 #define MSGOUT(S, A, B)        printk(KERN_DEBUG S "\n", A, B)
 
-#if DBG
+#ifdef DBG
 #define DEBUGOUT(S)            printk(KERN_DEBUG S "\n")
 #define DEBUGOUT1(S, A...)     printk(KERN_DEBUG S "\n", A)
 #else
diff -urN linux/drivers/net/e1000/e1000_param.c 
linux/drivers/net/e1000/e1000_param.c
--- linux/drivers/net/e1000/e1000_param.c       2004/11/29 17:47:17     1.2.2.9
+++ linux/drivers/net/e1000/e1000_param.c       2005/01/09 19:34:03     1.2.2.10
@@ -447,9 +447,6 @@
 
                        adapter->itr = InterruptThrottleRate[bd];
                        switch(adapter->itr) {
-                       case -1:
-                               adapter->itr = 1;
-                               break;
                        case 0:
                                DPRINTK(PROBE, INFO, "%s turned off\n", 
                                        opt.name);
@@ -458,6 +455,7 @@
                                DPRINTK(PROBE, INFO, "%s set to dynamic 
mode\n", 
                                        opt.name);
                                break;
+                       case -1:
                        default:
                                e1000_validate_option(&adapter->itr, &opt, 
                                        adapter);
diff -urN linux/drivers/net/wireless/prism54/isl_38xx.c 
linux/drivers/net/wireless/prism54/isl_38xx.c
--- linux/drivers/net/wireless/prism54/isl_38xx.c       2004/11/19 00:28:41     
1.6.2.1
+++ linux/drivers/net/wireless/prism54/isl_38xx.c       2005/01/09 19:34:03     
1.6.2.2
@@ -44,7 +44,7 @@
  *  register located at offset %ISL38XX_INT_IDENT_REG.
  */
 void
-isl38xx_disable_interrupts(void *device)
+isl38xx_disable_interrupts(void __iomem *device)
 {
        isl38xx_w32_flush(device, 0x00000000, ISL38XX_INT_EN_REG);
        udelay(ISL38XX_WRITEIO_DELAY);
@@ -52,7 +52,7 @@
 
 void
 isl38xx_handle_sleep_request(isl38xx_control_block *control_block,
-                            int *powerstate, void *device_base)
+                            int *powerstate, void __iomem *device_base)
 {
        /* device requests to go into sleep mode
         * check whether the transmit queues for data and management are empty 
*/
@@ -88,7 +88,7 @@
 
 void
 isl38xx_handle_wakeup(isl38xx_control_block *control_block,
-                     int *powerstate, void *device_base)
+                     int *powerstate, void __iomem *device_base)
 {
        /* device is in active state, update the powerstate flag */
        *powerstate = ISL38XX_PSM_ACTIVE_STATE;
@@ -110,7 +110,7 @@
 }
 
 void
-isl38xx_trigger_device(int asleep, void *device_base)
+isl38xx_trigger_device(int asleep, void __iomem *device_base)
 {
        struct timeval current_time;
        u32 reg, counter = 0;
@@ -190,7 +190,7 @@
 }
 
 void
-isl38xx_interface_reset(void *device_base, dma_addr_t host_address)
+isl38xx_interface_reset(void __iomem *device_base, dma_addr_t host_address)
 {
 #if VERBOSE > SHOW_ERROR_MESSAGES
        DEBUG(SHOW_FUNCTION_CALLS, "isl38xx_interface_reset\n");
@@ -214,7 +214,7 @@
 }
 
 void
-isl38xx_enable_common_interrupts(void *device_base) {
+isl38xx_enable_common_interrupts(void __iomem *device_base) {
        u32 reg;
        reg = ( ISL38XX_INT_IDENT_UPDATE | 
                        ISL38XX_INT_IDENT_SLEEP | ISL38XX_INT_IDENT_WAKEUP);
diff -urN linux/drivers/net/wireless/prism54/isl_38xx.h 
linux/drivers/net/wireless/prism54/isl_38xx.h
--- linux/drivers/net/wireless/prism54/isl_38xx.h       2004/11/19 00:28:41     
1.5.2.1
+++ linux/drivers/net/wireless/prism54/isl_38xx.h       2005/01/09 19:34:03     
1.5.2.2
@@ -75,7 +75,7 @@
  *  from the %ISL38XX_PCI_POSTING_FLUSH offset.
  */
 static inline void
-isl38xx_w32_flush(void *base, u32 val, unsigned long offset)
+isl38xx_w32_flush(void __iomem *base, u32 val, unsigned long offset)
 {
        writel(val, base + offset);
        (void) readl(base + ISL38XX_PCI_POSTING_FLUSH);
@@ -161,13 +161,13 @@
 /* determine number of entries currently in queue */
 int isl38xx_in_queue(isl38xx_control_block *cb, int queue);
 
-void isl38xx_disable_interrupts(void *);
-void isl38xx_enable_common_interrupts(void *);
+void isl38xx_disable_interrupts(void __iomem *);
+void isl38xx_enable_common_interrupts(void __iomem *);
 
 void isl38xx_handle_sleep_request(isl38xx_control_block *, int *,
-                                 void *);
-void isl38xx_handle_wakeup(isl38xx_control_block *, int *, void *);
-void isl38xx_trigger_device(int, void *);
-void isl38xx_interface_reset(void *, dma_addr_t);
+                                 void __iomem *);
+void isl38xx_handle_wakeup(isl38xx_control_block *, int *, void __iomem *);
+void isl38xx_trigger_device(int, void __iomem *);
+void isl38xx_interface_reset(void __iomem *, dma_addr_t);
 
 #endif                         /* _ISL_38XX_H */
diff -urN linux/drivers/net/wireless/prism54/isl_ioctl.c 
linux/drivers/net/wireless/prism54/isl_ioctl.c
--- linux/drivers/net/wireless/prism54/isl_ioctl.c      2004/11/19 00:28:41     
1.8.2.1
+++ linux/drivers/net/wireless/prism54/isl_ioctl.c      2005/01/09 19:34:03     
1.8.2.2
@@ -1524,31 +1524,35 @@
                     const struct obj_mlme *mlme, int error)
 {
        union iwreq_data wrqu;
+       char *memptr;
 
-       wrqu.data.pointer = kmalloc(IW_CUSTOM_MAX, GFP_KERNEL);
-       if (!wrqu.data.pointer)
+       memptr = kmalloc(IW_CUSTOM_MAX, GFP_KERNEL);
+       if (!memptr)
                return;
+       wrqu.data.pointer = memptr;
        wrqu.data.length = 0;
-       format_event(priv, wrqu.data.pointer, str, mlme, &wrqu.data.length,
+       format_event(priv, memptr, str, mlme, &wrqu.data.length,
                     error);
-       wireless_send_event(priv->ndev, IWEVCUSTOM, &wrqu, wrqu.data.pointer);
-       kfree(wrqu.data.pointer);
+       wireless_send_event(priv->ndev, IWEVCUSTOM, &wrqu, memptr);
+       kfree(memptr);
 }
 
 static void
 send_simple_event(islpci_private *priv, const char *str)
 {
        union iwreq_data wrqu;
+       char *memptr;
        int n = strlen(str);
 
-       wrqu.data.pointer = kmalloc(IW_CUSTOM_MAX, GFP_KERNEL);
-       if (!wrqu.data.pointer)
+       memptr = kmalloc(IW_CUSTOM_MAX, GFP_KERNEL);
+       if (!memptr)
                return;
        BUG_ON(n > IW_CUSTOM_MAX);
+       wrqu.data.pointer = memptr;
        wrqu.data.length = n;
-       strcpy(wrqu.data.pointer, str);
-       wireless_send_event(priv->ndev, IWEVCUSTOM, &wrqu, wrqu.data.pointer);
-       kfree(wrqu.data.pointer);
+       strcpy(memptr, str);
+       wireless_send_event(priv->ndev, IWEVCUSTOM, &wrqu, memptr);
+       kfree(memptr);
 }
 
 static void
diff -urN linux/drivers/net/wireless/prism54/islpci_dev.c 
linux/drivers/net/wireless/prism54/islpci_dev.c
--- linux/drivers/net/wireless/prism54/islpci_dev.c     2004/11/19 00:28:41     
1.8.2.1
+++ linux/drivers/net/wireless/prism54/islpci_dev.c     2005/01/09 19:34:03     
1.8.2.2
@@ -58,7 +58,7 @@
 isl_upload_firmware(islpci_private *priv)
 {
        u32 reg, rc;
-       void *device_base = priv->device_base;
+       void __iomem *device_base = priv->device_base;
 
        /* clear the RAMBoot and the Reset bit */
        reg = readl(device_base + ISL38XX_CTRL_STAT_REG);
@@ -113,7 +113,7 @@
                            (fw_len >
                             ISL38XX_MEMORY_WINDOW_SIZE) ?
                            ISL38XX_MEMORY_WINDOW_SIZE : fw_len;
-                       u32 *dev_fw_ptr = device_base + ISL38XX_DIRECT_MEM_WIN;
+                       u32 __iomem *dev_fw_ptr = device_base + 
ISL38XX_DIRECT_MEM_WIN;
 
                        /* set the cards base address for writting the data */
                        isl38xx_w32_flush(device_base, reg,
@@ -187,7 +187,7 @@
        u32 reg;
        islpci_private *priv = config;
        struct net_device *ndev = priv->ndev;
-       void *device = priv->device_base;
+       void __iomem *device = priv->device_base;
        int powerstate = ISL38XX_PSM_POWERSAVE_STATE;
 
        /* lock the interrupt handler */
@@ -407,7 +407,7 @@
 static int
 prism54_bring_down(islpci_private *priv)
 {
-       void *device_base = priv->device_base;
+       void __iomem *device_base = priv->device_base;
        u32 reg;
        /* we are going to shutdown the device */
        islpci_set_state(priv, PRV_STATE_PREBOOT);
diff -urN linux/drivers/net/wireless/prism54/islpci_dev.h 
linux/drivers/net/wireless/prism54/islpci_dev.h
--- linux/drivers/net/wireless/prism54/islpci_dev.h     2004/11/19 00:28:41     
1.6.2.1
+++ linux/drivers/net/wireless/prism54/islpci_dev.h     2005/01/09 19:34:03     
1.6.2.2
@@ -113,7 +113,7 @@
        u32 pci_state[16];      /* used for suspend/resume */
        char firmware[33];
 
-       void *device_base;      /* ioremapped device base address */
+       void __iomem *device_base;      /* ioremapped device base address */
 
        /* consistent DMA region */
        void *driver_mem_address;       /* base DMA address */
diff -urN linux/drivers/net/wireless/prism54/islpci_hotplug.c 
linux/drivers/net/wireless/prism54/islpci_hotplug.c
--- linux/drivers/net/wireless/prism54/islpci_hotplug.c 2004/11/19 00:28:41     
1.7.2.1
+++ linux/drivers/net/wireless/prism54/islpci_hotplug.c 2005/01/09 19:34:03     
1.7.2.2
@@ -292,6 +292,8 @@
        islpci_private *priv = ndev ? netdev_priv(ndev) : NULL;
        BUG_ON(!priv);
 
+       pci_enable_device(pdev);
+
        printk(KERN_NOTICE "%s: got resume request\n", ndev->name);
 
        pci_restore_state(pdev, priv->pci_state);
diff -urN linux/drivers/net/wireless/prism54/prismcompat.h 
linux/drivers/net/wireless/prism54/prismcompat.h
--- linux/drivers/net/wireless/prism54/prismcompat.h    2004/11/19 00:28:41     
1.1.2.1
+++ linux/drivers/net/wireless/prism54/prismcompat.h    2005/01/09 19:34:03     
1.1.2.2
@@ -38,6 +38,10 @@
 #error Firmware Loading is not configured in the kernel !
 #endif
 
+#ifndef __iomem
+#define __iomem
+#endif
+
 #define prism54_synchronize_irq(irq) synchronize_irq(irq)
 
 #define PRISM_FW_PDEV          &priv->pdev->dev
diff -urN linux/drivers/net/wireless/prism54/prismcompat24.h 
linux/drivers/net/wireless/prism54/prismcompat24.h
--- linux/drivers/net/wireless/prism54/Attic/prismcompat24.h    2004/11/19 
00:28:41     1.1.2.1
+++ linux/drivers/net/wireless/prism54/Attic/prismcompat24.h    2005/01/09 
19:34:03     1.1.2.2
@@ -51,6 +51,10 @@
 #define INIT_WORK              INIT_TQUEUE
 #define schedule_work          schedule_task
 
+#ifndef __iomem
+#define __iomem
+#endif
+
 #if !defined(HAVE_NETDEV_PRIV)
 #define netdev_priv(x)         (x)->priv
 #endif
diff -urN linux/drivers/scsi/ahci.c linux/drivers/scsi/ahci.c
--- linux/drivers/scsi/ahci.c   2004/12/27 04:13:49     1.2.2.2
+++ linux/drivers/scsi/ahci.c   2005/01/09 19:34:03     1.2.2.3
@@ -241,9 +241,13 @@
 
 static struct pci_device_id ahci_pci_tbl[] = {
        { PCI_VENDOR_ID_INTEL, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_ahci },
+         board_ahci }, /* ICH6 */
        { PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-         board_ahci },
+         board_ahci }, /* ICH6M */
+       { PCI_VENDOR_ID_INTEL, 0x27c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH7 */
+       { PCI_VENDOR_ID_INTEL, 0x27c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+         board_ahci }, /* ICH7M */
        { }     /* terminate list */
 };
 
diff -urN linux/drivers/scsi/ata_piix.c linux/drivers/scsi/ata_piix.c
--- linux/drivers/scsi/ata_piix.c       2004/11/29 17:47:17     1.16.2.2
+++ linux/drivers/scsi/ata_piix.c       2005/01/09 19:34:03     1.16.2.3
@@ -60,6 +60,7 @@
        piix4_pata              = 2,
        ich6_sata               = 3,
        ich6_sata_rm            = 4,
+       ich7_sata               = 5,
 };
 
 static int piix_init_one (struct pci_dev *pdev,
@@ -90,6 +91,8 @@
        { 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
        { 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
        { 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
+       { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
+       { 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
 
        { }     /* terminate list */
 };
@@ -230,6 +233,18 @@
        {
                .sht            = &piix_sht,
                .host_flags     = ATA_FLAG_SATA | ATA_FLAG_SRST |
+                                 PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR |
+                                 ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x07, /* mwdma0-2 */
+               .udma_mask      = 0x7f, /* udma0-6 */
+               .port_ops       = &piix_sata_ops,
+       },
+
+       /* ich7_sata */
+       {
+               .sht            = &piix_sht,
+               .host_flags     = ATA_FLAG_SATA | ATA_FLAG_SRST |
                                  PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR |
                                  ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI,
                .pio_mask       = 0x1f, /* pio0-4 */
diff -urN linux/drivers/scsi/libata-core.c linux/drivers/scsi/libata-core.c
--- linux/drivers/scsi/libata-core.c    2004/12/27 04:13:49     1.16.2.4
+++ linux/drivers/scsi/libata-core.c    2005/01/09 19:34:03     1.16.2.5
@@ -28,6 +28,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/list.h>
+#include <linux/mm.h>
 #include <linux/highmem.h>
 #include <linux/spinlock.h>
 #include <linux/blkdev.h>
@@ -1918,7 +1919,24 @@
        if (idx)
                ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
 }
+/**
+ *     ata_check_atapi_dma - Check whether ATAPI DMA can be supported
+ *     @qc: Metadata associated with taskfile to check
+ *
+ *     LOCKING:
+ *     RETURNS: 0 when ATAPI DMA can be used
+ *               nonzero otherwise
+ */
+int ata_check_atapi_dma(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+       int rc = 0; /* Assume ATAPI DMA is OK by default */
+
+       if (ap->ops->check_atapi_dma)
+               rc = ap->ops->check_atapi_dma(qc);
 
+       return rc;
+}
 /**
  *     ata_qc_prep - Prepare taskfile for submission
  *     @qc: Metadata associated with taskfile to be prepared
@@ -2368,6 +2386,9 @@
        unsigned long timeout = 0;
 
        switch (ap->pio_task_state) {
+       case PIO_ST_IDLE:
+               return;
+
        case PIO_ST:
                ata_pio_block(ap);
                break;
@@ -2384,7 +2405,7 @@
        case PIO_ST_TMOUT:
        case PIO_ST_ERR:
                ata_pio_error(ap);
-               break;
+               return;
        }
 
        if (timeout) {
@@ -2392,11 +2413,7 @@
                schedule_timeout(timeout);
        }
 
-       if ((ap->pio_task_state != PIO_ST_IDLE) &&
-           (ap->pio_task_state != PIO_ST_TMOUT) &&
-           (ap->pio_task_state != PIO_ST_ERR)) {
-               schedule_task(&ap->pio_task);
-       }
+       schedule_task(&ap->pio_task);
 }
 
 static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
@@ -2405,7 +2422,6 @@
        DECLARE_COMPLETION(wait);
        struct ata_queued_cmd *qc;
        unsigned long flags;
-       int using_pio = dev->flags & ATA_DFLAG_PIO;
        int rc;
 
        DPRINTK("ATAPI request sense\n");
@@ -2426,16 +2442,10 @@
        qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
        qc->tf.command = ATA_CMD_PACKET;
 
-       if (using_pio) {
-               qc->tf.protocol = ATA_PROT_ATAPI;
-               qc->tf.lbam = (8 * 1024) & 0xff;
-               qc->tf.lbah = (8 * 1024) >> 8;
-
-               qc->nbytes = SCSI_SENSE_BUFFERSIZE;
-       } else {
-               qc->tf.protocol = ATA_PROT_ATAPI_DMA;
-               qc->tf.feature |= ATAPI_PKT_DMA;
-       }
+       qc->tf.protocol = ATA_PROT_ATAPI;
+       qc->tf.lbam = (8 * 1024) & 0xff;
+       qc->tf.lbah = (8 * 1024) >> 8;
+       qc->nbytes = SCSI_SENSE_BUFFERSIZE;
 
        qc->waiting = &wait;
        qc->complete_fn = ata_qc_complete_noop;
@@ -2707,7 +2717,7 @@
                        return 1;
 
                /* fall through */
-       
+
        default:
                return 0;
        }
diff -urN linux/drivers/scsi/libata-scsi.c linux/drivers/scsi/libata-scsi.c
--- linux/drivers/scsi/libata-scsi.c    2004/12/27 04:13:49     1.10.2.4
+++ linux/drivers/scsi/libata-scsi.c    2005/01/09 19:34:03     1.10.2.5
@@ -1256,6 +1256,11 @@
        int using_pio = (dev->flags & ATA_DFLAG_PIO);
        int nodata = (cmd->sc_data_direction == SCSI_DATA_NONE);
 
+       if (!using_pio)
+               /* Check whether ATAPI DMA is safe */
+               if (ata_check_atapi_dma(qc))
+                       using_pio = 1;
+
        memcpy(&qc->cdb, scsicmd, qc->ap->cdb_len);
 
        qc->complete_fn = atapi_qc_complete;
diff -urN linux/drivers/scsi/libata.h linux/drivers/scsi/libata.h
--- linux/drivers/scsi/libata.h 2004/11/29 17:47:17     1.9.2.3
+++ linux/drivers/scsi/libata.h 2005/01/09 19:34:03     1.9.2.4
@@ -38,6 +38,7 @@
 extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
                                      struct ata_device *dev);
 extern int ata_qc_issue(struct ata_queued_cmd *qc);
+extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
 extern void ata_dev_select(struct ata_port *ap, unsigned int device,
                            unsigned int wait, unsigned int can_sleep);
 extern void ata_tf_to_host_nolock(struct ata_port *ap, struct ata_taskfile 
*tf);
diff -urN linux/drivers/scsi/sata_nv.c linux/drivers/scsi/sata_nv.c
--- linux/drivers/scsi/sata_nv.c        2004/11/29 17:47:17     1.8.2.2
+++ linux/drivers/scsi/sata_nv.c        2005/01/09 19:34:03     1.8.2.3
@@ -219,10 +219,18 @@
        .host_stop              = nv_host_stop,
 };
 
+/* FIXME: The hardware provides the necessary SATA PHY controls
+ * to support ATA_FLAG_SATA_RESET.  However, it is currently
+ * necessary to disable that flag, to solve misdetection problems.
+ * See http://bugme.osdl.org/show_bug.cgi?id=3352 for more info.
+ *
+ * This problem really needs to be investigated further.  But in the
+ * meantime, we avoid ATA_FLAG_SATA_RESET to get people working.
+ */
 static struct ata_port_info nv_port_info = {
        .sht            = &nv_sht,
        .host_flags     = ATA_FLAG_SATA |
-                         ATA_FLAG_SATA_RESET |
+                         /* ATA_FLAG_SATA_RESET | */
                          ATA_FLAG_SRST |
                          ATA_FLAG_NO_LEGACY,
        .pio_mask       = NV_PIO_MASK,
diff -urN linux/drivers/scsi/sata_uli.c linux/drivers/scsi/sata_uli.c
--- linux/drivers/scsi/sata_uli.c       2004/11/29 17:47:17     1.2.2.2
+++ linux/drivers/scsi/sata_uli.c       2005/01/09 19:34:03     1.2.2.3
@@ -32,16 +32,18 @@
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_uli"
-#define DRV_VERSION    "0.2"
+#define DRV_VERSION    "0.5"
 
 enum {
        uli_5289                = 0,
        uli_5287                = 1,
+       uli_5281                = 2,
 
        /* PCI configuration registers */
-       ULI_SCR_BASE            = 0x90, /* sata0 phy SCR registers */
-       ULI_SATA1_OFS           = 0x10, /* offset from sata0->sata1 phy regs */
-
+       ULI5287_BASE            = 0x90, /* sata0 phy SCR registers */
+       ULI5287_OFFS            = 0x10, /* offset from sata0->sata1 phy regs */
+       ULI5281_BASE            = 0x60, /* sata0 phy SCR  registers */
+       ULI5281_OFFS            = 0x60, /* offset from sata0->sata1 phy regs */
 };
 
 static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id 
*ent);
@@ -51,6 +53,7 @@
 static struct pci_device_id uli_pci_tbl[] = {
        { PCI_VENDOR_ID_AL, 0x5289, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5289 },
        { PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5287 },
+       { PCI_VENDOR_ID_AL, 0x5281, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5281 },
        { }     /* terminate list */
 };
 
@@ -126,33 +129,15 @@
 MODULE_DEVICE_TABLE(pci, uli_pci_tbl);
 MODULE_VERSION(DRV_VERSION);
 
-static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg)
+static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
 {
-       unsigned int addr = ULI_SCR_BASE + (4 * sc_reg);
-
-       switch (port_no) {
-       case 0:
-               break;
-       case 1:
-               addr += ULI_SATA1_OFS;
-               break;
-       case 2:
-               addr += ULI_SATA1_OFS*4;
-               break;
-       case 3:
-               addr += ULI_SATA1_OFS*5;
-               break;
-       default:
-               BUG();
-               break;
-       }
-       return addr;
+       return ap->ioaddr.scr_addr + (4 * sc_reg);
 }
 
 static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 {
        struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
-       unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, sc_reg);
+       unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
        u32 val;
 
        pci_read_config_dword(pdev, cfg_addr, &val);
@@ -162,7 +147,7 @@
 static void uli_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
 {
        struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
-       unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, scr);
+       unsigned int cfg_addr = get_scr_cfg_addr(ap, scr);
 
        pci_write_config_dword(pdev, cfg_addr, val);
 }
@@ -220,9 +205,11 @@
                rc = -ENOMEM;
                goto err_out_regions;
        }
-
+       
        switch (board_idx) {
        case uli_5287:
+               probe_ent->port[0].scr_addr = ULI5287_BASE;
+               probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
                        probe_ent->n_ports = 4;
 
                        probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 
0) + 8;
@@ -230,19 +217,27 @@
                probe_ent->port[2].ctl_addr =
                        (pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4;
                probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 
16;
+               probe_ent->port[2].scr_addr = ULI5287_BASE + ULI5287_OFFS*4;
 
                probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8;
                probe_ent->port[3].altstatus_addr =
                probe_ent->port[3].ctl_addr =
                        (pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4;
                probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 
24;
+               probe_ent->port[3].scr_addr = ULI5287_BASE + ULI5287_OFFS*5;
 
                ata_std_ports(&probe_ent->port[2]);
                ata_std_ports(&probe_ent->port[3]);
                break;
 
        case uli_5289:
-               /* do nothing; ata_pci_init_native_mode did it all */
+               probe_ent->port[0].scr_addr = ULI5287_BASE;
+               probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
+               break;
+
+       case uli_5281:
+               probe_ent->port[0].scr_addr = ULI5281_BASE;
+               probe_ent->port[1].scr_addr = ULI5281_BASE + ULI5281_OFFS;
                break;
 
        default:
diff -urN linux/drivers/usb/serial/ftdi_sio.c 
linux/drivers/usb/serial/ftdi_sio.c
--- linux/drivers/usb/serial/ftdi_sio.c 2004/08/14 18:38:56     1.21.2.10
+++ linux/drivers/usb/serial/ftdi_sio.c 2005/01/09 19:34:04     1.21.2.11
@@ -449,6 +449,12 @@
 };
 
 
+static struct usb_device_id id_table_userdev [] = {
+       { USB_DEVICE(-1, -1) },
+       { }                                             /* Terminating entry */
+};
+
+
 static __devinitdata struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_IRTRANS_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
@@ -548,6 +554,10 @@
 #define BUFSZ 512
 #define PKTSZ 64
 
+static int vendor =-1, product = -1, baud_base = 48000000/2; 
+    /* User specified VID and Product ID and baud base.  */ 
+
+
 struct ftdi_private {
        ftdi_chip_type_t chip_type;
                                /* type of the device, either SIO or FT8U232AM 
*/
@@ -584,6 +594,7 @@
 static int  ftdi_FT232BM_startup       (struct usb_serial *serial);
 static int  ftdi_USB_UIRT_startup      (struct usb_serial *serial);
 static int  ftdi_HE_TIRA1_startup      (struct usb_serial *serial);
+static int  ftdi_userdev_startup       (struct usb_serial *serial);
 static void ftdi_shutdown              (struct usb_serial *serial);
 static int  ftdi_open                  (struct usb_serial_port *port, struct 
file *filp);
 static void ftdi_close                 (struct usb_serial_port *port, struct 
file *filp);
@@ -727,6 +738,28 @@
 
 
 
+
+static struct usb_serial_device_type ftdi_userdev_device = {
+       .owner =                THIS_MODULE,
+       .name =                 "FTDI SIO compatible",
+       .id_table =             id_table_userdev,
+       .num_interrupt_in =     0,
+       .num_bulk_in =          1,
+       .num_bulk_out =         1,
+       .num_ports =            1,
+       .open =                 ftdi_open,
+       .close =                ftdi_close,
+       .write =                ftdi_write,
+       .write_room =           ftdi_write_room,
+       .read_bulk_callback =   ftdi_read_bulk_callback,
+       .write_bulk_callback =  ftdi_write_bulk_callback,
+       .ioctl =                ftdi_ioctl,
+       .set_termios =          ftdi_set_termios,
+       .break_ctl =            ftdi_break_ctl,
+       .startup =              ftdi_userdev_startup,
+       .shutdown =             ftdi_shutdown,
+};
+
 #define WDR_TIMEOUT (HZ * 5 ) /* default urb timeout */
 
 /* High and low are for DTR, RTS etc etc */
@@ -1216,6 +1249,30 @@
  */
 
 
+/* Startup for the 8U232AM chip */
+static int ftdi_userdev_startup (struct usb_serial *serial)
+{
+       struct ftdi_private *priv;
+
+       priv = serial->port->private = kmalloc(sizeof(struct ftdi_private), 
GFP_KERNEL);
+       if (!priv){
+               err("%s- kmalloc(%Zd) failed.", __FUNCTION__, sizeof(struct 
ftdi_private));
+               return -ENOMEM;
+       }
+
+       priv->chip_type = FT8U232AM; /* XXX: Hmm. Keep this.... -- REW */
+       priv->baud_base = baud_base; 
+       priv->custom_divisor = 0;
+       priv->write_offset = 0;
+        init_waitqueue_head(&priv->delta_msr_wait);
+       /* This will push the characters through immediately rather
+          than queue a task to deliver them */
+       priv->flags = ASYNC_LOW_LATENCY;
+       
+       return (0);
+}
+
+
 static void ftdi_shutdown (struct usb_serial *serial)
 { /* ftdi_shutdown */
        
@@ -2134,6 +2191,14 @@
        usb_serial_register (&ftdi_USB_UIRT_device);
        usb_serial_register (&ftdi_HE_TIRA1_device);
 
+       if (vendor != -1) {
+               /* User specified USB vendor and device id */
+               /* The macro initialized "matchvendor" as the matching flags */
+               id_table_userdev[0].idVendor = vendor; 
+               id_table_userdev[0].idProduct = product;
+               usb_serial_register (&ftdi_userdev_device);
+       }
+       
 
        info(DRIVER_VERSION ":" DRIVER_DESC);
        return 0;
@@ -2164,3 +2229,8 @@
 MODULE_PARM(debug, "i");
 MODULE_PARM_DESC(debug, "Debug enabled or not");
 
+MODULE_PARM(vendor, "i");
+MODULE_PARM_DESC(vendor, "User specified USB idVendor");
+
+MODULE_PARM(product, "i");
+MODULE_PARM_DESC(product, "User specified USB idProduct");
diff -urN linux/fs/binfmt_aout.c linux/fs/binfmt_aout.c
--- linux/fs/binfmt_aout.c      2004/12/27 04:13:51     1.37.2.1
+++ linux/fs/binfmt_aout.c      2005/01/09 19:34:04     1.37.2.2
@@ -46,7 +46,7 @@
        start = PAGE_ALIGN(start);
        end = PAGE_ALIGN(end);
        if (end > start) {
-               unsigned long addr = do_brk(start, end - start);
+               unsigned long addr = do_brk_locked(start, end - start);
                if (BAD_ADDR(addr))
                        return addr;
        }
@@ -317,10 +317,10 @@
                loff_t pos = fd_offset;
                /* Fuck me plenty... */
                /* <AOL></AOL> */
-               error = do_brk(N_TXTADDR(ex), ex.a_text);
+               error = do_brk_locked(N_TXTADDR(ex), ex.a_text);
                bprm->file->f_op->read(bprm->file, (char *) N_TXTADDR(ex),
                          ex.a_text, &pos);
-               error = do_brk(N_DATADDR(ex), ex.a_data);
+               error = do_brk_locked(N_DATADDR(ex), ex.a_data);
                bprm->file->f_op->read(bprm->file, (char *) N_DATADDR(ex),
                          ex.a_data, &pos);
                goto beyond_if;
@@ -341,7 +341,7 @@
                map_size = ex.a_text+ex.a_data;
 #endif
 
-               error = do_brk(text_addr & PAGE_MASK, map_size);
+               error = do_brk_locked(text_addr & PAGE_MASK, map_size);
                if (error != (text_addr & PAGE_MASK)) {
                        send_sig(SIGKILL, current, 0);
                        return error;
@@ -375,7 +375,7 @@
 
                if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
                        loff_t pos = fd_offset;
-                       do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
+                       do_brk_locked(N_TXTADDR(ex), ex.a_text+ex.a_data);
                        bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex),
                                        ex.a_text+ex.a_data, &pos);
                        flush_icache_range((unsigned long) N_TXTADDR(ex),
@@ -476,7 +476,7 @@
                        error_time = jiffies;
                }
 
-               do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
+               do_brk_locked(start_addr, ex.a_text + ex.a_data + ex.a_bss);
                
                file->f_op->read(file, (char *)start_addr,
                        ex.a_text + ex.a_data, &pos);
@@ -500,7 +500,7 @@
        len = PAGE_ALIGN(ex.a_text + ex.a_data);
        bss = ex.a_text + ex.a_data + ex.a_bss;
        if (bss > len) {
-               error = do_brk(start_addr + len, bss - len);
+               error = do_brk_locked(start_addr + len, bss - len);
                retval = error;
                if (error != start_addr + len)
                        goto out;
diff -urN linux/fs/binfmt_elf.c linux/fs/binfmt_elf.c
--- linux/fs/binfmt_elf.c       2004/12/27 04:13:51     1.52.2.14
+++ linux/fs/binfmt_elf.c       2005/01/09 19:34:04     1.52.2.15
@@ -84,7 +84,7 @@
        start = ELF_PAGEALIGN(start);
        end = ELF_PAGEALIGN(end);
        if (end > start) {
-               unsigned long addr = do_brk(start, end - start);
+               unsigned long addr = do_brk_locked(start, end - start);
                if (BAD_ADDR(addr))
                        return addr;
        }
@@ -290,7 +290,9 @@
         */
        if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr))
                goto out;
-       if (interp_elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
+
+       if (interp_elf_ex->e_phnum < 1 ||
+           interp_elf_ex->e_phnum > 65536U / sizeof(struct elf_phdr))
                goto out;
 
        /* Now read in all of the header information */
@@ -377,7 +379,7 @@
 
        /* Map the last of the bss segment */
        if (last_bss > elf_bss) {
-               error = do_brk(elf_bss, last_bss - elf_bss);
+               error = do_brk_locked(elf_bss, last_bss - elf_bss);
                if (BAD_ADDR(error))
                        goto out_close;
        }
@@ -423,7 +425,7 @@
                goto out;
        }
 
-       do_brk(0, text_data);
+       do_brk_locked(0, text_data);
        if (!interpreter->f_op || !interpreter->f_op->read)
                goto out;
        if (interpreter->f_op->read(interpreter, addr, text_data, &offset) < 0)
@@ -431,7 +433,7 @@
        flush_icache_range((unsigned long)addr,
                           (unsigned long)addr + text_data);
 
-       do_brk(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
+       do_brk_locked(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
                interp_ex->a_bss);
        elf_entry = interp_ex->a_entry;
 
@@ -975,7 +977,7 @@
        len = ELF_PAGESTART(elf_phdata->p_filesz + elf_phdata->p_vaddr + 
ELF_MIN_ALIGN - 1);
        bss = elf_phdata->p_memsz + elf_phdata->p_vaddr;
        if (bss > len)
-               do_brk(len, bss - len);
+               do_brk_locked(len, bss - len);
        error = 0;
 
 out_free_ph:
diff -urN linux/include/linux/auto_fs4.h linux/include/linux/auto_fs4.h
--- linux/include/linux/auto_fs4.h      2000/11/23 02:00:56     1.2
+++ linux/include/linux/auto_fs4.h      2005/01/09 19:34:04     1.2.4.1
@@ -41,7 +41,10 @@
        struct autofs_packet_expire_multi expire_multi;
 };
 
-#define AUTOFS_IOC_EXPIRE_MULTI _IOW(0x93,0x66,int)
-
+#define AUTOFS_IOC_EXPIRE_MULTI                _IOW(0x93,0x66,int)
+#define AUTOFS_IOC_PROTOSUBVER         _IOR(0x93,0x67,int)
+#define AUTOFS_IOC_ASKREGHOST          _IOR(0x93,0x68,int)
+#define AUTOFS_IOC_TOGGLEREGHOST       _IOR(0x93,0x69,int)
+#define AUTOFS_IOC_ASKUMOUNT           _IOR(0x93,0x70,int)
 
 #endif /* _LINUX_AUTO_FS4_H */
diff -urN linux/include/linux/libata.h linux/include/linux/libata.h
--- linux/include/linux/libata.h        2004/12/27 04:13:54     1.11.2.4
+++ linux/include/linux/libata.h        2005/01/09 19:34:04     1.11.2.5
@@ -340,6 +340,8 @@
        void (*phy_reset) (struct ata_port *ap);
        void (*post_set_mode) (struct ata_port *ap);
 
+       int (*check_atapi_dma) (struct ata_queued_cmd *qc);
+
        void (*bmdma_setup) (struct ata_queued_cmd *qc);
        void (*bmdma_start) (struct ata_queued_cmd *qc);
 
diff -urN linux/include/linux/mm.h linux/include/linux/mm.h
--- linux/include/linux/mm.h    2004/12/27 04:13:54     1.63.2.9
+++ linux/include/linux/mm.h    2005/01/09 19:34:04     1.63.2.10
@@ -575,6 +575,7 @@
 extern int do_munmap(struct mm_struct *, unsigned long, size_t);
 
 extern unsigned long do_brk(unsigned long, unsigned long);
+extern unsigned long do_brk_locked(unsigned long, unsigned long);
 
 static inline void __vma_unlink(struct mm_struct * mm, struct vm_area_struct * 
vma, struct vm_area_struct * prev)
 {
diff -urN linux/include/linux/pci_ids.h linux/include/linux/pci_ids.h
--- linux/include/linux/pci_ids.h       2004/12/27 04:13:54     1.50.2.24
+++ linux/include/linux/pci_ids.h       2005/01/09 19:34:04     1.50.2.25
@@ -2064,6 +2064,9 @@
 #define PCI_DEVICE_ID_TIGERJET_300     0x0001
 #define PCI_DEVICE_ID_TIGERJET_100     0x0002
 
+#define PCI_VENDOR_ID_TTTECH           0x0357
+#define PCI_DEVICE_ID_TTTECH_MC322     0x000A
+
 #define PCI_VENDOR_ID_ARK              0xedd8
 #define PCI_DEVICE_ID_ARK_STING                0xa091
 #define PCI_DEVICE_ID_ARK_STINGARK     0xa099
diff -urN linux/kernel/ksyms.c linux/kernel/ksyms.c
--- linux/kernel/Attic/ksyms.c  2003/12/15 18:19:53     1.76.2.11
+++ linux/kernel/Attic/ksyms.c  2005/01/09 19:34:04     1.76.2.12
@@ -88,6 +88,7 @@
 EXPORT_SYMBOL(do_mmap_pgoff);
 EXPORT_SYMBOL(do_munmap);
 EXPORT_SYMBOL(do_brk);
+EXPORT_SYMBOL(do_brk_locked);
 EXPORT_SYMBOL(exit_mm);
 EXPORT_SYMBOL(exit_files);
 EXPORT_SYMBOL(exit_fs);
diff -urN linux/mm/mmap.c linux/mm/mmap.c
--- linux/mm/mmap.c     2004/12/27 04:13:55     1.49.2.8
+++ linux/mm/mmap.c     2005/01/09 19:34:04     1.49.2.9
@@ -1116,6 +1116,21 @@
        return addr;
 }
 
+/* locking version of do_brk. */
+unsigned long do_brk_locked(unsigned long addr, unsigned long len)
+{
+       unsigned long ret;
+
+       down_write(&current->mm->mmap_sem);
+       ret = do_brk(addr, len);
+       up_write(&current->mm->mmap_sem);
+
+       return ret;
+}
+
+
+
+
 /* Build the RB tree corresponding to the VMA list. */
 void build_mmap_rb(struct mm_struct * mm)
 {
diff -urN linux/net/Config.in linux/net/Config.in
--- linux/net/Attic/Config.in   2004/08/14 18:39:04     1.28.2.6
+++ linux/net/Attic/Config.in   2005/01/09 19:34:04     1.28.2.7
@@ -61,7 +61,9 @@
 fi
 
 tristate 'Appletalk protocol support' CONFIG_ATALK
-source drivers/net/appletalk/Config.in
+if [ "$CONFIG_ATALK" != "n" ]; then
+   source drivers/net/appletalk/Config.in
+fi
 
 tristate 'DECnet Support' CONFIG_DECNET
 if [ "$CONFIG_DECNET" != "n" ]; then

<Prev in Thread] Current Thread [Next in Thread>