Skip to content

Commit

Permalink
mt76: implement functions to get the response skb for MCU calls
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Felix Fietkau committed Dec 4, 2020
1 parent 14b80ba commit ae5ad62
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 12 deletions.
23 changes: 15 additions & 8 deletions drivers/net/wireless/mediatek/mt76/mcu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -89,12 +93,15 @@ 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:
mutex_unlock(&dev->mcu.mutex);

return ret;
}
EXPORT_SYMBOL_GPL(mt76_mcu_skb_send_msg);
EXPORT_SYMBOL_GPL(mt76_mcu_skb_send_and_get_msg);
21 changes: 17 additions & 4 deletions drivers/net/wireless/mediatek/mt76/mt76.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit ae5ad62

Please sign in to comment.