~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/scsi/isci/task.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 <linux/irqflags.h>
 
58
#include "sas.h"
 
59
#include <scsi/libsas.h>
 
60
#include "remote_device.h"
 
61
#include "remote_node_context.h"
 
62
#include "isci.h"
 
63
#include "request.h"
 
64
#include "task.h"
 
65
#include "host.h"
 
66
 
 
67
/**
 
68
* isci_task_refuse() - complete the request to the upper layer driver in
 
69
*     the case where an I/O needs to be completed back in the submit path.
 
70
* @ihost: host on which the the request was queued
 
71
* @task: request to complete
 
72
* @response: response code for the completed task.
 
73
* @status: status code for the completed task.
 
74
*
 
75
*/
 
76
static void isci_task_refuse(struct isci_host *ihost, struct sas_task *task,
 
77
                             enum service_response response,
 
78
                             enum exec_status status)
 
79
 
 
80
{
 
81
        enum isci_completion_selection disposition;
 
82
 
 
83
        disposition = isci_perform_normal_io_completion;
 
84
        disposition = isci_task_set_completion_status(task, response, status,
 
85
                                                      disposition);
 
86
 
 
87
        /* Tasks aborted specifically by a call to the lldd_abort_task
 
88
         * function should not be completed to the host in the regular path.
 
89
         */
 
90
        switch (disposition) {
 
91
        case isci_perform_normal_io_completion:
 
92
                /* Normal notification (task_done) */
 
93
                dev_dbg(&ihost->pdev->dev,
 
94
                        "%s: Normal - task = %p, response=%d, "
 
95
                        "status=%d\n",
 
96
                        __func__, task, response, status);
 
97
 
 
98
                task->lldd_task = NULL;
 
99
 
 
100
                isci_execpath_callback(ihost, task, task->task_done);
 
101
                break;
 
102
 
 
103
        case isci_perform_aborted_io_completion:
 
104
                /*
 
105
                 * No notification because this request is already in the
 
106
                 * abort path.
 
107
                 */
 
108
                dev_dbg(&ihost->pdev->dev,
 
109
                        "%s: Aborted - task = %p, response=%d, "
 
110
                        "status=%d\n",
 
111
                        __func__, task, response, status);
 
112
                break;
 
113
 
 
114
        case isci_perform_error_io_completion:
 
115
                /* Use sas_task_abort */
 
116
                dev_dbg(&ihost->pdev->dev,
 
117
                        "%s: Error - task = %p, response=%d, "
 
118
                        "status=%d\n",
 
119
                        __func__, task, response, status);
 
120
 
 
121
                isci_execpath_callback(ihost, task, sas_task_abort);
 
122
                break;
 
123
 
 
124
        default:
 
125
                dev_dbg(&ihost->pdev->dev,
 
126
                        "%s: isci task notification default case!",
 
127
                        __func__);
 
128
                sas_task_abort(task);
 
129
                break;
 
130
        }
 
131
}
 
132
 
 
133
#define for_each_sas_task(num, task) \
 
134
        for (; num > 0; num--,\
 
135
             task = list_entry(task->list.next, struct sas_task, list))
 
136
 
 
137
 
 
138
static inline int isci_device_io_ready(struct isci_remote_device *idev,
 
139
                                       struct sas_task *task)
 
140
{
 
141
        return idev ? test_bit(IDEV_IO_READY, &idev->flags) ||
 
142
                      (test_bit(IDEV_IO_NCQERROR, &idev->flags) &&
 
143
                       isci_task_is_ncq_recovery(task))
 
144
                    : 0;
 
145
}
 
146
/**
 
147
 * isci_task_execute_task() - This function is one of the SAS Domain Template
 
148
 *    functions. This function is called by libsas to send a task down to
 
149
 *    hardware.
 
150
 * @task: This parameter specifies the SAS task to send.
 
151
 * @num: This parameter specifies the number of tasks to queue.
 
152
 * @gfp_flags: This parameter specifies the context of this call.
 
153
 *
 
154
 * status, zero indicates success.
 
155
 */
 
156
int isci_task_execute_task(struct sas_task *task, int num, gfp_t gfp_flags)
 
157
{
 
158
        struct isci_host *ihost = dev_to_ihost(task->dev);
 
159
        struct isci_remote_device *idev;
 
160
        unsigned long flags;
 
161
        bool io_ready;
 
162
        u16 tag;
 
163
 
 
164
        dev_dbg(&ihost->pdev->dev, "%s: num=%d\n", __func__, num);
 
165
 
 
166
        for_each_sas_task(num, task) {
 
167
                enum sci_status status = SCI_FAILURE;
 
168
 
 
169
                spin_lock_irqsave(&ihost->scic_lock, flags);
 
170
                idev = isci_lookup_device(task->dev);
 
171
                io_ready = isci_device_io_ready(idev, task);
 
172
                tag = isci_alloc_tag(ihost);
 
173
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
174
 
 
175
                dev_dbg(&ihost->pdev->dev,
 
176
                        "task: %p, num: %d dev: %p idev: %p:%#lx cmd = %p\n",
 
177
                        task, num, task->dev, idev, idev ? idev->flags : 0,
 
178
                        task->uldd_task);
 
179
 
 
180
                if (!idev) {
 
181
                        isci_task_refuse(ihost, task, SAS_TASK_UNDELIVERED,
 
182
                                         SAS_DEVICE_UNKNOWN);
 
183
                } else if (!io_ready || tag == SCI_CONTROLLER_INVALID_IO_TAG) {
 
184
                        /* Indicate QUEUE_FULL so that the scsi midlayer
 
185
                         * retries.
 
186
                          */
 
187
                        isci_task_refuse(ihost, task, SAS_TASK_COMPLETE,
 
188
                                         SAS_QUEUE_FULL);
 
189
                } else {
 
190
                        /* There is a device and it's ready for I/O. */
 
191
                        spin_lock_irqsave(&task->task_state_lock, flags);
 
192
 
 
193
                        if (task->task_state_flags & SAS_TASK_STATE_ABORTED) {
 
194
                                /* The I/O was aborted. */
 
195
                                spin_unlock_irqrestore(&task->task_state_lock,
 
196
                                                       flags);
 
197
 
 
198
                                isci_task_refuse(ihost, task,
 
199
                                                 SAS_TASK_UNDELIVERED,
 
200
                                                 SAM_STAT_TASK_ABORTED);
 
201
                        } else {
 
202
                                task->task_state_flags |= SAS_TASK_AT_INITIATOR;
 
203
                                spin_unlock_irqrestore(&task->task_state_lock, flags);
 
204
 
 
205
                                /* build and send the request. */
 
206
                                status = isci_request_execute(ihost, idev, task, tag);
 
207
 
 
208
                                if (status != SCI_SUCCESS) {
 
209
 
 
210
                                        spin_lock_irqsave(&task->task_state_lock, flags);
 
211
                                        /* Did not really start this command. */
 
212
                                        task->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
 
213
                                        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
214
 
 
215
                                        if (test_bit(IDEV_GONE, &idev->flags)) {
 
216
 
 
217
                                                /* Indicate that the device
 
218
                                                 * is gone.
 
219
                                                 */
 
220
                                                isci_task_refuse(ihost, task,
 
221
                                                        SAS_TASK_UNDELIVERED,
 
222
                                                        SAS_DEVICE_UNKNOWN);
 
223
                                        } else {
 
224
                                                /* Indicate QUEUE_FULL so that
 
225
                                                 * the scsi midlayer retries.
 
226
                                                 * If the request failed for
 
227
                                                 * remote device reasons, it
 
228
                                                 * gets returned as
 
229
                                                 * SAS_TASK_UNDELIVERED next
 
230
                                                 * time through.
 
231
                                                 */
 
232
                                                isci_task_refuse(ihost, task,
 
233
                                                        SAS_TASK_COMPLETE,
 
234
                                                        SAS_QUEUE_FULL);
 
235
                                        }
 
236
                                }
 
237
                        }
 
238
                }
 
239
                if (status != SCI_SUCCESS && tag != SCI_CONTROLLER_INVALID_IO_TAG) {
 
240
                        spin_lock_irqsave(&ihost->scic_lock, flags);
 
241
                        /* command never hit the device, so just free
 
242
                         * the tci and skip the sequence increment
 
243
                         */
 
244
                        isci_tci_free(ihost, ISCI_TAG_TCI(tag));
 
245
                        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
246
                }
 
247
                isci_put_device(idev);
 
248
        }
 
249
        return 0;
 
250
}
 
