diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_82599.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_82599.c | 127 |
1 files changed, 124 insertions, 3 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index ecb753b33d26..ae27c41222e3 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
@@ -42,6 +42,10 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
42 | ixgbe_link_speed speed, | 42 | ixgbe_link_speed speed, |
43 | bool autoneg, | 43 | bool autoneg, |
44 | bool autoneg_wait_to_complete); | 44 | bool autoneg_wait_to_complete); |
45 | static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, | ||
46 | ixgbe_link_speed speed, | ||
47 | bool autoneg, | ||
48 | bool autoneg_wait_to_complete); | ||
45 | s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, | 49 | s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, |
46 | bool autoneg_wait_to_complete); | 50 | bool autoneg_wait_to_complete); |
47 | s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, | 51 | s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, |
@@ -64,7 +68,13 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) | |||
64 | /* Set up dual speed SFP+ support */ | 68 | /* Set up dual speed SFP+ support */ |
65 | mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; | 69 | mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; |
66 | } else { | 70 | } else { |
67 | mac->ops.setup_link = &ixgbe_setup_mac_link_82599; | 71 | if ((mac->ops.get_media_type(hw) == |
72 | ixgbe_media_type_backplane) && | ||
73 | (hw->phy.smart_speed == ixgbe_smart_speed_auto || | ||
74 | hw->phy.smart_speed == ixgbe_smart_speed_on)) | ||
75 | mac->ops.setup_link = &ixgbe_setup_mac_link_smartspeed; | ||
76 | else | ||
77 | mac->ops.setup_link = &ixgbe_setup_mac_link_82599; | ||
68 | } | 78 | } |
69 | } | 79 | } |
70 | 80 | ||
@@ -480,7 +490,12 @@ s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | |||
480 | hw->mac.autotry_restart = false; | 490 | hw->mac.autotry_restart = false; |
481 | } | 491 | } |
482 | 492 | ||
483 | /* The controller may take up to 500ms at 10g to acquire link */ | 493 | /* |
494 | * Wait for the controller to acquire link. Per IEEE 802.3ap, | ||
495 | * Section 73.10.2, we may have to wait up to 500ms if KR is | ||
496 | * attempted. 82599 uses the same timing for 10g SFI. | ||
497 | */ | ||
498 | |||
484 | for (i = 0; i < 5; i++) { | 499 | for (i = 0; i < 5; i++) { |
485 | /* Wait for the link partner to also set speed */ | 500 | /* Wait for the link partner to also set speed */ |
486 | msleep(100); | 501 | msleep(100); |
@@ -568,6 +583,111 @@ out: | |||
568 | } | 583 | } |
569 | 584 | ||
570 | /** | 585 | /** |
586 | * ixgbe_setup_mac_link_smartspeed - Set MAC link speed using SmartSpeed | ||
587 | * @hw: pointer to hardware structure | ||
588 | * @speed: new link speed | ||
589 | * @autoneg: true if autonegotiation enabled | ||
590 | * @autoneg_wait_to_complete: true when waiting for completion is needed | ||
591 | * | ||
592 | * Implements the Intel SmartSpeed algorithm. | ||
593 | **/ | ||
594 | static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw, | ||
595 | ixgbe_link_speed speed, bool autoneg, | ||
596 | bool autoneg_wait_to_complete) | ||
597 | { | ||
598 | s32 status = 0; | ||
599 | ixgbe_link_speed link_speed; | ||
600 | s32 i, j; | ||
601 | bool link_up = false; | ||
602 | u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC); | ||
603 | |||
604 | hw_dbg(hw, "ixgbe_setup_mac_link_smartspeed.\n"); | ||
605 | |||
606 | /* Set autoneg_advertised value based on input link speed */ | ||
607 | hw->phy.autoneg_advertised = 0; | ||
608 | |||
609 | if (speed & IXGBE_LINK_SPEED_10GB_FULL) | ||
610 | hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL; | ||
611 | |||
612 | if (speed & IXGBE_LINK_SPEED_1GB_FULL) | ||
613 | hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL; | ||
614 | |||
615 | if (speed & IXGBE_LINK_SPEED_100_FULL) | ||
616 | hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL; | ||
617 | |||
618 | /* | ||
619 | * Implement Intel SmartSpeed algorithm. SmartSpeed will reduce the | ||
620 | * autoneg advertisement if link is unable to be established at the | ||
621 | * highest negotiated rate. This can sometimes happen due to integrity | ||
622 | * issues with the physical media connection. | ||
623 | */ | ||
624 | |||
625 | /* First, try to get link with full advertisement */ | ||
626 | hw->phy.smart_speed_active = false; | ||
627 | for (j = 0; j < IXGBE_SMARTSPEED_MAX_RETRIES; j++) { | ||
628 | status = ixgbe_setup_mac_link_82599(hw, speed, autoneg, | ||
629 | autoneg_wait_to_complete); | ||
630 | if (status) | ||
631 | goto out; | ||
632 | |||
633 | /* | ||
634 | * Wait for the controller to acquire link. Per IEEE 802.3ap, | ||
635 | * Section 73.10.2, we may have to wait up to 500ms if KR is | ||
636 | * attempted, or 200ms if KX/KX4/BX/BX4 is attempted, per | ||
637 | * Table 9 in the AN MAS. | ||
638 | */ | ||
639 | for (i = 0; i < 5; i++) { | ||
640 | mdelay(100); | ||
641 | |||
642 | /* If we have link, just jump out */ | ||
643 | hw->mac.ops.check_link(hw, &link_speed, | ||
644 | &link_up, false); | ||
645 | if (link_up) | ||
646 | goto out; | ||
647 | } | ||
648 | } | ||
649 | |||
650 | /* | ||
651 | * We didn't get link. If we advertised KR plus one of KX4/KX | ||
652 | * (or BX4/BX), then disable KR and try again. | ||
653 | */ | ||
654 | if (((autoc_reg & IXGBE_AUTOC_KR_SUPP) == 0) || | ||
655 | ((autoc_reg & IXGBE_AUTOC_KX4_KX_SUPP_MASK) == 0)) | ||
656 | goto out; | ||
657 | |||
658 | /* Turn SmartSpeed on to disable KR support */ | ||
659 | hw->phy.smart_speed_active = true; | ||
660 | status = ixgbe_setup_mac_link_82599(hw, speed, autoneg, | ||
661 | autoneg_wait_to_complete); | ||
662 | if (status) | ||
663 | goto out; | ||
664 | |||
665 | /* | ||
666 | * Wait for the controller to acquire link. 600ms will allow for | ||
667 | * the AN link_fail_inhibit_timer as well for multiple cycles of | ||
668 | * parallel detect, both 10g and 1g. This allows for the maximum | ||
669 | * connect attempts as defined in the AN MAS table 73-7. | ||
670 | */ | ||
671 | for (i = 0; i < 6; i++) { | ||
672 | mdelay(100); | ||
673 | |||
674 | /* If we have link, just jump out */ | ||
675 | hw->mac.ops.check_link(hw, &link_speed, | ||
676 | &link_up, false); | ||
677 | if (link_up) | ||
678 | goto out; | ||
679 | } | ||
680 | |||
681 | /* We didn't get link. Turn SmartSpeed back off. */ | ||
682 | hw->phy.smart_speed_active = false; | ||
683 | status = ixgbe_setup_mac_link_82599(hw, speed, autoneg, | ||
684 | autoneg_wait_to_complete); | ||
685 | |||
686 | out: | ||
687 | return status; | ||
688 | } | ||
689 | |||
690 | /** | ||
571 | * ixgbe_check_mac_link_82599 - Determine link and speed status | 691 | * ixgbe_check_mac_link_82599 - Determine link and speed status |
572 | * @hw: pointer to hardware structure | 692 | * @hw: pointer to hardware structure |
573 | * @speed: pointer to link speed | 693 | * @speed: pointer to link speed |
@@ -670,7 +790,8 @@ s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, | |||
670 | if (speed & IXGBE_LINK_SPEED_10GB_FULL) | 790 | if (speed & IXGBE_LINK_SPEED_10GB_FULL) |
671 | if (orig_autoc & IXGBE_AUTOC_KX4_SUPP) | 791 | if (orig_autoc & IXGBE_AUTOC_KX4_SUPP) |
672 | autoc |= IXGBE_AUTOC_KX4_SUPP; | 792 | autoc |= IXGBE_AUTOC_KX4_SUPP; |
673 | if (orig_autoc & IXGBE_AUTOC_KR_SUPP) | 793 | if ((orig_autoc & IXGBE_AUTOC_KR_SUPP) && |
794 | (hw->phy.smart_speed_active == false)) | ||
674 | autoc |= IXGBE_AUTOC_KR_SUPP; | 795 | autoc |= IXGBE_AUTOC_KR_SUPP; |
675 | if (speed & IXGBE_LINK_SPEED_1GB_FULL) | 796 | if (speed & IXGBE_LINK_SPEED_1GB_FULL) |
676 | autoc |= IXGBE_AUTOC_KX_SUPP; | 797 | autoc |= IXGBE_AUTOC_KX_SUPP; |