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