Lines Matching refs:task
28 static int mvs_find_tag(struct mvs_info *mvi, struct sas_task *task, u32 *tag) in mvs_find_tag() argument
30 if (task->lldd_task) { in mvs_find_tag()
32 slot = task->lldd_task; in mvs_find_tag()
320 struct sas_task *task = tei->task; in mvs_task_prep_smp() local
322 struct domain_device *dev = task->dev; in mvs_task_prep_smp()
338 sg_req = &task->smp_task.smp_req; in mvs_task_prep_smp()
344 sg_resp = &task->smp_task.smp_resp; in mvs_task_prep_smp()
413 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_smp()
418 dma_unmap_sg(mvi->dev, &tei->task->smp_task.smp_resp, 1, in mvs_task_prep_smp()
421 dma_unmap_sg(mvi->dev, &tei->task->smp_task.smp_req, 1, in mvs_task_prep_smp()
426 static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag) in mvs_get_ncq_tag() argument
428 struct ata_queued_cmd *qc = task->uldd_task; in mvs_get_ncq_tag()
447 struct sas_task *task = tei->task; in mvs_task_prep_ata() local
448 struct domain_device *dev = task->dev; in mvs_task_prep_ata()
475 if (task->data_dir == DMA_FROM_DEVICE) in mvs_task_prep_ata()
480 if (task->ata_task.use_ncq) in mvs_task_prep_ata()
483 if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI) in mvs_task_prep_ata()
489 if (task->ata_task.use_ncq && mvs_get_ncq_tag(task, &hdr_tag)) in mvs_task_prep_ata()
490 task->ata_task.fis.sector_count |= (u8) (hdr_tag << 3); in mvs_task_prep_ata()
496 hdr->data_len = cpu_to_le32(task->total_xfer_len); in mvs_task_prep_ata()
545 if (likely(!task->ata_task.device_control_reg_update)) in mvs_task_prep_ata()
546 task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */ in mvs_task_prep_ata()
548 memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis)); in mvs_task_prep_ata()
551 task->ata_task.atapi_packet, 16); in mvs_task_prep_ata()
561 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_ata()
563 if (task->data_dir == DMA_FROM_DEVICE) in mvs_task_prep_ata()
574 struct sas_task *task = tei->task; in mvs_task_prep_ssp() local
577 struct domain_device *dev = task->dev; in mvs_task_prep_ssp()
602 if (task->ssp_task.enable_first_burst) { in mvs_task_prep_ssp()
613 hdr->data_len = cpu_to_le32(task->total_xfer_len); in mvs_task_prep_ssp()
684 memcpy(buf_cmd, &task->ssp_task.LUN, 8); in mvs_task_prep_ssp()
687 buf_cmd[9] = fburst | task->ssp_task.task_attr | in mvs_task_prep_ssp()
688 (task->ssp_task.task_prio << 3); in mvs_task_prep_ssp()
689 memcpy(buf_cmd + 12, task->ssp_task.cmd->cmnd, in mvs_task_prep_ssp()
690 task->ssp_task.cmd->cmd_len); in mvs_task_prep_ssp()
706 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_ssp()
711 static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmf, in mvs_task_prep() argument
714 struct domain_device *dev = task->dev; in mvs_task_prep()
722 struct task_status_struct *tsm = &task->task_status; in mvs_task_prep()
731 task->task_done(task); in mvs_task_prep()
748 if (sas_protocol_ata(task->task_proto)) { in mvs_task_prep()
749 struct task_status_struct *ts = &task->task_status; in mvs_task_prep()
755 task->task_done(task); in mvs_task_prep()
758 struct task_status_struct *ts = &task->task_status; in mvs_task_prep()
763 task->task_done(task); in mvs_task_prep()
768 if (!sas_protocol_ata(task->task_proto)) { in mvs_task_prep()
769 if (task->num_scatter) { in mvs_task_prep()
771 task->scatter, in mvs_task_prep()
772 task->num_scatter, in mvs_task_prep()
773 task->data_dir); in mvs_task_prep()
780 n_elem = task->num_scatter; in mvs_task_prep()
789 task->lldd_task = NULL; in mvs_task_prep()
800 tei.task = task; in mvs_task_prep()
804 switch (task->task_proto) { in mvs_task_prep()
819 task->task_proto); in mvs_task_prep()
828 slot->task = task; in mvs_task_prep()
830 task->lldd_task = slot; in mvs_task_prep()
832 spin_lock(&task->task_state_lock); in mvs_task_prep()
833 task->task_state_flags |= SAS_TASK_AT_INITIATOR; in mvs_task_prep()
834 spin_unlock(&task->task_state_lock); in mvs_task_prep()
849 if (!sas_protocol_ata(task->task_proto)) in mvs_task_prep()
851 dma_unmap_sg(mvi->dev, task->scatter, n_elem, in mvs_task_prep()
852 task->data_dir); in mvs_task_prep()
857 static int mvs_task_exec(struct sas_task *task, gfp_t gfp_flags, in mvs_task_exec() argument
866 mvi = ((struct mvs_device *)task->dev->lldd_dev)->mvi_info; in mvs_task_exec()
869 rc = mvs_task_prep(task, mvi, is_tmf, tmf, &pass); in mvs_task_exec()
881 int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags) in mvs_queue_command() argument
883 return mvs_task_exec(task, gfp_flags, NULL, 0, NULL); in mvs_queue_command()
892 static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task, in mvs_slot_task_free() argument
897 if (!slot->task) in mvs_slot_task_free()
899 if (!sas_protocol_ata(task->task_proto)) in mvs_slot_task_free()
901 dma_unmap_sg(mvi->dev, task->scatter, in mvs_slot_task_free()
902 slot->n_elem, task->data_dir); in mvs_slot_task_free()
904 switch (task->task_proto) { in mvs_slot_task_free()
906 dma_unmap_sg(mvi->dev, &task->smp_task.smp_resp, 1, in mvs_slot_task_free()
908 dma_unmap_sg(mvi->dev, &task->smp_task.smp_req, 1, in mvs_slot_task_free()
925 task->lldd_task = NULL; in mvs_slot_task_free()
926 slot->task = NULL; in mvs_slot_task_free()
1279 static void mvs_task_done(struct sas_task *task) in mvs_task_done() argument
1281 if (!del_timer(&task->slow_task->timer)) in mvs_task_done()
1283 complete(&task->slow_task->completion); in mvs_task_done()
1289 struct sas_task *task = slow->task; in mvs_tmf_timedout() local
1291 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in mvs_tmf_timedout()
1292 complete(&task->slow_task->completion); in mvs_tmf_timedout()
1300 struct sas_task *task = NULL; in mvs_exec_internal_tmf_task() local
1303 task = sas_alloc_slow_task(GFP_KERNEL); in mvs_exec_internal_tmf_task()
1304 if (!task) in mvs_exec_internal_tmf_task()
1307 task->dev = dev; in mvs_exec_internal_tmf_task()
1308 task->task_proto = dev->tproto; in mvs_exec_internal_tmf_task()
1310 memcpy(&task->ssp_task, parameter, para_len); in mvs_exec_internal_tmf_task()
1311 task->task_done = mvs_task_done; in mvs_exec_internal_tmf_task()
1313 task->slow_task->timer.function = mvs_tmf_timedout; in mvs_exec_internal_tmf_task()
1314 task->slow_task->timer.expires = jiffies + MVS_TASK_TIMEOUT*HZ; in mvs_exec_internal_tmf_task()
1315 add_timer(&task->slow_task->timer); in mvs_exec_internal_tmf_task()
1317 res = mvs_task_exec(task, GFP_KERNEL, NULL, 1, tmf); in mvs_exec_internal_tmf_task()
1320 del_timer(&task->slow_task->timer); in mvs_exec_internal_tmf_task()
1325 wait_for_completion(&task->slow_task->completion); in mvs_exec_internal_tmf_task()
1328 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { in mvs_exec_internal_tmf_task()
1329 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in mvs_exec_internal_tmf_task()
1335 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1336 task->task_status.stat == SAM_STAT_GOOD) { in mvs_exec_internal_tmf_task()
1341 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1342 task->task_status.stat == SAS_DATA_UNDERRUN) { in mvs_exec_internal_tmf_task()
1345 res = task->task_status.residual; in mvs_exec_internal_tmf_task()
1349 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1350 task->task_status.stat == SAS_DATA_OVERRUN) { in mvs_exec_internal_tmf_task()
1358 task->task_status.resp, in mvs_exec_internal_tmf_task()
1359 task->task_status.stat); in mvs_exec_internal_tmf_task()
1360 sas_free_task(task); in mvs_exec_internal_tmf_task()
1361 task = NULL; in mvs_exec_internal_tmf_task()
1366 BUG_ON(retry == 3 && task != NULL); in mvs_exec_internal_tmf_task()
1367 sas_free_task(task); in mvs_exec_internal_tmf_task()
1444 int mvs_query_task(struct sas_task *task) in mvs_query_task() argument
1451 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { in mvs_query_task()
1452 struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task; in mvs_query_task()
1453 struct domain_device *dev = task->dev; in mvs_query_task()
1458 rc = mvs_find_tag(mvi, task, &tag); in mvs_query_task()
1482 int mvs_abort_task(struct sas_task *task) in mvs_abort_task() argument
1486 struct domain_device *dev = task->dev; in mvs_abort_task()
1500 spin_lock_irqsave(&task->task_state_lock, flags); in mvs_abort_task()
1501 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in mvs_abort_task()
1502 spin_unlock_irqrestore(&task->task_state_lock, flags); in mvs_abort_task()
1506 spin_unlock_irqrestore(&task->task_state_lock, flags); in mvs_abort_task()
1508 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { in mvs_abort_task()
1509 struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task; in mvs_abort_task()
1512 rc = mvs_find_tag(mvi, task, &tag); in mvs_abort_task()
1529 if (task->lldd_task) { in mvs_abort_task()
1530 slot = task->lldd_task; in mvs_abort_task()
1538 } else if (task->task_proto & SAS_PROTOCOL_SATA || in mvs_abort_task()
1539 task->task_proto & SAS_PROTOCOL_STP) { in mvs_abort_task()
1541 struct mvs_slot_info *slot = task->lldd_task; in mvs_abort_task()
1545 mvi, task, slot, slot_idx); in mvs_abort_task()
1546 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in mvs_abort_task()
1547 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_abort_task()
1592 static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task, in mvs_sata_done() argument
1595 struct mvs_device *mvi_dev = task->dev->lldd_dev; in mvs_sata_done()
1596 struct task_status_struct *tstat = &task->task_status; in mvs_sata_done()
1666 static int mvs_slot_err(struct mvs_info *mvi, struct sas_task *task, in mvs_slot_err() argument
1682 switch (task->task_proto) { in mvs_slot_err()
1690 sas_ssp_task_response(mvi->dev, task, iu); in mvs_slot_err()
1705 task->ata_task.use_ncq = 0; in mvs_slot_err()
1707 mvs_sata_done(mvi, task, slot_idx, err_dw0); in mvs_slot_err()
1721 struct sas_task *task = slot->task; in mvs_slot_complete() local
1730 if (unlikely(!task || !task->lldd_task || !task->dev)) in mvs_slot_complete()
1733 tstat = &task->task_status; in mvs_slot_complete()
1734 dev = task->dev; in mvs_slot_complete()
1737 spin_lock(&task->task_state_lock); in mvs_slot_complete()
1738 task->task_state_flags &= in mvs_slot_complete()
1740 task->task_state_flags |= SAS_TASK_STATE_DONE; in mvs_slot_complete()
1742 aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED; in mvs_slot_complete()
1743 spin_unlock(&task->task_state_lock); in mvs_slot_complete()
1752 if (sas_protocol_ata(task->task_proto)) in mvs_slot_complete()
1755 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_slot_complete()
1777 tstat->stat = mvs_slot_err(mvi, task, slot_idx); in mvs_slot_complete()
1782 switch (task->task_proto) { in mvs_slot_complete()
1793 sas_ssp_task_response(mvi->dev, task, iu); in mvs_slot_complete()
1799 struct scatterlist *sg_resp = &task->smp_task.smp_resp; in mvs_slot_complete()
1812 tstat->stat = mvs_sata_done(mvi, task, slot_idx, 0); in mvs_slot_complete()
1829 if (sas_protocol_ata(task->task_proto) && !mvi_dev->running_req) in mvs_slot_complete()
1832 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_slot_complete()
1836 if (task->task_done) in mvs_slot_complete()
1837 task->task_done(task); in mvs_slot_complete()
1862 struct sas_task *task; in mvs_do_release_task() local
1864 task = slot->task; in mvs_do_release_task()
1866 if (dev && task->dev != dev) in mvs_do_release_task()
1870 slot_idx, slot->slot_tag, task); in mvs_do_release_task()