808}
809
810static int alloc_send_rmpp_list(struct ib_mad_send_wr_private *send_wr,
811 gfp_t gfp_mask)
812{
813 struct ib_mad_send_buf *send_buf = &send_wr->send_buf;
814 struct ib_rmpp_mad *rmpp_mad = send_buf->mad;
815 struct ib_rmpp_segment *seg = NULL;
816 int left, seg_size, pad;
817
818 send_buf->seg_size = sizeof (struct ib_mad) - send_buf->hdr_len;
819 seg_size = send_buf->seg_size;
820 pad = send_wr->pad;
821
822
823 for (left = send_buf->data_len + pad; left > 0; left -= seg_size) {
824 seg = kmalloc(sizeof (*seg) + seg_size, gfp_mask);
825 if (!seg) {
826 printk(KERN_ERR "alloc_send_rmpp_segs: RMPP mem "
827 "alloc failed for len %zd, gfp %#x\n",
828 sizeof (*seg) + seg_size, gfp_mask);
829 free_send_rmpp_list(send_wr);
830 return -ENOMEM;
831 }
832 seg->num = ++send_buf->seg_count;
833 list_add_tail(&seg->list, &send_wr->rmpp_list);
834 }
835
836
837 if (pad)
838 memset(seg->data + seg_size - pad, 0, pad);
839
840 rmpp_mad->rmpp_hdr.rmpp_version = send_wr->mad_agent_priv->
841 agent.rmpp_version;
842 rmpp_mad->rmpp_hdr.rmpp_type = IB_MGMT_RMPP_TYPE_DATA;
843 ib_set_rmpp_flags(&rmpp_mad->rmpp_hdr, IB_MGMT_RMPP_FLAG_ACTIVE);
844
845 send_wr->cur_seg = container_of(send_wr->rmpp_list.next,
846 struct ib_rmpp_segment, list);
847 send_wr->last_ack_seg = send_wr->cur_seg;
848 return 0;