|
@@ -139,8 +139,9 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link);
|
|
|
static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw);
|
|
|
static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw);
|
|
|
static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw);
|
|
|
-static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index);
|
|
|
-static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index);
|
|
|
+static int e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index);
|
|
|
+static int e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index);
|
|
|
+static u32 e1000_rar_get_count_pch_lpt(struct e1000_hw *hw);
|
|
|
static s32 e1000_k1_workaround_lv(struct e1000_hw *hw);
|
|
|
static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate);
|
|
|
static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force);
|
|
@@ -704,6 +705,7 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)
|
|
|
mac->ops.rar_set = e1000_rar_set_pch_lpt;
|
|
|
mac->ops.setup_physical_interface =
|
|
|
e1000_setup_copper_link_pch_lpt;
|
|
|
+ mac->ops.rar_get_count = e1000_rar_get_count_pch_lpt;
|
|
|
}
|
|
|
|
|
|
/* Enable PCS Lock-loss workaround for ICH8 */
|
|
@@ -1668,7 +1670,7 @@ static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw)
|
|
|
* contain the MAC address but RAR[1-6] are reserved for manageability (ME).
|
|
|
* Use SHRA[0-3] in place of those reserved for ME.
|
|
|
**/
|
|
|
-static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
+static int e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
{
|
|
|
u32 rar_low, rar_high;
|
|
|
|
|
@@ -1690,7 +1692,7 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
e1e_flush();
|
|
|
ew32(RAH(index), rar_high);
|
|
|
e1e_flush();
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/* RAR[1-6] are owned by manageability. Skip those and program the
|
|
@@ -1713,7 +1715,7 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
/* verify the register updates */
|
|
|
if ((er32(SHRAL(index - 1)) == rar_low) &&
|
|
|
(er32(SHRAH(index - 1)) == rar_high))
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
e_dbg("SHRA[%d] might be locked by ME - FWSM=0x%8.8x\n",
|
|
|
(index - 1), er32(FWSM));
|
|
@@ -1721,6 +1723,43 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
|
|
|
out:
|
|
|
e_dbg("Failed to write receive address at index %d\n", index);
|
|
|
+ return -E1000_ERR_CONFIG;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * e1000_rar_get_count_pch_lpt - Get the number of available SHRA
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
+ *
|
|
|
+ * Get the number of available receive registers that the Host can
|
|
|
+ * program. SHRA[0-10] are the shared receive address registers
|
|
|
+ * that are shared between the Host and manageability engine (ME).
|
|
|
+ * ME can reserve any number of addresses and the host needs to be
|
|
|
+ * able to tell how many available registers it has access to.
|
|
|
+ **/
|
|
|
+static u32 e1000_rar_get_count_pch_lpt(struct e1000_hw *hw)
|
|
|
+{
|
|
|
+ u32 wlock_mac;
|
|
|
+ u32 num_entries;
|
|
|
+
|
|
|
+ wlock_mac = er32(FWSM) & E1000_FWSM_WLOCK_MAC_MASK;
|
|
|
+ wlock_mac >>= E1000_FWSM_WLOCK_MAC_SHIFT;
|
|
|
+
|
|
|
+ switch (wlock_mac) {
|
|
|
+ case 0:
|
|
|
+ /* All SHRA[0..10] and RAR[0] available */
|
|
|
+ num_entries = hw->mac.rar_entry_count;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ /* Only RAR[0] available */
|
|
|
+ num_entries = 1;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ /* SHRA[0..(wlock_mac - 1)] available + RAR[0] */
|
|
|
+ num_entries = wlock_mac + 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return num_entries;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1734,7 +1773,7 @@ out:
|
|
|
* contain the MAC address. SHRA[0-10] are the shared receive address
|
|
|
* registers that are shared between the Host and manageability engine (ME).
|
|
|
**/
|
|
|
-static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
+static int e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
{
|
|
|
u32 rar_low, rar_high;
|
|
|
u32 wlock_mac;
|
|
@@ -1756,7 +1795,7 @@ static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
e1e_flush();
|
|
|
ew32(RAH(index), rar_high);
|
|
|
e1e_flush();
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/* The manageability engine (ME) can lock certain SHRAR registers that
|
|
@@ -1788,12 +1827,13 @@ static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)
|
|
|
/* verify the register updates */
|
|
|
if ((er32(SHRAL_PCH_LPT(index - 1)) == rar_low) &&
|
|
|
(er32(SHRAH_PCH_LPT(index - 1)) == rar_high))
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
e_dbg("Failed to write receive address at index %d\n", index);
|
|
|
+ return -E1000_ERR_CONFIG;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -4977,6 +5017,7 @@ static const struct e1000_mac_operations ich8_mac_ops = {
|
|
|
/* id_led_init dependent on mac type */
|
|
|
.config_collision_dist = e1000e_config_collision_dist_generic,
|
|
|
.rar_set = e1000e_rar_set_generic,
|
|
|
+ .rar_get_count = e1000e_rar_get_count_generic,
|
|
|
};
|
|
|
|
|
|
static const struct e1000_phy_operations ich8_phy_ops = {
|