Lines Matching refs:trans

235 				  struct gsi_trans *trans)  in gsi_channel_trans_map()  argument
238 channel->trans_info.map[index % channel->tre_ring.count] = trans; in gsi_channel_trans_map()
257 static void gsi_trans_move_pending(struct gsi_trans *trans) in gsi_trans_move_pending() argument
259 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id]; in gsi_trans_move_pending()
264 list_move_tail(&trans->links, &trans_info->pending); in gsi_trans_move_pending()
272 void gsi_trans_move_complete(struct gsi_trans *trans) in gsi_trans_move_complete() argument
274 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id]; in gsi_trans_move_complete()
281 list_cut_position(&list, &trans_info->pending, &trans->links); in gsi_trans_move_complete()
288 void gsi_trans_move_polled(struct gsi_trans *trans) in gsi_trans_move_polled() argument
290 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id]; in gsi_trans_move_polled()
295 list_move_tail(&trans->links, &trans_info->polled); in gsi_trans_move_polled()
330 struct gsi_trans *trans; in gsi_channel_trans_alloc() local
344 trans = gsi_trans_pool_alloc(&trans_info->pool, 1); in gsi_channel_trans_alloc()
345 trans->gsi = gsi; in gsi_channel_trans_alloc()
346 trans->channel_id = channel_id; in gsi_channel_trans_alloc()
347 trans->tre_count = tre_count; in gsi_channel_trans_alloc()
348 init_completion(&trans->completion); in gsi_channel_trans_alloc()
351 trans->sgl = gsi_trans_pool_alloc(&trans_info->sg_pool, tre_count); in gsi_channel_trans_alloc()
352 sg_init_marker(trans->sgl, tre_count); in gsi_channel_trans_alloc()
354 trans->direction = direction; in gsi_channel_trans_alloc()
358 list_add_tail(&trans->links, &trans_info->alloc); in gsi_channel_trans_alloc()
362 refcount_set(&trans->refcount, 1); in gsi_channel_trans_alloc()
364 return trans; in gsi_channel_trans_alloc()
368 void gsi_trans_free(struct gsi_trans *trans) in gsi_trans_free() argument
370 refcount_t *refcount = &trans->refcount; in gsi_trans_free()
378 trans_info = &trans->gsi->channel[trans->channel_id].trans_info; in gsi_trans_free()
385 list_del(&trans->links); in gsi_trans_free()
392 ipa_gsi_trans_release(trans); in gsi_trans_free()
397 gsi_trans_tre_release(trans_info, trans->tre_count); in gsi_trans_free()
401 void gsi_trans_cmd_add(struct gsi_trans *trans, void *buf, u32 size, in gsi_trans_cmd_add() argument
406 u32 which = trans->used++; in gsi_trans_cmd_add()
409 WARN_ON(which >= trans->tre_count); in gsi_trans_cmd_add()
425 sg = &trans->sgl[which]; in gsi_trans_cmd_add()
430 info = &trans->info[which]; in gsi_trans_cmd_add()
436 int gsi_trans_page_add(struct gsi_trans *trans, struct page *page, u32 size, in gsi_trans_page_add() argument
439 struct scatterlist *sg = &trans->sgl[0]; in gsi_trans_page_add()
442 if (WARN_ON(trans->tre_count != 1)) in gsi_trans_page_add()
444 if (WARN_ON(trans->used)) in gsi_trans_page_add()
448 ret = dma_map_sg(trans->gsi->dev, sg, 1, trans->direction); in gsi_trans_page_add()
452 trans->used++; /* Transaction now owns the (DMA mapped) page */ in gsi_trans_page_add()
458 int gsi_trans_skb_add(struct gsi_trans *trans, struct sk_buff *skb) in gsi_trans_skb_add() argument
460 struct scatterlist *sg = &trans->sgl[0]; in gsi_trans_skb_add()
464 if (WARN_ON(trans->tre_count != 1)) in gsi_trans_skb_add()
466 if (WARN_ON(trans->used)) in gsi_trans_skb_add()
475 ret = dma_map_sg(trans->gsi->dev, sg, used, trans->direction); in gsi_trans_skb_add()
479 trans->used += used; /* Transaction now owns the (DMA mapped) skb */ in gsi_trans_skb_add()
542 static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db) in __gsi_trans_commit() argument
544 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id]; in __gsi_trans_commit()
555 WARN_ON(!trans->used); in __gsi_trans_commit()
562 info = trans->info ? &trans->info[0] : NULL; in __gsi_trans_commit()
565 for_each_sg(trans->sgl, sg, trans->used, i) { in __gsi_trans_commit()
566 bool last_tre = i == trans->used - 1; in __gsi_trans_commit()
579 ring->index += trans->used; in __gsi_trans_commit()
583 trans->len = byte_count; in __gsi_trans_commit()
584 trans->trans_count = channel->trans_count; in __gsi_trans_commit()
585 trans->byte_count = channel->byte_count; in __gsi_trans_commit()
591 gsi_channel_trans_map(channel, ring->index - 1, trans); in __gsi_trans_commit()
593 gsi_trans_move_pending(trans); in __gsi_trans_commit()
605 void gsi_trans_commit(struct gsi_trans *trans, bool ring_db) in gsi_trans_commit() argument
607 if (trans->used) in gsi_trans_commit()
608 __gsi_trans_commit(trans, ring_db); in gsi_trans_commit()
610 gsi_trans_free(trans); in gsi_trans_commit()
614 void gsi_trans_commit_wait(struct gsi_trans *trans) in gsi_trans_commit_wait() argument
616 if (!trans->used) in gsi_trans_commit_wait()
619 refcount_inc(&trans->refcount); in gsi_trans_commit_wait()
621 __gsi_trans_commit(trans, true); in gsi_trans_commit_wait()
623 wait_for_completion(&trans->completion); in gsi_trans_commit_wait()
626 gsi_trans_free(trans); in gsi_trans_commit_wait()
630 int gsi_trans_commit_wait_timeout(struct gsi_trans *trans, in gsi_trans_commit_wait_timeout() argument
636 if (!trans->used) in gsi_trans_commit_wait_timeout()
639 refcount_inc(&trans->refcount); in gsi_trans_commit_wait_timeout()
641 __gsi_trans_commit(trans, true); in gsi_trans_commit_wait_timeout()
643 remaining = wait_for_completion_timeout(&trans->completion, in gsi_trans_commit_wait_timeout()
646 gsi_trans_free(trans); in gsi_trans_commit_wait_timeout()
652 void gsi_trans_complete(struct gsi_trans *trans) in gsi_trans_complete() argument
655 if (trans->direction != DMA_NONE) in gsi_trans_complete()
656 dma_unmap_sg(trans->gsi->dev, trans->sgl, trans->used, in gsi_trans_complete()
657 trans->direction); in gsi_trans_complete()
659 ipa_gsi_trans_complete(trans); in gsi_trans_complete()
661 complete(&trans->completion); in gsi_trans_complete()
663 gsi_trans_free(trans); in gsi_trans_complete()
670 struct gsi_trans *trans; in gsi_channel_trans_cancel_pending() local
677 list_for_each_entry(trans, &trans_info->pending, links) in gsi_channel_trans_cancel_pending()
678 trans->cancelled = true; in gsi_channel_trans_cancel_pending()