Commit 61a5978a authored by Scott Feldman's avatar Scott Feldman Committed by Jeff Garzik

e1000 net driver update 3/6:

o Feature: added new interrupt mitigation knobs.
parent 7ba8c2a7
Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
=============================================================== ===============================================================
June 11, 2002 August 6, 2002
Contents Contents
...@@ -20,12 +20,12 @@ In This Release ...@@ -20,12 +20,12 @@ In This Release
=============== ===============
This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family 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. Itanium(TM)-based systems.
This release version includes the following: 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. the ethtool interface to get and set driver parameters.
- Zero copy. This feature provides faster data throughput. Enabled by - Zero copy. This feature provides faster data throughput. Enabled by
...@@ -113,12 +113,12 @@ Valid Range: 0x01-0x0F, 0x20-0x2F ...@@ -113,12 +113,12 @@ Valid Range: 0x01-0x0F, 0x20-0x2F
Default Value: 0x2F Default Value: 0x2F
This parameter is a bit mask that specifies which speed and duplex This parameter is a bit mask that specifies which speed and duplex
settings the board advertises. When this parameter is used, the Speed and 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) Duplex (adapters using copper connections only)
Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full) Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
Default Value: 0 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- 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 negotiate, the board auto-detects the correct duplex. If the link partner
is forced (either full or half), Duplex defaults to half-duplex. is forced (either full or half), Duplex defaults to half-duplex.
...@@ -126,45 +126,58 @@ Default Value: 0 ...@@ -126,45 +126,58 @@ Default Value: 0
FlowControl FlowControl
Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx) Valid Range: 0-3 (0=none, 1=Rx only, 2=Tx only, 3=Rx&Tx)
Default: Read flow control settings from the EEPROM 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. Ethernet PAUSE frames.
RxDescriptors RxDescriptors
Valid Range: 80-256 for 82542 and 82543-based adapters Valid Range: 80-256 for 82542 and 82543-based adapters
80-4096 for 82540, 82544, 82545, and 82546-based adapters 80-4096 for 82540, 82544, 82545, and 82546-based adapters
Default Value: 80 Default Value: 80
This value is the number of receive descriptors allocated by the driver. This value is the number of receive descriptors allocated by the driver.
Increasing this value allows the driver to buffer more incoming packets. Increasing this value allows the driver to buffer more incoming packets.
Each descriptor is 16 bytes. A receive buffer is also allocated for each 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. 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 RxIntDelay
Valid Range: 0-65535 (0=off) Valid Range: 0-65535 (0=off)
Default Value: 0 (82542, 82543, and 82544-based adapters) Default Value: 0 (82542, 82543, and 82544-based adapters)
128 (82540, 82545, and 82546-based adapters) 128 (82540, 82545, and 82546-based adapters)
This value delays the generation of receive interrupts in units of 1.024 This value delays the generation of receive interrupts in units of 1.024
microseconds. Receive interrupt reduction can improve CPU efficiency if microseconds. Receive interrupt reduction can improve CPU efficiency if
properly tuned for specific network traffic. Increasing this value adds properly tuned for specific network traffic. Increasing this value adds
extra latency to frame reception and can end up decreasing the throughput extra latency to frame reception and can end up decreasing the throughput
of TCP traffic. If the system is reporting dropped receives, this value 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 may be set too high, causing the driver to run out of available receive
descriptors. descriptors.
CAUTION: When setting RxIntDelay to a value other than 0, adapters based CAUTION: When setting RxIntDelay to a value other than 0, adapters based
on the Intel 82543 and 82544 LAN controllers may hang (stop on the Intel 82543 and 82544 LAN controllers may hang (stop
transmitting) under certain network conditions. If this occurs a transmitting) under certain network conditions. If this occurs a
message is logged in the system event log. In addition, the message is logged in the system event log. In addition, the
controller is automatically reset, restoring the network controller is automatically reset, restoring the network
connection. To eliminate the potential for the hang ensure that connection. To eliminate the potential for the hang ensure that
RxIntDelay is set to 0. 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) Speed (adapters using copper connections only)
Valid Settings: 0, 10, 100, 1000 Valid Settings: 0, 10, 100, 1000
Default Value: 0 (auto-negotiate at all supported speeds) Default Value: 0 (auto-negotiate at all supported speeds)
Speed forces the line speed to the specified value in megabits per second 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 (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 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. speed. Duplex must also be set when Speed is set to either 10 or 100.
TxDescriptors TxDescriptors
...@@ -172,9 +185,28 @@ Valid Range: 80-256 for 82542 and 82543-based adapters ...@@ -172,9 +185,28 @@ Valid Range: 80-256 for 82542 and 82543-based adapters
80-4096 for 82540, 82544, 82545, and 82546-based adapters 80-4096 for 82540, 82544, 82545, and 82546-based adapters
Default Value: 256 Default Value: 256
This value is the number of transmit descriptors allocated by the driver. 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. 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) XsumRX (not available on the PRO/1000 Gigabit Server Adapter)
Valid Range: 0-1 Valid Range: 0-1
Default Value: 1 Default Value: 1
......
...@@ -169,6 +169,8 @@ struct e1000_adapter { ...@@ -169,6 +169,8 @@ struct e1000_adapter {
/* TX */ /* TX */
struct e1000_desc_ring tx_ring; struct e1000_desc_ring tx_ring;
uint32_t txd_cmd; uint32_t txd_cmd;
uint32_t tx_int_delay;
uint32_t tx_abs_int_delay;
int max_data_per_txd; int max_data_per_txd;
/* RX */ /* RX */
...@@ -176,6 +178,7 @@ struct e1000_adapter { ...@@ -176,6 +178,7 @@ struct e1000_adapter {
uint64_t hw_csum_err; uint64_t hw_csum_err;
uint64_t hw_csum_good; uint64_t hw_csum_good;
uint32_t rx_int_delay; uint32_t rx_int_delay;
uint32_t rx_abs_int_delay;
boolean_t rx_csum; boolean_t rx_csum;
/* OS defined structs */ /* OS defined structs */
......
...@@ -777,7 +777,9 @@ e1000_configure_tx(struct e1000_adapter *adapter) ...@@ -777,7 +777,9 @@ e1000_configure_tx(struct e1000_adapter *adapter)
/* Set the Tx Interrupt Delay register */ /* 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 */ /* Program the Transmit Control Register */
...@@ -907,8 +909,8 @@ e1000_configure_rx(struct e1000_adapter *adapter) ...@@ -907,8 +909,8 @@ e1000_configure_rx(struct e1000_adapter *adapter)
/* set the Receive Delay Timer Register */ /* set the Receive Delay Timer Register */
if(adapter->hw.mac_type >= e1000_82540) { if(adapter->hw.mac_type >= e1000_82540) {
E1000_WRITE_REG(&adapter->hw, RADV, adapter->rx_int_delay); E1000_WRITE_REG(&adapter->hw, RDTR, adapter->rx_int_delay);
E1000_WRITE_REG(&adapter->hw, RDTR, 64); E1000_WRITE_REG(&adapter->hw, RADV, adapter->rx_abs_int_delay);
/* Set the interrupt throttling rate. Value is calculated /* Set the interrupt throttling rate. Value is calculated
* as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */ * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns) */
......
...@@ -147,6 +147,24 @@ E1000_PARAM(FlowControl, "Flow Control setting"); ...@@ -147,6 +147,24 @@ E1000_PARAM(FlowControl, "Flow Control setting");
E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload"); 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 /* Receive Interrupt Delay in units of 1.024 microseconds
* *
* Valid Range: 0-65535 * Valid Range: 0-65535
...@@ -156,6 +174,15 @@ E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload"); ...@@ -156,6 +174,15 @@ E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); 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_DEFAULT 0x2F
#define AUTONEG_ADV_MASK 0x2F #define AUTONEG_ADV_MASK 0x2F
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
...@@ -170,11 +197,23 @@ E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); ...@@ -170,11 +197,23 @@ E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
#define MIN_RXD 80 #define MIN_RXD 80
#define MAX_82544_RXD 4096 #define MAX_82544_RXD 4096
#define DEFAULT_RDTR 0 #define DEFAULT_RDTR 128
#define DEFAULT_RADV 128 #define DEFAULT_RDTR_82544 0
#define MAX_RXDELAY 0xFFFF #define MAX_RXDELAY 0xFFFF
#define MIN_RXDELAY 0 #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 { struct e1000_option {
enum { enable_option, range_option, list_option } type; enum { enable_option, range_option, list_option } type;
char *name; char *name;
...@@ -331,21 +370,61 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -331,21 +370,61 @@ e1000_check_options(struct e1000_adapter *adapter)
e1000_validate_option(&fc, &opt); e1000_validate_option(&fc, &opt);
adapter->hw.fc = adapter->hw.original_fc = fc; 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 */ { /* Receive Interrupt Delay */
char *rdtr = "using default of " __MODULE_STRING(DEFAULT_RDTR); 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 = { struct e1000_option opt = {
.type = range_option, .type = range_option,
.name = "Receive Interrupt Delay", .name = "Receive Interrupt Delay",
.arg = { r: { min: MIN_RXDELAY, max: MAX_RXDELAY }} .arg = { r: { min: MIN_RXDELAY, max: MAX_RXDELAY }}
}; };
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
opt.def = mac_type < e1000_82540 ? DEFAULT_RDTR : DEFAULT_RADV; opt.def = mac_type > e1000_82544 ? DEFAULT_RDTR : 0;
opt.err = mac_type < e1000_82540 ? rdtr : radv; opt.err = mac_type > e1000_82544 ? rdtr : rdtr_82544;
adapter->rx_int_delay = RxIntDelay[bd]; adapter->rx_int_delay = RxIntDelay[bd];
e1000_validate_option(&adapter->rx_int_delay, &opt); 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) { switch(adapter->hw.media_type) {
case e1000_media_type_fiber: case e1000_media_type_fiber:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment