0001
0002
0003
0004
0005
0006
0007
0008 #include "mt7601u.h"
0009 #include "eeprom.h"
0010 #include "trace.h"
0011 #include "mcu.h"
0012
0013 #include "initvals.h"
0014
0015 static void
0016 mt7601u_set_wlan_state(struct mt7601u_dev *dev, u32 val, bool enable)
0017 {
0018 int i;
0019
0020
0021
0022
0023
0024
0025
0026 if (enable)
0027 val |= (MT_WLAN_FUN_CTRL_WLAN_EN |
0028 MT_WLAN_FUN_CTRL_WLAN_CLK_EN);
0029 else
0030 val &= ~(MT_WLAN_FUN_CTRL_WLAN_EN);
0031
0032 mt7601u_wr(dev, MT_WLAN_FUN_CTRL, val);
0033 udelay(20);
0034
0035 if (enable) {
0036 set_bit(MT7601U_STATE_WLAN_RUNNING, &dev->state);
0037 } else {
0038 clear_bit(MT7601U_STATE_WLAN_RUNNING, &dev->state);
0039 return;
0040 }
0041
0042 for (i = 200; i; i--) {
0043 val = mt7601u_rr(dev, MT_CMB_CTRL);
0044
0045 if (val & MT_CMB_CTRL_XTAL_RDY && val & MT_CMB_CTRL_PLL_LD)
0046 break;
0047
0048 udelay(20);
0049 }
0050
0051
0052
0053
0054
0055 if (!i)
0056 dev_err(dev->dev, "Error: PLL and XTAL check failed!\n");
0057 }
0058
0059 static void mt7601u_chip_onoff(struct mt7601u_dev *dev, bool enable, bool reset)
0060 {
0061 u32 val;
0062
0063 mutex_lock(&dev->hw_atomic_mutex);
0064
0065 val = mt7601u_rr(dev, MT_WLAN_FUN_CTRL);
0066
0067 if (reset) {
0068 val |= MT_WLAN_FUN_CTRL_GPIO_OUT_EN;
0069 val &= ~MT_WLAN_FUN_CTRL_FRC_WL_ANT_SEL;
0070
0071 if (val & MT_WLAN_FUN_CTRL_WLAN_EN) {
0072 val |= (MT_WLAN_FUN_CTRL_WLAN_RESET |
0073 MT_WLAN_FUN_CTRL_WLAN_RESET_RF);
0074 mt7601u_wr(dev, MT_WLAN_FUN_CTRL, val);
0075 udelay(20);
0076
0077 val &= ~(MT_WLAN_FUN_CTRL_WLAN_RESET |
0078 MT_WLAN_FUN_CTRL_WLAN_RESET_RF);
0079 }
0080 }
0081
0082 mt7601u_wr(dev, MT_WLAN_FUN_CTRL, val);
0083 udelay(20);
0084
0085 mt7601u_set_wlan_state(dev, val, enable);
0086
0087 mutex_unlock(&dev->hw_atomic_mutex);
0088 }
0089
0090 static void mt7601u_reset_csr_bbp(struct mt7601u_dev *dev)
0091 {
0092 mt7601u_wr(dev, MT_MAC_SYS_CTRL, (MT_MAC_SYS_CTRL_RESET_CSR |
0093 MT_MAC_SYS_CTRL_RESET_BBP));
0094 mt7601u_wr(dev, MT_USB_DMA_CFG, 0);
0095 msleep(1);
0096 mt7601u_wr(dev, MT_MAC_SYS_CTRL, 0);
0097 }
0098
0099 static void mt7601u_init_usb_dma(struct mt7601u_dev *dev)
0100 {
0101 u32 val;
0102
0103 val = FIELD_PREP(MT_USB_DMA_CFG_RX_BULK_AGG_TOUT, MT_USB_AGGR_TIMEOUT) |
0104 FIELD_PREP(MT_USB_DMA_CFG_RX_BULK_AGG_LMT,
0105 MT_USB_AGGR_SIZE_LIMIT) |
0106 MT_USB_DMA_CFG_RX_BULK_EN |
0107 MT_USB_DMA_CFG_TX_BULK_EN;
0108 if (dev->in_max_packet == 512)
0109 val |= MT_USB_DMA_CFG_RX_BULK_AGG_EN;
0110 mt7601u_wr(dev, MT_USB_DMA_CFG, val);
0111
0112 val |= MT_USB_DMA_CFG_UDMA_RX_WL_DROP;
0113 mt7601u_wr(dev, MT_USB_DMA_CFG, val);
0114 val &= ~MT_USB_DMA_CFG_UDMA_RX_WL_DROP;
0115 mt7601u_wr(dev, MT_USB_DMA_CFG, val);
0116 }
0117
0118 static int mt7601u_init_bbp(struct mt7601u_dev *dev)
0119 {
0120 int ret;
0121
0122 ret = mt7601u_wait_bbp_ready(dev);
0123 if (ret)
0124 return ret;
0125
0126 ret = mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_BBP, bbp_common_vals,
0127 ARRAY_SIZE(bbp_common_vals));
0128 if (ret)
0129 return ret;
0130
0131 return mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_BBP, bbp_chip_vals,
0132 ARRAY_SIZE(bbp_chip_vals));
0133 }
0134
0135 static void
0136 mt76_init_beacon_offsets(struct mt7601u_dev *dev)
0137 {
0138 u16 base = MT_BEACON_BASE;
0139 u32 regs[4] = {};
0140 int i;
0141
0142 for (i = 0; i < 16; i++) {
0143 u16 addr = dev->beacon_offsets[i];
0144
0145 regs[i / 4] |= ((addr - base) / 64) << (8 * (i % 4));
0146 }
0147
0148 for (i = 0; i < 4; i++)
0149 mt7601u_wr(dev, MT_BCN_OFFSET(i), regs[i]);
0150 }
0151
0152 static int mt7601u_write_mac_initvals(struct mt7601u_dev *dev)
0153 {
0154 int ret;
0155
0156 ret = mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_WLAN, mac_common_vals,
0157 ARRAY_SIZE(mac_common_vals));
0158 if (ret)
0159 return ret;
0160 ret = mt7601u_write_reg_pairs(dev, MT_MCU_MEMMAP_WLAN,
0161 mac_chip_vals, ARRAY_SIZE(mac_chip_vals));
0162 if (ret)
0163 return ret;
0164
0165 mt76_init_beacon_offsets(dev);
0166
0167 mt7601u_wr(dev, MT_AUX_CLK_CFG, 0);
0168
0169 return 0;
0170 }
0171
0172 static int mt7601u_init_wcid_mem(struct mt7601u_dev *dev)
0173 {
0174 u32 *vals;
0175 int i, ret;
0176
0177 vals = kmalloc(sizeof(*vals) * N_WCIDS * 2, GFP_KERNEL);
0178 if (!vals)
0179 return -ENOMEM;
0180
0181 for (i = 0; i < N_WCIDS; i++) {
0182 vals[i * 2] = 0xffffffff;
0183 vals[i * 2 + 1] = 0x00ffffff;
0184 }
0185
0186 ret = mt7601u_burst_write_regs(dev, MT_WCID_ADDR_BASE,
0187 vals, N_WCIDS * 2);
0188 kfree(vals);
0189
0190 return ret;
0191 }
0192
0193 static int mt7601u_init_key_mem(struct mt7601u_dev *dev)
0194 {
0195 u32 vals[4] = {};
0196
0197 return mt7601u_burst_write_regs(dev, MT_SKEY_MODE_BASE_0,
0198 vals, ARRAY_SIZE(vals));
0199 }
0200
0201 static int mt7601u_init_wcid_attr_mem(struct mt7601u_dev *dev)
0202 {
0203 u32 *vals;
0204 int i, ret;
0205
0206 vals = kmalloc(sizeof(*vals) * N_WCIDS * 2, GFP_KERNEL);
0207 if (!vals)
0208 return -ENOMEM;
0209
0210 for (i = 0; i < N_WCIDS * 2; i++)
0211 vals[i] = 1;
0212
0213 ret = mt7601u_burst_write_regs(dev, MT_WCID_ATTR_BASE,
0214 vals, N_WCIDS * 2);
0215 kfree(vals);
0216
0217 return ret;
0218 }
0219
0220 static void mt7601u_reset_counters(struct mt7601u_dev *dev)
0221 {
0222 mt7601u_rr(dev, MT_RX_STA_CNT0);
0223 mt7601u_rr(dev, MT_RX_STA_CNT1);
0224 mt7601u_rr(dev, MT_RX_STA_CNT2);
0225 mt7601u_rr(dev, MT_TX_STA_CNT0);
0226 mt7601u_rr(dev, MT_TX_STA_CNT1);
0227 mt7601u_rr(dev, MT_TX_STA_CNT2);
0228 }
0229
0230 int mt7601u_mac_start(struct mt7601u_dev *dev)
0231 {
0232 mt7601u_wr(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_ENABLE_TX);
0233
0234 if (!mt76_poll(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_BUSY |
0235 MT_WPDMA_GLO_CFG_RX_DMA_BUSY, 0, 200000))
0236 return -ETIMEDOUT;
0237
0238 dev->rxfilter = MT_RX_FILTR_CFG_CRC_ERR |
0239 MT_RX_FILTR_CFG_PHY_ERR | MT_RX_FILTR_CFG_PROMISC |
0240 MT_RX_FILTR_CFG_VER_ERR | MT_RX_FILTR_CFG_DUP |
0241 MT_RX_FILTR_CFG_CFACK | MT_RX_FILTR_CFG_CFEND |
0242 MT_RX_FILTR_CFG_ACK | MT_RX_FILTR_CFG_CTS |
0243 MT_RX_FILTR_CFG_RTS | MT_RX_FILTR_CFG_PSPOLL |
0244 MT_RX_FILTR_CFG_BA | MT_RX_FILTR_CFG_CTRL_RSV;
0245 mt7601u_wr(dev, MT_RX_FILTR_CFG, dev->rxfilter);
0246
0247 mt7601u_wr(dev, MT_MAC_SYS_CTRL,
0248 MT_MAC_SYS_CTRL_ENABLE_TX | MT_MAC_SYS_CTRL_ENABLE_RX);
0249
0250 if (!mt76_poll(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_BUSY |
0251 MT_WPDMA_GLO_CFG_RX_DMA_BUSY, 0, 50))
0252 return -ETIMEDOUT;
0253
0254 return 0;
0255 }
0256
0257 static void mt7601u_mac_stop_hw(struct mt7601u_dev *dev)
0258 {
0259 int i, ok;
0260
0261 if (test_bit(MT7601U_STATE_REMOVED, &dev->state))
0262 return;
0263
0264 mt76_clear(dev, MT_BEACON_TIME_CFG, MT_BEACON_TIME_CFG_TIMER_EN |
0265 MT_BEACON_TIME_CFG_SYNC_MODE | MT_BEACON_TIME_CFG_TBTT_EN |
0266 MT_BEACON_TIME_CFG_BEACON_TX);
0267
0268 if (!mt76_poll(dev, MT_USB_DMA_CFG, MT_USB_DMA_CFG_TX_BUSY, 0, 1000))
0269 dev_warn(dev->dev, "Warning: TX DMA did not stop!\n");
0270
0271
0272 i = 200;
0273 while (i-- && ((mt76_rr(dev, 0x0438) & 0xffffffff) ||
0274 (mt76_rr(dev, 0x0a30) & 0x000000ff) ||
0275 (mt76_rr(dev, 0x0a34) & 0x00ff00ff)))
0276 msleep(10);
0277
0278 if (!mt76_poll(dev, MT_MAC_STATUS, MT_MAC_STATUS_TX, 0, 1000))
0279 dev_warn(dev->dev, "Warning: MAC TX did not stop!\n");
0280
0281 mt76_clear(dev, MT_MAC_SYS_CTRL, MT_MAC_SYS_CTRL_ENABLE_RX |
0282 MT_MAC_SYS_CTRL_ENABLE_TX);
0283
0284
0285 ok = 0;
0286 i = 200;
0287 while (i--) {
0288 if (!(mt76_rr(dev, MT_RXQ_STA) & 0x00ff0000) &&
0289 !mt76_rr(dev, 0x0a30) &&
0290 !mt76_rr(dev, 0x0a34)) {
0291 if (ok++ > 5)
0292 break;
0293 continue;
0294 }
0295 msleep(1);
0296 }
0297
0298 if (!mt76_poll(dev, MT_MAC_STATUS, MT_MAC_STATUS_RX, 0, 1000))
0299 dev_warn(dev->dev, "Warning: MAC RX did not stop!\n");
0300
0301 if (!mt76_poll(dev, MT_USB_DMA_CFG, MT_USB_DMA_CFG_RX_BUSY, 0, 1000))
0302 dev_warn(dev->dev, "Warning: RX DMA did not stop!\n");
0303 }
0304
0305 void mt7601u_mac_stop(struct mt7601u_dev *dev)
0306 {
0307 mt7601u_mac_stop_hw(dev);
0308 flush_delayed_work(&dev->stat_work);
0309 cancel_delayed_work_sync(&dev->stat_work);
0310 }
0311
0312 static void mt7601u_stop_hardware(struct mt7601u_dev *dev)
0313 {
0314 mt7601u_chip_onoff(dev, false, false);
0315 }
0316
0317 int mt7601u_init_hardware(struct mt7601u_dev *dev)
0318 {
0319 static const u16 beacon_offsets[16] = {
0320
0321 0xc000, 0xc200, 0xc400, 0xc600,
0322 0xc800, 0xca00, 0xcc00, 0xce00,
0323 0xd000, 0xd200, 0xd400, 0xd600,
0324 0xd800, 0xda00, 0xdc00, 0xde00
0325 };
0326 int ret;
0327
0328 dev->beacon_offsets = beacon_offsets;
0329
0330 mt7601u_chip_onoff(dev, true, false);
0331
0332 ret = mt7601u_wait_asic_ready(dev);
0333 if (ret)
0334 goto err;
0335 ret = mt7601u_mcu_init(dev);
0336 if (ret)
0337 goto err;
0338
0339 if (!mt76_poll_msec(dev, MT_WPDMA_GLO_CFG,
0340 MT_WPDMA_GLO_CFG_TX_DMA_BUSY |
0341 MT_WPDMA_GLO_CFG_RX_DMA_BUSY, 0, 100)) {
0342 ret = -EIO;
0343 goto err;
0344 }
0345
0346
0347 ret = mt7601u_wait_asic_ready(dev);
0348 if (ret)
0349 goto err;
0350
0351 mt7601u_reset_csr_bbp(dev);
0352 mt7601u_init_usb_dma(dev);
0353
0354 ret = mt7601u_mcu_cmd_init(dev);
0355 if (ret)
0356 goto err;
0357 ret = mt7601u_dma_init(dev);
0358 if (ret)
0359 goto err_mcu;
0360 ret = mt7601u_write_mac_initvals(dev);
0361 if (ret)
0362 goto err_rx;
0363
0364 if (!mt76_poll_msec(dev, MT_MAC_STATUS,
0365 MT_MAC_STATUS_TX | MT_MAC_STATUS_RX, 0, 100)) {
0366 ret = -EIO;
0367 goto err_rx;
0368 }
0369
0370 ret = mt7601u_init_bbp(dev);
0371 if (ret)
0372 goto err_rx;
0373 ret = mt7601u_init_wcid_mem(dev);
0374 if (ret)
0375 goto err_rx;
0376 ret = mt7601u_init_key_mem(dev);
0377 if (ret)
0378 goto err_rx;
0379 ret = mt7601u_init_wcid_attr_mem(dev);
0380 if (ret)
0381 goto err_rx;
0382
0383 mt76_clear(dev, MT_BEACON_TIME_CFG, (MT_BEACON_TIME_CFG_TIMER_EN |
0384 MT_BEACON_TIME_CFG_SYNC_MODE |
0385 MT_BEACON_TIME_CFG_TBTT_EN |
0386 MT_BEACON_TIME_CFG_BEACON_TX));
0387
0388 mt7601u_reset_counters(dev);
0389
0390 mt7601u_rmw(dev, MT_US_CYC_CFG, MT_US_CYC_CNT, 0x1e);
0391
0392 mt7601u_wr(dev, MT_TXOP_CTRL_CFG,
0393 FIELD_PREP(MT_TXOP_TRUN_EN, 0x3f) |
0394 FIELD_PREP(MT_TXOP_EXT_CCA_DLY, 0x58));
0395
0396 ret = mt7601u_eeprom_init(dev);
0397 if (ret)
0398 goto err_rx;
0399
0400 ret = mt7601u_phy_init(dev);
0401 if (ret)
0402 goto err_rx;
0403
0404 mt7601u_set_rx_path(dev, 0);
0405 mt7601u_set_tx_dac(dev, 0);
0406
0407 mt7601u_mac_set_ctrlch(dev, false);
0408 mt7601u_bbp_set_ctrlch(dev, false);
0409 mt7601u_bbp_set_bw(dev, MT_BW_20);
0410
0411 return 0;
0412
0413 err_rx:
0414 mt7601u_dma_cleanup(dev);
0415 err_mcu:
0416 mt7601u_mcu_cmd_deinit(dev);
0417 err:
0418 mt7601u_chip_onoff(dev, false, false);
0419 return ret;
0420 }
0421
0422 void mt7601u_cleanup(struct mt7601u_dev *dev)
0423 {
0424 if (!test_and_clear_bit(MT7601U_STATE_INITIALIZED, &dev->state))
0425 return;
0426
0427 mt7601u_stop_hardware(dev);
0428 mt7601u_dma_cleanup(dev);
0429 mt7601u_mcu_cmd_deinit(dev);
0430 }
0431
0432 struct mt7601u_dev *mt7601u_alloc_device(struct device *pdev)
0433 {
0434 struct ieee80211_hw *hw;
0435 struct mt7601u_dev *dev;
0436
0437 hw = ieee80211_alloc_hw(sizeof(*dev), &mt7601u_ops);
0438 if (!hw)
0439 return NULL;
0440
0441 dev = hw->priv;
0442 dev->dev = pdev;
0443 dev->hw = hw;
0444 mutex_init(&dev->vendor_req_mutex);
0445 mutex_init(&dev->reg_atomic_mutex);
0446 mutex_init(&dev->hw_atomic_mutex);
0447 mutex_init(&dev->mutex);
0448 spin_lock_init(&dev->tx_lock);
0449 spin_lock_init(&dev->rx_lock);
0450 spin_lock_init(&dev->lock);
0451 spin_lock_init(&dev->mac_lock);
0452 spin_lock_init(&dev->con_mon_lock);
0453 atomic_set(&dev->avg_ampdu_len, 1);
0454 skb_queue_head_init(&dev->tx_skb_done);
0455
0456 dev->stat_wq = alloc_workqueue("mt7601u", WQ_UNBOUND, 0);
0457 if (!dev->stat_wq) {
0458 ieee80211_free_hw(hw);
0459 return NULL;
0460 }
0461
0462 return dev;
0463 }
0464
0465 #define CHAN2G(_idx, _freq) { \
0466 .band = NL80211_BAND_2GHZ, \
0467 .center_freq = (_freq), \
0468 .hw_value = (_idx), \
0469 .max_power = 30, \
0470 }
0471
0472 static const struct ieee80211_channel mt76_channels_2ghz[] = {
0473 CHAN2G(1, 2412),
0474 CHAN2G(2, 2417),
0475 CHAN2G(3, 2422),
0476 CHAN2G(4, 2427),
0477 CHAN2G(5, 2432),
0478 CHAN2G(6, 2437),
0479 CHAN2G(7, 2442),
0480 CHAN2G(8, 2447),
0481 CHAN2G(9, 2452),
0482 CHAN2G(10, 2457),
0483 CHAN2G(11, 2462),
0484 CHAN2G(12, 2467),
0485 CHAN2G(13, 2472),
0486 CHAN2G(14, 2484),
0487 };
0488
0489 #define CCK_RATE(_idx, _rate) { \
0490 .bitrate = _rate, \
0491 .flags = IEEE80211_RATE_SHORT_PREAMBLE, \
0492 .hw_value = (MT_PHY_TYPE_CCK << 8) | _idx, \
0493 .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (8 + _idx), \
0494 }
0495
0496 #define OFDM_RATE(_idx, _rate) { \
0497 .bitrate = _rate, \
0498 .hw_value = (MT_PHY_TYPE_OFDM << 8) | _idx, \
0499 .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | _idx, \
0500 }
0501
0502 static struct ieee80211_rate mt76_rates[] = {
0503 CCK_RATE(0, 10),
0504 CCK_RATE(1, 20),
0505 CCK_RATE(2, 55),
0506 CCK_RATE(3, 110),
0507 OFDM_RATE(0, 60),
0508 OFDM_RATE(1, 90),
0509 OFDM_RATE(2, 120),
0510 OFDM_RATE(3, 180),
0511 OFDM_RATE(4, 240),
0512 OFDM_RATE(5, 360),
0513 OFDM_RATE(6, 480),
0514 OFDM_RATE(7, 540),
0515 };
0516
0517 static int
0518 mt76_init_sband(struct mt7601u_dev *dev, struct ieee80211_supported_band *sband,
0519 const struct ieee80211_channel *chan, int n_chan,
0520 struct ieee80211_rate *rates, int n_rates)
0521 {
0522 struct ieee80211_sta_ht_cap *ht_cap;
0523 void *chanlist;
0524 int size;
0525
0526 size = n_chan * sizeof(*chan);
0527 chanlist = devm_kmemdup(dev->dev, chan, size, GFP_KERNEL);
0528 if (!chanlist)
0529 return -ENOMEM;
0530
0531 sband->channels = chanlist;
0532 sband->n_channels = n_chan;
0533 sband->bitrates = rates;
0534 sband->n_bitrates = n_rates;
0535
0536 ht_cap = &sband->ht_cap;
0537 ht_cap->ht_supported = true;
0538 ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
0539 IEEE80211_HT_CAP_GRN_FLD |
0540 IEEE80211_HT_CAP_SGI_20 |
0541 IEEE80211_HT_CAP_SGI_40 |
0542 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
0543
0544 ht_cap->mcs.rx_mask[0] = 0xff;
0545 ht_cap->mcs.rx_mask[4] = 0x1;
0546 ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
0547 ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
0548 ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_2;
0549
0550 dev->chandef.chan = &sband->channels[0];
0551
0552 return 0;
0553 }
0554
0555 static int
0556 mt76_init_sband_2g(struct mt7601u_dev *dev)
0557 {
0558 dev->sband_2g = devm_kzalloc(dev->dev, sizeof(*dev->sband_2g),
0559 GFP_KERNEL);
0560 if (!dev->sband_2g)
0561 return -ENOMEM;
0562
0563 dev->hw->wiphy->bands[NL80211_BAND_2GHZ] = dev->sband_2g;
0564
0565 WARN_ON(dev->ee->reg.start - 1 + dev->ee->reg.num >
0566 ARRAY_SIZE(mt76_channels_2ghz));
0567
0568 return mt76_init_sband(dev, dev->sband_2g,
0569 &mt76_channels_2ghz[dev->ee->reg.start - 1],
0570 dev->ee->reg.num,
0571 mt76_rates, ARRAY_SIZE(mt76_rates));
0572 }
0573
0574 int mt7601u_register_device(struct mt7601u_dev *dev)
0575 {
0576 struct ieee80211_hw *hw = dev->hw;
0577 struct wiphy *wiphy = hw->wiphy;
0578 int ret;
0579
0580
0581
0582
0583 dev->wcid_mask[0] |= 1;
0584
0585
0586 dev->mon_wcid = devm_kmalloc(dev->dev, sizeof(*dev->mon_wcid),
0587 GFP_KERNEL);
0588 if (!dev->mon_wcid)
0589 return -ENOMEM;
0590 dev->mon_wcid->idx = 0xff;
0591 dev->mon_wcid->hw_key_idx = -1;
0592
0593 SET_IEEE80211_DEV(hw, dev->dev);
0594
0595 hw->queues = 4;
0596 ieee80211_hw_set(hw, SIGNAL_DBM);
0597 ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
0598 ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES);
0599 ieee80211_hw_set(hw, AMPDU_AGGREGATION);
0600 ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
0601 ieee80211_hw_set(hw, MFP_CAPABLE);
0602 hw->max_rates = 1;
0603 hw->max_report_rates = 7;
0604 hw->max_rate_tries = 1;
0605
0606 hw->sta_data_size = sizeof(struct mt76_sta);
0607 hw->vif_data_size = sizeof(struct mt76_vif);
0608
0609 SET_IEEE80211_PERM_ADDR(hw, dev->macaddr);
0610
0611 wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
0612 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
0613 wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
0614
0615 wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
0616
0617 ret = mt76_init_sband_2g(dev);
0618 if (ret)
0619 return ret;
0620
0621 INIT_DELAYED_WORK(&dev->mac_work, mt7601u_mac_work);
0622 INIT_DELAYED_WORK(&dev->stat_work, mt7601u_tx_stat);
0623
0624 ret = ieee80211_register_hw(hw);
0625 if (ret)
0626 return ret;
0627
0628 mt7601u_init_debugfs(dev);
0629
0630 return 0;
0631 }