net/ixgbe/base: add MAC link setup for X550a SFP
authorBeilei Xing <beilei.xing@intel.com>
Thu, 23 Jun 2016 07:22:12 +0000 (15:22 +0800)
committerBruce Richardson <bruce.richardson@intel.com>
Mon, 27 Jun 2016 14:17:52 +0000 (16:17 +0200)
This patch adds ixgbe_setup_mac_link_sfp_x550a for X550a SFP.

Signed-off-by: Beilei Xing <beilei.xing@intel.com>
drivers/net/ixgbe/base/ixgbe_type.h
drivers/net/ixgbe/base/ixgbe_x550.c
drivers/net/ixgbe/base/ixgbe_x550.h

index 493bd46..7bd6f2c 100644 (file)
@@ -4062,6 +4062,7 @@ struct ixgbe_hw {
 #define IXGBE_KRM_PORT_CAR_GEN_CTRL(P) ((P) ? 0x8010 : 0x4010)
 #define IXGBE_KRM_LINK_CTRL_1(P)       ((P) ? 0x820C : 0x420C)
 #define IXGBE_KRM_AN_CNTL_1(P)         ((P) ? 0x822C : 0x422C)
+#define IXGBE_KRM_AN_CNTL_8(P)         ((P) ? 0x8248 : 0x4248)
 #define IXGBE_KRM_SGMII_CTRL(P)                ((P) ? 0x82A0 : 0x42A0)
 #define IXGBE_KRM_DSP_TXFFE_STATE_4(P) ((P) ? 0x8634 : 0x4634)
 #define IXGBE_KRM_DSP_TXFFE_STATE_5(P) ((P) ? 0x8638 : 0x4638)
@@ -4090,6 +4091,9 @@ struct ixgbe_hw {
 #define IXGBE_KRM_AN_CNTL_1_SYM_PAUSE                  (1 << 28)
 #define IXGBE_KRM_AN_CNTL_1_ASM_PAUSE                  (1 << 29)
 
+#define IXGBE_KRM_AN_CNTL_8_LINEAR                     (1 << 0)
+#define IXGBE_KRM_AN_CNTL_8_LIMITING                   (1 << 1)
+
 #define IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D       (1 << 12)
 #define IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D                (1 << 19)
 
index 6c00b2a..8a5b1dc 100644 (file)
@@ -1488,9 +1488,14 @@ void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
                mac->ops.enable_tx_laser = NULL;
                mac->ops.flap_tx_laser = NULL;
                mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
-               mac->ops.setup_mac_link = ixgbe_setup_mac_link_sfp_x550em;
                mac->ops.set_rate_select_speed =
                                        ixgbe_set_soft_rate_select_speed;
+               if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N)
+                       mac->ops.setup_mac_link =
+                               ixgbe_setup_mac_link_sfp_x550a;
+               else
+                       mac->ops.setup_mac_link =
+                               ixgbe_setup_mac_link_sfp_x550em;
                break;
        case ixgbe_media_type_copper:
                mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
@@ -2127,6 +2132,63 @@ s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
        return ret_val;
 }
 
+/**
+ *  ixgbe_setup_mac_link_sfp_x550a - Setup internal PHY for SFP
+ *  @hw: pointer to hardware structure
+ *
+ *  Configure the the integrated PHY for SFP support.
+ **/
+s32 ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw,
+                                  ixgbe_link_speed speed,
+                                  bool autoneg_wait_to_complete)
+{
+       s32 ret_val;
+       u32 reg_val;
+       bool setup_linear = false;
+
+       UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
+
+       /* Check if SFP module is supported and linear */
+       ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
+
+       /* If no SFP module present, then return success. Return success since
+        * SFP not present error is not excepted in the setup MAC link flow.
+        */
+       if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
+               return IXGBE_SUCCESS;
+
+       if (ret_val != IXGBE_SUCCESS)
+               return ret_val;
+
+       /* Configure internal PHY for native SFI */
+       ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
+                      IXGBE_KRM_AN_CNTL_8(hw->bus.lan_id),
+                      IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+
+       if (ret_val != IXGBE_SUCCESS)
+               return ret_val;
+
+       if (setup_linear) {
+               reg_val &= ~IXGBE_KRM_AN_CNTL_8_LIMITING;
+               reg_val |= IXGBE_KRM_AN_CNTL_8_LINEAR;
+       } else {
+               reg_val |= IXGBE_KRM_AN_CNTL_8_LIMITING;
+               reg_val &= ~IXGBE_KRM_AN_CNTL_8_LINEAR;
+       }
+
+       ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
+                       IXGBE_KRM_AN_CNTL_8(hw->bus.lan_id),
+                       IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+
+       if (ret_val != IXGBE_SUCCESS)
+               return ret_val;
+
+       /* Setup XFI/SFI internal link. */
+       ret_val = ixgbe_setup_ixfi_x550em(hw, &speed);
+
+       return ret_val;
+}
+
 /**
  *  ixgbe_setup_ixfi_x550em_x - MAC specific iXFI configuration
  *  @hw: pointer to hardware structure
index a8c0a67..2966c7b 100644 (file)
@@ -100,6 +100,9 @@ s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw);
 s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
                                    ixgbe_link_speed speed,
                                    bool autoneg_wait_to_complete);
+s32 ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw,
+                                  ixgbe_link_speed speed,
+                                  bool autoneg_wait_to_complete);
 s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw);
 s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
                                  ixgbe_link_speed speed,