Tag the LUFA 120730 release.
[pub/lufa.git] / Demos / Host / LowLevel / MassStorageHost / Lib / MassStoreCommands.c
index b94bbca..e2887f5 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2012.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
-  without fee, provided that the above copyright notice appear in 
+  without fee, provided that the above copyright notice appear in
   all copies and that both that the copyright notice and this
-  permission notice and warranty disclaimer appear in supporting 
-  documentation, and that the name of the author not be used in 
-  advertising or publicity pertaining to distribution of the 
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
@@ -46,7 +46,7 @@
  *        larger value in the project makefile and passing it to the compiler
  *        via the -D switch.
  */
+
 #define  INCLUDE_FROM_MASSSTORE_COMMANDS_C
 #include "MassStoreCommands.h"
 
@@ -63,44 +63,55 @@ static uint32_t MassStore_Tag = 1;
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
-static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlock,
+static uint8_t MassStore_SendCommand(MS_CommandBlockWrapper_t* const SCSICommandBlock,
                                      void* BufferPtr)
 {
        uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 
-       /* Each transmission should have a unique tag value, increment before use */
-       SCSICommandBlock->Tag = ++MassStore_Tag;
-
        /* Wrap Tag value when invalid - MS class defines tag values of 0 and 0xFFFFFFFF to be invalid */
-       if (MassStore_Tag == 0xFFFFFFFF)
+       if (++MassStore_Tag == 0xFFFFFFFF)
          MassStore_Tag = 1;
 
+       /* Each transmission should have a unique tag value, increment before use */
+       SCSICommandBlock->Tag = MassStore_Tag;
+
        /* Select the OUT data pipe for CBW transmission */
        Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE);
        Pipe_Unfreeze();
 
        /* Write the CBW command to the OUT pipe */
-       if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(CommandBlockWrapper_t))) != PIPE_RWSTREAM_NoError)
-         return ErrorCode;
+       if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(MS_CommandBlockWrapper_t), NULL)) !=
+                                             PIPE_RWSTREAM_NoError)
+       {
+               Pipe_Freeze();
+               return ErrorCode;
+       }
 
        /* Send the data in the OUT pipe to the attached device */
        Pipe_ClearOUT();
-       
+
        /* Wait until command has been sent */
        Pipe_WaitUntilReady();
 
        /* Freeze pipe after use */
        Pipe_Freeze();
-       
-       /* Send data if any */
-       if ((BufferPtr != NULL) &&
-           ((ErrorCode = MassStore_SendReceiveData(SCSICommandBlock, BufferPtr)) != PIPE_READYWAIT_NoError))
+
+       if (BufferPtr != NULL)
        {
-               Pipe_Freeze();
-               return ErrorCode;
+               /* Transfer the requested data (if any) to or from the device */
+               ErrorCode = MassStore_SendReceiveData(SCSICommandBlock, (void*)BufferPtr);
+
+               /* Only fail completely if the transfer fails without a STALL, as a logical STALL can be recovered from */
+               if ((ErrorCode != PIPE_RWSTREAM_NoError) && (ErrorCode != PIPE_RWSTREAM_PipeStalled))
+               {
+                       Pipe_Freeze();
+                       return ErrorCode;
+               }
        }
-               
-       return ErrorCode;
+
+       /* Retrieve the returned SCSI status from the device */
+       MS_CommandStatusWrapper_t SCSIStatusBlock;
+       return MassStore_GetReturnedStatus(&SCSIStatusBlock);
 }
 
 /** Waits until the attached device is ready to accept data following a CBW, checking
@@ -110,7 +121,8 @@ static uint8_t MassStore_SendCommand(CommandBlockWrapper_t* const SCSICommandBlo
  */
 static uint8_t MassStore_WaitForDataReceived(void)
 {
-       uint16_t TimeoutMSRem = COMMAND_DATA_TIMEOUT_MS;
+       uint16_t TimeoutMSRem        = COMMAND_DATA_TIMEOUT_MS;
+       uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
 
        /* Select the IN data pipe for data reception */
        Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
@@ -119,18 +131,20 @@ static uint8_t MassStore_WaitForDataReceived(void)
        /* Wait until data received in the IN pipe */
        while (!(Pipe_IsINReceived()))
        {
+               uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
                /* Check to see if a new frame has been issued (1ms elapsed) */
-               if (USB_INT_HasOccurred(USB_INT_HSOFI))
+               if (CurrentFrameNumber != PreviousFrameNumber)
                {
-                       /* Clear the flag and decrement the timeout period counter */
-                       USB_INT_Clear(USB_INT_HSOFI);
+                       /* Save the new frame number and decrement the timeout period */
+                       PreviousFrameNumber = CurrentFrameNumber;
                        TimeoutMSRem--;
 
                        /* Check to see if the timeout period for the command has elapsed */
                        if (!(TimeoutMSRem))
                          return PIPE_RWSTREAM_Timeout;
                }
-       
+
                Pipe_Freeze();
                Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE);
                Pipe_Unfreeze();
@@ -139,11 +153,11 @@ static uint8_t MassStore_WaitForDataReceived(void)
                if (Pipe_IsStalled())
                {
                        /* Clear the stall condition on the OUT pipe */
-                       USB_Host_ClearPipeStall(MASS_STORE_DATA_OUT_PIPE);
+                       USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
 
                        return PIPE_RWSTREAM_PipeStalled;
                }
-               
+
                Pipe_Freeze();
                Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
                Pipe_Unfreeze();
@@ -152,19 +166,19 @@ static uint8_t MassStore_WaitForDataReceived(void)
                if (Pipe_IsStalled())
                {
                        /* Clear the stall condition on the IN pipe */
-                       USB_Host_ClearPipeStall(MASS_STORE_DATA_IN_PIPE);
+                       USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
 
                        return PIPE_RWSTREAM_PipeStalled;
                }
-                 
+
                /* Check to see if the device was disconnected, if so exit function */
                if (USB_HostState == HOST_STATE_Unattached)
                  return PIPE_RWSTREAM_DeviceDisconnected;
        };
