431 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/* Marvell Octeon EP (EndPoint) Ethernet Driver3 *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_MAX48};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_MAX55};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 failure273 */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