]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
mt76: move tx beacon routines in mt76x02-lib module
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Sat, 20 Oct 2018 10:13:26 +0000 (12:13 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 30 Nov 2018 11:21:41 +0000 (12:21 +0100)
Move mt76x02_tx beacon utility routines in mt76x02_mmio.c
in order to be reused by mt76x0 driver adding AP support

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x02.h
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
drivers/net/wireless/mediatek/mt76/mt76x2/Makefile
drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c
drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c [deleted file]

index 1cd0f758587d9b38df21dd3816b5110909711a65..72343d329f81dc49aa828272064ef423cfd747cf 100644 (file)
@@ -148,6 +148,8 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi,
                           struct mt76_wcid *wcid, struct ieee80211_sta *sta,
                           u32 *tx_info);
 
+void mt76x02_pre_tbtt_tasklet(unsigned long arg);
+
 extern const u16 mt76x02_beacon_offsets[16];
 void mt76x02_set_beacon_offsets(struct mt76x02_dev *dev);
 void mt76x02_set_irq_mask(struct mt76x02_dev *dev, u32 clear, u32 set);
index 784b76e08382ace92effc0a08315bf9a777c0b57..ab1c8c8ef15bf06b72941fcaf731044d7692f28e 100644 (file)
 #include "mt76x02.h"
 #include "mt76x02_trace.h"
 
+struct beacon_bc_data {
+       struct mt76x02_dev *dev;
+       struct sk_buff_head q;
+       struct sk_buff *tail[8];
+};
+
+static void
+mt76x02_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
+{
+       struct mt76x02_dev *dev = (struct mt76x02_dev *)priv;
+       struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv;
+       struct sk_buff *skb = NULL;
+
+       if (!(dev->beacon_mask & BIT(mvif->idx)))
+               return;
+
+       skb = ieee80211_beacon_get(mt76_hw(dev), vif);
+       if (!skb)
+               return;
+
+       mt76x02_mac_set_beacon(dev, mvif->idx, skb);
+}
+
+static void
+mt76x02_add_buffered_bc(void *priv, u8 *mac, struct ieee80211_vif *vif)
+{
+       struct beacon_bc_data *data = priv;
+       struct mt76x02_dev *dev = data->dev;
+       struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv;
+       struct ieee80211_tx_info *info;
+       struct sk_buff *skb;
+
+       if (!(dev->beacon_mask & BIT(mvif->idx)))
+               return;
+
+       skb = ieee80211_get_buffered_bc(mt76_hw(dev), vif);
+       if (!skb)
+               return;
+
+       info = IEEE80211_SKB_CB(skb);
+       info->control.vif = vif;
+       info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
+       mt76_skb_set_moredata(skb, true);
+       __skb_queue_tail(&data->q, skb);
+       data->tail[mvif->idx] = skb;
+}
+
+static void
+mt76x02_resync_beacon_timer(struct mt76x02_dev *dev)
+{
+       u32 timer_val = dev->beacon_int << 4;
+
+       dev->tbtt_count++;
+
+       /*
+        * Beacon timer drifts by 1us every tick, the timer is configured
+        * in 1/16 TU (64us) units.
+        */
+       if (dev->tbtt_count < 62)
+               return;
+
+       if (dev->tbtt_count >= 64) {
+               dev->tbtt_count = 0;
+               return;
+       }
+
+       /*
+        * The updated beacon interval takes effect after two TBTT, because
+        * at this point the original interval has already been loaded into
+        * the next TBTT_TIMER value
+        */
+       if (dev->tbtt_count == 62)
+               timer_val -= 1;
+
+       mt76_rmw_field(dev, MT_BEACON_TIME_CFG,
+                      MT_BEACON_TIME_CFG_INTVAL, timer_val);
+}
+
+void mt76x02_pre_tbtt_tasklet(unsigned long arg)
+{
+       struct mt76x02_dev *dev = (struct mt76x02_dev *)arg;
+       struct mt76_queue *q = &dev->mt76.q_tx[MT_TXQ_PSD];
+       struct beacon_bc_data data = {};
+       struct sk_buff *skb;
+       int i, nframes;
+
+       mt76x02_resync_beacon_timer(dev);
+
+       data.dev = dev;
+       __skb_queue_head_init(&data.q);
+
+       ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
+               IEEE80211_IFACE_ITER_RESUME_ALL,
+               mt76x02_update_beacon_iter, dev);
+
+       do {
+               nframes = skb_queue_len(&data.q);
+               ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
+                       IEEE80211_IFACE_ITER_RESUME_ALL,
+                       mt76x02_add_buffered_bc, &data);
+       } while (nframes != skb_queue_len(&data.q));
+
+       if (!nframes)
+               return;
+
+       for (i = 0; i < ARRAY_SIZE(data.tail); i++) {
+               if (!data.tail[i])
+                       continue;
+
+               mt76_skb_set_moredata(data.tail[i], false);
+       }
+
+       spin_lock_bh(&q->lock);
+       while ((skb = __skb_dequeue(&data.q)) != NULL) {
+               struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+               struct ieee80211_vif *vif = info->control.vif;
+               struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv;
+
+               mt76_dma_tx_queue_skb(&dev->mt76, q, skb, &mvif->group_wcid,
+                                     NULL);
+       }
+       spin_unlock_bh(&q->lock);
+}
+EXPORT_SYMBOL_GPL(mt76x02_pre_tbtt_tasklet);
+
 static int
 mt76x02_init_tx_queue(struct mt76x02_dev *dev, struct mt76_queue *q,
                      int idx, int n_desc)
