[PATCH v2 2/3] mt76: mt7915: rework .set_bitrate_mask() to support more options

Felix Fietkau nbd at nbd.name
Fri Aug 13 04:13:34 PDT 2021


On 2021-08-13 04:32, Ryder Lee wrote:
> With this patch, driver can support single rate, (HE)GI and HE_LTF
> configuration through .set_bitrate_mask().
> 
> Tested-by: MeiChia Chiu <meichia.chiu at mediatek.com>
> Signed-off-by: Ryder Lee <ryder.lee at mediatek.com>
> ---
> v2: fix an enum warning
> ---
>  .../net/wireless/mediatek/mt76/mt7915/mac.c   |   2 +-
>  .../net/wireless/mediatek/mt76/mt7915/main.c  |  32 ++--
>  .../net/wireless/mediatek/mt76/mt7915/mcu.c   | 148 +++++++++++++++++-
>  .../net/wireless/mediatek/mt76/mt7915/mcu.h   |  16 +-
>  .../wireless/mediatek/mt76/mt7915/mt7915.h    |   5 +
>  5 files changed, 175 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> index 028ee5bb0532..74f08e1c2f55 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
> @@ -2042,6 +2042,128 @@ mt7915_mcu_add_txbf(struct mt7915_dev *dev, struct ieee80211_vif *vif,
>  	return 0;
>  }
>  
> +int mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev,
> +				   struct ieee80211_vif *vif,
> +				   struct ieee80211_sta *sta,
> +				   void *data, u32 field)
> +{
> +	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
> +	struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv;
> +	struct sta_phy *phy = data;
> +	struct sta_rec_ra_fixed *ra;
> +	struct sk_buff *skb;
> +	struct tlv *tlv;
> +	int len = sizeof(struct sta_req_hdr) + sizeof(*ra);
> +
> +	skb = mt7915_mcu_alloc_sta_req(dev, mvif, msta, len);
> +	if (IS_ERR(skb))
> +		return PTR_ERR(skb);
> +
> +	tlv = mt7915_mcu_add_tlv(skb, STA_REC_RA_UPDATE, sizeof(*ra));
> +	ra = (struct sta_rec_ra_fixed *)tlv;
> +
> +	switch (field) {
> +	case RATE_PARAM_AUTO:
> +		break;
> +	case RATE_PARAM_FIXED_MCS:
> +	case RATE_PARAM_FIXED_GI:
> +	case RATE_PARAM_FIXED_HE_LTF:
> +		ra->phy = *phy;
> +		break;
> +	default:
> +		break;
> +	}
> +	ra->field = cpu_to_le32(field);
> +
> +	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
> +				     MCU_EXT_CMD(STA_REC_UPDATE), true);
> +}
> +
> +static int
> +mt7915_mcu_add_rate_ctrl_fixed(struct mt7915_dev *dev,
> +			       struct ieee80211_vif *vif,
> +			       struct ieee80211_sta *sta)
> +{
> +	struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
> +	struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
> +	struct cfg80211_bitrate_mask *mask = &mvif->bitrate_mask;
> +	enum nl80211_band band = chandef->chan->band;
> +	struct sta_phy phy = {};
> +	int ret, nrates;
> +
> +#define __sta_phy_bitrate_mask_set(_mcs, _gi, _he)				\
> +	do {									\
> +		u8 i, gi = mask->control[band]._gi;				\
> +		gi = (_he) ? gi : gi == NL80211_TXRATE_FORCE_SGI;		\
> +		for (i = 0; i <= sta->bandwidth; i++) {				\
> +			phy.sgi |= gi << (i << (_he));				\
> +			phy.he_ltf |= mask->control[band].he_ltf << (i << (_he));\
> +		}								\
> +		for (i = 0; i < ARRAY_SIZE(mask->control[band]._mcs); i++) 	\
> +			nrates += hweight16(mask->control[band]._mcs[i]);  	\
> +		phy.mcs = ffs(mask->control[band]._mcs[0]) - 1;			\
> +	} while (0)
> +
> +	if (sta->he_cap.has_he) {
> +		__sta_phy_bitrate_mask_check(he_mcs, he_gi, 1);
This does not compile because of a wrong macro name (_set vs _check).

- Felix



More information about the Linux-mediatek mailing list