diff options
| -rw-r--r-- | drivers/net/e1000/e1000_param.c | 167 |
1 files changed, 61 insertions, 106 deletions
diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c index a8d9295b0779..bd6c040b3cfb 100644 --- a/drivers/net/e1000/e1000_param.c +++ b/drivers/net/e1000/e1000_param.c | |||
| @@ -45,6 +45,16 @@ | |||
| 45 | */ | 45 | */ |
| 46 | 46 | ||
| 47 | #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } | 47 | #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } |
| 48 | /* Module Parameters are always initialized to -1, so that the driver | ||
| 49 | * can tell the difference between no user specified value or the | ||
| 50 | * user asking for the default value. | ||
| 51 | * The true default values are loaded in when e1000_check_options is called. | ||
| 52 | * | ||
| 53 | * This is a GCC extension to ANSI C. | ||
| 54 | * See the item "Labeled Elements in Initializers" in the section | ||
| 55 | * "Extensions to the C Language Family" of the GCC documentation. | ||
| 56 | */ | ||
| 57 | |||
| 48 | #define E1000_PARAM(X, desc) \ | 58 | #define E1000_PARAM(X, desc) \ |
| 49 | static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ | 59 | static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ |
| 50 | static int num_##X = 0; \ | 60 | static int num_##X = 0; \ |
| @@ -305,6 +315,7 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 305 | DPRINTK(PROBE, NOTICE, | 315 | DPRINTK(PROBE, NOTICE, |
| 306 | "Warning: no configuration for board #%i\n", bd); | 316 | "Warning: no configuration for board #%i\n", bd); |
| 307 | DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); | 317 | DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); |
| 318 | bd = E1000_MAX_NIC; | ||
| 308 | } | 319 | } |
| 309 | 320 | ||
| 310 | { /* Transmit Descriptor Count */ | 321 | { /* Transmit Descriptor Count */ |
| @@ -322,14 +333,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 322 | opt.arg.r.max = mac_type < e1000_82544 ? | 333 | opt.arg.r.max = mac_type < e1000_82544 ? |
| 323 | E1000_MAX_TXD : E1000_MAX_82544_TXD; | 334 | E1000_MAX_TXD : E1000_MAX_82544_TXD; |
| 324 | 335 | ||
| 325 | if (num_TxDescriptors > bd) { | 336 | tx_ring->count = TxDescriptors[bd]; |
| 326 | tx_ring->count = TxDescriptors[bd]; | 337 | e1000_validate_option(&tx_ring->count, &opt, adapter); |
| 327 | e1000_validate_option(&tx_ring->count, &opt, adapter); | 338 | E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE); |
| 328 | E1000_ROUNDUP(tx_ring->count, | ||
| 329 | REQ_TX_DESCRIPTOR_MULTIPLE); | ||
| 330 | } else { | ||
| 331 | tx_ring->count = opt.def; | ||
| 332 | } | ||
| 333 | for (i = 0; i < adapter->num_tx_queues; i++) | 339 | for (i = 0; i < adapter->num_tx_queues; i++) |
| 334 | tx_ring[i].count = tx_ring->count; | 340 | tx_ring[i].count = tx_ring->count; |
| 335 | } | 341 | } |
| @@ -348,14 +354,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 348 | opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : | 354 | opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : |
| 349 | E1000_MAX_82544_RXD; | 355 | E1000_MAX_82544_RXD; |
| 350 | 356 | ||
| 351 | if (num_RxDescriptors > bd) { | 357 | rx_ring->count = RxDescriptors[bd]; |
| 352 | rx_ring->count = RxDescriptors[bd]; | 358 | e1000_validate_option(&rx_ring->count, &opt, adapter); |
| 353 | e1000_validate_option(&rx_ring->count, &opt, adapter); | 359 | E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE); |
| 354 | E1000_ROUNDUP(rx_ring->count, | ||
| 355 | REQ_RX_DESCRIPTOR_MULTIPLE); | ||
| 356 | } else { | ||
| 357 | rx_ring->count = opt.def; | ||
| 358 | } | ||
| 359 | for (i = 0; i < adapter->num_rx_queues; i++) | 360 | for (i = 0; i < adapter->num_rx_queues; i++) |
| 360 | rx_ring[i].count = rx_ring->count; | 361 | rx_ring[i].count = rx_ring->count; |
| 361 | } | 362 | } |
| @@ -367,13 +368,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 367 | .def = OPTION_ENABLED | 368 | .def = OPTION_ENABLED |
| 368 | }; | 369 | }; |
| 369 | 370 | ||
| 370 | if (num_XsumRX > bd) { | 371 | int rx_csum = XsumRX[bd]; |
| 371 | int rx_csum = XsumRX[bd]; | 372 | e1000_validate_option(&rx_csum, &opt, adapter); |
| 372 | e1000_validate_option(&rx_csum, &opt, adapter); | 373 | adapter->rx_csum = rx_csum; |
| 373 | adapter->rx_csum = rx_csum; | ||
| 374 | } else { | ||
| 375 | adapter->rx_csum = opt.def; | ||
| 376 | } | ||
| 377 | } | 374 | } |
| 378 | { /* Flow Control */ | 375 | { /* Flow Control */ |
| 379 | 376 | ||
| @@ -393,13 +390,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 393 | .p = fc_list }} | 390 | .p = fc_list }} |
| 394 | }; | 391 | }; |
| 395 | 392 | ||
| 396 | if (num_FlowControl > bd) { | 393 | int fc = FlowControl[bd]; |
| 397 | int fc = FlowControl[bd]; | 394 | e1000_validate_option(&fc, &opt, adapter); |
| 398 | e1000_validate_option(&fc, &opt, adapter); | 395 | adapter->hw.fc = adapter->hw.original_fc = fc; |
| 399 | adapter->hw.fc = adapter->hw.original_fc = fc; | ||
| 400 | } else { | ||
| 401 | adapter->hw.fc = adapter->hw.original_fc = opt.def; | ||
| 402 | } | ||
| 403 | } | 396 | } |
| 404 | { /* Transmit Interrupt Delay */ | 397 | { /* Transmit Interrupt Delay */ |
| 405 | struct e1000_option opt = { | 398 | struct e1000_option opt = { |
| @@ -411,13 +404,8 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 411 | .max = MAX_TXDELAY }} | 404 | .max = MAX_TXDELAY }} |
| 412 | }; | 405 | }; |
| 413 | 406 | ||
| 414 | if (num_TxIntDelay > bd) { | 407 | adapter->tx_int_delay = TxIntDelay[bd]; |
| 415 | adapter->tx_int_delay = TxIntDelay[bd]; | 408 | e1000_validate_option(&adapter->tx_int_delay, &opt, adapter); |
| 416 | e1000_validate_option(&adapter->tx_int_delay, &opt, | ||
| 417 | adapter); | ||
| 418 | } else { | ||
| 419 | adapter->tx_int_delay = opt.def; | ||
| 420 | } | ||
| 421 | } | 409 | } |
| 422 | { /* Transmit Absolute Interrupt Delay */ | 410 | { /* Transmit Absolute Interrupt Delay */ |
| 423 | struct e1000_option opt = { | 411 | struct e1000_option opt = { |
| @@ -429,13 +417,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 429 | .max = MAX_TXABSDELAY }} | 417 | .max = MAX_TXABSDELAY }} |
| 430 | }; | 418 | }; |
| 431 | 419 | ||
| 432 | if (num_TxAbsIntDelay > bd) { | 420 | adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; |
| 433 | adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; | 421 | e1000_validate_option(&adapter->tx_abs_int_delay, &opt, |
| 434 | e1000_validate_option(&adapter->tx_abs_int_delay, &opt, | 422 | adapter); |
| 435 | adapter); | ||
| 436 | } else { | ||
| 437 | adapter->tx_abs_int_delay = opt.def; | ||
| 438 | } | ||
| 439 | } | 423 | } |
| 440 | { /* Receive Interrupt Delay */ | 424 | { /* Receive Interrupt Delay */ |
| 441 | struct e1000_option opt = { | 425 | struct e1000_option opt = { |
| @@ -447,13 +431,8 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 447 | .max = MAX_RXDELAY }} | 431 | .max = MAX_RXDELAY }} |
| 448 | }; | 432 | }; |
| 449 | 433 | ||
| 450 | if (num_RxIntDelay > bd) { | 434 | adapter->rx_int_delay = RxIntDelay[bd]; |
| 451 | adapter->rx_int_delay = RxIntDelay[bd]; | 435 | e1000_validate_option(&adapter->rx_int_delay, &opt, adapter); |
| 452 | e1000_validate_option(&adapter->rx_int_delay, &opt, | ||
| 453 | adapter); | ||
| 454 | } else { | ||
| 455 | adapter->rx_int_delay = opt.def; | ||
| 456 | } | ||
| 457 | } | 436 | } |
| 458 | { /* Receive Absolute Interrupt Delay */ | 437 | { /* Receive Absolute Interrupt Delay */ |
| 459 | struct e1000_option opt = { | 438 | struct e1000_option opt = { |
| @@ -465,13 +444,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 465 | .max = MAX_RXABSDELAY }} | 444 | .max = MAX_RXABSDELAY }} |
| 466 | }; | 445 | }; |
| 467 | 446 | ||
| 468 | if (num_RxAbsIntDelay > bd) { | 447 | adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; |
| 469 | adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; | 448 | e1000_validate_option(&adapter->rx_abs_int_delay, &opt, |
| 470 | e1000_validate_option(&adapter->rx_abs_int_delay, &opt, | 449 | adapter); |
| 471 | adapter); | ||
| 472 | } else { | ||
| 473 | adapter->rx_abs_int_delay = opt.def; | ||
| 474 | } | ||
| 475 | } | 450 | } |
| 476 | { /* Interrupt Throttling Rate */ | 451 | { /* Interrupt Throttling Rate */ |
| 477 | struct e1000_option opt = { | 452 | struct e1000_option opt = { |
| @@ -483,24 +458,18 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 483 | .max = MAX_ITR }} | 458 | .max = MAX_ITR }} |
| 484 | }; | 459 | }; |
| 485 | 460 | ||
| 486 | if (num_InterruptThrottleRate > bd) { | 461 | adapter->itr = InterruptThrottleRate[bd]; |
| 487 | adapter->itr = InterruptThrottleRate[bd]; | 462 | switch (adapter->itr) { |
| 488 | switch (adapter->itr) { | 463 | case 0: |
| 489 | case 0: | 464 | DPRINTK(PROBE, INFO, "%s turned off\n", opt.name); |
| 490 | DPRINTK(PROBE, INFO, "%s turned off\n", | 465 | break; |
| 491 | opt.name); | 466 | case 1: |
| 492 | break; | 467 | DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", |
| 493 | case 1: | 468 | opt.name); |
| 494 | DPRINTK(PROBE, INFO, "%s set to dynamic mode\n", | 469 | break; |
| 495 | opt.name); | 470 | default: |
| 496 | break; | 471 | e1000_validate_option(&adapter->itr, &opt, adapter); |
| 497 | default: | 472 | break; |
| 498 | e1000_validate_option(&adapter->itr, &opt, | ||
| 499 | adapter); | ||
| 500 | break; | ||
| 501 | } | ||
| 502 | } else { | ||
| 503 | adapter->itr = opt.def; | ||
| 504 | } | 473 | } |
| 505 | } | 474 | } |
| 506 | { /* Smart Power Down */ | 475 | { /* Smart Power Down */ |
| @@ -511,13 +480,9 @@ e1000_check_options(struct e1000_adapter *adapter) | |||
| 511 | .def = OPTION_DISABLED | 480 | .def = OPTION_DISABLED |
| 512 | }; | 481 | }; |
| 513 | 482 | ||
| 514 | if (num_SmartPowerDownEnable > bd) { | 483 | int spd = SmartPowerDownEnable[bd]; |
| 515 | int spd = SmartPowerDownEnable[bd]; | 484 | e1000_validate_option(&spd, &opt, adapter); |
| 516 | e1000_validate_option(&spd, &opt, adapter); | 485 | adapter->smart_power_down = spd; |
| 517 | adapter->smart_power_down = spd; | ||
| 518 | } else { | ||
| 519 | adapter->smart_power_down = opt.def; | ||
| 520 | } | ||
| 521 | } | 486 | } |
| 522 | 487 | ||
| 523 | switch (adapter->hw.media_type) { | 488 | switch (adapter->hw.media_type) { |
| @@ -544,17 +509,18 @@ static void __devinit | |||
| 544 | e1000_check_fiber_options(struct e1000_adapter *adapter) | 509 | e1000_check_fiber_options(struct e1000_adapter *adapter) |
| 545 | { | 510 | { |
| 546 | int bd = adapter->bd_number; | 511 | int bd = adapter->bd_number; |
| 547 | if (num_Speed > bd) { | 512 | bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; |
| 513 | if ((Speed[bd] != OPTION_UNSET)) { | ||
| 548 | DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " | 514 | DPRINTK(PROBE, INFO, "Speed not valid for fiber adapters, " |
| 549 | "parameter ignored\n"); | 515 | "parameter ignored\n"); |
| 550 | } | 516 | } |
| 551 | 517 | ||
| 552 | if (num_Duplex > bd) { | 518 | if ((Duplex[bd] != OPTION_UNSET)) { |
| 553 | DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " | 519 | DPRINTK(PROBE, INFO, "Duplex not valid for fiber adapters, " |
| 554 | "parameter ignored\n"); | 520 | "parameter ignored\n"); |
| 555 | } | 521 | } |
| 556 | 522 | ||
| 557 | if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { | 523 | if ((AutoNeg[bd] != OPTION_UNSET) && (AutoNeg[bd] != 0x20)) { |
| 558 | DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " | 524 | DPRINTK(PROBE, INFO, "AutoNeg other than 1000/Full is " |
| 559 | "not valid for fiber adapters, " | 525 | "not valid for fiber adapters, " |
| 560 | "parameter ignored\n"); | 526 | "parameter ignored\n"); |
| @@ -573,6 +539,7 @@ e1000_check_copper_options(struct e1000_adapter *adapter) | |||
| 573 | { | 539 | { |
| 574 | int speed, dplx, an; | 540 | int speed, dplx, an; |
| 575 | int bd = adapter->bd_number; | 541 | int bd = adapter->bd_number; |
| 542 | bd = bd > E1000_MAX_NIC ? E1000_MAX_NIC : bd; | ||
| 576 | 543 | ||
| 577 | { /* Speed */ | 544 | { /* Speed */ |
| 578 | struct e1000_opt_list speed_list[] = {{ 0, "" }, | 545 | struct e1000_opt_list speed_list[] = {{ 0, "" }, |
| @@ -589,12 +556,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter) | |||
| 589 | .p = speed_list }} | 556 | .p = speed_list }} |
| 590 | }; | 557 | }; |
| 591 | 558 | ||
| 592 | if (num_Speed > bd) { | 559 | speed = Speed[bd]; |
| 593 | speed = Speed[bd]; | 560 | e1000_validate_option(&speed, &opt, adapter); |
| 594 | e1000_validate_option(&speed, &opt, adapter); | ||
| 595 | } else { | ||
| 596 | speed = opt.def; | ||
| 597 | } | ||
| 598 | } | 561 | } |
| 599 | { /* Duplex */ | 562 | { /* Duplex */ |
| 600 | struct e1000_opt_list dplx_list[] = {{ 0, "" }, | 563 | struct e1000_opt_list dplx_list[] = {{ 0, "" }, |
| @@ -616,15 +579,11 @@ e1000_check_copper_options(struct e1000_adapter *adapter) | |||
| 616 | "Speed/Duplex/AutoNeg parameter ignored.\n"); | 579 | "Speed/Duplex/AutoNeg parameter ignored.\n"); |
| 617 | return; | 580 | return; |
| 618 | } | 581 | } |
| 619 | if (num_Duplex > bd) { | 582 | dplx = Duplex[bd]; |
| 620 | dplx = Duplex[bd]; | 583 | e1000_validate_option(&dplx, &opt, adapter); |
| 621 | e1000_validate_option(&dplx, &opt, adapter); | ||
| 622 | } else { | ||
| 623 | dplx = opt.def; | ||
| 624 | } | ||
| 625 | } | 584 | } |
| 626 | 585 | ||
| 627 | if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { | 586 | if (AutoNeg[bd] != OPTION_UNSET && (speed != 0 || dplx != 0)) { |
| 628 | DPRINTK(PROBE, INFO, | 587 | DPRINTK(PROBE, INFO, |
| 629 | "AutoNeg specified along with Speed or Duplex, " | 588 | "AutoNeg specified along with Speed or Duplex, " |
| 630 | "parameter ignored\n"); | 589 | "parameter ignored\n"); |
| @@ -673,19 +632,15 @@ e1000_check_copper_options(struct e1000_adapter *adapter) | |||
| 673 | .p = an_list }} | 632 | .p = an_list }} |
| 674 | }; | 633 | }; |
| 675 | 634 | ||
| 676 | if (num_AutoNeg > bd) { | 635 | an = AutoNeg[bd]; |
| 677 | an = AutoNeg[bd]; | 636 | e1000_validate_option(&an, &opt, adapter); |
| 678 | e1000_validate_option(&an, &opt, adapter); | ||
| 679 | } else { | ||
| 680 | an = opt.def; | ||
| 681 | } | ||
| 682 | adapter->hw.autoneg_advertised = an; | 637 | adapter->hw.autoneg_advertised = an; |
| 683 | } | 638 | } |
| 684 | 639 | ||
| 685 | switch (speed + dplx) { | 640 | switch (speed + dplx) { |
| 686 | case 0: | 641 | case 0: |
| 687 | adapter->hw.autoneg = adapter->fc_autoneg = 1; | 642 | adapter->hw.autoneg = adapter->fc_autoneg = 1; |
| 688 | if ((num_Speed > bd) && (speed != 0 || dplx != 0)) | 643 | if (Speed[bd] != OPTION_UNSET || Duplex[bd] != OPTION_UNSET) |
| 689 | DPRINTK(PROBE, INFO, | 644 | DPRINTK(PROBE, INFO, |
| 690 | "Speed and duplex autonegotiation enabled\n"); | 645 | "Speed and duplex autonegotiation enabled\n"); |
| 691 | break; | 646 | break; |
