]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/oce/oce_if.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / oce / oce_if.c
1 /*-
2  * Copyright (C) 2013 Emulex
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the Emulex Corporation nor the names of its
16  *    contributors may be used to endorse or promote products derived from
17  *    this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  * Contact Information:
32  * freebsd-drivers@emulex.com
33  *
34  * Emulex
35  * 3333 Susan Street
36  * Costa Mesa, CA 92626
37  */
38
39 /* $FreeBSD$ */
40
41 #include "opt_inet6.h"
42 #include "opt_inet.h"
43
44 #include "oce_if.h"
45
46 /* UE Status Low CSR */
47 static char *ue_status_low_desc[] = {
48         "CEV",
49         "CTX",
50         "DBUF",
51         "ERX",
52         "Host",
53         "MPU",
54         "NDMA",
55         "PTC ",
56         "RDMA ",
57         "RXF ",
58         "RXIPS ",
59         "RXULP0 ",
60         "RXULP1 ",
61         "RXULP2 ",
62         "TIM ",
63         "TPOST ",
64         "TPRE ",
65         "TXIPS ",
66         "TXULP0 ",
67         "TXULP1 ",
68         "UC ",
69         "WDMA ",
70         "TXULP2 ",
71         "HOST1 ",
72         "P0_OB_LINK ",
73         "P1_OB_LINK ",
74         "HOST_GPIO ",
75         "MBOX ",
76         "AXGMAC0",
77         "AXGMAC1",
78         "JTAG",
79         "MPU_INTPEND"
80 };
81
82 /* UE Status High CSR */
83 static char *ue_status_hi_desc[] = {
84         "LPCMEMHOST",
85         "MGMT_MAC",
86         "PCS0ONLINE",
87         "MPU_IRAM",
88         "PCS1ONLINE",
89         "PCTL0",
90         "PCTL1",
91         "PMEM",
92         "RR",
93         "TXPB",
94         "RXPP",
95         "XAUI",
96         "TXP",
97         "ARM",
98         "IPC",
99         "HOST2",
100         "HOST3",
101         "HOST4",
102         "HOST5",
103         "HOST6",
104         "HOST7",
105         "HOST8",
106         "HOST9",
107         "NETC",
108         "Unknown",
109         "Unknown",
110         "Unknown",
111         "Unknown",
112         "Unknown",
113         "Unknown",
114         "Unknown",
115         "Unknown"
116 };
117
118
119 /* Driver entry points prototypes */
120 static int  oce_probe(device_t dev);
121 static int  oce_attach(device_t dev);
122 static int  oce_detach(device_t dev);
123 static int  oce_shutdown(device_t dev);
124 static int  oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data);
125 static void oce_init(void *xsc);
126 static int  oce_multiq_start(struct ifnet *ifp, struct mbuf *m);
127 static void oce_multiq_flush(struct ifnet *ifp);
128
129 /* Driver interrupt routines protypes */
130 static void oce_intr(void *arg, int pending);
131 static int  oce_setup_intr(POCE_SOFTC sc);
132 static int  oce_fast_isr(void *arg);
133 static int  oce_alloc_intr(POCE_SOFTC sc, int vector,
134                           void (*isr) (void *arg, int pending));
135
136 /* Media callbacks prototypes */
137 static void oce_media_status(struct ifnet *ifp, struct ifmediareq *req);
138 static int  oce_media_change(struct ifnet *ifp);
139
140 /* Transmit routines prototypes */
141 static int  oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index);
142 static void oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq);
143 static void oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx,
144                                         uint32_t status);
145 static int  oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m,
146                                  struct oce_wq *wq);
147
148 /* Receive routines prototypes */
149 static void oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe);
150 static int  oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe);
151 static int  oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe);
152 static void oce_rx(struct oce_rq *rq, uint32_t rqe_idx,
153                                                 struct oce_nic_rx_cqe *cqe);
154
155 /* Helper function prototypes in this file */
156 static int  oce_attach_ifp(POCE_SOFTC sc);
157 static void oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag);
158 static void oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag);
159 static int  oce_vid_config(POCE_SOFTC sc);
160 static void oce_mac_addr_set(POCE_SOFTC sc);
161 static int  oce_handle_passthrough(struct ifnet *ifp, caddr_t data);
162 static void oce_local_timer(void *arg);
163 static void oce_if_deactivate(POCE_SOFTC sc);
164 static void oce_if_activate(POCE_SOFTC sc);
165 static void setup_max_queues_want(POCE_SOFTC sc);
166 static void update_queues_got(POCE_SOFTC sc);
167 static void process_link_state(POCE_SOFTC sc,
168                  struct oce_async_cqe_link_state *acqe);
169 static int oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m);
170 static void oce_get_config(POCE_SOFTC sc);
171 static struct mbuf *oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete);
172
173 /* IP specific */
174 #if defined(INET6) || defined(INET)
175 static int  oce_init_lro(POCE_SOFTC sc);
176 static void oce_rx_flush_lro(struct oce_rq *rq);
177 static struct mbuf * oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp);
178 #endif
179
180 static device_method_t oce_dispatch[] = {
181         DEVMETHOD(device_probe, oce_probe),
182         DEVMETHOD(device_attach, oce_attach),
183         DEVMETHOD(device_detach, oce_detach),
184         DEVMETHOD(device_shutdown, oce_shutdown),
185
186         DEVMETHOD_END
187 };
188
189 static driver_t oce_driver = {
190         "oce",
191         oce_dispatch,
192         sizeof(OCE_SOFTC)
193 };
194 static devclass_t oce_devclass;
195
196
197 DRIVER_MODULE(oce, pci, oce_driver, oce_devclass, 0, 0);
198 MODULE_DEPEND(oce, pci, 1, 1, 1);
199 MODULE_DEPEND(oce, ether, 1, 1, 1);
200 MODULE_VERSION(oce, 1);
201
202
203 /* global vars */
204 const char component_revision[32] = {"///" COMPONENT_REVISION "///"};
205
206 /* Module capabilites and parameters */
207 uint32_t oce_max_rsp_handled = OCE_MAX_RSP_HANDLED;
208 uint32_t oce_enable_rss = OCE_MODCAP_RSS;
209
210
211 TUNABLE_INT("hw.oce.max_rsp_handled", &oce_max_rsp_handled);
212 TUNABLE_INT("hw.oce.enable_rss", &oce_enable_rss);
213
214
215 /* Supported devices table */
216 static uint32_t supportedDevices[] =  {
217         (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE2,
218         (PCI_VENDOR_SERVERENGINES << 16) | PCI_PRODUCT_BE3,
219         (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_BE3,
220         (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201,
221         (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_XE201_VF,
222         (PCI_VENDOR_EMULEX << 16) | PCI_PRODUCT_SH
223 };
224
225
226
227
228 /*****************************************************************************
229  *                      Driver entry points functions                        *
230  *****************************************************************************/
231
232 static int
233 oce_probe(device_t dev)
234 {
235         uint16_t vendor = 0;
236         uint16_t device = 0;
237         int i = 0;
238         char str[256] = {0};
239         POCE_SOFTC sc;
240
241         sc = device_get_softc(dev);
242         bzero(sc, sizeof(OCE_SOFTC));
243         sc->dev = dev;
244
245         vendor = pci_get_vendor(dev);
246         device = pci_get_device(dev);
247
248         for (i = 0; i < (sizeof(supportedDevices) / sizeof(uint32_t)); i++) {
249                 if (vendor == ((supportedDevices[i] >> 16) & 0xffff)) {
250                         if (device == (supportedDevices[i] & 0xffff)) {
251                                 sprintf(str, "%s:%s", "Emulex CNA NIC function",
252                                         component_revision);
253                                 device_set_desc_copy(dev, str);
254
255                                 switch (device) {
256                                 case PCI_PRODUCT_BE2:
257                                         sc->flags |= OCE_FLAGS_BE2;
258                                         break;
259                                 case PCI_PRODUCT_BE3:
260                                         sc->flags |= OCE_FLAGS_BE3;
261                                         break;
262                                 case PCI_PRODUCT_XE201:
263                                 case PCI_PRODUCT_XE201_VF:
264                                         sc->flags |= OCE_FLAGS_XE201;
265                                         break;
266                                 case PCI_PRODUCT_SH:
267                                         sc->flags |= OCE_FLAGS_SH;
268                                         break;
269                                 default:
270                                         return ENXIO;
271                                 }
272                                 return BUS_PROBE_DEFAULT;
273                         }
274                 }
275         }
276
277         return ENXIO;
278 }
279
280
281 static int
282 oce_attach(device_t dev)
283 {
284         POCE_SOFTC sc;
285         int rc = 0;
286
287         sc = device_get_softc(dev);
288
289         rc = oce_hw_pci_alloc(sc);
290         if (rc)
291                 return rc;
292
293         sc->tx_ring_size = OCE_TX_RING_SIZE;
294         sc->rx_ring_size = OCE_RX_RING_SIZE;
295         sc->rq_frag_size = OCE_RQ_BUF_SIZE;
296         sc->flow_control = OCE_DEFAULT_FLOW_CONTROL;
297         sc->promisc      = OCE_DEFAULT_PROMISCUOUS;
298
299         LOCK_CREATE(&sc->bmbx_lock, "Mailbox_lock");
300         LOCK_CREATE(&sc->dev_lock,  "Device_lock");
301
302         /* initialise the hardware */
303         rc = oce_hw_init(sc);
304         if (rc)
305                 goto pci_res_free;
306
307         oce_get_config(sc);
308
309         setup_max_queues_want(sc);      
310
311         rc = oce_setup_intr(sc);
312         if (rc)
313                 goto mbox_free;
314
315         rc = oce_queue_init_all(sc);
316         if (rc)
317                 goto intr_free;
318
319         rc = oce_attach_ifp(sc);
320         if (rc)
321                 goto queues_free;
322
323 #if defined(INET6) || defined(INET)
324         rc = oce_init_lro(sc);
325         if (rc)
326                 goto ifp_free;
327 #endif
328
329         rc = oce_hw_start(sc);
330         if (rc)
331                 goto lro_free;
332
333         sc->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
334                                 oce_add_vlan, sc, EVENTHANDLER_PRI_FIRST);
335         sc->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
336                                 oce_del_vlan, sc, EVENTHANDLER_PRI_FIRST);
337
338         rc = oce_stats_init(sc);
339         if (rc)
340                 goto vlan_free;
341
342         oce_add_sysctls(sc);
343
344         callout_init(&sc->timer, CALLOUT_MPSAFE);
345         rc = callout_reset(&sc->timer, 2 * hz, oce_local_timer, sc);
346         if (rc)
347                 goto stats_free;
348
349         return 0;
350
351 stats_free:
352         callout_drain(&sc->timer);
353         oce_stats_free(sc);
354 vlan_free:
355         if (sc->vlan_attach)
356                 EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
357         if (sc->vlan_detach)
358                 EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
359         oce_hw_intr_disable(sc);
360 lro_free:
361 #if defined(INET6) || defined(INET)
362         oce_free_lro(sc);
363 ifp_free:
364 #endif
365         ether_ifdetach(sc->ifp);
366         if_free(sc->ifp);
367 queues_free:
368         oce_queue_release_all(sc);
369 intr_free:
370         oce_intr_free(sc);
371 mbox_free:
372         oce_dma_free(sc, &sc->bsmbx);
373 pci_res_free:
374         oce_hw_pci_free(sc);
375         LOCK_DESTROY(&sc->dev_lock);
376         LOCK_DESTROY(&sc->bmbx_lock);
377         return rc;
378
379 }
380
381
382 static int
383 oce_detach(device_t dev)
384 {
385         POCE_SOFTC sc = device_get_softc(dev);
386
387         LOCK(&sc->dev_lock);
388         oce_if_deactivate(sc);
389         UNLOCK(&sc->dev_lock);
390
391         callout_drain(&sc->timer);
392         
393         if (sc->vlan_attach != NULL)
394                 EVENTHANDLER_DEREGISTER(vlan_config, sc->vlan_attach);
395         if (sc->vlan_detach != NULL)
396                 EVENTHANDLER_DEREGISTER(vlan_unconfig, sc->vlan_detach);
397
398         ether_ifdetach(sc->ifp);
399
400         if_free(sc->ifp);
401
402         oce_hw_shutdown(sc);
403
404         bus_generic_detach(dev);
405
406         return 0;
407 }
408
409
410 static int
411 oce_shutdown(device_t dev)
412 {
413         int rc;
414         
415         rc = oce_detach(dev);
416
417         return rc;      
418 }
419
420
421 static int
422 oce_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
423 {
424         struct ifreq *ifr = (struct ifreq *)data;
425         POCE_SOFTC sc = ifp->if_softc;
426         int rc = 0;
427         uint32_t u;
428
429         switch (command) {
430
431         case SIOCGIFMEDIA:
432                 rc = ifmedia_ioctl(ifp, ifr, &sc->media, command);
433                 break;
434
435         case SIOCSIFMTU:
436                 if (ifr->ifr_mtu > OCE_MAX_MTU)
437                         rc = EINVAL;
438                 else
439                         ifp->if_mtu = ifr->ifr_mtu;
440                 break;
441
442         case SIOCSIFFLAGS:
443                 if (ifp->if_flags & IFF_UP) {
444                         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
445                                 sc->ifp->if_drv_flags |= IFF_DRV_RUNNING;       
446                                 oce_init(sc);
447                         }
448                         device_printf(sc->dev, "Interface Up\n");       
449                 } else {
450                         LOCK(&sc->dev_lock);
451
452                         sc->ifp->if_drv_flags &=
453                             ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
454                         oce_if_deactivate(sc);
455
456                         UNLOCK(&sc->dev_lock);
457
458                         device_printf(sc->dev, "Interface Down\n");
459                 }
460
461                 if ((ifp->if_flags & IFF_PROMISC) && !sc->promisc) {
462                         if (!oce_rxf_set_promiscuous(sc, (1 | (1 << 1))))
463                                 sc->promisc = TRUE;
464                 } else if (!(ifp->if_flags & IFF_PROMISC) && sc->promisc) {
465                         if (!oce_rxf_set_promiscuous(sc, 0))
466                                 sc->promisc = FALSE;
467                 }
468
469                 break;
470
471         case SIOCADDMULTI:
472         case SIOCDELMULTI:
473                 rc = oce_hw_update_multicast(sc);
474                 if (rc)
475                         device_printf(sc->dev,
476                                 "Update multicast address failed\n");
477                 break;
478
479         case SIOCSIFCAP:
480                 u = ifr->ifr_reqcap ^ ifp->if_capenable;
481
482                 if (u & IFCAP_TXCSUM) {
483                         ifp->if_capenable ^= IFCAP_TXCSUM;
484                         ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
485                         
486                         if (IFCAP_TSO & ifp->if_capenable &&
487                             !(IFCAP_TXCSUM & ifp->if_capenable)) {
488                                 ifp->if_capenable &= ~IFCAP_TSO;
489                                 ifp->if_hwassist &= ~CSUM_TSO;
490                                 if_printf(ifp,
491                                          "TSO disabled due to -txcsum.\n");
492                         }
493                 }
494
495                 if (u & IFCAP_RXCSUM)
496                         ifp->if_capenable ^= IFCAP_RXCSUM;
497
498                 if (u & IFCAP_TSO4) {
499                         ifp->if_capenable ^= IFCAP_TSO4;
500
501                         if (IFCAP_TSO & ifp->if_capenable) {
502                                 if (IFCAP_TXCSUM & ifp->if_capenable)
503                                         ifp->if_hwassist |= CSUM_TSO;
504                                 else {
505                                         ifp->if_capenable &= ~IFCAP_TSO;
506                                         ifp->if_hwassist &= ~CSUM_TSO;
507                                         if_printf(ifp,
508                                             "Enable txcsum first.\n");
509                                         rc = EAGAIN;
510                                 }
511                         } else
512                                 ifp->if_hwassist &= ~CSUM_TSO;
513                 }
514
515                 if (u & IFCAP_VLAN_HWTAGGING)
516                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
517
518                 if (u & IFCAP_VLAN_HWFILTER) {
519                         ifp->if_capenable ^= IFCAP_VLAN_HWFILTER;
520                         oce_vid_config(sc);
521                 }
522 #if defined(INET6) || defined(INET)
523                 if (u & IFCAP_LRO)
524                         ifp->if_capenable ^= IFCAP_LRO;
525 #endif
526
527                 break;
528
529         case SIOCGPRIVATE_0:
530                 rc = oce_handle_passthrough(ifp, data);
531                 break;
532         default:
533                 rc = ether_ioctl(ifp, command, data);
534                 break;
535         }
536
537         return rc;
538 }
539
540
541 static void
542 oce_init(void *arg)
543 {
544         POCE_SOFTC sc = arg;
545         
546         LOCK(&sc->dev_lock);
547
548         if (sc->ifp->if_flags & IFF_UP) {
549                 oce_if_deactivate(sc);
550                 oce_if_activate(sc);
551         }
552         
553         UNLOCK(&sc->dev_lock);
554
555 }
556
557
558 static int
559 oce_multiq_start(struct ifnet *ifp, struct mbuf *m)
560 {
561         POCE_SOFTC sc = ifp->if_softc;
562         struct oce_wq *wq = NULL;
563         int queue_index = 0;
564         int status = 0;
565
566         if (!sc->link_status)
567                 return ENXIO;
568
569         if ((m->m_flags & M_FLOWID) != 0)
570                 queue_index = m->m_pkthdr.flowid % sc->nwqs;
571
572         wq = sc->wq[queue_index];
573
574         LOCK(&wq->tx_lock);
575         status = oce_multiq_transmit(ifp, m, wq);
576         UNLOCK(&wq->tx_lock);
577
578         return status;
579
580 }
581
582
583 static void
584 oce_multiq_flush(struct ifnet *ifp)
585 {
586         POCE_SOFTC sc = ifp->if_softc;
587         struct mbuf     *m;
588         int i = 0;
589
590         for (i = 0; i < sc->nwqs; i++) {
591                 while ((m = buf_ring_dequeue_sc(sc->wq[i]->br)) != NULL)
592                         m_freem(m);
593         }
594         if_qflush(ifp);
595 }
596
597
598
599 /*****************************************************************************
600  *                   Driver interrupt routines functions                     *
601  *****************************************************************************/
602
603 static void
604 oce_intr(void *arg, int pending)
605 {
606
607         POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
608         POCE_SOFTC sc = ii->sc;
609         struct oce_eq *eq = ii->eq;
610         struct oce_eqe *eqe;
611         struct oce_cq *cq = NULL;
612         int i, num_eqes = 0;
613
614
615         bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
616                                  BUS_DMASYNC_POSTWRITE);
617         do {
618                 eqe = RING_GET_CONSUMER_ITEM_VA(eq->ring, struct oce_eqe);
619                 if (eqe->evnt == 0)
620                         break;
621                 eqe->evnt = 0;
622                 bus_dmamap_sync(eq->ring->dma.tag, eq->ring->dma.map,
623                                         BUS_DMASYNC_POSTWRITE);
624                 RING_GET(eq->ring, 1);
625                 num_eqes++;
626
627         } while (TRUE);
628         
629         if (!num_eqes)
630                 goto eq_arm; /* Spurious */
631
632         /* Clear EQ entries, but dont arm */
633         oce_arm_eq(sc, eq->eq_id, num_eqes, FALSE, FALSE);
634
635         /* Process TX, RX and MCC. But dont arm CQ*/
636         for (i = 0; i < eq->cq_valid; i++) {
637                 cq = eq->cq[i];
638                 (*cq->cq_handler)(cq->cb_arg);
639         }
640
641         /* Arm all cqs connected to this EQ */
642         for (i = 0; i < eq->cq_valid; i++) {
643                 cq = eq->cq[i];
644                 oce_arm_cq(sc, cq->cq_id, 0, TRUE);
645         }
646
647 eq_arm:
648         oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
649
650         return;
651 }
652
653
654 static int
655 oce_setup_intr(POCE_SOFTC sc)
656 {
657         int rc = 0, use_intx = 0;
658         int vector = 0, req_vectors = 0;
659
660         if (is_rss_enabled(sc))
661                 req_vectors = MAX((sc->nrqs - 1), sc->nwqs);
662         else
663                 req_vectors = 1;
664
665         if (sc->flags & OCE_FLAGS_MSIX_CAPABLE) {
666                 sc->intr_count = req_vectors;
667                 rc = pci_alloc_msix(sc->dev, &sc->intr_count);
668                 if (rc != 0) {
669                         use_intx = 1;
670                         pci_release_msi(sc->dev);
671                 } else
672                         sc->flags |= OCE_FLAGS_USING_MSIX;
673         } else
674                 use_intx = 1;
675
676         if (use_intx)
677                 sc->intr_count = 1;
678
679         /* Scale number of queues based on intr we got */
680         update_queues_got(sc);
681
682         if (use_intx) {
683                 device_printf(sc->dev, "Using legacy interrupt\n");
684                 rc = oce_alloc_intr(sc, vector, oce_intr);
685                 if (rc)
686                         goto error;             
687         } else {
688                 for (; vector < sc->intr_count; vector++) {
689                         rc = oce_alloc_intr(sc, vector, oce_intr);
690                         if (rc)
691                                 goto error;
692                 }
693         }
694
695         return 0;
696 error:
697         oce_intr_free(sc);
698         return rc;
699 }
700
701
702 static int
703 oce_fast_isr(void *arg)
704 {
705         POCE_INTR_INFO ii = (POCE_INTR_INFO) arg;
706         POCE_SOFTC sc = ii->sc;
707
708         if (ii->eq == NULL)
709                 return FILTER_STRAY;
710
711         oce_arm_eq(sc, ii->eq->eq_id, 0, FALSE, TRUE);
712
713         taskqueue_enqueue_fast(ii->tq, &ii->task);
714
715         ii->eq->intr++; 
716
717         return FILTER_HANDLED;
718 }
719
720
721 static int
722 oce_alloc_intr(POCE_SOFTC sc, int vector, void (*isr) (void *arg, int pending))
723 {
724         POCE_INTR_INFO ii = &sc->intrs[vector];
725         int rc = 0, rr;
726
727         if (vector >= OCE_MAX_EQ)
728                 return (EINVAL);
729
730         /* Set the resource id for the interrupt.
731          * MSIx is vector + 1 for the resource id,
732          * INTx is 0 for the resource id.
733          */
734         if (sc->flags & OCE_FLAGS_USING_MSIX)
735                 rr = vector + 1;
736         else
737                 rr = 0;
738         ii->intr_res = bus_alloc_resource_any(sc->dev,
739                                               SYS_RES_IRQ,
740                                               &rr, RF_ACTIVE|RF_SHAREABLE);
741         ii->irq_rr = rr;
742         if (ii->intr_res == NULL) {
743                 device_printf(sc->dev,
744                           "Could not allocate interrupt\n");
745                 rc = ENXIO;
746                 return rc;
747         }
748
749         TASK_INIT(&ii->task, 0, isr, ii);
750         ii->vector = vector;
751         sprintf(ii->task_name, "oce_task[%d]", ii->vector);
752         ii->tq = taskqueue_create_fast(ii->task_name,
753                         M_NOWAIT,
754                         taskqueue_thread_enqueue,
755                         &ii->tq);
756         taskqueue_start_threads(&ii->tq, 1, PI_NET, "%s taskq",
757                         device_get_nameunit(sc->dev));
758
759         ii->sc = sc;
760         rc = bus_setup_intr(sc->dev,
761                         ii->intr_res,
762                         INTR_TYPE_NET,
763                         oce_fast_isr, NULL, ii, &ii->tag);
764         return rc;
765
766 }
767
768
769 void
770 oce_intr_free(POCE_SOFTC sc)
771 {
772         int i = 0;
773         
774         for (i = 0; i < sc->intr_count; i++) {
775                 
776                 if (sc->intrs[i].tag != NULL)
777                         bus_teardown_intr(sc->dev, sc->intrs[i].intr_res,
778                                                 sc->intrs[i].tag);
779                 if (sc->intrs[i].tq != NULL)
780                         taskqueue_free(sc->intrs[i].tq);
781                 
782                 if (sc->intrs[i].intr_res != NULL)
783                         bus_release_resource(sc->dev, SYS_RES_IRQ,
784                                                 sc->intrs[i].irq_rr,
785                                                 sc->intrs[i].intr_res);
786                 sc->intrs[i].tag = NULL;
787                 sc->intrs[i].intr_res = NULL;
788         }
789
790         if (sc->flags & OCE_FLAGS_USING_MSIX)
791                 pci_release_msi(sc->dev);
792
793 }
794
795
796
797 /******************************************************************************
798 *                         Media callbacks functions                           *
799 ******************************************************************************/
800
801 static void
802 oce_media_status(struct ifnet *ifp, struct ifmediareq *req)
803 {
804         POCE_SOFTC sc = (POCE_SOFTC) ifp->if_softc;
805
806
807         req->ifm_status = IFM_AVALID;
808         req->ifm_active = IFM_ETHER;
809         
810         if (sc->link_status == 1)
811                 req->ifm_status |= IFM_ACTIVE;
812         else 
813                 return;
814         
815         switch (sc->link_speed) {
816         case 1: /* 10 Mbps */
817                 req->ifm_active |= IFM_10_T | IFM_FDX;
818                 sc->speed = 10;
819                 break;
820         case 2: /* 100 Mbps */
821                 req->ifm_active |= IFM_100_TX | IFM_FDX;
822                 sc->speed = 100;
823                 break;
824         case 3: /* 1 Gbps */
825                 req->ifm_active |= IFM_1000_T | IFM_FDX;
826                 sc->speed = 1000;
827                 break;
828         case 4: /* 10 Gbps */
829                 req->ifm_active |= IFM_10G_SR | IFM_FDX;
830                 sc->speed = 10000;
831                 break;
832         case 7: /* 40 Gbps */
833                 req->ifm_active |= IFM_40G_SR4 | IFM_FDX;
834                 sc->speed = 40000;
835                 break;
836         }
837         
838         return;
839 }
840
841
842 int
843 oce_media_change(struct ifnet *ifp)
844 {
845         return 0;
846 }
847
848
849
850
851 /*****************************************************************************
852  *                        Transmit routines functions                        *
853  *****************************************************************************/
854
855 static int
856 oce_tx(POCE_SOFTC sc, struct mbuf **mpp, int wq_index)
857 {
858         int rc = 0, i, retry_cnt = 0;
859         bus_dma_segment_t segs[OCE_MAX_TX_ELEMENTS];
860         struct mbuf *m, *m_temp;
861         struct oce_wq *wq = sc->wq[wq_index];
862         struct oce_packet_desc *pd;
863         struct oce_nic_hdr_wqe *nichdr;
864         struct oce_nic_frag_wqe *nicfrag;
865         int num_wqes;
866         uint32_t reg_value;
867         boolean_t complete = TRUE;
868
869         m = *mpp;
870         if (!m)
871                 return EINVAL;
872
873         if (!(m->m_flags & M_PKTHDR)) {
874                 rc = ENXIO;
875                 goto free_ret;
876         }
877
878         if(oce_tx_asic_stall_verify(sc, m)) {
879                 m = oce_insert_vlan_tag(sc, m, &complete);
880                 if(!m) {
881                         device_printf(sc->dev, "Insertion unsuccessful\n");
882                         return 0;
883                 }
884
885         }
886
887         if (m->m_pkthdr.csum_flags & CSUM_TSO) {
888                 /* consolidate packet buffers for TSO/LSO segment offload */
889 #if defined(INET6) || defined(INET)
890                 m = oce_tso_setup(sc, mpp);
891 #else
892                 m = NULL;
893 #endif
894                 if (m == NULL) {
895                         rc = ENXIO;
896                         goto free_ret;
897                 }
898         }
899
900         pd = &wq->pckts[wq->pkt_desc_head];
901 retry:
902         rc = bus_dmamap_load_mbuf_sg(wq->tag,
903                                      pd->map,
904                                      m, segs, &pd->nsegs, BUS_DMA_NOWAIT);
905         if (rc == 0) {
906                 num_wqes = pd->nsegs + 1;
907                 if (IS_BE(sc) || IS_SH(sc)) {
908                         /*Dummy required only for BE3.*/
909                         if (num_wqes & 1)
910                                 num_wqes++;
911                 }
912                 if (num_wqes >= RING_NUM_FREE(wq->ring)) {
913                         bus_dmamap_unload(wq->tag, pd->map);
914                         return EBUSY;
915                 }
916                 atomic_store_rel_int(&wq->pkt_desc_head,
917                                      (wq->pkt_desc_head + 1) % \
918                                       OCE_WQ_PACKET_ARRAY_SIZE);
919                 bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_PREWRITE);
920                 pd->mbuf = m;
921
922                 nichdr =
923                     RING_GET_PRODUCER_ITEM_VA(wq->ring, struct oce_nic_hdr_wqe);
924                 nichdr->u0.dw[0] = 0;
925                 nichdr->u0.dw[1] = 0;
926                 nichdr->u0.dw[2] = 0;
927                 nichdr->u0.dw[3] = 0;
928
929                 nichdr->u0.s.complete = complete;
930                 nichdr->u0.s.event = 1;
931                 nichdr->u0.s.crc = 1;
932                 nichdr->u0.s.forward = 0;
933                 nichdr->u0.s.ipcs = (m->m_pkthdr.csum_flags & CSUM_IP) ? 1 : 0;
934                 nichdr->u0.s.udpcs =
935                         (m->m_pkthdr.csum_flags & CSUM_UDP) ? 1 : 0;
936                 nichdr->u0.s.tcpcs =
937                         (m->m_pkthdr.csum_flags & CSUM_TCP) ? 1 : 0;
938                 nichdr->u0.s.num_wqe = num_wqes;
939                 nichdr->u0.s.total_length = m->m_pkthdr.len;
940
941                 if (m->m_flags & M_VLANTAG) {
942                         nichdr->u0.s.vlan = 1; /*Vlan present*/
943                         nichdr->u0.s.vlan_tag = m->m_pkthdr.ether_vtag;
944                 }
945
946                 if (m->m_pkthdr.csum_flags & CSUM_TSO) {
947                         if (m->m_pkthdr.tso_segsz) {
948                                 nichdr->u0.s.lso = 1;
949                                 nichdr->u0.s.lso_mss  = m->m_pkthdr.tso_segsz;
950                         }
951                         if (!IS_BE(sc) || !IS_SH(sc))
952                                 nichdr->u0.s.ipcs = 1;
953                 }
954
955                 RING_PUT(wq->ring, 1);
956                 atomic_add_int(&wq->ring->num_used, 1);
957
958                 for (i = 0; i < pd->nsegs; i++) {
959                         nicfrag =
960                             RING_GET_PRODUCER_ITEM_VA(wq->ring,
961                                                       struct oce_nic_frag_wqe);
962                         nicfrag->u0.s.rsvd0 = 0;
963                         nicfrag->u0.s.frag_pa_hi = ADDR_HI(segs[i].ds_addr);
964                         nicfrag->u0.s.frag_pa_lo = ADDR_LO(segs[i].ds_addr);
965                         nicfrag->u0.s.frag_len = segs[i].ds_len;
966                         pd->wqe_idx = wq->ring->pidx;
967                         RING_PUT(wq->ring, 1);
968                         atomic_add_int(&wq->ring->num_used, 1);
969                 }
970                 if (num_wqes > (pd->nsegs + 1)) {
971                         nicfrag =
972                             RING_GET_PRODUCER_ITEM_VA(wq->ring,
973                                                       struct oce_nic_frag_wqe);
974                         nicfrag->u0.dw[0] = 0;
975                         nicfrag->u0.dw[1] = 0;
976                         nicfrag->u0.dw[2] = 0;
977                         nicfrag->u0.dw[3] = 0;
978                         pd->wqe_idx = wq->ring->pidx;
979                         RING_PUT(wq->ring, 1);
980                         atomic_add_int(&wq->ring->num_used, 1);
981                         pd->nsegs++;
982                 }
983
984                 sc->ifp->if_opackets++;
985                 wq->tx_stats.tx_reqs++;
986                 wq->tx_stats.tx_wrbs += num_wqes;
987                 wq->tx_stats.tx_bytes += m->m_pkthdr.len;
988                 wq->tx_stats.tx_pkts++;
989
990                 bus_dmamap_sync(wq->ring->dma.tag, wq->ring->dma.map,
991                                 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
992                 reg_value = (num_wqes << 16) | wq->wq_id;
993                 OCE_WRITE_REG32(sc, db, wq->db_offset, reg_value);
994
995         } else if (rc == EFBIG) {
996                 if (retry_cnt == 0) {
997                         m_temp = m_defrag(m, M_NOWAIT);
998                         if (m_temp == NULL)
999                                 goto free_ret;
1000                         m = m_temp;
1001                         *mpp = m_temp;
1002                         retry_cnt = retry_cnt + 1;
1003                         goto retry;
1004                 } else
1005                         goto free_ret;
1006         } else if (rc == ENOMEM)
1007                 return rc;
1008         else
1009                 goto free_ret;
1010         
1011         return 0;
1012
1013 free_ret:
1014         m_freem(*mpp);
1015         *mpp = NULL;
1016         return rc;
1017 }
1018
1019
1020 static void
1021 oce_tx_complete(struct oce_wq *wq, uint32_t wqe_idx, uint32_t status)
1022 {
1023         struct oce_packet_desc *pd;
1024         POCE_SOFTC sc = (POCE_SOFTC) wq->parent;
1025         struct mbuf *m;
1026
1027         pd = &wq->pckts[wq->pkt_desc_tail];
1028         atomic_store_rel_int(&wq->pkt_desc_tail,
1029                              (wq->pkt_desc_tail + 1) % OCE_WQ_PACKET_ARRAY_SIZE); 
1030         atomic_subtract_int(&wq->ring->num_used, pd->nsegs + 1);
1031         bus_dmamap_sync(wq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1032         bus_dmamap_unload(wq->tag, pd->map);
1033
1034         m = pd->mbuf;
1035         m_freem(m);
1036         pd->mbuf = NULL;
1037
1038
1039         if (sc->ifp->if_drv_flags & IFF_DRV_OACTIVE) {
1040                 if (wq->ring->num_used < (wq->ring->num_items / 2)) {
1041                         sc->ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE);
1042                         oce_tx_restart(sc, wq); 
1043                 }
1044         }
1045 }
1046
1047
1048 static void
1049 oce_tx_restart(POCE_SOFTC sc, struct oce_wq *wq)
1050 {
1051
1052         if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != IFF_DRV_RUNNING)
1053                 return;
1054
1055 #if __FreeBSD_version >= 800000
1056         if (!drbr_empty(sc->ifp, wq->br))
1057 #else
1058         if (!IFQ_DRV_IS_EMPTY(&sc->ifp->if_snd))
1059 #endif
1060                 taskqueue_enqueue_fast(taskqueue_swi, &wq->txtask);
1061
1062 }
1063
1064
1065 #if defined(INET6) || defined(INET)
1066 static struct mbuf *
1067 oce_tso_setup(POCE_SOFTC sc, struct mbuf **mpp)
1068 {
1069         struct mbuf *m;
1070 #ifdef INET
1071         struct ip *ip;
1072 #endif
1073 #ifdef INET6
1074         struct ip6_hdr *ip6;
1075 #endif
1076         struct ether_vlan_header *eh;
1077         struct tcphdr *th;
1078         uint16_t etype;
1079         int total_len = 0, ehdrlen = 0;
1080         
1081         m = *mpp;
1082
1083         if (M_WRITABLE(m) == 0) {
1084                 m = m_dup(*mpp, M_NOWAIT);
1085                 if (!m)
1086                         return NULL;
1087                 m_freem(*mpp);
1088                 *mpp = m;
1089         }
1090
1091         eh = mtod(m, struct ether_vlan_header *);
1092         if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
1093                 etype = ntohs(eh->evl_proto);
1094                 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
1095         } else {
1096                 etype = ntohs(eh->evl_encap_proto);
1097                 ehdrlen = ETHER_HDR_LEN;
1098         }
1099
1100         switch (etype) {
1101 #ifdef INET
1102         case ETHERTYPE_IP:
1103                 ip = (struct ip *)(m->m_data + ehdrlen);
1104                 if (ip->ip_p != IPPROTO_TCP)
1105                         return NULL;
1106                 th = (struct tcphdr *)((caddr_t)ip + (ip->ip_hl << 2));
1107
1108                 total_len = ehdrlen + (ip->ip_hl << 2) + (th->th_off << 2);
1109                 break;
1110 #endif
1111 #ifdef INET6
1112         case ETHERTYPE_IPV6:
1113                 ip6 = (struct ip6_hdr *)(m->m_data + ehdrlen);
1114                 if (ip6->ip6_nxt != IPPROTO_TCP)
1115                         return NULL;
1116                 th = (struct tcphdr *)((caddr_t)ip6 + sizeof(struct ip6_hdr));
1117
1118                 total_len = ehdrlen + sizeof(struct ip6_hdr) + (th->th_off << 2);
1119                 break;
1120 #endif
1121         default:
1122                 return NULL;
1123         }
1124         
1125         m = m_pullup(m, total_len);
1126         if (!m)
1127                 return NULL;
1128         *mpp = m;
1129         return m;
1130         
1131 }
1132 #endif /* INET6 || INET */
1133
1134 void
1135 oce_tx_task(void *arg, int npending)
1136 {
1137         struct oce_wq *wq = arg;
1138         POCE_SOFTC sc = wq->parent;
1139         struct ifnet *ifp = sc->ifp;
1140         int rc = 0;
1141
1142 #if __FreeBSD_version >= 800000
1143         LOCK(&wq->tx_lock);
1144         rc = oce_multiq_transmit(ifp, NULL, wq);
1145         if (rc) {
1146                 device_printf(sc->dev,
1147                                 "TX[%d] restart failed\n", wq->queue_index);
1148         }
1149         UNLOCK(&wq->tx_lock);
1150 #else
1151         oce_start(ifp);
1152 #endif
1153
1154 }
1155
1156
1157 void
1158 oce_start(struct ifnet *ifp)
1159 {
1160         POCE_SOFTC sc = ifp->if_softc;
1161         struct mbuf *m;
1162         int rc = 0;
1163         int def_q = 0; /* Defualt tx queue is 0*/
1164
1165         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1166                         IFF_DRV_RUNNING)
1167                 return;
1168
1169         if (!sc->link_status)
1170                 return;
1171         
1172         do {
1173                 IF_DEQUEUE(&sc->ifp->if_snd, m);
1174                 if (m == NULL)
1175                         break;
1176
1177                 LOCK(&sc->wq[def_q]->tx_lock);
1178                 rc = oce_tx(sc, &m, def_q);
1179                 UNLOCK(&sc->wq[def_q]->tx_lock);
1180                 if (rc) {
1181                         if (m != NULL) {
1182                                 sc->wq[def_q]->tx_stats.tx_stops ++;
1183                                 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1184                                 IFQ_DRV_PREPEND(&ifp->if_snd, m);
1185                                 m = NULL;
1186                         }
1187                         break;
1188                 }
1189                 if (m != NULL)
1190                         ETHER_BPF_MTAP(ifp, m);
1191
1192         } while (TRUE);
1193
1194         return;
1195 }
1196
1197
1198 /* Handle the Completion Queue for transmit */
1199 uint16_t
1200 oce_wq_handler(void *arg)
1201 {
1202         struct oce_wq *wq = (struct oce_wq *)arg;
1203         POCE_SOFTC sc = wq->parent;
1204         struct oce_cq *cq = wq->cq;
1205         struct oce_nic_tx_cqe *cqe;
1206         int num_cqes = 0;
1207
1208         bus_dmamap_sync(cq->ring->dma.tag,
1209                         cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1210         cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1211         while (cqe->u0.dw[3]) {
1212                 DW_SWAP((uint32_t *) cqe, sizeof(oce_wq_cqe));
1213
1214                 wq->ring->cidx = cqe->u0.s.wqe_index + 1;
1215                 if (wq->ring->cidx >= wq->ring->num_items)
1216                         wq->ring->cidx -= wq->ring->num_items;
1217
1218                 oce_tx_complete(wq, cqe->u0.s.wqe_index, cqe->u0.s.status);
1219                 wq->tx_stats.tx_compl++;
1220                 cqe->u0.dw[3] = 0;
1221                 RING_GET(cq->ring, 1);
1222                 bus_dmamap_sync(cq->ring->dma.tag,
1223                                 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1224                 cqe =
1225                     RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_tx_cqe);
1226                 num_cqes++;
1227         }
1228
1229         if (num_cqes)
1230                 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1231
1232         return 0;
1233 }
1234
1235
1236 #if __FreeBSD_version >= 1000000
1237 static __inline void
1238 drbr_stats_update(struct ifnet *ifp, int len, int mflags)
1239 {
1240 #ifndef NO_SLOW_STATS
1241         ifp->if_obytes += len;
1242         if (mflags & M_MCAST)
1243                 ifp->if_omcasts++;
1244 #endif
1245 }
1246 #endif
1247
1248 static int 
1249 oce_multiq_transmit(struct ifnet *ifp, struct mbuf *m, struct oce_wq *wq)
1250 {
1251         POCE_SOFTC sc = ifp->if_softc;
1252         int status = 0, queue_index = 0;
1253         struct mbuf *next = NULL;
1254         struct buf_ring *br = NULL;
1255
1256         br  = wq->br;
1257         queue_index = wq->queue_index;
1258
1259         if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
1260                 IFF_DRV_RUNNING) {
1261                 if (m != NULL)
1262                         status = drbr_enqueue(ifp, br, m);
1263                 return status;
1264         }
1265
1266         if (m != NULL) {
1267                 if ((status = drbr_enqueue(ifp, br, m)) != 0)
1268                         return status;
1269         } 
1270         while ((next = drbr_peek(ifp, br)) != NULL) {
1271                 if (oce_tx(sc, &next, queue_index)) {
1272                         if (next == NULL) {
1273                                 drbr_advance(ifp, br);
1274                         } else {
1275                                 drbr_putback(ifp, br, next);
1276                                 wq->tx_stats.tx_stops ++;
1277                                 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
1278                                 status = drbr_enqueue(ifp, br, next);
1279                         }  
1280                         break;
1281                 }
1282                 drbr_advance(ifp, br);
1283                 ifp->if_obytes += next->m_pkthdr.len;
1284                 if (next->m_flags & M_MCAST)
1285                         ifp->if_omcasts++;
1286                 ETHER_BPF_MTAP(ifp, next);
1287         }
1288
1289         return status;
1290 }
1291
1292
1293
1294
1295 /*****************************************************************************
1296  *                          Receive  routines functions                      *
1297  *****************************************************************************/
1298
1299 static void
1300 oce_rx(struct oce_rq *rq, uint32_t rqe_idx, struct oce_nic_rx_cqe *cqe)
1301 {
1302         uint32_t out;
1303         struct oce_packet_desc *pd;
1304         POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1305         int i, len, frag_len;
1306         struct mbuf *m = NULL, *tail = NULL;
1307         uint16_t vtag;
1308
1309         len = cqe->u0.s.pkt_size;
1310         if (!len) {
1311                 /*partial DMA workaround for Lancer*/
1312                 oce_discard_rx_comp(rq, cqe);
1313                 goto exit;
1314         }
1315
1316          /* Get vlan_tag value */
1317         if(IS_BE(sc) || IS_SH(sc))
1318                 vtag = BSWAP_16(cqe->u0.s.vlan_tag);
1319         else
1320                 vtag = cqe->u0.s.vlan_tag;
1321
1322
1323         for (i = 0; i < cqe->u0.s.num_fragments; i++) {
1324
1325                 if (rq->packets_out == rq->packets_in) {
1326                         device_printf(sc->dev,
1327                                   "RQ transmit descriptor missing\n");
1328                 }
1329                 out = rq->packets_out + 1;
1330                 if (out == OCE_RQ_PACKET_ARRAY_SIZE)
1331                         out = 0;
1332                 pd = &rq->pckts[rq->packets_out];
1333                 rq->packets_out = out;
1334
1335                 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1336                 bus_dmamap_unload(rq->tag, pd->map);
1337                 rq->pending--;
1338
1339                 frag_len = (len > rq->cfg.frag_size) ? rq->cfg.frag_size : len;
1340                 pd->mbuf->m_len = frag_len;
1341
1342                 if (tail != NULL) {
1343                         /* additional fragments */
1344                         pd->mbuf->m_flags &= ~M_PKTHDR;
1345                         tail->m_next = pd->mbuf;
1346                         tail = pd->mbuf;
1347                 } else {
1348                         /* first fragment, fill out much of the packet header */
1349                         pd->mbuf->m_pkthdr.len = len;
1350                         pd->mbuf->m_pkthdr.csum_flags = 0;
1351                         if (IF_CSUM_ENABLED(sc)) {
1352                                 if (cqe->u0.s.l4_cksum_pass) {
1353                                         pd->mbuf->m_pkthdr.csum_flags |=
1354                                             (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1355                                         pd->mbuf->m_pkthdr.csum_data = 0xffff;
1356                                 }
1357                                 if (cqe->u0.s.ip_cksum_pass) {
1358                                         if (!cqe->u0.s.ip_ver) { /* IPV4 */
1359                                                 pd->mbuf->m_pkthdr.csum_flags |=
1360                                                 (CSUM_IP_CHECKED|CSUM_IP_VALID);
1361                                         }
1362                                 }
1363                         }
1364                         m = tail = pd->mbuf;
1365                 }
1366                 pd->mbuf = NULL;
1367                 len -= frag_len;
1368         }
1369
1370         if (m) {
1371                 if (!oce_cqe_portid_valid(sc, cqe)) {
1372                          m_freem(m);
1373                          goto exit;
1374                 } 
1375
1376                 m->m_pkthdr.rcvif = sc->ifp;
1377 #if __FreeBSD_version >= 800000
1378                 if (rq->queue_index)
1379                         m->m_pkthdr.flowid = (rq->queue_index - 1);
1380                 else
1381                         m->m_pkthdr.flowid = rq->queue_index;
1382                 m->m_flags |= M_FLOWID;
1383 #endif
1384                 /* This deternies if vlan tag is Valid */
1385                 if (oce_cqe_vtp_valid(sc, cqe)) { 
1386                         if (sc->function_mode & FNM_FLEX10_MODE) {
1387                                 /* FLEX10. If QnQ is not set, neglect VLAN */
1388                                 if (cqe->u0.s.qnq) {
1389                                         m->m_pkthdr.ether_vtag = vtag;
1390                                         m->m_flags |= M_VLANTAG;
1391                                 }
1392                         } else if (sc->pvid != (vtag & VLAN_VID_MASK))  {
1393                                 /* In UMC mode generally pvid will be striped by
1394                                    hw. But in some cases we have seen it comes
1395                                    with pvid. So if pvid == vlan, neglect vlan.
1396                                 */
1397                                 m->m_pkthdr.ether_vtag = vtag;
1398                                 m->m_flags |= M_VLANTAG;
1399                         }
1400                 }
1401
1402                 sc->ifp->if_ipackets++;
1403 #if defined(INET6) || defined(INET)
1404                 /* Try to queue to LRO */
1405                 if (IF_LRO_ENABLED(sc) &&
1406                     (cqe->u0.s.ip_cksum_pass) &&
1407                     (cqe->u0.s.l4_cksum_pass) &&
1408                     (!cqe->u0.s.ip_ver)       &&
1409                     (rq->lro.lro_cnt != 0)) {
1410
1411                         if (tcp_lro_rx(&rq->lro, m, 0) == 0) {
1412                                 rq->lro_pkts_queued ++;         
1413                                 goto post_done;
1414                         }
1415                         /* If LRO posting fails then try to post to STACK */
1416                 }
1417 #endif
1418         
1419                 (*sc->ifp->if_input) (sc->ifp, m);
1420 #if defined(INET6) || defined(INET)
1421 post_done:
1422 #endif
1423                 /* Update rx stats per queue */
1424                 rq->rx_stats.rx_pkts++;
1425                 rq->rx_stats.rx_bytes += cqe->u0.s.pkt_size;
1426                 rq->rx_stats.rx_frags += cqe->u0.s.num_fragments;
1427                 if (cqe->u0.s.pkt_type == OCE_MULTICAST_PACKET)
1428                         rq->rx_stats.rx_mcast_pkts++;
1429                 if (cqe->u0.s.pkt_type == OCE_UNICAST_PACKET)
1430                         rq->rx_stats.rx_ucast_pkts++;
1431         }
1432 exit:
1433         return;
1434 }
1435
1436
1437 static void
1438 oce_discard_rx_comp(struct oce_rq *rq, struct oce_nic_rx_cqe *cqe)
1439 {
1440         uint32_t out, i = 0;
1441         struct oce_packet_desc *pd;
1442         POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1443         int num_frags = cqe->u0.s.num_fragments;
1444
1445         for (i = 0; i < num_frags; i++) {
1446                 if (rq->packets_out == rq->packets_in) {
1447                         device_printf(sc->dev,
1448                                 "RQ transmit descriptor missing\n");
1449                 }
1450                 out = rq->packets_out + 1;
1451                 if (out == OCE_RQ_PACKET_ARRAY_SIZE)
1452                         out = 0;
1453                 pd = &rq->pckts[rq->packets_out];
1454                 rq->packets_out = out;
1455
1456                 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_POSTWRITE);
1457                 bus_dmamap_unload(rq->tag, pd->map);
1458                 rq->pending--;
1459                 m_freem(pd->mbuf);
1460         }
1461
1462 }
1463
1464
1465 static int
1466 oce_cqe_vtp_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1467 {
1468         struct oce_nic_rx_cqe_v1 *cqe_v1;
1469         int vtp = 0;
1470
1471         if (sc->be3_native) {
1472                 cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1473                 vtp =  cqe_v1->u0.s.vlan_tag_present; 
1474         } else
1475                 vtp = cqe->u0.s.vlan_tag_present;
1476         
1477         return vtp;
1478
1479 }
1480
1481
1482 static int
1483 oce_cqe_portid_valid(POCE_SOFTC sc, struct oce_nic_rx_cqe *cqe)
1484 {
1485         struct oce_nic_rx_cqe_v1 *cqe_v1;
1486         int port_id = 0;
1487
1488         if (sc->be3_native && (IS_BE(sc) || IS_SH(sc))) {
1489                 cqe_v1 = (struct oce_nic_rx_cqe_v1 *)cqe;
1490                 port_id =  cqe_v1->u0.s.port;
1491                 if (sc->port_id != port_id)
1492                         return 0;
1493         } else
1494                 ;/* For BE3 legacy and Lancer this is dummy */
1495         
1496         return 1;
1497
1498 }
1499
1500 #if defined(INET6) || defined(INET)
1501 static void
1502 oce_rx_flush_lro(struct oce_rq *rq)
1503 {
1504         struct lro_ctrl *lro = &rq->lro;
1505         struct lro_entry *queued;
1506         POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1507
1508         if (!IF_LRO_ENABLED(sc))
1509                 return;
1510
1511         while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) {
1512                 SLIST_REMOVE_HEAD(&lro->lro_active, next);
1513                 tcp_lro_flush(lro, queued);
1514         }
1515         rq->lro_pkts_queued = 0;
1516         
1517         return;
1518 }
1519
1520
1521 static int
1522 oce_init_lro(POCE_SOFTC sc)
1523 {
1524         struct lro_ctrl *lro = NULL;
1525         int i = 0, rc = 0;
1526
1527         for (i = 0; i < sc->nrqs; i++) { 
1528                 lro = &sc->rq[i]->lro;
1529                 rc = tcp_lro_init(lro);
1530                 if (rc != 0) {
1531                         device_printf(sc->dev, "LRO init failed\n");
1532                         return rc;              
1533                 }
1534                 lro->ifp = sc->ifp;
1535         }
1536
1537         return rc;              
1538 }
1539
1540
1541 void
1542 oce_free_lro(POCE_SOFTC sc)
1543 {
1544         struct lro_ctrl *lro = NULL;
1545         int i = 0;
1546
1547         for (i = 0; i < sc->nrqs; i++) {
1548                 lro = &sc->rq[i]->lro;
1549                 if (lro)
1550                         tcp_lro_free(lro);
1551         }
1552 }
1553 #endif
1554
1555 int
1556 oce_alloc_rx_bufs(struct oce_rq *rq, int count)
1557 {
1558         POCE_SOFTC sc = (POCE_SOFTC) rq->parent;
1559         int i, in, rc;
1560         struct oce_packet_desc *pd;
1561         bus_dma_segment_t segs[6];
1562         int nsegs, added = 0;
1563         struct oce_nic_rqe *rqe;
1564         pd_rxulp_db_t rxdb_reg;
1565
1566         bzero(&rxdb_reg, sizeof(pd_rxulp_db_t));
1567         for (i = 0; i < count; i++) {
1568                 in = rq->packets_in + 1;
1569                 if (in == OCE_RQ_PACKET_ARRAY_SIZE)
1570                         in = 0;
1571                 if (in == rq->packets_out)
1572                         break;  /* no more room */
1573
1574                 pd = &rq->pckts[rq->packets_in];
1575                 pd->mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1576                 if (pd->mbuf == NULL)
1577                         break;
1578
1579                 pd->mbuf->m_len = pd->mbuf->m_pkthdr.len = MCLBYTES;
1580                 rc = bus_dmamap_load_mbuf_sg(rq->tag,
1581                                              pd->map,
1582                                              pd->mbuf,
1583                                              segs, &nsegs, BUS_DMA_NOWAIT);
1584                 if (rc) {
1585                         m_free(pd->mbuf);
1586                         break;
1587                 }
1588
1589                 if (nsegs != 1) {
1590                         i--;
1591                         continue;
1592                 }
1593
1594                 rq->packets_in = in;
1595                 bus_dmamap_sync(rq->tag, pd->map, BUS_DMASYNC_PREREAD);
1596
1597                 rqe = RING_GET_PRODUCER_ITEM_VA(rq->ring, struct oce_nic_rqe);
1598                 rqe->u0.s.frag_pa_hi = ADDR_HI(segs[0].ds_addr);
1599                 rqe->u0.s.frag_pa_lo = ADDR_LO(segs[0].ds_addr);
1600                 DW_SWAP(u32ptr(rqe), sizeof(struct oce_nic_rqe));
1601                 RING_PUT(rq->ring, 1);
1602                 added++;
1603                 rq->pending++;
1604         }
1605         if (added != 0) {
1606                 for (i = added / OCE_MAX_RQ_POSTS; i > 0; i--) {
1607                         rxdb_reg.bits.num_posted = OCE_MAX_RQ_POSTS;
1608                         rxdb_reg.bits.qid = rq->rq_id;
1609                         OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1610                         added -= OCE_MAX_RQ_POSTS;
1611                 }
1612                 if (added > 0) {
1613                         rxdb_reg.bits.qid = rq->rq_id;
1614                         rxdb_reg.bits.num_posted = added;
1615                         OCE_WRITE_REG32(sc, db, PD_RXULP_DB, rxdb_reg.dw0);
1616                 }
1617         }
1618         
1619         return 0;       
1620 }
1621
1622
1623 /* Handle the Completion Queue for receive */
1624 uint16_t
1625 oce_rq_handler(void *arg)
1626 {
1627         struct oce_rq *rq = (struct oce_rq *)arg;
1628         struct oce_cq *cq = rq->cq;
1629         POCE_SOFTC sc = rq->parent;
1630         struct oce_nic_rx_cqe *cqe;
1631         int num_cqes = 0, rq_buffers_used = 0;
1632
1633
1634         bus_dmamap_sync(cq->ring->dma.tag,
1635                         cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1636         cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
1637         while (cqe->u0.dw[2]) {
1638                 DW_SWAP((uint32_t *) cqe, sizeof(oce_rq_cqe));
1639
1640                 RING_GET(rq->ring, 1);
1641                 if (cqe->u0.s.error == 0) {
1642                         oce_rx(rq, cqe->u0.s.frag_index, cqe);
1643                 } else {
1644                         rq->rx_stats.rxcp_err++;
1645                         sc->ifp->if_ierrors++;
1646                         /* Post L3/L4 errors to stack.*/
1647                         oce_rx(rq, cqe->u0.s.frag_index, cqe);
1648                 }
1649                 rq->rx_stats.rx_compl++;
1650                 cqe->u0.dw[2] = 0;
1651
1652 #if defined(INET6) || defined(INET)
1653                 if (IF_LRO_ENABLED(sc) && rq->lro_pkts_queued >= 16) {
1654                         oce_rx_flush_lro(rq);
1655                 }
1656 #endif
1657
1658                 RING_GET(cq->ring, 1);
1659                 bus_dmamap_sync(cq->ring->dma.tag,
1660                                 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
1661                 cqe =
1662                     RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_nic_rx_cqe);
1663                 num_cqes++;
1664                 if (num_cqes >= (IS_XE201(sc) ? 8 : oce_max_rsp_handled))
1665                         break;
1666         }
1667
1668 #if defined(INET6) || defined(INET)
1669         if (IF_LRO_ENABLED(sc))
1670                 oce_rx_flush_lro(rq);
1671 #endif
1672         
1673         if (num_cqes) {
1674                 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
1675                 rq_buffers_used = OCE_RQ_PACKET_ARRAY_SIZE - rq->pending;
1676                 if (rq_buffers_used > 1)
1677                         oce_alloc_rx_bufs(rq, (rq_buffers_used - 1));
1678         }
1679
1680         return 0;
1681
1682 }
1683
1684
1685
1686
1687 /*****************************************************************************
1688  *                 Helper function prototypes in this file                   *
1689  *****************************************************************************/
1690
1691 static int 
1692 oce_attach_ifp(POCE_SOFTC sc)
1693 {
1694
1695         sc->ifp = if_alloc(IFT_ETHER);
1696         if (!sc->ifp)
1697                 return ENOMEM;
1698
1699         ifmedia_init(&sc->media, IFM_IMASK, oce_media_change, oce_media_status);
1700         ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1701         ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
1702
1703         sc->ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST;
1704         sc->ifp->if_ioctl = oce_ioctl;
1705         sc->ifp->if_start = oce_start;
1706         sc->ifp->if_init = oce_init;
1707         sc->ifp->if_mtu = ETHERMTU;
1708         sc->ifp->if_softc = sc;
1709 #if __FreeBSD_version >= 800000
1710         sc->ifp->if_transmit = oce_multiq_start;
1711         sc->ifp->if_qflush = oce_multiq_flush;
1712 #endif
1713
1714         if_initname(sc->ifp,
1715                     device_get_name(sc->dev), device_get_unit(sc->dev));
1716
1717         sc->ifp->if_snd.ifq_drv_maxlen = OCE_MAX_TX_DESC - 1;
1718         IFQ_SET_MAXLEN(&sc->ifp->if_snd, sc->ifp->if_snd.ifq_drv_maxlen);
1719         IFQ_SET_READY(&sc->ifp->if_snd);
1720
1721         sc->ifp->if_hwassist = OCE_IF_HWASSIST;
1722         sc->ifp->if_hwassist |= CSUM_TSO;
1723         sc->ifp->if_hwassist |= (CSUM_IP | CSUM_TCP | CSUM_UDP);
1724
1725         sc->ifp->if_capabilities = OCE_IF_CAPABILITIES;
1726         sc->ifp->if_capabilities |= IFCAP_HWCSUM;
1727         sc->ifp->if_capabilities |= IFCAP_VLAN_HWFILTER;
1728
1729 #if defined(INET6) || defined(INET)
1730         sc->ifp->if_capabilities |= IFCAP_TSO;
1731         sc->ifp->if_capabilities |= IFCAP_LRO;
1732         sc->ifp->if_capabilities |= IFCAP_VLAN_HWTSO;
1733 #endif
1734         
1735         sc->ifp->if_capenable = sc->ifp->if_capabilities;
1736         if_initbaudrate(sc->ifp, IF_Gbps(10));
1737
1738 #if __FreeBSD_version >= 1000000
1739         sc->ifp->if_hw_tsomax = OCE_MAX_TSO_SIZE;
1740 #endif
1741
1742         ether_ifattach(sc->ifp, sc->macaddr.mac_addr);
1743         
1744         return 0;
1745 }
1746
1747
1748 static void
1749 oce_add_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1750 {
1751         POCE_SOFTC sc = ifp->if_softc;
1752
1753         if (ifp->if_softc !=  arg)
1754                 return;
1755         if ((vtag == 0) || (vtag > 4095))
1756                 return;
1757
1758         sc->vlan_tag[vtag] = 1;
1759         sc->vlans_added++;
1760         if (sc->vlans_added <= (sc->max_vlans + 1))
1761                 oce_vid_config(sc);
1762 }
1763
1764
1765 static void
1766 oce_del_vlan(void *arg, struct ifnet *ifp, uint16_t vtag)
1767 {
1768         POCE_SOFTC sc = ifp->if_softc;
1769
1770         if (ifp->if_softc !=  arg)
1771                 return;
1772         if ((vtag == 0) || (vtag > 4095))
1773                 return;
1774
1775         sc->vlan_tag[vtag] = 0;
1776         sc->vlans_added--;
1777         oce_vid_config(sc);
1778 }
1779
1780
1781 /*
1782  * A max of 64 vlans can be configured in BE. If the user configures
1783  * more, place the card in vlan promiscuous mode.
1784  */
1785 static int
1786 oce_vid_config(POCE_SOFTC sc)
1787 {
1788         struct normal_vlan vtags[MAX_VLANFILTER_SIZE];
1789         uint16_t ntags = 0, i;
1790         int status = 0;
1791
1792         if ((sc->vlans_added <= MAX_VLANFILTER_SIZE) && 
1793                         (sc->ifp->if_capenable & IFCAP_VLAN_HWFILTER)) {
1794                 for (i = 0; i < MAX_VLANS; i++) {
1795                         if (sc->vlan_tag[i]) {
1796                                 vtags[ntags].vtag = i;
1797                                 ntags++;
1798                         }
1799                 }
1800                 if (ntags)
1801                         status = oce_config_vlan(sc, (uint8_t) sc->if_id,
1802                                                 vtags, ntags, 1, 0); 
1803         } else 
1804                 status = oce_config_vlan(sc, (uint8_t) sc->if_id,
1805                                                 NULL, 0, 1, 1);
1806         return status;
1807 }
1808
1809
1810 static void
1811 oce_mac_addr_set(POCE_SOFTC sc)
1812 {
1813         uint32_t old_pmac_id = sc->pmac_id;
1814         int status = 0;
1815
1816         
1817         status = bcmp((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
1818                          sc->macaddr.size_of_struct);
1819         if (!status)
1820                 return;
1821
1822         status = oce_mbox_macaddr_add(sc, (uint8_t *)(IF_LLADDR(sc->ifp)),
1823                                         sc->if_id, &sc->pmac_id);
1824         if (!status) {
1825                 status = oce_mbox_macaddr_del(sc, sc->if_id, old_pmac_id);
1826                 bcopy((IF_LLADDR(sc->ifp)), sc->macaddr.mac_addr,
1827                                  sc->macaddr.size_of_struct); 
1828         }
1829         if (status)
1830                 device_printf(sc->dev, "Failed update macaddress\n");
1831
1832 }
1833
1834
1835 static int
1836 oce_handle_passthrough(struct ifnet *ifp, caddr_t data)
1837 {
1838         POCE_SOFTC sc = ifp->if_softc;
1839         struct ifreq *ifr = (struct ifreq *)data;
1840         int rc = ENXIO;
1841         char cookie[32] = {0};
1842         void *priv_data = (void *)ifr->ifr_data;
1843         void *ioctl_ptr;
1844         uint32_t req_size;
1845         struct mbx_hdr req;
1846         OCE_DMA_MEM dma_mem;
1847         struct mbx_common_get_cntl_attr *fw_cmd;
1848
1849         if (copyin(priv_data, cookie, strlen(IOCTL_COOKIE)))
1850                 return EFAULT;
1851
1852         if (memcmp(cookie, IOCTL_COOKIE, strlen(IOCTL_COOKIE)))
1853                 return EINVAL;
1854
1855         ioctl_ptr = (char *)priv_data + strlen(IOCTL_COOKIE);
1856         if (copyin(ioctl_ptr, &req, sizeof(struct mbx_hdr)))
1857                 return EFAULT;
1858
1859         req_size = le32toh(req.u0.req.request_length);
1860         if (req_size > 65536)
1861                 return EINVAL;
1862
1863         req_size += sizeof(struct mbx_hdr);
1864         rc = oce_dma_alloc(sc, req_size, &dma_mem, 0);
1865         if (rc)
1866                 return ENOMEM;
1867
1868         if (copyin(ioctl_ptr, OCE_DMAPTR(&dma_mem,char), req_size)) {
1869                 rc = EFAULT;
1870                 goto dma_free;
1871         }
1872
1873         rc = oce_pass_through_mbox(sc, &dma_mem, req_size);
1874         if (rc) {
1875                 rc = EIO;
1876                 goto dma_free;
1877         }
1878
1879         if (copyout(OCE_DMAPTR(&dma_mem,char), ioctl_ptr, req_size))
1880                 rc =  EFAULT;
1881
1882         /* 
1883            firmware is filling all the attributes for this ioctl except
1884            the driver version..so fill it 
1885          */
1886         if(req.u0.rsp.opcode == OPCODE_COMMON_GET_CNTL_ATTRIBUTES) {
1887                 fw_cmd = (struct mbx_common_get_cntl_attr *) ioctl_ptr;
1888                 strncpy(fw_cmd->params.rsp.cntl_attr_info.hba_attr.drv_ver_str,
1889                         COMPONENT_REVISION, strlen(COMPONENT_REVISION));        
1890         }
1891
1892 dma_free:
1893         oce_dma_free(sc, &dma_mem);
1894         return rc;
1895
1896 }
1897
1898 static void
1899 oce_eqd_set_periodic(POCE_SOFTC sc)
1900 {
1901         struct oce_set_eqd set_eqd[OCE_MAX_EQ];
1902         struct oce_aic_obj *aic;
1903         struct oce_eq *eqo;
1904         uint64_t now = 0, delta;
1905         int eqd, i, num = 0;
1906         uint32_t ips = 0;
1907         int tps;
1908
1909         for (i = 0 ; i < sc->neqs; i++) {
1910                 eqo = sc->eq[i];
1911                 aic = &sc->aic_obj[i];
1912                 /* When setting the static eq delay from the user space */
1913                 if (!aic->enable) {
1914                         eqd = aic->et_eqd;
1915                         goto modify_eqd;
1916                 }
1917
1918                 now = ticks;
1919
1920                 /* Over flow check */
1921                 if ((now < aic->ticks) || (eqo->intr < aic->intr_prev))
1922                         goto done;
1923
1924                 delta = now - aic->ticks;
1925                 tps = delta/hz;
1926
1927                 /* Interrupt rate based on elapsed ticks */
1928                 if(tps)
1929                         ips = (uint32_t)(eqo->intr - aic->intr_prev) / tps;
1930
1931                 if (ips > INTR_RATE_HWM)
1932                         eqd = aic->cur_eqd + 20;
1933                 else if (ips < INTR_RATE_LWM)
1934                         eqd = aic->cur_eqd / 2;
1935                 else
1936                         goto done;
1937
1938                 if (eqd < 10)
1939                         eqd = 0;
1940
1941                 /* Make sure that the eq delay is in the known range */
1942                 eqd = min(eqd, aic->max_eqd);
1943                 eqd = max(eqd, aic->min_eqd);
1944
1945 modify_eqd:
1946                 if (eqd != aic->cur_eqd) {
1947                         set_eqd[num].delay_multiplier = (eqd * 65)/100;
1948                         set_eqd[num].eq_id = eqo->eq_id;
1949                         aic->cur_eqd = eqd;
1950                         num++;
1951                 }
1952 done:
1953                 aic->intr_prev = eqo->intr;
1954                 aic->ticks = now;
1955         }
1956
1957         /* Is there atleast one eq that needs to be modified? */
1958         if(num)
1959                 oce_mbox_eqd_modify_periodic(sc, set_eqd, num);
1960 }
1961
1962 static void oce_detect_hw_error(POCE_SOFTC sc)
1963 {
1964
1965         uint32_t ue_low = 0, ue_high = 0, ue_low_mask = 0, ue_high_mask = 0;
1966         uint32_t sliport_status = 0, sliport_err1 = 0, sliport_err2 = 0;
1967         uint32_t i;
1968
1969         if (sc->hw_error)
1970                 return;
1971
1972         if (IS_XE201(sc)) {
1973                 sliport_status = OCE_READ_REG32(sc, db, SLIPORT_STATUS_OFFSET);
1974                 if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1975                         sliport_err1 = OCE_READ_REG32(sc, db, SLIPORT_ERROR1_OFFSET);
1976                         sliport_err2 = OCE_READ_REG32(sc, db, SLIPORT_ERROR2_OFFSET);
1977                 }
1978         } else {
1979                 ue_low = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW);
1980                 ue_high = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HIGH);
1981                 ue_low_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_LOW_MASK);
1982                 ue_high_mask = OCE_READ_REG32(sc, devcfg, PCICFG_UE_STATUS_HI_MASK);
1983
1984                 ue_low = (ue_low & ~ue_low_mask);
1985                 ue_high = (ue_high & ~ue_high_mask);
1986         }
1987
1988         /* On certain platforms BE hardware can indicate spurious UEs.
1989          * Allow the h/w to stop working completely in case of a real UE.
1990          * Hence not setting the hw_error for UE detection.
1991          */
1992         if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1993                 sc->hw_error = TRUE;
1994                 device_printf(sc->dev, "Error detected in the card\n");
1995         }
1996
1997         if (sliport_status & SLIPORT_STATUS_ERR_MASK) {
1998                 device_printf(sc->dev,
1999                                 "ERR: sliport status 0x%x\n", sliport_status);
2000                 device_printf(sc->dev,
2001                                 "ERR: sliport error1 0x%x\n", sliport_err1);
2002                 device_printf(sc->dev,
2003                                 "ERR: sliport error2 0x%x\n", sliport_err2);
2004         }
2005
2006         if (ue_low) {
2007                 for (i = 0; ue_low; ue_low >>= 1, i++) {
2008                         if (ue_low & 1)
2009                                 device_printf(sc->dev, "UE: %s bit set\n",
2010                                                         ue_status_low_desc[i]);
2011                 }
2012         }
2013
2014         if (ue_high) {
2015                 for (i = 0; ue_high; ue_high >>= 1, i++) {
2016                         if (ue_high & 1)
2017                                 device_printf(sc->dev, "UE: %s bit set\n",
2018                                                         ue_status_hi_desc[i]);
2019                 }
2020         }
2021
2022 }
2023
2024
2025 static void
2026 oce_local_timer(void *arg)
2027 {
2028         POCE_SOFTC sc = arg;
2029         int i = 0;
2030         
2031         oce_detect_hw_error(sc);
2032         oce_refresh_nic_stats(sc);
2033         oce_refresh_queue_stats(sc);
2034         oce_mac_addr_set(sc);
2035         
2036         /* TX Watch Dog*/
2037         for (i = 0; i < sc->nwqs; i++)
2038                 oce_tx_restart(sc, sc->wq[i]);
2039         
2040         /* calculate and set the eq delay for optimal interrupt rate */
2041         if (IS_BE(sc) || IS_SH(sc))
2042                 oce_eqd_set_periodic(sc);
2043
2044         callout_reset(&sc->timer, hz, oce_local_timer, sc);
2045 }
2046
2047
2048 /* NOTE : This should only be called holding
2049  *        DEVICE_LOCK.
2050  */
2051 static void
2052 oce_if_deactivate(POCE_SOFTC sc)
2053 {
2054         int i, mtime = 0;
2055         int wait_req = 0;
2056         struct oce_rq *rq;
2057         struct oce_wq *wq;
2058         struct oce_eq *eq;
2059
2060         sc->ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2061
2062         /*Wait for max of 400ms for TX completions to be done */
2063         while (mtime < 400) {
2064                 wait_req = 0;
2065                 for_all_wq_queues(sc, wq, i) {
2066                         if (wq->ring->num_used) {
2067                                 wait_req = 1;
2068                                 DELAY(1);
2069                                 break;
2070                         }
2071                 }
2072                 mtime += 1;
2073                 if (!wait_req)
2074                         break;
2075         }
2076
2077         /* Stop intrs and finish any bottom halves pending */
2078         oce_hw_intr_disable(sc);
2079
2080         /* Since taskqueue_drain takes a Gaint Lock, We should not acquire
2081            any other lock. So unlock device lock and require after
2082            completing taskqueue_drain.
2083         */
2084         UNLOCK(&sc->dev_lock);
2085         for (i = 0; i < sc->intr_count; i++) {
2086                 if (sc->intrs[i].tq != NULL) {
2087                         taskqueue_drain(sc->intrs[i].tq, &sc->intrs[i].task);
2088                 }
2089         }
2090         LOCK(&sc->dev_lock);
2091
2092         /* Delete RX queue in card with flush param */
2093         oce_stop_rx(sc);
2094
2095         /* Invalidate any pending cq and eq entries*/   
2096         for_all_evnt_queues(sc, eq, i)  
2097                 oce_drain_eq(eq);
2098         for_all_rq_queues(sc, rq, i)
2099                 oce_drain_rq_cq(rq);
2100         for_all_wq_queues(sc, wq, i)
2101                 oce_drain_wq_cq(wq);
2102
2103         /* But still we need to get MCC aync events.
2104            So enable intrs and also arm first EQ
2105         */
2106         oce_hw_intr_enable(sc);
2107         oce_arm_eq(sc, sc->eq[0]->eq_id, 0, TRUE, FALSE);
2108
2109         DELAY(10);
2110 }
2111
2112
2113 static void
2114 oce_if_activate(POCE_SOFTC sc)
2115 {
2116         struct oce_eq *eq;
2117         struct oce_rq *rq;
2118         struct oce_wq *wq;
2119         int i, rc = 0;
2120
2121         sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; 
2122         
2123         oce_hw_intr_disable(sc);
2124         
2125         oce_start_rx(sc);
2126
2127         for_all_rq_queues(sc, rq, i) {
2128                 rc = oce_start_rq(rq);
2129                 if (rc)
2130                         device_printf(sc->dev, "Unable to start RX\n");
2131         }
2132
2133         for_all_wq_queues(sc, wq, i) {
2134                 rc = oce_start_wq(wq);
2135                 if (rc)
2136                         device_printf(sc->dev, "Unable to start TX\n");
2137         }
2138
2139         
2140         for_all_evnt_queues(sc, eq, i)
2141                 oce_arm_eq(sc, eq->eq_id, 0, TRUE, FALSE);
2142
2143         oce_hw_intr_enable(sc);
2144
2145 }
2146
2147 static void
2148 process_link_state(POCE_SOFTC sc, struct oce_async_cqe_link_state *acqe)
2149 {
2150         /* Update Link status */
2151         if ((acqe->u0.s.link_status & ~ASYNC_EVENT_LOGICAL) ==
2152              ASYNC_EVENT_LINK_UP) {
2153                 sc->link_status = ASYNC_EVENT_LINK_UP;
2154                 if_link_state_change(sc->ifp, LINK_STATE_UP);
2155         } else {
2156                 sc->link_status = ASYNC_EVENT_LINK_DOWN;
2157                 if_link_state_change(sc->ifp, LINK_STATE_DOWN);
2158         }
2159 }
2160
2161
2162 /* Handle the Completion Queue for the Mailbox/Async notifications */
2163 uint16_t
2164 oce_mq_handler(void *arg)
2165 {
2166         struct oce_mq *mq = (struct oce_mq *)arg;
2167         POCE_SOFTC sc = mq->parent;
2168         struct oce_cq *cq = mq->cq;
2169         int num_cqes = 0, evt_type = 0, optype = 0;
2170         struct oce_mq_cqe *cqe;
2171         struct oce_async_cqe_link_state *acqe;
2172         struct oce_async_event_grp5_pvid_state *gcqe;
2173         struct oce_async_event_qnq *dbgcqe;
2174
2175
2176         bus_dmamap_sync(cq->ring->dma.tag,
2177                         cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2178         cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2179
2180         while (cqe->u0.dw[3]) {
2181                 DW_SWAP((uint32_t *) cqe, sizeof(oce_mq_cqe));
2182                 if (cqe->u0.s.async_event) {
2183                         evt_type = cqe->u0.s.event_type;
2184                         optype = cqe->u0.s.async_type;
2185                         if (evt_type  == ASYNC_EVENT_CODE_LINK_STATE) {
2186                                 /* Link status evt */
2187                                 acqe = (struct oce_async_cqe_link_state *)cqe;
2188                                 process_link_state(sc, acqe);
2189                         } else if ((evt_type == ASYNC_EVENT_GRP5) &&
2190                                    (optype == ASYNC_EVENT_PVID_STATE)) {
2191                                 /* GRP5 PVID */
2192                                 gcqe = 
2193                                 (struct oce_async_event_grp5_pvid_state *)cqe;
2194                                 if (gcqe->enabled)
2195                                         sc->pvid = gcqe->tag & VLAN_VID_MASK;
2196                                 else
2197                                         sc->pvid = 0;
2198                                 
2199                         }
2200                         else if(evt_type == ASYNC_EVENT_CODE_DEBUG &&
2201                                 optype == ASYNC_EVENT_DEBUG_QNQ) {
2202                                 dbgcqe = 
2203                                 (struct oce_async_event_qnq *)cqe;
2204                                 if(dbgcqe->valid)
2205                                         sc->qnqid = dbgcqe->vlan_tag;
2206                                 sc->qnq_debug_event = TRUE;
2207                         }
2208                 }
2209                 cqe->u0.dw[3] = 0;
2210                 RING_GET(cq->ring, 1);
2211                 bus_dmamap_sync(cq->ring->dma.tag,
2212                                 cq->ring->dma.map, BUS_DMASYNC_POSTWRITE);
2213                 cqe = RING_GET_CONSUMER_ITEM_VA(cq->ring, struct oce_mq_cqe);
2214                 num_cqes++;
2215         }
2216
2217         if (num_cqes)
2218                 oce_arm_cq(sc, cq->cq_id, num_cqes, FALSE);
2219
2220         return 0;
2221 }
2222
2223
2224 static void
2225 setup_max_queues_want(POCE_SOFTC sc)
2226 {
2227         /* Check if it is FLEX machine. Is so dont use RSS */   
2228         if ((sc->function_mode & FNM_FLEX10_MODE) ||
2229             (sc->function_mode & FNM_UMC_MODE)    ||
2230             (sc->function_mode & FNM_VNIC_MODE)   ||
2231             (!is_rss_enabled(sc))                 ||
2232             (sc->flags & OCE_FLAGS_BE2)) {
2233                 sc->nrqs = 1;
2234                 sc->nwqs = 1;
2235         } else {
2236                 sc->nrqs = MIN(OCE_NCPUS, sc->nrssqs) + 1;
2237                 sc->nwqs = MIN(OCE_NCPUS, sc->nrssqs);
2238         }
2239 }
2240
2241
2242 static void
2243 update_queues_got(POCE_SOFTC sc)
2244 {
2245         if (is_rss_enabled(sc)) {
2246                 sc->nrqs = sc->intr_count + 1;
2247                 sc->nwqs = sc->intr_count;
2248         } else {
2249                 sc->nrqs = 1;
2250                 sc->nwqs = 1;
2251         }
2252 }
2253
2254 static int 
2255 oce_check_ipv6_ext_hdr(struct mbuf *m)
2256 {
2257         struct ether_header *eh = mtod(m, struct ether_header *);
2258         caddr_t m_datatemp = m->m_data;
2259
2260         if (eh->ether_type == htons(ETHERTYPE_IPV6)) {
2261                 m->m_data += sizeof(struct ether_header);
2262                 struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
2263
2264                 if((ip6->ip6_nxt != IPPROTO_TCP) && \
2265                                 (ip6->ip6_nxt != IPPROTO_UDP)){
2266                         struct ip6_ext *ip6e = NULL;
2267                         m->m_data += sizeof(struct ip6_hdr);
2268
2269                         ip6e = (struct ip6_ext *) mtod(m, struct ip6_ext *);
2270                         if(ip6e->ip6e_len == 0xff) {
2271                                 m->m_data = m_datatemp;
2272                                 return TRUE;
2273                         }
2274                 } 
2275                 m->m_data = m_datatemp;
2276         }
2277         return FALSE;
2278 }
2279
2280 static int 
2281 is_be3_a1(POCE_SOFTC sc)
2282 {
2283         if((sc->flags & OCE_FLAGS_BE3)  && ((sc->asic_revision & 0xFF) < 2)) {
2284                 return TRUE;
2285         }
2286         return FALSE;
2287 }
2288
2289 static struct mbuf *
2290 oce_insert_vlan_tag(POCE_SOFTC sc, struct mbuf *m, boolean_t *complete)
2291 {
2292         uint16_t vlan_tag = 0;
2293
2294         if(!M_WRITABLE(m))
2295                 return NULL;
2296
2297         /* Embed vlan tag in the packet if it is not part of it */
2298         if(m->m_flags & M_VLANTAG) {
2299                 vlan_tag = EVL_VLANOFTAG(m->m_pkthdr.ether_vtag);
2300                 m->m_flags &= ~M_VLANTAG;
2301         }
2302
2303         /* if UMC, ignore vlan tag insertion and instead insert pvid */
2304         if(sc->pvid) {
2305                 if(!vlan_tag)
2306                         vlan_tag = sc->pvid;
2307                 *complete = FALSE;
2308         }
2309
2310         if(vlan_tag) {
2311                 m = ether_vlanencap(m, vlan_tag);
2312         }
2313
2314         if(sc->qnqid) {
2315                 m = ether_vlanencap(m, sc->qnqid);
2316                 *complete = FALSE;
2317         }
2318         return m;
2319 }
2320
2321 static int 
2322 oce_tx_asic_stall_verify(POCE_SOFTC sc, struct mbuf *m)
2323 {
2324         if(is_be3_a1(sc) && IS_QNQ_OR_UMC(sc) && \
2325                         oce_check_ipv6_ext_hdr(m)) {
2326                 return TRUE;
2327         }
2328         return FALSE;
2329 }
2330
2331 static void
2332 oce_get_config(POCE_SOFTC sc)
2333 {
2334         int rc = 0;
2335         uint32_t max_rss = 0;
2336
2337         if ((IS_BE(sc) || IS_SH(sc)) && (!sc->be3_native))
2338                 max_rss = OCE_LEGACY_MODE_RSS;
2339         else
2340                 max_rss = OCE_MAX_RSS;
2341
2342         if (!IS_BE(sc)) {
2343                 rc = oce_get_profile_config(sc, max_rss);
2344                 if (rc) {
2345                         sc->nwqs = OCE_MAX_WQ;
2346                         sc->nrssqs = max_rss;
2347                         sc->nrqs = sc->nrssqs + 1;
2348                 }
2349         }
2350         else { /* For BE3 don't rely on fw for determining the resources */
2351                 sc->nrssqs = max_rss;
2352                 sc->nrqs = sc->nrssqs + 1;
2353                 sc->nwqs = OCE_MAX_WQ;
2354                 sc->max_vlans = MAX_VLANFILTER_SIZE; 
2355         }
2356 }