251
 
 
252
static enum sci_status isci_sata_management_task_request_build(struct isci_request *ireq)
 
253
{
 
254
        struct isci_tmf *isci_tmf;
 
255
        enum sci_status status;
 
256
 
 
257
        if (!test_bit(IREQ_TMF, &ireq->flags))
 
258
                return SCI_FAILURE;
 
259
 
 
260
        isci_tmf = isci_request_access_tmf(ireq);
 
261
 
 
262
        switch (isci_tmf->tmf_code) {
 
263
 
 
264
        case isci_tmf_sata_srst_high:
 
265
        case isci_tmf_sata_srst_low: {
 
266
                struct host_to_dev_fis *fis = &ireq->stp.cmd;
 
267
 
 
268
                memset(fis, 0, sizeof(*fis));
 
269
 
 
270
                fis->fis_type  =  0x27;
 
271
                fis->flags     &= ~0x80;
 
272
                fis->flags     &= 0xF0;
 
273
                if (isci_tmf->tmf_code == isci_tmf_sata_srst_high)
 
274
                        fis->control |= ATA_SRST;
 
275
                else
 
276
                        fis->control &= ~ATA_SRST;
 
277
                break;
 
278
        }
 
279
        /* other management commnd go here... */
 
280
        default:
 
281
                return SCI_FAILURE;
 
282
        }
 
283
 
 
284
        /* core builds the protocol specific request
 
285
         *  based on the h2d fis.
 
286
         */
 
287
        status = sci_task_request_construct_sata(ireq);
 
288
 
 
289
        return status;
 
290
}
 
291
 
 
292
static struct isci_request *isci_task_request_build(struct isci_host *ihost,
 
293
                                                    struct isci_remote_device *idev,
 
294
                                                    u16 tag, struct isci_tmf *isci_tmf)
 
295
{
 
296
        enum sci_status status = SCI_FAILURE;
 
297
        struct isci_request *ireq = NULL;
 
298
        struct domain_device *dev;
 
299
 
 
300
        dev_dbg(&ihost->pdev->dev,
 
301
                "%s: isci_tmf = %p\n", __func__, isci_tmf);
 
302
 
 
303
        dev = idev->domain_dev;
 
304
 
 
305
        /* do common allocation and init of request object. */
 
306
        ireq = isci_tmf_request_from_tag(ihost, isci_tmf, tag);
 
307
        if (!ireq)
 
308
                return NULL;
 
309
 
 
310
        /* let the core do it's construct. */
 
311
        status = sci_task_request_construct(ihost, idev, tag,
 
312
                                             ireq);
 
313
 
 
314
        if (status != SCI_SUCCESS) {
 
315
                dev_warn(&ihost->pdev->dev,
 
316
                         "%s: sci_task_request_construct failed - "
 
317
                         "status = 0x%x\n",
 
318
                         __func__,
 
319
                         status);
 
320
                return NULL;
 
321
        }
 
322
 
 
323
        /* XXX convert to get this from task->tproto like other drivers */
 
324
        if (dev->dev_type == SAS_END_DEV) {
 
325
                isci_tmf->proto = SAS_PROTOCOL_SSP;
 
326
                status = sci_task_request_construct_ssp(ireq);
 
327
                if (status != SCI_SUCCESS)
 
328
                        return NULL;
 
329
        }
 
330
 
 
331
        if (dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) {
 
332
                isci_tmf->proto = SAS_PROTOCOL_SATA;
 
333
                status = isci_sata_management_task_request_build(ireq);
 
334
 
 
335
                if (status != SCI_SUCCESS)
 
336
                        return NULL;
 
337
        }
 
338
        return ireq;
 
339
}
 
340
 
 
341
/**
 
342
* isci_request_mark_zombie() - This function must be called with scic_lock held.
 
343
*/
 
344
static void isci_request_mark_zombie(struct isci_host *ihost, struct isci_request *ireq)
 
345
{
 
346
        struct completion *tmf_completion = NULL;
 
347
        struct completion *req_completion;
 
348
 
 
349
        /* Set the request state to "dead". */
 
350
        ireq->status = dead;
 
351
 
 
352
        req_completion = ireq->io_request_completion;
 
353
        ireq->io_request_completion = NULL;
 
354
 
 
355
        if (test_bit(IREQ_TMF, &ireq->flags)) {
 
356
                /* Break links with the TMF request. */
 
357
                struct isci_tmf *tmf = isci_request_access_tmf(ireq);
 
358
 
 
359
                /* In the case where a task request is dying,
 
360
                 * the thread waiting on the complete will sit and
 
361
                 * timeout unless we wake it now.  Since the TMF
 
362
                 * has a default error status, complete it here
 
363
                 * to wake the waiting thread.
 
364
                 */
 
365
                if (tmf) {
 
366
                        tmf_completion = tmf->complete;
 
367
                        tmf->complete = NULL;
 
368
                }
 
369
                ireq->ttype_ptr.tmf_task_ptr = NULL;
 
370
                dev_dbg(&ihost->pdev->dev, "%s: tmf_code %d, managed tag %#x\n",
 
371
                        __func__, tmf->tmf_code, tmf->io_tag);
 
372
        } else {
 
373
                /* Break links with the sas_task - the callback is done
 
374
                 * elsewhere.
 
375
                 */
 
376
                struct sas_task *task = isci_request_access_task(ireq);
 
377
 
 
378
                if (task)
 
379
                        task->lldd_task = NULL;
 
380
 
 
381
                ireq->ttype_ptr.io_task_ptr = NULL;
 
382
        }
 
383
 
 
384
        dev_warn(&ihost->pdev->dev, "task context unrecoverable (tag: %#x)\n",
 
385
                 ireq->io_tag);
 
386
 
 
387
        /* Don't force waiting threads to timeout. */
 
388
        if (req_completion)
 
389
                complete(req_completion);
 
390
 
 
391
        if (tmf_completion != NULL)
 
392
                complete(tmf_completion);
 
393
}
 
394
 
 
395
static int isci_task_execute_tmf(struct isci_host *ihost,
 
396
                                 struct isci_remote_device *idev,
 
397
                                 struct isci_tmf *tmf, unsigned long timeout_ms)
 
398
{
 
399
        DECLARE_COMPLETION_ONSTACK(completion);
 
400
        enum sci_task_status status = SCI_TASK_FAILURE;
 
401
        struct isci_request *ireq;
 
402
        int ret = TMF_RESP_FUNC_FAILED;
 
403
        unsigned long flags;
 
404
        unsigned long timeleft;
 
405
        u16 tag;
 
406
 
 
407
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
408
        tag = isci_alloc_tag(ihost);
 
409
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
410
 
 
411
        if (tag == SCI_CONTROLLER_INVALID_IO_TAG)
 
412
                return ret;
 
413
 
 
414
        /* sanity check, return TMF_RESP_FUNC_FAILED
 
415
         * if the device is not there and ready.
 
416
         */
 
417
        if (!idev ||
 
418
            (!test_bit(IDEV_IO_READY, &idev->flags) &&
 
419
             !test_bit(IDEV_IO_NCQERROR, &idev->flags))) {
 
420
                dev_dbg(&ihost->pdev->dev,
 
421
                        "%s: idev = %p not ready (%#lx)\n",
 
422
                        __func__,
 
423
                        idev, idev ? idev->flags : 0);
 
424
                goto err_tci;
 
425
        } else
 
426
                dev_dbg(&ihost->pdev->dev,
 
427
                        "%s: idev = %p\n",
 
428
                        __func__, idev);
 
429
 
 
430
        /* Assign the pointer to the TMF's completion kernel wait structure. */
 
431
        tmf->complete = &completion;
 
432
        tmf->status = SCI_FAILURE_TIMEOUT;
 
433
 
 
434
        ireq = isci_task_request_build(ihost, idev, tag, tmf);
 
435
        if (!ireq)
 
436
                goto err_tci;
 
437
 
 
438
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
439
 
 
440
        /* start the TMF io. */
 
441
        status = sci_controller_start_task(ihost, idev, ireq);
 
442
 
 
443
        if (status != SCI_TASK_SUCCESS) {
 
444
                dev_dbg(&ihost->pdev->dev,
 
445
                         "%s: start_io failed - status = 0x%x, request = %p\n",
 
446
                         __func__,
 
447
                         status,
 
448
                         ireq);
 
449
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
450
                goto err_tci;
 
451
        }
 
452
 
 
453
        if (tmf->cb_state_func != NULL)
 
454
                tmf->cb_state_func(isci_tmf_started, tmf, tmf->cb_data);
 
455
 
 
456
        isci_request_change_state(ireq, started);
 
457
 
 
458
        /* add the request to the remote device request list. */
 
459
        list_add(&ireq->dev_node, &idev->reqs_in_process);
 
460
 
 
461
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
462
 
 
463
        /* Wait for the TMF to complete, or a timeout. */
 
464
        timeleft = wait_for_completion_timeout(&completion,
 
465
                                               msecs_to_jiffies(timeout_ms));
 
466
 
 
467
        if (timeleft == 0) {
 
468
                /* The TMF did not complete - this could be because
 
469
                 * of an unplug.  Terminate the TMF request now.
 
470
                 */
 
471
                spin_lock_irqsave(&ihost->scic_lock, flags);
 
472
 
 
473
                if (tmf->cb_state_func != NULL)
 
474
                        tmf->cb_state_func(isci_tmf_timed_out, tmf,
 
475
                                           tmf->cb_data);
 
476
 
 
477
                sci_controller_terminate_request(ihost, idev, ireq);
 
478
 
 
479
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
480
 
 
481
                timeleft = wait_for_completion_timeout(
 
482
                        &completion,
 
483
                        msecs_to_jiffies(ISCI_TERMINATION_TIMEOUT_MSEC));
 
484
 
 
485
                if (!timeleft) {
 
486
                        /* Strange condition - the termination of the TMF
 
487
                         * request timed-out.
 
488
                         */
 
489
                        spin_lock_irqsave(&ihost->scic_lock, flags);
 
490
 
 
491
                        /* If the TMF status has not changed, kill it. */
 
492
                        if (tmf->status == SCI_FAILURE_TIMEOUT)
 
493
                                isci_request_mark_zombie(ihost, ireq);
 
494
 
 
495
                        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
496
                }
 
497
        }
 
498
 
 
499
        isci_print_tmf(tmf);
 
500
 
 
501
        if (tmf->status == SCI_SUCCESS)
 
502
                ret =  TMF_RESP_FUNC_COMPLETE;
 
503
        else if (tmf->status == SCI_FAILURE_IO_RESPONSE_VALID) {
 
504
                dev_dbg(&ihost->pdev->dev,
 
505
                        "%s: tmf.status == "
 
506
                        "SCI_FAILURE_IO_RESPONSE_VALID\n",
 
507
                        __func__);
 
508
                ret =  TMF_RESP_FUNC_COMPLETE;
 
509
        }
 
510
        /* Else - leave the default "failed" status alone. */
 
511
 
 
512
        dev_dbg(&ihost->pdev->dev,
 
513
                "%s: completed request = %p\n",
 
514
                __func__,
 
515
                ireq);
 
516
 
 
517
        return ret;
 
518
 
 
519
 err_tci:
 
520
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
521
        isci_tci_free(ihost, ISCI_TAG_TCI(tag));
 
522
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
523
 
 
524
        return ret;
 
525
}
 
526
 
 
527
static void isci_task_build_tmf(struct isci_tmf *tmf,
 
528
                                enum isci_tmf_function_codes code,
 
529
                                void (*tmf_sent_cb)(enum isci_tmf_cb_state,
 
530
                                                    struct isci_tmf *,
 
531
                                                    void *),
 
532
                                void *cb_data)
 
533
{
 
534
        memset(tmf, 0, sizeof(*tmf));
 
535
 
 
536
        tmf->tmf_code      = code;
 
537
        tmf->cb_state_func = tmf_sent_cb;
 
538
        tmf->cb_data       = cb_data;
 
539
}
 
540
 
 
541
static void isci_task_build_abort_task_tmf(struct isci_tmf *tmf,
 
542
                                           enum isci_tmf_function_codes code,
 
543
                                           void (*tmf_sent_cb)(enum isci_tmf_cb_state,
 
544
                                                               struct isci_tmf *,
 
545
                                                               void *),
 
546
                                           struct isci_request *old_request)
 
547
{
 
548
        isci_task_build_tmf(tmf, code, tmf_sent_cb, old_request);
 
549
        tmf->io_tag = old_request->io_tag;
 
550
}
 
551
 
 
552
/**
 
553
 * isci_task_validate_request_to_abort() - This function checks the given I/O
 
554
 *    against the "started" state.  If the request is still "started", it's
 
555
 *    state is changed to aborted. NOTE: isci_host->scic_lock MUST BE HELD
 
556
 *    BEFORE CALLING THIS FUNCTION.
 
557
 * @isci_request: This parameter specifies the request object to control.
 
558
 * @isci_host: This parameter specifies the ISCI host object
 
559
 * @isci_device: This is the device to which the request is pending.
 
560
 * @aborted_io_completion: This is a completion structure that will be added to
 
561
 *    the request in case it is changed to aborting; this completion is
 
562
 *    triggered when the request is fully completed.
 
563
 *
 
564
 * Either "started" on successful change of the task status to "aborted", or
 
565
 * "unallocated" if the task cannot be controlled.
 
566
 */
 
567
static enum isci_request_status isci_task_validate_request_to_abort(
 
568
        struct isci_request *isci_request,
 
569
        struct isci_host *isci_host,
 
570
        struct isci_remote_device *isci_device,
 
571
        struct completion *aborted_io_completion)
 
