···172172 int i;173173174174 for (i = 0; i < ARRAY_SIZE(mvif->bitrate_mask.control); i++) {175175+ mvif->bitrate_mask.control[i].gi = NL80211_TXRATE_DEFAULT_GI;176176+ mvif->bitrate_mask.control[i].he_gi = GENMASK(7, 0);177177+ mvif->bitrate_mask.control[i].he_ltf = GENMASK(7, 0);175178 mvif->bitrate_mask.control[i].legacy = GENMASK(31, 0);176179 memset(mvif->bitrate_mask.control[i].ht_mcs, GENMASK(7, 0),177180 sizeof(mvif->bitrate_mask.control[i].ht_mcs));···666663 if (ret)667664 return ret;668665669669- return mt7915_mcu_add_rate_ctrl(dev, vif, sta);666666+ return mt7915_mcu_add_rate_ctrl(dev, vif, sta, false);670667}671668672669void mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,···997994{998995 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;999996 struct mt7915_dev *dev = msta->vif->phy->dev;10001000- struct ieee80211_hw *hw = msta->vif->phy->mt76->hw;1001997 u32 *changed = data;10029981003999 spin_lock_bh(&dev->sta_poll_lock);···10041002 if (list_empty(&msta->rc_list))10051003 list_add_tail(&msta->rc_list, &dev->sta_rc_list);10061004 spin_unlock_bh(&dev->sta_poll_lock);10071007-10081008- ieee80211_queue_work(hw, &dev->rc_work);10091005}1010100610111007static void mt7915_sta_rc_update(struct ieee80211_hw *hw,···10111011 struct ieee80211_sta *sta,10121012 u32 changed)10131013{10141014+ struct mt7915_phy *phy = mt7915_hw_phy(hw);10151015+ struct mt7915_dev *dev = phy->dev;10161016+10141017 mt7915_sta_rc_work(&changed, sta);10181018+ ieee80211_queue_work(hw, &dev->rc_work);10151019}1016102010171021static int···10231019 const struct cfg80211_bitrate_mask *mask)10241020{10251021 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;10261026- enum nl80211_band band = mvif->phy->mt76->chandef.chan->band;10271027- u32 changed;10221022+ struct mt7915_phy *phy = mt7915_hw_phy(hw);10231023+ struct mt7915_dev *dev = phy->dev;10241024+ u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED;1028102510291029- if (mask->control[band].gi == NL80211_TXRATE_FORCE_LGI)10301030- return -EINVAL;10311031-10321032- changed = IEEE80211_RC_SUPP_RATES_CHANGED;10331026 mvif->bitrate_mask = *mask;1034102710351035- /* Update firmware rate control to add a boundary on top of table10361036- * to limit the rate selection for each peer, so when set bitrates10371037- * vht-mcs-5 1:9, which actually means nss = 1 mcs = 0~9. This only10381038- * applies to data frames as for the other mgmt, mcast, bcast still10391039- * use legacy rates as it is.10281028+ /* if multiple rates across different preambles are given we can10291029+ * reconfigure this info with all peers using sta_rec command with10301030+ * the below exception cases.10311031+ * - single rate : if a rate is passed along with different preambles,10321032+ * we select the highest one as fixed rate. i.e VHT MCS for VHT peers.10331033+ * - multiple rates: if it's not in range format i.e 0-{7,8,9} for VHT10341034+ * then multiple MCS setting (MCS 4,5,6) is not supported.10401035 */10411036 ieee80211_iterate_stations_atomic(hw, mt7915_sta_rc_work, &changed);10371037+ ieee80211_queue_work(hw, &dev->rc_work);1042103810431039 return 0;10441040}
+164-40
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
···416416 return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);417417}418418419419-static int420420-mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)419419+int mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)421420{422421 struct {423422 __le32 args[3];···428429 },429430 };430431431431- return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);432432+ return mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), false);432433}433434434435static void···20492050 bfee->fb_identity_matrix = (nrow == 1 && tx_ant == 2);20502051}2051205220532053+int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,20542054+ struct ieee80211_vif *vif,20552055+ struct ieee80211_sta *sta,20562056+ void *data, u32 field)20572057+{20582058+ struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;20592059+ struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;20602060+ struct sta_phy *phy = data;20612061+ struct sta_rec_ra_fixed *ra;20622062+ struct sk_buff *skb;20632063+ struct tlv *tlv;20642064+ int len = sizeof(struct sta_req_hdr) + sizeof(*ra);20652065+20662066+ skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);20672067+ if (IS_ERR(skb))20682068+ return PTR_ERR(skb);20692069+20702070+ tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));20712071+ ra = (struct sta_rec_ra_fixed *)tlv;20722072+20732073+ switch (field) {20742074+ case RATE_PARAM_AUTO:20752075+ break;20762076+ case RATE_PARAM_FIXED:20772077+ case RATE_PARAM_FIXED_MCS:20782078+ case RATE_PARAM_FIXED_GI:20792079+ case RATE_PARAM_FIXED_HE_LTF:20802080+ ra->phy = *phy;20812081+ break;20822082+ default:20832083+ break;20842084+ }20852085+ ra->field = cpu_to_le32(field);20862086+20872087+ return mt76_mcu_skb_send_msg(&dev->mt76, skb,20882088+ MCU_EXT_CMD(STA_REC_UPDATE), true);20892089+}20902090+20912091+static int20922092+mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,20932093+ struct ieee80211_vif *vif,20942094+ struct ieee80211_sta *sta)20952095+{20962096+ struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;20972097+ struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;20982098+ struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;20992099+ enum nl80211_band band = chandef->chan->band;21002100+ struct sta_phy phy = {};21012101+ int ret, nrates = 0;21022102+21032103+#define __sta_phy_bitrate_mask_check(_mcs, _gi, _he) \21042104+ do { \21052105+ u8 i, gi = mask->control[band]._gi; \21062106+ gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI; \21072107+ for (i = 0; i <= sta->bandwidth; i++) { \21082108+ phy.sgi |= gi << (i << (_he)); \21092109+ phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\21102110+ } \21112111+ for (i = 0; i < ARRAY_SIZE(mask->control[band]._mcs); i++) \21122112+ nrates += hweight16(mask->control[band]._mcs[i]); \21132113+ phy.mcs = ffs(mask->control[band]._mcs[0]) - 1; \21142114+ } while (0)21152115+21162116+ if (sta->he_cap.has_he) {21172117+ __sta_phy_bitrate_mask_check(he_mcs, he_gi, 1);21182118+ } else if (sta->vht_cap.vht_supported) {21192119+ __sta_phy_bitrate_mask_check(vht_mcs, gi, 0);21202120+ } else if (sta->ht_cap.ht_supported) {21212121+ __sta_phy_bitrate_mask_check(ht_mcs, gi, 0);21222122+ } else {21232123+ nrates = hweight32(mask->control[band].legacy);21242124+ phy.mcs = ffs(mask->control[band].legacy) - 1;21252125+ }21262126+#undef __sta_phy_bitrate_mask_check21272127+21282128+ /* fall back to auto rate control */21292129+ if (mask->control[band].gi == NL80211_TXRATE_DEFAULT_GI &&21302130+ mask->control[band].he_gi == GENMASK(7, 0) &&21312131+ mask->control[band].he_ltf == GENMASK(7, 0) &&21322132+ nrates != 1)21332133+ return 0;21342134+21352135+ /* fixed single rate */21362136+ if (nrates == 1) {21372137+ ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,21382138+ RATE_PARAM_FIXED_MCS);21392139+ if (ret)21402140+ return ret;21412141+ }21422142+21432143+ /* fixed GI */21442144+ if (mask->control[band].gi != NL80211_TXRATE_DEFAULT_GI ||21452145+ mask->control[band].he_gi != GENMASK(7, 0)) {21462146+ struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;21472147+ u32 addr;21482148+21492149+ /* firmware updates only TXCMD but doesn't take WTBL into21502150+ * account, so driver should update here to reflect the21512151+ * actual txrate hardware sends out.21522152+ */21532153+ addr = mt7915_mac_wtbl_lmac_addr(dev, msta->wcid.idx, 7);21542154+ if (sta->he_cap.has_he)21552155+ mt76_rmw_field(dev, addr, GENMASK(31, 24), phy.sgi);21562156+ else21572157+ mt76_rmw_field(dev, addr, GENMASK(15, 12), phy.sgi);21582158+21592159+ ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,21602160+ RATE_PARAM_FIXED_GI);21612161+ if (ret)21622162+ return ret;21632163+ }21642164+21652165+ /* fixed HE_LTF */21662166+ if (mask->control[band].he_ltf != GENMASK(7, 0)) {21672167+ ret = mt7915_mcu_set_fixed_rate_ctrl(dev, vif, sta, &phy,21682168+ RATE_PARAM_FIXED_HE_LTF);21692169+ if (ret)21702170+ return ret;21712171+ }21722172+21732173+ return 0;21742174+}21752175+20522176static void20532177mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,20542178 struct ieee80211_vif *vif, struct ieee80211_sta *sta)···22142092 }2215209322162094 if (sta->ht_cap.ht_supported) {22172217- const u8 *mcs_mask = mask->control[band].ht_mcs;22182218-22192095 ra->supp_mode |= MODE_HT;22202096 ra->af = sta->ht_cap.ampdu_factor;22212097 ra->ht_gf = !!(sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD);···22312111 (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING))22322112 cap |= STA_CAP_LDPC;2233211322342234- mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs, mcs_mask);21142114+ mt7915_mcu_set_sta_ht_mcs(sta, ra->ht_mcs,21152115+ mask->control[band].ht_mcs);22352116 ra->supp_ht_mcs = *(__le32 *)ra->ht_mcs;22362117 }2237211822382119 if (sta->vht_cap.vht_supported) {22392239- const u16 *mcs_mask = mask->control[band].vht_mcs;22402120 u8 af;2241212122422122 ra->supp_mode |= MODE_VHT;···22572137 (sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC))22582138 cap |= STA_CAP_VHT_LDPC;2259213922602260- mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs, mcs_mask);21402140+ mt7915_mcu_set_sta_vht_mcs(sta, ra->supp_vht_mcs,21412141+ mask->control[band].vht_mcs);22612142 }2262214322632144 if (sta->he_cap.has_he) {···22702149}2271215022722151int mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif,22732273- struct ieee80211_sta *sta)21522152+ struct ieee80211_sta *sta, bool changed)22742153{22752154 struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;22762155 struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;22772156 struct sk_buff *skb;22782278- int len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_ra);21572157+ int ret;2279215822802280- skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);21592159+ skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta,21602160+ MT7915_STA_UPDATE_MAX_SIZE);22812161 if (IS_ERR(skb))22822162 return PTR_ERR(skb);2283216321642164+ /* firmware rc algorithm refers to sta_rec_he for HE control.21652165+ * once dev->rc_work changes the settings driver should also21662166+ * update sta_rec_he here.21672167+ */21682168+ if (sta->he_cap.has_he && changed)21692169+ mt7915_mcu_sta_he_tlv(skb, sta, vif);21702170+21712171+ /* sta_rec_ra accommodates BW, NSS and only MCS range format21722172+ * i.e 0-{7,8,9} for VHT.21732173+ */22842174 mt7915_mcu_sta_rate_ctrl_tlv(skb, dev, vif, sta);2285217522862286- return mt76_mcu_skb_send_msg(&dev->mt76, skb,22872287- MCU_EXT_CMD(STA_REC_UPDATE), true);22882288-}21762176+ ret = mt76_mcu_skb_send_msg(&dev->mt76, skb,21772177+ MCU_EXT_CMD(STA_REC_UPDATE), true);21782178+ if (ret)21792179+ return ret;2289218022902290-int mt7915_mcu_add_he(struct mt7915_dev *dev, struct ieee80211_vif *vif,22912291- struct ieee80211_sta *sta)22922292-{22932293- struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;22942294- struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;22952295- struct sk_buff *skb;22962296- int len;22972297-22982298- if (!sta->he_cap.has_he)22992299- return 0;23002300-23012301- len = sizeof(struct sta_req_hdr) + sizeof(struct sta_rec_he);23022302-23032303- skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);23042304- if (IS_ERR(skb))23052305- return PTR_ERR(skb);23062306-23072307- mt7915_mcu_sta_he_tlv(skb, sta, vif);23082308-23092309- return mt76_mcu_skb_send_msg(&dev->mt76, skb,23102310- MCU_EXT_CMD(STA_REC_UPDATE), true);21812181+ /* sta_rec_ra_fixed accommodates single rate, (HE)GI and HE_LTE,21822182+ * and updates as peer fixed rate parameters, which overrides21832183+ * sta_rec_ra and firmware rate control algorithm.21842184+ */21852185+ return mt7915_mcu_add_rate_ctrl_fixed(dev, vif, sta);23112186}2312218723132188static int···25602443 len);25612444 if (ie && ie[1] >= sizeof(*ht)) {25622445 ht = (void *)(ie + 2);25632563- bc = le32_to_cpu(ht->cap_info);25642564-25652565- vc->ldpc |= !!(bc & IEEE80211_HT_CAP_LDPC_CODING);24462446+ vc->ldpc |= !!(le16_to_cpu(ht->cap_info) &24472447+ IEEE80211_HT_CAP_LDPC_CODING);25662448 }2567244925682450 ie = cfg80211_find_ie(WLAN_EID_VHT_CAPABILITY, mgmt->u.beacon.variable,···29792863 return 0;29802864}2981286529822982-int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 ctrl)28662866+int mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl)29832867{29842868 struct {29852869 u8 ctrl_val;···29872871 } data = {29882872 .ctrl_val = ctrl29892873 };28742874+28752875+ if (type == MCU_FW_LOG_WA)28762876+ return mt76_mcu_send_msg(&dev->mt76, MCU_WA_EXT_CMD(FW_LOG_2_HOST),28772877+ &data, sizeof(data), true);2990287829912879 return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(FW_LOG_2_HOST), &data,29922880 sizeof(data), true);···31042984 return ret;3105298531062986 set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);31073107- ret = mt7915_mcu_fw_log_2_host(dev, 0);29872987+ ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WM, 0);29882988+ if (ret)29892989+ return ret;29902990+29912991+ ret = mt7915_mcu_fw_log_2_host(dev, MCU_FW_LOG_WA, 0);31082992 if (ret)31092993 return ret;31102994