Try to reset the PHY like u-boot does.
- Using enet_iomux_config.c for iMX6q. Adding return to line 1335, the other pins not needed
- Add PHY_KSZ9031_ID = 0x00221620 to enet_private.h
- Add imx_enet_phy_reset to enet_drv.c, here using PIN1_25, or whatever your board is
- Add rework like in u-boot
void enet_phy_rework_ksz9031(imx_enet_priv_t * dev)
{
imx_enet_mii_write(dev->enet_reg, dev->phy_addr, 0x9, 0x1c00);
// extended write by 4 writes
imx_enet_mii_ext_write(dev->enet_reg, 0x02,
MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW,
MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
// rx data pad skew - devaddr = 0x02, register = 0x05
imx_enet_mii_ext_write(dev->enet_reg, 0x02,
MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW,
MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
// tx data pad skew - devaddr = 0x02, register = 0x05
imx_enet_mii_ext_write(dev->enet_reg, 0x02,
MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW,
MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
// gtx and rx clock pad skew - devaddr = 0x02, register = 0x08
imx_enet_mii_ext_write(dev->enet_reg, 0x02,
MII_KSZ9031_EXT_RGMII_CLOCK_SKEW,
MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x03FF);
}
- AUTONEGOTIATION in imx_enet_phy_init
disable PHY isolation during autoneg, BUT MOST IMPORTANT: WAIT
#if 1
#if 1
imx_enet_mii_read(dev->enet_reg, dev->phy_addr, PHY_CTRL_REG, &value);
value |= 0x1200;
value &= ~(1<<10); // do not isolate during aneg
imx_enet_mii_write(dev->enet_reg, dev->phy_addr, PHY_CTRL_REG, value);
// abwarten
do
{
hal_delay_us(1000);
timeout++;
imx_enet_mii_read(dev->enet_reg, dev->phy_addr, PHY_STATUS_REG, &value);
} while( (value&(1<<5)) == 0 && timeout < 10000 );
if( timeout == 10000)
debug_puts( "auto neg timeout\r\n");
After all this the PHY control register 1Fh shows:
connected
full-duplex
1000M
but the control register 00h shows
full-duplex
100M
And the 1000M is in slave mode.
Never get a recv, ENET_EVENT_RX never reached.
Any one any idea?
Thank you for your help