xref: /freebsd/sys/dev/oce/oce_if.c (revision 243e928310d073338c5ec089f0dce238a80b9866)
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, 1);
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 (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
567 		queue_index = m->m_pkthdr.flowid % sc->nwqs;
568 
569 	wq = sc->wq[queue_index];
570 
571 	LOCK(&wq->tx_lock);
572 	status = oce_multiq_transmit(ifp, m, wq);
573 	UNLOCK(&wq->tx_lock);
574 
575 	return status;
576 
577 }
578 
579 
580 static void
581 oce_multiq_flush(struct ifnet *ifp)
582 {
583 	POCE_SOFTC sc = ifp->if_softc;
584 	struct mbuf     *m;
585 	int i = 0;
586 
587 	for (i = 0; i < sc->nwqs; i++) {
588 		while ((m = buf_ring_dequeue_sc(sc->wq[i]->br)) != NULL)
589 			m_freem(m);
590 	}
591 	if_qflush(ifp);
592 }
593 
594 
595 
596 /*****************************************************************************
597  *                   Driver interrupt routines functions                     *
598  *****************************************************************************/
599 
600 static void
601 oce_intr(void *arg, int pending)
602 {
603 
604 	POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
605 	POCE_SOFTC sc = ii->sc;
606 	struct oce_eq *eq = ii->eq;
607 	struct oce_eqe *eqe;
608 	struct oce_cq *cq = NULL;
609 	int i, num_eqes = 0;
610 
611 
612 	bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
613 				 BUS_DMASYNC_POSTWRITE);
614 	do {
615 		eqe = RING_GET_CONSUMER_ITEM_VA(eq->ring, struct oce_eqe);
616 		if (eqe->evnt == 0)
617 			break;
618 		eqe->evnt = 0;
619 		bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
620 					BUS_DMASYNC_POSTWRITE);
621 		RING_GET(eq->ring, 1);
622 		num_eqes++;
623 
624 	} while (TRUE);
625 
626 	if (!num_eqes)
627 		goto eq_arm; /* Spurious */
628 
629  	/* Clear EQ entries, but dont arm */
630 	oce_arm_eq(sc, eq->eq_id, num_eqes, FALSE, FALSE);
631 
632 	/* Process TX, RX and MCC. But dont arm CQ*/
633 	for (i = 0; i < eq->cq_valid; i++) {
634 		cq = eq->cq[i];
635 		(*cq->cq_handler)(cq->cb_arg);
636 	}
637 
638 	/* Arm all cqs connected to this EQ */
639 	for (i = 0; i < eq->cq_valid; i++) {
640 		cq = eq->cq[i];
641 		oce_arm_cq(sc, cq->cq_id, 0, TRUE);
642 	}
643 
644 eq_arm:
645 	oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
646 
647 	return;
648 }
649 
650 
651 static int
652 oce_setup_intr(POCE_SOFTC sc)
653 {
654 	int rc = 0, use_intx = 0;
655 	int vector = 0, req_vectors = 0;
656 
657 	if (is_rss_enabled(sc))
658 		req_vectors = MAX((sc->nrqs - 1), sc->nwqs);
659 	else
660 		req_vectors = 1;
661 
662 	if (sc->flags & OCE_FLAGS_MSIX_CAPABLE) {
663 		sc->intr_count = req_vectors;
664 		rc = pci_alloc_msix(sc->dev, &sc->intr_count);
665 		if (rc != 0) {
666 			use_intx = 1;
667 			pci_release_msi(sc->dev);
668 		} else
669 			sc->flags |= OCE_FLAGS_USING_MSIX;
670 	} else
671 		use_intx = 1;
672 
673 	if (use_intx)
674 		sc->intr_count = 1;
675 
676 	/* Scale number of queues based on intr we got */
677 	update_queues_got(sc);
678 
679 	if (use_intx) {
680 		device_printf(sc->dev, "Using legacy interrupt\n");
681 		rc = oce_alloc_intr(sc, vector, oce_intr);
682 		if (rc)
683 			goto error;
684 	} else {
685 		for (; vector < sc->intr_count; vector++) {
686 			rc = oce_alloc_intr(sc, vector, oce_intr);
687 			if (rc)
688 				goto error;
689 		}
690 	}
691 
692 	return 0;
693 error:
694 	oce_intr_free(sc);
695 	return rc;
696 }
697 
698 
699 static int
700 oce_fast_isr(void *arg)
701 {
702 	POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
703 	POCE_SOFTC sc = ii->sc;
704 
705 	if (ii->eq == NULL)
706 		return FILTER_STRAY;
707 
708 	oce_arm_eq(sc, ii->eq->eq_id, 0, FALSE, TRUE);
709 
710 	taskqueue_enqueue(ii->tq, &ii->task);
711 
712  	ii->eq->intr++;
713 
714 	return FILTER_HANDLED;
715 }
716 
717 
718 static int
719 oce_alloc_intr(POCE_SOFTC sc, int vector, void (*isr) (void *arg, int pending))
720 {
721 	POCE_INTR_INFO ii = &sc->intrs[vector];
722 	int rc = 0, rr;
723 
724 	if (vector >= OCE_MAX_EQ)
725 		return (EINVAL);
726 
727 	/* Set the resource id for the interrupt.
728 	 * MSIx is vector + 1 for the resource id,
729 	 * INTx is 0 for the resource id.
730 	 */
731 	if (sc->flags & OCE_FLAGS_USING_MSIX)
732 		rr = vector + 1;
733 	else
734 		rr = 0;
735 	ii->intr_res = bus_alloc_resource_any(sc->dev,
736 					      SYS_RES_IRQ,
737 					      &rr, RF_ACTIVE|RF_SHAREABLE);
738 	ii->irq_rr = rr;
739 	if (ii->intr_res == NULL) {
740 		device_printf(sc->dev,
741 			  "Could not allocate interrupt\n");
742 		rc = ENXIO;
743 		return rc;
744 	}
745 
746 	TASK_INIT(&ii->task, 0, isr, ii);
747 	ii->vector = vector;
748 	sprintf(ii->task_name, "oce_task[%d]", ii->vector);
749 	ii->tq = taskqueue_create_fast(ii->task_name,
750 			M_NOWAIT,
751 			taskqueue_thread_enqueue,
752 			&ii->tq);
753 	taskqueue_start_threads(&ii->tq, 1, PI_NET, "%s taskq",
754 			device_get_nameunit(sc->dev));
755 
756 	ii->sc = sc;
757 	rc = bus_setup_intr(sc->dev,
758 			ii->intr_res,
759 			INTR_TYPE_NET,
760 			oce_fast_isr, NULL, ii, &ii->tag);
761 	return rc;
762 
763 }
764 
765 
766 void
767 oce_intr_free(POCE_SOFTC sc)
768 {
769 	int i = 0;
770 
771 	for (i = 0; i < sc->intr_count; i++) {
772 
773 		if (sc->intrs[i].tag != NULL)
774 			bus_teardown_intr(sc->dev, sc->intrs[i].intr_res,
775 						sc->intrs[i].tag);
776 		if (sc->intrs[i].tq != NULL)
777 			taskqueue_free(sc->intrs[i].tq);
778 
779 		if (sc->intrs[i].intr_res != NULL)
780 			bus_release_resource(sc->dev, SYS_RES_IRQ,
781 						sc->intrs[i].irq_rr,
782 						sc->intrs[i].intr_res);
783 		sc->intrs[i].tag = NULL;
784 		sc->intrs[i].intr_res = NULL;
785 	}
786 
787 	if (sc->flags & OCE_FLAGS_USING_MSIX)
788 		pci_release_msi(sc->dev);
789 
790 }
791 
792 
793 
794 /******************************************************************************
795 *			  Media callbacks functions 			      *
796 ******************************************************************************/
797 
798 static void
799 oce_media_status(struct ifnet *ifp, struct ifmediareq *req)
800 {
801 	POCE_SOFTC sc = (POCE_SOFTC) ifp->if_softc;
802 
803 
804 	req->ifm_status = IFM_AVALID;
805 	req->ifm_active = IFM_ETHER;
806 
807 	if (sc->link_status == 1)
808 		req->ifm_status |= IFM_ACTIVE;
809 	else
810 		return;
811 
812 	switch (sc->link_speed) {
813 	case 1: /* 10 Mbps */
814 		req->ifm_active |= IFM_10_T | IFM_FDX;
815 		sc->speed = 10;
816 		break;
817 	case 2: /* 100 Mbps */
818 		req->ifm_active |= IFM_100_TX | IFM_FDX;
819 		sc->speed = 100;
820 		break;
821 	case 3: /* 1 Gbps */
822 		req->ifm_active |= IFM_1000_T | IFM_FDX;
823 		sc->speed = 1000;
824 		break;
825 	case 4: /* 10 Gbps */
826 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
827 		sc->speed = 10000;
828 		break;
829 	case 5: /* 20 Gbps */
830 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
831 		sc->speed = 20000;
832 		break;
833 	case 6: /* 25 Gbps */
834 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
835 		sc->speed = 25000;
836 		break;
837 	case 7: /* 40 Gbps */
838 		req->ifm_active |= IFM_40G_SR4 | IFM_FDX;
839 		sc->speed = 40000;
840 		break;
841 	default:
842 		sc->speed = 0;
843 		break;
844 	}
845 
846 	return;
847 }
848 
849 
850 int
851 oce_media_change(struct ifnet *ifp)
852 {
853 	return 0;
854 }
855 
856 
857 
858 
859 /*****************************************************************************
860  *			  Transmit routines functions			     *
861  *****************************************************************************/
862 
863 static int
864 oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index)
865 {
866 	int rc = 0, i, retry_cnt = 0;
867 	bus_dma_segment_t segs[OCE_MAX_TX_ELEMENTS];
868 	struct mbuf *m, *m_temp;
869 	struct oce_wq *wq = sc->wq[wq_index];
870 	struct oce_packet_desc *pd;
871 	struct oce_nic_hdr_wqe *nichdr;
872 	struct oce_nic_frag_wqe *nicfrag;
873 	int num_wqes;
874 	uint32_t reg_value;
875 	boolean_t complete = TRUE;
876 
877 	m = *mpp;
878 	if (!m)
879 		return EINVAL;
880 
881 	if (!(m->m_flags & M_PKTHDR)) {
882 		rc = ENXIO;
883 		goto free_ret;
884 	}
885 
886 	if(oce_tx_asic_stall_verify(sc, m)) {
887 		m = oce_insert_vlan_tag(sc, m, &complete);
888 		if(!m) {
889 			device_printf(sc->dev, "Insertion unsuccessful\n");
890 			return 0;
891 		}
892 
893 	}
894 
895 	if (m->m_pkthdr.csum_flags & CSUM_TSO) {
896 		/* consolidate packet buffers for TSO/LSO segment offload */
897 #if defined(INET6) || defined(INET)
898 		m = oce_tso_setup(sc, mpp);
899 #else
900 		m = NULL;
901 #endif
902 		if (m == NULL) {
903 			rc = ENXIO;
904 			goto free_ret;
905 		}
906 	}
907 
908 	pd = &wq->pckts[wq->pkt_desc_head];
909 retry:
910 	rc = bus_dmamap_load_mbuf_sg(wq->tag,
911 				     pd->map,
912 				     m, segs, &pd->nsegs, BUS_DMA_NOWAIT);
913 	if (rc == 0) {
914 		num_wqes = pd->nsegs + 1;
915 		if (IS_BE(sc) || IS_SH(sc)) {
916 			/*Dummy required only for BE3.*/
917 			if (num_wqes & 1)
918 				num_wqes++;
919 		}
920 		if (num_wqes >= RING_NUM_FREE(wq->ring)) {
921 			bus_dmamap_unload(wq->tag, pd->map);
922 			return EBUSY;
923 		}
924 		atomic_store_rel_int(&wq->pkt_desc_head,
925 				     (wq->pkt_desc_head + 1) % \
926 				      OCE_WQ_PACKET_ARRAY_SIZE);
927 		bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE);
928 		pd->mbuf = m;
929 
930 		nichdr =
931 		    RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe);
932 		nichdr->u0.dw[0] = 0;
933 		nichdr->u0.dw[1] = 0;
934 		nichdr->u0.dw[2] = 0;
935 		nichdr->u0.dw[3] = 0;
936 
937 		nichdr->u0.s.complete = complete;
938 		nichdr->u0.s.event = 1;
939 		nichdr->u0.s.crc = 1;
940 		nichdr->u0.s.forward = 0;
941 		nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0;
942 		nichdr->u0.s.udpcs =
943 			(m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0;
944 		nichdr->u0.s.tcpcs =
945 			(m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0;
946 		nichdr->u0.s.num_wqe = num_wqes;
947 		nichdr->u0.s.total_length = m->m_pkthdr.len;
948 
949 		if (m->m_flags & M_VLANTAG) {
950 			nichdr->u0.s.vlan = 1; /*Vlan present*/
951 			nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag;
952 		}
953 
954 		if (m->m_pkthdr.csum_flags & CSUM_TSO) {
955 			if (m->m_pkthdr.tso_segsz) {
956 				nichdr->u0.s.lso = 1;
957 				nichdr->u0.s.lso_mss  = m->m_pkthdr.tso_segsz;
958 			}
959 			if (!IS_BE(sc) || !IS_SH(sc))
960 				nichdr->u0.s.ipcs = 1;
961 		}
962 
963 		RING_PUT(wq->ring, 1);
964 		atomic_add_int(&wq->ring->num_used, 1);
965 
966 		for (i = 0; i < pd->nsegs; i++) {
967 			nicfrag =
968 			    RING_GET_PRODUCER_ITEM_VA(wq->ring,
969 						      struct oce_nic_frag_wqe);
970 			nicfrag->u0.s.rsvd0 = 0;
971 			nicfrag->u0.s.frag_pa_hi = ADDR_HI(segs[i].ds_addr);
972 			nicfrag->u0.s.frag_pa_lo = ADDR_LO(segs[i].ds_addr);
973 			nicfrag->u0.s.frag_len = segs[i].ds_len;
974 			pd->wqe_idx = wq->ring->pidx;
975 			RING_PUT(wq->ring, 1);
976 			atomic_add_int(&wq->ring->num_used, 1);
977 		}
978 		if (num_wqes > (pd->nsegs + 1)) {
979 			nicfrag =
980 			    RING_GET_PRODUCER_ITEM_VA(wq->ring,
981 						      struct oce_nic_frag_wqe);
982 			nicfrag->u0.dw[0] = 0;
983 			nicfrag->u0.dw[1] = 0;
984 			nicfrag->u0.dw[2] = 0;
985 			nicfrag->u0.dw[3] = 0;
986 			pd->wqe_idx = wq->ring->pidx;
987 			RING_PUT(wq->ring, 1);
988 			atomic_add_int(&wq->ring->num_used, 1);
989 			pd->nsegs++;
990 		}
991 
992 		if_inc_counter(sc->ifp, IFCOUNTER_OPACKETS, 1);
993 		wq->tx_stats.tx_reqs++;
994 		wq->tx_stats.tx_wrbs += num_wqes;
995 		wq->tx_stats.tx_bytes += m->m_pkthdr.len;
996 		wq->tx_stats.tx_pkts++;
997 
998 		bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map,
999 				BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1000 		reg_value = (num_wqes << 16) | wq->wq_id;
1001 		OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value);
1002 
1003 	} else if (rc == EFBIG)	{
1004 		if (retry_cnt == 0) {
1005 			m_temp = m_defrag(m, M_NOWAIT);
1006 			if (m_temp == NULL)
1007 				goto free_ret;
1008 			m = m_temp;
1009 			*mpp = m_temp;
1010 			retry_cnt = retry_cnt + 1;
1011 			goto retry;
1012 		} else
1013 			goto free_ret;
1014 	} else if (rc == ENOMEM)
1015 		return rc;
1016 	else
1017 		goto free_ret;
1018 
1019 	return 0;
1020 
1021 free_ret:
1022 	m_freem(*mpp);
1023 	*mpp = NULL;
1024 	return rc;
1025 }
1026 
1027 
1028 static void
1029 oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, uint32_t status)
1030 {
1031 	struct oce_packet_desc *pd;
1032 	POCE_SOFTC sc = (POCE_SOFTC) wq->parent;
1033 	struct mbuf *m;
1034 
1035 	pd = &wq->pckts[wq->pkt_desc_tail];
1036 	atomic_store_rel_int(&wq->pkt_desc_tail,
1037 			     (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE);
1038 	atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1);
1039 	bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1040 	bus_dmamap_unload(wq->tag, pd->map);
1041 
1042 	m = pd->mbuf;
1043 	m_freem(m);
1044 	pd->mbuf = NULL;
1045 
1046 
1047 	if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) {
1048 		if (wq->ring->num_used < (wq->ring->num_items / 2)) {
1049 			sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
1050 			oce_tx_restart(sc, wq);
1051 		}
1052 	}
1053 }
1054 
1055 
1056 static void
1057 oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq)
1058 {
1059 
1060 	if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING)
1061 		return;
1062 
1063 #if __FreeBSD_version >= 800000
1064 	if (!drbr_empty(sc->ifp, wq->br))
1065 #else
1066 	if (!IFQ_DRV_IS_EMPTY(&sc->ifp->if_snd))
1067 #endif
1068 		taskqueue_enqueue(taskqueue_swi, &wq->txtask);
1069 
1070 }
1071 
1072 
1073 #if defined(INET6) || defined(INET)
1074 static struct mbuf *
1075 oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp)
1076 {
1077 	struct mbuf *m;
1078 #ifdef INET
1079 	struct ip *ip;
1080 #endif
1081 #ifdef INET6
1082 	struct ip6_hdr *ip6;
1083 #endif
1084 	struct ether_vlan_header *eh;
1085 	struct tcphdr *th;
1086 	uint16_t etype;
1087 	int total_len = 0, ehdrlen = 0;
1088 
1089 	m = *mpp;
1090 
1091 	if (M_WRITABLE(m) == 0) {
1092 		m = m_dup(*mpp, M_NOWAIT);
1093 		if (!m)
1094 			return NULL;
1095 		m_freem(*mpp);
1096 		*mpp = m;
1097 	}
1098 
1099 	eh = mtod(m, struct ether_vlan_header *);
1100 	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
1101 		etype = ntohs(eh->evl_proto);
1102 		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
1103 	} else {
1104 		etype = ntohs(eh->evl_encap_proto);
1105 		ehdrlen = ETHER_HDR_LEN;
1106 	}
1107 
1108 	switch (etype) {
1109 #ifdef INET
1110 	case ETHERTYPE_IP:
1111 		ip = (struct ip *)(m->m_data + ehdrlen);
1112 		if (ip->ip_p != IPPROTO_TCP)
1113 			return NULL;
1114 		th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
1115 
1116 		total_len = ehdrlen + (ip->ip_hl << 2) + (th->th_off << 2);
1117 		break;
1118 #endif
1119 #ifdef INET6
1120 	case ETHERTYPE_IPV6:
1121 		ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen);
1122 		if (ip6->ip6_nxt != IPPROTO_TCP)
1123 			return NULL;
1124 		th = (struct tcphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
1125 
1126 		total_len = ehdrlen + sizeof(struct ip6_hdr) + (th->th_off << 2);
1127 		break;
1128 #endif
1129 	default:
1130 		return NULL;
1131 	}
1132 
1133 	m = m_pullup(m, total_len);
1134 	if (!m)
1135 		return NULL;
1136 	*mpp = m;
1137 	return m;
1138 
1139 }
1140 #endif /* INET6 || INET */
1141 
1142 void
1143 oce_tx_task(void *arg, int npending)
1144 {
1145 	struct oce_wq *wq = arg;
1146 	POCE_SOFTC sc = wq->parent;
1147 	struct ifnet *ifp = sc->ifp;
1148 	int rc = 0;
1149 
1150 #if __FreeBSD_version >= 800000
1151 	LOCK(&wq->tx_lock);
1152 	rc = oce_multiq_transmit(ifp, NULL, wq);
1153 	if (rc) {
1154 		device_printf(sc->dev,
1155 				"TX[%d] restart failed\n", wq->queue_index);
1156 	}
1157 	UNLOCK(&wq->tx_lock);
1158 #else
1159 	oce_start(ifp);
1160 #endif
1161 
1162 }
1163 
1164 
1165 void
1166 oce_start(struct ifnet *ifp)
1167 {
1168 	POCE_SOFTC sc = ifp->if_softc;
1169 	struct mbuf *m;
1170 	int rc = 0;
1171 	int def_q = 0; /* Defualt tx queue is 0*/
1172 
1173 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1174 			IFF_DRV_RUNNING)
1175 		return;
1176 
1177 	if (!sc->link_status)
1178 		return;
1179 
1180 	do {
1181 		IF_DEQUEUE(&sc->ifp->if_snd, m);
1182 		if (m == NULL)
1183 			break;
1184 
1185 		LOCK(&sc->wq[def_q]->tx_lock);
1186 		rc = oce_tx(sc, &m, def_q);
1187 		UNLOCK(&sc->wq[def_q]->tx_lock);
1188 		if (rc) {
1189 			if (m != NULL) {
1190 				sc->wq[def_q]->tx_stats.tx_stops ++;
1191 				ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1192 				IFQ_DRV_PREPEND(&ifp->if_snd, m);
1193 				m = NULL;
1194 			}
1195 			break;
1196 		}
1197 		if (m != NULL)
1198 			ETHER_BPF_MTAP(ifp, m);
1199 
1200 	} while (TRUE);
1201 
1202 	return;
1203 }
1204 
1205 
1206 /* Handle the Completion Queue for transmit */
1207 uint16_t
1208 oce_wq_handler(void *arg)
1209 {
1210 	struct oce_wq *wq = (struct oce_wq *)arg;
1211 	POCE_SOFTC sc = wq->parent;
1212 	struct oce_cq *cq = wq->cq;
1213 	struct oce_nic_tx_cqe *cqe;
1214 	int num_cqes = 0;
1215 
1216 	bus_dmamap_sync(cq->ring->dma.tag,
1217 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1218 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1219 	while (cqe->u0.dw[3]) {
1220 		DW_SWAP((uint32_t *) cqe, sizeof(oce_wq_cqe));
1221 
1222 		wq->ring->cidx = cqe->u0.s.wqe_index + 1;
1223 		if (wq->ring->cidx >= wq->ring->num_items)
1224 			wq->ring->cidx -= wq->ring->num_items;
1225 
1226 		oce_tx_complete(wq, cqe->u0.s.wqe_index, cqe->u0.s.status);
1227 		wq->tx_stats.tx_compl++;
1228 		cqe->u0.dw[3] = 0;
1229 		RING_GET(cq->ring, 1);
1230 		bus_dmamap_sync(cq->ring->dma.tag,
1231 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1232 		cqe =
1233 		    RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1234 		num_cqes++;
1235 	}
1236 
1237 	if (num_cqes)
1238 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1239 
1240 	return 0;
1241 }
1242 
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 			}
1275 			break;
1276 		}
1277 		drbr_advance(ifp, br);
1278 		if_inc_counter(ifp, IFCOUNTER_OBYTES, next->m_pkthdr.len);
1279 		if (next->m_flags & M_MCAST)
1280 			if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
1281 		ETHER_BPF_MTAP(ifp, next);
1282 	}
1283 
1284 	return 0;
1285 }
1286 
1287 
1288 
1289 
1290 /*****************************************************************************
1291  *			    Receive  routines functions 		     *
1292  *****************************************************************************/
1293 
1294 static void
1295 oce_rx(struct oce_rq *rq, uint32_t rqe_idx, struct oce_nic_rx_cqe *cqe)
1296 {
1297 	uint32_t out;
1298 	struct oce_packet_desc *pd;
1299 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1300 	int i, len, frag_len;
1301 	struct mbuf *m = NULL, *tail = NULL;
1302 	uint16_t vtag;
1303 
1304 	len = cqe->u0.s.pkt_size;
1305 	if (!len) {
1306 		/*partial DMA workaround for Lancer*/
1307 		oce_discard_rx_comp(rq, cqe);
1308 		goto exit;
1309 	}
1310 
1311 	 /* Get vlan_tag value */
1312 	if(IS_BE(sc) || IS_SH(sc))
1313 		vtag = BSWAP_16(cqe->u0.s.vlan_tag);
1314 	else
1315 		vtag = cqe->u0.s.vlan_tag;
1316 
1317 
1318 	for (i = 0; i < cqe->u0.s.num_fragments; i++) {
1319 
1320 		if (rq->packets_out == rq->packets_in) {
1321 			device_printf(sc->dev,
1322 				  "RQ transmit descriptor missing\n");
1323 		}
1324 		out = rq->packets_out + 1;
1325 		if (out == OCE_RQ_PACKET_ARRAY_SIZE)
1326 			out = 0;
1327 		pd = &rq->pckts[rq->packets_out];
1328 		rq->packets_out = out;
1329 
1330 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1331 		bus_dmamap_unload(rq->tag, pd->map);
1332 		rq->pending--;
1333 
1334 		frag_len = (len > rq->cfg.frag_size) ? rq->cfg.frag_size : len;
1335 		pd->mbuf->m_len = frag_len;
1336 
1337 		if (tail != NULL) {
1338 			/* additional fragments */
1339 			pd->mbuf->m_flags &= ~M_PKTHDR;
1340 			tail->m_next = pd->mbuf;
1341 			tail = pd->mbuf;
1342 		} else {
1343 			/* first fragment, fill out much of the packet header */
1344 			pd->mbuf->m_pkthdr.len = len;
1345 			pd->mbuf->m_pkthdr.csum_flags = 0;
1346 			if (IF_CSUM_ENABLED(sc)) {
1347 				if (cqe->u0.s.l4_cksum_pass) {
1348 					pd->mbuf->m_pkthdr.csum_flags |=
1349 					    (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1350 					pd->mbuf->m_pkthdr.csum_data = 0xffff;
1351 				}
1352 				if (cqe->u0.s.ip_cksum_pass) {
1353 					if (!cqe->u0.s.ip_ver) { /* IPV4 */
1354 						pd->mbuf->m_pkthdr.csum_flags |=
1355 						(CSUM_IP_CHECKED|CSUM_IP_VALID);
1356 					}
1357 				}
1358 			}
1359 			m = tail = pd->mbuf;
1360 		}
1361 		pd->mbuf = NULL;
1362 		len -= frag_len;
1363 	}
1364 
1365 	if (m) {
1366 		if (!oce_cqe_portid_valid(sc, cqe)) {
1367 			 m_freem(m);
1368 			 goto exit;
1369 		}
1370 
1371 		m->m_pkthdr.rcvif = sc->ifp;
1372 #if __FreeBSD_version >= 800000
1373 		if (rq->queue_index)
1374 			m->m_pkthdr.flowid = (rq->queue_index - 1);
1375 		else
1376 			m->m_pkthdr.flowid = rq->queue_index;
1377 		M_HASHTYPE_SET(m, M_HASHTYPE_OPAQUE);
1378 #endif
1379 		/* This deternies if vlan tag is Valid */
1380 		if (oce_cqe_vtp_valid(sc, cqe)) {
1381 			if (sc->function_mode & FNM_FLEX10_MODE) {
1382 				/* FLEX10. If QnQ is not set, neglect VLAN */
1383 				if (cqe->u0.s.qnq) {
1384 					m->m_pkthdr.ether_vtag = vtag;
1385 					m->m_flags |= M_VLANTAG;
1386 				}
1387 			} else if (sc->pvid != (vtag & VLAN_VID_MASK))  {
1388 				/* In UMC mode generally pvid will be striped by
1389 				   hw. But in some cases we have seen it comes
1390 				   with pvid. So if pvid == vlan, neglect vlan.
1391 				*/
1392 				m->m_pkthdr.ether_vtag = vtag;
1393 				m->m_flags |= M_VLANTAG;
1394 			}
1395 		}
1396 
1397 		if_inc_counter(sc->ifp, IFCOUNTER_IPACKETS, 1);
1398 #if defined(INET6) || defined(INET)
1399 		/* Try to queue to LRO */
1400 		if (IF_LRO_ENABLED(sc) &&
1401 		    (cqe->u0.s.ip_cksum_pass) &&
1402 		    (cqe->u0.s.l4_cksum_pass) &&
1403 		    (!cqe->u0.s.ip_ver)       &&
1404 		    (rq->lro.lro_cnt != 0)) {
1405 
1406 			if (tcp_lro_rx(&rq->lro, m, 0) == 0) {
1407 				rq->lro_pkts_queued ++;
1408 				goto post_done;
1409 			}
1410 			/* If LRO posting fails then try to post to STACK */
1411 		}
1412 #endif
1413 
1414 		(*sc->ifp->if_input) (sc->ifp, m);
1415 #if defined(INET6) || defined(INET)
1416 post_done:
1417 #endif
1418 		/* Update rx stats per queue */
1419 		rq->rx_stats.rx_pkts++;
1420 		rq->rx_stats.rx_bytes += cqe->u0.s.pkt_size;
1421 		rq->rx_stats.rx_frags += cqe->u0.s.num_fragments;
1422 		if (cqe->u0.s.pkt_type == OCE_MULTICAST_PACKET)
1423 			rq->rx_stats.rx_mcast_pkts++;
1424 		if (cqe->u0.s.pkt_type == OCE_UNICAST_PACKET)
1425 			rq->rx_stats.rx_ucast_pkts++;
1426 	}
1427 exit:
1428 	return;
1429 }
1430 
1431 
1432 static void
1433 oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe)
1434 {
1435 	uint32_t out, i = 0;
1436 	struct oce_packet_desc *pd;
1437 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1438 	int num_frags = cqe->u0.s.num_fragments;
1439 
1440 	for (i = 0; i < num_frags; i++) {
1441 		if (rq->packets_out == rq->packets_in) {
1442 			device_printf(sc->dev,
1443 				"RQ transmit descriptor missing\n");
1444 		}
1445 		out = rq->packets_out + 1;
1446 		if (out == OCE_RQ_PACKET_ARRAY_SIZE)
1447 			out = 0;
1448 		pd = &rq->pckts[rq->packets_out];
1449 		rq->packets_out = out;
1450 
1451 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1452 		bus_dmamap_unload(rq->tag, pd->map);
1453 		rq->pending--;
1454 		m_freem(pd->mbuf);
1455 	}
1456 
1457 }
1458 
1459 
1460 static int
1461 oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1462 {
1463 	struct oce_nic_rx_cqe_v1 *cqe_v1;
1464 	int vtp = 0;
1465 
1466 	if (sc->be3_native) {
1467 		cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1468 		vtp =  cqe_v1->u0.s.vlan_tag_present;
1469 	} else
1470 		vtp = cqe->u0.s.vlan_tag_present;
1471 
1472 	return vtp;
1473 
1474 }
1475 
1476 
1477 static int
1478 oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1479 {
1480 	struct oce_nic_rx_cqe_v1 *cqe_v1;
1481 	int port_id = 0;
1482 
1483 	if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) {
1484 		cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1485 		port_id =  cqe_v1->u0.s.port;
1486 		if (sc->port_id != port_id)
1487 			return 0;
1488 	} else
1489 		;/* For BE3 legacy and Lancer this is dummy */
1490 
1491 	return 1;
1492 
1493 }
1494 
1495 #if defined(INET6) || defined(INET)
1496 static void
1497 oce_rx_flush_lro(struct oce_rq *rq)
1498 {
1499 	struct lro_ctrl	*lro = &rq->lro;
1500 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1501 
1502 	if (!IF_LRO_ENABLED(sc))
1503 		return;
1504 
1505 	tcp_lro_flush_all(lro);
1506 	rq->lro_pkts_queued = 0;
1507 
1508 	return;
1509 }
1510 
1511 
1512 static int
1513 oce_init_lro(POCE_SOFTC sc)
1514 {
1515 	struct lro_ctrl *lro = NULL;
1516 	int i = 0, rc = 0;
1517 
1518 	for (i = 0; i < sc->nrqs; i++) {
1519 		lro = &sc->rq[i]->lro;
1520 		rc = tcp_lro_init(lro);
1521 		if (rc != 0) {
1522 			device_printf(sc->dev, "LRO init failed\n");
1523 			return rc;
1524 		}
1525 		lro->ifp = sc->ifp;
1526 	}
1527 
1528 	return rc;
1529 }
1530 
1531 
1532 void
1533 oce_free_lro(POCE_SOFTC sc)
1534 {
1535 	struct lro_ctrl *lro = NULL;
1536 	int i = 0;
1537 
1538 	for (i = 0; i < sc->nrqs; i++) {
1539 		lro = &sc->rq[i]->lro;
1540 		if (lro)
1541 			tcp_lro_free(lro);
1542 	}
1543 }
1544 #endif
1545 
1546 int
1547 oce_alloc_rx_bufs(struct oce_rq *rq, int count)
1548 {
1549 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1550 	int i, in, rc;
1551 	struct oce_packet_desc *pd;
1552 	bus_dma_segment_t segs[6];
1553 	int nsegs, added = 0;
1554 	struct oce_nic_rqe *rqe;
1555 	pd_rxulp_db_t rxdb_reg;
1556 
1557 	bzero(&rxdb_reg, sizeof(pd_rxulp_db_t));
1558 	for (i = 0; i < count; i++) {
1559 		in = rq->packets_in + 1;
1560 		if (in == OCE_RQ_PACKET_ARRAY_SIZE)
1561 			in = 0;
1562 		if (in == rq->packets_out)
1563 			break;	/* no more room */
1564 
1565 		pd = &rq->pckts[rq->packets_in];
1566 		pd->mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1567 		if (pd->mbuf == NULL)
1568 			break;
1569 
1570 		pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = MCLBYTES;
1571 		rc = bus_dmamap_load_mbuf_sg(rq->tag,
1572 					     pd->map,
1573 					     pd->mbuf,
1574 					     segs, &nsegs, BUS_DMA_NOWAIT);
1575 		if (rc) {
1576 			m_free(pd->mbuf);
1577 			break;
1578 		}
1579 
1580 		if (nsegs != 1) {
1581 			i--;
1582 			continue;
1583 		}
1584 
1585 		rq->packets_in = in;
1586 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_PREREAD);
1587 
1588 		rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe);
1589 		rqe->u0.s.frag_pa_hi = ADDR_HI(segs[0].ds_addr);
1590 		rqe->u0.s.frag_pa_lo = ADDR_LO(segs[0].ds_addr);
1591 		DW_SWAP(u32ptr(rqe), sizeof(struct oce_nic_rqe));
1592 		RING_PUT(rq->ring, 1);
1593 		added++;
1594 		rq->pending++;
1595 	}
1596 	if (added != 0) {
1597 		for (i = added / OCE_MAX_RQ_POSTS; i > 0; i--) {
1598 			rxdb_reg.bits.num_posted = OCE_MAX_RQ_POSTS;
1599 			rxdb_reg.bits.qid = rq->rq_id;
1600 			OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1601 			added -= OCE_MAX_RQ_POSTS;
1602 		}
1603 		if (added > 0) {
1604 			rxdb_reg.bits.qid = rq->rq_id;
1605 			rxdb_reg.bits.num_posted = added;
1606 			OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1607 		}
1608 	}
1609 
1610 	return 0;
1611 }
1612 
1613 
1614 /* Handle the Completion Queue for receive */
1615 uint16_t
1616 oce_rq_handler(void *arg)
1617 {
1618 	struct oce_rq *rq = (struct oce_rq *)arg;
1619 	struct oce_cq *cq = rq->cq;
1620 	POCE_SOFTC sc = rq->parent;
1621 	struct oce_nic_rx_cqe *cqe;
1622 	int num_cqes = 0, rq_buffers_used = 0;
1623 
1624 
1625 	bus_dmamap_sync(cq->ring->dma.tag,
1626 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1627 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
1628 	while (cqe->u0.dw[2]) {
1629 		DW_SWAP((uint32_t *) cqe, sizeof(oce_rq_cqe));
1630 
1631 		RING_GET(rq->ring, 1);
1632 		if (cqe->u0.s.error == 0) {
1633 			oce_rx(rq, cqe->u0.s.frag_index, cqe);
1634 		} else {
1635 			rq->rx_stats.rxcp_err++;
1636 			if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1);
1637 			/* Post L3/L4 errors to stack.*/
1638 			oce_rx(rq, cqe->u0.s.frag_index, cqe);
1639 		}
1640 		rq->rx_stats.rx_compl++;
1641 		cqe->u0.dw[2] = 0;
1642 
1643 #if defined(INET6) || defined(INET)
1644 		if (IF_LRO_ENABLED(sc) && rq->lro_pkts_queued >= 16) {
1645 			oce_rx_flush_lro(rq);
1646 		}
1647 #endif
1648 
1649 		RING_GET(cq->ring, 1);
1650 		bus_dmamap_sync(cq->ring->dma.tag,
1651 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1652 		cqe =
1653 		    RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
1654 		num_cqes++;
1655 		if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled))
1656 			break;
1657 	}
1658 
1659 #if defined(INET6) || defined(INET)
1660 	if (IF_LRO_ENABLED(sc))
1661 		oce_rx_flush_lro(rq);
1662 #endif
1663 
1664 	if (num_cqes) {
1665 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1666 		rq_buffers_used = OCE_RQ_PACKET_ARRAY_SIZE - rq->pending;
1667 		if (rq_buffers_used > 1)
1668 			oce_alloc_rx_bufs(rq, (rq_buffers_used - 1));
1669 	}
1670 
1671 	return 0;
1672 
1673 }
1674 
1675 
1676 
1677 
1678 /*****************************************************************************
1679  *		   Helper function prototypes in this file 		     *
1680  *****************************************************************************/
1681 
1682 static int
1683 oce_attach_ifp(POCE_SOFTC sc)
1684 {
1685 
1686 	sc->ifp = if_alloc(IFT_ETHER);
1687 	if (!sc->ifp)
1688 		return ENOMEM;
1689 
1690 	ifmedia_init(&sc->media, IFM_IMASK, oce_media_change, oce_media_status);
1691 	ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1692 	ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
1693 
1694 	sc->ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST;
1695 	sc->ifp->if_ioctl = oce_ioctl;
1696 	sc->ifp->if_start = oce_start;
1697 	sc->ifp->if_init = oce_init;
1698 	sc->ifp->if_mtu = ETHERMTU;
1699 	sc->ifp->if_softc = sc;
1700 #if __FreeBSD_version >= 800000
1701 	sc->ifp->if_transmit = oce_multiq_start;
1702 	sc->ifp->if_qflush = oce_multiq_flush;
1703 #endif
1704 
1705 	if_initname(sc->ifp,
1706 		    device_get_name(sc->dev), device_get_unit(sc->dev));
1707 
1708 	sc->ifp->if_snd.ifq_drv_maxlen = OCE_MAX_TX_DESC - 1;
1709 	IFQ_SET_MAXLEN(&sc->ifp->if_snd, sc->ifp->if_snd.ifq_drv_maxlen);
1710 	IFQ_SET_READY(&sc->ifp->if_snd);
1711 
1712 	sc->ifp->if_hwassist = OCE_IF_HWASSIST;
1713 	sc->ifp->if_hwassist |= CSUM_TSO;
1714 	sc->ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP);
1715 
1716 	sc->ifp->if_capabilities = OCE_IF_CAPABILITIES;
1717 	sc->ifp->if_capabilities |= IFCAP_HWCSUM;
1718 	sc->ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
1719 
1720 #if defined(INET6) || defined(INET)
1721 	sc->ifp->if_capabilities |= IFCAP_TSO;
1722 	sc->ifp->if_capabilities |= IFCAP_LRO;
1723 	sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO;
1724 #endif
1725 
1726 	sc->ifp->if_capenable = sc->ifp->if_capabilities;
1727 	sc->ifp->if_baudrate = IF_Gbps(10);
1728 
1729 #if __FreeBSD_version >= 1000000
1730 	sc->ifp->if_hw_tsomax = 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
1731 	sc->ifp->if_hw_tsomaxsegcount = OCE_MAX_TX_ELEMENTS;
1732 	sc->ifp->if_hw_tsomaxsegsize = 4096;
1733 #endif
1734 
1735 	ether_ifattach(sc->ifp, sc->macaddr.mac_addr);
1736 
1737 	return 0;
1738 }
1739 
1740 
1741 static void
1742 oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1743 {
1744 	POCE_SOFTC sc = ifp->if_softc;
1745 
1746 	if (ifp->if_softc !=  arg)
1747 		return;
1748 	if ((vtag == 0) || (vtag > 4095))
1749 		return;
1750 
1751 	sc->vlan_tag[vtag] = 1;
1752 	sc->vlans_added++;
1753 	if (sc->vlans_added <= (sc->max_vlans + 1))
1754 		oce_vid_config(sc);
1755 }
1756 
1757 
1758 static void
1759 oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1760 {
1761 	POCE_SOFTC sc = ifp->if_softc;
1762 
1763 	if (ifp->if_softc !=  arg)
1764 		return;
1765 	if ((vtag == 0) || (vtag > 4095))
1766 		return;
1767 
1768 	sc->vlan_tag[vtag] = 0;
1769 	sc->vlans_added--;
1770 	oce_vid_config(sc);
1771 }
1772 
1773 
1774 /*
1775  * A max of 64 vlans can be configured in BE. If the user configures
1776  * more, place the card in vlan promiscuous mode.
1777  */
1778 static int
1779 oce_vid_config(POCE_SOFTC sc)
1780 {
1781 	struct normal_vlan vtags[MAX_VLANFILTER_SIZE];
1782 	uint16_t ntags = 0, i;
1783 	int status = 0;
1784 
1785 	if ((sc->vlans_added <= MAX_VLANFILTER_SIZE) &&
1786 			(sc->ifp->if_capenable & IFCAP_VLAN_HWFILTER)) {
1787 		for (i = 0; i < MAX_VLANS; i++) {
1788 			if (sc->vlan_tag[i]) {
1789 				vtags[ntags].vtag = i;
1790 				ntags++;
1791 			}
1792 		}
1793 		if (ntags)
1794 			status = oce_config_vlan(sc, (uint8_t) sc->if_id,
1795 						vtags, ntags, 1, 0);
1796 	} else
1797 		status = oce_config_vlan(sc, (uint8_t) sc->if_id,
1798 					 	NULL, 0, 1, 1);
1799 	return status;
1800 }
1801 
1802 
1803 static void
1804 oce_mac_addr_set(POCE_SOFTC sc)
1805 {
1806 	uint32_t old_pmac_id = sc->pmac_id;
1807 	int status = 0;
1808 
1809 
1810 	status = bcmp((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
1811 			 sc->macaddr.size_of_struct);
1812 	if (!status)
1813 		return;
1814 
1815 	status = oce_mbox_macaddr_add(sc, (uint8_t *)(IF_LLADDR(sc->ifp)),
1816 					sc->if_id, &sc->pmac_id);
1817 	if (!status) {
1818 		status = oce_mbox_macaddr_del(sc, sc->if_id, old_pmac_id);
1819 		bcopy((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
1820 				 sc->macaddr.size_of_struct);
1821 	}
1822 	if (status)
1823 		device_printf(sc->dev, "Failed update macaddress\n");
1824 
1825 }
1826 
1827 
1828 static int
1829 oce_handle_passthrough(struct ifnet *ifp, caddr_t data)
1830 {
1831 	POCE_SOFTC sc = ifp->if_softc;
1832 	struct ifreq *ifr = (struct ifreq *)data;
1833 	int rc = ENXIO;
1834 	char cookie[32] = {0};
1835 	void *priv_data = (void *)ifr->ifr_data;
1836 	void *ioctl_ptr;
1837 	uint32_t req_size;
1838 	struct mbx_hdr req;
1839 	OCE_DMA_MEM dma_mem;
1840 	struct mbx_common_get_cntl_attr *fw_cmd;
1841 
1842 	if (copyin(priv_data, cookie, strlen(IOCTL_COOKIE)))
1843 		return EFAULT;
1844 
1845 	if (memcmp(cookie, IOCTL_COOKIE, strlen(IOCTL_COOKIE)))
1846 		return EINVAL;
1847 
1848 	ioctl_ptr = (char *)priv_data + strlen(IOCTL_COOKIE);
1849 	if (copyin(ioctl_ptr, &req, sizeof(struct mbx_hdr)))
1850 		return EFAULT;
1851 
1852 	req_size = le32toh(req.u0.req.request_length);
1853 	if (req_size > 65536)
1854 		return EINVAL;
1855 
1856 	req_size += sizeof(struct mbx_hdr);
1857 	rc = oce_dma_alloc(sc, req_size, &dma_mem, 0);
1858 	if (rc)
1859 		return ENOMEM;
1860 
1861 	if (copyin(ioctl_ptr, OCE_DMAPTR(&dma_mem,char), req_size)) {
1862 		rc = EFAULT;
1863 		goto dma_free;
1864 	}
1865 
1866 	rc = oce_pass_through_mbox(sc, &dma_mem, req_size);
1867 	if (rc) {
1868 		rc = EIO;
1869 		goto dma_free;
1870 	}
1871 
1872 	if (copyout(OCE_DMAPTR(&dma_mem,char), ioctl_ptr, req_size))
1873 		rc =  EFAULT;
1874 
1875 	/*
1876 	   firmware is filling all the attributes for this ioctl except
1877 	   the driver version..so fill it
1878 	 */
1879 	if(req.u0.rsp.opcode == OPCODE_COMMON_GET_CNTL_ATTRIBUTES) {
1880 		fw_cmd = (struct mbx_common_get_cntl_attr *) ioctl_ptr;
1881 		strncpy(fw_cmd->params.rsp.cntl_attr_info.hba_attr.drv_ver_str,
1882 			COMPONENT_REVISION, strlen(COMPONENT_REVISION));
1883 	}
1884 
1885 dma_free:
1886 	oce_dma_free(sc, &dma_mem);
1887 	return rc;
1888 
1889 }
1890 
1891 static void
1892 oce_eqd_set_periodic(POCE_SOFTC sc)
1893 {
1894 	struct oce_set_eqd set_eqd[OCE_MAX_EQ];
1895 	struct oce_aic_obj *aic;
1896 	struct oce_eq *eqo;
1897 	uint64_t now = 0, delta;
1898 	int eqd, i, num = 0;
1899 	uint32_t ips = 0;
1900 	int tps;
1901 
1902 	for (i = 0 ; i < sc->neqs; i++) {
1903 		eqo = sc->eq[i];
1904 		aic = &sc->aic_obj[i];
1905 		/* When setting the static eq delay from the user space */
1906 		if (!aic->enable) {
1907 			eqd = aic->et_eqd;
1908 			goto modify_eqd;
1909 		}
1910 
1911 		now = ticks;
1912 
1913 		/* Over flow check */
1914 		if ((now < aic->ticks) || (eqo->intr < aic->intr_prev))
1915 			goto done;
1916 
1917 		delta = now - aic->ticks;
1918 		tps = delta/hz;
1919 
1920 		/* Interrupt rate based on elapsed ticks */
1921 		if(tps)
1922 			ips = (uint32_t)(eqo->intr - aic->intr_prev) / tps;
1923 
1924 		if (ips > INTR_RATE_HWM)
1925 			eqd = aic->cur_eqd + 20;
1926 		else if (ips < INTR_RATE_LWM)
1927 			eqd = aic->cur_eqd / 2;
1928 		else
1929 			goto done;
1930 
1931 		if (eqd < 10)
1932 			eqd = 0;
1933 
1934 		/* Make sure that the eq delay is in the known range */
1935 		eqd = min(eqd, aic->max_eqd);
1936 		eqd = max(eqd, aic->min_eqd);
1937 
1938 modify_eqd:
1939 		if (eqd != aic->cur_eqd) {
1940 			set_eqd[num].delay_multiplier = (eqd * 65)/100;
1941 			set_eqd[num].eq_id = eqo->eq_id;
1942 			aic->cur_eqd = eqd;
1943 			num++;
1944 		}
1945 done:
1946 		aic->intr_prev = eqo->intr;
1947 		aic->ticks = now;
1948 	}
1949 
1950 	/* Is there atleast one eq that needs to be modified? */
1951 	if(num)
1952 		oce_mbox_eqd_modify_periodic(sc, set_eqd, num);
1953 }
1954 
1955 static void oce_detect_hw_error(POCE_SOFTC sc)
1956 {
1957 
1958 	uint32_t ue_low = 0, ue_high = 0, ue_low_mask = 0, ue_high_mask = 0;
1959 	uint32_t sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
1960 	uint32_t i;
1961 
1962 	if (sc->hw_error)
1963 		return;
1964 
1965 	if (IS_XE201(sc)) {
1966 		sliport_status = OCE_READ_REG32(sc, db, SLIPORT_STATUS_OFFSET);
1967 		if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1968 			sliport_err1 = OCE_READ_REG32(sc, db, SLIPORT_ERROR1_OFFSET);
1969 			sliport_err2 = OCE_READ_REG32(sc, db, SLIPORT_ERROR2_OFFSET);
1970 		}
1971 	} else {
1972 		ue_low = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW);
1973 		ue_high = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HIGH);
1974 		ue_low_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW_MASK);
1975 		ue_high_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HI_MASK);
1976 
1977 		ue_low = (ue_low & ~ue_low_mask);
1978 		ue_high = (ue_high & ~ue_high_mask);
1979 	}
1980 
1981 	/* On certain platforms BE hardware can indicate spurious UEs.
1982 	 * Allow the h/w to stop working completely in case of a real UE.
1983 	 * Hence not setting the hw_error for UE detection.
1984 	 */
1985 	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1986 		sc->hw_error = TRUE;
1987 		device_printf(sc->dev, "Error detected in the card\n");
1988 	}
1989 
1990 	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1991 		device_printf(sc->dev,
1992 				"ERR: sliport status 0x%x\n", sliport_status);
1993 		device_printf(sc->dev,
1994 				"ERR: sliport error1 0x%x\n", sliport_err1);
1995 		device_printf(sc->dev,
1996 				"ERR: sliport error2 0x%x\n", sliport_err2);
1997 	}
1998 
1999 	if (ue_low) {
2000 		for (i = 0; ue_low; ue_low >>= 1, i++) {
2001 			if (ue_low & 1)
2002 				device_printf(sc->dev, "UE: %s bit set\n",
2003 							ue_status_low_desc[i]);
2004 		}
2005 	}
2006 
2007 	if (ue_high) {
2008 		for (i = 0; ue_high; ue_high >>= 1, i++) {
2009 			if (ue_high & 1)
2010 				device_printf(sc->dev, "UE: %s bit set\n",
2011 							ue_status_hi_desc[i]);
2012 		}
2013 	}
2014 
2015 }
2016 
2017 
2018 static void
2019 oce_local_timer(void *arg)
2020 {
2021 	POCE_SOFTC sc = arg;
2022 	int i = 0;
2023 
2024 	oce_detect_hw_error(sc);
2025 	oce_refresh_nic_stats(sc);
2026 	oce_refresh_queue_stats(sc);
2027 	oce_mac_addr_set(sc);
2028 
2029 	/* TX Watch Dog*/
2030 	for (i = 0; i < sc->nwqs; i++)
2031 		oce_tx_restart(sc, sc->wq[i]);
2032 
2033 	/* calculate and set the eq delay for optimal interrupt rate */
2034 	if (IS_BE(sc) || IS_SH(sc))
2035 		oce_eqd_set_periodic(sc);
2036 
2037 	callout_reset(&sc->timer, hz, oce_local_timer, sc);
2038 }
2039 
2040 
2041 /* NOTE : This should only be called holding
2042  *        DEVICE_LOCK.
2043  */
2044 static void
2045 oce_if_deactivate(POCE_SOFTC sc)
2046 {
2047 	int i, mtime = 0;
2048 	int wait_req = 0;
2049 	struct oce_rq *rq;
2050 	struct oce_wq *wq;
2051 	struct oce_eq *eq;
2052 
2053 	sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2054 
2055 	/*Wait for max of 400ms for TX completions to be done */
2056 	while (mtime < 400) {
2057 		wait_req = 0;
2058 		for_all_wq_queues(sc, wq, i) {
2059 			if (wq->ring->num_used) {
2060 				wait_req = 1;
2061 				DELAY(1);
2062 				break;
2063 			}
2064 		}
2065 		mtime += 1;
2066 		if (!wait_req)
2067 			break;
2068 	}
2069 
2070 	/* Stop intrs and finish any bottom halves pending */
2071 	oce_hw_intr_disable(sc);
2072 
2073 	/* Since taskqueue_drain takes a Gaint Lock, We should not acquire
2074 	   any other lock. So unlock device lock and require after
2075 	   completing taskqueue_drain.
2076 	*/
2077 	UNLOCK(&sc->dev_lock);
2078 	for (i = 0; i < sc->intr_count; i++) {
2079 		if (sc->intrs[i].tq != NULL) {
2080 			taskqueue_drain(sc->intrs[i].tq, &sc->intrs[i].task);
2081 		}
2082 	}
2083 	LOCK(&sc->dev_lock);
2084 
2085 	/* Delete RX queue in card with flush param */
2086 	oce_stop_rx(sc);
2087 
2088 	/* Invalidate any pending cq and eq entries*/
2089 	for_all_evnt_queues(sc, eq, i)
2090 		oce_drain_eq(eq);
2091 	for_all_rq_queues(sc, rq, i)
2092 		oce_drain_rq_cq(rq);
2093 	for_all_wq_queues(sc, wq, i)
2094 		oce_drain_wq_cq(wq);
2095 
2096 	/* But still we need to get MCC aync events.
2097 	   So enable intrs and also arm first EQ
2098 	*/
2099 	oce_hw_intr_enable(sc);
2100 	oce_arm_eq(sc, sc->eq[0]->eq_id, 0, TRUE, FALSE);
2101 
2102 	DELAY(10);
2103 }
2104 
2105 
2106 static void
2107 oce_if_activate(POCE_SOFTC sc)
2108 {
2109 	struct oce_eq *eq;
2110 	struct oce_rq *rq;
2111 	struct oce_wq *wq;
2112 	int i, rc = 0;
2113 
2114 	sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;
2115 
2116 	oce_hw_intr_disable(sc);
2117 
2118 	oce_start_rx(sc);
2119 
2120 	for_all_rq_queues(sc, rq, i) {
2121 		rc = oce_start_rq(rq);
2122 		if (rc)
2123 			device_printf(sc->dev, "Unable to start RX\n");
2124 	}
2125 
2126 	for_all_wq_queues(sc, wq, i) {
2127 		rc = oce_start_wq(wq);
2128 		if (rc)
2129 			device_printf(sc->dev, "Unable to start TX\n");
2130 	}
2131 
2132 
2133 	for_all_evnt_queues(sc, eq, i)
2134 		oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
2135 
2136 	oce_hw_intr_enable(sc);
2137 
2138 }
2139 
2140 static void
2141 process_link_state(POCE_SOFTC sc, struct oce_async_cqe_link_state *acqe)
2142 {
2143 	/* Update Link status */
2144 	if ((acqe->u0.s.link_status & ~ASYNC_EVENT_LOGICAL) ==
2145 	     ASYNC_EVENT_LINK_UP) {
2146 		sc->link_status = ASYNC_EVENT_LINK_UP;
2147 		if_link_state_change(sc->ifp, LINK_STATE_UP);
2148 	} else {
2149 		sc->link_status = ASYNC_EVENT_LINK_DOWN;
2150 		if_link_state_change(sc->ifp, LINK_STATE_DOWN);
2151 	}
2152 }
2153 
2154 
2155 /* Handle the Completion Queue for the Mailbox/Async notifications */
2156 uint16_t
2157 oce_mq_handler(void *arg)
2158 {
2159 	struct oce_mq *mq = (struct oce_mq *)arg;
2160 	POCE_SOFTC sc = mq->parent;
2161 	struct oce_cq *cq = mq->cq;
2162 	int num_cqes = 0, evt_type = 0, optype = 0;
2163 	struct oce_mq_cqe *cqe;
2164 	struct oce_async_cqe_link_state *acqe;
2165 	struct oce_async_event_grp5_pvid_state *gcqe;
2166 	struct oce_async_event_qnq *dbgcqe;
2167 
2168 
2169 	bus_dmamap_sync(cq->ring->dma.tag,
2170 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2171 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2172 
2173 	while (cqe->u0.dw[3]) {
2174 		DW_SWAP((uint32_t *) cqe, sizeof(oce_mq_cqe));
2175 		if (cqe->u0.s.async_event) {
2176 			evt_type = cqe->u0.s.event_type;
2177 			optype = cqe->u0.s.async_type;
2178 			if (evt_type  == ASYNC_EVENT_CODE_LINK_STATE) {
2179 				/* Link status evt */
2180 				acqe = (struct oce_async_cqe_link_state *)cqe;
2181 				process_link_state(sc, acqe);
2182 			} else if ((evt_type == ASYNC_EVENT_GRP5) &&
2183 				   (optype == ASYNC_EVENT_PVID_STATE)) {
2184 				/* GRP5 PVID */
2185 				gcqe =
2186 				(struct oce_async_event_grp5_pvid_state *)cqe;
2187 				if (gcqe->enabled)
2188 					sc->pvid = gcqe->tag & VLAN_VID_MASK;
2189 				else
2190 					sc->pvid = 0;
2191 
2192 			}
2193 			else if(evt_type == ASYNC_EVENT_CODE_DEBUG &&
2194 				optype == ASYNC_EVENT_DEBUG_QNQ) {
2195 				dbgcqe =
2196 				(struct oce_async_event_qnq *)cqe;
2197 				if(dbgcqe->valid)
2198 					sc->qnqid = dbgcqe->vlan_tag;
2199 				sc->qnq_debug_event = TRUE;
2200 			}
2201 		}
2202 		cqe->u0.dw[3] = 0;
2203 		RING_GET(cq->ring, 1);
2204 		bus_dmamap_sync(cq->ring->dma.tag,
2205 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2206 		cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2207 		num_cqes++;
2208 	}
2209 
2210 	if (num_cqes)
2211 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
2212 
2213 	return 0;
2214 }
2215 
2216 
2217 static void
2218 setup_max_queues_want(POCE_SOFTC sc)
2219 {
2220 	/* Check if it is FLEX machine. Is so dont use RSS */
2221 	if ((sc->function_mode & FNM_FLEX10_MODE) ||
2222 	    (sc->function_mode & FNM_UMC_MODE)    ||
2223 	    (sc->function_mode & FNM_VNIC_MODE)	  ||
2224 	    (!is_rss_enabled(sc))		  ||
2225 	    IS_BE2(sc)) {
2226 		sc->nrqs = 1;
2227 		sc->nwqs = 1;
2228 	} else {
2229 		sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
2230 		sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs);
2231 	}
2232 
2233 	if (IS_BE2(sc) && is_rss_enabled(sc))
2234 		sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
2235 }
2236 
2237 
2238 static void
2239 update_queues_got(POCE_SOFTC sc)
2240 {
2241 	if (is_rss_enabled(sc)) {
2242 		sc->nrqs = sc->intr_count + 1;
2243 		sc->nwqs = sc->intr_count;
2244 	} else {
2245 		sc->nrqs = 1;
2246 		sc->nwqs = 1;
2247 	}
2248 
2249 	if (IS_BE2(sc))
2250 		sc->nwqs = 1;
2251 }
2252 
2253 static int
2254 oce_check_ipv6_ext_hdr(struct mbuf *m)
2255 {
2256 	struct ether_header *eh = mtod(m, struct ether_header *);
2257 	caddr_t m_datatemp = m->m_data;
2258 
2259 	if (eh->ether_type == htons(ETHERTYPE_IPV6)) {
2260 		m->m_data += sizeof(struct ether_header);
2261 		struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
2262 
2263 		if((ip6->ip6_nxt != IPPROTO_TCP) && \
2264 				(ip6->ip6_nxt != IPPROTO_UDP)){
2265 			struct ip6_ext *ip6e = NULL;
2266 			m->m_data += sizeof(struct ip6_hdr);
2267 
2268 			ip6e = (struct ip6_ext *) mtod(m, struct ip6_ext *);
2269 			if(ip6e->ip6e_len == 0xff) {
2270 				m->m_data = m_datatemp;
2271 				return TRUE;
2272 			}
2273 		}
2274 		m->m_data = m_datatemp;
2275 	}
2276 	return FALSE;
2277 }
2278 
2279 static int
2280 is_be3_a1(POCE_SOFTC sc)
2281 {
2282 	if((sc->flags & OCE_FLAGS_BE3)  && ((sc->asic_revision & 0xFF) < 2)) {
2283 		return TRUE;
2284 	}
2285 	return FALSE;
2286 }
2287 
2288 static struct mbuf *
2289 oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete)
2290 {
2291 	uint16_t vlan_tag = 0;
2292 
2293 	if(!M_WRITABLE(m))
2294 		return NULL;
2295 
2296 	/* Embed vlan tag in the packet if it is not part of it */
2297 	if(m->m_flags & M_VLANTAG) {
2298 		vlan_tag = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag);
2299 		m->m_flags &= ~M_VLANTAG;
2300 	}
2301 
2302 	/* if UMC, ignore vlan tag insertion and instead insert pvid */
2303 	if(sc->pvid) {
2304 		if(!vlan_tag)
2305 			vlan_tag = sc->pvid;
2306 		*complete = FALSE;
2307 	}
2308 
2309 	if(vlan_tag) {
2310 		m = ether_vlanencap(m, vlan_tag);
2311 	}
2312 
2313 	if(sc->qnqid) {
2314 		m = ether_vlanencap(m, sc->qnqid);
2315 		*complete = FALSE;
2316 	}
2317 	return m;
2318 }
2319 
2320 static int
2321 oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m)
2322 {
2323 	if(is_be3_a1(sc) && IS_QNQ_OR_UMC(sc) && \
2324 			oce_check_ipv6_ext_hdr(m)) {
2325 		return TRUE;
2326 	}
2327 	return FALSE;
2328 }
2329 
2330 static void
2331 oce_get_config(POCE_SOFTC sc)
2332 {
2333 	int rc = 0;
2334 	uint32_t max_rss = 0;
2335 
2336 	if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native))
2337 		max_rss = OCE_LEGACY_MODE_RSS;
2338 	else
2339 		max_rss = OCE_MAX_RSS;
2340 
2341 	if (!IS_BE(sc)) {
2342 		rc = oce_get_profile_config(sc, max_rss);
2343 		if (rc) {
2344 			sc->nwqs = OCE_MAX_WQ;
2345 			sc->nrssqs = max_rss;
2346 			sc->nrqs = sc->nrssqs + 1;
2347 		}
2348 	}
2349 	else { /* For BE3 don't rely on fw for determining the resources */
2350 		sc->nrssqs = max_rss;
2351 		sc->nrqs = sc->nrssqs + 1;
2352 		sc->nwqs = OCE_MAX_WQ;
2353 		sc->max_vlans = MAX_VLANFILTER_SIZE;
2354 	}
2355 }
2356