]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mt76x2: add frame protection support
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Wed, 11 Jul 2018 20:02:22 +0000 (22:02 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 30 Jul 2018 14:32:12 +0000 (17:32 +0300)
Introduce mac80211 rts threshold handler in order to add frame
protection support to mt76x2 driver

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/mediatek/mt76/mt76x2.h
drivers/net/wireless/mediatek/mt76/mt76x2_mac.c
drivers/net/wireless/mediatek/mt76/mt76x2_main.c

index 71fcfa44fb2e3aebfb39fda33e705ddd6a32eff2..40e57073923e4120254ca6b2056b58f09e365c83 100644 (file)
@@ -222,6 +222,7 @@ int mt76x2_tx_prepare_skb(struct mt76_dev *mdev, void *txwi,
                          u32 *tx_info);
 void mt76x2_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue *q,
                            struct mt76_queue_entry *e, bool flush);
+void mt76x2_mac_set_tx_protection(struct mt76x2_dev *dev, u32 val);
 
 void mt76x2_pre_tbtt_tasklet(unsigned long arg);
 
index fc9af79b3e6948f41ddeaa4af2ef5e703c7b1d2e..e5e92f79f28abfe0b9dd80c9c7ee4fc357fe810c 100644 (file)
@@ -854,3 +854,33 @@ void mt76x2_mac_work(struct work_struct *work)
        ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work,
                                     MT_CALIBRATE_INTERVAL);
 }
+
+void mt76x2_mac_set_tx_protection(struct mt76x2_dev *dev, u32 val)
+{
+       u32 data = 0;
+
+       if (val != ~0)
+               data = FIELD_PREP(MT_PROT_CFG_CTRL, 1) |
+                      MT_PROT_CFG_RTS_THRESH;
+
+       mt76_rmw_field(dev, MT_TX_RTS_CFG, MT_TX_RTS_CFG_THRESH, val);
+
+       mt76_rmw(dev, MT_CCK_PROT_CFG,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_OFDM_PROT_CFG,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_MM20_PROT_CFG,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_MM40_PROT_CFG,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_GF20_PROT_CFG,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_GF40_PROT_CFG,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_TX_PROT_CFG6,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_TX_PROT_CFG7,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+       mt76_rmw(dev, MT_TX_PROT_CFG8,
+                MT_PROT_CFG_CTRL | MT_PROT_CFG_RTS_THRESH, data);
+}
index 3c0ebe6d231c8724fd1284118a20b10edd0ee051..1f4d3e5ae64bca4e4f25ee5f2529d642ee7dd96b 100644 (file)
@@ -605,6 +605,21 @@ static int mt76x2_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant,
        return 0;
 }
 
+static int
+mt76x2_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
+{
+       struct mt76x2_dev *dev = hw->priv;
+
+       if (val != ~0 && val > 0xffff)
+               return -EINVAL;
+
+       mutex_lock(&dev->mutex);
+       mt76x2_mac_set_tx_protection(dev, val);
+       mutex_unlock(&dev->mutex);
+
+       return 0;
+}
+
 const struct ieee80211_ops mt76x2_ops = {
        .tx = mt76x2_tx,
        .start = mt76x2_start,
@@ -631,5 +646,6 @@ const struct ieee80211_ops mt76x2_ops = {
        .set_tim = mt76x2_set_tim,
        .set_antenna = mt76x2_set_antenna,
        .get_antenna = mt76x2_get_antenna,
+       .set_rts_threshold = mt76x2_set_rts_threshold,
 };