static int rndis_filter_receive_data(struct net_device *ndev,
                                     struct netvsc_device *nvdev,
-                                    struct rndis_message *msg,
                                     struct vmbus_channel *channel,
-                                    void *data, u32 data_buflen)
+                                    struct rndis_message *msg,
+                                    u32 data_buflen)
 {
        struct rndis_packet *rndis_pkt = &msg->msg.pkt;
        const struct ndis_tcp_ip_checksum_info *csum_info;
        const struct ndis_pkt_8021q_info *vlan;
        u32 data_offset;
+       void *data;
 
        /* Remove the rndis header and pass it back up the stack */
        data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset;
 
        vlan = rndis_get_ppi(rndis_pkt, IEEE_8021Q_INFO);
 
+       csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
+
+       data = (void *)msg + data_offset;
+
        /*
         * Remove the rndis trailer padding from rndis packet message
         * rndis_pkt->data_len tell us the real data length, we only copy
         * the data packet to the stack, without the rndis trailer padding
         */
-       data = (void *)((unsigned long)data + data_offset);
-       csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
-
        return netvsc_recv_callback(ndev, nvdev, channel,
                                    data, rndis_pkt->data_len,
                                    csum_info, vlan);
 
        switch (rndis_msg->ndis_msg_type) {
        case RNDIS_MSG_PACKET:
-               return rndis_filter_receive_data(ndev, net_dev, rndis_msg,
-                                                channel, data, buflen);
+               return rndis_filter_receive_data(ndev, net_dev, channel,
+                                                rndis_msg, buflen);
        case RNDIS_MSG_INIT_C:
        case RNDIS_MSG_QUERY_C:
        case RNDIS_MSG_SET_C: