]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mt76: mt7615: initialize dbdc settings on interface add
authorFelix Fietkau <nbd@nbd.name>
Wed, 30 Oct 2019 18:06:19 +0000 (19:06 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Feb 2020 09:05:59 +0000 (10:05 +0100)
Use the first two WMM slots for the primary phy and the second two for the
secondary phy.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
drivers/net/wireless/mediatek/mt76/mt7615/regs.h

index 6b60ca80a24196387443070701712f2ca4178363..08b8285b58ae454f1c9ef82660778456e2569dc9 100644 (file)
@@ -121,7 +121,11 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,
        mvif->omac_idx = idx;
 
        mvif->band_idx = ext_phy;
-       mvif->wmm_idx = mvif->idx % MT7615_MAX_WMM_SETS;
+       if (mt7615_ext_phy(dev))
+               mvif->wmm_idx = ext_phy * (MT7615_MAX_WMM_SETS / 2) +
+                               mvif->idx % (MT7615_MAX_WMM_SETS / 2);
+       else
+               mvif->wmm_idx = mvif->idx % MT7615_MAX_WMM_SETS;
 
        ret = mt7615_mcu_set_dev_info(dev, vif, 1);
        if (ret)
@@ -129,6 +133,10 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,
 
        dev->vif_mask |= BIT(mvif->idx);
        dev->omac_mask |= BIT(mvif->omac_idx);
+       phy->omac_mask |= BIT(mvif->omac_idx);
+
+       mt7615_mcu_set_dbdc(dev);
+
        idx = MT7615_WTBL_RESERVED - mvif->idx;
 
        INIT_LIST_HEAD(&mvif->sta.poll_list);
@@ -155,6 +163,7 @@ static void mt7615_remove_interface(struct ieee80211_hw *hw,
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
        struct mt7615_sta *msta = &mvif->sta;
        struct mt7615_dev *dev = mt7615_hw_dev(hw);
+       struct mt7615_phy *phy = mt7615_hw_phy(hw);
        int idx = msta->wcid.idx;
 
        /* TODO: disable beacon for the bss */
@@ -167,6 +176,7 @@ static void mt7615_remove_interface(struct ieee80211_hw *hw,
        mutex_lock(&dev->mt76.mutex);
        dev->vif_mask &= ~BIT(mvif->idx);
        dev->omac_mask &= ~BIT(mvif->omac_idx);
+       phy->omac_mask &= ~BIT(mvif->omac_idx);
        mutex_unlock(&dev->mt76.mutex);
 
        spin_lock_bh(&dev->sta_poll_lock);
index a19c406c22316f582fc9be5a184808c3cd8ceb5b..9b09f2e742df06c01104b9496faeac1019072207 100644 (file)
@@ -717,6 +717,65 @@ int mt7615_mcu_ctrl_pm_state(struct mt7615_dev *dev, int band, int enter)
                                   &req, sizeof(req), true);
 }
 
+int mt7615_mcu_set_dbdc(struct mt7615_dev *dev)
+{
+       struct mt7615_phy *ext_phy = mt7615_ext_phy(dev);
+       struct dbdc_entry {
+               u8 type;
+               u8 index;
+               u8 band;
+               u8 _rsv;
+       };
+       struct {
+               u8 enable;
+               u8 num;
+               u8 _rsv[2];
+               struct dbdc_entry entry[64];
+       } req = {
+               .enable = !!ext_phy,
+       };
+       int i;
+
+       if (!ext_phy)
+               goto out;
+
+#define ADD_DBDC_ENTRY(_type, _idx, _band)             \
+       do { \
+               req.entry[req.num].type = _type;                \
+               req.entry[req.num].index = _idx;                \
+               req.entry[req.num++].band = _band;              \
+       } while (0)
+
+       for (i = 0; i < 4; i++) {
+               bool band = !!(ext_phy->omac_mask & BIT(i));
+
+               ADD_DBDC_ENTRY(DBDC_TYPE_BSS, i, band);
+       }
+
+       for (i = 0; i < 14; i++) {
+               bool band = !!(ext_phy->omac_mask & BIT(0x11 + i));
+
+               ADD_DBDC_ENTRY(DBDC_TYPE_MBSS, i, band);
+       }
+
+       ADD_DBDC_ENTRY(DBDC_TYPE_MU, 0, 1);
+
+       for (i = 0; i < 3; i++)
+               ADD_DBDC_ENTRY(DBDC_TYPE_BF, i, 1);
+
+       ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 0, 0);
+       ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 1, 0);
+       ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 2, 1);
+       ADD_DBDC_ENTRY(DBDC_TYPE_WMM, 3, 1);
+
+       ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 0, 0);
+       ADD_DBDC_ENTRY(DBDC_TYPE_MGMT, 1, 1);
+
+out:
+       return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_DBDC_CTRL,
+                                  &req, sizeof(req), true);
+}
+
 int mt7615_mcu_set_dev_info(struct mt7615_dev *dev,
                            struct ieee80211_vif *vif, bool enable)
 {
index f4781477fc9b499dfc90583e02d79b838fb1fcfa..8d057c72366ae1e6958bba09e9a7edf08add88d4 100644 (file)
@@ -148,6 +148,7 @@ enum {
        MCU_EXT_CMD_WTBL_UPDATE = 0x32,
        MCU_EXT_CMD_SET_RDD_CTRL = 0x3a,
        MCU_EXT_CMD_PROTECT_CTRL = 0x3e,
+       MCU_EXT_CMD_DBDC_CTRL = 0x45,
        MCU_EXT_CMD_MAC_INIT_CTRL = 0x46,
        MCU_EXT_CMD_BCN_OFFLOAD = 0x49,
        MCU_EXT_CMD_SET_RX_PATH = 0x4e,
@@ -202,6 +203,18 @@ enum {
        DEV_INFO_MAX_NUM
 };
 
+enum {
+       DBDC_TYPE_WMM,
+       DBDC_TYPE_MGMT,
+       DBDC_TYPE_BSS,
+       DBDC_TYPE_MBSS,
+       DBDC_TYPE_REPEATER,
+       DBDC_TYPE_MU,
+       DBDC_TYPE_BF,
+       DBDC_TYPE_PTA,
+       __DBDC_TYPE_MAX,
+};
+
 struct bss_info_omac {
        __le16 tag;
        __le16 len;
index 64c8ad64733bc24a0b8770acd0a0e7accbaeeced..3323baa7cc0c48225bb73604edf527e24d811d25 100644 (file)
@@ -88,6 +88,7 @@ struct mt7615_phy {
        struct mt7615_dev *dev;
 
        u32 rxfilter;
+       u32 omac_mask;
 
        unsigned long last_cca_adj;
        int false_cca_ofdm, false_cca_cck;
@@ -285,6 +286,7 @@ int mt7615_mac_wtbl_set_key(struct mt7615_dev *dev, struct mt76_wcid *wcid,
                            struct ieee80211_key_conf *key,
                            enum set_key_cmd cmd);
 
+int mt7615_mcu_set_dbdc(struct mt7615_dev *dev);
 int mt7615_mcu_set_eeprom(struct mt7615_dev *dev);
 int mt7615_mcu_init_mac(struct mt7615_dev *dev);
 int mt7615_mcu_set_rts_thresh(struct mt7615_phy *phy, u32 val);
index d0602a3b0ac1f4bb7f5f73c8953005c0b4592f07..cece061b11083b349035bbe99f1f8068d7edf9cb 100644 (file)
 #define MT_CFG_CCR_MAC_D1_2X_GC_EN     BIT(30)
 #define MT_CFG_CCR_MAC_D0_2X_GC_EN     BIT(31)
 
+#define MT_DBDC_CTRL0                  MT_WF_CFG(0x050)
+#define MT_DBDC_CTRL0_OMAC_00_04       GENMASK(4, 0)
+#define MT_DBDC_CTRL0_OMAC_11_1F       GENMASK(19, 5)
+#define MT_DBDC_CTRL0_MGMT             GENMASK(21, 20)
+#define MT_DBDC_CTRL0_WMM              GENMASK(25, 22)
+#define MT_DBDC_CTRL0_DBDC_EN          BIT(31)
+
+#define MT_DBDC_CTRL1                  MT_WF_CFG(0x054)
+
 #define MT_WF_AGG_BASE                 0x20a00
 #define MT_WF_AGG(ofs)                 (MT_WF_AGG_BASE + (ofs))