[U-Boot] [Patch 1/3] e1000: releasing semaphore once no longer needed
Bin Meng
bmeng.cn at gmail.com
Wed May 20 12:06:35 CEST 2015
On Wed, May 20, 2015 at 1:01 AM, Tim Harvey <tharvey at gateworks.com> wrote:
> Once the hwsw semaphore is acquired, it must be released when access to the
> hw is completed. Without this subsequent calls to acquire will timeout
> obtaining the semaphore.
>
> Cc: Marcel Ziswiler <marcel at ziswiler.com>
> Cc: Marek Vasut <marex at denx.de>
> Cc: Aneesh Bansal <aneesh.bansal at freescale.com>
> Cc: Naveen Burmi <NaveenBurmi at freescale.com>
> Cc: Po Liu <po.liu at freescale.com>
> Cc: Bin Meng <bmeng.cn at gmail.com>
> Cc: Alison Wang <alison.wang at freescale.com>
> Cc: Reinhard Arlt <reinhard.arlt at esd-electronics.com>
> Cc: Shengzhou Liu <Shengzhou.Liu at freescale.com>
> Cc: York Sun <yorksun at freescale.com>
> Signed-off-by: Tim Harvey <tharvey at gateworks.com>
> ---
> drivers/net/e1000.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c
> index cd44222..a64bc7b 100644
> --- a/drivers/net/e1000.c
> +++ b/drivers/net/e1000.c
> @@ -126,6 +126,7 @@ static int e1000_detect_gig_phy(struct e1000_hw *hw);
> static void e1000_set_media_type(struct e1000_hw *hw);
>
> static int32_t e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask);
> +static void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask);
> static int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
>
> #ifndef CONFIG_E1000_NO_NVM
> @@ -729,7 +730,10 @@ void e1000_release_eeprom(struct e1000_hw *hw)
> eecd &= ~E1000_EECD_REQ;
> E1000_WRITE_REG(hw, EECD, eecd);
> }
> +
> + e1000_swfw_sync_release(hw, E1000_SWFW_EEP_SM);
> }
> +
> /******************************************************************************
> * Reads a 16 bit word from the EEPROM.
> *
> @@ -1102,6 +1106,7 @@ e1000_get_hw_eeprom_semaphore(struct e1000_hw *hw)
> return E1000_SUCCESS;
> }
>
> +/* Take ownership of the PHY */
> static int32_t
> e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
> {
> @@ -1141,6 +1146,21 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
> return E1000_SUCCESS;
> }
>
> +static void e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask)
> +{
> + uint32_t swfw_sync = 0;
> +
> + DEBUGFUNC();
> + while (e1000_get_hw_eeprom_semaphore(hw))
> + ; /* Empty */
> +
> + swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC);
> + swfw_sync &= ~mask;
> + E1000_WRITE_REG(hw, SW_FW_SYNC, swfw_sync);
> +
> + e1000_put_hw_eeprom_semaphore(hw);
> +}
> +
> static bool e1000_is_second_port(struct e1000_hw *hw)
> {
> switch (hw->mac_type) {
> @@ -4462,6 +4482,8 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
> E1000_WRITE_REG(hw, LEDCTL, led_ctrl);
> }
>
> + e1000_swfw_sync_release(hw, swfw);
> +
> /* Wait for FW to finish PHY configuration. */
> ret_val = e1000_get_phy_cfg_done(hw);
> if (ret_val != E1000_SUCCESS)
> --
Tested on QEMU v2.3.0
Tested-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list