1 /*******************************************************************************
3 Intel PRO/10GbE Linux driver
4 Copyright(c) 1999 - 2008 Intel Corporation.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms and conditions of the GNU General Public License,
8 version 2, as published by the Free Software Foundation.
10 This program is distributed in the hope it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 You should have received a copy of the GNU General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19 The full GNU General Public License is included in this distribution in
20 the file called "COPYING".
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *******************************************************************************/
31 /* This is the only thing that needs to be changed to adjust the
32 * maximum number of ports that the driver can manage.
35 #define IXGB_MAX_NIC 8
37 #define OPTION_UNSET -1
38 #define OPTION_DISABLED 0
39 #define OPTION_ENABLED 1
41 /* All parameters are treated the same, as an integer array of values.
42 * This macro just reduces the need to repeat the same declaration code
43 * over and over (plus this helps to avoid typo bugs).
46 #define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET }
47 #define IXGB_PARAM(X, desc) \
48 static int __devinitdata X[IXGB_MAX_NIC+1] \
50 static unsigned int num_##X = 0; \
51 module_param_array_named(X, X, int, &num_##X, 0); \
52 MODULE_PARM_DESC(X, desc);
54 /* Transmit Descriptor Count
56 * Valid Range: 64-4096
61 IXGB_PARAM(TxDescriptors, "Number of transmit descriptors");
63 /* Receive Descriptor Count
65 * Valid Range: 64-4096
70 IXGB_PARAM(RxDescriptors, "Number of receive descriptors");
72 /* User Specified Flow Control Override
75 * - 0 - No Flow Control
76 * - 1 - Rx only, respond to PAUSE frames but do not generate them
77 * - 2 - Tx only, generate PAUSE frames but ignore them on receive
78 * - 3 - Full Flow Control Support
80 * Default Value: 2 - Tx only (silicon bug avoidance)
83 IXGB_PARAM(FlowControl, "Flow Control setting");
85 /* XsumRX - Receive Checksum Offload Enable/Disable
88 * - 0 - disables all checksum offload
89 * - 1 - enables receive IP/TCP/UDP checksum offload
95 IXGB_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
97 /* Transmit Interrupt Delay in units of 0.8192 microseconds
99 * Valid Range: 0-65535
104 IXGB_PARAM(TxIntDelay, "Transmit Interrupt Delay");
106 /* Receive Interrupt Delay in units of 0.8192 microseconds
108 * Valid Range: 0-65535
113 IXGB_PARAM(RxIntDelay, "Receive Interrupt Delay");
115 /* Receive Flow control high threshold (when we send a pause frame)
118 * Valid Range: 1,536 - 262,136 (0x600 - 0x3FFF8, 8 byte granularity)
120 * Default Value: 196,608 (0x30000)
123 IXGB_PARAM(RxFCHighThresh, "Receive Flow Control High Threshold");
125 /* Receive Flow control low threshold (when we send a resume frame)
128 * Valid Range: 64 - 262,136 (0x40 - 0x3FFF8, 8 byte granularity)
129 * must be less than high threshold by at least 8 bytes
131 * Default Value: 163,840 (0x28000)
134 IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold");
136 /* Flow control request timeout (how long to pause the link partner's tx)
139 * Valid Range: 1 - 65535
141 * Default Value: 65535 (0xffff) (we'll send an xon if we recover)
144 IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout");
146 /* Interrupt Delay Enable
150 * - 0 - disables transmit interrupt delay
151 * - 1 - enables transmmit interrupt delay
156 IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable");
159 #define DEFAULT_TIDV 32
160 #define MAX_TIDV 0xFFFF
163 #define DEFAULT_RDTR 72
164 #define MAX_RDTR 0xFFFF
167 #define XSUMRX_DEFAULT OPTION_ENABLED
169 #define DEFAULT_FCRTL 0x28000
170 #define DEFAULT_FCRTH 0x30000
172 #define MAX_FCRTL 0x3FFE8
174 #define MAX_FCRTH 0x3FFF0
176 #define MIN_FCPAUSE 1
177 #define MAX_FCPAUSE 0xffff
178 #define DEFAULT_FCPAUSE 0xFFFF /* this may be too long */
181 enum { enable_option, range_option, list_option } type;
186 struct { /* range_option info */
190 struct { /* list_option info */
192 struct ixgb_opt_list {
201 ixgb_validate_option(unsigned int *value, const struct ixgb_option *opt)
203 if (*value == OPTION_UNSET) {
212 printk(KERN_INFO "%s Enabled\n", opt->name);
214 case OPTION_DISABLED:
215 printk(KERN_INFO "%s Disabled\n", opt->name);
220 if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
221 printk(KERN_INFO "%s set to %i\n", opt->name, *value);
227 struct ixgb_opt_list *ent;
229 for (i = 0; i < opt->arg.l.nr; i++) {
230 ent = &opt->arg.l.p[i];
231 if (*value == ent->i) {
232 if (ent->str[0] != '\0')
233 printk(KERN_INFO "%s\n", ent->str);
243 printk(KERN_INFO "Invalid %s specified (%i) %s\n",
244 opt->name, *value, opt->err);
250 * ixgb_check_options - Range Checking for Command Line Parameters
251 * @adapter: board private structure
253 * This routine checks all command line parameters for valid user
254 * input. If an invalid value is given, or if no user specified
255 * value exists, a default value is used. The final value is stored
256 * in a variable in the adapter structure.
260 ixgb_check_options(struct ixgb_adapter *adapter)
262 int bd = adapter->bd_number;
263 if (bd >= IXGB_MAX_NIC) {
265 "Warning: no configuration for board #%i\n", bd);
266 printk(KERN_NOTICE "Using defaults for all values\n");
269 { /* Transmit Descriptor Count */
270 const struct ixgb_option opt = {
271 .type = range_option,
272 .name = "Transmit Descriptors",
273 .err = "using default of " __MODULE_STRING(DEFAULT_TXD),
275 .arg = { .r = { .min = MIN_TXD,
278 struct ixgb_desc_ring *tx_ring = &adapter->tx_ring;
280 if (num_TxDescriptors > bd) {
281 tx_ring->count = TxDescriptors[bd];
282 ixgb_validate_option(&tx_ring->count, &opt);
284 tx_ring->count = opt.def;
286 tx_ring->count = ALIGN(tx_ring->count, IXGB_REQ_TX_DESCRIPTOR_MULTIPLE);
288 { /* Receive Descriptor Count */
289 const struct ixgb_option opt = {
290 .type = range_option,
291 .name = "Receive Descriptors",
292 .err = "using default of " __MODULE_STRING(DEFAULT_RXD),
294 .arg = { .r = { .min = MIN_RXD,
297 struct ixgb_desc_ring *rx_ring = &adapter->rx_ring;
299 if (num_RxDescriptors > bd) {
300 rx_ring->count = RxDescriptors[bd];
301 ixgb_validate_option(&rx_ring->count, &opt);
303 rx_ring->count = opt.def;
305 rx_ring->count = ALIGN(rx_ring->count, IXGB_REQ_RX_DESCRIPTOR_MULTIPLE);
307 { /* Receive Checksum Offload Enable */
308 const struct ixgb_option opt = {
309 .type = enable_option,
310 .name = "Receive Checksum Offload",
311 .err = "defaulting to Enabled",
312 .def = OPTION_ENABLED
315 if (num_XsumRX > bd) {
316 unsigned int rx_csum = XsumRX[bd];
317 ixgb_validate_option(&rx_csum, &opt);
318 adapter->rx_csum = rx_csum;
320 adapter->rx_csum = opt.def;
325 struct ixgb_opt_list fc_list[] =
326 {{ ixgb_fc_none, "Flow Control Disabled" },
327 { ixgb_fc_rx_pause,"Flow Control Receive Only" },
328 { ixgb_fc_tx_pause,"Flow Control Transmit Only" },
329 { ixgb_fc_full, "Flow Control Enabled" },
330 { ixgb_fc_default, "Flow Control Hardware Default" }};
332 const struct ixgb_option opt = {
334 .name = "Flow Control",
335 .err = "reading default settings from EEPROM",
336 .def = ixgb_fc_tx_pause,
337 .arg = { .l = { .nr = ARRAY_SIZE(fc_list),
341 if (num_FlowControl > bd) {
342 unsigned int fc = FlowControl[bd];
343 ixgb_validate_option(&fc, &opt);
344 adapter->hw.fc.type = fc;
346 adapter->hw.fc.type = opt.def;
349 { /* Receive Flow Control High Threshold */
350 const struct ixgb_option opt = {
351 .type = range_option,
352 .name = "Rx Flow Control High Threshold",
353 .err = "using default of " __MODULE_STRING(DEFAULT_FCRTH),
354 .def = DEFAULT_FCRTH,
355 .arg = { .r = { .min = MIN_FCRTH,
359 if (num_RxFCHighThresh > bd) {
360 adapter->hw.fc.high_water = RxFCHighThresh[bd];
361 ixgb_validate_option(&adapter->hw.fc.high_water, &opt);
363 adapter->hw.fc.high_water = opt.def;
365 if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
367 "Ignoring RxFCHighThresh when no RxFC\n");
369 { /* Receive Flow Control Low Threshold */
370 const struct ixgb_option opt = {
371 .type = range_option,
372 .name = "Rx Flow Control Low Threshold",
373 .err = "using default of " __MODULE_STRING(DEFAULT_FCRTL),
374 .def = DEFAULT_FCRTL,
375 .arg = { .r = { .min = MIN_FCRTL,
379 if (num_RxFCLowThresh > bd) {
380 adapter->hw.fc.low_water = RxFCLowThresh[bd];
381 ixgb_validate_option(&adapter->hw.fc.low_water, &opt);
383 adapter->hw.fc.low_water = opt.def;
385 if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
387 "Ignoring RxFCLowThresh when no RxFC\n");
389 { /* Flow Control Pause Time Request*/
390 const struct ixgb_option opt = {
391 .type = range_option,
392 .name = "Flow Control Pause Time Request",
393 .err = "using default of "__MODULE_STRING(DEFAULT_FCPAUSE),
394 .def = DEFAULT_FCPAUSE,
395 .arg = { .r = { .min = MIN_FCPAUSE,
399 if (num_FCReqTimeout > bd) {
400 unsigned int pause_time = FCReqTimeout[bd];
401 ixgb_validate_option(&pause_time, &opt);
402 adapter->hw.fc.pause_time = pause_time;
404 adapter->hw.fc.pause_time = opt.def;
406 if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
408 "Ignoring FCReqTimeout when no RxFC\n");
410 /* high low and spacing check for rx flow control thresholds */
411 if (adapter->hw.fc.type & ixgb_fc_tx_pause) {
412 /* high must be greater than low */
413 if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) {
416 "RxFCHighThresh must be >= (RxFCLowThresh + 8), "
418 adapter->hw.fc.high_water = DEFAULT_FCRTH;
419 adapter->hw.fc.low_water = DEFAULT_FCRTL;
422 { /* Receive Interrupt Delay */
423 const struct ixgb_option opt = {
424 .type = range_option,
425 .name = "Receive Interrupt Delay",
426 .err = "using default of " __MODULE_STRING(DEFAULT_RDTR),
428 .arg = { .r = { .min = MIN_RDTR,
432 if (num_RxIntDelay > bd) {
433 adapter->rx_int_delay = RxIntDelay[bd];
434 ixgb_validate_option(&adapter->rx_int_delay, &opt);
436 adapter->rx_int_delay = opt.def;
439 { /* Transmit Interrupt Delay */
440 const struct ixgb_option opt = {
441 .type = range_option,
442 .name = "Transmit Interrupt Delay",
443 .err = "using default of " __MODULE_STRING(DEFAULT_TIDV),
445 .arg = { .r = { .min = MIN_TIDV,
449 if (num_TxIntDelay > bd) {
450 adapter->tx_int_delay = TxIntDelay[bd];
451 ixgb_validate_option(&adapter->tx_int_delay, &opt);
453 adapter->tx_int_delay = opt.def;
457 { /* Transmit Interrupt Delay Enable */
458 const struct ixgb_option opt = {
459 .type = enable_option,
460 .name = "Tx Interrupt Delay Enable",
461 .err = "defaulting to Enabled",
462 .def = OPTION_ENABLED
465 if (num_IntDelayEnable > bd) {
466 unsigned int ide = IntDelayEnable[bd];
467 ixgb_validate_option(&ide, &opt);
468 adapter->tx_int_delay_enable = ide;
470 adapter->tx_int_delay_enable = opt.def;