mt76: connac: introduce mt76_sta_cmd_info data structure
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 24 Mar 2021 08:37:36 +0000 (09:37 +0100)
committerFelix Fietkau <nbd@nbd.name>
Sun, 11 Apr 2021 22:03:04 +0000 (00:03 +0200)
Introduce mt76_sta_cmd_info data structure to contain parameters passed
to mt76_sta_cmd_info routine. This is preliminary patch to properly
configure rcpi for mt7921 devices.

Tested-by: Jayden.Kuo <jayden.kuo@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
drivers/net/wireless/mediatek/mt76/mt7921/main.c

index 4ca0d8d4c53675709a73d8d7116ccab788bb44db..1ed06c253816b6da29bd127fe00b05bfe82996ab 100644 (file)
@@ -988,7 +988,7 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
 
        mt76_connac_mcu_sta_basic_tlv(sskb, vif, sta, enable);
        if (enable && sta)
-               mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif);
+               mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0);
 
        wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid,
                                                  WTBL_RESET_AND_SET, NULL,
@@ -1086,10 +1086,15 @@ __mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif,
                     struct ieee80211_sta *sta, bool enable, int cmd)
 {
        struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
-       struct mt76_wcid *wcid;
+       struct mt76_sta_cmd_info info = {
+               .sta = sta,
+               .vif = vif,
+               .enable = enable,
+               .cmd = cmd,
+       };
 
-       wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
-       return mt76_connac_mcu_add_sta_cmd(phy, vif, sta, wcid, enable, cmd);
+       info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid;
+       return mt76_connac_mcu_add_sta_cmd(phy, &info);
 }
 
 static int
index 2cd1677d881e13399abfbeae3e51174a09b83344..bafe952108070006c39e96b2e0342518bb17326b 100644 (file)
@@ -674,7 +674,8 @@ mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
 
 void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
                             struct ieee80211_sta *sta,
-                            struct ieee80211_vif *vif)
+                            struct ieee80211_vif *vif,
+                            u8 rcpi)
 {
        struct cfg80211_chan_def *chandef = &mphy->chandef;
        enum nl80211_band band = chandef->chan->band;
@@ -723,6 +724,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
        phy = (struct sta_rec_phy *)tlv;
        phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band, sta);
        phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
+       phy->rcpi = rcpi;
 
        tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
        ra_info = (struct sta_rec_ra_info *)tlv;
@@ -827,43 +829,42 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
 EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ht_tlv);
 
 int mt76_connac_mcu_add_sta_cmd(struct mt76_phy *phy,
-                               struct ieee80211_vif *vif,
-                               struct ieee80211_sta *sta,
-                               struct mt76_wcid *wcid,
-                               bool enable, int cmd)
+                               struct mt76_sta_cmd_info *info)
 {
-       struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
+       struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
        struct mt76_dev *dev = phy->dev;
        struct wtbl_req_hdr *wtbl_hdr;
        struct tlv *sta_wtbl;
        struct sk_buff *skb;
 
-       skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, wcid);
+       skb = mt76_connac_mcu_alloc_sta_req(dev, mvif, info->wcid);
        if (IS_ERR(skb))
                return PTR_ERR(skb);
 
-       mt76_connac_mcu_sta_basic_tlv(skb, vif, sta, enable);
-       if (enable && sta)
-               mt76_connac_mcu_sta_tlv(phy, skb, sta, vif);
+       mt76_connac_mcu_sta_basic_tlv(skb, info->vif, info->sta, info->enable);
+       if (info->enable && info->sta)
+               mt76_connac_mcu_sta_tlv(phy, skb, info->sta, info->vif,
+                                       info->rcpi);
 
        sta_wtbl = mt76_connac_mcu_add_tlv(skb, STA_REC_WTBL,
                                           sizeof(struct tlv));
 
-       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, wcid,
+       wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(dev, info->wcid,
                                                  WTBL_RESET_AND_SET,
                                                  sta_wtbl, &skb);
        if (IS_ERR(wtbl_hdr))
                return PTR_ERR(wtbl_hdr);
 
