]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mt76: mt7615: fix slow performance when enable encryption
authorRyder Lee <ryder.lee@mediatek.com>
Mon, 3 Jun 2019 06:08:44 +0000 (14:08 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 27 Jun 2019 10:58:13 +0000 (12:58 +0200)
Fix wrong WCID assignment and add RKV (RX Key of this entry is valid)
flag to check if peer uses the same configuration with previous
handshaking.

If the configuration is mismatch, WTBL indicates a “cipher mismatch”
to stop SEC decryption to prevent the packet from damage.

Suggested-by: YF Luo <yf.luo@mediatek.com>
Suggested-by: Yiwei Chung <yiwei.chung@mediatek.com>
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c

index a0e2b8770ad0f4ff144a1f2473fe5dad5e47145a..693e597a3230fd66d11333044355ff4b16ece90a 100644 (file)
@@ -62,16 +62,11 @@ static void mt7615_mac_init(struct mt7615_dev *dev)
                 MT_AGG_ARCR_RATE_DOWN_RATIO_EN |
                 FIELD_PREP(MT_AGG_ARCR_RATE_DOWN_RATIO, 1) |
                 FIELD_PREP(MT_AGG_ARCR_RATE_UP_EXTRA_TH, 4)));
-
-       dev->mt76.global_wcid.idx = MT7615_WTBL_RESERVED;
-       dev->mt76.global_wcid.hw_key_idx = -1;
-       rcu_assign_pointer(dev->mt76.wcid[MT7615_WTBL_RESERVED],
-                          &dev->mt76.global_wcid);
 }
 
 static int mt7615_init_hardware(struct mt7615_dev *dev)
 {
-       int ret;
+       int ret, idx;
 
        mt76_wr(dev, MT_INT_SOURCE_CSR, ~0);
 
@@ -98,6 +93,15 @@ static int mt7615_init_hardware(struct mt7615_dev *dev)
        mt7615_mcu_ctrl_pm_state(dev, 0);
        mt7615_mcu_del_wtbl_all(dev);
 
+       /* Beacon and mgmt frames should occupy wcid 0 */
+       idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7615_WTBL_STA - 1);
+       if (idx)
+               return -ENOSPC;
+
+       dev->mt76.global_wcid.idx = idx;
+       dev->mt76.global_wcid.hw_key_idx = -1;
+       rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid);
+
        return 0;
 }
 
index 9a13e38ac2fe556fb0b7e671996d4a6ea25ba0dc..d21407ddda31ed2bd52aebf40f3105525ed0a23b 100644 (file)
@@ -95,7 +95,7 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,
 
        dev->vif_mask |= BIT(mvif->idx);
        dev->omac_mask |= BIT(mvif->omac_idx);
-       idx = MT7615_WTBL_RESERVED - 1 - mvif->idx;
+       idx = MT7615_WTBL_RESERVED - mvif->idx;
        mvif->sta.wcid.idx = idx;
        mvif->sta.wcid.hw_key_idx = -1;
 
index b6273adbf0de70b0b31c6018e650667bd909294f..3e0dc21997a60fed2a913f33ceb207ab9eb67540 100644 (file)
@@ -882,6 +882,7 @@ int mt7615_mcu_set_wtbl_key(struct mt7615_dev *dev, int wcid,
                if (cipher == MT_CIPHER_NONE && key)
                        return -EOPNOTSUPP;
 
+               req.key.rkv = 1;
                req.key.cipher_id = cipher;
                req.key.key_id = key->keyidx;
                req.key.key_len = key->keylen;