Commit f320d812 authored by Felix Fietkau's avatar Felix Fietkau

mt76: implement .mcu_parse_response in struct mt76_mcu_ops

Do not free skb inside that function
Preparation for further cleanup
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent fa62d0e0
...@@ -148,6 +148,8 @@ struct mt76_mcu_ops { ...@@ -148,6 +148,8 @@ struct mt76_mcu_ops {
int len, bool wait_resp); int len, bool wait_resp);
int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb, int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb,
int cmd, bool wait_resp); int cmd, bool wait_resp);
int (*mcu_parse_response)(struct mt76_dev *dev, int cmd,
struct sk_buff *skb, int seq);
u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset); u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset);
void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val); void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val);
int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base, int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base,
......
...@@ -13,6 +13,18 @@ struct mt7603_fw_trailer { ...@@ -13,6 +13,18 @@ struct mt7603_fw_trailer {
__le32 dl_len; __le32 dl_len;
} __packed; } __packed;
static int
mt7603_mcu_parse_response(struct mt76_dev *mdev, int cmd,
struct sk_buff *skb, int seq)
{
struct mt7603_mcu_rxd *rxd = (struct mt7603_mcu_rxd *)skb->data;
if (seq != rxd->seq)
return -EAGAIN;
return 0;
}
static int static int
__mt7603_mcu_msg_send(struct mt7603_dev *dev, struct sk_buff *skb, __mt7603_mcu_msg_send(struct mt7603_dev *dev, struct sk_buff *skb,
int cmd, int *wait_seq) int cmd, int *wait_seq)
...@@ -58,7 +70,6 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, ...@@ -58,7 +70,6 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
{ {
struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
unsigned long expires = jiffies + 3 * HZ; unsigned long expires = jiffies + 3 * HZ;
struct mt7603_mcu_rxd *rxd;
struct sk_buff *skb; struct sk_buff *skb;
int ret, seq; int ret, seq;
...@@ -73,8 +84,6 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, ...@@ -73,8 +84,6 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
goto out; goto out;
while (wait_resp) { while (wait_resp) {
bool check_seq = false;
skb = mt76_mcu_get_response(&dev->mt76, expires); skb = mt76_mcu_get_response(&dev->mt76, expires);
if (!skb) { if (!skb) {
dev_err(mdev->dev, dev_err(mdev->dev,
...@@ -85,13 +94,9 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, ...@@ -85,13 +94,9 @@ mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
break; break;
} }
rxd = (struct mt7603_mcu_rxd *)skb->data; ret = mt7603_mcu_parse_response(mdev, cmd, skb, seq);
if (seq == rxd->seq)
check_seq = true;
dev_kfree_skb(skb); dev_kfree_skb(skb);
if (ret != -EAGAIN)
if (check_seq)
break; break;
} }
...@@ -266,6 +271,7 @@ int mt7603_mcu_init(struct mt7603_dev *dev) ...@@ -266,6 +271,7 @@ int mt7603_mcu_init(struct mt7603_dev *dev)
static const struct mt76_mcu_ops mt7603_mcu_ops = { static const struct mt76_mcu_ops mt7603_mcu_ops = {
.headroom = sizeof(struct mt7603_mcu_txd), .headroom = sizeof(struct mt7603_mcu_txd),
.mcu_send_msg = mt7603_mcu_msg_send, .mcu_send_msg = mt7603_mcu_msg_send,
.mcu_parse_response = mt7603_mcu_parse_response,
.mcu_restart = mt7603_mcu_restart, .mcu_restart = mt7603_mcu_restart,
}; };
......
...@@ -179,17 +179,14 @@ static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb, ...@@ -179,17 +179,14 @@ static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb,
return mt76_tx_queue_skb_raw(dev, qid, skb, 0); return mt76_tx_queue_skb_raw(dev, qid, skb, 0);
} }
static int int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd, struct sk_buff *skb, int seq)
struct sk_buff *skb, int seq)
{ {
struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data; struct mt7615_mcu_rxd *rxd = (struct mt7615_mcu_rxd *)skb->data;
int ret = 0; int ret = 0;
if (seq != rxd->seq) { if (seq != rxd->seq)
ret = -EAGAIN; return -EAGAIN;
goto out;
}
switch (cmd) { switch (cmd) {
case MCU_CMD_PATCH_SEM_CONTROL: case MCU_CMD_PATCH_SEM_CONTROL:
...@@ -228,11 +225,10 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd, ...@@ -228,11 +225,10 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,
default: default:
break; break;
} }
out:
dev_kfree_skb(skb);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(mt7615_mcu_parse_response);
int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq) int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq)
{ {
...@@ -248,7 +244,8 @@ int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq) ...@@ -248,7 +244,8 @@ int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
ret = mt7615_mcu_parse_response(dev, cmd, skb, seq); ret = mt7615_mcu_parse_response(&dev->mt76, cmd, skb, seq);
dev_kfree_skb(skb);
if (ret != -EAGAIN) if (ret != -EAGAIN)
break; break;
} }
...@@ -2467,6 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev) ...@@ -2467,6 +2464,7 @@ int mt7615_mcu_init(struct mt7615_dev *dev)
.headroom = sizeof(struct mt7615_mcu_txd), .headroom = sizeof(struct mt7615_mcu_txd),
.mcu_skb_send_msg = mt7615_mcu_send_message, .mcu_skb_send_msg = mt7615_mcu_send_message,
.mcu_send_msg = mt7615_mcu_msg_send, .mcu_send_msg = mt7615_mcu_msg_send,
.mcu_parse_response = mt7615_mcu_parse_response,
.mcu_restart = mt7615_mcu_restart, .mcu_restart = mt7615_mcu_restart,
}; };
int ret; int ret;
......
...@@ -592,6 +592,8 @@ u32 mt7615_mac_get_sta_tid_sn(struct mt7615_dev *dev, int wcid, u8 tid); ...@@ -592,6 +592,8 @@ u32 mt7615_mac_get_sta_tid_sn(struct mt7615_dev *dev, int wcid, u8 tid);
int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq); int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq);
int mt7615_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, int mt7615_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
int len, bool wait_resp); int len, bool wait_resp);
int mt7615_mcu_parse_response(struct mt76_dev *mdev, int cmd,
struct sk_buff *skb, int seq);
u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg); u32 mt7615_rf_rr(struct mt7615_dev *dev, u32 wf, u32 reg);
int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val); int mt7615_rf_wr(struct mt7615_dev *dev, u32 wf, u32 reg, u32 val);
int mt7615_mcu_set_dbdc(struct mt7615_dev *dev); int mt7615_mcu_set_dbdc(struct mt7615_dev *dev);
......
...@@ -128,6 +128,7 @@ int mt7663s_mcu_init(struct mt7615_dev *dev) ...@@ -128,6 +128,7 @@ int mt7663s_mcu_init(struct mt7615_dev *dev)
.tailroom = MT_USB_TAIL_SIZE, .tailroom = MT_USB_TAIL_SIZE,
.mcu_skb_send_msg = mt7663s_mcu_send_message, .mcu_skb_send_msg = mt7663s_mcu_send_message,
.mcu_send_msg = mt7615_mcu_msg_send, .mcu_send_msg = mt7615_mcu_msg_send,
.mcu_parse_response = mt7615_mcu_parse_response,
.mcu_restart = mt7615_mcu_restart, .mcu_restart = mt7615_mcu_restart,
.mcu_rr = mt7615_mcu_reg_rr, .mcu_rr = mt7615_mcu_reg_rr,
.mcu_wr = mt7615_mcu_reg_wr, .mcu_wr = mt7615_mcu_reg_wr,
......
...@@ -57,6 +57,7 @@ int mt7663u_mcu_init(struct mt7615_dev *dev) ...@@ -57,6 +57,7 @@ int mt7663u_mcu_init(struct mt7615_dev *dev)
.tailroom = MT_USB_TAIL_SIZE, .tailroom = MT_USB_TAIL_SIZE,
.mcu_skb_send_msg = mt7663u_mcu_send_message, .mcu_skb_send_msg = mt7663u_mcu_send_message,
.mcu_send_msg = mt7615_mcu_msg_send, .mcu_send_msg = mt7615_mcu_msg_send,
.mcu_parse_response = mt7615_mcu_parse_response,
.mcu_restart = mt7615_mcu_restart, .mcu_restart = mt7615_mcu_restart,
}; };
int ret; int ret;
......
...@@ -117,6 +117,7 @@ int mt76x0e_mcu_init(struct mt76x02_dev *dev) ...@@ -117,6 +117,7 @@ int mt76x0e_mcu_init(struct mt76x02_dev *dev)
{ {
static const struct mt76_mcu_ops mt76x0e_mcu_ops = { static const struct mt76_mcu_ops mt76x0e_mcu_ops = {
.mcu_send_msg = mt76x02_mcu_msg_send, .mcu_send_msg = mt76x02_mcu_msg_send,
.mcu_parse_response = mt76x02_mcu_parse_response,
}; };
int err; int err;
......
...@@ -10,6 +10,18 @@ ...@@ -10,6 +10,18 @@
#include "mt76x02_mcu.h" #include "mt76x02_mcu.h"
int mt76x02_mcu_parse_response(struct mt76_dev *mdev, int cmd,
struct sk_buff *skb, int seq)
{
u32 *rxfce = (u32 *)skb->cb;
if (seq != FIELD_GET(MT_RX_FCE_INFO_CMD_SEQ, *rxfce))
return -EAGAIN;
return 0;
}
EXPORT_SYMBOL_GPL(mt76x02_mcu_parse_response);
int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
int len, bool wait_resp) int len, bool wait_resp)
{ {
...@@ -44,9 +56,6 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, ...@@ -44,9 +56,6 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
goto out; goto out;
while (wait_resp) { while (wait_resp) {
u32 *rxfce;
bool check_seq = false;
skb = mt76_mcu_get_response(&dev->mt76, expires); skb = mt76_mcu_get_response(&dev->mt76, expires);
if (!skb) { if (!skb) {
dev_err(mdev->dev, dev_err(mdev->dev,
...@@ -57,13 +66,9 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, ...@@ -57,13 +66,9 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
break; break;
} }
rxfce = (u32 *)skb->cb; ret = mt76x02_mcu_parse_response(mdev, cmd, skb, seq);
if (seq == FIELD_GET(MT_RX_FCE_INFO_CMD_SEQ, *rxfce))
check_seq = true;
dev_kfree_skb(skb); dev_kfree_skb(skb);
if (check_seq) if (ret != -EAGAIN)
break; break;
} }
......
...@@ -89,6 +89,8 @@ int mt76x02_mcu_cleanup(struct mt76x02_dev *dev); ...@@ -89,6 +89,8 @@ int mt76x02_mcu_cleanup(struct mt76x02_dev *dev);
int mt76x02_mcu_calibrate(struct mt76x02_dev *dev, int type, u32 param); int mt76x02_mcu_calibrate(struct mt76x02_dev *dev, int type, u32 param);
int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data, int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
int len, bool wait_resp); int len, bool wait_resp);
int mt76x02_mcu_parse_response(struct mt76_dev *mdev, int cmd,
struct sk_buff *skb, int seq);
int mt76x02_mcu_function_select(struct mt76x02_dev *dev, enum mcu_function func, int mt76x02_mcu_function_select(struct mt76x02_dev *dev, enum mcu_function func,
u32 val); u32 val);
int mt76x02_mcu_set_radio_state(struct mt76x02_dev *dev, bool on); int mt76x02_mcu_set_radio_state(struct mt76x02_dev *dev, bool on);
......
...@@ -297,6 +297,7 @@ void mt76x02u_init_mcu(struct mt76_dev *dev) ...@@ -297,6 +297,7 @@ void mt76x02u_init_mcu(struct mt76_dev *dev)
.headroom = MT_CMD_HDR_LEN, .headroom = MT_CMD_HDR_LEN,
.tailroom = 8, .tailroom = 8,
.mcu_send_msg = mt76x02u_mcu_send_msg, .mcu_send_msg = mt76x02u_mcu_send_msg,
.mcu_parse_response = mt76x02_mcu_parse_response,
.mcu_wr_rp = mt76x02u_mcu_wr_rp, .mcu_wr_rp = mt76x02u_mcu_wr_rp,
.mcu_rd_rp = mt76x02u_mcu_rd_rp, .mcu_rd_rp = mt76x02u_mcu_rd_rp,
}; };
......
...@@ -179,6 +179,7 @@ int mt76x2_mcu_init(struct mt76x02_dev *dev) ...@@ -179,6 +179,7 @@ int mt76x2_mcu_init(struct mt76x02_dev *dev)
static const struct mt76_mcu_ops mt76x2_mcu_ops = { static const struct mt76_mcu_ops mt76x2_mcu_ops = {
.mcu_restart = mt76pci_mcu_restart, .mcu_restart = mt76pci_mcu_restart,
.mcu_send_msg = mt76x02_mcu_msg_send, .mcu_send_msg = mt76x02_mcu_msg_send,
.mcu_parse_response = mt76x02_mcu_parse_response,
}; };
int ret; int ret;
......
...@@ -309,16 +309,15 @@ mt7915_mcu_parse_eeprom(struct mt7915_dev *dev, struct sk_buff *skb) ...@@ -309,16 +309,15 @@ mt7915_mcu_parse_eeprom(struct mt7915_dev *dev, struct sk_buff *skb)
} }
static int static int
mt7915_mcu_parse_response(struct mt7915_dev *dev, int cmd, mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,
struct sk_buff *skb, int seq) struct sk_buff *skb, int seq)
{ {
struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data; struct mt7915_mcu_rxd *rxd = (struct mt7915_mcu_rxd *)skb->data;
int ret = 0; int ret = 0;
if (seq != rxd->seq) { if (seq != rxd->seq)
ret = -EAGAIN; return -EAGAIN;
goto out;
}
switch (cmd) { switch (cmd) {
case -MCU_CMD_PATCH_SEM_CONTROL: case -MCU_CMD_PATCH_SEM_CONTROL:
...@@ -335,8 +334,6 @@ mt7915_mcu_parse_response(struct mt7915_dev *dev, int cmd, ...@@ -335,8 +334,6 @@ mt7915_mcu_parse_response(struct mt7915_dev *dev, int cmd,
default: default:
break; break;
} }
out:
dev_kfree_skb(skb);
return ret; return ret;
} }
...@@ -356,7 +353,8 @@ mt7915_mcu_wait_response(struct mt7915_dev *dev, int cmd, int seq) ...@@ -356,7 +353,8 @@ mt7915_mcu_wait_response(struct mt7915_dev *dev, int cmd, int seq)
return -ETIMEDOUT; return -ETIMEDOUT;
} }
ret = mt7915_mcu_parse_response(dev, cmd, skb, seq); ret = mt7915_mcu_parse_response(&dev->mt76, cmd, skb, seq);
dev_kfree_skb(skb);
if (ret != -EAGAIN) if (ret != -EAGAIN)
break; break;
} }
...@@ -2961,6 +2959,7 @@ int mt7915_mcu_init(struct mt7915_dev *dev) ...@@ -2961,6 +2959,7 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
.headroom = sizeof(struct mt7915_mcu_txd), .headroom = sizeof(struct mt7915_mcu_txd),
.mcu_skb_send_msg = mt7915_mcu_send_message, .mcu_skb_send_msg = mt7915_mcu_send_message,
.mcu_send_msg = mt7915_mcu_msg_send, .mcu_send_msg = mt7915_mcu_msg_send,
.mcu_parse_response = mt7915_mcu_parse_response,
.mcu_restart = mt7915_mcu_restart, .mcu_restart = mt7915_mcu_restart,
}; };
int ret; int ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment