OSDN Git Service

mt76x0: pci: enable AP support
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Sat, 20 Oct 2018 10:13:32 +0000 (12:13 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 30 Nov 2018 11:21:41 +0000 (12:21 +0100)
Add missing mac80211 callbacks to mt76x0e_ops data structure
and add mt76x02_beacon utility routines in mt76x0_bss_info_changed
in order to enable/disable beacon transmission

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x0/mac.c
drivers/net/wireless/mediatek/mt76/mt76x0/main.c
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c

index ded0ad6..78d15cb 100644 (file)
@@ -75,23 +75,3 @@ void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,
        for (i = 0; i < 6; i++)
                mt76_wr(dev, MT_CCK_PROT_CFG + i * 4, prot[i]);
 }
-
-void mt76x0_mac_config_tsf(struct mt76x02_dev *dev, bool enable, int interval)
-{
-       u32 val = mt76_rr(dev, MT_BEACON_TIME_CFG);
-
-       val &= ~(MT_BEACON_TIME_CFG_TIMER_EN |
-                MT_BEACON_TIME_CFG_SYNC_MODE |
-                MT_BEACON_TIME_CFG_TBTT_EN);
-
-       if (!enable) {
-               mt76_wr(dev, MT_BEACON_TIME_CFG, val);
-               return;
-       }
-
-       val &= ~MT_BEACON_TIME_CFG_INTVAL;
-       val |= FIELD_PREP(MT_BEACON_TIME_CFG_INTVAL, interval << 4) |
-               MT_BEACON_TIME_CFG_TIMER_EN |
-               MT_BEACON_TIME_CFG_SYNC_MODE |
-               MT_BEACON_TIME_CFG_TBTT_EN;
-}
index 5747d72..3dff198 100644 (file)
@@ -72,30 +72,23 @@ int mt76x0_config(struct ieee80211_hw *hw, u32 changed)
 }
 EXPORT_SYMBOL_GPL(mt76x0_config);
 
-static void
-mt76x0_addr_wr(struct mt76x02_dev *dev, const u32 offset, const u8 *addr)
-{
-       mt76_wr(dev, offset, get_unaligned_le32(addr));
-       mt76_wr(dev, offset + 4, addr[4] | addr[5] << 8);
-}
-
 void mt76x0_bss_info_changed(struct ieee80211_hw *hw,
                             struct ieee80211_vif *vif,
                             struct ieee80211_bss_conf *info, u32 changed)
 {
+       struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv;
        struct mt76x02_dev *dev = hw->priv;
 
        mutex_lock(&dev->mt76.mutex);
 
-       if (changed & BSS_CHANGED_BSSID) {
-               mt76x0_addr_wr(dev, MT_MAC_BSSID_DW0, info->bssid);
+       if (changed & BSS_CHANGED_BSSID)
+               mt76x02_mac_set_bssid(dev, mvif->idx, info->bssid);
 
-               /* Note: this is a hack because beacon_int is not changed
-                *       on leave nor is any more appropriate event generated.
-                *       rt2x00 doesn't seem to be bothered though.
-                */
-               if (is_zero_ether_addr(info->bssid))
-                       mt76x0_mac_config_tsf(dev, false, 0);
+       if (changed & BSS_CHANGED_BEACON_ENABLED) {
+               tasklet_disable(&dev->pre_tbtt_tasklet);
+               mt76x02_mac_set_beacon_enable(dev, mvif->idx,
+                                             info->enable_beacon);
+               tasklet_enable(&dev->pre_tbtt_tasklet);
        }
 
        if (changed & BSS_CHANGED_BASIC_RATES) {
@@ -106,8 +99,13 @@ void mt76x0_bss_info_changed(struct ieee80211_hw *hw,
                mt76_wr(dev, MT_LG_FBK_CFG1, 0x00002100);
        }
 
-       if (changed & BSS_CHANGED_BEACON_INT)
-               mt76x0_mac_config_tsf(dev, true, info->beacon_int);
+       if (changed & BSS_CHANGED_BEACON_INT) {
+               mt76_rmw_field(dev, MT_BEACON_TIME_CFG,
+                              MT_BEACON_TIME_CFG_INTVAL,
+                              info->beacon_int << 4);
+               dev->beacon_int = info->beacon_int;
+               dev->tbtt_count = 0;
+       }
 
        if (changed & BSS_CHANGED_HT || changed & BSS_CHANGED_ERP_CTS_PROT)
                mt76x0_mac_set_protection(dev, info->use_cts_prot,
index 2f3abbe..5b4f302 100644 (file)
@@ -78,6 +78,4 @@ void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on);
 /* MAC */
 void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,
                                int ht_mode);
-void mt76x0_mac_config_tsf(struct mt76x02_dev *dev, bool enable, int interval);
-
 #endif
index 4deaf7f..08412bb 100644 (file)
@@ -68,6 +68,19 @@ static void mt76x0e_stop(struct ieee80211_hw *hw)
        mutex_unlock(&dev->mt76.mutex);
 }
 
+static void
+mt76x0e_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+             u32 queues, bool drop)
+{
+}
+
+static int
+mt76x0e_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
+               bool set)
+{
+       return 0;
+}
+
 static const struct ieee80211_ops mt76x0e_ops = {
        .tx = mt76x02_tx,
        .start = mt76x0e_start,
@@ -76,6 +89,7 @@ static const struct ieee80211_ops mt76x0e_ops = {
        .remove_interface = mt76x02_remove_interface,
        .config = mt76x0_config,
        .configure_filter = mt76x02_configure_filter,
+       .bss_info_changed = mt76x0_bss_info_changed,
        .sta_add = mt76x02_sta_add,
        .sta_remove = mt76x02_sta_remove,
        .set_key = mt76x02_set_key,
@@ -87,6 +101,9 @@ static const struct ieee80211_ops mt76x0e_ops = {
        .wake_tx_queue = mt76_wake_tx_queue,
        .get_survey = mt76_get_survey,
        .get_txpower = mt76x02_get_txpower,
+       .flush = mt76x0e_flush,
+       .set_tim = mt76x0e_set_tim,
+       .release_buffered_frames = mt76_release_buffered_frames,
 };
 
 static int mt76x0e_register_device(struct mt76x02_dev *dev)