/*************************************************************************** * Copyright (c) 2024 Microsoft Corporation * Copyright (c) 2026-present Eclipse ThreadX contributors * * This program and the accompanying materials are made available under the * terms of the MIT License which is available at * https://opensource.org/licenses/MIT. * * SPDX-License-Identifier: MIT **************************************************************************/ /**************************************************************************/ /**************************************************************************/ /** */ /** USBX Component */ /** */ /** Storage Class */ /** */ /**************************************************************************/ /**************************************************************************/ /* Include necessary system files. */ #define UX_SOURCE_CODE #include "ux_api.h" #include "ux_host_class_storage.h" #include "ux_host_stack.h" /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _ux_host_class_storage_device_reset PORTABLE C */ /* 6.1.11 */ /* AUTHOR */ /* */ /* Chaoqiong Xiao, Microsoft Corporation */ /* */ /* DESCRIPTION */ /* */ /* This function will perform a reset on the device if it is a */ /* Bulk Only device. */ /* */ /* INPUT */ /* */ /* storage Pointer to storage class */ /* */ /* OUTPUT */ /* */ /* Completion Status */ /* */ /* CALLS */ /* */ /* _ux_host_stack_transfer_request Process transfer request */ /* _ux_host_stack_endpoint_reset Reset endpoint */ /* */ /* CALLED BY */ /* */ /* Storage Class */ /* */ /**************************************************************************/ UINT _ux_host_class_storage_device_reset(UX_HOST_CLASS_STORAGE *storage) { UX_ENDPOINT *control_endpoint; UX_TRANSFER *transfer_request; UINT status; #ifdef UX_HOST_CLASS_STORAGE_INCLUDE_LEGACY_PROTOCOL_SUPPORT /* We need to perform a reset only for BO devices. */ if (storage -> ux_host_class_storage_interface -> ux_interface_descriptor.bInterfaceProtocol == UX_HOST_CLASS_STORAGE_PROTOCOL_BO) { #endif /* We need to get the default control endpoint transfer request pointer. */ control_endpoint = &storage -> ux_host_class_storage_device -> ux_device_control_endpoint; transfer_request = &control_endpoint -> ux_endpoint_transfer_request; /* We need to prevent other threads from simultaneously using the endpoint. */ _ux_host_semaphore_get_norc(&control_endpoint -> ux_endpoint_device -> ux_device_protection_semaphore, UX_WAIT_FOREVER); /* Create a transfer_request for the RESET request. */ transfer_request -> ux_transfer_request_data_pointer = UX_NULL; transfer_request -> ux_transfer_request_requested_length = 0; transfer_request -> ux_transfer_request_function = UX_HOST_CLASS_STORAGE_RESET; transfer_request -> ux_transfer_request_type = UX_REQUEST_OUT | UX_REQUEST_TYPE_CLASS | UX_REQUEST_TARGET_INTERFACE; transfer_request -> ux_transfer_request_value = 0; transfer_request -> ux_transfer_request_index = storage -> ux_host_class_storage_interface -> ux_interface_descriptor.bInterfaceNumber; /* Send request to HCD layer. */ status = _ux_host_stack_transfer_request(transfer_request); /* Per the spec, reset the endpoints as well. */ _ux_host_stack_endpoint_reset(storage -> ux_host_class_storage_bulk_in_endpoint); _ux_host_stack_endpoint_reset(storage -> ux_host_class_storage_bulk_out_endpoint); /* Return completion status. */ return(status); #ifdef UX_HOST_CLASS_STORAGE_INCLUDE_LEGACY_PROTOCOL_SUPPORT } /* In case the device is not a BO device, we always succeed. */ return(UX_SUCCESS); #endif }