diff options
-rw-r--r-- | drivers/net/ixgbe/ixgbe_82599.c | 120 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_common.c | 1 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_phy.c | 1 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_type.h | 7 |
4 files changed, 106 insertions, 23 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index a7611bbf3873..84b83f7b473f 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
@@ -461,12 +461,23 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, | |||
461 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); | 461 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); |
462 | bool link_up = false; | 462 | bool link_up = false; |
463 | bool negotiation; | 463 | bool negotiation; |
464 | int i; | ||
464 | 465 | ||
465 | /* Mask off requested but non-supported speeds */ | 466 | /* Mask off requested but non-supported speeds */ |
466 | hw->mac.ops.get_link_capabilities(hw, &phy_link_speed, &negotiation); | 467 | hw->mac.ops.get_link_capabilities(hw, &phy_link_speed, &negotiation); |
467 | speed &= phy_link_speed; | 468 | speed &= phy_link_speed; |
468 | 469 | ||
469 | /* | 470 | /* |
471 | * When the driver changes the link speeds that it can support, | ||
472 | * it sets autotry_restart to true to indicate that we need to | ||
473 | * initiate a new autotry session with the link partner. To do | ||
474 | * so, we set the speed then disable and re-enable the tx laser, to | ||
475 | * alert the link partner that it also needs to restart autotry on its | ||
476 | * end. This is consistent with true clause 37 autoneg, which also | ||
477 | * involves a loss of signal. | ||
478 | */ | ||
479 | |||
480 | /* | ||
470 | * Try each speed one by one, highest priority first. We do this in | 481 | * Try each speed one by one, highest priority first. We do this in |
471 | * software because 10gb fiber doesn't support speed autonegotiation. | 482 | * software because 10gb fiber doesn't support speed autonegotiation. |
472 | */ | 483 | */ |
@@ -474,21 +485,52 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, | |||
474 | speedcnt++; | 485 | speedcnt++; |
475 | highest_link_speed = IXGBE_LINK_SPEED_10GB_FULL; | 486 | highest_link_speed = IXGBE_LINK_SPEED_10GB_FULL; |
476 | 487 | ||
477 | /* Set hardware SDP's */ | 488 | /* If we already have link at this speed, just jump out */ |
489 | hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false); | ||
490 | |||
491 | if ((phy_link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up) | ||
492 | goto out; | ||
493 | |||
494 | /* Set the module link speed */ | ||
478 | esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5); | 495 | esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5); |
479 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | 496 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); |
480 | 497 | ||
481 | ixgbe_setup_mac_link_speed_82599(hw, | 498 | /* Allow module to change analog characteristics (1G->10G) */ |
482 | IXGBE_LINK_SPEED_10GB_FULL, | 499 | msleep(40); |
483 | autoneg, | ||
484 | autoneg_wait_to_complete); | ||
485 | |||
486 | msleep(50); | ||
487 | 500 | ||
488 | /* If we have link, just jump out */ | 501 | status = ixgbe_setup_mac_link_speed_82599(hw, |
489 | hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false); | 502 | IXGBE_LINK_SPEED_10GB_FULL, |
490 | if (link_up) | 503 | autoneg, |
504 | autoneg_wait_to_complete); | ||
505 | if (status != 0) | ||
491 | goto out; | 506 | goto out; |
507 | |||
508 | /* Flap the tx laser if it has not already been done */ | ||
509 | if (hw->mac.autotry_restart) { | ||
510 | /* Disable tx laser; allow 100us to go dark per spec */ | ||
511 | esdp_reg |= IXGBE_ESDP_SDP3; | ||
512 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
513 | udelay(100); | ||
514 | |||
515 | /* Enable tx laser; allow 2ms to light up per spec */ | ||
516 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
517 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
518 | msleep(2); | ||
519 | |||
520 | hw->mac.autotry_restart = false; | ||
521 | } | ||
522 | |||
523 | /* The controller may take up to 500ms at 10g to acquire link */ | ||
524 | for (i = 0; i < 5; i++) { | ||
525 | /* Wait for the link partner to also set speed */ | ||
526 | msleep(100); | ||
527 | |||
528 | /* If we have link, just jump out */ | ||
529 | hw->mac.ops.check_link(hw, &phy_link_speed, | ||
530 | &link_up, false); | ||
531 | if (link_up) | ||
532 | goto out; | ||
533 | } | ||
492 | } | 534 | } |
493 | 535 | ||
494 | if (speed & IXGBE_LINK_SPEED_1GB_FULL) { | 536 | if (speed & IXGBE_LINK_SPEED_1GB_FULL) { |
@@ -496,16 +538,44 @@ s32 ixgbe_setup_mac_link_speed_multispeed_fiber(struct ixgbe_hw *hw, | |||
496 | if (highest_link_speed == IXGBE_LINK_SPEED_UNKNOWN) | 538 | if (highest_link_speed == IXGBE_LINK_SPEED_UNKNOWN) |
497 | highest_link_speed = IXGBE_LINK_SPEED_1GB_FULL; | 539 | highest_link_speed = IXGBE_LINK_SPEED_1GB_FULL; |
498 | 540 | ||
499 | /* Set hardware SDP's */ | 541 | /* If we already have link at this speed, just jump out */ |
542 | hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false); | ||
543 | |||
544 | if ((phy_link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up) | ||
545 | goto out; | ||
546 | |||
547 | /* Set the module link speed */ | ||
500 | esdp_reg &= ~IXGBE_ESDP_SDP5; | 548 | esdp_reg &= ~IXGBE_ESDP_SDP5; |
501 | esdp_reg |= IXGBE_ESDP_SDP5_DIR; | 549 | esdp_reg |= IXGBE_ESDP_SDP5_DIR; |
502 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | 550 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); |
503 | 551 | ||
504 | ixgbe_setup_mac_link_speed_82599( | 552 | /* Allow module to change analog characteristics (10G->1G) */ |
505 | hw, IXGBE_LINK_SPEED_1GB_FULL, autoneg, | 553 | msleep(40); |
506 | autoneg_wait_to_complete); | ||
507 | 554 | ||
508 | msleep(50); | 555 | status = ixgbe_setup_mac_link_speed_82599(hw, |
556 | IXGBE_LINK_SPEED_1GB_FULL, | ||
557 | autoneg, | ||
558 | autoneg_wait_to_complete); | ||
559 | if (status != 0) | ||
560 | goto out; | ||
561 | |||
562 | /* Flap the tx laser if it has not already been done */ | ||
563 | if (hw->mac.autotry_restart) { | ||
564 | /* Disable tx laser; allow 100us to go dark per spec */ | ||
565 | esdp_reg |= IXGBE_ESDP_SDP3; | ||
566 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
567 | udelay(100); | ||
568 | |||
569 | /* Enable tx laser; allow 2ms to light up per spec */ | ||
570 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
571 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
572 | msleep(2); | ||
573 | |||
574 | hw->mac.autotry_restart = false; | ||
575 | } | ||
576 | |||
577 | /* Wait for the link partner to also set speed */ | ||
578 | msleep(100); | ||
509 | 579 | ||
510 | /* If we have link, just jump out */ | 580 | /* If we have link, just jump out */ |
511 | hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false); | 581 | hw->mac.ops.check_link(hw, &phy_link_speed, &link_up, false); |
@@ -591,6 +661,7 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, | |||
591 | s32 status = 0; | 661 | s32 status = 0; |
592 | u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); | 662 | u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); |
593 | u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); | 663 | u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2); |
664 | u32 start_autoc = autoc; | ||
594 | u32 orig_autoc = 0; | 665 | u32 orig_autoc = 0; |
595 | u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; | 666 | u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK; |
596 | u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; | 667 | u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK; |
@@ -603,6 +674,11 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, | |||
603 | hw->mac.ops.get_link_capabilities(hw, &link_capabilities, &autoneg); | 674 | hw->mac.ops.get_link_capabilities(hw, &link_capabilities, &autoneg); |
604 | speed &= link_capabilities; | 675 | speed &= link_capabilities; |
605 | 676 | ||
677 | if (speed == IXGBE_LINK_SPEED_UNKNOWN) { | ||
678 | status = IXGBE_ERR_LINK_SETUP; | ||
679 | goto out; | ||
680 | } | ||
681 | |||
606 | /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/ | 682 | /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/ |
607 | if (hw->mac.orig_link_settings_stored) | 683 | if (hw->mac.orig_link_settings_stored) |
608 | orig_autoc = hw->mac.orig_autoc; | 684 | orig_autoc = hw->mac.orig_autoc; |
@@ -610,11 +686,9 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, | |||
610 | orig_autoc = autoc; | 686 | orig_autoc = autoc; |
611 | 687 | ||
612 | 688 | ||
613 | if (speed == IXGBE_LINK_SPEED_UNKNOWN) { | 689 | if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || |
614 | status = IXGBE_ERR_LINK_SETUP; | 690 | link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || |
615 | } else if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR || | 691 | link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { |
616 | link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN || | ||
617 | link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) { | ||
618 | /* Set KX4/KX/KR support according to speed requested */ | 692 | /* Set KX4/KX/KR support according to speed requested */ |
619 | autoc &= ~(IXGBE_AUTOC_KX4_KX_SUPP_MASK | IXGBE_AUTOC_KR_SUPP); | 693 | autoc &= ~(IXGBE_AUTOC_KX4_KX_SUPP_MASK | IXGBE_AUTOC_KR_SUPP); |
620 | if (speed & IXGBE_LINK_SPEED_10GB_FULL) | 694 | if (speed & IXGBE_LINK_SPEED_10GB_FULL) |
@@ -646,7 +720,7 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, | |||
646 | } | 720 | } |
647 | } | 721 | } |
648 | 722 | ||
649 | if (status == 0) { | 723 | if (autoc != start_autoc) { |
650 | /* Restart link */ | 724 | /* Restart link */ |
651 | autoc |= IXGBE_AUTOC_AN_RESTART; | 725 | autoc |= IXGBE_AUTOC_AN_RESTART; |
652 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); | 726 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc); |
@@ -680,6 +754,7 @@ s32 ixgbe_setup_mac_link_speed_82599(struct ixgbe_hw *hw, | |||
680 | msleep(50); | 754 | msleep(50); |
681 | } | 755 | } |
682 | 756 | ||
757 | out: | ||
683 | return status; | 758 | return status; |
684 | } | 759 | } |
685 | 760 | ||
@@ -1144,6 +1219,9 @@ s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw) | |||
1144 | } | 1219 | } |
1145 | IXGBE_WRITE_FLUSH(hw); | 1220 | IXGBE_WRITE_FLUSH(hw); |
1146 | 1221 | ||
1222 | /* We need to run link autotry after the driver loads */ | ||
1223 | hw->mac.autotry_restart = true; | ||
1224 | |||
1147 | return 0; | 1225 | return 0; |
1148 | } | 1226 | } |
1149 | 1227 | ||
diff --git a/drivers/net/ixgbe/ixgbe_common.c b/drivers/net/ixgbe/ixgbe_common.c index 6f79409270a7..4d36cd32cd30 100644 --- a/drivers/net/ixgbe/ixgbe_common.c +++ b/drivers/net/ixgbe/ixgbe_common.c | |||
@@ -2068,6 +2068,7 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index) | |||
2068 | hw->mac.ops.check_link(hw, &speed, &link_up, false); | 2068 | hw->mac.ops.check_link(hw, &speed, &link_up, false); |
2069 | 2069 | ||
2070 | if (!link_up) { | 2070 | if (!link_up) { |
2071 | autoc_reg |= IXGBE_AUTOC_AN_RESTART; | ||
2071 | autoc_reg |= IXGBE_AUTOC_FLU; | 2072 | autoc_reg |= IXGBE_AUTOC_FLU; |
2072 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); | 2073 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); |
2073 | msleep(10); | 2074 | msleep(10); |
diff --git a/drivers/net/ixgbe/ixgbe_phy.c b/drivers/net/ixgbe/ixgbe_phy.c index e43d6248d7d4..453e966762f0 100644 --- a/drivers/net/ixgbe/ixgbe_phy.c +++ b/drivers/net/ixgbe/ixgbe_phy.c | |||
@@ -606,6 +606,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) | |||
606 | hw->phy.sfp_setup_needed = true; | 606 | hw->phy.sfp_setup_needed = true; |
607 | 607 | ||
608 | /* Determine if the SFP+ PHY is dual speed or not. */ | 608 | /* Determine if the SFP+ PHY is dual speed or not. */ |
609 | hw->phy.multispeed_fiber = false; | ||
609 | if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) && | 610 | if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) && |
610 | (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) || | 611 | (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) || |
611 | ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) && | 612 | ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) && |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index a8a8243d8fdb..199b288c3459 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
@@ -1265,8 +1265,10 @@ | |||
1265 | #define IXGBE_STATUS_LAN_ID_1 0x00000004 /* LAN ID 1 */ | 1265 | #define IXGBE_STATUS_LAN_ID_1 0x00000004 /* LAN ID 1 */ |
1266 | 1266 | ||
1267 | /* ESDP Bit Masks */ | 1267 | /* ESDP Bit Masks */ |
1268 | #define IXGBE_ESDP_SDP0 0x00000001 | 1268 | #define IXGBE_ESDP_SDP0 0x00000001 /* SDP0 Data Value */ |
1269 | #define IXGBE_ESDP_SDP1 0x00000002 | 1269 | #define IXGBE_ESDP_SDP1 0x00000002 /* SDP1 Data Value */ |
1270 | #define IXGBE_ESDP_SDP2 0x00000004 /* SDP2 Data Value */ | ||
1271 | #define IXGBE_ESDP_SDP3 0x00000008 /* SDP3 Data Value */ | ||
1270 | #define IXGBE_ESDP_SDP4 0x00000010 /* SDP4 Data Value */ | 1272 | #define IXGBE_ESDP_SDP4 0x00000010 /* SDP4 Data Value */ |
1271 | #define IXGBE_ESDP_SDP5 0x00000020 /* SDP5 Data Value */ | 1273 | #define IXGBE_ESDP_SDP5 0x00000020 /* SDP5 Data Value */ |
1272 | #define IXGBE_ESDP_SDP6 0x00000040 /* SDP6 Data Value */ | 1274 | #define IXGBE_ESDP_SDP6 0x00000040 /* SDP6 Data Value */ |
@@ -2281,6 +2283,7 @@ struct ixgbe_mac_info { | |||
2281 | bool orig_link_settings_stored; | 2283 | bool orig_link_settings_stored; |
2282 | bool autoneg; | 2284 | bool autoneg; |
2283 | bool autoneg_succeeded; | 2285 | bool autoneg_succeeded; |
2286 | bool autotry_restart; | ||
2284 | }; | 2287 | }; |
2285 | 2288 | ||
2286 | struct ixgbe_phy_info { | 2289 | struct ixgbe_phy_info { |