Lines Matching +full:tcs +full:- +full:wait
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
68 * isci_task_refuse() - complete the request to the upper layer driver in
84 dev_dbg(&ihost->pdev->dev, "%s: task = %p, response=%d, status=%d\n", in isci_task_refuse()
87 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_refuse()
89 task->task_status.resp = response; in isci_task_refuse()
90 task->task_status.stat = status; in isci_task_refuse()
93 task->task_state_flags |= SAS_TASK_STATE_DONE; in isci_task_refuse()
94 task->task_state_flags &= ~(SAS_TASK_AT_INITIATOR | in isci_task_refuse()
96 task->lldd_task = NULL; in isci_task_refuse()
97 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_refuse()
99 task->task_done(task); in isci_task_refuse()
103 for (; num > 0; num--,\
104 task = list_entry(task->list.next, struct sas_task, list))
110 return idev ? test_bit(IDEV_IO_READY, &idev->flags) || in isci_device_io_ready()
111 (test_bit(IDEV_IO_NCQERROR, &idev->flags) && in isci_device_io_ready()
116 * isci_task_execute_task() - This function is one of the SAS Domain Template
126 struct isci_host *ihost = dev_to_ihost(task->dev); in isci_task_execute_task()
133 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_task()
134 idev = isci_lookup_device(task->dev); in isci_task_execute_task()
137 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_task()
139 dev_dbg(&ihost->pdev->dev, in isci_task_execute_task()
141 task, task->dev, idev, idev ? idev->flags : 0, in isci_task_execute_task()
142 task->uldd_task); in isci_task_execute_task()
155 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_execute_task()
157 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { in isci_task_execute_task()
159 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_execute_task()
165 task->task_state_flags |= SAS_TASK_AT_INITIATOR; in isci_task_execute_task()
166 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_execute_task()
172 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_execute_task()
174 task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in isci_task_execute_task()
175 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_execute_task()
177 if (test_bit(IDEV_GONE, &idev->flags)) { in isci_task_execute_task()
202 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_task()
207 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_task()
222 dev_dbg(&ihost->pdev->dev, in isci_task_request_build()
225 dev = idev->domain_dev; in isci_task_request_build()
237 dev_warn(&ihost->pdev->dev, in isci_task_request_build()
238 "%s: sci_task_request_construct failed - " in isci_task_request_build()
245 /* XXX convert to get this from task->tproto like other drivers */ in isci_task_request_build()
246 if (dev->dev_type == SAS_END_DEVICE) { in isci_task_request_build()
247 isci_tmf->proto = SAS_PROTOCOL_SSP; in isci_task_request_build()
268 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_tmf()
270 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
279 (!test_bit(IDEV_IO_READY, &idev->flags) && in isci_task_execute_tmf()
280 !test_bit(IDEV_IO_NCQERROR, &idev->flags))) { in isci_task_execute_tmf()
281 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
284 idev, idev ? idev->flags : 0); in isci_task_execute_tmf()
287 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
291 /* Assign the pointer to the TMF's completion kernel wait structure. */ in isci_task_execute_tmf()
292 tmf->complete = &completion; in isci_task_execute_tmf()
293 tmf->status = SCI_FAILURE_TIMEOUT; in isci_task_execute_tmf()
299 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_tmf()
305 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
306 "%s: start_io failed - status = 0x%x, request = %p\n", in isci_task_execute_tmf()
310 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
313 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
318 /* Wait for the TMF to complete, or a timeout. */ in isci_task_execute_tmf()
323 /* The TMF did not complete - this could be because in isci_task_execute_tmf()
331 if (tmf->status == SCI_SUCCESS) in isci_task_execute_tmf()
333 else if (tmf->status == SCI_FAILURE_IO_RESPONSE_VALID) { in isci_task_execute_tmf()
334 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
340 /* Else - leave the default "failed" status alone. */ in isci_task_execute_tmf()
342 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
350 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_tmf()
352 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
361 tmf->tmf_code = code; in isci_task_build_tmf()
369 tmf->io_tag = old_request->io_tag; in isci_task_build_abort_task_tmf()
373 * isci_task_send_lu_reset_sas() - This function is called by of the SAS Domain
387 dev_dbg(&isci_host->pdev->dev, in isci_task_send_lu_reset_sas()
392 * value is "TMF_RESP_FUNC_COMPLETE", or the request timed-out (or in isci_task_send_lu_reset_sas()
401 dev_dbg(&isci_host->pdev->dev, in isci_task_send_lu_reset_sas()
405 dev_dbg(&isci_host->pdev->dev, in isci_task_send_lu_reset_sas()
419 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_lu_reset()
420 idev = isci_get_device(dev->lldd_dev); in isci_task_lu_reset()
421 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_lu_reset()
423 dev_dbg(&ihost->pdev->dev, in isci_task_lu_reset()
429 dev_dbg(&ihost->pdev->dev, "%s: No dev\n", __func__); in isci_task_lu_reset()
435 /* Suspend the RNC, kill all TCs */ in isci_task_lu_reset()
443 if (!test_bit(IDEV_GONE, &idev->flags)) { in isci_task_lu_reset()
472 * isci_task_abort_task() - This function is one of the SAS Domain Template
480 struct isci_host *ihost = dev_to_ihost(task->dev); in isci_task_abort_task()
494 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_abort_task()
495 spin_lock(&task->task_state_lock); in isci_task_abort_task()
497 old_request = task->lldd_task; in isci_task_abort_task()
500 if (!(task->task_state_flags & SAS_TASK_STATE_DONE) && in isci_task_abort_task()
501 (task->task_state_flags & SAS_TASK_AT_INITIATOR) && in isci_task_abort_task()
503 idev = isci_get_device(task->dev->lldd_dev); in isci_task_abort_task()
505 &old_request->flags); in isci_task_abort_task()
507 spin_unlock(&task->task_state_lock); in isci_task_abort_task()
508 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_abort_task()
510 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
513 (dev_is_sata(task->dev) ? "STP/SATA" in isci_task_abort_task()
514 : ((dev_is_expander(task->dev->dev_type)) in isci_task_abort_task()
517 ((idev) ? ((test_bit(IDEV_GONE, &idev->flags)) in isci_task_abort_task()
533 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_abort_task()
534 task->task_state_flags |= SAS_TASK_STATE_DONE; in isci_task_abort_task()
535 task->task_state_flags &= ~(SAS_TASK_AT_INITIATOR | in isci_task_abort_task()
537 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_abort_task()
541 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
549 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
556 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_abort_task()
558 if (task->task_proto == SAS_PROTOCOL_SMP || in isci_task_abort_task()
559 sas_protocol_ata(task->task_proto) || in isci_task_abort_task()
561 test_bit(IDEV_GONE, &idev->flags)) { in isci_task_abort_task()
563 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_abort_task()
568 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
573 ((task->task_proto == SAS_PROTOCOL_SMP) in isci_task_abort_task()
575 : (sas_protocol_ata(task->task_proto) in isci_task_abort_task()
580 &old_request->flags), in isci_task_abort_task()
581 test_bit(IDEV_GONE, &idev->flags)); in isci_task_abort_task()
583 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_abort_task()
584 task->task_state_flags &= ~(SAS_TASK_AT_INITIATOR | in isci_task_abort_task()
586 task->task_state_flags |= SAS_TASK_STATE_DONE; in isci_task_abort_task()
587 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_abort_task()
595 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_abort_task()
603 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
611 * isci_task_abort_task_set() - This function is one of the SAS Domain Template
629 * isci_task_clear_aca() - This function is one of the SAS Domain Template
647 * isci_task_clear_task_set() - This function is one of the SAS Domain Template
664 * isci_task_query_task() - This function is implemented to cause libsas to
679 if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET) in isci_task_query_task()
686 * isci_task_request_complete() - This function is called by the sci core when
703 dev_dbg(&ihost->pdev->dev, in isci_task_request_complete()
707 set_bit(IREQ_COMPLETE_IN_TARGET, &ireq->flags); in isci_task_request_complete()
710 tmf->status = completion_status; in isci_task_request_complete()
712 if (tmf->proto == SAS_PROTOCOL_SSP) { in isci_task_request_complete()
713 memcpy(&tmf->resp.resp_iu, in isci_task_request_complete()
714 &ireq->ssp.rsp, in isci_task_request_complete()
716 } else if (tmf->proto == SAS_PROTOCOL_SATA) { in isci_task_request_complete()
717 memcpy(&tmf->resp.d2h_fis, in isci_task_request_complete()
718 &ireq->stp.rsp, in isci_task_request_complete()
721 /* PRINT_TMF( ((struct isci_tmf *)request->task)); */ in isci_task_request_complete()
722 tmf_complete = tmf->complete; in isci_task_request_complete()
724 sci_controller_complete_io(ihost, ireq->target_device, ireq); in isci_task_request_complete()
728 set_bit(IREQ_TERMINATED, &ireq->flags); in isci_task_request_complete()
730 if (test_and_clear_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags)) in isci_task_request_complete()
731 wake_up_all(&ihost->eventq); in isci_task_request_complete()
733 if (!test_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags)) in isci_task_request_complete()
734 isci_free_tag(ihost, ireq->io_tag); in isci_task_request_complete()
745 int rc = TMF_RESP_FUNC_COMPLETE, reset_stat = -1; in isci_reset_device()
747 struct isci_port *iport = dev->port->lldd_port; in isci_reset_device()
749 dev_dbg(&ihost->pdev->dev, "%s: idev %p\n", __func__, idev); in isci_reset_device()
751 /* Suspend the RNC, terminate all outstanding TCs. */ in isci_reset_device()
763 if (!test_bit(IDEV_GONE, &idev->flags)) { in isci_reset_device()
765 struct isci_phy *iphy = &ihost->phys[phy->number]; in isci_reset_device()
775 dev_dbg(&ihost->pdev->dev, "%s: idev %p complete, reset_stat=%d.\n", in isci_reset_device()
789 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_I_T_nexus_reset()
790 idev = isci_get_device(dev->lldd_dev); in isci_task_I_T_nexus_reset()
791 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_I_T_nexus_reset()
797 ret = -ENODEV; in isci_task_I_T_nexus_reset()