[openib-general] [PATCH] [RMPP] receive RMPP support
Sean Hefty
sean.hefty at intel.com
Fri Mar 18 18:38:51 PST 2005
On a separate note, I'd like to solicit comments about exposing the
following (with slight modifications), in ib_verbs.h, ib_mad.h, and/or
ib_mad_helper.h.
- Sean
>+struct rmpp_msg {
>+ struct ib_mad_agent *mad_agent;
>+ struct ib_send_wr send_wr;
>+ struct ib_sge sge;
>+ DECLARE_PCI_UNMAP_ADDR(mapping)
>+ struct ib_rmpp_mad mad;
>+};
>+
>+static struct ib_ah * create_ah_from_wc(struct ib_pd *pd, struct ib_wc
>*wc,
>+ u8 port_num)
>+{
>+ struct ib_ah_attr *ah_attr;
>+ struct ib_ah *ah;
>+
>+ ah_attr = kmalloc(sizeof *ah_attr, GFP_KERNEL);
>+ if (!ah_attr)
>+ return ERR_PTR(-ENOMEM);
>+
>+ memset(ah_attr, 0, sizeof *ah_attr);
>+ ah_attr->dlid = wc->slid;
>+ ah_attr->sl = wc->sl;
>+ ah_attr->src_path_bits = wc->dlid_path_bits;
>+ ah_attr->port_num = port_num;
>+
>+ ah = ib_create_ah(pd, ah_attr);
>+ kfree(ah_attr);
>+ return ah;
>+}
>+
>+static struct rmpp_msg * alloc_rmpp_msg(struct ib_mad_agent *mad_agent,
>+ u32 remote_qpn, u16 pkey_index,
>+ struct ib_ah *ah)
>+{
>+ struct rmpp_msg *msg;
>+
>+ msg = kmalloc(sizeof *msg, GFP_KERNEL);
>+ if (!msg)
>+ return NULL;
>+ memset(msg, 0, sizeof *msg);
>+
>+ msg->sge.addr = dma_map_single(mad_agent->device->dma_device,
>+ &msg->mad, sizeof msg->mad,
>+ DMA_TO_DEVICE);
>+ pci_unmap_addr_set(msg, mapping, msg->sge.addr);
>+ msg->sge.length = sizeof msg->mad;
>+ msg->sge.lkey = mad_agent->mr->lkey;
>+
>+ msg->send_wr.wr_id = (unsigned long) msg;
>+ msg->send_wr.sg_list = &msg->sge;
>+ msg->send_wr.num_sge = 1;
>+ msg->send_wr.opcode = IB_WR_SEND;
>+ msg->send_wr.send_flags = IB_SEND_SIGNALED;
>+ msg->send_wr.wr.ud.ah = ah;
>+ msg->send_wr.wr.ud.mad_hdr = &msg->mad.mad_hdr;
>+ msg->send_wr.wr.ud.remote_qpn = remote_qpn;
>+ msg->send_wr.wr.ud.remote_qkey = IB_QP_SET_QKEY;
>+ msg->send_wr.wr.ud.pkey_index = pkey_index;
>+
>+ msg->mad_agent = mad_agent;
>+ return msg;
>+}
>+
>+static void free_rmpp_msg(struct rmpp_msg *msg)
>+{
>+ dma_unmap_single(msg->mad_agent->device->dma_device,
>+ pci_unmap_addr(msg, mapping),
>+ sizeof msg->mad, DMA_TO_DEVICE);
>+ kfree(msg);
More information about the general
mailing list