diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-19 14:01:23 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-19 14:01:23 -0500 |
commit | 5db501d7e398c6a838a307adf0347cf6a2b015a3 (patch) | |
tree | eca0e59eec37509df662b09ab45264879660f6ac | |
parent | 8b2d1833a29e9dc8bccad348396ad08666379d77 (diff) | |
parent | 0a69631b2869093d7306e8f66cca8eb0a05aa919 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
IB/ipath: Fix receiving UD messages with immediate data
-rw-r--r-- | drivers/infiniband/hw/ipath/ipath_ud.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_ud.c b/drivers/infiniband/hw/ipath/ipath_ud.c index 16a2a938b520..b3df6f3c705e 100644 --- a/drivers/infiniband/hw/ipath/ipath_ud.c +++ b/drivers/infiniband/hw/ipath/ipath_ud.c | |||
@@ -455,6 +455,28 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
455 | } | 455 | } |
456 | } | 456 | } |
457 | 457 | ||
458 | /* | ||
459 | * The opcode is in the low byte when its in network order | ||
460 | * (top byte when in host order). | ||
461 | */ | ||
462 | opcode = be32_to_cpu(ohdr->bth[0]) >> 24; | ||
463 | if (qp->ibqp.qp_num > 1 && | ||
464 | opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) { | ||
465 | if (header_in_data) { | ||
466 | wc.imm_data = *(__be32 *) data; | ||
467 | data += sizeof(__be32); | ||
468 | } else | ||
469 | wc.imm_data = ohdr->u.ud.imm_data; | ||
470 | wc.wc_flags = IB_WC_WITH_IMM; | ||
471 | hdrsize += sizeof(u32); | ||
472 | } else if (opcode == IB_OPCODE_UD_SEND_ONLY) { | ||
473 | wc.imm_data = 0; | ||
474 | wc.wc_flags = 0; | ||
475 | } else { | ||
476 | dev->n_pkt_drops++; | ||
477 | goto bail; | ||
478 | } | ||
479 | |||
458 | /* Get the number of bytes the message was padded by. */ | 480 | /* Get the number of bytes the message was padded by. */ |
459 | pad = (be32_to_cpu(ohdr->bth[0]) >> 20) & 3; | 481 | pad = (be32_to_cpu(ohdr->bth[0]) >> 20) & 3; |
460 | if (unlikely(tlen < (hdrsize + pad + 4))) { | 482 | if (unlikely(tlen < (hdrsize + pad + 4))) { |
@@ -482,28 +504,6 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
482 | wc.byte_len = tlen + sizeof(struct ib_grh); | 504 | wc.byte_len = tlen + sizeof(struct ib_grh); |
483 | 505 | ||
484 | /* | 506 | /* |
485 | * The opcode is in the low byte when its in network order | ||
486 | * (top byte when in host order). | ||
487 | */ | ||
488 | opcode = be32_to_cpu(ohdr->bth[0]) >> 24; | ||
489 | if (qp->ibqp.qp_num > 1 && | ||
490 | opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) { | ||
491 | if (header_in_data) { | ||
492 | wc.imm_data = *(__be32 *) data; | ||
493 | data += sizeof(__be32); | ||
494 | } else | ||
495 | wc.imm_data = ohdr->u.ud.imm_data; | ||
496 | wc.wc_flags = IB_WC_WITH_IMM; | ||
497 | hdrsize += sizeof(u32); | ||
498 | } else if (opcode == IB_OPCODE_UD_SEND_ONLY) { | ||
499 | wc.imm_data = 0; | ||
500 | wc.wc_flags = 0; | ||
501 | } else { | ||
502 | dev->n_pkt_drops++; | ||
503 | goto bail; | ||
504 | } | ||
505 | |||
506 | /* | ||
507 | * Get the next work request entry to find where to put the data. | 507 | * Get the next work request entry to find where to put the data. |
508 | */ | 508 | */ |
509 | if (qp->r_reuse_sge) | 509 | if (qp->r_reuse_sge) |