]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/net/ethernet/marvell/prestera/prestera.h
0a34d7ca482380e6e935ea5617abf98831facb7e
[mirror_ubuntu-jammy-kernel.git] / drivers / net / ethernet / marvell / prestera / prestera.h
1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved. */
3
4 #ifndef _PRESTERA_H_
5 #define _PRESTERA_H_
6
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>
12
13 #define PRESTERA_DRV_NAME "prestera"
14
15 struct prestera_fw_rev {
16 u16 maj;
17 u16 min;
18 u16 sub;
19 };
20
21 struct prestera_port_stats {
22 u64 good_octets_received;
23 u64 bad_octets_received;
24 u64 mac_trans_error;
25 u64 broadcast_frames_received;
26 u64 multicast_frames_received;
27 u64 frames_64_octets;
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;
36 u64 fc_sent;
37 u64 fc_received;
38 u64 buffer_overrun;
39 u64 undersize;
40 u64 fragments;
41 u64 oversize;
42 u64 jabber;
43 u64 rx_error_frame_received;
44 u64 bad_crc;
45 u64 collisions;
46 u64 late_collision;
47 u64 unicast_frames_received;
48 u64 unicast_frames_sent;
49 u64 sent_multiple;
50 u64 sent_deferred;
51 u64 good_octets_sent;
52 };
53
54 struct prestera_port_caps {
55 u64 supp_link_modes;
56 u8 supp_fec;
57 u8 type;
58 u8 transceiver;
59 };
60
61 struct prestera_port {
62 struct net_device *dev;
63 struct prestera_switch *sw;
64 struct devlink_port dl_port;
65 u32 id;
66 u32 hw_id;
67 u32 dev_id;
68 u16 fp_id;
69 bool autoneg;
70 u64 adver_link_modes;
71 u8 adver_fec;
72 struct prestera_port_caps caps;
73 struct list_head list;
74 struct {
75 struct prestera_port_stats stats;
76 struct delayed_work caching_dw;
77 } cached_hw_stats;
78 };
79
80 struct prestera_device {
81 struct device *dev;
82 u8 __iomem *ctl_regs;
83 u8 __iomem *pp_regs;
84 struct prestera_fw_rev fw_rev;
85 void *priv;
86
87 /* called by device driver to handle received packets */
88 void (*recv_pkt)(struct prestera_device *dev);
89
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);
92
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,
96 unsigned int wait);
97 };
98
99 enum prestera_event_type {
100 PRESTERA_EVENT_TYPE_UNSPEC,
101
102 PRESTERA_EVENT_TYPE_PORT,
103 PRESTERA_EVENT_TYPE_RXTX,
104
105 PRESTERA_EVENT_TYPE_MAX
106 };
107
108 enum prestera_rxtx_event_id {
109 PRESTERA_RXTX_EVENT_UNSPEC,
110 PRESTERA_RXTX_EVENT_RCV_PKT,
111 };
112
113 enum prestera_port_event_id {
114 PRESTERA_PORT_EVENT_UNSPEC,
115 PRESTERA_PORT_EVENT_STATE_CHANGED,
116 };
117
118 struct prestera_port_event {
119 u32 port_id;
120 union {
121 u32 oper_state;
122 } data;
123 };
124
125 struct prestera_event {
126 u16 id;
127 union {
128 struct prestera_port_event port_evt;
129 };
130 };
131
132 struct prestera_rxtx;
133
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;
141 u32 port_count;
142 u32 mtu_min;
143 u32 mtu_max;
144 u8 id;
145 };
146
147 struct prestera_rxtx_params {
148 bool use_sdma;
149 u32 map_addr;
150 };
151
152 #define prestera_dev(sw) ((sw)->dev->dev)
153
154 static inline void prestera_write(const struct prestera_switch *sw,
155 unsigned int reg, u32 val)
156 {
157 writel(val, sw->dev->pp_regs + reg);
158 }
159
160 static inline u32 prestera_read(const struct prestera_switch *sw,
161 unsigned int reg)
162 {
163 return readl(sw->dev->pp_regs + reg);
164 }
165
166 int prestera_device_register(struct prestera_device *dev);
167 void prestera_device_unregister(struct prestera_device *dev);
168
169 struct prestera_port *prestera_port_find_by_hwid(struct prestera_switch *sw,
170 u32 dev_id, u32 hw_id);
171
172 #endif /* _PRESTERA_H_ */