Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/bnxt/bnxt_re/ib_verbs.h
105645 views
1
/*
2
* Copyright (c) 2015-2024, Broadcom. All rights reserved. The term
3
* Broadcom refers to Broadcom Limited and/or its subsidiaries.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
*
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in
13
* the documentation and/or other materials provided with the
14
* distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
17
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
20
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
*
28
* Description: IB Verbs interpreter (header)
29
*/
30
31
#ifndef __BNXT_RE_IB_VERBS_H__
32
#define __BNXT_RE_IB_VERBS_H__
33
34
#include <rdma/ib_addr.h>
35
#include "bnxt_re-abi.h"
36
#include "qplib_res.h"
37
#include "qplib_fp.h"
38
39
struct bnxt_re_dev;
40
41
#define BNXT_RE_ROCE_V2_UDP_SPORT 0x8CD1
42
#define BNXT_RE_QP_RANDOM_QKEY 0x81818181
43
44
#ifndef IB_MTU_8192
45
#define IB_MTU_8192 8192
46
#endif
47
48
#ifndef SPEED_1000
49
#define SPEED_1000 1000
50
#endif
51
52
#ifndef SPEED_2500
53
#define SPEED_2500 2500
54
#endif
55
56
#ifndef SPEED_5000
57
#define SPEED_5000 5000
58
#endif
59
60
#ifndef SPEED_10000
61
#define SPEED_10000 10000
62
#endif
63
64
#ifndef SPEED_14000
65
#define SPEED_14000 14000
66
#endif
67
68
#ifndef SPEED_20000
69
#define SPEED_20000 20000
70
#endif
71
72
#ifndef SPEED_25000
73
#define SPEED_25000 25000
74
#endif
75
76
#ifndef SPEED_40000
77
#define SPEED_40000 40000
78
#endif
79
80
#ifndef SPEED_50000
81
#define SPEED_50000 50000
82
#endif
83
84
#ifndef SPEED_100000
85
#define SPEED_100000 100000
86
#endif
87
88
#ifndef SPEED_200000
89
#define SPEED_200000 200000
90
#endif
91
92
#ifndef SPEED_400000
93
#define SPEED_400000 400000
94
#endif
95
96
#ifndef IB_SPEED_HDR
97
#define IB_SPEED_HDR 64
98
#endif
99
100
#ifndef IB_SPEED_NDR
101
#define IB_SPEED_NDR 128
102
#endif
103
104
#define RDMA_NETWORK_IPV4 1
105
#define RDMA_NETWORK_IPV6 2
106
107
#define ROCE_DMAC(x) (x)->dmac
108
109
#define dma_rmb() rmb()
110
111
#define compat_ib_alloc_device(size) ib_alloc_device(size);
112
113
#define rdev_from_cq_in(cq_in) to_bnxt_re_dev(cq_in->device, ibdev)
114
115
#define GET_UVERBS_ABI_VERSION(ibdev) (ibdev->uverbs_abi_ver)
116
117
#define CMDQ_REGISTER_MR_LOG2_PBL_PG_SIZE_PG_256MB 0x1cUL
118
119
#define IB_POLL_UNBOUND_WORKQUEUE IB_POLL_WORKQUEUE
120
121
#define BNXT_RE_LEGACY_FENCE_BYTES 64
122
#define BNXT_RE_LEGACY_FENCE_PBL_SIZE DIV_ROUND_UP(BNXT_RE_LEGACY_FENCE_BYTES, PAGE_SIZE)
123
124
125
static inline struct
126
bnxt_re_cq *__get_cq_from_cq_in(struct ib_cq *cq_in,
127
struct bnxt_re_dev *rdev);
128
static inline struct
129
bnxt_re_qp *__get_qp_from_qp_in(struct ib_pd *qp_in,
130
struct bnxt_re_dev *rdev);
131
132
static inline bool
133
bnxt_re_check_if_vlan_valid(struct bnxt_re_dev *rdev, u16 vlan_id);
134
135
#define bnxt_re_compat_qfwstr(void) \
136
bnxt_re_query_fw_str(struct ib_device *ibdev, \
137
char *str, size_t str_len)
138
139
static inline
140
struct scatterlist *get_ib_umem_sgl(struct ib_umem *umem, u32 *nmap);
141
142
struct bnxt_re_gid_ctx {
143
u32 idx;
144
u32 refcnt;
145
};
146
147
struct bnxt_re_legacy_fence_data {
148
u32 size;
149
void *va;
150
dma_addr_t dma_addr;
151
struct bnxt_re_mr *mr;
152
struct ib_mw *mw;
153
struct bnxt_qplib_swqe bind_wqe;
154
u32 bind_rkey;
155
};
156
157
struct bnxt_re_pd {
158
struct ib_pd ibpd;
159
struct bnxt_re_dev *rdev;
160
struct bnxt_qplib_pd qplib_pd;
161
struct bnxt_re_legacy_fence_data fence;
162
};
163
164
struct bnxt_re_ah {
165
struct ib_ah ibah;
166
struct bnxt_re_dev *rdev;
167
struct bnxt_qplib_ah qplib_ah;
168
};
169
170
struct bnxt_re_srq {
171
struct ib_srq ibsrq;
172
struct bnxt_re_dev *rdev;
173
u32 srq_limit;
174
struct bnxt_qplib_srq qplib_srq;
175
struct ib_umem *umem;
176
spinlock_t lock;
177
};
178
179
union ip_addr {
180
u32 ipv4_addr;
181
u8 ipv6_addr[16];
182
};
183
184
struct bnxt_re_qp_info_entry {
185
union ib_gid sgid;
186
union ib_gid dgid;
187
union ip_addr s_ip;
188
union ip_addr d_ip;
189
u16 s_port;
190
#define BNXT_RE_QP_DEST_PORT 4791
191
u16 d_port;
192
};
193
194
struct bnxt_re_qp {
195
struct ib_qp ib_qp;
196
struct list_head list;
197
struct bnxt_re_dev *rdev;
198
spinlock_t sq_lock;
199
spinlock_t rq_lock;
200
struct bnxt_qplib_qp qplib_qp;
201
struct ib_umem *sumem;
202
struct ib_umem *rumem;
203
/* QP1 */
204
u32 send_psn;
205
struct ib_ud_header qp1_hdr;
206
struct bnxt_re_cq *scq;
207
struct bnxt_re_cq *rcq;
208
struct dentry *qp_info_pdev_dentry;
209
struct bnxt_re_qp_info_entry qp_info_entry;
210
void *qp_data;
211
};
212
213
struct bnxt_re_cq {
214
struct ib_cq ibcq;
215
struct list_head cq_list;
216
struct bnxt_re_dev *rdev;
217
struct bnxt_re_ucontext *uctx;
218
spinlock_t cq_lock;
219
u16 cq_count;
220
u16 cq_period;
221
struct bnxt_qplib_cq qplib_cq;
222
struct bnxt_qplib_cqe *cql;
223
#define MAX_CQL_PER_POLL 1024
224
u32 max_cql;
225
struct ib_umem *umem;
226
struct ib_umem *resize_umem;
227
struct ib_ucontext *context;
228
int resize_cqe;
229
/* list of cq per uctx. Used only for Thor-2 */
230
void *uctx_cq_page;
231
void *dbr_recov_cq_page;
232
bool is_dbr_soft_cq;
233
};
234
235
struct bnxt_re_mr {
236
struct bnxt_re_dev *rdev;
237
struct ib_mr ib_mr;
238
struct ib_umem *ib_umem;
239
struct bnxt_qplib_mrw qplib_mr;
240
u32 npages;
241
u64 *pages;
242
struct bnxt_qplib_frpl qplib_frpl;
243
bool is_invalcb_active;
244
};
245
246
struct bnxt_re_frpl {
247
struct bnxt_re_dev *rdev;
248
struct bnxt_qplib_frpl qplib_frpl;
249
u64 *page_list;
250
};
251
252
struct bnxt_re_mw {
253
struct bnxt_re_dev *rdev;
254
struct ib_mw ib_mw;
255
struct bnxt_qplib_mrw qplib_mw;
256
};
257
258
struct bnxt_re_ucontext {
259
struct ib_ucontext ibucontext;
260
struct bnxt_re_dev *rdev;
261
struct list_head cq_list;
262
struct bnxt_qplib_dpi dpi;
263
struct bnxt_qplib_dpi wcdpi;
264
void *shpg;
265
spinlock_t sh_lock;
266
uint64_t cmask;
267
struct mutex cq_lock; /* Protect cq list */
268
void *dbr_recov_cq_page;
269
struct bnxt_re_cq *dbr_recov_cq;
270
};
271
272
struct bnxt_re_ah_info {
273
union ib_gid sgid;
274
struct ib_gid_attr sgid_attr;
275
u16 vlan_tag;
276
u8 nw_type;
277
};
278
279
struct ifnet *bnxt_re_get_netdev(struct ib_device *ibdev,
280
u8 port_num);
281
282
int bnxt_re_query_device(struct ib_device *ibdev,
283
struct ib_device_attr *ib_attr,
284
struct ib_udata *udata);
285
int bnxt_re_modify_device(struct ib_device *ibdev,
286
int device_modify_mask,
287
struct ib_device_modify *device_modify);
288
int bnxt_re_query_port(struct ib_device *ibdev, u8 port_num,
289
struct ib_port_attr *port_attr);
290
int bnxt_re_modify_port(struct ib_device *ibdev, u8 port_num,
291
int port_modify_mask,
292
struct ib_port_modify *port_modify);
293
int bnxt_re_get_port_immutable(struct ib_device *ibdev, u8 port_num,
294
struct ib_port_immutable *immutable);
295
void bnxt_re_compat_qfwstr(void);
296
int bnxt_re_query_pkey(struct ib_device *ibdev, u8 port_num,
297
u16 index, u16 *pkey);
298
int bnxt_re_del_gid(struct ib_device *ibdev, u8 port_num,
299
unsigned int index, void **context);
300
int bnxt_re_add_gid(struct ib_device *ibdev, u8 port_num,
301
unsigned int index, const union ib_gid *gid,
302
const struct ib_gid_attr *attr, void **context);
303
int bnxt_re_query_gid(struct ib_device *ibdev, u8 port_num,
304
int index, union ib_gid *gid);
305
enum rdma_link_layer bnxt_re_get_link_layer(struct ib_device *ibdev,
306
u8 port_num);
307
int bnxt_re_alloc_pd(struct ib_pd *pd_in, struct ib_udata *udata);
308
void bnxt_re_dealloc_pd(struct ib_pd *ib_pd, struct ib_udata *udata);
309
310
int bnxt_re_create_ah(struct ib_ah *ah_in, struct ib_ah_attr *attr,
311
u32 flags, struct ib_udata *udata);
312
313
int bnxt_re_modify_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr);
314
int bnxt_re_query_ah(struct ib_ah *ah, struct ib_ah_attr *ah_attr);
315
316
void bnxt_re_destroy_ah(struct ib_ah *ib_ah, u32 flags);
317
int bnxt_re_create_srq(struct ib_srq *srq_in,
318
struct ib_srq_init_attr *srq_init_attr,
319
struct ib_udata *udata);
320
int bnxt_re_modify_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr,
321
enum ib_srq_attr_mask srq_attr_mask,
322
struct ib_udata *udata);
323
int bnxt_re_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
324
void bnxt_re_destroy_srq(struct ib_srq *ib_srq,
325
struct ib_udata *udata);
326
int bnxt_re_post_srq_recv(struct ib_srq *ib_srq, const struct ib_recv_wr *wr,
327
const struct ib_recv_wr **bad_wr);
328
struct ib_qp *bnxt_re_create_qp(struct ib_pd *qp_in,
329
struct ib_qp_init_attr *qp_init_attr,
330
struct ib_udata *udata);
331
int bnxt_re_modify_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
332
int qp_attr_mask, struct ib_udata *udata);
333
int bnxt_re_query_qp(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
334
int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
335
int bnxt_re_destroy_qp(struct ib_qp *ib_qp, struct ib_udata *udata);
336
int bnxt_re_post_send(struct ib_qp *ib_qp, const struct ib_send_wr *wr,
337
const struct ib_send_wr **bad_wr);
338
int bnxt_re_post_recv(struct ib_qp *ib_qp, const struct ib_recv_wr *wr,
339
const struct ib_recv_wr **bad_wr);
340
int bnxt_re_create_cq(struct ib_cq *cq_in,
341
const struct ib_cq_init_attr *attr,
342
struct ib_udata *udata);
343
void bnxt_re_destroy_cq(struct ib_cq *ib_cq, struct ib_udata *udata);
344
int bnxt_re_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period);
345
int bnxt_re_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata);
346
int bnxt_re_poll_cq(struct ib_cq *cq, int num_entries, struct ib_wc *wc);
347
int bnxt_re_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags);
348
struct ib_mr *bnxt_re_get_dma_mr(struct ib_pd *pd, int mr_access_flags);
349
int bnxt_re_map_mr_sg(struct ib_mr *ib_mr, struct scatterlist *sg,
350
int sg_nents, unsigned int *sg_offset);
351
struct ib_mr *bnxt_re_alloc_mr(struct ib_pd *ib_pd, enum ib_mr_type type,
352
u32 max_num_sg, struct ib_udata *udata);
353
int bnxt_re_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata);
354
struct ib_mw *bnxt_re_alloc_mw(struct ib_pd *ib_pd, enum ib_mw_type type,
355
struct ib_udata *udata);
356
int bnxt_re_dealloc_mw(struct ib_mw *mw);
357
struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
358
u64 virt_addr, int mr_access_flags,
359
struct ib_udata *udata);
360
int
361
bnxt_re_rereg_user_mr(struct ib_mr *mr, int flags, u64 start, u64 length,
362
u64 virt_addr, int mr_access_flags, struct ib_pd *pd,
363
struct ib_udata *udata);
364
int bnxt_re_alloc_ucontext(struct ib_ucontext *uctx_in,
365
struct ib_udata *udata);
366
void bnxt_re_dealloc_ucontext(struct ib_ucontext *ib_uctx);
367
int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
368
int bnxt_re_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
369
const struct ib_wc *wc, const struct ib_grh *grh,
370
const struct ib_mad_hdr *in_mad, size_t in_mad_size,
371
struct ib_mad_hdr *out_mad, size_t *out_mad_size,
372
u16 *out_mad_pkey_index);
373
unsigned long bnxt_re_lock_cqs(struct bnxt_re_qp *qp);
374
void bnxt_re_unlock_cqs(struct bnxt_re_qp *qp, unsigned long flags);
375
void bnxt_re_disassociate_ucntx(struct ib_ucontext *ibcontext);
376
static inline int __bnxt_re_set_vma_data(void *bnxt_re_uctx,
377
struct vm_area_struct *vma);
378
void bnxt_re_update_shadow_ah(struct bnxt_re_dev *rdev);
379
void bnxt_re_handle_cqn(struct bnxt_qplib_cq *cq);
380
static inline int
381
bnxt_re_get_cached_gid(struct ib_device *dev, u8 port_num, int index,
382
union ib_gid *sgid, struct ib_gid_attr **sgid_attr,
383
struct ib_global_route *grh, struct ib_ah *ah);
384
static inline enum rdma_network_type
385
bnxt_re_gid_to_network_type(struct ib_gid_attr *sgid_attr,
386
union ib_gid *sgid);
387
static inline
388
struct ib_umem *ib_umem_get_compat(struct bnxt_re_dev *rdev,
389
struct ib_ucontext *ucontext,
390
struct ib_udata *udata,
391
unsigned long addr,
392
size_t size, int access, int dmasync);
393
static inline
394
struct ib_umem *ib_umem_get_flags_compat(struct bnxt_re_dev *rdev,
395
struct ib_ucontext *ucontext,
396
struct ib_udata *udata,
397
unsigned long addr,
398
size_t size, int access, int dmasync);
399
static inline size_t ib_umem_num_pages_compat(struct ib_umem *umem);
400
static inline void bnxt_re_peer_mem_release(struct ib_umem *umem);
401
void bnxt_re_resolve_dmac_task(struct work_struct *work);
402
403
static inline enum ib_qp_type __from_hw_to_ib_qp_type(u8 type)
404
{
405
switch (type) {
406
case CMDQ_CREATE_QP1_TYPE_GSI:
407
case CMDQ_CREATE_QP_TYPE_GSI:
408
return IB_QPT_GSI;
409
case CMDQ_CREATE_QP_TYPE_RC:
410
return IB_QPT_RC;
411
case CMDQ_CREATE_QP_TYPE_UD:
412
return IB_QPT_UD;
413
case CMDQ_CREATE_QP_TYPE_RAW_ETHERTYPE:
414
return IB_QPT_RAW_ETHERTYPE;
415
default:
416
return IB_QPT_MAX;
417
}
418
}
419
420
static inline u8 __from_ib_qp_state(enum ib_qp_state state)
421
{
422
switch (state) {
423
case IB_QPS_RESET:
424
return CMDQ_MODIFY_QP_NEW_STATE_RESET;
425
case IB_QPS_INIT:
426
return CMDQ_MODIFY_QP_NEW_STATE_INIT;
427
case IB_QPS_RTR:
428
return CMDQ_MODIFY_QP_NEW_STATE_RTR;
429
case IB_QPS_RTS:
430
return CMDQ_MODIFY_QP_NEW_STATE_RTS;
431
case IB_QPS_SQD:
432
return CMDQ_MODIFY_QP_NEW_STATE_SQD;
433
case IB_QPS_SQE:
434
return CMDQ_MODIFY_QP_NEW_STATE_SQE;
435
case IB_QPS_ERR:
436
default:
437
return CMDQ_MODIFY_QP_NEW_STATE_ERR;
438
}
439
}
440
441
static inline u32 __from_ib_mtu(enum ib_mtu mtu)
442
{
443
switch (mtu) {
444
case IB_MTU_256:
445
return CMDQ_MODIFY_QP_PATH_MTU_MTU_256;
446
case IB_MTU_512:
447
return CMDQ_MODIFY_QP_PATH_MTU_MTU_512;
448
case IB_MTU_1024:
449
return CMDQ_MODIFY_QP_PATH_MTU_MTU_1024;
450
case IB_MTU_2048:
451
return CMDQ_MODIFY_QP_PATH_MTU_MTU_2048;
452
case IB_MTU_4096:
453
return CMDQ_MODIFY_QP_PATH_MTU_MTU_4096;
454
default:
455
return CMDQ_MODIFY_QP_PATH_MTU_MTU_2048;
456
}
457
}
458
459
static inline enum ib_mtu __to_ib_mtu(u32 mtu)
460
{
461
switch (mtu & CREQ_QUERY_QP_RESP_SB_PATH_MTU_MASK) {
462
case CMDQ_MODIFY_QP_PATH_MTU_MTU_256:
463
return IB_MTU_256;
464
case CMDQ_MODIFY_QP_PATH_MTU_MTU_512:
465
return IB_MTU_512;
466
case CMDQ_MODIFY_QP_PATH_MTU_MTU_1024:
467
return IB_MTU_1024;
468
case CMDQ_MODIFY_QP_PATH_MTU_MTU_2048:
469
return IB_MTU_2048;
470
case CMDQ_MODIFY_QP_PATH_MTU_MTU_4096:
471
return IB_MTU_4096;
472
case CMDQ_MODIFY_QP_PATH_MTU_MTU_8192:
473
return IB_MTU_8192;
474
default:
475
return IB_MTU_2048;
476
}
477
}
478
479
static inline enum ib_qp_state __to_ib_qp_state(u8 state)
480
{
481
switch (state) {
482
case CMDQ_MODIFY_QP_NEW_STATE_RESET:
483
return IB_QPS_RESET;
484
case CMDQ_MODIFY_QP_NEW_STATE_INIT:
485
return IB_QPS_INIT;
486
case CMDQ_MODIFY_QP_NEW_STATE_RTR:
487
return IB_QPS_RTR;
488
case CMDQ_MODIFY_QP_NEW_STATE_RTS:
489
return IB_QPS_RTS;
490
case CMDQ_MODIFY_QP_NEW_STATE_SQD:
491
return IB_QPS_SQD;
492
case CMDQ_MODIFY_QP_NEW_STATE_SQE:
493
return IB_QPS_SQE;
494
case CMDQ_MODIFY_QP_NEW_STATE_ERR:
495
default:
496
return IB_QPS_ERR;
497
}
498
}
499
500
static inline int bnxt_re_init_pow2_flag(struct bnxt_re_uctx_req *req,
501
struct bnxt_re_uctx_resp *resp)
502
{
503
resp->comp_mask |= BNXT_RE_COMP_MASK_UCNTX_POW2_DISABLED;
504
if (!(req->comp_mask & BNXT_RE_COMP_MASK_REQ_UCNTX_POW2_SUPPORT)) {
505
resp->comp_mask &= ~BNXT_RE_COMP_MASK_UCNTX_POW2_DISABLED;
506
return -EINVAL;
507
}
508
return 0;
509
}
510
511
enum {
512
BNXT_RE_UCNTX_CAP_POW2_DISABLED = 0x1ULL,
513
BNXT_RE_UCNTX_CAP_VAR_WQE_ENABLED = 0x2ULL,
514
};
515
516
static inline u32 bnxt_re_init_depth(u32 ent, struct bnxt_re_ucontext *uctx)
517
{
518
return uctx ? (uctx->cmask & BNXT_RE_COMP_MASK_UCNTX_POW2_DISABLED) ?
519
ent : roundup_pow_of_two(ent) : ent;
520
}
521
522
static inline int bnxt_re_init_rsvd_wqe_flag(struct bnxt_re_uctx_req *req,
523
struct bnxt_re_uctx_resp *resp,
524
bool genp5)
525
{
526
resp->comp_mask |= BNXT_RE_COMP_MASK_UCNTX_RSVD_WQE_DISABLED;
527
if (!(req->comp_mask & BNXT_RE_COMP_MASK_REQ_UCNTX_RSVD_WQE)) {
528
resp->comp_mask &= ~BNXT_RE_COMP_MASK_UCNTX_RSVD_WQE_DISABLED;
529
return -EINVAL;
530
} else if (!genp5) {
531
resp->comp_mask &= ~BNXT_RE_COMP_MASK_UCNTX_RSVD_WQE_DISABLED;
532
}
533
return 0;
534
}
535
536
static inline u32 bnxt_re_get_diff(struct bnxt_re_ucontext *uctx,
537
struct bnxt_qplib_chip_ctx *cctx)
538
{
539
if (!uctx) {
540
/* return res-wqe only for gen p4 for user resource */
541
return _is_chip_gen_p5_p7(cctx) ? 0 : BNXT_QPLIB_RESERVED_QP_WRS;
542
} else if (uctx->cmask & BNXT_RE_COMP_MASK_UCNTX_RSVD_WQE_DISABLED) {
543
return 0;
544
}
545
/* old lib */
546
return BNXT_QPLIB_RESERVED_QP_WRS;
547
}
548
549
static inline void bnxt_re_init_qpmtu(struct bnxt_re_qp *qp, int mtu,
550
int mask, struct ib_qp_attr *qp_attr,
551
bool *is_qpmtu_high)
552
{
553
int qpmtu, qpmtu_int;
554
int ifmtu, ifmtu_int;
555
556
ifmtu = iboe_get_mtu(mtu);
557
ifmtu_int = ib_mtu_enum_to_int(ifmtu);
558
qpmtu = ifmtu;
559
qpmtu_int = ifmtu_int;
560
if (mask & IB_QP_PATH_MTU) {
561
qpmtu = qp_attr->path_mtu;
562
qpmtu_int = ib_mtu_enum_to_int(qpmtu);
563
if (qpmtu_int > ifmtu_int) {
564
/* Trim the QP path mtu to interface mtu and update
565
* the new mtu to user qp for retransmission psn
566
* calculations.
567
*/
568
qpmtu = ifmtu;
569
qpmtu_int = ifmtu_int;
570
*is_qpmtu_high = true;
571
}
572
}
573
qp->qplib_qp.path_mtu = __from_ib_mtu(qpmtu);
574
qp->qplib_qp.mtu = qpmtu_int;
575
qp->qplib_qp.modify_flags |=
576
CMDQ_MODIFY_QP_MODIFY_MASK_PATH_MTU;
577
}
578
579
inline unsigned long compare_ether_header(void *a, void *b)
580
{
581
u32 *a32 = (u32 *)((u8 *)a + 2);
582
u32 *b32 = (u32 *)((u8 *)b + 2);
583
584
return (*(u16 *)a ^ *(u16 *)b) | (a32[0] ^ b32[0]) |
585
(a32[1] ^ b32[1]) | (a32[2] ^ b32[2]);
586
}
587
588
struct vlan_hdr {
589
__be16 h_vlan_TCI;
590
__be16 h_vlan_encapsulated_proto;
591
};
592
593
inline uint16_t
594
crc16(uint16_t crc, const void *buffer, unsigned int len)
595
{
596
const unsigned char *cp = buffer;
597
/* CRC table for the CRC-16. The poly is 0x8005 (x16 + x15 + x2 + 1). */
598
static uint16_t const crc16_table[256] = {
599
0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
600
0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
601
0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
602
0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
603
0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
604
0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
605
0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
606
0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
607
0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
608
0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
609
0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
610
0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
611
0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
612
0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
613
0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
614
0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
615
0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
616
0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
617
0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
618
0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
619
0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
620
0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
621
0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
622
0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
623
0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
624
0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
625
0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
626
0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
627
0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
628
0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
629
0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
630
0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
631
};
632
633
while (len--)
634
crc = (((crc >> 8) & 0xffU) ^
635
crc16_table[(crc ^ *cp++) & 0xffU]) & 0x0000ffffU;
636
return crc;
637
}
638
639
static inline int __bnxt_re_set_vma_data(void *bnxt_re_uctx,
640
struct vm_area_struct *vma)
641
{
642
return 0;
643
}
644
645
static inline bool bnxt_re_check_if_vlan_valid(struct bnxt_re_dev *rdev,
646
u16 vlan_id)
647
{
648
bool ret = true;
649
/*
650
* Check if the vlan is configured in the host.
651
* If not configured, it can be a transparent
652
* VLAN. So dont report the vlan id.
653
*/
654
return ret;
655
}
656
657
#endif
658
659