aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorDon Skidmore <donald.c.skidmore@intel.com>2009-10-08 11:36:22 -0400
committerDavid S. Miller <davem@davemloft.net>2009-10-09 01:57:18 -0400
commitcd7e1f0b056c071860db65c847a854b3093d6606 (patch)
tree86f82e74b21cb782c771640579e04d03357f1741 /drivers/net
parent38ad1c8e8c8debf73b28543a3250a01f799f78ef (diff)
ixgbe: Fix KR to KX fail over for Mezzanine cards
This patch allows the recently added backplane device IDs that support KR to fail over to KX during link setup. This is accomplished by the new MAC link setup function ixgbe_setup_mac_link_smartspeed(). Comments were also updated to better document the reason for the delays chosen for KX, KX4, BX, BX4 and KR connections. Signed-off-by: Don Skidmore <don.c.skidmore@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ixgbe/ixgbe_82599.c127
-rw-r--r--drivers/net/ixgbe/ixgbe_type.h10
2 files changed, 134 insertions, 3 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c
index ecb753b33d2..ae27c41222e 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);
45static s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
46 ixgbe_link_speed speed,
47 bool autoneg,
48 bool autoneg_wait_to_complete);
45s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, 49s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
46 bool autoneg_wait_to_complete); 50 bool autoneg_wait_to_complete);
47s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw, 51s32 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 **/
594static 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
686out:
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;
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h
index 42232b1605f..1cab53eb22f 100644
--- a/drivers/net/ixgbe/ixgbe_type.h
+++ b/drivers/net/ixgbe/ixgbe_type.h
@@ -2172,6 +2172,14 @@ enum ixgbe_fc_mode {
2172 ixgbe_fc_default 2172 ixgbe_fc_default
2173}; 2173};
2174 2174
2175/* Smart Speed Settings */
2176#define IXGBE_SMARTSPEED_MAX_RETRIES 3
2177enum ixgbe_smart_speed {
2178 ixgbe_smart_speed_auto = 0,
2179 ixgbe_smart_speed_on,
2180 ixgbe_smart_speed_off
2181};
2182
2175/* PCI bus types */ 2183/* PCI bus types */
2176enum ixgbe_bus_type { 2184enum ixgbe_bus_type {
2177 ixgbe_bus_type_unknown = 0, 2185 ixgbe_bus_type_unknown = 0,
@@ -2432,6 +2440,8 @@ struct ixgbe_phy_info {
2432 enum ixgbe_media_type media_type; 2440 enum ixgbe_media_type media_type;
2433 bool reset_disable; 2441 bool reset_disable;
2434 ixgbe_autoneg_advertised autoneg_advertised; 2442 ixgbe_autoneg_advertised autoneg_advertised;
2443 enum ixgbe_smart_speed smart_speed;
2444 bool smart_speed_active;
2435 bool multispeed_fiber; 2445 bool multispeed_fiber;
2436}; 2446};
2437 2447