diff options
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mt7615/main.c')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mt7615/main.c | 192 |
1 files changed, 90 insertions, 102 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c index 56dd0b4e4460..25faf486d279 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c @@ -24,22 +24,6 @@ static bool mt7615_dev_running(struct mt7615_dev *dev) return phy && test_bit(MT76_STATE_RUNNING, &phy->mt76->state); } -static void mt7615_free_pending_tx_skbs(struct mt7615_dev *dev, - struct mt7615_sta *msta) -{ - int i; - - spin_lock_bh(&dev->pm.txq_lock); - for (i = 0; i < IEEE80211_NUM_ACS; i++) { - if (msta && dev->pm.tx_q[i].msta != msta) - continue; - - dev_kfree_skb(dev->pm.tx_q[i].skb); - dev->pm.tx_q[i].skb = NULL; - } - spin_unlock_bh(&dev->pm.txq_lock); -} - static int mt7615_start(struct ieee80211_hw *hw) { struct mt7615_dev *dev = mt7615_hw_dev(hw); @@ -55,22 +39,24 @@ static int mt7615_start(struct ieee80211_hw *hw) if (!running) { mt7615_mcu_set_pm(dev, 0, 0); - mt7615_mcu_set_mac_enable(dev, 0, true); + mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, true, false); mt7615_mac_enable_nf(dev, 0); } if (phy != &dev->phy) { mt7615_mcu_set_pm(dev, 1, 0); - mt7615_mcu_set_mac_enable(dev, 1, true); + mt76_connac_mcu_set_mac_enable(&dev->mt76, 1, true, false); mt7615_mac_enable_nf(dev, 1); } - mt7615_mcu_set_channel_domain(phy); + if (mt7615_firmware_offload(dev)) + mt76_connac_mcu_set_channel_domain(phy->mt76); + mt7615_mcu_set_chan_info(phy, MCU_EXT_CMD_SET_RX_PATH); set_bit(MT76_STATE_RUNNING, &phy->mt76->state); - ieee80211_queue_delayed_work(hw, &phy->mac_work, + ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, MT7615_WATCHDOG_TIME); if (!running) @@ -86,30 +72,30 @@ static void mt7615_stop(struct ieee80211_hw *hw) struct mt7615_dev *dev = mt7615_hw_dev(hw); struct mt7615_phy *phy = mt7615_hw_phy(hw); - cancel_delayed_work_sync(&phy->mac_work); + cancel_delayed_work_sync(&phy->mt76->mac_work); del_timer_sync(&phy->roc_timer); cancel_work_sync(&phy->roc_work); cancel_delayed_work_sync(&dev->pm.ps_work); cancel_work_sync(&dev->pm.wake_work); - mt7615_free_pending_tx_skbs(dev, NULL); + mt76_connac_free_pending_tx_skbs(&dev->pm, NULL); mt7615_mutex_acquire(dev); - mt76_testmode_reset(&dev->mt76, true); + mt76_testmode_reset(phy->mt76, true); clear_bit(MT76_STATE_RUNNING, &phy->mt76->state); cancel_delayed_work_sync(&phy->scan_work); if (phy != &dev->phy) { mt7615_mcu_set_pm(dev, 1, 1); - mt7615_mcu_set_mac_enable(dev, 1, false); + mt76_connac_mcu_set_mac_enable(&dev->mt76, 1, false, false); } if (!mt7615_dev_running(dev)) { mt7615_mcu_set_pm(dev, 0, 1); - mt7615_mcu_set_mac_enable(dev, 0, false); + mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, false, false); } mt7615_mutex_release(dev); @@ -181,14 +167,14 @@ static int mt7615_add_interface(struct ieee80211_hw *hw, mt7615_mutex_acquire(dev); - mt76_testmode_reset(&dev->mt76, true); + mt76_testmode_reset(phy->mt76, true); if (vif->type == NL80211_IFTYPE_MONITOR && is_zero_ether_addr(vif->addr)) phy->monitor_vif = vif; - mvif->idx = ffs(~dev->mphy.vif_mask) - 1; - if (mvif->idx >= MT7615_MAX_INTERFACES) { + mvif->mt76.idx = ffs(~dev->mt76.vif_mask) - 1; + if (mvif->mt76.idx >= MT7615_MAX_INTERFACES) { ret = -ENOSPC; goto out; } @@ -198,26 +184,26 @@ static int mt7615_add_interface(struct ieee80211_hw *hw, ret = -ENOSPC; goto out; } - mvif->omac_idx = idx; + mvif->mt76.omac_idx = idx; - mvif->band_idx = ext_phy; + mvif->mt76.band_idx = ext_phy; if (mt7615_ext_phy(dev)) - mvif->wmm_idx = ext_phy * (MT7615_MAX_WMM_SETS / 2) + - mvif->idx % (MT7615_MAX_WMM_SETS / 2); + mvif->mt76.wmm_idx = ext_phy * (MT7615_MAX_WMM_SETS / 2) + + mvif->mt76.idx % (MT7615_MAX_WMM_SETS / 2); else - mvif->wmm_idx = mvif->idx % MT7615_MAX_WMM_SETS; + mvif->mt76.wmm_idx = mvif->mt76.idx % MT7615_MAX_WMM_SETS; - dev->mphy.vif_mask |= BIT(mvif->idx); - dev->omac_mask |= BIT_ULL(mvif->omac_idx); - phy->omac_mask |= BIT_ULL(mvif->omac_idx); + dev->mt76.vif_mask |= BIT(mvif->mt76.idx); + dev->omac_mask |= BIT_ULL(mvif->mt76.omac_idx); + phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx); mt7615_mcu_set_dbdc(dev); - idx = MT7615_WTBL_RESERVED - mvif->idx; + idx = MT7615_WTBL_RESERVED - mvif->mt76.idx; INIT_LIST_HEAD(&mvif->sta.poll_list); mvif->sta.wcid.idx = idx; - mvif->sta.wcid.ext_phy = mvif->band_idx; + mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; mvif->sta.wcid.hw_key_idx = -1; mt7615_mac_wtbl_update(dev, idx, MT_WTBL_UPDATE_ADM_COUNT_CLEAR); @@ -228,7 +214,7 @@ static int mt7615_add_interface(struct ieee80211_hw *hw, mtxq->wcid = &mvif->sta.wcid; } - ret = mt7615_mcu_add_dev_info(dev, vif, true); + ret = mt7615_mcu_add_dev_info(phy, vif, true); if (ret) goto out; @@ -252,20 +238,20 @@ static void mt7615_remove_interface(struct ieee80211_hw *hw, mt7615_mutex_acquire(dev); - mt76_testmode_reset(&dev->mt76, true); + mt76_testmode_reset(phy->mt76, true); if (vif == phy->monitor_vif) phy->monitor_vif = NULL; - mt7615_free_pending_tx_skbs(dev, msta); + mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid); mt7615_mac_set_beacon_filter(phy, vif, false); - mt7615_mcu_add_dev_info(dev, vif, false); + mt7615_mcu_add_dev_info(phy, vif, false); rcu_assign_pointer(dev->mt76.wcid[idx], NULL); - dev->mphy.vif_mask &= ~BIT(mvif->idx); - dev->omac_mask &= ~BIT_ULL(mvif->omac_idx); - phy->omac_mask &= ~BIT_ULL(mvif->omac_idx); + dev->mt76.vif_mask &= ~BIT(mvif->mt76.idx); + dev->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx); + phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx); mt7615_mutex_release(dev); @@ -300,7 +286,7 @@ int mt7615_set_channel(struct mt7615_phy *phy) bool ext_phy = phy != &dev->phy; int ret; - cancel_delayed_work_sync(&phy->mac_work); + cancel_delayed_work_sync(&phy->mt76->mac_work); mt7615_mutex_acquire(dev); @@ -321,7 +307,7 @@ int mt7615_set_channel(struct mt7615_phy *phy) mt7615_mac_set_timing(phy); ret = mt7615_dfs_init_radar_detector(phy); mt7615_mac_cca_stats_reset(phy); - mt7615_mcu_set_sku_en(phy, !mt76_testmode_enabled(&dev->mt76)); + mt7615_mcu_set_sku_en(phy, true); mt7615_mac_reset_counters(dev); phy->noise = 0; @@ -334,8 +320,9 @@ out: mt76_txq_schedule_all(phy->mt76); - if (!mt76_testmode_enabled(&dev->mt76)) - ieee80211_queue_delayed_work(phy->mt76->hw, &phy->mac_work, + if (!mt76_testmode_enabled(phy->mt76)) + ieee80211_queue_delayed_work(phy->mt76->hw, + &phy->mt76->mac_work, MT7615_WATCHDOG_TIME); return ret; @@ -411,9 +398,9 @@ static int mt7615_config(struct ieee80211_hw *hw, u32 changed) if (changed & (IEEE80211_CONF_CHANGE_CHANNEL | IEEE80211_CONF_CHANGE_POWER)) { #ifdef CONFIG_NL80211_TESTMODE - if (dev->mt76.test.state != MT76_TM_STATE_OFF) { + if (phy->mt76->test.state != MT76_TM_STATE_OFF) { mt7615_mutex_acquire(dev); - mt76_testmode_reset(&dev->mt76, false); + mt76_testmode_reset(phy->mt76, false); mt7615_mutex_release(dev); } #endif @@ -425,7 +412,7 @@ static int mt7615_config(struct ieee80211_hw *hw, u32 changed) mt7615_mutex_acquire(dev); if (changed & IEEE80211_CONF_CHANGE_MONITOR) { - mt76_testmode_reset(&dev->mt76, true); + mt76_testmode_reset(phy->mt76, true); if (!(hw->conf.flags & IEEE80211_CONF_MONITOR)) phy->rxfilter |= MT_WF_RFCR_DROP_OTHER_UC; @@ -444,7 +431,7 @@ static int mt7615_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue, const struct ieee80211_tx_queue_params *params) { - struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; + struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv; struct mt7615_dev *dev = mt7615_hw_dev(hw); int err; @@ -480,7 +467,7 @@ static void mt7615_configure_filter(struct ieee80211_hw *hw, #define MT76_FILTER(_flag, _hw) do { \ flags |= *total_flags & FIF_##_flag; \ phy->rxfilter &= ~(_hw); \ - if (!mt76_testmode_enabled(&dev->mt76)) \ + if (!mt76_testmode_enabled(phy->mt76)) \ phy->rxfilter |= !(flags & FIF_##_flag) * (_hw);\ } while (0) @@ -541,7 +528,7 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BEACON_ENABLED) { mt7615_mcu_add_bss_info(phy, vif, NULL, info->enable_beacon); - mt7615_mcu_sta_add(dev, vif, NULL, info->enable_beacon); + mt7615_mcu_sta_add(phy, vif, NULL, info->enable_beacon); if (vif->p2p && info->enable_beacon) mt7615_mcu_set_p2p_oppps(hw, vif); @@ -552,7 +539,7 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw, mt7615_mcu_add_beacon(dev, hw, vif, info->enable_beacon); if (changed & BSS_CHANGED_PS) - mt7615_mcu_set_vif_ps(dev, vif); + mt76_connac_mcu_set_vif_ps(&dev->mt76, vif); if (changed & BSS_CHANGED_ARP_FILTER) mt7615_mcu_update_arp_filter(hw, vif, info); @@ -578,6 +565,7 @@ int mt7615_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv; struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; + struct mt7615_phy *phy; int idx, err; idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7615_WTBL_STA - 1); @@ -588,23 +576,20 @@ int mt7615_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, msta->vif = mvif; msta->wcid.sta = 1; msta->wcid.idx = idx; - msta->wcid.ext_phy = mvif->band_idx; + msta->wcid.ext_phy = mvif->mt76.band_idx; - err = mt7615_pm_wake(dev); + phy = mvif->mt76.band_idx ? mt7615_ext_phy(dev) : &dev->phy; + err = mt76_connac_pm_wake(phy->mt76, &dev->pm); if (err) return err; - if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) { - struct mt7615_phy *phy; - - phy = mvif->band_idx ? mt7615_ext_phy(dev) : &dev->phy; + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) mt7615_mcu_add_bss_info(phy, vif, sta, true); - } mt7615_mac_wtbl_update(dev, idx, MT_WTBL_UPDATE_ADM_COUNT_CLEAR); - mt7615_mcu_sta_add(dev, vif, sta, true); + mt7615_mcu_sta_add(&dev->phy, vif, sta, true); - mt7615_pm_power_save_sched(dev); + mt76_connac_power_save_sched(phy->mt76, &dev->pm); return 0; } @@ -615,27 +600,26 @@ void mt7615_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, { struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv; + struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; + struct mt7615_phy *phy; + + mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid); - mt7615_free_pending_tx_skbs(dev, msta); - mt7615_pm_wake(dev); + phy = mvif->mt76.band_idx ? mt7615_ext_phy(dev) : &dev->phy; + mt76_connac_pm_wake(phy->mt76, &dev->pm); - mt7615_mcu_sta_add(dev, vif, sta, false); + mt7615_mcu_sta_add(&dev->phy, vif, sta, false); mt7615_mac_wtbl_update(dev, msta->wcid.idx, MT_WTBL_UPDATE_ADM_COUNT_CLEAR); - if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) { - struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; - struct mt7615_phy *phy; - - phy = mvif->band_idx ? mt7615_ext_phy(dev) : &dev->phy; + if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) mt7615_mcu_add_bss_info(phy, vif, sta, false); - } spin_lock_bh(&dev->sta_poll_lock); if (!list_empty(&msta->poll_list)) list_del_init(&msta->poll_list); spin_unlock_bh(&dev->sta_poll_lock); - mt7615_pm_power_save_sched(dev); + mt76_connac_power_save_sched(phy->mt76, &dev->pm); } EXPORT_SYMBOL_GPL(mt7615_mac_sta_remove); @@ -720,25 +704,17 @@ static void mt7615_tx(struct ieee80211_hw *hw, skb_set_queue_mapping(skb, qid); } - spin_lock_bh(&dev->pm.txq_lock); - if (!dev->pm.tx_q[qid].skb) { - ieee80211_stop_queues(hw); - dev->pm.tx_q[qid].msta = msta; - dev->pm.tx_q[qid].skb = skb; - queue_work(dev->mt76.wq, &dev->pm.wake_work); - } else { - dev_kfree_skb(skb); - } - spin_unlock_bh(&dev->pm.txq_lock); + mt76_connac_pm_queue_skb(hw, &dev->pm, wcid, skb); } static int mt7615_set_rts_threshold(struct ieee80211_hw *hw, u32 val) { struct mt7615_dev *dev = mt7615_hw_dev(hw); struct mt7615_phy *phy = mt7615_hw_phy(hw); + int band = phy != &dev->phy; mt7615_mutex_acquire(dev); - mt7615_mcu_set_rts_thresh(phy, val); + mt76_connac_mcu_set_rts_thresh(&dev->mt76, val, band); mt7615_mutex_release(dev); return 0; @@ -910,7 +886,7 @@ mt7615_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) else tx_ant <<= 1; } - phy->chainmask = tx_ant; + phy->mt76->chainmask = tx_ant; mt76_set_stream_caps(phy->mt76, true); @@ -993,8 +969,12 @@ mt7615_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct mt76_phy *mphy = hw->priv; int err; + /* fall-back to sw-scan */ + if (!mt7615_firmware_offload(dev)) + return 1; + mt7615_mutex_acquire(dev); - err = mt7615_mcu_hw_scan(mphy->priv, vif, req); + err = mt76_connac_mcu_hw_scan(mphy, vif, req); mt7615_mutex_release(dev); return err; @@ -1007,7 +987,7 @@ mt7615_cancel_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif) struct mt76_phy *mphy = hw->priv; mt7615_mutex_acquire(dev); - mt7615_mcu_cancel_hw_scan(mphy->priv, vif); + mt76_connac_mcu_cancel_hw_scan(mphy, vif); mt7615_mutex_release(dev); } @@ -1020,13 +1000,16 @@ mt7615_start_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct mt76_phy *mphy = hw->priv; int err; + if (!mt7615_firmware_offload(dev)) + return -EOPNOTSUPP; + mt7615_mutex_acquire(dev); - err = mt7615_mcu_sched_scan_req(mphy->priv, vif, req); + err = mt76_connac_mcu_sched_scan_req(mphy, vif, req); if (err < 0) goto out; - err = mt7615_mcu_sched_scan_enable(mphy->priv, vif, true); + err = mt76_connac_mcu_sched_scan_enable(mphy, vif, true); out: mt7615_mutex_release(dev); @@ -1040,8 +1023,11 @@ mt7615_stop_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif) struct mt76_phy *mphy = hw->priv; int err; + if (!mt7615_firmware_offload(dev)) + return -EOPNOTSUPP; + mt7615_mutex_acquire(dev); - err = mt7615_mcu_sched_scan_enable(mphy->priv, vif, false); + err = mt76_connac_mcu_sched_scan_enable(mphy, vif, false); mt7615_mutex_release(dev); return err; @@ -1101,26 +1087,27 @@ static int mt7615_cancel_remain_on_channel(struct ieee80211_hw *hw, static int mt7615_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) { - struct mt7615_dev *dev = mt7615_hw_dev(hw); struct mt7615_phy *phy = mt7615_hw_phy(hw); + struct mt7615_dev *dev = mt7615_hw_dev(hw); int err = 0; cancel_delayed_work_sync(&dev->pm.ps_work); - mt7615_free_pending_tx_skbs(dev, NULL); + mt76_connac_free_pending_tx_skbs(&dev->pm, NULL); mt7615_mutex_acquire(dev); clear_bit(MT76_STATE_RUNNING, &phy->mt76->state); cancel_delayed_work_sync(&phy->scan_work); - cancel_delayed_work_sync(&phy->mac_work); + cancel_delayed_work_sync(&phy->mt76->mac_work); set_bit(MT76_STATE_SUSPEND, &phy->mt76->state); ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL, - mt7615_mcu_set_suspend_iter, phy); + mt76_connac_mcu_set_suspend_iter, + phy->mt76); if (!mt7615_dev_running(dev)) - err = mt7615_mcu_set_hif_suspend(dev, true); + err = mt76_connac_mcu_set_hif_suspend(&dev->mt76, true); mt7615_mutex_release(dev); @@ -1129,8 +1116,8 @@ static int mt7615_suspend(struct ieee80211_hw *hw, static int mt7615_resume(struct ieee80211_hw *hw) { - struct mt7615_dev *dev = mt7615_hw_dev(hw); struct mt7615_phy *phy = mt7615_hw_phy(hw); + struct mt7615_dev *dev = mt7615_hw_dev(hw); bool running; mt7615_mutex_acquire(dev); @@ -1141,7 +1128,7 @@ static int mt7615_resume(struct ieee80211_hw *hw) if (!running) { int err; - err = mt7615_mcu_set_hif_suspend(dev, false); + err = mt76_connac_mcu_set_hif_suspend(&dev->mt76, false); if (err < 0) { mt7615_mutex_release(dev); return err; @@ -1151,9 +1138,10 @@ static int mt7615_resume(struct ieee80211_hw *hw) clear_bit(MT76_STATE_SUSPEND, &phy->mt76->state); ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL, - mt7615_mcu_set_suspend_iter, phy); + mt76_connac_mcu_set_suspend_iter, + phy->mt76); - ieee80211_queue_delayed_work(hw, &phy->mac_work, + ieee80211_queue_delayed_work(hw, &phy->mt76->mac_work, MT7615_WATCHDOG_TIME); mt7615_mutex_release(dev); @@ -1176,7 +1164,7 @@ static void mt7615_set_rekey_data(struct ieee80211_hw *hw, struct mt7615_dev *dev = mt7615_hw_dev(hw); mt7615_mutex_acquire(dev); - mt7615_mcu_update_gtk_rekey(hw, vif, data); + mt76_connac_mcu_update_gtk_rekey(hw, vif, data); mt7615_mutex_release(dev); } #endif /* CONFIG_PM */ |