diff -Nuarp linux-2.5.31-e1000-2/Documentation/networking/e1000.txt linux-2.5.31-e1000-3/Documentation/networking/e1000.txt --- linux-2.5.31-e1000-2/Documentation/networking/e1000.txt Fri Aug 23 05:50:14 2002 +++ linux-2.5.31-e1000-3/Documentation/networking/e1000.txt Fri Aug 23 06:30:34 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.5.31-e1000-2/drivers/net/e1000/e1000.h linux-2.5.31-e1000-3/drivers/net/e1000/e1000.h --- linux-2.5.31-e1000-2/drivers/net/e1000/e1000.h Fri Aug 23 05:50:45 2002 +++ linux-2.5.31-e1000-3/drivers/net/e1000/e1000.h Fri Aug 23 06:30:34 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.5.31-e1000-2/drivers/net/e1000/e1000_main.c linux-2.5.31-e1000-3/drivers/net/e1000/e1000_main.c --- linux-2.5.31-e1000-2/drivers/net/e1000/e1000_main.c Fri Aug 23 05:50:45 2002 +++ linux-2.5.31-e1000-3/drivers/net/e1000/e1000_main.c Fri Aug 23 06:30:34 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.5.31-e1000-2/drivers/net/e1000/e1000_param.c linux-2.5.31-e1000-3/drivers/net/e1000/e1000_param.c --- linux-2.5.31-e1000-2/drivers/net/e1000/e1000_param.c Fri Aug 23 05:50:45 2002 +++ linux-2.5.31-e1000-3/drivers/net/e1000/e1000_param.c Fri Aug 23 06:41:04 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: .