Lines Matching refs:dma
74 struct rsxx_dma *dma; member
111 static unsigned int get_dma_size(struct rsxx_dma *dma) in get_dma_size() argument
113 if (dma->sub_page.cnt) in get_dma_size()
114 return dma->sub_page.cnt << 9; in get_dma_size()
123 struct rsxx_dma *dma) in set_tracker_dma() argument
125 trackers->list[tag].dma = dma; in set_tracker_dma()
131 return trackers->list[tag].dma; in get_tracker_dma()
154 trackers->list[tag].dma = NULL; in push_tracker()
207 static void rsxx_free_dma(struct rsxx_dma_ctrl *ctrl, struct rsxx_dma *dma) in rsxx_free_dma() argument
209 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_free_dma()
210 if (!dma_mapping_error(&ctrl->card->dev->dev, dma->dma_addr)) { in rsxx_free_dma()
211 dma_unmap_page(&ctrl->card->dev->dev, dma->dma_addr, in rsxx_free_dma()
212 get_dma_size(dma), in rsxx_free_dma()
213 dma->cmd == HW_CMD_BLK_WRITE ? in rsxx_free_dma()
219 kmem_cache_free(rsxx_dma_pool, dma); in rsxx_free_dma()
223 struct rsxx_dma *dma, in rsxx_complete_dma() argument
233 if (dma->cb) in rsxx_complete_dma()
234 dma->cb(ctrl->card, dma->cb_data, status ? 1 : 0); in rsxx_complete_dma()
236 rsxx_free_dma(ctrl, dma); in rsxx_complete_dma()
242 struct rsxx_dma *dma; in rsxx_cleanup_dma_queue() local
246 list_for_each_entry_safe(dma, tmp, q, list) { in rsxx_cleanup_dma_queue()
247 list_del(&dma->list); in rsxx_cleanup_dma_queue()
249 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_cleanup_dma_queue()
251 rsxx_free_dma(ctrl, dma); in rsxx_cleanup_dma_queue()
259 struct rsxx_dma *dma) in rsxx_requeue_dma() argument
267 list_add(&dma->list, &ctrl->queue); in rsxx_requeue_dma()
272 struct rsxx_dma *dma, in rsxx_handle_dma_error() argument
280 dma->cmd, dma->laddr, hw_st); in rsxx_handle_dma_error()
289 switch (dma->cmd) { in rsxx_handle_dma_error()
293 dma->cmd = HW_CMD_BLK_RECON_READ; in rsxx_handle_dma_error()
328 dma->cmd, dma->laddr, hw_st); in rsxx_handle_dma_error()
335 rsxx_requeue_dma(ctrl, dma); in rsxx_handle_dma_error()
337 rsxx_complete_dma(ctrl, dma, status); in rsxx_handle_dma_error()
381 struct rsxx_dma *dma; in rsxx_issue_dmas() local
406 dma = list_entry(ctrl->queue.next, struct rsxx_dma, list); in rsxx_issue_dmas()
407 list_del(&dma->list); in rsxx_issue_dmas()
418 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_issue_dmas()
422 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_issue_dmas()
423 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_issue_dmas()
438 dma->dma_addr = dma_map_page(&ctrl->card->dev->dev, dma->page, in rsxx_issue_dmas()
439 dma->pg_off, dma->sub_page.cnt << 9, dir); in rsxx_issue_dmas()
440 if (dma_mapping_error(&ctrl->card->dev->dev, dma->dma_addr)) { in rsxx_issue_dmas()
442 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_issue_dmas()
447 set_tracker_dma(ctrl->trackers, tag, dma); in rsxx_issue_dmas()
448 hw_cmd_buf[ctrl->cmd.idx].command = dma->cmd; in rsxx_issue_dmas()
452 ((dma->sub_page.cnt & 0x7) << 4) | in rsxx_issue_dmas()
453 (dma->sub_page.off & 0x7); in rsxx_issue_dmas()
456 cpu_to_le32(dma->laddr); in rsxx_issue_dmas()
459 cpu_to_le64(dma->dma_addr); in rsxx_issue_dmas()
463 ctrl->id, dma->laddr, tag, ctrl->cmd.idx); in rsxx_issue_dmas()
468 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_issue_dmas()
470 else if (dma->cmd == HW_CMD_BLK_DISCARD) in rsxx_issue_dmas()
493 struct rsxx_dma *dma; in rsxx_dma_done() local
522 dma = get_tracker_dma(ctrl->trackers, tag); in rsxx_dma_done()
523 if (dma == NULL) { in rsxx_dma_done()
538 ctrl->id, dma->laddr, tag, status, count, in rsxx_dma_done()
547 rsxx_handle_dma_error(ctrl, dma, status); in rsxx_dma_done()
549 rsxx_complete_dma(ctrl, dma, 0); in rsxx_dma_done()
603 struct rsxx_dma *dma; in rsxx_queue_discard() local
605 dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL); in rsxx_queue_discard()
606 if (!dma) in rsxx_queue_discard()
609 dma->cmd = HW_CMD_BLK_DISCARD; in rsxx_queue_discard()
610 dma->laddr = laddr; in rsxx_queue_discard()
611 dma->dma_addr = 0; in rsxx_queue_discard()
612 dma->sub_page.off = 0; in rsxx_queue_discard()
613 dma->sub_page.cnt = 0; in rsxx_queue_discard()
614 dma->page = NULL; in rsxx_queue_discard()
615 dma->pg_off = 0; in rsxx_queue_discard()
616 dma->cb = cb; in rsxx_queue_discard()
617 dma->cb_data = cb_data; in rsxx_queue_discard()
619 dev_dbg(CARD_TO_DEV(card), "Queuing[D] laddr %x\n", dma->laddr); in rsxx_queue_discard()
621 list_add_tail(&dma->list, q); in rsxx_queue_discard()
637 struct rsxx_dma *dma; in rsxx_queue_dma() local
639 dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL); in rsxx_queue_dma()
640 if (!dma) in rsxx_queue_dma()
643 dma->cmd = dir ? HW_CMD_BLK_WRITE : HW_CMD_BLK_READ; in rsxx_queue_dma()
644 dma->laddr = laddr; in rsxx_queue_dma()
645 dma->sub_page.off = (dma_off >> 9); in rsxx_queue_dma()
646 dma->sub_page.cnt = (dma_len >> 9); in rsxx_queue_dma()
647 dma->page = page; in rsxx_queue_dma()
648 dma->pg_off = pg_off; in rsxx_queue_dma()
649 dma->cb = cb; in rsxx_queue_dma()
650 dma->cb_data = cb_data; in rsxx_queue_dma()
654 dir ? 'W' : 'R', dma->laddr, dma->sub_page.off, in rsxx_queue_dma()
655 dma->sub_page.cnt, dma->page, dma->pg_off); in rsxx_queue_dma()
658 list_add_tail(&dma->list, q); in rsxx_queue_dma()
816 ctrl->trackers->list[i].dma = NULL; in rsxx_dma_ctrl_init()
961 struct rsxx_dma *dma; in rsxx_dma_cancel() local
967 dma = get_tracker_dma(ctrl->trackers, i); in rsxx_dma_cancel()
968 if (dma) { in rsxx_dma_cancel()
970 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_dma_cancel()
1021 struct rsxx_dma *dma; in rsxx_eeh_save_issued_dmas() local
1033 dma = get_tracker_dma(card->ctrl[i].trackers, j); in rsxx_eeh_save_issued_dmas()
1034 if (dma == NULL) in rsxx_eeh_save_issued_dmas()
1037 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_eeh_save_issued_dmas()
1039 else if (dma->cmd == HW_CMD_BLK_DISCARD) in rsxx_eeh_save_issued_dmas()
1044 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_eeh_save_issued_dmas()
1045 dma_unmap_page(&card->dev->dev, dma->dma_addr, in rsxx_eeh_save_issued_dmas()
1046 get_dma_size(dma), in rsxx_eeh_save_issued_dmas()
1047 dma->cmd == HW_CMD_BLK_WRITE ? in rsxx_eeh_save_issued_dmas()
1052 list_add_tail(&dma->list, &issued_dmas[i]); in rsxx_eeh_save_issued_dmas()