On Wed, May 20, 2015 at 1:01 AM, Tim Harvey <thar...@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 <mar...@ziswiler.com> > Cc: Marek Vasut <ma...@denx.de> > Cc: Aneesh Bansal <aneesh.ban...@freescale.com> > Cc: Naveen Burmi <naveenbu...@freescale.com> > Cc: Po Liu <po....@freescale.com> > Cc: Bin Meng <bmeng...@gmail.com> > Cc: Alison Wang <alison.w...@freescale.com> > Cc: Reinhard Arlt <reinhard.a...@esd-electronics.com> > Cc: Shengzhou Liu <shengzhou....@freescale.com> > Cc: York Sun <york...@freescale.com> > Signed-off-by: Tim Harvey <thar...@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...@gmail.com> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot