Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 989a7241df87526bfef0396567e71ebe53a84ae4 787 lines 23 kB view raw
1/******************************************************************************* 2 3 Intel PRO/1000 Linux driver 4 Copyright(c) 1999 - 2006 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#include "e1000.h" 30 31/* This is the only thing that needs to be changed to adjust the 32 * maximum number of ports that the driver can manage. 33 */ 34 35#define E1000_MAX_NIC 32 36 37#define OPTION_UNSET -1 38#define OPTION_DISABLED 0 39#define OPTION_ENABLED 1 40 41/* All parameters are treated the same, as an integer array of values. 42 * This macro just reduces the need to repeat the same declaration code 43 * over and over (plus this helps to avoid typo bugs). 44 */ 45 46#define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } 47#define E1000_PARAM(X, desc) \ 48 static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ 49 static unsigned int num_##X; \ 50 module_param_array_named(X, X, int, &num_##X, 0); \ 51 MODULE_PARM_DESC(X, desc); 52 53/* Transmit Descriptor Count 54 * 55 * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers 56 * Valid Range: 80-4096 for 82544 and newer 57 * 58 * Default Value: 256 59 */ 60E1000_PARAM(TxDescriptors, "Number of transmit descriptors"); 61 62/* Receive Descriptor Count 63 * 64 * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers 65 * Valid Range: 80-4096 for 82544 and newer 66 * 67 * Default Value: 256 68 */ 69E1000_PARAM(RxDescriptors, "Number of receive descriptors"); 70 71/* User Specified Speed Override 72 * 73 * Valid Range: 0, 10, 100, 1000 74 * - 0 - auto-negotiate at all supported speeds 75 * - 10 - only link at 10 Mbps 76 * - 100 - only link at 100 Mbps 77 * - 1000 - only link at 1000 Mbps 78 * 79 * Default Value: 0 80 */ 81E1000_PARAM(Speed, "Speed setting"); 82 83/* User Specified Duplex Override 84 * 85 * Valid Range: 0-2 86 * - 0 - auto-negotiate for duplex 87 * - 1 - only link at half duplex 88 * - 2 - only link at full duplex 89 * 90 * Default Value: 0 91 */ 92E1000_PARAM(Duplex, "Duplex setting"); 93 94/* Auto-negotiation Advertisement Override 95 * 96 * Valid Range: 0x01-0x0F, 0x20-0x2F (copper); 0x20 (fiber) 97 * 98 * The AutoNeg value is a bit mask describing which speed and duplex 99 * combinations should be advertised during auto-negotiation. 100 * The supported speed and duplex modes are listed below 101 * 102 * Bit 7 6 5 4 3 2 1 0 103 * Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10 104 * Duplex Full Full Half Full Half 105 * 106 * Default Value: 0x2F (copper); 0x20 (fiber) 107 */ 108E1000_PARAM(AutoNeg, "Advertised auto-negotiation setting"); 109#define AUTONEG_ADV_DEFAULT 0x2F 110#define AUTONEG_ADV_MASK 0x2F 111 112/* User Specified Flow Control Override 113 * 114 * Valid Range: 0-3 115 * - 0 - No Flow Control 116 * - 1 - Rx only, respond to PAUSE frames but do not generate them 117 * - 2 - Tx only, generate PAUSE frames but ignore them on receive 118 * - 3 - Full Flow Control Support 119 * 120 * Default Value: Read flow control settings from the EEPROM 121 */ 122E1000_PARAM(FlowControl, "Flow Control setting"); 123#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL 124 125/* XsumRX - Receive Checksum Offload Enable/Disable 126 * 127 * Valid Range: 0, 1 128 * - 0 - disables all checksum offload 129 * - 1 - enables receive IP/TCP/UDP checksum offload 130 * on 82543 and newer -based NICs 131 * 132 * Default Value: 1 133 */ 134E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload"); 135 136/* Transmit Interrupt Delay in units of 1.024 microseconds 137 * Tx interrupt delay needs to typically be set to something non zero 138 * 139 * Valid Range: 0-65535 140 */ 141E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay"); 142#define DEFAULT_TIDV 8 143#define MAX_TXDELAY 0xFFFF 144#define MIN_TXDELAY 0 145 146/* Transmit Absolute Interrupt Delay in units of 1.024 microseconds 147 * 148 * Valid Range: 0-65535 149 */ 150E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay"); 151#define DEFAULT_TADV 32 152#define MAX_TXABSDELAY 0xFFFF 153#define MIN_TXABSDELAY 0 154 155/* Receive Interrupt Delay in units of 1.024 microseconds 156 * hardware will likely hang if you set this to anything but zero. 157 * 158 * Valid Range: 0-65535 159 */ 160E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); 161#define DEFAULT_RDTR 0 162#define MAX_RXDELAY 0xFFFF 163#define MIN_RXDELAY 0 164 165/* Receive Absolute Interrupt Delay in units of 1.024 microseconds 166 * 167 * Valid Range: 0-65535 168 */ 169E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay"); 170#define DEFAULT_RADV 8 171#define MAX_RXABSDELAY 0xFFFF 172#define MIN_RXABSDELAY 0 173 174/* Interrupt Throttle Rate (interrupts/sec) 175 * 176 * Valid Range: 100-100000 (0=off, 1=dynamic, 3=dynamic conservative) 177 */ 178E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate"); 179#define DEFAULT_ITR 3 180#define MAX_ITR 100000 181#define MIN_ITR 100 182 183/* Enable Smart Power Down of the PHY 184 * 185 * Valid Range: 0, 1 186 * 187 * Default Value: 0 (disabled) 188 */ 189E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); 190 191/* Enable Kumeran Lock Loss workaround 192 * 193 * Valid Range: 0, 1 194 * 195 * Default Value: 1 (enabled) 196 */ 197E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); 198 199struct e1000_option { 200 enum { enable_option, range_option, list_option } type; 201 const char *name; 202 const char *err; 203 int def; 204 union { 205 struct { /* range_option info */ 206 int min; 207 int max; 208 } r; 209 struct { /* list_option info */ 210 int nr; 211 struct e1000_opt_list { int i; char *str; } *p; 212 } l; 213 } arg; 214}; 215 216static int __devinit 217e1000_validate_option(unsigned int *value, 218 const struct e1000_option *opt, 219 struct e1000_adapter *adapter) 220{ 221 if (*value == OPTION_UNSET) { 222 *value = opt->def; 223 return 0; 224 } 225 226 switch (opt->type) { 227 case enable_option: 228 switch (*value) { 229 case OPTION_ENABLED: 230 DPRINTK(PROBE, INFO, "%s Enabled\n", opt->name); 231 return 0; 232 case OPTION_DISABLED: 233 DPRINTK(PROBE, INFO, "%s Disabled\n", opt->name); 234 return 0; 235 } 236 break; 237 case range_option: 238 if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { 239 DPRINTK(PROBE, INFO, 240 "%s set to %i\n", opt->name, *value); 241 return 0; 242 } 243 break; 244 case list_option: { 245 int i; 246 struct e1000_opt_list *ent; 247 248 for (i = 0; i < opt->arg.l.nr; i++) { 249 ent = &opt->arg.l.p[i]; 250 if (*value == ent->i) { 251 if (ent->str[0] != '\0') 252 DPRINTK(PROBE, INFO, "%s\n", ent->str); 253 return 0; 254 } 255 } 256 } 257 break; 258 default: 259 BUG(); 260 } 261 262 DPRINTK(PROBE, INFO, "Invalid %s value specified (%i) %s\n", 263 opt->name, *value, opt->err); 264 *value = opt->def; 265 return -1; 266} 267 268static void e1000_check_fiber_options(struct e1000_adapter *adapter); 269static void e1000_check_copper_options(struct e1000_adapter *adapter); 270 271/** 272 * e1000_check_options - Range Checking for Command Line Parameters 273 * @adapter: board private structure 274 * 275 * This routine checks all command line parameters for valid user 276 * input. If an invalid value is given, or if no user specified 277 * value exists, a default value is used. The final value is stored 278 * in a variable in the adapter structure. 279 **/ 280 281void __devinit 282e1000_check_options(struct e1000_adapter *adapter) 283{ 284 int bd = adapter->bd_number; 285 if (bd >= E1000_MAX_NIC) { 286 DPRINTK(PROBE, NOTICE, 287 "Warning: no configuration for board #%i\n", bd); 288 DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); 289 } 290 291 { /* Transmit Descriptor Count */ 292 struct e1000_option opt = { 293 .type = range_option, 294 .name = "Transmit Descriptors", 295 .err = "using default of " 296 __MODULE_STRING(E1000_DEFAULT_TXD), 297 .def = E1000_DEFAULT_TXD, 298 .arg = { .r = { .min = E1000_MIN_TXD }} 299 }; 300 struct e1000_tx_ring *tx_ring = adapter->tx_ring; 301 int i; 302 e1000_mac_type mac_type = adapter->hw.mac_type; 303 opt.arg.r.max = mac_type < e1000_82544 ? 304 E1000_MAX_TXD : E1000_MAX_82544_TXD; 305 306 if (num_TxDescriptors > bd) { 307 tx_ring->count = TxDescriptors[bd]; 308 e1000_validate_option(&tx_ring->count, &opt, adapter); 309 tx_ring->count = ALIGN(tx_ring->count, 310 REQ_TX_DESCRIPTOR_MULTIPLE); 311 } else { 312 tx_ring->count = opt.def; 313 } 314 for (i = 0; i < adapter->num_tx_queues; i++) 315 tx_ring[i].count = tx_ring->count; 316 } 317 { /* Receive Descriptor Count */ 318 struct e1000_option opt = { 319 .type = range_option, 320 .name = "Receive Descriptors", 321 .err = "using default of " 322 __MODULE_STRING(E1000_DEFAULT_RXD), 323 .def = E1000_DEFAULT_RXD, 324 .arg = { .r = { .min = E1000_MIN_RXD }} 325 }; 326 struct e1000_rx_ring *rx_ring = adapter->rx_ring; 327 int i; 328 e1000_mac_type mac_type = adapter->hw.mac_type; 329 opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : 330 E1000_MAX_82544_RXD; 331 332 if (num_RxDescriptors > bd) { 333 rx_ring->count = RxDescriptors[bd]; 334 e1000_validate_option(&rx_ring->count, &opt, adapter); 335 rx_ring->count = ALIGN(rx_ring->count, 336 REQ_RX_DESCRIPTOR_MULTIPLE); 337 } else { 338 rx_ring->count = opt.def; 339 } 340 for (i = 0; i < adapter->num_rx_queues; i++) 341 rx_ring[i].count = rx_ring->count; 342 } 343 { /* Checksum Offload Enable/Disable */ 344 struct e1000_option opt = { 345 .type = enable_option, 346 .name = "Checksum Offload", 347 .err = "defaulting to Enabled", 348 .def = OPTION_ENABLED 349 }; 350 351 if (num_XsumRX > bd) { 352 unsigned int rx_csum = XsumRX[bd]; 353 e1000_validate_option(&rx_csum, &opt, adapter); 354 adapter->rx_csum = rx_csum; 355 } else { 356 adapter->rx_csum = opt.def; 357 } 358 } 359 { /* Flow Control */ 360 361 struct e1000_opt_list fc_list[] = 362 {{ E1000_FC_NONE, "Flow Control Disabled" }, 363 { E1000_FC_RX_PAUSE,"Flow Control Receive Only" }, 364 { E1000_FC_TX_PAUSE,"Flow Control Transmit Only" }, 365 { E1000_FC_FULL, "Flow Control Enabled" }, 366 { E1000_FC_DEFAULT, "Flow Control Hardware Default" }}; 367 368 struct e1000_option opt = { 369 .type = list_option, 370 .name = "Flow Control", 371 .err = "reading default settings from EEPROM", 372 .def = E1000_FC_DEFAULT, 373 .arg = { .l = { .nr = ARRAY_SIZE(fc_list), 374 .p = fc_list }} 375 }; 376 377 if (num_FlowControl > bd) { 378 unsigned int fc = FlowControl[bd]; 379 e1000_validate_option(&fc, &opt, adapter); 380 adapter->hw.fc = adapter->hw.original_fc = fc; 381 } else { 382 adapter->hw.fc = adapter->hw.original_fc = opt.def; 383 } 384 } 385 { /* Transmit Interrupt Delay */ 386 struct e1000_option opt = { 387 .type = range_option, 388 .name = "Transmit Interrupt Delay", 389 .err = "using default of " __MODULE_STRING(DEFAULT_TIDV), 390 .def = DEFAULT_TIDV, 391 .arg = { .r = { .min = MIN_TXDELAY, 392 .max = MAX_TXDELAY }} 393 }; 394 395 if (num_TxIntDelay > bd) { 396 adapter->tx_int_delay = TxIntDelay[bd]; 397 e1000_validate_option(&adapter->tx_int_delay, &opt, 398 adapter); 399 } else { 400 adapter->tx_int_delay = opt.def; 401 } 402 } 403 { /* Transmit Absolute Interrupt Delay */ 404 struct e1000_option opt = { 405 .type = range_option, 406 .name = "Transmit Absolute Interrupt Delay", 407 .err = "using default of " __MODULE_STRING(DEFAULT_TADV), 408 .def = DEFAULT_TADV, 409 .arg = { .r = { .min = MIN_TXABSDELAY, 410 .max = MAX_TXABSDELAY }} 411 }; 412 413 if (num_TxAbsIntDelay > bd) { 414 adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; 415 e1000_validate_option(&adapter->tx_abs_int_delay, &opt, 416 adapter); 417 } else { 418 adapter->tx_abs_int_delay = opt.def; 419 } 420 } 421 { /* Receive Interrupt Delay */ 422 struct e1000_option opt = { 423 .type = range_option, 424 .name = "Receive Interrupt Delay", 425 .err = "using default of " __MODULE_STRING(DEFAULT_RDTR), 426 .def = DEFAULT_RDTR, 427 .arg = { .r = { .min = MIN_RXDELAY, 428 .max = MAX_RXDELAY }} 429 }; 430 431 if (num_RxIntDelay > bd) { 432 adapter->rx_int_delay = RxIntDelay[bd]; 433 e1000_validate_option(&adapter->rx_int_delay, &opt, 434 adapter); 435 } else { 436 adapter->rx_int_delay = opt.def; 437 } 438 } 439 { /* Receive Absolute Interrupt Delay */ 440 struct e1000_option opt = { 441 .type = range_option, 442 .name = "Receive Absolute Interrupt Delay", 443 .err = "using default of " __MODULE_STRING(DEFAULT_RADV), 444 .def = DEFAULT_RADV, 445 .arg = { .r = { .min = MIN_RXABSDELAY, 446 .max = MAX_RXABSDELAY }} 447 }; 448 449 if (num_RxAbsIntDelay > bd) { 450 adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; 451 e1000_validate_option(&adapter->rx_abs_int_delay, &opt, 452 adapter); 453 } else { 454 adapter->rx_abs_int_delay = opt.def; 455 } 456 } 457 { /* Interrupt Throttling Rate */ 458 struct e1000_option opt = { 459 .type = range_option, 460 .name = "Interrupt Throttling Rate (ints/sec)", 461 .err = "using default of " __MODULE_STRING(DEFAULT_ITR), 462 .def = DEFAULT_ITR, 463 .arg = { .r = { .min = MIN_ITR, 464 .max = MAX_ITR }} 465 }; 466 467 if (num_InterruptThrottleRate > bd) { 468 adapter->itr = InterruptThrottleRate[bd]; 469 switch (adapter->itr) { 470 case 0: 471 DPRINTK(PROBE, INFO, "%s turned off\n", 472 opt.name); 473 break; 474 case 1: 475 DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", 476 opt.name); 477 adapter->itr_setting = adapter->itr; 478 adapter->itr = 20000; 479 break; 480 case 3: 481 DPRINTK(PROBE, INFO, 482 "%s set to dynamic conservative mode\n", 483 opt.name); 484 adapter->itr_setting = adapter->itr; 485 adapter->itr = 20000; 486 break; 487 default: 488 e1000_validate_option(&adapter->itr, &opt, 489 adapter); 490 /* save the setting, because the dynamic bits change itr */ 491 /* clear the lower two bits because they are 492 * used as control */ 493 adapter->itr_setting = adapter->itr & ~3; 494 break; 495 } 496 } else { 497 adapter->itr_setting = opt.def; 498 adapter->itr = 20000; 499 } 500 } 501 { /* Smart Power Down */ 502 struct e1000_option opt = { 503 .type = enable_option, 504 .name = "PHY Smart Power Down", 505 .err = "defaulting to Disabled", 506 .def = OPTION_DISABLED 507 }; 508 509 if (num_SmartPowerDownEnable > bd) { 510 unsigned int spd = SmartPowerDownEnable[bd]; 511 e1000_validate_option(&spd, &opt, adapter); 512 adapter->smart_power_down = spd; 513 } else { 514 adapter->smart_power_down = opt.def; 515 } 516 } 517 { /* Kumeran Lock Loss Workaround */ 518 struct e1000_option opt = { 519 .type = enable_option, 520 .name = "Kumeran Lock Loss Workaround", 521 .err = "defaulting to Enabled", 522 .def = OPTION_ENABLED 523 }; 524 525 if (num_KumeranLockLoss > bd) { 526 unsigned int kmrn_lock_loss = KumeranLockLoss[bd]; 527 e1000_validate_option(&kmrn_lock_loss, &opt, adapter); 528 adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss; 529 } else { 530 adapter->hw.kmrn_lock_loss_workaround_disabled = !opt.def; 531 } 532 } 533 534 switch (adapter->hw.media_type) { 535 case e1000_media_type_fiber: 536 case e1000_media_type_internal_serdes: 537 e1000_check_fiber_options(adapter); 538 break; 539 case e1000_media_type_copper: 540 e1000_check_copper_options(adapter); 541 break; 542 default: 543 BUG(); 544 } 545} 546 547/** 548 * e1000_check_fiber_options - Range Checking for Link Options, Fiber Version 549 * @adapter: board private structure 550 * 551 * Handles speed and duplex options on fiber adapters 552 **/ 553 554static void __devinit 555e1000_check_fiber_options(struct e1000_adapter *adapter) 556{ 557 int bd = adapter->bd_number; 558 if (num_Speed > bd) { 559 DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " 560 "parameter ignored\n"); 561 } 562 563 if (num_Duplex > bd) { 564 DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " 565 "parameter ignored\n"); 566 } 567 568 if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { 569 DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " 570 "not valid for fiber adapters, " 571 "parameter ignored\n"); 572 } 573} 574 575/** 576 * e1000_check_copper_options - Range Checking for Link Options, Copper Version 577 * @adapter: board private structure 578 * 579 * Handles speed and duplex options on copper adapters 580 **/ 581 582static void __devinit 583e1000_check_copper_options(struct e1000_adapter *adapter) 584{ 585 unsigned int speed, dplx, an; 586 int bd = adapter->bd_number; 587 588 { /* Speed */ 589 struct e1000_opt_list speed_list[] = {{ 0, "" }, 590 { SPEED_10, "" }, 591 { SPEED_100, "" }, 592 { SPEED_1000, "" }}; 593 594 struct e1000_option opt = { 595 .type = list_option, 596 .name = "Speed", 597 .err = "parameter ignored", 598 .def = 0, 599 .arg = { .l = { .nr = ARRAY_SIZE(speed_list), 600 .p = speed_list }} 601 }; 602 603 if (num_Speed > bd) { 604 speed = Speed[bd]; 605 e1000_validate_option(&speed, &opt, adapter); 606 } else { 607 speed = opt.def; 608 } 609 } 610 { /* Duplex */ 611 struct e1000_opt_list dplx_list[] = {{ 0, "" }, 612 { HALF_DUPLEX, "" }, 613 { FULL_DUPLEX, "" }}; 614 615 struct e1000_option opt = { 616 .type = list_option, 617 .name = "Duplex", 618 .err = "parameter ignored", 619 .def = 0, 620 .arg = { .l = { .nr = ARRAY_SIZE(dplx_list), 621 .p = dplx_list }} 622 }; 623 624 if (e1000_check_phy_reset_block(&adapter->hw)) { 625 DPRINTK(PROBE, INFO, 626 "Link active due to SoL/IDER Session. " 627 "Speed/Duplex/AutoNeg parameter ignored.\n"); 628 return; 629 } 630 if (num_Duplex > bd) { 631 dplx = Duplex[bd]; 632 e1000_validate_option(&dplx, &opt, adapter); 633 } else { 634 dplx = opt.def; 635 } 636 } 637 638 if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { 639 DPRINTK(PROBE, INFO, 640 "AutoNeg specified along with Speed or Duplex, " 641 "parameter ignored\n"); 642 adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT; 643 } else { /* Autoneg */ 644 struct e1000_opt_list an_list[] = 645 #define AA "AutoNeg advertising " 646 {{ 0x01, AA "10/HD" }, 647 { 0x02, AA "10/FD" }, 648 { 0x03, AA "10/FD, 10/HD" }, 649 { 0x04, AA "100/HD" }, 650 { 0x05, AA "100/HD, 10/HD" }, 651 { 0x06, AA "100/HD, 10/FD" }, 652 { 0x07, AA "100/HD, 10/FD, 10/HD" }, 653 { 0x08, AA "100/FD" }, 654 { 0x09, AA "100/FD, 10/HD" }, 655 { 0x0a, AA "100/FD, 10/FD" }, 656 { 0x0b, AA "100/FD, 10/FD, 10/HD" }, 657 { 0x0c, AA "100/FD, 100/HD" }, 658 { 0x0d, AA "100/FD, 100/HD, 10/HD" }, 659 { 0x0e, AA "100/FD, 100/HD, 10/FD" }, 660 { 0x0f, AA "100/FD, 100/HD, 10/FD, 10/HD" }, 661 { 0x20, AA "1000/FD" }, 662 { 0x21, AA "1000/FD, 10/HD" }, 663 { 0x22, AA "1000/FD, 10/FD" }, 664 { 0x23, AA "1000/FD, 10/FD, 10/HD" }, 665 { 0x24, AA "1000/FD, 100/HD" }, 666 { 0x25, AA "1000/FD, 100/HD, 10/HD" }, 667 { 0x26, AA "1000/FD, 100/HD, 10/FD" }, 668 { 0x27, AA "1000/FD, 100/HD, 10/FD, 10/HD" }, 669 { 0x28, AA "1000/FD, 100/FD" }, 670 { 0x29, AA "1000/FD, 100/FD, 10/HD" }, 671 { 0x2a, AA "1000/FD, 100/FD, 10/FD" }, 672 { 0x2b, AA "1000/FD, 100/FD, 10/FD, 10/HD" }, 673 { 0x2c, AA "1000/FD, 100/FD, 100/HD" }, 674 { 0x2d, AA "1000/FD, 100/FD, 100/HD, 10/HD" }, 675 { 0x2e, AA "1000/FD, 100/FD, 100/HD, 10/FD" }, 676 { 0x2f, AA "1000/FD, 100/FD, 100/HD, 10/FD, 10/HD" }}; 677 678 struct e1000_option opt = { 679 .type = list_option, 680 .name = "AutoNeg", 681 .err = "parameter ignored", 682 .def = AUTONEG_ADV_DEFAULT, 683 .arg = { .l = { .nr = ARRAY_SIZE(an_list), 684 .p = an_list }} 685 }; 686 687 if (num_AutoNeg > bd) { 688 an = AutoNeg[bd]; 689 e1000_validate_option(&an, &opt, adapter); 690 } else { 691 an = opt.def; 692 } 693 adapter->hw.autoneg_advertised = an; 694 } 695 696 switch (speed + dplx) { 697 case 0: 698 adapter->hw.autoneg = adapter->fc_autoneg = 1; 699 if ((num_Speed > bd) && (speed != 0 || dplx != 0)) 700 DPRINTK(PROBE, INFO, 701 "Speed and duplex autonegotiation enabled\n"); 702 break; 703 case HALF_DUPLEX: 704 DPRINTK(PROBE, INFO, "Half Duplex specified without Speed\n"); 705 DPRINTK(PROBE, INFO, "Using Autonegotiation at " 706 "Half Duplex only\n"); 707 adapter->hw.autoneg = adapter->fc_autoneg = 1; 708 adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | 709 ADVERTISE_100_HALF; 710 break; 711 case FULL_DUPLEX: 712 DPRINTK(PROBE, INFO, "Full Duplex specified without Speed\n"); 713 DPRINTK(PROBE, INFO, "Using Autonegotiation at " 714 "Full Duplex only\n"); 715 adapter->hw.autoneg = adapter->fc_autoneg = 1; 716 adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | 717 ADVERTISE_100_FULL | 718 ADVERTISE_1000_FULL; 719 break; 720 case SPEED_10: 721 DPRINTK(PROBE, INFO, "10 Mbps Speed specified " 722 "without Duplex\n"); 723 DPRINTK(PROBE, INFO, "Using Autonegotiation at 10 Mbps only\n"); 724 adapter->hw.autoneg = adapter->fc_autoneg = 1; 725 adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | 726 ADVERTISE_10_FULL; 727 break; 728 case SPEED_10 + HALF_DUPLEX: 729 DPRINTK(PROBE, INFO, "Forcing to 10 Mbps Half Duplex\n"); 730 adapter->hw.autoneg = adapter->fc_autoneg = 0; 731 adapter->hw.forced_speed_duplex = e1000_10_half; 732 adapter->hw.autoneg_advertised = 0; 733 break; 734 case SPEED_10 + FULL_DUPLEX: 735 DPRINTK(PROBE, INFO, "Forcing to 10 Mbps Full Duplex\n"); 736 adapter->hw.autoneg = adapter->fc_autoneg = 0; 737 adapter->hw.forced_speed_duplex = e1000_10_full; 738 adapter->hw.autoneg_advertised = 0; 739 break; 740 case SPEED_100: 741 DPRINTK(PROBE, INFO, "100 Mbps Speed specified " 742 "without Duplex\n"); 743 DPRINTK(PROBE, INFO, "Using Autonegotiation at " 744 "100 Mbps only\n"); 745 adapter->hw.autoneg = adapter->fc_autoneg = 1; 746 adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | 747 ADVERTISE_100_FULL; 748 break; 749 case SPEED_100 + HALF_DUPLEX: 750 DPRINTK(PROBE, INFO, "Forcing to 100 Mbps Half Duplex\n"); 751 adapter->hw.autoneg = adapter->fc_autoneg = 0; 752 adapter->hw.forced_speed_duplex = e1000_100_half; 753 adapter->hw.autoneg_advertised = 0; 754 break; 755 case SPEED_100 + FULL_DUPLEX: 756 DPRINTK(PROBE, INFO, "Forcing to 100 Mbps Full Duplex\n"); 757 adapter->hw.autoneg = adapter->fc_autoneg = 0; 758 adapter->hw.forced_speed_duplex = e1000_100_full; 759 adapter->hw.autoneg_advertised = 0; 760 break; 761 case SPEED_1000: 762 DPRINTK(PROBE, INFO, "1000 Mbps Speed specified without " 763 "Duplex\n"); 764 goto full_duplex_only; 765 case SPEED_1000 + HALF_DUPLEX: 766 DPRINTK(PROBE, INFO, 767 "Half Duplex is not supported at 1000 Mbps\n"); 768 /* fall through */ 769 case SPEED_1000 + FULL_DUPLEX: 770full_duplex_only: 771 DPRINTK(PROBE, INFO, 772 "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); 773 adapter->hw.autoneg = adapter->fc_autoneg = 1; 774 adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; 775 break; 776 default: 777 BUG(); 778 } 779 780 /* Speed, AutoNeg and MDI/MDI-X must all play nice */ 781 if (e1000_validate_mdi_setting(&(adapter->hw)) < 0) { 782 DPRINTK(PROBE, INFO, 783 "Speed, AutoNeg and MDI-X specifications are " 784 "incompatible. Setting MDI-X to a compatible value.\n"); 785 } 786} 787