Lines Matching full:task

45  * pm8001_find_tag - from sas task to find out  tag that belongs to this task
46 * @task: the task sent to the LLDD
47 * @tag: the found tag associated with the task
49 static int pm8001_find_tag(struct sas_task *task, u32 *tag) in pm8001_find_tag() argument
51 if (task->lldd_task) { in pm8001_find_tag()
53 ccb = task->lldd_task; in pm8001_find_tag()
63 * @tag: the found tag associated with the task
72 * pm8001_tag_alloc - allocate a empty tag for task used.
293 * pm8001_task_prep_smp - the dispatcher function, prepare data for smp task
295 * @ccb: the ccb which attached to smp task
303 u32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag) in pm8001_get_ncq_tag() argument
305 struct ata_queued_cmd *qc = task->uldd_task; in pm8001_get_ncq_tag()
320 * pm8001_task_prep_ata - the dispatcher function, prepare data for sata task
322 * @ccb: the ccb which attached to sata task
331 * pm8001_task_prep_ssp_tm - the dispatcher function, prepare task management data
334 * @tmf: the task management IU
343 * pm8001_task_prep_ssp - the dispatcher function,prepare ssp data for ssp task
345 * @ccb: the ccb which attached to ssp task
373 * pm8001_task_exec - queue the task(ssp, smp && ata) to the hardware.
374 * @task: the task to be execute.
376 * @is_tmf: if it is task management task.
377 * @tmf: the task management IU
379 static int pm8001_task_exec(struct sas_task *task, in pm8001_task_exec() argument
382 struct domain_device *dev = task->dev; in pm8001_task_exec()
386 struct sas_task *t = task; in pm8001_task_exec()
400 pm8001_ha = pm8001_find_ha_by_dev(task->dev); in pm8001_task_exec()
455 ccb->task = t; in pm8001_task_exec()
509 * @task: the task to be execute.
512 int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags) in pm8001_queue_command() argument
514 return pm8001_task_exec(task, gfp_flags, 0, NULL); in pm8001_queue_command()
520 * @ccb: the ccb which attached to ssp task
521 * @task: the task to be free.
525 struct sas_task *task, struct pm8001_ccb_info *ccb, u32 ccb_idx) in pm8001_ccb_task_free() argument
527 if (!ccb->task) in pm8001_ccb_task_free()
529 if (!sas_protocol_ata(task->task_proto)) in pm8001_ccb_task_free()
531 dma_unmap_sg(pm8001_ha->dev, task->scatter, in pm8001_ccb_task_free()
532 task->num_scatter, task->data_dir); in pm8001_ccb_task_free()
534 switch (task->task_proto) { in pm8001_ccb_task_free()
536 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1, in pm8001_ccb_task_free()
538 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1, in pm8001_ccb_task_free()
549 task->lldd_task = NULL; in pm8001_ccb_task_free()
550 ccb->task = NULL; in pm8001_ccb_task_free()
683 void pm8001_task_done(struct sas_task *task) in pm8001_task_done() argument
685 if (!del_timer(&task->slow_task->timer)) in pm8001_task_done()
687 complete(&task->slow_task->completion); in pm8001_task_done()
693 struct sas_task *task = slow->task; in pm8001_tmf_timedout() local
695 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_tmf_timedout()
696 complete(&task->slow_task->completion); in pm8001_tmf_timedout()
701 * pm8001_exec_internal_tmf_task - execute some task management commands.
703 * @tmf: which task management wanted to be take.
705 * @parameter: ssp task parameter.
708 * abort the issued task which result in this execption, it is done by calling
709 * this function, note it is also with the task execute interface.
715 struct sas_task *task = NULL; in pm8001_exec_internal_tmf_task() local
721 task = sas_alloc_slow_task(GFP_KERNEL); in pm8001_exec_internal_tmf_task()
722 if (!task) in pm8001_exec_internal_tmf_task()
725 task->dev = dev; in pm8001_exec_internal_tmf_task()
726 task->task_proto = dev->tproto; in pm8001_exec_internal_tmf_task()
727 memcpy(&task->ssp_task, parameter, para_len); in pm8001_exec_internal_tmf_task()
728 task->task_done = pm8001_task_done; in pm8001_exec_internal_tmf_task()
729 task->slow_task->timer.function = pm8001_tmf_timedout; in pm8001_exec_internal_tmf_task()
730 task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT*HZ; in pm8001_exec_internal_tmf_task()
731 add_timer(&task->slow_task->timer); in pm8001_exec_internal_tmf_task()
733 res = pm8001_task_exec(task, GFP_KERNEL, 1, tmf); in pm8001_exec_internal_tmf_task()
736 del_timer(&task->slow_task->timer); in pm8001_exec_internal_tmf_task()
738 pm8001_printk("Executing internal task " in pm8001_exec_internal_tmf_task()
742 wait_for_completion(&task->slow_task->completion); in pm8001_exec_internal_tmf_task()
751 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { in pm8001_exec_internal_tmf_task()
752 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in pm8001_exec_internal_tmf_task()
754 pm8001_printk("TMF task[%x]timeout.\n", in pm8001_exec_internal_tmf_task()
760 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
761 task->task_status.stat == SAM_STAT_GOOD) { in pm8001_exec_internal_tmf_task()
766 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
767 task->task_status.stat == SAS_DATA_UNDERRUN) { in pm8001_exec_internal_tmf_task()
770 res = task->task_status.residual; in pm8001_exec_internal_tmf_task()
774 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_tmf_task()
775 task->task_status.stat == SAS_DATA_OVERRUN) { in pm8001_exec_internal_tmf_task()
777 pm8001_printk("Blocked task error.\n")); in pm8001_exec_internal_tmf_task()
782 pm8001_printk(" Task to dev %016llx response:" in pm8001_exec_internal_tmf_task()
785 task->task_status.resp, in pm8001_exec_internal_tmf_task()
786 task->task_status.stat)); in pm8001_exec_internal_tmf_task()
787 sas_free_task(task); in pm8001_exec_internal_tmf_task()
788 task = NULL; in pm8001_exec_internal_tmf_task()
792 BUG_ON(retry == 3 && task != NULL); in pm8001_exec_internal_tmf_task()
793 sas_free_task(task); in pm8001_exec_internal_tmf_task()
805 struct sas_task *task = NULL; in pm8001_exec_internal_task_abort() local
808 task = sas_alloc_slow_task(GFP_KERNEL); in pm8001_exec_internal_task_abort()
809 if (!task) in pm8001_exec_internal_task_abort()
812 task->dev = dev; in pm8001_exec_internal_task_abort()
813 task->task_proto = dev->tproto; in pm8001_exec_internal_task_abort()
814 task->task_done = pm8001_task_done; in pm8001_exec_internal_task_abort()
815 task->slow_task->timer.function = pm8001_tmf_timedout; in pm8001_exec_internal_task_abort()
816 task->slow_task->timer.expires = jiffies + PM8001_TASK_TIMEOUT * HZ; in pm8001_exec_internal_task_abort()
817 add_timer(&task->slow_task->timer); in pm8001_exec_internal_task_abort()
825 ccb->task = task; in pm8001_exec_internal_task_abort()
832 del_timer(&task->slow_task->timer); in pm8001_exec_internal_task_abort()
834 pm8001_printk("Executing internal task " in pm8001_exec_internal_task_abort()
838 wait_for_completion(&task->slow_task->completion); in pm8001_exec_internal_task_abort()
841 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { in pm8001_exec_internal_task_abort()
842 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in pm8001_exec_internal_task_abort()
844 pm8001_printk("TMF task timeout.\n")); in pm8001_exec_internal_task_abort()
849 if (task->task_status.resp == SAS_TASK_COMPLETE && in pm8001_exec_internal_task_abort()
850 task->task_status.stat == SAM_STAT_GOOD) { in pm8001_exec_internal_task_abort()
856 pm8001_printk(" Task to dev %016llx response: " in pm8001_exec_internal_task_abort()
859 task->task_status.resp, in pm8001_exec_internal_task_abort()
860 task->task_status.stat)); in pm8001_exec_internal_task_abort()
861 sas_free_task(task); in pm8001_exec_internal_task_abort()
862 task = NULL; in pm8001_exec_internal_task_abort()
866 BUG_ON(retry == 3 && task != NULL); in pm8001_exec_internal_task_abort()
867 sas_free_task(task); in pm8001_exec_internal_task_abort()
924 /* retry commands by ha, by task and/or by device */
939 struct sas_task *task; in pm8001_open_reject_retry() local
960 task = ccb->task; in pm8001_open_reject_retry()
961 if (!task || !task->task_done) in pm8001_open_reject_retry()
963 if (task_to_close && (task != task_to_close)) in pm8001_open_reject_retry()
965 ts = &task->task_status; in pm8001_open_reject_retry()
972 spin_lock_irqsave(&task->task_state_lock, flags1); in pm8001_open_reject_retry()
973 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_open_reject_retry()
974 task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; in pm8001_open_reject_retry()
975 task->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_open_reject_retry()
976 if (unlikely((task->task_state_flags in pm8001_open_reject_retry()
978 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
980 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag); in pm8001_open_reject_retry()
982 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
984 pm8001_ccb_task_free(pm8001_ha, task, ccb, tag); in pm8001_open_reject_retry()
987 task->task_done(task); in pm8001_open_reject_retry()
1032 pm8001_printk("task abort failed %x\n" in pm8001_I_T_nexus_reset()
1111 /* mandatory SAM-3, the task reset the specified LUN*/
1140 int pm8001_query_task(struct sas_task *task) in pm8001_query_task() argument
1147 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_query_task()
1150 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_query_task()
1151 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_query_task()
1152 struct domain_device *dev = task->dev; in pm8001_query_task()
1157 rc = pm8001_find_tag(task, &tag); in pm8001_query_task()
1171 /* The task is still in Lun, release it then */ in pm8001_query_task()
1174 pm8001_printk("The task is still in Lun\n")); in pm8001_query_task()
1176 /* The task is not in Lun or failed, reset the phy */ in pm8001_query_task()
1180 pm8001_printk("The task is not in Lun or failed," in pm8001_query_task()
1189 /* mandatory SAM-3, still need free task/ccb info, abort the specified task */
1190 int pm8001_abort_task(struct sas_task *task) in pm8001_abort_task() argument
1202 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_abort_task()
1204 dev = task->dev; in pm8001_abort_task()
1208 ret = pm8001_find_tag(task, &tag); in pm8001_abort_task()
1210 pm8001_printk("no tag for task:%p\n", task); in pm8001_abort_task()
1213 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1214 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in pm8001_abort_task()
1215 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1218 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_abort_task()
1219 if (task->slow_task == NULL) { in pm8001_abort_task()
1221 task->slow_task = &slow_task; in pm8001_abort_task()
1223 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1224 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_abort_task()
1225 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_abort_task()
1232 } else if (task->task_proto & SAS_PROTOCOL_SATA || in pm8001_abort_task()
1233 task->task_proto & SAS_PROTOCOL_STP) { in pm8001_abort_task()
1264 * leaking the task in libsas or losing the race and in pm8001_abort_task()
1295 * we wait for the task to be aborted so that the task in pm8001_abort_task()
1297 * going to free the task. in pm8001_abort_task()
1304 &task->slow_task->completion, in pm8001_abort_task()
1320 } else if (task->task_proto & SAS_PROTOCOL_SMP) { in pm8001_abort_task()
1327 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1328 if (task->slow_task == &slow_task) in pm8001_abort_task()
1329 task->slow_task = NULL; in pm8001_abort_task()
1330 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1359 pm8001_printk("I_T_L_Q clear task set[%x]\n", in pm8001_clear_task_set()