net: ipa: update channel in gsi_channel_trans_complete()
authorAlex Elder <elder@linaro.org>
Tue, 6 Sep 2022 17:19:41 +0000 (12:19 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Sep 2022 10:45:25 +0000 (11:45 +0100)
Have gsi_channel_trans_complete() update the known state from
hardware rather than doing so in gsi_channel_poll_one().

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ipa/gsi.c
drivers/net/ipa/gsi_private.h
drivers/net/ipa/gsi_trans.c

index 16df699..5471843 100644 (file)
@@ -1475,7 +1475,7 @@ void gsi_channel_doorbell(struct gsi_channel *channel)
 }
 
 /* Consult hardware, move any newly completed transactions to completed list */
-static struct gsi_trans *gsi_channel_update(struct gsi_channel *channel)
+struct gsi_trans *gsi_channel_update(struct gsi_channel *channel)
 {
        u32 evt_ring_id = channel->evt_ring_id;
        struct gsi *gsi = channel->gsi;
@@ -1529,9 +1529,6 @@ static struct gsi_trans *gsi_channel_poll_one(struct gsi_channel *channel)
 
        /* Get the first transaction from the completed list */
        trans = gsi_channel_trans_complete(channel);
-       if (!trans)     /* List is empty; see if there's more to do */
-               trans = gsi_channel_update(channel);
-
        if (trans)
                gsi_trans_move_polled(trans);
 
index 0b2516f..a937811 100644 (file)
@@ -94,6 +94,14 @@ void gsi_channel_trans_exit(struct gsi_channel *channel);
  */
 void gsi_channel_doorbell(struct gsi_channel *channel);
 
+/* gsi_channel_update() - Update knowledge of channel hardware state
+ * @channel:   Channel whose doorbell should be rung
+ *
+ * Consult hardware, move any newly completed transactions to a
+ * channel's completed list
+ */
+struct gsi_trans *gsi_channel_update(struct gsi_channel *channel);
+
 /**
  * gsi_ring_virt() - Return virtual address for a ring entry
  * @ring:      Ring whose address is to be translated
index a3ae0ca..0b78ae9 100644 (file)
@@ -241,7 +241,7 @@ struct gsi_trans *gsi_channel_trans_complete(struct gsi_channel *channel)
        u16 trans_id = trans_info->completed_id;
 
        if (trans_id == trans_info->pending_id)
-               return NULL;
+               return gsi_channel_update(channel);
 
        return &trans_info->trans[trans_id %= channel->tre_count];
 }