338 lines
8.6 KiB
C
338 lines
8.6 KiB
C
/* 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__
|
|
|
|
#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,
|
|
};
|
|
|
|
/* 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,
|
|
};
|
|
|
|
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;
|
|
};
|
|
|
|
/* 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;
|
|
};
|
|
} __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;
|
|
};
|
|
|
|
/* 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;
|
|
};
|
|
} __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;
|
|
};
|
|
|
|
/** Initialize data for ctrl net.
|
|
*
|
|
* @param 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);
|
|
|
|
/** Get link status from firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param 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);
|
|
|
|
/** Set link status in firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param up: boolean status.
|
|
* @param 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);
|
|
|
|
/** Set rx state in firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param up: boolean status.
|
|
* @param 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);
|
|
|
|
/** Get mac address from firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param 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);
|
|
|
|
/** Set mac address in firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param addr: non-null pointer to mac address.
|
|
* @param 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);
|
|
|
|
/** Set mtu in firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param mtu: mtu.
|
|
* @param 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);
|
|
|
|
/** Get interface statistics from firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param rx_stats: non-null pointer struct octep_iface_rx_stats.
|
|
* @param 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);
|
|
|
|
/** Get link info from firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param 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);
|
|
|
|
/** Set link info in firmware.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
* @param vfid: Index of virtual function.
|
|
* @param link_info: non-null pointer to struct octep_iface_link_info.
|
|
* @param 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);
|
|
|
|
/** Poll for firmware messages and process them.
|
|
*
|
|
* @param oct: non-null pointer to struct octep_device.
|
|
*/
|
|
void octep_ctrl_net_recv_fw_messages(struct octep_device *oct);
|
|
|
|
/** Uninitialize data for ctrl net.
|
|
*
|
|
* @param 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__ */
|