1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) Meta Platforms, Inc. and affiliates. */
3
4 #include <linux/bitfield.h>
5 #include <linux/bpf.h>
6 #include <linux/bpf_trace.h>
7 #include <linux/iopoll.h>
8 #include <linux/pci.h>
9 #include <net/netdev_queues.h>
10 #include <net/page_pool/helpers.h>
11 #include <net/tcp.h>
12 #include <net/xdp.h>
13
14 #include "fbnic.h"
15 #include "fbnic_csr.h"
16 #include "fbnic_netdev.h"
17 #include "fbnic_txrx.h"
18
19 enum {
20 FBNIC_XDP_PASS = 0,
21 FBNIC_XDP_CONSUME,
22 FBNIC_XDP_TX,
23 FBNIC_XDP_LEN_ERR,
24 };
25
26 enum {
27 FBNIC_XMIT_CB_TS = 0x01,
28 };
29
30 struct fbnic_xmit_cb {
31 u32 bytecount;
32 u16 gso_segs;
33 u8 desc_count;
34 u8 flags;
35 int hw_head;
36 };
37
38 #define FBNIC_XMIT_CB(__skb) ((struct fbnic_xmit_cb *)((__skb)->cb))
39
40 #define FBNIC_XMIT_NOUNMAP ((void *)1)
41
fbnic_ring_csr_base(const struct fbnic_ring * ring)42 static u32 __iomem *fbnic_ring_csr_base(const struct fbnic_ring *ring)
43 {
44 unsigned long csr_base = (unsigned long)ring->doorbell;
45
46 csr_base &= ~(FBNIC_QUEUE_STRIDE * sizeof(u32) - 1);
47
48 return (u32 __iomem *)csr_base;
49 }
50
fbnic_ring_rd32(struct fbnic_ring * ring,unsigned int csr)51 static u32 fbnic_ring_rd32(struct fbnic_ring *ring, unsigned int csr)
52 {
53 u32 __iomem *csr_base = fbnic_ring_csr_base(ring);
54
55 return readl(csr_base + csr);
56 }
57
fbnic_ring_wr32(struct fbnic_ring * ring,unsigned int csr,u32 val)58 static void fbnic_ring_wr32(struct fbnic_ring *ring, unsigned int csr, u32 val)
59 {
60 u32 __iomem *csr_base = fbnic_ring_csr_base(ring);
61
62 writel(val, csr_base + csr);
63 }
64
65 /**
66 * fbnic_ts40_to_ns() - convert descriptor timestamp to PHC time
67 * @fbn: netdev priv of the FB NIC
68 * @ts40: timestamp read from a descriptor
69 *
70 * Return: u64 value of PHC time in nanoseconds
71 *
72 * Convert truncated 40 bit device timestamp as read from a descriptor
73 * to the full PHC time in nanoseconds.
74 */
fbnic_ts40_to_ns(struct fbnic_net * fbn,u64 ts40)75 static __maybe_unused u64 fbnic_ts40_to_ns(struct fbnic_net *fbn, u64 ts40)
76 {
77 unsigned int s;
78 u64 time_ns;
79 s64 offset;
80 u8 ts_top;
81 u32 high;
82
83 do {
84 s = u64_stats_fetch_begin(&fbn->time_seq);
85 offset = READ_ONCE(fbn->time_offset);
86 } while (u64_stats_fetch_retry(&fbn->time_seq, s));
87
88 high = READ_ONCE(fbn->time_high);
89
90 /* Bits 63..40 from periodic clock reads, 39..0 from ts40 */
91 time_ns = (u64)(high >> 8) << 40 | ts40;
92
93 /* Compare bits 32-39 between periodic reads and ts40,
94 * see if HW clock may have wrapped since last read. We are sure
95 * that periodic reads are always at least ~1 minute behind, so
96 * this logic works perfectly fine.
97 */
98 ts_top = ts40 >> 32;
99 if (ts_top < (u8)high && (u8)high - ts_top > U8_MAX / 2)
100 time_ns += 1ULL << 40;
101
102 return time_ns + offset;
103 }
104
fbnic_desc_unused(struct fbnic_ring * ring)105 static unsigned int fbnic_desc_unused(struct fbnic_ring *ring)
106 {
107 return (ring->head - ring->tail - 1) & ring->size_mask;
108 }
109
fbnic_desc_used(struct fbnic_ring * ring)110 static unsigned int fbnic_desc_used(struct fbnic_ring *ring)
111 {
112 return (ring->tail - ring->head) & ring->size_mask;
113 }
114
txring_txq(const struct net_device * dev,const struct fbnic_ring * ring)115 static struct netdev_queue *txring_txq(const struct net_device *dev,
116 const struct fbnic_ring *ring)
117 {
118 return netdev_get_tx_queue(dev, ring->q_idx);
119 }
120
fbnic_maybe_stop_tx(const struct net_device * dev,struct fbnic_ring * ring,const unsigned int size)121 static int fbnic_maybe_stop_tx(const struct net_device *dev,
122 struct fbnic_ring *ring,
123 const unsigned int size)
124 {
125 struct netdev_queue *txq = txring_txq(dev, ring);
126 int res;
127
128 res = netif_txq_maybe_stop(txq, fbnic_desc_unused(ring), size,
129 FBNIC_TX_DESC_WAKEUP);
130 if (!res) {
131 u64_stats_update_begin(&ring->stats.syncp);
132 ring->stats.twq.stop++;
133 u64_stats_update_end(&ring->stats.syncp);
134 }
135
136 return !res;
137 }
138
fbnic_tx_sent_queue(struct sk_buff * skb,struct fbnic_ring * ring)139 static bool fbnic_tx_sent_queue(struct sk_buff *skb, struct fbnic_ring *ring)
140 {
141 struct netdev_queue *dev_queue = txring_txq(skb->dev, ring);
142 unsigned int bytecount = FBNIC_XMIT_CB(skb)->bytecount;
143 bool xmit_more = netdev_xmit_more();
144
145 /* TBD: Request completion more often if xmit_more becomes large */
146
147 return __netdev_tx_sent_queue(dev_queue, bytecount, xmit_more);
148 }
149
fbnic_unmap_single_twd(struct device * dev,__le64 * twd)150 static void fbnic_unmap_single_twd(struct device *dev, __le64 *twd)
151 {
152 u64 raw_twd = le64_to_cpu(*twd);
153 unsigned int len;
154 dma_addr_t dma;
155
156 dma = FIELD_GET(FBNIC_TWD_ADDR_MASK, raw_twd);
157 len = FIELD_GET(FBNIC_TWD_LEN_MASK, raw_twd);
158
159 dma_unmap_single(dev, dma, len, DMA_TO_DEVICE);
160 }
161
fbnic_unmap_page_twd(struct device * dev,__le64 * twd)162 static void fbnic_unmap_page_twd(struct device *dev, __le64 *twd)
163 {
164 u64 raw_twd = le64_to_cpu(*twd);
165 unsigned int len;
166 dma_addr_t dma;
167
168 dma = FIELD_GET(FBNIC_TWD_ADDR_MASK, raw_twd);
169 len = FIELD_GET(FBNIC_TWD_LEN_MASK, raw_twd);
170
171 dma_unmap_page(dev, dma, len, DMA_TO_DEVICE);
172 }
173
174 #define FBNIC_TWD_TYPE(_type) \
175 cpu_to_le64(FIELD_PREP(FBNIC_TWD_TYPE_MASK, FBNIC_TWD_TYPE_##_type))
176
fbnic_tx_tstamp(struct sk_buff * skb)177 static bool fbnic_tx_tstamp(struct sk_buff *skb)
178 {
179 struct fbnic_net *fbn;
180
181 if (!unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
182 return false;
183
184 fbn = netdev_priv(skb->dev);
185 if (fbn->hwtstamp_config.tx_type == HWTSTAMP_TX_OFF)
186 return false;
187
188 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
189 FBNIC_XMIT_CB(skb)->flags |= FBNIC_XMIT_CB_TS;
190 FBNIC_XMIT_CB(skb)->hw_head = -1;
191
192 return true;
193 }
194
195 static bool
fbnic_tx_lso(struct fbnic_ring * ring,struct sk_buff * skb,struct skb_shared_info * shinfo,__le64 * meta,unsigned int * l2len,unsigned int * i3len)196 fbnic_tx_lso(struct fbnic_ring *ring, struct sk_buff *skb,
197 struct skb_shared_info *shinfo, __le64 *meta,
198 unsigned int *l2len, unsigned int *i3len)
199 {
200 unsigned int l3_type, l4_type, l4len, hdrlen;
201 unsigned char *l4hdr;
202 __be16 payload_len;
203
204 if (unlikely(skb_cow_head(skb, 0)))
205 return true;
206
207 if (shinfo->gso_type & SKB_GSO_PARTIAL) {
208 l3_type = FBNIC_TWD_L3_TYPE_OTHER;
209 } else if (!skb->encapsulation) {
210 if (ip_hdr(skb)->version == 4)
211 l3_type = FBNIC_TWD_L3_TYPE_IPV4;
212 else
213 l3_type = FBNIC_TWD_L3_TYPE_IPV6;
214 } else {
215 unsigned int o3len;
216
217 o3len = skb_inner_network_header(skb) - skb_network_header(skb);
218 *i3len -= o3len;
219 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L3_OHLEN_MASK,
220 o3len / 2));
221 l3_type = FBNIC_TWD_L3_TYPE_V6V6;
222 }
223
224 l4hdr = skb_checksum_start(skb);
225 payload_len = cpu_to_be16(skb->len - (l4hdr - skb->data));
226
227 if (shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) {
228 struct tcphdr *tcph = (struct tcphdr *)l4hdr;
229
230 l4_type = FBNIC_TWD_L4_TYPE_TCP;
231 l4len = __tcp_hdrlen((struct tcphdr *)l4hdr);
232 csum_replace_by_diff(&tcph->check, (__force __wsum)payload_len);
233 } else {
234 struct udphdr *udph = (struct udphdr *)l4hdr;
235
236 l4_type = FBNIC_TWD_L4_TYPE_UDP;
237 l4len = sizeof(struct udphdr);
238 csum_replace_by_diff(&udph->check, (__force __wsum)payload_len);
239 }
240
241 hdrlen = (l4hdr - skb->data) + l4len;
242 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L3_TYPE_MASK, l3_type) |
243 FIELD_PREP(FBNIC_TWD_L4_TYPE_MASK, l4_type) |
244 FIELD_PREP(FBNIC_TWD_L4_HLEN_MASK, l4len / 4) |
245 FIELD_PREP(FBNIC_TWD_MSS_MASK, shinfo->gso_size) |
246 FBNIC_TWD_FLAG_REQ_LSO);
247
248 FBNIC_XMIT_CB(skb)->bytecount += (shinfo->gso_segs - 1) * hdrlen;
249 FBNIC_XMIT_CB(skb)->gso_segs = shinfo->gso_segs;
250
251 u64_stats_update_begin(&ring->stats.syncp);
252 ring->stats.twq.lso += shinfo->gso_segs;
253 u64_stats_update_end(&ring->stats.syncp);
254
255 return false;
256 }
257
258 static bool
fbnic_tx_offloads(struct fbnic_ring * ring,struct sk_buff * skb,__le64 * meta)259 fbnic_tx_offloads(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
260 {
261 struct skb_shared_info *shinfo = skb_shinfo(skb);
262 unsigned int l2len, i3len;
263
264 if (fbnic_tx_tstamp(skb))
265 *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_TS);
266
267 if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL))
268 return false;
269
270 l2len = skb_mac_header_len(skb);
271 i3len = skb_checksum_start(skb) - skb_network_header(skb);
272
273 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_CSUM_OFFSET_MASK,
274 skb->csum_offset / 2));
275
276 if (shinfo->gso_size) {
277 if (fbnic_tx_lso(ring, skb, shinfo, meta, &l2len, &i3len))
278 return true;
279 } else {
280 *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_CSO);
281 u64_stats_update_begin(&ring->stats.syncp);
282 ring->stats.twq.csum_partial++;
283 u64_stats_update_end(&ring->stats.syncp);
284 }
285
286 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L2_HLEN_MASK, l2len / 2) |
287 FIELD_PREP(FBNIC_TWD_L3_IHLEN_MASK, i3len / 2));
288 return false;
289 }
290
291 static void
fbnic_rx_csum(u64 rcd,struct sk_buff * skb,struct fbnic_ring * rcq,u64 * csum_cmpl,u64 * csum_none)292 fbnic_rx_csum(u64 rcd, struct sk_buff *skb, struct fbnic_ring *rcq,
293 u64 *csum_cmpl, u64 *csum_none)
294 {
295 skb_checksum_none_assert(skb);
296
297 if (unlikely(!(skb->dev->features & NETIF_F_RXCSUM))) {
298 (*csum_none)++;
299 return;
300 }
301
302 if (FIELD_GET(FBNIC_RCD_META_L4_CSUM_UNNECESSARY, rcd)) {
303 skb->ip_summed = CHECKSUM_UNNECESSARY;
304 } else {
305 u16 csum = FIELD_GET(FBNIC_RCD_META_L2_CSUM_MASK, rcd);
306
307 skb->ip_summed = CHECKSUM_COMPLETE;
308 skb->csum = (__force __wsum)csum;
309 (*csum_cmpl)++;
310 }
311 }
312
313 static bool
fbnic_tx_map(struct fbnic_ring * ring,struct sk_buff * skb,__le64 * meta)314 fbnic_tx_map(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
315 {
316 struct device *dev = skb->dev->dev.parent;
317 unsigned int tail = ring->tail, first;
318 unsigned int size, data_len;
319 skb_frag_t *frag;
320 bool is_net_iov;
321 dma_addr_t dma;
322 __le64 *twd;
323
324 ring->tx_buf[tail] = skb;
325
326 tail++;
327 tail &= ring->size_mask;
328 first = tail;
329
330 size = skb_headlen(skb);
331 data_len = skb->data_len;
332
333 if (size > FIELD_MAX(FBNIC_TWD_LEN_MASK))
334 goto dma_error;
335
336 is_net_iov = false;
337 dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
338
339 for (frag = &skb_shinfo(skb)->frags[0];; frag++) {
340 twd = &ring->desc[tail];
341
342 if (dma_mapping_error(dev, dma))
343 goto dma_error;
344
345 *twd = cpu_to_le64(FIELD_PREP(FBNIC_TWD_ADDR_MASK, dma) |
346 FIELD_PREP(FBNIC_TWD_LEN_MASK, size) |
347 FIELD_PREP(FBNIC_TWD_TYPE_MASK,
348 FBNIC_TWD_TYPE_AL));
349 if (is_net_iov)
350 ring->tx_buf[tail] = FBNIC_XMIT_NOUNMAP;
351
352 tail++;
353 tail &= ring->size_mask;
354
355 if (!data_len)
356 break;
357
358 size = skb_frag_size(frag);
359 data_len -= size;
360
361 if (size > FIELD_MAX(FBNIC_TWD_LEN_MASK))
362 goto dma_error;
363
364 is_net_iov = skb_frag_is_net_iov(frag);
365 dma = skb_frag_dma_map(dev, frag, 0, size, DMA_TO_DEVICE);
366 }
367
368 *twd |= FBNIC_TWD_TYPE(LAST_AL);
369
370 FBNIC_XMIT_CB(skb)->desc_count = ((twd - meta) + 1) & ring->size_mask;
371
372 ring->tail = tail;
373
374 /* Record SW timestamp */
375 skb_tx_timestamp(skb);
376
377 /* Verify there is room for another packet */
378 fbnic_maybe_stop_tx(skb->dev, ring, FBNIC_MAX_SKB_DESC);
379
380 if (fbnic_tx_sent_queue(skb, ring)) {
381 *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_COMPLETION);
382
383 /* Force DMA writes to flush before writing to tail */
384 dma_wmb();
385
386 writel(tail, ring->doorbell);
387 }
388
389 return false;
390 dma_error:
391 if (net_ratelimit())
392 netdev_err(skb->dev, "TX DMA map failed\n");
393
394 while (tail != first) {
395 tail--;
396 tail &= ring->size_mask;
397 twd = &ring->desc[tail];
398 if (tail == first)
399 fbnic_unmap_single_twd(dev, twd);
400 else if (ring->tx_buf[tail] == FBNIC_XMIT_NOUNMAP)
401 ring->tx_buf[tail] = NULL;
402 else
403 fbnic_unmap_page_twd(dev, twd);
404 }
405
406 return true;
407 }
408
409 #define FBNIC_MIN_FRAME_LEN 60
410
411 static netdev_tx_t
fbnic_xmit_frame_ring(struct sk_buff * skb,struct fbnic_ring * ring)412 fbnic_xmit_frame_ring(struct sk_buff *skb, struct fbnic_ring *ring)
413 {
414 __le64 *meta = &ring->desc[ring->tail];
415 u16 desc_needed;
416
417 if (skb_put_padto(skb, FBNIC_MIN_FRAME_LEN))
418 goto err_count;
419
420 /* Need: 1 descriptor per page,
421 * + 1 desc for skb_head,
422 * + 2 desc for metadata and timestamp metadata
423 * + 7 desc gap to keep tail from touching head
424 * otherwise try next time
425 */
426 desc_needed = skb_shinfo(skb)->nr_frags + 10;
427 if (fbnic_maybe_stop_tx(skb->dev, ring, desc_needed))
428 return NETDEV_TX_BUSY;
429
430 *meta = cpu_to_le64(FBNIC_TWD_FLAG_DEST_MAC);
431
432 /* Write all members within DWORD to condense this into 2 4B writes */
433 FBNIC_XMIT_CB(skb)->bytecount = skb->len;
434 FBNIC_XMIT_CB(skb)->gso_segs = 1;
435 FBNIC_XMIT_CB(skb)->desc_count = 0;
436 FBNIC_XMIT_CB(skb)->flags = 0;
437
438 if (fbnic_tx_offloads(ring, skb, meta))
439 goto err_free;
440
441 if (fbnic_tx_map(ring, skb, meta))
442 goto err_free;
443
444 return NETDEV_TX_OK;
445
446 err_free:
447 dev_kfree_skb_any(skb);
448 err_count:
449 u64_stats_update_begin(&ring->stats.syncp);
450 ring->stats.dropped++;
451 u64_stats_update_end(&ring->stats.syncp);
452 return NETDEV_TX_OK;
453 }
454
fbnic_xmit_frame(struct sk_buff * skb,struct net_device * dev)455 netdev_tx_t fbnic_xmit_frame(struct sk_buff *skb, struct net_device *dev)
456 {
457 struct fbnic_net *fbn = netdev_priv(dev);
458 unsigned int q_map = skb->queue_mapping;
459
460 return fbnic_xmit_frame_ring(skb, fbn->tx[q_map]);
461 }
462
463 static netdev_features_t
fbnic_features_check_encap_gso(struct sk_buff * skb,struct net_device * dev,netdev_features_t features,unsigned int l3len)464 fbnic_features_check_encap_gso(struct sk_buff *skb, struct net_device *dev,
465 netdev_features_t features, unsigned int l3len)
466 {
467 netdev_features_t skb_gso_features;
468 struct ipv6hdr *ip6_hdr;
469 unsigned char l4_hdr;
470 unsigned int start;
471 __be16 frag_off;
472
473 /* Require MANGLEID for GSO_PARTIAL of IPv4.
474 * In theory we could support TSO with single, innermost v4 header
475 * by pretending everything before it is L2, but that needs to be
476 * parsed case by case.. so leaving it for when the need arises.
477 */
478 if (!(features & NETIF_F_TSO_MANGLEID))
479 features &= ~NETIF_F_TSO;
480
481 skb_gso_features = skb_shinfo(skb)->gso_type;
482 skb_gso_features <<= NETIF_F_GSO_SHIFT;
483
484 /* We'd only clear the native GSO features, so don't bother validating
485 * if the match can only be on those supported thru GSO_PARTIAL.
486 */
487 if (!(skb_gso_features & FBNIC_TUN_GSO_FEATURES))
488 return features;
489
490 /* We can only do IPv6-in-IPv6, not v4-in-v6. It'd be nice
491 * to fall back to partial for this, or any failure below.
492 * This is just an optimization, UDPv4 will be caught later on.
493 */
494 if (skb_gso_features & NETIF_F_TSO)
495 return features & ~FBNIC_TUN_GSO_FEATURES;
496
497 /* Inner headers multiple of 2 */
498 if ((skb_inner_network_header(skb) - skb_network_header(skb)) % 2)
499 return features & ~FBNIC_TUN_GSO_FEATURES;
500
501 /* Encapsulated GSO packet, make 100% sure it's IPv6-in-IPv6. */
502 ip6_hdr = ipv6_hdr(skb);
503 if (ip6_hdr->version != 6)
504 return features & ~FBNIC_TUN_GSO_FEATURES;
505
506 l4_hdr = ip6_hdr->nexthdr;
507 start = (unsigned char *)ip6_hdr - skb->data + sizeof(struct ipv6hdr);
508 start = ipv6_skip_exthdr(skb, start, &l4_hdr, &frag_off);
509 if (frag_off || l4_hdr != IPPROTO_IPV6 ||
510 skb->data + start != skb_inner_network_header(skb))
511 return features & ~FBNIC_TUN_GSO_FEATURES;
512
513 return features;
514 }
515
516 netdev_features_t
fbnic_features_check(struct sk_buff * skb,struct net_device * dev,netdev_features_t features)517 fbnic_features_check(struct sk_buff *skb, struct net_device *dev,
518 netdev_features_t features)
519 {
520 unsigned int l2len, l3len;
521
522 if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL))
523 return features;
524
525 l2len = skb_mac_header_len(skb);
526 l3len = skb_checksum_start(skb) - skb_network_header(skb);
527
528 /* Check header lengths are multiple of 2.
529 * In case of 6in6 we support longer headers (IHLEN + OHLEN)
530 * but keep things simple for now, 512B is plenty.
531 */
532 if ((l2len | l3len | skb->csum_offset) % 2 ||
533 !FIELD_FIT(FBNIC_TWD_L2_HLEN_MASK, l2len / 2) ||
534 !FIELD_FIT(FBNIC_TWD_L3_IHLEN_MASK, l3len / 2) ||
535 !FIELD_FIT(FBNIC_TWD_CSUM_OFFSET_MASK, skb->csum_offset / 2))
536 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
537
538 if (likely(!skb->encapsulation) || !skb_is_gso(skb))
539 return features;
540
541 return fbnic_features_check_encap_gso(skb, dev, features, l3len);
542 }
543
fbnic_clean_twq0(struct fbnic_napi_vector * nv,int napi_budget,struct fbnic_ring * ring,bool discard,unsigned int hw_head)544 static void fbnic_clean_twq0(struct fbnic_napi_vector *nv, int napi_budget,
545 struct fbnic_ring *ring, bool discard,
546 unsigned int hw_head)
547 {
548 u64 total_bytes = 0, total_packets = 0, ts_lost = 0;
549 unsigned int head = ring->head;
550 struct netdev_queue *txq;
551 unsigned int clean_desc;
552
553 clean_desc = (hw_head - head) & ring->size_mask;
554
555 while (clean_desc) {
556 struct sk_buff *skb = ring->tx_buf[head];
557 unsigned int desc_cnt;
558
559 desc_cnt = FBNIC_XMIT_CB(skb)->desc_count;
560 if (desc_cnt > clean_desc)
561 break;
562
563 if (unlikely(FBNIC_XMIT_CB(skb)->flags & FBNIC_XMIT_CB_TS)) {
564 FBNIC_XMIT_CB(skb)->hw_head = hw_head;
565 if (likely(!discard))
566 break;
567 ts_lost++;
568 }
569
570 ring->tx_buf[head] = NULL;
571
572 clean_desc -= desc_cnt;
573
574 while (!(ring->desc[head] & FBNIC_TWD_TYPE(AL))) {
575 head++;
576 head &= ring->size_mask;
577 desc_cnt--;
578 }
579
580 fbnic_unmap_single_twd(nv->dev, &ring->desc[head]);
581 head++;
582 head &= ring->size_mask;
583 desc_cnt--;
584
585 while (desc_cnt--) {
586 if (ring->tx_buf[head] != FBNIC_XMIT_NOUNMAP)
587 fbnic_unmap_page_twd(nv->dev,
588 &ring->desc[head]);
589 else
590 ring->tx_buf[head] = NULL;
591 head++;
592 head &= ring->size_mask;
593 }
594
595 total_bytes += FBNIC_XMIT_CB(skb)->bytecount;
596 total_packets += FBNIC_XMIT_CB(skb)->gso_segs;
597
598 napi_consume_skb(skb, napi_budget);
599 }
600
601 if (!total_bytes)
602 return;
603
604 ring->head = head;
605
606 txq = txring_txq(nv->napi.dev, ring);
607
608 if (unlikely(discard)) {
609 u64_stats_update_begin(&ring->stats.syncp);
610 ring->stats.dropped += total_packets;
611 ring->stats.twq.ts_lost += ts_lost;
612 u64_stats_update_end(&ring->stats.syncp);
613
614 netdev_tx_completed_queue(txq, total_packets, total_bytes);
615 return;
616 }
617
618 u64_stats_update_begin(&ring->stats.syncp);
619 ring->stats.bytes += total_bytes;
620 ring->stats.packets += total_packets;
621 u64_stats_update_end(&ring->stats.syncp);
622
623 if (!netif_txq_completed_wake(txq, total_packets, total_bytes,
624 fbnic_desc_unused(ring),
625 FBNIC_TX_DESC_WAKEUP)) {
626 u64_stats_update_begin(&ring->stats.syncp);
627 ring->stats.twq.wake++;
628 u64_stats_update_end(&ring->stats.syncp);
629 }
630 }
631
fbnic_clean_twq1(struct fbnic_napi_vector * nv,bool pp_allow_direct,struct fbnic_ring * ring,bool discard,unsigned int hw_head)632 static void fbnic_clean_twq1(struct fbnic_napi_vector *nv, bool pp_allow_direct,
633 struct fbnic_ring *ring, bool discard,
634 unsigned int hw_head)
635 {
636 u64 total_bytes = 0, total_packets = 0;
637 unsigned int head = ring->head;
638
639 while (hw_head != head) {
640 struct page *page;
641 u64 twd;
642
643 if (unlikely(!(ring->desc[head] & FBNIC_TWD_TYPE(AL))))
644 goto next_desc;
645
646 twd = le64_to_cpu(ring->desc[head]);
647 page = ring->tx_buf[head];
648
649 /* TYPE_AL is 2, TYPE_LAST_AL is 3. So this trick gives
650 * us one increment per packet, with no branches.
651 */
652 total_packets += FIELD_GET(FBNIC_TWD_TYPE_MASK, twd) -
653 FBNIC_TWD_TYPE_AL;
654 total_bytes += FIELD_GET(FBNIC_TWD_LEN_MASK, twd);
655
656 page_pool_put_page(page->pp, page, -1, pp_allow_direct);
657 next_desc:
658 head++;
659 head &= ring->size_mask;
660 }
661
662 if (!total_bytes)
663 return;
664
665 ring->head = head;
666
667 if (discard) {
668 u64_stats_update_begin(&ring->stats.syncp);
669 ring->stats.dropped += total_packets;
670 u64_stats_update_end(&ring->stats.syncp);
671 return;
672 }
673
674 u64_stats_update_begin(&ring->stats.syncp);
675 ring->stats.bytes += total_bytes;
676 ring->stats.packets += total_packets;
677 u64_stats_update_end(&ring->stats.syncp);
678 }
679
fbnic_clean_tsq(struct fbnic_napi_vector * nv,struct fbnic_ring * ring,u64 tcd,int * ts_head,int * head0)680 static void fbnic_clean_tsq(struct fbnic_napi_vector *nv,
681 struct fbnic_ring *ring,
682 u64 tcd, int *ts_head, int *head0)
683 {
684 struct skb_shared_hwtstamps hwtstamp;
685 struct fbnic_net *fbn;
686 struct sk_buff *skb;
687 int head;
688 u64 ns;
689
690 head = (*ts_head < 0) ? ring->head : *ts_head;
691
692 do {
693 unsigned int desc_cnt;
694
695 if (head == ring->tail) {
696 if (unlikely(net_ratelimit()))
697 netdev_err(nv->napi.dev,
698 "Tx timestamp without matching packet\n");
699 return;
700 }
701
702 skb = ring->tx_buf[head];
703 desc_cnt = FBNIC_XMIT_CB(skb)->desc_count;
704
705 head += desc_cnt;
706 head &= ring->size_mask;
707 } while (!(FBNIC_XMIT_CB(skb)->flags & FBNIC_XMIT_CB_TS));
708
709 fbn = netdev_priv(nv->napi.dev);
710 ns = fbnic_ts40_to_ns(fbn, FIELD_GET(FBNIC_TCD_TYPE1_TS_MASK, tcd));
711
712 memset(&hwtstamp, 0, sizeof(hwtstamp));
713 hwtstamp.hwtstamp = ns_to_ktime(ns);
714
715 *ts_head = head;
716
717 FBNIC_XMIT_CB(skb)->flags &= ~FBNIC_XMIT_CB_TS;
718 if (*head0 < 0) {
719 head = FBNIC_XMIT_CB(skb)->hw_head;
720 if (head >= 0)
721 *head0 = head;
722 }
723
724 skb_tstamp_tx(skb, &hwtstamp);
725 u64_stats_update_begin(&ring->stats.syncp);
726 ring->stats.twq.ts_packets++;
727 u64_stats_update_end(&ring->stats.syncp);
728 }
729
fbnic_page_pool_init(struct fbnic_ring * ring,unsigned int idx,netmem_ref netmem)730 static void fbnic_page_pool_init(struct fbnic_ring *ring, unsigned int idx,
731 netmem_ref netmem)
732 {
733 struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx];
734
735 page_pool_fragment_netmem(netmem, FBNIC_PAGECNT_BIAS_MAX);
736 rx_buf->pagecnt_bias = FBNIC_PAGECNT_BIAS_MAX;
737 rx_buf->netmem = netmem;
738 }
739
740 static struct page *
fbnic_page_pool_get_head(struct fbnic_q_triad * qt,unsigned int idx)741 fbnic_page_pool_get_head(struct fbnic_q_triad *qt, unsigned int idx)
742 {
743 struct fbnic_rx_buf *rx_buf = &qt->sub0.rx_buf[idx];
744
745 rx_buf->pagecnt_bias--;
746
747 /* sub0 is always fed system pages, from the NAPI-level page_pool */
748 return netmem_to_page(rx_buf->netmem);
749 }
750
751 static netmem_ref
fbnic_page_pool_get_data(struct fbnic_q_triad * qt,unsigned int idx)752 fbnic_page_pool_get_data(struct fbnic_q_triad *qt, unsigned int idx)
753 {
754 struct fbnic_rx_buf *rx_buf = &qt->sub1.rx_buf[idx];
755
756 rx_buf->pagecnt_bias--;
757
758 return rx_buf->netmem;
759 }
760
fbnic_page_pool_drain(struct fbnic_ring * ring,unsigned int idx,int budget)761 static void fbnic_page_pool_drain(struct fbnic_ring *ring, unsigned int idx,
762 int budget)
763 {
764 struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx];
765 netmem_ref netmem = rx_buf->netmem;
766
767 if (!page_pool_unref_netmem(netmem, rx_buf->pagecnt_bias))
768 page_pool_put_unrefed_netmem(ring->page_pool, netmem, -1,
769 !!budget);
770
771 rx_buf->netmem = 0;
772 }
773
fbnic_clean_twq(struct fbnic_napi_vector * nv,int napi_budget,struct fbnic_q_triad * qt,s32 ts_head,s32 head0,s32 head1)774 static void fbnic_clean_twq(struct fbnic_napi_vector *nv, int napi_budget,
775 struct fbnic_q_triad *qt, s32 ts_head, s32 head0,
776 s32 head1)
777 {
778 if (head0 >= 0)
779 fbnic_clean_twq0(nv, napi_budget, &qt->sub0, false, head0);
780 else if (ts_head >= 0)
781 fbnic_clean_twq0(nv, napi_budget, &qt->sub0, false, ts_head);
782
783 if (head1 >= 0) {
784 qt->cmpl.deferred_head = -1;
785 if (napi_budget)
786 fbnic_clean_twq1(nv, true, &qt->sub1, false, head1);
787 else
788 qt->cmpl.deferred_head = head1;
789 }
790 }
791
792 static void
fbnic_clean_tcq(struct fbnic_napi_vector * nv,struct fbnic_q_triad * qt,int napi_budget)793 fbnic_clean_tcq(struct fbnic_napi_vector *nv, struct fbnic_q_triad *qt,
794 int napi_budget)
795 {
796 struct fbnic_ring *cmpl = &qt->cmpl;
797 s32 head1 = cmpl->deferred_head;
798 s32 head0 = -1, ts_head = -1;
799 __le64 *raw_tcd, done;
800 u32 head = cmpl->head;
801
802 done = (head & (cmpl->size_mask + 1)) ? 0 : cpu_to_le64(FBNIC_TCD_DONE);
803 raw_tcd = &cmpl->desc[head & cmpl->size_mask];
804
805 /* Walk the completion queue collecting the heads reported by NIC */
806 while ((*raw_tcd & cpu_to_le64(FBNIC_TCD_DONE)) == done) {
807 u64 tcd;
808
809 dma_rmb();
810
811 tcd = le64_to_cpu(*raw_tcd);
812
813 switch (FIELD_GET(FBNIC_TCD_TYPE_MASK, tcd)) {
814 case FBNIC_TCD_TYPE_0:
815 if (tcd & FBNIC_TCD_TWQ1)
816 head1 = FIELD_GET(FBNIC_TCD_TYPE0_HEAD1_MASK,
817 tcd);
818 else
819 head0 = FIELD_GET(FBNIC_TCD_TYPE0_HEAD0_MASK,
820 tcd);
821 /* Currently all err status bits are related to
822 * timestamps and as those have yet to be added
823 * they are skipped for now.
824 */
825 break;
826 case FBNIC_TCD_TYPE_1:
827 if (WARN_ON_ONCE(tcd & FBNIC_TCD_TWQ1))
828 break;
829
830 fbnic_clean_tsq(nv, &qt->sub0, tcd, &ts_head, &head0);
831 break;
832 default:
833 break;
834 }
835
836 raw_tcd++;
837 head++;
838 if (!(head & cmpl->size_mask)) {
839 done ^= cpu_to_le64(FBNIC_TCD_DONE);
840 raw_tcd = &cmpl->desc[0];
841 }
842 }
843
844 /* Record the current head/tail of the queue */
845 if (cmpl->head != head) {
846 cmpl->head = head;
847 writel(head & cmpl->size_mask, cmpl->doorbell);
848 }
849
850 /* Unmap and free processed buffers */
851 fbnic_clean_twq(nv, napi_budget, qt, ts_head, head0, head1);
852 }
853
fbnic_clean_bdq(struct fbnic_ring * ring,unsigned int hw_head,int napi_budget)854 static void fbnic_clean_bdq(struct fbnic_ring *ring, unsigned int hw_head,
855 int napi_budget)
856 {
857 unsigned int head = ring->head;
858
859 if (head == hw_head)
860 return;
861
862 do {
863 fbnic_page_pool_drain(ring, head, napi_budget);
864
865 head++;
866 head &= ring->size_mask;
867 } while (head != hw_head);
868
869 ring->head = head;
870 }
871
fbnic_bd_prep(struct fbnic_ring * bdq,u16 id,netmem_ref netmem)872 static void fbnic_bd_prep(struct fbnic_ring *bdq, u16 id, netmem_ref netmem)
873 {
874 __le64 *bdq_desc = &bdq->desc[id * FBNIC_BD_FRAG_COUNT];
875 dma_addr_t dma = page_pool_get_dma_addr_netmem(netmem);
876 u64 bd, i = FBNIC_BD_FRAG_COUNT;
877
878 bd = (FBNIC_BD_PAGE_ADDR_MASK & dma) |
879 FIELD_PREP(FBNIC_BD_PAGE_ID_MASK, id);
880
881 /* In the case that a page size is larger than 4K we will map a
882 * single page to multiple fragments. The fragments will be
883 * FBNIC_BD_FRAG_COUNT in size and the lower n bits will be use
884 * to indicate the individual fragment IDs.
885 */
886 do {
887 *bdq_desc = cpu_to_le64(bd);
888 bd += FIELD_PREP(FBNIC_BD_DESC_ADDR_MASK, 1) |
889 FIELD_PREP(FBNIC_BD_DESC_ID_MASK, 1);
890 } while (--i);
891 }
892
fbnic_fill_bdq(struct fbnic_ring * bdq)893 static void fbnic_fill_bdq(struct fbnic_ring *bdq)
894 {
895 unsigned int count = fbnic_desc_unused(bdq);
896 unsigned int i = bdq->tail;
897
898 if (!count)
899 return;
900
901 do {
902 netmem_ref netmem;
903
904 netmem = page_pool_dev_alloc_netmems(bdq->page_pool);
905 if (!netmem) {
906 u64_stats_update_begin(&bdq->stats.syncp);
907 bdq->stats.bdq.alloc_failed++;
908 u64_stats_update_end(&bdq->stats.syncp);
909
910 break;
911 }
912
913 fbnic_page_pool_init(bdq, i, netmem);
914 fbnic_bd_prep(bdq, i, netmem);
915
916 i++;
917 i &= bdq->size_mask;
918
919 count--;
920 } while (count);
921
922 if (bdq->tail != i) {
923 bdq->tail = i;
924
925 /* Force DMA writes to flush before writing to tail */
926 dma_wmb();
927
928 writel(i, bdq->doorbell);
929 }
930 }
931
fbnic_hdr_pg_start(unsigned int pg_off)932 static unsigned int fbnic_hdr_pg_start(unsigned int pg_off)
933 {
934 /* The headroom of the first header may be larger than FBNIC_RX_HROOM
935 * due to alignment. So account for that by just making the page
936 * offset 0 if we are starting at the first header.
937 */
938 if (ALIGN(FBNIC_RX_HROOM, 128) > FBNIC_RX_HROOM &&
939 pg_off == ALIGN(FBNIC_RX_HROOM, 128))
940 return 0;
941
942 return pg_off - FBNIC_RX_HROOM;
943 }
944
fbnic_hdr_pg_end(unsigned int pg_off,unsigned int len)945 static unsigned int fbnic_hdr_pg_end(unsigned int pg_off, unsigned int len)
946 {
947 /* Determine the end of the buffer by finding the start of the next
948 * and then subtracting the headroom from that frame.
949 */
950 pg_off += len + FBNIC_RX_TROOM + FBNIC_RX_HROOM;
951
952 return ALIGN(pg_off, 128) - FBNIC_RX_HROOM;
953 }
954
fbnic_pkt_prepare(struct fbnic_napi_vector * nv,u64 rcd,struct fbnic_pkt_buff * pkt,struct fbnic_q_triad * qt)955 static void fbnic_pkt_prepare(struct fbnic_napi_vector *nv, u64 rcd,
956 struct fbnic_pkt_buff *pkt,
957 struct fbnic_q_triad *qt)
958 {
959 unsigned int hdr_pg_idx = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
960 unsigned int hdr_pg_off = FIELD_GET(FBNIC_RCD_AL_BUFF_OFF_MASK, rcd);
961 struct page *page = fbnic_page_pool_get_head(qt, hdr_pg_idx);
962 unsigned int len = FIELD_GET(FBNIC_RCD_AL_BUFF_LEN_MASK, rcd);
963 unsigned int frame_sz, hdr_pg_start, hdr_pg_end, headroom;
964 unsigned char *hdr_start;
965
966 /* data_hard_start should always be NULL when this is called */
967 WARN_ON_ONCE(pkt->buff.data_hard_start);
968
969 /* Short-cut the end calculation if we know page is fully consumed */
970 hdr_pg_end = FIELD_GET(FBNIC_RCD_AL_PAGE_FIN, rcd) ?
971 FBNIC_BD_FRAG_SIZE : fbnic_hdr_pg_end(hdr_pg_off, len);
972 hdr_pg_start = fbnic_hdr_pg_start(hdr_pg_off);
973
974 headroom = hdr_pg_off - hdr_pg_start + FBNIC_RX_PAD;
975 frame_sz = hdr_pg_end - hdr_pg_start;
976 xdp_init_buff(&pkt->buff, frame_sz, &qt->xdp_rxq);
977 hdr_pg_start += (FBNIC_RCD_AL_BUFF_FRAG_MASK & rcd) *
978 FBNIC_BD_FRAG_SIZE;
979
980 /* Sync DMA buffer */
981 dma_sync_single_range_for_cpu(nv->dev, page_pool_get_dma_addr(page),
982 hdr_pg_start, frame_sz,
983 DMA_BIDIRECTIONAL);
984
985 /* Build frame around buffer */
986 hdr_start = page_address(page) + hdr_pg_start;
987 net_prefetch(pkt->buff.data);
988 xdp_prepare_buff(&pkt->buff, hdr_start, headroom,
989 len - FBNIC_RX_PAD, true);
990
991 pkt->hwtstamp = 0;
992 pkt->add_frag_failed = false;
993 }
994
fbnic_add_rx_frag(struct fbnic_napi_vector * nv,u64 rcd,struct fbnic_pkt_buff * pkt,struct fbnic_q_triad * qt)995 static void fbnic_add_rx_frag(struct fbnic_napi_vector *nv, u64 rcd,
996 struct fbnic_pkt_buff *pkt,
997 struct fbnic_q_triad *qt)
998 {
999 unsigned int pg_idx = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
1000 unsigned int pg_off = FIELD_GET(FBNIC_RCD_AL_BUFF_OFF_MASK, rcd);
1001 unsigned int len = FIELD_GET(FBNIC_RCD_AL_BUFF_LEN_MASK, rcd);
1002 netmem_ref netmem = fbnic_page_pool_get_data(qt, pg_idx);
1003 unsigned int truesize;
1004 bool added;
1005
1006 truesize = FIELD_GET(FBNIC_RCD_AL_PAGE_FIN, rcd) ?
1007 FBNIC_BD_FRAG_SIZE - pg_off : ALIGN(len, 128);
1008
1009 pg_off += (FBNIC_RCD_AL_BUFF_FRAG_MASK & rcd) *
1010 FBNIC_BD_FRAG_SIZE;
1011
1012 /* Sync DMA buffer */
1013 page_pool_dma_sync_netmem_for_cpu(qt->sub1.page_pool, netmem,
1014 pg_off, truesize);
1015
1016 added = xdp_buff_add_frag(&pkt->buff, netmem, pg_off, len, truesize);
1017 if (unlikely(!added)) {
1018 pkt->add_frag_failed = true;
1019 netdev_err_once(nv->napi.dev,
1020 "Failed to add fragment to xdp_buff\n");
1021 }
1022 }
1023
fbnic_put_pkt_buff(struct fbnic_q_triad * qt,struct fbnic_pkt_buff * pkt,int budget)1024 static void fbnic_put_pkt_buff(struct fbnic_q_triad *qt,
1025 struct fbnic_pkt_buff *pkt, int budget)
1026 {
1027 struct page *page;
1028
1029 if (!pkt->buff.data_hard_start)
1030 return;
1031
1032 if (xdp_buff_has_frags(&pkt->buff)) {
1033 struct skb_shared_info *shinfo;
1034 netmem_ref netmem;
1035 int nr_frags;
1036
1037 shinfo = xdp_get_shared_info_from_buff(&pkt->buff);
1038 nr_frags = shinfo->nr_frags;
1039
1040 while (nr_frags--) {
1041 netmem = skb_frag_netmem(&shinfo->frags[nr_frags]);
1042 page_pool_put_full_netmem(qt->sub1.page_pool, netmem,
1043 !!budget);
1044 }
1045 }
1046
1047 page = virt_to_page(pkt->buff.data_hard_start);
1048 page_pool_put_full_page(qt->sub0.page_pool, page, !!budget);
1049 }
1050
fbnic_build_skb(struct fbnic_napi_vector * nv,struct fbnic_pkt_buff * pkt)1051 static struct sk_buff *fbnic_build_skb(struct fbnic_napi_vector *nv,
1052 struct fbnic_pkt_buff *pkt)
1053 {
1054 struct sk_buff *skb;
1055
1056 skb = xdp_build_skb_from_buff(&pkt->buff);
1057 if (!skb)
1058 return NULL;
1059
1060 /* Add timestamp if present */
1061 if (pkt->hwtstamp)
1062 skb_hwtstamps(skb)->hwtstamp = pkt->hwtstamp;
1063
1064 return skb;
1065 }
1066
fbnic_pkt_tx(struct fbnic_napi_vector * nv,struct fbnic_pkt_buff * pkt)1067 static long fbnic_pkt_tx(struct fbnic_napi_vector *nv,
1068 struct fbnic_pkt_buff *pkt)
1069 {
1070 struct fbnic_ring *ring = &nv->qt[0].sub1;
1071 int size, offset, nsegs = 1, data_len = 0;
1072 unsigned int tail = ring->tail;
1073 struct skb_shared_info *shinfo;
1074 skb_frag_t *frag = NULL;
1075 struct page *page;
1076 dma_addr_t dma;
1077 __le64 *twd;
1078
1079 if (unlikely(xdp_buff_has_frags(&pkt->buff))) {
1080 shinfo = xdp_get_shared_info_from_buff(&pkt->buff);
1081 nsegs += shinfo->nr_frags;
1082 data_len = shinfo->xdp_frags_size;
1083 frag = &shinfo->frags[0];
1084 }
1085
1086 if (fbnic_desc_unused(ring) < nsegs) {
1087 u64_stats_update_begin(&ring->stats.syncp);
1088 ring->stats.dropped++;
1089 u64_stats_update_end(&ring->stats.syncp);
1090 return -FBNIC_XDP_CONSUME;
1091 }
1092
1093 page = virt_to_page(pkt->buff.data_hard_start);
1094 offset = offset_in_page(pkt->buff.data);
1095 dma = page_pool_get_dma_addr(page);
1096
1097 size = pkt->buff.data_end - pkt->buff.data;
1098
1099 while (nsegs--) {
1100 dma_sync_single_range_for_device(nv->dev, dma, offset, size,
1101 DMA_BIDIRECTIONAL);
1102 dma += offset;
1103
1104 ring->tx_buf[tail] = page;
1105
1106 twd = &ring->desc[tail];
1107 *twd = cpu_to_le64(FIELD_PREP(FBNIC_TWD_ADDR_MASK, dma) |
1108 FIELD_PREP(FBNIC_TWD_LEN_MASK, size) |
1109 FIELD_PREP(FBNIC_TWD_TYPE_MASK,
1110 FBNIC_TWD_TYPE_AL));
1111
1112 tail++;
1113 tail &= ring->size_mask;
1114
1115 if (!data_len)
1116 break;
1117
1118 offset = skb_frag_off(frag);
1119 page = skb_frag_page(frag);
1120 dma = page_pool_get_dma_addr(page);
1121
1122 size = skb_frag_size(frag);
1123 data_len -= size;
1124 frag++;
1125 }
1126
1127 *twd |= FBNIC_TWD_TYPE(LAST_AL);
1128
1129 ring->tail = tail;
1130
1131 return -FBNIC_XDP_TX;
1132 }
1133
fbnic_pkt_commit_tail(struct fbnic_napi_vector * nv,unsigned int pkt_tail)1134 static void fbnic_pkt_commit_tail(struct fbnic_napi_vector *nv,
1135 unsigned int pkt_tail)
1136 {
1137 struct fbnic_ring *ring = &nv->qt[0].sub1;
1138
1139 /* Force DMA writes to flush before writing to tail */
1140 dma_wmb();
1141
1142 writel(pkt_tail, ring->doorbell);
1143 }
1144
fbnic_run_xdp(struct fbnic_napi_vector * nv,struct fbnic_pkt_buff * pkt)1145 static struct sk_buff *fbnic_run_xdp(struct fbnic_napi_vector *nv,
1146 struct fbnic_pkt_buff *pkt)
1147 {
1148 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
1149 struct bpf_prog *xdp_prog;
1150 int act;
1151
1152 xdp_prog = READ_ONCE(fbn->xdp_prog);
1153 if (!xdp_prog)
1154 goto xdp_pass;
1155
1156 /* Should never happen, config paths enforce HDS threshold > MTU */
1157 if (xdp_buff_has_frags(&pkt->buff) && !xdp_prog->aux->xdp_has_frags)
1158 return ERR_PTR(-FBNIC_XDP_LEN_ERR);
1159
1160 act = bpf_prog_run_xdp(xdp_prog, &pkt->buff);
1161 switch (act) {
1162 case XDP_PASS:
1163 xdp_pass:
1164 return fbnic_build_skb(nv, pkt);
1165 case XDP_TX:
1166 return ERR_PTR(fbnic_pkt_tx(nv, pkt));
1167 default:
1168 bpf_warn_invalid_xdp_action(nv->napi.dev, xdp_prog, act);
1169 fallthrough;
1170 case XDP_ABORTED:
1171 trace_xdp_exception(nv->napi.dev, xdp_prog, act);
1172 fallthrough;
1173 case XDP_DROP:
1174 break;
1175 }
1176
1177 return ERR_PTR(-FBNIC_XDP_CONSUME);
1178 }
1179
fbnic_skb_hash_type(u64 rcd)1180 static enum pkt_hash_types fbnic_skb_hash_type(u64 rcd)
1181 {
1182 return (FBNIC_RCD_META_L4_TYPE_MASK & rcd) ? PKT_HASH_TYPE_L4 :
1183 (FBNIC_RCD_META_L3_TYPE_MASK & rcd) ? PKT_HASH_TYPE_L3 :
1184 PKT_HASH_TYPE_L2;
1185 }
1186
fbnic_rx_tstamp(struct fbnic_napi_vector * nv,u64 rcd,struct fbnic_pkt_buff * pkt)1187 static void fbnic_rx_tstamp(struct fbnic_napi_vector *nv, u64 rcd,
1188 struct fbnic_pkt_buff *pkt)
1189 {
1190 struct fbnic_net *fbn;
1191 u64 ns, ts;
1192
1193 if (!FIELD_GET(FBNIC_RCD_OPT_META_TS, rcd))
1194 return;
1195
1196 fbn = netdev_priv(nv->napi.dev);
1197 ts = FIELD_GET(FBNIC_RCD_OPT_META_TS_MASK, rcd);
1198 ns = fbnic_ts40_to_ns(fbn, ts);
1199
1200 /* Add timestamp to shared info */
1201 pkt->hwtstamp = ns_to_ktime(ns);
1202 }
1203
fbnic_populate_skb_fields(struct fbnic_napi_vector * nv,u64 rcd,struct sk_buff * skb,struct fbnic_q_triad * qt,u64 * csum_cmpl,u64 * csum_none)1204 static void fbnic_populate_skb_fields(struct fbnic_napi_vector *nv,
1205 u64 rcd, struct sk_buff *skb,
1206 struct fbnic_q_triad *qt,
1207 u64 *csum_cmpl, u64 *csum_none)
1208 {
1209 struct net_device *netdev = nv->napi.dev;
1210 struct fbnic_ring *rcq = &qt->cmpl;
1211
1212 fbnic_rx_csum(rcd, skb, rcq, csum_cmpl, csum_none);
1213
1214 if (netdev->features & NETIF_F_RXHASH)
1215 skb_set_hash(skb,
1216 FIELD_GET(FBNIC_RCD_META_RSS_HASH_MASK, rcd),
1217 fbnic_skb_hash_type(rcd));
1218
1219 skb_record_rx_queue(skb, rcq->q_idx);
1220 }
1221
fbnic_rcd_metadata_err(u64 rcd)1222 static bool fbnic_rcd_metadata_err(u64 rcd)
1223 {
1224 return !!(FBNIC_RCD_META_UNCORRECTABLE_ERR_MASK & rcd);
1225 }
1226
fbnic_clean_rcq(struct fbnic_napi_vector * nv,struct fbnic_q_triad * qt,int budget)1227 static int fbnic_clean_rcq(struct fbnic_napi_vector *nv,
1228 struct fbnic_q_triad *qt, int budget)
1229 {
1230 unsigned int packets = 0, bytes = 0, dropped = 0, alloc_failed = 0;
1231 u64 csum_complete = 0, csum_none = 0, length_errors = 0;
1232 s32 head0 = -1, head1 = -1, pkt_tail = -1;
1233 struct fbnic_ring *rcq = &qt->cmpl;
1234 struct fbnic_pkt_buff *pkt;
1235 __le64 *raw_rcd, done;
1236 u32 head = rcq->head;
1237
1238 done = (head & (rcq->size_mask + 1)) ? cpu_to_le64(FBNIC_RCD_DONE) : 0;
1239 raw_rcd = &rcq->desc[head & rcq->size_mask];
1240 pkt = rcq->pkt;
1241
1242 /* Walk the completion queue collecting the heads reported by NIC */
1243 while (likely(packets < budget)) {
1244 struct sk_buff *skb = ERR_PTR(-EINVAL);
1245 u32 pkt_bytes;
1246 u64 rcd;
1247
1248 if ((*raw_rcd & cpu_to_le64(FBNIC_RCD_DONE)) == done)
1249 break;
1250
1251 dma_rmb();
1252
1253 rcd = le64_to_cpu(*raw_rcd);
1254
1255 switch (FIELD_GET(FBNIC_RCD_TYPE_MASK, rcd)) {
1256 case FBNIC_RCD_TYPE_HDR_AL:
1257 head0 = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
1258 fbnic_pkt_prepare(nv, rcd, pkt, qt);
1259
1260 break;
1261 case FBNIC_RCD_TYPE_PAY_AL:
1262 head1 = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
1263 fbnic_add_rx_frag(nv, rcd, pkt, qt);
1264
1265 break;
1266 case FBNIC_RCD_TYPE_OPT_META:
1267 /* Only type 0 is currently supported */
1268 if (FIELD_GET(FBNIC_RCD_OPT_META_TYPE_MASK, rcd))
1269 break;
1270
1271 fbnic_rx_tstamp(nv, rcd, pkt);
1272
1273 /* We currently ignore the action table index */
1274 break;
1275 case FBNIC_RCD_TYPE_META:
1276 if (likely(!fbnic_rcd_metadata_err(rcd) &&
1277 !pkt->add_frag_failed)) {
1278 pkt_bytes = xdp_get_buff_len(&pkt->buff);
1279 skb = fbnic_run_xdp(nv, pkt);
1280 }
1281
1282 /* Populate skb and invalidate XDP */
1283 if (!IS_ERR_OR_NULL(skb)) {
1284 fbnic_populate_skb_fields(nv, rcd, skb, qt,
1285 &csum_complete,
1286 &csum_none);
1287 napi_gro_receive(&nv->napi, skb);
1288 } else if (skb == ERR_PTR(-FBNIC_XDP_TX)) {
1289 pkt_tail = nv->qt[0].sub1.tail;
1290 } else if (PTR_ERR(skb) == -FBNIC_XDP_CONSUME) {
1291 fbnic_put_pkt_buff(qt, pkt, 1);
1292 } else {
1293 if (!skb)
1294 alloc_failed++;
1295
1296 if (skb == ERR_PTR(-FBNIC_XDP_LEN_ERR))
1297 length_errors++;
1298 else
1299 dropped++;
1300
1301 fbnic_put_pkt_buff(qt, pkt, 1);
1302 goto next_dont_count;
1303 }
1304
1305 packets++;
1306 bytes += pkt_bytes;
1307 next_dont_count:
1308 pkt->buff.data_hard_start = NULL;
1309
1310 break;
1311 }
1312
1313 raw_rcd++;
1314 head++;
1315 if (!(head & rcq->size_mask)) {
1316 done ^= cpu_to_le64(FBNIC_RCD_DONE);
1317 raw_rcd = &rcq->desc[0];
1318 }
1319 }
1320
1321 u64_stats_update_begin(&rcq->stats.syncp);
1322 rcq->stats.packets += packets;
1323 rcq->stats.bytes += bytes;
1324 rcq->stats.dropped += dropped;
1325 rcq->stats.rx.alloc_failed += alloc_failed;
1326 rcq->stats.rx.csum_complete += csum_complete;
1327 rcq->stats.rx.csum_none += csum_none;
1328 rcq->stats.rx.length_errors += length_errors;
1329 u64_stats_update_end(&rcq->stats.syncp);
1330
1331 if (pkt_tail >= 0)
1332 fbnic_pkt_commit_tail(nv, pkt_tail);
1333
1334 /* Unmap and free processed buffers */
1335 if (head0 >= 0)
1336 fbnic_clean_bdq(&qt->sub0, head0, budget);
1337 fbnic_fill_bdq(&qt->sub0);
1338
1339 if (head1 >= 0)
1340 fbnic_clean_bdq(&qt->sub1, head1, budget);
1341 fbnic_fill_bdq(&qt->sub1);
1342
1343 /* Record the current head/tail of the queue */
1344 if (rcq->head != head) {
1345 rcq->head = head;
1346 writel(head & rcq->size_mask, rcq->doorbell);
1347 }
1348
1349 return packets;
1350 }
1351
fbnic_nv_irq_disable(struct fbnic_napi_vector * nv)1352 static void fbnic_nv_irq_disable(struct fbnic_napi_vector *nv)
1353 {
1354 struct fbnic_dev *fbd = nv->fbd;
1355 u32 v_idx = nv->v_idx;
1356
1357 fbnic_wr32(fbd, FBNIC_INTR_MASK_SET(v_idx / 32), 1 << (v_idx % 32));
1358 }
1359
fbnic_nv_irq_rearm(struct fbnic_napi_vector * nv)1360 static void fbnic_nv_irq_rearm(struct fbnic_napi_vector *nv)
1361 {
1362 struct fbnic_dev *fbd = nv->fbd;
1363 u32 v_idx = nv->v_idx;
1364
1365 fbnic_wr32(fbd, FBNIC_INTR_CQ_REARM(v_idx),
1366 FBNIC_INTR_CQ_REARM_INTR_UNMASK);
1367 }
1368
fbnic_poll(struct napi_struct * napi,int budget)1369 static int fbnic_poll(struct napi_struct *napi, int budget)
1370 {
1371 struct fbnic_napi_vector *nv = container_of(napi,
1372 struct fbnic_napi_vector,
1373 napi);
1374 int i, j, work_done = 0;
1375
1376 for (i = 0; i < nv->txt_count; i++)
1377 fbnic_clean_tcq(nv, &nv->qt[i], budget);
1378
1379 for (j = 0; j < nv->rxt_count; j++, i++)
1380 work_done += fbnic_clean_rcq(nv, &nv->qt[i], budget);
1381
1382 if (work_done >= budget)
1383 return budget;
1384
1385 if (likely(napi_complete_done(napi, work_done)))
1386 fbnic_nv_irq_rearm(nv);
1387
1388 return work_done;
1389 }
1390
fbnic_msix_clean_rings(int __always_unused irq,void * data)1391 irqreturn_t fbnic_msix_clean_rings(int __always_unused irq, void *data)
1392 {
1393 struct fbnic_napi_vector *nv = *(void **)data;
1394
1395 napi_schedule_irqoff(&nv->napi);
1396
1397 return IRQ_HANDLED;
1398 }
1399
fbnic_aggregate_ring_rx_counters(struct fbnic_net * fbn,struct fbnic_ring * rxr)1400 void fbnic_aggregate_ring_rx_counters(struct fbnic_net *fbn,
1401 struct fbnic_ring *rxr)
1402 {
1403 struct fbnic_queue_stats *stats = &rxr->stats;
1404
1405 /* Capture stats from queues before dissasociating them */
1406 fbn->rx_stats.bytes += stats->bytes;
1407 fbn->rx_stats.packets += stats->packets;
1408 fbn->rx_stats.dropped += stats->dropped;
1409 fbn->rx_stats.rx.alloc_failed += stats->rx.alloc_failed;
1410 fbn->rx_stats.rx.csum_complete += stats->rx.csum_complete;
1411 fbn->rx_stats.rx.csum_none += stats->rx.csum_none;
1412 fbn->rx_stats.rx.length_errors += stats->rx.length_errors;
1413 /* Remember to add new stats here */
1414 BUILD_BUG_ON(sizeof(fbn->rx_stats.rx) / 8 != 4);
1415 }
1416
fbnic_aggregate_ring_bdq_counters(struct fbnic_net * fbn,struct fbnic_ring * bdq)1417 void fbnic_aggregate_ring_bdq_counters(struct fbnic_net *fbn,
1418 struct fbnic_ring *bdq)
1419 {
1420 struct fbnic_queue_stats *stats = &bdq->stats;
1421
1422 /* Capture stats from queues before dissasociating them */
1423 fbn->bdq_stats.bdq.alloc_failed += stats->bdq.alloc_failed;
1424 /* Remember to add new stats here */
1425 BUILD_BUG_ON(sizeof(fbn->rx_stats.bdq) / 8 != 1);
1426 }
1427
fbnic_aggregate_ring_tx_counters(struct fbnic_net * fbn,struct fbnic_ring * txr)1428 void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
1429 struct fbnic_ring *txr)
1430 {
1431 struct fbnic_queue_stats *stats = &txr->stats;
1432
1433 /* Capture stats from queues before dissasociating them */
1434 fbn->tx_stats.bytes += stats->bytes;
1435 fbn->tx_stats.packets += stats->packets;
1436 fbn->tx_stats.dropped += stats->dropped;
1437 fbn->tx_stats.twq.csum_partial += stats->twq.csum_partial;
1438 fbn->tx_stats.twq.lso += stats->twq.lso;
1439 fbn->tx_stats.twq.ts_lost += stats->twq.ts_lost;
1440 fbn->tx_stats.twq.ts_packets += stats->twq.ts_packets;
1441 fbn->tx_stats.twq.stop += stats->twq.stop;
1442 fbn->tx_stats.twq.wake += stats->twq.wake;
1443 /* Remember to add new stats here */
1444 BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 6);
1445 }
1446
fbnic_aggregate_ring_xdp_counters(struct fbnic_net * fbn,struct fbnic_ring * xdpr)1447 void fbnic_aggregate_ring_xdp_counters(struct fbnic_net *fbn,
1448 struct fbnic_ring *xdpr)
1449 {
1450 struct fbnic_queue_stats *stats = &xdpr->stats;
1451
1452 if (!(xdpr->flags & FBNIC_RING_F_STATS))
1453 return;
1454
1455 /* Capture stats from queues before dissasociating them */
1456 fbn->tx_stats.dropped += stats->dropped;
1457 fbn->tx_stats.bytes += stats->bytes;
1458 fbn->tx_stats.packets += stats->packets;
1459 }
1460
fbnic_remove_tx_ring(struct fbnic_net * fbn,struct fbnic_ring * txr)1461 static void fbnic_remove_tx_ring(struct fbnic_net *fbn,
1462 struct fbnic_ring *txr)
1463 {
1464 if (!(txr->flags & FBNIC_RING_F_STATS))
1465 return;
1466
1467 fbnic_aggregate_ring_tx_counters(fbn, txr);
1468
1469 /* Remove pointer to the Tx ring */
1470 WARN_ON(fbn->tx[txr->q_idx] && fbn->tx[txr->q_idx] != txr);
1471 fbn->tx[txr->q_idx] = NULL;
1472 }
1473
fbnic_remove_xdp_ring(struct fbnic_net * fbn,struct fbnic_ring * xdpr)1474 static void fbnic_remove_xdp_ring(struct fbnic_net *fbn,
1475 struct fbnic_ring *xdpr)
1476 {
1477 if (!(xdpr->flags & FBNIC_RING_F_STATS))
1478 return;
1479
1480 fbnic_aggregate_ring_xdp_counters(fbn, xdpr);
1481
1482 /* Remove pointer to the Tx ring */
1483 WARN_ON(fbn->tx[xdpr->q_idx] && fbn->tx[xdpr->q_idx] != xdpr);
1484 fbn->tx[xdpr->q_idx] = NULL;
1485 }
1486
fbnic_remove_rx_ring(struct fbnic_net * fbn,struct fbnic_ring * rxr)1487 static void fbnic_remove_rx_ring(struct fbnic_net *fbn,
1488 struct fbnic_ring *rxr)
1489 {
1490 if (!(rxr->flags & FBNIC_RING_F_STATS))
1491 return;
1492
1493 fbnic_aggregate_ring_rx_counters(fbn, rxr);
1494
1495 /* Remove pointer to the Rx ring */
1496 WARN_ON(fbn->rx[rxr->q_idx] && fbn->rx[rxr->q_idx] != rxr);
1497 fbn->rx[rxr->q_idx] = NULL;
1498 }
1499
fbnic_remove_bdq_ring(struct fbnic_net * fbn,struct fbnic_ring * bdq)1500 static void fbnic_remove_bdq_ring(struct fbnic_net *fbn,
1501 struct fbnic_ring *bdq)
1502 {
1503 if (!(bdq->flags & FBNIC_RING_F_STATS))
1504 return;
1505
1506 fbnic_aggregate_ring_bdq_counters(fbn, bdq);
1507 }
1508
fbnic_free_qt_page_pools(struct fbnic_q_triad * qt)1509 static void fbnic_free_qt_page_pools(struct fbnic_q_triad *qt)
1510 {
1511 page_pool_destroy(qt->sub0.page_pool);
1512 page_pool_destroy(qt->sub1.page_pool);
1513 }
1514
fbnic_free_napi_vector(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)1515 static void fbnic_free_napi_vector(struct fbnic_net *fbn,
1516 struct fbnic_napi_vector *nv)
1517 {
1518 struct fbnic_dev *fbd = nv->fbd;
1519 int i, j;
1520
1521 for (i = 0; i < nv->txt_count; i++) {
1522 fbnic_remove_tx_ring(fbn, &nv->qt[i].sub0);
1523 fbnic_remove_xdp_ring(fbn, &nv->qt[i].sub1);
1524 fbnic_remove_tx_ring(fbn, &nv->qt[i].cmpl);
1525 }
1526
1527 for (j = 0; j < nv->rxt_count; j++, i++) {
1528 fbnic_remove_bdq_ring(fbn, &nv->qt[i].sub0);
1529 fbnic_remove_bdq_ring(fbn, &nv->qt[i].sub1);
1530 fbnic_remove_rx_ring(fbn, &nv->qt[i].cmpl);
1531 }
1532
1533 fbnic_napi_free_irq(fbd, nv);
1534 netif_napi_del_locked(&nv->napi);
1535 fbn->napi[fbnic_napi_idx(nv)] = NULL;
1536 kfree(nv);
1537 }
1538
fbnic_free_napi_vectors(struct fbnic_net * fbn)1539 void fbnic_free_napi_vectors(struct fbnic_net *fbn)
1540 {
1541 int i;
1542
1543 for (i = 0; i < fbn->num_napi; i++)
1544 if (fbn->napi[i])
1545 fbnic_free_napi_vector(fbn, fbn->napi[i]);
1546 }
1547
1548 static int
fbnic_alloc_qt_page_pools(struct fbnic_net * fbn,struct fbnic_q_triad * qt,unsigned int rxq_idx)1549 fbnic_alloc_qt_page_pools(struct fbnic_net *fbn, struct fbnic_q_triad *qt,
1550 unsigned int rxq_idx)
1551 {
1552 struct page_pool_params pp_params = {
1553 .order = 0,
1554 .flags = PP_FLAG_DMA_MAP |
1555 PP_FLAG_DMA_SYNC_DEV,
1556 .pool_size = fbn->hpq_size + fbn->ppq_size,
1557 .nid = NUMA_NO_NODE,
1558 .dev = fbn->netdev->dev.parent,
1559 .dma_dir = DMA_BIDIRECTIONAL,
1560 .offset = 0,
1561 .max_len = PAGE_SIZE,
1562 .netdev = fbn->netdev,
1563 .queue_idx = rxq_idx,
1564 };
1565 struct page_pool *pp;
1566
1567 /* Page pool cannot exceed a size of 32768. This doesn't limit the
1568 * pages on the ring but the number we can have cached waiting on
1569 * the next use.
1570 *
1571 * TBD: Can this be reduced further? Would a multiple of
1572 * NAPI_POLL_WEIGHT possibly make more sense? The question is how
1573 * may pages do we need to hold in reserve to get the best return
1574 * without hogging too much system memory.
1575 */
1576 if (pp_params.pool_size > 32768)
1577 pp_params.pool_size = 32768;
1578
1579 pp = page_pool_create(&pp_params);
1580 if (IS_ERR(pp))
1581 return PTR_ERR(pp);
1582
1583 qt->sub0.page_pool = pp;
1584 if (netif_rxq_has_unreadable_mp(fbn->netdev, rxq_idx)) {
1585 pp_params.flags |= PP_FLAG_ALLOW_UNREADABLE_NETMEM;
1586 pp_params.dma_dir = DMA_FROM_DEVICE;
1587
1588 pp = page_pool_create(&pp_params);
1589 if (IS_ERR(pp))
1590 goto err_destroy_sub0;
1591 } else {
1592 page_pool_get(pp);
1593 }
1594 qt->sub1.page_pool = pp;
1595
1596 return 0;
1597
1598 err_destroy_sub0:
1599 page_pool_destroy(pp);
1600 return PTR_ERR(pp);
1601 }
1602
fbnic_ring_init(struct fbnic_ring * ring,u32 __iomem * doorbell,int q_idx,u8 flags)1603 static void fbnic_ring_init(struct fbnic_ring *ring, u32 __iomem *doorbell,
1604 int q_idx, u8 flags)
1605 {
1606 u64_stats_init(&ring->stats.syncp);
1607 ring->doorbell = doorbell;
1608 ring->q_idx = q_idx;
1609 ring->flags = flags;
1610 ring->deferred_head = -1;
1611 }
1612
fbnic_alloc_napi_vector(struct fbnic_dev * fbd,struct fbnic_net * fbn,unsigned int v_count,unsigned int v_idx,unsigned int txq_count,unsigned int txq_idx,unsigned int rxq_count,unsigned int rxq_idx)1613 static int fbnic_alloc_napi_vector(struct fbnic_dev *fbd, struct fbnic_net *fbn,
1614 unsigned int v_count, unsigned int v_idx,
1615 unsigned int txq_count, unsigned int txq_idx,
1616 unsigned int rxq_count, unsigned int rxq_idx)
1617 {
1618 int txt_count = txq_count, rxt_count = rxq_count;
1619 u32 __iomem *uc_addr = fbd->uc_addr0;
1620 int xdp_count = 0, qt_count, err;
1621 struct fbnic_napi_vector *nv;
1622 struct fbnic_q_triad *qt;
1623 u32 __iomem *db;
1624
1625 /* We need to reserve at least one Tx Queue Triad for an XDP ring */
1626 if (rxq_count) {
1627 xdp_count = 1;
1628 if (!txt_count)
1629 txt_count = 1;
1630 }
1631
1632 qt_count = txt_count + rxq_count;
1633 if (!qt_count)
1634 return -EINVAL;
1635
1636 /* If MMIO has already failed there are no rings to initialize */
1637 if (!uc_addr)
1638 return -EIO;
1639
1640 /* Allocate NAPI vector and queue triads */
1641 nv = kzalloc(struct_size(nv, qt, qt_count), GFP_KERNEL);
1642 if (!nv)
1643 return -ENOMEM;
1644
1645 /* Record queue triad counts */
1646 nv->txt_count = txt_count;
1647 nv->rxt_count = rxt_count;
1648
1649 /* Provide pointer back to fbnic and MSI-X vectors */
1650 nv->fbd = fbd;
1651 nv->v_idx = v_idx;
1652
1653 /* Tie napi to netdev */
1654 fbn->napi[fbnic_napi_idx(nv)] = nv;
1655 netif_napi_add_config_locked(fbn->netdev, &nv->napi, fbnic_poll,
1656 fbnic_napi_idx(nv));
1657
1658 /* Record IRQ to NAPI struct */
1659 netif_napi_set_irq_locked(&nv->napi,
1660 pci_irq_vector(to_pci_dev(fbd->dev),
1661 nv->v_idx));
1662
1663 /* Tie nv back to PCIe dev */
1664 nv->dev = fbd->dev;
1665
1666 /* Request the IRQ for napi vector */
1667 err = fbnic_napi_request_irq(fbd, nv);
1668 if (err)
1669 goto napi_del;
1670
1671 /* Initialize queue triads */
1672 qt = nv->qt;
1673
1674 while (txt_count) {
1675 u8 flags = FBNIC_RING_F_CTX | FBNIC_RING_F_STATS;
1676
1677 /* Configure Tx queue */
1678 db = &uc_addr[FBNIC_QUEUE(txq_idx) + FBNIC_QUEUE_TWQ0_TAIL];
1679
1680 /* Assign Tx queue to netdev if applicable */
1681 if (txq_count > 0) {
1682
1683 fbnic_ring_init(&qt->sub0, db, txq_idx, flags);
1684 fbn->tx[txq_idx] = &qt->sub0;
1685 txq_count--;
1686 } else {
1687 fbnic_ring_init(&qt->sub0, db, 0,
1688 FBNIC_RING_F_DISABLED);
1689 }
1690
1691 /* Configure XDP queue */
1692 db = &uc_addr[FBNIC_QUEUE(txq_idx) + FBNIC_QUEUE_TWQ1_TAIL];
1693
1694 /* Assign XDP queue to netdev if applicable
1695 *
1696 * The setup for this is in itself a bit different.
1697 * 1. We only need one XDP Tx queue per NAPI vector.
1698 * 2. We associate it to the first Rx queue index.
1699 * 3. The hardware side is associated based on the Tx Queue.
1700 * 4. The netdev queue is offset by FBNIC_MAX_TXQs.
1701 */
1702 if (xdp_count > 0) {
1703 unsigned int xdp_idx = FBNIC_MAX_TXQS + rxq_idx;
1704
1705 fbnic_ring_init(&qt->sub1, db, xdp_idx, flags);
1706 fbn->tx[xdp_idx] = &qt->sub1;
1707 xdp_count--;
1708 } else {
1709 fbnic_ring_init(&qt->sub1, db, 0,
1710 FBNIC_RING_F_DISABLED);
1711 }
1712
1713 /* Configure Tx completion queue */
1714 db = &uc_addr[FBNIC_QUEUE(txq_idx) + FBNIC_QUEUE_TCQ_HEAD];
1715 fbnic_ring_init(&qt->cmpl, db, 0, 0);
1716
1717 /* Update Tx queue index */
1718 txt_count--;
1719 txq_idx += v_count;
1720
1721 /* Move to next queue triad */
1722 qt++;
1723 }
1724
1725 while (rxt_count) {
1726 /* Configure header queue */
1727 db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_BDQ_HPQ_TAIL];
1728 fbnic_ring_init(&qt->sub0, db, 0,
1729 FBNIC_RING_F_CTX | FBNIC_RING_F_STATS);
1730
1731 /* Configure payload queue */
1732 db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_BDQ_PPQ_TAIL];
1733 fbnic_ring_init(&qt->sub1, db, 0,
1734 FBNIC_RING_F_CTX | FBNIC_RING_F_STATS);
1735
1736 /* Configure Rx completion queue */
1737 db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_RCQ_HEAD];
1738 fbnic_ring_init(&qt->cmpl, db, rxq_idx, FBNIC_RING_F_STATS);
1739 fbn->rx[rxq_idx] = &qt->cmpl;
1740
1741 /* Update Rx queue index */
1742 rxt_count--;
1743 rxq_idx += v_count;
1744
1745 /* Move to next queue triad */
1746 qt++;
1747 }
1748
1749 return 0;
1750
1751 napi_del:
1752 netif_napi_del_locked(&nv->napi);
1753 fbn->napi[fbnic_napi_idx(nv)] = NULL;
1754 kfree(nv);
1755 return err;
1756 }
1757
fbnic_alloc_napi_vectors(struct fbnic_net * fbn)1758 int fbnic_alloc_napi_vectors(struct fbnic_net *fbn)
1759 {
1760 unsigned int txq_idx = 0, rxq_idx = 0, v_idx = FBNIC_NON_NAPI_VECTORS;
1761 unsigned int num_tx = fbn->num_tx_queues;
1762 unsigned int num_rx = fbn->num_rx_queues;
1763 unsigned int num_napi = fbn->num_napi;
1764 struct fbnic_dev *fbd = fbn->fbd;
1765 int err;
1766
1767 /* Allocate 1 Tx queue per napi vector */
1768 if (num_napi < FBNIC_MAX_TXQS && num_napi == num_tx + num_rx) {
1769 while (num_tx) {
1770 err = fbnic_alloc_napi_vector(fbd, fbn,
1771 num_napi, v_idx,
1772 1, txq_idx, 0, 0);
1773 if (err)
1774 goto free_vectors;
1775
1776 /* Update counts and index */
1777 num_tx--;
1778 txq_idx++;
1779
1780 v_idx++;
1781 }
1782 }
1783
1784 /* Allocate Tx/Rx queue pairs per vector, or allocate remaining Rx */
1785 while (num_rx | num_tx) {
1786 int tqpv = DIV_ROUND_UP(num_tx, num_napi - txq_idx);
1787 int rqpv = DIV_ROUND_UP(num_rx, num_napi - rxq_idx);
1788
1789 err = fbnic_alloc_napi_vector(fbd, fbn, num_napi, v_idx,
1790 tqpv, txq_idx, rqpv, rxq_idx);
1791 if (err)
1792 goto free_vectors;
1793
1794 /* Update counts and index */
1795 num_tx -= tqpv;
1796 txq_idx++;
1797
1798 num_rx -= rqpv;
1799 rxq_idx++;
1800
1801 v_idx++;
1802 }
1803
1804 return 0;
1805
1806 free_vectors:
1807 fbnic_free_napi_vectors(fbn);
1808
1809 return -ENOMEM;
1810 }
1811
fbnic_free_ring_resources(struct device * dev,struct fbnic_ring * ring)1812 static void fbnic_free_ring_resources(struct device *dev,
1813 struct fbnic_ring *ring)
1814 {
1815 kvfree(ring->buffer);
1816 ring->buffer = NULL;
1817
1818 /* If size is not set there are no descriptors present */
1819 if (!ring->size)
1820 return;
1821
1822 dma_free_coherent(dev, ring->size, ring->desc, ring->dma);
1823 ring->size_mask = 0;
1824 ring->size = 0;
1825 }
1826
fbnic_alloc_tx_ring_desc(struct fbnic_net * fbn,struct fbnic_ring * txr)1827 static int fbnic_alloc_tx_ring_desc(struct fbnic_net *fbn,
1828 struct fbnic_ring *txr)
1829 {
1830 struct device *dev = fbn->netdev->dev.parent;
1831 size_t size;
1832
1833 /* Round size up to nearest 4K */
1834 size = ALIGN(array_size(sizeof(*txr->desc), fbn->txq_size), 4096);
1835
1836 txr->desc = dma_alloc_coherent(dev, size, &txr->dma,
1837 GFP_KERNEL | __GFP_NOWARN);
1838 if (!txr->desc)
1839 return -ENOMEM;
1840
1841 /* txq_size should be a power of 2, so mask is just that -1 */
1842 txr->size_mask = fbn->txq_size - 1;
1843 txr->size = size;
1844
1845 return 0;
1846 }
1847
fbnic_alloc_tx_ring_buffer(struct fbnic_ring * txr)1848 static int fbnic_alloc_tx_ring_buffer(struct fbnic_ring *txr)
1849 {
1850 size_t size = array_size(sizeof(*txr->tx_buf), txr->size_mask + 1);
1851
1852 txr->tx_buf = kvzalloc(size, GFP_KERNEL | __GFP_NOWARN);
1853
1854 return txr->tx_buf ? 0 : -ENOMEM;
1855 }
1856
fbnic_alloc_tx_ring_resources(struct fbnic_net * fbn,struct fbnic_ring * txr)1857 static int fbnic_alloc_tx_ring_resources(struct fbnic_net *fbn,
1858 struct fbnic_ring *txr)
1859 {
1860 struct device *dev = fbn->netdev->dev.parent;
1861 int err;
1862
1863 if (txr->flags & FBNIC_RING_F_DISABLED)
1864 return 0;
1865
1866 err = fbnic_alloc_tx_ring_desc(fbn, txr);
1867 if (err)
1868 return err;
1869
1870 if (!(txr->flags & FBNIC_RING_F_CTX))
1871 return 0;
1872
1873 err = fbnic_alloc_tx_ring_buffer(txr);
1874 if (err)
1875 goto free_desc;
1876
1877 return 0;
1878
1879 free_desc:
1880 fbnic_free_ring_resources(dev, txr);
1881 return err;
1882 }
1883
fbnic_alloc_rx_ring_desc(struct fbnic_net * fbn,struct fbnic_ring * rxr)1884 static int fbnic_alloc_rx_ring_desc(struct fbnic_net *fbn,
1885 struct fbnic_ring *rxr)
1886 {
1887 struct device *dev = fbn->netdev->dev.parent;
1888 size_t desc_size = sizeof(*rxr->desc);
1889 u32 rxq_size;
1890 size_t size;
1891
1892 switch (rxr->doorbell - fbnic_ring_csr_base(rxr)) {
1893 case FBNIC_QUEUE_BDQ_HPQ_TAIL:
1894 rxq_size = fbn->hpq_size / FBNIC_BD_FRAG_COUNT;
1895 desc_size *= FBNIC_BD_FRAG_COUNT;
1896 break;
1897 case FBNIC_QUEUE_BDQ_PPQ_TAIL:
1898 rxq_size = fbn->ppq_size / FBNIC_BD_FRAG_COUNT;
1899 desc_size *= FBNIC_BD_FRAG_COUNT;
1900 break;
1901 case FBNIC_QUEUE_RCQ_HEAD:
1902 rxq_size = fbn->rcq_size;
1903 break;
1904 default:
1905 return -EINVAL;
1906 }
1907
1908 /* Round size up to nearest 4K */
1909 size = ALIGN(array_size(desc_size, rxq_size), 4096);
1910
1911 rxr->desc = dma_alloc_coherent(dev, size, &rxr->dma,
1912 GFP_KERNEL | __GFP_NOWARN);
1913 if (!rxr->desc)
1914 return -ENOMEM;
1915
1916 /* rxq_size should be a power of 2, so mask is just that -1 */
1917 rxr->size_mask = rxq_size - 1;
1918 rxr->size = size;
1919
1920 return 0;
1921 }
1922
fbnic_alloc_rx_ring_buffer(struct fbnic_ring * rxr)1923 static int fbnic_alloc_rx_ring_buffer(struct fbnic_ring *rxr)
1924 {
1925 size_t size = array_size(sizeof(*rxr->rx_buf), rxr->size_mask + 1);
1926
1927 if (rxr->flags & FBNIC_RING_F_CTX)
1928 size = sizeof(*rxr->rx_buf) * (rxr->size_mask + 1);
1929 else
1930 size = sizeof(*rxr->pkt);
1931
1932 rxr->rx_buf = kvzalloc(size, GFP_KERNEL | __GFP_NOWARN);
1933
1934 return rxr->rx_buf ? 0 : -ENOMEM;
1935 }
1936
fbnic_alloc_rx_ring_resources(struct fbnic_net * fbn,struct fbnic_ring * rxr)1937 static int fbnic_alloc_rx_ring_resources(struct fbnic_net *fbn,
1938 struct fbnic_ring *rxr)
1939 {
1940 struct device *dev = fbn->netdev->dev.parent;
1941 int err;
1942
1943 err = fbnic_alloc_rx_ring_desc(fbn, rxr);
1944 if (err)
1945 return err;
1946
1947 err = fbnic_alloc_rx_ring_buffer(rxr);
1948 if (err)
1949 goto free_desc;
1950
1951 return 0;
1952
1953 free_desc:
1954 fbnic_free_ring_resources(dev, rxr);
1955 return err;
1956 }
1957
fbnic_free_qt_resources(struct fbnic_net * fbn,struct fbnic_q_triad * qt)1958 static void fbnic_free_qt_resources(struct fbnic_net *fbn,
1959 struct fbnic_q_triad *qt)
1960 {
1961 struct device *dev = fbn->netdev->dev.parent;
1962
1963 fbnic_free_ring_resources(dev, &qt->cmpl);
1964 fbnic_free_ring_resources(dev, &qt->sub1);
1965 fbnic_free_ring_resources(dev, &qt->sub0);
1966
1967 if (xdp_rxq_info_is_reg(&qt->xdp_rxq)) {
1968 xdp_rxq_info_unreg_mem_model(&qt->xdp_rxq);
1969 xdp_rxq_info_unreg(&qt->xdp_rxq);
1970 fbnic_free_qt_page_pools(qt);
1971 }
1972 }
1973
fbnic_alloc_tx_qt_resources(struct fbnic_net * fbn,struct fbnic_q_triad * qt)1974 static int fbnic_alloc_tx_qt_resources(struct fbnic_net *fbn,
1975 struct fbnic_q_triad *qt)
1976 {
1977 struct device *dev = fbn->netdev->dev.parent;
1978 int err;
1979
1980 err = fbnic_alloc_tx_ring_resources(fbn, &qt->sub0);
1981 if (err)
1982 return err;
1983
1984 err = fbnic_alloc_tx_ring_resources(fbn, &qt->sub1);
1985 if (err)
1986 goto free_sub0;
1987
1988 err = fbnic_alloc_tx_ring_resources(fbn, &qt->cmpl);
1989 if (err)
1990 goto free_sub1;
1991
1992 return 0;
1993
1994 free_sub1:
1995 fbnic_free_ring_resources(dev, &qt->sub1);
1996 free_sub0:
1997 fbnic_free_ring_resources(dev, &qt->sub0);
1998 return err;
1999 }
2000
fbnic_alloc_rx_qt_resources(struct fbnic_net * fbn,struct fbnic_napi_vector * nv,struct fbnic_q_triad * qt)2001 static int fbnic_alloc_rx_qt_resources(struct fbnic_net *fbn,
2002 struct fbnic_napi_vector *nv,
2003 struct fbnic_q_triad *qt)
2004 {
2005 struct device *dev = fbn->netdev->dev.parent;
2006 int err;
2007
2008 err = fbnic_alloc_qt_page_pools(fbn, qt, qt->cmpl.q_idx);
2009 if (err)
2010 return err;
2011
2012 err = xdp_rxq_info_reg(&qt->xdp_rxq, fbn->netdev, qt->sub0.q_idx,
2013 nv->napi.napi_id);
2014 if (err)
2015 goto free_page_pools;
2016
2017 err = xdp_rxq_info_reg_mem_model(&qt->xdp_rxq, MEM_TYPE_PAGE_POOL,
2018 qt->sub0.page_pool);
2019 if (err)
2020 goto unreg_rxq;
2021
2022 err = fbnic_alloc_rx_ring_resources(fbn, &qt->sub0);
2023 if (err)
2024 goto unreg_mm;
2025
2026 err = fbnic_alloc_rx_ring_resources(fbn, &qt->sub1);
2027 if (err)
2028 goto free_sub0;
2029
2030 err = fbnic_alloc_rx_ring_resources(fbn, &qt->cmpl);
2031 if (err)
2032 goto free_sub1;
2033
2034 return 0;
2035
2036 free_sub1:
2037 fbnic_free_ring_resources(dev, &qt->sub1);
2038 free_sub0:
2039 fbnic_free_ring_resources(dev, &qt->sub0);
2040 unreg_mm:
2041 xdp_rxq_info_unreg_mem_model(&qt->xdp_rxq);
2042 unreg_rxq:
2043 xdp_rxq_info_unreg(&qt->xdp_rxq);
2044 free_page_pools:
2045 fbnic_free_qt_page_pools(qt);
2046 return err;
2047 }
2048
fbnic_free_nv_resources(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2049 static void fbnic_free_nv_resources(struct fbnic_net *fbn,
2050 struct fbnic_napi_vector *nv)
2051 {
2052 int i;
2053
2054 for (i = 0; i < nv->txt_count + nv->rxt_count; i++)
2055 fbnic_free_qt_resources(fbn, &nv->qt[i]);
2056 }
2057
fbnic_alloc_nv_resources(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2058 static int fbnic_alloc_nv_resources(struct fbnic_net *fbn,
2059 struct fbnic_napi_vector *nv)
2060 {
2061 int i, j, err;
2062
2063 /* Allocate Tx Resources */
2064 for (i = 0; i < nv->txt_count; i++) {
2065 err = fbnic_alloc_tx_qt_resources(fbn, &nv->qt[i]);
2066 if (err)
2067 goto free_qt_resources;
2068 }
2069
2070 /* Allocate Rx Resources */
2071 for (j = 0; j < nv->rxt_count; j++, i++) {
2072 err = fbnic_alloc_rx_qt_resources(fbn, nv, &nv->qt[i]);
2073 if (err)
2074 goto free_qt_resources;
2075 }
2076
2077 return 0;
2078
2079 free_qt_resources:
2080 while (i--)
2081 fbnic_free_qt_resources(fbn, &nv->qt[i]);
2082 return err;
2083 }
2084
fbnic_free_resources(struct fbnic_net * fbn)2085 void fbnic_free_resources(struct fbnic_net *fbn)
2086 {
2087 int i;
2088
2089 for (i = 0; i < fbn->num_napi; i++)
2090 fbnic_free_nv_resources(fbn, fbn->napi[i]);
2091 }
2092
fbnic_alloc_resources(struct fbnic_net * fbn)2093 int fbnic_alloc_resources(struct fbnic_net *fbn)
2094 {
2095 int i, err = -ENODEV;
2096
2097 for (i = 0; i < fbn->num_napi; i++) {
2098 err = fbnic_alloc_nv_resources(fbn, fbn->napi[i]);
2099 if (err)
2100 goto free_resources;
2101 }
2102
2103 return 0;
2104
2105 free_resources:
2106 while (i--)
2107 fbnic_free_nv_resources(fbn, fbn->napi[i]);
2108
2109 return err;
2110 }
2111
fbnic_set_netif_napi(struct fbnic_napi_vector * nv)2112 static void fbnic_set_netif_napi(struct fbnic_napi_vector *nv)
2113 {
2114 int i, j;
2115
2116 /* Associate Tx queue with NAPI */
2117 for (i = 0; i < nv->txt_count; i++) {
2118 struct fbnic_q_triad *qt = &nv->qt[i];
2119
2120 netif_queue_set_napi(nv->napi.dev, qt->sub0.q_idx,
2121 NETDEV_QUEUE_TYPE_TX, &nv->napi);
2122 }
2123
2124 /* Associate Rx queue with NAPI */
2125 for (j = 0; j < nv->rxt_count; j++, i++) {
2126 struct fbnic_q_triad *qt = &nv->qt[i];
2127
2128 netif_queue_set_napi(nv->napi.dev, qt->cmpl.q_idx,
2129 NETDEV_QUEUE_TYPE_RX, &nv->napi);
2130 }
2131 }
2132
fbnic_reset_netif_napi(struct fbnic_napi_vector * nv)2133 static void fbnic_reset_netif_napi(struct fbnic_napi_vector *nv)
2134 {
2135 int i, j;
2136
2137 /* Disassociate Tx queue from NAPI */
2138 for (i = 0; i < nv->txt_count; i++) {
2139 struct fbnic_q_triad *qt = &nv->qt[i];
2140
2141 netif_queue_set_napi(nv->napi.dev, qt->sub0.q_idx,
2142 NETDEV_QUEUE_TYPE_TX, NULL);
2143 }
2144
2145 /* Disassociate Rx queue from NAPI */
2146 for (j = 0; j < nv->rxt_count; j++, i++) {
2147 struct fbnic_q_triad *qt = &nv->qt[i];
2148
2149 netif_queue_set_napi(nv->napi.dev, qt->cmpl.q_idx,
2150 NETDEV_QUEUE_TYPE_RX, NULL);
2151 }
2152 }
2153
fbnic_set_netif_queues(struct fbnic_net * fbn)2154 int fbnic_set_netif_queues(struct fbnic_net *fbn)
2155 {
2156 int i, err;
2157
2158 err = netif_set_real_num_queues(fbn->netdev, fbn->num_tx_queues,
2159 fbn->num_rx_queues);
2160 if (err)
2161 return err;
2162
2163 for (i = 0; i < fbn->num_napi; i++)
2164 fbnic_set_netif_napi(fbn->napi[i]);
2165
2166 return 0;
2167 }
2168
fbnic_reset_netif_queues(struct fbnic_net * fbn)2169 void fbnic_reset_netif_queues(struct fbnic_net *fbn)
2170 {
2171 int i;
2172
2173 for (i = 0; i < fbn->num_napi; i++)
2174 fbnic_reset_netif_napi(fbn->napi[i]);
2175 }
2176
fbnic_disable_twq0(struct fbnic_ring * txr)2177 static void fbnic_disable_twq0(struct fbnic_ring *txr)
2178 {
2179 u32 twq_ctl = fbnic_ring_rd32(txr, FBNIC_QUEUE_TWQ0_CTL);
2180
2181 twq_ctl &= ~FBNIC_QUEUE_TWQ_CTL_ENABLE;
2182
2183 fbnic_ring_wr32(txr, FBNIC_QUEUE_TWQ0_CTL, twq_ctl);
2184 }
2185
fbnic_disable_twq1(struct fbnic_ring * txr)2186 static void fbnic_disable_twq1(struct fbnic_ring *txr)
2187 {
2188 u32 twq_ctl = fbnic_ring_rd32(txr, FBNIC_QUEUE_TWQ1_CTL);
2189
2190 twq_ctl &= ~FBNIC_QUEUE_TWQ_CTL_ENABLE;
2191
2192 fbnic_ring_wr32(txr, FBNIC_QUEUE_TWQ1_CTL, twq_ctl);
2193 }
2194
fbnic_disable_tcq(struct fbnic_ring * txr)2195 static void fbnic_disable_tcq(struct fbnic_ring *txr)
2196 {
2197 fbnic_ring_wr32(txr, FBNIC_QUEUE_TCQ_CTL, 0);
2198 fbnic_ring_wr32(txr, FBNIC_QUEUE_TIM_MASK, FBNIC_QUEUE_TIM_MASK_MASK);
2199 }
2200
fbnic_disable_bdq(struct fbnic_ring * hpq,struct fbnic_ring * ppq)2201 static void fbnic_disable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
2202 {
2203 u32 bdq_ctl = fbnic_ring_rd32(hpq, FBNIC_QUEUE_BDQ_CTL);
2204
2205 bdq_ctl &= ~FBNIC_QUEUE_BDQ_CTL_ENABLE;
2206
2207 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_CTL, bdq_ctl);
2208 }
2209
fbnic_disable_rcq(struct fbnic_ring * rxr)2210 static void fbnic_disable_rcq(struct fbnic_ring *rxr)
2211 {
2212 fbnic_ring_wr32(rxr, FBNIC_QUEUE_RCQ_CTL, 0);
2213 fbnic_ring_wr32(rxr, FBNIC_QUEUE_RIM_MASK, FBNIC_QUEUE_RIM_MASK_MASK);
2214 }
2215
fbnic_napi_disable(struct fbnic_net * fbn)2216 void fbnic_napi_disable(struct fbnic_net *fbn)
2217 {
2218 int i;
2219
2220 for (i = 0; i < fbn->num_napi; i++) {
2221 napi_disable_locked(&fbn->napi[i]->napi);
2222
2223 fbnic_nv_irq_disable(fbn->napi[i]);
2224 }
2225 }
2226
__fbnic_nv_disable(struct fbnic_napi_vector * nv)2227 static void __fbnic_nv_disable(struct fbnic_napi_vector *nv)
2228 {
2229 int i, t;
2230
2231 /* Disable Tx queue triads */
2232 for (t = 0; t < nv->txt_count; t++) {
2233 struct fbnic_q_triad *qt = &nv->qt[t];
2234
2235 fbnic_disable_twq0(&qt->sub0);
2236 fbnic_disable_twq1(&qt->sub1);
2237 fbnic_disable_tcq(&qt->cmpl);
2238 }
2239
2240 /* Disable Rx queue triads */
2241 for (i = 0; i < nv->rxt_count; i++, t++) {
2242 struct fbnic_q_triad *qt = &nv->qt[t];
2243
2244 fbnic_disable_bdq(&qt->sub0, &qt->sub1);
2245 fbnic_disable_rcq(&qt->cmpl);
2246 }
2247 }
2248
2249 static void
fbnic_nv_disable(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2250 fbnic_nv_disable(struct fbnic_net *fbn, struct fbnic_napi_vector *nv)
2251 {
2252 __fbnic_nv_disable(nv);
2253 fbnic_wrfl(fbn->fbd);
2254 }
2255
fbnic_disable(struct fbnic_net * fbn)2256 void fbnic_disable(struct fbnic_net *fbn)
2257 {
2258 struct fbnic_dev *fbd = fbn->fbd;
2259 int i;
2260
2261 for (i = 0; i < fbn->num_napi; i++)
2262 __fbnic_nv_disable(fbn->napi[i]);
2263
2264 fbnic_wrfl(fbd);
2265 }
2266
fbnic_tx_flush(struct fbnic_dev * fbd)2267 static void fbnic_tx_flush(struct fbnic_dev *fbd)
2268 {
2269 netdev_warn(fbd->netdev, "triggering Tx flush\n");
2270
2271 fbnic_rmw32(fbd, FBNIC_TMI_DROP_CTRL, FBNIC_TMI_DROP_CTRL_EN,
2272 FBNIC_TMI_DROP_CTRL_EN);
2273 }
2274
fbnic_tx_flush_off(struct fbnic_dev * fbd)2275 static void fbnic_tx_flush_off(struct fbnic_dev *fbd)
2276 {
2277 fbnic_rmw32(fbd, FBNIC_TMI_DROP_CTRL, FBNIC_TMI_DROP_CTRL_EN, 0);
2278 }
2279
2280 struct fbnic_idle_regs {
2281 u32 reg_base;
2282 u8 reg_cnt;
2283 };
2284
fbnic_all_idle(struct fbnic_dev * fbd,const struct fbnic_idle_regs * regs,unsigned int nregs)2285 static bool fbnic_all_idle(struct fbnic_dev *fbd,
2286 const struct fbnic_idle_regs *regs,
2287 unsigned int nregs)
2288 {
2289 unsigned int i, j;
2290
2291 for (i = 0; i < nregs; i++) {
2292 for (j = 0; j < regs[i].reg_cnt; j++) {
2293 if (fbnic_rd32(fbd, regs[i].reg_base + j) != ~0U)
2294 return false;
2295 }
2296 }
2297 return true;
2298 }
2299
fbnic_idle_dump(struct fbnic_dev * fbd,const struct fbnic_idle_regs * regs,unsigned int nregs,const char * dir,int err)2300 static void fbnic_idle_dump(struct fbnic_dev *fbd,
2301 const struct fbnic_idle_regs *regs,
2302 unsigned int nregs, const char *dir, int err)
2303 {
2304 unsigned int i, j;
2305
2306 netdev_err(fbd->netdev, "error waiting for %s idle %d\n", dir, err);
2307 for (i = 0; i < nregs; i++)
2308 for (j = 0; j < regs[i].reg_cnt; j++)
2309 netdev_err(fbd->netdev, "0x%04x: %08x\n",
2310 regs[i].reg_base + j,
2311 fbnic_rd32(fbd, regs[i].reg_base + j));
2312 }
2313
fbnic_wait_all_queues_idle(struct fbnic_dev * fbd,bool may_fail)2314 int fbnic_wait_all_queues_idle(struct fbnic_dev *fbd, bool may_fail)
2315 {
2316 static const struct fbnic_idle_regs tx[] = {
2317 { FBNIC_QM_TWQ_IDLE(0), FBNIC_QM_TWQ_IDLE_CNT, },
2318 { FBNIC_QM_TQS_IDLE(0), FBNIC_QM_TQS_IDLE_CNT, },
2319 { FBNIC_QM_TDE_IDLE(0), FBNIC_QM_TDE_IDLE_CNT, },
2320 { FBNIC_QM_TCQ_IDLE(0), FBNIC_QM_TCQ_IDLE_CNT, },
2321 }, rx[] = {
2322 { FBNIC_QM_HPQ_IDLE(0), FBNIC_QM_HPQ_IDLE_CNT, },
2323 { FBNIC_QM_PPQ_IDLE(0), FBNIC_QM_PPQ_IDLE_CNT, },
2324 { FBNIC_QM_RCQ_IDLE(0), FBNIC_QM_RCQ_IDLE_CNT, },
2325 };
2326 bool idle;
2327 int err;
2328
2329 err = read_poll_timeout_atomic(fbnic_all_idle, idle, idle, 2, 500000,
2330 false, fbd, tx, ARRAY_SIZE(tx));
2331 if (err == -ETIMEDOUT) {
2332 fbnic_tx_flush(fbd);
2333 err = read_poll_timeout_atomic(fbnic_all_idle, idle, idle,
2334 2, 500000, false,
2335 fbd, tx, ARRAY_SIZE(tx));
2336 fbnic_tx_flush_off(fbd);
2337 }
2338 if (err) {
2339 fbnic_idle_dump(fbd, tx, ARRAY_SIZE(tx), "Tx", err);
2340 if (may_fail)
2341 return err;
2342 }
2343
2344 err = read_poll_timeout_atomic(fbnic_all_idle, idle, idle, 2, 500000,
2345 false, fbd, rx, ARRAY_SIZE(rx));
2346 if (err)
2347 fbnic_idle_dump(fbd, rx, ARRAY_SIZE(rx), "Rx", err);
2348 return err;
2349 }
2350
2351 static int
fbnic_wait_queue_idle(struct fbnic_net * fbn,bool rx,unsigned int idx)2352 fbnic_wait_queue_idle(struct fbnic_net *fbn, bool rx, unsigned int idx)
2353 {
2354 static const unsigned int tx_regs[] = {
2355 FBNIC_QM_TWQ_IDLE(0), FBNIC_QM_TQS_IDLE(0),
2356 FBNIC_QM_TDE_IDLE(0), FBNIC_QM_TCQ_IDLE(0),
2357 }, rx_regs[] = {
2358 FBNIC_QM_HPQ_IDLE(0), FBNIC_QM_PPQ_IDLE(0),
2359 FBNIC_QM_RCQ_IDLE(0),
2360 };
2361 struct fbnic_dev *fbd = fbn->fbd;
2362 unsigned int val, mask, off;
2363 const unsigned int *regs;
2364 unsigned int reg_cnt;
2365 int i, err;
2366
2367 regs = rx ? rx_regs : tx_regs;
2368 reg_cnt = rx ? ARRAY_SIZE(rx_regs) : ARRAY_SIZE(tx_regs);
2369
2370 off = idx / 32;
2371 mask = BIT(idx % 32);
2372
2373 for (i = 0; i < reg_cnt; i++) {
2374 err = read_poll_timeout_atomic(fbnic_rd32, val, val & mask,
2375 2, 500000, false,
2376 fbd, regs[i] + off);
2377 if (err) {
2378 netdev_err(fbd->netdev,
2379 "wait for queue %s%d idle failed 0x%04x(%d): %08x (mask: %08x)\n",
2380 rx ? "Rx" : "Tx", idx, regs[i] + off, i,
2381 val, mask);
2382 return err;
2383 }
2384 }
2385
2386 return 0;
2387 }
2388
fbnic_nv_flush(struct fbnic_napi_vector * nv)2389 static void fbnic_nv_flush(struct fbnic_napi_vector *nv)
2390 {
2391 int j, t;
2392
2393 /* Flush any processed Tx Queue Triads and drop the rest */
2394 for (t = 0; t < nv->txt_count; t++) {
2395 struct fbnic_q_triad *qt = &nv->qt[t];
2396 struct netdev_queue *tx_queue;
2397
2398 /* Clean the work queues of unprocessed work */
2399 fbnic_clean_twq0(nv, 0, &qt->sub0, true, qt->sub0.tail);
2400 fbnic_clean_twq1(nv, false, &qt->sub1, true,
2401 qt->sub1.tail);
2402
2403 /* Reset completion queue descriptor ring */
2404 memset(qt->cmpl.desc, 0, qt->cmpl.size);
2405
2406 /* Nothing else to do if Tx queue is disabled */
2407 if (qt->sub0.flags & FBNIC_RING_F_DISABLED)
2408 continue;
2409
2410 /* Reset BQL associated with Tx queue */
2411 tx_queue = netdev_get_tx_queue(nv->napi.dev,
2412 qt->sub0.q_idx);
2413 netdev_tx_reset_queue(tx_queue);
2414 }
2415
2416 /* Flush any processed Rx Queue Triads and drop the rest */
2417 for (j = 0; j < nv->rxt_count; j++, t++) {
2418 struct fbnic_q_triad *qt = &nv->qt[t];
2419
2420 /* Clean the work queues of unprocessed work */
2421 fbnic_clean_bdq(&qt->sub0, qt->sub0.tail, 0);
2422 fbnic_clean_bdq(&qt->sub1, qt->sub1.tail, 0);
2423
2424 /* Reset completion queue descriptor ring */
2425 memset(qt->cmpl.desc, 0, qt->cmpl.size);
2426
2427 fbnic_put_pkt_buff(qt, qt->cmpl.pkt, 0);
2428 memset(qt->cmpl.pkt, 0, sizeof(struct fbnic_pkt_buff));
2429 }
2430 }
2431
fbnic_flush(struct fbnic_net * fbn)2432 void fbnic_flush(struct fbnic_net *fbn)
2433 {
2434 int i;
2435
2436 for (i = 0; i < fbn->num_napi; i++)
2437 fbnic_nv_flush(fbn->napi[i]);
2438 }
2439
fbnic_nv_fill(struct fbnic_napi_vector * nv)2440 static void fbnic_nv_fill(struct fbnic_napi_vector *nv)
2441 {
2442 int j, t;
2443
2444 /* Configure NAPI mapping and populate pages
2445 * in the BDQ rings to use for Rx
2446 */
2447 for (j = 0, t = nv->txt_count; j < nv->rxt_count; j++, t++) {
2448 struct fbnic_q_triad *qt = &nv->qt[t];
2449
2450 /* Populate the header and payload BDQs */
2451 fbnic_fill_bdq(&qt->sub0);
2452 fbnic_fill_bdq(&qt->sub1);
2453 }
2454 }
2455
fbnic_fill(struct fbnic_net * fbn)2456 void fbnic_fill(struct fbnic_net *fbn)
2457 {
2458 int i;
2459
2460 for (i = 0; i < fbn->num_napi; i++)
2461 fbnic_nv_fill(fbn->napi[i]);
2462 }
2463
fbnic_enable_twq0(struct fbnic_ring * twq)2464 static void fbnic_enable_twq0(struct fbnic_ring *twq)
2465 {
2466 u32 log_size = fls(twq->size_mask);
2467
2468 if (!twq->size_mask)
2469 return;
2470
2471 /* Reset head/tail */
2472 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_CTL, FBNIC_QUEUE_TWQ_CTL_RESET);
2473 twq->tail = 0;
2474 twq->head = 0;
2475
2476 /* Store descriptor ring address and size */
2477 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_BAL, lower_32_bits(twq->dma));
2478 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_BAH, upper_32_bits(twq->dma));
2479
2480 /* Write lower 4 bits of log size as 64K ring size is 0 */
2481 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_SIZE, log_size & 0xf);
2482
2483 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_CTL, FBNIC_QUEUE_TWQ_CTL_ENABLE);
2484 }
2485
fbnic_enable_twq1(struct fbnic_ring * twq)2486 static void fbnic_enable_twq1(struct fbnic_ring *twq)
2487 {
2488 u32 log_size = fls(twq->size_mask);
2489
2490 if (!twq->size_mask)
2491 return;
2492
2493 /* Reset head/tail */
2494 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_CTL, FBNIC_QUEUE_TWQ_CTL_RESET);
2495 twq->tail = 0;
2496 twq->head = 0;
2497
2498 /* Store descriptor ring address and size */
2499 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_BAL, lower_32_bits(twq->dma));
2500 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_BAH, upper_32_bits(twq->dma));
2501
2502 /* Write lower 4 bits of log size as 64K ring size is 0 */
2503 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_SIZE, log_size & 0xf);
2504
2505 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_CTL, FBNIC_QUEUE_TWQ_CTL_ENABLE);
2506 }
2507
fbnic_enable_tcq(struct fbnic_napi_vector * nv,struct fbnic_ring * tcq)2508 static void fbnic_enable_tcq(struct fbnic_napi_vector *nv,
2509 struct fbnic_ring *tcq)
2510 {
2511 u32 log_size = fls(tcq->size_mask);
2512
2513 if (!tcq->size_mask)
2514 return;
2515
2516 /* Reset head/tail */
2517 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_CTL, FBNIC_QUEUE_TCQ_CTL_RESET);
2518 tcq->tail = 0;
2519 tcq->head = 0;
2520
2521 /* Store descriptor ring address and size */
2522 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_BAL, lower_32_bits(tcq->dma));
2523 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_BAH, upper_32_bits(tcq->dma));
2524
2525 /* Write lower 4 bits of log size as 64K ring size is 0 */
2526 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_SIZE, log_size & 0xf);
2527
2528 /* Store interrupt information for the completion queue */
2529 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TIM_CTL, nv->v_idx);
2530 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TIM_THRESHOLD, tcq->size_mask / 2);
2531 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TIM_MASK, 0);
2532
2533 /* Enable queue */
2534 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_CTL, FBNIC_QUEUE_TCQ_CTL_ENABLE);
2535 }
2536
fbnic_enable_bdq(struct fbnic_ring * hpq,struct fbnic_ring * ppq)2537 static void fbnic_enable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
2538 {
2539 u32 bdq_ctl = FBNIC_QUEUE_BDQ_CTL_ENABLE;
2540 u32 log_size;
2541
2542 /* Reset head/tail */
2543 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_CTL, FBNIC_QUEUE_BDQ_CTL_RESET);
2544 ppq->tail = 0;
2545 ppq->head = 0;
2546 hpq->tail = 0;
2547 hpq->head = 0;
2548
2549 log_size = fls(hpq->size_mask);
2550
2551 /* Store descriptor ring address and size */
2552 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_BAL, lower_32_bits(hpq->dma));
2553 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_BAH, upper_32_bits(hpq->dma));
2554
2555 /* Write lower 4 bits of log size as 64K ring size is 0 */
2556 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_SIZE, log_size & 0xf);
2557
2558 if (!ppq->size_mask)
2559 goto write_ctl;
2560
2561 log_size = fls(ppq->size_mask);
2562
2563 /* Add enabling of PPQ to BDQ control */
2564 bdq_ctl |= FBNIC_QUEUE_BDQ_CTL_PPQ_ENABLE;
2565
2566 /* Store descriptor ring address and size */
2567 fbnic_ring_wr32(ppq, FBNIC_QUEUE_BDQ_PPQ_BAL, lower_32_bits(ppq->dma));
2568 fbnic_ring_wr32(ppq, FBNIC_QUEUE_BDQ_PPQ_BAH, upper_32_bits(ppq->dma));
2569 fbnic_ring_wr32(ppq, FBNIC_QUEUE_BDQ_PPQ_SIZE, log_size & 0xf);
2570
2571 write_ctl:
2572 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_CTL, bdq_ctl);
2573 }
2574
fbnic_config_drop_mode_rcq(struct fbnic_napi_vector * nv,struct fbnic_ring * rcq)2575 static void fbnic_config_drop_mode_rcq(struct fbnic_napi_vector *nv,
2576 struct fbnic_ring *rcq)
2577 {
2578 u32 drop_mode, rcq_ctl;
2579
2580 drop_mode = FBNIC_QUEUE_RDE_CTL0_DROP_IMMEDIATE;
2581
2582 /* Specify packet layout */
2583 rcq_ctl = FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_DROP_MODE_MASK, drop_mode) |
2584 FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_MIN_HROOM_MASK, FBNIC_RX_HROOM) |
2585 FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_MIN_TROOM_MASK, FBNIC_RX_TROOM);
2586
2587 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RDE_CTL0, rcq_ctl);
2588 }
2589
fbnic_config_rim_threshold(struct fbnic_ring * rcq,u16 nv_idx,u32 rx_desc)2590 static void fbnic_config_rim_threshold(struct fbnic_ring *rcq, u16 nv_idx, u32 rx_desc)
2591 {
2592 u32 threshold;
2593
2594 /* Set the threhsold to half the ring size if rx_frames
2595 * is not configured
2596 */
2597 threshold = rx_desc ? : rcq->size_mask / 2;
2598
2599 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RIM_CTL, nv_idx);
2600 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RIM_THRESHOLD, threshold);
2601 }
2602
fbnic_config_txrx_usecs(struct fbnic_napi_vector * nv,u32 arm)2603 void fbnic_config_txrx_usecs(struct fbnic_napi_vector *nv, u32 arm)
2604 {
2605 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2606 struct fbnic_dev *fbd = nv->fbd;
2607 u32 val = arm;
2608
2609 val |= FIELD_PREP(FBNIC_INTR_CQ_REARM_RCQ_TIMEOUT, fbn->rx_usecs) |
2610 FBNIC_INTR_CQ_REARM_RCQ_TIMEOUT_UPD_EN;
2611 val |= FIELD_PREP(FBNIC_INTR_CQ_REARM_TCQ_TIMEOUT, fbn->tx_usecs) |
2612 FBNIC_INTR_CQ_REARM_TCQ_TIMEOUT_UPD_EN;
2613
2614 fbnic_wr32(fbd, FBNIC_INTR_CQ_REARM(nv->v_idx), val);
2615 }
2616
fbnic_config_rx_frames(struct fbnic_napi_vector * nv)2617 void fbnic_config_rx_frames(struct fbnic_napi_vector *nv)
2618 {
2619 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2620 int i;
2621
2622 for (i = nv->txt_count; i < nv->rxt_count + nv->txt_count; i++) {
2623 struct fbnic_q_triad *qt = &nv->qt[i];
2624
2625 fbnic_config_rim_threshold(&qt->cmpl, nv->v_idx,
2626 fbn->rx_max_frames *
2627 FBNIC_MIN_RXD_PER_FRAME);
2628 }
2629 }
2630
fbnic_enable_rcq(struct fbnic_napi_vector * nv,struct fbnic_ring * rcq)2631 static void fbnic_enable_rcq(struct fbnic_napi_vector *nv,
2632 struct fbnic_ring *rcq)
2633 {
2634 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2635 u32 log_size = fls(rcq->size_mask);
2636 u32 hds_thresh = fbn->hds_thresh;
2637 u32 rcq_ctl = 0;
2638
2639 fbnic_config_drop_mode_rcq(nv, rcq);
2640
2641 /* Force lower bound on MAX_HEADER_BYTES. Below this, all frames should
2642 * be split at L4. It would also result in the frames being split at
2643 * L2/L3 depending on the frame size.
2644 */
2645 if (fbn->hds_thresh < FBNIC_HDR_BYTES_MIN) {
2646 rcq_ctl = FBNIC_QUEUE_RDE_CTL0_EN_HDR_SPLIT;
2647 hds_thresh = FBNIC_HDR_BYTES_MIN;
2648 }
2649
2650 rcq_ctl |= FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_PADLEN_MASK, FBNIC_RX_PAD) |
2651 FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_MAX_HDR_MASK, hds_thresh) |
2652 FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_PAYLD_OFF_MASK,
2653 FBNIC_RX_PAYLD_OFFSET) |
2654 FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_PAYLD_PG_CL_MASK,
2655 FBNIC_RX_PAYLD_PG_CL);
2656 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RDE_CTL1, rcq_ctl);
2657
2658 /* Reset head/tail */
2659 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_CTL, FBNIC_QUEUE_RCQ_CTL_RESET);
2660 rcq->head = 0;
2661 rcq->tail = 0;
2662
2663 /* Store descriptor ring address and size */
2664 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_BAL, lower_32_bits(rcq->dma));
2665 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_BAH, upper_32_bits(rcq->dma));
2666
2667 /* Write lower 4 bits of log size as 64K ring size is 0 */
2668 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_SIZE, log_size & 0xf);
2669
2670 /* Store interrupt information for the completion queue */
2671 fbnic_config_rim_threshold(rcq, nv->v_idx, fbn->rx_max_frames *
2672 FBNIC_MIN_RXD_PER_FRAME);
2673 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RIM_MASK, 0);
2674
2675 /* Enable queue */
2676 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_CTL, FBNIC_QUEUE_RCQ_CTL_ENABLE);
2677 }
2678
__fbnic_nv_enable(struct fbnic_napi_vector * nv)2679 static void __fbnic_nv_enable(struct fbnic_napi_vector *nv)
2680 {
2681 int j, t;
2682
2683 /* Setup Tx Queue Triads */
2684 for (t = 0; t < nv->txt_count; t++) {
2685 struct fbnic_q_triad *qt = &nv->qt[t];
2686
2687 fbnic_enable_twq0(&qt->sub0);
2688 fbnic_enable_twq1(&qt->sub1);
2689 fbnic_enable_tcq(nv, &qt->cmpl);
2690 }
2691
2692 /* Setup Rx Queue Triads */
2693 for (j = 0; j < nv->rxt_count; j++, t++) {
2694 struct fbnic_q_triad *qt = &nv->qt[t];
2695
2696 page_pool_enable_direct_recycling(qt->sub0.page_pool,
2697 &nv->napi);
2698 page_pool_enable_direct_recycling(qt->sub1.page_pool,
2699 &nv->napi);
2700
2701 fbnic_enable_bdq(&qt->sub0, &qt->sub1);
2702 fbnic_config_drop_mode_rcq(nv, &qt->cmpl);
2703 fbnic_enable_rcq(nv, &qt->cmpl);
2704 }
2705 }
2706
fbnic_nv_enable(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2707 static void fbnic_nv_enable(struct fbnic_net *fbn, struct fbnic_napi_vector *nv)
2708 {
2709 __fbnic_nv_enable(nv);
2710 fbnic_wrfl(fbn->fbd);
2711 }
2712
fbnic_enable(struct fbnic_net * fbn)2713 void fbnic_enable(struct fbnic_net *fbn)
2714 {
2715 struct fbnic_dev *fbd = fbn->fbd;
2716 int i;
2717
2718 for (i = 0; i < fbn->num_napi; i++)
2719 __fbnic_nv_enable(fbn->napi[i]);
2720
2721 fbnic_wrfl(fbd);
2722 }
2723
fbnic_nv_irq_enable(struct fbnic_napi_vector * nv)2724 static void fbnic_nv_irq_enable(struct fbnic_napi_vector *nv)
2725 {
2726 fbnic_config_txrx_usecs(nv, FBNIC_INTR_CQ_REARM_INTR_UNMASK);
2727 }
2728
fbnic_napi_enable(struct fbnic_net * fbn)2729 void fbnic_napi_enable(struct fbnic_net *fbn)
2730 {
2731 u32 irqs[FBNIC_MAX_MSIX_VECS / 32] = {};
2732 struct fbnic_dev *fbd = fbn->fbd;
2733 int i;
2734
2735 for (i = 0; i < fbn->num_napi; i++) {
2736 struct fbnic_napi_vector *nv = fbn->napi[i];
2737
2738 napi_enable_locked(&nv->napi);
2739
2740 fbnic_nv_irq_enable(nv);
2741
2742 /* Record bit used for NAPI IRQs so we can
2743 * set the mask appropriately
2744 */
2745 irqs[nv->v_idx / 32] |= BIT(nv->v_idx % 32);
2746 }
2747
2748 /* Force the first interrupt on the device to guarantee
2749 * that any packets that may have been enqueued during the
2750 * bringup are processed.
2751 */
2752 for (i = 0; i < ARRAY_SIZE(irqs); i++) {
2753 if (!irqs[i])
2754 continue;
2755 fbnic_wr32(fbd, FBNIC_INTR_SET(i), irqs[i]);
2756 }
2757
2758 fbnic_wrfl(fbd);
2759 }
2760
fbnic_napi_depletion_check(struct net_device * netdev)2761 void fbnic_napi_depletion_check(struct net_device *netdev)
2762 {
2763 struct fbnic_net *fbn = netdev_priv(netdev);
2764 u32 irqs[FBNIC_MAX_MSIX_VECS / 32] = {};
2765 struct fbnic_dev *fbd = fbn->fbd;
2766 int i, j, t;
2767
2768 for (i = 0; i < fbn->num_napi; i++) {
2769 struct fbnic_napi_vector *nv = fbn->napi[i];
2770
2771 /* Find RQs which are completely out of pages */
2772 for (t = nv->txt_count, j = 0; j < nv->rxt_count; j++, t++) {
2773 /* Assume 4 pages is always enough to fit a packet
2774 * and therefore generate a completion and an IRQ.
2775 */
2776 if (fbnic_desc_used(&nv->qt[t].sub0) < 4 ||
2777 fbnic_desc_used(&nv->qt[t].sub1) < 4)
2778 irqs[nv->v_idx / 32] |= BIT(nv->v_idx % 32);
2779 }
2780 }
2781
2782 for (i = 0; i < ARRAY_SIZE(irqs); i++) {
2783 if (!irqs[i])
2784 continue;
2785 fbnic_wr32(fbd, FBNIC_INTR_MASK_CLEAR(i), irqs[i]);
2786 fbnic_wr32(fbd, FBNIC_INTR_SET(i), irqs[i]);
2787 }
2788
2789 fbnic_wrfl(fbd);
2790 }
2791
fbnic_queue_mem_alloc(struct net_device * dev,void * qmem,int idx)2792 static int fbnic_queue_mem_alloc(struct net_device *dev, void *qmem, int idx)
2793 {
2794 struct fbnic_net *fbn = netdev_priv(dev);
2795 const struct fbnic_q_triad *real;
2796 struct fbnic_q_triad *qt = qmem;
2797 struct fbnic_napi_vector *nv;
2798
2799 if (!netif_running(dev))
2800 return fbnic_alloc_qt_page_pools(fbn, qt, idx);
2801
2802 real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
2803 nv = fbn->napi[idx % fbn->num_napi];
2804
2805 fbnic_ring_init(&qt->sub0, real->sub0.doorbell, real->sub0.q_idx,
2806 real->sub0.flags);
2807 fbnic_ring_init(&qt->sub1, real->sub1.doorbell, real->sub1.q_idx,
2808 real->sub1.flags);
2809 fbnic_ring_init(&qt->cmpl, real->cmpl.doorbell, real->cmpl.q_idx,
2810 real->cmpl.flags);
2811
2812 return fbnic_alloc_rx_qt_resources(fbn, nv, qt);
2813 }
2814
fbnic_queue_mem_free(struct net_device * dev,void * qmem)2815 static void fbnic_queue_mem_free(struct net_device *dev, void *qmem)
2816 {
2817 struct fbnic_net *fbn = netdev_priv(dev);
2818 struct fbnic_q_triad *qt = qmem;
2819
2820 if (!netif_running(dev))
2821 fbnic_free_qt_page_pools(qt);
2822 else
2823 fbnic_free_qt_resources(fbn, qt);
2824 }
2825
__fbnic_nv_restart(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2826 static void __fbnic_nv_restart(struct fbnic_net *fbn,
2827 struct fbnic_napi_vector *nv)
2828 {
2829 struct fbnic_dev *fbd = fbn->fbd;
2830 int i;
2831
2832 fbnic_nv_enable(fbn, nv);
2833 fbnic_nv_fill(nv);
2834
2835 napi_enable_locked(&nv->napi);
2836 fbnic_nv_irq_enable(nv);
2837 fbnic_wr32(fbd, FBNIC_INTR_SET(nv->v_idx / 32), BIT(nv->v_idx % 32));
2838 fbnic_wrfl(fbd);
2839
2840 for (i = 0; i < nv->txt_count; i++)
2841 netif_wake_subqueue(fbn->netdev, nv->qt[i].sub0.q_idx);
2842 }
2843
fbnic_queue_start(struct net_device * dev,void * qmem,int idx)2844 static int fbnic_queue_start(struct net_device *dev, void *qmem, int idx)
2845 {
2846 struct fbnic_net *fbn = netdev_priv(dev);
2847 struct fbnic_napi_vector *nv;
2848 struct fbnic_q_triad *real;
2849
2850 real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
2851 nv = fbn->napi[idx % fbn->num_napi];
2852
2853 fbnic_aggregate_ring_bdq_counters(fbn, &real->sub0);
2854 fbnic_aggregate_ring_bdq_counters(fbn, &real->sub1);
2855 fbnic_aggregate_ring_rx_counters(fbn, &real->cmpl);
2856
2857 memcpy(real, qmem, sizeof(*real));
2858
2859 __fbnic_nv_restart(fbn, nv);
2860
2861 return 0;
2862 }
2863
fbnic_queue_stop(struct net_device * dev,void * qmem,int idx)2864 static int fbnic_queue_stop(struct net_device *dev, void *qmem, int idx)
2865 {
2866 struct fbnic_net *fbn = netdev_priv(dev);
2867 const struct fbnic_q_triad *real;
2868 struct fbnic_napi_vector *nv;
2869 int i, t;
2870 int err;
2871
2872 real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
2873 nv = fbn->napi[idx % fbn->num_napi];
2874
2875 napi_disable_locked(&nv->napi);
2876 fbnic_nv_irq_disable(nv);
2877
2878 for (i = 0; i < nv->txt_count; i++)
2879 netif_stop_subqueue(dev, nv->qt[i].sub0.q_idx);
2880 fbnic_nv_disable(fbn, nv);
2881
2882 for (t = 0; t < nv->txt_count + nv->rxt_count; t++) {
2883 err = fbnic_wait_queue_idle(fbn, t >= nv->txt_count,
2884 nv->qt[t].sub0.q_idx);
2885 if (err)
2886 goto err_restart;
2887 }
2888
2889 fbnic_synchronize_irq(fbn->fbd, nv->v_idx);
2890 fbnic_nv_flush(nv);
2891
2892 page_pool_disable_direct_recycling(real->sub0.page_pool);
2893 page_pool_disable_direct_recycling(real->sub1.page_pool);
2894
2895 memcpy(qmem, real, sizeof(*real));
2896
2897 return 0;
2898
2899 err_restart:
2900 __fbnic_nv_restart(fbn, nv);
2901 return err;
2902 }
2903
2904 const struct netdev_queue_mgmt_ops fbnic_queue_mgmt_ops = {
2905 .ndo_queue_mem_size = sizeof(struct fbnic_q_triad),
2906 .ndo_queue_mem_alloc = fbnic_queue_mem_alloc,
2907 .ndo_queue_mem_free = fbnic_queue_mem_free,
2908 .ndo_queue_start = fbnic_queue_start,
2909 .ndo_queue_stop = fbnic_queue_stop,
2910 };
2911