linux/drivers/scsi/aic94xx/aic94xx_tmf.c
<<
>>
Prefs
   1/*
   2 * Aic94xx Task Management Functions
   3 *
   4 * Copyright (C) 2005 Adaptec, Inc.  All rights reserved.
   5 * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
   6 *
   7 * This file is licensed under GPLv2.
   8 *
   9 * This file is part of the aic94xx driver.
  10 *
  11 * The aic94xx driver is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU General Public License as
  13 * published by the Free Software Foundation; version 2 of the
  14 * License.
  15 *
  16 * The aic94xx driver is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19 * General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with the aic94xx driver; if not, write to the Free Software
  23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  24 *
  25 */
  26
  27#include <linux/spinlock.h>
  28#include <linux/gfp.h>
  29#include "aic94xx.h"
  30#include "aic94xx_sas.h"
  31#include "aic94xx_hwi.h"
  32
  33/* ---------- Internal enqueue ---------- */
  34
  35static int asd_enqueue_internal(struct asd_ascb *ascb,
  36                void (*tasklet_complete)(struct asd_ascb *,
  37                                         struct done_list_struct *),
  38                                void (*timed_out)(unsigned long))
  39{
  40        int res;
  41
  42        ascb->tasklet_complete = tasklet_complete;
  43        ascb->uldd_timer = 1;
  44
  45        ascb->timer.data = (unsigned long) ascb;
  46        ascb->timer.function = timed_out;
  47        ascb->timer.expires = jiffies + AIC94XX_SCB_TIMEOUT;
  48
  49        add_timer(&ascb->timer);
  50
  51        res = asd_post_ascb_list(ascb->ha, ascb, 1);
  52        if (unlikely(res))
  53                del_timer(&ascb->timer);
  54        return res;
  55}
  56
  57/* ---------- CLEAR NEXUS ---------- */
  58
  59struct tasklet_completion_status {
  60        int     dl_opcode;
  61        int     tmf_state;
  62        u8      tag_valid:1;
  63        __be16  tag;
  64};
  65
  66#define DECLARE_TCS(tcs) \
  67        struct tasklet_completion_status tcs = { \
  68                .dl_opcode = 0, \
  69                .tmf_state = 0, \
  70                .tag_valid = 0, \
  71                .tag = 0, \
  72        }
  73
  74
  75static void asd_clear_nexus_tasklet_complete(struct asd_ascb *ascb,
  76                                             struct done_list_struct *dl)
  77{
  78        struct tasklet_completion_status *tcs = ascb->uldd_task;
  79        ASD_DPRINTK("%s: here\n", __func__);
  80        if (!del_timer(&ascb->timer)) {
  81                ASD_DPRINTK("%s: couldn't delete timer\n", __func__);
  82                return;
  83        }
  84        ASD_DPRINTK("%s: opcode: 0x%x\n", __func__, dl->opcode);
  85        tcs->dl_opcode = dl->opcode;
  86        complete(ascb->completion);
  87        asd_ascb_free(ascb);
  88}
  89
  90static void asd_clear_nexus_timedout(unsigned long data)
  91{
  92        struct asd_ascb *ascb = (void *)data;
  93        struct tasklet_completion_status *tcs = ascb->uldd_task;
  94
  95        ASD_DPRINTK("%s: here\n", __func__);
  96        tcs->dl_opcode = TMF_RESP_FUNC_FAILED;
  97        complete(ascb->completion);
  98}
  99
 100#define CLEAR_NEXUS_PRE         \
 101        struct asd_ascb *ascb; \
 102        struct scb *scb; \
 103        int res; \
 104        DECLARE_COMPLETION_ONSTACK(completion); \
 105        DECLARE_TCS(tcs); \
 106                \
 107        ASD_DPRINTK("%s: PRE\n", __func__); \
 108        res = 1;                \
 109        ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); \
 110        if (!ascb)              \
 111                return -ENOMEM; \
 112                                \
 113        ascb->completion = &completion; \
 114        ascb->uldd_task = &tcs; \
 115        scb = ascb->scb;        \
 116        scb->header.opcode = CLEAR_NEXUS
 117
 118#define CLEAR_NEXUS_POST        \
 119        ASD_DPRINTK("%s: POST\n", __func__); \
 120        res = asd_enqueue_internal(ascb, asd_clear_nexus_tasklet_complete, \
 121                                   asd_clear_nexus_timedout);              \
 122        if (res)                \
 123                goto out_err;   \
 124        ASD_DPRINTK("%s: clear nexus posted, waiting...\n", __func__); \
 125        wait_for_completion(&completion); \
 126        res = tcs.dl_opcode; \
 127        if (res == TC_NO_ERROR) \
 128                res = TMF_RESP_FUNC_COMPLETE;   \
 129        return res; \
 130out_err:                        \
 131        asd_ascb_free(ascb);    \
 132        return res
 133
 134int asd_clear_nexus_ha(struct sas_ha_struct *sas_ha)
 135{
 136        struct asd_ha_struct *asd_ha = sas_ha->lldd_ha;
 137
 138        CLEAR_NEXUS_PRE;
 139        scb->clear_nexus.nexus = NEXUS_ADAPTER;
 140        CLEAR_NEXUS_POST;
 141}
 142
 143int asd_clear_nexus_port(struct asd_sas_port *port)
 144{
 145        struct asd_ha_struct *asd_ha = port->ha->lldd_ha;
 146
 147        CLEAR_NEXUS_PRE;
 148        scb->clear_nexus.nexus = NEXUS_PORT;
 149        scb->clear_nexus.conn_mask = port->phy_mask;
 150        CLEAR_NEXUS_POST;
 151}
 152
 153enum clear_nexus_phase {
 154        NEXUS_PHASE_PRE,
 155        NEXUS_PHASE_POST,
 156        NEXUS_PHASE_RESUME,
 157};
 158
 159static int asd_clear_nexus_I_T(struct domain_device *dev,
 160                               enum clear_nexus_phase phase)
 161{
 162        struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
 163
 164        CLEAR_NEXUS_PRE;
 165        scb->clear_nexus.nexus = NEXUS_I_T;
 166        switch (phase) {
 167        case NEXUS_PHASE_PRE:
 168                scb->clear_nexus.flags = EXEC_Q | SUSPEND_TX;
 169                break;
 170        case NEXUS_PHASE_POST:
 171                scb->clear_nexus.flags = SEND_Q | NOTINQ;
 172                break;
 173        case NEXUS_PHASE_RESUME:
 174                scb->clear_nexus.flags = RESUME_TX;
 175        }
 176        scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
 177                                                   dev->lldd_dev);
 178        CLEAR_NEXUS_POST;
 179}
 180
 181int asd_I_T_nexus_reset(struct domain_device *dev)
 182{
 183        int res, tmp_res, i;
 184        struct sas_phy *phy = sas_get_local_phy(dev);
 185        /* Standard mandates link reset for ATA  (type 0) and
 186         * hard reset for SSP (type 1) */
 187        int reset_type = (dev->dev_type == SAS_SATA_DEV ||
 188                          (dev->tproto & SAS_PROTOCOL_STP)) ? 0 : 1;
 189
 190        asd_clear_nexus_I_T(dev, NEXUS_PHASE_PRE);
 191        /* send a hard reset */
 192        ASD_DPRINTK("sending %s reset to %s\n",
 193                    reset_type ? "hard" : "soft", dev_name(&phy->dev));
 194        res = sas_phy_reset(phy, reset_type);
 195        if (res == TMF_RESP_FUNC_COMPLETE || res == -ENODEV) {
 196                /* wait for the maximum settle time */
 197                msleep(500);
 198                /* clear all outstanding commands (keep nexus suspended) */
 199                asd_clear_nexus_I_T(dev, NEXUS_PHASE_POST);
 200        }
 201        for (i = 0 ; i < 3; i++) {
 202                tmp_res = asd_clear_nexus_I_T(dev, NEXUS_PHASE_RESUME);
 203                if (tmp_res == TC_RESUME)
 204                        goto out;
 205                msleep(500);
 206        }
 207
 208        /* This is a bit of a problem:  the sequencer is still suspended
 209         * and is refusing to resume.  Hope it will resume on a bigger hammer
 210         * or the disk is lost */
 211        dev_printk(KERN_ERR, &phy->dev,
 212                   "Failed to resume nexus after reset 0x%x\n", tmp_res);
 213
 214        res = TMF_RESP_FUNC_FAILED;
 215 out:
 216        sas_put_local_phy(phy);
 217        return res;
 218}
 219
 220static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun)
 221{
 222        struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
 223
 224        CLEAR_NEXUS_PRE;
 225        scb->clear_nexus.nexus = NEXUS_I_T_L;
 226        scb->clear_nexus.flags = SEND_Q | EXEC_Q | NOTINQ;
 227        memcpy(scb->clear_nexus.ssp_task.lun, lun, 8);
 228        scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
 229                                                   dev->lldd_dev);
 230        CLEAR_NEXUS_POST;
 231}
 232
 233static int asd_clear_nexus_tag(struct sas_task *task)
 234{
 235        struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
 236        struct asd_ascb *tascb = task->lldd_task;
 237
 238        CLEAR_NEXUS_PRE;
 239        scb->clear_nexus.nexus = NEXUS_TAG;
 240        memcpy(scb->clear_nexus.ssp_task.lun, task->ssp_task.LUN, 8);
 241        scb->clear_nexus.ssp_task.tag = tascb->tag;
 242        if (task->dev->tproto)
 243                scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
 244                                                          task->dev->lldd_dev);
 245        CLEAR_NEXUS_POST;
 246}
 247
 248static int asd_clear_nexus_index(struct sas_task *task)
 249{
 250        struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
 251        struct asd_ascb *tascb = task->lldd_task;
 252
 253        CLEAR_NEXUS_PRE;
 254        scb->clear_nexus.nexus = NEXUS_TRANS_CX;
 255        if (task->dev->tproto)
 256                scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long)
 257                                                          task->dev->lldd_dev);
 258        scb->clear_nexus.index = cpu_to_le16(tascb->tc_index);
 259        CLEAR_NEXUS_POST;
 260}
 261
 262/* ---------- TMFs ---------- */
 263
 264static void asd_tmf_timedout(unsigned long data)
 265{
 266        struct asd_ascb *ascb = (void *) data;
 267        struct tasklet_completion_status *tcs = ascb->uldd_task;
 268
 269        ASD_DPRINTK("tmf timed out\n");
 270        tcs->tmf_state = TMF_RESP_FUNC_FAILED;
 271        complete(ascb->completion);
 272}
 273
 274static int asd_get_tmf_resp_tasklet(struct asd_ascb *ascb,
 275                                    struct done_list_struct *dl)
 276{
 277        struct asd_ha_struct *asd_ha = ascb->ha;
 278        unsigned long flags;
 279        struct tc_resp_sb_struct {
 280                __le16 index_escb;
 281                u8     len_lsb;
 282                u8     flags;
 283        } __attribute__ ((packed)) *resp_sb = (void *) dl->status_block;
 284
 285        int  edb_id = ((resp_sb->flags & 0x70) >> 4)-1;
 286        struct asd_ascb *escb;
 287        struct asd_dma_tok *edb;
 288        struct ssp_frame_hdr *fh;
 289        struct ssp_response_iu   *ru;
 290        int res = TMF_RESP_FUNC_FAILED;
 291
 292        ASD_DPRINTK("tmf resp tasklet\n");
 293
 294        spin_lock_irqsave(&asd_ha->seq.tc_index_lock, flags);
 295        escb = asd_tc_index_find(&asd_ha->seq,
 296                                 (int)le16_to_cpu(resp_sb->index_escb));
 297        spin_unlock_irqrestore(&asd_ha->seq.tc_index_lock, flags);
 298
 299        if (!escb) {
 300                ASD_DPRINTK("Uh-oh! No escb for this dl?!\n");
 301                return res;
 302        }
 303
 304        edb = asd_ha->seq.edb_arr[edb_id + escb->edb_index];
 305        ascb->tag = *(__be16 *)(edb->vaddr+4);
 306        fh = edb->vaddr + 16;
 307        ru = edb->vaddr + 16 + sizeof(*fh);
 308        res = ru->status;
 309        if (ru->datapres == 1)    /* Response data present */
 310                res = ru->resp_data[3];
 311#if 0
 312        ascb->tag = fh->tag;
 313#endif
 314        ascb->tag_valid = 1;
 315
 316        asd_invalidate_edb(escb, edb_id);
 317        return res;
 318}
 319
 320static void asd_tmf_tasklet_complete(struct asd_ascb *ascb,
 321                                     struct done_list_struct *dl)
 322{
 323        struct tasklet_completion_status *tcs;
 324
 325        if (!del_timer(&ascb->timer))
 326                return;
 327
 328        tcs = ascb->uldd_task;
 329        ASD_DPRINTK("tmf tasklet complete\n");
 330
 331        tcs->dl_opcode = dl->opcode;
 332
 333        if (dl->opcode == TC_SSP_RESP) {
 334                tcs->tmf_state = asd_get_tmf_resp_tasklet(ascb, dl);
 335                tcs->tag_valid = ascb->tag_valid;
 336                tcs->tag = ascb->tag;
 337        }
 338
 339        complete(ascb->completion);
 340        asd_ascb_free(ascb);
 341}
 342
 343static int asd_clear_nexus(struct sas_task *task)
 344{
 345        int res = TMF_RESP_FUNC_FAILED;
 346        int leftover;
 347        struct asd_ascb *tascb = task->lldd_task;
 348        DECLARE_COMPLETION_ONSTACK(completion);
 349        unsigned long flags;
 350
 351        tascb->completion = &completion;
 352
 353        ASD_DPRINTK("task not done, clearing nexus\n");
 354        if (tascb->tag_valid)
 355                res = asd_clear_nexus_tag(task);
 356        else
 357                res = asd_clear_nexus_index(task);
 358        leftover = wait_for_completion_timeout(&completion,
 359                                               AIC94XX_SCB_TIMEOUT);
 360        tascb->completion = NULL;
 361        ASD_DPRINTK("came back from clear nexus\n");
 362        spin_lock_irqsave(&task->task_state_lock, flags);
 363        if (leftover < 1)
 364                res = TMF_RESP_FUNC_FAILED;
 365        if (task->task_state_flags & SAS_TASK_STATE_DONE)
 366                res = TMF_RESP_FUNC_COMPLETE;
 367        spin_unlock_irqrestore(&task->task_state_lock, flags);
 368
 369        return res;
 370}
 371
 372/**
 373 * asd_abort_task -- ABORT TASK TMF
 374 * @task: the task to be aborted
 375 *
 376 * Before calling ABORT TASK the task state flags should be ORed with
 377 * SAS_TASK_STATE_ABORTED (unless SAS_TASK_STATE_DONE is set) under
 378 * the task_state_lock IRQ spinlock, then ABORT TASK *must* be called.
 379 *
 380 * Implements the ABORT TASK TMF, I_T_L_Q nexus.
 381 * Returns: SAS TMF responses (see sas_task.h),
 382 *          -ENOMEM,
 383 *          -SAS_QUEUE_FULL.
 384 *
 385 * When ABORT TASK returns, the caller of ABORT TASK checks first the
 386 * task->task_state_flags, and then the return value of ABORT TASK.
 387 *
 388 * If the task has task state bit SAS_TASK_STATE_DONE set, then the
 389 * task was completed successfully prior to it being aborted.  The
 390 * caller of ABORT TASK has responsibility to call task->task_done()
 391 * xor free the task, depending on their framework.  The return code
 392 * is TMF_RESP_FUNC_FAILED in this case.
 393 *
 394 * Else the SAS_TASK_STATE_DONE bit is not set,
 395 *      If the return code is TMF_RESP_FUNC_COMPLETE, then
 396 *              the task was aborted successfully.  The caller of
 397 *              ABORT TASK has responsibility to call task->task_done()
 398 *              to finish the task, xor free the task depending on their
 399 *              framework.
 400 *      else
 401 *              the ABORT TASK returned some kind of error. The task
 402 *              was _not_ cancelled.  Nothing can be assumed.
 403 *              The caller of ABORT TASK may wish to retry.
 404 */
 405int asd_abort_task(struct sas_task *task)
 406{
 407        struct asd_ascb *tascb = task->lldd_task;
 408        struct asd_ha_struct *asd_ha = tascb->ha;
 409        int res = 1;
 410        unsigned long flags;
 411        struct asd_ascb *ascb = NULL;
 412        struct scb *scb;
 413        int leftover;
 414        DECLARE_TCS(tcs);
 415        DECLARE_COMPLETION_ONSTACK(completion);
 416        DECLARE_COMPLETION_ONSTACK(tascb_completion);
 417
 418        tascb->completion = &tascb_completion;
 419
 420        spin_lock_irqsave(&task->task_state_lock, flags);
 421        if (task->task_state_flags & SAS_TASK_STATE_DONE) {
 422                spin_unlock_irqrestore(&task->task_state_lock, flags);
 423                res = TMF_RESP_FUNC_COMPLETE;
 424                ASD_DPRINTK("%s: task 0x%p done\n", __func__, task);
 425                goto out_done;
 426        }
 427        spin_unlock_irqrestore(&task->task_state_lock, flags);
 428
 429        ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL);
 430        if (!ascb)
 431                return -ENOMEM;
 432
 433        ascb->uldd_task = &tcs;
 434        ascb->completion = &completion;
 435        scb = ascb->scb;
 436        scb->header.opcode = SCB_ABORT_TASK;
 437
 438        switch (task->task_proto) {
 439        case SAS_PROTOCOL_SATA:
 440        case SAS_PROTOCOL_STP:
 441                scb->abort_task.proto_conn_rate = (1 << 5); /* STP */
 442                break;
 443        case SAS_PROTOCOL_SSP:
 444                scb->abort_task.proto_conn_rate  = (1 << 4); /* SSP */
 445                scb->abort_task.proto_conn_rate |= task->dev->linkrate;
 446                break;
 447        case SAS_PROTOCOL_SMP:
 448                break;
 449        default:
 450                break;
 451        }
 452
 453        if (task->task_proto == SAS_PROTOCOL_SSP) {
 454                scb->abort_task.ssp_frame.frame_type = SSP_TASK;
 455                memcpy(scb->abort_task.ssp_frame.hashed_dest_addr,
 456                       task->dev->hashed_sas_addr, HASHED_SAS_ADDR_SIZE);
 457                memcpy(scb->abort_task.ssp_frame.hashed_src_addr,
 458                       task->dev->port->ha->hashed_sas_addr,
 459                       HASHED_SAS_ADDR_SIZE);
 460                scb->abort_task.ssp_frame.tptt = cpu_to_be16(0xFFFF);
 461
 462                memcpy(scb->abort_task.ssp_task.lun, task->ssp_task.LUN, 8);
 463                scb->abort_task.ssp_task.tmf = TMF_ABORT_TASK;
 464                scb->abort_task.ssp_task.tag = cpu_to_be16(0xFFFF);
 465        }
 466
 467        scb->abort_task.sister_scb = cpu_to_le16(0xFFFF);
 468        scb->abort_task.conn_handle = cpu_to_le16(
 469                (u16)(unsigned long)task->dev->lldd_dev);
 470        scb->abort_task.retry_count = 1;
 471        scb->abort_task.index = cpu_to_le16((u16)tascb->tc_index);
 472        scb->abort_task.itnl_to = cpu_to_le16(ITNL_TIMEOUT_CONST);
 473
 474        res = asd_enqueue_internal(ascb, asd_tmf_tasklet_complete,
 475                                   asd_tmf_timedout);
 476        if (res)
 477                goto out_free;
 478        wait_for_completion(&completion);
 479        ASD_DPRINTK("tmf came back\n");
 480
 481        tascb->tag = tcs.tag;
 482        tascb->tag_valid = tcs.tag_valid;
 483
 484        spin_lock_irqsave(&task->task_state_lock, flags);
 485        if (task->task_state_flags & SAS_TASK_STATE_DONE) {
 486                spin_unlock_irqrestore(&task->task_state_lock, flags);
 487                res = TMF_RESP_FUNC_COMPLETE;
 488                ASD_DPRINTK("%s: task 0x%p done\n", __func__, task);
 489                goto out_done;
 490        }
 491        spin_unlock_irqrestore(&task->task_state_lock, flags);
 492
 493        if (tcs.dl_opcode == TC_SSP_RESP) {
 494                /* The task to be aborted has been sent to the device.
 495                 * We got a Response IU for the ABORT TASK TMF. */
 496                if (tcs.tmf_state == TMF_RESP_FUNC_COMPLETE)
 497                        res = asd_clear_nexus(task);
 498                else
 499                        res = tcs.tmf_state;
 500        } else if (tcs.dl_opcode == TC_NO_ERROR &&
 501                   tcs.tmf_state == TMF_RESP_FUNC_FAILED) {
 502                /* timeout */
 503                res = TMF_RESP_FUNC_FAILED;
 504        } else {
 505                /* In the following we assume that the managing layer
 506                 * will _never_ make a mistake, when issuing ABORT
 507                 * TASK.
 508                 */
 509                switch (tcs.dl_opcode) {
 510                default:
 511                        res = asd_clear_nexus(task);
 512                        /* fallthrough */
 513                case TC_NO_ERROR:
 514                        break;
 515                        /* The task hasn't been sent to the device xor
 516                         * we never got a (sane) Response IU for the
 517                         * ABORT TASK TMF.
 518                         */
 519                case TF_NAK_RECV:
 520                        res = TMF_RESP_INVALID_FRAME;
 521                        break;
 522                case TF_TMF_TASK_DONE:  /* done but not reported yet */
 523                        res = TMF_RESP_FUNC_FAILED;
 524                        leftover =
 525                                wait_for_completion_timeout(&tascb_completion,
 526                                                          AIC94XX_SCB_TIMEOUT);
 527                        spin_lock_irqsave(&task->task_state_lock, flags);
 528                        if (leftover < 1)
 529                                res = TMF_RESP_FUNC_FAILED;
 530                        if (task->task_state_flags & SAS_TASK_STATE_DONE)
 531                                res = TMF_RESP_FUNC_COMPLETE;
 532                        spin_unlock_irqrestore(&task->task_state_lock, flags);
 533                        break;
 534                case TF_TMF_NO_TAG:
 535                case TF_TMF_TAG_FREE: /* the tag is in the free list */
 536                case TF_TMF_NO_CONN_HANDLE: /* no such device */
 537                        res = TMF_RESP_FUNC_COMPLETE;
 538                        break;
 539                case TF_TMF_NO_CTX: /* not in seq, or proto != SSP */
 540                        res = TMF_RESP_FUNC_ESUPP;
 541                        break;
 542                }
 543        }
 544 out_done:
 545        tascb->completion = NULL;
 546        if (res == TMF_RESP_FUNC_COMPLETE) {
 547                task->lldd_task = NULL;
 548                mb();
 549                asd_ascb_free(tascb);
 550        }
 551        ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res);
 552        return res;
 553
 554 out_free:
 555        asd_ascb_free(ascb);
 556        ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res);
 557        return res;
 558}
 559
 560/**
 561 * asd_initiate_ssp_tmf -- send a TMF to an I_T_L or I_T_L_Q nexus
 562 * @dev: pointer to struct domain_device of interest
 563 * @lun: pointer to u8[8] which is the LUN
 564 * @tmf: the TMF to be performed (see sas_task.h or the SAS spec)
 565 * @index: the transaction context of the task to be queried if QT TMF
 566 *
 567 * This function is used to send ABORT TASK SET, CLEAR ACA,
 568 * CLEAR TASK SET, LU RESET and QUERY TASK TMFs.
 569 *
 570 * No SCBs should be queued to the I_T_L nexus when this SCB is
 571 * pending.
 572 *
 573 * Returns: TMF response code (see sas_task.h or the SAS spec)
 574 */
 575static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun,
 576                                int tmf, int index)
 577{
 578        struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
 579        struct asd_ascb *ascb;
 580        int res = 1;
 581        struct scb *scb;
 582        DECLARE_COMPLETION_ONSTACK(completion);
 583        DECLARE_TCS(tcs);
 584
 585        if (!(dev->tproto & SAS_PROTOCOL_SSP))
 586                return TMF_RESP_FUNC_ESUPP;
 587
 588        ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL);
 589        if (!ascb)
 590                return -ENOMEM;
 591
 592        ascb->completion = &completion;
 593        ascb->uldd_task = &tcs;
 594        scb = ascb->scb;
 595
 596        if (tmf == TMF_QUERY_TASK)
 597                scb->header.opcode = QUERY_SSP_TASK;
 598        else
 599                scb->header.opcode = INITIATE_SSP_TMF;
 600
 601        scb->ssp_tmf.proto_conn_rate  = (1 << 4); /* SSP */
 602        scb->ssp_tmf.proto_conn_rate |= dev->linkrate;
 603        /* SSP frame header */
 604        scb->ssp_tmf.ssp_frame.frame_type = SSP_TASK;
 605        memcpy(scb->ssp_tmf.ssp_frame.hashed_dest_addr,
 606               dev->hashed_sas_addr, HASHED_SAS_ADDR_SIZE);
 607        memcpy(scb->ssp_tmf.ssp_frame.hashed_src_addr,
 608               dev->port->ha->hashed_sas_addr, HASHED_SAS_ADDR_SIZE);
 609        scb->ssp_tmf.ssp_frame.tptt = cpu_to_be16(0xFFFF);
 610        /* SSP Task IU */
 611        memcpy(scb->ssp_tmf.ssp_task.lun, lun, 8);
 612        scb->ssp_tmf.ssp_task.tmf = tmf;
 613
 614        scb->ssp_tmf.sister_scb = cpu_to_le16(0xFFFF);
 615        scb->ssp_tmf.conn_handle= cpu_to_le16((u16)(unsigned long)
 616                                              dev->lldd_dev);
 617        scb->ssp_tmf.retry_count = 1;
 618        scb->ssp_tmf.itnl_to = cpu_to_le16(ITNL_TIMEOUT_CONST);
 619        if (tmf == TMF_QUERY_TASK)
 620                scb->ssp_tmf.index = cpu_to_le16(index);
 621
 622        res = asd_enqueue_internal(ascb, asd_tmf_tasklet_complete,
 623                                   asd_tmf_timedout);
 624        if (res)
 625                goto out_err;
 626        wait_for_completion(&completion);
 627
 628        switch (tcs.dl_opcode) {
 629        case TC_NO_ERROR:
 630                res = TMF_RESP_FUNC_COMPLETE;
 631                break;
 632        case TF_NAK_RECV:
 633                res = TMF_RESP_INVALID_FRAME;
 634                break;
 635        case TF_TMF_TASK_DONE:
 636                res = TMF_RESP_FUNC_FAILED;
 637                break;
 638        case TF_TMF_NO_TAG:
 639        case TF_TMF_TAG_FREE: /* the tag is in the free list */
 640        case TF_TMF_NO_CONN_HANDLE: /* no such device */
 641                res = TMF_RESP_FUNC_COMPLETE;
 642                break;
 643        case TF_TMF_NO_CTX: /* not in seq, or proto != SSP */
 644                res = TMF_RESP_FUNC_ESUPP;
 645                break;
 646        default:
 647                /* Allow TMF response codes to propagate upwards */
 648                res = tcs.dl_opcode;
 649                break;
 650        }
 651        return res;
 652out_err:
 653        asd_ascb_free(ascb);
 654        return res;
 655}
 656
 657int asd_abort_task_set(struct domain_device *dev, u8 *lun)
 658{
 659        int res = asd_initiate_ssp_tmf(dev, lun, TMF_ABORT_TASK_SET, 0);
 660
 661        if (res == TMF_RESP_FUNC_COMPLETE)
 662                asd_clear_nexus_I_T_L(dev, lun);
 663        return res;
 664}
 665
 666int asd_clear_aca(struct domain_device *dev, u8 *lun)
 667{
 668        int res = asd_initiate_ssp_tmf(dev, lun, TMF_CLEAR_ACA, 0);
 669
 670        if (res == TMF_RESP_FUNC_COMPLETE)
 671                asd_clear_nexus_I_T_L(dev, lun);
 672        return res;
 673}
 674
 675int asd_clear_task_set(struct domain_device *dev, u8 *lun)
 676{
 677        int res = asd_initiate_ssp_tmf(dev, lun, TMF_CLEAR_TASK_SET, 0);
 678
 679        if (res == TMF_RESP_FUNC_COMPLETE)
 680                asd_clear_nexus_I_T_L(dev, lun);
 681        return res;
 682}
 683
 684int asd_lu_reset(struct domain_device *dev, u8 *lun)
 685{
 686        int res = asd_initiate_ssp_tmf(dev, lun, TMF_LU_RESET, 0);
 687
 688        if (res == TMF_RESP_FUNC_COMPLETE)
 689                asd_clear_nexus_I_T_L(dev, lun);
 690        return res;
 691}
 692
 693/**
 694 * asd_query_task -- send a QUERY TASK TMF to an I_T_L_Q nexus
 695 * task: pointer to sas_task struct of interest
 696 *
 697 * Returns: TMF_RESP_FUNC_COMPLETE if the task is not in the task set,
 698 * or TMF_RESP_FUNC_SUCC if the task is in the task set.
 699 *
 700 * Normally the management layer sets the task to aborted state,
 701 * and then calls query task and then abort task.
 702 */
 703int asd_query_task(struct sas_task *task)
 704{
 705        struct asd_ascb *ascb = task->lldd_task;
 706        int index;
 707
 708        if (ascb) {
 709                index = ascb->tc_index;
 710                return asd_initiate_ssp_tmf(task->dev, task->ssp_task.LUN,
 711                                            TMF_QUERY_TASK, index);
 712        }
 713        return TMF_RESP_FUNC_COMPLETE;
 714}
 715