Lines Matching refs:dma
88 struct rsxx_dma *dma; member
128 static unsigned int get_dma_size(struct rsxx_dma *dma) in get_dma_size() argument
130 if (dma->sub_page.cnt) in get_dma_size()
131 return dma->sub_page.cnt << 9; in get_dma_size()
140 struct rsxx_dma *dma) in set_tracker_dma() argument
142 trackers->list[tag].dma = dma; in set_tracker_dma()
148 return trackers->list[tag].dma; in get_tracker_dma()
171 trackers->list[tag].dma = NULL; in push_tracker()
224 static void rsxx_free_dma(struct rsxx_dma_ctrl *ctrl, struct rsxx_dma *dma) in rsxx_free_dma() argument
226 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_free_dma()
227 if (!pci_dma_mapping_error(ctrl->card->dev, dma->dma_addr)) { in rsxx_free_dma()
228 pci_unmap_page(ctrl->card->dev, dma->dma_addr, in rsxx_free_dma()
229 get_dma_size(dma), in rsxx_free_dma()
230 dma->cmd == HW_CMD_BLK_WRITE ? in rsxx_free_dma()
236 kmem_cache_free(rsxx_dma_pool, dma); in rsxx_free_dma()
240 struct rsxx_dma *dma, in rsxx_complete_dma() argument
250 if (dma->cb) in rsxx_complete_dma()
251 dma->cb(ctrl->card, dma->cb_data, status ? 1 : 0); in rsxx_complete_dma()
253 rsxx_free_dma(ctrl, dma); in rsxx_complete_dma()
259 struct rsxx_dma *dma; in rsxx_cleanup_dma_queue() local
263 list_for_each_entry_safe(dma, tmp, q, list) { in rsxx_cleanup_dma_queue()
264 list_del(&dma->list); in rsxx_cleanup_dma_queue()
266 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_cleanup_dma_queue()
268 rsxx_free_dma(ctrl, dma); in rsxx_cleanup_dma_queue()
276 struct rsxx_dma *dma) in rsxx_requeue_dma() argument
284 list_add(&dma->list, &ctrl->queue); in rsxx_requeue_dma()
289 struct rsxx_dma *dma, in rsxx_handle_dma_error() argument
297 dma->cmd, dma->laddr, hw_st); in rsxx_handle_dma_error()
306 switch (dma->cmd) { in rsxx_handle_dma_error()
310 dma->cmd = HW_CMD_BLK_RECON_READ; in rsxx_handle_dma_error()
345 dma->cmd, dma->laddr, hw_st); in rsxx_handle_dma_error()
352 rsxx_requeue_dma(ctrl, dma); in rsxx_handle_dma_error()
354 rsxx_complete_dma(ctrl, dma, status); in rsxx_handle_dma_error()
398 struct rsxx_dma *dma; in rsxx_issue_dmas() local
423 dma = list_entry(ctrl->queue.next, struct rsxx_dma, list); in rsxx_issue_dmas()
424 list_del(&dma->list); in rsxx_issue_dmas()
435 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_issue_dmas()
439 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_issue_dmas()
440 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_issue_dmas()
455 dma->dma_addr = pci_map_page(ctrl->card->dev, dma->page, in rsxx_issue_dmas()
456 dma->pg_off, dma->sub_page.cnt << 9, dir); in rsxx_issue_dmas()
457 if (pci_dma_mapping_error(ctrl->card->dev, dma->dma_addr)) { in rsxx_issue_dmas()
459 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_issue_dmas()
464 set_tracker_dma(ctrl->trackers, tag, dma); in rsxx_issue_dmas()
465 hw_cmd_buf[ctrl->cmd.idx].command = dma->cmd; in rsxx_issue_dmas()
469 ((dma->sub_page.cnt & 0x7) << 4) | in rsxx_issue_dmas()
470 (dma->sub_page.off & 0x7); in rsxx_issue_dmas()
473 cpu_to_le32(dma->laddr); in rsxx_issue_dmas()
476 cpu_to_le64(dma->dma_addr); in rsxx_issue_dmas()
480 ctrl->id, dma->laddr, tag, ctrl->cmd.idx); in rsxx_issue_dmas()
485 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_issue_dmas()
487 else if (dma->cmd == HW_CMD_BLK_DISCARD) in rsxx_issue_dmas()
510 struct rsxx_dma *dma; in rsxx_dma_done() local
539 dma = get_tracker_dma(ctrl->trackers, tag); in rsxx_dma_done()
540 if (dma == NULL) { in rsxx_dma_done()
555 ctrl->id, dma->laddr, tag, status, count, in rsxx_dma_done()
564 rsxx_handle_dma_error(ctrl, dma, status); in rsxx_dma_done()
566 rsxx_complete_dma(ctrl, dma, 0); in rsxx_dma_done()
620 struct rsxx_dma *dma; in rsxx_queue_discard() local
622 dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL); in rsxx_queue_discard()
623 if (!dma) in rsxx_queue_discard()
626 dma->cmd = HW_CMD_BLK_DISCARD; in rsxx_queue_discard()
627 dma->laddr = laddr; in rsxx_queue_discard()
628 dma->dma_addr = 0; in rsxx_queue_discard()
629 dma->sub_page.off = 0; in rsxx_queue_discard()
630 dma->sub_page.cnt = 0; in rsxx_queue_discard()
631 dma->page = NULL; in rsxx_queue_discard()
632 dma->pg_off = 0; in rsxx_queue_discard()
633 dma->cb = cb; in rsxx_queue_discard()
634 dma->cb_data = cb_data; in rsxx_queue_discard()
636 dev_dbg(CARD_TO_DEV(card), "Queuing[D] laddr %x\n", dma->laddr); in rsxx_queue_discard()
638 list_add_tail(&dma->list, q); in rsxx_queue_discard()
654 struct rsxx_dma *dma; in rsxx_queue_dma() local
656 dma = kmem_cache_alloc(rsxx_dma_pool, GFP_KERNEL); in rsxx_queue_dma()
657 if (!dma) in rsxx_queue_dma()
660 dma->cmd = dir ? HW_CMD_BLK_WRITE : HW_CMD_BLK_READ; in rsxx_queue_dma()
661 dma->laddr = laddr; in rsxx_queue_dma()
662 dma->sub_page.off = (dma_off >> 9); in rsxx_queue_dma()
663 dma->sub_page.cnt = (dma_len >> 9); in rsxx_queue_dma()
664 dma->page = page; in rsxx_queue_dma()
665 dma->pg_off = pg_off; in rsxx_queue_dma()
666 dma->cb = cb; in rsxx_queue_dma()
667 dma->cb_data = cb_data; in rsxx_queue_dma()
671 dir ? 'W' : 'R', dma->laddr, dma->sub_page.off, in rsxx_queue_dma()
672 dma->sub_page.cnt, dma->page, dma->pg_off); in rsxx_queue_dma()
675 list_add_tail(&dma->list, q); in rsxx_queue_dma()
833 ctrl->trackers->list[i].dma = NULL; in rsxx_dma_ctrl_init()
980 struct rsxx_dma *dma; in rsxx_dma_cancel() local
986 dma = get_tracker_dma(ctrl->trackers, i); in rsxx_dma_cancel()
987 if (dma) { in rsxx_dma_cancel()
989 rsxx_complete_dma(ctrl, dma, DMA_CANCELLED); in rsxx_dma_cancel()
1040 struct rsxx_dma *dma; in rsxx_eeh_save_issued_dmas() local
1052 dma = get_tracker_dma(card->ctrl[i].trackers, j); in rsxx_eeh_save_issued_dmas()
1053 if (dma == NULL) in rsxx_eeh_save_issued_dmas()
1056 if (dma->cmd == HW_CMD_BLK_WRITE) in rsxx_eeh_save_issued_dmas()
1058 else if (dma->cmd == HW_CMD_BLK_DISCARD) in rsxx_eeh_save_issued_dmas()
1063 if (dma->cmd != HW_CMD_BLK_DISCARD) { in rsxx_eeh_save_issued_dmas()
1064 pci_unmap_page(card->dev, dma->dma_addr, in rsxx_eeh_save_issued_dmas()
1065 get_dma_size(dma), in rsxx_eeh_save_issued_dmas()
1066 dma->cmd == HW_CMD_BLK_WRITE ? in rsxx_eeh_save_issued_dmas()
1071 list_add_tail(&dma->list, &issued_dmas[i]); in rsxx_eeh_save_issued_dmas()