mt76: beaconing fixes for USB
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 30 Jan 2019 16:02:18 +0000 (17:02 +0100)
committerFelix Fietkau <nbd@nbd.name>
Mon, 18 Feb 2019 18:54:32 +0000 (19:54 +0100)
Configure beaconing on USB devices without PS buffering support.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c
drivers/net/wireless/mediatek/mt76/mt76x02_mac.h
drivers/net/wireless/mediatek/mt76/mt76x02_util.c

index ae1727e433f349e0e26b1bb72d5c59d5c2617c14..2dc80ea267522a0318b2246b027960a3087c037a 100644 (file)
@@ -1060,8 +1060,9 @@ int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
        return 0;
 }
 
-void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
-                                  u8 vif_idx, bool val)
+static void
+__mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev, u8 vif_idx,
+                               bool val, struct sk_buff *skb)
 {
        u8 old_mask = dev->beacon_mask;
        bool en;
@@ -1069,6 +1070,8 @@ void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
 
        if (val) {
                dev->beacon_mask |= BIT(vif_idx);
+               if (skb)
+                       mt76x02_mac_set_beacon(dev, vif_idx, skb);
        } else {
                dev->beacon_mask &= ~BIT(vif_idx);
                mt76x02_mac_set_beacon(dev, vif_idx, NULL);
@@ -1079,14 +1082,34 @@ void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
 
        en = dev->beacon_mask;
 
-       mt76_rmw_field(dev, MT_INT_TIMER_EN, MT_INT_TIMER_EN_PRE_TBTT_EN, en);
        reg = MT_BEACON_TIME_CFG_BEACON_TX |
              MT_BEACON_TIME_CFG_TBTT_EN |
              MT_BEACON_TIME_CFG_TIMER_EN;
        mt76_rmw(dev, MT_BEACON_TIME_CFG, reg, reg * en);
 
+       if (mt76_is_usb(dev))
+               return;
+
+       mt76_rmw_field(dev, MT_INT_TIMER_EN, MT_INT_TIMER_EN_PRE_TBTT_EN, en);
        if (en)
                mt76x02_irq_enable(dev, MT_INT_PRE_TBTT | MT_INT_TBTT);
        else
                mt76x02_irq_disable(dev, MT_INT_PRE_TBTT | MT_INT_TBTT);
 }
+
+void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
+                                  struct ieee80211_vif *vif, bool val)
+{
+       u8 vif_idx = ((struct mt76x02_vif *)vif->drv_priv)->idx;
+       struct sk_buff *skb = NULL;
+
+       if (mt76_is_mmio(dev))
+               tasklet_disable(&dev->pre_tbtt_tasklet);
+       else if (val)
+               skb = ieee80211_beacon_get(mt76_hw(dev), vif);
+
+       __mt76x02_mac_set_beacon_enable(dev, vif_idx, val, skb);
+
+       if (mt76_is_mmio(dev))
+               tasklet_enable(&dev->pre_tbtt_tasklet);
+}
index 76e564b8f5da5c4f06dba8b8b41b4697769dbc99..3b04b1bd0abdf468f4dac355ef9990b88c01b3d0 100644 (file)
@@ -204,8 +204,8 @@ void mt76x02_mac_work(struct work_struct *work);
 void mt76x02_mac_set_bssid(struct mt76x02_dev *dev, u8 idx, const u8 *addr);
 int mt76x02_mac_set_beacon(struct mt76x02_dev *dev, u8 vif_idx,
                           struct sk_buff *skb);
-void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev, u8 vif_idx,
-                                  bool val);
+void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
+                                  struct ieee80211_vif *vif, bool val);
 
 void mt76x02_edcca_init(struct mt76x02_dev *dev);
 #endif
index 4bc0520da1c69e0e605985d88f89e67d0765db68..724b13d9189891110949c008c47dcfd5591d5c7f 100644 (file)
@@ -705,12 +705,8 @@ void mt76x02_bss_info_changed(struct ieee80211_hw *hw,
        if (changed & BSS_CHANGED_BSSID)
                mt76x02_mac_set_bssid(dev, mvif->idx, info->bssid);
 
-       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_BEACON_ENABLED)
+               mt76x02_mac_set_beacon_enable(dev, vif, info->enable_beacon);
 
        if (changed & BSS_CHANGED_HT || changed & BSS_CHANGED_ERP_CTS_PROT)
                mt76x02_mac_set_tx_protection(dev, info->use_cts_prot,