aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlex Elder <elder@linaro.org>2022-09-02 16:02:16 -0500
committerDavid S. Miller <davem@davemloft.net>2022-09-05 12:47:02 +0100
commite68d1d1591fd70de0651e1af66db69540f556e73 (patch)
treed9e253ea3dd40a7c4a088fd2ae3b2d331865b027 /drivers
parentnet: ipa: use IDs exclusively for last transaction (diff)
downloadlinux-dev-e68d1d1591fd70de0651e1af66db69540f556e73.tar.xz
linux-dev-e68d1d1591fd70de0651e1af66db69540f556e73.zip
net: ipa: simplify gsi_channel_trans_last()
Using a little logic we can simplify gsi_channel_trans_last(). The first condition in that function looks like this: if (trans_info->allocated_id != trans_info->free_id) And if that's false, we proceed to the next one: if (trans_info->committed_id != trans_info->allocated_id) Failure of the first test implies: trans_info->allocated_id == trans_info->free_id And therefore, the second one can be rewritten this way: if (trans_info->committed_id != trans_info->free_id) Substituting free_id for allocated_id and committed_id can also be done in the code blocks executed when these conditions yield true. The net result is that all three blocks for TX endpoints can be consolidated into just one. The two blocks of code at the end of that function (used for both TX and RX channels) can be similarly consolidated into a single block. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ipa/gsi.c33
1 files changed, 7 insertions, 26 deletions
diff --git a/drivers/net/ipa/gsi.c b/drivers/net/ipa/gsi.c
index 0983a11409f2..841a946bc286 100644
--- a/drivers/net/ipa/gsi.c
+++ b/drivers/net/ipa/gsi.c
@@ -718,46 +718,27 @@ static struct gsi_trans *gsi_channel_trans_last(struct gsi_channel *channel)
* before we disabled transmits, so check for that.
*/
if (channel->toward_ipa) {
- /* The last allocated transaction precedes the first free */
- if (trans_info->allocated_id != trans_info->free_id) {
+ /* The last allocated, committed, or pending transaction
+ * precedes the first free transaction.
+ */
+ if (trans_info->pending_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;
}
-
- /* Last committed transaction precedes the first allocated */
- if (trans_info->committed_id != trans_info->allocated_id) {
- trans_id = trans_info->allocated_id - 1;
- trans_index = trans_id % channel->tre_count;
- trans = &trans_info->trans[trans_index];
- goto done;
- }
-
- /* Last pending transaction precedes the first committed */
- if (trans_info->pending_id != trans_info->committed_id) {
- trans_id = trans_info->committed_id - 1;
- trans_index = trans_id % channel->tre_count;
- trans = &trans_info->trans[trans_index];
- goto done;
- }
}
/* Otherwise (TX or RX) we want to wait for anything that
* has completed, or has been polled but not released yet.
*
- * The last pending transaction precedes the first committed.
+ * The last completed or polled transaction precedes the
+ * first pending transaction.
*/
- if (trans_info->completed_id != trans_info->pending_id) {
+ if (trans_info->polled_id != trans_info->pending_id) {
trans_id = trans_info->pending_id - 1;
trans_index = trans_id % channel->tre_count;
trans = &trans_info->trans[trans_index];
- goto done;
- }
- if (trans_info->polled_id != trans_info->completed_id) {
- trans_id = trans_info->completed_id - 1;
- trans_index = trans_id % channel->tre_count;
- trans = &trans_info->trans[trans_index];
} else {
trans = NULL;
}