xref: /dflybsd-src/sys/dev/netif/mxge/if_mxge_var.h (revision 7cc92483b4837a856b2e4fd3f7639c4e9790f1cd)
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 
42*7cc92483SSepherosa Ziehau #define MXGE_VIRT_JUMBOS		1
438892ea20SAggelos Economopoulos 
44*7cc92483SSepherosa Ziehau #define MXGE_INTR_COAL_DELAY		150
458892ea20SAggelos Economopoulos 
468892ea20SAggelos Economopoulos typedef struct {
478892ea20SAggelos Economopoulos 	mcp_slot_t *entry;
48*7cc92483SSepherosa Ziehau 	bus_dmamem_t dma;
498892ea20SAggelos Economopoulos 	int cnt;
508892ea20SAggelos Economopoulos 	int idx;
518892ea20SAggelos Economopoulos 	int mask;
528892ea20SAggelos Economopoulos } mxge_rx_done_t;
538892ea20SAggelos Economopoulos 
5489d55360SSepherosa Ziehau typedef struct {
558892ea20SAggelos Economopoulos 	uint32_t data0;
568892ea20SAggelos Economopoulos 	uint32_t data1;
578892ea20SAggelos Economopoulos 	uint32_t data2;
588892ea20SAggelos Economopoulos } mxge_cmd_t;
598892ea20SAggelos Economopoulos 
608892ea20SAggelos Economopoulos struct mxge_rx_buffer_state {
618892ea20SAggelos Economopoulos 	struct mbuf *m;
628892ea20SAggelos Economopoulos 	bus_dmamap_t map;
638892ea20SAggelos Economopoulos };
648892ea20SAggelos Economopoulos 
658892ea20SAggelos Economopoulos struct mxge_tx_buffer_state {
668892ea20SAggelos Economopoulos 	struct mbuf *m;
678892ea20SAggelos Economopoulos 	bus_dmamap_t map;
688892ea20SAggelos Economopoulos 	int flag;
698892ea20SAggelos Economopoulos };
708892ea20SAggelos Economopoulos 
7189d55360SSepherosa Ziehau typedef struct {
728892ea20SAggelos Economopoulos 	volatile mcp_kreq_ether_recv_t *lanai;	/* lanai ptr for recv ring */
738892ea20SAggelos Economopoulos 	mcp_kreq_ether_recv_t *shadow;	/* host shadow of recv ring */
748892ea20SAggelos Economopoulos 	struct mxge_rx_buffer_state *info;
758892ea20SAggelos Economopoulos 	bus_dma_tag_t dmat;
768892ea20SAggelos Economopoulos 	bus_dmamap_t extra_map;
778892ea20SAggelos Economopoulos 	int cnt;
788892ea20SAggelos Economopoulos 	int nbufs;
798892ea20SAggelos Economopoulos 	int cl_size;
808892ea20SAggelos Economopoulos 	int alloc_fail;
818892ea20SAggelos Economopoulos 	int mask;			/* number of rx slots -1 */
828892ea20SAggelos Economopoulos 	int mlen;
838892ea20SAggelos Economopoulos } mxge_rx_ring_t;
848892ea20SAggelos Economopoulos 
8589d55360SSepherosa Ziehau typedef struct {
868892ea20SAggelos Economopoulos #ifdef IFNET_BUF_RING
878892ea20SAggelos Economopoulos 	struct buf_ring *br;
888892ea20SAggelos Economopoulos #endif
898892ea20SAggelos Economopoulos 	volatile mcp_kreq_ether_send_t *lanai;	/* lanai ptr for sendq	*/
908892ea20SAggelos Economopoulos 	volatile uint32_t *send_go;		/* doorbell for sendq */
918892ea20SAggelos Economopoulos 	volatile uint32_t *send_stop;		/* doorbell for sendq */
928892ea20SAggelos Economopoulos 	mcp_kreq_ether_send_t *req_list;	/* host shadow of sendq */
938892ea20SAggelos Economopoulos 	char *req_bytes;
948892ea20SAggelos Economopoulos 	bus_dma_segment_t *seg_list;
958892ea20SAggelos Economopoulos 	struct mxge_tx_buffer_state *info;
968892ea20SAggelos Economopoulos 	bus_dma_tag_t dmat;
978892ea20SAggelos Economopoulos 	int req;			/* transmits submitted	*/
988892ea20SAggelos Economopoulos 	int mask;			/* number of transmit slots -1 */
998892ea20SAggelos Economopoulos 	int done;			/* transmits completed	*/
1008892ea20SAggelos Economopoulos 	int pkt_done;			/* packets completed */
1018892ea20SAggelos Economopoulos 	int max_desc;			/* max descriptors per xmit */
1028892ea20SAggelos Economopoulos 	int queue_active;		/* fw currently polling this queue*/
1038892ea20SAggelos Economopoulos 	int activate;
1048892ea20SAggelos Economopoulos 	int deactivate;
1058892ea20SAggelos Economopoulos 	int stall;			/* #times hw queue exhausted */
1068892ea20SAggelos Economopoulos 	int wake;			/* #times irq re-enabled xmit */
1078892ea20SAggelos Economopoulos 	int watchdog_req;		/* cache of req */
1088892ea20SAggelos Economopoulos 	int watchdog_done;		/* cache of done */
1098892ea20SAggelos Economopoulos 	int watchdog_rx_pause;		/* cache of pause rq recvd */
1108892ea20SAggelos Economopoulos 	int defrag;
1118892ea20SAggelos Economopoulos } mxge_tx_ring_t;
1128892ea20SAggelos Economopoulos 
1138892ea20SAggelos Economopoulos struct mxge_softc;
1148892ea20SAggelos Economopoulos typedef struct mxge_softc mxge_softc_t;
1158892ea20SAggelos Economopoulos 
1168892ea20SAggelos Economopoulos struct mxge_slice_state {
1178892ea20SAggelos Economopoulos 	mxge_softc_t *sc;
1188892ea20SAggelos Economopoulos 	mxge_tx_ring_t tx;		/* transmit ring */
1198892ea20SAggelos Economopoulos 	mxge_rx_ring_t rx_small;
1208892ea20SAggelos Economopoulos 	mxge_rx_ring_t rx_big;
1218892ea20SAggelos Economopoulos 	mxge_rx_done_t rx_done;
1228892ea20SAggelos Economopoulos 	mcp_irq_data_t *fw_stats;
1238892ea20SAggelos Economopoulos 	volatile uint32_t *irq_claim;
1248892ea20SAggelos Economopoulos 	u_long ipackets;
1258892ea20SAggelos Economopoulos 	u_long opackets;
1268892ea20SAggelos Economopoulos 	u_long obytes;
1278892ea20SAggelos Economopoulos 	u_long omcasts;
1288892ea20SAggelos Economopoulos 	u_long oerrors;
1298892ea20SAggelos Economopoulos 	int if_drv_flags;
130*7cc92483SSepherosa Ziehau 	bus_dmamem_t fw_stats_dma;
1318892ea20SAggelos Economopoulos 	struct sysctl_oid *sysctl_tree;
1328892ea20SAggelos Economopoulos 	struct sysctl_ctx_list sysctl_ctx;
1338892ea20SAggelos Economopoulos 	char scratch[256];
1348892ea20SAggelos Economopoulos };
1358892ea20SAggelos Economopoulos 
1368892ea20SAggelos Economopoulos struct mxge_softc {
137137195a6SAggelos Economopoulos 	struct arpcom arpcom;
138f0115d64SAggelos Economopoulos 	struct ifnet* ifp;		/* points to arpcom.ac_if */
1398892ea20SAggelos Economopoulos 	struct mxge_slice_state *ss;
1408892ea20SAggelos Economopoulos 	int tx_boundary;		/* boundary transmits cannot cross*/
1418892ea20SAggelos Economopoulos 	bus_dma_tag_t	parent_dmat;
1428892ea20SAggelos Economopoulos 	volatile uint8_t *sram;
1438892ea20SAggelos Economopoulos 	int sram_size;
1448892ea20SAggelos Economopoulos 	volatile uint32_t *irq_deassert;
1458892ea20SAggelos Economopoulos 	mcp_cmd_response_t *cmd;
146*7cc92483SSepherosa Ziehau 	bus_dmamem_t cmd_dma;
147*7cc92483SSepherosa Ziehau 	bus_dmamem_t zeropad_dma;
1488892ea20SAggelos Economopoulos 	struct pci_dev *pdev;
14989d55360SSepherosa Ziehau 	int irq_rid;
15089d55360SSepherosa Ziehau 	int irq_type;
1518892ea20SAggelos Economopoulos 	int link_state;
1528892ea20SAggelos Economopoulos 	unsigned int rdma_tags_available;
1538892ea20SAggelos Economopoulos 	int intr_coal_delay;
1548892ea20SAggelos Economopoulos 	volatile uint32_t *intr_coal_delay_ptr;
1558892ea20SAggelos Economopoulos 	int wc;
1568892ea20SAggelos Economopoulos 	int wake_queue;
1578892ea20SAggelos Economopoulos 	int stop_queue;
1588892ea20SAggelos Economopoulos 	int down_cnt;
1598892ea20SAggelos Economopoulos 	int watchdog_resets;
1608892ea20SAggelos Economopoulos 	int watchdog_countdown;
1618892ea20SAggelos Economopoulos 	int pause;
1628892ea20SAggelos Economopoulos 	struct resource *mem_res;
1638892ea20SAggelos Economopoulos 	struct resource *irq_res;
1648892ea20SAggelos Economopoulos 	struct resource **msix_irq_res;
1658892ea20SAggelos Economopoulos 	struct resource *msix_table_res;
1668892ea20SAggelos Economopoulos 	struct resource *msix_pba_res;
1678892ea20SAggelos Economopoulos 	void *ih;
1688892ea20SAggelos Economopoulos 	void **msix_ih;
1698892ea20SAggelos Economopoulos 	char *fw_name;
1708892ea20SAggelos Economopoulos 	char eeprom_strings[MXGE_EEPROM_STRINGS_SIZE];
1718892ea20SAggelos Economopoulos 	char fw_version[128];
1728892ea20SAggelos Economopoulos 	int fw_ver_major;
1738892ea20SAggelos Economopoulos 	int fw_ver_minor;
1748892ea20SAggelos Economopoulos 	int fw_ver_tiny;
1758892ea20SAggelos Economopoulos 	int adopted_rx_filter_bug;
1768892ea20SAggelos Economopoulos 	device_t dev;
1778892ea20SAggelos Economopoulos 	struct ifmedia media;
1788892ea20SAggelos Economopoulos 	int read_dma;
1798892ea20SAggelos Economopoulos 	int write_dma;
1808892ea20SAggelos Economopoulos 	int read_write_dma;
1818892ea20SAggelos Economopoulos 	int fw_multicast_support;
1828892ea20SAggelos Economopoulos 	int link_width;
1838892ea20SAggelos Economopoulos 	int max_mtu;
18489d55360SSepherosa Ziehau 	int throttle;
1858892ea20SAggelos Economopoulos 	int tx_defrag;
1868892ea20SAggelos Economopoulos 	int media_flags;
1878892ea20SAggelos Economopoulos 	int need_media_probe;
1888892ea20SAggelos Economopoulos 	int num_slices;
1898892ea20SAggelos Economopoulos 	int rx_ring_size;
1908892ea20SAggelos Economopoulos 	int dying;
19189d55360SSepherosa Ziehau 	int connector;
19289d55360SSepherosa Ziehau 	int current_media;
193*7cc92483SSepherosa Ziehau 	bus_dmamem_t dmabench_dma;
1948892ea20SAggelos Economopoulos 	struct callout co_hdl;
195b6737651SAggelos Economopoulos 	struct sysctl_ctx_list sysctl_ctx;
196b6737651SAggelos Economopoulos 	struct sysctl_oid *sysctl_tree;
1978892ea20SAggelos Economopoulos 	struct sysctl_oid *slice_sysctl_tree;
1988892ea20SAggelos Economopoulos 	struct sysctl_ctx_list slice_sysctl_ctx;
1998892ea20SAggelos Economopoulos 	char *mac_addr_string;
2008892ea20SAggelos Economopoulos 	uint8_t	mac_addr[6];		/* eeprom mac address */
20189d55360SSepherosa Ziehau 	uint16_t pectl;			/* save PCIe CTL state */
2028892ea20SAggelos Economopoulos 	char product_code_string[64];
2038892ea20SAggelos Economopoulos 	char serial_number_string[64];
2048892ea20SAggelos Economopoulos };
2058892ea20SAggelos Economopoulos 
2068892ea20SAggelos Economopoulos #define MXGE_PCI_VENDOR_MYRICOM 	0x14c1
2078892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E 		0x0008
2088892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E_9 		0x0009
2098892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8E		0
2108892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8ES		1
21189d55360SSepherosa Ziehau 
2128892ea20SAggelos Economopoulos #define MXGE_XFP_COMPLIANCE_BYTE	131
2138892ea20SAggelos Economopoulos #define MXGE_SFP_COMPLIANCE_BYTE	3
2148892ea20SAggelos Economopoulos 
21589d55360SSepherosa Ziehau #define MXGE_MIN_THROTTLE		416
21689d55360SSepherosa Ziehau #define MXGE_MAX_THROTTLE		4096
21789d55360SSepherosa Ziehau 
21889d55360SSepherosa Ziehau /* Types of connectors on NICs supported by this driver */
21989d55360SSepherosa Ziehau #define MXGE_CX4 0
22089d55360SSepherosa Ziehau #define MXGE_XFP 1
22189d55360SSepherosa Ziehau #define MXGE_SFP 2
22289d55360SSepherosa Ziehau #define MXGE_QRF 3
22389d55360SSepherosa Ziehau 
2248892ea20SAggelos Economopoulos #define MXGE_HIGHPART_TO_U32(X) \
2258892ea20SAggelos Economopoulos 	(sizeof (X) == 8) ? ((uint32_t)((uint64_t)(X) >> 32)) : (0)
2268892ea20SAggelos Economopoulos #define MXGE_LOWPART_TO_U32(X) ((uint32_t)(X))
2278892ea20SAggelos Economopoulos 
22889d55360SSepherosa Ziehau struct mxge_media_type {
2298892ea20SAggelos Economopoulos 	int flag;
2308892ea20SAggelos Economopoulos 	uint8_t bitmask;
2318892ea20SAggelos Economopoulos 	char *name;
2328892ea20SAggelos Economopoulos };
2338892ea20SAggelos Economopoulos 
2348892ea20SAggelos Economopoulos #if defined(__GNUC__)
23589d55360SSepherosa Ziehau #if defined(__i386__) || defined(__x86_64__)
2368892ea20SAggelos Economopoulos #define wmb()  __asm__ __volatile__ ("sfence;": : :"memory")
2378892ea20SAggelos Economopoulos #else
23889d55360SSepherosa Ziehau #error "unknown arch"
2398892ea20SAggelos Economopoulos #endif
2408892ea20SAggelos Economopoulos #else
2418892ea20SAggelos Economopoulos #error "unknown compiler"
2428892ea20SAggelos Economopoulos #endif
2438892ea20SAggelos Economopoulos 
24489d55360SSepherosa Ziehau static __inline void
2458892ea20SAggelos Economopoulos mxge_pio_copy(volatile void *to_v, void *from_v, size_t size)
2468892ea20SAggelos Economopoulos {
2478892ea20SAggelos Economopoulos 	register volatile uintptr_t *to;
2488892ea20SAggelos Economopoulos 	volatile uintptr_t *from;
2498892ea20SAggelos Economopoulos 	size_t i;
2508892ea20SAggelos Economopoulos 
2518892ea20SAggelos Economopoulos 	to = (volatile uintptr_t *)to_v;
2528892ea20SAggelos Economopoulos 	from = from_v;
2538892ea20SAggelos Economopoulos 	for (i = (size / sizeof(uintptr_t)); i; i--) {
2548892ea20SAggelos Economopoulos 		*to = *from;
2558892ea20SAggelos Economopoulos 		to++;
2568892ea20SAggelos Economopoulos 		from++;
2578892ea20SAggelos Economopoulos 	}
2588892ea20SAggelos Economopoulos }
259