Fixed incorrect buffer size check in the USBtoSerial project (thanks to Yuri A Nikifo...
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Host / MassStorage.h
index 4a4ae78..ff336f8 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2011.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -38,7 +38,7 @@
  */
 
 /** \ingroup Group_USBClassMS
  */
 
 /** \ingroup Group_USBClassMS
- *  @defgroup Group_USBClassMassStorageHost Mass Storage Class Host Mode Driver
+ *  \defgroup Group_USBClassMassStorageHost Mass Storage Class Host Mode Driver
  *
  *  \section Sec_Dependencies Module Source Dependencies
  *  The following files must be built with any user project that uses this module:
  *
  *  \section Sec_Dependencies Module Source Dependencies
  *  The following files must be built with any user project that uses this module:
                        #error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
                #endif
 
                        #error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
                #endif
 
-               #if defined(__INCLUDE_FROM_MASSSTORAGE_HOST_C) && defined(NO_STREAM_CALLBACKS)
-                       #error The NO_STREAM_CALLBACKS compile time option cannot be used in projects using the library Class drivers.
-               #endif
-
        /* Public Interface - May be used in end-application: */
                /* Macros: */
                        /** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error. */
        /* Public Interface - May be used in end-application: */
                /* Macros: */
                        /** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error. */
@@ -80,7 +76,7 @@
                        /** \brief Mass Storage Class Host Mode Configuration and State Structure.
                         *
                         *  Class state structure. An instance of this structure should be made within the user application,
                        /** \brief Mass Storage Class Host Mode Configuration and State Structure.
                         *
                         *  Class state structure. An instance of this structure should be made within the user application,
-                        *  and passed to each of the Mass Storage class driver functions as the MSInterfaceInfo parameter. This
+                        *  and passed to each of the Mass Storage class driver functions as the \c MSInterfaceInfo parameter. This
                         *  stores each Mass Storage interface's configuration and state information.
                         */
                        typedef struct
                         *  stores each Mass Storage interface's configuration and state information.
                         */
                        typedef struct
                         *  is found within the device. This should be called once after the stack has enumerated the attached device, while
                         *  the host state machine is in the Addressed state.
                         *
                         *  is found within the device. This should be called once after the stack has enumerated the attached device, while
                         *  the host state machine is in the Addressed state.
                         *
-                        *  \note The pipe index numbers as given in the interface's configuration structure must not overlap with any other
-                        *        interface, or pipe bank corruption will occur. Gaps in the allocated pipe numbers or non-sequential indexes
-                        *        within a single interface is allowed, but no two interfaces of any type have have interleaved pipe indexes.
-                        *
                         *  \param[in,out] MSInterfaceInfo       Pointer to a structure containing an MS Class host configuration and state.
                         *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
                         *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
                         *  \param[in,out] MSInterfaceInfo       Pointer to a structure containing an MS Class host configuration and state.
                         *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
                         *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
                                                       void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
 
                        /** Sends a MASS STORAGE RESET control request to the attached device, resetting the Mass Storage Interface
                                                       void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
 
                        /** Sends a MASS STORAGE RESET control request to the attached device, resetting the Mass Storage Interface
-                        *  and readying it for the next Mass Storage command.
+                        *  and readying it for the next Mass Storage command. This should be called after a failed SCSI request to 
+                        *  ensure the attached Mass Storage device is ready to receive the next command.
                         *
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
                         *
                         *
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
                         *
                         *
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
                         *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
                         *
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
                         *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
-                        *  \param[in]     PreventRemoval   Boolean true if the device should be locked from removal, false otherwise.
+                        *  \param[in]     PreventRemoval   Boolean \c true if the device should be locked from removal, \c false otherwise.
                         *
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
                         */
                         *
                         *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
                         */
                         *
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing an Mass Storage Class host configuration and state.
                         */
                         *
                         *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing an Mass Storage Class host configuration and state.
                         */
-                       static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo);
+                       static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
                        static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo)
                        {
                                (void)MSInterfaceInfo;
                        static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo)
                        {
                                (void)MSInterfaceInfo;
 
                /* Function Prototypes: */
                        #if defined(__INCLUDE_FROM_MASSSTORAGE_HOST_C)
 
                /* Function Prototypes: */
                        #if defined(__INCLUDE_FROM_MASSSTORAGE_HOST_C)
-                               static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1);
-                               static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor) ATTR_NON_NULL_PTR_ARG(1);
-
                                static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                                                                   MS_CommandBlockWrapper_t* const SCSICommandBlock,
                                                                   const void* const BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
                                static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
                                static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                                                                       MS_CommandBlockWrapper_t* const SCSICommandBlock,
                                static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                                                                   MS_CommandBlockWrapper_t* const SCSICommandBlock,
                                                                   const void* const BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
                                static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
                                static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                                                                       MS_CommandBlockWrapper_t* const SCSICommandBlock,
-                                                                      void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1)  ATTR_NON_NULL_PTR_ARG(2);
+                                                                      void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
                                static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                                                                         MS_CommandStatusWrapper_t* const SCSICommandStatus)
                                                                         ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
                                static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
                                                                         MS_CommandStatusWrapper_t* const SCSICommandStatus)
                                                                         ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+                               static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor)
+                                                                            ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+                               static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor)
+                                                                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
                        #endif
        #endif
 
                        #endif
        #endif