Lines Matching +full:c +full:- +full:phy
1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2022 MediaTek Inc.
54 dev = container_of(mphy->dev, struct mt7996_dev, mt76); in mt7996_led_set_config()
69 if (mphy->leds.al) in mt7996_led_set_config()
107 int i, nss = hweight8(dev->mphy.antenna_mask); in mt7996_init_txpower()
109 int pwr_delta = mt7996_eeprom_get_power_delta(dev, sband->band); in mt7996_init_txpower()
112 for (i = 0; i < sband->n_channels; i++) { in mt7996_init_txpower()
113 struct ieee80211_channel *chan = &sband->channels[i]; in mt7996_init_txpower()
117 target_power = mt76_get_rate_power_limits(&dev->mphy, chan, in mt7996_init_txpower()
122 chan->max_power = min_t(int, chan->max_reg_power, in mt7996_init_txpower()
124 chan->orig_mpwr = target_power; in mt7996_init_txpower()
134 struct mt7996_phy *phy = mt7996_hw_phy(hw); in mt7996_regd_notifier() local
136 memcpy(dev->mt76.alpha2, request->alpha2, sizeof(dev->mt76.alpha2)); in mt7996_regd_notifier()
137 dev->mt76.region = request->dfs_region; in mt7996_regd_notifier()
139 if (dev->mt76.region == NL80211_DFS_UNSET) in mt7996_regd_notifier()
140 mt7996_mcu_rdd_background_enable(phy, NULL); in mt7996_regd_notifier()
142 mt7996_init_txpower(dev, &phy->mt76->sband_2g.sband); in mt7996_regd_notifier()
143 mt7996_init_txpower(dev, &phy->mt76->sband_5g.sband); in mt7996_regd_notifier()
144 mt7996_init_txpower(dev, &phy->mt76->sband_6g.sband); in mt7996_regd_notifier()
146 phy->mt76->dfs_state = MT_DFS_STATE_UNKNOWN; in mt7996_regd_notifier()
147 mt7996_dfs_init_radar_detector(phy); in mt7996_regd_notifier()
153 struct mt7996_phy *phy = mt7996_hw_phy(hw); in mt7996_init_wiphy() local
154 struct mt76_dev *mdev = &phy->dev->mt76; in mt7996_init_wiphy()
155 struct wiphy *wiphy = hw->wiphy; in mt7996_init_wiphy()
156 u16 max_subframes = phy->dev->has_eht ? IEEE80211_MAX_AMPDU_BUF_EHT : in mt7996_init_wiphy()
159 hw->queues = 4; in mt7996_init_wiphy()
160 hw->max_rx_aggregation_subframes = max_subframes; in mt7996_init_wiphy()
161 hw->max_tx_aggregation_subframes = max_subframes; in mt7996_init_wiphy()
162 hw->netdev_features = NETIF_F_RXCSUM; in mt7996_init_wiphy()
164 hw->radiotap_timestamp.units_pos = in mt7996_init_wiphy()
167 phy->slottime = 9; in mt7996_init_wiphy()
169 hw->sta_data_size = sizeof(struct mt7996_sta); in mt7996_init_wiphy()
170 hw->vif_data_size = sizeof(struct mt7996_vif); in mt7996_init_wiphy()
172 wiphy->iface_combinations = if_comb; in mt7996_init_wiphy()
173 wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); in mt7996_init_wiphy()
174 wiphy->reg_notifier = mt7996_regd_notifier; in mt7996_init_wiphy()
175 wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; in mt7996_init_wiphy()
189 if (!mdev->dev->of_node || in mt7996_init_wiphy()
190 !of_property_read_bool(mdev->dev->of_node, in mt7996_init_wiphy()
191 "mediatek,disable-radar-background")) in mt7996_init_wiphy()
200 hw->max_tx_fragments = 4; in mt7996_init_wiphy()
202 if (phy->mt76->cap.has_2ghz) { in mt7996_init_wiphy()
203 phy->mt76->sband_2g.sband.ht_cap.cap |= in mt7996_init_wiphy()
206 phy->mt76->sband_2g.sband.ht_cap.ampdu_density = in mt7996_init_wiphy()
210 if (phy->mt76->cap.has_5ghz) { in mt7996_init_wiphy()
211 phy->mt76->sband_5g.sband.ht_cap.cap |= in mt7996_init_wiphy()
215 phy->mt76->sband_5g.sband.vht_cap.cap |= in mt7996_init_wiphy()
220 phy->mt76->sband_5g.sband.ht_cap.ampdu_density = in mt7996_init_wiphy()
226 mt76_set_stream_caps(phy->mt76, true); in mt7996_init_wiphy()
227 mt7996_set_stream_vht_txbf_caps(phy); in mt7996_init_wiphy()
228 mt7996_set_stream_he_eht_caps(phy); in mt7996_init_wiphy()
230 wiphy->available_antennas_rx = phy->mt76->antenna_mask; in mt7996_init_wiphy()
231 wiphy->available_antennas_tx = phy->mt76->antenna_mask; in mt7996_init_wiphy()
256 /* filter out non-resp frames and get instanstaeous signal reporting */ in mt7996_mac_init_band()
289 i = dev->mphy.leds.pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; in mt7996_mac_init()
317 if (dev->dbdc_support) { in mt7996_txbf_init()
332 static int mt7996_register_phy(struct mt7996_dev *dev, struct mt7996_phy *phy, in mt7996_register_phy() argument
342 if ((band == MT_BAND1 && !dev->dbdc_support) || in mt7996_register_phy()
343 (band == MT_BAND2 && !dev->tbtc_support)) in mt7996_register_phy()
346 if (phy) in mt7996_register_phy()
349 if (band == MT_BAND2 && dev->hif2) in mt7996_register_phy()
350 hif1_ofs = MT_WFDMA0_PCIE1(0) - MT_WFDMA0(0); in mt7996_register_phy()
352 mphy = mt76_alloc_phy(&dev->mt76, sizeof(*phy), &mt7996_ops, band); in mt7996_register_phy()
354 return -ENOMEM; in mt7996_register_phy()
356 phy = mphy->priv; in mt7996_register_phy()
357 phy->dev = dev; in mt7996_register_phy()
358 phy->mt76 = mphy; in mt7996_register_phy()
359 mphy->dev->phys[band] = mphy; in mt7996_register_phy()
361 INIT_DELAYED_WORK(&mphy->mac_work, mt7996_mac_work); in mt7996_register_phy()
363 ret = mt7996_eeprom_parse_hw_cap(dev, phy); in mt7996_register_phy()
368 memcpy(mphy->macaddr, dev->mt76.eeprom.data + mac_ofs, ETH_ALEN); in mt7996_register_phy()
369 /* Make the extra PHY MAC address local without overlapping with in mt7996_register_phy()
372 if (!is_valid_ether_addr(mphy->macaddr)) { in mt7996_register_phy()
373 memcpy(mphy->macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR, in mt7996_register_phy()
375 mphy->macaddr[0] |= 2; in mt7996_register_phy()
376 mphy->macaddr[0] ^= BIT(7); in mt7996_register_phy()
378 mphy->macaddr[0] ^= BIT(6); in mt7996_register_phy()
382 /* init wiphy according to mphy and phy */ in mt7996_register_phy()
383 mt7996_init_wiphy(mphy->hw); in mt7996_register_phy()
384 ret = mt76_connac_init_tx_queues(phy->mt76, in mt7996_register_phy()
396 ret = mt7996_init_debugfs(phy); in mt7996_register_phy()
403 mphy->dev->phys[band] = NULL; in mt7996_register_phy()
404 ieee80211_free_hw(mphy->hw); in mt7996_register_phy()
409 mt7996_unregister_phy(struct mt7996_phy *phy, enum mt76_band_id band) in mt7996_unregister_phy() argument
413 if (!phy) in mt7996_unregister_phy()
416 mphy = phy->dev->mt76.phys[band]; in mt7996_unregister_phy()
418 ieee80211_free_hw(mphy->hw); in mt7996_unregister_phy()
419 phy->dev->mt76.phys[band] = NULL; in mt7996_unregister_phy()
429 mt7996_init_txpower(dev, &dev->mphy.sband_2g.sband); in mt7996_init_work()
430 mt7996_init_txpower(dev, &dev->mphy.sband_5g.sband); in mt7996_init_work()
431 mt7996_init_txpower(dev, &dev->mphy.sband_6g.sband); in mt7996_init_work()
450 INIT_WORK(&dev->init_work, mt7996_init_work); in mt7996_init_hardware()
452 dev->dbdc_support = true; in mt7996_init_hardware()
453 dev->tbtc_support = true; in mt7996_init_hardware()
459 set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state); in mt7996_init_hardware()
470 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7996_WTBL_STA); in mt7996_init_hardware()
472 return -ENOSPC; in mt7996_init_hardware()
474 dev->mt76.global_wcid.idx = idx; in mt7996_init_hardware()
475 dev->mt76.global_wcid.hw_key_idx = -1; in mt7996_init_hardware()
476 dev->mt76.global_wcid.tx_info |= MT_WCID_TX_INFO_SET; in mt7996_init_hardware()
477 rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid); in mt7996_init_hardware()
482 void mt7996_set_stream_vht_txbf_caps(struct mt7996_phy *phy) in mt7996_set_stream_vht_txbf_caps() argument
487 if (!phy->mt76->cap.has_5ghz) in mt7996_set_stream_vht_txbf_caps()
490 sts = hweight16(phy->mt76->chainmask); in mt7996_set_stream_vht_txbf_caps()
491 cap = &phy->mt76->sband_5g.sband.vht_cap.cap; in mt7996_set_stream_vht_txbf_caps()
495 FIELD_PREP(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK, sts - 1); in mt7996_set_stream_vht_txbf_caps()
506 FIELD_PREP(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK, sts - 1); in mt7996_set_stream_vht_txbf_caps()
510 mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy, in mt7996_set_stream_he_txbf_caps() argument
513 struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem; in mt7996_set_stream_he_txbf_caps()
514 int sts = hweight16(phy->mt76->chainmask); in mt7996_set_stream_he_txbf_caps()
515 u8 c; in mt7996_set_stream_he_txbf_caps() local
522 elem->phy_cap_info[3] &= ~IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
523 elem->phy_cap_info[4] &= ~IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
525 c = IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK | in mt7996_set_stream_he_txbf_caps()
527 elem->phy_cap_info[5] &= ~c; in mt7996_set_stream_he_txbf_caps()
529 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | in mt7996_set_stream_he_txbf_caps()
531 elem->phy_cap_info[6] &= ~c; in mt7996_set_stream_he_txbf_caps()
533 elem->phy_cap_info[7] &= ~IEEE80211_HE_PHY_CAP7_MAX_NC_MASK; in mt7996_set_stream_he_txbf_caps()
535 c = IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US | in mt7996_set_stream_he_txbf_caps()
538 elem->phy_cap_info[2] |= c; in mt7996_set_stream_he_txbf_caps()
540 c = IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE | in mt7996_set_stream_he_txbf_caps()
543 elem->phy_cap_info[4] |= c; in mt7996_set_stream_he_txbf_caps()
546 c = IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU | in mt7996_set_stream_he_txbf_caps()
550 c |= IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO; in mt7996_set_stream_he_txbf_caps()
552 elem->phy_cap_info[6] |= c; in mt7996_set_stream_he_txbf_caps()
558 elem->phy_cap_info[7] |= min_t(int, sts - 1, 2) << 3; in mt7996_set_stream_he_txbf_caps()
563 elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
565 c = FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK, in mt7996_set_stream_he_txbf_caps()
566 sts - 1) | in mt7996_set_stream_he_txbf_caps()
568 sts - 1); in mt7996_set_stream_he_txbf_caps()
569 elem->phy_cap_info[5] |= c; in mt7996_set_stream_he_txbf_caps()
574 elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; in mt7996_set_stream_he_txbf_caps()
576 c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB | in mt7996_set_stream_he_txbf_caps()
578 elem->phy_cap_info[6] |= c; in mt7996_set_stream_he_txbf_caps()
580 c = IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ | in mt7996_set_stream_he_txbf_caps()
582 elem->phy_cap_info[7] |= c; in mt7996_set_stream_he_txbf_caps()
586 mt7996_init_he_caps(struct mt7996_phy *phy, enum nl80211_band band, in mt7996_init_he_caps() argument
590 struct ieee80211_sta_he_cap *he_cap = &data->he_cap; in mt7996_init_he_caps()
591 struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem; in mt7996_init_he_caps()
592 struct ieee80211_he_mcs_nss_supp *he_mcs = &he_cap->he_mcs_nss_supp; in mt7996_init_he_caps()
593 int i, nss = hweight8(phy->mt76->antenna_mask); in mt7996_init_he_caps()
603 he_cap->has_he = true; in mt7996_init_he_caps()
605 he_cap_elem->mac_cap_info[0] = IEEE80211_HE_MAC_CAP0_HTC_HE; in mt7996_init_he_caps()
606 he_cap_elem->mac_cap_info[3] = IEEE80211_HE_MAC_CAP3_OMI_CONTROL | in mt7996_init_he_caps()
608 he_cap_elem->mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU; in mt7996_init_he_caps()
611 he_cap_elem->phy_cap_info[0] = in mt7996_init_he_caps()
614 he_cap_elem->phy_cap_info[0] = in mt7996_init_he_caps()
618 he_cap_elem->phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD; in mt7996_init_he_caps()
619 he_cap_elem->phy_cap_info[2] = IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ | in mt7996_init_he_caps()
624 he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_RES; in mt7996_init_he_caps()
625 he_cap_elem->mac_cap_info[2] |= IEEE80211_HE_MAC_CAP2_BSR; in mt7996_init_he_caps()
626 he_cap_elem->mac_cap_info[4] |= IEEE80211_HE_MAC_CAP4_BQR; in mt7996_init_he_caps()
627 he_cap_elem->mac_cap_info[5] |= in mt7996_init_he_caps()
629 he_cap_elem->phy_cap_info[3] |= in mt7996_init_he_caps()
632 he_cap_elem->phy_cap_info[6] |= in mt7996_init_he_caps()
635 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
640 he_cap_elem->mac_cap_info[1] |= in mt7996_init_he_caps()
644 he_cap_elem->phy_cap_info[0] |= in mt7996_init_he_caps()
647 he_cap_elem->phy_cap_info[0] |= in mt7996_init_he_caps()
650 he_cap_elem->phy_cap_info[1] |= in mt7996_init_he_caps()
653 he_cap_elem->phy_cap_info[3] |= in mt7996_init_he_caps()
656 he_cap_elem->phy_cap_info[6] |= in mt7996_init_he_caps()
660 he_cap_elem->phy_cap_info[7] |= in mt7996_init_he_caps()
663 he_cap_elem->phy_cap_info[8] |= in mt7996_init_he_caps()
668 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
680 he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
681 he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
682 he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
683 he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map); in mt7996_init_he_caps()
685 mt7996_set_stream_he_txbf_caps(phy, he_cap, iftype); in mt7996_init_he_caps()
687 memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres)); in mt7996_init_he_caps()
688 if (he_cap_elem->phy_cap_info[6] & in mt7996_init_he_caps()
690 mt76_connac_gen_ppe_thresh(he_cap->ppe_thres, nss); in mt7996_init_he_caps()
692 he_cap_elem->phy_cap_info[9] |= in mt7996_init_he_caps()
708 data->he_6ghz_capa.capa = cpu_to_le16(cap); in mt7996_init_he_caps()
713 mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band, in mt7996_init_eht_caps() argument
717 struct ieee80211_sta_eht_cap *eht_cap = &data->eht_cap; in mt7996_init_eht_caps()
718 struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem; in mt7996_init_eht_caps()
719 struct ieee80211_eht_mcs_nss_supp *eht_nss = &eht_cap->eht_mcs_nss_supp; in mt7996_init_eht_caps()
720 enum nl80211_chan_width width = phy->mt76->chandef.width; in mt7996_init_eht_caps()
721 int nss = hweight8(phy->mt76->antenna_mask); in mt7996_init_eht_caps()
722 int sts = hweight16(phy->mt76->chainmask); in mt7996_init_eht_caps()
725 if (!phy->dev->has_eht) in mt7996_init_eht_caps()
728 eht_cap->has_eht = true; in mt7996_init_eht_caps()
730 eht_cap_elem->mac_cap_info[0] = in mt7996_init_eht_caps()
734 eht_cap_elem->phy_cap_info[0] = in mt7996_init_eht_caps()
739 val = max_t(u8, sts - 1, 3); in mt7996_init_eht_caps()
740 eht_cap_elem->phy_cap_info[0] |= in mt7996_init_eht_caps()
744 eht_cap_elem->phy_cap_info[1] = in mt7996_init_eht_caps()
750 eht_cap_elem->phy_cap_info[2] = in mt7996_init_eht_caps()
751 u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK) | in mt7996_init_eht_caps()
752 u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK); in mt7996_init_eht_caps()
755 eht_cap_elem->phy_cap_info[0] |= in mt7996_init_eht_caps()
758 eht_cap_elem->phy_cap_info[1] |= in mt7996_init_eht_caps()
762 eht_cap_elem->phy_cap_info[2] |= in mt7996_init_eht_caps()
763 u8_encode_bits(sts - 1, in mt7996_init_eht_caps()
767 eht_cap_elem->phy_cap_info[3] = in mt7996_init_eht_caps()
773 eht_cap_elem->phy_cap_info[4] = in mt7996_init_eht_caps()
774 u8_encode_bits(min_t(int, sts - 1, 2), in mt7996_init_eht_caps()
777 eht_cap_elem->phy_cap_info[5] = in mt7996_init_eht_caps()
786 eht_cap_elem->phy_cap_info[6] = in mt7996_init_eht_caps()
794 eht_nss->bw._##_bw.rx_tx_mcs9_max_nss = _val; \ in mt7996_init_eht_caps()
795 eht_nss->bw._##_bw.rx_tx_mcs11_max_nss = _val; \ in mt7996_init_eht_caps()
796 eht_nss->bw._##_bw.rx_tx_mcs13_max_nss = _val; \ in mt7996_init_eht_caps()
808 eht_cap_elem->phy_cap_info[3] |= in mt7996_init_eht_caps()
812 eht_cap_elem->phy_cap_info[7] = in mt7996_init_eht_caps()
821 eht_cap_elem->phy_cap_info[7] |= in mt7996_init_eht_caps()
827 __mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy, in __mt7996_set_stream_he_eht_caps() argument
831 struct ieee80211_sband_iftype_data *data = phy->iftype[band]; in __mt7996_set_stream_he_eht_caps()
847 mt7996_init_he_caps(phy, band, &data[n], i); in __mt7996_set_stream_he_eht_caps()
848 mt7996_init_eht_caps(phy, band, &data[n], i); in __mt7996_set_stream_he_eht_caps()
853 sband->iftype_data = data; in __mt7996_set_stream_he_eht_caps()
854 sband->n_iftype_data = n; in __mt7996_set_stream_he_eht_caps()
857 void mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy) in mt7996_set_stream_he_eht_caps() argument
859 if (phy->mt76->cap.has_2ghz) in mt7996_set_stream_he_eht_caps()
860 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_2g.sband, in mt7996_set_stream_he_eht_caps()
863 if (phy->mt76->cap.has_5ghz) in mt7996_set_stream_he_eht_caps()
864 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_5g.sband, in mt7996_set_stream_he_eht_caps()
867 if (phy->mt76->cap.has_6ghz) in mt7996_set_stream_he_eht_caps()
868 __mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_6g.sband, in mt7996_set_stream_he_eht_caps()
877 dev->phy.dev = dev; in mt7996_register_device()
878 dev->phy.mt76 = &dev->mt76.phy; in mt7996_register_device()
879 dev->mt76.phy.priv = &dev->phy; in mt7996_register_device()
880 INIT_WORK(&dev->rc_work, mt7996_mac_sta_rc_work); in mt7996_register_device()
881 INIT_DELAYED_WORK(&dev->mphy.mac_work, mt7996_mac_work); in mt7996_register_device()
882 INIT_LIST_HEAD(&dev->sta_rc_list); in mt7996_register_device()
883 INIT_LIST_HEAD(&dev->twt_list); in mt7996_register_device()
885 init_waitqueue_head(&dev->reset_wait); in mt7996_register_device()
886 INIT_WORK(&dev->reset_work, mt7996_mac_reset_work); in mt7996_register_device()
887 INIT_WORK(&dev->dump_work, mt7996_mac_dump_work); in mt7996_register_device()
888 mutex_init(&dev->dump_mutex); in mt7996_register_device()
898 dev->mphy.leds.cdev.brightness_set = mt7996_led_set_brightness; in mt7996_register_device()
899 dev->mphy.leds.cdev.blink_set = mt7996_led_set_blink; in mt7996_register_device()
902 ret = mt76_register_device(&dev->mt76, true, mt76_rates, in mt7996_register_device()
907 ieee80211_queue_work(mt76_hw(dev), &dev->init_work); in mt7996_register_device()
917 dev->recovery.hw_init_done = true; in mt7996_register_device()
919 ret = mt7996_init_debugfs(&dev->phy); in mt7996_register_device()
931 mt76_unregister_device(&dev->mt76); in mt7996_unregister_device()
935 tasklet_disable(&dev->mt76.irq_tasklet); in mt7996_unregister_device()
937 mt76_free_device(&dev->mt76); in mt7996_unregister_device()