Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4a97d47ef7946cf31b76945c3199b0b5cad6a8ed
Commit:     4a97d47ef7946cf31b76945c3199b0b5cad6a8ed
Parent:     347fcfbed261fdd11f46fa03d524e1bddddab3a6
Author:     Steve Wise <[EMAIL PROTECTED]>
AuthorDate: Thu Apr 26 15:21:02 2007 -0500
Committer:  Roland Dreier <[EMAIL PROTECTED]>
CommitDate: Mon Apr 30 17:30:28 2007 -0700

    RDMA/cxgb3: Fix TERM codes
    
    Fix TERMINATE layer, type, and ecode values based on
    conformance testing.
    
    Signed-off-by: Steve Wise <[EMAIL PROTECTED]>
    Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/hw/cxgb3/iwch_qp.c |   69 ++++++++++++++++++---------------
 1 files changed, 38 insertions(+), 31 deletions(-)

diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c 
b/drivers/infiniband/hw/cxgb3/iwch_qp.c
index 0a472c9..714dddb 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_qp.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c
@@ -471,43 +471,62 @@ int iwch_bind_mw(struct ib_qp *qp,
        return err;
 }
 
-static void build_term_codes(int t3err, u8 *layer_type, u8 *ecode, int tagged)
+static inline void build_term_codes(struct respQ_msg_t *rsp_msg,
+                                   u8 *layer_type, u8 *ecode)
 {
-       switch (t3err) {
+       int status = TPT_ERR_INTERNAL_ERR;
+       int tagged = 0;
+       int opcode = -1;
+       int rqtype = 0;
+       int send_inv = 0;
+
+       if (rsp_msg) {
+               status = CQE_STATUS(rsp_msg->cqe);
+               opcode = CQE_OPCODE(rsp_msg->cqe);
+               rqtype = RQ_TYPE(rsp_msg->cqe);
+               send_inv = (opcode == T3_SEND_WITH_INV) ||
+                          (opcode == T3_SEND_WITH_SE_INV);
+               tagged = (opcode == T3_RDMA_WRITE) ||
+                        (rqtype && (opcode == T3_READ_RESP));
+       }
+
+       switch (status) {
        case TPT_ERR_STAG:
-               if (tagged == 1) {
-                       *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
-                       *ecode = DDPT_INV_STAG;
-               } else if (tagged == 2) {
+               if (send_inv) {
+                       *layer_type = LAYER_RDMAP|RDMAP_REMOTE_OP;
+                       *ecode = RDMAP_CANT_INV_STAG;
+               } else {
                        *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
                        *ecode = RDMAP_INV_STAG;
                }
                break;
        case TPT_ERR_PDID:
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+               if ((opcode == T3_SEND_WITH_INV) ||
+                   (opcode == T3_SEND_WITH_SE_INV))
+                       *ecode = RDMAP_CANT_INV_STAG;
+               else
+                       *ecode = RDMAP_STAG_NOT_ASSOC;
+               break;
        case TPT_ERR_QPID:
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+               *ecode = RDMAP_STAG_NOT_ASSOC;
+               break;
        case TPT_ERR_ACCESS:
-               if (tagged == 1) {
-                       *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
-                       *ecode = DDPT_STAG_NOT_ASSOC;
-               } else if (tagged == 2) {
-                       *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
-                       *ecode = RDMAP_STAG_NOT_ASSOC;
-               }
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+               *ecode = RDMAP_ACC_VIOL;
                break;
        case TPT_ERR_WRAP:
                *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
                *ecode = RDMAP_TO_WRAP;
                break;
        case TPT_ERR_BOUND:
-               if (tagged == 1) {
+               if (tagged) {
                        *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
                        *ecode = DDPT_BASE_BOUNDS;
-               } else if (tagged == 2) {
+               } else {
                        *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
                        *ecode = RDMAP_BASE_BOUNDS;
-               } else {
-                       *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
-                       *ecode = DDPU_MSG_TOOBIG;
                }
                break;
        case TPT_ERR_INVALIDATE_SHARED_MR:
@@ -591,8 +610,6 @@ int iwch_post_terminate(struct iwch_qp *qhp, struct 
respQ_msg_t *rsp_msg)
 {
        union t3_wr *wqe;
        struct terminate_message *term;
-       int status;
-       int tagged = 0;
        struct sk_buff *skb;
 
        PDBG("%s %d\n", __FUNCTION__, __LINE__);
@@ -610,17 +627,7 @@ int iwch_post_terminate(struct iwch_qp *qhp, struct 
respQ_msg_t *rsp_msg)
 
        /* immediate data starts here. */
        term = (struct terminate_message *)wqe->send.sgl;
-       if (rsp_msg) {
-               status = CQE_STATUS(rsp_msg->cqe);
-               if (CQE_OPCODE(rsp_msg->cqe) == T3_RDMA_WRITE)
-                       tagged = 1;
-               if ((CQE_OPCODE(rsp_msg->cqe) == T3_READ_REQ) ||
-                   (CQE_OPCODE(rsp_msg->cqe) == T3_READ_RESP))
-                       tagged = 2;
-       } else {
-               status = TPT_ERR_INTERNAL_ERR;
-       }
-       build_term_codes(status, &term->layer_etype, &term->ecode, tagged);
+       build_term_codes(rsp_msg, &term->layer_etype, &term->ecode);
        build_fw_riwrh((void *)wqe, T3_WR_SEND,
                       T3_COMPLETION_FLAG | T3_NOTIFY_FLAG, 1,
                       qhp->ep->hwtid, 5);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to