1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved. */ 3 4 #ifndef _HINIC3_MGMT_INTERFACE_H_ 5 #define _HINIC3_MGMT_INTERFACE_H_ 6 7 #include <linux/bitfield.h> 8 #include <linux/bits.h> 9 #include <linux/if_ether.h> 10 11 #include "hinic3_hw_intf.h" 12 13 struct l2nic_cmd_feature_nego { 14 struct mgmt_msg_head msg_head; 15 u16 func_id; 16 u8 opcode; 17 u8 rsvd; 18 u64 s_feature[4]; 19 }; 20 21 enum l2nic_func_tbl_cfg_bitmap { 22 L2NIC_FUNC_TBL_CFG_INIT = 0, 23 L2NIC_FUNC_TBL_CFG_RX_BUF_SIZE = 1, 24 L2NIC_FUNC_TBL_CFG_MTU = 2, 25 }; 26 27 struct l2nic_func_tbl_cfg { 28 u16 rx_wqe_buf_size; 29 u16 mtu; 30 u32 rsvd[9]; 31 }; 32 33 struct l2nic_cmd_set_func_tbl { 34 struct mgmt_msg_head msg_head; 35 u16 func_id; 36 u16 rsvd; 37 u32 cfg_bitmap; 38 struct l2nic_func_tbl_cfg tbl_cfg; 39 }; 40 41 struct l2nic_cmd_set_mac { 42 struct mgmt_msg_head msg_head; 43 u16 func_id; 44 u16 vlan_id; 45 u16 rsvd1; 46 u8 mac[ETH_ALEN]; 47 }; 48 49 struct l2nic_cmd_update_mac { 50 struct mgmt_msg_head msg_head; 51 u16 func_id; 52 u16 vlan_id; 53 u16 rsvd1; 54 u8 old_mac[ETH_ALEN]; 55 u16 rsvd2; 56 u8 new_mac[ETH_ALEN]; 57 }; 58 59 struct l2nic_cmd_vlan_config { 60 struct mgmt_msg_head msg_head; 61 u16 func_id; 62 u8 opcode; 63 u8 rsvd1; 64 u16 vlan_id; 65 u16 rsvd2; 66 }; 67 68 struct l2nic_cmd_vlan_offload { 69 struct mgmt_msg_head msg_head; 70 u16 func_id; 71 u8 vlan_offload; 72 u8 rsvd1[5]; 73 }; 74 75 /* set vlan filter */ 76 struct l2nic_cmd_set_vlan_filter { 77 struct mgmt_msg_head msg_head; 78 u16 func_id; 79 u8 rsvd[2]; 80 /* bit0:vlan filter en; bit1:broadcast_filter_en */ 81 u32 vlan_filter_ctrl; 82 }; 83 84 struct l2nic_cmd_set_ci_attr { 85 struct mgmt_msg_head msg_head; 86 u16 func_idx; 87 u8 dma_attr_off; 88 u8 pending_limit; 89 u8 coalescing_time; 90 u8 intr_en; 91 u16 intr_idx; 92 u32 l2nic_sqn; 93 u32 rsvd; 94 u64 ci_addr; 95 }; 96 97 struct l2nic_cmd_clear_qp_resource { 98 struct mgmt_msg_head msg_head; 99 u16 func_id; 100 u16 rsvd1; 101 }; 102 103 struct l2nic_cmd_force_pkt_drop { 104 struct mgmt_msg_head msg_head; 105 u8 port; 106 u8 rsvd1[3]; 107 }; 108 109 struct l2nic_cmd_set_vport_state { 110 struct mgmt_msg_head msg_head; 111 u16 func_id; 112 u16 rsvd1; 113 /* 0--disable, 1--enable */ 114 u8 state; 115 u8 rsvd2[3]; 116 }; 117 118 /* * 119 * Definition of the NIC receiving mode 120 */ 121 #define L2NIC_RX_MODE_UC 0x01 122 #define L2NIC_RX_MODE_MC 0x02 123 #define L2NIC_RX_MODE_BC 0x04 124 #define L2NIC_RX_MODE_MC_ALL 0x08 125 #define L2NIC_RX_MODE_PROMISC 0x10 126 127 struct l2nic_rx_mode_config { 128 struct mgmt_msg_head msg_head; 129 u16 func_id; 130 u16 rsvd1; 131 u32 rx_mode; 132 }; 133 134 struct l2nic_cmd_set_dcb_state { 135 struct mgmt_msg_head head; 136 u16 func_id; 137 /* 0 - get dcb state, 1 - set dcb state */ 138 u8 op_code; 139 /* 0 - disable, 1 - enable dcb */ 140 u8 state; 141 /* 0 - disable, 1 - enable dcb */ 142 u8 port_state; 143 u8 rsvd[7]; 144 }; 145 146 struct l2nic_cmd_lro_config { 147 struct mgmt_msg_head msg_head; 148 u16 func_id; 149 u8 opcode; 150 u8 rsvd1; 151 u8 lro_ipv4_en; 152 u8 lro_ipv6_en; 153 /* unit is 1K */ 154 u8 lro_max_pkt_len; 155 u8 resv2[13]; 156 }; 157 158 struct l2nic_cmd_lro_timer { 159 struct mgmt_msg_head msg_head; 160 /* 1: set timer value, 0: get timer value */ 161 u8 opcode; 162 u8 rsvd[3]; 163 u32 timer; 164 }; 165 166 #define L2NIC_RSS_TYPE_VALID_MASK BIT(23) 167 #define L2NIC_RSS_TYPE_TCP_IPV6_EXT_MASK BIT(24) 168 #define L2NIC_RSS_TYPE_IPV6_EXT_MASK BIT(25) 169 #define L2NIC_RSS_TYPE_TCP_IPV6_MASK BIT(26) 170 #define L2NIC_RSS_TYPE_IPV6_MASK BIT(27) 171 #define L2NIC_RSS_TYPE_TCP_IPV4_MASK BIT(28) 172 #define L2NIC_RSS_TYPE_IPV4_MASK BIT(29) 173 #define L2NIC_RSS_TYPE_UDP_IPV6_MASK BIT(30) 174 #define L2NIC_RSS_TYPE_UDP_IPV4_MASK BIT(31) 175 #define L2NIC_RSS_TYPE_SET(val, member) \ 176 FIELD_PREP(L2NIC_RSS_TYPE_##member##_MASK, val) 177 #define L2NIC_RSS_TYPE_GET(val, member) \ 178 FIELD_GET(L2NIC_RSS_TYPE_##member##_MASK, val) 179 180 #define L2NIC_RSS_INDIR_SIZE 256 181 #define L2NIC_RSS_KEY_SIZE 40 182 183 /* IEEE 802.1Qaz std */ 184 #define L2NIC_DCB_COS_MAX 0x8 185 186 struct l2nic_cmd_set_rss_ctx_tbl { 187 struct mgmt_msg_head msg_head; 188 u16 func_id; 189 u16 rsvd1; 190 u32 context; 191 }; 192 193 struct l2nic_cmd_cfg_rss_engine { 194 struct mgmt_msg_head msg_head; 195 u16 func_id; 196 u8 opcode; 197 u8 hash_engine; 198 u8 rsvd1[4]; 199 }; 200 201 struct l2nic_cmd_cfg_rss_hash_key { 202 struct mgmt_msg_head msg_head; 203 u16 func_id; 204 u8 opcode; 205 u8 rsvd1; 206 u8 key[L2NIC_RSS_KEY_SIZE]; 207 }; 208 209 struct l2nic_cmd_cfg_rss { 210 struct mgmt_msg_head msg_head; 211 u16 func_id; 212 u8 rss_en; 213 u8 rq_priority_number; 214 u8 prio_tc[L2NIC_DCB_COS_MAX]; 215 u16 num_qps; 216 u16 rsvd1; 217 }; 218 219 /* Commands between NIC to fw */ 220 enum l2nic_cmd { 221 /* FUNC CFG */ 222 L2NIC_CMD_SET_FUNC_TBL = 5, 223 L2NIC_CMD_SET_VPORT_ENABLE = 6, 224 L2NIC_CMD_SET_RX_MODE = 7, 225 L2NIC_CMD_SET_SQ_CI_ATTR = 8, 226 L2NIC_CMD_CLEAR_QP_RESOURCE = 11, 227 L2NIC_CMD_CFG_RX_LRO = 13, 228 L2NIC_CMD_CFG_LRO_TIMER = 14, 229 L2NIC_CMD_FEATURE_NEGO = 15, 230 L2NIC_CMD_GET_MAC = 20, 231 L2NIC_CMD_SET_MAC = 21, 232 L2NIC_CMD_DEL_MAC = 22, 233 L2NIC_CMD_UPDATE_MAC = 23, 234 L2NIC_CMD_CFG_FUNC_VLAN = 25, 235 L2NIC_CMD_SET_VLAN_FILTER_EN = 26, 236 L2NIC_CMD_SET_RX_VLAN_OFFLOAD = 27, 237 L2NIC_CMD_CFG_RSS = 60, 238 L2NIC_CMD_CFG_RSS_HASH_KEY = 63, 239 L2NIC_CMD_CFG_RSS_HASH_ENGINE = 64, 240 L2NIC_CMD_SET_RSS_CTX_TBL = 65, 241 L2NIC_CMD_QOS_DCB_STATE = 110, 242 L2NIC_CMD_FORCE_PKT_DROP = 113, 243 L2NIC_CMD_MAX = 256, 244 }; 245 246 struct l2nic_cmd_rss_set_indir_tbl { 247 __le32 rsvd[4]; 248 __le16 entry[L2NIC_RSS_INDIR_SIZE]; 249 }; 250 251 /* NIC CMDQ MODE */ 252 enum l2nic_ucode_cmd { 253 L2NIC_UCODE_CMD_MODIFY_QUEUE_CTX = 0, 254 L2NIC_UCODE_CMD_CLEAN_QUEUE_CTX = 1, 255 L2NIC_UCODE_CMD_SET_RSS_INDIR_TBL = 4, 256 }; 257 258 /* hilink mac group command */ 259 enum mag_cmd { 260 MAG_CMD_SET_PORT_ENABLE = 6, 261 MAG_CMD_GET_LINK_STATUS = 7, 262 }; 263 264 /* firmware also use this cmd report link event to driver */ 265 struct mag_cmd_get_link_status { 266 struct mgmt_msg_head head; 267 u8 port_id; 268 /* 0:link down 1:link up */ 269 u8 status; 270 u8 rsvd0[2]; 271 }; 272 273 enum hinic3_nic_feature_cap { 274 HINIC3_NIC_F_CSUM = BIT(0), 275 HINIC3_NIC_F_SCTP_CRC = BIT(1), 276 HINIC3_NIC_F_TSO = BIT(2), 277 HINIC3_NIC_F_LRO = BIT(3), 278 HINIC3_NIC_F_UFO = BIT(4), 279 HINIC3_NIC_F_RSS = BIT(5), 280 HINIC3_NIC_F_RX_VLAN_FILTER = BIT(6), 281 HINIC3_NIC_F_RX_VLAN_STRIP = BIT(7), 282 HINIC3_NIC_F_TX_VLAN_INSERT = BIT(8), 283 HINIC3_NIC_F_VXLAN_OFFLOAD = BIT(9), 284 HINIC3_NIC_F_FDIR = BIT(11), 285 HINIC3_NIC_F_PROMISC = BIT(12), 286 HINIC3_NIC_F_ALLMULTI = BIT(13), 287 HINIC3_NIC_F_RATE_LIMIT = BIT(16), 288 }; 289 290 #define HINIC3_NIC_F_ALL_MASK 0x33bff 291 #define HINIC3_NIC_DRV_DEFAULT_FEATURE 0x3f03f 292 293 #endif 294