Lines Matching refs:rdev
81 static void bnxt_re_remove_device(struct bnxt_re_dev *rdev);
84 static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev);
86 static void bnxt_re_set_drv_mode(struct bnxt_re_dev *rdev, u8 mode) in bnxt_re_set_drv_mode() argument
90 cctx = rdev->chip_ctx; in bnxt_re_set_drv_mode()
91 cctx->modes.wqe_mode = bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) ? in bnxt_re_set_drv_mode()
95 static void bnxt_re_destroy_chip_ctx(struct bnxt_re_dev *rdev) in bnxt_re_destroy_chip_ctx() argument
99 if (!rdev->chip_ctx) in bnxt_re_destroy_chip_ctx()
101 chip_ctx = rdev->chip_ctx; in bnxt_re_destroy_chip_ctx()
102 rdev->chip_ctx = NULL; in bnxt_re_destroy_chip_ctx()
103 rdev->rcfw.res = NULL; in bnxt_re_destroy_chip_ctx()
104 rdev->qplib_res.cctx = NULL; in bnxt_re_destroy_chip_ctx()
105 rdev->qplib_res.pdev = NULL; in bnxt_re_destroy_chip_ctx()
106 rdev->qplib_res.netdev = NULL; in bnxt_re_destroy_chip_ctx()
110 static int bnxt_re_setup_chip_ctx(struct bnxt_re_dev *rdev, u8 wqe_mode) in bnxt_re_setup_chip_ctx() argument
116 en_dev = rdev->en_dev; in bnxt_re_setup_chip_ctx()
125 rdev->chip_ctx = chip_ctx; in bnxt_re_setup_chip_ctx()
128 rdev->qplib_res.cctx = rdev->chip_ctx; in bnxt_re_setup_chip_ctx()
129 rdev->rcfw.res = &rdev->qplib_res; in bnxt_re_setup_chip_ctx()
130 rdev->qplib_res.dattr = &rdev->dev_attr; in bnxt_re_setup_chip_ctx()
131 rdev->qplib_res.is_vf = BNXT_VF(bp); in bnxt_re_setup_chip_ctx()
133 bnxt_re_set_drv_mode(rdev, wqe_mode); in bnxt_re_setup_chip_ctx()
135 ibdev_info(&rdev->ibdev, in bnxt_re_setup_chip_ctx()
142 static void bnxt_re_get_sriov_func_type(struct bnxt_re_dev *rdev) in bnxt_re_get_sriov_func_type() argument
146 bp = netdev_priv(rdev->en_dev->net); in bnxt_re_get_sriov_func_type()
148 rdev->is_virtfn = 1; in bnxt_re_get_sriov_func_type()
156 static void bnxt_re_limit_pf_res(struct bnxt_re_dev *rdev) in bnxt_re_limit_pf_res() argument
162 attr = &rdev->dev_attr; in bnxt_re_limit_pf_res()
163 ctx = &rdev->qplib_ctx; in bnxt_re_limit_pf_res()
173 if (!bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) in bnxt_re_limit_pf_res()
175 rdev->qplib_ctx.tqm_ctx.qcount[i] = in bnxt_re_limit_pf_res()
176 rdev->dev_attr.tqm_alloc_reqs[i]; in bnxt_re_limit_pf_res()
215 static void bnxt_re_set_resource_limits(struct bnxt_re_dev *rdev) in bnxt_re_set_resource_limits() argument
219 memset(&rdev->qplib_ctx.vf_res, 0, sizeof(struct bnxt_qplib_vf_res)); in bnxt_re_set_resource_limits()
220 bnxt_re_limit_pf_res(rdev); in bnxt_re_set_resource_limits()
222 num_vfs = bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) ? in bnxt_re_set_resource_limits()
223 BNXT_RE_GEN_P5_MAX_VF : rdev->num_vfs; in bnxt_re_set_resource_limits()
225 bnxt_re_limit_vf_res(&rdev->qplib_ctx, num_vfs); in bnxt_re_set_resource_limits()
231 struct bnxt_re_dev *rdev = p; in bnxt_re_stop() local
234 if (!rdev) in bnxt_re_stop()
244 bp = netdev_priv(rdev->netdev); in bnxt_re_stop()
246 ibdev_info(&rdev->ibdev, "Handle device stop call from L2 driver"); in bnxt_re_stop()
253 set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags); in bnxt_re_stop()
255 bnxt_re_dev_stop(rdev); in bnxt_re_stop()
256 bnxt_re_stop_irq(rdev); in bnxt_re_stop()
260 set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags); in bnxt_re_stop()
261 set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags); in bnxt_re_stop()
270 struct bnxt_re_dev *rdev = p; in bnxt_re_sriov_config() local
272 if (!rdev) in bnxt_re_sriov_config()
275 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_sriov_config()
277 rdev->num_vfs = num_vfs; in bnxt_re_sriov_config()
278 if (!bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)) { in bnxt_re_sriov_config()
279 bnxt_re_set_resource_limits(rdev); in bnxt_re_sriov_config()
280 bnxt_qplib_set_func_resources(&rdev->qplib_res, &rdev->rcfw, in bnxt_re_sriov_config()
281 &rdev->qplib_ctx); in bnxt_re_sriov_config()
287 struct bnxt_re_dev *rdev = p; in bnxt_re_shutdown() local
289 if (!rdev) in bnxt_re_shutdown()
293 bnxt_re_stop_irq(rdev); in bnxt_re_shutdown()
294 ib_unregister_device_queued(&rdev->ibdev); in bnxt_re_shutdown()
299 struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle; in bnxt_re_stop_irq() local
300 struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw; in bnxt_re_stop_irq()
304 for (indx = BNXT_RE_NQ_IDX; indx < rdev->num_msix; indx++) { in bnxt_re_stop_irq()
305 nq = &rdev->nq[indx - 1]; in bnxt_re_stop_irq()
314 struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle; in bnxt_re_start_irq() local
315 struct bnxt_msix_entry *msix_ent = rdev->msix_entries; in bnxt_re_start_irq()
316 struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw; in bnxt_re_start_irq()
326 ibdev_err(&rdev->ibdev, "Failed to re-start IRQs\n"); in bnxt_re_start_irq()
333 for (indx = 0; indx < rdev->num_msix; indx++) in bnxt_re_start_irq()
334 rdev->msix_entries[indx].vector = ent[indx].vector; in bnxt_re_start_irq()
338 for (indx = BNXT_RE_NQ_IDX ; indx < rdev->num_msix; indx++) { in bnxt_re_start_irq()
339 nq = &rdev->nq[indx - 1]; in bnxt_re_start_irq()
343 ibdev_warn(&rdev->ibdev, "Failed to reinit NQ index %d\n", in bnxt_re_start_irq()
363 static int bnxt_re_unregister_netdev(struct bnxt_re_dev *rdev) in bnxt_re_unregister_netdev() argument
368 if (!rdev) in bnxt_re_unregister_netdev()
371 en_dev = rdev->en_dev; in bnxt_re_unregister_netdev()
373 rc = en_dev->en_ops->bnxt_unregister_device(rdev->en_dev, in bnxt_re_unregister_netdev()
378 static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev) in bnxt_re_register_netdev() argument
383 if (!rdev) in bnxt_re_register_netdev()
386 en_dev = rdev->en_dev; in bnxt_re_register_netdev()
389 &bnxt_re_ulp_ops, rdev); in bnxt_re_register_netdev()
390 rdev->qplib_res.pdev = rdev->en_dev->pdev; in bnxt_re_register_netdev()
394 static int bnxt_re_free_msix(struct bnxt_re_dev *rdev) in bnxt_re_free_msix() argument
399 if (!rdev) in bnxt_re_free_msix()
402 en_dev = rdev->en_dev; in bnxt_re_free_msix()
405 rc = en_dev->en_ops->bnxt_free_msix(rdev->en_dev, BNXT_ROCE_ULP); in bnxt_re_free_msix()
410 static int bnxt_re_request_msix(struct bnxt_re_dev *rdev) in bnxt_re_request_msix() argument
415 if (!rdev) in bnxt_re_request_msix()
418 en_dev = rdev->en_dev; in bnxt_re_request_msix()
423 rdev->msix_entries, in bnxt_re_request_msix()
430 ibdev_warn(&rdev->ibdev, in bnxt_re_request_msix()
434 rdev->num_msix = num_msix_got; in bnxt_re_request_msix()
439 static void bnxt_re_init_hwrm_hdr(struct bnxt_re_dev *rdev, struct input *hdr, in bnxt_re_init_hwrm_hdr() argument
458 static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev, in bnxt_re_net_ring_free() argument
461 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_ring_free()
470 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_net_ring_free()
475 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_FREE, -1, -1); in bnxt_re_net_ring_free()
482 ibdev_err(&rdev->ibdev, "Failed to free HW ring:%d :%#x", in bnxt_re_net_ring_free()
487 static int bnxt_re_net_ring_alloc(struct bnxt_re_dev *rdev, in bnxt_re_net_ring_alloc() argument
491 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_ring_alloc()
501 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_RING_ALLOC, -1, -1); in bnxt_re_net_ring_alloc()
524 static int bnxt_re_net_stats_ctx_free(struct bnxt_re_dev *rdev, in bnxt_re_net_stats_ctx_free() argument
527 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_stats_ctx_free()
536 if (test_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags)) in bnxt_re_net_stats_ctx_free()
541 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_STAT_CTX_FREE, -1, -1); in bnxt_re_net_stats_ctx_free()
547 ibdev_err(&rdev->ibdev, "Failed to free HW stats context %#x", in bnxt_re_net_stats_ctx_free()
553 static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev, in bnxt_re_net_stats_ctx_alloc() argument
557 struct bnxt_qplib_chip_ctx *chip_ctx = rdev->chip_ctx; in bnxt_re_net_stats_ctx_alloc()
560 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_net_stats_ctx_alloc()
571 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_STAT_CTX_ALLOC, -1, -1); in bnxt_re_net_stats_ctx_alloc()
640 struct bnxt_re_dev *rdev = in hw_rev_show() local
643 return sysfs_emit(buf, "0x%x\n", rdev->en_dev->pdev->vendor); in hw_rev_show()
650 struct bnxt_re_dev *rdev = in hca_type_show() local
653 return sysfs_emit(buf, "%s\n", rdev->ibdev.node_desc); in hca_type_show()
721 static int bnxt_re_register_ib(struct bnxt_re_dev *rdev) in bnxt_re_register_ib() argument
723 struct ib_device *ibdev = &rdev->ibdev; in bnxt_re_register_ib()
732 addrconf_addr_eui48((u8 *)&ibdev->node_guid, rdev->netdev->dev_addr); in bnxt_re_register_ib()
734 ibdev->num_comp_vectors = rdev->num_msix - 1; in bnxt_re_register_ib()
735 ibdev->dev.parent = &rdev->en_dev->pdev->dev; in bnxt_re_register_ib()
739 ret = ib_device_set_netdev(&rdev->ibdev, rdev->netdev, 1); in bnxt_re_register_ib()
743 dma_set_max_seg_size(&rdev->en_dev->pdev->dev, UINT_MAX); in bnxt_re_register_ib()
744 return ib_register_device(ibdev, "bnxt_re%d", &rdev->en_dev->pdev->dev); in bnxt_re_register_ib()
747 static void bnxt_re_dev_remove(struct bnxt_re_dev *rdev) in bnxt_re_dev_remove() argument
749 dev_put(rdev->netdev); in bnxt_re_dev_remove()
750 rdev->netdev = NULL; in bnxt_re_dev_remove()
752 list_del_rcu(&rdev->list); in bnxt_re_dev_remove()
761 struct bnxt_re_dev *rdev; in bnxt_re_dev_add() local
764 rdev = ib_alloc_device(bnxt_re_dev, ibdev); in bnxt_re_dev_add()
765 if (!rdev) { in bnxt_re_dev_add()
771 rdev->netdev = netdev; in bnxt_re_dev_add()
772 dev_hold(rdev->netdev); in bnxt_re_dev_add()
773 rdev->en_dev = en_dev; in bnxt_re_dev_add()
774 rdev->id = rdev->en_dev->pdev->devfn; in bnxt_re_dev_add()
775 INIT_LIST_HEAD(&rdev->qp_list); in bnxt_re_dev_add()
776 mutex_init(&rdev->qp_lock); in bnxt_re_dev_add()
777 atomic_set(&rdev->qp_count, 0); in bnxt_re_dev_add()
778 atomic_set(&rdev->cq_count, 0); in bnxt_re_dev_add()
779 atomic_set(&rdev->srq_count, 0); in bnxt_re_dev_add()
780 atomic_set(&rdev->mr_count, 0); in bnxt_re_dev_add()
781 atomic_set(&rdev->mw_count, 0); in bnxt_re_dev_add()
782 atomic_set(&rdev->ah_count, 0); in bnxt_re_dev_add()
783 atomic_set(&rdev->pd_count, 0); in bnxt_re_dev_add()
784 rdev->cosq[0] = 0xFFFF; in bnxt_re_dev_add()
785 rdev->cosq[1] = 0xFFFF; in bnxt_re_dev_add()
788 list_add_tail_rcu(&rdev->list, &bnxt_re_dev_list); in bnxt_re_dev_add()
790 return rdev; in bnxt_re_dev_add()
840 event.device = &qp->rdev->ibdev; in bnxt_re_handle_qp_async_event()
898 ib_event.device = &srq->rdev->ibdev; in bnxt_re_srqn_handler()
929 static u32 bnxt_re_get_nqdb_offset(struct bnxt_re_dev *rdev, u16 indx) in bnxt_re_get_nqdb_offset() argument
931 return bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx) ? in bnxt_re_get_nqdb_offset()
932 (rdev->is_virtfn ? BNXT_RE_GEN_P5_VF_NQ_DB : in bnxt_re_get_nqdb_offset()
934 rdev->msix_entries[indx].db_offset; in bnxt_re_get_nqdb_offset()
937 static void bnxt_re_cleanup_res(struct bnxt_re_dev *rdev) in bnxt_re_cleanup_res() argument
941 for (i = 1; i < rdev->num_msix; i++) in bnxt_re_cleanup_res()
942 bnxt_qplib_disable_nq(&rdev->nq[i - 1]); in bnxt_re_cleanup_res()
944 if (rdev->qplib_res.rcfw) in bnxt_re_cleanup_res()
945 bnxt_qplib_cleanup_res(&rdev->qplib_res); in bnxt_re_cleanup_res()
948 static int bnxt_re_init_res(struct bnxt_re_dev *rdev) in bnxt_re_init_res() argument
954 bnxt_qplib_init_res(&rdev->qplib_res); in bnxt_re_init_res()
956 for (i = 1; i < rdev->num_msix ; i++) { in bnxt_re_init_res()
957 db_offt = bnxt_re_get_nqdb_offset(rdev, i); in bnxt_re_init_res()
958 rc = bnxt_qplib_enable_nq(rdev->en_dev->pdev, &rdev->nq[i - 1], in bnxt_re_init_res()
959 i - 1, rdev->msix_entries[i].vector, in bnxt_re_init_res()
963 ibdev_err(&rdev->ibdev, in bnxt_re_init_res()
972 bnxt_qplib_disable_nq(&rdev->nq[i]); in bnxt_re_init_res()
976 static void bnxt_re_free_nq_res(struct bnxt_re_dev *rdev) in bnxt_re_free_nq_res() argument
981 for (i = 0; i < rdev->num_msix - 1; i++) { in bnxt_re_free_nq_res()
982 type = bnxt_qplib_get_ring_type(rdev->chip_ctx); in bnxt_re_free_nq_res()
983 bnxt_re_net_ring_free(rdev, rdev->nq[i].ring_id, type); in bnxt_re_free_nq_res()
984 bnxt_qplib_free_nq(&rdev->nq[i]); in bnxt_re_free_nq_res()
985 rdev->nq[i].res = NULL; in bnxt_re_free_nq_res()
989 static void bnxt_re_free_res(struct bnxt_re_dev *rdev) in bnxt_re_free_res() argument
991 bnxt_re_free_nq_res(rdev); in bnxt_re_free_res()
993 if (rdev->qplib_res.dpi_tbl.max) { in bnxt_re_free_res()
994 bnxt_qplib_dealloc_dpi(&rdev->qplib_res, in bnxt_re_free_res()
995 &rdev->qplib_res.dpi_tbl, in bnxt_re_free_res()
996 &rdev->dpi_privileged); in bnxt_re_free_res()
998 if (rdev->qplib_res.rcfw) { in bnxt_re_free_res()
999 bnxt_qplib_free_res(&rdev->qplib_res); in bnxt_re_free_res()
1000 rdev->qplib_res.rcfw = NULL; in bnxt_re_free_res()
1004 static int bnxt_re_alloc_res(struct bnxt_re_dev *rdev) in bnxt_re_alloc_res() argument
1012 rdev->qplib_res.rcfw = &rdev->rcfw; in bnxt_re_alloc_res()
1013 rc = bnxt_qplib_get_dev_attr(&rdev->rcfw, &rdev->dev_attr, in bnxt_re_alloc_res()
1014 rdev->is_virtfn); in bnxt_re_alloc_res()
1018 rc = bnxt_qplib_alloc_res(&rdev->qplib_res, rdev->en_dev->pdev, in bnxt_re_alloc_res()
1019 rdev->netdev, &rdev->dev_attr); in bnxt_re_alloc_res()
1023 rc = bnxt_qplib_alloc_dpi(&rdev->qplib_res.dpi_tbl, in bnxt_re_alloc_res()
1024 &rdev->dpi_privileged, in bnxt_re_alloc_res()
1025 rdev); in bnxt_re_alloc_res()
1029 for (i = 0; i < rdev->num_msix - 1; i++) { in bnxt_re_alloc_res()
1032 nq = &rdev->nq[i]; in bnxt_re_alloc_res()
1034 rc = bnxt_qplib_alloc_nq(&rdev->qplib_res, &rdev->nq[i]); in bnxt_re_alloc_res()
1036 ibdev_err(&rdev->ibdev, "Alloc Failed NQ%d rc:%#x", in bnxt_re_alloc_res()
1040 type = bnxt_qplib_get_ring_type(rdev->chip_ctx); in bnxt_re_alloc_res()
1042 rattr.pages = nq->hwq.pbl[rdev->nq[i].hwq.level].pg_count; in bnxt_re_alloc_res()
1046 rattr.lrid = rdev->msix_entries[i + 1].ring_idx; in bnxt_re_alloc_res()
1047 rc = bnxt_re_net_ring_alloc(rdev, &rattr, &nq->ring_id); in bnxt_re_alloc_res()
1049 ibdev_err(&rdev->ibdev, in bnxt_re_alloc_res()
1052 bnxt_qplib_free_nq(&rdev->nq[i]); in bnxt_re_alloc_res()
1060 type = bnxt_qplib_get_ring_type(rdev->chip_ctx); in bnxt_re_alloc_res()
1061 bnxt_re_net_ring_free(rdev, rdev->nq[i].ring_id, type); in bnxt_re_alloc_res()
1062 bnxt_qplib_free_nq(&rdev->nq[i]); in bnxt_re_alloc_res()
1064 bnxt_qplib_dealloc_dpi(&rdev->qplib_res, in bnxt_re_alloc_res()
1065 &rdev->qplib_res.dpi_tbl, in bnxt_re_alloc_res()
1066 &rdev->dpi_privileged); in bnxt_re_alloc_res()
1068 bnxt_qplib_free_res(&rdev->qplib_res); in bnxt_re_alloc_res()
1071 rdev->qplib_res.rcfw = NULL; in bnxt_re_alloc_res()
1095 static int bnxt_re_query_hwrm_pri2cos(struct bnxt_re_dev *rdev, u8 dir, in bnxt_re_query_hwrm_pri2cos() argument
1099 struct bnxt *bp = netdev_priv(rdev->netdev); in bnxt_re_query_hwrm_pri2cos()
1101 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_query_hwrm_pri2cos()
1111 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, in bnxt_re_query_hwrm_pri2cos()
1125 ibdev_warn(&rdev->ibdev, in bnxt_re_query_hwrm_pri2cos()
1127 ibdev_warn(&rdev->ibdev, in bnxt_re_query_hwrm_pri2cos()
1138 static bool bnxt_re_is_qp1_or_shadow_qp(struct bnxt_re_dev *rdev, in bnxt_re_is_qp1_or_shadow_qp() argument
1142 (qp == rdev->gsi_ctx.gsi_sqp); in bnxt_re_is_qp1_or_shadow_qp()
1145 static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev) in bnxt_re_dev_stop() argument
1152 mutex_lock(&rdev->qp_lock); in bnxt_re_dev_stop()
1153 list_for_each_entry(qp, &rdev->qp_list, list) { in bnxt_re_dev_stop()
1155 if (!bnxt_re_is_qp1_or_shadow_qp(rdev, qp)) { in bnxt_re_dev_stop()
1160 bnxt_re_dispatch_event(&rdev->ibdev, &qp->ib_qp, in bnxt_re_dev_stop()
1167 mutex_unlock(&rdev->qp_lock); in bnxt_re_dev_stop()
1170 static int bnxt_re_update_gid(struct bnxt_re_dev *rdev) in bnxt_re_update_gid() argument
1172 struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl; in bnxt_re_update_gid()
1177 if (!ib_device_try_get(&rdev->ibdev)) in bnxt_re_update_gid()
1181 ibdev_err(&rdev->ibdev, "QPLIB: SGID table not allocated"); in bnxt_re_update_gid()
1201 rdev->qplib_res.netdev->dev_addr); in bnxt_re_update_gid()
1204 ib_device_put(&rdev->ibdev); in bnxt_re_update_gid()
1208 static u32 bnxt_re_get_priority_mask(struct bnxt_re_dev *rdev) in bnxt_re_get_priority_mask() argument
1214 netdev = rdev->netdev; in bnxt_re_get_priority_mask()
1245 static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev) in bnxt_re_setup_qos() argument
1252 prio_map = bnxt_re_get_priority_mask(rdev); in bnxt_re_setup_qos()
1254 if (prio_map == rdev->cur_prio_map) in bnxt_re_setup_qos()
1256 rdev->cur_prio_map = prio_map; in bnxt_re_setup_qos()
1258 rc = bnxt_re_query_hwrm_pri2cos(rdev, 0, &cid_map); in bnxt_re_setup_qos()
1260 ibdev_warn(&rdev->ibdev, "no cos for p_mask %x\n", prio_map); in bnxt_re_setup_qos()
1264 bnxt_re_parse_cid_map(prio_map, (u8 *)&cid_map, rdev->cosq); in bnxt_re_setup_qos()
1267 rc = bnxt_qplib_map_tc2cos(&rdev->qplib_res, rdev->cosq); in bnxt_re_setup_qos()
1269 ibdev_warn(&rdev->ibdev, "no tc for cos{%x, %x}\n", in bnxt_re_setup_qos()
1270 rdev->cosq[0], rdev->cosq[1]); in bnxt_re_setup_qos()
1277 if ((prio_map == 0 && rdev->qplib_res.prio) || in bnxt_re_setup_qos()
1278 (prio_map != 0 && !rdev->qplib_res.prio)) { in bnxt_re_setup_qos()
1279 rdev->qplib_res.prio = prio_map ? true : false; in bnxt_re_setup_qos()
1281 bnxt_re_update_gid(rdev); in bnxt_re_setup_qos()
1287 static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev) in bnxt_re_query_hwrm_intf_version() argument
1289 struct bnxt_en_dev *en_dev = rdev->en_dev; in bnxt_re_query_hwrm_intf_version()
1296 bnxt_re_init_hwrm_hdr(rdev, (void *)&req, in bnxt_re_query_hwrm_intf_version()
1305 ibdev_err(&rdev->ibdev, "Failed to query HW version, rc = 0x%x", in bnxt_re_query_hwrm_intf_version()
1309 rdev->qplib_ctx.hwrm_intf_ver = in bnxt_re_query_hwrm_intf_version()
1316 static int bnxt_re_ib_init(struct bnxt_re_dev *rdev) in bnxt_re_ib_init() argument
1322 rc = bnxt_re_register_ib(rdev); in bnxt_re_ib_init()
1327 dev_info(rdev_to_dev(rdev), "Device registered successfully"); in bnxt_re_ib_init()
1328 ib_get_eth_speed(&rdev->ibdev, 1, &rdev->active_speed, in bnxt_re_ib_init()
1329 &rdev->active_width); in bnxt_re_ib_init()
1330 set_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags); in bnxt_re_ib_init()
1332 event = netif_running(rdev->netdev) && netif_carrier_ok(rdev->netdev) ? in bnxt_re_ib_init()
1335 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, event); in bnxt_re_ib_init()
1340 static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev) in bnxt_re_dev_uninit() argument
1345 if (test_and_clear_bit(BNXT_RE_FLAG_QOS_WORK_REG, &rdev->flags)) in bnxt_re_dev_uninit()
1346 cancel_delayed_work_sync(&rdev->worker); in bnxt_re_dev_uninit()
1349 &rdev->flags)) in bnxt_re_dev_uninit()
1350 bnxt_re_cleanup_res(rdev); in bnxt_re_dev_uninit()
1351 if (test_and_clear_bit(BNXT_RE_FLAG_RESOURCES_ALLOCATED, &rdev->flags)) in bnxt_re_dev_uninit()
1352 bnxt_re_free_res(rdev); in bnxt_re_dev_uninit()
1354 if (test_and_clear_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags)) { in bnxt_re_dev_uninit()
1355 rc = bnxt_qplib_deinit_rcfw(&rdev->rcfw); in bnxt_re_dev_uninit()
1357 ibdev_warn(&rdev->ibdev, in bnxt_re_dev_uninit()
1359 bnxt_re_net_stats_ctx_free(rdev, rdev->qplib_ctx.stats.fw_id); in bnxt_re_dev_uninit()
1360 bnxt_qplib_free_ctx(&rdev->qplib_res, &rdev->qplib_ctx); in bnxt_re_dev_uninit()
1361 bnxt_qplib_disable_rcfw_channel(&rdev->rcfw); in bnxt_re_dev_uninit()
1362 type = bnxt_qplib_get_ring_type(rdev->chip_ctx); in bnxt_re_dev_uninit()
1363 bnxt_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id, type); in bnxt_re_dev_uninit()
1364 bnxt_qplib_free_rcfw_channel(&rdev->rcfw); in bnxt_re_dev_uninit()
1366 if (test_and_clear_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags)) { in bnxt_re_dev_uninit()
1367 rc = bnxt_re_free_msix(rdev); in bnxt_re_dev_uninit()
1369 ibdev_warn(&rdev->ibdev, in bnxt_re_dev_uninit()
1373 bnxt_re_destroy_chip_ctx(rdev); in bnxt_re_dev_uninit()
1374 if (test_and_clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags)) { in bnxt_re_dev_uninit()
1375 rc = bnxt_re_unregister_netdev(rdev); in bnxt_re_dev_uninit()
1377 ibdev_warn(&rdev->ibdev, in bnxt_re_dev_uninit()
1385 struct bnxt_re_dev *rdev = container_of(work, struct bnxt_re_dev, in bnxt_re_worker() local
1388 bnxt_re_setup_qos(rdev); in bnxt_re_worker()
1389 schedule_delayed_work(&rdev->worker, msecs_to_jiffies(30000)); in bnxt_re_worker()
1392 static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode) in bnxt_re_dev_init() argument
1403 rc = bnxt_re_register_netdev(rdev); in bnxt_re_dev_init()
1405 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1409 set_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags); in bnxt_re_dev_init()
1411 rc = bnxt_re_setup_chip_ctx(rdev, wqe_mode); in bnxt_re_dev_init()
1413 ibdev_err(&rdev->ibdev, "Failed to get chip context\n"); in bnxt_re_dev_init()
1418 bnxt_re_get_sriov_func_type(rdev); in bnxt_re_dev_init()
1420 rc = bnxt_re_request_msix(rdev); in bnxt_re_dev_init()
1422 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1427 set_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags); in bnxt_re_dev_init()
1429 bnxt_re_query_hwrm_intf_version(rdev); in bnxt_re_dev_init()
1434 rc = bnxt_qplib_alloc_rcfw_channel(&rdev->qplib_res, &rdev->rcfw, in bnxt_re_dev_init()
1435 &rdev->qplib_ctx, in bnxt_re_dev_init()
1438 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1443 type = bnxt_qplib_get_ring_type(rdev->chip_ctx); in bnxt_re_dev_init()
1444 creq = &rdev->rcfw.creq; in bnxt_re_dev_init()
1450 rattr.lrid = rdev->msix_entries[BNXT_RE_AEQ_IDX].ring_idx; in bnxt_re_dev_init()
1451 rc = bnxt_re_net_ring_alloc(rdev, &rattr, &creq->ring_id); in bnxt_re_dev_init()
1453 ibdev_err(&rdev->ibdev, "Failed to allocate CREQ: %#x\n", rc); in bnxt_re_dev_init()
1456 db_offt = bnxt_re_get_nqdb_offset(rdev, BNXT_RE_AEQ_IDX); in bnxt_re_dev_init()
1457 vid = rdev->msix_entries[BNXT_RE_AEQ_IDX].vector; in bnxt_re_dev_init()
1458 rc = bnxt_qplib_enable_rcfw_channel(&rdev->rcfw, in bnxt_re_dev_init()
1459 vid, db_offt, rdev->is_virtfn, in bnxt_re_dev_init()
1462 ibdev_err(&rdev->ibdev, "Failed to enable RCFW channel: %#x\n", in bnxt_re_dev_init()
1467 rc = bnxt_qplib_get_dev_attr(&rdev->rcfw, &rdev->dev_attr, in bnxt_re_dev_init()
1468 rdev->is_virtfn); in bnxt_re_dev_init()
1472 bnxt_re_set_resource_limits(rdev); in bnxt_re_dev_init()
1474 rc = bnxt_qplib_alloc_ctx(&rdev->qplib_res, &rdev->qplib_ctx, 0, in bnxt_re_dev_init()
1475 bnxt_qplib_is_chip_gen_p5(rdev->chip_ctx)); in bnxt_re_dev_init()
1477 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1481 rc = bnxt_re_net_stats_ctx_alloc(rdev, in bnxt_re_dev_init()
1482 rdev->qplib_ctx.stats.dma_map, in bnxt_re_dev_init()
1483 &rdev->qplib_ctx.stats.fw_id); in bnxt_re_dev_init()
1485 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1490 rc = bnxt_qplib_init_rcfw(&rdev->rcfw, &rdev->qplib_ctx, in bnxt_re_dev_init()
1491 rdev->is_virtfn); in bnxt_re_dev_init()
1493 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1497 set_bit(BNXT_RE_FLAG_RCFW_CHANNEL_EN, &rdev->flags); in bnxt_re_dev_init()
1500 rc = bnxt_re_alloc_res(rdev); in bnxt_re_dev_init()
1502 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1506 set_bit(BNXT_RE_FLAG_RESOURCES_ALLOCATED, &rdev->flags); in bnxt_re_dev_init()
1507 rc = bnxt_re_init_res(rdev); in bnxt_re_dev_init()
1509 ibdev_err(&rdev->ibdev, in bnxt_re_dev_init()
1514 set_bit(BNXT_RE_FLAG_RESOURCES_INITIALIZED, &rdev->flags); in bnxt_re_dev_init()
1516 if (!rdev->is_virtfn) { in bnxt_re_dev_init()
1517 rc = bnxt_re_setup_qos(rdev); in bnxt_re_dev_init()
1519 ibdev_info(&rdev->ibdev, in bnxt_re_dev_init()
1522 INIT_DELAYED_WORK(&rdev->worker, bnxt_re_worker); in bnxt_re_dev_init()
1523 set_bit(BNXT_RE_FLAG_QOS_WORK_REG, &rdev->flags); in bnxt_re_dev_init()
1524 schedule_delayed_work(&rdev->worker, msecs_to_jiffies(30000)); in bnxt_re_dev_init()
1529 bnxt_re_net_stats_ctx_free(rdev, rdev->qplib_ctx.stats.fw_id); in bnxt_re_dev_init()
1531 bnxt_qplib_free_ctx(&rdev->qplib_res, &rdev->qplib_ctx); in bnxt_re_dev_init()
1533 bnxt_qplib_disable_rcfw_channel(&rdev->rcfw); in bnxt_re_dev_init()
1535 type = bnxt_qplib_get_ring_type(rdev->chip_ctx); in bnxt_re_dev_init()
1536 bnxt_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id, type); in bnxt_re_dev_init()
1538 bnxt_qplib_free_rcfw_channel(&rdev->rcfw); in bnxt_re_dev_init()
1540 bnxt_re_dev_uninit(rdev); in bnxt_re_dev_init()
1545 static void bnxt_re_dev_unreg(struct bnxt_re_dev *rdev) in bnxt_re_dev_unreg() argument
1547 struct net_device *netdev = rdev->netdev; in bnxt_re_dev_unreg()
1549 bnxt_re_dev_remove(rdev); in bnxt_re_dev_unreg()
1555 static int bnxt_re_dev_reg(struct bnxt_re_dev **rdev, struct net_device *netdev) in bnxt_re_dev_reg() argument
1566 ibdev_err(&(*rdev)->ibdev, "%s: Failed to probe\n", in bnxt_re_dev_reg()
1571 *rdev = bnxt_re_dev_add(netdev, en_dev); in bnxt_re_dev_reg()
1572 if (!*rdev) { in bnxt_re_dev_reg()
1581 static void bnxt_re_remove_device(struct bnxt_re_dev *rdev) in bnxt_re_remove_device() argument
1583 bnxt_re_dev_uninit(rdev); in bnxt_re_remove_device()
1584 pci_dev_put(rdev->en_dev->pdev); in bnxt_re_remove_device()
1585 bnxt_re_dev_unreg(rdev); in bnxt_re_remove_device()
1588 static int bnxt_re_add_device(struct bnxt_re_dev **rdev, in bnxt_re_add_device() argument
1593 rc = bnxt_re_dev_reg(rdev, netdev); in bnxt_re_add_device()
1602 pci_dev_get((*rdev)->en_dev->pdev); in bnxt_re_add_device()
1603 rc = bnxt_re_dev_init(*rdev, wqe_mode); in bnxt_re_add_device()
1605 pci_dev_put((*rdev)->en_dev->pdev); in bnxt_re_add_device()
1606 bnxt_re_dev_unreg(*rdev); in bnxt_re_add_device()
1614 struct bnxt_re_dev *rdev = in bnxt_re_dealloc_driver() local
1617 dev_info(rdev_to_dev(rdev), "Unregistering Device"); in bnxt_re_dealloc_driver()
1620 bnxt_re_remove_device(rdev); in bnxt_re_dealloc_driver()
1628 struct bnxt_re_dev *rdev; in bnxt_re_task() local
1632 rdev = re_work->rdev; in bnxt_re_task()
1635 rc = bnxt_re_ib_init(rdev); in bnxt_re_task()
1637 ibdev_err(&rdev->ibdev, in bnxt_re_task()
1640 bnxt_re_remove_device(rdev); in bnxt_re_task()
1647 if (!ib_device_try_get(&rdev->ibdev)) in bnxt_re_task()
1652 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, in bnxt_re_task()
1656 bnxt_re_dev_stop(rdev); in bnxt_re_task()
1659 if (!netif_carrier_ok(rdev->netdev)) in bnxt_re_task()
1660 bnxt_re_dev_stop(rdev); in bnxt_re_task()
1661 else if (netif_carrier_ok(rdev->netdev)) in bnxt_re_task()
1662 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, in bnxt_re_task()
1664 ib_get_eth_speed(&rdev->ibdev, 1, &rdev->active_speed, in bnxt_re_task()
1665 &rdev->active_width); in bnxt_re_task()
1670 ib_device_put(&rdev->ibdev); in bnxt_re_task()
1672 put_device(&rdev->ibdev.dev); in bnxt_re_task()
1695 struct bnxt_re_dev *rdev; in bnxt_re_netdev_event() local
1704 rdev = bnxt_re_from_netdev(real_dev); in bnxt_re_netdev_event()
1705 if (!rdev && event != NETDEV_REGISTER) in bnxt_re_netdev_event()
1713 if (rdev) in bnxt_re_netdev_event()
1715 rc = bnxt_re_add_device(&rdev, real_dev, in bnxt_re_netdev_event()
1723 ib_unregister_device_queued(&rdev->ibdev); in bnxt_re_netdev_event()
1734 get_device(&rdev->ibdev.dev); in bnxt_re_netdev_event()
1735 re_work->rdev = rdev; in bnxt_re_netdev_event()
1745 if (rdev && release) in bnxt_re_netdev_event()
1746 ib_device_put(&rdev->ibdev); in bnxt_re_netdev_event()
1782 struct bnxt_re_dev *rdev; in bnxt_re_mod_exit() local
1787 list_for_each_entry(rdev, &bnxt_re_dev_list, list) { in bnxt_re_mod_exit()
1793 if (rdev->is_virtfn) in bnxt_re_mod_exit()
1794 ib_unregister_device(&rdev->ibdev); in bnxt_re_mod_exit()