Lines Matching refs:qp

1322 			       struct ionic_qp *qp,  in ionic_create_qp_cmd()  argument
1329 qp->sq_cmb & IONIC_CMB_ENABLE, in ionic_create_qp_cmd()
1330 qp->rq_cmb & IONIC_CMB_ENABLE, in ionic_create_qp_cmd()
1331 qp->sq_spec, qp->rq_spec, in ionic_create_qp_cmd()
1344 .id_ver = cpu_to_le32(qp->qpid), in ionic_create_qp_cmd()
1352 if (qp->has_sq) { in ionic_create_qp_cmd()
1354 wr.wqe.cmd.create_qp.sq_depth_log2 = qp->sq.depth_log2; in ionic_create_qp_cmd()
1355 wr.wqe.cmd.create_qp.sq_stride_log2 = qp->sq.stride_log2; in ionic_create_qp_cmd()
1363 if (qp->has_rq) { in ionic_create_qp_cmd()
1365 wr.wqe.cmd.create_qp.rq_depth_log2 = qp->rq.depth_log2; in ionic_create_qp_cmd()
1366 wr.wqe.cmd.create_qp.rq_stride_log2 = qp->rq.stride_log2; in ionic_create_qp_cmd()
1381 struct ionic_qp *qp, in ionic_modify_qp_cmd() argument
1387 qp->sq_cmb & IONIC_CMB_ENABLE, in ionic_modify_qp_cmd()
1388 qp->rq_cmb & IONIC_CMB_ENABLE, in ionic_modify_qp_cmd()
1389 qp->sq_spec, qp->rq_spec, in ionic_modify_qp_cmd()
1391 pd_remote_privileged(qp->ibqp.pd)); in ionic_modify_qp_cmd()
1412 .id_ver = cpu_to_le32(qp->qpid), in ionic_modify_qp_cmd()
1448 if (qp->ibqp.qp_type == IB_QPT_RC || qp->ibqp.qp_type == IB_QPT_UC) in ionic_modify_qp_cmd()
1455 if (!qp->hdr) in ionic_modify_qp_cmd()
1459 qp->qpid, in ionic_modify_qp_cmd()
1462 rc = ionic_build_hdr(dev, qp->hdr, &attr->ah_attr, sport, true); in ionic_modify_qp_cmd()
1466 qp->sgid_index = grh->sgid_index; in ionic_modify_qp_cmd()
1472 hdr_len = ib_ud_header_pack(qp->hdr, hdr_buf); in ionic_modify_qp_cmd()
1486 if (qp->hdr->ipv4_present) { in ionic_modify_qp_cmd()
1488 qp->hdr->vlan_present ? in ionic_modify_qp_cmd()
1493 qp->hdr->vlan_present ? in ionic_modify_qp_cmd()
1499 cpu_to_le32(qp->ahid | (hdr_len << 24)); in ionic_modify_qp_cmd()
1521 struct ionic_qp *qp, in ionic_query_qp_cmd() argument
1531 .id_ver = cpu_to_le32(qp->qpid), in ionic_query_qp_cmd()
1546 if (qp->has_sq) { in ionic_query_qp_cmd()
1547 bool expdb = !!(qp->sq_cmb & IONIC_CMB_EXPDB); in ionic_query_qp_cmd()
1550 ionic_v1_send_wqe_max_sge(qp->sq.stride_log2, in ionic_query_qp_cmd()
1551 qp->sq_spec, in ionic_query_qp_cmd()
1554 ionic_v1_send_wqe_max_data(qp->sq.stride_log2, expdb); in ionic_query_qp_cmd()
1557 if (qp->has_rq) { in ionic_query_qp_cmd()
1559 ionic_v1_recv_wqe_max_sge(qp->rq.stride_log2, in ionic_query_qp_cmd()
1560 qp->rq_spec, in ionic_query_qp_cmd()
1561 qp->rq_cmb & IONIC_CMB_EXPDB); in ionic_query_qp_cmd()
1603 wr.wqe.cmd.query_qp.ah_id = cpu_to_le32(qp->ahid); in ionic_query_qp_cmd()
1620 qp->qpid, query_rqbuf->state_pmtu, flags); in ionic_query_qp_cmd()
1648 qp->hdr, qp->sgid_index); in ionic_query_qp_cmd()
1705 struct ionic_qp *qp, in ionic_qp_sq_init_cmb() argument
1713 if (!(qp->sq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_sq_init_cmb()
1716 if (qp->sq_cmb & ~IONIC_CMB_SUPPORTED) { in ionic_qp_sq_init_cmb()
1717 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1720 qp->sq_cmb &= IONIC_CMB_SUPPORTED; in ionic_qp_sq_init_cmb()
1723 if ((qp->sq_cmb & IONIC_CMB_EXPDB) && !dev->lif_cfg.sq_expdb) { in ionic_qp_sq_init_cmb()
1724 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1727 qp->sq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_sq_init_cmb()
1730 qp->sq_cmb_order = order_base_2(qp->sq.size / PAGE_SIZE); in ionic_qp_sq_init_cmb()
1732 if (qp->sq_cmb_order >= IONIC_SQCMB_ORDER) in ionic_qp_sq_init_cmb()
1735 if (qp->sq_cmb & IONIC_CMB_EXPDB) in ionic_qp_sq_init_cmb()
1736 expdb_stride_log2 = qp->sq.stride_log2; in ionic_qp_sq_init_cmb()
1738 rc = ionic_get_cmb(dev->lif_cfg.lif, &qp->sq_cmb_pgid, in ionic_qp_sq_init_cmb()
1739 &qp->sq_cmb_addr, qp->sq_cmb_order, in ionic_qp_sq_init_cmb()
1744 if ((qp->sq_cmb & IONIC_CMB_EXPDB) && !expdb) { in ionic_qp_sq_init_cmb()
1745 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1748 qp->sq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_sq_init_cmb()
1754 ionic_put_cmb(dev->lif_cfg.lif, qp->sq_cmb_pgid, qp->sq_cmb_order); in ionic_qp_sq_init_cmb()
1756 if (qp->sq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_sq_init_cmb()
1759 qp->sq_cmb = 0; in ionic_qp_sq_init_cmb()
1760 qp->sq_cmb_order = IONIC_RES_INVALID; in ionic_qp_sq_init_cmb()
1761 qp->sq_cmb_pgid = 0; in ionic_qp_sq_init_cmb()
1762 qp->sq_cmb_addr = 0; in ionic_qp_sq_init_cmb()
1767 struct ionic_qp *qp) in ionic_qp_sq_destroy_cmb() argument
1769 if (!(qp->sq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_sq_destroy_cmb()
1773 rdma_user_mmap_entry_remove(qp->mmap_sq_cmb); in ionic_qp_sq_destroy_cmb()
1775 ionic_put_cmb(dev->lif_cfg.lif, qp->sq_cmb_pgid, qp->sq_cmb_order); in ionic_qp_sq_destroy_cmb()
1779 struct ionic_qp *qp, struct ionic_qdesc *sq, in ionic_qp_sq_init() argument
1786 qp->sq_msn_prod = 0; in ionic_qp_sq_init()
1787 qp->sq_msn_cons = 0; in ionic_qp_sq_init()
1789 if (!qp->has_sq) { in ionic_qp_sq_init()
1810 qp->sq_cmb & in ionic_qp_sq_init()
1819 qp->sq_cmb & IONIC_CMB_EXPDB)) in ionic_qp_sq_init()
1827 qp->sq_spec = sq_spec; in ionic_qp_sq_init()
1829 qp->sq.ptr = NULL; in ionic_qp_sq_init()
1830 qp->sq.size = sq->size; in ionic_qp_sq_init()
1831 qp->sq.mask = sq->mask; in ionic_qp_sq_init()
1832 qp->sq.depth_log2 = sq->depth_log2; in ionic_qp_sq_init()
1833 qp->sq.stride_log2 = sq->stride_log2; in ionic_qp_sq_init()
1835 qp->sq_meta = NULL; in ionic_qp_sq_init()
1836 qp->sq_msn_idx = NULL; in ionic_qp_sq_init()
1838 qp->sq_umem = ib_umem_get(&dev->ibdev, sq->addr, sq->size, 0); in ionic_qp_sq_init()
1839 if (IS_ERR(qp->sq_umem)) in ionic_qp_sq_init()
1840 return PTR_ERR(qp->sq_umem); in ionic_qp_sq_init()
1842 qp->sq_umem = NULL; in ionic_qp_sq_init()
1844 qp->sq_spec = ionic_v1_use_spec_sge(max_sge, sq_spec); in ionic_qp_sq_init()
1845 if (sq_spec && !qp->sq_spec) in ionic_qp_sq_init()
1850 if (qp->sq_cmb & IONIC_CMB_EXPDB) { in ionic_qp_sq_init()
1852 qp->sq_spec, in ionic_qp_sq_init()
1856 qp->sq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_sq_init()
1859 if (!(qp->sq_cmb & IONIC_CMB_EXPDB)) in ionic_qp_sq_init()
1861 qp->sq_spec, in ionic_qp_sq_init()
1864 rc = ionic_queue_init(&qp->sq, dev->lif_cfg.hwdev, in ionic_qp_sq_init()
1869 ionic_queue_dbell_init(&qp->sq, qp->qpid); in ionic_qp_sq_init()
1871 qp->sq_meta = kmalloc_objs(*qp->sq_meta, (u32)qp->sq.mask + 1); in ionic_qp_sq_init()
1872 if (!qp->sq_meta) { in ionic_qp_sq_init()
1877 qp->sq_msn_idx = kmalloc_array((u32)qp->sq.mask + 1, in ionic_qp_sq_init()
1878 sizeof(*qp->sq_msn_idx), in ionic_qp_sq_init()
1880 if (!qp->sq_msn_idx) { in ionic_qp_sq_init()
1886 ionic_qp_sq_init_cmb(dev, qp, udata, max_data); in ionic_qp_sq_init()
1888 if (qp->sq_cmb & IONIC_CMB_ENABLE) in ionic_qp_sq_init()
1890 (u64)qp->sq_cmb_pgid << PAGE_SHIFT, in ionic_qp_sq_init()
1894 qp->sq_umem, qp->sq.dma, 1, PAGE_SIZE); in ionic_qp_sq_init()
1901 ionic_qp_sq_destroy_cmb(dev, ctx, qp); in ionic_qp_sq_init()
1902 kfree(qp->sq_msn_idx); in ionic_qp_sq_init()
1904 kfree(qp->sq_meta); in ionic_qp_sq_init()
1906 if (qp->sq_umem) in ionic_qp_sq_init()
1907 ib_umem_release(qp->sq_umem); in ionic_qp_sq_init()
1909 ionic_queue_destroy(&qp->sq, dev->lif_cfg.hwdev); in ionic_qp_sq_init()
1915 struct ionic_qp *qp) in ionic_qp_sq_destroy() argument
1917 if (!qp->has_sq) in ionic_qp_sq_destroy()
1920 ionic_qp_sq_destroy_cmb(dev, ctx, qp); in ionic_qp_sq_destroy()
1922 kfree(qp->sq_msn_idx); in ionic_qp_sq_destroy()
1923 kfree(qp->sq_meta); in ionic_qp_sq_destroy()
1925 if (qp->sq_umem) in ionic_qp_sq_destroy()
1926 ib_umem_release(qp->sq_umem); in ionic_qp_sq_destroy()
1928 ionic_queue_destroy(&qp->sq, dev->lif_cfg.hwdev); in ionic_qp_sq_destroy()
1932 struct ionic_qp *qp, in ionic_qp_rq_init_cmb() argument
1939 if (!(qp->rq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_rq_init_cmb()
1942 if (qp->rq_cmb & ~IONIC_CMB_SUPPORTED) { in ionic_qp_rq_init_cmb()
1943 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1946 qp->rq_cmb &= IONIC_CMB_SUPPORTED; in ionic_qp_rq_init_cmb()
1949 if ((qp->rq_cmb & IONIC_CMB_EXPDB) && !dev->lif_cfg.rq_expdb) { in ionic_qp_rq_init_cmb()
1950 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1953 qp->rq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_rq_init_cmb()
1956 qp->rq_cmb_order = order_base_2(qp->rq.size / PAGE_SIZE); in ionic_qp_rq_init_cmb()
1958 if (qp->rq_cmb_order >= IONIC_RQCMB_ORDER) in ionic_qp_rq_init_cmb()
1961 if (qp->rq_cmb & IONIC_CMB_EXPDB) in ionic_qp_rq_init_cmb()
1962 expdb_stride_log2 = qp->rq.stride_log2; in ionic_qp_rq_init_cmb()
1964 rc = ionic_get_cmb(dev->lif_cfg.lif, &qp->rq_cmb_pgid, in ionic_qp_rq_init_cmb()
1965 &qp->rq_cmb_addr, qp->rq_cmb_order, in ionic_qp_rq_init_cmb()
1970 if ((qp->rq_cmb & IONIC_CMB_EXPDB) && !expdb) { in ionic_qp_rq_init_cmb()
1971 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1974 qp->rq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_rq_init_cmb()
1980 ionic_put_cmb(dev->lif_cfg.lif, qp->rq_cmb_pgid, qp->rq_cmb_order); in ionic_qp_rq_init_cmb()
1982 if (qp->rq_cmb & IONIC_CMB_REQUIRE) in ionic_qp_rq_init_cmb()
1985 qp->rq_cmb = 0; in ionic_qp_rq_init_cmb()
1986 qp->rq_cmb_order = IONIC_RES_INVALID; in ionic_qp_rq_init_cmb()
1987 qp->rq_cmb_pgid = 0; in ionic_qp_rq_init_cmb()
1988 qp->rq_cmb_addr = 0; in ionic_qp_rq_init_cmb()
1993 struct ionic_qp *qp) in ionic_qp_rq_destroy_cmb() argument
1995 if (!(qp->rq_cmb & IONIC_CMB_ENABLE)) in ionic_qp_rq_destroy_cmb()
1999 rdma_user_mmap_entry_remove(qp->mmap_rq_cmb); in ionic_qp_rq_destroy_cmb()
2001 ionic_put_cmb(dev->lif_cfg.lif, qp->rq_cmb_pgid, qp->rq_cmb_order); in ionic_qp_rq_destroy_cmb()
2005 struct ionic_qp *qp, struct ionic_qdesc *rq, in ionic_qp_rq_init() argument
2012 if (!qp->has_rq) { in ionic_qp_rq_init()
2041 qp->rq_spec = rq_spec; in ionic_qp_rq_init()
2043 qp->rq.ptr = NULL; in ionic_qp_rq_init()
2044 qp->rq.size = rq->size; in ionic_qp_rq_init()
2045 qp->rq.mask = rq->mask; in ionic_qp_rq_init()
2046 qp->rq.depth_log2 = rq->depth_log2; in ionic_qp_rq_init()
2047 qp->rq.stride_log2 = rq->stride_log2; in ionic_qp_rq_init()
2049 qp->rq_meta = NULL; in ionic_qp_rq_init()
2051 qp->rq_umem = ib_umem_get(&dev->ibdev, rq->addr, rq->size, 0); in ionic_qp_rq_init()
2052 if (IS_ERR(qp->rq_umem)) in ionic_qp_rq_init()
2053 return PTR_ERR(qp->rq_umem); in ionic_qp_rq_init()
2055 qp->rq_umem = NULL; in ionic_qp_rq_init()
2057 qp->rq_spec = ionic_v1_use_spec_sge(max_sge, rq_spec); in ionic_qp_rq_init()
2058 if (rq_spec && !qp->rq_spec) in ionic_qp_rq_init()
2063 if (qp->rq_cmb & IONIC_CMB_EXPDB) { in ionic_qp_rq_init()
2065 qp->rq_spec, in ionic_qp_rq_init()
2069 qp->rq_cmb &= ~IONIC_CMB_EXPDB; in ionic_qp_rq_init()
2072 if (!(qp->rq_cmb & IONIC_CMB_EXPDB)) in ionic_qp_rq_init()
2074 qp->rq_spec, in ionic_qp_rq_init()
2077 rc = ionic_queue_init(&qp->rq, dev->lif_cfg.hwdev, in ionic_qp_rq_init()
2082 ionic_queue_dbell_init(&qp->rq, qp->qpid); in ionic_qp_rq_init()
2084 qp->rq_meta = kmalloc_objs(*qp->rq_meta, (u32)qp->rq.mask + 1); in ionic_qp_rq_init()
2085 if (!qp->rq_meta) { in ionic_qp_rq_init()
2090 for (i = 0; i < qp->rq.mask; ++i) in ionic_qp_rq_init()
2091 qp->rq_meta[i].next = &qp->rq_meta[i + 1]; in ionic_qp_rq_init()
2092 qp->rq_meta[i].next = IONIC_META_LAST; in ionic_qp_rq_init()
2093 qp->rq_meta_head = &qp->rq_meta[0]; in ionic_qp_rq_init()
2096 ionic_qp_rq_init_cmb(dev, qp, udata); in ionic_qp_rq_init()
2098 if (qp->rq_cmb & IONIC_CMB_ENABLE) in ionic_qp_rq_init()
2100 (u64)qp->rq_cmb_pgid << PAGE_SHIFT, in ionic_qp_rq_init()
2104 qp->rq_umem, qp->rq.dma, 1, PAGE_SIZE); in ionic_qp_rq_init()
2111 ionic_qp_rq_destroy_cmb(dev, ctx, qp); in ionic_qp_rq_init()
2112 kfree(qp->rq_meta); in ionic_qp_rq_init()
2114 if (qp->rq_umem) in ionic_qp_rq_init()
2115 ib_umem_release(qp->rq_umem); in ionic_qp_rq_init()
2117 ionic_queue_destroy(&qp->rq, dev->lif_cfg.hwdev); in ionic_qp_rq_init()
2123 struct ionic_qp *qp) in ionic_qp_rq_destroy() argument
2125 if (!qp->has_rq) in ionic_qp_rq_destroy()
2128 ionic_qp_rq_destroy_cmb(dev, ctx, qp); in ionic_qp_rq_destroy()
2130 kfree(qp->rq_meta); in ionic_qp_rq_destroy()
2132 if (qp->rq_umem) in ionic_qp_rq_destroy()
2133 ib_umem_release(qp->rq_umem); in ionic_qp_rq_destroy()
2135 ionic_queue_destroy(&qp->rq, dev->lif_cfg.hwdev); in ionic_qp_rq_destroy()
2144 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_create_qp() local
2166 qp->state = IB_QPS_RESET; in ionic_create_qp()
2168 INIT_LIST_HEAD(&qp->cq_poll_sq); in ionic_create_qp()
2169 INIT_LIST_HEAD(&qp->cq_flush_sq); in ionic_create_qp()
2170 INIT_LIST_HEAD(&qp->cq_flush_rq); in ionic_create_qp()
2172 spin_lock_init(&qp->sq_lock); in ionic_create_qp()
2173 spin_lock_init(&qp->rq_lock); in ionic_create_qp()
2175 qp->has_sq = 1; in ionic_create_qp()
2176 qp->has_rq = 1; in ionic_create_qp()
2179 rc = ionic_get_gsi_qpid(dev, &qp->qpid); in ionic_create_qp()
2183 if (qp->has_sq) in ionic_create_qp()
2186 if (qp->has_rq) in ionic_create_qp()
2195 rc = ionic_get_qpid(dev, &qp->qpid, &qp->udma_idx, udma_mask); in ionic_create_qp()
2200 qp->sig_all = attr->sq_sig_type == IB_SIGNAL_ALL_WR; in ionic_create_qp()
2201 qp->has_ah = attr->qp_type == IB_QPT_RC; in ionic_create_qp()
2203 if (qp->has_ah) { in ionic_create_qp()
2204 qp->hdr = kzalloc_obj(*qp->hdr); in ionic_create_qp()
2205 if (!qp->hdr) { in ionic_create_qp()
2210 rc = ionic_get_ahid(dev, &qp->ahid); in ionic_create_qp()
2217 qp->rq_cmb = req.rq_cmb; in ionic_create_qp()
2220 qp->sq_cmb = req.sq_cmb; in ionic_create_qp()
2223 rc = ionic_qp_sq_init(dev, ctx, qp, &req.sq, &sq_buf, in ionic_create_qp()
2229 rc = ionic_qp_rq_init(dev, ctx, qp, &req.rq, &rq_buf, in ionic_create_qp()
2236 to_ionic_vcq_cq(attr->send_cq, qp->udma_idx), in ionic_create_qp()
2237 to_ionic_vcq_cq(attr->recv_cq, qp->udma_idx), in ionic_create_qp()
2238 qp, &sq_buf, &rq_buf, attr); in ionic_create_qp()
2243 resp.qpid = qp->qpid; in ionic_create_qp()
2244 resp.udma_idx = qp->udma_idx; in ionic_create_qp()
2246 if (qp->sq_cmb & IONIC_CMB_ENABLE) { in ionic_create_qp()
2249 if ((qp->sq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) == in ionic_create_qp()
2253 qp->sq_cmb &= ~(IONIC_CMB_WC | IONIC_CMB_UC); in ionic_create_qp()
2256 wc = (qp->sq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) in ionic_create_qp()
2261 qp->sq_cmb |= IONIC_CMB_WC; in ionic_create_qp()
2263 qp->sq_cmb |= IONIC_CMB_UC; in ionic_create_qp()
2265 qp->mmap_sq_cmb = in ionic_create_qp()
2267 qp->sq.size, in ionic_create_qp()
2268 PHYS_PFN(qp->sq_cmb_addr), in ionic_create_qp()
2271 if (!qp->mmap_sq_cmb) { in ionic_create_qp()
2276 resp.sq_cmb = qp->sq_cmb; in ionic_create_qp()
2279 if (qp->rq_cmb & IONIC_CMB_ENABLE) { in ionic_create_qp()
2282 if ((qp->rq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) == in ionic_create_qp()
2286 qp->rq_cmb &= ~(IONIC_CMB_WC | IONIC_CMB_UC); in ionic_create_qp()
2289 if (qp->rq_cmb & IONIC_CMB_EXPDB) in ionic_create_qp()
2290 wc = (qp->rq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) in ionic_create_qp()
2293 wc = (qp->rq_cmb & (IONIC_CMB_WC | IONIC_CMB_UC)) in ionic_create_qp()
2298 qp->rq_cmb |= IONIC_CMB_WC; in ionic_create_qp()
2300 qp->rq_cmb |= IONIC_CMB_UC; in ionic_create_qp()
2302 qp->mmap_rq_cmb = in ionic_create_qp()
2304 qp->rq.size, in ionic_create_qp()
2305 PHYS_PFN(qp->rq_cmb_addr), in ionic_create_qp()
2308 if (!qp->mmap_rq_cmb) { in ionic_create_qp()
2313 resp.rq_cmb = qp->rq_cmb; in ionic_create_qp()
2324 qp->ibqp.qp_num = qp->qpid; in ionic_create_qp()
2326 init_completion(&qp->qp_rel_comp); in ionic_create_qp()
2327 kref_init(&qp->qp_kref); in ionic_create_qp()
2329 entry = xa_store_irq(&dev->qp_tbl, qp->qpid, qp, GFP_KERNEL); in ionic_create_qp()
2339 if (qp->has_sq) { in ionic_create_qp()
2340 cq = to_ionic_vcq_cq(attr->send_cq, qp->udma_idx); in ionic_create_qp()
2342 attr->cap.max_send_wr = qp->sq.mask; in ionic_create_qp()
2344 ionic_v1_send_wqe_max_sge(qp->sq.stride_log2, in ionic_create_qp()
2345 qp->sq_spec, in ionic_create_qp()
2346 qp->sq_cmb & IONIC_CMB_EXPDB); in ionic_create_qp()
2348 ionic_v1_send_wqe_max_data(qp->sq.stride_log2, in ionic_create_qp()
2349 qp->sq_cmb & in ionic_create_qp()
2351 qp->sq_cqid = cq->cqid; in ionic_create_qp()
2354 if (qp->has_rq) { in ionic_create_qp()
2355 cq = to_ionic_vcq_cq(attr->recv_cq, qp->udma_idx); in ionic_create_qp()
2357 attr->cap.max_recv_wr = qp->rq.mask; in ionic_create_qp()
2359 ionic_v1_recv_wqe_max_sge(qp->rq.stride_log2, in ionic_create_qp()
2360 qp->rq_spec, in ionic_create_qp()
2361 qp->rq_cmb & IONIC_CMB_EXPDB); in ionic_create_qp()
2362 qp->rq_cqid = cq->cqid; in ionic_create_qp()
2368 if (udata && (qp->rq_cmb & IONIC_CMB_ENABLE)) in ionic_create_qp()
2369 rdma_user_mmap_entry_remove(qp->mmap_rq_cmb); in ionic_create_qp()
2371 if (udata && (qp->sq_cmb & IONIC_CMB_ENABLE)) in ionic_create_qp()
2372 rdma_user_mmap_entry_remove(qp->mmap_sq_cmb); in ionic_create_qp()
2374 ionic_destroy_qp_cmd(dev, qp->qpid); in ionic_create_qp()
2377 ionic_qp_rq_destroy(dev, ctx, qp); in ionic_create_qp()
2380 ionic_qp_sq_destroy(dev, ctx, qp); in ionic_create_qp()
2382 if (qp->has_ah) in ionic_create_qp()
2383 ionic_put_ahid(dev, qp->ahid); in ionic_create_qp()
2385 kfree(qp->hdr); in ionic_create_qp()
2387 ionic_put_qpid(dev, qp->qpid); in ionic_create_qp()
2398 static void ionic_notify_qp_cqs(struct ionic_ibdev *dev, struct ionic_qp *qp) in ionic_notify_qp_cqs() argument
2400 if (qp->ibqp.send_cq) in ionic_notify_qp_cqs()
2401 ionic_notify_flush_cq(to_ionic_vcq_cq(qp->ibqp.send_cq, in ionic_notify_qp_cqs()
2402 qp->udma_idx)); in ionic_notify_qp_cqs()
2403 if (qp->ibqp.recv_cq && qp->ibqp.recv_cq != qp->ibqp.send_cq) in ionic_notify_qp_cqs()
2404 ionic_notify_flush_cq(to_ionic_vcq_cq(qp->ibqp.recv_cq, in ionic_notify_qp_cqs()
2405 qp->udma_idx)); in ionic_notify_qp_cqs()
2408 void ionic_flush_qp(struct ionic_ibdev *dev, struct ionic_qp *qp) in ionic_flush_qp() argument
2413 if (qp->ibqp.send_cq) { in ionic_flush_qp()
2414 cq = to_ionic_vcq_cq(qp->ibqp.send_cq, qp->udma_idx); in ionic_flush_qp()
2418 spin_lock(&qp->sq_lock); in ionic_flush_qp()
2419 qp->sq_flush = true; in ionic_flush_qp()
2420 if (!ionic_queue_empty(&qp->sq)) { in ionic_flush_qp()
2422 list_move_tail(&qp->cq_flush_sq, &cq->flush_sq); in ionic_flush_qp()
2424 spin_unlock(&qp->sq_lock); in ionic_flush_qp()
2428 if (qp->ibqp.recv_cq) { in ionic_flush_qp()
2429 cq = to_ionic_vcq_cq(qp->ibqp.recv_cq, qp->udma_idx); in ionic_flush_qp()
2433 spin_lock(&qp->rq_lock); in ionic_flush_qp()
2434 qp->rq_flush = true; in ionic_flush_qp()
2435 if (!ionic_queue_empty(&qp->rq)) { in ionic_flush_qp()
2437 list_move_tail(&qp->cq_flush_rq, &cq->flush_rq); in ionic_flush_qp()
2439 spin_unlock(&qp->rq_lock); in ionic_flush_qp()
2471 static void ionic_reset_qp(struct ionic_ibdev *dev, struct ionic_qp *qp) in ionic_reset_qp() argument
2479 if (qp->ibqp.send_cq) { in ionic_reset_qp()
2480 cq = to_ionic_vcq_cq(qp->ibqp.send_cq, qp->udma_idx); in ionic_reset_qp()
2482 ionic_clean_cq(cq, qp->qpid); in ionic_reset_qp()
2486 if (qp->ibqp.recv_cq) { in ionic_reset_qp()
2487 cq = to_ionic_vcq_cq(qp->ibqp.recv_cq, qp->udma_idx); in ionic_reset_qp()
2489 ionic_clean_cq(cq, qp->qpid); in ionic_reset_qp()
2493 if (qp->has_sq) { in ionic_reset_qp()
2494 spin_lock(&qp->sq_lock); in ionic_reset_qp()
2495 qp->sq_flush = false; in ionic_reset_qp()
2496 qp->sq_flush_rcvd = false; in ionic_reset_qp()
2497 qp->sq_msn_prod = 0; in ionic_reset_qp()
2498 qp->sq_msn_cons = 0; in ionic_reset_qp()
2499 qp->sq.prod = 0; in ionic_reset_qp()
2500 qp->sq.cons = 0; in ionic_reset_qp()
2501 spin_unlock(&qp->sq_lock); in ionic_reset_qp()
2504 if (qp->has_rq) { in ionic_reset_qp()
2505 spin_lock(&qp->rq_lock); in ionic_reset_qp()
2506 qp->rq_flush = false; in ionic_reset_qp()
2507 qp->rq.prod = 0; in ionic_reset_qp()
2508 qp->rq.cons = 0; in ionic_reset_qp()
2509 if (qp->rq_meta) { in ionic_reset_qp()
2510 for (i = 0; i < qp->rq.mask; ++i) in ionic_reset_qp()
2511 qp->rq_meta[i].next = &qp->rq_meta[i + 1]; in ionic_reset_qp()
2512 qp->rq_meta[i].next = IONIC_META_LAST; in ionic_reset_qp()
2514 qp->rq_meta_head = &qp->rq_meta[0]; in ionic_reset_qp()
2515 spin_unlock(&qp->rq_lock); in ionic_reset_qp()
2536 static int ionic_check_modify_qp(struct ionic_qp *qp, struct ib_qp_attr *attr, in ionic_check_modify_qp() argument
2540 attr->cur_qp_state : qp->state; in ionic_check_modify_qp()
2545 !ionic_qp_cur_state_is_ok(qp->state, attr->cur_qp_state)) in ionic_check_modify_qp()
2548 if (!ib_modify_qp_is_ok(cur_state, next_state, qp->ibqp.qp_type, mask)) in ionic_check_modify_qp()
2553 qp->ibqp.uobject) in ionic_check_modify_qp()
2564 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_modify_qp() local
2567 rc = ionic_check_modify_qp(qp, attr, mask); in ionic_modify_qp()
2574 rc = ionic_modify_qp_cmd(dev, pd, qp, attr, mask); in ionic_modify_qp()
2579 qp->state = attr->qp_state; in ionic_modify_qp()
2582 ionic_flush_qp(dev, qp); in ionic_modify_qp()
2583 ionic_notify_qp_cqs(dev, qp); in ionic_modify_qp()
2585 ionic_reset_qp(dev, qp); in ionic_modify_qp()
2596 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_query_qp() local
2602 rc = ionic_query_qp_cmd(dev, qp, attr, mask); in ionic_query_qp()
2606 if (qp->has_sq) in ionic_query_qp()
2607 attr->cap.max_send_wr = qp->sq.mask; in ionic_query_qp()
2609 if (qp->has_rq) in ionic_query_qp()
2610 attr->cap.max_recv_wr = qp->rq.mask; in ionic_query_qp()
2619 init_attr->sq_sig_type = qp->sig_all ? in ionic_query_qp()
2635 struct ionic_qp *qp = to_ionic_qp(ibqp); in ionic_destroy_qp() local
2640 rc = ionic_destroy_qp_cmd(dev, qp->qpid); in ionic_destroy_qp()
2644 xa_erase_irq(&dev->qp_tbl, qp->qpid); in ionic_destroy_qp()
2646 kref_put(&qp->qp_kref, ionic_qp_complete); in ionic_destroy_qp()
2647 wait_for_completion(&qp->qp_rel_comp); in ionic_destroy_qp()
2649 if (qp->ibqp.send_cq) { in ionic_destroy_qp()
2650 cq = to_ionic_vcq_cq(qp->ibqp.send_cq, qp->udma_idx); in ionic_destroy_qp()
2652 ionic_clean_cq(cq, qp->qpid); in ionic_destroy_qp()
2653 list_del(&qp->cq_poll_sq); in ionic_destroy_qp()
2654 list_del(&qp->cq_flush_sq); in ionic_destroy_qp()
2658 if (qp->ibqp.recv_cq) { in ionic_destroy_qp()
2659 cq = to_ionic_vcq_cq(qp->ibqp.recv_cq, qp->udma_idx); in ionic_destroy_qp()
2661 ionic_clean_cq(cq, qp->qpid); in ionic_destroy_qp()
2662 list_del(&qp->cq_flush_rq); in ionic_destroy_qp()
2666 ionic_qp_rq_destroy(dev, ctx, qp); in ionic_destroy_qp()
2667 ionic_qp_sq_destroy(dev, ctx, qp); in ionic_destroy_qp()
2668 if (qp->has_ah) { in ionic_destroy_qp()
2669 ionic_put_ahid(dev, qp->ahid); in ionic_destroy_qp()
2670 kfree(qp->hdr); in ionic_destroy_qp()
2672 ionic_put_qpid(dev, qp->qpid); in ionic_destroy_qp()