Extend mt76_connac_mcu_uni_add_dev with per-link BSS configuration.
The patch we created is a prerequisite to enable the MLO function in the
driver. It is purely a refactoring patch so the functionality should
remain unchanged.
We also extend link_idx field in mt76_connac_bss_basic_tlv for the firmware
to able to identify the link index in the MLO mode that is not harmful
for the current non-MLO mode.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20240613030241.5771-6-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
 
-       return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
-                                          enable);
+       return mt76_connac_mcu_uni_add_dev(phy->mt76, &vif->bss_conf,
+                                          &mvif->sta.wcid, enable);
 }
 
 static int
 
 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
 
 int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
-                               struct ieee80211_vif *vif,
+                               struct ieee80211_bss_conf *bss_conf,
                                struct mt76_wcid *wcid,
                                bool enable)
 {
-       struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
+       struct mt76_vif *mvif = (struct mt76_vif *)bss_conf->vif->drv_priv;
        struct mt76_dev *dev = phy->dev;
        struct {
                struct {
                        __le16 tag;
                        __le16 len;
                        u8 active;
-                       u8 pad;
+                       u8 link_idx; /* not link_id */
                        u8 omac_addr[ETH_ALEN];
                } __packed tlv;
        } dev_req = {
                        .tag = cpu_to_le16(DEV_INFO_ACTIVE),
                        .len = cpu_to_le16(sizeof(struct req_tlv)),
                        .active = enable,
+                       .link_idx = mvif->idx,
                },
        };
        struct {
                        .bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
                        .sta_idx = cpu_to_le16(wcid->idx),
                        .conn_state = 1,
+                       .link_idx = mvif->idx,
                },
        };
        int err, idx, cmd, len;
        void *data;
 
-       switch (vif->type) {
+       switch (bss_conf->vif->type) {
        case NL80211_IFTYPE_MESH_POINT:
        case NL80211_IFTYPE_MONITOR:
        case NL80211_IFTYPE_AP:
        idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
        basic_req.basic.hw_bss_idx = idx;
 
-       memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
+       memcpy(dev_req.tlv.omac_addr, bss_conf->vif->addr, ETH_ALEN);
 
        cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE);
        data = enable ? (void *)&dev_req : (void *)&basic_req;
 
        __le16 sta_idx;
        __le16 nonht_basic_phy;
        u8 phymode_ext; /* bit(0) AX_6G */
-       u8 pad[1];
+       u8 link_idx;
 } __packed;
 
 struct mt76_connac_bss_qos_tlv {
                                struct ieee80211_ampdu_params *params,
                                bool enable, bool tx);
 int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
-                               struct ieee80211_vif *vif,
+                               struct ieee80211_bss_conf *bss_conf,
                                struct mt76_wcid *wcid,
                                bool enable);
 int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
 
        if (vif->type == NL80211_IFTYPE_STATION)
                ieee80211_disconnect(vif, true);
 
-       mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.deflink.wcid, true);
+       mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
+                                   &mvif->sta.deflink.wcid, true);
        mt7921_mcu_set_tx(dev, vif);
 
        if (vif->type == NL80211_IFTYPE_AP) {
 
        mvif->bss_conf.mt76.band_idx = 0;
        mvif->bss_conf.mt76.wmm_idx = mvif->bss_conf.mt76.idx % MT76_CONNAC_MAX_WMM_SETS;
 
-       ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.deflink.wcid,
-                                         true);
+       ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
+                                         &mvif->sta.deflink.wcid, true);
        if (ret)
                goto out;
 
 
        if (vif->type == NL80211_IFTYPE_STATION)
                ieee80211_disconnect(vif, true);
 
-       mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.deflink.wcid, true);
+       mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
+                                   &mvif->sta.deflink.wcid, true);
        mt7925_mcu_set_tx(dev, vif);
 
        if (vif->type == NL80211_IFTYPE_AP) {
 
        else
                mvif->bss_conf.mt76.basic_rates_idx = MT792x_BASIC_RATES_TBL;
 
-       ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.deflink.wcid,
-                                         true);
+       ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
+                                         &mvif->sta.deflink.wcid, true);
        if (ret)
                goto out;
 
 
 
        mt792x_mutex_acquire(dev);
        mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->deflink.wcid);
-       mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.deflink.wcid, false);
+       mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf, &mvif->sta.deflink.wcid, false);
 
        rcu_assign_pointer(dev->mt76.wcid[idx], NULL);