1 /* 2 * Copyright (c) 2017-2018 Cavium, Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 * POSSIBILITY OF SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 * 29 */ 30 31 32 #ifndef __ECORE_VF_PF_IF_H__ 33 #define __ECORE_VF_PF_IF_H__ 34 35 #define T_ETH_INDIRECTION_TABLE_SIZE 128 /* @@@ TBD MichalK this should be HSI? */ 36 #define T_ETH_RSS_KEY_SIZE 10 /* @@@ TBD this should be HSI? */ 37 #ifndef LINUX_REMOVE 38 #define ETH_ALEN 6 /* @@@ TBD MichalK - should this be defined here?*/ 39 #endif 40 41 /*********************************************** 42 * 43 * Common definitions for all HVs 44 * 45 **/ 46 struct vf_pf_resc_request { 47 u8 num_rxqs; 48 u8 num_txqs; 49 u8 num_sbs; 50 u8 num_mac_filters; 51 u8 num_vlan_filters; 52 u8 num_mc_filters; /* No limit so superfluous */ 53 u8 num_cids; 54 u8 padding; 55 }; 56 57 struct hw_sb_info { 58 u16 hw_sb_id; /* aka absolute igu id, used to ack the sb */ 59 u8 sb_qid; /* used to update DHC for sb */ 60 u8 padding[5]; 61 }; 62 63 /*********************************************** 64 * 65 * HW VF-PF channel definitions 66 * 67 * A.K.A VF-PF mailbox 68 * 69 **/ 70 #define TLV_BUFFER_SIZE 1024 71 72 /* vf pf channel tlvs */ 73 /* general tlv header (used for both vf->pf request and pf->vf response) */ 74 struct channel_tlv { 75 u16 type; 76 u16 length; 77 }; 78 79 /* header of first vf->pf tlv carries the offset used to calculate reponse 80 * buffer address 81 */ 82 struct vfpf_first_tlv { 83 struct channel_tlv tl; 84 u32 padding; 85 u64 reply_address; 86 }; 87 88 /* header of pf->vf tlvs, carries the status of handling the request */ 89 struct pfvf_tlv { 90 struct channel_tlv tl; 91 u8 status; 92 u8 padding[3]; 93 }; 94 95 /* response tlv used for most tlvs */ 96 struct pfvf_def_resp_tlv { 97 struct pfvf_tlv hdr; 98 }; 99 100 /* used to terminate and pad a tlv list */ 101 struct channel_list_end_tlv { 102 struct channel_tlv tl; 103 u8 padding[4]; 104 }; 105 106 /* Acquire */ 107 struct vfpf_acquire_tlv { 108 struct vfpf_first_tlv first_tlv; 109 110 struct vf_pf_vfdev_info { 111 #ifndef LINUX_REMOVE 112 /* First bit was used on 8.7.x and 8.8.x versions, which had different 113 * FWs used but with the same faspath HSI. As this was prior to the 114 * fastpath versioning, wanted to have ability to override fw matching 115 * and allow them to interact. 116 */ 117 #endif 118 #define VFPF_ACQUIRE_CAP_PRE_FP_HSI (1 << 0) /* VF pre-FP hsi version */ 119 #define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */ 120 121 /* A requirement for supporting multi-Tx queues on a single queue-zone, 122 * VF would pass qids as additional information whenever passing queue 123 * references. 124 * TODO - due to the CID limitations in Bar0, VFs currently don't pass 125 * this, and use the legacy CID scheme. 126 */ 127 #define VFPF_ACQUIRE_CAP_QUEUE_QIDS (1 << 2) 128 u64 capabilities; 129 u8 fw_major; 130 u8 fw_minor; 131 u8 fw_revision; 132 u8 fw_engineering; 133 u32 driver_version; 134 u16 opaque_fid; /* ME register value */ 135 u8 os_type; /* VFPF_ACQUIRE_OS_* value */ 136 u8 eth_fp_hsi_major; 137 u8 eth_fp_hsi_minor; 138 u8 padding[3]; 139 } vfdev_info; 140 141 struct vf_pf_resc_request resc_request; 142 143 u64 bulletin_addr; 144 u32 bulletin_size; 145 u32 padding; 146 }; 147 148 /* receive side scaling tlv */ 149 struct vfpf_vport_update_rss_tlv { 150 struct channel_tlv tl; 151 152 u8 update_rss_flags; 153 #define VFPF_UPDATE_RSS_CONFIG_FLAG (1 << 0) 154 #define VFPF_UPDATE_RSS_CAPS_FLAG (1 << 1) 155 #define VFPF_UPDATE_RSS_IND_TABLE_FLAG (1 << 2) 156 #define VFPF_UPDATE_RSS_KEY_FLAG (1 << 3) 157 158 u8 rss_enable; 159 u8 rss_caps; 160 u8 rss_table_size_log; /* The table size is 2 ^ rss_table_size_log */ 161 u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE]; 162 u32 rss_key[T_ETH_RSS_KEY_SIZE]; 163 }; 164 165 struct pfvf_storm_stats { 166 u32 address; 167 u32 len; 168 }; 169 170 struct pfvf_stats_info { 171 struct pfvf_storm_stats mstats; 172 struct pfvf_storm_stats pstats; 173 struct pfvf_storm_stats tstats; 174 struct pfvf_storm_stats ustats; 175 }; 176 177 /* acquire response tlv - carries the allocated resources */ 178 struct pfvf_acquire_resp_tlv { 179 struct pfvf_tlv hdr; 180 181 struct pf_vf_pfdev_info { 182 u32 chip_num; 183 u32 mfw_ver; 184 185 u16 fw_major; 186 u16 fw_minor; 187 u16 fw_rev; 188 u16 fw_eng; 189 190 u64 capabilities; 191 #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED (1 << 0) 192 #define PFVF_ACQUIRE_CAP_100G (1 << 1) /* If set, 100g PF */ 193 /* There are old PF versions where the PF might mistakenly override the sanity 194 * mechanism [version-based] and allow a VF that can't be supported to pass 195 * the acquisition phase. 196 * To overcome this, PFs now indicate that they're past that point and the new 197 * VFs would fail probe on the older PFs that fail to do so. 198 */ 199 #ifndef LINUX_REMOVE 200 /* Said bug was in quest/serpens; Can't be certain no official release included 201 * the bug since the fix arrived very late in the programs. 202 */ 203 #endif 204 #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE (1 << 2) 205 206 /* PF expects queues to be received with additional qids */ 207 #define PFVF_ACQUIRE_CAP_QUEUE_QIDS (1 << 3) 208 209 u16 db_size; 210 u8 indices_per_sb; 211 u8 os_type; 212 213 /* These should match the PF's ecore_dev values */ 214 u16 chip_rev; 215 u8 dev_type; 216 217 u8 padding; 218 219 struct pfvf_stats_info stats_info; 220 221 u8 port_mac[ETH_ALEN]; 222 223 /* It's possible PF had to configure an older fastpath HSI 224 * [in case VF is newer than PF]. This is communicated back 225 * to the VF. It can also be used in case of error due to 226 * non-matching versions to shed light in VF about failure. 227 */ 228 u8 major_fp_hsi; 229 u8 minor_fp_hsi; 230 } pfdev_info; 231 232 struct pf_vf_resc { 233 /* in case of status NO_RESOURCE in message hdr, pf will fill 234 * this struct with suggested amount of resources for next 235 * acquire request 236 */ 237 #define PFVF_MAX_QUEUES_PER_VF 16 238 #define PFVF_MAX_SBS_PER_VF 16 239 struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF]; 240 u8 hw_qid[PFVF_MAX_QUEUES_PER_VF]; 241 u8 cid[PFVF_MAX_QUEUES_PER_VF]; 242 243 u8 num_rxqs; 244 u8 num_txqs; 245 u8 num_sbs; 246 u8 num_mac_filters; 247 u8 num_vlan_filters; 248 u8 num_mc_filters; 249 u8 num_cids; 250 u8 padding; 251 } resc; 252 253 u32 bulletin_size; 254 u32 padding; 255 }; 256 257 struct pfvf_start_queue_resp_tlv { 258 struct pfvf_tlv hdr; 259 u32 offset; /* offset to consumer/producer of queue */ 260 u8 padding[4]; 261 }; 262 263 /* Extended queue information - additional index for reference inside qzone. 264 * If commmunicated between VF/PF, each TLV relating to queues should be 265 * extended by one such [or have a future base TLV that already contains info]. 266 */ 267 struct vfpf_qid_tlv { 268 struct channel_tlv tl; 269 u8 qid; 270 u8 padding[3]; 271 }; 272 273 /* Setup Queue */ 274 struct vfpf_start_rxq_tlv { 275 struct vfpf_first_tlv first_tlv; 276 277 /* physical addresses */ 278 u64 rxq_addr; 279 u64 deprecated_sge_addr; 280 u64 cqe_pbl_addr; 281 282 u16 cqe_pbl_size; 283 u16 hw_sb; 284 u16 rx_qid; 285 u16 hc_rate; /* desired interrupts per sec. */ 286 287 u16 bd_max_bytes; 288 u16 stat_id; 289 u8 sb_index; 290 u8 padding[3]; 291 292 }; 293 294 struct vfpf_start_txq_tlv { 295 struct vfpf_first_tlv first_tlv; 296 297 /* physical addresses */ 298 u64 pbl_addr; 299 u16 pbl_size; 300 u16 stat_id; 301 u16 tx_qid; 302 u16 hw_sb; 303 304 u32 flags; /* VFPF_QUEUE_FLG_X flags */ 305 u16 hc_rate; /* desired interrupts per sec. */ 306 u8 sb_index; 307 u8 padding[3]; 308 }; 309 310 /* Stop RX Queue */ 311 struct vfpf_stop_rxqs_tlv { 312 struct vfpf_first_tlv first_tlv; 313 314 u16 rx_qid; 315 316 /* While the API supports multiple Rx-queues on a single TLV 317 * message, in practice older VFs always used it as one [ecore]. 318 * And there are PFs [starting with the CHANNEL_TLV_QID] which 319 * would start assuming this is always a '1'. So in practice this 320 * field should be considered deprecated and *Always* set to '1'. 321 */ 322 u8 num_rxqs; 323 324 u8 cqe_completion; 325 u8 padding[4]; 326 }; 327 328 /* Stop TX Queues */ 329 struct vfpf_stop_txqs_tlv { 330 struct vfpf_first_tlv first_tlv; 331 332 u16 tx_qid; 333 334 /* While the API supports multiple Tx-queues on a single TLV 335 * message, in practice older VFs always used it as one [ecore]. 336 * And there are PFs [starting with the CHANNEL_TLV_QID] which 337 * would start assuming this is always a '1'. So in practice this 338 * field should be considered deprecated and *Always* set to '1'. 339 */ 340 u8 num_txqs; 341 u8 padding[5]; 342 }; 343 344 struct vfpf_update_rxq_tlv { 345 struct vfpf_first_tlv first_tlv; 346 347 u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF]; 348 349 u16 rx_qid; 350 u8 num_rxqs; 351 u8 flags; 352 #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG (1 << 0) 353 #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG (1 << 1) 354 #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG (1 << 2) 355 356 u8 padding[4]; 357 }; 358 359 /* Set Queue Filters */ 360 struct vfpf_q_mac_vlan_filter { 361 u32 flags; 362 #define VFPF_Q_FILTER_DEST_MAC_VALID 0x01 363 #define VFPF_Q_FILTER_VLAN_TAG_VALID 0x02 364 #define VFPF_Q_FILTER_SET_MAC 0x100 /* set/clear */ 365 366 u8 mac[ETH_ALEN]; 367 u16 vlan_tag; 368 369 u8 padding[4]; 370 }; 371 372 /* Start a vport */ 373 struct vfpf_vport_start_tlv { 374 struct vfpf_first_tlv first_tlv; 375 376 u64 sb_addr[PFVF_MAX_SBS_PER_VF]; 377 378 u32 tpa_mode; 379 u16 dep1; 380 u16 mtu; 381 382 u8 vport_id; 383 u8 inner_vlan_removal; 384 385 u8 only_untagged; 386 u8 max_buffers_per_cqe; 387 388 u8 padding[4]; 389 }; 390 391 /* Extended tlvs - need to add rss, mcast, accept mode tlvs */ 392 struct vfpf_vport_update_activate_tlv { 393 struct channel_tlv tl; 394 u8 update_rx; 395 u8 update_tx; 396 u8 active_rx; 397 u8 active_tx; 398 }; 399 400 struct vfpf_vport_update_tx_switch_tlv { 401 struct channel_tlv tl; 402 u8 tx_switching; 403 u8 padding[3]; 404 }; 405 406 struct vfpf_vport_update_vlan_strip_tlv { 407 struct channel_tlv tl; 408 u8 remove_vlan; 409 u8 padding[3]; 410 }; 411 412 struct vfpf_vport_update_mcast_bin_tlv { 413 struct channel_tlv tl; 414 u8 padding[4]; 415 416 u64 bins[8]; 417 }; 418 419 struct vfpf_vport_update_accept_param_tlv { 420 struct channel_tlv tl; 421 u8 update_rx_mode; 422 u8 update_tx_mode; 423 u8 rx_accept_filter; 424 u8 tx_accept_filter; 425 }; 426 427 struct vfpf_vport_update_accept_any_vlan_tlv { 428 struct channel_tlv tl; 429 u8 update_accept_any_vlan_flg; 430 u8 accept_any_vlan; 431 432 u8 padding[2]; 433 }; 434 435 struct vfpf_vport_update_sge_tpa_tlv { 436 struct channel_tlv tl; 437 438 u16 sge_tpa_flags; 439 #define VFPF_TPA_IPV4_EN_FLAG (1 << 0) 440 #define VFPF_TPA_IPV6_EN_FLAG (1 << 1) 441 #define VFPF_TPA_PKT_SPLIT_FLAG (1 << 2) 442 #define VFPF_TPA_HDR_DATA_SPLIT_FLAG (1 << 3) 443 #define VFPF_TPA_GRO_CONSIST_FLAG (1 << 4) 444 445 u8 update_sge_tpa_flags; 446 #define VFPF_UPDATE_SGE_DEPRECATED_FLAG (1 << 0) 447 #define VFPF_UPDATE_TPA_EN_FLAG (1 << 1) 448 #define VFPF_UPDATE_TPA_PARAM_FLAG (1 << 2) 449 450 u8 max_buffers_per_cqe; 451 452 u16 deprecated_sge_buff_size; 453 u16 tpa_max_size; 454 u16 tpa_min_size_to_start; 455 u16 tpa_min_size_to_cont; 456 457 u8 tpa_max_aggs_num; 458 u8 padding[7]; 459 460 }; 461 462 /* Primary tlv as a header for various extended tlvs for 463 * various functionalities in vport update ramrod. 464 */ 465 struct vfpf_vport_update_tlv { 466 struct vfpf_first_tlv first_tlv; 467 }; 468 469 struct vfpf_ucast_filter_tlv { 470 struct vfpf_first_tlv first_tlv; 471 472 u8 opcode; 473 u8 type; 474 475 u8 mac[ETH_ALEN]; 476 477 u16 vlan; 478 u16 padding[3]; 479 }; 480 481 /* tunnel update param tlv */ 482 struct vfpf_update_tunn_param_tlv { 483 struct vfpf_first_tlv first_tlv; 484 485 u8 tun_mode_update_mask; 486 u8 tunn_mode; 487 u8 update_tun_cls; 488 u8 vxlan_clss; 489 u8 l2gre_clss; 490 u8 ipgre_clss; 491 u8 l2geneve_clss; 492 u8 ipgeneve_clss; 493 u8 update_geneve_port; 494 u8 update_vxlan_port; 495 u16 geneve_port; 496 u16 vxlan_port; 497 u8 padding[2]; 498 }; 499 500 struct pfvf_update_tunn_param_tlv { 501 struct pfvf_tlv hdr; 502 503 u16 tunn_feature_mask; 504 u8 vxlan_mode; 505 u8 l2geneve_mode; 506 u8 ipgeneve_mode; 507 u8 l2gre_mode; 508 u8 ipgre_mode; 509 u8 vxlan_clss; 510 u8 l2gre_clss; 511 u8 ipgre_clss; 512 u8 l2geneve_clss; 513 u8 ipgeneve_clss; 514 u16 vxlan_udp_port; 515 u16 geneve_udp_port; 516 }; 517 518 struct tlv_buffer_size { 519 u8 tlv_buffer[TLV_BUFFER_SIZE]; 520 }; 521 522 struct vfpf_update_coalesce { 523 struct vfpf_first_tlv first_tlv; 524 u16 rx_coal; 525 u16 tx_coal; 526 u16 qid; 527 u8 padding[2]; 528 }; 529 530 union vfpf_tlvs { 531 struct vfpf_first_tlv first_tlv; 532 struct vfpf_acquire_tlv acquire; 533 struct vfpf_start_rxq_tlv start_rxq; 534 struct vfpf_start_txq_tlv start_txq; 535 struct vfpf_stop_rxqs_tlv stop_rxqs; 536 struct vfpf_stop_txqs_tlv stop_txqs; 537 struct vfpf_update_rxq_tlv update_rxq; 538 struct vfpf_vport_start_tlv start_vport; 539 struct vfpf_vport_update_tlv vport_update; 540 struct vfpf_ucast_filter_tlv ucast_filter; 541 struct vfpf_update_tunn_param_tlv tunn_param_update; 542 struct vfpf_update_coalesce update_coalesce; 543 struct tlv_buffer_size tlv_buf_size; 544 }; 545 546 union pfvf_tlvs { 547 struct pfvf_def_resp_tlv default_resp; 548 struct pfvf_acquire_resp_tlv acquire_resp; 549 struct tlv_buffer_size tlv_buf_size; 550 struct pfvf_start_queue_resp_tlv queue_start; 551 struct pfvf_update_tunn_param_tlv tunn_param_resp; 552 }; 553 554 /* This is a structure which is allocated in the VF, which the PF may update 555 * when it deems it necessary to do so. The bulletin board is sampled 556 * periodically by the VF. A copy per VF is maintained in the PF (to prevent 557 * loss of data upon multiple updates (or the need for read modify write)). 558 */ 559 enum ecore_bulletin_bit { 560 /* Alert the VF that a forced MAC was set by the PF */ 561 MAC_ADDR_FORCED = 0, 562 563 /* The VF should not access the vfpf channel */ 564 VFPF_CHANNEL_INVALID = 1, 565 566 /* Alert the VF that a forced VLAN was set by the PF */ 567 VLAN_ADDR_FORCED = 2, 568 569 /* Indicate that `default_only_untagged' contains actual data */ 570 VFPF_BULLETIN_UNTAGGED_DEFAULT = 3, 571 VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4, 572 573 /* Alert the VF that suggested mac was sent by the PF. 574 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set 575 */ 576 VFPF_BULLETIN_MAC_ADDR = 5 577 }; 578 579 struct ecore_bulletin_content { 580 /* crc of structure to ensure is not in mid-update */ 581 u32 crc; 582 583 u32 version; 584 585 /* bitmap indicating which fields hold valid values */ 586 u64 valid_bitmap; 587 588 /* used for MAC_ADDR or MAC_ADDR_FORCED */ 589 u8 mac[ETH_ALEN]; 590 591 /* If valid, 1 => only untagged Rx if no vlan is configured */ 592 u8 default_only_untagged; 593 u8 padding; 594 595 /* The following is a 'copy' of ecore_mcp_link_state, 596 * ecore_mcp_link_params and ecore_mcp_link_capabilities. Since it's 597 * possible the structs will increase further along the road we cannot 598 * have it here; Instead we need to have all of its fields. 599 */ 600 u8 req_autoneg; 601 u8 req_autoneg_pause; 602 u8 req_forced_rx; 603 u8 req_forced_tx; 604 u8 padding2[4]; 605 606 u32 req_adv_speed; 607 u32 req_forced_speed; 608 u32 req_loopback; 609 u32 padding3; 610 611 u8 link_up; 612 u8 full_duplex; 613 u8 autoneg; 614 u8 autoneg_complete; 615 u8 parallel_detection; 616 u8 pfc_enabled; 617 u8 partner_tx_flow_ctrl_en; 618 u8 partner_rx_flow_ctrl_en; 619 620 u8 partner_adv_pause; 621 u8 sfp_tx_fault; 622 u16 vxlan_udp_port; 623 u16 geneve_udp_port; 624 u8 padding4[2]; 625 626 u32 speed; 627 u32 partner_adv_speed; 628 629 u32 capability_speed; 630 631 /* Forced vlan */ 632 u16 pvid; 633 u16 padding5; 634 }; 635 636 struct ecore_bulletin { 637 dma_addr_t phys; 638 struct ecore_bulletin_content *p_virt; 639 u32 size; 640 }; 641 642 enum { 643 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/ 644 645 CHANNEL_TLV_NONE, /* ends tlv sequence */ 646 CHANNEL_TLV_ACQUIRE, 647 CHANNEL_TLV_VPORT_START, 648 CHANNEL_TLV_VPORT_UPDATE, 649 CHANNEL_TLV_VPORT_TEARDOWN, 650 CHANNEL_TLV_START_RXQ, 651 CHANNEL_TLV_START_TXQ, 652 CHANNEL_TLV_STOP_RXQS, 653 CHANNEL_TLV_STOP_TXQS, 654 CHANNEL_TLV_UPDATE_RXQ, 655 CHANNEL_TLV_INT_CLEANUP, 656 CHANNEL_TLV_CLOSE, 657 CHANNEL_TLV_RELEASE, 658 CHANNEL_TLV_LIST_END, 659 CHANNEL_TLV_UCAST_FILTER, 660 CHANNEL_TLV_VPORT_UPDATE_ACTIVATE, 661 CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH, 662 CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP, 663 CHANNEL_TLV_VPORT_UPDATE_MCAST, 664 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM, 665 CHANNEL_TLV_VPORT_UPDATE_RSS, 666 CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN, 667 CHANNEL_TLV_VPORT_UPDATE_SGE_TPA, 668 CHANNEL_TLV_UPDATE_TUNN_PARAM, 669 CHANNEL_TLV_COALESCE_UPDATE, 670 CHANNEL_TLV_QID, 671 CHANNEL_TLV_MAX, 672 673 /* Required for iterating over vport-update tlvs. 674 * Will break in case non-sequential vport-update tlvs. 675 */ 676 CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1, 677 678 /*!!!!! Make sure to update STRINGS structure accordingly !!!!!*/ 679 }; 680 extern const char *ecore_channel_tlvs_string[]; 681 682 #endif /* __ECORE_VF_PF_IF_H__ */ 683