572
{
 
573
        enum isci_request_status old_state = unallocated;
 
574
 
 
575
        /* Only abort the task if it's in the
 
576
         *  device's request_in_process list
 
577
         */
 
578
        if (isci_request && !list_empty(&isci_request->dev_node)) {
 
579
                old_state = isci_request_change_started_to_aborted(
 
580
                        isci_request, aborted_io_completion);
 
581
 
 
582
        }
 
583
 
 
584
        return old_state;
 
585
}
 
586
 
 
587
static int isci_request_is_dealloc_managed(enum isci_request_status stat)
 
588
{
 
589
        switch (stat) {
 
590
        case aborted:
 
591
        case aborting:
 
592
        case terminating:
 
593
        case completed:
 
594
        case dead:
 
595
                return true;
 
596
        default:
 
597
                return false;
 
598
        }
 
599
}
 
600
 
 
601
/**
 
602
 * isci_terminate_request_core() - This function will terminate the given
 
603
 *    request, and wait for it to complete.  This function must only be called
 
604
 *    from a thread that can wait.  Note that the request is terminated and
 
605
 *    completed (back to the host, if started there).
 
606
 * @ihost: This SCU.
 
607
 * @idev: The target.
 
608
 * @isci_request: The I/O request to be terminated.
 
609
 *
 
610
 */
 
611
static void isci_terminate_request_core(struct isci_host *ihost,
 
612
                                        struct isci_remote_device *idev,
 
613
                                        struct isci_request *isci_request)
 
614
{
 
615
        enum sci_status status      = SCI_SUCCESS;
 
616
        bool was_terminated         = false;
 
617
        bool needs_cleanup_handling = false;
 
618
        unsigned long     flags;
 
619
        unsigned long     termination_completed = 1;
 
620
        struct completion *io_request_completion;
 
621
 
 
622
        dev_dbg(&ihost->pdev->dev,
 
623
                "%s: device = %p; request = %p\n",
 
624
                __func__, idev, isci_request);
 
625
 
 
626
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
627
 
 
628
        io_request_completion = isci_request->io_request_completion;
 
629
 
 
630
        /* Note that we are not going to control
 
631
         * the target to abort the request.
 
632
         */
 
633
        set_bit(IREQ_COMPLETE_IN_TARGET, &isci_request->flags);
 
634
 
 
635
        /* Make sure the request wasn't just sitting around signalling
 
636
         * device condition (if the request handle is NULL, then the
 
637
         * request completed but needed additional handling here).
 
638
         */
 
639
        if (!test_bit(IREQ_TERMINATED, &isci_request->flags)) {
 
640
                was_terminated = true;
 
641
                needs_cleanup_handling = true;
 
642
                status = sci_controller_terminate_request(ihost,
 
643
                                                           idev,
 
644
                                                           isci_request);
 
645
        }
 
646
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
647
 
 
648
        /*
 
649
         * The only time the request to terminate will
 
650
         * fail is when the io request is completed and
 
651
         * being aborted.
 
652
         */
 
653
        if (status != SCI_SUCCESS) {
 
654
                dev_dbg(&ihost->pdev->dev,
 
655
                        "%s: sci_controller_terminate_request"
 
656
                        " returned = 0x%x\n",
 
657
                        __func__, status);
 
658
 
 
659
                isci_request->io_request_completion = NULL;
 
660
 
 
661
        } else {
 
662
                if (was_terminated) {
 
663
                        dev_dbg(&ihost->pdev->dev,
 
664
                                "%s: before completion wait (%p/%p)\n",
 
665
                                __func__, isci_request, io_request_completion);
 
666
 
 
667
                        /* Wait here for the request to complete. */
 
668
                        termination_completed
 
669
                                = wait_for_completion_timeout(
 
670
                                   io_request_completion,
 
671
                                   msecs_to_jiffies(ISCI_TERMINATION_TIMEOUT_MSEC));
 
672
 
 
673
                        if (!termination_completed) {
 
674
 
 
675
                                /* The request to terminate has timed out.  */
 
676
                                spin_lock_irqsave(&ihost->scic_lock, flags);
 
677
 
 
678
                                /* Check for state changes. */
 
679
                                if (!test_bit(IREQ_TERMINATED,
 
680
                                              &isci_request->flags)) {
 
681
 
 
682
                                        /* The best we can do is to have the
 
683
                                         * request die a silent death if it
 
684
                                         * ever really completes.
 
685
                                         */
 
686
                                        isci_request_mark_zombie(ihost,
 
687
                                                                 isci_request);
 
688
                                        needs_cleanup_handling = true;
 
689
                                } else
 
690
                                        termination_completed = 1;
 
691
 
 
692
                                spin_unlock_irqrestore(&ihost->scic_lock,
 
693
                                                       flags);
 
694
 
 
695
                                if (!termination_completed) {
 
696
 
 
697
                                        dev_dbg(&ihost->pdev->dev,
 
698
                                                "%s: *** Timeout waiting for "
 
699
                                                "termination(%p/%p)\n",
 
700
                                                __func__, io_request_completion,
 
701
                                                isci_request);
 
702
 
 
703
                                        /* The request can no longer be referenced
 
704
                                         * safely since it may go away if the
 
705
                                         * termination every really does complete.
 
706
                                         */
 
707
                                        isci_request = NULL;
 
708
                                }
 
709
                        }
 
710
                        if (termination_completed)
 
711
                                dev_dbg(&ihost->pdev->dev,
 
712
                                        "%s: after completion wait (%p/%p)\n",
 
713
                                        __func__, isci_request, io_request_completion);
 
714
                }
 
715
 
 
716
                if (termination_completed) {
 
717
 
 
718
                        isci_request->io_request_completion = NULL;
 
719
 
 
720
                        /* Peek at the status of the request.  This will tell
 
721
                         * us if there was special handling on the request such that it
 
722
                         * needs to be detached and freed here.
 
723
                         */
 
724
                        spin_lock_irqsave(&isci_request->state_lock, flags);
 
725
 
 
726
                        needs_cleanup_handling
 
727
                                = isci_request_is_dealloc_managed(
 
728
                                        isci_request->status);
 
729
 
 
730
                        spin_unlock_irqrestore(&isci_request->state_lock, flags);
 
731
 
 
732
                }
 
733
                if (needs_cleanup_handling) {
 
734
 
 
735
                        dev_dbg(&ihost->pdev->dev,
 
736
                                "%s: cleanup isci_device=%p, request=%p\n",
 
737
                                __func__, idev, isci_request);
 
738
 
 
739
                        if (isci_request != NULL) {
 
740
                                spin_lock_irqsave(&ihost->scic_lock, flags);
 
741
                                isci_free_tag(ihost, isci_request->io_tag);
 
742
                                isci_request_change_state(isci_request, unallocated);
 
743
                                list_del_init(&isci_request->dev_node);
 
744
                                spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
745
                        }
 
746
                }
 
747
        }
 
748
}
 
749
 
 
750
/**
 
751
 * isci_terminate_pending_requests() - This function will change the all of the
 
752
 *    requests on the given device's state to "aborting", will terminate the
 
753
 *    requests, and wait for them to complete.  This function must only be
 
754
 *    called from a thread that can wait.  Note that the requests are all
 
755
 *    terminated and completed (back to the host, if started there).
 
756
 * @isci_host: This parameter specifies SCU.
 
757
 * @idev: This parameter specifies the target.
 
758
 *
 
759
 */
 
760
void isci_terminate_pending_requests(struct isci_host *ihost,
 
761
                                     struct isci_remote_device *idev)
 
