Altered the Mass Storage Host class driver so that SCSI data STALLs from the attached...
[pub/USBasp.git] / Demos / Host / LowLevel / MassStorageHost / Lib / MassStoreCommands.c
index 765d0ed..3546bb2 100644 (file)
@@ -83,6 +83,7 @@ static uint8_t MassStore_SendCommand(MS_CommandBlockWrapper_t* const SCSICommand
        if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(MS_CommandBlockWrapper_t), NULL)) !=
                                              PIPE_RWSTREAM_NoError)
        {
+               Pipe_Freeze();
                return ErrorCode;
        }
 
@@ -95,15 +96,22 @@ static uint8_t MassStore_SendCommand(MS_CommandBlockWrapper_t* const SCSICommand
        /* Freeze pipe after use */
        Pipe_Freeze();
 
-       /* Send data if any has been given */
-       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);
 
-       return ErrorCode;
+               /* 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;
+               }
+       }
+       
+       /* 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
@@ -366,8 +374,6 @@ 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 */
        MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
@@ -387,23 +393,8 @@ uint8_t MassStore_Inquiry(const uint8_t LUNIndex,
                                }
                };
 
-       MS_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
@@ -417,8 +408,6 @@ 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 */
        MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
@@ -438,23 +427,8 @@ uint8_t MassStore_RequestSense(const uint8_t LUNIndex,
                                }
                };
 
-       MS_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
@@ -474,8 +448,6 @@ 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 */
        MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
@@ -499,23 +471,8 @@ uint8_t MassStore_ReadDeviceBlock(const uint8_t LUNIndex,
                                }
                };
 
-       MS_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
@@ -535,8 +492,6 @@ 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 */
        MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
@@ -560,23 +515,8 @@ uint8_t MassStore_WriteDeviceBlock(const uint8_t LUNIndex,
                                }
                };
 
-       MS_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
@@ -588,8 +528,6 @@ 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 */
        MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
@@ -609,23 +547,8 @@ uint8_t MassStore_TestUnitReady(const uint8_t LUNIndex)
                                }
                };
 
-       MS_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
@@ -664,26 +587,14 @@ uint8_t MassStore_ReadCapacity(const uint8_t LUNIndex,
                                }
                };
 
-       MS_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;
 }
 
@@ -699,8 +610,6 @@ 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 */
        MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
                {
@@ -720,22 +629,7 @@ uint8_t MassStore_PreventAllowMediumRemoval(const uint8_t LUNIndex,
                                }
                };
 
-       MS_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);
 }