Move DHCP negotiation timer into the DHCP connection application state structure...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / RNDIS.c
index af88721..c7bf482 100644 (file)
@@ -1,13 +1,13 @@
 /*\r
              LUFA Library\r
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
 \r
   Permission to use, copy, modify, distribute, and sell this \r
   software and its documentation for any purpose is hereby granted\r
 \r
   Permission to use, copy, modify, distribute, and sell this \r
   software and its documentation for any purpose is hereby granted\r
   this software.\r
 */\r
 \r
   this software.\r
 */\r
 \r
+#define  __INCLUDE_FROM_USB_DRIVER\r
 #include "../../HighLevel/USBMode.h"\r
 #if defined(USB_CAN_BE_HOST)\r
 \r
 #include "../../HighLevel/USBMode.h"\r
 #if defined(USB_CAN_BE_HOST)\r
 \r
-#define  INCLUDE_FROM_RNDIS_CLASS_HOST_C\r
+#define  __INCLUDE_FROM_RNDIS_CLASS_HOST_C\r
+#define  __INCLUDE_FROM_RNDIS_DRIVER\r
 #include "RNDIS.h"\r
 \r
 uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, uint16_t ConfigDescriptorSize,\r
 #include "RNDIS.h"\r
 \r
 uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, uint16_t ConfigDescriptorSize,\r
@@ -110,12 +112,6 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
                {\r
                        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
                        {\r
                {\r
                        if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)\r
                        {\r
-                               if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))\r
-                               {\r
-                                       RNDISInterfaceInfo->State.BidirectionalDataEndpoints = true;\r
-                                       Pipe_DisablePipe();\r
-                               }\r
-\r
                                Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,\r
                                                   EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
                                                   RNDISInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
                                Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataINPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_IN,\r
                                                   EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
                                                   RNDISInterfaceInfo->Config.DataINPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
@@ -125,17 +121,10 @@ uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfa
                        }\r
                        else\r
                        {\r
                        }\r
                        else\r
                        {\r
-                               if (Pipe_IsEndpointBound(EndpointData->EndpointAddress))\r
-                               {\r
-                                       RNDISInterfaceInfo->State.BidirectionalDataEndpoints = true;\r
-                               }\r
-                               else\r
-                               {\r
-                                       Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,\r
-                                                          EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
-                                                          RNDISInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
-                               }\r
-                               \r
+                               Pipe_ConfigurePipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber, EP_TYPE_BULK, PIPE_TOKEN_OUT,\r
+                                                  EndpointData->EndpointAddress, EndpointData->EndpointSize, \r
+                                                  RNDISInterfaceInfo->Config.DataOUTPipeDoubleBank ? PIPE_BANK_DOUBLE : PIPE_BANK_SINGLE);\r
+\r
                                RNDISInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;\r
                                \r
                                FoundEndpoints |= RNDIS_FOUND_DATAPIPE_OUT;\r
                                RNDISInterfaceInfo->State.DataOUTPipeSize = EndpointData->EndpointSize;\r
                                \r
                                FoundEndpoints |= RNDIS_FOUND_DATAPIPE_OUT;\r
@@ -192,7 +181,8 @@ static uint8_t DComp_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDe
        \r
                uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);\r
        \r
        \r
                uint8_t EndpointType = (CurrentEndpoint->Attributes & EP_TYPE_MASK);\r
        \r
-               if ((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT))\r
+               if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&\r
+                   !(Pipe_IsEndpointBound(CurrentEndpoint->EndpointAddress)))\r
                {\r
                        return DESCRIPTOR_SEARCH_Found;\r
                }\r
                {\r
                        return DESCRIPTOR_SEARCH_Found;\r
                }\r
@@ -205,11 +195,6 @@ static uint8_t DComp_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDe
        return DESCRIPTOR_SEARCH_NotFound;\r
 }\r
 \r
        return DESCRIPTOR_SEARCH_NotFound;\r
 }\r
 \r
-void RNDIS_Host_USBTask(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo)\r
-{\r
-       (void)RNDISInterfaceInfo;\r
-}\r
-\r
 static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,\r
                                              void* Buffer, uint16_t Length)\r
 {\r
 static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,\r
                                              void* Buffer, uint16_t Length)\r
 {\r
@@ -397,7 +382,7 @@ bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfac
        \r
        Pipe_Unfreeze();\r
 \r
        \r
        Pipe_Unfreeze();\r
 \r
-       PacketWaiting = Pipe_IsINReceived();\r
+       PacketWaiting = (Pipe_IsINReceived() && Pipe_BytesInPipe());\r
        \r
        Pipe_Freeze();\r
        \r
        \r
        Pipe_Freeze();\r
        \r
@@ -417,6 +402,9 @@ uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
        \r
        if (!(Pipe_IsReadWriteAllowed()))\r
        {\r
        \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
                *PacketLength = 0;\r
                Pipe_Freeze();\r
                return PIPE_RWSTREAM_NoError;\r
@@ -436,7 +424,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
                            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
 \r
        Pipe_Freeze();\r
        \r
@@ -450,39 +440,28 @@ uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceIn
        if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))\r
          return PIPE_READYWAIT_DeviceDisconnected;\r
 \r
        if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))\r
          return PIPE_READYWAIT_DeviceDisconnected;\r
 \r
-       if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)\r
-       {\r
-               Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipeNumber);\r
-               Pipe_SetPipeToken(PIPE_TOKEN_OUT);\r
-       }\r
-       else\r
-       {\r
-               Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);  \r
-       }\r
-\r
-       Pipe_Unfreeze();\r
-\r
        RNDIS_Packet_Message_t DeviceMessage;\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.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
        \r
+       Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipeNumber);\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
                return ErrorCode;\r
        }\r
        if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),\r
                                              NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)\r
        {\r
                return ErrorCode;\r
        }\r
-       \r
+\r
        Pipe_Write_Stream_LE(Buffer, PacketLength, NO_STREAM_CALLBACK);\r
        Pipe_ClearOUT();\r
 \r
        Pipe_Freeze();\r
        \r
        Pipe_Write_Stream_LE(Buffer, PacketLength, NO_STREAM_CALLBACK);\r
        Pipe_ClearOUT();\r
 \r
        Pipe_Freeze();\r
        \r
-       if (RNDISInterfaceInfo->State.BidirectionalDataEndpoints)\r
-         Pipe_SetPipeToken(PIPE_TOKEN_IN);\r
-       \r
        return PIPE_RWSTREAM_NoError;\r
 }\r
 \r
        return PIPE_RWSTREAM_NoError;\r
 }\r
 \r