1/******************************************************************************* 2 3 Intel PRO/10GbE Linux driver 4 Copyright(c) 1999 - 2008 Intel Corporation. 5 6 This program is free software; you can redistribute it and/or modify it 7 under the terms and conditions of the GNU General Public License, 8 version 2, as published by the Free Software Foundation. 9 10 This program is distributed in the hope it will be useful, but WITHOUT 11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 more details. 14 15 You should have received a copy of the GNU General Public License along with 16 this program; if not, write to the Free Software Foundation, Inc., 17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18 19 The full GNU General Public License is included in this distribution in 20 the file called "COPYING". 21 22 Contact Information: 23 Linux NICS <linux.nics@intel.com> 24 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 26 27*******************************************************************************/ 28 29#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 30 31#include "ixgb.h" 32 33/* This is the only thing that needs to be changed to adjust the 34 * maximum number of ports that the driver can manage. 35 */ 36 37#define IXGB_MAX_NIC 8 38 39#define OPTION_UNSET -1 40#define OPTION_DISABLED 0 41#define OPTION_ENABLED 1 42 43/* All parameters are treated the same, as an integer array of values. 44 * This macro just reduces the need to repeat the same declaration code 45 * over and over (plus this helps to avoid typo bugs). 46 */ 47 48#define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET } 49#define IXGB_PARAM(X, desc) \ 50 static int X[IXGB_MAX_NIC+1] \ 51 = IXGB_PARAM_INIT; \ 52 static unsigned int num_##X = 0; \ 53 module_param_array_named(X, X, int, &num_##X, 0); \ 54 MODULE_PARM_DESC(X, desc); 55 56/* Transmit Descriptor Count 57 * 58 * Valid Range: 64-4096 59 * 60 * Default Value: 256 61 */ 62 63IXGB_PARAM(TxDescriptors, "Number of transmit descriptors"); 64 65/* Receive Descriptor Count 66 * 67 * Valid Range: 64-4096 68 * 69 * Default Value: 1024 70 */ 71 72IXGB_PARAM(RxDescriptors, "Number of receive descriptors"); 73 74/* User Specified Flow Control Override 75 * 76 * Valid Range: 0-3 77 * - 0 - No Flow Control 78 * - 1 - Rx only, respond to PAUSE frames but do not generate them 79 * - 2 - Tx only, generate PAUSE frames but ignore them on receive 80 * - 3 - Full Flow Control Support 81 * 82 * Default Value: 2 - Tx only (silicon bug avoidance) 83 */ 84 85IXGB_PARAM(FlowControl, "Flow Control setting"); 86 87/* XsumRX - Receive Checksum Offload Enable/Disable 88 * 89 * Valid Range: 0, 1 90 * - 0 - disables all checksum offload 91 * - 1 - enables receive IP/TCP/UDP checksum offload 92 * on 82597 based NICs 93 * 94 * Default Value: 1 95 */ 96 97IXGB_PARAM(XsumRX, "Disable or enable Receive Checksum offload"); 98 99/* Transmit Interrupt Delay in units of 0.8192 microseconds 100 * 101 * Valid Range: 0-65535 102 * 103 * Default Value: 32 104 */ 105 106IXGB_PARAM(TxIntDelay, "Transmit Interrupt Delay"); 107 108/* Receive Interrupt Delay in units of 0.8192 microseconds 109 * 110 * Valid Range: 0-65535 111 * 112 * Default Value: 72 113 */ 114 115IXGB_PARAM(RxIntDelay, "Receive Interrupt Delay"); 116 117/* Receive Flow control high threshold (when we send a pause frame) 118 * (FCRTH) 119 * 120 * Valid Range: 1,536 - 262,136 (0x600 - 0x3FFF8, 8 byte granularity) 121 * 122 * Default Value: 196,608 (0x30000) 123 */ 124 125IXGB_PARAM(RxFCHighThresh, "Receive Flow Control High Threshold"); 126 127/* Receive Flow control low threshold (when we send a resume frame) 128 * (FCRTL) 129 * 130 * Valid Range: 64 - 262,136 (0x40 - 0x3FFF8, 8 byte granularity) 131 * must be less than high threshold by at least 8 bytes 132 * 133 * Default Value: 163,840 (0x28000) 134 */ 135 136IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold"); 137 138/* Flow control request timeout (how long to pause the link partner's tx) 139 * (PAP 15:0) 140 * 141 * Valid Range: 1 - 65535 142 * 143 * Default Value: 65535 (0xffff) (we'll send an xon if we recover) 144 */ 145 146IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout"); 147 148/* Interrupt Delay Enable 149 * 150 * Valid Range: 0, 1 151 * 152 * - 0 - disables transmit interrupt delay 153 * - 1 - enables transmmit interrupt delay 154 * 155 * Default Value: 1 156 */ 157 158IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable"); 159 160 161#define DEFAULT_TIDV 32 162#define MAX_TIDV 0xFFFF 163#define MIN_TIDV 0 164 165#define DEFAULT_RDTR 72 166#define MAX_RDTR 0xFFFF 167#define MIN_RDTR 0 168 169#define XSUMRX_DEFAULT OPTION_ENABLED 170 171#define DEFAULT_FCRTL 0x28000 172#define DEFAULT_FCRTH 0x30000 173#define MIN_FCRTL 0 174#define MAX_FCRTL 0x3FFE8 175#define MIN_FCRTH 8 176#define MAX_FCRTH 0x3FFF0 177 178#define MIN_FCPAUSE 1 179#define MAX_FCPAUSE 0xffff 180#define DEFAULT_FCPAUSE 0xFFFF /* this may be too long */ 181 182struct ixgb_option { 183 enum { enable_option, range_option, list_option } type; 184 const char *name; 185 const char *err; 186 int def; 187 union { 188 struct { /* range_option info */ 189 int min; 190 int max; 191 } r; 192 struct { /* list_option info */ 193 int nr; 194 const struct ixgb_opt_list { 195 int i; 196 const char *str; 197 } *p; 198 } l; 199 } arg; 200}; 201 202static int 203ixgb_validate_option(unsigned int *value, const struct ixgb_option *opt) 204{ 205 if (*value == OPTION_UNSET) { 206 *value = opt->def; 207 return 0; 208 } 209 210 switch (opt->type) { 211 case enable_option: 212 switch (*value) { 213 case OPTION_ENABLED: 214 pr_info("%s Enabled\n", opt->name); 215 return 0; 216 case OPTION_DISABLED: 217 pr_info("%s Disabled\n", opt->name); 218 return 0; 219 } 220 break; 221 case range_option: 222 if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { 223 pr_info("%s set to %i\n", opt->name, *value); 224 return 0; 225 } 226 break; 227 case list_option: { 228 int i; 229 const struct ixgb_opt_list *ent; 230 231 for (i = 0; i < opt->arg.l.nr; i++) { 232 ent = &opt->arg.l.p[i]; 233 if (*value == ent->i) { 234 if (ent->str[0] != '\0') 235 pr_info("%s\n", ent->str); 236 return 0; 237 } 238 } 239 } 240 break; 241 default: 242 BUG(); 243 } 244 245 pr_info("Invalid %s specified (%i) %s\n", opt->name, *value, opt->err); 246 *value = opt->def; 247 return -1; 248} 249 250/** 251 * ixgb_check_options - Range Checking for Command Line Parameters 252 * @adapter: board private structure 253 * 254 * This routine checks all command line parameters for valid user 255 * input. If an invalid value is given, or if no user specified 256 * value exists, a default value is used. The final value is stored 257 * in a variable in the adapter structure. 258 **/ 259 260void 261ixgb_check_options(struct ixgb_adapter *adapter) 262{ 263 int bd = adapter->bd_number; 264 if (bd >= IXGB_MAX_NIC) { 265 pr_notice("Warning: no configuration for board #%i\n", bd); 266 pr_notice("Using defaults for all values\n"); 267 } 268 269 { /* Transmit Descriptor Count */ 270 static const struct ixgb_option opt = { 271 .type = range_option, 272 .name = "Transmit Descriptors", 273 .err = "using default of " __MODULE_STRING(DEFAULT_TXD), 274 .def = DEFAULT_TXD, 275 .arg = { .r = { .min = MIN_TXD, 276 .max = MAX_TXD}} 277 }; 278 struct ixgb_desc_ring *tx_ring = &adapter->tx_ring; 279 280 if (num_TxDescriptors > bd) { 281 tx_ring->count = TxDescriptors[bd]; 282 ixgb_validate_option(&tx_ring->count, &opt); 283 } else { 284 tx_ring->count = opt.def; 285 } 286 tx_ring->count = ALIGN(tx_ring->count, IXGB_REQ_TX_DESCRIPTOR_MULTIPLE); 287 } 288 { /* Receive Descriptor Count */ 289 static const struct ixgb_option opt = { 290 .type = range_option, 291 .name = "Receive Descriptors", 292 .err = "using default of " __MODULE_STRING(DEFAULT_RXD), 293 .def = DEFAULT_RXD, 294 .arg = { .r = { .min = MIN_RXD, 295 .max = MAX_RXD}} 296 }; 297 struct ixgb_desc_ring *rx_ring = &adapter->rx_ring; 298 299 if (num_RxDescriptors > bd) { 300 rx_ring->count = RxDescriptors[bd]; 301 ixgb_validate_option(&rx_ring->count, &opt); 302 } else { 303 rx_ring->count = opt.def; 304 } 305 rx_ring->count = ALIGN(rx_ring->count, IXGB_REQ_RX_DESCRIPTOR_MULTIPLE); 306 } 307 { /* Receive Checksum Offload Enable */ 308 static const struct ixgb_option opt = { 309 .type = enable_option, 310 .name = "Receive Checksum Offload", 311 .err = "defaulting to Enabled", 312 .def = OPTION_ENABLED 313 }; 314 315 if (num_XsumRX > bd) { 316 unsigned int rx_csum = XsumRX[bd]; 317 ixgb_validate_option(&rx_csum, &opt); 318 adapter->rx_csum = rx_csum; 319 } else { 320 adapter->rx_csum = opt.def; 321 } 322 } 323 { /* Flow Control */ 324 325 static const struct ixgb_opt_list fc_list[] = { 326 { ixgb_fc_none, "Flow Control Disabled" }, 327 { ixgb_fc_rx_pause, "Flow Control Receive Only" }, 328 { ixgb_fc_tx_pause, "Flow Control Transmit Only" }, 329 { ixgb_fc_full, "Flow Control Enabled" }, 330 { ixgb_fc_default, "Flow Control Hardware Default" } 331 }; 332 333 static const struct ixgb_option opt = { 334 .type = list_option, 335 .name = "Flow Control", 336 .err = "reading default settings from EEPROM", 337 .def = ixgb_fc_tx_pause, 338 .arg = { .l = { .nr = ARRAY_SIZE(fc_list), 339 .p = fc_list }} 340 }; 341 342 if (num_FlowControl > bd) { 343 unsigned int fc = FlowControl[bd]; 344 ixgb_validate_option(&fc, &opt); 345 adapter->hw.fc.type = fc; 346 } else { 347 adapter->hw.fc.type = opt.def; 348 } 349 } 350 { /* Receive Flow Control High Threshold */ 351 static const struct ixgb_option opt = { 352 .type = range_option, 353 .name = "Rx Flow Control High Threshold", 354 .err = "using default of " __MODULE_STRING(DEFAULT_FCRTH), 355 .def = DEFAULT_FCRTH, 356 .arg = { .r = { .min = MIN_FCRTH, 357 .max = MAX_FCRTH}} 358 }; 359 360 if (num_RxFCHighThresh > bd) { 361 adapter->hw.fc.high_water = RxFCHighThresh[bd]; 362 ixgb_validate_option(&adapter->hw.fc.high_water, &opt); 363 } else { 364 adapter->hw.fc.high_water = opt.def; 365 } 366 if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) 367 pr_info("Ignoring RxFCHighThresh when no RxFC\n"); 368 } 369 { /* Receive Flow Control Low Threshold */ 370 static const struct ixgb_option opt = { 371 .type = range_option, 372 .name = "Rx Flow Control Low Threshold", 373 .err = "using default of " __MODULE_STRING(DEFAULT_FCRTL), 374 .def = DEFAULT_FCRTL, 375 .arg = { .r = { .min = MIN_FCRTL, 376 .max = MAX_FCRTL}} 377 }; 378 379 if (num_RxFCLowThresh > bd) { 380 adapter->hw.fc.low_water = RxFCLowThresh[bd]; 381 ixgb_validate_option(&adapter->hw.fc.low_water, &opt); 382 } else { 383 adapter->hw.fc.low_water = opt.def; 384 } 385 if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) 386 pr_info("Ignoring RxFCLowThresh when no RxFC\n"); 387 } 388 { /* Flow Control Pause Time Request*/ 389 static const struct ixgb_option opt = { 390 .type = range_option, 391 .name = "Flow Control Pause Time Request", 392 .err = "using default of "__MODULE_STRING(DEFAULT_FCPAUSE), 393 .def = DEFAULT_FCPAUSE, 394 .arg = { .r = { .min = MIN_FCPAUSE, 395 .max = MAX_FCPAUSE}} 396 }; 397 398 if (num_FCReqTimeout > bd) { 399 unsigned int pause_time = FCReqTimeout[bd]; 400 ixgb_validate_option(&pause_time, &opt); 401 adapter->hw.fc.pause_time = pause_time; 402 } else { 403 adapter->hw.fc.pause_time = opt.def; 404 } 405 if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) ) 406 pr_info("Ignoring FCReqTimeout when no RxFC\n"); 407 } 408 /* high low and spacing check for rx flow control thresholds */ 409 if (adapter->hw.fc.type & ixgb_fc_tx_pause) { 410 /* high must be greater than low */ 411 if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) { 412 /* set defaults */ 413 pr_info("RxFCHighThresh must be >= (RxFCLowThresh + 8), Using Defaults\n"); 414 adapter->hw.fc.high_water = DEFAULT_FCRTH; 415 adapter->hw.fc.low_water = DEFAULT_FCRTL; 416 } 417 } 418 { /* Receive Interrupt Delay */ 419 static const struct ixgb_option opt = { 420 .type = range_option, 421 .name = "Receive Interrupt Delay", 422 .err = "using default of " __MODULE_STRING(DEFAULT_RDTR), 423 .def = DEFAULT_RDTR, 424 .arg = { .r = { .min = MIN_RDTR, 425 .max = MAX_RDTR}} 426 }; 427 428 if (num_RxIntDelay > bd) { 429 adapter->rx_int_delay = RxIntDelay[bd]; 430 ixgb_validate_option(&adapter->rx_int_delay, &opt); 431 } else { 432 adapter->rx_int_delay = opt.def; 433 } 434 } 435 { /* Transmit Interrupt Delay */ 436 static const struct ixgb_option opt = { 437 .type = range_option, 438 .name = "Transmit Interrupt Delay", 439 .err = "using default of " __MODULE_STRING(DEFAULT_TIDV), 440 .def = DEFAULT_TIDV, 441 .arg = { .r = { .min = MIN_TIDV, 442 .max = MAX_TIDV}} 443 }; 444 445 if (num_TxIntDelay > bd) { 446 adapter->tx_int_delay = TxIntDelay[bd]; 447 ixgb_validate_option(&adapter->tx_int_delay, &opt); 448 } else { 449 adapter->tx_int_delay = opt.def; 450 } 451 } 452 453 { /* Transmit Interrupt Delay Enable */ 454 static const struct ixgb_option opt = { 455 .type = enable_option, 456 .name = "Tx Interrupt Delay Enable", 457 .err = "defaulting to Enabled", 458 .def = OPTION_ENABLED 459 }; 460 461 if (num_IntDelayEnable > bd) { 462 unsigned int ide = IntDelayEnable[bd]; 463 ixgb_validate_option(&ide, &opt); 464 adapter->tx_int_delay_enable = ide; 465 } else { 466 adapter->tx_int_delay_enable = opt.def; 467 } 468 } 469} 470