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_STATE_PENDING; in isci_task_refuse()
95 task->lldd_task = NULL; in isci_task_refuse()
96 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_refuse()
98 task->task_done(task); in isci_task_refuse()
102 for (; num > 0; num--,\
103 task = list_entry(task->list.next, struct sas_task, list))
109 return idev ? test_bit(IDEV_IO_READY, &idev->flags) || in isci_device_io_ready()
110 (test_bit(IDEV_IO_NCQERROR, &idev->flags) && in isci_device_io_ready()
115 * isci_task_execute_task() - This function is one of the SAS Domain Template
125 struct isci_host *ihost = dev_to_ihost(task->dev); in isci_task_execute_task()
132 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_task()
133 idev = isci_lookup_device(task->dev); in isci_task_execute_task()
136 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_task()
138 dev_dbg(&ihost->pdev->dev, in isci_task_execute_task()
140 task, task->dev, idev, idev ? idev->flags : 0, in isci_task_execute_task()
141 task->uldd_task); in isci_task_execute_task()
154 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_execute_task()
156 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { in isci_task_execute_task()
158 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_execute_task()
168 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_execute_task()
175 if (test_bit(IDEV_GONE, &idev->flags)) { in isci_task_execute_task()
200 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_task()
205 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_task()
220 dev_dbg(&ihost->pdev->dev, in isci_task_request_build()
223 dev = idev->domain_dev; in isci_task_request_build()
235 dev_warn(&ihost->pdev->dev, in isci_task_request_build()
236 "%s: sci_task_request_construct failed - " in isci_task_request_build()
243 /* XXX convert to get this from task->tproto like other drivers */ in isci_task_request_build()
244 if (dev->dev_type == SAS_END_DEVICE) { in isci_task_request_build()
245 isci_tmf->proto = SAS_PROTOCOL_SSP; in isci_task_request_build()
264 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_tmf()
266 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
275 (!test_bit(IDEV_IO_READY, &idev->flags) && in isci_task_execute_tmf()
276 !test_bit(IDEV_IO_NCQERROR, &idev->flags))) { in isci_task_execute_tmf()
277 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
280 idev, idev ? idev->flags : 0); in isci_task_execute_tmf()
283 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
287 /* Assign the pointer to the TMF's completion kernel wait structure. */ in isci_task_execute_tmf()
288 tmf->complete = &completion; in isci_task_execute_tmf()
289 tmf->status = SCI_FAILURE_TIMEOUT; in isci_task_execute_tmf()
295 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_tmf()
301 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
302 "%s: start_io failed - status = 0x%x, request = %p\n", in isci_task_execute_tmf()
306 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
309 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
314 /* Wait for the TMF to complete, or a timeout. */ in isci_task_execute_tmf()
319 /* The TMF did not complete - this could be because in isci_task_execute_tmf()
327 if (tmf->status == SCI_SUCCESS) in isci_task_execute_tmf()
329 else if (tmf->status == SCI_FAILURE_IO_RESPONSE_VALID) { in isci_task_execute_tmf()
330 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
336 /* Else - leave the default "failed" status alone. */ in isci_task_execute_tmf()
338 dev_dbg(&ihost->pdev->dev, in isci_task_execute_tmf()
346 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_execute_tmf()
348 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_execute_tmf()
357 tmf->tmf_code = code; in isci_task_build_tmf()
365 tmf->io_tag = old_request->io_tag; in isci_task_build_abort_task_tmf()
369 * isci_task_send_lu_reset_sas() - This function is called by of the SAS Domain
383 dev_dbg(&isci_host->pdev->dev, in isci_task_send_lu_reset_sas()
388 * value is "TMF_RESP_FUNC_COMPLETE", or the request timed-out (or in isci_task_send_lu_reset_sas()
397 dev_dbg(&isci_host->pdev->dev, in isci_task_send_lu_reset_sas()
401 dev_dbg(&isci_host->pdev->dev, in isci_task_send_lu_reset_sas()
415 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_lu_reset()
416 idev = isci_get_device(dev->lldd_dev); in isci_task_lu_reset()
417 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_lu_reset()
419 dev_dbg(&ihost->pdev->dev, in isci_task_lu_reset()
425 dev_dbg(&ihost->pdev->dev, "%s: No dev\n", __func__); in isci_task_lu_reset()
431 /* Suspend the RNC, kill all TCs */ in isci_task_lu_reset()
439 if (!test_bit(IDEV_GONE, &idev->flags)) { in isci_task_lu_reset()
468 * isci_task_abort_task() - This function is one of the SAS Domain Template
476 struct isci_host *ihost = dev_to_ihost(task->dev); in isci_task_abort_task()
490 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_abort_task()
491 spin_lock(&task->task_state_lock); in isci_task_abort_task()
493 old_request = task->lldd_task; in isci_task_abort_task()
496 if (!(task->task_state_flags & SAS_TASK_STATE_DONE) && in isci_task_abort_task()
498 idev = isci_get_device(task->dev->lldd_dev); in isci_task_abort_task()
500 &old_request->flags); in isci_task_abort_task()
502 spin_unlock(&task->task_state_lock); in isci_task_abort_task()
503 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_abort_task()
505 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
508 (dev_is_sata(task->dev) ? "STP/SATA" in isci_task_abort_task()
509 : ((dev_is_expander(task->dev->dev_type)) in isci_task_abort_task()
512 ((idev) ? ((test_bit(IDEV_GONE, &idev->flags)) in isci_task_abort_task()
528 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_abort_task()
529 task->task_state_flags |= SAS_TASK_STATE_DONE; in isci_task_abort_task()
530 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in isci_task_abort_task()
531 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_abort_task()
535 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
543 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
550 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_abort_task()
552 if (task->task_proto == SAS_PROTOCOL_SMP || in isci_task_abort_task()
553 sas_protocol_ata(task->task_proto) || in isci_task_abort_task()
555 test_bit(IDEV_GONE, &idev->flags)) { in isci_task_abort_task()
557 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_abort_task()
562 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
567 ((task->task_proto == SAS_PROTOCOL_SMP) in isci_task_abort_task()
569 : (sas_protocol_ata(task->task_proto) in isci_task_abort_task()
574 &old_request->flags), in isci_task_abort_task()
575 test_bit(IDEV_GONE, &idev->flags)); in isci_task_abort_task()
577 spin_lock_irqsave(&task->task_state_lock, flags); in isci_task_abort_task()
578 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in isci_task_abort_task()
579 task->task_state_flags |= SAS_TASK_STATE_DONE; in isci_task_abort_task()
580 spin_unlock_irqrestore(&task->task_state_lock, flags); in isci_task_abort_task()
588 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_abort_task()
596 dev_warn(&ihost->pdev->dev, in isci_task_abort_task()
604 * isci_task_abort_task_set() - This function is one of the SAS Domain Template
622 * isci_task_clear_task_set() - This function is one of the SAS Domain Template
639 * isci_task_query_task() - This function is implemented to cause libsas to
653 if (task->task_state_flags & SAS_TASK_NEED_DEV_RESET) in isci_task_query_task()
660 * isci_task_request_complete() - This function is called by the sci core when
677 dev_dbg(&ihost->pdev->dev, in isci_task_request_complete()
681 set_bit(IREQ_COMPLETE_IN_TARGET, &ireq->flags); in isci_task_request_complete()
684 tmf->status = completion_status; in isci_task_request_complete()
686 if (tmf->proto == SAS_PROTOCOL_SSP) { in isci_task_request_complete()
687 memcpy(tmf->resp.rsp_buf, in isci_task_request_complete()
688 ireq->ssp.rsp_buf, in isci_task_request_complete()
690 } else if (tmf->proto == SAS_PROTOCOL_SATA) { in isci_task_request_complete()
691 memcpy(&tmf->resp.d2h_fis, in isci_task_request_complete()
692 &ireq->stp.rsp, in isci_task_request_complete()
695 /* PRINT_TMF( ((struct isci_tmf *)request->task)); */ in isci_task_request_complete()
696 tmf_complete = tmf->complete; in isci_task_request_complete()
698 sci_controller_complete_io(ihost, ireq->target_device, ireq); in isci_task_request_complete()
702 set_bit(IREQ_TERMINATED, &ireq->flags); in isci_task_request_complete()
704 if (test_and_clear_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags)) in isci_task_request_complete()
705 wake_up_all(&ihost->eventq); in isci_task_request_complete()
707 if (!test_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags)) in isci_task_request_complete()
708 isci_free_tag(ihost, ireq->io_tag); in isci_task_request_complete()
719 int rc = TMF_RESP_FUNC_COMPLETE, reset_stat = -1; in isci_reset_device()
721 struct isci_port *iport = dev->port->lldd_port; in isci_reset_device()
723 dev_dbg(&ihost->pdev->dev, "%s: idev %p\n", __func__, idev); in isci_reset_device()
725 /* Suspend the RNC, terminate all outstanding TCs. */ in isci_reset_device()
737 if (!test_bit(IDEV_GONE, &idev->flags)) { in isci_reset_device()
739 struct isci_phy *iphy = &ihost->phys[phy->number]; in isci_reset_device()
749 dev_dbg(&ihost->pdev->dev, "%s: idev %p complete, reset_stat=%d.\n", in isci_reset_device()
763 spin_lock_irqsave(&ihost->scic_lock, flags); in isci_task_I_T_nexus_reset()
764 idev = isci_get_device(dev->lldd_dev); in isci_task_I_T_nexus_reset()
765 spin_unlock_irqrestore(&ihost->scic_lock, flags); in isci_task_I_T_nexus_reset()
771 ret = -ENODEV; in isci_task_I_T_nexus_reset()