On Mon, Sep 12, 2016 at 07:07:40PM +0300, Ram Amrani wrote: > Add support for Queue Pair verbs which adds, deletes, > modifies and queries Queue Pairs. > > Signed-off-by: Rajesh Borundia > Signed-off-by: Ram Amrani > --- > drivers/infiniband/hw/qedr/main.c | 15 +- > drivers/infiniband/hw/qedr/qedr.h | 126 +++ > drivers/infiniband/hw/qedr/qedr_cm.h | 40 + > drivers/infiniband/hw/qedr/qedr_hsi_rdma.h | 11 + > drivers/infiniband/hw/qedr/qedr_user.h | 34 + > drivers/infiniband/hw/qedr/verbs.c | 1098 ++++++++++++++++++++++++- > drivers/infiniband/hw/qedr/verbs.h | 7 + > drivers/net/ethernet/qlogic/qed/qed_cxt.h | 1 + > drivers/net/ethernet/qlogic/qed/qed_roce.c | 1211 ++++++++++++++++++++++++++++ > drivers/net/ethernet/qlogic/qed/qed_roce.h | 71 ++ > include/linux/qed/qed_roce_if.h | 144 ++++ > 11 files changed, 2756 insertions(+), 2 deletions(-) > create mode 100644 drivers/infiniband/hw/qedr/qedr_cm.h > <....> > + > +static inline int get_gid_info_from_table(struct ib_qp *ibqp, > + struct ib_qp_attr *attr, > + int attr_mask, > + struct qed_rdma_modify_qp_in_params > + *qp_params) > +{ > + enum rdma_network_type nw_type; > + struct ib_gid_attr gid_attr; > + union ib_gid gid; > + u32 ipv4_addr; > + int rc = 0; > + int i; > + > + rc = ib_get_cached_gid(ibqp->device, attr->ah_attr.port_num, > + attr->ah_attr.grh.sgid_index, &gid, &gid_attr); > + if (!rc && !memcmp(&gid, &zgid, sizeof(gid))) > + rc = -ENOENT; > + > + if (!rc && gid_attr.ndev) { > + qp_params->vlan_id = rdma_vlan_dev_vlan_id(gid_attr.ndev); > + > + dev_put(gid_attr.ndev); > + nw_type = ib_gid_to_network_type(gid_attr.gid_type, &gid); > + switch (nw_type) { > + case RDMA_NETWORK_IPV6: > + memcpy(&qp_params->sgid.bytes[0], &gid.raw[0], > + sizeof(qp_params->sgid)); > + memcpy(&qp_params->dgid.bytes[0], > + &attr->ah_attr.grh.dgid, > + sizeof(qp_params->dgid)); > + qp_params->roce_mode = ROCE_V2_IPV6; > + SET_FIELD(qp_params->modify_flags, > + QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1); > + break; > + case RDMA_NETWORK_IB: > + memcpy(&qp_params->sgid.bytes[0], &gid.raw[0], > + sizeof(qp_params->sgid)); > + memcpy(&qp_params->dgid.bytes[0], > + &attr->ah_attr.grh.dgid, > + sizeof(qp_params->dgid)); > + qp_params->roce_mode = ROCE_V1; > + break; > + case RDMA_NETWORK_IPV4: > + memset(&qp_params->sgid, 0, sizeof(qp_params->sgid)); > + memset(&qp_params->dgid, 0, sizeof(qp_params->dgid)); > + ipv4_addr = qedr_get_ipv4_from_gid(gid.raw); > + qp_params->sgid.ipv4_addr = ipv4_addr; > + ipv4_addr = > + qedr_get_ipv4_from_gid(attr->ah_attr.grh.dgid.raw); > + qp_params->dgid.ipv4_addr = ipv4_addr; > + SET_FIELD(qp_params->modify_flags, > + QED_ROCE_MODIFY_QP_VALID_ROCE_MODE, 1); > + qp_params->roce_mode = ROCE_V2_IPV4; > + break; > + } > + } > + if (rc) > + return -EINVAL; I think it is better to check "rc" right after call to ib_get_cached_gid().