]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/mana/mana_en.c
p2sb: Remove unused devclass arguments to DRIVER_MODULE.
[FreeBSD/FreeBSD.git] / sys / dev / mana / mana_en.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2021 Microsoft Corp.
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
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/bus.h>
36 #include <sys/kernel.h>
37 #include <sys/kthread.h>
38 #include <sys/malloc.h>
39 #include <sys/mbuf.h>
40 #include <sys/smp.h>
41 #include <sys/socket.h>
42 #include <sys/sockio.h>
43 #include <sys/time.h>
44 #include <sys/eventhandler.h>
45
46 #include <machine/bus.h>
47 #include <machine/resource.h>
48 #include <machine/in_cksum.h>
49
50 #include <net/if.h>
51 #include <net/if_var.h>
52 #include <net/if_types.h>
53 #include <net/if_vlan_var.h>
54 #ifdef RSS
55 #include <net/rss_config.h>
56 #endif
57
58 #include <netinet/in_systm.h>
59 #include <netinet/in.h>
60 #include <netinet/if_ether.h>
61 #include <netinet/ip.h>
62 #include <netinet/ip6.h>
63 #include <netinet/tcp.h>
64 #include <netinet/udp.h>
65
66 #include "mana.h"
67 #include "mana_sysctl.h"
68
69 static int mana_up(struct mana_port_context *apc);
70 static int mana_down(struct mana_port_context *apc);
71
72 static void
73 mana_rss_key_fill(void *k, size_t size)
74 {
75         static bool rss_key_generated = false;
76         static uint8_t rss_key[MANA_HASH_KEY_SIZE];
77
78         KASSERT(size <= MANA_HASH_KEY_SIZE,
79             ("Request more buytes than MANA RSS key can hold"));
80
81         if (!rss_key_generated) {
82                 arc4random_buf(rss_key, MANA_HASH_KEY_SIZE);
83                 rss_key_generated = true;
84         }
85         memcpy(k, rss_key, size);
86 }
87
88 static int
89 mana_ifmedia_change(struct ifnet *ifp __unused)
90 {
91         return EOPNOTSUPP;
92 }
93
94 static void
95 mana_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
96 {
97         struct mana_port_context *apc = if_getsoftc(ifp);
98
99         if (!apc) {
100                 if_printf(ifp, "Port not available\n");
101                 return;
102         }
103
104         MANA_APC_LOCK_LOCK(apc);
105
106         ifmr->ifm_status = IFM_AVALID;
107         ifmr->ifm_active = IFM_ETHER;
108
109         if (!apc->port_is_up) {
110                 MANA_APC_LOCK_UNLOCK(apc);
111                 mana_dbg(NULL, "Port %u link is down\n", apc->port_idx);
112                 return;
113         }
114
115         ifmr->ifm_status |= IFM_ACTIVE;
116         ifmr->ifm_active |= IFM_100G_DR | IFM_FDX;
117
118         MANA_APC_LOCK_UNLOCK(apc);
119 }
120
121 static uint64_t
122 mana_get_counter(struct ifnet *ifp, ift_counter cnt)
123 {
124         struct mana_port_context *apc = if_getsoftc(ifp);
125         struct mana_port_stats *stats = &apc->port_stats;
126
127         switch (cnt) {
128         case IFCOUNTER_IPACKETS:
129                 return (counter_u64_fetch(stats->rx_packets));
130         case IFCOUNTER_OPACKETS:
131                 return (counter_u64_fetch(stats->tx_packets));
132         case IFCOUNTER_IBYTES:
133                 return (counter_u64_fetch(stats->rx_bytes));
134         case IFCOUNTER_OBYTES:
135                 return (counter_u64_fetch(stats->tx_bytes));
136         case IFCOUNTER_IQDROPS:
137                 return (counter_u64_fetch(stats->rx_drops));
138         case IFCOUNTER_OQDROPS:
139                 return (counter_u64_fetch(stats->tx_drops));
140         default:
141                 return (if_get_counter_default(ifp, cnt));
142         }
143 }
144
145 static void
146 mana_qflush(struct ifnet *ifp)
147 {
148         if_qflush(ifp);
149 }
150
151 int
152 mana_restart(struct mana_port_context *apc)
153 {
154         int rc = 0;
155
156         MANA_APC_LOCK_LOCK(apc);
157         if (apc->port_is_up)
158                  mana_down(apc);
159
160         rc = mana_up(apc);
161         MANA_APC_LOCK_UNLOCK(apc);
162
163         return (rc);
164 }
165
166 static int
167 mana_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
168 {
169         struct mana_port_context *apc = if_getsoftc(ifp);
170         struct ifrsskey *ifrk;
171         struct ifrsshash *ifrh;
172         struct ifreq *ifr;
173         uint16_t new_mtu;
174         int rc = 0;
175
176         switch (command) {
177         case SIOCSIFMTU:
178                 ifr = (struct ifreq *)data;
179                 new_mtu = ifr->ifr_mtu;
180                 if (ifp->if_mtu == new_mtu)
181                         break;
182                 if ((new_mtu + 18 > MAX_FRAME_SIZE) ||
183                     (new_mtu + 18 < MIN_FRAME_SIZE)) {
184                         if_printf(ifp, "Invalid MTU. new_mtu: %d, "
185                             "max allowed: %d, min allowed: %d\n",
186                             new_mtu, MAX_FRAME_SIZE - 18, MIN_FRAME_SIZE - 18);
187                         return EINVAL;
188                 }
189                 MANA_APC_LOCK_LOCK(apc);
190                 if (apc->port_is_up)
191                         mana_down(apc);
192
193                 apc->frame_size = new_mtu + 18;
194                 if_setmtu(ifp, new_mtu);
195                 mana_dbg(NULL, "Set MTU to %d\n", new_mtu);
196
197                 rc = mana_up(apc);
198                 MANA_APC_LOCK_UNLOCK(apc);
199                 break;
200
201         case SIOCSIFFLAGS:
202                 if (ifp->if_flags & IFF_UP) {
203                         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
204                                 MANA_APC_LOCK_LOCK(apc);
205                                 if (!apc->port_is_up)
206                                         rc = mana_up(apc);
207                                 MANA_APC_LOCK_UNLOCK(apc);
208                         }
209                 } else {
210                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
211                                 MANA_APC_LOCK_LOCK(apc);
212                                 if (apc->port_is_up)
213                                         mana_down(apc);
214                                 MANA_APC_LOCK_UNLOCK(apc);
215                         }
216                 }
217                 break;
218
219         case SIOCSIFMEDIA:
220         case SIOCGIFMEDIA:
221         case SIOCGIFXMEDIA:
222                 ifr = (struct ifreq *)data;
223                 rc = ifmedia_ioctl(ifp, ifr, &apc->media, command);
224                 break;
225
226         case SIOCGIFRSSKEY:
227                 ifrk = (struct ifrsskey *)data;
228                 ifrk->ifrk_func = RSS_FUNC_TOEPLITZ;
229                 ifrk->ifrk_keylen = MANA_HASH_KEY_SIZE;
230                 memcpy(ifrk->ifrk_key, apc->hashkey, MANA_HASH_KEY_SIZE);
231                 break;
232
233         case SIOCGIFRSSHASH:
234                 ifrh = (struct ifrsshash *)data;
235                 ifrh->ifrh_func = RSS_FUNC_TOEPLITZ;
236                 ifrh->ifrh_types =
237                     RSS_TYPE_TCP_IPV4 |
238                     RSS_TYPE_UDP_IPV4 |
239                     RSS_TYPE_TCP_IPV6 |
240                     RSS_TYPE_UDP_IPV6;
241                 break;
242
243         default:
244                 rc = ether_ioctl(ifp, command, data);
245                 break;
246         }
247
248         return (rc);
249 }
250
251 static inline void
252 mana_alloc_counters(counter_u64_t *begin, int size)
253 {
254         counter_u64_t *end = (counter_u64_t *)((char *)begin + size);
255
256         for (; begin < end; ++begin)
257                 *begin = counter_u64_alloc(M_WAITOK);
258 }
259
260 static inline void
261 mana_free_counters(counter_u64_t *begin, int size)
262 {
263         counter_u64_t *end = (counter_u64_t *)((char *)begin + size);
264
265         for (; begin < end; ++begin)
266                 counter_u64_free(*begin);
267 }
268
269 static bool
270 mana_can_tx(struct gdma_queue *wq)
271 {
272         return mana_gd_wq_avail_space(wq) >= MAX_TX_WQE_SIZE;
273 }
274
275 static inline int
276 mana_tx_map_mbuf(struct mana_port_context *apc,
277     struct mana_send_buf_info *tx_info,
278     struct mbuf **m_head, struct mana_tx_package *tp,
279     struct mana_stats *tx_stats)
280 {
281         struct gdma_dev *gd = apc->ac->gdma_dev;
282         bus_dma_segment_t segs[MAX_MBUF_FRAGS];
283         struct mbuf *m = *m_head;
284         int err, nsegs, i;
285
286         err = bus_dmamap_load_mbuf_sg(apc->tx_buf_tag, tx_info->dma_map,
287             m, segs, &nsegs, BUS_DMA_NOWAIT);
288         if (err == EFBIG) {
289                 struct mbuf *m_new;
290
291                 counter_u64_add(tx_stats->collapse, 1);
292                 m_new = m_collapse(m, M_NOWAIT, MAX_MBUF_FRAGS);
293                 if (unlikely(m_new == NULL)) {
294                         counter_u64_add(tx_stats->collapse_err, 1);
295                         return ENOBUFS;
296                 } else {
297                         *m_head = m = m_new;
298                 }
299
300                 mana_warn(NULL,
301                     "Too many segs in orig mbuf, m_collapse called\n");
302
303                 err = bus_dmamap_load_mbuf_sg(apc->tx_buf_tag,
304                     tx_info->dma_map, m, segs, &nsegs, BUS_DMA_NOWAIT);
305         }
306         if (!err) {
307                 for (i = 0; i < nsegs; i++) {
308                         tp->wqe_req.sgl[i].address = segs[i].ds_addr;
309                         tp->wqe_req.sgl[i].mem_key = gd->gpa_mkey;
310                         tp->wqe_req.sgl[i].size = segs[i].ds_len;
311                 }
312                 tp->wqe_req.num_sge = nsegs;
313
314                 tx_info->mbuf = *m_head;
315
316                 bus_dmamap_sync(apc->tx_buf_tag, tx_info->dma_map,
317                     BUS_DMASYNC_PREWRITE);
318         }
319
320         return err;
321 }
322
323 static inline void
324 mana_tx_unmap_mbuf(struct mana_port_context *apc,
325     struct mana_send_buf_info *tx_info)
326 {
327         bus_dmamap_sync(apc->tx_buf_tag, tx_info->dma_map,
328             BUS_DMASYNC_POSTWRITE);
329         bus_dmamap_unload(apc->tx_buf_tag, tx_info->dma_map);
330         if (tx_info->mbuf) {
331                 m_freem(tx_info->mbuf);
332                 tx_info->mbuf = NULL;
333         }
334 }
335
336 static inline int
337 mana_load_rx_mbuf(struct mana_port_context *apc, struct mana_rxq *rxq,
338     struct mana_recv_buf_oob *rx_oob, bool alloc_mbuf)
339 {
340         bus_dma_segment_t segs[1];
341         struct mbuf *mbuf;
342         int nsegs, err;
343         uint32_t mlen;
344
345         if (alloc_mbuf) {
346                 mbuf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, rxq->datasize);
347                 if (unlikely(mbuf == NULL)) {
348                         mbuf = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
349                         if (unlikely(mbuf == NULL)) {
350                                 return ENOMEM;
351                         }
352                         mlen = MCLBYTES;
353                 } else {
354                         mlen = rxq->datasize;
355                 }
356
357                 mbuf->m_pkthdr.len = mbuf->m_len = mlen;
358         } else {
359                 if (rx_oob->mbuf) {
360                         mbuf = rx_oob->mbuf;
361                         mlen = rx_oob->mbuf->m_pkthdr.len;
362                 } else {
363                         return ENOMEM;
364                 }
365         }
366
367         err = bus_dmamap_load_mbuf_sg(apc->rx_buf_tag, rx_oob->dma_map,
368             mbuf, segs, &nsegs, BUS_DMA_NOWAIT);
369
370         if (unlikely((err != 0) || (nsegs != 1))) {
371                 mana_warn(NULL, "Failed to map mbuf, error: %d, "
372                     "nsegs: %d\n", err, nsegs);
373                 counter_u64_add(rxq->stats.dma_mapping_err, 1);
374                 goto error;
375         }
376
377         bus_dmamap_sync(apc->rx_buf_tag, rx_oob->dma_map,
378             BUS_DMASYNC_PREREAD);
379
380         rx_oob->mbuf = mbuf;
381         rx_oob->num_sge = 1;
382         rx_oob->sgl[0].address = segs[0].ds_addr;
383         rx_oob->sgl[0].size = mlen;
384         rx_oob->sgl[0].mem_key = apc->ac->gdma_dev->gpa_mkey;
385
386         return 0;
387
388 error:
389         m_freem(mbuf);
390         return EFAULT;
391 }
392
393 static inline void
394 mana_unload_rx_mbuf(struct mana_port_context *apc, struct mana_rxq *rxq,
395     struct mana_recv_buf_oob *rx_oob, bool free_mbuf)
396 {
397         bus_dmamap_sync(apc->rx_buf_tag, rx_oob->dma_map,
398             BUS_DMASYNC_POSTREAD);
399         bus_dmamap_unload(apc->rx_buf_tag, rx_oob->dma_map);
400
401         if (free_mbuf && rx_oob->mbuf) {
402                 m_freem(rx_oob->mbuf);
403                 rx_oob->mbuf = NULL;
404         }
405 }
406
407
408 /* Use couple mbuf PH_loc spaces for l3 and l4 protocal type */
409 #define MANA_L3_PROTO(_mbuf)    ((_mbuf)->m_pkthdr.PH_loc.sixteen[0])
410 #define MANA_L4_PROTO(_mbuf)    ((_mbuf)->m_pkthdr.PH_loc.sixteen[1])
411
412 #define MANA_TXQ_FULL   (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)
413
414 static void
415 mana_xmit(struct mana_txq *txq)
416 {
417         enum mana_tx_pkt_format pkt_fmt = MANA_SHORT_PKT_FMT;
418         struct mana_send_buf_info *tx_info;
419         struct ifnet *ndev = txq->ndev;
420         struct mbuf *mbuf;
421         struct mana_port_context *apc = if_getsoftc(ndev);
422         struct mana_port_stats *port_stats = &apc->port_stats;
423         struct gdma_dev *gd = apc->ac->gdma_dev;
424         uint64_t packets, bytes;
425         uint16_t next_to_use;
426         struct mana_tx_package pkg = {};
427         struct mana_stats *tx_stats;
428         struct gdma_queue *gdma_sq;
429         struct mana_cq *cq;
430         int err, len;
431
432         gdma_sq = txq->gdma_sq;
433         cq = &apc->tx_qp[txq->idx].tx_cq;
434         tx_stats = &txq->stats;
435
436         packets = 0;
437         bytes = 0;
438         next_to_use = txq->next_to_use;
439
440         while ((mbuf = drbr_peek(ndev, txq->txq_br)) != NULL) {
441                 if (!apc->port_is_up ||
442                     (if_getdrvflags(ndev) & MANA_TXQ_FULL) != IFF_DRV_RUNNING) {
443                         drbr_putback(ndev, txq->txq_br, mbuf);
444                         break;
445                 }
446
447                 if (!mana_can_tx(gdma_sq)) {
448                         /* SQ is full. Set the IFF_DRV_OACTIVE flag */
449                         if_setdrvflagbits(apc->ndev, IFF_DRV_OACTIVE, 0);
450                         counter_u64_add(tx_stats->stop, 1);
451                         uint64_t stops = counter_u64_fetch(tx_stats->stop);
452                         uint64_t wakeups = counter_u64_fetch(tx_stats->wakeup);
453 #define MANA_TXQ_STOP_THRESHOLD         50
454                         if (stops > MANA_TXQ_STOP_THRESHOLD && wakeups > 0 &&
455                             stops > wakeups && txq->alt_txq_idx == txq->idx) {
456                                 txq->alt_txq_idx =
457                                     (txq->idx + (stops / wakeups))
458                                     % apc->num_queues;
459                                 counter_u64_add(tx_stats->alt_chg, 1);
460                         }
461
462                         drbr_putback(ndev, txq->txq_br, mbuf);
463
464                         taskqueue_enqueue(cq->cleanup_tq, &cq->cleanup_task);
465                         break;
466                 }
467
468                 tx_info = &txq->tx_buf_info[next_to_use];
469
470                 memset(&pkg, 0, sizeof(struct mana_tx_package));
471                 pkg.wqe_req.sgl = pkg.sgl_array;
472
473                 err = mana_tx_map_mbuf(apc, tx_info, &mbuf, &pkg, tx_stats);
474                 if (unlikely(err)) {
475                         mana_dbg(NULL,
476                             "Failed to map tx mbuf, err %d\n", err);
477
478                         counter_u64_add(tx_stats->dma_mapping_err, 1);
479
480                         /* The mbuf is still there. Free it */
481                         m_freem(mbuf);
482                         /* Advance the drbr queue */
483                         drbr_advance(ndev, txq->txq_br);
484                         continue;
485                 }
486
487                 pkg.tx_oob.s_oob.vcq_num = cq->gdma_id;
488                 pkg.tx_oob.s_oob.vsq_frame = txq->vsq_frame;
489
490                 if (txq->vp_offset > MANA_SHORT_VPORT_OFFSET_MAX) {
491                         pkg.tx_oob.l_oob.long_vp_offset = txq->vp_offset;
492                         pkt_fmt = MANA_LONG_PKT_FMT;
493                 } else {
494                         pkg.tx_oob.s_oob.short_vp_offset = txq->vp_offset;
495                 }
496
497                 pkg.tx_oob.s_oob.pkt_fmt = pkt_fmt;
498
499                 if (pkt_fmt == MANA_SHORT_PKT_FMT)
500                         pkg.wqe_req.inline_oob_size = sizeof(struct mana_tx_short_oob);
501                 else
502                         pkg.wqe_req.inline_oob_size = sizeof(struct mana_tx_oob);
503
504                 pkg.wqe_req.inline_oob_data = &pkg.tx_oob;
505                 pkg.wqe_req.flags = 0;
506                 pkg.wqe_req.client_data_unit = 0;
507
508                 if (mbuf->m_pkthdr.csum_flags & CSUM_TSO) {
509                         if (MANA_L3_PROTO(mbuf) == ETHERTYPE_IP)
510                                 pkg.tx_oob.s_oob.is_outer_ipv4 = 1;
511                         else
512                                 pkg.tx_oob.s_oob.is_outer_ipv6 = 1;
513
514                         pkg.tx_oob.s_oob.comp_iphdr_csum = 1;
515                         pkg.tx_oob.s_oob.comp_tcp_csum = 1;
516                         pkg.tx_oob.s_oob.trans_off = mbuf->m_pkthdr.l3hlen;
517
518                         pkg.wqe_req.client_data_unit = mbuf->m_pkthdr.tso_segsz;
519                         pkg.wqe_req.flags = GDMA_WR_OOB_IN_SGL | GDMA_WR_PAD_BY_SGE0;
520                 } else if (mbuf->m_pkthdr.csum_flags &
521                     (CSUM_IP_UDP | CSUM_IP_TCP | CSUM_IP6_UDP | CSUM_IP6_TCP)) {
522                         if (MANA_L3_PROTO(mbuf) == ETHERTYPE_IP) {
523                                 pkg.tx_oob.s_oob.is_outer_ipv4 = 1;
524                                 pkg.tx_oob.s_oob.comp_iphdr_csum = 1;
525                         } else {
526                                 pkg.tx_oob.s_oob.is_outer_ipv6 = 1;
527                         }
528
529                         if (MANA_L4_PROTO(mbuf) == IPPROTO_TCP) {
530                                 pkg.tx_oob.s_oob.comp_tcp_csum = 1;
531                                 pkg.tx_oob.s_oob.trans_off =
532                                     mbuf->m_pkthdr.l3hlen;
533                         } else {
534                                 pkg.tx_oob.s_oob.comp_udp_csum = 1;
535                         }
536                 } else if (mbuf->m_pkthdr.csum_flags & CSUM_IP) {
537                         pkg.tx_oob.s_oob.is_outer_ipv4 = 1;
538                         pkg.tx_oob.s_oob.comp_iphdr_csum = 1;
539                 } else {
540                         if (MANA_L3_PROTO(mbuf) == ETHERTYPE_IP)
541                                 pkg.tx_oob.s_oob.is_outer_ipv4 = 1;
542                         else if (MANA_L3_PROTO(mbuf) == ETHERTYPE_IPV6)
543                                 pkg.tx_oob.s_oob.is_outer_ipv6 = 1;
544                 }
545
546                 len = mbuf->m_pkthdr.len;
547
548                 err = mana_gd_post_work_request(gdma_sq, &pkg.wqe_req,
549                     (struct gdma_posted_wqe_info *)&tx_info->wqe_inf);
550                 if (unlikely(err)) {
551                         /* Should not happen */
552                         if_printf(ndev, "Failed to post TX OOB: %d\n", err);
553
554                         mana_tx_unmap_mbuf(apc, tx_info);
555
556                         drbr_advance(ndev, txq->txq_br);
557                         continue;
558                 }
559
560                 next_to_use =
561                     (next_to_use + 1) % MAX_SEND_BUFFERS_PER_QUEUE;
562
563                 (void)atomic_inc_return(&txq->pending_sends);
564
565                 drbr_advance(ndev, txq->txq_br);
566
567                 mana_gd_wq_ring_doorbell(gd->gdma_context, gdma_sq);
568
569                 packets++;
570                 bytes += len;
571         }
572
573         counter_enter();
574         counter_u64_add_protected(tx_stats->packets, packets);
575         counter_u64_add_protected(port_stats->tx_packets, packets);
576         counter_u64_add_protected(tx_stats->bytes, bytes);
577         counter_u64_add_protected(port_stats->tx_bytes, bytes);
578         counter_exit();
579
580         txq->next_to_use = next_to_use;
581 }
582
583 static void
584 mana_xmit_taskfunc(void *arg, int pending)
585 {
586         struct mana_txq *txq = (struct mana_txq *)arg;
587         struct ifnet *ndev = txq->ndev;
588         struct mana_port_context *apc = if_getsoftc(ndev);
589
590         while (!drbr_empty(ndev, txq->txq_br) && apc->port_is_up &&
591             (if_getdrvflags(ndev) & MANA_TXQ_FULL) == IFF_DRV_RUNNING) {
592                 mtx_lock(&txq->txq_mtx);
593                 mana_xmit(txq);
594                 mtx_unlock(&txq->txq_mtx);
595         }
596 }
597
598 #define PULLUP_HDR(m, len)                              \
599 do {                                                    \
600         if (unlikely((m)->m_len < (len))) {             \
601                 (m) = m_pullup((m), (len));             \
602                 if ((m) == NULL)                        \
603                         return (NULL);                  \
604         }                                               \
605 } while (0)
606
607 /*
608  * If this function failed, the mbuf would be freed.
609  */
610 static inline struct mbuf *
611 mana_tso_fixup(struct mbuf *mbuf)
612 {
613         struct ether_vlan_header *eh = mtod(mbuf, struct ether_vlan_header *);
614         struct tcphdr *th;
615         uint16_t etype;
616         int ehlen;
617
618         if (eh->evl_encap_proto == ntohs(ETHERTYPE_VLAN)) {
619                 etype = ntohs(eh->evl_proto);
620                 ehlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
621         } else {
622                 etype = ntohs(eh->evl_encap_proto);
623                 ehlen = ETHER_HDR_LEN;
624         }
625
626         if (etype == ETHERTYPE_IP) {
627                 struct ip *ip;
628                 int iphlen;
629
630                 PULLUP_HDR(mbuf, ehlen + sizeof(*ip));
631                 ip = mtodo(mbuf, ehlen);
632                 iphlen = ip->ip_hl << 2;
633                 mbuf->m_pkthdr.l3hlen = ehlen + iphlen;
634
635                 PULLUP_HDR(mbuf, ehlen + iphlen + sizeof(*th));
636                 th = mtodo(mbuf, ehlen + iphlen);
637
638                 ip->ip_len = 0;
639                 ip->ip_sum = 0;
640                 th->th_sum = in_pseudo(ip->ip_src.s_addr,
641                     ip->ip_dst.s_addr, htons(IPPROTO_TCP));
642         } else if (etype == ETHERTYPE_IPV6) {
643                 struct ip6_hdr *ip6;
644
645                 PULLUP_HDR(mbuf, ehlen + sizeof(*ip6) + sizeof(*th));
646                 ip6 = mtodo(mbuf, ehlen);
647                 if (ip6->ip6_nxt != IPPROTO_TCP) {
648                         /* Realy something wrong, just return */
649                         mana_dbg(NULL, "TSO mbuf not TCP, freed.\n");
650                         m_freem(mbuf);
651                         return NULL;
652                 }
653                 mbuf->m_pkthdr.l3hlen = ehlen + sizeof(*ip6);
654
655                 th = mtodo(mbuf, ehlen + sizeof(*ip6));
656
657                 ip6->ip6_plen = 0;
658                 th->th_sum = in6_cksum_pseudo(ip6, 0, IPPROTO_TCP, 0);
659         } else {
660                 /* CSUM_TSO is set but not IP protocol. */
661                 mana_warn(NULL, "TSO mbuf not right, freed.\n");
662                 m_freem(mbuf);
663                 return NULL;
664         }
665
666         MANA_L3_PROTO(mbuf) = etype;
667
668         return (mbuf);
669 }
670
671 /*
672  * If this function failed, the mbuf would be freed.
673  */
674 static inline struct mbuf *
675 mana_mbuf_csum_check(struct mbuf *mbuf)
676 {
677         struct ether_vlan_header *eh = mtod(mbuf, struct ether_vlan_header *);
678         struct mbuf *mbuf_next;
679         uint16_t etype;
680         int offset;
681         int ehlen;
682
683         if (eh->evl_encap_proto == ntohs(ETHERTYPE_VLAN)) {
684                 etype = ntohs(eh->evl_proto);
685                 ehlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
686         } else {
687                 etype = ntohs(eh->evl_encap_proto);
688                 ehlen = ETHER_HDR_LEN;
689         }
690
691         mbuf_next = m_getptr(mbuf, ehlen, &offset);
692
693         MANA_L4_PROTO(mbuf) = 0;
694         if (etype == ETHERTYPE_IP) {
695                 const struct ip *ip;
696                 int iphlen;
697
698                 ip = (struct ip *)(mtodo(mbuf_next, offset));
699                 iphlen = ip->ip_hl << 2;
700                 mbuf->m_pkthdr.l3hlen = ehlen + iphlen;
701
702                 MANA_L4_PROTO(mbuf) = ip->ip_p;
703         } else if (etype == ETHERTYPE_IPV6) {
704                 const struct ip6_hdr *ip6;
705
706                 ip6 = (struct ip6_hdr *)(mtodo(mbuf_next, offset));
707                 mbuf->m_pkthdr.l3hlen = ehlen + sizeof(*ip6);
708
709                 MANA_L4_PROTO(mbuf) = ip6->ip6_nxt;
710         } else {
711                 MANA_L4_PROTO(mbuf) = 0;
712         }
713
714         MANA_L3_PROTO(mbuf) = etype;
715
716         return (mbuf);
717 }
718
719 static int
720 mana_start_xmit(struct ifnet *ifp, struct mbuf *m)
721 {
722         struct mana_port_context *apc = if_getsoftc(ifp);
723         struct mana_txq *txq;
724         int is_drbr_empty;
725         uint16_t txq_id;
726         int err;
727
728         if (unlikely((!apc->port_is_up) ||
729             (if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0))
730                 return ENODEV;
731
732         if (m->m_pkthdr.csum_flags & CSUM_TSO) {
733                 m = mana_tso_fixup(m);
734                 if (unlikely(m == NULL)) {
735                         counter_enter();
736                         counter_u64_add_protected(apc->port_stats.tx_drops, 1);
737                         counter_exit();
738                         return EIO;
739                 }
740         } else {
741                 m = mana_mbuf_csum_check(m);
742                 if (unlikely(m == NULL)) {
743                         counter_enter();
744                         counter_u64_add_protected(apc->port_stats.tx_drops, 1);
745                         counter_exit();
746                         return EIO;
747                 }
748         }
749
750         if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
751                 uint32_t hash = m->m_pkthdr.flowid;
752                 txq_id = apc->indir_table[(hash) & MANA_INDIRECT_TABLE_MASK] %
753                     apc->num_queues;
754         } else {
755                 txq_id = m->m_pkthdr.flowid % apc->num_queues;
756         }
757
758         if (apc->enable_tx_altq)
759                 txq_id = apc->tx_qp[txq_id].txq.alt_txq_idx;
760
761         txq = &apc->tx_qp[txq_id].txq;
762
763         is_drbr_empty = drbr_empty(ifp, txq->txq_br);
764         err = drbr_enqueue(ifp, txq->txq_br, m);
765         if (unlikely(err)) {
766                 mana_warn(NULL, "txq %u failed to enqueue: %d\n",
767                     txq_id, err);
768                 taskqueue_enqueue(txq->enqueue_tq, &txq->enqueue_task);
769                 return err;
770         }
771
772         if (is_drbr_empty && mtx_trylock(&txq->txq_mtx)) {
773                 mana_xmit(txq);
774                 mtx_unlock(&txq->txq_mtx);
775         } else {
776                 taskqueue_enqueue(txq->enqueue_tq, &txq->enqueue_task);
777         }
778
779         return 0;
780 }
781
782 static void
783 mana_cleanup_port_context(struct mana_port_context *apc)
784 {
785         bus_dma_tag_destroy(apc->tx_buf_tag);
786         bus_dma_tag_destroy(apc->rx_buf_tag);
787         apc->rx_buf_tag = NULL;
788
789         free(apc->rxqs, M_DEVBUF);
790         apc->rxqs = NULL;
791
792         mana_free_counters((counter_u64_t *)&apc->port_stats,
793             sizeof(struct mana_port_stats));
794 }
795
796 static int
797 mana_init_port_context(struct mana_port_context *apc)
798 {
799         device_t dev = apc->ac->gdma_dev->gdma_context->dev;
800         uint32_t tso_maxsize;
801         int err;
802
803         tso_maxsize = MAX_MBUF_FRAGS * MANA_TSO_MAXSEG_SZ -
804             (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
805
806         /* Create DMA tag for tx bufs */
807         err = bus_dma_tag_create(bus_get_dma_tag(dev),  /* parent */
808             1, 0,                       /* alignment, boundary  */
809             BUS_SPACE_MAXADDR,          /* lowaddr              */
810             BUS_SPACE_MAXADDR,          /* highaddr             */
811             NULL, NULL,                 /* filter, filterarg    */
812             tso_maxsize,                /* maxsize              */
813             MAX_MBUF_FRAGS,             /* nsegments            */
814             tso_maxsize,                /* maxsegsize           */
815             0,                          /* flags                */
816             NULL, NULL,                 /* lockfunc, lockfuncarg*/
817             &apc->tx_buf_tag);
818         if (unlikely(err)) {
819                 device_printf(dev, "Feiled to create TX DMA tag\n");
820                 return err;
821         }
822
823         /* Create DMA tag for rx bufs */
824         err = bus_dma_tag_create(bus_get_dma_tag(dev),  /* parent */
825             64, 0,                      /* alignment, boundary  */
826             BUS_SPACE_MAXADDR,          /* lowaddr              */
827             BUS_SPACE_MAXADDR,          /* highaddr             */
828             NULL, NULL,                 /* filter, filterarg    */
829             MJUMPAGESIZE,               /* maxsize              */
830             1,                          /* nsegments            */
831             MJUMPAGESIZE,               /* maxsegsize           */
832             0,                          /* flags                */
833             NULL, NULL,                 /* lockfunc, lockfuncarg*/
834             &apc->rx_buf_tag);
835         if (unlikely(err)) {
836                 device_printf(dev, "Feiled to create RX DMA tag\n");
837                 return err;
838         }
839
840         apc->rxqs = mallocarray(apc->num_queues, sizeof(struct mana_rxq *),
841             M_DEVBUF, M_WAITOK | M_ZERO);
842
843         if (!apc->rxqs) {
844                 bus_dma_tag_destroy(apc->tx_buf_tag);
845                 bus_dma_tag_destroy(apc->rx_buf_tag);
846                 apc->rx_buf_tag = NULL;
847                 return ENOMEM;
848         }
849
850         return 0;
851 }
852
853 static int
854 mana_send_request(struct mana_context *ac, void *in_buf,
855     uint32_t in_len, void *out_buf, uint32_t out_len)
856 {
857         struct gdma_context *gc = ac->gdma_dev->gdma_context;
858         struct gdma_resp_hdr *resp = out_buf;
859         struct gdma_req_hdr *req = in_buf;
860         device_t dev = gc->dev;
861         static atomic_t activity_id;
862         int err;
863
864         req->dev_id = gc->mana.dev_id;
865         req->activity_id = atomic_inc_return(&activity_id);
866
867         mana_dbg(NULL, "activity_id  = %u\n", activity_id);
868
869         err = mana_gd_send_request(gc, in_len, in_buf, out_len,
870             out_buf);
871         if (err || resp->status) {
872                 device_printf(dev, "Failed to send mana message: %d, 0x%x\n",
873                         err, resp->status);
874                 return err ? err : EPROTO;
875         }
876
877         if (req->dev_id.as_uint32 != resp->dev_id.as_uint32 ||
878             req->activity_id != resp->activity_id) {
879                 device_printf(dev,
880                     "Unexpected mana message response: %x,%x,%x,%x\n",
881                     req->dev_id.as_uint32, resp->dev_id.as_uint32,
882                     req->activity_id, resp->activity_id);
883                 return EPROTO;
884         }
885
886         return 0;
887 }
888
889 static int
890 mana_verify_resp_hdr(const struct gdma_resp_hdr *resp_hdr,
891     const enum mana_command_code expected_code,
892     const uint32_t min_size)
893 {
894         if (resp_hdr->response.msg_type != expected_code)
895                 return EPROTO;
896
897         if (resp_hdr->response.msg_version < GDMA_MESSAGE_V1)
898                 return EPROTO;
899
900         if (resp_hdr->response.msg_size < min_size)
901                 return EPROTO;
902
903         return 0;
904 }
905
906 static int
907 mana_query_device_cfg(struct mana_context *ac, uint32_t proto_major_ver,
908     uint32_t proto_minor_ver, uint32_t proto_micro_ver,
909     uint16_t *max_num_vports)
910 {
911         struct gdma_context *gc = ac->gdma_dev->gdma_context;
912         struct mana_query_device_cfg_resp resp = {};
913         struct mana_query_device_cfg_req req = {};
914         device_t dev = gc->dev;
915         int err = 0;
916
917         mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_DEV_CONFIG,
918             sizeof(req), sizeof(resp));
919         req.proto_major_ver = proto_major_ver;
920         req.proto_minor_ver = proto_minor_ver;
921         req.proto_micro_ver = proto_micro_ver;
922
923         err = mana_send_request(ac, &req, sizeof(req), &resp, sizeof(resp));
924         if (err) {
925                 device_printf(dev, "Failed to query config: %d", err);
926                 return err;
927         }
928
929         err = mana_verify_resp_hdr(&resp.hdr, MANA_QUERY_DEV_CONFIG,
930             sizeof(resp));
931         if (err || resp.hdr.status) {
932                 device_printf(dev, "Invalid query result: %d, 0x%x\n", err,
933                     resp.hdr.status);
934                 if (!err)
935                         err = EPROTO;
936                 return err;
937         }
938
939         *max_num_vports = resp.max_num_vports;
940
941         mana_dbg(NULL, "mana max_num_vports from device = %d\n",
942             *max_num_vports);
943
944         return 0;
945 }
946
947 static int
948 mana_query_vport_cfg(struct mana_port_context *apc, uint32_t vport_index,
949     uint32_t *max_sq, uint32_t *max_rq, uint32_t *num_indir_entry)
950 {
951         struct mana_query_vport_cfg_resp resp = {};
952         struct mana_query_vport_cfg_req req = {};
953         int err;
954
955         mana_gd_init_req_hdr(&req.hdr, MANA_QUERY_VPORT_CONFIG,
956             sizeof(req), sizeof(resp));
957
958         req.vport_index = vport_index;
959
960         err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
961             sizeof(resp));
962         if (err)
963                 return err;
964
965         err = mana_verify_resp_hdr(&resp.hdr, MANA_QUERY_VPORT_CONFIG,
966             sizeof(resp));
967         if (err)
968                 return err;
969
970         if (resp.hdr.status)
971                 return EPROTO;
972
973         *max_sq = resp.max_num_sq;
974         *max_rq = resp.max_num_rq;
975         *num_indir_entry = resp.num_indirection_ent;
976
977         apc->port_handle = resp.vport;
978         memcpy(apc->mac_addr, resp.mac_addr, ETHER_ADDR_LEN);
979
980         return 0;
981 }
982
983 static int
984 mana_cfg_vport(struct mana_port_context *apc, uint32_t protection_dom_id,
985     uint32_t doorbell_pg_id)
986 {
987         struct mana_config_vport_resp resp = {};
988         struct mana_config_vport_req req = {};
989         int err;
990
991         mana_gd_init_req_hdr(&req.hdr, MANA_CONFIG_VPORT_TX,
992             sizeof(req), sizeof(resp));
993         req.vport = apc->port_handle;
994         req.pdid = protection_dom_id;
995         req.doorbell_pageid = doorbell_pg_id;
996
997         err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
998             sizeof(resp));
999         if (err) {
1000                 if_printf(apc->ndev, "Failed to configure vPort: %d\n", err);
1001                 goto out;
1002         }
1003
1004         err = mana_verify_resp_hdr(&resp.hdr, MANA_CONFIG_VPORT_TX,
1005             sizeof(resp));
1006         if (err || resp.hdr.status) {
1007                 if_printf(apc->ndev, "Failed to configure vPort: %d, 0x%x\n",
1008                     err, resp.hdr.status);
1009                 if (!err)
1010                         err = EPROTO;
1011
1012                 goto out;
1013         }
1014
1015         apc->tx_shortform_allowed = resp.short_form_allowed;
1016         apc->tx_vp_offset = resp.tx_vport_offset;
1017 out:
1018         return err;
1019 }
1020
1021 static int
1022 mana_cfg_vport_steering(struct mana_port_context *apc,
1023     enum TRI_STATE rx,
1024     bool update_default_rxobj, bool update_key,
1025     bool update_tab)
1026 {
1027         uint16_t num_entries = MANA_INDIRECT_TABLE_SIZE;
1028         struct mana_cfg_rx_steer_req *req = NULL;
1029         struct mana_cfg_rx_steer_resp resp = {};
1030         struct ifnet *ndev = apc->ndev;
1031         mana_handle_t *req_indir_tab;
1032         uint32_t req_buf_size;
1033         int err;
1034
1035         req_buf_size = sizeof(*req) + sizeof(mana_handle_t) * num_entries;
1036         req = malloc(req_buf_size, M_DEVBUF, M_WAITOK | M_ZERO);
1037         if (!req)
1038                 return ENOMEM;
1039
1040         mana_gd_init_req_hdr(&req->hdr, MANA_CONFIG_VPORT_RX, req_buf_size,
1041             sizeof(resp));
1042
1043         req->vport = apc->port_handle;
1044         req->num_indir_entries = num_entries;
1045         req->indir_tab_offset = sizeof(*req);
1046         req->rx_enable = rx;
1047         req->rss_enable = apc->rss_state;
1048         req->update_default_rxobj = update_default_rxobj;
1049         req->update_hashkey = update_key;
1050         req->update_indir_tab = update_tab;
1051         req->default_rxobj = apc->default_rxobj;
1052
1053         if (update_key)
1054                 memcpy(&req->hashkey, apc->hashkey, MANA_HASH_KEY_SIZE);
1055
1056         if (update_tab) {
1057                 req_indir_tab = (mana_handle_t *)(req + 1);
1058                 memcpy(req_indir_tab, apc->rxobj_table,
1059                        req->num_indir_entries * sizeof(mana_handle_t));
1060         }
1061
1062         err = mana_send_request(apc->ac, req, req_buf_size, &resp,
1063             sizeof(resp));
1064         if (err) {
1065                 if_printf(ndev, "Failed to configure vPort RX: %d\n", err);
1066                 goto out;
1067         }
1068
1069         err = mana_verify_resp_hdr(&resp.hdr, MANA_CONFIG_VPORT_RX,
1070             sizeof(resp));
1071         if (err) {
1072                 if_printf(ndev, "vPort RX configuration failed: %d\n", err);
1073                 goto out;
1074         }
1075
1076         if (resp.hdr.status) {
1077                 if_printf(ndev, "vPort RX configuration failed: 0x%x\n",
1078                     resp.hdr.status);
1079                 err = EPROTO;
1080         }
1081 out:
1082         free(req, M_DEVBUF);
1083         return err;
1084 }
1085
1086 static int
1087 mana_create_wq_obj(struct mana_port_context *apc,
1088     mana_handle_t vport,
1089     uint32_t wq_type, struct mana_obj_spec *wq_spec,
1090     struct mana_obj_spec *cq_spec,
1091     mana_handle_t *wq_obj)
1092 {
1093         struct mana_create_wqobj_resp resp = {};
1094         struct mana_create_wqobj_req req = {};
1095         struct ifnet *ndev = apc->ndev;
1096         int err;
1097
1098         mana_gd_init_req_hdr(&req.hdr, MANA_CREATE_WQ_OBJ,
1099             sizeof(req), sizeof(resp));
1100         req.vport = vport;
1101         req.wq_type = wq_type;
1102         req.wq_gdma_region = wq_spec->gdma_region;
1103         req.cq_gdma_region = cq_spec->gdma_region;
1104         req.wq_size = wq_spec->queue_size;
1105         req.cq_size = cq_spec->queue_size;
1106         req.cq_moderation_ctx_id = cq_spec->modr_ctx_id;
1107         req.cq_parent_qid = cq_spec->attached_eq;
1108
1109         err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
1110             sizeof(resp));
1111         if (err) {
1112                 if_printf(ndev, "Failed to create WQ object: %d\n", err);
1113                 goto out;
1114         }
1115
1116         err = mana_verify_resp_hdr(&resp.hdr, MANA_CREATE_WQ_OBJ,
1117             sizeof(resp));
1118         if (err || resp.hdr.status) {
1119                 if_printf(ndev, "Failed to create WQ object: %d, 0x%x\n", err,
1120                     resp.hdr.status);
1121                 if (!err)
1122                         err = EPROTO;
1123                 goto out;
1124         }
1125
1126         if (resp.wq_obj == INVALID_MANA_HANDLE) {
1127                 if_printf(ndev, "Got an invalid WQ object handle\n");
1128                 err = EPROTO;
1129                 goto out;
1130         }
1131
1132         *wq_obj = resp.wq_obj;
1133         wq_spec->queue_index = resp.wq_id;
1134         cq_spec->queue_index = resp.cq_id;
1135
1136         return 0;
1137 out:
1138         return err;
1139 }
1140
1141 static void
1142 mana_destroy_wq_obj(struct mana_port_context *apc, uint32_t wq_type,
1143     mana_handle_t wq_obj)
1144 {
1145         struct mana_destroy_wqobj_resp resp = {};
1146         struct mana_destroy_wqobj_req req = {};
1147         struct ifnet *ndev = apc->ndev;
1148         int err;
1149
1150         mana_gd_init_req_hdr(&req.hdr, MANA_DESTROY_WQ_OBJ,
1151             sizeof(req), sizeof(resp));
1152         req.wq_type = wq_type;
1153         req.wq_obj_handle = wq_obj;
1154
1155         err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
1156             sizeof(resp));
1157         if (err) {
1158                 if_printf(ndev, "Failed to destroy WQ object: %d\n", err);
1159                 return;
1160         }
1161
1162         err = mana_verify_resp_hdr(&resp.hdr, MANA_DESTROY_WQ_OBJ,
1163             sizeof(resp));
1164         if (err || resp.hdr.status)
1165                 if_printf(ndev, "Failed to destroy WQ object: %d, 0x%x\n",
1166                     err, resp.hdr.status);
1167 }
1168
1169 static void
1170 mana_destroy_eq(struct mana_context *ac)
1171 {
1172         struct gdma_context *gc = ac->gdma_dev->gdma_context;
1173         struct gdma_queue *eq;
1174         int i;
1175
1176         if (!ac->eqs)
1177                 return;
1178
1179         for (i = 0; i < gc->max_num_queues; i++) {
1180                 eq = ac->eqs[i].eq;
1181                 if (!eq)
1182                         continue;
1183
1184                 mana_gd_destroy_queue(gc, eq);
1185         }
1186
1187         free(ac->eqs, M_DEVBUF);
1188         ac->eqs = NULL;
1189 }
1190
1191 static int
1192 mana_create_eq(struct mana_context *ac)
1193 {
1194         struct gdma_dev *gd = ac->gdma_dev;
1195         struct gdma_context *gc = gd->gdma_context;
1196         struct gdma_queue_spec spec = {};
1197         int err;
1198         int i;
1199
1200         ac->eqs = mallocarray(gc->max_num_queues, sizeof(struct mana_eq),
1201             M_DEVBUF, M_WAITOK | M_ZERO);
1202         if (!ac->eqs)
1203                 return ENOMEM;
1204
1205         spec.type = GDMA_EQ;
1206         spec.monitor_avl_buf = false;
1207         spec.queue_size = EQ_SIZE;
1208         spec.eq.callback = NULL;
1209         spec.eq.context = ac->eqs;
1210         spec.eq.log2_throttle_limit = LOG2_EQ_THROTTLE;
1211
1212         for (i = 0; i < gc->max_num_queues; i++) {
1213                 err = mana_gd_create_mana_eq(gd, &spec, &ac->eqs[i].eq);
1214                 if (err)
1215                         goto out;
1216         }
1217
1218         return 0;
1219 out:
1220         mana_destroy_eq(ac);
1221         return err;
1222 }
1223
1224 static int
1225 mana_fence_rq(struct mana_port_context *apc, struct mana_rxq *rxq)
1226 {
1227         struct mana_fence_rq_resp resp = {};
1228         struct mana_fence_rq_req req = {};
1229         int err;
1230
1231         init_completion(&rxq->fence_event);
1232
1233         mana_gd_init_req_hdr(&req.hdr, MANA_FENCE_RQ,
1234             sizeof(req), sizeof(resp));
1235         req.wq_obj_handle = rxq->rxobj;
1236
1237         err = mana_send_request(apc->ac, &req, sizeof(req), &resp,
1238             sizeof(resp));
1239         if (err) {
1240                 if_printf(apc->ndev, "Failed to fence RQ %u: %d\n",
1241                     rxq->rxq_idx, err);
1242                 return err;
1243         }
1244
1245         err = mana_verify_resp_hdr(&resp.hdr, MANA_FENCE_RQ, sizeof(resp));
1246         if (err || resp.hdr.status) {
1247                 if_printf(apc->ndev, "Failed to fence RQ %u: %d, 0x%x\n",
1248                     rxq->rxq_idx, err, resp.hdr.status);
1249                 if (!err)
1250                         err = EPROTO;
1251
1252                 return err;
1253         }
1254
1255         if (wait_for_completion_timeout(&rxq->fence_event, 10 * hz)) {
1256                 if_printf(apc->ndev, "Failed to fence RQ %u: timed out\n",
1257                     rxq->rxq_idx);
1258                 return ETIMEDOUT;
1259         }
1260
1261         return 0;
1262 }
1263
1264 static void
1265 mana_fence_rqs(struct mana_port_context *apc)
1266 {
1267         unsigned int rxq_idx;
1268         struct mana_rxq *rxq;
1269         int err;
1270
1271         for (rxq_idx = 0; rxq_idx < apc->num_queues; rxq_idx++) {
1272                 rxq = apc->rxqs[rxq_idx];
1273                 err = mana_fence_rq(apc, rxq);
1274
1275                 /* In case of any error, use sleep instead. */
1276                 if (err)
1277                         gdma_msleep(100);
1278         }
1279 }
1280
1281 static int
1282 mana_move_wq_tail(struct gdma_queue *wq, uint32_t num_units)
1283 {
1284         uint32_t used_space_old;
1285         uint32_t used_space_new;
1286
1287         used_space_old = wq->head - wq->tail;
1288         used_space_new = wq->head - (wq->tail + num_units);
1289
1290         if (used_space_new > used_space_old) {
1291                 mana_err(NULL,
1292                     "WARNING: new used space %u greater than old one %u\n",
1293                     used_space_new, used_space_old);
1294                 return ERANGE;
1295         }
1296
1297         wq->tail += num_units;
1298         return 0;
1299 }
1300
1301 static void
1302 mana_poll_tx_cq(struct mana_cq *cq)
1303 {
1304         struct gdma_comp *completions = cq->gdma_comp_buf;
1305         struct gdma_posted_wqe_info *wqe_info;
1306         struct mana_send_buf_info *tx_info;
1307         unsigned int pkt_transmitted = 0;
1308         unsigned int wqe_unit_cnt = 0;
1309         struct mana_txq *txq = cq->txq;
1310         struct mana_port_context *apc;
1311         uint16_t next_to_complete;
1312         struct ifnet *ndev;
1313         int comp_read;
1314         int txq_idx = txq->idx;;
1315         int i;
1316         int sa_drop = 0;
1317
1318         struct gdma_queue *gdma_wq;
1319         unsigned int avail_space;
1320         bool txq_full = false;
1321
1322         ndev = txq->ndev;
1323         apc = if_getsoftc(ndev);
1324
1325         comp_read = mana_gd_poll_cq(cq->gdma_cq, completions,
1326             CQE_POLLING_BUFFER);
1327
1328         if (comp_read < 1)
1329                 return;
1330
1331         next_to_complete = txq->next_to_complete;
1332
1333         for (i = 0; i < comp_read; i++) {
1334                 struct mana_tx_comp_oob *cqe_oob;
1335
1336                 if (!completions[i].is_sq) {
1337                         mana_err(NULL, "WARNING: Not for SQ\n");
1338                         return;
1339                 }
1340
1341                 cqe_oob = (struct mana_tx_comp_oob *)completions[i].cqe_data;
1342                 if (cqe_oob->cqe_hdr.client_type !=
1343                                  MANA_CQE_COMPLETION) {
1344                         mana_err(NULL,
1345                             "WARNING: Invalid CQE client type %u\n",
1346                             cqe_oob->cqe_hdr.client_type);
1347                         return;
1348                 }
1349
1350                 switch (cqe_oob->cqe_hdr.cqe_type) {
1351                 case CQE_TX_OKAY:
1352                         break;
1353
1354                 case CQE_TX_SA_DROP:
1355                 case CQE_TX_MTU_DROP:
1356                 case CQE_TX_INVALID_OOB:
1357                 case CQE_TX_INVALID_ETH_TYPE:
1358                 case CQE_TX_HDR_PROCESSING_ERROR:
1359                 case CQE_TX_VF_DISABLED:
1360                 case CQE_TX_VPORT_IDX_OUT_OF_RANGE:
1361                 case CQE_TX_VPORT_DISABLED:
1362                 case CQE_TX_VLAN_TAGGING_VIOLATION:
1363                         sa_drop ++;
1364                         mana_err(NULL,
1365                             "TX: txq %d CQE error %d, ntc = %d, "
1366                             "pending sends = %d: err ignored.\n",
1367                             txq_idx, cqe_oob->cqe_hdr.cqe_type,
1368                             next_to_complete, txq->pending_sends);
1369                         break;
1370
1371                 default:
1372                         /* If the CQE type is unexpected, log an error,
1373                          * and go through the error path.
1374                          */
1375                         mana_err(NULL,
1376                             "ERROR: TX: Unexpected CQE type %d: HW BUG?\n",
1377                             cqe_oob->cqe_hdr.cqe_type);
1378                         return;
1379                 }
1380                 if (txq->gdma_txq_id != completions[i].wq_num) {
1381                         mana_dbg(NULL,
1382                             "txq gdma id not match completion wq num: "
1383                             "%d != %d\n",
1384                             txq->gdma_txq_id, completions[i].wq_num);
1385                         break;
1386                 }
1387
1388                 tx_info = &txq->tx_buf_info[next_to_complete];
1389                 if (!tx_info->mbuf) {
1390                         mana_err(NULL,
1391                             "WARNING: txq %d Empty mbuf on tx_info: %u, "
1392                             "ntu = %u, pending_sends = %d, "
1393                             "transmitted = %d, sa_drop = %d, i = %d, comp_read = %d\n",
1394                             txq_idx, next_to_complete, txq->next_to_use,
1395                             txq->pending_sends, pkt_transmitted, sa_drop,
1396                             i, comp_read);
1397                         break;
1398                 }
1399
1400                 wqe_info = &tx_info->wqe_inf;
1401                 wqe_unit_cnt += wqe_info->wqe_size_in_bu;
1402
1403                 mana_tx_unmap_mbuf(apc, tx_info);
1404                 mb();
1405
1406                 next_to_complete =
1407                     (next_to_complete + 1) % MAX_SEND_BUFFERS_PER_QUEUE;
1408
1409                 pkt_transmitted++;
1410         }
1411
1412         txq->next_to_complete = next_to_complete;
1413
1414         if (wqe_unit_cnt == 0) {
1415                 mana_err(NULL,
1416                     "WARNING: TX ring not proceeding!\n");
1417                 return;
1418         }
1419
1420         mana_move_wq_tail(txq->gdma_sq, wqe_unit_cnt);
1421
1422         /* Ensure tail updated before checking q stop */
1423         wmb();
1424
1425         gdma_wq = txq->gdma_sq;
1426         avail_space = mana_gd_wq_avail_space(gdma_wq);
1427
1428
1429         if ((if_getdrvflags(ndev) & MANA_TXQ_FULL) == MANA_TXQ_FULL) {
1430                 txq_full = true;
1431         }
1432
1433         /* Ensure checking txq_full before apc->port_is_up. */
1434         rmb();
1435
1436         if (txq_full && apc->port_is_up && avail_space >= MAX_TX_WQE_SIZE) {
1437                 /* Grab the txq lock and re-test */
1438                 mtx_lock(&txq->txq_mtx);
1439                 avail_space = mana_gd_wq_avail_space(gdma_wq);
1440
1441                 if ((if_getdrvflags(ndev) & MANA_TXQ_FULL) == MANA_TXQ_FULL &&
1442                     apc->port_is_up && avail_space >= MAX_TX_WQE_SIZE) {
1443                         /* Clear the Q full flag */
1444                         if_setdrvflagbits(apc->ndev, IFF_DRV_RUNNING,
1445                             IFF_DRV_OACTIVE);
1446                         counter_u64_add(txq->stats.wakeup, 1);
1447                         if (txq->alt_txq_idx != txq->idx) {
1448                                 uint64_t stops = counter_u64_fetch(txq->stats.stop);
1449                                 uint64_t wakeups = counter_u64_fetch(txq->stats.wakeup);
1450                                 /* Reset alt_txq_idx back if it is not overloaded */
1451                                 if (stops < wakeups) {
1452                                         txq->alt_txq_idx = txq->idx;
1453                                         counter_u64_add(txq->stats.alt_reset, 1);
1454                                 }
1455                         }
1456                         rmb();
1457                         /* Schedule a tx enqueue task */
1458                         taskqueue_enqueue(txq->enqueue_tq, &txq->enqueue_task);
1459                 }
1460                 mtx_unlock(&txq->txq_mtx);
1461         }
1462
1463         if (atomic_sub_return(pkt_transmitted, &txq->pending_sends) < 0)
1464                 mana_err(NULL,
1465                     "WARNING: TX %d pending_sends error: %d\n",
1466                     txq->idx, txq->pending_sends);
1467
1468         cq->work_done = pkt_transmitted;
1469 }
1470
1471 static void
1472 mana_post_pkt_rxq(struct mana_rxq *rxq)
1473 {
1474         struct mana_recv_buf_oob *recv_buf_oob;
1475         uint32_t curr_index;
1476         int err;
1477
1478         curr_index = rxq->buf_index++;
1479         if (rxq->buf_index == rxq->num_rx_buf)
1480                 rxq->buf_index = 0;
1481
1482         recv_buf_oob = &rxq->rx_oobs[curr_index];
1483
1484         err = mana_gd_post_and_ring(rxq->gdma_rq, &recv_buf_oob->wqe_req,
1485             &recv_buf_oob->wqe_inf);
1486         if (err) {
1487                 mana_err(NULL, "WARNING: rxq %u post pkt err %d\n",
1488                     rxq->rxq_idx, err);
1489                 return;
1490         }
1491
1492         if (recv_buf_oob->wqe_inf.wqe_size_in_bu != 1) {
1493                 mana_err(NULL, "WARNING: rxq %u wqe_size_in_bu %u\n",
1494                     rxq->rxq_idx, recv_buf_oob->wqe_inf.wqe_size_in_bu);
1495         }
1496 }
1497
1498 static void
1499 mana_rx_mbuf(struct mbuf *mbuf, struct mana_rxcomp_oob *cqe,
1500     struct mana_rxq *rxq)
1501 {
1502         struct mana_stats *rx_stats = &rxq->stats;
1503         struct ifnet *ndev = rxq->ndev;
1504         uint32_t pkt_len = cqe->ppi[0].pkt_len;
1505         uint16_t rxq_idx = rxq->rxq_idx;
1506         struct mana_port_context *apc;
1507         bool do_lro = false;
1508         bool do_if_input;
1509
1510         apc = if_getsoftc(ndev);
1511         rxq->rx_cq.work_done++;
1512
1513         if (!mbuf) {
1514                 return;
1515         }
1516
1517         mbuf->m_flags |= M_PKTHDR;
1518         mbuf->m_pkthdr.len = pkt_len;
1519         mbuf->m_len = pkt_len;
1520         mbuf->m_pkthdr.rcvif = ndev;
1521
1522         if ((ndev->if_capenable & IFCAP_RXCSUM ||
1523             ndev->if_capenable & IFCAP_RXCSUM_IPV6) &&
1524             (cqe->rx_iphdr_csum_succeed)) {
1525                 mbuf->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
1526                 mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID;
1527                 if (cqe->rx_tcp_csum_succeed || cqe->rx_udp_csum_succeed) {
1528                         mbuf->m_pkthdr.csum_flags |=
1529                             (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
1530                         mbuf->m_pkthdr.csum_data = 0xffff;
1531
1532                         if (cqe->rx_tcp_csum_succeed)
1533                                 do_lro = true;
1534                 }
1535         }
1536
1537         if (cqe->rx_hashtype != 0) {
1538                 mbuf->m_pkthdr.flowid = cqe->ppi[0].pkt_hash;
1539
1540                 uint16_t hashtype = cqe->rx_hashtype;
1541                 if (hashtype & NDIS_HASH_IPV4_MASK) {
1542                         hashtype &= NDIS_HASH_IPV4_MASK;
1543                         switch (hashtype) {
1544                         case NDIS_HASH_TCP_IPV4:
1545                                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_TCP_IPV4);
1546                                 break;
1547                         case NDIS_HASH_UDP_IPV4:
1548                                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_UDP_IPV4);
1549                                 break;
1550                         default:
1551                                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_IPV4);
1552                         }
1553                 } else if (hashtype & NDIS_HASH_IPV6_MASK) {
1554                         hashtype &= NDIS_HASH_IPV6_MASK;
1555                         switch (hashtype) {
1556                         case NDIS_HASH_TCP_IPV6:
1557                                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_TCP_IPV6);
1558                                 break;
1559                         case NDIS_HASH_TCP_IPV6_EX:
1560                                 M_HASHTYPE_SET(mbuf,
1561                                     M_HASHTYPE_RSS_TCP_IPV6_EX);
1562                                 break;
1563                         case NDIS_HASH_UDP_IPV6:
1564                                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_UDP_IPV6);
1565                                 break;
1566                         case NDIS_HASH_UDP_IPV6_EX:
1567                                 M_HASHTYPE_SET(mbuf,
1568                                     M_HASHTYPE_RSS_UDP_IPV6_EX);
1569                                 break;
1570                         default:
1571                                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_RSS_IPV6);
1572                         }
1573                 } else {
1574                         M_HASHTYPE_SET(mbuf, M_HASHTYPE_OPAQUE_HASH);
1575                 }
1576         } else {
1577                 mbuf->m_pkthdr.flowid = rxq_idx;
1578                 M_HASHTYPE_SET(mbuf, M_HASHTYPE_NONE);
1579         }
1580
1581         do_if_input = true;
1582         if ((ndev->if_capenable & IFCAP_LRO) && do_lro) {
1583                 if (rxq->lro.lro_cnt != 0 &&
1584                     tcp_lro_rx(&rxq->lro, mbuf, 0) == 0)
1585                         do_if_input = false;
1586         }
1587         if (do_if_input) {
1588                 ndev->if_input(ndev, mbuf);
1589         }
1590
1591         counter_enter();
1592         counter_u64_add_protected(rx_stats->packets, 1);
1593         counter_u64_add_protected(apc->port_stats.rx_packets, 1);
1594         counter_u64_add_protected(rx_stats->bytes, pkt_len);
1595         counter_u64_add_protected(apc->port_stats.rx_bytes, pkt_len);
1596         counter_exit();
1597 }
1598
1599 static void
1600 mana_process_rx_cqe(struct mana_rxq *rxq, struct mana_cq *cq,
1601     struct gdma_comp *cqe)
1602 {
1603         struct mana_rxcomp_oob *oob = (struct mana_rxcomp_oob *)cqe->cqe_data;
1604         struct mana_recv_buf_oob *rxbuf_oob;
1605         struct ifnet *ndev = rxq->ndev;
1606         struct mana_port_context *apc;
1607         struct mbuf *old_mbuf;
1608         uint32_t curr, pktlen;
1609         int err;
1610
1611         switch (oob->cqe_hdr.cqe_type) {
1612         case CQE_RX_OKAY:
1613                 break;
1614
1615         case CQE_RX_TRUNCATED:
1616                 apc = if_getsoftc(ndev);
1617                 counter_u64_add(apc->port_stats.rx_drops, 1);
1618                 rxbuf_oob = &rxq->rx_oobs[rxq->buf_index];
1619                 if_printf(ndev, "Dropped a truncated packet\n");
1620                 goto drop;
1621
1622         case CQE_RX_COALESCED_4:
1623                 if_printf(ndev, "RX coalescing is unsupported\n");
1624                 return;
1625
1626         case CQE_RX_OBJECT_FENCE:
1627                 complete(&rxq->fence_event);
1628                 return;
1629
1630         default:
1631                 if_printf(ndev, "Unknown RX CQE type = %d\n",
1632                     oob->cqe_hdr.cqe_type);
1633                 return;
1634         }
1635
1636         if (oob->cqe_hdr.cqe_type != CQE_RX_OKAY)
1637                 return;
1638
1639         pktlen = oob->ppi[0].pkt_len;
1640
1641         if (pktlen == 0) {
1642                 /* data packets should never have packetlength of zero */
1643 #if defined(__amd64__)
1644                 if_printf(ndev, "RX pkt len=0, rq=%u, cq=%u, rxobj=0x%lx\n",
1645                     rxq->gdma_id, cq->gdma_id, rxq->rxobj);
1646 #else
1647                 if_printf(ndev, "RX pkt len=0, rq=%u, cq=%u, rxobj=0x%llx\n",
1648                     rxq->gdma_id, cq->gdma_id, rxq->rxobj);
1649 #endif
1650                 return;
1651         }
1652
1653         curr = rxq->buf_index;
1654         rxbuf_oob = &rxq->rx_oobs[curr];
1655         if (rxbuf_oob->wqe_inf.wqe_size_in_bu != 1) {
1656                 mana_err(NULL, "WARNING: Rx Incorrect complete "
1657                     "WQE size %u\n",
1658                     rxbuf_oob->wqe_inf.wqe_size_in_bu);
1659         }
1660
1661         apc = if_getsoftc(ndev);
1662
1663         old_mbuf = rxbuf_oob->mbuf;
1664
1665         /* Unload DMA map for the old mbuf */
1666         mana_unload_rx_mbuf(apc, rxq, rxbuf_oob, false);
1667
1668         /* Load a new mbuf to replace the old one */
1669         err = mana_load_rx_mbuf(apc, rxq, rxbuf_oob, true);
1670         if (err) {
1671                 mana_dbg(NULL,
1672                     "failed to load rx mbuf, err = %d, packet dropped.\n",
1673                     err);
1674                 counter_u64_add(rxq->stats.mbuf_alloc_fail, 1);
1675                 /*
1676                  * Failed to load new mbuf, rxbuf_oob->mbuf is still
1677                  * pointing to the old one. Drop the packet.
1678                  */
1679                  old_mbuf = NULL;
1680                  /* Reload the existing mbuf */
1681                  mana_load_rx_mbuf(apc, rxq, rxbuf_oob, false);
1682         }
1683
1684         mana_rx_mbuf(old_mbuf, oob, rxq);
1685
1686 drop:
1687         mana_move_wq_tail(rxq->gdma_rq, rxbuf_oob->wqe_inf.wqe_size_in_bu);
1688
1689         mana_post_pkt_rxq(rxq);
1690 }
1691
1692 static void
1693 mana_poll_rx_cq(struct mana_cq *cq)
1694 {
1695         struct gdma_comp *comp = cq->gdma_comp_buf;
1696         int comp_read, i;
1697
1698         comp_read = mana_gd_poll_cq(cq->gdma_cq, comp, CQE_POLLING_BUFFER);
1699         KASSERT(comp_read <= CQE_POLLING_BUFFER,
1700             ("comp_read %d great than buf size %d",
1701             comp_read, CQE_POLLING_BUFFER));
1702
1703         for (i = 0; i < comp_read; i++) {
1704                 if (comp[i].is_sq == true) {
1705                         mana_err(NULL,
1706                             "WARNING: CQE not for receive queue\n");
1707                         return;
1708                 }
1709
1710                 /* verify recv cqe references the right rxq */
1711                 if (comp[i].wq_num != cq->rxq->gdma_id) {
1712                         mana_err(NULL,
1713                             "WARNING: Received CQE %d  not for "
1714                             "this receive queue %d\n",
1715                             comp[i].wq_num,  cq->rxq->gdma_id);
1716                         return;
1717                 }
1718
1719                 mana_process_rx_cqe(cq->rxq, cq, &comp[i]);
1720         }
1721
1722         tcp_lro_flush_all(&cq->rxq->lro);
1723 }
1724
1725 static void
1726 mana_cq_handler(void *context, struct gdma_queue *gdma_queue)
1727 {
1728         struct mana_cq *cq = context;
1729         uint8_t arm_bit;
1730
1731         KASSERT(cq->gdma_cq == gdma_queue,
1732             ("cq do not match %p, %p", cq->gdma_cq, gdma_queue));
1733
1734         if (cq->type == MANA_CQ_TYPE_RX) {
1735                 mana_poll_rx_cq(cq);
1736         } else {
1737                 mana_poll_tx_cq(cq);
1738         }
1739
1740         if (cq->work_done < cq->budget && cq->do_not_ring_db == false)
1741                 arm_bit = SET_ARM_BIT;
1742         else
1743                 arm_bit = 0;
1744
1745         mana_gd_ring_cq(gdma_queue, arm_bit);
1746 }
1747
1748 #define MANA_POLL_BUDGET        8
1749 #define MANA_RX_BUDGET          256
1750 #define MANA_TX_BUDGET          MAX_SEND_BUFFERS_PER_QUEUE
1751
1752 static void
1753 mana_poll(void *arg, int pending)
1754 {
1755         struct mana_cq *cq = arg;
1756         int i;
1757
1758         cq->work_done = 0;
1759         if (cq->type == MANA_CQ_TYPE_RX) {
1760                 cq->budget = MANA_RX_BUDGET;
1761         } else {
1762                 cq->budget = MANA_TX_BUDGET;
1763         }
1764
1765         for (i = 0; i < MANA_POLL_BUDGET; i++) {
1766                 /*
1767                  * If this is the last loop, set the budget big enough
1768                  * so it will arm the CQ any way.
1769                  */
1770                 if (i == (MANA_POLL_BUDGET - 1))
1771                         cq->budget = CQE_POLLING_BUFFER + 1;
1772
1773                 mana_cq_handler(cq, cq->gdma_cq);
1774
1775                 if (cq->work_done < cq->budget)
1776                         break;
1777
1778                 cq->work_done = 0;
1779         }
1780 }
1781
1782 static void
1783 mana_schedule_task(void *arg, struct gdma_queue *gdma_queue)
1784 {
1785         struct mana_cq *cq = arg;
1786
1787         taskqueue_enqueue(cq->cleanup_tq, &cq->cleanup_task);
1788 }
1789
1790 static void
1791 mana_deinit_cq(struct mana_port_context *apc, struct mana_cq *cq)
1792 {
1793         struct gdma_dev *gd = apc->ac->gdma_dev;
1794
1795         if (!cq->gdma_cq)
1796                 return;
1797
1798         /* Drain cleanup taskqueue */
1799         if (cq->cleanup_tq) {
1800                 while (taskqueue_cancel(cq->cleanup_tq,
1801                     &cq->cleanup_task, NULL)) {
1802                         taskqueue_drain(cq->cleanup_tq,
1803                             &cq->cleanup_task);
1804                 }
1805
1806                 taskqueue_free(cq->cleanup_tq);
1807         }
1808
1809         mana_gd_destroy_queue(gd->gdma_context, cq->gdma_cq);
1810 }
1811
1812 static void
1813 mana_deinit_txq(struct mana_port_context *apc, struct mana_txq *txq)
1814 {
1815         struct gdma_dev *gd = apc->ac->gdma_dev;
1816         struct mana_send_buf_info *txbuf_info;
1817         uint32_t pending_sends;
1818         int i;
1819
1820         if (!txq->gdma_sq)
1821                 return;
1822
1823         if ((pending_sends = atomic_read(&txq->pending_sends)) > 0) {
1824                 mana_err(NULL,
1825                     "WARNING: txq pending sends not zero: %u\n",
1826                     pending_sends);
1827         }
1828
1829         if (txq->next_to_use != txq->next_to_complete) {
1830                 mana_err(NULL,
1831                     "WARNING: txq buf not completed, "
1832                     "next use %u, next complete %u\n",
1833                     txq->next_to_use, txq->next_to_complete);
1834         }
1835
1836         /* Flush buf ring. Grab txq mtx lock */
1837         if (txq->txq_br) {
1838                 mtx_lock(&txq->txq_mtx);
1839                 drbr_flush(apc->ndev, txq->txq_br);
1840                 mtx_unlock(&txq->txq_mtx);
1841                 buf_ring_free(txq->txq_br, M_DEVBUF);
1842         }
1843
1844         /* Drain taskqueue */
1845         if (txq->enqueue_tq) {
1846                 while (taskqueue_cancel(txq->enqueue_tq,
1847                     &txq->enqueue_task, NULL)) {
1848                         taskqueue_drain(txq->enqueue_tq,
1849                             &txq->enqueue_task);
1850                 }
1851
1852                 taskqueue_free(txq->enqueue_tq);
1853         }
1854
1855         if (txq->tx_buf_info) {
1856                 /* Free all mbufs which are still in-flight */
1857                 for (i = 0; i < MAX_SEND_BUFFERS_PER_QUEUE; i++) {
1858                         txbuf_info = &txq->tx_buf_info[i];
1859                         if (txbuf_info->mbuf) {
1860                                 mana_tx_unmap_mbuf(apc, txbuf_info);
1861                         }
1862                 }
1863
1864                 free(txq->tx_buf_info, M_DEVBUF);
1865         }
1866
1867         mana_free_counters((counter_u64_t *)&txq->stats,
1868             sizeof(txq->stats));
1869
1870         mana_gd_destroy_queue(gd->gdma_context, txq->gdma_sq);
1871
1872         mtx_destroy(&txq->txq_mtx);
1873 }
1874
1875 static void
1876 mana_destroy_txq(struct mana_port_context *apc)
1877 {
1878         int i;
1879
1880         if (!apc->tx_qp)
1881                 return;
1882
1883         for (i = 0; i < apc->num_queues; i++) {
1884                 mana_destroy_wq_obj(apc, GDMA_SQ, apc->tx_qp[i].tx_object);
1885
1886                 mana_deinit_cq(apc, &apc->tx_qp[i].tx_cq);
1887
1888                 mana_deinit_txq(apc, &apc->tx_qp[i].txq);
1889         }
1890
1891         free(apc->tx_qp, M_DEVBUF);
1892         apc->tx_qp = NULL;
1893 }
1894
1895 static int
1896 mana_create_txq(struct mana_port_context *apc, struct ifnet *net)
1897 {
1898         struct mana_context *ac = apc->ac;
1899         struct gdma_dev *gd = ac->gdma_dev;
1900         struct mana_obj_spec wq_spec;
1901         struct mana_obj_spec cq_spec;
1902         struct gdma_queue_spec spec;
1903         struct gdma_context *gc;
1904         struct mana_txq *txq;
1905         struct mana_cq *cq;
1906         uint32_t txq_size;
1907         uint32_t cq_size;
1908         int err;
1909         int i;
1910
1911         apc->tx_qp = mallocarray(apc->num_queues, sizeof(struct mana_tx_qp),
1912             M_DEVBUF, M_WAITOK | M_ZERO);
1913         if (!apc->tx_qp)
1914                 return ENOMEM;
1915
1916         /*  The minimum size of the WQE is 32 bytes, hence
1917          *  MAX_SEND_BUFFERS_PER_QUEUE represents the maximum number of WQEs
1918          *  the SQ can store. This value is then used to size other queues
1919          *  to prevent overflow.
1920          */
1921         txq_size = MAX_SEND_BUFFERS_PER_QUEUE * 32;
1922         KASSERT(IS_ALIGNED(txq_size, PAGE_SIZE),
1923             ("txq size not page aligned"));
1924
1925         cq_size = MAX_SEND_BUFFERS_PER_QUEUE * COMP_ENTRY_SIZE;
1926         cq_size = ALIGN(cq_size, PAGE_SIZE);
1927
1928         gc = gd->gdma_context;
1929
1930         for (i = 0; i < apc->num_queues; i++) {
1931                 apc->tx_qp[i].tx_object = INVALID_MANA_HANDLE;
1932
1933                 /* Create SQ */
1934                 txq = &apc->tx_qp[i].txq;
1935
1936                 txq->ndev = net;
1937                 txq->vp_offset = apc->tx_vp_offset;
1938                 txq->idx = i;
1939                 txq->alt_txq_idx = i;
1940
1941                 memset(&spec, 0, sizeof(spec));
1942                 spec.type = GDMA_SQ;
1943                 spec.monitor_avl_buf = true;
1944                 spec.queue_size = txq_size;
1945                 err = mana_gd_create_mana_wq_cq(gd, &spec, &txq->gdma_sq);
1946                 if (err)
1947                         goto out;
1948
1949                 /* Create SQ's CQ */
1950                 cq = &apc->tx_qp[i].tx_cq;
1951                 cq->type = MANA_CQ_TYPE_TX;
1952
1953                 cq->txq = txq;
1954
1955                 memset(&spec, 0, sizeof(spec));
1956                 spec.type = GDMA_CQ;
1957                 spec.monitor_avl_buf = false;
1958                 spec.queue_size = cq_size;
1959                 spec.cq.callback = mana_schedule_task;
1960                 spec.cq.parent_eq = ac->eqs[i].eq;
1961                 spec.cq.context = cq;
1962                 err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq);
1963                 if (err)
1964                         goto out;
1965
1966                 memset(&wq_spec, 0, sizeof(wq_spec));
1967                 memset(&cq_spec, 0, sizeof(cq_spec));
1968
1969                 wq_spec.gdma_region = txq->gdma_sq->mem_info.gdma_region;
1970                 wq_spec.queue_size = txq->gdma_sq->queue_size;
1971
1972                 cq_spec.gdma_region = cq->gdma_cq->mem_info.gdma_region;
1973                 cq_spec.queue_size = cq->gdma_cq->queue_size;
1974                 cq_spec.modr_ctx_id = 0;
1975                 cq_spec.attached_eq = cq->gdma_cq->cq.parent->id;
1976
1977                 err = mana_create_wq_obj(apc, apc->port_handle, GDMA_SQ,
1978                     &wq_spec, &cq_spec, &apc->tx_qp[i].tx_object);
1979
1980                 if (err)
1981                         goto out;
1982
1983                 txq->gdma_sq->id = wq_spec.queue_index;
1984                 cq->gdma_cq->id = cq_spec.queue_index;
1985
1986                 txq->gdma_sq->mem_info.gdma_region = GDMA_INVALID_DMA_REGION;
1987                 cq->gdma_cq->mem_info.gdma_region = GDMA_INVALID_DMA_REGION;
1988
1989                 txq->gdma_txq_id = txq->gdma_sq->id;
1990
1991                 cq->gdma_id = cq->gdma_cq->id;
1992
1993                 mana_dbg(NULL,
1994                     "txq %d, txq gdma id %d, txq cq gdma id %d\n",
1995                     i, txq->gdma_txq_id, cq->gdma_id);;
1996
1997                 if (cq->gdma_id >= gc->max_num_cqs) {
1998                         if_printf(net, "CQ id %u too large.\n", cq->gdma_id);
1999                         err = EINVAL;
2000                         goto out;
2001                 }
2002
2003                 gc->cq_table[cq->gdma_id] = cq->gdma_cq;
2004
2005                 /* Initialize tx specific data */
2006                 txq->tx_buf_info = malloc(MAX_SEND_BUFFERS_PER_QUEUE *
2007                     sizeof(struct mana_send_buf_info),
2008                     M_DEVBUF, M_WAITOK | M_ZERO);
2009                 if (unlikely(txq->tx_buf_info == NULL)) {
2010                         if_printf(net,
2011                             "Failed to allocate tx buf info for SQ %u\n",
2012                             txq->gdma_sq->id);
2013                         err = ENOMEM;
2014                         goto out;
2015                 }
2016
2017
2018                 snprintf(txq->txq_mtx_name, nitems(txq->txq_mtx_name),
2019                     "mana:tx(%d)", i);
2020                 mtx_init(&txq->txq_mtx, txq->txq_mtx_name, NULL, MTX_DEF);
2021
2022                 txq->txq_br = buf_ring_alloc(4 * MAX_SEND_BUFFERS_PER_QUEUE,
2023                     M_DEVBUF, M_WAITOK, &txq->txq_mtx);
2024                 if (unlikely(txq->txq_br == NULL)) {
2025                         if_printf(net,
2026                             "Failed to allocate buf ring for SQ %u\n",
2027                             txq->gdma_sq->id);
2028                         err = ENOMEM;
2029                         goto out;
2030                 }
2031
2032                 /* Allocate taskqueue for deferred send */
2033                 TASK_INIT(&txq->enqueue_task, 0, mana_xmit_taskfunc, txq);
2034                 txq->enqueue_tq = taskqueue_create_fast("mana_tx_enque",
2035                     M_NOWAIT, taskqueue_thread_enqueue, &txq->enqueue_tq);
2036                 if (unlikely(txq->enqueue_tq == NULL)) {
2037                         if_printf(net,
2038                             "Unable to create tx %d enqueue task queue\n", i);
2039                         err = ENOMEM;
2040                         goto out;
2041                 }
2042                 taskqueue_start_threads(&txq->enqueue_tq, 1, PI_NET,
2043                     "mana txq p%u-tx%d", apc->port_idx, i);
2044
2045                 mana_alloc_counters((counter_u64_t *)&txq->stats,
2046                     sizeof(txq->stats));
2047
2048                 /* Allocate and start the cleanup task on CQ */
2049                 cq->do_not_ring_db = false;
2050
2051                 NET_TASK_INIT(&cq->cleanup_task, 0, mana_poll, cq);
2052                 cq->cleanup_tq =
2053                     taskqueue_create_fast("mana tx cq cleanup",
2054                     M_WAITOK, taskqueue_thread_enqueue,
2055                     &cq->cleanup_tq);
2056
2057                 if (apc->last_tx_cq_bind_cpu < 0)
2058                         apc->last_tx_cq_bind_cpu = CPU_FIRST();
2059                 cq->cpu = apc->last_tx_cq_bind_cpu;
2060                 apc->last_tx_cq_bind_cpu = CPU_NEXT(apc->last_tx_cq_bind_cpu);
2061
2062                 if (apc->bind_cleanup_thread_cpu) {
2063                         cpuset_t cpu_mask;
2064                         CPU_SETOF(cq->cpu, &cpu_mask);
2065                         taskqueue_start_threads_cpuset(&cq->cleanup_tq,
2066                             1, PI_NET, &cpu_mask,
2067                             "mana cq p%u-tx%u-cpu%d",
2068                             apc->port_idx, txq->idx, cq->cpu);
2069                 } else {
2070                         taskqueue_start_threads(&cq->cleanup_tq, 1,
2071                             PI_NET, "mana cq p%u-tx%u",
2072                             apc->port_idx, txq->idx);
2073                 }
2074
2075                 mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT);
2076         }
2077
2078         return 0;
2079 out:
2080         mana_destroy_txq(apc);
2081         return err;
2082 }
2083
2084 static void
2085 mana_destroy_rxq(struct mana_port_context *apc, struct mana_rxq *rxq,
2086     bool validate_state)
2087 {
2088         struct gdma_context *gc = apc->ac->gdma_dev->gdma_context;
2089         struct mana_recv_buf_oob *rx_oob;
2090         int i;
2091
2092         if (!rxq)
2093                 return;
2094
2095         if (validate_state) {
2096                 /*
2097                  * XXX Cancel and drain cleanup task queue here.
2098                  */
2099                 ;
2100         }
2101
2102         mana_destroy_wq_obj(apc, GDMA_RQ, rxq->rxobj);
2103
2104         mana_deinit_cq(apc, &rxq->rx_cq);
2105
2106         mana_free_counters((counter_u64_t *)&rxq->stats,
2107             sizeof(rxq->stats));
2108
2109         /* Free LRO resources */
2110         tcp_lro_free(&rxq->lro);
2111
2112         for (i = 0; i < rxq->num_rx_buf; i++) {
2113                 rx_oob = &rxq->rx_oobs[i];
2114
2115                 if (rx_oob->mbuf)
2116                         mana_unload_rx_mbuf(apc, rxq, rx_oob, true);
2117
2118                 bus_dmamap_destroy(apc->rx_buf_tag, rx_oob->dma_map);
2119         }
2120
2121         if (rxq->gdma_rq)
2122                 mana_gd_destroy_queue(gc, rxq->gdma_rq);
2123
2124         free(rxq, M_DEVBUF);
2125 }
2126
2127 #define MANA_WQE_HEADER_SIZE 16
2128 #define MANA_WQE_SGE_SIZE 16
2129
2130 static int
2131 mana_alloc_rx_wqe(struct mana_port_context *apc,
2132     struct mana_rxq *rxq, uint32_t *rxq_size, uint32_t *cq_size)
2133 {
2134         struct mana_recv_buf_oob *rx_oob;
2135         uint32_t buf_idx;
2136         int err;
2137
2138         if (rxq->datasize == 0 || rxq->datasize > PAGE_SIZE) {
2139                 mana_err(NULL,
2140                     "WARNING: Invalid rxq datasize %u\n", rxq->datasize);
2141         }
2142
2143         *rxq_size = 0;
2144         *cq_size = 0;
2145
2146         for (buf_idx = 0; buf_idx < rxq->num_rx_buf; buf_idx++) {
2147                 rx_oob = &rxq->rx_oobs[buf_idx];
2148                 memset(rx_oob, 0, sizeof(*rx_oob));
2149
2150                 err = bus_dmamap_create(apc->rx_buf_tag, 0,
2151                     &rx_oob->dma_map);
2152                 if (err) {
2153                         mana_err(NULL,
2154                             "Failed to  create rx DMA map for buf %d\n",
2155                             buf_idx);
2156                         return err;
2157                 }
2158
2159                 err = mana_load_rx_mbuf(apc, rxq, rx_oob, true);
2160                 if (err) {
2161                         mana_err(NULL,
2162                             "Failed to  create rx DMA map for buf %d\n",
2163                             buf_idx);
2164                         bus_dmamap_destroy(apc->rx_buf_tag, rx_oob->dma_map);
2165                         return err;
2166                 }
2167
2168                 rx_oob->wqe_req.sgl = rx_oob->sgl;
2169                 rx_oob->wqe_req.num_sge = rx_oob->num_sge;
2170                 rx_oob->wqe_req.inline_oob_size = 0;
2171                 rx_oob->wqe_req.inline_oob_data = NULL;
2172                 rx_oob->wqe_req.flags = 0;
2173                 rx_oob->wqe_req.client_data_unit = 0;
2174
2175                 *rxq_size += ALIGN(MANA_WQE_HEADER_SIZE +
2176                                    MANA_WQE_SGE_SIZE * rx_oob->num_sge, 32);
2177                 *cq_size += COMP_ENTRY_SIZE;
2178         }
2179
2180         return 0;
2181 }
2182
2183 static int
2184 mana_push_wqe(struct mana_rxq *rxq)
2185 {
2186         struct mana_recv_buf_oob *rx_oob;
2187         uint32_t buf_idx;
2188         int err;
2189
2190         for (buf_idx = 0; buf_idx < rxq->num_rx_buf; buf_idx++) {
2191                 rx_oob = &rxq->rx_oobs[buf_idx];
2192
2193                 err = mana_gd_post_and_ring(rxq->gdma_rq, &rx_oob->wqe_req,
2194                     &rx_oob->wqe_inf);
2195                 if (err)
2196                         return ENOSPC;
2197         }
2198
2199         return 0;
2200 }
2201
2202 static struct mana_rxq *
2203 mana_create_rxq(struct mana_port_context *apc, uint32_t rxq_idx,
2204     struct mana_eq *eq, struct ifnet *ndev)
2205 {
2206         struct gdma_dev *gd = apc->ac->gdma_dev;
2207         struct mana_obj_spec wq_spec;
2208         struct mana_obj_spec cq_spec;
2209         struct gdma_queue_spec spec;
2210         struct mana_cq *cq = NULL;
2211         uint32_t cq_size, rq_size;
2212         struct gdma_context *gc;
2213         struct mana_rxq *rxq;
2214         int err;
2215
2216         gc = gd->gdma_context;
2217
2218         rxq = malloc(sizeof(*rxq) +
2219             RX_BUFFERS_PER_QUEUE * sizeof(struct mana_recv_buf_oob),
2220             M_DEVBUF, M_WAITOK | M_ZERO);
2221         if (!rxq)
2222                 return NULL;
2223
2224         rxq->ndev = ndev;
2225         rxq->num_rx_buf = RX_BUFFERS_PER_QUEUE;
2226         rxq->rxq_idx = rxq_idx;
2227         /*
2228          * Minimum size is MCLBYTES(2048) bytes for a mbuf cluster.
2229          * Now we just allow maximum size of 4096.
2230          */
2231         rxq->datasize = ALIGN(apc->frame_size, MCLBYTES);
2232         if (rxq->datasize > MAX_FRAME_SIZE)
2233                 rxq->datasize = MAX_FRAME_SIZE;
2234
2235         mana_dbg(NULL, "Setting rxq %d datasize %d\n",
2236             rxq_idx, rxq->datasize);
2237
2238         rxq->rxobj = INVALID_MANA_HANDLE;
2239
2240         err = mana_alloc_rx_wqe(apc, rxq, &rq_size, &cq_size);
2241         if (err)
2242                 goto out;
2243
2244         /* Create LRO for the RQ */
2245         if (ndev->if_capenable & IFCAP_LRO) {
2246                 err = tcp_lro_init(&rxq->lro);
2247                 if (err) {
2248                         if_printf(ndev, "Failed to create LRO for rxq %d\n",
2249                             rxq_idx);
2250                 } else {
2251                         rxq->lro.ifp = ndev;
2252                 }
2253         }
2254
2255         mana_alloc_counters((counter_u64_t *)&rxq->stats,
2256             sizeof(rxq->stats));
2257
2258         rq_size = ALIGN(rq_size, PAGE_SIZE);
2259         cq_size = ALIGN(cq_size, PAGE_SIZE);
2260
2261         /* Create RQ */
2262         memset(&spec, 0, sizeof(spec));
2263         spec.type = GDMA_RQ;
2264         spec.monitor_avl_buf = true;
2265         spec.queue_size = rq_size;
2266         err = mana_gd_create_mana_wq_cq(gd, &spec, &rxq->gdma_rq);
2267         if (err)
2268                 goto out;
2269
2270         /* Create RQ's CQ */
2271         cq = &rxq->rx_cq;
2272         cq->type = MANA_CQ_TYPE_RX;
2273         cq->rxq = rxq;
2274
2275         memset(&spec, 0, sizeof(spec));
2276         spec.type = GDMA_CQ;
2277         spec.monitor_avl_buf = false;
2278         spec.queue_size = cq_size;
2279         spec.cq.callback = mana_schedule_task;
2280         spec.cq.parent_eq = eq->eq;
2281         spec.cq.context = cq;
2282         err = mana_gd_create_mana_wq_cq(gd, &spec, &cq->gdma_cq);
2283         if (err)
2284                 goto out;
2285
2286         memset(&wq_spec, 0, sizeof(wq_spec));
2287         memset(&cq_spec, 0, sizeof(cq_spec));
2288         wq_spec.gdma_region = rxq->gdma_rq->mem_info.gdma_region;
2289         wq_spec.queue_size = rxq->gdma_rq->queue_size;
2290
2291         cq_spec.gdma_region = cq->gdma_cq->mem_info.gdma_region;
2292         cq_spec.queue_size = cq->gdma_cq->queue_size;
2293         cq_spec.modr_ctx_id = 0;
2294         cq_spec.attached_eq = cq->gdma_cq->cq.parent->id;
2295
2296         err = mana_create_wq_obj(apc, apc->port_handle, GDMA_RQ,
2297             &wq_spec, &cq_spec, &rxq->rxobj);
2298         if (err)
2299                 goto out;
2300
2301         rxq->gdma_rq->id = wq_spec.queue_index;
2302         cq->gdma_cq->id = cq_spec.queue_index;
2303
2304         rxq->gdma_rq->mem_info.gdma_region = GDMA_INVALID_DMA_REGION;
2305         cq->gdma_cq->mem_info.gdma_region = GDMA_INVALID_DMA_REGION;
2306
2307         rxq->gdma_id = rxq->gdma_rq->id;
2308         cq->gdma_id = cq->gdma_cq->id;
2309
2310         err = mana_push_wqe(rxq);
2311         if (err)
2312                 goto out;
2313
2314         if (cq->gdma_id >= gc->max_num_cqs) {
2315                 err = EINVAL;
2316                 goto out;
2317         }
2318
2319         gc->cq_table[cq->gdma_id] = cq->gdma_cq;
2320
2321         /* Allocate and start the cleanup task on CQ */
2322         cq->do_not_ring_db = false;
2323
2324         NET_TASK_INIT(&cq->cleanup_task, 0, mana_poll, cq);
2325         cq->cleanup_tq =
2326             taskqueue_create_fast("mana rx cq cleanup",
2327             M_WAITOK, taskqueue_thread_enqueue,
2328             &cq->cleanup_tq);
2329
2330         if (apc->last_rx_cq_bind_cpu < 0)
2331                 apc->last_rx_cq_bind_cpu = CPU_FIRST();
2332         cq->cpu = apc->last_rx_cq_bind_cpu;
2333         apc->last_rx_cq_bind_cpu = CPU_NEXT(apc->last_rx_cq_bind_cpu);
2334
2335         if (apc->bind_cleanup_thread_cpu) {
2336                 cpuset_t cpu_mask;
2337                 CPU_SETOF(cq->cpu, &cpu_mask);
2338                 taskqueue_start_threads_cpuset(&cq->cleanup_tq,
2339                     1, PI_NET, &cpu_mask,
2340                     "mana cq p%u-rx%u-cpu%d",
2341                     apc->port_idx, rxq->rxq_idx, cq->cpu);
2342         } else {
2343                 taskqueue_start_threads(&cq->cleanup_tq, 1,
2344                     PI_NET, "mana cq p%u-rx%u",
2345                     apc->port_idx, rxq->rxq_idx);
2346         }
2347
2348         mana_gd_ring_cq(cq->gdma_cq, SET_ARM_BIT);
2349 out:
2350         if (!err)
2351                 return rxq;
2352
2353         if_printf(ndev, "Failed to create RXQ: err = %d\n", err);
2354
2355         mana_destroy_rxq(apc, rxq, false);
2356
2357         if (cq)
2358                 mana_deinit_cq(apc, cq);
2359
2360         return NULL;
2361 }
2362
2363 static int
2364 mana_add_rx_queues(struct mana_port_context *apc, struct ifnet *ndev)
2365 {
2366         struct mana_context *ac = apc->ac;
2367         struct mana_rxq *rxq;
2368         int err = 0;
2369         int i;
2370
2371         for (i = 0; i < apc->num_queues; i++) {
2372                 rxq = mana_create_rxq(apc, i, &ac->eqs[i], ndev);
2373                 if (!rxq) {
2374                         err = ENOMEM;
2375                         goto out;
2376                 }
2377
2378                 apc->rxqs[i] = rxq;
2379         }
2380
2381         apc->default_rxobj = apc->rxqs[0]->rxobj;
2382 out:
2383         return err;
2384 }
2385
2386 static void
2387 mana_destroy_vport(struct mana_port_context *apc)
2388 {
2389         struct mana_rxq *rxq;
2390         uint32_t rxq_idx;
2391
2392         for (rxq_idx = 0; rxq_idx < apc->num_queues; rxq_idx++) {
2393                 rxq = apc->rxqs[rxq_idx];
2394                 if (!rxq)
2395                         continue;
2396
2397                 mana_destroy_rxq(apc, rxq, true);
2398                 apc->rxqs[rxq_idx] = NULL;
2399         }
2400
2401         mana_destroy_txq(apc);
2402 }
2403
2404 static int
2405 mana_create_vport(struct mana_port_context *apc, struct ifnet *net)
2406 {
2407         struct gdma_dev *gd = apc->ac->gdma_dev;
2408         int err;
2409
2410         apc->default_rxobj = INVALID_MANA_HANDLE;
2411
2412         err = mana_cfg_vport(apc, gd->pdid, gd->doorbell);
2413         if (err)
2414                 return err;
2415
2416         return mana_create_txq(apc, net);
2417 }
2418
2419
2420 static void mana_rss_table_init(struct mana_port_context *apc)
2421 {
2422         int i;
2423
2424         for (i = 0; i < MANA_INDIRECT_TABLE_SIZE; i++)
2425                 apc->indir_table[i] = i % apc->num_queues;
2426 }
2427
2428 int mana_config_rss(struct mana_port_context *apc, enum TRI_STATE rx,
2429                     bool update_hash, bool update_tab)
2430 {
2431         uint32_t queue_idx;
2432         int err;
2433         int i;
2434
2435         if (update_tab) {
2436                 for (i = 0; i < MANA_INDIRECT_TABLE_SIZE; i++) {
2437                         queue_idx = apc->indir_table[i];
2438                         apc->rxobj_table[i] = apc->rxqs[queue_idx]->rxobj;
2439                 }
2440         }
2441
2442         err = mana_cfg_vport_steering(apc, rx, true, update_hash, update_tab);
2443         if (err)
2444                 return err;
2445
2446         mana_fence_rqs(apc);
2447
2448         return 0;
2449 }
2450
2451 static int
2452 mana_init_port(struct ifnet *ndev)
2453 {
2454         struct mana_port_context *apc = if_getsoftc(ndev);
2455         uint32_t max_txq, max_rxq, max_queues;
2456         int port_idx = apc->port_idx;
2457         uint32_t num_indirect_entries;
2458         int err;
2459
2460         err = mana_init_port_context(apc);
2461         if (err)
2462                 return err;
2463
2464         err = mana_query_vport_cfg(apc, port_idx, &max_txq, &max_rxq,
2465             &num_indirect_entries);
2466         if (err) {
2467                 if_printf(ndev, "Failed to query info for vPort %d\n",
2468                     port_idx);
2469                 goto reset_apc;
2470         }
2471
2472         max_queues = min_t(uint32_t, max_txq, max_rxq);
2473         if (apc->max_queues > max_queues)
2474                 apc->max_queues = max_queues;
2475
2476         if (apc->num_queues > apc->max_queues)
2477                 apc->num_queues = apc->max_queues;
2478
2479         return 0;
2480
2481 reset_apc:
2482         bus_dma_tag_destroy(apc->rx_buf_tag);
2483         apc->rx_buf_tag = NULL;
2484         free(apc->rxqs, M_DEVBUF);
2485         apc->rxqs = NULL;
2486         return err;
2487 }
2488
2489 int
2490 mana_alloc_queues(struct ifnet *ndev)
2491 {
2492         struct mana_port_context *apc = if_getsoftc(ndev);
2493         int err;
2494
2495         err = mana_create_vport(apc, ndev);
2496         if (err)
2497                 return err;
2498
2499         err = mana_add_rx_queues(apc, ndev);
2500         if (err)
2501                 goto destroy_vport;
2502
2503         apc->rss_state = apc->num_queues > 1 ? TRI_STATE_TRUE : TRI_STATE_FALSE;
2504
2505         mana_rss_table_init(apc);
2506
2507         err = mana_config_rss(apc, TRI_STATE_TRUE, true, true);
2508         if (err)
2509                 goto destroy_vport;
2510
2511         return 0;
2512
2513 destroy_vport:
2514         mana_destroy_vport(apc);
2515         return err;
2516 }
2517
2518 static int
2519 mana_up(struct mana_port_context *apc)
2520 {
2521         int err;
2522
2523         mana_dbg(NULL, "mana_up called\n");
2524
2525         err = mana_alloc_queues(apc->ndev);
2526         if (err) {
2527                 mana_err(NULL, "Faile alloc mana queues: %d\n", err);
2528                 return err;
2529         }
2530
2531         /* Add queue specific sysctl */
2532         mana_sysctl_add_queues(apc);
2533
2534         apc->port_is_up = true;
2535
2536         /* Ensure port state updated before txq state */
2537         wmb();
2538
2539         if_link_state_change(apc->ndev, LINK_STATE_UP);
2540         if_setdrvflagbits(apc->ndev, IFF_DRV_RUNNING, IFF_DRV_OACTIVE);
2541
2542         return 0;
2543 }
2544
2545
2546 static void
2547 mana_init(void *arg)
2548 {
2549         struct mana_port_context *apc = (struct mana_port_context *)arg;
2550
2551         MANA_APC_LOCK_LOCK(apc);
2552         if (!apc->port_is_up) {
2553                 mana_up(apc);
2554         }
2555         MANA_APC_LOCK_UNLOCK(apc);
2556 }
2557
2558 static int
2559 mana_dealloc_queues(struct ifnet *ndev)
2560 {
2561         struct mana_port_context *apc = if_getsoftc(ndev);
2562         struct mana_txq *txq;
2563         int i, err;
2564
2565         if (apc->port_is_up)
2566                 return EINVAL;
2567
2568         /* No packet can be transmitted now since apc->port_is_up is false.
2569          * There is still a tiny chance that mana_poll_tx_cq() can re-enable
2570          * a txq because it may not timely see apc->port_is_up being cleared
2571          * to false, but it doesn't matter since mana_start_xmit() drops any
2572          * new packets due to apc->port_is_up being false.
2573          *
2574          * Drain all the in-flight TX packets
2575          */
2576         for (i = 0; i < apc->num_queues; i++) {
2577                 txq = &apc->tx_qp[i].txq;
2578
2579                 struct mana_cq *tx_cq = &apc->tx_qp[i].tx_cq;
2580                 struct mana_cq *rx_cq = &(apc->rxqs[i]->rx_cq);
2581
2582                 tx_cq->do_not_ring_db = true;
2583                 rx_cq->do_not_ring_db = true;
2584
2585                 /* Schedule a cleanup task */
2586                 taskqueue_enqueue(tx_cq->cleanup_tq, &tx_cq->cleanup_task);
2587
2588                 while (atomic_read(&txq->pending_sends) > 0)
2589                         usleep_range(1000, 2000);
2590         }
2591
2592         /* We're 100% sure the queues can no longer be woken up, because
2593          * we're sure now mana_poll_tx_cq() can't be running.
2594          */
2595
2596         apc->rss_state = TRI_STATE_FALSE;
2597         err = mana_config_rss(apc, TRI_STATE_FALSE, false, false);
2598         if (err) {
2599                 if_printf(ndev, "Failed to disable vPort: %d\n", err);
2600                 return err;
2601         }
2602
2603         mana_destroy_vport(apc);
2604
2605         return 0;
2606 }
2607
2608 static int
2609 mana_down(struct mana_port_context *apc)
2610 {
2611         int err = 0;
2612
2613         apc->port_st_save = apc->port_is_up;
2614         apc->port_is_up = false;
2615
2616         /* Ensure port state updated before txq state */
2617         wmb();
2618
2619         if (apc->port_st_save) {
2620                 if_setdrvflagbits(apc->ndev, IFF_DRV_OACTIVE,
2621                     IFF_DRV_RUNNING);
2622                 if_link_state_change(apc->ndev, LINK_STATE_DOWN);
2623
2624                 mana_sysctl_free_queues(apc);
2625
2626                 err = mana_dealloc_queues(apc->ndev);
2627                 if (err) {
2628                         if_printf(apc->ndev,
2629                             "Failed to bring down mana interface: %d\n", err);
2630                 }
2631         }
2632
2633         return err;
2634 }
2635
2636 int
2637 mana_detach(struct ifnet *ndev)
2638 {
2639         struct mana_port_context *apc = if_getsoftc(ndev);
2640         int err;
2641
2642         ether_ifdetach(ndev);
2643
2644         if (!apc)
2645                 return 0;
2646
2647         MANA_APC_LOCK_LOCK(apc);
2648         err = mana_down(apc);
2649         MANA_APC_LOCK_UNLOCK(apc);
2650
2651         mana_cleanup_port_context(apc);
2652
2653         MANA_APC_LOCK_DESTROY(apc);
2654
2655         free(apc, M_DEVBUF);
2656
2657         return err;
2658 }
2659
2660 static int
2661 mana_probe_port(struct mana_context *ac, int port_idx,
2662     struct ifnet **ndev_storage)
2663 {
2664         struct gdma_context *gc = ac->gdma_dev->gdma_context;
2665         struct mana_port_context *apc;
2666         struct ifnet *ndev;
2667         int err;
2668
2669         ndev = if_alloc_dev(IFT_ETHER, gc->dev);
2670         if (!ndev) {
2671                 mana_err(NULL, "Failed to allocate ifnet struct\n");
2672                 return ENOMEM;
2673         }
2674
2675         *ndev_storage = ndev;
2676
2677         apc = malloc(sizeof(*apc), M_DEVBUF, M_WAITOK | M_ZERO);
2678         if (!apc) {
2679                 mana_err(NULL, "Failed to allocate port context\n");
2680                 err = ENOMEM;
2681                 goto free_net;
2682         }
2683
2684         apc->ac = ac;
2685         apc->ndev = ndev;
2686         apc->max_queues = gc->max_num_queues;
2687         apc->num_queues = min_t(unsigned int,
2688             gc->max_num_queues, MANA_MAX_NUM_QUEUES);
2689         apc->port_handle = INVALID_MANA_HANDLE;
2690         apc->port_idx = port_idx;
2691         apc->frame_size = DEFAULT_FRAME_SIZE;
2692         apc->last_tx_cq_bind_cpu = -1;
2693         apc->last_rx_cq_bind_cpu = -1;
2694
2695         MANA_APC_LOCK_INIT(apc);
2696
2697         if_initname(ndev, device_get_name(gc->dev), port_idx);
2698         if_setdev(ndev,gc->dev);
2699         if_setsoftc(ndev, apc);
2700
2701         if_setflags(ndev, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST);
2702         if_setinitfn(ndev, mana_init);
2703         if_settransmitfn(ndev, mana_start_xmit);
2704         if_setqflushfn(ndev, mana_qflush);
2705         if_setioctlfn(ndev, mana_ioctl);
2706         if_setgetcounterfn(ndev, mana_get_counter);
2707
2708         if_setmtu(ndev, ETHERMTU);
2709         if_setbaudrate(ndev, IF_Gbps(100));
2710
2711         mana_rss_key_fill(apc->hashkey, MANA_HASH_KEY_SIZE);
2712
2713         err = mana_init_port(ndev);
2714         if (err)
2715                 goto reset_apc;
2716
2717         ndev->if_capabilities |= IFCAP_TXCSUM | IFCAP_TXCSUM_IPV6;
2718         ndev->if_capabilities |= IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6;
2719         ndev->if_capabilities |= IFCAP_TSO4 | IFCAP_TSO6;
2720
2721         ndev->if_capabilities |= IFCAP_LRO | IFCAP_LINKSTATE;
2722
2723         /* Enable all available capabilities by default. */
2724         ndev->if_capenable = ndev->if_capabilities;
2725
2726         /* TSO parameters */
2727         ndev->if_hw_tsomax = MAX_MBUF_FRAGS * MANA_TSO_MAXSEG_SZ -
2728             (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
2729         ndev->if_hw_tsomaxsegcount = MAX_MBUF_FRAGS;
2730         ndev->if_hw_tsomaxsegsize = PAGE_SIZE;
2731
2732         ifmedia_init(&apc->media, IFM_IMASK,
2733             mana_ifmedia_change, mana_ifmedia_status);
2734         ifmedia_add(&apc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2735         ifmedia_set(&apc->media, IFM_ETHER | IFM_AUTO);
2736
2737         ether_ifattach(ndev, apc->mac_addr);
2738
2739         /* Initialize statistics */
2740         mana_alloc_counters((counter_u64_t *)&apc->port_stats,
2741             sizeof(struct mana_port_stats));
2742         mana_sysctl_add_port(apc);
2743
2744         /* Tell the stack that the interface is not active */
2745         if_setdrvflagbits(ndev, IFF_DRV_OACTIVE, IFF_DRV_RUNNING);
2746
2747         return 0;
2748
2749 reset_apc:
2750         free(apc, M_DEVBUF);
2751 free_net:
2752         *ndev_storage = NULL;
2753         if_printf(ndev, "Failed to probe vPort %d: %d\n", port_idx, err);
2754         if_free(ndev);
2755         return err;
2756 }
2757
2758 int mana_probe(struct gdma_dev *gd)
2759 {
2760         struct gdma_context *gc = gd->gdma_context;
2761         device_t dev = gc->dev;
2762         struct mana_context *ac;
2763         int err;
2764         int i;
2765
2766         device_printf(dev, "%s protocol version: %d.%d.%d\n", DEVICE_NAME,
2767                  MANA_MAJOR_VERSION, MANA_MINOR_VERSION, MANA_MICRO_VERSION);
2768
2769         err = mana_gd_register_device(gd);
2770         if (err)
2771                 return err;
2772
2773         ac = malloc(sizeof(*ac), M_DEVBUF, M_WAITOK | M_ZERO);
2774         if (!ac)
2775                 return ENOMEM;
2776
2777         ac->gdma_dev = gd;
2778         ac->num_ports = 1;
2779         gd->driver_data = ac;
2780
2781         err = mana_create_eq(ac);
2782         if (err)
2783                 goto out;
2784
2785         err = mana_query_device_cfg(ac, MANA_MAJOR_VERSION, MANA_MINOR_VERSION,
2786             MANA_MICRO_VERSION, &ac->num_ports);
2787         if (err)
2788                 goto out;
2789
2790         if (ac->num_ports > MAX_PORTS_IN_MANA_DEV)
2791                 ac->num_ports = MAX_PORTS_IN_MANA_DEV;
2792
2793         for (i = 0; i < ac->num_ports; i++) {
2794                 err = mana_probe_port(ac, i, &ac->ports[i]);
2795                 if (err) {
2796                         device_printf(dev,
2797                             "Failed to probe mana port %d\n", i);
2798                         break;
2799                 }
2800         }
2801
2802 out:
2803         if (err)
2804                 mana_remove(gd);
2805
2806         return err;
2807 }
2808
2809 void
2810 mana_remove(struct gdma_dev *gd)
2811 {
2812         struct gdma_context *gc = gd->gdma_context;
2813         struct mana_context *ac = gd->driver_data;
2814         device_t dev = gc->dev;
2815         struct ifnet *ndev;
2816         int i;
2817
2818         for (i = 0; i < ac->num_ports; i++) {
2819                 ndev = ac->ports[i];
2820                 if (!ndev) {
2821                         if (i == 0)
2822                                 device_printf(dev, "No net device to remove\n");
2823                         goto out;
2824                 }
2825
2826                 mana_detach(ndev);
2827
2828                 if_free(ndev);
2829         }
2830
2831         mana_destroy_eq(ac);
2832
2833 out:
2834         mana_gd_deregister_device(gd);
2835         gd->driver_data = NULL;
2836         gd->gdma_context = NULL;
2837         free(ac, M_DEVBUF);
2838 }