patch-2.4.21 linux-2.4.21/drivers/net/e1000/e1000_param.c
Next file: linux-2.4.21/drivers/net/e1000/e1000_proc.c
Previous file: linux-2.4.21/drivers/net/e1000/e1000_osdep.h
Back to the patch index
Back to the overall index
- Lines: 295
- Date:
2003-06-13 07:51:34.000000000 -0700
- Orig file:
linux-2.4.20/drivers/net/e1000/e1000_param.c
- Orig date:
2002-11-28 15:53:13.000000000 -0800
diff -urN linux-2.4.20/drivers/net/e1000/e1000_param.c linux-2.4.21/drivers/net/e1000/e1000_param.c
@@ -1,7 +1,7 @@
/*******************************************************************************
- Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved.
+ Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
@@ -75,7 +75,7 @@
* Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers
* Valid Range: 80-4096 for 82544
*
- * Default Value: 80
+ * Default Value: 256
*/
E1000_PARAM(RxDescriptors, "Number of receive descriptors");
@@ -169,7 +169,7 @@
*
* Valid Range: 0-65535
*
- * Default Value: 0/128
+ * Default Value: 0
*/
E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
@@ -183,6 +183,15 @@
E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
+/* Interrupt Throttle Rate (interrupts/sec)
+ *
+ * Valid Range: 100-100000 (0=off, 1=dynamic)
+ *
+ * Default Value: 1
+ */
+
+E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
+
#define AUTONEG_ADV_DEFAULT 0x2F
#define AUTONEG_ADV_MASK 0x2F
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
@@ -192,7 +201,7 @@
#define MIN_TXD 80
#define MAX_82544_TXD 4096
-#define DEFAULT_RXD 80
+#define DEFAULT_RXD 256
#define MAX_RXD 256
#define MIN_RXD 80
#define MAX_82544_RXD 4096
@@ -213,6 +222,10 @@
#define MAX_TXABSDELAY 0xFFFF
#define MIN_TXABSDELAY 0
+#define DEFAULT_ITR 1
+#define MAX_ITR 100000
+#define MIN_ITR 100
+
struct e1000_option {
enum { enable_option, range_option, list_option } type;
char *name;
@@ -230,7 +243,6 @@
} arg;
};
-
static int __devinit
e1000_validate_option(int *value, struct e1000_option *opt)
{
@@ -273,7 +285,7 @@
default:
BUG();
}
-
+
printk(KERN_INFO "Invalid %s specified (%i) %s\n",
opt->name, *value, opt->err);
*value = opt->def;
@@ -298,7 +310,7 @@
{
int bd = adapter->bd_number;
if(bd >= E1000_MAX_NIC) {
- printk(KERN_NOTICE
+ printk(KERN_NOTICE
"Warning: no configuration for board #%i\n", bd);
printk(KERN_NOTICE "Using defaults for all values\n");
bd = E1000_MAX_NIC;
@@ -310,11 +322,11 @@
.name = "Transmit Descriptors",
.err = "using default of " __MODULE_STRING(DEFAULT_TXD),
.def = DEFAULT_TXD,
- .arg = { r: { min: MIN_TXD }}
+ .arg = { .r = { .min = MIN_TXD }}
};
struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
e1000_mac_type mac_type = adapter->hw.mac_type;
- opt.arg.r.max = mac_type < e1000_82544 ?
+ opt.arg.r.max = mac_type < e1000_82544 ?
MAX_TXD : MAX_82544_TXD;
tx_ring->count = TxDescriptors[bd];
@@ -327,7 +339,7 @@
.name = "Receive Descriptors",
.err = "using default of " __MODULE_STRING(DEFAULT_RXD),
.def = DEFAULT_RXD,
- .arg = { r: { min: MIN_RXD }}
+ .arg = { .r = { .min = MIN_RXD }}
};
struct e1000_desc_ring *rx_ring = &adapter->rx_ring;
e1000_mac_type mac_type = adapter->hw.mac_type;
@@ -344,13 +356,13 @@
.err = "defaulting to Enabled",
.def = OPTION_ENABLED
};
-
+
int rx_csum = XsumRX[bd];
e1000_validate_option(&rx_csum, &opt);
adapter->rx_csum = rx_csum;
}
{ /* Flow Control */
-
+
struct e1000_opt_list fc_list[] =
{{ e1000_fc_none, "Flow Control Disabled" },
{ e1000_fc_rx_pause,"Flow Control Receive Only" },
@@ -363,7 +375,8 @@
.name = "Flow Control",
.err = "reading default settings from EEPROM",
.def = e1000_fc_default,
- .arg = { l: { nr: ARRAY_SIZE(fc_list), p: fc_list }}
+ .arg = { .l = { .nr = ARRAY_SIZE(fc_list),
+ .p = fc_list }}
};
int fc = FlowControl[bd];
@@ -371,58 +384,78 @@
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 }}
+ .err = "using default of " __MODULE_STRING(DEFAULT_TIDV),
+ .def = DEFAULT_TIDV,
+ .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 }}
+ .err = "using default of " __MODULE_STRING(DEFAULT_TADV),
+ .def = DEFAULT_TADV,
+ .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);
struct e1000_option opt = {
.type = range_option,
.name = "Receive Interrupt Delay",
- .arg = { r: { min: MIN_RXDELAY, max: MAX_RXDELAY }}
+ .err = "using default of " __MODULE_STRING(DEFAULT_RDTR),
+ .def = DEFAULT_RDTR,
+ .arg = { .r = { .min = MIN_RXDELAY,
+ .max = MAX_RXDELAY }}
};
- opt.def = DEFAULT_RDTR;
- opt.err = rdtr;
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 }}
+ .err = "using default of " __MODULE_STRING(DEFAULT_RADV),
+ .def = DEFAULT_RADV,
+ .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);
}
-
+ { /* Interrupt Throttling Rate */
+ struct e1000_option opt = {
+ .type = range_option,
+ .name = "Interrupt Throttling Rate (ints/sec)",
+ .err = "using default of " __MODULE_STRING(DEFAULT_ITR),
+ .def = DEFAULT_ITR,
+ .arg = { .r = { .min = MIN_ITR,
+ .max = MAX_ITR }}
+ };
+
+ adapter->itr = InterruptThrottleRate[bd];
+ if(adapter->itr == 0) {
+ printk(KERN_INFO "%s turned off\n", opt.name);
+ } else if(adapter->itr == 1 || adapter->itr == -1) {
+ /* Dynamic mode */
+ adapter->itr = 1;
+ } else {
+ e1000_validate_option(&adapter->itr, &opt);
+ }
+ }
+
switch(adapter->hw.media_type) {
case e1000_media_type_fiber:
e1000_check_fiber_options(adapter);
@@ -478,15 +511,17 @@
{ /* Speed */
struct e1000_opt_list speed_list[] = {{ 0, "" },
- { SPEED_10, "" },
- { SPEED_100, "" },
- { SPEED_1000, "" }};
+ { SPEED_10, "" },
+ { SPEED_100, "" },
+ { SPEED_1000, "" }};
+
struct e1000_option opt = {
.type = list_option,
.name = "Speed",
.err = "parameter ignored",
.def = 0,
- .arg = { l: { nr: ARRAY_SIZE(speed_list), p: speed_list }}
+ .arg = { .l = { .nr = ARRAY_SIZE(speed_list),
+ .p = speed_list }}
};
speed = Speed[bd];
@@ -494,14 +529,16 @@
}
{ /* Duplex */
struct e1000_opt_list dplx_list[] = {{ 0, "" },
- { HALF_DUPLEX, "" },
- { FULL_DUPLEX, "" }};
+ { HALF_DUPLEX, "" },
+ { FULL_DUPLEX, "" }};
+
struct e1000_option opt = {
.type = list_option,
.name = "Duplex",
.err = "parameter ignored",
.def = 0,
- .arg = { l: { nr: ARRAY_SIZE(dplx_list), p: dplx_list }}
+ .arg = { .l = { .nr = ARRAY_SIZE(dplx_list),
+ .p = dplx_list }}
};
dplx = Duplex[bd];
@@ -553,7 +590,8 @@
.name = "AutoNeg",
.err = "parameter ignored",
.def = AUTONEG_ADV_DEFAULT,
- .arg = { l: { nr: ARRAY_SIZE(an_list), p: an_list }}
+ .arg = { .l = { .nr = ARRAY_SIZE(an_list),
+ .p = an_list }}
};
int an = AutoNeg[bd];
@@ -572,7 +610,7 @@
printk(KERN_INFO "Half Duplex specified without Speed\n");
printk(KERN_INFO "Using Autonegotiation at Half Duplex only\n");
adapter->hw.autoneg = 1;
- adapter->hw.autoneg_advertised = ADVERTISE_10_HALF |
+ adapter->hw.autoneg_advertised = ADVERTISE_10_HALF |
ADVERTISE_100_HALF;
break;
case FULL_DUPLEX:
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)