xref: /linux/drivers/net/wireless/mediatek/mt7601u/init.c (revision a4eb44a6435d6d8f9e642407a4a06f65eb90ca04)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * (c) Copyright 2002-2010, Ralink Technology, Inc.
4  * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
5  * Copyright (C) 2015 Jakub Kicinski <kubakici@wp.pl>
6  */
7 
8 #include "mt7601u.h"
9 #include "eeprom.h"
10 #include "trace.h"
11 #include "mcu.h"
12 
13 #include "initvals.h"
14 
15 static void
16 mt7601u_set_wlan_state(struct mt7601u_dev *dev, u32 val, bool enable)
17 {
18 	int i;
19 
20 	/* Note: we don't turn off WLAN_CLK because that makes the device
21 	 *	 not respond properly on the probe path.
22 	 *	 In case anyone (PSM?) wants to use this function we can
23 	 *	 bring the clock stuff back and fixup the probe path.
24 	 */
25 
26 	if (enable)
27 		val |= (MT_WLAN_FUN_CTRL_WLAN_EN |
28 			MT_WLAN_FUN_CTRL_WLAN_CLK_EN);
29 	else
30 		val &= ~(MT_WLAN_FUN_CTRL_WLAN_EN);
31 
32 	mt7601u_wr(dev, MT_WLAN_FUN_CTRL, val);
33 	udelay(20);
34 
35 	if (enable) {
36 		set_bit(MT7601U_STATE_WLAN_RUNNING, &dev->state);
37 	} else {
38 		clear_bit(MT7601U_STATE_WLAN_RUNNING, &dev->state);
39 		return;
40 	}
41 
42 	for (i = 200; i; i--) {
43 		val = mt7601u_rr(dev, MT_CMB_CTRL);
44 
45 		if (val & MT_CMB_CTRL_XTAL_RDY && val & MT_CMB_CTRL_PLL_LD)
46 			break;
47 
48 		udelay(20);
49 	}
50 
51 	/* Note: vendor driver tries to disable/enable wlan here and retry
52 	 *       but the code which does it is so buggy it must have never
53 	 *       triggered, so don't bother.
54 	 */
55 	if (!i)
56 		dev_err(dev->dev, "Error: PLL and XTAL check failed!\n");
57 }
58 
59 static void mt7601u_chip_onoff(struct mt7601u_dev *dev, bool enable, bool reset)
60 {
61 	u32 val;
62 
63 	mutex_lock(&dev->hw_atomic_mutex);
64 
65 	val = mt7601u_rr(dev, MT_WLAN_FUN_CTRL);
66 
67 	if (reset) {
68 		val |= MT_WLAN_FUN_CTRL_GPIO_OUT_EN;
69 		val &= ~MT_WLAN_FUN_CTRL_FRC_WL_ANT_SEL;
70 
71 		if (val & MT_WLAN_FUN_CTRL_WLAN_EN) {
72 			val |= (MT_WLAN_FUN_CTRL_WLAN_RESET |
73 				MT_WLAN_FUN_CTRL_WLAN_RESET_RF);
74 			mt7601u_wr(dev, MT_WLAN_FUN_CTRL, val);
75 			udelay(20);
76 
77 			val &= ~(MT_WLAN_FUN_CTRL_WLAN_RESET |
78 				 MT_WLAN_FUN_CTRL_WLAN_RESET_RF);
79 		}
80 	}
81 
82 	mt7601u_wr(dev, MT_WLAN_FUN_CTRL, val);
83 	udelay(20);
84 
85 	mt7601u_set_wlan_state(dev, val, enable);
86 
87 	mutex_unlock(&dev->hw_atomic_mutex);
88 }
89 
90 static void mt7601u_reset_csr_bbp(struct mt7601u_dev *dev)
91 {
92 	mt7601u_wr(dev, MT_MAC_SYS_CTRL, (MT_MAC_SYS_CTRL_RESET_CSR |
93 					  MT_MAC_SYS_CTRL_RESET_BBP));
94 	mt7601u_wr(dev, MT_USB_DMA_CFG, 0);
95 	msleep(1);
96 	mt7601u_wr(dev, MT_MAC_SYS_CTRL, 0);
97 }
98 
99 static void mt7601u_init_usb_dma(struct mt7601u_dev *dev)
100 {
101 	u32 val;
102 
103 	val = FIELD_PREP(MT_USB_DMA_CFG_RX_BULK_AGG_TOUT, MT_USB_AGGR_TIMEOUT) |
104 	      FIELD_PREP(MT_USB_DMA_CFG_RX_BULK_AGG_LMT,
105 			 MT_USB_AGGR_SIZE_LIMIT) |
106 	      MT_USB_DMA_CFG_RX_BULK_EN |
107 	      MT_USB_DMA_CFG_TX_BULK_EN;
108 	if (dev->in_max_packet == 512)
109 		val |= MT_USB_DMA_CFG_RX_BULK_AGG_EN;
110 	mt7601u_wr(dev, MT_USB_DMA_CFG, val);
111 
112 	val |= MT_USB_DMA_CFG_UDMA_RX_WL_DROP;
113 	mt7601u_wr(dev, MT_USB_DMA_CFG, val);
114 	val &= ~MT_USB_DMA_CFG_UDMA_RX_WL_DROP;
115 	mt7601u_wr(dev, MT_USB_DMA_CFG, val);
116 }
117 
118 static int mt7601u_init_bbp(struct mt7601u_dev *dev)
119 {
120 	int ret;
121 
122 	ret = mt7601u_wait_bbp_ready(dev);
123 	if (ret)
124 		return ret;
125 
126 	ret = mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_BBP, bbp_common_vals,
127 				      ARRAY_SIZE(bbp_common_vals));
128 	if (ret)
129 		return ret;
130 
131 	return mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_BBP, bbp_chip_vals,
132 				       ARRAY_SIZE(bbp_chip_vals));
133 }
134 
135 static void
136 mt76_init_beacon_offsets(struct mt7601u_dev *dev)
137 {
138 	u16 base = MT_BEACON_BASE;
139 	u32 regs[4] = {};
140 	int i;
141 
142 	for (i = 0; i < 16; i++) {
143 		u16 addr = dev->beacon_offsets[i];
144 
145 		regs[i / 4] |= ((addr - base) / 64) << (8 * (i % 4));
146 	}
147 
148 	for (i = 0; i < 4; i++)
149 		mt7601u_wr(dev, MT_BCN_OFFSET(i), regs[i]);
150 }
151 
152 static int mt7601u_write_mac_initvals(struct mt7601u_dev *dev)
153 {
154 	int ret;
155 
156 	ret = mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_WLAN, mac_common_vals,
157 				      ARRAY_SIZE(mac_common_vals));
158 	if (ret)
159 		return ret;
160 	ret = mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_WLAN,
161 				      mac_chip_vals, ARRAY_SIZE(mac_chip_vals));
162 	if (ret)
163 		return ret;
164 
165 	mt76_init_beacon_offsets(dev);
166 
167 	mt7601u_wr(dev, MT_AUX_CLK_CFG, 0);
168 
169 	return 0;
170 }
171 
172 static int mt7601u_init_wcid_mem(struct mt7601u_dev *dev)
173 {
174 	u32 *vals;
175 	int i, ret;
176 
177 	vals = kmalloc(sizeof(*vals) * N_WCIDS * 2, GFP_KERNEL);
178 	if (!vals)
179 		return -ENOMEM;
180 
181 	for (i = 0; i < N_WCIDS; i++)  {
182 		vals[i * 2] = 0xffffffff;
183 		vals[i * 2 + 1] = 0x00ffffff;
184 	}
185 
186 	ret = mt7601u_burst_write_regs(dev, MT_WCID_ADDR_BASE,
187 				       vals, N_WCIDS * 2);
188 	kfree(vals);
189 
190 	return ret;
191 }
192 
193 static int mt7601u_init_key_mem(struct mt7601u_dev *dev)
194 {
195 	u32 vals[4] = {};
196 
197 	return mt7601u_burst_write_regs(dev, MT_SKEY_MODE_BASE_0,
198 					vals, ARRAY_SIZE(vals));
199 }
200 
201 static int mt7601u_init_wcid_attr_mem(struct mt7601u_dev *dev)
202 {
203 	u32 *vals;
204 	int i, ret;
205 
206 	vals = kmalloc(sizeof(*vals) * N_WCIDS * 2, GFP_KERNEL);
207 	if (!vals)
208 		return -ENOMEM;
209 
210 	for (i = 0; i < N_WCIDS * 2; i++)
211 		vals[i] = 1;
212 
213 	ret = mt7601u_burst_write_regs(dev, MT_WCID_ATTR_BASE,
214 				       vals, N_WCIDS * 2);
215 	kfree(vals);
216 
217 	return ret;
218 }
219 
220 static void mt7601u_reset_counters(struct mt7601u_dev *dev)
221 {
222 	mt7601u_rr(dev, MT_RX_STA_CNT0);
223 	mt7601u_rr(dev, MT_RX_STA_CNT1);
224 	mt7601u_rr(dev, MT_RX_STA_CNT2);
225 	mt7601u_rr(dev, MT_TX_STA_CNT0);
226 	mt7601u_rr(dev, MT_TX_STA_CNT1);
227 	mt7601u_rr(dev, MT_TX_STA_CNT2);
228 }
229 
230 int mt7601u_mac_start(struct mt7601u_dev *dev)
231 {
232 	mt7601u_wr(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_ENABLE_TX);
233 
234 	if (!mt76_poll(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_BUSY |
235 		       MT_WPDMA_GLO_CFG_RX_DMA_BUSY, 0, 200000))
236 		return -ETIMEDOUT;
237 
238 	dev->rxfilter = MT_RX_FILTR_CFG_CRC_ERR |
239 		MT_RX_FILTR_CFG_PHY_ERR | MT_RX_FILTR_CFG_PROMISC |
240 		MT_RX_FILTR_CFG_VER_ERR | MT_RX_FILTR_CFG_DUP |
241 		MT_RX_FILTR_CFG_CFACK | MT_RX_FILTR_CFG_CFEND |
242 		MT_RX_FILTR_CFG_ACK | MT_RX_FILTR_CFG_CTS |
243 		MT_RX_FILTR_CFG_RTS | MT_RX_FILTR_CFG_PSPOLL |
244 		MT_RX_FILTR_CFG_BA | MT_RX_FILTR_CFG_CTRL_RSV;
245 	mt7601u_wr(dev, MT_RX_FILTR_CFG, dev->rxfilter);
246 
247 	mt7601u_wr(dev, MT_MAC_SYS_CTRL,
248 		   MT_MAC_SYS_CTRL_ENABLE_TX | MT_MAC_SYS_CTRL_ENABLE_RX);
249 
250 	if (!mt76_poll(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_BUSY |
251 		       MT_WPDMA_GLO_CFG_RX_DMA_BUSY, 0, 50))
252 		return -ETIMEDOUT;
253 
254 	return 0;
255 }
256 
257 static void mt7601u_mac_stop_hw(struct mt7601u_dev *dev)
258 {
259 	int i, ok;
260 
261 	if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
262 		return;
263 
264 	mt76_clear(dev, MT_BEACON_TIME_CFG, MT_BEACON_TIME_CFG_TIMER_EN |
265 		   MT_BEACON_TIME_CFG_SYNC_MODE | MT_BEACON_TIME_CFG_TBTT_EN |
266 		   MT_BEACON_TIME_CFG_BEACON_TX);
267 
268 	if (!mt76_poll(dev, MT_USB_DMA_CFG, MT_USB_DMA_CFG_TX_BUSY, 0, 1000))
269 		dev_warn(dev->dev, "Warning: TX DMA did not stop!\n");
270 
271 	/* Page count on TxQ */
272 	i = 200;
273 	while (i-- && ((mt76_rr(dev, 0x0438) & 0xffffffff) ||
274 		       (mt76_rr(dev, 0x0a30) & 0x000000ff) ||
275 		       (mt76_rr(dev, 0x0a34) & 0x00ff00ff)))
276 		msleep(10);
277 
278 	if (!mt76_poll(dev, MT_MAC_STATUS, MT_MAC_STATUS_TX, 0, 1000))
279 		dev_warn(dev->dev, "Warning: MAC TX did not stop!\n");
280 
281 	mt76_clear(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_ENABLE_RX |
282 					 MT_MAC_SYS_CTRL_ENABLE_TX);
283 
284 	/* Page count on RxQ */
285 	ok = 0;
286 	i = 200;
287 	while (i--) {
288 		if (!(mt76_rr(dev, MT_RXQ_STA) & 0x00ff0000) &&
289 		    !mt76_rr(dev, 0x0a30) &&
290 		    !mt76_rr(dev, 0x0a34)) {
291 			if (ok++ > 5)
292 				break;
293 			continue;
294 		}
295 		msleep(1);
296 	}
297 
298 	if (!mt76_poll(dev, MT_MAC_STATUS, MT_MAC_STATUS_RX, 0, 1000))
299 		dev_warn(dev->dev, "Warning: MAC RX did not stop!\n");
300 
301 	if (!mt76_poll(dev, MT_USB_DMA_CFG, MT_USB_DMA_CFG_RX_BUSY, 0, 1000))
302 		dev_warn(dev->dev, "Warning: RX DMA did not stop!\n");
303 }
304 
305 void mt7601u_mac_stop(struct mt7601u_dev *dev)
306 {
307 	mt7601u_mac_stop_hw(dev);
308 	flush_delayed_work(&dev->stat_work);
309 	cancel_delayed_work_sync(&dev->stat_work);
310 }
311 
312 static void mt7601u_stop_hardware(struct mt7601u_dev *dev)
313 {
314 	mt7601u_chip_onoff(dev, false, false);
315 }
316 
317 int mt7601u_init_hardware(struct mt7601u_dev *dev)
318 {
319 	static const u16 beacon_offsets[16] = {
320 		/* 512 byte per beacon */
321 		0xc000,	0xc200,	0xc400,	0xc600,
322 		0xc800,	0xca00,	0xcc00,	0xce00,
323 		0xd000,	0xd200,	0xd400,	0xd600,
324 		0xd800,	0xda00,	0xdc00,	0xde00
325 	};
326 	int ret;
327 
328 	dev->beacon_offsets = beacon_offsets;
329 
330 	mt7601u_chip_onoff(dev, true, false);
331 
332 	ret = mt7601u_wait_asic_ready(dev);
333 	if (ret)
334 		goto err;
335 	ret = mt7601u_mcu_init(dev);
336 	if (ret)
337 		goto err;
338 
339 	if (!mt76_poll_msec(dev, MT_WPDMA_GLO_CFG,
340 			    MT_WPDMA_GLO_CFG_TX_DMA_BUSY |
341 			    MT_WPDMA_GLO_CFG_RX_DMA_BUSY, 0, 100)) {
342 		ret = -EIO;
343 		goto err;
344 	}
345 
346 	/* Wait for ASIC ready after FW load. */
347 	ret = mt7601u_wait_asic_ready(dev);
348 	if (ret)
349 		goto err;
350 
351 	mt7601u_reset_csr_bbp(dev);
352 	mt7601u_init_usb_dma(dev);
353 
354 	ret = mt7601u_mcu_cmd_init(dev);
355 	if (ret)
356 		goto err;
357 	ret = mt7601u_dma_init(dev);
358 	if (ret)
359 		goto err_mcu;
360 	ret = mt7601u_write_mac_initvals(dev);
361 	if (ret)
362 		goto err_rx;
363 
364 	if (!mt76_poll_msec(dev, MT_MAC_STATUS,
365 			    MT_MAC_STATUS_TX | MT_MAC_STATUS_RX, 0, 100)) {
366 		ret = -EIO;
367 		goto err_rx;
368 	}
369 
370 	ret = mt7601u_init_bbp(dev);
371 	if (ret)
372 		goto err_rx;
373 	ret = mt7601u_init_wcid_mem(dev);
374 	if (ret)
375 		goto err_rx;
376 	ret = mt7601u_init_key_mem(dev);
377 	if (ret)
378 		goto err_rx;
379 	ret = mt7601u_init_wcid_attr_mem(dev);
380 	if (ret)
381 		goto err_rx;
382 
383 	mt76_clear(dev, MT_BEACON_TIME_CFG, (MT_BEACON_TIME_CFG_TIMER_EN |
384 					     MT_BEACON_TIME_CFG_SYNC_MODE |
385 					     MT_BEACON_TIME_CFG_TBTT_EN |
386 					     MT_BEACON_TIME_CFG_BEACON_TX));
387 
388 	mt7601u_reset_counters(dev);
389 
390 	mt7601u_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e);
391 
392 	mt7601u_wr(dev, MT_TXOP_CTRL_CFG,
393 		   FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) |
394 		   FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58));
395 
396 	ret = mt7601u_eeprom_init(dev);
397 	if (ret)
398 		goto err_rx;
399 
400 	ret = mt7601u_phy_init(dev);
401 	if (ret)
402 		goto err_rx;
403 
404 	mt7601u_set_rx_path(dev, 0);
405 	mt7601u_set_tx_dac(dev, 0);
406 
407 	mt7601u_mac_set_ctrlch(dev, false);
408 	mt7601u_bbp_set_ctrlch(dev, false);
409 	mt7601u_bbp_set_bw(dev, MT_BW_20);
410 
411 	return 0;
412 
413 err_rx:
414 	mt7601u_dma_cleanup(dev);
415 err_mcu:
416 	mt7601u_mcu_cmd_deinit(dev);
417 err:
418 	mt7601u_chip_onoff(dev, false, false);
419 	return ret;
420 }
421 
422 void mt7601u_cleanup(struct mt7601u_dev *dev)
423 {
424 	if (!test_and_clear_bit(MT7601U_STATE_INITIALIZED, &dev->state))
425 		return;
426 
427 	mt7601u_stop_hardware(dev);
428 	mt7601u_dma_cleanup(dev);
429 	mt7601u_mcu_cmd_deinit(dev);
430 }
431 
432 struct mt7601u_dev *mt7601u_alloc_device(struct device *pdev)
433 {
434 	struct ieee80211_hw *hw;
435 	struct mt7601u_dev *dev;
436 
437 	hw = ieee80211_alloc_hw(sizeof(*dev), &mt7601u_ops);
438 	if (!hw)
439 		return NULL;
440 
441 	dev = hw->priv;
442 	dev->dev = pdev;
443 	dev->hw = hw;
444 	mutex_init(&dev->vendor_req_mutex);
445 	mutex_init(&dev->reg_atomic_mutex);
446 	mutex_init(&dev->hw_atomic_mutex);
447 	mutex_init(&dev->mutex);
448 	spin_lock_init(&dev->tx_lock);
449 	spin_lock_init(&dev->rx_lock);
450 	spin_lock_init(&dev->lock);
451 	spin_lock_init(&dev->mac_lock);
452 	spin_lock_init(&dev->con_mon_lock);
453 	atomic_set(&dev->avg_ampdu_len, 1);
454 	skb_queue_head_init(&dev->tx_skb_done);
455 
456 	dev->stat_wq = alloc_workqueue("mt7601u", WQ_UNBOUND, 0);
457 	if (!dev->stat_wq) {
458 		ieee80211_free_hw(hw);
459 		return NULL;
460 	}
461 
462 	return dev;
463 }
464 
465 #define CHAN2G(_idx, _freq) {			\
466 	.band = NL80211_BAND_2GHZ,		\
467 	.center_freq = (_freq),			\
468 	.hw_value = (_idx),			\
469 	.max_power = 30,			\
470 }
471 
472 static const struct ieee80211_channel mt76_channels_2ghz[] = {
473 	CHAN2G(1, 2412),
474 	CHAN2G(2, 2417),
475 	CHAN2G(3, 2422),
476 	CHAN2G(4, 2427),
477 	CHAN2G(5, 2432),
478 	CHAN2G(6, 2437),
479 	CHAN2G(7, 2442),
480 	CHAN2G(8, 2447),
481 	CHAN2G(9, 2452),
482 	CHAN2G(10, 2457),
483 	CHAN2G(11, 2462),
484 	CHAN2G(12, 2467),
485 	CHAN2G(13, 2472),
486 	CHAN2G(14, 2484),
487 };
488 
489 #define CCK_RATE(_idx, _rate) {					\
490 	.bitrate = _rate,					\
491 	.flags = IEEE80211_RATE_SHORT_PREAMBLE,			\
492 	.hw_value = (MT_PHY_TYPE_CCK << 8) | _idx,		\
493 	.hw_value_short = (MT_PHY_TYPE_CCK << 8) | (8 + _idx),	\
494 }
495 
496 #define OFDM_RATE(_idx, _rate) {				\
497 	.bitrate = _rate,					\
498 	.hw_value = (MT_PHY_TYPE_OFDM << 8) | _idx,		\
499 	.hw_value_short = (MT_PHY_TYPE_OFDM << 8) | _idx,	\
500 }
501 
502 static struct ieee80211_rate mt76_rates[] = {
503 	CCK_RATE(0, 10),
504 	CCK_RATE(1, 20),
505 	CCK_RATE(2, 55),
506 	CCK_RATE(3, 110),
507 	OFDM_RATE(0, 60),
508 	OFDM_RATE(1, 90),
509 	OFDM_RATE(2, 120),
510 	OFDM_RATE(3, 180),
511 	OFDM_RATE(4, 240),
512 	OFDM_RATE(5, 360),
513 	OFDM_RATE(6, 480),
514 	OFDM_RATE(7, 540),
515 };
516 
517 static int
518 mt76_init_sband(struct mt7601u_dev *dev, struct ieee80211_supported_band *sband,
519 		const struct ieee80211_channel *chan, int n_chan,
520 		struct ieee80211_rate *rates, int n_rates)
521 {
522 	struct ieee80211_sta_ht_cap *ht_cap;
523 	void *chanlist;
524 	int size;
525 
526 	size = n_chan * sizeof(*chan);
527 	chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL);
528 	if (!chanlist)
529 		return -ENOMEM;
530 
531 	sband->channels = chanlist;
532 	sband->n_channels = n_chan;
533 	sband->bitrates = rates;
534 	sband->n_bitrates = n_rates;
535 
536 	ht_cap = &sband->ht_cap;
537 	ht_cap->ht_supported = true;
538 	ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
539 		      IEEE80211_HT_CAP_GRN_FLD |
540 		      IEEE80211_HT_CAP_SGI_20 |
541 		      IEEE80211_HT_CAP_SGI_40 |
542 		      (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
543 
544 	ht_cap->mcs.rx_mask[0] = 0xff;
545 	ht_cap->mcs.rx_mask[4] = 0x1;
546 	ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
547 	ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
548 	ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_2;
549 
550 	dev->chandef.chan = &sband->channels[0];
551 
552 	return 0;
553 }
554 
555 static int
556 mt76_init_sband_2g(struct mt7601u_dev *dev)
557 {
558 	dev->sband_2g = devm_kzalloc(dev->dev, sizeof(*dev->sband_2g),
559 				     GFP_KERNEL);
560 	if (!dev->sband_2g)
561 		return -ENOMEM;
562 
563 	dev->hw->wiphy->bands[NL80211_BAND_2GHZ] = dev->sband_2g;
564 
565 	WARN_ON(dev->ee->reg.start - 1 + dev->ee->reg.num >
566 		ARRAY_SIZE(mt76_channels_2ghz));
567 
568 	return mt76_init_sband(dev, dev->sband_2g,
569 			       &mt76_channels_2ghz[dev->ee->reg.start - 1],
570 			       dev->ee->reg.num,
571 			       mt76_rates, ARRAY_SIZE(mt76_rates));
572 }
573 
574 int mt7601u_register_device(struct mt7601u_dev *dev)
575 {
576 	struct ieee80211_hw *hw = dev->hw;
577 	struct wiphy *wiphy = hw->wiphy;
578 	int ret;
579 
580 	/* Reserve WCID 0 for mcast - thanks to this APs WCID will go to
581 	 * entry no. 1 like it does in the vendor driver.
582 	 */
583 	dev->wcid_mask[0] |= 1;
584 
585 	/* init fake wcid for monitor interfaces */
586 	dev->mon_wcid = devm_kmalloc(dev->dev, sizeof(*dev->mon_wcid),
587 				     GFP_KERNEL);
588 	if (!dev->mon_wcid)
589 		return -ENOMEM;
590 	dev->mon_wcid->idx = 0xff;
591 	dev->mon_wcid->hw_key_idx = -1;
592 
593 	SET_IEEE80211_DEV(hw, dev->dev);
594 
595 	hw->queues = 4;
596 	ieee80211_hw_set(hw, SIGNAL_DBM);
597 	ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
598 	ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES);
599 	ieee80211_hw_set(hw, AMPDU_AGGREGATION);
600 	ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
601 	ieee80211_hw_set(hw, MFP_CAPABLE);
602 	hw->max_rates = 1;
603 	hw->max_report_rates = 7;
604 	hw->max_rate_tries = 1;
605 
606 	hw->sta_data_size = sizeof(struct mt76_sta);
607 	hw->vif_data_size = sizeof(struct mt76_vif);
608 
609 	SET_IEEE80211_PERM_ADDR(hw, dev->macaddr);
610 
611 	wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
612 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
613 	wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
614 
615 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
616 
617 	ret = mt76_init_sband_2g(dev);
618 	if (ret)
619 		return ret;
620 
621 	INIT_DELAYED_WORK(&dev->mac_work, mt7601u_mac_work);
622 	INIT_DELAYED_WORK(&dev->stat_work, mt7601u_tx_stat);
623 
624 	ret = ieee80211_register_hw(hw);
625 	if (ret)
626 		return ret;
627 
628 	mt7601u_init_debugfs(dev);
629 
630 	return 0;
631 }
632