11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 30abb6eb12806cf99ea815810d470423083c3b9f4Auke Kok Intel PRO/10GbE Linux driver 4f731a9ef82c6728559b34743bca19d231e5e1b63Jesse Brandeburg Copyright(c) 1999 - 2008 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 29d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ixgb.h" 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* This is the only thing that needs to be changed to adjust the 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * maximum number of ports that the driver can manage. 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IXGB_MAX_NIC 8 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPTION_UNSET -1 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPTION_DISABLED 0 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define OPTION_ENABLED 1 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* All parameters are treated the same, as an integer array of values. 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This macro just reduces the need to repeat the same declaration code 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * over and over (plus this helps to avoid typo bugs). 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET } 49273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger#define IXGB_PARAM(X, desc) \ 509f9a12f8ca79839c948464a37c5b557808278708Bill Pemberton static int X[IXGB_MAX_NIC+1] \ 51273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger = IXGB_PARAM_INIT; \ 52273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger static unsigned int num_##X = 0; \ 53273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger module_param_array_named(X, X, int, &num_##X, 0); \ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MODULE_PARM_DESC(X, desc); 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Transmit Descriptor Count 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 64-4096 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 256 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(TxDescriptors, "Number of transmit descriptors"); 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Descriptor Count 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 64-4096 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 1024 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxDescriptors, "Number of receive descriptors"); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* User Specified Flow Control Override 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0-3 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 0 - No Flow Control 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 1 - Rx only, respond to PAUSE frames but do not generate them 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 2 - Tx only, generate PAUSE frames but ignore them on receive 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 3 - Full Flow Control Support 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 82953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok * Default Value: 2 - Tx only (silicon bug avoidance) 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(FlowControl, "Flow Control setting"); 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* XsumRX - Receive Checksum Offload Enable/Disable 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0, 1 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 0 - disables all checksum offload 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 1 - enables receive IP/TCP/UDP checksum offload 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * on 82597 based NICs 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 1 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(XsumRX, "Disable or enable Receive Checksum offload"); 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Transmit Interrupt Delay in units of 0.8192 microseconds 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0-65535 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 32 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(TxIntDelay, "Transmit Interrupt Delay"); 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Interrupt Delay in units of 0.8192 microseconds 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0-65535 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 72 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxIntDelay, "Receive Interrupt Delay"); 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Flow control high threshold (when we send a pause frame) 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (FCRTH) 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 1,536 - 262,136 (0x600 - 0x3FFF8, 8 byte granularity) 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 196,608 (0x30000) 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxFCHighThresh, "Receive Flow Control High Threshold"); 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Flow control low threshold (when we send a resume frame) 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (FCRTL) 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 64 - 262,136 (0x40 - 0x3FFF8, 8 byte granularity) 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * must be less than high threshold by at least 8 bytes 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 163,840 (0x28000) 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold"); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Flow control request timeout (how long to pause the link partner's tx) 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (PAP 15:0) 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1410060c07230ee6a5b070388ae55855c594a3d9132Jesse Brandeburg * Valid Range: 1 - 65535 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 143953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok * Default Value: 65535 (0xffff) (we'll send an xon if we recover) 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout"); 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Interrupt Delay Enable 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Valid Range: 0, 1 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 0 - disables transmit interrupt delay 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - 1 - enables transmmit interrupt delay 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Default Value: 1 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable"); 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_TIDV 32 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_TIDV 0xFFFF 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_TIDV 0 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_RDTR 72 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_RDTR 0xFFFF 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_RDTR 0 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define XSUMRX_DEFAULT OPTION_ENABLED 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_FCRTL 0x28000 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_FCRTH 0x30000 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_FCRTL 0 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FCRTL 0x3FFE8 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_FCRTH 8 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FCRTH 0x3FFF0 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MIN_FCPAUSE 1 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_FCPAUSE 0xffff 180953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok#define DEFAULT_FCPAUSE 0xFFFF /* this may be too long */ 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ixgb_option { 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds enum { enable_option, range_option, list_option } type; 184273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger const char *name; 185273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger const char *err; 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int def; 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds union { 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { /* range_option info */ 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int min; 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int max; 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } r; 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct { /* list_option info */ 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int nr; 194667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher const struct ixgb_opt_list { 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 196667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher const char *str; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } *p; 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } l; 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } arg; 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2029f9a12f8ca79839c948464a37c5b557808278708Bill Pembertonstatic int 203273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemmingerixgb_validate_option(unsigned int *value, const struct ixgb_option *opt) 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 20503f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (*value == OPTION_UNSET) { 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *value = opt->def; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (opt->type) { 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case enable_option: 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (*value) { 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case OPTION_ENABLED: 214d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("%s Enabled\n", opt->name); 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case OPTION_DISABLED: 217d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("%s Disabled\n", opt->name); 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case range_option: 22203f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { 223d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("%s set to %i\n", opt->name, *value); 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case list_option: { 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 229667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher const struct ixgb_opt_list *ent; 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2311459336da45b214a59f0825777549fb0cb60ed7dJesse Brandeburg for (i = 0; i < opt->arg.l.nr; i++) { 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ent = &opt->arg.l.p[i]; 23303f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (*value == ent->i) { 23403f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (ent->str[0] != '\0') 235d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("%s\n", ent->str); 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BUG(); 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 245d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("Invalid %s specified (%i) %s\n", opt->name, *value, opt->err); 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *value = opt->def; 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -1; 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ixgb_check_options - Range Checking for Command Line Parameters 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @adapter: board private structure 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This routine checks all command line parameters for valid user 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * input. If an invalid value is given, or if no user specified 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * value exists, a default value is used. The final value is stored 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * in a variable in the adapter structure. 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds **/ 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2609f9a12f8ca79839c948464a37c5b557808278708Bill Pembertonvoid 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsixgb_check_options(struct ixgb_adapter *adapter) 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int bd = adapter->bd_number; 26403f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (bd >= IXGB_MAX_NIC) { 265d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_notice("Warning: no configuration for board #%i\n", bd); 266d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_notice("Using defaults for all values\n"); 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Transmit Descriptor Count */ 270ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static 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 */ 289ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static 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 */ 308ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static 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 325667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher static const struct ixgb_opt_list fc_list[] = { 326667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher { ixgb_fc_none, "Flow Control Disabled" }, 327667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher { ixgb_fc_rx_pause, "Flow Control Receive Only" }, 328667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher { ixgb_fc_tx_pause, "Flow Control Transmit Only" }, 329667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher { ixgb_fc_full, "Flow Control Enabled" }, 330667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher { ixgb_fc_default, "Flow Control Hardware Default" } 331667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher }; 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 333667445008db3f45a760c235d771be0c9671e59e5Jeff Kirsher static const struct ixgb_option opt = { 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = list_option, 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "Flow Control", 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .err = "reading default settings from EEPROM", 337953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok .def = ixgb_fc_tx_pause, 3381c8816c6fe375ed3a1e342fcf7f403cd4f0d5041Ahmed S. Darwish .arg = { .l = { .nr = ARRAY_SIZE(fc_list), 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .p = fc_list }} 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 34203f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (num_FlowControl > bd) { 343273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger unsigned int fc = FlowControl[bd]; 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ixgb_validate_option(&fc, &opt); 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.type = fc; 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.type = opt.def; 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Receive Flow Control High Threshold */ 351ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static const struct ixgb_option opt = { 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = range_option, 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "Rx Flow Control High Threshold", 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .err = "using default of " __MODULE_STRING(DEFAULT_FCRTH), 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .def = DEFAULT_FCRTH, 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .arg = { .r = { .min = MIN_FCRTH, 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .max = MAX_FCRTH}} 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 36003f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (num_RxFCHighThresh > bd) { 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.high_water = RxFCHighThresh[bd]; 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ixgb_validate_option(&adapter->hw.fc.high_water, &opt); 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.high_water = opt.def; 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 366953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) 367d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("Ignoring RxFCHighThresh when no RxFC\n"); 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Receive Flow Control Low Threshold */ 370ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static 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) ) 386d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("Ignoring RxFCLowThresh when no RxFC\n"); 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Flow Control Pause Time Request*/ 389ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static const struct ixgb_option opt = { 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = range_option, 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "Flow Control Pause Time Request", 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .err = "using default of "__MODULE_STRING(DEFAULT_FCPAUSE), 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .def = DEFAULT_FCPAUSE, 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .arg = { .r = { .min = MIN_FCPAUSE, 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .max = MAX_FCPAUSE}} 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 39803f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (num_FCReqTimeout > bd) { 399273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger unsigned int pause_time = FCReqTimeout[bd]; 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ixgb_validate_option(&pause_time, &opt); 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.pause_time = pause_time; 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.pause_time = opt.def; 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 405953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) 406d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("Ignoring FCReqTimeout when no RxFC\n"); 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* high low and spacing check for rx flow control thresholds */ 409953784d66d8f621a8684d007e526ca26b12d54a1Auke Kok if (adapter->hw.fc.type & ixgb_fc_tx_pause) { 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* high must be greater than low */ 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) { 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* set defaults */ 413d328bc839eac685cdd91f5d9d8ad95c070252038Joe Perches pr_info("RxFCHighThresh must be >= (RxFCLowThresh + 8), Using Defaults\n"); 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.high_water = DEFAULT_FCRTH; 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->hw.fc.low_water = DEFAULT_FCRTL; 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Receive Interrupt Delay */ 419ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static const struct ixgb_option opt = { 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = range_option, 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "Receive Interrupt Delay", 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .err = "using default of " __MODULE_STRING(DEFAULT_RDTR), 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .def = DEFAULT_RDTR, 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .arg = { .r = { .min = MIN_RDTR, 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .max = MAX_RDTR}} 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 42803f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (num_RxIntDelay > bd) { 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->rx_int_delay = RxIntDelay[bd]; 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ixgb_validate_option(&adapter->rx_int_delay, &opt); 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->rx_int_delay = opt.def; 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Transmit Interrupt Delay */ 436ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static const struct ixgb_option opt = { 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = range_option, 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "Transmit Interrupt Delay", 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .err = "using default of " __MODULE_STRING(DEFAULT_TIDV), 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .def = DEFAULT_TIDV, 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .arg = { .r = { .min = MIN_TIDV, 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .max = MAX_TIDV}} 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 44503f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (num_TxIntDelay > bd) { 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->tx_int_delay = TxIntDelay[bd]; 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ixgb_validate_option(&adapter->tx_int_delay, &opt); 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->tx_int_delay = opt.def; 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { /* Transmit Interrupt Delay Enable */ 454ac5ac789ebcf5b27e9edc231f6d33c92d722c607Jesse Brandeburg static const struct ixgb_option opt = { 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .type = enable_option, 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "Tx Interrupt Delay Enable", 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .err = "defaulting to Enabled", 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .def = OPTION_ENABLED 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 46103f83041d836022a17258c2731f6221f248bedcbJesse Brandeburg if (num_IntDelayEnable > bd) { 462273dc74e1c7d9aa2eab2036153c8fe65593fb85eStephen Hemminger unsigned int ide = IntDelayEnable[bd]; 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ixgb_validate_option(&ide, &opt); 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->tx_int_delay_enable = ide; 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds adapter->tx_int_delay_enable = opt.def; 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 470