Skip to content

Commit

Permalink
drivers/net/ksz9477: Add port mirroring support
Browse files Browse the repository at this point in the history
Signed-off-by: Jani Paalijarvi <[email protected]>
  • Loading branch information
jpaali committed Jun 25, 2024
1 parent 4139cf5 commit 0b0a41a
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 2 deletions.
9 changes: 9 additions & 0 deletions drivers/net/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,15 @@ config NET_KSZ9477_PORT_VLAN_SGMII
depends on NET_KSZ9477_PORT_VLAN
default 0x1f

config NET_KSZ9477_PORT_SNIFF
bool "Enable support for the port mirroring and snooping"
depends on NET_KSZ9477
default n
---help---
Enables possibility to set rx/tx mirroring and sniffer port.
All the packets received on port A and/or transmitted on port B
can be mirrored on the sniffer port.

menuconfig NET_LAN9250
bool "Microchip LAN9250 support"
default n
Expand Down
48 changes: 46 additions & 2 deletions drivers/net/ksz9477.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ static uint8_t g_port_vlan_config[] =
CONFIG_NET_KSZ9477_PORT_VLAN_SGMII
};

static uint8_t g_port_mirror_config[7] = {0};

Check failure on line 52 in drivers/net/ksz9477.c

View workflow job for this annotation

GitHub Actions / check

Left bracket not on separate line

Check failure on line 52 in drivers/net/ksz9477.c

View workflow job for this annotation

GitHub Actions / check

Right bracket not on separate line

Check failure on line 52 in drivers/net/ksz9477.c

View workflow job for this annotation

GitHub Actions / check

Blank line precedes right brace at line

Check failure on line 53 in drivers/net/ksz9477.c

View workflow job for this annotation

GitHub Actions / check

Blank line follows left brace
#endif

/****************************************************************************
Expand Down Expand Up @@ -101,7 +103,6 @@ static int ksz9477_reg_read32(uint16_t reg, uint32_t *data)
return ret;
}

#if 0 /* Enable when needed */
static int ksz9477_reg_write8(uint16_t reg, uint8_t data)
{
struct ksz9477_transfer_s write_msg;
Expand All @@ -110,7 +111,6 @@ static int ksz9477_reg_write8(uint16_t reg, uint8_t data)
write_msg.data = data;
return ksz9477_write(&write_msg);
}
#endif

static int ksz9477_reg_write32(uint16_t reg, uint32_t data)
{
Expand Down Expand Up @@ -301,6 +301,37 @@ int ksz9477_configure_port_vlan(ksz9477_port_t port, uint8_t disable,
return OK;
}

/****************************************************************************
* Name: ksz9477_configure_port_mirroring
*
* Description:
* Configures the port mirroring and snooping.
* The change will become effective next time when the switch is
* initialized.
*
* Input Parameters:
* port: The port being configured (1-7)
* config: Bitmask to enable/disable rx/tx mirroring, sniffer port.
* See header file or Port Mirroring Control Register
* from datasheet for further details.
*
* Returned Value:
* OK or negative error number
*
****************************************************************************/

int ksz9477_configure_port_mirroring(ksz9477_port_t port, uint8_t config)
{
if (port < KSZ9477_PORT_PHY1 || port > KSZ9477_PORT_SGMII)
{
return -EINVAL;
}

g_port_mirror_config[port - KSZ9477_PORT_PHY1] = config;

return OK;
}

/****************************************************************************
* Name: ksz9477_init
*
Expand Down Expand Up @@ -378,6 +409,19 @@ int ksz9477_init(ksz9477_port_t master_port)
g_port_vlan_config[i]);
}

#endif

#ifdef CONFIG_NET_KSZ9477_PORT_SNIFF

/* Configure the port mirroring and snooping for each port */

for (i = 0; ret == OK && i < 7; i++)
{
ret = ksz9477_reg_write8(
KSZ9477_PORT_MIRROR_CONTROL(KSZ9477_PORT_PHY1 + i),
g_port_mirror_config[i]);
}

#endif

return ret;
Expand Down
12 changes: 12 additions & 0 deletions drivers/net/ksz9477_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,18 @@
#define SGMII_AUTONEG_CONTROL_TC_MASTER (1 << 3)
#define SGMII_AUTONEG_CONTROL_LINK_STATUS (1 << 4)

/* Port Mirroring Control Register */

#define KSZ9477_PORT_MIRROR_CONTROL(p) KSZ9477_PORT_REG(p, 0x800)
#define PORT_MIRROR_SNIFFER_PORT (1 << 1)
#define PORT_MIRROR_TX_SNIFF (1 << 5)
#define PORT_MIRROR_RX_SNIFF (1 << 6)

/* Global Port Mirroring and Snooping Control Register */

#define KSZ9477_GLOBAL_PORT_MIRROR_CONTROL 0x0370
#define GLOBAL_PORT_SNIFF_MODE (1 << 0)

/****************************************************************************
* Public Types
****************************************************************************/
Expand Down
21 changes: 21 additions & 0 deletions include/nuttx/net/ksz9477.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,27 @@ int ksz9477_disable_port_vlan(void);
int ksz9477_configure_port_vlan(ksz9477_port_t port, uint8_t disable,
uint8_t enable);

/****************************************************************************
* Name: ksz9477_configure_port_mirroring
*
* Description:
* Configures the port mirroring and snooping
* The change will become effective next time when the switch is
* initialized.
*
* Input Parameters:
* port: The port being configured (1-7)
* config: Bitmask to enable/disable rx/tx mirroring, sniffer port.
* See header file or Port Mirroring Control Register
* from datasheet for further details.
*
* Returned Value:
* OK or negative error number
*
****************************************************************************/

int ksz9477_configure_port_mirroring(ksz9477_port_t port, uint8_t config);

#if defined(__cplusplus)
}
#endif
Expand Down

0 comments on commit 0b0a41a

Please sign in to comment.