summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/mediatek/mt76/mt7615/main.c
diff options
context:
space:
mode:
authorLorenzo Bianconi <lorenzo@kernel.org>2020-04-02 15:06:39 +0200
committerFelix Fietkau <nbd@nbd.name>2020-05-12 19:52:28 +0200
commit20305f98177432b48892d8add9cf6b05577b5d5d (patch)
treeee6923492fead72825e11466af847af478262102 /drivers/net/wireless/mediatek/mt76/mt7615/main.c
parentfcdfc29e58ee3b4db894f356fb6b12a6546f57bd (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.c55
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)