/* SPDX-License-Identifier: GPL-2.0 */ /* Marvell Octeon EP (EndPoint) Ethernet Driver * * Copyright (C) 2020 Marvell. * */ #ifndef __OCTEP_CTRL_NET_H__ #define __OCTEP_CTRL_NET_H__ #include "octep_cp_version.h" #define OCTEP_CTRL_NET_INVALID_VFID (-1) /* Supported commands */ enum octep_ctrl_net_cmd { OCTEP_CTRL_NET_CMD_GET = 0, OCTEP_CTRL_NET_CMD_SET, }; /* Supported states */ enum octep_ctrl_net_state { OCTEP_CTRL_NET_STATE_DOWN = 0, OCTEP_CTRL_NET_STATE_UP, }; /* Supported replies */ enum octep_ctrl_net_reply { OCTEP_CTRL_NET_REPLY_OK = 0, OCTEP_CTRL_NET_REPLY_GENERIC_FAIL, OCTEP_CTRL_NET_REPLY_INVALID_PARAM, }; /* Supported host to fw commands */ enum octep_ctrl_net_h2f_cmd { OCTEP_CTRL_NET_H2F_CMD_INVALID = 0, OCTEP_CTRL_NET_H2F_CMD_MTU, OCTEP_CTRL_NET_H2F_CMD_MAC, OCTEP_CTRL_NET_H2F_CMD_GET_IF_STATS, OCTEP_CTRL_NET_H2F_CMD_GET_XSTATS, OCTEP_CTRL_NET_H2F_CMD_GET_Q_STATS, OCTEP_CTRL_NET_H2F_CMD_LINK_STATUS, OCTEP_CTRL_NET_H2F_CMD_RX_STATE, OCTEP_CTRL_NET_H2F_CMD_LINK_INFO, OCTEP_CTRL_NET_H2F_CMD_GET_INFO, OCTEP_CTRL_NET_H2F_CMD_DEV_REMOVE, OCTEP_CTRL_NET_H2F_CMD_OFFLOADS, OCTEP_CTRL_NET_H2F_CMD_MAX }; /* Supported fw to host commands */ enum octep_ctrl_net_f2h_cmd { OCTEP_CTRL_NET_F2H_CMD_INVALID = 0, OCTEP_CTRL_NET_F2H_CMD_LINK_STATUS, OCTEP_CTRL_NET_F2H_CMD_MAX }; union octep_ctrl_net_req_hdr { u64 words[1]; struct { /* sender id */ u16 sender; /* receiver id */ u16 receiver; /* octep_ctrl_net_h2t_cmd */ u16 cmd; /* reserved */ u16 rsvd0; } s; }; /* get/set mtu request */ struct octep_ctrl_net_h2f_req_cmd_mtu { /* enum octep_ctrl_net_cmd */ u16 cmd; /* 0-65535 */ u16 val; }; /* get/set mac request */ struct octep_ctrl_net_h2f_req_cmd_mac { /* enum octep_ctrl_net_cmd */ u16 cmd; /* xx:xx:xx:xx:xx:xx */ u8 addr[ETH_ALEN]; }; /* get/set link state, rx state */ struct octep_ctrl_net_h2f_req_cmd_state { /* enum octep_ctrl_net_cmd */ u16 cmd; /* enum octep_ctrl_net_state */ u16 state; }; /* link info */ struct octep_ctrl_net_link_info { /* Bitmap of Supported link speeds/modes */ u64 supported_modes; /* Bitmap of Advertised link speeds/modes */ u64 advertised_modes; /* Autonegotation state; bit 0=disabled; bit 1=enabled */ u8 autoneg; /* Pause frames setting. bit 0=disabled; bit 1=enabled */ u8 pause; /* Negotiated link speed in Mbps */ u32 speed; }; /* get/set link info */ struct octep_ctrl_net_h2f_req_cmd_link_info { /* enum octep_ctrl_net_cmd */ u16 cmd; /* struct octep_ctrl_net_link_info */ struct octep_ctrl_net_link_info info; }; /* offloads */ struct octep_ctrl_net_offloads { /* supported rx offloads OCTEP_RX_OFFLOAD_* */ u16 rx_offloads; /* supported tx offloads OCTEP_TX_OFFLOAD_* */ u16 tx_offloads; /* reserved */ u32 reserved_offloads; /* extra offloads */ u64 ext_offloads; }; /* get/set offloads */ struct octep_ctrl_net_h2f_req_cmd_offloads { /* enum octep_ctrl_net_cmd */ u16 cmd; /* struct octep_ctrl_net_offloads */ struct octep_ctrl_net_offloads offloads; }; /* Host to fw request data */ struct octep_ctrl_net_h2f_req { union octep_ctrl_net_req_hdr hdr; union { struct octep_ctrl_net_h2f_req_cmd_mtu mtu; struct octep_ctrl_net_h2f_req_cmd_mac mac; struct octep_ctrl_net_h2f_req_cmd_state link; struct octep_ctrl_net_h2f_req_cmd_state rx; struct octep_ctrl_net_h2f_req_cmd_link_info link_info; struct octep_ctrl_net_h2f_req_cmd_offloads offloads; }; } __packed; union octep_ctrl_net_resp_hdr { u64 words[1]; struct { /* sender id */ u16 sender; /* receiver id */ u16 receiver; /* octep_ctrl_net_h2t_cmd */ u16 cmd; /* octep_ctrl_net_reply */ u16 reply; } s; }; /* get mtu response */ struct octep_ctrl_net_h2f_resp_cmd_mtu { /* 0-65535 */ u16 val; }; /* get mac response */ struct octep_ctrl_net_h2f_resp_cmd_mac { /* xx:xx:xx:xx:xx:xx */ u8 addr[ETH_ALEN]; }; /* get if_stats, xstats, q_stats request */ struct octep_ctrl_net_h2f_resp_cmd_get_stats { struct octep_iface_rx_stats rx_stats; struct octep_iface_tx_stats tx_stats; }; /* get link state, rx state response */ struct octep_ctrl_net_h2f_resp_cmd_state { /* enum octep_ctrl_net_state */ u16 state; }; /* get info request */ struct octep_ctrl_net_h2f_resp_cmd_get_info { struct octep_fw_info fw_info; }; /* Host to fw response data */ struct octep_ctrl_net_h2f_resp { union octep_ctrl_net_resp_hdr hdr; union { struct octep_ctrl_net_h2f_resp_cmd_mtu mtu; struct octep_ctrl_net_h2f_resp_cmd_mac mac; struct octep_ctrl_net_h2f_resp_cmd_get_stats if_stats; struct octep_ctrl_net_h2f_resp_cmd_state link; struct octep_ctrl_net_h2f_resp_cmd_state rx; struct octep_ctrl_net_link_info link_info; struct octep_ctrl_net_h2f_resp_cmd_get_info info; struct octep_ctrl_net_offloads offloads; }; } __packed; /* link state notofication */ struct octep_ctrl_net_f2h_req_cmd_state { /* enum octep_ctrl_net_state */ u16 state; }; /* Fw to host request data */ struct octep_ctrl_net_f2h_req { union octep_ctrl_net_req_hdr hdr; union { struct octep_ctrl_net_f2h_req_cmd_state link; }; }; /* Fw to host response data */ struct octep_ctrl_net_f2h_resp { union octep_ctrl_net_resp_hdr hdr; }; /* Max data size to be transferred over mbox */ union octep_ctrl_net_max_data { struct octep_ctrl_net_h2f_req h2f_req; struct octep_ctrl_net_h2f_resp h2f_resp; struct octep_ctrl_net_f2h_req f2h_req; struct octep_ctrl_net_f2h_resp f2h_resp; }; struct octep_ctrl_net_wait_data { struct list_head list; int done; struct octep_ctrl_mbox_msg msg; union { struct octep_ctrl_net_h2f_req req; struct octep_ctrl_net_h2f_resp resp; } data; }; /** * octep_ctrl_net_init() - Initialize data for ctrl net. * * @oct: non-null pointer to struct octep_device. * * return value: 0 on success, -errno on error. */ int octep_ctrl_net_init(struct octep_device *oct); /** * octep_ctrl_net_get_link_status() - Get link status from firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * * return value: link status 0=down, 1=up. */ int octep_ctrl_net_get_link_status(struct octep_device *oct, int vfid); /** * octep_ctrl_net_set_link_status() - Set link status in firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @up: boolean status. * @wait_for_response: poll for response. * * return value: 0 on success, -errno on failure */ int octep_ctrl_net_set_link_status(struct octep_device *oct, int vfid, bool up, bool wait_for_response); /** * octep_ctrl_net_set_rx_state() - Set rx state in firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @up: boolean status. * @wait_for_response: poll for response. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_set_rx_state(struct octep_device *oct, int vfid, bool up, bool wait_for_response); /** * octep_ctrl_net_get_mac_addr() - Get mac address from firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @addr: non-null pointer to mac address. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_get_mac_addr(struct octep_device *oct, int vfid, u8 *addr); /** * octep_ctrl_net_set_mac_addr() - Set mac address in firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @addr: non-null pointer to mac address. * @wait_for_response: poll for response. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_set_mac_addr(struct octep_device *oct, int vfid, u8 *addr, bool wait_for_response); /** * octep_ctrl_net_get_mtu() - Get max MTU from firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * * return value: mtu on success, -errno on failure. */ int octep_ctrl_net_get_mtu(struct octep_device *oct, int vfid); /** * octep_ctrl_net_set_mtu() - Set mtu in firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @mtu: mtu. * @wait_for_response: poll for response. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_set_mtu(struct octep_device *oct, int vfid, int mtu, bool wait_for_response); /** * octep_ctrl_net_get_if_stats() - Get interface statistics from firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @rx_stats: non-null pointer struct octep_iface_rx_stats. * @tx_stats: non-null pointer struct octep_iface_tx_stats. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_get_if_stats(struct octep_device *oct, int vfid, struct octep_iface_rx_stats *rx_stats, struct octep_iface_tx_stats *tx_stats); /** * octep_ctrl_net_get_link_info() - Get link info from firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @link_info: non-null pointer to struct octep_iface_link_info. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_get_link_info(struct octep_device *oct, int vfid, struct octep_iface_link_info *link_info); /** * octep_ctrl_net_set_link_info() - Set link info in firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @link_info: non-null pointer to struct octep_iface_link_info. * @wait_for_response: poll for response. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_set_link_info(struct octep_device *oct, int vfid, struct octep_iface_link_info *link_info, bool wait_for_response); /** * octep_ctrl_net_recv_fw_messages() - Poll for firmware messages and process them. * * @oct: non-null pointer to struct octep_device. */ void octep_ctrl_net_recv_fw_messages(struct octep_device *oct); /** * octep_ctrl_net_get_info() - Get info from firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @info: non-null pointer to struct octep_fw_info. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_get_info(struct octep_device *oct, int vfid, struct octep_fw_info *info); /** * octep_ctrl_net_dev_remove() - Indicate to firmware that a device unload has happened. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_dev_remove(struct octep_device *oct, int vfid); /** * octep_ctrl_net_set_offloads() - Set offloads in firmware. * * @oct: non-null pointer to struct octep_device. * @vfid: Index of virtual function. * @offloads: non-null pointer to struct octep_ctrl_net_offloads. * @wait_for_response: poll for response. * * return value: 0 on success, -errno on failure. */ int octep_ctrl_net_set_offloads(struct octep_device *oct, int vfid, struct octep_ctrl_net_offloads *offloads, bool wait_for_response); /** * octep_ctrl_net_uninit() - Uninitialize data for ctrl net. * * @oct: non-null pointer to struct octep_device. * * return value: 0 on success, -errno on error. */ int octep_ctrl_net_uninit(struct octep_device *oct); #endif /* __OCTEP_CTRL_NET_H__ */