Commit 0a9003f4 authored by Oleksandr Mazur's avatar Oleksandr Mazur Committed by David S. Miller

net: marvell: prestera: devlink: add traps/groups implementation

Add devlink traps registration (with corresponding groups) for
all the traffic types that driver traps to the CPU;
prestera_rxtx: report each packet trapped to the CPU (RX) to the
prestera_devlink;
Signed-off-by: default avatarOleksandr Mazur <oleksandr.mazur@plvision.eu>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7a4f5479
...@@ -170,6 +170,7 @@ struct prestera_event { ...@@ -170,6 +170,7 @@ struct prestera_event {
struct prestera_switchdev; struct prestera_switchdev;
struct prestera_rxtx; struct prestera_rxtx;
struct prestera_trap_data;
struct prestera_switch { struct prestera_switch {
struct prestera_device *dev; struct prestera_device *dev;
...@@ -177,6 +178,7 @@ struct prestera_switch { ...@@ -177,6 +178,7 @@ struct prestera_switch {
struct prestera_rxtx *rxtx; struct prestera_rxtx *rxtx;
struct list_head event_handlers; struct list_head event_handlers;
struct notifier_block netdev_nb; struct notifier_block netdev_nb;
struct prestera_trap_data *trap_data;
char base_mac[ETH_ALEN]; char base_mac[ETH_ALEN];
struct list_head port_list; struct list_head port_list;
rwlock_t port_list_lock; rwlock_t port_list_lock;
......
...@@ -20,4 +20,7 @@ void prestera_devlink_port_clear(struct prestera_port *port); ...@@ -20,4 +20,7 @@ void prestera_devlink_port_clear(struct prestera_port *port);
struct devlink_port *prestera_devlink_get_port(struct net_device *dev); struct devlink_port *prestera_devlink_get_port(struct net_device *dev);
void prestera_devlink_trap_report(struct prestera_port *port,
struct sk_buff *skb, u8 cpu_code);
#endif /* _PRESTERA_DEVLINK_H_ */ #endif /* _PRESTERA_DEVLINK_H_ */
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#define PRESTERA_DSA_W1_EXT_BIT BIT(31) #define PRESTERA_DSA_W1_EXT_BIT BIT(31)
#define PRESTERA_DSA_W1_CFI_BIT BIT(30) #define PRESTERA_DSA_W1_CFI_BIT BIT(30)
#define PRESTERA_DSA_W1_PORT_NUM GENMASK(11, 10) #define PRESTERA_DSA_W1_PORT_NUM GENMASK(11, 10)
#define PRESTERA_DSA_W1_MASK_CPU_CODE GENMASK(7, 0)
#define PRESTERA_DSA_W2_EXT_BIT BIT(31) #define PRESTERA_DSA_W2_EXT_BIT BIT(31)
#define PRESTERA_DSA_W2_PORT_NUM BIT(20) #define PRESTERA_DSA_W2_PORT_NUM BIT(20)
...@@ -74,6 +75,8 @@ int prestera_dsa_parse(struct prestera_dsa *dsa, const u8 *dsa_buf) ...@@ -74,6 +75,8 @@ int prestera_dsa_parse(struct prestera_dsa *dsa, const u8 *dsa_buf)
(FIELD_GET(PRESTERA_DSA_W1_PORT_NUM, words[1]) << 5) | (FIELD_GET(PRESTERA_DSA_W1_PORT_NUM, words[1]) << 5) |
(FIELD_GET(PRESTERA_DSA_W2_PORT_NUM, words[2]) << 7); (FIELD_GET(PRESTERA_DSA_W2_PORT_NUM, words[2]) << 7);
dsa->cpu_code = FIELD_GET(PRESTERA_DSA_W1_MASK_CPU_CODE, words[1]);
return 0; return 0;
} }
......
...@@ -27,6 +27,7 @@ struct prestera_dsa { ...@@ -27,6 +27,7 @@ struct prestera_dsa {
struct prestera_dsa_vlan vlan; struct prestera_dsa_vlan vlan;
u32 hw_dev_num; u32 hw_dev_num;
u32 port_num; u32 port_num;
u8 cpu_code;
}; };
int prestera_dsa_parse(struct prestera_dsa *dsa, const u8 *dsa_buf); int prestera_dsa_parse(struct prestera_dsa *dsa, const u8 *dsa_buf);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "prestera.h" #include "prestera.h"
#include "prestera_hw.h" #include "prestera_hw.h"
#include "prestera_rxtx.h" #include "prestera_rxtx.h"
#include "prestera_devlink.h"
#define PRESTERA_SDMA_WAIT_MUL 10 #define PRESTERA_SDMA_WAIT_MUL 10
...@@ -214,9 +215,10 @@ static struct sk_buff *prestera_sdma_rx_skb_get(struct prestera_sdma *sdma, ...@@ -214,9 +215,10 @@ static struct sk_buff *prestera_sdma_rx_skb_get(struct prestera_sdma *sdma,
static int prestera_rxtx_process_skb(struct prestera_sdma *sdma, static int prestera_rxtx_process_skb(struct prestera_sdma *sdma,
struct sk_buff *skb) struct sk_buff *skb)
{ {
const struct prestera_port *port; struct prestera_port *port;
struct prestera_dsa dsa; struct prestera_dsa dsa;
u32 hw_port, dev_id; u32 hw_port, dev_id;
u8 cpu_code;
int err; int err;
skb_pull(skb, ETH_HLEN); skb_pull(skb, ETH_HLEN);
...@@ -259,6 +261,9 @@ static int prestera_rxtx_process_skb(struct prestera_sdma *sdma, ...@@ -259,6 +261,9 @@ static int prestera_rxtx_process_skb(struct prestera_sdma *sdma,
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tci); __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tci);
} }
cpu_code = dsa.cpu_code;
prestera_devlink_trap_report(port, skb, cpu_code);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment