user_mad: Add receive side RMPP support

Signed-off-by: Hal Rosenstock <[EMAIL PROTECTED]>

Index: user_mad.c
===================================================================
--- user_mad.c  (revision 2757)
+++ user_mad.c  (working copy)
@@ -176,7 +176,7 @@
        if (mad_recv_wc->wc->status != IB_WC_SUCCESS)
                goto out;
 
-       length = 256;   /* until RMPP is supported */
+       length = mad_recv_wc->mad_len; 
        packet = kmalloc(sizeof *packet + length, GFP_KERNEL);
        if (!packet)
                goto out;
@@ -184,7 +184,8 @@
        memset(packet, 0, sizeof *packet + length);
        packet->length = length;
 
-       memcpy(packet->mad.data, mad_recv_wc->recv_buf.mad, length);
+       ib_coalesce_recv_mad(mad_recv_wc, packet->mad.data);
+
        packet->mad.hdr.status    = 0;
        packet->mad.hdr.qpn       = cpu_to_be32(mad_recv_wc->wc->src_qp);
        packet->mad.hdr.lid       = cpu_to_be16(mad_recv_wc->wc->slid);
@@ -214,7 +215,7 @@
        struct ib_umad_packet *packet;
        ssize_t ret;
 
-       if (count < sizeof (struct ib_user_mad) + 256) /* until RMPP supported 
*/ 
+       if (count < sizeof (struct ib_user_mad) + 256)
                return -EINVAL;
 
        spin_lock_irq(&file->recv_lock);
@@ -238,13 +239,14 @@
        spin_unlock_irq(&file->recv_lock);
 
        if (count < packet->length + sizeof (struct ib_user_mad))
-               ret = -EINVAL;
+               /* return length needed if too small */
+               ret = packet->length + sizeof (struct ib_user_mad);
        else if (copy_to_user(buf, &packet->mad,
                              packet->length + sizeof (struct ib_user_mad)))
                ret = -EFAULT;
        else
                ret = packet->length + sizeof (struct ib_user_mad);
-       if (ret < 0) {
+       if (ret < 0 || count < packet->length + sizeof (struct ib_user_mad)) {
                /* Requeue packet */
                spin_lock_irq(&file->recv_lock);
                list_add(&packet->list, &file->recv_list);



_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to