1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11
12 /**************************************************************************/
13 /**************************************************************************/
14 /** */
15 /** USBX Component */
16 /** */
17 /** PIMA Class */
18 /** */
19 /**************************************************************************/
20 /**************************************************************************/
21
22
23 /* Include necessary system files. */
24
25 #define UX_SOURCE_CODE
26
27 #include "ux_api.h"
28 #include "ux_host_class_pima.h"
29 #include "ux_host_stack.h"
30
31
32 /**************************************************************************/
33 /* */
34 /* FUNCTION RELEASE */
35 /* */
36 /* _ux_host_class_pima_object_transfer_abort PORTABLE C */
37 /* 6.1 */
38 /* AUTHOR */
39 /* */
40 /* Chaoqiong Xiao, Microsoft Corporation */
41 /* */
42 /* DESCRIPTION */
43 /* */
44 /* This function aborts a pending transfer to\from an object. */
45 /* INPUT */
46 /* */
47 /* pima Pointer to pima class */
48 /* pima_session Pointer to pima session */
49 /* object_handle The object handle */
50 /* object Pointer to object info */
51 /* */
52 /* OUTPUT */
53 /* */
54 /* Completion Status */
55 /* */
56 /* CALLS */
57 /* */
58 /* _ux_host_class_pima_request_cancel Cancel request */
59 /* */
60 /* CALLED BY */
61 /* */
62 /* USB application */
63 /* */
64 /* RELEASE HISTORY */
65 /* */
66 /* DATE NAME DESCRIPTION */
67 /* */
68 /* 05-19-2020 Chaoqiong Xiao Initial Version 6.0 */
69 /* 09-30-2020 Chaoqiong Xiao Modified comment(s), */
70 /* resulting in version 6.1 */
71 /* */
72 /**************************************************************************/
_ux_host_class_pima_object_transfer_abort(UX_HOST_CLASS_PIMA * pima,UX_HOST_CLASS_PIMA_SESSION * pima_session,ULONG object_handle,UX_HOST_CLASS_PIMA_OBJECT * object)73 UINT _ux_host_class_pima_object_transfer_abort(UX_HOST_CLASS_PIMA *pima,
74 UX_HOST_CLASS_PIMA_SESSION *pima_session,
75 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object)
76 {
77
78 UINT status;
79
80 UX_PARAMETER_NOT_USED(object_handle);
81
82 /* If trace is enabled, insert this event into the trace buffer. */
83 UX_TRACE_IN_LINE_INSERT(UX_TRACE_HOST_CLASS_PIMA_OBJECT_TRANSFER_ABORT, pima, object_handle, object, 0, UX_TRACE_HOST_CLASS_EVENTS, 0, 0)
84
85 /* Check if this session is valid or not. */
86 if (pima_session -> ux_host_class_pima_session_magic != UX_HOST_CLASS_PIMA_MAGIC_NUMBER)
87 return (UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN);
88
89 /* Check if this session is opened or not. */
90 if (pima_session -> ux_host_class_pima_session_state != UX_HOST_CLASS_PIMA_SESSION_STATE_OPENED)
91 return (UX_HOST_CLASS_PIMA_RC_SESSION_NOT_OPEN);
92
93 /* Check if the object is already closed. */
94 if (object -> ux_host_class_pima_object_state != UX_HOST_CLASS_PIMA_OBJECT_STATE_OPENED)
95 return (UX_HOST_CLASS_PIMA_RC_OBJECT_ALREADY_CLOSED );
96
97 /* Cancel the current request. */
98 status = _ux_host_class_pima_request_cancel(pima);
99
100 /* The transfer for this transaction was aborted. No need to issue a status phase when the object is closed. */
101 object -> ux_host_class_pima_object_transfer_status = UX_HOST_CLASS_PIMA_OBJECT_TRANSFER_STATUS_ABORTED;
102
103 /* Reset the potential ZLP condition. */
104 pima -> ux_host_class_pima_zlp_flag = UX_HOST_CLASS_PIMA_ZLP_NONE;
105
106 /* Return completion status. */
107 return(status);
108 }
109
110 /**************************************************************************/
111 /* */
112 /* FUNCTION RELEASE */
113 /* */
114 /* _uxe_host_class_pima_object_transfer_abort PORTABLE C */
115 /* 6.3.0 */
116 /* AUTHOR */
117 /* */
118 /* Yajun Xia, Microsoft Corporation */
119 /* */
120 /* DESCRIPTION */
121 /* */
122 /* This function checks errors in pima object transfer abort function */
123 /* call. */
124 /* */
125 /* INPUT */
126 /* */
127 /* pima Pointer to pima class */
128 /* pima_session Pointer to pima session */
129 /* object_handle The object handle */
130 /* object Pointer to object info */
131 /* */
132 /* OUTPUT */
133 /* */
134 /* Completion Status */
135 /* */
136 /* CALLS */
137 /* */
138 /* _ux_host_class_pima_object_transfer_abort Transfer abort */
139 /* */
140 /* CALLED BY */
141 /* */
142 /* USB application */
143 /* */
144 /* RELEASE HISTORY */
145 /* */
146 /* DATE NAME DESCRIPTION */
147 /* */
148 /* 10-31-2023 Yajun xia Initial Version 6.3.0 */
149 /* */
150 /**************************************************************************/
_uxe_host_class_pima_object_transfer_abort(UX_HOST_CLASS_PIMA * pima,UX_HOST_CLASS_PIMA_SESSION * pima_session,ULONG object_handle,UX_HOST_CLASS_PIMA_OBJECT * object)151 UINT _uxe_host_class_pima_object_transfer_abort(UX_HOST_CLASS_PIMA *pima,
152 UX_HOST_CLASS_PIMA_SESSION *pima_session,
153 ULONG object_handle, UX_HOST_CLASS_PIMA_OBJECT *object)
154 {
155
156 /* Sanity checks. */
157 if ((pima == UX_NULL) || (pima_session == UX_NULL) || (object == UX_NULL))
158 return(UX_INVALID_PARAMETER);
159
160 /* Call the actual pima object transfer abort function. */
161 return(_ux_host_class_pima_object_transfer_abort(pima, pima_session, object_handle, object));
162 }