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 <stuart.ia...@motec.com.au>
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:

Reply via email to