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