-       if (enable) {
-               mt76_connac_mcu_wtbl_generic_tlv(dev, skb, vif, sta, sta_wtbl,
+       if (info->enable) {
+               mt76_connac_mcu_wtbl_generic_tlv(dev, skb, info->vif,
+                                                info->sta, sta_wtbl,
                                                 wtbl_hdr);
-               if (sta)
-                       mt76_connac_mcu_wtbl_ht_tlv(dev, skb, sta, sta_wtbl,
-                                                   wtbl_hdr);
+               if (info->sta)
+                       mt76_connac_mcu_wtbl_ht_tlv(dev, skb, info->sta,
+                                                   sta_wtbl, wtbl_hdr);
        }
 
-       return mt76_mcu_skb_send_msg(dev, skb, cmd, true);
+       return mt76_mcu_skb_send_msg(dev, skb, info->cmd, true);
 }
 EXPORT_SYMBOL_GPL(mt76_connac_mcu_add_sta_cmd);
 
index 950e68e11ddd568d9bdbeb5bdbf3d2c26b341417..5a3efd744546f143652aeb784f99b03439291a51 100644 (file)
@@ -881,6 +881,17 @@ struct mt76_connac_suspend_tlv {
        u8 pad[5];
 } __packed;
 
+struct mt76_sta_cmd_info {
+       struct ieee80211_sta *sta;
+       struct mt76_wcid *wcid;
+
+       struct ieee80211_vif *vif;
+
+       bool enable;
+       int cmd;
+       u8 rcpi;
+};
+
 #define to_wcid_lo(id)         FIELD_GET(GENMASK(7, 0), (u16)id)
 #define to_wcid_hi(id)         FIELD_GET(GENMASK(9, 8), (u16)id)
 
@@ -928,7 +939,8 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
                                        void *sta_wtbl, void *wtbl_tlv);
 void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
                             struct ieee80211_sta *sta,
-                            struct ieee80211_vif *vif);
+                            struct ieee80211_vif *vif,
+                            u8 rcpi);
 void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
                                 struct ieee80211_sta *sta, void *sta_wtbl,
                                 void *wtbl_tlv);
@@ -951,10 +963,7 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
                                struct mt76_wcid *wcid,
                                bool enable);
 int mt76_connac_mcu_add_sta_cmd(struct mt76_phy *phy,
-                               struct ieee80211_vif *vif,
-                               struct ieee80211_sta *sta,
-                               struct mt76_wcid *wcid,
-                               bool enable, int cmd);
+                               struct mt76_sta_cmd_info *info);
 void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
                                      struct ieee80211_vif *vif);
 int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band);
index dd22561ae800ea88ae01b2ac260b90c4b3701e1a..302d8d78d6f7e8762705b365705f867e3b3b1da2 100644 (file)
@@ -624,6 +624,13 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
        struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
        struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;
        struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+       struct mt76_sta_cmd_info info = {
+               .sta = sta,
+               .vif = vif,
+               .enable = true,
+               .cmd = MCU_UNI_CMD_STA_REC_UPDATE,
+               .wcid = &msta->wcid,
+       };
        int ret, idx;
 
        idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7921_WTBL_STA - 1);
@@ -650,8 +657,7 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
        mt7921_mac_wtbl_update(dev, idx,
                               MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
 
-       ret = mt76_connac_mcu_add_sta_cmd(&dev->mphy, vif, sta, &msta->wcid,
-                                         true, MCU_UNI_CMD_STA_REC_UPDATE);
+       ret = mt76_connac_mcu_add_sta_cmd(&dev->mphy, &info);
        if (ret)
                return ret;
 
@@ -665,12 +671,17 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
 {
        struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
        struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;
+       struct mt76_sta_cmd_info info = {
+               .sta = sta,
+               .vif = vif,
+               .cmd = MCU_UNI_CMD_STA_REC_UPDATE,
+               .wcid = &msta->wcid,
+       };
 
        mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid);
        mt76_connac_pm_wake(&dev->mphy, &dev->pm);
 
-       mt76_connac_mcu_add_sta_cmd(&dev->mphy, vif, sta, &msta->wcid, false,
-                                   MCU_UNI_CMD_STA_REC_UPDATE);
+       mt76_connac_mcu_add_sta_cmd(&dev->mphy, &info);
 
        mt7921_mac_wtbl_update(dev, msta->wcid.idx,
                               MT_WTBL_UPDATE_ADM_COUNT_CLEAR);