1dee1ad47SJeff Kirsher /*******************************************************************************
2dee1ad47SJeff Kirsher 
3dee1ad47SJeff Kirsher   Intel PRO/1000 Linux driver
4dee1ad47SJeff Kirsher   Copyright(c) 1999 - 2011 Intel Corporation.
5dee1ad47SJeff Kirsher 
6dee1ad47SJeff Kirsher   This program is free software; you can redistribute it and/or modify it
7dee1ad47SJeff Kirsher   under the terms and conditions of the GNU General Public License,
8dee1ad47SJeff Kirsher   version 2, as published by the Free Software Foundation.
9dee1ad47SJeff Kirsher 
10dee1ad47SJeff Kirsher   This program is distributed in the hope it will be useful, but WITHOUT
11dee1ad47SJeff Kirsher   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12dee1ad47SJeff Kirsher   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13dee1ad47SJeff Kirsher   more details.
14dee1ad47SJeff Kirsher 
15dee1ad47SJeff Kirsher   You should have received a copy of the GNU General Public License along with
16dee1ad47SJeff Kirsher   this program; if not, write to the Free Software Foundation, Inc.,
17dee1ad47SJeff Kirsher   51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18dee1ad47SJeff Kirsher 
19dee1ad47SJeff Kirsher   The full GNU General Public License is included in this distribution in
20dee1ad47SJeff Kirsher   the file called "COPYING".
21dee1ad47SJeff Kirsher 
22dee1ad47SJeff Kirsher   Contact Information:
23dee1ad47SJeff Kirsher   Linux NICS <linux.nics@intel.com>
24dee1ad47SJeff Kirsher   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
25dee1ad47SJeff Kirsher   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26dee1ad47SJeff Kirsher 
27dee1ad47SJeff Kirsher *******************************************************************************/
28dee1ad47SJeff Kirsher 
29dee1ad47SJeff Kirsher #include <linux/netdevice.h>
309d9779e7SPaul Gortmaker #include <linux/module.h>
31dee1ad47SJeff Kirsher #include <linux/pci.h>
32dee1ad47SJeff Kirsher 
33dee1ad47SJeff Kirsher #include "e1000.h"
34dee1ad47SJeff Kirsher 
35dee1ad47SJeff Kirsher /*
36dee1ad47SJeff Kirsher  * This is the only thing that needs to be changed to adjust the
37dee1ad47SJeff Kirsher  * maximum number of ports that the driver can manage.
38dee1ad47SJeff Kirsher  */
39dee1ad47SJeff Kirsher 
40dee1ad47SJeff Kirsher #define E1000_MAX_NIC 32
41dee1ad47SJeff Kirsher 
42dee1ad47SJeff Kirsher #define OPTION_UNSET   -1
43dee1ad47SJeff Kirsher #define OPTION_DISABLED 0
44dee1ad47SJeff Kirsher #define OPTION_ENABLED  1
45dee1ad47SJeff Kirsher 
46dee1ad47SJeff Kirsher #define COPYBREAK_DEFAULT 256
47dee1ad47SJeff Kirsher unsigned int copybreak = COPYBREAK_DEFAULT;
48dee1ad47SJeff Kirsher module_param(copybreak, uint, 0644);
49dee1ad47SJeff Kirsher MODULE_PARM_DESC(copybreak,
50dee1ad47SJeff Kirsher 	"Maximum size of packet that is copied to a new buffer on receive");
51dee1ad47SJeff Kirsher 
52dee1ad47SJeff Kirsher /*
53dee1ad47SJeff Kirsher  * All parameters are treated the same, as an integer array of values.
54dee1ad47SJeff Kirsher  * This macro just reduces the need to repeat the same declaration code
55dee1ad47SJeff Kirsher  * over and over (plus this helps to avoid typo bugs).
56dee1ad47SJeff Kirsher  */
57dee1ad47SJeff Kirsher 
58dee1ad47SJeff Kirsher #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET }
59dee1ad47SJeff Kirsher #define E1000_PARAM(X, desc)					\
60dee1ad47SJeff Kirsher 	static int __devinitdata X[E1000_MAX_NIC+1]		\
61dee1ad47SJeff Kirsher 		= E1000_PARAM_INIT;				\
62dee1ad47SJeff Kirsher 	static unsigned int num_##X;				\
63dee1ad47SJeff Kirsher 	module_param_array_named(X, X, int, &num_##X, 0);	\
64dee1ad47SJeff Kirsher 	MODULE_PARM_DESC(X, desc);
65dee1ad47SJeff Kirsher 
66dee1ad47SJeff Kirsher /*
67dee1ad47SJeff Kirsher  * Transmit Interrupt Delay in units of 1.024 microseconds
68dee1ad47SJeff Kirsher  * Tx interrupt delay needs to typically be set to something non-zero
69dee1ad47SJeff Kirsher  *
70dee1ad47SJeff Kirsher  * Valid Range: 0-65535
71dee1ad47SJeff Kirsher  */
72dee1ad47SJeff Kirsher E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay");
73dee1ad47SJeff Kirsher #define DEFAULT_TIDV 8
74dee1ad47SJeff Kirsher #define MAX_TXDELAY 0xFFFF
75dee1ad47SJeff Kirsher #define MIN_TXDELAY 0
76dee1ad47SJeff Kirsher 
77dee1ad47SJeff Kirsher /*
78dee1ad47SJeff Kirsher  * Transmit Absolute Interrupt Delay in units of 1.024 microseconds
79dee1ad47SJeff Kirsher  *
80dee1ad47SJeff Kirsher  * Valid Range: 0-65535
81dee1ad47SJeff Kirsher  */
82dee1ad47SJeff Kirsher E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");
83dee1ad47SJeff Kirsher #define DEFAULT_TADV 32
84dee1ad47SJeff Kirsher #define MAX_TXABSDELAY 0xFFFF
85dee1ad47SJeff Kirsher #define MIN_TXABSDELAY 0
86dee1ad47SJeff Kirsher 
87dee1ad47SJeff Kirsher /*
88dee1ad47SJeff Kirsher  * Receive Interrupt Delay in units of 1.024 microseconds
89dee1ad47SJeff Kirsher  * hardware will likely hang if you set this to anything but zero.
90dee1ad47SJeff Kirsher  *
91dee1ad47SJeff Kirsher  * Valid Range: 0-65535
92dee1ad47SJeff Kirsher  */
93dee1ad47SJeff Kirsher E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
94dee1ad47SJeff Kirsher #define MAX_RXDELAY 0xFFFF
95dee1ad47SJeff Kirsher #define MIN_RXDELAY 0
96dee1ad47SJeff Kirsher 
97dee1ad47SJeff Kirsher /*
98dee1ad47SJeff Kirsher  * Receive Absolute Interrupt Delay in units of 1.024 microseconds
99dee1ad47SJeff Kirsher  *
100dee1ad47SJeff Kirsher  * Valid Range: 0-65535
101dee1ad47SJeff Kirsher  */
102dee1ad47SJeff Kirsher E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
103dee1ad47SJeff Kirsher #define MAX_RXABSDELAY 0xFFFF
104dee1ad47SJeff Kirsher #define MIN_RXABSDELAY 0
105dee1ad47SJeff Kirsher 
106dee1ad47SJeff Kirsher /*
107dee1ad47SJeff Kirsher  * Interrupt Throttle Rate (interrupts/sec)
108dee1ad47SJeff Kirsher  *
109dee1ad47SJeff Kirsher  * Valid Range: 100-100000 (0=off, 1=dynamic, 3=dynamic conservative)
110dee1ad47SJeff Kirsher  */
111dee1ad47SJeff Kirsher E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
112dee1ad47SJeff Kirsher #define DEFAULT_ITR 3
113dee1ad47SJeff Kirsher #define MAX_ITR 100000
114dee1ad47SJeff Kirsher #define MIN_ITR 100
115dee1ad47SJeff Kirsher 
116dee1ad47SJeff Kirsher /* IntMode (Interrupt Mode)
117dee1ad47SJeff Kirsher  *
118dee1ad47SJeff Kirsher  * Valid Range: 0 - 2
119dee1ad47SJeff Kirsher  *
120dee1ad47SJeff Kirsher  * Default Value: 2 (MSI-X)
121dee1ad47SJeff Kirsher  */
122dee1ad47SJeff Kirsher E1000_PARAM(IntMode, "Interrupt Mode");
123dee1ad47SJeff Kirsher #define MAX_INTMODE	2
124dee1ad47SJeff Kirsher #define MIN_INTMODE	0
125dee1ad47SJeff Kirsher 
126dee1ad47SJeff Kirsher /*
127dee1ad47SJeff Kirsher  * Enable Smart Power Down of the PHY
128dee1ad47SJeff Kirsher  *
129dee1ad47SJeff Kirsher  * Valid Range: 0, 1
130dee1ad47SJeff Kirsher  *
131dee1ad47SJeff Kirsher  * Default Value: 0 (disabled)
132dee1ad47SJeff Kirsher  */
133dee1ad47SJeff Kirsher E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down");
134dee1ad47SJeff Kirsher 
135dee1ad47SJeff Kirsher /*
136dee1ad47SJeff Kirsher  * Enable Kumeran Lock Loss workaround
137dee1ad47SJeff Kirsher  *
138dee1ad47SJeff Kirsher  * Valid Range: 0, 1
139dee1ad47SJeff Kirsher  *
140dee1ad47SJeff Kirsher  * Default Value: 1 (enabled)
141dee1ad47SJeff Kirsher  */
142dee1ad47SJeff Kirsher E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
143dee1ad47SJeff Kirsher 
144dee1ad47SJeff Kirsher /*
145dee1ad47SJeff Kirsher  * Write Protect NVM
146dee1ad47SJeff Kirsher  *
147dee1ad47SJeff Kirsher  * Valid Range: 0, 1
148dee1ad47SJeff Kirsher  *
149dee1ad47SJeff Kirsher  * Default Value: 1 (enabled)
150dee1ad47SJeff Kirsher  */
151dee1ad47SJeff Kirsher E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]");
152dee1ad47SJeff Kirsher 
153dee1ad47SJeff Kirsher /*
154dee1ad47SJeff Kirsher  * Enable CRC Stripping
155dee1ad47SJeff Kirsher  *
156dee1ad47SJeff Kirsher  * Valid Range: 0, 1
157dee1ad47SJeff Kirsher  *
158dee1ad47SJeff Kirsher  * Default Value: 1 (enabled)
159dee1ad47SJeff Kirsher  */
160dee1ad47SJeff Kirsher E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \
161dee1ad47SJeff Kirsher                           "the CRC");
162dee1ad47SJeff Kirsher 
163dee1ad47SJeff Kirsher struct e1000_option {
164dee1ad47SJeff Kirsher 	enum { enable_option, range_option, list_option } type;
165dee1ad47SJeff Kirsher 	const char *name;
166dee1ad47SJeff Kirsher 	const char *err;
167dee1ad47SJeff Kirsher 	int def;
168dee1ad47SJeff Kirsher 	union {
169dee1ad47SJeff Kirsher 		struct { /* range_option info */
170dee1ad47SJeff Kirsher 			int min;
171dee1ad47SJeff Kirsher 			int max;
172dee1ad47SJeff Kirsher 		} r;
173dee1ad47SJeff Kirsher 		struct { /* list_option info */
174dee1ad47SJeff Kirsher 			int nr;
175dee1ad47SJeff Kirsher 			struct e1000_opt_list { int i; char *str; } *p;
176dee1ad47SJeff Kirsher 		} l;
177dee1ad47SJeff Kirsher 	} arg;
178dee1ad47SJeff Kirsher };
179dee1ad47SJeff Kirsher 
180dee1ad47SJeff Kirsher static int __devinit e1000_validate_option(unsigned int *value,
181dee1ad47SJeff Kirsher 					   const struct e1000_option *opt,
182dee1ad47SJeff Kirsher 					   struct e1000_adapter *adapter)
183dee1ad47SJeff Kirsher {
184dee1ad47SJeff Kirsher 	if (*value == OPTION_UNSET) {
185dee1ad47SJeff Kirsher 		*value = opt->def;
186dee1ad47SJeff Kirsher 		return 0;
187dee1ad47SJeff Kirsher 	}
188dee1ad47SJeff Kirsher 
189dee1ad47SJeff Kirsher 	switch (opt->type) {
190dee1ad47SJeff Kirsher 	case enable_option:
191dee1ad47SJeff Kirsher 		switch (*value) {
192dee1ad47SJeff Kirsher 		case OPTION_ENABLED:
193dee1ad47SJeff Kirsher 			e_info("%s Enabled\n", opt->name);
194dee1ad47SJeff Kirsher 			return 0;
195dee1ad47SJeff Kirsher 		case OPTION_DISABLED:
196dee1ad47SJeff Kirsher 			e_info("%s Disabled\n", opt->name);
197dee1ad47SJeff Kirsher 			return 0;
198dee1ad47SJeff Kirsher 		}
199dee1ad47SJeff Kirsher 		break;
200dee1ad47SJeff Kirsher 	case range_option:
201dee1ad47SJeff Kirsher 		if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
202dee1ad47SJeff Kirsher 			e_info("%s set to %i\n", opt->name, *value);
203dee1ad47SJeff Kirsher 			return 0;
204dee1ad47SJeff Kirsher 		}
205dee1ad47SJeff Kirsher 		break;
206dee1ad47SJeff Kirsher 	case list_option: {
207dee1ad47SJeff Kirsher 		int i;
208dee1ad47SJeff Kirsher 		struct e1000_opt_list *ent;
209dee1ad47SJeff Kirsher 
210dee1ad47SJeff Kirsher 		for (i = 0; i < opt->arg.l.nr; i++) {
211dee1ad47SJeff Kirsher 			ent = &opt->arg.l.p[i];
212dee1ad47SJeff Kirsher 			if (*value == ent->i) {
213dee1ad47SJeff Kirsher 				if (ent->str[0] != '\0')
214dee1ad47SJeff Kirsher 					e_info("%s\n", ent->str);
215dee1ad47SJeff Kirsher 				return 0;
216dee1ad47SJeff Kirsher 			}
217dee1ad47SJeff Kirsher 		}
218dee1ad47SJeff Kirsher 	}
219dee1ad47SJeff Kirsher 		break;
220dee1ad47SJeff Kirsher 	default:
221dee1ad47SJeff Kirsher 		BUG();
222dee1ad47SJeff Kirsher 	}
223dee1ad47SJeff Kirsher 
224dee1ad47SJeff Kirsher 	e_info("Invalid %s value specified (%i) %s\n", opt->name, *value,
225dee1ad47SJeff Kirsher 	       opt->err);
226dee1ad47SJeff Kirsher 	*value = opt->def;
227dee1ad47SJeff Kirsher 	return -1;
228dee1ad47SJeff Kirsher }
229dee1ad47SJeff Kirsher 
230dee1ad47SJeff Kirsher /**
231dee1ad47SJeff Kirsher  * e1000e_check_options - Range Checking for Command Line Parameters
232dee1ad47SJeff Kirsher  * @adapter: board private structure
233dee1ad47SJeff Kirsher  *
234dee1ad47SJeff Kirsher  * This routine checks all command line parameters for valid user
235dee1ad47SJeff Kirsher  * input.  If an invalid value is given, or if no user specified
236dee1ad47SJeff Kirsher  * value exists, a default value is used.  The final value is stored
237dee1ad47SJeff Kirsher  * in a variable in the adapter structure.
238dee1ad47SJeff Kirsher  **/
239dee1ad47SJeff Kirsher void __devinit e1000e_check_options(struct e1000_adapter *adapter)
240dee1ad47SJeff Kirsher {
241dee1ad47SJeff Kirsher 	struct e1000_hw *hw = &adapter->hw;
242dee1ad47SJeff Kirsher 	int bd = adapter->bd_number;
243dee1ad47SJeff Kirsher 
244dee1ad47SJeff Kirsher 	if (bd >= E1000_MAX_NIC) {
245dee1ad47SJeff Kirsher 		e_notice("Warning: no configuration for board #%i\n", bd);
246dee1ad47SJeff Kirsher 		e_notice("Using defaults for all values\n");
247dee1ad47SJeff Kirsher 	}
248dee1ad47SJeff Kirsher 
249dee1ad47SJeff Kirsher 	{ /* Transmit Interrupt Delay */
250dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
251dee1ad47SJeff Kirsher 			.type = range_option,
252dee1ad47SJeff Kirsher 			.name = "Transmit Interrupt Delay",
253dee1ad47SJeff Kirsher 			.err  = "using default of "
254dee1ad47SJeff Kirsher 				__MODULE_STRING(DEFAULT_TIDV),
255dee1ad47SJeff Kirsher 			.def  = DEFAULT_TIDV,
256dee1ad47SJeff Kirsher 			.arg  = { .r = { .min = MIN_TXDELAY,
257dee1ad47SJeff Kirsher 					 .max = MAX_TXDELAY } }
258dee1ad47SJeff Kirsher 		};
259dee1ad47SJeff Kirsher 
260dee1ad47SJeff Kirsher 		if (num_TxIntDelay > bd) {
261dee1ad47SJeff Kirsher 			adapter->tx_int_delay = TxIntDelay[bd];
262dee1ad47SJeff Kirsher 			e1000_validate_option(&adapter->tx_int_delay, &opt,
263dee1ad47SJeff Kirsher 					      adapter);
264dee1ad47SJeff Kirsher 		} else {
265dee1ad47SJeff Kirsher 			adapter->tx_int_delay = opt.def;
266dee1ad47SJeff Kirsher 		}
267dee1ad47SJeff Kirsher 	}
268dee1ad47SJeff Kirsher 	{ /* Transmit Absolute Interrupt Delay */
269dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
270dee1ad47SJeff Kirsher 			.type = range_option,
271dee1ad47SJeff Kirsher 			.name = "Transmit Absolute Interrupt Delay",
272dee1ad47SJeff Kirsher 			.err  = "using default of "
273dee1ad47SJeff Kirsher 				__MODULE_STRING(DEFAULT_TADV),
274dee1ad47SJeff Kirsher 			.def  = DEFAULT_TADV,
275dee1ad47SJeff Kirsher 			.arg  = { .r = { .min = MIN_TXABSDELAY,
276dee1ad47SJeff Kirsher 					 .max = MAX_TXABSDELAY } }
277dee1ad47SJeff Kirsher 		};
278dee1ad47SJeff Kirsher 
279dee1ad47SJeff Kirsher 		if (num_TxAbsIntDelay > bd) {
280dee1ad47SJeff Kirsher 			adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
281dee1ad47SJeff Kirsher 			e1000_validate_option(&adapter->tx_abs_int_delay, &opt,
282dee1ad47SJeff Kirsher 					      adapter);
283dee1ad47SJeff Kirsher 		} else {
284dee1ad47SJeff Kirsher 			adapter->tx_abs_int_delay = opt.def;
285dee1ad47SJeff Kirsher 		}
286dee1ad47SJeff Kirsher 	}
287dee1ad47SJeff Kirsher 	{ /* Receive Interrupt Delay */
288dee1ad47SJeff Kirsher 		static struct e1000_option opt = {
289dee1ad47SJeff Kirsher 			.type = range_option,
290dee1ad47SJeff Kirsher 			.name = "Receive Interrupt Delay",
291dee1ad47SJeff Kirsher 			.err  = "using default of "
292dee1ad47SJeff Kirsher 				__MODULE_STRING(DEFAULT_RDTR),
293dee1ad47SJeff Kirsher 			.def  = DEFAULT_RDTR,
294dee1ad47SJeff Kirsher 			.arg  = { .r = { .min = MIN_RXDELAY,
295dee1ad47SJeff Kirsher 					 .max = MAX_RXDELAY } }
296dee1ad47SJeff Kirsher 		};
297dee1ad47SJeff Kirsher 
298dee1ad47SJeff Kirsher 		if (num_RxIntDelay > bd) {
299dee1ad47SJeff Kirsher 			adapter->rx_int_delay = RxIntDelay[bd];
300dee1ad47SJeff Kirsher 			e1000_validate_option(&adapter->rx_int_delay, &opt,
301dee1ad47SJeff Kirsher 					      adapter);
302dee1ad47SJeff Kirsher 		} else {
303dee1ad47SJeff Kirsher 			adapter->rx_int_delay = opt.def;
304dee1ad47SJeff Kirsher 		}
305dee1ad47SJeff Kirsher 	}
306dee1ad47SJeff Kirsher 	{ /* Receive Absolute Interrupt Delay */
307dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
308dee1ad47SJeff Kirsher 			.type = range_option,
309dee1ad47SJeff Kirsher 			.name = "Receive Absolute Interrupt Delay",
310dee1ad47SJeff Kirsher 			.err  = "using default of "
311dee1ad47SJeff Kirsher 				__MODULE_STRING(DEFAULT_RADV),
312dee1ad47SJeff Kirsher 			.def  = DEFAULT_RADV,
313dee1ad47SJeff Kirsher 			.arg  = { .r = { .min = MIN_RXABSDELAY,
314dee1ad47SJeff Kirsher 					 .max = MAX_RXABSDELAY } }
315dee1ad47SJeff Kirsher 		};
316dee1ad47SJeff Kirsher 
317dee1ad47SJeff Kirsher 		if (num_RxAbsIntDelay > bd) {
318dee1ad47SJeff Kirsher 			adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
319dee1ad47SJeff Kirsher 			e1000_validate_option(&adapter->rx_abs_int_delay, &opt,
320dee1ad47SJeff Kirsher 					      adapter);
321dee1ad47SJeff Kirsher 		} else {
322dee1ad47SJeff Kirsher 			adapter->rx_abs_int_delay = opt.def;
323dee1ad47SJeff Kirsher 		}
324dee1ad47SJeff Kirsher 	}
325dee1ad47SJeff Kirsher 	{ /* Interrupt Throttling Rate */
326dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
327dee1ad47SJeff Kirsher 			.type = range_option,
328dee1ad47SJeff Kirsher 			.name = "Interrupt Throttling Rate (ints/sec)",
329dee1ad47SJeff Kirsher 			.err  = "using default of "
330dee1ad47SJeff Kirsher 				__MODULE_STRING(DEFAULT_ITR),
331dee1ad47SJeff Kirsher 			.def  = DEFAULT_ITR,
332dee1ad47SJeff Kirsher 			.arg  = { .r = { .min = MIN_ITR,
333dee1ad47SJeff Kirsher 					 .max = MAX_ITR } }
334dee1ad47SJeff Kirsher 		};
335dee1ad47SJeff Kirsher 
336dee1ad47SJeff Kirsher 		if (num_InterruptThrottleRate > bd) {
337dee1ad47SJeff Kirsher 			adapter->itr = InterruptThrottleRate[bd];
338dee1ad47SJeff Kirsher 			switch (adapter->itr) {
339dee1ad47SJeff Kirsher 			case 0:
340dee1ad47SJeff Kirsher 				e_info("%s turned off\n", opt.name);
341dee1ad47SJeff Kirsher 				break;
342dee1ad47SJeff Kirsher 			case 1:
343dee1ad47SJeff Kirsher 				e_info("%s set to dynamic mode\n", opt.name);
344dee1ad47SJeff Kirsher 				adapter->itr_setting = adapter->itr;
345dee1ad47SJeff Kirsher 				adapter->itr = 20000;
346dee1ad47SJeff Kirsher 				break;
347dee1ad47SJeff Kirsher 			case 3:
348dee1ad47SJeff Kirsher 				e_info("%s set to dynamic conservative mode\n",
349dee1ad47SJeff Kirsher 					opt.name);
350dee1ad47SJeff Kirsher 				adapter->itr_setting = adapter->itr;
351dee1ad47SJeff Kirsher 				adapter->itr = 20000;
352dee1ad47SJeff Kirsher 				break;
353dee1ad47SJeff Kirsher 			case 4:
354dee1ad47SJeff Kirsher 				e_info("%s set to simplified (2000-8000 ints) "
355dee1ad47SJeff Kirsher 				       "mode\n", opt.name);
356dee1ad47SJeff Kirsher 				adapter->itr_setting = 4;
357dee1ad47SJeff Kirsher 				break;
358dee1ad47SJeff Kirsher 			default:
359dee1ad47SJeff Kirsher 				/*
360dee1ad47SJeff Kirsher 				 * Save the setting, because the dynamic bits
361dee1ad47SJeff Kirsher 				 * change itr.
362dee1ad47SJeff Kirsher 				 */
363dee1ad47SJeff Kirsher 				if (e1000_validate_option(&adapter->itr, &opt,
364dee1ad47SJeff Kirsher 							  adapter) &&
365dee1ad47SJeff Kirsher 				    (adapter->itr == 3)) {
366dee1ad47SJeff Kirsher 					/*
367dee1ad47SJeff Kirsher 					 * In case of invalid user value,
368dee1ad47SJeff Kirsher 					 * default to conservative mode.
369dee1ad47SJeff Kirsher 					 */
370dee1ad47SJeff Kirsher 					adapter->itr_setting = adapter->itr;
371dee1ad47SJeff Kirsher 					adapter->itr = 20000;
372dee1ad47SJeff Kirsher 				} else {
373dee1ad47SJeff Kirsher 					/*
374dee1ad47SJeff Kirsher 					 * Clear the lower two bits because
375dee1ad47SJeff Kirsher 					 * they are used as control.
376dee1ad47SJeff Kirsher 					 */
377dee1ad47SJeff Kirsher 					adapter->itr_setting =
378dee1ad47SJeff Kirsher 						adapter->itr & ~3;
379dee1ad47SJeff Kirsher 				}
380dee1ad47SJeff Kirsher 				break;
381dee1ad47SJeff Kirsher 			}
382dee1ad47SJeff Kirsher 		} else {
383dee1ad47SJeff Kirsher 			adapter->itr_setting = opt.def;
384dee1ad47SJeff Kirsher 			adapter->itr = 20000;
385dee1ad47SJeff Kirsher 		}
386dee1ad47SJeff Kirsher 	}
387dee1ad47SJeff Kirsher 	{ /* Interrupt Mode */
388dee1ad47SJeff Kirsher 		static struct e1000_option opt = {
389dee1ad47SJeff Kirsher 			.type = range_option,
390dee1ad47SJeff Kirsher 			.name = "Interrupt Mode",
391dee1ad47SJeff Kirsher 			.err  = "defaulting to 2 (MSI-X)",
392dee1ad47SJeff Kirsher 			.def  = E1000E_INT_MODE_MSIX,
393dee1ad47SJeff Kirsher 			.arg  = { .r = { .min = MIN_INTMODE,
394dee1ad47SJeff Kirsher 					 .max = MAX_INTMODE } }
395dee1ad47SJeff Kirsher 		};
396dee1ad47SJeff Kirsher 
397dee1ad47SJeff Kirsher 		if (num_IntMode > bd) {
398dee1ad47SJeff Kirsher 			unsigned int int_mode = IntMode[bd];
399dee1ad47SJeff Kirsher 			e1000_validate_option(&int_mode, &opt, adapter);
400dee1ad47SJeff Kirsher 			adapter->int_mode = int_mode;
401dee1ad47SJeff Kirsher 		} else {
402dee1ad47SJeff Kirsher 			adapter->int_mode = opt.def;
403dee1ad47SJeff Kirsher 		}
404dee1ad47SJeff Kirsher 	}
405dee1ad47SJeff Kirsher 	{ /* Smart Power Down */
406dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
407dee1ad47SJeff Kirsher 			.type = enable_option,
408dee1ad47SJeff Kirsher 			.name = "PHY Smart Power Down",
409dee1ad47SJeff Kirsher 			.err  = "defaulting to Disabled",
410dee1ad47SJeff Kirsher 			.def  = OPTION_DISABLED
411dee1ad47SJeff Kirsher 		};
412dee1ad47SJeff Kirsher 
413dee1ad47SJeff Kirsher 		if (num_SmartPowerDownEnable > bd) {
414dee1ad47SJeff Kirsher 			unsigned int spd = SmartPowerDownEnable[bd];
415dee1ad47SJeff Kirsher 			e1000_validate_option(&spd, &opt, adapter);
416dee1ad47SJeff Kirsher 			if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN)
417dee1ad47SJeff Kirsher 			    && spd)
418dee1ad47SJeff Kirsher 				adapter->flags |= FLAG_SMART_POWER_DOWN;
419dee1ad47SJeff Kirsher 		}
420dee1ad47SJeff Kirsher 	}
421dee1ad47SJeff Kirsher 	{ /* CRC Stripping */
422dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
423dee1ad47SJeff Kirsher 			.type = enable_option,
424dee1ad47SJeff Kirsher 			.name = "CRC Stripping",
425dee1ad47SJeff Kirsher 			.err  = "defaulting to Enabled",
426dee1ad47SJeff Kirsher 			.def  = OPTION_ENABLED
427dee1ad47SJeff Kirsher 		};
428dee1ad47SJeff Kirsher 
429dee1ad47SJeff Kirsher 		if (num_CrcStripping > bd) {
430dee1ad47SJeff Kirsher 			unsigned int crc_stripping = CrcStripping[bd];
431dee1ad47SJeff Kirsher 			e1000_validate_option(&crc_stripping, &opt, adapter);
432dee1ad47SJeff Kirsher 			if (crc_stripping == OPTION_ENABLED)
433dee1ad47SJeff Kirsher 				adapter->flags2 |= FLAG2_CRC_STRIPPING;
434dee1ad47SJeff Kirsher 		} else {
435dee1ad47SJeff Kirsher 			adapter->flags2 |= FLAG2_CRC_STRIPPING;
436dee1ad47SJeff Kirsher 		}
437dee1ad47SJeff Kirsher 	}
438dee1ad47SJeff Kirsher 	{ /* Kumeran Lock Loss Workaround */
439dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
440dee1ad47SJeff Kirsher 			.type = enable_option,
441dee1ad47SJeff Kirsher 			.name = "Kumeran Lock Loss Workaround",
442dee1ad47SJeff Kirsher 			.err  = "defaulting to Enabled",
443dee1ad47SJeff Kirsher 			.def  = OPTION_ENABLED
444dee1ad47SJeff Kirsher 		};
445dee1ad47SJeff Kirsher 
446dee1ad47SJeff Kirsher 		if (num_KumeranLockLoss > bd) {
447dee1ad47SJeff Kirsher 			unsigned int kmrn_lock_loss = KumeranLockLoss[bd];
448dee1ad47SJeff Kirsher 			e1000_validate_option(&kmrn_lock_loss, &opt, adapter);
449dee1ad47SJeff Kirsher 			if (hw->mac.type == e1000_ich8lan)
450dee1ad47SJeff Kirsher 				e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw,
451dee1ad47SJeff Kirsher 								kmrn_lock_loss);
452dee1ad47SJeff Kirsher 		} else {
453dee1ad47SJeff Kirsher 			if (hw->mac.type == e1000_ich8lan)
454dee1ad47SJeff Kirsher 				e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw,
455dee1ad47SJeff Kirsher 								       opt.def);
456dee1ad47SJeff Kirsher 		}
457dee1ad47SJeff Kirsher 	}
458dee1ad47SJeff Kirsher 	{ /* Write-protect NVM */
459dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
460dee1ad47SJeff Kirsher 			.type = enable_option,
461dee1ad47SJeff Kirsher 			.name = "Write-protect NVM",
462dee1ad47SJeff Kirsher 			.err  = "defaulting to Enabled",
463dee1ad47SJeff Kirsher 			.def  = OPTION_ENABLED
464dee1ad47SJeff Kirsher 		};
465dee1ad47SJeff Kirsher 
466dee1ad47SJeff Kirsher 		if (adapter->flags & FLAG_IS_ICH) {
467dee1ad47SJeff Kirsher 			if (num_WriteProtectNVM > bd) {
468dee1ad47SJeff Kirsher 				unsigned int write_protect_nvm = WriteProtectNVM[bd];
469dee1ad47SJeff Kirsher 				e1000_validate_option(&write_protect_nvm, &opt,
470dee1ad47SJeff Kirsher 						      adapter);
471dee1ad47SJeff Kirsher 				if (write_protect_nvm)
472dee1ad47SJeff Kirsher 					adapter->flags |= FLAG_READ_ONLY_NVM;
473dee1ad47SJeff Kirsher 			} else {
474dee1ad47SJeff Kirsher 				if (opt.def)
475dee1ad47SJeff Kirsher 					adapter->flags |= FLAG_READ_ONLY_NVM;
476dee1ad47SJeff Kirsher 			}
477dee1ad47SJeff Kirsher 		}
478dee1ad47SJeff Kirsher 	}
479dee1ad47SJeff Kirsher }
480