xref: /dflybsd-src/sys/dev/netif/mxge/if_mxge_var.h (revision 8892ea20f5a790e91e1cf0684073559b613bd916)
1*8892ea20SAggelos Economopoulos /*******************************************************************************
2*8892ea20SAggelos Economopoulos 
3*8892ea20SAggelos Economopoulos Copyright (c) 2006-2009, Myricom Inc.
4*8892ea20SAggelos Economopoulos All rights reserved.
5*8892ea20SAggelos Economopoulos 
6*8892ea20SAggelos Economopoulos Redistribution and use in source and binary forms, with or without
7*8892ea20SAggelos Economopoulos modification, are permitted provided that the following conditions are met:
8*8892ea20SAggelos Economopoulos 
9*8892ea20SAggelos Economopoulos  1. Redistributions of source code must retain the above copyright notice,
10*8892ea20SAggelos Economopoulos     this list of conditions and the following disclaimer.
11*8892ea20SAggelos Economopoulos 
12*8892ea20SAggelos Economopoulos  2. Neither the name of the Myricom Inc, nor the names of its
13*8892ea20SAggelos Economopoulos     contributors may be used to endorse or promote products derived from
14*8892ea20SAggelos Economopoulos     this software without specific prior written permission.
15*8892ea20SAggelos Economopoulos 
16*8892ea20SAggelos Economopoulos THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*8892ea20SAggelos Economopoulos AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*8892ea20SAggelos Economopoulos IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*8892ea20SAggelos Economopoulos ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20*8892ea20SAggelos Economopoulos LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*8892ea20SAggelos Economopoulos CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*8892ea20SAggelos Economopoulos SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*8892ea20SAggelos Economopoulos INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*8892ea20SAggelos Economopoulos CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*8892ea20SAggelos Economopoulos ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*8892ea20SAggelos Economopoulos POSSIBILITY OF SUCH DAMAGE.
27*8892ea20SAggelos Economopoulos 
28*8892ea20SAggelos Economopoulos $FreeBSD: src/sys/dev/mxge/if_mxge_var.h,v 1.30 2009/06/24 21:09:56 gallatin Exp $
29*8892ea20SAggelos Economopoulos 
30*8892ea20SAggelos Economopoulos ***************************************************************************/
31*8892ea20SAggelos Economopoulos 
32*8892ea20SAggelos Economopoulos #define MXGE_ETH_STOPPED 0
33*8892ea20SAggelos Economopoulos #define MXGE_ETH_STOPPING 1
34*8892ea20SAggelos Economopoulos #define MXGE_ETH_STARTING 2
35*8892ea20SAggelos Economopoulos #define MXGE_ETH_RUNNING 3
36*8892ea20SAggelos Economopoulos #define MXGE_ETH_OPEN_FAILED 4
37*8892ea20SAggelos Economopoulos 
38*8892ea20SAggelos Economopoulos #define MXGE_FW_OFFSET 1024*1024
39*8892ea20SAggelos Economopoulos #define MXGE_EEPROM_STRINGS_SIZE 256
40*8892ea20SAggelos Economopoulos #define MXGE_MAX_SEND_DESC 128
41*8892ea20SAggelos Economopoulos 
42*8892ea20SAggelos Economopoulos #if ((__FreeBSD_version > 800000 && __FreeBSD_version < 800005) \
43*8892ea20SAggelos Economopoulos      || __FreeBSD_version < 700111)
44*8892ea20SAggelos Economopoulos #define MXGE_VIRT_JUMBOS 1
45*8892ea20SAggelos Economopoulos #else
46*8892ea20SAggelos Economopoulos #define MXGE_VIRT_JUMBOS 0
47*8892ea20SAggelos Economopoulos #endif
48*8892ea20SAggelos Economopoulos 
49*8892ea20SAggelos Economopoulos #if (__FreeBSD_version > 800082)
50*8892ea20SAggelos Economopoulos #define IFNET_BUF_RING 1
51*8892ea20SAggelos Economopoulos #endif
52*8892ea20SAggelos Economopoulos 
53*8892ea20SAggelos Economopoulos #ifndef VLAN_CAPABILITIES
54*8892ea20SAggelos Economopoulos #define VLAN_CAPABILITIES(ifp)
55*8892ea20SAggelos Economopoulos #define mxge_vlans_active(sc) (sc)->ifp->if_nvlans
56*8892ea20SAggelos Economopoulos #else
57*8892ea20SAggelos Economopoulos #define mxge_vlans_active(sc) (sc)->ifp->if_vlantrunk
58*8892ea20SAggelos Economopoulos #endif
59*8892ea20SAggelos Economopoulos 
60*8892ea20SAggelos Economopoulos #ifndef VLAN_TAG_VALUE
61*8892ea20SAggelos Economopoulos #define MXGE_NEW_VLAN_API
62*8892ea20SAggelos Economopoulos #endif
63*8892ea20SAggelos Economopoulos 
64*8892ea20SAggelos Economopoulos #ifndef IFCAP_LRO
65*8892ea20SAggelos Economopoulos #define IFCAP_LRO 0
66*8892ea20SAggelos Economopoulos #endif
67*8892ea20SAggelos Economopoulos 
68*8892ea20SAggelos Economopoulos #ifndef IFCAP_TSO
69*8892ea20SAggelos Economopoulos #define IFCAP_TSO 0
70*8892ea20SAggelos Economopoulos #endif
71*8892ea20SAggelos Economopoulos 
72*8892ea20SAggelos Economopoulos #ifndef IFCAP_TSO4
73*8892ea20SAggelos Economopoulos #define IFCAP_TSO4 0
74*8892ea20SAggelos Economopoulos #endif
75*8892ea20SAggelos Economopoulos 
76*8892ea20SAggelos Economopoulos #ifndef CSUM_TSO
77*8892ea20SAggelos Economopoulos #define CSUM_TSO 0
78*8892ea20SAggelos Economopoulos #endif
79*8892ea20SAggelos Economopoulos 
80*8892ea20SAggelos Economopoulos 
81*8892ea20SAggelos Economopoulos typedef struct {
82*8892ea20SAggelos Economopoulos 	void *addr;
83*8892ea20SAggelos Economopoulos 	bus_addr_t bus_addr;
84*8892ea20SAggelos Economopoulos 	bus_dma_tag_t dmat;
85*8892ea20SAggelos Economopoulos 	bus_dmamap_t map;
86*8892ea20SAggelos Economopoulos } mxge_dma_t;
87*8892ea20SAggelos Economopoulos 
88*8892ea20SAggelos Economopoulos 
89*8892ea20SAggelos Economopoulos typedef struct {
90*8892ea20SAggelos Economopoulos 	mcp_slot_t *entry;
91*8892ea20SAggelos Economopoulos 	mxge_dma_t dma;
92*8892ea20SAggelos Economopoulos 	int cnt;
93*8892ea20SAggelos Economopoulos 	int idx;
94*8892ea20SAggelos Economopoulos 	int mask;
95*8892ea20SAggelos Economopoulos } mxge_rx_done_t;
96*8892ea20SAggelos Economopoulos 
97*8892ea20SAggelos Economopoulos typedef struct
98*8892ea20SAggelos Economopoulos {
99*8892ea20SAggelos Economopoulos   uint32_t data0;
100*8892ea20SAggelos Economopoulos   uint32_t data1;
101*8892ea20SAggelos Economopoulos   uint32_t data2;
102*8892ea20SAggelos Economopoulos } mxge_cmd_t;
103*8892ea20SAggelos Economopoulos 
104*8892ea20SAggelos Economopoulos struct mxge_rx_buffer_state {
105*8892ea20SAggelos Economopoulos 	struct mbuf *m;
106*8892ea20SAggelos Economopoulos 	bus_dmamap_t map;
107*8892ea20SAggelos Economopoulos };
108*8892ea20SAggelos Economopoulos 
109*8892ea20SAggelos Economopoulos struct mxge_tx_buffer_state {
110*8892ea20SAggelos Economopoulos 	struct mbuf *m;
111*8892ea20SAggelos Economopoulos 	bus_dmamap_t map;
112*8892ea20SAggelos Economopoulos 	int flag;
113*8892ea20SAggelos Economopoulos };
114*8892ea20SAggelos Economopoulos 
115*8892ea20SAggelos Economopoulos typedef struct
116*8892ea20SAggelos Economopoulos {
117*8892ea20SAggelos Economopoulos 	volatile mcp_kreq_ether_recv_t *lanai;	/* lanai ptr for recv ring */
118*8892ea20SAggelos Economopoulos 	mcp_kreq_ether_recv_t *shadow;	/* host shadow of recv ring */
119*8892ea20SAggelos Economopoulos 	struct mxge_rx_buffer_state *info;
120*8892ea20SAggelos Economopoulos 	bus_dma_tag_t dmat;
121*8892ea20SAggelos Economopoulos 	bus_dmamap_t extra_map;
122*8892ea20SAggelos Economopoulos 	int cnt;
123*8892ea20SAggelos Economopoulos 	int nbufs;
124*8892ea20SAggelos Economopoulos 	int cl_size;
125*8892ea20SAggelos Economopoulos 	int alloc_fail;
126*8892ea20SAggelos Economopoulos 	int mask;			/* number of rx slots -1 */
127*8892ea20SAggelos Economopoulos 	int mlen;
128*8892ea20SAggelos Economopoulos } mxge_rx_ring_t;
129*8892ea20SAggelos Economopoulos 
130*8892ea20SAggelos Economopoulos typedef struct
131*8892ea20SAggelos Economopoulos {
132*8892ea20SAggelos Economopoulos 	struct mtx mtx;
133*8892ea20SAggelos Economopoulos #ifdef IFNET_BUF_RING
134*8892ea20SAggelos Economopoulos 	struct buf_ring *br;
135*8892ea20SAggelos Economopoulos #endif
136*8892ea20SAggelos Economopoulos 	volatile mcp_kreq_ether_send_t *lanai;	/* lanai ptr for sendq	*/
137*8892ea20SAggelos Economopoulos 	volatile uint32_t *send_go;		/* doorbell for sendq */
138*8892ea20SAggelos Economopoulos 	volatile uint32_t *send_stop;		/* doorbell for sendq */
139*8892ea20SAggelos Economopoulos 	mcp_kreq_ether_send_t *req_list;	/* host shadow of sendq */
140*8892ea20SAggelos Economopoulos 	char *req_bytes;
141*8892ea20SAggelos Economopoulos 	bus_dma_segment_t *seg_list;
142*8892ea20SAggelos Economopoulos 	struct mxge_tx_buffer_state *info;
143*8892ea20SAggelos Economopoulos 	bus_dma_tag_t dmat;
144*8892ea20SAggelos Economopoulos 	int req;			/* transmits submitted	*/
145*8892ea20SAggelos Economopoulos 	int mask;			/* number of transmit slots -1 */
146*8892ea20SAggelos Economopoulos 	int done;			/* transmits completed	*/
147*8892ea20SAggelos Economopoulos 	int pkt_done;			/* packets completed */
148*8892ea20SAggelos Economopoulos 	int max_desc;			/* max descriptors per xmit */
149*8892ea20SAggelos Economopoulos 	int queue_active;		/* fw currently polling this queue*/
150*8892ea20SAggelos Economopoulos 	int activate;
151*8892ea20SAggelos Economopoulos 	int deactivate;
152*8892ea20SAggelos Economopoulos 	int stall;			/* #times hw queue exhausted */
153*8892ea20SAggelos Economopoulos 	int wake;			/* #times irq re-enabled xmit */
154*8892ea20SAggelos Economopoulos 	int watchdog_req;		/* cache of req */
155*8892ea20SAggelos Economopoulos 	int watchdog_done;		/* cache of done */
156*8892ea20SAggelos Economopoulos 	int watchdog_rx_pause;		/* cache of pause rq recvd */
157*8892ea20SAggelos Economopoulos 	int defrag;
158*8892ea20SAggelos Economopoulos 	char mtx_name[16];
159*8892ea20SAggelos Economopoulos } mxge_tx_ring_t;
160*8892ea20SAggelos Economopoulos 
161*8892ea20SAggelos Economopoulos struct lro_entry;
162*8892ea20SAggelos Economopoulos struct lro_entry
163*8892ea20SAggelos Economopoulos {
164*8892ea20SAggelos Economopoulos 	SLIST_ENTRY(lro_entry) next;
165*8892ea20SAggelos Economopoulos 	struct mbuf  	*m_head;
166*8892ea20SAggelos Economopoulos 	struct mbuf	*m_tail;
167*8892ea20SAggelos Economopoulos 	int		timestamp;
168*8892ea20SAggelos Economopoulos 	struct ip	*ip;
169*8892ea20SAggelos Economopoulos 	uint32_t	tsval;
170*8892ea20SAggelos Economopoulos 	uint32_t	tsecr;
171*8892ea20SAggelos Economopoulos 	uint32_t	source_ip;
172*8892ea20SAggelos Economopoulos 	uint32_t	dest_ip;
173*8892ea20SAggelos Economopoulos 	uint32_t	next_seq;
174*8892ea20SAggelos Economopoulos 	uint32_t	ack_seq;
175*8892ea20SAggelos Economopoulos 	uint32_t	len;
176*8892ea20SAggelos Economopoulos 	uint32_t	data_csum;
177*8892ea20SAggelos Economopoulos 	uint16_t	window;
178*8892ea20SAggelos Economopoulos 	uint16_t	source_port;
179*8892ea20SAggelos Economopoulos 	uint16_t	dest_port;
180*8892ea20SAggelos Economopoulos 	uint16_t	append_cnt;
181*8892ea20SAggelos Economopoulos 	uint16_t	mss;
182*8892ea20SAggelos Economopoulos 
183*8892ea20SAggelos Economopoulos };
184*8892ea20SAggelos Economopoulos SLIST_HEAD(lro_head, lro_entry);
185*8892ea20SAggelos Economopoulos 
186*8892ea20SAggelos Economopoulos struct mxge_softc;
187*8892ea20SAggelos Economopoulos typedef struct mxge_softc mxge_softc_t;
188*8892ea20SAggelos Economopoulos 
189*8892ea20SAggelos Economopoulos struct mxge_slice_state {
190*8892ea20SAggelos Economopoulos 	mxge_softc_t *sc;
191*8892ea20SAggelos Economopoulos 	mxge_tx_ring_t tx;		/* transmit ring 	*/
192*8892ea20SAggelos Economopoulos 	mxge_rx_ring_t rx_small;
193*8892ea20SAggelos Economopoulos 	mxge_rx_ring_t rx_big;
194*8892ea20SAggelos Economopoulos 	mxge_rx_done_t rx_done;
195*8892ea20SAggelos Economopoulos 	mcp_irq_data_t *fw_stats;
196*8892ea20SAggelos Economopoulos 	volatile uint32_t *irq_claim;
197*8892ea20SAggelos Economopoulos 	u_long ipackets;
198*8892ea20SAggelos Economopoulos 	u_long opackets;
199*8892ea20SAggelos Economopoulos 	u_long obytes;
200*8892ea20SAggelos Economopoulos 	u_long omcasts;
201*8892ea20SAggelos Economopoulos 	u_long oerrors;
202*8892ea20SAggelos Economopoulos 	int if_drv_flags;
203*8892ea20SAggelos Economopoulos 	struct lro_head lro_active;
204*8892ea20SAggelos Economopoulos 	struct lro_head lro_free;
205*8892ea20SAggelos Economopoulos 	int lro_queued;
206*8892ea20SAggelos Economopoulos 	int lro_flushed;
207*8892ea20SAggelos Economopoulos 	int lro_bad_csum;
208*8892ea20SAggelos Economopoulos 	mxge_dma_t fw_stats_dma;
209*8892ea20SAggelos Economopoulos 	struct sysctl_oid *sysctl_tree;
210*8892ea20SAggelos Economopoulos 	struct sysctl_ctx_list sysctl_ctx;
211*8892ea20SAggelos Economopoulos 	char scratch[256];
212*8892ea20SAggelos Economopoulos };
213*8892ea20SAggelos Economopoulos 
214*8892ea20SAggelos Economopoulos struct mxge_softc {
215*8892ea20SAggelos Economopoulos 	struct ifnet* ifp;
216*8892ea20SAggelos Economopoulos 	struct mxge_slice_state *ss;
217*8892ea20SAggelos Economopoulos 	int csum_flag;			/* rx_csums? 		*/
218*8892ea20SAggelos Economopoulos 	int tx_boundary;		/* boundary transmits cannot cross*/
219*8892ea20SAggelos Economopoulos 	int lro_cnt;
220*8892ea20SAggelos Economopoulos 	bus_dma_tag_t	parent_dmat;
221*8892ea20SAggelos Economopoulos 	volatile uint8_t *sram;
222*8892ea20SAggelos Economopoulos 	int sram_size;
223*8892ea20SAggelos Economopoulos 	volatile uint32_t *irq_deassert;
224*8892ea20SAggelos Economopoulos 	mcp_cmd_response_t *cmd;
225*8892ea20SAggelos Economopoulos 	mxge_dma_t cmd_dma;
226*8892ea20SAggelos Economopoulos 	mxge_dma_t zeropad_dma;
227*8892ea20SAggelos Economopoulos 	struct pci_dev *pdev;
228*8892ea20SAggelos Economopoulos 	int legacy_irq;
229*8892ea20SAggelos Economopoulos 	int link_state;
230*8892ea20SAggelos Economopoulos 	unsigned int rdma_tags_available;
231*8892ea20SAggelos Economopoulos 	int intr_coal_delay;
232*8892ea20SAggelos Economopoulos 	volatile uint32_t *intr_coal_delay_ptr;
233*8892ea20SAggelos Economopoulos 	int wc;
234*8892ea20SAggelos Economopoulos 	struct mtx cmd_mtx;
235*8892ea20SAggelos Economopoulos 	struct mtx driver_mtx;
236*8892ea20SAggelos Economopoulos 	int wake_queue;
237*8892ea20SAggelos Economopoulos 	int stop_queue;
238*8892ea20SAggelos Economopoulos 	int down_cnt;
239*8892ea20SAggelos Economopoulos 	int watchdog_resets;
240*8892ea20SAggelos Economopoulos 	int watchdog_countdown;
241*8892ea20SAggelos Economopoulos 	int pause;
242*8892ea20SAggelos Economopoulos 	struct resource *mem_res;
243*8892ea20SAggelos Economopoulos 	struct resource *irq_res;
244*8892ea20SAggelos Economopoulos 	struct resource **msix_irq_res;
245*8892ea20SAggelos Economopoulos 	struct resource *msix_table_res;
246*8892ea20SAggelos Economopoulos 	struct resource *msix_pba_res;
247*8892ea20SAggelos Economopoulos 	void *ih;
248*8892ea20SAggelos Economopoulos 	void **msix_ih;
249*8892ea20SAggelos Economopoulos 	char *fw_name;
250*8892ea20SAggelos Economopoulos 	char eeprom_strings[MXGE_EEPROM_STRINGS_SIZE];
251*8892ea20SAggelos Economopoulos 	char fw_version[128];
252*8892ea20SAggelos Economopoulos 	int fw_ver_major;
253*8892ea20SAggelos Economopoulos 	int fw_ver_minor;
254*8892ea20SAggelos Economopoulos 	int fw_ver_tiny;
255*8892ea20SAggelos Economopoulos 	int adopted_rx_filter_bug;
256*8892ea20SAggelos Economopoulos 	device_t dev;
257*8892ea20SAggelos Economopoulos 	struct ifmedia media;
258*8892ea20SAggelos Economopoulos 	int read_dma;
259*8892ea20SAggelos Economopoulos 	int write_dma;
260*8892ea20SAggelos Economopoulos 	int read_write_dma;
261*8892ea20SAggelos Economopoulos 	int fw_multicast_support;
262*8892ea20SAggelos Economopoulos 	int link_width;
263*8892ea20SAggelos Economopoulos 	int max_mtu;
264*8892ea20SAggelos Economopoulos 	int tx_defrag;
265*8892ea20SAggelos Economopoulos 	int media_flags;
266*8892ea20SAggelos Economopoulos 	int need_media_probe;
267*8892ea20SAggelos Economopoulos 	int num_slices;
268*8892ea20SAggelos Economopoulos 	int rx_ring_size;
269*8892ea20SAggelos Economopoulos 	int dying;
270*8892ea20SAggelos Economopoulos 	mxge_dma_t dmabench_dma;
271*8892ea20SAggelos Economopoulos 	struct callout co_hdl;
272*8892ea20SAggelos Economopoulos 	struct sysctl_oid *slice_sysctl_tree;
273*8892ea20SAggelos Economopoulos 	struct sysctl_ctx_list slice_sysctl_ctx;
274*8892ea20SAggelos Economopoulos 	char *mac_addr_string;
275*8892ea20SAggelos Economopoulos 	uint8_t	mac_addr[6];		/* eeprom mac address */
276*8892ea20SAggelos Economopoulos 	char product_code_string[64];
277*8892ea20SAggelos Economopoulos 	char serial_number_string[64];
278*8892ea20SAggelos Economopoulos 	char cmd_mtx_name[16];
279*8892ea20SAggelos Economopoulos 	char driver_mtx_name[16];
280*8892ea20SAggelos Economopoulos };
281*8892ea20SAggelos Economopoulos 
282*8892ea20SAggelos Economopoulos #define MXGE_PCI_VENDOR_MYRICOM 	0x14c1
283*8892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E 	0x0008
284*8892ea20SAggelos Economopoulos #define MXGE_PCI_DEVICE_Z8E_9 	0x0009
285*8892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8E	0
286*8892ea20SAggelos Economopoulos #define MXGE_PCI_REV_Z8ES	1
287*8892ea20SAggelos Economopoulos #define MXGE_XFP_COMPLIANCE_BYTE	131
288*8892ea20SAggelos Economopoulos #define MXGE_SFP_COMPLIANCE_BYTE	  3
289*8892ea20SAggelos Economopoulos 
290*8892ea20SAggelos Economopoulos #define MXGE_HIGHPART_TO_U32(X) \
291*8892ea20SAggelos Economopoulos (sizeof (X) == 8) ? ((uint32_t)((uint64_t)(X) >> 32)) : (0)
292*8892ea20SAggelos Economopoulos #define MXGE_LOWPART_TO_U32(X) ((uint32_t)(X))
293*8892ea20SAggelos Economopoulos 
294*8892ea20SAggelos Economopoulos struct mxge_media_type
295*8892ea20SAggelos Economopoulos {
296*8892ea20SAggelos Economopoulos 	int flag;
297*8892ea20SAggelos Economopoulos 	uint8_t bitmask;
298*8892ea20SAggelos Economopoulos 	char *name;
299*8892ea20SAggelos Economopoulos };
300*8892ea20SAggelos Economopoulos 
301*8892ea20SAggelos Economopoulos /* implement our own memory barriers, since bus_space_barrier
302*8892ea20SAggelos Economopoulos    cannot handle write-combining regions */
303*8892ea20SAggelos Economopoulos 
304*8892ea20SAggelos Economopoulos #if __FreeBSD_version < 800053
305*8892ea20SAggelos Economopoulos 
306*8892ea20SAggelos Economopoulos #if defined (__GNUC__)
307*8892ea20SAggelos Economopoulos   #if #cpu(i386) || defined __i386 || defined i386 || defined __i386__ || #cpu(x86_64) || defined __x86_64__
308*8892ea20SAggelos Economopoulos     #define wmb()  __asm__ __volatile__ ("sfence;": : :"memory")
309*8892ea20SAggelos Economopoulos   #elif #cpu(sparc64) || defined sparc64 || defined __sparcv9
310*8892ea20SAggelos Economopoulos     #define wmb()  __asm__ __volatile__ ("membar #MemIssue": : :"memory")
311*8892ea20SAggelos Economopoulos   #elif #cpu(sparc) || defined sparc || defined __sparc__
312*8892ea20SAggelos Economopoulos     #define wmb()  __asm__ __volatile__ ("stbar;": : :"memory")
313*8892ea20SAggelos Economopoulos   #else
314*8892ea20SAggelos Economopoulos     #define wmb() 	/* XXX just to make this compile */
315*8892ea20SAggelos Economopoulos   #endif
316*8892ea20SAggelos Economopoulos #else
317*8892ea20SAggelos Economopoulos   #error "unknown compiler"
318*8892ea20SAggelos Economopoulos #endif
319*8892ea20SAggelos Economopoulos 
320*8892ea20SAggelos Economopoulos #endif
321*8892ea20SAggelos Economopoulos 
322*8892ea20SAggelos Economopoulos static inline void
323*8892ea20SAggelos Economopoulos mxge_pio_copy(volatile void *to_v, void *from_v, size_t size)
324*8892ea20SAggelos Economopoulos {
325*8892ea20SAggelos Economopoulos   register volatile uintptr_t *to;
326*8892ea20SAggelos Economopoulos   volatile uintptr_t *from;
327*8892ea20SAggelos Economopoulos   size_t i;
328*8892ea20SAggelos Economopoulos 
329*8892ea20SAggelos Economopoulos   to = (volatile uintptr_t *) to_v;
330*8892ea20SAggelos Economopoulos   from = from_v;
331*8892ea20SAggelos Economopoulos   for (i = (size / sizeof (uintptr_t)); i; i--) {
332*8892ea20SAggelos Economopoulos 	  *to = *from;
333*8892ea20SAggelos Economopoulos 	  to++;
334*8892ea20SAggelos Economopoulos 	  from++;
335*8892ea20SAggelos Economopoulos   }
336*8892ea20SAggelos Economopoulos 
337*8892ea20SAggelos Economopoulos }
338*8892ea20SAggelos Economopoulos 
339*8892ea20SAggelos Economopoulos void mxge_lro_flush(struct mxge_slice_state *ss, struct lro_entry *lro);
340*8892ea20SAggelos Economopoulos int mxge_lro_rx(struct mxge_slice_state *ss, struct mbuf *m_head,
341*8892ea20SAggelos Economopoulos 		uint32_t csum);
342*8892ea20SAggelos Economopoulos 
343*8892ea20SAggelos Economopoulos 
344*8892ea20SAggelos Economopoulos 
345*8892ea20SAggelos Economopoulos /*
346*8892ea20SAggelos Economopoulos   This file uses Myri10GE driver indentation.
347*8892ea20SAggelos Economopoulos 
348*8892ea20SAggelos Economopoulos   Local Variables:
349*8892ea20SAggelos Economopoulos   c-file-style:"linux"
350*8892ea20SAggelos Economopoulos   tab-width:8
351*8892ea20SAggelos Economopoulos   End:
352*8892ea20SAggelos Economopoulos */
353