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 /* 46 * FIXME: This is just a power of 2 which fits in an MCDI v1 message, and could 47 * possibly be increased, or the write size reported by newer firmware used 48 * instead. 49 */ 50 #define EF10_NVRAM_CHUNK 0x80 51 52 /* Alignment requirement for value written to RX WPTR: 53 * the WPTR must be aligned to an 8 descriptor boundary 54 */ 55 #define EF10_RX_WPTR_ALIGN 8 56 57 /* 58 * Max byte offset into the packet the TCP header must start for the hardware 59 * to be able to parse the packet correctly. 60 * FIXME: Move to ef10_impl.h when it is included in all driver builds. 61 */ 62 #define EF10_TCP_HEADER_OFFSET_LIMIT 208 63 64 /* Invalid RSS context handle */ 65 #define EF10_RSS_CONTEXT_INVALID (0xffffffff) 66 67 68 /* EV */ 69 70 __checkReturn efx_rc_t 71 ef10_ev_init( 72 __in efx_nic_t *enp); 73 74 void 75 ef10_ev_fini( 76 __in efx_nic_t *enp); 77 78 __checkReturn efx_rc_t 79 ef10_ev_qcreate( 80 __in efx_nic_t *enp, 81 __in unsigned int index, 82 __in efsys_mem_t *esmp, 83 __in size_t n, 84 __in uint32_t id, 85 __in efx_evq_t *eep); 86 87 void 88 ef10_ev_qdestroy( 89 __in efx_evq_t *eep); 90 91 __checkReturn efx_rc_t 92 ef10_ev_qprime( 93 __in efx_evq_t *eep, 94 __in unsigned int count); 95 96 void 97 ef10_ev_qpost( 98 __in efx_evq_t *eep, 99 __in uint16_t data); 100 101 __checkReturn efx_rc_t 102 ef10_ev_qmoderate( 103 __in efx_evq_t *eep, 104 __in unsigned int us); 105 106 #if EFSYS_OPT_QSTATS 107 void 108 ef10_ev_qstats_update( 109 __in efx_evq_t *eep, 110 __inout_ecount(EV_NQSTATS) efsys_stat_t *stat); 111 #endif /* EFSYS_OPT_QSTATS */ 112 113 void 114 ef10_ev_rxlabel_init( 115 __in efx_evq_t *eep, 116 __in efx_rxq_t *erp, 117 __in unsigned int label); 118 119 void 120 ef10_ev_rxlabel_fini( 121 __in efx_evq_t *eep, 122 __in unsigned int label); 123 124 /* INTR */ 125 126 __checkReturn efx_rc_t 127 ef10_intr_init( 128 __in efx_nic_t *enp, 129 __in efx_intr_type_t type, 130 __in efsys_mem_t *esmp); 131 132 void 133 ef10_intr_enable( 134 __in efx_nic_t *enp); 135 136 void 137 ef10_intr_disable( 138 __in efx_nic_t *enp); 139 140 void 141 ef10_intr_disable_unlocked( 142 __in efx_nic_t *enp); 143 144 __checkReturn efx_rc_t 145 ef10_intr_trigger( 146 __in efx_nic_t *enp, 147 __in unsigned int level); 148 149 void 150 ef10_intr_status_line( 151 __in efx_nic_t *enp, 152 __out boolean_t *fatalp, 153 __out uint32_t *qmaskp); 154 155 void 156 ef10_intr_status_message( 157 __in efx_nic_t *enp, 158 __in unsigned int message, 159 __out boolean_t *fatalp); 160 161 void 162 ef10_intr_fatal( 163 __in efx_nic_t *enp); 164 void 165 ef10_intr_fini( 166 __in efx_nic_t *enp); 167 168 /* NIC */ 169 170 extern __checkReturn efx_rc_t 171 ef10_nic_probe( 172 __in efx_nic_t *enp); 173 174 extern __checkReturn efx_rc_t 175 hunt_board_cfg( 176 __in efx_nic_t *enp); 177 178 extern __checkReturn efx_rc_t 179 ef10_nic_set_drv_limits( 180 __inout efx_nic_t *enp, 181 __in efx_drv_limits_t *edlp); 182 183 extern __checkReturn efx_rc_t 184 ef10_nic_get_vi_pool( 185 __in efx_nic_t *enp, 186 __out uint32_t *vi_countp); 187 188 extern __checkReturn efx_rc_t 189 ef10_nic_get_bar_region( 190 __in efx_nic_t *enp, 191 __in efx_nic_region_t region, 192 __out uint32_t *offsetp, 193 __out size_t *sizep); 194 195 extern __checkReturn efx_rc_t 196 ef10_nic_reset( 197 __in efx_nic_t *enp); 198 199 extern __checkReturn efx_rc_t 200 ef10_nic_init( 201 __in efx_nic_t *enp); 202 203 #if EFSYS_OPT_DIAG 204 205 extern __checkReturn efx_rc_t 206 ef10_nic_register_test( 207 __in efx_nic_t *enp); 208 209 #endif /* EFSYS_OPT_DIAG */ 210 211 extern void 212 ef10_nic_fini( 213 __in efx_nic_t *enp); 214 215 extern void 216 ef10_nic_unprobe( 217 __in efx_nic_t *enp); 218 219 220 /* MAC */ 221 222 extern __checkReturn efx_rc_t 223 ef10_mac_poll( 224 __in efx_nic_t *enp, 225 __out efx_link_mode_t *link_modep); 226 227 extern __checkReturn efx_rc_t 228 ef10_mac_up( 229 __in efx_nic_t *enp, 230 __out boolean_t *mac_upp); 231 232 extern __checkReturn efx_rc_t 233 ef10_mac_addr_set( 234 __in efx_nic_t *enp); 235 236 extern __checkReturn efx_rc_t 237 ef10_mac_pdu_set( 238 __in efx_nic_t *enp); 239 240 extern __checkReturn efx_rc_t 241 ef10_mac_reconfigure( 242 __in efx_nic_t *enp); 243 244 extern __checkReturn efx_rc_t 245 ef10_mac_multicast_list_set( 246 __in efx_nic_t *enp); 247 248 extern __checkReturn efx_rc_t 249 ef10_mac_filter_default_rxq_set( 250 __in efx_nic_t *enp, 251 __in efx_rxq_t *erp, 252 __in boolean_t using_rss); 253 254 extern void 255 ef10_mac_filter_default_rxq_clear( 256 __in efx_nic_t *enp); 257 258 #if EFSYS_OPT_LOOPBACK 259 260 extern __checkReturn efx_rc_t 261 ef10_mac_loopback_set( 262 __in efx_nic_t *enp, 263 __in efx_link_mode_t link_mode, 264 __in efx_loopback_type_t loopback_type); 265 266 #endif /* EFSYS_OPT_LOOPBACK */ 267 268 #if EFSYS_OPT_MAC_STATS 269 270 extern __checkReturn efx_rc_t 271 ef10_mac_stats_update( 272 __in efx_nic_t *enp, 273 __in efsys_mem_t *esmp, 274 __inout_ecount(EFX_MAC_NSTATS) efsys_stat_t *stat, 275 __inout_opt uint32_t *generationp); 276 277 #endif /* EFSYS_OPT_MAC_STATS */ 278 279 280 /* MCDI */ 281 282 #if EFSYS_OPT_MCDI 283 284 extern __checkReturn efx_rc_t 285 ef10_mcdi_init( 286 __in efx_nic_t *enp, 287 __in const efx_mcdi_transport_t *mtp); 288 289 extern void 290 ef10_mcdi_fini( 291 __in efx_nic_t *enp); 292 293 extern void 294 ef10_mcdi_send_request( 295 __in efx_nic_t *enp, 296 __in void *hdrp, 297 __in size_t hdr_len, 298 __in void *sdup, 299 __in size_t sdu_len); 300 301 extern __checkReturn boolean_t 302 ef10_mcdi_poll_response( 303 __in efx_nic_t *enp); 304 305 extern void 306 ef10_mcdi_read_response( 307 __in efx_nic_t *enp, 308 __out_bcount(length) void *bufferp, 309 __in size_t offset, 310 __in size_t length); 311 312 extern efx_rc_t 313 ef10_mcdi_poll_reboot( 314 __in efx_nic_t *enp); 315 316 extern __checkReturn efx_rc_t 317 ef10_mcdi_feature_supported( 318 __in efx_nic_t *enp, 319 __in efx_mcdi_feature_id_t id, 320 __out boolean_t *supportedp); 321 322 #endif /* EFSYS_OPT_MCDI */ 323 324 /* NVRAM */ 325 326 #if EFSYS_OPT_NVRAM || EFSYS_OPT_VPD 327 328 extern __checkReturn efx_rc_t 329 ef10_nvram_buf_read_tlv( 330 __in efx_nic_t *enp, 331 __in_bcount(max_seg_size) caddr_t seg_data, 332 __in size_t max_seg_size, 333 __in uint32_t tag, 334 __deref_out_bcount_opt(*sizep) caddr_t *datap, 335 __out size_t *sizep); 336 337 extern __checkReturn efx_rc_t 338 ef10_nvram_buf_write_tlv( 339 __inout_bcount(partn_size) caddr_t partn_data, 340 __in size_t partn_size, 341 __in uint32_t tag, 342 __in_bcount(tag_size) caddr_t tag_data, 343 __in size_t tag_size, 344 __out size_t *total_lengthp); 345 346 extern __checkReturn efx_rc_t 347 ef10_nvram_partn_read_tlv( 348 __in efx_nic_t *enp, 349 __in uint32_t partn, 350 __in uint32_t tag, 351 __deref_out_bcount_opt(*sizep) caddr_t *datap, 352 __out size_t *sizep); 353 354 extern __checkReturn efx_rc_t 355 ef10_nvram_partn_write_tlv( 356 __in efx_nic_t *enp, 357 __in uint32_t partn, 358 __in uint32_t tag, 359 __in_bcount(size) caddr_t data, 360 __in size_t size); 361 362 extern __checkReturn efx_rc_t 363 ef10_nvram_partn_write_segment_tlv( 364 __in efx_nic_t *enp, 365 __in uint32_t partn, 366 __in uint32_t tag, 367 __in_bcount(size) caddr_t data, 368 __in size_t size, 369 __in boolean_t all_segments); 370 371 extern __checkReturn efx_rc_t 372 ef10_nvram_partn_lock( 373 __in efx_nic_t *enp, 374 __in uint32_t partn); 375 376 extern void 377 ef10_nvram_partn_unlock( 378 __in efx_nic_t *enp, 379 __in uint32_t partn); 380 381 #endif /* EFSYS_OPT_NVRAM || EFSYS_OPT_VPD */ 382 383 #if EFSYS_OPT_NVRAM 384 385 #if EFSYS_OPT_DIAG 386 387 extern __checkReturn efx_rc_t 388 ef10_nvram_test( 389 __in efx_nic_t *enp); 390 391 #endif /* EFSYS_OPT_DIAG */ 392 393 extern __checkReturn efx_rc_t 394 ef10_nvram_type_to_partn( 395 __in efx_nic_t *enp, 396 __in efx_nvram_type_t type, 397 __out uint32_t *partnp); 398 399 extern __checkReturn efx_rc_t 400 ef10_nvram_partn_size( 401 __in efx_nic_t *enp, 402 __in uint32_t partn, 403 __out size_t *sizep); 404 405 extern __checkReturn efx_rc_t 406 ef10_nvram_partn_rw_start( 407 __in efx_nic_t *enp, 408 __in uint32_t partn, 409 __out size_t *chunk_sizep); 410 411 extern __checkReturn efx_rc_t 412 ef10_nvram_partn_read_mode( 413 __in efx_nic_t *enp, 414 __in uint32_t partn, 415 __in unsigned int offset, 416 __out_bcount(size) caddr_t data, 417 __in size_t size, 418 __in uint32_t mode); 419 420 extern __checkReturn efx_rc_t 421 ef10_nvram_partn_read( 422 __in efx_nic_t *enp, 423 __in uint32_t partn, 424 __in unsigned int offset, 425 __out_bcount(size) caddr_t data, 426 __in size_t size); 427 428 extern __checkReturn efx_rc_t 429 ef10_nvram_partn_erase( 430 __in efx_nic_t *enp, 431 __in uint32_t partn, 432 __in unsigned int offset, 433 __in size_t size); 434 435 extern __checkReturn efx_rc_t 436 ef10_nvram_partn_write( 437 __in efx_nic_t *enp, 438 __in uint32_t partn, 439 __in unsigned int offset, 440 __out_bcount(size) caddr_t data, 441 __in size_t size); 442 443 extern void 444 ef10_nvram_partn_rw_finish( 445 __in efx_nic_t *enp, 446 __in uint32_t partn); 447 448 extern __checkReturn efx_rc_t 449 ef10_nvram_partn_get_version( 450 __in efx_nic_t *enp, 451 __in uint32_t partn, 452 __out uint32_t *subtypep, 453 __out_ecount(4) uint16_t version[4]); 454 455 extern __checkReturn efx_rc_t 456 ef10_nvram_partn_set_version( 457 __in efx_nic_t *enp, 458 __in uint32_t partn, 459 __in_ecount(4) uint16_t version[4]); 460 461 extern __checkReturn efx_rc_t 462 ef10_nvram_buffer_validate( 463 __in efx_nic_t *enp, 464 __in uint32_t partn, 465 __in_bcount(buffer_size) 466 caddr_t bufferp, 467 __in size_t buffer_size); 468 469 #endif /* EFSYS_OPT_NVRAM */ 470 471 472 /* PHY */ 473 474 typedef struct ef10_link_state_s { 475 uint32_t els_adv_cap_mask; 476 uint32_t els_lp_cap_mask; 477 unsigned int els_fcntl; 478 efx_link_mode_t els_link_mode; 479 #if EFSYS_OPT_LOOPBACK 480 efx_loopback_type_t els_loopback; 481 #endif 482 boolean_t els_mac_up; 483 } ef10_link_state_t; 484 485 extern void 486 ef10_phy_link_ev( 487 __in efx_nic_t *enp, 488 __in efx_qword_t *eqp, 489 __out efx_link_mode_t *link_modep); 490 491 extern __checkReturn efx_rc_t 492 ef10_phy_get_link( 493 __in efx_nic_t *enp, 494 __out ef10_link_state_t *elsp); 495 496 extern __checkReturn efx_rc_t 497 ef10_phy_power( 498 __in efx_nic_t *enp, 499 __in boolean_t on); 500 501 extern __checkReturn efx_rc_t 502 ef10_phy_reconfigure( 503 __in efx_nic_t *enp); 504 505 extern __checkReturn efx_rc_t 506 ef10_phy_verify( 507 __in efx_nic_t *enp); 508 509 extern __checkReturn efx_rc_t 510 ef10_phy_oui_get( 511 __in efx_nic_t *enp, 512 __out uint32_t *ouip); 513 514 #if EFSYS_OPT_PHY_STATS 515 516 extern __checkReturn efx_rc_t 517 ef10_phy_stats_update( 518 __in efx_nic_t *enp, 519 __in efsys_mem_t *esmp, 520 __inout_ecount(EFX_PHY_NSTATS) uint32_t *stat); 521 522 #endif /* EFSYS_OPT_PHY_STATS */ 523 524 #if EFSYS_OPT_PHY_PROPS 525 526 #if EFSYS_OPT_NAMES 527 528 extern const char * 529 ef10_phy_prop_name( 530 __in efx_nic_t *enp, 531 __in unsigned int id); 532 533 #endif /* EFSYS_OPT_NAMES */ 534 535 extern __checkReturn efx_rc_t 536 ef10_phy_prop_get( 537 __in efx_nic_t *enp, 538 __in unsigned int id, 539 __in uint32_t flags, 540 __out uint32_t *valp); 541 542 extern __checkReturn efx_rc_t 543 ef10_phy_prop_set( 544 __in efx_nic_t *enp, 545 __in unsigned int id, 546 __in uint32_t val); 547 548 #endif /* EFSYS_OPT_PHY_PROPS */ 549 550 #if EFSYS_OPT_BIST 551 552 extern __checkReturn efx_rc_t 553 hunt_bist_enable_offline( 554 __in efx_nic_t *enp); 555 556 extern __checkReturn efx_rc_t 557 hunt_bist_start( 558 __in efx_nic_t *enp, 559 __in efx_bist_type_t type); 560 561 extern __checkReturn efx_rc_t 562 hunt_bist_poll( 563 __in efx_nic_t *enp, 564 __in efx_bist_type_t type, 565 __out efx_bist_result_t *resultp, 566 __out_opt __drv_when(count > 0, __notnull) 567 uint32_t *value_maskp, 568 __out_ecount_opt(count) __drv_when(count > 0, __notnull) 569 unsigned long *valuesp, 570 __in size_t count); 571 572 extern void 573 hunt_bist_stop( 574 __in efx_nic_t *enp, 575 __in efx_bist_type_t type); 576 577 #endif /* EFSYS_OPT_BIST */ 578 579 580 /* SRAM */ 581 582 #if EFSYS_OPT_DIAG 583 584 extern __checkReturn efx_rc_t 585 ef10_sram_test( 586 __in efx_nic_t *enp, 587 __in efx_sram_pattern_fn_t func); 588 589 #endif /* EFSYS_OPT_DIAG */ 590 591 592 /* TX */ 593 594 extern __checkReturn efx_rc_t 595 ef10_tx_init( 596 __in efx_nic_t *enp); 597 598 extern void 599 ef10_tx_fini( 600 __in efx_nic_t *enp); 601 602 extern __checkReturn efx_rc_t 603 ef10_tx_qcreate( 604 __in efx_nic_t *enp, 605 __in unsigned int index, 606 __in unsigned int label, 607 __in efsys_mem_t *esmp, 608 __in size_t n, 609 __in uint32_t id, 610 __in uint16_t flags, 611 __in efx_evq_t *eep, 612 __in efx_txq_t *etp, 613 __out unsigned int *addedp); 614 615 extern void 616 ef10_tx_qdestroy( 617 __in efx_txq_t *etp); 618 619 extern __checkReturn efx_rc_t 620 ef10_tx_qpost( 621 __in efx_txq_t *etp, 622 __in_ecount(n) efx_buffer_t *eb, 623 __in unsigned int n, 624 __in unsigned int completed, 625 __inout unsigned int *addedp); 626 627 extern void 628 ef10_tx_qpush( 629 __in efx_txq_t *etp, 630 __in unsigned int added, 631 __in unsigned int pushed); 632 633 extern __checkReturn efx_rc_t 634 ef10_tx_qpace( 635 __in efx_txq_t *etp, 636 __in unsigned int ns); 637 638 extern __checkReturn efx_rc_t 639 ef10_tx_qflush( 640 __in efx_txq_t *etp); 641 642 extern void 643 ef10_tx_qenable( 644 __in efx_txq_t *etp); 645 646 extern __checkReturn efx_rc_t 647 ef10_tx_qpio_enable( 648 __in efx_txq_t *etp); 649 650 extern void 651 ef10_tx_qpio_disable( 652 __in efx_txq_t *etp); 653 654 extern __checkReturn efx_rc_t 655 ef10_tx_qpio_write( 656 __in efx_txq_t *etp, 657 __in_ecount(buf_length) uint8_t *buffer, 658 __in size_t buf_length, 659 __in size_t pio_buf_offset); 660 661 extern __checkReturn efx_rc_t 662 ef10_tx_qpio_post( 663 __in efx_txq_t *etp, 664 __in size_t pkt_length, 665 __in unsigned int completed, 666 __inout unsigned int *addedp); 667 668 extern __checkReturn efx_rc_t 669 ef10_tx_qdesc_post( 670 __in efx_txq_t *etp, 671 __in_ecount(n) efx_desc_t *ed, 672 __in unsigned int n, 673 __in unsigned int completed, 674 __inout unsigned int *addedp); 675 676 extern void 677 ef10_tx_qdesc_dma_create( 678 __in efx_txq_t *etp, 679 __in efsys_dma_addr_t addr, 680 __in size_t size, 681 __in boolean_t eop, 682 __out efx_desc_t *edp); 683 684 extern void 685 hunt_tx_qdesc_tso_create( 686 __in efx_txq_t *etp, 687 __in uint16_t ipv4_id, 688 __in uint32_t tcp_seq, 689 __in uint8_t tcp_flags, 690 __out efx_desc_t *edp); 691 692 extern void 693 ef10_tx_qdesc_tso2_create( 694 __in efx_txq_t *etp, 695 __in uint16_t ipv4_id, 696 __in uint32_t tcp_seq, 697 __in uint16_t tcp_mss, 698 __out_ecount(count) efx_desc_t *edp, 699 __in int count); 700 701 extern void 702 ef10_tx_qdesc_vlantci_create( 703 __in efx_txq_t *etp, 704 __in uint16_t vlan_tci, 705 __out efx_desc_t *edp); 706 707 708 #if EFSYS_OPT_QSTATS 709 710 extern void 711 ef10_tx_qstats_update( 712 __in efx_txq_t *etp, 713 __inout_ecount(TX_NQSTATS) efsys_stat_t *stat); 714 715 #endif /* EFSYS_OPT_QSTATS */ 716 717 /* PIO */ 718 719 /* Missing register definitions */ 720 #ifndef ER_DZ_TX_PIOBUF_OFST 721 #define ER_DZ_TX_PIOBUF_OFST 0x00001000 722 #endif 723 #ifndef ER_DZ_TX_PIOBUF_STEP 724 #define ER_DZ_TX_PIOBUF_STEP 8192 725 #endif 726 #ifndef ER_DZ_TX_PIOBUF_ROWS 727 #define ER_DZ_TX_PIOBUF_ROWS 2048 728 #endif 729 730 #ifndef ER_DZ_TX_PIOBUF_SIZE 731 #define ER_DZ_TX_PIOBUF_SIZE 2048 732 #endif 733 734 #define HUNT_PIOBUF_NBUFS (16) 735 #define HUNT_PIOBUF_SIZE (ER_DZ_TX_PIOBUF_SIZE) 736 737 #define HUNT_MIN_PIO_ALLOC_SIZE (HUNT_PIOBUF_SIZE / 32) 738 739 #define EF10_LEGACY_PF_PRIVILEGE_MASK \ 740 (MC_CMD_PRIVILEGE_MASK_IN_GRP_ADMIN | \ 741 MC_CMD_PRIVILEGE_MASK_IN_GRP_LINK | \ 742 MC_CMD_PRIVILEGE_MASK_IN_GRP_ONLOAD | \ 743 MC_CMD_PRIVILEGE_MASK_IN_GRP_PTP | \ 744 MC_CMD_PRIVILEGE_MASK_IN_GRP_INSECURE_FILTERS | \ 745 MC_CMD_PRIVILEGE_MASK_IN_GRP_MAC_SPOOFING | \ 746 MC_CMD_PRIVILEGE_MASK_IN_GRP_UNICAST | \ 747 MC_CMD_PRIVILEGE_MASK_IN_GRP_MULTICAST | \ 748 MC_CMD_PRIVILEGE_MASK_IN_GRP_BROADCAST | \ 749 MC_CMD_PRIVILEGE_MASK_IN_GRP_ALL_MULTICAST | \ 750 MC_CMD_PRIVILEGE_MASK_IN_GRP_PROMISCUOUS) 751 752 #define EF10_LEGACY_VF_PRIVILEGE_MASK 0 753 754 typedef uint32_t efx_piobuf_handle_t; 755 756 #define EFX_PIOBUF_HANDLE_INVALID ((efx_piobuf_handle_t) -1) 757 758 extern __checkReturn efx_rc_t 759 ef10_nic_pio_alloc( 760 __inout efx_nic_t *enp, 761 __out uint32_t *bufnump, 762 __out efx_piobuf_handle_t *handlep, 763 __out uint32_t *blknump, 764 __out uint32_t *offsetp, 765 __out size_t *sizep); 766 767 extern __checkReturn efx_rc_t 768 ef10_nic_pio_free( 769 __inout efx_nic_t *enp, 770 __in uint32_t bufnum, 771 __in uint32_t blknum); 772 773 extern __checkReturn efx_rc_t 774 ef10_nic_pio_link( 775 __inout efx_nic_t *enp, 776 __in uint32_t vi_index, 777 __in efx_piobuf_handle_t handle); 778 779 extern __checkReturn efx_rc_t 780 ef10_nic_pio_unlink( 781 __inout efx_nic_t *enp, 782 __in uint32_t vi_index); 783 784 785 /* VPD */ 786 787 #if EFSYS_OPT_VPD 788 789 extern __checkReturn efx_rc_t 790 ef10_vpd_init( 791 __in efx_nic_t *enp); 792 793 extern __checkReturn efx_rc_t 794 ef10_vpd_size( 795 __in efx_nic_t *enp, 796 __out size_t *sizep); 797 798 extern __checkReturn efx_rc_t 799 ef10_vpd_read( 800 __in efx_nic_t *enp, 801 __out_bcount(size) caddr_t data, 802 __in size_t size); 803 804 extern __checkReturn efx_rc_t 805 ef10_vpd_verify( 806 __in efx_nic_t *enp, 807 __in_bcount(size) caddr_t data, 808 __in size_t size); 809 810 extern __checkReturn efx_rc_t 811 ef10_vpd_reinit( 812 __in efx_nic_t *enp, 813 __in_bcount(size) caddr_t data, 814 __in size_t size); 815 816 extern __checkReturn efx_rc_t 817 ef10_vpd_get( 818 __in efx_nic_t *enp, 819 __in_bcount(size) caddr_t data, 820 __in size_t size, 821 __inout efx_vpd_value_t *evvp); 822 823 extern __checkReturn efx_rc_t 824 ef10_vpd_set( 825 __in efx_nic_t *enp, 826 __in_bcount(size) caddr_t data, 827 __in size_t size, 828 __in efx_vpd_value_t *evvp); 829 830 extern __checkReturn efx_rc_t 831 ef10_vpd_next( 832 __in efx_nic_t *enp, 833 __in_bcount(size) caddr_t data, 834 __in size_t size, 835 __out efx_vpd_value_t *evvp, 836 __inout unsigned int *contp); 837 838 extern __checkReturn efx_rc_t 839 ef10_vpd_write( 840 __in efx_nic_t *enp, 841 __in_bcount(size) caddr_t data, 842 __in size_t size); 843 844 extern void 845 ef10_vpd_fini( 846 __in efx_nic_t *enp); 847 848 #endif /* EFSYS_OPT_VPD */ 849 850 851 /* RX */ 852 853 extern __checkReturn efx_rc_t 854 ef10_rx_init( 855 __in efx_nic_t *enp); 856 857 #if EFSYS_OPT_RX_SCATTER 858 extern __checkReturn efx_rc_t 859 ef10_rx_scatter_enable( 860 __in efx_nic_t *enp, 861 __in unsigned int buf_size); 862 #endif /* EFSYS_OPT_RX_SCATTER */ 863 864 865 #if EFSYS_OPT_RX_SCALE 866 867 extern __checkReturn efx_rc_t 868 ef10_rx_scale_mode_set( 869 __in efx_nic_t *enp, 870 __in efx_rx_hash_alg_t alg, 871 __in efx_rx_hash_type_t type, 872 __in boolean_t insert); 873 874 extern __checkReturn efx_rc_t 875 ef10_rx_scale_key_set( 876 __in efx_nic_t *enp, 877 __in_ecount(n) uint8_t *key, 878 __in size_t n); 879 880 extern __checkReturn efx_rc_t 881 ef10_rx_scale_tbl_set( 882 __in efx_nic_t *enp, 883 __in_ecount(n) unsigned int *table, 884 __in size_t n); 885 886 extern __checkReturn uint32_t 887 ef10_rx_prefix_hash( 888 __in efx_nic_t *enp, 889 __in efx_rx_hash_alg_t func, 890 __in uint8_t *buffer); 891 892 #endif /* EFSYS_OPT_RX_SCALE */ 893 894 extern __checkReturn efx_rc_t 895 ef10_rx_prefix_pktlen( 896 __in efx_nic_t *enp, 897 __in uint8_t *buffer, 898 __out uint16_t *lengthp); 899 900 extern void 901 ef10_rx_qpost( 902 __in efx_rxq_t *erp, 903 __in_ecount(n) efsys_dma_addr_t *addrp, 904 __in size_t size, 905 __in unsigned int n, 906 __in unsigned int completed, 907 __in unsigned int added); 908 909 extern void 910 ef10_rx_qpush( 911 __in efx_rxq_t *erp, 912 __in unsigned int added, 913 __inout unsigned int *pushedp); 914 915 extern __checkReturn efx_rc_t 916 ef10_rx_qflush( 917 __in efx_rxq_t *erp); 918 919 extern void 920 ef10_rx_qenable( 921 __in efx_rxq_t *erp); 922 923 extern __checkReturn efx_rc_t 924 ef10_rx_qcreate( 925 __in efx_nic_t *enp, 926 __in unsigned int index, 927 __in unsigned int label, 928 __in efx_rxq_type_t type, 929 __in efsys_mem_t *esmp, 930 __in size_t n, 931 __in uint32_t id, 932 __in efx_evq_t *eep, 933 __in efx_rxq_t *erp); 934 935 extern void 936 ef10_rx_qdestroy( 937 __in efx_rxq_t *erp); 938 939 extern void 940 ef10_rx_fini( 941 __in efx_nic_t *enp); 942 943 #if EFSYS_OPT_FILTER 944 945 typedef struct ef10_filter_handle_s { 946 uint32_t efh_lo; 947 uint32_t efh_hi; 948 } ef10_filter_handle_t; 949 950 typedef struct ef10_filter_entry_s { 951 uintptr_t efe_spec; /* pointer to filter spec plus busy bit */ 952 ef10_filter_handle_t efe_handle; 953 } ef10_filter_entry_t; 954 955 /* 956 * BUSY flag indicates that an update is in progress. 957 * AUTO_OLD flag is used to mark and sweep MAC packet filters. 958 */ 959 #define EFX_EF10_FILTER_FLAG_BUSY 1U 960 #define EFX_EF10_FILTER_FLAG_AUTO_OLD 2U 961 #define EFX_EF10_FILTER_FLAGS 3U 962 963 /* 964 * Size of the hash table used by the driver. Doesn't need to be the 965 * same size as the hardware's table. 966 */ 967 #define EFX_EF10_FILTER_TBL_ROWS 8192 968 969 /* Allow for the broadcast address to be added to the multicast list */ 970 #define EFX_EF10_FILTER_MULTICAST_FILTERS_MAX (EFX_MAC_MULTICAST_LIST_MAX + 1) 971 972 typedef struct ef10_filter_table_s { 973 ef10_filter_entry_t eft_entry[EFX_EF10_FILTER_TBL_ROWS]; 974 efx_rxq_t * eft_default_rxq; 975 boolean_t eft_using_rss; 976 uint32_t eft_unicst_filter_index; 977 boolean_t eft_unicst_filter_set; 978 uint32_t eft_mulcst_filter_indexes[ 979 EFX_EF10_FILTER_MULTICAST_FILTERS_MAX]; 980 uint32_t eft_mulcst_filter_count; 981 } ef10_filter_table_t; 982 983 __checkReturn efx_rc_t 984 ef10_filter_init( 985 __in efx_nic_t *enp); 986 987 void 988 ef10_filter_fini( 989 __in efx_nic_t *enp); 990 991 __checkReturn efx_rc_t 992 ef10_filter_restore( 993 __in efx_nic_t *enp); 994 995 __checkReturn efx_rc_t 996 ef10_filter_add( 997 __in efx_nic_t *enp, 998 __inout efx_filter_spec_t *spec, 999 __in boolean_t may_replace); 1000 1001 __checkReturn efx_rc_t 1002 ef10_filter_delete( 1003 __in efx_nic_t *enp, 1004 __inout efx_filter_spec_t *spec); 1005 1006 extern __checkReturn efx_rc_t 1007 ef10_filter_supported_filters( 1008 __in efx_nic_t *enp, 1009 __out uint32_t *list, 1010 __out size_t *length); 1011 1012 extern __checkReturn efx_rc_t 1013 ef10_filter_reconfigure( 1014 __in efx_nic_t *enp, 1015 __in_ecount(6) uint8_t const *mac_addr, 1016 __in boolean_t all_unicst, 1017 __in boolean_t mulcst, 1018 __in boolean_t all_mulcst, 1019 __in boolean_t brdcst, 1020 __in_ecount(6*count) uint8_t const *addrs, 1021 __in int count); 1022 1023 extern void 1024 ef10_filter_get_default_rxq( 1025 __in efx_nic_t *enp, 1026 __out efx_rxq_t **erpp, 1027 __out boolean_t *using_rss); 1028 1029 extern void 1030 ef10_filter_default_rxq_set( 1031 __in efx_nic_t *enp, 1032 __in efx_rxq_t *erp, 1033 __in boolean_t using_rss); 1034 1035 extern void 1036 ef10_filter_default_rxq_clear( 1037 __in efx_nic_t *enp); 1038 1039 1040 #endif /* EFSYS_OPT_FILTER */ 1041 1042 extern __checkReturn efx_rc_t 1043 efx_mcdi_get_function_info( 1044 __in efx_nic_t *enp, 1045 __out uint32_t *pfp, 1046 __out_opt uint32_t *vfp); 1047 1048 extern __checkReturn efx_rc_t 1049 efx_mcdi_privilege_mask( 1050 __in efx_nic_t *enp, 1051 __in uint32_t pf, 1052 __in uint32_t vf, 1053 __out uint32_t *maskp); 1054 1055 #ifdef __cplusplus 1056 } 1057 #endif 1058 1059 #endif /* _SYS_HUNT_IMPL_H */ 1060