Lines Matching refs:trans

219 static void gsi_trans_map(struct gsi_trans *trans, u32 index)
221 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id];
224 index += trans->used_count - 1;
227 channel->trans_info.map[index % channel->tre_ring.count] = trans;
250 return &trans_info->trans[trans_id %= channel->tre_count];
254 static void gsi_trans_move_committed(struct gsi_trans *trans)
256 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id];
264 static void gsi_trans_move_pending(struct gsi_trans *trans)
266 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id];
268 u16 trans_index = trans - &trans_info->trans[0];
277 void gsi_trans_move_complete(struct gsi_trans *trans)
279 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id];
281 u16 trans_index = trans - trans_info->trans;
291 void gsi_trans_move_polled(struct gsi_trans *trans)
293 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id];
341 struct gsi_trans *trans;
354 trans = &trans_info->trans[trans_index];
355 memset(trans, 0, sizeof(*trans));
358 trans->gsi = gsi;
359 trans->channel_id = channel_id;
360 trans->rsvd_count = tre_count;
361 init_completion(&trans->completion);
364 trans->sgl = gsi_trans_pool_alloc(&trans_info->sg_pool, tre_count);
365 sg_init_marker(trans->sgl, tre_count);
367 trans->direction = direction;
368 refcount_set(&trans->refcount, 1);
373 return trans;
377 void gsi_trans_free(struct gsi_trans *trans)
381 if (!refcount_dec_and_test(&trans->refcount))
387 trans_info = &trans->gsi->channel[trans->channel_id].trans_info;
388 if (!trans->used_count) {
394 ipa_gsi_trans_release(trans);
403 gsi_trans_tre_release(trans_info, trans->rsvd_count);
407 void gsi_trans_cmd_add(struct gsi_trans *trans, void *buf, u32 size,
410 u32 which = trans->used_count++;
413 WARN_ON(which >= trans->rsvd_count);
429 sg = &trans->sgl[which];
434 trans->cmd_opcode[which] = opcode;
438 int gsi_trans_page_add(struct gsi_trans *trans, struct page *page, u32 size,
441 struct scatterlist *sg = &trans->sgl[0];
444 if (WARN_ON(trans->rsvd_count != 1))
446 if (WARN_ON(trans->used_count))
450 ret = dma_map_sg(trans->gsi->dev, sg, 1, trans->direction);
454 trans->used_count++; /* Transaction now owns the (DMA mapped) page */
460 int gsi_trans_skb_add(struct gsi_trans *trans, struct sk_buff *skb)
462 struct scatterlist *sg = &trans->sgl[0];
466 if (WARN_ON(trans->rsvd_count != 1))
468 if (WARN_ON(trans->used_count))
477 ret = dma_map_sg(trans->gsi->dev, sg, used_count, trans->direction);
482 trans->used_count += used_count;
536 * @trans: Transaction to commit
545 static void __gsi_trans_commit(struct gsi_trans *trans, bool ring_db)
547 struct gsi_channel *channel = &trans->gsi->channel[trans->channel_id];
558 WARN_ON(!trans->used_count);
565 cmd_opcode = channel->command ? &trans->cmd_opcode[0] : NULL;
568 for_each_sg(trans->sgl, sg, trans->used_count, i) {
569 bool last_tre = i == trans->used_count - 1;
583 gsi_trans_map(trans, tre_ring->index);
585 tre_ring->index += trans->used_count;
587 trans->len = byte_count;
589 gsi_trans_tx_committed(trans);
591 gsi_trans_move_committed(trans);
597 gsi_trans_tx_queued(trans);
598 gsi_trans_move_pending(trans);
604 void gsi_trans_commit(struct gsi_trans *trans, bool ring_db)
606 if (trans->used_count)
607 __gsi_trans_commit(trans, ring_db);
609 gsi_trans_free(trans);
613 void gsi_trans_commit_wait(struct gsi_trans *trans)
615 if (!trans->used_count)
618 refcount_inc(&trans->refcount);
620 __gsi_trans_commit(trans, true);
622 wait_for_completion(&trans->completion);
625 gsi_trans_free(trans);
629 void gsi_trans_complete(struct gsi_trans *trans)
632 if (trans->direction != DMA_NONE)
633 dma_unmap_sg(trans->gsi->dev, trans->sgl, trans->used_count,
634 trans->direction);
636 ipa_gsi_trans_complete(trans);
638 complete(&trans->completion);
640 gsi_trans_free(trans);
657 struct gsi_trans *trans;
659 trans = &trans_info->trans[trans_id % channel->tre_count];
660 trans->cancelled = true;
733 trans_info->trans = kcalloc(tre_count, sizeof(*trans_info->trans),
735 if (!trans_info->trans)
774 kfree(trans_info->trans);
788 kfree(trans_info->trans);