1dee1ad47SJeff Kirsher /*******************************************************************************
2dee1ad47SJeff Kirsher 
3dee1ad47SJeff Kirsher   Intel PRO/1000 Linux driver
4bf67044bSBruce Allan   Copyright(c) 1999 - 2013 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 
35e921eb1aSBruce Allan /* This is the only thing that needs to be changed to adjust the
36dee1ad47SJeff Kirsher  * maximum number of ports that the driver can manage.
37dee1ad47SJeff Kirsher  */
38dee1ad47SJeff Kirsher #define E1000_MAX_NIC 32
39dee1ad47SJeff Kirsher 
40dee1ad47SJeff Kirsher #define OPTION_UNSET   -1
41dee1ad47SJeff Kirsher #define OPTION_DISABLED 0
42dee1ad47SJeff Kirsher #define OPTION_ENABLED  1
43dee1ad47SJeff Kirsher 
44dee1ad47SJeff Kirsher #define COPYBREAK_DEFAULT 256
45dee1ad47SJeff Kirsher unsigned int copybreak = COPYBREAK_DEFAULT;
46dee1ad47SJeff Kirsher module_param(copybreak, uint, 0644);
47dee1ad47SJeff Kirsher MODULE_PARM_DESC(copybreak,
48dee1ad47SJeff Kirsher 	"Maximum size of packet that is copied to a new buffer on receive");
49dee1ad47SJeff Kirsher 
50e921eb1aSBruce Allan /* All parameters are treated the same, as an integer array of values.
51dee1ad47SJeff Kirsher  * This macro just reduces the need to repeat the same declaration code
52dee1ad47SJeff Kirsher  * over and over (plus this helps to avoid typo bugs).
53dee1ad47SJeff Kirsher  */
54dee1ad47SJeff Kirsher #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET }
55dee1ad47SJeff Kirsher #define E1000_PARAM(X, desc)					\
5655c5f55eSBruce Allan 	static int X[E1000_MAX_NIC+1] = E1000_PARAM_INIT;	\
57dee1ad47SJeff Kirsher 	static unsigned int num_##X;				\
58dee1ad47SJeff Kirsher 	module_param_array_named(X, X, int, &num_##X, 0);	\
59dee1ad47SJeff Kirsher 	MODULE_PARM_DESC(X, desc);
60dee1ad47SJeff Kirsher 
61e921eb1aSBruce Allan /* Transmit Interrupt Delay in units of 1.024 microseconds
62dee1ad47SJeff Kirsher  * Tx interrupt delay needs to typically be set to something non-zero
63dee1ad47SJeff Kirsher  *
64dee1ad47SJeff Kirsher  * Valid Range: 0-65535
65dee1ad47SJeff Kirsher  */
66dee1ad47SJeff Kirsher E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay");
67dee1ad47SJeff Kirsher #define DEFAULT_TIDV 8
68dee1ad47SJeff Kirsher #define MAX_TXDELAY 0xFFFF
69dee1ad47SJeff Kirsher #define MIN_TXDELAY 0
70dee1ad47SJeff Kirsher 
71e921eb1aSBruce Allan /* Transmit Absolute Interrupt Delay in units of 1.024 microseconds
72dee1ad47SJeff Kirsher  *
73dee1ad47SJeff Kirsher  * Valid Range: 0-65535
74dee1ad47SJeff Kirsher  */
75dee1ad47SJeff Kirsher E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");
76dee1ad47SJeff Kirsher #define DEFAULT_TADV 32
77dee1ad47SJeff Kirsher #define MAX_TXABSDELAY 0xFFFF
78dee1ad47SJeff Kirsher #define MIN_TXABSDELAY 0
79dee1ad47SJeff Kirsher 
80e921eb1aSBruce Allan /* Receive Interrupt Delay in units of 1.024 microseconds
81dee1ad47SJeff Kirsher  * hardware will likely hang if you set this to anything but zero.
82dee1ad47SJeff Kirsher  *
83dee1ad47SJeff Kirsher  * Valid Range: 0-65535
84dee1ad47SJeff Kirsher  */
85dee1ad47SJeff Kirsher E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
86dee1ad47SJeff Kirsher #define MAX_RXDELAY 0xFFFF
87dee1ad47SJeff Kirsher #define MIN_RXDELAY 0
88dee1ad47SJeff Kirsher 
89e921eb1aSBruce Allan /* Receive Absolute Interrupt Delay in units of 1.024 microseconds
90dee1ad47SJeff Kirsher  *
91dee1ad47SJeff Kirsher  * Valid Range: 0-65535
92dee1ad47SJeff Kirsher  */
93dee1ad47SJeff Kirsher E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
94dee1ad47SJeff Kirsher #define MAX_RXABSDELAY 0xFFFF
95dee1ad47SJeff Kirsher #define MIN_RXABSDELAY 0
96dee1ad47SJeff Kirsher 
97e921eb1aSBruce Allan /* Interrupt Throttle Rate (interrupts/sec)
98dee1ad47SJeff Kirsher  *
99727c356fSJeff Kirsher  * Valid Range: 100-100000 or one of: 0=off, 1=dynamic, 3=dynamic conservative
100dee1ad47SJeff Kirsher  */
101dee1ad47SJeff Kirsher E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
102dee1ad47SJeff Kirsher #define DEFAULT_ITR 3
103dee1ad47SJeff Kirsher #define MAX_ITR 100000
104dee1ad47SJeff Kirsher #define MIN_ITR 100
105dee1ad47SJeff Kirsher 
106e921eb1aSBruce Allan /* IntMode (Interrupt Mode)
107dee1ad47SJeff Kirsher  *
108b6fbca2aSBruce Allan  * Valid Range: varies depending on kernel configuration & hardware support
109dee1ad47SJeff Kirsher  *
110b6fbca2aSBruce Allan  * legacy=0, MSI=1, MSI-X=2
111b6fbca2aSBruce Allan  *
112b6fbca2aSBruce Allan  * When MSI/MSI-X support is enabled in kernel-
113b6fbca2aSBruce Allan  *   Default Value: 2 (MSI-X) when supported by hardware, 1 (MSI) otherwise
114b6fbca2aSBruce Allan  * When MSI/MSI-X support is not enabled in kernel-
115b6fbca2aSBruce Allan  *   Default Value: 0 (legacy)
116b6fbca2aSBruce Allan  *
117b6fbca2aSBruce Allan  * When a mode is specified that is not allowed/supported, it will be
118b6fbca2aSBruce Allan  * demoted to the most advanced interrupt mode available.
119dee1ad47SJeff Kirsher  */
120dee1ad47SJeff Kirsher E1000_PARAM(IntMode, "Interrupt Mode");
121dee1ad47SJeff Kirsher #define MAX_INTMODE	2
122dee1ad47SJeff Kirsher #define MIN_INTMODE	0
123dee1ad47SJeff Kirsher 
124e921eb1aSBruce Allan /* Enable Smart Power Down of the PHY
125dee1ad47SJeff Kirsher  *
126dee1ad47SJeff Kirsher  * Valid Range: 0, 1
127dee1ad47SJeff Kirsher  *
128dee1ad47SJeff Kirsher  * Default Value: 0 (disabled)
129dee1ad47SJeff Kirsher  */
130dee1ad47SJeff Kirsher E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down");
131dee1ad47SJeff Kirsher 
132e921eb1aSBruce Allan /* Enable Kumeran Lock Loss workaround
133dee1ad47SJeff Kirsher  *
134dee1ad47SJeff Kirsher  * Valid Range: 0, 1
135dee1ad47SJeff Kirsher  *
136dee1ad47SJeff Kirsher  * Default Value: 1 (enabled)
137dee1ad47SJeff Kirsher  */
138dee1ad47SJeff Kirsher E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
139dee1ad47SJeff Kirsher 
140e921eb1aSBruce Allan /* Write Protect NVM
141dee1ad47SJeff Kirsher  *
142dee1ad47SJeff Kirsher  * Valid Range: 0, 1
143dee1ad47SJeff Kirsher  *
144dee1ad47SJeff Kirsher  * Default Value: 1 (enabled)
145dee1ad47SJeff Kirsher  */
146dee1ad47SJeff Kirsher E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]");
147dee1ad47SJeff Kirsher 
148e921eb1aSBruce Allan /* Enable CRC Stripping
149dee1ad47SJeff Kirsher  *
150dee1ad47SJeff Kirsher  * Valid Range: 0, 1
151dee1ad47SJeff Kirsher  *
152dee1ad47SJeff Kirsher  * Default Value: 1 (enabled)
153dee1ad47SJeff Kirsher  */
1546ad65145SBruce Allan E1000_PARAM(CrcStripping,
1556ad65145SBruce Allan 	    "Enable CRC Stripping, disable if your BMC needs the CRC");
156dee1ad47SJeff Kirsher 
157dee1ad47SJeff Kirsher struct e1000_option {
158dee1ad47SJeff Kirsher 	enum { enable_option, range_option, list_option } type;
159dee1ad47SJeff Kirsher 	const char *name;
160dee1ad47SJeff Kirsher 	const char *err;
161dee1ad47SJeff Kirsher 	int def;
162dee1ad47SJeff Kirsher 	union {
163dee1ad47SJeff Kirsher 		struct { /* range_option info */
164dee1ad47SJeff Kirsher 			int min;
165dee1ad47SJeff Kirsher 			int max;
166dee1ad47SJeff Kirsher 		} r;
167dee1ad47SJeff Kirsher 		struct { /* list_option info */
168dee1ad47SJeff Kirsher 			int nr;
169dee1ad47SJeff Kirsher 			struct e1000_opt_list { int i; char *str; } *p;
170dee1ad47SJeff Kirsher 		} l;
171dee1ad47SJeff Kirsher 	} arg;
172dee1ad47SJeff Kirsher };
173dee1ad47SJeff Kirsher 
1749f9a12f8SBill Pemberton static int e1000_validate_option(unsigned int *value,
175dee1ad47SJeff Kirsher 				 const struct e1000_option *opt,
176dee1ad47SJeff Kirsher 				 struct e1000_adapter *adapter)
177dee1ad47SJeff Kirsher {
178dee1ad47SJeff Kirsher 	if (*value == OPTION_UNSET) {
179dee1ad47SJeff Kirsher 		*value = opt->def;
180dee1ad47SJeff Kirsher 		return 0;
181dee1ad47SJeff Kirsher 	}
182dee1ad47SJeff Kirsher 
183dee1ad47SJeff Kirsher 	switch (opt->type) {
184dee1ad47SJeff Kirsher 	case enable_option:
185dee1ad47SJeff Kirsher 		switch (*value) {
186dee1ad47SJeff Kirsher 		case OPTION_ENABLED:
187185095fbSBruce Allan 			dev_info(&adapter->pdev->dev, "%s Enabled\n",
188185095fbSBruce Allan 				 opt->name);
189dee1ad47SJeff Kirsher 			return 0;
190dee1ad47SJeff Kirsher 		case OPTION_DISABLED:
191185095fbSBruce Allan 			dev_info(&adapter->pdev->dev, "%s Disabled\n",
192185095fbSBruce Allan 				 opt->name);
193dee1ad47SJeff Kirsher 			return 0;
194dee1ad47SJeff Kirsher 		}
195dee1ad47SJeff Kirsher 		break;
196dee1ad47SJeff Kirsher 	case range_option:
197dee1ad47SJeff Kirsher 		if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
198185095fbSBruce Allan 			dev_info(&adapter->pdev->dev, "%s set to %i\n",
199185095fbSBruce Allan 				 opt->name, *value);
200dee1ad47SJeff Kirsher 			return 0;
201dee1ad47SJeff Kirsher 		}
202dee1ad47SJeff Kirsher 		break;
203dee1ad47SJeff Kirsher 	case list_option: {
204dee1ad47SJeff Kirsher 		int i;
205dee1ad47SJeff Kirsher 		struct e1000_opt_list *ent;
206dee1ad47SJeff Kirsher 
207dee1ad47SJeff Kirsher 		for (i = 0; i < opt->arg.l.nr; i++) {
208dee1ad47SJeff Kirsher 			ent = &opt->arg.l.p[i];
209dee1ad47SJeff Kirsher 			if (*value == ent->i) {
210dee1ad47SJeff Kirsher 				if (ent->str[0] != '\0')
211185095fbSBruce Allan 					dev_info(&adapter->pdev->dev, "%s\n",
212185095fbSBruce Allan 						 ent->str);
213dee1ad47SJeff Kirsher 				return 0;
214dee1ad47SJeff Kirsher 			}
215dee1ad47SJeff Kirsher 		}
216dee1ad47SJeff Kirsher 	}
217dee1ad47SJeff Kirsher 		break;
218dee1ad47SJeff Kirsher 	default:
219dee1ad47SJeff Kirsher 		BUG();
220dee1ad47SJeff Kirsher 	}
221dee1ad47SJeff Kirsher 
222185095fbSBruce Allan 	dev_info(&adapter->pdev->dev, "Invalid %s value specified (%i) %s\n",
223185095fbSBruce Allan 		 opt->name, *value, opt->err);
224dee1ad47SJeff Kirsher 	*value = opt->def;
225dee1ad47SJeff Kirsher 	return -1;
226dee1ad47SJeff Kirsher }
227dee1ad47SJeff Kirsher 
228dee1ad47SJeff Kirsher /**
229dee1ad47SJeff Kirsher  * e1000e_check_options - Range Checking for Command Line Parameters
230dee1ad47SJeff Kirsher  * @adapter: board private structure
231dee1ad47SJeff Kirsher  *
232dee1ad47SJeff Kirsher  * This routine checks all command line parameters for valid user
233dee1ad47SJeff Kirsher  * input.  If an invalid value is given, or if no user specified
234dee1ad47SJeff Kirsher  * value exists, a default value is used.  The final value is stored
235dee1ad47SJeff Kirsher  * in a variable in the adapter structure.
236dee1ad47SJeff Kirsher  **/
2379f9a12f8SBill Pemberton void e1000e_check_options(struct e1000_adapter *adapter)
238dee1ad47SJeff Kirsher {
239dee1ad47SJeff Kirsher 	struct e1000_hw *hw = &adapter->hw;
240dee1ad47SJeff Kirsher 	int bd = adapter->bd_number;
241dee1ad47SJeff Kirsher 
242dee1ad47SJeff Kirsher 	if (bd >= E1000_MAX_NIC) {
243185095fbSBruce Allan 		dev_notice(&adapter->pdev->dev,
244185095fbSBruce Allan 			   "Warning: no configuration for board #%i\n", bd);
245185095fbSBruce Allan 		dev_notice(&adapter->pdev->dev,
246185095fbSBruce Allan 			   "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];
3382e7d21c5SJeff Kirsher 
339e921eb1aSBruce Allan 			/* Make sure a message is printed for non-special
3402e7d21c5SJeff Kirsher 			 * values. And in case of an invalid option, display
3412e7d21c5SJeff Kirsher 			 * warning, use default and go through itr/itr_setting
3422e7d21c5SJeff Kirsher 			 * adjustment logic below
343dee1ad47SJeff Kirsher 			 */
3442e7d21c5SJeff Kirsher 			if ((adapter->itr > 4) &&
3452e7d21c5SJeff Kirsher 			    e1000_validate_option(&adapter->itr, &opt, adapter))
3462e7d21c5SJeff Kirsher 				adapter->itr = opt.def;
347dee1ad47SJeff Kirsher 		} else {
348e921eb1aSBruce Allan 			/* If no option specified, use default value and go
349727c356fSJeff Kirsher 			 * through the logic below to adjust itr/itr_setting
350727c356fSJeff Kirsher 			 */
351727c356fSJeff Kirsher 			adapter->itr = opt.def;
352727c356fSJeff Kirsher 
353e921eb1aSBruce Allan 			/* Make sure a message is printed for non-special
354727c356fSJeff Kirsher 			 * default values
355727c356fSJeff Kirsher 			 */
3562e7d21c5SJeff Kirsher 			if (adapter->itr > 4)
357185095fbSBruce Allan 				dev_info(&adapter->pdev->dev,
358185095fbSBruce Allan 					 "%s set to default %d\n", opt.name,
359727c356fSJeff Kirsher 					 adapter->itr);
360727c356fSJeff Kirsher 		}
361727c356fSJeff Kirsher 
362727c356fSJeff Kirsher 		adapter->itr_setting = adapter->itr;
363dee1ad47SJeff Kirsher 		switch (adapter->itr) {
364dee1ad47SJeff Kirsher 		case 0:
365185095fbSBruce Allan 			dev_info(&adapter->pdev->dev, "%s turned off\n",
366185095fbSBruce Allan 				 opt.name);
367dee1ad47SJeff Kirsher 			break;
368dee1ad47SJeff Kirsher 		case 1:
369185095fbSBruce Allan 			dev_info(&adapter->pdev->dev,
370185095fbSBruce Allan 				 "%s set to dynamic mode\n", opt.name);
371dee1ad47SJeff Kirsher 			adapter->itr = 20000;
372dee1ad47SJeff Kirsher 			break;
373dee1ad47SJeff Kirsher 		case 3:
374185095fbSBruce Allan 			dev_info(&adapter->pdev->dev,
375185095fbSBruce Allan 				 "%s set to dynamic conservative mode\n",
376dee1ad47SJeff Kirsher 				 opt.name);
377dee1ad47SJeff Kirsher 			adapter->itr = 20000;
378dee1ad47SJeff Kirsher 			break;
379dee1ad47SJeff Kirsher 		case 4:
380185095fbSBruce Allan 			dev_info(&adapter->pdev->dev,
381185095fbSBruce Allan 				 "%s set to simplified (2000-8000 ints) mode\n",
382727c356fSJeff Kirsher 				 opt.name);
383dee1ad47SJeff Kirsher 			break;
384dee1ad47SJeff Kirsher 		default:
385e921eb1aSBruce Allan 			/* Save the setting, because the dynamic bits
386dee1ad47SJeff Kirsher 			 * change itr.
387727c356fSJeff Kirsher 			 *
388dee1ad47SJeff Kirsher 			 * Clear the lower two bits because
389dee1ad47SJeff Kirsher 			 * they are used as control.
390dee1ad47SJeff Kirsher 			 */
391727c356fSJeff Kirsher 			adapter->itr_setting &= ~3;
392dee1ad47SJeff Kirsher 			break;
393dee1ad47SJeff Kirsher 		}
394dee1ad47SJeff Kirsher 	}
395dee1ad47SJeff Kirsher 	{ /* Interrupt Mode */
396dee1ad47SJeff Kirsher 		static struct e1000_option opt = {
397dee1ad47SJeff Kirsher 			.type = range_option,
398dee1ad47SJeff Kirsher 			.name = "Interrupt Mode",
399b6fbca2aSBruce Allan #ifndef CONFIG_PCI_MSI
400b6fbca2aSBruce Allan 			.err  = "defaulting to 0 (legacy)",
401b6fbca2aSBruce Allan 			.def  = E1000E_INT_MODE_LEGACY,
402b6fbca2aSBruce Allan 			.arg  = { .r = { .min = 0,
403b6fbca2aSBruce Allan 					 .max = 0 } }
404b6fbca2aSBruce Allan #endif
405dee1ad47SJeff Kirsher 		};
406dee1ad47SJeff Kirsher 
407b6fbca2aSBruce Allan #ifdef CONFIG_PCI_MSI
408b6fbca2aSBruce Allan 		if (adapter->flags & FLAG_HAS_MSIX) {
409b6fbca2aSBruce Allan 			opt.err = kstrdup("defaulting to 2 (MSI-X)",
410b6fbca2aSBruce Allan 					  GFP_KERNEL);
411b6fbca2aSBruce Allan 			opt.def = E1000E_INT_MODE_MSIX;
412b6fbca2aSBruce Allan 			opt.arg.r.max = E1000E_INT_MODE_MSIX;
413b6fbca2aSBruce Allan 		} else {
414b6fbca2aSBruce Allan 			opt.err = kstrdup("defaulting to 1 (MSI)", GFP_KERNEL);
415b6fbca2aSBruce Allan 			opt.def = E1000E_INT_MODE_MSI;
416b6fbca2aSBruce Allan 			opt.arg.r.max = E1000E_INT_MODE_MSI;
417b6fbca2aSBruce Allan 		}
418b6fbca2aSBruce Allan 
419b6fbca2aSBruce Allan 		if (!opt.err) {
420b6fbca2aSBruce Allan 			dev_err(&adapter->pdev->dev,
421b6fbca2aSBruce Allan 				"Failed to allocate memory\n");
422b6fbca2aSBruce Allan 			return;
423b6fbca2aSBruce Allan 		}
424b6fbca2aSBruce Allan #endif
425b6fbca2aSBruce Allan 
426dee1ad47SJeff Kirsher 		if (num_IntMode > bd) {
427dee1ad47SJeff Kirsher 			unsigned int int_mode = IntMode[bd];
428dee1ad47SJeff Kirsher 			e1000_validate_option(&int_mode, &opt, adapter);
429dee1ad47SJeff Kirsher 			adapter->int_mode = int_mode;
430dee1ad47SJeff Kirsher 		} else {
431dee1ad47SJeff Kirsher 			adapter->int_mode = opt.def;
432dee1ad47SJeff Kirsher 		}
433b6fbca2aSBruce Allan 
434b6fbca2aSBruce Allan #ifdef CONFIG_PCI_MSI
435b6fbca2aSBruce Allan 		kfree(opt.err);
436b6fbca2aSBruce Allan #endif
437dee1ad47SJeff Kirsher 	}
438dee1ad47SJeff Kirsher 	{ /* Smart Power Down */
439dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
440dee1ad47SJeff Kirsher 			.type = enable_option,
441dee1ad47SJeff Kirsher 			.name = "PHY Smart Power Down",
442dee1ad47SJeff Kirsher 			.err  = "defaulting to Disabled",
443dee1ad47SJeff Kirsher 			.def  = OPTION_DISABLED
444dee1ad47SJeff Kirsher 		};
445dee1ad47SJeff Kirsher 
446dee1ad47SJeff Kirsher 		if (num_SmartPowerDownEnable > bd) {
447dee1ad47SJeff Kirsher 			unsigned int spd = SmartPowerDownEnable[bd];
448dee1ad47SJeff Kirsher 			e1000_validate_option(&spd, &opt, adapter);
4491860ac84SBruce Allan 			if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) && spd)
450dee1ad47SJeff Kirsher 				adapter->flags |= FLAG_SMART_POWER_DOWN;
451dee1ad47SJeff Kirsher 		}
452dee1ad47SJeff Kirsher 	}
453dee1ad47SJeff Kirsher 	{ /* CRC Stripping */
454dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
455dee1ad47SJeff Kirsher 			.type = enable_option,
456dee1ad47SJeff Kirsher 			.name = "CRC Stripping",
457dee1ad47SJeff Kirsher 			.err  = "defaulting to Enabled",
458dee1ad47SJeff Kirsher 			.def  = OPTION_ENABLED
459dee1ad47SJeff Kirsher 		};
460dee1ad47SJeff Kirsher 
461dee1ad47SJeff Kirsher 		if (num_CrcStripping > bd) {
462dee1ad47SJeff Kirsher 			unsigned int crc_stripping = CrcStripping[bd];
463dee1ad47SJeff Kirsher 			e1000_validate_option(&crc_stripping, &opt, adapter);
4640184039aSBen Greear 			if (crc_stripping == OPTION_ENABLED) {
465dee1ad47SJeff Kirsher 				adapter->flags2 |= FLAG2_CRC_STRIPPING;
4660184039aSBen Greear 				adapter->flags2 |= FLAG2_DFLT_CRC_STRIPPING;
4670184039aSBen Greear 			}
468dee1ad47SJeff Kirsher 		} else {
469dee1ad47SJeff Kirsher 			adapter->flags2 |= FLAG2_CRC_STRIPPING;
4700184039aSBen Greear 			adapter->flags2 |= FLAG2_DFLT_CRC_STRIPPING;
471dee1ad47SJeff Kirsher 		}
472dee1ad47SJeff Kirsher 	}
473dee1ad47SJeff Kirsher 	{ /* Kumeran Lock Loss Workaround */
474dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
475dee1ad47SJeff Kirsher 			.type = enable_option,
476dee1ad47SJeff Kirsher 			.name = "Kumeran Lock Loss Workaround",
477dee1ad47SJeff Kirsher 			.err  = "defaulting to Enabled",
478dee1ad47SJeff Kirsher 			.def  = OPTION_ENABLED
479dee1ad47SJeff Kirsher 		};
480dee1ad47SJeff Kirsher 
481dee1ad47SJeff Kirsher 		if (num_KumeranLockLoss > bd) {
482dee1ad47SJeff Kirsher 			unsigned int kmrn_lock_loss = KumeranLockLoss[bd];
483dee1ad47SJeff Kirsher 			e1000_validate_option(&kmrn_lock_loss, &opt, adapter);
484dee1ad47SJeff Kirsher 			if (hw->mac.type == e1000_ich8lan)
485dee1ad47SJeff Kirsher 				e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw,
486dee1ad47SJeff Kirsher 								kmrn_lock_loss);
487dee1ad47SJeff Kirsher 		} else {
488dee1ad47SJeff Kirsher 			if (hw->mac.type == e1000_ich8lan)
489dee1ad47SJeff Kirsher 				e1000e_set_kmrn_lock_loss_workaround_ich8lan(hw,
490dee1ad47SJeff Kirsher 								       opt.def);
491dee1ad47SJeff Kirsher 		}
492dee1ad47SJeff Kirsher 	}
493dee1ad47SJeff Kirsher 	{ /* Write-protect NVM */
494dee1ad47SJeff Kirsher 		static const struct e1000_option opt = {
495dee1ad47SJeff Kirsher 			.type = enable_option,
496dee1ad47SJeff Kirsher 			.name = "Write-protect NVM",
497dee1ad47SJeff Kirsher 			.err  = "defaulting to Enabled",
498dee1ad47SJeff Kirsher 			.def  = OPTION_ENABLED
499dee1ad47SJeff Kirsher 		};
500dee1ad47SJeff Kirsher 
501dee1ad47SJeff Kirsher 		if (adapter->flags & FLAG_IS_ICH) {
502dee1ad47SJeff Kirsher 			if (num_WriteProtectNVM > bd) {
503dee1ad47SJeff Kirsher 				unsigned int write_protect_nvm = WriteProtectNVM[bd];
504dee1ad47SJeff Kirsher 				e1000_validate_option(&write_protect_nvm, &opt,
505dee1ad47SJeff Kirsher 						      adapter);
506dee1ad47SJeff Kirsher 				if (write_protect_nvm)
507dee1ad47SJeff Kirsher 					adapter->flags |= FLAG_READ_ONLY_NVM;
508dee1ad47SJeff Kirsher 			} else {
509dee1ad47SJeff Kirsher 				if (opt.def)
510dee1ad47SJeff Kirsher 					adapter->flags |= FLAG_READ_ONLY_NVM;
511dee1ad47SJeff Kirsher 			}
512dee1ad47SJeff Kirsher 		}
513dee1ad47SJeff Kirsher 	}
514dee1ad47SJeff Kirsher }
515