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
44cc9c62a4SSepherosa Ziehau struct mxge_softc;
45cc9c62a4SSepherosa Ziehau typedef struct mxge_softc mxge_softc_t;
468892ea20SAggelos Economopoulos
4789d55360SSepherosa Ziehau typedef struct {
488892ea20SAggelos Economopoulos uint32_t data0;
498892ea20SAggelos Economopoulos uint32_t data1;
508892ea20SAggelos Economopoulos uint32_t data2;
518892ea20SAggelos Economopoulos } mxge_cmd_t;
528892ea20SAggelos Economopoulos
53fb39a573SSepherosa Ziehau struct mxge_buffer_state {
548892ea20SAggelos Economopoulos struct mbuf *m;
558892ea20SAggelos Economopoulos bus_dmamap_t map;
568892ea20SAggelos Economopoulos };
578892ea20SAggelos Economopoulos
5889d55360SSepherosa Ziehau typedef struct {
598892ea20SAggelos Economopoulos volatile mcp_kreq_ether_recv_t *lanai; /* lanai ptr for recv ring */
608892ea20SAggelos Economopoulos mcp_kreq_ether_recv_t *shadow; /* host shadow of recv ring */
61fb39a573SSepherosa Ziehau struct mxge_buffer_state *info;
628892ea20SAggelos Economopoulos bus_dma_tag_t dmat;
638892ea20SAggelos Economopoulos bus_dmamap_t extra_map;
648892ea20SAggelos Economopoulos int cnt;
65dfda108aSSepherosa Ziehau int16_t cl_size;
66dfda108aSSepherosa Ziehau int16_t mask; /* number of rx slots -1 */
678892ea20SAggelos Economopoulos } mxge_rx_ring_t;
688892ea20SAggelos Economopoulos
6989d55360SSepherosa Ziehau typedef struct {
70cc9c62a4SSepherosa Ziehau mcp_slot_t *entry;
71cc9c62a4SSepherosa Ziehau int idx;
72cc9c62a4SSepherosa Ziehau int mask;
73cc9c62a4SSepherosa Ziehau } mxge_rx_done_t;
74cc9c62a4SSepherosa Ziehau
75cc9c62a4SSepherosa Ziehau typedef struct {
7626634ef8SSepherosa Ziehau struct lwkt_serialize tx_serialize;
778892ea20SAggelos Economopoulos volatile mcp_kreq_ether_send_t *lanai; /* lanai ptr for sendq */
788892ea20SAggelos Economopoulos volatile uint32_t *send_go; /* doorbell for sendq */
798892ea20SAggelos Economopoulos volatile uint32_t *send_stop; /* doorbell for sendq */
808892ea20SAggelos Economopoulos mcp_kreq_ether_send_t *req_list; /* host shadow of sendq */
818892ea20SAggelos Economopoulos bus_dma_segment_t *seg_list;
82fb39a573SSepherosa Ziehau struct mxge_buffer_state *info;
838892ea20SAggelos Economopoulos bus_dma_tag_t dmat;
84aca8f373SSepherosa Ziehau struct ifaltq_subque *ifsq;
85aca8f373SSepherosa Ziehau struct ifsubq_watchdog watchdog;
868892ea20SAggelos Economopoulos int req; /* transmits submitted */
878892ea20SAggelos Economopoulos int mask; /* number of transmit slots -1 */
888892ea20SAggelos Economopoulos int done; /* transmits completed */
898892ea20SAggelos Economopoulos int pkt_done; /* packets completed */
908892ea20SAggelos Economopoulos int max_desc; /* max descriptors per xmit */
918892ea20SAggelos Economopoulos int queue_active; /* fw currently polling this queue*/
928892ea20SAggelos Economopoulos int activate;
938892ea20SAggelos Economopoulos int deactivate;
948892ea20SAggelos Economopoulos int watchdog_rx_pause; /* cache of pause rq recvd */
958892ea20SAggelos Economopoulos } mxge_tx_ring_t;
968892ea20SAggelos Economopoulos
979a4ae890SSepherosa Ziehau struct mxge_rx_data {
9826634ef8SSepherosa Ziehau struct lwkt_serialize rx_serialize;
999a4ae890SSepherosa Ziehau mxge_rx_done_t rx_done;
1009a4ae890SSepherosa Ziehau mxge_rx_ring_t rx_small;
1019a4ae890SSepherosa Ziehau mxge_rx_ring_t rx_big;
102876dbd17SSepherosa Ziehau } __cachealign;
1039a4ae890SSepherosa Ziehau
1048892ea20SAggelos Economopoulos struct mxge_slice_state {
1059a4ae890SSepherosa Ziehau struct mxge_rx_data rx_data;
10626634ef8SSepherosa Ziehau mxge_tx_ring_t tx; /* transmit ring */
10726634ef8SSepherosa Ziehau mxge_softc_t *sc;
1088892ea20SAggelos Economopoulos mcp_irq_data_t *fw_stats;
1098892ea20SAggelos Economopoulos volatile uint32_t *irq_claim;
1107cc92483SSepherosa Ziehau bus_dmamem_t fw_stats_dma;
111414caf0dSSepherosa Ziehau bus_dmamem_t rx_done_dma;
1128892ea20SAggelos Economopoulos struct sysctl_oid *sysctl_tree;
1138892ea20SAggelos Economopoulos struct sysctl_ctx_list sysctl_ctx;
114e6c7b753SSepherosa Ziehau
115e6c7b753SSepherosa Ziehau struct lwkt_serialize *intr_serialize;
116e6c7b753SSepherosa Ziehau driver_intr_t *intr_func;
117e6c7b753SSepherosa Ziehau void *intr_hand;
118e6c7b753SSepherosa Ziehau struct resource *intr_res;
119e6c7b753SSepherosa Ziehau int intr_rid;
120e6c7b753SSepherosa Ziehau int intr_cpuid;
121e6c7b753SSepherosa Ziehau const char *intr_desc;
122e6c7b753SSepherosa Ziehau char intr_desc0[64];
123dfda108aSSepherosa Ziehau } __cachealign;
1248892ea20SAggelos Economopoulos
1258892ea20SAggelos Economopoulos struct mxge_softc {
126137195a6SAggelos Economopoulos struct arpcom arpcom;
127f0115d64SAggelos Economopoulos struct ifnet* ifp; /* points to arpcom.ac_if */
12826634ef8SSepherosa Ziehau struct lwkt_serialize main_serialize;
12926634ef8SSepherosa Ziehau int nserialize;
13026634ef8SSepherosa Ziehau struct lwkt_serialize **serializes;
1318892ea20SAggelos Economopoulos struct mxge_slice_state *ss;
1328892ea20SAggelos Economopoulos int tx_boundary; /* boundary transmits cannot cross*/
1338892ea20SAggelos Economopoulos bus_dma_tag_t parent_dmat;
1348892ea20SAggelos Economopoulos volatile uint8_t *sram;
1358892ea20SAggelos Economopoulos int sram_size;
1368892ea20SAggelos Economopoulos volatile uint32_t *irq_deassert;
1378892ea20SAggelos Economopoulos mcp_cmd_response_t *cmd;
1387cc92483SSepherosa Ziehau bus_dmamem_t cmd_dma;
1397cc92483SSepherosa Ziehau bus_dmamem_t zeropad_dma;
1408892ea20SAggelos Economopoulos struct pci_dev *pdev;
141e6c7b753SSepherosa Ziehau int intr_type;
1428892ea20SAggelos Economopoulos int link_state;
1438892ea20SAggelos Economopoulos unsigned int rdma_tags_available;
1448892ea20SAggelos Economopoulos int intr_coal_delay;
1458892ea20SAggelos Economopoulos volatile uint32_t *intr_coal_delay_ptr;
1468892ea20SAggelos Economopoulos int wc;
1478892ea20SAggelos Economopoulos int wake_queue;
1488892ea20SAggelos Economopoulos int stop_queue;
1498892ea20SAggelos Economopoulos int down_cnt;
1508892ea20SAggelos Economopoulos int watchdog_resets;
1518892ea20SAggelos Economopoulos int pause;
1528892ea20SAggelos Economopoulos struct resource *mem_res;
1538892ea20SAggelos Economopoulos struct resource *msix_table_res;
154c7431c78SSepherosa Ziehau const char *fw_name;
1558892ea20SAggelos Economopoulos char eeprom_strings[MXGE_EEPROM_STRINGS_SIZE];
1568892ea20SAggelos Economopoulos char fw_version[128];
1578892ea20SAggelos Economopoulos int fw_ver_major;
1588892ea20SAggelos Economopoulos int fw_ver_minor;
1598892ea20SAggelos Economopoulos int fw_ver_tiny;
1608892ea20SAggelos Economopoulos int adopted_rx_filter_bug;
1618892ea20SAggelos Economopoulos device_t dev;
1628892ea20SAggelos Economopoulos struct ifmedia media;
1638892ea20SAggelos Economopoulos int read_dma;
1648892ea20SAggelos Economopoulos int write_dma;
1658892ea20SAggelos Economopoulos int read_write_dma;
1668892ea20SAggelos Economopoulos int fw_multicast_support;
1678892ea20SAggelos Economopoulos int link_width;
1688892ea20SAggelos Economopoulos int max_mtu;
16989d55360SSepherosa Ziehau int throttle;
1708892ea20SAggelos Economopoulos int media_flags;
1718892ea20SAggelos Economopoulos int need_media_probe;
1728892ea20SAggelos Economopoulos int num_slices;
173aca8f373SSepherosa Ziehau int num_tx_rings;
174089301c2SSepherosa Ziehau int rx_intr_slots;
1758433e5f5SSepherosa Ziehau int use_rss;
1768892ea20SAggelos Economopoulos int dying;
17789d55360SSepherosa Ziehau int connector;
17889d55360SSepherosa Ziehau int current_media;
1797cc92483SSepherosa Ziehau bus_dmamem_t dmabench_dma;
1808892ea20SAggelos Economopoulos struct callout co_hdl;
181cc9c62a4SSepherosa Ziehau u_long opackets; /* saved ifnet.opackets */
182cc9c62a4SSepherosa Ziehau u_long ipackets; /* saved ifnet.ipackets */
1838892ea20SAggelos Economopoulos struct sysctl_oid *slice_sysctl_tree;
1848892ea20SAggelos Economopoulos struct sysctl_ctx_list slice_sysctl_ctx;
185*bdbc20adSSepherosa Ziehau struct if_ringmap *ring_map;
186*bdbc20adSSepherosa Ziehau int rdr_table[NETISR_CPUMAX];
1878892ea20SAggelos Economopoulos uint8_t mac_addr[6]; /* eeprom mac address */
18889d55360SSepherosa Ziehau uint16_t pectl; /* save PCIe CTL state */
1898892ea20SAggelos Economopoulos char product_code_string[64];
1908892ea20SAggelos Economopoulos char serial_number_string[64];
1918892ea20SAggelos Economopoulos };
1928892ea20SAggelos Economopoulos
1938892ea20SAggelos Economopoulos #define MXGE_PCI_VENDOR_MYRICOM 0x14c1
1948892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E 0x0008
1958892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E_9 0x0009
1968892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8E 0
1978892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8ES 1
19889d55360SSepherosa Ziehau
1998892ea20SAggelos Economopoulos #define MXGE_XFP_COMPLIANCE_BYTE 131
2008892ea20SAggelos Economopoulos #define MXGE_SFP_COMPLIANCE_BYTE 3
2018892ea20SAggelos Economopoulos
20289d55360SSepherosa Ziehau #define MXGE_MIN_THROTTLE 416
20389d55360SSepherosa Ziehau #define MXGE_MAX_THROTTLE 4096
20489d55360SSepherosa Ziehau
20589d55360SSepherosa Ziehau /* Types of connectors on NICs supported by this driver */
20689d55360SSepherosa Ziehau #define MXGE_CX4 0
20789d55360SSepherosa Ziehau #define MXGE_XFP 1
20889d55360SSepherosa Ziehau #define MXGE_SFP 2
20989d55360SSepherosa Ziehau #define MXGE_QRF 3
210166c46afSSepherosa Ziehau #define MXGE_UNK 4
21189d55360SSepherosa Ziehau
2128892ea20SAggelos Economopoulos #define MXGE_HIGHPART_TO_U32(X) \
2138892ea20SAggelos Economopoulos (sizeof (X) == 8) ? ((uint32_t)((uint64_t)(X) >> 32)) : (0)
2148892ea20SAggelos Economopoulos #define MXGE_LOWPART_TO_U32(X) ((uint32_t)(X))
2158892ea20SAggelos Economopoulos
21689d55360SSepherosa Ziehau struct mxge_media_type {
2178892ea20SAggelos Economopoulos int flag;
2188892ea20SAggelos Economopoulos uint8_t bitmask;
2198892ea20SAggelos Economopoulos char *name;
2208892ea20SAggelos Economopoulos };
2218892ea20SAggelos Economopoulos
2228892ea20SAggelos Economopoulos #if defined(__GNUC__)
22389d55360SSepherosa Ziehau #if defined(__i386__) || defined(__x86_64__)
2248892ea20SAggelos Economopoulos #define wmb() __asm__ __volatile__ ("sfence;": : :"memory")
2258892ea20SAggelos Economopoulos #else
22689d55360SSepherosa Ziehau #error "unknown arch"
2278892ea20SAggelos Economopoulos #endif
2288892ea20SAggelos Economopoulos #else
2298892ea20SAggelos Economopoulos #error "unknown compiler"
2308892ea20SAggelos Economopoulos #endif
2318892ea20SAggelos Economopoulos
23289d55360SSepherosa Ziehau static __inline void
mxge_pio_copy(volatile void * to_v,void * from_v,size_t size)2338892ea20SAggelos Economopoulos mxge_pio_copy(volatile void *to_v, void *from_v, size_t size)
2348892ea20SAggelos Economopoulos {
2358892ea20SAggelos Economopoulos register volatile uintptr_t *to;
2368892ea20SAggelos Economopoulos volatile uintptr_t *from;
2378892ea20SAggelos Economopoulos size_t i;
2388892ea20SAggelos Economopoulos
2398892ea20SAggelos Economopoulos to = (volatile uintptr_t *)to_v;
2408892ea20SAggelos Economopoulos from = from_v;
2418892ea20SAggelos Economopoulos for (i = (size / sizeof(uintptr_t)); i; i--) {
2428892ea20SAggelos Economopoulos *to = *from;
2438892ea20SAggelos Economopoulos to++;
2448892ea20SAggelos Economopoulos from++;
2458892ea20SAggelos Economopoulos }
2468892ea20SAggelos Economopoulos }
247