diff options
author | Lorenzo Bianconi <lorenzo@kernel.org> | 2020-04-02 15:06:39 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2020-05-12 19:52:28 +0200 |
commit | 20305f98177432b48892d8add9cf6b05577b5d5d (patch) | |
tree | ee6923492fead72825e11466af847af478262102 /drivers/net/wireless/mediatek/mt76/mt7615/main.c | |
parent | fcdfc29e58ee3b4db894f356fb6b12a6546f57bd (diff) |
mt76: mt7615: introduce scheduled scan support
Introduce scheduled scan support for mt7663e devices
Co-developed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mt7615/main.c')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mt7615/main.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c index 6a7d802c69a6..2c2d763b667c 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c @@ -705,16 +705,36 @@ mt7615_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) void mt7615_scan_work(struct work_struct *work) { - struct cfg80211_scan_info info = { - .aborted = false, - }; struct mt7615_phy *phy; phy = (struct mt7615_phy *)container_of(work, struct mt7615_phy, scan_work.work); - clear_bit(MT76_HW_SCANNING, &phy->mt76->state); - ieee80211_scan_completed(phy->mt76->hw, &info); + while (true) { + struct mt7615_mcu_rxd *rxd; + struct sk_buff *skb; + + spin_lock_bh(&phy->dev->mt76.lock); + skb = __skb_dequeue(&phy->scan_event_list); + spin_unlock_bh(&phy->dev->mt76.lock); + + if (!skb) + break; + + rxd = (struct mt7615_mcu_rxd *)skb->data; + if (rxd->eid == MCU_EVENT_SCAN_DONE) { + struct cfg80211_scan_info info = { + .aborted = false, + }; + + clear_bit(MT76_HW_SCANNING, &phy->mt76->state); + ieee80211_scan_completed(phy->mt76->hw, &info); + } else { + clear_bit(MT76_HW_SCHED_SCANNING, &phy->mt76->state); + ieee80211_sched_scan_results(phy->mt76->hw); + } + dev_kfree_skb(skb); + } } static int @@ -734,6 +754,29 @@ mt7615_cancel_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif) mt7615_mcu_cancel_hw_scan(mphy->priv, vif); } +static int +mt7615_start_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct cfg80211_sched_scan_request *req, + struct ieee80211_scan_ies *ies) +{ + struct mt76_phy *mphy = hw->priv; + int err; + + err = mt7615_mcu_sched_scan_req(mphy->priv, vif, req); + if (err < 0) + return err; + + return mt7615_mcu_sched_scan_enable(mphy->priv, vif, true); +} + +static int +mt7615_stop_sched_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +{ + struct mt76_phy *mphy = hw->priv; + + return mt7615_mcu_sched_scan_enable(mphy->priv, vif, false); +} + const struct ieee80211_ops mt7615_ops = { .tx = mt7615_tx, .start = mt7615_start, @@ -765,6 +808,8 @@ const struct ieee80211_ops mt7615_ops = { .set_coverage_class = mt7615_set_coverage_class, .hw_scan = mt7615_hw_scan, .cancel_hw_scan = mt7615_cancel_hw_scan, + .sched_scan_start = mt7615_start_sched_scan, + .sched_scan_stop = mt7615_stop_sched_scan, }; static int __init mt7615_init(void) |