mirror of
https://github.com/apache/nuttx.git
synced 2026-05-18 08:54:05 +08:00
h7: eth: add checks for PHYID in stm32_phyinit
Fixes bug where stm32_phyinit will succeed even when no PHY is connected. This is because there is no check that a PHY is actually communicating and returning data. Update include/nuttx/net/mii.h Co-authored-by: Xiang Xiao <xiaoxiang781216@gmail.com>
This commit is contained in:
committed by
Alan C. Assis
parent
e5388558a6
commit
3dcedd507b
@@ -107,6 +107,64 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ETH0_PHY_AM79C874)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_AM79C874
|
||||
# define STM32H7_PHYID2 MII_PHYID2_AM79C874
|
||||
#elif defined(CONFIG_ETH0_PHY_AR8031)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_AR8031
|
||||
# define STM32H7_PHYID2 MII_PHYID2_AR8031
|
||||
#elif defined(CONFIG_ETH0_PHY_KS8721)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_KS8721
|
||||
# define STM32H7_PHYID2 MII_PHYID2_KS8721
|
||||
#elif defined(CONFIG_ETH0_PHY_KSZ8041)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_KSZ8041
|
||||
# define STM32H7_PHYID2 MII_PHYID2_KSZ8041
|
||||
#elif defined(CONFIG_ETH0_PHY_KSZ8051)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_KSZ8051
|
||||
# define STM32H7_PHYID2 MII_PHYID2_KSZ8051
|
||||
#elif defined(CONFIG_ETH0_PHY_KSZ8061)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_KSZ8061
|
||||
# define STM32H7_PHYID2 MII_PHYID2_KSZ8061
|
||||
#elif defined(CONFIG_ETH0_PHY_KSZ8081)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_KSZ8081
|
||||
# define STM32H7_PHYID2 MII_PHYID2_KSZ8081
|
||||
#elif defined(CONFIG_ETH0_PHY_DP83848C)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_DP83848C
|
||||
# define STM32H7_PHYID2 MII_PHYID2_DP83848C
|
||||
#elif defined(CONFIG_ETH0_PHY_DP83825I)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_DP83825I
|
||||
# define STM32H7_PHYID2 MII_PHYID2_DP83825I
|
||||
#elif defined(CONFIG_ETH0_PHY_TJA1100)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_TJA1100
|
||||
# define STM32H7_PHYID2 MII_PHYID2_TJA1100
|
||||
#elif defined(CONFIG_ETH0_PHY_TJA1101)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_TJA1101
|
||||
# define STM32H7_PHYID2 MII_PHYID2_TJA1101
|
||||
#elif defined(CONFIG_ETH0_PHY_TJA1103)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_TJA1103
|
||||
# define STM32H7_PHYID2 MII_PHYID2_TJA1103
|
||||
#elif defined(CONFIG_ETH0_PHY_LAN8720)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_LAN8720
|
||||
# define STM32H7_PHYID2 MII_PHYID2_LAN8720
|
||||
#elif defined(CONFIG_ETH0_PHY_LAN8740)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_LAN8740
|
||||
# define STM32H7_PHYID2 MII_PHYID2_LAN8740
|
||||
#elif defined(CONFIG_ETH0_PHY_LAN8740A)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_LAN8740A
|
||||
# define STM32H7_PHYID2 MII_PHYID2_LAN8740A
|
||||
#elif defined(CONFIG_ETH0_PHY_LAN8742A)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_LAN8742A
|
||||
# define STM32H7_PHYID2 MII_PHYID2_LAN8742A
|
||||
#elif defined(CONFIG_ETH0_PHY_DM9161)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_DM9161
|
||||
# define STM32H7_PHYID2 MII_PHYID2_DM9161
|
||||
#elif defined(CONFIG_ETH0_PHY_YT8512)
|
||||
# define STM32H7_PHYID1 MII_PHYID1_YT8512
|
||||
# define STM32H7_PHYID2 MII_PHYID2_YT8512
|
||||
#else
|
||||
# warning "No PHY specified!"
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_STM32H7_PHYADDR
|
||||
# error "CONFIG_STM32H7_PHYADDR must be defined in the NuttX configuration"
|
||||
#endif
|
||||
@@ -3335,7 +3393,10 @@ static int stm32_phyinit(struct stm32_ethmac_s *priv)
|
||||
{
|
||||
up_mdelay(10);
|
||||
to -= 10;
|
||||
phyval = 0xffff;
|
||||
ret = stm32_phyread(CONFIG_STM32H7_PHYADDR, MII_MCR, &phyval);
|
||||
|
||||
ninfo("MII_MCR: phyval: %u ret: %d\n", phyval, ret);
|
||||
}
|
||||
while (phyval & MII_MCR_RESET && to > 0);
|
||||
|
||||
@@ -3349,6 +3410,40 @@ static int stm32_phyinit(struct stm32_ethmac_s *priv)
|
||||
ninfo("Phy reset in %d ms\n", PHY_RESET_DELAY - to);
|
||||
}
|
||||
|
||||
ret = stm32_phyread(CONFIG_STM32H7_PHYADDR, MII_PHYID1, &phyval);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: Failed to read PHYID1: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (phyval != STM32H7_PHYID1)
|
||||
{
|
||||
nerr("ERROR: Incorrect PHYID1: %u expected: %u\n",
|
||||
phyval, STM32H7_PHYID1);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
ninfo("MII_PHYID1: phyval: %u ret: %d\n", phyval, ret);
|
||||
|
||||
ret = stm32_phyread(CONFIG_STM32H7_PHYADDR, MII_PHYID2, &phyval);
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
nerr("ERROR: Failed to read PHYID2: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((phyval & 0xfff0) != (STM32H7_PHYID2 & 0xfff0))
|
||||
{
|
||||
nerr("ERROR: Incorrect PHYID2: %u expected: %u\n",
|
||||
phyval, STM32H7_PHYID2);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
ninfo("MII_PHYID2: phyval: %u ret: %d\n", phyval, ret);
|
||||
|
||||
#ifdef CONFIG_STM32H7_ETHMAC_REGDEBUG
|
||||
stm32_phyregdump();
|
||||
#endif
|
||||
@@ -3378,6 +3473,7 @@ static int stm32_phyinit(struct stm32_ethmac_s *priv)
|
||||
}
|
||||
else if ((phyval & MII_MSR_LINKSTATUS) != 0)
|
||||
{
|
||||
ninfo("MII_MSR: phyval: %u ret: %d \n", phyval, ret);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -396,6 +396,13 @@
|
||||
#define DP83840_PHYADDR_DUPLEX (1 << 7)
|
||||
#define DP83840_PHYADDR_SPEED (1 << 6)
|
||||
|
||||
/* Davicom DM9161 **********************************************************/
|
||||
|
||||
/* DM9161 MII ID1/2 register bits */
|
||||
|
||||
#define MII_PHYID1_DM9161 0x0181
|
||||
#define MII_PHYID2_DM9161 0xB800
|
||||
|
||||
/* National Semiconductor DP83848C ******************************************/
|
||||
|
||||
/* DP83848C MII ID1/2 register bits */
|
||||
|
||||
Reference in New Issue
Block a user