xref: /freebsd/sys/dev/oce/oce_if.c (revision a18eacbefdfa1085ca3db829e86ece78cd416493)
1 /*-
2  * Copyright (C) 2013 Emulex
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the Emulex Corporation nor the names of its
16  *    contributors may be used to endorse or promote products derived from
17  *    this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  * Contact Information:
32  * freebsd-drivers@emulex.com
33  *
34  * Emulex
35  * 3333 Susan Street
36  * Costa Mesa, CA 92626
37  */
38 
39 /* $FreeBSD$ */
40 
41 #include "opt_inet6.h"
42 #include "opt_inet.h"
43 
44 #include "oce_if.h"
45 
46 /* UE Status Low CSR */
47 static char *ue_status_low_desc[] = {
48 	"CEV",
49 	"CTX",
50 	"DBUF",
51 	"ERX",
52 	"Host",
53 	"MPU",
54 	"NDMA",
55 	"PTC ",
56 	"RDMA ",
57 	"RXF ",
58 	"RXIPS ",
59 	"RXULP0 ",
60 	"RXULP1 ",
61 	"RXULP2 ",
62 	"TIM ",
63 	"TPOST ",
64 	"TPRE ",
65 	"TXIPS ",
66 	"TXULP0 ",
67 	"TXULP1 ",
68 	"UC ",
69 	"WDMA ",
70 	"TXULP2 ",
71 	"HOST1 ",
72 	"P0_OB_LINK ",
73 	"P1_OB_LINK ",
74 	"HOST_GPIO ",
75 	"MBOX ",
76 	"AXGMAC0",
77 	"AXGMAC1",
78 	"JTAG",
79 	"MPU_INTPEND"
80 };
81 
82 /* UE Status High CSR */
83 static char *ue_status_hi_desc[] = {
84 	"LPCMEMHOST",
85 	"MGMT_MAC",
86 	"PCS0ONLINE",
87 	"MPU_IRAM",
88 	"PCS1ONLINE",
89 	"PCTL0",
90 	"PCTL1",
91 	"PMEM",
92 	"RR",
93 	"TXPB",
94 	"RXPP",
95 	"XAUI",
96 	"TXP",
97 	"ARM",
98 	"IPC",
99 	"HOST2",
100 	"HOST3",
101 	"HOST4",
102 	"HOST5",
103 	"HOST6",
104 	"HOST7",
105 	"HOST8",
106 	"HOST9",
107 	"NETC",
108 	"Unknown",
109 	"Unknown",
110 	"Unknown",
111 	"Unknown",
112 	"Unknown",
113 	"Unknown",
114 	"Unknown",
115 	"Unknown"
116 };
117 
118 
119 /* Driver entry points prototypes */
120 static int  oce_probe(device_t dev);
121 static int  oce_attach(device_t dev);
122 static int  oce_detach(device_t dev);
123 static int  oce_shutdown(device_t dev);
124 static int  oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
125 static void oce_init(void *xsc);
126 static int  oce_multiq_start(struct ifnet *ifp, struct mbuf *m);
127 static void oce_multiq_flush(struct ifnet *ifp);
128 
129 /* Driver interrupt routines protypes */
130 static void oce_intr(void *arg, int pending);
131 static int  oce_setup_intr(POCE_SOFTC sc);
132 static int  oce_fast_isr(void *arg);
133 static int  oce_alloc_intr(POCE_SOFTC sc, int vector,
134 			  void (*isr) (void *arg, int pending));
135 
136 /* Media callbacks prototypes */
137 static void oce_media_status(struct ifnet *ifp, struct ifmediareq *req);
138 static int  oce_media_change(struct ifnet *ifp);
139 
140 /* Transmit routines prototypes */
141 static int  oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index);
142 static void oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq);
143 static void oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx,
144 					uint32_t status);
145 static int  oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m,
146 				 struct oce_wq *wq);
147 
148 /* Receive routines prototypes */
149 static void oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe);
150 static int  oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe);
151 static int  oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe);
152 static void oce_rx(struct oce_rq *rq, uint32_t rqe_idx,
153 						struct oce_nic_rx_cqe *cqe);
154 
155 /* Helper function prototypes in this file */
156 static int  oce_attach_ifp(POCE_SOFTC sc);
157 static void oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag);
158 static void oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag);
159 static int  oce_vid_config(POCE_SOFTC sc);
160 static void oce_mac_addr_set(POCE_SOFTC sc);
161 static int  oce_handle_passthrough(struct ifnet *ifp, caddr_t data);
162 static void oce_local_timer(void *arg);
163 static void oce_if_deactivate(POCE_SOFTC sc);
164 static void oce_if_activate(POCE_SOFTC sc);
165 static void setup_max_queues_want(POCE_SOFTC sc);
166 static void update_queues_got(POCE_SOFTC sc);
167 static void process_link_state(POCE_SOFTC sc,
168 		 struct oce_async_cqe_link_state *acqe);
169 static int oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m);
170 static void oce_get_config(POCE_SOFTC sc);
171 static struct mbuf *oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete);
172 
173 /* IP specific */
174 #if defined(INET6) || defined(INET)
175 static int  oce_init_lro(POCE_SOFTC sc);
176 static void oce_rx_flush_lro(struct oce_rq *rq);
177 static struct mbuf * oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp);
178 #endif
179 
180 static device_method_t oce_dispatch[] = {
181 	DEVMETHOD(device_probe, oce_probe),
182 	DEVMETHOD(device_attach, oce_attach),
183 	DEVMETHOD(device_detach, oce_detach),
184 	DEVMETHOD(device_shutdown, oce_shutdown),
185 
186 	DEVMETHOD_END
187 };
188 
189 static driver_t oce_driver = {
190 	"oce",
191 	oce_dispatch,
192 	sizeof(OCE_SOFTC)
193 };
194 static devclass_t oce_devclass;
195 
196 
197 DRIVER_MODULE(oce, pci, oce_driver, oce_devclass, 0, 0);
198 MODULE_DEPEND(oce, pci, 1, 1, 1);
199 MODULE_DEPEND(oce, ether, 1, 1, 1);
200 MODULE_VERSION(oce, 1);
201 
202 
203 /* global vars */
204 const char component_revision[32] = {"///" COMPONENT_REVISION "///"};
205 
206 /* Module capabilites and parameters */
207 uint32_t oce_max_rsp_handled = OCE_MAX_RSP_HANDLED;
208 uint32_t oce_enable_rss = OCE_MODCAP_RSS;
209 
210 
211 TUNABLE_INT("hw.oce.max_rsp_handled", &oce_max_rsp_handled);
212 TUNABLE_INT("hw.oce.enable_rss", &oce_enable_rss);
213 
214 
215 /* Supported devices table */
216 static uint32_t supportedDevices[] =  {
217 	(PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE2,
218 	(PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE3,
219 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3,
220 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201,
221 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF,
222 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH
223 };
224 
225 
226 
227 
228 /*****************************************************************************
229  *			Driver entry points functions                        *
230  *****************************************************************************/
231 
232 static int
233 oce_probe(device_t dev)
234 {
235 	uint16_t vendor = 0;
236 	uint16_t device = 0;
237 	int i = 0;
238 	char str[256] = {0};
239 	POCE_SOFTC sc;
240 
241 	sc = device_get_softc(dev);
242 	bzero(sc, sizeof(OCE_SOFTC));
243 	sc->dev = dev;
244 
245 	vendor = pci_get_vendor(dev);
246 	device = pci_get_device(dev);
247 
248 	for (i = 0; i < (sizeof(supportedDevices) / sizeof(uint32_t)); i++) {
249 		if (vendor == ((supportedDevices[i] >> 16) & 0xffff)) {
250 			if (device == (supportedDevices[i] & 0xffff)) {
251 				sprintf(str, "%s:%s", "Emulex CNA NIC function",
252 					component_revision);
253 				device_set_desc_copy(dev, str);
254 
255 				switch (device) {
256 				case PCI_PRODUCT_BE2:
257 					sc->flags |= OCE_FLAGS_BE2;
258 					break;
259 				case PCI_PRODUCT_BE3:
260 					sc->flags |= OCE_FLAGS_BE3;
261 					break;
262 				case PCI_PRODUCT_XE201:
263 				case PCI_PRODUCT_XE201_VF:
264 					sc->flags |= OCE_FLAGS_XE201;
265 					break;
266 				case PCI_PRODUCT_SH:
267 					sc->flags |= OCE_FLAGS_SH;
268 					break;
269 				default:
270 					return ENXIO;
271 				}
272 				return BUS_PROBE_DEFAULT;
273 			}
274 		}
275 	}
276 
277 	return ENXIO;
278 }
279 
280 
281 static int
282 oce_attach(device_t dev)
283 {
284 	POCE_SOFTC sc;
285 	int rc = 0;
286 
287 	sc = device_get_softc(dev);
288 
289 	rc = oce_hw_pci_alloc(sc);
290 	if (rc)
291 		return rc;
292 
293 	sc->tx_ring_size = OCE_TX_RING_SIZE;
294 	sc->rx_ring_size = OCE_RX_RING_SIZE;
295 	sc->rq_frag_size = OCE_RQ_BUF_SIZE;
296 	sc->flow_control = OCE_DEFAULT_FLOW_CONTROL;
297 	sc->promisc	 = OCE_DEFAULT_PROMISCUOUS;
298 
299 	LOCK_CREATE(&sc->bmbx_lock, "Mailbox_lock");
300 	LOCK_CREATE(&sc->dev_lock,  "Device_lock");
301 
302 	/* initialise the hardware */
303 	rc = oce_hw_init(sc);
304 	if (rc)
305 		goto pci_res_free;
306 
307 	oce_get_config(sc);
308 
309 	setup_max_queues_want(sc);
310 
311 	rc = oce_setup_intr(sc);
312 	if (rc)
313 		goto mbox_free;
314 
315 	rc = oce_queue_init_all(sc);
316 	if (rc)
317 		goto intr_free;
318 
319 	rc = oce_attach_ifp(sc);
320 	if (rc)
321 		goto queues_free;
322 
323 #if defined(INET6) || defined(INET)
324 	rc = oce_init_lro(sc);
325 	if (rc)
326 		goto ifp_free;
327 #endif
328 
329 	rc = oce_hw_start(sc);
330 	if (rc)
331 		goto lro_free;
332 
333 	sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
334 				oce_add_vlan, sc, EVENTHANDLER_PRI_FIRST);
335 	sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
336 				oce_del_vlan, sc, EVENTHANDLER_PRI_FIRST);
337 
338 	rc = oce_stats_init(sc);
339 	if (rc)
340 		goto vlan_free;
341 
342 	oce_add_sysctls(sc);
343 
344 	callout_init(&sc->timer, CALLOUT_MPSAFE);
345 	rc = callout_reset(&sc->timer, 2 * hz, oce_local_timer, sc);
346 	if (rc)
347 		goto stats_free;
348 
349 	return 0;
350 
351 stats_free:
352 	callout_drain(&sc->timer);
353 	oce_stats_free(sc);
354 vlan_free:
355 	if (sc->vlan_attach)
356 		EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
357 	if (sc->vlan_detach)
358 		EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
359 	oce_hw_intr_disable(sc);
360 lro_free:
361 #if defined(INET6) || defined(INET)
362 	oce_free_lro(sc);
363 ifp_free:
364 #endif
365 	ether_ifdetach(sc->ifp);
366 	if_free(sc->ifp);
367 queues_free:
368 	oce_queue_release_all(sc);
369 intr_free:
370 	oce_intr_free(sc);
371 mbox_free:
372 	oce_dma_free(sc, &sc->bsmbx);
373 pci_res_free:
374 	oce_hw_pci_free(sc);
375 	LOCK_DESTROY(&sc->dev_lock);
376 	LOCK_DESTROY(&sc->bmbx_lock);
377 	return rc;
378 
379 }
380 
381 
382 static int
383 oce_detach(device_t dev)
384 {
385 	POCE_SOFTC sc = device_get_softc(dev);
386 
387 	LOCK(&sc->dev_lock);
388 	oce_if_deactivate(sc);
389 	UNLOCK(&sc->dev_lock);
390 
391 	callout_drain(&sc->timer);
392 
393 	if (sc->vlan_attach != NULL)
394 		EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
395 	if (sc->vlan_detach != NULL)
396 		EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
397 
398 	ether_ifdetach(sc->ifp);
399 
400 	if_free(sc->ifp);
401 
402 	oce_hw_shutdown(sc);
403 
404 	bus_generic_detach(dev);
405 
406 	return 0;
407 }
408 
409 
410 static int
411 oce_shutdown(device_t dev)
412 {
413 	int rc;
414 
415 	rc = oce_detach(dev);
416 
417 	return rc;
418 }
419 
420 
421 static int
422 oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
423 {
424 	struct ifreq *ifr = (struct ifreq *)data;
425 	POCE_SOFTC sc = ifp->if_softc;
426 	int rc = 0;
427 	uint32_t u;
428 
429 	switch (command) {
430 
431 	case SIOCGIFMEDIA:
432 		rc = ifmedia_ioctl(ifp, ifr, &sc->media, command);
433 		break;
434 
435 	case SIOCSIFMTU:
436 		if (ifr->ifr_mtu > OCE_MAX_MTU)
437 			rc = EINVAL;
438 		else
439 			ifp->if_mtu = ifr->ifr_mtu;
440 		break;
441 
442 	case SIOCSIFFLAGS:
443 		if (ifp->if_flags & IFF_UP) {
444 			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
445 				sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;
446 				oce_init(sc);
447 			}
448 			device_printf(sc->dev, "Interface Up\n");
449 		} else {
450 			LOCK(&sc->dev_lock);
451 
452 			sc->ifp->if_drv_flags &=
453 			    ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
454 			oce_if_deactivate(sc);
455 
456 			UNLOCK(&sc->dev_lock);
457 
458 			device_printf(sc->dev, "Interface Down\n");
459 		}
460 
461 		if ((ifp->if_flags & IFF_PROMISC) && !sc->promisc) {
462 			if (!oce_rxf_set_promiscuous(sc, (1 | (1 << 1))))
463 				sc->promisc = TRUE;
464 		} else if (!(ifp->if_flags & IFF_PROMISC) && sc->promisc) {
465 			if (!oce_rxf_set_promiscuous(sc, 0))
466 				sc->promisc = FALSE;
467 		}
468 
469 		break;
470 
471 	case SIOCADDMULTI:
472 	case SIOCDELMULTI:
473 		rc = oce_hw_update_multicast(sc);
474 		if (rc)
475 			device_printf(sc->dev,
476 				"Update multicast address failed\n");
477 		break;
478 
479 	case SIOCSIFCAP:
480 		u = ifr->ifr_reqcap ^ ifp->if_capenable;
481 
482 		if (u & IFCAP_TXCSUM) {
483 			ifp->if_capenable ^= IFCAP_TXCSUM;
484 			ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
485 
486 			if (IFCAP_TSO & ifp->if_capenable &&
487 			    !(IFCAP_TXCSUM & ifp->if_capenable)) {
488 				ifp->if_capenable &= ~IFCAP_TSO;
489 				ifp->if_hwassist &= ~CSUM_TSO;
490 				if_printf(ifp,
491 					 "TSO disabled due to -txcsum.\n");
492 			}
493 		}
494 
495 		if (u & IFCAP_RXCSUM)
496 			ifp->if_capenable ^= IFCAP_RXCSUM;
497 
498 		if (u & IFCAP_TSO4) {
499 			ifp->if_capenable ^= IFCAP_TSO4;
500 
501 			if (IFCAP_TSO & ifp->if_capenable) {
502 				if (IFCAP_TXCSUM & ifp->if_capenable)
503 					ifp->if_hwassist |= CSUM_TSO;
504 				else {
505 					ifp->if_capenable &= ~IFCAP_TSO;
506 					ifp->if_hwassist &= ~CSUM_TSO;
507 					if_printf(ifp,
508 					    "Enable txcsum first.\n");
509 					rc = EAGAIN;
510 				}
511 			} else
512 				ifp->if_hwassist &= ~CSUM_TSO;
513 		}
514 
515 		if (u & IFCAP_VLAN_HWTAGGING)
516 			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
517 
518 		if (u & IFCAP_VLAN_HWFILTER) {
519 			ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
520 			oce_vid_config(sc);
521 		}
522 #if defined(INET6) || defined(INET)
523 		if (u & IFCAP_LRO)
524 			ifp->if_capenable ^= IFCAP_LRO;
525 #endif
526 
527 		break;
528 
529 	case SIOCGPRIVATE_0:
530 		rc = oce_handle_passthrough(ifp, data);
531 		break;
532 	default:
533 		rc = ether_ioctl(ifp, command, data);
534 		break;
535 	}
536 
537 	return rc;
538 }
539 
540 
541 static void
542 oce_init(void *arg)
543 {
544 	POCE_SOFTC sc = arg;
545 
546 	LOCK(&sc->dev_lock);
547 
548 	if (sc->ifp->if_flags & IFF_UP) {
549 		oce_if_deactivate(sc);
550 		oce_if_activate(sc);
551 	}
552 
553 	UNLOCK(&sc->dev_lock);
554 
555 }
556 
557 
558 static int
559 oce_multiq_start(struct ifnet *ifp, struct mbuf *m)
560 {
561 	POCE_SOFTC sc = ifp->if_softc;
562 	struct oce_wq *wq = NULL;
563 	int queue_index = 0;
564 	int status = 0;
565 
566 	if (!sc->link_status)
567 		return ENXIO;
568 
569 	if ((m->m_flags & M_FLOWID) != 0)
570 		queue_index = m->m_pkthdr.flowid % sc->nwqs;
571 
572 	wq = sc->wq[queue_index];
573 
574 	LOCK(&wq->tx_lock);
575 	status = oce_multiq_transmit(ifp, m, wq);
576 	UNLOCK(&wq->tx_lock);
577 
578 	return status;
579 
580 }
581 
582 
583 static void
584 oce_multiq_flush(struct ifnet *ifp)
585 {
586 	POCE_SOFTC sc = ifp->if_softc;
587 	struct mbuf     *m;
588 	int i = 0;
589 
590 	for (i = 0; i < sc->nwqs; i++) {
591 		while ((m = buf_ring_dequeue_sc(sc->wq[i]->br)) != NULL)
592 			m_freem(m);
593 	}
594 	if_qflush(ifp);
595 }
596 
597 
598 
599 /*****************************************************************************
600  *                   Driver interrupt routines functions                     *
601  *****************************************************************************/
602 
603 static void
604 oce_intr(void *arg, int pending)
605 {
606 
607 	POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
608 	POCE_SOFTC sc = ii->sc;
609 	struct oce_eq *eq = ii->eq;
610 	struct oce_eqe *eqe;
611 	struct oce_cq *cq = NULL;
612 	int i, num_eqes = 0;
613 
614 
615 	bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
616 				 BUS_DMASYNC_POSTWRITE);
617 	do {
618 		eqe = RING_GET_CONSUMER_ITEM_VA(eq->ring, struct oce_eqe);
619 		if (eqe->evnt == 0)
620 			break;
621 		eqe->evnt = 0;
622 		bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
623 					BUS_DMASYNC_POSTWRITE);
624 		RING_GET(eq->ring, 1);
625 		num_eqes++;
626 
627 	} while (TRUE);
628 
629 	if (!num_eqes)
630 		goto eq_arm; /* Spurious */
631 
632  	/* Clear EQ entries, but dont arm */
633 	oce_arm_eq(sc, eq->eq_id, num_eqes, FALSE, FALSE);
634 
635 	/* Process TX, RX and MCC. But dont arm CQ*/
636 	for (i = 0; i < eq->cq_valid; i++) {
637 		cq = eq->cq[i];
638 		(*cq->cq_handler)(cq->cb_arg);
639 	}
640 
641 	/* Arm all cqs connected to this EQ */
642 	for (i = 0; i < eq->cq_valid; i++) {
643 		cq = eq->cq[i];
644 		oce_arm_cq(sc, cq->cq_id, 0, TRUE);
645 	}
646 
647 eq_arm:
648 	oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
649 
650 	return;
651 }
652 
653 
654 static int
655 oce_setup_intr(POCE_SOFTC sc)
656 {
657 	int rc = 0, use_intx = 0;
658 	int vector = 0, req_vectors = 0;
659 
660 	if (is_rss_enabled(sc))
661 		req_vectors = MAX((sc->nrqs - 1), sc->nwqs);
662 	else
663 		req_vectors = 1;
664 
665 	if (sc->flags & OCE_FLAGS_MSIX_CAPABLE) {
666 		sc->intr_count = req_vectors;
667 		rc = pci_alloc_msix(sc->dev, &sc->intr_count);
668 		if (rc != 0) {
669 			use_intx = 1;
670 			pci_release_msi(sc->dev);
671 		} else
672 			sc->flags |= OCE_FLAGS_USING_MSIX;
673 	} else
674 		use_intx = 1;
675 
676 	if (use_intx)
677 		sc->intr_count = 1;
678 
679 	/* Scale number of queues based on intr we got */
680 	update_queues_got(sc);
681 
682 	if (use_intx) {
683 		device_printf(sc->dev, "Using legacy interrupt\n");
684 		rc = oce_alloc_intr(sc, vector, oce_intr);
685 		if (rc)
686 			goto error;
687 	} else {
688 		for (; vector < sc->intr_count; vector++) {
689 			rc = oce_alloc_intr(sc, vector, oce_intr);
690 			if (rc)
691 				goto error;
692 		}
693 	}
694 
695 	return 0;
696 error:
697 	oce_intr_free(sc);
698 	return rc;
699 }
700 
701 
702 static int
703 oce_fast_isr(void *arg)
704 {
705 	POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
706 	POCE_SOFTC sc = ii->sc;
707 
708 	if (ii->eq == NULL)
709 		return FILTER_STRAY;
710 
711 	oce_arm_eq(sc, ii->eq->eq_id, 0, FALSE, TRUE);
712 
713 	taskqueue_enqueue_fast(ii->tq, &ii->task);
714 
715  	ii->eq->intr++;
716 
717 	return FILTER_HANDLED;
718 }
719 
720 
721 static int
722 oce_alloc_intr(POCE_SOFTC sc, int vector, void (*isr) (void *arg, int pending))
723 {
724 	POCE_INTR_INFO ii = &sc->intrs[vector];
725 	int rc = 0, rr;
726 
727 	if (vector >= OCE_MAX_EQ)
728 		return (EINVAL);
729 
730 	/* Set the resource id for the interrupt.
731 	 * MSIx is vector + 1 for the resource id,
732 	 * INTx is 0 for the resource id.
733 	 */
734 	if (sc->flags & OCE_FLAGS_USING_MSIX)
735 		rr = vector + 1;
736 	else
737 		rr = 0;
738 	ii->intr_res = bus_alloc_resource_any(sc->dev,
739 					      SYS_RES_IRQ,
740 					      &rr, RF_ACTIVE|RF_SHAREABLE);
741 	ii->irq_rr = rr;
742 	if (ii->intr_res == NULL) {
743 		device_printf(sc->dev,
744 			  "Could not allocate interrupt\n");
745 		rc = ENXIO;
746 		return rc;
747 	}
748 
749 	TASK_INIT(&ii->task, 0, isr, ii);
750 	ii->vector = vector;
751 	sprintf(ii->task_name, "oce_task[%d]", ii->vector);
752 	ii->tq = taskqueue_create_fast(ii->task_name,
753 			M_NOWAIT,
754 			taskqueue_thread_enqueue,
755 			&ii->tq);
756 	taskqueue_start_threads(&ii->tq, 1, PI_NET, "%s taskq",
757 			device_get_nameunit(sc->dev));
758 
759 	ii->sc = sc;
760 	rc = bus_setup_intr(sc->dev,
761 			ii->intr_res,
762 			INTR_TYPE_NET,
763 			oce_fast_isr, NULL, ii, &ii->tag);
764 	return rc;
765 
766 }
767 
768 
769 void
770 oce_intr_free(POCE_SOFTC sc)
771 {
772 	int i = 0;
773 
774 	for (i = 0; i < sc->intr_count; i++) {
775 
776 		if (sc->intrs[i].tag != NULL)
777 			bus_teardown_intr(sc->dev, sc->intrs[i].intr_res,
778 						sc->intrs[i].tag);
779 		if (sc->intrs[i].tq != NULL)
780 			taskqueue_free(sc->intrs[i].tq);
781 
782 		if (sc->intrs[i].intr_res != NULL)
783 			bus_release_resource(sc->dev, SYS_RES_IRQ,
784 						sc->intrs[i].irq_rr,
785 						sc->intrs[i].intr_res);
786 		sc->intrs[i].tag = NULL;
787 		sc->intrs[i].intr_res = NULL;
788 	}
789 
790 	if (sc->flags & OCE_FLAGS_USING_MSIX)
791 		pci_release_msi(sc->dev);
792 
793 }
794 
795 
796 
797 /******************************************************************************
798 *			  Media callbacks functions 			      *
799 ******************************************************************************/
800 
801 static void
802 oce_media_status(struct ifnet *ifp, struct ifmediareq *req)
803 {
804 	POCE_SOFTC sc = (POCE_SOFTC) ifp->if_softc;
805 
806 
807 	req->ifm_status = IFM_AVALID;
808 	req->ifm_active = IFM_ETHER;
809 
810 	if (sc->link_status == 1)
811 		req->ifm_status |= IFM_ACTIVE;
812 	else
813 		return;
814 
815 	switch (sc->link_speed) {
816 	case 1: /* 10 Mbps */
817 		req->ifm_active |= IFM_10_T | IFM_FDX;
818 		sc->speed = 10;
819 		break;
820 	case 2: /* 100 Mbps */
821 		req->ifm_active |= IFM_100_TX | IFM_FDX;
822 		sc->speed = 100;
823 		break;
824 	case 3: /* 1 Gbps */
825 		req->ifm_active |= IFM_1000_T | IFM_FDX;
826 		sc->speed = 1000;
827 		break;
828 	case 4: /* 10 Gbps */
829 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
830 		sc->speed = 10000;
831 		break;
832 	}
833 
834 	return;
835 }
836 
837 
838 int
839 oce_media_change(struct ifnet *ifp)
840 {
841 	return 0;
842 }
843 
844 
845 
846 
847 /*****************************************************************************
848  *			  Transmit routines functions			     *
849  *****************************************************************************/
850 
851 static int
852 oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index)
853 {
854 	int rc = 0, i, retry_cnt = 0;
855 	bus_dma_segment_t segs[OCE_MAX_TX_ELEMENTS];
856 	struct mbuf *m, *m_temp;
857 	struct oce_wq *wq = sc->wq[wq_index];
858 	struct oce_packet_desc *pd;
859 	struct oce_nic_hdr_wqe *nichdr;
860 	struct oce_nic_frag_wqe *nicfrag;
861 	int num_wqes;
862 	uint32_t reg_value;
863 	boolean_t complete = TRUE;
864 
865 	m = *mpp;
866 	if (!m)
867 		return EINVAL;
868 
869 	if (!(m->m_flags & M_PKTHDR)) {
870 		rc = ENXIO;
871 		goto free_ret;
872 	}
873 
874 	if(oce_tx_asic_stall_verify(sc, m)) {
875 		m = oce_insert_vlan_tag(sc, m, &complete);
876 		if(!m) {
877 			device_printf(sc->dev, "Insertion unsuccessful\n");
878 			return 0;
879 		}
880 
881 	}
882 
883 	if (m->m_pkthdr.csum_flags & CSUM_TSO) {
884 		/* consolidate packet buffers for TSO/LSO segment offload */
885 #if defined(INET6) || defined(INET)
886 		m = oce_tso_setup(sc, mpp);
887 #else
888 		m = NULL;
889 #endif
890 		if (m == NULL) {
891 			rc = ENXIO;
892 			goto free_ret;
893 		}
894 	}
895 
896 	pd = &wq->pckts[wq->pkt_desc_head];
897 retry:
898 	rc = bus_dmamap_load_mbuf_sg(wq->tag,
899 				     pd->map,
900 				     m, segs, &pd->nsegs, BUS_DMA_NOWAIT);
901 	if (rc == 0) {
902 		num_wqes = pd->nsegs + 1;
903 		if (IS_BE(sc) || IS_SH(sc)) {
904 			/*Dummy required only for BE3.*/
905 			if (num_wqes & 1)
906 				num_wqes++;
907 		}
908 		if (num_wqes >= RING_NUM_FREE(wq->ring)) {
909 			bus_dmamap_unload(wq->tag, pd->map);
910 			return EBUSY;
911 		}
912 		atomic_store_rel_int(&wq->pkt_desc_head,
913 				     (wq->pkt_desc_head + 1) % \
914 				      OCE_WQ_PACKET_ARRAY_SIZE);
915 		bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE);
916 		pd->mbuf = m;
917 
918 		nichdr =
919 		    RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe);
920 		nichdr->u0.dw[0] = 0;
921 		nichdr->u0.dw[1] = 0;
922 		nichdr->u0.dw[2] = 0;
923 		nichdr->u0.dw[3] = 0;
924 
925 		nichdr->u0.s.complete = complete;
926 		nichdr->u0.s.event = 1;
927 		nichdr->u0.s.crc = 1;
928 		nichdr->u0.s.forward = 0;
929 		nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0;
930 		nichdr->u0.s.udpcs =
931 			(m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0;
932 		nichdr->u0.s.tcpcs =
933 			(m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0;
934 		nichdr->u0.s.num_wqe = num_wqes;
935 		nichdr->u0.s.total_length = m->m_pkthdr.len;
936 
937 		if (m->m_flags & M_VLANTAG) {
938 			nichdr->u0.s.vlan = 1; /*Vlan present*/
939 			nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag;
940 		}
941 
942 		if (m->m_pkthdr.csum_flags & CSUM_TSO) {
943 			if (m->m_pkthdr.tso_segsz) {
944 				nichdr->u0.s.lso = 1;
945 				nichdr->u0.s.lso_mss  = m->m_pkthdr.tso_segsz;
946 			}
947 			if (!IS_BE(sc) || !IS_SH(sc))
948 				nichdr->u0.s.ipcs = 1;
949 		}
950 
951 		RING_PUT(wq->ring, 1);
952 		atomic_add_int(&wq->ring->num_used, 1);
953 
954 		for (i = 0; i < pd->nsegs; i++) {
955 			nicfrag =
956 			    RING_GET_PRODUCER_ITEM_VA(wq->ring,
957 						      struct oce_nic_frag_wqe);
958 			nicfrag->u0.s.rsvd0 = 0;
959 			nicfrag->u0.s.frag_pa_hi = ADDR_HI(segs[i].ds_addr);
960 			nicfrag->u0.s.frag_pa_lo = ADDR_LO(segs[i].ds_addr);
961 			nicfrag->u0.s.frag_len = segs[i].ds_len;
962 			pd->wqe_idx = wq->ring->pidx;
963 			RING_PUT(wq->ring, 1);
964 			atomic_add_int(&wq->ring->num_used, 1);
965 		}
966 		if (num_wqes > (pd->nsegs + 1)) {
967 			nicfrag =
968 			    RING_GET_PRODUCER_ITEM_VA(wq->ring,
969 						      struct oce_nic_frag_wqe);
970 			nicfrag->u0.dw[0] = 0;
971 			nicfrag->u0.dw[1] = 0;
972 			nicfrag->u0.dw[2] = 0;
973 			nicfrag->u0.dw[3] = 0;
974 			pd->wqe_idx = wq->ring->pidx;
975 			RING_PUT(wq->ring, 1);
976 			atomic_add_int(&wq->ring->num_used, 1);
977 			pd->nsegs++;
978 		}
979 
980 		sc->ifp->if_opackets++;
981 		wq->tx_stats.tx_reqs++;
982 		wq->tx_stats.tx_wrbs += num_wqes;
983 		wq->tx_stats.tx_bytes += m->m_pkthdr.len;
984 		wq->tx_stats.tx_pkts++;
985 
986 		bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map,
987 				BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
988 		reg_value = (num_wqes << 16) | wq->wq_id;
989 		OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value);
990 
991 	} else if (rc == EFBIG)	{
992 		if (retry_cnt == 0) {
993 			m_temp = m_defrag(m, M_NOWAIT);
994 			if (m_temp == NULL)
995 				goto free_ret;
996 			m = m_temp;
997 			*mpp = m_temp;
998 			retry_cnt = retry_cnt + 1;
999 			goto retry;
1000 		} else
1001 			goto free_ret;
1002 	} else if (rc == ENOMEM)
1003 		return rc;
1004 	else
1005 		goto free_ret;
1006 
1007 	return 0;
1008 
1009 free_ret:
1010 	m_freem(*mpp);
1011 	*mpp = NULL;
1012 	return rc;
1013 }
1014 
1015 
1016 static void
1017 oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, uint32_t status)
1018 {
1019 	struct oce_packet_desc *pd;
1020 	POCE_SOFTC sc = (POCE_SOFTC) wq->parent;
1021 	struct mbuf *m;
1022 
1023 	pd = &wq->pckts[wq->pkt_desc_tail];
1024 	atomic_store_rel_int(&wq->pkt_desc_tail,
1025 			     (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE);
1026 	atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1);
1027 	bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1028 	bus_dmamap_unload(wq->tag, pd->map);
1029 
1030 	m = pd->mbuf;
1031 	m_freem(m);
1032 	pd->mbuf = NULL;
1033 
1034 
1035 	if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) {
1036 		if (wq->ring->num_used < (wq->ring->num_items / 2)) {
1037 			sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
1038 			oce_tx_restart(sc, wq);
1039 		}
1040 	}
1041 }
1042 
1043 
1044 static void
1045 oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq)
1046 {
1047 
1048 	if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING)
1049 		return;
1050 
1051 #if __FreeBSD_version >= 800000
1052 	if (!drbr_empty(sc->ifp, wq->br))
1053 #else
1054 	if (!IFQ_DRV_IS_EMPTY(&sc->ifp->if_snd))
1055 #endif
1056 		taskqueue_enqueue_fast(taskqueue_swi, &wq->txtask);
1057 
1058 }
1059 
1060 
1061 #if defined(INET6) || defined(INET)
1062 static struct mbuf *
1063 oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp)
1064 {
1065 	struct mbuf *m;
1066 #ifdef INET
1067 	struct ip *ip;
1068 #endif
1069 #ifdef INET6
1070 	struct ip6_hdr *ip6;
1071 #endif
1072 	struct ether_vlan_header *eh;
1073 	struct tcphdr *th;
1074 	uint16_t etype;
1075 	int total_len = 0, ehdrlen = 0;
1076 
1077 	m = *mpp;
1078 
1079 	if (M_WRITABLE(m) == 0) {
1080 		m = m_dup(*mpp, M_NOWAIT);
1081 		if (!m)
1082 			return NULL;
1083 		m_freem(*mpp);
1084 		*mpp = m;
1085 	}
1086 
1087 	eh = mtod(m, struct ether_vlan_header *);
1088 	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
1089 		etype = ntohs(eh->evl_proto);
1090 		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
1091 	} else {
1092 		etype = ntohs(eh->evl_encap_proto);
1093 		ehdrlen = ETHER_HDR_LEN;
1094 	}
1095 
1096 	switch (etype) {
1097 #ifdef INET
1098 	case ETHERTYPE_IP:
1099 		ip = (struct ip *)(m->m_data + ehdrlen);
1100 		if (ip->ip_p != IPPROTO_TCP)
1101 			return NULL;
1102 		th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
1103 
1104 		total_len = ehdrlen + (ip->ip_hl << 2) + (th->th_off << 2);
1105 		break;
1106 #endif
1107 #ifdef INET6
1108 	case ETHERTYPE_IPV6:
1109 		ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen);
1110 		if (ip6->ip6_nxt != IPPROTO_TCP)
1111 			return NULL;
1112 		th = (struct tcphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
1113 
1114 		total_len = ehdrlen + sizeof(struct ip6_hdr) + (th->th_off << 2);
1115 		break;
1116 #endif
1117 	default:
1118 		return NULL;
1119 	}
1120 
1121 	m = m_pullup(m, total_len);
1122 	if (!m)
1123 		return NULL;
1124 	*mpp = m;
1125 	return m;
1126 
1127 }
1128 #endif /* INET6 || INET */
1129 
1130 void
1131 oce_tx_task(void *arg, int npending)
1132 {
1133 	struct oce_wq *wq = arg;
1134 	POCE_SOFTC sc = wq->parent;
1135 	struct ifnet *ifp = sc->ifp;
1136 	int rc = 0;
1137 
1138 #if __FreeBSD_version >= 800000
1139 	LOCK(&wq->tx_lock);
1140 	rc = oce_multiq_transmit(ifp, NULL, wq);
1141 	if (rc) {
1142 		device_printf(sc->dev,
1143 				"TX[%d] restart failed\n", wq->queue_index);
1144 	}
1145 	UNLOCK(&wq->tx_lock);
1146 #else
1147 	oce_start(ifp);
1148 #endif
1149 
1150 }
1151 
1152 
1153 void
1154 oce_start(struct ifnet *ifp)
1155 {
1156 	POCE_SOFTC sc = ifp->if_softc;
1157 	struct mbuf *m;
1158 	int rc = 0;
1159 	int def_q = 0; /* Defualt tx queue is 0*/
1160 
1161 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1162 			IFF_DRV_RUNNING)
1163 		return;
1164 
1165 	if (!sc->link_status)
1166 		return;
1167 
1168 	do {
1169 		IF_DEQUEUE(&sc->ifp->if_snd, m);
1170 		if (m == NULL)
1171 			break;
1172 
1173 		LOCK(&sc->wq[def_q]->tx_lock);
1174 		rc = oce_tx(sc, &m, def_q);
1175 		UNLOCK(&sc->wq[def_q]->tx_lock);
1176 		if (rc) {
1177 			if (m != NULL) {
1178 				sc->wq[def_q]->tx_stats.tx_stops ++;
1179 				ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1180 				IFQ_DRV_PREPEND(&ifp->if_snd, m);
1181 				m = NULL;
1182 			}
1183 			break;
1184 		}
1185 		if (m != NULL)
1186 			ETHER_BPF_MTAP(ifp, m);
1187 
1188 	} while (TRUE);
1189 
1190 	return;
1191 }
1192 
1193 
1194 /* Handle the Completion Queue for transmit */
1195 uint16_t
1196 oce_wq_handler(void *arg)
1197 {
1198 	struct oce_wq *wq = (struct oce_wq *)arg;
1199 	POCE_SOFTC sc = wq->parent;
1200 	struct oce_cq *cq = wq->cq;
1201 	struct oce_nic_tx_cqe *cqe;
1202 	int num_cqes = 0;
1203 
1204 	bus_dmamap_sync(cq->ring->dma.tag,
1205 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1206 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1207 	while (cqe->u0.dw[3]) {
1208 		DW_SWAP((uint32_t *) cqe, sizeof(oce_wq_cqe));
1209 
1210 		wq->ring->cidx = cqe->u0.s.wqe_index + 1;
1211 		if (wq->ring->cidx >= wq->ring->num_items)
1212 			wq->ring->cidx -= wq->ring->num_items;
1213 
1214 		oce_tx_complete(wq, cqe->u0.s.wqe_index, cqe->u0.s.status);
1215 		wq->tx_stats.tx_compl++;
1216 		cqe->u0.dw[3] = 0;
1217 		RING_GET(cq->ring, 1);
1218 		bus_dmamap_sync(cq->ring->dma.tag,
1219 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1220 		cqe =
1221 		    RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1222 		num_cqes++;
1223 	}
1224 
1225 	if (num_cqes)
1226 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1227 
1228 	return 0;
1229 }
1230 
1231 
1232 #if __FreeBSD_version >= 1000000
1233 static __inline void
1234 drbr_stats_update(struct ifnet *ifp, int len, int mflags)
1235 {
1236 #ifndef NO_SLOW_STATS
1237 	ifp->if_obytes += len;
1238 	if (mflags & M_MCAST)
1239 		ifp->if_omcasts++;
1240 #endif
1241 }
1242 #endif
1243 
1244 static int
1245 oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, struct oce_wq *wq)
1246 {
1247 	POCE_SOFTC sc = ifp->if_softc;
1248 	int status = 0, queue_index = 0;
1249 	struct mbuf *next = NULL;
1250 	struct buf_ring *br = NULL;
1251 
1252 	br  = wq->br;
1253 	queue_index = wq->queue_index;
1254 
1255 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1256 		IFF_DRV_RUNNING) {
1257 		if (m != NULL)
1258 			status = drbr_enqueue(ifp, br, m);
1259 		return status;
1260 	}
1261 
1262 	if (m != NULL) {
1263 		if ((status = drbr_enqueue(ifp, br, m)) != 0)
1264 			return status;
1265 	}
1266 	while ((next = drbr_peek(ifp, br)) != NULL) {
1267 		if (oce_tx(sc, &next, queue_index)) {
1268 			if (next == NULL) {
1269 				drbr_advance(ifp, br);
1270 			} else {
1271 				drbr_putback(ifp, br, next);
1272 				wq->tx_stats.tx_stops ++;
1273 				ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1274 				status = drbr_enqueue(ifp, br, next);
1275 			}
1276 			break;
1277 		}
1278 		drbr_advance(ifp, br);
1279 		ifp->if_obytes += next->m_pkthdr.len;
1280 		if (next->m_flags & M_MCAST)
1281 			ifp->if_omcasts++;
1282 		ETHER_BPF_MTAP(ifp, next);
1283 	}
1284 
1285 	return status;
1286 }
1287 
1288 
1289 
1290 
1291 /*****************************************************************************
1292  *			    Receive  routines functions 		     *
1293  *****************************************************************************/
1294 
1295 static void
1296 oce_rx(struct oce_rq *rq, uint32_t rqe_idx, struct oce_nic_rx_cqe *cqe)
1297 {
1298 	uint32_t out;
1299 	struct oce_packet_desc *pd;
1300 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1301 	int i, len, frag_len;
1302 	struct mbuf *m = NULL, *tail = NULL;
1303 	uint16_t vtag;
1304 
1305 	len = cqe->u0.s.pkt_size;
1306 	if (!len) {
1307 		/*partial DMA workaround for Lancer*/
1308 		oce_discard_rx_comp(rq, cqe);
1309 		goto exit;
1310 	}
1311 
1312 	 /* Get vlan_tag value */
1313 	if(IS_BE(sc) || IS_SH(sc))
1314 		vtag = BSWAP_16(cqe->u0.s.vlan_tag);
1315 	else
1316 		vtag = cqe->u0.s.vlan_tag;
1317 
1318 
1319 	for (i = 0; i < cqe->u0.s.num_fragments; i++) {
1320 
1321 		if (rq->packets_out == rq->packets_in) {
1322 			device_printf(sc->dev,
1323 				  "RQ transmit descriptor missing\n");
1324 		}
1325 		out = rq->packets_out + 1;
1326 		if (out == OCE_RQ_PACKET_ARRAY_SIZE)
1327 			out = 0;
1328 		pd = &rq->pckts[rq->packets_out];
1329 		rq->packets_out = out;
1330 
1331 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1332 		bus_dmamap_unload(rq->tag, pd->map);
1333 		rq->pending--;
1334 
1335 		frag_len = (len > rq->cfg.frag_size) ? rq->cfg.frag_size : len;
1336 		pd->mbuf->m_len = frag_len;
1337 
1338 		if (tail != NULL) {
1339 			/* additional fragments */
1340 			pd->mbuf->m_flags &= ~M_PKTHDR;
1341 			tail->m_next = pd->mbuf;
1342 			tail = pd->mbuf;
1343 		} else {
1344 			/* first fragment, fill out much of the packet header */
1345 			pd->mbuf->m_pkthdr.len = len;
1346 			pd->mbuf->m_pkthdr.csum_flags = 0;
1347 			if (IF_CSUM_ENABLED(sc)) {
1348 				if (cqe->u0.s.l4_cksum_pass) {
1349 					pd->mbuf->m_pkthdr.csum_flags |=
1350 					    (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1351 					pd->mbuf->m_pkthdr.csum_data = 0xffff;
1352 				}
1353 				if (cqe->u0.s.ip_cksum_pass) {
1354 					if (!cqe->u0.s.ip_ver) { /* IPV4 */
1355 						pd->mbuf->m_pkthdr.csum_flags |=
1356 						(CSUM_IP_CHECKED|CSUM_IP_VALID);
1357 					}
1358 				}
1359 			}
1360 			m = tail = pd->mbuf;
1361 		}
1362 		pd->mbuf = NULL;
1363 		len -= frag_len;
1364 	}
1365 
1366 	if (m) {
1367 		if (!oce_cqe_portid_valid(sc, cqe)) {
1368 			 m_freem(m);
1369 			 goto exit;
1370 		}
1371 
1372 		m->m_pkthdr.rcvif = sc->ifp;
1373 #if __FreeBSD_version >= 800000
1374 		if (rq->queue_index)
1375 			m->m_pkthdr.flowid = (rq->queue_index - 1);
1376 		else
1377 			m->m_pkthdr.flowid = rq->queue_index;
1378 		m->m_flags |= M_FLOWID;
1379 #endif
1380 		/* This deternies if vlan tag is Valid */
1381 		if (oce_cqe_vtp_valid(sc, cqe)) {
1382 			if (sc->function_mode & FNM_FLEX10_MODE) {
1383 				/* FLEX10. If QnQ is not set, neglect VLAN */
1384 				if (cqe->u0.s.qnq) {
1385 					m->m_pkthdr.ether_vtag = vtag;
1386 					m->m_flags |= M_VLANTAG;
1387 				}
1388 			} else if (sc->pvid != (vtag & VLAN_VID_MASK))  {
1389 				/* In UMC mode generally pvid will be striped by
1390 				   hw. But in some cases we have seen it comes
1391 				   with pvid. So if pvid == vlan, neglect vlan.
1392 				*/
1393 				m->m_pkthdr.ether_vtag = vtag;
1394 				m->m_flags |= M_VLANTAG;
1395 			}
1396 		}
1397 
1398 		sc->ifp->if_ipackets++;
1399 #if defined(INET6) || defined(INET)
1400 		/* Try to queue to LRO */
1401 		if (IF_LRO_ENABLED(sc) &&
1402 		    (cqe->u0.s.ip_cksum_pass) &&
1403 		    (cqe->u0.s.l4_cksum_pass) &&
1404 		    (!cqe->u0.s.ip_ver)       &&
1405 		    (rq->lro.lro_cnt != 0)) {
1406 
1407 			if (tcp_lro_rx(&rq->lro, m, 0) == 0) {
1408 				rq->lro_pkts_queued ++;
1409 				goto post_done;
1410 			}
1411 			/* If LRO posting fails then try to post to STACK */
1412 		}
1413 #endif
1414 
1415 		(*sc->ifp->if_input) (sc->ifp, m);
1416 #if defined(INET6) || defined(INET)
1417 post_done:
1418 #endif
1419 		/* Update rx stats per queue */
1420 		rq->rx_stats.rx_pkts++;
1421 		rq->rx_stats.rx_bytes += cqe->u0.s.pkt_size;
1422 		rq->rx_stats.rx_frags += cqe->u0.s.num_fragments;
1423 		if (cqe->u0.s.pkt_type == OCE_MULTICAST_PACKET)
1424 			rq->rx_stats.rx_mcast_pkts++;
1425 		if (cqe->u0.s.pkt_type == OCE_UNICAST_PACKET)
1426 			rq->rx_stats.rx_ucast_pkts++;
1427 	}
1428 exit:
1429 	return;
1430 }
1431 
1432 
1433 static void
1434 oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe)
1435 {
1436 	uint32_t out, i = 0;
1437 	struct oce_packet_desc *pd;
1438 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1439 	int num_frags = cqe->u0.s.num_fragments;
1440 
1441 	for (i = 0; i < num_frags; i++) {
1442 		if (rq->packets_out == rq->packets_in) {
1443 			device_printf(sc->dev,
1444 				"RQ transmit descriptor missing\n");
1445 		}
1446 		out = rq->packets_out + 1;
1447 		if (out == OCE_RQ_PACKET_ARRAY_SIZE)
1448 			out = 0;
1449 		pd = &rq->pckts[rq->packets_out];
1450 		rq->packets_out = out;
1451 
1452 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1453 		bus_dmamap_unload(rq->tag, pd->map);
1454 		rq->pending--;
1455 		m_freem(pd->mbuf);
1456 	}
1457 
1458 }
1459 
1460 
1461 static int
1462 oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1463 {
1464 	struct oce_nic_rx_cqe_v1 *cqe_v1;
1465 	int vtp = 0;
1466 
1467 	if (sc->be3_native) {
1468 		cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1469 		vtp =  cqe_v1->u0.s.vlan_tag_present;
1470 	} else
1471 		vtp = cqe->u0.s.vlan_tag_present;
1472 
1473 	return vtp;
1474 
1475 }
1476 
1477 
1478 static int
1479 oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1480 {
1481 	struct oce_nic_rx_cqe_v1 *cqe_v1;
1482 	int port_id = 0;
1483 
1484 	if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) {
1485 		cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1486 		port_id =  cqe_v1->u0.s.port;
1487 		if (sc->port_id != port_id)
1488 			return 0;
1489 	} else
1490 		;/* For BE3 legacy and Lancer this is dummy */
1491 
1492 	return 1;
1493 
1494 }
1495 
1496 #if defined(INET6) || defined(INET)
1497 static void
1498 oce_rx_flush_lro(struct oce_rq *rq)
1499 {
1500 	struct lro_ctrl	*lro = &rq->lro;
1501 	struct lro_entry *queued;
1502 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1503 
1504 	if (!IF_LRO_ENABLED(sc))
1505 		return;
1506 
1507 	while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) {
1508 		SLIST_REMOVE_HEAD(&lro->lro_active, next);
1509 		tcp_lro_flush(lro, queued);
1510 	}
1511 	rq->lro_pkts_queued = 0;
1512 
1513 	return;
1514 }
1515 
1516 
1517 static int
1518 oce_init_lro(POCE_SOFTC sc)
1519 {
1520 	struct lro_ctrl *lro = NULL;
1521 	int i = 0, rc = 0;
1522 
1523 	for (i = 0; i < sc->nrqs; i++) {
1524 		lro = &sc->rq[i]->lro;
1525 		rc = tcp_lro_init(lro);
1526 		if (rc != 0) {
1527 			device_printf(sc->dev, "LRO init failed\n");
1528 			return rc;
1529 		}
1530 		lro->ifp = sc->ifp;
1531 	}
1532 
1533 	return rc;
1534 }
1535 
1536 
1537 void
1538 oce_free_lro(POCE_SOFTC sc)
1539 {
1540 	struct lro_ctrl *lro = NULL;
1541 	int i = 0;
1542 
1543 	for (i = 0; i < sc->nrqs; i++) {
1544 		lro = &sc->rq[i]->lro;
1545 		if (lro)
1546 			tcp_lro_free(lro);
1547 	}
1548 }
1549 #endif
1550 
1551 int
1552 oce_alloc_rx_bufs(struct oce_rq *rq, int count)
1553 {
1554 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1555 	int i, in, rc;
1556 	struct oce_packet_desc *pd;
1557 	bus_dma_segment_t segs[6];
1558 	int nsegs, added = 0;
1559 	struct oce_nic_rqe *rqe;
1560 	pd_rxulp_db_t rxdb_reg;
1561 
1562 	bzero(&rxdb_reg, sizeof(pd_rxulp_db_t));
1563 	for (i = 0; i < count; i++) {
1564 		in = rq->packets_in + 1;
1565 		if (in == OCE_RQ_PACKET_ARRAY_SIZE)
1566 			in = 0;
1567 		if (in == rq->packets_out)
1568 			break;	/* no more room */
1569 
1570 		pd = &rq->pckts[rq->packets_in];
1571 		pd->mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1572 		if (pd->mbuf == NULL)
1573 			break;
1574 
1575 		pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = MCLBYTES;
1576 		rc = bus_dmamap_load_mbuf_sg(rq->tag,
1577 					     pd->map,
1578 					     pd->mbuf,
1579 					     segs, &nsegs, BUS_DMA_NOWAIT);
1580 		if (rc) {
1581 			m_free(pd->mbuf);
1582 			break;
1583 		}
1584 
1585 		if (nsegs != 1) {
1586 			i--;
1587 			continue;
1588 		}
1589 
1590 		rq->packets_in = in;
1591 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_PREREAD);
1592 
1593 		rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe);
1594 		rqe->u0.s.frag_pa_hi = ADDR_HI(segs[0].ds_addr);
1595 		rqe->u0.s.frag_pa_lo = ADDR_LO(segs[0].ds_addr);
1596 		DW_SWAP(u32ptr(rqe), sizeof(struct oce_nic_rqe));
1597 		RING_PUT(rq->ring, 1);
1598 		added++;
1599 		rq->pending++;
1600 	}
1601 	if (added != 0) {
1602 		for (i = added / OCE_MAX_RQ_POSTS; i > 0; i--) {
1603 			rxdb_reg.bits.num_posted = OCE_MAX_RQ_POSTS;
1604 			rxdb_reg.bits.qid = rq->rq_id;
1605 			OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1606 			added -= OCE_MAX_RQ_POSTS;
1607 		}
1608 		if (added > 0) {
1609 			rxdb_reg.bits.qid = rq->rq_id;
1610 			rxdb_reg.bits.num_posted = added;
1611 			OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1612 		}
1613 	}
1614 
1615 	return 0;
1616 }
1617 
1618 
1619 /* Handle the Completion Queue for receive */
1620 uint16_t
1621 oce_rq_handler(void *arg)
1622 {
1623 	struct oce_rq *rq = (struct oce_rq *)arg;
1624 	struct oce_cq *cq = rq->cq;
1625 	POCE_SOFTC sc = rq->parent;
1626 	struct oce_nic_rx_cqe *cqe;
1627 	int num_cqes = 0, rq_buffers_used = 0;
1628 
1629 
1630 	bus_dmamap_sync(cq->ring->dma.tag,
1631 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1632 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
1633 	while (cqe->u0.dw[2]) {
1634 		DW_SWAP((uint32_t *) cqe, sizeof(oce_rq_cqe));
1635 
1636 		RING_GET(rq->ring, 1);
1637 		if (cqe->u0.s.error == 0) {
1638 			oce_rx(rq, cqe->u0.s.frag_index, cqe);
1639 		} else {
1640 			rq->rx_stats.rxcp_err++;
1641 			sc->ifp->if_ierrors++;
1642 			/* Post L3/L4 errors to stack.*/
1643 			oce_rx(rq, cqe->u0.s.frag_index, cqe);
1644 		}
1645 		rq->rx_stats.rx_compl++;
1646 		cqe->u0.dw[2] = 0;
1647 
1648 #if defined(INET6) || defined(INET)
1649 		if (IF_LRO_ENABLED(sc) && rq->lro_pkts_queued >= 16) {
1650 			oce_rx_flush_lro(rq);
1651 		}
1652 #endif
1653 
1654 		RING_GET(cq->ring, 1);
1655 		bus_dmamap_sync(cq->ring->dma.tag,
1656 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1657 		cqe =
1658 		    RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
1659 		num_cqes++;
1660 		if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled))
1661 			break;
1662 	}
1663 
1664 #if defined(INET6) || defined(INET)
1665 	if (IF_LRO_ENABLED(sc))
1666 		oce_rx_flush_lro(rq);
1667 #endif
1668 
1669 	if (num_cqes) {
1670 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1671 		rq_buffers_used = OCE_RQ_PACKET_ARRAY_SIZE - rq->pending;
1672 		if (rq_buffers_used > 1)
1673 			oce_alloc_rx_bufs(rq, (rq_buffers_used - 1));
1674 	}
1675 
1676 	return 0;
1677 
1678 }
1679 
1680 
1681 
1682 
1683 /*****************************************************************************
1684  *		   Helper function prototypes in this file 		     *
1685  *****************************************************************************/
1686 
1687 static int
1688 oce_attach_ifp(POCE_SOFTC sc)
1689 {
1690 
1691 	sc->ifp = if_alloc(IFT_ETHER);
1692 	if (!sc->ifp)
1693 		return ENOMEM;
1694 
1695 	ifmedia_init(&sc->media, IFM_IMASK, oce_media_change, oce_media_status);
1696 	ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1697 	ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
1698 
1699 	sc->ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST;
1700 	sc->ifp->if_ioctl = oce_ioctl;
1701 	sc->ifp->if_start = oce_start;
1702 	sc->ifp->if_init = oce_init;
1703 	sc->ifp->if_mtu = ETHERMTU;
1704 	sc->ifp->if_softc = sc;
1705 #if __FreeBSD_version >= 800000
1706 	sc->ifp->if_transmit = oce_multiq_start;
1707 	sc->ifp->if_qflush = oce_multiq_flush;
1708 #endif
1709 
1710 	if_initname(sc->ifp,
1711 		    device_get_name(sc->dev), device_get_unit(sc->dev));
1712 
1713 	sc->ifp->if_snd.ifq_drv_maxlen = OCE_MAX_TX_DESC - 1;
1714 	IFQ_SET_MAXLEN(&sc->ifp->if_snd, sc->ifp->if_snd.ifq_drv_maxlen);
1715 	IFQ_SET_READY(&sc->ifp->if_snd);
1716 
1717 	sc->ifp->if_hwassist = OCE_IF_HWASSIST;
1718 	sc->ifp->if_hwassist |= CSUM_TSO;
1719 	sc->ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP);
1720 
1721 	sc->ifp->if_capabilities = OCE_IF_CAPABILITIES;
1722 	sc->ifp->if_capabilities |= IFCAP_HWCSUM;
1723 	sc->ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
1724 
1725 #if defined(INET6) || defined(INET)
1726 	sc->ifp->if_capabilities |= IFCAP_TSO;
1727 	sc->ifp->if_capabilities |= IFCAP_LRO;
1728 	sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO;
1729 #endif
1730 
1731 	sc->ifp->if_capenable = sc->ifp->if_capabilities;
1732 	if_initbaudrate(sc->ifp, IF_Gbps(10));
1733 
1734 #if __FreeBSD_version >= 1000000
1735 	sc->ifp->if_hw_tsomax = OCE_MAX_TSO_SIZE;
1736 #endif
1737 
1738 	ether_ifattach(sc->ifp, sc->macaddr.mac_addr);
1739 
1740 	return 0;
1741 }
1742 
1743 
1744 static void
1745 oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1746 {
1747 	POCE_SOFTC sc = ifp->if_softc;
1748 
1749 	if (ifp->if_softc !=  arg)
1750 		return;
1751 	if ((vtag == 0) || (vtag > 4095))
1752 		return;
1753 
1754 	sc->vlan_tag[vtag] = 1;
1755 	sc->vlans_added++;
1756 	if (sc->vlans_added <= (sc->max_vlans + 1))
1757 		oce_vid_config(sc);
1758 }
1759 
1760 
1761 static void
1762 oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1763 {
1764 	POCE_SOFTC sc = ifp->if_softc;
1765 
1766 	if (ifp->if_softc !=  arg)
1767 		return;
1768 	if ((vtag == 0) || (vtag > 4095))
1769 		return;
1770 
1771 	sc->vlan_tag[vtag] = 0;
1772 	sc->vlans_added--;
1773 	oce_vid_config(sc);
1774 }
1775 
1776 
1777 /*
1778  * A max of 64 vlans can be configured in BE. If the user configures
1779  * more, place the card in vlan promiscuous mode.
1780  */
1781 static int
1782 oce_vid_config(POCE_SOFTC sc)
1783 {
1784 	struct normal_vlan vtags[MAX_VLANFILTER_SIZE];
1785 	uint16_t ntags = 0, i;
1786 	int status = 0;
1787 
1788 	if ((sc->vlans_added <= MAX_VLANFILTER_SIZE) &&
1789 			(sc->ifp->if_capenable & IFCAP_VLAN_HWFILTER)) {
1790 		for (i = 0; i < MAX_VLANS; i++) {
1791 			if (sc->vlan_tag[i]) {
1792 				vtags[ntags].vtag = i;
1793 				ntags++;
1794 			}
1795 		}
1796 		if (ntags)
1797 			status = oce_config_vlan(sc, (uint8_t) sc->if_id,
1798 						vtags, ntags, 1, 0);
1799 	} else
1800 		status = oce_config_vlan(sc, (uint8_t) sc->if_id,
1801 					 	NULL, 0, 1, 1);
1802 	return status;
1803 }
1804 
1805 
1806 static void
1807 oce_mac_addr_set(POCE_SOFTC sc)
1808 {
1809 	uint32_t old_pmac_id = sc->pmac_id;
1810 	int status = 0;
1811 
1812 
1813 	status = bcmp((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
1814 			 sc->macaddr.size_of_struct);
1815 	if (!status)
1816 		return;
1817 
1818 	status = oce_mbox_macaddr_add(sc, (uint8_t *)(IF_LLADDR(sc->ifp)),
1819 					sc->if_id, &sc->pmac_id);
1820 	if (!status) {
1821 		status = oce_mbox_macaddr_del(sc, sc->if_id, old_pmac_id);
1822 		bcopy((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
1823 				 sc->macaddr.size_of_struct);
1824 	}
1825 	if (status)
1826 		device_printf(sc->dev, "Failed update macaddress\n");
1827 
1828 }
1829 
1830 
1831 static int
1832 oce_handle_passthrough(struct ifnet *ifp, caddr_t data)
1833 {
1834 	POCE_SOFTC sc = ifp->if_softc;
1835 	struct ifreq *ifr = (struct ifreq *)data;
1836 	int rc = ENXIO;
1837 	char cookie[32] = {0};
1838 	void *priv_data = (void *)ifr->ifr_data;
1839 	void *ioctl_ptr;
1840 	uint32_t req_size;
1841 	struct mbx_hdr req;
1842 	OCE_DMA_MEM dma_mem;
1843 	struct mbx_common_get_cntl_attr *fw_cmd;
1844 
1845 	if (copyin(priv_data, cookie, strlen(IOCTL_COOKIE)))
1846 		return EFAULT;
1847 
1848 	if (memcmp(cookie, IOCTL_COOKIE, strlen(IOCTL_COOKIE)))
1849 		return EINVAL;
1850 
1851 	ioctl_ptr = (char *)priv_data + strlen(IOCTL_COOKIE);
1852 	if (copyin(ioctl_ptr, &req, sizeof(struct mbx_hdr)))
1853 		return EFAULT;
1854 
1855 	req_size = le32toh(req.u0.req.request_length);
1856 	if (req_size > 65536)
1857 		return EINVAL;
1858 
1859 	req_size += sizeof(struct mbx_hdr);
1860 	rc = oce_dma_alloc(sc, req_size, &dma_mem, 0);
1861 	if (rc)
1862 		return ENOMEM;
1863 
1864 	if (copyin(ioctl_ptr, OCE_DMAPTR(&dma_mem,char), req_size)) {
1865 		rc = EFAULT;
1866 		goto dma_free;
1867 	}
1868 
1869 	rc = oce_pass_through_mbox(sc, &dma_mem, req_size);
1870 	if (rc) {
1871 		rc = EIO;
1872 		goto dma_free;
1873 	}
1874 
1875 	if (copyout(OCE_DMAPTR(&dma_mem,char), ioctl_ptr, req_size))
1876 		rc =  EFAULT;
1877 
1878 	/*
1879 	   firmware is filling all the attributes for this ioctl except
1880 	   the driver version..so fill it
1881 	 */
1882 	if(req.u0.rsp.opcode == OPCODE_COMMON_GET_CNTL_ATTRIBUTES) {
1883 		fw_cmd = (struct mbx_common_get_cntl_attr *) ioctl_ptr;
1884 		strncpy(fw_cmd->params.rsp.cntl_attr_info.hba_attr.drv_ver_str,
1885 			COMPONENT_REVISION, strlen(COMPONENT_REVISION));
1886 	}
1887 
1888 dma_free:
1889 	oce_dma_free(sc, &dma_mem);
1890 	return rc;
1891 
1892 }
1893 
1894 static void
1895 oce_eqd_set_periodic(POCE_SOFTC sc)
1896 {
1897 	struct oce_set_eqd set_eqd[OCE_MAX_EQ];
1898 	struct oce_aic_obj *aic;
1899 	struct oce_eq *eqo;
1900 	uint64_t now = 0, delta;
1901 	int eqd, i, num = 0;
1902 	uint32_t ips = 0;
1903 	int tps;
1904 
1905 	for (i = 0 ; i < sc->neqs; i++) {
1906 		eqo = sc->eq[i];
1907 		aic = &sc->aic_obj[i];
1908 		/* When setting the static eq delay from the user space */
1909 		if (!aic->enable) {
1910 			eqd = aic->et_eqd;
1911 			goto modify_eqd;
1912 		}
1913 
1914 		now = ticks;
1915 
1916 		/* Over flow check */
1917 		if ((now < aic->ticks) || (eqo->intr < aic->intr_prev))
1918 			goto done;
1919 
1920 		delta = now - aic->ticks;
1921 		tps = delta/hz;
1922 
1923 		/* Interrupt rate based on elapsed ticks */
1924 		if(tps)
1925 			ips = (uint32_t)(eqo->intr - aic->intr_prev) / tps;
1926 
1927 		if (ips > INTR_RATE_HWM)
1928 			eqd = aic->cur_eqd + 20;
1929 		else if (ips < INTR_RATE_LWM)
1930 			eqd = aic->cur_eqd / 2;
1931 		else
1932 			goto done;
1933 
1934 		if (eqd < 10)
1935 			eqd = 0;
1936 
1937 		/* Make sure that the eq delay is in the known range */
1938 		eqd = min(eqd, aic->max_eqd);
1939 		eqd = max(eqd, aic->min_eqd);
1940 
1941 modify_eqd:
1942 		if (eqd != aic->cur_eqd) {
1943 			set_eqd[num].delay_multiplier = (eqd * 65)/100;
1944 			set_eqd[num].eq_id = eqo->eq_id;
1945 			aic->cur_eqd = eqd;
1946 			num++;
1947 		}
1948 done:
1949 		aic->intr_prev = eqo->intr;
1950 		aic->ticks = now;
1951 	}
1952 
1953 	/* Is there atleast one eq that needs to be modified? */
1954 	if(num)
1955 		oce_mbox_eqd_modify_periodic(sc, set_eqd, num);
1956 
1957 }
1958 
1959 static void oce_detect_hw_error(POCE_SOFTC sc)
1960 {
1961 
1962 	uint32_t ue_low = 0, ue_high = 0, ue_low_mask = 0, ue_high_mask = 0;
1963 	uint32_t sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
1964 	uint32_t i;
1965 
1966 	if (sc->hw_error)
1967 		return;
1968 
1969 	if (IS_XE201(sc)) {
1970 		sliport_status = OCE_READ_REG32(sc, db, SLIPORT_STATUS_OFFSET);
1971 		if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1972 			sliport_err1 = OCE_READ_REG32(sc, db, SLIPORT_ERROR1_OFFSET);
1973 			sliport_err2 = OCE_READ_REG32(sc, db, SLIPORT_ERROR2_OFFSET);
1974 		}
1975 	} else {
1976 		ue_low = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW);
1977 		ue_high = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HIGH);
1978 		ue_low_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW_MASK);
1979 		ue_high_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HI_MASK);
1980 
1981 		ue_low = (ue_low & ~ue_low_mask);
1982 		ue_high = (ue_high & ~ue_high_mask);
1983 	}
1984 
1985 	/* On certain platforms BE hardware can indicate spurious UEs.
1986 	 * Allow the h/w to stop working completely in case of a real UE.
1987 	 * Hence not setting the hw_error for UE detection.
1988 	 */
1989 	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1990 		sc->hw_error = TRUE;
1991 		device_printf(sc->dev, "Error detected in the card\n");
1992 	}
1993 
1994 	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1995 		device_printf(sc->dev,
1996 				"ERR: sliport status 0x%x\n", sliport_status);
1997 		device_printf(sc->dev,
1998 				"ERR: sliport error1 0x%x\n", sliport_err1);
1999 		device_printf(sc->dev,
2000 				"ERR: sliport error2 0x%x\n", sliport_err2);
2001 	}
2002 
2003 	if (ue_low) {
2004 		for (i = 0; ue_low; ue_low >>= 1, i++) {
2005 			if (ue_low & 1)
2006 				device_printf(sc->dev, "UE: %s bit set\n",
2007 							ue_status_low_desc[i]);
2008 		}
2009 	}
2010 
2011 	if (ue_high) {
2012 		for (i = 0; ue_high; ue_high >>= 1, i++) {
2013 			if (ue_high & 1)
2014 				device_printf(sc->dev, "UE: %s bit set\n",
2015 							ue_status_hi_desc[i]);
2016 		}
2017 	}
2018 
2019 }
2020 
2021 
2022 static void
2023 oce_local_timer(void *arg)
2024 {
2025 	POCE_SOFTC sc = arg;
2026 	int i = 0;
2027 
2028 	oce_detect_hw_error(sc);
2029 	oce_refresh_nic_stats(sc);
2030 	oce_refresh_queue_stats(sc);
2031 	oce_mac_addr_set(sc);
2032 
2033 	/* TX Watch Dog*/
2034 	for (i = 0; i < sc->nwqs; i++)
2035 		oce_tx_restart(sc, sc->wq[i]);
2036 
2037 	/* calculate and set the eq delay for optimal interrupt rate */
2038 	if (IS_BE(sc) || IS_SH(sc))
2039 		oce_eqd_set_periodic(sc);
2040 
2041 	callout_reset(&sc->timer, hz, oce_local_timer, sc);
2042 }
2043 
2044 
2045 /* NOTE : This should only be called holding
2046  *        DEVICE_LOCK.
2047  */
2048 static void
2049 oce_if_deactivate(POCE_SOFTC sc)
2050 {
2051 	int i, mtime = 0;
2052 	int wait_req = 0;
2053 	struct oce_rq *rq;
2054 	struct oce_wq *wq;
2055 	struct oce_eq *eq;
2056 
2057 	sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2058 
2059 	/*Wait for max of 400ms for TX completions to be done */
2060 	while (mtime < 400) {
2061 		wait_req = 0;
2062 		for_all_wq_queues(sc, wq, i) {
2063 			if (wq->ring->num_used) {
2064 				wait_req = 1;
2065 				DELAY(1);
2066 				break;
2067 			}
2068 		}
2069 		mtime += 1;
2070 		if (!wait_req)
2071 			break;
2072 	}
2073 
2074 	/* Stop intrs and finish any bottom halves pending */
2075 	oce_hw_intr_disable(sc);
2076 
2077 	/* Since taskqueue_drain takes a Gaint Lock, We should not acquire
2078 	   any other lock. So unlock device lock and require after
2079 	   completing taskqueue_drain.
2080 	*/
2081 	UNLOCK(&sc->dev_lock);
2082 	for (i = 0; i < sc->intr_count; i++) {
2083 		if (sc->intrs[i].tq != NULL) {
2084 			taskqueue_drain(sc->intrs[i].tq, &sc->intrs[i].task);
2085 		}
2086 	}
2087 	LOCK(&sc->dev_lock);
2088 
2089 	/* Delete RX queue in card with flush param */
2090 	oce_stop_rx(sc);
2091 
2092 	/* Invalidate any pending cq and eq entries*/
2093 	for_all_evnt_queues(sc, eq, i)
2094 		oce_drain_eq(eq);
2095 	for_all_rq_queues(sc, rq, i)
2096 		oce_drain_rq_cq(rq);
2097 	for_all_wq_queues(sc, wq, i)
2098 		oce_drain_wq_cq(wq);
2099 
2100 	/* But still we need to get MCC aync events.
2101 	   So enable intrs and also arm first EQ
2102 	*/
2103 	oce_hw_intr_enable(sc);
2104 	oce_arm_eq(sc, sc->eq[0]->eq_id, 0, TRUE, FALSE);
2105 
2106 	DELAY(10);
2107 }
2108 
2109 
2110 static void
2111 oce_if_activate(POCE_SOFTC sc)
2112 {
2113 	struct oce_eq *eq;
2114 	struct oce_rq *rq;
2115 	struct oce_wq *wq;
2116 	int i, rc = 0;
2117 
2118 	sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;
2119 
2120 	oce_hw_intr_disable(sc);
2121 
2122 	oce_start_rx(sc);
2123 
2124 	for_all_rq_queues(sc, rq, i) {
2125 		rc = oce_start_rq(rq);
2126 		if (rc)
2127 			device_printf(sc->dev, "Unable to start RX\n");
2128 	}
2129 
2130 	for_all_wq_queues(sc, wq, i) {
2131 		rc = oce_start_wq(wq);
2132 		if (rc)
2133 			device_printf(sc->dev, "Unable to start TX\n");
2134 	}
2135 
2136 
2137 	for_all_evnt_queues(sc, eq, i)
2138 		oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
2139 
2140 	oce_hw_intr_enable(sc);
2141 
2142 }
2143 
2144 static void
2145 process_link_state(POCE_SOFTC sc, struct oce_async_cqe_link_state *acqe)
2146 {
2147 	/* Update Link status */
2148 	if ((acqe->u0.s.link_status & ~ASYNC_EVENT_LOGICAL) ==
2149 	     ASYNC_EVENT_LINK_UP) {
2150 		sc->link_status = ASYNC_EVENT_LINK_UP;
2151 		if_link_state_change(sc->ifp, LINK_STATE_UP);
2152 	} else {
2153 		sc->link_status = ASYNC_EVENT_LINK_DOWN;
2154 		if_link_state_change(sc->ifp, LINK_STATE_DOWN);
2155 	}
2156 
2157 	/* Update speed */
2158 	sc->link_speed = acqe->u0.s.speed;
2159 	sc->qos_link_speed = (uint32_t) acqe->u0.s.qos_link_speed * 10;
2160 
2161 }
2162 
2163 
2164 /* Handle the Completion Queue for the Mailbox/Async notifications */
2165 uint16_t
2166 oce_mq_handler(void *arg)
2167 {
2168 	struct oce_mq *mq = (struct oce_mq *)arg;
2169 	POCE_SOFTC sc = mq->parent;
2170 	struct oce_cq *cq = mq->cq;
2171 	int num_cqes = 0, evt_type = 0, optype = 0;
2172 	struct oce_mq_cqe *cqe;
2173 	struct oce_async_cqe_link_state *acqe;
2174 	struct oce_async_event_grp5_pvid_state *gcqe;
2175 	struct oce_async_event_qnq *dbgcqe;
2176 
2177 
2178 	bus_dmamap_sync(cq->ring->dma.tag,
2179 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2180 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2181 
2182 	while (cqe->u0.dw[3]) {
2183 		DW_SWAP((uint32_t *) cqe, sizeof(oce_mq_cqe));
2184 		if (cqe->u0.s.async_event) {
2185 			evt_type = cqe->u0.s.event_type;
2186 			optype = cqe->u0.s.async_type;
2187 			if (evt_type  == ASYNC_EVENT_CODE_LINK_STATE) {
2188 				/* Link status evt */
2189 				acqe = (struct oce_async_cqe_link_state *)cqe;
2190 				process_link_state(sc, acqe);
2191 			} else if ((evt_type == ASYNC_EVENT_GRP5) &&
2192 				   (optype == ASYNC_EVENT_PVID_STATE)) {
2193 				/* GRP5 PVID */
2194 				gcqe =
2195 				(struct oce_async_event_grp5_pvid_state *)cqe;
2196 				if (gcqe->enabled)
2197 					sc->pvid = gcqe->tag & VLAN_VID_MASK;
2198 				else
2199 					sc->pvid = 0;
2200 
2201 			}
2202 			else if(evt_type == ASYNC_EVENT_CODE_DEBUG &&
2203 				optype == ASYNC_EVENT_DEBUG_QNQ) {
2204 				dbgcqe =
2205 				(struct oce_async_event_qnq *)cqe;
2206 				if(dbgcqe->valid)
2207 					sc->qnqid = dbgcqe->vlan_tag;
2208 				sc->qnq_debug_event = TRUE;
2209 			}
2210 		}
2211 		cqe->u0.dw[3] = 0;
2212 		RING_GET(cq->ring, 1);
2213 		bus_dmamap_sync(cq->ring->dma.tag,
2214 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2215 		cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2216 		num_cqes++;
2217 	}
2218 
2219 	if (num_cqes)
2220 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
2221 
2222 	return 0;
2223 }
2224 
2225 
2226 static void
2227 setup_max_queues_want(POCE_SOFTC sc)
2228 {
2229 	/* Check if it is FLEX machine. Is so dont use RSS */
2230 	if ((sc->function_mode & FNM_FLEX10_MODE) ||
2231 	    (sc->function_mode & FNM_UMC_MODE)    ||
2232 	    (sc->function_mode & FNM_VNIC_MODE)	  ||
2233 	    (!is_rss_enabled(sc))		  ||
2234 	    (sc->flags & OCE_FLAGS_BE2)) {
2235 		sc->nrqs = 1;
2236 		sc->nwqs = 1;
2237 	} else {
2238 		sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
2239 		sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs);
2240 	}
2241 }
2242 
2243 
2244 static void
2245 update_queues_got(POCE_SOFTC sc)
2246 {
2247 	if (is_rss_enabled(sc)) {
2248 		sc->nrqs = sc->intr_count + 1;
2249 		sc->nwqs = sc->intr_count;
2250 	} else {
2251 		sc->nrqs = 1;
2252 		sc->nwqs = 1;
2253 	}
2254 }
2255 
2256 static int
2257 oce_check_ipv6_ext_hdr(struct mbuf *m)
2258 {
2259 	struct ether_header *eh = mtod(m, struct ether_header *);
2260 	caddr_t m_datatemp = m->m_data;
2261 
2262 	if (eh->ether_type == htons(ETHERTYPE_IPV6)) {
2263 		m->m_data += sizeof(struct ether_header);
2264 		struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
2265 
2266 		if((ip6->ip6_nxt != IPPROTO_TCP) && \
2267 				(ip6->ip6_nxt != IPPROTO_UDP)){
2268 			struct ip6_ext *ip6e = NULL;
2269 			m->m_data += sizeof(struct ip6_hdr);
2270 
2271 			ip6e = (struct ip6_ext *) mtod(m, struct ip6_ext *);
2272 			if(ip6e->ip6e_len == 0xff) {
2273 				m->m_data = m_datatemp;
2274 				return TRUE;
2275 			}
2276 		}
2277 		m->m_data = m_datatemp;
2278 	}
2279 	return FALSE;
2280 }
2281 
2282 static int
2283 is_be3_a1(POCE_SOFTC sc)
2284 {
2285 	if((sc->flags & OCE_FLAGS_BE3)  && ((sc->asic_revision & 0xFF) < 2)) {
2286 		return TRUE;
2287 	}
2288 	return FALSE;
2289 }
2290 
2291 static struct mbuf *
2292 oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete)
2293 {
2294 	uint16_t vlan_tag = 0;
2295 
2296 	if(!M_WRITABLE(m))
2297 		return NULL;
2298 
2299 	/* Embed vlan tag in the packet if it is not part of it */
2300 	if(m->m_flags & M_VLANTAG) {
2301 		vlan_tag = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag);
2302 		m->m_flags &= ~M_VLANTAG;
2303 	}
2304 
2305 	/* if UMC, ignore vlan tag insertion and instead insert pvid */
2306 	if(sc->pvid) {
2307 		if(!vlan_tag)
2308 			vlan_tag = sc->pvid;
2309 		*complete = FALSE;
2310 	}
2311 
2312 	if(vlan_tag) {
2313 		m = ether_vlanencap(m, vlan_tag);
2314 	}
2315 
2316 	if(sc->qnqid) {
2317 		m = ether_vlanencap(m, sc->qnqid);
2318 		*complete = FALSE;
2319 	}
2320 	return m;
2321 }
2322 
2323 static int
2324 oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m)
2325 {
2326 	if(is_be3_a1(sc) && IS_QNQ_OR_UMC(sc) && \
2327 			oce_check_ipv6_ext_hdr(m)) {
2328 		return TRUE;
2329 	}
2330 	return FALSE;
2331 }
2332 
2333 static void
2334 oce_get_config(POCE_SOFTC sc)
2335 {
2336 	int rc = 0;
2337 	uint32_t max_rss = 0;
2338 
2339 	if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native))
2340 		max_rss = OCE_LEGACY_MODE_RSS;
2341 	else
2342 		max_rss = OCE_MAX_RSS;
2343 
2344 	if (!IS_BE(sc)) {
2345 		rc = oce_get_func_config(sc);
2346 		if (rc) {
2347 			sc->nwqs = OCE_MAX_WQ;
2348 			sc->nrssqs = max_rss;
2349 			sc->nrqs = sc->nrssqs + 1;
2350 		}
2351 	}
2352 	else {
2353 		rc = oce_get_profile_config(sc);
2354 		sc->nrssqs = max_rss;
2355 		sc->nrqs = sc->nrssqs + 1;
2356 		if (rc)
2357 			sc->nwqs = OCE_MAX_WQ;
2358 	}
2359 }
2360