1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, v.1, (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2014-2017 Cavium, Inc. 24 * The contents of this file are subject to the terms of the Common Development 25 * and Distribution License, v.1, (the "License"). 26 27 * You may not use this file except in compliance with the License. 28 29 * You can obtain a copy of the License at available 30 * at http://opensource.org/licenses/CDDL-1.0 31 32 * See the License for the specific language governing permissions and 33 * limitations under the License. 34 */ 35 36 #ifndef __ECORE_L2_API_H__ 37 #define __ECORE_L2_API_H__ 38 39 #include "ecore_status.h" 40 #include "ecore_sp_api.h" 41 #include "ecore_int_api.h" 42 43 #ifndef __EXTRACT__LINUX__ 44 enum ecore_rss_caps { 45 ECORE_RSS_IPV4 = 0x1, 46 ECORE_RSS_IPV6 = 0x2, 47 ECORE_RSS_IPV4_TCP = 0x4, 48 ECORE_RSS_IPV6_TCP = 0x8, 49 ECORE_RSS_IPV4_UDP = 0x10, 50 ECORE_RSS_IPV6_UDP = 0x20, 51 }; 52 53 /* Should be the same as ETH_RSS_IND_TABLE_ENTRIES_NUM */ 54 #define ECORE_RSS_IND_TABLE_SIZE 128 55 #define ECORE_RSS_KEY_SIZE 10 /* size in 32b chunks */ 56 57 #define ECORE_MAX_PHC_DRIFT_PPB 291666666 58 59 enum ecore_ptp_filter_type { 60 ECORE_PTP_FILTER_L2, 61 ECORE_PTP_FILTER_IPV4, 62 ECORE_PTP_FILTER_IPV4_IPV6, 63 ECORE_PTP_FILTER_L2_IPV4_IPV6 64 }; 65 66 #endif 67 68 #ifndef __EXTRACT__LINUX__ 69 struct ecore_queue_start_common_params { 70 /* Should always be relative to entity sending this. */ 71 u8 vport_id; 72 u16 queue_id; 73 74 /* Relative, but relevant only for PFs */ 75 u8 stats_id; 76 77 struct ecore_sb_info *p_sb; 78 u8 sb_idx; 79 }; 80 81 struct ecore_rxq_start_ret_params { 82 void OSAL_IOMEM *p_prod; 83 void *p_handle; 84 }; 85 86 struct ecore_txq_start_ret_params { 87 void OSAL_IOMEM *p_doorbell; 88 void *p_handle; 89 }; 90 #endif 91 92 struct ecore_rss_params { 93 u8 update_rss_config; 94 u8 rss_enable; 95 u8 rss_eng_id; 96 u8 update_rss_capabilities; 97 u8 update_rss_ind_table; 98 u8 update_rss_key; 99 u8 rss_caps; 100 u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */ 101 102 /* Indirection table consist of rx queue handles */ 103 void *rss_ind_table[ECORE_RSS_IND_TABLE_SIZE]; 104 u32 rss_key[ECORE_RSS_KEY_SIZE]; 105 }; 106 107 struct ecore_sge_tpa_params { 108 u8 max_buffers_per_cqe; 109 110 u8 update_tpa_en_flg; 111 u8 tpa_ipv4_en_flg; 112 u8 tpa_ipv6_en_flg; 113 u8 tpa_ipv4_tunn_en_flg; 114 u8 tpa_ipv6_tunn_en_flg; 115 116 u8 update_tpa_param_flg; 117 u8 tpa_pkt_split_flg; 118 u8 tpa_hdr_data_split_flg; 119 u8 tpa_gro_consistent_flg; 120 u8 tpa_max_aggs_num; 121 u16 tpa_max_size; 122 u16 tpa_min_size_to_start; 123 u16 tpa_min_size_to_cont; 124 }; 125 126 enum ecore_filter_opcode { 127 ECORE_FILTER_ADD, 128 ECORE_FILTER_REMOVE, 129 ECORE_FILTER_MOVE, 130 ECORE_FILTER_REPLACE, /* Delete all MACs and add new one instead */ 131 ECORE_FILTER_FLUSH, /* Removes all filters */ 132 }; 133 134 enum ecore_filter_ucast_type { 135 ECORE_FILTER_MAC, 136 ECORE_FILTER_VLAN, 137 ECORE_FILTER_MAC_VLAN, 138 ECORE_FILTER_INNER_MAC, 139 ECORE_FILTER_INNER_VLAN, 140 ECORE_FILTER_INNER_PAIR, 141 ECORE_FILTER_INNER_MAC_VNI_PAIR, 142 ECORE_FILTER_MAC_VNI_PAIR, 143 ECORE_FILTER_VNI, 144 }; 145 146 struct ecore_filter_ucast { 147 enum ecore_filter_opcode opcode; 148 enum ecore_filter_ucast_type type; 149 u8 is_rx_filter; 150 u8 is_tx_filter; 151 u8 vport_to_add_to; 152 u8 vport_to_remove_from; 153 unsigned char mac[ETH_ALEN]; 154 u8 assert_on_error; 155 u16 vlan; 156 u32 vni; 157 }; 158 159 struct ecore_filter_mcast { 160 /* MOVE is not supported for multicast */ 161 enum ecore_filter_opcode opcode; 162 u8 vport_to_add_to; 163 u8 vport_to_remove_from; 164 u8 num_mc_addrs; 165 #define ECORE_MAX_MC_ADDRS 64 166 unsigned char mac[ECORE_MAX_MC_ADDRS][ETH_ALEN]; 167 }; 168 169 struct ecore_filter_accept_flags { 170 u8 update_rx_mode_config; 171 u8 update_tx_mode_config; 172 u8 rx_accept_filter; 173 u8 tx_accept_filter; 174 #define ECORE_ACCEPT_NONE 0x01 175 #define ECORE_ACCEPT_UCAST_MATCHED 0x02 176 #define ECORE_ACCEPT_UCAST_UNMATCHED 0x04 177 #define ECORE_ACCEPT_MCAST_MATCHED 0x08 178 #define ECORE_ACCEPT_MCAST_UNMATCHED 0x10 179 #define ECORE_ACCEPT_BCAST 0x20 180 }; 181 182 struct ecore_arfs_config_params { 183 bool tcp; 184 bool udp; 185 bool ipv4; 186 bool ipv6; 187 bool arfs_enable; /* Enable or disable arfs mode */ 188 }; 189 190 /* Add / remove / move / remove-all unicast MAC-VLAN filters. 191 * FW will assert in the following cases, so driver should take care...: 192 * 1. Adding a filter to a full table. 193 * 2. Adding a filter which already exists on that vport. 194 * 3. Removing a filter which doesn't exist. 195 */ 196 197 enum _ecore_status_t 198 ecore_filter_ucast_cmd(struct ecore_dev *p_dev, 199 struct ecore_filter_ucast *p_filter_cmd, 200 enum spq_mode comp_mode, 201 struct ecore_spq_comp_cb *p_comp_data); 202 203 /* Add / remove / move multicast MAC filters. */ 204 enum _ecore_status_t 205 ecore_filter_mcast_cmd(struct ecore_dev *p_dev, 206 struct ecore_filter_mcast *p_filter_cmd, 207 enum spq_mode comp_mode, 208 struct ecore_spq_comp_cb *p_comp_data); 209 210 /* Set "accept" filters */ 211 enum _ecore_status_t 212 ecore_filter_accept_cmd( 213 struct ecore_dev *p_dev, 214 u8 vport, 215 struct ecore_filter_accept_flags accept_flags, 216 u8 update_accept_any_vlan, 217 u8 accept_any_vlan, 218 enum spq_mode comp_mode, 219 struct ecore_spq_comp_cb *p_comp_data); 220 221 /** 222 * @brief ecore_eth_rx_queue_start - RX Queue Start Ramrod 223 * 224 * This ramrod initializes an RX Queue for a VPort. An Assert is generated if 225 * the VPort ID is not currently initialized. 226 * 227 * @param p_hwfn 228 * @param opaque_fid 229 * @p_params Inputs; Relative for PF [SB being an exception] 230 * @param bd_max_bytes Maximum bytes that can be placed on a BD 231 * @param bd_chain_phys_addr Physical address of BDs for receive. 232 * @param cqe_pbl_addr Physical address of the CQE PBL Table. 233 * @param cqe_pbl_size Size of the CQE PBL Table 234 * @param p_ret_params Pointed struct to be filled with outputs. 235 * 236 * @return enum _ecore_status_t 237 */ 238 enum _ecore_status_t 239 ecore_eth_rx_queue_start(struct ecore_hwfn *p_hwfn, 240 u16 opaque_fid, 241 struct ecore_queue_start_common_params *p_params, 242 u16 bd_max_bytes, 243 dma_addr_t bd_chain_phys_addr, 244 dma_addr_t cqe_pbl_addr, 245 u16 cqe_pbl_size, 246 struct ecore_rxq_start_ret_params *p_ret_params); 247 248 /** 249 * @brief ecore_eth_rx_queue_stop - This ramrod closes an Rx queue 250 * 251 * @param p_hwfn 252 * @param p_rxq Handler of queue to close 253 * @param eq_completion_only If True completion will be on 254 * EQe, if False completion will be 255 * on EQe if p_hwfn opaque 256 * different from the RXQ opaque 257 * otherwise on CQe. 258 * @param cqe_completion If True completion will be 259 * recieve on CQe. 260 * @return enum _ecore_status_t 261 */ 262 enum _ecore_status_t 263 ecore_eth_rx_queue_stop(struct ecore_hwfn *p_hwfn, 264 void *p_rxq, 265 bool eq_completion_only, 266 bool cqe_completion); 267 268 /** 269 * @brief - TX Queue Start Ramrod 270 * 271 * This ramrod initializes a TX Queue for a VPort. An Assert is generated if 272 * the VPort is not currently initialized. 273 * 274 * @param p_hwfn 275 * @param opaque_fid 276 * @p_params 277 * @param tc traffic class to use with this L2 txq 278 * @param pbl_addr address of the pbl array 279 * @param pbl_size number of entries in pbl 280 * @oaram p_ret_params Pointer to fill the return parameters in. 281 * 282 * @return enum _ecore_status_t 283 */ 284 enum _ecore_status_t 285 ecore_eth_tx_queue_start(struct ecore_hwfn *p_hwfn, 286 u16 opaque_fid, 287 struct ecore_queue_start_common_params *p_params, 288 u8 tc, 289 dma_addr_t pbl_addr, 290 u16 pbl_size, 291 struct ecore_txq_start_ret_params *p_ret_params); 292 293 /** 294 * @brief ecore_eth_tx_queue_stop - closes a Tx queue 295 * 296 * @param p_hwfn 297 * @param p_txq - handle to Tx queue needed to be closed 298 * 299 * @return enum _ecore_status_t 300 */ 301 enum _ecore_status_t ecore_eth_tx_queue_stop(struct ecore_hwfn *p_hwfn, 302 void *p_txq); 303 304 enum ecore_tpa_mode { 305 ECORE_TPA_MODE_NONE, 306 ECORE_TPA_MODE_RSC, 307 ECORE_TPA_MODE_GRO, 308 ECORE_TPA_MODE_MAX 309 }; 310 311 struct ecore_sp_vport_start_params { 312 enum ecore_tpa_mode tpa_mode; 313 bool remove_inner_vlan; /* Inner VLAN removal is enabled */ 314 bool tx_switching; /* Vport supports tx-switching */ 315 bool handle_ptp_pkts; /* Handle PTP packets */ 316 bool only_untagged; /* Untagged pkt control */ 317 bool drop_ttl0; /* Drop packets with TTL = 0 */ 318 u8 max_buffers_per_cqe; 319 u32 concrete_fid; 320 u16 opaque_fid; 321 u8 vport_id; /* VPORT ID */ 322 u16 mtu; /* VPORT MTU */ 323 bool zero_placement_offset; 324 bool check_mac; 325 bool check_ethtype; 326 327 /* Strict behavior on transmission errors */ 328 bool b_err_illegal_vlan_mode; 329 bool b_err_illegal_inband_mode; 330 bool b_err_vlan_insert_with_inband; 331 bool b_err_small_pkt; 332 bool b_err_big_pkt; 333 bool b_err_anti_spoof; 334 bool b_err_ctrl_frame; 335 }; 336 337 /** 338 * @brief ecore_sp_vport_start - 339 * 340 * This ramrod initializes a VPort. An Assert if generated if the Function ID 341 * of the VPort is not enabled. 342 * 343 * @param p_hwfn 344 * @param p_params VPORT start params 345 * 346 * @return enum _ecore_status_t 347 */ 348 enum _ecore_status_t 349 ecore_sp_vport_start(struct ecore_hwfn *p_hwfn, 350 struct ecore_sp_vport_start_params *p_params); 351 352 struct ecore_sp_vport_update_params { 353 u16 opaque_fid; 354 u8 vport_id; 355 u8 update_vport_active_rx_flg; 356 u8 vport_active_rx_flg; 357 u8 update_vport_active_tx_flg; 358 u8 vport_active_tx_flg; 359 u8 update_inner_vlan_removal_flg; 360 u8 inner_vlan_removal_flg; 361 u8 silent_vlan_removal_flg; 362 u8 update_default_vlan_enable_flg; 363 u8 default_vlan_enable_flg; 364 u8 update_default_vlan_flg; 365 u16 default_vlan; 366 u8 update_tx_switching_flg; 367 u8 tx_switching_flg; 368 u8 update_approx_mcast_flg; 369 u8 update_anti_spoofing_en_flg; 370 u8 anti_spoofing_en; 371 u8 update_accept_any_vlan_flg; 372 u8 accept_any_vlan; 373 unsigned long bins[8]; 374 struct ecore_rss_params *rss_params; 375 struct ecore_filter_accept_flags accept_flags; 376 struct ecore_sge_tpa_params *sge_tpa_params; 377 }; 378 379 /** 380 * @brief ecore_sp_vport_update - 381 * 382 * This ramrod updates the parameters of the VPort. Every field can be updated 383 * independently, according to flags. 384 * 385 * This ramrod is also used to set the VPort state to active after creation. 386 * An Assert is generated if the VPort does not contain an RX queue. 387 * 388 * @param p_hwfn 389 * @param p_params 390 * 391 * @return enum _ecore_status_t 392 */ 393 enum _ecore_status_t 394 ecore_sp_vport_update(struct ecore_hwfn *p_hwfn, 395 struct ecore_sp_vport_update_params *p_params, 396 enum spq_mode comp_mode, 397 struct ecore_spq_comp_cb *p_comp_data); 398 /** 399 * @brief ecore_sp_vport_stop - 400 * 401 * This ramrod closes a VPort after all its RX and TX queues are terminated. 402 * An Assert is generated if any queues are left open. 403 * 404 * @param p_hwfn 405 * @param opaque_fid 406 * @param vport_id VPort ID 407 * 408 * @return enum _ecore_status_t 409 */ 410 enum _ecore_status_t ecore_sp_vport_stop(struct ecore_hwfn *p_hwfn, 411 u16 opaque_fid, 412 u8 vport_id); 413 414 enum _ecore_status_t 415 ecore_sp_eth_filter_ucast(struct ecore_hwfn *p_hwfn, 416 u16 opaque_fid, 417 struct ecore_filter_ucast *p_filter_cmd, 418 enum spq_mode comp_mode, 419 struct ecore_spq_comp_cb *p_comp_data); 420 421 /** 422 * @brief ecore_sp_rx_eth_queues_update - 423 * 424 * This ramrod updates an RX queue. It is used for setting the active state 425 * of the queue and updating the TPA and SGE parameters. 426 * 427 * @note Final phase API. 428 * 429 * @param p_hwfn 430 * @param pp_rxq_handlers An array of queue handlers to be updated. 431 * @param num_rxqs number of queues to update. 432 * @param complete_cqe_flg Post completion to the CQE Ring if set 433 * @param complete_event_flg Post completion to the Event Ring if set 434 * @param comp_mode 435 * @param p_comp_data 436 * 437 * @return enum _ecore_status_t 438 */ 439 440 enum _ecore_status_t 441 ecore_sp_eth_rx_queues_update(struct ecore_hwfn *p_hwfn, 442 void **pp_rxq_handlers, 443 u8 num_rxqs, 444 u8 complete_cqe_flg, 445 u8 complete_event_flg, 446 enum spq_mode comp_mode, 447 struct ecore_spq_comp_cb *p_comp_data); 448 449 void __ecore_get_vport_stats(struct ecore_hwfn *p_hwfn, 450 struct ecore_ptt *p_ptt, 451 struct ecore_eth_stats *stats, 452 u16 statistics_bin, bool b_get_port_stats); 453 454 void ecore_get_vport_stats(struct ecore_dev *p_dev, 455 struct ecore_eth_stats *stats); 456 457 void ecore_reset_vport_stats(struct ecore_dev *p_dev); 458 459 /** 460 *@brief ecore_arfs_mode_configure - 461 * 462 *Enable or disable rfs mode. It must accept atleast one of tcp or udp true 463 *and atleast one of ipv4 or ipv6 true to enable rfs mode. 464 * 465 *@param p_hwfn 466 *@param p_ptt 467 *@param p_cfg_params arfs mode configuration parameters. 468 * 469 */ 470 void ecore_arfs_mode_configure(struct ecore_hwfn *p_hwfn, 471 struct ecore_ptt *p_ptt, 472 struct ecore_arfs_config_params *p_cfg_params); 473 #endif 474