From: Felix Fietkau <nbd@nbd.name>
To: linux-wireless@vger.kernel.org
Subject: [PATCH 14/16] wifi: mt76: mt7915: retry mcu messages
Date: Fri, 16 Aug 2024 19:35:27 +0200 [thread overview]
Message-ID: <20240816173529.17873-14-nbd@nbd.name> (raw)
In-Reply-To: <20240816173529.17873-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 5dca8f0cd760..a28f1ff71b4d 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 7abf6cacdaae..068523561f5e 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;
@@ -2380,7 +2375,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.44.0
next prev parent reply other threads:[~2024-08-16 17:57 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-16 17:35 [PATCH 01/16] mt76: mt7603: fix mixed declarations and code Felix Fietkau
2024-08-16 17:35 ` [PATCH 02/16] wifi: mt76: mt7603: fix reading target power from eeprom Felix Fietkau
2024-08-16 17:35 ` [PATCH 03/16] wifi: mt76: mt7603: initialize chainmask Felix Fietkau
2024-08-16 17:35 ` [PATCH 04/16] wifi: mt76: fix mt76_get_rate Felix Fietkau
2024-08-16 17:35 ` [PATCH 05/16] wifi: mt76: partially move channel change code to core Felix Fietkau
2024-08-16 17:35 ` [PATCH 06/16] wifi: mt76: add separate tx scheduling queue for off-channel tx Felix Fietkau
2024-08-16 17:35 ` [PATCH 07/16] wifi: mt76: mt7915: disable tx worker during tx BA session enable/disable Felix Fietkau
2024-08-16 17:35 ` [PATCH 08/16] wifi: mt76: mt7915: allocate vif wcid in the same range as stations Felix Fietkau
2024-08-16 17:35 ` [PATCH 09/16] wifi: mt76: connac: add support for IEEE 802.11 fragmentation Felix Fietkau
2024-08-16 17:35 ` [PATCH 10/16] wifi: mt76: connac: add support for passing connection state directly Felix Fietkau
2024-08-16 17:35 ` [PATCH 11/16] wifi: mt76: change .sta_assoc callback to .sta_event Felix Fietkau
2024-08-16 17:35 ` [PATCH 12/16] wifi: mt76: mt7915: use mac80211 .sta_state op Felix Fietkau
2024-08-16 17:35 ` [PATCH 13/16] wifi: mt76: mt7915: set MT76_MCU_RESET early in mt7915_mac_full_reset Felix Fietkau
2024-08-16 17:35 ` Felix Fietkau [this message]
2024-08-16 17:35 ` [PATCH 15/16] wifi: mt76: mt7915: reset the device after MCU timeout Felix Fietkau
2024-08-23 18:32 ` Ben Greear
2024-08-23 18:35 ` Felix Fietkau
2024-08-16 17:35 ` [PATCH 16/16] wifi: mt76: mt7915: add dummy HW offload of IEEE 802.11 fragmentation 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=20240816173529.17873-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