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