• Home
  • Raw
  • Download

Lines Matching refs:dma

74 	struct rsxx_dma	*dma;  member
114 static unsigned int get_dma_size(struct rsxx_dma *dma) in get_dma_size() argument
116 if (dma->sub_page.cnt) in get_dma_size()
117 return dma->sub_page.cnt << 9; in get_dma_size()
126 struct rsxx_dma *dma) in set_tracker_dma() argument
128 trackers->list[tag].dma = dma; in set_tracker_dma()
134 return trackers->list[tag].dma; in get_tracker_dma()
157 trackers->list[tag].dma = NULL; in push_tracker()
210 static void rsxx_free_dma(struct rsxx_dma_ctrl *ctrl, struct rsxx_dma *dma) in rsxx_free_dma() argument
212 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_free_dma()
213 if (!dma_mapping_error(&ctrl->card->dev->dev, dma->dma_addr)) { in rsxx_free_dma()
214 dma_unmap_page(&ctrl->card->dev->dev, dma->dma_addr, in rsxx_free_dma()
215 get_dma_size(dma), in rsxx_free_dma()
216 dma->cmd == HW_CMD_BLK_WRITE ? in rsxx_free_dma()
222 kmem_cache_free(rsxx_dma_pool, dma); in rsxx_free_dma()
226 struct rsxx_dma *dma, in rsxx_complete_dma() argument
236 if (dma->cb) in rsxx_complete_dma()
237 dma->cb(ctrl->card, dma->cb_data, status ? 1 : 0); in rsxx_complete_dma()
239 rsxx_free_dma(ctrl, dma); in rsxx_complete_dma()
245 struct rsxx_dma *dma; in rsxx_cleanup_dma_queue() local
249 list_for_each_entry_safe(dma, tmp, q, list) { in rsxx_cleanup_dma_queue()
250 list_del(&dma->list); in rsxx_cleanup_dma_queue()
252 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_cleanup_dma_queue()
254 rsxx_free_dma(ctrl, dma); in rsxx_cleanup_dma_queue()
262 struct rsxx_dma *dma) in rsxx_requeue_dma() argument
270 list_add(&dma->list, &ctrl->queue); in rsxx_requeue_dma()
275 struct rsxx_dma *dma, in rsxx_handle_dma_error() argument
283 dma->cmd, dma->laddr, hw_st); in rsxx_handle_dma_error()
292 switch (dma->cmd) { in rsxx_handle_dma_error()
296 dma->cmd = HW_CMD_BLK_RECON_READ; in rsxx_handle_dma_error()
331 dma->cmd, dma->laddr, hw_st); in rsxx_handle_dma_error()
338 rsxx_requeue_dma(ctrl, dma); in rsxx_handle_dma_error()
340 rsxx_complete_dma(ctrl, dma, status); in rsxx_handle_dma_error()
384 struct rsxx_dma *dma; in rsxx_issue_dmas() local
409 dma = list_entry(ctrl->queue.next, struct rsxx_dma, list); in rsxx_issue_dmas()
410 list_del(&dma->list); in rsxx_issue_dmas()
421 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_issue_dmas()
425 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_issue_dmas()
426 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_issue_dmas()
441 dma->dma_addr = dma_map_page(&ctrl->card->dev->dev, dma->page, in rsxx_issue_dmas()
442 dma->pg_off, dma->sub_page.cnt << 9, dir); in rsxx_issue_dmas()
443 if (dma_mapping_error(&ctrl->card->dev->dev, dma->dma_addr)) { in rsxx_issue_dmas()
445 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_issue_dmas()
450 set_tracker_dma(ctrl->trackers, tag, dma); in rsxx_issue_dmas()
451 hw_cmd_buf[ctrl->cmd.idx].command = dma->cmd; in rsxx_issue_dmas()
455 ((dma->sub_page.cnt & 0x7) << 4) | in rsxx_issue_dmas()
456 (dma->sub_page.off & 0x7); in rsxx_issue_dmas()
459 cpu_to_le32(dma->laddr); in rsxx_issue_dmas()
462 cpu_to_le64(dma->dma_addr); in rsxx_issue_dmas()
466 ctrl->id, dma->laddr, tag, ctrl->cmd.idx); in rsxx_issue_dmas()
471 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_issue_dmas()
473 else if (dma->cmd == HW_CMD_BLK_DISCARD) in rsxx_issue_dmas()
496 struct rsxx_dma *dma; in rsxx_dma_done() local
525 dma = get_tracker_dma(ctrl->trackers, tag); in rsxx_dma_done()
526 if (dma == NULL) { in rsxx_dma_done()
541 ctrl->id, dma->laddr, tag, status, count, in rsxx_dma_done()
550 rsxx_handle_dma_error(ctrl, dma, status); in rsxx_dma_done()
552 rsxx_complete_dma(ctrl, dma, 0); in rsxx_dma_done()
606 struct rsxx_dma *dma; in rsxx_queue_discard() local
608 dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL); in rsxx_queue_discard()
609 if (!dma) in rsxx_queue_discard()
612 dma->cmd = HW_CMD_BLK_DISCARD; in rsxx_queue_discard()
613 dma->laddr = laddr; in rsxx_queue_discard()
614 dma->dma_addr = 0; in rsxx_queue_discard()
615 dma->sub_page.off = 0; in rsxx_queue_discard()
616 dma->sub_page.cnt = 0; in rsxx_queue_discard()
617 dma->page = NULL; in rsxx_queue_discard()
618 dma->pg_off = 0; in rsxx_queue_discard()
619 dma->cb = cb; in rsxx_queue_discard()
620 dma->cb_data = cb_data; in rsxx_queue_discard()
622 dev_dbg(CARD_TO_DEV(card), "Queuing[D] laddr %x\n", dma->laddr); in rsxx_queue_discard()
624 list_add_tail(&dma->list, q); in rsxx_queue_discard()
640 struct rsxx_dma *dma; in rsxx_queue_dma() local
642 dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL); in rsxx_queue_dma()
643 if (!dma) in rsxx_queue_dma()
646 dma->cmd = dir ? HW_CMD_BLK_WRITE : HW_CMD_BLK_READ; in rsxx_queue_dma()
647 dma->laddr = laddr; in rsxx_queue_dma()
648 dma->sub_page.off = (dma_off >> 9); in rsxx_queue_dma()
649 dma->sub_page.cnt = (dma_len >> 9); in rsxx_queue_dma()
650 dma->page = page; in rsxx_queue_dma()
651 dma->pg_off = pg_off; in rsxx_queue_dma()
652 dma->cb = cb; in rsxx_queue_dma()
653 dma->cb_data = cb_data; in rsxx_queue_dma()
657 dir ? 'W' : 'R', dma->laddr, dma->sub_page.off, in rsxx_queue_dma()
658 dma->sub_page.cnt, dma->page, dma->pg_off); in rsxx_queue_dma()
661 list_add_tail(&dma->list, q); in rsxx_queue_dma()
818 ctrl->trackers->list[i].dma = NULL; in rsxx_dma_ctrl_init()
964 struct rsxx_dma *dma; in rsxx_dma_cancel() local
970 dma = get_tracker_dma(ctrl->trackers, i); in rsxx_dma_cancel()
971 if (dma) { in rsxx_dma_cancel()
973 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_dma_cancel()
1024 struct rsxx_dma *dma; in rsxx_eeh_save_issued_dmas() local
1036 dma = get_tracker_dma(card->ctrl[i].trackers, j); in rsxx_eeh_save_issued_dmas()
1037 if (dma == NULL) in rsxx_eeh_save_issued_dmas()
1040 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_eeh_save_issued_dmas()
1042 else if (dma->cmd == HW_CMD_BLK_DISCARD) in rsxx_eeh_save_issued_dmas()
1047 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_eeh_save_issued_dmas()
1048 dma_unmap_page(&card->dev->dev, dma->dma_addr, in rsxx_eeh_save_issued_dmas()
1049 get_dma_size(dma), in rsxx_eeh_save_issued_dmas()
1050 dma->cmd == HW_CMD_BLK_WRITE ? in rsxx_eeh_save_issued_dmas()
1055 list_add_tail(&dma->list, &issued_dmas[i]); in rsxx_eeh_save_issued_dmas()