|
@@ -172,6 +172,8 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe,
|
|
|
struct mlx5_ib_srq *srq;
|
|
|
struct mlx5_ib_wq *wq;
|
|
|
u16 wqe_ctr;
|
|
|
+ u8 roce_packet_type;
|
|
|
+ bool vlan_present;
|
|
|
u8 g;
|
|
|
|
|
|
if (qp->ibqp.srq || qp->ibqp.xrcd) {
|
|
@@ -223,7 +225,6 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe,
|
|
|
break;
|
|
|
}
|
|
|
wc->slid = be16_to_cpu(cqe->slid);
|
|
|
- wc->sl = (be32_to_cpu(cqe->flags_rqpn) >> 24) & 0xf;
|
|
|
wc->src_qp = be32_to_cpu(cqe->flags_rqpn) & 0xffffff;
|
|
|
wc->dlid_path_bits = cqe->ml_path;
|
|
|
g = (be32_to_cpu(cqe->flags_rqpn) >> 28) & 3;
|
|
@@ -237,10 +238,22 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe,
|
|
|
wc->pkey_index = 0;
|
|
|
}
|
|
|
|
|
|
- if (ll != IB_LINK_LAYER_ETHERNET)
|
|
|
+ if (ll != IB_LINK_LAYER_ETHERNET) {
|
|
|
+ wc->sl = (be32_to_cpu(cqe->flags_rqpn) >> 24) & 0xf;
|
|
|
return;
|
|
|
+ }
|
|
|
+
|
|
|
+ vlan_present = cqe->l4_l3_hdr_type & 0x1;
|
|
|
+ roce_packet_type = (be32_to_cpu(cqe->flags_rqpn) >> 24) & 0x3;
|
|
|
+ if (vlan_present) {
|
|
|
+ wc->vlan_id = (be16_to_cpu(cqe->vlan_info)) & 0xfff;
|
|
|
+ wc->sl = (be16_to_cpu(cqe->vlan_info) >> 13) & 0x7;
|
|
|
+ wc->wc_flags |= IB_WC_WITH_VLAN;
|
|
|
+ } else {
|
|
|
+ wc->sl = 0;
|
|
|
+ }
|
|
|
|
|
|
- switch (wc->sl & 0x3) {
|
|
|
+ switch (roce_packet_type) {
|
|
|
case MLX5_CQE_ROCE_L3_HEADER_TYPE_GRH:
|
|
|
wc->network_hdr_type = RDMA_NETWORK_IB;
|
|
|
break;
|