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 */
15enum octep_ctrl_net_cmd {
16 OCTEP_CTRL_NET_CMD_GET = 0,
17 OCTEP_CTRL_NET_CMD_SET,
18};
19
20/* Supported states */
21enum octep_ctrl_net_state {
22 OCTEP_CTRL_NET_STATE_DOWN = 0,
23 OCTEP_CTRL_NET_STATE_UP,
24};
25
26/* Supported replies */
27enum 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 */
34enum 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 */
51enum 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
57union 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 */
72struct 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 */
80struct 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 */
88struct 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 */
96struct 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 */
110struct 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 */
118struct 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 */
130struct 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 */
138struct 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
150union 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 */
165struct octep_ctrl_net_h2f_resp_cmd_mtu {
166 /* 0-65535 */
167 u16 val;
168};
169
170/* get mac response */
171struct 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 */
177struct 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 */
183struct octep_ctrl_net_h2f_resp_cmd_state {
184 /* enum octep_ctrl_net_state */
185 u16 state;
186};
187
188/* get info request */
189struct octep_ctrl_net_h2f_resp_cmd_get_info {
190 struct octep_fw_info fw_info;
191};
192
193/* Host to fw response data */
194struct 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 */
209struct octep_ctrl_net_f2h_req_cmd_state {
210 /* enum octep_ctrl_net_state */
211 u16 state;
212};
213
214/* Fw to host request data */
215struct 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 */
223struct octep_ctrl_net_f2h_resp {
224 union octep_ctrl_net_resp_hdr hdr;
225};
226
227/* Max data size to be transferred over mbox */
228union 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
235struct 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 */
252int 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 */
262int 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 */
274int 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 */
287int 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 */
299int 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 */
311int 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 */
322int 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 */
334int 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 */
347int 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 */
360int 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 */
373int 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 */
383void 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 */
394int 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 */
405int 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 */
417int 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 */
428int octep_ctrl_net_uninit(struct octep_device *oct);
429
430#endif /* __OCTEP_CTRL_NET_H__ */
431

source code of linux/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h