Lines Matching +refs:dev +refs:id +refs:attrs
121 static inline void *ocrdma_get_mcqe(struct ocrdma_dev *dev) in ocrdma_get_mcqe() argument
124 (dev->mq.cq.va + (dev->mq.cq.tail * sizeof(struct ocrdma_mcqe))); in ocrdma_get_mcqe()
131 static inline void ocrdma_mcq_inc_tail(struct ocrdma_dev *dev) in ocrdma_mcq_inc_tail() argument
133 dev->mq.cq.tail = (dev->mq.cq.tail + 1) & (OCRDMA_MQ_CQ_LEN - 1); in ocrdma_mcq_inc_tail()
136 static inline struct ocrdma_mqe *ocrdma_get_mqe(struct ocrdma_dev *dev) in ocrdma_get_mqe() argument
138 return dev->mq.sq.va + (dev->mq.sq.head * sizeof(struct ocrdma_mqe)); in ocrdma_get_mqe()
141 static inline void ocrdma_mq_inc_head(struct ocrdma_dev *dev) in ocrdma_mq_inc_head() argument
143 dev->mq.sq.head = (dev->mq.sq.head + 1) & (OCRDMA_MQ_LEN - 1); in ocrdma_mq_inc_head()
146 static inline void *ocrdma_get_mqe_rsp(struct ocrdma_dev *dev) in ocrdma_get_mqe_rsp() argument
148 return dev->mq.sq.va + (dev->mqe_ctx.tag * sizeof(struct ocrdma_mqe)); in ocrdma_get_mqe_rsp()
265 char *port_speed_string(struct ocrdma_dev *dev) in port_speed_string() argument
270 speeds_supported = dev->phy.fixed_speeds_supported | in port_speed_string()
271 dev->phy.auto_speeds_supported; in port_speed_string()
305 void ocrdma_ring_cq_db(struct ocrdma_dev *dev, u16 cq_id, bool armed, in ocrdma_ring_cq_db() argument
318 iowrite32(val, dev->nic_info.db + OCRDMA_DB_CQ_OFFSET); in ocrdma_ring_cq_db()
321 static void ocrdma_ring_mq_db(struct ocrdma_dev *dev) in ocrdma_ring_mq_db() argument
325 val |= dev->mq.sq.id & OCRDMA_MQ_ID_MASK; in ocrdma_ring_mq_db()
327 iowrite32(val, dev->nic_info.db + OCRDMA_DB_MQ_OFFSET); in ocrdma_ring_mq_db()
330 static void ocrdma_ring_eq_db(struct ocrdma_dev *dev, u16 eq_id, in ocrdma_ring_eq_db() argument
343 iowrite32(val, dev->nic_info.db + OCRDMA_DB_EQ_OFFSET); in ocrdma_ring_eq_db()
371 static void ocrdma_free_q(struct ocrdma_dev *dev, struct ocrdma_queue_info *q) in ocrdma_free_q() argument
373 dma_free_coherent(&dev->nic_info.pdev->dev, q->size, q->va, q->dma); in ocrdma_free_q()
376 static int ocrdma_alloc_q(struct ocrdma_dev *dev, in ocrdma_alloc_q() argument
383 q->va = dma_alloc_coherent(&dev->nic_info.pdev->dev, q->size, &q->dma, in ocrdma_alloc_q()
402 static int ocrdma_mbx_delete_q(struct ocrdma_dev *dev, in ocrdma_mbx_delete_q() argument
407 struct ocrdma_delete_q_req *cmd = dev->mbx_cmd; in ocrdma_mbx_delete_q()
424 cmd->id = q->id; in ocrdma_mbx_delete_q()
426 status = be_roce_mcc_cmd(dev->nic_info.netdev, in ocrdma_mbx_delete_q()
433 static int ocrdma_mbx_create_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) in ocrdma_mbx_create_eq() argument
436 struct ocrdma_create_eq_req *cmd = dev->mbx_cmd; in ocrdma_mbx_create_eq()
437 struct ocrdma_create_eq_rsp *rsp = dev->mbx_cmd; in ocrdma_mbx_create_eq()
450 status = be_roce_mcc_cmd(dev->nic_info.netdev, cmd, sizeof(*cmd), NULL, in ocrdma_mbx_create_eq()
453 eq->q.id = rsp->vector_eqid & 0xffff; in ocrdma_mbx_create_eq()
460 static int ocrdma_create_eq(struct ocrdma_dev *dev, in ocrdma_create_eq() argument
465 status = ocrdma_alloc_q(dev, &eq->q, OCRDMA_EQ_LEN, in ocrdma_create_eq()
470 status = ocrdma_mbx_create_eq(dev, eq); in ocrdma_create_eq()
473 eq->dev = dev; in ocrdma_create_eq()
474 ocrdma_ring_eq_db(dev, eq->q.id, true, true, 0); in ocrdma_create_eq()
478 ocrdma_free_q(dev, &eq->q); in ocrdma_create_eq()
482 int ocrdma_get_irq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) in ocrdma_get_irq() argument
486 if (dev->nic_info.intr_mode == BE_INTERRUPT_MODE_INTX) in ocrdma_get_irq()
487 irq = dev->nic_info.pdev->irq; in ocrdma_get_irq()
489 irq = dev->nic_info.msix.vector_list[eq->vector]; in ocrdma_get_irq()
493 static void _ocrdma_destroy_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) in _ocrdma_destroy_eq() argument
496 ocrdma_mbx_delete_q(dev, &eq->q, QTYPE_EQ); in _ocrdma_destroy_eq()
497 ocrdma_free_q(dev, &eq->q); in _ocrdma_destroy_eq()
501 static void ocrdma_destroy_eq(struct ocrdma_dev *dev, struct ocrdma_eq *eq) in ocrdma_destroy_eq() argument
508 ocrdma_ring_eq_db(dev, eq->q.id, false, false, 0); in ocrdma_destroy_eq()
510 irq = ocrdma_get_irq(dev, eq); in ocrdma_destroy_eq()
512 _ocrdma_destroy_eq(dev, eq); in ocrdma_destroy_eq()
515 static void ocrdma_destroy_eqs(struct ocrdma_dev *dev) in ocrdma_destroy_eqs() argument
519 for (i = 0; i < dev->eq_cnt; i++) in ocrdma_destroy_eqs()
520 ocrdma_destroy_eq(dev, &dev->eq_tbl[i]); in ocrdma_destroy_eqs()
523 static int ocrdma_mbx_mq_cq_create(struct ocrdma_dev *dev, in ocrdma_mbx_mq_cq_create() argument
527 struct ocrdma_create_cq_cmd *cmd = dev->mbx_cmd; in ocrdma_mbx_mq_cq_create()
528 struct ocrdma_create_cq_cmd_rsp *rsp = dev->mbx_cmd; in ocrdma_mbx_mq_cq_create()
541 cmd->eqn = eq->id; in ocrdma_mbx_mq_cq_create()
546 status = be_roce_mcc_cmd(dev->nic_info.netdev, in ocrdma_mbx_mq_cq_create()
549 cq->id = (u16) (rsp->cq_id & OCRDMA_CREATE_CQ_RSP_CQ_ID_MASK); in ocrdma_mbx_mq_cq_create()
564 static int ocrdma_mbx_create_mq(struct ocrdma_dev *dev, in ocrdma_mbx_create_mq() argument
569 struct ocrdma_create_mq_req *cmd = dev->mbx_cmd; in ocrdma_mbx_create_mq()
570 struct ocrdma_create_mq_rsp *rsp = dev->mbx_cmd; in ocrdma_mbx_create_mq()
580 cmd->cqid_pages |= (cq->id << OCRDMA_CREATE_MQ_CQ_ID_SHIFT); in ocrdma_mbx_create_mq()
588 cmd->async_cqid_ringsize = cq->id; in ocrdma_mbx_create_mq()
595 status = be_roce_mcc_cmd(dev->nic_info.netdev, in ocrdma_mbx_create_mq()
598 mq->id = rsp->id; in ocrdma_mbx_create_mq()
604 static int ocrdma_create_mq(struct ocrdma_dev *dev) in ocrdma_create_mq() argument
609 status = ocrdma_alloc_q(dev, &dev->mq.cq, OCRDMA_MQ_CQ_LEN, in ocrdma_create_mq()
614 dev->eq_tbl[0].cq_cnt++; in ocrdma_create_mq()
615 status = ocrdma_mbx_mq_cq_create(dev, &dev->mq.cq, &dev->eq_tbl[0].q); in ocrdma_create_mq()
619 memset(&dev->mqe_ctx, 0, sizeof(dev->mqe_ctx)); in ocrdma_create_mq()
620 init_waitqueue_head(&dev->mqe_ctx.cmd_wait); in ocrdma_create_mq()
621 mutex_init(&dev->mqe_ctx.lock); in ocrdma_create_mq()
624 status = ocrdma_alloc_q(dev, &dev->mq.sq, OCRDMA_MQ_LEN, in ocrdma_create_mq()
628 status = ocrdma_mbx_create_mq(dev, &dev->mq.sq, &dev->mq.cq); in ocrdma_create_mq()
631 ocrdma_ring_cq_db(dev, dev->mq.cq.id, true, false, 0); in ocrdma_create_mq()
635 ocrdma_free_q(dev, &dev->mq.sq); in ocrdma_create_mq()
637 ocrdma_mbx_delete_q(dev, &dev->mq.cq, QTYPE_CQ); in ocrdma_create_mq()
639 ocrdma_free_q(dev, &dev->mq.cq); in ocrdma_create_mq()
644 static void ocrdma_destroy_mq(struct ocrdma_dev *dev) in ocrdma_destroy_mq() argument
649 mutex_lock(&dev->mqe_ctx.lock); in ocrdma_destroy_mq()
650 mbxq = &dev->mq.sq; in ocrdma_destroy_mq()
652 ocrdma_mbx_delete_q(dev, mbxq, QTYPE_MCCQ); in ocrdma_destroy_mq()
653 ocrdma_free_q(dev, mbxq); in ocrdma_destroy_mq()
655 mutex_unlock(&dev->mqe_ctx.lock); in ocrdma_destroy_mq()
657 cq = &dev->mq.cq; in ocrdma_destroy_mq()
659 ocrdma_mbx_delete_q(dev, cq, QTYPE_CQ); in ocrdma_destroy_mq()
660 ocrdma_free_q(dev, cq); in ocrdma_destroy_mq()
664 static void ocrdma_process_qpcat_error(struct ocrdma_dev *dev, in ocrdma_process_qpcat_error() argument
675 static void ocrdma_dispatch_ibevent(struct ocrdma_dev *dev, in ocrdma_dispatch_ibevent() argument
696 if (qpid < dev->attr.max_qp) in ocrdma_dispatch_ibevent()
697 qp = dev->qp_tbl[qpid]; in ocrdma_dispatch_ibevent()
700 dev->id, qpid); in ocrdma_dispatch_ibevent()
706 if (cqid < dev->attr.max_cq) in ocrdma_dispatch_ibevent()
707 cq = dev->cq_tbl[cqid]; in ocrdma_dispatch_ibevent()
710 dev->id, cqid); in ocrdma_dispatch_ibevent()
717 ib_evt.device = &dev->ibdev; in ocrdma_dispatch_ibevent()
735 ocrdma_process_qpcat_error(dev, qp); in ocrdma_dispatch_ibevent()
781 atomic_inc(&dev->async_err_stats[type]); in ocrdma_dispatch_ibevent()
795 dev_err(&dev->ibdev.dev, "Fatal event received\n"); in ocrdma_dispatch_ibevent()
801 static void ocrdma_process_grp5_aync(struct ocrdma_dev *dev, in ocrdma_process_grp5_aync() argument
813 dev->pvid = ((evt->tag_enabled & in ocrdma_process_grp5_aync()
819 atomic_set(&dev->update_sl, 1); in ocrdma_process_grp5_aync()
827 static void ocrdma_process_link_state(struct ocrdma_dev *dev, in ocrdma_process_link_state() argument
839 if (dev->flags & OCRDMA_FLAGS_LINK_STATUS_INIT) in ocrdma_process_link_state()
840 ocrdma_update_link_state(dev, (lstate & OCRDMA_LINK_ST_MASK)); in ocrdma_process_link_state()
843 static void ocrdma_process_acqe(struct ocrdma_dev *dev, void *ae_cqe) in ocrdma_process_acqe() argument
851 ocrdma_process_link_state(dev, cqe); in ocrdma_process_acqe()
854 ocrdma_dispatch_ibevent(dev, cqe); in ocrdma_process_acqe()
857 ocrdma_process_grp5_aync(dev, cqe); in ocrdma_process_acqe()
861 dev->id, evt_code); in ocrdma_process_acqe()
865 static void ocrdma_process_mcqe(struct ocrdma_dev *dev, struct ocrdma_mcqe *cqe) in ocrdma_process_mcqe() argument
867 if (dev->mqe_ctx.tag == cqe->tag_lo && dev->mqe_ctx.cmd_done == false) { in ocrdma_process_mcqe()
868 dev->mqe_ctx.cqe_status = (cqe->status & in ocrdma_process_mcqe()
870 dev->mqe_ctx.ext_status = in ocrdma_process_mcqe()
873 dev->mqe_ctx.cmd_done = true; in ocrdma_process_mcqe()
874 wake_up(&dev->mqe_ctx.cmd_wait); in ocrdma_process_mcqe()
877 __func__, cqe->tag_lo, dev->mqe_ctx.tag); in ocrdma_process_mcqe()
880 static int ocrdma_mq_cq_handler(struct ocrdma_dev *dev, u16 cq_id) in ocrdma_mq_cq_handler() argument
886 cqe = ocrdma_get_mcqe(dev); in ocrdma_mq_cq_handler()
892 ocrdma_process_acqe(dev, cqe); in ocrdma_mq_cq_handler()
894 ocrdma_process_mcqe(dev, cqe); in ocrdma_mq_cq_handler()
896 ocrdma_mcq_inc_tail(dev); in ocrdma_mq_cq_handler()
898 ocrdma_ring_cq_db(dev, dev->mq.cq.id, true, false, cqe_popped); in ocrdma_mq_cq_handler()
902 static struct ocrdma_cq *_ocrdma_qp_buddy_cq_handler(struct ocrdma_dev *dev, in _ocrdma_qp_buddy_cq_handler() argument
935 static void ocrdma_qp_buddy_cq_handler(struct ocrdma_dev *dev, in ocrdma_qp_buddy_cq_handler() argument
947 spin_lock_irqsave(&dev->flush_q_lock, flags); in ocrdma_qp_buddy_cq_handler()
952 bcq = _ocrdma_qp_buddy_cq_handler(dev, cq, true); in ocrdma_qp_buddy_cq_handler()
954 bcq = _ocrdma_qp_buddy_cq_handler(dev, cq, false); in ocrdma_qp_buddy_cq_handler()
955 spin_unlock_irqrestore(&dev->flush_q_lock, flags); in ocrdma_qp_buddy_cq_handler()
965 static void ocrdma_qp_cq_handler(struct ocrdma_dev *dev, u16 cq_idx) in ocrdma_qp_cq_handler() argument
973 cq = dev->cq_tbl[cq_idx]; in ocrdma_qp_cq_handler()
982 ocrdma_qp_buddy_cq_handler(dev, cq); in ocrdma_qp_cq_handler()
985 static void ocrdma_cq_handler(struct ocrdma_dev *dev, u16 cq_id) in ocrdma_cq_handler() argument
988 if (cq_id == dev->mq.cq.id) in ocrdma_cq_handler()
989 ocrdma_mq_cq_handler(dev, cq_id); in ocrdma_cq_handler()
991 ocrdma_qp_cq_handler(dev, cq_id); in ocrdma_cq_handler()
997 struct ocrdma_dev *dev = eq->dev; in ocrdma_irq_handler() local
1012 eq->q.id, eqe.id_valid); in ocrdma_irq_handler()
1018 ocrdma_ring_eq_db(dev, eq->q.id, false, true, 1); in ocrdma_irq_handler()
1022 ocrdma_cq_handler(dev, cq_id); in ocrdma_irq_handler()
1035 ocrdma_ring_eq_db(dev, eq->q.id, true, true, 0); in ocrdma_irq_handler()
1039 static void ocrdma_post_mqe(struct ocrdma_dev *dev, struct ocrdma_mqe *cmd) in ocrdma_post_mqe() argument
1043 dev->mqe_ctx.tag = dev->mq.sq.head; in ocrdma_post_mqe()
1044 dev->mqe_ctx.cmd_done = false; in ocrdma_post_mqe()
1045 mqe = ocrdma_get_mqe(dev); in ocrdma_post_mqe()
1046 cmd->hdr.tag_lo = dev->mq.sq.head; in ocrdma_post_mqe()
1050 ocrdma_mq_inc_head(dev); in ocrdma_post_mqe()
1051 ocrdma_ring_mq_db(dev); in ocrdma_post_mqe()
1054 static int ocrdma_wait_mqe_cmpl(struct ocrdma_dev *dev) in ocrdma_wait_mqe_cmpl() argument
1058 status = wait_event_timeout(dev->mqe_ctx.cmd_wait, in ocrdma_wait_mqe_cmpl()
1059 (dev->mqe_ctx.cmd_done != false), in ocrdma_wait_mqe_cmpl()
1064 dev->mqe_ctx.fw_error_state = true; in ocrdma_wait_mqe_cmpl()
1066 __func__, dev->id); in ocrdma_wait_mqe_cmpl()
1072 static int ocrdma_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe) in ocrdma_mbx_cmd() argument
1079 mutex_lock(&dev->mqe_ctx.lock); in ocrdma_mbx_cmd()
1080 if (dev->mqe_ctx.fw_error_state) in ocrdma_mbx_cmd()
1082 ocrdma_post_mqe(dev, mqe); in ocrdma_mbx_cmd()
1083 status = ocrdma_wait_mqe_cmpl(dev); in ocrdma_mbx_cmd()
1086 cqe_status = dev->mqe_ctx.cqe_status; in ocrdma_mbx_cmd()
1087 ext_status = dev->mqe_ctx.ext_status; in ocrdma_mbx_cmd()
1088 rsp_mqe = ocrdma_get_mqe_rsp(dev); in ocrdma_mbx_cmd()
1112 mutex_unlock(&dev->mqe_ctx.lock); in ocrdma_mbx_cmd()
1116 static int ocrdma_nonemb_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe, in ocrdma_nonemb_mbx_cmd() argument
1126 status = ocrdma_mbx_cmd(dev, mqe); in ocrdma_nonemb_mbx_cmd()
1143 static void ocrdma_get_attr(struct ocrdma_dev *dev, in ocrdma_get_attr() argument
1211 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) { in ocrdma_get_attr()
1216 dev->attr.max_wqe = rsp->max_wqes_rqes_per_q >> in ocrdma_get_attr()
1218 dev->attr.max_rqe = rsp->max_wqes_rqes_per_q & in ocrdma_get_attr()
1222 static int ocrdma_check_fw_config(struct ocrdma_dev *dev, in ocrdma_check_fw_config() argument
1230 dev->base_eqid = conf->base_eqid; in ocrdma_check_fw_config()
1231 dev->max_eq = conf->max_eq; in ocrdma_check_fw_config()
1236 static int ocrdma_mbx_query_fw_ver(struct ocrdma_dev *dev) in ocrdma_mbx_query_fw_ver() argument
1249 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_query_fw_ver()
1253 memset(&dev->attr.fw_ver[0], 0, sizeof(dev->attr.fw_ver)); in ocrdma_mbx_query_fw_ver()
1254 memcpy(&dev->attr.fw_ver[0], &rsp->running_ver[0], in ocrdma_mbx_query_fw_ver()
1256 ocrdma_le32_to_cpu(dev->attr.fw_ver, sizeof(rsp->running_ver)); in ocrdma_mbx_query_fw_ver()
1263 static int ocrdma_mbx_query_fw_config(struct ocrdma_dev *dev) in ocrdma_mbx_query_fw_config() argument
1275 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_query_fw_config()
1279 status = ocrdma_check_fw_config(dev, rsp); in ocrdma_mbx_query_fw_config()
1285 int ocrdma_mbx_rdma_stats(struct ocrdma_dev *dev, bool reset) in ocrdma_mbx_rdma_stats() argument
1287 struct ocrdma_rdma_stats_req *req = dev->stats_mem.va; in ocrdma_mbx_rdma_stats()
1288 struct ocrdma_mqe *mqe = &dev->stats_mem.mqe; in ocrdma_mbx_rdma_stats()
1297 mqe->hdr.pyld_len = dev->stats_mem.size; in ocrdma_mbx_rdma_stats()
1301 mqe->u.nonemb_req.sge[0].pa_lo = (u32) (dev->stats_mem.pa & 0xffffffff); in ocrdma_mbx_rdma_stats()
1302 mqe->u.nonemb_req.sge[0].pa_hi = (u32) upper_32_bits(dev->stats_mem.pa); in ocrdma_mbx_rdma_stats()
1303 mqe->u.nonemb_req.sge[0].len = dev->stats_mem.size; in ocrdma_mbx_rdma_stats()
1307 memset(req, 0, dev->stats_mem.size); in ocrdma_mbx_rdma_stats()
1312 dev->stats_mem.size); in ocrdma_mbx_rdma_stats()
1316 status = ocrdma_nonemb_mbx_cmd(dev, mqe, dev->stats_mem.va); in ocrdma_mbx_rdma_stats()
1321 ocrdma_le32_to_cpu(req, dev->stats_mem.size); in ocrdma_mbx_rdma_stats()
1327 static int ocrdma_mbx_get_ctrl_attribs(struct ocrdma_dev *dev) in ocrdma_mbx_get_ctrl_attribs() argument
1340 dma.va = dma_alloc_coherent(&dev->nic_info.pdev->dev, in ocrdma_mbx_get_ctrl_attribs()
1358 status = ocrdma_nonemb_mbx_cmd(dev, mqe, dma.va); in ocrdma_mbx_get_ctrl_attribs()
1363 dev->hba_port_num = (hba_attribs->ptpnum_maxdoms_hbast_cv & in ocrdma_mbx_get_ctrl_attribs()
1366 strscpy(dev->model_number, in ocrdma_mbx_get_ctrl_attribs()
1368 sizeof(dev->model_number)); in ocrdma_mbx_get_ctrl_attribs()
1370 dma_free_coherent(&dev->nic_info.pdev->dev, dma.size, dma.va, dma.pa); in ocrdma_mbx_get_ctrl_attribs()
1376 static int ocrdma_mbx_query_dev(struct ocrdma_dev *dev) in ocrdma_mbx_query_dev() argument
1385 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_query_dev()
1389 ocrdma_get_attr(dev, &dev->attr, rsp); in ocrdma_mbx_query_dev()
1395 int ocrdma_mbx_get_link_speed(struct ocrdma_dev *dev, u8 *lnk_speed, in ocrdma_mbx_get_link_speed() argument
1412 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_get_link_speed()
1428 static int ocrdma_mbx_get_phy_info(struct ocrdma_dev *dev) in ocrdma_mbx_get_phy_info() argument
1442 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_get_phy_info()
1447 dev->phy.phy_type = in ocrdma_mbx_get_phy_info()
1449 dev->phy.interface_type = in ocrdma_mbx_get_phy_info()
1452 dev->phy.auto_speeds_supported = in ocrdma_mbx_get_phy_info()
1454 dev->phy.fixed_speeds_supported = in ocrdma_mbx_get_phy_info()
1462 int ocrdma_mbx_alloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd) in ocrdma_mbx_alloc_pd() argument
1473 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_alloc_pd()
1477 pd->id = rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_PDID_MASK; in ocrdma_mbx_alloc_pd()
1491 int ocrdma_mbx_dealloc_pd(struct ocrdma_dev *dev, struct ocrdma_pd *pd) in ocrdma_mbx_dealloc_pd() argument
1499 cmd->id = pd->id; in ocrdma_mbx_dealloc_pd()
1500 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_dealloc_pd()
1506 static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev) in ocrdma_mbx_alloc_pd_range() argument
1513 if (dev->attr.max_dpp_pds) { in ocrdma_mbx_alloc_pd_range()
1518 cmd->pd_count = dev->attr.max_dpp_pds; in ocrdma_mbx_alloc_pd_range()
1520 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_alloc_pd_range()
1525 dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >> in ocrdma_mbx_alloc_pd_range()
1527 dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid & in ocrdma_mbx_alloc_pd_range()
1529 dev->pd_mgr->max_dpp_pd = rsp->pd_count; in ocrdma_mbx_alloc_pd_range()
1530 dev->pd_mgr->pd_dpp_bitmap = bitmap_zalloc(rsp->pd_count, in ocrdma_mbx_alloc_pd_range()
1540 cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds; in ocrdma_mbx_alloc_pd_range()
1541 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_alloc_pd_range()
1544 dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid & in ocrdma_mbx_alloc_pd_range()
1546 dev->pd_mgr->max_normal_pd = rsp->pd_count; in ocrdma_mbx_alloc_pd_range()
1547 dev->pd_mgr->pd_norm_bitmap = bitmap_zalloc(rsp->pd_count, in ocrdma_mbx_alloc_pd_range()
1552 if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) { in ocrdma_mbx_alloc_pd_range()
1554 dev->pd_mgr->pd_prealloc_valid = true; in ocrdma_mbx_alloc_pd_range()
1560 static void ocrdma_mbx_dealloc_pd_range(struct ocrdma_dev *dev) in ocrdma_mbx_dealloc_pd_range() argument
1569 if (dev->pd_mgr->max_normal_pd) { in ocrdma_mbx_dealloc_pd_range()
1570 cmd->start_pd_id = dev->pd_mgr->pd_norm_start; in ocrdma_mbx_dealloc_pd_range()
1571 cmd->pd_count = dev->pd_mgr->max_normal_pd; in ocrdma_mbx_dealloc_pd_range()
1572 ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_dealloc_pd_range()
1575 if (dev->pd_mgr->max_dpp_pd) { in ocrdma_mbx_dealloc_pd_range()
1583 cmd->start_pd_id = dev->pd_mgr->pd_dpp_start; in ocrdma_mbx_dealloc_pd_range()
1584 cmd->pd_count = dev->pd_mgr->max_dpp_pd; in ocrdma_mbx_dealloc_pd_range()
1585 ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_dealloc_pd_range()
1591 void ocrdma_alloc_pd_pool(struct ocrdma_dev *dev) in ocrdma_alloc_pd_pool() argument
1595 dev->pd_mgr = kzalloc(sizeof(struct ocrdma_pd_resource_mgr), in ocrdma_alloc_pd_pool()
1597 if (!dev->pd_mgr) in ocrdma_alloc_pd_pool()
1600 status = ocrdma_mbx_alloc_pd_range(dev); in ocrdma_alloc_pd_pool()
1603 __func__, dev->id); in ocrdma_alloc_pd_pool()
1607 static void ocrdma_free_pd_pool(struct ocrdma_dev *dev) in ocrdma_free_pd_pool() argument
1609 ocrdma_mbx_dealloc_pd_range(dev); in ocrdma_free_pd_pool()
1610 bitmap_free(dev->pd_mgr->pd_norm_bitmap); in ocrdma_free_pd_pool()
1611 bitmap_free(dev->pd_mgr->pd_dpp_bitmap); in ocrdma_free_pd_pool()
1612 kfree(dev->pd_mgr); in ocrdma_free_pd_pool()
1639 static int ocrdma_mbx_create_ah_tbl(struct ocrdma_dev *dev) in ocrdma_mbx_create_ah_tbl() argument
1646 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_create_ah_tbl()
1655 dev->av_tbl.size = sizeof(struct ocrdma_av) * max_ah; in ocrdma_mbx_create_ah_tbl()
1675 dev->av_tbl.pbl.va = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, in ocrdma_mbx_create_ah_tbl()
1676 &dev->av_tbl.pbl.pa, in ocrdma_mbx_create_ah_tbl()
1678 if (dev->av_tbl.pbl.va == NULL) in ocrdma_mbx_create_ah_tbl()
1681 dev->av_tbl.va = dma_alloc_coherent(&pdev->dev, dev->av_tbl.size, in ocrdma_mbx_create_ah_tbl()
1683 if (dev->av_tbl.va == NULL) in ocrdma_mbx_create_ah_tbl()
1685 dev->av_tbl.pa = pa; in ocrdma_mbx_create_ah_tbl()
1686 dev->av_tbl.num_ah = max_ah; in ocrdma_mbx_create_ah_tbl()
1688 pbes = (struct ocrdma_pbe *)dev->av_tbl.pbl.va; in ocrdma_mbx_create_ah_tbl()
1689 for (i = 0; i < dev->av_tbl.size / OCRDMA_MIN_Q_PAGE_SIZE; i++) { in ocrdma_mbx_create_ah_tbl()
1694 cmd->tbl_addr[0].lo = (u32)(dev->av_tbl.pbl.pa & 0xFFFFFFFF); in ocrdma_mbx_create_ah_tbl()
1695 cmd->tbl_addr[0].hi = (u32)upper_32_bits(dev->av_tbl.pbl.pa); in ocrdma_mbx_create_ah_tbl()
1696 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_create_ah_tbl()
1700 dev->av_tbl.ahid = rsp->ahid & 0xFFFF; in ocrdma_mbx_create_ah_tbl()
1705 dma_free_coherent(&pdev->dev, dev->av_tbl.size, dev->av_tbl.va, in ocrdma_mbx_create_ah_tbl()
1706 dev->av_tbl.pa); in ocrdma_mbx_create_ah_tbl()
1707 dev->av_tbl.va = NULL; in ocrdma_mbx_create_ah_tbl()
1709 dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->av_tbl.pbl.va, in ocrdma_mbx_create_ah_tbl()
1710 dev->av_tbl.pbl.pa); in ocrdma_mbx_create_ah_tbl()
1711 dev->av_tbl.pbl.va = NULL; in ocrdma_mbx_create_ah_tbl()
1712 dev->av_tbl.size = 0; in ocrdma_mbx_create_ah_tbl()
1718 static void ocrdma_mbx_delete_ah_tbl(struct ocrdma_dev *dev) in ocrdma_mbx_delete_ah_tbl() argument
1721 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_delete_ah_tbl()
1723 if (dev->av_tbl.va == NULL) in ocrdma_mbx_delete_ah_tbl()
1729 cmd->ahid = dev->av_tbl.ahid; in ocrdma_mbx_delete_ah_tbl()
1731 ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_delete_ah_tbl()
1732 dma_free_coherent(&pdev->dev, dev->av_tbl.size, dev->av_tbl.va, in ocrdma_mbx_delete_ah_tbl()
1733 dev->av_tbl.pa); in ocrdma_mbx_delete_ah_tbl()
1734 dev->av_tbl.va = NULL; in ocrdma_mbx_delete_ah_tbl()
1735 dma_free_coherent(&pdev->dev, PAGE_SIZE, dev->av_tbl.pbl.va, in ocrdma_mbx_delete_ah_tbl()
1736 dev->av_tbl.pbl.pa); in ocrdma_mbx_delete_ah_tbl()
1744 static u16 ocrdma_bind_eq(struct ocrdma_dev *dev) in ocrdma_bind_eq() argument
1749 mutex_lock(&dev->dev_lock); in ocrdma_bind_eq()
1750 cq_cnt = dev->eq_tbl[0].cq_cnt; in ocrdma_bind_eq()
1751 eq_id = dev->eq_tbl[0].q.id; in ocrdma_bind_eq()
1755 for (i = 0; i < dev->eq_cnt; i++) { in ocrdma_bind_eq()
1756 if (dev->eq_tbl[i].cq_cnt < cq_cnt) { in ocrdma_bind_eq()
1757 cq_cnt = dev->eq_tbl[i].cq_cnt; in ocrdma_bind_eq()
1758 eq_id = dev->eq_tbl[i].q.id; in ocrdma_bind_eq()
1762 dev->eq_tbl[selected_eq].cq_cnt += 1; in ocrdma_bind_eq()
1763 mutex_unlock(&dev->dev_lock); in ocrdma_bind_eq()
1767 static void ocrdma_unbind_eq(struct ocrdma_dev *dev, u16 eq_id) in ocrdma_unbind_eq() argument
1771 mutex_lock(&dev->dev_lock); in ocrdma_unbind_eq()
1772 i = ocrdma_get_eq_table_index(dev, eq_id); in ocrdma_unbind_eq()
1775 dev->eq_tbl[i].cq_cnt -= 1; in ocrdma_unbind_eq()
1776 mutex_unlock(&dev->dev_lock); in ocrdma_unbind_eq()
1779 int ocrdma_mbx_create_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq, in ocrdma_mbx_create_cq() argument
1783 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_create_cq()
1788 if (entries > dev->attr.max_cqe) { in ocrdma_mbx_create_cq()
1790 __func__, dev->id, dev->attr.max_cqe, entries); in ocrdma_mbx_create_cq()
1793 if (dpp_cq && (ocrdma_get_asic_type(dev) != OCRDMA_ASIC_GEN_SKH_R)) in ocrdma_mbx_create_cq()
1802 cq->max_hw_cqe = dev->attr.max_cqe; in ocrdma_mbx_create_cq()
1803 max_hw_cqe = dev->attr.max_cqe; in ocrdma_mbx_create_cq()
1815 cq->va = dma_alloc_coherent(&pdev->dev, cq->len, &cq->pa, GFP_KERNEL); in ocrdma_mbx_create_cq()
1826 cq->eqn = ocrdma_bind_eq(dev); in ocrdma_mbx_create_cq()
1852 if (ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R) { in ocrdma_mbx_create_cq()
1868 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_create_cq()
1873 cq->id = (u16) (rsp->rsp.cq_id & OCRDMA_CREATE_CQ_RSP_CQ_ID_MASK); in ocrdma_mbx_create_cq()
1877 ocrdma_unbind_eq(dev, cq->eqn); in ocrdma_mbx_create_cq()
1878 dma_free_coherent(&pdev->dev, cq->len, cq->va, cq->pa); in ocrdma_mbx_create_cq()
1884 void ocrdma_mbx_destroy_cq(struct ocrdma_dev *dev, struct ocrdma_cq *cq) in ocrdma_mbx_destroy_cq() argument
1895 (cq->id << OCRDMA_DESTROY_CQ_QID_SHIFT) & in ocrdma_mbx_destroy_cq()
1898 ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_destroy_cq()
1899 ocrdma_unbind_eq(dev, cq->eqn); in ocrdma_mbx_destroy_cq()
1900 dma_free_coherent(&dev->nic_info.pdev->dev, cq->len, cq->va, cq->pa); in ocrdma_mbx_destroy_cq()
1904 int ocrdma_mbx_alloc_lkey(struct ocrdma_dev *dev, struct ocrdma_hw_mr *hwmr, in ocrdma_mbx_alloc_lkey() argument
1928 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_alloc_lkey()
1938 int ocrdma_mbx_dealloc_lkey(struct ocrdma_dev *dev, int fr_mr, u32 lkey) in ocrdma_mbx_dealloc_lkey() argument
1948 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_dealloc_lkey()
1954 static int ocrdma_mbx_reg_mr(struct ocrdma_dev *dev, struct ocrdma_hw_mr *hwmr, in ocrdma_mbx_reg_mr() argument
1996 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_reg_mr()
2006 static int ocrdma_mbx_reg_mr_cont(struct ocrdma_dev *dev, in ocrdma_mbx_reg_mr_cont() argument
2028 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_reg_mr_cont()
2034 int ocrdma_reg_mr(struct ocrdma_dev *dev, in ocrdma_reg_mr() argument
2047 status = ocrdma_mbx_reg_mr(dev, hwmr, pdid, in ocrdma_reg_mr()
2067 status = ocrdma_mbx_reg_mr_cont(dev, hwmr, cur_pbl_cnt, in ocrdma_reg_mr()
2108 struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device); in ocrdma_flush_qp() local
2110 spin_lock_irqsave(&dev->flush_q_lock, flags); in ocrdma_flush_qp()
2119 spin_unlock_irqrestore(&dev->flush_q_lock, flags); in ocrdma_flush_qp()
2178 struct ib_qp_init_attr *attrs, in ocrdma_set_create_qp_sq_cmd() argument
2185 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); in ocrdma_set_create_qp_sq_cmd() local
2186 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_set_create_qp_sq_cmd()
2188 u32 max_sges = attrs->cap.max_send_sge; in ocrdma_set_create_qp_sq_cmd()
2191 max_wqe_allocated = min_t(u32, attrs->cap.max_send_wr + 1, in ocrdma_set_create_qp_sq_cmd()
2192 dev->attr.max_wqe); in ocrdma_set_create_qp_sq_cmd()
2195 dev->attr.wqe_size, &hw_pages, &hw_page_size); in ocrdma_set_create_qp_sq_cmd()
2204 qp->sq.va = dma_alloc_coherent(&pdev->dev, len, &pa, GFP_KERNEL); in ocrdma_set_create_qp_sq_cmd()
2209 qp->sq.entry_size = dev->attr.wqe_size; in ocrdma_set_create_qp_sq_cmd()
2226 cmd->wqe_rqe_size |= (dev->attr.wqe_size << in ocrdma_set_create_qp_sq_cmd()
2233 struct ib_qp_init_attr *attrs, in ocrdma_set_create_qp_rq_cmd() argument
2240 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); in ocrdma_set_create_qp_rq_cmd() local
2241 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_set_create_qp_rq_cmd()
2242 u32 max_rqe_allocated = attrs->cap.max_recv_wr + 1; in ocrdma_set_create_qp_rq_cmd()
2244 status = ocrdma_build_q_conf(&max_rqe_allocated, dev->attr.rqe_size, in ocrdma_set_create_qp_rq_cmd()
2248 attrs->cap.max_recv_wr + 1); in ocrdma_set_create_qp_rq_cmd()
2254 qp->rq.va = dma_alloc_coherent(&pdev->dev, len, &pa, GFP_KERNEL); in ocrdma_set_create_qp_rq_cmd()
2259 qp->rq.entry_size = dev->attr.rqe_size; in ocrdma_set_create_qp_rq_cmd()
2267 cmd->max_sge_recv_flags |= (attrs->cap.max_recv_sge << in ocrdma_set_create_qp_rq_cmd()
2273 cmd->wqe_rqe_size |= (dev->attr.rqe_size << in ocrdma_set_create_qp_rq_cmd()
2299 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); in ocrdma_set_create_qp_ird_cmd() local
2300 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_set_create_qp_ird_cmd()
2302 int ird_page_size = dev->attr.ird_page_size; in ocrdma_set_create_qp_ird_cmd()
2303 int ird_q_len = dev->attr.num_ird_pages * ird_page_size; in ocrdma_set_create_qp_ird_cmd()
2307 if (dev->attr.ird == 0) in ocrdma_set_create_qp_ird_cmd()
2310 qp->ird_q_va = dma_alloc_coherent(&pdev->dev, ird_q_len, &pa, in ocrdma_set_create_qp_ird_cmd()
2314 ocrdma_build_q_pages(&cmd->ird_addr[0], dev->attr.num_ird_pages, in ocrdma_set_create_qp_ird_cmd()
2316 for (; i < ird_q_len / dev->attr.rqe_size; i++) { in ocrdma_set_create_qp_ird_cmd()
2318 (i * dev->attr.rqe_size)); in ocrdma_set_create_qp_ird_cmd()
2330 struct ib_qp_init_attr *attrs, in ocrdma_get_create_qp_rsp() argument
2334 qp->id = rsp->qp_id & OCRDMA_CREATE_QP_RSP_QP_ID_MASK; in ocrdma_get_create_qp_rsp()
2357 if (!attrs->srq) { in ocrdma_get_create_qp_rsp()
2363 int ocrdma_mbx_create_qp(struct ocrdma_qp *qp, struct ib_qp_init_attr *attrs, in ocrdma_mbx_create_qp() argument
2370 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); in ocrdma_mbx_create_qp() local
2371 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_create_qp()
2377 switch (attrs->qp_type) { in ocrdma_mbx_create_qp()
2396 status = ocrdma_set_create_qp_sq_cmd(cmd, attrs, qp); in ocrdma_mbx_create_qp()
2400 if (attrs->srq) { in ocrdma_mbx_create_qp()
2401 struct ocrdma_srq *srq = get_ocrdma_srq(attrs->srq); in ocrdma_mbx_create_qp()
2403 cmd->rq_addr[0].lo = srq->id; in ocrdma_mbx_create_qp()
2406 status = ocrdma_set_create_qp_rq_cmd(cmd, attrs, qp); in ocrdma_mbx_create_qp()
2415 cmd->type_pgsz_pdn |= (pd->id << OCRDMA_CREATE_QP_REQ_PD_ID_SHIFT) & in ocrdma_mbx_create_qp()
2421 cmd->max_ord_ird |= (dev->attr.max_ord_per_qp << in ocrdma_mbx_create_qp()
2424 cmd->max_ord_ird |= (dev->attr.max_ird_per_qp << in ocrdma_mbx_create_qp()
2427 cq = get_ocrdma_cq(attrs->send_cq); in ocrdma_mbx_create_qp()
2428 cmd->wq_rq_cqid |= (cq->id << OCRDMA_CREATE_QP_REQ_WQ_CQID_SHIFT) & in ocrdma_mbx_create_qp()
2431 cq = get_ocrdma_cq(attrs->recv_cq); in ocrdma_mbx_create_qp()
2432 cmd->wq_rq_cqid |= (cq->id << OCRDMA_CREATE_QP_REQ_RQ_CQID_SHIFT) & in ocrdma_mbx_create_qp()
2436 if (pd->dpp_enabled && attrs->cap.max_inline_data && pd->num_dpp_qp && in ocrdma_mbx_create_qp()
2437 (attrs->cap.max_inline_data <= dev->attr.max_inline_data)) { in ocrdma_mbx_create_qp()
2442 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_create_qp()
2446 ocrdma_get_create_qp_rsp(rsp, qp, attrs, dpp_offset, dpp_credit_lmt); in ocrdma_mbx_create_qp()
2452 dma_free_coherent(&pdev->dev, qp->rq.len, qp->rq.va, qp->rq.pa); in ocrdma_mbx_create_qp()
2454 pr_err("%s(%d) rq_err\n", __func__, dev->id); in ocrdma_mbx_create_qp()
2455 dma_free_coherent(&pdev->dev, qp->sq.len, qp->sq.va, qp->sq.pa); in ocrdma_mbx_create_qp()
2457 pr_err("%s(%d) sq_err\n", __func__, dev->id); in ocrdma_mbx_create_qp()
2462 int ocrdma_mbx_query_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp, in ocrdma_mbx_query_qp() argument
2472 cmd->qp_id = qp->id; in ocrdma_mbx_query_qp()
2473 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_query_qp()
2485 struct ib_qp_attr *attrs, in ocrdma_set_av_params() argument
2489 struct rdma_ah_attr *ah_attr = &attrs->ah_attr; in ocrdma_set_av_params()
2497 struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device); in ocrdma_set_av_params() local
2503 if (atomic_cmpxchg(&dev->update_sl, 1, 0)) in ocrdma_set_av_params()
2504 ocrdma_init_service_level(dev); in ocrdma_set_av_params()
2527 status = ocrdma_resolve_dmac(dev, ah_attr, &mac_addr[0]); in ocrdma_set_av_params()
2550 if (vlan_id || dev->pfc_state) { in ocrdma_set_av_params()
2553 dev->id); in ocrdma_set_av_params()
2555 dev->id); in ocrdma_set_av_params()
2561 (dev->sl & 0x07) << OCRDMA_QP_PARAMS_SL_SHIFT; in ocrdma_set_av_params()
2571 struct ib_qp_attr *attrs, int attr_mask) in ocrdma_set_qp_params() argument
2574 struct ocrdma_dev *dev = get_ocrdma_dev(qp->ibqp.device); in ocrdma_set_qp_params() local
2577 cmd->params.path_mtu_pkey_indx |= (attrs->pkey_index & in ocrdma_set_qp_params()
2582 qp->qkey = attrs->qkey; in ocrdma_set_qp_params()
2583 cmd->params.qkey = attrs->qkey; in ocrdma_set_qp_params()
2587 status = ocrdma_set_av_params(qp, cmd, attrs, attr_mask); in ocrdma_set_qp_params()
2592 cmd->params.dmac_b0_to_b3 = dev->nic_info.mac_addr[0] | in ocrdma_set_qp_params()
2593 (dev->nic_info.mac_addr[1] << 8) | in ocrdma_set_qp_params()
2594 (dev->nic_info.mac_addr[2] << 16) | in ocrdma_set_qp_params()
2595 (dev->nic_info.mac_addr[3] << 24); in ocrdma_set_qp_params()
2596 cmd->params.vlan_dmac_b4_to_b5 = dev->nic_info.mac_addr[4] | in ocrdma_set_qp_params()
2597 (dev->nic_info.mac_addr[5] << 8); in ocrdma_set_qp_params()
2600 attrs->en_sqd_async_notify) { in ocrdma_set_qp_params()
2606 cmd->params.ack_to_rnr_rtc_dest_qpn |= (attrs->dest_qp_num & in ocrdma_set_qp_params()
2611 if (attrs->path_mtu < IB_MTU_512 || in ocrdma_set_qp_params()
2612 attrs->path_mtu > IB_MTU_4096) { in ocrdma_set_qp_params()
2614 dev->id, ib_mtu_enum_to_int(attrs->path_mtu)); in ocrdma_set_qp_params()
2619 (ib_mtu_enum_to_int(attrs->path_mtu) << in ocrdma_set_qp_params()
2625 cmd->params.ack_to_rnr_rtc_dest_qpn |= attrs->timeout << in ocrdma_set_qp_params()
2630 cmd->params.rnt_rc_sl_fl |= (attrs->retry_cnt << in ocrdma_set_qp_params()
2636 cmd->params.rnt_rc_sl_fl |= (attrs->min_rnr_timer << in ocrdma_set_qp_params()
2642 cmd->params.ack_to_rnr_rtc_dest_qpn |= (attrs->rnr_retry << in ocrdma_set_qp_params()
2648 cmd->params.tclass_sq_psn |= (attrs->sq_psn & 0x00ffffff); in ocrdma_set_qp_params()
2652 cmd->params.hop_lmt_rq_psn |= (attrs->rq_psn & 0x00ffffff); in ocrdma_set_qp_params()
2656 if (attrs->max_rd_atomic > dev->attr.max_ord_per_qp) { in ocrdma_set_qp_params()
2660 qp->max_ord = attrs->max_rd_atomic; in ocrdma_set_qp_params()
2664 if (attrs->max_dest_rd_atomic > dev->attr.max_ird_per_qp) { in ocrdma_set_qp_params()
2668 qp->max_ird = attrs->max_dest_rd_atomic; in ocrdma_set_qp_params()
2678 int ocrdma_mbx_modify_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp, in ocrdma_mbx_modify_qp() argument
2679 struct ib_qp_attr *attrs, int attr_mask) in ocrdma_mbx_modify_qp() argument
2688 cmd->params.id = qp->id; in ocrdma_mbx_modify_qp()
2692 (get_ocrdma_qp_state(attrs->qp_state) << in ocrdma_mbx_modify_qp()
2702 status = ocrdma_set_qp_params(qp, cmd, attrs, attr_mask); in ocrdma_mbx_modify_qp()
2705 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_modify_qp()
2714 int ocrdma_mbx_destroy_qp(struct ocrdma_dev *dev, struct ocrdma_qp *qp) in ocrdma_mbx_destroy_qp() argument
2718 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_destroy_qp()
2723 cmd->qp_id = qp->id; in ocrdma_mbx_destroy_qp()
2724 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_destroy_qp()
2731 dma_free_coherent(&pdev->dev, qp->sq.len, qp->sq.va, qp->sq.pa); in ocrdma_mbx_destroy_qp()
2733 dma_free_coherent(&pdev->dev, qp->rq.len, qp->rq.va, qp->rq.pa); in ocrdma_mbx_destroy_qp()
2739 int ocrdma_mbx_create_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq, in ocrdma_mbx_create_srq() argument
2749 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_create_srq()
2756 cmd->pgsz_pdid = pd->id & OCRDMA_CREATE_SRQ_PD_ID_MASK; in ocrdma_mbx_create_srq()
2759 dev->attr.rqe_size, in ocrdma_mbx_create_srq()
2768 srq->rq.va = dma_alloc_coherent(&pdev->dev, len, &pa, GFP_KERNEL); in ocrdma_mbx_create_srq()
2775 srq->rq.entry_size = dev->attr.rqe_size; in ocrdma_mbx_create_srq()
2786 cmd->pages_rqe_sz |= (dev->attr.rqe_size in ocrdma_mbx_create_srq()
2791 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_create_srq()
2795 srq->id = rsp->id; in ocrdma_mbx_create_srq()
2796 srq->rq.dbid = rsp->id; in ocrdma_mbx_create_srq()
2808 dma_free_coherent(&pdev->dev, srq->rq.len, srq->rq.va, pa); in ocrdma_mbx_create_srq()
2819 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); in ocrdma_mbx_modify_srq() local
2824 cmd->id = srq->id; in ocrdma_mbx_modify_srq()
2827 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_modify_srq()
2836 struct ocrdma_dev *dev = get_ocrdma_dev(srq->ibsrq.device); in ocrdma_mbx_query_srq() local
2841 cmd->id = srq->rq.dbid; in ocrdma_mbx_query_srq()
2842 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_query_srq()
2858 void ocrdma_mbx_destroy_srq(struct ocrdma_dev *dev, struct ocrdma_srq *srq) in ocrdma_mbx_destroy_srq() argument
2861 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_destroy_srq()
2865 cmd->id = srq->id; in ocrdma_mbx_destroy_srq()
2866 ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_destroy_srq()
2868 dma_free_coherent(&pdev->dev, srq->rq.len, in ocrdma_mbx_destroy_srq()
2873 static int ocrdma_mbx_get_dcbx_config(struct ocrdma_dev *dev, u32 ptype, in ocrdma_mbx_get_dcbx_config() argument
2882 struct pci_dev *pdev = dev->nic_info.pdev; in ocrdma_mbx_get_dcbx_config()
2888 req = dma_alloc_coherent(&pdev->dev, cmd.hdr.pyld_len, &pa, GFP_KERNEL); in ocrdma_mbx_get_dcbx_config()
2904 status = ocrdma_mbx_cmd(dev, &cmd); in ocrdma_mbx_get_dcbx_config()
2913 dma_free_coherent(&pdev->dev, cmd.hdr.pyld_len, req, pa); in ocrdma_mbx_get_dcbx_config()
2921 static int ocrdma_parse_dcbxcfg_rsp(struct ocrdma_dev *dev, int ptype, in ocrdma_parse_dcbxcfg_rsp() argument
2934 dev_name(&dev->nic_info.pdev->dev), dev->id); in ocrdma_parse_dcbxcfg_rsp()
2940 dev_name(&dev->nic_info.pdev->dev), dev->id, in ocrdma_parse_dcbxcfg_rsp()
2949 dev_name(&dev->nic_info.pdev->dev), dev->id); in ocrdma_parse_dcbxcfg_rsp()
2987 dev_name(&dev->nic_info.pdev->dev), in ocrdma_parse_dcbxcfg_rsp()
2988 dev->id, proto); in ocrdma_parse_dcbxcfg_rsp()
2997 void ocrdma_init_service_level(struct ocrdma_dev *dev) in ocrdma_init_service_level() argument
3005 status = ocrdma_mbx_get_dcbx_config(dev, ptype, &dcbxcfg); in ocrdma_init_service_level()
3012 status = ocrdma_parse_dcbxcfg_rsp(dev, ptype, in ocrdma_init_service_level()
3024 dev_name(&dev->nic_info.pdev->dev), dev->id); in ocrdma_init_service_level()
3027 dev_name(&dev->nic_info.pdev->dev), dev->id, in ocrdma_init_service_level()
3030 dev->pfc_state = ocrdma_is_enabled_and_synced(dcbxcfg.pfc_state); in ocrdma_init_service_level()
3031 dev->sl = srvc_lvl; in ocrdma_init_service_level()
3034 int ocrdma_alloc_av(struct ocrdma_dev *dev, struct ocrdma_ah *ah) in ocrdma_alloc_av() argument
3041 av = dev->av_tbl.va; in ocrdma_alloc_av()
3042 spin_lock_irqsave(&dev->av_tbl.lock, flags); in ocrdma_alloc_av()
3043 for (i = 0; i < dev->av_tbl.num_ah; i++) { in ocrdma_alloc_av()
3047 ah->id = i; in ocrdma_alloc_av()
3053 if (i == dev->av_tbl.num_ah) in ocrdma_alloc_av()
3055 spin_unlock_irqrestore(&dev->av_tbl.lock, flags); in ocrdma_alloc_av()
3059 void ocrdma_free_av(struct ocrdma_dev *dev, struct ocrdma_ah *ah) in ocrdma_free_av() argument
3062 spin_lock_irqsave(&dev->av_tbl.lock, flags); in ocrdma_free_av()
3064 spin_unlock_irqrestore(&dev->av_tbl.lock, flags); in ocrdma_free_av()
3067 static int ocrdma_create_eqs(struct ocrdma_dev *dev) in ocrdma_create_eqs() argument
3073 num_eq = dev->nic_info.msix.num_vectors - in ocrdma_create_eqs()
3074 dev->nic_info.msix.start_vector; in ocrdma_create_eqs()
3075 if (dev->nic_info.intr_mode == BE_INTERRUPT_MODE_INTX) { in ocrdma_create_eqs()
3085 dev->eq_tbl = kcalloc(num_eq, sizeof(struct ocrdma_eq), GFP_KERNEL); in ocrdma_create_eqs()
3086 if (!dev->eq_tbl) in ocrdma_create_eqs()
3090 status = ocrdma_create_eq(dev, &dev->eq_tbl[i], in ocrdma_create_eqs()
3096 sprintf(dev->eq_tbl[i].irq_name, "ocrdma%d-%d", in ocrdma_create_eqs()
3097 dev->id, i); in ocrdma_create_eqs()
3098 irq = ocrdma_get_irq(dev, &dev->eq_tbl[i]); in ocrdma_create_eqs()
3100 dev->eq_tbl[i].irq_name, in ocrdma_create_eqs()
3101 &dev->eq_tbl[i]); in ocrdma_create_eqs()
3104 dev->eq_cnt += 1; in ocrdma_create_eqs()
3109 ocrdma_destroy_eqs(dev); in ocrdma_create_eqs()
3113 static int ocrdma_mbx_modify_eqd(struct ocrdma_dev *dev, struct ocrdma_eq *eq, in ocrdma_mbx_modify_eqd() argument
3128 cmd->cmd.set_eqd[i].eq_id = eq[i].q.id; in ocrdma_mbx_modify_eqd()
3133 status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd); in ocrdma_mbx_modify_eqd()
3139 static int ocrdma_modify_eqd(struct ocrdma_dev *dev, struct ocrdma_eq *eq, in ocrdma_modify_eqd() argument
3146 ocrdma_mbx_modify_eqd(dev, &eq[i], num_eqs); in ocrdma_modify_eqd()
3151 ocrdma_mbx_modify_eqd(dev, eq, num); in ocrdma_modify_eqd()
3158 struct ocrdma_dev *dev = in ocrdma_eqd_set_task() local
3164 for (i = 0; i < dev->eq_cnt; i++) { in ocrdma_eqd_set_task()
3165 eq = &dev->eq_tbl[i]; in ocrdma_eqd_set_task()
3183 ocrdma_modify_eqd(dev, &dev->eq_tbl[0], num); in ocrdma_eqd_set_task()
3184 schedule_delayed_work(&dev->eqd_work, msecs_to_jiffies(1000)); in ocrdma_eqd_set_task()
3187 int ocrdma_init_hw(struct ocrdma_dev *dev) in ocrdma_init_hw() argument
3192 status = ocrdma_create_eqs(dev); in ocrdma_init_hw()
3195 status = ocrdma_create_mq(dev); in ocrdma_init_hw()
3198 status = ocrdma_mbx_query_fw_config(dev); in ocrdma_init_hw()
3201 status = ocrdma_mbx_query_dev(dev); in ocrdma_init_hw()
3204 status = ocrdma_mbx_query_fw_ver(dev); in ocrdma_init_hw()
3207 status = ocrdma_mbx_create_ah_tbl(dev); in ocrdma_init_hw()
3210 status = ocrdma_mbx_get_phy_info(dev); in ocrdma_init_hw()
3213 status = ocrdma_mbx_get_ctrl_attribs(dev); in ocrdma_init_hw()
3220 ocrdma_mbx_delete_ah_tbl(dev); in ocrdma_init_hw()
3222 ocrdma_destroy_mq(dev); in ocrdma_init_hw()
3224 ocrdma_destroy_eqs(dev); in ocrdma_init_hw()
3230 void ocrdma_cleanup_hw(struct ocrdma_dev *dev) in ocrdma_cleanup_hw() argument
3232 ocrdma_free_pd_pool(dev); in ocrdma_cleanup_hw()
3233 ocrdma_mbx_delete_ah_tbl(dev); in ocrdma_cleanup_hw()
3236 ocrdma_destroy_mq(dev); in ocrdma_cleanup_hw()
3239 ocrdma_destroy_eqs(dev); in ocrdma_cleanup_hw()