-       
+
        Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
        Pipe_Freeze();
-               
+
        Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE);
        Pipe_Freeze();
 
@@ -179,25 +193,25 @@ static uint8_t MassStore_WaitForDataReceived(void)
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum
  */
-static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSICommandBlock,
+static uint8_t MassStore_SendReceiveData(MS_CommandBlockWrapper_t* const SCSICommandBlock,
                                          void* BufferPtr)
 {
        uint8_t  ErrorCode = PIPE_RWSTREAM_NoError;
        uint16_t BytesRem  = SCSICommandBlock->DataTransferLength;
 
        /* Check the direction of the SCSI command data stage */
-       if (SCSICommandBlock->Flags & COMMAND_DIRECTION_DATA_IN)
+       if (SCSICommandBlock->Flags & MS_COMMAND_DIR_DATA_IN)
        {
                /* Wait until the device has replied with some data */
                if ((ErrorCode = MassStore_WaitForDataReceived()) != PIPE_RWSTREAM_NoError)
                  return ErrorCode;
-       
+
                /* Select the IN data pipe for data reception */
                Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
                Pipe_Unfreeze();
-               
+
                /* Read in the block data from the pipe */
-               if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_NoError)
+               if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError)
                  return ErrorCode;
 
                /* Acknowledge the packet */
@@ -210,19 +224,19 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSIComman
                Pipe_Unfreeze();
 
                /* Write the block data to the pipe */
-               if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_NoError)
+               if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError)
                  return ErrorCode;
 
                /* Acknowledge the packet */
                Pipe_ClearOUT();
-               
+
                while (!(Pipe_IsOUTReady()))
                {
                        if (USB_HostState == HOST_STATE_Unattached)
                          return PIPE_RWSTREAM_DeviceDisconnected;
                }
        }
-       
+
        /* Freeze used pipe after use */
        Pipe_Freeze();
 
@@ -235,7 +249,7 @@ static uint8_t MassStore_SendReceiveData(CommandBlockWrapper_t* const SCSIComman
  *
  *  \return A value from the Pipe_Stream_RW_ErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails
  */
-static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICommandStatus)
+static uint8_t MassStore_GetReturnedStatus(MS_CommandStatusWrapper_t* const SCSICommandStatus)
 {
        uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 
@@ -246,44 +260,65 @@ static uint8_t MassStore_GetReturnedStatus(CommandStatusWrapper_t* const SCSICom
        /* Select the IN data pipe for data reception */
        Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
        Pipe_Unfreeze();
-       
+
        /* Load in the CSW from the attached device */
-       if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(CommandStatusWrapper_t))) != PIPE_RWSTREAM_NoError)
-         return ErrorCode;
-         
+       if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(MS_CommandStatusWrapper_t), NULL)) !=
+                                            PIPE_RWSTREAM_NoError)
+       {
+               return ErrorCode;
+       }
+
        /* Clear the data ready for next reception */
        Pipe_ClearIN();
-       
+
        /* Freeze the IN pipe after use */
        Pipe_Freeze();
-       
+
        /* Check to see if command failed */
-       if (SCSICommandStatus->Status != Command_Pass)
+       if (SCSICommandStatus->Status != MS_SCSI_COMMAND_Pass)
          ErrorCode = MASS_STORE_SCSI_COMMAND_FAILED;
-       
+
        return ErrorCode;
 }
 
 /** Issues a Mass Storage class specific request to reset the attached device's Mass Storage interface,
- *  readying the device for the next CBW.
+ *  readying the device for the next CBW. The Data endpoints are cleared of any STALL condition once this
+ *  command completes successfully.
  *
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum, or MASS_STORE_SCSI_COMMAND_FAILED if the SCSI command fails
  */
 uint8_t MassStore_MassStorageReset(void)
 {
+       uint8_t ErrorCode;
+
        USB_ControlRequest = (USB_Request_Header_t)
                {
                        .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
-                       .bRequest      = REQ_MassStorageReset,
+                       .bRequest      = MS_REQ_MassStorageReset,
                        .wValue        = 0,
                        .wIndex        = 0,
                        .wLength       = 0,
                };
-       
+
        /* Select the control pipe for the request transfer */
        Pipe_SelectPipe(PIPE_CONTROLPIPE);
 
-       return USB_Host_SendControlRequest(NULL);
+       if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+         return ErrorCode;
+
+       /* Select first data pipe to clear STALL condition if one exists */
+       Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
+
+       if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful)
+         return ErrorCode;
+
+       /* Select second data pipe to clear STALL condition if one exists */
+       Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE);
+
+       if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful)
+         return ErrorCode;
+
+       return HOST_SENDCONTROL_Successful;
 }
 
 /** Issues a Mass Storage class specific request to determine the index of the highest numbered Logical
@@ -299,17 +334,17 @@ uint8_t MassStore_MassStorageReset(void)
  */
 uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
 {
-       uint8_t ErrorCode = HOST_SENDCONTROL_Successful;
+       uint8_t ErrorCode;
 
        USB_ControlRequest = (USB_Request_Header_t)
                {
                        .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
-                       .bRequest      = REQ_GetMaxLUN,
+                       .bRequest      = MS_REQ_GetMaxLUN,
                        .wValue        = 0,
                        .wIndex        = 0,
                        .wLength       = 1,
                };
-               
+
        /* Select the control pipe for the request transfer */
        Pipe_SelectPipe(PIPE_CONTROLPIPE);
 
@@ -317,14 +352,14 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
        {
                /* Clear the pipe stall */
                Pipe_ClearStall();
-       
+
                /* Some faulty Mass Storage devices don't implement the GET_MAX_LUN request, so assume a single LUN */
                *MaxLUNIndex = 0;
-               
+
                /* Clear the error, and pretend the request executed correctly if the device STALLed it */
                ErrorCode = HOST_SENDCONTROL_Successful;
        }
-       
+
        return ErrorCode;
 }
 
@@ -339,14 +374,12 @@ uint8_t MassStore_GetMaxLUN(uint8_t* const MaxLUNIndex)
 uint8_t MassStore_Inquiry(const uint8_t LUNIndex,
                           SCSI_Inquiry_Response_t* const InquiryPtr)
 {
-       uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
-
        /* Create a CBW with a SCSI command to issue INQUIRY command */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = sizeof(SCSI_Inquiry_Response_t),
-                       .Flags              = COMMAND_DIRECTION_DATA_IN,
+                       .Flags              = MS_COMMAND_DIR_DATA_IN,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 6,
                        .SCSICommandData    =
@@ -359,24 +392,9 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex,
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
-       if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, InquiryPtr)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-
-       return ErrorCode;
+       return MassStore_SendCommand(&SCSICommandBlock, InquiryPtr);
 }
 
 /** Issues a SCSI Request Sense command to the attached device, to determine the current SCSI sense information. This
@@ -390,14 +408,12 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex,
 uint8_t MassStore_RequestSense(const uint8_t LUNIndex,
                                SCSI_Request_Sense_Response_t* const SensePtr)
 {
-       uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
-
        /* Create a CBW with a SCSI command to issue REQUEST SENSE command */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = sizeof(SCSI_Request_Sense_Response_t),
-                       .Flags              = COMMAND_DIRECTION_DATA_IN,
+                       .Flags              = MS_COMMAND_DIR_DATA_IN,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 6,
                        .SCSICommandData =
@@ -410,24 +426,9 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex,
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
-       if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, SensePtr)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-
-       return ErrorCode;
+       return MassStore_SendCommand(&SCSICommandBlock, SensePtr);
 }
 
 /** Issues a SCSI Device Block Read command to the attached device, to read in one or more data blocks from the
@@ -447,14 +448,12 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex,
                                   const uint16_t BlockSize,
                                   void* BufferPtr)
 {
-       uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
-
        /* Create a CBW with a SCSI command to read in the given blocks from the device */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = ((uint32_t)Blocks * BlockSize),
-                       .Flags              = COMMAND_DIRECTION_DATA_IN,
+                       .Flags              = MS_COMMAND_DIR_DATA_IN,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 10,
                        .SCSICommandData    =
@@ -465,30 +464,15 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex,
                                        (BlockAddress >> 16),
                                        (BlockAddress >> 8),
                                        (BlockAddress & 0xFF),  // LSB of Block Address
-                                       0x00,                   // Unused (reserved)
+                                       0x00,                   // Reserved
                                        0x00,                   // MSB of Total Blocks to Read
                                        Blocks,                 // LSB of Total Blocks to Read
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
-       if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, BufferPtr)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-
-       return ErrorCode;
+       return MassStore_SendCommand(&SCSICommandBlock, BufferPtr);
 }
 
 /** Issues a SCSI Device Block Write command to the attached device, to write one or more data blocks to the
@@ -508,14 +492,12 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex,
                                    const uint16_t BlockSize,
                                    void* BufferPtr)
 {
-       uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
-
        /* Create a CBW with a SCSI command to write the given blocks to the device */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = ((uint32_t)Blocks * BlockSize),
-                       .Flags              = COMMAND_DIRECTION_DATA_OUT,
+                       .Flags              = MS_COMMAND_DIR_DATA_OUT,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 10,
                        .SCSICommandData    =
@@ -532,24 +514,9 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex,
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
-       if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, BufferPtr)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-
-       return ErrorCode;
+       return MassStore_SendCommand(&SCSICommandBlock, BufferPtr);
 }
 
 /** Issues a SCSI Device Test Unit Ready command to the attached device, to determine if the device is ready to accept
@@ -561,14 +528,12 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex,
  */
 uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex)
 {
-       uint8_t ErrorCode = PIPE_RWSTREAM_NoError;      
-
        /* Create a CBW with a SCSI command to issue TEST UNIT READY command */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = 0,
-                       .Flags              = COMMAND_DIRECTION_DATA_IN,
+                       .Flags              = MS_COMMAND_DIR_DATA_IN,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 6,
                        .SCSICommandData    =
@@ -581,24 +546,9 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex)
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
-       if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-
-       return ErrorCode;
+       return MassStore_SendCommand(&SCSICommandBlock, NULL);
 }
 
 /** Issues a SCSI Device Read Capacity command to the attached device, to determine the capacity of the
@@ -615,11 +565,11 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex,
        uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
 
        /* Create a CBW with a SCSI command to issue READ CAPACITY command */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = sizeof(SCSI_Capacity_t),
-                       .Flags              = COMMAND_DIRECTION_DATA_IN,
+                       .Flags              = MS_COMMAND_DIR_DATA_IN,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 10,
                        .SCSICommandData    =
@@ -636,26 +586,14 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex,
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
        if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, CapacityPtr)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-         
+         return ErrorCode;
+
        /* Endian-correct the read data */
        CapacityPtr->Blocks    = SwapEndian_32(CapacityPtr->Blocks);
        CapacityPtr->BlockSize = SwapEndian_32(CapacityPtr->BlockSize);
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
 
        return ErrorCode;
 }
@@ -672,14 +610,12 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex,
 uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex,
                                             const bool PreventRemoval)
 {
-       uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
-
        /* Create a CBW with a SCSI command to issue PREVENT ALLOW MEDIUM REMOVAL command */
-       CommandBlockWrapper_t SCSICommandBlock = (CommandBlockWrapper_t)
+       MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
-                       .Signature          = CBW_SIGNATURE,
+                       .Signature          = MS_CBW_SIGNATURE,
                        .DataTransferLength = 0,
-                       .Flags              = COMMAND_DIRECTION_DATA_OUT,
+                       .Flags              = MS_COMMAND_DIR_DATA_OUT,
                        .LUN                = LUNIndex,
                        .SCSICommandLength  = 6,
                        .SCSICommandData    =
@@ -692,22 +628,8 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex,
                                        0x00                    // Unused (control)
                                }
                };
-       
-       CommandStatusWrapper_t SCSICommandStatus;
 
        /* Send the command and any data to the attached device */
-       if ((ErrorCode = MassStore_SendCommand(&SCSICommandBlock, NULL)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-       
-       /* Retrieve status information from the attached device */
-       if ((ErrorCode = MassStore_GetReturnedStatus(&SCSICommandStatus)) != PIPE_RWSTREAM_NoError)
-       {
-               Pipe_Freeze();
-               return ErrorCode;
-       }
-
-       return ErrorCode;
+       return MassStore_SendCommand(&SCSICommandBlock, NULL);
 }
+