1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
7 #include <linux/notifier.h>
8 #include <linux/skbuff.h>
9 #include <linux/workqueue.h>
10 #include <net/devlink.h>
11 #include <uapi/linux/if_ether.h>
13 #define PRESTERA_DRV_NAME "prestera"
15 struct prestera_fw_rev
{
21 struct prestera_port_stats
{
22 u64 good_octets_received
;
23 u64 bad_octets_received
;
25 u64 broadcast_frames_received
;
26 u64 multicast_frames_received
;
28 u64 frames_65_to_127_octets
;
29 u64 frames_128_to_255_octets
;
30 u64 frames_256_to_511_octets
;
31 u64 frames_512_to_1023_octets
;
32 u64 frames_1024_to_max_octets
;
33 u64 excessive_collision
;
34 u64 multicast_frames_sent
;
35 u64 broadcast_frames_sent
;
43 u64 rx_error_frame_received
;
47 u64 unicast_frames_received
;
48 u64 unicast_frames_sent
;
54 struct prestera_port_caps
{
61 struct prestera_port
{
62 struct net_device
*dev
;
63 struct prestera_switch
*sw
;
64 struct devlink_port dl_port
;
72 struct prestera_port_caps caps
;
73 struct list_head list
;
75 struct prestera_port_stats stats
;
76 struct delayed_work caching_dw
;
80 struct prestera_device
{
84 struct prestera_fw_rev fw_rev
;
87 /* called by device driver to handle received packets */
88 void (*recv_pkt
)(struct prestera_device
*dev
);
90 /* called by device driver to pass event up to the higher layer */
91 int (*recv_msg
)(struct prestera_device
*dev
, void *msg
, size_t size
);
93 /* called by higher layer to send request to the firmware */
94 int (*send_req
)(struct prestera_device
*dev
, void *in_msg
,
95 size_t in_size
, void *out_msg
, size_t out_size
,
99 enum prestera_event_type
{
100 PRESTERA_EVENT_TYPE_UNSPEC
,
102 PRESTERA_EVENT_TYPE_PORT
,
103 PRESTERA_EVENT_TYPE_RXTX
,
105 PRESTERA_EVENT_TYPE_MAX
108 enum prestera_rxtx_event_id
{
109 PRESTERA_RXTX_EVENT_UNSPEC
,
110 PRESTERA_RXTX_EVENT_RCV_PKT
,
113 enum prestera_port_event_id
{
114 PRESTERA_PORT_EVENT_UNSPEC
,
115 PRESTERA_PORT_EVENT_STATE_CHANGED
,
118 struct prestera_port_event
{
125 struct prestera_event
{
128 struct prestera_port_event port_evt
;
132 struct prestera_rxtx
;
134 struct prestera_switch
{
135 struct prestera_device
*dev
;
136 struct prestera_rxtx
*rxtx
;
137 struct list_head event_handlers
;
138 char base_mac
[ETH_ALEN
];
139 struct list_head port_list
;
140 rwlock_t port_list_lock
;
147 struct prestera_rxtx_params
{
152 #define prestera_dev(sw) ((sw)->dev->dev)
154 static inline void prestera_write(const struct prestera_switch
*sw
,
155 unsigned int reg
, u32 val
)
157 writel(val
, sw
->dev
->pp_regs
+ reg
);
160 static inline u32
prestera_read(const struct prestera_switch
*sw
,
163 return readl(sw
->dev
->pp_regs
+ reg
);
166 int prestera_device_register(struct prestera_device
*dev
);
167 void prestera_device_unregister(struct prestera_device
*dev
);
169 struct prestera_port
*prestera_port_find_by_hwid(struct prestera_switch
*sw
,
170 u32 dev_id
, u32 hw_id
);
172 #endif /* _PRESTERA_H_ */