162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2013-2014 Chelsio Communications. All rights reserved. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Written by Anish Bhatt (anish@chelsio.com) 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __CXGB4_DCB_H 962306a36Sopenharmony_ci#define __CXGB4_DCB_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/netdevice.h> 1262306a36Sopenharmony_ci#include <linux/dcbnl.h> 1362306a36Sopenharmony_ci#include <net/dcbnl.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifdef CONFIG_CHELSIO_T4_DCB 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define CXGB4_DCBX_FW_SUPPORT \ 1862306a36Sopenharmony_ci (DCB_CAP_DCBX_VER_CEE | \ 1962306a36Sopenharmony_ci DCB_CAP_DCBX_VER_IEEE | \ 2062306a36Sopenharmony_ci DCB_CAP_DCBX_LLD_MANAGED) 2162306a36Sopenharmony_ci#define CXGB4_DCBX_HOST_SUPPORT \ 2262306a36Sopenharmony_ci (DCB_CAP_DCBX_VER_CEE | \ 2362306a36Sopenharmony_ci DCB_CAP_DCBX_VER_IEEE | \ 2462306a36Sopenharmony_ci DCB_CAP_DCBX_HOST) 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define CXGB4_MAX_PRIORITY CXGB4_MAX_DCBX_APP_SUPPORTED 2762306a36Sopenharmony_ci#define CXGB4_MAX_TCS CXGB4_MAX_DCBX_APP_SUPPORTED 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define INIT_PORT_DCB_CMD(__pcmd, __port, __op, __action) \ 3062306a36Sopenharmony_ci do { \ 3162306a36Sopenharmony_ci memset(&(__pcmd), 0, sizeof(__pcmd)); \ 3262306a36Sopenharmony_ci (__pcmd).op_to_portid = \ 3362306a36Sopenharmony_ci cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) | \ 3462306a36Sopenharmony_ci FW_CMD_REQUEST_F | \ 3562306a36Sopenharmony_ci FW_CMD_##__op##_F | \ 3662306a36Sopenharmony_ci FW_PORT_CMD_PORTID_V(__port)); \ 3762306a36Sopenharmony_ci (__pcmd).action_to_len16 = \ 3862306a36Sopenharmony_ci cpu_to_be32(FW_PORT_CMD_ACTION_V(__action) | \ 3962306a36Sopenharmony_ci FW_LEN16(pcmd)); \ 4062306a36Sopenharmony_ci } while (0) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define INIT_PORT_DCB_READ_PEER_CMD(__pcmd, __port) \ 4362306a36Sopenharmony_ci INIT_PORT_DCB_CMD(__pcmd, __port, READ, FW_PORT_ACTION_DCB_READ_RECV) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define INIT_PORT_DCB_READ_LOCAL_CMD(__pcmd, __port) \ 4662306a36Sopenharmony_ci INIT_PORT_DCB_CMD(__pcmd, __port, READ, FW_PORT_ACTION_DCB_READ_TRANS) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define INIT_PORT_DCB_READ_SYNC_CMD(__pcmd, __port) \ 4962306a36Sopenharmony_ci INIT_PORT_DCB_CMD(__pcmd, __port, READ, FW_PORT_ACTION_DCB_READ_DET) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define INIT_PORT_DCB_WRITE_CMD(__pcmd, __port) \ 5262306a36Sopenharmony_ci INIT_PORT_DCB_CMD(__pcmd, __port, EXEC, FW_PORT_ACTION_L2_DCB_CFG) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define IEEE_FAUX_SYNC(__dev, __dcb) \ 5562306a36Sopenharmony_ci do { \ 5662306a36Sopenharmony_ci if ((__dcb)->dcb_version == FW_PORT_DCB_VER_IEEE) \ 5762306a36Sopenharmony_ci cxgb4_dcb_state_fsm((__dev), \ 5862306a36Sopenharmony_ci CXGB4_DCB_INPUT_FW_ALLSYNCED); \ 5962306a36Sopenharmony_ci } while (0) 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* States we can be in for a port's Data Center Bridging. 6262306a36Sopenharmony_ci */ 6362306a36Sopenharmony_cienum cxgb4_dcb_state { 6462306a36Sopenharmony_ci CXGB4_DCB_STATE_START, /* initial unknown state */ 6562306a36Sopenharmony_ci CXGB4_DCB_STATE_HOST, /* we're using Host DCB (if at all) */ 6662306a36Sopenharmony_ci CXGB4_DCB_STATE_FW_INCOMPLETE, /* using firmware DCB, incomplete */ 6762306a36Sopenharmony_ci CXGB4_DCB_STATE_FW_ALLSYNCED, /* using firmware DCB, all sync'ed */ 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* Data Center Bridging state input for the Finite State Machine. 7162306a36Sopenharmony_ci */ 7262306a36Sopenharmony_cienum cxgb4_dcb_state_input { 7362306a36Sopenharmony_ci /* Input from the firmware. 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci CXGB4_DCB_INPUT_FW_DISABLED, /* firmware DCB disabled */ 7662306a36Sopenharmony_ci CXGB4_DCB_INPUT_FW_ENABLED, /* firmware DCB enabled */ 7762306a36Sopenharmony_ci CXGB4_DCB_INPUT_FW_INCOMPLETE, /* firmware reports incomplete DCB */ 7862306a36Sopenharmony_ci CXGB4_DCB_INPUT_FW_ALLSYNCED, /* firmware reports all sync'ed */ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* Firmware DCB messages that we've received so far ... 8362306a36Sopenharmony_ci */ 8462306a36Sopenharmony_cienum cxgb4_dcb_fw_msgs { 8562306a36Sopenharmony_ci CXGB4_DCB_FW_PGID = 0x01, 8662306a36Sopenharmony_ci CXGB4_DCB_FW_PGRATE = 0x02, 8762306a36Sopenharmony_ci CXGB4_DCB_FW_PRIORATE = 0x04, 8862306a36Sopenharmony_ci CXGB4_DCB_FW_PFC = 0x08, 8962306a36Sopenharmony_ci CXGB4_DCB_FW_APP_ID = 0x10, 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define CXGB4_MAX_DCBX_APP_SUPPORTED 8 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* Data Center Bridging support; 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_cistruct port_dcb_info { 9762306a36Sopenharmony_ci enum cxgb4_dcb_state state; /* DCB State Machine */ 9862306a36Sopenharmony_ci enum cxgb4_dcb_fw_msgs msgs; /* DCB Firmware messages received */ 9962306a36Sopenharmony_ci unsigned int supported; /* OS DCB capabilities supported */ 10062306a36Sopenharmony_ci bool enabled; /* OS Enabled state */ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* Cached copies of DCB information sent by the firmware (in Host 10362306a36Sopenharmony_ci * Native Endian format). 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci u32 pgid; /* Priority Group[0..7] */ 10662306a36Sopenharmony_ci u8 dcb_version; /* Running DCBx version */ 10762306a36Sopenharmony_ci u8 pfcen; /* Priority Flow Control[0..7] */ 10862306a36Sopenharmony_ci u8 pg_num_tcs_supported; /* max PG Traffic Classes */ 10962306a36Sopenharmony_ci u8 pfc_num_tcs_supported; /* max PFC Traffic Classes */ 11062306a36Sopenharmony_ci u8 pgrate[8]; /* Priority Group Rate[0..7] */ 11162306a36Sopenharmony_ci u8 priorate[8]; /* Priority Rate[0..7] */ 11262306a36Sopenharmony_ci u8 tsa[8]; /* TSA Algorithm[0..7] */ 11362306a36Sopenharmony_ci struct app_priority { /* Application Information */ 11462306a36Sopenharmony_ci u8 user_prio_map; /* Priority Map bitfield */ 11562306a36Sopenharmony_ci u8 sel_field; /* Protocol ID interpretation */ 11662306a36Sopenharmony_ci u16 protocolid; /* Protocol ID */ 11762306a36Sopenharmony_ci } app_priority[CXGB4_MAX_DCBX_APP_SUPPORTED]; 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_civoid cxgb4_dcb_state_init(struct net_device *); 12162306a36Sopenharmony_civoid cxgb4_dcb_version_init(struct net_device *); 12262306a36Sopenharmony_civoid cxgb4_dcb_reset(struct net_device *dev); 12362306a36Sopenharmony_civoid cxgb4_dcb_state_fsm(struct net_device *, enum cxgb4_dcb_state_input); 12462306a36Sopenharmony_civoid cxgb4_dcb_handle_fw_update(struct adapter *, const struct fw_port_cmd *); 12562306a36Sopenharmony_civoid cxgb4_dcb_set_caps(struct adapter *, const struct fw_port_cmd *); 12662306a36Sopenharmony_ciextern const struct dcbnl_rtnl_ops cxgb4_dcb_ops; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic inline __u8 bitswap_1(unsigned char val) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci return ((val & 0x80) >> 7) | 13162306a36Sopenharmony_ci ((val & 0x40) >> 5) | 13262306a36Sopenharmony_ci ((val & 0x20) >> 3) | 13362306a36Sopenharmony_ci ((val & 0x10) >> 1) | 13462306a36Sopenharmony_ci ((val & 0x08) << 1) | 13562306a36Sopenharmony_ci ((val & 0x04) << 3) | 13662306a36Sopenharmony_ci ((val & 0x02) << 5) | 13762306a36Sopenharmony_ci ((val & 0x01) << 7); 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciextern const char * const dcb_ver_array[]; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#define CXGB4_DCB_ENABLED true 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#else /* !CONFIG_CHELSIO_T4_DCB */ 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic inline void cxgb4_dcb_state_init(struct net_device *dev) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#define CXGB4_DCB_ENABLED false 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci#endif /* !CONFIG_CHELSIO_T4_DCB */ 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#endif /* __CXGB4_DCB_H */ 155