Lines Matching refs:mad_send_wr

747 				  struct ib_mad_send_wr_private *mad_send_wr)
750 struct ib_smp *smp = mad_send_wr->send_buf.mad;
760 struct ib_ud_wr *send_wr = &mad_send_wr->send_wr;
845 mad_wc.byte_len = mad_send_wr->send_buf.hdr_len
846 + mad_send_wr->send_buf.data_len
900 local->mad_send_wr = mad_send_wr;
902 local->mad_send_wr->send_wr.pkey_index = out_mad_pkey_index;
930 static void free_send_rmpp_list(struct ib_mad_send_wr_private *mad_send_wr)
934 list_for_each_entry_safe(s, t, &mad_send_wr->rmpp_list, list) {
996 struct ib_mad_send_wr_private *mad_send_wr;
1023 buf = kzalloc(sizeof *mad_send_wr + size, gfp_mask);
1027 mad_send_wr = (struct ib_mad_send_wr_private *)((char *)buf + size);
1028 INIT_LIST_HEAD(&mad_send_wr->rmpp_list);
1029 mad_send_wr->send_buf.mad = buf;
1030 mad_send_wr->send_buf.hdr_len = hdr_len;
1031 mad_send_wr->send_buf.data_len = data_len;
1032 mad_send_wr->pad = pad;
1034 mad_send_wr->mad_agent_priv = mad_agent_priv;
1035 mad_send_wr->sg_list[0].length = hdr_len;
1036 mad_send_wr->sg_list[0].lkey = mad_agent->qp->pd->local_dma_lkey;
1041 mad_send_wr->sg_list[1].length = data_len;
1043 mad_send_wr->sg_list[1].length = mad_size - hdr_len;
1045 mad_send_wr->sg_list[1].lkey = mad_agent->qp->pd->local_dma_lkey;
1047 mad_send_wr->mad_list.cqe.done = ib_mad_send_done;
1049 mad_send_wr->send_wr.wr.wr_cqe = &mad_send_wr->mad_list.cqe;
1050 mad_send_wr->send_wr.wr.sg_list = mad_send_wr->sg_list;
1051 mad_send_wr->send_wr.wr.num_sge = 2;
1052 mad_send_wr->send_wr.wr.opcode = IB_WR_SEND;
1053 mad_send_wr->send_wr.wr.send_flags = IB_SEND_SIGNALED;
1054 mad_send_wr->send_wr.remote_qpn = remote_qpn;
1055 mad_send_wr->send_wr.remote_qkey = IB_QP_SET_QKEY;
1056 mad_send_wr->send_wr.pkey_index = pkey_index;
1059 ret = alloc_send_rmpp_list(mad_send_wr, mad_size, gfp_mask);
1066 mad_send_wr->send_buf.mad_agent = mad_agent;
1068 return &mad_send_wr->send_buf;
1103 struct ib_mad_send_wr_private *mad_send_wr;
1106 mad_send_wr = container_of(send_buf, struct ib_mad_send_wr_private,
1108 list = &mad_send_wr->cur_seg->list;
1110 if (mad_send_wr->cur_seg->num < seg_num) {
1111 list_for_each_entry(mad_send_wr->cur_seg, list, list)
1112 if (mad_send_wr->cur_seg->num == seg_num)
1114 } else if (mad_send_wr->cur_seg->num > seg_num) {
1115 list_for_each_entry_reverse(mad_send_wr->cur_seg, list, list)
1116 if (mad_send_wr->cur_seg->num == seg_num)
1119 return mad_send_wr->cur_seg->data;
1123 static inline void *ib_get_payload(struct ib_mad_send_wr_private *mad_send_wr)
1125 if (mad_send_wr->send_buf.seg_count)
1126 return ib_get_rmpp_segment(&mad_send_wr->send_buf,
1127 mad_send_wr->seg_num);
1129 return (char *)mad_send_wr->send_buf.mad +
1130 mad_send_wr->send_buf.hdr_len;
1136 struct ib_mad_send_wr_private *mad_send_wr;
1140 mad_send_wr = container_of(send_buf, struct ib_mad_send_wr_private,
1143 free_send_rmpp_list(mad_send_wr);
1149 int ib_send_mad(struct ib_mad_send_wr_private *mad_send_wr)
1159 /* Set WR ID to find mad_send_wr upon completion */
1160 qp_info = mad_send_wr->mad_agent_priv->qp_info;
1161 mad_send_wr->mad_list.mad_queue = &qp_info->send_queue;
1162 mad_send_wr->mad_list.cqe.done = ib_mad_send_done;
1163 mad_send_wr->send_wr.wr.wr_cqe = &mad_send_wr->mad_list.cqe;
1165 mad_agent = mad_send_wr->send_buf.mad_agent;
1166 sge = mad_send_wr->sg_list;
1168 mad_send_wr->send_buf.mad,
1174 mad_send_wr->header_mapping = sge[0].addr;
1177 ib_get_payload(mad_send_wr),
1182 mad_send_wr->header_mapping,
1186 mad_send_wr->payload_mapping = sge[1].addr;
1190 ret = ib_post_send(mad_agent->qp, &mad_send_wr->send_wr.wr,
1200 list_add_tail(&mad_send_wr->mad_list.list, list);
1205 mad_send_wr->header_mapping,
1208 mad_send_wr->payload_mapping,
1223 struct ib_mad_send_wr_private *mad_send_wr;
1230 mad_send_wr = container_of(send_buf,
1233 mad_agent_priv = mad_send_wr->mad_agent_priv;
1255 mad_send_wr->send_wr.ah = send_buf->ah;
1260 mad_send_wr);
1267 mad_send_wr->tid = ((struct ib_mad_hdr *) send_buf->mad)->tid;
1269 mad_send_wr->timeout = msecs_to_jiffies(send_buf->timeout_ms);
1270 mad_send_wr->max_retries = send_buf->retries;
1271 mad_send_wr->retries_left = send_buf->retries;
1274 mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0);
1275 mad_send_wr->status = IB_WC_SUCCESS;
1280 list_add_tail(&mad_send_wr->agent_list,
1285 ret = ib_send_rmpp_mad(mad_send_wr);
1287 ret = ib_send_mad(mad_send_wr);
1289 ret = ib_send_mad(mad_send_wr);
1293 list_del(&mad_send_wr->agent_list);
1954 void ib_mark_mad_done(struct ib_mad_send_wr_private *mad_send_wr)
1956 mad_send_wr->timeout = 0;
1957 if (mad_send_wr->refcount == 1)
1958 list_move_tail(&mad_send_wr->agent_list,
1959 &mad_send_wr->mad_agent_priv->done_list);
1965 struct ib_mad_send_wr_private *mad_send_wr;
1983 mad_send_wr = ib_find_send_mad(mad_agent_priv, mad_recv_wc);
1984 if (!mad_send_wr) {
2005 ib_mark_mad_done(mad_send_wr);
2011 &mad_send_wr->send_buf,
2017 mad_send_wc.send_buf = &mad_send_wr->send_buf;
2018 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc);
2321 struct ib_mad_send_wr_private *mad_send_wr;
2327 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2332 mad_send_wr->timeout)) {
2333 mad_agent_priv->timeout = mad_send_wr->timeout;
2334 delay = mad_send_wr->timeout - jiffies;
2343 static void wait_for_response(struct ib_mad_send_wr_private *mad_send_wr)
2350 mad_agent_priv = mad_send_wr->mad_agent_priv;
2351 list_del(&mad_send_wr->agent_list);
2353 delay = mad_send_wr->timeout;
2354 mad_send_wr->timeout += jiffies;
2361 if (time_after(mad_send_wr->timeout,
2368 list_add(&mad_send_wr->agent_list, list_item);
2371 if (mad_agent_priv->wait_list.next == &mad_send_wr->agent_list)
2376 void ib_reset_mad_timeout(struct ib_mad_send_wr_private *mad_send_wr,
2379 mad_send_wr->timeout = msecs_to_jiffies(timeout_ms);
2380 wait_for_response(mad_send_wr);
2386 void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,
2393 mad_agent_priv = mad_send_wr->mad_agent_priv;
2396 ret = ib_process_rmpp_send_wc(mad_send_wr, mad_send_wc);
2403 mad_send_wr->status == IB_WC_SUCCESS) {
2404 mad_send_wr->status = mad_send_wc->status;
2405 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2408 if (--mad_send_wr->refcount > 0) {
2409 if (mad_send_wr->refcount == 1 && mad_send_wr->timeout &&
2410 mad_send_wr->status == IB_WC_SUCCESS) {
2411 wait_for_response(mad_send_wr);
2417 list_del(&mad_send_wr->agent_list);
2421 if (mad_send_wr->status != IB_WC_SUCCESS )
2422 mad_send_wc->status = mad_send_wr->status;
2441 struct ib_mad_send_wr_private *mad_send_wr, *queued_send_wr;
2457 mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private,
2463 ib_dma_unmap_single(mad_send_wr->send_buf.mad_agent->device,
2464 mad_send_wr->header_mapping,
2465 mad_send_wr->sg_list[0].length, DMA_TO_DEVICE);
2466 ib_dma_unmap_single(mad_send_wr->send_buf.mad_agent->device,
2467 mad_send_wr->payload_mapping,
2468 mad_send_wr->sg_list[1].length, DMA_TO_DEVICE);
2484 mad_send_wc.send_buf = &mad_send_wr->send_buf;
2488 snoop_send(qp_info, &mad_send_wr->send_buf, &mad_send_wc,
2490 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc);
2498 mad_send_wr = queued_send_wr;
2507 struct ib_mad_send_wr_private *mad_send_wr;
2513 mad_send_wr = container_of(mad_list,
2516 mad_send_wr->retry = 1;
2527 struct ib_mad_send_wr_private *mad_send_wr;
2534 mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private,
2537 if (mad_send_wr->retry) {
2541 mad_send_wr->retry = 0;
2542 ret = ib_post_send(qp_info->qp, &mad_send_wr->send_wr.wr,
2573 struct ib_mad_send_wr_private *mad_send_wr, *temp_mad_send_wr;
2580 list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
2582 if (mad_send_wr->status == IB_WC_SUCCESS) {
2583 mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
2584 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2596 list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
2598 mad_send_wc.send_buf = &mad_send_wr->send_buf;
2599 list_del(&mad_send_wr->agent_list);
2610 struct ib_mad_send_wr_private *mad_send_wr;
2612 list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list,
2614 if (&mad_send_wr->send_buf == send_buf)
2615 return mad_send_wr;
2618 list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
2621 mad_send_wr->send_buf.mad) &&
2622 &mad_send_wr->send_buf == send_buf)
2623 return mad_send_wr;
2632 struct ib_mad_send_wr_private *mad_send_wr;
2639 mad_send_wr = find_send_wr(mad_agent_priv, send_buf);
2640 if (!mad_send_wr || mad_send_wr->status != IB_WC_SUCCESS) {
2645 active = (!mad_send_wr->timeout || mad_send_wr->refcount > 1);
2647 mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
2648 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2651 mad_send_wr->send_buf.timeout_ms = timeout_ms;
2653 mad_send_wr->timeout = msecs_to_jiffies(timeout_ms);
2655 ib_reset_mad_timeout(mad_send_wr, timeout_ms);
2709 local->mad_send_wr->send_wr.wr.wr_cqe,
2711 local->mad_send_wr->send_wr.pkey_index,
2737 &local->mad_send_wr->send_buf,
2748 mad_send_wc.send_buf = &local->mad_send_wr->send_buf;
2751 &local->mad_send_wr->send_buf,
2765 static int retry_send(struct ib_mad_send_wr_private *mad_send_wr)
2769 if (!mad_send_wr->retries_left)
2772 mad_send_wr->retries_left--;
2773 mad_send_wr->send_buf.retries++;
2775 mad_send_wr->timeout = msecs_to_jiffies(mad_send_wr->send_buf.timeout_ms);
2777 if (ib_mad_kernel_rmpp_agent(&mad_send_wr->mad_agent_priv->agent)) {
2778 ret = ib_retry_rmpp(mad_send_wr);
2781 ret = ib_send_mad(mad_send_wr);
2791 ret = ib_send_mad(mad_send_wr);
2794 mad_send_wr->refcount++;
2795 list_add_tail(&mad_send_wr->agent_list,
2796 &mad_send_wr->mad_agent_priv->send_list);
2804 struct ib_mad_send_wr_private *mad_send_wr;
2814 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2818 if (time_after(mad_send_wr->timeout, jiffies)) {
2819 delay = mad_send_wr->timeout - jiffies;
2828 list_del(&mad_send_wr->agent_list);
2829 if (mad_send_wr->status == IB_WC_SUCCESS &&
2830 !retry_send(mad_send_wr))
2835 if (mad_send_wr->status == IB_WC_SUCCESS)
2838 mad_send_wc.status = mad_send_wr->status;
2839 mad_send_wc.send_buf = &mad_send_wr->send_buf;