Lines Matching refs:task
12 static int mvs_find_tag(struct mvs_info *mvi, struct sas_task *task, u32 *tag) in mvs_find_tag() argument
14 if (task->lldd_task) { in mvs_find_tag()
16 slot = task->lldd_task; in mvs_find_tag()
304 struct sas_task *task = tei->task; in mvs_task_prep_smp() local
306 struct domain_device *dev = task->dev; in mvs_task_prep_smp()
322 sg_req = &task->smp_task.smp_req; in mvs_task_prep_smp()
328 sg_resp = &task->smp_task.smp_resp; in mvs_task_prep_smp()
397 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_smp()
402 dma_unmap_sg(mvi->dev, &tei->task->smp_task.smp_resp, 1, in mvs_task_prep_smp()
405 dma_unmap_sg(mvi->dev, &tei->task->smp_task.smp_req, 1, in mvs_task_prep_smp()
410 static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag) in mvs_get_ncq_tag() argument
412 struct ata_queued_cmd *qc = task->uldd_task; in mvs_get_ncq_tag()
431 struct sas_task *task = tei->task; in mvs_task_prep_ata() local
432 struct domain_device *dev = task->dev; in mvs_task_prep_ata()
459 if (task->data_dir == DMA_FROM_DEVICE) in mvs_task_prep_ata()
464 if (task->ata_task.use_ncq) in mvs_task_prep_ata()
467 if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI) in mvs_task_prep_ata()
473 if (task->ata_task.use_ncq && mvs_get_ncq_tag(task, &hdr_tag)) in mvs_task_prep_ata()
474 task->ata_task.fis.sector_count |= (u8) (hdr_tag << 3); in mvs_task_prep_ata()
480 hdr->data_len = cpu_to_le32(task->total_xfer_len); in mvs_task_prep_ata()
529 if (likely(!task->ata_task.device_control_reg_update)) in mvs_task_prep_ata()
530 task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */ in mvs_task_prep_ata()
532 memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis)); in mvs_task_prep_ata()
535 task->ata_task.atapi_packet, 16); in mvs_task_prep_ata()
545 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_ata()
547 if (task->data_dir == DMA_FROM_DEVICE) in mvs_task_prep_ata()
558 struct sas_task *task = tei->task; in mvs_task_prep_ssp() local
561 struct domain_device *dev = task->dev; in mvs_task_prep_ssp()
586 if (task->ssp_task.enable_first_burst) { in mvs_task_prep_ssp()
597 hdr->data_len = cpu_to_le32(task->total_xfer_len); in mvs_task_prep_ssp()
668 memcpy(buf_cmd, &task->ssp_task.LUN, 8); in mvs_task_prep_ssp()
671 buf_cmd[9] = fburst | task->ssp_task.task_attr | in mvs_task_prep_ssp()
672 (task->ssp_task.task_prio << 3); in mvs_task_prep_ssp()
673 memcpy(buf_cmd + 12, task->ssp_task.cmd->cmnd, in mvs_task_prep_ssp()
674 task->ssp_task.cmd->cmd_len); in mvs_task_prep_ssp()
690 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd); in mvs_task_prep_ssp()
695 static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmf, in mvs_task_prep() argument
698 struct domain_device *dev = task->dev; in mvs_task_prep()
706 struct task_status_struct *tsm = &task->task_status; in mvs_task_prep()
715 task->task_done(task); in mvs_task_prep()
732 if (sas_protocol_ata(task->task_proto)) { in mvs_task_prep()
733 struct task_status_struct *ts = &task->task_status; in mvs_task_prep()
739 task->task_done(task); in mvs_task_prep()
742 struct task_status_struct *ts = &task->task_status; in mvs_task_prep()
747 task->task_done(task); in mvs_task_prep()
752 if (!sas_protocol_ata(task->task_proto)) { in mvs_task_prep()
753 if (task->num_scatter) { in mvs_task_prep()
755 task->scatter, in mvs_task_prep()
756 task->num_scatter, in mvs_task_prep()
757 task->data_dir); in mvs_task_prep()
764 n_elem = task->num_scatter; in mvs_task_prep()
773 task->lldd_task = NULL; in mvs_task_prep()
783 tei.task = task; in mvs_task_prep()
787 switch (task->task_proto) { in mvs_task_prep()
802 task->task_proto); in mvs_task_prep()
811 slot->task = task; in mvs_task_prep()
813 task->lldd_task = slot; in mvs_task_prep()
815 spin_lock(&task->task_state_lock); in mvs_task_prep()
816 task->task_state_flags |= SAS_TASK_AT_INITIATOR; in mvs_task_prep()
817 spin_unlock(&task->task_state_lock); in mvs_task_prep()
832 if (!sas_protocol_ata(task->task_proto)) in mvs_task_prep()
834 dma_unmap_sg(mvi->dev, task->scatter, n_elem, in mvs_task_prep()
835 task->data_dir); in mvs_task_prep()
840 static int mvs_task_exec(struct sas_task *task, gfp_t gfp_flags, in mvs_task_exec() argument
849 mvi = ((struct mvs_device *)task->dev->lldd_dev)->mvi_info; in mvs_task_exec()
852 rc = mvs_task_prep(task, mvi, is_tmf, tmf, &pass); in mvs_task_exec()
864 int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags) in mvs_queue_command() argument
866 return mvs_task_exec(task, gfp_flags, NULL, 0, NULL); in mvs_queue_command()
875 static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task, in mvs_slot_task_free() argument
880 if (!slot->task) in mvs_slot_task_free()
882 if (!sas_protocol_ata(task->task_proto)) in mvs_slot_task_free()
884 dma_unmap_sg(mvi->dev, task->scatter, in mvs_slot_task_free()
885 slot->n_elem, task->data_dir); in mvs_slot_task_free()
887 switch (task->task_proto) { in mvs_slot_task_free()
889 dma_unmap_sg(mvi->dev, &task->smp_task.smp_resp, 1, in mvs_slot_task_free()
891 dma_unmap_sg(mvi->dev, &task->smp_task.smp_req, 1, in mvs_slot_task_free()
908 task->lldd_task = NULL; in mvs_slot_task_free()
909 slot->task = NULL; in mvs_slot_task_free()
1262 static void mvs_task_done(struct sas_task *task) in mvs_task_done() argument
1264 if (!del_timer(&task->slow_task->timer)) in mvs_task_done()
1266 complete(&task->slow_task->completion); in mvs_task_done()
1272 struct sas_task *task = slow->task; in mvs_tmf_timedout() local
1274 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in mvs_tmf_timedout()
1275 complete(&task->slow_task->completion); in mvs_tmf_timedout()
1283 struct sas_task *task = NULL; in mvs_exec_internal_tmf_task() local
1286 task = sas_alloc_slow_task(GFP_KERNEL); in mvs_exec_internal_tmf_task()
1287 if (!task) in mvs_exec_internal_tmf_task()
1290 task->dev = dev; in mvs_exec_internal_tmf_task()
1291 task->task_proto = dev->tproto; in mvs_exec_internal_tmf_task()
1293 memcpy(&task->ssp_task, parameter, para_len); in mvs_exec_internal_tmf_task()
1294 task->task_done = mvs_task_done; in mvs_exec_internal_tmf_task()
1296 task->slow_task->timer.function = mvs_tmf_timedout; in mvs_exec_internal_tmf_task()
1297 task->slow_task->timer.expires = jiffies + MVS_TASK_TIMEOUT*HZ; in mvs_exec_internal_tmf_task()
1298 add_timer(&task->slow_task->timer); in mvs_exec_internal_tmf_task()
1300 res = mvs_task_exec(task, GFP_KERNEL, NULL, 1, tmf); in mvs_exec_internal_tmf_task()
1303 del_timer(&task->slow_task->timer); in mvs_exec_internal_tmf_task()
1308 wait_for_completion(&task->slow_task->completion); in mvs_exec_internal_tmf_task()
1311 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { in mvs_exec_internal_tmf_task()
1312 if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { in mvs_exec_internal_tmf_task()
1318 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1319 task->task_status.stat == SAM_STAT_GOOD) { in mvs_exec_internal_tmf_task()
1324 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1325 task->task_status.stat == SAS_DATA_UNDERRUN) { in mvs_exec_internal_tmf_task()
1328 res = task->task_status.residual; in mvs_exec_internal_tmf_task()
1332 if (task->task_status.resp == SAS_TASK_COMPLETE && in mvs_exec_internal_tmf_task()
1333 task->task_status.stat == SAS_DATA_OVERRUN) { in mvs_exec_internal_tmf_task()
1341 task->task_status.resp, in mvs_exec_internal_tmf_task()
1342 task->task_status.stat); in mvs_exec_internal_tmf_task()
1343 sas_free_task(task); in mvs_exec_internal_tmf_task()
1344 task = NULL; in mvs_exec_internal_tmf_task()
1349 BUG_ON(retry == 3 && task != NULL); in mvs_exec_internal_tmf_task()
1350 sas_free_task(task); in mvs_exec_internal_tmf_task()
1427 int mvs_query_task(struct sas_task *task) in mvs_query_task() argument
1434 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { in mvs_query_task()
1435 struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task; in mvs_query_task()
1436 struct domain_device *dev = task->dev; in mvs_query_task()
1441 rc = mvs_find_tag(mvi, task, &tag); in mvs_query_task()
1465 int mvs_abort_task(struct sas_task *task) in mvs_abort_task() argument
1469 struct domain_device *dev = task->dev; in mvs_abort_task()
1483 spin_lock_irqsave(&task->task_state_lock, flags); in mvs_abort_task()
1484 if (task->task_state_flags & SAS_TASK_STATE_DONE) { in mvs_abort_task()
1485 spin_unlock_irqrestore(&task->task_state_lock, flags); in mvs_abort_task()
1489 spin_unlock_irqrestore(&task->task_state_lock, flags); in mvs_abort_task()
1491 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { in mvs_abort_task()
1492 struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task; in mvs_abort_task()
1495 rc = mvs_find_tag(mvi, task, &tag); in mvs_abort_task()
1512 if (task->lldd_task) { in mvs_abort_task()
1513 slot = task->lldd_task; in mvs_abort_task()
1521 } else if (task->task_proto & SAS_PROTOCOL_SATA || in mvs_abort_task()
1522 task->task_proto & SAS_PROTOCOL_STP) { in mvs_abort_task()
1524 struct mvs_slot_info *slot = task->lldd_task; in mvs_abort_task()
1528 mvi, task, slot, slot_idx); in mvs_abort_task()
1529 task->task_state_flags |= SAS_TASK_STATE_ABORTED; in mvs_abort_task()
1530 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_abort_task()
1575 static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task, in mvs_sata_done() argument
1578 struct mvs_device *mvi_dev = task->dev->lldd_dev; in mvs_sata_done()
1579 struct task_status_struct *tstat = &task->task_status; in mvs_sata_done()
1649 static int mvs_slot_err(struct mvs_info *mvi, struct sas_task *task, in mvs_slot_err() argument
1665 switch (task->task_proto) { in mvs_slot_err()
1673 sas_ssp_task_response(mvi->dev, task, iu); in mvs_slot_err()
1688 task->ata_task.use_ncq = 0; in mvs_slot_err()
1690 mvs_sata_done(mvi, task, slot_idx, err_dw0); in mvs_slot_err()
1704 struct sas_task *task = slot->task; in mvs_slot_complete() local
1713 if (unlikely(!task || !task->lldd_task || !task->dev)) in mvs_slot_complete()
1716 tstat = &task->task_status; in mvs_slot_complete()
1717 dev = task->dev; in mvs_slot_complete()
1720 spin_lock(&task->task_state_lock); in mvs_slot_complete()
1721 task->task_state_flags &= in mvs_slot_complete()
1723 task->task_state_flags |= SAS_TASK_STATE_DONE; in mvs_slot_complete()
1725 aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED; in mvs_slot_complete()
1726 spin_unlock(&task->task_state_lock); in mvs_slot_complete()
1735 if (sas_protocol_ata(task->task_proto)) in mvs_slot_complete()
1738 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_slot_complete()
1760 tstat->stat = mvs_slot_err(mvi, task, slot_idx); in mvs_slot_complete()
1765 switch (task->task_proto) { in mvs_slot_complete()
1776 sas_ssp_task_response(mvi->dev, task, iu); in mvs_slot_complete()
1782 struct scatterlist *sg_resp = &task->smp_task.smp_resp; in mvs_slot_complete()
1795 tstat->stat = mvs_sata_done(mvi, task, slot_idx, 0); in mvs_slot_complete()
1812 if (sas_protocol_ata(task->task_proto) && !mvi_dev->running_req) in mvs_slot_complete()
1815 mvs_slot_task_free(mvi, task, slot, slot_idx); in mvs_slot_complete()
1819 if (task->task_done) in mvs_slot_complete()
1820 task->task_done(task); in mvs_slot_complete()
1845 struct sas_task *task; in mvs_do_release_task() local
1847 task = slot->task; in mvs_do_release_task()
1849 if (dev && task->dev != dev) in mvs_do_release_task()
1853 slot_idx, slot->slot_tag, task); in mvs_do_release_task()