1230557Sjimharris/*-
2230557Sjimharris * This file is provided under a dual BSD/GPLv2 license.  When using or
3230557Sjimharris * redistributing this file, you may do so under either license.
4230557Sjimharris *
5230557Sjimharris * GPL LICENSE SUMMARY
6230557Sjimharris *
7230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8230557Sjimharris *
9230557Sjimharris * This program is free software; you can redistribute it and/or modify
10230557Sjimharris * it under the terms of version 2 of the GNU General Public License as
11230557Sjimharris * published by the Free Software Foundation.
12230557Sjimharris *
13230557Sjimharris * This program is distributed in the hope that it will be useful, but
14230557Sjimharris * WITHOUT ANY WARRANTY; without even the implied warranty of
15230557Sjimharris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16230557Sjimharris * General Public License for more details.
17230557Sjimharris *
18230557Sjimharris * You should have received a copy of the GNU General Public License
19230557Sjimharris * along with this program; if not, write to the Free Software
20230557Sjimharris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21230557Sjimharris * The full GNU General Public License is included in this distribution
22230557Sjimharris * in the file called LICENSE.GPL.
23230557Sjimharris *
24230557Sjimharris * BSD LICENSE
25230557Sjimharris *
26230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27230557Sjimharris * All rights reserved.
28230557Sjimharris *
29230557Sjimharris * Redistribution and use in source and binary forms, with or without
30230557Sjimharris * modification, are permitted provided that the following conditions
31230557Sjimharris * are met:
32230557Sjimharris *
33230557Sjimharris *   * Redistributions of source code must retain the above copyright
34230557Sjimharris *     notice, this list of conditions and the following disclaimer.
35230557Sjimharris *   * Redistributions in binary form must reproduce the above copyright
36230557Sjimharris *     notice, this list of conditions and the following disclaimer in
37230557Sjimharris *     the documentation and/or other materials provided with the
38230557Sjimharris *     distribution.
39230557Sjimharris *
40230557Sjimharris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41230557Sjimharris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42230557Sjimharris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43230557Sjimharris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44230557Sjimharris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45230557Sjimharris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46230557Sjimharris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47230557Sjimharris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48230557Sjimharris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49230557Sjimharris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50230557Sjimharris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51230557Sjimharris */
52230557Sjimharris
53230557Sjimharris#include <sys/cdefs.h>
54230557Sjimharris__FBSDID("$FreeBSD$");
55230557Sjimharris
56230557Sjimharris/**
57230557Sjimharris * @file
58230557Sjimharris *
59230557Sjimharris * @brief This file contains all of the method implementations pertaining
60230557Sjimharris *        to the framework io request state handler methods.
61230557Sjimharris */
62230557Sjimharris
63230557Sjimharris#include <dev/isci/scil/scif_sas_logger.h>
64230557Sjimharris#include <dev/isci/scil/scif_sas_task_request.h>
65230557Sjimharris
66230557Sjimharris//******************************************************************************
67230557Sjimharris//* C O N S T R U C T E D   H A N D L E R S
68230557Sjimharris//******************************************************************************
69230557Sjimharris
70230557Sjimharris/**
71230557Sjimharris * @brief This method provides CONSTRUCTED state specific handling for
72230557Sjimharris *        when the user attempts to start the supplied task request.
73230557Sjimharris *
74230557Sjimharris * @param[in] task_request This parameter specifies the task request object
75230557Sjimharris *            to be started.
76230557Sjimharris *
77230557Sjimharris * @return This method returns a value indicating if the task request was
78230557Sjimharris *         successfully started or not.
79230557Sjimharris * @retval SCI_SUCCESS This return value indicates successful starting
80230557Sjimharris *         of the task request.
81230557Sjimharris */
82230557Sjimharrisstatic
83230557SjimharrisSCI_STATUS scif_sas_task_request_constructed_start_handler(
84230557Sjimharris   SCI_BASE_REQUEST_T * task_request
85230557Sjimharris)
86230557Sjimharris{
87230557Sjimharris   sci_base_state_machine_change_state(
88230557Sjimharris      &task_request->state_machine, SCI_BASE_REQUEST_STATE_STARTED
89230557Sjimharris   );
90230557Sjimharris
91230557Sjimharris   return SCI_SUCCESS;
92230557Sjimharris}
93230557Sjimharris
94230557Sjimharris/**
95230557Sjimharris * @brief This method provides CONSTRUCTED state specific handling for
96230557Sjimharris *        when the user attempts to abort the supplied task request.
97230557Sjimharris *
98230557Sjimharris * @param[in] task_request This parameter specifies the task request object
99230557Sjimharris *            to be aborted.
100230557Sjimharris *
101230557Sjimharris * @return This method returns a value indicating if the task request was
102230557Sjimharris *         successfully aborted or not.
103230557Sjimharris * @retval SCI_SUCCESS This return value indicates successful aborting
104230557Sjimharris *         of the task request.
105230557Sjimharris */
106230557Sjimharrisstatic
107230557SjimharrisSCI_STATUS scif_sas_task_request_constructed_abort_handler(
108230557Sjimharris   SCI_BASE_REQUEST_T * task_request
109230557Sjimharris)
110230557Sjimharris{
111230557Sjimharris   sci_base_state_machine_change_state(
112230557Sjimharris      &task_request->state_machine, SCI_BASE_REQUEST_STATE_COMPLETED
113230557Sjimharris   );
114230557Sjimharris
115230557Sjimharris   return SCI_SUCCESS;
116230557Sjimharris}
117230557Sjimharris
118230557Sjimharris//******************************************************************************
119230557Sjimharris//* S T A R T E D   H A N D L E R S
120230557Sjimharris//******************************************************************************
121230557Sjimharris
122230557Sjimharris/**
123230557Sjimharris * @brief This method provides STARTED state specific handling for
124230557Sjimharris *        when the user attempts to abort the supplied task request.
125230557Sjimharris *
126230557Sjimharris * @param[in] task_request This parameter specifies the task request object
127230557Sjimharris *            to be aborted.
128230557Sjimharris *
129230557Sjimharris * @return This method returns a value indicating if the aborting the
130230557Sjimharris *         task request was successfully started.
131230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the abort process
132230557Sjimharris *         began successfully.
133230557Sjimharris */
134230557Sjimharrisstatic
135230557SjimharrisSCI_STATUS scif_sas_task_request_started_abort_handler(
136230557Sjimharris   SCI_BASE_REQUEST_T * task_request
137230557Sjimharris)
138230557Sjimharris{
139230557Sjimharris   SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T *) task_request;
140230557Sjimharris
141230557Sjimharris   sci_base_state_machine_change_state(
142230557Sjimharris      &task_request->state_machine, SCI_BASE_REQUEST_STATE_ABORTING
143230557Sjimharris   );
144230557Sjimharris
145230557Sjimharris   return fw_request->status;
146230557Sjimharris}
147230557Sjimharris
148230557Sjimharris/**
149230557Sjimharris * @brief This method provides STARTED state specific handling for
150230557Sjimharris *        when the user attempts to complete the supplied task request.
151230557Sjimharris *
152230557Sjimharris * @param[in] task_request This parameter specifies the task request object
153230557Sjimharris *            to be completed.
154230557Sjimharris *
155230557Sjimharris * @return This method returns a value indicating if the completion of the
156230557Sjimharris *         task request was successful.
157230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the completion process
158230557Sjimharris *         was successful.
159230557Sjimharris */
160230557Sjimharrisstatic
161230557SjimharrisSCI_STATUS scif_sas_task_request_started_complete_handler(
162230557Sjimharris   SCI_BASE_REQUEST_T * task_request
163230557Sjimharris)
164230557Sjimharris{
165230557Sjimharris   sci_base_state_machine_change_state(
166230557Sjimharris      &task_request->state_machine, SCI_BASE_REQUEST_STATE_COMPLETED
167230557Sjimharris   );
168230557Sjimharris
169230557Sjimharris   return SCI_SUCCESS;
170230557Sjimharris}
171230557Sjimharris
172230557Sjimharris//******************************************************************************
173230557Sjimharris//* C O M P L E T E D   H A N D L E R S
174230557Sjimharris//******************************************************************************
175230557Sjimharris
176230557Sjimharris/**
177230557Sjimharris * @brief This method provides COMPLETED state specific handling for
178230557Sjimharris *        when the user attempts to destruct the supplied task request.
179230557Sjimharris *
180230557Sjimharris * @param[in] task_request This parameter specifies the task request object
181230557Sjimharris *            to be destructed.
182230557Sjimharris *
183230557Sjimharris * @return This method returns a value indicating if the destruct
184230557Sjimharris *         operation was successful.
185230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the destruct
186230557Sjimharris *         was successful.
187230557Sjimharris */
188230557Sjimharrisstatic
189230557SjimharrisSCI_STATUS scif_sas_task_request_completed_destruct_handler(
190230557Sjimharris   SCI_BASE_REQUEST_T * task_request
191230557Sjimharris)
192230557Sjimharris{
193230557Sjimharris   SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T *)task_request;
194230557Sjimharris
195230557Sjimharris   sci_base_state_machine_change_state(
196230557Sjimharris      &task_request->state_machine, SCI_BASE_REQUEST_STATE_FINAL
197230557Sjimharris   );
198230557Sjimharris
199230557Sjimharris   sci_base_state_machine_logger_deinitialize(
200230557Sjimharris      &task_request->state_machine_logger,
201230557Sjimharris      &task_request->state_machine
202230557Sjimharris   );
203230557Sjimharris
204230557Sjimharris   if (fw_request->is_internal == TRUE)
205230557Sjimharris   {
206230557Sjimharris      scif_sas_internal_task_request_destruct(
207230557Sjimharris         (SCIF_SAS_TASK_REQUEST_T *)fw_request
208230557Sjimharris      );
209230557Sjimharris   }
210230557Sjimharris
211230557Sjimharris   return SCI_SUCCESS;
212230557Sjimharris}
213230557Sjimharris
214230557Sjimharris//******************************************************************************
215230557Sjimharris//* A B O R T I N G   H A N D L E R S
216230557Sjimharris//******************************************************************************
217230557Sjimharris
218230557Sjimharris/**
219230557Sjimharris * @brief This method provides ABORTING state specific handling for
220230557Sjimharris *        when the user attempts to complete the supplied task request.
221230557Sjimharris *
222230557Sjimharris * @param[in] task_request This parameter specifies the task request object
223230557Sjimharris *            to be completed.
224230557Sjimharris *
225230557Sjimharris * @return This method returns a value indicating if the completion
226230557Sjimharris *         operation was successful.
227230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the completion
228230557Sjimharris *         was successful.
229230557Sjimharris */
230230557Sjimharrisstatic
231230557SjimharrisSCI_STATUS scif_sas_task_request_aborting_complete_handler(
232230557Sjimharris   SCI_BASE_REQUEST_T * task_request
233230557Sjimharris)
234230557Sjimharris{
235230557Sjimharris   sci_base_state_machine_change_state(
236230557Sjimharris      &task_request->state_machine, SCI_BASE_REQUEST_STATE_COMPLETED
237230557Sjimharris   );
238230557Sjimharris
239230557Sjimharris   return SCI_SUCCESS;
240230557Sjimharris}
241230557Sjimharris
242230557Sjimharris//******************************************************************************
243230557Sjimharris//* D E F A U L T   H A N D L E R S
244230557Sjimharris//******************************************************************************
245230557Sjimharris
246230557Sjimharris/**
247230557Sjimharris * @brief This method provides DEFAULT handling for when the user
248230557Sjimharris *        attempts to start the supplied task request.
249230557Sjimharris *
250230557Sjimharris * @param[in] task_request This parameter specifies the task request object
251230557Sjimharris *            to be started.
252230557Sjimharris *
253230557Sjimharris * @return This method returns an indication that the start operation is
254230557Sjimharris *         not allowed.
255230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
256230557Sjimharris */
257230557Sjimharrisstatic
258230557SjimharrisSCI_STATUS scif_sas_task_request_default_start_handler(
259230557Sjimharris   SCI_BASE_REQUEST_T * task_request
260230557Sjimharris)
261230557Sjimharris{
262230557Sjimharris   SCIF_LOG_ERROR((
263230557Sjimharris      sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request),
264230557Sjimharris      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
265230557Sjimharris      "TaskRequest:0x%x State:0x%x invalid state to start\n",
266230557Sjimharris      task_request,
267230557Sjimharris      sci_base_state_machine_get_state(
268230557Sjimharris         &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine)
269230557Sjimharris   ));
270230557Sjimharris
271230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
272230557Sjimharris}
273230557Sjimharris
274230557Sjimharris/**
275230557Sjimharris * @brief This method provides DEFAULT handling for when the user
276230557Sjimharris *        attempts to abort the supplied task request.
277230557Sjimharris *
278230557Sjimharris * @param[in] task_request This parameter specifies the task request object
279230557Sjimharris *            to be aborted.
280230557Sjimharris *
281230557Sjimharris * @return This method returns an indication that the abort operation is
282230557Sjimharris *         not allowed.
283230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
284230557Sjimharris */
285230557Sjimharrisstatic
286230557SjimharrisSCI_STATUS scif_sas_task_request_default_abort_handler(
287230557Sjimharris   SCI_BASE_REQUEST_T * task_request
288230557Sjimharris)
289230557Sjimharris{
290230557Sjimharris   SCIF_LOG_ERROR((
291230557Sjimharris      sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request),
292230557Sjimharris      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
293230557Sjimharris      "TaskRequest:0x%x State:0x%x invalid state to abort\n",
294230557Sjimharris      task_request,
295230557Sjimharris      sci_base_state_machine_get_state(
296230557Sjimharris         &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine)
297230557Sjimharris   ));
298230557Sjimharris
299230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
300230557Sjimharris}
301230557Sjimharris
302230557Sjimharris/**
303230557Sjimharris * @brief This method provides DEFAULT handling for when the user
304230557Sjimharris *        attempts to complete the supplied task request.
305230557Sjimharris *
306230557Sjimharris * @param[in] task_request This parameter specifies the task request object
307230557Sjimharris *            to be completed.
308230557Sjimharris *
309230557Sjimharris * @return This method returns an indication that complete operation is
310230557Sjimharris *         not allowed.
311230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
312230557Sjimharris */
313230557Sjimharrisstatic
314230557SjimharrisSCI_STATUS scif_sas_task_request_default_complete_handler(
315230557Sjimharris   SCI_BASE_REQUEST_T * task_request
316230557Sjimharris)
317230557Sjimharris{
318230557Sjimharris   SCIF_LOG_ERROR((
319230557Sjimharris      sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request),
320230557Sjimharris      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
321230557Sjimharris      "TaskRequest:0x%x State:0x%x invalid state to complete\n",
322230557Sjimharris      task_request,
323230557Sjimharris      sci_base_state_machine_get_state(
324230557Sjimharris         &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine)
325230557Sjimharris   ));
326230557Sjimharris
327230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
328230557Sjimharris}
329230557Sjimharris
330230557Sjimharris/**
331230557Sjimharris * @brief This method provides DEFAULT handling for when the user
332230557Sjimharris *        attempts to destruct the supplied task request.
333230557Sjimharris *
334230557Sjimharris * @param[in] task_request This parameter specifies the task request object
335230557Sjimharris *            to be destructed.
336230557Sjimharris *
337230557Sjimharris * @return This method returns an indication that destruct operation is
338230557Sjimharris *         not allowed.
339230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
340230557Sjimharris */
341230557Sjimharrisstatic
342230557SjimharrisSCI_STATUS scif_sas_task_request_default_destruct_handler(
343230557Sjimharris   SCI_BASE_REQUEST_T * task_request
344230557Sjimharris)
345230557Sjimharris{
346230557Sjimharris   SCIF_LOG_ERROR((
347230557Sjimharris      sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request),
348230557Sjimharris      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
349230557Sjimharris      "TaskRequest:0x%x State:0x%x invalid state to destruct.\n",
350230557Sjimharris      task_request,
351230557Sjimharris      sci_base_state_machine_get_state(
352230557Sjimharris         &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine)
353230557Sjimharris   ));
354230557Sjimharris
355230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
356230557Sjimharris}
357230557Sjimharris
358230557Sjimharris
359230557SjimharrisSCI_BASE_REQUEST_STATE_HANDLER_T scif_sas_task_request_state_handler_table[] =
360230557Sjimharris{
361230557Sjimharris   // SCI_BASE_REQUEST_STATE_INITIAL
362230557Sjimharris   {
363230557Sjimharris      scif_sas_task_request_default_start_handler,
364230557Sjimharris      scif_sas_task_request_default_abort_handler,
365230557Sjimharris      scif_sas_task_request_default_complete_handler,
366230557Sjimharris      scif_sas_task_request_default_destruct_handler
367230557Sjimharris   },
368230557Sjimharris   // SCI_BASE_REQUEST_STATE_CONSTRUCTED
369230557Sjimharris   {
370230557Sjimharris      scif_sas_task_request_constructed_start_handler,
371230557Sjimharris      scif_sas_task_request_constructed_abort_handler,
372230557Sjimharris      scif_sas_task_request_default_complete_handler,
373230557Sjimharris      scif_sas_task_request_default_destruct_handler
374230557Sjimharris   },
375230557Sjimharris   // SCI_BASE_REQUEST_STATE_STARTED
376230557Sjimharris   {
377230557Sjimharris      scif_sas_task_request_default_start_handler,
378230557Sjimharris      scif_sas_task_request_started_abort_handler,
379230557Sjimharris      scif_sas_task_request_started_complete_handler,
380230557Sjimharris      scif_sas_task_request_default_destruct_handler
381230557Sjimharris   },
382230557Sjimharris   // SCI_BASE_REQUEST_STATE_COMPLETED
383230557Sjimharris   {
384230557Sjimharris      scif_sas_task_request_default_start_handler,
385230557Sjimharris      scif_sas_task_request_default_abort_handler,
386230557Sjimharris      scif_sas_task_request_default_complete_handler,
387230557Sjimharris      scif_sas_task_request_completed_destruct_handler
388230557Sjimharris   },
389230557Sjimharris   // SCI_BASE_REQUEST_STATE_ABORTING
390230557Sjimharris   {
391230557Sjimharris      scif_sas_task_request_default_start_handler,
392230557Sjimharris      scif_sas_task_request_default_abort_handler,
393230557Sjimharris      scif_sas_task_request_aborting_complete_handler,
394230557Sjimharris      scif_sas_task_request_default_destruct_handler
395230557Sjimharris   },
396230557Sjimharris   // SCI_BASE_REQUEST_STATE_FINAL
397230557Sjimharris   {
398230557Sjimharris      scif_sas_task_request_default_start_handler,
399230557Sjimharris      scif_sas_task_request_default_abort_handler,
400230557Sjimharris      scif_sas_task_request_default_complete_handler,
401230557Sjimharris      scif_sas_task_request_default_destruct_handler
402230557Sjimharris   },
403230557Sjimharris};
404230557Sjimharris
405