ixgbe: Read and parse NW_MNG_IF_SEL register
authorMark Rustad <mark.d.rustad@intel.com>
Fri, 1 Apr 2016 19:18:25 +0000 (12:18 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 7 Apr 2016 23:36:47 +0000 (16:36 -0700)
Read the IXGBE_NW_MNG_IF_SEL register and use it to set interface
attributes.

Signed-off-by: Mark Rustad <mark.d.rustad@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c

index a5c789e30de30005d256a9e43da125e58198ffb1..6b68e8ba1dceb684e4822a628a8d859daa28b4e9 100644 (file)
@@ -3649,5 +3649,10 @@ struct ixgbe_info {
 #define IXGBE_SB_IOSF_TARGET_KX4_PCS1  3
 
 #define IXGBE_NW_MNG_IF_SEL            0x00011178
+#define IXGBE_NW_MNG_IF_SEL_MDIO_ACT           BIT(1)
+#define IXGBE_NW_MNG_IF_SEL_ENABLE_10_100M     BIT(23)
 #define IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE       BIT(24)
+#define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT 3
+#define IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD       \
+                               (0x1F << IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT)
 #endif /* _IXGBE_TYPE_H_ */
index ef1dc3b5b4edd6a21d74b0e4e639753cceb60ebf..3563b862d8ea4420d44417e523165c206657f624 100644 (file)
@@ -2137,6 +2137,36 @@ static s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw)
        return status;
 }
 
+/**
+ * ixgbe_read_mng_if_sel_x550em - Read NW_MNG_IF_SEL register
+ * @hw: pointer to hardware structure
+ *
+ * Read NW_MNG_IF_SEL register and save field values.
+ */
+static void ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw)
+{
+       /* Save NW management interface connected on board. This is used
+        * to determine internal PHY mode.
+        */
+       hw->phy.nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
+
+       /* If X552 (X550EM_a) and MDIO is connected to external PHY, then set
+        * PHY address. This register field was has only been used for X552.
+        */
+       if (!hw->phy.nw_mng_if_sel) {
+               if (hw->mac.type == ixgbe_mac_x550em_a) {
+                       struct ixgbe_adapter *adapter = hw->back;
+
+                       e_warn(drv, "nw_mng_if_sel not set\n");
+               }
+               return;
+       }
+
+       hw->phy.mdio.prtad = (hw->phy.nw_mng_if_sel &
+                             IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
+                            IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
+}
+
 /** ixgbe_init_phy_ops_X550em - PHY/SFP specific init
  *  @hw: pointer to hardware structure
  *
@@ -2151,14 +2181,11 @@ static s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
 
        hw->mac.ops.set_lan_id(hw);
 
+       ixgbe_read_mng_if_sel_x550em(hw);
+
        if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) {
                phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
                ixgbe_setup_mux_ctl(hw);
-
-               /* Save NW management interface connected on board. This is used
-                * to determine internal PHY mode.
-                */
-               phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
        }
 
        /* Identify the PHY or SFP module */