Lines Matching full:task
46 * pm8001_find_tag - from sas task to find out tag that belongs to this task
47 * @task: the task sent to the LLDD
48 * @tag: the found tag associated with the task
50 static int pm8001_find_tag(struct sas_task *task, u32 *tag) in pm8001_find_tag() argument
52 if (task->lldd_task) { in pm8001_find_tag()
54 ccb = task->lldd_task; in pm8001_find_tag()
64 * @tag: the found tag associated with the task
80 * pm8001_tag_alloc - allocate a empty tag for task used.
104 static void pm80xx_get_tag_opcodes(struct sas_task *task, int *ata_op, in pm80xx_get_tag_opcodes() argument
114 if (!task) in pm80xx_get_tag_opcodes()
117 spin_lock_irqsave(&task->task_state_lock, flags); in pm80xx_get_tag_opcodes()
118 if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED))) in pm80xx_get_tag_opcodes()
120 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm80xx_get_tag_opcodes()
122 if (task->task_proto == SAS_PROTOCOL_STP) { in pm80xx_get_tag_opcodes()
125 qc = task->uldd_task; in pm80xx_get_tag_opcodes()
138 struct sas_task *task = NULL; in pm80xx_show_pending_commands() local
150 task = ccb->task; in pm80xx_show_pending_commands()
151 pm80xx_get_tag_opcodes(task, &ata_op, &ata_tag, &task_aborted); in pm80xx_show_pending_commands()
153 "tag %#x, device %#x task %p task aborted %d ata opcode %#x ata tag %d\n", in pm80xx_show_pending_commands()
156 task, task_aborted, in pm80xx_show_pending_commands()
366 * pm8001_task_prep_smp - the dispatcher function, prepare data for smp task
368 * @ccb: the ccb which attached to smp task
376 u32 pm8001_get_ncq_tag(struct sas_task *task, u32 *tag) in pm8001_get_ncq_tag() argument
378 struct ata_queued_cmd *qc = task->uldd_task; in pm8001_get_ncq_tag()
389 * pm8001_task_prep_ata - the dispatcher function, prepare data for sata task
391 * @ccb: the ccb which attached to sata task
401 * for internal abort task
403 * @ccb: the ccb which attached to sata task
412 * pm8001_task_prep_ssp_tm - the dispatcher function, prepare task management data
415 * @tmf: the task management IU
424 * pm8001_task_prep_ssp - the dispatcher function, prepare ssp data for ssp task
426 * @ccb: the ccb which attached to ssp task
441 struct sas_task *task = ccb->task; in pm8001_deliver_command() local
442 enum sas_protocol task_proto = task->task_proto; in pm8001_deliver_command()
443 struct sas_tmf_task *tmf = task->tmf; in pm8001_deliver_command()
469 * @task: the task to be execute.
472 int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags) in pm8001_queue_command() argument
474 struct task_status_struct *ts = &task->task_status; in pm8001_queue_command()
475 enum sas_protocol task_proto = task->task_proto; in pm8001_queue_command()
476 struct domain_device *dev = task->dev; in pm8001_queue_command()
478 bool internal_abort = sas_is_internal_abort(task); in pm8001_queue_command()
490 task->task_done(task); in pm8001_queue_command()
497 task->task_done(task); in pm8001_queue_command()
514 task->task_done(task); in pm8001_queue_command()
517 task->task_done(task); in pm8001_queue_command()
523 ccb = pm8001_ccb_alloc(pm8001_ha, pm8001_dev, task); in pm8001_queue_command()
530 if (task->num_scatter) { in pm8001_queue_command()
531 n_elem = dma_map_sg(pm8001_ha->dev, task->scatter, in pm8001_queue_command()
532 task->num_scatter, task->data_dir); in pm8001_queue_command()
539 n_elem = task->num_scatter; in pm8001_queue_command()
542 task->lldd_task = ccb; in pm8001_queue_command()
551 dma_unmap_sg(pm8001_ha->dev, task->scatter, in pm8001_queue_command()
552 task->num_scatter, task->data_dir); in pm8001_queue_command()
568 * @ccb: the ccb which attached to ssp task to free
573 struct sas_task *task = ccb->task; in pm8001_ccb_task_free() local
577 if (!task) in pm8001_ccb_task_free()
580 if (!sas_protocol_ata(task->task_proto) && ccb->n_elem) in pm8001_ccb_task_free()
581 dma_unmap_sg(pm8001_ha->dev, task->scatter, in pm8001_ccb_task_free()
582 task->num_scatter, task->data_dir); in pm8001_ccb_task_free()
584 switch (task->task_proto) { in pm8001_ccb_task_free()
586 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1, in pm8001_ccb_task_free()
588 dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1, in pm8001_ccb_task_free()
600 if (sas_protocol_ata(task->task_proto)) { in pm8001_ccb_task_free()
602 qc = task->uldd_task; in pm8001_ccb_task_free()
611 task->lldd_task = NULL; in pm8001_ccb_task_free()
782 /* retry commands by ha, by task and/or by device */
797 struct sas_task *task; in pm8001_open_reject_retry() local
817 task = ccb->task; in pm8001_open_reject_retry()
818 if (!task || !task->task_done) in pm8001_open_reject_retry()
820 if (task_to_close && (task != task_to_close)) in pm8001_open_reject_retry()
822 ts = &task->task_status; in pm8001_open_reject_retry()
829 spin_lock_irqsave(&task->task_state_lock, flags1); in pm8001_open_reject_retry()
830 task->task_state_flags &= ~SAS_TASK_STATE_PENDING; in pm8001_open_reject_retry()
831 task->task_state_flags |= SAS_TASK_STATE_DONE; in pm8001_open_reject_retry()
832 if (unlikely((task->task_state_flags in pm8001_open_reject_retry()
834 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
838 spin_unlock_irqrestore(&task->task_state_lock, in pm8001_open_reject_retry()
843 task->task_done(task); in pm8001_open_reject_retry()
888 pm8001_dbg(pm8001_ha, EH, "task abort failed %x\n" in pm8001_I_T_nexus_reset()
964 /* mandatory SAM-3, the task reset the specified LUN*/
1001 int pm8001_query_task(struct sas_task *task) in pm8001_query_task() argument
1005 if (unlikely(!task || !task->lldd_task || !task->dev)) in pm8001_query_task()
1008 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_query_task()
1009 struct scsi_cmnd *cmnd = task->uldd_task; in pm8001_query_task()
1010 struct domain_device *dev = task->dev; in pm8001_query_task()
1014 rc = pm8001_find_tag(task, &tag); in pm8001_query_task()
1021 rc = sas_query_task(task, tag); in pm8001_query_task()
1023 /* The task is still in Lun, release it then */ in pm8001_query_task()
1026 "The task is still in Lun\n"); in pm8001_query_task()
1028 /* The task is not in Lun or failed, reset the phy */ in pm8001_query_task()
1032 "The task is not in Lun or failed, reset the phy\n"); in pm8001_query_task()
1040 /* mandatory SAM-3, still need free task/ccb info, abort the specified task */
1041 int pm8001_abort_task(struct sas_task *task) in pm8001_abort_task() argument
1043 struct pm8001_ccb_info *ccb = task->lldd_task; in pm8001_abort_task()
1053 if (!task->lldd_task || !task->dev) in pm8001_abort_task()
1056 dev = task->dev; in pm8001_abort_task()
1063 // abort task will not get a response from the controller in pm8001_abort_task()
1067 ret = pm8001_find_tag(task, &tag); in pm8001_abort_task()
1069 pm8001_info(pm8001_ha, "no tag for task:%p\n", task); in pm8001_abort_task()
1072 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1073 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in pm8001_abort_task()
1074 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1077 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in pm8001_abort_task()
1078 if (task->slow_task == NULL) { in pm8001_abort_task()
1080 task->slow_task = &slow_task; in pm8001_abort_task()
1082 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1083 if (task->task_proto & SAS_PROTOCOL_SSP) { in pm8001_abort_task()
1084 rc = sas_abort_task(task, tag); in pm8001_abort_task()
1086 } else if (task->task_proto & SAS_PROTOCOL_SATA || in pm8001_abort_task()
1087 task->task_proto & SAS_PROTOCOL_STP) { in pm8001_abort_task()
1119 * leaking the task in libsas or losing the race and in pm8001_abort_task()
1154 * we wait for the task to be aborted so that the task in pm8001_abort_task()
1156 * going to free the task. in pm8001_abort_task()
1162 &task->slow_task->completion, in pm8001_abort_task()
1176 * associated with the task which we are trying to in pm8001_abort_task()
1180 ccb->task = NULL; in pm8001_abort_task()
1184 } else if (task->task_proto & SAS_PROTOCOL_SMP) { in pm8001_abort_task()
1190 spin_lock_irqsave(&task->task_state_lock, flags); in pm8001_abort_task()
1191 if (task->slow_task == &slow_task) in pm8001_abort_task()
1192 task->slow_task = NULL; in pm8001_abort_task()
1193 spin_unlock_irqrestore(&task->task_state_lock, flags); in pm8001_abort_task()
1204 pm8001_dbg(pm8001_ha, EH, "I_T_L_Q clear task set[%x]\n", in pm8001_clear_task_set()
1238 void pm8001_tmf_aborted(struct sas_task *task) in pm8001_tmf_aborted() argument
1240 struct pm8001_ccb_info *ccb = task->lldd_task; in pm8001_tmf_aborted()
1243 ccb->task = NULL; in pm8001_tmf_aborted()