@@ -1563,6 +1563,19 @@ static void erdma_attr_to_av(const struct rdma_ah_attr *ah_attr,
15631563 av -> ntype = ERDMA_NETWORK_TYPE_IPV6 ;
15641564}
15651565
1566+ static void erdma_av_to_attr (struct erdma_av * av , struct rdma_ah_attr * ah_attr )
1567+ {
1568+ ah_attr -> type = RDMA_AH_ATTR_TYPE_ROCE ;
1569+
1570+ rdma_ah_set_sl (ah_attr , av -> sl );
1571+ rdma_ah_set_port_num (ah_attr , av -> port );
1572+ rdma_ah_set_ah_flags (ah_attr , IB_AH_GRH );
1573+
1574+ rdma_ah_set_grh (ah_attr , NULL , av -> flow_label , av -> sgid_index ,
1575+ av -> hop_limit , av -> traffic_class );
1576+ rdma_ah_set_dgid_raw (ah_attr , av -> dgid );
1577+ }
1578+
15661579static int ib_qps_to_erdma_qps [ERDMA_PROTO_COUNT ][IB_QPS_ERR + 1 ] = {
15671580 [ERDMA_PROTO_IWARP ] = {
15681581 [IB_QPS_RESET ] = ERDMA_QPS_IWARP_IDLE ,
@@ -1764,8 +1777,11 @@ static enum ib_qp_state query_qp_state(struct erdma_qp *qp)
17641777int erdma_query_qp (struct ib_qp * ibqp , struct ib_qp_attr * qp_attr ,
17651778 int qp_attr_mask , struct ib_qp_init_attr * qp_init_attr )
17661779{
1780+ struct erdma_cmdq_query_qp_req_rocev2 req ;
17671781 struct erdma_dev * dev ;
17681782 struct erdma_qp * qp ;
1783+ u64 resp ;
1784+ int ret ;
17691785
17701786 if (ibqp && qp_attr && qp_init_attr ) {
17711787 qp = to_eqp (ibqp );
@@ -1792,8 +1808,37 @@ int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
17921808
17931809 qp_init_attr -> cap = qp_attr -> cap ;
17941810
1795- qp_attr -> qp_state = query_qp_state (qp );
1796- qp_attr -> cur_qp_state = query_qp_state (qp );
1811+ if (erdma_device_rocev2 (dev )) {
1812+ /* Query hardware to get some attributes */
1813+ erdma_cmdq_build_reqhdr (& req .hdr , CMDQ_SUBMOD_RDMA ,
1814+ CMDQ_OPCODE_QUERY_QP );
1815+ req .qpn = QP_ID (qp );
1816+
1817+ ret = erdma_post_cmd_wait (& dev -> cmdq , & req , sizeof (req ), & resp ,
1818+ NULL );
1819+ if (ret )
1820+ return ret ;
1821+
1822+ qp_attr -> sq_psn =
1823+ FIELD_GET (ERDMA_CMD_QUERY_QP_RESP_SQ_PSN_MASK , resp );
1824+ qp_attr -> rq_psn =
1825+ FIELD_GET (ERDMA_CMD_QUERY_QP_RESP_RQ_PSN_MASK , resp );
1826+ qp_attr -> qp_state = rocev2_to_ib_qps (
1827+ FIELD_GET (ERDMA_CMD_QUERY_QP_RESP_QP_STATE_MASK , resp ));
1828+ qp_attr -> cur_qp_state = qp_attr -> qp_state ;
1829+ qp_attr -> sq_draining = FIELD_GET (
1830+ ERDMA_CMD_QUERY_QP_RESP_SQ_DRAINING_MASK , resp );
1831+
1832+ qp_attr -> pkey_index = 0 ;
1833+ qp_attr -> dest_qp_num = qp -> attrs .rocev2 .dst_qpn ;
1834+
1835+ if (qp -> ibqp .qp_type == IB_QPT_RC )
1836+ erdma_av_to_attr (& qp -> attrs .rocev2 .av ,
1837+ & qp_attr -> ah_attr );
1838+ } else {
1839+ qp_attr -> qp_state = query_qp_state (qp );
1840+ qp_attr -> cur_qp_state = qp_attr -> qp_state ;
1841+ }
17971842
17981843 return 0 ;
17991844}
@@ -2185,14 +2230,7 @@ int erdma_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr)
21852230 struct erdma_ah * ah = to_eah (ibah );
21862231
21872232 memset (ah_attr , 0 , sizeof (* ah_attr ));
2188-
2189- ah_attr -> type = RDMA_AH_ATTR_TYPE_ROCE ;
2190- rdma_ah_set_sl (ah_attr , ah -> av .sl );
2191- rdma_ah_set_port_num (ah_attr , ah -> av .port );
2192- rdma_ah_set_ah_flags (ah_attr , IB_AH_GRH );
2193- rdma_ah_set_grh (ah_attr , NULL , ah -> av .flow_label , ah -> av .sgid_index ,
2194- ah -> av .hop_limit , ah -> av .traffic_class );
2195- rdma_ah_set_dgid_raw (ah_attr , ah -> av .dgid );
2233+ erdma_av_to_attr (& ah -> av , ah_attr );
21962234
21972235 return 0 ;
21982236}
0 commit comments