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()
444 struct sas_task *task = tei->task; in mvs_task_prep_ata() local
445 struct domain_device *dev = task->dev; in mvs_task_prep_ata()
472 if (task->data_dir == DMA_FROM_DEVICE) in mvs_task_prep_ata()
477 if (task->ata_task.use_ncq) in mvs_task_prep_ata()
480 if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI) in mvs_task_prep_ata()
486 if (task->ata_task.use_ncq && mvs_get_ncq_tag(task, &hdr_tag)) in mvs_task_prep_ata()
487 task->ata_task.fis.sector_count |= (u8) (hdr_tag << 3); in mvs_task_prep_ata()
493 hdr->data_len = cpu_to_le32(task->total_xfer_len); in mvs_task_prep_ata()
542 if (likely(!task->ata_task.device_control_reg_update)) in mvs_task_prep_ata()
543 task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */ in mvs_task_prep_ata()
545 memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis)); in mvs_task_prep_ata()
548 task->ata_task.atapi_packet, 16); in mvs_task_prep_ata()
558 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_ata()
560 if (task->data_dir == DMA_FROM_DEVICE) in mvs_task_prep_ata()
571 struct sas_task *task = tei->task; in mvs_task_prep_ssp() local
574 struct domain_device *dev = task->dev; in mvs_task_prep_ssp()
599 if (task->ssp_task.enable_first_burst) { in mvs_task_prep_ssp()
610 hdr->data_len = cpu_to_le32(task->total_xfer_len); in mvs_task_prep_ssp()
681 memcpy(buf_cmd, &task->ssp_task.LUN, 8); in mvs_task_prep_ssp()
684 buf_cmd[9] = fburst | task->ssp_task.task_attr | in mvs_task_prep_ssp()
685 (task->ssp_task.task_prio << 3); in mvs_task_prep_ssp()
686 memcpy(buf_cmd + 12, task->ssp_task.cmd->cmnd, in mvs_task_prep_ssp()
687 task->ssp_task.cmd->cmd_len); in mvs_task_prep_ssp()
703 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_ssp()
708 static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmf, in mvs_task_prep() argument
711 struct domain_device *dev = task->dev; in mvs_task_prep()
719 struct task_status_struct *tsm = &task->task_status; in mvs_task_prep()
728 task->task_done(task); in mvs_task_prep()
745 if (sas_protocol_ata(task->task_proto)) { in mvs_task_prep()
746 struct task_status_struct *ts = &task->task_status; in mvs_task_prep()
752 task->task_done(task); in mvs_task_prep()
755 struct task_status_struct *ts = &task->task_status; in mvs_task_prep()
760 task->task_done(task); in mvs_task_prep()
765 if (!sas_protocol_ata(task->task_proto)) { in mvs_task_prep()
766 if (task->num_scatter) { in mvs_task_prep()
768 task->scatter, in mvs_task_prep()
769 task->num_scatter, in mvs_task_prep()
770 task->data_dir); in mvs_task_prep()
777 n_elem = task->num_scatter; in mvs_task_prep()
786 task->lldd_task = NULL; in mvs_task_prep()
795 tei.task = task; in mvs_task_prep()
799 switch (task->task_proto) { in mvs_task_prep()
814 task->task_proto); in mvs_task_prep()
823 slot->task = task; in mvs_task_prep()
825 task->lldd_task = slot; in mvs_task_prep()
827 spin_lock(&task->task_state_lock); in mvs_task_prep()
828 task->task_state_flags |= SAS_TASK_AT_INITIATOR; in mvs_task_prep()
829 spin_unlock(&task->task_state_lock); in mvs_task_prep()
844 if (!sas_protocol_ata(task->task_proto)) in mvs_task_prep()
846 dma_unmap_sg(mvi->dev, task->scatter, n_elem, in mvs_task_prep()
847 task->data_dir); in mvs_task_prep()
852 static int mvs_task_exec(struct sas_task *task, gfp_t gfp_flags, in mvs_task_exec() argument
861 mvi = ((struct mvs_device *)task->dev->lldd_dev)->mvi_info; in mvs_task_exec()
864 rc = mvs_task_prep(task, mvi, is_tmf, tmf, &pass); in mvs_task_exec()
876 int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags) in mvs_queue_command() argument
878 return mvs_task_exec(task, gfp_flags, NULL, 0, NULL); in mvs_queue_command()
887 static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task, in mvs_slot_task_free() argument
892 if (!slot->task) in mvs_slot_task_free()
894 if (!sas_protocol_ata(task->task_proto)) in mvs_slot_task_free()
896 dma_unmap_sg(mvi->dev, task->scatter, in mvs_slot_task_free()
897 slot->n_elem, task->data_dir); in mvs_slot_task_free()
899 switch (task->task_proto) { in mvs_slot_task_free()
901 dma_unmap_sg(mvi->dev, &task->smp_task.smp_resp, 1, in mvs_slot_task_free()
903 dma_unmap_sg(mvi->dev, &task->smp_task.smp_req, 1, in mvs_slot_task_free()
920 task->lldd_task = NULL; in mvs_slot_task_free()
921 slot->task = NULL; in mvs_slot_task_free()
1274 static void mvs_task_done(struct sas_task *task) in mvs_task_done() argument
1276 if (!del_timer(&task->slow_task->timer)) in mvs_task_done()
1278 complete(&task->slow_task->completion); in mvs_task_done()
1283 struct sas_task *task = (struct sas_task *)data; in mvs_tmf_timedout() local
1285 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in mvs_tmf_timedout()
1286 complete(&task->slow_task->completion); in mvs_tmf_timedout()
1294 struct sas_task *task = NULL; in mvs_exec_internal_tmf_task() local
1297 task = sas_alloc_slow_task(GFP_KERNEL); in mvs_exec_internal_tmf_task()
1298 if (!task) in mvs_exec_internal_tmf_task()
1301 task->dev = dev; in mvs_exec_internal_tmf_task()
1302 task->task_proto = dev->tproto; in mvs_exec_internal_tmf_task()
1304 memcpy(&task->ssp_task, parameter, para_len); in mvs_exec_internal_tmf_task()
1305 task->task_done = mvs_task_done; in mvs_exec_internal_tmf_task()
1307 task->slow_task->timer.data = (unsigned long) task; in mvs_exec_internal_tmf_task()
1308 task->slow_task->timer.function = mvs_tmf_timedout; in mvs_exec_internal_tmf_task()
1309 task->slow_task->timer.expires = jiffies + MVS_TASK_TIMEOUT*HZ; in mvs_exec_internal_tmf_task()
1310 add_timer(&task->slow_task->timer); in mvs_exec_internal_tmf_task()
1312 res = mvs_task_exec(task, GFP_KERNEL, NULL, 1, tmf); in mvs_exec_internal_tmf_task()
1315 del_timer(&task->slow_task->timer); in mvs_exec_internal_tmf_task()
1320 wait_for_completion(&task->slow_task->completion); in mvs_exec_internal_tmf_task()
1323 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { in mvs_exec_internal_tmf_task()
1324 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in mvs_exec_internal_tmf_task()
1330 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1331 task->task_status.stat == SAM_STAT_GOOD) { in mvs_exec_internal_tmf_task()
1336 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1337 task->task_status.stat == SAS_DATA_UNDERRUN) { in mvs_exec_internal_tmf_task()
1340 res = task->task_status.residual; in mvs_exec_internal_tmf_task()
1344 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1345 task->task_status.stat == SAS_DATA_OVERRUN) { in mvs_exec_internal_tmf_task()
1353 task->task_status.resp, in mvs_exec_internal_tmf_task()
1354 task->task_status.stat); in mvs_exec_internal_tmf_task()
1355 sas_free_task(task); in mvs_exec_internal_tmf_task()
1356 task = NULL; in mvs_exec_internal_tmf_task()
1361 BUG_ON(retry == 3 && task != NULL); in mvs_exec_internal_tmf_task()
1362 sas_free_task(task); in mvs_exec_internal_tmf_task()
1439 int mvs_query_task(struct sas_task *task) in mvs_query_task() argument
1446 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { in mvs_query_task()
1447 struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task; in mvs_query_task()
1448 struct domain_device *dev = task->dev; in mvs_query_task()
1453 rc = mvs_find_tag(mvi, task, &tag); in mvs_query_task()
1477 int mvs_abort_task(struct sas_task *task) in mvs_abort_task() argument
1481 struct domain_device *dev = task->dev; in mvs_abort_task()
1495 spin_lock_irqsave(&task->task_state_lock, flags); in mvs_abort_task()
1496 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in mvs_abort_task()
1497 spin_unlock_irqrestore(&task->task_state_lock, flags); in mvs_abort_task()
1501 spin_unlock_irqrestore(&task->task_state_lock, flags); in mvs_abort_task()
1503 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { in mvs_abort_task()
1504 struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task; in mvs_abort_task()
1507 rc = mvs_find_tag(mvi, task, &tag); in mvs_abort_task()
1524 if (task->lldd_task) { in mvs_abort_task()
1525 slot = task->lldd_task; in mvs_abort_task()
1533 } else if (task->task_proto & SAS_PROTOCOL_SATA || in mvs_abort_task()
1534 task->task_proto & SAS_PROTOCOL_STP) { in mvs_abort_task()
1536 struct mvs_slot_info *slot = task->lldd_task; in mvs_abort_task()
1540 mvi, task, slot, slot_idx); in mvs_abort_task()
1541 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in mvs_abort_task()
1542 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_abort_task()
1587 static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task, in mvs_sata_done() argument
1590 struct mvs_device *mvi_dev = task->dev->lldd_dev; in mvs_sata_done()
1591 struct task_status_struct *tstat = &task->task_status; in mvs_sata_done()
1661 static int mvs_slot_err(struct mvs_info *mvi, struct sas_task *task, in mvs_slot_err() argument
1677 switch (task->task_proto) { in mvs_slot_err()
1685 sas_ssp_task_response(mvi->dev, task, iu); in mvs_slot_err()
1700 task->ata_task.use_ncq = 0; in mvs_slot_err()
1702 mvs_sata_done(mvi, task, slot_idx, err_dw0); in mvs_slot_err()
1716 struct sas_task *task = slot->task; in mvs_slot_complete() local
1725 if (unlikely(!task || !task->lldd_task || !task->dev)) in mvs_slot_complete()
1728 tstat = &task->task_status; in mvs_slot_complete()
1729 dev = task->dev; in mvs_slot_complete()
1732 spin_lock(&task->task_state_lock); in mvs_slot_complete()
1733 task->task_state_flags &= in mvs_slot_complete()
1735 task->task_state_flags |= SAS_TASK_STATE_DONE; in mvs_slot_complete()
1737 aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED; in mvs_slot_complete()
1738 spin_unlock(&task->task_state_lock); in mvs_slot_complete()
1747 if (sas_protocol_ata(task->task_proto)) in mvs_slot_complete()
1750 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_slot_complete()
1772 tstat->stat = mvs_slot_err(mvi, task, slot_idx); in mvs_slot_complete()
1777 switch (task->task_proto) { in mvs_slot_complete()
1788 sas_ssp_task_response(mvi->dev, task, iu); in mvs_slot_complete()
1794 struct scatterlist *sg_resp = &task->smp_task.smp_resp; in mvs_slot_complete()
1807 tstat->stat = mvs_sata_done(mvi, task, slot_idx, 0); in mvs_slot_complete()
1824 if (sas_protocol_ata(task->task_proto) && !mvi_dev->running_req) in mvs_slot_complete()
1827 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_slot_complete()
1831 if (task->task_done) in mvs_slot_complete()
1832 task->task_done(task); in mvs_slot_complete()
1857 struct sas_task *task; in mvs_do_release_task() local
1859 task = slot->task; in mvs_do_release_task()
1861 if (dev && task->dev != dev) in mvs_do_release_task()
1865 slot_idx, slot->slot_tag, task); in mvs_do_release_task()