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