From: Alex Elder <elder@linaro.org>
To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com
Cc: mka@chromium.org, andersson@kernel.org,
quic_cpratapa@quicinc.com, quic_avuyyuru@quicinc.com,
quic_jponduru@quicinc.com, quic_subashab@quicinc.com,
elder@kernel.org, netdev@vger.kernel.org,
linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH net-next 3/7] net: ipa: kill the STARTED IPA power flag
Date: Tue, 30 Jan 2024 13:23:00 -0600 [thread overview]
Message-ID: <20240130192305.250915-4-elder@linaro.org> (raw)
In-Reply-To: <20240130192305.250915-1-elder@linaro.org>
A transmit on the modem netdev can only complete if the IPA hardware
is powered. Currently, if a transmit request arrives when the
hardware was not powered, further transmits are be stopped to allow
power-up to complete. Once power-up completes, transmits are once
again enabled.
Runtime resume can complete at the same time a transmit request is
being handled, and previously there was a race between stopping and
restarting transmits. The STARTED flag was used to ensure the
stop request in the transmit path was skipped if the start request
in the runtime resume path had already occurred.
Now, the queue is *always* stopped in the transmit path, *before*
determining whether power is ACTIVE. If power is found to already
be active (or if the socket buffer is gets dropped), transmit is
re-enabled. Otherwise it will (always) be enabled after runtime
resume completes.
The race between transmit and runtime resume no longer exists, so
there is no longer any need to maintain the STARTED flag.
Signed-off-by: Alex Elder <elder@linaro.org>
---
drivers/net/ipa/ipa_power.c | 47 +++++++++++--------------------------
1 file changed, 14 insertions(+), 33 deletions(-)
diff --git a/drivers/net/ipa/ipa_power.c b/drivers/net/ipa/ipa_power.c
index f1802448ff447..509c9bfa648e7 100644
--- a/drivers/net/ipa/ipa_power.c
+++ b/drivers/net/ipa/ipa_power.c
@@ -39,14 +39,12 @@
* @IPA_POWER_FLAG_RESUMED: Whether resume from suspend has been signaled
* @IPA_POWER_FLAG_SYSTEM: Hardware is system (not runtime) suspended
* @IPA_POWER_FLAG_STOPPED: Modem TX is disabled by ipa_start_xmit()
- * @IPA_POWER_FLAG_STARTED: Modem TX was enabled by ipa_runtime_resume()
* @IPA_POWER_FLAG_COUNT: Number of defined power flags
*/
enum ipa_power_flag {
IPA_POWER_FLAG_RESUMED,
IPA_POWER_FLAG_SYSTEM,
IPA_POWER_FLAG_STOPPED,
- IPA_POWER_FLAG_STARTED,
IPA_POWER_FLAG_COUNT, /* Last; not a flag */
};
@@ -64,7 +62,7 @@ struct ipa_power {
struct device *dev;
struct clk *core;
struct qmp *qmp;
- spinlock_t spinlock; /* used with STOPPED/STARTED power flags */
+ spinlock_t spinlock; /* used with STOPPED power flag */
DECLARE_BITMAP(flags, IPA_POWER_FLAG_COUNT);
u32 interconnect_count;
struct icc_bulk_data interconnect[] __counted_by(interconnect_count);
@@ -242,23 +240,16 @@ void ipa_power_suspend_handler(struct ipa *ipa, enum ipa_irq_id irq_id)
* gets sent (or dropped). If power is not ACTIVE, it will eventually
* be, and transmits stay disabled until after it is.
*
- * Two flags and a spinlock are used when managing this. If the queue
- * is stopped, the STOPPED power flag is set. And if the queue is
- * started, the STARTED flag is set.
+ * A flag and a spinlock are used when managing this. If the queue gets
+ * stopped, the STOPPED power flag is set.
*
- * The first function stops the modem netdev transmit queue, but only if
- * the STARTED flag is *not* set. This previously avoided a race where
- * the TX path stops further transmits after power has become ACTIVE.
- * The STARTED flag is cleared by this function.
+ * The first function stops the modem netdev transmit queue. The second
+ * function starts the transmit queue, but only if the STOPPED flag is
+ * set. This avoids enabling transmits repeatedly immediately after
+ * power has become ACTIVE (not really a big deal). If the STOPPED flag
+ * was set, it is cleared by this function.
*
- * The second function starts the transmit queue, but only if the
- * STOPPED flag is set. This avoids enabling transmits repeatedly
- * immediately after power has become ACTIVE (not really a big deal).
- * If the STOPPED flag was set, it is cleared and the STARTED flag
- * is set by this function.
- *
- * The third function enables transmits again and clears the STARTED
- * flag in case it was set, to return it to initial state.
+ * The third function just enables transmits again.
*/
void ipa_power_modem_queue_stop(struct ipa *ipa)
{
@@ -267,18 +258,14 @@ void ipa_power_modem_queue_stop(struct ipa *ipa)
spin_lock_irqsave(&power->spinlock, flags);
- if (!__test_and_clear_bit(IPA_POWER_FLAG_STARTED, power->flags)) {
- netif_stop_queue(ipa->modem_netdev);
- __set_bit(IPA_POWER_FLAG_STOPPED, power->flags);
- }
+ netif_stop_queue(ipa->modem_netdev);
+ __set_bit(IPA_POWER_FLAG_STOPPED, power->flags);
spin_unlock_irqrestore(&power->spinlock, flags);
}
/* This function starts the modem netdev transmit queue, but only if the
- * STOPPED flag is set. That flag is cleared if it was set. If the queue
- * was restarted, the STARTED flag is set; this allows ipa_start_xmit()
- * to skip stopping the queue in the event of a race.
+ * STOPPED flag is set. That flag is cleared if it was set.
*/
void ipa_power_modem_queue_wake(struct ipa *ipa)
{
@@ -287,22 +274,16 @@ void ipa_power_modem_queue_wake(struct ipa *ipa)
spin_lock_irqsave(&power->spinlock, flags);
- if (__test_and_clear_bit(IPA_POWER_FLAG_STOPPED, power->flags)) {
- __set_bit(IPA_POWER_FLAG_STARTED, power->flags);
+ if (__test_and_clear_bit(IPA_POWER_FLAG_STOPPED, power->flags))
netif_wake_queue(ipa->modem_netdev);
- }
spin_unlock_irqrestore(&power->spinlock, flags);
}
-/* This function is run after power has become ACTIVE. It enables transmits
- * again clears the STARTED flag to indicate the TX queue is operating and
- * can be stopped again if necessary.
- */
+/* This function enables transmits again after power has become ACTIVE. */
void ipa_power_modem_queue_active(struct ipa *ipa)
{
netif_wake_queue(ipa->modem_netdev);
- clear_bit(IPA_POWER_FLAG_STARTED, ipa->power->flags);
}
static int ipa_power_retention_init(struct ipa_power *power)
--
2.40.1
next prev parent reply other threads:[~2024-01-30 19:23 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-30 19:22 [PATCH net-next 0/7] net: ipa: simplify TX power handling Alex Elder
2024-01-30 19:22 ` [PATCH net-next 1/7] net: ipa: stash modem TX and RX endpoints Alex Elder
2024-01-30 19:22 ` [PATCH net-next 2/7] net: ipa: begin simplifying TX queue stop Alex Elder
2024-01-30 19:23 ` Alex Elder [this message]
2024-01-30 19:23 ` [PATCH net-next 4/7] net: ipa: kill the IPA power STOPPED flag Alex Elder
2024-01-30 19:23 ` [PATCH net-next 5/7] net: ipa: kill ipa_power_modem_queue_stop() Alex Elder
2024-01-30 19:23 ` [PATCH net-next 6/7] net: ipa: kill ipa_power_modem_queue_active() Alex Elder
2024-01-30 19:23 ` [PATCH net-next 7/7] net: ipa: kill ipa_power_modem_queue_wake() Alex Elder
2024-02-02 5:00 ` [PATCH net-next 0/7] net: ipa: simplify TX power handling patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240130192305.250915-4-elder@linaro.org \
--to=elder@linaro.org \
--cc=andersson@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=elder@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mka@chromium.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=quic_avuyyuru@quicinc.com \
--cc=quic_cpratapa@quicinc.com \
--cc=quic_jponduru@quicinc.com \
--cc=quic_subashab@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).