index 696f071f47f86e5e31de9b44d55549f1de00f2ff..cf8ef1a2f26180dcf4f0060e17c1e628b2ae0c4f 100644 (file)
@@ -6,8 +6,8 @@ mt76x2-common-y := \
        eeprom.o mac.o init.o phy.o mcu.o
 
 mt76x2e-y := \
-       pci.o pci_main.o pci_init.o pci_tx.o \
-       pci_mac.o pci_mcu.o pci_phy.o pci_dfs.o
+       pci.o pci_main.o pci_init.o pci_mac.o \
+       pci_mcu.o pci_phy.o pci_dfs.o
 
 mt76x2u-y := \
        usb.o usb_init.o usb_main.o usb_mac.o usb_mcu.o \
index eaa44de14826887aba482c9a3eac8a5f91d67668..2bae70c63ab0178fd00623cf7acae676be02f499 100644 (file)
@@ -77,8 +77,6 @@ void mt76x2_cleanup(struct mt76x02_dev *dev);
 
 void mt76x2_mac_set_tx_protection(struct mt76x02_dev *dev, u32 val);
 
-void mt76x2_pre_tbtt_tasklet(unsigned long arg);
-
 void mt76x2_sta_ps(struct mt76_dev *dev, struct ieee80211_sta *sta, bool ps);
 
 void mt76x2_reset_wlan(struct mt76x02_dev *dev, bool enable);
