Lines Matching full:task

36 /* record final status and free the task */
37 static void sas_end_task(struct scsi_cmnd *sc, struct sas_task *task) in sas_end_task() argument
39 struct task_status_struct *ts = &task->task_status; in sas_end_task()
47 /* task delivered, what happened afterwards? */ in sas_end_task()
77 pr_notice("LLDD:%s sent SAS_PROTO_RESP for an SSP task; please report this\n", in sas_end_task()
78 task->dev->port->ha->sas_ha_name); in sas_end_task()
96 sas_free_task(task); in sas_end_task()
99 static void sas_scsi_task_done(struct sas_task *task) in sas_scsi_task_done() argument
101 struct scsi_cmnd *sc = task->uldd_task; in sas_scsi_task_done()
102 struct domain_device *dev = task->dev; in sas_scsi_task_done()
108 task = NULL; in sas_scsi_task_done()
113 if (unlikely(!task)) { in sas_scsi_task_done()
114 /* task will be completed by the error handler */ in sas_scsi_task_done()
115 pr_debug("task done but aborted\n"); in sas_scsi_task_done()
121 sas_free_task(task); in sas_scsi_task_done()
125 sas_end_task(sc, task); in sas_scsi_task_done()
133 struct sas_task *task = sas_alloc_task(gfp_flags); in sas_create_task() local
136 if (!task) in sas_create_task()
139 task->uldd_task = cmd; in sas_create_task()
140 ASSIGN_SAS_TASK(cmd, task); in sas_create_task()
142 task->dev = dev; in sas_create_task()
143 task->task_proto = task->dev->tproto; /* BUG_ON(!SSP) */ in sas_create_task()
145 task->ssp_task.retry_count = 1; in sas_create_task()
147 memcpy(task->ssp_task.LUN, &lun.scsi_lun, 8); in sas_create_task()
148 task->ssp_task.task_attr = TASK_ATTR_SIMPLE; in sas_create_task()
149 task->ssp_task.cmd = cmd; in sas_create_task()
151 task->scatter = scsi_sglist(cmd); in sas_create_task()
152 task->num_scatter = scsi_sg_count(cmd); in sas_create_task()
153 task->total_xfer_len = scsi_bufflen(cmd); in sas_create_task()
154 task->data_dir = cmd->sc_data_direction; in sas_create_task()
156 task->task_done = sas_scsi_task_done; in sas_create_task()
158 return task; in sas_create_task()
165 struct sas_task *task; in sas_queuecommand() local
181 task = sas_create_task(cmd, dev, GFP_ATOMIC); in sas_queuecommand()
182 if (!task) in sas_queuecommand()
185 res = i->dft->lldd_execute_task(task, GFP_ATOMIC); in sas_queuecommand()
193 sas_free_task(task); in sas_queuecommand()
208 struct sas_task *task = TO_SAS_TASK(cmd); in sas_eh_finish_cmd() local
211 * of the task, so we should be guaranteed not to be racing with in sas_eh_finish_cmd()
212 * any completions from the LLD. Task is freed after this. in sas_eh_finish_cmd()
214 sas_end_task(cmd, task); in sas_eh_finish_cmd()
277 static enum task_disposition sas_scsi_find_task(struct sas_task *task) in sas_scsi_find_task() argument
282 to_sas_internal(task->dev->port->ha->core.shost->transportt); in sas_scsi_find_task()
285 pr_notice("%s: aborting task 0x%p\n", __func__, task); in sas_scsi_find_task()
286 res = si->dft->lldd_abort_task(task); in sas_scsi_find_task()
288 spin_lock_irqsave(&task->task_state_lock, flags); in sas_scsi_find_task()
289 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in sas_scsi_find_task()
290 spin_unlock_irqrestore(&task->task_state_lock, flags); in sas_scsi_find_task()
291 pr_debug("%s: task 0x%p is done\n", __func__, task); in sas_scsi_find_task()
294 spin_unlock_irqrestore(&task->task_state_lock, flags); in sas_scsi_find_task()
297 pr_notice("%s: task 0x%p is aborted\n", in sas_scsi_find_task()
298 __func__, task); in sas_scsi_find_task()
301 pr_notice("%s: querying task 0x%p\n", __func__, task); in sas_scsi_find_task()
302 res = si->dft->lldd_query_task(task); in sas_scsi_find_task()
305 pr_notice("%s: task 0x%p at LU\n", __func__, in sas_scsi_find_task()
306 task); in sas_scsi_find_task()
309 pr_notice("%s: task 0x%p not at LU\n", in sas_scsi_find_task()
310 __func__, task); in sas_scsi_find_task()
313 pr_notice("%s: task 0x%p failed to abort\n", in sas_scsi_find_task()
314 __func__, task); in sas_scsi_find_task()
317 pr_notice("%s: task 0x%p result code %d not handled\n", in sas_scsi_find_task()
318 __func__, task, res); in sas_scsi_find_task()
334 pr_notice("eh: device %016llx LUN 0x%llx has the task\n", in sas_recover_lu()
464 struct sas_task *task = TO_SAS_TASK(cmd); in sas_eh_abort_handler() local
481 if (task) in sas_eh_abort_handler()
482 res = i->dft->lldd_abort_task(task); in sas_eh_abort_handler()
484 pr_notice("no task to abort\n"); in sas_eh_abort_handler()
572 struct sas_task *task; in sas_eh_handle_sas_errors() local
576 * SAS_HA_FROZEN and is leaving the task alone, or has in sas_eh_handle_sas_errors()
579 task = TO_SAS_TASK(cmd); in sas_eh_handle_sas_errors()
582 if (!task) in sas_eh_handle_sas_errors()
588 struct sas_task *task = TO_SAS_TASK(cmd); in sas_eh_handle_sas_errors() local
592 spin_lock_irqsave(&task->task_state_lock, flags); in sas_eh_handle_sas_errors()
593 need_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET; in sas_eh_handle_sas_errors()
594 spin_unlock_irqrestore(&task->task_state_lock, flags); in sas_eh_handle_sas_errors()
597 pr_notice("%s: task 0x%p requests reset\n", in sas_eh_handle_sas_errors()
598 __func__, task); in sas_eh_handle_sas_errors()
602 pr_debug("trying to find task 0x%p\n", task); in sas_eh_handle_sas_errors()
603 res = sas_scsi_find_task(task); in sas_eh_handle_sas_errors()
607 pr_notice("%s: task 0x%p is done\n", __func__, in sas_eh_handle_sas_errors()
608 task); in sas_eh_handle_sas_errors()
612 pr_notice("%s: task 0x%p is aborted\n", in sas_eh_handle_sas_errors()
613 __func__, task); in sas_eh_handle_sas_errors()
617 pr_info("task 0x%p is at LU: lu recover\n", task); in sas_eh_handle_sas_errors()
619 tmf_resp = sas_recover_lu(task->dev, cmd); in sas_eh_handle_sas_errors()
622 SAS_ADDR(task->dev), in sas_eh_handle_sas_errors()
631 pr_notice("task 0x%p is not at LU: I_T recover\n", in sas_eh_handle_sas_errors()
632 task); in sas_eh_handle_sas_errors()
633 tmf_resp = sas_recover_I_T(task->dev); in sas_eh_handle_sas_errors()
636 struct domain_device *dev = task->dev; in sas_eh_handle_sas_errors()
638 SAS_ADDR(task->dev->sas_addr)); in sas_eh_handle_sas_errors()
646 struct asd_sas_port *port = task->dev->port; in sas_eh_handle_sas_errors()
673 SAS_ADDR(task->dev->sas_addr), in sas_eh_handle_sas_errors()
897 void sas_task_internal_done(struct sas_task *task) in sas_task_internal_done() argument
899 del_timer(&task->slow_task->timer); in sas_task_internal_done()
900 complete(&task->slow_task->completion); in sas_task_internal_done()
906 struct sas_task *task = slow->task; in sas_task_internal_timedout() local
910 spin_lock_irqsave(&task->task_state_lock, flags); in sas_task_internal_timedout()
911 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in sas_task_internal_timedout()
912 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in sas_task_internal_timedout()
915 spin_unlock_irqrestore(&task->task_state_lock, flags); in sas_task_internal_timedout()
918 complete(&task->slow_task->completion); in sas_task_internal_timedout()
930 struct sas_task *task = NULL; in sas_execute_internal_abort() local
934 task = sas_alloc_slow_task(GFP_KERNEL); in sas_execute_internal_abort()
935 if (!task) in sas_execute_internal_abort()
938 task->dev = device; in sas_execute_internal_abort()
939 task->task_proto = SAS_PROTOCOL_INTERNAL_ABORT; in sas_execute_internal_abort()
940 task->task_done = sas_task_internal_done; in sas_execute_internal_abort()
941 task->slow_task->timer.function = sas_task_internal_timedout; in sas_execute_internal_abort()
942 task->slow_task->timer.expires = jiffies + TASK_TIMEOUT; in sas_execute_internal_abort()
943 add_timer(&task->slow_task->timer); in sas_execute_internal_abort()
945 task->abort_task.tag = tag; in sas_execute_internal_abort()
946 task->abort_task.type = type; in sas_execute_internal_abort()
947 task->abort_task.qid = qid; in sas_execute_internal_abort()
949 res = i->dft->lldd_execute_task(task, GFP_KERNEL); in sas_execute_internal_abort()
951 del_timer_sync(&task->slow_task->timer); in sas_execute_internal_abort()
957 wait_for_completion(&task->slow_task->completion); in sas_execute_internal_abort()
961 if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { in sas_execute_internal_abort()
965 quit = i->dft->lldd_abort_timeout(task, data); in sas_execute_internal_abort()
974 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_internal_abort()
975 task->task_status.stat == SAS_SAM_STAT_GOOD) { in sas_execute_internal_abort()
980 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_internal_abort()
981 task->task_status.stat == TMF_RESP_FUNC_SUCC) { in sas_execute_internal_abort()
986 pr_err("Internal abort: task to dev %016llx response: 0x%x status 0x%x\n", in sas_execute_internal_abort()
987 SAS_ADDR(device->sas_addr), task->task_status.resp, in sas_execute_internal_abort()
988 task->task_status.stat); in sas_execute_internal_abort()
989 sas_free_task(task); in sas_execute_internal_abort()
990 task = NULL; in sas_execute_internal_abort()
992 BUG_ON(retry == TASK_RETRY && task != NULL); in sas_execute_internal_abort()
993 sas_free_task(task); in sas_execute_internal_abort()
1017 struct sas_task *task; in sas_execute_tmf() local
1023 task = sas_alloc_slow_task(GFP_KERNEL); in sas_execute_tmf()
1024 if (!task) in sas_execute_tmf()
1027 task->dev = device; in sas_execute_tmf()
1028 task->task_proto = device->tproto; in sas_execute_tmf()
1031 task->ata_task.device_control_reg_update = 1; in sas_execute_tmf()
1033 task->ata_task.force_phy = true; in sas_execute_tmf()
1034 task->ata_task.force_phy_id = force_phy_id; in sas_execute_tmf()
1036 memcpy(&task->ata_task.fis, parameter, para_len); in sas_execute_tmf()
1038 memcpy(&task->ssp_task, parameter, para_len); in sas_execute_tmf()
1041 task->task_done = sas_task_internal_done; in sas_execute_tmf()
1042 task->tmf = tmf; in sas_execute_tmf()
1044 task->slow_task->timer.function = sas_task_internal_timedout; in sas_execute_tmf()
1045 task->slow_task->timer.expires = jiffies + TASK_TIMEOUT; in sas_execute_tmf()
1046 add_timer(&task->slow_task->timer); in sas_execute_tmf()
1048 res = i->dft->lldd_execute_task(task, GFP_KERNEL); in sas_execute_tmf()
1050 del_timer_sync(&task->slow_task->timer); in sas_execute_tmf()
1051 pr_err("executing TMF task failed %016llx (%d)\n", in sas_execute_tmf()
1056 wait_for_completion(&task->slow_task->completion); in sas_execute_tmf()
1063 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { in sas_execute_tmf()
1064 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in sas_execute_tmf()
1065 pr_err("TMF task timeout for %016llx and not done\n", in sas_execute_tmf()
1068 i->dft->lldd_tmf_aborted(task); in sas_execute_tmf()
1071 pr_warn("TMF task timeout for %016llx and done\n", in sas_execute_tmf()
1075 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_tmf()
1076 task->task_status.stat == TMF_RESP_FUNC_COMPLETE) { in sas_execute_tmf()
1081 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_tmf()
1082 task->task_status.stat == TMF_RESP_FUNC_SUCC) { in sas_execute_tmf()
1087 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_tmf()
1088 task->task_status.stat == SAS_DATA_UNDERRUN) { in sas_execute_tmf()
1092 pr_warn("TMF task to dev %016llx resp: 0x%x sts 0x%x underrun\n", in sas_execute_tmf()
1094 task->task_status.resp, in sas_execute_tmf()
1095 task->task_status.stat); in sas_execute_tmf()
1096 res = task->task_status.residual; in sas_execute_tmf()
1100 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_tmf()
1101 task->task_status.stat == SAS_DATA_OVERRUN) { in sas_execute_tmf()
1102 pr_warn("TMF task blocked task error %016llx\n", in sas_execute_tmf()
1108 if (task->task_status.resp == SAS_TASK_COMPLETE && in sas_execute_tmf()
1109 task->task_status.stat == SAS_OPEN_REJECT) { in sas_execute_tmf()
1110 pr_warn("TMF task open reject failed %016llx\n", in sas_execute_tmf()
1114 pr_warn("TMF task to dev %016llx resp: 0x%x status 0x%x\n", in sas_execute_tmf()
1116 task->task_status.resp, in sas_execute_tmf()
1117 task->task_status.stat); in sas_execute_tmf()
1119 sas_free_task(task); in sas_execute_tmf()
1120 task = NULL; in sas_execute_tmf()
1126 sas_free_task(task); in sas_execute_tmf()
1174 int sas_query_task(struct sas_task *task, u16 tag) in sas_query_task() argument
1180 struct scsi_cmnd *cmnd = task->uldd_task; in sas_query_task()
1181 struct domain_device *dev = task->dev; in sas_query_task()
1190 int sas_abort_task(struct sas_task *task, u16 tag) in sas_abort_task() argument
1196 struct scsi_cmnd *cmnd = task->uldd_task; in sas_abort_task()
1197 struct domain_device *dev = task->dev; in sas_abort_task()
1207 * Tell an upper layer that it needs to initiate an abort for a given task.
1210 void sas_task_abort(struct sas_task *task) in sas_task_abort() argument
1212 struct scsi_cmnd *sc = task->uldd_task; in sas_task_abort()
1216 struct sas_task_slow *slow = task->slow_task; in sas_task_abort()
1226 if (dev_is_sata(task->dev)) in sas_task_abort()
1227 sas_ata_task_abort(task); in sas_task_abort()