diff options
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_qp.c | 54 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_rc.c | 127 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_ruc.c | 165 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.c | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_verbs.h | 6 |
5 files changed, 132 insertions, 224 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c index dd5b6e9d57c2..6f98632877eb 100644 --- a/drivers/infiniband/hw/ipath/ipath_qp.c +++ b/drivers/infiniband/hw/ipath/ipath_qp.c | |||
| @@ -374,13 +374,14 @@ static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) | |||
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | /** | 376 | /** |
| 377 | * ipath_error_qp - put a QP into an error state | 377 | * ipath_error_qp - put a QP into the error state |
| 378 | * @qp: the QP to put into an error state | 378 | * @qp: the QP to put into the error state |
| 379 | * @err: the receive completion error to signal if a RWQE is active | 379 | * @err: the receive completion error to signal if a RWQE is active |
| 380 | * | 380 | * |
| 381 | * Flushes both send and receive work queues. | 381 | * Flushes both send and receive work queues. |
| 382 | * Returns true if last WQE event should be generated. | 382 | * Returns true if last WQE event should be generated. |
| 383 | * The QP s_lock should be held and interrupts disabled. | 383 | * The QP s_lock should be held and interrupts disabled. |
| 384 | * If we are already in error state, just return. | ||
| 384 | */ | 385 | */ |
| 385 | 386 | ||
| 386 | int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | 387 | int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) |
| @@ -389,8 +390,10 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
| 389 | struct ib_wc wc; | 390 | struct ib_wc wc; |
| 390 | int ret = 0; | 391 | int ret = 0; |
| 391 | 392 | ||
| 392 | ipath_dbg("QP%d/%d in error state (%d)\n", | 393 | if (qp->state == IB_QPS_ERR) |
| 393 | qp->ibqp.qp_num, qp->remote_qpn, err); | 394 | goto bail; |
| 395 | |||
| 396 | qp->state = IB_QPS_ERR; | ||
| 394 | 397 | ||
| 395 | spin_lock(&dev->pending_lock); | 398 | spin_lock(&dev->pending_lock); |
| 396 | if (!list_empty(&qp->timerwait)) | 399 | if (!list_empty(&qp->timerwait)) |
| @@ -460,6 +463,7 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
| 460 | } else if (qp->ibqp.event_handler) | 463 | } else if (qp->ibqp.event_handler) |
| 461 | ret = 1; | 464 | ret = 1; |
| 462 | 465 | ||
| 466 | bail: | ||
| 463 | return ret; | 467 | return ret; |
| 464 | } | 468 | } |
| 465 | 469 | ||
| @@ -1026,48 +1030,6 @@ bail: | |||
| 1026 | } | 1030 | } |
| 1027 | 1031 | ||
| 1028 | /** | 1032 | /** |
| 1029 | * ipath_sqerror_qp - put a QP's send queue into an error state | ||
| 1030 | * @qp: QP who's send queue will be put into an error state | ||
| 1031 | * @wc: the WC responsible for putting the QP in this state | ||
| 1032 | * | ||
| 1033 | * Flushes the send work queue. | ||
| 1034 | * The QP s_lock should be held and interrupts disabled. | ||
| 1035 | */ | ||
| 1036 | |||
| 1037 | void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc) | ||
| 1038 | { | ||
| 1039 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | ||
| 1040 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); | ||
| 1041 | |||
| 1042 | ipath_dbg("Send queue error on QP%d/%d: err: %d\n", | ||
| 1043 | qp->ibqp.qp_num, qp->remote_qpn, wc->status); | ||
| 1044 | |||
| 1045 | spin_lock(&dev->pending_lock); | ||
| 1046 | if (!list_empty(&qp->timerwait)) | ||
| 1047 | list_del_init(&qp->timerwait); | ||
| 1048 | if (!list_empty(&qp->piowait)) | ||
| 1049 | list_del_init(&qp->piowait); | ||
| 1050 | spin_unlock(&dev->pending_lock); | ||
| 1051 | |||
| 1052 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1); | ||
| 1053 | if (++qp->s_last >= qp->s_size) | ||
| 1054 | qp->s_last = 0; | ||
| 1055 | |||
| 1056 | wc->status = IB_WC_WR_FLUSH_ERR; | ||
| 1057 | |||
| 1058 | while (qp->s_last != qp->s_head) { | ||
| 1059 | wqe = get_swqe_ptr(qp, qp->s_last); | ||
| 1060 | wc->wr_id = wqe->wr.wr_id; | ||
| 1061 | wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
| 1062 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1); | ||
| 1063 | if (++qp->s_last >= qp->s_size) | ||
| 1064 | qp->s_last = 0; | ||
| 1065 | } | ||
| 1066 | qp->s_cur = qp->s_tail = qp->s_head; | ||
| 1067 | qp->state = IB_QPS_SQE; | ||
| 1068 | } | ||
| 1069 | |||
| 1070 | /** | ||
| 1071 | * ipath_get_credit - flush the send work queue of a QP | 1033 | * ipath_get_credit - flush the send work queue of a QP |
| 1072 | * @qp: the qp who's send work queue to flush | 1034 | * @qp: the qp who's send work queue to flush |
| 1073 | * @aeth: the Acknowledge Extended Transport Header | 1035 | * @aeth: the Acknowledge Extended Transport Header |
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c index 08b11b567614..b4b26c3aa613 100644 --- a/drivers/infiniband/hw/ipath/ipath_rc.c +++ b/drivers/infiniband/hw/ipath/ipath_rc.c | |||
| @@ -771,27 +771,14 @@ done: | |||
| 771 | * | 771 | * |
| 772 | * The QP s_lock should be held and interrupts disabled. | 772 | * The QP s_lock should be held and interrupts disabled. |
| 773 | */ | 773 | */ |
| 774 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc) | 774 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn) |
| 775 | { | 775 | { |
| 776 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); | 776 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); |
| 777 | struct ipath_ibdev *dev; | 777 | struct ipath_ibdev *dev; |
| 778 | 778 | ||
| 779 | if (qp->s_retry == 0) { | 779 | if (qp->s_retry == 0) { |
| 780 | wc->wr_id = wqe->wr.wr_id; | 780 | ipath_send_complete(qp, wqe, IB_WC_RETRY_EXC_ERR); |
| 781 | wc->status = IB_WC_RETRY_EXC_ERR; | 781 | ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
| 782 | wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
| 783 | wc->vendor_err = 0; | ||
| 784 | wc->byte_len = 0; | ||
| 785 | wc->qp = &qp->ibqp; | ||
| 786 | wc->imm_data = 0; | ||
| 787 | wc->src_qp = qp->remote_qpn; | ||
| 788 | wc->wc_flags = 0; | ||
| 789 | wc->pkey_index = 0; | ||
| 790 | wc->slid = qp->remote_ah_attr.dlid; | ||
| 791 | wc->sl = qp->remote_ah_attr.sl; | ||
| 792 | wc->dlid_path_bits = 0; | ||
| 793 | wc->port_num = 0; | ||
| 794 | ipath_sqerror_qp(qp, wc); | ||
| 795 | goto bail; | 782 | goto bail; |
| 796 | } | 783 | } |
| 797 | qp->s_retry--; | 784 | qp->s_retry--; |
| @@ -804,6 +791,8 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc) | |||
| 804 | spin_lock(&dev->pending_lock); | 791 | spin_lock(&dev->pending_lock); |
| 805 | if (!list_empty(&qp->timerwait)) | 792 | if (!list_empty(&qp->timerwait)) |
| 806 | list_del_init(&qp->timerwait); | 793 | list_del_init(&qp->timerwait); |
| 794 | if (!list_empty(&qp->piowait)) | ||
| 795 | list_del_init(&qp->piowait); | ||
| 807 | spin_unlock(&dev->pending_lock); | 796 | spin_unlock(&dev->pending_lock); |
| 808 | 797 | ||
| 809 | if (wqe->wr.opcode == IB_WR_RDMA_READ) | 798 | if (wqe->wr.opcode == IB_WR_RDMA_READ) |
| @@ -845,6 +834,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
| 845 | { | 834 | { |
| 846 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | 835 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); |
| 847 | struct ib_wc wc; | 836 | struct ib_wc wc; |
| 837 | enum ib_wc_status status; | ||
| 848 | struct ipath_swqe *wqe; | 838 | struct ipath_swqe *wqe; |
| 849 | int ret = 0; | 839 | int ret = 0; |
| 850 | u32 ack_psn; | 840 | u32 ack_psn; |
| @@ -909,7 +899,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
| 909 | */ | 899 | */ |
| 910 | update_last_psn(qp, wqe->psn - 1); | 900 | update_last_psn(qp, wqe->psn - 1); |
| 911 | /* Retry this request. */ | 901 | /* Retry this request. */ |
| 912 | ipath_restart_rc(qp, wqe->psn, &wc); | 902 | ipath_restart_rc(qp, wqe->psn); |
| 913 | /* | 903 | /* |
| 914 | * No need to process the ACK/NAK since we are | 904 | * No need to process the ACK/NAK since we are |
| 915 | * restarting an earlier request. | 905 | * restarting an earlier request. |
| @@ -937,20 +927,15 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
| 937 | /* Post a send completion queue entry if requested. */ | 927 | /* Post a send completion queue entry if requested. */ |
| 938 | if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) || | 928 | if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) || |
| 939 | (wqe->wr.send_flags & IB_SEND_SIGNALED)) { | 929 | (wqe->wr.send_flags & IB_SEND_SIGNALED)) { |
| 930 | memset(&wc, 0, sizeof wc); | ||
| 940 | wc.wr_id = wqe->wr.wr_id; | 931 | wc.wr_id = wqe->wr.wr_id; |
| 941 | wc.status = IB_WC_SUCCESS; | 932 | wc.status = IB_WC_SUCCESS; |
| 942 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 933 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; |
| 943 | wc.vendor_err = 0; | ||
| 944 | wc.byte_len = wqe->length; | 934 | wc.byte_len = wqe->length; |
| 945 | wc.imm_data = 0; | ||
| 946 | wc.qp = &qp->ibqp; | 935 | wc.qp = &qp->ibqp; |
| 947 | wc.src_qp = qp->remote_qpn; | 936 | wc.src_qp = qp->remote_qpn; |
| 948 | wc.wc_flags = 0; | ||
| 949 | wc.pkey_index = 0; | ||
| 950 | wc.slid = qp->remote_ah_attr.dlid; | 937 | wc.slid = qp->remote_ah_attr.dlid; |
| 951 | wc.sl = qp->remote_ah_attr.sl; | 938 | wc.sl = qp->remote_ah_attr.sl; |
| 952 | wc.dlid_path_bits = 0; | ||
| 953 | wc.port_num = 0; | ||
| 954 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0); | 939 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0); |
| 955 | } | 940 | } |
| 956 | qp->s_retry = qp->s_retry_cnt; | 941 | qp->s_retry = qp->s_retry_cnt; |
| @@ -1012,7 +997,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
| 1012 | if (qp->s_last == qp->s_tail) | 997 | if (qp->s_last == qp->s_tail) |
| 1013 | goto bail; | 998 | goto bail; |
| 1014 | if (qp->s_rnr_retry == 0) { | 999 | if (qp->s_rnr_retry == 0) { |
| 1015 | wc.status = IB_WC_RNR_RETRY_EXC_ERR; | 1000 | status = IB_WC_RNR_RETRY_EXC_ERR; |
| 1016 | goto class_b; | 1001 | goto class_b; |
| 1017 | } | 1002 | } |
| 1018 | if (qp->s_rnr_retry_cnt < 7) | 1003 | if (qp->s_rnr_retry_cnt < 7) |
| @@ -1050,37 +1035,25 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
| 1050 | * RDMA READ response which terminates the RDMA | 1035 | * RDMA READ response which terminates the RDMA |
| 1051 | * READ. | 1036 | * READ. |
| 1052 | */ | 1037 | */ |
| 1053 | ipath_restart_rc(qp, psn, &wc); | 1038 | ipath_restart_rc(qp, psn); |
| 1054 | break; | 1039 | break; |
| 1055 | 1040 | ||
| 1056 | case 1: /* Invalid Request */ | 1041 | case 1: /* Invalid Request */ |
| 1057 | wc.status = IB_WC_REM_INV_REQ_ERR; | 1042 | status = IB_WC_REM_INV_REQ_ERR; |
| 1058 | dev->n_other_naks++; | 1043 | dev->n_other_naks++; |
| 1059 | goto class_b; | 1044 | goto class_b; |
| 1060 | 1045 | ||
| 1061 | case 2: /* Remote Access Error */ | 1046 | case 2: /* Remote Access Error */ |
| 1062 | wc.status = IB_WC_REM_ACCESS_ERR; | 1047 | status = IB_WC_REM_ACCESS_ERR; |
| 1063 | dev->n_other_naks++; | 1048 | dev->n_other_naks++; |
| 1064 | goto class_b; | 1049 | goto class_b; |
| 1065 | 1050 | ||
| 1066 | case 3: /* Remote Operation Error */ | 1051 | case 3: /* Remote Operation Error */ |
| 1067 | wc.status = IB_WC_REM_OP_ERR; | 1052 | status = IB_WC_REM_OP_ERR; |
| 1068 | dev->n_other_naks++; | 1053 | dev->n_other_naks++; |
| 1069 | class_b: | 1054 | class_b: |
| 1070 | wc.wr_id = wqe->wr.wr_id; | 1055 | ipath_send_complete(qp, wqe, status); |
| 1071 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 1056 | ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
| 1072 | wc.vendor_err = 0; | ||
| 1073 | wc.byte_len = 0; | ||
| 1074 | wc.qp = &qp->ibqp; | ||
| 1075 | wc.imm_data = 0; | ||
| 1076 | wc.src_qp = qp->remote_qpn; | ||
| 1077 | wc.wc_flags = 0; | ||
| 1078 | wc.pkey_index = 0; | ||
| 1079 | wc.slid = qp->remote_ah_attr.dlid; | ||
| 1080 | wc.sl = qp->remote_ah_attr.sl; | ||
| 1081 | wc.dlid_path_bits = 0; | ||
| 1082 | wc.port_num = 0; | ||
| 1083 | ipath_sqerror_qp(qp, &wc); | ||
| 1084 | break; | 1057 | break; |
| 1085 | 1058 | ||
| 1086 | default: | 1059 | default: |
| @@ -1126,8 +1099,8 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
| 1126 | int header_in_data) | 1099 | int header_in_data) |
| 1127 | { | 1100 | { |
| 1128 | struct ipath_swqe *wqe; | 1101 | struct ipath_swqe *wqe; |
| 1102 | enum ib_wc_status status; | ||
| 1129 | unsigned long flags; | 1103 | unsigned long flags; |
| 1130 | struct ib_wc wc; | ||
| 1131 | int diff; | 1104 | int diff; |
| 1132 | u32 pad; | 1105 | u32 pad; |
| 1133 | u32 aeth; | 1106 | u32 aeth; |
| @@ -1159,6 +1132,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
| 1159 | if (unlikely(qp->s_last == qp->s_tail)) | 1132 | if (unlikely(qp->s_last == qp->s_tail)) |
| 1160 | goto ack_done; | 1133 | goto ack_done; |
| 1161 | wqe = get_swqe_ptr(qp, qp->s_last); | 1134 | wqe = get_swqe_ptr(qp, qp->s_last); |
| 1135 | status = IB_WC_SUCCESS; | ||
| 1162 | 1136 | ||
| 1163 | switch (opcode) { | 1137 | switch (opcode) { |
| 1164 | case OP(ACKNOWLEDGE): | 1138 | case OP(ACKNOWLEDGE): |
| @@ -1200,7 +1174,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
| 1200 | /* no AETH, no ACK */ | 1174 | /* no AETH, no ACK */ |
| 1201 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { | 1175 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { |
| 1202 | dev->n_rdma_seq++; | 1176 | dev->n_rdma_seq++; |
| 1203 | ipath_restart_rc(qp, qp->s_last_psn + 1, &wc); | 1177 | ipath_restart_rc(qp, qp->s_last_psn + 1); |
| 1204 | goto ack_done; | 1178 | goto ack_done; |
| 1205 | } | 1179 | } |
| 1206 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) | 1180 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) |
| @@ -1261,7 +1235,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
| 1261 | /* ACKs READ req. */ | 1235 | /* ACKs READ req. */ |
| 1262 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { | 1236 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { |
| 1263 | dev->n_rdma_seq++; | 1237 | dev->n_rdma_seq++; |
| 1264 | ipath_restart_rc(qp, qp->s_last_psn + 1, &wc); | 1238 | ipath_restart_rc(qp, qp->s_last_psn + 1); |
| 1265 | goto ack_done; | 1239 | goto ack_done; |
| 1266 | } | 1240 | } |
| 1267 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) | 1241 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) |
| @@ -1291,31 +1265,16 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
| 1291 | goto ack_done; | 1265 | goto ack_done; |
| 1292 | } | 1266 | } |
| 1293 | 1267 | ||
| 1294 | ack_done: | ||
| 1295 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
| 1296 | goto bail; | ||
| 1297 | |||
| 1298 | ack_op_err: | 1268 | ack_op_err: |
| 1299 | wc.status = IB_WC_LOC_QP_OP_ERR; | 1269 | status = IB_WC_LOC_QP_OP_ERR; |
| 1300 | goto ack_err; | 1270 | goto ack_err; |
| 1301 | 1271 | ||
| 1302 | ack_len_err: | 1272 | ack_len_err: |
| 1303 | wc.status = IB_WC_LOC_LEN_ERR; | 1273 | status = IB_WC_LOC_LEN_ERR; |
| 1304 | ack_err: | 1274 | ack_err: |
| 1305 | wc.wr_id = wqe->wr.wr_id; | 1275 | ipath_send_complete(qp, wqe, status); |
| 1306 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 1276 | ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
| 1307 | wc.vendor_err = 0; | 1277 | ack_done: |
| 1308 | wc.byte_len = 0; | ||
| 1309 | wc.imm_data = 0; | ||
| 1310 | wc.qp = &qp->ibqp; | ||
| 1311 | wc.src_qp = qp->remote_qpn; | ||
| 1312 | wc.wc_flags = 0; | ||
| 1313 | wc.pkey_index = 0; | ||
| 1314 | wc.slid = qp->remote_ah_attr.dlid; | ||
| 1315 | wc.sl = qp->remote_ah_attr.sl; | ||
| 1316 | wc.dlid_path_bits = 0; | ||
| 1317 | wc.port_num = 0; | ||
| 1318 | ipath_sqerror_qp(qp, &wc); | ||
| 1319 | spin_unlock_irqrestore(&qp->s_lock, flags); | 1278 | spin_unlock_irqrestore(&qp->s_lock, flags); |
| 1320 | bail: | 1279 | bail: |
| 1321 | return; | 1280 | return; |
| @@ -1523,13 +1482,12 @@ send_ack: | |||
| 1523 | return 0; | 1482 | return 0; |
| 1524 | } | 1483 | } |
| 1525 | 1484 | ||
| 1526 | static void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err) | 1485 | void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err) |
| 1527 | { | 1486 | { |
| 1528 | unsigned long flags; | 1487 | unsigned long flags; |
| 1529 | int lastwqe; | 1488 | int lastwqe; |
| 1530 | 1489 | ||
| 1531 | spin_lock_irqsave(&qp->s_lock, flags); | 1490 | spin_lock_irqsave(&qp->s_lock, flags); |
| 1532 | qp->state = IB_QPS_ERR; | ||
| 1533 | lastwqe = ipath_error_qp(qp, err); | 1491 | lastwqe = ipath_error_qp(qp, err); |
| 1534 | spin_unlock_irqrestore(&qp->s_lock, flags); | 1492 | spin_unlock_irqrestore(&qp->s_lock, flags); |
| 1535 | 1493 | ||
| @@ -1643,11 +1601,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
| 1643 | opcode == OP(SEND_LAST) || | 1601 | opcode == OP(SEND_LAST) || |
| 1644 | opcode == OP(SEND_LAST_WITH_IMMEDIATE)) | 1602 | opcode == OP(SEND_LAST_WITH_IMMEDIATE)) |
| 1645 | break; | 1603 | break; |
| 1646 | nack_inv: | 1604 | goto nack_inv; |
| 1647 | ipath_rc_error(qp, IB_WC_REM_INV_REQ_ERR); | ||
| 1648 | qp->r_nak_state = IB_NAK_INVALID_REQUEST; | ||
| 1649 | qp->r_ack_psn = qp->r_psn; | ||
| 1650 | goto send_ack; | ||
| 1651 | 1605 | ||
| 1652 | case OP(RDMA_WRITE_FIRST): | 1606 | case OP(RDMA_WRITE_FIRST): |
| 1653 | case OP(RDMA_WRITE_MIDDLE): | 1607 | case OP(RDMA_WRITE_MIDDLE): |
| @@ -1673,18 +1627,13 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
| 1673 | break; | 1627 | break; |
| 1674 | } | 1628 | } |
| 1675 | 1629 | ||
| 1676 | wc.imm_data = 0; | 1630 | memset(&wc, 0, sizeof wc); |
| 1677 | wc.wc_flags = 0; | ||
| 1678 | 1631 | ||
| 1679 | /* OK, process the packet. */ | 1632 | /* OK, process the packet. */ |
| 1680 | switch (opcode) { | 1633 | switch (opcode) { |
| 1681 | case OP(SEND_FIRST): | 1634 | case OP(SEND_FIRST): |
| 1682 | if (!ipath_get_rwqe(qp, 0)) { | 1635 | if (!ipath_get_rwqe(qp, 0)) |
| 1683 | rnr_nak: | 1636 | goto rnr_nak; |
| 1684 | qp->r_nak_state = IB_RNR_NAK | qp->r_min_rnr_timer; | ||
| 1685 | qp->r_ack_psn = qp->r_psn; | ||
| 1686 | goto send_ack; | ||
| 1687 | } | ||
| 1688 | qp->r_rcv_len = 0; | 1637 | qp->r_rcv_len = 0; |
| 1689 | /* FALLTHROUGH */ | 1638 | /* FALLTHROUGH */ |
| 1690 | case OP(SEND_MIDDLE): | 1639 | case OP(SEND_MIDDLE): |
| @@ -1751,14 +1700,10 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
| 1751 | wc.opcode = IB_WC_RECV_RDMA_WITH_IMM; | 1700 | wc.opcode = IB_WC_RECV_RDMA_WITH_IMM; |
| 1752 | else | 1701 | else |
| 1753 | wc.opcode = IB_WC_RECV; | 1702 | wc.opcode = IB_WC_RECV; |
| 1754 | wc.vendor_err = 0; | ||
| 1755 | wc.qp = &qp->ibqp; | 1703 | wc.qp = &qp->ibqp; |
| 1756 | wc.src_qp = qp->remote_qpn; | 1704 | wc.src_qp = qp->remote_qpn; |
| 1757 | wc.pkey_index = 0; | ||
| 1758 | wc.slid = qp->remote_ah_attr.dlid; | 1705 | wc.slid = qp->remote_ah_attr.dlid; |
| 1759 | wc.sl = qp->remote_ah_attr.sl; | 1706 | wc.sl = qp->remote_ah_attr.sl; |
| 1760 | wc.dlid_path_bits = 0; | ||
| 1761 | wc.port_num = 0; | ||
| 1762 | /* Signal completion event if the solicited bit is set. */ | 1707 | /* Signal completion event if the solicited bit is set. */ |
| 1763 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, | 1708 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, |
| 1764 | (ohdr->bth[0] & | 1709 | (ohdr->bth[0] & |
| @@ -1951,11 +1896,21 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
| 1951 | goto send_ack; | 1896 | goto send_ack; |
| 1952 | goto done; | 1897 | goto done; |
| 1953 | 1898 | ||
| 1899 | rnr_nak: | ||
| 1900 | qp->r_nak_state = IB_RNR_NAK | qp->r_min_rnr_timer; | ||
| 1901 | qp->r_ack_psn = qp->r_psn; | ||
| 1902 | goto send_ack; | ||
| 1903 | |||
| 1904 | nack_inv: | ||
| 1905 | ipath_rc_error(qp, IB_WC_LOC_QP_OP_ERR); | ||
| 1906 | qp->r_nak_state = IB_NAK_INVALID_REQUEST; | ||
| 1907 | qp->r_ack_psn = qp->r_psn; | ||
| 1908 | goto send_ack; | ||
| 1909 | |||
| 1954 | nack_acc: | 1910 | nack_acc: |
| 1955 | ipath_rc_error(qp, IB_WC_REM_ACCESS_ERR); | 1911 | ipath_rc_error(qp, IB_WC_LOC_PROT_ERR); |
| 1956 | qp->r_nak_state = IB_NAK_REMOTE_ACCESS_ERROR; | 1912 | qp->r_nak_state = IB_NAK_REMOTE_ACCESS_ERROR; |
| 1957 | qp->r_ack_psn = qp->r_psn; | 1913 | qp->r_ack_psn = qp->r_psn; |
| 1958 | |||
| 1959 | send_ack: | 1914 | send_ack: |
| 1960 | send_rc_ack(qp); | 1915 | send_rc_ack(qp); |
| 1961 | 1916 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c index 9e3fe61cbd08..c716a03dd399 100644 --- a/drivers/infiniband/hw/ipath/ipath_ruc.c +++ b/drivers/infiniband/hw/ipath/ipath_ruc.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved. | 2 | * Copyright (c) 2006, 2007, 2008 QLogic Corporation. All rights reserved. |
| 3 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. | 3 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. |
| 4 | * | 4 | * |
| 5 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
| @@ -140,20 +140,11 @@ int ipath_init_sge(struct ipath_qp *qp, struct ipath_rwqe *wqe, | |||
| 140 | goto bail; | 140 | goto bail; |
| 141 | 141 | ||
| 142 | bad_lkey: | 142 | bad_lkey: |
| 143 | memset(&wc, 0, sizeof(wc)); | ||
| 143 | wc.wr_id = wqe->wr_id; | 144 | wc.wr_id = wqe->wr_id; |
| 144 | wc.status = IB_WC_LOC_PROT_ERR; | 145 | wc.status = IB_WC_LOC_PROT_ERR; |
| 145 | wc.opcode = IB_WC_RECV; | 146 | wc.opcode = IB_WC_RECV; |
| 146 | wc.vendor_err = 0; | ||
| 147 | wc.byte_len = 0; | ||
| 148 | wc.imm_data = 0; | ||
| 149 | wc.qp = &qp->ibqp; | 147 | wc.qp = &qp->ibqp; |
| 150 | wc.src_qp = 0; | ||
| 151 | wc.wc_flags = 0; | ||
| 152 | wc.pkey_index = 0; | ||
| 153 | wc.slid = 0; | ||
| 154 | wc.sl = 0; | ||
| 155 | wc.dlid_path_bits = 0; | ||
| 156 | wc.port_num = 0; | ||
| 157 | /* Signal solicited completion event. */ | 148 | /* Signal solicited completion event. */ |
| 158 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); | 149 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); |
| 159 | ret = 0; | 150 | ret = 0; |
| @@ -270,6 +261,7 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp) | |||
| 270 | struct ib_wc wc; | 261 | struct ib_wc wc; |
| 271 | u64 sdata; | 262 | u64 sdata; |
| 272 | atomic64_t *maddr; | 263 | atomic64_t *maddr; |
| 264 | enum ib_wc_status send_status; | ||
| 273 | 265 | ||
| 274 | qp = ipath_lookup_qpn(&dev->qp_table, sqp->remote_qpn); | 266 | qp = ipath_lookup_qpn(&dev->qp_table, sqp->remote_qpn); |
| 275 | if (!qp) { | 267 | if (!qp) { |
| @@ -300,8 +292,8 @@ again: | |||
| 300 | wqe = get_swqe_ptr(sqp, sqp->s_last); | 292 | wqe = get_swqe_ptr(sqp, sqp->s_last); |
| 301 | spin_unlock_irqrestore(&sqp->s_lock, flags); | 293 | spin_unlock_irqrestore(&sqp->s_lock, flags); |
| 302 | 294 | ||
| 303 | wc.wc_flags = 0; | 295 | memset(&wc, 0, sizeof wc); |
| 304 | wc.imm_data = 0; | 296 | send_status = IB_WC_SUCCESS; |
| 305 | 297 | ||
| 306 | sqp->s_sge.sge = wqe->sg_list[0]; | 298 | sqp->s_sge.sge = wqe->sg_list[0]; |
| 307 | sqp->s_sge.sg_list = wqe->sg_list + 1; | 299 | sqp->s_sge.sg_list = wqe->sg_list + 1; |
| @@ -313,75 +305,33 @@ again: | |||
| 313 | wc.imm_data = wqe->wr.ex.imm_data; | 305 | wc.imm_data = wqe->wr.ex.imm_data; |
| 314 | /* FALLTHROUGH */ | 306 | /* FALLTHROUGH */ |
| 315 | case IB_WR_SEND: | 307 | case IB_WR_SEND: |
| 316 | if (!ipath_get_rwqe(qp, 0)) { | 308 | if (!ipath_get_rwqe(qp, 0)) |
| 317 | rnr_nak: | 309 | goto rnr_nak; |
| 318 | /* Handle RNR NAK */ | ||
| 319 | if (qp->ibqp.qp_type == IB_QPT_UC) | ||
| 320 | goto send_comp; | ||
| 321 | if (sqp->s_rnr_retry == 0) { | ||
| 322 | wc.status = IB_WC_RNR_RETRY_EXC_ERR; | ||
| 323 | goto err; | ||
| 324 | } | ||
| 325 | if (sqp->s_rnr_retry_cnt < 7) | ||
| 326 | sqp->s_rnr_retry--; | ||
| 327 | dev->n_rnr_naks++; | ||
| 328 | sqp->s_rnr_timeout = | ||
| 329 | ib_ipath_rnr_table[qp->r_min_rnr_timer]; | ||
| 330 | ipath_insert_rnr_queue(sqp); | ||
| 331 | goto done; | ||
| 332 | } | ||
| 333 | break; | 310 | break; |
| 334 | 311 | ||
| 335 | case IB_WR_RDMA_WRITE_WITH_IMM: | 312 | case IB_WR_RDMA_WRITE_WITH_IMM: |
| 336 | if (unlikely(!(qp->qp_access_flags & | 313 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_WRITE))) |
| 337 | IB_ACCESS_REMOTE_WRITE))) { | 314 | goto inv_err; |
| 338 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
| 339 | goto err; | ||
| 340 | } | ||
| 341 | wc.wc_flags = IB_WC_WITH_IMM; | 315 | wc.wc_flags = IB_WC_WITH_IMM; |
| 342 | wc.imm_data = wqe->wr.ex.imm_data; | 316 | wc.imm_data = wqe->wr.ex.imm_data; |
| 343 | if (!ipath_get_rwqe(qp, 1)) | 317 | if (!ipath_get_rwqe(qp, 1)) |
| 344 | goto rnr_nak; | 318 | goto rnr_nak; |
| 345 | /* FALLTHROUGH */ | 319 | /* FALLTHROUGH */ |
| 346 | case IB_WR_RDMA_WRITE: | 320 | case IB_WR_RDMA_WRITE: |
| 347 | if (unlikely(!(qp->qp_access_flags & | 321 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_WRITE))) |
| 348 | IB_ACCESS_REMOTE_WRITE))) { | 322 | goto inv_err; |
| 349 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
| 350 | goto err; | ||
| 351 | } | ||
| 352 | if (wqe->length == 0) | 323 | if (wqe->length == 0) |
| 353 | break; | 324 | break; |
| 354 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, wqe->length, | 325 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, wqe->length, |
| 355 | wqe->wr.wr.rdma.remote_addr, | 326 | wqe->wr.wr.rdma.remote_addr, |
| 356 | wqe->wr.wr.rdma.rkey, | 327 | wqe->wr.wr.rdma.rkey, |
| 357 | IB_ACCESS_REMOTE_WRITE))) { | 328 | IB_ACCESS_REMOTE_WRITE))) |
| 358 | acc_err: | 329 | goto acc_err; |
| 359 | wc.status = IB_WC_REM_ACCESS_ERR; | ||
| 360 | err: | ||
| 361 | wc.wr_id = wqe->wr.wr_id; | ||
| 362 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
| 363 | wc.vendor_err = 0; | ||
| 364 | wc.byte_len = 0; | ||
| 365 | wc.qp = &sqp->ibqp; | ||
| 366 | wc.src_qp = sqp->remote_qpn; | ||
| 367 | wc.pkey_index = 0; | ||
| 368 | wc.slid = sqp->remote_ah_attr.dlid; | ||
| 369 | wc.sl = sqp->remote_ah_attr.sl; | ||
| 370 | wc.dlid_path_bits = 0; | ||
| 371 | wc.port_num = 0; | ||
| 372 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
| 373 | ipath_sqerror_qp(sqp, &wc); | ||
| 374 | spin_unlock_irqrestore(&sqp->s_lock, flags); | ||
| 375 | goto done; | ||
| 376 | } | ||
| 377 | break; | 330 | break; |
| 378 | 331 | ||
| 379 | case IB_WR_RDMA_READ: | 332 | case IB_WR_RDMA_READ: |
| 380 | if (unlikely(!(qp->qp_access_flags & | 333 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_READ))) |
| 381 | IB_ACCESS_REMOTE_READ))) { | 334 | goto inv_err; |
| 382 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
| 383 | goto err; | ||
| 384 | } | ||
| 385 | if (unlikely(!ipath_rkey_ok(qp, &sqp->s_sge, wqe->length, | 335 | if (unlikely(!ipath_rkey_ok(qp, &sqp->s_sge, wqe->length, |
| 386 | wqe->wr.wr.rdma.remote_addr, | 336 | wqe->wr.wr.rdma.remote_addr, |
| 387 | wqe->wr.wr.rdma.rkey, | 337 | wqe->wr.wr.rdma.rkey, |
| @@ -394,11 +344,8 @@ again: | |||
| 394 | 344 | ||
| 395 | case IB_WR_ATOMIC_CMP_AND_SWP: | 345 | case IB_WR_ATOMIC_CMP_AND_SWP: |
| 396 | case IB_WR_ATOMIC_FETCH_AND_ADD: | 346 | case IB_WR_ATOMIC_FETCH_AND_ADD: |
| 397 | if (unlikely(!(qp->qp_access_flags & | 347 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC))) |
| 398 | IB_ACCESS_REMOTE_ATOMIC))) { | 348 | goto inv_err; |
| 399 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
| 400 | goto err; | ||
| 401 | } | ||
| 402 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, sizeof(u64), | 349 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, sizeof(u64), |
| 403 | wqe->wr.wr.atomic.remote_addr, | 350 | wqe->wr.wr.atomic.remote_addr, |
| 404 | wqe->wr.wr.atomic.rkey, | 351 | wqe->wr.wr.atomic.rkey, |
| @@ -415,7 +362,8 @@ again: | |||
| 415 | goto send_comp; | 362 | goto send_comp; |
| 416 | 363 | ||
| 417 | default: | 364 | default: |
| 418 | goto done; | 365 | send_status = IB_WC_LOC_QP_OP_ERR; |
| 366 | goto serr; | ||
| 419 | } | 367 | } |
| 420 | 368 | ||
| 421 | sge = &sqp->s_sge.sge; | 369 | sge = &sqp->s_sge.sge; |
| @@ -458,14 +406,11 @@ again: | |||
| 458 | wc.opcode = IB_WC_RECV; | 406 | wc.opcode = IB_WC_RECV; |
| 459 | wc.wr_id = qp->r_wr_id; | 407 | wc.wr_id = qp->r_wr_id; |
| 460 | wc.status = IB_WC_SUCCESS; | 408 | wc.status = IB_WC_SUCCESS; |
| 461 | wc.vendor_err = 0; | ||
| 462 | wc.byte_len = wqe->length; | 409 | wc.byte_len = wqe->length; |
| 463 | wc.qp = &qp->ibqp; | 410 | wc.qp = &qp->ibqp; |
| 464 | wc.src_qp = qp->remote_qpn; | 411 | wc.src_qp = qp->remote_qpn; |
| 465 | wc.pkey_index = 0; | ||
| 466 | wc.slid = qp->remote_ah_attr.dlid; | 412 | wc.slid = qp->remote_ah_attr.dlid; |
| 467 | wc.sl = qp->remote_ah_attr.sl; | 413 | wc.sl = qp->remote_ah_attr.sl; |
| 468 | wc.dlid_path_bits = 0; | ||
| 469 | wc.port_num = 1; | 414 | wc.port_num = 1; |
| 470 | /* Signal completion event if the solicited bit is set. */ | 415 | /* Signal completion event if the solicited bit is set. */ |
| 471 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, | 416 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, |
| @@ -473,9 +418,63 @@ again: | |||
| 473 | 418 | ||
| 474 | send_comp: | 419 | send_comp: |
| 475 | sqp->s_rnr_retry = sqp->s_rnr_retry_cnt; | 420 | sqp->s_rnr_retry = sqp->s_rnr_retry_cnt; |
| 476 | ipath_send_complete(sqp, wqe, IB_WC_SUCCESS); | 421 | ipath_send_complete(sqp, wqe, send_status); |
| 477 | goto again; | 422 | goto again; |
| 478 | 423 | ||
| 424 | rnr_nak: | ||
| 425 | /* Handle RNR NAK */ | ||
| 426 | if (qp->ibqp.qp_type == IB_QPT_UC) | ||
| 427 | goto send_comp; | ||
| 428 | /* | ||
| 429 | * Note: we don't need the s_lock held since the BUSY flag | ||
| 430 | * makes this single threaded. | ||
| 431 | */ | ||
| 432 | if (sqp->s_rnr_retry == 0) { | ||
| 433 | send_status = IB_WC_RNR_RETRY_EXC_ERR; | ||
| 434 | goto serr; | ||
| 435 | } | ||
| 436 | if (sqp->s_rnr_retry_cnt < 7) | ||
| 437 | sqp->s_rnr_retry--; | ||
| 438 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
| 439 | if (!(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_RECV_OK)) | ||
| 440 | goto unlock; | ||
| 441 | dev->n_rnr_naks++; | ||
| 442 | sqp->s_rnr_timeout = ib_ipath_rnr_table[qp->r_min_rnr_timer]; | ||
| 443 | ipath_insert_rnr_queue(sqp); | ||
| 444 | goto unlock; | ||
| 445 | |||
| 446 | inv_err: | ||
| 447 | send_status = IB_WC_REM_INV_REQ_ERR; | ||
| 448 | wc.status = IB_WC_LOC_QP_OP_ERR; | ||
| 449 | goto err; | ||
| 450 | |||
| 451 | acc_err: | ||
| 452 | send_status = IB_WC_REM_ACCESS_ERR; | ||
| 453 | wc.status = IB_WC_LOC_PROT_ERR; | ||
| 454 | err: | ||
| 455 | /* responder goes to error state */ | ||
| 456 | ipath_rc_error(qp, wc.status); | ||
| 457 | |||
| 458 | serr: | ||
| 459 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
| 460 | ipath_send_complete(sqp, wqe, send_status); | ||
| 461 | if (sqp->ibqp.qp_type == IB_QPT_RC) { | ||
| 462 | int lastwqe = ipath_error_qp(sqp, IB_WC_WR_FLUSH_ERR); | ||
| 463 | |||
| 464 | sqp->s_flags &= ~IPATH_S_BUSY; | ||
| 465 | spin_unlock_irqrestore(&sqp->s_lock, flags); | ||
| 466 | if (lastwqe) { | ||
| 467 | struct ib_event ev; | ||
| 468 | |||
| 469 | ev.device = sqp->ibqp.device; | ||
| 470 | ev.element.qp = &sqp->ibqp; | ||
| 471 | ev.event = IB_EVENT_QP_LAST_WQE_REACHED; | ||
| 472 | sqp->ibqp.event_handler(&ev, sqp->ibqp.qp_context); | ||
| 473 | } | ||
| 474 | goto done; | ||
| 475 | } | ||
| 476 | unlock: | ||
| 477 | spin_unlock_irqrestore(&sqp->s_lock, flags); | ||
| 479 | done: | 478 | done: |
| 480 | if (atomic_dec_and_test(&qp->refcount)) | 479 | if (atomic_dec_and_test(&qp->refcount)) |
| 481 | wake_up(&qp->wait); | 480 | wake_up(&qp->wait); |
| @@ -651,21 +650,15 @@ void ipath_send_complete(struct ipath_qp *qp, struct ipath_swqe *wqe, | |||
| 651 | status != IB_WC_SUCCESS) { | 650 | status != IB_WC_SUCCESS) { |
| 652 | struct ib_wc wc; | 651 | struct ib_wc wc; |
| 653 | 652 | ||
| 653 | memset(&wc, 0, sizeof wc); | ||
| 654 | wc.wr_id = wqe->wr.wr_id; | 654 | wc.wr_id = wqe->wr.wr_id; |
| 655 | wc.status = status; | 655 | wc.status = status; |
| 656 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 656 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; |
| 657 | wc.vendor_err = 0; | ||
| 658 | wc.byte_len = wqe->length; | ||
| 659 | wc.imm_data = 0; | ||
| 660 | wc.qp = &qp->ibqp; | 657 | wc.qp = &qp->ibqp; |
| 661 | wc.src_qp = 0; | 658 | if (status == IB_WC_SUCCESS) |
| 662 | wc.wc_flags = 0; | 659 | wc.byte_len = wqe->length; |
| 663 | wc.pkey_index = 0; | 660 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, |
| 664 | wc.slid = 0; | 661 | status != IB_WC_SUCCESS); |
| 665 | wc.sl = 0; | ||
| 666 | wc.dlid_path_bits = 0; | ||
| 667 | wc.port_num = 0; | ||
| 668 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0); | ||
| 669 | } | 662 | } |
| 670 | 663 | ||
| 671 | spin_lock_irqsave(&qp->s_lock, flags); | 664 | spin_lock_irqsave(&qp->s_lock, flags); |
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c index 5015cd2e57bd..22bb42dc8f73 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.c +++ b/drivers/infiniband/hw/ipath/ipath_verbs.c | |||
| @@ -744,12 +744,10 @@ static void ipath_ib_timer(struct ipath_ibdev *dev) | |||
| 744 | 744 | ||
| 745 | /* XXX What if timer fires again while this is running? */ | 745 | /* XXX What if timer fires again while this is running? */ |
| 746 | for (qp = resend; qp != NULL; qp = qp->timer_next) { | 746 | for (qp = resend; qp != NULL; qp = qp->timer_next) { |
| 747 | struct ib_wc wc; | ||
| 748 | |||
| 749 | spin_lock_irqsave(&qp->s_lock, flags); | 747 | spin_lock_irqsave(&qp->s_lock, flags); |
| 750 | if (qp->s_last != qp->s_tail && qp->state == IB_QPS_RTS) { | 748 | if (qp->s_last != qp->s_tail && qp->state == IB_QPS_RTS) { |
| 751 | dev->n_timeouts++; | 749 | dev->n_timeouts++; |
| 752 | ipath_restart_rc(qp, qp->s_last_psn + 1, &wc); | 750 | ipath_restart_rc(qp, qp->s_last_psn + 1); |
| 753 | } | 751 | } |
| 754 | spin_unlock_irqrestore(&qp->s_lock, flags); | 752 | spin_unlock_irqrestore(&qp->s_lock, flags); |
| 755 | 753 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.h b/drivers/infiniband/hw/ipath/ipath_verbs.h index 6514aa8306cd..4c7c2aa8e19d 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.h +++ b/drivers/infiniband/hw/ipath/ipath_verbs.h | |||
| @@ -710,8 +710,6 @@ void ipath_free_all_qps(struct ipath_qp_table *qpt); | |||
| 710 | 710 | ||
| 711 | int ipath_init_qp_table(struct ipath_ibdev *idev, int size); | 711 | int ipath_init_qp_table(struct ipath_ibdev *idev, int size); |
| 712 | 712 | ||
| 713 | void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc); | ||
| 714 | |||
| 715 | void ipath_get_credit(struct ipath_qp *qp, u32 aeth); | 713 | void ipath_get_credit(struct ipath_qp *qp, u32 aeth); |
| 716 | 714 | ||
| 717 | unsigned ipath_ib_rate_to_mult(enum ib_rate rate); | 715 | unsigned ipath_ib_rate_to_mult(enum ib_rate rate); |
| @@ -729,7 +727,9 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
| 729 | void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | 727 | void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, |
| 730 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); | 728 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); |
| 731 | 729 | ||
| 732 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc); | 730 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn); |
| 731 | |||
| 732 | void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err); | ||
| 733 | 733 | ||
| 734 | int ipath_post_ud_send(struct ipath_qp *qp, struct ib_send_wr *wr); | 734 | int ipath_post_ud_send(struct ipath_qp *qp, struct ib_send_wr *wr); |
| 735 | 735 | ||
