public inbox for linux-wireless@vger.kernel.org
 help / color / mirror / Atom feed
From: Felix Fietkau <nbd@nbd.name>
To: linux-wireless@vger.kernel.org
Subject: [PATCH 08/10] mt76: implement functions to get the response skb for MCU calls
Date: Wed, 30 Sep 2020 14:24:39 +0200	[thread overview]
Message-ID: <20200930122441.64523-8-nbd@nbd.name> (raw)
In-Reply-To: <20200930122441.64523-1-nbd@nbd.name>

Can be used by the caller to get the response data directly instead of using the
hack of storing the result in internal data structures from .mcu_parse_response

Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
 drivers/net/wireless/mediatek/mt76/mcu.c  | 23 +++++++++++++++--------
 drivers/net/wireless/mediatek/mt76/mt76.h | 21 +++++++++++++++++----
 2 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mcu.c b/drivers/net/wireless/mediatek/mt76/mcu.c
index 2bbe41e3b78f..76dadef7ccfe 100644
--- a/drivers/net/wireless/mediatek/mt76/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mcu.c
@@ -51,8 +51,8 @@ void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb)
 }
 EXPORT_SYMBOL_GPL(mt76_mcu_rx_event);
 
-int mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data,
-		      int len, bool wait_resp)
+int mt76_mcu_send_and_get_msg(struct mt76_dev *dev, int cmd, const void *data,
+			      int len, bool wait_resp, struct sk_buff **ret_skb)
 {
 	struct sk_buff *skb;
 
@@ -63,16 +63,20 @@ int mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data,
 	if (!skb)
 		return -ENOMEM;
 
-	return mt76_mcu_skb_send_msg(dev, skb, cmd, wait_resp);
+	return mt76_mcu_skb_send_and_get_msg(dev, skb, cmd, wait_resp, ret_skb);
 }
-EXPORT_SYMBOL_GPL(mt76_mcu_send_msg);
+EXPORT_SYMBOL_GPL(mt76_mcu_send_and_get_msg);
 
-int mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb,
-			  int cmd, bool wait_resp)
+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 long expires;
 	int ret, seq;
 
+	if (ret_skb)
+		*ret_skb = NULL;
+
 	mutex_lock(&dev->mcu.mutex);
 
 	ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq);
@@ -89,7 +93,10 @@ int mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb,
 	do {
 		skb = mt76_mcu_get_response(dev, expires);
 		ret = dev->mcu_ops->mcu_parse_response(dev, cmd, skb, seq);
-		dev_kfree_skb(skb);
+		if (!ret && ret_skb)
+			*ret_skb = skb;
+		else
+			dev_kfree_skb(skb);
 	} while (ret == -EAGAIN);
 
 out:
@@ -97,4 +104,4 @@ int mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb,
 
 	return ret;
 }
-EXPORT_SYMBOL_GPL(mt76_mcu_skb_send_msg);
+EXPORT_SYMBOL_GPL(mt76_mcu_skb_send_and_get_msg);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
index daa3d0b482a6..e1a3338c5723 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
@@ -1067,10 +1067,23 @@ mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data,
 void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb);
 struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev,
 				      unsigned long expires);
-int mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data,
-		      int len, bool wait_resp);
-int mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb,
-			  int cmd, bool wait_resp);
+int mt76_mcu_send_and_get_msg(struct mt76_dev *dev, int cmd, const void *data,
+			      int len, bool wait_resp, struct sk_buff **ret);
+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);
+static inline int
+mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data, int len,
+		  bool wait_resp)
+{
+	return mt76_mcu_send_and_get_msg(dev, cmd, data, len, wait_resp, NULL);
+}
+
+static inline int
+mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb, int cmd,
+		      bool wait_resp)
+{
+	return mt76_mcu_skb_send_and_get_msg(dev, skb, cmd, wait_resp, NULL);
+}
 
 void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr, u32 clear, u32 set);
 
-- 
2.28.0


  parent reply	other threads:[~2020-09-30 12:24 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-30 12:24 [PATCH 01/10] mt76: rename __mt76_mcu_send_msg to mt76_mcu_send_msg Felix Fietkau
2020-09-30 12:24 ` [PATCH 02/10] mt76: rename __mt76_mcu_skb_send_msg to mt76_mcu_skb_send_msg Felix Fietkau
2020-09-30 12:24 ` [PATCH 03/10] mt76: implement .mcu_parse_response in struct mt76_mcu_ops Felix Fietkau
2020-09-30 12:24 ` [PATCH 04/10] mt76: move mcu timeout handling to .mcu_parse_response Felix Fietkau
2020-09-30 12:24 ` [PATCH 05/10] mt76: move waiting and locking out of mcu_ops->mcu_skb_send_msg Felix Fietkau
2020-09-30 12:24 ` [PATCH 06/10] mt76: make mcu_ops->mcu_send_msg optional Felix Fietkau
2020-09-30 12:24 ` [PATCH 07/10] mt76: mt7603: switch to .mcu_skb_send_msg Felix Fietkau
2020-09-30 12:24 ` Felix Fietkau [this message]
2020-09-30 12:24 ` [PATCH 09/10] mt76: mt7915: move eeprom parsing out of mt7915_mcu_parse_response Felix Fietkau
2020-09-30 12:24 ` [PATCH 10/10] mt76: mt7915: query station rx rate from firmware 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=20200930122441.64523-8-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