xref: /freebsd/sys/dev/isci/scil/sci_base_request.h (revision f11c7f63056671247335df83a3fe80b94c6616ac)
1*f11c7f63SJim Harris /*-
2*f11c7f63SJim Harris  * This file is provided under a dual BSD/GPLv2 license.  When using or
3*f11c7f63SJim Harris  * redistributing this file, you may do so under either license.
4*f11c7f63SJim Harris  *
5*f11c7f63SJim Harris  * GPL LICENSE SUMMARY
6*f11c7f63SJim Harris  *
7*f11c7f63SJim Harris  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8*f11c7f63SJim Harris  *
9*f11c7f63SJim Harris  * This program is free software; you can redistribute it and/or modify
10*f11c7f63SJim Harris  * it under the terms of version 2 of the GNU General Public License as
11*f11c7f63SJim Harris  * published by the Free Software Foundation.
12*f11c7f63SJim Harris  *
13*f11c7f63SJim Harris  * This program is distributed in the hope that it will be useful, but
14*f11c7f63SJim Harris  * WITHOUT ANY WARRANTY; without even the implied warranty of
15*f11c7f63SJim Harris  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16*f11c7f63SJim Harris  * General Public License for more details.
17*f11c7f63SJim Harris  *
18*f11c7f63SJim Harris  * You should have received a copy of the GNU General Public License
19*f11c7f63SJim Harris  * along with this program; if not, write to the Free Software
20*f11c7f63SJim Harris  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21*f11c7f63SJim Harris  * The full GNU General Public License is included in this distribution
22*f11c7f63SJim Harris  * in the file called LICENSE.GPL.
23*f11c7f63SJim Harris  *
24*f11c7f63SJim Harris  * BSD LICENSE
25*f11c7f63SJim Harris  *
26*f11c7f63SJim Harris  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27*f11c7f63SJim Harris  * All rights reserved.
28*f11c7f63SJim Harris  *
29*f11c7f63SJim Harris  * Redistribution and use in source and binary forms, with or without
30*f11c7f63SJim Harris  * modification, are permitted provided that the following conditions
31*f11c7f63SJim Harris  * are met:
32*f11c7f63SJim Harris  *
33*f11c7f63SJim Harris  *   * Redistributions of source code must retain the above copyright
34*f11c7f63SJim Harris  *     notice, this list of conditions and the following disclaimer.
35*f11c7f63SJim Harris  *   * Redistributions in binary form must reproduce the above copyright
36*f11c7f63SJim Harris  *     notice, this list of conditions and the following disclaimer in
37*f11c7f63SJim Harris  *     the documentation and/or other materials provided with the
38*f11c7f63SJim Harris  *     distribution.
39*f11c7f63SJim Harris  *
40*f11c7f63SJim Harris  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41*f11c7f63SJim Harris  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42*f11c7f63SJim Harris  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43*f11c7f63SJim Harris  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44*f11c7f63SJim Harris  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45*f11c7f63SJim Harris  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46*f11c7f63SJim Harris  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47*f11c7f63SJim Harris  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48*f11c7f63SJim Harris  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49*f11c7f63SJim Harris  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50*f11c7f63SJim Harris  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51*f11c7f63SJim Harris  *
52*f11c7f63SJim Harris  * $FreeBSD$
53*f11c7f63SJim Harris  */
54*f11c7f63SJim Harris #ifndef _SCI_BASE_REQUST_H_
55*f11c7f63SJim Harris #define _SCI_BASE_REQUST_H_
56*f11c7f63SJim Harris 
57*f11c7f63SJim Harris /**
58*f11c7f63SJim Harris  * @file
59*f11c7f63SJim Harris  *
60*f11c7f63SJim Harris  * @brief This file contains all of the constants, types, and method
61*f11c7f63SJim Harris  *        declarations for the SCI base IO and task request objects.
62*f11c7f63SJim Harris  */
63*f11c7f63SJim Harris 
64*f11c7f63SJim Harris #ifdef __cplusplus
65*f11c7f63SJim Harris extern "C" {
66*f11c7f63SJim Harris #endif // __cplusplus
67*f11c7f63SJim Harris 
68*f11c7f63SJim Harris #include <dev/isci/scil/sci_base_logger.h>
69*f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state_machine.h>
70*f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state_machine_logger.h>
71*f11c7f63SJim Harris 
72*f11c7f63SJim Harris /**
73*f11c7f63SJim Harris  * @enum SCI_BASE_REQUEST_STATES
74*f11c7f63SJim Harris  *
75*f11c7f63SJim Harris  * @brief This enumeration depicts all the states for the common request
76*f11c7f63SJim Harris  *        state machine.
77*f11c7f63SJim Harris  */
78*f11c7f63SJim Harris typedef enum _SCI_BASE_REQUEST_STATES
79*f11c7f63SJim Harris {
80*f11c7f63SJim Harris    /**
81*f11c7f63SJim Harris     * Simply the initial state for the base request state machine.
82*f11c7f63SJim Harris     */
83*f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_INITIAL,
84*f11c7f63SJim Harris 
85*f11c7f63SJim Harris    /**
86*f11c7f63SJim Harris     * This state indicates that the request has been constructed. This state
87*f11c7f63SJim Harris     * is entered from the INITIAL state.
88*f11c7f63SJim Harris     */
89*f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_CONSTRUCTED,
90*f11c7f63SJim Harris 
91*f11c7f63SJim Harris    /**
92*f11c7f63SJim Harris     * This state indicates that the request has been started. This state is
93*f11c7f63SJim Harris     * entered from the CONSTRUCTED state.
94*f11c7f63SJim Harris     */
95*f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_STARTED,
96*f11c7f63SJim Harris 
97*f11c7f63SJim Harris    /**
98*f11c7f63SJim Harris     * This state indicates that the request has completed.
99*f11c7f63SJim Harris     * This state is entered from the STARTED state. This state is entered from
100*f11c7f63SJim Harris     * the ABORTING state.
101*f11c7f63SJim Harris     */
102*f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_COMPLETED,
103*f11c7f63SJim Harris 
104*f11c7f63SJim Harris    /**
105*f11c7f63SJim Harris     * This state indicates that the request is in the process of being
106*f11c7f63SJim Harris     * terminated/aborted.
107*f11c7f63SJim Harris     * This state is entered from the CONSTRUCTED state.
108*f11c7f63SJim Harris     * This state is entered from the STARTED state.
109*f11c7f63SJim Harris     */
110*f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_ABORTING,
111*f11c7f63SJim Harris 
112*f11c7f63SJim Harris    /**
113*f11c7f63SJim Harris     * Simply the final state for the base request state machine.
114*f11c7f63SJim Harris     */
115*f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_FINAL,
116*f11c7f63SJim Harris 
117*f11c7f63SJim Harris    SCI_BASE_REQUEST_MAX_STATES
118*f11c7f63SJim Harris 
119*f11c7f63SJim Harris } SCI_BASE_REQUEST_STATES;
120*f11c7f63SJim Harris 
121*f11c7f63SJim Harris /**
122*f11c7f63SJim Harris  * @struct SCI_BASE_REQUEST
123*f11c7f63SJim Harris  *
124*f11c7f63SJim Harris  * @brief The base request object abstracts the fields common to all SCI IO
125*f11c7f63SJim Harris  *        and task request objects.
126*f11c7f63SJim Harris  */
127*f11c7f63SJim Harris typedef struct SCI_BASE_REQUEST
128*f11c7f63SJim Harris {
129*f11c7f63SJim Harris    /**
130*f11c7f63SJim Harris     * The field specifies that the parent object for the base request is the
131*f11c7f63SJim Harris     * base object itself.
132*f11c7f63SJim Harris     */
133*f11c7f63SJim Harris    SCI_BASE_OBJECT_T parent;
134*f11c7f63SJim Harris 
135*f11c7f63SJim Harris    /**
136*f11c7f63SJim Harris     * This field contains the information for the base request state machine.
137*f11c7f63SJim Harris     */
138*f11c7f63SJim Harris    SCI_BASE_STATE_MACHINE_T state_machine;
139*f11c7f63SJim Harris 
140*f11c7f63SJim Harris    #ifdef SCI_LOGGING
141*f11c7f63SJim Harris    SCI_BASE_STATE_MACHINE_LOGGER_T state_machine_logger;
142*f11c7f63SJim Harris    #endif // SCI_LOGGING
143*f11c7f63SJim Harris 
144*f11c7f63SJim Harris } SCI_BASE_REQUEST_T;
145*f11c7f63SJim Harris 
146*f11c7f63SJim Harris typedef SCI_STATUS (*SCI_BASE_REQUEST_HANDLER_T)(
147*f11c7f63SJim Harris    SCI_BASE_REQUEST_T * this_request
148*f11c7f63SJim Harris );
149*f11c7f63SJim Harris 
150*f11c7f63SJim Harris /**
151*f11c7f63SJim Harris  * @struct SCI_BASE_REQUEST_STATE_HANDLER
152*f11c7f63SJim Harris  *
153*f11c7f63SJim Harris  * @brief This structure contains all of the state handler methods common to
154*f11c7f63SJim Harris  *        base IO and task request state machines.  Handler methods provide
155*f11c7f63SJim Harris  *        the ability to change the behavior for user requests or
156*f11c7f63SJim Harris  *        transitions depending on the state the machine is in.
157*f11c7f63SJim Harris  *
158*f11c7f63SJim Harris  */
159*f11c7f63SJim Harris typedef struct SCI_BASE_REQUEST_STATE_HANDLER
160*f11c7f63SJim Harris {
161*f11c7f63SJim Harris    /**
162*f11c7f63SJim Harris     * The start_handler specifies the method invoked when a user attempts to
163*f11c7f63SJim Harris     * start a request.
164*f11c7f63SJim Harris     */
165*f11c7f63SJim Harris    SCI_BASE_REQUEST_HANDLER_T start_handler;
166*f11c7f63SJim Harris 
167*f11c7f63SJim Harris    /**
168*f11c7f63SJim Harris     * The abort_handler specifies the method invoked when a user attempts to
169*f11c7f63SJim Harris     * abort a request.
170*f11c7f63SJim Harris     */
171*f11c7f63SJim Harris    SCI_BASE_REQUEST_HANDLER_T abort_handler;
172*f11c7f63SJim Harris 
173*f11c7f63SJim Harris    /**
174*f11c7f63SJim Harris     * The complete_handler specifies the method invoked when a user attempts to
175*f11c7f63SJim Harris     * complete a request.
176*f11c7f63SJim Harris     */
177*f11c7f63SJim Harris    SCI_BASE_REQUEST_HANDLER_T complete_handler;
178*f11c7f63SJim Harris 
179*f11c7f63SJim Harris    /**
180*f11c7f63SJim Harris     * The destruct_handler specifies the method invoked when a user attempts to
181*f11c7f63SJim Harris     * destruct a request.
182*f11c7f63SJim Harris     */
183*f11c7f63SJim Harris    SCI_BASE_REQUEST_HANDLER_T destruct_handler;
184*f11c7f63SJim Harris 
185*f11c7f63SJim Harris } SCI_BASE_REQUEST_STATE_HANDLER_T;
186*f11c7f63SJim Harris 
187*f11c7f63SJim Harris /**
188*f11c7f63SJim Harris  * @brief Construct the base request.
189*f11c7f63SJim Harris  *
190*f11c7f63SJim Harris  * @param[in] this_request This parameter specifies the base request
191*f11c7f63SJim Harris  *            to be constructed.
192*f11c7f63SJim Harris  * @param[in] logger This parameter specifies the logger associated with
193*f11c7f63SJim Harris  *            this base request object.
194*f11c7f63SJim Harris  * @param[in] state_table This parameter specifies the table of state
195*f11c7f63SJim Harris  *            definitions to be utilized for the request state machine.
196*f11c7f63SJim Harris  *
197*f11c7f63SJim Harris  * @return none
198*f11c7f63SJim Harris  */
199*f11c7f63SJim Harris void sci_base_request_construct(
200*f11c7f63SJim Harris    SCI_BASE_REQUEST_T    * this_request,
201*f11c7f63SJim Harris    SCI_BASE_LOGGER_T     * logger,
202*f11c7f63SJim Harris    SCI_BASE_STATE_T      * state_table
203*f11c7f63SJim Harris );
204*f11c7f63SJim Harris 
205*f11c7f63SJim Harris #ifdef __cplusplus
206*f11c7f63SJim Harris }
207*f11c7f63SJim Harris #endif // __cplusplus
208*f11c7f63SJim Harris 
209*f11c7f63SJim Harris #endif // _SCI_BASE_REQUST_H_
210