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