18892ea20SAggelos Economopoulos /******************************************************************************* 28892ea20SAggelos Economopoulos 389d55360SSepherosa Ziehau Copyright (c) 2006-2013, Myricom Inc. 48892ea20SAggelos Economopoulos All rights reserved. 58892ea20SAggelos Economopoulos 68892ea20SAggelos Economopoulos Redistribution and use in source and binary forms, with or without 78892ea20SAggelos Economopoulos modification, are permitted provided that the following conditions are met: 88892ea20SAggelos Economopoulos 98892ea20SAggelos Economopoulos 1. Redistributions of source code must retain the above copyright notice, 108892ea20SAggelos Economopoulos this list of conditions and the following disclaimer. 118892ea20SAggelos Economopoulos 128892ea20SAggelos Economopoulos 2. Neither the name of the Myricom Inc, nor the names of its 138892ea20SAggelos Economopoulos contributors may be used to endorse or promote products derived from 148892ea20SAggelos Economopoulos this software without specific prior written permission. 158892ea20SAggelos Economopoulos 168892ea20SAggelos Economopoulos THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 178892ea20SAggelos Economopoulos AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 188892ea20SAggelos Economopoulos IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 198892ea20SAggelos Economopoulos ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 208892ea20SAggelos Economopoulos LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 218892ea20SAggelos Economopoulos CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 228892ea20SAggelos Economopoulos SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 238892ea20SAggelos Economopoulos INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 248892ea20SAggelos Economopoulos CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 258892ea20SAggelos Economopoulos ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 268892ea20SAggelos Economopoulos POSSIBILITY OF SUCH DAMAGE. 278892ea20SAggelos Economopoulos 2889d55360SSepherosa Ziehau $FreeBSD: head/sys/dev/mxge/if_mxge_var.h 247160 2013-02-22 19:23:33Z gallatin $ 298892ea20SAggelos Economopoulos 308892ea20SAggelos Economopoulos ***************************************************************************/ 318892ea20SAggelos Economopoulos 328892ea20SAggelos Economopoulos #define MXGE_ETH_STOPPED 0 338892ea20SAggelos Economopoulos #define MXGE_ETH_STOPPING 1 348892ea20SAggelos Economopoulos #define MXGE_ETH_STARTING 2 358892ea20SAggelos Economopoulos #define MXGE_ETH_RUNNING 3 368892ea20SAggelos Economopoulos #define MXGE_ETH_OPEN_FAILED 4 378892ea20SAggelos Economopoulos 3889d55360SSepherosa Ziehau #define MXGE_FW_OFFSET (1024*1024) 398892ea20SAggelos Economopoulos #define MXGE_EEPROM_STRINGS_SIZE 256 408892ea20SAggelos Economopoulos #define MXGE_MAX_SEND_DESC 128 418892ea20SAggelos Economopoulos 427cc92483SSepherosa Ziehau #define MXGE_INTR_COAL_DELAY 150 438892ea20SAggelos Economopoulos 448892ea20SAggelos Economopoulos typedef struct { 458892ea20SAggelos Economopoulos mcp_slot_t *entry; 467cc92483SSepherosa Ziehau bus_dmamem_t dma; 478892ea20SAggelos Economopoulos int cnt; 488892ea20SAggelos Economopoulos int idx; 498892ea20SAggelos Economopoulos int mask; 508892ea20SAggelos Economopoulos } mxge_rx_done_t; 518892ea20SAggelos Economopoulos 5289d55360SSepherosa Ziehau typedef struct { 538892ea20SAggelos Economopoulos uint32_t data0; 548892ea20SAggelos Economopoulos uint32_t data1; 558892ea20SAggelos Economopoulos uint32_t data2; 568892ea20SAggelos Economopoulos } mxge_cmd_t; 578892ea20SAggelos Economopoulos 588892ea20SAggelos Economopoulos struct mxge_rx_buffer_state { 598892ea20SAggelos Economopoulos struct mbuf *m; 608892ea20SAggelos Economopoulos bus_dmamap_t map; 618892ea20SAggelos Economopoulos }; 628892ea20SAggelos Economopoulos 638892ea20SAggelos Economopoulos struct mxge_tx_buffer_state { 648892ea20SAggelos Economopoulos struct mbuf *m; 658892ea20SAggelos Economopoulos bus_dmamap_t map; 668892ea20SAggelos Economopoulos int flag; 678892ea20SAggelos Economopoulos }; 688892ea20SAggelos Economopoulos 6989d55360SSepherosa Ziehau typedef struct { 708892ea20SAggelos Economopoulos volatile mcp_kreq_ether_recv_t *lanai; /* lanai ptr for recv ring */ 718892ea20SAggelos Economopoulos mcp_kreq_ether_recv_t *shadow; /* host shadow of recv ring */ 728892ea20SAggelos Economopoulos struct mxge_rx_buffer_state *info; 738892ea20SAggelos Economopoulos bus_dma_tag_t dmat; 748892ea20SAggelos Economopoulos bus_dmamap_t extra_map; 758892ea20SAggelos Economopoulos int cnt; 768892ea20SAggelos Economopoulos int cl_size; 778892ea20SAggelos Economopoulos int alloc_fail; 788892ea20SAggelos Economopoulos int mask; /* number of rx slots -1 */ 798892ea20SAggelos Economopoulos int mlen; 808892ea20SAggelos Economopoulos } mxge_rx_ring_t; 818892ea20SAggelos Economopoulos 8289d55360SSepherosa Ziehau typedef struct { 838892ea20SAggelos Economopoulos #ifdef IFNET_BUF_RING 848892ea20SAggelos Economopoulos struct buf_ring *br; 858892ea20SAggelos Economopoulos #endif 868892ea20SAggelos Economopoulos volatile mcp_kreq_ether_send_t *lanai; /* lanai ptr for sendq */ 878892ea20SAggelos Economopoulos volatile uint32_t *send_go; /* doorbell for sendq */ 888892ea20SAggelos Economopoulos volatile uint32_t *send_stop; /* doorbell for sendq */ 898892ea20SAggelos Economopoulos mcp_kreq_ether_send_t *req_list; /* host shadow of sendq */ 908892ea20SAggelos Economopoulos char *req_bytes; 918892ea20SAggelos Economopoulos bus_dma_segment_t *seg_list; 928892ea20SAggelos Economopoulos struct mxge_tx_buffer_state *info; 938892ea20SAggelos Economopoulos bus_dma_tag_t dmat; 948892ea20SAggelos Economopoulos int req; /* transmits submitted */ 958892ea20SAggelos Economopoulos int mask; /* number of transmit slots -1 */ 968892ea20SAggelos Economopoulos int done; /* transmits completed */ 978892ea20SAggelos Economopoulos int pkt_done; /* packets completed */ 988892ea20SAggelos Economopoulos int max_desc; /* max descriptors per xmit */ 998892ea20SAggelos Economopoulos int queue_active; /* fw currently polling this queue*/ 1008892ea20SAggelos Economopoulos int activate; 1018892ea20SAggelos Economopoulos int deactivate; 1028892ea20SAggelos Economopoulos int stall; /* #times hw queue exhausted */ 1038892ea20SAggelos Economopoulos int wake; /* #times irq re-enabled xmit */ 1048892ea20SAggelos Economopoulos int watchdog_req; /* cache of req */ 1058892ea20SAggelos Economopoulos int watchdog_done; /* cache of done */ 1068892ea20SAggelos Economopoulos int watchdog_rx_pause; /* cache of pause rq recvd */ 1078892ea20SAggelos Economopoulos int defrag; 1088892ea20SAggelos Economopoulos } mxge_tx_ring_t; 1098892ea20SAggelos Economopoulos 1108892ea20SAggelos Economopoulos struct mxge_softc; 1118892ea20SAggelos Economopoulos typedef struct mxge_softc mxge_softc_t; 1128892ea20SAggelos Economopoulos 1138892ea20SAggelos Economopoulos struct mxge_slice_state { 1148892ea20SAggelos Economopoulos mxge_softc_t *sc; 1158892ea20SAggelos Economopoulos mxge_tx_ring_t tx; /* transmit ring */ 1168892ea20SAggelos Economopoulos mxge_rx_ring_t rx_small; 1178892ea20SAggelos Economopoulos mxge_rx_ring_t rx_big; 1188892ea20SAggelos Economopoulos mxge_rx_done_t rx_done; 1198892ea20SAggelos Economopoulos mcp_irq_data_t *fw_stats; 1208892ea20SAggelos Economopoulos volatile uint32_t *irq_claim; 1218892ea20SAggelos Economopoulos u_long ipackets; 1228892ea20SAggelos Economopoulos u_long opackets; 1238892ea20SAggelos Economopoulos u_long obytes; 1248892ea20SAggelos Economopoulos u_long omcasts; 1258892ea20SAggelos Economopoulos u_long oerrors; 1268892ea20SAggelos Economopoulos int if_drv_flags; 1277cc92483SSepherosa Ziehau bus_dmamem_t fw_stats_dma; 1288892ea20SAggelos Economopoulos struct sysctl_oid *sysctl_tree; 1298892ea20SAggelos Economopoulos struct sysctl_ctx_list sysctl_ctx; 1308892ea20SAggelos Economopoulos char scratch[256]; 1318892ea20SAggelos Economopoulos }; 1328892ea20SAggelos Economopoulos 1338892ea20SAggelos Economopoulos struct mxge_softc { 134137195a6SAggelos Economopoulos struct arpcom arpcom; 135f0115d64SAggelos Economopoulos struct ifnet* ifp; /* points to arpcom.ac_if */ 1368892ea20SAggelos Economopoulos struct mxge_slice_state *ss; 1378892ea20SAggelos Economopoulos int tx_boundary; /* boundary transmits cannot cross*/ 1388892ea20SAggelos Economopoulos bus_dma_tag_t parent_dmat; 1398892ea20SAggelos Economopoulos volatile uint8_t *sram; 1408892ea20SAggelos Economopoulos int sram_size; 1418892ea20SAggelos Economopoulos volatile uint32_t *irq_deassert; 1428892ea20SAggelos Economopoulos mcp_cmd_response_t *cmd; 1437cc92483SSepherosa Ziehau bus_dmamem_t cmd_dma; 1447cc92483SSepherosa Ziehau bus_dmamem_t zeropad_dma; 1458892ea20SAggelos Economopoulos struct pci_dev *pdev; 14689d55360SSepherosa Ziehau int irq_rid; 14789d55360SSepherosa Ziehau int irq_type; 1488892ea20SAggelos Economopoulos int link_state; 1498892ea20SAggelos Economopoulos unsigned int rdma_tags_available; 1508892ea20SAggelos Economopoulos int intr_coal_delay; 1518892ea20SAggelos Economopoulos volatile uint32_t *intr_coal_delay_ptr; 1528892ea20SAggelos Economopoulos int wc; 1538892ea20SAggelos Economopoulos int wake_queue; 1548892ea20SAggelos Economopoulos int stop_queue; 1558892ea20SAggelos Economopoulos int down_cnt; 1568892ea20SAggelos Economopoulos int watchdog_resets; 1578892ea20SAggelos Economopoulos int watchdog_countdown; 1588892ea20SAggelos Economopoulos int pause; 1598892ea20SAggelos Economopoulos struct resource *mem_res; 1608892ea20SAggelos Economopoulos struct resource *irq_res; 1618892ea20SAggelos Economopoulos struct resource **msix_irq_res; 1628892ea20SAggelos Economopoulos struct resource *msix_table_res; 1638892ea20SAggelos Economopoulos struct resource *msix_pba_res; 1648892ea20SAggelos Economopoulos void *ih; 1658892ea20SAggelos Economopoulos void **msix_ih; 166*c7431c78SSepherosa Ziehau const char *fw_name; 1678892ea20SAggelos Economopoulos char eeprom_strings[MXGE_EEPROM_STRINGS_SIZE]; 1688892ea20SAggelos Economopoulos char fw_version[128]; 1698892ea20SAggelos Economopoulos int fw_ver_major; 1708892ea20SAggelos Economopoulos int fw_ver_minor; 1718892ea20SAggelos Economopoulos int fw_ver_tiny; 1728892ea20SAggelos Economopoulos int adopted_rx_filter_bug; 1738892ea20SAggelos Economopoulos device_t dev; 1748892ea20SAggelos Economopoulos struct ifmedia media; 1758892ea20SAggelos Economopoulos int read_dma; 1768892ea20SAggelos Economopoulos int write_dma; 1778892ea20SAggelos Economopoulos int read_write_dma; 1788892ea20SAggelos Economopoulos int fw_multicast_support; 1798892ea20SAggelos Economopoulos int link_width; 1808892ea20SAggelos Economopoulos int max_mtu; 18189d55360SSepherosa Ziehau int throttle; 1828892ea20SAggelos Economopoulos int tx_defrag; 1838892ea20SAggelos Economopoulos int media_flags; 1848892ea20SAggelos Economopoulos int need_media_probe; 1858892ea20SAggelos Economopoulos int num_slices; 1868892ea20SAggelos Economopoulos int rx_ring_size; 1878892ea20SAggelos Economopoulos int dying; 18889d55360SSepherosa Ziehau int connector; 18989d55360SSepherosa Ziehau int current_media; 1907cc92483SSepherosa Ziehau bus_dmamem_t dmabench_dma; 1918892ea20SAggelos Economopoulos struct callout co_hdl; 192b6737651SAggelos Economopoulos struct sysctl_ctx_list sysctl_ctx; 193b6737651SAggelos Economopoulos struct sysctl_oid *sysctl_tree; 1948892ea20SAggelos Economopoulos struct sysctl_oid *slice_sysctl_tree; 1958892ea20SAggelos Economopoulos struct sysctl_ctx_list slice_sysctl_ctx; 1968892ea20SAggelos Economopoulos uint8_t mac_addr[6]; /* eeprom mac address */ 19789d55360SSepherosa Ziehau uint16_t pectl; /* save PCIe CTL state */ 1988892ea20SAggelos Economopoulos char product_code_string[64]; 1998892ea20SAggelos Economopoulos char serial_number_string[64]; 2008892ea20SAggelos Economopoulos }; 2018892ea20SAggelos Economopoulos 2028892ea20SAggelos Economopoulos #define MXGE_PCI_VENDOR_MYRICOM 0x14c1 2038892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E 0x0008 2048892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E_9 0x0009 2058892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8E 0 2068892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8ES 1 20789d55360SSepherosa Ziehau 2088892ea20SAggelos Economopoulos #define MXGE_XFP_COMPLIANCE_BYTE 131 2098892ea20SAggelos Economopoulos #define MXGE_SFP_COMPLIANCE_BYTE 3 2108892ea20SAggelos Economopoulos 21189d55360SSepherosa Ziehau #define MXGE_MIN_THROTTLE 416 21289d55360SSepherosa Ziehau #define MXGE_MAX_THROTTLE 4096 21389d55360SSepherosa Ziehau 21489d55360SSepherosa Ziehau /* Types of connectors on NICs supported by this driver */ 21589d55360SSepherosa Ziehau #define MXGE_CX4 0 21689d55360SSepherosa Ziehau #define MXGE_XFP 1 21789d55360SSepherosa Ziehau #define MXGE_SFP 2 21889d55360SSepherosa Ziehau #define MXGE_QRF 3 21989d55360SSepherosa Ziehau 2208892ea20SAggelos Economopoulos #define MXGE_HIGHPART_TO_U32(X) \ 2218892ea20SAggelos Economopoulos (sizeof (X) == 8) ? ((uint32_t)((uint64_t)(X) >> 32)) : (0) 2228892ea20SAggelos Economopoulos #define MXGE_LOWPART_TO_U32(X) ((uint32_t)(X)) 2238892ea20SAggelos Economopoulos 22489d55360SSepherosa Ziehau struct mxge_media_type { 2258892ea20SAggelos Economopoulos int flag; 2268892ea20SAggelos Economopoulos uint8_t bitmask; 2278892ea20SAggelos Economopoulos char *name; 2288892ea20SAggelos Economopoulos }; 2298892ea20SAggelos Economopoulos 2308892ea20SAggelos Economopoulos #if defined(__GNUC__) 23189d55360SSepherosa Ziehau #if defined(__i386__) || defined(__x86_64__) 2328892ea20SAggelos Economopoulos #define wmb() __asm__ __volatile__ ("sfence;": : :"memory") 2338892ea20SAggelos Economopoulos #else 23489d55360SSepherosa Ziehau #error "unknown arch" 2358892ea20SAggelos Economopoulos #endif 2368892ea20SAggelos Economopoulos #else 2378892ea20SAggelos Economopoulos #error "unknown compiler" 2388892ea20SAggelos Economopoulos #endif 2398892ea20SAggelos Economopoulos 24089d55360SSepherosa Ziehau static __inline void 2418892ea20SAggelos Economopoulos mxge_pio_copy(volatile void *to_v, void *from_v, size_t size) 2428892ea20SAggelos Economopoulos { 2438892ea20SAggelos Economopoulos register volatile uintptr_t *to; 2448892ea20SAggelos Economopoulos volatile uintptr_t *from; 2458892ea20SAggelos Economopoulos size_t i; 2468892ea20SAggelos Economopoulos 2478892ea20SAggelos Economopoulos to = (volatile uintptr_t *)to_v; 2488892ea20SAggelos Economopoulos from = from_v; 2498892ea20SAggelos Economopoulos for (i = (size / sizeof(uintptr_t)); i; i--) { 2508892ea20SAggelos Economopoulos *to = *from; 2518892ea20SAggelos Economopoulos to++; 2528892ea20SAggelos Economopoulos from++; 2538892ea20SAggelos Economopoulos } 2548892ea20SAggelos Economopoulos } 255