index 5c1531ae8b937ba0e4984b81c6730467d87bfca0..bc1dbdf5af20bef2faee1a0af79bc458f98ed0fa 100644 (file)
@@ -298,7 +298,7 @@ int mt76x2_init_hardware(struct mt76x02_dev *dev)
 {
        int ret;
 
-       tasklet_init(&dev->pre_tbtt_tasklet, mt76x2_pre_tbtt_tasklet,
+       tasklet_init(&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet,
                     (unsigned long) dev);
 
        mt76x02_dma_disable(dev);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c
deleted file mode 100644 (file)
index fac38cb..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "mt76x2.h"
-
-struct beacon_bc_data {
-       struct mt76x02_dev *dev;
-       struct sk_buff_head q;
-       struct sk_buff *tail[8];
-};
-
-static void
-mt76x2_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
-{
-       struct mt76x02_dev *dev = (struct mt76x02_dev *) priv;
-       struct mt76x02_vif *mvif = (struct mt76x02_vif *) vif->drv_priv;
-       struct sk_buff *skb = NULL;
-
-       if (!(dev->beacon_mask & BIT(mvif->idx)))
-               return;
-
-       skb = ieee80211_beacon_get(mt76_hw(dev), vif);
-       if (!skb)
-               return;
-
-       mt76x02_mac_set_beacon(dev, mvif->idx, skb);
-}
-
-static void
-mt76x2_add_buffered_bc(void *priv, u8 *mac, struct ieee80211_vif *vif)
-{
-       struct beacon_bc_data *data = priv;
-       struct mt76x02_dev *dev = data->dev;
-       struct mt76x02_vif *mvif = (struct mt76x02_vif *) vif->drv_priv;
-       struct ieee80211_tx_info *info;
-       struct sk_buff *skb;
-
-       if (!(dev->beacon_mask & BIT(mvif->idx)))
-               return;
-
-       skb = ieee80211_get_buffered_bc(mt76_hw(dev), vif);
-       if (!skb)
-               return;
-
-       info = IEEE80211_SKB_CB(skb);
-       info->control.vif = vif;
-       info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
-       mt76_skb_set_moredata(skb, true);
-       __skb_queue_tail(&data->q, skb);
-       data->tail[mvif->idx] = skb;
-}
-
-static void
-mt76x2_resync_beacon_timer(struct mt76x02_dev *dev)
-{
-       u32 timer_val = dev->beacon_int << 4;
-
-       dev->tbtt_count++;
-
-       /*
-        * Beacon timer drifts by 1us every tick, the timer is configured
-        * in 1/16 TU (64us) units.
-        */
-       if (dev->tbtt_count < 62)
-               return;
-
-       if (dev->tbtt_count >= 64) {
-               dev->tbtt_count = 0;
-               return;
-       }
-
-       /*
-        * The updated beacon interval takes effect after two TBTT, because
-        * at this point the original interval has already been loaded into
-        * the next TBTT_TIMER value
-        */
-       if (dev->tbtt_count == 62)
-               timer_val -= 1;
-
-       mt76_rmw_field(dev, MT_BEACON_TIME_CFG,
-                      MT_BEACON_TIME_CFG_INTVAL, timer_val);
-}
-
-void mt76x2_pre_tbtt_tasklet(unsigned long arg)
-{
-       struct mt76x02_dev *dev = (struct mt76x02_dev *) arg;
-       struct mt76_queue *q = &dev->mt76.q_tx[MT_TXQ_PSD];
-       struct beacon_bc_data data = {};
-       struct sk_buff *skb;
-       int i, nframes;
-
-       mt76x2_resync_beacon_timer(dev);
-
-       data.dev = dev;
-       __skb_queue_head_init(&data.q);
-
-       ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
-               IEEE80211_IFACE_ITER_RESUME_ALL,
-               mt76x2_update_beacon_iter, dev);
-
-       do {
-               nframes = skb_queue_len(&data.q);
-               ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
-                       IEEE80211_IFACE_ITER_RESUME_ALL,
-                       mt76x2_add_buffered_bc, &data);
-       } while (nframes != skb_queue_len(&data.q));
-
-       if (!nframes)
-               return;
-
-       for (i = 0; i < ARRAY_SIZE(data.tail); i++) {
-               if (!data.tail[i])
-                       continue;
-
-               mt76_skb_set_moredata(data.tail[i], false);
-       }
-
-       spin_lock_bh(&q->lock);
-       while ((skb = __skb_dequeue(&data.q)) != NULL) {
-               struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-               struct ieee80211_vif *vif = info->control.vif;
-               struct mt76x02_vif *mvif = (struct mt76x02_vif *) vif->drv_priv;
-
-               mt76_dma_tx_queue_skb(&dev->mt76, q, skb, &mvif->group_wcid,
-                                     NULL);
-       }
-       spin_unlock_bh(&q->lock);
-}
-