/* 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__ /* 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, }; /* 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, }; struct octep_ctrl_net_req_hdr { /* sender id */ u16 sender; /* receiver id */ u16 receiver; /* octep_ctrl_net_h2t_cmd */ u16 cmd; /* reserved */ u16 rsvd0; }; /* 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 if_stats, xstats, q_stats request */ struct octep_ctrl_net_h2f_req_cmd_get_stats { /* offset into barmem where fw should copy over stats */ u32 offset; }; /* 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; }; /* Host to fw request data */ struct octep_ctrl_net_h2f_req { struct 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_get_stats get_stats; 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; }; } __packed; struct octep_ctrl_net_resp_hdr { /* sender id */ u16 sender; /* receiver id */ u16 receiver; /* octep_ctrl_net_h2t_cmd */ u16 cmd; /* octep_ctrl_net_reply */ u16 reply; }; /* 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 link state, rx state response */ struct octep_ctrl_net_h2f_resp_cmd_state { /* enum octep_ctrl_net_state */ u16 state; }; /* Host to fw response data */ struct octep_ctrl_net_h2f_resp { struct 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_state link; struct octep_ctrl_net_h2f_resp_cmd_state rx; struct octep_ctrl_net_link_info link_info; }; } __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 { struct 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 { struct octep_ctrl_net_resp_hdr hdr; }; /* Size of host to fw octep_ctrl_mbox queue element */ union octep_ctrl_net_h2f_data_sz { struct octep_ctrl_net_h2f_req h2f_req; struct octep_ctrl_net_h2f_resp h2f_resp; }; /* Size of fw to host octep_ctrl_mbox queue element */ union octep_ctrl_net_f2h_data_sz { struct octep_ctrl_net_f2h_req f2h_req; struct octep_ctrl_net_f2h_resp f2h_resp; }; /* size of host to fw data in words */ #define OCTEP_CTRL_NET_H2F_DATA_SZW ((sizeof(union octep_ctrl_net_h2f_data_sz)) / \ (sizeof(unsigned long))) /* size of fw to host data in words */ #define OCTEP_CTRL_NET_F2H_DATA_SZW ((sizeof(union octep_ctrl_net_f2h_data_sz)) / \ (sizeof(unsigned long))) /* size in words of get/set mtu request */ #define OCTEP_CTRL_NET_H2F_MTU_REQ_SZW 2 /* size in words of get/set mac request */ #define OCTEP_CTRL_NET_H2F_MAC_REQ_SZW 2 /* size in words of get stats request */ #define OCTEP_CTRL_NET_H2F_GET_STATS_REQ_SZW 2 /* size in words of get/set state request */ #define OCTEP_CTRL_NET_H2F_STATE_REQ_SZW 2 /* size in words of get/set link info request */ #define OCTEP_CTRL_NET_H2F_LINK_INFO_REQ_SZW 4 /* size in words of get mtu response */ #define OCTEP_CTRL_NET_H2F_GET_MTU_RESP_SZW 2 /* size in words of set mtu response */ #define OCTEP_CTRL_NET_H2F_SET_MTU_RESP_SZW 1 /* size in words of get mac response */ #define OCTEP_CTRL_NET_H2F_GET_MAC_RESP_SZW 2 /* size in words of set mac response */ #define OCTEP_CTRL_NET_H2F_SET_MAC_RESP_SZW 1 /* size in words of get state request */ #define OCTEP_CTRL_NET_H2F_GET_STATE_RESP_SZW 2 /* size in words of set state request */ #define OCTEP_CTRL_NET_H2F_SET_STATE_RESP_SZW 1 /* size in words of get link info request */ #define OCTEP_CTRL_NET_H2F_GET_LINK_INFO_RESP_SZW 4 /* size in words of set link info request */ #define OCTEP_CTRL_NET_H2F_SET_LINK_INFO_RESP_SZW 1 /** Get link status from firmware. * * @param oct: non-null pointer to struct octep_device. * * return value: link status 0=down, 1=up. */ int octep_get_link_status(struct octep_device *oct); /** Set link status in firmware. * * @param oct: non-null pointer to struct octep_device. * @param up: boolean status. */ void octep_set_link_status(struct octep_device *oct, bool up); /** Set rx state in firmware. * * @param oct: non-null pointer to struct octep_device. * @param up: boolean status. */ void octep_set_rx_state(struct octep_device *oct, bool up); /** Get mac address from firmware. * * @param oct: non-null pointer to struct octep_device. * @param addr: non-null pointer to mac address. * * return value: 0 on success, -errno on failure. */ int octep_get_mac_addr(struct octep_device *oct, u8 *addr); /** Set mac address in firmware. * * @param oct: non-null pointer to struct octep_device. * @param addr: non-null pointer to mac address. */ int octep_set_mac_addr(struct octep_device *oct, u8 *addr); /** Set mtu in firmware. * * @param oct: non-null pointer to struct octep_device. * @param mtu: mtu. */ int octep_set_mtu(struct octep_device *oct, int mtu); /** Get interface statistics from firmware. * * @param oct: non-null pointer to struct octep_device. * * return value: 0 on success, -errno on failure. */ int octep_get_if_stats(struct octep_device *oct); /** Get link info from firmware. * * @param oct: non-null pointer to struct octep_device. * * return value: 0 on success, -errno on failure. */ int octep_get_link_info(struct octep_device *oct); /** Set link info in firmware. * * @param oct: non-null pointer to struct octep_device. */ int octep_set_link_info(struct octep_device *oct, struct octep_iface_link_info *link_info); #endif /* __OCTEP_CTRL_NET_H__ */