This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 5fa1819492 arch/risc-v/litex/litex-emac: Add support for phy
interrupts.
5fa1819492 is described below
commit 5fa18194925817f570ff28f8ed275889f92d2179
Author: Stuart Ianna <[email protected]>
AuthorDate: Wed Oct 25 14:21:57 2023 +1100
arch/risc-v/litex/litex-emac: Add support for phy interrupts.
Add support for PHY interrupts in the architecture layer of the Litex emac
driver. Boards need to add handling for interrupt lines, if supported.
---
arch/risc-v/src/litex/litex_emac.c | 57 ++++++++++++++++++++++++++++++++++----
1 file changed, 52 insertions(+), 5 deletions(-)
diff --git a/arch/risc-v/src/litex/litex_emac.c
b/arch/risc-v/src/litex/litex_emac.c
index 3fb975efbd..3064f8843b 100644
--- a/arch/risc-v/src/litex/litex_emac.c
+++ b/arch/risc-v/src/litex/litex_emac.c
@@ -43,6 +43,10 @@
#include <nuttx/net/netdev.h>
#include <nuttx/net/ioctl.h>
+#if defined(CONFIG_ARCH_PHY_INTERRUPT)
+# include <nuttx/net/phy.h>
+#endif
+
#ifdef CONFIG_NET_PKT
# include <nuttx/net/pkt.h>
#endif
@@ -87,7 +91,7 @@
/* PHY Reset Timeout - in ms */
-#define LITEX_PHY_RESETTIMEOUT (20)
+#define LITEX_PHY_RESETTIMEOUT (20 * 1000)
/* LITEX MDIO register bit definitions */
@@ -208,6 +212,9 @@ static int litex_phyread(struct litex_emac_s *priv,
uint8_t phyaddr,
static int litex_phywrite(struct litex_emac_s *priv, uint8_t phyaddr,
uint8_t regaddr, uint16_t phyval);
#endif
+#ifdef CONFIG_ARCH_PHY_INTERRUPT
+static int litex_phyintenable(struct litex_emac_s *priv);
+#endif
#if defined(CONFIG_DEBUG_NET) && defined(CONFIG_DEBUG_INFO)
static void litex_phydump(struct litex_emac_s *priv);
#else
@@ -832,7 +839,7 @@ static int litex_ifup(struct net_driver_s *dev)
ret = litex_linkup(priv);
if (ret != 0)
{
- nerr("ERROR: Failed to wait LINK UP error=%d\n", ret);
+ nerr("ERROR: Failed to wait LINK UP error= %d\n", ret);
return ret;
}
@@ -885,9 +892,6 @@ static int litex_ifdown(struct net_driver_s *dev)
wd_cancel(&priv->txpoll);
wd_cancel(&priv->txtimeout);
- /* Hold the PHY device in reset and mark the interface as "down" */
-
- putreg32(1, LITEX_ETHPHY_CRG_RESET);
priv->ifup = false;
leave_critical_section(flags);
@@ -1238,6 +1242,31 @@ static int litex_phyfind(struct litex_emac_s *priv,
uint8_t phyaddr)
return OK;
}
+/****************************************************************************
+ * Function: litex_phyintenable
+ *
+ * Description:
+ * Enable link up/down PHY interrupts.
+ *
+ * Input Parameters:
+ * priv - A reference to the private driver state structure
+ *
+ * Returned Value:
+ * Can currenly only return OK
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_ARCH_PHY_INTERRUPT
+static int litex_phyintenable(struct litex_emac_s *priv)
+{
+ uint16_t value;
+ litex_phyread(priv, priv->phyaddr, BOARD_PHY_INT_REG, &value);
+ value |= BOARD_PHY_SETEN;
+ litex_phywrite(priv, priv->phyaddr, BOARD_PHY_INT_REG, value);
+ return OK;
+}
+#endif
+
/****************************************************************************
* Function: litex_phyinit
*
@@ -1341,6 +1370,24 @@ static int litex_ioctl(struct net_driver_s *dev, int
cmd, unsigned long arg)
req->reg_num, req->val_in);
}
break;
+
+#ifdef CONFIG_ARCH_PHY_INTERRUPT
+ case SIOCMIINOTIFY:
+ {
+ struct mii_ioctl_notify_s *req =
+ (struct mii_ioctl_notify_s *)((uintptr_t)arg);
+
+ ret = phy_notify_subscribe(dev->d_ifname, req->pid, &req->event);
+ if (ret == OK)
+ {
+ /* Enable PHY link up/down interrupts */
+
+ ret = litex_phyintenable(priv);
+ }
+ }
+ break;
+#endif
+
#endif /* ifdef CONFIG_NETDEV_PHY_IOCTL */
default: