From: Felix Fietkau <nbd@nbd.name>
To: linux-wireless@vger.kernel.org
Subject: [PATCH v2 14/24] wifi: mt76: mt7915: retry mcu messages
Date: Tue, 27 Aug 2024 11:30:01 +0200 [thread overview]
Message-ID: <20240827093011.18621-14-nbd@nbd.name> (raw)
In-Reply-To: <20240827093011.18621-1-nbd@nbd.name>
In some cases MCU messages can get lost. Instead of failing completely,
attempt to recover by re-sending them.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
drivers/net/wireless/mediatek/mt76/mcu.c | 20 +++++++++++++++++++
drivers/net/wireless/mediatek/mt76/mt76.h | 3 +++
.../net/wireless/mediatek/mt76/mt7915/mcu.c | 7 ++-----
3 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/mcu.c b/drivers/net/wireless/mediatek/mt76/mcu.c
index a8cafa39a56d..98da82b74094 100644
--- a/drivers/net/wireless/mediatek/mt76/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mcu.c
@@ -73,6 +73,8 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
int cmd, bool wait_resp,
struct sk_buff **ret_skb)
{
+ unsigned int retry = 0;
+ struct sk_buff *orig_skb = NULL;
unsigned long expires;
int ret, seq;
@@ -81,6 +83,14 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
mutex_lock(&dev->mcu.mutex);
+ if (dev->mcu_ops->mcu_skb_prepare_msg) {
+ ret = dev->mcu_ops->mcu_skb_prepare_msg(dev, skb, cmd, &seq);
+ if (ret < 0)
+ goto out;
+ }
+
+retry:
+ orig_skb = skb_get(skb);
ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq);
if (ret < 0)
goto out;
@@ -94,6 +104,14 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
do {
skb = mt76_mcu_get_response(dev, expires);
+ if (!skb && !test_bit(MT76_MCU_RESET, &dev->phy.state) &&
+ retry++ < dev->mcu_ops->max_retry) {
+ dev_err(dev->dev, "Retry message %08x (seq %d)\n",
+ cmd, seq);
+ skb = orig_skb;
+ goto retry;
+ }
+
ret = dev->mcu_ops->mcu_parse_response(dev, cmd, skb, seq);
if (!ret && ret_skb)
*ret_skb = skb;
@@ -101,7 +119,9 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb,
dev_kfree_skb(skb);
} while (ret == -EAGAIN);
+
out:
+ dev_kfree_skb(orig_skb);
mutex_unlock(&dev->mcu.mutex);
return ret;
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index 43e743b510ba..794cd33be68b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -230,11 +230,14 @@ struct mt76_queue {
};
struct mt76_mcu_ops {
+ unsigned int max_retry;
u32 headroom;
u32 tailroom;
int (*mcu_send_msg)(struct mt76_dev *dev, int cmd, const void *data,
int len, bool wait_resp);
+ int (*mcu_skb_prepare_msg)(struct mt76_dev *dev, struct sk_buff *skb,
+ int cmd, int *seq);
int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb,
int cmd, int *seq);
int (*mcu_parse_response)(struct mt76_dev *dev, int cmd,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 2ef8d90132dd..0cde1b3c7d41 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -191,11 +191,6 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
{
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
enum mt76_mcuq_id qid;
- int ret;
-
- ret = mt76_connac2_mcu_fill_message(mdev, skb, cmd, wait_seq);
- if (ret)
- return ret;
if (cmd == MCU_CMD(FW_SCATTER))
qid = MT_MCUQ_FWDL;
@@ -2382,7 +2377,9 @@ int mt7915_mcu_init_firmware(struct mt7915_dev *dev)
int mt7915_mcu_init(struct mt7915_dev *dev)
{
static const struct mt76_mcu_ops mt7915_mcu_ops = {
+ .max_retry = 3,
.headroom = sizeof(struct mt76_connac2_mcu_txd),
+ .mcu_skb_prepare_msg = mt76_connac2_mcu_fill_message,
.mcu_skb_send_msg = mt7915_mcu_send_message,
.mcu_parse_response = mt7915_mcu_parse_response,
};
--
2.46.0
next prev parent reply other threads:[~2024-08-27 9:55 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-27 9:29 [PATCH v2 01/24] mt76: mt7603: fix mixed declarations and code Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 02/24] wifi: mt76: mt7603: fix reading target power from eeprom Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 03/24] wifi: mt76: mt7603: initialize chainmask Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 04/24] wifi: mt76: fix mt76_get_rate Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 05/24] wifi: mt76: partially move channel change code to core Felix Fietkau
2024-08-27 18:02 ` Shiji Yang
2024-08-27 18:37 ` Felix Fietkau
2024-08-28 1:32 ` Shiji Yang
2024-08-28 6:34 ` [PATCH v3 " Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 06/24] wifi: mt76: add separate tx scheduling queue for off-channel tx Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 07/24] wifi: mt76: mt7915: disable tx worker during tx BA session enable/disable Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 08/24] wifi: mt76: mt7915: allocate vif wcid in the same range as stations Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 09/24] wifi: mt76: connac: add support for IEEE 802.11 fragmentation Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 10/24] wifi: mt76: connac: add support for passing connection state directly Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 11/24] wifi: mt76: change .sta_assoc callback to .sta_event Felix Fietkau
2024-08-27 9:29 ` [PATCH v2 12/24] wifi: mt76: mt7915: use mac80211 .sta_state op Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 13/24] wifi: mt76: mt7915: set MT76_MCU_RESET early in mt7915_mac_full_reset Felix Fietkau
2024-08-27 9:30 ` Felix Fietkau [this message]
2024-09-13 19:32 ` [PATCH v2 14/24] wifi: mt76: mt7915: retry mcu messages Nícolas F. R. A. Prado
2024-09-17 10:22 ` Kalle Valo
2024-08-27 9:30 ` [PATCH v2 15/24] wifi: mt76: mt7915: reset the device after MCU timeout Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 16/24] wifi: mt76: mt7915: add dummy HW offload of IEEE 802.11 fragmentation Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 17/24] wifi: mt76: mt7915: hold dev->mt76.mutex while disabling tx worker Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 18/24] wifi: mt76: connac: move mt7615_mcu_del_wtbl_all to connac Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 19/24] wifi: mt76: mt7915: improve hardware restart reliability Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 20/24] mt76: shrink mt76_queue_buf Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 21/24] wifi: mt76: mt7915: fix rx filter setting for bfee functionality Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 22/24] wifi: mt76: mt7915: always query station rx rate from firmware Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 23/24] wifi: mt76: mt7996: fix uninitialized TLV data Felix Fietkau
2024-08-27 9:30 ` [PATCH v2 24/24] wifi: mt76: mt7915: avoid long MCU command timeouts during SER Felix Fietkau
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=20240827093011.18621-14-nbd@nbd.name \
--to=nbd@nbd.name \
--cc=linux-wireless@vger.kernel.org \
/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