xref: /linux/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h (revision 24168c5e6dfbdd5b414f048f47f75d64533296ca)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Marvell Octeon EP (EndPoint) Ethernet Driver
3  *
4  * Copyright (C) 2020 Marvell.
5  *
6  */
7 #ifndef __OCTEP_CTRL_NET_H__
8 #define __OCTEP_CTRL_NET_H__
9 
10 #include "octep_cp_version.h"
11 
12 #define OCTEP_CTRL_NET_INVALID_VFID	(-1)
13 
14 /* Supported commands */
15 enum octep_ctrl_net_cmd {
16 	OCTEP_CTRL_NET_CMD_GET = 0,
17 	OCTEP_CTRL_NET_CMD_SET,
18 };
19 
20 /* Supported states */
21 enum octep_ctrl_net_state {
22 	OCTEP_CTRL_NET_STATE_DOWN = 0,
23 	OCTEP_CTRL_NET_STATE_UP,
24 };
25 
26 /* Supported replies */
27 enum octep_ctrl_net_reply {
28 	OCTEP_CTRL_NET_REPLY_OK = 0,
29 	OCTEP_CTRL_NET_REPLY_GENERIC_FAIL,
30 	OCTEP_CTRL_NET_REPLY_INVALID_PARAM,
31 };
32 
33 /* Supported host to fw commands */
34 enum octep_ctrl_net_h2f_cmd {
35 	OCTEP_CTRL_NET_H2F_CMD_INVALID = 0,
36 	OCTEP_CTRL_NET_H2F_CMD_MTU,
37 	OCTEP_CTRL_NET_H2F_CMD_MAC,
38 	OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS,
39 	OCTEP_CTRL_NET_H2F_CMD_GET_XSTATS,
40 	OCTEP_CTRL_NET_H2F_CMD_GET_Q_STATS,
41 	OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS,
42 	OCTEP_CTRL_NET_H2F_CMD_RX_STATE,
43 	OCTEP_CTRL_NET_H2F_CMD_LINK_INFO,
44 	OCTEP_CTRL_NET_H2F_CMD_GET_INFO,
45 	OCTEP_CTRL_NET_H2F_CMD_DEV_REMOVE,
46 	OCTEP_CTRL_NET_H2F_CMD_OFFLOADS,
47 	OCTEP_CTRL_NET_H2F_CMD_MAX
48 };
49 
50 /* Supported fw to host commands */
51 enum octep_ctrl_net_f2h_cmd {
52 	OCTEP_CTRL_NET_F2H_CMD_INVALID = 0,
53 	OCTEP_CTRL_NET_F2H_CMD_LINK_STATUS,
54 	OCTEP_CTRL_NET_F2H_CMD_MAX
55 };
56 
57 union octep_ctrl_net_req_hdr {
58 	u64 words[1];
59 	struct {
60 		/* sender id */
61 		u16 sender;
62 		/* receiver id */
63 		u16 receiver;
64 		/* octep_ctrl_net_h2t_cmd */
65 		u16 cmd;
66 		/* reserved */
67 		u16 rsvd0;
68 	} s;
69 };
70 
71 /* get/set mtu request */
72 struct octep_ctrl_net_h2f_req_cmd_mtu {
73 	/* enum octep_ctrl_net_cmd */
74 	u16 cmd;
75 	/* 0-65535 */
76 	u16 val;
77 };
78 
79 /* get/set mac request */
80 struct octep_ctrl_net_h2f_req_cmd_mac {
81 	/* enum octep_ctrl_net_cmd */
82 	u16 cmd;
83 	/* xx:xx:xx:xx:xx:xx */
84 	u8 addr[ETH_ALEN];
85 };
86 
87 /* get/set link state, rx state */
88 struct octep_ctrl_net_h2f_req_cmd_state {
89 	/* enum octep_ctrl_net_cmd */
90 	u16 cmd;
91 	/* enum octep_ctrl_net_state */
92 	u16 state;
93 };
94 
95 /* link info */
96 struct octep_ctrl_net_link_info {
97 	/* Bitmap of Supported link speeds/modes */
98 	u64 supported_modes;
99 	/* Bitmap of Advertised link speeds/modes */
100 	u64 advertised_modes;
101 	/* Autonegotation state; bit 0=disabled; bit 1=enabled */
102 	u8 autoneg;
103 	/* Pause frames setting. bit 0=disabled; bit 1=enabled */
104 	u8 pause;
105 	/* Negotiated link speed in Mbps */
106 	u32 speed;
107 };
108 
109 /* get/set link info */
110 struct octep_ctrl_net_h2f_req_cmd_link_info {
111 	/* enum octep_ctrl_net_cmd */
112 	u16 cmd;
113 	/* struct octep_ctrl_net_link_info */
114 	struct octep_ctrl_net_link_info info;
115 };
116 
117 /* offloads */
118 struct octep_ctrl_net_offloads {
119 	/* supported rx offloads OCTEP_RX_OFFLOAD_* */
120 	u16 rx_offloads;
121 	/* supported tx offloads OCTEP_TX_OFFLOAD_* */
122 	u16 tx_offloads;
123 	/* reserved */
124 	u32 reserved_offloads;
125 	/* extra offloads */
126 	u64 ext_offloads;
127 };
128 
129 /* get/set offloads */
130 struct octep_ctrl_net_h2f_req_cmd_offloads {
131 	/* enum octep_ctrl_net_cmd */
132 	u16 cmd;
133 	/* struct octep_ctrl_net_offloads */
134 	struct octep_ctrl_net_offloads offloads;
135 };
136 
137 /* Host to fw request data */
138 struct octep_ctrl_net_h2f_req {
139 	union octep_ctrl_net_req_hdr hdr;
140 	union {
141 		struct octep_ctrl_net_h2f_req_cmd_mtu mtu;
142 		struct octep_ctrl_net_h2f_req_cmd_mac mac;
143 		struct octep_ctrl_net_h2f_req_cmd_state link;
144 		struct octep_ctrl_net_h2f_req_cmd_state rx;
145 		struct octep_ctrl_net_h2f_req_cmd_link_info link_info;
146 		struct octep_ctrl_net_h2f_req_cmd_offloads offloads;
147 	};
148 } __packed;
149 
150 union octep_ctrl_net_resp_hdr {
151 	u64 words[1];
152 	struct {
153 		/* sender id */
154 		u16 sender;
155 		/* receiver id */
156 		u16 receiver;
157 		/* octep_ctrl_net_h2t_cmd */
158 		u16 cmd;
159 		/* octep_ctrl_net_reply */
160 		u16 reply;
161 	} s;
162 };
163 
164 /* get mtu response */
165 struct octep_ctrl_net_h2f_resp_cmd_mtu {
166 	/* 0-65535 */
167 	u16 val;
168 };
169 
170 /* get mac response */
171 struct octep_ctrl_net_h2f_resp_cmd_mac {
172 	/* xx:xx:xx:xx:xx:xx */
173 	u8 addr[ETH_ALEN];
174 };
175 
176 /* get if_stats, xstats, q_stats request */
177 struct octep_ctrl_net_h2f_resp_cmd_get_stats {
178 	struct octep_iface_rx_stats rx_stats;
179 	struct octep_iface_tx_stats tx_stats;
180 };
181 
182 /* get link state, rx state response */
183 struct octep_ctrl_net_h2f_resp_cmd_state {
184 	/* enum octep_ctrl_net_state */
185 	u16 state;
186 };
187 
188 /* get info request */
189 struct octep_ctrl_net_h2f_resp_cmd_get_info {
190 	struct octep_fw_info fw_info;
191 };
192 
193 /* Host to fw response data */
194 struct octep_ctrl_net_h2f_resp {
195 	union octep_ctrl_net_resp_hdr hdr;
196 	union {
197 		struct octep_ctrl_net_h2f_resp_cmd_mtu mtu;
198 		struct octep_ctrl_net_h2f_resp_cmd_mac mac;
199 		struct octep_ctrl_net_h2f_resp_cmd_get_stats if_stats;
200 		struct octep_ctrl_net_h2f_resp_cmd_state link;
201 		struct octep_ctrl_net_h2f_resp_cmd_state rx;
202 		struct octep_ctrl_net_link_info link_info;
203 		struct octep_ctrl_net_h2f_resp_cmd_get_info info;
204 		struct octep_ctrl_net_offloads offloads;
205 	};
206 } __packed;
207 
208 /* link state notofication */
209 struct octep_ctrl_net_f2h_req_cmd_state {
210 	/* enum octep_ctrl_net_state */
211 	u16 state;
212 };
213 
214 /* Fw to host request data */
215 struct octep_ctrl_net_f2h_req {
216 	union octep_ctrl_net_req_hdr hdr;
217 	union {
218 		struct octep_ctrl_net_f2h_req_cmd_state link;
219 	};
220 };
221 
222 /* Fw to host response data */
223 struct octep_ctrl_net_f2h_resp {
224 	union octep_ctrl_net_resp_hdr hdr;
225 };
226 
227 /* Max data size to be transferred over mbox */
228 union octep_ctrl_net_max_data {
229 	struct octep_ctrl_net_h2f_req h2f_req;
230 	struct octep_ctrl_net_h2f_resp h2f_resp;
231 	struct octep_ctrl_net_f2h_req f2h_req;
232 	struct octep_ctrl_net_f2h_resp f2h_resp;
233 };
234 
235 struct octep_ctrl_net_wait_data {
236 	struct list_head list;
237 	int done;
238 	struct octep_ctrl_mbox_msg msg;
239 	union {
240 		struct octep_ctrl_net_h2f_req req;
241 		struct octep_ctrl_net_h2f_resp resp;
242 	} data;
243 };
244 
245 /**
246  * octep_ctrl_net_init() - Initialize data for ctrl net.
247  *
248  * @oct: non-null pointer to struct octep_device.
249  *
250  * return value: 0 on success, -errno on error.
251  */
252 int octep_ctrl_net_init(struct octep_device *oct);
253 
254 /**
255  * octep_ctrl_net_get_link_status() - Get link status from firmware.
256  *
257  * @oct: non-null pointer to struct octep_device.
258  * @vfid: Index of virtual function.
259  *
260  * return value: link status 0=down, 1=up.
261  */
262 int octep_ctrl_net_get_link_status(struct octep_device *oct, int vfid);
263 
264 /**
265  * octep_ctrl_net_set_link_status() - Set link status in firmware.
266  *
267  * @oct: non-null pointer to struct octep_device.
268  * @vfid: Index of virtual function.
269  * @up: boolean status.
270  * @wait_for_response: poll for response.
271  *
272  * return value: 0 on success, -errno on failure
273  */
274 int octep_ctrl_net_set_link_status(struct octep_device *oct, int vfid, bool up,
275 				   bool wait_for_response);
276 
277 /**
278  * octep_ctrl_net_set_rx_state() - Set rx state in firmware.
279  *
280  * @oct: non-null pointer to struct octep_device.
281  * @vfid: Index of virtual function.
282  * @up: boolean status.
283  * @wait_for_response: poll for response.
284  *
285  * return value: 0 on success, -errno on failure.
286  */
287 int octep_ctrl_net_set_rx_state(struct octep_device *oct, int vfid, bool up,
288 				bool wait_for_response);
289 
290 /**
291  * octep_ctrl_net_get_mac_addr() - Get mac address from firmware.
292  *
293  * @oct: non-null pointer to struct octep_device.
294  * @vfid: Index of virtual function.
295  * @addr: non-null pointer to mac address.
296  *
297  * return value: 0 on success, -errno on failure.
298  */
299 int octep_ctrl_net_get_mac_addr(struct octep_device *oct, int vfid, u8 *addr);
300 
301 /**
302  * octep_ctrl_net_set_mac_addr() - Set mac address in firmware.
303  *
304  * @oct: non-null pointer to struct octep_device.
305  * @vfid: Index of virtual function.
306  * @addr: non-null pointer to mac address.
307  * @wait_for_response: poll for response.
308  *
309  * return value: 0 on success, -errno on failure.
310  */
311 int octep_ctrl_net_set_mac_addr(struct octep_device *oct, int vfid, u8 *addr,
312 				bool wait_for_response);
313 
314 /**
315  * octep_ctrl_net_get_mtu() - Get max MTU from firmware.
316  *
317  * @oct: non-null pointer to struct octep_device.
318  * @vfid: Index of virtual function.
319  *
320  * return value: mtu on success, -errno on failure.
321  */
322 int octep_ctrl_net_get_mtu(struct octep_device *oct, int vfid);
323 
324 /**
325  * octep_ctrl_net_set_mtu() - Set mtu in firmware.
326  *
327  * @oct: non-null pointer to struct octep_device.
328  * @vfid: Index of virtual function.
329  * @mtu: mtu.
330  * @wait_for_response: poll for response.
331  *
332  * return value: 0 on success, -errno on failure.
333  */
334 int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu,
335 			   bool wait_for_response);
336 
337 /**
338  * octep_ctrl_net_get_if_stats() - Get interface statistics from firmware.
339  *
340  * @oct: non-null pointer to struct octep_device.
341  * @vfid: Index of virtual function.
342  * @rx_stats: non-null pointer struct octep_iface_rx_stats.
343  * @tx_stats: non-null pointer struct octep_iface_tx_stats.
344  *
345  * return value: 0 on success, -errno on failure.
346  */
347 int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid,
348 				struct octep_iface_rx_stats *rx_stats,
349 				struct octep_iface_tx_stats *tx_stats);
350 
351 /**
352  * octep_ctrl_net_get_link_info() - Get link info from firmware.
353  *
354  * @oct: non-null pointer to struct octep_device.
355  * @vfid: Index of virtual function.
356  * @link_info: non-null pointer to struct octep_iface_link_info.
357  *
358  * return value: 0 on success, -errno on failure.
359  */
360 int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid,
361 				 struct octep_iface_link_info *link_info);
362 
363 /**
364  * octep_ctrl_net_set_link_info() - Set link info in firmware.
365  *
366  * @oct: non-null pointer to struct octep_device.
367  * @vfid: Index of virtual function.
368  * @link_info: non-null pointer to struct octep_iface_link_info.
369  * @wait_for_response: poll for response.
370  *
371  * return value: 0 on success, -errno on failure.
372  */
373 int octep_ctrl_net_set_link_info(struct octep_device *oct,
374 				 int vfid,
375 				 struct octep_iface_link_info *link_info,
376 				 bool wait_for_response);
377 
378 /**
379  * octep_ctrl_net_recv_fw_messages() - Poll for firmware messages and process them.
380  *
381  * @oct: non-null pointer to struct octep_device.
382  */
383 void octep_ctrl_net_recv_fw_messages(struct octep_device *oct);
384 
385 /**
386  * octep_ctrl_net_get_info() - Get info from firmware.
387  *
388  * @oct: non-null pointer to struct octep_device.
389  * @vfid: Index of virtual function.
390  * @info: non-null pointer to struct octep_fw_info.
391  *
392  * return value: 0 on success, -errno on failure.
393  */
394 int octep_ctrl_net_get_info(struct octep_device *oct, int vfid,
395 			    struct octep_fw_info *info);
396 
397 /**
398  * octep_ctrl_net_dev_remove() - Indicate to firmware that a device unload has happened.
399  *
400  * @oct: non-null pointer to struct octep_device.
401  * @vfid: Index of virtual function.
402  *
403  * return value: 0 on success, -errno on failure.
404  */
405 int octep_ctrl_net_dev_remove(struct octep_device *oct, int vfid);
406 
407 /**
408  * octep_ctrl_net_set_offloads() - Set offloads in firmware.
409  *
410  * @oct: non-null pointer to struct octep_device.
411  * @vfid: Index of virtual function.
412  * @offloads: non-null pointer to struct octep_ctrl_net_offloads.
413  * @wait_for_response: poll for response.
414  *
415  * return value: 0 on success, -errno on failure.
416  */
417 int octep_ctrl_net_set_offloads(struct octep_device *oct, int vfid,
418 				struct octep_ctrl_net_offloads *offloads,
419 				bool wait_for_response);
420 
421 /**
422  * octep_ctrl_net_uninit() - Uninitialize data for ctrl net.
423  *
424  * @oct: non-null pointer to struct octep_device.
425  *
426  * return value: 0 on success, -errno on error.
427  */
428 int octep_ctrl_net_uninit(struct octep_device *oct);
429 
430 #endif /* __OCTEP_CTRL_NET_H__ */
431