iwch_cq.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /*
  2. * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
  3. *
  4. * This software is available to you under a choice of one of two
  5. * licenses. You may choose to be licensed under the terms of the GNU
  6. * General Public License (GPL) Version 2, available from the file
  7. * COPYING in the main directory of this source tree, or the
  8. * OpenIB.org BSD license below:
  9. *
  10. * Redistribution and use in source and binary forms, with or
  11. * without modification, are permitted provided that the following
  12. * conditions are met:
  13. *
  14. * - Redistributions of source code must retain the above
  15. * copyright notice, this list of conditions and the following
  16. * disclaimer.
  17. *
  18. * - Redistributions in binary form must reproduce the above
  19. * copyright notice, this list of conditions and the following
  20. * disclaimer in the documentation and/or other materials
  21. * provided with the distribution.
  22. *
  23. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30. * SOFTWARE.
  31. */
  32. #include "iwch_provider.h"
  33. #include "iwch.h"
  34. /*
  35. * Get one cq entry from cxio and map it to openib.
  36. *
  37. * Returns:
  38. * 0 EMPTY;
  39. * 1 cqe returned
  40. * -EAGAIN caller must try again
  41. * any other -errno fatal error
  42. */
  43. static int iwch_poll_cq_one(struct iwch_dev *rhp, struct iwch_cq *chp,
  44. struct ib_wc *wc)
  45. {
  46. struct iwch_qp *qhp = NULL;
  47. struct t3_cqe cqe, *rd_cqe;
  48. struct t3_wq *wq;
  49. u32 credit = 0;
  50. u8 cqe_flushed;
  51. u64 cookie;
  52. int ret = 1;
  53. rd_cqe = cxio_next_cqe(&chp->cq);
  54. if (!rd_cqe)
  55. return 0;
  56. qhp = get_qhp(rhp, CQE_QPID(*rd_cqe));
  57. if (!qhp)
  58. wq = NULL;
  59. else {
  60. spin_lock(&qhp->lock);
  61. wq = &(qhp->wq);
  62. }
  63. ret = cxio_poll_cq(wq, &(chp->cq), &cqe, &cqe_flushed, &cookie,
  64. &credit);
  65. if (t3a_device(chp->rhp) && credit) {
  66. PDBG("%s updating %d cq credits on id %d\n", __FUNCTION__,
  67. credit, chp->cq.cqid);
  68. cxio_hal_cq_op(&rhp->rdev, &chp->cq, CQ_CREDIT_UPDATE, credit);
  69. }
  70. if (ret) {
  71. ret = -EAGAIN;
  72. goto out;
  73. }
  74. ret = 1;
  75. wc->wr_id = cookie;
  76. wc->qp = &qhp->ibqp;
  77. wc->vendor_err = CQE_STATUS(cqe);
  78. PDBG("%s qpid 0x%x type %d opcode %d status 0x%x wrid hi 0x%x "
  79. "lo 0x%x cookie 0x%llx\n", __FUNCTION__,
  80. CQE_QPID(cqe), CQE_TYPE(cqe),
  81. CQE_OPCODE(cqe), CQE_STATUS(cqe), CQE_WRID_HI(cqe),
  82. CQE_WRID_LOW(cqe), (unsigned long long) cookie);
  83. if (CQE_TYPE(cqe) == 0) {
  84. if (!CQE_STATUS(cqe))
  85. wc->byte_len = CQE_LEN(cqe);
  86. else
  87. wc->byte_len = 0;
  88. wc->opcode = IB_WC_RECV;
  89. } else {
  90. switch (CQE_OPCODE(cqe)) {
  91. case T3_RDMA_WRITE:
  92. wc->opcode = IB_WC_RDMA_WRITE;
  93. break;
  94. case T3_READ_REQ:
  95. wc->opcode = IB_WC_RDMA_READ;
  96. wc->byte_len = CQE_LEN(cqe);
  97. break;
  98. case T3_SEND:
  99. case T3_SEND_WITH_SE:
  100. wc->opcode = IB_WC_SEND;
  101. break;
  102. case T3_BIND_MW:
  103. wc->opcode = IB_WC_BIND_MW;
  104. break;
  105. /* these aren't supported yet */
  106. case T3_SEND_WITH_INV:
  107. case T3_SEND_WITH_SE_INV:
  108. case T3_LOCAL_INV:
  109. case T3_FAST_REGISTER:
  110. default:
  111. printk(KERN_ERR MOD "Unexpected opcode %d "
  112. "in the CQE received for QPID=0x%0x\n",
  113. CQE_OPCODE(cqe), CQE_QPID(cqe));
  114. ret = -EINVAL;
  115. goto out;
  116. }
  117. }
  118. if (cqe_flushed)
  119. wc->status = IB_WC_WR_FLUSH_ERR;
  120. else {
  121. switch (CQE_STATUS(cqe)) {
  122. case TPT_ERR_SUCCESS:
  123. wc->status = IB_WC_SUCCESS;
  124. break;
  125. case TPT_ERR_STAG:
  126. wc->status = IB_WC_LOC_ACCESS_ERR;
  127. break;
  128. case TPT_ERR_PDID:
  129. wc->status = IB_WC_LOC_PROT_ERR;
  130. break;
  131. case TPT_ERR_QPID:
  132. case TPT_ERR_ACCESS:
  133. wc->status = IB_WC_LOC_ACCESS_ERR;
  134. break;
  135. case TPT_ERR_WRAP:
  136. wc->status = IB_WC_GENERAL_ERR;
  137. break;
  138. case TPT_ERR_BOUND:
  139. wc->status = IB_WC_LOC_LEN_ERR;
  140. break;
  141. case TPT_ERR_INVALIDATE_SHARED_MR:
  142. case TPT_ERR_INVALIDATE_MR_WITH_MW_BOUND:
  143. wc->status = IB_WC_MW_BIND_ERR;
  144. break;
  145. case TPT_ERR_CRC:
  146. case TPT_ERR_MARKER:
  147. case TPT_ERR_PDU_LEN_ERR:
  148. case TPT_ERR_OUT_OF_RQE:
  149. case TPT_ERR_DDP_VERSION:
  150. case TPT_ERR_RDMA_VERSION:
  151. case TPT_ERR_DDP_QUEUE_NUM:
  152. case TPT_ERR_MSN:
  153. case TPT_ERR_TBIT:
  154. case TPT_ERR_MO:
  155. case TPT_ERR_MSN_RANGE:
  156. case TPT_ERR_IRD_OVERFLOW:
  157. case TPT_ERR_OPCODE:
  158. wc->status = IB_WC_FATAL_ERR;
  159. break;
  160. case TPT_ERR_SWFLUSH:
  161. wc->status = IB_WC_WR_FLUSH_ERR;
  162. break;
  163. default:
  164. printk(KERN_ERR MOD "Unexpected cqe_status 0x%x for "
  165. "QPID=0x%0x\n", CQE_STATUS(cqe), CQE_QPID(cqe));
  166. ret = -EINVAL;
  167. }
  168. }
  169. out:
  170. if (wq)
  171. spin_unlock(&qhp->lock);
  172. return ret;
  173. }
  174. int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
  175. {
  176. struct iwch_dev *rhp;
  177. struct iwch_cq *chp;
  178. unsigned long flags;
  179. int npolled;
  180. int err = 0;
  181. chp = to_iwch_cq(ibcq);
  182. rhp = chp->rhp;
  183. spin_lock_irqsave(&chp->lock, flags);
  184. for (npolled = 0; npolled < num_entries; ++npolled) {
  185. #ifdef DEBUG
  186. int i=0;
  187. #endif
  188. /*
  189. * Because T3 can post CQEs that are _not_ associated
  190. * with a WR, we might have to poll again after removing
  191. * one of these.
  192. */
  193. do {
  194. err = iwch_poll_cq_one(rhp, chp, wc + npolled);
  195. #ifdef DEBUG
  196. BUG_ON(++i > 1000);
  197. #endif
  198. } while (err == -EAGAIN);
  199. if (err <= 0)
  200. break;
  201. }
  202. spin_unlock_irqrestore(&chp->lock, flags);
  203. if (err < 0)
  204. return err;
  205. else {
  206. return npolled;
  207. }
  208. }