762
{
 
763
        struct completion request_completion;
 
764
        enum isci_request_status old_state;
 
765
        unsigned long flags;
 
766
        LIST_HEAD(list);
 
767
 
 
768
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
769
        list_splice_init(&idev->reqs_in_process, &list);
 
770
 
 
771
        /* assumes that isci_terminate_request_core deletes from the list */
 
772
        while (!list_empty(&list)) {
 
773
                struct isci_request *ireq = list_entry(list.next, typeof(*ireq), dev_node);
 
774
 
 
775
                /* Change state to "terminating" if it is currently
 
776
                 * "started".
 
777
                 */
 
778
                old_state = isci_request_change_started_to_newstate(ireq,
 
779
                                                                    &request_completion,
 
780
                                                                    terminating);
 
781
                switch (old_state) {
 
782
                case started:
 
783
                case completed:
 
784
                case aborting:
 
785
                        break;
 
786
                default:
 
787
                        /* termination in progress, or otherwise dispositioned.
 
788
                         * We know the request was on 'list' so should be safe
 
789
                         * to move it back to reqs_in_process
 
790
                         */
 
791
                        list_move(&ireq->dev_node, &idev->reqs_in_process);
 
792
                        ireq = NULL;
 
793
                        break;
 
794
                }
 
795
 
 
796
                if (!ireq)
 
797
                        continue;
 
798
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
799
 
 
800
                init_completion(&request_completion);
 
801
 
 
802
                dev_dbg(&ihost->pdev->dev,
 
803
                         "%s: idev=%p request=%p; task=%p old_state=%d\n",
 
804
                         __func__, idev, ireq,
 
805
                        (!test_bit(IREQ_TMF, &ireq->flags)
 
806
                                ? isci_request_access_task(ireq)
 
807
                                : NULL),
 
808
                        old_state);
 
809
 
 
810
                /* If the old_state is started:
 
811
                 * This request was not already being aborted. If it had been,
 
812
                 * then the aborting I/O (ie. the TMF request) would not be in
 
813
                 * the aborting state, and thus would be terminated here.  Note
 
814
                 * that since the TMF completion's call to the kernel function
 
815
                 * "complete()" does not happen until the pending I/O request
 
816
                 * terminate fully completes, we do not have to implement a
 
817
                 * special wait here for already aborting requests - the
 
818
                 * termination of the TMF request will force the request
 
819
                 * to finish it's already started terminate.
 
820
                 *
 
821
                 * If old_state == completed:
 
822
                 * This request completed from the SCU hardware perspective
 
823
                 * and now just needs cleaning up in terms of freeing the
 
824
                 * request and potentially calling up to libsas.
 
825
                 *
 
826
                 * If old_state == aborting:
 
827
                 * This request has already gone through a TMF timeout, but may
 
828
                 * not have been terminated; needs cleaning up at least.
 
829
                 */
 
830
                isci_terminate_request_core(ihost, idev, ireq);
 
831
                spin_lock_irqsave(&ihost->scic_lock, flags);
 
832
        }
 
833
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
834
}
 
835
 
 
836
/**
 
837
 * isci_task_send_lu_reset_sas() - This function is called by of the SAS Domain
 
838
 *    Template functions.
 
839
 * @lun: This parameter specifies the lun to be reset.
 
840
 *
 
841
 * status, zero indicates success.
 
842
 */
 
843
static int isci_task_send_lu_reset_sas(
 
844
        struct isci_host *isci_host,
 
845
        struct isci_remote_device *isci_device,
 
846
        u8 *lun)
 
847
{
 
848
        struct isci_tmf tmf;
 
849
        int ret = TMF_RESP_FUNC_FAILED;
 
850
 
 
851
        dev_dbg(&isci_host->pdev->dev,
 
852
                "%s: isci_host = %p, isci_device = %p\n",
 
853
                __func__, isci_host, isci_device);
 
854
        /* Send the LUN reset to the target.  By the time the call returns,
 
855
         * the TMF has fully exected in the target (in which case the return
 
856
         * value is "TMF_RESP_FUNC_COMPLETE", or the request timed-out (or
 
857
         * was otherwise unable to be executed ("TMF_RESP_FUNC_FAILED").
 
858
         */
 
859
        isci_task_build_tmf(&tmf, isci_tmf_ssp_lun_reset, NULL, NULL);
 
860
 
 
861
        #define ISCI_LU_RESET_TIMEOUT_MS 2000 /* 2 second timeout. */
 
862
        ret = isci_task_execute_tmf(isci_host, isci_device, &tmf, ISCI_LU_RESET_TIMEOUT_MS);
 
863
 
 
864
        if (ret == TMF_RESP_FUNC_COMPLETE)
 
865
                dev_dbg(&isci_host->pdev->dev,
 
866
                        "%s: %p: TMF_LU_RESET passed\n",
 
867
                        __func__, isci_device);
 
868
        else
 
869
                dev_dbg(&isci_host->pdev->dev,
 
870
                        "%s: %p: TMF_LU_RESET failed (%x)\n",
 
871
                        __func__, isci_device, ret);
 
872
 
 
873
        return ret;
 
874
}
 
875
 
 
876
static int isci_task_send_lu_reset_sata(struct isci_host *ihost,
 
877
                                 struct isci_remote_device *idev, u8 *lun)
 
878
{
 
879
        int ret = TMF_RESP_FUNC_FAILED;
 
880
        struct isci_tmf tmf;
 
881
 
 
882
        /* Send the soft reset to the target */
 
883
        #define ISCI_SRST_TIMEOUT_MS 25000 /* 25 second timeout. */
 
884
        isci_task_build_tmf(&tmf, isci_tmf_sata_srst_high, NULL, NULL);
 
885
 
 
886
        ret = isci_task_execute_tmf(ihost, idev, &tmf, ISCI_SRST_TIMEOUT_MS);
 
887
 
 
888
        if (ret != TMF_RESP_FUNC_COMPLETE) {
 
889
                dev_dbg(&ihost->pdev->dev,
 
890
                         "%s: Assert SRST failed (%p) = %x",
 
891
                         __func__, idev, ret);
 
892
 
 
893
                /* Return the failure so that the LUN reset is escalated
 
894
                 * to a target reset.
 
895
                 */
 
896
        }
 
897
        return ret;
 
898
}
 
899
 
 
900
/**
 
901
 * isci_task_lu_reset() - This function is one of the SAS Domain Template
 
902
 *    functions. This is one of the Task Management functoins called by libsas,
 
903
 *    to reset the given lun. Note the assumption that while this call is
 
904
 *    executing, no I/O will be sent by the host to the device.
 
905
 * @lun: This parameter specifies the lun to be reset.
 
906
 *
 
907
 * status, zero indicates success.
 
908
 */
 
909
int isci_task_lu_reset(struct domain_device *domain_device, u8 *lun)
 
