]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/scsi/isci/task.c
98204b031649ea1b2e77a183e71b6da700ee67f0
[karo-tx-linux.git] / drivers / scsi / isci / task.c
1 /*
2  * This file is provided under a dual BSD/GPLv2 license.  When using or
3  * redistributing this file, you may do so under either license.
4  *
5  * GPL LICENSE SUMMARY
6  *
7  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of version 2 of the GNU General Public License as
11  * published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21  * The full GNU General Public License is included in this distribution
22  * in the file called LICENSE.GPL.
23  *
24  * BSD LICENSE
25  *
26  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27  * All rights reserved.
28  *
29  * Redistribution and use in source and binary forms, with or without
30  * modification, are permitted provided that the following conditions
31  * are met:
32  *
33  *   * Redistributions of source code must retain the above copyright
34  *     notice, this list of conditions and the following disclaimer.
35  *   * Redistributions in binary form must reproduce the above copyright
36  *     notice, this list of conditions and the following disclaimer in
37  *     the documentation and/or other materials provided with the
38  *     distribution.
39  *   * Neither the name of Intel Corporation nor the names of its
40  *     contributors may be used to endorse or promote products derived
41  *     from this software without specific prior written permission.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
44  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
45  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
46  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
47  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
53  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54  */
55
56 #include <linux/completion.h>
57 #include "scic_task_request.h"
58 #include "scic_remote_device.h"
59 #include "scic_io_request.h"
60 #include "scic_sds_remote_device.h"
61 #include "scic_sds_remote_node_context.h"
62 #include "isci.h"
63 #include "request.h"
64 #include "sata.h"
65 #include "task.h"
66
67
68 /**
69  * isci_task_execute_task() - This function is one of the SAS Domain Template
70  *    functions. This function is called by libsas to send a task down to
71  *    hardware.
72  * @task: This parameter specifies the SAS task to send.
73  * @num: This parameter specifies the number of tasks to queue.
74  * @gfp_flags: This parameter specifies the context of this call.
75  *
76  * status, zero indicates success.
77  */
78 int isci_task_execute_task(struct sas_task *task, int num, gfp_t gfp_flags)
79 {
80         struct isci_host *isci_host;
81         struct isci_request *request = NULL;
82         struct isci_remote_device *device;
83         unsigned long flags;
84         int ret;
85         enum sci_status status;
86
87
88         dev_dbg(task->dev->port->ha->dev, "%s: num=%d\n", __func__, num);
89
90         if (task->task_state_flags & SAS_TASK_STATE_ABORTED) {
91
92                 isci_task_complete_for_upper_layer(
93                         task,
94                         SAS_TASK_UNDELIVERED,
95                         SAM_STAT_TASK_ABORTED,
96                         isci_perform_normal_io_completion
97                         );
98
99                 return 0;  /* The I/O was accepted (and failed). */
100         }
101         if ((task->dev == NULL) || (task->dev->port == NULL)) {
102
103                 /* Indicate SAS_TASK_UNDELIVERED, so that the scsi midlayer
104                  * removes the target.
105                  */
106                 isci_task_complete_for_upper_layer(
107                         task,
108                         SAS_TASK_UNDELIVERED,
109                         SAS_DEVICE_UNKNOWN,
110                         isci_perform_normal_io_completion
111                         );
112                 return 0;  /* The I/O was accepted (and failed). */
113         }
114         isci_host = isci_host_from_sas_ha(task->dev->port->ha);
115
116         /* Check if we have room for more tasks */
117         ret = isci_host_can_queue(isci_host, num);
118
119         if (ret) {
120                 dev_warn(task->dev->port->ha->dev, "%s: queue full\n", __func__);
121                 return ret;
122         }
123
124         do {
125                 dev_dbg(task->dev->port->ha->dev,
126                         "task = %p, num = %d; dev = %p; cmd = %p\n",
127                             task, num, task->dev, task->uldd_task);
128
129                 if ((task->dev == NULL) || (task->dev->port == NULL)) {
130                         dev_warn(task->dev->port->ha->dev,
131                                  "%s: task %p's port or dev == NULL!\n",
132                                  __func__, task);
133
134                         /* Indicate SAS_TASK_UNDELIVERED, so that the scsi
135                          * midlayer removes the target.
136                          */
137                         isci_task_complete_for_upper_layer(
138                                 task,
139                                 SAS_TASK_UNDELIVERED,
140                                 SAS_DEVICE_UNKNOWN,
141                                 isci_perform_normal_io_completion
142                                 );
143                         /* We don't have a valid host reference, so we
144                          * can't control the host queueing condition.
145                          */
146                         continue;
147                 }
148
149                 device = isci_dev_from_domain_dev(task->dev);
150
151                 isci_host = isci_host_from_sas_ha(task->dev->port->ha);
152
153                 if (device && device->status == isci_ready) {
154
155                         /* Forces a retry from scsi mid layer. */
156                         dev_warn(task->dev->port->ha->dev,
157                                  "%s: task %p: isci_host->status = %d, "
158                                  "device = %p\n",
159                                  __func__,
160                                  task,
161                                  isci_host_get_state(isci_host),
162                                  device);
163
164                         if (device)
165                                 dev_dbg(task->dev->port->ha->dev,
166                                         "%s: device->status = 0x%x\n",
167                                         __func__, device->status);
168
169                         /* Indicate QUEUE_FULL so that the scsi midlayer
170                          * retries.
171                          */
172                         isci_task_complete_for_upper_layer(
173                                 task,
174                                 SAS_TASK_COMPLETE,
175                                 SAS_QUEUE_FULL,
176                                 isci_perform_normal_io_completion
177                                 );
178                         isci_host_can_dequeue(isci_host, 1);
179                 }
180                 /* the device is going down... */
181                 else if (!device || device->status != isci_ready_for_io) {
182
183                         dev_dbg(task->dev->port->ha->dev,
184                                 "%s: task %p: isci_host->status = %d, "
185                                 "device = %p\n",
186                                 __func__,
187                                 task,
188                                 isci_host_get_state(isci_host),
189                                 device);
190
191                         if (device)
192                                 dev_dbg(task->dev->port->ha->dev,
193                                         "%s: device->status = 0x%x\n",
194                                         __func__, device->status);
195
196                         /* Indicate SAS_TASK_UNDELIVERED, so that the scsi
197                          * midlayer removes the target.
198                          */
199                         isci_task_complete_for_upper_layer(
200                                 task,
201                                 SAS_TASK_UNDELIVERED,
202                                 SAS_DEVICE_UNKNOWN,
203                                 isci_perform_normal_io_completion
204                                 );
205                         isci_host_can_dequeue(isci_host, 1);
206
207                 } else {
208                         /* build and send the request. */
209                         status = isci_request_execute(isci_host, task, &request,
210                                                       gfp_flags);
211
212                         if (status == SCI_SUCCESS) {
213                                 spin_lock_irqsave(&task->task_state_lock, flags);
214                                 task->task_state_flags |= SAS_TASK_AT_INITIATOR;
215                                 spin_unlock_irqrestore(&task->task_state_lock, flags);
216                         } else {
217                                 /* Indicate QUEUE_FULL so that the scsi
218                                  * midlayer retries. if the request
219                                  * failed for remote device reasons,
220                                  * it gets returned as
221                                  * SAS_TASK_UNDELIVERED next time
222                                  * through.
223                                  */
224                                 isci_task_complete_for_upper_layer(
225                                                 task,
226                                                 SAS_TASK_COMPLETE,
227                                                 SAS_QUEUE_FULL,
228                                                 isci_perform_normal_io_completion
229                                                 );
230                                 isci_host_can_dequeue(isci_host, 1);
231                         }
232                 }
233                 task = list_entry(task->list.next, struct sas_task, list);
234         } while (--num > 0);
235         return 0;
236 }
237
238
239
240 /**
241  * isci_task_request_build() - This function builds the task request object.
242  * @isci_host: This parameter specifies the ISCI host object
243  * @request: This parameter points to the isci_request object allocated in the
244  *    request construct function.
245  * @tmf: This parameter is the task management struct to be built
246  *
247  * SCI_SUCCESS on successfull completion, or specific failure code.
248  */
249 static enum sci_status isci_task_request_build(
250         struct isci_host *isci_host,
251         struct isci_request **isci_request,
252         struct isci_tmf *isci_tmf)
253 {
254         struct scic_sds_remote_device *sci_device;
255         enum sci_status status = SCI_FAILURE;
256         struct isci_request *request;
257         struct isci_remote_device *isci_device;
258 /*      struct sci_sas_identify_address_frame_protocols dev_protocols; */
259         struct smp_discover_response_protocols dev_protocols;
260
261
262         dev_dbg(&isci_host->pdev->dev,
263                 "%s: isci_tmf = %p\n", __func__, isci_tmf);
264
265         isci_device = isci_tmf->device;
266         sci_device = to_sci_dev(isci_device);
267
268         /* do common allocation and init of request object. */
269         status = isci_request_alloc_tmf(
270                 isci_host,
271                 isci_tmf,
272                 &request,
273                 isci_device,
274                 GFP_ATOMIC
275                 );
276
277         if (status != SCI_SUCCESS)
278                 goto out;
279
280         /* let the core do it's construct. */
281         status = scic_task_request_construct(
282                 isci_host->core_controller,
283                 sci_device,
284                 SCI_CONTROLLER_INVALID_IO_TAG,
285                 request,
286                 request->sci_request_mem_ptr,
287                 &request->sci_request_handle
288                 );
289
290         if (status != SCI_SUCCESS) {
291                 dev_warn(&isci_host->pdev->dev,
292                          "%s: scic_task_request_construct failed - "
293                          "status = 0x%x\n",
294                          __func__,
295                          status);
296                 goto errout;
297         }
298
299         sci_object_set_association(
300                 request->sci_request_handle,
301                 request
302                 );
303
304         scic_remote_device_get_protocols(
305                 sci_device,
306                 &dev_protocols
307                 );
308
309         /* let the core do it's protocol
310          * specific construction.
311          */
312         if (dev_protocols.u.bits.attached_ssp_target) {
313
314                 isci_tmf->proto = SAS_PROTOCOL_SSP;
315                 status = scic_task_request_construct_ssp(
316                         request->sci_request_handle
317                         );
318                 if (status != SCI_SUCCESS)
319                         goto errout;
320         }
321
322         if (dev_protocols.u.bits.attached_stp_target) {
323
324                 isci_tmf->proto = SAS_PROTOCOL_SATA;
325                 status = isci_sata_management_task_request_build(request);
326
327                 if (status != SCI_SUCCESS)
328                         goto errout;
329         }
330
331         goto out;
332
333  errout:
334
335         /* release the dma memory if we fail. */
336         isci_request_free(isci_host, request);
337         request = NULL;
338
339  out:
340         *isci_request = request;
341         return status;
342 }
343
344 /**
345  * isci_tmf_timeout_cb() - This function is called as a kernel callback when
346  *    the timeout period for the TMF has expired.
347  *
348  *
349  */
350 static void isci_tmf_timeout_cb(void *tmf_request_arg)
351 {
352         struct isci_request *request = (struct isci_request *)tmf_request_arg;
353         struct isci_tmf *tmf = isci_request_access_tmf(request);
354         enum sci_status status;
355
356         BUG_ON(request->ttype != tmf_task);
357
358         /* This task management request has timed-out.  Terminate the request
359          * so that the request eventually completes to the requestor in the
360          * request completion callback path.
361          */
362         /* Note - the timer callback function itself has provided spinlock
363          * exclusion from the start and completion paths.  No need to take
364          * the request->isci_host->scic_lock here.
365          */
366
367         if (tmf->timeout_timer != NULL) {
368                 /* Call the users callback, if any. */
369                 if (tmf->cb_state_func != NULL)
370                         tmf->cb_state_func(isci_tmf_timed_out, tmf,
371                                            tmf->cb_data);
372
373                 /* Terminate the TMF transmit request. */
374                 status = scic_controller_terminate_request(
375                         request->isci_host->core_controller,
376                         to_sci_dev(request->isci_device),
377                         request->sci_request_handle
378                         );
379
380                 dev_dbg(&request->isci_host->pdev->dev,
381                         "%s: tmf_request = %p; tmf = %p; status = %d\n",
382                         __func__, request, tmf, status);
383         } else
384                 dev_dbg(&request->isci_host->pdev->dev,
385                         "%s: timer already canceled! "
386                         "tmf_request = %p; tmf = %p\n",
387                         __func__, request, tmf);
388
389         /* No need to unlock since the caller to this callback is doing it for
390          * us.
391          * request->isci_host->scic_lock
392          */
393 }
394
395 /**
396  * isci_task_execute_tmf() - This function builds and sends a task request,
397  *    then waits for the completion.
398  * @isci_host: This parameter specifies the ISCI host object
399  * @tmf: This parameter is the pointer to the task management structure for
400  *    this request.
401  * @timeout_ms: This parameter specifies the timeout period for the task
402  *    management request.
403  *
404  * TMF_RESP_FUNC_COMPLETE on successful completion of the TMF (this includes
405  * error conditions reported in the IU status), or TMF_RESP_FUNC_FAILED.
406  */
407 int isci_task_execute_tmf(
408         struct isci_host *isci_host,
409         struct isci_tmf *tmf,
410         unsigned long timeout_ms)
411 {
412         DECLARE_COMPLETION_ONSTACK(completion);
413         enum sci_status status = SCI_FAILURE;
414         struct scic_sds_remote_device *sci_device;
415         struct isci_remote_device *isci_device = tmf->device;
416         struct isci_request *request;
417         int ret = TMF_RESP_FUNC_FAILED;
418         unsigned long flags;
419
420         /* sanity check, return TMF_RESP_FUNC_FAILED
421          * if the device is not there and ready.
422          */
423         if (!isci_device || isci_device->status != isci_ready_for_io) {
424                 dev_dbg(&isci_host->pdev->dev,
425                         "%s: isci_device = %p not ready (%d)\n",
426                         __func__,
427                         isci_device, isci_device->status);
428                 return TMF_RESP_FUNC_FAILED;
429         } else
430                 dev_dbg(&isci_host->pdev->dev,
431                         "%s: isci_device = %p\n",
432                         __func__, isci_device);
433
434         sci_device = to_sci_dev(isci_device);
435
436         /* Assign the pointer to the TMF's completion kernel wait structure. */
437         tmf->complete = &completion;
438
439         isci_task_request_build(
440                 isci_host,
441                 &request,
442                 tmf
443                 );
444
445         if (!request) {
446                 dev_warn(&isci_host->pdev->dev,
447                         "%s: isci_task_request_build failed\n",
448                         __func__);
449                 return TMF_RESP_FUNC_FAILED;
450         }
451
452         /* Allocate the TMF timeout timer. */
453         spin_lock_irqsave(&isci_host->scic_lock, flags);
454         tmf->timeout_timer = isci_timer_create(isci_host, request, isci_tmf_timeout_cb);
455
456         /* Start the timer. */
457         if (tmf->timeout_timer)
458                 isci_timer_start(tmf->timeout_timer, timeout_ms);
459         else
460                 dev_warn(&isci_host->pdev->dev,
461                          "%s: isci_timer_create failed!!!!\n",
462                          __func__);
463
464         /* start the TMF io. */
465         status = scic_controller_start_task(
466                 isci_host->core_controller,
467                 sci_device,
468                 request->sci_request_handle,
469                 SCI_CONTROLLER_INVALID_IO_TAG
470                 );
471
472         if (status != SCI_SUCCESS) {
473                 dev_warn(&isci_host->pdev->dev,
474                          "%s: start_io failed - status = 0x%x, request = %p\n",
475                          __func__,
476                          status,
477                          request);
478                 goto cleanup_request;
479         }
480
481         /* Call the users callback, if any. */
482         if (tmf->cb_state_func != NULL)
483                 tmf->cb_state_func(isci_tmf_started, tmf, tmf->cb_data);
484
485         /* Change the state of the TMF-bearing request to "started". */
486         isci_request_change_state(request, started);
487
488         /* add the request to the remote device request list. */
489         list_add(&request->dev_node, &isci_device->reqs_in_process);
490
491         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
492
493         /* Wait for the TMF to complete, or a timeout. */
494         wait_for_completion(&completion);
495
496         isci_print_tmf(tmf);
497
498         if (tmf->status == SCI_SUCCESS)
499                 ret =  TMF_RESP_FUNC_COMPLETE;
500         else if (tmf->status == SCI_FAILURE_IO_RESPONSE_VALID) {
501                 dev_dbg(&isci_host->pdev->dev,
502                         "%s: tmf.status == "
503                         "SCI_FAILURE_IO_RESPONSE_VALID\n",
504                         __func__);
505                 ret =  TMF_RESP_FUNC_COMPLETE;
506         }
507         /* Else - leave the default "failed" status alone. */
508
509         dev_dbg(&isci_host->pdev->dev,
510                 "%s: completed request = %p\n",
511                 __func__,
512                 request);
513
514         if (request->io_request_completion != NULL) {
515
516                 /* The fact that this is non-NULL for a TMF request
517                  * means there is a thread waiting for this TMF to
518                  * finish.
519                  */
520                 complete(request->io_request_completion);
521         }
522
523         spin_lock_irqsave(&isci_host->scic_lock, flags);
524
525  cleanup_request:
526
527         /* Clean up the timer if needed. */
528         if (tmf->timeout_timer) {
529                 isci_del_timer(isci_host, tmf->timeout_timer);
530                 tmf->timeout_timer = NULL;
531         }
532
533         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
534
535         isci_request_free(isci_host, request);
536
537         return ret;
538 }
539
540 void isci_task_build_tmf(
541         struct isci_tmf *tmf,
542         struct isci_remote_device *isci_device,
543         enum isci_tmf_function_codes code,
544         void (*tmf_sent_cb)(enum isci_tmf_cb_state,
545                             struct isci_tmf *,
546                             void *),
547         void *cb_data)
548 {
549         dev_dbg(&isci_device->isci_port->isci_host->pdev->dev,
550                 "%s: isci_device = %p\n", __func__, isci_device);
551
552         memset(tmf, 0, sizeof(*tmf));
553
554         tmf->device        = isci_device;
555         tmf->tmf_code      = code;
556         tmf->timeout_timer = NULL;
557         tmf->cb_state_func = tmf_sent_cb;
558         tmf->cb_data       = cb_data;
559 }
560
561 static struct isci_request *isci_task_get_request_from_task(
562         struct sas_task *task,
563         struct isci_host **isci_host,
564         struct isci_remote_device **isci_device)
565 {
566
567         struct isci_request *request = NULL;
568         unsigned long flags;
569
570         spin_lock_irqsave(&task->task_state_lock, flags);
571
572         request = task->lldd_task;
573
574         /* If task is already done, the request isn't valid */
575         if (!(task->task_state_flags & SAS_TASK_STATE_DONE) &&
576             (task->task_state_flags & SAS_TASK_AT_INITIATOR) &&
577             (request != NULL)) {
578
579                 if (isci_host != NULL)
580                         *isci_host = request->isci_host;
581
582                 if (isci_device != NULL)
583                         *isci_device = request->isci_device;
584         }
585
586         spin_unlock_irqrestore(&task->task_state_lock, flags);
587
588         return request;
589 }
590
591 /**
592  * isci_task_validate_request_to_abort() - This function checks the given I/O
593  *    against the "started" state.  If the request is still "started", it's
594  *    state is changed to aborted. NOTE: isci_host->scic_lock MUST BE HELD
595  *    BEFORE CALLING THIS FUNCTION.
596  * @isci_request: This parameter specifies the request object to control.
597  * @isci_host: This parameter specifies the ISCI host object
598  * @isci_device: This is the device to which the request is pending.
599  * @aborted_io_completion: This is a completion structure that will be added to
600  *    the request in case it is changed to aborting; this completion is
601  *    triggered when the request is fully completed.
602  *
603  * Either "started" on successful change of the task status to "aborted", or
604  * "unallocated" if the task cannot be controlled.
605  */
606 static enum isci_request_status isci_task_validate_request_to_abort(
607         struct isci_request *isci_request,
608         struct isci_host *isci_host,
609         struct isci_remote_device *isci_device,
610         struct completion *aborted_io_completion)
611 {
612         enum isci_request_status old_state = unallocated;
613
614         /* Only abort the task if it's in the
615          *  device's request_in_process list
616          */
617         if (isci_request && !list_empty(&isci_request->dev_node)) {
618                 old_state = isci_request_change_started_to_aborted(
619                         isci_request, aborted_io_completion);
620
621                 /* Only abort requests in the started state. */
622                 if (old_state != started)
623                         old_state = unallocated;
624         }
625
626         return old_state;
627 }
628
629 static void isci_request_cleanup_completed_loiterer(
630         struct isci_host *isci_host,
631         struct isci_remote_device *isci_device,
632         struct isci_request *isci_request)
633 {
634         struct sas_task *task = isci_request_access_task(isci_request);
635         unsigned long flags;
636
637         dev_dbg(&isci_host->pdev->dev,
638                 "%s: isci_device=%p, request=%p, task=%p\n",
639                 __func__, isci_device, isci_request,
640                 isci_request->ttype_ptr.io_task_ptr);
641
642         spin_lock_irqsave(&isci_host->scic_lock, flags);
643         list_del_init(&isci_request->dev_node);
644         if (task != NULL)
645                 task->lldd_task = NULL;
646         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
647
648         isci_request_free(isci_host, isci_request);
649 }
650 /**
651  * isci_terminate_request_core() - This function will terminate the given
652  *    request, and wait for it to complete.  This function must only be called
653  *    from a thread that can wait.  Note that the request is terminated and
654  *    completed (back to the host, if started there).
655  * @isci_host: This SCU.
656  * @isci_device: The target.
657  * @isci_request: The I/O request to be terminated.
658  *
659  *
660  */
661 static void isci_terminate_request_core(
662         struct isci_host *isci_host,
663         struct isci_remote_device *isci_device,
664         struct isci_request *isci_request,
665         struct completion *request_completion)
666 {
667         enum sci_status status                 = SCI_SUCCESS;
668         bool was_terminated         = false;
669         bool needs_cleanup_handling = false;
670         enum isci_request_status request_status;
671         unsigned long flags;
672
673         dev_dbg(&isci_host->pdev->dev,
674                 "%s: device = %p; request = %p\n",
675                 __func__, isci_device, isci_request);
676
677         /* Peek at the current status of the request.  This will tell
678          * us if there was special handling on the request such that it
679          * needs to be detached and freed here.
680          */
681         spin_lock_irqsave(&isci_request->state_lock, flags);
682         request_status = isci_request_get_state(isci_request);
683
684         /* TMFs are in their own thread */
685         if ((isci_request->ttype == io_task) &&
686             ((request_status == aborted) ||
687              (request_status == aborting) ||
688              (request_status == terminating)))
689                 /* The completion routine won't free a request in
690                  * the aborted/aborting/terminating state, so we do
691                  * it here.
692                  */
693                 needs_cleanup_handling = true;
694
695         spin_unlock_irqrestore(&isci_request->state_lock, flags);
696
697         spin_lock_irqsave(&isci_host->scic_lock, flags);
698         /* Make sure the request wasn't just sitting around signalling
699          * device condition (if the request handle is NULL, then the
700          * request completed but needed additional handling here).
701          */
702         if (isci_request->sci_request_handle != NULL) {
703                 was_terminated = true;
704                 status = scic_controller_terminate_request(
705                         isci_host->core_controller,
706                         to_sci_dev(isci_device),
707                         isci_request->sci_request_handle
708                         );
709         }
710         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
711
712         /*
713          * The only time the request to terminate will
714          * fail is when the io request is completed and
715          * being aborted.
716          */
717         if (status != SCI_SUCCESS)
718                 dev_err(&isci_host->pdev->dev,
719                         "%s: scic_controller_terminate_request"
720                         " returned = 0x%x\n",
721                         __func__,
722                         status);
723         else {
724                 if (was_terminated) {
725                         dev_dbg(&isci_host->pdev->dev,
726                                 "%s: before completion wait (%p)\n",
727                                 __func__,
728                                 request_completion);
729
730                         /* Wait here for the request to complete. */
731                         wait_for_completion(request_completion);
732
733                         dev_dbg(&isci_host->pdev->dev,
734                                 "%s: after completion wait (%p)\n",
735                                 __func__,
736                                 request_completion);
737                 }
738
739                 if (needs_cleanup_handling)
740                         isci_request_cleanup_completed_loiterer(
741                                 isci_host, isci_device, isci_request
742                                 );
743         }
744 }
745 static void isci_terminate_request(
746         struct isci_host *isci_host,
747         struct isci_remote_device *isci_device,
748         struct isci_request *isci_request,
749         enum isci_request_status new_request_state)
750 {
751         enum isci_request_status old_state;
752
753         DECLARE_COMPLETION_ONSTACK(request_completion);
754         unsigned long flags;
755
756         spin_lock_irqsave(&isci_host->scic_lock, flags);
757
758         /* Change state to "new_request_state" if it is currently "started" */
759         old_state = isci_request_change_started_to_newstate(
760                 isci_request,
761                 &request_completion,
762                 new_request_state
763                 );
764
765         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
766
767         if (old_state == started)
768                 /* This request was not already being aborted. If it had been,
769                  * then the aborting I/O (ie. the TMF request) would not be in
770                  * the aborting state, and thus would be terminated here.  Note
771                  * that since the TMF completion's call to the kernel function
772                  * "complete()" does not happen until the pending I/O request
773                  * terminate fully completes, we do not have to implement a
774                  * special wait here for already aborting requests - the
775                  * termination of the TMF request will force the request
776                  * to finish it's already started terminate.
777                  */
778                 isci_terminate_request_core(isci_host, isci_device,
779                                             isci_request, &request_completion);
780 }
781
782 /**
783  * isci_terminate_pending_requests() - This function will change the all of the
784  *    requests on the given device's state to "aborting", will terminate the
785  *    requests, and wait for them to complete.  This function must only be
786  *    called from a thread that can wait.  Note that the requests are all
787  *    terminated and completed (back to the host, if started there).
788  * @isci_host: This parameter specifies SCU.
789  * @isci_device: This parameter specifies the target.
790  *
791  *
792  */
793 void isci_terminate_pending_requests(
794         struct isci_host *isci_host,
795         struct isci_remote_device *isci_device,
796         enum isci_request_status new_request_state)
797 {
798         struct isci_request *isci_request;
799         struct sas_task *task;
800         bool done = false;
801         unsigned long flags;
802
803         dev_dbg(&isci_host->pdev->dev,
804                 "%s: isci_device = %p (new request state = %d)\n",
805                 __func__, isci_device, new_request_state);
806
807         #define ISCI_TERMINATE_SHOW_PENDING_REQUESTS
808         #ifdef ISCI_TERMINATE_SHOW_PENDING_REQUESTS
809         {
810                 struct isci_request *request;
811
812                 /* Only abort the task if it's in the
813                  * device's request_in_process list
814                  */
815                 list_for_each_entry(request,
816                                     &isci_device->reqs_in_process,
817                                     dev_node)
818                         dev_dbg(&isci_host->pdev->dev,
819                                 "%s: isci_device = %p; request is on "
820                                 "reqs_in_process list: %p\n",
821                                 __func__, isci_device, request);
822         }
823         #endif /* ISCI_TERMINATE_SHOW_PENDING_REQUESTS */
824
825         /* Clean up all pending requests. */
826         do {
827                 spin_lock_irqsave(&isci_host->scic_lock, flags);
828
829                 if (list_empty(&isci_device->reqs_in_process)) {
830
831                         done = true;
832                         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
833
834                         dev_dbg(&isci_host->pdev->dev,
835                                 "%s: isci_device = %p; done.\n",
836                                 __func__, isci_device);
837                 } else {
838                         /* The list was not empty - grab the first request. */
839                         isci_request = list_first_entry(
840                                 &isci_device->reqs_in_process,
841                                 struct isci_request, dev_node
842                                 );
843                         /* Note that we are not expecting to have to control
844                          * the target to abort the request.
845                          */
846                         isci_request->complete_in_target = true;
847
848                         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
849
850                         /* Get the libsas task reference. */
851                         task = isci_request_access_task(isci_request);
852
853                         dev_dbg(&isci_host->pdev->dev,
854                                 "%s: isci_device=%p request=%p; task=%p\n",
855                                 __func__, isci_device, isci_request, task);
856
857                         /* Mark all still pending I/O with the selected next
858                          * state.
859                          */
860                         isci_terminate_request(isci_host, isci_device,
861                                                isci_request, new_request_state
862                                                );
863
864                         /* Set the 'done' state on the task. */
865                         if (task)
866                                 isci_task_all_done(task);
867                 }
868         } while (!done);
869 }
870
871 /**
872  * isci_task_send_lu_reset_sas() - This function is called by of the SAS Domain
873  *    Template functions.
874  * @lun: This parameter specifies the lun to be reset.
875  *
876  * status, zero indicates success.
877  */
878 static int isci_task_send_lu_reset_sas(
879         struct isci_host *isci_host,
880         struct isci_remote_device *isci_device,
881         u8 *lun)
882 {
883         struct isci_tmf tmf;
884         int ret = TMF_RESP_FUNC_FAILED;
885
886         dev_dbg(&isci_host->pdev->dev,
887                 "%s: isci_host = %p, isci_device = %p\n",
888                 __func__, isci_host, isci_device);
889         /* Send the LUN reset to the target.  By the time the call returns,
890          * the TMF has fully exected in the target (in which case the return
891          * value is "TMF_RESP_FUNC_COMPLETE", or the request timed-out (or
892          * was otherwise unable to be executed ("TMF_RESP_FUNC_FAILED").
893          */
894         isci_task_build_tmf(&tmf, isci_device, isci_tmf_ssp_lun_reset, NULL,
895                             NULL);
896
897         #define ISCI_LU_RESET_TIMEOUT_MS 2000 /* 2 second timeout. */
898         ret = isci_task_execute_tmf(isci_host, &tmf, ISCI_LU_RESET_TIMEOUT_MS);
899
900         if (ret == TMF_RESP_FUNC_COMPLETE)
901                 dev_dbg(&isci_host->pdev->dev,
902                         "%s: %p: TMF_LU_RESET passed\n",
903                         __func__, isci_device);
904         else
905                 dev_dbg(&isci_host->pdev->dev,
906                         "%s: %p: TMF_LU_RESET failed (%x)\n",
907                         __func__, isci_device, ret);
908
909         return ret;
910 }
911
912 /**
913  * isci_task_lu_reset() - This function is one of the SAS Domain Template
914  *    functions. This is one of the Task Management functoins called by libsas,
915  *    to reset the given lun. Note the assumption that while this call is
916  *    executing, no I/O will be sent by the host to the device.
917  * @lun: This parameter specifies the lun to be reset.
918  *
919  * status, zero indicates success.
920  */
921 int isci_task_lu_reset(
922         struct domain_device *domain_device,
923         u8 *lun)
924 {
925         struct isci_host *isci_host = NULL;
926         struct isci_remote_device *isci_device = NULL;
927         int ret;
928         bool device_stopping = false;
929
930         if (domain_device == NULL) {
931                 pr_warn("%s: domain_device == NULL\n", __func__);
932                 return TMF_RESP_FUNC_FAILED;
933         }
934
935         isci_device = isci_dev_from_domain_dev(domain_device);
936
937         if (domain_device->port != NULL)
938                 isci_host = isci_host_from_sas_ha(domain_device->port->ha);
939
940         pr_debug("%s: domain_device=%p, isci_host=%p; isci_device=%p\n",
941                  __func__, domain_device, isci_host, isci_device);
942
943         if (isci_device != NULL)
944                 device_stopping = (isci_device->status == isci_stopping)
945                                   || (isci_device->status == isci_stopped);
946
947         /* If there is a device reset pending on any request in the
948          * device's list, fail this LUN reset request in order to
949          * escalate to the device reset.
950          */
951         if ((isci_device == NULL) ||
952             (isci_host == NULL) ||
953             ((isci_host != NULL) &&
954              (isci_device != NULL) &&
955              (device_stopping ||
956               (isci_device_is_reset_pending(isci_host, isci_device))))) {
957                 dev_warn(&isci_host->pdev->dev,
958                          "%s: No dev (%p), no host (%p), or "
959                          "RESET PENDING: domain_device=%p\n",
960                          __func__, isci_device, isci_host, domain_device);
961                 return TMF_RESP_FUNC_FAILED;
962         }
963
964         /* Send the task management part of the reset. */
965         if (sas_protocol_ata(domain_device->tproto)) {
966                 ret = isci_task_send_lu_reset_sata(
967                         isci_host, isci_device, lun
968                         );
969         } else
970                 ret = isci_task_send_lu_reset_sas(isci_host, isci_device, lun);
971
972         /* If the LUN reset worked, all the I/O can now be terminated. */
973         if (ret == TMF_RESP_FUNC_COMPLETE)
974                 /* Terminate all I/O now. */
975                 isci_terminate_pending_requests(isci_host,
976                                                 isci_device,
977                                                 terminating);
978
979         return ret;
980 }
981
982
983 /*       int (*lldd_clear_nexus_port)(struct asd_sas_port *); */
984 int isci_task_clear_nexus_port(struct asd_sas_port *port)
985 {
986         return TMF_RESP_FUNC_FAILED;
987 }
988
989
990
991 int isci_task_clear_nexus_ha(struct sas_ha_struct *ha)
992 {
993         return TMF_RESP_FUNC_FAILED;
994 }
995
996 int isci_task_I_T_nexus_reset(struct domain_device *dev)
997 {
998         return TMF_RESP_FUNC_FAILED;
999 }
1000
1001
1002 /* Task Management Functions. Must be called from process context.       */
1003
1004 /**
1005  * isci_abort_task_process_cb() - This is a helper function for the abort task
1006  *    TMF command.  It manages the request state with respect to the successful
1007  *    transmission / completion of the abort task request.
1008  * @cb_state: This parameter specifies when this function was called - after
1009  *    the TMF request has been started and after it has timed-out.
1010  * @tmf: This parameter specifies the TMF in progress.
1011  *
1012  *
1013  */
1014 static void isci_abort_task_process_cb(
1015         enum isci_tmf_cb_state cb_state,
1016         struct isci_tmf *tmf,
1017         void *cb_data)
1018 {
1019         struct isci_request *old_request;
1020
1021         old_request = (struct isci_request *)cb_data;
1022
1023         dev_dbg(&old_request->isci_host->pdev->dev,
1024                 "%s: tmf=%p, old_request=%p\n",
1025                 __func__, tmf, old_request);
1026
1027         switch (cb_state) {
1028
1029         case isci_tmf_started:
1030                 /* The TMF has been started.  Nothing to do here, since the
1031                  * request state was already set to "aborted" by the abort
1032                  * task function.
1033                  */
1034                 BUG_ON(old_request->status != aborted);
1035                 break;
1036
1037         case isci_tmf_timed_out:
1038
1039                 /* Set the task's state to "aborting", since the abort task
1040                  * function thread set it to "aborted" (above) in anticipation
1041                  * of the task management request working correctly.  Since the
1042                  * timeout has now fired, the TMF request failed.  We set the
1043                  * state such that the request completion will indicate the
1044                  * device is no longer present.
1045                  */
1046                 isci_request_change_state(old_request, aborting);
1047                 break;
1048
1049         default:
1050                 dev_err(&old_request->isci_host->pdev->dev,
1051                         "%s: Bad cb_state (%d): tmf=%p, old_request=%p\n",
1052                         __func__, cb_state, tmf, old_request);
1053                 break;
1054         }
1055 }
1056
1057 /**
1058  * isci_task_abort_task() - This function is one of the SAS Domain Template
1059  *    functions. This function is called by libsas to abort a specified task.
1060  * @task: This parameter specifies the SAS task to abort.
1061  *
1062  * status, zero indicates success.
1063  */
1064 int isci_task_abort_task(struct sas_task *task)
1065 {
1066         DECLARE_COMPLETION_ONSTACK(aborted_io_completion);
1067         struct isci_request *old_request = NULL;
1068         struct isci_remote_device *isci_device = NULL;
1069         struct isci_host *isci_host = NULL;
1070         struct isci_tmf tmf;
1071         int ret = TMF_RESP_FUNC_FAILED;
1072         unsigned long flags;
1073         bool any_dev_reset, device_stopping;
1074
1075         /* Get the isci_request reference from the task.  Note that
1076          * this check does not depend on the pending request list
1077          * in the device, because tasks driving resets may land here
1078          * after completion in the core.
1079          */
1080         old_request = isci_task_get_request_from_task(task, &isci_host,
1081                                                       &isci_device);
1082
1083         dev_dbg(&isci_host->pdev->dev,
1084                 "%s: task = %p\n", __func__, task);
1085
1086         /* Check if the device has been / is currently being removed.
1087          * If so, no task management will be done, and the I/O will
1088          * be terminated.
1089          */
1090         device_stopping = (isci_device->status == isci_stopping)
1091                           || (isci_device->status == isci_stopped);
1092
1093 #ifdef NOMORE
1094         /* This abort task function is the first stop of the libsas error
1095          * handler thread. Since libsas is executing in a thread with a
1096          * referernce to the "task" parameter, that task cannot be completed
1097          * directly back to the upper layers.  In order to make sure that
1098          * the task is managed correctly if this abort task fails, set the
1099          * "SAS_TASK_STATE_ABORTED" bit now such that completions up the
1100          * stack will be intercepted and only allowed to happen in the
1101          * libsas SCSI error handler thread.
1102          */
1103         spin_lock_irqsave(&task->task_state_lock, flags);
1104         task->task_state_flags |= SAS_TASK_STATE_ABORTED;
1105         spin_unlock_irqrestore(&task->task_state_lock, flags);
1106 #endif  /* NOMORE */
1107
1108         /* This version of the driver will fail abort requests for
1109          * SATA/STP.  Failing the abort request this way will cause the
1110          * SCSI error handler thread to escalate to LUN reset
1111          */
1112         if (sas_protocol_ata(task->task_proto) && !device_stopping) {
1113                 dev_warn(&isci_host->pdev->dev,
1114                             " task %p is for a STP/SATA device;"
1115                             " returning TMF_RESP_FUNC_FAILED\n"
1116                             " to cause a LUN reset...\n", task);
1117                 return TMF_RESP_FUNC_FAILED;
1118         }
1119
1120         dev_dbg(&isci_host->pdev->dev,
1121                 "%s: old_request == %p\n", __func__, old_request);
1122
1123         spin_lock_irqsave(&task->task_state_lock, flags);
1124
1125         /* Don't do resets to stopping devices. */
1126         if (device_stopping)
1127                 task->task_state_flags &= ~SAS_TASK_NEED_DEV_RESET;
1128
1129         /* See if there is a pending device reset for this device. */
1130         any_dev_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET;
1131
1132         spin_unlock_irqrestore(&task->task_state_lock, flags);
1133
1134         if ((isci_device != NULL) && !device_stopping)
1135                 any_dev_reset = any_dev_reset
1136                                 || isci_device_is_reset_pending(isci_host,
1137                                                                 isci_device
1138                                                                 );
1139
1140         /* If the extraction of the request reference from the task
1141          * failed, then the request has been completed (or if there is a
1142          * pending reset then this abort request function must be failed
1143          * in order to escalate to the target reset).
1144          */
1145         if ((old_request == NULL) ||
1146             ((old_request != NULL) &&
1147              (old_request->sci_request_handle == NULL) &&
1148              (old_request->complete_in_target)) ||
1149              any_dev_reset) {
1150
1151                 spin_lock_irqsave(&task->task_state_lock, flags);
1152
1153                 /* If the device reset task flag is set, fail the task
1154                  * management request.  Otherwise, the original request
1155                  * has completed.
1156                  */
1157                 if (any_dev_reset) {
1158
1159                         /* Turn off the task's DONE to make sure this
1160                          * task is escalated to a target reset.
1161                          */
1162                         task->task_state_flags &= ~SAS_TASK_STATE_DONE;
1163
1164                         /* Fail the task management request in order to
1165                          * escalate to the target reset.
1166                          */
1167                         ret = TMF_RESP_FUNC_FAILED;
1168
1169                         dev_dbg(&isci_host->pdev->dev,
1170                                 "%s: Failing task abort in order to "
1171                                 "escalate to target reset because\n"
1172                                 "SAS_TASK_NEED_DEV_RESET is set for "
1173                                 "task %p on dev %p\n",
1174                                 __func__, task, isci_device);
1175
1176                 } else {
1177                         ret = TMF_RESP_FUNC_COMPLETE;
1178
1179                         dev_dbg(&isci_host->pdev->dev,
1180                                 "%s: abort task not needed for %p\n",
1181                                 __func__, task);
1182
1183                         /* The request has already completed and there
1184                          * is nothing to do here other than to set the task
1185                          * done bit, and indicate that the task abort function
1186                          * was sucessful.
1187                          */
1188                         isci_set_task_doneflags(task);
1189
1190                         /* Set the abort bit to make sure that libsas sticks the
1191                          * task in the completed task queue.
1192                          */
1193 /*                      task->task_state_flags |= SAS_TASK_STATE_ABORTED; */
1194
1195                         /* Check for the situation where the request was
1196                          * left around on the device list but the
1197                          * request already completed.
1198                          */
1199                         if (old_request && !old_request->sci_request_handle) {
1200
1201                                 isci_request_cleanup_completed_loiterer(
1202                                         isci_host, isci_device, old_request
1203                                         );
1204                         }
1205                 }
1206                 spin_unlock_irqrestore(&task->task_state_lock, flags);
1207
1208                 return ret;
1209         }
1210
1211         spin_lock_irqsave(&isci_host->scic_lock, flags);
1212
1213         /* Sanity check the request status, and set the I/O kernel completion
1214          * struct that will be triggered when the request completes.
1215          */
1216         if (isci_task_validate_request_to_abort(
1217                     old_request,
1218                     isci_host,
1219                     isci_device,
1220                     &aborted_io_completion)
1221             == unallocated) {
1222                 dev_dbg(&isci_host->pdev->dev,
1223                         "%s: old_request not valid for device = %p\n",
1224                         __func__,
1225                         isci_device);
1226                 old_request = NULL;
1227         }
1228
1229         if (!old_request) {
1230
1231                 /* There is no isci_request attached to the sas_task.
1232                  * It must have been completed and detached.
1233                  */
1234                 dev_dbg(&isci_host->pdev->dev,
1235                         "%s: old_request == NULL\n",
1236                         __func__);
1237
1238                 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1239
1240                 /* Set the state on the task. */
1241                 isci_task_all_done(task);
1242
1243                 return TMF_RESP_FUNC_COMPLETE;
1244         }
1245         if (task->task_proto == SAS_PROTOCOL_SMP || device_stopping) {
1246
1247                 if (device_stopping)
1248                         dev_dbg(&isci_host->pdev->dev,
1249                                 "%s: device is stopping, thus no TMF\n",
1250                                 __func__);
1251                 else
1252                         dev_dbg(&isci_host->pdev->dev,
1253                                 "%s: request is SMP, thus no TMF\n",
1254                                 __func__);
1255
1256                 old_request->complete_in_target = true;
1257
1258                 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1259
1260                 /* Set the state on the task. */
1261                 isci_task_all_done(task);
1262
1263                 ret = TMF_RESP_FUNC_COMPLETE;
1264
1265                 /* Stopping and SMP devices are not sent a TMF, and are not
1266                  * reset, but the outstanding I/O request is terminated here.
1267                  *
1268                  * Clean up the request on our side, and wait for the aborted
1269                  * I/O to complete.
1270                  */
1271                 isci_terminate_request_core(isci_host, isci_device, old_request,
1272                                             &aborted_io_completion);
1273         } else {
1274                 /* Fill in the tmf stucture */
1275                 isci_task_build_tmf(&tmf, isci_device, isci_tmf_ssp_task_abort,
1276                                     isci_abort_task_process_cb, old_request);
1277
1278                 tmf.io_tag = scic_io_request_get_io_tag(
1279                         old_request->sci_request_handle
1280                         );
1281
1282                 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1283
1284                 #define ISCI_ABORT_TASK_TIMEOUT_MS 500 /* half second timeout. */
1285                 ret = isci_task_execute_tmf(isci_host, &tmf,
1286                                             ISCI_ABORT_TASK_TIMEOUT_MS);
1287
1288                 if (ret == TMF_RESP_FUNC_COMPLETE) {
1289                         old_request->complete_in_target = true;
1290
1291                         /* Clean up the request on our side, and wait for the aborted I/O to
1292                          * complete.
1293                          */
1294                         isci_terminate_request_core(isci_host, isci_device, old_request,
1295                                                     &aborted_io_completion);
1296
1297                         /* Set the state on the task. */
1298                         isci_task_all_done(task);
1299                 } else
1300                         dev_err(&isci_host->pdev->dev,
1301                                 "%s: isci_task_send_tmf failed\n",
1302                                 __func__);
1303         }
1304
1305         return ret;
1306 }
1307
1308 /**
1309  * isci_task_abort_task_set() - This function is one of the SAS Domain Template
1310  *    functions. This is one of the Task Management functoins called by libsas,
1311  *    to abort all task for the given lun.
1312  * @d_device: This parameter specifies the domain device associated with this
1313  *    request.
1314  * @lun: This parameter specifies the lun associated with this request.
1315  *
1316  * status, zero indicates success.
1317  */
1318 int isci_task_abort_task_set(
1319         struct domain_device *d_device,
1320         u8 *lun)
1321 {
1322         return TMF_RESP_FUNC_FAILED;
1323 }
1324
1325
1326 /**
1327  * isci_task_clear_aca() - This function is one of the SAS Domain Template
1328  *    functions. This is one of the Task Management functoins called by libsas.
1329  * @d_device: This parameter specifies the domain device associated with this
1330  *    request.
1331  * @lun: This parameter specifies the lun        associated with this request.
1332  *
1333  * status, zero indicates success.
1334  */
1335 int isci_task_clear_aca(
1336         struct domain_device *d_device,
1337         u8 *lun)
1338 {
1339         return TMF_RESP_FUNC_FAILED;
1340 }
1341
1342
1343
1344 /**
1345  * isci_task_clear_task_set() - This function is one of the SAS Domain Template
1346  *    functions. This is one of the Task Management functoins called by libsas.
1347  * @d_device: This parameter specifies the domain device associated with this
1348  *    request.
1349  * @lun: This parameter specifies the lun        associated with this request.
1350  *
1351  * status, zero indicates success.
1352  */
1353 int isci_task_clear_task_set(
1354         struct domain_device *d_device,
1355         u8 *lun)
1356 {
1357         return TMF_RESP_FUNC_FAILED;
1358 }
1359
1360
1361 /**
1362  * isci_task_query_task() - This function is implemented to cause libsas to
1363  *    correctly escalate the failed abort to a LUN or target reset (this is
1364  *    because sas_scsi_find_task libsas function does not correctly interpret
1365  *    all return codes from the abort task call).  When TMF_RESP_FUNC_SUCC is
1366  *    returned, libsas turns this into a LUN reset; when FUNC_FAILED is
1367  *    returned, libsas will turn this into a target reset
1368  * @task: This parameter specifies the sas task being queried.
1369  * @lun: This parameter specifies the lun associated with this request.
1370  *
1371  * status, zero indicates success.
1372  */
1373 int isci_task_query_task(
1374         struct sas_task *task)
1375 {
1376         /* See if there is a pending device reset for this device. */
1377         if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET)
1378                 return TMF_RESP_FUNC_FAILED;
1379         else
1380                 return TMF_RESP_FUNC_SUCC;
1381 }
1382
1383 /**
1384  * isci_task_request_complete() - This function is called by the sci core when
1385  *    an task request completes.
1386  * @isci_host: This parameter specifies the ISCI host object
1387  * @request: This parameter is the completed isci_request object.
1388  * @completion_status: This parameter specifies the completion status from the
1389  *    sci core.
1390  *
1391  * none.
1392  */
1393 void isci_task_request_complete(
1394         struct isci_host *isci_host,
1395         struct isci_request *request,
1396         enum sci_task_status completion_status)
1397 {
1398         struct isci_remote_device *isci_device = request->isci_device;
1399         enum isci_request_status old_state;
1400         struct isci_tmf *tmf = isci_request_access_tmf(request);
1401         struct completion *tmf_complete;
1402
1403         dev_dbg(&isci_host->pdev->dev,
1404                 "%s: request = %p, status=%d\n",
1405                 __func__, request, completion_status);
1406
1407         old_state = isci_request_change_state(request, completed);
1408
1409         tmf->status = completion_status;
1410         request->complete_in_target = true;
1411
1412         if (SAS_PROTOCOL_SSP == tmf->proto) {
1413
1414                 memcpy(&tmf->resp.resp_iu,
1415                        scic_io_request_get_response_iu_address(
1416                                request->sci_request_handle
1417                                ),
1418                        sizeof(struct sci_ssp_response_iu));
1419
1420         } else if (SAS_PROTOCOL_SATA == tmf->proto) {
1421
1422                 memcpy(&tmf->resp.d2h_fis,
1423                        scic_stp_io_request_get_d2h_reg_address(
1424                                request->sci_request_handle
1425                                ),
1426                        sizeof(struct sata_fis_reg_d2h)
1427                        );
1428         }
1429
1430         /* Manage the timer if it is still running. */
1431         if (tmf->timeout_timer) {
1432                 isci_del_timer(isci_host, tmf->timeout_timer);
1433                 tmf->timeout_timer = NULL;
1434         }
1435
1436         /* PRINT_TMF( ((struct isci_tmf *)request->task)); */
1437         tmf_complete = tmf->complete;
1438
1439         scic_controller_complete_task(
1440                 isci_host->core_controller,
1441                 to_sci_dev(isci_device),
1442                 request->sci_request_handle
1443                 );
1444         /* NULL the request handle to make sure it cannot be terminated
1445          *  or completed again.
1446          */
1447         request->sci_request_handle = NULL;
1448
1449         isci_request_change_state(request, unallocated);
1450         list_del_init(&request->dev_node);
1451
1452         /* The task management part completes last. */
1453         complete(tmf_complete);
1454 }
1455
1456
1457 /**
1458  * isci_task_ssp_request_get_lun() - This function is called by the sci core to
1459  *    retrieve the lun for a given task request.
1460  * @request: This parameter is the isci_request object.
1461  *
1462  * lun for specified task request.
1463  */
1464 u32 isci_task_ssp_request_get_lun(struct isci_request *request)
1465 {
1466         struct isci_tmf *isci_tmf = isci_request_access_tmf(request);
1467
1468         dev_dbg(&request->isci_host->pdev->dev,
1469                 "%s: lun = %d\n", __func__, isci_tmf->lun[0]);
1470 /* @todo: build lun from array of bytes to 32 bit */
1471         return isci_tmf->lun[0];
1472 }
1473
1474 /**
1475  * isci_task_ssp_request_get_function() - This function is called by the sci
1476  *    core to retrieve the function for a given task request.
1477  * @request: This parameter is the isci_request object.
1478  *
1479  * function code for specified task request.
1480  */
1481 u8 isci_task_ssp_request_get_function(struct isci_request *request)
1482 {
1483         struct isci_tmf *isci_tmf = isci_request_access_tmf(request);
1484
1485         dev_dbg(&request->isci_host->pdev->dev,
1486                 "%s: func = %d\n", __func__, isci_tmf->tmf_code);
1487
1488         return isci_tmf->tmf_code;
1489 }
1490
1491 /**
1492  * isci_task_ssp_request_get_io_tag_to_manage() - This function is called by
1493  *    the sci core to retrieve the io tag for a given task request.
1494  * @request: This parameter is the isci_request object.
1495  *
1496  * io tag for specified task request.
1497  */
1498 u16 isci_task_ssp_request_get_io_tag_to_manage(struct isci_request *request)
1499 {
1500         u16 io_tag = SCI_CONTROLLER_INVALID_IO_TAG;
1501
1502         if (tmf_task == request->ttype) {
1503                 struct isci_tmf *tmf = isci_request_access_tmf(request);
1504                 io_tag = tmf->io_tag;
1505         }
1506
1507         dev_dbg(&request->isci_host->pdev->dev,
1508                 "%s: request = %p, io_tag = %d\n",
1509                 __func__, request, io_tag);
1510
1511         return io_tag;
1512 }
1513
1514 /**
1515  * isci_task_ssp_request_get_response_data_address() - This function is called
1516  *    by the sci core to retrieve the response data address for a given task
1517  *    request.
1518  * @request: This parameter is the isci_request object.
1519  *
1520  * response data address for specified task request.
1521  */
1522 void *isci_task_ssp_request_get_response_data_address(
1523         struct isci_request *request)
1524 {
1525         struct isci_tmf *isci_tmf = isci_request_access_tmf(request);
1526
1527         return &isci_tmf->resp.resp_iu;
1528 }
1529
1530 /**
1531  * isci_task_ssp_request_get_response_data_length() - This function is called
1532  *    by the sci core to retrieve the response data length for a given task
1533  *    request.
1534  * @request: This parameter is the isci_request object.
1535  *
1536  * response data length for specified task request.
1537  */
1538 u32 isci_task_ssp_request_get_response_data_length(
1539         struct isci_request *request)
1540 {
1541         struct isci_tmf *isci_tmf = isci_request_access_tmf(request);
1542
1543         return sizeof(isci_tmf->resp.resp_iu);
1544 }
1545
1546 /**
1547  * isci_bus_reset_handler() - This function performs a target reset of the
1548  *    device referenced by "cmd'.  This function is exported through the
1549  *    "struct scsi_host_template" structure such that it is called when an I/O
1550  *    recovery process has escalated to a target reset. Note that this function
1551  *    is called from the scsi error handler event thread, so may block on calls.
1552  * @scsi_cmd: This parameter specifies the target to be reset.
1553  *
1554  * SUCCESS if the reset process was successful, else FAILED.
1555  */
1556 int isci_bus_reset_handler(struct scsi_cmnd *cmd)
1557 {
1558         unsigned long flags = 0;
1559         struct isci_host *isci_host = NULL;
1560         enum sci_status status;
1561         int base_status;
1562         struct isci_remote_device *isci_dev
1563                 = isci_dev_from_domain_dev(
1564                 sdev_to_domain_dev(cmd->device));
1565
1566         dev_dbg(&cmd->device->sdev_gendev,
1567                 "%s: cmd %p, isci_dev %p\n",
1568                 __func__, cmd, isci_dev);
1569
1570         if (!isci_dev) {
1571                 dev_warn(&cmd->device->sdev_gendev,
1572                          "%s: isci_dev is GONE!\n",
1573                          __func__);
1574
1575                 return TMF_RESP_FUNC_COMPLETE; /* Nothing to reset. */
1576         }
1577
1578         if (isci_dev->isci_port != NULL)
1579                 isci_host = isci_dev->isci_port->isci_host;
1580
1581         if (isci_host != NULL)
1582                 spin_lock_irqsave(&isci_host->scic_lock, flags);
1583
1584         status = scic_remote_device_reset(to_sci_dev(isci_dev));
1585         if (status != SCI_SUCCESS) {
1586
1587                 if (isci_host != NULL)
1588                         spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1589
1590                 scmd_printk(KERN_WARNING, cmd,
1591                             "%s: scic_remote_device_reset(%p) returned %d!\n",
1592                             __func__, isci_dev, status);
1593
1594                 return TMF_RESP_FUNC_FAILED;
1595         }
1596         if (isci_host != NULL)
1597                 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1598
1599         /* Make sure all pending requests are able to be fully terminated. */
1600         isci_device_clear_reset_pending(isci_dev);
1601
1602         /* Terminate in-progress I/O now. */
1603         isci_remote_device_nuke_requests(isci_dev);
1604
1605         /* Call into the libsas default handler (which calls sas_phy_reset). */
1606         base_status = sas_eh_bus_reset_handler(cmd);
1607
1608         if (base_status != SUCCESS) {
1609
1610                 /* There can be cases where the resets to individual devices
1611                  * behind an expander will fail because of an unplug of the
1612                  * expander itself.
1613                  */
1614                 scmd_printk(KERN_WARNING, cmd,
1615                             "%s: sas_eh_bus_reset_handler(%p) returned %d!\n",
1616                             __func__, cmd, base_status);
1617         }
1618
1619         /* WHAT TO DO HERE IF sas_phy_reset FAILS? */
1620
1621         if (isci_host != NULL)
1622                 spin_lock_irqsave(&isci_host->scic_lock, flags);
1623         status = scic_remote_device_reset_complete(to_sci_dev(isci_dev));
1624
1625         if (isci_host != NULL)
1626                 spin_unlock_irqrestore(&isci_host->scic_lock, flags);
1627
1628         if (status != SCI_SUCCESS) {
1629                 scmd_printk(KERN_WARNING, cmd,
1630                             "%s: scic_remote_device_reset_complete(%p) "
1631                             "returned %d!\n",
1632                             __func__, isci_dev, status);
1633         }
1634         /* WHAT TO DO HERE IF scic_remote_device_reset_complete FAILS? */
1635
1636         dev_dbg(&cmd->device->sdev_gendev,
1637                 "%s: cmd %p, isci_dev %p complete.\n",
1638                 __func__, cmd, isci_dev);
1639
1640         return TMF_RESP_FUNC_COMPLETE;
1641 }