scif_sas_task_request.c revision 230843
1191739Sobrien/*-
2191739Sobrien * This file is provided under a dual BSD/GPLv2 license.  When using or
3191739Sobrien * redistributing this file, you may do so under either license.
4191739Sobrien *
5191739Sobrien * GPL LICENSE SUMMARY
6191739Sobrien *
7191739Sobrien * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8191739Sobrien *
9191739Sobrien * This program is free software; you can redistribute it and/or modify
10191739Sobrien * it under the terms of version 2 of the GNU General Public License as
11191739Sobrien * published by the Free Software Foundation.
12191739Sobrien *
13191739Sobrien * This program is distributed in the hope that it will be useful, but
14191739Sobrien * WITHOUT ANY WARRANTY; without even the implied warranty of
15191739Sobrien * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16191739Sobrien * General Public License for more details.
17191739Sobrien *
18191739Sobrien * You should have received a copy of the GNU General Public License
19191739Sobrien * along with this program; if not, write to the Free Software
20191739Sobrien * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21191739Sobrien * The full GNU General Public License is included in this distribution
22191739Sobrien * in the file called LICENSE.GPL.
23191739Sobrien *
24191739Sobrien * BSD LICENSE
25191739Sobrien *
26191739Sobrien * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27226048Sobrien * All rights reserved.
28226048Sobrien *
29191739Sobrien * Redistribution and use in source and binary forms, with or without
30226048Sobrien * modification, are permitted provided that the following conditions
31226048Sobrien * are met:
32226048Sobrien *
33191739Sobrien *   * Redistributions of source code must retain the above copyright
34191739Sobrien *     notice, this list of conditions and the following disclaimer.
35191739Sobrien *   * Redistributions in binary form must reproduce the above copyright
36191739Sobrien *     notice, this list of conditions and the following disclaimer in
37191739Sobrien *     the documentation and/or other materials provided with the
38267843Sdelphij *     distribution.
39191739Sobrien *
40191739Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41191739Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42191739Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43191739Sobrien * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44191739Sobrien * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45191739Sobrien * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46191739Sobrien * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47191739Sobrien * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48191739Sobrien * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49191739Sobrien * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50226048Sobrien * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51226048Sobrien */
52226048Sobrien
53191739Sobrien#include <sys/cdefs.h>
54191739Sobrien__FBSDID("$FreeBSD$");
55191739Sobrien
56191739Sobrien/**
57191739Sobrien * @file
58191739Sobrien *
59191739Sobrien * @brief This file contains the task management request object
60191739Sobrien *        (SCIF_SAS_TASK_REQUEST) method implementations.
61192348Sdelphij */
62191739Sobrien
63191739Sobrien
64191739Sobrien#include <dev/isci/scil/intel_sas.h>
65191739Sobrien
66191739Sobrien#include <dev/isci/scil/scic_task_request.h>
67191739Sobrien#include <dev/isci/scil/scic_remote_device.h>
68191739Sobrien#include <dev/isci/scil/scic_user_callback.h>
69191739Sobrien#include <dev/isci/scil/scic_controller.h>
70191739Sobrien#include <dev/isci/scil/scif_user_callback.h>
71191739Sobrien
72191739Sobrien#include <dev/isci/scil/scif_sas_request.h>
73226048Sobrien#include <dev/isci/scil/scif_sas_task_request.h>
74226048Sobrien#include <dev/isci/scil/scif_sas_stp_task_request.h>
75226048Sobrien#include <dev/isci/scil/scif_sas_logger.h>
76226048Sobrien#include <dev/isci/scil/scif_sas_controller.h>
77191739Sobrien#include <dev/isci/scil/scif_sas_domain.h>
78234250Sobrien#include <dev/isci/scil/scif_sas_remote_device.h>
79191739Sobrien#include <dev/isci/scil/scif_sas_smp_io_request.h>
80191739Sobrien
81191739Sobrien//******************************************************************************
82226048Sobrien//* P U B L I C   M E T H O D S
83226048Sobrien//******************************************************************************
84191739Sobrien
85191739SobrienU32 scif_task_request_get_object_size(
86226048Sobrien   void
87226048Sobrien)
88191739Sobrien{
89191739Sobrien   return (sizeof(SCIF_SAS_TASK_REQUEST_T) + scic_task_request_get_object_size());
90191739Sobrien}
91191739Sobrien
92191739Sobrien// ---------------------------------------------------------------------------
93191739Sobrien
94191739SobrienU8 scif_sas_task_request_get_function(
95191739Sobrien   SCIF_SAS_TASK_REQUEST_T *fw_task
96226048Sobrien)
97226048Sobrien{
98191739Sobrien   return fw_task->function;
99191739Sobrien}
100226048Sobrien
101226048Sobrien// ---------------------------------------------------------------------------
102191739Sobrien
103191739Sobrienstatic
104191739SobrienSCI_STATUS scif_sas_task_request_generic_construct(
105191739Sobrien   SCI_CONTROLLER_HANDLE_T      scif_controller,
106191739Sobrien   SCI_REMOTE_DEVICE_HANDLE_T   scif_remote_device,
107191739Sobrien   U16                          io_tag,
108191739Sobrien   void                       * user_task_request_object,
109191739Sobrien   void                       * task_request_memory,
110191739Sobrien   SCI_TASK_REQUEST_HANDLE_T  * scif_task_request,
111191739Sobrien   U8                           task_function
112226048Sobrien)
113226048Sobrien{
114191739Sobrien   SCI_STATUS                 status;
115191739Sobrien   SCIF_SAS_CONTROLLER_T    * fw_controller   = (SCIF_SAS_CONTROLLER_T*)
116226048Sobrien                                                scif_controller;
117226048Sobrien   SCIF_SAS_TASK_REQUEST_T  * fw_task         = (SCIF_SAS_TASK_REQUEST_T*)
118191739Sobrien                                                task_request_memory;
119191739Sobrien   SCIF_SAS_REMOTE_DEVICE_T * fw_device       = (SCIF_SAS_REMOTE_DEVICE_T*)
120191739Sobrien                                                scif_remote_device;
121191739Sobrien   U8                       * core_request_memory;
122191739Sobrien
123191739Sobrien   SCIF_LOG_TRACE((
124191739Sobrien      sci_base_object_get_logger(fw_controller),
125191739Sobrien      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
126191739Sobrien      "scif_task_request_construct(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x) enter\n",
127191739Sobrien      scif_controller, scif_remote_device, io_tag, user_task_request_object,
128191739Sobrien      task_request_memory, scif_task_request
129226048Sobrien   ));
130226048Sobrien
131226048Sobrien   // Initialize the user's handle to the framework task request.
132226048Sobrien   *scif_task_request = fw_task;
133226048Sobrien
134226048Sobrien   // initialize affected request count
135226048Sobrien   fw_task->affected_request_count = 0;
136226048Sobrien   fw_task->io_tag_to_manage = SCI_CONTROLLER_INVALID_IO_TAG;
137226048Sobrien   fw_task->function = task_function;
138226048Sobrien
139226048Sobrien   if (task_function == SCI_SAS_HARD_RESET )
140226048Sobrien   {
141191739Sobrien      if (fw_device->containing_device != NULL )
142191739Sobrien      {// Target Reset is for an expander attached device,
143191739Sobrien       // go down to construct smp Phy Control request.
144191739Sobrien         scif_sas_smp_request_construct_phy_control(
145191739Sobrien            fw_controller,
146226048Sobrien            fw_device->containing_device,
147226048Sobrien            PHY_OPERATION_HARD_RESET,
148226048Sobrien            fw_device->expander_phy_identifier,
149226048Sobrien            user_task_request_object,
150226048Sobrien            task_request_memory
151226048Sobrien         );
152226048Sobrien      }
153226048Sobrien      else
154226048Sobrien      {
155226048Sobrien         scif_sas_request_construct(
156226048Sobrien            &fw_task->parent,
157226048Sobrien            fw_device,
158226048Sobrien            sci_base_object_get_logger(fw_controller),
159226048Sobrien            scif_sas_task_request_state_table
160226048Sobrien         );
161226048Sobrien
162226048Sobrien         // If target reset is for a DA device, don't build task at all.
163226048Sobrien         // Just set object association.
164191739Sobrien         sci_object_set_association(fw_task, user_task_request_object);
165191739Sobrien      }
166191739Sobrien
167191739Sobrien      return SCI_SUCCESS;
168191739Sobrien   }
169191739Sobrien
170191739Sobrien   // Construct the parent object first in order to ensure logging can
171191739Sobrien   // function.
172191739Sobrien   scif_sas_request_construct(
173191739Sobrien      &fw_task->parent,
174191739Sobrien      fw_device,
175191739Sobrien      sci_base_object_get_logger(fw_controller),
176191739Sobrien      scif_sas_task_request_state_table
177191739Sobrien   );
178191739Sobrien
179191739Sobrien   core_request_memory = (U8 *)task_request_memory + sizeof(SCIF_SAS_TASK_REQUEST_T);
180191739Sobrien
181191739Sobrien   status = scic_task_request_construct(
182226048Sobrien               fw_controller->core_object,
183191739Sobrien               fw_device->core_object,
184191739Sobrien               io_tag,
185191739Sobrien               fw_task,
186226048Sobrien               core_request_memory,
187191739Sobrien               &fw_task->parent.core_object
188191739Sobrien            );
189191739Sobrien
190226048Sobrien   if (status == SCI_SUCCESS)
191191739Sobrien   {
192191739Sobrien      SMP_DISCOVER_RESPONSE_PROTOCOLS_T  dev_protocols;
193191739Sobrien
194191739Sobrien      // These associations must be set early for the core io request
195191739Sobrien      // object construction to complete correctly as there will be
196191739Sobrien      // callbacks into the user driver framework during core construction
197191739Sobrien      sci_object_set_association(fw_task, user_task_request_object);
198191739Sobrien      sci_object_set_association(fw_task->parent.core_object, fw_task);
199191739Sobrien
200191739Sobrien      // Perform protocol specific core IO request construction.
201191739Sobrien      scic_remote_device_get_protocols(fw_device->core_object, &dev_protocols);
202191739Sobrien      if (dev_protocols.u.bits.attached_ssp_target)
203191739Sobrien         status = scic_task_request_construct_ssp(fw_task->parent.core_object);
204191739Sobrien      else if (dev_protocols.u.bits.attached_stp_target)
205191739Sobrien         status = scif_sas_stp_task_request_construct(fw_task);
206191739Sobrien      else
207191739Sobrien         status = SCI_FAILURE_UNSUPPORTED_PROTOCOL;
208191739Sobrien
209191739Sobrien      if (status == SCI_SUCCESS)
210191739Sobrien      {
211191739Sobrien         sci_base_state_machine_logger_initialize(
212191739Sobrien            &fw_task->parent.parent.state_machine_logger,
213191739Sobrien            &fw_task->parent.parent.state_machine,
214191739Sobrien            &fw_task->parent.parent.parent,
215191739Sobrien            scif_cb_logger_log_states,
216191739Sobrien            "SCIF_SAS_TASK_REQUEST_T", "base_state_machine",
217191739Sobrien            SCIF_LOG_OBJECT_TASK_MANAGEMENT
218191739Sobrien         );
219191739Sobrien      }
220191739Sobrien      else
221191739Sobrien      {
222191739Sobrien         SCIF_LOG_WARNING((
223226048Sobrien            sci_base_object_get_logger(fw_task),
224226048Sobrien            SCIF_LOG_OBJECT_TASK_MANAGEMENT,
225226048Sobrien            "Device:0x%x TaskRequest:0x%x Function:0x%x construct failed\n",
226191739Sobrien            fw_device, fw_task, scif_sas_task_request_get_function(fw_task)
227191739Sobrien         ));
228191739Sobrien      }
229226048Sobrien   }
230226048Sobrien
231226048Sobrien   return status;
232191739Sobrien}
233191739Sobrien
234191739Sobrien// ---------------------------------------------------------------------------
235191739Sobrien
236191739SobrienSCI_STATUS scif_sas_internal_task_request_construct(
237191739Sobrien   SCI_CONTROLLER_HANDLE_T      scif_controller,
238191739Sobrien   SCI_REMOTE_DEVICE_HANDLE_T   scif_remote_device,
239191739Sobrien   U16                          io_tag,
240191739Sobrien   void                       * task_request_memory,
241191739Sobrien   SCI_TASK_REQUEST_HANDLE_T  * scif_task_request,
242191739Sobrien   U8                           task_function
243191739Sobrien)
244191739Sobrien{
245191739Sobrien   SCI_STATUS                 status;
246191739Sobrien   SCIF_SAS_TASK_REQUEST_T *  fw_task;
247191739Sobrien
248191739Sobrien   status = scif_sas_task_request_generic_construct(
249191739Sobrien               scif_controller,
250191739Sobrien               scif_remote_device,
251191739Sobrien               io_tag,
252191739Sobrien               NULL,
253191739Sobrien               task_request_memory,
254191739Sobrien               scif_task_request,
255191739Sobrien               task_function
256191739Sobrien            );
257191739Sobrien
258191739Sobrien   fw_task = (SCIF_SAS_TASK_REQUEST_T *)task_request_memory;
259191739Sobrien
260191739Sobrien   fw_task->parent.is_internal = TRUE;
261191739Sobrien
262191739Sobrien   return status;
263191739Sobrien}
264192348Sdelphij
265226048Sobrien// ---------------------------------------------------------------------------
266226048Sobrien
267192348SdelphijSCI_STATUS scif_task_request_construct(
268192348Sdelphij   SCI_CONTROLLER_HANDLE_T      scif_controller,
269192348Sdelphij   SCI_REMOTE_DEVICE_HANDLE_T   scif_remote_device,
270267843Sdelphij   U16                          io_tag,
271267843Sdelphij   void                       * user_task_request_object,
272226048Sobrien   void                       * task_request_memory,
273267843Sdelphij   SCI_TASK_REQUEST_HANDLE_T  * scif_task_request
274192348Sdelphij)
275267843Sdelphij{
276267843Sdelphij   SCI_STATUS  status;
277226048Sobrien   U8          task_function =
278267843Sdelphij                scif_cb_task_request_get_function(user_task_request_object);
279192348Sdelphij
280192348Sdelphij   status = scif_sas_task_request_generic_construct(
281192348Sdelphij               scif_controller,
282192348Sdelphij               scif_remote_device,
283192348Sdelphij               io_tag,
284192348Sdelphij               user_task_request_object,
285192348Sdelphij               task_request_memory,
286192348Sdelphij               scif_task_request,
287192348Sdelphij               task_function
288192348Sdelphij            );
289192348Sdelphij
290192348Sdelphij   return status;
291192348Sdelphij}
292192348Sdelphij
293192348Sdelphij// ---------------------------------------------------------------------------
294192348Sdelphij
295192348Sdelphijvoid scif_sas_internal_task_request_destruct(
296192348Sdelphij   SCIF_SAS_TASK_REQUEST_T * fw_internal_task
297192348Sdelphij)
298192348Sdelphij{
299192348Sdelphij   SCIF_SAS_CONTROLLER_T * fw_controller =
300192348Sdelphij      fw_internal_task->parent.device->domain->controller;
301267843Sdelphij   scif_sas_controller_free_internal_request(fw_controller, fw_internal_task);
302192348Sdelphij}
303192348Sdelphij
304192348Sdelphij// ---------------------------------------------------------------------------
305192348Sdelphij
306192348Sdelphijvoid scic_cb_task_request_complete(
307191739Sobrien   SCI_CONTROLLER_HANDLE_T     controller,
308192348Sdelphij   SCI_REMOTE_DEVICE_HANDLE_T  remote_device,
309191739Sobrien   SCI_TASK_REQUEST_HANDLE_T   task_request,
310192348Sdelphij   SCI_TASK_STATUS             completion_status
311192348Sdelphij)
312191739Sobrien{
313192348Sdelphij   SCIF_SAS_CONTROLLER_T    * fw_controller = (SCIF_SAS_CONTROLLER_T*)
314191739Sobrien                                         sci_object_get_association(controller);
315191739Sobrien   SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
316191739Sobrien                                      sci_object_get_association(remote_device);
317191739Sobrien   SCIF_SAS_TASK_REQUEST_T  * fw_task = (SCIF_SAS_TASK_REQUEST_T*)
318226048Sobrien                                       sci_object_get_association(task_request);
319226048Sobrien   SCI_STATUS                 status;
320192348Sdelphij
321192348Sdelphij   SCIF_LOG_TRACE((
322192348Sdelphij      sci_base_object_get_logger(fw_controller),
323191739Sobrien      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
324192348Sdelphij      "scic_cb_task_request_complete(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
325192348Sdelphij      controller, remote_device, task_request, completion_status
326192348Sdelphij   ));
327192348Sdelphij
328192348Sdelphij   status = fw_task->parent.state_handlers->complete_handler(
329192348Sdelphij               &fw_task->parent.parent
330192348Sdelphij            );
331192348Sdelphij
332192348Sdelphij   if (status == SCI_SUCCESS)
333191739Sobrien   {
334192348Sdelphij      if (fw_task->parent.protocol_complete_handler != NULL)
335192348Sdelphij      {
336192348Sdelphij         status = fw_task->parent.protocol_complete_handler(
337191739Sobrien            fw_controller, fw_device, &fw_task->parent, (SCI_STATUS *)&completion_status
338191739Sobrien         );
339191739Sobrien      }
340191739Sobrien
341192348Sdelphij      if (status == SCI_SUCCESS)
342191739Sobrien      {
343191739Sobrien         SCIF_LOG_WARNING((
344234250Sobrien            sci_base_object_get_logger(fw_task),
345234250Sobrien            SCIF_LOG_OBJECT_TASK_MANAGEMENT,
346234250Sobrien            "RemoteDevice:0x%x TaskRequest:0x%x Function:0x%x CompletionStatus:0x%x "
347234250Sobrien            "completed\n",
348191739Sobrien            fw_device, fw_task,
349191739Sobrien            scif_sas_task_request_get_function(fw_task),
350191739Sobrien            completion_status
351191739Sobrien         ));
352191739Sobrien
353191739Sobrien         // If this isn't an internal framework IO request, then simply pass the
354234250Sobrien         // notification up to the SCIF user.  Otherwise, immediately complete the
355234250Sobrien         // task since there is no SCIF user to notify.
356234250Sobrien         if (fw_task->parent.is_internal == FALSE)
357267843Sdelphij         {
358234250Sobrien            scif_cb_task_request_complete(
359234250Sobrien               fw_controller, fw_device, fw_task, completion_status
360267843Sdelphij            );
361234250Sobrien         }
362234250Sobrien         else
363191739Sobrien         {
364234250Sobrien            scif_controller_complete_task(
365191739Sobrien               fw_controller,
366191739Sobrien               fw_device,
367191739Sobrien               fw_task
368191739Sobrien            );
369191739Sobrien         }
370191739Sobrien      }
371191739Sobrien   }
372192348Sdelphij}
373191739Sobrien
374191739Sobrien// ---------------------------------------------------------------------------
375191739Sobrien
376192348SdelphijU32 scic_cb_ssp_task_request_get_lun(
377192348Sdelphij   void * scic_user_task_request
378191739Sobrien)
379191739Sobrien{
380191739Sobrien   SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)
381191739Sobrien                                       scic_user_task_request;
382191739Sobrien
383192348Sdelphij   fw_task->parent.lun = scif_cb_task_request_get_lun(
384226048Sobrien                            fw_task->parent.parent.parent.associated_object
385226048Sobrien                         );
386192348Sdelphij
387226048Sobrien   return fw_task->parent.lun;
388226048Sobrien}
389192348Sdelphij
390192348Sdelphij// ---------------------------------------------------------------------------
391192348Sdelphij
392192348SdelphijU8 scic_cb_ssp_task_request_get_function(
393192348Sdelphij   void * scic_user_task_request
394226048Sobrien)
395226048Sobrien{
396226048Sobrien   SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)
397226048Sobrien                                       scic_user_task_request;
398191739Sobrien
399191739Sobrien   return scif_sas_task_request_get_function(fw_task);
400191739Sobrien}
401191739Sobrien
402191739Sobrien// ---------------------------------------------------------------------------
403192348Sdelphij
404191739SobrienU16 scic_cb_ssp_task_request_get_io_tag_to_manage(
405191739Sobrien   void * scic_user_task_request
406191739Sobrien)
407191739Sobrien{
408191739Sobrien   SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)
409191739Sobrien                                       scic_user_task_request;
410226048Sobrien
411191739Sobrien   fw_task->io_tag_to_manage
412191739Sobrien      = scif_cb_task_request_get_io_tag_to_manage(
413191739Sobrien           fw_task->parent.parent.parent.associated_object
414191739Sobrien        );
415192348Sdelphij
416192348Sdelphij   return fw_task->io_tag_to_manage;
417191739Sobrien}
418191739Sobrien
419191739Sobrien// ---------------------------------------------------------------------------
420191739Sobrien
421191739Sobrienvoid * scic_cb_ssp_task_request_get_response_data_address(
422192348Sdelphij   void * scic_user_task_request
423191739Sobrien)
424191739Sobrien{
425191739Sobrien   SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)
426192348Sdelphij                                       scic_user_task_request;
427226048Sobrien
428192348Sdelphij   return scif_cb_task_request_get_response_data_address(
429192348Sdelphij                fw_task->parent.parent.parent.associated_object
430192348Sdelphij          );
431234250Sobrien}
432234250Sobrien
433192348Sdelphij// ---------------------------------------------------------------------------
434192348Sdelphij
435192348SdelphijU32 scic_cb_ssp_task_request_get_response_data_length(
436192348Sdelphij   void * scic_user_task_request
437192348Sdelphij)
438191739Sobrien{
439191739Sobrien   SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)
440191739Sobrien                                       scic_user_task_request;
441191739Sobrien
442192348Sdelphij   return scif_cb_task_request_get_response_data_length(
443226048Sobrien             fw_task->parent.parent.parent.associated_object
444191739Sobrien          );
445192348Sdelphij}
446192348Sdelphij
447191739Sobrien//******************************************************************************
448191739Sobrien//* P R O T E C T E D   M E T H O D S
449191739Sobrien//******************************************************************************
450191739Sobrien
451191739Sobrien/**
452191739Sobrien * @brief This method performs functionality required after a task management
453191739Sobrien *        operation (either a task management request or a silicon task
454191739Sobrien *        termination) has finished.
455191739Sobrien *
456191739Sobrien * @param[in]  fw_task This parameter specifies the request that has
457192348Sdelphij *             the operation completing.
458191739Sobrien *
459192348Sdelphij * @return none
460267843Sdelphij */
461267843Sdelphijvoid scif_sas_task_request_operation_complete(
462191739Sobrien   SCIF_SAS_TASK_REQUEST_T * fw_task
463191739Sobrien)
464191739Sobrien{
465191739Sobrien   SCIF_LOG_TRACE((
466191739Sobrien      sci_base_object_get_logger(fw_task),
467191739Sobrien      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
468191739Sobrien      "scif_sas_task_request_operation_complete(0x%x) enter\n",
469191739Sobrien      fw_task
470191739Sobrien   ));
471267843Sdelphij
472267843Sdelphij   fw_task->affected_request_count--;
473191739Sobrien
474191739Sobrien   SCIF_LOG_INFO((
475191739Sobrien      sci_base_object_get_logger(fw_task),
476226048Sobrien      SCIF_LOG_OBJECT_TASK_MANAGEMENT,
477191739Sobrien      "TaskRequest:0x%x current affected request count:0x%x\n",
478267843Sdelphij      fw_task, fw_task->affected_request_count
479267843Sdelphij   ));
480267843Sdelphij}
481267843Sdelphij
482267843Sdelphij