Lines Matching +full:x +full:- +full:rc
2 * Copyright (c) 2015-2024, Broadcom. All rights reserved. The term
35 #include <linux/dma-mapping.h>
53 #include "bnxt_re-abi.h"
57 "Broadcom NetXtreme-C/E RoCE Driver " ROCE_DRV_MODULE_NAME \
63 MODULE_DESCRIPTION("Broadcom NetXtreme-C/E RoCE Driver");
83 …(enable_fc, "Enable default PFC, CC,ETS during driver load. 1 - fc enable, 0 - fc disable - Defaul…
87 MODULE_PARM_DESC(min_tx_depth, "Minimum TX depth - Default is 1");
92 MODULE_PARM_DESC(max_msix_vec, "Max MSI-x vectors per PF (2 - 64) - Default is 64");
96 MODULE_PARM_DESC(cmdq_shadow_qd, "Perf Stat Debug: Shadow QD Range (1-64) - Default is 64");
121 int rc; in bnxt_re_register_netdevice_notifier() local
122 rc = register_netdevice_notifier(nb); in bnxt_re_register_netdevice_notifier()
123 return rc; in bnxt_re_register_netdevice_notifier()
128 int rc; in bnxt_re_unregister_netdevice_notifier() local
129 rc = unregister_netdevice_notifier(nb); in bnxt_re_unregister_netdevice_notifier()
130 return rc; in bnxt_re_unregister_netdevice_notifier()
135 ibdev->dma_device = &rdev->en_dev->pdev->dev; in bnxt_re_set_dma_device()
140 rdev->resolve_wq = create_singlethread_workqueue("bnxt_re_resolve_wq"); in bnxt_re_init_resolve_wq()
141 INIT_LIST_HEAD(&rdev->mac_wq_list); in bnxt_re_init_resolve_wq()
147 if (!rdev->resolve_wq) in bnxt_re_uninit_resolve_wq()
149 flush_workqueue(rdev->resolve_wq); in bnxt_re_uninit_resolve_wq()
150 list_for_each_entry_safe(tmp_work, tmp_st, &rdev->mac_wq_list, list) { in bnxt_re_uninit_resolve_wq()
151 list_del(&tmp_work->list); in bnxt_re_uninit_resolve_wq()
154 destroy_workqueue(rdev->resolve_wq); in bnxt_re_uninit_resolve_wq()
155 rdev->resolve_wq = NULL; in bnxt_re_uninit_resolve_wq()
162 return bus_space_read_8(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off); in readl_fbsd()
164 return bus_space_read_8(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off); in readl_fbsd()
170 bus_space_write_8(bp->doorbell_bar.tag, bp->doorbell_bar.handle, reg_off, htole32(val)); in writel_fbsd()
172 bus_space_write_8(bp->hwrm_bar.tag, bp->hwrm_bar.handle, reg_off, htole32(val)); in writel_fbsd()
178 if (fifo_occup > rdev->dbg_stats->dbq.fifo_occup_water_mark) in bnxt_re_update_fifo_occup_slabs()
179 rdev->dbg_stats->dbq.fifo_occup_water_mark = fifo_occup; in bnxt_re_update_fifo_occup_slabs()
181 if (fifo_occup > 8 * rdev->pacing_algo_th) in bnxt_re_update_fifo_occup_slabs()
182 rdev->dbg_stats->dbq.fifo_occup_slab_4++; in bnxt_re_update_fifo_occup_slabs()
183 else if (fifo_occup > 4 * rdev->pacing_algo_th) in bnxt_re_update_fifo_occup_slabs()
184 rdev->dbg_stats->dbq.fifo_occup_slab_3++; in bnxt_re_update_fifo_occup_slabs()
185 else if (fifo_occup > 2 * rdev->pacing_algo_th) in bnxt_re_update_fifo_occup_slabs()
186 rdev->dbg_stats->dbq.fifo_occup_slab_2++; in bnxt_re_update_fifo_occup_slabs()
187 else if (fifo_occup > rdev->pacing_algo_th) in bnxt_re_update_fifo_occup_slabs()
188 rdev->dbg_stats->dbq.fifo_occup_slab_1++; in bnxt_re_update_fifo_occup_slabs()
193 struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data; in bnxt_re_update_do_pacing_slabs()
195 if (pacing_data->do_pacing > rdev->dbg_stats->dbq.do_pacing_water_mark) in bnxt_re_update_do_pacing_slabs()
196 rdev->dbg_stats->dbq.do_pacing_water_mark = pacing_data->do_pacing; in bnxt_re_update_do_pacing_slabs()
198 if (pacing_data->do_pacing > 16 * rdev->dbr_def_do_pacing) in bnxt_re_update_do_pacing_slabs()
199 rdev->dbg_stats->dbq.do_pacing_slab_5++; in bnxt_re_update_do_pacing_slabs()
200 else if (pacing_data->do_pacing > 8 * rdev->dbr_def_do_pacing) in bnxt_re_update_do_pacing_slabs()
201 rdev->dbg_stats->dbq.do_pacing_slab_4++; in bnxt_re_update_do_pacing_slabs()
202 else if (pacing_data->do_pacing > 4 * rdev->dbr_def_do_pacing) in bnxt_re_update_do_pacing_slabs()
203 rdev->dbg_stats->dbq.do_pacing_slab_3++; in bnxt_re_update_do_pacing_slabs()
204 else if (pacing_data->do_pacing > 2 * rdev->dbr_def_do_pacing) in bnxt_re_update_do_pacing_slabs()
205 rdev->dbg_stats->dbq.do_pacing_slab_2++; in bnxt_re_update_do_pacing_slabs()
206 else if (pacing_data->do_pacing > rdev->dbr_def_do_pacing) in bnxt_re_update_do_pacing_slabs()
207 rdev->dbg_stats->dbq.do_pacing_slab_1++; in bnxt_re_update_do_pacing_slabs()
212 return qp->ib_qp.qp_type == IB_QPT_GSI; in bnxt_re_is_qp1_qp()
219 mutex_lock(&rdev->qp_lock); in bnxt_re_get_qp1_qp()
220 list_for_each_entry(qp, &rdev->qp_list, list) { in bnxt_re_get_qp1_qp()
222 mutex_unlock(&rdev->qp_lock); in bnxt_re_get_qp1_qp()
226 mutex_unlock(&rdev->qp_lock); in bnxt_re_get_qp1_qp()
243 attr = rdev->dev_attr; in bnxt_re_limit_pf_res()
244 hctx = rdev->qplib_res.hctx; in bnxt_re_limit_pf_res()
245 cctx = rdev->chip_ctx; in bnxt_re_limit_pf_res()
247 bnxt_qplib_max_res_supported(cctx, &rdev->qplib_res, &dev_res, false); in bnxt_re_limit_pf_res()
249 hctx->qp_ctx.max = min_t(u32, dev_res.max_qp, attr->max_qp); in bnxt_re_limit_pf_res()
250 hctx->mrw_ctx.max = min_t(u32, dev_res.max_mr, attr->max_mr); in bnxt_re_limit_pf_res()
254 hctx->mrw_ctx.max *= 2; in bnxt_re_limit_pf_res()
255 hctx->srq_ctx.max = min_t(u32, dev_res.max_srq, attr->max_srq); in bnxt_re_limit_pf_res()
256 hctx->cq_ctx.max = min_t(u32, dev_res.max_cq, attr->max_cq); in bnxt_re_limit_pf_res()
258 hctx->tqm_ctx.qcount[i] = attr->tqm_alloc_reqs[i]; in bnxt_re_limit_pf_res()
260 hctx->qp_ctx.max = attr->max_qp ? attr->max_qp : dev_res.max_qp; in bnxt_re_limit_pf_res()
261 hctx->mrw_ctx.max = attr->max_mr ? attr->max_mr : dev_res.max_mr; in bnxt_re_limit_pf_res()
262 hctx->srq_ctx.max = attr->max_srq ? attr->max_srq : dev_res.max_srq; in bnxt_re_limit_pf_res()
263 hctx->cq_ctx.max = attr->max_cq ? attr->max_cq : dev_res.max_cq; in bnxt_re_limit_pf_res()
271 struct bnxt_qplib_chip_ctx *cctx = rdev->chip_ctx; in bnxt_re_limit_vf_res()
274 bnxt_qplib_max_res_supported(cctx, &rdev->qplib_res, &dev_res, true); in bnxt_re_limit_vf_res()
275 vf_res->max_qp = dev_res.max_qp / num_vf; in bnxt_re_limit_vf_res()
276 vf_res->max_srq = dev_res.max_srq / num_vf; in bnxt_re_limit_vf_res()
277 vf_res->max_cq = dev_res.max_cq / num_vf; in bnxt_re_limit_vf_res()
282 vf_res->max_mrw = dev_res.max_mr * 2 / num_vf; in bnxt_re_limit_vf_res()
283 vf_res->max_gid = BNXT_RE_MAX_GID_PER_VF; in bnxt_re_limit_vf_res()
290 hctx = rdev->qplib_res.hctx; in bnxt_re_set_resource_limits()
291 memset(&hctx->vf_res, 0, sizeof(struct bnxt_qplib_vf_res)); in bnxt_re_set_resource_limits()
294 if (rdev->num_vfs) in bnxt_re_set_resource_limits()
295 bnxt_re_limit_vf_res(rdev, &hctx->vf_res, rdev->num_vfs); in bnxt_re_set_resource_limits()
304 rcfw = &rdev->rcfw; in bnxt_re_dettach_irq()
305 for (indx = 0; indx < rdev->nqr.max_init; indx++) { in bnxt_re_dettach_irq()
306 nq = &rdev->nqr.nq[indx]; in bnxt_re_dettach_irq()
307 mutex_lock(&nq->lock); in bnxt_re_dettach_irq()
309 mutex_unlock(&nq->lock); in bnxt_re_dettach_irq()
321 set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags); in bnxt_re_detach_err_device()
322 set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags); in bnxt_re_detach_err_device()
323 wake_up_all(&rdev->rcfw.cmdq.waitq); in bnxt_re_detach_err_device()
336 rdev->dcb_wq = create_singlethread_workqueue("bnxt_re_dcb_wq"); in bnxt_re_init_dcb_wq()
341 if (!rdev->dcb_wq) in bnxt_re_uninit_dcb_wq()
343 flush_workqueue(rdev->dcb_wq); in bnxt_re_uninit_dcb_wq()
344 destroy_workqueue(rdev->dcb_wq); in bnxt_re_uninit_dcb_wq()
345 rdev->dcb_wq = NULL; in bnxt_re_uninit_dcb_wq()
350 rdev->aer_wq = create_singlethread_workqueue("bnxt_re_aer_wq"); in bnxt_re_init_aer_wq()
355 if (!rdev->aer_wq) in bnxt_re_uninit_aer_wq()
357 flush_workqueue(rdev->aer_wq); in bnxt_re_uninit_aer_wq()
358 destroy_workqueue(rdev->aer_wq); in bnxt_re_uninit_aer_wq()
359 rdev->aer_wq = NULL; in bnxt_re_uninit_aer_wq()
366 if (!_is_chip_gen_p5_p7(rdev->chip_ctx)) in bnxt_re_update_qp1_tos_dscp()
373 qp->qplib_qp.modify_flags = CMDQ_MODIFY_QP_MODIFY_MASK_TOS_DSCP; in bnxt_re_update_qp1_tos_dscp()
374 qp->qplib_qp.tos_dscp = rdev->cc_param.qp1_tos_dscp; in bnxt_re_update_qp1_tos_dscp()
376 return bnxt_qplib_modify_qp(&rdev->qplib_res, &qp->qplib_qp); in bnxt_re_update_qp1_tos_dscp()
385 int rc; in bnxt_re_reconfigure_dscp() local
387 cc_param = &rdev->cc_param; in bnxt_re_reconfigure_dscp()
388 tc_rec = &rdev->tc_rec[0]; in bnxt_re_reconfigure_dscp()
390 if (!(cc_param->roce_dscp_user || cc_param->cnp_dscp_user)) in bnxt_re_reconfigure_dscp()
393 if (cc_param->cnp_dscp_user) { in bnxt_re_reconfigure_dscp()
394 dscp_user = (cc_param->cnp_dscp_user & 0x3f); in bnxt_re_reconfigure_dscp()
395 if ((tc_rec->cnp_dscp_bv & (1ul << dscp_user)) && in bnxt_re_reconfigure_dscp()
396 (cc_param->alt_tos_dscp != dscp_user)) { in bnxt_re_reconfigure_dscp()
397 cc_param->alt_tos_dscp = dscp_user; in bnxt_re_reconfigure_dscp()
398 cc_param->mask |= CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_ALT_TOS_DSCP; in bnxt_re_reconfigure_dscp()
403 if (cc_param->roce_dscp_user) { in bnxt_re_reconfigure_dscp()
404 dscp_user = (cc_param->roce_dscp_user & 0x3f); in bnxt_re_reconfigure_dscp()
405 if ((tc_rec->roce_dscp_bv & (1ul << dscp_user)) && in bnxt_re_reconfigure_dscp()
406 (cc_param->tos_dscp != dscp_user)) { in bnxt_re_reconfigure_dscp()
407 cc_param->tos_dscp = dscp_user; in bnxt_re_reconfigure_dscp()
408 cc_param->mask |= CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP; in bnxt_re_reconfigure_dscp()
414 rc = bnxt_qplib_modify_cc(&rdev->qplib_res, cc_param); in bnxt_re_reconfigure_dscp()
415 if (rc) in bnxt_re_reconfigure_dscp()
427 int rc; in bnxt_re_dcb_wq_task() local
429 rdev = dcb_work->rdev; in bnxt_re_dcb_wq_task()
433 mutex_lock(&rdev->cc_lock); in bnxt_re_dcb_wq_task()
435 cc_param = &rdev->cc_param; in bnxt_re_dcb_wq_task()
436 rc = bnxt_qplib_query_cc_param(&rdev->qplib_res, cc_param); in bnxt_re_dcb_wq_task()
437 if (rc) { in bnxt_re_dcb_wq_task()
438 dev_err(rdev_to_dev(rdev), "Failed to query ccparam rc:%d", rc); in bnxt_re_dcb_wq_task()
441 tc_rec = &rdev->tc_rec[0]; in bnxt_re_dcb_wq_task()
445 * is in the list, re-program the value using modify_roce_cc command in bnxt_re_dcb_wq_task()
449 cc_param->roce_pri = tc_rec->roce_prio; in bnxt_re_dcb_wq_task()
450 if (cc_param->qp1_tos_dscp != cc_param->tos_dscp) { in bnxt_re_dcb_wq_task()
451 cc_param->qp1_tos_dscp = cc_param->tos_dscp; in bnxt_re_dcb_wq_task()
452 rc = bnxt_re_update_qp1_tos_dscp(rdev); in bnxt_re_dcb_wq_task()
453 if (rc) { in bnxt_re_dcb_wq_task()
454 dev_err(rdev_to_dev(rdev), "%s:Failed to modify QP1 rc:%d", in bnxt_re_dcb_wq_task()
455 __func__, rc); in bnxt_re_dcb_wq_task()
461 mutex_unlock(&rdev->cc_lock); in bnxt_re_dcb_wq_task()
470 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_dbr_pacing_broadcast_event()
472 int rc; in bnxt_re_hwrm_dbr_pacing_broadcast_event() local
476 HWRM_FUNC_DBR_PACING_BROADCAST_EVENT, -1, -1); in bnxt_re_hwrm_dbr_pacing_broadcast_event()
479 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_dbr_pacing_broadcast_event()
480 if (rc) { in bnxt_re_hwrm_dbr_pacing_broadcast_event()
482 "Failed to send dbr pacing broadcast event rc:%d", rc); in bnxt_re_hwrm_dbr_pacing_broadcast_event()
483 return rc; in bnxt_re_hwrm_dbr_pacing_broadcast_event()
492 struct bnxt_dbq_nq_list *nq_list = &rdev->nq_list; in bnxt_re_hwrm_dbr_pacing_nqlist_query()
493 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_dbr_pacing_nqlist_query()
497 int rc, i, j = 1; in bnxt_re_hwrm_dbr_pacing_nqlist_query() local
500 nq = &rdev->nqr.nq[0]; in bnxt_re_hwrm_dbr_pacing_nqlist_query()
504 HWRM_FUNC_DBR_PACING_NQLIST_QUERY, -1, -1); in bnxt_re_hwrm_dbr_pacing_nqlist_query()
507 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_dbr_pacing_nqlist_query()
508 if (rc) { in bnxt_re_hwrm_dbr_pacing_nqlist_query()
509 dev_err(rdev_to_dev(rdev), "Failed to send dbr pacing nq list query rc:%d", rc); in bnxt_re_hwrm_dbr_pacing_nqlist_query()
510 return rc; in bnxt_re_hwrm_dbr_pacing_nqlist_query()
512 nq_list->num_nql_entries = le32_to_cpu(resp.num_nqs); in bnxt_re_hwrm_dbr_pacing_nqlist_query()
516 * num_nql_entries - 1. Fill the nq_list->nq_id[0] with the in bnxt_re_hwrm_dbr_pacing_nqlist_query()
519 for (i = 0; i < nq_list->num_nql_entries; i++) { in bnxt_re_hwrm_dbr_pacing_nqlist_query()
523 "nq_list->nq_id[%d] = %d\n", i, nq_id); in bnxt_re_hwrm_dbr_pacing_nqlist_query()
524 if (nq_id != nq->ring_id) { in bnxt_re_hwrm_dbr_pacing_nqlist_query()
525 nq_list->nq_id[j] = nq_id; in bnxt_re_hwrm_dbr_pacing_nqlist_query()
529 nq_list->nq_id[0] = nq->ring_id; in bnxt_re_hwrm_dbr_pacing_nqlist_query()
534 bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 1); in bnxt_re_hwrm_dbr_pacing_nqlist_query()
541 struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data; in __wait_for_fifo_occupancy_below_th()
549 read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_db_fifo_reg_off, 0); in __wait_for_fifo_occupancy_below_th()
550 fifo_occup = pacing_data->fifo_max_depth - in __wait_for_fifo_occupancy_below_th()
551 ((read_val & pacing_data->fifo_room_mask) >> in __wait_for_fifo_occupancy_below_th()
552 pacing_data->fifo_room_shift); in __wait_for_fifo_occupancy_below_th()
554 if (fifo_occup > pacing_data->fifo_max_depth) in __wait_for_fifo_occupancy_below_th()
561 if (fifo_occup < pacing_data->pacing_th) in __wait_for_fifo_occupancy_below_th()
568 struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data; in bnxt_re_set_default_pacing_data()
570 pacing_data->do_pacing = rdev->dbr_def_do_pacing; in bnxt_re_set_default_pacing_data()
571 pacing_data->pacing_th = rdev->pacing_algo_th; in bnxt_re_set_default_pacing_data()
572 pacing_data->alarm_th = in bnxt_re_set_default_pacing_data()
573 pacing_data->pacing_th * BNXT_RE_PACING_ALARM_TH_MULTIPLE(rdev->chip_ctx); in bnxt_re_set_default_pacing_data()
587 read_val = readl_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, 0); in bnxt_re_check_if_dbq_intr_triggered()
588 dev_dbg(rdev_to_dev(rdev), "AEQ ARM status = 0x%x\n", in bnxt_re_check_if_dbq_intr_triggered()
602 throttle_val = (rdev->qplib_res.pacing_data->fifo_max_depth * throttle) / 100; in bnxt_re_set_dbq_throttling_reg()
604 if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) { in bnxt_re_set_dbq_throttling_reg()
607 writel_fbsd(rdev->en_dev->softc, rdev->dbr_throttling_reg_off, 0, cag_ring_water_mark); in bnxt_re_set_dbq_throttling_reg()
608 read_val = readl_fbsd(rdev->en_dev->softc , rdev->dbr_throttling_reg_off, 0); in bnxt_re_set_dbq_throttling_reg()
610 "%s: dbr_throttling_reg_off read_val = 0x%x\n", in bnxt_re_set_dbq_throttling_reg()
614 "nq_id = %d write_val=0x%x read_val=0x%x\n", in bnxt_re_set_dbq_throttling_reg()
619 writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off, 0, 1); in bnxt_re_set_dbq_throttling_reg()
629 nq_list = &rdev->nq_list; in bnxt_re_set_dbq_throttling_for_non_primary()
631 if (bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) { in bnxt_re_set_dbq_throttling_for_non_primary()
632 dev_dbg(rdev_to_dev(rdev), "%s: nq_list->num_nql_entries= %d\n", in bnxt_re_set_dbq_throttling_for_non_primary()
633 __func__, nq_list->num_nql_entries); in bnxt_re_set_dbq_throttling_for_non_primary()
634 nq = &rdev->nqr.nq[0]; in bnxt_re_set_dbq_throttling_for_non_primary()
635 for (i = nq_list->num_nql_entries - 1; i > 0; i--) { in bnxt_re_set_dbq_throttling_for_non_primary()
636 u16 nq_id = nq_list->nq_id[i]; in bnxt_re_set_dbq_throttling_for_non_primary()
640 __func__, nq_id, nq->ring_id); in bnxt_re_set_dbq_throttling_for_non_primary()
652 int rc = 0; in bnxt_re_handle_dbr_nq_pacing_notification() local
654 nq = &rdev->nqr.nq[0]; in bnxt_re_handle_dbr_nq_pacing_notification()
657 rc = bnxt_re_hwrm_dbr_pacing_nqlist_query(rdev); in bnxt_re_handle_dbr_nq_pacing_notification()
658 if (rc) { in bnxt_re_handle_dbr_nq_pacing_notification()
660 "Failed to Query NQ list rc= %d", rc); in bnxt_re_handle_dbr_nq_pacing_notification()
664 writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28, 0, in bnxt_re_handle_dbr_nq_pacing_notification()
665 rdev->chip_ctx->dbr_aeq_arm_reg & BNXT_GRC_BASE_MASK); in bnxt_re_handle_dbr_nq_pacing_notification()
667 rdev->dbr_throttling_reg_off = in bnxt_re_handle_dbr_nq_pacing_notification()
668 (rdev->chip_ctx->dbr_throttling_reg & in bnxt_re_handle_dbr_nq_pacing_notification()
670 rdev->dbr_aeq_arm_reg_off = in bnxt_re_handle_dbr_nq_pacing_notification()
671 (rdev->chip_ctx->dbr_aeq_arm_reg & in bnxt_re_handle_dbr_nq_pacing_notification()
674 bnxt_re_set_dbq_throttling_reg(rdev, nq->ring_id, rdev->dbq_watermark); in bnxt_re_handle_dbr_nq_pacing_notification()
683 rdev = dbq_work->rdev; in bnxt_re_dbq_wq_task()
687 switch (dbq_work->event) { in bnxt_re_dbq_wq_task()
691 if (!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) in bnxt_re_dbq_wq_task()
699 if (_is_chip_p7(rdev->chip_ctx)) in bnxt_re_dbq_wq_task()
701 else if (!rdev->chip_ctx->modes.dbr_pacing_v0) in bnxt_re_dbq_wq_task()
731 if (!en_info || !en_info->en_dev) { in bnxt_re_async_notifier()
735 rdev = en_info->rdev; in bnxt_re_async_notifier()
737 event_id = le16_to_cpu(cmpl->event_id); in bnxt_re_async_notifier()
738 data1 = le32_to_cpu(cmpl->event_data1); in bnxt_re_async_notifier()
739 data2 = le32_to_cpu(cmpl->event_data2); in bnxt_re_async_notifier()
746 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags) || in bnxt_re_async_notifier()
747 !test_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags)) { in bnxt_re_async_notifier()
760 if (!rdev->dcb_wq) in bnxt_re_async_notifier()
766 dcb_work->rdev = rdev; in bnxt_re_async_notifier()
767 memcpy(&dcb_work->cmpl, cmpl, sizeof(*cmpl)); in bnxt_re_async_notifier()
768 INIT_WORK(&dcb_work->work, bnxt_re_dcb_wq_task); in bnxt_re_async_notifier()
769 queue_work(rdev->dcb_wq, &dcb_work->work); in bnxt_re_async_notifier()
774 set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags); in bnxt_re_async_notifier()
776 set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags); in bnxt_re_async_notifier()
777 wake_up_all(&rdev->rcfw.cmdq.waitq); in bnxt_re_async_notifier()
781 if (!rdev->dbr_pacing) in bnxt_re_async_notifier()
786 dbq_work->rdev = rdev; in bnxt_re_async_notifier()
787 dbq_work->event = BNXT_RE_DBR_PACING_EVENT; in bnxt_re_async_notifier()
788 INIT_WORK(&dbq_work->work, bnxt_re_dbq_wq_task); in bnxt_re_async_notifier()
789 queue_work(rdev->dbq_wq, &dbq_work->work); in bnxt_re_async_notifier()
790 rdev->dbr_sw_stats->dbq_int_recv++; in bnxt_re_async_notifier()
793 if (!rdev->dbr_pacing) in bnxt_re_async_notifier()
799 dbq_work->rdev = rdev; in bnxt_re_async_notifier()
800 dbq_work->event = BNXT_RE_DBR_NQ_PACING_NOTIFICATION; in bnxt_re_async_notifier()
801 INIT_WORK(&dbq_work->work, bnxt_re_dbq_wq_task); in bnxt_re_async_notifier()
802 queue_work(rdev->dbq_wq, &dbq_work->work); in bnxt_re_async_notifier()
819 if (!mutex_trylock(&rdev->dbq_lock)) in bnxt_re_db_fifo_check()
821 pacing_data = rdev->qplib_res.pacing_data; in bnxt_re_db_fifo_check()
822 pacing_save = rdev->do_pacing_save; in bnxt_re_db_fifo_check()
824 cancel_delayed_work_sync(&rdev->dbq_pacing_work); in bnxt_re_db_fifo_check()
825 if (rdev->dbr_recovery_on) in bnxt_re_db_fifo_check()
827 if (pacing_save > rdev->dbr_def_do_pacing) { in bnxt_re_db_fifo_check()
839 pacing_data->pacing_th = rdev->pacing_algo_th * 4; in bnxt_re_db_fifo_check()
845 pacing_data->do_pacing = pacing_save; in bnxt_re_db_fifo_check()
846 rdev->do_pacing_save = pacing_data->do_pacing; in bnxt_re_db_fifo_check()
847 pacing_data->alarm_th = in bnxt_re_db_fifo_check()
848 pacing_data->pacing_th * BNXT_RE_PACING_ALARM_TH_MULTIPLE(rdev->chip_ctx); in bnxt_re_db_fifo_check()
850 schedule_delayed_work(&rdev->dbq_pacing_work, in bnxt_re_db_fifo_check()
851 msecs_to_jiffies(rdev->dbq_pacing_time)); in bnxt_re_db_fifo_check()
852 rdev->dbr_sw_stats->dbq_pacing_alerts++; in bnxt_re_db_fifo_check()
853 mutex_unlock(&rdev->dbq_lock); in bnxt_re_db_fifo_check()
864 if (!mutex_trylock(&rdev->dbq_lock)) in bnxt_re_pacing_timer_exp()
867 pacing_data = rdev->qplib_res.pacing_data; in bnxt_re_pacing_timer_exp()
868 read_val = readl_fbsd(rdev->en_dev->softc , rdev->dbr_db_fifo_reg_off, 0); in bnxt_re_pacing_timer_exp()
869 fifo_occup = pacing_data->fifo_max_depth - in bnxt_re_pacing_timer_exp()
870 ((read_val & pacing_data->fifo_room_mask) >> in bnxt_re_pacing_timer_exp()
871 pacing_data->fifo_room_shift); in bnxt_re_pacing_timer_exp()
873 if (fifo_occup > pacing_data->pacing_th) in bnxt_re_pacing_timer_exp()
880 pacing_data->do_pacing = pacing_data->do_pacing - (pacing_data->do_pacing >> 3); in bnxt_re_pacing_timer_exp()
881 pacing_data->do_pacing = max_t(u32, rdev->dbr_def_do_pacing, pacing_data->do_pacing); in bnxt_re_pacing_timer_exp()
886 if (rdev->dbq_int_disable && fifo_occup < rdev->pacing_en_int_th) { in bnxt_re_pacing_timer_exp()
887 if (bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) { in bnxt_re_pacing_timer_exp()
888 if (!rdev->chip_ctx->modes.dbr_pacing_v0) { in bnxt_re_pacing_timer_exp()
889 nq = &rdev->nqr.nq[0]; in bnxt_re_pacing_timer_exp()
890 bnxt_re_set_dbq_throttling_reg(rdev, nq->ring_id, in bnxt_re_pacing_timer_exp()
891 rdev->dbq_watermark); in bnxt_re_pacing_timer_exp()
892 rdev->dbr_sw_stats->dbq_int_en++; in bnxt_re_pacing_timer_exp()
893 rdev->dbq_int_disable = false; in bnxt_re_pacing_timer_exp()
897 if (pacing_data->do_pacing <= rdev->dbr_def_do_pacing) { in bnxt_re_pacing_timer_exp()
899 rdev->dbr_sw_stats->dbq_pacing_complete++; in bnxt_re_pacing_timer_exp()
903 schedule_delayed_work(&rdev->dbq_pacing_work, in bnxt_re_pacing_timer_exp()
904 msecs_to_jiffies(rdev->dbq_pacing_time)); in bnxt_re_pacing_timer_exp()
906 rdev->dbr_sw_stats->dbq_pacing_resched++; in bnxt_re_pacing_timer_exp()
908 rdev->do_pacing_save = pacing_data->do_pacing; in bnxt_re_pacing_timer_exp()
909 mutex_unlock(&rdev->dbq_lock); in bnxt_re_pacing_timer_exp()
916 if (!rdev->dbr_pacing) in bnxt_re_pacing_alert()
918 mutex_lock(&rdev->dbq_lock); in bnxt_re_pacing_alert()
919 pacing_data = rdev->qplib_res.pacing_data; in bnxt_re_pacing_alert()
925 pacing_data->alarm_th = pacing_data->fifo_max_depth; in bnxt_re_pacing_alert()
926 pacing_data->do_pacing = BNXT_RE_MAX_DBR_DO_PACING; in bnxt_re_pacing_alert()
927 cancel_work_sync(&rdev->dbq_fifo_check_work); in bnxt_re_pacing_alert()
928 schedule_work(&rdev->dbq_fifo_check_work); in bnxt_re_pacing_alert()
929 mutex_unlock(&rdev->dbq_lock); in bnxt_re_pacing_alert()
939 atomic_set(&rdev->dbq_intr_running, 1); in bnxt_re_schedule_dbq_event()
941 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_schedule_dbq_event()
946 if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx) && in bnxt_re_schedule_dbq_event()
947 !rdev->chip_ctx->modes.dbr_pacing_v0) in bnxt_re_schedule_dbq_event()
953 dbq_work->rdev = rdev; in bnxt_re_schedule_dbq_event()
954 dbq_work->event = BNXT_RE_DBQ_EVENT_SCHED; in bnxt_re_schedule_dbq_event()
955 INIT_WORK(&dbq_work->work, bnxt_re_dbq_wq_task); in bnxt_re_schedule_dbq_event()
956 queue_work(rdev->dbq_wq, &dbq_work->work); in bnxt_re_schedule_dbq_event()
957 rdev->dbr_sw_stats->dbq_int_recv++; in bnxt_re_schedule_dbq_event()
958 rdev->dbq_int_disable = true; in bnxt_re_schedule_dbq_event()
960 atomic_set(&rdev->dbq_intr_running, 0); in bnxt_re_schedule_dbq_event()
965 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_free_msix()
966 int rc; in bnxt_re_free_msix() local
968 rc = en_dev->en_ops->bnxt_free_msix(rdev->en_dev, BNXT_ROCE_ULP); in bnxt_re_free_msix()
969 if (rc) in bnxt_re_free_msix()
970 dev_err(rdev_to_dev(rdev), "netdev %p free_msix failed! rc = 0x%x", in bnxt_re_free_msix()
971 rdev->netdev, rc); in bnxt_re_free_msix()
976 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_request_msix()
977 int rc = 0, num_msix_want, num_msix_got; in bnxt_re_request_msix() local
984 * TODO - change the scheme with an adapter specific check in bnxt_re_request_msix()
989 if (rdev->is_virtfn) in bnxt_re_request_msix()
993 else if (_is_chip_gen_p5_p7(rdev->chip_ctx)) in bnxt_re_request_msix()
994 num_msix_want = rdev->num_msix_requested ?: BNXT_RE_MAX_MSIX_GEN_P5_PF; in bnxt_re_request_msix()
1008 entry = rdev->nqr.msix_entries; in bnxt_re_request_msix()
1010 num_msix_got = en_dev->en_ops->bnxt_request_msix(en_dev, BNXT_ROCE_ULP, in bnxt_re_request_msix()
1013 rc = -EINVAL; in bnxt_re_request_msix()
1021 rdev->nqr.num_msix = num_msix_got; in bnxt_re_request_msix()
1026 return rc; in bnxt_re_request_msix()
1034 int retry = 0, rc = 0, ret = 0; in __wait_for_ib_unregister() local
1036 cur_prod = rdev->rcfw.cmdq.hwq.prod; in __wait_for_ib_unregister()
1037 cur_cons = rdev->rcfw.cmdq.hwq.cons; in __wait_for_ib_unregister()
1040 /* During module exit, increase timeout ten-fold to 100 mins to wait in __wait_for_ib_unregister()
1043 if (rdev->mod_exit) in __wait_for_ib_unregister()
1051 rc = wait_event_timeout(en_info->waitq, in __wait_for_ib_unregister()
1052 en_info->ib_uninit_done, in __wait_for_ib_unregister()
1059 if (rc) in __wait_for_ib_unregister()
1062 if (!RCFW_NO_FW_ACCESS(&rdev->rcfw)) { in __wait_for_ib_unregister()
1066 if (!rdev->mod_exit) in __wait_for_ib_unregister()
1067 ret = __check_cmdq_stall(&rdev->rcfw, &cur_prod, &cur_cons); in __wait_for_ib_unregister()
1068 if (ret || en_info->ib_uninit_done) in __wait_for_ib_unregister()
1071 } while (retry--); in __wait_for_ib_unregister()
1073 return rc; in __wait_for_ib_unregister()
1083 int rc = 0; in bnxt_re_handle_start() local
1085 if (!en_info || !en_info->en_dev) { in bnxt_re_handle_start()
1087 return -EINVAL; in bnxt_re_handle_start()
1089 netdev = en_info->en_dev->net; in bnxt_re_handle_start()
1090 if (en_info->rdev) { in bnxt_re_handle_start()
1091 dev_info(rdev_to_dev(en_info->rdev), in bnxt_re_handle_start()
1093 __func__, adev, en_info->rdev); in bnxt_re_handle_start()
1097 en_dev = en_info->en_dev; in bnxt_re_handle_start()
1101 rc = bnxt_re_add_device(&rdev, real_dev, in bnxt_re_handle_start()
1102 en_info->gsi_mode, in bnxt_re_handle_start()
1104 en_info->wqe_mode, in bnxt_re_handle_start()
1105 en_info->num_msix_requested, adev); in bnxt_re_handle_start()
1106 if (rc) { in bnxt_re_handle_start()
1112 en_dev->en_ops->bnxt_unregister_device(en_dev, BNXT_ROCE_ULP); in bnxt_re_handle_start()
1115 gadd_dev_inprogress--; in bnxt_re_handle_start()
1117 return rc; in bnxt_re_handle_start()
1119 rdev->adev = adev; in bnxt_re_handle_start()
1123 rc = bnxt_re_ib_init(rdev); in bnxt_re_handle_start()
1124 if (rc) { in bnxt_re_handle_start()
1126 return rc; in bnxt_re_handle_start()
1130 return rc; in bnxt_re_handle_start()
1139 int rc = 0; in bnxt_re_stop() local
1143 if (!en_info || !en_info->en_dev) { in bnxt_re_stop()
1147 netdev = en_info->en_dev->net; in bnxt_re_stop()
1148 rdev = en_info->rdev; in bnxt_re_stop()
1159 en_dev = rdev->en_dev; in bnxt_re_stop()
1160 if (en_dev->en_state & BNXT_STATE_FW_FATAL_COND || in bnxt_re_stop()
1161 en_dev->en_state & BNXT_STATE_FW_RESET_DET) { in bnxt_re_stop()
1163 set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags); in bnxt_re_stop()
1165 set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags); in bnxt_re_stop()
1166 wake_up_all(&rdev->rcfw.cmdq.waitq); in bnxt_re_stop()
1169 if (test_bit(BNXT_RE_FLAG_STOP_IN_PROGRESS, &rdev->flags)) in bnxt_re_stop()
1171 set_bit(BNXT_RE_FLAG_STOP_IN_PROGRESS, &rdev->flags); in bnxt_re_stop()
1173 en_info->wqe_mode = rdev->chip_ctx->modes.wqe_mode; in bnxt_re_stop()
1174 en_info->gsi_mode = rdev->gsi_ctx.gsi_qp_mode; in bnxt_re_stop()
1175 en_info->num_msix_requested = rdev->num_msix_requested; in bnxt_re_stop()
1176 en_info->ib_uninit_done = false; in bnxt_re_stop()
1178 if (rdev->dbr_pacing) in bnxt_re_stop()
1184 init_waitqueue_head(&en_info->waitq); in bnxt_re_stop()
1187 NULL, netdev, rdev->adev); in bnxt_re_stop()
1188 rc = __wait_for_ib_unregister(rdev, en_info); in bnxt_re_stop()
1191 if (!rc) { in bnxt_re_stop()
1197 bnxt_re_remove_device(rdev, BNXT_RE_PRE_RECOVERY_REMOVE, rdev->adev); in bnxt_re_stop()
1229 rdev = en_info->rdev; in bnxt_re_shutdown()
1235 bnxt_re_remove_device(rdev, BNXT_RE_COMPLETE_REMOVE, rdev->adev); in bnxt_re_shutdown()
1254 rdev = en_info->rdev; in bnxt_re_stop_irq()
1259 rcfw = &rdev->rcfw; in bnxt_re_stop_irq()
1260 for (indx = 0; indx < rdev->nqr.max_init; indx++) { in bnxt_re_stop_irq()
1261 nq = &rdev->nqr.nq[indx]; in bnxt_re_stop_irq()
1262 mutex_lock(&nq->lock); in bnxt_re_stop_irq()
1264 mutex_unlock(&nq->lock); in bnxt_re_stop_irq()
1267 if (test_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags)) in bnxt_re_stop_irq()
1278 int indx, rc, vec; in bnxt_re_start_irq() local
1284 rdev = en_info->rdev; in bnxt_re_start_irq()
1287 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_start_irq()
1289 msix_ent = rdev->nqr.msix_entries; in bnxt_re_start_irq()
1290 rcfw = &rdev->rcfw; in bnxt_re_start_irq()
1298 dev_err(rdev_to_dev(rdev), "Failed to re-start IRQs\n"); in bnxt_re_start_irq()
1305 for (indx = 0; indx < rdev->nqr.num_msix; indx++) in bnxt_re_start_irq()
1306 rdev->nqr.msix_entries[indx].vector = ent[indx].vector; in bnxt_re_start_irq()
1308 if (test_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags)) { in bnxt_re_start_irq()
1309 rc = bnxt_qplib_rcfw_start_irq(rcfw, msix_ent[BNXT_RE_AEQ_IDX].vector, in bnxt_re_start_irq()
1311 if (rc) { in bnxt_re_start_irq()
1317 for (indx = 0 ; indx < rdev->nqr.max_init; indx++) { in bnxt_re_start_irq()
1318 nq = &rdev->nqr.nq[indx]; in bnxt_re_start_irq()
1320 rc = bnxt_qplib_nq_start_irq(nq, indx, msix_ent[vec].vector, in bnxt_re_start_irq()
1322 if (rc) { in bnxt_re_start_irq()
1354 /* RoCE -> Net driver */
1360 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_unregister_netdev()
1361 int rc; in bnxt_re_unregister_netdev() local
1364 rc = en_dev->en_ops->bnxt_unregister_device(rdev->en_dev, in bnxt_re_unregister_netdev()
1367 if (rc) in bnxt_re_unregister_netdev()
1368 dev_err(rdev_to_dev(rdev), "netdev %p unregister failed! rc = 0x%x", in bnxt_re_unregister_netdev()
1369 rdev->en_dev->net, rc); in bnxt_re_unregister_netdev()
1371 clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags); in bnxt_re_unregister_netdev()
1376 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_register_netdev()
1377 int rc = 0; in bnxt_re_register_netdev() local
1380 rc = en_dev->en_ops->bnxt_register_device(en_dev, in bnxt_re_register_netdev()
1383 rdev->adev); in bnxt_re_register_netdev()
1385 if (rc) { in bnxt_re_register_netdev()
1386 dev_err(rdev_to_dev(rdev), "netdev %p register failed! rc = 0x%x", in bnxt_re_register_netdev()
1387 rdev->netdev, rc); in bnxt_re_register_netdev()
1388 return rc; in bnxt_re_register_netdev()
1391 return rc; in bnxt_re_register_netdev()
1402 int rc; in bnxt_re_set_db_offset() local
1404 res = &rdev->qplib_res; in bnxt_re_set_db_offset()
1405 en_dev = rdev->en_dev; in bnxt_re_set_db_offset()
1406 cctx = rdev->chip_ctx; in bnxt_re_set_db_offset()
1409 rc = bnxt_re_hwrm_qcfg(rdev, &l2db_len, &offset); in bnxt_re_set_db_offset()
1410 if (rc) in bnxt_re_set_db_offset()
1415 res->dpi_tbl.ucreg.offset = offset; in bnxt_re_set_db_offset()
1417 res->dpi_tbl.ucreg.offset = res->is_vf ? BNXT_QPLIB_DBR_VF_DB_OFFSET : in bnxt_re_set_db_offset()
1419 res->dpi_tbl.wcreg.offset = res->dpi_tbl.ucreg.offset; in bnxt_re_set_db_offset()
1421 /* If WC mapping is disabled by L2 driver then en_dev->l2_db_size in bnxt_re_set_db_offset()
1422 * is equal to the DB-Bar actual size. This indicates that L2 in bnxt_re_set_db_offset()
1423 * is mapping entire bar as UC-. RoCE driver can't enable WC mapping in bnxt_re_set_db_offset()
1424 * in such cases and DB-push will be disabled. in bnxt_re_set_db_offset()
1426 barlen = pci_resource_len(res->pdev, RCFW_DBR_PCI_BAR_REGION); in bnxt_re_set_db_offset()
1427 if (cctx->modes.db_push && l2db_len && en_dev->l2_db_size != barlen) { in bnxt_re_set_db_offset()
1428 res->dpi_tbl.wcreg.offset = en_dev->l2_db_size; in bnxt_re_set_db_offset()
1441 en_dev = rdev->en_dev; in bnxt_re_set_drv_mode()
1442 cctx = rdev->chip_ctx; in bnxt_re_set_drv_mode()
1443 cctx->modes.wqe_mode = _is_chip_gen_p5_p7(rdev->chip_ctx) ? in bnxt_re_set_drv_mode()
1445 cctx->modes.te_bypass = false; in bnxt_re_set_drv_mode()
1454 if (_is_chip_p7(rdev->chip_ctx) && cctx->modes.db_push) { in bnxt_re_set_drv_mode()
1455 if (rdev->is_virtfn || BNXT_EN_NPAR(en_dev)) in bnxt_re_set_drv_mode()
1456 cctx->modes.db_push = false; in bnxt_re_set_drv_mode()
1459 rdev->roce_mode = en_dev->flags & BNXT_EN_FLAG_ROCE_CAP; in bnxt_re_set_drv_mode()
1461 "RoCE is supported on the device - caps:0x%x", in bnxt_re_set_drv_mode()
1462 rdev->roce_mode); in bnxt_re_set_drv_mode()
1463 if (!_is_chip_gen_p5_p7(rdev->chip_ctx)) in bnxt_re_set_drv_mode()
1464 rdev->roce_mode = BNXT_RE_FLAG_ROCEV2_CAP; in bnxt_re_set_drv_mode()
1465 cctx->hw_stats_size = en_dev->hw_ring_stats_size; in bnxt_re_set_drv_mode()
1473 if (!rdev->chip_ctx) in bnxt_re_destroy_chip_ctx()
1476 res = &rdev->qplib_res; in bnxt_re_destroy_chip_ctx()
1479 kfree(res->hctx); in bnxt_re_destroy_chip_ctx()
1480 res->rcfw = NULL; in bnxt_re_destroy_chip_ctx()
1481 kfree(rdev->dev_attr); in bnxt_re_destroy_chip_ctx()
1482 rdev->dev_attr = NULL; in bnxt_re_destroy_chip_ctx()
1484 chip_ctx = rdev->chip_ctx; in bnxt_re_destroy_chip_ctx()
1485 rdev->chip_ctx = NULL; in bnxt_re_destroy_chip_ctx()
1486 res->cctx = NULL; in bnxt_re_destroy_chip_ctx()
1487 res->hctx = NULL; in bnxt_re_destroy_chip_ctx()
1488 res->pdev = NULL; in bnxt_re_destroy_chip_ctx()
1489 res->netdev = NULL; in bnxt_re_destroy_chip_ctx()
1497 int rc; in bnxt_re_setup_chip_ctx() local
1499 en_dev = rdev->en_dev; in bnxt_re_setup_chip_ctx()
1501 rdev->qplib_res.pdev = en_dev->pdev; in bnxt_re_setup_chip_ctx()
1502 rdev->qplib_res.netdev = rdev->netdev; in bnxt_re_setup_chip_ctx()
1503 rdev->qplib_res.en_dev = en_dev; in bnxt_re_setup_chip_ctx()
1507 return -ENOMEM; in bnxt_re_setup_chip_ctx()
1508 rdev->chip_ctx = chip_ctx; in bnxt_re_setup_chip_ctx()
1509 rdev->qplib_res.cctx = chip_ctx; in bnxt_re_setup_chip_ctx()
1510 rc = bnxt_re_query_hwrm_intf_version(rdev); in bnxt_re_setup_chip_ctx()
1511 if (rc) in bnxt_re_setup_chip_ctx()
1513 rdev->dev_attr = kzalloc(sizeof(*rdev->dev_attr), GFP_KERNEL); in bnxt_re_setup_chip_ctx()
1514 if (!rdev->dev_attr) { in bnxt_re_setup_chip_ctx()
1515 rc = -ENOMEM; in bnxt_re_setup_chip_ctx()
1518 rdev->qplib_res.dattr = rdev->dev_attr; in bnxt_re_setup_chip_ctx()
1519 rdev->qplib_res.rcfw = &rdev->rcfw; in bnxt_re_setup_chip_ctx()
1520 rdev->qplib_res.is_vf = rdev->is_virtfn; in bnxt_re_setup_chip_ctx()
1522 rdev->qplib_res.hctx = kzalloc(sizeof(*rdev->qplib_res.hctx), in bnxt_re_setup_chip_ctx()
1524 if (!rdev->qplib_res.hctx) { in bnxt_re_setup_chip_ctx()
1525 rc = -ENOMEM; in bnxt_re_setup_chip_ctx()
1531 rc = bnxt_qplib_map_db_bar(&rdev->qplib_res); in bnxt_re_setup_chip_ctx()
1532 if (rc) in bnxt_re_setup_chip_ctx()
1535 rc = bnxt_qplib_enable_atomic_ops_to_root(en_dev->pdev); in bnxt_re_setup_chip_ctx()
1536 if (rc) in bnxt_re_setup_chip_ctx()
1542 kfree(rdev->chip_ctx); in bnxt_re_setup_chip_ctx()
1543 rdev->chip_ctx = NULL; in bnxt_re_setup_chip_ctx()
1545 kfree(rdev->dev_attr); in bnxt_re_setup_chip_ctx()
1546 rdev->dev_attr = NULL; in bnxt_re_setup_chip_ctx()
1548 kfree(rdev->qplib_res.hctx); in bnxt_re_setup_chip_ctx()
1549 rdev->qplib_res.hctx = NULL; in bnxt_re_setup_chip_ctx()
1550 return rc; in bnxt_re_setup_chip_ctx()
1554 return _is_chip_gen_p5_p7(rdev->chip_ctx) ? in bnxt_re_get_rtype()
1561 int rc = -EINVAL; in bnxt_re_net_ring_free() local
1564 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_ring_free()
1568 return rc; in bnxt_re_net_ring_free()
1572 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_net_ring_free()
1581 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_FREE, -1, -1); in bnxt_re_net_ring_free()
1586 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_net_ring_free()
1587 if (rc) { in bnxt_re_net_ring_free()
1589 "Failed to free HW ring with rc = 0x%x", rc); in bnxt_re_net_ring_free()
1590 return rc; in bnxt_re_net_ring_free()
1592 dev_dbg(rdev_to_dev(rdev), "HW ring freed with id = 0x%x\n", in bnxt_re_net_ring_free()
1595 return rc; in bnxt_re_net_ring_free()
1602 int rc = -EINVAL; in bnxt_re_net_ring_alloc() local
1605 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_ring_alloc()
1609 return rc; in bnxt_re_net_ring_alloc()
1612 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_ALLOC, -1, -1); in bnxt_re_net_ring_alloc()
1613 req.flags = cpu_to_le16(ring_attr->flags); in bnxt_re_net_ring_alloc()
1615 req.page_tbl_addr = cpu_to_le64(ring_attr->dma_arr[0]); in bnxt_re_net_ring_alloc()
1616 if (ring_attr->pages > 1) { in bnxt_re_net_ring_alloc()
1627 req.logical_id = cpu_to_le16(ring_attr->lrid); in bnxt_re_net_ring_alloc()
1628 req.length = cpu_to_le32(ring_attr->depth + 1); in bnxt_re_net_ring_alloc()
1629 req.ring_type = ring_attr->type; in bnxt_re_net_ring_alloc()
1630 req.int_mode = ring_attr->mode; in bnxt_re_net_ring_alloc()
1633 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_net_ring_alloc()
1634 if (rc) { in bnxt_re_net_ring_alloc()
1636 "Failed to allocate HW ring with rc = 0x%x", rc); in bnxt_re_net_ring_alloc()
1637 return rc; in bnxt_re_net_ring_alloc()
1641 "HW ring allocated with id = 0x%x at slot 0x%x", in bnxt_re_net_ring_alloc()
1642 resp.ring_id, ring_attr->lrid); in bnxt_re_net_ring_alloc()
1644 return rc; in bnxt_re_net_ring_alloc()
1650 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_stats_ctx_free()
1654 int rc = -EINVAL; in bnxt_re_net_stats_ctx_free() local
1657 return rc; in bnxt_re_net_stats_ctx_free()
1661 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_net_stats_ctx_free()
1664 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_STAT_CTX_FREE, -1, tid); in bnxt_re_net_stats_ctx_free()
1668 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_net_stats_ctx_free()
1669 if (rc) { in bnxt_re_net_stats_ctx_free()
1671 "Failed to free HW stats ctx with rc = 0x%x", rc); in bnxt_re_net_stats_ctx_free()
1672 return rc; in bnxt_re_net_stats_ctx_free()
1675 "HW stats ctx freed with id = 0x%x", fw_stats_ctx_id); in bnxt_re_net_stats_ctx_free()
1677 return rc; in bnxt_re_net_stats_ctx_free()
1684 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_stats_ctx_alloc()
1688 int rc = 0; in bnxt_re_net_stats_ctx_alloc() local
1690 hctx = rdev->qplib_res.hctx; in bnxt_re_net_stats_ctx_alloc()
1691 stat = (tid == 0xffff) ? &hctx->stats : &hctx->stats2; in bnxt_re_net_stats_ctx_alloc()
1692 stat->fw_id = INVALID_STATS_CTX_ID; in bnxt_re_net_stats_ctx_alloc()
1695 return -EINVAL; in bnxt_re_net_stats_ctx_alloc()
1699 HWRM_STAT_CTX_ALLOC, -1, tid); in bnxt_re_net_stats_ctx_alloc()
1701 req.stats_dma_length = rdev->chip_ctx->hw_stats_size; in bnxt_re_net_stats_ctx_alloc()
1702 req.stats_dma_addr = cpu_to_le64(stat->dma_map); in bnxt_re_net_stats_ctx_alloc()
1706 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_net_stats_ctx_alloc()
1707 if (rc) { in bnxt_re_net_stats_ctx_alloc()
1709 "Failed to allocate HW stats ctx, rc = 0x%x", rc); in bnxt_re_net_stats_ctx_alloc()
1710 return rc; in bnxt_re_net_stats_ctx_alloc()
1712 stat->fw_id = le32_to_cpu(resp.stat_ctx_id); in bnxt_re_net_stats_ctx_alloc()
1713 dev_dbg(rdev_to_dev(rdev), "HW stats ctx allocated with id = 0x%x", in bnxt_re_net_stats_ctx_alloc()
1714 stat->fw_id); in bnxt_re_net_stats_ctx_alloc()
1716 return rc; in bnxt_re_net_stats_ctx_alloc()
1723 if (rdev->is_virtfn || in bnxt_re_net_unregister_async_event()
1724 test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_net_unregister_async_event()
1727 memset(rdev->event_bitmap, 0, sizeof(rdev->event_bitmap)); in bnxt_re_net_unregister_async_event()
1728 en_ops = rdev->en_dev->en_ops; in bnxt_re_net_unregister_async_event()
1729 if (en_ops->bnxt_register_fw_async_events in bnxt_re_net_unregister_async_event()
1730 (rdev->en_dev, BNXT_ROCE_ULP, in bnxt_re_net_unregister_async_event()
1731 (unsigned long *)rdev->event_bitmap, in bnxt_re_net_unregister_async_event()
1741 if (rdev->is_virtfn) in bnxt_re_net_register_async_event()
1744 rdev->event_bitmap[0] |= in bnxt_re_net_register_async_event()
1748 rdev->event_bitmap[2] |= in bnxt_re_net_register_async_event()
1749 BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ERROR_REPORT - 64); in bnxt_re_net_register_async_event()
1750 rdev->event_bitmap[2] |= in bnxt_re_net_register_async_event()
1751 BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_THRESHOLD - 64) | in bnxt_re_net_register_async_event()
1752 BIT(HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DOORBELL_PACING_NQ_UPDATE - 64); in bnxt_re_net_register_async_event()
1753 en_ops = rdev->en_dev->en_ops; in bnxt_re_net_register_async_event()
1754 if (en_ops->bnxt_register_fw_async_events in bnxt_re_net_register_async_event()
1755 (rdev->en_dev, BNXT_ROCE_ULP, in bnxt_re_net_register_async_event()
1756 (unsigned long *)rdev->event_bitmap, in bnxt_re_net_register_async_event()
1764 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_query_hwrm_intf_version()
1769 int rc = 0; in bnxt_re_query_hwrm_intf_version() local
1773 HWRM_VER_GET, -1, -1); in bnxt_re_query_hwrm_intf_version()
1779 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_query_hwrm_intf_version()
1780 if (rc) { in bnxt_re_query_hwrm_intf_version()
1782 "Failed to query HW version, rc = 0x%x", rc); in bnxt_re_query_hwrm_intf_version()
1783 return rc; in bnxt_re_query_hwrm_intf_version()
1785 cctx = rdev->chip_ctx; in bnxt_re_query_hwrm_intf_version()
1786 cctx->hwrm_intf_ver = (u64) le16_to_cpu(resp.hwrm_intf_major) << 48 | in bnxt_re_query_hwrm_intf_version()
1791 cctx->hwrm_cmd_max_timeout = le16_to_cpu(resp.max_req_timeout); in bnxt_re_query_hwrm_intf_version()
1793 if (!cctx->hwrm_cmd_max_timeout) in bnxt_re_query_hwrm_intf_version()
1794 cctx->hwrm_cmd_max_timeout = RCFW_FW_STALL_MAX_TIMEOUT; in bnxt_re_query_hwrm_intf_version()
1796 cctx->chip_num = le16_to_cpu(resp.chip_num); in bnxt_re_query_hwrm_intf_version()
1797 cctx->chip_rev = resp.chip_rev; in bnxt_re_query_hwrm_intf_version()
1798 cctx->chip_metal = resp.chip_metal; in bnxt_re_query_hwrm_intf_version()
1806 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_qcfg()
1810 int rc; in bnxt_re_hwrm_qcfg() local
1814 HWRM_FUNC_QCFG, -1, -1); in bnxt_re_hwrm_qcfg()
1818 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_qcfg()
1819 if (rc) { in bnxt_re_hwrm_qcfg()
1821 "Failed to query config, rc = %#x", rc); in bnxt_re_hwrm_qcfg()
1822 return rc; in bnxt_re_hwrm_qcfg()
1833 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_qcaps()
1839 int rc; in bnxt_re_hwrm_qcaps() local
1841 cctx = rdev->chip_ctx; in bnxt_re_hwrm_qcaps()
1844 HWRM_FUNC_QCAPS, -1, -1); in bnxt_re_hwrm_qcaps()
1848 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_qcaps()
1849 if (rc) { in bnxt_re_hwrm_qcaps()
1851 "Failed to query capabilities, rc = %#x", rc); in bnxt_re_hwrm_qcaps()
1852 return rc; in bnxt_re_hwrm_qcaps()
1854 if (_is_chip_p7(rdev->chip_ctx)) in bnxt_re_hwrm_qcaps()
1863 cctx->modes.db_push = push_enable; in bnxt_re_hwrm_qcaps()
1865 cctx->modes.dbr_pacing = in bnxt_re_hwrm_qcaps()
1868 cctx->modes.dbr_pacing_ext = in bnxt_re_hwrm_qcaps()
1872 cctx->modes.dbr_drop_recov = in bnxt_re_hwrm_qcaps()
1876 cctx->modes.dbr_pacing_v0 = in bnxt_re_hwrm_qcaps()
1881 "%s: cctx->modes.dbr_pacing = %d cctx->modes.dbr_pacing_ext = %d, dbr_drop_recov %d\n", in bnxt_re_hwrm_qcaps()
1882 __func__, cctx->modes.dbr_pacing, cctx->modes.dbr_pacing_ext, cctx->modes.dbr_drop_recov); in bnxt_re_hwrm_qcaps()
1889 struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data; in bnxt_re_hwrm_dbr_pacing_qcfg()
1892 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_dbr_pacing_qcfg()
1896 int rc; in bnxt_re_hwrm_dbr_pacing_qcfg() local
1898 cctx = rdev->chip_ctx; in bnxt_re_hwrm_dbr_pacing_qcfg()
1901 HWRM_FUNC_DBR_PACING_QCFG, -1, -1); in bnxt_re_hwrm_dbr_pacing_qcfg()
1904 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_dbr_pacing_qcfg()
1905 if (rc) { in bnxt_re_hwrm_dbr_pacing_qcfg()
1907 "Failed to query dbr pacing config, rc = %#x", rc); in bnxt_re_hwrm_dbr_pacing_qcfg()
1908 return rc; in bnxt_re_hwrm_dbr_pacing_qcfg()
1913 !bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) { in bnxt_re_hwrm_dbr_pacing_qcfg()
1916 bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 1); in bnxt_re_hwrm_dbr_pacing_qcfg()
1919 if (bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) { in bnxt_re_hwrm_dbr_pacing_qcfg()
1922 nq = &rdev->nqr.nq[0]; in bnxt_re_hwrm_dbr_pacing_qcfg()
1924 if (nq->ring_id != primary_nq_id) in bnxt_re_hwrm_dbr_pacing_qcfg()
1925 bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 0); in bnxt_re_hwrm_dbr_pacing_qcfg()
1931 cctx->dbr_stat_db_fifo = in bnxt_re_hwrm_dbr_pacing_qcfg()
1938 cctx->dbr_aeq_arm_reg = resp.dbr_throttling_aeq_arm_reg & in bnxt_re_hwrm_dbr_pacing_qcfg()
1940 cctx->dbr_throttling_reg = cctx->dbr_aeq_arm_reg - 4; in bnxt_re_hwrm_dbr_pacing_qcfg()
1942 pacing_data->fifo_max_depth = le32_to_cpu(resp.dbr_stat_db_max_fifo_depth); in bnxt_re_hwrm_dbr_pacing_qcfg()
1943 if (!pacing_data->fifo_max_depth) in bnxt_re_hwrm_dbr_pacing_qcfg()
1944 pacing_data->fifo_max_depth = BNXT_RE_MAX_FIFO_DEPTH(cctx); in bnxt_re_hwrm_dbr_pacing_qcfg()
1945 pacing_data->fifo_room_mask = le32_to_cpu(resp.dbr_stat_db_fifo_reg_fifo_room_mask); in bnxt_re_hwrm_dbr_pacing_qcfg()
1946 pacing_data->fifo_room_shift = resp.dbr_stat_db_fifo_reg_fifo_room_shift; in bnxt_re_hwrm_dbr_pacing_qcfg()
1948 "%s: nq:0x%x primary_pf:%d db_fifo:0x%x aeq_arm:0x%x i" in bnxt_re_hwrm_dbr_pacing_qcfg()
1949 "fifo_max_depth 0x%x , resp.dbr_stat_db_max_fifo_depth 0x%x);\n", in bnxt_re_hwrm_dbr_pacing_qcfg()
1950 __func__, resp.primary_nq_id, cctx->modes.dbr_primary_pf, in bnxt_re_hwrm_dbr_pacing_qcfg()
1951 cctx->dbr_stat_db_fifo, cctx->dbr_aeq_arm_reg, in bnxt_re_hwrm_dbr_pacing_qcfg()
1952 pacing_data->fifo_max_depth, in bnxt_re_hwrm_dbr_pacing_qcfg()
1961 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_dbr_pacing_cfg()
1963 int rc; in bnxt_re_hwrm_dbr_pacing_cfg() local
1965 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_hwrm_dbr_pacing_cfg()
1970 HWRM_FUNC_DBR_PACING_CFG, -1, -1); in bnxt_re_hwrm_dbr_pacing_cfg()
1979 req.primary_nq_id = cpu_to_le32(rdev->dbq_nq_id); in bnxt_re_hwrm_dbr_pacing_cfg()
1980 req.pacing_threshold = cpu_to_le32(rdev->dbq_watermark); in bnxt_re_hwrm_dbr_pacing_cfg()
1981 dev_dbg(rdev_to_dev(rdev), "%s: nq_id = 0x%x pacing_threshold = 0x%x", in bnxt_re_hwrm_dbr_pacing_cfg()
1985 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_dbr_pacing_cfg()
1986 if (rc) { in bnxt_re_hwrm_dbr_pacing_cfg()
1988 "Failed to set dbr pacing config, rc = %#x", rc); in bnxt_re_hwrm_dbr_pacing_cfg()
1989 return rc; in bnxt_re_hwrm_dbr_pacing_cfg()
1994 /* Net -> RoCE driver */
2003 if (rdev->netdev == netdev) { in bnxt_re_from_netdev()
2006 "netdev (%p) found, ref_count = 0x%x", in bnxt_re_from_netdev()
2007 netdev, atomic_read(&rdev->ref_count)); in bnxt_re_from_netdev()
2020 return scnprintf(buf, PAGE_SIZE, "0x%x\n", rdev->en_dev->pdev->vendor); in show_rev()
2029 return scnprintf(buf, PAGE_SIZE, "%s\n", rdev->ibdev.node_desc); in show_hca()
2041 struct ib_device *ibdev = &rdev->ibdev; in ib_register_device_compat()
2047 strlcpy(ibdev->name, name, IB_DEVICE_NAME_MAX); in ib_register_device_compat()
2054 struct ib_device *ibdev = &rdev->ibdev; in bnxt_re_register_ib()
2058 ibdev->owner = THIS_MODULE; in bnxt_re_register_ib()
2059 ibdev->uverbs_abi_ver = BNXT_RE_ABI_VERSION; in bnxt_re_register_ib()
2060 ibdev->node_type = RDMA_NODE_IB_CA; in bnxt_re_register_ib()
2061 strlcpy(ibdev->node_desc, BNXT_RE_DESC " HCA", in bnxt_re_register_ib()
2063 ibdev->phys_port_cnt = 1; in bnxt_re_register_ib()
2065 bnxt_qplib_get_guid(rdev->dev_addr, (u8 *)&ibdev->node_guid); in bnxt_re_register_ib()
2068 ibdev->num_comp_vectors = rdev->nqr.num_msix - 1; in bnxt_re_register_ib()
2070 ibdev->local_dma_lkey = BNXT_QPLIB_RSVD_LKEY; in bnxt_re_register_ib()
2073 ibdev->uverbs_cmd_mask = in bnxt_re_register_ib()
2101 ibdev->uverbs_ex_cmd_mask = (1ull << IB_USER_VERBS_EX_CMD_MODIFY_QP); in bnxt_re_register_ib()
2102 ibdev->uverbs_cmd_mask |= (1ull << IB_USER_VERBS_CMD_POLL_CQ); in bnxt_re_register_ib()
2109 INIT_IB_DEVICE_OPS(&ibdev->ops, bnxt_re, BNXT_RE); in bnxt_re_register_ib()
2111 ibdev->query_device = bnxt_re_query_device; in bnxt_re_register_ib()
2112 ibdev->modify_device = bnxt_re_modify_device; in bnxt_re_register_ib()
2113 ibdev->query_port = bnxt_re_query_port; in bnxt_re_register_ib()
2114 ibdev->modify_port = bnxt_re_modify_port; in bnxt_re_register_ib()
2115 ibdev->get_port_immutable = bnxt_re_get_port_immutable; in bnxt_re_register_ib()
2116 ibdev->query_pkey = bnxt_re_query_pkey; in bnxt_re_register_ib()
2117 ibdev->query_gid = bnxt_re_query_gid; in bnxt_re_register_ib()
2118 ibdev->get_netdev = bnxt_re_get_netdev; in bnxt_re_register_ib()
2119 ibdev->add_gid = bnxt_re_add_gid; in bnxt_re_register_ib()
2120 ibdev->del_gid = bnxt_re_del_gid; in bnxt_re_register_ib()
2121 ibdev->get_link_layer = bnxt_re_get_link_layer; in bnxt_re_register_ib()
2122 ibdev->alloc_pd = bnxt_re_alloc_pd; in bnxt_re_register_ib()
2123 ibdev->dealloc_pd = bnxt_re_dealloc_pd; in bnxt_re_register_ib()
2124 ibdev->create_ah = bnxt_re_create_ah; in bnxt_re_register_ib()
2125 ibdev->modify_ah = bnxt_re_modify_ah; in bnxt_re_register_ib()
2126 ibdev->query_ah = bnxt_re_query_ah; in bnxt_re_register_ib()
2127 ibdev->destroy_ah = bnxt_re_destroy_ah; in bnxt_re_register_ib()
2128 ibdev->create_srq = bnxt_re_create_srq; in bnxt_re_register_ib()
2129 ibdev->modify_srq = bnxt_re_modify_srq; in bnxt_re_register_ib()
2130 ibdev->query_srq = bnxt_re_query_srq; in bnxt_re_register_ib()
2131 ibdev->destroy_srq = bnxt_re_destroy_srq; in bnxt_re_register_ib()
2132 ibdev->post_srq_recv = bnxt_re_post_srq_recv; in bnxt_re_register_ib()
2133 ibdev->create_qp = bnxt_re_create_qp; in bnxt_re_register_ib()
2134 ibdev->modify_qp = bnxt_re_modify_qp; in bnxt_re_register_ib()
2135 ibdev->query_qp = bnxt_re_query_qp; in bnxt_re_register_ib()
2136 ibdev->destroy_qp = bnxt_re_destroy_qp; in bnxt_re_register_ib()
2137 ibdev->post_send = bnxt_re_post_send; in bnxt_re_register_ib()
2138 ibdev->post_recv = bnxt_re_post_recv; in bnxt_re_register_ib()
2139 ibdev->create_cq = bnxt_re_create_cq; in bnxt_re_register_ib()
2140 ibdev->modify_cq = bnxt_re_modify_cq; in bnxt_re_register_ib()
2141 ibdev->destroy_cq = bnxt_re_destroy_cq; in bnxt_re_register_ib()
2142 ibdev->resize_cq = bnxt_re_resize_cq; in bnxt_re_register_ib()
2143 ibdev->poll_cq = bnxt_re_poll_cq; in bnxt_re_register_ib()
2144 ibdev->req_notify_cq = bnxt_re_req_notify_cq; in bnxt_re_register_ib()
2145 ibdev->get_dma_mr = bnxt_re_get_dma_mr; in bnxt_re_register_ib()
2146 ibdev->get_hw_stats = bnxt_re_get_hw_stats; in bnxt_re_register_ib()
2147 ibdev->alloc_hw_stats = bnxt_re_alloc_hw_port_stats; in bnxt_re_register_ib()
2148 ibdev->dereg_mr = bnxt_re_dereg_mr; in bnxt_re_register_ib()
2149 ibdev->alloc_mr = bnxt_re_alloc_mr; in bnxt_re_register_ib()
2150 ibdev->map_mr_sg = bnxt_re_map_mr_sg; in bnxt_re_register_ib()
2151 ibdev->alloc_mw = bnxt_re_alloc_mw; in bnxt_re_register_ib()
2152 ibdev->dealloc_mw = bnxt_re_dealloc_mw; in bnxt_re_register_ib()
2153 ibdev->reg_user_mr = bnxt_re_reg_user_mr; in bnxt_re_register_ib()
2154 ibdev->rereg_user_mr = bnxt_re_rereg_user_mr; in bnxt_re_register_ib()
2155 ibdev->disassociate_ucontext = bnxt_re_disassociate_ucntx; in bnxt_re_register_ib()
2156 ibdev->alloc_ucontext = bnxt_re_alloc_ucontext; in bnxt_re_register_ib()
2157 ibdev->dealloc_ucontext = bnxt_re_dealloc_ucontext; in bnxt_re_register_ib()
2158 ibdev->mmap = bnxt_re_mmap; in bnxt_re_register_ib()
2159 ibdev->process_mad = bnxt_re_process_mad; in bnxt_re_register_ib()
2171 while ((atomic_read(&rdev->ref_count) > 1) && i--) in bnxt_re_dev_dealloc()
2174 if (atomic_read(&rdev->ref_count) > 1) in bnxt_re_dev_dealloc()
2177 atomic_read(&rdev->ref_count)); in bnxt_re_dev_dealloc()
2179 atomic_set(&rdev->ref_count, 0); in bnxt_re_dev_dealloc()
2180 if_rele(rdev->netdev); in bnxt_re_dev_dealloc()
2181 rdev->netdev = NULL; in bnxt_re_dev_dealloc()
2184 kfree(rdev->gid_map); in bnxt_re_dev_dealloc()
2185 kfree(rdev->dbg_stats); in bnxt_re_dev_dealloc()
2186 ib_dealloc_device(&rdev->ibdev); in bnxt_re_dev_dealloc()
2203 atomic_set(&rdev->ref_count, 0); in bnxt_re_dev_alloc()
2204 rdev->netdev = netdev; in bnxt_re_dev_alloc()
2205 dev_hold(rdev->netdev); in bnxt_re_dev_alloc()
2206 rdev->en_dev = en_dev; in bnxt_re_dev_alloc()
2207 rdev->id = rdev->en_dev->pdev->devfn; in bnxt_re_dev_alloc()
2208 INIT_LIST_HEAD(&rdev->qp_list); in bnxt_re_dev_alloc()
2209 mutex_init(&rdev->qp_lock); in bnxt_re_dev_alloc()
2210 mutex_init(&rdev->cc_lock); in bnxt_re_dev_alloc()
2211 mutex_init(&rdev->dbq_lock); in bnxt_re_dev_alloc()
2212 bnxt_re_clear_rsors_stat(&rdev->stats.rsors); in bnxt_re_dev_alloc()
2213 rdev->cosq[0] = rdev->cosq[1] = 0xFFFF; in bnxt_re_dev_alloc()
2214 rdev->min_tx_depth = 1; in bnxt_re_dev_alloc()
2215 rdev->stats.stats_query_sec = 1; in bnxt_re_dev_alloc()
2217 rdev->cc_param.disable_prio_vlan_tx = 1; in bnxt_re_dev_alloc()
2220 INIT_WORK(&rdev->dbq_fifo_check_work, bnxt_re_db_fifo_check); in bnxt_re_dev_alloc()
2221 INIT_DELAYED_WORK(&rdev->dbq_pacing_work, bnxt_re_pacing_timer_exp); in bnxt_re_dev_alloc()
2222 rdev->gid_map = kzalloc(sizeof(*(rdev->gid_map)) * in bnxt_re_dev_alloc()
2225 if (!rdev->gid_map) { in bnxt_re_dev_alloc()
2226 ib_dealloc_device(&rdev->ibdev); in bnxt_re_dev_alloc()
2230 rdev->gid_map[count] = -1; in bnxt_re_dev_alloc()
2232 rdev->dbg_stats = kzalloc(sizeof(*rdev->dbg_stats), GFP_KERNEL); in bnxt_re_dev_alloc()
2233 if (!rdev->dbg_stats) { in bnxt_re_dev_alloc()
2234 ib_dealloc_device(&rdev->ibdev); in bnxt_re_dev_alloc()
2244 switch (unaffi_async->event) { in bnxt_re_handle_unaffi_async_event()
2258 return -EINVAL; in bnxt_re_handle_unaffi_async_event()
2269 if (qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR && in bnxt_re_handle_qp_async_event()
2270 !qp->qplib_qp.is_user) { in bnxt_re_handle_qp_async_event()
2272 bnxt_qplib_add_flush_qp(&qp->qplib_qp); in bnxt_re_handle_qp_async_event()
2276 event.device = &qp->rdev->ibdev; in bnxt_re_handle_qp_async_event()
2277 event.element.qp = &qp->ib_qp; in bnxt_re_handle_qp_async_event()
2281 switch(err_event->res_err_state_reason) { in bnxt_re_handle_qp_async_event()
2315 if (qp->qplib_qp.srq) in bnxt_re_handle_qp_async_event()
2320 if (err_event->res_err_state_reason) in bnxt_re_handle_qp_async_event()
2321 dev_err(rdev_to_dev(qp->rdev), in bnxt_re_handle_qp_async_event()
2323 __func__, qp->qplib_qp.is_user ? "user" : "kernel", in bnxt_re_handle_qp_async_event()
2324 qp->qplib_qp.id, in bnxt_re_handle_qp_async_event()
2325 err_event->sq_cons_idx, in bnxt_re_handle_qp_async_event()
2326 err_event->rq_cons_idx, in bnxt_re_handle_qp_async_event()
2327 err_event->req_slow_path_state, in bnxt_re_handle_qp_async_event()
2328 err_event->req_err_state_reason, in bnxt_re_handle_qp_async_event()
2329 err_event->res_slow_path_state, in bnxt_re_handle_qp_async_event()
2330 err_event->res_err_state_reason); in bnxt_re_handle_qp_async_event()
2332 if (event.device && qp->ib_qp.event_handler) in bnxt_re_handle_qp_async_event()
2333 qp->ib_qp.event_handler(&event, qp->ib_qp.qp_context); in bnxt_re_handle_qp_async_event()
2344 switch (cqerr->cq_err_reason) { in bnxt_re_handle_cq_async_error()
2356 if (send && cq->ibcq.event_handler) { in bnxt_re_handle_cq_async_error()
2360 ibevent.element.cq = &cq->ibcq; in bnxt_re_handle_cq_async_error()
2361 ibevent.device = &cq->rdev->ibdev; in bnxt_re_handle_cq_async_error()
2363 dev_err(rdev_to_dev(cq->rdev), in bnxt_re_handle_cq_async_error()
2364 "%s err reason %d\n", __func__, cqerr->cq_err_reason); in bnxt_re_handle_cq_async_error()
2365 cq->ibcq.event_handler(&ibevent, cq->ibcq.cq_context); in bnxt_re_handle_cq_async_error()
2368 cq->qplib_cq.is_cq_err_event = true; in bnxt_re_handle_cq_async_error()
2380 int rc = 0; in bnxt_re_handle_affi_async_event() local
2384 return rc; /* QP was already dead, still return success */ in bnxt_re_handle_affi_async_event()
2386 event = affi_async->event; in bnxt_re_handle_affi_async_event()
2391 rc = bnxt_re_handle_qp_async_event(affi_async, qp); in bnxt_re_handle_affi_async_event()
2396 rc = bnxt_re_handle_cq_async_error(affi_async, cq); in bnxt_re_handle_affi_async_event()
2399 rc = -EINVAL; in bnxt_re_handle_affi_async_event()
2402 return rc; in bnxt_re_handle_affi_async_event()
2411 int rc; in bnxt_re_aeq_handler() local
2413 type = ((struct creq_base *)aeqe)->type; in bnxt_re_aeq_handler()
2416 rc = bnxt_re_handle_unaffi_async_event(unaffi_async); in bnxt_re_aeq_handler()
2419 rc = bnxt_re_handle_affi_async_event(affi_async, obj); in bnxt_re_aeq_handler()
2422 return rc; in bnxt_re_aeq_handler()
2435 return -EINVAL; in bnxt_re_srqn_handler()
2437 ib_event.device = &srq->rdev->ibdev; in bnxt_re_srqn_handler()
2438 ib_event.element.srq = &srq->ibsrq; in bnxt_re_srqn_handler()
2444 if (srq->ibsrq.event_handler) { in bnxt_re_srqn_handler()
2446 (*srq->ibsrq.event_handler)(&ib_event, in bnxt_re_srqn_handler()
2447 srq->ibsrq.srq_context); in bnxt_re_srqn_handler()
2462 return -EINVAL; in bnxt_re_cqn_handler()
2465 if (handle->destroyed || !atomic_read(&cq->ibcq.usecnt)) { in bnxt_re_cqn_handler()
2466 if (!handle->destroyed) in bnxt_re_cqn_handler()
2472 if (cq->ibcq.comp_handler) { in bnxt_re_cqn_handler()
2473 if (cq->uctx_cq_page) { in bnxt_re_cqn_handler()
2474 cq_ptr = (u32 *)cq->uctx_cq_page; in bnxt_re_cqn_handler()
2475 *cq_ptr = cq->qplib_cq.toggle; in bnxt_re_cqn_handler()
2478 (*cq->ibcq.comp_handler)(&cq->ibcq, cq->ibcq.cq_context); in bnxt_re_cqn_handler()
2488 mutex_lock(&rdev->nqr.load_lock); in bnxt_re_get_nq()
2489 for (indx = 0, min = 0; indx < (rdev->nqr.num_msix - 1); indx++) { in bnxt_re_get_nq()
2490 if (rdev->nqr.nq[min].load > rdev->nqr.nq[indx].load) in bnxt_re_get_nq()
2493 rdev->nqr.nq[min].load++; in bnxt_re_get_nq()
2494 mutex_unlock(&rdev->nqr.load_lock); in bnxt_re_get_nq()
2496 return &rdev->nqr.nq[min]; in bnxt_re_get_nq()
2501 mutex_lock(&rdev->nqr.load_lock); in bnxt_re_put_nq()
2502 nq->load--; in bnxt_re_put_nq()
2503 mutex_unlock(&rdev->nqr.load_lock); in bnxt_re_put_nq()
2509 bool rc = true; in bnxt_re_check_min_attr() local
2511 attr = rdev->dev_attr; in bnxt_re_check_min_attr()
2513 if (!attr->max_cq || !attr->max_qp || in bnxt_re_check_min_attr()
2514 !attr->max_sgid || !attr->max_mr) { in bnxt_re_check_min_attr()
2518 attr->max_cq, attr->max_qp, attr->max_dpi, in bnxt_re_check_min_attr()
2519 attr->max_sgid, attr->max_mr); in bnxt_re_check_min_attr()
2520 rc = false; in bnxt_re_check_min_attr()
2522 return rc; in bnxt_re_check_min_attr()
2534 if (qp->event_handler) in bnxt_re_dispatch_event()
2535 qp->event_handler(&ib_event, qp->qp_context); in bnxt_re_dispatch_event()
2543 "ibdev %p Event 0x%x port_num 0x%x", ibdev, event, port_num); in bnxt_re_dispatch_event()
2549 if (rdev->gsi_ctx.gsi_qp_mode == BNXT_RE_GSI_MODE_ALL) in bnxt_re_is_qp1_or_shadow_qp()
2550 return (qp->ib_qp.qp_type == IB_QPT_GSI) || in bnxt_re_is_qp1_or_shadow_qp()
2551 (qp == rdev->gsi_ctx.gsi_sqp); in bnxt_re_is_qp1_or_shadow_qp()
2553 return (qp->ib_qp.qp_type == IB_QPT_GSI); in bnxt_re_is_qp1_or_shadow_qp()
2570 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2574 mutex_lock(&rdev->qp_lock); in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2575 list_for_each_entry(qp, &rdev->qp_list, list) { in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2576 qpl_qp = &qp->qplib_qp; in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2578 if (qpl_qp->state != in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2580 qpl_qp->state != in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2587 qpl_qp->state = in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2589 qpl_qp->cur_qp_state = qpl_qp->state; in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2590 if (!qpl_qp->is_user) { in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2598 bnxt_re_modify_qp(&qp->ib_qp, in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2603 bnxt_re_dispatch_event(&rdev->ibdev, &qp->ib_qp, in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2612 mutex_unlock(&rdev->qp_lock); in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2619 mutex_unlock(&rdev->qp_lock); in bnxt_re_stop_all_nonqp1_nonshadow_qps()
2624 struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl; in bnxt_re_update_gid()
2627 int rc = 0; in bnxt_re_update_gid() local
2629 if (!test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) in bnxt_re_update_gid()
2634 return -EINVAL; in bnxt_re_update_gid()
2637 for (index = 0; index < sgid_tbl->active; index++) { in bnxt_re_update_gid()
2638 gid_idx = sgid_tbl->hw_id[index]; in bnxt_re_update_gid()
2640 if (!memcmp(&sgid_tbl->tbl[index], &bnxt_qplib_gid_zero, in bnxt_re_update_gid()
2649 if (sgid_tbl->vlan[index] == true) in bnxt_re_update_gid()
2652 memcpy(&gid, &sgid_tbl->tbl[index], sizeof(gid)); in bnxt_re_update_gid()
2654 rc = bnxt_qplib_update_sgid(sgid_tbl, &gid, gid_idx, in bnxt_re_update_gid()
2655 rdev->dev_addr); in bnxt_re_update_gid()
2658 return rc; in bnxt_re_update_gid()
2663 struct bnxt_qplib_cc_param *cc_param = &rdev->cc_param; in bnxt_re_clear_cc()
2665 if (_is_chip_p7(rdev->chip_ctx)) { in bnxt_re_clear_cc()
2666 cc_param->mask = CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP; in bnxt_re_clear_cc()
2668 cc_param->mask = (CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_CC_MODE | in bnxt_re_clear_cc()
2673 cc_param->mask |= in bnxt_re_clear_cc()
2679 cc_param->cur_mask = cc_param->mask; in bnxt_re_clear_cc()
2681 if (bnxt_qplib_modify_cc(&rdev->qplib_res, cc_param)) in bnxt_re_clear_cc()
2687 struct bnxt_qplib_cc_param *cc_param = &rdev->cc_param; in bnxt_re_setup_cc()
2688 int rc; in bnxt_re_setup_cc() local
2690 if (_is_chip_p7(rdev->chip_ctx)) { in bnxt_re_setup_cc()
2691 cc_param->enable = 0x0; in bnxt_re_setup_cc()
2692 cc_param->mask = CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_TOS_DSCP; in bnxt_re_setup_cc()
2694 cc_param->enable = 0x1; in bnxt_re_setup_cc()
2695 cc_param->mask = (CMDQ_MODIFY_ROCE_CC_MODIFY_MASK_CC_MODE | in bnxt_re_setup_cc()
2700 cc_param->mask |= in bnxt_re_setup_cc()
2706 cc_param->cur_mask = cc_param->mask; in bnxt_re_setup_cc()
2708 rc = bnxt_qplib_modify_cc(&rdev->qplib_res, cc_param); in bnxt_re_setup_cc()
2709 if (rc) { in bnxt_re_setup_cc()
2711 return rc; in bnxt_re_setup_cc()
2714 cc_param->mask = 0; in bnxt_re_setup_cc()
2715 if (cc_param->qp1_tos_dscp != cc_param->tos_dscp) { in bnxt_re_setup_cc()
2716 cc_param->qp1_tos_dscp = cc_param->tos_dscp; in bnxt_re_setup_cc()
2717 rc = bnxt_re_update_qp1_tos_dscp(rdev); in bnxt_re_setup_cc()
2718 if (rc) { in bnxt_re_setup_cc()
2720 __func__, rc); in bnxt_re_setup_cc()
2728 return rc; in bnxt_re_setup_cc()
2735 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_query_hwrm_dscp2pri()
2742 int rc = 0, i; in bnxt_re_query_hwrm_dscp2pri() local
2750 HWRM_QUEUE_DSCP2PRI_QCFG, -1, target_id); in bnxt_re_query_hwrm_dscp2pri()
2751 req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1; in bnxt_re_query_hwrm_dscp2pri()
2753 kmem = dma_zalloc_coherent(&en_dev->pdev->dev, data_len, &dma_handle, in bnxt_re_query_hwrm_dscp2pri()
2759 return -ENOMEM; in bnxt_re_query_hwrm_dscp2pri()
2765 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_query_hwrm_dscp2pri()
2766 if (rc) in bnxt_re_query_hwrm_dscp2pri()
2769 /* Upload the DSCP-MASK-PRI tuple(s) */ in bnxt_re_query_hwrm_dscp2pri()
2772 d2p[i].dscp = dscp2pri->dscp; in bnxt_re_query_hwrm_dscp2pri()
2773 d2p[i].mask = dscp2pri->mask; in bnxt_re_query_hwrm_dscp2pri()
2774 d2p[i].pri = dscp2pri->pri; in bnxt_re_query_hwrm_dscp2pri()
2779 dma_free_coherent(&en_dev->pdev->dev, data_len, kmem, dma_handle); in bnxt_re_query_hwrm_dscp2pri()
2780 return rc; in bnxt_re_query_hwrm_dscp2pri()
2786 if (rdev->cc_param.disable_prio_vlan_tx) in bnxt_re_prio_vlan_tx_update()
2787 rdev->qplib_res.prio = false; in bnxt_re_prio_vlan_tx_update()
2789 rdev->qplib_res.prio = true; in bnxt_re_prio_vlan_tx_update()
2798 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_set_hwrm_dscp2pri()
2803 int i, rc, data_len = 3 * 256; in bnxt_re_set_hwrm_dscp2pri() local
2810 HWRM_QUEUE_DSCP2PRI_CFG, -1, target_id); in bnxt_re_set_hwrm_dscp2pri()
2811 req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1; in bnxt_re_set_hwrm_dscp2pri()
2813 kmem = dma_alloc_coherent(&en_dev->pdev->dev, data_len, &dma_handle, in bnxt_re_set_hwrm_dscp2pri()
2819 return -ENOMEM; in bnxt_re_set_hwrm_dscp2pri()
2823 /* Download the DSCP-MASK-PRI tuple(s) */ in bnxt_re_set_hwrm_dscp2pri()
2826 dscp2pri->dscp = d2p[i].dscp; in bnxt_re_set_hwrm_dscp2pri()
2827 dscp2pri->mask = d2p[i].mask; in bnxt_re_set_hwrm_dscp2pri()
2828 dscp2pri->pri = d2p[i].pri; in bnxt_re_set_hwrm_dscp2pri()
2835 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_set_hwrm_dscp2pri()
2836 dma_free_coherent(&en_dev->pdev->dev, data_len, kmem, dma_handle); in bnxt_re_set_hwrm_dscp2pri()
2837 return rc; in bnxt_re_set_hwrm_dscp2pri()
2846 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_query_hwrm_qportcfg()
2851 int rc; in bnxt_re_query_hwrm_qportcfg() local
2855 -1, tid); in bnxt_re_query_hwrm_qportcfg()
2856 req.port_id = (tid == 0xFFFF) ? en_dev->pf_port_id : 1; in bnxt_re_query_hwrm_qportcfg()
2862 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_query_hwrm_qportcfg()
2863 if (rc) in bnxt_re_query_hwrm_qportcfg()
2864 return rc; in bnxt_re_query_hwrm_qportcfg()
2867 return -EINVAL; in bnxt_re_query_hwrm_qportcfg()
2870 tc_rec->max_tc = max_tc; in bnxt_re_query_hwrm_qportcfg()
2873 tc_rec->serv_type_enabled = true; in bnxt_re_query_hwrm_qportcfg()
2879 tmp_type = tc ? type_ptr1 + (tc - 1) : type_ptr0; in bnxt_re_query_hwrm_qportcfg()
2886 tc_rec->cos_id_roce = cos_id; in bnxt_re_query_hwrm_qportcfg()
2887 tc_rec->tc_roce = tc; in bnxt_re_query_hwrm_qportcfg()
2889 tc_rec->cos_id_cnp = cos_id; in bnxt_re_query_hwrm_qportcfg()
2890 tc_rec->tc_cnp = tc; in bnxt_re_query_hwrm_qportcfg()
2893 tc_rec->tc_def = tc; in bnxt_re_query_hwrm_qportcfg()
2894 tc_rec->cos_id_def = cos_id; in bnxt_re_query_hwrm_qportcfg()
2899 return rc; in bnxt_re_query_hwrm_qportcfg()
2905 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_cos2bw_qcfg()
2909 int rc, indx; in bnxt_re_hwrm_cos2bw_qcfg() local
2914 HWRM_QUEUE_COS2BW_QCFG, -1, target_id); in bnxt_re_hwrm_cos2bw_qcfg()
2915 req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1; in bnxt_re_hwrm_cos2bw_qcfg()
2919 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_cos2bw_qcfg()
2920 if (rc) in bnxt_re_hwrm_cos2bw_qcfg()
2921 return rc; in bnxt_re_hwrm_cos2bw_qcfg()
2924 for (indx = 0; indx < 8; indx++, data += (sizeof(cfg->cfg))) { in bnxt_re_hwrm_cos2bw_qcfg()
2925 memcpy(&cfg->cfg, data, sizeof(cfg->cfg)); in bnxt_re_hwrm_cos2bw_qcfg()
2927 cfg->queue_id = resp.queue_id0; in bnxt_re_hwrm_cos2bw_qcfg()
2931 return rc; in bnxt_re_hwrm_cos2bw_qcfg()
2937 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_hwrm_cos2bw_cfg()
2943 int rc; in bnxt_re_hwrm_cos2bw_cfg() local
2947 HWRM_QUEUE_COS2BW_CFG, -1, target_id); in bnxt_re_hwrm_cos2bw_cfg()
2948 req.port_id = (target_id == 0xFFFF) ? en_dev->pf_port_id : 1; in bnxt_re_hwrm_cos2bw_cfg()
2960 data = (char *)&req.unused_0 + indx * (sizeof(*cfg) - 4); in bnxt_re_hwrm_cos2bw_cfg()
2961 memcpy(data, &cfg[indx].queue_id, sizeof(*cfg) - 4); in bnxt_re_hwrm_cos2bw_cfg()
2971 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_hwrm_cos2bw_cfg()
2972 return rc; in bnxt_re_hwrm_cos2bw_cfg()
2981 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_host_pf_id_query()
2983 int rc; in bnxt_re_host_pf_id_query() local
2988 HWRM_FUNC_HOST_PF_IDS_QUERY, -1, -1); in bnxt_re_host_pf_id_query()
2990 switch (fn_info->host) { in bnxt_re_host_pf_id_query()
2996 req.host = fn_info->host; in bnxt_re_host_pf_id_query()
3003 req.filter = fn_info->filter; in bnxt_re_host_pf_id_query()
3009 rc = en_dev->en_ops->bnxt_send_fw_msg(en_dev, BNXT_ROCE_ULP, &fw_msg); in bnxt_re_host_pf_id_query()
3015 return rc; in bnxt_re_host_pf_id_query()
3024 res = &rdev->qplib_res; in bnxt_re_put_stats_ctx()
3025 hctx = res->hctx; in bnxt_re_put_stats_ctx()
3027 if (test_and_clear_bit(BNXT_RE_FLAG_STATS_CTX_ALLOC, &rdev->flags)) { in bnxt_re_put_stats_ctx()
3028 bnxt_re_net_stats_ctx_free(rdev, hctx->stats.fw_id, tid); in bnxt_re_put_stats_ctx()
3029 bnxt_qplib_free_stat_mem(res, &hctx->stats); in bnxt_re_put_stats_ctx()
3035 test_and_clear_bit(BNXT_RE_FLAG_STATS_CTX2_ALLOC, &rdev->flags); in bnxt_re_put_stats2_ctx()
3043 int rc; in bnxt_re_get_stats_ctx() local
3045 res = &rdev->qplib_res; in bnxt_re_get_stats_ctx()
3046 hctx = res->hctx; in bnxt_re_get_stats_ctx()
3048 rc = bnxt_qplib_alloc_stat_mem(res->pdev, rdev->chip_ctx, &hctx->stats); in bnxt_re_get_stats_ctx()
3049 if (rc) in bnxt_re_get_stats_ctx()
3050 return -ENOMEM; in bnxt_re_get_stats_ctx()
3051 rc = bnxt_re_net_stats_ctx_alloc(rdev, tid); in bnxt_re_get_stats_ctx()
3052 if (rc) in bnxt_re_get_stats_ctx()
3054 set_bit(BNXT_RE_FLAG_STATS_CTX_ALLOC, &rdev->flags); in bnxt_re_get_stats_ctx()
3059 bnxt_qplib_free_stat_mem(res, &hctx->stats); in bnxt_re_get_stats_ctx()
3061 return rc; in bnxt_re_get_stats_ctx()
3066 int rc; in bnxt_re_update_dev_attr() local
3068 rc = bnxt_qplib_get_dev_attr(&rdev->rcfw); in bnxt_re_update_dev_attr()
3069 if (rc) in bnxt_re_update_dev_attr()
3070 return rc; in bnxt_re_update_dev_attr()
3072 return -EINVAL; in bnxt_re_update_dev_attr()
3078 bnxt_qplib_clear_tbls(&rdev->qplib_res); in bnxt_re_free_tbls()
3079 bnxt_qplib_free_tbls(&rdev->qplib_res); in bnxt_re_free_tbls()
3084 struct bnxt_qplib_chip_ctx *chip_ctx = rdev->chip_ctx; in bnxt_re_alloc_init_tbls()
3086 int rc; in bnxt_re_alloc_init_tbls() local
3093 if (_is_chip_p7(chip_ctx) && chip_ctx->modes.db_push) in bnxt_re_alloc_init_tbls()
3094 pppp_factor = rdev->en_dev->port_count; in bnxt_re_alloc_init_tbls()
3095 rc = bnxt_qplib_alloc_tbls(&rdev->qplib_res, pppp_factor); in bnxt_re_alloc_init_tbls()
3096 if (rc) in bnxt_re_alloc_init_tbls()
3097 return rc; in bnxt_re_alloc_init_tbls()
3098 bnxt_qplib_init_tbls(&rdev->qplib_res); in bnxt_re_alloc_init_tbls()
3099 set_bit(BNXT_RE_FLAG_TBLS_ALLOCINIT, &rdev->flags); in bnxt_re_alloc_init_tbls()
3109 if (!rdev->nqr.max_init) in bnxt_re_clean_nqs()
3112 for (i = (rdev->nqr.max_init - 1) ; i >= 0; i--) { in bnxt_re_clean_nqs()
3113 nq = &rdev->nqr.nq[i]; in bnxt_re_clean_nqs()
3115 bnxt_re_net_ring_free(rdev, nq->ring_id); in bnxt_re_clean_nqs()
3118 rdev->nqr.max_init = 0; in bnxt_re_clean_nqs()
3125 int rc, i; in bnxt_re_setup_nqs() local
3130 mutex_init(&rdev->nqr.load_lock); in bnxt_re_setup_nqs()
3136 for (i = 0; i < rdev->nqr.num_msix - 1; i++) { in bnxt_re_setup_nqs()
3137 nq = &rdev->nqr.nq[i]; in bnxt_re_setup_nqs()
3138 vec = rdev->nqr.msix_entries[i + 1].vector; in bnxt_re_setup_nqs()
3139 offt = rdev->nqr.msix_entries[i + 1].db_offset; in bnxt_re_setup_nqs()
3140 nq->hwq.max_elements = depth; in bnxt_re_setup_nqs()
3141 rc = bnxt_qplib_alloc_nq_mem(&rdev->qplib_res, nq); in bnxt_re_setup_nqs()
3142 if (rc) { in bnxt_re_setup_nqs()
3144 "Failed to get mem for NQ %d, rc = 0x%x", in bnxt_re_setup_nqs()
3145 i, rc); in bnxt_re_setup_nqs()
3149 rattr.dma_arr = nq->hwq.pbl[PBL_LVL_0].pg_map_arr; in bnxt_re_setup_nqs()
3150 rattr.pages = nq->hwq.pbl[rdev->nqr.nq[i].hwq.level].pg_count; in bnxt_re_setup_nqs()
3153 rattr.depth = nq->hwq.max_elements - 1; in bnxt_re_setup_nqs()
3154 rattr.lrid = rdev->nqr.msix_entries[i + 1].ring_idx; in bnxt_re_setup_nqs()
3157 if (!i && bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) in bnxt_re_setup_nqs()
3162 rc = bnxt_re_net_ring_alloc(rdev, &rattr, &nq->ring_id); in bnxt_re_setup_nqs()
3163 if (rc) { in bnxt_re_setup_nqs()
3164 nq->ring_id = 0xffff; /* Invalid ring-id */ in bnxt_re_setup_nqs()
3166 "Failed to get fw id for NQ %d, rc = 0x%x", in bnxt_re_setup_nqs()
3167 i, rc); in bnxt_re_setup_nqs()
3171 rc = bnxt_qplib_enable_nq(nq, i, vec, offt, in bnxt_re_setup_nqs()
3174 if (rc) { in bnxt_re_setup_nqs()
3176 "Failed to enable NQ %d, rc = 0x%x", i, rc); in bnxt_re_setup_nqs()
3181 rdev->nqr.max_init = i; in bnxt_re_setup_nqs()
3185 bnxt_re_net_ring_free(rdev, nq->ring_id); in bnxt_re_setup_nqs()
3189 rdev->nqr.max_init = i; in bnxt_re_setup_nqs()
3190 return rc; in bnxt_re_setup_nqs()
3198 device_remove_file(&rdev->ibdev.dev, bnxt_re_attributes[i]); in bnxt_re_sysfs_destroy_file()
3203 int i, j, rc = 0; in bnxt_re_sysfs_create_file() local
3206 rc = device_create_file(&rdev->ibdev.dev, in bnxt_re_sysfs_create_file()
3208 if (rc) { in bnxt_re_sysfs_create_file()
3210 "Failed to create IB sysfs with rc = 0x%x", rc); in bnxt_re_sysfs_create_file()
3213 device_remove_file(&rdev->ibdev.dev, in bnxt_re_sysfs_create_file()
3215 clear_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags); in bnxt_re_sysfs_create_file()
3216 ib_unregister_device(&rdev->ibdev); in bnxt_re_sysfs_create_file()
3228 int rc; in bnxt_re_worker() local
3231 if (!rdev->is_virtfn && !rdev->worker_30s--) in bnxt_re_worker()
3232 rdev->worker_30s = 30; in bnxt_re_worker()
3242 if (!rdev->stats.stats_query_sec) in bnxt_re_worker()
3245 if (test_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS, &rdev->flags) && in bnxt_re_worker()
3246 (rdev->is_virtfn || in bnxt_re_worker()
3247 !_is_ext_stats_supported(rdev->dev_attr->dev_cap_flags))) { in bnxt_re_worker()
3248 if (!(rdev->stats.stats_query_counter++ % in bnxt_re_worker()
3249 rdev->stats.stats_query_sec)) { in bnxt_re_worker()
3250 rc = bnxt_re_get_qos_stats(rdev); in bnxt_re_worker()
3251 if (rc && rc != -ENOMEM) in bnxt_re_worker()
3253 &rdev->flags); in bnxt_re_worker()
3258 schedule_delayed_work(&rdev->worker, msecs_to_jiffies(1000)); in bnxt_re_worker()
3263 if (!(rdev->dbr_drop_recov || rdev->dbr_pacing)) in bnxt_re_alloc_dbr_sw_stats_mem()
3266 rdev->dbr_sw_stats = kzalloc(sizeof(*rdev->dbr_sw_stats), GFP_KERNEL); in bnxt_re_alloc_dbr_sw_stats_mem()
3267 if (!rdev->dbr_sw_stats) in bnxt_re_alloc_dbr_sw_stats_mem()
3268 return -ENOMEM; in bnxt_re_alloc_dbr_sw_stats_mem()
3275 kfree(rdev->dbr_sw_stats); in bnxt_re_free_dbr_sw_stats_mem()
3276 rdev->dbr_sw_stats = NULL; in bnxt_re_free_dbr_sw_stats_mem()
3281 rdev->dbr_drop_recov_wq = in bnxt_re_initialize_dbr_drop_recov()
3283 if (!rdev->dbr_drop_recov_wq) { in bnxt_re_initialize_dbr_drop_recov()
3285 return -EINVAL; in bnxt_re_initialize_dbr_drop_recov()
3287 rdev->dbr_drop_recov = true; in bnxt_re_initialize_dbr_drop_recov()
3290 rdev->user_dbr_drop_recov = true; in bnxt_re_initialize_dbr_drop_recov()
3292 rdev->user_dbr_drop_recov_timeout = BNXT_RE_DBR_RECOV_USERLAND_TIMEOUT; in bnxt_re_initialize_dbr_drop_recov()
3298 if (rdev->dbr_drop_recov_wq) { in bnxt_re_deinitialize_dbr_drop_recov()
3299 flush_workqueue(rdev->dbr_drop_recov_wq); in bnxt_re_deinitialize_dbr_drop_recov()
3300 destroy_workqueue(rdev->dbr_drop_recov_wq); in bnxt_re_deinitialize_dbr_drop_recov()
3301 rdev->dbr_drop_recov_wq = NULL; in bnxt_re_deinitialize_dbr_drop_recov()
3303 rdev->dbr_drop_recov = false; in bnxt_re_deinitialize_dbr_drop_recov()
3308 int rc; in bnxt_re_initialize_dbr_pacing() local
3311 rdev->dbr_page = (void *)__get_free_page(GFP_KERNEL); in bnxt_re_initialize_dbr_pacing()
3312 if (!rdev->dbr_page) { in bnxt_re_initialize_dbr_pacing()
3314 return -ENOMEM; in bnxt_re_initialize_dbr_pacing()
3316 memset((u8 *)rdev->dbr_page, 0, PAGE_SIZE); in bnxt_re_initialize_dbr_pacing()
3317 rdev->qplib_res.pacing_data = (struct bnxt_qplib_db_pacing_data *)rdev->dbr_page; in bnxt_re_initialize_dbr_pacing()
3318 rc = bnxt_re_hwrm_dbr_pacing_qcfg(rdev); in bnxt_re_initialize_dbr_pacing()
3319 if (rc) { in bnxt_re_initialize_dbr_pacing()
3321 "Failed to query dbr pacing config %d\n", rc); in bnxt_re_initialize_dbr_pacing()
3325 rdev->dbq_wq = create_singlethread_workqueue("bnxt_re_dbq"); in bnxt_re_initialize_dbr_pacing()
3326 if (!rdev->dbq_wq) { in bnxt_re_initialize_dbr_pacing()
3328 rc = -ENOMEM; in bnxt_re_initialize_dbr_pacing()
3332 writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4, 0, in bnxt_re_initialize_dbr_pacing()
3333 rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_BASE_MASK); in bnxt_re_initialize_dbr_pacing()
3334 rdev->dbr_db_fifo_reg_off = in bnxt_re_initialize_dbr_pacing()
3335 (rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_OFFSET_MASK) + in bnxt_re_initialize_dbr_pacing()
3337 rdev->qplib_res.pacing_data->grc_reg_offset = rdev->dbr_db_fifo_reg_off; in bnxt_re_initialize_dbr_pacing()
3339 rdev->dbr_bar_addr = in bnxt_re_initialize_dbr_pacing()
3340 pci_resource_start(rdev->qplib_res.pdev, 0) + in bnxt_re_initialize_dbr_pacing()
3341 rdev->dbr_db_fifo_reg_off; in bnxt_re_initialize_dbr_pacing()
3344 rdev->dbq_watermark = BNXT_RE_PACING_DBQ_THRESHOLD; in bnxt_re_initialize_dbr_pacing()
3345 rdev->pacing_en_int_th = BNXT_RE_PACING_EN_INT_THRESHOLD; in bnxt_re_initialize_dbr_pacing()
3346 rdev->pacing_algo_th = BNXT_RE_PACING_ALGO_THRESHOLD; in bnxt_re_initialize_dbr_pacing()
3347 rdev->dbq_pacing_time = BNXT_RE_DBR_INT_TIME; in bnxt_re_initialize_dbr_pacing()
3348 rdev->dbr_def_do_pacing = BNXT_RE_DBR_DO_PACING_NO_CONGESTION; in bnxt_re_initialize_dbr_pacing()
3349 rdev->do_pacing_save = rdev->dbr_def_do_pacing; in bnxt_re_initialize_dbr_pacing()
3355 free_page((u64)rdev->dbr_page); in bnxt_re_initialize_dbr_pacing()
3356 rdev->dbr_page = NULL; in bnxt_re_initialize_dbr_pacing()
3357 return rc; in bnxt_re_initialize_dbr_pacing()
3362 if (rdev->dbq_wq) in bnxt_re_deinitialize_dbr_pacing()
3363 flush_workqueue(rdev->dbq_wq); in bnxt_re_deinitialize_dbr_pacing()
3365 cancel_work_sync(&rdev->dbq_fifo_check_work); in bnxt_re_deinitialize_dbr_pacing()
3366 cancel_delayed_work_sync(&rdev->dbq_pacing_work); in bnxt_re_deinitialize_dbr_pacing()
3368 if (rdev->dbq_wq) { in bnxt_re_deinitialize_dbr_pacing()
3369 destroy_workqueue(rdev->dbq_wq); in bnxt_re_deinitialize_dbr_pacing()
3370 rdev->dbq_wq = NULL; in bnxt_re_deinitialize_dbr_pacing()
3373 if (rdev->dbr_page) in bnxt_re_deinitialize_dbr_pacing()
3374 free_page((u64)rdev->dbr_page); in bnxt_re_deinitialize_dbr_pacing()
3375 rdev->dbr_page = NULL; in bnxt_re_deinitialize_dbr_pacing()
3376 rdev->dbr_pacing = false; in bnxt_re_deinitialize_dbr_pacing()
3387 nq = &rdev->nqr.nq[0]; in bnxt_re_enable_dbr_pacing()
3388 rdev->dbq_nq_id = nq->ring_id; in bnxt_re_enable_dbr_pacing()
3390 if (!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx) && in bnxt_re_enable_dbr_pacing()
3391 bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) { in bnxt_re_enable_dbr_pacing()
3395 return -EIO; in bnxt_re_enable_dbr_pacing()
3398 writel_fbsd(rdev->en_dev->softc, BNXT_GRCPF_REG_WINDOW_BASE_OUT + 28 , 0, in bnxt_re_enable_dbr_pacing()
3399 rdev->chip_ctx->dbr_aeq_arm_reg & BNXT_GRC_BASE_MASK); in bnxt_re_enable_dbr_pacing()
3400 rdev->dbr_aeq_arm_reg_off = in bnxt_re_enable_dbr_pacing()
3401 (rdev->chip_ctx->dbr_aeq_arm_reg & in bnxt_re_enable_dbr_pacing()
3403 writel_fbsd(rdev->en_dev->softc, rdev->dbr_aeq_arm_reg_off , 0, 1); in bnxt_re_enable_dbr_pacing()
3416 int rc = 0; in bnxt_re_disable_dbr_pacing() local
3418 if (!bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx) && in bnxt_re_disable_dbr_pacing()
3419 bnxt_qplib_dbr_pacing_is_primary_pf(rdev->chip_ctx)) in bnxt_re_disable_dbr_pacing()
3420 rc = bnxt_re_hwrm_dbr_pacing_cfg(rdev, false); in bnxt_re_disable_dbr_pacing()
3422 return rc; in bnxt_re_disable_dbr_pacing()
3427 if (test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) { in bnxt_re_ib_uninit()
3430 ib_unregister_device(&rdev->ibdev); in bnxt_re_ib_uninit()
3431 clear_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags); in bnxt_re_ib_uninit()
3439 int rc, wait_count = BNXT_RE_RES_FREE_WAIT_COUNT; in bnxt_re_dev_uninit() local
3445 &rdev->flags)) { in bnxt_re_dev_uninit()
3448 list_del_rcu(&rdev->list); in bnxt_re_dev_uninit()
3458 if (bnxt_qplib_dbr_pacing_en(rdev->chip_ctx)) in bnxt_re_dev_uninit()
3461 if (test_and_clear_bit(BNXT_RE_FLAG_WORKER_REG, &rdev->flags)) { in bnxt_re_dev_uninit()
3462 cancel_delayed_work_sync(&rdev->worker); in bnxt_re_dev_uninit()
3466 while (atomic_read(&rdev->stats.rsors.cq_count) && --wait_count) in bnxt_re_dev_uninit()
3470 "CQ resources not freed by stack, count = 0x%x", in bnxt_re_dev_uninit()
3471 atomic_read(&rdev->stats.rsors.cq_count)); in bnxt_re_dev_uninit()
3473 kdpi = &rdev->dpi_privileged; in bnxt_re_dev_uninit()
3474 if (kdpi->umdbr) { /* kernel DPI was allocated with success */ in bnxt_re_dev_uninit()
3475 (void)bnxt_qplib_dealloc_dpi(&rdev->qplib_res, kdpi); in bnxt_re_dev_uninit()
3487 if (test_and_clear_bit(BNXT_RE_FLAG_SETUP_NQ, &rdev->flags)) in bnxt_re_dev_uninit()
3491 if (test_and_clear_bit(BNXT_RE_FLAG_TBLS_ALLOCINIT, &rdev->flags)) in bnxt_re_dev_uninit()
3493 if (test_and_clear_bit(BNXT_RE_FLAG_RCFW_CHANNEL_INIT, &rdev->flags)) { in bnxt_re_dev_uninit()
3494 rc = bnxt_qplib_deinit_rcfw(&rdev->rcfw); in bnxt_re_dev_uninit()
3495 if (rc) in bnxt_re_dev_uninit()
3497 "Failed to deinitialize fw, rc = 0x%x", rc); in bnxt_re_dev_uninit()
3502 if (test_and_clear_bit(BNXT_RE_FLAG_ALLOC_CTX, &rdev->flags)) in bnxt_re_dev_uninit()
3503 bnxt_qplib_free_hwctx(&rdev->qplib_res); in bnxt_re_dev_uninit()
3506 if (test_and_clear_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags)) in bnxt_re_dev_uninit()
3507 bnxt_qplib_disable_rcfw_channel(&rdev->rcfw); in bnxt_re_dev_uninit()
3509 if (rdev->dbr_pacing) in bnxt_re_dev_uninit()
3514 if (test_and_clear_bit(BNXT_RE_FLAG_NET_RING_ALLOC, &rdev->flags)) in bnxt_re_dev_uninit()
3515 bnxt_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id); in bnxt_re_dev_uninit()
3517 if (test_and_clear_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags)) in bnxt_re_dev_uninit()
3518 bnxt_qplib_free_rcfw_channel(&rdev->qplib_res); in bnxt_re_dev_uninit()
3520 if (test_and_clear_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags)) in bnxt_re_dev_uninit()
3528 &rdev->flags)) in bnxt_re_dev_uninit()
3538 int rc = 0; in bnxt_re_dev_init() local
3542 rc = bnxt_re_register_netdev(rdev); in bnxt_re_dev_init()
3543 if (rc) in bnxt_re_dev_init()
3544 return -EINVAL; in bnxt_re_dev_init()
3546 set_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags); in bnxt_re_dev_init()
3548 rc = bnxt_re_setup_chip_ctx(rdev, wqe_mode); in bnxt_re_dev_init()
3549 if (rc) { in bnxt_re_dev_init()
3550 dev_err(rdev_to_dev(rdev), "Failed to get chip context rc 0x%x", rc); in bnxt_re_dev_init()
3552 clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags); in bnxt_re_dev_init()
3553 rc = -EINVAL; in bnxt_re_dev_init()
3554 return rc; in bnxt_re_dev_init()
3561 rc = bnxt_re_request_msix(rdev); in bnxt_re_dev_init()
3562 if (rc) { in bnxt_re_dev_init()
3564 "Requesting MSI-X vectors failed with rc = 0x%x", rc); in bnxt_re_dev_init()
3565 rc = -EINVAL; in bnxt_re_dev_init()
3568 set_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags); in bnxt_re_dev_init()
3572 rc = bnxt_qplib_alloc_rcfw_channel(&rdev->qplib_res); in bnxt_re_dev_init()
3573 if (rc) { in bnxt_re_dev_init()
3575 "Failed to alloc mem for rcfw, rc = %#x\n", rc); in bnxt_re_dev_init()
3578 set_bit(BNXT_RE_FLAG_ALLOC_RCFW, &rdev->flags); in bnxt_re_dev_init()
3580 creq = &rdev->rcfw.creq; in bnxt_re_dev_init()
3581 rattr.dma_arr = creq->hwq.pbl[PBL_LVL_0].pg_map_arr; in bnxt_re_dev_init()
3582 rattr.pages = creq->hwq.pbl[creq->hwq.level].pg_count; in bnxt_re_dev_init()
3585 rattr.depth = BNXT_QPLIB_CREQE_MAX_CNT - 1; in bnxt_re_dev_init()
3586 rattr.lrid = rdev->nqr.msix_entries[BNXT_RE_AEQ_IDX].ring_idx; in bnxt_re_dev_init()
3587 rc = bnxt_re_net_ring_alloc(rdev, &rattr, &creq->ring_id); in bnxt_re_dev_init()
3588 if (rc) { in bnxt_re_dev_init()
3589 creq->ring_id = 0xffff; in bnxt_re_dev_init()
3591 "Failed to allocate CREQ fw id with rc = 0x%x", rc); in bnxt_re_dev_init()
3595 if (!rdev->chip_ctx) in bnxt_re_dev_init()
3598 if (rdev->chip_ctx->modes.dbr_pacing_v0 || in bnxt_re_dev_init()
3599 bnxt_qplib_dbr_pacing_en(rdev->chip_ctx) || in bnxt_re_dev_init()
3600 bnxt_qplib_dbr_pacing_ext_en(rdev->chip_ctx)) { in bnxt_re_dev_init()
3601 rc = bnxt_re_initialize_dbr_pacing(rdev); in bnxt_re_dev_init()
3602 if (!rc) in bnxt_re_dev_init()
3603 rdev->dbr_pacing = true; in bnxt_re_dev_init()
3605 rdev->dbr_pacing = false; in bnxt_re_dev_init()
3607 __func__, rc); in bnxt_re_dev_init()
3610 vec = rdev->nqr.msix_entries[BNXT_RE_AEQ_IDX].vector; in bnxt_re_dev_init()
3611 offset = rdev->nqr.msix_entries[BNXT_RE_AEQ_IDX].db_offset; in bnxt_re_dev_init()
3612 rc = bnxt_qplib_enable_rcfw_channel(&rdev->rcfw, vec, offset, in bnxt_re_dev_init()
3614 if (rc) { in bnxt_re_dev_init()
3616 "Failed to enable RCFW channel with rc = 0x%x", rc); in bnxt_re_dev_init()
3619 set_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags); in bnxt_re_dev_init()
3621 rc = bnxt_re_update_dev_attr(rdev); in bnxt_re_dev_init()
3622 if (rc) in bnxt_re_dev_init()
3625 if (!rdev->is_virtfn && !_is_chip_gen_p5_p7(rdev->chip_ctx)) { in bnxt_re_dev_init()
3626 rc = bnxt_qplib_alloc_hwctx(&rdev->qplib_res); in bnxt_re_dev_init()
3627 if (rc) { in bnxt_re_dev_init()
3629 "Failed to alloc hw contexts, rc = 0x%x", rc); in bnxt_re_dev_init()
3632 set_bit(BNXT_RE_FLAG_ALLOC_CTX, &rdev->flags); in bnxt_re_dev_init()
3635 rc = bnxt_re_get_stats_ctx(rdev); in bnxt_re_dev_init()
3636 if (rc) in bnxt_re_dev_init()
3639 rc = bnxt_qplib_init_rcfw(&rdev->rcfw, rdev->is_virtfn); in bnxt_re_dev_init()
3640 if (rc) { in bnxt_re_dev_init()
3642 "Failed to initialize fw with rc = 0x%x", rc); in bnxt_re_dev_init()
3645 set_bit(BNXT_RE_FLAG_RCFW_CHANNEL_INIT, &rdev->flags); in bnxt_re_dev_init()
3648 rc = bnxt_re_update_dev_attr(rdev); in bnxt_re_dev_init()
3649 if (rc) in bnxt_re_dev_init()
3651 rc = bnxt_re_alloc_init_tbls(rdev); in bnxt_re_dev_init()
3652 if (rc) { in bnxt_re_dev_init()
3653 dev_err(rdev_to_dev(rdev), "tbls alloc-init failed rc = %#x", in bnxt_re_dev_init()
3654 rc); in bnxt_re_dev_init()
3657 rc = bnxt_re_setup_nqs(rdev); in bnxt_re_dev_init()
3658 if (rc) { in bnxt_re_dev_init()
3659 dev_err(rdev_to_dev(rdev), "NQs alloc-init failed rc = %#x\n", in bnxt_re_dev_init()
3660 rc); in bnxt_re_dev_init()
3661 if (rdev->nqr.max_init == 0) in bnxt_re_dev_init()
3666 rdev->nqr.num_msix, rdev->nqr.max_init); in bnxt_re_dev_init()
3668 set_bit(BNXT_RE_FLAG_SETUP_NQ, &rdev->flags); in bnxt_re_dev_init()
3671 rc = bnxt_qplib_alloc_dpi(&rdev->qplib_res, &rdev->dpi_privileged, in bnxt_re_dev_init()
3673 if (rc) in bnxt_re_dev_init()
3676 if (rdev->dbr_pacing) in bnxt_re_dev_init()
3679 if (rdev->chip_ctx->modes.dbr_drop_recov) in bnxt_re_dev_init()
3682 rc = bnxt_re_alloc_dbr_sw_stats_mem(rdev); in bnxt_re_dev_init()
3683 if (rc) in bnxt_re_dev_init()
3687 if (!rdev->is_virtfn) { in bnxt_re_dev_init()
3690 tc_rec = &rdev->tc_rec[0]; in bnxt_re_dev_init()
3691 rc = bnxt_re_query_hwrm_qportcfg(rdev, tc_rec, 0xFFFF); in bnxt_re_dev_init()
3692 if (rc) { in bnxt_re_dev_init()
3694 "Failed to query port config rc:%d", rc); in bnxt_re_dev_init()
3695 return rc; in bnxt_re_dev_init()
3699 rc = bnxt_qplib_query_cc_param(&rdev->qplib_res, &rdev->cc_param); in bnxt_re_dev_init()
3700 if (rc) in bnxt_re_dev_init()
3704 rdev->num_vfs = pci_num_vf(rdev->en_dev->pdev); in bnxt_re_dev_init()
3705 if (rdev->num_vfs) { in bnxt_re_dev_init()
3707 bnxt_qplib_set_func_resources(&rdev->qplib_res); in bnxt_re_dev_init()
3711 INIT_DELAYED_WORK(&rdev->worker, bnxt_re_worker); in bnxt_re_dev_init()
3712 set_bit(BNXT_RE_FLAG_WORKER_REG, &rdev->flags); in bnxt_re_dev_init()
3713 schedule_delayed_work(&rdev->worker, msecs_to_jiffies(1000)); in bnxt_re_dev_init()
3719 list_add_tail_rcu(&rdev->list, &bnxt_re_dev_list); in bnxt_re_dev_init()
3721 gadd_dev_inprogress--; in bnxt_re_dev_init()
3722 set_bit(BNXT_RE_FLAG_DEV_LIST_INITIALIZED, &rdev->flags); in bnxt_re_dev_init()
3726 return rc; in bnxt_re_dev_init()
3732 return rc; in bnxt_re_dev_init()
3737 int rc = 0; in bnxt_re_ib_init() local
3739 rc = bnxt_re_register_ib(rdev); in bnxt_re_ib_init()
3740 if (rc) { in bnxt_re_ib_init()
3742 "Register IB failed with rc = 0x%x", rc); in bnxt_re_ib_init()
3750 set_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags); in bnxt_re_ib_init()
3751 set_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags); in bnxt_re_ib_init()
3752 set_bit(BNXT_RE_FLAG_ISSUE_CFA_FLOW_STATS, &rdev->flags); in bnxt_re_ib_init()
3753 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_PORT_ACTIVE); in bnxt_re_ib_init()
3754 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_GID_CHANGE); in bnxt_re_ib_init()
3756 return rc; in bnxt_re_ib_init()
3759 return rc; in bnxt_re_ib_init()
3804 return -ENOMEM; in bnxt_re_dev_reg()
3813 rdev->espeed = rdev->en_dev->espeed; in bnxt_re_get_link_speed()
3832 rcfw = &rdev->rcfw; in bnxt_re_remove_device()
3833 cmdq = &rcfw->cmdq; in bnxt_re_remove_device()
3834 if (test_bit(FIRMWARE_STALL_DETECTED, &cmdq->flags)) in bnxt_re_remove_device()
3835 set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags); in bnxt_re_remove_device()
3842 en_info->rdev = NULL; in bnxt_re_remove_device()
3845 clear_bit(BNXT_RE_FLAG_EN_DEV_PRIMARY_DEV, &en_info->flags); in bnxt_re_remove_device()
3846 clear_bit(BNXT_RE_FLAG_EN_DEV_SECONDARY_DEV, &en_info->flags); in bnxt_re_remove_device()
3847 clear_bit(BNXT_RE_FLAG_EN_DEV_NETDEV_REG, &en_info->flags); in bnxt_re_remove_device()
3861 int rc = 0; in bnxt_re_add_device() local
3864 en_dev = en_info->en_dev; in bnxt_re_add_device()
3870 return -ENODEV; in bnxt_re_add_device()
3876 rc = bnxt_re_dev_reg(rdev, netdev, en_dev); in bnxt_re_add_device()
3877 if (rc) { in bnxt_re_add_device()
3890 gadd_dev_inprogress--; in bnxt_re_add_device()
3893 return rc; in bnxt_re_add_device()
3896 if (rc != 0) in bnxt_re_add_device()
3916 (*rdev)->num_msix_requested = num_msix_requested; in bnxt_re_add_device()
3917 (*rdev)->gsi_ctx.gsi_qp_mode = qp_mode; in bnxt_re_add_device()
3918 (*rdev)->adev = aux_dev; in bnxt_re_add_device()
3919 (*rdev)->dev_addr = en_dev->softc->func.mac_addr; in bnxt_re_add_device()
3926 en_info->rdev = *rdev; in bnxt_re_add_device()
3928 rc = bnxt_re_dev_init(*rdev, op_type, wqe_mode); in bnxt_re_add_device()
3929 if (rc) { in bnxt_re_add_device()
3943 gadd_dev_inprogress--; in bnxt_re_add_device()
3948 if (!rc) { in bnxt_re_add_device()
3949 set_bit(BNXT_RE_FLAG_EN_DEV_NETDEV_REG, &en_info->flags); in bnxt_re_add_device()
3951 return rc; in bnxt_re_add_device()
3956 struct pci_dev *pdev_in = rdev->en_dev->pdev; in bnxt_re_get_peer_pf()
3957 int tmp_bus_num, bus_num = pdev_in->bus->number; in bnxt_re_get_peer_pf()
3958 int tmp_dev_num, dev_num = PCI_SLOT(pdev_in->devfn); in bnxt_re_get_peer_pf()
3959 int tmp_func_num, func_num = PCI_FUNC(pdev_in->devfn); in bnxt_re_get_peer_pf()
3964 tmp_bus_num = tmp_rdev->en_dev->pdev->bus->number; in bnxt_re_get_peer_pf()
3965 tmp_dev_num = PCI_SLOT(tmp_rdev->en_dev->pdev->devfn); in bnxt_re_get_peer_pf()
3966 tmp_func_num = PCI_FUNC(tmp_rdev->en_dev->pdev->devfn); in bnxt_re_get_peer_pf()
3989 return -ENOMEM; in bnxt_re_schedule_work()
3991 re_work->rdev = rdev; in bnxt_re_schedule_work()
3992 re_work->event = event; in bnxt_re_schedule_work()
3993 re_work->vlan_dev = vlan_dev; in bnxt_re_schedule_work()
3994 re_work->adev = adev; in bnxt_re_schedule_work()
3995 INIT_WORK(&re_work->work, bnxt_re_task); in bnxt_re_schedule_work()
3997 atomic_inc(&rdev->sched_count); in bnxt_re_schedule_work()
3998 re_work->netdev = netdev; in bnxt_re_schedule_work()
3999 queue_work(bnxt_re_wq, &re_work->work); in bnxt_re_schedule_work()
4007 struct pci_dev *pdev_in = rdev->en_dev->pdev; in bnxt_re_get_slot_pf_count()
4008 int tmp_bus_num, bus_num = pdev_in->bus->number; in bnxt_re_get_slot_pf_count()
4009 int tmp_dev_num, dev_num = PCI_SLOT(pdev_in->devfn); in bnxt_re_get_slot_pf_count()
4015 tmp_bus_num = tmp_rdev->en_dev->pdev->bus->number; in bnxt_re_get_slot_pf_count()
4016 tmp_dev_num = PCI_SLOT(tmp_rdev->en_dev->pdev->devfn); in bnxt_re_get_slot_pf_count()
4036 rdev = re_work->rdev; in bnxt_re_task()
4048 if (rdev && !test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) { in bnxt_re_task()
4049 dev_dbg(rdev_to_dev(rdev), "%s: Ignoring netdev event 0x%lx", in bnxt_re_task()
4050 __func__, re_work->event); in bnxt_re_task()
4060 dev_dbg(rdev_to_dev(rdev), "Scheduled work for event 0x%lx", in bnxt_re_task()
4061 re_work->event); in bnxt_re_task()
4063 switch (re_work->event) { in bnxt_re_task()
4065 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, in bnxt_re_task()
4071 bnxt_qplib_dbr_pacing_set_primary_pf(rdev->chip_ctx, 0); in bnxt_re_task()
4073 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, in bnxt_re_task()
4080 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, in bnxt_re_task()
4084 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, in bnxt_re_task()
4089 if (!bnxt_qplib_query_cc_param(&rdev->qplib_res, in bnxt_re_task()
4090 &rdev->cc_param) && in bnxt_re_task()
4091 !_is_chip_p7(rdev->chip_ctx)) { in bnxt_re_task()
4096 if (rdev->sl_espeed == SPEED_10000 && in bnxt_re_task()
4097 !_is_chip_gen_p5_p7(rdev->chip_ctx)) { in bnxt_re_task()
4098 if (rdev->cc_param.enable) in bnxt_re_task()
4101 if (!rdev->cc_param.enable && in bnxt_re_task()
4102 rdev->cc_param.admin_enable) in bnxt_re_task()
4110 aux_dev = rdev->adev; in bnxt_re_task()
4111 if (re_work->adev) in bnxt_re_task()
4127 atomic_dec(&rdev->sched_count); in bnxt_re_task()
4130 if (re_work->adev && re_work->event == NETDEV_UNREGISTER) { in bnxt_re_task()
4131 en_info = auxiliary_get_drvdata(re_work->adev); in bnxt_re_task()
4132 en_info->ib_uninit_done = true; in bnxt_re_task()
4133 wake_up(&en_info->waitq); in bnxt_re_task()
4169 dev_info(rdev_to_dev(rdev), "%s: Event = %s (0x%lx), rdev %s (real_dev %s)\n", in bnxt_re_netdev_event()
4171 rdev ? rdev->netdev ? if_getdname(rdev->netdev) : "->netdev = NULL" : "= NULL", in bnxt_re_netdev_event()
4174 if (!test_bit(BNXT_RE_FLAG_IBDEV_REGISTERED, &rdev->flags)) in bnxt_re_netdev_event()
4195 if (!_is_chip_gen_p5_p7(rdev->chip_ctx)) in bnxt_re_netdev_event()
4197 bnxt_qplib_get_guid(rdev->dev_addr, in bnxt_re_netdev_event()
4198 (u8 *)&rdev->ibdev.node_guid); in bnxt_re_netdev_event()
4228 if (atomic_read(&rdev->sched_count) > 0) in bnxt_re_netdev_event()
4230 if (!rdev->unreg_sched) { in bnxt_re_netdev_event()
4233 rdev->unreg_sched = true; in bnxt_re_netdev_event()
4261 * bnxt_re_remove - Removes the roce aux device
4262 * @adev - aux device pointer
4284 en_dev = en_info->en_dev; in bnxt_re_remove()
4286 rdev = en_info->rdev; in bnxt_re_remove()
4289 if (pci_channel_offline(rdev->rcfw.pdev)) in bnxt_re_remove()
4290 set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags); in bnxt_re_remove()
4292 if (test_bit(BNXT_RE_FLAG_EN_DEV_PRIMARY_DEV, &en_info->flags)) in bnxt_re_remove()
4294 if (test_bit(BNXT_RE_FLAG_EN_DEV_SECONDARY_DEV, &en_info->flags)) in bnxt_re_remove()
4308 * case bond device is already removed, so rdev->binfo in bnxt_re_remove()
4315 if (test_bit(BNXT_RE_FLAG_EN_DEV_NETDEV_REG, &en_info->flags)) { in bnxt_re_remove()
4317 en_dev->en_ops->bnxt_unregister_device(en_dev, in bnxt_re_remove()
4334 int rc; in bnxt_re_ib_init_2() local
4336 rc = bnxt_re_get_device_stats(rdev); in bnxt_re_ib_init_2()
4337 if (rc) in bnxt_re_ib_init_2()
4352 int rc = -ENODEV; in bnxt_re_probe() local
4355 en_dev = aux_dev->edev; in bnxt_re_probe()
4358 return rc; in bnxt_re_probe()
4360 if (en_dev->ulp_version != BNXT_ULP_VERSION) { in bnxt_re_probe()
4361 pr_err("%s: probe error: bnxt_en ulp version magic %x is not compatible!\n", in bnxt_re_probe()
4362 ROCE_DRV_MODULE_NAME, en_dev->ulp_version); in bnxt_re_probe()
4363 return -EINVAL; in bnxt_re_probe()
4368 return -ENOMEM; in bnxt_re_probe()
4370 en_info->en_dev = en_dev; in bnxt_re_probe()
4374 rc = bnxt_re_add_device(&rdev, en_dev->net, in bnxt_re_probe()
4379 if (rc) { in bnxt_re_probe()
4381 return rc; in bnxt_re_probe()
4384 rc = bnxt_re_ib_init(rdev); in bnxt_re_probe()
4385 if (rc) in bnxt_re_probe()
4391 rdev->adev = adev; in bnxt_re_probe()
4401 return rc; in bnxt_re_probe()
4420 int rc = 0; in bnxt_re_mod_init() local
4426 return -ENOMEM; in bnxt_re_mod_init()
4428 rc = bnxt_re_register_netdevice_notifier(&bnxt_re_netdev_notifier); in bnxt_re_mod_init()
4429 if (rc) { in bnxt_re_mod_init()
4437 rc = auxiliary_driver_register(&bnxt_re_driver); in bnxt_re_mod_init()
4438 if (rc) { in bnxt_re_mod_init()
4452 return rc; in bnxt_re_mod_init()