xref: /freebsd/sys/dev/al_eth/al_eth.c (revision d6b92ffa)
1 /*-
2  * Copyright (c) 2015,2016 Annapurna Labs Ltd. and affiliates
3  * All rights reserved.
4  *
5  * Developed by Semihalf.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
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  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31 
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/bus.h>
35 #include <sys/kernel.h>
36 #include <sys/kthread.h>
37 #include <sys/lock.h>
38 #include <sys/mbuf.h>
39 #include <sys/malloc.h>
40 #include <sys/module.h>
41 #include <sys/rman.h>
42 #include <sys/socket.h>
43 #include <sys/sockio.h>
44 #include <sys/sysctl.h>
45 #include <sys/taskqueue.h>
46 
47 #include <machine/atomic.h>
48 
49 #include "opt_inet.h"
50 #include "opt_inet6.h"
51 
52 #include <net/ethernet.h>
53 #include <net/if.h>
54 #include <net/if_var.h>
55 #include <net/if_arp.h>
56 #include <net/if_dl.h>
57 #include <net/if_media.h>
58 #include <net/if_types.h>
59 #include <netinet/in.h>
60 #include <net/if_vlan_var.h>
61 #include <netinet/tcp.h>
62 #include <netinet/tcp_lro.h>
63 
64 #ifdef INET
65 #include <netinet/in.h>
66 #include <netinet/in_systm.h>
67 #include <netinet/in_var.h>
68 #include <netinet/ip.h>
69 #endif
70 
71 #ifdef INET6
72 #include <netinet/ip6.h>
73 #endif
74 
75 #include <sys/sockio.h>
76 
77 #include <dev/pci/pcireg.h>
78 #include <dev/pci/pcivar.h>
79 
80 #include <dev/mii/mii.h>
81 #include <dev/mii/miivar.h>
82 
83 #include <al_hal_common.h>
84 #include <al_hal_plat_services.h>
85 #include <al_hal_udma_config.h>
86 #include <al_hal_udma_iofic.h>
87 #include <al_hal_udma_debug.h>
88 #include <al_hal_eth.h>
89 
90 #include "al_eth.h"
91 #include "al_init_eth_lm.h"
92 #include "arm/annapurna/alpine/alpine_serdes.h"
93 
94 #include "miibus_if.h"
95 
96 #define	device_printf_dbg(fmt, ...) do {				\
97 	if (AL_DBG_LEVEL >= AL_DBG_LEVEL_DBG) { AL_DBG_LOCK();		\
98 	    device_printf(fmt, __VA_ARGS__); AL_DBG_UNLOCK();}		\
99 	} while (0)
100 
101 MALLOC_DEFINE(M_IFAL, "if_al_malloc", "All allocated data for AL ETH driver");
102 
103 /* move out to some pci header file */
104 #define	PCI_VENDOR_ID_ANNAPURNA_LABS	0x1c36
105 #define	PCI_DEVICE_ID_AL_ETH		0x0001
106 #define	PCI_DEVICE_ID_AL_ETH_ADVANCED	0x0002
107 #define	PCI_DEVICE_ID_AL_ETH_NIC	0x0003
108 #define	PCI_DEVICE_ID_AL_ETH_FPGA_NIC	0x0030
109 #define	PCI_DEVICE_ID_AL_CRYPTO		0x0011
110 #define	PCI_DEVICE_ID_AL_CRYPTO_VF	0x8011
111 #define	PCI_DEVICE_ID_AL_RAID_DMA	0x0021
112 #define	PCI_DEVICE_ID_AL_RAID_DMA_VF	0x8021
113 #define	PCI_DEVICE_ID_AL_USB		0x0041
114 
115 #define	MAC_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x"
116 #define	MAC_ADDR(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]
117 
118 #define	AL_ETH_MAC_TABLE_UNICAST_IDX_BASE	0
119 #define	AL_ETH_MAC_TABLE_UNICAST_MAX_COUNT	4
120 #define	AL_ETH_MAC_TABLE_ALL_MULTICAST_IDX	(AL_ETH_MAC_TABLE_UNICAST_IDX_BASE + \
121 						 AL_ETH_MAC_TABLE_UNICAST_MAX_COUNT)
122 
123 #define	AL_ETH_MAC_TABLE_DROP_IDX		(AL_ETH_FWD_MAC_NUM - 1)
124 #define	AL_ETH_MAC_TABLE_BROADCAST_IDX		(AL_ETH_MAC_TABLE_DROP_IDX - 1)
125 
126 #define	AL_ETH_THASH_UDMA_SHIFT		0
127 #define	AL_ETH_THASH_UDMA_MASK		(0xF << AL_ETH_THASH_UDMA_SHIFT)
128 
129 #define	AL_ETH_THASH_Q_SHIFT		4
130 #define	AL_ETH_THASH_Q_MASK		(0x3 << AL_ETH_THASH_Q_SHIFT)
131 
132 /* the following defines should be moved to hal */
133 #define	AL_ETH_FSM_ENTRY_IPV4_TCP		0
134 #define	AL_ETH_FSM_ENTRY_IPV4_UDP		1
135 #define	AL_ETH_FSM_ENTRY_IPV6_TCP		2
136 #define	AL_ETH_FSM_ENTRY_IPV6_UDP		3
137 #define	AL_ETH_FSM_ENTRY_IPV6_NO_UDP_TCP	4
138 #define	AL_ETH_FSM_ENTRY_IPV4_NO_UDP_TCP	5
139 
140 /* FSM DATA format */
141 #define	AL_ETH_FSM_DATA_OUTER_2_TUPLE	0
142 #define	AL_ETH_FSM_DATA_OUTER_4_TUPLE	1
143 #define	AL_ETH_FSM_DATA_INNER_2_TUPLE	2
144 #define	AL_ETH_FSM_DATA_INNER_4_TUPLE	3
145 
146 #define	AL_ETH_FSM_DATA_HASH_SEL	(1 << 2)
147 
148 #define	AL_ETH_FSM_DATA_DEFAULT_Q	0
149 #define	AL_ETH_FSM_DATA_DEFAULT_UDMA	0
150 
151 #define	AL_BR_SIZE	512
152 #define	AL_TSO_SIZE	65500
153 #define	AL_DEFAULT_MTU	1500
154 
155 #define	CSUM_OFFLOAD		(CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
156 
157 #define	AL_IP_ALIGNMENT_OFFSET	2
158 
159 #define	SFP_I2C_ADDR		0x50
160 
161 #define	AL_MASK_GROUP_A_INT	0x7
162 #define	AL_MASK_GROUP_B_INT	0xF
163 #define	AL_MASK_GROUP_C_INT	0xF
164 #define	AL_MASK_GROUP_D_INT	0xFFFFFFFF
165 
166 #define	AL_REG_OFFSET_FORWARD_INTR	(0x1800000 + 0x1210)
167 #define	AL_EN_FORWARD_INTR	0x1FFFF
168 #define	AL_DIS_FORWARD_INTR	0
169 
170 #define	AL_M2S_MASK_INIT	0x480
171 #define	AL_S2M_MASK_INIT	0x1E0
172 #define	AL_M2S_S2M_MASK_NOT_INT	(0x3f << 25)
173 
174 #define	AL_10BASE_T_SPEED	10
175 #define	AL_100BASE_TX_SPEED	100
176 #define	AL_1000BASE_T_SPEED	1000
177 
178 static devclass_t al_devclass;
179 
180 #define	AL_RX_LOCK_INIT(_sc)	mtx_init(&((_sc)->if_rx_lock), "ALRXL", "ALRXL", MTX_DEF)
181 #define	AL_RX_LOCK(_sc)		mtx_lock(&((_sc)->if_rx_lock))
182 #define	AL_RX_UNLOCK(_sc)	mtx_unlock(&((_sc)->if_rx_lock))
183 
184 /* helper functions */
185 static int al_is_device_supported(device_t);
186 
187 static void al_eth_init_rings(struct al_eth_adapter *);
188 static void al_eth_flow_ctrl_disable(struct al_eth_adapter *);
189 int al_eth_fpga_read_pci_config(void *, int, uint32_t *);
190 int al_eth_fpga_write_pci_config(void *, int, uint32_t);
191 int al_eth_read_pci_config(void *, int, uint32_t *);
192 int al_eth_write_pci_config(void *, int, uint32_t);
193 void al_eth_irq_config(uint32_t *, uint32_t);
194 void al_eth_forward_int_config(uint32_t *, uint32_t);
195 static void al_eth_start_xmit(void *, int);
196 static void al_eth_rx_recv_work(void *, int);
197 static int al_eth_up(struct al_eth_adapter *);
198 static void al_eth_down(struct al_eth_adapter *);
199 static void al_eth_interrupts_unmask(struct al_eth_adapter *);
200 static void al_eth_interrupts_mask(struct al_eth_adapter *);
201 static int al_eth_check_mtu(struct al_eth_adapter *, int);
202 static uint64_t al_get_counter(struct ifnet *, ift_counter);
203 static void al_eth_req_rx_buff_size(struct al_eth_adapter *, int);
204 static int al_eth_board_params_init(struct al_eth_adapter *);
205 static int al_media_update(struct ifnet *);
206 static void al_media_status(struct ifnet *, struct ifmediareq *);
207 static int al_eth_function_reset(struct al_eth_adapter *);
208 static int al_eth_hw_init_adapter(struct al_eth_adapter *);
209 static void al_eth_serdes_init(struct al_eth_adapter *);
210 static void al_eth_lm_config(struct al_eth_adapter *);
211 static int al_eth_hw_init(struct al_eth_adapter *);
212 
213 static void al_tick_stats(void *);
214 
215 /* ifnet entry points */
216 static void al_init(void *);
217 static int al_mq_start(struct ifnet *, struct mbuf *);
218 static void al_qflush(struct ifnet *);
219 static int al_ioctl(struct ifnet * ifp, u_long, caddr_t);
220 
221 /* bus entry points */
222 static int al_probe(device_t);
223 static int al_attach(device_t);
224 static int al_detach(device_t);
225 static int al_shutdown(device_t);
226 
227 /* mii bus support routines */
228 static int al_miibus_readreg(device_t, int, int);
229 static int al_miibus_writereg(device_t, int, int, int);
230 static void al_miibus_statchg(device_t);
231 static void al_miibus_linkchg(device_t);
232 
233 struct al_eth_adapter* g_adapters[16];
234 uint32_t g_adapters_count;
235 
236 /* flag for napi-like mbuf processing, controlled from sysctl */
237 static int napi = 0;
238 
239 static device_method_t al_methods[] = {
240 	/* Device interface */
241 	DEVMETHOD(device_probe,		al_probe),
242 	DEVMETHOD(device_attach,	al_attach),
243 	DEVMETHOD(device_detach,	al_detach),
244 	DEVMETHOD(device_shutdown,	al_shutdown),
245 
246 	DEVMETHOD(miibus_readreg,	al_miibus_readreg),
247 	DEVMETHOD(miibus_writereg,	al_miibus_writereg),
248 	DEVMETHOD(miibus_statchg,	al_miibus_statchg),
249 	DEVMETHOD(miibus_linkchg,	al_miibus_linkchg),
250 	{ 0, 0 }
251 };
252 
253 static driver_t al_driver = {
254 	"al",
255 	al_methods,
256 	sizeof(struct al_eth_adapter),
257 };
258 
259 DRIVER_MODULE(al, pci, al_driver, al_devclass, 0, 0);
260 DRIVER_MODULE(miibus, al, miibus_driver, miibus_devclass, 0, 0);
261 
262 static int
263 al_probe(device_t dev)
264 {
265 	if ((al_is_device_supported(dev)) != 0) {
266 		device_set_desc(dev, "al");
267 		return (BUS_PROBE_DEFAULT);
268 	}
269 	return (ENXIO);
270 }
271 
272 static int
273 al_attach(device_t dev)
274 {
275 	struct al_eth_lm_context *lm_context;
276 	struct al_eth_adapter *adapter;
277 	struct sysctl_oid_list *child;
278 	struct sysctl_ctx_list *ctx;
279 	struct sysctl_oid *tree;
280 	struct ifnet *ifp;
281 	uint32_t dev_id;
282 	uint32_t rev_id;
283 	int bar_udma;
284 	int bar_mac;
285 	int bar_ec;
286 	int err;
287 
288 	err = 0;
289 	ifp = NULL;
290 	dev_id = rev_id = 0;
291 	ctx = device_get_sysctl_ctx(dev);
292 	tree = SYSCTL_PARENT(device_get_sysctl_tree(dev));
293 	child = SYSCTL_CHILDREN(tree);
294 
295 	if (g_adapters_count == 0) {
296 		SYSCTL_ADD_INT(ctx, child, OID_AUTO, "napi",
297 		    CTLFLAG_RW, &napi, 0, "Use pseudo-napi mechanism");
298 	}
299 	adapter = device_get_softc(dev);
300 	adapter->dev = dev;
301 	adapter->board_type = ALPINE_INTEGRATED;
302 	snprintf(adapter->name, AL_ETH_NAME_MAX_LEN, "%s",
303 	    device_get_nameunit(dev));
304 	AL_RX_LOCK_INIT(adapter);
305 
306 	g_adapters[g_adapters_count] = adapter;
307 
308 	lm_context = &adapter->lm_context;
309 
310 	bar_udma = PCIR_BAR(AL_ETH_UDMA_BAR);
311 	adapter->udma_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
312 	    &bar_udma, RF_ACTIVE);
313 	if (adapter->udma_res == NULL) {
314 		device_printf(adapter->dev,
315 		    "could not allocate memory resources for DMA.\n");
316 		err = ENOMEM;
317 		goto err_res_dma;
318 	}
319 	adapter->udma_base = al_bus_dma_to_va(rman_get_bustag(adapter->udma_res),
320 	    rman_get_bushandle(adapter->udma_res));
321 	bar_mac = PCIR_BAR(AL_ETH_MAC_BAR);
322 	adapter->mac_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
323 	    &bar_mac, RF_ACTIVE);
324 	if (adapter->mac_res == NULL) {
325 		device_printf(adapter->dev,
326 		    "could not allocate memory resources for MAC.\n");
327 		err = ENOMEM;
328 		goto err_res_mac;
329 	}
330 	adapter->mac_base = al_bus_dma_to_va(rman_get_bustag(adapter->mac_res),
331 	    rman_get_bushandle(adapter->mac_res));
332 
333 	bar_ec = PCIR_BAR(AL_ETH_EC_BAR);
334 	adapter->ec_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &bar_ec,
335 	    RF_ACTIVE);
336 	if (adapter->ec_res == NULL) {
337 		device_printf(adapter->dev,
338 		    "could not allocate memory resources for EC.\n");
339 		err = ENOMEM;
340 		goto err_res_ec;
341 	}
342 	adapter->ec_base = al_bus_dma_to_va(rman_get_bustag(adapter->ec_res),
343 	    rman_get_bushandle(adapter->ec_res));
344 
345 	adapter->netdev = ifp = if_alloc(IFT_ETHER);
346 
347 	adapter->netdev->if_link_state = LINK_STATE_DOWN;
348 
349 	ifp->if_softc = adapter;
350 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
351 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
352 	ifp->if_flags = ifp->if_drv_flags;
353 	ifp->if_flags |= IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_ALLMULTI;
354 	ifp->if_transmit = al_mq_start;
355 	ifp->if_qflush = al_qflush;
356 	ifp->if_ioctl = al_ioctl;
357 	ifp->if_init = al_init;
358 	ifp->if_get_counter = al_get_counter;
359 	ifp->if_mtu = AL_DEFAULT_MTU;
360 
361 	adapter->if_flags = ifp->if_flags;
362 
363 	ifp->if_capabilities = ifp->if_capenable = 0;
364 
365 	ifp->if_capabilities |= IFCAP_HWCSUM |
366 	    IFCAP_HWCSUM_IPV6 | IFCAP_TSO |
367 	    IFCAP_LRO | IFCAP_JUMBO_MTU;
368 
369 	ifp->if_capenable = ifp->if_capabilities;
370 
371 	adapter->id_number = g_adapters_count;
372 
373 	if (adapter->board_type == ALPINE_INTEGRATED) {
374 		dev_id = pci_get_device(adapter->dev);
375 		rev_id = pci_get_revid(adapter->dev);
376 	} else {
377 		al_eth_fpga_read_pci_config(adapter->internal_pcie_base,
378 		    PCIR_DEVICE, &dev_id);
379 		al_eth_fpga_read_pci_config(adapter->internal_pcie_base,
380 		    PCIR_REVID, &rev_id);
381 	}
382 
383 	adapter->dev_id = dev_id;
384 	adapter->rev_id = rev_id;
385 
386 	/* set default ring sizes */
387 	adapter->tx_ring_count = AL_ETH_DEFAULT_TX_SW_DESCS;
388 	adapter->tx_descs_count = AL_ETH_DEFAULT_TX_HW_DESCS;
389 	adapter->rx_ring_count = AL_ETH_DEFAULT_RX_DESCS;
390 	adapter->rx_descs_count = AL_ETH_DEFAULT_RX_DESCS;
391 
392 	adapter->num_tx_queues = AL_ETH_NUM_QUEUES;
393 	adapter->num_rx_queues = AL_ETH_NUM_QUEUES;
394 
395 	adapter->small_copy_len	= AL_ETH_DEFAULT_SMALL_PACKET_LEN;
396 	adapter->link_poll_interval = AL_ETH_DEFAULT_LINK_POLL_INTERVAL;
397 	adapter->max_rx_buff_alloc_size = AL_ETH_DEFAULT_MAX_RX_BUFF_ALLOC_SIZE;
398 
399 	al_eth_req_rx_buff_size(adapter, adapter->netdev->if_mtu);
400 
401 	adapter->link_config.force_1000_base_x = AL_ETH_DEFAULT_FORCE_1000_BASEX;
402 
403 	err = al_eth_board_params_init(adapter);
404 	if (err != 0)
405 		goto err;
406 
407 	if (adapter->mac_mode == AL_ETH_MAC_MODE_10GbE_Serial) {
408 		ifmedia_init(&adapter->media, IFM_IMASK,
409 		    al_media_update, al_media_status);
410 		ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0, NULL);
411 		ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_LR, 0, NULL);
412 		ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
413 		ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
414 	}
415 
416 	al_eth_function_reset(adapter);
417 
418 	err = al_eth_hw_init_adapter(adapter);
419 	if (err != 0)
420 		goto err;
421 
422 	al_eth_init_rings(adapter);
423 	g_adapters_count++;
424 
425 	al_eth_lm_config(adapter);
426 	mtx_init(&adapter->stats_mtx, "AlStatsMtx", NULL, MTX_DEF);
427 	mtx_init(&adapter->wd_mtx, "AlWdMtx", NULL, MTX_DEF);
428 	callout_init_mtx(&adapter->stats_callout, &adapter->stats_mtx, 0);
429 	callout_init_mtx(&adapter->wd_callout, &adapter->wd_mtx, 0);
430 
431 	ether_ifattach(ifp, adapter->mac_addr);
432 	ifp->if_mtu = AL_DEFAULT_MTU;
433 
434 	if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
435 		al_eth_hw_init(adapter);
436 
437 		/* Attach PHY(s) */
438 		err = mii_attach(adapter->dev, &adapter->miibus, adapter->netdev,
439 		    al_media_update, al_media_status, BMSR_DEFCAPMASK, 0,
440 		    MII_OFFSET_ANY, 0);
441 		if (err != 0) {
442 			device_printf(adapter->dev, "attaching PHYs failed\n");
443 			return (err);
444 		}
445 
446 		adapter->mii = device_get_softc(adapter->miibus);
447 	}
448 
449 	return (err);
450 
451 err:
452 	bus_release_resource(dev, SYS_RES_MEMORY, bar_ec, adapter->ec_res);
453 err_res_ec:
454 	bus_release_resource(dev, SYS_RES_MEMORY, bar_mac, adapter->mac_res);
455 err_res_mac:
456 	bus_release_resource(dev, SYS_RES_MEMORY, bar_udma, adapter->udma_res);
457 err_res_dma:
458 	return (err);
459 }
460 
461 static int
462 al_detach(device_t dev)
463 {
464 	struct al_eth_adapter *adapter;
465 
466 	adapter = device_get_softc(dev);
467 	ether_ifdetach(adapter->netdev);
468 
469 	mtx_destroy(&adapter->stats_mtx);
470 	mtx_destroy(&adapter->wd_mtx);
471 
472 	al_eth_down(adapter);
473 
474 	bus_release_resource(dev, SYS_RES_IRQ,    0, adapter->irq_res);
475 	bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->ec_res);
476 	bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->mac_res);
477 	bus_release_resource(dev, SYS_RES_MEMORY, 0, adapter->udma_res);
478 
479 	return (0);
480 }
481 
482 int
483 al_eth_fpga_read_pci_config(void *handle, int where, uint32_t *val)
484 {
485 
486 	/* handle is the base address of the adapter */
487 	*val = al_reg_read32((void*)((u_long)handle + where));
488 
489 	return (0);
490 }
491 
492 int
493 al_eth_fpga_write_pci_config(void *handle, int where, uint32_t val)
494 {
495 
496 	/* handle is the base address of the adapter */
497 	al_reg_write32((void*)((u_long)handle + where), val);
498 	return (0);
499 }
500 
501 int
502 al_eth_read_pci_config(void *handle, int where, uint32_t *val)
503 {
504 
505 	/* handle is a pci_dev */
506 	*val = pci_read_config((device_t)handle, where, sizeof(*val));
507 	return (0);
508 }
509 
510 int
511 al_eth_write_pci_config(void *handle, int where, uint32_t val)
512 {
513 
514 	/* handle is a pci_dev */
515 	pci_write_config((device_t)handle, where, val, sizeof(val));
516 	return (0);
517 }
518 
519 void
520 al_eth_irq_config(uint32_t *offset, uint32_t value)
521 {
522 
523 	al_reg_write32_relaxed(offset, value);
524 }
525 
526 void
527 al_eth_forward_int_config(uint32_t *offset, uint32_t value)
528 {
529 
530 	al_reg_write32(offset, value);
531 }
532 
533 static void
534 al_eth_serdes_init(struct al_eth_adapter *adapter)
535 {
536 	void __iomem	*serdes_base;
537 
538 	adapter->serdes_init = false;
539 
540 	serdes_base = alpine_serdes_resource_get(adapter->serdes_grp);
541 	if (serdes_base == NULL) {
542 		device_printf(adapter->dev, "serdes_base get failed!\n");
543 		return;
544 	}
545 
546 	serdes_base = al_bus_dma_to_va(serdes_tag, serdes_base);
547 
548 	al_serdes_handle_grp_init(serdes_base, adapter->serdes_grp,
549 	    &adapter->serdes_obj);
550 
551 	adapter->serdes_init = true;
552 }
553 
554 static void
555 al_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
556 {
557 	bus_addr_t *paddr;
558 
559 	paddr = arg;
560 	*paddr = segs->ds_addr;
561 }
562 
563 static int
564 al_dma_alloc_coherent(struct device *dev, bus_dma_tag_t *tag, bus_dmamap_t *map,
565     bus_addr_t *baddr, void **vaddr, uint32_t size)
566 {
567 	int ret;
568 	uint32_t maxsize = ((size - 1)/PAGE_SIZE + 1) * PAGE_SIZE;
569 
570 	ret = bus_dma_tag_create(bus_get_dma_tag(dev), 8, 0,
571 	    BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
572 	    maxsize, 1, maxsize, BUS_DMA_COHERENT, NULL, NULL, tag);
573 	if (ret != 0) {
574 		device_printf(dev,
575 		    "failed to create bus tag, ret = %d\n", ret);
576 		return (ret);
577 	}
578 
579 	ret = bus_dmamem_alloc(*tag, vaddr,
580 	    BUS_DMA_COHERENT | BUS_DMA_ZERO, map);
581 	if (ret != 0) {
582 		device_printf(dev,
583 		    "failed to allocate dmamem, ret = %d\n", ret);
584 		return (ret);
585 	}
586 
587 	ret = bus_dmamap_load(*tag, *map, *vaddr,
588 	    size, al_dma_map_addr, baddr, 0);
589 	if (ret != 0) {
590 		device_printf(dev,
591 		    "failed to allocate bus_dmamap_load, ret = %d\n", ret);
592 		return (ret);
593 	}
594 
595 	return (0);
596 }
597 
598 static void
599 al_dma_free_coherent(bus_dma_tag_t tag, bus_dmamap_t map, void *vaddr)
600 {
601 
602 	bus_dmamap_unload(tag, map);
603 	bus_dmamem_free(tag, vaddr, map);
604 	bus_dma_tag_destroy(tag);
605 }
606 
607 static void
608 al_eth_mac_table_unicast_add(struct al_eth_adapter *adapter,
609     uint8_t idx, uint8_t *addr, uint8_t udma_mask)
610 {
611 	struct al_eth_fwd_mac_table_entry entry = { { 0 } };
612 
613 	memcpy(entry.addr, adapter->mac_addr, sizeof(adapter->mac_addr));
614 
615 	memset(entry.mask, 0xff, sizeof(entry.mask));
616 	entry.rx_valid = true;
617 	entry.tx_valid = false;
618 	entry.udma_mask = udma_mask;
619 	entry.filter = false;
620 
621 	device_printf_dbg(adapter->dev,
622 	    "%s: [%d]: addr "MAC_ADDR_STR" mask "MAC_ADDR_STR"\n",
623 	    __func__, idx, MAC_ADDR(entry.addr), MAC_ADDR(entry.mask));
624 
625 	al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
626 }
627 
628 static void
629 al_eth_mac_table_all_multicast_add(struct al_eth_adapter *adapter, uint8_t idx,
630     uint8_t udma_mask)
631 {
632 	struct al_eth_fwd_mac_table_entry entry = { { 0 } };
633 
634 	memset(entry.addr, 0x00, sizeof(entry.addr));
635 	memset(entry.mask, 0x00, sizeof(entry.mask));
636 	entry.mask[0] |= 1;
637 	entry.addr[0] |= 1;
638 
639 	entry.rx_valid = true;
640 	entry.tx_valid = false;
641 	entry.udma_mask = udma_mask;
642 	entry.filter = false;
643 
644 	device_printf_dbg(adapter->dev,
645 	    "%s: [%d]: addr "MAC_ADDR_STR" mask "MAC_ADDR_STR"\n",
646 	    __func__, idx, MAC_ADDR(entry.addr), MAC_ADDR(entry.mask));
647 
648 	al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
649 }
650 
651 static void
652 al_eth_mac_table_broadcast_add(struct al_eth_adapter *adapter,
653     uint8_t idx, uint8_t udma_mask)
654 {
655 	struct al_eth_fwd_mac_table_entry entry = { { 0 } };
656 
657 	memset(entry.addr, 0xff, sizeof(entry.addr));
658 	memset(entry.mask, 0xff, sizeof(entry.mask));
659 
660 	entry.rx_valid = true;
661 	entry.tx_valid = false;
662 	entry.udma_mask = udma_mask;
663 	entry.filter = false;
664 
665 	device_printf_dbg(adapter->dev,
666 	    "%s: [%d]: addr "MAC_ADDR_STR" mask "MAC_ADDR_STR"\n",
667 	    __func__, idx, MAC_ADDR(entry.addr), MAC_ADDR(entry.mask));
668 
669 	al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
670 }
671 
672 static void
673 al_eth_mac_table_promiscuous_set(struct al_eth_adapter *adapter,
674     boolean_t promiscuous)
675 {
676 	struct al_eth_fwd_mac_table_entry entry = { { 0 } };
677 
678 	memset(entry.addr, 0x00, sizeof(entry.addr));
679 	memset(entry.mask, 0x00, sizeof(entry.mask));
680 
681 	entry.rx_valid = true;
682 	entry.tx_valid = false;
683 	entry.udma_mask = (promiscuous) ? 1 : 0;
684 	entry.filter = (promiscuous) ? false : true;
685 
686 	device_printf_dbg(adapter->dev, "%s: %s promiscuous mode\n",
687 	    __func__, (promiscuous) ? "enter" : "exit");
688 
689 	al_eth_fwd_mac_table_set(&adapter->hal_adapter,
690 	    AL_ETH_MAC_TABLE_DROP_IDX, &entry);
691 }
692 
693 static void
694 al_eth_set_thash_table_entry(struct al_eth_adapter *adapter, uint8_t idx,
695     uint8_t udma, uint32_t queue)
696 {
697 
698 	if (udma != 0)
699 		panic("only UDMA0 is supporter");
700 
701 	if (queue >= AL_ETH_NUM_QUEUES)
702 		panic("invalid queue number");
703 
704 	al_eth_thash_table_set(&adapter->hal_adapter, idx, udma, queue);
705 }
706 
707 /* init FSM, no tunneling supported yet, if packet is tcp/udp over ipv4/ipv6, use 4 tuple hash */
708 static void
709 al_eth_fsm_table_init(struct al_eth_adapter *adapter)
710 {
711 	uint32_t val;
712 	int i;
713 
714 	for (i = 0; i < AL_ETH_RX_FSM_TABLE_SIZE; i++) {
715 		uint8_t outer_type = AL_ETH_FSM_ENTRY_OUTER(i);
716 		switch (outer_type) {
717 		case AL_ETH_FSM_ENTRY_IPV4_TCP:
718 		case AL_ETH_FSM_ENTRY_IPV4_UDP:
719 		case AL_ETH_FSM_ENTRY_IPV6_TCP:
720 		case AL_ETH_FSM_ENTRY_IPV6_UDP:
721 			val = AL_ETH_FSM_DATA_OUTER_4_TUPLE |
722 			    AL_ETH_FSM_DATA_HASH_SEL;
723 			break;
724 		case AL_ETH_FSM_ENTRY_IPV6_NO_UDP_TCP:
725 		case AL_ETH_FSM_ENTRY_IPV4_NO_UDP_TCP:
726 			val = AL_ETH_FSM_DATA_OUTER_2_TUPLE |
727 			    AL_ETH_FSM_DATA_HASH_SEL;
728 			break;
729 		default:
730 			val = AL_ETH_FSM_DATA_DEFAULT_Q |
731 			    AL_ETH_FSM_DATA_DEFAULT_UDMA;
732 		}
733 		al_eth_fsm_table_set(&adapter->hal_adapter, i, val);
734 	}
735 }
736 
737 static void
738 al_eth_mac_table_entry_clear(struct al_eth_adapter *adapter,
739     uint8_t idx)
740 {
741 	struct al_eth_fwd_mac_table_entry entry = { { 0 } };
742 
743 	device_printf_dbg(adapter->dev, "%s: clear entry %d\n", __func__, idx);
744 
745 	al_eth_fwd_mac_table_set(&adapter->hal_adapter, idx, &entry);
746 }
747 
748 static int
749 al_eth_hw_init_adapter(struct al_eth_adapter *adapter)
750 {
751 	struct al_eth_adapter_params *params = &adapter->eth_hal_params;
752 	int rc;
753 
754 	/* params->dev_id = adapter->dev_id; */
755 	params->rev_id = adapter->rev_id;
756 	params->udma_id = 0;
757 	params->enable_rx_parser = 1; /* enable rx epe parser*/
758 	params->udma_regs_base = adapter->udma_base; /* UDMA register base address */
759 	params->ec_regs_base = adapter->ec_base; /* Ethernet controller registers base address */
760 	params->mac_regs_base = adapter->mac_base; /* Ethernet MAC registers base address */
761 	params->name = adapter->name;
762 	params->serdes_lane = adapter->serdes_lane;
763 
764 	rc = al_eth_adapter_init(&adapter->hal_adapter, params);
765 	if (rc != 0)
766 		device_printf(adapter->dev, "%s failed at hal init!\n",
767 		    __func__);
768 
769 	if ((adapter->board_type == ALPINE_NIC) ||
770 	    (adapter->board_type == ALPINE_FPGA_NIC)) {
771 		/* in pcie NIC mode, force eth UDMA to access PCIE0 using the vmid */
772 		struct al_udma_gen_tgtid_conf conf;
773 		int i;
774 		for (i = 0; i < DMA_MAX_Q; i++) {
775 			conf.tx_q_conf[i].queue_en = AL_TRUE;
776 			conf.tx_q_conf[i].desc_en = AL_FALSE;
777 			conf.tx_q_conf[i].tgtid = 0x100; /* for access from PCIE0 */
778 			conf.rx_q_conf[i].queue_en = AL_TRUE;
779 			conf.rx_q_conf[i].desc_en = AL_FALSE;
780 			conf.rx_q_conf[i].tgtid = 0x100; /* for access from PCIE0 */
781 		}
782 		al_udma_gen_tgtid_conf_set(adapter->udma_base, &conf);
783 	}
784 
785 	return (rc);
786 }
787 
788 static void
789 al_eth_lm_config(struct al_eth_adapter *adapter)
790 {
791 	struct al_eth_lm_init_params params = {0};
792 
793 	params.adapter = &adapter->hal_adapter;
794 	params.serdes_obj = &adapter->serdes_obj;
795 	params.lane = adapter->serdes_lane;
796 	params.sfp_detection = adapter->sfp_detection_needed;
797 	if (adapter->sfp_detection_needed == true) {
798 		params.sfp_bus_id = adapter->i2c_adapter_id;
799 		params.sfp_i2c_addr = SFP_I2C_ADDR;
800 	}
801 
802 	if (adapter->sfp_detection_needed == false) {
803 		switch (adapter->mac_mode) {
804 		case AL_ETH_MAC_MODE_10GbE_Serial:
805 			if ((adapter->lt_en != 0) && (adapter->an_en != 0))
806 				params.default_mode = AL_ETH_LM_MODE_10G_DA;
807 			else
808 				params.default_mode = AL_ETH_LM_MODE_10G_OPTIC;
809 			break;
810 		case AL_ETH_MAC_MODE_SGMII:
811 			params.default_mode = AL_ETH_LM_MODE_1G;
812 			break;
813 		default:
814 			params.default_mode = AL_ETH_LM_MODE_10G_DA;
815 		}
816 	} else
817 		params.default_mode = AL_ETH_LM_MODE_10G_DA;
818 
819 	params.link_training = adapter->lt_en;
820 	params.rx_equal = true;
821 	params.static_values = !adapter->dont_override_serdes;
822 	params.i2c_context = adapter;
823 	params.kr_fec_enable = false;
824 
825 	params.retimer_exist = adapter->retimer.exist;
826 	params.retimer_bus_id = adapter->retimer.bus_id;
827 	params.retimer_i2c_addr = adapter->retimer.i2c_addr;
828 	params.retimer_channel = adapter->retimer.channel;
829 
830 	al_eth_lm_init(&adapter->lm_context, &params);
831 }
832 
833 static int
834 al_eth_board_params_init(struct al_eth_adapter *adapter)
835 {
836 
837 	if (adapter->board_type == ALPINE_NIC) {
838 		adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial;
839 		adapter->sfp_detection_needed = false;
840 		adapter->phy_exist = false;
841 		adapter->an_en = false;
842 		adapter->lt_en = false;
843 		adapter->ref_clk_freq = AL_ETH_REF_FREQ_375_MHZ;
844 		adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ;
845 	} else if (adapter->board_type == ALPINE_FPGA_NIC) {
846 		adapter->mac_mode = AL_ETH_MAC_MODE_SGMII;
847 		adapter->sfp_detection_needed = false;
848 		adapter->phy_exist = false;
849 		adapter->an_en = false;
850 		adapter->lt_en = false;
851 		adapter->ref_clk_freq = AL_ETH_REF_FREQ_375_MHZ;
852 		adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ;
853 	} else {
854 		struct al_eth_board_params params;
855 		int rc;
856 
857 		adapter->auto_speed = false;
858 
859 		rc = al_eth_board_params_get(adapter->mac_base, &params);
860 		if (rc != 0) {
861 			device_printf(adapter->dev,
862 			    "board info not available\n");
863 			return (-1);
864 		}
865 
866 		adapter->phy_exist = params.phy_exist == TRUE;
867 		adapter->phy_addr = params.phy_mdio_addr;
868 		adapter->an_en = params.autoneg_enable;
869 		adapter->lt_en = params.kr_lt_enable;
870 		adapter->serdes_grp = params.serdes_grp;
871 		adapter->serdes_lane = params.serdes_lane;
872 		adapter->sfp_detection_needed = params.sfp_plus_module_exist;
873 		adapter->i2c_adapter_id = params.i2c_adapter_id;
874 		adapter->ref_clk_freq = params.ref_clk_freq;
875 		adapter->dont_override_serdes = params.dont_override_serdes;
876 		adapter->link_config.active_duplex = !params.half_duplex;
877 		adapter->link_config.autoneg = !params.an_disable;
878 		adapter->link_config.force_1000_base_x = params.force_1000_base_x;
879 		adapter->retimer.exist = params.retimer_exist;
880 		adapter->retimer.bus_id = params.retimer_bus_id;
881 		adapter->retimer.i2c_addr = params.retimer_i2c_addr;
882 		adapter->retimer.channel = params.retimer_channel;
883 
884 		switch (params.speed) {
885 		default:
886 			device_printf(adapter->dev,
887 			    "%s: invalid speed (%d)\n", __func__, params.speed);
888 		case AL_ETH_BOARD_1G_SPEED_1000M:
889 			adapter->link_config.active_speed = 1000;
890 			break;
891 		case AL_ETH_BOARD_1G_SPEED_100M:
892 			adapter->link_config.active_speed = 100;
893 			break;
894 		case AL_ETH_BOARD_1G_SPEED_10M:
895 			adapter->link_config.active_speed = 10;
896 			break;
897 		}
898 
899 		switch (params.mdio_freq) {
900 		default:
901 			device_printf(adapter->dev,
902 			    "%s: invalid mdio freq (%d)\n", __func__,
903 			    params.mdio_freq);
904 		case AL_ETH_BOARD_MDIO_FREQ_2_5_MHZ:
905 			adapter->mdio_freq = AL_ETH_DEFAULT_MDIO_FREQ_KHZ;
906 			break;
907 		case AL_ETH_BOARD_MDIO_FREQ_1_MHZ:
908 			adapter->mdio_freq = AL_ETH_MDIO_FREQ_1000_KHZ;
909 			break;
910 		}
911 
912 		switch (params.media_type) {
913 		case AL_ETH_BOARD_MEDIA_TYPE_RGMII:
914 			if (params.sfp_plus_module_exist == TRUE)
915 				/* Backward compatibility */
916 				adapter->mac_mode = AL_ETH_MAC_MODE_SGMII;
917 			else
918 				adapter->mac_mode = AL_ETH_MAC_MODE_RGMII;
919 
920 			adapter->use_lm = false;
921 			break;
922 		case AL_ETH_BOARD_MEDIA_TYPE_SGMII:
923 			adapter->mac_mode = AL_ETH_MAC_MODE_SGMII;
924 			adapter->use_lm = true;
925 			break;
926 		case AL_ETH_BOARD_MEDIA_TYPE_10GBASE_SR:
927 			adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial;
928 			adapter->use_lm = true;
929 			break;
930 		case AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT:
931 			adapter->sfp_detection_needed = TRUE;
932 			adapter->auto_speed = false;
933 			adapter->use_lm = true;
934 			break;
935 		case AL_ETH_BOARD_MEDIA_TYPE_AUTO_DETECT_AUTO_SPEED:
936 			adapter->sfp_detection_needed = TRUE;
937 			adapter->auto_speed = true;
938 			adapter->mac_mode_set = false;
939 			adapter->use_lm = true;
940 
941 			adapter->mac_mode = AL_ETH_MAC_MODE_10GbE_Serial;
942 			break;
943 		default:
944 			device_printf(adapter->dev,
945 			    "%s: unsupported media type %d\n",
946 			    __func__, params.media_type);
947 			return (-1);
948 		}
949 
950 		device_printf(adapter->dev,
951 		    "Board info: phy exist %s. phy addr %d. mdio freq %u Khz. "
952 		    "SFP connected %s. media %d\n",
953 		    params.phy_exist == TRUE ? "Yes" : "No",
954 		    params.phy_mdio_addr, adapter->mdio_freq,
955 		    params.sfp_plus_module_exist == TRUE ? "Yes" : "No",
956 		    params.media_type);
957 	}
958 
959 	al_eth_mac_addr_read(adapter->ec_base, 0, adapter->mac_addr);
960 
961 	return (0);
962 }
963 
964 static int
965 al_eth_function_reset(struct al_eth_adapter *adapter)
966 {
967 	struct al_eth_board_params params;
968 	int rc;
969 
970 	/* save board params so we restore it after reset */
971 	al_eth_board_params_get(adapter->mac_base, &params);
972 	al_eth_mac_addr_read(adapter->ec_base, 0, adapter->mac_addr);
973 	if (adapter->board_type == ALPINE_INTEGRATED)
974 		rc = al_eth_flr_rmn(&al_eth_read_pci_config,
975 		    &al_eth_write_pci_config,
976 		    adapter->dev, adapter->mac_base);
977 	else
978 		rc = al_eth_flr_rmn(&al_eth_fpga_read_pci_config,
979 		    &al_eth_fpga_write_pci_config,
980 		    adapter->internal_pcie_base, adapter->mac_base);
981 
982 	/* restore params */
983 	al_eth_board_params_set(adapter->mac_base, &params);
984 	al_eth_mac_addr_store(adapter->ec_base, 0, adapter->mac_addr);
985 
986 	return (rc);
987 }
988 
989 static void
990 al_eth_init_rings(struct al_eth_adapter *adapter)
991 {
992 	int i;
993 
994 	for (i = 0; i < adapter->num_tx_queues; i++) {
995 		struct al_eth_ring *ring = &adapter->tx_ring[i];
996 
997 		ring->ring_id = i;
998 		ring->dev = adapter->dev;
999 		ring->adapter = adapter;
1000 		ring->netdev = adapter->netdev;
1001 		al_udma_q_handle_get(&adapter->hal_adapter.tx_udma, i,
1002 		    &ring->dma_q);
1003 		ring->sw_count = adapter->tx_ring_count;
1004 		ring->hw_count = adapter->tx_descs_count;
1005 		ring->unmask_reg_offset = al_udma_iofic_unmask_offset_get((struct unit_regs *)adapter->udma_base, AL_UDMA_IOFIC_LEVEL_PRIMARY, AL_INT_GROUP_C);
1006 		ring->unmask_val = ~(1 << i);
1007 	}
1008 
1009 	for (i = 0; i < adapter->num_rx_queues; i++) {
1010 		struct al_eth_ring *ring = &adapter->rx_ring[i];
1011 
1012 		ring->ring_id = i;
1013 		ring->dev = adapter->dev;
1014 		ring->adapter = adapter;
1015 		ring->netdev = adapter->netdev;
1016 		al_udma_q_handle_get(&adapter->hal_adapter.rx_udma, i, &ring->dma_q);
1017 		ring->sw_count = adapter->rx_ring_count;
1018 		ring->hw_count = adapter->rx_descs_count;
1019 		ring->unmask_reg_offset = al_udma_iofic_unmask_offset_get(
1020 		    (struct unit_regs *)adapter->udma_base,
1021 		    AL_UDMA_IOFIC_LEVEL_PRIMARY, AL_INT_GROUP_B);
1022 		ring->unmask_val = ~(1 << i);
1023 	}
1024 }
1025 
1026 static void
1027 al_init_locked(void *arg)
1028 {
1029 	struct al_eth_adapter *adapter = arg;
1030 	if_t ifp = adapter->netdev;
1031 	int rc = 0;
1032 
1033 	al_eth_down(adapter);
1034 	rc = al_eth_up(adapter);
1035 
1036 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1037 	if (rc == 0)
1038 		ifp->if_drv_flags |= IFF_DRV_RUNNING;
1039 }
1040 
1041 static void
1042 al_init(void *arg)
1043 {
1044 	struct al_eth_adapter *adapter = arg;
1045 
1046 	al_init_locked(adapter);
1047 }
1048 
1049 static inline int
1050 al_eth_alloc_rx_buf(struct al_eth_adapter *adapter,
1051     struct al_eth_ring *rx_ring,
1052     struct al_eth_rx_buffer *rx_info)
1053 {
1054 	struct al_buf *al_buf;
1055 	bus_dma_segment_t segs[2];
1056 	int error;
1057 	int nsegs;
1058 
1059 	if (rx_info->m != NULL)
1060 		return (0);
1061 
1062 	rx_info->data_size = adapter->rx_mbuf_sz;
1063 
1064 	AL_RX_LOCK(adapter);
1065 
1066 	/* Get mbuf using UMA allocator */
1067 	rx_info->m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
1068 	    rx_info->data_size);
1069 	AL_RX_UNLOCK(adapter);
1070 
1071 	if (rx_info->m == NULL)
1072 		return (ENOMEM);
1073 
1074 	rx_info->m->m_pkthdr.len = rx_info->m->m_len = adapter->rx_mbuf_sz;
1075 
1076 	/* Map packets for DMA */
1077 	error = bus_dmamap_load_mbuf_sg(rx_ring->dma_buf_tag, rx_info->dma_map,
1078 	    rx_info->m, segs, &nsegs, BUS_DMA_NOWAIT);
1079 	if (__predict_false(error)) {
1080 		device_printf(rx_ring->dev, "failed to map mbuf, error = %d\n",
1081 		    error);
1082 		m_freem(rx_info->m);
1083 		rx_info->m = NULL;
1084 		return (EFAULT);
1085 	}
1086 
1087 	al_buf = &rx_info->al_buf;
1088 	al_buf->addr = segs[0].ds_addr + AL_IP_ALIGNMENT_OFFSET;
1089 	al_buf->len = rx_info->data_size - AL_IP_ALIGNMENT_OFFSET;
1090 
1091 	return (0);
1092 }
1093 
1094 static int
1095 al_eth_refill_rx_bufs(struct al_eth_adapter *adapter, unsigned int qid,
1096     unsigned int num)
1097 {
1098 	struct al_eth_ring *rx_ring = &adapter->rx_ring[qid];
1099 	uint16_t next_to_use;
1100 	unsigned int i;
1101 
1102 	next_to_use = rx_ring->next_to_use;
1103 
1104 	for (i = 0; i < num; i++) {
1105 		int rc;
1106 		struct al_eth_rx_buffer *rx_info =
1107 		    &rx_ring->rx_buffer_info[next_to_use];
1108 
1109 		if (__predict_false(al_eth_alloc_rx_buf(adapter,
1110 		    rx_ring, rx_info) < 0)) {
1111 			device_printf(adapter->dev,
1112 			    "failed to alloc buffer for rx queue %d\n", qid);
1113 			break;
1114 		}
1115 
1116 		rc = al_eth_rx_buffer_add(rx_ring->dma_q,
1117 		    &rx_info->al_buf, AL_ETH_RX_FLAGS_INT, NULL);
1118 		if (__predict_false(rc)) {
1119 			device_printf(adapter->dev,
1120 			    "failed to add buffer for rx queue %d\n", qid);
1121 			break;
1122 		}
1123 
1124 		next_to_use = AL_ETH_RX_RING_IDX_NEXT(rx_ring, next_to_use);
1125 	}
1126 
1127 	if (__predict_false(i < num))
1128 		device_printf(adapter->dev,
1129 		    "refilled rx queue %d with %d pages only - available %d\n",
1130 		    qid, i, al_udma_available_get(rx_ring->dma_q));
1131 
1132 	if (__predict_true(i))
1133 		al_eth_rx_buffer_action(rx_ring->dma_q, i);
1134 
1135 	rx_ring->next_to_use = next_to_use;
1136 
1137 	return (i);
1138 }
1139 
1140 /*
1141  * al_eth_refill_all_rx_bufs - allocate all queues Rx buffers
1142  * @adapter: board private structure
1143  */
1144 static void
1145 al_eth_refill_all_rx_bufs(struct al_eth_adapter *adapter)
1146 {
1147 	int i;
1148 
1149 	for (i = 0; i < adapter->num_rx_queues; i++)
1150 		al_eth_refill_rx_bufs(adapter, i, AL_ETH_DEFAULT_RX_DESCS - 1);
1151 }
1152 
1153 static void
1154 al_eth_tx_do_cleanup(struct al_eth_ring *tx_ring)
1155 {
1156 	unsigned int total_done;
1157 	uint16_t next_to_clean;
1158 	int qid = tx_ring->ring_id;
1159 
1160 	total_done = al_eth_comp_tx_get(tx_ring->dma_q);
1161 	device_printf_dbg(tx_ring->dev,
1162 	    "tx_poll: q %d total completed descs %x\n", qid, total_done);
1163 	next_to_clean = tx_ring->next_to_clean;
1164 
1165 	while (total_done != 0) {
1166 		struct al_eth_tx_buffer *tx_info;
1167 		struct mbuf *mbuf;
1168 
1169 		tx_info = &tx_ring->tx_buffer_info[next_to_clean];
1170 		/* stop if not all descriptors of the packet are completed */
1171 		if (tx_info->tx_descs > total_done)
1172 			break;
1173 
1174 		mbuf = tx_info->m;
1175 
1176 		tx_info->m = NULL;
1177 
1178 		device_printf_dbg(tx_ring->dev,
1179 		    "tx_poll: q %d mbuf %p completed\n", qid, mbuf);
1180 
1181 		/* map is no longer required */
1182 		bus_dmamap_unload(tx_ring->dma_buf_tag, tx_info->dma_map);
1183 
1184 		m_freem(mbuf);
1185 		total_done -= tx_info->tx_descs;
1186 		next_to_clean = AL_ETH_TX_RING_IDX_NEXT(tx_ring, next_to_clean);
1187 	}
1188 
1189 	tx_ring->next_to_clean = next_to_clean;
1190 
1191 	device_printf_dbg(tx_ring->dev, "tx_poll: q %d done next to clean %x\n",
1192 	    qid, next_to_clean);
1193 
1194 	/*
1195 	 * need to make the rings circular update visible to
1196 	 * al_eth_start_xmit() before checking for netif_queue_stopped().
1197 	 */
1198 	al_smp_data_memory_barrier();
1199 }
1200 
1201 static void
1202 al_eth_tx_csum(struct al_eth_ring *tx_ring, struct al_eth_tx_buffer *tx_info,
1203     struct al_eth_pkt *hal_pkt, struct mbuf *m)
1204 {
1205 	uint32_t mss = m->m_pkthdr.tso_segsz;
1206 	struct ether_vlan_header *eh;
1207 	uint16_t etype;
1208 	struct ip *ip;
1209 	struct ip6_hdr *ip6;
1210 	struct tcphdr *th = NULL;
1211 	int	ehdrlen, ip_hlen = 0;
1212 	uint8_t	ipproto = 0;
1213 	uint32_t offload = 0;
1214 
1215 	if (mss != 0)
1216 		offload = 1;
1217 
1218 	if ((m->m_pkthdr.csum_flags & CSUM_TSO) != 0)
1219 		offload = 1;
1220 
1221 	if ((m->m_pkthdr.csum_flags & CSUM_OFFLOAD) != 0)
1222 		offload = 1;
1223 
1224 	if (offload != 0) {
1225 		struct al_eth_meta_data *meta = &tx_ring->hal_meta;
1226 
1227 		if (mss != 0)
1228 			hal_pkt->flags |= (AL_ETH_TX_FLAGS_TSO |
1229 			    AL_ETH_TX_FLAGS_L4_CSUM);
1230 		else
1231 			hal_pkt->flags |= (AL_ETH_TX_FLAGS_L4_CSUM |
1232 			    AL_ETH_TX_FLAGS_L4_PARTIAL_CSUM);
1233 
1234 		/*
1235 		 * Determine where frame payload starts.
1236 		 * Jump over vlan headers if already present,
1237 		 * helpful for QinQ too.
1238 		 */
1239 		eh = mtod(m, struct ether_vlan_header *);
1240 		if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
1241 			etype = ntohs(eh->evl_proto);
1242 			ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
1243 		} else {
1244 			etype = ntohs(eh->evl_encap_proto);
1245 			ehdrlen = ETHER_HDR_LEN;
1246 		}
1247 
1248 		switch (etype) {
1249 		case ETHERTYPE_IP:
1250 			ip = (struct ip *)(m->m_data + ehdrlen);
1251 			ip_hlen = ip->ip_hl << 2;
1252 			ipproto = ip->ip_p;
1253 			hal_pkt->l3_proto_idx = AL_ETH_PROTO_ID_IPv4;
1254 			th = (struct tcphdr *)((caddr_t)ip + ip_hlen);
1255 			if (mss != 0)
1256 				hal_pkt->flags |= AL_ETH_TX_FLAGS_IPV4_L3_CSUM;
1257 			if (ipproto == IPPROTO_TCP)
1258 				hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_TCP;
1259 			else
1260 				hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_UDP;
1261 			break;
1262 		case ETHERTYPE_IPV6:
1263 			ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen);
1264 			hal_pkt->l3_proto_idx = AL_ETH_PROTO_ID_IPv6;
1265 			ip_hlen = sizeof(struct ip6_hdr);
1266 			th = (struct tcphdr *)((caddr_t)ip6 + ip_hlen);
1267 			ipproto = ip6->ip6_nxt;
1268 			if (ipproto == IPPROTO_TCP)
1269 				hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_TCP;
1270 			else
1271 				hal_pkt->l4_proto_idx = AL_ETH_PROTO_ID_UDP;
1272 			break;
1273 		default:
1274 			break;
1275 		}
1276 
1277 		meta->words_valid = 4;
1278 		meta->l3_header_len = ip_hlen;
1279 		meta->l3_header_offset = ehdrlen;
1280 		if (th != NULL)
1281 			meta->l4_header_len = th->th_off; /* this param needed only for TSO */
1282 		meta->mss_idx_sel = 0;			/* check how to select MSS */
1283 		meta->mss_val = mss;
1284 		hal_pkt->meta = meta;
1285 	} else
1286 		hal_pkt->meta = NULL;
1287 }
1288 
1289 #define	XMIT_QUEUE_TIMEOUT	100
1290 
1291 static void
1292 al_eth_xmit_mbuf(struct al_eth_ring *tx_ring, struct mbuf *m)
1293 {
1294 	struct al_eth_tx_buffer *tx_info;
1295 	int error;
1296 	int nsegs, a;
1297 	uint16_t next_to_use;
1298 	bus_dma_segment_t segs[AL_ETH_PKT_MAX_BUFS + 1];
1299 	struct al_eth_pkt *hal_pkt;
1300 	struct al_buf *al_buf;
1301 	boolean_t remap;
1302 
1303 	/* Check if queue is ready */
1304 	if (unlikely(tx_ring->stall) != 0) {
1305 		for (a = 0; a < XMIT_QUEUE_TIMEOUT; a++) {
1306 			if (al_udma_available_get(tx_ring->dma_q) >=
1307 			    (AL_ETH_DEFAULT_TX_HW_DESCS -
1308 			    AL_ETH_TX_WAKEUP_THRESH)) {
1309 				tx_ring->stall = 0;
1310 				break;
1311 			}
1312 			pause("stall", 1);
1313 		}
1314 		if (a == XMIT_QUEUE_TIMEOUT) {
1315 			device_printf(tx_ring->dev,
1316 			    "timeout waiting for queue %d ready!\n",
1317 			    tx_ring->ring_id);
1318 			return;
1319 		} else {
1320 			device_printf_dbg(tx_ring->dev,
1321 			    "queue %d is ready!\n", tx_ring->ring_id);
1322 		}
1323 	}
1324 
1325 	next_to_use = tx_ring->next_to_use;
1326 	tx_info = &tx_ring->tx_buffer_info[next_to_use];
1327 	tx_info->m = m;
1328 	hal_pkt = &tx_info->hal_pkt;
1329 
1330 	if (m == NULL) {
1331 		device_printf(tx_ring->dev, "mbuf is NULL\n");
1332 		return;
1333 	}
1334 
1335 	remap = TRUE;
1336 	/* Map packets for DMA */
1337 retry:
1338 	error = bus_dmamap_load_mbuf_sg(tx_ring->dma_buf_tag, tx_info->dma_map,
1339 	    m, segs, &nsegs, BUS_DMA_NOWAIT);
1340 	if (__predict_false(error)) {
1341 		struct mbuf *m_new;
1342 
1343 		if (error == EFBIG) {
1344 			/* Try it again? - one try */
1345 			if (remap == TRUE) {
1346 				remap = FALSE;
1347 				m_new = m_defrag(m, M_NOWAIT);
1348 				if (m_new == NULL) {
1349 					device_printf(tx_ring->dev,
1350 					    "failed to defrag mbuf\n");
1351 					goto exit;
1352 				}
1353 				m = m_new;
1354 				goto retry;
1355 			} else {
1356 				device_printf(tx_ring->dev,
1357 				    "failed to map mbuf, error %d\n", error);
1358 				goto exit;
1359 			}
1360 		} else {
1361 			device_printf(tx_ring->dev,
1362 			    "failed to map mbuf, error %d\n", error);
1363 			goto exit;
1364 		}
1365 	}
1366 
1367 	/* set flags and meta data */
1368 	hal_pkt->flags = AL_ETH_TX_FLAGS_INT;
1369 	al_eth_tx_csum(tx_ring, tx_info, hal_pkt, m);
1370 
1371 	al_buf = hal_pkt->bufs;
1372 	for (a = 0; a < nsegs; a++) {
1373 		al_buf->addr = segs[a].ds_addr;
1374 		al_buf->len = segs[a].ds_len;
1375 
1376 		al_buf++;
1377 	}
1378 
1379 	hal_pkt->num_of_bufs = nsegs;
1380 
1381 	/* prepare the packet's descriptors to dma engine */
1382 	tx_info->tx_descs = al_eth_tx_pkt_prepare(tx_ring->dma_q, hal_pkt);
1383 
1384 	if (tx_info->tx_descs == 0)
1385 		goto exit;
1386 
1387 	/*
1388 	 * stop the queue when no more space available, the packet can have up
1389 	 * to AL_ETH_PKT_MAX_BUFS + 1 buffers and a meta descriptor
1390 	 */
1391 	if (unlikely(al_udma_available_get(tx_ring->dma_q) <
1392 	    (AL_ETH_PKT_MAX_BUFS + 2))) {
1393 		tx_ring->stall = 1;
1394 		device_printf_dbg(tx_ring->dev, "stall, stopping queue %d...\n",
1395 		    tx_ring->ring_id);
1396 		al_data_memory_barrier();
1397 	}
1398 
1399 	tx_ring->next_to_use = AL_ETH_TX_RING_IDX_NEXT(tx_ring, next_to_use);
1400 
1401 	/* trigger the dma engine */
1402 	al_eth_tx_dma_action(tx_ring->dma_q, tx_info->tx_descs);
1403 	return;
1404 
1405 exit:
1406 	m_freem(m);
1407 }
1408 
1409 static void
1410 al_eth_tx_cmpl_work(void *arg, int pending)
1411 {
1412 	struct al_eth_ring *tx_ring = arg;
1413 
1414 	if (napi != 0) {
1415 		tx_ring->cmpl_is_running = 1;
1416 		al_data_memory_barrier();
1417 	}
1418 
1419 	al_eth_tx_do_cleanup(tx_ring);
1420 
1421 	if (napi != 0) {
1422 		tx_ring->cmpl_is_running = 0;
1423 		al_data_memory_barrier();
1424 	}
1425 	/* all work done, enable IRQs */
1426 	al_eth_irq_config(tx_ring->unmask_reg_offset, tx_ring->unmask_val);
1427 }
1428 
1429 static int
1430 al_eth_tx_cmlp_irq_filter(void *arg)
1431 {
1432 	struct al_eth_ring *tx_ring = arg;
1433 
1434 	/* Interrupt should be auto-masked upon arrival */
1435 
1436 	device_printf_dbg(tx_ring->dev, "%s for ring ID = %d\n", __func__,
1437 	    tx_ring->ring_id);
1438 
1439 	/*
1440 	 * For napi, if work is not running, schedule it. Always schedule
1441 	 * for casual (non-napi) packet handling.
1442 	 */
1443 	if ((napi == 0) || (napi && tx_ring->cmpl_is_running == 0))
1444 		taskqueue_enqueue(tx_ring->cmpl_tq, &tx_ring->cmpl_task);
1445 
1446 	/* Do not run bottom half */
1447 	return (FILTER_HANDLED);
1448 }
1449 
1450 static int
1451 al_eth_rx_recv_irq_filter(void *arg)
1452 {
1453 	struct al_eth_ring *rx_ring = arg;
1454 
1455 	/* Interrupt should be auto-masked upon arrival */
1456 
1457 	device_printf_dbg(rx_ring->dev, "%s for ring ID = %d\n", __func__,
1458 	    rx_ring->ring_id);
1459 
1460 	/*
1461 	 * For napi, if work is not running, schedule it. Always schedule
1462 	 * for casual (non-napi) packet handling.
1463 	 */
1464 	if ((napi == 0) || (napi && rx_ring->enqueue_is_running == 0))
1465 		taskqueue_enqueue(rx_ring->enqueue_tq, &rx_ring->enqueue_task);
1466 
1467 	/* Do not run bottom half */
1468 	return (FILTER_HANDLED);
1469 }
1470 
1471 /*
1472  * al_eth_rx_checksum - indicate in mbuf if hw indicated a good cksum
1473  * @adapter: structure containing adapter specific data
1474  * @hal_pkt: HAL structure for the packet
1475  * @mbuf: mbuf currently being received and modified
1476  */
1477 static inline void
1478 al_eth_rx_checksum(struct al_eth_adapter *adapter,
1479     struct al_eth_pkt *hal_pkt, struct mbuf *mbuf)
1480 {
1481 
1482 	/* if IPv4 and error */
1483 	if (unlikely((adapter->netdev->if_capenable & IFCAP_RXCSUM) &&
1484 	    (hal_pkt->l3_proto_idx == AL_ETH_PROTO_ID_IPv4) &&
1485 	    (hal_pkt->flags & AL_ETH_RX_FLAGS_L3_CSUM_ERR))) {
1486 		device_printf(adapter->dev,"rx ipv4 header checksum error\n");
1487 		return;
1488 	}
1489 
1490 	/* if IPv6 and error */
1491 	if (unlikely((adapter->netdev->if_capenable & IFCAP_RXCSUM_IPV6) &&
1492 	    (hal_pkt->l3_proto_idx == AL_ETH_PROTO_ID_IPv6) &&
1493 	    (hal_pkt->flags & AL_ETH_RX_FLAGS_L3_CSUM_ERR))) {
1494 		device_printf(adapter->dev,"rx ipv6 header checksum error\n");
1495 		return;
1496 	}
1497 
1498 	/* if TCP/UDP */
1499 	if (likely((hal_pkt->l4_proto_idx == AL_ETH_PROTO_ID_TCP) ||
1500 	   (hal_pkt->l4_proto_idx == AL_ETH_PROTO_ID_UDP))) {
1501 		if (unlikely(hal_pkt->flags & AL_ETH_RX_FLAGS_L4_CSUM_ERR)) {
1502 			device_printf_dbg(adapter->dev, "rx L4 checksum error\n");
1503 
1504 			/* TCP/UDP checksum error */
1505 			mbuf->m_pkthdr.csum_flags = 0;
1506 		} else {
1507 			device_printf_dbg(adapter->dev, "rx checksum correct\n");
1508 
1509 			/* IP Checksum Good */
1510 			mbuf->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
1511 			mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID;
1512 		}
1513 	}
1514 }
1515 
1516 static struct mbuf*
1517 al_eth_rx_mbuf(struct al_eth_adapter *adapter,
1518     struct al_eth_ring *rx_ring, struct al_eth_pkt *hal_pkt,
1519     unsigned int descs, uint16_t *next_to_clean)
1520 {
1521 	struct mbuf *mbuf;
1522 	struct al_eth_rx_buffer *rx_info =
1523 	    &rx_ring->rx_buffer_info[*next_to_clean];
1524 	unsigned int len;
1525 
1526 	len = hal_pkt->bufs[0].len;
1527 	device_printf_dbg(adapter->dev, "rx_info %p data %p\n", rx_info,
1528 	   rx_info->m);
1529 
1530 	if (rx_info->m == NULL) {
1531 		*next_to_clean = AL_ETH_RX_RING_IDX_NEXT(rx_ring,
1532 		    *next_to_clean);
1533 		return (NULL);
1534 	}
1535 
1536 	mbuf = rx_info->m;
1537 	mbuf->m_pkthdr.len = len;
1538 	mbuf->m_len = len;
1539 	mbuf->m_pkthdr.rcvif = rx_ring->netdev;
1540 	mbuf->m_flags |= M_PKTHDR;
1541 
1542 	if (len <= adapter->small_copy_len) {
1543 		struct mbuf *smbuf;
1544 		device_printf_dbg(adapter->dev, "rx small packet. len %d\n", len);
1545 
1546 		AL_RX_LOCK(adapter);
1547 		smbuf = m_gethdr(M_NOWAIT, MT_DATA);
1548 		AL_RX_UNLOCK(adapter);
1549 		if (__predict_false(smbuf == NULL)) {
1550 			device_printf(adapter->dev, "smbuf is NULL\n");
1551 			return (NULL);
1552 		}
1553 
1554 		smbuf->m_data = smbuf->m_data + AL_IP_ALIGNMENT_OFFSET;
1555 		memcpy(smbuf->m_data, mbuf->m_data + AL_IP_ALIGNMENT_OFFSET, len);
1556 
1557 		smbuf->m_len = len;
1558 		smbuf->m_pkthdr.rcvif = rx_ring->netdev;
1559 
1560 		/* first desc of a non-ps chain */
1561 		smbuf->m_flags |= M_PKTHDR;
1562 		smbuf->m_pkthdr.len = smbuf->m_len;
1563 
1564 		*next_to_clean = AL_ETH_RX_RING_IDX_NEXT(rx_ring,
1565 		    *next_to_clean);
1566 
1567 		return (smbuf);
1568 	}
1569 	mbuf->m_data = mbuf->m_data + AL_IP_ALIGNMENT_OFFSET;
1570 
1571 	/* Unmap the buffer */
1572 	bus_dmamap_unload(rx_ring->dma_buf_tag, rx_info->dma_map);
1573 
1574 	rx_info->m = NULL;
1575 	*next_to_clean = AL_ETH_RX_RING_IDX_NEXT(rx_ring, *next_to_clean);
1576 
1577 	return (mbuf);
1578 }
1579 
1580 static void
1581 al_eth_rx_recv_work(void *arg, int pending)
1582 {
1583 	struct al_eth_ring *rx_ring = arg;
1584 	struct mbuf *mbuf;
1585 	struct lro_entry *queued;
1586 	unsigned int qid = rx_ring->ring_id;
1587 	struct al_eth_pkt *hal_pkt = &rx_ring->hal_pkt;
1588 	uint16_t next_to_clean = rx_ring->next_to_clean;
1589 	uint32_t refill_required;
1590 	uint32_t refill_actual;
1591 	uint32_t do_if_input;
1592 
1593 	if (napi != 0) {
1594 		rx_ring->enqueue_is_running = 1;
1595 		al_data_memory_barrier();
1596 	}
1597 
1598 	do {
1599 		unsigned int descs;
1600 
1601 		descs = al_eth_pkt_rx(rx_ring->dma_q, hal_pkt);
1602 		if (unlikely(descs == 0))
1603 			break;
1604 
1605 		device_printf_dbg(rx_ring->dev, "rx_poll: q %d got packet "
1606 		    "from hal. descs %d\n", qid, descs);
1607 		device_printf_dbg(rx_ring->dev, "rx_poll: q %d flags %x. "
1608 		    "l3 proto %d l4 proto %d\n", qid, hal_pkt->flags,
1609 		    hal_pkt->l3_proto_idx, hal_pkt->l4_proto_idx);
1610 
1611 		/* ignore if detected dma or eth controller errors */
1612 		if ((hal_pkt->flags & (AL_ETH_RX_ERROR |
1613 		    AL_UDMA_CDESC_ERROR)) != 0) {
1614 			device_printf(rx_ring->dev, "receive packet with error. "
1615 			    "flags = 0x%x\n", hal_pkt->flags);
1616 			next_to_clean = AL_ETH_RX_RING_IDX_ADD(rx_ring,
1617 			    next_to_clean, descs);
1618 			continue;
1619 		}
1620 
1621 		/* allocate mbuf and fill it */
1622 		mbuf = al_eth_rx_mbuf(rx_ring->adapter, rx_ring, hal_pkt, descs,
1623 		    &next_to_clean);
1624 
1625 		/* exit if we failed to retrieve a buffer */
1626 		if (unlikely(mbuf == NULL)) {
1627 			next_to_clean = AL_ETH_RX_RING_IDX_ADD(rx_ring,
1628 			    next_to_clean, descs);
1629 			break;
1630 		}
1631 
1632 		if (__predict_true(rx_ring->netdev->if_capenable & IFCAP_RXCSUM ||
1633 		    rx_ring->netdev->if_capenable & IFCAP_RXCSUM_IPV6)) {
1634 			al_eth_rx_checksum(rx_ring->adapter, hal_pkt, mbuf);
1635 		}
1636 
1637 #if __FreeBSD_version >= 800000
1638 		mbuf->m_pkthdr.flowid = qid;
1639 		M_HASHTYPE_SET(mbuf, M_HASHTYPE_OPAQUE);
1640 #endif
1641 
1642 		/*
1643 		 * LRO is only for IP/TCP packets and TCP checksum of the packet
1644 		 * should be computed by hardware.
1645 		 */
1646 		do_if_input = 1;
1647 		if ((rx_ring->lro_enabled != 0) &&
1648 		    ((mbuf->m_pkthdr.csum_flags & CSUM_IP_VALID) != 0) &&
1649 		    hal_pkt->l4_proto_idx == AL_ETH_PROTO_ID_TCP) {
1650 			/*
1651 			 * Send to the stack if:
1652 			 *  - LRO not enabled, or
1653 			 *  - no LRO resources, or
1654 			 *  - lro enqueue fails
1655 			 */
1656 			if (rx_ring->lro.lro_cnt != 0) {
1657 				if (tcp_lro_rx(&rx_ring->lro, mbuf, 0) == 0)
1658 					do_if_input = 0;
1659 			}
1660 		}
1661 
1662 		if (do_if_input)
1663 			(*rx_ring->netdev->if_input)(rx_ring->netdev, mbuf);
1664 
1665 	} while (1);
1666 
1667 	rx_ring->next_to_clean = next_to_clean;
1668 
1669 	refill_required = al_udma_available_get(rx_ring->dma_q);
1670 	refill_actual = al_eth_refill_rx_bufs(rx_ring->adapter, qid,
1671 	    refill_required);
1672 
1673 	if (unlikely(refill_actual < refill_required)) {
1674 		device_printf_dbg(rx_ring->dev,
1675 		    "%s: not filling rx queue %d\n", __func__, qid);
1676 	}
1677 
1678 	while (((queued = LIST_FIRST(&rx_ring->lro.lro_active)) != NULL)) {
1679 		LIST_REMOVE(queued, next);
1680 		tcp_lro_flush(&rx_ring->lro, queued);
1681 	}
1682 
1683 	if (napi != 0) {
1684 		rx_ring->enqueue_is_running = 0;
1685 		al_data_memory_barrier();
1686 	}
1687 	/* unmask irq */
1688 	al_eth_irq_config(rx_ring->unmask_reg_offset, rx_ring->unmask_val);
1689 }
1690 
1691 static void
1692 al_eth_start_xmit(void *arg, int pending)
1693 {
1694 	struct al_eth_ring *tx_ring = arg;
1695 	struct mbuf *mbuf;
1696 
1697 	if (napi != 0) {
1698 		tx_ring->enqueue_is_running = 1;
1699 		al_data_memory_barrier();
1700 	}
1701 
1702 	while (1) {
1703 		mtx_lock(&tx_ring->br_mtx);
1704 		mbuf = drbr_dequeue(NULL, tx_ring->br);
1705 		mtx_unlock(&tx_ring->br_mtx);
1706 
1707 		if (mbuf == NULL)
1708 			break;
1709 
1710 		al_eth_xmit_mbuf(tx_ring, mbuf);
1711 	}
1712 
1713 	if (napi != 0) {
1714 		tx_ring->enqueue_is_running = 0;
1715 		al_data_memory_barrier();
1716 		while (1) {
1717 			mtx_lock(&tx_ring->br_mtx);
1718 			mbuf = drbr_dequeue(NULL, tx_ring->br);
1719 			mtx_unlock(&tx_ring->br_mtx);
1720 			if (mbuf == NULL)
1721 				break;
1722 			al_eth_xmit_mbuf(tx_ring, mbuf);
1723 		}
1724 	}
1725 }
1726 
1727 static int
1728 al_mq_start(struct ifnet *ifp, struct mbuf *m)
1729 {
1730 	struct al_eth_adapter *adapter = ifp->if_softc;
1731 	struct al_eth_ring *tx_ring;
1732 	int i;
1733 	int ret;
1734 
1735 	/* Which queue to use */
1736 	if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
1737 		i = m->m_pkthdr.flowid % adapter->num_tx_queues;
1738 	else
1739 		i = curcpu % adapter->num_tx_queues;
1740 
1741 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) !=
1742 	    IFF_DRV_RUNNING) {
1743 		return (EFAULT);
1744 	}
1745 
1746 	tx_ring = &adapter->tx_ring[i];
1747 
1748 	device_printf_dbg(adapter->dev, "dgb start() - assuming link is active, "
1749 	    "sending packet to queue %d\n", i);
1750 
1751 	ret = drbr_enqueue(ifp, tx_ring->br, m);
1752 
1753 	/*
1754 	 * For napi, if work is not running, schedule it. Always schedule
1755 	 * for casual (non-napi) packet handling.
1756 	 */
1757 	if ((napi == 0) || ((napi != 0) && (tx_ring->enqueue_is_running == 0)))
1758 		taskqueue_enqueue(tx_ring->enqueue_tq, &tx_ring->enqueue_task);
1759 
1760 	return (ret);
1761 }
1762 
1763 static void
1764 al_qflush(struct ifnet * ifp)
1765 {
1766 
1767 	/* unused */
1768 }
1769 
1770 static inline void
1771 al_eth_flow_ctrl_init(struct al_eth_adapter *adapter)
1772 {
1773 	uint8_t default_flow_ctrl;
1774 
1775 	default_flow_ctrl = AL_ETH_FLOW_CTRL_TX_PAUSE;
1776 	default_flow_ctrl |= AL_ETH_FLOW_CTRL_RX_PAUSE;
1777 
1778 	adapter->link_config.flow_ctrl_supported = default_flow_ctrl;
1779 }
1780 
1781 static int
1782 al_eth_flow_ctrl_config(struct al_eth_adapter *adapter)
1783 {
1784 	struct al_eth_flow_control_params *flow_ctrl_params;
1785 	uint8_t active = adapter->link_config.flow_ctrl_active;
1786 	int i;
1787 
1788 	flow_ctrl_params = &adapter->flow_ctrl_params;
1789 
1790 	flow_ctrl_params->type = AL_ETH_FLOW_CONTROL_TYPE_LINK_PAUSE;
1791 	flow_ctrl_params->obay_enable =
1792 	    ((active & AL_ETH_FLOW_CTRL_RX_PAUSE) != 0);
1793 	flow_ctrl_params->gen_enable =
1794 	    ((active & AL_ETH_FLOW_CTRL_TX_PAUSE) != 0);
1795 
1796 	flow_ctrl_params->rx_fifo_th_high = AL_ETH_FLOW_CTRL_RX_FIFO_TH_HIGH;
1797 	flow_ctrl_params->rx_fifo_th_low = AL_ETH_FLOW_CTRL_RX_FIFO_TH_LOW;
1798 	flow_ctrl_params->quanta = AL_ETH_FLOW_CTRL_QUANTA;
1799 	flow_ctrl_params->quanta_th = AL_ETH_FLOW_CTRL_QUANTA_TH;
1800 
1801 	/* map priority to queue index, queue id = priority/2 */
1802 	for (i = 0; i < AL_ETH_FWD_PRIO_TABLE_NUM; i++)
1803 		flow_ctrl_params->prio_q_map[0][i] =  1 << (i >> 1);
1804 
1805 	al_eth_flow_control_config(&adapter->hal_adapter, flow_ctrl_params);
1806 
1807 	return (0);
1808 }
1809 
1810 static void
1811 al_eth_flow_ctrl_enable(struct al_eth_adapter *adapter)
1812 {
1813 
1814 	/*
1815 	 * change the active configuration to the default / force by ethtool
1816 	 * and call to configure
1817 	 */
1818 	adapter->link_config.flow_ctrl_active =
1819 	    adapter->link_config.flow_ctrl_supported;
1820 
1821 	al_eth_flow_ctrl_config(adapter);
1822 }
1823 
1824 static void
1825 al_eth_flow_ctrl_disable(struct al_eth_adapter *adapter)
1826 {
1827 
1828 	adapter->link_config.flow_ctrl_active = 0;
1829 	al_eth_flow_ctrl_config(adapter);
1830 }
1831 
1832 static int
1833 al_eth_hw_init(struct al_eth_adapter *adapter)
1834 {
1835 	int rc;
1836 
1837 	rc = al_eth_hw_init_adapter(adapter);
1838 	if (rc != 0)
1839 		return (rc);
1840 
1841 	rc = al_eth_mac_config(&adapter->hal_adapter, adapter->mac_mode);
1842 	if (rc < 0) {
1843 		device_printf(adapter->dev, "%s failed to configure mac!\n",
1844 		    __func__);
1845 		return (rc);
1846 	}
1847 
1848 	if ((adapter->mac_mode == AL_ETH_MAC_MODE_SGMII) ||
1849 	    (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII &&
1850 	     adapter->phy_exist == FALSE)) {
1851 		rc = al_eth_mac_link_config(&adapter->hal_adapter,
1852 		    adapter->link_config.force_1000_base_x,
1853 		    adapter->link_config.autoneg,
1854 		    adapter->link_config.active_speed,
1855 		    adapter->link_config.active_duplex);
1856 		if (rc != 0) {
1857 			device_printf(adapter->dev,
1858 			    "%s failed to configure link parameters!\n",
1859 			    __func__);
1860 			return (rc);
1861 		}
1862 	}
1863 
1864 	rc = al_eth_mdio_config(&adapter->hal_adapter,
1865 	    AL_ETH_MDIO_TYPE_CLAUSE_22, TRUE /* shared_mdio_if */,
1866 	    adapter->ref_clk_freq, adapter->mdio_freq);
1867 	if (rc != 0) {
1868 		device_printf(adapter->dev, "%s failed at mdio config!\n",
1869 		    __func__);
1870 		return (rc);
1871 	}
1872 
1873 	al_eth_flow_ctrl_init(adapter);
1874 
1875 	return (rc);
1876 }
1877 
1878 static int
1879 al_eth_hw_stop(struct al_eth_adapter *adapter)
1880 {
1881 
1882 	al_eth_mac_stop(&adapter->hal_adapter);
1883 
1884 	/*
1885 	 * wait till pending rx packets written and UDMA becomes idle,
1886 	 * the MAC has ~10KB fifo, 10us should be enought time for the
1887 	 * UDMA to write to the memory
1888 	 */
1889 	DELAY(10);
1890 
1891 	al_eth_adapter_stop(&adapter->hal_adapter);
1892 
1893 	adapter->flags |= AL_ETH_FLAG_RESET_REQUESTED;
1894 
1895 	/* disable flow ctrl to avoid pause packets*/
1896 	al_eth_flow_ctrl_disable(adapter);
1897 
1898 	return (0);
1899 }
1900 
1901 /*
1902  * al_eth_intr_intx_all - Legacy Interrupt Handler for all interrupts
1903  * @irq: interrupt number
1904  * @data: pointer to a network interface device structure
1905  */
1906 static int
1907 al_eth_intr_intx_all(void *data)
1908 {
1909 	struct al_eth_adapter *adapter = data;
1910 
1911 	struct unit_regs __iomem *regs_base =
1912 	    (struct unit_regs __iomem *)adapter->udma_base;
1913 	uint32_t reg;
1914 
1915 	reg = al_udma_iofic_read_cause(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
1916 	    AL_INT_GROUP_A);
1917 	if (likely(reg))
1918 		device_printf_dbg(adapter->dev, "%s group A cause %x\n",
1919 		    __func__, reg);
1920 
1921 	if (unlikely(reg & AL_INT_GROUP_A_GROUP_D_SUM)) {
1922 		struct al_iofic_grp_ctrl __iomem *sec_ints_base;
1923 		uint32_t cause_d =  al_udma_iofic_read_cause(regs_base,
1924 		    AL_UDMA_IOFIC_LEVEL_PRIMARY, AL_INT_GROUP_D);
1925 
1926 		sec_ints_base =
1927 		    &regs_base->gen.interrupt_regs.secondary_iofic_ctrl[0];
1928 		if (cause_d != 0) {
1929 			device_printf_dbg(adapter->dev,
1930 			    "got interrupt from group D. cause %x\n", cause_d);
1931 
1932 			cause_d = al_iofic_read_cause(sec_ints_base,
1933 			    AL_INT_GROUP_A);
1934 			device_printf(adapter->dev,
1935 			    "secondary A cause %x\n", cause_d);
1936 
1937 			cause_d = al_iofic_read_cause(sec_ints_base,
1938 			    AL_INT_GROUP_B);
1939 
1940 			device_printf_dbg(adapter->dev,
1941 			    "secondary B cause %x\n", cause_d);
1942 		}
1943 	}
1944 	if ((reg & AL_INT_GROUP_A_GROUP_B_SUM) != 0 ) {
1945 		uint32_t cause_b = al_udma_iofic_read_cause(regs_base,
1946 		    AL_UDMA_IOFIC_LEVEL_PRIMARY, AL_INT_GROUP_B);
1947 		int qid;
1948 		device_printf_dbg(adapter->dev, "secondary B cause %x\n",
1949 		    cause_b);
1950 		for (qid = 0; qid < adapter->num_rx_queues; qid++) {
1951 			if (cause_b & (1 << qid)) {
1952 				/* mask */
1953 				al_udma_iofic_mask(
1954 				    (struct unit_regs __iomem *)adapter->udma_base,
1955 				    AL_UDMA_IOFIC_LEVEL_PRIMARY,
1956 				    AL_INT_GROUP_B, 1 << qid);
1957 			}
1958 		}
1959 	}
1960 	if ((reg & AL_INT_GROUP_A_GROUP_C_SUM) != 0) {
1961 		uint32_t cause_c = al_udma_iofic_read_cause(regs_base,
1962 		    AL_UDMA_IOFIC_LEVEL_PRIMARY, AL_INT_GROUP_C);
1963 		int qid;
1964 		device_printf_dbg(adapter->dev, "secondary C cause %x\n", cause_c);
1965 		for (qid = 0; qid < adapter->num_tx_queues; qid++) {
1966 			if ((cause_c & (1 << qid)) != 0) {
1967 				al_udma_iofic_mask(
1968 				    (struct unit_regs __iomem *)adapter->udma_base,
1969 				    AL_UDMA_IOFIC_LEVEL_PRIMARY,
1970 				    AL_INT_GROUP_C, 1 << qid);
1971 			}
1972 		}
1973 	}
1974 
1975 	al_eth_tx_cmlp_irq_filter(adapter->tx_ring);
1976 
1977 	return (0);
1978 }
1979 
1980 static int
1981 al_eth_intr_msix_all(void *data)
1982 {
1983 	struct al_eth_adapter *adapter = data;
1984 
1985 	device_printf_dbg(adapter->dev, "%s\n", __func__);
1986 	return (0);
1987 }
1988 
1989 static int
1990 al_eth_intr_msix_mgmt(void *data)
1991 {
1992 	struct al_eth_adapter *adapter = data;
1993 
1994 	device_printf_dbg(adapter->dev, "%s\n", __func__);
1995 	return (0);
1996 }
1997 
1998 static int
1999 al_eth_enable_msix(struct al_eth_adapter *adapter)
2000 {
2001 	int i, msix_vecs, rc, count;
2002 
2003 	device_printf_dbg(adapter->dev, "%s\n", __func__);
2004 	msix_vecs = 1 + adapter->num_rx_queues + adapter->num_tx_queues;
2005 
2006 	device_printf_dbg(adapter->dev,
2007 	    "Try to enable MSIX, vector numbers = %d\n", msix_vecs);
2008 
2009 	adapter->msix_entries = malloc(msix_vecs*sizeof(*adapter->msix_entries),
2010 	    M_IFAL, M_ZERO | M_WAITOK);
2011 
2012 	if (adapter->msix_entries == NULL) {
2013 		device_printf_dbg(adapter->dev, "failed to allocate"
2014 		    " msix_entries %d\n", msix_vecs);
2015 		rc = ENOMEM;
2016 		goto exit;
2017 	}
2018 
2019 	/* management vector (GROUP_A) @2*/
2020 	adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].entry = 2;
2021 	adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector = 0;
2022 
2023 	/* rx queues start @3 */
2024 	for (i = 0; i < adapter->num_rx_queues; i++) {
2025 		int irq_idx = AL_ETH_RXQ_IRQ_IDX(adapter, i);
2026 
2027 		adapter->msix_entries[irq_idx].entry = 3 + i;
2028 		adapter->msix_entries[irq_idx].vector = 0;
2029 	}
2030 	/* tx queues start @7 */
2031 	for (i = 0; i < adapter->num_tx_queues; i++) {
2032 		int irq_idx = AL_ETH_TXQ_IRQ_IDX(adapter, i);
2033 
2034 		adapter->msix_entries[irq_idx].entry = 3 +
2035 		    AL_ETH_MAX_HW_QUEUES + i;
2036 		adapter->msix_entries[irq_idx].vector = 0;
2037 	}
2038 
2039 	count = msix_vecs + 2; /* entries start from 2 */
2040 	rc = pci_alloc_msix(adapter->dev, &count);
2041 
2042 	if (rc != 0) {
2043 		device_printf_dbg(adapter->dev, "failed to allocate MSIX "
2044 		    "vectors %d\n", msix_vecs+2);
2045 		device_printf_dbg(adapter->dev, "ret = %d\n", rc);
2046 		goto msix_entries_exit;
2047 	}
2048 
2049 	if (count != msix_vecs + 2) {
2050 		device_printf_dbg(adapter->dev, "failed to allocate all MSIX "
2051 		    "vectors %d, allocated %d\n", msix_vecs+2, count);
2052 		rc = ENOSPC;
2053 		goto msix_entries_exit;
2054 	}
2055 
2056 	for (i = 0; i < msix_vecs; i++)
2057 	    adapter->msix_entries[i].vector = 2 + 1 + i;
2058 
2059 	device_printf_dbg(adapter->dev, "successfully enabled MSIX,"
2060 	    " vectors %d\n", msix_vecs);
2061 
2062 	adapter->msix_vecs = msix_vecs;
2063 	adapter->flags |= AL_ETH_FLAG_MSIX_ENABLED;
2064 	goto exit;
2065 
2066 msix_entries_exit:
2067 	adapter->msix_vecs = 0;
2068 	free(adapter->msix_entries, M_IFAL);
2069 	adapter->msix_entries = NULL;
2070 
2071 exit:
2072 	return (rc);
2073 }
2074 
2075 static int
2076 al_eth_setup_int_mode(struct al_eth_adapter *adapter)
2077 {
2078 	int i, rc;
2079 
2080 	rc = al_eth_enable_msix(adapter);
2081 	if (rc != 0) {
2082 		device_printf(adapter->dev, "Failed to enable MSIX mode.\n");
2083 		return (rc);
2084 	}
2085 
2086 	adapter->irq_vecs = max(1, adapter->msix_vecs);
2087 	/* single INTX mode */
2088 	if (adapter->msix_vecs == 0) {
2089 		snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name,
2090 		    AL_ETH_IRQNAME_SIZE, "al-eth-intx-all@pci:%s",
2091 		    device_get_name(adapter->dev));
2092 		adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler =
2093 		    al_eth_intr_intx_all;
2094 		/* IRQ vector will be resolved from device resources */
2095 		adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector = 0;
2096 		adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter;
2097 
2098 		device_printf(adapter->dev, "%s and vector %d \n", __func__,
2099 		    adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector);
2100 
2101 		return (0);
2102 	}
2103 	/* single MSI-X mode */
2104 	if (adapter->msix_vecs == 1) {
2105 		snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name,
2106 		    AL_ETH_IRQNAME_SIZE, "al-eth-msix-all@pci:%s",
2107 		    device_get_name(adapter->dev));
2108 		adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler =
2109 		    al_eth_intr_msix_all;
2110 		adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector =
2111 		    adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector;
2112 		adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter;
2113 
2114 		return (0);
2115 	}
2116 	/* MSI-X per queue */
2117 	snprintf(adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].name, AL_ETH_IRQNAME_SIZE,
2118 	    "al-eth-msix-mgmt@pci:%s", device_get_name(adapter->dev));
2119 	adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].handler = al_eth_intr_msix_mgmt;
2120 
2121 	adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].data = adapter;
2122 	adapter->irq_tbl[AL_ETH_MGMT_IRQ_IDX].vector =
2123 	    adapter->msix_entries[AL_ETH_MGMT_IRQ_IDX].vector;
2124 
2125 	for (i = 0; i < adapter->num_rx_queues; i++) {
2126 		int irq_idx = AL_ETH_RXQ_IRQ_IDX(adapter, i);
2127 
2128 		snprintf(adapter->irq_tbl[irq_idx].name, AL_ETH_IRQNAME_SIZE,
2129 		    "al-eth-rx-comp-%d@pci:%s", i,
2130 		    device_get_name(adapter->dev));
2131 		adapter->irq_tbl[irq_idx].handler = al_eth_rx_recv_irq_filter;
2132 		adapter->irq_tbl[irq_idx].data = &adapter->rx_ring[i];
2133 		adapter->irq_tbl[irq_idx].vector =
2134 		    adapter->msix_entries[irq_idx].vector;
2135 	}
2136 
2137 	for (i = 0; i < adapter->num_tx_queues; i++) {
2138 		int irq_idx = AL_ETH_TXQ_IRQ_IDX(adapter, i);
2139 
2140 		snprintf(adapter->irq_tbl[irq_idx].name,
2141 		    AL_ETH_IRQNAME_SIZE, "al-eth-tx-comp-%d@pci:%s", i,
2142 		    device_get_name(adapter->dev));
2143 		adapter->irq_tbl[irq_idx].handler = al_eth_tx_cmlp_irq_filter;
2144 		adapter->irq_tbl[irq_idx].data = &adapter->tx_ring[i];
2145 		adapter->irq_tbl[irq_idx].vector =
2146 		    adapter->msix_entries[irq_idx].vector;
2147 	}
2148 
2149 	return (0);
2150 }
2151 
2152 static void
2153 __al_eth_free_irq(struct al_eth_adapter *adapter)
2154 {
2155 	struct al_eth_irq *irq;
2156 	int i, rc;
2157 
2158 	for (i = 0; i < adapter->irq_vecs; i++) {
2159 		irq = &adapter->irq_tbl[i];
2160 		if (irq->requested != 0) {
2161 			device_printf_dbg(adapter->dev, "tear down irq: %d\n",
2162 			    irq->vector);
2163 			rc = bus_teardown_intr(adapter->dev, irq->res,
2164 			    irq->cookie);
2165 			if (rc != 0)
2166 				device_printf(adapter->dev, "failed to tear "
2167 				    "down irq: %d\n", irq->vector);
2168 
2169 		}
2170 		irq->requested = 0;
2171 	}
2172 }
2173 
2174 static void
2175 al_eth_free_irq(struct al_eth_adapter *adapter)
2176 {
2177 	struct al_eth_irq *irq;
2178 	int i, rc;
2179 #ifdef CONFIG_RFS_ACCEL
2180 	if (adapter->msix_vecs >= 1) {
2181 		free_irq_cpu_rmap(adapter->netdev->rx_cpu_rmap);
2182 		adapter->netdev->rx_cpu_rmap = NULL;
2183 	}
2184 #endif
2185 
2186 	__al_eth_free_irq(adapter);
2187 
2188 	for (i = 0; i < adapter->irq_vecs; i++) {
2189 		irq = &adapter->irq_tbl[i];
2190 		if (irq->res == NULL)
2191 			continue;
2192 		device_printf_dbg(adapter->dev, "release resource irq: %d\n",
2193 		    irq->vector);
2194 		rc = bus_release_resource(adapter->dev, SYS_RES_IRQ, irq->vector,
2195 		    irq->res);
2196 		irq->res = NULL;
2197 		if (rc != 0)
2198 			device_printf(adapter->dev, "dev has no parent while "
2199 			    "releasing res for irq: %d\n", irq->vector);
2200 	}
2201 
2202 	pci_release_msi(adapter->dev);
2203 
2204 	adapter->flags &= ~AL_ETH_FLAG_MSIX_ENABLED;
2205 
2206 	adapter->msix_vecs = 0;
2207 	free(adapter->msix_entries, M_IFAL);
2208 	adapter->msix_entries = NULL;
2209 }
2210 
2211 static int
2212 al_eth_request_irq(struct al_eth_adapter *adapter)
2213 {
2214 	unsigned long flags;
2215 	struct al_eth_irq *irq;
2216 	int rc = 0, i, v;
2217 
2218 	if ((adapter->flags & AL_ETH_FLAG_MSIX_ENABLED) != 0)
2219 		flags = RF_ACTIVE;
2220 	else
2221 		flags = RF_ACTIVE | RF_SHAREABLE;
2222 
2223 	for (i = 0; i < adapter->irq_vecs; i++) {
2224 		irq = &adapter->irq_tbl[i];
2225 
2226 		if (irq->requested != 0)
2227 			continue;
2228 
2229 		irq->res = bus_alloc_resource_any(adapter->dev, SYS_RES_IRQ,
2230 		    &irq->vector, flags);
2231 		if (irq->res == NULL) {
2232 			device_printf(adapter->dev, "could not allocate "
2233 			    "irq vector=%d\n", irq->vector);
2234 			rc = ENXIO;
2235 			goto exit_res;
2236 		}
2237 
2238 		if ((rc = bus_setup_intr(adapter->dev, irq->res,
2239 		    INTR_TYPE_NET | INTR_MPSAFE, irq->handler,
2240 		    NULL, irq->data, &irq->cookie)) != 0) {
2241 			device_printf(adapter->dev, "failed to register "
2242 			    "interrupt handler for irq %ju: %d\n",
2243 			    (uintmax_t)rman_get_start(irq->res), rc);
2244 			goto exit_intr;
2245 		}
2246 		irq->requested = 1;
2247 	}
2248 	goto exit;
2249 
2250 exit_intr:
2251 	v = i - 1; /* -1 because we omit the operation that failed */
2252 	while (v-- >= 0) {
2253 		int bti;
2254 		irq = &adapter->irq_tbl[v];
2255 		bti = bus_teardown_intr(adapter->dev, irq->res, irq->cookie);
2256 		if (bti != 0) {
2257 			device_printf(adapter->dev, "failed to tear "
2258 			    "down irq: %d\n", irq->vector);
2259 		}
2260 
2261 		irq->requested = 0;
2262 		device_printf_dbg(adapter->dev, "exit_intr: releasing irq %d\n",
2263 		    irq->vector);
2264 	}
2265 
2266 exit_res:
2267 	v = i - 1; /* -1 because we omit the operation that failed */
2268 	while (v-- >= 0) {
2269 		int brr;
2270 		irq = &adapter->irq_tbl[v];
2271 		device_printf_dbg(adapter->dev, "exit_res: releasing resource"
2272 		    " for irq %d\n", irq->vector);
2273 		brr = bus_release_resource(adapter->dev, SYS_RES_IRQ,
2274 		    irq->vector, irq->res);
2275 		if (brr != 0)
2276 			device_printf(adapter->dev, "dev has no parent while "
2277 			    "releasing res for irq: %d\n", irq->vector);
2278 		irq->res = NULL;
2279 	}
2280 
2281 exit:
2282 	return (rc);
2283 }
2284 
2285 /**
2286  * al_eth_setup_tx_resources - allocate Tx resources (Descriptors)
2287  * @adapter: network interface device structure
2288  * @qid: queue index
2289  *
2290  * Return 0 on success, negative on failure
2291  **/
2292 static int
2293 al_eth_setup_tx_resources(struct al_eth_adapter *adapter, int qid)
2294 {
2295 	struct al_eth_ring *tx_ring = &adapter->tx_ring[qid];
2296 	struct device *dev = tx_ring->dev;
2297 	struct al_udma_q_params *q_params = &tx_ring->q_params;
2298 	int size;
2299 	int ret;
2300 
2301 	if (adapter->up)
2302 		return (0);
2303 
2304 	size = sizeof(struct al_eth_tx_buffer) * tx_ring->sw_count;
2305 
2306 	tx_ring->tx_buffer_info = malloc(size, M_IFAL, M_ZERO | M_WAITOK);
2307 	if (tx_ring->tx_buffer_info == NULL)
2308 		return (ENOMEM);
2309 
2310 	tx_ring->descs_size = tx_ring->hw_count * sizeof(union al_udma_desc);
2311 	q_params->size = tx_ring->hw_count;
2312 
2313 	ret = al_dma_alloc_coherent(dev, &q_params->desc_phy_base_tag,
2314 	    (bus_dmamap_t *)&q_params->desc_phy_base_map,
2315 	    (bus_addr_t *)&q_params->desc_phy_base,
2316 	    (void**)&q_params->desc_base, tx_ring->descs_size);
2317 	if (ret != 0) {
2318 		device_printf(dev, "failed to al_dma_alloc_coherent,"
2319 		    " ret = %d\n", ret);
2320 		return (ENOMEM);
2321 	}
2322 
2323 	if (q_params->desc_base == NULL)
2324 		return (ENOMEM);
2325 
2326 	device_printf_dbg(dev, "Initializing ring queues %d\n", qid);
2327 
2328 	/* Allocate Ring Queue */
2329 	mtx_init(&tx_ring->br_mtx, "AlRingMtx", NULL, MTX_DEF);
2330 	tx_ring->br = buf_ring_alloc(AL_BR_SIZE, M_DEVBUF, M_WAITOK,
2331 	    &tx_ring->br_mtx);
2332 	if (tx_ring->br == NULL) {
2333 		device_printf(dev, "Critical Failure setting up buf ring\n");
2334 		return (ENOMEM);
2335 	}
2336 
2337 	/* Allocate taskqueues */
2338 	TASK_INIT(&tx_ring->enqueue_task, 0, al_eth_start_xmit, tx_ring);
2339 	tx_ring->enqueue_tq = taskqueue_create_fast("al_tx_enque", M_NOWAIT,
2340 	    taskqueue_thread_enqueue, &tx_ring->enqueue_tq);
2341 	taskqueue_start_threads(&tx_ring->enqueue_tq, 1, PI_NET, "%s txeq",
2342 	    device_get_nameunit(adapter->dev));
2343 	TASK_INIT(&tx_ring->cmpl_task, 0, al_eth_tx_cmpl_work, tx_ring);
2344 	tx_ring->cmpl_tq = taskqueue_create_fast("al_tx_cmpl", M_NOWAIT,
2345 	    taskqueue_thread_enqueue, &tx_ring->cmpl_tq);
2346 	taskqueue_start_threads(&tx_ring->cmpl_tq, 1, PI_REALTIME, "%s txcq",
2347 	    device_get_nameunit(adapter->dev));
2348 
2349 	/* Setup DMA descriptor areas. */
2350 	ret = bus_dma_tag_create(bus_get_dma_tag(dev),
2351 	    1, 0,			/* alignment, bounds */
2352 	    BUS_SPACE_MAXADDR,		/* lowaddr */
2353 	    BUS_SPACE_MAXADDR,		/* highaddr */
2354 	    NULL, NULL,			/* filter, filterarg */
2355 	    AL_TSO_SIZE,		/* maxsize */
2356 	    AL_ETH_PKT_MAX_BUFS,	/* nsegments */
2357 	    PAGE_SIZE,			/* maxsegsize */
2358 	    0,				/* flags */
2359 	    NULL,			/* lockfunc */
2360 	    NULL,			/* lockfuncarg */
2361 	    &tx_ring->dma_buf_tag);
2362 
2363 	if (ret != 0) {
2364 		device_printf(dev,"Unable to allocate dma_buf_tag, ret = %d\n",
2365 		    ret);
2366 		return (ret);
2367 	}
2368 
2369 	for (size = 0; size < tx_ring->sw_count; size++) {
2370 		ret = bus_dmamap_create(tx_ring->dma_buf_tag, 0,
2371 		    &tx_ring->tx_buffer_info[size].dma_map);
2372 		if (ret != 0) {
2373 			device_printf(dev, "Unable to map DMA TX "
2374 			    "buffer memory [iter=%d]\n", size);
2375 			return (ret);
2376 		}
2377 	}
2378 
2379 	/* completion queue not used for tx */
2380 	q_params->cdesc_base = NULL;
2381 	/* size in bytes of the udma completion ring descriptor */
2382 	q_params->cdesc_size = 8;
2383 	tx_ring->next_to_use = 0;
2384 	tx_ring->next_to_clean = 0;
2385 
2386 	return (0);
2387 }
2388 
2389 /*
2390  * al_eth_free_tx_resources - Free Tx Resources per Queue
2391  * @adapter: network interface device structure
2392  * @qid: queue index
2393  *
2394  * Free all transmit software resources
2395  */
2396 static void
2397 al_eth_free_tx_resources(struct al_eth_adapter *adapter, int qid)
2398 {
2399 	struct al_eth_ring *tx_ring = &adapter->tx_ring[qid];
2400 	struct al_udma_q_params *q_params = &tx_ring->q_params;
2401 	int size;
2402 
2403 	/* At this point interrupts' handlers must be deactivated */
2404 	while (taskqueue_cancel(tx_ring->cmpl_tq, &tx_ring->cmpl_task, NULL))
2405 		taskqueue_drain(tx_ring->cmpl_tq, &tx_ring->cmpl_task);
2406 
2407 	taskqueue_free(tx_ring->cmpl_tq);
2408 	while (taskqueue_cancel(tx_ring->enqueue_tq,
2409 	    &tx_ring->enqueue_task, NULL)) {
2410 		taskqueue_drain(tx_ring->enqueue_tq, &tx_ring->enqueue_task);
2411 	}
2412 
2413 	taskqueue_free(tx_ring->enqueue_tq);
2414 
2415 	if (tx_ring->br != NULL) {
2416 		drbr_flush(adapter->netdev, tx_ring->br);
2417 		buf_ring_free(tx_ring->br, M_DEVBUF);
2418 	}
2419 
2420 	for (size = 0; size < tx_ring->sw_count; size++) {
2421 		m_freem(tx_ring->tx_buffer_info[size].m);
2422 		tx_ring->tx_buffer_info[size].m = NULL;
2423 
2424 		bus_dmamap_unload(tx_ring->dma_buf_tag,
2425 		    tx_ring->tx_buffer_info[size].dma_map);
2426 		bus_dmamap_destroy(tx_ring->dma_buf_tag,
2427 		    tx_ring->tx_buffer_info[size].dma_map);
2428 	}
2429 	bus_dma_tag_destroy(tx_ring->dma_buf_tag);
2430 
2431 	free(tx_ring->tx_buffer_info, M_IFAL);
2432 	tx_ring->tx_buffer_info = NULL;
2433 
2434 	mtx_destroy(&tx_ring->br_mtx);
2435 
2436 	/* if not set, then don't free */
2437 	if (q_params->desc_base == NULL)
2438 		return;
2439 
2440 	al_dma_free_coherent(q_params->desc_phy_base_tag,
2441 	    q_params->desc_phy_base_map, q_params->desc_base);
2442 
2443 	q_params->desc_base = NULL;
2444 }
2445 
2446 /*
2447  * al_eth_free_all_tx_resources - Free Tx Resources for All Queues
2448  * @adapter: board private structure
2449  *
2450  * Free all transmit software resources
2451  */
2452 static void
2453 al_eth_free_all_tx_resources(struct al_eth_adapter *adapter)
2454 {
2455 	int i;
2456 
2457 	for (i = 0; i < adapter->num_tx_queues; i++)
2458 		if (adapter->tx_ring[i].q_params.desc_base)
2459 			al_eth_free_tx_resources(adapter, i);
2460 }
2461 
2462 /*
2463  * al_eth_setup_rx_resources - allocate Rx resources (Descriptors)
2464  * @adapter: network interface device structure
2465  * @qid: queue index
2466  *
2467  * Returns 0 on success, negative on failure
2468  */
2469 static int
2470 al_eth_setup_rx_resources(struct al_eth_adapter *adapter, unsigned int qid)
2471 {
2472 	struct al_eth_ring *rx_ring = &adapter->rx_ring[qid];
2473 	struct device *dev = rx_ring->dev;
2474 	struct al_udma_q_params *q_params = &rx_ring->q_params;
2475 	int size;
2476 	int ret;
2477 
2478 	size = sizeof(struct al_eth_rx_buffer) * rx_ring->sw_count;
2479 
2480 	/* alloc extra element so in rx path we can always prefetch rx_info + 1 */
2481 	size += 1;
2482 
2483 	rx_ring->rx_buffer_info = malloc(size, M_IFAL, M_ZERO | M_WAITOK);
2484 	if (rx_ring->rx_buffer_info == NULL)
2485 		return (ENOMEM);
2486 
2487 	rx_ring->descs_size = rx_ring->hw_count * sizeof(union al_udma_desc);
2488 	q_params->size = rx_ring->hw_count;
2489 
2490 	ret = al_dma_alloc_coherent(dev, &q_params->desc_phy_base_tag,
2491 	    &q_params->desc_phy_base_map,
2492 	    (bus_addr_t *)&q_params->desc_phy_base,
2493 	    (void**)&q_params->desc_base, rx_ring->descs_size);
2494 
2495 	if ((q_params->desc_base == NULL) || (ret != 0))
2496 		return (ENOMEM);
2497 
2498 	/* size in bytes of the udma completion ring descriptor */
2499 	q_params->cdesc_size = 16;
2500 	rx_ring->cdescs_size = rx_ring->hw_count * q_params->cdesc_size;
2501 	ret = al_dma_alloc_coherent(dev, &q_params->cdesc_phy_base_tag,
2502 	    &q_params->cdesc_phy_base_map,
2503 	    (bus_addr_t *)&q_params->cdesc_phy_base,
2504 	    (void**)&q_params->cdesc_base, rx_ring->cdescs_size);
2505 
2506 	if ((q_params->cdesc_base == NULL) || (ret != 0))
2507 		return (ENOMEM);
2508 
2509 	/* Allocate taskqueues */
2510 	TASK_INIT(&rx_ring->enqueue_task, 0, al_eth_rx_recv_work, rx_ring);
2511 	rx_ring->enqueue_tq = taskqueue_create_fast("al_rx_enque", M_NOWAIT,
2512 	    taskqueue_thread_enqueue, &rx_ring->enqueue_tq);
2513 	taskqueue_start_threads(&rx_ring->enqueue_tq, 1, PI_NET, "%s rxeq",
2514 	    device_get_nameunit(adapter->dev));
2515 
2516 	/* Setup DMA descriptor areas. */
2517 	ret = bus_dma_tag_create(bus_get_dma_tag(dev),
2518 	    1, 0,			/* alignment, bounds */
2519 	    BUS_SPACE_MAXADDR,		/* lowaddr */
2520 	    BUS_SPACE_MAXADDR,		/* highaddr */
2521 	    NULL, NULL,			/* filter, filterarg */
2522 	    AL_TSO_SIZE,		/* maxsize */
2523 	    1,				/* nsegments */
2524 	    AL_TSO_SIZE,		/* maxsegsize */
2525 	    0,				/* flags */
2526 	    NULL,			/* lockfunc */
2527 	    NULL,			/* lockfuncarg */
2528 	    &rx_ring->dma_buf_tag);
2529 
2530 	if (ret != 0) {
2531 		device_printf(dev,"Unable to allocate RX dma_buf_tag\n");
2532 		return (ret);
2533 	}
2534 
2535 	for (size = 0; size < rx_ring->sw_count; size++) {
2536 		ret = bus_dmamap_create(rx_ring->dma_buf_tag, 0,
2537 		    &rx_ring->rx_buffer_info[size].dma_map);
2538 		if (ret != 0) {
2539 			device_printf(dev,"Unable to map DMA RX buffer memory\n");
2540 			return (ret);
2541 		}
2542 	}
2543 
2544 	/* Zero out the descriptor ring */
2545 	memset(q_params->cdesc_base, 0, rx_ring->cdescs_size);
2546 
2547 	/* Create LRO for the ring */
2548 	if ((adapter->netdev->if_capenable & IFCAP_LRO) != 0) {
2549 		int err = tcp_lro_init(&rx_ring->lro);
2550 		if (err != 0) {
2551 			device_printf(adapter->dev,
2552 			    "LRO[%d] Initialization failed!\n", qid);
2553 		} else {
2554 			device_printf_dbg(adapter->dev,
2555 			    "RX Soft LRO[%d] Initialized\n", qid);
2556 			rx_ring->lro_enabled = TRUE;
2557 			rx_ring->lro.ifp = adapter->netdev;
2558 		}
2559 	}
2560 
2561 	rx_ring->next_to_clean = 0;
2562 	rx_ring->next_to_use = 0;
2563 
2564 	return (0);
2565 }
2566 
2567 /*
2568  * al_eth_free_rx_resources - Free Rx Resources
2569  * @adapter: network interface device structure
2570  * @qid: queue index
2571  *
2572  * Free all receive software resources
2573  */
2574 static void
2575 al_eth_free_rx_resources(struct al_eth_adapter *adapter, unsigned int qid)
2576 {
2577 	struct al_eth_ring *rx_ring = &adapter->rx_ring[qid];
2578 	struct al_udma_q_params *q_params = &rx_ring->q_params;
2579 	int size;
2580 
2581 	/* At this point interrupts' handlers must be deactivated */
2582 	while (taskqueue_cancel(rx_ring->enqueue_tq,
2583 	    &rx_ring->enqueue_task, NULL)) {
2584 		taskqueue_drain(rx_ring->enqueue_tq, &rx_ring->enqueue_task);
2585 	}
2586 
2587 	taskqueue_free(rx_ring->enqueue_tq);
2588 
2589 	for (size = 0; size < rx_ring->sw_count; size++) {
2590 		m_freem(rx_ring->rx_buffer_info[size].m);
2591 		rx_ring->rx_buffer_info[size].m = NULL;
2592 		bus_dmamap_unload(rx_ring->dma_buf_tag,
2593 		    rx_ring->rx_buffer_info[size].dma_map);
2594 		bus_dmamap_destroy(rx_ring->dma_buf_tag,
2595 		    rx_ring->rx_buffer_info[size].dma_map);
2596 	}
2597 	bus_dma_tag_destroy(rx_ring->dma_buf_tag);
2598 
2599 	free(rx_ring->rx_buffer_info, M_IFAL);
2600 	rx_ring->rx_buffer_info = NULL;
2601 
2602 	/* if not set, then don't free */
2603 	if (q_params->desc_base == NULL)
2604 		return;
2605 
2606 	al_dma_free_coherent(q_params->desc_phy_base_tag,
2607 	    q_params->desc_phy_base_map, q_params->desc_base);
2608 
2609 	q_params->desc_base = NULL;
2610 
2611 	/* if not set, then don't free */
2612 	if (q_params->cdesc_base == NULL)
2613 		return;
2614 
2615 	al_dma_free_coherent(q_params->cdesc_phy_base_tag,
2616 	    q_params->cdesc_phy_base_map, q_params->cdesc_base);
2617 
2618 	q_params->cdesc_phy_base = 0;
2619 
2620 	/* Free LRO resources */
2621 	tcp_lro_free(&rx_ring->lro);
2622 }
2623 
2624 /*
2625  * al_eth_free_all_rx_resources - Free Rx Resources for All Queues
2626  * @adapter: board private structure
2627  *
2628  * Free all receive software resources
2629  */
2630 static void
2631 al_eth_free_all_rx_resources(struct al_eth_adapter *adapter)
2632 {
2633 	int i;
2634 
2635 	for (i = 0; i < adapter->num_rx_queues; i++)
2636 		if (adapter->rx_ring[i].q_params.desc_base != 0)
2637 			al_eth_free_rx_resources(adapter, i);
2638 }
2639 
2640 /*
2641  * al_eth_setup_all_rx_resources - allocate all queues Rx resources
2642  * @adapter: board private structure
2643  *
2644  * Return 0 on success, negative on failure
2645  */
2646 static int
2647 al_eth_setup_all_rx_resources(struct al_eth_adapter *adapter)
2648 {
2649 	int i, rc = 0;
2650 
2651 	for (i = 0; i < adapter->num_rx_queues; i++) {
2652 		rc = al_eth_setup_rx_resources(adapter, i);
2653 		if (rc == 0)
2654 			continue;
2655 
2656 		device_printf(adapter->dev, "Allocation for Rx Queue %u failed\n", i);
2657 		goto err_setup_rx;
2658 	}
2659 	return (0);
2660 
2661 err_setup_rx:
2662 	/* rewind the index freeing the rings as we go */
2663 	while (i--)
2664 		al_eth_free_rx_resources(adapter, i);
2665 	return (rc);
2666 }
2667 
2668 /*
2669  * al_eth_setup_all_tx_resources - allocate all queues Tx resources
2670  * @adapter: private structure
2671  *
2672  * Return 0 on success, negative on failure
2673  */
2674 static int
2675 al_eth_setup_all_tx_resources(struct al_eth_adapter *adapter)
2676 {
2677 	int i, rc = 0;
2678 
2679 	for (i = 0; i < adapter->num_tx_queues; i++) {
2680 		rc = al_eth_setup_tx_resources(adapter, i);
2681 		if (rc == 0)
2682 			continue;
2683 
2684 		device_printf(adapter->dev,
2685 		    "Allocation for Tx Queue %u failed\n", i);
2686 		goto err_setup_tx;
2687 	}
2688 
2689 	return (0);
2690 
2691 err_setup_tx:
2692 	/* rewind the index freeing the rings as we go */
2693 	while (i--)
2694 		al_eth_free_tx_resources(adapter, i);
2695 
2696 	return (rc);
2697 }
2698 
2699 static void
2700 al_eth_disable_int_sync(struct al_eth_adapter *adapter)
2701 {
2702 
2703 	/* disable forwarding interrupts from eth through pci end point */
2704 	if ((adapter->board_type == ALPINE_FPGA_NIC) ||
2705 	    (adapter->board_type == ALPINE_NIC)) {
2706 		al_eth_forward_int_config((uint32_t*)adapter->internal_pcie_base +
2707 		    AL_REG_OFFSET_FORWARD_INTR, AL_DIS_FORWARD_INTR);
2708 	}
2709 
2710 	/* mask hw interrupts */
2711 	al_eth_interrupts_mask(adapter);
2712 }
2713 
2714 static void
2715 al_eth_interrupts_unmask(struct al_eth_adapter *adapter)
2716 {
2717 	uint32_t group_a_mask = AL_INT_GROUP_A_GROUP_D_SUM; /* enable group D summery */
2718 	uint32_t group_b_mask = (1 << adapter->num_rx_queues) - 1;/* bit per Rx q*/
2719 	uint32_t group_c_mask = (1 << adapter->num_tx_queues) - 1;/* bit per Tx q*/
2720 	uint32_t group_d_mask = 3 << 8;
2721 	struct unit_regs __iomem *regs_base =
2722 	    (struct unit_regs __iomem *)adapter->udma_base;
2723 
2724 	if (adapter->int_mode == AL_IOFIC_MODE_LEGACY)
2725 		group_a_mask |= AL_INT_GROUP_A_GROUP_B_SUM |
2726 		    AL_INT_GROUP_A_GROUP_C_SUM |
2727 		    AL_INT_GROUP_A_GROUP_D_SUM;
2728 
2729 	al_udma_iofic_unmask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2730 	    AL_INT_GROUP_A, group_a_mask);
2731 	al_udma_iofic_unmask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2732 	    AL_INT_GROUP_B, group_b_mask);
2733 	al_udma_iofic_unmask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2734 	    AL_INT_GROUP_C, group_c_mask);
2735 	al_udma_iofic_unmask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2736 	    AL_INT_GROUP_D, group_d_mask);
2737 }
2738 
2739 static void
2740 al_eth_interrupts_mask(struct al_eth_adapter *adapter)
2741 {
2742 	struct unit_regs __iomem *regs_base =
2743 	    (struct unit_regs __iomem *)adapter->udma_base;
2744 
2745 	/* mask all interrupts */
2746 	al_udma_iofic_mask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2747 	    AL_INT_GROUP_A, AL_MASK_GROUP_A_INT);
2748 	al_udma_iofic_mask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2749 	    AL_INT_GROUP_B, AL_MASK_GROUP_B_INT);
2750 	al_udma_iofic_mask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2751 	    AL_INT_GROUP_C, AL_MASK_GROUP_C_INT);
2752 	al_udma_iofic_mask(regs_base, AL_UDMA_IOFIC_LEVEL_PRIMARY,
2753 	    AL_INT_GROUP_D, AL_MASK_GROUP_D_INT);
2754 }
2755 
2756 static int
2757 al_eth_configure_int_mode(struct al_eth_adapter *adapter)
2758 {
2759 	enum al_iofic_mode int_mode;
2760 	uint32_t m2s_errors_disable = AL_M2S_MASK_INIT;
2761 	uint32_t m2s_aborts_disable = AL_M2S_MASK_INIT;
2762 	uint32_t s2m_errors_disable = AL_S2M_MASK_INIT;
2763 	uint32_t s2m_aborts_disable = AL_S2M_MASK_INIT;
2764 
2765 	/* single INTX mode */
2766 	if (adapter->msix_vecs == 0)
2767 		int_mode = AL_IOFIC_MODE_LEGACY;
2768 	else if (adapter->msix_vecs > 1)
2769 		int_mode = AL_IOFIC_MODE_MSIX_PER_Q;
2770 	else {
2771 		device_printf(adapter->dev,
2772 		    "udma doesn't support single MSI-X mode yet.\n");
2773 		return (EIO);
2774 	}
2775 
2776 	if (adapter->board_type != ALPINE_INTEGRATED) {
2777 		m2s_errors_disable |= AL_M2S_S2M_MASK_NOT_INT;
2778 		m2s_errors_disable |= AL_M2S_S2M_MASK_NOT_INT;
2779 		s2m_aborts_disable |= AL_M2S_S2M_MASK_NOT_INT;
2780 		s2m_aborts_disable |= AL_M2S_S2M_MASK_NOT_INT;
2781 	}
2782 
2783 	if (al_udma_iofic_config((struct unit_regs __iomem *)adapter->udma_base,
2784 	    int_mode, m2s_errors_disable, m2s_aborts_disable,
2785 	    s2m_errors_disable, s2m_aborts_disable)) {
2786 		device_printf(adapter->dev,
2787 		    "al_udma_unit_int_config failed!.\n");
2788 		return (EIO);
2789 	}
2790 	adapter->int_mode = int_mode;
2791 	device_printf_dbg(adapter->dev, "using %s interrupt mode\n",
2792 	    int_mode == AL_IOFIC_MODE_LEGACY ? "INTx" :
2793 	    int_mode == AL_IOFIC_MODE_MSIX_PER_Q ? "MSI-X per Queue" : "Unknown");
2794 	/* set interrupt moderation resolution to 15us */
2795 	al_iofic_moder_res_config(&((struct unit_regs *)(adapter->udma_base))->gen.interrupt_regs.main_iofic, AL_INT_GROUP_B, 15);
2796 	al_iofic_moder_res_config(&((struct unit_regs *)(adapter->udma_base))->gen.interrupt_regs.main_iofic, AL_INT_GROUP_C, 15);
2797 	/* by default interrupt coalescing is disabled */
2798 	adapter->tx_usecs = 0;
2799 	adapter->rx_usecs = 0;
2800 
2801 	return (0);
2802 }
2803 
2804 /*
2805  * ethtool_rxfh_indir_default - get default value for RX flow hash indirection
2806  * @index: Index in RX flow hash indirection table
2807  * @n_rx_rings: Number of RX rings to use
2808  *
2809  * This function provides the default policy for RX flow hash indirection.
2810  */
2811 static inline uint32_t
2812 ethtool_rxfh_indir_default(uint32_t index, uint32_t n_rx_rings)
2813 {
2814 
2815 	return (index % n_rx_rings);
2816 }
2817 
2818 static void*
2819 al_eth_update_stats(struct al_eth_adapter *adapter)
2820 {
2821 	struct al_eth_mac_stats *mac_stats = &adapter->mac_stats;
2822 
2823 	if (adapter->up == 0)
2824 		return (NULL);
2825 
2826 	al_eth_mac_stats_get(&adapter->hal_adapter, mac_stats);
2827 
2828 	return (NULL);
2829 }
2830 
2831 static uint64_t
2832 al_get_counter(struct ifnet *ifp, ift_counter cnt)
2833 {
2834 	struct al_eth_adapter *adapter;
2835 	struct al_eth_mac_stats *mac_stats;
2836 	uint64_t rv;
2837 
2838 	adapter = if_getsoftc(ifp);
2839 	mac_stats = &adapter->mac_stats;
2840 
2841 	switch (cnt) {
2842 	case IFCOUNTER_IPACKETS:
2843 		return (mac_stats->aFramesReceivedOK); /* including pause frames */
2844 	case IFCOUNTER_OPACKETS:
2845 		return (mac_stats->aFramesTransmittedOK);
2846 	case IFCOUNTER_IBYTES:
2847 		return (mac_stats->aOctetsReceivedOK);
2848 	case IFCOUNTER_OBYTES:
2849 		return (mac_stats->aOctetsTransmittedOK);
2850 	case IFCOUNTER_IMCASTS:
2851 		return (mac_stats->ifInMulticastPkts);
2852 	case IFCOUNTER_OMCASTS:
2853 		return (mac_stats->ifOutMulticastPkts);
2854 	case IFCOUNTER_COLLISIONS:
2855 		return (0);
2856 	case IFCOUNTER_IQDROPS:
2857 		return (mac_stats->etherStatsDropEvents);
2858 	case IFCOUNTER_IERRORS:
2859 		rv = mac_stats->ifInErrors +
2860 		    mac_stats->etherStatsUndersizePkts + /* good but short */
2861 		    mac_stats->etherStatsFragments + /* short and bad*/
2862 		    mac_stats->etherStatsJabbers + /* with crc errors */
2863 		    mac_stats->etherStatsOversizePkts +
2864 		    mac_stats->aFrameCheckSequenceErrors +
2865 		    mac_stats->aAlignmentErrors;
2866 		return (rv);
2867 	case IFCOUNTER_OERRORS:
2868 		return (mac_stats->ifOutErrors);
2869 	default:
2870 		return (if_get_counter_default(ifp, cnt));
2871 	}
2872 }
2873 
2874 /*
2875  *  Unicast, Multicast and Promiscuous mode set
2876  *
2877  *  The set_rx_mode entry point is called whenever the unicast or multicast
2878  *  address lists or the network interface flags are updated.  This routine is
2879  *  responsible for configuring the hardware for proper unicast, multicast,
2880  *  promiscuous mode, and all-multi behavior.
2881  */
2882 #define	MAX_NUM_MULTICAST_ADDRESSES 32
2883 #define	MAX_NUM_ADDRESSES           32
2884 
2885 static void
2886 al_eth_set_rx_mode(struct al_eth_adapter *adapter)
2887 {
2888 	struct ifnet *ifp = adapter->netdev;
2889 	struct ifmultiaddr *ifma; /* multicast addresses configured */
2890 	struct ifaddr *ifua; /* unicast address */
2891 	int mc = 0;
2892 	int uc = 0;
2893 	uint8_t i;
2894 	unsigned char *mac;
2895 
2896 	if_maddr_rlock(ifp);
2897 	TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2898 		if (ifma->ifma_addr->sa_family != AF_LINK)
2899 			continue;
2900 		if (mc == MAX_NUM_MULTICAST_ADDRESSES)
2901 			break;
2902 
2903 		mac = LLADDR((struct sockaddr_dl *) ifma->ifma_addr);
2904 		/* default mc address inside mac address */
2905 		if (mac[3] != 0 && mac[4] != 0 && mac[5] != 1)
2906 			mc++;
2907 	}
2908 	if_maddr_runlock(ifp);
2909 
2910 	if_addr_rlock(ifp);
2911 	TAILQ_FOREACH(ifua, &ifp->if_addrhead, ifa_link) {
2912 		if (ifua->ifa_addr->sa_family != AF_LINK)
2913 			continue;
2914 		if (uc == MAX_NUM_ADDRESSES)
2915 			break;
2916 		uc++;
2917 	}
2918 	if_addr_runlock(ifp);
2919 
2920 	if ((ifp->if_flags & IFF_PROMISC) != 0) {
2921 		al_eth_mac_table_promiscuous_set(adapter, true);
2922 	} else {
2923 		if ((ifp->if_flags & IFF_ALLMULTI) != 0) {
2924 			/* This interface is in all-multicasts mode (used by multicast routers). */
2925 			al_eth_mac_table_all_multicast_add(adapter,
2926 			    AL_ETH_MAC_TABLE_ALL_MULTICAST_IDX, 1);
2927 		} else {
2928 			if (mc == 0) {
2929 				al_eth_mac_table_entry_clear(adapter,
2930 				    AL_ETH_MAC_TABLE_ALL_MULTICAST_IDX);
2931 			} else {
2932 				al_eth_mac_table_all_multicast_add(adapter,
2933 				    AL_ETH_MAC_TABLE_ALL_MULTICAST_IDX, 1);
2934 			}
2935 		}
2936 		if (uc != 0) {
2937 			i = AL_ETH_MAC_TABLE_UNICAST_IDX_BASE + 1;
2938 			if (uc > AL_ETH_MAC_TABLE_UNICAST_MAX_COUNT) {
2939 				/*
2940 				 * In this case there are more addresses then
2941 				 * entries in the mac table - set promiscuous
2942 				 */
2943 				al_eth_mac_table_promiscuous_set(adapter, true);
2944 				return;
2945 			}
2946 
2947 			/* clear the last configuration */
2948 			while (i < (AL_ETH_MAC_TABLE_UNICAST_IDX_BASE +
2949 				    AL_ETH_MAC_TABLE_UNICAST_MAX_COUNT)) {
2950 				al_eth_mac_table_entry_clear(adapter, i);
2951 				i++;
2952 			}
2953 
2954 			/* set new addresses */
2955 			i = AL_ETH_MAC_TABLE_UNICAST_IDX_BASE + 1;
2956 			if_addr_rlock(ifp);
2957 			TAILQ_FOREACH(ifua, &ifp->if_addrhead, ifa_link) {
2958 				if (ifua->ifa_addr->sa_family != AF_LINK) {
2959 					continue;
2960 				}
2961 				al_eth_mac_table_unicast_add(adapter, i,
2962 				    (unsigned char *)ifua->ifa_addr, 1);
2963 				i++;
2964 			}
2965 			if_addr_runlock(ifp);
2966 
2967 		}
2968 		al_eth_mac_table_promiscuous_set(adapter, false);
2969 	}
2970 }
2971 
2972 static void
2973 al_eth_config_rx_fwd(struct al_eth_adapter *adapter)
2974 {
2975 	struct al_eth_fwd_ctrl_table_entry entry;
2976 	int i;
2977 
2978 	/* let priority be equal to pbits */
2979 	for (i = 0; i < AL_ETH_FWD_PBITS_TABLE_NUM; i++)
2980 		al_eth_fwd_pbits_table_set(&adapter->hal_adapter, i, i);
2981 
2982 	/* map priority to queue index, queue id = priority/2 */
2983 	for (i = 0; i < AL_ETH_FWD_PRIO_TABLE_NUM; i++)
2984 		al_eth_fwd_priority_table_set(&adapter->hal_adapter, i, i >> 1);
2985 
2986 	entry.prio_sel = AL_ETH_CTRL_TABLE_PRIO_SEL_VAL_0;
2987 	entry.queue_sel_1 = AL_ETH_CTRL_TABLE_QUEUE_SEL_1_THASH_TABLE;
2988 	entry.queue_sel_2 = AL_ETH_CTRL_TABLE_QUEUE_SEL_2_NO_PRIO;
2989 	entry.udma_sel = AL_ETH_CTRL_TABLE_UDMA_SEL_MAC_TABLE;
2990 	entry.filter = FALSE;
2991 
2992 	al_eth_ctrl_table_def_set(&adapter->hal_adapter, FALSE, &entry);
2993 
2994 	/*
2995 	 * By default set the mac table to forward all unicast packets to our
2996 	 * MAC address and all broadcast. all the rest will be dropped.
2997 	 */
2998 	al_eth_mac_table_unicast_add(adapter, AL_ETH_MAC_TABLE_UNICAST_IDX_BASE,
2999 	    adapter->mac_addr, 1);
3000 	al_eth_mac_table_broadcast_add(adapter, AL_ETH_MAC_TABLE_BROADCAST_IDX, 1);
3001 	al_eth_mac_table_promiscuous_set(adapter, false);
3002 
3003 	/* set toeplitz hash keys */
3004 	for (i = 0; i < sizeof(adapter->toeplitz_hash_key); i++)
3005 		*((uint8_t*)adapter->toeplitz_hash_key + i) = (uint8_t)random();
3006 
3007 	for (i = 0; i < AL_ETH_RX_HASH_KEY_NUM; i++)
3008 		al_eth_hash_key_set(&adapter->hal_adapter, i,
3009 		    htonl(adapter->toeplitz_hash_key[i]));
3010 
3011 	for (i = 0; i < AL_ETH_RX_RSS_TABLE_SIZE; i++) {
3012 		adapter->rss_ind_tbl[i] = ethtool_rxfh_indir_default(i,
3013 		    AL_ETH_NUM_QUEUES);
3014 		al_eth_set_thash_table_entry(adapter, i, 0,
3015 		    adapter->rss_ind_tbl[i]);
3016 	}
3017 
3018 	al_eth_fsm_table_init(adapter);
3019 }
3020 
3021 static void
3022 al_eth_req_rx_buff_size(struct al_eth_adapter *adapter, int size)
3023 {
3024 
3025 	/*
3026 	* Determine the correct mbuf pool
3027 	* for doing jumbo frames
3028 	* Try from the smallest up to maximum supported
3029 	*/
3030 	adapter->rx_mbuf_sz = MCLBYTES;
3031 	if (size > 2048) {
3032 		if (adapter->max_rx_buff_alloc_size > 2048)
3033 			adapter->rx_mbuf_sz = MJUMPAGESIZE;
3034 		else
3035 			return;
3036 	}
3037 	if (size > 4096) {
3038 		if (adapter->max_rx_buff_alloc_size > 4096)
3039 			adapter->rx_mbuf_sz = MJUM9BYTES;
3040 		else
3041 			return;
3042 	}
3043 	if (size > 9216) {
3044 		if (adapter->max_rx_buff_alloc_size > 9216)
3045 			adapter->rx_mbuf_sz = MJUM16BYTES;
3046 		else
3047 			return;
3048 	}
3049 }
3050 
3051 static int
3052 al_eth_change_mtu(struct al_eth_adapter *adapter, int new_mtu)
3053 {
3054 	int max_frame = new_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN +
3055 	    ETHER_VLAN_ENCAP_LEN;
3056 
3057 	al_eth_req_rx_buff_size(adapter, new_mtu);
3058 
3059 	device_printf_dbg(adapter->dev, "set MTU to %d\n", new_mtu);
3060 	al_eth_rx_pkt_limit_config(&adapter->hal_adapter,
3061 	    AL_ETH_MIN_FRAME_LEN, max_frame);
3062 
3063 	al_eth_tso_mss_config(&adapter->hal_adapter, 0, new_mtu - 100);
3064 
3065 	return (0);
3066 }
3067 
3068 static int
3069 al_eth_check_mtu(struct al_eth_adapter *adapter, int new_mtu)
3070 {
3071 	int max_frame = new_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN;
3072 
3073 	if ((new_mtu < AL_ETH_MIN_FRAME_LEN) ||
3074 	    (max_frame > AL_ETH_MAX_FRAME_LEN)) {
3075 		return (EINVAL);
3076 	}
3077 
3078 	return (0);
3079 }
3080 
3081 static int
3082 al_eth_udma_queue_enable(struct al_eth_adapter *adapter, enum al_udma_type type,
3083     int qid)
3084 {
3085 	int rc = 0;
3086 	char *name = (type == UDMA_TX) ? "Tx" : "Rx";
3087 	struct al_udma_q_params *q_params;
3088 
3089 	if (type == UDMA_TX)
3090 		q_params = &adapter->tx_ring[qid].q_params;
3091 	else
3092 		q_params = &adapter->rx_ring[qid].q_params;
3093 
3094 	rc = al_eth_queue_config(&adapter->hal_adapter, type, qid, q_params);
3095 	if (rc < 0) {
3096 		device_printf(adapter->dev, "config %s queue %u failed\n", name,
3097 		    qid);
3098 		return (rc);
3099 	}
3100 	return (rc);
3101 }
3102 
3103 static int
3104 al_eth_udma_queues_enable_all(struct al_eth_adapter *adapter)
3105 {
3106 	int i;
3107 
3108 	for (i = 0; i < adapter->num_tx_queues; i++)
3109 		al_eth_udma_queue_enable(adapter, UDMA_TX, i);
3110 
3111 	for (i = 0; i < adapter->num_rx_queues; i++)
3112 		al_eth_udma_queue_enable(adapter, UDMA_RX, i);
3113 
3114 	return (0);
3115 }
3116 
3117 static void
3118 al_eth_up_complete(struct al_eth_adapter *adapter)
3119 {
3120 
3121 	al_eth_configure_int_mode(adapter);
3122 	al_eth_config_rx_fwd(adapter);
3123 	al_eth_change_mtu(adapter, adapter->netdev->if_mtu);
3124 	al_eth_udma_queues_enable_all(adapter);
3125 	al_eth_refill_all_rx_bufs(adapter);
3126 	al_eth_interrupts_unmask(adapter);
3127 
3128 	/* enable forwarding interrupts from eth through pci end point */
3129 	if ((adapter->board_type == ALPINE_FPGA_NIC) ||
3130 	    (adapter->board_type == ALPINE_NIC)) {
3131 		al_eth_forward_int_config((uint32_t*)adapter->internal_pcie_base +
3132 		    AL_REG_OFFSET_FORWARD_INTR, AL_EN_FORWARD_INTR);
3133 	}
3134 
3135 	al_eth_flow_ctrl_enable(adapter);
3136 
3137 	mtx_lock(&adapter->stats_mtx);
3138 	callout_reset(&adapter->stats_callout, hz, al_tick_stats, (void*)adapter);
3139 	mtx_unlock(&adapter->stats_mtx);
3140 
3141 	al_eth_mac_start(&adapter->hal_adapter);
3142 }
3143 
3144 static int
3145 al_media_update(struct ifnet *ifp)
3146 {
3147 	struct al_eth_adapter *adapter = ifp->if_softc;
3148 
3149 	if ((ifp->if_flags & IFF_UP) != 0)
3150 		mii_mediachg(adapter->mii);
3151 
3152 	return (0);
3153 }
3154 
3155 static void
3156 al_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
3157 {
3158 	struct al_eth_adapter *sc = ifp->if_softc;
3159 	struct mii_data *mii;
3160 
3161 	if (sc->mii == NULL) {
3162 		ifmr->ifm_active = IFM_ETHER | IFM_NONE;
3163 		ifmr->ifm_status = 0;
3164 
3165 		return;
3166 	}
3167 
3168 	mii = sc->mii;
3169 	mii_pollstat(mii);
3170 
3171 	ifmr->ifm_active = mii->mii_media_active;
3172 	ifmr->ifm_status = mii->mii_media_status;
3173 }
3174 
3175 static void
3176 al_tick(void *arg)
3177 {
3178 	struct al_eth_adapter *adapter = arg;
3179 
3180 	mii_tick(adapter->mii);
3181 
3182 	/* Schedule another timeout one second from now */
3183 	callout_schedule(&adapter->wd_callout, hz);
3184 }
3185 
3186 static void
3187 al_tick_stats(void *arg)
3188 {
3189 	struct al_eth_adapter *adapter = arg;
3190 
3191 	al_eth_update_stats(adapter);
3192 
3193 	callout_schedule(&adapter->stats_callout, hz);
3194 }
3195 
3196 static int
3197 al_eth_up(struct al_eth_adapter *adapter)
3198 {
3199 	struct ifnet *ifp = adapter->netdev;
3200 	int rc;
3201 
3202 	if (adapter->up)
3203 		return (0);
3204 
3205 	if ((adapter->flags & AL_ETH_FLAG_RESET_REQUESTED) != 0) {
3206 		al_eth_function_reset(adapter);
3207 		adapter->flags &= ~AL_ETH_FLAG_RESET_REQUESTED;
3208 	}
3209 
3210 	ifp->if_hwassist = 0;
3211 	if ((ifp->if_capenable & IFCAP_TSO) != 0)
3212 		ifp->if_hwassist |= CSUM_TSO;
3213 	if ((ifp->if_capenable & IFCAP_TXCSUM) != 0)
3214 		ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
3215 	if ((ifp->if_capenable & IFCAP_TXCSUM_IPV6) != 0)
3216 		ifp->if_hwassist |= (CSUM_TCP_IPV6 | CSUM_UDP_IPV6);
3217 
3218 	al_eth_serdes_init(adapter);
3219 
3220 	rc = al_eth_hw_init(adapter);
3221 	if (rc != 0)
3222 		goto err_hw_init_open;
3223 
3224 	rc = al_eth_setup_int_mode(adapter);
3225 	if (rc != 0) {
3226 		device_printf(adapter->dev,
3227 		    "%s failed at setup interrupt mode!\n", __func__);
3228 		goto err_setup_int;
3229 	}
3230 
3231 	/* allocate transmit descriptors */
3232 	rc = al_eth_setup_all_tx_resources(adapter);
3233 	if (rc != 0)
3234 		goto err_setup_tx;
3235 
3236 	/* allocate receive descriptors */
3237 	rc = al_eth_setup_all_rx_resources(adapter);
3238 	if (rc != 0)
3239 		goto err_setup_rx;
3240 
3241 	rc = al_eth_request_irq(adapter);
3242 	if (rc != 0)
3243 		goto err_req_irq;
3244 
3245 	al_eth_up_complete(adapter);
3246 
3247 	adapter->up = true;
3248 
3249 	if (adapter->mac_mode == AL_ETH_MAC_MODE_10GbE_Serial)
3250 		adapter->netdev->if_link_state = LINK_STATE_UP;
3251 
3252 	if (adapter->mac_mode == AL_ETH_MAC_MODE_RGMII) {
3253 		mii_mediachg(adapter->mii);
3254 
3255 		/* Schedule watchdog timeout */
3256 		mtx_lock(&adapter->wd_mtx);
3257 		callout_reset(&adapter->wd_callout, hz, al_tick, adapter);
3258 		mtx_unlock(&adapter->wd_mtx);
3259 
3260 		mii_pollstat(adapter->mii);
3261 	}
3262 
3263 	return (rc);
3264 
3265 err_req_irq:
3266 	al_eth_free_all_rx_resources(adapter);
3267 err_setup_rx:
3268 	al_eth_free_all_tx_resources(adapter);
3269 err_setup_tx:
3270 	al_eth_free_irq(adapter);
3271 err_setup_int:
3272 	al_eth_hw_stop(adapter);
3273 err_hw_init_open:
3274 	al_eth_function_reset(adapter);
3275 
3276 	return (rc);
3277 }
3278 
3279 static int
3280 al_shutdown(device_t dev)
3281 {
3282 	struct al_eth_adapter *adapter = device_get_softc(dev);
3283 
3284 	al_eth_down(adapter);
3285 
3286 	return (0);
3287 }
3288 
3289 static void
3290 al_eth_down(struct al_eth_adapter *adapter)
3291 {
3292 
3293 	device_printf_dbg(adapter->dev, "al_eth_down: begin\n");
3294 
3295 	adapter->up = false;
3296 
3297 	mtx_lock(&adapter->wd_mtx);
3298 	callout_stop(&adapter->wd_callout);
3299 	mtx_unlock(&adapter->wd_mtx);
3300 
3301 	al_eth_disable_int_sync(adapter);
3302 
3303 	mtx_lock(&adapter->stats_mtx);
3304 	callout_stop(&adapter->stats_callout);
3305 	mtx_unlock(&adapter->stats_mtx);
3306 
3307 	al_eth_free_irq(adapter);
3308 	al_eth_hw_stop(adapter);
3309 
3310 	al_eth_free_all_tx_resources(adapter);
3311 	al_eth_free_all_rx_resources(adapter);
3312 }
3313 
3314 static int
3315 al_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
3316 {
3317 	struct al_eth_adapter	*adapter = ifp->if_softc;
3318 	struct ifreq		*ifr = (struct ifreq *)data;
3319 	int			error = 0;
3320 
3321 	switch (command) {
3322 	case SIOCSIFMTU:
3323 	{
3324 		error = al_eth_check_mtu(adapter, ifr->ifr_mtu);
3325 		if (error != 0) {
3326 			device_printf(adapter->dev, "ioctl wrong mtu %u\n",
3327 			    adapter->netdev->if_mtu);
3328 			break;
3329 		}
3330 
3331 		ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
3332 		adapter->netdev->if_mtu = ifr->ifr_mtu;
3333 		al_init(adapter);
3334 		break;
3335 	}
3336 	case SIOCSIFFLAGS:
3337 		if ((ifp->if_flags & IFF_UP) != 0) {
3338 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
3339 				if (((ifp->if_flags ^ adapter->if_flags) &
3340 				    (IFF_PROMISC | IFF_ALLMULTI)) != 0) {
3341 					device_printf_dbg(adapter->dev,
3342 					    "ioctl promisc/allmulti\n");
3343 					al_eth_set_rx_mode(adapter);
3344 				}
3345 			} else {
3346 				error = al_eth_up(adapter);
3347 				if (error == 0)
3348 					ifp->if_drv_flags |= IFF_DRV_RUNNING;
3349 			}
3350 		} else {
3351 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
3352 				al_eth_down(adapter);
3353 				ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
3354 			}
3355 		}
3356 
3357 		adapter->if_flags = ifp->if_flags;
3358 		break;
3359 
3360 	case SIOCADDMULTI:
3361 	case SIOCDELMULTI:
3362 		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
3363 			device_printf_dbg(adapter->dev,
3364 			    "ioctl add/del multi before\n");
3365 			al_eth_set_rx_mode(adapter);
3366 #ifdef DEVICE_POLLING
3367 			if ((ifp->if_capenable & IFCAP_POLLING) == 0)
3368 #endif
3369 		}
3370 		break;
3371 	case SIOCSIFMEDIA:
3372 	case SIOCGIFMEDIA:
3373 		if (adapter->mii != NULL)
3374 			error = ifmedia_ioctl(ifp, ifr,
3375 			    &adapter->mii->mii_media, command);
3376 		else
3377 			error = ifmedia_ioctl(ifp, ifr,
3378 			    &adapter->media, command);
3379 		break;
3380 	case SIOCSIFCAP:
3381 	    {
3382 		int mask, reinit;
3383 
3384 		reinit = 0;
3385 		mask = ifr->ifr_reqcap ^ ifp->if_capenable;
3386 #ifdef DEVICE_POLLING
3387 		if ((mask & IFCAP_POLLING) != 0) {
3388 			if ((ifr->ifr_reqcap & IFCAP_POLLING) != 0) {
3389 				if (error != 0)
3390 					return (error);
3391 				ifp->if_capenable |= IFCAP_POLLING;
3392 			} else {
3393 				error = ether_poll_deregister(ifp);
3394 				/* Enable interrupt even in error case */
3395 				ifp->if_capenable &= ~IFCAP_POLLING;
3396 			}
3397 		}
3398 #endif
3399 		if ((mask & IFCAP_HWCSUM) != 0) {
3400 			/* apply to both rx and tx */
3401 			ifp->if_capenable ^= IFCAP_HWCSUM;
3402 			reinit = 1;
3403 		}
3404 		if ((mask & IFCAP_HWCSUM_IPV6) != 0) {
3405 			ifp->if_capenable ^= IFCAP_HWCSUM_IPV6;
3406 			reinit = 1;
3407 		}
3408 		if ((mask & IFCAP_TSO) != 0) {
3409 			ifp->if_capenable ^= IFCAP_TSO;
3410 			reinit = 1;
3411 		}
3412 		if ((mask & IFCAP_LRO) != 0) {
3413 			ifp->if_capenable ^= IFCAP_LRO;
3414 		}
3415 		if ((mask & IFCAP_VLAN_HWTAGGING) != 0) {
3416 			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
3417 			reinit = 1;
3418 		}
3419 		if ((mask & IFCAP_VLAN_HWFILTER) != 0) {
3420 			ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
3421 			reinit = 1;
3422 		}
3423 		if ((mask & IFCAP_VLAN_HWTSO) != 0) {
3424 			ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
3425 			reinit = 1;
3426 		}
3427 		if ((reinit != 0) &&
3428 		    ((ifp->if_drv_flags & IFF_DRV_RUNNING)) != 0)
3429 		{
3430 			al_init(adapter);
3431 		}
3432 		break;
3433 	    }
3434 
3435 	default:
3436 		error = ether_ioctl(ifp, command, data);
3437 		break;
3438 	}
3439 
3440 	return (error);
3441 }
3442 
3443 static int
3444 al_is_device_supported(device_t dev)
3445 {
3446 	uint16_t pci_vendor_id = pci_get_vendor(dev);
3447 	uint16_t pci_device_id = pci_get_device(dev);
3448 
3449 	return (pci_vendor_id == PCI_VENDOR_ID_ANNAPURNA_LABS &&
3450 	    (pci_device_id == PCI_DEVICE_ID_AL_ETH ||
3451 	    pci_device_id == PCI_DEVICE_ID_AL_ETH_ADVANCED ||
3452 	    pci_device_id == PCI_DEVICE_ID_AL_ETH_NIC ||
3453 	    pci_device_id == PCI_DEVICE_ID_AL_ETH_FPGA_NIC));
3454 }
3455 
3456 /* Time in mSec to keep trying to read / write from MDIO in case of error */
3457 #define	MDIO_TIMEOUT_MSEC	100
3458 #define	MDIO_PAUSE_MSEC		10
3459 
3460 static int
3461 al_miibus_readreg(device_t dev, int phy, int reg)
3462 {
3463 	struct al_eth_adapter *adapter = device_get_softc(dev);
3464 	uint16_t value = 0;
3465 	int rc;
3466 	int timeout = MDIO_TIMEOUT_MSEC;
3467 
3468 	while (timeout > 0) {
3469 		rc = al_eth_mdio_read(&adapter->hal_adapter, adapter->phy_addr,
3470 		    -1, reg, &value);
3471 
3472 		if (rc == 0)
3473 			return (value);
3474 
3475 		device_printf_dbg(adapter->dev,
3476 		    "mdio read failed. try again in 10 msec\n");
3477 
3478 		timeout -= MDIO_PAUSE_MSEC;
3479 		pause("readred pause", MDIO_PAUSE_MSEC);
3480 	}
3481 
3482 	if (rc != 0)
3483 		device_printf(adapter->dev, "MDIO read failed on timeout\n");
3484 
3485 	return (value);
3486 }
3487 
3488 static int
3489 al_miibus_writereg(device_t dev, int phy, int reg, int value)
3490 {
3491 	struct al_eth_adapter *adapter = device_get_softc(dev);
3492 	int rc;
3493 	int timeout = MDIO_TIMEOUT_MSEC;
3494 
3495 	while (timeout > 0) {
3496 		rc = al_eth_mdio_write(&adapter->hal_adapter, adapter->phy_addr,
3497 		    -1, reg, value);
3498 
3499 		if (rc == 0)
3500 			return (0);
3501 
3502 		device_printf(adapter->dev,
3503 		    "mdio write failed. try again in 10 msec\n");
3504 
3505 		timeout -= MDIO_PAUSE_MSEC;
3506 		pause("miibus writereg", MDIO_PAUSE_MSEC);
3507 	}
3508 
3509 	if (rc != 0)
3510 		device_printf(adapter->dev, "MDIO write failed on timeout\n");
3511 
3512 	return (rc);
3513 }
3514 
3515 static void
3516 al_miibus_statchg(device_t dev)
3517 {
3518 	struct al_eth_adapter *adapter = device_get_softc(dev);
3519 
3520 	device_printf_dbg(adapter->dev,
3521 	    "al_miibus_statchg: state has changed!\n");
3522 	device_printf_dbg(adapter->dev,
3523 	    "al_miibus_statchg: active = 0x%x status = 0x%x\n",
3524 	    adapter->mii->mii_media_active, adapter->mii->mii_media_status);
3525 
3526 	if (adapter->up == 0)
3527 		return;
3528 
3529 	if ((adapter->mii->mii_media_status & IFM_AVALID) != 0) {
3530 		if (adapter->mii->mii_media_status & IFM_ACTIVE) {
3531 			device_printf(adapter->dev, "link is UP\n");
3532 			adapter->netdev->if_link_state = LINK_STATE_UP;
3533 		} else {
3534 			device_printf(adapter->dev, "link is DOWN\n");
3535 			adapter->netdev->if_link_state = LINK_STATE_DOWN;
3536 		}
3537 	}
3538 }
3539 
3540 static void
3541 al_miibus_linkchg(device_t dev)
3542 {
3543 	struct al_eth_adapter *adapter = device_get_softc(dev);
3544 	uint8_t duplex = 0;
3545 	uint8_t speed = 0;
3546 
3547 	if (adapter->mii == NULL)
3548 		return;
3549 
3550 	if ((adapter->netdev->if_flags & IFF_UP) == 0)
3551 		return;
3552 
3553 	/* Ignore link changes when link is not ready */
3554 	if ((adapter->mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) !=
3555 	    (IFM_AVALID | IFM_ACTIVE)) {
3556 		return;
3557 	}
3558 
3559 	if ((adapter->mii->mii_media_active & IFM_FDX) != 0)
3560 		duplex = 1;
3561 
3562 	speed = IFM_SUBTYPE(adapter->mii->mii_media_active);
3563 
3564 	if (speed == IFM_10_T) {
3565 		al_eth_mac_link_config(&adapter->hal_adapter, 0, 1,
3566 		    AL_10BASE_T_SPEED, duplex);
3567 		return;
3568 	}
3569 
3570 	if (speed == IFM_100_TX) {
3571 		al_eth_mac_link_config(&adapter->hal_adapter, 0, 1,
3572 		    AL_100BASE_TX_SPEED, duplex);
3573 		return;
3574 	}
3575 
3576 	if (speed == IFM_1000_T) {
3577 		al_eth_mac_link_config(&adapter->hal_adapter, 0, 1,
3578 		    AL_1000BASE_T_SPEED, duplex);
3579 		return;
3580 	}
3581 
3582 	device_printf(adapter->dev, "ERROR: unknown MII media active 0x%08x\n",
3583 	    adapter->mii->mii_media_active);
3584 }
3585