diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_82599.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_82599.c | 119 |
1 files changed, 82 insertions, 37 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index 1f30e163bd9c..38c384031c4c 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
@@ -39,6 +39,9 @@ | |||
39 | #define IXGBE_82599_MC_TBL_SIZE 128 | 39 | #define IXGBE_82599_MC_TBL_SIZE 128 |
40 | #define IXGBE_82599_VFT_TBL_SIZE 128 | 40 | #define IXGBE_82599_VFT_TBL_SIZE 128 |
41 | 41 | ||
42 | void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); | ||
43 | void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); | ||
44 | void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); | ||
42 | s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | 45 | s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, |
43 | ixgbe_link_speed speed, | 46 | ixgbe_link_speed speed, |
44 | bool autoneg, | 47 | bool autoneg, |
@@ -68,7 +71,15 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) | |||
68 | if (hw->phy.multispeed_fiber) { | 71 | if (hw->phy.multispeed_fiber) { |
69 | /* Set up dual speed SFP+ support */ | 72 | /* Set up dual speed SFP+ support */ |
70 | mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; | 73 | mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; |
74 | mac->ops.disable_tx_laser = | ||
75 | &ixgbe_disable_tx_laser_multispeed_fiber; | ||
76 | mac->ops.enable_tx_laser = | ||
77 | &ixgbe_enable_tx_laser_multispeed_fiber; | ||
78 | mac->ops.flap_tx_laser = &ixgbe_flap_tx_laser_multispeed_fiber; | ||
71 | } else { | 79 | } else { |
80 | mac->ops.disable_tx_laser = NULL; | ||
81 | mac->ops.enable_tx_laser = NULL; | ||
82 | mac->ops.flap_tx_laser = NULL; | ||
72 | if ((mac->ops.get_media_type(hw) == | 83 | if ((mac->ops.get_media_type(hw) == |
73 | ixgbe_media_type_backplane) && | 84 | ixgbe_media_type_backplane) && |
74 | (hw->phy.smart_speed == ixgbe_smart_speed_auto || | 85 | (hw->phy.smart_speed == ixgbe_smart_speed_auto || |
@@ -412,6 +423,67 @@ s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, | |||
412 | return status; | 423 | return status; |
413 | } | 424 | } |
414 | 425 | ||
426 | /** | ||
427 | * ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser | ||
428 | * @hw: pointer to hardware structure | ||
429 | * | ||
430 | * The base drivers may require better control over SFP+ module | ||
431 | * PHY states. This includes selectively shutting down the Tx | ||
432 | * laser on the PHY, effectively halting physical link. | ||
433 | **/ | ||
434 | void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) | ||
435 | { | ||
436 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); | ||
437 | |||
438 | /* Disable tx laser; allow 100us to go dark per spec */ | ||
439 | esdp_reg |= IXGBE_ESDP_SDP3; | ||
440 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
441 | IXGBE_WRITE_FLUSH(hw); | ||
442 | udelay(100); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * ixgbe_enable_tx_laser_multispeed_fiber - Enable Tx laser | ||
447 | * @hw: pointer to hardware structure | ||
448 | * | ||
449 | * The base drivers may require better control over SFP+ module | ||
450 | * PHY states. This includes selectively turning on the Tx | ||
451 | * laser on the PHY, effectively starting physical link. | ||
452 | **/ | ||
453 | void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) | ||
454 | { | ||
455 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); | ||
456 | |||
457 | /* Enable tx laser; allow 100ms to light up */ | ||
458 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
459 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
460 | IXGBE_WRITE_FLUSH(hw); | ||
461 | msleep(100); | ||
462 | } | ||
463 | |||
464 | /** | ||
465 | * ixgbe_flap_tx_laser_multispeed_fiber - Flap Tx laser | ||
466 | * @hw: pointer to hardware structure | ||
467 | * | ||
468 | * When the driver changes the link speeds that it can support, | ||
469 | * it sets autotry_restart to true to indicate that we need to | ||
470 | * initiate a new autotry session with the link partner. To do | ||
471 | * so, we set the speed then disable and re-enable the tx laser, to | ||
472 | * alert the link partner that it also needs to restart autotry on its | ||
473 | * end. This is consistent with true clause 37 autoneg, which also | ||
474 | * involves a loss of signal. | ||
475 | **/ | ||
476 | void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) | ||
477 | { | ||
478 | hw_dbg(hw, "ixgbe_flap_tx_laser_multispeed_fiber\n"); | ||
479 | |||
480 | if (hw->mac.autotry_restart) { | ||
481 | ixgbe_disable_tx_laser_multispeed_fiber(hw); | ||
482 | ixgbe_enable_tx_laser_multispeed_fiber(hw); | ||
483 | hw->mac.autotry_restart = false; | ||
484 | } | ||
485 | } | ||
486 | |||
415 | /** | 487 | /** |
416 | * ixgbe_setup_mac_link_multispeed_fiber - Set MAC link speed | 488 | * ixgbe_setup_mac_link_multispeed_fiber - Set MAC link speed |
417 | * @hw: pointer to hardware structure | 489 | * @hw: pointer to hardware structure |
@@ -440,16 +512,6 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
440 | speed &= phy_link_speed; | 512 | speed &= phy_link_speed; |
441 | 513 | ||
442 | /* | 514 | /* |
443 | * When the driver changes the link speeds that it can support, | ||
444 | * it sets autotry_restart to true to indicate that we need to | ||
445 | * initiate a new autotry session with the link partner. To do | ||
446 | * so, we set the speed then disable and re-enable the tx laser, to | ||
447 | * alert the link partner that it also needs to restart autotry on its | ||
448 | * end. This is consistent with true clause 37 autoneg, which also | ||
449 | * involves a loss of signal. | ||
450 | */ | ||
451 | |||
452 | /* | ||
453 | * Try each speed one by one, highest priority first. We do this in | 515 | * Try each speed one by one, highest priority first. We do this in |
454 | * software because 10gb fiber doesn't support speed autonegotiation. | 516 | * software because 10gb fiber doesn't support speed autonegotiation. |
455 | */ | 517 | */ |
@@ -466,6 +528,7 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
466 | /* Set the module link speed */ | 528 | /* Set the module link speed */ |
467 | esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5); | 529 | esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5); |
468 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | 530 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); |
531 | IXGBE_WRITE_FLUSH(hw); | ||
469 | 532 | ||
470 | /* Allow module to change analog characteristics (1G->10G) */ | 533 | /* Allow module to change analog characteristics (1G->10G) */ |
471 | msleep(40); | 534 | msleep(40); |
@@ -478,19 +541,7 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
478 | return status; | 541 | return status; |
479 | 542 | ||
480 | /* Flap the tx laser if it has not already been done */ | 543 | /* Flap the tx laser if it has not already been done */ |
481 | if (hw->mac.autotry_restart) { | 544 | hw->mac.ops.flap_tx_laser(hw); |
482 | /* Disable tx laser; allow 100us to go dark per spec */ | ||
483 | esdp_reg |= IXGBE_ESDP_SDP3; | ||
484 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
485 | udelay(100); | ||
486 | |||
487 | /* Enable tx laser; allow 2ms to light up per spec */ | ||
488 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
489 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
490 | msleep(2); | ||
491 | |||
492 | hw->mac.autotry_restart = false; | ||
493 | } | ||
494 | 545 | ||
495 | /* | 546 | /* |
496 | * Wait for the controller to acquire link. Per IEEE 802.3ap, | 547 | * Wait for the controller to acquire link. Per IEEE 802.3ap, |
@@ -525,6 +576,7 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
525 | esdp_reg &= ~IXGBE_ESDP_SDP5; | 576 | esdp_reg &= ~IXGBE_ESDP_SDP5; |
526 | esdp_reg |= IXGBE_ESDP_SDP5_DIR; | 577 | esdp_reg |= IXGBE_ESDP_SDP5_DIR; |
527 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | 578 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); |
579 | IXGBE_WRITE_FLUSH(hw); | ||
528 | 580 | ||
529 | /* Allow module to change analog characteristics (10G->1G) */ | 581 | /* Allow module to change analog characteristics (10G->1G) */ |
530 | msleep(40); | 582 | msleep(40); |
@@ -537,19 +589,7 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
537 | return status; | 589 | return status; |
538 | 590 | ||
539 | /* Flap the tx laser if it has not already been done */ | 591 | /* Flap the tx laser if it has not already been done */ |
540 | if (hw->mac.autotry_restart) { | 592 | hw->mac.ops.flap_tx_laser(hw); |
541 | /* Disable tx laser; allow 100us to go dark per spec */ | ||
542 | esdp_reg |= IXGBE_ESDP_SDP3; | ||
543 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
544 | udelay(100); | ||
545 | |||
546 | /* Enable tx laser; allow 2ms to light up per spec */ | ||
547 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
548 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
549 | msleep(2); | ||
550 | |||
551 | hw->mac.autotry_restart = false; | ||
552 | } | ||
553 | 593 | ||
554 | /* Wait for the link partner to also set speed */ | 594 | /* Wait for the link partner to also set speed */ |
555 | msleep(100); | 595 | msleep(100); |
@@ -602,6 +642,7 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, | |||
602 | s32 i, j; | 642 | s32 i, j; |
603 | bool link_up = false; | 643 | bool link_up = false; |
604 | u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); | 644 | u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); |
645 | struct ixgbe_adapter *adapter = hw->back; | ||
605 | 646 | ||
606 | hw_dbg(hw, "ixgbe_setup_mac_link_smartspeed.\n"); | 647 | hw_dbg(hw, "ixgbe_setup_mac_link_smartspeed.\n"); |
607 | 648 | ||
@@ -686,6 +727,10 @@ static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, | |||
686 | autoneg_wait_to_complete); | 727 | autoneg_wait_to_complete); |
687 | 728 | ||
688 | out: | 729 | out: |
730 | if (link_up && (link_speed == IXGBE_LINK_SPEED_1GB_FULL)) | ||
731 | netif_info(adapter, hw, adapter->netdev, "Smartspeed has" | ||
732 | " downgraded the link speed from the maximum" | ||
733 | " advertised\n"); | ||
689 | return status; | 734 | return status; |
690 | } | 735 | } |
691 | 736 | ||
@@ -1263,7 +1308,7 @@ s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw) | |||
1263 | } | 1308 | } |
1264 | if (i >= IXGBE_FDIRCMD_CMD_POLL) { | 1309 | if (i >= IXGBE_FDIRCMD_CMD_POLL) { |
1265 | hw_dbg(hw ,"Flow Director previous command isn't complete, " | 1310 | hw_dbg(hw ,"Flow Director previous command isn't complete, " |
1266 | "aborting table re-initialization. \n"); | 1311 | "aborting table re-initialization.\n"); |
1267 | return IXGBE_ERR_FDIR_REINIT_FAILED; | 1312 | return IXGBE_ERR_FDIR_REINIT_FAILED; |
1268 | } | 1313 | } |
1269 | 1314 | ||