aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/cxgb4/cq.c7
-rw-r--r--drivers/infiniband/hw/cxgb4/iw_cxgb4.h2
-rw-r--r--drivers/infiniband/hw/cxgb4/qp.c46
-rw-r--r--drivers/infiniband/hw/cxgb4/t4.h6
4 files changed, 50 insertions, 11 deletions
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
index 7ed87622e461..6f2b26126c64 100644
--- a/drivers/infiniband/hw/cxgb4/cq.c
+++ b/drivers/infiniband/hw/cxgb4/cq.c
@@ -395,7 +395,7 @@ next_cqe:
395 395
396static int cqe_completes_wr(struct t4_cqe *cqe, struct t4_wq *wq) 396static int cqe_completes_wr(struct t4_cqe *cqe, struct t4_wq *wq)
397{ 397{
398 if (CQE_OPCODE(cqe) == C4IW_DRAIN_OPCODE) { 398 if (DRAIN_CQE(cqe)) {
399 WARN_ONCE(1, "Unexpected DRAIN CQE qp id %u!\n", wq->sq.qid); 399 WARN_ONCE(1, "Unexpected DRAIN CQE qp id %u!\n", wq->sq.qid);
400 return 0; 400 return 0;
401 } 401 }
@@ -494,7 +494,7 @@ static int poll_cq(struct t4_wq *wq, struct t4_cq *cq, struct t4_cqe *cqe,
494 /* 494 /*
495 * Special cqe for drain WR completions... 495 * Special cqe for drain WR completions...
496 */ 496 */
497 if (CQE_OPCODE(hw_cqe) == C4IW_DRAIN_OPCODE) { 497 if (DRAIN_CQE(hw_cqe)) {
498 *cookie = CQE_DRAIN_COOKIE(hw_cqe); 498 *cookie = CQE_DRAIN_COOKIE(hw_cqe);
499 *cqe = *hw_cqe; 499 *cqe = *hw_cqe;
500 goto skip_cqe; 500 goto skip_cqe;
@@ -748,9 +748,6 @@ static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
748 c4iw_invalidate_mr(qhp->rhp, 748 c4iw_invalidate_mr(qhp->rhp,
749 CQE_WRID_FR_STAG(&cqe)); 749 CQE_WRID_FR_STAG(&cqe));
750 break; 750 break;
751 case C4IW_DRAIN_OPCODE:
752 wc->opcode = IB_WC_SEND;
753 break;
754 default: 751 default:
755 pr_err("Unexpected opcode %d in the CQE received for QPID=0x%0x\n", 752 pr_err("Unexpected opcode %d in the CQE received for QPID=0x%0x\n",
756 CQE_OPCODE(&cqe), CQE_QPID(&cqe)); 753 CQE_OPCODE(&cqe), CQE_QPID(&cqe));
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
index 470f97a79ebb..65dd3726ca02 100644
--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
@@ -693,8 +693,6 @@ static inline int to_ib_qp_state(int c4iw_qp_state)
693 return IB_QPS_ERR; 693 return IB_QPS_ERR;
694} 694}
695 695
696#define C4IW_DRAIN_OPCODE FW_RI_SGE_EC_CR_RETURN
697
698static inline u32 c4iw_ib_to_tpt_access(int a) 696static inline u32 c4iw_ib_to_tpt_access(int a)
699{ 697{
700 return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) | 698 return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) |
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
index 38bddd02a943..21495f917bcc 100644
--- a/drivers/infiniband/hw/cxgb4/qp.c
+++ b/drivers/infiniband/hw/cxgb4/qp.c
@@ -790,21 +790,57 @@ static int ring_kernel_rq_db(struct c4iw_qp *qhp, u16 inc)
790 return 0; 790 return 0;
791} 791}
792 792
793static void complete_sq_drain_wr(struct c4iw_qp *qhp, struct ib_send_wr *wr) 793static int ib_to_fw_opcode(int ib_opcode)
794{
795 int opcode;
796
797 switch (ib_opcode) {
798 case IB_WR_SEND_WITH_INV:
799 opcode = FW_RI_SEND_WITH_INV;
800 break;
801 case IB_WR_SEND:
802 opcode = FW_RI_SEND;
803 break;
804 case IB_WR_RDMA_WRITE:
805 opcode = FW_RI_RDMA_WRITE;
806 break;
807 case IB_WR_RDMA_READ:
808 case IB_WR_RDMA_READ_WITH_INV:
809 opcode = FW_RI_READ_REQ;
810 break;
811 case IB_WR_REG_MR:
812 opcode = FW_RI_FAST_REGISTER;
813 break;
814 case IB_WR_LOCAL_INV:
815 opcode = FW_RI_LOCAL_INV;
816 break;
817 default:
818 opcode = -EINVAL;
819 }
820 return opcode;
821}
822
823static int complete_sq_drain_wr(struct c4iw_qp *qhp, struct ib_send_wr *wr)
794{ 824{
795 struct t4_cqe cqe = {}; 825 struct t4_cqe cqe = {};
796 struct c4iw_cq *schp; 826 struct c4iw_cq *schp;
797 unsigned long flag; 827 unsigned long flag;
798 struct t4_cq *cq; 828 struct t4_cq *cq;
829 int opcode;
799 830
800 schp = to_c4iw_cq(qhp->ibqp.send_cq); 831 schp = to_c4iw_cq(qhp->ibqp.send_cq);
801 cq = &schp->cq; 832 cq = &schp->cq;
802 833
834 opcode = ib_to_fw_opcode(wr->opcode);
835 if (opcode < 0)
836 return opcode;
837
803 cqe.u.drain_cookie = wr->wr_id; 838 cqe.u.drain_cookie = wr->wr_id;
804 cqe.header = cpu_to_be32(CQE_STATUS_V(T4_ERR_SWFLUSH) | 839 cqe.header = cpu_to_be32(CQE_STATUS_V(T4_ERR_SWFLUSH) |
805 CQE_OPCODE_V(C4IW_DRAIN_OPCODE) | 840 CQE_OPCODE_V(opcode) |
806 CQE_TYPE_V(1) | 841 CQE_TYPE_V(1) |
807 CQE_SWCQE_V(1) | 842 CQE_SWCQE_V(1) |
843 CQE_DRAIN_V(1) |
808 CQE_QPID_V(qhp->wq.sq.qid)); 844 CQE_QPID_V(qhp->wq.sq.qid));
809 845
810 spin_lock_irqsave(&schp->lock, flag); 846 spin_lock_irqsave(&schp->lock, flag);
@@ -819,6 +855,7 @@ static void complete_sq_drain_wr(struct c4iw_qp *qhp, struct ib_send_wr *wr)
819 schp->ibcq.cq_context); 855 schp->ibcq.cq_context);
820 spin_unlock_irqrestore(&schp->comp_handler_lock, flag); 856 spin_unlock_irqrestore(&schp->comp_handler_lock, flag);
821 } 857 }
858 return 0;
822} 859}
823 860
824static void complete_rq_drain_wr(struct c4iw_qp *qhp, struct ib_recv_wr *wr) 861static void complete_rq_drain_wr(struct c4iw_qp *qhp, struct ib_recv_wr *wr)
@@ -833,9 +870,10 @@ static void complete_rq_drain_wr(struct c4iw_qp *qhp, struct ib_recv_wr *wr)
833 870
834 cqe.u.drain_cookie = wr->wr_id; 871 cqe.u.drain_cookie = wr->wr_id;
835 cqe.header = cpu_to_be32(CQE_STATUS_V(T4_ERR_SWFLUSH) | 872 cqe.header = cpu_to_be32(CQE_STATUS_V(T4_ERR_SWFLUSH) |
836 CQE_OPCODE_V(C4IW_DRAIN_OPCODE) | 873 CQE_OPCODE_V(FW_RI_SEND) |
837 CQE_TYPE_V(0) | 874 CQE_TYPE_V(0) |
838 CQE_SWCQE_V(1) | 875 CQE_SWCQE_V(1) |
876 CQE_DRAIN_V(1) |
839 CQE_QPID_V(qhp->wq.sq.qid)); 877 CQE_QPID_V(qhp->wq.sq.qid));
840 878
841 spin_lock_irqsave(&rchp->lock, flag); 879 spin_lock_irqsave(&rchp->lock, flag);
@@ -875,7 +913,7 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
875 */ 913 */
876 if (qhp->wq.flushed) { 914 if (qhp->wq.flushed) {
877 spin_unlock_irqrestore(&qhp->lock, flag); 915 spin_unlock_irqrestore(&qhp->lock, flag);
878 complete_sq_drain_wr(qhp, wr); 916 err = complete_sq_drain_wr(qhp, wr);
879 return err; 917 return err;
880 } 918 }
881 num_wrs = t4_sq_avail(&qhp->wq); 919 num_wrs = t4_sq_avail(&qhp->wq);
diff --git a/drivers/infiniband/hw/cxgb4/t4.h b/drivers/infiniband/hw/cxgb4/t4.h
index e9ea94268d51..79e8ee12c391 100644
--- a/drivers/infiniband/hw/cxgb4/t4.h
+++ b/drivers/infiniband/hw/cxgb4/t4.h
@@ -197,6 +197,11 @@ struct t4_cqe {
197#define CQE_SWCQE_G(x) ((((x) >> CQE_SWCQE_S)) & CQE_SWCQE_M) 197#define CQE_SWCQE_G(x) ((((x) >> CQE_SWCQE_S)) & CQE_SWCQE_M)
198#define CQE_SWCQE_V(x) ((x)<<CQE_SWCQE_S) 198#define CQE_SWCQE_V(x) ((x)<<CQE_SWCQE_S)
199 199
200#define CQE_DRAIN_S 10
201#define CQE_DRAIN_M 0x1
202#define CQE_DRAIN_G(x) ((((x) >> CQE_DRAIN_S)) & CQE_DRAIN_M)
203#define CQE_DRAIN_V(x) ((x)<<CQE_DRAIN_S)
204
200#define CQE_STATUS_S 5 205#define CQE_STATUS_S 5
201#define CQE_STATUS_M 0x1F 206#define CQE_STATUS_M 0x1F
202#define CQE_STATUS_G(x) ((((x) >> CQE_STATUS_S)) & CQE_STATUS_M) 207#define CQE_STATUS_G(x) ((((x) >> CQE_STATUS_S)) & CQE_STATUS_M)
@@ -213,6 +218,7 @@ struct t4_cqe {
213#define CQE_OPCODE_V(x) ((x)<<CQE_OPCODE_S) 218#define CQE_OPCODE_V(x) ((x)<<CQE_OPCODE_S)
214 219
215#define SW_CQE(x) (CQE_SWCQE_G(be32_to_cpu((x)->header))) 220#define SW_CQE(x) (CQE_SWCQE_G(be32_to_cpu((x)->header)))
221#define DRAIN_CQE(x) (CQE_DRAIN_G(be32_to_cpu((x)->header)))
216#define CQE_QPID(x) (CQE_QPID_G(be32_to_cpu((x)->header))) 222#define CQE_QPID(x) (CQE_QPID_G(be32_to_cpu((x)->header)))
217#define CQE_TYPE(x) (CQE_TYPE_G(be32_to_cpu((x)->header))) 223#define CQE_TYPE(x) (CQE_TYPE_G(be32_to_cpu((x)->header)))
218#define SQ_TYPE(x) (CQE_TYPE((x))) 224#define SQ_TYPE(x) (CQE_TYPE((x)))