Lines Matching defs:task

12 static int mvs_find_tag(struct mvs_info *mvi, struct sas_task *task, u32 *tag)
14 if (task->lldd_task) {
16 slot = task->lldd_task;
303 struct sas_task *task = tei->task;
305 struct domain_device *dev = task->dev;
321 sg_req = &task->smp_task.smp_req;
327 sg_resp = &task->smp_task.smp_resp;
396 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd);
401 dma_unmap_sg(mvi->dev, &tei->task->smp_task.smp_resp, 1,
404 dma_unmap_sg(mvi->dev, &tei->task->smp_task.smp_req, 1,
409 static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag)
411 struct ata_queued_cmd *qc = task->uldd_task;
430 struct sas_task *task = tei->task;
431 struct domain_device *dev = task->dev;
458 if (task->data_dir == DMA_FROM_DEVICE)
463 if (task->ata_task.use_ncq)
466 if (task->ata_task.fis.command != ATA_CMD_ID_ATAPI)
472 if (task->ata_task.use_ncq && mvs_get_ncq_tag(task, &hdr_tag))
473 task->ata_task.fis.sector_count |= (u8) (hdr_tag << 3);
479 hdr->data_len = cpu_to_le32(task->total_xfer_len);
528 if (likely(!task->ata_task.device_control_reg_update))
529 task->ata_task.fis.flags |= 0x80; /* C=1: update ATA cmd reg */
531 memcpy(buf_cmd, &task->ata_task.fis, sizeof(struct host_to_dev_fis));
534 task->ata_task.atapi_packet, 16);
544 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd);
546 if (task->data_dir == DMA_FROM_DEVICE)
557 struct sas_task *task = tei->task;
560 struct domain_device *dev = task->dev;
592 hdr->data_len = cpu_to_le32(task->total_xfer_len);
663 memcpy(buf_cmd, &task->ssp_task.LUN, 8);
666 buf_cmd[9] = task->ssp_task.task_attr;
667 memcpy(buf_cmd + 12, task->ssp_task.cmd->cmnd,
668 task->ssp_task.cmd->cmd_len);
684 MVS_CHIP_DISP->make_prd(task->scatter, tei->n_elem, buf_prd);
689 static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmf,
692 struct domain_device *dev = task->dev;
701 struct task_status_struct *tsm = &task->task_status;
710 task->task_done(task);
727 if (sas_protocol_ata(task->task_proto)) {
728 struct task_status_struct *ts = &task->task_status;
734 task->task_done(task);
737 struct task_status_struct *ts = &task->task_status;
742 task->task_done(task);
747 if (!sas_protocol_ata(task->task_proto)) {
748 if (task->num_scatter) {
750 task->scatter,
751 task->num_scatter,
752 task->data_dir);
759 n_elem = task->num_scatter;
762 rq = sas_task_find_rq(task);
773 task->lldd_task = NULL;
783 tei.task = task;
787 switch (task->task_proto) {
802 task->task_proto);
811 slot->task = task;
813 task->lldd_task = slot;
829 if (!sas_protocol_ata(task->task_proto))
831 dma_unmap_sg(mvi->dev, task->scatter, n_elem,
832 task->data_dir);
837 int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags)
843 struct sas_tmf_task *tmf = task->tmf;
844 int is_tmf = !!task->tmf;
846 mvi = ((struct mvs_device *)task->dev->lldd_dev)->mvi_info;
849 rc = mvs_task_prep(task, mvi, is_tmf, tmf, &pass);
867 static void mvs_slot_task_free(struct mvs_info *mvi, struct sas_task *task,
872 if (!slot->task)
874 if (!sas_protocol_ata(task->task_proto))
876 dma_unmap_sg(mvi->dev, task->scatter,
877 slot->n_elem, task->data_dir);
879 switch (task->task_proto) {
881 dma_unmap_sg(mvi->dev, &task->smp_task.smp_resp, 1,
883 dma_unmap_sg(mvi->dev, &task->smp_task.smp_req, 1,
900 task->lldd_task = NULL;
901 slot->task = NULL;
1304 int mvs_query_task(struct sas_task *task)
1309 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
1310 struct domain_device *dev = task->dev;
1314 rc = mvs_find_tag(mvi, task, &tag);
1320 rc = sas_query_task(task, tag);
1322 /* The task is still in Lun, release it then */
1324 /* The task is not in Lun or failed, reset the phy */
1334 /* mandatory SAM-3, still need free task/slot info */
1335 int mvs_abort_task(struct sas_task *task)
1337 struct domain_device *dev = task->dev;
1351 spin_lock_irqsave(&task->task_state_lock, flags);
1352 if (task->task_state_flags & SAS_TASK_STATE_DONE) {
1353 spin_unlock_irqrestore(&task->task_state_lock, flags);
1357 spin_unlock_irqrestore(&task->task_state_lock, flags);
1359 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
1360 rc = mvs_find_tag(mvi, task, &tag);
1367 rc = sas_abort_task(task, tag);
1369 /* if successful, clear the task and callback forwards.*/
1374 if (task->lldd_task) {
1375 slot = task->lldd_task;
1383 } else if (task->task_proto & SAS_PROTOCOL_SATA ||
1384 task->task_proto & SAS_PROTOCOL_STP) {
1386 struct mvs_slot_info *slot = task->lldd_task;
1388 mv_dprintk("mvs_abort_task() mvi=%p task=%p "
1390 mvi, task, slot, slot_idx);
1391 task->task_state_flags |= SAS_TASK_STATE_ABORTED;
1392 mvs_slot_task_free(mvi, task, slot, slot_idx);
1404 static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task,
1407 struct mvs_device *mvi_dev = task->dev->lldd_dev;
1408 struct task_status_struct *tstat = &task->task_status;
1478 static int mvs_slot_err(struct mvs_info *mvi, struct sas_task *task,
1494 switch (task->task_proto) {
1502 sas_ssp_task_response(mvi->dev, task, iu);
1517 task->ata_task.use_ncq = 0;
1519 mvs_sata_done(mvi, task, slot_idx, err_dw0);
1533 struct sas_task *task = slot->task;
1542 if (unlikely(!task || !task->lldd_task || !task->dev))
1545 tstat = &task->task_status;
1546 dev = task->dev;
1549 spin_lock(&task->task_state_lock);
1550 task->task_state_flags &= ~SAS_TASK_STATE_PENDING;
1551 task->task_state_flags |= SAS_TASK_STATE_DONE;
1553 aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED;
1554 spin_unlock(&task->task_state_lock);
1563 if (sas_protocol_ata(task->task_proto))
1566 mvs_slot_task_free(mvi, task, slot, slot_idx);
1588 tstat->stat = mvs_slot_err(mvi, task, slot_idx);
1593 switch (task->task_proto) {
1604 sas_ssp_task_response(mvi->dev, task, iu);
1610 struct scatterlist *sg_resp = &task->smp_task.smp_resp;
1623 tstat->stat = mvs_sata_done(mvi, task, slot_idx, 0);
1640 if (sas_protocol_ata(task->task_proto) && !mvi_dev->running_req)
1643 mvs_slot_task_free(mvi, task, slot, slot_idx);
1647 if (task->task_done)
1648 task->task_done(task);
1673 struct sas_task *task;
1675 task = slot->task;
1677 if (dev && task->dev != dev)
1680 mv_printk("Release slot [%x] tag[%x], task [%p]:\n",
1681 slot_idx, slot->slot_tag, task);