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 v2.6.27-rc2 783 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 e1000_validate_option(unsigned int *value, 217 const struct e1000_option *opt, 218 struct e1000_adapter *adapter) 219{ 220 if (*value == OPTION_UNSET) { 221 *value = opt->def; 222 return 0; 223 } 224 225 switch (opt->type) { 226 case enable_option: 227 switch (*value) { 228 case OPTION_ENABLED: 229 DPRINTK(PROBE, INFO, "%s Enabled\n", opt->name); 230 return 0; 231 case OPTION_DISABLED: 232 DPRINTK(PROBE, INFO, "%s Disabled\n", opt->name); 233 return 0; 234 } 235 break; 236 case range_option: 237 if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { 238 DPRINTK(PROBE, INFO, 239 "%s set to %i\n", opt->name, *value); 240 return 0; 241 } 242 break; 243 case list_option: { 244 int i; 245 struct e1000_opt_list *ent; 246 247 for (i = 0; i < opt->arg.l.nr; i++) { 248 ent = &opt->arg.l.p[i]; 249 if (*value == ent->i) { 250 if (ent->str[0] != '\0') 251 DPRINTK(PROBE, INFO, "%s\n", ent->str); 252 return 0; 253 } 254 } 255 } 256 break; 257 default: 258 BUG(); 259 } 260 261 DPRINTK(PROBE, INFO, "Invalid %s value specified (%i) %s\n", 262 opt->name, *value, opt->err); 263 *value = opt->def; 264 return -1; 265} 266 267static void e1000_check_fiber_options(struct e1000_adapter *adapter); 268static void e1000_check_copper_options(struct e1000_adapter *adapter); 269 270/** 271 * e1000_check_options - Range Checking for Command Line Parameters 272 * @adapter: board private structure 273 * 274 * This routine checks all command line parameters for valid user 275 * input. If an invalid value is given, or if no user specified 276 * value exists, a default value is used. The final value is stored 277 * in a variable in the adapter structure. 278 **/ 279 280void __devinit e1000_check_options(struct e1000_adapter *adapter) 281{ 282 int bd = adapter->bd_number; 283 if (bd >= E1000_MAX_NIC) { 284 DPRINTK(PROBE, NOTICE, 285 "Warning: no configuration for board #%i\n", bd); 286 DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); 287 } 288 289 { /* Transmit Descriptor Count */ 290 struct e1000_option opt = { 291 .type = range_option, 292 .name = "Transmit Descriptors", 293 .err = "using default of " 294 __MODULE_STRING(E1000_DEFAULT_TXD), 295 .def = E1000_DEFAULT_TXD, 296 .arg = { .r = { .min = E1000_MIN_TXD }} 297 }; 298 struct e1000_tx_ring *tx_ring = adapter->tx_ring; 299 int i; 300 e1000_mac_type mac_type = adapter->hw.mac_type; 301 opt.arg.r.max = mac_type < e1000_82544 ? 302 E1000_MAX_TXD : E1000_MAX_82544_TXD; 303 304 if (num_TxDescriptors > bd) { 305 tx_ring->count = TxDescriptors[bd]; 306 e1000_validate_option(&tx_ring->count, &opt, adapter); 307 tx_ring->count = ALIGN(tx_ring->count, 308 REQ_TX_DESCRIPTOR_MULTIPLE); 309 } else { 310 tx_ring->count = opt.def; 311 } 312 for (i = 0; i < adapter->num_tx_queues; i++) 313 tx_ring[i].count = tx_ring->count; 314 } 315 { /* Receive Descriptor Count */ 316 struct e1000_option opt = { 317 .type = range_option, 318 .name = "Receive Descriptors", 319 .err = "using default of " 320 __MODULE_STRING(E1000_DEFAULT_RXD), 321 .def = E1000_DEFAULT_RXD, 322 .arg = { .r = { .min = E1000_MIN_RXD }} 323 }; 324 struct e1000_rx_ring *rx_ring = adapter->rx_ring; 325 int i; 326 e1000_mac_type mac_type = adapter->hw.mac_type; 327 opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : 328 E1000_MAX_82544_RXD; 329 330 if (num_RxDescriptors > bd) { 331 rx_ring->count = RxDescriptors[bd]; 332 e1000_validate_option(&rx_ring->count, &opt, adapter); 333 rx_ring->count = ALIGN(rx_ring->count, 334 REQ_RX_DESCRIPTOR_MULTIPLE); 335 } else { 336 rx_ring->count = opt.def; 337 } 338 for (i = 0; i < adapter->num_rx_queues; i++) 339 rx_ring[i].count = rx_ring->count; 340 } 341 { /* Checksum Offload Enable/Disable */ 342 struct e1000_option opt = { 343 .type = enable_option, 344 .name = "Checksum Offload", 345 .err = "defaulting to Enabled", 346 .def = OPTION_ENABLED 347 }; 348 349 if (num_XsumRX > bd) { 350 unsigned int rx_csum = XsumRX[bd]; 351 e1000_validate_option(&rx_csum, &opt, adapter); 352 adapter->rx_csum = rx_csum; 353 } else { 354 adapter->rx_csum = opt.def; 355 } 356 } 357 { /* Flow Control */ 358 359 struct e1000_opt_list fc_list[] = 360 {{ E1000_FC_NONE, "Flow Control Disabled" }, 361 { E1000_FC_RX_PAUSE,"Flow Control Receive Only" }, 362 { E1000_FC_TX_PAUSE,"Flow Control Transmit Only" }, 363 { E1000_FC_FULL, "Flow Control Enabled" }, 364 { E1000_FC_DEFAULT, "Flow Control Hardware Default" }}; 365 366 struct e1000_option opt = { 367 .type = list_option, 368 .name = "Flow Control", 369 .err = "reading default settings from EEPROM", 370 .def = E1000_FC_DEFAULT, 371 .arg = { .l = { .nr = ARRAY_SIZE(fc_list), 372 .p = fc_list }} 373 }; 374 375 if (num_FlowControl > bd) { 376 unsigned int fc = FlowControl[bd]; 377 e1000_validate_option(&fc, &opt, adapter); 378 adapter->hw.fc = adapter->hw.original_fc = fc; 379 } else { 380 adapter->hw.fc = adapter->hw.original_fc = opt.def; 381 } 382 } 383 { /* Transmit Interrupt Delay */ 384 struct e1000_option opt = { 385 .type = range_option, 386 .name = "Transmit Interrupt Delay", 387 .err = "using default of " __MODULE_STRING(DEFAULT_TIDV), 388 .def = DEFAULT_TIDV, 389 .arg = { .r = { .min = MIN_TXDELAY, 390 .max = MAX_TXDELAY }} 391 }; 392 393 if (num_TxIntDelay > bd) { 394 adapter->tx_int_delay = TxIntDelay[bd]; 395 e1000_validate_option(&adapter->tx_int_delay, &opt, 396 adapter); 397 } else { 398 adapter->tx_int_delay = opt.def; 399 } 400 } 401 { /* Transmit Absolute Interrupt Delay */ 402 struct e1000_option opt = { 403 .type = range_option, 404 .name = "Transmit Absolute Interrupt Delay", 405 .err = "using default of " __MODULE_STRING(DEFAULT_TADV), 406 .def = DEFAULT_TADV, 407 .arg = { .r = { .min = MIN_TXABSDELAY, 408 .max = MAX_TXABSDELAY }} 409 }; 410 411 if (num_TxAbsIntDelay > bd) { 412 adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; 413 e1000_validate_option(&adapter->tx_abs_int_delay, &opt, 414 adapter); 415 } else { 416 adapter->tx_abs_int_delay = opt.def; 417 } 418 } 419 { /* Receive Interrupt Delay */ 420 struct e1000_option opt = { 421 .type = range_option, 422 .name = "Receive Interrupt Delay", 423 .err = "using default of " __MODULE_STRING(DEFAULT_RDTR), 424 .def = DEFAULT_RDTR, 425 .arg = { .r = { .min = MIN_RXDELAY, 426 .max = MAX_RXDELAY }} 427 }; 428 429 if (num_RxIntDelay > bd) { 430 adapter->rx_int_delay = RxIntDelay[bd]; 431 e1000_validate_option(&adapter->rx_int_delay, &opt, 432 adapter); 433 } else { 434 adapter->rx_int_delay = opt.def; 435 } 436 } 437 { /* Receive Absolute Interrupt Delay */ 438 struct e1000_option opt = { 439 .type = range_option, 440 .name = "Receive Absolute Interrupt Delay", 441 .err = "using default of " __MODULE_STRING(DEFAULT_RADV), 442 .def = DEFAULT_RADV, 443 .arg = { .r = { .min = MIN_RXABSDELAY, 444 .max = MAX_RXABSDELAY }} 445 }; 446 447 if (num_RxAbsIntDelay > bd) { 448 adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; 449 e1000_validate_option(&adapter->rx_abs_int_delay, &opt, 450 adapter); 451 } else { 452 adapter->rx_abs_int_delay = opt.def; 453 } 454 } 455 { /* Interrupt Throttling Rate */ 456 struct e1000_option opt = { 457 .type = range_option, 458 .name = "Interrupt Throttling Rate (ints/sec)", 459 .err = "using default of " __MODULE_STRING(DEFAULT_ITR), 460 .def = DEFAULT_ITR, 461 .arg = { .r = { .min = MIN_ITR, 462 .max = MAX_ITR }} 463 }; 464 465 if (num_InterruptThrottleRate > bd) { 466 adapter->itr = InterruptThrottleRate[bd]; 467 switch (adapter->itr) { 468 case 0: 469 DPRINTK(PROBE, INFO, "%s turned off\n", 470 opt.name); 471 break; 472 case 1: 473 DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", 474 opt.name); 475 adapter->itr_setting = adapter->itr; 476 adapter->itr = 20000; 477 break; 478 case 3: 479 DPRINTK(PROBE, INFO, 480 "%s set to dynamic conservative mode\n", 481 opt.name); 482 adapter->itr_setting = adapter->itr; 483 adapter->itr = 20000; 484 break; 485 default: 486 e1000_validate_option(&adapter->itr, &opt, 487 adapter); 488 /* save the setting, because the dynamic bits change itr */ 489 /* clear the lower two bits because they are 490 * used as control */ 491 adapter->itr_setting = adapter->itr & ~3; 492 break; 493 } 494 } else { 495 adapter->itr_setting = opt.def; 496 adapter->itr = 20000; 497 } 498 } 499 { /* Smart Power Down */ 500 struct e1000_option opt = { 501 .type = enable_option, 502 .name = "PHY Smart Power Down", 503 .err = "defaulting to Disabled", 504 .def = OPTION_DISABLED 505 }; 506 507 if (num_SmartPowerDownEnable > bd) { 508 unsigned int spd = SmartPowerDownEnable[bd]; 509 e1000_validate_option(&spd, &opt, adapter); 510 adapter->smart_power_down = spd; 511 } else { 512 adapter->smart_power_down = opt.def; 513 } 514 } 515 { /* Kumeran Lock Loss Workaround */ 516 struct e1000_option opt = { 517 .type = enable_option, 518 .name = "Kumeran Lock Loss Workaround", 519 .err = "defaulting to Enabled", 520 .def = OPTION_ENABLED 521 }; 522 523 if (num_KumeranLockLoss > bd) { 524 unsigned int kmrn_lock_loss = KumeranLockLoss[bd]; 525 e1000_validate_option(&kmrn_lock_loss, &opt, adapter); 526 adapter->hw.kmrn_lock_loss_workaround_disabled = !kmrn_lock_loss; 527 } else { 528 adapter->hw.kmrn_lock_loss_workaround_disabled = !opt.def; 529 } 530 } 531 532 switch (adapter->hw.media_type) { 533 case e1000_media_type_fiber: 534 case e1000_media_type_internal_serdes: 535 e1000_check_fiber_options(adapter); 536 break; 537 case e1000_media_type_copper: 538 e1000_check_copper_options(adapter); 539 break; 540 default: 541 BUG(); 542 } 543} 544 545/** 546 * e1000_check_fiber_options - Range Checking for Link Options, Fiber Version 547 * @adapter: board private structure 548 * 549 * Handles speed and duplex options on fiber adapters 550 **/ 551 552static void __devinit e1000_check_fiber_options(struct e1000_adapter *adapter) 553{ 554 int bd = adapter->bd_number; 555 if (num_Speed > bd) { 556 DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " 557 "parameter ignored\n"); 558 } 559 560 if (num_Duplex > bd) { 561 DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " 562 "parameter ignored\n"); 563 } 564 565 if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { 566 DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " 567 "not valid for fiber adapters, " 568 "parameter ignored\n"); 569 } 570} 571 572/** 573 * e1000_check_copper_options - Range Checking for Link Options, Copper Version 574 * @adapter: board private structure 575 * 576 * Handles speed and duplex options on copper adapters 577 **/ 578 579static void __devinit e1000_check_copper_options(struct e1000_adapter *adapter) 580{ 581 unsigned int speed, dplx, an; 582 int bd = adapter->bd_number; 583 584 { /* Speed */ 585 struct e1000_opt_list speed_list[] = {{ 0, "" }, 586 { SPEED_10, "" }, 587 { SPEED_100, "" }, 588 { SPEED_1000, "" }}; 589 590 struct e1000_option opt = { 591 .type = list_option, 592 .name = "Speed", 593 .err = "parameter ignored", 594 .def = 0, 595 .arg = { .l = { .nr = ARRAY_SIZE(speed_list), 596 .p = speed_list }} 597 }; 598 599 if (num_Speed > bd) { 600 speed = Speed[bd]; 601 e1000_validate_option(&speed, &opt, adapter); 602 } else { 603 speed = opt.def; 604 } 605 } 606 { /* Duplex */ 607 struct e1000_opt_list dplx_list[] = {{ 0, "" }, 608 { HALF_DUPLEX, "" }, 609 { FULL_DUPLEX, "" }}; 610 611 struct e1000_option opt = { 612 .type = list_option, 613 .name = "Duplex", 614 .err = "parameter ignored", 615 .def = 0, 616 .arg = { .l = { .nr = ARRAY_SIZE(dplx_list), 617 .p = dplx_list }} 618 }; 619 620 if (e1000_check_phy_reset_block(&adapter->hw)) { 621 DPRINTK(PROBE, INFO, 622 "Link active due to SoL/IDER Session. " 623 "Speed/Duplex/AutoNeg parameter ignored.\n"); 624 return; 625 } 626 if (num_Duplex > bd) { 627 dplx = Duplex[bd]; 628 e1000_validate_option(&dplx, &opt, adapter); 629 } else { 630 dplx = opt.def; 631 } 632 } 633 634 if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { 635 DPRINTK(PROBE, INFO, 636 "AutoNeg specified along with Speed or Duplex, " 637 "parameter ignored\n"); 638 adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT; 639 } else { /* Autoneg */ 640 struct e1000_opt_list an_list[] = 641 #define AA "AutoNeg advertising " 642 {{ 0x01, AA "10/HD" }, 643 { 0x02, AA "10/FD" }, 644 { 0x03, AA "10/FD, 10/HD" }, 645 { 0x04, AA "100/HD" }, 646 { 0x05, AA "100/HD, 10/HD" }, 647 { 0x06, AA "100/HD, 10/FD" }, 648 { 0x07, AA "100/HD, 10/FD, 10/HD" }, 649 { 0x08, AA "100/FD" }, 650 { 0x09, AA "100/FD, 10/HD" }, 651 { 0x0a, AA "100/FD, 10/FD" }, 652 { 0x0b, AA "100/FD, 10/FD, 10/HD" }, 653 { 0x0c, AA "100/FD, 100/HD" }, 654 { 0x0d, AA "100/FD, 100/HD, 10/HD" }, 655 { 0x0e, AA "100/FD, 100/HD, 10/FD" }, 656 { 0x0f, AA "100/FD, 100/HD, 10/FD, 10/HD" }, 657 { 0x20, AA "1000/FD" }, 658 { 0x21, AA "1000/FD, 10/HD" }, 659 { 0x22, AA "1000/FD, 10/FD" }, 660 { 0x23, AA "1000/FD, 10/FD, 10/HD" }, 661 { 0x24, AA "1000/FD, 100/HD" }, 662 { 0x25, AA "1000/FD, 100/HD, 10/HD" }, 663 { 0x26, AA "1000/FD, 100/HD, 10/FD" }, 664 { 0x27, AA "1000/FD, 100/HD, 10/FD, 10/HD" }, 665 { 0x28, AA "1000/FD, 100/FD" }, 666 { 0x29, AA "1000/FD, 100/FD, 10/HD" }, 667 { 0x2a, AA "1000/FD, 100/FD, 10/FD" }, 668 { 0x2b, AA "1000/FD, 100/FD, 10/FD, 10/HD" }, 669 { 0x2c, AA "1000/FD, 100/FD, 100/HD" }, 670 { 0x2d, AA "1000/FD, 100/FD, 100/HD, 10/HD" }, 671 { 0x2e, AA "1000/FD, 100/FD, 100/HD, 10/FD" }, 672 { 0x2f, AA "1000/FD, 100/FD, 100/HD, 10/FD, 10/HD" }}; 673 674 struct e1000_option opt = { 675 .type = list_option, 676 .name = "AutoNeg", 677 .err = "parameter ignored", 678 .def = AUTONEG_ADV_DEFAULT, 679 .arg = { .l = { .nr = ARRAY_SIZE(an_list), 680 .p = an_list }} 681 }; 682 683 if (num_AutoNeg > bd) { 684 an = AutoNeg[bd]; 685 e1000_validate_option(&an, &opt, adapter); 686 } else { 687 an = opt.def; 688 } 689 adapter->hw.autoneg_advertised = an; 690 } 691 692 switch (speed + dplx) { 693 case 0: 694 adapter->hw.autoneg = adapter->fc_autoneg = 1; 695 if ((num_Speed > bd) && (speed != 0 || dplx != 0)) 696 DPRINTK(PROBE, INFO, 697 "Speed and duplex autonegotiation enabled\n"); 698 break; 699 case HALF_DUPLEX: 700 DPRINTK(PROBE, INFO, "Half Duplex specified without Speed\n"); 701 DPRINTK(PROBE, INFO, "Using Autonegotiation at " 702 "Half Duplex only\n"); 703 adapter->hw.autoneg = adapter->fc_autoneg = 1; 704 adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | 705 ADVERTISE_100_HALF; 706 break; 707 case FULL_DUPLEX: 708 DPRINTK(PROBE, INFO, "Full Duplex specified without Speed\n"); 709 DPRINTK(PROBE, INFO, "Using Autonegotiation at " 710 "Full Duplex only\n"); 711 adapter->hw.autoneg = adapter->fc_autoneg = 1; 712 adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | 713 ADVERTISE_100_FULL | 714 ADVERTISE_1000_FULL; 715 break; 716 case SPEED_10: 717 DPRINTK(PROBE, INFO, "10 Mbps Speed specified " 718 "without Duplex\n"); 719 DPRINTK(PROBE, INFO, "Using Autonegotiation at 10 Mbps only\n"); 720 adapter->hw.autoneg = adapter->fc_autoneg = 1; 721 adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | 722 ADVERTISE_10_FULL; 723 break; 724 case SPEED_10 + HALF_DUPLEX: 725 DPRINTK(PROBE, INFO, "Forcing to 10 Mbps Half Duplex\n"); 726 adapter->hw.autoneg = adapter->fc_autoneg = 0; 727 adapter->hw.forced_speed_duplex = e1000_10_half; 728 adapter->hw.autoneg_advertised = 0; 729 break; 730 case SPEED_10 + FULL_DUPLEX: 731 DPRINTK(PROBE, INFO, "Forcing to 10 Mbps Full Duplex\n"); 732 adapter->hw.autoneg = adapter->fc_autoneg = 0; 733 adapter->hw.forced_speed_duplex = e1000_10_full; 734 adapter->hw.autoneg_advertised = 0; 735 break; 736 case SPEED_100: 737 DPRINTK(PROBE, INFO, "100 Mbps Speed specified " 738 "without Duplex\n"); 739 DPRINTK(PROBE, INFO, "Using Autonegotiation at " 740 "100 Mbps only\n"); 741 adapter->hw.autoneg = adapter->fc_autoneg = 1; 742 adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | 743 ADVERTISE_100_FULL; 744 break; 745 case SPEED_100 + HALF_DUPLEX: 746 DPRINTK(PROBE, INFO, "Forcing to 100 Mbps Half Duplex\n"); 747 adapter->hw.autoneg = adapter->fc_autoneg = 0; 748 adapter->hw.forced_speed_duplex = e1000_100_half; 749 adapter->hw.autoneg_advertised = 0; 750 break; 751 case SPEED_100 + FULL_DUPLEX: 752 DPRINTK(PROBE, INFO, "Forcing to 100 Mbps Full Duplex\n"); 753 adapter->hw.autoneg = adapter->fc_autoneg = 0; 754 adapter->hw.forced_speed_duplex = e1000_100_full; 755 adapter->hw.autoneg_advertised = 0; 756 break; 757 case SPEED_1000: 758 DPRINTK(PROBE, INFO, "1000 Mbps Speed specified without " 759 "Duplex\n"); 760 goto full_duplex_only; 761 case SPEED_1000 + HALF_DUPLEX: 762 DPRINTK(PROBE, INFO, 763 "Half Duplex is not supported at 1000 Mbps\n"); 764 /* fall through */ 765 case SPEED_1000 + FULL_DUPLEX: 766full_duplex_only: 767 DPRINTK(PROBE, INFO, 768 "Using Autonegotiation at 1000 Mbps Full Duplex only\n"); 769 adapter->hw.autoneg = adapter->fc_autoneg = 1; 770 adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; 771 break; 772 default: 773 BUG(); 774 } 775 776 /* Speed, AutoNeg and MDI/MDI-X must all play nice */ 777 if (e1000_validate_mdi_setting(&(adapter->hw)) < 0) { 778 DPRINTK(PROBE, INFO, 779 "Speed, AutoNeg and MDI-X specifications are " 780 "incompatible. Setting MDI-X to a compatible value.\n"); 781 } 782} 783