diff options
author | Alex Elder <elder@linaro.org> | 2022-09-02 16:02:14 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2022-09-05 12:47:01 +0100 |
commit | c30623ea0b3a9d766f34f75a326b8c610ca3105e (patch) | |
tree | 3a77345bde0917bed762389d9bd76f4657d78d76 /drivers/net/ipa | |
parent | b2abe33d23cfaea6cd3f8335a1ee08c480512c6f (diff) |
net: ipa: use IDs for last allocated transaction
Use the allocated and free transaction IDs to determine whether the
"last" transaction used for quiescing a channel is in allocated
state. The last allocated transaction that has not been committed
(if any) immediately precedes the first free transaction in the
transaction array.
Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ipa')
-rw-r--r-- | drivers/net/ipa/gsi.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/ipa/gsi.c b/drivers/net/ipa/gsi.c index 0ea98fa5dee5..135e51980d79 100644 --- a/drivers/net/ipa/gsi.c +++ b/drivers/net/ipa/gsi.c @@ -711,6 +711,8 @@ static struct gsi_trans *gsi_channel_trans_last(struct gsi_channel *channel) { struct gsi_trans_info *trans_info = &channel->trans_info; struct gsi_trans *trans; + u16 trans_index; + u16 trans_id; spin_lock_bh(&trans_info->spinlock); @@ -718,10 +720,14 @@ static struct gsi_trans *gsi_channel_trans_last(struct gsi_channel *channel) * before we disabled transmits, so check for that. */ if (channel->toward_ipa) { - trans = list_last_entry_or_null(&trans_info->alloc, - struct gsi_trans, links); - if (trans) + /* The last allocated transaction precedes the first free */ + if (trans_info->allocated_id != trans_info->free_id) { + trans_id = trans_info->free_id - 1; + trans_index = trans_id % channel->tre_count; + trans = &trans_info->trans[trans_index]; goto done; + } + trans = list_last_entry_or_null(&trans_info->committed, struct gsi_trans, links); if (trans) |