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