Lines Matching refs:mad_send_wr

58 static void create_mad_addr_info(struct ib_mad_send_wr_private *mad_send_wr,
62 struct ib_ud_wr *wr = &mad_send_wr->send_wr;
594 struct ib_mad_send_wr_private *mad_send_wr)
597 struct ib_smp *smp = mad_send_wr->send_buf.mad;
607 struct ib_ud_wr *send_wr = &mad_send_wr->send_wr;
694 mad_wc.byte_len = mad_send_wr->send_buf.hdr_len
695 + mad_send_wr->send_buf.data_len
748 local->mad_send_wr = mad_send_wr;
750 local->mad_send_wr->send_wr.pkey_index = out_mad_pkey_index;
778 static void free_send_rmpp_list(struct ib_mad_send_wr_private *mad_send_wr)
782 list_for_each_entry_safe(s, t, &mad_send_wr->rmpp_list, list) {
840 struct ib_mad_send_wr_private *mad_send_wr;
867 buf = kzalloc(sizeof *mad_send_wr + size, gfp_mask);
871 mad_send_wr = buf + size;
872 INIT_LIST_HEAD(&mad_send_wr->rmpp_list);
873 mad_send_wr->send_buf.mad = buf;
874 mad_send_wr->send_buf.hdr_len = hdr_len;
875 mad_send_wr->send_buf.data_len = data_len;
876 mad_send_wr->pad = pad;
878 mad_send_wr->mad_agent_priv = mad_agent_priv;
879 mad_send_wr->sg_list[0].length = hdr_len;
880 mad_send_wr->sg_list[0].lkey = mad_agent->qp->pd->local_dma_lkey;
885 mad_send_wr->sg_list[1].length = data_len;
887 mad_send_wr->sg_list[1].length = mad_size - hdr_len;
889 mad_send_wr->sg_list[1].lkey = mad_agent->qp->pd->local_dma_lkey;
891 mad_send_wr->mad_list.cqe.done = ib_mad_send_done;
893 mad_send_wr->send_wr.wr.wr_cqe = &mad_send_wr->mad_list.cqe;
894 mad_send_wr->send_wr.wr.sg_list = mad_send_wr->sg_list;
895 mad_send_wr->send_wr.wr.num_sge = 2;
896 mad_send_wr->send_wr.wr.opcode = IB_WR_SEND;
897 mad_send_wr->send_wr.wr.send_flags = IB_SEND_SIGNALED;
898 mad_send_wr->send_wr.remote_qpn = remote_qpn;
899 mad_send_wr->send_wr.remote_qkey = IB_QP_SET_QKEY;
900 mad_send_wr->send_wr.pkey_index = pkey_index;
903 ret = alloc_send_rmpp_list(mad_send_wr, mad_size, gfp_mask);
910 mad_send_wr->send_buf.mad_agent = mad_agent;
912 return &mad_send_wr->send_buf;
947 struct ib_mad_send_wr_private *mad_send_wr;
950 mad_send_wr = container_of(send_buf, struct ib_mad_send_wr_private,
952 list = &mad_send_wr->cur_seg->list;
954 if (mad_send_wr->cur_seg->num < seg_num) {
955 list_for_each_entry(mad_send_wr->cur_seg, list, list)
956 if (mad_send_wr->cur_seg->num == seg_num)
958 } else if (mad_send_wr->cur_seg->num > seg_num) {
959 list_for_each_entry_reverse(mad_send_wr->cur_seg, list, list)
960 if (mad_send_wr->cur_seg->num == seg_num)
963 return mad_send_wr->cur_seg->data;
967 static inline void *ib_get_payload(struct ib_mad_send_wr_private *mad_send_wr)
969 if (mad_send_wr->send_buf.seg_count)
970 return ib_get_rmpp_segment(&mad_send_wr->send_buf,
971 mad_send_wr->seg_num);
973 return mad_send_wr->send_buf.mad +
974 mad_send_wr->send_buf.hdr_len;
980 struct ib_mad_send_wr_private *mad_send_wr;
984 mad_send_wr = container_of(send_buf, struct ib_mad_send_wr_private,
987 free_send_rmpp_list(mad_send_wr);
993 int ib_send_mad(struct ib_mad_send_wr_private *mad_send_wr)
1002 /* Set WR ID to find mad_send_wr upon completion */
1003 qp_info = mad_send_wr->mad_agent_priv->qp_info;
1004 mad_send_wr->mad_list.mad_queue = &qp_info->send_queue;
1005 mad_send_wr->mad_list.cqe.done = ib_mad_send_done;
1006 mad_send_wr->send_wr.wr.wr_cqe = &mad_send_wr->mad_list.cqe;
1008 mad_agent = mad_send_wr->send_buf.mad_agent;
1009 sge = mad_send_wr->sg_list;
1011 mad_send_wr->send_buf.mad,
1017 mad_send_wr->header_mapping = sge[0].addr;
1020 ib_get_payload(mad_send_wr),
1025 mad_send_wr->header_mapping,
1029 mad_send_wr->payload_mapping = sge[1].addr;
1033 trace_ib_mad_ib_send_mad(mad_send_wr, qp_info);
1034 ret = ib_post_send(mad_agent->qp, &mad_send_wr->send_wr.wr,
1044 list_add_tail(&mad_send_wr->mad_list.list, list);
1049 mad_send_wr->header_mapping,
1052 mad_send_wr->payload_mapping,
1067 struct ib_mad_send_wr_private *mad_send_wr;
1073 mad_send_wr = container_of(send_buf,
1076 mad_agent_priv = mad_send_wr->mad_agent_priv;
1079 mad_send_wr->send_wr.pkey_index);
1103 mad_send_wr->send_wr.ah = send_buf->ah;
1108 mad_send_wr);
1115 mad_send_wr->tid = ((struct ib_mad_hdr *) send_buf->mad)->tid;
1117 mad_send_wr->timeout = msecs_to_jiffies(send_buf->timeout_ms);
1118 mad_send_wr->max_retries = send_buf->retries;
1119 mad_send_wr->retries_left = send_buf->retries;
1122 mad_send_wr->refcount = 1 + (mad_send_wr->timeout > 0);
1123 mad_send_wr->status = IB_WC_SUCCESS;
1128 list_add_tail(&mad_send_wr->agent_list,
1133 ret = ib_send_rmpp_mad(mad_send_wr);
1135 ret = ib_send_mad(mad_send_wr);
1137 ret = ib_send_mad(mad_send_wr);
1141 list_del(&mad_send_wr->agent_list);
1773 void ib_mark_mad_done(struct ib_mad_send_wr_private *mad_send_wr)
1775 mad_send_wr->timeout = 0;
1776 if (mad_send_wr->refcount == 1)
1777 list_move_tail(&mad_send_wr->agent_list,
1778 &mad_send_wr->mad_agent_priv->done_list);
1784 struct ib_mad_send_wr_private *mad_send_wr;
1811 mad_send_wr = ib_find_send_mad(mad_agent_priv, mad_recv_wc);
1812 if (!mad_send_wr) {
1834 ib_mark_mad_done(mad_send_wr);
1840 &mad_send_wr->send_buf,
1846 mad_send_wc.send_buf = &mad_send_wr->send_buf;
1847 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc);
2150 struct ib_mad_send_wr_private *mad_send_wr;
2156 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2161 mad_send_wr->timeout)) {
2162 mad_agent_priv->timeout = mad_send_wr->timeout;
2163 delay = mad_send_wr->timeout - jiffies;
2172 static void wait_for_response(struct ib_mad_send_wr_private *mad_send_wr)
2179 mad_agent_priv = mad_send_wr->mad_agent_priv;
2180 list_del(&mad_send_wr->agent_list);
2182 delay = mad_send_wr->timeout;
2183 mad_send_wr->timeout += jiffies;
2190 if (time_after(mad_send_wr->timeout,
2198 list_add(&mad_send_wr->agent_list, list_item);
2201 if (mad_agent_priv->wait_list.next == &mad_send_wr->agent_list)
2206 void ib_reset_mad_timeout(struct ib_mad_send_wr_private *mad_send_wr,
2209 mad_send_wr->timeout = msecs_to_jiffies(timeout_ms);
2210 wait_for_response(mad_send_wr);
2216 void ib_mad_complete_send_wr(struct ib_mad_send_wr_private *mad_send_wr,
2223 mad_agent_priv = mad_send_wr->mad_agent_priv;
2226 ret = ib_process_rmpp_send_wc(mad_send_wr, mad_send_wc);
2233 mad_send_wr->status == IB_WC_SUCCESS) {
2234 mad_send_wr->status = mad_send_wc->status;
2235 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2238 if (--mad_send_wr->refcount > 0) {
2239 if (mad_send_wr->refcount == 1 && mad_send_wr->timeout &&
2240 mad_send_wr->status == IB_WC_SUCCESS) {
2241 wait_for_response(mad_send_wr);
2247 list_del(&mad_send_wr->agent_list);
2251 if (mad_send_wr->status != IB_WC_SUCCESS)
2252 mad_send_wc->status = mad_send_wr->status;
2271 struct ib_mad_send_wr_private *mad_send_wr, *queued_send_wr;
2286 mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private,
2291 trace_ib_mad_send_done_agent(mad_send_wr->mad_agent_priv);
2292 trace_ib_mad_send_done_handler(mad_send_wr, wc);
2295 ib_dma_unmap_single(mad_send_wr->send_buf.mad_agent->device,
2296 mad_send_wr->header_mapping,
2297 mad_send_wr->sg_list[0].length, DMA_TO_DEVICE);
2298 ib_dma_unmap_single(mad_send_wr->send_buf.mad_agent->device,
2299 mad_send_wr->payload_mapping,
2300 mad_send_wr->sg_list[1].length, DMA_TO_DEVICE);
2316 mad_send_wc.send_buf = &mad_send_wr->send_buf;
2319 ib_mad_complete_send_wr(mad_send_wr, &mad_send_wc);
2328 mad_send_wr = queued_send_wr;
2337 struct ib_mad_send_wr_private *mad_send_wr;
2343 mad_send_wr = container_of(mad_list,
2346 mad_send_wr->retry = 1;
2357 struct ib_mad_send_wr_private *mad_send_wr;
2364 mad_send_wr = container_of(mad_list, struct ib_mad_send_wr_private,
2367 if (mad_send_wr->retry) {
2369 mad_send_wr->retry = 0;
2370 trace_ib_mad_error_handler(mad_send_wr, qp_info);
2371 ret = ib_post_send(qp_info->qp, &mad_send_wr->send_wr.wr,
2402 struct ib_mad_send_wr_private *mad_send_wr, *temp_mad_send_wr;
2409 list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
2411 if (mad_send_wr->status == IB_WC_SUCCESS) {
2412 mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
2413 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2425 list_for_each_entry_safe(mad_send_wr, temp_mad_send_wr,
2427 mad_send_wc.send_buf = &mad_send_wr->send_buf;
2428 list_del(&mad_send_wr->agent_list);
2439 struct ib_mad_send_wr_private *mad_send_wr;
2441 list_for_each_entry(mad_send_wr, &mad_agent_priv->wait_list,
2443 if (&mad_send_wr->send_buf == send_buf)
2444 return mad_send_wr;
2447 list_for_each_entry(mad_send_wr, &mad_agent_priv->send_list,
2450 mad_send_wr->send_buf.mad) &&
2451 &mad_send_wr->send_buf == send_buf)
2452 return mad_send_wr;
2460 struct ib_mad_send_wr_private *mad_send_wr;
2470 mad_send_wr = find_send_wr(mad_agent_priv, send_buf);
2471 if (!mad_send_wr || mad_send_wr->status != IB_WC_SUCCESS) {
2476 active = (!mad_send_wr->timeout || mad_send_wr->refcount > 1);
2478 mad_send_wr->status = IB_WC_WR_FLUSH_ERR;
2479 mad_send_wr->refcount -= (mad_send_wr->timeout > 0);
2482 mad_send_wr->send_buf.timeout_ms = timeout_ms;
2484 mad_send_wr->timeout = msecs_to_jiffies(timeout_ms);
2486 ib_reset_mad_timeout(mad_send_wr, timeout_ms);
2533 local->mad_send_wr->send_wr.wr.wr_cqe,
2535 local->mad_send_wr->send_wr.pkey_index,
2557 &local->mad_send_wr->send_buf,
2568 mad_send_wc.send_buf = &local->mad_send_wr->send_buf;
2581 static int retry_send(struct ib_mad_send_wr_private *mad_send_wr)
2585 if (!mad_send_wr->retries_left)
2588 mad_send_wr->retries_left--;
2589 mad_send_wr->send_buf.retries++;
2591 mad_send_wr->timeout = msecs_to_jiffies(mad_send_wr->send_buf.timeout_ms);
2593 if (ib_mad_kernel_rmpp_agent(&mad_send_wr->mad_agent_priv->agent)) {
2594 ret = ib_retry_rmpp(mad_send_wr);
2597 ret = ib_send_mad(mad_send_wr);
2607 ret = ib_send_mad(mad_send_wr);
2610 mad_send_wr->refcount++;
2611 list_add_tail(&mad_send_wr->agent_list,
2612 &mad_send_wr->mad_agent_priv->send_list);
2620 struct ib_mad_send_wr_private *mad_send_wr;
2630 mad_send_wr = list_entry(mad_agent_priv->wait_list.next,
2634 if (time_after(mad_send_wr->timeout, jiffies)) {
2635 delay = mad_send_wr->timeout - jiffies;
2644 list_del(&mad_send_wr->agent_list);
2645 if (mad_send_wr->status == IB_WC_SUCCESS &&
2646 !retry_send(mad_send_wr))
2651 if (mad_send_wr->status == IB_WC_SUCCESS)
2654 mad_send_wc.status = mad_send_wr->status;
2655 mad_send_wc.send_buf = &mad_send_wr->send_buf;