On Tue, Oct 21, 2014 at 5:26 AM, Marcel Ziswiler <mar...@ziswiler.com> wrote: > I finally had a look at the datasheet and spotted an additional > register address difference between regular E1000 and i210/i211 chips. > This patch fixes this and now successfully works on programmed > i210/i211 as well as unprogrammed i211. > > Signed-off-by: Marcel Ziswiler <mar...@ziswiler.com> > --- > Please note that unprogrammed i210 seem to behave slightly different > and do not assert the CFG_DONE bit in the EEMNGCTL register upon PHY > reset. However if this error condition is ignored then successful data > transfer is possible. Due to the rather hacky nature thereof this is > not addressed by my patch.
Hi Marcel, I've never been able to get e1000_swfw_sync_acquire() to not timeout on the boards with i210 devices that I have (IMX6 with 2x i210 programmed as 8086:1533 using int phys). In my case with your patch below as well as York's patch (https://patchwork.ozlabs.org/patch/400628/) I still see failures. The I210_SW_FW_SYNC reg returns swfw_sync=0x03, fwmask=0x20000, and swmask=0x2 which results in: Driver can't access resource, SW_FW_SYNC timeout. Unable to acquire swfw sync Error Resetting the PHY e1000: e1000#0: ERROR: Hardware Initialization Failed I've always had to ignore the return value from e1000_reset() to avoid this issue and use the devices. Any ideas? > > BTW: What about my previous patch this one kind of bases on? > > [PATCH] e1000: add i211 and unprogrammed i210/i211 support I don't have any i211's but I'll see if I can get hold of an unprogrammed i210 to test with. Tim > > drivers/net/e1000.c | 6 ++++-- > drivers/net/e1000.h | 1 + > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c > index b092867..798c8aa 100644 > --- a/drivers/net/e1000.c > +++ b/drivers/net/e1000.c > @@ -1112,7 +1112,10 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t > mask) > if (e1000_get_hw_eeprom_semaphore(hw)) > return -E1000_ERR_SWFW_SYNC; > > - swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); > + if (hw->mac_type == e1000_igb) > + swfw_sync = E1000_READ_REG(hw, I210_SW_FW_SYNC); > + else > + swfw_sync = E1000_READ_REG(hw, SW_FW_SYNC); > if (!(swfw_sync & (fwmask | swmask))) > break; > > @@ -4429,7 +4432,6 @@ e1000_phy_hw_reset(struct e1000_hw *hw) > > if (hw->mac_type >= e1000_82571) > mdelay(10); > - > } else { > /* Read the Extended Device Control Register, assert the > PHY_RESET_DIR > * bit to put the PHY into reset. Then, take it out of reset. > diff --git a/drivers/net/e1000.h b/drivers/net/e1000.h > index b025ecc..6d110eb 100644 > --- a/drivers/net/e1000.h > +++ b/drivers/net/e1000.h > @@ -2497,6 +2497,7 @@ struct e1000_hw { > #define ICH_GFPREG_BASE_MASK 0x1FFF > #define ICH_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF > > +#define E1000_I210_SW_FW_SYNC 0x5B50 /* Software-Firmware Synchronization - > RW */ > #define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */ > > /* SPI EEPROM Status Register */ > -- > 1.9.3 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot