Fix "grep: Version.h: No such file or directory" error when including the core LUFA...
[pub/USBasp.git] / Demos / Host / LowLevel / MassStorageHost / Lib / MassStoreCommands.c
index c86e51b..0b9b846 100644 (file)
@@ -1,24 +1,24 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2013.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2013  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
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
@@ -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
@@ -116,12 +127,12 @@ static uint8_t MassStore_WaitForDataReceived(void)
        /* Select the IN data pipe for data reception */
        Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE);
        Pipe_Unfreeze();
-       
+
        /* 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 (CurrentFrameNumber != PreviousFrameNumber)
                {
@@ -133,7 +144,7 @@ static uint8_t MassStore_WaitForDataReceived(void)
                        if (!(TimeoutMSRem))
                          return PIPE_RWSTREAM_Timeout;
                }
-       
+
                Pipe_Freeze();
                Pipe_SelectPipe(MASS_STORE_DATA_OUT_PIPE);
                Pipe_Unfreeze();
@@ -142,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();
@@ -155,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();
 
@@ -182,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 */
@@ -213,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();
 
@@ -238,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;
 
@@ -249,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
@@ -302,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);
 
@@ -320,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;
 }
 
@@ -342,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    =
@@ -362,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
@@ -393,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 =
@@ -413,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
@@ -450,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    =
@@ -474,24 +470,9 @@ uint8_t MassStore_ReadDeviceBlock(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 Block Write command to the attached device, to write one or more data blocks to the
@@ -511,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    =
@@ -535,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
@@ -564,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    =
@@ -584,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
@@ -618,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    =
@@ -639,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;
 }
@@ -675,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    =
@@ -695,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);
 }
+