910
{
 
911
        struct isci_host *isci_host = dev_to_ihost(domain_device);
 
912
        struct isci_remote_device *isci_device;
 
913
        unsigned long flags;
 
914
        int ret;
 
915
 
 
916
        spin_lock_irqsave(&isci_host->scic_lock, flags);
 
917
        isci_device = isci_lookup_device(domain_device);
 
918
        spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
919
 
 
920
        dev_dbg(&isci_host->pdev->dev,
 
921
                "%s: domain_device=%p, isci_host=%p; isci_device=%p\n",
 
922
                 __func__, domain_device, isci_host, isci_device);
 
923
 
 
924
        if (!isci_device) {
 
925
                /* If the device is gone, stop the escalations. */
 
926
                dev_dbg(&isci_host->pdev->dev, "%s: No dev\n", __func__);
 
927
 
 
928
                ret = TMF_RESP_FUNC_COMPLETE;
 
929
                goto out;
 
930
        }
 
931
        set_bit(IDEV_EH, &isci_device->flags);
 
932
 
 
933
        /* Send the task management part of the reset. */
 
934
        if (sas_protocol_ata(domain_device->tproto)) {
 
935
                ret = isci_task_send_lu_reset_sata(isci_host, isci_device, lun);
 
936
        } else
 
937
                ret = isci_task_send_lu_reset_sas(isci_host, isci_device, lun);
 
938
 
 
939
        /* If the LUN reset worked, all the I/O can now be terminated. */
 
940
        if (ret == TMF_RESP_FUNC_COMPLETE)
 
941
                /* Terminate all I/O now. */
 
942
                isci_terminate_pending_requests(isci_host,
 
943
                                                isci_device);
 
944
 
 
945
 out:
 
946
        isci_put_device(isci_device);
 
947
        return ret;
 
948
}
 
949
 
 
950
 
 
951
/*       int (*lldd_clear_nexus_port)(struct asd_sas_port *); */
 
952
int isci_task_clear_nexus_port(struct asd_sas_port *port)
 
953
{
 
954
        return TMF_RESP_FUNC_FAILED;
 
955
}
 
956
 
 
957
 
 
958
 
 
959
int isci_task_clear_nexus_ha(struct sas_ha_struct *ha)
 
960
{
 
961
        return TMF_RESP_FUNC_FAILED;
 
962
}
 
963
 
 
964
/* Task Management Functions. Must be called from process context.       */
 
965
 
 
966
/**
 
967
 * isci_abort_task_process_cb() - This is a helper function for the abort task
 
968
 *    TMF command.  It manages the request state with respect to the successful
 
969
 *    transmission / completion of the abort task request.
 
970
 * @cb_state: This parameter specifies when this function was called - after
 
971
 *    the TMF request has been started and after it has timed-out.
 
972
 * @tmf: This parameter specifies the TMF in progress.
 
973
 *
 
974
 *
 
975
 */
 
976
static void isci_abort_task_process_cb(
 
977
        enum isci_tmf_cb_state cb_state,
 
978
        struct isci_tmf *tmf,
 
979
        void *cb_data)
 
980
{
 
981
        struct isci_request *old_request;
 
982
 
 
983
        old_request = (struct isci_request *)cb_data;
 
984
 
 
985
        dev_dbg(&old_request->isci_host->pdev->dev,
 
986
                "%s: tmf=%p, old_request=%p\n",
 
987
                __func__, tmf, old_request);
 
988
 
 
989
        switch (cb_state) {
 
990
 
 
991
        case isci_tmf_started:
 
992
                /* The TMF has been started.  Nothing to do here, since the
 
993
                 * request state was already set to "aborted" by the abort
 
994
                 * task function.
 
995
                 */
 
996
                if ((old_request->status != aborted)
 
997
                        && (old_request->status != completed))
 
998
                        dev_dbg(&old_request->isci_host->pdev->dev,
 
999
                                "%s: Bad request status (%d): tmf=%p, old_request=%p\n",
 
1000
                                __func__, old_request->status, tmf, old_request);
 
1001
                break;
 
1002
 
 
1003
        case isci_tmf_timed_out:
 
1004
 
 
1005
                /* Set the task's state to "aborting", since the abort task
 
1006
                 * function thread set it to "aborted" (above) in anticipation
 
1007
                 * of the task management request working correctly.  Since the
 
1008
                 * timeout has now fired, the TMF request failed.  We set the
 
1009
                 * state such that the request completion will indicate the
 
1010
                 * device is no longer present.
 
1011
                 */
 
1012
                isci_request_change_state(old_request, aborting);
 
1013
                break;
 
1014
 
 
1015
        default:
 
1016
                dev_dbg(&old_request->isci_host->pdev->dev,
 
1017
                        "%s: Bad cb_state (%d): tmf=%p, old_request=%p\n",
 
1018
                        __func__, cb_state, tmf, old_request);
 
1019
                break;
 
1020
        }
 
1021
}
 
1022
 
 
1023
/**
 
1024
 * isci_task_abort_task() - This function is one of the SAS Domain Template
 
1025
 *    functions. This function is called by libsas to abort a specified task.
 
1026
 * @task: This parameter specifies the SAS task to abort.
 
1027
 *
 
1028
 * status, zero indicates success.
 
1029
 */
 
1030
int isci_task_abort_task(struct sas_task *task)
 
1031
{
 
1032
        struct isci_host *isci_host = dev_to_ihost(task->dev);
 
1033
        DECLARE_COMPLETION_ONSTACK(aborted_io_completion);
 
1034
        struct isci_request       *old_request = NULL;
 
1035
        enum isci_request_status  old_state;
 
1036
        struct isci_remote_device *isci_device = NULL;
 
1037
        struct isci_tmf           tmf;
 
1038
        int                       ret = TMF_RESP_FUNC_FAILED;
 
1039
        unsigned long             flags;
 
1040
        int                       perform_termination = 0;
 
1041
 
 
1042
        /* Get the isci_request reference from the task.  Note that
 
1043
         * this check does not depend on the pending request list
 
1044
         * in the device, because tasks driving resets may land here
 
1045
         * after completion in the core.
 
1046
         */
 
1047
        spin_lock_irqsave(&isci_host->scic_lock, flags);
 
1048
        spin_lock(&task->task_state_lock);
 
1049
 
 
1050
        old_request = task->lldd_task;
 
1051
 
 
1052
        /* If task is already done, the request isn't valid */
 
1053
        if (!(task->task_state_flags & SAS_TASK_STATE_DONE) &&
 
1054
            (task->task_state_flags & SAS_TASK_AT_INITIATOR) &&
 
1055
            old_request)
 
1056
                isci_device = isci_lookup_device(task->dev);
 
1057
 
 
1058
        spin_unlock(&task->task_state_lock);
 
1059
        spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
1060
 
 
1061
        dev_dbg(&isci_host->pdev->dev,
 
1062
                "%s: dev = %p, task = %p, old_request == %p\n",
 
1063
                __func__, isci_device, task, old_request);
 
1064
 
 
1065
        if (isci_device)
 
1066
                set_bit(IDEV_EH, &isci_device->flags);
 
1067
 
 
1068
        /* Device reset conditions signalled in task_state_flags are the
 
1069
         * responsbility of libsas to observe at the start of the error
 
1070
         * handler thread.
 
1071
         */
 
1072
        if (!isci_device || !old_request) {
 
1073
                /* The request has already completed and there
 
1074
                * is nothing to do here other than to set the task
 
1075
                * done bit, and indicate that the task abort function
 
1076
                * was sucessful.
 
1077
                */
 
1078
                spin_lock_irqsave(&task->task_state_lock, flags);
 
1079
                task->task_state_flags |= SAS_TASK_STATE_DONE;
 
1080
                task->task_state_flags &= ~(SAS_TASK_AT_INITIATOR |
 
1081
                                            SAS_TASK_STATE_PENDING);
 
1082
                spin_unlock_irqrestore(&task->task_state_lock, flags);
 
1083
 
 
1084
                ret = TMF_RESP_FUNC_COMPLETE;
 
1085
 
 
1086
                dev_dbg(&isci_host->pdev->dev,
 
1087
                        "%s: abort task not needed for %p\n",
 
1088
                        __func__, task);
 
1089
                goto out;
 
1090
        }
 
1091
 
 
1092
        spin_lock_irqsave(&isci_host->scic_lock, flags);
 
1093
 
 
1094
        /* Check the request status and change to "aborted" if currently
 
1095
         * "starting"; if true then set the I/O kernel completion
 
1096
         * struct that will be triggered when the request completes.
 
1097
         */
 
1098
        old_state = isci_task_validate_request_to_abort(
 
1099
                                old_request, isci_host, isci_device,
 
1100
                                &aborted_io_completion);
 
1101
        if ((old_state != started) &&
 
1102
            (old_state != completed) &&
 
1103
            (old_state != aborting)) {
 
1104
 
 
1105
                spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
1106
 
 
1107
                /* The request was already being handled by someone else (because
 
1108
                * they got to set the state away from started).
 
1109
                */
 
1110
                dev_dbg(&isci_host->pdev->dev,
 
1111
                        "%s:  device = %p; old_request %p already being aborted\n",
 
1112
                        __func__,
 
1113
                        isci_device, old_request);
 
1114
                ret = TMF_RESP_FUNC_COMPLETE;
 
1115
                goto out;
 
1116
        }
 
1117
        if (task->task_proto == SAS_PROTOCOL_SMP ||
 
1118
            sas_protocol_ata(task->task_proto) ||
 
1119
            test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags)) {
 
1120
 
 
1121
                spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
1122
 
 
1123
                dev_dbg(&isci_host->pdev->dev,
 
1124
                        "%s: %s request"
 
1125
                        " or complete_in_target (%d), thus no TMF\n",
 
1126
                        __func__,
 
1127
                        ((task->task_proto == SAS_PROTOCOL_SMP)
 
1128
                                ? "SMP"
 
1129
                                : (sas_protocol_ata(task->task_proto)
 
1130
                                        ? "SATA/STP"
 
1131
                                        : "<other>")
 
1132
                         ),
 
1133
                        test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags));
 
