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 state handler routines for each
60230557Sjimharris *        of the domain states defined by the SCI_BASE_DOMAIN state
61230557Sjimharris *        machine.
62230557Sjimharris * @note
63230557Sjimharris *        - The discover method must be synchronized with the
64230557Sjimharris *          controller's completion handler.  The OS specific driver
65230557Sjimharris *          component is responsible for ensuring this occurs.  If the
66230557Sjimharris *          discovery method is called from within the call
67230557Sjimharris *          tree of the completion routine, then no action is necessary.
68230557Sjimharris */
69230557Sjimharris
70230557Sjimharris
71230557Sjimharris#include <dev/isci/scil/scic_port.h>
72230557Sjimharris#include <dev/isci/scil/scic_io_request.h>
73230557Sjimharris#include <dev/isci/scil/scif_sas_logger.h>
74230557Sjimharris#include <dev/isci/scil/scif_sas_domain.h>
75230557Sjimharris
76230557Sjimharris//******************************************************************************
77230557Sjimharris//* P R O T E C T E D   M E T H O D S
78230557Sjimharris//******************************************************************************
79230557Sjimharris
80230557Sjimharris//******************************************************************************
81230557Sjimharris//* S T A R T I N G   H A N D L E R S
82230557Sjimharris//******************************************************************************
83230557Sjimharris
84230557Sjimharrisstatic
85230557SjimharrisSCI_STATUS scif_sas_domain_starting_port_ready_handler(
86230557Sjimharris   SCI_BASE_DOMAIN_T * domain
87230557Sjimharris)
88230557Sjimharris{
89230557Sjimharris   SCIF_LOG_TRACE((
90230557Sjimharris      sci_base_object_get_logger(domain),
91230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
92230557Sjimharris      "scif_sas_domain_starting_port_ready_handler(0x%x) enter\n",
93230557Sjimharris      domain
94230557Sjimharris   ));
95230557Sjimharris
96230557Sjimharris   // The domain was previously completely stopped.  Now that the port is
97230557Sjimharris   // ready we can transition the domain to the ready state.
98230557Sjimharris   sci_base_state_machine_change_state(
99230557Sjimharris      &domain->state_machine, SCI_BASE_DOMAIN_STATE_READY
100230557Sjimharris   );
101230557Sjimharris
102230557Sjimharris   return SCI_SUCCESS;
103230557Sjimharris}
104230557Sjimharris
105230557Sjimharris//******************************************************************************
106230557Sjimharris//* R E A D Y   H A N D L E R S
107230557Sjimharris//******************************************************************************
108230557Sjimharris
109230557Sjimharris/**
110230557Sjimharris * @brief This method provides READY state specific handling for
111230557Sjimharris *        when a user attempts to discover a domain.
112230557Sjimharris *
113230557Sjimharris * @param[in]  domain This parameter specifies the domain object
114230557Sjimharris *             on which the user is attempting to perform a discover
115230557Sjimharris *             operation.
116230557Sjimharris *
117230557Sjimharris * @return This method returns an indication of whether the discover operation
118230557Sjimharris *         succeeded.
119230557Sjimharris * @retval SCI_SUCCESSS This value is returned when the discover operation
120230557Sjimharris *         begins successfully.
121230557Sjimharris */
122230557Sjimharrisstatic
123230557SjimharrisSCI_STATUS scif_sas_domain_ready_discover_handler(
124230557Sjimharris   SCI_BASE_DOMAIN_T * domain,
125230557Sjimharris   U32                 op_timeout,
126230557Sjimharris   U32                 device_timeout
127230557Sjimharris)
128230557Sjimharris{
129230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)domain;
130230557Sjimharris
131230557Sjimharris   SCIF_LOG_TRACE((
132230557Sjimharris      sci_base_object_get_logger(domain),
133230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
134230557Sjimharris      "scif_sas_domain_ready_discover_handler(0x%x, 0x%x, 0x%x) enter\n",
135230557Sjimharris      domain, op_timeout, device_timeout
136230557Sjimharris   ));
137230557Sjimharris
138230557Sjimharris   fw_domain->operation.timeout        = op_timeout;
139230557Sjimharris   fw_domain->operation.device_timeout = device_timeout;
140230557Sjimharris   fw_domain->operation.status         = SCI_SUCCESS;
141230557Sjimharris
142230557Sjimharris   scif_cb_timer_start(
143230557Sjimharris      fw_domain->controller,
144230557Sjimharris      fw_domain->operation.timer,
145230557Sjimharris      fw_domain->operation.timeout
146230557Sjimharris   );
147230557Sjimharris
148230557Sjimharris   scif_sas_domain_transition_to_discovering_state(fw_domain);
149230557Sjimharris
150230557Sjimharris   return fw_domain->operation.status;
151230557Sjimharris}
152230557Sjimharris
153230557Sjimharris/**
154230557Sjimharris * @brief This method provides READY state processing for reception of a
155230557Sjimharris *        port NOT ready notification from the core.
156230557Sjimharris *
157230557Sjimharris * @param[in]  domain This parameter specifies the domain object
158230557Sjimharris *             on which the core port has just come ready.
159230557Sjimharris *
160230557Sjimharris * @return
161230557Sjimharris */
162230557Sjimharrisstatic
163230557SjimharrisSCI_STATUS scif_sas_domain_ready_port_not_ready_handler(
164230557Sjimharris   SCI_BASE_DOMAIN_T * domain,
165230557Sjimharris   U32                 reason_code
166230557Sjimharris)
167230557Sjimharris{
168230557Sjimharris   SCIF_LOG_TRACE((
169230557Sjimharris      sci_base_object_get_logger(domain),
170230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
171230557Sjimharris      "scif_sas_domain_ready_port_not_ready_handler(0x%x, 0x%x) enter\n",
172230557Sjimharris      domain,
173230557Sjimharris      reason_code
174230557Sjimharris   ));
175230557Sjimharris
176230557Sjimharris   if (reason_code != SCIC_PORT_NOT_READY_HARD_RESET_REQUESTED)
177230557Sjimharris   {
178230557Sjimharris      // Change to the STOPPING state to cause existing request
179230557Sjimharris      // completions to be terminated and devices removed.
180230557Sjimharris      sci_base_state_machine_change_state(
181230557Sjimharris         &domain->state_machine, SCI_BASE_DOMAIN_STATE_STOPPING
182230557Sjimharris      );
183230557Sjimharris   }
184230557Sjimharris
185230557Sjimharris   return SCI_SUCCESS;
186230557Sjimharris}
187230557Sjimharris
188230557Sjimharris/**
189230557Sjimharris * @brief This method provides READY state specific handling for
190230557Sjimharris *        when a user attempts to start an IO request.
191230557Sjimharris *
192230557Sjimharris * @param[in]  domain This parameter specifies the domain object
193230557Sjimharris *             on which the user is attempting to perform a start IO
194230557Sjimharris *             operation.
195230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
196230557Sjimharris *             object on which the user is attempting to perform a start IO
197230557Sjimharris *             operation.
198230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
199230557Sjimharris *             being started.
200230557Sjimharris *
201230557Sjimharris * @return This method returns an indication of whether the start IO
202230557Sjimharris *         operation succeeded.
203230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start IO operation
204230557Sjimharris *         begins successfully.
205230557Sjimharris */
206230557Sjimharrisstatic
207230557SjimharrisSCI_STATUS scif_sas_domain_ready_start_io_handler(
208230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
209230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
210230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
211230557Sjimharris)
212230557Sjimharris{
213230557Sjimharris   SCIF_SAS_DOMAIN_T        * fw_domain  = (SCIF_SAS_DOMAIN_T*) domain;
214230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device  = (SCIF_SAS_REMOTE_DEVICE_T*)
215230557Sjimharris                                           remote_device;
216230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request = (SCIF_SAS_REQUEST_T*) io_request;
217230557Sjimharris   SCI_STATUS                 status;
218230557Sjimharris
219230557Sjimharris   SCIF_LOG_TRACE((
220230557Sjimharris      sci_base_object_get_logger(domain),
221230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
222230557Sjimharris      "scif_sas_domain_ready_start_io_handler(0x%x, 0x%x, 0x%x) enter\n",
223230557Sjimharris      domain, remote_device, io_request
224230557Sjimharris   ));
225230557Sjimharris
226230557Sjimharris   status = fw_device->state_handlers->parent.start_io_handler(
227230557Sjimharris               &fw_device->parent, &fw_request->parent
228230557Sjimharris            );
229230557Sjimharris
230230557Sjimharris   if (status == SCI_SUCCESS)
231230557Sjimharris   {
232230557Sjimharris      // Add the IO to the list of outstanding requests on the domain.
233230557Sjimharris      sci_fast_list_insert_tail(
234230557Sjimharris         &fw_domain->request_list, &fw_request->list_element
235230557Sjimharris      );
236230557Sjimharris   }
237230557Sjimharris
238230557Sjimharris   return status;
239230557Sjimharris}
240230557Sjimharris
241230557Sjimharris/**
242230557Sjimharris * @brief This method provides READY state specific handling for
243230557Sjimharris *        when a user attempts to complete an IO request.
244230557Sjimharris *
245230557Sjimharris * @param[in]  domain This parameter specifies the domain object
246230557Sjimharris *             on which the user is attempting to perform a complete IO
247230557Sjimharris *             operation.
248230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
249230557Sjimharris *             object on which the user is attempting to perform a complete
250230557Sjimharris *             IO operation.
251230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
252230557Sjimharris *             being completed.
253230557Sjimharris *
254230557Sjimharris * @return This method returns an indication of whether the complete IO
255230557Sjimharris *         operation succeeded.
256230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation
257230557Sjimharris *         is successful.
258230557Sjimharris */
259230557Sjimharrisstatic
260230557SjimharrisSCI_STATUS scif_sas_domain_ready_complete_io_handler(
261230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
262230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
263230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
264230557Sjimharris)
265230557Sjimharris{
266230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
267230557Sjimharris                                          remote_device;
268230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request= (SCIF_SAS_REQUEST_T*) io_request;
269230557Sjimharris
270230557Sjimharris   SCIF_LOG_TRACE((
271230557Sjimharris      sci_base_object_get_logger(domain),
272230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
273230557Sjimharris      "scif_sas_domain_ready_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n",
274230557Sjimharris      domain, remote_device, io_request
275230557Sjimharris   ));
276230557Sjimharris
277230557Sjimharris   // Remove the IO from the list of outstanding requests on the domain.
278230557Sjimharris   sci_fast_list_remove_element(&fw_request->list_element);
279230557Sjimharris
280230557Sjimharris   return fw_device->state_handlers->parent.complete_io_handler(
281230557Sjimharris             &fw_device->parent, &fw_request->parent
282230557Sjimharris          );
283230557Sjimharris}
284230557Sjimharris
285230557Sjimharris/**
286230557Sjimharris * @brief This method provides READY state specific handling for
287230557Sjimharris *        when a user attempts to continue an IO request.
288230557Sjimharris *
289230557Sjimharris * @param[in]  domain This parameter specifies the domain object
290230557Sjimharris *             on which the user is attempting to perform a continue IO
291230557Sjimharris *             operation.
292230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
293230557Sjimharris *             object on which the user is attempting to perform a start IO
294230557Sjimharris *             operation.
295230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
296230557Sjimharris *             being started.
297230557Sjimharris *
298230557Sjimharris * @return This method returns an indication of whether the continue IO
299230557Sjimharris *         operation succeeded.
300230557Sjimharris * @retval SCI_SUCCESS This value is returned when the continue IO operation
301230557Sjimharris *         begins successfully.
302230557Sjimharris */
303230557Sjimharrisstatic
304230557SjimharrisSCI_STATUS scif_sas_domain_ready_continue_io_handler(
305230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
306230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
307230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
308230557Sjimharris)
309230557Sjimharris{
310230557Sjimharris   SCIF_LOG_TRACE((
311230557Sjimharris      sci_base_object_get_logger(domain),
312230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
313230557Sjimharris      "scif_sas_domain_ready_continue_io_handler(0x%x, 0x%x, 0x%x) enter\n",
314230557Sjimharris      domain, remote_device, io_request
315230557Sjimharris   ));
316230557Sjimharris
317230557Sjimharris   /// @todo fix return code handling.
318230557Sjimharris   return SCI_FAILURE;
319230557Sjimharris}
320230557Sjimharris
321230557Sjimharris/**
322230557Sjimharris * @brief This method provides READY state specific handling for
323230557Sjimharris *        when a user attempts to start a task request.
324230557Sjimharris *
325230557Sjimharris * @param[in]  domain This parameter specifies the domain object
326230557Sjimharris *             on which the user is attempting to perform a start task
327230557Sjimharris *             operation.
328230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
329230557Sjimharris *             object on which the user is attempting to perform a start IO
330230557Sjimharris *             operation.
331230557Sjimharris * @param[in]  task_request This parameter specifies the task request that
332230557Sjimharris *             is being started.
333230557Sjimharris *
334230557Sjimharris * @return This method returns an indication of whether the start task
335230557Sjimharris *         operation succeeded.
336230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start task operation
337230557Sjimharris *         begins successfully.
338230557Sjimharris */
339230557Sjimharrisstatic
340230557SjimharrisSCI_STATUS scif_sas_domain_ready_start_task_handler(
341230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
342230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
343230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
344230557Sjimharris)
345230557Sjimharris{
346230557Sjimharris   SCIF_SAS_DOMAIN_T        * fw_domain  = (SCIF_SAS_DOMAIN_T*) domain;
347230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device  = (SCIF_SAS_REMOTE_DEVICE_T*)
348230557Sjimharris                                           remote_device;
349230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request = (SCIF_SAS_REQUEST_T*) task_request;
350230557Sjimharris   SCI_STATUS                 status;
351230557Sjimharris
352230557Sjimharris   SCIF_LOG_TRACE((
353230557Sjimharris      sci_base_object_get_logger(domain),
354230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
355230557Sjimharris      "scif_sas_domain_ready_start_task_handler(0x%x, 0x%x, 0x%x) enter\n",
356230557Sjimharris      domain, remote_device, task_request
357230557Sjimharris   ));
358230557Sjimharris
359230557Sjimharris   status = fw_device->state_handlers->parent.start_task_handler(
360230557Sjimharris               &fw_device->parent, &fw_request->parent
361230557Sjimharris            );
362230557Sjimharris
363230557Sjimharris   if (status == SCI_SUCCESS)
364230557Sjimharris   {
365230557Sjimharris      // Add the task to the list of outstanding requests on the domain.
366230557Sjimharris      sci_fast_list_insert_tail(
367230557Sjimharris         &fw_domain->request_list, &fw_request->list_element
368230557Sjimharris      );
369230557Sjimharris   }
370230557Sjimharris
371230557Sjimharris   return status;
372230557Sjimharris}
373230557Sjimharris
374230557Sjimharris/**
375230557Sjimharris * @brief This method provides READY state specific handling for
376230557Sjimharris *        when a user attempts to complete a task request.
377230557Sjimharris *
378230557Sjimharris * @param[in]  domain This parameter specifies the domain object
379230557Sjimharris *             on which the user is attempting to perform a complete task
380230557Sjimharris *             operation.
381230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
382230557Sjimharris *             object on which the user is attempting to perform a start IO
383230557Sjimharris *             operation.
384230557Sjimharris * @param[in]  task_request This parameter specifies the task request that
385230557Sjimharris *             is being started.
386230557Sjimharris *
387230557Sjimharris * @return This method returns an indication of whether the complete task
388230557Sjimharris *         operation succeeded.
389230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete task operation
390230557Sjimharris *         begins successfully.
391230557Sjimharris */
392230557Sjimharrisstatic
393230557SjimharrisSCI_STATUS scif_sas_domain_ready_complete_task_handler(
394230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
395230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
396230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
397230557Sjimharris)
398230557Sjimharris{
399230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device  = (SCIF_SAS_REMOTE_DEVICE_T*)
400230557Sjimharris                                           remote_device;
401230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request = (SCIF_SAS_REQUEST_T*) task_request;
402230557Sjimharris
403230557Sjimharris   SCIF_LOG_TRACE((
404230557Sjimharris      sci_base_object_get_logger(domain),
405230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
406230557Sjimharris      "scif_sas_domain_ready_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n",
407230557Sjimharris      domain, remote_device, task_request
408230557Sjimharris   ));
409230557Sjimharris
410230557Sjimharris   // Remove the IO from the list of outstanding requests on the domain.
411230557Sjimharris   sci_fast_list_remove_element(&fw_request->list_element);
412230557Sjimharris
413230557Sjimharris   return fw_device->state_handlers->parent.complete_task_handler(
414230557Sjimharris             &fw_device->parent, &fw_request->parent
415230557Sjimharris          );
416230557Sjimharris}
417230557Sjimharris
418230557Sjimharris
419230557Sjimharris/**
420230557Sjimharris * @brief This method provides READY state specific handling for when a user
421230557Sjimharris *        attempts to start a high priority IO request.
422230557Sjimharris *
423230557Sjimharris * @param[in]  domain This parameter specifies the domain object
424230557Sjimharris *             on which the user is attempting to perform a start high priority
425230557Sjimharris *             IO operation (which is exclusively for Phy Control hard reset).
426230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
427230557Sjimharris *             object on which the user is attempting to perform a start
428230557Sjimharris *             high priority IO operation.
429230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
430230557Sjimharris *             being started.
431230557Sjimharris *
432230557Sjimharris * @return This method returns an indication of whether the start IO
433230557Sjimharris *         operation succeeded.
434230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start IO operation
435230557Sjimharris *         begins successfully.
436230557Sjimharris */
437230557Sjimharrisstatic
438230557SjimharrisSCI_STATUS scif_sas_domain_ready_start_high_priority_io_handler(
439230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
440230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
441230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
442230557Sjimharris)
443230557Sjimharris{
444230557Sjimharris   SCIF_SAS_DOMAIN_T        * fw_domain  = (SCIF_SAS_DOMAIN_T*) domain;
445230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device  = (SCIF_SAS_REMOTE_DEVICE_T*)
446230557Sjimharris                                           remote_device;
447230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request = (SCIF_SAS_REQUEST_T*) io_request;
448230557Sjimharris   SCI_STATUS                 status;
449230557Sjimharris
450230557Sjimharris   SCIF_LOG_TRACE((
451230557Sjimharris      sci_base_object_get_logger(domain),
452230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
453230557Sjimharris      "scif_sas_domain_ready_start_high_priority_request_handler(0x%x, 0x%x, 0x%x) enter\n",
454230557Sjimharris      domain, remote_device, io_request
455230557Sjimharris   ));
456230557Sjimharris
457230557Sjimharris   status = fw_device->state_handlers->start_high_priority_io_handler(
458230557Sjimharris               &fw_device->parent, &fw_request->parent
459230557Sjimharris            );
460230557Sjimharris
461230557Sjimharris   if (status == SCI_SUCCESS)
462230557Sjimharris   {
463230557Sjimharris      // Add the IO to the list of outstanding requests on the domain.
464230557Sjimharris
465230557Sjimharris      // When domain is in READY state, this high priority io is likely
466230557Sjimharris      // a smp Phy Control or Discover request sent to parent device of
467230557Sjimharris      // a target device, which is to be Target Reset. This high priority
468230557Sjimharris      // IO's probably has already been added to the domain's list as a
469230557Sjimharris      // SCIF_SAS_TASK_REQUEST. We need to check if it is already on the
470230557Sjimharris      // list.
471230557Sjimharris
472230557Sjimharris      if ( ! sci_fast_list_is_on_this_list(
473230557Sjimharris                &fw_domain->request_list, &fw_request->list_element))
474230557Sjimharris
475230557Sjimharris         sci_fast_list_insert_tail(
476230557Sjimharris            &fw_domain->request_list, &fw_request->list_element
477230557Sjimharris         );
478230557Sjimharris   }
479230557Sjimharris
480230557Sjimharris   return status;
481230557Sjimharris}
482230557Sjimharris
483230557Sjimharris
484230557Sjimharris/**
485230557Sjimharris * @brief This method provides READY state specific handling for
486230557Sjimharris *        when a user attempts to complete an high priroity IO request.
487230557Sjimharris *
488230557Sjimharris * @param[in]  domain This parameter specifies the domain object
489230557Sjimharris *             on which the user is attempting to perform a complete high
490230557Sjimharris *             priority IO operation (which is exclusively for Phy Control
491230557Sjimharris *             hard reset).
492230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
493230557Sjimharris *             object on which the user is attempting to perform a complete
494230557Sjimharris *             IO operation.
495230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
496230557Sjimharris *             being completed.
497230557Sjimharris *
498230557Sjimharris * @return This method returns an indication of whether the complete IO
499230557Sjimharris *         operation succeeded.
500230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation
501230557Sjimharris *         is successful.
502230557Sjimharris */
503230557Sjimharrisstatic
504230557SjimharrisSCI_STATUS scif_sas_domain_ready_complete_high_priority_io_handler(
505230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
506230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
507230557Sjimharris   SCI_BASE_REQUEST_T       * io_request,
508230557Sjimharris   void                     * response_data,
509230557Sjimharris   SCI_IO_STATUS              completion_status
510230557Sjimharris)
511230557Sjimharris{
512230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
513230557Sjimharris                                          remote_device;
514230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request= (SCIF_SAS_REQUEST_T*) io_request;
515230557Sjimharris
516230557Sjimharris   SCIC_TRANSPORT_PROTOCOL    protocol;
517230557Sjimharris
518230557Sjimharris   SCIF_LOG_TRACE((
519230557Sjimharris      sci_base_object_get_logger(domain),
520230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
521230557Sjimharris      "scif_sas_domain_ready_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
522230557Sjimharris      domain, remote_device, io_request, response_data
523230557Sjimharris   ));
524230557Sjimharris
525230557Sjimharris   protocol = scic_io_request_get_protocol(fw_request->core_object);
526230557Sjimharris
527230557Sjimharris   // If the request is an SMP HARD/LINK RESET request, then the request
528230557Sjimharris   // came through the task management path (partially).  As a result,
529230557Sjimharris   // the accounting for the request is managed in the task request
530230557Sjimharris   // completion path.  Thus, only change the domain request counter if
531230557Sjimharris   // the request is not an SMP target reset of some sort.
532230557Sjimharris   if (
533230557Sjimharris         (protocol != SCIC_SMP_PROTOCOL)
534230557Sjimharris      || (fw_device->protocol_device.smp_device.current_activity !=
535230557Sjimharris                SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_TARGET_RESET)
536230557Sjimharris      )
537230557Sjimharris   {
538230557Sjimharris      sci_fast_list_remove_element(&fw_request->list_element);
539230557Sjimharris   }
540230557Sjimharris
541230557Sjimharris   return fw_device->state_handlers->complete_high_priority_io_handler(
542230557Sjimharris             &fw_device->parent, &fw_request->parent, response_data, completion_status
543230557Sjimharris          );
544230557Sjimharris}
545230557Sjimharris
546230557Sjimharris//******************************************************************************
547230557Sjimharris//* S T O P P I N G   H A N D L E R S
548230557Sjimharris//******************************************************************************
549230557Sjimharris
550230557Sjimharrisstatic
551230557SjimharrisSCI_STATUS scif_sas_domain_stopping_device_stop_complete_handler(
552230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
553230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
554230557Sjimharris)
555230557Sjimharris{
556230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain;
557230557Sjimharris
558230557Sjimharris   SCIF_LOG_TRACE((
559230557Sjimharris      sci_base_object_get_logger(domain),
560230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
561230557Sjimharris      "scif_sas_domain_stopping_device_stop_complete_handler(0x%x, 0x%x) enter\n",
562230557Sjimharris      domain, remote_device
563230557Sjimharris   ));
564230557Sjimharris
565230557Sjimharris   // Attempt to transition to the stopped state.
566230557Sjimharris   scif_sas_domain_transition_to_stopped_state(fw_domain);
567230557Sjimharris
568230557Sjimharris   return SCI_SUCCESS;
569230557Sjimharris}
570230557Sjimharris
571230557Sjimharris/**
572230557Sjimharris * @brief This method provides STOPPING state specific handling for
573230557Sjimharris *        when a user attempts to complete an IO request.
574230557Sjimharris *
575230557Sjimharris * @param[in]  domain This parameter specifies the domain object
576230557Sjimharris *             on which the user is attempting to perform a complete IO
577230557Sjimharris *             operation.
578230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
579230557Sjimharris *             object on which the user is attempting to perform a complete
580230557Sjimharris *             IO operation.
581230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
582230557Sjimharris *             being completed.
583230557Sjimharris *
584230557Sjimharris * @return This method returns an indication of whether the complete IO
585230557Sjimharris *         operation succeeded.
586230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation
587230557Sjimharris *         is successful.
588230557Sjimharris */
589230557Sjimharrisstatic
590230557SjimharrisSCI_STATUS scif_sas_domain_stopping_complete_io_handler(
591230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
592230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
593230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
594230557Sjimharris)
595230557Sjimharris{
596230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain;
597230557Sjimharris   SCI_STATUS          status;
598230557Sjimharris
599230557Sjimharris   SCIF_LOG_TRACE((
600230557Sjimharris      sci_base_object_get_logger(domain),
601230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
602230557Sjimharris      "scif_sas_domain_stopping_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n",
603230557Sjimharris      domain, remote_device, io_request
604230557Sjimharris   ));
605230557Sjimharris
606230557Sjimharris   status = scif_sas_domain_ready_complete_io_handler(
607230557Sjimharris               domain, remote_device, io_request
608230557Sjimharris            );
609230557Sjimharris
610230557Sjimharris   // Attempt to transition to the stopped state.
611230557Sjimharris   scif_sas_domain_transition_to_stopped_state(fw_domain);
612230557Sjimharris
613230557Sjimharris   return status;
614230557Sjimharris}
615230557Sjimharris
616230557Sjimharris
617230557Sjimharris/**
618230557Sjimharris * @brief This method provides STOPPING state specific handling for
619230557Sjimharris *        when a user attempts to complete an IO request.
620230557Sjimharris *
621230557Sjimharris * @param[in]  domain This parameter specifies the domain object
622230557Sjimharris *             on which the user is attempting to perform a complete IO
623230557Sjimharris *             operation.
624230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
625230557Sjimharris *             object on which the user is attempting to perform a complete
626230557Sjimharris *             IO operation.
627230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
628230557Sjimharris *             being completed.
629230557Sjimharris *
630230557Sjimharris * @return This method returns an indication of whether the complete IO
631230557Sjimharris *         operation succeeded.
632230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation
633230557Sjimharris *         is successful.
634230557Sjimharris */
635230557Sjimharrisstatic
636230557SjimharrisSCI_STATUS scif_sas_domain_stopping_complete_high_priority_io_handler(
637230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
638230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
639230557Sjimharris   SCI_BASE_REQUEST_T       * io_request,
640230557Sjimharris   void                     * response_data,
641230557Sjimharris   SCI_IO_STATUS              completion_status
642230557Sjimharris)
643230557Sjimharris{
644230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain;
645230557Sjimharris   SCI_STATUS          status;
646230557Sjimharris
647230557Sjimharris   SCIF_LOG_TRACE((
648230557Sjimharris      sci_base_object_get_logger(domain),
649230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
650230557Sjimharris      "scif_sas_domain_stopping_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n",
651230557Sjimharris      domain, remote_device, io_request
652230557Sjimharris   ));
653230557Sjimharris
654230557Sjimharris   status = scif_sas_domain_ready_complete_high_priority_io_handler(
655230557Sjimharris               domain, remote_device, io_request, response_data, completion_status
656230557Sjimharris            );
657230557Sjimharris
658230557Sjimharris   // Attempt to transition to the stopped state.
659230557Sjimharris   scif_sas_domain_transition_to_stopped_state(fw_domain);
660230557Sjimharris
661230557Sjimharris   return status;
662230557Sjimharris}
663230557Sjimharris
664230557Sjimharris
665230557Sjimharris/**
666230557Sjimharris * @brief This method provides STOPPING state specific handling for
667230557Sjimharris *        when a user attempts to complete a task request.
668230557Sjimharris *
669230557Sjimharris * @param[in]  domain This parameter specifies the domain object
670230557Sjimharris *             on which the user is attempting to perform a complete task
671230557Sjimharris *             operation.
672230557Sjimharris *
673230557Sjimharris * @return This method returns an indication of whether the complete task
674230557Sjimharris *         operation succeeded.
675230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete task operation
676230557Sjimharris *         begins successfully.
677230557Sjimharris */
678230557Sjimharrisstatic
679230557SjimharrisSCI_STATUS scif_sas_domain_stopping_complete_task_handler(
680230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
681230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
682230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
683230557Sjimharris)
684230557Sjimharris{
685230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain;
686230557Sjimharris   SCI_STATUS          status;
687230557Sjimharris
688230557Sjimharris   SCIF_LOG_TRACE((
689230557Sjimharris      sci_base_object_get_logger(domain),
690230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
691230557Sjimharris      "scif_sas_domain_stopping_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n",
692230557Sjimharris      domain, remote_device, task_request
693230557Sjimharris   ));
694230557Sjimharris
695230557Sjimharris   status = scif_sas_domain_ready_complete_task_handler(
696230557Sjimharris               domain, remote_device, task_request
697230557Sjimharris            );
698230557Sjimharris
699230557Sjimharris   // Attempt to transition to the stopped state.
700230557Sjimharris   scif_sas_domain_transition_to_stopped_state(fw_domain);
701230557Sjimharris
702230557Sjimharris   return SCI_SUCCESS;
703230557Sjimharris}
704230557Sjimharris
705230557Sjimharris//******************************************************************************
706230557Sjimharris//* D I S C O V E R I N G   H A N D L E R S
707230557Sjimharris//******************************************************************************
708230557Sjimharris
709230557Sjimharris/**
710230557Sjimharris * @brief This method provides DISCOVERING state specific processing for
711230557Sjimharris *        reception of a port NOT ready notification from the core.  A port
712230557Sjimharris *        NOT ready notification forces the discovery operation to complete
713230557Sjimharris *        in error.  Additionally, all IOs are aborted and devices removed.
714230557Sjimharris *
715230557Sjimharris * @param[in]  domain This parameter specifies the domain object
716230557Sjimharris *             for which the core port is no longer ready.
717230557Sjimharris *
718230557Sjimharris * @return
719230557Sjimharris */
720230557Sjimharrisstatic
721230557SjimharrisSCI_STATUS scif_sas_domain_discovering_port_not_ready_handler(
722230557Sjimharris   SCI_BASE_DOMAIN_T * domain,
723230557Sjimharris   U32                 reason_code
724230557Sjimharris)
725230557Sjimharris{
726230557Sjimharris   SCIF_LOG_TRACE((
727230557Sjimharris      sci_base_object_get_logger(domain),
728230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
729230557Sjimharris      "scif_sas_domain_discovering_port_not_ready_handler(0x%x, 0x%x) enter\n",
730230557Sjimharris      domain,
731230557Sjimharris      reason_code
732230557Sjimharris   ));
733230557Sjimharris
734230557Sjimharris   // Change to the STOPPING state to cause existing request
735230557Sjimharris   // completions to be terminated and devices removed.
736230557Sjimharris   sci_base_state_machine_change_state(
737230557Sjimharris      &domain->state_machine, SCI_BASE_DOMAIN_STATE_STOPPING
738230557Sjimharris   );
739230557Sjimharris
740230557Sjimharris   return SCI_SUCCESS;
741230557Sjimharris}
742230557Sjimharris
743230557Sjimharrisstatic
744230557SjimharrisSCI_STATUS scif_sas_domain_discovering_device_start_complete_handler(
745230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
746230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
747230557Sjimharris)
748230557Sjimharris{
749230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)domain;
750230557Sjimharris
751230557Sjimharris   SCIF_LOG_TRACE((
752230557Sjimharris      sci_base_object_get_logger(domain),
753230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
754230557Sjimharris      "scif_sas_domain_discovering_device_start_complete_handler(0x%x) enter\n",
755230557Sjimharris      domain, remote_device
756230557Sjimharris   ));
757230557Sjimharris
758230557Sjimharris   //domain will decide what's next step.
759230557Sjimharris   scif_sas_domain_continue_discover(fw_domain);
760230557Sjimharris
761230557Sjimharris   return SCI_SUCCESS;
762230557Sjimharris}
763230557Sjimharris
764230557Sjimharris// ---------------------------------------------------------------------------
765230557Sjimharris
766230557Sjimharrisstatic
767230557SjimharrisSCI_STATUS scif_sas_domain_discovering_device_stop_complete_handler(
768230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
769230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
770230557Sjimharris)
771230557Sjimharris{
772230557Sjimharris   SCIF_LOG_TRACE((
773230557Sjimharris      sci_base_object_get_logger(domain),
774230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
775230557Sjimharris      "scif_sas_domain_discovering_device_stop_complete_handler(0x%x) enter\n",
776230557Sjimharris      domain, remote_device
777230557Sjimharris   ));
778230557Sjimharris
779230557Sjimharris   return SCI_FAILURE;
780230557Sjimharris}
781230557Sjimharris
782230557Sjimharris
783230557Sjimharris/**
784230557Sjimharris * @brief This method provides DISCOVERING state specific handling for when a user
785230557Sjimharris *        attempts to start a high priority IO request.
786230557Sjimharris *
787230557Sjimharris * @param[in]  domain This parameter specifies the domain object
788230557Sjimharris *             on which the user is attempting to perform a start IO
789230557Sjimharris *             operation.
790230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
791230557Sjimharris *             object on which the user is attempting to perform a start IO
792230557Sjimharris *             operation.
793230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
794230557Sjimharris *             being started.
795230557Sjimharris *
796230557Sjimharris * @return This method returns an indication of whether the start IO
797230557Sjimharris *         operation succeeded.
798230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start IO operation
799230557Sjimharris *         begins successfully.
800230557Sjimharris */
801230557Sjimharrisstatic
802230557SjimharrisSCI_STATUS scif_sas_domain_discovering_start_high_priority_io_handler(
803230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
804230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
805230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
806230557Sjimharris)
807230557Sjimharris{
808230557Sjimharris   SCIF_SAS_DOMAIN_T        * fw_domain  = (SCIF_SAS_DOMAIN_T*) domain;
809230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device  = (SCIF_SAS_REMOTE_DEVICE_T*)
810230557Sjimharris                                           remote_device;
811230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request = (SCIF_SAS_REQUEST_T*) io_request;
812230557Sjimharris   SCI_STATUS                 status;
813230557Sjimharris
814230557Sjimharris   SCIF_LOG_TRACE((
815230557Sjimharris      sci_base_object_get_logger(domain),
816230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
817230557Sjimharris      "scif_sas_domain_discovery_start_high_priority_request_handler(0x%x, 0x%x, 0x%x) enter\n",
818230557Sjimharris      domain, remote_device, io_request
819230557Sjimharris   ));
820230557Sjimharris
821230557Sjimharris   status = fw_device->state_handlers->start_high_priority_io_handler(
822230557Sjimharris               &fw_device->parent, &fw_request->parent
823230557Sjimharris            );
824230557Sjimharris
825230557Sjimharris   if (status == SCI_SUCCESS)
826230557Sjimharris   {
827230557Sjimharris      // Add the IO to the list of outstanding requests on the domain.
828230557Sjimharris
829230557Sjimharris      // It is possible this high priority IO's has already been added to
830230557Sjimharris      // the domain's list as a SCIF_SAS_TASK_REQUEST. We need to check
831230557Sjimharris      // if it is already on the list.
832230557Sjimharris      if ( ! sci_fast_list_is_on_this_list(
833230557Sjimharris               &fw_domain->request_list, &fw_request->list_element))
834230557Sjimharris
835230557Sjimharris         sci_fast_list_insert_tail(
836230557Sjimharris            &fw_domain->request_list, &fw_request->list_element
837230557Sjimharris         );
838230557Sjimharris   }
839230557Sjimharris
840230557Sjimharris   return status;
841230557Sjimharris}
842230557Sjimharris
843230557Sjimharris
844230557Sjimharris/**
845230557Sjimharris * @brief This method provides DISCOVERING state specific handling for
846230557Sjimharris *        when a user attempts to complete an IO request.  User IOs are
847230557Sjimharris *        allowed to be completed during discovery.
848230557Sjimharris *
849230557Sjimharris * @param[in]  domain This parameter specifies the domain object
850230557Sjimharris *             on which the user is attempting to perform a complete IO
851230557Sjimharris *             operation.
852230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
853230557Sjimharris *             object on which the user is attempting to perform a complete
854230557Sjimharris *             IO operation.
855230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
856230557Sjimharris *             being completed.
857230557Sjimharris *
858230557Sjimharris * @return This method returns an indication of whether the complete IO
859230557Sjimharris *         operation succeeded.
860230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation
861230557Sjimharris *         is successful.
862230557Sjimharris */
863230557Sjimharrisstatic
864230557SjimharrisSCI_STATUS scif_sas_domain_discovering_complete_io_handler(
865230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
866230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
867230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
868230557Sjimharris)
869230557Sjimharris{
870230557Sjimharris   SCIF_LOG_TRACE((
871230557Sjimharris      sci_base_object_get_logger(domain),
872230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
873230557Sjimharris      "scif_sas_domain_discovering_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n",
874230557Sjimharris      domain, remote_device, io_request
875230557Sjimharris   ));
876230557Sjimharris
877230557Sjimharris   return scif_sas_domain_ready_complete_io_handler(
878230557Sjimharris             domain, remote_device, io_request
879230557Sjimharris          );
880230557Sjimharris}
881230557Sjimharris
882230557Sjimharris/**
883230557Sjimharris * @brief This method provides DISCOVERING state specific handling for
884230557Sjimharris *        when a user attempts to complete an high priroity IO request.  User
885230557Sjimharris *        IOs are allowed to be completed during discovery.
886230557Sjimharris *
887230557Sjimharris * @param[in]  domain This parameter specifies the domain object
888230557Sjimharris *             on which the user is attempting to perform a complete IO
889230557Sjimharris *             operation.
890230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
891230557Sjimharris *             object on which the user is attempting to perform a complete
892230557Sjimharris *             IO operation.
893230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
894230557Sjimharris *             being completed.
895230557Sjimharris *
896230557Sjimharris * @return This method returns an indication of whether the complete IO
897230557Sjimharris *         operation succeeded.
898230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation
899230557Sjimharris *         is successful.
900230557Sjimharris */
901230557Sjimharrisstatic
902230557SjimharrisSCI_STATUS scif_sas_domain_discovering_complete_high_priority_io_handler(
903230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
904230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
905230557Sjimharris   SCI_BASE_REQUEST_T       * io_request,
906230557Sjimharris   void                     * response_data,
907230557Sjimharris   SCI_IO_STATUS              completion_status
908230557Sjimharris)
909230557Sjimharris{
910230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
911230557Sjimharris                                          remote_device;
912230557Sjimharris   SCIF_SAS_REQUEST_T       * fw_request= (SCIF_SAS_REQUEST_T*) io_request;
913230557Sjimharris
914230557Sjimharris   SCIC_TRANSPORT_PROTOCOL    protocol;
915230557Sjimharris
916230557Sjimharris   SCIF_LOG_TRACE((
917230557Sjimharris      sci_base_object_get_logger(domain),
918230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
919230557Sjimharris      "scif_sas_domain_discovering_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
920230557Sjimharris      domain, remote_device, io_request, response_data
921230557Sjimharris   ));
922230557Sjimharris
923230557Sjimharris   protocol = scic_io_request_get_protocol(fw_request->core_object);
924230557Sjimharris
925230557Sjimharris   // Remove the IO from the list of outstanding requests on the domain.
926230557Sjimharris
927230557Sjimharris   // If the request is an SMP HARD/LINK RESET request, then the request
928230557Sjimharris   // came through the task management path (partially).  As a result,
929230557Sjimharris   // the accounting for the request is managed in the task request
930230557Sjimharris   // completion path.  Thus, only change the domain request counter if
931230557Sjimharris   // the request is not an SMP target reset of some sort.
932230557Sjimharris   if (
933230557Sjimharris         (protocol != SCIC_SMP_PROTOCOL)
934230557Sjimharris      || (fw_device->protocol_device.smp_device.current_activity !=
935230557Sjimharris                SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_TARGET_RESET)
936230557Sjimharris   )
937230557Sjimharris   {
938230557Sjimharris      sci_fast_list_remove_element(&fw_request->list_element);
939230557Sjimharris   }
940230557Sjimharris
941230557Sjimharris   return fw_device->state_handlers->complete_high_priority_io_handler(
942230557Sjimharris             &fw_device->parent, &fw_request->parent, response_data, completion_status
943230557Sjimharris          );
944230557Sjimharris}
945230557Sjimharris
946230557Sjimharris
947230557Sjimharris/**
948230557Sjimharris * @brief This method provides DISCOVERING state specific handling for
949230557Sjimharris *        when the framework attempts to complete an IO request.  Internal
950230557Sjimharris *        Framework IOs allowed to be continued during discovery.
951230557Sjimharris *
952230557Sjimharris * @param[in]  domain This parameter specifies the domain object
953230557Sjimharris *             on which the user is attempting to perform a continue IO
954230557Sjimharris *             operation.
955230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
956230557Sjimharris *             object on which the user is attempting to perform a continue
957230557Sjimharris *             IO operation.
958230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
959230557Sjimharris *             being continued.
960230557Sjimharris *
961230557Sjimharris * @return This method returns an indication of whether the continue IO
962230557Sjimharris *         operation succeeded.
963230557Sjimharris * @retval SCI_SUCCESS This value is returned when the continue IO operation
964230557Sjimharris *         is successful.
965230557Sjimharris */
966230557Sjimharrisstatic
967230557SjimharrisSCI_STATUS scif_sas_domain_discovering_continue_io_handler(
968230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
969230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
970230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
971230557Sjimharris)
972230557Sjimharris{
973230557Sjimharris   SCIF_LOG_TRACE((
974230557Sjimharris      sci_base_object_get_logger(domain),
975230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST,
976230557Sjimharris      "scif_sas_domain_discovering_continue_io_handler(0x%x, 0x%x, 0x%x) enter\n",
977230557Sjimharris      domain, remote_device, io_request
978230557Sjimharris   ));
979230557Sjimharris
980230557Sjimharris   /// @todo fix return code handling.
981230557Sjimharris   return SCI_FAILURE;
982230557Sjimharris}
983230557Sjimharris
984230557Sjimharris
985230557Sjimharris/**
986230557Sjimharris * @brief This method provides handling when a user attempts to start
987230557Sjimharris *        a task on a domain in DISCOVER state, only hard reset is allowed.
988230557Sjimharris *
989230557Sjimharris * @param[in]  domain This parameter specifies the domain object
990230557Sjimharris *             on which the user is attempting to perform a start task
991230557Sjimharris *             operation.
992230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
993230557Sjimharris *             object on which the user is attempting to perform a start IO
994230557Sjimharris *             operation.
995230557Sjimharris * @param[in]  task_request This parameter specifies the task request that
996230557Sjimharris *             is being started.
997230557Sjimharris *
998230557Sjimharris * @return This method returns a status of start task operations
999230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is returned for any tasks,
1000230557Sjimharris *         except for HARD RESET.
1001230557Sjimharris */
1002230557Sjimharrisstatic
1003230557SjimharrisSCI_STATUS scif_sas_domain_discovering_start_task_handler(
1004230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1005230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1006230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
1007230557Sjimharris)
1008230557Sjimharris{
1009230557Sjimharris   SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
1010230557Sjimharris                                          remote_device;
1011230557Sjimharris   SCIF_SAS_TASK_REQUEST_T  * fw_task = (SCIF_SAS_TASK_REQUEST_T*)task_request;
1012230557Sjimharris
1013230557Sjimharris   //Only let target reset go through.
1014230557Sjimharris   if (scif_sas_task_request_get_function(fw_task)
1015230557Sjimharris             == SCI_SAS_HARD_RESET)
1016230557Sjimharris   {
1017230557Sjimharris      //If the domain is in the middle of smp DISCOVER process,
1018230557Sjimharris      //interrupt it. After target reset is done, resume the smp DISCOVERY.
1019230557Sjimharris      scif_sas_domain_cancel_smp_activities(fw_device->domain);
1020230557Sjimharris
1021230557Sjimharris      return scif_sas_domain_ready_start_task_handler(domain, remote_device, task_request);
1022230557Sjimharris   }
1023230557Sjimharris   else{
1024230557Sjimharris      SCIF_LOG_WARNING((
1025230557Sjimharris         sci_base_object_get_logger(domain),
1026230557Sjimharris         SCIF_LOG_OBJECT_DOMAIN,
1027230557Sjimharris         "Domain:0x%x Device:0x%x State:0x%x start task message invalid\n",
1028230557Sjimharris         domain, remote_device,
1029230557Sjimharris         sci_base_state_machine_get_state(&domain->state_machine)
1030230557Sjimharris      ));
1031230557Sjimharris
1032230557Sjimharris      return SCI_FAILURE_INVALID_STATE;
1033230557Sjimharris   }
1034230557Sjimharris}
1035230557Sjimharris
1036230557Sjimharris
1037230557Sjimharris/**
1038230557Sjimharris * @brief This method provides DISCOVERING state specific handling for
1039230557Sjimharris *        when a user attempts to complete a task request.  User task
1040230557Sjimharris *        management requests are allowed to be completed during discovery.
1041230557Sjimharris *
1042230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1043230557Sjimharris *             on which the user is attempting to perform a complete IO
1044230557Sjimharris *             operation.
1045230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1046230557Sjimharris *             object on which the user is attempting to perform a complete
1047230557Sjimharris *             IO operation.
1048230557Sjimharris * @param[in]  task_request This parameter specifies the task request that
1049230557Sjimharris *             is being completed.
1050230557Sjimharris *
1051230557Sjimharris * @return This method returns an indication of whether the complete task
1052230557Sjimharris *         management operation succeeded.
1053230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete task request
1054230557Sjimharris *         is successful.
1055230557Sjimharris */
1056230557Sjimharrisstatic
1057230557SjimharrisSCI_STATUS scif_sas_domain_discovering_complete_task_handler(
1058230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1059230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1060230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
1061230557Sjimharris)
1062230557Sjimharris{
1063230557Sjimharris   SCI_STATUS status;
1064230557Sjimharris
1065230557Sjimharris   SCIF_LOG_TRACE((
1066230557Sjimharris      sci_base_object_get_logger(domain),
1067230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
1068230557Sjimharris      "scif_sas_domain_discovering_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n",
1069230557Sjimharris      domain, remote_device, task_request
1070230557Sjimharris   ));
1071230557Sjimharris
1072230557Sjimharris   status = scif_sas_domain_ready_complete_task_handler(
1073230557Sjimharris               domain, remote_device, task_request
1074230557Sjimharris            );
1075230557Sjimharris
1076230557Sjimharris   return status;
1077230557Sjimharris}
1078230557Sjimharris
1079230557Sjimharris//******************************************************************************
1080230557Sjimharris//* D E F A U L T   H A N D L E R S
1081230557Sjimharris//******************************************************************************
1082230557Sjimharris
1083230557Sjimharris/**
1084230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1085230557Sjimharris *        when a user attempts to discover a domain and a discovery
1086230557Sjimharris *        operation is not allowed.
1087230557Sjimharris *
1088230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1089230557Sjimharris *             on which the user is attempting to perform an discover
1090230557Sjimharris *             operation.
1091230557Sjimharris * @param[in]  op_timeout This parameter specifies the timeout
1092230557Sjimharris *             (in milliseconds) for the entire discovery operation.
1093230557Sjimharris *             This timeout value should be some multiple of the
1094230557Sjimharris *             individual device_timeout value.
1095230557Sjimharris * @param[in]  device_timeout This parameter specifies the timeout
1096230557Sjimharris *             (in milliseconds) for an individual device being discovered
1097230557Sjimharris *             and configured during this operation.
1098230557Sjimharris *
1099230557Sjimharris * @return This method returns an indication that discovery operations
1100230557Sjimharris *         are not allowed.
1101230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1102230557Sjimharris */
1103230557Sjimharrisstatic
1104230557SjimharrisSCI_STATUS scif_sas_domain_default_discover_handler(
1105230557Sjimharris   SCI_BASE_DOMAIN_T * domain,
1106230557Sjimharris   U32                 op_timeout,
1107230557Sjimharris   U32                 device_timeout
1108230557Sjimharris)
1109230557Sjimharris{
1110230557Sjimharris   SCIF_LOG_WARNING((
1111230557Sjimharris      sci_base_object_get_logger((SCIF_SAS_DOMAIN_T *)domain),
1112230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY,
1113230557Sjimharris      "Domain:0x%x State:0x%x requested to discover in invalid state\n",
1114230557Sjimharris      domain,
1115230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1116230557Sjimharris   ));
1117230557Sjimharris
1118230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1119230557Sjimharris}
1120230557Sjimharris
1121230557Sjimharris/**
1122230557Sjimharris * @brief This method provides default processing for reception of a port
1123230557Sjimharris *        ready notification from the core.
1124230557Sjimharris *
1125230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1126230557Sjimharris *             on which the core port has just come ready.
1127230557Sjimharris *
1128230557Sjimharris * @return
1129230557Sjimharris */
1130230557Sjimharrisstatic
1131230557SjimharrisSCI_STATUS scif_sas_domain_default_port_ready_handler(
1132230557Sjimharris   SCI_BASE_DOMAIN_T * domain
1133230557Sjimharris)
1134230557Sjimharris{
1135230557Sjimharris   SCIF_LOG_INFO((
1136230557Sjimharris      sci_base_object_get_logger(domain),
1137230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1138230557Sjimharris      "Domain:0x%x State:0x%x port now ready\n",
1139230557Sjimharris      domain,
1140230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1141230557Sjimharris   ));
1142230557Sjimharris
1143230557Sjimharris   return SCI_SUCCESS;
1144230557Sjimharris}
1145230557Sjimharris
1146230557Sjimharris/**
1147230557Sjimharris * @brief This method provides default processing for reception of a port
1148230557Sjimharris *        NOT ready notification from the core.
1149230557Sjimharris *
1150230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1151230557Sjimharris *             on which the core port has just come ready.
1152230557Sjimharris *
1153230557Sjimharris * @return
1154230557Sjimharris */
1155230557Sjimharrisstatic
1156230557SjimharrisSCI_STATUS scif_sas_domain_default_port_not_ready_handler(
1157230557Sjimharris   SCI_BASE_DOMAIN_T * domain,
1158230557Sjimharris   U32                 reason_code
1159230557Sjimharris)
1160230557Sjimharris{
1161230557Sjimharris   SCIF_LOG_WARNING((
1162230557Sjimharris      sci_base_object_get_logger(domain),
1163230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1164230557Sjimharris      "Domain:0x%x State:0x%x Port Not Ready 0x%x in invalid state\n",
1165230557Sjimharris      domain,
1166230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine),
1167230557Sjimharris      reason_code
1168230557Sjimharris   ));
1169230557Sjimharris
1170230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1171230557Sjimharris}
1172230557Sjimharris
1173230557Sjimharris/**
1174230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1175230557Sjimharris *        when a user attempts to start an IO on a domain and a start
1176230557Sjimharris *        IO operation is not allowed.
1177230557Sjimharris *
1178230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1179230557Sjimharris *             on which the user is attempting to perform a start IO
1180230557Sjimharris *             operation.
1181230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1182230557Sjimharris *             object on which the user is attempting to perform a start IO
1183230557Sjimharris *             operation.
1184230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
1185230557Sjimharris *             being started.
1186230557Sjimharris *
1187230557Sjimharris * @return This method returns an indication that start IO operations
1188230557Sjimharris *         are not allowed.
1189230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1190230557Sjimharris */
1191230557Sjimharrisstatic
1192230557SjimharrisSCI_STATUS scif_sas_domain_default_start_io_handler(
1193230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1194230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1195230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
1196230557Sjimharris)
1197230557Sjimharris{
1198230557Sjimharris   SCIF_LOG_WARNING((
1199230557Sjimharris      sci_base_object_get_logger(domain),
1200230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1201230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x start IO message invalid\n",
1202230557Sjimharris      domain, remote_device,
1203230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1204230557Sjimharris   ));
1205230557Sjimharris
1206230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1207230557Sjimharris}
1208230557Sjimharris
1209230557Sjimharris/**
1210230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1211230557Sjimharris *        when a user attempts to complete an IO on a domain and a
1212230557Sjimharris *        complete IO operation is not allowed.
1213230557Sjimharris *
1214230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1215230557Sjimharris *             on which the user is attempting to perform a complete IO
1216230557Sjimharris *             operation.
1217230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1218230557Sjimharris *             object on which the user is attempting to perform a complete IO
1219230557Sjimharris *             operation.
1220230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
1221230557Sjimharris *             being completed.
1222230557Sjimharris *
1223230557Sjimharris * @return This method returns an indication that complete IO operations
1224230557Sjimharris *         are not allowed.
1225230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1226230557Sjimharris */
1227230557Sjimharrisstatic
1228230557SjimharrisSCI_STATUS scif_sas_domain_default_complete_io_handler(
1229230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1230230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1231230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
1232230557Sjimharris)
1233230557Sjimharris{
1234230557Sjimharris   SCIF_LOG_WARNING((
1235230557Sjimharris      sci_base_object_get_logger(domain),
1236230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1237230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x complete IO message invalid\n",
1238230557Sjimharris      domain, remote_device,
1239230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1240230557Sjimharris   ));
1241230557Sjimharris
1242230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1243230557Sjimharris}
1244230557Sjimharris
1245230557Sjimharris
1246230557Sjimharris/**
1247230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1248230557Sjimharris *        when a user attempts to complete an IO on a domain and a
1249230557Sjimharris *        complete IO operation is not allowed.
1250230557Sjimharris *
1251230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1252230557Sjimharris *             on which the user is attempting to perform a complete IO
1253230557Sjimharris *             operation.
1254230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1255230557Sjimharris *             object on which the user is attempting to perform a complete IO
1256230557Sjimharris *             operation.
1257230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
1258230557Sjimharris *             being completed.
1259230557Sjimharris *
1260230557Sjimharris * @return This method returns an indication that complete IO operations
1261230557Sjimharris *         are not allowed.
1262230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1263230557Sjimharris */
1264230557Sjimharrisstatic
1265230557SjimharrisSCI_STATUS scif_sas_domain_default_complete_high_priority_io_handler(
1266230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1267230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1268230557Sjimharris   SCI_BASE_REQUEST_T       * io_request,
1269230557Sjimharris   void                     * response_data,
1270230557Sjimharris   SCI_IO_STATUS              completion_status
1271230557Sjimharris)
1272230557Sjimharris{
1273230557Sjimharris   SCIF_LOG_WARNING((
1274230557Sjimharris      sci_base_object_get_logger(domain),
1275230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1276230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x complete IO message invalid\n",
1277230557Sjimharris      domain, remote_device,
1278230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1279230557Sjimharris   ));
1280230557Sjimharris
1281230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1282230557Sjimharris}
1283230557Sjimharris
1284230557Sjimharris/**
1285230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1286230557Sjimharris *        when a user attempts to continue an IO on a domain and a
1287230557Sjimharris *        continue IO operation is not allowed.
1288230557Sjimharris *
1289230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1290230557Sjimharris *             on which the user is attempting to perform a continue IO
1291230557Sjimharris *             operation.
1292230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1293230557Sjimharris *             object on which the user is attempting to perform a start IO
1294230557Sjimharris *             operation.
1295230557Sjimharris * @param[in]  io_request This parameter specifies the io request that is
1296230557Sjimharris *             being started.
1297230557Sjimharris *
1298230557Sjimharris * @return This method returns an indication that continue IO operations
1299230557Sjimharris *         are not allowed.
1300230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1301230557Sjimharris */
1302230557Sjimharrisstatic
1303230557SjimharrisSCI_STATUS scif_sas_domain_default_continue_io_handler(
1304230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1305230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1306230557Sjimharris   SCI_BASE_REQUEST_T       * io_request
1307230557Sjimharris)
1308230557Sjimharris{
1309230557Sjimharris   SCIF_LOG_WARNING((
1310230557Sjimharris      sci_base_object_get_logger(domain),
1311230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1312230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x contineu IO message invalid\n",
1313230557Sjimharris      domain, remote_device,
1314230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1315230557Sjimharris   ));
1316230557Sjimharris
1317230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1318230557Sjimharris}
1319230557Sjimharris
1320230557Sjimharris/**
1321230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1322230557Sjimharris *        when a user attempts to start a task on a domain and a start
1323230557Sjimharris *        task operation is not allowed.
1324230557Sjimharris *
1325230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1326230557Sjimharris *             on which the user is attempting to perform a start task
1327230557Sjimharris *             operation.
1328230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1329230557Sjimharris *             object on which the user is attempting to perform a start IO
1330230557Sjimharris *             operation.
1331230557Sjimharris * @param[in]  task_request This parameter specifies the task request that
1332230557Sjimharris *             is being started.
1333230557Sjimharris *
1334230557Sjimharris * @return This method returns an indication that start task operations
1335230557Sjimharris *         are not allowed.
1336230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1337230557Sjimharris */
1338230557Sjimharrisstatic
1339230557SjimharrisSCI_STATUS scif_sas_domain_default_start_task_handler(
1340230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1341230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1342230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
1343230557Sjimharris)
1344230557Sjimharris{
1345230557Sjimharris   SCIF_LOG_WARNING((
1346230557Sjimharris      sci_base_object_get_logger(domain),
1347230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1348230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x start task message invalid\n",
1349230557Sjimharris      domain, remote_device,
1350230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1351230557Sjimharris   ));
1352230557Sjimharris
1353230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1354230557Sjimharris}
1355230557Sjimharris
1356230557Sjimharris/**
1357230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1358230557Sjimharris *        when a user attempts to complete a task on a domain and a
1359230557Sjimharris *        complete task operation is not allowed.
1360230557Sjimharris *
1361230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1362230557Sjimharris *             on which the user is attempting to perform a complete task
1363230557Sjimharris *             operation.
1364230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1365230557Sjimharris *             object on which the user is attempting to perform a start IO
1366230557Sjimharris *             operation.
1367230557Sjimharris * @param[in]  task_request This parameter specifies the task request that
1368230557Sjimharris *             is being started.
1369230557Sjimharris *
1370230557Sjimharris * @return This method returns an indication that complete task operations
1371230557Sjimharris *         are not allowed.
1372230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1373230557Sjimharris */
1374230557Sjimharrisstatic
1375230557SjimharrisSCI_STATUS scif_sas_domain_default_complete_task_handler(
1376230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1377230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device,
1378230557Sjimharris   SCI_BASE_REQUEST_T       * task_request
1379230557Sjimharris)
1380230557Sjimharris{
1381230557Sjimharris   SCIF_LOG_WARNING((
1382230557Sjimharris      sci_base_object_get_logger(domain),
1383230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1384230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x complete task message invalid\n",
1385230557Sjimharris      domain, remote_device,
1386230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1387230557Sjimharris   ));
1388230557Sjimharris
1389230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1390230557Sjimharris}
1391230557Sjimharris
1392230557Sjimharris/**
1393230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1394230557Sjimharris *        when a remote device start operation completes in a state.
1395230557Sjimharris *
1396230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1397230557Sjimharris *             on which the remote device start operation is completing.
1398230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1399230557Sjimharris *             for which the start operation is completing.
1400230557Sjimharris *
1401230557Sjimharris * @return This method returns an indication that start operation
1402230557Sjimharris *         completion is not allowed.
1403230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1404230557Sjimharris */
1405230557Sjimharrisstatic
1406230557SjimharrisSCI_STATUS scif_sas_domain_default_device_start_complete_handler(
1407230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1408230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
1409230557Sjimharris)
1410230557Sjimharris{
1411230557Sjimharris   SCIF_LOG_WARNING((
1412230557Sjimharris      sci_base_object_get_logger(domain),
1413230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1414230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x device stop complete message invalid\n",
1415230557Sjimharris      domain, remote_device,
1416230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1417230557Sjimharris   ));
1418230557Sjimharris
1419230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1420230557Sjimharris}
1421230557Sjimharris
1422230557Sjimharris/**
1423230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1424230557Sjimharris *        when a remote device stop operation completes in a state.
1425230557Sjimharris *
1426230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1427230557Sjimharris *             on which the remote device stop operation is completing.
1428230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1429230557Sjimharris *             for which the stop operation is completing.
1430230557Sjimharris *
1431230557Sjimharris * @return This method returns an indication that stop operation
1432230557Sjimharris *         completion is not allowed.
1433230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1434230557Sjimharris */
1435230557Sjimharrisstatic
1436230557SjimharrisSCI_STATUS scif_sas_domain_default_device_stop_complete_handler(
1437230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1438230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
1439230557Sjimharris)
1440230557Sjimharris{
1441230557Sjimharris   SCIF_LOG_WARNING((
1442230557Sjimharris      sci_base_object_get_logger(domain),
1443230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1444230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x device stop complete message invalid\n",
1445230557Sjimharris      domain, remote_device,
1446230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1447230557Sjimharris   ));
1448230557Sjimharris
1449230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1450230557Sjimharris}
1451230557Sjimharris
1452230557Sjimharris/**
1453230557Sjimharris * @brief This method provides default handling (i.e. returns an error)
1454230557Sjimharris *        when sci user try to destruct a remote device of this domain.
1455230557Sjimharris *
1456230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1457230557Sjimharris *             on which the remote device is to be destructed.
1458230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1459230557Sjimharris *             to be destructed.
1460230557Sjimharris *
1461230557Sjimharris * @return This method returns an indication that device destruction
1462230557Sjimharris *         is not allowed.
1463230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned.
1464230557Sjimharris */
1465230557Sjimharrisstatic
1466230557SjimharrisSCI_STATUS scif_sas_domain_default_device_destruct_handler(
1467230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1468230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
1469230557Sjimharris)
1470230557Sjimharris{
1471230557Sjimharris   SCIF_LOG_WARNING((
1472230557Sjimharris      sci_base_object_get_logger(domain),
1473230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1474230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x device destruct in invalid state\n",
1475230557Sjimharris      domain, remote_device,
1476230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1477230557Sjimharris   ));
1478230557Sjimharris
1479230557Sjimharris   return SCI_FAILURE_INVALID_STATE;
1480230557Sjimharris}
1481230557Sjimharris
1482230557Sjimharris
1483230557Sjimharris/**
1484230557Sjimharris * @brief This method provides handling when sci user destruct a remote
1485230557Sjimharris *        device of this domain in discovering state. Mainly the device
1486230557Sjimharris *        is removed from domain's remote_device_list.
1487230557Sjimharris *
1488230557Sjimharris * @param[in]  domain This parameter specifies the domain object
1489230557Sjimharris *             on which the remote device is to be destructed.
1490230557Sjimharris * @param[in]  remote_device This parameter specifies the remote device
1491230557Sjimharris *             to be destructed.
1492230557Sjimharris *
1493230557Sjimharris * @return This method returns a status of the device destruction.
1494230557Sjimharris * @retval SCI_SUCCESS This value is returned when a remote device is
1495230557Sjimharris *         successfully removed from domain.
1496230557Sjimharris */
1497230557Sjimharrisstatic
1498230557SjimharrisSCI_STATUS scif_sas_domain_discovering_device_destruct_handler(
1499230557Sjimharris   SCI_BASE_DOMAIN_T        * domain,
1500230557Sjimharris   SCI_BASE_REMOTE_DEVICE_T * remote_device
1501230557Sjimharris)
1502230557Sjimharris{
1503230557Sjimharris   SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)domain;
1504230557Sjimharris
1505230557Sjimharris   SCIF_LOG_WARNING((
1506230557Sjimharris      sci_base_object_get_logger(domain),
1507230557Sjimharris      SCIF_LOG_OBJECT_DOMAIN,
1508230557Sjimharris      "Domain:0x%x Device:0x%x State:0x%x device destruct in domain DISCOVERING state\n",
1509230557Sjimharris      domain, remote_device,
1510230557Sjimharris      sci_base_state_machine_get_state(&domain->state_machine)
1511230557Sjimharris   ));
1512230557Sjimharris
1513230557Sjimharris   //remove the remote device from domain's remote_device_list
1514230557Sjimharris   sci_abstract_list_erase(
1515230557Sjimharris      &(fw_domain->remote_device_list),
1516230557Sjimharris      remote_device
1517230557Sjimharris   );
1518230557Sjimharris
1519230557Sjimharris   return SCI_SUCCESS;
1520230557Sjimharris}
1521230557Sjimharris
1522230557Sjimharris
1523230557Sjimharris#define scif_sas_domain_stopped_discover_handler \
1524230557Sjimharris        scif_sas_domain_ready_discover_handler
1525230557Sjimharris
1526230557Sjimharris#define scif_sas_domain_default_start_high_priority_io_handler \
1527230557Sjimharris        scif_sas_domain_default_start_io_handler
1528230557Sjimharris
1529230557Sjimharris
1530230557SjimharrisSCI_BASE_DOMAIN_STATE_HANDLER_T
1531230557Sjimharris   scif_sas_domain_state_handler_table[SCI_BASE_DOMAIN_MAX_STATES] =
1532230557Sjimharris{
1533230557Sjimharris   // SCI_BASE_DOMAIN_STATE_INITIAL
1534230557Sjimharris   {
1535230557Sjimharris      scif_sas_domain_default_discover_handler,
1536230557Sjimharris      scif_sas_domain_default_port_ready_handler,
1537230557Sjimharris      scif_sas_domain_default_port_not_ready_handler,
1538230557Sjimharris      scif_sas_domain_default_device_start_complete_handler,
1539230557Sjimharris      scif_sas_domain_default_device_stop_complete_handler,
1540230557Sjimharris      scif_sas_domain_default_device_destruct_handler,
1541230557Sjimharris      scif_sas_domain_default_start_io_handler,
1542230557Sjimharris      scif_sas_domain_default_start_high_priority_io_handler,
1543230557Sjimharris      scif_sas_domain_default_complete_io_handler,
1544230557Sjimharris      scif_sas_domain_default_complete_high_priority_io_handler,
1545230557Sjimharris      scif_sas_domain_default_continue_io_handler,
1546230557Sjimharris      scif_sas_domain_default_start_task_handler,
1547230557Sjimharris      scif_sas_domain_default_complete_task_handler
1548230557Sjimharris   },
1549230557Sjimharris   // SCI_BASE_DOMAIN_STATE_STARTING
1550230557Sjimharris   {
1551230557Sjimharris      scif_sas_domain_default_discover_handler,
1552230557Sjimharris      scif_sas_domain_starting_port_ready_handler,
1553230557Sjimharris      scif_sas_domain_default_port_not_ready_handler,
1554230557Sjimharris      scif_sas_domain_default_device_start_complete_handler,
1555230557Sjimharris      scif_sas_domain_default_device_stop_complete_handler,
1556230557Sjimharris      scif_sas_domain_default_device_destruct_handler,
1557230557Sjimharris      scif_sas_domain_default_start_io_handler,
1558230557Sjimharris      scif_sas_domain_default_start_high_priority_io_handler,
1559230557Sjimharris      scif_sas_domain_default_complete_io_handler,
1560230557Sjimharris      scif_sas_domain_default_complete_high_priority_io_handler,
1561230557Sjimharris      scif_sas_domain_default_continue_io_handler,
1562230557Sjimharris      scif_sas_domain_default_start_task_handler,
1563230557Sjimharris      scif_sas_domain_default_complete_task_handler
1564230557Sjimharris   },
1565230557Sjimharris   // SCI_BASE_DOMAIN_STATE_READY
1566230557Sjimharris   {
1567230557Sjimharris      scif_sas_domain_ready_discover_handler,
1568230557Sjimharris      scif_sas_domain_default_port_ready_handler,
1569230557Sjimharris      scif_sas_domain_ready_port_not_ready_handler,
1570230557Sjimharris      scif_sas_domain_default_device_start_complete_handler,
1571230557Sjimharris      scif_sas_domain_default_device_stop_complete_handler,
1572230557Sjimharris      scif_sas_domain_default_device_destruct_handler,
1573230557Sjimharris      scif_sas_domain_ready_start_io_handler,
1574230557Sjimharris      scif_sas_domain_ready_start_high_priority_io_handler,
1575230557Sjimharris      scif_sas_domain_ready_complete_io_handler,
1576230557Sjimharris      scif_sas_domain_ready_complete_high_priority_io_handler,
1577230557Sjimharris      scif_sas_domain_ready_continue_io_handler,
1578230557Sjimharris      scif_sas_domain_ready_start_task_handler,
1579230557Sjimharris      scif_sas_domain_ready_complete_task_handler
1580230557Sjimharris   },
1581230557Sjimharris   // SCI_BASE_DOMAIN_STATE_STOPPING
1582230557Sjimharris   {
1583230557Sjimharris      scif_sas_domain_default_discover_handler,
1584230557Sjimharris      scif_sas_domain_default_port_ready_handler,
1585230557Sjimharris      scif_sas_domain_default_port_not_ready_handler,
1586230557Sjimharris      scif_sas_domain_default_device_start_complete_handler,
1587230557Sjimharris      scif_sas_domain_stopping_device_stop_complete_handler,
1588230557Sjimharris      scif_sas_domain_default_device_destruct_handler,
1589230557Sjimharris      scif_sas_domain_default_start_io_handler,
1590230557Sjimharris      scif_sas_domain_default_start_high_priority_io_handler,
1591230557Sjimharris      scif_sas_domain_stopping_complete_io_handler,
1592230557Sjimharris      scif_sas_domain_stopping_complete_high_priority_io_handler,
1593230557Sjimharris      scif_sas_domain_default_continue_io_handler,
1594230557Sjimharris      scif_sas_domain_default_start_task_handler,
1595230557Sjimharris      scif_sas_domain_stopping_complete_task_handler
1596230557Sjimharris   },
1597230557Sjimharris   // SCI_BASE_DOMAIN_STATE_STOPPED
1598230557Sjimharris   {
1599230557Sjimharris      scif_sas_domain_stopped_discover_handler,
1600230557Sjimharris      scif_sas_domain_default_port_ready_handler,
1601230557Sjimharris      scif_sas_domain_default_port_not_ready_handler,
1602230557Sjimharris      scif_sas_domain_default_device_start_complete_handler,
1603230557Sjimharris      scif_sas_domain_default_device_stop_complete_handler,
1604230557Sjimharris      scif_sas_domain_default_device_destruct_handler,
1605230557Sjimharris      scif_sas_domain_default_start_io_handler,
1606230557Sjimharris      scif_sas_domain_default_start_high_priority_io_handler,
1607230557Sjimharris      scif_sas_domain_default_complete_io_handler,
1608230557Sjimharris      scif_sas_domain_default_complete_high_priority_io_handler,
1609230557Sjimharris      scif_sas_domain_default_continue_io_handler,
1610230557Sjimharris      scif_sas_domain_default_start_task_handler,
1611230557Sjimharris      scif_sas_domain_default_complete_task_handler
1612230557Sjimharris   },
1613230557Sjimharris   // SCI_BASE_DOMAIN_STATE_DISCOVERING
1614230557Sjimharris   {
1615230557Sjimharris      scif_sas_domain_default_discover_handler,
1616230557Sjimharris      scif_sas_domain_default_port_ready_handler,
1617230557Sjimharris      scif_sas_domain_discovering_port_not_ready_handler,
1618230557Sjimharris      scif_sas_domain_discovering_device_start_complete_handler,
1619230557Sjimharris      scif_sas_domain_discovering_device_stop_complete_handler,
1620230557Sjimharris      scif_sas_domain_discovering_device_destruct_handler,  //
1621230557Sjimharris      scif_sas_domain_default_start_io_handler,
1622230557Sjimharris      scif_sas_domain_discovering_start_high_priority_io_handler,
1623230557Sjimharris      scif_sas_domain_discovering_complete_io_handler,
1624230557Sjimharris      scif_sas_domain_discovering_complete_high_priority_io_handler, //
1625230557Sjimharris      scif_sas_domain_discovering_continue_io_handler,
1626230557Sjimharris      scif_sas_domain_discovering_start_task_handler,
1627230557Sjimharris      scif_sas_domain_discovering_complete_task_handler
1628230557Sjimharris   }
1629230557Sjimharris};
1630230557Sjimharris
1631