ixgb_param.c revision 1459336da45b214a59f0825777549fb0cb60ed7d
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*******************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  Intel PRO/10GbE Linux driver
40abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  Copyright(c) 1999 - 2006 Intel Corporation.
50abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
60abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  This program is free software; you can redistribute it and/or modify it
70abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  under the terms and conditions of the GNU General Public License,
80abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  version 2, as published by the Free Software Foundation.
90abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
100abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  This program is distributed in the hope it will be useful, but WITHOUT
110abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
120abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  more details.
140abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  You should have received a copy of the GNU General Public License along with
160abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  this program; if not, write to the Free Software Foundation, Inc.,
170abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
180abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
190abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  The full GNU General Public License is included in this distribution in
200abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  the file called "COPYING".
210abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Contact Information:
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Linux NICS <linux.nics@intel.com>
240abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*******************************************************************************/
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ixgb.h"
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* This is the only thing that needs to be changed to adjust the
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * maximum number of ports that the driver can manage.
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IXGB_MAX_NIC 8
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPTION_UNSET	-1
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPTION_DISABLED 0
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPTION_ENABLED  1
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* All parameters are treated the same, as an integer array of values.
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This macro just reduces the need to repeat the same declaration code
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * over and over (plus this helps to avoid typo bugs).
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET }
47273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger#define IXGB_PARAM(X, desc)					\
48273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger	static int __devinitdata X[IXGB_MAX_NIC+1]		\
49273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		= IXGB_PARAM_INIT;				\
50273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger	static unsigned int num_##X = 0;			\
51273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger	module_param_array_named(X, X, int, &num_##X, 0);	\
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MODULE_PARM_DESC(X, desc);
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Transmit Descriptor Count
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 64-4096
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 256
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(TxDescriptors, "Number of transmit descriptors");
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Descriptor Count
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 64-4096
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 1024
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxDescriptors, "Number of receive descriptors");
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* User Specified Flow Control Override
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0-3
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 0 - No Flow Control
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 1 - Rx only, respond to PAUSE frames but do not generate them
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 2 - Tx only, generate PAUSE frames but ignore them on receive
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 3 - Full Flow Control Support
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
80953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok * Default Value: 2 - Tx only (silicon bug avoidance)
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(FlowControl, "Flow Control setting");
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* XsumRX - Receive Checksum Offload Enable/Disable
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0, 1
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 0 - disables all checksum offload
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 1 - enables receive IP/TCP/UDP checksum offload
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *        on 82597 based NICs
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 1
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Transmit Interrupt Delay in units of 0.8192 microseconds
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0-65535
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 32
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(TxIntDelay, "Transmit Interrupt Delay");
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Interrupt Delay in units of 0.8192 microseconds
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0-65535
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 72
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxIntDelay, "Receive Interrupt Delay");
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Flow control high threshold (when we send a pause frame)
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (FCRTH)
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 1,536 - 262,136 (0x600 - 0x3FFF8, 8 byte granularity)
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 196,608 (0x30000)
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxFCHighThresh, "Receive Flow Control High Threshold");
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Flow control low threshold (when we send a resume frame)
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (FCRTL)
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 64 - 262,136 (0x40 - 0x3FFF8, 8 byte granularity)
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              must be less than high threshold by at least 8 bytes
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value:  163,840 (0x28000)
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold");
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Flow control request timeout (how long to pause the link partner's tx)
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (PAP 15:0)
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1390060c07230ee6a5b070388ae55855c594a3d9132Jesse Brandeburg * Valid Range: 1 - 65535
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
141953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok * Default Value:  65535 (0xffff) (we'll send an xon if we recover)
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout");
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Interrupt Delay Enable
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0, 1
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 0 - disables transmit interrupt delay
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  - 1 - enables transmmit interrupt delay
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 1
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable");
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_TIDV	   		     32
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_TIDV			 0xFFFF
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_TIDV			      0
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_RDTR		   	     72
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_RDTR			 0xFFFF
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_RDTR			      0
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define XSUMRX_DEFAULT		 OPTION_ENABLED
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_FCRTL	  		0x28000
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_FCRTH			0x30000
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_FCRTL			      0
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FCRTL			0x3FFE8
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_FCRTH			      8
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FCRTH			0x3FFF0
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_FCPAUSE			      1
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FCPAUSE			 0xffff
178953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok#define DEFAULT_FCPAUSE		  	 0xFFFF /* this may be too long */
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ixgb_option {
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	enum { enable_option, range_option, list_option } type;
182273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger	const char *name;
183273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger	const char *err;
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int def;
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	union {
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct {	/* range_option info */
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			int min;
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			int max;
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} r;
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct {	/* list_option info */
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			int nr;
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct ixgb_opt_list {
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				int i;
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				char *str;
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} *p;
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} l;
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} arg;
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __devinit
201273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemmingerixgb_validate_option(unsigned int *value, const struct ixgb_option *opt)
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
20303f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg	if (*value == OPTION_UNSET) {
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*value = opt->def;
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (opt->type) {
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case enable_option:
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (*value) {
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case OPTION_ENABLED:
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "%s Enabled\n", opt->name);
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case OPTION_DISABLED:
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "%s Disabled\n", opt->name);
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case range_option:
22003f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "%s set to %i\n", opt->name, *value);
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case list_option: {
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		int i;
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct ixgb_opt_list *ent;
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2291459336da45b214a59f0825777549fb0cb60ed7dJesse Brandeburg		for (i = 0; i < opt->arg.l.nr; i++) {
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ent = &opt->arg.l.p[i];
23103f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg			if (*value == ent->i) {
23203f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg				if (ent->str[0] != '\0')
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "%s\n", ent->str);
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 0;
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		BUG();
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	printk(KERN_INFO "Invalid %s specified (%i) %s\n",
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   opt->name, *value, opt->err);
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*value = opt->def;
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -1;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/**
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ixgb_check_options - Range Checking for Command Line Parameters
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @adapter: board private structure
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This routine checks all command line parameters for valid user
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * input.  If an invalid value is given, or if no user specified
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * value exists, a default value is used.  The final value is stored
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in a variable in the adapter structure.
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds **/
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __devinit
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsixgb_check_options(struct ixgb_adapter *adapter)
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int bd = adapter->bd_number;
26303f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg	if (bd >= IXGB_MAX_NIC) {
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_NOTICE
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   "Warning: no configuration for board #%i\n", bd);
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_NOTICE "Using defaults for all values\n");
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Transmit Descriptor Count */
270273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Transmit Descriptors",
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of " __MODULE_STRING(DEFAULT_TXD),
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_TXD,
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg  = { .r = { .min = MIN_TXD,
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .max = MAX_TXD}}
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct ixgb_desc_ring *tx_ring = &adapter->tx_ring;
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28003f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_TxDescriptors > bd) {
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			tx_ring->count = TxDescriptors[bd];
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&tx_ring->count, &opt);
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			tx_ring->count = opt.def;
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
28655e924cf5772cbcf00549e448be35b392ff3084cMilind Arun Choudhary		tx_ring->count = ALIGN(tx_ring->count, IXGB_REQ_TX_DESCRIPTOR_MULTIPLE);
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Receive Descriptor Count */
289273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Receive Descriptors",
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of " __MODULE_STRING(DEFAULT_RXD),
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_RXD,
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg  = { .r = { .min = MIN_RXD,
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .max = MAX_RXD}}
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct ixgb_desc_ring *rx_ring = &adapter->rx_ring;
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29903f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_RxDescriptors > bd) {
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			rx_ring->count = RxDescriptors[bd];
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&rx_ring->count, &opt);
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			rx_ring->count = opt.def;
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
30555e924cf5772cbcf00549e448be35b392ff3084cMilind Arun Choudhary		rx_ring->count = ALIGN(rx_ring->count, IXGB_REQ_RX_DESCRIPTOR_MULTIPLE);
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Receive Checksum Offload Enable */
308273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = enable_option,
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Receive Checksum Offload",
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "defaulting to Enabled",
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = OPTION_ENABLED
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31503f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_XsumRX > bd) {
316273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger			unsigned int rx_csum = XsumRX[bd];
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&rx_csum, &opt);
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->rx_csum = rx_csum;
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->rx_csum = opt.def;
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Flow Control */
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		struct ixgb_opt_list fc_list[] =
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			{{ ixgb_fc_none,	"Flow Control Disabled" },
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 { ixgb_fc_rx_pause,"Flow Control Receive Only" },
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 { ixgb_fc_tx_pause,"Flow Control Transmit Only" },
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 { ixgb_fc_full,	"Flow Control Enabled" },
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 { ixgb_fc_default, "Flow Control Hardware Default" }};
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
332273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = list_option,
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Flow Control",
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "reading default settings from EEPROM",
336953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok			.def  = ixgb_fc_tx_pause,
3371c8816c6fe375ed3a1e342fcf7f403cd4f0d5041Ahmed S. Darwish			.arg  = { .l = { .nr = ARRAY_SIZE(fc_list),
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .p = fc_list }}
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34103f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_FlowControl > bd) {
342273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger			unsigned int fc = FlowControl[bd];
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&fc, &opt);
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.type = fc;
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.type = opt.def;
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Receive Flow Control High Threshold */
350273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Rx Flow Control High Threshold",
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of " __MODULE_STRING(DEFAULT_FCRTH),
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_FCRTH,
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg  = { .r = { .min = MIN_FCRTH,
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .max = MAX_FCRTH}}
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
35903f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_RxFCHighThresh > bd) {
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.high_water = RxFCHighThresh[bd];
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&adapter->hw.fc.high_water, &opt);
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.high_water = opt.def;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
365953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok		if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
366953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok			printk (KERN_INFO
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"Ignoring RxFCHighThresh when no RxFC\n");
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Receive Flow Control Low Threshold */
370273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Rx Flow Control Low Threshold",
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of " __MODULE_STRING(DEFAULT_FCRTL),
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_FCRTL,
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg  = { .r = { .min = MIN_FCRTL,
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .max = MAX_FCRTL}}
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
37903f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_RxFCLowThresh > bd) {
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.low_water = RxFCLowThresh[bd];
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&adapter->hw.fc.low_water, &opt);
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.low_water = opt.def;
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
385953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok		if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
386953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok			printk (KERN_INFO
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"Ignoring RxFCLowThresh when no RxFC\n");
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Flow Control Pause Time Request*/
390273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Flow Control Pause Time Request",
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of "__MODULE_STRING(DEFAULT_FCPAUSE),
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_FCPAUSE,
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg = { .r = { .min = MIN_FCPAUSE,
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					.max = MAX_FCPAUSE}}
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39903f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_FCReqTimeout > bd) {
400273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger			unsigned int pause_time = FCReqTimeout[bd];
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&pause_time, &opt);
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.pause_time = pause_time;
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.pause_time = opt.def;
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
406953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok		if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
407953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok			printk (KERN_INFO
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"Ignoring FCReqTimeout when no RxFC\n");
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* high low and spacing check for rx flow control thresholds */
411953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok	if (adapter->hw.fc.type & ixgb_fc_tx_pause) {
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* high must be greater than low */
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) {
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* set defaults */
4150060c07230ee6a5b070388ae55855c594a3d9132Jesse Brandeburg			printk (KERN_INFO
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"RxFCHighThresh must be >= (RxFCLowThresh + 8), "
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				"Using Defaults\n");
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.high_water = DEFAULT_FCRTH;
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->hw.fc.low_water  = DEFAULT_FCRTL;
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Receive Interrupt Delay */
423273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Receive Interrupt Delay",
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of " __MODULE_STRING(DEFAULT_RDTR),
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_RDTR,
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg  = { .r = { .min = MIN_RDTR,
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .max = MAX_RDTR}}
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
43203f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_RxIntDelay > bd) {
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->rx_int_delay = RxIntDelay[bd];
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&adapter->rx_int_delay, &opt);
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->rx_int_delay = opt.def;
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Transmit Interrupt Delay */
440273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = range_option,
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Transmit Interrupt Delay",
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "using default of " __MODULE_STRING(DEFAULT_TIDV),
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = DEFAULT_TIDV,
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.arg  = { .r = { .min = MIN_TIDV,
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 .max = MAX_TIDV}}
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44903f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_TxIntDelay > bd) {
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->tx_int_delay = TxIntDelay[bd];
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&adapter->tx_int_delay, &opt);
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->tx_int_delay = opt.def;
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{ /* Transmit Interrupt Delay Enable */
458273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger		const struct ixgb_option opt = {
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.type = enable_option,
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.name = "Tx Interrupt Delay Enable",
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.err  = "defaulting to Enabled",
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			.def  = OPTION_ENABLED
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		};
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46503f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg		if (num_IntDelayEnable > bd) {
466273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger			unsigned int ide = IntDelayEnable[bd];
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixgb_validate_option(&ide, &opt);
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->tx_int_delay_enable = ide;
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			adapter->tx_int_delay_enable = opt.def;
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
474