developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 1 | From 47cfa806f1e2945d1d63f3642207cbdb205e9a12 Mon Sep 17 00:00:00 2001 |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 2 | From: Sujuan Chen <sujuan.chen@mediatek.com> |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 3 | Date: Fri, 25 Nov 2022 14:07:46 +0800 |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 4 | Subject: [PATCH 3005/3011] mt76: mt7915: wed: add ser support when wed on |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 5 | |
| 6 | Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> |
| 7 | --- |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 8 | dma.c | 29 ++++++++++++++++++++--------- |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 9 | dma.h | 1 + |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 10 | mt76.h | 1 + |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 11 | mt7915/dma.c | 37 ++++++++++++++++++++++++++++++++----- |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 12 | mt7915/mac.c | 18 ++++++++++++++++++ |
| 13 | mt7915/mmio.c | 3 +++ |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 14 | mt7915/mt7915.h | 1 + |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 15 | 7 files changed, 76 insertions(+), 14 deletions(-) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 16 | |
| 17 | diff --git a/dma.c b/dma.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 18 | index 53c7528f..35beec72 100644 |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 19 | --- a/dma.c |
| 20 | +++ b/dma.c |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 21 | @@ -165,7 +165,7 @@ mt76_free_pending_txwi(struct mt76_dev *dev) |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 22 | local_bh_enable(); |
| 23 | } |
| 24 | |
| 25 | -static void |
| 26 | +void |
| 27 | mt76_free_pending_rxwi(struct mt76_dev *dev) |
| 28 | { |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 29 | struct mt76_txwi_cache *t; |
| 30 | @@ -178,6 +178,7 @@ mt76_free_pending_rxwi(struct mt76_dev *dev) |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 31 | } |
| 32 | local_bh_enable(); |
| 33 | } |
| 34 | +EXPORT_SYMBOL_GPL(mt76_free_pending_rxwi); |
| 35 | |
| 36 | static void |
| 37 | mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q) |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 38 | @@ -618,14 +619,18 @@ mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 39 | return frames; |
| 40 | } |
| 41 | |
| 42 | -static int |
| 43 | -mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) |
| 44 | +int |
| 45 | +mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q, bool reset) |
| 46 | { |
| 47 | #ifdef CONFIG_NET_MEDIATEK_SOC_WED |
| 48 | struct mtk_wed_device *wed = &dev->mmio.wed; |
| 49 | int ret, type, ring; |
| 50 | - u8 flags = q->flags; |
| 51 | + u8 flags; |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 52 | |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 53 | + if (!q || !q->ndesc) |
| 54 | + return -EINVAL; |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 55 | + |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 56 | + flags = q->flags; |
| 57 | if (!mtk_wed_device_active(wed)) |
| 58 | q->flags &= ~MT_QFLAG_WED; |
| 59 | |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 60 | @@ -637,7 +642,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 61 | |
| 62 | switch (type) { |
| 63 | case MT76_WED_Q_TX: |
| 64 | - ret = mtk_wed_device_tx_ring_setup(wed, ring, q->regs); |
| 65 | + ret = mtk_wed_device_tx_ring_setup(wed, ring, q->regs, reset); |
| 66 | if (!ret) |
| 67 | q->wed_regs = wed->tx_ring[ring].reg_base; |
| 68 | break; |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 69 | @@ -653,7 +658,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 70 | q->wed_regs = wed->txfree_ring.reg_base; |
| 71 | break; |
| 72 | case MT76_WED_Q_RX: |
| 73 | - ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs); |
| 74 | + ret = mtk_wed_device_rx_ring_setup(wed, ring, q->regs, reset); |
| 75 | if (!ret) |
| 76 | q->wed_regs = wed->rx_ring[ring].reg_base; |
| 77 | break; |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 78 | @@ -666,6 +671,7 @@ mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 79 | return 0; |
| 80 | #endif |
| 81 | } |
| 82 | +EXPORT_SYMBOL_GPL(mt76_dma_wed_setup); |
| 83 | |
| 84 | static int |
| 85 | mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 86 | @@ -692,7 +698,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q, |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 87 | if (!q->entry) |
| 88 | return -ENOMEM; |
| 89 | |
| 90 | - ret = mt76_dma_wed_setup(dev, q); |
| 91 | + ret = mt76_dma_wed_setup(dev, q, false); |
| 92 | if (ret) |
| 93 | return ret; |
| 94 | |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 95 | @@ -743,8 +749,13 @@ mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 96 | q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE); |
| 97 | |
| 98 | mt76_dma_rx_cleanup(dev, q); |
| 99 | - mt76_dma_sync_idx(dev, q); |
| 100 | - mt76_dma_rx_fill(dev, q); |
| 101 | + |
| 102 | + mt76_dma_wed_setup(dev, q, true); |
| 103 | + |
| 104 | + if (q->flags != MT_WED_Q_TXFREE) { |
| 105 | + mt76_dma_sync_idx(dev, q); |
| 106 | + mt76_dma_rx_fill(dev, q); |
| 107 | + } |
| 108 | |
| 109 | if (!q->rx_head) |
| 110 | return; |
| 111 | diff --git a/dma.h b/dma.h |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 112 | index 53c6ce25..4b9bc7f4 100644 |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 113 | --- a/dma.h |
| 114 | +++ b/dma.h |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 115 | @@ -56,5 +56,6 @@ enum mt76_mcu_evt_type { |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 116 | int mt76_dma_rx_poll(struct napi_struct *napi, int budget); |
| 117 | void mt76_dma_attach(struct mt76_dev *dev); |
| 118 | void mt76_dma_cleanup(struct mt76_dev *dev); |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 119 | +int mt76_dma_wed_setup(struct mt76_dev *dev, struct mt76_queue *q, bool reset); |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 120 | |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 121 | #endif |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 122 | diff --git a/mt76.h b/mt76.h |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 123 | index 74818a59..b7fa1724 100644 |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 124 | --- a/mt76.h |
| 125 | +++ b/mt76.h |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 126 | @@ -1383,6 +1383,7 @@ mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb) |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 127 | void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); |
| 128 | void mt76_put_rxwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); |
| 129 | struct mt76_txwi_cache *mt76_get_rxwi(struct mt76_dev *dev); |
| 130 | +void mt76_free_pending_rxwi(struct mt76_dev *dev); |
| 131 | void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, |
| 132 | struct napi_struct *napi); |
| 133 | void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 134 | diff --git a/mt7915/dma.c b/mt7915/dma.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 135 | index e3fa0649..1ae6c339 100644 |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 136 | --- a/mt7915/dma.c |
| 137 | +++ b/mt7915/dma.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 138 | @@ -4,6 +4,7 @@ |
| 139 | #include "mt7915.h" |
| 140 | #include "../dma.h" |
| 141 | #include "mac.h" |
| 142 | +#include <linux/rtnetlink.h> |
| 143 | |
| 144 | static int |
| 145 | mt7915_init_tx_queues(struct mt7915_phy *phy, int idx, int n_desc, int ring_base) |
| 146 | @@ -562,6 +563,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2) |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 147 | int mt7915_dma_reset(struct mt7915_dev *dev, bool force) |
| 148 | { |
developer | 4df64ba | 2022-09-01 14:44:55 +0800 | [diff] [blame] | 149 | struct mt76_phy *mphy_ext = dev->mt76.phys[MT_BAND1]; |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 150 | + struct mtk_wed_device *wed = &dev->mt76.mmio.wed; |
| 151 | int i; |
| 152 | |
| 153 | /* clean up hw queues */ |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 154 | @@ -581,28 +583,53 @@ int mt7915_dma_reset(struct mt7915_dev *dev, bool force) |
developer | 2cbf2fb | 2022-11-16 12:20:48 +0800 | [diff] [blame] | 155 | if (force) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 156 | mt7915_wfsys_reset(dev); |
| 157 | |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 158 | + if (mtk_wed_device_active(&dev->mt76.mmio.wed)) |
| 159 | + mtk_wed_device_dma_reset(&dev->mt76.mmio.wed); |
| 160 | mt7915_dma_disable(dev, force); |
| 161 | |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 162 | + /* set wifi reset done, wait FE reset */ |
| 163 | + if (mtk_wed_device_active(wed) && atomic_read(&wed->fe_reset)) { |
| 164 | + atomic_set(&wed->fe_reset, 0); |
| 165 | + rtnl_lock(); |
| 166 | + complete(&wed->wlan_reset_done); |
| 167 | + rtnl_unlock(); |
| 168 | + wait_for_completion(&wed->fe_reset_done); |
| 169 | + } |
| 170 | + |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 171 | /* reset hw queues */ |
| 172 | for (i = 0; i < __MT_TXQ_MAX; i++) { |
| 173 | mt76_queue_reset(dev, dev->mphy.q_tx[i]); |
| 174 | - if (mphy_ext) |
| 175 | + if (mphy_ext) { |
| 176 | mt76_queue_reset(dev, mphy_ext->q_tx[i]); |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 177 | + if (mtk_wed_device_active(wed)) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 178 | + mt76_dma_wed_setup(&dev->mt76, |
| 179 | + mphy_ext->q_tx[i], |
| 180 | + true); |
| 181 | + } |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 182 | + if (mtk_wed_device_active(wed)) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 183 | + mt76_dma_wed_setup(&dev->mt76, dev->mphy.q_tx[i], |
| 184 | + true); |
| 185 | } |
| 186 | |
| 187 | for (i = 0; i < __MT_MCUQ_MAX; i++) |
| 188 | mt76_queue_reset(dev, dev->mt76.q_mcu[i]); |
| 189 | |
| 190 | - mt76_for_each_q_rx(&dev->mt76, i) |
| 191 | - mt76_queue_reset(dev, &dev->mt76.q_rx[i]); |
| 192 | + mt76_for_each_q_rx(&dev->mt76, i) { |
| 193 | + if (dev->mt76.q_rx[i].flags != MT_WED_Q_TXFREE) |
| 194 | + mt76_queue_reset(dev, &dev->mt76.q_rx[i]); |
| 195 | + } |
| 196 | |
| 197 | mt76_tx_status_check(&dev->mt76, true); |
| 198 | |
| 199 | - mt7915_dma_enable(dev); |
| 200 | - |
| 201 | mt76_for_each_q_rx(&dev->mt76, i) |
| 202 | mt76_queue_rx_reset(dev, i); |
| 203 | |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 204 | + if(mtk_wed_device_active(wed) && is_mt7915(&dev->mt76)) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 205 | + mt76_rmw(dev, MT_WFDMA0_EXT0_CFG, MT_WFDMA0_EXT0_RXWB_KEEP, |
| 206 | + MT_WFDMA0_EXT0_RXWB_KEEP); |
| 207 | + |
| 208 | + mt7915_dma_enable(dev); |
| 209 | + |
| 210 | return 0; |
| 211 | } |
| 212 | |
| 213 | diff --git a/mt7915/mac.c b/mt7915/mac.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 214 | index 5373777a..d5df73db 100644 |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 215 | --- a/mt7915/mac.c |
| 216 | +++ b/mt7915/mac.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 217 | @@ -894,6 +894,18 @@ u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id) |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 218 | return MT_TXD_TXP_BUF_SIZE; |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 219 | } |
| 220 | |
| 221 | +void mt7915_wed_trigger_ser(struct mtk_wed_device *wed) |
| 222 | +{ |
| 223 | + struct mt7915_dev *dev; |
| 224 | + u8 band_idx; |
| 225 | + dev = container_of(wed, struct mt7915_dev, mt76.mmio.wed); |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 226 | + band_idx = dev->phy.mt76->band_idx; |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 227 | + |
| 228 | + mt7915_mcu_set_ser(dev, SER_RECOVER, 1, band_idx); |
| 229 | + |
| 230 | + return; |
| 231 | +} |
| 232 | + |
| 233 | static void |
| 234 | mt7915_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi) |
| 235 | { |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 236 | @@ -1633,6 +1645,12 @@ void mt7915_mac_reset_work(struct work_struct *work) |
developer | 2cbf2fb | 2022-11-16 12:20:48 +0800 | [diff] [blame] | 237 | if (!(READ_ONCE(dev->recovery.state) & MT_MCU_CMD_STOP_DMA)) |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 238 | return; |
| 239 | |
| 240 | + if (mtk_wed_device_active(&dev->mt76.mmio.wed)) { |
| 241 | + mtk_wed_device_stop(&dev->mt76.mmio.wed, true); |
| 242 | + if (!is_mt7986(&dev->mt76)) |
| 243 | + mt76_wr(dev, MT_INT_WED_MASK_CSR, 0); |
| 244 | + } |
| 245 | + |
| 246 | ieee80211_stop_queues(mt76_hw(dev)); |
| 247 | if (ext_phy) |
| 248 | ieee80211_stop_queues(ext_phy->hw); |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 249 | diff --git a/mt7915/mmio.c b/mt7915/mmio.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 250 | index ffe23406..6fb3419d 100644 |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 251 | --- a/mt7915/mmio.c |
| 252 | +++ b/mt7915/mmio.c |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 253 | @@ -617,6 +617,8 @@ static void mt7915_mmio_wed_release_rx_buf(struct mtk_wed_device *wed) |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 254 | mt76_put_rxwi(&dev->mt76, t); |
| 255 | } |
| 256 | |
| 257 | + mt76_free_pending_rxwi(&dev->mt76); |
| 258 | + |
| 259 | if (!wed->rx_buf_ring.rx_page.va) |
| 260 | return; |
| 261 | |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 262 | @@ -782,6 +784,7 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr, |
| 263 | wed->wlan.init_rx_buf = mt7915_mmio_wed_init_rx_buf; |
| 264 | wed->wlan.release_rx_buf = mt7915_mmio_wed_release_rx_buf; |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 265 | wed->wlan.update_wo_rx_stats = mt7915_mmio_wed_update_rx_stats; |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 266 | + wed->wlan.ser_trigger = mt7915_wed_trigger_ser; |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 267 | |
| 268 | dev->mt76.rx_token_size = wed->wlan.rx_npkt; |
| 269 | |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 270 | diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 271 | index 51453058..c39be358 100644 |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 272 | --- a/mt7915/mt7915.h |
| 273 | +++ b/mt7915/mt7915.h |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 274 | @@ -561,6 +561,7 @@ void mt7915_wfsys_reset(struct mt7915_dev *dev); |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 275 | irqreturn_t mt7915_irq_handler(int irq, void *dev_instance); |
| 276 | u64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif); |
| 277 | u32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id); |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 278 | +void mt7915_wed_trigger_ser(struct mtk_wed_device *wed); |
developer | 3d5faf2 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 279 | |
developer | 6e3b5d1 | 2022-08-16 15:37:38 +0800 | [diff] [blame] | 280 | int mt7915_register_device(struct mt7915_dev *dev); |
| 281 | void mt7915_unregister_device(struct mt7915_dev *dev); |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 282 | -- |
developer | 2458e70 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 283 | 2.25.1 |
developer | c89c547 | 2022-08-02 13:00:04 +0800 | [diff] [blame] | 284 | |