}
 
 static void netvsc_send_recv_completion(struct hv_device *device,
-                                       u64 transaction_id)
+                                       u64 transaction_id, u32 status)
 {
        struct nvsp_message recvcompMessage;
        int retries = 0;
        recvcompMessage.hdr.msg_type =
                                NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE;
 
-       /* FIXME: Pass in the status */
-       recvcompMessage.msg.v1_msg.send_rndis_pkt_complete.status =
-               NVSP_STAT_SUCCESS;
+       recvcompMessage.msg.v1_msg.send_rndis_pkt_complete.status = status;
 
 retry_send_cmplt:
        /* Send the completion */
        bool fsend_receive_comp = false;
        unsigned long flags;
        struct net_device *ndev;
+       u32 status = NVSP_STAT_NONE;
 
        /*
         * Even though it seems logical to do a GetOutboundNetDevice() here to
        /* Overloading use of the lock. */
        spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
 
+       if (packet->status != NVSP_STAT_SUCCESS)
+               packet->xfer_page_pkt->status = NVSP_STAT_FAIL;
+
        packet->xfer_page_pkt->count--;
 
        /*
        if (packet->xfer_page_pkt->count == 0) {
                fsend_receive_comp = true;
                transaction_id = packet->completion.recv.recv_completion_tid;
+               status = packet->xfer_page_pkt->status;
                list_add_tail(&packet->xfer_page_pkt->list_ent,
                              &net_device->recv_pkt_list);
 
 
        /* Send a receive completion for the xfer page packet */
        if (fsend_receive_comp)
-               netvsc_send_recv_completion(device, transaction_id);
+               netvsc_send_recv_completion(device, transaction_id, status);
 
 }
 
                                       flags);
 
                netvsc_send_recv_completion(device,
-                                           vmxferpage_packet->d.trans_id);
+                                           vmxferpage_packet->d.trans_id,
+                                           NVSP_STAT_FAIL);
 
                return;
        }
        /* Remove the 1st packet to represent the xfer page packet itself */
        xferpage_packet = (struct xferpage_packet *)listHead.next;
        list_del(&xferpage_packet->list_ent);
+       xferpage_packet->status = NVSP_STAT_SUCCESS;
 
        /* This is how much we can satisfy */
        xferpage_packet->count = count - 1;
                list_del(&netvsc_packet->list_ent);
 
                /* Initialize the netvsc packet */
+               netvsc_packet->status = NVSP_STAT_SUCCESS;
                netvsc_packet->xfer_page_pkt = xferpage_packet;
                netvsc_packet->completion.recv.recv_completion =
                                        netvsc_receive_completion;
 
        struct rndis_device *rndis_dev;
        struct rndis_message *rndis_msg;
        struct net_device *ndev;
+       int ret = 0;
 
-       if (!net_dev)
-               return -EINVAL;
+       if (!net_dev) {
+               ret = -EINVAL;
+               goto exit;
+       }
 
        ndev = net_dev->ndev;
 
        if (!net_dev->extension) {
                netdev_err(ndev, "got rndis message but no rndis device - "
                          "dropping this message!\n");
-               return -ENODEV;
+               ret = -ENODEV;
+               goto exit;
        }
 
        rndis_dev = (struct rndis_device *)net_dev->extension;
        if (rndis_dev->state == RNDIS_DEV_UNINITIALIZED) {
                netdev_err(ndev, "got rndis message but rndis device "
                           "uninitialized...dropping this message!\n");
-               return -ENODEV;
+               ret = -ENODEV;
+               goto exit;
        }
 
        rndis_msg = pkt->data;
                break;
        }
 
-       return 0;
+exit:
+       if (ret != 0)
+               pkt->status = NVSP_STAT_FAIL;
+
+       return ret;
 }
 
 static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,