root/drivers/net/ethernet/marvell/octeon_ep/octep_ctrl_net.h
/* 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__ */