Cleanup and partially fix AVRISP-MKII project's TPI programming support.
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / RNDIS.c
index 46aeb98..fac569e 100644 (file)
@@ -392,7 +392,7 @@ bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfac
        \r
        Pipe_Unfreeze();\r
 \r
-       PacketWaiting = Pipe_IsINReceived();\r
+       PacketWaiting = (Pipe_IsINReceived() && Pipe_BytesInPipe());\r
        \r
        Pipe_Freeze();\r
        \r
@@ -412,6 +412,9 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
        \r
        if (!(Pipe_IsReadWriteAllowed()))\r
        {\r
+               if (Pipe_IsINReceived())\r
+                 Pipe_ClearIN();\r
+       \r
                *PacketLength = 0;\r
                Pipe_Freeze();\r
                return PIPE_RWSTREAM_NoError;\r
@@ -419,11 +422,27 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
 \r
        RNDIS_Packet_Message_t DeviceMessage;\r
        \r
+       if (Pipe_BytesInPipe() < sizeof(RNDIS_Packet_Message_t))\r
+       {\r
+               printf("*SIZE YARG: %d*\r\n", Pipe_BytesInPipe());\r
+               *PacketLength = 0;\r
+               Pipe_ClearIN();\r
+               return RNDIS_COMMAND_FAILED;    \r
+       }\r
+       \r
        if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),\r
                                             NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)\r
        {\r
                return ErrorCode;\r
        }\r
+       \r
+       if (DeviceMessage.MessageType != REMOTE_NDIS_PACKET_MSG)\r
+       {\r
+               printf("****YARG****\r\n");\r
+               *PacketLength = 0;\r
+               Pipe_ClearIN();\r
+               return RNDIS_COMMAND_FAILED;\r
+       }\r
 \r
        *PacketLength = (uint16_t)DeviceMessage.DataLength;\r
        \r
@@ -431,7 +450,9 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
                            NO_STREAM_CALLBACK);\r
                                                \r
        Pipe_Read_Stream_LE(Buffer, *PacketLength, NO_STREAM_CALLBACK);\r
-       Pipe_ClearIN();\r
+       \r
+       if (!(Pipe_BytesInPipe()))\r
+         Pipe_ClearIN();\r
 \r
        Pipe_Freeze();\r
        \r
@@ -455,21 +476,25 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
                Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);  \r
        }\r
 \r
-       Pipe_Unfreeze();\r
-\r
        RNDIS_Packet_Message_t DeviceMessage;\r
-       \r
-       DeviceMessage.MessageType = REMOTE_NDIS_PACKET_MSG;\r
+\r
+       memset(&DeviceMessage, 0, sizeof(RNDIS_Packet_Message_t));\r
+       DeviceMessage.MessageType   = REMOTE_NDIS_PACKET_MSG;\r
        DeviceMessage.MessageLength = (sizeof(RNDIS_Packet_Message_t) + PacketLength);\r
-       DeviceMessage.DataOffset = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));\r
-       DeviceMessage.DataLength = PacketLength;\r
+       DeviceMessage.DataOffset    = (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));\r
+       DeviceMessage.DataLength    = PacketLength;\r
        \r
+       Pipe_Unfreeze();\r
+\r
        if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),\r
                                              NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)\r
        {\r
+               if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)\r
+                 Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
+\r
                return ErrorCode;\r
        }\r
-       \r
+\r
        Pipe_Write_Stream_LE(Buffer, PacketLength, NO_STREAM_CALLBACK);\r
        Pipe_ClearOUT();\r
 \r