diff -Nuarp linux-2.4.20-pre4-e1000-2/Documentation/networking/e1000.txt linux-2.4.20-pre4-e1000-3/Documentation/networking/e1000.txt
--- linux-2.4.20-pre4-e1000-2/Documentation/networking/e1000.txt	Fri Aug 23 05:45:52 2002
+++ linux-2.4.20-pre4-e1000-3/Documentation/networking/e1000.txt	Fri Aug 23 05:58:38 2002
@@ -1,7 +1,7 @@
 Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
 ===============================================================
 
-June 11, 2002
+August 6, 2002
 
 
 Contents
@@ -20,12 +20,12 @@ In This Release
 ===============
 
 This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family
-of Adapters, version 4.2.x.  This driver includes support for 
+of Adapters, version 4.3.x.  This driver includes support for 
 Itanium(TM)-based systems.
 
 This release version includes the following:
 
-   - Support for the ethtool 1.5 interface. A third-party application can use
+   - Support for the ethtool 1.6 interface. A third-party application can use
      the ethtool interface to get and set driver parameters.
 
    - Zero copy. This feature provides faster data throughput. Enabled by
@@ -113,12 +113,12 @@ Valid Range: 0x01-0x0F, 0x20-0x2F
 Default Value: 0x2F
     This parameter is a bit mask that specifies which speed and duplex
     settings the board advertises. When this parameter is used, the Speed and
-    Duplex parameters must not be specified.
+    Duplex parameters must not be specified.  
 
 Duplex (adapters using copper connections only)
 Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
 Default Value: 0
-    Defines the direction in which data is allowed to flow. Can by either one
+    Defines the direction in which data is allowed to flow. Can by either one 
     or two-directional. If both Duplex and the link partner are set to auto-
     negotiate, the board auto-detects the correct duplex. If the link partner
     is forced (either full or half), Duplex defaults to half-duplex.
@@ -126,45 +126,58 @@ Default Value: 0
 FlowControl
 Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
 Default: Read flow control settings from the EEPROM
-    This parameter controls the automatic generation(Tx) and response(Rx) to
+    This parameter controls the automatic generation(Tx) and response(Rx) to 
     Ethernet PAUSE frames.
 
 RxDescriptors
 Valid Range: 80-256 for 82542 and 82543-based adapters
              80-4096 for 82540, 82544, 82545, and 82546-based adapters
 Default Value: 80
-    This value is the number of receive descriptors allocated by the driver.
-    Increasing this value allows the driver to buffer more incoming packets.
+    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
+    descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending 
     on the MTU setting. The maximum MTU size is 16110.
 
+    NOTE: MTU designates the frame size. It only needs to be set for Jumbo 
+          Frames.
+
 RxIntDelay
 Valid Range: 0-65535 (0=off)
 Default Value: 0 (82542, 82543, and 82544-based adapters)
                128 (82540, 82545, and 82546-based adapters)
-    This value delays the generation of receive interrupts in units of 1.024
-    microseconds.  Receive interrupt reduction can improve CPU efficiency if
-    properly tuned for specific network traffic. Increasing this value adds
-    extra latency to frame reception and can end up decreasing the throughput
-    of TCP traffic. If the system is reporting dropped receives, this value
-    may be set too high, causing the driver to run out of available receive
+    This value delays the generation of receive interrupts in units of 1.024 
+    microseconds.  Receive interrupt reduction can improve CPU efficiency if 
+    properly tuned for specific network traffic. Increasing this value adds 
+    extra latency to frame reception and can end up decreasing the throughput 
+    of TCP traffic. If the system is reporting dropped receives, this value 
+    may be set too high, causing the driver to run out of available receive 
     descriptors.
 
