xref: /freebsd/sys/dev/oce/oce_if.c (revision c66ec88fed842fbaad62c30d510644ceb7bd2d71)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (C) 2013 Emulex
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  *    this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the Emulex Corporation nor the names of its
18  *    contributors may be used to endorse or promote products derived from
19  *    this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Contact Information:
34  * freebsd-drivers@emulex.com
35  *
36  * Emulex
37  * 3333 Susan Street
38  * Costa Mesa, CA 92626
39  */
40 
41 /* $FreeBSD$ */
42 
43 #include "opt_inet6.h"
44 #include "opt_inet.h"
45 
46 #include "oce_if.h"
47 #include "oce_user.h"
48 
49 #define is_tso_pkt(m) (m->m_pkthdr.csum_flags & CSUM_TSO)
50 
51 /* UE Status Low CSR */
52 static char *ue_status_low_desc[] = {
53         "CEV",
54         "CTX",
55         "DBUF",
56         "ERX",
57         "Host",
58         "MPU",
59         "NDMA",
60         "PTC ",
61         "RDMA ",
62         "RXF ",
63         "RXIPS ",
64         "RXULP0 ",
65         "RXULP1 ",
66         "RXULP2 ",
67         "TIM ",
68         "TPOST ",
69         "TPRE ",
70         "TXIPS ",
71         "TXULP0 ",
72         "TXULP1 ",
73         "UC ",
74         "WDMA ",
75         "TXULP2 ",
76         "HOST1 ",
77         "P0_OB_LINK ",
78         "P1_OB_LINK ",
79         "HOST_GPIO ",
80         "MBOX ",
81         "AXGMAC0",
82         "AXGMAC1",
83         "JTAG",
84         "MPU_INTPEND"
85 };
86 
87 /* UE Status High CSR */
88 static char *ue_status_hi_desc[] = {
89         "LPCMEMHOST",
90         "MGMT_MAC",
91         "PCS0ONLINE",
92         "MPU_IRAM",
93         "PCS1ONLINE",
94         "PCTL0",
95         "PCTL1",
96         "PMEM",
97         "RR",
98         "TXPB",
99         "RXPP",
100         "XAUI",
101         "TXP",
102         "ARM",
103         "IPC",
104         "HOST2",
105         "HOST3",
106         "HOST4",
107         "HOST5",
108         "HOST6",
109         "HOST7",
110         "HOST8",
111         "HOST9",
112         "NETC",
113         "Unknown",
114         "Unknown",
115         "Unknown",
116         "Unknown",
117         "Unknown",
118         "Unknown",
119         "Unknown",
120         "Unknown"
121 };
122 
123 struct oce_common_cqe_info{
124         uint8_t vtp:1;
125         uint8_t l4_cksum_pass:1;
126         uint8_t ip_cksum_pass:1;
127         uint8_t ipv6_frame:1;
128         uint8_t qnq:1;
129         uint8_t rsvd:3;
130         uint8_t num_frags;
131         uint16_t pkt_size;
132         uint16_t vtag;
133 };
134 
135 /* Driver entry points prototypes */
136 static int  oce_probe(device_t dev);
137 static int  oce_attach(device_t dev);
138 static int  oce_detach(device_t dev);
139 static int  oce_shutdown(device_t dev);
140 static int  oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
141 static void oce_init(void *xsc);
142 static int  oce_multiq_start(struct ifnet *ifp, struct mbuf *m);
143 static void oce_multiq_flush(struct ifnet *ifp);
144 
145 /* Driver interrupt routines protypes */
146 static void oce_intr(void *arg, int pending);
147 static int  oce_setup_intr(POCE_SOFTC sc);
148 static int  oce_fast_isr(void *arg);
149 static int  oce_alloc_intr(POCE_SOFTC sc, int vector,
150 			  void (*isr) (void *arg, int pending));
151 
152 /* Media callbacks prototypes */
153 static void oce_media_status(struct ifnet *ifp, struct ifmediareq *req);
154 static int  oce_media_change(struct ifnet *ifp);
155 
156 /* Transmit routines prototypes */
157 static int  oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index);
158 static void oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq);
159 static void oce_process_tx_completion(struct oce_wq *wq);
160 static int  oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m,
161 				 struct oce_wq *wq);
162 
163 /* Receive routines prototypes */
164 static int  oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe);
165 static int  oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe);
166 static void oce_rx(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe);
167 static void oce_check_rx_bufs(POCE_SOFTC sc, uint32_t num_cqes, struct oce_rq *rq);
168 static uint16_t oce_rq_handler_lro(void *arg);
169 static void oce_correct_header(struct mbuf *m, struct nic_hwlro_cqe_part1 *cqe1, struct nic_hwlro_cqe_part2 *cqe2);
170 static void oce_rx_lro(struct oce_rq *rq, struct nic_hwlro_singleton_cqe *cqe, struct nic_hwlro_cqe_part2 *cqe2);
171 static void oce_rx_mbuf_chain(struct oce_rq *rq, struct oce_common_cqe_info *cqe_info, struct mbuf **m);
172 
173 /* Helper function prototypes in this file */
174 static int  oce_attach_ifp(POCE_SOFTC sc);
175 static void oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag);
176 static void oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag);
177 static int  oce_vid_config(POCE_SOFTC sc);
178 static void oce_mac_addr_set(POCE_SOFTC sc);
179 static int  oce_handle_passthrough(struct ifnet *ifp, caddr_t data);
180 static void oce_local_timer(void *arg);
181 static void oce_if_deactivate(POCE_SOFTC sc);
182 static void oce_if_activate(POCE_SOFTC sc);
183 static void setup_max_queues_want(POCE_SOFTC sc);
184 static void update_queues_got(POCE_SOFTC sc);
185 static void process_link_state(POCE_SOFTC sc,
186 		 struct oce_async_cqe_link_state *acqe);
187 static int oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m);
188 static void oce_get_config(POCE_SOFTC sc);
189 static struct mbuf *oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete);
190 static void oce_read_env_variables(POCE_SOFTC sc);
191 
192 /* IP specific */
193 #if defined(INET6) || defined(INET)
194 static int  oce_init_lro(POCE_SOFTC sc);
195 static struct mbuf * oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp);
196 #endif
197 
198 static device_method_t oce_dispatch[] = {
199 	DEVMETHOD(device_probe, oce_probe),
200 	DEVMETHOD(device_attach, oce_attach),
201 	DEVMETHOD(device_detach, oce_detach),
202 	DEVMETHOD(device_shutdown, oce_shutdown),
203 
204 	DEVMETHOD_END
205 };
206 
207 static driver_t oce_driver = {
208 	"oce",
209 	oce_dispatch,
210 	sizeof(OCE_SOFTC)
211 };
212 static devclass_t oce_devclass;
213 
214 /* global vars */
215 const char component_revision[32] = {"///" COMPONENT_REVISION "///"};
216 
217 /* Module capabilites and parameters */
218 uint32_t oce_max_rsp_handled = OCE_MAX_RSP_HANDLED;
219 uint32_t oce_enable_rss = OCE_MODCAP_RSS;
220 uint32_t oce_rq_buf_size = 2048;
221 
222 TUNABLE_INT("hw.oce.max_rsp_handled", &oce_max_rsp_handled);
223 TUNABLE_INT("hw.oce.enable_rss", &oce_enable_rss);
224 
225 /* Supported devices table */
226 static uint32_t supportedDevices[] =  {
227 	(PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE2,
228 	(PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE3,
229 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3,
230 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201,
231 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF,
232 	(PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH
233 };
234 
235 DRIVER_MODULE(oce, pci, oce_driver, oce_devclass, 0, 0);
236 MODULE_PNP_INFO("W32:vendor/device", pci, oce, supportedDevices,
237     nitems(supportedDevices));
238 MODULE_DEPEND(oce, pci, 1, 1, 1);
239 MODULE_DEPEND(oce, ether, 1, 1, 1);
240 MODULE_VERSION(oce, 1);
241 
242 POCE_SOFTC softc_head = NULL;
243 POCE_SOFTC softc_tail = NULL;
244 
245 struct oce_rdma_if *oce_rdma_if = NULL;
246 
247 /*****************************************************************************
248  *			Driver entry points functions                        *
249  *****************************************************************************/
250 
251 static int
252 oce_probe(device_t dev)
253 {
254 	uint16_t vendor = 0;
255 	uint16_t device = 0;
256 	int i = 0;
257 	char str[256] = {0};
258 	POCE_SOFTC sc;
259 
260 	sc = device_get_softc(dev);
261 	bzero(sc, sizeof(OCE_SOFTC));
262 	sc->dev = dev;
263 
264 	vendor = pci_get_vendor(dev);
265 	device = pci_get_device(dev);
266 
267 	for (i = 0; i < (sizeof(supportedDevices) / sizeof(uint32_t)); i++) {
268 		if (vendor == ((supportedDevices[i] >> 16) & 0xffff)) {
269 			if (device == (supportedDevices[i] & 0xffff)) {
270 				sprintf(str, "%s:%s", "Emulex CNA NIC function",
271 					component_revision);
272 				device_set_desc_copy(dev, str);
273 
274 				switch (device) {
275 				case PCI_PRODUCT_BE2:
276 					sc->flags |= OCE_FLAGS_BE2;
277 					break;
278 				case PCI_PRODUCT_BE3:
279 					sc->flags |= OCE_FLAGS_BE3;
280 					break;
281 				case PCI_PRODUCT_XE201:
282 				case PCI_PRODUCT_XE201_VF:
283 					sc->flags |= OCE_FLAGS_XE201;
284 					break;
285 				case PCI_PRODUCT_SH:
286 					sc->flags |= OCE_FLAGS_SH;
287 					break;
288 				default:
289 					return ENXIO;
290 				}
291 				return BUS_PROBE_DEFAULT;
292 			}
293 		}
294 	}
295 
296 	return ENXIO;
297 }
298 
299 static int
300 oce_attach(device_t dev)
301 {
302 	POCE_SOFTC sc;
303 	int rc = 0;
304 
305 	sc = device_get_softc(dev);
306 
307 	rc = oce_hw_pci_alloc(sc);
308 	if (rc)
309 		return rc;
310 
311 	sc->tx_ring_size = OCE_TX_RING_SIZE;
312 	sc->rx_ring_size = OCE_RX_RING_SIZE;
313 	/* receive fragment size should be multiple of 2K */
314 	sc->rq_frag_size = ((oce_rq_buf_size / 2048) * 2048);
315 	sc->flow_control = OCE_DEFAULT_FLOW_CONTROL;
316 	sc->promisc	 = OCE_DEFAULT_PROMISCUOUS;
317 
318 	LOCK_CREATE(&sc->bmbx_lock, "Mailbox_lock");
319 	LOCK_CREATE(&sc->dev_lock,  "Device_lock");
320 
321 	/* initialise the hardware */
322 	rc = oce_hw_init(sc);
323 	if (rc)
324 		goto pci_res_free;
325 
326 	oce_read_env_variables(sc);
327 
328 	oce_get_config(sc);
329 
330 	setup_max_queues_want(sc);
331 
332 	rc = oce_setup_intr(sc);
333 	if (rc)
334 		goto mbox_free;
335 
336 	rc = oce_queue_init_all(sc);
337 	if (rc)
338 		goto intr_free;
339 
340 	rc = oce_attach_ifp(sc);
341 	if (rc)
342 		goto queues_free;
343 
344 #if defined(INET6) || defined(INET)
345 	rc = oce_init_lro(sc);
346 	if (rc)
347 		goto ifp_free;
348 #endif
349 
350 	rc = oce_hw_start(sc);
351 	if (rc)
352 		goto lro_free;
353 
354 	sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
355 				oce_add_vlan, sc, EVENTHANDLER_PRI_FIRST);
356 	sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
357 				oce_del_vlan, sc, EVENTHANDLER_PRI_FIRST);
358 
359 	rc = oce_stats_init(sc);
360 	if (rc)
361 		goto vlan_free;
362 
363 	oce_add_sysctls(sc);
364 
365 	callout_init(&sc->timer, CALLOUT_MPSAFE);
366 	rc = callout_reset(&sc->timer, 2 * hz, oce_local_timer, sc);
367 	if (rc)
368 		goto stats_free;
369 
370 	sc->next =NULL;
371 	if (softc_tail != NULL) {
372 	  softc_tail->next = sc;
373 	} else {
374 	  softc_head = sc;
375 	}
376 	softc_tail = sc;
377 
378 	return 0;
379 
380 stats_free:
381 	callout_drain(&sc->timer);
382 	oce_stats_free(sc);
383 vlan_free:
384 	if (sc->vlan_attach)
385 		EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
386 	if (sc->vlan_detach)
387 		EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
388 	oce_hw_intr_disable(sc);
389 lro_free:
390 #if defined(INET6) || defined(INET)
391 	oce_free_lro(sc);
392 ifp_free:
393 #endif
394 	ether_ifdetach(sc->ifp);
395 	if_free(sc->ifp);
396 queues_free:
397 	oce_queue_release_all(sc);
398 intr_free:
399 	oce_intr_free(sc);
400 mbox_free:
401 	oce_dma_free(sc, &sc->bsmbx);
402 pci_res_free:
403 	oce_hw_pci_free(sc);
404 	LOCK_DESTROY(&sc->dev_lock);
405 	LOCK_DESTROY(&sc->bmbx_lock);
406 	return rc;
407 
408 }
409 
410 static int
411 oce_detach(device_t dev)
412 {
413 	POCE_SOFTC sc = device_get_softc(dev);
414 	POCE_SOFTC poce_sc_tmp, *ppoce_sc_tmp1, poce_sc_tmp2 = NULL;
415 
416         poce_sc_tmp = softc_head;
417         ppoce_sc_tmp1 = &softc_head;
418         while (poce_sc_tmp != NULL) {
419           if (poce_sc_tmp == sc) {
420             *ppoce_sc_tmp1 = sc->next;
421             if (sc->next == NULL) {
422               softc_tail = poce_sc_tmp2;
423             }
424             break;
425           }
426           poce_sc_tmp2 = poce_sc_tmp;
427           ppoce_sc_tmp1 = &poce_sc_tmp->next;
428           poce_sc_tmp = poce_sc_tmp->next;
429         }
430 
431 	LOCK(&sc->dev_lock);
432 	oce_if_deactivate(sc);
433 	UNLOCK(&sc->dev_lock);
434 
435 	callout_drain(&sc->timer);
436 
437 	if (sc->vlan_attach != NULL)
438 		EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
439 	if (sc->vlan_detach != NULL)
440 		EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
441 
442 	ether_ifdetach(sc->ifp);
443 
444 	if_free(sc->ifp);
445 
446 	oce_hw_shutdown(sc);
447 
448 	bus_generic_detach(dev);
449 
450 	return 0;
451 }
452 
453 static int
454 oce_shutdown(device_t dev)
455 {
456 	int rc;
457 
458 	rc = oce_detach(dev);
459 
460 	return rc;
461 }
462 
463 static int
464 oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
465 {
466 	struct ifreq *ifr = (struct ifreq *)data;
467 	POCE_SOFTC sc = ifp->if_softc;
468 	struct ifi2creq i2c;
469 	uint8_t	offset = 0;
470 	int rc = 0;
471 	uint32_t u;
472 
473 	switch (command) {
474 	case SIOCGIFMEDIA:
475 		rc = ifmedia_ioctl(ifp, ifr, &sc->media, command);
476 		break;
477 
478 	case SIOCSIFMTU:
479 		if (ifr->ifr_mtu > OCE_MAX_MTU)
480 			rc = EINVAL;
481 		else
482 			ifp->if_mtu = ifr->ifr_mtu;
483 		break;
484 
485 	case SIOCSIFFLAGS:
486 		if (ifp->if_flags & IFF_UP) {
487 			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
488 				sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;
489 				oce_init(sc);
490 			}
491 			device_printf(sc->dev, "Interface Up\n");
492 		} else {
493 			LOCK(&sc->dev_lock);
494 
495 			sc->ifp->if_drv_flags &=
496 			    ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
497 			oce_if_deactivate(sc);
498 
499 			UNLOCK(&sc->dev_lock);
500 
501 			device_printf(sc->dev, "Interface Down\n");
502 		}
503 
504 		if ((ifp->if_flags & IFF_PROMISC) && !sc->promisc) {
505 			if (!oce_rxf_set_promiscuous(sc, (1 | (1 << 1))))
506 				sc->promisc = TRUE;
507 		} else if (!(ifp->if_flags & IFF_PROMISC) && sc->promisc) {
508 			if (!oce_rxf_set_promiscuous(sc, 0))
509 				sc->promisc = FALSE;
510 		}
511 
512 		break;
513 
514 	case SIOCADDMULTI:
515 	case SIOCDELMULTI:
516 		rc = oce_hw_update_multicast(sc);
517 		if (rc)
518 			device_printf(sc->dev,
519 				"Update multicast address failed\n");
520 		break;
521 
522 	case SIOCSIFCAP:
523 		u = ifr->ifr_reqcap ^ ifp->if_capenable;
524 
525 		if (u & IFCAP_TXCSUM) {
526 			ifp->if_capenable ^= IFCAP_TXCSUM;
527 			ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
528 
529 			if (IFCAP_TSO & ifp->if_capenable &&
530 			    !(IFCAP_TXCSUM & ifp->if_capenable)) {
531 				u &= ~IFCAP_TSO;
532 				ifp->if_capenable &= ~IFCAP_TSO;
533 				ifp->if_hwassist &= ~CSUM_TSO;
534 				if_printf(ifp,
535 					 "TSO disabled due to -txcsum.\n");
536 			}
537 		}
538 
539 		if (u & IFCAP_RXCSUM)
540 			ifp->if_capenable ^= IFCAP_RXCSUM;
541 
542 		if (u & IFCAP_TSO4) {
543 			ifp->if_capenable ^= IFCAP_TSO4;
544 
545 			if (IFCAP_TSO & ifp->if_capenable) {
546 				if (IFCAP_TXCSUM & ifp->if_capenable)
547 					ifp->if_hwassist |= CSUM_TSO;
548 				else {
549 					ifp->if_capenable &= ~IFCAP_TSO;
550 					ifp->if_hwassist &= ~CSUM_TSO;
551 					if_printf(ifp,
552 					    "Enable txcsum first.\n");
553 					rc = EAGAIN;
554 				}
555 			} else
556 				ifp->if_hwassist &= ~CSUM_TSO;
557 		}
558 
559 		if (u & IFCAP_VLAN_HWTAGGING)
560 			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
561 
562 		if (u & IFCAP_VLAN_HWFILTER) {
563 			ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
564 			oce_vid_config(sc);
565 		}
566 #if defined(INET6) || defined(INET)
567 		if (u & IFCAP_LRO) {
568 			ifp->if_capenable ^= IFCAP_LRO;
569 			if(sc->enable_hwlro) {
570 				if(ifp->if_capenable & IFCAP_LRO) {
571 					rc = oce_mbox_nic_set_iface_lro_config(sc, 1);
572 				}else {
573 					rc = oce_mbox_nic_set_iface_lro_config(sc, 0);
574 				}
575 			}
576 		}
577 #endif
578 
579 		break;
580 
581 	case SIOCGI2C:
582 		rc = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c));
583 		if (rc)
584 			break;
585 
586 		if (i2c.dev_addr == PAGE_NUM_A0) {
587 			offset = i2c.offset;
588 		} else if (i2c.dev_addr == PAGE_NUM_A2) {
589 			offset = TRANSCEIVER_A0_SIZE + i2c.offset;
590 		} else {
591 			rc = EINVAL;
592 			break;
593 		}
594 
595 		if (i2c.len > sizeof(i2c.data) ||
596 		    i2c.len + offset > sizeof(sfp_vpd_dump_buffer)) {
597 			rc = EINVAL;
598 			break;
599 		}
600 
601 		rc = oce_mbox_read_transrecv_data(sc, i2c.dev_addr);
602 		if (rc) {
603 			rc = -rc;
604 			break;
605 		}
606 
607 		memcpy(&i2c.data[0], &sfp_vpd_dump_buffer[offset], i2c.len);
608 
609 		rc = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c));
610 		break;
611 
612 	case SIOCGPRIVATE_0:
613 		rc = priv_check(curthread, PRIV_DRIVER);
614 		if (rc != 0)
615 			break;
616 		rc = oce_handle_passthrough(ifp, data);
617 		break;
618 	default:
619 		rc = ether_ioctl(ifp, command, data);
620 		break;
621 	}
622 
623 	return rc;
624 }
625 
626 static void
627 oce_init(void *arg)
628 {
629 	POCE_SOFTC sc = arg;
630 
631 	LOCK(&sc->dev_lock);
632 
633 	if (sc->ifp->if_flags & IFF_UP) {
634 		oce_if_deactivate(sc);
635 		oce_if_activate(sc);
636 	}
637 
638 	UNLOCK(&sc->dev_lock);
639 
640 }
641 
642 static int
643 oce_multiq_start(struct ifnet *ifp, struct mbuf *m)
644 {
645 	POCE_SOFTC sc = ifp->if_softc;
646 	struct oce_wq *wq = NULL;
647 	int queue_index = 0;
648 	int status = 0;
649 
650 	if (!sc->link_status)
651 		return ENXIO;
652 
653 	if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
654 		queue_index = m->m_pkthdr.flowid % sc->nwqs;
655 
656 	wq = sc->wq[queue_index];
657 
658 	LOCK(&wq->tx_lock);
659 	status = oce_multiq_transmit(ifp, m, wq);
660 	UNLOCK(&wq->tx_lock);
661 
662 	return status;
663 
664 }
665 
666 static void
667 oce_multiq_flush(struct ifnet *ifp)
668 {
669 	POCE_SOFTC sc = ifp->if_softc;
670 	struct mbuf     *m;
671 	int i = 0;
672 
673 	for (i = 0; i < sc->nwqs; i++) {
674 		while ((m = buf_ring_dequeue_sc(sc->wq[i]->br)) != NULL)
675 			m_freem(m);
676 	}
677 	if_qflush(ifp);
678 }
679 
680 /*****************************************************************************
681  *                   Driver interrupt routines functions                     *
682  *****************************************************************************/
683 
684 static void
685 oce_intr(void *arg, int pending)
686 {
687 
688 	POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
689 	POCE_SOFTC sc = ii->sc;
690 	struct oce_eq *eq = ii->eq;
691 	struct oce_eqe *eqe;
692 	struct oce_cq *cq = NULL;
693 	int i, num_eqes = 0;
694 
695 	bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
696 				 BUS_DMASYNC_POSTWRITE);
697 	do {
698 		eqe = RING_GET_CONSUMER_ITEM_VA(eq->ring, struct oce_eqe);
699 		if (eqe->evnt == 0)
700 			break;
701 		eqe->evnt = 0;
702 		bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
703 					BUS_DMASYNC_POSTWRITE);
704 		RING_GET(eq->ring, 1);
705 		num_eqes++;
706 
707 	} while (TRUE);
708 
709 	if (!num_eqes)
710 		goto eq_arm; /* Spurious */
711 
712  	/* Clear EQ entries, but dont arm */
713 	oce_arm_eq(sc, eq->eq_id, num_eqes, FALSE, FALSE);
714 
715 	/* Process TX, RX and MCC. But dont arm CQ*/
716 	for (i = 0; i < eq->cq_valid; i++) {
717 		cq = eq->cq[i];
718 		(*cq->cq_handler)(cq->cb_arg);
719 	}
720 
721 	/* Arm all cqs connected to this EQ */
722 	for (i = 0; i < eq->cq_valid; i++) {
723 		cq = eq->cq[i];
724 		oce_arm_cq(sc, cq->cq_id, 0, TRUE);
725 	}
726 
727 eq_arm:
728 	oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
729 
730 	return;
731 }
732 
733 static int
734 oce_setup_intr(POCE_SOFTC sc)
735 {
736 	int rc = 0, use_intx = 0;
737 	int vector = 0, req_vectors = 0;
738 	int tot_req_vectors, tot_vectors;
739 
740 	if (is_rss_enabled(sc))
741 		req_vectors = MAX((sc->nrqs - 1), sc->nwqs);
742 	else
743 		req_vectors = 1;
744 
745 	tot_req_vectors = req_vectors;
746 	if (sc->rdma_flags & OCE_RDMA_FLAG_SUPPORTED) {
747 	  if (req_vectors > 1) {
748 	    tot_req_vectors += OCE_RDMA_VECTORS;
749 	    sc->roce_intr_count = OCE_RDMA_VECTORS;
750 	  }
751 	}
752 
753         if (sc->flags & OCE_FLAGS_MSIX_CAPABLE) {
754 		sc->intr_count = req_vectors;
755                 tot_vectors = tot_req_vectors;
756 		rc = pci_alloc_msix(sc->dev, &tot_vectors);
757 		if (rc != 0) {
758 			use_intx = 1;
759 			pci_release_msi(sc->dev);
760 		} else {
761 		  if (sc->rdma_flags & OCE_RDMA_FLAG_SUPPORTED) {
762 		    if (tot_vectors < tot_req_vectors) {
763 		      if (sc->intr_count < (2 * OCE_RDMA_VECTORS)) {
764 			sc->roce_intr_count = (tot_vectors / 2);
765 		      }
766 		      sc->intr_count = tot_vectors - sc->roce_intr_count;
767 		    }
768 		  } else {
769 		    sc->intr_count = tot_vectors;
770 		  }
771     		  sc->flags |= OCE_FLAGS_USING_MSIX;
772 		}
773 	} else
774 		use_intx = 1;
775 
776 	if (use_intx)
777 		sc->intr_count = 1;
778 
779 	/* Scale number of queues based on intr we got */
780 	update_queues_got(sc);
781 
782 	if (use_intx) {
783 		device_printf(sc->dev, "Using legacy interrupt\n");
784 		rc = oce_alloc_intr(sc, vector, oce_intr);
785 		if (rc)
786 			goto error;
787 	} else {
788 		for (; vector < sc->intr_count; vector++) {
789 			rc = oce_alloc_intr(sc, vector, oce_intr);
790 			if (rc)
791 				goto error;
792 		}
793 	}
794 
795 	return 0;
796 error:
797 	oce_intr_free(sc);
798 	return rc;
799 }
800 
801 static int
802 oce_fast_isr(void *arg)
803 {
804 	POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
805 	POCE_SOFTC sc = ii->sc;
806 
807 	if (ii->eq == NULL)
808 		return FILTER_STRAY;
809 
810 	oce_arm_eq(sc, ii->eq->eq_id, 0, FALSE, TRUE);
811 
812 	taskqueue_enqueue(ii->tq, &ii->task);
813 
814  	ii->eq->intr++;
815 
816 	return FILTER_HANDLED;
817 }
818 
819 static int
820 oce_alloc_intr(POCE_SOFTC sc, int vector, void (*isr) (void *arg, int pending))
821 {
822 	POCE_INTR_INFO ii;
823 	int rc = 0, rr;
824 
825 	if (vector >= OCE_MAX_EQ)
826 		return (EINVAL);
827 
828 	ii = &sc->intrs[vector];
829 
830 	/* Set the resource id for the interrupt.
831 	 * MSIx is vector + 1 for the resource id,
832 	 * INTx is 0 for the resource id.
833 	 */
834 	if (sc->flags & OCE_FLAGS_USING_MSIX)
835 		rr = vector + 1;
836 	else
837 		rr = 0;
838 	ii->intr_res = bus_alloc_resource_any(sc->dev,
839 					      SYS_RES_IRQ,
840 					      &rr, RF_ACTIVE|RF_SHAREABLE);
841 	ii->irq_rr = rr;
842 	if (ii->intr_res == NULL) {
843 		device_printf(sc->dev,
844 			  "Could not allocate interrupt\n");
845 		rc = ENXIO;
846 		return rc;
847 	}
848 
849 	TASK_INIT(&ii->task, 0, isr, ii);
850 	ii->vector = vector;
851 	sprintf(ii->task_name, "oce_task[%d]", ii->vector);
852 	ii->tq = taskqueue_create_fast(ii->task_name,
853 			M_NOWAIT,
854 			taskqueue_thread_enqueue,
855 			&ii->tq);
856 	taskqueue_start_threads(&ii->tq, 1, PI_NET, "%s taskq",
857 			device_get_nameunit(sc->dev));
858 
859 	ii->sc = sc;
860 	rc = bus_setup_intr(sc->dev,
861 			ii->intr_res,
862 			INTR_TYPE_NET,
863 			oce_fast_isr, NULL, ii, &ii->tag);
864 	return rc;
865 
866 }
867 
868 void
869 oce_intr_free(POCE_SOFTC sc)
870 {
871 	int i = 0;
872 
873 	for (i = 0; i < sc->intr_count; i++) {
874 
875 		if (sc->intrs[i].tag != NULL)
876 			bus_teardown_intr(sc->dev, sc->intrs[i].intr_res,
877 						sc->intrs[i].tag);
878 		if (sc->intrs[i].tq != NULL)
879 			taskqueue_free(sc->intrs[i].tq);
880 
881 		if (sc->intrs[i].intr_res != NULL)
882 			bus_release_resource(sc->dev, SYS_RES_IRQ,
883 						sc->intrs[i].irq_rr,
884 						sc->intrs[i].intr_res);
885 		sc->intrs[i].tag = NULL;
886 		sc->intrs[i].intr_res = NULL;
887 	}
888 
889 	if (sc->flags & OCE_FLAGS_USING_MSIX)
890 		pci_release_msi(sc->dev);
891 
892 }
893 
894 /******************************************************************************
895 *			  Media callbacks functions 			      *
896 ******************************************************************************/
897 
898 static void
899 oce_media_status(struct ifnet *ifp, struct ifmediareq *req)
900 {
901 	POCE_SOFTC sc = (POCE_SOFTC) ifp->if_softc;
902 
903 	req->ifm_status = IFM_AVALID;
904 	req->ifm_active = IFM_ETHER;
905 
906 	if (sc->link_status == 1)
907 		req->ifm_status |= IFM_ACTIVE;
908 	else
909 		return;
910 
911 	switch (sc->link_speed) {
912 	case 1: /* 10 Mbps */
913 		req->ifm_active |= IFM_10_T | IFM_FDX;
914 		sc->speed = 10;
915 		break;
916 	case 2: /* 100 Mbps */
917 		req->ifm_active |= IFM_100_TX | IFM_FDX;
918 		sc->speed = 100;
919 		break;
920 	case 3: /* 1 Gbps */
921 		req->ifm_active |= IFM_1000_T | IFM_FDX;
922 		sc->speed = 1000;
923 		break;
924 	case 4: /* 10 Gbps */
925 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
926 		sc->speed = 10000;
927 		break;
928 	case 5: /* 20 Gbps */
929 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
930 		sc->speed = 20000;
931 		break;
932 	case 6: /* 25 Gbps */
933 		req->ifm_active |= IFM_10G_SR | IFM_FDX;
934 		sc->speed = 25000;
935 		break;
936 	case 7: /* 40 Gbps */
937 		req->ifm_active |= IFM_40G_SR4 | IFM_FDX;
938 		sc->speed = 40000;
939 		break;
940 	default:
941 		sc->speed = 0;
942 		break;
943 	}
944 
945 	return;
946 }
947 
948 int
949 oce_media_change(struct ifnet *ifp)
950 {
951 	return 0;
952 }
953 
954 static void oce_is_pkt_dest_bmc(POCE_SOFTC sc,
955 				struct mbuf *m, boolean_t *os2bmc,
956 				struct mbuf **m_new)
957 {
958 	struct ether_header *eh = NULL;
959 
960 	eh = mtod(m, struct ether_header *);
961 
962 	if (!is_os2bmc_enabled(sc) || *os2bmc) {
963 		*os2bmc = FALSE;
964 		goto done;
965 	}
966 	if (!ETHER_IS_MULTICAST(eh->ether_dhost))
967 		goto done;
968 
969 	if (is_mc_allowed_on_bmc(sc, eh) ||
970 	    is_bc_allowed_on_bmc(sc, eh) ||
971 	    is_arp_allowed_on_bmc(sc, ntohs(eh->ether_type))) {
972 		*os2bmc = TRUE;
973 		goto done;
974 	}
975 
976 	if (mtod(m, struct ip *)->ip_p == IPPROTO_IPV6) {
977 		struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
978 		uint8_t nexthdr = ip6->ip6_nxt;
979 		if (nexthdr == IPPROTO_ICMPV6) {
980 			struct icmp6_hdr *icmp6 = (struct icmp6_hdr *)(ip6 + 1);
981 			switch (icmp6->icmp6_type) {
982 			case ND_ROUTER_ADVERT:
983 				*os2bmc = is_ipv6_ra_filt_enabled(sc);
984 				goto done;
985 			case ND_NEIGHBOR_ADVERT:
986 				*os2bmc = is_ipv6_na_filt_enabled(sc);
987 				goto done;
988 			default:
989 				break;
990 			}
991 		}
992 	}
993 
994 	if (mtod(m, struct ip *)->ip_p == IPPROTO_UDP) {
995 		struct ip *ip = mtod(m, struct ip *);
996 		int iphlen = ip->ip_hl << 2;
997 		struct udphdr *uh = (struct udphdr *)((caddr_t)ip + iphlen);
998 		switch (uh->uh_dport) {
999 		case DHCP_CLIENT_PORT:
1000 			*os2bmc = is_dhcp_client_filt_enabled(sc);
1001 			goto done;
1002 		case DHCP_SERVER_PORT:
1003 			*os2bmc = is_dhcp_srvr_filt_enabled(sc);
1004 			goto done;
1005 		case NET_BIOS_PORT1:
1006 		case NET_BIOS_PORT2:
1007 			*os2bmc = is_nbios_filt_enabled(sc);
1008 			goto done;
1009 		case DHCPV6_RAS_PORT:
1010 			*os2bmc = is_ipv6_ras_filt_enabled(sc);
1011 			goto done;
1012 		default:
1013 			break;
1014 		}
1015 	}
1016 done:
1017 	if (*os2bmc) {
1018 		*m_new = m_dup(m, M_NOWAIT);
1019 		if (!*m_new) {
1020 			*os2bmc = FALSE;
1021 			return;
1022 		}
1023 		*m_new = oce_insert_vlan_tag(sc, *m_new, NULL);
1024 	}
1025 }
1026 
1027 /*****************************************************************************
1028  *			  Transmit routines functions			     *
1029  *****************************************************************************/
1030 
1031 static int
1032 oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index)
1033 {
1034 	int rc = 0, i, retry_cnt = 0;
1035 	bus_dma_segment_t segs[OCE_MAX_TX_ELEMENTS];
1036 	struct mbuf *m, *m_temp, *m_new = NULL;
1037 	struct oce_wq *wq = sc->wq[wq_index];
1038 	struct oce_packet_desc *pd;
1039 	struct oce_nic_hdr_wqe *nichdr;
1040 	struct oce_nic_frag_wqe *nicfrag;
1041 	struct ether_header *eh = NULL;
1042 	int num_wqes;
1043 	uint32_t reg_value;
1044 	boolean_t complete = TRUE;
1045 	boolean_t os2bmc = FALSE;
1046 
1047 	m = *mpp;
1048 	if (!m)
1049 		return EINVAL;
1050 
1051 	if (!(m->m_flags & M_PKTHDR)) {
1052 		rc = ENXIO;
1053 		goto free_ret;
1054 	}
1055 
1056 	/* Don't allow non-TSO packets longer than MTU */
1057 	if (!is_tso_pkt(m)) {
1058 		eh = mtod(m, struct ether_header *);
1059 		if(m->m_pkthdr.len > ETHER_MAX_FRAME(sc->ifp, eh->ether_type, FALSE))
1060 			 goto free_ret;
1061 	}
1062 
1063 	if(oce_tx_asic_stall_verify(sc, m)) {
1064 		m = oce_insert_vlan_tag(sc, m, &complete);
1065 		if(!m) {
1066 			device_printf(sc->dev, "Insertion unsuccessful\n");
1067 			return 0;
1068 		}
1069 	}
1070 
1071 	/* Lancer, SH ASIC has a bug wherein Packets that are 32 bytes or less
1072 	 * may cause a transmit stall on that port. So the work-around is to
1073 	 * pad short packets (<= 32 bytes) to a 36-byte length.
1074 	*/
1075 	if(IS_SH(sc) || IS_XE201(sc) ) {
1076 		if(m->m_pkthdr.len <= 32) {
1077 			char buf[36];
1078 			bzero((void *)buf, 36);
1079 			m_append(m, (36 - m->m_pkthdr.len), buf);
1080 		}
1081 	}
1082 
1083 tx_start:
1084 	if (m->m_pkthdr.csum_flags & CSUM_TSO) {
1085 		/* consolidate packet buffers for TSO/LSO segment offload */
1086 #if defined(INET6) || defined(INET)
1087 		m = oce_tso_setup(sc, mpp);
1088 #else
1089 		m = NULL;
1090 #endif
1091 		if (m == NULL) {
1092 			rc = ENXIO;
1093 			goto free_ret;
1094 		}
1095 	}
1096 
1097 	pd = &wq->pckts[wq->pkt_desc_head];
1098 
1099 retry:
1100 	rc = bus_dmamap_load_mbuf_sg(wq->tag,
1101 				     pd->map,
1102 				     m, segs, &pd->nsegs, BUS_DMA_NOWAIT);
1103 	if (rc == 0) {
1104 		num_wqes = pd->nsegs + 1;
1105 		if (IS_BE(sc) || IS_SH(sc)) {
1106 			/*Dummy required only for BE3.*/
1107 			if (num_wqes & 1)
1108 				num_wqes++;
1109 		}
1110 		if (num_wqes >= RING_NUM_FREE(wq->ring)) {
1111 			bus_dmamap_unload(wq->tag, pd->map);
1112 			return EBUSY;
1113 		}
1114 		atomic_store_rel_int(&wq->pkt_desc_head,
1115 				     (wq->pkt_desc_head + 1) % \
1116 				      OCE_WQ_PACKET_ARRAY_SIZE);
1117 		bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE);
1118 		pd->mbuf = m;
1119 
1120 		nichdr =
1121 		    RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe);
1122 		nichdr->u0.dw[0] = 0;
1123 		nichdr->u0.dw[1] = 0;
1124 		nichdr->u0.dw[2] = 0;
1125 		nichdr->u0.dw[3] = 0;
1126 
1127 		nichdr->u0.s.complete = complete;
1128 		nichdr->u0.s.mgmt = os2bmc;
1129 		nichdr->u0.s.event = 1;
1130 		nichdr->u0.s.crc = 1;
1131 		nichdr->u0.s.forward = 0;
1132 		nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0;
1133 		nichdr->u0.s.udpcs =
1134 			(m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0;
1135 		nichdr->u0.s.tcpcs =
1136 			(m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0;
1137 		nichdr->u0.s.num_wqe = num_wqes;
1138 		nichdr->u0.s.total_length = m->m_pkthdr.len;
1139 
1140 		if (m->m_flags & M_VLANTAG) {
1141 			nichdr->u0.s.vlan = 1; /*Vlan present*/
1142 			nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag;
1143 		}
1144 
1145 		if (m->m_pkthdr.csum_flags & CSUM_TSO) {
1146 			if (m->m_pkthdr.tso_segsz) {
1147 				nichdr->u0.s.lso = 1;
1148 				nichdr->u0.s.lso_mss  = m->m_pkthdr.tso_segsz;
1149 			}
1150 			if (!IS_BE(sc) || !IS_SH(sc))
1151 				nichdr->u0.s.ipcs = 1;
1152 		}
1153 
1154 		RING_PUT(wq->ring, 1);
1155 		atomic_add_int(&wq->ring->num_used, 1);
1156 
1157 		for (i = 0; i < pd->nsegs; i++) {
1158 			nicfrag =
1159 			    RING_GET_PRODUCER_ITEM_VA(wq->ring,
1160 						      struct oce_nic_frag_wqe);
1161 			nicfrag->u0.s.rsvd0 = 0;
1162 			nicfrag->u0.s.frag_pa_hi = ADDR_HI(segs[i].ds_addr);
1163 			nicfrag->u0.s.frag_pa_lo = ADDR_LO(segs[i].ds_addr);
1164 			nicfrag->u0.s.frag_len = segs[i].ds_len;
1165 			pd->wqe_idx = wq->ring->pidx;
1166 			RING_PUT(wq->ring, 1);
1167 			atomic_add_int(&wq->ring->num_used, 1);
1168 		}
1169 		if (num_wqes > (pd->nsegs + 1)) {
1170 			nicfrag =
1171 			    RING_GET_PRODUCER_ITEM_VA(wq->ring,
1172 						      struct oce_nic_frag_wqe);
1173 			nicfrag->u0.dw[0] = 0;
1174 			nicfrag->u0.dw[1] = 0;
1175 			nicfrag->u0.dw[2] = 0;
1176 			nicfrag->u0.dw[3] = 0;
1177 			pd->wqe_idx = wq->ring->pidx;
1178 			RING_PUT(wq->ring, 1);
1179 			atomic_add_int(&wq->ring->num_used, 1);
1180 			pd->nsegs++;
1181 		}
1182 
1183 		if_inc_counter(sc->ifp, IFCOUNTER_OPACKETS, 1);
1184 		wq->tx_stats.tx_reqs++;
1185 		wq->tx_stats.tx_wrbs += num_wqes;
1186 		wq->tx_stats.tx_bytes += m->m_pkthdr.len;
1187 		wq->tx_stats.tx_pkts++;
1188 
1189 		bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map,
1190 				BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1191 		reg_value = (num_wqes << 16) | wq->wq_id;
1192 
1193 		/* if os2bmc is not enabled or if the pkt is already tagged as
1194 		   bmc, do nothing
1195 		 */
1196 		oce_is_pkt_dest_bmc(sc, m, &os2bmc, &m_new);
1197 
1198 		if_inc_counter(sc->ifp, IFCOUNTER_OBYTES, m->m_pkthdr.len);
1199 		if (m->m_flags & M_MCAST)
1200 			if_inc_counter(sc->ifp, IFCOUNTER_OMCASTS, 1);
1201 		ETHER_BPF_MTAP(sc->ifp, m);
1202 
1203 		OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value);
1204 
1205 	} else if (rc == EFBIG)	{
1206 		if (retry_cnt == 0) {
1207 			m_temp = m_defrag(m, M_NOWAIT);
1208 			if (m_temp == NULL)
1209 				goto free_ret;
1210 			m = m_temp;
1211 			*mpp = m_temp;
1212 			retry_cnt = retry_cnt + 1;
1213 			goto retry;
1214 		} else
1215 			goto free_ret;
1216 	} else if (rc == ENOMEM)
1217 		return rc;
1218 	else
1219 		goto free_ret;
1220 
1221 	if (os2bmc) {
1222 		m = m_new;
1223 		goto tx_start;
1224 	}
1225 
1226 	return 0;
1227 
1228 free_ret:
1229 	m_freem(*mpp);
1230 	*mpp = NULL;
1231 	return rc;
1232 }
1233 
1234 static void
1235 oce_process_tx_completion(struct oce_wq *wq)
1236 {
1237 	struct oce_packet_desc *pd;
1238 	POCE_SOFTC sc = (POCE_SOFTC) wq->parent;
1239 	struct mbuf *m;
1240 
1241 	pd = &wq->pckts[wq->pkt_desc_tail];
1242 	atomic_store_rel_int(&wq->pkt_desc_tail,
1243 			     (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE);
1244 	atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1);
1245 	bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1246 	bus_dmamap_unload(wq->tag, pd->map);
1247 
1248 	m = pd->mbuf;
1249 	m_freem(m);
1250 	pd->mbuf = NULL;
1251 
1252 	if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) {
1253 		if (wq->ring->num_used < (wq->ring->num_items / 2)) {
1254 			sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
1255 			oce_tx_restart(sc, wq);
1256 		}
1257 	}
1258 }
1259 
1260 static void
1261 oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq)
1262 {
1263 
1264 	if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING)
1265 		return;
1266 
1267 	if (!drbr_empty(sc->ifp, wq->br))
1268 		taskqueue_enqueue(taskqueue_swi, &wq->txtask);
1269 
1270 }
1271 
1272 #if defined(INET6) || defined(INET)
1273 static struct mbuf *
1274 oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp)
1275 {
1276 	struct mbuf *m;
1277 #ifdef INET
1278 	struct ip *ip;
1279 #endif
1280 #ifdef INET6
1281 	struct ip6_hdr *ip6;
1282 #endif
1283 	struct ether_vlan_header *eh;
1284 	struct tcphdr *th;
1285 	uint16_t etype;
1286 	int total_len = 0, ehdrlen = 0;
1287 
1288 	m = *mpp;
1289 
1290 	if (M_WRITABLE(m) == 0) {
1291 		m = m_dup(*mpp, M_NOWAIT);
1292 		if (!m)
1293 			return NULL;
1294 		m_freem(*mpp);
1295 		*mpp = m;
1296 	}
1297 
1298 	eh = mtod(m, struct ether_vlan_header *);
1299 	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
1300 		etype = ntohs(eh->evl_proto);
1301 		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
1302 	} else {
1303 		etype = ntohs(eh->evl_encap_proto);
1304 		ehdrlen = ETHER_HDR_LEN;
1305 	}
1306 
1307 	switch (etype) {
1308 #ifdef INET
1309 	case ETHERTYPE_IP:
1310 		ip = (struct ip *)(m->m_data + ehdrlen);
1311 		if (ip->ip_p != IPPROTO_TCP)
1312 			return NULL;
1313 		th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
1314 
1315 		total_len = ehdrlen + (ip->ip_hl << 2) + (th->th_off << 2);
1316 		break;
1317 #endif
1318 #ifdef INET6
1319 	case ETHERTYPE_IPV6:
1320 		ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen);
1321 		if (ip6->ip6_nxt != IPPROTO_TCP)
1322 			return NULL;
1323 		th = (struct tcphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
1324 
1325 		total_len = ehdrlen + sizeof(struct ip6_hdr) + (th->th_off << 2);
1326 		break;
1327 #endif
1328 	default:
1329 		return NULL;
1330 	}
1331 
1332 	m = m_pullup(m, total_len);
1333 	if (!m)
1334 		return NULL;
1335 	*mpp = m;
1336 	return m;
1337 
1338 }
1339 #endif /* INET6 || INET */
1340 
1341 void
1342 oce_tx_task(void *arg, int npending)
1343 {
1344 	struct oce_wq *wq = arg;
1345 	POCE_SOFTC sc = wq->parent;
1346 	struct ifnet *ifp = sc->ifp;
1347 	int rc = 0;
1348 
1349 	LOCK(&wq->tx_lock);
1350 	rc = oce_multiq_transmit(ifp, NULL, wq);
1351 	if (rc) {
1352 		device_printf(sc->dev,
1353 				"TX[%d] restart failed\n", wq->queue_index);
1354 	}
1355 	UNLOCK(&wq->tx_lock);
1356 }
1357 
1358 void
1359 oce_start(struct ifnet *ifp)
1360 {
1361 	POCE_SOFTC sc = ifp->if_softc;
1362 	struct mbuf *m;
1363 	int rc = 0;
1364 	int def_q = 0; /* Defualt tx queue is 0*/
1365 
1366 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1367 			IFF_DRV_RUNNING)
1368 		return;
1369 
1370 	if (!sc->link_status)
1371 		return;
1372 
1373 	while (true) {
1374 		IF_DEQUEUE(&sc->ifp->if_snd, m);
1375 		if (m == NULL)
1376 			break;
1377 
1378 		LOCK(&sc->wq[def_q]->tx_lock);
1379 		rc = oce_tx(sc, &m, def_q);
1380 		UNLOCK(&sc->wq[def_q]->tx_lock);
1381 		if (rc) {
1382 			if (m != NULL) {
1383 				sc->wq[def_q]->tx_stats.tx_stops ++;
1384 				ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1385 				IFQ_DRV_PREPEND(&ifp->if_snd, m);
1386 				m = NULL;
1387 			}
1388 			break;
1389 		}
1390 	}
1391 }
1392 
1393 /* Handle the Completion Queue for transmit */
1394 uint16_t
1395 oce_wq_handler(void *arg)
1396 {
1397 	struct oce_wq *wq = (struct oce_wq *)arg;
1398 	POCE_SOFTC sc = wq->parent;
1399 	struct oce_cq *cq = wq->cq;
1400 	struct oce_nic_tx_cqe *cqe;
1401 	int num_cqes = 0;
1402 
1403 	LOCK(&wq->tx_compl_lock);
1404 	bus_dmamap_sync(cq->ring->dma.tag,
1405 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1406 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1407 	while (cqe->u0.dw[3]) {
1408 		DW_SWAP((uint32_t *) cqe, sizeof(oce_wq_cqe));
1409 
1410 		wq->ring->cidx = cqe->u0.s.wqe_index + 1;
1411 		if (wq->ring->cidx >= wq->ring->num_items)
1412 			wq->ring->cidx -= wq->ring->num_items;
1413 
1414 		oce_process_tx_completion(wq);
1415 		wq->tx_stats.tx_compl++;
1416 		cqe->u0.dw[3] = 0;
1417 		RING_GET(cq->ring, 1);
1418 		bus_dmamap_sync(cq->ring->dma.tag,
1419 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1420 		cqe =
1421 		    RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1422 		num_cqes++;
1423 	}
1424 
1425 	if (num_cqes)
1426 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1427 
1428 	UNLOCK(&wq->tx_compl_lock);
1429 	return num_cqes;
1430 }
1431 
1432 static int
1433 oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, struct oce_wq *wq)
1434 {
1435 	POCE_SOFTC sc = ifp->if_softc;
1436 	int status = 0, queue_index = 0;
1437 	struct mbuf *next = NULL;
1438 	struct buf_ring *br = NULL;
1439 
1440 	br  = wq->br;
1441 	queue_index = wq->queue_index;
1442 
1443 	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1444 		IFF_DRV_RUNNING) {
1445 		if (m != NULL)
1446 			status = drbr_enqueue(ifp, br, m);
1447 		return status;
1448 	}
1449 
1450 	if (m != NULL) {
1451 		if ((status = drbr_enqueue(ifp, br, m)) != 0)
1452 			return status;
1453 	}
1454 	while ((next = drbr_peek(ifp, br)) != NULL) {
1455 		if (oce_tx(sc, &next, queue_index)) {
1456 			if (next == NULL) {
1457 				drbr_advance(ifp, br);
1458 			} else {
1459 				drbr_putback(ifp, br, next);
1460 				wq->tx_stats.tx_stops ++;
1461 				ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1462 			}
1463 			break;
1464 		}
1465 		drbr_advance(ifp, br);
1466 	}
1467 
1468 	return 0;
1469 }
1470 
1471 /*****************************************************************************
1472  *			    Receive  routines functions 		     *
1473  *****************************************************************************/
1474 
1475 static void
1476 oce_correct_header(struct mbuf *m, struct nic_hwlro_cqe_part1 *cqe1, struct nic_hwlro_cqe_part2 *cqe2)
1477 {
1478 	uint32_t *p;
1479         struct ether_header *eh = NULL;
1480         struct tcphdr *tcp_hdr = NULL;
1481         struct ip *ip4_hdr = NULL;
1482         struct ip6_hdr *ip6 = NULL;
1483         uint32_t payload_len = 0;
1484 
1485         eh = mtod(m, struct ether_header *);
1486         /* correct IP header */
1487         if(!cqe2->ipv6_frame) {
1488 		ip4_hdr = (struct ip *)((char*)eh + sizeof(struct ether_header));
1489                 ip4_hdr->ip_ttl = cqe2->frame_lifespan;
1490                 ip4_hdr->ip_len = htons(cqe2->coalesced_size - sizeof(struct ether_header));
1491                 tcp_hdr = (struct tcphdr *)((char*)ip4_hdr + sizeof(struct ip));
1492         }else {
1493         	ip6 = (struct ip6_hdr *)((char*)eh + sizeof(struct ether_header));
1494                 ip6->ip6_ctlun.ip6_un1.ip6_un1_hlim = cqe2->frame_lifespan;
1495                 payload_len = cqe2->coalesced_size - sizeof(struct ether_header)
1496                                                 - sizeof(struct ip6_hdr);
1497                 ip6->ip6_ctlun.ip6_un1.ip6_un1_plen = htons(payload_len);
1498                 tcp_hdr = (struct tcphdr *)((char*)ip6 + sizeof(struct ip6_hdr));
1499         }
1500 
1501         /* correct tcp header */
1502         tcp_hdr->th_ack = htonl(cqe2->tcp_ack_num);
1503         if(cqe2->push) {
1504         	tcp_hdr->th_flags |= TH_PUSH;
1505         }
1506         tcp_hdr->th_win = htons(cqe2->tcp_window);
1507         tcp_hdr->th_sum = 0xffff;
1508         if(cqe2->ts_opt) {
1509                 p = (uint32_t *)((char*)tcp_hdr + sizeof(struct tcphdr) + 2);
1510                 *p = cqe1->tcp_timestamp_val;
1511                 *(p+1) = cqe1->tcp_timestamp_ecr;
1512         }
1513 
1514 	return;
1515 }
1516 
1517 static void
1518 oce_rx_mbuf_chain(struct oce_rq *rq, struct oce_common_cqe_info *cqe_info, struct mbuf **m)
1519 {
1520 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1521         uint32_t i = 0, frag_len = 0;
1522 	uint32_t len = cqe_info->pkt_size;
1523         struct oce_packet_desc *pd;
1524         struct mbuf *tail = NULL;
1525 
1526         for (i = 0; i < cqe_info->num_frags; i++) {
1527                 if (rq->ring->cidx == rq->ring->pidx) {
1528                         device_printf(sc->dev,
1529                                   "oce_rx_mbuf_chain: Invalid RX completion - Queue is empty\n");
1530                         return;
1531                 }
1532                 pd = &rq->pckts[rq->ring->cidx];
1533 
1534                 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1535                 bus_dmamap_unload(rq->tag, pd->map);
1536 		RING_GET(rq->ring, 1);
1537                 rq->pending--;
1538 
1539                 frag_len = (len > rq->cfg.frag_size) ? rq->cfg.frag_size : len;
1540                 pd->mbuf->m_len = frag_len;
1541 
1542                 if (tail != NULL) {
1543                         /* additional fragments */
1544                         pd->mbuf->m_flags &= ~M_PKTHDR;
1545                         tail->m_next = pd->mbuf;
1546 			if(rq->islro)
1547                         	tail->m_nextpkt = NULL;
1548                         tail = pd->mbuf;
1549                 } else {
1550                         /* first fragment, fill out much of the packet header */
1551                         pd->mbuf->m_pkthdr.len = len;
1552 			if(rq->islro)
1553                         	pd->mbuf->m_nextpkt = NULL;
1554                         pd->mbuf->m_pkthdr.csum_flags = 0;
1555                         if (IF_CSUM_ENABLED(sc)) {
1556                                 if (cqe_info->l4_cksum_pass) {
1557                                         if(!cqe_info->ipv6_frame) { /* IPV4 */
1558                                                 pd->mbuf->m_pkthdr.csum_flags |=
1559                                                         (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1560                                         }else { /* IPV6 frame */
1561 						if(rq->islro) {
1562                                                 	pd->mbuf->m_pkthdr.csum_flags |=
1563                                                         (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1564 						}
1565                                         }
1566                                         pd->mbuf->m_pkthdr.csum_data = 0xffff;
1567                                 }
1568                                 if (cqe_info->ip_cksum_pass) {
1569                                         pd->mbuf->m_pkthdr.csum_flags |=
1570                                                (CSUM_IP_CHECKED|CSUM_IP_VALID);
1571                                 }
1572                         }
1573                         *m = tail = pd->mbuf;
1574                }
1575                 pd->mbuf = NULL;
1576                 len -= frag_len;
1577         }
1578 
1579         return;
1580 }
1581 
1582 static void
1583 oce_rx_lro(struct oce_rq *rq, struct nic_hwlro_singleton_cqe *cqe, struct nic_hwlro_cqe_part2 *cqe2)
1584 {
1585         POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1586         struct nic_hwlro_cqe_part1 *cqe1 = NULL;
1587         struct mbuf *m = NULL;
1588 	struct oce_common_cqe_info cq_info;
1589 
1590 	/* parse cqe */
1591         if(cqe2 == NULL) {
1592                 cq_info.pkt_size =  cqe->pkt_size;
1593                 cq_info.vtag = cqe->vlan_tag;
1594                 cq_info.l4_cksum_pass = cqe->l4_cksum_pass;
1595                 cq_info.ip_cksum_pass = cqe->ip_cksum_pass;
1596                 cq_info.ipv6_frame = cqe->ipv6_frame;
1597                 cq_info.vtp = cqe->vtp;
1598                 cq_info.qnq = cqe->qnq;
1599         }else {
1600                 cqe1 = (struct nic_hwlro_cqe_part1 *)cqe;
1601                 cq_info.pkt_size =  cqe2->coalesced_size;
1602                 cq_info.vtag = cqe2->vlan_tag;
1603                 cq_info.l4_cksum_pass = cqe2->l4_cksum_pass;
1604                 cq_info.ip_cksum_pass = cqe2->ip_cksum_pass;
1605                 cq_info.ipv6_frame = cqe2->ipv6_frame;
1606                 cq_info.vtp = cqe2->vtp;
1607                 cq_info.qnq = cqe1->qnq;
1608         }
1609 
1610 	cq_info.vtag = BSWAP_16(cq_info.vtag);
1611 
1612         cq_info.num_frags = cq_info.pkt_size / rq->cfg.frag_size;
1613         if(cq_info.pkt_size % rq->cfg.frag_size)
1614                 cq_info.num_frags++;
1615 
1616 	oce_rx_mbuf_chain(rq, &cq_info, &m);
1617 
1618 	if (m) {
1619 		if(cqe2) {
1620 			//assert(cqe2->valid != 0);
1621 
1622 			//assert(cqe2->cqe_type != 2);
1623 			oce_correct_header(m, cqe1, cqe2);
1624 		}
1625 
1626 		m->m_pkthdr.rcvif = sc->ifp;
1627 		if (rq->queue_index)
1628 			m->m_pkthdr.flowid = (rq->queue_index - 1);
1629 		else
1630 			m->m_pkthdr.flowid = rq->queue_index;
1631 		M_HASHTYPE_SET(m, M_HASHTYPE_OPAQUE);
1632 
1633 		/* This deternies if vlan tag is Valid */
1634 		if (cq_info.vtp) {
1635 			if (sc->function_mode & FNM_FLEX10_MODE) {
1636 				/* FLEX10. If QnQ is not set, neglect VLAN */
1637 				if (cq_info.qnq) {
1638 					m->m_pkthdr.ether_vtag = cq_info.vtag;
1639 					m->m_flags |= M_VLANTAG;
1640 				}
1641 			} else if (sc->pvid != (cq_info.vtag & VLAN_VID_MASK))  {
1642 				/* In UMC mode generally pvid will be striped by
1643 				   hw. But in some cases we have seen it comes
1644 				   with pvid. So if pvid == vlan, neglect vlan.
1645 				 */
1646 				m->m_pkthdr.ether_vtag = cq_info.vtag;
1647 				m->m_flags |= M_VLANTAG;
1648 			}
1649 		}
1650 		if_inc_counter(sc->ifp, IFCOUNTER_IPACKETS, 1);
1651 
1652 		(*sc->ifp->if_input) (sc->ifp, m);
1653 
1654 		/* Update rx stats per queue */
1655 		rq->rx_stats.rx_pkts++;
1656 		rq->rx_stats.rx_bytes += cq_info.pkt_size;
1657 		rq->rx_stats.rx_frags += cq_info.num_frags;
1658 		rq->rx_stats.rx_ucast_pkts++;
1659 	}
1660         return;
1661 }
1662 
1663 static void
1664 oce_rx(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe)
1665 {
1666 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1667 	int len;
1668 	struct mbuf *m = NULL;
1669 	struct oce_common_cqe_info cq_info;
1670 	uint16_t vtag = 0;
1671 
1672 	/* Is it a flush compl that has no data */
1673 	if(!cqe->u0.s.num_fragments)
1674 		goto exit;
1675 
1676 	len = cqe->u0.s.pkt_size;
1677 	if (!len) {
1678 		/*partial DMA workaround for Lancer*/
1679 		oce_discard_rx_comp(rq, cqe->u0.s.num_fragments);
1680 		goto exit;
1681 	}
1682 
1683 	if (!oce_cqe_portid_valid(sc, cqe)) {
1684 		oce_discard_rx_comp(rq, cqe->u0.s.num_fragments);
1685 		goto exit;
1686 	}
1687 
1688 	 /* Get vlan_tag value */
1689 	if(IS_BE(sc) || IS_SH(sc))
1690 		vtag = BSWAP_16(cqe->u0.s.vlan_tag);
1691 	else
1692 		vtag = cqe->u0.s.vlan_tag;
1693 
1694 	cq_info.l4_cksum_pass = cqe->u0.s.l4_cksum_pass;
1695 	cq_info.ip_cksum_pass = cqe->u0.s.ip_cksum_pass;
1696 	cq_info.ipv6_frame = cqe->u0.s.ip_ver;
1697 	cq_info.num_frags = cqe->u0.s.num_fragments;
1698 	cq_info.pkt_size = cqe->u0.s.pkt_size;
1699 
1700 	oce_rx_mbuf_chain(rq, &cq_info, &m);
1701 
1702 	if (m) {
1703 		m->m_pkthdr.rcvif = sc->ifp;
1704 		if (rq->queue_index)
1705 			m->m_pkthdr.flowid = (rq->queue_index - 1);
1706 		else
1707 			m->m_pkthdr.flowid = rq->queue_index;
1708 		M_HASHTYPE_SET(m, M_HASHTYPE_OPAQUE);
1709 
1710 		/* This deternies if vlan tag is Valid */
1711 		if (oce_cqe_vtp_valid(sc, cqe)) {
1712 			if (sc->function_mode & FNM_FLEX10_MODE) {
1713 				/* FLEX10. If QnQ is not set, neglect VLAN */
1714 				if (cqe->u0.s.qnq) {
1715 					m->m_pkthdr.ether_vtag = vtag;
1716 					m->m_flags |= M_VLANTAG;
1717 				}
1718 			} else if (sc->pvid != (vtag & VLAN_VID_MASK))  {
1719 				/* In UMC mode generally pvid will be striped by
1720 				   hw. But in some cases we have seen it comes
1721 				   with pvid. So if pvid == vlan, neglect vlan.
1722 				*/
1723 				m->m_pkthdr.ether_vtag = vtag;
1724 				m->m_flags |= M_VLANTAG;
1725 			}
1726 		}
1727 
1728 		if_inc_counter(sc->ifp, IFCOUNTER_IPACKETS, 1);
1729 #if defined(INET6) || defined(INET)
1730 		/* Try to queue to LRO */
1731 		if (IF_LRO_ENABLED(sc) &&
1732 		    (cqe->u0.s.ip_cksum_pass) &&
1733 		    (cqe->u0.s.l4_cksum_pass) &&
1734 		    (!cqe->u0.s.ip_ver)       &&
1735 		    (rq->lro.lro_cnt != 0)) {
1736 			if (tcp_lro_rx(&rq->lro, m, 0) == 0) {
1737 				rq->lro_pkts_queued ++;
1738 				goto post_done;
1739 			}
1740 			/* If LRO posting fails then try to post to STACK */
1741 		}
1742 #endif
1743 
1744 		(*sc->ifp->if_input) (sc->ifp, m);
1745 #if defined(INET6) || defined(INET)
1746 post_done:
1747 #endif
1748 		/* Update rx stats per queue */
1749 		rq->rx_stats.rx_pkts++;
1750 		rq->rx_stats.rx_bytes += cqe->u0.s.pkt_size;
1751 		rq->rx_stats.rx_frags += cqe->u0.s.num_fragments;
1752 		if (cqe->u0.s.pkt_type == OCE_MULTICAST_PACKET)
1753 			rq->rx_stats.rx_mcast_pkts++;
1754 		if (cqe->u0.s.pkt_type == OCE_UNICAST_PACKET)
1755 			rq->rx_stats.rx_ucast_pkts++;
1756 	}
1757 exit:
1758 	return;
1759 }
1760 
1761 void
1762 oce_discard_rx_comp(struct oce_rq *rq, int num_frags)
1763 {
1764 	uint32_t i = 0;
1765 	struct oce_packet_desc *pd;
1766 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1767 
1768 	for (i = 0; i < num_frags; i++) {
1769                 if (rq->ring->cidx == rq->ring->pidx) {
1770                         device_printf(sc->dev,
1771                                 "oce_discard_rx_comp: Invalid RX completion - Queue is empty\n");
1772                         return;
1773                 }
1774                 pd = &rq->pckts[rq->ring->cidx];
1775                 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1776                 bus_dmamap_unload(rq->tag, pd->map);
1777                 if (pd->mbuf != NULL) {
1778                         m_freem(pd->mbuf);
1779                         pd->mbuf = NULL;
1780                 }
1781 
1782 		RING_GET(rq->ring, 1);
1783                 rq->pending--;
1784 	}
1785 }
1786 
1787 static int
1788 oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1789 {
1790 	struct oce_nic_rx_cqe_v1 *cqe_v1;
1791 	int vtp = 0;
1792 
1793 	if (sc->be3_native) {
1794 		cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1795 		vtp =  cqe_v1->u0.s.vlan_tag_present;
1796 	} else
1797 		vtp = cqe->u0.s.vlan_tag_present;
1798 
1799 	return vtp;
1800 
1801 }
1802 
1803 static int
1804 oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1805 {
1806 	struct oce_nic_rx_cqe_v1 *cqe_v1;
1807 	int port_id = 0;
1808 
1809 	if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) {
1810 		cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1811 		port_id =  cqe_v1->u0.s.port;
1812 		if (sc->port_id != port_id)
1813 			return 0;
1814 	} else
1815 		;/* For BE3 legacy and Lancer this is dummy */
1816 
1817 	return 1;
1818 
1819 }
1820 
1821 #if defined(INET6) || defined(INET)
1822 void
1823 oce_rx_flush_lro(struct oce_rq *rq)
1824 {
1825 	struct lro_ctrl	*lro = &rq->lro;
1826 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1827 
1828 	if (!IF_LRO_ENABLED(sc))
1829 		return;
1830 
1831 	tcp_lro_flush_all(lro);
1832 	rq->lro_pkts_queued = 0;
1833 
1834 	return;
1835 }
1836 
1837 static int
1838 oce_init_lro(POCE_SOFTC sc)
1839 {
1840 	struct lro_ctrl *lro = NULL;
1841 	int i = 0, rc = 0;
1842 
1843 	for (i = 0; i < sc->nrqs; i++) {
1844 		lro = &sc->rq[i]->lro;
1845 		rc = tcp_lro_init(lro);
1846 		if (rc != 0) {
1847 			device_printf(sc->dev, "LRO init failed\n");
1848 			return rc;
1849 		}
1850 		lro->ifp = sc->ifp;
1851 	}
1852 
1853 	return rc;
1854 }
1855 
1856 void
1857 oce_free_lro(POCE_SOFTC sc)
1858 {
1859 	struct lro_ctrl *lro = NULL;
1860 	int i = 0;
1861 
1862 	for (i = 0; i < sc->nrqs; i++) {
1863 		lro = &sc->rq[i]->lro;
1864 		if (lro)
1865 			tcp_lro_free(lro);
1866 	}
1867 }
1868 #endif
1869 
1870 int
1871 oce_alloc_rx_bufs(struct oce_rq *rq, int count)
1872 {
1873 	POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1874 	int i, in, rc;
1875 	struct oce_packet_desc *pd;
1876 	bus_dma_segment_t segs[6];
1877 	int nsegs, added = 0;
1878 	struct oce_nic_rqe *rqe;
1879 	pd_rxulp_db_t rxdb_reg;
1880 	uint32_t val = 0;
1881 	uint32_t oce_max_rq_posts = 64;
1882 
1883 	bzero(&rxdb_reg, sizeof(pd_rxulp_db_t));
1884 	for (i = 0; i < count; i++) {
1885 		in = (rq->ring->pidx + 1) % OCE_RQ_PACKET_ARRAY_SIZE;
1886 
1887 		pd = &rq->pckts[rq->ring->pidx];
1888 		pd->mbuf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, oce_rq_buf_size);
1889 		if (pd->mbuf == NULL) {
1890 			device_printf(sc->dev, "mbuf allocation failed, size = %d\n",oce_rq_buf_size);
1891 			break;
1892 		}
1893 		pd->mbuf->m_nextpkt = NULL;
1894 
1895 		pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = rq->cfg.frag_size;
1896 
1897 		rc = bus_dmamap_load_mbuf_sg(rq->tag,
1898 					     pd->map,
1899 					     pd->mbuf,
1900 					     segs, &nsegs, BUS_DMA_NOWAIT);
1901 		if (rc) {
1902 			m_free(pd->mbuf);
1903 			device_printf(sc->dev, "bus_dmamap_load_mbuf_sg failed rc = %d\n", rc);
1904 			break;
1905 		}
1906 
1907 		if (nsegs != 1) {
1908 			i--;
1909 			continue;
1910 		}
1911 
1912 		bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_PREREAD);
1913 
1914 		rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe);
1915 		rqe->u0.s.frag_pa_hi = ADDR_HI(segs[0].ds_addr);
1916 		rqe->u0.s.frag_pa_lo = ADDR_LO(segs[0].ds_addr);
1917 		DW_SWAP(u32ptr(rqe), sizeof(struct oce_nic_rqe));
1918 		RING_PUT(rq->ring, 1);
1919 		added++;
1920 		rq->pending++;
1921 	}
1922 	oce_max_rq_posts = sc->enable_hwlro ? OCE_HWLRO_MAX_RQ_POSTS : OCE_MAX_RQ_POSTS;
1923 	if (added != 0) {
1924 		for (i = added / oce_max_rq_posts; i > 0; i--) {
1925 			rxdb_reg.bits.num_posted = oce_max_rq_posts;
1926 			rxdb_reg.bits.qid = rq->rq_id;
1927 			if(rq->islro) {
1928                                 val |= rq->rq_id & DB_LRO_RQ_ID_MASK;
1929                                 val |= oce_max_rq_posts << 16;
1930                                 OCE_WRITE_REG32(sc, db, DB_OFFSET, val);
1931 			}else {
1932 				OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1933 			}
1934 			added -= oce_max_rq_posts;
1935 		}
1936 		if (added > 0) {
1937 			rxdb_reg.bits.qid = rq->rq_id;
1938 			rxdb_reg.bits.num_posted = added;
1939 			if(rq->islro) {
1940                                 val |= rq->rq_id & DB_LRO_RQ_ID_MASK;
1941                                 val |= added << 16;
1942                                 OCE_WRITE_REG32(sc, db, DB_OFFSET, val);
1943 			}else {
1944 				OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1945 			}
1946 		}
1947 	}
1948 
1949 	return 0;
1950 }
1951 
1952 static void
1953 oce_check_rx_bufs(POCE_SOFTC sc, uint32_t num_cqes, struct oce_rq *rq)
1954 {
1955         if (num_cqes) {
1956                 oce_arm_cq(sc, rq->cq->cq_id, num_cqes, FALSE);
1957 		if(!sc->enable_hwlro) {
1958 			if((OCE_RQ_PACKET_ARRAY_SIZE - rq->pending) > 1)
1959 				oce_alloc_rx_bufs(rq, ((OCE_RQ_PACKET_ARRAY_SIZE - rq->pending) - 1));
1960 		}else {
1961                 	if ((OCE_RQ_PACKET_ARRAY_SIZE -1 - rq->pending) > 64)
1962                         	oce_alloc_rx_bufs(rq, 64);
1963         	}
1964 	}
1965 
1966         return;
1967 }
1968 
1969 uint16_t
1970 oce_rq_handler_lro(void *arg)
1971 {
1972         struct oce_rq *rq = (struct oce_rq *)arg;
1973         struct oce_cq *cq = rq->cq;
1974         POCE_SOFTC sc = rq->parent;
1975         struct nic_hwlro_singleton_cqe *cqe;
1976         struct nic_hwlro_cqe_part2 *cqe2;
1977         int num_cqes = 0;
1978 
1979 	LOCK(&rq->rx_lock);
1980         bus_dmamap_sync(cq->ring->dma.tag,cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1981         cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct nic_hwlro_singleton_cqe);
1982         while (cqe->valid) {
1983                 if(cqe->cqe_type == 0) { /* singleton cqe */
1984 			/* we should not get singleton cqe after cqe1 on same rq */
1985 			if(rq->cqe_firstpart != NULL) {
1986 				device_printf(sc->dev, "Got singleton cqe after cqe1 \n");
1987 				goto exit_rq_handler_lro;
1988 			}
1989                         if(cqe->error != 0) {
1990                                 rq->rx_stats.rxcp_err++;
1991 				if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1);
1992                         }
1993                         oce_rx_lro(rq, cqe, NULL);
1994                         rq->rx_stats.rx_compl++;
1995                         cqe->valid = 0;
1996                         RING_GET(cq->ring, 1);
1997                         num_cqes++;
1998                         if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled))
1999                                 break;
2000                 }else if(cqe->cqe_type == 0x1) { /* first part */
2001 			/* we should not get cqe1 after cqe1 on same rq */
2002 			if(rq->cqe_firstpart != NULL) {
2003 				device_printf(sc->dev, "Got cqe1 after cqe1 \n");
2004 				goto exit_rq_handler_lro;
2005 			}
2006 			rq->cqe_firstpart = (struct nic_hwlro_cqe_part1 *)cqe;
2007                         RING_GET(cq->ring, 1);
2008                 }else if(cqe->cqe_type == 0x2) { /* second part */
2009 			cqe2 = (struct nic_hwlro_cqe_part2 *)cqe;
2010                         if(cqe2->error != 0) {
2011                                 rq->rx_stats.rxcp_err++;
2012 				if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1);
2013                         }
2014 			/* We should not get cqe2 without cqe1 */
2015 			if(rq->cqe_firstpart == NULL) {
2016 				device_printf(sc->dev, "Got cqe2 without cqe1 \n");
2017 				goto exit_rq_handler_lro;
2018 			}
2019                         oce_rx_lro(rq, (struct nic_hwlro_singleton_cqe *)rq->cqe_firstpart, cqe2);
2020 
2021                         rq->rx_stats.rx_compl++;
2022                         rq->cqe_firstpart->valid = 0;
2023                         cqe2->valid = 0;
2024 			rq->cqe_firstpart = NULL;
2025 
2026                         RING_GET(cq->ring, 1);
2027                         num_cqes += 2;
2028                         if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled))
2029                                 break;
2030 		}
2031 
2032                 bus_dmamap_sync(cq->ring->dma.tag,cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2033                 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct nic_hwlro_singleton_cqe);
2034         }
2035 	oce_check_rx_bufs(sc, num_cqes, rq);
2036 exit_rq_handler_lro:
2037 	UNLOCK(&rq->rx_lock);
2038 	return 0;
2039 }
2040 
2041 /* Handle the Completion Queue for receive */
2042 uint16_t
2043 oce_rq_handler(void *arg)
2044 {
2045 	struct oce_rq *rq = (struct oce_rq *)arg;
2046 	struct oce_cq *cq = rq->cq;
2047 	POCE_SOFTC sc = rq->parent;
2048 	struct oce_nic_rx_cqe *cqe;
2049 	int num_cqes = 0;
2050 
2051 	if(rq->islro) {
2052 		oce_rq_handler_lro(arg);
2053 		return 0;
2054 	}
2055 	LOCK(&rq->rx_lock);
2056 	bus_dmamap_sync(cq->ring->dma.tag,
2057 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2058 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
2059 	while (cqe->u0.dw[2]) {
2060 		DW_SWAP((uint32_t *) cqe, sizeof(oce_rq_cqe));
2061 
2062 		if (cqe->u0.s.error == 0) {
2063 			oce_rx(rq, cqe);
2064 		} else {
2065 			rq->rx_stats.rxcp_err++;
2066 			if_inc_counter(sc->ifp, IFCOUNTER_IERRORS, 1);
2067 			/* Post L3/L4 errors to stack.*/
2068 			oce_rx(rq, cqe);
2069 		}
2070 		rq->rx_stats.rx_compl++;
2071 		cqe->u0.dw[2] = 0;
2072 
2073 #if defined(INET6) || defined(INET)
2074 		if (IF_LRO_ENABLED(sc) && rq->lro_pkts_queued >= 16) {
2075 			oce_rx_flush_lro(rq);
2076 		}
2077 #endif
2078 
2079 		RING_GET(cq->ring, 1);
2080 		bus_dmamap_sync(cq->ring->dma.tag,
2081 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2082 		cqe =
2083 		    RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
2084 		num_cqes++;
2085 		if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled))
2086 			break;
2087 	}
2088 
2089 #if defined(INET6) || defined(INET)
2090         if (IF_LRO_ENABLED(sc))
2091                 oce_rx_flush_lro(rq);
2092 #endif
2093 
2094 	oce_check_rx_bufs(sc, num_cqes, rq);
2095 	UNLOCK(&rq->rx_lock);
2096 	return 0;
2097 
2098 }
2099 
2100 /*****************************************************************************
2101  *		   Helper function prototypes in this file 		     *
2102  *****************************************************************************/
2103 
2104 static int
2105 oce_attach_ifp(POCE_SOFTC sc)
2106 {
2107 
2108 	sc->ifp = if_alloc(IFT_ETHER);
2109 	if (!sc->ifp)
2110 		return ENOMEM;
2111 
2112 	ifmedia_init(&sc->media, IFM_IMASK, oce_media_change, oce_media_status);
2113 	ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2114 	ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
2115 
2116 	sc->ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST;
2117 	sc->ifp->if_ioctl = oce_ioctl;
2118 	sc->ifp->if_start = oce_start;
2119 	sc->ifp->if_init = oce_init;
2120 	sc->ifp->if_mtu = ETHERMTU;
2121 	sc->ifp->if_softc = sc;
2122 	sc->ifp->if_transmit = oce_multiq_start;
2123 	sc->ifp->if_qflush = oce_multiq_flush;
2124 
2125 	if_initname(sc->ifp,
2126 		    device_get_name(sc->dev), device_get_unit(sc->dev));
2127 
2128 	sc->ifp->if_snd.ifq_drv_maxlen = OCE_MAX_TX_DESC - 1;
2129 	IFQ_SET_MAXLEN(&sc->ifp->if_snd, sc->ifp->if_snd.ifq_drv_maxlen);
2130 	IFQ_SET_READY(&sc->ifp->if_snd);
2131 
2132 	sc->ifp->if_hwassist = OCE_IF_HWASSIST;
2133 	sc->ifp->if_hwassist |= CSUM_TSO;
2134 	sc->ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP);
2135 
2136 	sc->ifp->if_capabilities = OCE_IF_CAPABILITIES;
2137 	sc->ifp->if_capabilities |= IFCAP_HWCSUM;
2138 	sc->ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
2139 
2140 #if defined(INET6) || defined(INET)
2141 	sc->ifp->if_capabilities |= IFCAP_TSO;
2142 	sc->ifp->if_capabilities |= IFCAP_LRO;
2143 	sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO;
2144 #endif
2145 
2146 	sc->ifp->if_capenable = sc->ifp->if_capabilities;
2147 	sc->ifp->if_baudrate = IF_Gbps(10);
2148 
2149 	sc->ifp->if_hw_tsomax = 65536 - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
2150 	sc->ifp->if_hw_tsomaxsegcount = OCE_MAX_TX_ELEMENTS;
2151 	sc->ifp->if_hw_tsomaxsegsize = 4096;
2152 
2153 	ether_ifattach(sc->ifp, sc->macaddr.mac_addr);
2154 
2155 	return 0;
2156 }
2157 
2158 static void
2159 oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
2160 {
2161 	POCE_SOFTC sc = ifp->if_softc;
2162 
2163 	if (ifp->if_softc !=  arg)
2164 		return;
2165 	if ((vtag == 0) || (vtag > 4095))
2166 		return;
2167 
2168 	sc->vlan_tag[vtag] = 1;
2169 	sc->vlans_added++;
2170 	if (sc->vlans_added <= (sc->max_vlans + 1))
2171 		oce_vid_config(sc);
2172 }
2173 
2174 static void
2175 oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
2176 {
2177 	POCE_SOFTC sc = ifp->if_softc;
2178 
2179 	if (ifp->if_softc !=  arg)
2180 		return;
2181 	if ((vtag == 0) || (vtag > 4095))
2182 		return;
2183 
2184 	sc->vlan_tag[vtag] = 0;
2185 	sc->vlans_added--;
2186 	oce_vid_config(sc);
2187 }
2188 
2189 /*
2190  * A max of 64 vlans can be configured in BE. If the user configures
2191  * more, place the card in vlan promiscuous mode.
2192  */
2193 static int
2194 oce_vid_config(POCE_SOFTC sc)
2195 {
2196 	struct normal_vlan vtags[MAX_VLANFILTER_SIZE];
2197 	uint16_t ntags = 0, i;
2198 	int status = 0;
2199 
2200 	if ((sc->vlans_added <= MAX_VLANFILTER_SIZE) &&
2201 			(sc->ifp->if_capenable & IFCAP_VLAN_HWFILTER)) {
2202 		for (i = 0; i < MAX_VLANS; i++) {
2203 			if (sc->vlan_tag[i]) {
2204 				vtags[ntags].vtag = i;
2205 				ntags++;
2206 			}
2207 		}
2208 		if (ntags)
2209 			status = oce_config_vlan(sc, (uint8_t) sc->if_id,
2210 						vtags, ntags, 1, 0);
2211 	} else
2212 		status = oce_config_vlan(sc, (uint8_t) sc->if_id,
2213 					 	NULL, 0, 1, 1);
2214 	return status;
2215 }
2216 
2217 static void
2218 oce_mac_addr_set(POCE_SOFTC sc)
2219 {
2220 	uint32_t old_pmac_id = sc->pmac_id;
2221 	int status = 0;
2222 
2223 	status = bcmp((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
2224 			 sc->macaddr.size_of_struct);
2225 	if (!status)
2226 		return;
2227 
2228 	status = oce_mbox_macaddr_add(sc, (uint8_t *)(IF_LLADDR(sc->ifp)),
2229 					sc->if_id, &sc->pmac_id);
2230 	if (!status) {
2231 		status = oce_mbox_macaddr_del(sc, sc->if_id, old_pmac_id);
2232 		bcopy((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
2233 				 sc->macaddr.size_of_struct);
2234 	}
2235 	if (status)
2236 		device_printf(sc->dev, "Failed update macaddress\n");
2237 
2238 }
2239 
2240 static int
2241 oce_handle_passthrough(struct ifnet *ifp, caddr_t data)
2242 {
2243 	POCE_SOFTC sc = ifp->if_softc;
2244 	struct ifreq *ifr = (struct ifreq *)data;
2245 	int rc = ENXIO;
2246 	char cookie[32] = {0};
2247 	void *priv_data = ifr_data_get_ptr(ifr);
2248 	void *ioctl_ptr;
2249 	uint32_t req_size;
2250 	struct mbx_hdr req;
2251 	OCE_DMA_MEM dma_mem;
2252 	struct mbx_common_get_cntl_attr *fw_cmd;
2253 
2254 	if (copyin(priv_data, cookie, strlen(IOCTL_COOKIE)))
2255 		return EFAULT;
2256 
2257 	if (memcmp(cookie, IOCTL_COOKIE, strlen(IOCTL_COOKIE)))
2258 		return EINVAL;
2259 
2260 	ioctl_ptr = (char *)priv_data + strlen(IOCTL_COOKIE);
2261 	if (copyin(ioctl_ptr, &req, sizeof(struct mbx_hdr)))
2262 		return EFAULT;
2263 
2264 	req_size = le32toh(req.u0.req.request_length);
2265 	if (req_size > 65536)
2266 		return EINVAL;
2267 
2268 	req_size += sizeof(struct mbx_hdr);
2269 	rc = oce_dma_alloc(sc, req_size, &dma_mem, 0);
2270 	if (rc)
2271 		return ENOMEM;
2272 
2273 	if (copyin(ioctl_ptr, OCE_DMAPTR(&dma_mem,char), req_size)) {
2274 		rc = EFAULT;
2275 		goto dma_free;
2276 	}
2277 
2278 	rc = oce_pass_through_mbox(sc, &dma_mem, req_size);
2279 	if (rc) {
2280 		rc = EIO;
2281 		goto dma_free;
2282 	}
2283 
2284 	if (copyout(OCE_DMAPTR(&dma_mem,char), ioctl_ptr, req_size))
2285 		rc =  EFAULT;
2286 
2287 	/*
2288 	   firmware is filling all the attributes for this ioctl except
2289 	   the driver version..so fill it
2290 	 */
2291 	if(req.u0.rsp.opcode == OPCODE_COMMON_GET_CNTL_ATTRIBUTES) {
2292 		fw_cmd = (struct mbx_common_get_cntl_attr *) ioctl_ptr;
2293 		strncpy(fw_cmd->params.rsp.cntl_attr_info.hba_attr.drv_ver_str,
2294 			COMPONENT_REVISION, strlen(COMPONENT_REVISION));
2295 	}
2296 
2297 dma_free:
2298 	oce_dma_free(sc, &dma_mem);
2299 	return rc;
2300 
2301 }
2302 
2303 static void
2304 oce_eqd_set_periodic(POCE_SOFTC sc)
2305 {
2306 	struct oce_set_eqd set_eqd[OCE_MAX_EQ];
2307 	struct oce_aic_obj *aic;
2308 	struct oce_eq *eqo;
2309 	uint64_t now = 0, delta;
2310 	int eqd, i, num = 0;
2311 	uint32_t tx_reqs = 0, rxpkts = 0, pps;
2312 	struct oce_wq *wq;
2313 	struct oce_rq *rq;
2314 
2315 	#define ticks_to_msecs(t)       (1000 * (t) / hz)
2316 
2317 	for (i = 0 ; i < sc->neqs; i++) {
2318 		eqo = sc->eq[i];
2319 		aic = &sc->aic_obj[i];
2320 		/* When setting the static eq delay from the user space */
2321 		if (!aic->enable) {
2322 			if (aic->ticks)
2323 				aic->ticks = 0;
2324 			eqd = aic->et_eqd;
2325 			goto modify_eqd;
2326 		}
2327 
2328 		if (i == 0) {
2329 			rq = sc->rq[0];
2330 			rxpkts = rq->rx_stats.rx_pkts;
2331 		} else
2332 			rxpkts = 0;
2333 		if (i + 1 < sc->nrqs) {
2334 			rq = sc->rq[i + 1];
2335 			rxpkts += rq->rx_stats.rx_pkts;
2336 		}
2337 		if (i < sc->nwqs) {
2338 			wq = sc->wq[i];
2339 			tx_reqs = wq->tx_stats.tx_reqs;
2340 		} else
2341 			tx_reqs = 0;
2342 		now = ticks;
2343 
2344 		if (!aic->ticks || now < aic->ticks ||
2345 		    rxpkts < aic->prev_rxpkts || tx_reqs < aic->prev_txreqs) {
2346 			aic->prev_rxpkts = rxpkts;
2347 			aic->prev_txreqs = tx_reqs;
2348 			aic->ticks = now;
2349 			continue;
2350 		}
2351 
2352 		delta = ticks_to_msecs(now - aic->ticks);
2353 
2354 		pps = (((uint32_t)(rxpkts - aic->prev_rxpkts) * 1000) / delta) +
2355 		      (((uint32_t)(tx_reqs - aic->prev_txreqs) * 1000) / delta);
2356 		eqd = (pps / 15000) << 2;
2357 		if (eqd < 8)
2358 			eqd = 0;
2359 
2360 		/* Make sure that the eq delay is in the known range */
2361 		eqd = min(eqd, aic->max_eqd);
2362 		eqd = max(eqd, aic->min_eqd);
2363 
2364 		aic->prev_rxpkts = rxpkts;
2365 		aic->prev_txreqs = tx_reqs;
2366 		aic->ticks = now;
2367 
2368 modify_eqd:
2369 		if (eqd != aic->cur_eqd) {
2370 			set_eqd[num].delay_multiplier = (eqd * 65)/100;
2371 			set_eqd[num].eq_id = eqo->eq_id;
2372 			aic->cur_eqd = eqd;
2373 			num++;
2374 		}
2375 	}
2376 
2377 	/* Is there atleast one eq that needs to be modified? */
2378         for(i = 0; i < num; i += 8) {
2379                 if((num - i) >=8 )
2380                         oce_mbox_eqd_modify_periodic(sc, &set_eqd[i], 8);
2381                 else
2382                         oce_mbox_eqd_modify_periodic(sc, &set_eqd[i], (num - i));
2383         }
2384 
2385 }
2386 
2387 static void oce_detect_hw_error(POCE_SOFTC sc)
2388 {
2389 
2390 	uint32_t ue_low = 0, ue_high = 0, ue_low_mask = 0, ue_high_mask = 0;
2391 	uint32_t sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
2392 	uint32_t i;
2393 
2394 	if (sc->hw_error)
2395 		return;
2396 
2397 	if (IS_XE201(sc)) {
2398 		sliport_status = OCE_READ_REG32(sc, db, SLIPORT_STATUS_OFFSET);
2399 		if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
2400 			sliport_err1 = OCE_READ_REG32(sc, db, SLIPORT_ERROR1_OFFSET);
2401 			sliport_err2 = OCE_READ_REG32(sc, db, SLIPORT_ERROR2_OFFSET);
2402 		}
2403 	} else {
2404 		ue_low = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW);
2405 		ue_high = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HIGH);
2406 		ue_low_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW_MASK);
2407 		ue_high_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HI_MASK);
2408 
2409 		ue_low = (ue_low & ~ue_low_mask);
2410 		ue_high = (ue_high & ~ue_high_mask);
2411 	}
2412 
2413 	/* On certain platforms BE hardware can indicate spurious UEs.
2414 	 * Allow the h/w to stop working completely in case of a real UE.
2415 	 * Hence not setting the hw_error for UE detection.
2416 	 */
2417 	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
2418 		sc->hw_error = TRUE;
2419 		device_printf(sc->dev, "Error detected in the card\n");
2420 	}
2421 
2422 	if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
2423 		device_printf(sc->dev,
2424 				"ERR: sliport status 0x%x\n", sliport_status);
2425 		device_printf(sc->dev,
2426 				"ERR: sliport error1 0x%x\n", sliport_err1);
2427 		device_printf(sc->dev,
2428 				"ERR: sliport error2 0x%x\n", sliport_err2);
2429 	}
2430 
2431 	if (ue_low) {
2432 		for (i = 0; ue_low; ue_low >>= 1, i++) {
2433 			if (ue_low & 1)
2434 				device_printf(sc->dev, "UE: %s bit set\n",
2435 							ue_status_low_desc[i]);
2436 		}
2437 	}
2438 
2439 	if (ue_high) {
2440 		for (i = 0; ue_high; ue_high >>= 1, i++) {
2441 			if (ue_high & 1)
2442 				device_printf(sc->dev, "UE: %s bit set\n",
2443 							ue_status_hi_desc[i]);
2444 		}
2445 	}
2446 
2447 }
2448 
2449 static void
2450 oce_local_timer(void *arg)
2451 {
2452 	POCE_SOFTC sc = arg;
2453 	int i = 0;
2454 
2455 	oce_detect_hw_error(sc);
2456 	oce_refresh_nic_stats(sc);
2457 	oce_refresh_queue_stats(sc);
2458 	oce_mac_addr_set(sc);
2459 
2460 	/* TX Watch Dog*/
2461 	for (i = 0; i < sc->nwqs; i++)
2462 		oce_tx_restart(sc, sc->wq[i]);
2463 
2464 	/* calculate and set the eq delay for optimal interrupt rate */
2465 	if (IS_BE(sc) || IS_SH(sc))
2466 		oce_eqd_set_periodic(sc);
2467 
2468 	callout_reset(&sc->timer, hz, oce_local_timer, sc);
2469 }
2470 
2471 static void
2472 oce_tx_compl_clean(POCE_SOFTC sc)
2473 {
2474 	struct oce_wq *wq;
2475 	int i = 0, timeo = 0, num_wqes = 0;
2476 	int pending_txqs = sc->nwqs;
2477 
2478 	/* Stop polling for compls when HW has been silent for 10ms or
2479 	 * hw_error or no outstanding completions expected
2480 	 */
2481 	do {
2482 		pending_txqs = sc->nwqs;
2483 
2484 		for_all_wq_queues(sc, wq, i) {
2485 			num_wqes = oce_wq_handler(wq);
2486 
2487 			if(num_wqes)
2488 				timeo = 0;
2489 
2490 			if(!wq->ring->num_used)
2491 				pending_txqs--;
2492 		}
2493 
2494 		if (pending_txqs == 0 || ++timeo > 10 || sc->hw_error)
2495 			break;
2496 
2497 		DELAY(1000);
2498 	} while (TRUE);
2499 
2500 	for_all_wq_queues(sc, wq, i) {
2501 		while(wq->ring->num_used) {
2502 			LOCK(&wq->tx_compl_lock);
2503 			oce_process_tx_completion(wq);
2504 			UNLOCK(&wq->tx_compl_lock);
2505 		}
2506 	}
2507 
2508 }
2509 
2510 /* NOTE : This should only be called holding
2511  *        DEVICE_LOCK.
2512  */
2513 static void
2514 oce_if_deactivate(POCE_SOFTC sc)
2515 {
2516 	int i;
2517 	struct oce_rq *rq;
2518 	struct oce_wq *wq;
2519 	struct oce_eq *eq;
2520 
2521 	sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2522 
2523 	oce_tx_compl_clean(sc);
2524 
2525 	/* Stop intrs and finish any bottom halves pending */
2526 	oce_hw_intr_disable(sc);
2527 
2528 	/* Since taskqueue_drain takes a Gaint Lock, We should not acquire
2529 	   any other lock. So unlock device lock and require after
2530 	   completing taskqueue_drain.
2531 	*/
2532 	UNLOCK(&sc->dev_lock);
2533 	for (i = 0; i < sc->intr_count; i++) {
2534 		if (sc->intrs[i].tq != NULL) {
2535 			taskqueue_drain(sc->intrs[i].tq, &sc->intrs[i].task);
2536 		}
2537 	}
2538 	LOCK(&sc->dev_lock);
2539 
2540 	/* Delete RX queue in card with flush param */
2541 	oce_stop_rx(sc);
2542 
2543 	/* Invalidate any pending cq and eq entries*/
2544 	for_all_evnt_queues(sc, eq, i)
2545 		oce_drain_eq(eq);
2546 	for_all_rq_queues(sc, rq, i)
2547 		oce_drain_rq_cq(rq);
2548 	for_all_wq_queues(sc, wq, i)
2549 		oce_drain_wq_cq(wq);
2550 
2551 	/* But still we need to get MCC aync events.
2552 	   So enable intrs and also arm first EQ
2553 	*/
2554 	oce_hw_intr_enable(sc);
2555 	oce_arm_eq(sc, sc->eq[0]->eq_id, 0, TRUE, FALSE);
2556 
2557 	DELAY(10);
2558 }
2559 
2560 static void
2561 oce_if_activate(POCE_SOFTC sc)
2562 {
2563 	struct oce_eq *eq;
2564 	struct oce_rq *rq;
2565 	struct oce_wq *wq;
2566 	int i, rc = 0;
2567 
2568 	sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;
2569 
2570 	oce_hw_intr_disable(sc);
2571 
2572 	oce_start_rx(sc);
2573 
2574 	for_all_rq_queues(sc, rq, i) {
2575 		rc = oce_start_rq(rq);
2576 		if (rc)
2577 			device_printf(sc->dev, "Unable to start RX\n");
2578 	}
2579 
2580 	for_all_wq_queues(sc, wq, i) {
2581 		rc = oce_start_wq(wq);
2582 		if (rc)
2583 			device_printf(sc->dev, "Unable to start TX\n");
2584 	}
2585 
2586 	for_all_evnt_queues(sc, eq, i)
2587 		oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
2588 
2589 	oce_hw_intr_enable(sc);
2590 
2591 }
2592 
2593 static void
2594 process_link_state(POCE_SOFTC sc, struct oce_async_cqe_link_state *acqe)
2595 {
2596 	/* Update Link status */
2597 	if ((acqe->u0.s.link_status & ~ASYNC_EVENT_LOGICAL) ==
2598 	     ASYNC_EVENT_LINK_UP) {
2599 		sc->link_status = ASYNC_EVENT_LINK_UP;
2600 		if_link_state_change(sc->ifp, LINK_STATE_UP);
2601 	} else {
2602 		sc->link_status = ASYNC_EVENT_LINK_DOWN;
2603 		if_link_state_change(sc->ifp, LINK_STATE_DOWN);
2604 	}
2605 }
2606 
2607 static void oce_async_grp5_osbmc_process(POCE_SOFTC sc,
2608 					 struct oce_async_evt_grp5_os2bmc *evt)
2609 {
2610 	DW_SWAP(evt, sizeof(struct oce_async_evt_grp5_os2bmc));
2611 	if (evt->u.s.mgmt_enable)
2612 		sc->flags |= OCE_FLAGS_OS2BMC;
2613 	else
2614 		return;
2615 
2616 	sc->bmc_filt_mask = evt->u.s.arp_filter;
2617 	sc->bmc_filt_mask |= (evt->u.s.dhcp_client_filt << 1);
2618 	sc->bmc_filt_mask |= (evt->u.s.dhcp_server_filt << 2);
2619 	sc->bmc_filt_mask |= (evt->u.s.net_bios_filt << 3);
2620 	sc->bmc_filt_mask |= (evt->u.s.bcast_filt << 4);
2621 	sc->bmc_filt_mask |= (evt->u.s.ipv6_nbr_filt << 5);
2622 	sc->bmc_filt_mask |= (evt->u.s.ipv6_ra_filt << 6);
2623 	sc->bmc_filt_mask |= (evt->u.s.ipv6_ras_filt << 7);
2624 	sc->bmc_filt_mask |= (evt->u.s.mcast_filt << 8);
2625 }
2626 
2627 static void oce_process_grp5_events(POCE_SOFTC sc, struct oce_mq_cqe *cqe)
2628 {
2629 	struct oce_async_event_grp5_pvid_state *gcqe;
2630 	struct oce_async_evt_grp5_os2bmc *bmccqe;
2631 
2632 	switch (cqe->u0.s.async_type) {
2633 	case ASYNC_EVENT_PVID_STATE:
2634 		/* GRP5 PVID */
2635 		gcqe = (struct oce_async_event_grp5_pvid_state *)cqe;
2636 		if (gcqe->enabled)
2637 			sc->pvid = gcqe->tag & VLAN_VID_MASK;
2638 		else
2639 			sc->pvid = 0;
2640 		break;
2641 	case ASYNC_EVENT_OS2BMC:
2642 		bmccqe = (struct oce_async_evt_grp5_os2bmc *)cqe;
2643 		oce_async_grp5_osbmc_process(sc, bmccqe);
2644 		break;
2645 	default:
2646 		break;
2647 	}
2648 }
2649 
2650 /* Handle the Completion Queue for the Mailbox/Async notifications */
2651 uint16_t
2652 oce_mq_handler(void *arg)
2653 {
2654 	struct oce_mq *mq = (struct oce_mq *)arg;
2655 	POCE_SOFTC sc = mq->parent;
2656 	struct oce_cq *cq = mq->cq;
2657 	int num_cqes = 0, evt_type = 0, optype = 0;
2658 	struct oce_mq_cqe *cqe;
2659 	struct oce_async_cqe_link_state *acqe;
2660 	struct oce_async_event_qnq *dbgcqe;
2661 
2662 	bus_dmamap_sync(cq->ring->dma.tag,
2663 			cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2664 	cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2665 
2666 	while (cqe->u0.dw[3]) {
2667 		DW_SWAP((uint32_t *) cqe, sizeof(oce_mq_cqe));
2668 		if (cqe->u0.s.async_event) {
2669 			evt_type = cqe->u0.s.event_type;
2670 			optype = cqe->u0.s.async_type;
2671 			if (evt_type  == ASYNC_EVENT_CODE_LINK_STATE) {
2672 				/* Link status evt */
2673 				acqe = (struct oce_async_cqe_link_state *)cqe;
2674 				process_link_state(sc, acqe);
2675 			} else if (evt_type == ASYNC_EVENT_GRP5) {
2676 				oce_process_grp5_events(sc, cqe);
2677 			} else if (evt_type == ASYNC_EVENT_CODE_DEBUG &&
2678 					optype == ASYNC_EVENT_DEBUG_QNQ) {
2679 				dbgcqe =  (struct oce_async_event_qnq *)cqe;
2680 				if(dbgcqe->valid)
2681 					sc->qnqid = dbgcqe->vlan_tag;
2682 				sc->qnq_debug_event = TRUE;
2683 			}
2684 		}
2685 		cqe->u0.dw[3] = 0;
2686 		RING_GET(cq->ring, 1);
2687 		bus_dmamap_sync(cq->ring->dma.tag,
2688 				cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2689 		cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2690 		num_cqes++;
2691 	}
2692 
2693 	if (num_cqes)
2694 		oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
2695 
2696 	return 0;
2697 }
2698 
2699 static void
2700 setup_max_queues_want(POCE_SOFTC sc)
2701 {
2702 	/* Check if it is FLEX machine. Is so dont use RSS */
2703 	if ((sc->function_mode & FNM_FLEX10_MODE) ||
2704 	    (sc->function_mode & FNM_UMC_MODE)    ||
2705 	    (sc->function_mode & FNM_VNIC_MODE)	  ||
2706 	    (!is_rss_enabled(sc))		  ||
2707 	    IS_BE2(sc)) {
2708 		sc->nrqs = 1;
2709 		sc->nwqs = 1;
2710 	} else {
2711 		sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
2712 		sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs);
2713 	}
2714 
2715 	if (IS_BE2(sc) && is_rss_enabled(sc))
2716 		sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
2717 }
2718 
2719 static void
2720 update_queues_got(POCE_SOFTC sc)
2721 {
2722 	if (is_rss_enabled(sc)) {
2723 		sc->nrqs = sc->intr_count + 1;
2724 		sc->nwqs = sc->intr_count;
2725 	} else {
2726 		sc->nrqs = 1;
2727 		sc->nwqs = 1;
2728 	}
2729 
2730 	if (IS_BE2(sc))
2731 		sc->nwqs = 1;
2732 }
2733 
2734 static int
2735 oce_check_ipv6_ext_hdr(struct mbuf *m)
2736 {
2737 	struct ether_header *eh = mtod(m, struct ether_header *);
2738 	caddr_t m_datatemp = m->m_data;
2739 
2740 	if (eh->ether_type == htons(ETHERTYPE_IPV6)) {
2741 		m->m_data += sizeof(struct ether_header);
2742 		struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
2743 
2744 		if((ip6->ip6_nxt != IPPROTO_TCP) && \
2745 				(ip6->ip6_nxt != IPPROTO_UDP)){
2746 			struct ip6_ext *ip6e = NULL;
2747 			m->m_data += sizeof(struct ip6_hdr);
2748 
2749 			ip6e = (struct ip6_ext *) mtod(m, struct ip6_ext *);
2750 			if(ip6e->ip6e_len == 0xff) {
2751 				m->m_data = m_datatemp;
2752 				return TRUE;
2753 			}
2754 		}
2755 		m->m_data = m_datatemp;
2756 	}
2757 	return FALSE;
2758 }
2759 
2760 static int
2761 is_be3_a1(POCE_SOFTC sc)
2762 {
2763 	if((sc->flags & OCE_FLAGS_BE3)  && ((sc->asic_revision & 0xFF) < 2)) {
2764 		return TRUE;
2765 	}
2766 	return FALSE;
2767 }
2768 
2769 static struct mbuf *
2770 oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete)
2771 {
2772 	uint16_t vlan_tag = 0;
2773 
2774 	if(!M_WRITABLE(m))
2775 		return NULL;
2776 
2777 	/* Embed vlan tag in the packet if it is not part of it */
2778 	if(m->m_flags & M_VLANTAG) {
2779 		vlan_tag = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag);
2780 		m->m_flags &= ~M_VLANTAG;
2781 	}
2782 
2783 	/* if UMC, ignore vlan tag insertion and instead insert pvid */
2784 	if(sc->pvid) {
2785 		if(!vlan_tag)
2786 			vlan_tag = sc->pvid;
2787 		if (complete)
2788 			*complete = FALSE;
2789 	}
2790 
2791 	if(vlan_tag) {
2792 		m = ether_vlanencap(m, vlan_tag);
2793 	}
2794 
2795 	if(sc->qnqid) {
2796 		m = ether_vlanencap(m, sc->qnqid);
2797 
2798 		if (complete)
2799 			*complete = FALSE;
2800 	}
2801 	return m;
2802 }
2803 
2804 static int
2805 oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m)
2806 {
2807 	if(is_be3_a1(sc) && IS_QNQ_OR_UMC(sc) && \
2808 			oce_check_ipv6_ext_hdr(m)) {
2809 		return TRUE;
2810 	}
2811 	return FALSE;
2812 }
2813 
2814 static void
2815 oce_get_config(POCE_SOFTC sc)
2816 {
2817 	int rc = 0;
2818 	uint32_t max_rss = 0;
2819 
2820 	if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native))
2821 		max_rss = OCE_LEGACY_MODE_RSS;
2822 	else
2823 		max_rss = OCE_MAX_RSS;
2824 
2825 	if (!IS_BE(sc)) {
2826 		rc = oce_get_profile_config(sc, max_rss);
2827 		if (rc) {
2828 			sc->nwqs = OCE_MAX_WQ;
2829 			sc->nrssqs = max_rss;
2830 			sc->nrqs = sc->nrssqs + 1;
2831 		}
2832 	}
2833 	else { /* For BE3 don't rely on fw for determining the resources */
2834 		sc->nrssqs = max_rss;
2835 		sc->nrqs = sc->nrssqs + 1;
2836 		sc->nwqs = OCE_MAX_WQ;
2837 		sc->max_vlans = MAX_VLANFILTER_SIZE;
2838 	}
2839 }
2840 
2841 static void
2842 oce_rdma_close(void)
2843 {
2844   if (oce_rdma_if != NULL) {
2845     oce_rdma_if = NULL;
2846   }
2847 }
2848 
2849 static void
2850 oce_get_mac_addr(POCE_SOFTC sc, uint8_t *macaddr)
2851 {
2852   memcpy(macaddr, sc->macaddr.mac_addr, 6);
2853 }
2854 
2855 int
2856 oce_register_rdma(POCE_RDMA_INFO rdma_info, POCE_RDMA_IF rdma_if)
2857 {
2858   POCE_SOFTC sc;
2859   struct oce_dev_info di;
2860   int i;
2861 
2862   if ((rdma_info == NULL) || (rdma_if == NULL)) {
2863     return -EINVAL;
2864   }
2865 
2866   if ((rdma_info->size != OCE_RDMA_INFO_SIZE) ||
2867       (rdma_if->size != OCE_RDMA_IF_SIZE)) {
2868     return -ENXIO;
2869   }
2870 
2871   rdma_info->close = oce_rdma_close;
2872   rdma_info->mbox_post = oce_mbox_post;
2873   rdma_info->common_req_hdr_init = mbx_common_req_hdr_init;
2874   rdma_info->get_mac_addr = oce_get_mac_addr;
2875 
2876   oce_rdma_if = rdma_if;
2877 
2878   sc = softc_head;
2879   while (sc != NULL) {
2880     if (oce_rdma_if->announce != NULL) {
2881       memset(&di, 0, sizeof(di));
2882       di.dev = sc->dev;
2883       di.softc = sc;
2884       di.ifp = sc->ifp;
2885       di.db_bhandle = sc->db_bhandle;
2886       di.db_btag = sc->db_btag;
2887       di.db_page_size = 4096;
2888       if (sc->flags & OCE_FLAGS_USING_MSIX) {
2889         di.intr_mode = OCE_INTERRUPT_MODE_MSIX;
2890       } else if (sc->flags & OCE_FLAGS_USING_MSI) {
2891         di.intr_mode = OCE_INTERRUPT_MODE_MSI;
2892       } else {
2893         di.intr_mode = OCE_INTERRUPT_MODE_INTX;
2894       }
2895       di.dev_family = OCE_GEN2_FAMILY; // fixme: must detect skyhawk
2896       if (di.intr_mode != OCE_INTERRUPT_MODE_INTX) {
2897         di.msix.num_vectors = sc->intr_count + sc->roce_intr_count;
2898         di.msix.start_vector = sc->intr_count;
2899         for (i=0; i<di.msix.num_vectors; i++) {
2900           di.msix.vector_list[i] = sc->intrs[i].vector;
2901         }
2902       } else {
2903       }
2904       memcpy(di.mac_addr, sc->macaddr.mac_addr, 6);
2905       di.vendor_id = pci_get_vendor(sc->dev);
2906       di.dev_id = pci_get_device(sc->dev);
2907 
2908       if (sc->rdma_flags & OCE_RDMA_FLAG_SUPPORTED) {
2909           di.flags  |= OCE_RDMA_INFO_RDMA_SUPPORTED;
2910       }
2911 
2912       rdma_if->announce(&di);
2913       sc = sc->next;
2914     }
2915   }
2916 
2917   return 0;
2918 }
2919 
2920 static void
2921 oce_read_env_variables( POCE_SOFTC sc )
2922 {
2923 	char *value = NULL;
2924 	int rc = 0;
2925 
2926         /* read if user wants to enable hwlro or swlro */
2927         //value = getenv("oce_enable_hwlro");
2928         if(value && IS_SH(sc)) {
2929                 sc->enable_hwlro = strtol(value, NULL, 10);
2930                 if(sc->enable_hwlro) {
2931                         rc = oce_mbox_nic_query_lro_capabilities(sc, NULL, NULL);
2932                         if(rc) {
2933                                 device_printf(sc->dev, "no hardware lro support\n");
2934                 		device_printf(sc->dev, "software lro enabled\n");
2935                                 sc->enable_hwlro = 0;
2936                         }else {
2937                                 device_printf(sc->dev, "hardware lro enabled\n");
2938 				oce_max_rsp_handled = 32;
2939                         }
2940                 }else {
2941                         device_printf(sc->dev, "software lro enabled\n");
2942                 }
2943         }else {
2944                 sc->enable_hwlro = 0;
2945         }
2946 
2947         /* read mbuf size */
2948         //value = getenv("oce_rq_buf_size");
2949         if(value && IS_SH(sc)) {
2950                 oce_rq_buf_size = strtol(value, NULL, 10);
2951                 switch(oce_rq_buf_size) {
2952                 case 2048:
2953                 case 4096:
2954                 case 9216:
2955                 case 16384:
2956                         break;
2957 
2958                 default:
2959                         device_printf(sc->dev, " Supported oce_rq_buf_size values are 2K, 4K, 9K, 16K \n");
2960                         oce_rq_buf_size = 2048;
2961                 }
2962         }
2963 
2964 	return;
2965 }
2966