ixl.h revision 274360
1/******************************************************************************
2
3  Copyright (c) 2013-2014, Intel Corporation
4  All rights reserved.
5
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8
9   1. Redistributions of source code must retain the above copyright notice,
10      this list of conditions and the following disclaimer.
11
12   2. Redistributions in binary form must reproduce the above copyright
13      notice, this list of conditions and the following disclaimer in the
14      documentation and/or other materials provided with the distribution.
15
16   3. Neither the name of the Intel Corporation nor the names of its
17      contributors may be used to endorse or promote products derived from
18      this software without specific prior written permission.
19
20  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: stable/10/sys/dev/ixl/ixl.h 274360 2014-11-10 23:56:06Z jfv $*/
34
35
36#ifndef _IXL_H_
37#define _IXL_H_
38
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/buf_ring.h>
43#include <sys/mbuf.h>
44#include <sys/protosw.h>
45#include <sys/socket.h>
46#include <sys/malloc.h>
47#include <sys/kernel.h>
48#include <sys/module.h>
49#include <sys/sockio.h>
50#include <sys/eventhandler.h>
51
52#include <net/if.h>
53#include <net/if_var.h>
54#include <net/if_arp.h>
55#include <net/bpf.h>
56#include <net/ethernet.h>
57#include <net/if_dl.h>
58#include <net/if_media.h>
59
60#include <net/bpf.h>
61#include <net/if_types.h>
62#include <net/if_vlan_var.h>
63
64#include <netinet/in_systm.h>
65#include <netinet/in.h>
66#include <netinet/if_ether.h>
67#include <netinet/ip.h>
68#include <netinet/ip6.h>
69#include <netinet/tcp.h>
70#include <netinet/tcp_lro.h>
71#include <netinet/udp.h>
72#include <netinet/sctp.h>
73
74#include <machine/in_cksum.h>
75
76#include <sys/bus.h>
77#include <machine/bus.h>
78#include <sys/rman.h>
79#include <machine/resource.h>
80#include <vm/vm.h>
81#include <vm/pmap.h>
82#include <machine/clock.h>
83#include <dev/pci/pcivar.h>
84#include <dev/pci/pcireg.h>
85#include <sys/proc.h>
86#include <sys/sysctl.h>
87#include <sys/endian.h>
88#include <sys/taskqueue.h>
89#include <sys/pcpu.h>
90#include <sys/smp.h>
91#include <machine/smp.h>
92
93#include "i40e_type.h"
94#include "i40e_prototype.h"
95
96#ifdef IXL_DEBUG
97#include <sys/sbuf.h>
98
99#define MAC_FORMAT "%02x:%02x:%02x:%02x:%02x:%02x"
100#define MAC_FORMAT_ARGS(mac_addr) \
101	(mac_addr)[0], (mac_addr)[1], (mac_addr)[2], (mac_addr)[3], \
102	(mac_addr)[4], (mac_addr)[5]
103#define ON_OFF_STR(is_set) ((is_set) ? "On" : "Off")
104
105
106#define _DBG_PRINTF(S, ...)		printf("%s: " S "\n", __func__, ##__VA_ARGS__)
107#define _DEV_DBG_PRINTF(dev, S, ...)	device_printf(dev, "%s: " S "\n", __func__, ##__VA_ARGS__)
108#define _IF_DBG_PRINTF(ifp, S, ...)	if_printf(ifp, "%s: " S "\n", __func__, ##__VA_ARGS__)
109
110/* Defines for printing generic debug information */
111#define DPRINTF(...)			_DBG_PRINTF(__VA_ARGS__)
112#define DDPRINTF(...)			_DEV_DBG_PRINTF(__VA_ARGS__)
113#define IDPRINTF(...)			_IF_DBG_PRINTF(__VA_ARGS__)
114
115/* Defines for printing specific debug information */
116#define DEBUG_INIT  1
117#define DEBUG_IOCTL 1
118#define DEBUG_HW    1
119
120#define INIT_DEBUGOUT(...)		if (DEBUG_INIT) _DBG_PRINTF(__VA_ARGS__)
121#define INIT_DBG_DEV(...)		if (DEBUG_INIT) _DEV_DBG_PRINTF(__VA_ARGS__)
122#define INIT_DBG_IF(...)		if (DEBUG_INIT) _IF_DBG_PRINTF(__VA_ARGS__)
123
124#define IOCTL_DEBUGOUT(...)		if (DEBUG_IOCTL) _DBG_PRINTF(__VA_ARGS__)
125#define IOCTL_DBG_IF2(ifp, S, ...)	if (DEBUG_IOCTL) \
126					    if_printf(ifp, S "\n", ##__VA_ARGS__)
127#define IOCTL_DBG_IF(...)		if (DEBUG_IOCTL) _IF_DBG_PRINTF(__VA_ARGS__)
128
129#define HW_DEBUGOUT(...)		if (DEBUG_HW) _DBG_PRINTF(__VA_ARGS__)
130
131#else
132#define DEBUG_INIT  0
133#define DEBUG_IOCTL 0
134#define DEBUG_HW    0
135
136#define DPRINTF(...)
137#define DDPRINTF(...)
138#define IDPRINTF(...)
139
140#define INIT_DEBUGOUT(...)
141#define INIT_DBG_DEV(...)
142#define INIT_DBG_IF(...)
143#define IOCTL_DEBUGOUT(...)
144#define IOCTL_DBG_IF2(...)
145#define IOCTL_DBG_IF(...)
146#define HW_DEBUGOUT(...)
147#endif
148
149/* Tunables */
150
151/*
152 * Ring Descriptors Valid Range: 32-4096 Default Value: 1024 This value is the
153 * number of tx/rx descriptors allocated by the driver. Increasing this
154 * value allows the driver to queue more operations. Each descriptor is 16
155 * or 32 bytes (configurable in FVL)
156 */
157#define DEFAULT_RING	1024
158#define PERFORM_RING	2048
159#define MAX_RING	4096
160#define MIN_RING	32
161
162/*
163** Default number of entries in Tx queue buf_ring.
164*/
165#define SMALL_TXBRSZ 4096
166/* This may require mbuf cluster tuning */
167#define DEFAULT_TXBRSZ (SMALL_TXBRSZ * SMALL_TXBRSZ)
168
169/* Alignment for rings */
170#define DBA_ALIGN	128
171
172/*
173 * This parameter controls the maximum no of times the driver will loop in
174 * the isr. Minimum Value = 1
175 */
176#define MAX_LOOP	10
177
178/*
179 * This is the max watchdog interval, ie. the time that can
180 * pass between any two TX clean operations, such only happening
181 * when the TX hardware is functioning.
182 */
183#define IXL_WATCHDOG                   (10 * hz)
184
185/*
186 * This parameters control when the driver calls the routine to reclaim
187 * transmit descriptors.
188 */
189#define IXL_TX_CLEANUP_THRESHOLD	(que->num_desc / 8)
190#define IXL_TX_OP_THRESHOLD		(que->num_desc / 32)
191
192/* Flow control constants */
193#define IXL_FC_PAUSE		0xFFFF
194#define IXL_FC_HI		0x20000
195#define IXL_FC_LO		0x10000
196
197#define MAX_MULTICAST_ADDR	128
198
199#define IXL_BAR			3
200#define IXL_ADM_LIMIT		2
201#define IXL_TSO_SIZE		65535
202#define IXL_TX_BUF_SZ		((u32) 1514)
203#define IXL_AQ_BUF_SZ		((u32) 4096)
204#define IXL_RX_HDR		128
205#define IXL_AQ_LEN		256
206#define IXL_AQ_BUFSZ		4096
207#define IXL_RX_LIMIT		512
208#define IXL_RX_ITR		0
209#define IXL_TX_ITR		1
210#define IXL_ITR_NONE		3
211#define IXL_QUEUE_EOL		0x7FF
212#define IXL_MAX_FRAME		0x2600
213#define IXL_MAX_TX_SEGS		8
214#define IXL_MAX_TSO_SEGS	66
215#define IXL_SPARSE_CHAIN	6
216#define IXL_QUEUE_HUNG		0x80000000
217
218/* ERJ: hardware can support ~1.5k filters between all functions */
219#define IXL_MAX_FILTERS	256
220#define IXL_MAX_TX_BUSY	10
221
222#define IXL_NVM_VERSION_LO_SHIFT	0
223#define IXL_NVM_VERSION_LO_MASK		(0xff << IXL_NVM_VERSION_LO_SHIFT)
224#define IXL_NVM_VERSION_HI_SHIFT	12
225#define IXL_NVM_VERSION_HI_MASK		(0xf << IXL_NVM_VERSION_HI_SHIFT)
226
227
228/*
229 * Interrupt Moderation parameters
230 */
231#define IXL_MAX_ITR		0x07FF
232#define IXL_ITR_100K		0x0005
233#define IXL_ITR_20K		0x0019
234#define IXL_ITR_8K		0x003E
235#define IXL_ITR_4K		0x007A
236#define IXL_ITR_DYNAMIC		0x8000
237#define IXL_LOW_LATENCY		0
238#define IXL_AVE_LATENCY		1
239#define IXL_BULK_LATENCY	2
240
241/* MacVlan Flags */
242#define IXL_FILTER_USED		(u16)(1 << 0)
243#define IXL_FILTER_VLAN		(u16)(1 << 1)
244#define IXL_FILTER_ADD		(u16)(1 << 2)
245#define IXL_FILTER_DEL		(u16)(1 << 3)
246#define IXL_FILTER_MC		(u16)(1 << 4)
247
248/* used in the vlan field of the filter when not a vlan */
249#define IXL_VLAN_ANY		-1
250
251#define CSUM_OFFLOAD_IPV4	(CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
252#define CSUM_OFFLOAD_IPV6	(CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6)
253#define CSUM_OFFLOAD		(CSUM_OFFLOAD_IPV4|CSUM_OFFLOAD_IPV6|CSUM_TSO)
254
255/* Misc flags for ixl_vsi.flags */
256#define IXL_FLAGS_KEEP_TSO4	(1 << 0)
257#define IXL_FLAGS_KEEP_TSO6	(1 << 1)
258
259#define IXL_TX_LOCK(_sc)                mtx_lock(&(_sc)->mtx)
260#define IXL_TX_UNLOCK(_sc)              mtx_unlock(&(_sc)->mtx)
261#define IXL_TX_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->mtx)
262#define IXL_TX_TRYLOCK(_sc)             mtx_trylock(&(_sc)->mtx)
263#define IXL_TX_LOCK_ASSERT(_sc)         mtx_assert(&(_sc)->mtx, MA_OWNED)
264
265#define IXL_RX_LOCK(_sc)                mtx_lock(&(_sc)->mtx)
266#define IXL_RX_UNLOCK(_sc)              mtx_unlock(&(_sc)->mtx)
267#define IXL_RX_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->mtx)
268
269#if __FreeBSD_version >= 1100000
270#define IXL_SET_IPACKETS(vsi, count)	(vsi)->ipackets = (count)
271#define IXL_SET_IERRORS(vsi, count)	(vsi)->ierrors = (count)
272#define IXL_SET_OPACKETS(vsi, count)	(vsi)->opackets = (count)
273#define IXL_SET_OERRORS(vsi, count)	(vsi)->oerrors = (count)
274#define IXL_SET_COLLISIONS(vsi, count)	/* Do nothing; collisions is always 0. */
275#define IXL_SET_IBYTES(vsi, count)	(vsi)->ibytes = (count)
276#define IXL_SET_OBYTES(vsi, count)	(vsi)->obytes = (count)
277#define IXL_SET_IMCASTS(vsi, count)	(vsi)->imcasts = (count)
278#define IXL_SET_OMCASTS(vsi, count)	(vsi)->omcasts = (count)
279#define IXL_SET_IQDROPS(vsi, count)	(vsi)->iqdrops = (count)
280#define IXL_SET_OQDROPS(vsi, count)	(vsi)->iqdrops = (count)
281#define IXL_SET_NOPROTO(vsi, count)	(vsi)->noproto = (count)
282#else
283#define IXL_SET_IPACKETS(vsi, count)	(vsi)->ifp->if_ipackets = (count)
284#define IXL_SET_IERRORS(vsi, count)	(vsi)->ifp->if_ierrors = (count)
285#define IXL_SET_OPACKETS(vsi, count)	(vsi)->ifp->if_opackets = (count)
286#define IXL_SET_OERRORS(vsi, count)	(vsi)->ifp->if_oerrors = (count)
287#define IXL_SET_COLLISIONS(vsi, count)	(vsi)->ifp->if_collisions = (count)
288#define IXL_SET_IBYTES(vsi, count)	(vsi)->ifp->if_ibytes = (count)
289#define IXL_SET_OBYTES(vsi, count)	(vsi)->ifp->if_obytes = (count)
290#define IXL_SET_IMCASTS(vsi, count)	(vsi)->ifp->if_imcasts = (count)
291#define IXL_SET_OMCASTS(vsi, count)	(vsi)->ifp->if_omcasts = (count)
292#define IXL_SET_IQDROPS(vsi, count)	(vsi)->ifp->if_iqdrops = (count)
293#define IXL_SET_OQDROPS(vsi, odrops)	(vsi)->ifp->if_snd.ifq_drops = (odrops)
294#define IXL_SET_NOPROTO(vsi, count)	(vsi)->noproto = (count)
295#endif
296
297/*
298 *****************************************************************************
299 * vendor_info_array
300 *
301 * This array contains the list of Subvendor/Subdevice IDs on which the driver
302 * should load.
303 *
304 *****************************************************************************
305 */
306typedef struct _ixl_vendor_info_t {
307	unsigned int    vendor_id;
308	unsigned int    device_id;
309	unsigned int    subvendor_id;
310	unsigned int    subdevice_id;
311	unsigned int    index;
312} ixl_vendor_info_t;
313
314
315struct ixl_tx_buf {
316	u32		eop_index;
317	struct mbuf	*m_head;
318	bus_dmamap_t	map;
319	bus_dma_tag_t	tag;
320};
321
322struct ixl_rx_buf {
323	struct mbuf	*m_head;
324	struct mbuf	*m_pack;
325	struct mbuf	*fmp;
326	bus_dmamap_t	hmap;
327	bus_dmamap_t	pmap;
328};
329
330/*
331** This struct has multiple uses, multicast
332** addresses, vlans, and mac filters all use it.
333*/
334struct ixl_mac_filter {
335	SLIST_ENTRY(ixl_mac_filter) next;
336	u8	macaddr[ETHER_ADDR_LEN];
337	s16	vlan;
338	u16	flags;
339};
340
341
342/*
343 * The Transmit ring control struct
344 */
345struct tx_ring {
346        struct ixl_queue	*que;
347	struct mtx		mtx;
348	u32			tail;
349	struct i40e_tx_desc	*base;
350	struct i40e_dma_mem	dma;
351	u16			next_avail;
352	u16			next_to_clean;
353	u16			atr_rate;
354	u16			atr_count;
355	u16			itr;
356	u16			latency;
357	struct ixl_tx_buf	*buffers;
358	volatile u16		avail;
359	u32			cmd;
360	bus_dma_tag_t		tx_tag;
361	bus_dma_tag_t		tso_tag;
362	char			mtx_name[16];
363	struct buf_ring		*br;
364
365	/* Used for Dynamic ITR calculation */
366	u32			packets;
367	u32 			bytes;
368
369	/* Soft Stats */
370	u64			tx_bytes;
371	u64			no_desc;
372	u64			total_packets;
373};
374
375
376/*
377 * The Receive ring control struct
378 */
379struct rx_ring {
380        struct ixl_queue	*que;
381	struct mtx		mtx;
382	union i40e_rx_desc	*base;
383	struct i40e_dma_mem	dma;
384	struct lro_ctrl		lro;
385	bool			lro_enabled;
386	bool			hdr_split;
387	bool			discard;
388        u16			next_refresh;
389        u16 			next_check;
390	u16			itr;
391	u16			latency;
392	char			mtx_name[16];
393	struct ixl_rx_buf	*buffers;
394	u32			mbuf_sz;
395	u32			tail;
396	bus_dma_tag_t		htag;
397	bus_dma_tag_t		ptag;
398
399	/* Used for Dynamic ITR calculation */
400	u32			packets;
401	u32 			bytes;
402
403	/* Soft stats */
404	u64			split;
405	u64			rx_packets;
406	u64 			rx_bytes;
407	u64 			discarded;
408	u64 			not_done;
409};
410
411/*
412** Driver queue struct: this is the interrupt container
413**  for the associated tx and rx ring pair.
414*/
415struct ixl_queue {
416	struct ixl_vsi		*vsi;
417	u32			me;
418	u32			msix;           /* This queue's MSIX vector */
419	u32			eims;           /* This queue's EIMS bit */
420	struct resource		*res;
421	void			*tag;
422	int			num_desc;	/* both tx and rx */
423	int			busy;
424	struct tx_ring		txr;
425	struct rx_ring		rxr;
426	struct task		task;
427	struct task		tx_task;
428	struct taskqueue	*tq;
429
430	/* Queue stats */
431	u64			irqs;
432	u64			tso;
433	u64			mbuf_defrag_failed;
434	u64			mbuf_hdr_failed;
435	u64			mbuf_pkt_failed;
436	u64			tx_map_avail;
437	u64			tx_dma_setup;
438	u64			dropped_pkts;
439};
440
441/*
442** Virtual Station interface:
443**	there would be one of these per traffic class/type
444**	for now just one, and its embedded in the pf
445*/
446SLIST_HEAD(ixl_ftl_head, ixl_mac_filter);
447struct ixl_vsi {
448	void 			*back;
449	struct ifnet		*ifp;
450	struct device		*dev;
451	struct i40e_hw		*hw;
452	struct ifmedia		media;
453	u64			que_mask;
454	int			id;
455	u16			msix_base;	/* station base MSIX vector */
456	u16			num_queues;
457	u16			rx_itr_setting;
458	u16			tx_itr_setting;
459	struct ixl_queue	*queues;	/* head of queues */
460	bool			link_active;
461	u16			seid;
462	u16			max_frame_size;
463	u32			link_speed;
464	bool			link_up;
465	u32			fc; /* local flow ctrl setting */
466
467	/* MAC/VLAN Filter list */
468	struct ixl_ftl_head ftl;
469
470	struct i40e_aqc_vsi_properties_data info;
471
472	eventhandler_tag 	vlan_attach;
473	eventhandler_tag 	vlan_detach;
474	u16			num_vlans;
475
476	/* Per-VSI stats from hardware */
477	struct i40e_eth_stats	eth_stats;
478	struct i40e_eth_stats	eth_stats_offsets;
479	bool 			stat_offsets_loaded;
480	/* VSI stat counters */
481	u64			ipackets;
482	u64			ierrors;
483	u64			opackets;
484	u64			oerrors;
485	u64			ibytes;
486	u64			obytes;
487	u64			imcasts;
488	u64			omcasts;
489	u64			iqdrops;
490	u64			oqdrops;
491	u64			noproto;
492
493	/* Driver statistics */
494	u64			hw_filters_del;
495	u64			hw_filters_add;
496
497	/* Misc. */
498	u64 			active_queues;
499	u64 			flags;
500};
501
502/*
503** Find the number of unrefreshed RX descriptors
504*/
505static inline u16
506ixl_rx_unrefreshed(struct ixl_queue *que)
507{
508        struct rx_ring	*rxr = &que->rxr;
509
510	if (rxr->next_check > rxr->next_refresh)
511		return (rxr->next_check - rxr->next_refresh - 1);
512	else
513		return ((que->num_desc + rxr->next_check) -
514		    rxr->next_refresh - 1);
515}
516
517/*
518** Find the next available unused filter
519*/
520static inline struct ixl_mac_filter *
521ixl_get_filter(struct ixl_vsi *vsi)
522{
523	struct ixl_mac_filter  *f;
524
525	/* create a new empty filter */
526	f = malloc(sizeof(struct ixl_mac_filter),
527	    M_DEVBUF, M_NOWAIT | M_ZERO);
528	if (f)
529		SLIST_INSERT_HEAD(&vsi->ftl, f, next);
530
531	return (f);
532}
533
534/*
535** Compare two ethernet addresses
536*/
537static inline bool
538cmp_etheraddr(u8 *ea1, u8 *ea2)
539{
540	bool cmp = FALSE;
541
542	if ((ea1[0] == ea2[0]) && (ea1[1] == ea2[1]) &&
543	    (ea1[2] == ea2[2]) && (ea1[3] == ea2[3]) &&
544	    (ea1[4] == ea2[4]) && (ea1[5] == ea2[5]))
545		cmp = TRUE;
546
547	return (cmp);
548}
549
550/*
551 * Info for stats sysctls
552 */
553struct ixl_sysctl_info {
554	u64	*stat;
555	char	*name;
556	char	*description;
557};
558
559extern int ixl_atr_rate;
560
561/*
562** ixl_fw_version_str - format the FW and NVM version strings
563*/
564static inline char *
565ixl_fw_version_str(struct i40e_hw *hw)
566{
567	static char buf[32];
568
569	snprintf(buf, sizeof(buf),
570	    "f%d.%d a%d.%d n%02x.%02x e%08x",
571	    hw->aq.fw_maj_ver, hw->aq.fw_min_ver,
572	    hw->aq.api_maj_ver, hw->aq.api_min_ver,
573	    (hw->nvm.version & IXL_NVM_VERSION_HI_MASK) >>
574	    IXL_NVM_VERSION_HI_SHIFT,
575	    (hw->nvm.version & IXL_NVM_VERSION_LO_MASK) >>
576	    IXL_NVM_VERSION_LO_SHIFT,
577	    hw->nvm.eetrack);
578	return buf;
579}
580
581/*********************************************************************
582 *  TXRX Function prototypes
583 *********************************************************************/
584int	ixl_allocate_tx_data(struct ixl_queue *);
585int	ixl_allocate_rx_data(struct ixl_queue *);
586void	ixl_init_tx_ring(struct ixl_queue *);
587int	ixl_init_rx_ring(struct ixl_queue *);
588bool	ixl_rxeof(struct ixl_queue *, int);
589bool	ixl_txeof(struct ixl_queue *);
590int	ixl_mq_start(struct ifnet *, struct mbuf *);
591int	ixl_mq_start_locked(struct ifnet *, struct tx_ring *);
592void	ixl_deferred_mq_start(void *, int);
593void	ixl_qflush(struct ifnet *);
594void	ixl_free_vsi(struct ixl_vsi *);
595void	ixl_free_que_tx(struct ixl_queue *);
596void	ixl_free_que_rx(struct ixl_queue *);
597#ifdef IXL_FDIR
598void	ixl_atr(struct ixl_queue *, struct tcphdr *, int);
599#endif
600#if __FreeBSD_version >= 1100000
601uint64_t ixl_get_counter(if_t ifp, ift_counter cnt);
602#endif
603
604#endif /* _IXL_H_ */
605