|
@@ -126,9 +126,6 @@ static int e1000_write_phy_reg(struct e1000_hw *hw, uint32_t reg_addr,
|
|
static int32_t e1000_phy_hw_reset(struct e1000_hw *hw);
|
|
static int32_t e1000_phy_hw_reset(struct e1000_hw *hw);
|
|
static int e1000_phy_reset(struct e1000_hw *hw);
|
|
static int e1000_phy_reset(struct e1000_hw *hw);
|
|
static int e1000_detect_gig_phy(struct e1000_hw *hw);
|
|
static int e1000_detect_gig_phy(struct e1000_hw *hw);
|
|
-static int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset,
|
|
|
|
- uint16_t words,
|
|
|
|
- uint16_t *data);
|
|
|
|
static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);
|
|
static void e1000_put_hw_eeprom_semaphore(struct e1000_hw *hw);
|
|
static void e1000_set_media_type(struct e1000_hw *hw);
|
|
static void e1000_set_media_type(struct e1000_hw *hw);
|
|
|
|
|
|
@@ -143,6 +140,9 @@ static int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
|
|
#define E1000_WRITE_FLUSH(a) {uint32_t x; x = E1000_READ_REG(a, STATUS);}
|
|
#define E1000_WRITE_FLUSH(a) {uint32_t x; x = E1000_READ_REG(a, STATUS);}
|
|
|
|
|
|
#ifndef CONFIG_AP1000 /* remove for warnings */
|
|
#ifndef CONFIG_AP1000 /* remove for warnings */
|
|
|
|
+static int32_t e1000_read_eeprom(struct e1000_hw *hw, uint16_t offset,
|
|
|
|
+ uint16_t words,
|
|
|
|
+ uint16_t *data);
|
|
/******************************************************************************
|
|
/******************************************************************************
|
|
* Raises the EEPROM's clock input.
|
|
* Raises the EEPROM's clock input.
|
|
*
|
|
*
|
|
@@ -896,6 +896,47 @@ e1000_validate_eeprom_checksum(struct eth_device *nic)
|
|
return -E1000_ERR_EEPROM;
|
|
return -E1000_ERR_EEPROM;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+/*****************************************************************************
|
|
|
|
+ * Set PHY to class A mode
|
|
|
|
+ * Assumes the following operations will follow to enable the new class mode.
|
|
|
|
+ * 1. Do a PHY soft reset
|
|
|
|
+ * 2. Restart auto-negotiation or force link.
|
|
|
|
+ *
|
|
|
|
+ * hw - Struct containing variables accessed by shared code
|
|
|
|
+ ****************************************************************************/
|
|
|
|
+static int32_t
|
|
|
|
+e1000_set_phy_mode(struct e1000_hw *hw)
|
|
|
|
+{
|
|
|
|
+ int32_t ret_val;
|
|
|
|
+ uint16_t eeprom_data;
|
|
|
|
+
|
|
|
|
+ DEBUGFUNC();
|
|
|
|
+
|
|
|
|
+ if ((hw->mac_type == e1000_82545_rev_3) &&
|
|
|
|
+ (hw->media_type == e1000_media_type_copper)) {
|
|
|
|
+ ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD,
|
|
|
|
+ 1, &eeprom_data);
|
|
|
|
+ if (ret_val)
|
|
|
|
+ return ret_val;
|
|
|
|
+
|
|
|
|
+ if ((eeprom_data != EEPROM_RESERVED_WORD) &&
|
|
|
|
+ (eeprom_data & EEPROM_PHY_CLASS_A)) {
|
|
|
|
+ ret_val = e1000_write_phy_reg(hw,
|
|
|
|
+ M88E1000_PHY_PAGE_SELECT, 0x000B);
|
|
|
|
+ if (ret_val)
|
|
|
|
+ return ret_val;
|
|
|
|
+ ret_val = e1000_write_phy_reg(hw,
|
|
|
|
+ M88E1000_PHY_GEN_CONTROL, 0x8104);
|
|
|
|
+ if (ret_val)
|
|
|
|
+ return ret_val;
|
|
|
|
+
|
|
|
|
+ hw->phy_reset_disable = FALSE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return E1000_SUCCESS;
|
|
|
|
+}
|
|
#endif /* #ifndef CONFIG_AP1000 */
|
|
#endif /* #ifndef CONFIG_AP1000 */
|
|
|
|
|
|
/***************************************************************************
|
|
/***************************************************************************
|
|
@@ -1999,47 +2040,6 @@ e1000_setup_fiber_link(struct eth_device *nic)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-/*****************************************************************************
|
|
|
|
- * Set PHY to class A mode
|
|
|
|
- * Assumes the following operations will follow to enable the new class mode.
|
|
|
|
- * 1. Do a PHY soft reset
|
|
|
|
- * 2. Restart auto-negotiation or force link.
|
|
|
|
- *
|
|
|
|
- * hw - Struct containing variables accessed by shared code
|
|
|
|
- ****************************************************************************/
|
|
|
|
-static int32_t
|
|
|
|
-e1000_set_phy_mode(struct e1000_hw *hw)
|
|
|
|
-{
|
|
|
|
- int32_t ret_val;
|
|
|
|
- uint16_t eeprom_data;
|
|
|
|
-
|
|
|
|
- DEBUGFUNC();
|
|
|
|
-
|
|
|
|
- if ((hw->mac_type == e1000_82545_rev_3) &&
|
|
|
|
- (hw->media_type == e1000_media_type_copper)) {
|
|
|
|
- ret_val = e1000_read_eeprom(hw, EEPROM_PHY_CLASS_WORD,
|
|
|
|
- 1, &eeprom_data);
|
|
|
|
- if (ret_val)
|
|
|
|
- return ret_val;
|
|
|
|
-
|
|
|
|
- if ((eeprom_data != EEPROM_RESERVED_WORD) &&
|
|
|
|
- (eeprom_data & EEPROM_PHY_CLASS_A)) {
|
|
|
|
- ret_val = e1000_write_phy_reg(hw,
|
|
|
|
- M88E1000_PHY_PAGE_SELECT, 0x000B);
|
|
|
|
- if (ret_val)
|
|
|
|
- return ret_val;
|
|
|
|
- ret_val = e1000_write_phy_reg(hw,
|
|
|
|
- M88E1000_PHY_GEN_CONTROL, 0x8104);
|
|
|
|
- if (ret_val)
|
|
|
|
- return ret_val;
|
|
|
|
-
|
|
|
|
- hw->phy_reset_disable = FALSE;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return E1000_SUCCESS;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/******************************************************************************
|
|
/******************************************************************************
|
|
* Make sure we have a valid PHY and change PHY mode before link setup.
|
|
* Make sure we have a valid PHY and change PHY mode before link setup.
|
|
*
|
|
*
|