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