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