1 /*- 2 * Copyright (c) 2012-2015 Solarflare Communications 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 are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 24 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 * The views and conclusions contained in the software and documentation are 27 * those of the authors and should not be interpreted as representing official 28 * policies, either expressed or implied, of the FreeBSD Project. 29 * 30 * $FreeBSD$ 31 */ 32 33 #ifndef _SYS_HUNT_IMPL_H 34 #define _SYS_HUNT_IMPL_H 35 36 #include "efx.h" 37 #include "efx_regs.h" 38 #include "efx_regs_ef10.h" 39 #include "efx_mcdi.h" 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 #define HUNTINGTON_NVRAM_CHUNK 0x80 46 47 /* Alignment requirement for value written to RX WPTR: 48 * the WPTR must be aligned to an 8 descriptor boundary 49 */ 50 #define HUNTINGTON_RX_WPTR_ALIGN 8 51 52 /* Invalid RSS context handle */ 53 #define HUNTINGTON_RSS_CONTEXT_INVALID (0xffffffff) 54 55 56 /* EV */ 57 58 __checkReturn efx_rc_t 59 hunt_ev_init( 60 __in efx_nic_t *enp); 61 62 void 63 hunt_ev_fini( 64 __in efx_nic_t *enp); 65 66 __checkReturn efx_rc_t 67 hunt_ev_qcreate( 68 __in efx_nic_t *enp, 69 __in unsigned int index, 70 __in efsys_mem_t *esmp, 71 __in size_t n, 72 __in uint32_t id, 73 __in efx_evq_t *eep); 74 75 void 76 hunt_ev_qdestroy( 77 __in efx_evq_t *eep); 78 79 __checkReturn efx_rc_t 80 hunt_ev_qprime( 81 __in efx_evq_t *eep, 82 __in unsigned int count); 83 84 void 85 hunt_ev_qpost( 86 __in efx_evq_t *eep, 87 __in uint16_t data); 88 89 __checkReturn efx_rc_t 90 hunt_ev_qmoderate( 91 __in efx_evq_t *eep, 92 __in unsigned int us); 93 94 #if EFSYS_OPT_QSTATS 95 void 96 hunt_ev_qstats_update( 97 __in efx_evq_t *eep, 98 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat); 99 #endif /* EFSYS_OPT_QSTATS */ 100 101 void 102 hunt_ev_rxlabel_init( 103 __in efx_evq_t *eep, 104 __in efx_rxq_t *erp, 105 __in unsigned int label); 106 107 void 108 hunt_ev_rxlabel_fini( 109 __in efx_evq_t *eep, 110 __in unsigned int label); 111 112 /* INTR */ 113 114 __checkReturn efx_rc_t 115 hunt_intr_init( 116 __in efx_nic_t *enp, 117 __in efx_intr_type_t type, 118 __in efsys_mem_t *esmp); 119 120 void 121 hunt_intr_enable( 122 __in efx_nic_t *enp); 123 124 void 125 hunt_intr_disable( 126 __in efx_nic_t *enp); 127 128 void 129 hunt_intr_disable_unlocked( 130 __in efx_nic_t *enp); 131 132 __checkReturn efx_rc_t 133 hunt_intr_trigger( 134 __in efx_nic_t *enp, 135 __in unsigned int level); 136 137 void 138 hunt_intr_fini( 139 __in efx_nic_t *enp); 140 141 /* NIC */ 142 143 extern __checkReturn efx_rc_t 144 hunt_nic_probe( 145 __in efx_nic_t *enp); 146 147 extern __checkReturn efx_rc_t 148 hunt_nic_set_drv_limits( 149 __inout efx_nic_t *enp, 150 __in efx_drv_limits_t *edlp); 151 152 extern __checkReturn efx_rc_t 153 hunt_nic_get_vi_pool( 154 __in efx_nic_t *enp, 155 __out uint32_t *vi_countp); 156 157 extern __checkReturn efx_rc_t 158 hunt_nic_get_bar_region( 159 __in efx_nic_t *enp, 160 __in efx_nic_region_t region, 161 __out uint32_t *offsetp, 162 __out size_t *sizep); 163 164 extern __checkReturn efx_rc_t 165 hunt_nic_reset( 166 __in efx_nic_t *enp); 167 168 extern __checkReturn efx_rc_t 169 hunt_nic_init( 170 __in efx_nic_t *enp); 171 172 #if EFSYS_OPT_DIAG 173 174 extern __checkReturn efx_rc_t 175 hunt_nic_register_test( 176 __in efx_nic_t *enp); 177 178 #endif /* EFSYS_OPT_DIAG */ 179 180 extern void 181 hunt_nic_fini( 182 __in efx_nic_t *enp); 183 184 extern void 185 hunt_nic_unprobe( 186 __in efx_nic_t *enp); 187 188 189 /* MAC */ 190 191 extern __checkReturn efx_rc_t 192 hunt_mac_poll( 193 __in efx_nic_t *enp, 194 __out efx_link_mode_t *link_modep); 195 196 extern __checkReturn efx_rc_t 197 hunt_mac_up( 198 __in efx_nic_t *enp, 199 __out boolean_t *mac_upp); 200 201 extern __checkReturn efx_rc_t 202 hunt_mac_addr_set( 203 __in efx_nic_t *enp); 204 205 extern __checkReturn efx_rc_t 206 hunt_mac_reconfigure( 207 __in efx_nic_t *enp); 208 209 extern __checkReturn efx_rc_t 210 hunt_mac_multicast_list_set( 211 __in efx_nic_t *enp); 212 213 extern __checkReturn efx_rc_t 214 hunt_mac_filter_default_rxq_set( 215 __in efx_nic_t *enp, 216 __in efx_rxq_t *erp, 217 __in boolean_t using_rss); 218 219 extern void 220 hunt_mac_filter_default_rxq_clear( 221 __in efx_nic_t *enp); 222 223 #if EFSYS_OPT_LOOPBACK 224 225 extern __checkReturn efx_rc_t 226 hunt_mac_loopback_set( 227 __in efx_nic_t *enp, 228 __in efx_link_mode_t link_mode, 229 __in efx_loopback_type_t loopback_type); 230 231 #endif /* EFSYS_OPT_LOOPBACK */ 232 233 #if EFSYS_OPT_MAC_STATS 234 235 extern __checkReturn efx_rc_t 236 hunt_mac_stats_update( 237 __in efx_nic_t *enp, 238 __in efsys_mem_t *esmp, 239 __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat, 240 __inout_opt uint32_t *generationp); 241 242 #endif /* EFSYS_OPT_MAC_STATS */ 243 244 245 /* MCDI */ 246 247 #if EFSYS_OPT_MCDI 248 249 extern __checkReturn efx_rc_t 250 hunt_mcdi_init( 251 __in efx_nic_t *enp, 252 __in const efx_mcdi_transport_t *mtp); 253 254 extern void 255 hunt_mcdi_fini( 256 __in efx_nic_t *enp); 257 258 extern void 259 hunt_mcdi_request_copyin( 260 __in efx_nic_t *enp, 261 __in efx_mcdi_req_t *emrp, 262 __in unsigned int seq, 263 __in boolean_t ev_cpl, 264 __in boolean_t new_epoch); 265 266 extern __checkReturn boolean_t 267 hunt_mcdi_request_poll( 268 __in efx_nic_t *enp); 269 270 extern void 271 hunt_mcdi_request_copyout( 272 __in efx_nic_t *enp, 273 __in efx_mcdi_req_t *emrp); 274 275 extern efx_rc_t 276 hunt_mcdi_poll_reboot( 277 __in efx_nic_t *enp); 278 279 extern __checkReturn efx_rc_t 280 hunt_mcdi_fw_update_supported( 281 __in efx_nic_t *enp, 282 __out boolean_t *supportedp); 283 284 extern __checkReturn efx_rc_t 285 hunt_mcdi_macaddr_change_supported( 286 __in efx_nic_t *enp, 287 __out boolean_t *supportedp); 288 289 extern __checkReturn efx_rc_t 290 hunt_mcdi_link_control_supported( 291 __in efx_nic_t *enp, 292 __out boolean_t *supportedp); 293 294 #endif /* EFSYS_OPT_MCDI */ 295 296 /* NVRAM */ 297 298 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 299 300 extern __checkReturn efx_rc_t 301 hunt_nvram_buf_read_tlv( 302 __in efx_nic_t *enp, 303 __in_bcount(max_seg_size) caddr_t seg_data, 304 __in size_t max_seg_size, 305 __in uint32_t tag, 306 __deref_out_bcount_opt(*sizep) caddr_t *datap, 307 __out size_t *sizep); 308 309 extern __checkReturn efx_rc_t 310 hunt_nvram_buf_write_tlv( 311 __inout_bcount(partn_size) caddr_t partn_data, 312 __in size_t partn_size, 313 __in uint32_t tag, 314 __in_bcount(tag_size) caddr_t tag_data, 315 __in size_t tag_size, 316 __out size_t *total_lengthp); 317 318 extern __checkReturn efx_rc_t 319 hunt_nvram_partn_read_tlv( 320 __in efx_nic_t *enp, 321 __in uint32_t partn, 322 __in uint32_t tag, 323 __deref_out_bcount_opt(*sizep) caddr_t *datap, 324 __out size_t *sizep); 325 326 extern __checkReturn efx_rc_t 327 hunt_nvram_partn_write_tlv( 328 __in efx_nic_t *enp, 329 __in uint32_t partn, 330 __in uint32_t tag, 331 __in_bcount(size) caddr_t data, 332 __in size_t size); 333 334 extern __checkReturn efx_rc_t 335 hunt_nvram_partn_write_segment_tlv( 336 __in efx_nic_t *enp, 337 __in uint32_t partn, 338 __in uint32_t tag, 339 __in_bcount(size) caddr_t data, 340 __in size_t size, 341 __in boolean_t all_segments); 342 343 extern __checkReturn efx_rc_t 344 hunt_nvram_partn_size( 345 __in efx_nic_t *enp, 346 __in unsigned int partn, 347 __out size_t *sizep); 348 349 extern __checkReturn efx_rc_t 350 hunt_nvram_partn_lock( 351 __in efx_nic_t *enp, 352 __in unsigned int partn); 353 354 extern __checkReturn efx_rc_t 355 hunt_nvram_partn_read( 356 __in efx_nic_t *enp, 357 __in unsigned int partn, 358 __in unsigned int offset, 359 __out_bcount(size) caddr_t data, 360 __in size_t size); 361 362 extern __checkReturn efx_rc_t 363 hunt_nvram_partn_erase( 364 __in efx_nic_t *enp, 365 __in unsigned int partn, 366 __in unsigned int offset, 367 __in size_t size); 368 369 extern __checkReturn efx_rc_t 370 hunt_nvram_partn_write( 371 __in efx_nic_t *enp, 372 __in unsigned int partn, 373 __in unsigned int offset, 374 __out_bcount(size) caddr_t data, 375 __in size_t size); 376 377 extern void 378 hunt_nvram_partn_unlock( 379 __in efx_nic_t *enp, 380 __in unsigned int partn); 381 382 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 383 384 #if EFSYS_OPT_NVRAM 385 386 #if EFSYS_OPT_DIAG 387 388 extern __checkReturn efx_rc_t 389 hunt_nvram_test( 390 __in efx_nic_t *enp); 391 392 #endif /* EFSYS_OPT_DIAG */ 393 394 extern __checkReturn efx_rc_t 395 hunt_nvram_size( 396 __in efx_nic_t *enp, 397 __in efx_nvram_type_t type, 398 __out size_t *sizep); 399 400 extern __checkReturn efx_rc_t 401 hunt_nvram_get_version( 402 __in efx_nic_t *enp, 403 __in efx_nvram_type_t type, 404 __out uint32_t *subtypep, 405 __out_ecount(4) uint16_t version[4]); 406 407 extern __checkReturn efx_rc_t 408 hunt_nvram_rw_start( 409 __in efx_nic_t *enp, 410 __in efx_nvram_type_t type, 411 __out size_t *pref_chunkp); 412 413 extern __checkReturn efx_rc_t 414 hunt_nvram_read_chunk( 415 __in efx_nic_t *enp, 416 __in efx_nvram_type_t type, 417 __in unsigned int offset, 418 __out_bcount(size) caddr_t data, 419 __in size_t size); 420 421 extern __checkReturn efx_rc_t 422 hunt_nvram_erase( 423 __in efx_nic_t *enp, 424 __in efx_nvram_type_t type); 425 426 extern __checkReturn efx_rc_t 427 hunt_nvram_write_chunk( 428 __in efx_nic_t *enp, 429 __in efx_nvram_type_t type, 430 __in unsigned int offset, 431 __in_bcount(size) caddr_t data, 432 __in size_t size); 433 434 extern void 435 hunt_nvram_rw_finish( 436 __in efx_nic_t *enp, 437 __in efx_nvram_type_t type); 438 439 extern __checkReturn efx_rc_t 440 hunt_nvram_partn_set_version( 441 __in efx_nic_t *enp, 442 __in unsigned int partn, 443 __in_ecount(4) uint16_t version[4]); 444 445 extern __checkReturn efx_rc_t 446 hunt_nvram_set_version( 447 __in efx_nic_t *enp, 448 __in efx_nvram_type_t type, 449 __in_ecount(4) uint16_t version[4]); 450 451 #endif /* EFSYS_OPT_NVRAM */ 452 453 454 /* PHY */ 455 456 typedef struct hunt_link_state_s { 457 uint32_t hls_adv_cap_mask; 458 uint32_t hls_lp_cap_mask; 459 unsigned int hls_fcntl; 460 efx_link_mode_t hls_link_mode; 461 #if EFSYS_OPT_LOOPBACK 462 efx_loopback_type_t hls_loopback; 463 #endif 464 boolean_t hls_mac_up; 465 } hunt_link_state_t; 466 467 extern void 468 hunt_phy_link_ev( 469 __in efx_nic_t *enp, 470 __in efx_qword_t *eqp, 471 __out efx_link_mode_t *link_modep); 472 473 extern __checkReturn efx_rc_t 474 hunt_phy_get_link( 475 __in efx_nic_t *enp, 476 __out hunt_link_state_t *hlsp); 477 478 extern __checkReturn efx_rc_t 479 hunt_phy_power( 480 __in efx_nic_t *enp, 481 __in boolean_t on); 482 483 extern __checkReturn efx_rc_t 484 hunt_phy_reconfigure( 485 __in efx_nic_t *enp); 486 487 extern __checkReturn efx_rc_t 488 hunt_phy_verify( 489 __in efx_nic_t *enp); 490 491 extern __checkReturn efx_rc_t 492 hunt_phy_oui_get( 493 __in efx_nic_t *enp, 494 __out uint32_t *ouip); 495 496 #if EFSYS_OPT_PHY_STATS 497 498 extern __checkReturn efx_rc_t 499 hunt_phy_stats_update( 500 __in efx_nic_t *enp, 501 __in efsys_mem_t *esmp, 502 __inout_ecount(EFX_PHY_NSTATS) uint32_t *stat); 503 504 #endif /* EFSYS_OPT_PHY_STATS */ 505 506 #if EFSYS_OPT_PHY_PROPS 507 508 #if EFSYS_OPT_NAMES 509 510 extern const char * 511 hunt_phy_prop_name( 512 __in efx_nic_t *enp, 513 __in unsigned int id); 514 515 #endif /* EFSYS_OPT_NAMES */ 516 517 extern __checkReturn efx_rc_t 518 hunt_phy_prop_get( 519 __in efx_nic_t *enp, 520 __in unsigned int id, 521 __in uint32_t flags, 522 __out uint32_t *valp); 523 524 extern __checkReturn efx_rc_t 525 hunt_phy_prop_set( 526 __in efx_nic_t *enp, 527 __in unsigned int id, 528 __in uint32_t val); 529 530 #endif /* EFSYS_OPT_PHY_PROPS */ 531 532 #if EFSYS_OPT_BIST 533 534 extern __checkReturn efx_rc_t 535 hunt_bist_enable_offline( 536 __in efx_nic_t *enp); 537 538 extern __checkReturn efx_rc_t 539 hunt_bist_start( 540 __in efx_nic_t *enp, 541 __in efx_bist_type_t type); 542 543 extern __checkReturn efx_rc_t 544 hunt_bist_poll( 545 __in efx_nic_t *enp, 546 __in efx_bist_type_t type, 547 __out efx_bist_result_t *resultp, 548 __out_opt __drv_when(count > 0, __notnull) 549 uint32_t *value_maskp, 550 __out_ecount_opt(count) __drv_when(count > 0, __notnull) 551 unsigned long *valuesp, 552 __in size_t count); 553 554 extern void 555 hunt_bist_stop( 556 __in efx_nic_t *enp, 557 __in efx_bist_type_t type); 558 559 #endif /* EFSYS_OPT_BIST */ 560 561 562 /* SRAM */ 563 564 #if EFSYS_OPT_DIAG 565 566 extern __checkReturn efx_rc_t 567 hunt_sram_test( 568 __in efx_nic_t *enp, 569 __in efx_sram_pattern_fn_t func); 570 571 #endif /* EFSYS_OPT_DIAG */ 572 573 574 /* TX */ 575 576 extern __checkReturn efx_rc_t 577 hunt_tx_init( 578 __in efx_nic_t *enp); 579 580 extern void 581 hunt_tx_fini( 582 __in efx_nic_t *enp); 583 584 extern __checkReturn efx_rc_t 585 hunt_tx_qcreate( 586 __in efx_nic_t *enp, 587 __in unsigned int index, 588 __in unsigned int label, 589 __in efsys_mem_t *esmp, 590 __in size_t n, 591 __in uint32_t id, 592 __in uint16_t flags, 593 __in efx_evq_t *eep, 594 __in efx_txq_t *etp, 595 __out unsigned int *addedp); 596 597 extern void 598 hunt_tx_qdestroy( 599 __in efx_txq_t *etp); 600 601 extern __checkReturn efx_rc_t 602 hunt_tx_qpost( 603 __in efx_txq_t *etp, 604 __in_ecount(n) efx_buffer_t *eb, 605 __in unsigned int n, 606 __in unsigned int completed, 607 __inout unsigned int *addedp); 608 609 extern void 610 hunt_tx_qpush( 611 __in efx_txq_t *etp, 612 __in unsigned int added, 613 __in unsigned int pushed); 614 615 extern __checkReturn efx_rc_t 616 hunt_tx_qpace( 617 __in efx_txq_t *etp, 618 __in unsigned int ns); 619 620 extern __checkReturn efx_rc_t 621 hunt_tx_qflush( 622 __in efx_txq_t *etp); 623 624 extern void 625 hunt_tx_qenable( 626 __in efx_txq_t *etp); 627 628 extern __checkReturn efx_rc_t 629 hunt_tx_qpio_enable( 630 __in efx_txq_t *etp); 631 632 extern void 633 hunt_tx_qpio_disable( 634 __in efx_txq_t *etp); 635 636 extern __checkReturn efx_rc_t 637 hunt_tx_qpio_write( 638 __in efx_txq_t *etp, 639 __in_ecount(buf_length) uint8_t *buffer, 640 __in size_t buf_length, 641 __in size_t pio_buf_offset); 642 643 extern __checkReturn efx_rc_t 644 hunt_tx_qpio_post( 645 __in efx_txq_t *etp, 646 __in size_t pkt_length, 647 __in unsigned int completed, 648 __inout unsigned int *addedp); 649 650 extern __checkReturn efx_rc_t 651 hunt_tx_qdesc_post( 652 __in efx_txq_t *etp, 653 __in_ecount(n) efx_desc_t *ed, 654 __in unsigned int n, 655 __in unsigned int completed, 656 __inout unsigned int *addedp); 657 658 extern void 659 hunt_tx_qdesc_dma_create( 660 __in efx_txq_t *etp, 661 __in efsys_dma_addr_t addr, 662 __in size_t size, 663 __in boolean_t eop, 664 __out efx_desc_t *edp); 665 666 extern void 667 hunt_tx_qdesc_tso_create( 668 __in efx_txq_t *etp, 669 __in uint16_t ipv4_id, 670 __in uint32_t tcp_seq, 671 __in uint8_t tcp_flags, 672 __out efx_desc_t *edp); 673 674 extern void 675 hunt_tx_qdesc_vlantci_create( 676 __in efx_txq_t *etp, 677 __in uint16_t vlan_tci, 678 __out efx_desc_t *edp); 679 680 681 #if EFSYS_OPT_QSTATS 682 683 extern void 684 hunt_tx_qstats_update( 685 __in efx_txq_t *etp, 686 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); 687 688 #endif /* EFSYS_OPT_QSTATS */ 689 690 /* PIO */ 691 692 /* Missing register definitions */ 693 #ifndef ER_DZ_TX_PIOBUF_OFST 694 #define ER_DZ_TX_PIOBUF_OFST 0x00001000 695 #endif 696 #ifndef ER_DZ_TX_PIOBUF_STEP 697 #define ER_DZ_TX_PIOBUF_STEP 8192 698 #endif 699 #ifndef ER_DZ_TX_PIOBUF_ROWS 700 #define ER_DZ_TX_PIOBUF_ROWS 2048 701 #endif 702 703 #ifndef ER_DZ_TX_PIOBUF_SIZE 704 #define ER_DZ_TX_PIOBUF_SIZE 2048 705 #endif 706 707 #define HUNT_PIOBUF_NBUFS (16) 708 #define HUNT_PIOBUF_SIZE (ER_DZ_TX_PIOBUF_SIZE) 709 710 #define HUNT_MIN_PIO_ALLOC_SIZE (HUNT_PIOBUF_SIZE / 32) 711 712 #define HUNT_LEGACY_PF_PRIVILEGE_MASK \ 713 (MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN | \ 714 MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK | \ 715 MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD | \ 716 MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP | \ 717 MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS | \ 718 MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING | \ 719 MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST | \ 720 MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST | \ 721 MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST | \ 722 MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST | \ 723 MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS) 724 725 #define HUNT_LEGACY_VF_PRIVILEGE_MASK 0 726 727 typedef uint32_t efx_piobuf_handle_t; 728 729 #define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1) 730 731 extern __checkReturn efx_rc_t 732 hunt_nic_pio_alloc( 733 __inout efx_nic_t *enp, 734 __out uint32_t *bufnump, 735 __out efx_piobuf_handle_t *handlep, 736 __out uint32_t *blknump, 737 __out uint32_t *offsetp, 738 __out size_t *sizep); 739 740 extern __checkReturn efx_rc_t 741 hunt_nic_pio_free( 742 __inout efx_nic_t *enp, 743 __in uint32_t bufnum, 744 __in uint32_t blknum); 745 746 extern __checkReturn efx_rc_t 747 hunt_nic_pio_link( 748 __inout efx_nic_t *enp, 749 __in uint32_t vi_index, 750 __in efx_piobuf_handle_t handle); 751 752 extern __checkReturn efx_rc_t 753 hunt_nic_pio_unlink( 754 __inout efx_nic_t *enp, 755 __in uint32_t vi_index); 756 757 758 /* VPD */ 759 760 #if EFSYS_OPT_VPD 761 762 extern __checkReturn efx_rc_t 763 hunt_vpd_init( 764 __in efx_nic_t *enp); 765 766 extern __checkReturn efx_rc_t 767 hunt_vpd_size( 768 __in efx_nic_t *enp, 769 __out size_t *sizep); 770 771 extern __checkReturn efx_rc_t 772 hunt_vpd_read( 773 __in efx_nic_t *enp, 774 __out_bcount(size) caddr_t data, 775 __in size_t size); 776 777 extern __checkReturn efx_rc_t 778 hunt_vpd_verify( 779 __in efx_nic_t *enp, 780 __in_bcount(size) caddr_t data, 781 __in size_t size); 782 783 extern __checkReturn efx_rc_t 784 hunt_vpd_reinit( 785 __in efx_nic_t *enp, 786 __in_bcount(size) caddr_t data, 787 __in size_t size); 788 789 extern __checkReturn efx_rc_t 790 hunt_vpd_get( 791 __in efx_nic_t *enp, 792 __in_bcount(size) caddr_t data, 793 __in size_t size, 794 __inout efx_vpd_value_t *evvp); 795 796 extern __checkReturn efx_rc_t 797 hunt_vpd_set( 798 __in efx_nic_t *enp, 799 __in_bcount(size) caddr_t data, 800 __in size_t size, 801 __in efx_vpd_value_t *evvp); 802 803 extern __checkReturn efx_rc_t 804 hunt_vpd_next( 805 __in efx_nic_t *enp, 806 __in_bcount(size) caddr_t data, 807 __in size_t size, 808 __out efx_vpd_value_t *evvp, 809 __inout unsigned int *contp); 810 811 extern __checkReturn efx_rc_t 812 hunt_vpd_write( 813 __in efx_nic_t *enp, 814 __in_bcount(size) caddr_t data, 815 __in size_t size); 816 817 extern void 818 hunt_vpd_fini( 819 __in efx_nic_t *enp); 820 821 #endif /* EFSYS_OPT_VPD */ 822 823 824 /* RX */ 825 826 extern __checkReturn efx_rc_t 827 hunt_rx_init( 828 __in efx_nic_t *enp); 829 830 #if EFSYS_OPT_RX_HDR_SPLIT 831 extern __checkReturn efx_rc_t 832 hunt_rx_hdr_split_enable( 833 __in efx_nic_t *enp, 834 __in unsigned int hdr_buf_size, 835 __in unsigned int pld_buf_size); 836 #endif /* EFSYS_OPT_RX_HDR_SPLIT */ 837 838 #if EFSYS_OPT_RX_SCATTER 839 extern __checkReturn efx_rc_t 840 hunt_rx_scatter_enable( 841 __in efx_nic_t *enp, 842 __in unsigned int buf_size); 843 #endif /* EFSYS_OPT_RX_SCATTER */ 844 845 846 #if EFSYS_OPT_RX_SCALE 847 848 extern __checkReturn efx_rc_t 849 hunt_rx_scale_mode_set( 850 __in efx_nic_t *enp, 851 __in efx_rx_hash_alg_t alg, 852 __in efx_rx_hash_type_t type, 853 __in boolean_t insert); 854 855 extern __checkReturn efx_rc_t 856 hunt_rx_scale_key_set( 857 __in efx_nic_t *enp, 858 __in_ecount(n) uint8_t *key, 859 __in size_t n); 860 861 extern __checkReturn efx_rc_t 862 hunt_rx_scale_tbl_set( 863 __in efx_nic_t *enp, 864 __in_ecount(n) unsigned int *table, 865 __in size_t n); 866 867 #endif /* EFSYS_OPT_RX_SCALE */ 868 869 extern void 870 hunt_rx_qpost( 871 __in efx_rxq_t *erp, 872 __in_ecount(n) efsys_dma_addr_t *addrp, 873 __in size_t size, 874 __in unsigned int n, 875 __in unsigned int completed, 876 __in unsigned int added); 877 878 extern void 879 hunt_rx_qpush( 880 __in efx_rxq_t *erp, 881 __in unsigned int added, 882 __inout unsigned int *pushedp); 883 884 extern __checkReturn efx_rc_t 885 hunt_rx_qflush( 886 __in efx_rxq_t *erp); 887 888 extern void 889 hunt_rx_qenable( 890 __in efx_rxq_t *erp); 891 892 extern __checkReturn efx_rc_t 893 hunt_rx_qcreate( 894 __in efx_nic_t *enp, 895 __in unsigned int index, 896 __in unsigned int label, 897 __in efx_rxq_type_t type, 898 __in efsys_mem_t *esmp, 899 __in size_t n, 900 __in uint32_t id, 901 __in efx_evq_t *eep, 902 __in efx_rxq_t *erp); 903 904 extern void 905 hunt_rx_qdestroy( 906 __in efx_rxq_t *erp); 907 908 extern void 909 hunt_rx_fini( 910 __in efx_nic_t *enp); 911 912 #if EFSYS_OPT_FILTER 913 914 typedef struct hunt_filter_handle_s { 915 uint32_t hfh_lo; 916 uint32_t hfh_hi; 917 } hunt_filter_handle_t; 918 919 typedef struct hunt_filter_entry_s { 920 uintptr_t hfe_spec; /* pointer to filter spec plus busy bit */ 921 hunt_filter_handle_t hfe_handle; 922 } hunt_filter_entry_t; 923 924 /* 925 * BUSY flag indicates that an update is in progress. 926 * AUTO_OLD flag is used to mark and sweep MAC packet filters. 927 */ 928 #define EFX_HUNT_FILTER_FLAG_BUSY 1U 929 #define EFX_HUNT_FILTER_FLAG_AUTO_OLD 2U 930 #define EFX_HUNT_FILTER_FLAGS 3U 931 932 #define EFX_HUNT_FILTER_TBL_ROWS 8192 933 934 /* Allow for the broadcast address to be added to the multicast list */ 935 #define EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX (EFX_MAC_MULTICAST_LIST_MAX + 1) 936 937 typedef struct hunt_filter_table_s { 938 hunt_filter_entry_t hft_entry[EFX_HUNT_FILTER_TBL_ROWS]; 939 efx_rxq_t * hft_default_rxq; 940 boolean_t hft_using_rss; 941 uint32_t hft_unicst_filter_index; 942 boolean_t hft_unicst_filter_set; 943 uint32_t hft_mulcst_filter_indexes[ 944 EFX_HUNT_FILTER_MULTICAST_FILTERS_MAX]; 945 uint32_t hft_mulcst_filter_count; 946 } hunt_filter_table_t; 947 948 __checkReturn efx_rc_t 949 hunt_filter_init( 950 __in efx_nic_t *enp); 951 952 void 953 hunt_filter_fini( 954 __in efx_nic_t *enp); 955 956 __checkReturn efx_rc_t 957 hunt_filter_restore( 958 __in efx_nic_t *enp); 959 960 __checkReturn efx_rc_t 961 hunt_filter_add( 962 __in efx_nic_t *enp, 963 __inout efx_filter_spec_t *spec, 964 __in boolean_t may_replace); 965 966 __checkReturn efx_rc_t 967 hunt_filter_delete( 968 __in efx_nic_t *enp, 969 __inout efx_filter_spec_t *spec); 970 971 extern __checkReturn efx_rc_t 972 hunt_filter_supported_filters( 973 __in efx_nic_t *enp, 974 __out uint32_t *list, 975 __out size_t *length); 976 977 extern __checkReturn efx_rc_t 978 hunt_filter_reconfigure( 979 __in efx_nic_t *enp, 980 __in_ecount(6) uint8_t const *mac_addr, 981 __in boolean_t all_unicst, 982 __in boolean_t mulcst, 983 __in boolean_t all_mulcst, 984 __in boolean_t brdcst, 985 __in_ecount(6*count) uint8_t const *addrs, 986 __in int count); 987 988 extern void 989 hunt_filter_get_default_rxq( 990 __in efx_nic_t *enp, 991 __out efx_rxq_t **erpp, 992 __out boolean_t *using_rss); 993 994 extern void 995 hunt_filter_default_rxq_set( 996 __in efx_nic_t *enp, 997 __in efx_rxq_t *erp, 998 __in boolean_t using_rss); 999 1000 extern void 1001 hunt_filter_default_rxq_clear( 1002 __in efx_nic_t *enp); 1003 1004 1005 #endif /* EFSYS_OPT_FILTER */ 1006 1007 extern __checkReturn efx_rc_t 1008 hunt_pktfilter_set( 1009 __in efx_nic_t *enp, 1010 __in boolean_t unicst, 1011 __in boolean_t brdcst); 1012 1013 #if EFSYS_OPT_MCAST_FILTER_LIST 1014 1015 extern __checkReturn efx_rc_t 1016 hunt_pktfilter_mcast_set( 1017 __in efx_nic_t *enp, 1018 __in uint8_t const *addrs, 1019 __in int count); 1020 1021 #endif /* EFSYS_OPT_MCAST_FILTER_LIST */ 1022 1023 extern __checkReturn efx_rc_t 1024 hunt_pktfilter_mcast_all( 1025 __in efx_nic_t *enp); 1026 1027 extern __checkReturn efx_rc_t 1028 efx_mcdi_get_function_info( 1029 __in efx_nic_t *enp, 1030 __out uint32_t *pfp, 1031 __out_opt uint32_t *vfp); 1032 1033 extern __checkReturn efx_rc_t 1034 efx_mcdi_privilege_mask( 1035 __in efx_nic_t *enp, 1036 __in uint32_t pf, 1037 __in uint32_t vf, 1038 __out uint32_t *maskp); 1039 1040 #ifdef __cplusplus 1041 } 1042 #endif 1043 1044 #endif /* _SYS_HUNT_IMPL_H */ 1045