blob: f23b583813220d68cbe844a73e4337dfadbb0024 [file] [log] [blame]
/* 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__ */