-    CAUTION: When setting RxIntDelay to a value other than 0, adapters based
-             on the Intel 82543 and 82544 LAN controllers may hang (stop
+    CAUTION: When setting RxIntDelay to a value other than 0, adapters based 
+             on the Intel 82543 and 82544 LAN controllers may hang (stop 
              transmitting) under certain network conditions. If this occurs a
-             message is logged in the system event log. In addition, the
-             controller is automatically reset, restoring the network
-             connection. To eliminate the potential for the hang ensure that
+             message is logged in the system event log. In addition, the 
+             controller is automatically reset, restoring the network 
+             connection. To eliminate the potential for the hang ensure that 
              RxIntDelay is set to 0.
 
+RxAbsIntDelay (82540, 82545, and 82546-based adapters only)
+Valid Range: 0-65535 (0=off)
+Default Value: 128
+    This value, in units of 1.024 microseconds, limits the delay in which a 
+    transmit interrupt is generated. Useful only if RxIntDelay is non-zero, 
+    this value ensures that an interrupt is generated after the initial 
+    packet is received within the set amount of time.  Proper tuning,
+    along with RxIntDelay, may improve traffic throughput in specific network
+    conditions.
+
 Speed (adapters using copper connections only)
 Valid Settings: 0, 10, 100, 1000
 Default Value: 0 (auto-negotiate at all supported speeds)
     Speed forces the line speed to the specified value in megabits per second
-    (Mbps). If this parameter is not specified or is set to 0 and the link
-    partner is set to auto-negotiate, the board will auto-detect the correct
+    (Mbps). If this parameter is not specified or is set to 0 and the link 
+    partner is set to auto-negotiate, the board will auto-detect the correct 
     speed. Duplex must also be set when Speed is set to either 10 or 100.
 
 TxDescriptors
@@ -172,9 +185,28 @@ Valid Range: 80-256 for 82542 and 82543-
              80-4096 for 82540, 82544, 82545, and 82546-based adapters
 Default Value: 256
     This value is the number of transmit descriptors allocated by the driver.
-    Increasing this value allows the driver to queue more transmits. Each
+    Increasing this value allows the driver to queue more transmits. Each 
     descriptor is 16 bytes.
 
+TxIntDelay
+Valid Range: 0-65535 (0=off)
+Default Value: 64
+    This value delays the generation of transmit interrupts in units of 
+    1.024 microseconds.  Transmit interrupt reduction can improve CPU
+    efficiency if properly tuned for specific network traffic. If the
+    system is reporting dropped transmits, this value may be set too high
+    causing the driver to run out of available transmit descriptors.
+
+TxAbsIntDelay (82540, 82545, and 82546-based adapters only)
+Valid Range: 0-65535 (0=off)
+Default Value: 64
+    This value, in units of 1.024 microseconds, limits the delay in which a 
+    transmit interrupt is generated. Useful only if TxIntDelay is non-zero, 
+    this value ensures that an interrupt is generated after the initial 
+    packet is sent on the wire within the set amount of time.  Proper tuning,
+    along with TxIntDelay, may improve traffic throughput in specific 
+    network conditions.
+
 XsumRX (not available on the PRO/1000 Gigabit Server Adapter)
 Valid Range: 0-1
 Default Value: 1
diff -Nuarp linux-2.4.20-pre4-e1000-2/drivers/net/e1000/e1000.h linux-2.4.20-pre4-e1000-3/drivers/net/e1000/e1000.h
--- linux-2.4.20-pre4-e1000-2/drivers/net/e1000/e1000.h	Fri Aug 23 05:46:13 2002
+++ linux-2.4.20-pre4-e1000-3/drivers/net/e1000/e1000.h	Fri Aug 23 05:52:48 2002
@@ -169,6 +169,8 @@ struct e1000_adapter {
 	/* TX */
 	struct e1000_desc_ring tx_ring;
 	uint32_t txd_cmd;
+	uint32_t tx_int_delay;
+	uint32_t tx_abs_int_delay;
 	int max_data_per_txd;
 
 	/* RX */
@@ -176,6 +178,7 @@ struct e1000_adapter {
 	uint64_t hw_csum_err;
 	uint64_t hw_csum_good;
 	uint32_t rx_int_delay;
+	uint32_t rx_abs_int_delay;
 	boolean_t rx_csum;
 
 	/* OS defined structs */
diff -Nuarp linux-2.4.20-pre4-e1000-2/drivers/net/e1000/e1000_main.c linux-2.4.20-pre4-e1000-3/drivers/net/e1000/e1000_main.c
--- linux-2.4.20-pre4-e1000-2/drivers/net/e1000/e1000_main.c	Fri Aug 23 05:46:13 2002
+++ linux-2.4.20-pre4-e1000-3/drivers/net/e1000/e1000_main.c	Fri Aug 23 05:52:48 2002
@@ -777,7 +777,9 @@ e1000_configure_tx(struct e1000_adapter 
 
 	/* Set the Tx Interrupt Delay register */
 
-	E1000_WRITE_REG(&adapter->hw, TIDV, 64);
+	E1000_WRITE_REG(&adapter->hw, TIDV, adapter->tx_int_delay);
+	if(adapter->hw.mac_type >= e1000_82540)
+		E1000_WRITE_REG(&adapter->hw, TADV, adapter->tx_abs_int_delay);
 
 	/* Program the Transmit Control Register */
 
@@ -907,8 +909,8 @@ e1000_configure_rx(struct e1000_adapter 
 	/* set the Receive Delay Timer Register */
 
 	if(adapter->hw.mac_type >= e1000_82540) {
-		E1000_WRITE_REG(&adapter->hw, RADV, adapter->rx_int_delay);
-		E1000_WRITE_REG(&adapter->hw, RDTR, 64);
+		E1000_WRITE_REG(&adapter->hw, RDTR, adapter->rx_int_delay);
+		E1000_WRITE_REG(&adapter->hw, RADV, adapter->rx_abs_int_delay);
 
 		/* Set the interrupt throttling rate.  Value is calculated
 		 * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
diff -Nuarp linux-2.4.20-pre4-e1000-2/drivers/net/e1000/e1000_param.c linux-2.4.20-pre4-e1000-3/drivers/net/e1000/e1000_param.c
--- linux-2.4.20-pre4-e1000-2/drivers/net/e1000/e1000_param.c	Fri Aug 23 05:46:13 2002
+++ linux-2.4.20-pre4-e1000-3/drivers/net/e1000/e1000_param.c	Fri Aug 23 05:52:48 2002
@@ -147,6 +147,24 @@ E1000_PARAM(FlowControl, "Flow Control s
 
 E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
 
+/* Transmit Interrupt Delay in units of 1.024 microseconds
+ *
+ * Valid Range: 0-65535
+ *
+ * Default Value: 64
+ */
+
+E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay");
+
+/* Transmit Absolute Interrupt Delay in units of 1.024 microseconds
+ *
+ * Valid Range: 0-65535
+ *
+ * Default Value: 0
+ */
+
+E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");
+
 /* Receive Interrupt Delay in units of 1.024 microseconds
  *
  * Valid Range: 0-65535
@@ -156,6 +174,15 @@ E1000_PARAM(XsumRX, "Disable or enable R
 
 E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
 
+/* Receive Absolute Interrupt Delay in units of 1.024 microseconds
+ *
+ * Valid Range: 0-65535
+ *
+ * Default Value: 128
+ */
+
+E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
+
 #define AUTONEG_ADV_DEFAULT  0x2F
 #define AUTONEG_ADV_MASK     0x2F
 #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
@@ -170,11 +197,23 @@ E1000_PARAM(RxIntDelay, "Receive Interru
 #define MIN_RXD                       80
 #define MAX_82544_RXD               4096
 
-#define DEFAULT_RDTR                   0
-#define DEFAULT_RADV                 128
+#define DEFAULT_RDTR                 128
+#define DEFAULT_RDTR_82544             0
 #define MAX_RXDELAY               0xFFFF
 #define MIN_RXDELAY                    0
 
+#define DEFAULT_RADV                 128
+#define MAX_RXABSDELAY            0xFFFF
+#define MIN_RXABSDELAY                 0
+
+#define DEFAULT_TIDV                  64
+#define MAX_TXDELAY               0xFFFF
+#define MIN_TXDELAY                    0
+
+#define DEFAULT_TADV                  64
+#define MAX_TXABSDELAY            0xFFFF
+#define MIN_TXABSDELAY                 0
+
 struct e1000_option {
 	enum { enable_option, range_option, list_option } type;
 	char *name;
@@ -331,21 +370,61 @@ e1000_check_options(struct e1000_adapter
 		e1000_validate_option(&fc, &opt);
 		adapter->hw.fc = adapter->hw.original_fc = fc;
 	}
+	{ /* Transmit Interrupt Delay */
+		char *tidv = "using default of " __MODULE_STRING(DEFAULT_TIDV);
+		struct e1000_option opt = {
+			type: range_option,
+			name: "Transmit Interrupt Delay",
+			arg: { r: { min: MIN_TXDELAY, max: MAX_TXDELAY }}
+		};
+		opt.def = DEFAULT_TIDV;
+		opt.err = tidv;
+
+		adapter->tx_int_delay = TxIntDelay[bd];
+		e1000_validate_option(&adapter->tx_int_delay, &opt);
+	}
+	{ /* Transmit Absolute Interrupt Delay */
+		char *tadv = "using default of " __MODULE_STRING(DEFAULT_TADV);
+		struct e1000_option opt = {
+			type: range_option,
+			name: "Transmit Absolute Interrupt Delay",
+			arg: { r: { min: MIN_TXABSDELAY, max: MAX_TXABSDELAY }}
+		};
+		opt.def = DEFAULT_TADV;
+		opt.err = tadv;
+
+		adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
+		e1000_validate_option(&adapter->tx_abs_int_delay, &opt);
+	}
 	{ /* Receive Interrupt Delay */
 		char *rdtr = "using default of " __MODULE_STRING(DEFAULT_RDTR);
-		char *radv = "using default of " __MODULE_STRING(DEFAULT_RADV);
+		char *rdtr_82544 = "using default of "
+				   __MODULE_STRING(DEFAULT_RDTR_82544);
 		struct e1000_option opt = {
 			type: range_option,
 			name: "Receive Interrupt Delay",
 			arg: { r: { min: MIN_RXDELAY, max: MAX_RXDELAY }}
 		};
 		e1000_mac_type mac_type = adapter->hw.mac_type;
-		opt.def = mac_type < e1000_82540 ? DEFAULT_RDTR : DEFAULT_RADV;
-		opt.err = mac_type < e1000_82540 ? rdtr : radv;
+		opt.def = mac_type > e1000_82544 ? DEFAULT_RDTR : 0;
+		opt.err = mac_type > e1000_82544 ? rdtr : rdtr_82544;
 
 		adapter->rx_int_delay = RxIntDelay[bd];
 		e1000_validate_option(&adapter->rx_int_delay, &opt);
 	}
+	{ /* Receive Absolute Interrupt Delay */
+		char *radv = "using default of " __MODULE_STRING(DEFAULT_RADV);
+		struct e1000_option opt = {
+			type: range_option,
+			name: "Receive Absolute Interrupt Delay",
+			arg: { r: { min: MIN_RXABSDELAY, max: MAX_RXABSDELAY }}
+		};
+		opt.def = DEFAULT_RADV;
+		opt.err = radv;
+
+		adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
+		e1000_validate_option(&adapter->rx_abs_int_delay, &opt);
+	}
 	
 	switch(adapter->hw.media_type) {
 	case e1000_media_type_fiber:
