1 // SPDX-License-Identifier: ISC 2 /* 3 * Copyright (C) 2019 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com> 4 */ 5 6 #include "mt76.h" 7 8 struct sk_buff * 9 mt76_mcu_msg_alloc(const void *data, int head_len, 10 int data_len, int tail_len) 11 { 12 struct sk_buff *skb; 13 14 skb = alloc_skb(head_len + data_len + tail_len, 15 GFP_KERNEL); 16 if (!skb) 17 return NULL; 18 19 skb_reserve(skb, head_len); 20 if (data && data_len) 21 skb_put_data(skb, data, data_len); 22 23 return skb; 24 } 25 EXPORT_SYMBOL_GPL(mt76_mcu_msg_alloc); 26 27 struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev, 28 unsigned long expires) 29 { 30 unsigned long timeout; 31 32 if (!time_is_after_jiffies(expires)) 33 return NULL; 34 35 timeout = expires - jiffies; 36 wait_event_timeout(dev->mcu.wait, 37 (!skb_queue_empty(&dev->mcu.res_q) || 38 test_bit(MT76_MCU_RESET, &dev->phy.state)), 39 timeout); 40 return skb_dequeue(&dev->mcu.res_q); 41 } 42 EXPORT_SYMBOL_GPL(mt76_mcu_get_response); 43 44 void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb) 45 { 46 skb_queue_tail(&dev->mcu.res_q, skb); 47 wake_up(&dev->mcu.wait); 48 } 49 EXPORT_SYMBOL_GPL(mt76_mcu_rx_event); 50