1134
 
 
1135
                if (test_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags)) {
 
1136
                        spin_lock_irqsave(&task->task_state_lock, flags);
 
1137
                        task->task_state_flags |= SAS_TASK_STATE_DONE;
 
1138
                        task->task_state_flags &= ~(SAS_TASK_AT_INITIATOR |
 
1139
                                                    SAS_TASK_STATE_PENDING);
 
1140
                        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
1141
                        ret = TMF_RESP_FUNC_COMPLETE;
 
1142
                } else {
 
1143
                        spin_lock_irqsave(&task->task_state_lock, flags);
 
1144
                        task->task_state_flags &= ~(SAS_TASK_AT_INITIATOR |
 
1145
                                                    SAS_TASK_STATE_PENDING);
 
1146
                        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
1147
                }
 
1148
 
 
1149
                /* STP and SMP devices are not sent a TMF, but the
 
1150
                 * outstanding I/O request is terminated below.  This is
 
1151
                 * because SATA/STP and SMP discovery path timeouts directly
 
1152
                 * call the abort task interface for cleanup.
 
1153
                 */
 
1154
                perform_termination = 1;
 
1155
 
 
1156
        } else {
 
1157
                /* Fill in the tmf stucture */
 
1158
                isci_task_build_abort_task_tmf(&tmf, isci_tmf_ssp_task_abort,
 
1159
                                               isci_abort_task_process_cb,
 
1160
                                               old_request);
 
1161
 
 
1162
                spin_unlock_irqrestore(&isci_host->scic_lock, flags);
 
1163
 
 
1164
                #define ISCI_ABORT_TASK_TIMEOUT_MS 500 /* 1/2 second timeout */
 
1165
                ret = isci_task_execute_tmf(isci_host, isci_device, &tmf,
 
1166
                                            ISCI_ABORT_TASK_TIMEOUT_MS);
 
1167
 
 
1168
                if (ret == TMF_RESP_FUNC_COMPLETE)
 
1169
                        perform_termination = 1;
 
1170
                else
 
1171
                        dev_dbg(&isci_host->pdev->dev,
 
1172
                                "%s: isci_task_send_tmf failed\n", __func__);
 
1173
        }
 
1174
        if (perform_termination) {
 
1175
                set_bit(IREQ_COMPLETE_IN_TARGET, &old_request->flags);
 
1176
 
 
1177
                /* Clean up the request on our side, and wait for the aborted
 
1178
                 * I/O to complete.
 
1179
                 */
 
1180
                isci_terminate_request_core(isci_host, isci_device,
 
1181
                                            old_request);
 
1182
        }
 
1183
 
 
1184
        /* Make sure we do not leave a reference to aborted_io_completion */
 
1185
        old_request->io_request_completion = NULL;
 
1186
 out:
 
1187
        isci_put_device(isci_device);
 
1188
        return ret;
 
1189
}
 
1190
 
 
1191
/**
 
1192
 * isci_task_abort_task_set() - This function is one of the SAS Domain Template
 
1193
 *    functions. This is one of the Task Management functoins called by libsas,
 
1194
 *    to abort all task for the given lun.
 
1195
 * @d_device: This parameter specifies the domain device associated with this
 
1196
 *    request.
 
1197
 * @lun: This parameter specifies the lun associated with this request.
 
1198
 *
 
1199
 * status, zero indicates success.
 
1200
 */
 
1201
int isci_task_abort_task_set(
 
1202
        struct domain_device *d_device,
 
1203
        u8 *lun)
 
1204
{
 
1205
        return TMF_RESP_FUNC_FAILED;
 
1206
}
 
1207
 
 
1208
 
 
1209
/**
 
1210
 * isci_task_clear_aca() - This function is one of the SAS Domain Template
 
1211
 *    functions. This is one of the Task Management functoins called by libsas.
 
1212
 * @d_device: This parameter specifies the domain device associated with this
 
1213
 *    request.
 
1214
 * @lun: This parameter specifies the lun        associated with this request.
 
1215
 *
 
1216
 * status, zero indicates success.
 
1217
 */
 
1218
int isci_task_clear_aca(
 
1219
        struct domain_device *d_device,
 
1220
        u8 *lun)
 
1221
{
 
1222
        return TMF_RESP_FUNC_FAILED;
 
1223
}
 
1224
 
 
1225
 
 
1226
 
 
1227
/**
 
1228
 * isci_task_clear_task_set() - This function is one of the SAS Domain Template
 
1229
 *    functions. This is one of the Task Management functoins called by libsas.
 
1230
 * @d_device: This parameter specifies the domain device associated with this
 
1231
 *    request.
 
1232
 * @lun: This parameter specifies the lun        associated with this request.
 
1233
 *
 
1234
 * status, zero indicates success.
 
1235
 */
 
1236
int isci_task_clear_task_set(
 
1237
        struct domain_device *d_device,
 
1238
        u8 *lun)
 
1239
{
 
1240
        return TMF_RESP_FUNC_FAILED;
 
1241
}
 
1242
 
 
1243
 
 
1244
/**
 
1245
 * isci_task_query_task() - This function is implemented to cause libsas to
 
1246
 *    correctly escalate the failed abort to a LUN or target reset (this is
 
1247
 *    because sas_scsi_find_task libsas function does not correctly interpret
 
1248
 *    all return codes from the abort task call).  When TMF_RESP_FUNC_SUCC is
 
1249
 *    returned, libsas turns this into a LUN reset; when FUNC_FAILED is
 
1250
 *    returned, libsas will turn this into a target reset
 
1251
 * @task: This parameter specifies the sas task being queried.
 
1252
 * @lun: This parameter specifies the lun associated with this request.
 
1253
 *
 
1254
 * status, zero indicates success.
 
1255
 */
 
1256
int isci_task_query_task(
 
1257
        struct sas_task *task)
 
1258
{
 
1259
        /* See if there is a pending device reset for this device. */
 
1260
        if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET)
 
1261
                return TMF_RESP_FUNC_FAILED;
 
1262
        else
 
1263
                return TMF_RESP_FUNC_SUCC;
 
1264
}
 
1265
 
 
1266
/*
 
1267
 * isci_task_request_complete() - This function is called by the sci core when
 
1268
 *    an task request completes.
 
1269
 * @ihost: This parameter specifies the ISCI host object
 
1270
 * @ireq: This parameter is the completed isci_request object.
 
1271
 * @completion_status: This parameter specifies the completion status from the
 
1272
 *    sci core.
 
1273
 *
 
1274
 * none.
 
1275
 */
 
1276
void
 
1277
isci_task_request_complete(struct isci_host *ihost,
 
1278
                           struct isci_request *ireq,
 
1279
                           enum sci_task_status completion_status)
 
1280
{
 
1281
        struct isci_tmf *tmf = isci_request_access_tmf(ireq);
 
1282
        struct completion *tmf_complete = NULL;
 
1283
        struct completion *request_complete = ireq->io_request_completion;
 
1284
 
 
1285
        dev_dbg(&ihost->pdev->dev,
 
1286
                "%s: request = %p, status=%d\n",
 
1287
                __func__, ireq, completion_status);
 
1288
 
 
1289
        isci_request_change_state(ireq, completed);
 
1290
 
 
1291
        set_bit(IREQ_COMPLETE_IN_TARGET, &ireq->flags);
 
1292
 
 
1293
        if (tmf) {
 
1294
                tmf->status = completion_status;
 
1295
 
 
1296
                if (tmf->proto == SAS_PROTOCOL_SSP) {
 
1297
                        memcpy(&tmf->resp.resp_iu,
 
1298
                               &ireq->ssp.rsp,
 
1299
                               SSP_RESP_IU_MAX_SIZE);
 
1300
                } else if (tmf->proto == SAS_PROTOCOL_SATA) {
 
1301
                        memcpy(&tmf->resp.d2h_fis,
 
1302
                               &ireq->stp.rsp,
 
1303
                               sizeof(struct dev_to_host_fis));
 
1304
                }
 
1305
                /* PRINT_TMF( ((struct isci_tmf *)request->task)); */
 
1306
                tmf_complete = tmf->complete;
 
1307
        }
 
1308
        sci_controller_complete_io(ihost, ireq->target_device, ireq);
 
1309
        /* set the 'terminated' flag handle to make sure it cannot be terminated
 
1310
         *  or completed again.
 
1311
         */
 
1312
        set_bit(IREQ_TERMINATED, &ireq->flags);
 
1313
 
 
1314
        /* As soon as something is in the terminate path, deallocation is
 
1315
         * managed there.  Note that the final non-managed state of a task
 
1316
         * request is "completed".
 
1317
         */
 
1318
        if ((ireq->status == completed) ||
 
1319
            !isci_request_is_dealloc_managed(ireq->status)) {
 
1320
                isci_request_change_state(ireq, unallocated);
 
1321
                isci_free_tag(ihost, ireq->io_tag);
 
1322
                list_del_init(&ireq->dev_node);
 
1323
        }
 
1324
 
 
1325
        /* "request_complete" is set if the task was being terminated. */
 
1326
        if (request_complete)
 
1327
                complete(request_complete);
 
1328
 
 
1329
        /* The task management part completes last. */
 
1330
        if (tmf_complete)
 
1331
                complete(tmf_complete);
 
1332
}
 
1333
 
 
1334
static int isci_reset_device(struct isci_host *ihost,
 
1335
                             struct isci_remote_device *idev)
 
1336
{
 
1337
        struct sas_phy *phy = sas_find_local_phy(idev->domain_dev);
 
1338
        enum sci_status status;
 
1339
        unsigned long flags;
 
1340
        int rc;
 
1341
 
 
1342
        dev_dbg(&ihost->pdev->dev, "%s: idev %p\n", __func__, idev);
 
1343
 
 
1344
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
1345
        status = sci_remote_device_reset(idev);
 
1346
        if (status != SCI_SUCCESS) {
 
1347
                spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
1348
 
 
1349
                dev_dbg(&ihost->pdev->dev,
 
1350
                         "%s: sci_remote_device_reset(%p) returned %d!\n",
 
1351
                         __func__, idev, status);
 
1352
 
 
1353
                return TMF_RESP_FUNC_FAILED;
 
1354
        }
 
1355
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
1356
 
 
1357
        rc = sas_phy_reset(phy, true);
 
1358
 
 
1359
        /* Terminate in-progress I/O now. */
 
1360
        isci_remote_device_nuke_requests(ihost, idev);
 
1361
 
 
1362
        /* Since all pending TCs have been cleaned, resume the RNC. */
 
1363
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
1364
        status = sci_remote_device_reset_complete(idev);
 
1365
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
1366
 
 
1367
        if (status != SCI_SUCCESS) {
 
1368
                dev_dbg(&ihost->pdev->dev,
 
1369
                         "%s: sci_remote_device_reset_complete(%p) "
 
1370
                         "returned %d!\n", __func__, idev, status);
 
1371
        }
 
1372
 
 
1373
        dev_dbg(&ihost->pdev->dev, "%s: idev %p complete.\n", __func__, idev);
 
1374
 
 
1375
        return rc;
 
1376
}
 
1377
 
 
1378
int isci_task_I_T_nexus_reset(struct domain_device *dev)
 
1379
{
 
1380
        struct isci_host *ihost = dev_to_ihost(dev);
 
1381
        struct isci_remote_device *idev;
 
1382
        unsigned long flags;
 
1383
        int ret;
 
1384
 
 
1385
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
1386
        idev = isci_lookup_device(dev);
 
1387
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
1388
 
 
1389
        if (!idev || !test_bit(IDEV_EH, &idev->flags)) {
 
1390
                ret = TMF_RESP_FUNC_COMPLETE;
 
1391
                goto out;
 
1392
        }
 
1393
 
 
1394
        ret = isci_reset_device(ihost, idev);
 
1395
 out:
 
1396
        isci_put_device(idev);
 
1397
        return ret;
 
1398
}
 
1399
 
 
1400
int isci_bus_reset_handler(struct scsi_cmnd *cmd)
 
1401
{
 
1402
        struct domain_device *dev = sdev_to_domain_dev(cmd->device);
 
1403
        struct isci_host *ihost = dev_to_ihost(dev);
 
1404
        struct isci_remote_device *idev;
 
1405
        unsigned long flags;
 
1406
        int ret;
 
1407
 
 
1408
        spin_lock_irqsave(&ihost->scic_lock, flags);
 
1409
        idev = isci_lookup_device(dev);
 
1410
        spin_unlock_irqrestore(&ihost->scic_lock, flags);
 
1411
 
 
1412
        if (!idev) {
 
1413
                ret = TMF_RESP_FUNC_COMPLETE;
 
1414
                goto out;
 
1415
        }
 
1416
 
 
1417
        ret = isci_reset_device(ihost, idev);
 
1418
 out:
 
1419
        isci_put_device(idev);
 
1420
        return ret;
 
1421
}