Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/dev/bnxt/bnxt_re/main.c
105375 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: Main component of the bnxt_re driver
29
*/
30
31
#include <linux/if_ether.h>
32
#include <linux/module.h>
33
#include <linux/errno.h>
34
#include <linux/pci.h>
35
#include <linux/dma-mapping.h>
36
#include <linux/slab.h>
37
#include <linux/sched.h>
38
#include <linux/delay.h>
39
#include <linux/fs.h>
40
#include <rdma/ib_user_verbs.h>
41
#include <rdma/ib_addr.h>
42
#include <rdma/ib_cache.h>
43
#include <dev/mlx5/port.h>
44
#include <dev/mlx5/vport.h>
45
#include <linux/list.h>
46
#include <rdma/ib_smi.h>
47
#include <rdma/ib_umem.h>
48
#include <linux/in.h>
49
#include <linux/etherdevice.h>
50
51
#include "bnxt_re.h"
52
#include "ib_verbs.h"
53
#include "bnxt_re-abi.h"
54
#include "bnxt.h"
55
56
static char drv_version[] =
57
"Broadcom NetXtreme-C/E RoCE Driver " ROCE_DRV_MODULE_NAME \
58
" v" ROCE_DRV_MODULE_VERSION " (" ROCE_DRV_MODULE_RELDATE ")\n";
59
60
#define BNXT_RE_DESC "Broadcom NetXtreme RoCE"
61
#define BNXT_ADEV_NAME "if_bnxt"
62
63
MODULE_DESCRIPTION("Broadcom NetXtreme-C/E RoCE Driver");
64
MODULE_LICENSE("Dual BSD/GPL");
65
MODULE_DEPEND(bnxt_re, linuxkpi, 1, 1, 1);
66
MODULE_DEPEND(bnxt_re, ibcore, 1, 1, 1);
67
MODULE_DEPEND(bnxt_re, if_bnxt, 1, 1, 1);
68
MODULE_VERSION(bnxt_re, 1);
69
70
71
DEFINE_MUTEX(bnxt_re_mutex); /* mutex lock for driver */
72
73
static unsigned int restrict_mrs = 0;
74
module_param(restrict_mrs, uint, 0);
75
MODULE_PARM_DESC(restrict_mrs, " Restrict the no. of MRs 0 = 256K , 1 = 64K");
76
77
unsigned int restrict_stats = 0;
78
module_param(restrict_stats, uint, 0);
79
MODULE_PARM_DESC(restrict_stats, "Restrict stats query frequency to ethtool coalesce value. Disabled by default");
80
81
unsigned int enable_fc = 1;
82
module_param(enable_fc, uint, 0);
83
MODULE_PARM_DESC(enable_fc, "Enable default PFC, CC,ETS during driver load. 1 - fc enable, 0 - fc disable - Default is 1");
84
85
unsigned int min_tx_depth = 1;
86
module_param(min_tx_depth, uint, 0);
87
MODULE_PARM_DESC(min_tx_depth, "Minimum TX depth - Default is 1");
88
89
static uint8_t max_msix_vec[BNXT_RE_MAX_DEVICES] = {0};
90
static unsigned int max_msix_vec_argc;
91
module_param_array(max_msix_vec, byte, &max_msix_vec_argc, 0444);
92
MODULE_PARM_DESC(max_msix_vec, "Max MSI-x vectors per PF (2 - 64) - Default is 64");
93
94
unsigned int cmdq_shadow_qd = RCFW_CMD_NON_BLOCKING_SHADOW_QD;
95
module_param_named(cmdq_shadow_qd, cmdq_shadow_qd, uint, 0644);
96
MODULE_PARM_DESC(cmdq_shadow_qd, "Perf Stat Debug: Shadow QD Range (1-64) - Default is 64");
97
98
99
/* globals */
100
struct list_head bnxt_re_dev_list = LINUX_LIST_HEAD_INIT(bnxt_re_dev_list);
101
static int bnxt_re_probe_count;
102
103
DEFINE_MUTEX(bnxt_re_dev_lock);
104
static u32 gmod_exit;
105
static u32 gadd_dev_inprogress;
106
107
static void bnxt_re_task(struct work_struct *work_task);
108
static struct workqueue_struct *bnxt_re_wq;
109
static int bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev);
110
static int bnxt_re_hwrm_qcfg(struct bnxt_re_dev *rdev, u32 *db_len,
111
u32 *offset);
112
static int bnxt_re_ib_init(struct bnxt_re_dev *rdev);
113
static void bnxt_re_ib_init_2(struct bnxt_re_dev *rdev);
114
void _bnxt_re_remove(struct auxiliary_device *adev);
115
void writel_fbsd(struct bnxt_softc *bp, u32, u8, u32);
116
u32 readl_fbsd(struct bnxt_softc *bp, u32, u8);
117
static int bnxt_re_hwrm_dbr_pacing_qcfg(struct bnxt_re_dev *rdev);
118
119
int bnxt_re_register_netdevice_notifier(struct notifier_block *nb)
120
{
121
int rc;
122
rc = register_netdevice_notifier(nb);
123
return rc;
124
}
125
126
int bnxt_re_unregister_netdevice_notifier(struct notifier_block *nb)
127
{
128
int rc;
129
rc = unregister_netdevice_notifier(nb);
130
return rc;
131
}
132
133
void bnxt_re_set_dma_device(struct ib_device *ibdev, struct bnxt_re_dev *rdev)
134
{
135
ibdev->dma_device = &rdev->en_dev->pdev->dev;
136
}
137
138
void bnxt_re_init_resolve_wq(struct bnxt_re_dev *rdev)
139
{
140
rdev->resolve_wq = create_singlethread_workqueue("bnxt_re_resolve_wq");
141
INIT_LIST_HEAD(&rdev->mac_wq_list);
142
}
143
144
void bnxt_re_uninit_resolve_wq(struct bnxt_re_dev *rdev)
145
{
146
struct bnxt_re_resolve_dmac_work *tmp_work = NULL, *tmp_st;
147
if (!rdev->resolve_wq)
148
return;
149
flush_workqueue(rdev->resolve_wq);
150
list_for_each_entry_safe(tmp_work, tmp_st, &rdev->mac_wq_list, list) {
151
list_del(&tmp_work->list);
152
kfree(tmp_work);
153
}
154
destroy_workqueue(rdev->resolve_wq);
155
rdev->resolve_wq = NULL;
156
}
157
158
u32 readl_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx)
159
{
160
161
if (bar_idx)
162
return bus_space_read_8(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off);
163
else
164
return bus_space_read_8(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off);
165
}
166
167
void writel_fbsd(struct bnxt_softc *bp, u32 reg_off, u8 bar_idx, u32 val)
168
{
169
if (bar_idx)
170
bus_space_write_8(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off, htole32(val));
171
else
172
bus_space_write_8(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off, htole32(val));
173
}
174
175
static void bnxt_re_update_fifo_occup_slabs(struct bnxt_re_dev *rdev,
176
u32 fifo_occup)
177
{
178
if (fifo_occup > rdev->dbg_stats->dbq.fifo_occup_water_mark)
179
rdev->dbg_stats->dbq.fifo_occup_water_mark = fifo_occup;
180
181
if (fifo_occup > 8 * rdev->pacing_algo_th)
182
rdev->dbg_stats->dbq.fifo_occup_slab_4++;
183
else if (fifo_occup > 4 * rdev->pacing_algo_th)
184
rdev->dbg_stats->dbq.fifo_occup_slab_3++;
185
else if (fifo_occup > 2 * rdev->pacing_algo_th)
186
rdev->dbg_stats->dbq.fifo_occup_slab_2++;
187
else if (fifo_occup > rdev->pacing_algo_th)
188
rdev->dbg_stats->dbq.fifo_occup_slab_1++;
189
}
190
191
static void bnxt_re_update_do_pacing_slabs(struct bnxt_re_dev *rdev)
192
{
193
struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data;
194
195
if (pacing_data->do_pacing > rdev->dbg_stats->dbq.do_pacing_water_mark)
196
rdev->dbg_stats->dbq.do_pacing_water_mark = pacing_data->do_pacing;
197
198
if (pacing_data->do_pacing > 16 * rdev->dbr_def_do_pacing)
199
rdev->dbg_stats->dbq.do_pacing_slab_5++;
200
else if (pacing_data->do_pacing > 8 * rdev->dbr_def_do_pacing)
201
rdev->dbg_stats->dbq.do_pacing_slab_4++;
202
else if (pacing_data->do_pacing > 4 * rdev->dbr_def_do_pacing)
203
rdev->dbg_stats->dbq.do_pacing_slab_3++;
204
else if (pacing_data->do_pacing > 2 * rdev->dbr_def_do_pacing)
205
rdev->dbg_stats->dbq.do_pacing_slab_2++;
206
else if (pacing_data->do_pacing > rdev->dbr_def_do_pacing)
207
rdev->dbg_stats->dbq.do_pacing_slab_1++;
208
}
209
210
static bool bnxt_re_is_qp1_qp(struct bnxt_re_qp *qp)
211
{
212
return qp->ib_qp.qp_type == IB_QPT_GSI;
213
}
214
215
static struct bnxt_re_qp *bnxt_re_get_qp1_qp(struct bnxt_re_dev *rdev)
216
{
217
struct bnxt_re_qp *qp;
218
219
mutex_lock(&rdev->qp_lock);
220
list_for_each_entry(qp, &rdev->qp_list, list) {
221
if (bnxt_re_is_qp1_qp(qp)) {
222
mutex_unlock(&rdev->qp_lock);
223
return qp;
224
}
225
}
226
mutex_unlock(&rdev->qp_lock);
227
return NULL;
228
}
229
230
/* Set the maximum number of each resource that the driver actually wants
231
* to allocate. This may be up to the maximum number the firmware has
232
* reserved for the function. The driver may choose to allocate fewer
233
* resources than the firmware maximum.
234
*/
235
static void bnxt_re_limit_pf_res(struct bnxt_re_dev *rdev)
236
{
237
struct bnxt_qplib_max_res dev_res = {};
238
struct bnxt_qplib_chip_ctx *cctx;
239
struct bnxt_qplib_dev_attr *attr;
240
struct bnxt_qplib_ctx *hctx;
241
int i;
242
243
attr = rdev->dev_attr;
244
hctx = rdev->qplib_res.hctx;
245
cctx = rdev->chip_ctx;
246
247
bnxt_qplib_max_res_supported(cctx, &rdev->qplib_res, &dev_res, false);
248
if (!_is_chip_gen_p5_p7(cctx)) {
249
hctx->qp_ctx.max = min_t(u32, dev_res.max_qp, attr->max_qp);
250
hctx->mrw_ctx.max = min_t(u32, dev_res.max_mr, attr->max_mr);
251
/* To accommodate 16k MRs and 16k AHs,
252
* driver has to allocate 32k backing store memory
253
*/
254
hctx->mrw_ctx.max *= 2;
255
hctx->srq_ctx.max = min_t(u32, dev_res.max_srq, attr->max_srq);
256
hctx->cq_ctx.max = min_t(u32, dev_res.max_cq, attr->max_cq);
257
for (i = 0; i < MAX_TQM_ALLOC_REQ; i++)
258
hctx->tqm_ctx.qcount[i] = attr->tqm_alloc_reqs[i];
259
} else {
260
hctx->qp_ctx.max = attr->max_qp ? attr->max_qp : dev_res.max_qp;
261
hctx->mrw_ctx.max = attr->max_mr ? attr->max_mr : dev_res.max_mr;
262
hctx->srq_ctx.max = attr->max_srq ? attr->max_srq : dev_res.max_srq;
263
hctx->cq_ctx.max = attr->max_cq ? attr->max_cq : dev_res.max_cq;
264
}
265
}
266
267
static void bnxt_re_limit_vf_res(struct bnxt_re_dev *rdev,
268
struct bnxt_qplib_vf_res *vf_res,
269
u32 num_vf)
270
{
271
struct bnxt_qplib_chip_ctx *cctx = rdev->chip_ctx;
272
struct bnxt_qplib_max_res dev_res = {};
273
274
bnxt_qplib_max_res_supported(cctx, &rdev->qplib_res, &dev_res, true);
275
vf_res->max_qp = dev_res.max_qp / num_vf;
276
vf_res->max_srq = dev_res.max_srq / num_vf;
277
vf_res->max_cq = dev_res.max_cq / num_vf;
278
/*
279
* MR and AH shares the same backing store, the value specified
280
* for max_mrw is split into half by the FW for MR and AH
281
*/
282
vf_res->max_mrw = dev_res.max_mr * 2 / num_vf;
283
vf_res->max_gid = BNXT_RE_MAX_GID_PER_VF;
284
}
285
286
static void bnxt_re_set_resource_limits(struct bnxt_re_dev *rdev)
287
{
288
struct bnxt_qplib_ctx *hctx;
289
290
hctx = rdev->qplib_res.hctx;
291
memset(&hctx->vf_res, 0, sizeof(struct bnxt_qplib_vf_res));
292
bnxt_re_limit_pf_res(rdev);
293
294
if (rdev->num_vfs)
295
bnxt_re_limit_vf_res(rdev, &hctx->vf_res, rdev->num_vfs);
296
}
297
298
static void bnxt_re_dettach_irq(struct bnxt_re_dev *rdev)
299
{
300
struct bnxt_qplib_rcfw *rcfw = NULL;
301
struct bnxt_qplib_nq *nq;
302
int indx;
303
304
rcfw = &rdev->rcfw;
305
for (indx = 0; indx < rdev->nqr.max_init; indx++) {
306
nq = &rdev->nqr.nq[indx];
307
mutex_lock(&nq->lock);
308
bnxt_qplib_nq_stop_irq(nq, false);
309
mutex_unlock(&nq->lock);
310
}
311
312
bnxt_qplib_rcfw_stop_irq(rcfw, false);
313
}
314
315
static void bnxt_re_detach_err_device(struct bnxt_re_dev *rdev)
316
{
317
/* Free the MSIx vectors only so that L2 can proceed with MSIx disable */
318
bnxt_re_dettach_irq(rdev);
319
320
/* Set the state as detached to prevent sending any more commands */
321
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
322
set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
323
wake_up_all(&rdev->rcfw.cmdq.waitq);
324
}
325
326
#define MAX_DSCP_PRI_TUPLE 64
327
328
struct bnxt_re_dcb_work {
329
struct work_struct work;
330
struct bnxt_re_dev *rdev;
331
struct hwrm_async_event_cmpl cmpl;
332
};
333
334
static void bnxt_re_init_dcb_wq(struct bnxt_re_dev *rdev)
335
{
336
rdev->dcb_wq = create_singlethread_workqueue("bnxt_re_dcb_wq");
337
}
338
339
static void bnxt_re_uninit_dcb_wq(struct bnxt_re_dev *rdev)
340
{
341
if (!rdev->dcb_wq)
342
return;
343
flush_workqueue(rdev->dcb_wq);
344
destroy_workqueue(rdev->dcb_wq);
345
rdev->dcb_wq = NULL;
346
}
347
348
static void bnxt_re_init_aer_wq(struct bnxt_re_dev *rdev)
349
{
350
rdev->aer_wq = create_singlethread_workqueue("bnxt_re_aer_wq");
351
}
352
353
static void bnxt_re_uninit_aer_wq(struct bnxt_re_dev *rdev)
354
{
355
if (!rdev->aer_wq)
356
return;
357
flush_workqueue(rdev->aer_wq);
358
destroy_workqueue(rdev->aer_wq);
359
rdev->aer_wq = NULL;
360
}
361
362
static int bnxt_re_update_qp1_tos_dscp(struct bnxt_re_dev *rdev)
363
{
364
struct bnxt_re_qp *qp;
365
366
if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
367
return 0;
368
369
qp = bnxt_re_get_qp1_qp(rdev);
370
if (!qp)
371
return 0;
372
373
qp->qplib_qp.modify_flags = CMDQ_MODIFY_QP_MODIFY_MASK_TOS_DSCP;
374
qp->qplib_qp.tos_dscp = rdev->cc_param.qp1_tos_dscp;
375
376
return bnxt_qplib_modify_qp(&rdev->qplib_res, &qp->qplib_qp);
377
}
378
379
static void bnxt_re_reconfigure_dscp(struct bnxt_re_dev *rdev)
380
{
381
struct bnxt_qplib_cc_param *cc_param;
382
struct bnxt_re_tc_rec *tc_rec;
383
bool update_cc = false;
384
u8 dscp_user;
385
int rc;
386
387
cc_param = &rdev->cc_param;
388
tc_rec = &rdev->tc_rec[0];
389
390
if (!(cc_param->roce_dscp_user || cc_param->cnp_dscp_user))
391
return;
392
393
if (cc_param->cnp_dscp_user) {
394
dscp_user = (cc_param->cnp_dscp_user & 0x3f);
395
if ((tc_rec->cnp_dscp_bv & (1ul << dscp_user)) &&
396
(cc_param->alt_tos_dscp != dscp_user)) {
397
cc_param->alt_tos_dscp = dscp_user;
398
cc_param->mask |= CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_TOS_DSCP;
399
update_cc = true;
400
}
401
}
402
403
if (cc_param->roce_dscp_user) {
404
dscp_user = (cc_param->roce_dscp_user & 0x3f);
405
if ((tc_rec->roce_dscp_bv & (1ul << dscp_user)) &&
406
(cc_param->tos_dscp != dscp_user)) {
407
cc_param->tos_dscp = dscp_user;
408
cc_param->mask |= CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP;
409
update_cc = true;
410
}
411
}
412
413
if (update_cc) {
414
rc = bnxt_qplib_modify_cc(&rdev->qplib_res, cc_param);
415
if (rc)
416
dev_err(rdev_to_dev(rdev), "Failed to apply cc settings\n");
417
}
418
}
419
420
static void bnxt_re_dcb_wq_task(struct work_struct *work)
421
{
422
struct bnxt_qplib_cc_param *cc_param;
423
struct bnxt_re_tc_rec *tc_rec;
424
struct bnxt_re_dev *rdev;
425
struct bnxt_re_dcb_work *dcb_work =
426
container_of(work, struct bnxt_re_dcb_work, work);
427
int rc;
428
429
rdev = dcb_work->rdev;
430
if (!rdev)
431
goto exit;
432
433
mutex_lock(&rdev->cc_lock);
434
435
cc_param = &rdev->cc_param;
436
rc = bnxt_qplib_query_cc_param(&rdev->qplib_res, cc_param);
437
if (rc) {
438
dev_err(rdev_to_dev(rdev), "Failed to query ccparam rc:%d", rc);
439
goto fail;
440
}
441
tc_rec = &rdev->tc_rec[0];
442
/*
443
* Upon the receival of DCB Async event:
444
* If roce_dscp or cnp_dscp or both (which user configured using configfs)
445
* is in the list, re-program the value using modify_roce_cc command
446
*/
447
bnxt_re_reconfigure_dscp(rdev);
448
449
cc_param->roce_pri = tc_rec->roce_prio;
450
if (cc_param->qp1_tos_dscp != cc_param->tos_dscp) {
451
cc_param->qp1_tos_dscp = cc_param->tos_dscp;
452
rc = bnxt_re_update_qp1_tos_dscp(rdev);
453
if (rc) {
454
dev_err(rdev_to_dev(rdev), "%s:Failed to modify QP1 rc:%d",
455
__func__, rc);
456
goto fail;
457
}
458
}
459
460
fail:
461
mutex_unlock(&rdev->cc_lock);
462
exit:
463
kfree(dcb_work);
464
}
465
466
static int bnxt_re_hwrm_dbr_pacing_broadcast_event(struct bnxt_re_dev *rdev)
467
{
468
struct hwrm_func_dbr_pacing_broadcast_event_output resp = {0};
469
struct hwrm_func_dbr_pacing_broadcast_event_input req = {0};
470
struct bnxt_en_dev *en_dev = rdev->en_dev;
471
struct bnxt_fw_msg fw_msg;
472
int rc;
473
474
memset(&fw_msg, 0, sizeof(fw_msg));
475
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
476
HWRM_FUNC_DBR_PACING_BROADCAST_EVENT, -1, -1);
477
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
478
sizeof(resp), BNXT_RE_HWRM_CMD_TIMEOUT(rdev));
479
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
480
if (rc) {
481
dev_dbg(rdev_to_dev(rdev),
482
"Failed to send dbr pacing broadcast event rc:%d", rc);
483
return rc;
484
}
485
return 0;
486
}
487
488
static int bnxt_re_hwrm_dbr_pacing_nqlist_query(struct bnxt_re_dev *rdev)
489
{
490
struct hwrm_func_dbr_pacing_nqlist_query_output resp = {0};
491
struct hwrm_func_dbr_pacing_nqlist_query_input req = {0};
492
struct bnxt_dbq_nq_list *nq_list = &rdev->nq_list;
493
struct bnxt_en_dev *en_dev = rdev->en_dev;
494
bool primary_found = false;
495
struct bnxt_fw_msg fw_msg;
496
struct bnxt_qplib_nq *nq;
497
int rc, i, j = 1;
498
u16 *nql_ptr;
499
500
nq = &rdev->nqr.nq[0];
501
502
memset(&fw_msg, 0, sizeof(fw_msg));
503
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
504
HWRM_FUNC_DBR_PACING_NQLIST_QUERY, -1, -1);
505
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
506
sizeof(resp), BNXT_RE_HWRM_CMD_TIMEOUT(rdev));
507
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
508
if (rc) {
509
dev_err(rdev_to_dev(rdev), "Failed to send dbr pacing nq list query rc:%d", rc);
510
return rc;
511
}
512
nq_list->num_nql_entries = le32_to_cpu(resp.num_nqs);
513
nql_ptr = &resp.nq_ring_id0;
514
/* populate the nq_list of the primary function with list received
515
* from FW. Fill the NQ IDs of secondary functions from index 1 to
516
* num_nql_entries - 1. Fill the nq_list->nq_id[0] with the
517
* nq_id of the primary pf
518
*/
519
for (i = 0; i < nq_list->num_nql_entries; i++) {
520
u16 nq_id = *nql_ptr;
521
522
dev_dbg(rdev_to_dev(rdev),
523
"nq_list->nq_id[%d] = %d\n", i, nq_id);
524
if (nq_id != nq->ring_id) {
525
nq_list->nq_id[j] = nq_id;
526
j++;
527
} else {
528
primary_found = true;
529
nq_list->nq_id[0] = nq->ring_id;
530
}
531
nql_ptr++;
532
}
533
if (primary_found)
534
bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 1);
535
536
return 0;
537
}
538
539
static void __wait_for_fifo_occupancy_below_th(struct bnxt_re_dev *rdev)
540
{
541
struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data;
542
u32 read_val, fifo_occup;
543
bool first_read = true;
544
545
/* loop shouldn't run infintely as the occupancy usually goes
546
* below pacing algo threshold as soon as pacing kicks in.
547
*/
548
while (1) {
549
read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_db_fifo_reg_off, 0);
550
fifo_occup = pacing_data->fifo_max_depth -
551
((read_val & pacing_data->fifo_room_mask) >>
552
pacing_data->fifo_room_shift);
553
/* Fifo occupancy cannot be greater the MAX FIFO depth */
554
if (fifo_occup > pacing_data->fifo_max_depth)
555
break;
556
557
if (first_read) {
558
bnxt_re_update_fifo_occup_slabs(rdev, fifo_occup);
559
first_read = false;
560
}
561
if (fifo_occup < pacing_data->pacing_th)
562
break;
563
}
564
}
565
566
static void bnxt_re_set_default_pacing_data(struct bnxt_re_dev *rdev)
567
{
568
struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data;
569
570
pacing_data->do_pacing = rdev->dbr_def_do_pacing;
571
pacing_data->pacing_th = rdev->pacing_algo_th;
572
pacing_data->alarm_th =
573
pacing_data->pacing_th * BNXT_RE_PACING_ALARM_TH_MULTIPLE(rdev->chip_ctx);
574
}
575
576
#define CAG_RING_MASK 0x7FF
577
#define CAG_RING_SHIFT 17
578
#define WATERMARK_MASK 0xFFF
579
#define WATERMARK_SHIFT 0
580
581
static bool bnxt_re_check_if_dbq_intr_triggered(struct bnxt_re_dev *rdev)
582
{
583
u32 read_val;
584
int j;
585
586
for (j = 0; j < 10; j++) {
587
read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, 0);
588
dev_dbg(rdev_to_dev(rdev), "AEQ ARM status = 0x%x\n",
589
read_val);
590
if (!read_val)
591
return true;
592
}
593
return false;
594
}
595
596
int bnxt_re_set_dbq_throttling_reg(struct bnxt_re_dev *rdev, u16 nq_id, u32 throttle)
597
{
598
u32 cag_ring_water_mark = 0, read_val;
599
u32 throttle_val;
600
601
/* Convert throttle percentage to value */
602
throttle_val = (rdev->qplib_res.pacing_data->fifo_max_depth * throttle) / 100;
603
604
if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) {
605
cag_ring_water_mark = (nq_id & CAG_RING_MASK) << CAG_RING_SHIFT |
606
(throttle_val & WATERMARK_MASK);
607
writel_fbsd(rdev->en_dev->softc, rdev->dbr_throttling_reg_off, 0, cag_ring_water_mark);
608
read_val = readl_fbsd(rdev->en_dev->softc , rdev->dbr_throttling_reg_off, 0);
609
dev_dbg(rdev_to_dev(rdev),
610
"%s: dbr_throttling_reg_off read_val = 0x%x\n",
611
__func__, read_val);
612
if (read_val != cag_ring_water_mark) {
613
dev_dbg(rdev_to_dev(rdev),
614
"nq_id = %d write_val=0x%x read_val=0x%x\n",
615
nq_id, cag_ring_water_mark, read_val);
616
return 1;
617
}
618
}
619
writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, 0, 1);
620
return 0;
621
}
622
623
static void bnxt_re_set_dbq_throttling_for_non_primary(struct bnxt_re_dev *rdev)
624
{
625
struct bnxt_dbq_nq_list *nq_list;
626
struct bnxt_qplib_nq *nq;
627
int i;
628
629
nq_list = &rdev->nq_list;
630
/* Run a loop for other Active functions if this is primary function */
631
if (bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) {
632
dev_dbg(rdev_to_dev(rdev), "%s: nq_list->num_nql_entries= %d\n",
633
__func__, nq_list->num_nql_entries);
634
nq = &rdev->nqr.nq[0];
635
for (i = nq_list->num_nql_entries - 1; i > 0; i--) {
636
u16 nq_id = nq_list->nq_id[i];
637
if (nq)
638
dev_dbg(rdev_to_dev(rdev),
639
"%s: nq_id = %d cur_fn_ring_id = %d\n",
640
__func__, nq_id, nq->ring_id);
641
if (bnxt_re_set_dbq_throttling_reg
642
(rdev, nq_id, 0))
643
break;
644
bnxt_re_check_if_dbq_intr_triggered(rdev);
645
}
646
}
647
}
648
649
static void bnxt_re_handle_dbr_nq_pacing_notification(struct bnxt_re_dev *rdev)
650
{
651
struct bnxt_qplib_nq *nq;
652
int rc = 0;
653
654
nq = &rdev->nqr.nq[0];
655
656
/* Query the NQ list*/
657
rc = bnxt_re_hwrm_dbr_pacing_nqlist_query(rdev);
658
if (rc) {
659
dev_err(rdev_to_dev(rdev),
660
"Failed to Query NQ list rc= %d", rc);
661
return;
662
}
663
/*Configure GRC access for Throttling and aeq_arm register */
664
writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28, 0,
665
rdev->chip_ctx->dbr_aeq_arm_reg & BNXT_GRC_BASE_MASK);
666
667
rdev->dbr_throttling_reg_off =
668
(rdev->chip_ctx->dbr_throttling_reg &
669
BNXT_GRC_OFFSET_MASK) + 0x8000;
670
rdev->dbr_aeq_arm_reg_off =
671
(rdev->chip_ctx->dbr_aeq_arm_reg &
672
BNXT_GRC_OFFSET_MASK) + 0x8000;
673
674
bnxt_re_set_dbq_throttling_reg(rdev, nq->ring_id, rdev->dbq_watermark);
675
}
676
677
static void bnxt_re_dbq_wq_task(struct work_struct *work)
678
{
679
struct bnxt_re_dbq_work *dbq_work =
680
container_of(work, struct bnxt_re_dbq_work, work);
681
struct bnxt_re_dev *rdev;
682
683
rdev = dbq_work->rdev;
684
685
if (!rdev)
686
goto exit;
687
switch (dbq_work->event) {
688
case BNXT_RE_DBQ_EVENT_SCHED:
689
dev_dbg(rdev_to_dev(rdev), "%s: Handle DBQ Pacing event\n",
690
__func__);
691
if (!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx))
692
bnxt_re_hwrm_dbr_pacing_broadcast_event(rdev);
693
else
694
bnxt_re_pacing_alert(rdev);
695
break;
696
case BNXT_RE_DBR_PACING_EVENT:
697
dev_dbg(rdev_to_dev(rdev), "%s: Sched interrupt/pacing worker\n",
698
__func__);
699
if (_is_chip_p7(rdev->chip_ctx))
700
bnxt_re_pacing_alert(rdev);
701
else if (!rdev->chip_ctx->modes.dbr_pacing_v0)
702
bnxt_re_hwrm_dbr_pacing_qcfg(rdev);
703
break;
704
case BNXT_RE_DBR_NQ_PACING_NOTIFICATION:
705
bnxt_re_handle_dbr_nq_pacing_notification(rdev);
706
/* Issue a broadcast event to notify other functions
707
* that primary changed
708
*/
709
bnxt_re_hwrm_dbr_pacing_broadcast_event(rdev);
710
break;
711
}
712
exit:
713
kfree(dbq_work);
714
}
715
716
static void bnxt_re_async_notifier(void *handle, struct hwrm_async_event_cmpl *cmpl)
717
{
718
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(handle);
719
struct bnxt_re_dcb_work *dcb_work;
720
struct bnxt_re_dbq_work *dbq_work;
721
struct bnxt_re_dev *rdev;
722
u16 event_id;
723
u32 data1;
724
u32 data2 = 0;
725
726
if (!cmpl) {
727
pr_err("Async event, bad completion\n");
728
return;
729
}
730
731
if (!en_info || !en_info->en_dev) {
732
pr_err("Async event, bad en_info or en_dev\n");
733
return;
734
}
735
rdev = en_info->rdev;
736
737
event_id = le16_to_cpu(cmpl->event_id);
738
data1 = le32_to_cpu(cmpl->event_data1);
739
data2 = le32_to_cpu(cmpl->event_data2);
740
741
if (!rdev || !rdev_to_dev(rdev)) {
742
dev_dbg(NULL, "Async event, bad rdev or netdev\n");
743
return;
744
}
745
746
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags) ||
747
!test_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags)) {
748
dev_dbg(NULL, "Async event, device already detached\n");
749
return;
750
}
751
if (data2 >= 0)
752
dev_dbg(rdev_to_dev(rdev), "Async event_id = %d data1 = %d data2 = %d",
753
event_id, data1, data2);
754
755
switch (event_id) {
756
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE:
757
/* Not handling the event in older FWs */
758
if (!is_qport_service_type_supported(rdev))
759
break;
760
if (!rdev->dcb_wq)
761
break;
762
dcb_work = kzalloc(sizeof(*dcb_work), GFP_ATOMIC);
763
if (!dcb_work)
764
break;
765
766
dcb_work->rdev = rdev;
767
memcpy(&dcb_work->cmpl, cmpl, sizeof(*cmpl));
768
INIT_WORK(&dcb_work->work, bnxt_re_dcb_wq_task);
769
queue_work(rdev->dcb_wq, &dcb_work->work);
770
break;
771
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY:
772
if (EVENT_DATA1_RESET_NOTIFY_FATAL(data1)) {
773
/* Set rcfw flag to control commands send to Bono */
774
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
775
/* Set bnxt_re flag to control commands send via L2 driver */
776
set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
777
wake_up_all(&rdev->rcfw.cmdq.waitq);
778
}
779
break;
780
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_THRESHOLD:
781
if (!rdev->dbr_pacing)
782
break;
783
dbq_work = kzalloc(sizeof(*dbq_work), GFP_ATOMIC);
784
if (!dbq_work)
785
goto unlock;
786
dbq_work->rdev = rdev;
787
dbq_work->event = BNXT_RE_DBR_PACING_EVENT;
788
INIT_WORK(&dbq_work->work, bnxt_re_dbq_wq_task);
789
queue_work(rdev->dbq_wq, &dbq_work->work);
790
rdev->dbr_sw_stats->dbq_int_recv++;
791
break;
792
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_NQ_UPDATE:
793
if (!rdev->dbr_pacing)
794
break;
795
796
dbq_work = kzalloc(sizeof(*dbq_work), GFP_ATOMIC);
797
if (!dbq_work)
798
goto unlock;
799
dbq_work->rdev = rdev;
800
dbq_work->event = BNXT_RE_DBR_NQ_PACING_NOTIFICATION;
801
INIT_WORK(&dbq_work->work, bnxt_re_dbq_wq_task);
802
queue_work(rdev->dbq_wq, &dbq_work->work);
803
break;
804
805
default:
806
break;
807
}
808
unlock:
809
return;
810
}
811
812
static void bnxt_re_db_fifo_check(struct work_struct *work)
813
{
814
struct bnxt_re_dev *rdev = container_of(work, struct bnxt_re_dev,
815
dbq_fifo_check_work);
816
struct bnxt_qplib_db_pacing_data *pacing_data;
817
u32 pacing_save;
818
819
if (!mutex_trylock(&rdev->dbq_lock))
820
return;
821
pacing_data = rdev->qplib_res.pacing_data;
822
pacing_save = rdev->do_pacing_save;
823
__wait_for_fifo_occupancy_below_th(rdev);
824
cancel_delayed_work_sync(&rdev->dbq_pacing_work);
825
if (rdev->dbr_recovery_on)
826
goto recovery_on;
827
if (pacing_save > rdev->dbr_def_do_pacing) {
828
/* Double the do_pacing value during the congestion */
829
pacing_save = pacing_save << 1;
830
} else {
831
/*
832
* when a new congestion is detected increase the do_pacing
833
* by 8 times. And also increase the pacing_th by 4 times. The
834
* reason to increase pacing_th is to give more space for the
835
* queue to oscillate down without getting empty, but also more
836
* room for the queue to increase without causing another alarm.
837
*/
838
pacing_save = pacing_save << 3;
839
pacing_data->pacing_th = rdev->pacing_algo_th * 4;
840
}
841
842
if (pacing_save > BNXT_RE_MAX_DBR_DO_PACING)
843
pacing_save = BNXT_RE_MAX_DBR_DO_PACING;
844
845
pacing_data->do_pacing = pacing_save;
846
rdev->do_pacing_save = pacing_data->do_pacing;
847
pacing_data->alarm_th =
848
pacing_data->pacing_th * BNXT_RE_PACING_ALARM_TH_MULTIPLE(rdev->chip_ctx);
849
recovery_on:
850
schedule_delayed_work(&rdev->dbq_pacing_work,
851
msecs_to_jiffies(rdev->dbq_pacing_time));
852
rdev->dbr_sw_stats->dbq_pacing_alerts++;
853
mutex_unlock(&rdev->dbq_lock);
854
}
855
856
static void bnxt_re_pacing_timer_exp(struct work_struct *work)
857
{
858
struct bnxt_re_dev *rdev = container_of(work, struct bnxt_re_dev,
859
dbq_pacing_work.work);
860
struct bnxt_qplib_db_pacing_data *pacing_data;
861
u32 read_val, fifo_occup;
862
struct bnxt_qplib_nq *nq;
863
864
if (!mutex_trylock(&rdev->dbq_lock))
865
return;
866
867
pacing_data = rdev->qplib_res.pacing_data;
868
read_val = readl_fbsd(rdev->en_dev->softc , rdev->dbr_db_fifo_reg_off, 0);
869
fifo_occup = pacing_data->fifo_max_depth -
870
((read_val & pacing_data->fifo_room_mask) >>
871
pacing_data->fifo_room_shift);
872
873
if (fifo_occup > pacing_data->pacing_th)
874
goto restart_timer;
875
876
/*
877
* Instead of immediately going back to the default do_pacing
878
* reduce it by 1/8 times and restart the timer.
879
*/
880
pacing_data->do_pacing = pacing_data->do_pacing - (pacing_data->do_pacing >> 3);
881
pacing_data->do_pacing = max_t(u32, rdev->dbr_def_do_pacing, pacing_data->do_pacing);
882
/*
883
* If the fifo_occup is less than the interrupt enable threshold
884
* enable the interrupt on the primary PF.
885
*/
886
if (rdev->dbq_int_disable && fifo_occup < rdev->pacing_en_int_th) {
887
if (bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) {
888
if (!rdev->chip_ctx->modes.dbr_pacing_v0) {
889
nq = &rdev->nqr.nq[0];
890
bnxt_re_set_dbq_throttling_reg(rdev, nq->ring_id,
891
rdev->dbq_watermark);
892
rdev->dbr_sw_stats->dbq_int_en++;
893
rdev->dbq_int_disable = false;
894
}
895
}
896
}
897
if (pacing_data->do_pacing <= rdev->dbr_def_do_pacing) {
898
bnxt_re_set_default_pacing_data(rdev);
899
rdev->dbr_sw_stats->dbq_pacing_complete++;
900
goto dbq_unlock;
901
}
902
restart_timer:
903
schedule_delayed_work(&rdev->dbq_pacing_work,
904
msecs_to_jiffies(rdev->dbq_pacing_time));
905
bnxt_re_update_do_pacing_slabs(rdev);
906
rdev->dbr_sw_stats->dbq_pacing_resched++;
907
dbq_unlock:
908
rdev->do_pacing_save = pacing_data->do_pacing;
909
mutex_unlock(&rdev->dbq_lock);
910
}
911
912
void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev)
913
{
914
struct bnxt_qplib_db_pacing_data *pacing_data;
915
916
if (!rdev->dbr_pacing)
917
return;
918
mutex_lock(&rdev->dbq_lock);
919
pacing_data = rdev->qplib_res.pacing_data;
920
921
/*
922
* Increase the alarm_th to max so that other user lib instances do not
923
* keep alerting the driver.
924
*/
925
pacing_data->alarm_th = pacing_data->fifo_max_depth;
926
pacing_data->do_pacing = BNXT_RE_MAX_DBR_DO_PACING;
927
cancel_work_sync(&rdev->dbq_fifo_check_work);
928
schedule_work(&rdev->dbq_fifo_check_work);
929
mutex_unlock(&rdev->dbq_lock);
930
}
931
932
void bnxt_re_schedule_dbq_event(struct bnxt_qplib_res *res)
933
{
934
struct bnxt_re_dbq_work *dbq_work;
935
struct bnxt_re_dev *rdev;
936
937
rdev = container_of(res, struct bnxt_re_dev, qplib_res);
938
939
atomic_set(&rdev->dbq_intr_running, 1);
940
941
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
942
goto exit;
943
/* Run the loop to send dbq event to other functions
944
* for newer FW
945
*/
946
if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx) &&
947
!rdev->chip_ctx->modes.dbr_pacing_v0)
948
bnxt_re_set_dbq_throttling_for_non_primary(rdev);
949
950
dbq_work = kzalloc(sizeof(*dbq_work), GFP_ATOMIC);
951
if (!dbq_work)
952
goto exit;
953
dbq_work->rdev = rdev;
954
dbq_work->event = BNXT_RE_DBQ_EVENT_SCHED;
955
INIT_WORK(&dbq_work->work, bnxt_re_dbq_wq_task);
956
queue_work(rdev->dbq_wq, &dbq_work->work);
957
rdev->dbr_sw_stats->dbq_int_recv++;
958
rdev->dbq_int_disable = true;
959
exit:
960
atomic_set(&rdev->dbq_intr_running, 0);
961
}
962
963
static void bnxt_re_free_msix(struct bnxt_re_dev *rdev)
964
{
965
struct bnxt_en_dev *en_dev = rdev->en_dev;
966
int rc;
967
968
rc = en_dev->en_ops->bnxt_free_msix(rdev->en_dev, BNXT_ROCE_ULP);
969
if (rc)
970
dev_err(rdev_to_dev(rdev), "netdev %p free_msix failed! rc = 0x%x",
971
rdev->netdev, rc);
972
}
973
974
static int bnxt_re_request_msix(struct bnxt_re_dev *rdev)
975
{
976
struct bnxt_en_dev *en_dev = rdev->en_dev;
977
int rc = 0, num_msix_want, num_msix_got;
978
struct bnxt_msix_entry *entry;
979
980
/*
981
* Request MSIx based on the function type. This is
982
* a temporory solution to enable max VFs when NPAR is
983
* enabled.
984
* TODO - change the scheme with an adapter specific check
985
* as the latest adapters can support more NQs. For now
986
* this change satisfy all adapter versions.
987
*/
988
989
if (rdev->is_virtfn)
990
num_msix_want = BNXT_RE_MAX_MSIX_VF;
991
else if (BNXT_EN_NPAR(en_dev))
992
num_msix_want = BNXT_RE_MAX_MSIX_NPAR_PF;
993
else if (_is_chip_gen_p5_p7(rdev->chip_ctx))
994
num_msix_want = rdev->num_msix_requested ?: BNXT_RE_MAX_MSIX_GEN_P5_PF;
995
else
996
num_msix_want = BNXT_RE_MAX_MSIX_PF;
997
998
/*
999
* Since MSIX vectors are used for both NQs and CREQ, we should try to
1000
* allocate num_online_cpus + 1 by taking into account the CREQ. This
1001
* leaves the number of MSIX vectors for NQs match the number of CPUs
1002
* and allows the system to be fully utilized
1003
*/
1004
num_msix_want = min_t(u32, num_msix_want, num_online_cpus() + 1);
1005
num_msix_want = min_t(u32, num_msix_want, BNXT_RE_MAX_MSIX);
1006
num_msix_want = max_t(u32, num_msix_want, BNXT_RE_MIN_MSIX);
1007
1008
entry = rdev->nqr.msix_entries;
1009
1010
num_msix_got = en_dev->en_ops->bnxt_request_msix(en_dev, BNXT_ROCE_ULP,
1011
entry, num_msix_want);
1012
if (num_msix_got < BNXT_RE_MIN_MSIX) {
1013
rc = -EINVAL;
1014
goto done;
1015
}
1016
if (num_msix_got != num_msix_want)
1017
dev_warn(rdev_to_dev(rdev),
1018
"bnxt_request_msix: wanted %d vectors, got %d\n",
1019
num_msix_want, num_msix_got);
1020
1021
rdev->nqr.num_msix = num_msix_got;
1022
return 0;
1023
done:
1024
if (num_msix_got)
1025
bnxt_re_free_msix(rdev);
1026
return rc;
1027
}
1028
1029
static int __wait_for_ib_unregister(struct bnxt_re_dev *rdev,
1030
struct bnxt_re_en_dev_info *en_info)
1031
{
1032
u64 timeout = 0;
1033
u32 cur_prod = 0, cur_cons = 0;
1034
int retry = 0, rc = 0, ret = 0;
1035
1036
cur_prod = rdev->rcfw.cmdq.hwq.prod;
1037
cur_cons = rdev->rcfw.cmdq.hwq.cons;
1038
timeout = msecs_to_jiffies(BNXT_RE_RECOVERY_IB_UNINIT_WAIT_TIME_MS);
1039
retry = BNXT_RE_RECOVERY_IB_UNINIT_WAIT_RETRY;
1040
/* During module exit, increase timeout ten-fold to 100 mins to wait
1041
* as long as possible for ib_unregister() to complete
1042
*/
1043
if (rdev->mod_exit)
1044
retry *= 10;
1045
do {
1046
/*
1047
* Since the caller of this function invokes with bnxt_re_mutex held,
1048
* release it to avoid holding a lock while in wait / sleep mode.
1049
*/
1050
mutex_unlock(&bnxt_re_mutex);
1051
rc = wait_event_timeout(en_info->waitq,
1052
en_info->ib_uninit_done,
1053
timeout);
1054
mutex_lock(&bnxt_re_mutex);
1055
1056
if (!bnxt_re_is_rdev_valid(rdev))
1057
break;
1058
1059
if (rc)
1060
break;
1061
1062
if (!RCFW_NO_FW_ACCESS(&rdev->rcfw)) {
1063
/* No need to check for cmdq stall during module exit,
1064
* wait for ib unregister to complete
1065
*/
1066
if (!rdev->mod_exit)
1067
ret = __check_cmdq_stall(&rdev->rcfw, &cur_prod, &cur_cons);
1068
if (ret || en_info->ib_uninit_done)
1069
break;
1070
}
1071
} while (retry--);
1072
1073
return rc;
1074
}
1075
1076
static int bnxt_re_handle_start(struct auxiliary_device *adev)
1077
{
1078
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(adev);
1079
struct bnxt_re_dev *rdev = NULL;
1080
struct ifnet *real_dev;
1081
struct bnxt_en_dev *en_dev;
1082
struct ifnet *netdev;
1083
int rc = 0;
1084
1085
if (!en_info || !en_info->en_dev) {
1086
pr_err("Start, bad en_info or en_dev\n");
1087
return -EINVAL;
1088
}
1089
netdev = en_info->en_dev->net;
1090
if (en_info->rdev) {
1091
dev_info(rdev_to_dev(en_info->rdev),
1092
"%s: Device is already added adev %p rdev: %p\n",
1093
__func__, adev, en_info->rdev);
1094
return 0;
1095
}
1096
1097
en_dev = en_info->en_dev;
1098
real_dev = rdma_vlan_dev_real_dev(netdev);
1099
if (!real_dev)
1100
real_dev = netdev;
1101
rc = bnxt_re_add_device(&rdev, real_dev,
1102
en_info->gsi_mode,
1103
BNXT_RE_POST_RECOVERY_INIT,
1104
en_info->num_msix_requested, adev);
1105
if (rc) {
1106
/* Add device failed. Unregister the device.
1107
* This has to be done explicitly as
1108
* bnxt_re_stop would not have unregistered
1109
*/
1110
rtnl_lock();
1111
en_dev->en_ops->bnxt_unregister_device(en_dev, BNXT_ROCE_ULP);
1112
rtnl_unlock();
1113
mutex_lock(&bnxt_re_dev_lock);
1114
gadd_dev_inprogress--;
1115
mutex_unlock(&bnxt_re_dev_lock);
1116
return rc;
1117
}
1118
rdev->adev = adev;
1119
rtnl_lock();
1120
bnxt_re_get_link_speed(rdev);
1121
rtnl_unlock();
1122
rc = bnxt_re_ib_init(rdev);
1123
if (rc) {
1124
dev_err(rdev_to_dev(rdev), "Failed ib_init\n");
1125
return rc;
1126
}
1127
bnxt_re_ib_init_2(rdev);
1128
1129
return rc;
1130
}
1131
1132
static void bnxt_re_stop(void *handle)
1133
{
1134
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(handle);
1135
struct ifnet *netdev;
1136
struct bnxt_re_dev *rdev;
1137
struct bnxt_en_dev *en_dev;
1138
int rc = 0;
1139
1140
rtnl_unlock();
1141
mutex_lock(&bnxt_re_mutex);
1142
if (!en_info || !en_info->en_dev) {
1143
pr_err("Stop, bad en_info or en_dev\n");
1144
goto exit;
1145
}
1146
netdev = en_info->en_dev->net;
1147
rdev = en_info->rdev;
1148
if (!rdev)
1149
goto exit;
1150
1151
if (!bnxt_re_is_rdev_valid(rdev))
1152
goto exit;
1153
1154
/*
1155
* Check if fw has undergone reset or is in a fatal condition.
1156
* If so, set flags so that no further commands are sent down to FW
1157
*/
1158
en_dev = rdev->en_dev;
1159
if (en_dev->en_state & BNXT_STATE_FW_FATAL_COND ||
1160
en_dev->en_state & BNXT_STATE_FW_RESET_DET) {
1161
/* Set rcfw flag to control commands send to Bono */
1162
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
1163
/* Set bnxt_re flag to control commands send via L2 driver */
1164
set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
1165
wake_up_all(&rdev->rcfw.cmdq.waitq);
1166
}
1167
1168
if (test_bit(BNXT_RE_FLAG_STOP_IN_PROGRESS, &rdev->flags))
1169
goto exit;
1170
set_bit(BNXT_RE_FLAG_STOP_IN_PROGRESS, &rdev->flags);
1171
1172
en_info->wqe_mode = rdev->chip_ctx->modes.wqe_mode;
1173
en_info->gsi_mode = rdev->gsi_ctx.gsi_qp_mode;
1174
en_info->num_msix_requested = rdev->num_msix_requested;
1175
en_info->ib_uninit_done = false;
1176
1177
if (rdev->dbr_pacing)
1178
bnxt_re_set_pacing_dev_state(rdev);
1179
1180
dev_info(rdev_to_dev(rdev), "%s: L2 driver notified to stop."
1181
"Attempting to stop and Dispatching event "
1182
"to inform the stack\n", __func__);
1183
init_waitqueue_head(&en_info->waitq);
1184
/* Schedule a work item to handle IB UNINIT for recovery */
1185
bnxt_re_schedule_work(rdev, NETDEV_UNREGISTER,
1186
NULL, netdev, rdev->adev);
1187
rc = __wait_for_ib_unregister(rdev, en_info);
1188
if (!bnxt_re_is_rdev_valid(rdev))
1189
goto exit;
1190
if (!rc) {
1191
dev_info(rdev_to_dev(rdev), "%s: Attempt to stop failed\n",
1192
__func__);
1193
bnxt_re_detach_err_device(rdev);
1194
goto exit;
1195
}
1196
bnxt_re_remove_device(rdev, BNXT_RE_PRE_RECOVERY_REMOVE, rdev->adev);
1197
exit:
1198
mutex_unlock(&bnxt_re_mutex);
1199
/* Take rtnl_lock before return, bnxt_re_stop is called with rtnl_lock */
1200
rtnl_lock();
1201
1202
return;
1203
}
1204
1205
static void bnxt_re_start(void *handle)
1206
{
1207
rtnl_unlock();
1208
mutex_lock(&bnxt_re_mutex);
1209
if (bnxt_re_handle_start((struct auxiliary_device *)handle))
1210
pr_err("Failed to start RoCE device");
1211
mutex_unlock(&bnxt_re_mutex);
1212
/* Take rtnl_lock before return, bnxt_re_start is called with rtnl_lock */
1213
rtnl_lock();
1214
return;
1215
}
1216
1217
static void bnxt_re_shutdown(void *p)
1218
{
1219
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(p);
1220
struct bnxt_re_dev *rdev;
1221
1222
if (!en_info) {
1223
pr_err("Shutdown, bad en_info\n");
1224
return;
1225
}
1226
rtnl_unlock();
1227
mutex_lock(&bnxt_re_mutex);
1228
rdev = en_info->rdev;
1229
if (!rdev || !bnxt_re_is_rdev_valid(rdev))
1230
goto exit;
1231
1232
/* rtnl_lock held by L2 before coming here */
1233
bnxt_re_stopqps_and_ib_uninit(rdev);
1234
bnxt_re_remove_device(rdev, BNXT_RE_COMPLETE_REMOVE, rdev->adev);
1235
exit:
1236
mutex_unlock(&bnxt_re_mutex);
1237
rtnl_lock();
1238
return;
1239
}
1240
1241
static void bnxt_re_stop_irq(void *handle)
1242
{
1243
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(handle);
1244
struct bnxt_qplib_rcfw *rcfw = NULL;
1245
struct bnxt_re_dev *rdev;
1246
struct bnxt_qplib_nq *nq;
1247
int indx;
1248
1249
if (!en_info) {
1250
pr_err("Stop irq, bad en_info\n");
1251
return;
1252
}
1253
rdev = en_info->rdev;
1254
1255
if (!rdev)
1256
return;
1257
1258
rcfw = &rdev->rcfw;
1259
for (indx = 0; indx < rdev->nqr.max_init; indx++) {
1260
nq = &rdev->nqr.nq[indx];
1261
mutex_lock(&nq->lock);
1262
bnxt_qplib_nq_stop_irq(nq, false);
1263
mutex_unlock(&nq->lock);
1264
}
1265
1266
if (test_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags))
1267
bnxt_qplib_rcfw_stop_irq(rcfw, false);
1268
}
1269
1270
static void bnxt_re_start_irq(void *handle, struct bnxt_msix_entry *ent)
1271
{
1272
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(handle);
1273
struct bnxt_msix_entry *msix_ent = NULL;
1274
struct bnxt_qplib_rcfw *rcfw = NULL;
1275
struct bnxt_re_dev *rdev;
1276
struct bnxt_qplib_nq *nq;
1277
int indx, rc, vec;
1278
1279
if (!en_info) {
1280
pr_err("Start irq, bad en_info\n");
1281
return;
1282
}
1283
rdev = en_info->rdev;
1284
if (!rdev)
1285
return;
1286
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
1287
return;
1288
msix_ent = rdev->nqr.msix_entries;
1289
rcfw = &rdev->rcfw;
1290
1291
if (!ent) {
1292
/* Not setting the f/w timeout bit in rcfw.
1293
* During the driver unload the first command
1294
* to f/w will timeout and that will set the
1295
* timeout bit.
1296
*/
1297
dev_err(rdev_to_dev(rdev), "Failed to re-start IRQs\n");
1298
return;
1299
}
1300
1301
/* Vectors may change after restart, so update with new vectors
1302
* in device structure.
1303
*/
1304
for (indx = 0; indx < rdev->nqr.num_msix; indx++)
1305
rdev->nqr.msix_entries[indx].vector = ent[indx].vector;
1306
1307
if (test_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags)) {
1308
rc = bnxt_qplib_rcfw_start_irq(rcfw, msix_ent[BNXT_RE_AEQ_IDX].vector,
1309
false);
1310
if (rc) {
1311
dev_warn(rdev_to_dev(rdev),
1312
"Failed to reinit CREQ\n");
1313
return;
1314
}
1315
}
1316
for (indx = 0 ; indx < rdev->nqr.max_init; indx++) {
1317
nq = &rdev->nqr.nq[indx];
1318
vec = indx + 1;
1319
rc = bnxt_qplib_nq_start_irq(nq, indx, msix_ent[vec].vector,
1320
false);
1321
if (rc) {
1322
dev_warn(rdev_to_dev(rdev),
1323
"Failed to reinit NQ index %d\n", indx);
1324
return;
1325
}
1326
}
1327
}
1328
1329
/*
1330
* Except for ulp_async_notifier, the remaining ulp_ops
1331
* below are called with rtnl_lock held
1332
*/
1333
static struct bnxt_ulp_ops bnxt_re_ulp_ops = {
1334
.ulp_async_notifier = bnxt_re_async_notifier,
1335
.ulp_stop = bnxt_re_stop,
1336
.ulp_start = bnxt_re_start,
1337
.ulp_shutdown = bnxt_re_shutdown,
1338
.ulp_irq_stop = bnxt_re_stop_irq,
1339
.ulp_irq_restart = bnxt_re_start_irq,
1340
};
1341
1342
static inline const char *bnxt_re_netevent(unsigned long event)
1343
{
1344
BNXT_RE_NETDEV_EVENT(event, NETDEV_UP);
1345
BNXT_RE_NETDEV_EVENT(event, NETDEV_DOWN);
1346
BNXT_RE_NETDEV_EVENT(event, NETDEV_CHANGE);
1347
BNXT_RE_NETDEV_EVENT(event, NETDEV_REGISTER);
1348
BNXT_RE_NETDEV_EVENT(event, NETDEV_UNREGISTER);
1349
BNXT_RE_NETDEV_EVENT(event, NETDEV_CHANGEADDR);
1350
return "Unknown";
1351
}
1352
1353
/* RoCE -> Net driver */
1354
1355
/* Driver registration routines used to let the networking driver (bnxt_en)
1356
* to know that the RoCE driver is now installed */
1357
static void bnxt_re_unregister_netdev(struct bnxt_re_dev *rdev)
1358
{
1359
struct bnxt_en_dev *en_dev = rdev->en_dev;
1360
int rc;
1361
1362
rtnl_lock();
1363
rc = en_dev->en_ops->bnxt_unregister_device(rdev->en_dev,
1364
BNXT_ROCE_ULP);
1365
rtnl_unlock();
1366
if (rc)
1367
dev_err(rdev_to_dev(rdev), "netdev %p unregister failed! rc = 0x%x",
1368
rdev->en_dev->net, rc);
1369
1370
clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
1371
}
1372
1373
static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev)
1374
{
1375
struct bnxt_en_dev *en_dev = rdev->en_dev;
1376
int rc = 0;
1377
1378
rtnl_lock();
1379
rc = en_dev->en_ops->bnxt_register_device(en_dev,
1380
BNXT_ROCE_ULP,
1381
&bnxt_re_ulp_ops,
1382
rdev->adev);
1383
rtnl_unlock();
1384
if (rc) {
1385
dev_err(rdev_to_dev(rdev), "netdev %p register failed! rc = 0x%x",
1386
rdev->netdev, rc);
1387
return rc;
1388
}
1389
1390
return rc;
1391
}
1392
1393
static void bnxt_re_set_db_offset(struct bnxt_re_dev *rdev)
1394
{
1395
struct bnxt_qplib_chip_ctx *cctx;
1396
struct bnxt_en_dev *en_dev;
1397
struct bnxt_qplib_res *res;
1398
u32 l2db_len = 0;
1399
u32 offset = 0;
1400
u32 barlen;
1401
int rc;
1402
1403
res = &rdev->qplib_res;
1404
en_dev = rdev->en_dev;
1405
cctx = rdev->chip_ctx;
1406
1407
/* Issue qcfg */
1408
rc = bnxt_re_hwrm_qcfg(rdev, &l2db_len, &offset);
1409
if (rc)
1410
dev_info(rdev_to_dev(rdev),
1411
"Couldn't get DB bar size, Low latency framework is disabled\n");
1412
/* set register offsets for both UC and WC */
1413
if (_is_chip_p7(cctx)) {
1414
res->dpi_tbl.ucreg.offset = en_dev->l2_db_offset;
1415
res->dpi_tbl.wcreg.offset = en_dev->l2_db_size;
1416
} else {
1417
res->dpi_tbl.ucreg.offset = res->is_vf ? BNXT_QPLIB_DBR_VF_DB_OFFSET :
1418
BNXT_QPLIB_DBR_PF_DB_OFFSET;
1419
res->dpi_tbl.wcreg.offset = res->dpi_tbl.ucreg.offset;
1420
}
1421
1422
/* If WC mapping is disabled by L2 driver then en_dev->l2_db_size
1423
* is equal to the DB-Bar actual size. This indicates that L2
1424
* is mapping entire bar as UC-. RoCE driver can't enable WC mapping
1425
* in such cases and DB-push will be disabled.
1426
*/
1427
barlen = pci_resource_len(res->pdev, RCFW_DBR_PCI_BAR_REGION);
1428
if (cctx->modes.db_push && l2db_len && en_dev->l2_db_size != barlen) {
1429
res->dpi_tbl.wcreg.offset = en_dev->l2_db_size;
1430
dev_info(rdev_to_dev(rdev),
1431
"Low latency framework is enabled\n");
1432
}
1433
1434
return;
1435
}
1436
1437
static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev)
1438
{
1439
struct bnxt_qplib_chip_ctx *cctx;
1440
struct bnxt_en_dev *en_dev;
1441
1442
en_dev = rdev->en_dev;
1443
cctx = rdev->chip_ctx;
1444
cctx->modes.wqe_mode = _is_chip_p7(rdev->chip_ctx) ?
1445
BNXT_QPLIB_WQE_MODE_VARIABLE : BNXT_QPLIB_WQE_MODE_STATIC;
1446
cctx->modes.te_bypass = false;
1447
if (bnxt_re_hwrm_qcaps(rdev))
1448
dev_err(rdev_to_dev(rdev),
1449
"Failed to query hwrm qcaps\n");
1450
/*
1451
* TODO: Need a better mechanism for spreading of the
1452
* 512 extended PPP pages in the presence of VF and
1453
* NPAR, until then not enabling push
1454
*/
1455
if (_is_chip_p7(rdev->chip_ctx) && cctx->modes.db_push) {
1456
if (rdev->is_virtfn || BNXT_EN_NPAR(en_dev))
1457
cctx->modes.db_push = false;
1458
}
1459
1460
rdev->roce_mode = en_dev->flags & BNXT_EN_FLAG_ROCE_CAP;
1461
dev_dbg(rdev_to_dev(rdev),
1462
"RoCE is supported on the device - caps:0x%x",
1463
rdev->roce_mode);
1464
if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
1465
rdev->roce_mode = BNXT_RE_FLAG_ROCEV2_CAP;
1466
cctx->hw_stats_size = en_dev->hw_ring_stats_size;
1467
}
1468
1469
static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev)
1470
{
1471
struct bnxt_qplib_chip_ctx *chip_ctx;
1472
struct bnxt_qplib_res *res;
1473
1474
if (!rdev->chip_ctx)
1475
return;
1476
1477
res = &rdev->qplib_res;
1478
bnxt_qplib_unmap_db_bar(res);
1479
1480
kfree(res->hctx);
1481
res->rcfw = NULL;
1482
kfree(rdev->dev_attr);
1483
rdev->dev_attr = NULL;
1484
1485
chip_ctx = rdev->chip_ctx;
1486
rdev->chip_ctx = NULL;
1487
res->cctx = NULL;
1488
res->hctx = NULL;
1489
res->pdev = NULL;
1490
res->netdev = NULL;
1491
kfree(chip_ctx);
1492
}
1493
1494
static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev)
1495
{
1496
struct bnxt_qplib_chip_ctx *chip_ctx;
1497
struct bnxt_en_dev *en_dev;
1498
int rc;
1499
1500
en_dev = rdev->en_dev;
1501
/* Supply pci device to qplib */
1502
rdev->qplib_res.pdev = en_dev->pdev;
1503
rdev->qplib_res.netdev = rdev->netdev;
1504
rdev->qplib_res.en_dev = en_dev;
1505
1506
chip_ctx = kzalloc(sizeof(*chip_ctx), GFP_KERNEL);
1507
if (!chip_ctx)
1508
return -ENOMEM;
1509
rdev->chip_ctx = chip_ctx;
1510
rdev->qplib_res.cctx = chip_ctx;
1511
rc = bnxt_re_query_hwrm_intf_version(rdev);
1512
if (rc)
1513
goto fail;
1514
rdev->dev_attr = kzalloc(sizeof(*rdev->dev_attr), GFP_KERNEL);
1515
if (!rdev->dev_attr) {
1516
rc = -ENOMEM;
1517
goto fail;
1518
}
1519
rdev->qplib_res.dattr = rdev->dev_attr;
1520
rdev->qplib_res.rcfw = &rdev->rcfw;
1521
rdev->qplib_res.is_vf = rdev->is_virtfn;
1522
1523
rdev->qplib_res.hctx = kzalloc(sizeof(*rdev->qplib_res.hctx),
1524
GFP_KERNEL);
1525
if (!rdev->qplib_res.hctx) {
1526
rc = -ENOMEM;
1527
goto fail;
1528
}
1529
bnxt_re_set_drv_mode(rdev);
1530
1531
bnxt_re_set_db_offset(rdev);
1532
rc = bnxt_qplib_map_db_bar(&rdev->qplib_res);
1533
if (rc)
1534
goto fail;
1535
1536
rc = bnxt_qplib_enable_atomic_ops_to_root(en_dev->pdev);
1537
if (rc)
1538
dev_dbg(rdev_to_dev(rdev),
1539
"platform doesn't support global atomics");
1540
1541
return 0;
1542
fail:
1543
kfree(rdev->chip_ctx);
1544
rdev->chip_ctx = NULL;
1545
1546
kfree(rdev->dev_attr);
1547
rdev->dev_attr = NULL;
1548
1549
kfree(rdev->qplib_res.hctx);
1550
rdev->qplib_res.hctx = NULL;
1551
return rc;
1552
}
1553
1554
static u16 bnxt_re_get_rtype(struct bnxt_re_dev *rdev) {
1555
return _is_chip_gen_p5_p7(rdev->chip_ctx) ?
1556
HWRM_RING_ALLOC_INPUT_RING_TYPE_NQ :
1557
HWRM_RING_ALLOC_INPUT_RING_TYPE_ROCE_CMPL;
1558
}
1559
1560
static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev, u16 fw_ring_id)
1561
{
1562
int rc = -EINVAL;
1563
struct hwrm_ring_free_input req = {0};
1564
struct hwrm_ring_free_output resp;
1565
struct bnxt_en_dev *en_dev = rdev->en_dev;
1566
struct bnxt_fw_msg fw_msg;
1567
1568
if (!en_dev)
1569
return rc;
1570
1571
/* To avoid unnecessary error messages during recovery.
1572
* HW is anyway in error state. So dont send down the command */
1573
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
1574
return 0;
1575
1576
/* allocation had failed, no need to issue hwrm */
1577
if (fw_ring_id == 0xffff)
1578
return 0;
1579
1580
memset(&fw_msg, 0, sizeof(fw_msg));
1581
1582
bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_FREE, -1, -1);
1583
req.ring_type = bnxt_re_get_rtype(rdev);
1584
req.ring_id = cpu_to_le16(fw_ring_id);
1585
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1586
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1587
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1588
if (rc) {
1589
dev_err(rdev_to_dev(rdev),
1590
"Failed to free HW ring with rc = 0x%x", rc);
1591
return rc;
1592
}
1593
dev_dbg(rdev_to_dev(rdev), "HW ring freed with id = 0x%x\n",
1594
fw_ring_id);
1595
1596
return rc;
1597
}
1598
1599
static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev,
1600
struct bnxt_re_ring_attr *ring_attr,
1601
u16 *fw_ring_id)
1602
{
1603
int rc = -EINVAL;
1604
struct hwrm_ring_alloc_input req = {0};
1605
struct hwrm_ring_alloc_output resp;
1606
struct bnxt_en_dev *en_dev = rdev->en_dev;
1607
struct bnxt_fw_msg fw_msg;
1608
1609
if (!en_dev)
1610
return rc;
1611
1612
memset(&fw_msg, 0, sizeof(fw_msg));
1613
bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_ALLOC, -1, -1);
1614
req.flags = cpu_to_le16(ring_attr->flags);
1615
req.enables = 0;
1616
req.page_tbl_addr = cpu_to_le64(ring_attr->dma_arr[0]);
1617
if (ring_attr->pages > 1) {
1618
/* Page size is in log2 units */
1619
req.page_size = BNXT_PAGE_SHIFT;
1620
req.page_tbl_depth = 1;
1621
} else {
1622
req.page_size = 4;
1623
req.page_tbl_depth = 0;
1624
}
1625
1626
req.fbo = 0;
1627
/* Association of ring index with doorbell index and MSIX number */
1628
req.logical_id = cpu_to_le16(ring_attr->lrid);
1629
req.length = cpu_to_le32(ring_attr->depth + 1);
1630
req.ring_type = ring_attr->type;
1631
req.int_mode = ring_attr->mode;
1632
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1633
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1634
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1635
if (rc) {
1636
dev_err(rdev_to_dev(rdev),
1637
"Failed to allocate HW ring with rc = 0x%x", rc);
1638
return rc;
1639
}
1640
*fw_ring_id = le16_to_cpu(resp.ring_id);
1641
dev_dbg(rdev_to_dev(rdev),
1642
"HW ring allocated with id = 0x%x at slot 0x%x",
1643
resp.ring_id, ring_attr->lrid);
1644
1645
return rc;
1646
}
1647
1648
static int bnxt_re_net_stats_ctx_free(struct bnxt_re_dev *rdev,
1649
u32 fw_stats_ctx_id, u16 tid)
1650
{
1651
struct bnxt_en_dev *en_dev = rdev->en_dev;
1652
struct hwrm_stat_ctx_free_input req = {0};
1653
struct hwrm_stat_ctx_free_output resp;
1654
struct bnxt_fw_msg fw_msg;
1655
int rc = -EINVAL;
1656
1657
if (!en_dev)
1658
return rc;
1659
1660
/* To avoid unnecessary error messages during recovery.
1661
* HW is anyway in error state. So dont send down the command */
1662
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
1663
return 0;
1664
memset(&fw_msg, 0, sizeof(fw_msg));
1665
bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_STAT_CTX_FREE, -1, tid);
1666
req.stat_ctx_id = cpu_to_le32(fw_stats_ctx_id);
1667
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1668
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1669
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1670
if (rc) {
1671
dev_err(rdev_to_dev(rdev),
1672
"Failed to free HW stats ctx with rc = 0x%x", rc);
1673
return rc;
1674
}
1675
dev_dbg(rdev_to_dev(rdev),
1676
"HW stats ctx freed with id = 0x%x", fw_stats_ctx_id);
1677
1678
return rc;
1679
}
1680
1681
static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev, u16 tid)
1682
{
1683
struct hwrm_stat_ctx_alloc_output resp = {};
1684
struct hwrm_stat_ctx_alloc_input req = {};
1685
struct bnxt_en_dev *en_dev = rdev->en_dev;
1686
struct bnxt_qplib_stats *stat;
1687
struct bnxt_qplib_ctx *hctx;
1688
struct bnxt_fw_msg fw_msg;
1689
int rc = 0;
1690
1691
hctx = rdev->qplib_res.hctx;
1692
stat = (tid == 0xffff) ? &hctx->stats : &hctx->stats2;
1693
stat->fw_id = INVALID_STATS_CTX_ID;
1694
1695
if (!en_dev)
1696
return -EINVAL;
1697
1698
memset(&fw_msg, 0, sizeof(fw_msg));
1699
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
1700
HWRM_STAT_CTX_ALLOC, -1, tid);
1701
req.update_period_ms = cpu_to_le32(1000);
1702
req.stats_dma_length = rdev->chip_ctx->hw_stats_size;
1703
req.stats_dma_addr = cpu_to_le64(stat->dma_map);
1704
req.stat_ctx_flags = HWRM_STAT_CTX_ALLOC_INPUT_STAT_CTX_FLAGS_ROCE;
1705
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1706
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1707
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1708
if (rc) {
1709
dev_err(rdev_to_dev(rdev),
1710
"Failed to allocate HW stats ctx, rc = 0x%x", rc);
1711
return rc;
1712
}
1713
stat->fw_id = le32_to_cpu(resp.stat_ctx_id);
1714
dev_dbg(rdev_to_dev(rdev), "HW stats ctx allocated with id = 0x%x",
1715
stat->fw_id);
1716
1717
return rc;
1718
}
1719
1720
static void bnxt_re_net_unregister_async_event(struct bnxt_re_dev *rdev)
1721
{
1722
const struct bnxt_en_ops *en_ops;
1723
1724
if (rdev->is_virtfn ||
1725
test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
1726
return;
1727
1728
memset(rdev->event_bitmap, 0, sizeof(rdev->event_bitmap));
1729
en_ops = rdev->en_dev->en_ops;
1730
if (en_ops->bnxt_register_fw_async_events
1731
(rdev->en_dev, BNXT_ROCE_ULP,
1732
(unsigned long *)rdev->event_bitmap,
1733
HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_NQ_UPDATE))
1734
dev_err(rdev_to_dev(rdev),
1735
"Failed to unregister async event");
1736
}
1737
1738
static void bnxt_re_net_register_async_event(struct bnxt_re_dev *rdev)
1739
{
1740
const struct bnxt_en_ops *en_ops;
1741
1742
if (rdev->is_virtfn)
1743
return;
1744
1745
rdev->event_bitmap[0] |=
1746
BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE) |
1747
BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY);
1748
1749
rdev->event_bitmap[2] |=
1750
BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ERROR_REPORT - 64);
1751
rdev->event_bitmap[2] |=
1752
BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_THRESHOLD - 64) |
1753
BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_NQ_UPDATE - 64);
1754
en_ops = rdev->en_dev->en_ops;
1755
if (en_ops->bnxt_register_fw_async_events
1756
(rdev->en_dev, BNXT_ROCE_ULP,
1757
(unsigned long *)rdev->event_bitmap,
1758
HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_NQ_UPDATE))
1759
dev_err(rdev_to_dev(rdev),
1760
"Failed to reg Async event");
1761
}
1762
1763
static int bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev)
1764
{
1765
struct bnxt_en_dev *en_dev = rdev->en_dev;
1766
struct hwrm_ver_get_output resp = {0};
1767
struct hwrm_ver_get_input req = {0};
1768
struct bnxt_qplib_chip_ctx *cctx;
1769
struct bnxt_fw_msg fw_msg;
1770
int rc = 0;
1771
1772
memset(&fw_msg, 0, sizeof(fw_msg));
1773
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
1774
HWRM_VER_GET, -1, -1);
1775
req.hwrm_intf_maj = HWRM_VERSION_MAJOR;
1776
req.hwrm_intf_min = HWRM_VERSION_MINOR;
1777
req.hwrm_intf_upd = HWRM_VERSION_UPDATE;
1778
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1779
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1780
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1781
if (rc) {
1782
dev_err(rdev_to_dev(rdev),
1783
"Failed to query HW version, rc = 0x%x", rc);
1784
return rc;
1785
}
1786
cctx = rdev->chip_ctx;
1787
cctx->hwrm_intf_ver = (u64) le16_to_cpu(resp.hwrm_intf_major) << 48 |
1788
(u64) le16_to_cpu(resp.hwrm_intf_minor) << 32 |
1789
(u64) le16_to_cpu(resp.hwrm_intf_build) << 16 |
1790
le16_to_cpu(resp.hwrm_intf_patch);
1791
1792
cctx->hwrm_cmd_max_timeout = le16_to_cpu(resp.max_req_timeout);
1793
1794
if (!cctx->hwrm_cmd_max_timeout)
1795
cctx->hwrm_cmd_max_timeout = RCFW_FW_STALL_MAX_TIMEOUT;
1796
1797
cctx->chip_num = le16_to_cpu(resp.chip_num);
1798
cctx->chip_rev = resp.chip_rev;
1799
cctx->chip_metal = resp.chip_metal;
1800
return 0;
1801
}
1802
1803
/* Query device config using common hwrm */
1804
static int bnxt_re_hwrm_qcfg(struct bnxt_re_dev *rdev, u32 *db_len,
1805
u32 *offset)
1806
{
1807
struct bnxt_en_dev *en_dev = rdev->en_dev;
1808
struct hwrm_func_qcfg_output resp = {0};
1809
struct hwrm_func_qcfg_input req = {0};
1810
struct bnxt_fw_msg fw_msg;
1811
int rc;
1812
1813
memset(&fw_msg, 0, sizeof(fw_msg));
1814
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
1815
HWRM_FUNC_QCFG, -1, -1);
1816
req.fid = cpu_to_le16(0xffff);
1817
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1818
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1819
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1820
if (rc) {
1821
dev_err(rdev_to_dev(rdev),
1822
"Failed to query config, rc = %#x", rc);
1823
return rc;
1824
}
1825
1826
*db_len = PAGE_ALIGN(le16_to_cpu(resp.l2_doorbell_bar_size_kb) * 1024);
1827
*offset = PAGE_ALIGN(le16_to_cpu(resp.legacy_l2_db_size_kb) * 1024);
1828
return 0;
1829
}
1830
1831
/* Query function capabilities using common hwrm */
1832
int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev)
1833
{
1834
struct bnxt_en_dev *en_dev = rdev->en_dev;
1835
struct hwrm_func_qcaps_output resp = {0};
1836
struct hwrm_func_qcaps_input req = {0};
1837
struct bnxt_qplib_chip_ctx *cctx;
1838
struct bnxt_fw_msg fw_msg;
1839
u8 push_enable = false;
1840
int rc;
1841
1842
cctx = rdev->chip_ctx;
1843
memset(&fw_msg, 0, sizeof(fw_msg));
1844
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
1845
HWRM_FUNC_QCAPS, -1, -1);
1846
req.fid = cpu_to_le16(0xffff);
1847
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1848
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
1849
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1850
if (rc) {
1851
dev_err(rdev_to_dev(rdev),
1852
"Failed to query capabilities, rc = %#x", rc);
1853
return rc;
1854
}
1855
if (_is_chip_p7(rdev->chip_ctx))
1856
push_enable =
1857
(resp.flags_ext &
1858
HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_PPP_PUSH_MODE_SUPPORTED) ?
1859
true : false;
1860
else
1861
push_enable =
1862
(resp.flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_WCB_PUSH_MODE) ?
1863
true : false;
1864
cctx->modes.db_push = push_enable;
1865
1866
cctx->modes.dbr_pacing =
1867
resp.flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_DBR_PACING_SUPPORTED ?
1868
true : false;
1869
cctx->modes.dbr_pacing_ext =
1870
resp.flags_ext2 &
1871
HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_DBR_PACING_EXT_SUPPORTED ?
1872
true : false;
1873
cctx->modes.dbr_drop_recov =
1874
(resp.flags_ext2 &
1875
HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_SW_DBR_DROP_RECOVERY_SUPPORTED) ?
1876
true : false;
1877
cctx->modes.dbr_pacing_v0 =
1878
(resp.flags_ext2 &
1879
HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_DBR_PACING_V0_SUPPORTED) ?
1880
true : false;
1881
dev_dbg(rdev_to_dev(rdev),
1882
"%s: cctx->modes.dbr_pacing = %d cctx->modes.dbr_pacing_ext = %d, dbr_drop_recov %d\n",
1883
__func__, cctx->modes.dbr_pacing, cctx->modes.dbr_pacing_ext, cctx->modes.dbr_drop_recov);
1884
1885
return 0;
1886
}
1887
1888
static int bnxt_re_hwrm_dbr_pacing_qcfg(struct bnxt_re_dev *rdev)
1889
{
1890
struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data;
1891
struct hwrm_func_dbr_pacing_qcfg_output resp = {0};
1892
struct hwrm_func_dbr_pacing_qcfg_input req = {0};
1893
struct bnxt_en_dev *en_dev = rdev->en_dev;
1894
struct bnxt_qplib_chip_ctx *cctx;
1895
struct bnxt_fw_msg fw_msg;
1896
u32 primary_nq_id;
1897
int rc;
1898
1899
cctx = rdev->chip_ctx;
1900
memset(&fw_msg, 0, sizeof(fw_msg));
1901
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
1902
HWRM_FUNC_DBR_PACING_QCFG, -1, -1);
1903
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1904
sizeof(resp), BNXT_RE_HWRM_CMD_TIMEOUT(rdev));
1905
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1906
if (rc) {
1907
dev_dbg(rdev_to_dev(rdev),
1908
"Failed to query dbr pacing config, rc = %#x", rc);
1909
return rc;
1910
}
1911
1912
primary_nq_id = le32_to_cpu(resp.primary_nq_id);
1913
if (primary_nq_id == 0xffffffff &&
1914
!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) {
1915
dev_err(rdev_to_dev(rdev), "%s:%d Invoke bnxt_qplib_dbr_pacing_set_primary_pf with 1\n",
1916
__func__, __LINE__);
1917
bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 1);
1918
}
1919
1920
if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) {
1921
struct bnxt_qplib_nq *nq;
1922
1923
nq = &rdev->nqr.nq[0];
1924
/* Reset the primary capability */
1925
if (nq->ring_id != primary_nq_id)
1926
bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 0);
1927
}
1928
1929
if ((resp.dbr_stat_db_fifo_reg &
1930
HWRM_FUNC_DBR_PACING_QCFG_OUTPUT_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK) ==
1931
HWRM_FUNC_DBR_PACING_QCFG_OUTPUT_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_GRC)
1932
cctx->dbr_stat_db_fifo =
1933
resp.dbr_stat_db_fifo_reg &
1934
~HWRM_FUNC_DBR_PACING_QCFG_OUTPUT_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK;
1935
1936
if ((resp.dbr_throttling_aeq_arm_reg &
1937
HWRM_FUNC_DBR_PACING_QCFG_OUTPUT_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_MASK)
1938
== HWRM_FUNC_DBR_PACING_QCFG_OUTPUT_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_GRC) {
1939
cctx->dbr_aeq_arm_reg = resp.dbr_throttling_aeq_arm_reg &
1940
~HWRM_FUNC_DBR_PACING_QCFG_OUTPUT_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK;
1941
cctx->dbr_throttling_reg = cctx->dbr_aeq_arm_reg - 4;
1942
}
1943
pacing_data->fifo_max_depth = le32_to_cpu(resp.dbr_stat_db_max_fifo_depth);
1944
if (!pacing_data->fifo_max_depth)
1945
pacing_data->fifo_max_depth = BNXT_RE_MAX_FIFO_DEPTH(cctx);
1946
pacing_data->fifo_room_mask = le32_to_cpu(resp.dbr_stat_db_fifo_reg_fifo_room_mask);
1947
pacing_data->fifo_room_shift = resp.dbr_stat_db_fifo_reg_fifo_room_shift;
1948
dev_dbg(rdev_to_dev(rdev),
1949
"%s: nq:0x%x primary_pf:%d db_fifo:0x%x aeq_arm:0x%x i"
1950
"fifo_max_depth 0x%x , resp.dbr_stat_db_max_fifo_depth 0x%x);\n",
1951
__func__, resp.primary_nq_id, cctx->modes.dbr_primary_pf,
1952
cctx->dbr_stat_db_fifo, cctx->dbr_aeq_arm_reg,
1953
pacing_data->fifo_max_depth,
1954
le32_to_cpu(resp.dbr_stat_db_max_fifo_depth));
1955
return 0;
1956
}
1957
1958
static int bnxt_re_hwrm_dbr_pacing_cfg(struct bnxt_re_dev *rdev, bool enable)
1959
{
1960
struct hwrm_func_dbr_pacing_cfg_output resp = {0};
1961
struct hwrm_func_dbr_pacing_cfg_input req = {0};
1962
struct bnxt_en_dev *en_dev = rdev->en_dev;
1963
struct bnxt_fw_msg fw_msg;
1964
int rc;
1965
1966
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
1967
return 0;
1968
1969
memset(&fw_msg, 0, sizeof(fw_msg));
1970
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
1971
HWRM_FUNC_DBR_PACING_CFG, -1, -1);
1972
if (enable) {
1973
req.flags = HWRM_FUNC_DBR_PACING_CFG_INPUT_FLAGS_DBR_NQ_EVENT_ENABLE;
1974
req.enables =
1975
cpu_to_le32(HWRM_FUNC_DBR_PACING_CFG_INPUT_ENABLES_PRIMARY_NQ_ID_VALID |
1976
HWRM_FUNC_DBR_PACING_CFG_INPUT_ENABLES_PACING_THRESHOLD_VALID);
1977
} else {
1978
req.flags = HWRM_FUNC_DBR_PACING_CFG_INPUT_FLAGS_DBR_NQ_EVENT_DISABLE;
1979
}
1980
req.primary_nq_id = cpu_to_le32(rdev->dbq_nq_id);
1981
req.pacing_threshold = cpu_to_le32(rdev->dbq_watermark);
1982
dev_dbg(rdev_to_dev(rdev), "%s: nq_id = 0x%x pacing_threshold = 0x%x",
1983
__func__, req.primary_nq_id, req.pacing_threshold);
1984
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
1985
sizeof(resp), BNXT_RE_HWRM_CMD_TIMEOUT(rdev));
1986
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
1987
if (rc) {
1988
dev_dbg(rdev_to_dev(rdev),
1989
"Failed to set dbr pacing config, rc = %#x", rc);
1990
return rc;
1991
}
1992
return 0;
1993
}
1994
1995
/* Net -> RoCE driver */
1996
1997
/* Device */
1998
struct bnxt_re_dev *bnxt_re_from_netdev(struct ifnet *netdev)
1999
{
2000
struct bnxt_re_dev *rdev;
2001
2002
rcu_read_lock();
2003
list_for_each_entry_rcu(rdev, &bnxt_re_dev_list, list) {
2004
if (rdev->netdev == netdev) {
2005
rcu_read_unlock();
2006
dev_dbg(rdev_to_dev(rdev),
2007
"netdev (%p) found, ref_count = 0x%x",
2008
netdev, atomic_read(&rdev->ref_count));
2009
return rdev;
2010
}
2011
}
2012
rcu_read_unlock();
2013
return NULL;
2014
}
2015
2016
static ssize_t show_rev(struct device *device, struct device_attribute *attr,
2017
char *buf)
2018
{
2019
struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
2020
2021
return scnprintf(buf, PAGE_SIZE, "0x%x\n", rdev->en_dev->pdev->vendor);
2022
}
2023
2024
2025
static ssize_t show_hca(struct device *device, struct device_attribute *attr,
2026
char *buf)
2027
{
2028
struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
2029
2030
return scnprintf(buf, PAGE_SIZE, "%s\n", rdev->ibdev.node_desc);
2031
}
2032
2033
static ssize_t show_board_id(struct device *device, struct device_attribute *attr,
2034
char *buf)
2035
{
2036
struct bnxt_re_dev *rdev = to_bnxt_re_dev(device, ibdev.dev);
2037
char buffer[BNXT_VPD_PN_FLD_LEN] = {};
2038
2039
if (!rdev->is_virtfn)
2040
memcpy(buffer, rdev->en_dev->board_part_number,
2041
BNXT_VPD_PN_FLD_LEN - 1);
2042
else
2043
scnprintf(buffer, BNXT_VPD_PN_FLD_LEN,
2044
"0x%x-VF", rdev->en_dev->pdev->device);
2045
2046
return scnprintf(buf, PAGE_SIZE, "%s\n", buffer);
2047
}
2048
2049
static DEVICE_ATTR(hw_rev, 0444, show_rev, NULL);
2050
static DEVICE_ATTR(hca_type, 0444, show_hca, NULL);
2051
static DEVICE_ATTR(board_id, 0444, show_board_id, NULL);
2052
2053
static struct device_attribute *bnxt_re_attributes[] = {
2054
&dev_attr_hw_rev,
2055
&dev_attr_hca_type,
2056
&dev_attr_board_id
2057
};
2058
2059
int ib_register_device_compat(struct bnxt_re_dev *rdev)
2060
{
2061
struct ib_device *ibdev = &rdev->ibdev;
2062
char name[IB_DEVICE_NAME_MAX];
2063
2064
memset(name, 0, IB_DEVICE_NAME_MAX);
2065
strlcpy(name, "bnxt_re%d", IB_DEVICE_NAME_MAX);
2066
2067
strlcpy(ibdev->name, name, IB_DEVICE_NAME_MAX);
2068
2069
return ib_register_device(ibdev, NULL);
2070
}
2071
2072
static int bnxt_re_register_ib(struct bnxt_re_dev *rdev)
2073
{
2074
struct ib_device *ibdev = &rdev->ibdev;
2075
int ret = 0;
2076
2077
/* ib device init */
2078
ibdev->owner = THIS_MODULE;
2079
ibdev->uverbs_abi_ver = BNXT_RE_ABI_VERSION;
2080
ibdev->node_type = RDMA_NODE_IB_CA;
2081
strlcpy(ibdev->node_desc, BNXT_RE_DESC " HCA",
2082
strlen(BNXT_RE_DESC) + 5);
2083
ibdev->phys_port_cnt = 1;
2084
2085
bnxt_qplib_get_guid(rdev->dev_addr, (u8 *)&ibdev->node_guid);
2086
2087
/* Data path irqs is one less than the max msix vectors */
2088
ibdev->num_comp_vectors = rdev->nqr.num_msix - 1;
2089
bnxt_re_set_dma_device(ibdev, rdev);
2090
ibdev->local_dma_lkey = BNXT_QPLIB_RSVD_LKEY;
2091
2092
/* User space */
2093
ibdev->uverbs_cmd_mask =
2094
(1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
2095
(1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
2096
(1ull << IB_USER_VERBS_CMD_QUERY_PORT) |
2097
(1ull << IB_USER_VERBS_CMD_ALLOC_PD) |
2098
(1ull << IB_USER_VERBS_CMD_DEALLOC_PD) |
2099
(1ull << IB_USER_VERBS_CMD_REG_MR) |
2100
(1ull << IB_USER_VERBS_CMD_DEREG_MR) |
2101
(1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |
2102
(1ull << IB_USER_VERBS_CMD_CREATE_CQ) |
2103
(1ull << IB_USER_VERBS_CMD_DESTROY_CQ) |
2104
(1ull << IB_USER_VERBS_CMD_CREATE_QP) |
2105
(1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
2106
(1ull << IB_USER_VERBS_CMD_QUERY_QP) |
2107
(1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
2108
(1ull << IB_USER_VERBS_CMD_REREG_MR) |
2109
(1ull << IB_USER_VERBS_CMD_RESIZE_CQ) |
2110
(1ull << IB_USER_VERBS_CMD_CREATE_SRQ) |
2111
(1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) |
2112
(1ull << IB_USER_VERBS_CMD_QUERY_SRQ) |
2113
(1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) |
2114
(1ull << IB_USER_VERBS_CMD_ALLOC_MW) |
2115
(1ull << IB_USER_VERBS_CMD_DEALLOC_MW) |
2116
(1ull << IB_USER_VERBS_CMD_CREATE_AH) |
2117
(1ull << IB_USER_VERBS_CMD_MODIFY_AH) |
2118
(1ull << IB_USER_VERBS_CMD_QUERY_AH) |
2119
(1ull << IB_USER_VERBS_CMD_DESTROY_AH);
2120
2121
ibdev->uverbs_ex_cmd_mask = (1ull << IB_USER_VERBS_EX_CMD_MODIFY_QP);
2122
ibdev->uverbs_cmd_mask |= (1ull << IB_USER_VERBS_CMD_POLL_CQ);
2123
2124
#define bnxt_re_ib_ah bnxt_re_ah
2125
#define bnxt_re_ib_cq bnxt_re_cq
2126
#define bnxt_re_ib_pd bnxt_re_pd
2127
#define bnxt_re_ib_srq bnxt_re_srq
2128
#define bnxt_re_ib_ucontext bnxt_re_ucontext
2129
INIT_IB_DEVICE_OPS(&ibdev->ops, bnxt_re, BNXT_RE);
2130
2131
ibdev->query_device = bnxt_re_query_device;
2132
ibdev->modify_device = bnxt_re_modify_device;
2133
ibdev->query_port = bnxt_re_query_port;
2134
ibdev->modify_port = bnxt_re_modify_port;
2135
ibdev->get_port_immutable = bnxt_re_get_port_immutable;
2136
ibdev->query_pkey = bnxt_re_query_pkey;
2137
ibdev->query_gid = bnxt_re_query_gid;
2138
ibdev->get_netdev = bnxt_re_get_netdev;
2139
ibdev->add_gid = bnxt_re_add_gid;
2140
ibdev->del_gid = bnxt_re_del_gid;
2141
ibdev->get_link_layer = bnxt_re_get_link_layer;
2142
ibdev->alloc_pd = bnxt_re_alloc_pd;
2143
ibdev->dealloc_pd = bnxt_re_dealloc_pd;
2144
ibdev->create_ah = bnxt_re_create_ah;
2145
ibdev->modify_ah = bnxt_re_modify_ah;
2146
ibdev->query_ah = bnxt_re_query_ah;
2147
ibdev->destroy_ah = bnxt_re_destroy_ah;
2148
ibdev->create_srq = bnxt_re_create_srq;
2149
ibdev->modify_srq = bnxt_re_modify_srq;
2150
ibdev->query_srq = bnxt_re_query_srq;
2151
ibdev->destroy_srq = bnxt_re_destroy_srq;
2152
ibdev->post_srq_recv = bnxt_re_post_srq_recv;
2153
ibdev->create_qp = bnxt_re_create_qp;
2154
ibdev->modify_qp = bnxt_re_modify_qp;
2155
ibdev->query_qp = bnxt_re_query_qp;
2156
ibdev->destroy_qp = bnxt_re_destroy_qp;
2157
ibdev->post_send = bnxt_re_post_send;
2158
ibdev->post_recv = bnxt_re_post_recv;
2159
ibdev->create_cq = bnxt_re_create_cq;
2160
ibdev->modify_cq = bnxt_re_modify_cq;
2161
ibdev->destroy_cq = bnxt_re_destroy_cq;
2162
ibdev->resize_cq = bnxt_re_resize_cq;
2163
ibdev->poll_cq = bnxt_re_poll_cq;
2164
ibdev->req_notify_cq = bnxt_re_req_notify_cq;
2165
ibdev->get_dma_mr = bnxt_re_get_dma_mr;
2166
ibdev->get_hw_stats = bnxt_re_get_hw_stats;
2167
ibdev->alloc_hw_stats = bnxt_re_alloc_hw_port_stats;
2168
ibdev->dereg_mr = bnxt_re_dereg_mr;
2169
ibdev->alloc_mr = bnxt_re_alloc_mr;
2170
ibdev->map_mr_sg = bnxt_re_map_mr_sg;
2171
ibdev->alloc_mw = bnxt_re_alloc_mw;
2172
ibdev->dealloc_mw = bnxt_re_dealloc_mw;
2173
ibdev->reg_user_mr = bnxt_re_reg_user_mr;
2174
ibdev->rereg_user_mr = bnxt_re_rereg_user_mr;
2175
ibdev->disassociate_ucontext = bnxt_re_disassociate_ucntx;
2176
ibdev->alloc_ucontext = bnxt_re_alloc_ucontext;
2177
ibdev->dealloc_ucontext = bnxt_re_dealloc_ucontext;
2178
ibdev->mmap = bnxt_re_mmap;
2179
ibdev->process_mad = bnxt_re_process_mad;
2180
2181
ret = ib_register_device_compat(rdev);
2182
return ret;
2183
}
2184
2185
static void bnxt_re_dev_dealloc(struct bnxt_re_dev *rdev)
2186
{
2187
int i = BNXT_RE_REF_WAIT_COUNT;
2188
2189
dev_dbg(rdev_to_dev(rdev), "%s:Remove the device %p\n", __func__, rdev);
2190
/* Wait for rdev refcount to come down */
2191
while ((atomic_read(&rdev->ref_count) > 1) && i--)
2192
msleep(100);
2193
2194
if (atomic_read(&rdev->ref_count) > 1)
2195
dev_err(rdev_to_dev(rdev),
2196
"Failed waiting for ref count to deplete %d",
2197
atomic_read(&rdev->ref_count));
2198
2199
atomic_set(&rdev->ref_count, 0);
2200
if_rele(rdev->netdev);
2201
rdev->netdev = NULL;
2202
synchronize_rcu();
2203
2204
kfree(rdev->gid_map);
2205
kfree(rdev->dbg_stats);
2206
ib_dealloc_device(&rdev->ibdev);
2207
}
2208
2209
static struct bnxt_re_dev *bnxt_re_dev_alloc(struct ifnet *netdev,
2210
struct bnxt_en_dev *en_dev)
2211
{
2212
struct bnxt_re_dev *rdev;
2213
u32 count;
2214
2215
/* Allocate bnxt_re_dev instance here */
2216
rdev = (struct bnxt_re_dev *)compat_ib_alloc_device(sizeof(*rdev));
2217
if (!rdev) {
2218
pr_err("%s: bnxt_re_dev allocation failure!",
2219
ROCE_DRV_MODULE_NAME);
2220
return NULL;
2221
}
2222
/* Default values */
2223
atomic_set(&rdev->ref_count, 0);
2224
rdev->netdev = netdev;
2225
dev_hold(rdev->netdev);
2226
rdev->en_dev = en_dev;
2227
rdev->id = rdev->en_dev->pdev->devfn;
2228
INIT_LIST_HEAD(&rdev->qp_list);
2229
mutex_init(&rdev->qp_lock);
2230
mutex_init(&rdev->cc_lock);
2231
mutex_init(&rdev->dbq_lock);
2232
bnxt_re_clear_rsors_stat(&rdev->stats.rsors);
2233
rdev->cosq[0] = rdev->cosq[1] = 0xFFFF;
2234
rdev->min_tx_depth = 1;
2235
rdev->stats.stats_query_sec = 1;
2236
/* Disable priority vlan as the default mode is DSCP based PFC */
2237
rdev->cc_param.disable_prio_vlan_tx = 1;
2238
2239
/* Initialize worker for DBR Pacing */
2240
INIT_WORK(&rdev->dbq_fifo_check_work, bnxt_re_db_fifo_check);
2241
INIT_DELAYED_WORK(&rdev->dbq_pacing_work, bnxt_re_pacing_timer_exp);
2242
rdev->gid_map = kzalloc(sizeof(*(rdev->gid_map)) *
2243
BNXT_RE_MAX_SGID_ENTRIES,
2244
GFP_KERNEL);
2245
if (!rdev->gid_map) {
2246
ib_dealloc_device(&rdev->ibdev);
2247
return NULL;
2248
}
2249
for(count = 0; count < BNXT_RE_MAX_SGID_ENTRIES; count++)
2250
rdev->gid_map[count] = -1;
2251
2252
rdev->dbg_stats = kzalloc(sizeof(*rdev->dbg_stats), GFP_KERNEL);
2253
if (!rdev->dbg_stats) {
2254
ib_dealloc_device(&rdev->ibdev);
2255
return NULL;
2256
}
2257
2258
return rdev;
2259
}
2260
2261
static int bnxt_re_handle_unaffi_async_event(
2262
struct creq_func_event *unaffi_async)
2263
{
2264
switch (unaffi_async->event) {
2265
case CREQ_FUNC_EVENT_EVENT_TX_WQE_ERROR:
2266
case CREQ_FUNC_EVENT_EVENT_TX_DATA_ERROR:
2267
case CREQ_FUNC_EVENT_EVENT_RX_WQE_ERROR:
2268
case CREQ_FUNC_EVENT_EVENT_RX_DATA_ERROR:
2269
case CREQ_FUNC_EVENT_EVENT_CQ_ERROR:
2270
case CREQ_FUNC_EVENT_EVENT_TQM_ERROR:
2271
case CREQ_FUNC_EVENT_EVENT_CFCQ_ERROR:
2272
case CREQ_FUNC_EVENT_EVENT_CFCS_ERROR:
2273
case CREQ_FUNC_EVENT_EVENT_CFCC_ERROR:
2274
case CREQ_FUNC_EVENT_EVENT_CFCM_ERROR:
2275
case CREQ_FUNC_EVENT_EVENT_TIM_ERROR:
2276
break;
2277
default:
2278
return -EINVAL;
2279
}
2280
return 0;
2281
}
2282
2283
static int bnxt_re_handle_qp_async_event(void *qp_event, struct bnxt_re_qp *qp)
2284
{
2285
struct creq_qp_error_notification *err_event;
2286
struct ib_event event;
2287
unsigned int flags;
2288
2289
if (qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR &&
2290
!qp->qplib_qp.is_user) {
2291
flags = bnxt_re_lock_cqs(qp);
2292
bnxt_qplib_add_flush_qp(&qp->qplib_qp);
2293
bnxt_re_unlock_cqs(qp, flags);
2294
}
2295
memset(&event, 0, sizeof(event));
2296
event.device = &qp->rdev->ibdev;
2297
event.element.qp = &qp->ib_qp;
2298
event.event = IB_EVENT_QP_FATAL;
2299
2300
err_event = qp_event;
2301
switch(err_event->res_err_state_reason) {
2302
case CFCQ_RES_ERR_STATE_REASON_RES_EXCEED_MAX:
2303
case CFCQ_RES_ERR_STATE_REASON_RES_PAYLOAD_LENGTH_MISMATCH:
2304
case CFCQ_RES_ERR_STATE_REASON_RES_OPCODE_ERROR:
2305
case CFCQ_RES_ERR_STATE_REASON_RES_PSN_SEQ_ERROR_RETRY_LIMIT:
2306
case CFCQ_RES_ERR_STATE_REASON_RES_RX_INVALID_R_KEY:
2307
case CFCQ_RES_ERR_STATE_REASON_RES_RX_DOMAIN_ERROR:
2308
case CFCQ_RES_ERR_STATE_REASON_RES_RX_NO_PERMISSION:
2309
case CFCQ_RES_ERR_STATE_REASON_RES_RX_RANGE_ERROR:
2310
case CFCQ_RES_ERR_STATE_REASON_RES_TX_INVALID_R_KEY:
2311
case CFCQ_RES_ERR_STATE_REASON_RES_TX_DOMAIN_ERROR:
2312
case CFCQ_RES_ERR_STATE_REASON_RES_TX_NO_PERMISSION:
2313
case CFCQ_RES_ERR_STATE_REASON_RES_TX_RANGE_ERROR:
2314
case CFCQ_RES_ERR_STATE_REASON_RES_IVALID_DUP_RKEY:
2315
case CFCQ_RES_ERR_STATE_REASON_RES_UNALIGN_ATOMIC:
2316
event.event = IB_EVENT_QP_ACCESS_ERR;
2317
break;
2318
case CFCQ_RES_ERR_STATE_REASON_RES_EXCEEDS_WQE:
2319
case CFCQ_RES_ERR_STATE_REASON_RES_WQE_FORMAT_ERROR:
2320
case CFCQ_RES_ERR_STATE_REASON_RES_SRQ_LOAD_ERROR:
2321
case CFCQ_RES_ERR_STATE_REASON_RES_UNSUPPORTED_OPCODE:
2322
case CFCQ_RES_ERR_STATE_REASON_RES_REM_INVALIDATE:
2323
event.event = IB_EVENT_QP_REQ_ERR;
2324
break;
2325
case CFCQ_RES_ERR_STATE_REASON_RES_IRRQ_OFLOW:
2326
case CFCQ_RES_ERR_STATE_REASON_RES_CMP_ERROR:
2327
case CFCQ_RES_ERR_STATE_REASON_RES_CQ_LOAD_ERROR:
2328
case CFCQ_RES_ERR_STATE_REASON_RES_TX_PCI_ERROR:
2329
case CFCQ_RES_ERR_STATE_REASON_RES_RX_PCI_ERROR:
2330
case CFCQ_RES_ERR_STATE_REASON_RES_MEMORY_ERROR:
2331
case CFCQ_RES_ERR_STATE_REASON_RES_SRQ_ERROR:
2332
event.event = IB_EVENT_QP_FATAL;
2333
break;
2334
default:
2335
if (qp->qplib_qp.srq)
2336
event.event = IB_EVENT_QP_LAST_WQE_REACHED;
2337
break;
2338
}
2339
2340
if (err_event->res_err_state_reason)
2341
dev_err(rdev_to_dev(qp->rdev),
2342
"%s %s qp_id: %d cons (%d %d) req (%d %d) res (%d %d)\n",
2343
__func__, qp->qplib_qp.is_user ? "user" : "kernel",
2344
qp->qplib_qp.id,
2345
err_event->sq_cons_idx,
2346
err_event->rq_cons_idx,
2347
err_event->req_slow_path_state,
2348
err_event->req_err_state_reason,
2349
err_event->res_slow_path_state,
2350
err_event->res_err_state_reason);
2351
2352
if (event.device && qp->ib_qp.event_handler)
2353
qp->ib_qp.event_handler(&event, qp->ib_qp.qp_context);
2354
2355
return 0;
2356
}
2357
2358
static int bnxt_re_handle_cq_async_error(void *event, struct bnxt_re_cq *cq)
2359
{
2360
struct creq_cq_error_notification *cqerr;
2361
bool send = false;
2362
2363
cqerr = event;
2364
switch (cqerr->cq_err_reason) {
2365
case CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_REQ_CQ_INVALID_ERROR:
2366
case CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_REQ_CQ_OVERFLOW_ERROR:
2367
case CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_REQ_CQ_LOAD_ERROR:
2368
case CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_INVALID_ERROR:
2369
case CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_OVERFLOW_ERROR:
2370
case CREQ_CQ_ERROR_NOTIFICATION_CQ_ERR_REASON_RES_CQ_LOAD_ERROR:
2371
send = true;
2372
default:
2373
break;
2374
}
2375
2376
if (send && cq->ibcq.event_handler) {
2377
struct ib_event ibevent = {};
2378
2379
ibevent.event = IB_EVENT_CQ_ERR;
2380
ibevent.element.cq = &cq->ibcq;
2381
ibevent.device = &cq->rdev->ibdev;
2382
2383
dev_err(rdev_to_dev(cq->rdev),
2384
"%s err reason %d\n", __func__, cqerr->cq_err_reason);
2385
cq->ibcq.event_handler(&ibevent, cq->ibcq.cq_context);
2386
}
2387
2388
cq->qplib_cq.is_cq_err_event = true;
2389
2390
return 0;
2391
}
2392
2393
static int bnxt_re_handle_affi_async_event(struct creq_qp_event *affi_async,
2394
void *obj)
2395
{
2396
struct bnxt_qplib_qp *qplqp;
2397
struct bnxt_qplib_cq *qplcq;
2398
struct bnxt_re_qp *qp;
2399
struct bnxt_re_cq *cq;
2400
int rc = 0;
2401
u8 event;
2402
2403
if (!obj)
2404
return rc; /* QP was already dead, still return success */
2405
2406
event = affi_async->event;
2407
switch (event) {
2408
case CREQ_QP_EVENT_EVENT_QP_ERROR_NOTIFICATION:
2409
qplqp = obj;
2410
qp = container_of(qplqp, struct bnxt_re_qp, qplib_qp);
2411
rc = bnxt_re_handle_qp_async_event(affi_async, qp);
2412
break;
2413
case CREQ_QP_EVENT_EVENT_CQ_ERROR_NOTIFICATION:
2414
qplcq = obj;
2415
cq = container_of(qplcq, struct bnxt_re_cq, qplib_cq);
2416
rc = bnxt_re_handle_cq_async_error(affi_async, cq);
2417
break;
2418
default:
2419
rc = -EINVAL;
2420
}
2421
2422
return rc;
2423
}
2424
2425
static int bnxt_re_aeq_handler(struct bnxt_qplib_rcfw *rcfw,
2426
void *aeqe, void *obj)
2427
{
2428
struct creq_func_event *unaffi_async;
2429
struct creq_qp_event *affi_async;
2430
u8 type;
2431
int rc;
2432
2433
type = ((struct creq_base *)aeqe)->type;
2434
if (type == CREQ_BASE_TYPE_FUNC_EVENT) {
2435
unaffi_async = aeqe;
2436
rc = bnxt_re_handle_unaffi_async_event(unaffi_async);
2437
} else {
2438
affi_async = aeqe;
2439
rc = bnxt_re_handle_affi_async_event(affi_async, obj);
2440
}
2441
2442
return rc;
2443
}
2444
2445
static int bnxt_re_srqn_handler(struct bnxt_qplib_nq *nq,
2446
struct bnxt_qplib_srq *handle, u8 event)
2447
{
2448
struct bnxt_re_srq *srq = to_bnxt_re(handle, struct bnxt_re_srq,
2449
qplib_srq);
2450
struct ib_event ib_event;
2451
2452
if (srq == NULL) {
2453
pr_err("%s: SRQ is NULL, SRQN not handled",
2454
ROCE_DRV_MODULE_NAME);
2455
return -EINVAL;
2456
}
2457
ib_event.device = &srq->rdev->ibdev;
2458
ib_event.element.srq = &srq->ibsrq;
2459
if (event == NQ_SRQ_EVENT_EVENT_SRQ_THRESHOLD_EVENT)
2460
ib_event.event = IB_EVENT_SRQ_LIMIT_REACHED;
2461
else
2462
ib_event.event = IB_EVENT_SRQ_ERR;
2463
2464
if (srq->ibsrq.event_handler) {
2465
/* Lock event_handler? */
2466
(*srq->ibsrq.event_handler)(&ib_event,
2467
srq->ibsrq.srq_context);
2468
}
2469
return 0;
2470
}
2471
2472
static int bnxt_re_cqn_handler(struct bnxt_qplib_nq *nq,
2473
struct bnxt_qplib_cq *handle)
2474
{
2475
struct bnxt_re_cq *cq = to_bnxt_re(handle, struct bnxt_re_cq,
2476
qplib_cq);
2477
u32 *cq_ptr;
2478
2479
if (cq == NULL) {
2480
pr_err("%s: CQ is NULL, CQN not handled",
2481
ROCE_DRV_MODULE_NAME);
2482
return -EINVAL;
2483
}
2484
/* CQ already in destroy path. Do not handle any more events */
2485
if (handle->destroyed || !atomic_read(&cq->ibcq.usecnt)) {
2486
if (!handle->destroyed)
2487
dev_dbg(NULL, "%s: CQ being destroyed, CQN not handled",
2488
ROCE_DRV_MODULE_NAME);
2489
return 0;
2490
}
2491
2492
if (cq->ibcq.comp_handler) {
2493
if (cq->uctx_cq_page) {
2494
cq_ptr = (u32 *)cq->uctx_cq_page;
2495
*cq_ptr = cq->qplib_cq.toggle;
2496
}
2497
/* Lock comp_handler? */
2498
(*cq->ibcq.comp_handler)(&cq->ibcq, cq->ibcq.cq_context);
2499
}
2500
2501
return 0;
2502
}
2503
2504
struct bnxt_qplib_nq *bnxt_re_get_nq(struct bnxt_re_dev *rdev)
2505
{
2506
int min, indx;
2507
2508
mutex_lock(&rdev->nqr.load_lock);
2509
for (indx = 0, min = 0; indx < (rdev->nqr.num_msix - 1); indx++) {
2510
if (rdev->nqr.nq[min].load > rdev->nqr.nq[indx].load)
2511
min = indx;
2512
}
2513
rdev->nqr.nq[min].load++;
2514
mutex_unlock(&rdev->nqr.load_lock);
2515
2516
return &rdev->nqr.nq[min];
2517
}
2518
2519
void bnxt_re_put_nq(struct bnxt_re_dev *rdev, struct bnxt_qplib_nq *nq)
2520
{
2521
mutex_lock(&rdev->nqr.load_lock);
2522
nq->load--;
2523
mutex_unlock(&rdev->nqr.load_lock);
2524
}
2525
2526
static bool bnxt_re_check_min_attr(struct bnxt_re_dev *rdev)
2527
{
2528
struct bnxt_qplib_dev_attr *attr;
2529
bool rc = true;
2530
2531
attr = rdev->dev_attr;
2532
2533
if (!attr->max_cq || !attr->max_qp ||
2534
!attr->max_sgid || !attr->max_mr) {
2535
dev_err(rdev_to_dev(rdev),"Insufficient RoCE resources");
2536
dev_dbg(rdev_to_dev(rdev),
2537
"max_cq = %d, max_qp = %d, max_dpi = %d, max_sgid = %d, max_mr = %d",
2538
attr->max_cq, attr->max_qp, attr->max_dpi,
2539
attr->max_sgid, attr->max_mr);
2540
rc = false;
2541
}
2542
return rc;
2543
}
2544
2545
static void bnxt_re_dispatch_event(struct ib_device *ibdev, struct ib_qp *qp,
2546
u8 port_num, enum ib_event_type event)
2547
{
2548
struct ib_event ib_event;
2549
2550
ib_event.device = ibdev;
2551
if (qp) {
2552
ib_event.element.qp = qp;
2553
ib_event.event = event;
2554
if (qp->event_handler)
2555
qp->event_handler(&ib_event, qp->qp_context);
2556
} else {
2557
ib_event.element.port_num = port_num;
2558
ib_event.event = event;
2559
ib_dispatch_event(&ib_event);
2560
}
2561
2562
dev_dbg(rdev_to_dev(to_bnxt_re_dev(ibdev, ibdev)),
2563
"ibdev %p Event 0x%x port_num 0x%x", ibdev, event, port_num);
2564
}
2565
2566
static bool bnxt_re_is_qp1_or_shadow_qp(struct bnxt_re_dev *rdev,
2567
struct bnxt_re_qp *qp)
2568
{
2569
if (rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ALL)
2570
return (qp->ib_qp.qp_type == IB_QPT_GSI) ||
2571
(qp == rdev->gsi_ctx.gsi_sqp);
2572
else
2573
return (qp->ib_qp.qp_type == IB_QPT_GSI);
2574
}
2575
2576
static void bnxt_re_stop_all_nonqp1_nonshadow_qps(struct bnxt_re_dev *rdev)
2577
{
2578
struct bnxt_qplib_qp *qpl_qp;
2579
bool dev_detached = false;
2580
struct ib_qp_attr qp_attr;
2581
int num_qps_stopped = 0;
2582
int mask = IB_QP_STATE;
2583
struct bnxt_re_qp *qp;
2584
unsigned long flags;
2585
2586
if (!rdev)
2587
return;
2588
2589
restart:
2590
if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags))
2591
dev_detached = true;
2592
2593
qp_attr.qp_state = IB_QPS_ERR;
2594
mutex_lock(&rdev->qp_lock);
2595
list_for_each_entry(qp, &rdev->qp_list, list) {
2596
qpl_qp = &qp->qplib_qp;
2597
if (dev_detached || !bnxt_re_is_qp1_or_shadow_qp(rdev, qp)) {
2598
if (qpl_qp->state !=
2599
CMDQ_MODIFY_QP_NEW_STATE_RESET &&
2600
qpl_qp->state !=
2601
CMDQ_MODIFY_QP_NEW_STATE_ERR) {
2602
if (dev_detached) {
2603
/*
2604
* Cant actually send the command down,
2605
* marking the state for bookkeeping
2606
*/
2607
qpl_qp->state =
2608
CMDQ_MODIFY_QP_NEW_STATE_ERR;
2609
qpl_qp->cur_qp_state = qpl_qp->state;
2610
if (!qpl_qp->is_user) {
2611
/* Add to flush list */
2612
flags = bnxt_re_lock_cqs(qp);
2613
bnxt_qplib_add_flush_qp(qpl_qp);
2614
bnxt_re_unlock_cqs(qp, flags);
2615
}
2616
} else {
2617
num_qps_stopped++;
2618
bnxt_re_modify_qp(&qp->ib_qp,
2619
&qp_attr, mask,
2620
NULL);
2621
}
2622
2623
bnxt_re_dispatch_event(&rdev->ibdev, &qp->ib_qp,
2624
1, IB_EVENT_QP_FATAL);
2625
/*
2626
* 1. Release qp_lock after a budget to unblock other verb
2627
* requests (like qp_destroy) from stack.
2628
* 2. Traverse through the qp_list freshly as addition / deletion
2629
* might have happened since qp_lock is getting released here.
2630
*/
2631
if (num_qps_stopped % BNXT_RE_STOP_QPS_BUDGET == 0) {
2632
mutex_unlock(&rdev->qp_lock);
2633
goto restart;
2634
}
2635
}
2636
}
2637
}
2638
2639
mutex_unlock(&rdev->qp_lock);
2640
}
2641
2642
static int bnxt_re_update_gid(struct bnxt_re_dev *rdev)
2643
{
2644
struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl;
2645
struct bnxt_qplib_gid gid;
2646
u16 gid_idx, index;
2647
int rc = 0;
2648
2649
if (!test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags))
2650
return 0;
2651
2652
if (sgid_tbl == NULL) {
2653
dev_err(rdev_to_dev(rdev), "QPLIB: SGID table not allocated");
2654
return -EINVAL;
2655
}
2656
2657
for (index = 0; index < sgid_tbl->active; index++) {
2658
gid_idx = sgid_tbl->hw_id[index];
2659
2660
if (!memcmp(&sgid_tbl->tbl[index], &bnxt_qplib_gid_zero,
2661
sizeof(bnxt_qplib_gid_zero)))
2662
continue;
2663
/* Need to modify the VLAN enable setting of non VLAN GID only
2664
* as setting is done for VLAN GID while adding GID
2665
*
2666
* If disable_prio_vlan_tx is enable, then we'll need to remove the
2667
* vlan entry from the sgid_tbl.
2668
*/
2669
if (sgid_tbl->vlan[index] == true)
2670
continue;
2671
2672
memcpy(&gid, &sgid_tbl->tbl[index], sizeof(gid));
2673
2674
rc = bnxt_qplib_update_sgid(sgid_tbl, &gid, gid_idx,
2675
rdev->dev_addr);
2676
}
2677
2678
return rc;
2679
}
2680
2681
static void bnxt_re_clear_cc(struct bnxt_re_dev *rdev)
2682
{
2683
struct bnxt_qplib_cc_param *cc_param = &rdev->cc_param;
2684
2685
if (_is_chip_p7(rdev->chip_ctx)) {
2686
cc_param->mask = CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP;
2687
} else {
2688
cc_param->mask = (CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_CC_MODE |
2689
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ENABLE_CC |
2690
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_ECN);
2691
2692
if (!is_qport_service_type_supported(rdev))
2693
cc_param->mask |=
2694
(CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_VLAN_PCP |
2695
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_TOS_DSCP |
2696
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP);
2697
}
2698
2699
cc_param->cur_mask = cc_param->mask;
2700
2701
if (bnxt_qplib_modify_cc(&rdev->qplib_res, cc_param))
2702
dev_err(rdev_to_dev(rdev), "Failed to modify cc\n");
2703
}
2704
2705
static int bnxt_re_setup_cc(struct bnxt_re_dev *rdev)
2706
{
2707
struct bnxt_qplib_cc_param *cc_param = &rdev->cc_param;
2708
int rc;
2709
2710
if (_is_chip_p7(rdev->chip_ctx)) {
2711
cc_param->enable = 0x0;
2712
cc_param->mask = CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP;
2713
} else {
2714
cc_param->enable = 0x1;
2715
cc_param->mask = (CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_CC_MODE |
2716
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ENABLE_CC |
2717
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_ECN);
2718
2719
if (!is_qport_service_type_supported(rdev))
2720
cc_param->mask |=
2721
(CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_VLAN_PCP |
2722
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_TOS_DSCP |
2723
CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP);
2724
}
2725
2726
cc_param->cur_mask = cc_param->mask;
2727
2728
rc = bnxt_qplib_modify_cc(&rdev->qplib_res, cc_param);
2729
if (rc) {
2730
dev_err(rdev_to_dev(rdev), "Failed to modify cc\n");
2731
return rc;
2732
}
2733
/* Reset the programming mask */
2734
cc_param->mask = 0;
2735
if (cc_param->qp1_tos_dscp != cc_param->tos_dscp) {
2736
cc_param->qp1_tos_dscp = cc_param->tos_dscp;
2737
rc = bnxt_re_update_qp1_tos_dscp(rdev);
2738
if (rc) {
2739
dev_err(rdev_to_dev(rdev), "%s:Failed to modify QP1:%d",
2740
__func__, rc);
2741
goto clear;
2742
}
2743
}
2744
return 0;
2745
2746
clear:
2747
bnxt_re_clear_cc(rdev);
2748
return rc;
2749
}
2750
2751
int bnxt_re_query_hwrm_dscp2pri(struct bnxt_re_dev *rdev,
2752
struct bnxt_re_dscp2pri *d2p, u16 *count,
2753
u16 target_id)
2754
{
2755
struct bnxt_en_dev *en_dev = rdev->en_dev;
2756
struct hwrm_queue_dscp2pri_qcfg_input req;
2757
struct hwrm_queue_dscp2pri_qcfg_output resp;
2758
struct bnxt_re_dscp2pri *dscp2pri;
2759
struct bnxt_fw_msg fw_msg;
2760
u16 in_count = *count;
2761
dma_addr_t dma_handle;
2762
int rc = 0, i;
2763
u16 data_len;
2764
u8 *kmem;
2765
2766
data_len = *count * sizeof(*dscp2pri);
2767
memset(&fw_msg, 0, sizeof(fw_msg));
2768
memset(&req, 0, sizeof(req));
2769
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
2770
HWRM_QUEUE_DSCP2PRI_QCFG, -1, target_id);
2771
req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1;
2772
2773
kmem = dma_zalloc_coherent(&en_dev->pdev->dev, data_len, &dma_handle,
2774
GFP_KERNEL);
2775
if (!kmem) {
2776
dev_err(rdev_to_dev(rdev),
2777
"dma_zalloc_coherent failure, length = %u\n",
2778
(unsigned)data_len);
2779
return -ENOMEM;
2780
}
2781
req.dest_data_addr = cpu_to_le64(dma_handle);
2782
req.dest_data_buffer_size = cpu_to_le16(data_len);
2783
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
2784
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
2785
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
2786
if (rc)
2787
goto out;
2788
2789
/* Upload the DSCP-MASK-PRI tuple(s) */
2790
dscp2pri = (struct bnxt_re_dscp2pri *)kmem;
2791
for (i = 0; i < le16_to_cpu(resp.entry_cnt) && i < in_count; i++) {
2792
d2p[i].dscp = dscp2pri->dscp;
2793
d2p[i].mask = dscp2pri->mask;
2794
d2p[i].pri = dscp2pri->pri;
2795
dscp2pri++;
2796
}
2797
*count = le16_to_cpu(resp.entry_cnt);
2798
out:
2799
dma_free_coherent(&en_dev->pdev->dev, data_len, kmem, dma_handle);
2800
return rc;
2801
}
2802
2803
int bnxt_re_prio_vlan_tx_update(struct bnxt_re_dev *rdev)
2804
{
2805
/* Remove the VLAN from the GID entry */
2806
if (rdev->cc_param.disable_prio_vlan_tx)
2807
rdev->qplib_res.prio = false;
2808
else
2809
rdev->qplib_res.prio = true;
2810
2811
return bnxt_re_update_gid(rdev);
2812
}
2813
2814
int bnxt_re_set_hwrm_dscp2pri(struct bnxt_re_dev *rdev,
2815
struct bnxt_re_dscp2pri *d2p, u16 count,
2816
u16 target_id)
2817
{
2818
struct bnxt_en_dev *en_dev = rdev->en_dev;
2819
struct hwrm_queue_dscp2pri_cfg_input req;
2820
struct hwrm_queue_dscp2pri_cfg_output resp;
2821
struct bnxt_fw_msg fw_msg;
2822
struct bnxt_re_dscp2pri *dscp2pri;
2823
int i, rc, data_len = 3 * 256;
2824
dma_addr_t dma_handle;
2825
u8 *kmem;
2826
2827
memset(&req, 0, sizeof(req));
2828
memset(&fw_msg, 0, sizeof(fw_msg));
2829
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
2830
HWRM_QUEUE_DSCP2PRI_CFG, -1, target_id);
2831
req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1;
2832
2833
kmem = dma_alloc_coherent(&en_dev->pdev->dev, data_len, &dma_handle,
2834
GFP_KERNEL);
2835
if (!kmem) {
2836
dev_err(rdev_to_dev(rdev),
2837
"dma_alloc_coherent failure, length = %u\n",
2838
(unsigned)data_len);
2839
return -ENOMEM;
2840
}
2841
req.src_data_addr = cpu_to_le64(dma_handle);
2842
2843
/* Download the DSCP-MASK-PRI tuple(s) */
2844
dscp2pri = (struct bnxt_re_dscp2pri *)kmem;
2845
for (i = 0; i < count; i++) {
2846
dscp2pri->dscp = d2p[i].dscp;
2847
dscp2pri->mask = d2p[i].mask;
2848
dscp2pri->pri = d2p[i].pri;
2849
dscp2pri++;
2850
}
2851
2852
req.entry_cnt = cpu_to_le16(count);
2853
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
2854
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
2855
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
2856
dma_free_coherent(&en_dev->pdev->dev, data_len, kmem, dma_handle);
2857
return rc;
2858
}
2859
2860
int bnxt_re_query_hwrm_qportcfg(struct bnxt_re_dev *rdev,
2861
struct bnxt_re_tc_rec *tc_rec, u16 tid)
2862
{
2863
u8 max_tc, tc, *qptr, *type_ptr0, *type_ptr1;
2864
struct hwrm_queue_qportcfg_output resp = {0};
2865
struct hwrm_queue_qportcfg_input req = {0};
2866
struct bnxt_en_dev *en_dev = rdev->en_dev;
2867
struct bnxt_fw_msg fw_msg;
2868
bool def_init = false;
2869
u8 *tmp_type;
2870
u8 cos_id;
2871
int rc;
2872
2873
memset(&fw_msg, 0, sizeof(fw_msg));
2874
bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_QUEUE_QPORTCFG,
2875
-1, tid);
2876
req.port_id = (tid == 0xFFFF) ? en_dev->pf_port_id : 1;
2877
if (BNXT_EN_ASYM_Q(en_dev))
2878
req.flags = htole32(HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_RX);
2879
2880
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
2881
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
2882
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
2883
if (rc)
2884
return rc;
2885
2886
if (!resp.max_configurable_queues)
2887
return -EINVAL;
2888
2889
max_tc = resp.max_configurable_queues;
2890
tc_rec->max_tc = max_tc;
2891
2892
if (resp.queue_cfg_info & HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_CFG_INFO_USE_PROFILE_TYPE)
2893
tc_rec->serv_type_enabled = true;
2894
2895
qptr = &resp.queue_id0;
2896
type_ptr0 = &resp.queue_id0_service_profile_type;
2897
type_ptr1 = &resp.queue_id1_service_profile_type;
2898
for (tc = 0; tc < max_tc; tc++) {
2899
tmp_type = tc ? type_ptr1 + (tc - 1) : type_ptr0;
2900
2901
cos_id = *qptr++;
2902
/* RoCE CoS queue is the first cos queue.
2903
* For MP12 and MP17 order is 405 and 141015.
2904
*/
2905
if (is_bnxt_roce_queue(rdev, *qptr, *tmp_type)) {
2906
tc_rec->cos_id_roce = cos_id;
2907
tc_rec->tc_roce = tc;
2908
} else if (is_bnxt_cnp_queue(rdev, *qptr, *tmp_type)) {
2909
tc_rec->cos_id_cnp = cos_id;
2910
tc_rec->tc_cnp = tc;
2911
} else if (!def_init) {
2912
def_init = true;
2913
tc_rec->tc_def = tc;
2914
tc_rec->cos_id_def = cos_id;
2915
}
2916
qptr++;
2917
}
2918
2919
return rc;
2920
}
2921
2922
int bnxt_re_hwrm_cos2bw_qcfg(struct bnxt_re_dev *rdev, u16 target_id,
2923
struct bnxt_re_cos2bw_cfg *cfg)
2924
{
2925
struct bnxt_en_dev *en_dev = rdev->en_dev;
2926
struct hwrm_queue_cos2bw_qcfg_output resp;
2927
struct hwrm_queue_cos2bw_qcfg_input req = {0};
2928
struct bnxt_fw_msg fw_msg;
2929
int rc, indx;
2930
void *data;
2931
2932
memset(&fw_msg, 0, sizeof(fw_msg));
2933
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
2934
HWRM_QUEUE_COS2BW_QCFG, -1, target_id);
2935
req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1;
2936
2937
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
2938
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
2939
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
2940
if (rc)
2941
return rc;
2942
data = &resp.queue_id0 + offsetof(struct bnxt_re_cos2bw_cfg,
2943
queue_id);
2944
for (indx = 0; indx < 8; indx++, data += (sizeof(cfg->cfg))) {
2945
memcpy(&cfg->cfg, data, sizeof(cfg->cfg));
2946
if (indx == 0)
2947
cfg->queue_id = resp.queue_id0;
2948
cfg++;
2949
}
2950
2951
return rc;
2952
}
2953
2954
int bnxt_re_hwrm_cos2bw_cfg(struct bnxt_re_dev *rdev, u16 target_id,
2955
struct bnxt_re_cos2bw_cfg *cfg)
2956
{
2957
struct bnxt_en_dev *en_dev = rdev->en_dev;
2958
struct hwrm_queue_cos2bw_cfg_input req = {0};
2959
struct hwrm_queue_cos2bw_cfg_output resp = {0};
2960
struct bnxt_fw_msg fw_msg;
2961
void *data;
2962
int indx;
2963
int rc;
2964
2965
memset(&fw_msg, 0, sizeof(fw_msg));
2966
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
2967
HWRM_QUEUE_COS2BW_CFG, -1, target_id);
2968
req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1;
2969
2970
/* Chimp wants enable bit to retain previous
2971
* config done by L2 driver
2972
*/
2973
for (indx = 0; indx < 8; indx++) {
2974
if (cfg[indx].queue_id < 40) {
2975
req.enables |= cpu_to_le32(
2976
HWRM_QUEUE_COS2BW_CFG_INPUT_ENABLES_COS_QUEUE_ID0_VALID <<
2977
indx);
2978
}
2979
2980
data = (char *)&req.unused_0 + indx * (sizeof(*cfg) - 4);
2981
memcpy(data, &cfg[indx].queue_id, sizeof(*cfg) - 4);
2982
if (indx == 0) {
2983
req.queue_id0 = cfg[0].queue_id;
2984
req.unused_0 = 0;
2985
}
2986
}
2987
2988
memset(&resp, 0, sizeof(resp));
2989
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
2990
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
2991
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
2992
return rc;
2993
}
2994
2995
int bnxt_re_host_pf_id_query(struct bnxt_re_dev *rdev,
2996
struct bnxt_qplib_query_fn_info *fn_info,
2997
u32 *pf_mask, u32 *first_pf)
2998
{
2999
struct hwrm_func_host_pf_ids_query_output resp = {0};
3000
struct hwrm_func_host_pf_ids_query_input req;
3001
struct bnxt_en_dev *en_dev = rdev->en_dev;
3002
struct bnxt_fw_msg fw_msg;
3003
int rc;
3004
3005
memset(&fw_msg, 0, sizeof(fw_msg));
3006
memset(&req, 0, sizeof(req));
3007
bnxt_re_init_hwrm_hdr(rdev, (void *)&req,
3008
HWRM_FUNC_HOST_PF_IDS_QUERY, -1, -1);
3009
/* To query the info from the host EPs */
3010
switch (fn_info->host) {
3011
case HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_HOST_SOC:
3012
case HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_HOST_EP_0:
3013
case HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_HOST_EP_1:
3014
case HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_HOST_EP_2:
3015
case HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_HOST_EP_3:
3016
req.host = fn_info->host;
3017
break;
3018
default:
3019
req.host = HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_HOST_EP_0;
3020
break;
3021
}
3022
3023
req.filter = fn_info->filter;
3024
if (req.filter > HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_FILTER_ROCE)
3025
req.filter = HWRM_FUNC_HOST_PF_IDS_QUERY_INPUT_FILTER_ALL;
3026
3027
bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp,
3028
sizeof(resp), DFLT_HWRM_CMD_TIMEOUT);
3029
rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg);
3030
3031
3032
*first_pf = le16_to_cpu(resp.first_pf_id);
3033
*pf_mask = le16_to_cpu(resp.pf_ordinal_mask);
3034
3035
return rc;
3036
}
3037
3038
static void bnxt_re_put_stats_ctx(struct bnxt_re_dev *rdev)
3039
{
3040
struct bnxt_qplib_ctx *hctx;
3041
struct bnxt_qplib_res *res;
3042
u16 tid = 0xffff;
3043
3044
res = &rdev->qplib_res;
3045
hctx = res->hctx;
3046
3047
if (test_and_clear_bit(BNXT_RE_FLAG_STATS_CTX_ALLOC, &rdev->flags)) {
3048
bnxt_re_net_stats_ctx_free(rdev, hctx->stats.fw_id, tid);
3049
bnxt_qplib_free_stat_mem(res, &hctx->stats);
3050
}
3051
}
3052
3053
static void bnxt_re_put_stats2_ctx(struct bnxt_re_dev *rdev)
3054
{
3055
test_and_clear_bit(BNXT_RE_FLAG_STATS_CTX2_ALLOC, &rdev->flags);
3056
}
3057
3058
static int bnxt_re_get_stats_ctx(struct bnxt_re_dev *rdev)
3059
{
3060
struct bnxt_qplib_ctx *hctx;
3061
struct bnxt_qplib_res *res;
3062
u16 tid = 0xffff;
3063
int rc;
3064
3065
res = &rdev->qplib_res;
3066
hctx = res->hctx;
3067
3068
rc = bnxt_qplib_alloc_stat_mem(res->pdev, rdev->chip_ctx, &hctx->stats);
3069
if (rc)
3070
return -ENOMEM;
3071
rc = bnxt_re_net_stats_ctx_alloc(rdev, tid);
3072
if (rc)
3073
goto free_stat_mem;
3074
set_bit(BNXT_RE_FLAG_STATS_CTX_ALLOC, &rdev->flags);
3075
3076
return 0;
3077
3078
free_stat_mem:
3079
bnxt_qplib_free_stat_mem(res, &hctx->stats);
3080
3081
return rc;
3082
}
3083
3084
static int bnxt_re_update_dev_attr(struct bnxt_re_dev *rdev)
3085
{
3086
int rc;
3087
3088
rc = bnxt_qplib_get_dev_attr(&rdev->rcfw);
3089
if (rc)
3090
return rc;
3091
if (!bnxt_re_check_min_attr(rdev))
3092
return -EINVAL;
3093
return 0;
3094
}
3095
3096
static void bnxt_re_free_tbls(struct bnxt_re_dev *rdev)
3097
{
3098
bnxt_qplib_clear_tbls(&rdev->qplib_res);
3099
bnxt_qplib_free_tbls(&rdev->qplib_res);
3100
}
3101
3102
static int bnxt_re_alloc_init_tbls(struct bnxt_re_dev *rdev)
3103
{
3104
struct bnxt_qplib_chip_ctx *chip_ctx = rdev->chip_ctx;
3105
u8 pppp_factor = 0;
3106
int rc;
3107
3108
/*
3109
* TODO: Need a better mechanism for spreading of the
3110
* 512 extended PPP pages. For now, spreading it
3111
* based on port_count
3112
*/
3113
if (_is_chip_p7(chip_ctx) && chip_ctx->modes.db_push)
3114
pppp_factor = rdev->en_dev->port_count;
3115
rc = bnxt_qplib_alloc_tbls(&rdev->qplib_res, pppp_factor);
3116
if (rc)
3117
return rc;
3118
bnxt_qplib_init_tbls(&rdev->qplib_res);
3119
set_bit(BNXT_RE_FLAG_TBLS_ALLOCINIT, &rdev->flags);
3120
3121
return 0;
3122
}
3123
3124
static void bnxt_re_clean_nqs(struct bnxt_re_dev *rdev)
3125
{
3126
struct bnxt_qplib_nq *nq;
3127
int i;
3128
3129
if (!rdev->nqr.max_init)
3130
return;
3131
3132
for (i = (rdev->nqr.max_init - 1) ; i >= 0; i--) {
3133
nq = &rdev->nqr.nq[i];
3134
bnxt_qplib_disable_nq(nq);
3135
bnxt_re_net_ring_free(rdev, nq->ring_id);
3136
bnxt_qplib_free_nq_mem(nq);
3137
}
3138
rdev->nqr.max_init = 0;
3139
}
3140
3141
static int bnxt_re_setup_nqs(struct bnxt_re_dev *rdev)
3142
{
3143
struct bnxt_re_ring_attr rattr = {};
3144
struct bnxt_qplib_nq *nq;
3145
int rc, i;
3146
int depth;
3147
u32 offt;
3148
u16 vec;
3149
3150
mutex_init(&rdev->nqr.load_lock);
3151
/*
3152
* TODO: Optimize the depth based on the
3153
* number of NQs.
3154
*/
3155
depth = BNXT_QPLIB_NQE_MAX_CNT;
3156
for (i = 0; i < rdev->nqr.num_msix - 1; i++) {
3157
nq = &rdev->nqr.nq[i];
3158
vec = rdev->nqr.msix_entries[i + 1].vector;
3159
offt = rdev->nqr.msix_entries[i + 1].db_offset;
3160
nq->hwq.max_elements = depth;
3161
rc = bnxt_qplib_alloc_nq_mem(&rdev->qplib_res, nq);
3162
if (rc) {
3163
dev_err(rdev_to_dev(rdev),
3164
"Failed to get mem for NQ %d, rc = 0x%x",
3165
i, rc);
3166
goto fail_mem;
3167
}
3168
3169
rattr.dma_arr = nq->hwq.pbl[PBL_LVL_0].pg_map_arr;
3170
rattr.pages = nq->hwq.pbl[rdev->nqr.nq[i].hwq.level].pg_count;
3171
rattr.type = bnxt_re_get_rtype(rdev);
3172
rattr.mode = HWRM_RING_ALLOC_INPUT_INT_MODE_MSIX;
3173
rattr.depth = nq->hwq.max_elements - 1;
3174
rattr.lrid = rdev->nqr.msix_entries[i + 1].ring_idx;
3175
3176
/* Set DBR pacing capability on the first NQ ring only */
3177
if (!i && bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx))
3178
rattr.flags = HWRM_RING_ALLOC_INPUT_FLAGS_NQ_DBR_PACING;
3179
else
3180
rattr.flags = 0;
3181
3182
rc = bnxt_re_net_ring_alloc(rdev, &rattr, &nq->ring_id);
3183
if (rc) {
3184
nq->ring_id = 0xffff; /* Invalid ring-id */
3185
dev_err(rdev_to_dev(rdev),
3186
"Failed to get fw id for NQ %d, rc = 0x%x",
3187
i, rc);
3188
goto fail_ring;
3189
}
3190
3191
rc = bnxt_qplib_enable_nq(nq, i, vec, offt,
3192
&bnxt_re_cqn_handler,
3193
&bnxt_re_srqn_handler);
3194
if (rc) {
3195
dev_err(rdev_to_dev(rdev),
3196
"Failed to enable NQ %d, rc = 0x%x", i, rc);
3197
goto fail_en;
3198
}
3199
}
3200
3201
rdev->nqr.max_init = i;
3202
return 0;
3203
fail_en:
3204
/* *nq was i'th nq */
3205
bnxt_re_net_ring_free(rdev, nq->ring_id);
3206
fail_ring:
3207
bnxt_qplib_free_nq_mem(nq);
3208
fail_mem:
3209
rdev->nqr.max_init = i;
3210
return rc;
3211
}
3212
3213
static void bnxt_re_sysfs_destroy_file(struct bnxt_re_dev *rdev)
3214
{
3215
int i;
3216
3217
for (i = 0; i < ARRAY_SIZE(bnxt_re_attributes); i++)
3218
device_remove_file(&rdev->ibdev.dev, bnxt_re_attributes[i]);
3219
}
3220
3221
static int bnxt_re_sysfs_create_file(struct bnxt_re_dev *rdev)
3222
{
3223
int i, j, rc = 0;
3224
3225
for (i = 0; i < ARRAY_SIZE(bnxt_re_attributes); i++) {
3226
rc = device_create_file(&rdev->ibdev.dev,
3227
bnxt_re_attributes[i]);
3228
if (rc) {
3229
dev_err(rdev_to_dev(rdev),
3230
"Failed to create IB sysfs with rc = 0x%x", rc);
3231
/* Must clean up all created device files */
3232
for (j = 0; j < i; j++)
3233
device_remove_file(&rdev->ibdev.dev,
3234
bnxt_re_attributes[j]);
3235
clear_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags);
3236
ib_unregister_device(&rdev->ibdev);
3237
return 1;
3238
}
3239
}
3240
return 0;
3241
}
3242
3243
/* worker thread for polling periodic events. Now used for QoS programming*/
3244
static void bnxt_re_worker(struct work_struct *work)
3245
{
3246
struct bnxt_re_dev *rdev = container_of(work, struct bnxt_re_dev,
3247
worker.work);
3248
int rc;
3249
3250
/* QoS is in 30s cadence for PFs*/
3251
if (!rdev->is_virtfn && !rdev->worker_30s--)
3252
rdev->worker_30s = 30;
3253
/* Use trylock for bnxt_re_dev_lock as this can be
3254
* held for long time by debugfs show path while issuing
3255
* HWRMS. If the debugfs name update is not done in this
3256
* iteration, the driver will check for the same in the
3257
* next schedule of the worker i.e after 1 sec.
3258
*/
3259
if (mutex_trylock(&bnxt_re_dev_lock))
3260
mutex_unlock(&bnxt_re_dev_lock);
3261
3262
if (!rdev->stats.stats_query_sec)
3263
goto resched;
3264
3265
if (test_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS, &rdev->flags) &&
3266
(rdev->is_virtfn ||
3267
!_is_ext_stats_supported(rdev->dev_attr->dev_cap_flags))) {
3268
if (!(rdev->stats.stats_query_counter++ %
3269
rdev->stats.stats_query_sec)) {
3270
rc = bnxt_re_get_qos_stats(rdev);
3271
if (rc && rc != -ENOMEM)
3272
clear_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS,
3273
&rdev->flags);
3274
}
3275
}
3276
3277
resched:
3278
schedule_delayed_work(&rdev->worker, msecs_to_jiffies(1000));
3279
}
3280
3281
static int bnxt_re_alloc_dbr_sw_stats_mem(struct bnxt_re_dev *rdev)
3282
{
3283
if (!(rdev->dbr_drop_recov || rdev->dbr_pacing))
3284
return 0;
3285
3286
rdev->dbr_sw_stats = kzalloc(sizeof(*rdev->dbr_sw_stats), GFP_KERNEL);
3287
if (!rdev->dbr_sw_stats)
3288
return -ENOMEM;
3289
3290
return 0;
3291
}
3292
3293
static void bnxt_re_free_dbr_sw_stats_mem(struct bnxt_re_dev *rdev)
3294
{
3295
kfree(rdev->dbr_sw_stats);
3296
rdev->dbr_sw_stats = NULL;
3297
}
3298
3299
static int bnxt_re_initialize_dbr_drop_recov(struct bnxt_re_dev *rdev)
3300
{
3301
rdev->dbr_drop_recov_wq =
3302
create_singlethread_workqueue("bnxt_re_dbr_drop_recov");
3303
if (!rdev->dbr_drop_recov_wq) {
3304
dev_err(rdev_to_dev(rdev), "DBR Drop Revov wq alloc failed!");
3305
return -EINVAL;
3306
}
3307
rdev->dbr_drop_recov = true;
3308
3309
/* Enable configfs setting dbr_drop_recov by default*/
3310
rdev->user_dbr_drop_recov = true;
3311
3312
rdev->user_dbr_drop_recov_timeout = BNXT_RE_DBR_RECOV_USERLAND_TIMEOUT;
3313
return 0;
3314
}
3315
3316
static void bnxt_re_deinitialize_dbr_drop_recov(struct bnxt_re_dev *rdev)
3317
{
3318
if (rdev->dbr_drop_recov_wq) {
3319
flush_workqueue(rdev->dbr_drop_recov_wq);
3320
destroy_workqueue(rdev->dbr_drop_recov_wq);
3321
rdev->dbr_drop_recov_wq = NULL;
3322
}
3323
rdev->dbr_drop_recov = false;
3324
}
3325
3326
static int bnxt_re_initialize_dbr_pacing(struct bnxt_re_dev *rdev)
3327
{
3328
int rc;
3329
3330
/* Allocate a page for app use */
3331
rdev->dbr_page = (void *)__get_free_page(GFP_KERNEL);
3332
if (!rdev->dbr_page) {
3333
dev_err(rdev_to_dev(rdev), "DBR page allocation failed!");
3334
return -ENOMEM;
3335
}
3336
memset((u8 *)rdev->dbr_page, 0, PAGE_SIZE);
3337
rdev->qplib_res.pacing_data = (struct bnxt_qplib_db_pacing_data *)rdev->dbr_page;
3338
rc = bnxt_re_hwrm_dbr_pacing_qcfg(rdev);
3339
if (rc) {
3340
dev_err(rdev_to_dev(rdev),
3341
"Failed to query dbr pacing config %d\n", rc);
3342
goto fail;
3343
}
3344
/* Create a work queue for scheduling dbq event */
3345
rdev->dbq_wq = create_singlethread_workqueue("bnxt_re_dbq");
3346
if (!rdev->dbq_wq) {
3347
dev_err(rdev_to_dev(rdev), "DBQ wq alloc failed!");
3348
rc = -ENOMEM;
3349
goto fail;
3350
}
3351
/* MAP grc window 2 for reading db fifo depth */
3352
writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4, 0,
3353
rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_BASE_MASK);
3354
rdev->dbr_db_fifo_reg_off =
3355
(rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_OFFSET_MASK) +
3356
0x2000;
3357
rdev->qplib_res.pacing_data->grc_reg_offset = rdev->dbr_db_fifo_reg_off;
3358
3359
rdev->dbr_bar_addr =
3360
pci_resource_start(rdev->qplib_res.pdev, 0) +
3361
rdev->dbr_db_fifo_reg_off;
3362
3363
/* Percentage of DB FIFO */
3364
rdev->dbq_watermark = BNXT_RE_PACING_DBQ_THRESHOLD;
3365
rdev->pacing_en_int_th = BNXT_RE_PACING_EN_INT_THRESHOLD;
3366
rdev->pacing_algo_th = BNXT_RE_PACING_ALGO_THRESHOLD;
3367
rdev->dbq_pacing_time = BNXT_RE_DBR_INT_TIME;
3368
rdev->dbr_def_do_pacing = BNXT_RE_DBR_DO_PACING_NO_CONGESTION;
3369
rdev->do_pacing_save = rdev->dbr_def_do_pacing;
3370
bnxt_re_set_default_pacing_data(rdev);
3371
dev_dbg(rdev_to_dev(rdev), "Initialized db pacing\n");
3372
3373
return 0;
3374
fail:
3375
free_page((u64)rdev->dbr_page);
3376
rdev->dbr_page = NULL;
3377
return rc;
3378
}
3379
3380
static void bnxt_re_deinitialize_dbr_pacing(struct bnxt_re_dev *rdev)
3381
{
3382
if (rdev->dbq_wq)
3383
flush_workqueue(rdev->dbq_wq);
3384
3385
cancel_work_sync(&rdev->dbq_fifo_check_work);
3386
cancel_delayed_work_sync(&rdev->dbq_pacing_work);
3387
3388
if (rdev->dbq_wq) {
3389
destroy_workqueue(rdev->dbq_wq);
3390
rdev->dbq_wq = NULL;
3391
}
3392
3393
if (rdev->dbr_page)
3394
free_page((u64)rdev->dbr_page);
3395
rdev->dbr_page = NULL;
3396
rdev->dbr_pacing = false;
3397
}
3398
3399
/* enable_dbr_pacing needs to be done only for older FWs
3400
* where host selects primary function. ie. pacing_ext
3401
* flags is not set.
3402
*/
3403
int bnxt_re_enable_dbr_pacing(struct bnxt_re_dev *rdev)
3404
{
3405
struct bnxt_qplib_nq *nq;
3406
3407
nq = &rdev->nqr.nq[0];
3408
rdev->dbq_nq_id = nq->ring_id;
3409
3410
if (!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx) &&
3411
bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) {
3412
if (bnxt_re_hwrm_dbr_pacing_cfg(rdev, true)) {
3413
dev_err(rdev_to_dev(rdev),
3414
"Failed to set dbr pacing config\n");
3415
return -EIO;
3416
}
3417
/* MAP grc window 8 for ARMing the NQ DBQ */
3418
writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28 , 0,
3419
rdev->chip_ctx->dbr_aeq_arm_reg & BNXT_GRC_BASE_MASK);
3420
rdev->dbr_aeq_arm_reg_off =
3421
(rdev->chip_ctx->dbr_aeq_arm_reg &
3422
BNXT_GRC_OFFSET_MASK) + 0x8000;
3423
writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off , 0, 1);
3424
}
3425
3426
return 0;
3427
}
3428
3429
/* disable_dbr_pacing needs to be done only for older FWs
3430
* where host selects primary function. ie. pacing_ext
3431
* flags is not set.
3432
*/
3433
3434
int bnxt_re_disable_dbr_pacing(struct bnxt_re_dev *rdev)
3435
{
3436
int rc = 0;
3437
3438
if (!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx) &&
3439
bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx))
3440
rc = bnxt_re_hwrm_dbr_pacing_cfg(rdev, false);
3441
3442
return rc;
3443
}
3444
3445
static void bnxt_re_ib_uninit(struct bnxt_re_dev *rdev)
3446
{
3447
if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) {
3448
bnxt_re_sysfs_destroy_file(rdev);
3449
/* Cleanup ib dev */
3450
ib_unregister_device(&rdev->ibdev);
3451
clear_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags);
3452
return;
3453
}
3454
}
3455
3456
static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev, u8 op_type)
3457
{
3458
struct bnxt_qplib_dpi *kdpi;
3459
int rc, wait_count = BNXT_RE_RES_FREE_WAIT_COUNT;
3460
3461
bnxt_re_net_unregister_async_event(rdev);
3462
3463
bnxt_re_put_stats2_ctx(rdev);
3464
if (test_and_clear_bit(BNXT_RE_FLAG_DEV_LIST_INITIALIZED,
3465
&rdev->flags)) {
3466
/* did the caller hold the lock? */
3467
mutex_lock(&bnxt_re_dev_lock);
3468
list_del_rcu(&rdev->list);
3469
mutex_unlock(&bnxt_re_dev_lock);
3470
}
3471
3472
bnxt_re_uninit_resolve_wq(rdev);
3473
bnxt_re_uninit_dcb_wq(rdev);
3474
bnxt_re_uninit_aer_wq(rdev);
3475
3476
bnxt_re_deinitialize_dbr_drop_recov(rdev);
3477
3478
if (bnxt_qplib_dbr_pacing_en(rdev->chip_ctx))
3479
(void)bnxt_re_disable_dbr_pacing(rdev);
3480
3481
if (test_and_clear_bit(BNXT_RE_FLAG_WORKER_REG, &rdev->flags)) {
3482
cancel_delayed_work_sync(&rdev->worker);
3483
}
3484
3485
/* Wait for ULPs to release references */
3486
while (atomic_read(&rdev->stats.rsors.cq_count) && --wait_count)
3487
usleep_range(500, 1000);
3488
if (!wait_count)
3489
dev_err(rdev_to_dev(rdev),
3490
"CQ resources not freed by stack, count = 0x%x",
3491
atomic_read(&rdev->stats.rsors.cq_count));
3492
3493
kdpi = &rdev->dpi_privileged;
3494
if (kdpi->umdbr) { /* kernel DPI was allocated with success */
3495
(void)bnxt_qplib_dealloc_dpi(&rdev->qplib_res, kdpi);
3496
/*
3497
* Driver just need to know no command had failed
3498
* during driver load sequence and below command is
3499
* required indeed. Piggybacking dpi allocation status.
3500
*/
3501
}
3502
3503
/* Protect the device uninitialization and start_irq/stop_irq L2
3504
* callbacks with rtnl lock to avoid race condition between these calls
3505
*/
3506
rtnl_lock();
3507
if (test_and_clear_bit(BNXT_RE_FLAG_SETUP_NQ, &rdev->flags))
3508
bnxt_re_clean_nqs(rdev);
3509
rtnl_unlock();
3510
3511
if (test_and_clear_bit(BNXT_RE_FLAG_TBLS_ALLOCINIT, &rdev->flags))
3512
bnxt_re_free_tbls(rdev);
3513
if (test_and_clear_bit(BNXT_RE_FLAG_RCFW_CHANNEL_INIT, &rdev->flags)) {
3514
rc = bnxt_qplib_deinit_rcfw(&rdev->rcfw);
3515
if (rc)
3516
dev_warn(rdev_to_dev(rdev),
3517
"Failed to deinitialize fw, rc = 0x%x", rc);
3518
}
3519
3520
bnxt_re_put_stats_ctx(rdev);
3521
3522
if (test_and_clear_bit(BNXT_RE_FLAG_ALLOC_CTX, &rdev->flags))
3523
bnxt_qplib_free_hwctx(&rdev->qplib_res);
3524
3525
rtnl_lock();
3526
if (test_and_clear_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags))
3527
bnxt_qplib_disable_rcfw_channel(&rdev->rcfw);
3528
3529
if (rdev->dbr_pacing)
3530
bnxt_re_deinitialize_dbr_pacing(rdev);
3531
3532
bnxt_re_free_dbr_sw_stats_mem(rdev);
3533
3534
if (test_and_clear_bit(BNXT_RE_FLAG_NET_RING_ALLOC, &rdev->flags))
3535
bnxt_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id);
3536
3537
if (test_and_clear_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags))
3538
bnxt_qplib_free_rcfw_channel(&rdev->qplib_res);
3539
3540
if (test_and_clear_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags))
3541
bnxt_re_free_msix(rdev);
3542
rtnl_unlock();
3543
3544
bnxt_re_destroy_chip_ctx(rdev);
3545
3546
if (op_type != BNXT_RE_PRE_RECOVERY_REMOVE) {
3547
if (test_and_clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED,
3548
&rdev->flags))
3549
bnxt_re_unregister_netdev(rdev);
3550
}
3551
}
3552
3553
static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
3554
{
3555
struct bnxt_re_ring_attr rattr = {};
3556
struct bnxt_qplib_creq_ctx *creq;
3557
int vec, offset;
3558
int rc = 0;
3559
3560
if (op_type != BNXT_RE_POST_RECOVERY_INIT) {
3561
/* Registered a new RoCE device instance to netdev */
3562
rc = bnxt_re_register_netdev(rdev);
3563
if (rc)
3564
return -EINVAL;
3565
}
3566
set_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
3567
3568
rc = bnxt_re_setup_chip_ctx(rdev);
3569
if (rc) {
3570
dev_err(rdev_to_dev(rdev), "Failed to get chip context rc 0x%x", rc);
3571
bnxt_re_unregister_netdev(rdev);
3572
clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
3573
rc = -EINVAL;
3574
return rc;
3575
}
3576
3577
/* Protect the device initialization and start_irq/stop_irq L2 callbacks
3578
* with rtnl lock to avoid race condition between these calls
3579
*/
3580
rtnl_lock();
3581
rc = bnxt_re_request_msix(rdev);
3582
if (rc) {
3583
dev_err(rdev_to_dev(rdev),
3584
"Requesting MSI-X vectors failed with rc = 0x%x", rc);
3585
rc = -EINVAL;
3586
goto release_rtnl;
3587
}
3588
set_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags);
3589
3590
/* Establish RCFW Communication Channel to initialize the context
3591
memory for the function and all child VFs */
3592
rc = bnxt_qplib_alloc_rcfw_channel(&rdev->qplib_res);
3593
if (rc) {
3594
dev_err(rdev_to_dev(rdev),
3595
"Failed to alloc mem for rcfw, rc = %#x\n", rc);
3596
goto release_rtnl;
3597
}
3598
set_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags);
3599
3600
creq = &rdev->rcfw.creq;
3601
rattr.dma_arr = creq->hwq.pbl[PBL_LVL_0].pg_map_arr;
3602
rattr.pages = creq->hwq.pbl[creq->hwq.level].pg_count;
3603
rattr.type = bnxt_re_get_rtype(rdev);
3604
rattr.mode = HWRM_RING_ALLOC_INPUT_INT_MODE_MSIX;
3605
rattr.depth = BNXT_QPLIB_CREQE_MAX_CNT - 1;
3606
rattr.lrid = rdev->nqr.msix_entries[BNXT_RE_AEQ_IDX].ring_idx;
3607
rc = bnxt_re_net_ring_alloc(rdev, &rattr, &creq->ring_id);
3608
if (rc) {
3609
creq->ring_id = 0xffff;
3610
dev_err(rdev_to_dev(rdev),
3611
"Failed to allocate CREQ fw id with rc = 0x%x", rc);
3612
goto release_rtnl;
3613
}
3614
3615
set_bit(BNXT_RE_FLAG_NET_RING_ALLOC, &rdev->flags);
3616
3617
if (!rdev->chip_ctx)
3618
goto release_rtnl;
3619
3620
if (!(_is_chip_p7(rdev->chip_ctx))) {
3621
/* Program the NQ ID for DBQ notification */
3622
if (rdev->chip_ctx->modes.dbr_pacing_v0 ||
3623
bnxt_qplib_dbr_pacing_en(rdev->chip_ctx) ||
3624
bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) {
3625
rc = bnxt_re_initialize_dbr_pacing(rdev);
3626
if (!rc)
3627
rdev->dbr_pacing = true;
3628
else
3629
rdev->dbr_pacing = false;
3630
dev_dbg(rdev_to_dev(rdev), "%s: initialize db pacing ret %d\n",
3631
__func__, rc);
3632
}
3633
}
3634
3635
vec = rdev->nqr.msix_entries[BNXT_RE_AEQ_IDX].vector;
3636
offset = rdev->nqr.msix_entries[BNXT_RE_AEQ_IDX].db_offset;
3637
rc = bnxt_qplib_enable_rcfw_channel(&rdev->rcfw, vec, offset,
3638
&bnxt_re_aeq_handler);
3639
if (rc) {
3640
dev_err(rdev_to_dev(rdev),
3641
"Failed to enable RCFW channel with rc = 0x%x", rc);
3642
goto release_rtnl;
3643
}
3644
set_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags);
3645
3646
rc = bnxt_re_update_dev_attr(rdev);
3647
if (rc)
3648
goto release_rtnl;
3649
bnxt_re_set_resource_limits(rdev);
3650
if (!rdev->is_virtfn && !_is_chip_gen_p5_p7(rdev->chip_ctx)) {
3651
rc = bnxt_qplib_alloc_hwctx(&rdev->qplib_res);
3652
if (rc) {
3653
dev_err(rdev_to_dev(rdev),
3654
"Failed to alloc hw contexts, rc = 0x%x", rc);
3655
goto release_rtnl;
3656
}
3657
set_bit(BNXT_RE_FLAG_ALLOC_CTX, &rdev->flags);
3658
}
3659
3660
rc = bnxt_re_get_stats_ctx(rdev);
3661
if (rc)
3662
goto release_rtnl;
3663
3664
rc = bnxt_qplib_init_rcfw(&rdev->rcfw, rdev->is_virtfn);
3665
if (rc) {
3666
dev_err(rdev_to_dev(rdev),
3667
"Failed to initialize fw with rc = 0x%x", rc);
3668
goto release_rtnl;
3669
}
3670
set_bit(BNXT_RE_FLAG_RCFW_CHANNEL_INIT, &rdev->flags);
3671
3672
/* Based resource count on the 'new' device caps */
3673
rc = bnxt_re_update_dev_attr(rdev);
3674
if (rc)
3675
goto release_rtnl;
3676
rc = bnxt_re_alloc_init_tbls(rdev);
3677
if (rc) {
3678
dev_err(rdev_to_dev(rdev), "tbls alloc-init failed rc = %#x",
3679
rc);
3680
goto release_rtnl;
3681
}
3682
rc = bnxt_re_setup_nqs(rdev);
3683
if (rc) {
3684
dev_err(rdev_to_dev(rdev), "NQs alloc-init failed rc = %#x\n",
3685
rc);
3686
if (rdev->nqr.max_init == 0)
3687
goto release_rtnl;
3688
3689
dev_warn(rdev_to_dev(rdev),
3690
"expected nqs %d available nqs %d\n",
3691
rdev->nqr.num_msix, rdev->nqr.max_init);
3692
}
3693
set_bit(BNXT_RE_FLAG_SETUP_NQ, &rdev->flags);
3694
rtnl_unlock();
3695
3696
rc = bnxt_qplib_alloc_dpi(&rdev->qplib_res, &rdev->dpi_privileged,
3697
rdev, BNXT_QPLIB_DPI_TYPE_KERNEL);
3698
if (rc)
3699
goto fail;
3700
3701
if (rdev->dbr_pacing)
3702
bnxt_re_enable_dbr_pacing(rdev);
3703
3704
if (rdev->chip_ctx->modes.dbr_drop_recov)
3705
bnxt_re_initialize_dbr_drop_recov(rdev);
3706
3707
rc = bnxt_re_alloc_dbr_sw_stats_mem(rdev);
3708
if (rc)
3709
goto fail;
3710
3711
/* This block of code is needed for error recovery support */
3712
if (!rdev->is_virtfn) {
3713
struct bnxt_re_tc_rec *tc_rec;
3714
3715
tc_rec = &rdev->tc_rec[0];
3716
rc = bnxt_re_query_hwrm_qportcfg(rdev, tc_rec, 0xFFFF);
3717
if (rc) {
3718
dev_err(rdev_to_dev(rdev),
3719
"Failed to query port config rc:%d", rc);
3720
return rc;
3721
}
3722
3723
/* Query f/w defaults of CC params */
3724
rc = bnxt_qplib_query_cc_param(&rdev->qplib_res, &rdev->cc_param);
3725
if (rc)
3726
dev_warn(rdev_to_dev(rdev),
3727
"Failed to query CC defaults\n");
3728
if (1) {
3729
rdev->num_vfs = pci_num_vf(rdev->en_dev->pdev);
3730
if (rdev->num_vfs) {
3731
bnxt_re_set_resource_limits(rdev);
3732
bnxt_qplib_set_func_resources(&rdev->qplib_res);
3733
}
3734
}
3735
}
3736
INIT_DELAYED_WORK(&rdev->worker, bnxt_re_worker);
3737
set_bit(BNXT_RE_FLAG_WORKER_REG, &rdev->flags);
3738
schedule_delayed_work(&rdev->worker, msecs_to_jiffies(1000));
3739
3740
bnxt_re_init_dcb_wq(rdev);
3741
bnxt_re_init_aer_wq(rdev);
3742
bnxt_re_init_resolve_wq(rdev);
3743
mutex_lock(&bnxt_re_dev_lock);
3744
list_add_tail_rcu(&rdev->list, &bnxt_re_dev_list);
3745
/* Added to the list, not in progress anymore */
3746
gadd_dev_inprogress--;
3747
set_bit(BNXT_RE_FLAG_DEV_LIST_INITIALIZED, &rdev->flags);
3748
mutex_unlock(&bnxt_re_dev_lock);
3749
3750
3751
return rc;
3752
release_rtnl:
3753
rtnl_unlock();
3754
fail:
3755
bnxt_re_dev_uninit(rdev, BNXT_RE_COMPLETE_REMOVE);
3756
3757
return rc;
3758
}
3759
3760
static int bnxt_re_ib_init(struct bnxt_re_dev *rdev)
3761
{
3762
int rc = 0;
3763
3764
rc = bnxt_re_register_ib(rdev);
3765
if (rc) {
3766
dev_err(rdev_to_dev(rdev),
3767
"Register IB failed with rc = 0x%x", rc);
3768
goto fail;
3769
}
3770
if (bnxt_re_sysfs_create_file(rdev)) {
3771
bnxt_re_stopqps_and_ib_uninit(rdev);
3772
goto fail;
3773
}
3774
3775
set_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags);
3776
set_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags);
3777
set_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS, &rdev->flags);
3778
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_PORT_ACTIVE);
3779
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_GID_CHANGE);
3780
3781
return rc;
3782
fail:
3783
bnxt_re_dev_uninit(rdev, BNXT_RE_COMPLETE_REMOVE);
3784
return rc;
3785
}
3786
3787
/* wrapper for ib_init funcs */
3788
int _bnxt_re_ib_init(struct bnxt_re_dev *rdev)
3789
{
3790
return bnxt_re_ib_init(rdev);
3791
}
3792
3793
/* wrapper for aux init funcs */
3794
int _bnxt_re_ib_init2(struct bnxt_re_dev *rdev)
3795
{
3796
bnxt_re_ib_init_2(rdev);
3797
return 0; /* add return for future proof */
3798
}
3799
3800
static void bnxt_re_dev_unreg(struct bnxt_re_dev *rdev)
3801
{
3802
bnxt_re_dev_dealloc(rdev);
3803
}
3804
3805
3806
static int bnxt_re_dev_reg(struct bnxt_re_dev **rdev, struct ifnet *netdev,
3807
struct bnxt_en_dev *en_dev)
3808
{
3809
struct ifnet *realdev = NULL;
3810
3811
realdev = netdev;
3812
if (realdev)
3813
dev_dbg(NULL, "%s: realdev = %p netdev = %p\n", __func__,
3814
realdev, netdev);
3815
/*
3816
* Note:
3817
* The first argument to bnxt_re_dev_alloc() is 'netdev' and
3818
* not 'realdev', since in the case of bonding we want to
3819
* register the bonded virtual netdev (master) to the ib stack.
3820
* And 'en_dev' (for L2/PCI communication) is the first slave
3821
* device (PF0 on the card).
3822
* In the case of a regular netdev, both netdev and the en_dev
3823
* correspond to the same device.
3824
*/
3825
*rdev = bnxt_re_dev_alloc(netdev, en_dev);
3826
if (!*rdev) {
3827
pr_err("%s: netdev %p not handled",
3828
ROCE_DRV_MODULE_NAME, netdev);
3829
return -ENOMEM;
3830
}
3831
bnxt_re_hold(*rdev);
3832
3833
return 0;
3834
}
3835
3836
void bnxt_re_get_link_speed(struct bnxt_re_dev *rdev)
3837
{
3838
rdev->espeed = rdev->en_dev->espeed;
3839
rdev->lanes = rdev->en_dev->lanes;
3840
return;
3841
}
3842
3843
void bnxt_re_stopqps_and_ib_uninit(struct bnxt_re_dev *rdev)
3844
{
3845
dev_dbg(rdev_to_dev(rdev), "%s: Stopping QPs, IB uninit on rdev: %p\n",
3846
__func__, rdev);
3847
bnxt_re_stop_all_nonqp1_nonshadow_qps(rdev);
3848
bnxt_re_ib_uninit(rdev);
3849
}
3850
3851
void bnxt_re_remove_device(struct bnxt_re_dev *rdev, u8 op_type,
3852
struct auxiliary_device *aux_dev)
3853
{
3854
struct bnxt_re_en_dev_info *en_info;
3855
struct bnxt_qplib_cmdq_ctx *cmdq;
3856
struct bnxt_qplib_rcfw *rcfw;
3857
3858
rcfw = &rdev->rcfw;
3859
cmdq = &rcfw->cmdq;
3860
if (test_bit(FIRMWARE_STALL_DETECTED, &cmdq->flags))
3861
set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
3862
3863
dev_dbg(rdev_to_dev(rdev), "%s: Removing rdev: %p\n", __func__, rdev);
3864
bnxt_re_dev_uninit(rdev, op_type);
3865
en_info = auxiliary_get_drvdata(aux_dev);
3866
if (en_info) {
3867
rtnl_lock();
3868
en_info->rdev = NULL;
3869
rtnl_unlock();
3870
if (op_type != BNXT_RE_PRE_RECOVERY_REMOVE) {
3871
clear_bit(BNXT_RE_FLAG_EN_DEV_PRIMARY_DEV, &en_info->flags);
3872
clear_bit(BNXT_RE_FLAG_EN_DEV_SECONDARY_DEV, &en_info->flags);
3873
clear_bit(BNXT_RE_FLAG_EN_DEV_NETDEV_REG, &en_info->flags);
3874
}
3875
}
3876
bnxt_re_dev_unreg(rdev);
3877
}
3878
3879
int bnxt_re_add_device(struct bnxt_re_dev **rdev,
3880
struct ifnet *netdev,
3881
u8 qp_mode, u8 op_type,
3882
u32 num_msix_requested,
3883
struct auxiliary_device *aux_dev)
3884
{
3885
struct bnxt_re_en_dev_info *en_info;
3886
struct bnxt_en_dev *en_dev;
3887
int rc = 0;
3888
3889
en_info = auxiliary_get_drvdata(aux_dev);
3890
en_dev = en_info->en_dev;
3891
3892
mutex_lock(&bnxt_re_dev_lock);
3893
/* Check if driver already in mod exit and aux_dev is valid */
3894
if (gmod_exit || !aux_dev) {
3895
mutex_unlock(&bnxt_re_dev_lock);
3896
return -ENODEV;
3897
}
3898
/* Add device in progress */
3899
gadd_dev_inprogress++;
3900
mutex_unlock(&bnxt_re_dev_lock);
3901
3902
rc = bnxt_re_dev_reg(rdev, netdev, en_dev);
3903
if (rc) {
3904
dev_dbg(NULL, "Failed to create add device for netdev %p\n",
3905
netdev);
3906
/*
3907
* For BNXT_RE_POST_RECOVERY_INIT special case
3908
* called from bnxt_re_start, the work is
3909
* complete only after, bnxt_re_start completes
3910
* bnxt_unregister_device in case of failure.
3911
* So bnxt_re_start will decrement gadd_dev_inprogress
3912
* in case of failure.
3913
*/
3914
if (op_type != BNXT_RE_POST_RECOVERY_INIT) {
3915
mutex_lock(&bnxt_re_dev_lock);
3916
gadd_dev_inprogress--;
3917
mutex_unlock(&bnxt_re_dev_lock);
3918
}
3919
return rc;
3920
}
3921
3922
if (rc != 0)
3923
goto ref_error;
3924
3925
/*
3926
* num_msix_requested = BNXT_RE_MSIX_FROM_MOD_PARAM indicates fresh driver load.
3927
* Otherwaise, this invocation can be the result of lag create / destroy,
3928
* err revovery, hot fw upgrade, etc..
3929
*/
3930
if (num_msix_requested == BNXT_RE_MSIX_FROM_MOD_PARAM) {
3931
if (bnxt_re_probe_count < BNXT_RE_MAX_DEVICES)
3932
num_msix_requested = max_msix_vec[bnxt_re_probe_count++];
3933
else
3934
/* Consider as default when probe_count exceeds its limit */
3935
num_msix_requested = 0;
3936
3937
/* if user specifies only one value, use the same for all PFs */
3938
if (max_msix_vec_argc == 1)
3939
num_msix_requested = max_msix_vec[0];
3940
}
3941
3942
(*rdev)->num_msix_requested = num_msix_requested;
3943
(*rdev)->gsi_ctx.gsi_qp_mode = qp_mode;
3944
(*rdev)->adev = aux_dev;
3945
(*rdev)->dev_addr = en_dev->softc->func.mac_addr;
3946
/* Before updating the rdev pointer in bnxt_re_en_dev_info structure,
3947
* take the rtnl lock to avoid accessing invalid rdev pointer from
3948
* L2 ULP callbacks. This is applicable in all the places where rdev
3949
* pointer is updated in bnxt_re_en_dev_info.
3950
*/
3951
rtnl_lock();
3952
en_info->rdev = *rdev;
3953
rtnl_unlock();
3954
rc = bnxt_re_dev_init(*rdev, op_type);
3955
if (rc) {
3956
ref_error:
3957
bnxt_re_dev_unreg(*rdev);
3958
*rdev = NULL;
3959
/*
3960
* For BNXT_RE_POST_RECOVERY_INIT special case
3961
* called from bnxt_re_start, the work is
3962
* complete only after, bnxt_re_start completes
3963
* bnxt_unregister_device in case of failure.
3964
* So bnxt_re_start will decrement gadd_dev_inprogress
3965
* in case of failure.
3966
*/
3967
if (op_type != BNXT_RE_POST_RECOVERY_INIT) {
3968
mutex_lock(&bnxt_re_dev_lock);
3969
gadd_dev_inprogress--;
3970
mutex_unlock(&bnxt_re_dev_lock);
3971
}
3972
}
3973
dev_dbg(rdev_to_dev(*rdev), "%s: Adding rdev: %p\n", __func__, *rdev);
3974
if (!rc) {
3975
set_bit(BNXT_RE_FLAG_EN_DEV_NETDEV_REG, &en_info->flags);
3976
}
3977
return rc;
3978
}
3979
3980
struct bnxt_re_dev *bnxt_re_get_peer_pf(struct bnxt_re_dev *rdev)
3981
{
3982
struct pci_dev *pdev_in = rdev->en_dev->pdev;
3983
int tmp_bus_num, bus_num = pdev_in->bus->number;
3984
int tmp_dev_num, dev_num = PCI_SLOT(pdev_in->devfn);
3985
int tmp_func_num, func_num = PCI_FUNC(pdev_in->devfn);
3986
struct bnxt_re_dev *tmp_rdev;
3987
3988
rcu_read_lock();
3989
list_for_each_entry_rcu(tmp_rdev, &bnxt_re_dev_list, list) {
3990
tmp_bus_num = tmp_rdev->en_dev->pdev->bus->number;
3991
tmp_dev_num = PCI_SLOT(tmp_rdev->en_dev->pdev->devfn);
3992
tmp_func_num = PCI_FUNC(tmp_rdev->en_dev->pdev->devfn);
3993
3994
if (bus_num == tmp_bus_num && dev_num == tmp_dev_num &&
3995
func_num != tmp_func_num) {
3996
rcu_read_unlock();
3997
return tmp_rdev;
3998
}
3999
}
4000
rcu_read_unlock();
4001
return NULL;
4002
}
4003
4004
4005
int bnxt_re_schedule_work(struct bnxt_re_dev *rdev, unsigned long event,
4006
struct ifnet *vlan_dev,
4007
struct ifnet *netdev,
4008
struct auxiliary_device *adev)
4009
{
4010
struct bnxt_re_work *re_work;
4011
4012
/* Allocate for the deferred task */
4013
re_work = kzalloc(sizeof(*re_work), GFP_KERNEL);
4014
if (!re_work)
4015
return -ENOMEM;
4016
4017
re_work->rdev = rdev;
4018
re_work->event = event;
4019
re_work->vlan_dev = vlan_dev;
4020
re_work->adev = adev;
4021
INIT_WORK(&re_work->work, bnxt_re_task);
4022
if (rdev)
4023
atomic_inc(&rdev->sched_count);
4024
re_work->netdev = netdev;
4025
queue_work(bnxt_re_wq, &re_work->work);
4026
4027
return 0;
4028
}
4029
4030
4031
int bnxt_re_get_slot_pf_count(struct bnxt_re_dev *rdev)
4032
{
4033
struct pci_dev *pdev_in = rdev->en_dev->pdev;
4034
int tmp_bus_num, bus_num = pdev_in->bus->number;
4035
int tmp_dev_num, dev_num = PCI_SLOT(pdev_in->devfn);
4036
struct bnxt_re_dev *tmp_rdev;
4037
int pf_cnt = 0;
4038
4039
rcu_read_lock();
4040
list_for_each_entry_rcu(tmp_rdev, &bnxt_re_dev_list, list) {
4041
tmp_bus_num = tmp_rdev->en_dev->pdev->bus->number;
4042
tmp_dev_num = PCI_SLOT(tmp_rdev->en_dev->pdev->devfn);
4043
4044
if (bus_num == tmp_bus_num && dev_num == tmp_dev_num)
4045
pf_cnt++;
4046
}
4047
rcu_read_unlock();
4048
return pf_cnt;
4049
}
4050
4051
/* Handle all deferred netevents tasks */
4052
static void bnxt_re_task(struct work_struct *work)
4053
{
4054
struct bnxt_re_en_dev_info *en_info;
4055
struct auxiliary_device *aux_dev;
4056
struct bnxt_re_work *re_work;
4057
struct bnxt_re_dev *rdev;
4058
4059
re_work = container_of(work, struct bnxt_re_work, work);
4060
4061
mutex_lock(&bnxt_re_mutex);
4062
rdev = re_work->rdev;
4063
4064
/*
4065
* If the previous rdev is deleted due to bond creation
4066
* do not handle the event
4067
*/
4068
if (!bnxt_re_is_rdev_valid(rdev))
4069
goto exit;
4070
4071
/* Ignore the event, if the device is not registred with IB stack. This
4072
* is to avoid handling any event while the device is added/removed.
4073
*/
4074
if (rdev && !test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) {
4075
dev_dbg(rdev_to_dev(rdev), "%s: Ignoring netdev event 0x%lx",
4076
__func__, re_work->event);
4077
goto done;
4078
}
4079
4080
/* Extra check to silence coverity. We shouldn't handle any event
4081
* when rdev is NULL.
4082
*/
4083
if (!rdev)
4084
goto exit;
4085
4086
dev_dbg(rdev_to_dev(rdev), "Scheduled work for event 0x%lx",
4087
re_work->event);
4088
4089
switch (re_work->event) {
4090
case NETDEV_UP:
4091
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,
4092
IB_EVENT_PORT_ACTIVE);
4093
bnxt_re_net_register_async_event(rdev);
4094
break;
4095
4096
case NETDEV_DOWN:
4097
bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 0);
4098
bnxt_re_stop_all_nonqp1_nonshadow_qps(rdev);
4099
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,
4100
IB_EVENT_PORT_ERR);
4101
break;
4102
4103
case NETDEV_CHANGE:
4104
if (bnxt_re_get_link_state(rdev) == IB_PORT_DOWN) {
4105
bnxt_re_stop_all_nonqp1_nonshadow_qps(rdev);
4106
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,
4107
IB_EVENT_PORT_ERR);
4108
break;
4109
} else if (bnxt_re_get_link_state(rdev) == IB_PORT_ACTIVE) {
4110
bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,
4111
IB_EVENT_PORT_ACTIVE);
4112
}
4113
4114
/* temporarily disable the check for SR2 */
4115
if (!bnxt_qplib_query_cc_param(&rdev->qplib_res,
4116
&rdev->cc_param) &&
4117
!_is_chip_p7(rdev->chip_ctx)) {
4118
/*
4119
* Disable CC for 10G speed
4120
* for non p5 devices
4121
*/
4122
if (rdev->sl_espeed == SPEED_10000 &&
4123
!_is_chip_gen_p5_p7(rdev->chip_ctx)) {
4124
if (rdev->cc_param.enable)
4125
bnxt_re_clear_cc(rdev);
4126
} else {
4127
if (!rdev->cc_param.enable &&
4128
rdev->cc_param.admin_enable)
4129
bnxt_re_setup_cc(rdev);
4130
}
4131
}
4132
break;
4133
4134
case NETDEV_UNREGISTER:
4135
bnxt_re_stopqps_and_ib_uninit(rdev);
4136
aux_dev = rdev->adev;
4137
if (re_work->adev)
4138
goto done;
4139
4140
bnxt_re_remove_device(rdev, BNXT_RE_COMPLETE_REMOVE, aux_dev);
4141
4142
break;
4143
4144
default:
4145
break;
4146
}
4147
done:
4148
if (rdev) {
4149
/* memory barrier to guarantee task completion
4150
* before decrementing sched count
4151
*/
4152
mmiowb();
4153
atomic_dec(&rdev->sched_count);
4154
}
4155
exit:
4156
if (re_work->adev && re_work->event == NETDEV_UNREGISTER) {
4157
en_info = auxiliary_get_drvdata(re_work->adev);
4158
en_info->ib_uninit_done = true;
4159
wake_up(&en_info->waitq);
4160
}
4161
kfree(re_work);
4162
mutex_unlock(&bnxt_re_mutex);
4163
}
4164
4165
/*
4166
"Notifier chain callback can be invoked for the same chain from
4167
different CPUs at the same time".
4168
4169
For cases when the netdev is already present, our call to the
4170
register_netdevice_notifier() will actually get the rtnl_lock()
4171
before sending NETDEV_REGISTER and (if up) NETDEV_UP
4172
events.
4173
4174
But for cases when the netdev is not already present, the notifier
4175
chain is subjected to be invoked from different CPUs simultaneously.
4176
4177
This is protected by the netdev_mutex.
4178
*/
4179
static int bnxt_re_netdev_event(struct notifier_block *notifier,
4180
unsigned long event, void *ptr)
4181
{
4182
struct ifnet *real_dev, *netdev;
4183
struct bnxt_re_dev *rdev = NULL;
4184
4185
netdev = netdev_notifier_info_to_ifp(ptr);
4186
real_dev = rdma_vlan_dev_real_dev(netdev);
4187
if (!real_dev)
4188
real_dev = netdev;
4189
/* In case of bonding,this will be bond's rdev */
4190
rdev = bnxt_re_from_netdev(real_dev);
4191
4192
if (!rdev)
4193
goto exit;
4194
4195
dev_info(rdev_to_dev(rdev), "%s: Event = %s (0x%lx), rdev %s (real_dev %s)\n",
4196
__func__, bnxt_re_netevent(event), event,
4197
rdev ? rdev->netdev ? if_getdname(rdev->netdev) : "->netdev = NULL" : "= NULL",
4198
(real_dev == netdev) ? "= netdev" : if_getdname(real_dev));
4199
4200
if (!test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags))
4201
goto exit;
4202
4203
bnxt_re_hold(rdev);
4204
4205
if (real_dev != netdev) {
4206
switch (event) {
4207
case NETDEV_UP:
4208
bnxt_re_schedule_work(rdev, event, netdev,
4209
NULL, NULL);
4210
break;
4211
case NETDEV_DOWN:
4212
break;
4213
default:
4214
break;
4215
}
4216
goto done;
4217
}
4218
4219
switch (event) {
4220
case NETDEV_CHANGEADDR:
4221
if (!_is_chip_gen_p5_p7(rdev->chip_ctx))
4222
bnxt_re_update_shadow_ah(rdev);
4223
bnxt_qplib_get_guid(rdev->dev_addr,
4224
(u8 *)&rdev->ibdev.node_guid);
4225
break;
4226
4227
case NETDEV_CHANGE:
4228
bnxt_re_get_link_speed(rdev);
4229
bnxt_re_schedule_work(rdev, event, NULL, NULL, NULL);
4230
break;
4231
case NETDEV_UNREGISTER:
4232
/* netdev notifier will call NETDEV_UNREGISTER again later since
4233
* we are still holding the reference to the netdev
4234
*/
4235
4236
/*
4237
* Workaround to avoid ib_unregister hang. Check for module
4238
* reference and dont free up the device if the reference
4239
* is non zero. Checking only for PF functions.
4240
*/
4241
4242
if (rdev) {
4243
dev_info(rdev_to_dev(rdev),
4244
"bnxt_re:Unreg recvd when module refcnt > 0");
4245
dev_info(rdev_to_dev(rdev),
4246
"bnxt_re:Close all apps using bnxt_re devs");
4247
dev_info(rdev_to_dev(rdev),
4248
"bnxt_re:Remove the configfs entry created for the device");
4249
dev_info(rdev_to_dev(rdev),
4250
"bnxt_re:Refer documentation for details");
4251
goto done;
4252
}
4253
4254
if (atomic_read(&rdev->sched_count) > 0)
4255
goto done;
4256
if (!rdev->unreg_sched) {
4257
bnxt_re_schedule_work(rdev, NETDEV_UNREGISTER,
4258
NULL, NULL, NULL);
4259
rdev->unreg_sched = true;
4260
goto done;
4261
}
4262
4263
break;
4264
default:
4265
break;
4266
}
4267
done:
4268
if (rdev)
4269
bnxt_re_put(rdev);
4270
exit:
4271
return NOTIFY_DONE;
4272
}
4273
4274
static struct notifier_block bnxt_re_netdev_notifier = {
4275
.notifier_call = bnxt_re_netdev_event
4276
};
4277
4278
static void bnxt_re_remove_base_interface(struct bnxt_re_dev *rdev,
4279
struct auxiliary_device *adev)
4280
{
4281
bnxt_re_stopqps_and_ib_uninit(rdev);
4282
bnxt_re_remove_device(rdev, BNXT_RE_COMPLETE_REMOVE, adev);
4283
auxiliary_set_drvdata(adev, NULL);
4284
}
4285
4286
/*
4287
* bnxt_re_remove - Removes the roce aux device
4288
* @adev - aux device pointer
4289
*
4290
* This function removes the roce device. This gets
4291
* called in the mod exit path and pci unbind path.
4292
* If the rdev is bond interace, destroys the lag
4293
* in module exit path, and in pci unbind case
4294
* destroys the lag and recreates other base interface.
4295
* If the device is already removed in error recovery
4296
* path, it just unregister with the L2.
4297
*/
4298
static void bnxt_re_remove(struct auxiliary_device *adev)
4299
{
4300
struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(adev);
4301
struct bnxt_en_dev *en_dev;
4302
struct bnxt_re_dev *rdev;
4303
bool primary_dev = false;
4304
bool secondary_dev = false;
4305
4306
if (!en_info)
4307
return;
4308
4309
mutex_lock(&bnxt_re_mutex);
4310
en_dev = en_info->en_dev;
4311
4312
rdev = en_info->rdev;
4313
4314
if (rdev && bnxt_re_is_rdev_valid(rdev)) {
4315
if (pci_channel_offline(rdev->rcfw.pdev))
4316
set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
4317
4318
if (test_bit(BNXT_RE_FLAG_EN_DEV_PRIMARY_DEV, &en_info->flags))
4319
primary_dev = true;
4320
if (test_bit(BNXT_RE_FLAG_EN_DEV_SECONDARY_DEV, &en_info->flags))
4321
secondary_dev = true;
4322
4323
/*
4324
* en_dev_info of primary device and secondary device have the
4325
* same rdev pointer when LAG is configured. This rdev pointer
4326
* is rdev of bond interface.
4327
*/
4328
if (!primary_dev && !secondary_dev) {
4329
/* removal of non bond interface */
4330
bnxt_re_remove_base_interface(rdev, adev);
4331
} else {
4332
/*
4333
* removal of bond primary/secondary interface. In this
4334
* case bond device is already removed, so rdev->binfo
4335
* is NULL.
4336
*/
4337
auxiliary_set_drvdata(adev, NULL);
4338
}
4339
} else {
4340
/* device is removed from ulp stop, unregister the net dev */
4341
if (test_bit(BNXT_RE_FLAG_EN_DEV_NETDEV_REG, &en_info->flags)) {
4342
rtnl_lock();
4343
en_dev->en_ops->bnxt_unregister_device(en_dev,
4344
BNXT_ROCE_ULP);
4345
rtnl_unlock();
4346
}
4347
}
4348
mutex_unlock(&bnxt_re_mutex);
4349
return;
4350
}
4351
4352
/* wrapper for all external user context callers */
4353
void _bnxt_re_remove(struct auxiliary_device *adev)
4354
{
4355
bnxt_re_remove(adev);
4356
}
4357
4358
static void bnxt_re_ib_init_2(struct bnxt_re_dev *rdev)
4359
{
4360
int rc;
4361
4362
rc = bnxt_re_get_device_stats(rdev);
4363
if (rc)
4364
dev_err(rdev_to_dev(rdev),
4365
"Failed initial device stat query");
4366
4367
bnxt_re_net_register_async_event(rdev);
4368
}
4369
4370
static int bnxt_re_probe(struct auxiliary_device *adev,
4371
const struct auxiliary_device_id *id)
4372
{
4373
struct bnxt_aux_dev *aux_dev =
4374
container_of(adev, struct bnxt_aux_dev, aux_dev);
4375
struct bnxt_re_en_dev_info *en_info;
4376
struct bnxt_en_dev *en_dev = NULL;
4377
struct bnxt_re_dev *rdev;
4378
int rc = -ENODEV;
4379
4380
if (aux_dev)
4381
en_dev = aux_dev->edev;
4382
4383
if (!en_dev)
4384
return rc;
4385
4386
if (en_dev->ulp_version != BNXT_ULP_VERSION) {
4387
pr_err("%s: probe error: bnxt_en ulp version magic %x is not compatible!\n",
4388
ROCE_DRV_MODULE_NAME, en_dev->ulp_version);
4389
return -EINVAL;
4390
}
4391
4392
en_info = kzalloc(sizeof(*en_info), GFP_KERNEL);
4393
if (!en_info)
4394
return -ENOMEM;
4395
memset(en_info, 0, sizeof(struct bnxt_re_en_dev_info));
4396
en_info->en_dev = en_dev;
4397
auxiliary_set_drvdata(adev, en_info);
4398
4399
mutex_lock(&bnxt_re_mutex);
4400
rc = bnxt_re_add_device(&rdev, en_dev->net,
4401
BNXT_RE_GSI_MODE_ALL,
4402
BNXT_RE_COMPLETE_INIT,
4403
BNXT_RE_MSIX_FROM_MOD_PARAM, adev);
4404
if (rc) {
4405
mutex_unlock(&bnxt_re_mutex);
4406
return rc;
4407
}
4408
4409
rc = bnxt_re_ib_init(rdev);
4410
if (rc)
4411
goto err;
4412
4413
bnxt_re_ib_init_2(rdev);
4414
4415
dev_dbg(rdev_to_dev(rdev), "%s: adev: %p\n", __func__, adev);
4416
rdev->adev = adev;
4417
4418
mutex_unlock(&bnxt_re_mutex);
4419
4420
return 0;
4421
4422
err:
4423
mutex_unlock(&bnxt_re_mutex);
4424
bnxt_re_remove(adev);
4425
4426
return rc;
4427
}
4428
4429
static const struct auxiliary_device_id bnxt_re_id_table[] = {
4430
{ .name = BNXT_ADEV_NAME ".rdma", },
4431
{},
4432
};
4433
4434
MODULE_DEVICE_TABLE(auxiliary, bnxt_re_id_table);
4435
4436
static struct auxiliary_driver bnxt_re_driver = {
4437
.name = "rdma",
4438
.probe = bnxt_re_probe,
4439
.remove = bnxt_re_remove,
4440
.id_table = bnxt_re_id_table,
4441
};
4442
4443
static int __init bnxt_re_mod_init(void)
4444
{
4445
int rc = 0;
4446
4447
pr_info("%s: %s", ROCE_DRV_MODULE_NAME, drv_version);
4448
4449
bnxt_re_wq = create_singlethread_workqueue("bnxt_re");
4450
if (!bnxt_re_wq)
4451
return -ENOMEM;
4452
4453
rc = bnxt_re_register_netdevice_notifier(&bnxt_re_netdev_notifier);
4454
if (rc) {
4455
pr_err("%s: Cannot register to netdevice_notifier",
4456
ROCE_DRV_MODULE_NAME);
4457
goto err_netdev;
4458
}
4459
4460
INIT_LIST_HEAD(&bnxt_re_dev_list);
4461
4462
rc = auxiliary_driver_register(&bnxt_re_driver);
4463
if (rc) {
4464
pr_err("%s: Failed to register auxiliary driver\n",
4465
ROCE_DRV_MODULE_NAME);
4466
goto err_auxdrv;
4467
}
4468
4469
return 0;
4470
4471
err_auxdrv:
4472
bnxt_re_unregister_netdevice_notifier(&bnxt_re_netdev_notifier);
4473
4474
err_netdev:
4475
destroy_workqueue(bnxt_re_wq);
4476
4477
return rc;
4478
}
4479
4480
static void __exit bnxt_re_mod_exit(void)
4481
{
4482
gmod_exit = 1;
4483
auxiliary_driver_unregister(&bnxt_re_driver);
4484
4485
bnxt_re_unregister_netdevice_notifier(&bnxt_re_netdev_notifier);
4486
4487
if (bnxt_re_wq)
4488
destroy_workqueue(bnxt_re_wq);
4489
}
4490
4491
module_init(bnxt_re_mod_init);
4492
module_exit(bnxt_re_mod_exit);
4493
4494