forked from Minki/linux
IB/ipath: UC RDMA WRITE with IMMEDIATE doesn't send the immediate
This patch fixes a bug in the receive processing for UC RDMA WRITE with immediate which caused the last packet to be dropped. Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
9ef8617af7
commit
55046698fa
@ -464,6 +464,16 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
|
|||||||
|
|
||||||
case OP(RDMA_WRITE_LAST_WITH_IMMEDIATE):
|
case OP(RDMA_WRITE_LAST_WITH_IMMEDIATE):
|
||||||
rdma_last_imm:
|
rdma_last_imm:
|
||||||
|
if (header_in_data) {
|
||||||
|
wc.imm_data = *(__be32 *) data;
|
||||||
|
data += sizeof(__be32);
|
||||||
|
} else {
|
||||||
|
/* Immediate data comes after BTH */
|
||||||
|
wc.imm_data = ohdr->u.imm_data;
|
||||||
|
}
|
||||||
|
hdrsize += 4;
|
||||||
|
wc.wc_flags = IB_WC_WITH_IMM;
|
||||||
|
|
||||||
/* Get the number of bytes the message was padded by. */
|
/* Get the number of bytes the message was padded by. */
|
||||||
pad = (be32_to_cpu(ohdr->bth[0]) >> 20) & 3;
|
pad = (be32_to_cpu(ohdr->bth[0]) >> 20) & 3;
|
||||||
/* Check for invalid length. */
|
/* Check for invalid length. */
|
||||||
@ -484,16 +494,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr,
|
|||||||
dev->n_pkt_drops++;
|
dev->n_pkt_drops++;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (header_in_data) {
|
wc.byte_len = qp->r_len;
|
||||||
wc.imm_data = *(__be32 *) data;
|
|
||||||
data += sizeof(__be32);
|
|
||||||
} else {
|
|
||||||
/* Immediate data comes after BTH */
|
|
||||||
wc.imm_data = ohdr->u.imm_data;
|
|
||||||
}
|
|
||||||
hdrsize += 4;
|
|
||||||
wc.wc_flags = IB_WC_WITH_IMM;
|
|
||||||
wc.byte_len = 0;
|
|
||||||
goto last_imm;
|
goto last_imm;
|
||||||
|
|
||||||
case OP(RDMA_WRITE_LAST):
|
case OP(RDMA_WRITE_LAST):
|
||||||
|
Loading…
Reference in New Issue
Block a user