root/usr/src/uts/common/io/qede/579xx/drivers/ecore/ecore_dcbx_api.h
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, v.1,  (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Copyright 2014-2017 Cavium, Inc. 
* The contents of this file are subject to the terms of the Common Development 
* and Distribution License, v.1,  (the "License").

* You may not use this file except in compliance with the License.

* You can obtain a copy of the License at available 
* at http://opensource.org/licenses/CDDL-1.0

* See the License for the specific language governing permissions and 
* limitations under the License.
*/

#ifndef __ECORE_DCBX_API_H__
#define __ECORE_DCBX_API_H__

#include "ecore_status.h"

#define DCBX_CONFIG_MAX_APP_PROTOCOL    4

enum ecore_mib_read_type {
        ECORE_DCBX_OPERATIONAL_MIB,
        ECORE_DCBX_REMOTE_MIB,
        ECORE_DCBX_LOCAL_MIB,
        ECORE_DCBX_REMOTE_LLDP_MIB,
        ECORE_DCBX_LOCAL_LLDP_MIB
};

struct ecore_dcbx_app_data {
        bool enable;            /* DCB enabled */
        u8 update;              /* Update indication */
        u8 priority;            /* Priority */
        u8 tc;                  /* Traffic Class */
        bool dscp_enable;       /* DSCP enabled */
        u8 dscp_val;            /* DSCP value */
};

#ifndef __EXTRACT__LINUX__
enum dcbx_protocol_type {
        DCBX_PROTOCOL_ISCSI,
        DCBX_PROTOCOL_FCOE,
        DCBX_PROTOCOL_ROCE,
        DCBX_PROTOCOL_ROCE_V2,
        DCBX_PROTOCOL_ETH,
        DCBX_PROTOCOL_IWARP,
        DCBX_MAX_PROTOCOL_TYPE
};

#define ECORE_LLDP_CHASSIS_ID_STAT_LEN 4
#define ECORE_LLDP_PORT_ID_STAT_LEN 4
#define ECORE_DCBX_MAX_APP_PROTOCOL 32
#define ECORE_MAX_PFC_PRIORITIES 8
#define ECORE_DCBX_DSCP_SIZE 64

struct ecore_dcbx_lldp_remote {
        u32     peer_chassis_id[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
        u32     peer_port_id[ECORE_LLDP_PORT_ID_STAT_LEN];
        bool    enable_rx;
        bool    enable_tx;
        u32     tx_interval;
        u32     max_credit;
};

struct ecore_dcbx_lldp_local {
        u32     local_chassis_id[ECORE_LLDP_CHASSIS_ID_STAT_LEN];
        u32     local_port_id[ECORE_LLDP_PORT_ID_STAT_LEN];
};

struct ecore_dcbx_app_prio {
        u8      roce;
        u8      roce_v2;
        u8      fcoe;
        u8      iscsi;
        u8      eth;
};

struct ecore_dbcx_pfc_params {
        bool    willing;
        bool    enabled;
        u8      prio[ECORE_MAX_PFC_PRIORITIES];
        u8      max_tc;
};

enum ecore_dcbx_sf_ieee_type {
        ECORE_DCBX_SF_IEEE_ETHTYPE,
        ECORE_DCBX_SF_IEEE_TCP_PORT,
        ECORE_DCBX_SF_IEEE_UDP_PORT,
        ECORE_DCBX_SF_IEEE_TCP_UDP_PORT
};

struct ecore_app_entry {
        bool ethtype;
        enum ecore_dcbx_sf_ieee_type sf_ieee;
        bool enabled;
        u8 prio;
        u16 proto_id;
        enum dcbx_protocol_type proto_type;
};

struct ecore_dcbx_params {
        struct ecore_app_entry app_entry[ECORE_DCBX_MAX_APP_PROTOCOL];
        u16     num_app_entries;
        bool    app_willing;
        bool    app_valid;
        bool    app_error;
        bool    ets_willing;
        bool    ets_enabled;
        bool    ets_cbs;
        bool    valid;          /* Indicate validity of params */
        u8      ets_pri_tc_tbl[ECORE_MAX_PFC_PRIORITIES];
        u8      ets_tc_bw_tbl[ECORE_MAX_PFC_PRIORITIES];
        u8      ets_tc_tsa_tbl[ECORE_MAX_PFC_PRIORITIES];
        struct ecore_dbcx_pfc_params pfc;
        u8      max_ets_tc;
};

struct ecore_dcbx_admin_params {
        struct ecore_dcbx_params params;
        bool valid;             /* Indicate validity of params */
};

struct ecore_dcbx_remote_params {
        struct ecore_dcbx_params params;
        bool valid;             /* Indicate validity of params */
};

struct ecore_dcbx_operational_params {
        struct ecore_dcbx_app_prio app_prio;
        struct ecore_dcbx_params params;
        bool valid;             /* Indicate validity of params */
        bool enabled;
        bool ieee;
        bool cee;
        bool local;
        u32 err;
};

struct ecore_dcbx_dscp_params {
        bool enabled;
        u8 dscp_pri_map[ECORE_DCBX_DSCP_SIZE];
};

struct ecore_dcbx_get {
        struct ecore_dcbx_operational_params operational;
        struct ecore_dcbx_lldp_remote lldp_remote;
        struct ecore_dcbx_lldp_local lldp_local;
        struct ecore_dcbx_remote_params remote;
        struct ecore_dcbx_admin_params local;
        struct ecore_dcbx_dscp_params dscp;
};
#endif

#define ECORE_DCBX_VERSION_DISABLED     0
#define ECORE_DCBX_VERSION_IEEE         1
#define ECORE_DCBX_VERSION_CEE          2
#define ECORE_DCBX_VERSION_DYNAMIC      3

struct ecore_dcbx_set {
#define ECORE_DCBX_OVERRIDE_STATE       (1 << 0)
#define ECORE_DCBX_OVERRIDE_PFC_CFG     (1 << 1)
#define ECORE_DCBX_OVERRIDE_ETS_CFG     (1 << 2)
#define ECORE_DCBX_OVERRIDE_APP_CFG     (1 << 3)
#define ECORE_DCBX_OVERRIDE_DSCP_CFG    (1 << 4)
        u32 override_flags;
        bool enabled;
        struct ecore_dcbx_admin_params config;
        u32 ver_num;
        struct ecore_dcbx_dscp_params dscp;
};

struct ecore_dcbx_results {
        bool dcbx_enabled;
        u8 pf_id;
        struct ecore_dcbx_app_data arr[DCBX_MAX_PROTOCOL_TYPE];
};

struct ecore_dcbx_app_metadata {
        enum dcbx_protocol_type id;
        char *name;
        enum ecore_pci_personality personality;
};

enum _ecore_status_t ecore_dcbx_query_params(struct ecore_hwfn *,
                                             struct ecore_dcbx_get *,
                                             enum ecore_mib_read_type);

enum _ecore_status_t ecore_dcbx_get_config_params(struct ecore_hwfn *,
                                                  struct ecore_dcbx_set *);

enum _ecore_status_t ecore_dcbx_config_params(struct ecore_hwfn *,
                                              struct ecore_ptt *,
                                              struct ecore_dcbx_set *,
                                              bool);

static const struct ecore_dcbx_app_metadata ecore_dcbx_app_update[] = {
        {DCBX_PROTOCOL_ISCSI, "ISCSI", ECORE_PCI_ISCSI},
        {DCBX_PROTOCOL_FCOE, "FCOE", ECORE_PCI_FCOE},
        {DCBX_PROTOCOL_ROCE, "ROCE", ECORE_PCI_ETH_ROCE},
        {DCBX_PROTOCOL_ROCE_V2, "ROCE_V2", ECORE_PCI_ETH_ROCE},
        {DCBX_PROTOCOL_ETH, "ETH", ECORE_PCI_ETH},
        {DCBX_PROTOCOL_IWARP, "IWARP", ECORE_PCI_ETH_IWARP}
};

#endif /* __ECORE_DCBX_API_H__ */