Lines Matching full:qp

1324 			       struct ionic_qp *qp,  in ionic_create_qp_cmd()  argument
1331 qp->sq_cmb & IONIC_CMB_ENABLE, in ionic_create_qp_cmd()
1332 qp->rq_cmb & IONIC_CMB_ENABLE, in ionic_create_qp_cmd()
1333 qp->sq_spec, qp->rq_spec, in ionic_create_qp_cmd()
1346 .id_ver = cpu_to_le32(qp->qpid), in ionic_create_qp_cmd()
1354 if (qp->has_sq) { in ionic_create_qp_cmd()
1356 wr.wqe.cmd.create_qp.sq_depth_log2 = qp->sq.depth_log2; in ionic_create_qp_cmd()
1357 wr.wqe.cmd.create_qp.sq_stride_log2 = qp->sq.stride_log2; in ionic_create_qp_cmd()
1365 if (qp->has_rq) { in ionic_create_qp_cmd()
1367 wr.wqe.cmd.create_qp.rq_depth_log2 = qp->rq.depth_log2; in ionic_create_qp_cmd()
1368 wr.wqe.cmd.create_qp.rq_stride_log2 = qp->rq.stride_log2; in ionic_create_qp_cmd()
1383 struct ionic_qp *qp, in ionic_modify_qp_cmd() argument
1389 qp->sq_cmb & IONIC_CMB_ENABLE, in ionic_modify_qp_cmd()
1390 qp->rq_cmb & IONIC_CMB_ENABLE, in ionic_modify_qp_cmd()
1391 qp->sq_spec, qp->rq_spec, in ionic_modify_qp_cmd()
1393 pd_remote_privileged(qp->ibqp.pd)); in ionic_modify_qp_cmd()
1414 .id_ver = cpu_to_le32(qp->qpid), in ionic_modify_qp_cmd()
1450 if (qp->ibqp.qp_type == IB_QPT_RC || qp->ibqp.qp_type == IB_QPT_UC) in ionic_modify_qp_cmd()
1457 if (!qp->hdr) in ionic_modify_qp_cmd()
1461 qp->qpid, in ionic_modify_qp_cmd()
1464 rc = ionic_build_hdr(dev, qp->hdr, &attr->ah_attr, sport, true); in ionic_modify_qp_cmd()
1468 qp->sgid_index = grh->sgid_index; in ionic_modify_qp_cmd()
1474 hdr_len = ib_ud_header_pack(qp->hdr, hdr_buf); in ionic_modify_qp_cmd()
1488 if (qp->hdr->ipv4_present) { in ionic_modify_qp_cmd()
1490 qp->hdr->vlan_present ? in ionic_modify_qp_cmd()
1495 qp->hdr->vlan_present ? in ionic_modify_qp_cmd()
1501 cpu_to_le32(qp->ahid | (hdr_len << 24)); in ionic_modify_qp_cmd()
1523 struct ionic_qp *qp, in ionic_query_qp_cmd() argument
1533 .id_ver = cpu_to_le32(qp->qpid), in ionic_query_qp_cmd()
1548 if (qp->has_sq) { in ionic_query_qp_cmd()
1549 bool expdb = !!(qp->sq_cmb & IONIC_CMB_EXPDB); in ionic_query_qp_cmd()
1552 ionic_v1_send_wqe_max_sge(qp->sq.stride_log2, in ionic_query_qp_cmd()
1553 qp->sq_spec, in ionic_query_qp_cmd()
1556 ionic_v1_send_wqe_max_data(qp->sq.stride_log2, expdb); in ionic_query_qp_cmd()
1559 if (qp->has_rq) { in ionic_query_qp_cmd()
1561 ionic_v1_recv_wqe_max_sge(qp->rq.stride_log2, in ionic_query_qp_cmd()
1562 qp->rq_spec, in ionic_query_qp_cmd()
1563 qp->rq_cmb & IONIC_CMB_EXPDB); in ionic_query_qp_cmd()
1605 wr.wqe.cmd.query_qp.ah_id = cpu_to_le32(qp->ahid); in ionic_query_qp_cmd()
1621 ibdev_dbg(&dev->ibdev, "query qp %u state_pmtu %#x flags %#x", in ionic_query_qp_cmd()
1622 qp->qpid, query_rqbuf->state_pmtu, flags); in ionic_query_qp_cmd()
1650 qp->hdr, qp->sgid_index); in ionic_query_qp_cmd()
1707 struct ionic_qp *qp, in ionic_qp_sq_init_cmb() argument
1715 if (!(qp->sq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_sq_init_cmb()
1718 if (qp->sq_cmb & ~IONIC_CMB_SUPPORTED) { in ionic_qp_sq_init_cmb()
1719 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1722 qp->sq_cmb &= IONIC_CMB_SUPPORTED; in ionic_qp_sq_init_cmb()
1725 if ((qp->sq_cmb & IONIC_CMB_EXPDB) && !dev->lif_cfg.sq_expdb) { in ionic_qp_sq_init_cmb()
1726 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1729 qp->sq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_sq_init_cmb()
1732 qp->sq_cmb_order = order_base_2(qp->sq.size / PAGE_SIZE); in ionic_qp_sq_init_cmb()
1734 if (qp->sq_cmb_order >= IONIC_SQCMB_ORDER) in ionic_qp_sq_init_cmb()
1737 if (qp->sq_cmb & IONIC_CMB_EXPDB) in ionic_qp_sq_init_cmb()
1738 expdb_stride_log2 = qp->sq.stride_log2; in ionic_qp_sq_init_cmb()
1740 rc = ionic_get_cmb(dev->lif_cfg.lif, &qp->sq_cmb_pgid, in ionic_qp_sq_init_cmb()
1741 &qp->sq_cmb_addr, qp->sq_cmb_order, in ionic_qp_sq_init_cmb()
1746 if ((qp->sq_cmb & IONIC_CMB_EXPDB) && !expdb) { in ionic_qp_sq_init_cmb()
1747 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1750 qp->sq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_sq_init_cmb()
1756 ionic_put_cmb(dev->lif_cfg.lif, qp->sq_cmb_pgid, qp->sq_cmb_order); in ionic_qp_sq_init_cmb()
1758 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1761 qp->sq_cmb = 0; in ionic_qp_sq_init_cmb()
1762 qp->sq_cmb_order = IONIC_RES_INVALID; in ionic_qp_sq_init_cmb()
1763 qp->sq_cmb_pgid = 0; in ionic_qp_sq_init_cmb()
1764 qp->sq_cmb_addr = 0; in ionic_qp_sq_init_cmb()
1769 struct ionic_qp *qp) in ionic_qp_sq_destroy_cmb() argument
1771 if (!(qp->sq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_sq_destroy_cmb()
1775 rdma_user_mmap_entry_remove(qp->mmap_sq_cmb); in ionic_qp_sq_destroy_cmb()
1777 ionic_put_cmb(dev->lif_cfg.lif, qp->sq_cmb_pgid, qp->sq_cmb_order); in ionic_qp_sq_destroy_cmb()
1781 struct ionic_qp *qp, struct ionic_qdesc *sq, in ionic_qp_sq_init() argument
1788 qp->sq_msn_prod = 0; in ionic_qp_sq_init()
1789 qp->sq_msn_cons = 0; in ionic_qp_sq_init()
1791 if (!qp->has_sq) { in ionic_qp_sq_init()
1812 qp->sq_cmb & in ionic_qp_sq_init()
1821 qp->sq_cmb & IONIC_CMB_EXPDB)) in ionic_qp_sq_init()
1829 qp->sq_spec = sq_spec; in ionic_qp_sq_init()
1831 qp->sq.ptr = NULL; in ionic_qp_sq_init()
1832 qp->sq.size = sq->size; in ionic_qp_sq_init()
1833 qp->sq.mask = sq->mask; in ionic_qp_sq_init()
1834 qp->sq.depth_log2 = sq->depth_log2; in ionic_qp_sq_init()
1835 qp->sq.stride_log2 = sq->stride_log2; in ionic_qp_sq_init()
1837 qp->sq_meta = NULL; in ionic_qp_sq_init()
1838 qp->sq_msn_idx = NULL; in ionic_qp_sq_init()
1840 qp->sq_umem = ib_umem_get(&dev->ibdev, sq->addr, sq->size, 0); in ionic_qp_sq_init()
1841 if (IS_ERR(qp->sq_umem)) in ionic_qp_sq_init()
1842 return PTR_ERR(qp->sq_umem); in ionic_qp_sq_init()
1844 qp->sq_umem = NULL; in ionic_qp_sq_init()
1846 qp->sq_spec = ionic_v1_use_spec_sge(max_sge, sq_spec); in ionic_qp_sq_init()
1847 if (sq_spec && !qp->sq_spec) in ionic_qp_sq_init()
1852 if (qp->sq_cmb & IONIC_CMB_EXPDB) { in ionic_qp_sq_init()
1854 qp->sq_spec, in ionic_qp_sq_init()
1858 qp->sq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_sq_init()
1861 if (!(qp->sq_cmb & IONIC_CMB_EXPDB)) in ionic_qp_sq_init()
1863 qp->sq_spec, in ionic_qp_sq_init()
1866 rc = ionic_queue_init(&qp->sq, dev->lif_cfg.hwdev, in ionic_qp_sq_init()
1871 ionic_queue_dbell_init(&qp->sq, qp->qpid); in ionic_qp_sq_init()
1873 qp->sq_meta = kmalloc_objs(*qp->sq_meta, (u32)qp->sq.mask + 1); in ionic_qp_sq_init()
1874 if (!qp->sq_meta) { in ionic_qp_sq_init()
1879 qp->sq_msn_idx = kmalloc_array((u32)qp->sq.mask + 1, in ionic_qp_sq_init()
1880 sizeof(*qp->sq_msn_idx), in ionic_qp_sq_init()
1882 if (!qp->sq_msn_idx) { in ionic_qp_sq_init()
1888 ionic_qp_sq_init_cmb(dev, qp, udata, max_data); in ionic_qp_sq_init()
1890 if (qp->sq_cmb & IONIC_CMB_ENABLE) in ionic_qp_sq_init()
1892 (u64)qp->sq_cmb_pgid << PAGE_SHIFT, in ionic_qp_sq_init()
1896 qp->sq_umem, qp->sq.dma, 1, PAGE_SIZE); in ionic_qp_sq_init()
1903 ionic_qp_sq_destroy_cmb(dev, ctx, qp); in ionic_qp_sq_init()
1904 kfree(qp->sq_msn_idx); in ionic_qp_sq_init()
1906 kfree(qp->sq_meta); in ionic_qp_sq_init()
1908 if (qp->sq_umem) in ionic_qp_sq_init()
1909 ib_umem_release(qp->sq_umem); in ionic_qp_sq_init()
1911 ionic_queue_destroy(&qp->sq, dev->lif_cfg.hwdev); in ionic_qp_sq_init()
1917 struct ionic_qp *qp) in ionic_qp_sq_destroy() argument
1919 if (!qp->has_sq) in ionic_qp_sq_destroy()
1922 ionic_qp_sq_destroy_cmb(dev, ctx, qp); in ionic_qp_sq_destroy()
1924 kfree(qp->sq_msn_idx); in ionic_qp_sq_destroy()
1925 kfree(qp->sq_meta); in ionic_qp_sq_destroy()
1927 if (qp->sq_umem) in ionic_qp_sq_destroy()
1928 ib_umem_release(qp->sq_umem); in ionic_qp_sq_destroy()
1930 ionic_queue_destroy(&qp->sq, dev->lif_cfg.hwdev); in ionic_qp_sq_destroy()
1934 struct ionic_qp *qp, in ionic_qp_rq_init_cmb() argument
1941 if (!(qp->rq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_rq_init_cmb()
1944 if (qp->rq_cmb & ~IONIC_CMB_SUPPORTED) { in ionic_qp_rq_init_cmb()
1945 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1948 qp->rq_cmb &= IONIC_CMB_SUPPORTED; in ionic_qp_rq_init_cmb()
1951 if ((qp->rq_cmb & IONIC_CMB_EXPDB) && !dev->lif_cfg.rq_expdb) { in ionic_qp_rq_init_cmb()
1952 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1955 qp->rq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_rq_init_cmb()
1958 qp->rq_cmb_order = order_base_2(qp->rq.size / PAGE_SIZE); in ionic_qp_rq_init_cmb()
1960 if (qp->rq_cmb_order >= IONIC_RQCMB_ORDER) in ionic_qp_rq_init_cmb()
1963 if (qp->rq_cmb & IONIC_CMB_EXPDB) in ionic_qp_rq_init_cmb()
1964 expdb_stride_log2 = qp->rq.stride_log2; in ionic_qp_rq_init_cmb()
1966 rc = ionic_get_cmb(dev->lif_cfg.lif, &qp->rq_cmb_pgid, in ionic_qp_rq_init_cmb()
1967 &qp->rq_cmb_addr, qp->rq_cmb_order, in ionic_qp_rq_init_cmb()
1972 if ((qp->rq_cmb & IONIC_CMB_EXPDB) && !expdb) { in ionic_qp_rq_init_cmb()
1973 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1976 qp->rq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_rq_init_cmb()
1982 ionic_put_cmb(dev->lif_cfg.lif, qp->rq_cmb_pgid, qp->rq_cmb_order); in ionic_qp_rq_init_cmb()
1984 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1987 qp->rq_cmb = 0; in ionic_qp_rq_init_cmb()
1988 qp->rq_cmb_order = IONIC_RES_INVALID; in ionic_qp_rq_init_cmb()
1989 qp->rq_cmb_pgid = 0; in ionic_qp_rq_init_cmb()
1990 qp->rq_cmb_addr = 0; in ionic_qp_rq_init_cmb()
1995 struct ionic_qp *qp) in ionic_qp_rq_destroy_cmb() argument
1997 if (!(qp->rq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_rq_destroy_cmb()
2001 rdma_user_mmap_entry_remove(qp->mmap_rq_cmb); in ionic_qp_rq_destroy_cmb()
2003 ionic_put_cmb(dev->lif_cfg.lif, qp->rq_cmb_pgid, qp->rq_cmb_order); in ionic_qp_rq_destroy_cmb()
2007 struct ionic_qp *qp, struct ionic_qdesc *rq, in ionic_qp_rq_init() argument
2014 if (!qp->has_rq) { in ionic_qp_rq_init()
2043 qp->rq_spec = rq_spec; in ionic_qp_rq_init()
2045 qp->rq.ptr = NULL; in ionic_qp_rq_init()
2046 qp->rq.size = rq->size; in ionic_qp_rq_init()
2047 qp->rq.mask = rq->mask; in ionic_qp_rq_init()
2048 qp->rq.depth_log2 = rq->depth_log2; in ionic_qp_rq_init()
2049 qp->rq.stride_log2 = rq->stride_log2; in ionic_qp_rq_init()
2051 qp->rq_meta = NULL; in ionic_qp_rq_init()
2053 qp->rq_umem = ib_umem_get(&dev->ibdev, rq->addr, rq->size, 0); in ionic_qp_rq_init()
2054 if (IS_ERR(qp->rq_umem)) in ionic_qp_rq_init()
2055 return PTR_ERR(qp->rq_umem); in ionic_qp_rq_init()
2057 qp->rq_umem = NULL; in ionic_qp_rq_init()
2059 qp->rq_spec = ionic_v1_use_spec_sge(max_sge, rq_spec); in ionic_qp_rq_init()
2060 if (rq_spec && !qp->rq_spec) in ionic_qp_rq_init()
2065 if (qp->rq_cmb & IONIC_CMB_EXPDB) { in ionic_qp_rq_init()
2067 qp->rq_spec, in ionic_qp_rq_init()
2071 qp->rq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_rq_init()
2074 if (!(qp->rq_cmb & IONIC_CMB_EXPDB)) in ionic_qp_rq_init()
2076 qp->rq_spec, in ionic_qp_rq_init()
2079 rc = ionic_queue_init(&qp->rq, dev->lif_cfg.hwdev, in ionic_qp_rq_init()
2084 ionic_queue_dbell_init(&qp->rq, qp->qpid); in ionic_qp_rq_init()
2086 qp->rq_meta = kmalloc_objs(*qp->rq_meta, (u32)qp->rq.mask + 1); in ionic_qp_rq_init()
2087 if (!qp->rq_meta) { in ionic_qp_rq_init()
2092 for (i = 0; i < qp->rq.mask; ++i) in ionic_qp_rq_init()
2093 qp->rq_meta[i].next = &qp->rq_meta[i + 1]; in ionic_qp_rq_init()
2094 qp->rq_meta[i].next = IONIC_META_LAST; in ionic_qp_rq_init()
2095 qp->rq_meta_head = &qp->rq_meta[0]; in ionic_qp_rq_init()
2098 ionic_qp_rq_init_cmb(dev, qp, udata); in ionic_qp_rq_init()
2100 if (qp->rq_cmb & IONIC_CMB_ENABLE) in ionic_qp_rq_init()
2102 (u64)qp->rq_cmb_pgid << PAGE_SHIFT, in ionic_qp_rq_init()
2106 qp->rq_umem, qp->rq.dma, 1, PAGE_SIZE); in ionic_qp_rq_init()
2113 ionic_qp_rq_destroy_cmb(dev, ctx, qp); in ionic_qp_rq_init()
2114 kfree(qp->rq_meta); in ionic_qp_rq_init()
2116 if (qp->rq_umem) in ionic_qp_rq_init()
2117 ib_umem_release(qp->rq_umem); in ionic_qp_rq_init()
2119 ionic_queue_destroy(&qp->rq, dev->lif_cfg.hwdev); in ionic_qp_rq_init()
2125 struct ionic_qp *qp) in ionic_qp_rq_destroy() argument
2127 if (!qp->has_rq) in ionic_qp_rq_destroy()
2130 ionic_qp_rq_destroy_cmb(dev, ctx, qp); in ionic_qp_rq_destroy()
2132 kfree(qp->rq_meta); in ionic_qp_rq_destroy()
2134 if (qp->rq_umem) in ionic_qp_rq_destroy()
2135 ib_umem_release(qp->rq_umem); in ionic_qp_rq_destroy()
2137 ionic_queue_destroy(&qp->rq, dev->lif_cfg.hwdev); in ionic_qp_rq_destroy()
2146 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_create_qp() local
2168 qp->state = IB_QPS_RESET; in ionic_create_qp()
2170 INIT_LIST_HEAD(&qp->cq_poll_sq); in ionic_create_qp()
2171 INIT_LIST_HEAD(&qp->cq_flush_sq); in ionic_create_qp()
2172 INIT_LIST_HEAD(&qp->cq_flush_rq); in ionic_create_qp()
2174 spin_lock_init(&qp->sq_lock); in ionic_create_qp()
2175 spin_lock_init(&qp->rq_lock); in ionic_create_qp()
2177 qp->has_sq = 1; in ionic_create_qp()
2178 qp->has_rq = 1; in ionic_create_qp()
2181 rc = ionic_get_gsi_qpid(dev, &qp->qpid); in ionic_create_qp()
2185 if (qp->has_sq) in ionic_create_qp()
2188 if (qp->has_rq) in ionic_create_qp()
2197 rc = ionic_get_qpid(dev, &qp->qpid, &qp->udma_idx, udma_mask); in ionic_create_qp()
2202 qp->sig_all = attr->sq_sig_type == IB_SIGNAL_ALL_WR; in ionic_create_qp()
2203 qp->has_ah = attr->qp_type == IB_QPT_RC; in ionic_create_qp()
2205 if (qp->has_ah) { in ionic_create_qp()
2206 qp->hdr = kzalloc_obj(*qp->hdr); in ionic_create_qp()
2207 if (!qp->hdr) { in ionic_create_qp()
2212 rc = ionic_get_ahid(dev, &qp->ahid); in ionic_create_qp()
2219 qp->rq_cmb = req.rq_cmb; in ionic_create_qp()
2222 qp->sq_cmb = req.sq_cmb; in ionic_create_qp()
2225 rc = ionic_qp_sq_init(dev, ctx, qp, &req.sq, &sq_buf, in ionic_create_qp()
2231 rc = ionic_qp_rq_init(dev, ctx, qp, &req.rq, &rq_buf, in ionic_create_qp()
2238 to_ionic_vcq_cq(attr->send_cq, qp->udma_idx), in ionic_create_qp()
2239 to_ionic_vcq_cq(attr->recv_cq, qp->udma_idx), in ionic_create_qp()
2240 qp, &sq_buf, &rq_buf, attr); in ionic_create_qp()
2245 resp.qpid = qp->qpid; in ionic_create_qp()
2246 resp.udma_idx = qp->udma_idx; in ionic_create_qp()
2248 if (qp->sq_cmb & IONIC_CMB_ENABLE) { in ionic_create_qp()
2251 if ((qp->sq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) == in ionic_create_qp()
2255 qp->sq_cmb &= ~(IONIC_CMB_WC | IONIC_CMB_UC); in ionic_create_qp()
2258 wc = (qp->sq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) in ionic_create_qp()
2263 qp->sq_cmb |= IONIC_CMB_WC; in ionic_create_qp()
2265 qp->sq_cmb |= IONIC_CMB_UC; in ionic_create_qp()
2267 qp->mmap_sq_cmb = in ionic_create_qp()
2269 qp->sq.size, in ionic_create_qp()
2270 PHYS_PFN(qp->sq_cmb_addr), in ionic_create_qp()
2273 if (!qp->mmap_sq_cmb) { in ionic_create_qp()
2278 resp.sq_cmb = qp->sq_cmb; in ionic_create_qp()
2281 if (qp->rq_cmb & IONIC_CMB_ENABLE) { in ionic_create_qp()
2284 if ((qp->rq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) == in ionic_create_qp()
2288 qp->rq_cmb &= ~(IONIC_CMB_WC | IONIC_CMB_UC); in ionic_create_qp()
2291 if (qp->rq_cmb & IONIC_CMB_EXPDB) in ionic_create_qp()
2292 wc = (qp->rq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) in ionic_create_qp()
2295 wc = (qp->rq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) in ionic_create_qp()
2300 qp->rq_cmb |= IONIC_CMB_WC; in ionic_create_qp()
2302 qp->rq_cmb |= IONIC_CMB_UC; in ionic_create_qp()
2304 qp->mmap_rq_cmb = in ionic_create_qp()
2306 qp->rq.size, in ionic_create_qp()
2307 PHYS_PFN(qp->rq_cmb_addr), in ionic_create_qp()
2310 if (!qp->mmap_rq_cmb) { in ionic_create_qp()
2315 resp.rq_cmb = qp->rq_cmb; in ionic_create_qp()
2326 qp->ibqp.qp_num = qp->qpid; in ionic_create_qp()
2328 init_completion(&qp->qp_rel_comp); in ionic_create_qp()
2329 kref_init(&qp->qp_kref); in ionic_create_qp()
2331 entry = xa_store_irq(&dev->qp_tbl, qp->qpid, qp, GFP_KERNEL); in ionic_create_qp()
2341 if (qp->has_sq) { in ionic_create_qp()
2342 cq = to_ionic_vcq_cq(attr->send_cq, qp->udma_idx); in ionic_create_qp()
2344 attr->cap.max_send_wr = qp->sq.mask; in ionic_create_qp()
2346 ionic_v1_send_wqe_max_sge(qp->sq.stride_log2, in ionic_create_qp()
2347 qp->sq_spec, in ionic_create_qp()
2348 qp->sq_cmb & IONIC_CMB_EXPDB); in ionic_create_qp()
2350 ionic_v1_send_wqe_max_data(qp->sq.stride_log2, in ionic_create_qp()
2351 qp->sq_cmb & in ionic_create_qp()
2353 qp->sq_cqid = cq->cqid; in ionic_create_qp()
2356 if (qp->has_rq) { in ionic_create_qp()
2357 cq = to_ionic_vcq_cq(attr->recv_cq, qp->udma_idx); in ionic_create_qp()
2359 attr->cap.max_recv_wr = qp->rq.mask; in ionic_create_qp()
2361 ionic_v1_recv_wqe_max_sge(qp->rq.stride_log2, in ionic_create_qp()
2362 qp->rq_spec, in ionic_create_qp()
2363 qp->rq_cmb & IONIC_CMB_EXPDB); in ionic_create_qp()
2364 qp->rq_cqid = cq->cqid; in ionic_create_qp()
2370 if (udata && (qp->rq_cmb & IONIC_CMB_ENABLE)) in ionic_create_qp()
2371 rdma_user_mmap_entry_remove(qp->mmap_rq_cmb); in ionic_create_qp()
2373 if (udata && (qp->sq_cmb & IONIC_CMB_ENABLE)) in ionic_create_qp()
2374 rdma_user_mmap_entry_remove(qp->mmap_sq_cmb); in ionic_create_qp()
2376 ionic_destroy_qp_cmd(dev, qp->qpid); in ionic_create_qp()
2379 ionic_qp_rq_destroy(dev, ctx, qp); in ionic_create_qp()
2382 ionic_qp_sq_destroy(dev, ctx, qp); in ionic_create_qp()
2384 if (qp->has_ah) in ionic_create_qp()
2385 ionic_put_ahid(dev, qp->ahid); in ionic_create_qp()
2387 kfree(qp->hdr); in ionic_create_qp()
2389 ionic_put_qpid(dev, qp->qpid); in ionic_create_qp()
2400 static void ionic_notify_qp_cqs(struct ionic_ibdev *dev, struct ionic_qp *qp) in ionic_notify_qp_cqs() argument
2402 if (qp->ibqp.send_cq) in ionic_notify_qp_cqs()
2403 ionic_notify_flush_cq(to_ionic_vcq_cq(qp->ibqp.send_cq, in ionic_notify_qp_cqs()
2404 qp->udma_idx)); in ionic_notify_qp_cqs()
2405 if (qp->ibqp.recv_cq && qp->ibqp.recv_cq != qp->ibqp.send_cq) in ionic_notify_qp_cqs()
2406 ionic_notify_flush_cq(to_ionic_vcq_cq(qp->ibqp.recv_cq, in ionic_notify_qp_cqs()
2407 qp->udma_idx)); in ionic_notify_qp_cqs()
2410 void ionic_flush_qp(struct ionic_ibdev *dev, struct ionic_qp *qp) in ionic_flush_qp() argument
2415 if (qp->ibqp.send_cq) { in ionic_flush_qp()
2416 cq = to_ionic_vcq_cq(qp->ibqp.send_cq, qp->udma_idx); in ionic_flush_qp()
2418 /* Hold the CQ lock and QP sq_lock to set up flush */ in ionic_flush_qp()
2420 spin_lock(&qp->sq_lock); in ionic_flush_qp()
2421 qp->sq_flush = true; in ionic_flush_qp()
2422 if (!ionic_queue_empty(&qp->sq)) { in ionic_flush_qp()
2424 list_move_tail(&qp->cq_flush_sq, &cq->flush_sq); in ionic_flush_qp()
2426 spin_unlock(&qp->sq_lock); in ionic_flush_qp()
2430 if (qp->ibqp.recv_cq) { in ionic_flush_qp()
2431 cq = to_ionic_vcq_cq(qp->ibqp.recv_cq, qp->udma_idx); in ionic_flush_qp()
2433 /* Hold the CQ lock and QP rq_lock to set up flush */ in ionic_flush_qp()
2435 spin_lock(&qp->rq_lock); in ionic_flush_qp()
2436 qp->rq_flush = true; in ionic_flush_qp()
2437 if (!ionic_queue_empty(&qp->rq)) { in ionic_flush_qp()
2439 list_move_tail(&qp->cq_flush_rq, &cq->flush_rq); in ionic_flush_qp()
2441 spin_unlock(&qp->rq_lock); in ionic_flush_qp()
2473 static void ionic_reset_qp(struct ionic_ibdev *dev, struct ionic_qp *qp) in ionic_reset_qp() argument
2481 if (qp->ibqp.send_cq) { in ionic_reset_qp()
2482 cq = to_ionic_vcq_cq(qp->ibqp.send_cq, qp->udma_idx); in ionic_reset_qp()
2484 ionic_clean_cq(cq, qp->qpid); in ionic_reset_qp()
2488 if (qp->ibqp.recv_cq) { in ionic_reset_qp()
2489 cq = to_ionic_vcq_cq(qp->ibqp.recv_cq, qp->udma_idx); in ionic_reset_qp()
2491 ionic_clean_cq(cq, qp->qpid); in ionic_reset_qp()
2495 if (qp->has_sq) { in ionic_reset_qp()
2496 spin_lock(&qp->sq_lock); in ionic_reset_qp()
2497 qp->sq_flush = false; in ionic_reset_qp()
2498 qp->sq_flush_rcvd = false; in ionic_reset_qp()
2499 qp->sq_msn_prod = 0; in ionic_reset_qp()
2500 qp->sq_msn_cons = 0; in ionic_reset_qp()
2501 qp->sq.prod = 0; in ionic_reset_qp()
2502 qp->sq.cons = 0; in ionic_reset_qp()
2503 spin_unlock(&qp->sq_lock); in ionic_reset_qp()
2506 if (qp->has_rq) { in ionic_reset_qp()
2507 spin_lock(&qp->rq_lock); in ionic_reset_qp()
2508 qp->rq_flush = false; in ionic_reset_qp()
2509 qp->rq.prod = 0; in ionic_reset_qp()
2510 qp->rq.cons = 0; in ionic_reset_qp()
2511 if (qp->rq_meta) { in ionic_reset_qp()
2512 for (i = 0; i < qp->rq.mask; ++i) in ionic_reset_qp()
2513 qp->rq_meta[i].next = &qp->rq_meta[i + 1]; in ionic_reset_qp()
2514 qp->rq_meta[i].next = IONIC_META_LAST; in ionic_reset_qp()
2516 qp->rq_meta_head = &qp->rq_meta[0]; in ionic_reset_qp()
2517 spin_unlock(&qp->rq_lock); in ionic_reset_qp()
2538 static int ionic_check_modify_qp(struct ionic_qp *qp, struct ib_qp_attr *attr, in ionic_check_modify_qp() argument
2542 attr->cur_qp_state : qp->state; in ionic_check_modify_qp()
2547 !ionic_qp_cur_state_is_ok(qp->state, attr->cur_qp_state)) in ionic_check_modify_qp()
2550 if (!ib_modify_qp_is_ok(cur_state, next_state, qp->ibqp.qp_type, mask)) in ionic_check_modify_qp()
2553 /* unprivileged qp not allowed privileged qkey */ in ionic_check_modify_qp()
2555 qp->ibqp.uobject) in ionic_check_modify_qp()
2566 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_modify_qp() local
2569 rc = ionic_check_modify_qp(qp, attr, mask); in ionic_modify_qp()
2576 rc = ionic_modify_qp_cmd(dev, pd, qp, attr, mask); in ionic_modify_qp()
2581 qp->state = attr->qp_state; in ionic_modify_qp()
2584 ionic_flush_qp(dev, qp); in ionic_modify_qp()
2585 ionic_notify_qp_cqs(dev, qp); in ionic_modify_qp()
2587 ionic_reset_qp(dev, qp); in ionic_modify_qp()
2598 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_query_qp() local
2604 rc = ionic_query_qp_cmd(dev, qp, attr, mask); in ionic_query_qp()
2608 if (qp->has_sq) in ionic_query_qp()
2609 attr->cap.max_send_wr = qp->sq.mask; in ionic_query_qp()
2611 if (qp->has_rq) in ionic_query_qp()
2612 attr->cap.max_recv_wr = qp->rq.mask; in ionic_query_qp()
2621 init_attr->sq_sig_type = qp->sig_all ? in ionic_query_qp()
2637 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_destroy_qp() local
2642 rc = ionic_destroy_qp_cmd(dev, qp->qpid); in ionic_destroy_qp()
2646 xa_erase_irq(&dev->qp_tbl, qp->qpid); in ionic_destroy_qp()
2648 kref_put(&qp->qp_kref, ionic_qp_complete); in ionic_destroy_qp()
2649 wait_for_completion(&qp->qp_rel_comp); in ionic_destroy_qp()
2651 if (qp->ibqp.send_cq) { in ionic_destroy_qp()
2652 cq = to_ionic_vcq_cq(qp->ibqp.send_cq, qp->udma_idx); in ionic_destroy_qp()
2654 ionic_clean_cq(cq, qp->qpid); in ionic_destroy_qp()
2655 list_del(&qp->cq_poll_sq); in ionic_destroy_qp()
2656 list_del(&qp->cq_flush_sq); in ionic_destroy_qp()
2660 if (qp->ibqp.recv_cq) { in ionic_destroy_qp()
2661 cq = to_ionic_vcq_cq(qp->ibqp.recv_cq, qp->udma_idx); in ionic_destroy_qp()
2663 ionic_clean_cq(cq, qp->qpid); in ionic_destroy_qp()
2664 list_del(&qp->cq_flush_rq); in ionic_destroy_qp()
2668 ionic_qp_rq_destroy(dev, ctx, qp); in ionic_destroy_qp()
2669 ionic_qp_sq_destroy(dev, ctx, qp); in ionic_destroy_qp()
2670 if (qp->has_ah) { in ionic_destroy_qp()
2671 ionic_put_ahid(dev, qp->ahid); in ionic_destroy_qp()
2672 kfree(qp->hdr); in ionic_destroy_qp()
2674 ionic_put_qpid(dev, qp->qpid); in ionic_destroy_qp()