arch/risc-v/src/mpfs: Add ksz9477 initialization
This adds initialization of the ksz9477 switch when used instead of a PHY, directly connected to SGMII Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
parent
b343f5c0e7
commit
a6388b8843
@ -652,6 +652,8 @@ config MPFS_MAC_NO_BROADCAST
|
|||||||
|
|
||||||
config MPFS_MAC_AUTONEG
|
config MPFS_MAC_AUTONEG
|
||||||
bool "Use autonegotiation"
|
bool "Use autonegotiation"
|
||||||
|
depends on !MPFS_ETH0_PHY_KSZ9477
|
||||||
|
depends on !MPFS_ETH1_PHY_KSZ9477
|
||||||
default y
|
default y
|
||||||
---help---
|
---help---
|
||||||
Use PHY autonegotiation to determine speed and mode
|
Use PHY autonegotiation to determine speed and mode
|
||||||
@ -670,6 +672,34 @@ config MPFS_PHYINIT
|
|||||||
---help---
|
---help---
|
||||||
call mpfs_phy_boardinitialize() on init
|
call mpfs_phy_boardinitialize() on init
|
||||||
|
|
||||||
|
config MPFS_ETH0_PHY_KSZ9477
|
||||||
|
bool "Use ksz9477 switch as an SGMII PHY for ETH0"
|
||||||
|
default n
|
||||||
|
select NET_KSZ9477
|
||||||
|
---help---
|
||||||
|
Select to use ksz9477 connected to SGMII
|
||||||
|
|
||||||
|
config MPFS_ETH1_PHY_KSZ9477
|
||||||
|
bool "Use ksz9477 switch as an SGMII PHY for ETH1"
|
||||||
|
default n
|
||||||
|
select NET_KSZ9477
|
||||||
|
---help---
|
||||||
|
Select to use ksz9477 connected to SGMII
|
||||||
|
|
||||||
|
config MPFS_ETH0_PHY_KSZ9477_I2C_BUS
|
||||||
|
int "Management I2C bus number for ksz9477 switch"
|
||||||
|
depends on MPFS_ETH0_PHY_KSZ9477
|
||||||
|
default 5
|
||||||
|
---help---
|
||||||
|
The i2c port number for switch management
|
||||||
|
|
||||||
|
config MPFS_ETH1_PHY_KSZ9477_I2C_BUS
|
||||||
|
int "Management I2C bus number for ksz9477 switch"
|
||||||
|
depends on MPFS_ETH1_PHY_KSZ9477
|
||||||
|
default 5
|
||||||
|
---help---
|
||||||
|
The i2c port number for switch management
|
||||||
|
|
||||||
if !MPFS_MAC_AUTONEG
|
if !MPFS_MAC_AUTONEG
|
||||||
|
|
||||||
config MPFS_MAC_ETHFD
|
config MPFS_MAC_ETHFD
|
||||||
@ -681,6 +711,7 @@ config MPFS_MAC_ETHFD
|
|||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "MAC Speed"
|
prompt "MAC Speed"
|
||||||
|
default MPFS_MAC_ETH1000MBPS if MPFS_ETH0_PHY_KSZ9477 || MPFS_ETH1_PHY_KSZ9477
|
||||||
default MPFS_MAC_ETH100MBPS
|
default MPFS_MAC_ETH100MBPS
|
||||||
---help---
|
---help---
|
||||||
If autonegotiation is not used, then you must select the fixed speed
|
If autonegotiation is not used, then you must select the fixed speed
|
||||||
|
@ -50,10 +50,31 @@
|
|||||||
# include <nuttx/net/pkt.h>
|
# include <nuttx/net/pkt.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <nuttx/net/ksz9477.h>
|
||||||
|
|
||||||
#include "riscv_internal.h"
|
#include "riscv_internal.h"
|
||||||
#include "mpfs_memorymap.h"
|
#include "mpfs_memorymap.h"
|
||||||
#include "mpfs_ethernet.h"
|
#include "mpfs_ethernet.h"
|
||||||
#include "mpfs_dsn.h"
|
#include "mpfs_dsn.h"
|
||||||
|
#include "mpfs_i2c.h"
|
||||||
|
|
||||||
|
#if defined(CONFIG_MPFS_ETH0_PHY_KSZ9477) ||\
|
||||||
|
defined(CONFIG_MPFS_ETH1_PHY_KSZ9477)
|
||||||
|
# if !defined(CONFIG_MPFS_MAC_SGMII)
|
||||||
|
# error Using KSZ9477 as a PHY requires CONFIG_MPFS_MAC_SGMII to be set
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define ETH_HAS_KSZ_SWITCH
|
||||||
|
|
||||||
|
# ifdef CONFIG_MPFS_ETH0_PHY_KSZ9477
|
||||||
|
# define ETH_PHY_KSZ9477_I2C_BUS CONFIG_MPFS_ETH0_PHY_KSZ9477_I2C_BUS
|
||||||
|
# else
|
||||||
|
# define ETH_PHY_KSZ9477_I2C_BUS CONFIG_MPFS_ETH1_PHY_KSZ9477_I2C_BUS
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
# define ETH_HAS_MDIO_PHY
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_NET) && defined(CONFIG_MPFS_ETHMAC)
|
#if defined(CONFIG_NET) && defined(CONFIG_MPFS_ETHMAC)
|
||||||
|
|
||||||
@ -90,7 +111,7 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CONFIG_MPFS_PHYADDR
|
#if defined(ETH_HAS_MDIO_PHY) && !defined(CONFIG_MPFS_PHYADDR)
|
||||||
# error "CONFIG_MPFS_PHYADDR must be defined in the NuttX configuration"
|
# error "CONFIG_MPFS_PHYADDR must be defined in the NuttX configuration"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -249,7 +270,9 @@ struct mpfs_ethmac_s
|
|||||||
irq_t mac_q_int[MPFS_MAC_QUEUE_COUNT]; /* irq numbers */
|
irq_t mac_q_int[MPFS_MAC_QUEUE_COUNT]; /* irq numbers */
|
||||||
uint8_t ifup : 1; /* true:ifup false:ifdown */
|
uint8_t ifup : 1; /* true:ifup false:ifdown */
|
||||||
uint8_t intf; /* Ethernet interface number */
|
uint8_t intf; /* Ethernet interface number */
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
uint8_t phyaddr; /* PHY address */
|
uint8_t phyaddr; /* PHY address */
|
||||||
|
#endif
|
||||||
struct wdog_s txtimeout; /* TX timeout timer */
|
struct wdog_s txtimeout; /* TX timeout timer */
|
||||||
struct work_s irqwork; /* For deferring interrupt work to the work queue */
|
struct work_s irqwork; /* For deferring interrupt work to the work queue */
|
||||||
struct work_s pollwork; /* For deferring poll work to the work queue */
|
struct work_s pollwork; /* For deferring poll work to the work queue */
|
||||||
@ -333,10 +356,13 @@ static int mpfs_ioctl(struct net_driver_s *dev, int cmd, unsigned long arg);
|
|||||||
|
|
||||||
/* PHY Initialization */
|
/* PHY Initialization */
|
||||||
|
|
||||||
|
static int mpfs_phyinit(struct mpfs_ethmac_s *priv);
|
||||||
|
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
|
|
||||||
static void mpfs_enablemdio(struct mpfs_ethmac_s *priv);
|
static void mpfs_enablemdio(struct mpfs_ethmac_s *priv);
|
||||||
static void mpfs_disablemdio(struct mpfs_ethmac_s *priv);
|
static void mpfs_disablemdio(struct mpfs_ethmac_s *priv);
|
||||||
static int mpfs_phyreset(struct mpfs_ethmac_s *priv);
|
static int mpfs_phyreset(struct mpfs_ethmac_s *priv);
|
||||||
static int mpfs_phyinit(struct mpfs_ethmac_s *priv);
|
|
||||||
static int mpfs_phyread(struct mpfs_ethmac_s *priv, uint8_t phyaddr,
|
static int mpfs_phyread(struct mpfs_ethmac_s *priv, uint8_t phyaddr,
|
||||||
uint8_t regaddr, uint16_t *phyval);
|
uint8_t regaddr, uint16_t *phyval);
|
||||||
static int mpfs_phywrite(struct mpfs_ethmac_s *priv, uint8_t phyaddr,
|
static int mpfs_phywrite(struct mpfs_ethmac_s *priv, uint8_t phyaddr,
|
||||||
@ -345,16 +371,21 @@ static int mpfs_phywait(struct mpfs_ethmac_s *priv);
|
|||||||
static int mpfs_phyfind(struct mpfs_ethmac_s *priv, uint8_t *phyaddr);
|
static int mpfs_phyfind(struct mpfs_ethmac_s *priv, uint8_t *phyaddr);
|
||||||
#ifdef CONFIG_MPFS_MAC_AUTONEG
|
#ifdef CONFIG_MPFS_MAC_AUTONEG
|
||||||
static int mpfs_autonegotiate(struct mpfs_ethmac_s *priv);
|
static int mpfs_autonegotiate(struct mpfs_ethmac_s *priv);
|
||||||
#else
|
|
||||||
static void mpfs_linkspeed(struct mpfs_ethmac_s *priv);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_DEBUG_NET) && defined(CONFIG_DEBUG_INFO)
|
#endif /* ETH_HAS_MDIO_PHY */
|
||||||
|
|
||||||
|
#if defined(CONFIG_DEBUG_NET) && defined(CONFIG_DEBUG_INFO) && \
|
||||||
|
defined(ETH_HAS_MDIO_PHY)
|
||||||
static void mpfs_phydump(struct mpfs_ethmac_s *priv);
|
static void mpfs_phydump(struct mpfs_ethmac_s *priv);
|
||||||
#else
|
#else
|
||||||
# define mpfs_phydump(priv)
|
# define mpfs_phydump(priv)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_MPFS_MAC_AUTONEG
|
||||||
|
static void mpfs_linkspeed(struct mpfs_ethmac_s *priv);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* MAC/DMA Initialization */
|
/* MAC/DMA Initialization */
|
||||||
|
|
||||||
static void mpfs_txreset(struct mpfs_ethmac_s *priv);
|
static void mpfs_txreset(struct mpfs_ethmac_s *priv);
|
||||||
@ -1848,6 +1879,8 @@ static int mpfs_rmmac(struct net_driver_s *dev, const uint8_t *mac)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: mpfs_enablemdio
|
* Function: mpfs_enablemdio
|
||||||
*
|
*
|
||||||
@ -2478,6 +2511,8 @@ errout:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* ETH_HAS_MDIO_PHY */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: mpfs_linkspeed
|
* Function: mpfs_linkspeed
|
||||||
*
|
*
|
||||||
@ -2493,7 +2528,7 @@ errout:
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef CONFIG_MPFS_MAC_AUTONEG
|
#if !defined(CONFIG_MPFS_MAC_AUTONEG) || !defined(ETH_HAS_MDIO_PHY)
|
||||||
static void mpfs_linkspeed(struct mpfs_ethmac_s *priv)
|
static void mpfs_linkspeed(struct mpfs_ethmac_s *priv)
|
||||||
{
|
{
|
||||||
uint32_t regval;
|
uint32_t regval;
|
||||||
@ -2569,7 +2604,7 @@ static void mpfs_linkspeed(struct mpfs_ethmac_s *priv)
|
|||||||
#ifdef CONFIG_NETDEV_IOCTL
|
#ifdef CONFIG_NETDEV_IOCTL
|
||||||
static int mpfs_ioctl(struct net_driver_s *dev, int cmd, unsigned long arg)
|
static int mpfs_ioctl(struct net_driver_s *dev, int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_NETDEV_PHY_IOCTL
|
#if defined(CONFIG_NETDEV_PHY_IOCTL) && defined(ETH_HAS_MDIO_PHY)
|
||||||
struct mpfs_ethmac_s *priv = (struct mpfs_ethmac_s *)dev->d_private;
|
struct mpfs_ethmac_s *priv = (struct mpfs_ethmac_s *)dev->d_private;
|
||||||
#endif
|
#endif
|
||||||
int ret;
|
int ret;
|
||||||
@ -2577,6 +2612,7 @@ static int mpfs_ioctl(struct net_driver_s *dev, int cmd, unsigned long arg)
|
|||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_NETDEV_PHY_IOCTL
|
#ifdef CONFIG_NETDEV_PHY_IOCTL
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
#ifdef CONFIG_ARCH_PHY_INTERRUPT
|
#ifdef CONFIG_ARCH_PHY_INTERRUPT
|
||||||
case SIOCMIINOTIFY: /* Set up for PHY event notifications */
|
case SIOCMIINOTIFY: /* Set up for PHY event notifications */
|
||||||
{
|
{
|
||||||
@ -2640,6 +2676,7 @@ static int mpfs_ioctl(struct net_driver_s *dev, int cmd, unsigned long arg)
|
|||||||
mpfs_disablemdio(priv);
|
mpfs_disablemdio(priv);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif /* ETH_HAS_MDIO_PHY */
|
||||||
#endif /* CONFIG_NETDEV_PHY_IOCTL */
|
#endif /* CONFIG_NETDEV_PHY_IOCTL */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -3214,6 +3251,8 @@ static int mpfs_macenable(struct mpfs_ethmac_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
|
|
||||||
static void mpfs_mdcclock(struct mpfs_ethmac_s *priv)
|
static void mpfs_mdcclock(struct mpfs_ethmac_s *priv)
|
||||||
{
|
{
|
||||||
uint32_t ncfgr;
|
uint32_t ncfgr;
|
||||||
@ -3268,6 +3307,8 @@ static void mpfs_mdcclock(struct mpfs_ethmac_s *priv)
|
|||||||
mac_putreg(priv, NETWORK_CONTROL, ncr);
|
mac_putreg(priv, NETWORK_CONTROL, ncr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: mpfs_phyinit
|
* Function: mpfs_phyinit
|
||||||
*
|
*
|
||||||
@ -3284,7 +3325,9 @@ static void mpfs_mdcclock(struct mpfs_ethmac_s *priv)
|
|||||||
|
|
||||||
static int mpfs_phyinit(struct mpfs_ethmac_s *priv)
|
static int mpfs_phyinit(struct mpfs_ethmac_s *priv)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
|
|
||||||
/* Configure PHY clocking */
|
/* Configure PHY clocking */
|
||||||
|
|
||||||
@ -3303,7 +3346,20 @@ static int mpfs_phyinit(struct mpfs_ethmac_s *priv)
|
|||||||
/* We have a PHY address. Reset the PHY */
|
/* We have a PHY address. Reset the PHY */
|
||||||
|
|
||||||
mpfs_phyreset(priv);
|
mpfs_phyreset(priv);
|
||||||
return OK;
|
|
||||||
|
#elif defined(ETH_HAS_KSZ_SWITCH)
|
||||||
|
struct i2c_master_s *bus;
|
||||||
|
|
||||||
|
bus = mpfs_i2cbus_initialize(ETH_PHY_KSZ9477_I2C_BUS);
|
||||||
|
|
||||||
|
if (bus)
|
||||||
|
{
|
||||||
|
ret = ksz9477_i2c_init(bus, KSZ9477_PORT_SGMII);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -3322,6 +3378,8 @@ static int mpfs_phyinit(struct mpfs_ethmac_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef ETH_HAS_MDIO_PHY
|
||||||
|
|
||||||
static int mpfs_phyreset(struct mpfs_ethmac_s *priv)
|
static int mpfs_phyreset(struct mpfs_ethmac_s *priv)
|
||||||
{
|
{
|
||||||
uint16_t mcr;
|
uint16_t mcr;
|
||||||
@ -3391,6 +3449,8 @@ static int mpfs_phyreset(struct mpfs_ethmac_s *priv)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: mpfs_ethconfig
|
* Function: mpfs_ethconfig
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user