0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #include <linux/ip.h>
0034 #include <linux/ipv6.h>
0035 #include <linux/tcp.h>
0036 #include <linux/bitmap.h>
0037 #include <linux/filter.h>
0038 #include <net/ip6_checksum.h>
0039 #include <net/page_pool.h>
0040 #include <net/inet_ecn.h>
0041 #include <net/gro.h>
0042 #include <net/udp.h>
0043 #include <net/tcp.h>
0044 #include "en.h"
0045 #include "en/txrx.h"
0046 #include "en_tc.h"
0047 #include "eswitch.h"
0048 #include "en_rep.h"
0049 #include "en/rep/tc.h"
0050 #include "ipoib/ipoib.h"
0051 #include "en_accel/ipsec.h"
0052 #include "en_accel/ipsec_rxtx.h"
0053 #include "en_accel/ktls_txrx.h"
0054 #include "en/xdp.h"
0055 #include "en/xsk/rx.h"
0056 #include "en/health.h"
0057 #include "en/params.h"
0058 #include "devlink.h"
0059 #include "en/devlink.h"
0060
0061 static struct sk_buff *
0062 mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
0063 u16 cqe_bcnt, u32 head_offset, u32 page_idx);
0064 static struct sk_buff *
0065 mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
0066 u16 cqe_bcnt, u32 head_offset, u32 page_idx);
0067 static void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
0068 static void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
0069 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
0070
0071 const struct mlx5e_rx_handlers mlx5e_rx_handlers_nic = {
0072 .handle_rx_cqe = mlx5e_handle_rx_cqe,
0073 .handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq,
0074 .handle_rx_cqe_mpwqe_shampo = mlx5e_handle_rx_cqe_mpwrq_shampo,
0075 };
0076
0077 static inline bool mlx5e_rx_hw_stamp(struct hwtstamp_config *config)
0078 {
0079 return config->rx_filter == HWTSTAMP_FILTER_ALL;
0080 }
0081
0082 static inline void mlx5e_read_cqe_slot(struct mlx5_cqwq *wq,
0083 u32 cqcc, void *data)
0084 {
0085 u32 ci = mlx5_cqwq_ctr2ix(wq, cqcc);
0086
0087 memcpy(data, mlx5_cqwq_get_wqe(wq, ci), sizeof(struct mlx5_cqe64));
0088 }
0089
0090 static inline void mlx5e_read_title_slot(struct mlx5e_rq *rq,
0091 struct mlx5_cqwq *wq,
0092 u32 cqcc)
0093 {
0094 struct mlx5e_cq_decomp *cqd = &rq->cqd;
0095 struct mlx5_cqe64 *title = &cqd->title;
0096
0097 mlx5e_read_cqe_slot(wq, cqcc, title);
0098 cqd->left = be32_to_cpu(title->byte_cnt);
0099 cqd->wqe_counter = be16_to_cpu(title->wqe_counter);
0100 rq->stats->cqe_compress_blks++;
0101 }
0102
0103 static inline void mlx5e_read_mini_arr_slot(struct mlx5_cqwq *wq,
0104 struct mlx5e_cq_decomp *cqd,
0105 u32 cqcc)
0106 {
0107 mlx5e_read_cqe_slot(wq, cqcc, cqd->mini_arr);
0108 cqd->mini_arr_idx = 0;
0109 }
0110
0111 static inline void mlx5e_cqes_update_owner(struct mlx5_cqwq *wq, int n)
0112 {
0113 u32 cqcc = wq->cc;
0114 u8 op_own = mlx5_cqwq_get_ctr_wrap_cnt(wq, cqcc) & 1;
0115 u32 ci = mlx5_cqwq_ctr2ix(wq, cqcc);
0116 u32 wq_sz = mlx5_cqwq_get_size(wq);
0117 u32 ci_top = min_t(u32, wq_sz, ci + n);
0118
0119 for (; ci < ci_top; ci++, n--) {
0120 struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(wq, ci);
0121
0122 cqe->op_own = op_own;
0123 }
0124
0125 if (unlikely(ci == wq_sz)) {
0126 op_own = !op_own;
0127 for (ci = 0; ci < n; ci++) {
0128 struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(wq, ci);
0129
0130 cqe->op_own = op_own;
0131 }
0132 }
0133 }
0134
0135 static inline void mlx5e_decompress_cqe(struct mlx5e_rq *rq,
0136 struct mlx5_cqwq *wq,
0137 u32 cqcc)
0138 {
0139 struct mlx5e_cq_decomp *cqd = &rq->cqd;
0140 struct mlx5_mini_cqe8 *mini_cqe = &cqd->mini_arr[cqd->mini_arr_idx];
0141 struct mlx5_cqe64 *title = &cqd->title;
0142
0143 title->byte_cnt = mini_cqe->byte_cnt;
0144 title->check_sum = mini_cqe->checksum;
0145 title->op_own &= 0xf0;
0146 title->op_own |= 0x01 & (cqcc >> wq->fbc.log_sz);
0147
0148
0149
0150
0151 if (test_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &rq->state)) {
0152 title->wqe_counter = mini_cqe->stridx;
0153 return;
0154 }
0155
0156
0157 title->wqe_counter = cpu_to_be16(cqd->wqe_counter);
0158 if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ)
0159 cqd->wqe_counter += mpwrq_get_cqe_consumed_strides(title);
0160 else
0161 cqd->wqe_counter =
0162 mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, cqd->wqe_counter + 1);
0163 }
0164
0165 static inline void mlx5e_decompress_cqe_no_hash(struct mlx5e_rq *rq,
0166 struct mlx5_cqwq *wq,
0167 u32 cqcc)
0168 {
0169 struct mlx5e_cq_decomp *cqd = &rq->cqd;
0170
0171 mlx5e_decompress_cqe(rq, wq, cqcc);
0172 cqd->title.rss_hash_type = 0;
0173 cqd->title.rss_hash_result = 0;
0174 }
0175
0176 static inline u32 mlx5e_decompress_cqes_cont(struct mlx5e_rq *rq,
0177 struct mlx5_cqwq *wq,
0178 int update_owner_only,
0179 int budget_rem)
0180 {
0181 struct mlx5e_cq_decomp *cqd = &rq->cqd;
0182 u32 cqcc = wq->cc + update_owner_only;
0183 u32 cqe_count;
0184 u32 i;
0185
0186 cqe_count = min_t(u32, cqd->left, budget_rem);
0187
0188 for (i = update_owner_only; i < cqe_count;
0189 i++, cqd->mini_arr_idx++, cqcc++) {
0190 if (cqd->mini_arr_idx == MLX5_MINI_CQE_ARRAY_SIZE)
0191 mlx5e_read_mini_arr_slot(wq, cqd, cqcc);
0192
0193 mlx5e_decompress_cqe_no_hash(rq, wq, cqcc);
0194 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq,
0195 mlx5e_handle_rx_cqe_mpwrq_shampo, mlx5e_handle_rx_cqe,
0196 rq, &cqd->title);
0197 }
0198 mlx5e_cqes_update_owner(wq, cqcc - wq->cc);
0199 wq->cc = cqcc;
0200 cqd->left -= cqe_count;
0201 rq->stats->cqe_compress_pkts += cqe_count;
0202
0203 return cqe_count;
0204 }
0205
0206 static inline u32 mlx5e_decompress_cqes_start(struct mlx5e_rq *rq,
0207 struct mlx5_cqwq *wq,
0208 int budget_rem)
0209 {
0210 struct mlx5e_cq_decomp *cqd = &rq->cqd;
0211 u32 cc = wq->cc;
0212
0213 mlx5e_read_title_slot(rq, wq, cc);
0214 mlx5e_read_mini_arr_slot(wq, cqd, cc + 1);
0215 mlx5e_decompress_cqe(rq, wq, cc);
0216 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq,
0217 mlx5e_handle_rx_cqe_mpwrq_shampo, mlx5e_handle_rx_cqe,
0218 rq, &cqd->title);
0219 cqd->mini_arr_idx++;
0220
0221 return mlx5e_decompress_cqes_cont(rq, wq, 1, budget_rem) - 1;
0222 }
0223
0224 static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq, struct page *page)
0225 {
0226 struct mlx5e_page_cache *cache = &rq->page_cache;
0227 u32 tail_next = (cache->tail + 1) & (MLX5E_CACHE_SIZE - 1);
0228 struct mlx5e_rq_stats *stats = rq->stats;
0229
0230 if (tail_next == cache->head) {
0231 stats->cache_full++;
0232 return false;
0233 }
0234
0235 if (!dev_page_is_reusable(page)) {
0236 stats->cache_waive++;
0237 return false;
0238 }
0239
0240 cache->page_cache[cache->tail].page = page;
0241 cache->page_cache[cache->tail].addr = page_pool_get_dma_addr(page);
0242 cache->tail = tail_next;
0243 return true;
0244 }
0245
0246 static inline bool mlx5e_rx_cache_get(struct mlx5e_rq *rq,
0247 struct mlx5e_dma_info *dma_info)
0248 {
0249 struct mlx5e_page_cache *cache = &rq->page_cache;
0250 struct mlx5e_rq_stats *stats = rq->stats;
0251
0252 if (unlikely(cache->head == cache->tail)) {
0253 stats->cache_empty++;
0254 return false;
0255 }
0256
0257 if (page_ref_count(cache->page_cache[cache->head].page) != 1) {
0258 stats->cache_busy++;
0259 return false;
0260 }
0261
0262 *dma_info = cache->page_cache[cache->head];
0263 cache->head = (cache->head + 1) & (MLX5E_CACHE_SIZE - 1);
0264 stats->cache_reuse++;
0265
0266 dma_sync_single_for_device(rq->pdev, dma_info->addr,
0267 PAGE_SIZE,
0268 DMA_FROM_DEVICE);
0269 return true;
0270 }
0271
0272 static inline int mlx5e_page_alloc_pool(struct mlx5e_rq *rq,
0273 struct mlx5e_dma_info *dma_info)
0274 {
0275 if (mlx5e_rx_cache_get(rq, dma_info))
0276 return 0;
0277
0278 dma_info->page = page_pool_dev_alloc_pages(rq->page_pool);
0279 if (unlikely(!dma_info->page))
0280 return -ENOMEM;
0281
0282 dma_info->addr = dma_map_page_attrs(rq->pdev, dma_info->page, 0, PAGE_SIZE,
0283 rq->buff.map_dir, DMA_ATTR_SKIP_CPU_SYNC);
0284 if (unlikely(dma_mapping_error(rq->pdev, dma_info->addr))) {
0285 page_pool_recycle_direct(rq->page_pool, dma_info->page);
0286 dma_info->page = NULL;
0287 return -ENOMEM;
0288 }
0289 page_pool_set_dma_addr(dma_info->page, dma_info->addr);
0290
0291 return 0;
0292 }
0293
0294 static inline int mlx5e_page_alloc(struct mlx5e_rq *rq,
0295 struct mlx5e_dma_info *dma_info)
0296 {
0297 if (rq->xsk_pool)
0298 return mlx5e_xsk_page_alloc_pool(rq, dma_info);
0299 else
0300 return mlx5e_page_alloc_pool(rq, dma_info);
0301 }
0302
0303 void mlx5e_page_dma_unmap(struct mlx5e_rq *rq, struct page *page)
0304 {
0305 dma_addr_t dma_addr = page_pool_get_dma_addr(page);
0306
0307 dma_unmap_page_attrs(rq->pdev, dma_addr, PAGE_SIZE, rq->buff.map_dir,
0308 DMA_ATTR_SKIP_CPU_SYNC);
0309 page_pool_set_dma_addr(page, 0);
0310 }
0311
0312 void mlx5e_page_release_dynamic(struct mlx5e_rq *rq, struct page *page, bool recycle)
0313 {
0314 if (likely(recycle)) {
0315 if (mlx5e_rx_cache_put(rq, page))
0316 return;
0317
0318 mlx5e_page_dma_unmap(rq, page);
0319 page_pool_recycle_direct(rq->page_pool, page);
0320 } else {
0321 mlx5e_page_dma_unmap(rq, page);
0322 page_pool_release_page(rq->page_pool, page);
0323 put_page(page);
0324 }
0325 }
0326
0327 static inline void mlx5e_page_release(struct mlx5e_rq *rq,
0328 struct mlx5e_dma_info *dma_info,
0329 bool recycle)
0330 {
0331 if (rq->xsk_pool)
0332
0333
0334
0335
0336 xsk_buff_free(dma_info->xsk);
0337 else
0338 mlx5e_page_release_dynamic(rq, dma_info->page, recycle);
0339 }
0340
0341 static inline int mlx5e_get_rx_frag(struct mlx5e_rq *rq,
0342 struct mlx5e_wqe_frag_info *frag)
0343 {
0344 int err = 0;
0345
0346 if (!frag->offset)
0347
0348
0349
0350
0351
0352 err = mlx5e_page_alloc(rq, frag->di);
0353
0354 return err;
0355 }
0356
0357 static inline void mlx5e_put_rx_frag(struct mlx5e_rq *rq,
0358 struct mlx5e_wqe_frag_info *frag,
0359 bool recycle)
0360 {
0361 if (frag->last_in_page)
0362 mlx5e_page_release(rq, frag->di, recycle);
0363 }
0364
0365 static inline struct mlx5e_wqe_frag_info *get_frag(struct mlx5e_rq *rq, u16 ix)
0366 {
0367 return &rq->wqe.frags[ix << rq->wqe.info.log_num_frags];
0368 }
0369
0370 static int mlx5e_alloc_rx_wqe(struct mlx5e_rq *rq, struct mlx5e_rx_wqe_cyc *wqe,
0371 u16 ix)
0372 {
0373 struct mlx5e_wqe_frag_info *frag = get_frag(rq, ix);
0374 int err;
0375 int i;
0376
0377 for (i = 0; i < rq->wqe.info.num_frags; i++, frag++) {
0378 u16 headroom;
0379
0380 err = mlx5e_get_rx_frag(rq, frag);
0381 if (unlikely(err))
0382 goto free_frags;
0383
0384 headroom = i == 0 ? rq->buff.headroom : 0;
0385 wqe->data[i].addr = cpu_to_be64(frag->di->addr +
0386 frag->offset + headroom);
0387 }
0388
0389 return 0;
0390
0391 free_frags:
0392 while (--i >= 0)
0393 mlx5e_put_rx_frag(rq, --frag, true);
0394
0395 return err;
0396 }
0397
0398 static inline void mlx5e_free_rx_wqe(struct mlx5e_rq *rq,
0399 struct mlx5e_wqe_frag_info *wi,
0400 bool recycle)
0401 {
0402 int i;
0403
0404 for (i = 0; i < rq->wqe.info.num_frags; i++, wi++)
0405 mlx5e_put_rx_frag(rq, wi, recycle);
0406 }
0407
0408 static void mlx5e_dealloc_rx_wqe(struct mlx5e_rq *rq, u16 ix)
0409 {
0410 struct mlx5e_wqe_frag_info *wi = get_frag(rq, ix);
0411
0412 mlx5e_free_rx_wqe(rq, wi, false);
0413 }
0414
0415 static int mlx5e_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, u8 wqe_bulk)
0416 {
0417 struct mlx5_wq_cyc *wq = &rq->wqe.wq;
0418 int err;
0419 int i;
0420
0421 if (rq->xsk_pool) {
0422 int pages_desired = wqe_bulk << rq->wqe.info.log_num_frags;
0423
0424
0425
0426
0427
0428 if (unlikely(!xsk_buff_can_alloc(rq->xsk_pool, pages_desired)))
0429 return -ENOMEM;
0430 }
0431
0432 for (i = 0; i < wqe_bulk; i++) {
0433 struct mlx5e_rx_wqe_cyc *wqe = mlx5_wq_cyc_get_wqe(wq, ix + i);
0434
0435 err = mlx5e_alloc_rx_wqe(rq, wqe, ix + i);
0436 if (unlikely(err))
0437 goto free_wqes;
0438 }
0439
0440 return 0;
0441
0442 free_wqes:
0443 while (--i >= 0)
0444 mlx5e_dealloc_rx_wqe(rq, ix + i);
0445
0446 return err;
0447 }
0448
0449 static inline void
0450 mlx5e_add_skb_frag(struct mlx5e_rq *rq, struct sk_buff *skb,
0451 struct mlx5e_dma_info *di, u32 frag_offset, u32 len,
0452 unsigned int truesize)
0453 {
0454 dma_sync_single_for_cpu(rq->pdev,
0455 di->addr + frag_offset,
0456 len, DMA_FROM_DEVICE);
0457 page_ref_inc(di->page);
0458 skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
0459 di->page, frag_offset, len, truesize);
0460 }
0461
0462 static inline void
0463 mlx5e_copy_skb_header(struct device *pdev, struct sk_buff *skb,
0464 struct mlx5e_dma_info *dma_info,
0465 int offset_from, int dma_offset, u32 headlen)
0466 {
0467 const void *from = page_address(dma_info->page) + offset_from;
0468
0469 unsigned int len = ALIGN(headlen, sizeof(long));
0470
0471 dma_sync_single_for_cpu(pdev, dma_info->addr + dma_offset, len,
0472 DMA_FROM_DEVICE);
0473 skb_copy_to_linear_data(skb, from, len);
0474 }
0475
0476 static void
0477 mlx5e_free_rx_mpwqe(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, bool recycle)
0478 {
0479 bool no_xdp_xmit;
0480 struct mlx5e_dma_info *dma_info = wi->umr.dma_info;
0481 int i;
0482
0483
0484 if (bitmap_full(wi->xdp_xmit_bitmap, MLX5_MPWRQ_PAGES_PER_WQE))
0485 return;
0486
0487 no_xdp_xmit = bitmap_empty(wi->xdp_xmit_bitmap,
0488 MLX5_MPWRQ_PAGES_PER_WQE);
0489
0490 for (i = 0; i < MLX5_MPWRQ_PAGES_PER_WQE; i++)
0491 if (no_xdp_xmit || !test_bit(i, wi->xdp_xmit_bitmap))
0492 mlx5e_page_release(rq, &dma_info[i], recycle);
0493 }
0494
0495 static void mlx5e_post_rx_mpwqe(struct mlx5e_rq *rq, u8 n)
0496 {
0497 struct mlx5_wq_ll *wq = &rq->mpwqe.wq;
0498
0499 do {
0500 u16 next_wqe_index = mlx5_wq_ll_get_wqe_next_ix(wq, wq->head);
0501
0502 mlx5_wq_ll_push(wq, next_wqe_index);
0503 } while (--n);
0504
0505
0506 dma_wmb();
0507
0508 mlx5_wq_ll_update_db_record(wq);
0509 }
0510
0511
0512
0513
0514 static int bitmap_find_window(unsigned long *bitmap, int len,
0515 int bitmap_size, int first)
0516 {
0517 int next_one, count;
0518
0519 next_one = find_next_bit(bitmap, bitmap_size, first);
0520 if (next_one == bitmap_size) {
0521 if (bitmap_size - first >= len)
0522 return len;
0523 next_one = find_next_bit(bitmap, bitmap_size, 0);
0524 count = next_one + bitmap_size - first;
0525 } else {
0526 count = next_one - first;
0527 }
0528
0529 return min(len, count);
0530 }
0531
0532 static void build_klm_umr(struct mlx5e_icosq *sq, struct mlx5e_umr_wqe *umr_wqe,
0533 __be32 key, u16 offset, u16 klm_len, u16 wqe_bbs)
0534 {
0535 memset(umr_wqe, 0, offsetof(struct mlx5e_umr_wqe, inline_klms));
0536 umr_wqe->ctrl.opmod_idx_opcode =
0537 cpu_to_be32((sq->pc << MLX5_WQE_CTRL_WQE_INDEX_SHIFT) |
0538 MLX5_OPCODE_UMR);
0539 umr_wqe->ctrl.umr_mkey = key;
0540 umr_wqe->ctrl.qpn_ds = cpu_to_be32((sq->sqn << MLX5_WQE_CTRL_QPN_SHIFT)
0541 | MLX5E_KLM_UMR_DS_CNT(klm_len));
0542 umr_wqe->uctrl.flags = MLX5_UMR_TRANSLATION_OFFSET_EN | MLX5_UMR_INLINE;
0543 umr_wqe->uctrl.xlt_offset = cpu_to_be16(offset);
0544 umr_wqe->uctrl.xlt_octowords = cpu_to_be16(klm_len);
0545 umr_wqe->uctrl.mkey_mask = cpu_to_be64(MLX5_MKEY_MASK_FREE);
0546 }
0547
0548 static int mlx5e_build_shampo_hd_umr(struct mlx5e_rq *rq,
0549 struct mlx5e_icosq *sq,
0550 u16 klm_entries, u16 index)
0551 {
0552 struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
0553 u16 entries, pi, header_offset, err, wqe_bbs, new_entries;
0554 u32 lkey = rq->mdev->mlx5e_res.hw_objs.mkey;
0555 struct page *page = shampo->last_page;
0556 u64 addr = shampo->last_addr;
0557 struct mlx5e_dma_info *dma_info;
0558 struct mlx5e_umr_wqe *umr_wqe;
0559 int headroom, i;
0560
0561 headroom = rq->buff.headroom;
0562 new_entries = klm_entries - (shampo->pi & (MLX5_UMR_KLM_ALIGNMENT - 1));
0563 entries = ALIGN(klm_entries, MLX5_UMR_KLM_ALIGNMENT);
0564 wqe_bbs = MLX5E_KLM_UMR_WQEBBS(entries);
0565 pi = mlx5e_icosq_get_next_pi(sq, wqe_bbs);
0566 umr_wqe = mlx5_wq_cyc_get_wqe(&sq->wq, pi);
0567 build_klm_umr(sq, umr_wqe, shampo->key, index, entries, wqe_bbs);
0568
0569 for (i = 0; i < entries; i++, index++) {
0570 dma_info = &shampo->info[index];
0571 if (i >= klm_entries || (index < shampo->pi && shampo->pi - index <
0572 MLX5_UMR_KLM_ALIGNMENT))
0573 goto update_klm;
0574 header_offset = (index & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1)) <<
0575 MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE;
0576 if (!(header_offset & (PAGE_SIZE - 1))) {
0577 err = mlx5e_page_alloc(rq, dma_info);
0578 if (unlikely(err))
0579 goto err_unmap;
0580 addr = dma_info->addr;
0581 page = dma_info->page;
0582 } else {
0583 dma_info->addr = addr + header_offset;
0584 dma_info->page = page;
0585 }
0586
0587 update_klm:
0588 umr_wqe->inline_klms[i].bcount =
0589 cpu_to_be32(MLX5E_RX_MAX_HEAD);
0590 umr_wqe->inline_klms[i].key = cpu_to_be32(lkey);
0591 umr_wqe->inline_klms[i].va =
0592 cpu_to_be64(dma_info->addr + headroom);
0593 }
0594
0595 sq->db.wqe_info[pi] = (struct mlx5e_icosq_wqe_info) {
0596 .wqe_type = MLX5E_ICOSQ_WQE_SHAMPO_HD_UMR,
0597 .num_wqebbs = wqe_bbs,
0598 .shampo.len = new_entries,
0599 };
0600
0601 shampo->pi = (shampo->pi + new_entries) & (shampo->hd_per_wq - 1);
0602 shampo->last_page = page;
0603 shampo->last_addr = addr;
0604 sq->pc += wqe_bbs;
0605 sq->doorbell_cseg = &umr_wqe->ctrl;
0606
0607 return 0;
0608
0609 err_unmap:
0610 while (--i >= 0) {
0611 dma_info = &shampo->info[--index];
0612 if (!(i & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1))) {
0613 dma_info->addr = ALIGN_DOWN(dma_info->addr, PAGE_SIZE);
0614 mlx5e_page_release(rq, dma_info, true);
0615 }
0616 }
0617 rq->stats->buff_alloc_err++;
0618 return err;
0619 }
0620
0621 static int mlx5e_alloc_rx_hd_mpwqe(struct mlx5e_rq *rq)
0622 {
0623 struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
0624 u16 klm_entries, num_wqe, index, entries_before;
0625 struct mlx5e_icosq *sq = rq->icosq;
0626 int i, err, max_klm_entries, len;
0627
0628 max_klm_entries = MLX5E_MAX_KLM_PER_WQE(rq->mdev);
0629 klm_entries = bitmap_find_window(shampo->bitmap,
0630 shampo->hd_per_wqe,
0631 shampo->hd_per_wq, shampo->pi);
0632 if (!klm_entries)
0633 return 0;
0634
0635 klm_entries += (shampo->pi & (MLX5_UMR_KLM_ALIGNMENT - 1));
0636 index = ALIGN_DOWN(shampo->pi, MLX5_UMR_KLM_ALIGNMENT);
0637 entries_before = shampo->hd_per_wq - index;
0638
0639 if (unlikely(entries_before < klm_entries))
0640 num_wqe = DIV_ROUND_UP(entries_before, max_klm_entries) +
0641 DIV_ROUND_UP(klm_entries - entries_before, max_klm_entries);
0642 else
0643 num_wqe = DIV_ROUND_UP(klm_entries, max_klm_entries);
0644
0645 for (i = 0; i < num_wqe; i++) {
0646 len = (klm_entries > max_klm_entries) ? max_klm_entries :
0647 klm_entries;
0648 if (unlikely(index + len > shampo->hd_per_wq))
0649 len = shampo->hd_per_wq - index;
0650 err = mlx5e_build_shampo_hd_umr(rq, sq, len, index);
0651 if (unlikely(err))
0652 return err;
0653 index = (index + len) & (rq->mpwqe.shampo->hd_per_wq - 1);
0654 klm_entries -= len;
0655 }
0656
0657 return 0;
0658 }
0659
0660 static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
0661 {
0662 struct mlx5e_mpw_info *wi = &rq->mpwqe.info[ix];
0663 struct mlx5e_dma_info *dma_info = &wi->umr.dma_info[0];
0664 struct mlx5e_icosq *sq = rq->icosq;
0665 struct mlx5_wq_cyc *wq = &sq->wq;
0666 struct mlx5e_umr_wqe *umr_wqe;
0667 u16 pi;
0668 int err;
0669 int i;
0670
0671
0672
0673
0674 if (rq->xsk_pool &&
0675 unlikely(!xsk_buff_can_alloc(rq->xsk_pool, MLX5_MPWRQ_PAGES_PER_WQE))) {
0676 err = -ENOMEM;
0677 goto err;
0678 }
0679
0680 if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state)) {
0681 err = mlx5e_alloc_rx_hd_mpwqe(rq);
0682 if (unlikely(err))
0683 goto err;
0684 }
0685
0686 pi = mlx5e_icosq_get_next_pi(sq, MLX5E_UMR_WQEBBS);
0687 umr_wqe = mlx5_wq_cyc_get_wqe(wq, pi);
0688 memcpy(umr_wqe, &rq->mpwqe.umr_wqe, offsetof(struct mlx5e_umr_wqe, inline_mtts));
0689
0690 for (i = 0; i < MLX5_MPWRQ_PAGES_PER_WQE; i++, dma_info++) {
0691 err = mlx5e_page_alloc(rq, dma_info);
0692 if (unlikely(err))
0693 goto err_unmap;
0694 umr_wqe->inline_mtts[i].ptag = cpu_to_be64(dma_info->addr | MLX5_EN_WR);
0695 }
0696
0697 bitmap_zero(wi->xdp_xmit_bitmap, MLX5_MPWRQ_PAGES_PER_WQE);
0698 wi->consumed_strides = 0;
0699
0700 umr_wqe->ctrl.opmod_idx_opcode =
0701 cpu_to_be32((sq->pc << MLX5_WQE_CTRL_WQE_INDEX_SHIFT) |
0702 MLX5_OPCODE_UMR);
0703 umr_wqe->uctrl.xlt_offset =
0704 cpu_to_be16(MLX5_ALIGNED_MTTS_OCTW(MLX5E_REQUIRED_MTTS(ix)));
0705
0706 sq->db.wqe_info[pi] = (struct mlx5e_icosq_wqe_info) {
0707 .wqe_type = MLX5E_ICOSQ_WQE_UMR_RX,
0708 .num_wqebbs = MLX5E_UMR_WQEBBS,
0709 .umr.rq = rq,
0710 };
0711
0712 sq->pc += MLX5E_UMR_WQEBBS;
0713
0714 sq->doorbell_cseg = &umr_wqe->ctrl;
0715
0716 return 0;
0717
0718 err_unmap:
0719 while (--i >= 0) {
0720 dma_info--;
0721 mlx5e_page_release(rq, dma_info, true);
0722 }
0723
0724 err:
0725 rq->stats->buff_alloc_err++;
0726
0727 return err;
0728 }
0729
0730
0731
0732
0733
0734
0735
0736 void mlx5e_shampo_dealloc_hd(struct mlx5e_rq *rq, u16 len, u16 start, bool close)
0737 {
0738 struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
0739 int hd_per_wq = shampo->hd_per_wq;
0740 struct page *deleted_page = NULL;
0741 struct mlx5e_dma_info *hd_info;
0742 int i, index = start;
0743
0744 for (i = 0; i < len; i++, index++) {
0745 if (index == hd_per_wq)
0746 index = 0;
0747
0748 if (close && !test_bit(index, shampo->bitmap))
0749 continue;
0750
0751 hd_info = &shampo->info[index];
0752 hd_info->addr = ALIGN_DOWN(hd_info->addr, PAGE_SIZE);
0753 if (hd_info->page != deleted_page) {
0754 deleted_page = hd_info->page;
0755 mlx5e_page_release(rq, hd_info, false);
0756 }
0757 }
0758
0759 if (start + len > hd_per_wq) {
0760 len -= hd_per_wq - start;
0761 bitmap_clear(shampo->bitmap, start, hd_per_wq - start);
0762 start = 0;
0763 }
0764
0765 bitmap_clear(shampo->bitmap, start, len);
0766 }
0767
0768 static void mlx5e_dealloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
0769 {
0770 struct mlx5e_mpw_info *wi = &rq->mpwqe.info[ix];
0771
0772 mlx5e_free_rx_mpwqe(rq, wi, false);
0773 }
0774
0775 INDIRECT_CALLABLE_SCOPE bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq)
0776 {
0777 struct mlx5_wq_cyc *wq = &rq->wqe.wq;
0778 u8 wqe_bulk;
0779 int err;
0780
0781 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state)))
0782 return false;
0783
0784 wqe_bulk = rq->wqe.info.wqe_bulk;
0785
0786 if (mlx5_wq_cyc_missing(wq) < wqe_bulk)
0787 return false;
0788
0789 if (rq->page_pool)
0790 page_pool_nid_changed(rq->page_pool, numa_mem_id());
0791
0792 do {
0793 u16 head = mlx5_wq_cyc_get_head(wq);
0794
0795 err = mlx5e_alloc_rx_wqes(rq, head, wqe_bulk);
0796 if (unlikely(err)) {
0797 rq->stats->buff_alloc_err++;
0798 break;
0799 }
0800
0801 mlx5_wq_cyc_push_n(wq, wqe_bulk);
0802 } while (mlx5_wq_cyc_missing(wq) >= wqe_bulk);
0803
0804
0805 dma_wmb();
0806
0807 mlx5_wq_cyc_update_db_record(wq);
0808
0809 return !!err;
0810 }
0811
0812 void mlx5e_free_icosq_descs(struct mlx5e_icosq *sq)
0813 {
0814 u16 sqcc;
0815
0816 sqcc = sq->cc;
0817
0818 while (sqcc != sq->pc) {
0819 struct mlx5e_icosq_wqe_info *wi;
0820 u16 ci;
0821
0822 ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
0823 wi = &sq->db.wqe_info[ci];
0824 sqcc += wi->num_wqebbs;
0825 #ifdef CONFIG_MLX5_EN_TLS
0826 switch (wi->wqe_type) {
0827 case MLX5E_ICOSQ_WQE_SET_PSV_TLS:
0828 mlx5e_ktls_handle_ctx_completion(wi);
0829 break;
0830 case MLX5E_ICOSQ_WQE_GET_PSV_TLS:
0831 mlx5e_ktls_handle_get_psv_completion(wi, sq);
0832 break;
0833 }
0834 #endif
0835 }
0836 sq->cc = sqcc;
0837 }
0838
0839 static void mlx5e_handle_shampo_hd_umr(struct mlx5e_shampo_umr umr,
0840 struct mlx5e_icosq *sq)
0841 {
0842 struct mlx5e_channel *c = container_of(sq, struct mlx5e_channel, icosq);
0843 struct mlx5e_shampo_hd *shampo;
0844
0845 struct mlx5e_rq *rq = &c->rq;
0846 int end, from, len = umr.len;
0847
0848 shampo = rq->mpwqe.shampo;
0849 end = shampo->hd_per_wq;
0850 from = shampo->ci;
0851 if (from + len > shampo->hd_per_wq) {
0852 len -= end - from;
0853 bitmap_set(shampo->bitmap, from, end - from);
0854 from = 0;
0855 }
0856
0857 bitmap_set(shampo->bitmap, from, len);
0858 shampo->ci = (shampo->ci + umr.len) & (shampo->hd_per_wq - 1);
0859 }
0860
0861 int mlx5e_poll_ico_cq(struct mlx5e_cq *cq)
0862 {
0863 struct mlx5e_icosq *sq = container_of(cq, struct mlx5e_icosq, cq);
0864 struct mlx5_cqe64 *cqe;
0865 u16 sqcc;
0866 int i;
0867
0868 if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state)))
0869 return 0;
0870
0871 cqe = mlx5_cqwq_get_cqe(&cq->wq);
0872 if (likely(!cqe))
0873 return 0;
0874
0875
0876
0877
0878 sqcc = sq->cc;
0879
0880 i = 0;
0881 do {
0882 u16 wqe_counter;
0883 bool last_wqe;
0884
0885 mlx5_cqwq_pop(&cq->wq);
0886
0887 wqe_counter = be16_to_cpu(cqe->wqe_counter);
0888
0889 do {
0890 struct mlx5e_icosq_wqe_info *wi;
0891 u16 ci;
0892
0893 last_wqe = (sqcc == wqe_counter);
0894
0895 ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc);
0896 wi = &sq->db.wqe_info[ci];
0897 sqcc += wi->num_wqebbs;
0898
0899 if (last_wqe && unlikely(get_cqe_opcode(cqe) != MLX5_CQE_REQ)) {
0900 netdev_WARN_ONCE(cq->netdev,
0901 "Bad OP in ICOSQ CQE: 0x%x\n",
0902 get_cqe_opcode(cqe));
0903 mlx5e_dump_error_cqe(&sq->cq, sq->sqn,
0904 (struct mlx5_err_cqe *)cqe);
0905 mlx5_wq_cyc_wqe_dump(&sq->wq, ci, wi->num_wqebbs);
0906 if (!test_and_set_bit(MLX5E_SQ_STATE_RECOVERING, &sq->state))
0907 queue_work(cq->priv->wq, &sq->recover_work);
0908 break;
0909 }
0910
0911 switch (wi->wqe_type) {
0912 case MLX5E_ICOSQ_WQE_UMR_RX:
0913 wi->umr.rq->mpwqe.umr_completed++;
0914 break;
0915 case MLX5E_ICOSQ_WQE_NOP:
0916 break;
0917 case MLX5E_ICOSQ_WQE_SHAMPO_HD_UMR:
0918 mlx5e_handle_shampo_hd_umr(wi->shampo, sq);
0919 break;
0920 #ifdef CONFIG_MLX5_EN_TLS
0921 case MLX5E_ICOSQ_WQE_UMR_TLS:
0922 break;
0923 case MLX5E_ICOSQ_WQE_SET_PSV_TLS:
0924 mlx5e_ktls_handle_ctx_completion(wi);
0925 break;
0926 case MLX5E_ICOSQ_WQE_GET_PSV_TLS:
0927 mlx5e_ktls_handle_get_psv_completion(wi, sq);
0928 break;
0929 #endif
0930 default:
0931 netdev_WARN_ONCE(cq->netdev,
0932 "Bad WQE type in ICOSQ WQE info: 0x%x\n",
0933 wi->wqe_type);
0934 }
0935 } while (!last_wqe);
0936 } while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq)));
0937
0938 sq->cc = sqcc;
0939
0940 mlx5_cqwq_update_db_record(&cq->wq);
0941
0942 return i;
0943 }
0944
0945 INDIRECT_CALLABLE_SCOPE bool mlx5e_post_rx_mpwqes(struct mlx5e_rq *rq)
0946 {
0947 struct mlx5_wq_ll *wq = &rq->mpwqe.wq;
0948 u8 umr_completed = rq->mpwqe.umr_completed;
0949 struct mlx5e_icosq *sq = rq->icosq;
0950 int alloc_err = 0;
0951 u8 missing, i;
0952 u16 head;
0953
0954 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state)))
0955 return false;
0956
0957 if (umr_completed) {
0958 mlx5e_post_rx_mpwqe(rq, umr_completed);
0959 rq->mpwqe.umr_in_progress -= umr_completed;
0960 rq->mpwqe.umr_completed = 0;
0961 }
0962
0963 missing = mlx5_wq_ll_missing(wq) - rq->mpwqe.umr_in_progress;
0964
0965 if (unlikely(rq->mpwqe.umr_in_progress > rq->mpwqe.umr_last_bulk))
0966 rq->stats->congst_umr++;
0967
0968 if (likely(missing < rq->mpwqe.min_wqe_bulk))
0969 return false;
0970
0971 if (rq->page_pool)
0972 page_pool_nid_changed(rq->page_pool, numa_mem_id());
0973
0974 head = rq->mpwqe.actual_wq_head;
0975 i = missing;
0976 do {
0977 alloc_err = mlx5e_alloc_rx_mpwqe(rq, head);
0978
0979 if (unlikely(alloc_err))
0980 break;
0981 head = mlx5_wq_ll_get_wqe_next_ix(wq, head);
0982 } while (--i);
0983
0984 rq->mpwqe.umr_last_bulk = missing - i;
0985 if (sq->doorbell_cseg) {
0986 mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, sq->doorbell_cseg);
0987 sq->doorbell_cseg = NULL;
0988 }
0989
0990 rq->mpwqe.umr_in_progress += rq->mpwqe.umr_last_bulk;
0991 rq->mpwqe.actual_wq_head = head;
0992
0993
0994
0995
0996
0997
0998
0999 if (unlikely(alloc_err == -ENOMEM && rq->xsk_pool))
1000 return true;
1001
1002 return false;
1003 }
1004
1005 static void mlx5e_lro_update_tcp_hdr(struct mlx5_cqe64 *cqe, struct tcphdr *tcp)
1006 {
1007 u8 l4_hdr_type = get_cqe_l4_hdr_type(cqe);
1008 u8 tcp_ack = (l4_hdr_type == CQE_L4_HDR_TYPE_TCP_ACK_NO_DATA) ||
1009 (l4_hdr_type == CQE_L4_HDR_TYPE_TCP_ACK_AND_DATA);
1010
1011 tcp->check = 0;
1012 tcp->psh = get_cqe_lro_tcppsh(cqe);
1013
1014 if (tcp_ack) {
1015 tcp->ack = 1;
1016 tcp->ack_seq = cqe->lro.ack_seq_num;
1017 tcp->window = cqe->lro.tcp_win;
1018 }
1019 }
1020
1021 static void mlx5e_lro_update_hdr(struct sk_buff *skb, struct mlx5_cqe64 *cqe,
1022 u32 cqe_bcnt)
1023 {
1024 struct ethhdr *eth = (struct ethhdr *)(skb->data);
1025 struct tcphdr *tcp;
1026 int network_depth = 0;
1027 __wsum check;
1028 __be16 proto;
1029 u16 tot_len;
1030 void *ip_p;
1031
1032 proto = __vlan_get_protocol(skb, eth->h_proto, &network_depth);
1033
1034 tot_len = cqe_bcnt - network_depth;
1035 ip_p = skb->data + network_depth;
1036
1037 if (proto == htons(ETH_P_IP)) {
1038 struct iphdr *ipv4 = ip_p;
1039
1040 tcp = ip_p + sizeof(struct iphdr);
1041 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
1042
1043 ipv4->ttl = cqe->lro.min_ttl;
1044 ipv4->tot_len = cpu_to_be16(tot_len);
1045 ipv4->check = 0;
1046 ipv4->check = ip_fast_csum((unsigned char *)ipv4,
1047 ipv4->ihl);
1048
1049 mlx5e_lro_update_tcp_hdr(cqe, tcp);
1050 check = csum_partial(tcp, tcp->doff * 4,
1051 csum_unfold((__force __sum16)cqe->check_sum));
1052
1053 tcp->check = csum_tcpudp_magic(ipv4->saddr, ipv4->daddr,
1054 tot_len - sizeof(struct iphdr),
1055 IPPROTO_TCP, check);
1056 } else {
1057 u16 payload_len = tot_len - sizeof(struct ipv6hdr);
1058 struct ipv6hdr *ipv6 = ip_p;
1059
1060 tcp = ip_p + sizeof(struct ipv6hdr);
1061 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
1062
1063 ipv6->hop_limit = cqe->lro.min_ttl;
1064 ipv6->payload_len = cpu_to_be16(payload_len);
1065
1066 mlx5e_lro_update_tcp_hdr(cqe, tcp);
1067 check = csum_partial(tcp, tcp->doff * 4,
1068 csum_unfold((__force __sum16)cqe->check_sum));
1069
1070 tcp->check = csum_ipv6_magic(&ipv6->saddr, &ipv6->daddr, payload_len,
1071 IPPROTO_TCP, check);
1072 }
1073 }
1074
1075 static void *mlx5e_shampo_get_packet_hd(struct mlx5e_rq *rq, u16 header_index)
1076 {
1077 struct mlx5e_dma_info *last_head = &rq->mpwqe.shampo->info[header_index];
1078 u16 head_offset = (last_head->addr & (PAGE_SIZE - 1)) + rq->buff.headroom;
1079
1080 return page_address(last_head->page) + head_offset;
1081 }
1082
1083 static void mlx5e_shampo_update_ipv4_udp_hdr(struct mlx5e_rq *rq, struct iphdr *ipv4)
1084 {
1085 int udp_off = rq->hw_gro_data->fk.control.thoff;
1086 struct sk_buff *skb = rq->hw_gro_data->skb;
1087 struct udphdr *uh;
1088
1089 uh = (struct udphdr *)(skb->data + udp_off);
1090 uh->len = htons(skb->len - udp_off);
1091
1092 if (uh->check)
1093 uh->check = ~udp_v4_check(skb->len - udp_off, ipv4->saddr,
1094 ipv4->daddr, 0);
1095
1096 skb->csum_start = (unsigned char *)uh - skb->head;
1097 skb->csum_offset = offsetof(struct udphdr, check);
1098
1099 skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_L4;
1100 }
1101
1102 static void mlx5e_shampo_update_ipv6_udp_hdr(struct mlx5e_rq *rq, struct ipv6hdr *ipv6)
1103 {
1104 int udp_off = rq->hw_gro_data->fk.control.thoff;
1105 struct sk_buff *skb = rq->hw_gro_data->skb;
1106 struct udphdr *uh;
1107
1108 uh = (struct udphdr *)(skb->data + udp_off);
1109 uh->len = htons(skb->len - udp_off);
1110
1111 if (uh->check)
1112 uh->check = ~udp_v6_check(skb->len - udp_off, &ipv6->saddr,
1113 &ipv6->daddr, 0);
1114
1115 skb->csum_start = (unsigned char *)uh - skb->head;
1116 skb->csum_offset = offsetof(struct udphdr, check);
1117
1118 skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_L4;
1119 }
1120
1121 static void mlx5e_shampo_update_fin_psh_flags(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe,
1122 struct tcphdr *skb_tcp_hd)
1123 {
1124 u16 header_index = mlx5e_shampo_get_cqe_header_index(rq, cqe);
1125 struct tcphdr *last_tcp_hd;
1126 void *last_hd_addr;
1127
1128 last_hd_addr = mlx5e_shampo_get_packet_hd(rq, header_index);
1129 last_tcp_hd = last_hd_addr + ETH_HLEN + rq->hw_gro_data->fk.control.thoff;
1130 tcp_flag_word(skb_tcp_hd) |= tcp_flag_word(last_tcp_hd) & (TCP_FLAG_FIN | TCP_FLAG_PSH);
1131 }
1132
1133 static void mlx5e_shampo_update_ipv4_tcp_hdr(struct mlx5e_rq *rq, struct iphdr *ipv4,
1134 struct mlx5_cqe64 *cqe, bool match)
1135 {
1136 int tcp_off = rq->hw_gro_data->fk.control.thoff;
1137 struct sk_buff *skb = rq->hw_gro_data->skb;
1138 struct tcphdr *tcp;
1139
1140 tcp = (struct tcphdr *)(skb->data + tcp_off);
1141 if (match)
1142 mlx5e_shampo_update_fin_psh_flags(rq, cqe, tcp);
1143
1144 tcp->check = ~tcp_v4_check(skb->len - tcp_off, ipv4->saddr,
1145 ipv4->daddr, 0);
1146 skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV4;
1147 if (ntohs(ipv4->id) == rq->hw_gro_data->second_ip_id)
1148 skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_FIXEDID;
1149
1150 skb->csum_start = (unsigned char *)tcp - skb->head;
1151 skb->csum_offset = offsetof(struct tcphdr, check);
1152
1153 if (tcp->cwr)
1154 skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN;
1155 }
1156
1157 static void mlx5e_shampo_update_ipv6_tcp_hdr(struct mlx5e_rq *rq, struct ipv6hdr *ipv6,
1158 struct mlx5_cqe64 *cqe, bool match)
1159 {
1160 int tcp_off = rq->hw_gro_data->fk.control.thoff;
1161 struct sk_buff *skb = rq->hw_gro_data->skb;
1162 struct tcphdr *tcp;
1163
1164 tcp = (struct tcphdr *)(skb->data + tcp_off);
1165 if (match)
1166 mlx5e_shampo_update_fin_psh_flags(rq, cqe, tcp);
1167
1168 tcp->check = ~tcp_v6_check(skb->len - tcp_off, &ipv6->saddr,
1169 &ipv6->daddr, 0);
1170 skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV6;
1171 skb->csum_start = (unsigned char *)tcp - skb->head;
1172 skb->csum_offset = offsetof(struct tcphdr, check);
1173
1174 if (tcp->cwr)
1175 skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN;
1176 }
1177
1178 static void mlx5e_shampo_update_hdr(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, bool match)
1179 {
1180 bool is_ipv4 = (rq->hw_gro_data->fk.basic.n_proto == htons(ETH_P_IP));
1181 struct sk_buff *skb = rq->hw_gro_data->skb;
1182
1183 skb_shinfo(skb)->gso_segs = NAPI_GRO_CB(skb)->count;
1184 skb->ip_summed = CHECKSUM_PARTIAL;
1185
1186 if (is_ipv4) {
1187 int nhoff = rq->hw_gro_data->fk.control.thoff - sizeof(struct iphdr);
1188 struct iphdr *ipv4 = (struct iphdr *)(skb->data + nhoff);
1189 __be16 newlen = htons(skb->len - nhoff);
1190
1191 csum_replace2(&ipv4->check, ipv4->tot_len, newlen);
1192 ipv4->tot_len = newlen;
1193
1194 if (ipv4->protocol == IPPROTO_TCP)
1195 mlx5e_shampo_update_ipv4_tcp_hdr(rq, ipv4, cqe, match);
1196 else
1197 mlx5e_shampo_update_ipv4_udp_hdr(rq, ipv4);
1198 } else {
1199 int nhoff = rq->hw_gro_data->fk.control.thoff - sizeof(struct ipv6hdr);
1200 struct ipv6hdr *ipv6 = (struct ipv6hdr *)(skb->data + nhoff);
1201
1202 ipv6->payload_len = htons(skb->len - nhoff - sizeof(*ipv6));
1203
1204 if (ipv6->nexthdr == IPPROTO_TCP)
1205 mlx5e_shampo_update_ipv6_tcp_hdr(rq, ipv6, cqe, match);
1206 else
1207 mlx5e_shampo_update_ipv6_udp_hdr(rq, ipv6);
1208 }
1209 }
1210
1211 static inline void mlx5e_skb_set_hash(struct mlx5_cqe64 *cqe,
1212 struct sk_buff *skb)
1213 {
1214 u8 cht = cqe->rss_hash_type;
1215 int ht = (cht & CQE_RSS_HTYPE_L4) ? PKT_HASH_TYPE_L4 :
1216 (cht & CQE_RSS_HTYPE_IP) ? PKT_HASH_TYPE_L3 :
1217 PKT_HASH_TYPE_NONE;
1218 skb_set_hash(skb, be32_to_cpu(cqe->rss_hash_result), ht);
1219 }
1220
1221 static inline bool is_last_ethertype_ip(struct sk_buff *skb, int *network_depth,
1222 __be16 *proto)
1223 {
1224 *proto = ((struct ethhdr *)skb->data)->h_proto;
1225 *proto = __vlan_get_protocol(skb, *proto, network_depth);
1226
1227 if (*proto == htons(ETH_P_IP))
1228 return pskb_may_pull(skb, *network_depth + sizeof(struct iphdr));
1229
1230 if (*proto == htons(ETH_P_IPV6))
1231 return pskb_may_pull(skb, *network_depth + sizeof(struct ipv6hdr));
1232
1233 return false;
1234 }
1235
1236 static inline void mlx5e_enable_ecn(struct mlx5e_rq *rq, struct sk_buff *skb)
1237 {
1238 int network_depth = 0;
1239 __be16 proto;
1240 void *ip;
1241 int rc;
1242
1243 if (unlikely(!is_last_ethertype_ip(skb, &network_depth, &proto)))
1244 return;
1245
1246 ip = skb->data + network_depth;
1247 rc = ((proto == htons(ETH_P_IP)) ? IP_ECN_set_ce((struct iphdr *)ip) :
1248 IP6_ECN_set_ce(skb, (struct ipv6hdr *)ip));
1249
1250 rq->stats->ecn_mark += !!rc;
1251 }
1252
1253 static u8 get_ip_proto(struct sk_buff *skb, int network_depth, __be16 proto)
1254 {
1255 void *ip_p = skb->data + network_depth;
1256
1257 return (proto == htons(ETH_P_IP)) ? ((struct iphdr *)ip_p)->protocol :
1258 ((struct ipv6hdr *)ip_p)->nexthdr;
1259 }
1260
1261 #define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN)
1262
1263 #define MAX_PADDING 8
1264
1265 static void
1266 tail_padding_csum_slow(struct sk_buff *skb, int offset, int len,
1267 struct mlx5e_rq_stats *stats)
1268 {
1269 stats->csum_complete_tail_slow++;
1270 skb->csum = csum_block_add(skb->csum,
1271 skb_checksum(skb, offset, len, 0),
1272 offset);
1273 }
1274
1275 static void
1276 tail_padding_csum(struct sk_buff *skb, int offset,
1277 struct mlx5e_rq_stats *stats)
1278 {
1279 u8 tail_padding[MAX_PADDING];
1280 int len = skb->len - offset;
1281 void *tail;
1282
1283 if (unlikely(len > MAX_PADDING)) {
1284 tail_padding_csum_slow(skb, offset, len, stats);
1285 return;
1286 }
1287
1288 tail = skb_header_pointer(skb, offset, len, tail_padding);
1289 if (unlikely(!tail)) {
1290 tail_padding_csum_slow(skb, offset, len, stats);
1291 return;
1292 }
1293
1294 stats->csum_complete_tail++;
1295 skb->csum = csum_block_add(skb->csum, csum_partial(tail, len, 0), offset);
1296 }
1297
1298 static void
1299 mlx5e_skb_csum_fixup(struct sk_buff *skb, int network_depth, __be16 proto,
1300 struct mlx5e_rq_stats *stats)
1301 {
1302 struct ipv6hdr *ip6;
1303 struct iphdr *ip4;
1304 int pkt_len;
1305
1306
1307 if (network_depth > ETH_HLEN)
1308
1309
1310
1311
1312 skb->csum = csum_partial(skb->data + ETH_HLEN,
1313 network_depth - ETH_HLEN,
1314 skb->csum);
1315
1316
1317 switch (proto) {
1318 case htons(ETH_P_IP):
1319 ip4 = (struct iphdr *)(skb->data + network_depth);
1320 pkt_len = network_depth + ntohs(ip4->tot_len);
1321 break;
1322 case htons(ETH_P_IPV6):
1323 ip6 = (struct ipv6hdr *)(skb->data + network_depth);
1324 pkt_len = network_depth + sizeof(*ip6) + ntohs(ip6->payload_len);
1325 break;
1326 default:
1327 return;
1328 }
1329
1330 if (likely(pkt_len >= skb->len))
1331 return;
1332
1333 tail_padding_csum(skb, pkt_len, stats);
1334 }
1335
1336 static inline void mlx5e_handle_csum(struct net_device *netdev,
1337 struct mlx5_cqe64 *cqe,
1338 struct mlx5e_rq *rq,
1339 struct sk_buff *skb,
1340 bool lro)
1341 {
1342 struct mlx5e_rq_stats *stats = rq->stats;
1343 int network_depth = 0;
1344 __be16 proto;
1345
1346 if (unlikely(!(netdev->features & NETIF_F_RXCSUM)))
1347 goto csum_none;
1348
1349 if (lro) {
1350 skb->ip_summed = CHECKSUM_UNNECESSARY;
1351 stats->csum_unnecessary++;
1352 return;
1353 }
1354
1355
1356 if (test_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &rq->state) ||
1357 get_cqe_tls_offload(cqe))
1358 goto csum_unnecessary;
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368 if (short_frame(skb->len))
1369 goto csum_unnecessary;
1370
1371 if (likely(is_last_ethertype_ip(skb, &network_depth, &proto))) {
1372 if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP))
1373 goto csum_unnecessary;
1374
1375 stats->csum_complete++;
1376 skb->ip_summed = CHECKSUM_COMPLETE;
1377 skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
1378
1379 if (test_bit(MLX5E_RQ_STATE_CSUM_FULL, &rq->state))
1380 return;
1381
1382
1383 mlx5e_skb_csum_fixup(skb, network_depth, proto, stats);
1384 return;
1385 }
1386
1387 csum_unnecessary:
1388 if (likely((cqe->hds_ip_ext & CQE_L3_OK) &&
1389 (cqe->hds_ip_ext & CQE_L4_OK))) {
1390 skb->ip_summed = CHECKSUM_UNNECESSARY;
1391 if (cqe_is_tunneled(cqe)) {
1392 skb->csum_level = 1;
1393 skb->encapsulation = 1;
1394 stats->csum_unnecessary_inner++;
1395 return;
1396 }
1397 stats->csum_unnecessary++;
1398 return;
1399 }
1400 csum_none:
1401 skb->ip_summed = CHECKSUM_NONE;
1402 stats->csum_none++;
1403 }
1404
1405 #define MLX5E_CE_BIT_MASK 0x80
1406
1407 static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
1408 u32 cqe_bcnt,
1409 struct mlx5e_rq *rq,
1410 struct sk_buff *skb)
1411 {
1412 u8 lro_num_seg = be32_to_cpu(cqe->srqn) >> 24;
1413 struct mlx5e_rq_stats *stats = rq->stats;
1414 struct net_device *netdev = rq->netdev;
1415
1416 skb->mac_len = ETH_HLEN;
1417
1418 if (unlikely(get_cqe_tls_offload(cqe)))
1419 mlx5e_ktls_handle_rx_skb(rq, skb, cqe, &cqe_bcnt);
1420
1421 if (unlikely(mlx5_ipsec_is_rx_flow(cqe)))
1422 mlx5e_ipsec_offload_handle_rx_skb(netdev, skb, cqe);
1423
1424 if (lro_num_seg > 1) {
1425 mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt);
1426 skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt, lro_num_seg);
1427
1428
1429
1430 stats->packets += lro_num_seg - 1;
1431 stats->lro_packets++;
1432 stats->lro_bytes += cqe_bcnt;
1433 }
1434
1435 if (unlikely(mlx5e_rx_hw_stamp(rq->tstamp)))
1436 skb_hwtstamps(skb)->hwtstamp = mlx5e_cqe_ts_to_ns(rq->ptp_cyc2time,
1437 rq->clock, get_cqe_ts(cqe));
1438 skb_record_rx_queue(skb, rq->ix);
1439
1440 if (likely(netdev->features & NETIF_F_RXHASH))
1441 mlx5e_skb_set_hash(cqe, skb);
1442
1443 if (cqe_has_vlan(cqe)) {
1444 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
1445 be16_to_cpu(cqe->vlan_info));
1446 stats->removed_vlan_packets++;
1447 }
1448
1449 skb->mark = be32_to_cpu(cqe->sop_drop_qpn) & MLX5E_TC_FLOW_ID_MASK;
1450
1451 mlx5e_handle_csum(netdev, cqe, rq, skb, !!lro_num_seg);
1452
1453 if (unlikely(cqe->ml_path & MLX5E_CE_BIT_MASK))
1454 mlx5e_enable_ecn(rq, skb);
1455
1456 skb->protocol = eth_type_trans(skb, netdev);
1457
1458 if (unlikely(mlx5e_skb_is_multicast(skb)))
1459 stats->mcast_packets++;
1460 }
1461
1462 static void mlx5e_shampo_complete_rx_cqe(struct mlx5e_rq *rq,
1463 struct mlx5_cqe64 *cqe,
1464 u32 cqe_bcnt,
1465 struct sk_buff *skb)
1466 {
1467 struct mlx5e_rq_stats *stats = rq->stats;
1468
1469 stats->packets++;
1470 stats->gro_packets++;
1471 stats->bytes += cqe_bcnt;
1472 stats->gro_bytes += cqe_bcnt;
1473 if (NAPI_GRO_CB(skb)->count != 1)
1474 return;
1475 mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb);
1476 skb_reset_network_header(skb);
1477 if (!skb_flow_dissect_flow_keys(skb, &rq->hw_gro_data->fk, 0)) {
1478 napi_gro_receive(rq->cq.napi, skb);
1479 rq->hw_gro_data->skb = NULL;
1480 }
1481 }
1482
1483 static inline void mlx5e_complete_rx_cqe(struct mlx5e_rq *rq,
1484 struct mlx5_cqe64 *cqe,
1485 u32 cqe_bcnt,
1486 struct sk_buff *skb)
1487 {
1488 struct mlx5e_rq_stats *stats = rq->stats;
1489
1490 stats->packets++;
1491 stats->bytes += cqe_bcnt;
1492 mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb);
1493 }
1494
1495 static inline
1496 struct sk_buff *mlx5e_build_linear_skb(struct mlx5e_rq *rq, void *va,
1497 u32 frag_size, u16 headroom,
1498 u32 cqe_bcnt, u32 metasize)
1499 {
1500 struct sk_buff *skb = build_skb(va, frag_size);
1501
1502 if (unlikely(!skb)) {
1503 rq->stats->buff_alloc_err++;
1504 return NULL;
1505 }
1506
1507 skb_reserve(skb, headroom);
1508 skb_put(skb, cqe_bcnt);
1509
1510 if (metasize)
1511 skb_metadata_set(skb, metasize);
1512
1513 return skb;
1514 }
1515
1516 static void mlx5e_fill_xdp_buff(struct mlx5e_rq *rq, void *va, u16 headroom,
1517 u32 len, struct xdp_buff *xdp)
1518 {
1519 xdp_init_buff(xdp, rq->buff.frame0_sz, &rq->xdp_rxq);
1520 xdp_prepare_buff(xdp, va, headroom, len, true);
1521 }
1522
1523 static struct sk_buff *
1524 mlx5e_skb_from_cqe_linear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi,
1525 u32 cqe_bcnt)
1526 {
1527 struct mlx5e_dma_info *di = wi->di;
1528 u16 rx_headroom = rq->buff.headroom;
1529 struct bpf_prog *prog;
1530 struct sk_buff *skb;
1531 u32 metasize = 0;
1532 void *va, *data;
1533 u32 frag_size;
1534
1535 va = page_address(di->page) + wi->offset;
1536 data = va + rx_headroom;
1537 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt);
1538
1539 dma_sync_single_range_for_cpu(rq->pdev, di->addr, wi->offset,
1540 frag_size, DMA_FROM_DEVICE);
1541 net_prefetch(data);
1542
1543 prog = rcu_dereference(rq->xdp_prog);
1544 if (prog) {
1545 struct xdp_buff xdp;
1546
1547 net_prefetchw(va);
1548 mlx5e_fill_xdp_buff(rq, va, rx_headroom, cqe_bcnt, &xdp);
1549 if (mlx5e_xdp_handle(rq, di->page, prog, &xdp))
1550 return NULL;
1551
1552 rx_headroom = xdp.data - xdp.data_hard_start;
1553 metasize = xdp.data - xdp.data_meta;
1554 cqe_bcnt = xdp.data_end - xdp.data;
1555 }
1556 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt);
1557 skb = mlx5e_build_linear_skb(rq, va, frag_size, rx_headroom, cqe_bcnt, metasize);
1558 if (unlikely(!skb))
1559 return NULL;
1560
1561
1562 page_ref_inc(di->page);
1563
1564 return skb;
1565 }
1566
1567 static struct sk_buff *
1568 mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi,
1569 u32 cqe_bcnt)
1570 {
1571 struct mlx5e_rq_frag_info *frag_info = &rq->wqe.info.arr[0];
1572 struct mlx5e_wqe_frag_info *head_wi = wi;
1573 u16 rx_headroom = rq->buff.headroom;
1574 struct mlx5e_dma_info *di = wi->di;
1575 struct skb_shared_info *sinfo;
1576 u32 frag_consumed_bytes;
1577 struct bpf_prog *prog;
1578 struct xdp_buff xdp;
1579 struct sk_buff *skb;
1580 u32 truesize;
1581 void *va;
1582
1583 va = page_address(di->page) + wi->offset;
1584 frag_consumed_bytes = min_t(u32, frag_info->frag_size, cqe_bcnt);
1585
1586 dma_sync_single_range_for_cpu(rq->pdev, di->addr, wi->offset,
1587 rq->buff.frame0_sz, DMA_FROM_DEVICE);
1588 net_prefetchw(va);
1589 net_prefetch(va + rx_headroom);
1590
1591 mlx5e_fill_xdp_buff(rq, va, rx_headroom, frag_consumed_bytes, &xdp);
1592 sinfo = xdp_get_shared_info_from_buff(&xdp);
1593 truesize = 0;
1594
1595 cqe_bcnt -= frag_consumed_bytes;
1596 frag_info++;
1597 wi++;
1598
1599 while (cqe_bcnt) {
1600 skb_frag_t *frag;
1601
1602 di = wi->di;
1603
1604 frag_consumed_bytes = min_t(u32, frag_info->frag_size, cqe_bcnt);
1605
1606 dma_sync_single_for_cpu(rq->pdev, di->addr + wi->offset,
1607 frag_consumed_bytes, DMA_FROM_DEVICE);
1608
1609 if (!xdp_buff_has_frags(&xdp)) {
1610
1611
1612
1613 sinfo->nr_frags = 0;
1614 sinfo->xdp_frags_size = 0;
1615 xdp_buff_set_frags_flag(&xdp);
1616 }
1617
1618 frag = &sinfo->frags[sinfo->nr_frags++];
1619 __skb_frag_set_page(frag, di->page);
1620 skb_frag_off_set(frag, wi->offset);
1621 skb_frag_size_set(frag, frag_consumed_bytes);
1622
1623 if (page_is_pfmemalloc(di->page))
1624 xdp_buff_set_frag_pfmemalloc(&xdp);
1625
1626 sinfo->xdp_frags_size += frag_consumed_bytes;
1627 truesize += frag_info->frag_stride;
1628
1629 cqe_bcnt -= frag_consumed_bytes;
1630 frag_info++;
1631 wi++;
1632 }
1633
1634 di = head_wi->di;
1635
1636 prog = rcu_dereference(rq->xdp_prog);
1637 if (prog && mlx5e_xdp_handle(rq, di->page, prog, &xdp)) {
1638 if (test_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
1639 int i;
1640
1641 for (i = wi - head_wi; i < rq->wqe.info.num_frags; i++)
1642 mlx5e_put_rx_frag(rq, &head_wi[i], true);
1643 }
1644 return NULL;
1645 }
1646
1647 skb = mlx5e_build_linear_skb(rq, xdp.data_hard_start, rq->buff.frame0_sz,
1648 xdp.data - xdp.data_hard_start,
1649 xdp.data_end - xdp.data,
1650 xdp.data - xdp.data_meta);
1651 if (unlikely(!skb))
1652 return NULL;
1653
1654 page_ref_inc(di->page);
1655
1656 if (unlikely(xdp_buff_has_frags(&xdp))) {
1657 int i;
1658
1659
1660 xdp_update_skb_shared_info(skb, wi - head_wi - 1,
1661 sinfo->xdp_frags_size, truesize,
1662 xdp_buff_is_frag_pfmemalloc(&xdp));
1663
1664 for (i = 0; i < sinfo->nr_frags; i++) {
1665 skb_frag_t *frag = &sinfo->frags[i];
1666
1667 page_ref_inc(skb_frag_page(frag));
1668 }
1669 }
1670
1671 return skb;
1672 }
1673
1674 static void trigger_report(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
1675 {
1676 struct mlx5_err_cqe *err_cqe = (struct mlx5_err_cqe *)cqe;
1677 struct mlx5e_priv *priv = rq->priv;
1678
1679 if (cqe_syndrome_needs_recover(err_cqe->syndrome) &&
1680 !test_and_set_bit(MLX5E_RQ_STATE_RECOVERING, &rq->state)) {
1681 mlx5e_dump_error_cqe(&rq->cq, rq->rqn, err_cqe);
1682 queue_work(priv->wq, &rq->recover_work);
1683 }
1684 }
1685
1686 static void mlx5e_handle_rx_err_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
1687 {
1688 trigger_report(rq, cqe);
1689 rq->stats->wqe_err++;
1690 }
1691
1692 static void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
1693 {
1694 struct mlx5_wq_cyc *wq = &rq->wqe.wq;
1695 struct mlx5e_wqe_frag_info *wi;
1696 struct sk_buff *skb;
1697 u32 cqe_bcnt;
1698 u16 ci;
1699
1700 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter));
1701 wi = get_frag(rq, ci);
1702 cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
1703
1704 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
1705 mlx5e_handle_rx_err_cqe(rq, cqe);
1706 goto free_wqe;
1707 }
1708
1709 skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
1710 mlx5e_skb_from_cqe_linear,
1711 mlx5e_skb_from_cqe_nonlinear,
1712 rq, wi, cqe_bcnt);
1713 if (!skb) {
1714
1715 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
1716
1717
1718
1719 goto wq_cyc_pop;
1720 }
1721 goto free_wqe;
1722 }
1723
1724 mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
1725
1726 if (mlx5e_cqe_regb_chain(cqe))
1727 if (!mlx5e_tc_update_skb(cqe, skb)) {
1728 dev_kfree_skb_any(skb);
1729 goto free_wqe;
1730 }
1731
1732 napi_gro_receive(rq->cq.napi, skb);
1733
1734 free_wqe:
1735 mlx5e_free_rx_wqe(rq, wi, true);
1736 wq_cyc_pop:
1737 mlx5_wq_cyc_pop(wq);
1738 }
1739
1740 #ifdef CONFIG_MLX5_ESWITCH
1741 static void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
1742 {
1743 struct net_device *netdev = rq->netdev;
1744 struct mlx5e_priv *priv = netdev_priv(netdev);
1745 struct mlx5e_rep_priv *rpriv = priv->ppriv;
1746 struct mlx5_eswitch_rep *rep = rpriv->rep;
1747 struct mlx5_wq_cyc *wq = &rq->wqe.wq;
1748 struct mlx5e_wqe_frag_info *wi;
1749 struct sk_buff *skb;
1750 u32 cqe_bcnt;
1751 u16 ci;
1752
1753 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter));
1754 wi = get_frag(rq, ci);
1755 cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
1756
1757 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
1758 mlx5e_handle_rx_err_cqe(rq, cqe);
1759 goto free_wqe;
1760 }
1761
1762 skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
1763 mlx5e_skb_from_cqe_linear,
1764 mlx5e_skb_from_cqe_nonlinear,
1765 rq, wi, cqe_bcnt);
1766 if (!skb) {
1767
1768 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) {
1769
1770
1771
1772 goto wq_cyc_pop;
1773 }
1774 goto free_wqe;
1775 }
1776
1777 mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
1778
1779 if (rep->vlan && skb_vlan_tag_present(skb))
1780 skb_vlan_pop(skb);
1781
1782 mlx5e_rep_tc_receive(cqe, rq, skb);
1783
1784 free_wqe:
1785 mlx5e_free_rx_wqe(rq, wi, true);
1786 wq_cyc_pop:
1787 mlx5_wq_cyc_pop(wq);
1788 }
1789
1790 static void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
1791 {
1792 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe);
1793 u16 wqe_id = be16_to_cpu(cqe->wqe_id);
1794 struct mlx5e_mpw_info *wi = &rq->mpwqe.info[wqe_id];
1795 u16 stride_ix = mpwrq_get_cqe_stride_index(cqe);
1796 u32 wqe_offset = stride_ix << rq->mpwqe.log_stride_sz;
1797 u32 head_offset = wqe_offset & (PAGE_SIZE - 1);
1798 u32 page_idx = wqe_offset >> PAGE_SHIFT;
1799 struct mlx5e_rx_wqe_ll *wqe;
1800 struct mlx5_wq_ll *wq;
1801 struct sk_buff *skb;
1802 u16 cqe_bcnt;
1803
1804 wi->consumed_strides += cstrides;
1805
1806 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
1807 mlx5e_handle_rx_err_cqe(rq, cqe);
1808 goto mpwrq_cqe_out;
1809 }
1810
1811 if (unlikely(mpwrq_is_filler_cqe(cqe))) {
1812 struct mlx5e_rq_stats *stats = rq->stats;
1813
1814 stats->mpwqe_filler_cqes++;
1815 stats->mpwqe_filler_strides += cstrides;
1816 goto mpwrq_cqe_out;
1817 }
1818
1819 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
1820
1821 skb = INDIRECT_CALL_2(rq->mpwqe.skb_from_cqe_mpwrq,
1822 mlx5e_skb_from_cqe_mpwrq_linear,
1823 mlx5e_skb_from_cqe_mpwrq_nonlinear,
1824 rq, wi, cqe_bcnt, head_offset, page_idx);
1825 if (!skb)
1826 goto mpwrq_cqe_out;
1827
1828 mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
1829
1830 mlx5e_rep_tc_receive(cqe, rq, skb);
1831
1832 mpwrq_cqe_out:
1833 if (likely(wi->consumed_strides < rq->mpwqe.num_strides))
1834 return;
1835
1836 wq = &rq->mpwqe.wq;
1837 wqe = mlx5_wq_ll_get_wqe(wq, wqe_id);
1838 mlx5e_free_rx_mpwqe(rq, wi, true);
1839 mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index);
1840 }
1841
1842 const struct mlx5e_rx_handlers mlx5e_rx_handlers_rep = {
1843 .handle_rx_cqe = mlx5e_handle_rx_cqe_rep,
1844 .handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq_rep,
1845 };
1846 #endif
1847
1848 static void
1849 mlx5e_fill_skb_data(struct sk_buff *skb, struct mlx5e_rq *rq, struct mlx5e_dma_info *di,
1850 u32 data_bcnt, u32 data_offset)
1851 {
1852 net_prefetchw(skb->data);
1853
1854 while (data_bcnt) {
1855 u32 pg_consumed_bytes = min_t(u32, PAGE_SIZE - data_offset, data_bcnt);
1856 unsigned int truesize;
1857
1858 if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state))
1859 truesize = pg_consumed_bytes;
1860 else
1861 truesize = ALIGN(pg_consumed_bytes, BIT(rq->mpwqe.log_stride_sz));
1862
1863 mlx5e_add_skb_frag(rq, skb, di, data_offset,
1864 pg_consumed_bytes, truesize);
1865
1866 data_bcnt -= pg_consumed_bytes;
1867 data_offset = 0;
1868 di++;
1869 }
1870 }
1871
1872 static struct sk_buff *
1873 mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
1874 u16 cqe_bcnt, u32 head_offset, u32 page_idx)
1875 {
1876 u16 headlen = min_t(u16, MLX5E_RX_MAX_HEAD, cqe_bcnt);
1877 struct mlx5e_dma_info *di = &wi->umr.dma_info[page_idx];
1878 u32 frag_offset = head_offset + headlen;
1879 u32 byte_cnt = cqe_bcnt - headlen;
1880 struct mlx5e_dma_info *head_di = di;
1881 struct sk_buff *skb;
1882
1883 skb = napi_alloc_skb(rq->cq.napi,
1884 ALIGN(MLX5E_RX_MAX_HEAD, sizeof(long)));
1885 if (unlikely(!skb)) {
1886 rq->stats->buff_alloc_err++;
1887 return NULL;
1888 }
1889
1890 net_prefetchw(skb->data);
1891
1892 if (unlikely(frag_offset >= PAGE_SIZE)) {
1893 di++;
1894 frag_offset -= PAGE_SIZE;
1895 }
1896
1897 mlx5e_fill_skb_data(skb, rq, di, byte_cnt, frag_offset);
1898
1899 mlx5e_copy_skb_header(rq->pdev, skb, head_di, head_offset, head_offset, headlen);
1900
1901 skb->tail += headlen;
1902 skb->len += headlen;
1903
1904 return skb;
1905 }
1906
1907 static struct sk_buff *
1908 mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
1909 u16 cqe_bcnt, u32 head_offset, u32 page_idx)
1910 {
1911 struct mlx5e_dma_info *di = &wi->umr.dma_info[page_idx];
1912 u16 rx_headroom = rq->buff.headroom;
1913 struct bpf_prog *prog;
1914 struct sk_buff *skb;
1915 u32 metasize = 0;
1916 void *va, *data;
1917 u32 frag_size;
1918
1919
1920 if (unlikely(cqe_bcnt > rq->hw_mtu)) {
1921 rq->stats->oversize_pkts_sw_drop++;
1922 return NULL;
1923 }
1924
1925 va = page_address(di->page) + head_offset;
1926 data = va + rx_headroom;
1927 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt);
1928
1929 dma_sync_single_range_for_cpu(rq->pdev, di->addr, head_offset,
1930 frag_size, DMA_FROM_DEVICE);
1931 net_prefetch(data);
1932
1933 prog = rcu_dereference(rq->xdp_prog);
1934 if (prog) {
1935 struct xdp_buff xdp;
1936
1937 net_prefetchw(va);
1938 mlx5e_fill_xdp_buff(rq, va, rx_headroom, cqe_bcnt, &xdp);
1939 if (mlx5e_xdp_handle(rq, di->page, prog, &xdp)) {
1940 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags))
1941 __set_bit(page_idx, wi->xdp_xmit_bitmap);
1942 return NULL;
1943 }
1944
1945 rx_headroom = xdp.data - xdp.data_hard_start;
1946 metasize = xdp.data - xdp.data_meta;
1947 cqe_bcnt = xdp.data_end - xdp.data;
1948 }
1949 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt);
1950 skb = mlx5e_build_linear_skb(rq, va, frag_size, rx_headroom, cqe_bcnt, metasize);
1951 if (unlikely(!skb))
1952 return NULL;
1953
1954
1955 page_ref_inc(di->page);
1956
1957 return skb;
1958 }
1959
1960 static struct sk_buff *
1961 mlx5e_skb_from_cqe_shampo(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi,
1962 struct mlx5_cqe64 *cqe, u16 header_index)
1963 {
1964 struct mlx5e_dma_info *head = &rq->mpwqe.shampo->info[header_index];
1965 u16 head_offset = head->addr & (PAGE_SIZE - 1);
1966 u16 head_size = cqe->shampo.header_size;
1967 u16 rx_headroom = rq->buff.headroom;
1968 struct sk_buff *skb = NULL;
1969 void *hdr, *data;
1970 u32 frag_size;
1971
1972 hdr = page_address(head->page) + head_offset;
1973 data = hdr + rx_headroom;
1974 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + head_size);
1975
1976 if (likely(frag_size <= BIT(MLX5E_SHAMPO_LOG_MAX_HEADER_ENTRY_SIZE))) {
1977
1978 dma_sync_single_range_for_cpu(rq->pdev, head->addr, 0, frag_size, DMA_FROM_DEVICE);
1979 prefetchw(hdr);
1980 prefetch(data);
1981 skb = mlx5e_build_linear_skb(rq, hdr, frag_size, rx_headroom, head_size, 0);
1982
1983 if (unlikely(!skb))
1984 return NULL;
1985
1986
1987 page_ref_inc(head->page);
1988
1989 } else {
1990
1991 rq->stats->gro_large_hds++;
1992 skb = napi_alloc_skb(rq->cq.napi,
1993 ALIGN(head_size, sizeof(long)));
1994 if (unlikely(!skb)) {
1995 rq->stats->buff_alloc_err++;
1996 return NULL;
1997 }
1998
1999 prefetchw(skb->data);
2000 mlx5e_copy_skb_header(rq->pdev, skb, head,
2001 head_offset + rx_headroom,
2002 rx_headroom, head_size);
2003
2004 skb->tail += head_size;
2005 skb->len += head_size;
2006 }
2007 return skb;
2008 }
2009
2010 static void
2011 mlx5e_shampo_align_fragment(struct sk_buff *skb, u8 log_stride_sz)
2012 {
2013 skb_frag_t *last_frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
2014 unsigned int frag_size = skb_frag_size(last_frag);
2015 unsigned int frag_truesize;
2016
2017 frag_truesize = ALIGN(frag_size, BIT(log_stride_sz));
2018 skb->truesize += frag_truesize - frag_size;
2019 }
2020
2021 static void
2022 mlx5e_shampo_flush_skb(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, bool match)
2023 {
2024 struct sk_buff *skb = rq->hw_gro_data->skb;
2025 struct mlx5e_rq_stats *stats = rq->stats;
2026
2027 stats->gro_skbs++;
2028 if (likely(skb_shinfo(skb)->nr_frags))
2029 mlx5e_shampo_align_fragment(skb, rq->mpwqe.log_stride_sz);
2030 if (NAPI_GRO_CB(skb)->count > 1)
2031 mlx5e_shampo_update_hdr(rq, cqe, match);
2032 napi_gro_receive(rq->cq.napi, skb);
2033 rq->hw_gro_data->skb = NULL;
2034 }
2035
2036 static bool
2037 mlx5e_hw_gro_skb_has_enough_space(struct sk_buff *skb, u16 data_bcnt)
2038 {
2039 int nr_frags = skb_shinfo(skb)->nr_frags;
2040
2041 return PAGE_SIZE * nr_frags + data_bcnt <= GRO_LEGACY_MAX_SIZE;
2042 }
2043
2044 static void
2045 mlx5e_free_rx_shampo_hd_entry(struct mlx5e_rq *rq, u16 header_index)
2046 {
2047 struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
2048 u64 addr = shampo->info[header_index].addr;
2049
2050 if (((header_index + 1) & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1)) == 0) {
2051 shampo->info[header_index].addr = ALIGN_DOWN(addr, PAGE_SIZE);
2052 mlx5e_page_release(rq, &shampo->info[header_index], true);
2053 }
2054 bitmap_clear(shampo->bitmap, header_index, 1);
2055 }
2056
2057 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
2058 {
2059 u16 data_bcnt = mpwrq_get_cqe_byte_cnt(cqe) - cqe->shampo.header_size;
2060 u16 header_index = mlx5e_shampo_get_cqe_header_index(rq, cqe);
2061 u32 wqe_offset = be32_to_cpu(cqe->shampo.data_offset);
2062 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe);
2063 u32 data_offset = wqe_offset & (PAGE_SIZE - 1);
2064 u32 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
2065 u16 wqe_id = be16_to_cpu(cqe->wqe_id);
2066 u32 page_idx = wqe_offset >> PAGE_SHIFT;
2067 u16 head_size = cqe->shampo.header_size;
2068 struct sk_buff **skb = &rq->hw_gro_data->skb;
2069 bool flush = cqe->shampo.flush;
2070 bool match = cqe->shampo.match;
2071 struct mlx5e_rq_stats *stats = rq->stats;
2072 struct mlx5e_rx_wqe_ll *wqe;
2073 struct mlx5e_dma_info *di;
2074 struct mlx5e_mpw_info *wi;
2075 struct mlx5_wq_ll *wq;
2076
2077 wi = &rq->mpwqe.info[wqe_id];
2078 wi->consumed_strides += cstrides;
2079
2080 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
2081 mlx5e_handle_rx_err_cqe(rq, cqe);
2082 goto mpwrq_cqe_out;
2083 }
2084
2085 if (unlikely(mpwrq_is_filler_cqe(cqe))) {
2086 stats->mpwqe_filler_cqes++;
2087 stats->mpwqe_filler_strides += cstrides;
2088 goto mpwrq_cqe_out;
2089 }
2090
2091 stats->gro_match_packets += match;
2092
2093 if (*skb && (!match || !(mlx5e_hw_gro_skb_has_enough_space(*skb, data_bcnt)))) {
2094 match = false;
2095 mlx5e_shampo_flush_skb(rq, cqe, match);
2096 }
2097
2098 if (!*skb) {
2099 if (likely(head_size))
2100 *skb = mlx5e_skb_from_cqe_shampo(rq, wi, cqe, header_index);
2101 else
2102 *skb = mlx5e_skb_from_cqe_mpwrq_nonlinear(rq, wi, cqe_bcnt, data_offset,
2103 page_idx);
2104 if (unlikely(!*skb))
2105 goto free_hd_entry;
2106
2107 NAPI_GRO_CB(*skb)->count = 1;
2108 skb_shinfo(*skb)->gso_size = cqe_bcnt - head_size;
2109 } else {
2110 NAPI_GRO_CB(*skb)->count++;
2111 if (NAPI_GRO_CB(*skb)->count == 2 &&
2112 rq->hw_gro_data->fk.basic.n_proto == htons(ETH_P_IP)) {
2113 void *hd_addr = mlx5e_shampo_get_packet_hd(rq, header_index);
2114 int nhoff = ETH_HLEN + rq->hw_gro_data->fk.control.thoff -
2115 sizeof(struct iphdr);
2116 struct iphdr *iph = (struct iphdr *)(hd_addr + nhoff);
2117
2118 rq->hw_gro_data->second_ip_id = ntohs(iph->id);
2119 }
2120 }
2121
2122 if (likely(head_size)) {
2123 di = &wi->umr.dma_info[page_idx];
2124 mlx5e_fill_skb_data(*skb, rq, di, data_bcnt, data_offset);
2125 }
2126
2127 mlx5e_shampo_complete_rx_cqe(rq, cqe, cqe_bcnt, *skb);
2128 if (flush)
2129 mlx5e_shampo_flush_skb(rq, cqe, match);
2130 free_hd_entry:
2131 mlx5e_free_rx_shampo_hd_entry(rq, header_index);
2132 mpwrq_cqe_out:
2133 if (likely(wi->consumed_strides < rq->mpwqe.num_strides))
2134 return;
2135
2136 wq = &rq->mpwqe.wq;
2137 wqe = mlx5_wq_ll_get_wqe(wq, wqe_id);
2138 mlx5e_free_rx_mpwqe(rq, wi, true);
2139 mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index);
2140 }
2141
2142 static void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
2143 {
2144 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe);
2145 u16 wqe_id = be16_to_cpu(cqe->wqe_id);
2146 struct mlx5e_mpw_info *wi = &rq->mpwqe.info[wqe_id];
2147 u16 stride_ix = mpwrq_get_cqe_stride_index(cqe);
2148 u32 wqe_offset = stride_ix << rq->mpwqe.log_stride_sz;
2149 u32 head_offset = wqe_offset & (PAGE_SIZE - 1);
2150 u32 page_idx = wqe_offset >> PAGE_SHIFT;
2151 struct mlx5e_rx_wqe_ll *wqe;
2152 struct mlx5_wq_ll *wq;
2153 struct sk_buff *skb;
2154 u16 cqe_bcnt;
2155
2156 wi->consumed_strides += cstrides;
2157
2158 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
2159 mlx5e_handle_rx_err_cqe(rq, cqe);
2160 goto mpwrq_cqe_out;
2161 }
2162
2163 if (unlikely(mpwrq_is_filler_cqe(cqe))) {
2164 struct mlx5e_rq_stats *stats = rq->stats;
2165
2166 stats->mpwqe_filler_cqes++;
2167 stats->mpwqe_filler_strides += cstrides;
2168 goto mpwrq_cqe_out;
2169 }
2170
2171 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
2172
2173 skb = INDIRECT_CALL_2(rq->mpwqe.skb_from_cqe_mpwrq,
2174 mlx5e_skb_from_cqe_mpwrq_linear,
2175 mlx5e_skb_from_cqe_mpwrq_nonlinear,
2176 rq, wi, cqe_bcnt, head_offset, page_idx);
2177 if (!skb)
2178 goto mpwrq_cqe_out;
2179
2180 mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
2181
2182 if (mlx5e_cqe_regb_chain(cqe))
2183 if (!mlx5e_tc_update_skb(cqe, skb)) {
2184 dev_kfree_skb_any(skb);
2185 goto mpwrq_cqe_out;
2186 }
2187
2188 napi_gro_receive(rq->cq.napi, skb);
2189
2190 mpwrq_cqe_out:
2191 if (likely(wi->consumed_strides < rq->mpwqe.num_strides))
2192 return;
2193
2194 wq = &rq->mpwqe.wq;
2195 wqe = mlx5_wq_ll_get_wqe(wq, wqe_id);
2196 mlx5e_free_rx_mpwqe(rq, wi, true);
2197 mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index);
2198 }
2199
2200 int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
2201 {
2202 struct mlx5e_rq *rq = container_of(cq, struct mlx5e_rq, cq);
2203 struct mlx5_cqwq *cqwq = &cq->wq;
2204 struct mlx5_cqe64 *cqe;
2205 int work_done = 0;
2206
2207 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state)))
2208 return 0;
2209
2210 if (rq->cqd.left) {
2211 work_done += mlx5e_decompress_cqes_cont(rq, cqwq, 0, budget);
2212 if (work_done >= budget)
2213 goto out;
2214 }
2215
2216 cqe = mlx5_cqwq_get_cqe(cqwq);
2217 if (!cqe) {
2218 if (unlikely(work_done))
2219 goto out;
2220 return 0;
2221 }
2222
2223 do {
2224 if (mlx5_get_cqe_format(cqe) == MLX5_COMPRESSED) {
2225 work_done +=
2226 mlx5e_decompress_cqes_start(rq, cqwq,
2227 budget - work_done);
2228 continue;
2229 }
2230
2231 mlx5_cqwq_pop(cqwq);
2232
2233 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq,
2234 mlx5e_handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq_shampo,
2235 rq, cqe);
2236 } while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(cqwq)));
2237
2238 out:
2239 if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state) && rq->hw_gro_data->skb)
2240 mlx5e_shampo_flush_skb(rq, NULL, false);
2241
2242 if (rcu_access_pointer(rq->xdp_prog))
2243 mlx5e_xdp_rx_poll_complete(rq);
2244
2245 mlx5_cqwq_update_db_record(cqwq);
2246
2247
2248 wmb();
2249
2250 return work_done;
2251 }
2252
2253 #ifdef CONFIG_MLX5_CORE_IPOIB
2254
2255 #define MLX5_IB_GRH_SGID_OFFSET 8
2256 #define MLX5_IB_GRH_DGID_OFFSET 24
2257 #define MLX5_GID_SIZE 16
2258
2259 static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq,
2260 struct mlx5_cqe64 *cqe,
2261 u32 cqe_bcnt,
2262 struct sk_buff *skb)
2263 {
2264 struct hwtstamp_config *tstamp;
2265 struct mlx5e_rq_stats *stats;
2266 struct net_device *netdev;
2267 struct mlx5e_priv *priv;
2268 char *pseudo_header;
2269 u32 flags_rqpn;
2270 u32 qpn;
2271 u8 *dgid;
2272 u8 g;
2273
2274 qpn = be32_to_cpu(cqe->sop_drop_qpn) & 0xffffff;
2275 netdev = mlx5i_pkey_get_netdev(rq->netdev, qpn);
2276
2277
2278
2279
2280 if (unlikely(!netdev)) {
2281
2282 skb->dev = NULL;
2283 pr_warn_once("Unable to map QPN %u to dev - dropping skb\n", qpn);
2284 return;
2285 }
2286
2287 priv = mlx5i_epriv(netdev);
2288 tstamp = &priv->tstamp;
2289 stats = rq->stats;
2290
2291 flags_rqpn = be32_to_cpu(cqe->flags_rqpn);
2292 g = (flags_rqpn >> 28) & 3;
2293 dgid = skb->data + MLX5_IB_GRH_DGID_OFFSET;
2294 if ((!g) || dgid[0] != 0xff)
2295 skb->pkt_type = PACKET_HOST;
2296 else if (memcmp(dgid, netdev->broadcast + 4, MLX5_GID_SIZE) == 0)
2297 skb->pkt_type = PACKET_BROADCAST;
2298 else
2299 skb->pkt_type = PACKET_MULTICAST;
2300
2301
2302
2303
2304 if (g && (qpn == (flags_rqpn & 0xffffff)) &&
2305 (memcmp(netdev->dev_addr + 4, skb->data + MLX5_IB_GRH_SGID_OFFSET,
2306 MLX5_GID_SIZE) == 0)) {
2307 skb->dev = NULL;
2308 return;
2309 }
2310
2311 skb_pull(skb, MLX5_IB_GRH_BYTES);
2312
2313 skb->protocol = *((__be16 *)(skb->data));
2314
2315 if (netdev->features & NETIF_F_RXCSUM) {
2316 skb->ip_summed = CHECKSUM_COMPLETE;
2317 skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
2318 stats->csum_complete++;
2319 } else {
2320 skb->ip_summed = CHECKSUM_NONE;
2321 stats->csum_none++;
2322 }
2323
2324 if (unlikely(mlx5e_rx_hw_stamp(tstamp)))
2325 skb_hwtstamps(skb)->hwtstamp = mlx5e_cqe_ts_to_ns(rq->ptp_cyc2time,
2326 rq->clock, get_cqe_ts(cqe));
2327 skb_record_rx_queue(skb, rq->ix);
2328
2329 if (likely(netdev->features & NETIF_F_RXHASH))
2330 mlx5e_skb_set_hash(cqe, skb);
2331
2332
2333 pseudo_header = skb_push(skb, MLX5_IPOIB_PSEUDO_LEN);
2334 memset(pseudo_header, 0, MLX5_IPOIB_PSEUDO_LEN);
2335 skb_reset_mac_header(skb);
2336 skb_pull(skb, MLX5_IPOIB_HARD_LEN);
2337
2338 skb->dev = netdev;
2339
2340 stats->packets++;
2341 stats->bytes += cqe_bcnt;
2342 }
2343
2344 static void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
2345 {
2346 struct mlx5_wq_cyc *wq = &rq->wqe.wq;
2347 struct mlx5e_wqe_frag_info *wi;
2348 struct sk_buff *skb;
2349 u32 cqe_bcnt;
2350 u16 ci;
2351
2352 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter));
2353 wi = get_frag(rq, ci);
2354 cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
2355
2356 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
2357 rq->stats->wqe_err++;
2358 goto wq_free_wqe;
2359 }
2360
2361 skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe,
2362 mlx5e_skb_from_cqe_linear,
2363 mlx5e_skb_from_cqe_nonlinear,
2364 rq, wi, cqe_bcnt);
2365 if (!skb)
2366 goto wq_free_wqe;
2367
2368 mlx5i_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
2369 if (unlikely(!skb->dev)) {
2370 dev_kfree_skb_any(skb);
2371 goto wq_free_wqe;
2372 }
2373 napi_gro_receive(rq->cq.napi, skb);
2374
2375 wq_free_wqe:
2376 mlx5e_free_rx_wqe(rq, wi, true);
2377 mlx5_wq_cyc_pop(wq);
2378 }
2379
2380 const struct mlx5e_rx_handlers mlx5i_rx_handlers = {
2381 .handle_rx_cqe = mlx5i_handle_rx_cqe,
2382 .handle_rx_cqe_mpwqe = NULL,
2383 };
2384 #endif
2385
2386 int mlx5e_rq_set_handlers(struct mlx5e_rq *rq, struct mlx5e_params *params, bool xsk)
2387 {
2388 struct net_device *netdev = rq->netdev;
2389 struct mlx5_core_dev *mdev = rq->mdev;
2390 struct mlx5e_priv *priv = rq->priv;
2391
2392 switch (rq->wq_type) {
2393 case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
2394 rq->mpwqe.skb_from_cqe_mpwrq = xsk ?
2395 mlx5e_xsk_skb_from_cqe_mpwrq_linear :
2396 mlx5e_rx_mpwqe_is_linear_skb(mdev, params, NULL) ?
2397 mlx5e_skb_from_cqe_mpwrq_linear :
2398 mlx5e_skb_from_cqe_mpwrq_nonlinear;
2399 rq->post_wqes = mlx5e_post_rx_mpwqes;
2400 rq->dealloc_wqe = mlx5e_dealloc_rx_mpwqe;
2401
2402 if (params->packet_merge.type == MLX5E_PACKET_MERGE_SHAMPO) {
2403 rq->handle_rx_cqe = priv->profile->rx_handlers->handle_rx_cqe_mpwqe_shampo;
2404 if (!rq->handle_rx_cqe) {
2405 netdev_err(netdev, "RX handler of SHAMPO MPWQE RQ is not set\n");
2406 return -EINVAL;
2407 }
2408 } else {
2409 rq->handle_rx_cqe = priv->profile->rx_handlers->handle_rx_cqe_mpwqe;
2410 if (!rq->handle_rx_cqe) {
2411 netdev_err(netdev, "RX handler of MPWQE RQ is not set\n");
2412 return -EINVAL;
2413 }
2414 }
2415
2416 break;
2417 default:
2418 rq->wqe.skb_from_cqe = xsk ?
2419 mlx5e_xsk_skb_from_cqe_linear :
2420 mlx5e_rx_is_linear_skb(params, NULL) ?
2421 mlx5e_skb_from_cqe_linear :
2422 mlx5e_skb_from_cqe_nonlinear;
2423 rq->post_wqes = mlx5e_post_rx_wqes;
2424 rq->dealloc_wqe = mlx5e_dealloc_rx_wqe;
2425 rq->handle_rx_cqe = priv->profile->rx_handlers->handle_rx_cqe;
2426 if (!rq->handle_rx_cqe) {
2427 netdev_err(netdev, "RX handler of RQ is not set\n");
2428 return -EINVAL;
2429 }
2430 }
2431
2432 return 0;
2433 }
2434
2435 static void mlx5e_trap_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
2436 {
2437 struct mlx5e_priv *priv = netdev_priv(rq->netdev);
2438 struct mlx5_wq_cyc *wq = &rq->wqe.wq;
2439 struct mlx5e_wqe_frag_info *wi;
2440 struct devlink_port *dl_port;
2441 struct sk_buff *skb;
2442 u32 cqe_bcnt;
2443 u16 trap_id;
2444 u16 ci;
2445
2446 trap_id = get_cqe_flow_tag(cqe);
2447 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter));
2448 wi = get_frag(rq, ci);
2449 cqe_bcnt = be32_to_cpu(cqe->byte_cnt);
2450
2451 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) {
2452 rq->stats->wqe_err++;
2453 goto free_wqe;
2454 }
2455
2456 skb = mlx5e_skb_from_cqe_nonlinear(rq, wi, cqe_bcnt);
2457 if (!skb)
2458 goto free_wqe;
2459
2460 mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
2461 skb_push(skb, ETH_HLEN);
2462
2463 dl_port = mlx5e_devlink_get_dl_port(priv);
2464 mlx5_devlink_trap_report(rq->mdev, trap_id, skb, dl_port);
2465 dev_kfree_skb_any(skb);
2466
2467 free_wqe:
2468 mlx5e_free_rx_wqe(rq, wi, false);
2469 mlx5_wq_cyc_pop(wq);
2470 }
2471
2472 void mlx5e_rq_set_trap_handlers(struct mlx5e_rq *rq, struct mlx5e_params *params)
2473 {
2474 rq->wqe.skb_from_cqe = mlx5e_rx_is_linear_skb(params, NULL) ?
2475 mlx5e_skb_from_cqe_linear :
2476 mlx5e_skb_from_cqe_nonlinear;
2477 rq->post_wqes = mlx5e_post_rx_wqes;
2478 rq->dealloc_wqe = mlx5e_dealloc_rx_wqe;
2479 rq->handle_rx_cqe = mlx5e_trap_handle_rx_cqe;
2480 }