Message ID | 57ebfc95640b3f062a1211bf939f9edfd9f58372.1660606893.git.objelf@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | wifi: mt76: mt7921: introduce chanctx support | expand |
On Aug 16, Sean Wang wrote: > From: Sean Wang <sean.wang@mediatek.com> > > add mt76_connac_mcu_uni_set_chctx to set up the channel context per BSS > in the firmware > > Signed-off-by: Sean Wang <sean.wang@mediatek.com> > --- > .../wireless/mediatek/mt76/mt76_connac_mcu.c | 83 +++++++++++++++++++ > .../wireless/mediatek/mt76/mt76_connac_mcu.h | 3 + > 2 files changed, 86 insertions(+) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c > index 0afcadce87fc..3d5c70765d4f 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c > @@ -1311,6 +1311,89 @@ mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif, > he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80; > } > > +int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif, > + struct ieee80211_chanctx_conf *ctx) > +{ > + struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef; > + int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2; > + enum nl80211_band band = chandef->chan->band; > + struct mt76_dev *mdev = phy->dev; > + nit: remove new-line here. > + struct { > + struct { > + u8 bss_idx; > + u8 pad[3]; > + } __packed hdr; > + struct rlm_tlv { > + __le16 tag; > + __le16 len; > + u8 control_channel; > + u8 center_chan; > + u8 center_chan2; > + u8 bw; > + u8 tx_streams; > + u8 rx_streams; > + u8 short_st; > + u8 ht_op_info; > + u8 sco; > + u8 band; > + u8 pad[2]; > + } __packed rlm; > + } __packed rlm_req = { > + .hdr = { > + .bss_idx = mvif->idx, > + }, > + .rlm = { > + .tag = cpu_to_le16(UNI_BSS_INFO_RLM), > + .len = cpu_to_le16(sizeof(struct rlm_tlv)), > + .control_channel = chandef->chan->hw_value, > + .center_chan = ieee80211_frequency_to_channel(freq1), > + .center_chan2 = ieee80211_frequency_to_channel(freq2), > + .tx_streams = hweight8(phy->antenna_mask), > + .ht_op_info = 4, /* set HT 40M allowed */ > + .rx_streams = phy->chainmask, > + .short_st = true, > + .band = band, > + }, > + }; > + > + switch (chandef->width) { > + case NL80211_CHAN_WIDTH_40: > + rlm_req.rlm.bw = CMD_CBW_40MHZ; > + break; > + case NL80211_CHAN_WIDTH_80: > + rlm_req.rlm.bw = CMD_CBW_80MHZ; > + break; > + case NL80211_CHAN_WIDTH_80P80: > + rlm_req.rlm.bw = CMD_CBW_8080MHZ; > + break; > + case NL80211_CHAN_WIDTH_160: > + rlm_req.rlm.bw = CMD_CBW_160MHZ; > + break; > + case NL80211_CHAN_WIDTH_5: > + rlm_req.rlm.bw = CMD_CBW_5MHZ; > + break; > + case NL80211_CHAN_WIDTH_10: > + rlm_req.rlm.bw = CMD_CBW_10MHZ; > + break; > + case NL80211_CHAN_WIDTH_20_NOHT: > + case NL80211_CHAN_WIDTH_20: > + default: > + rlm_req.rlm.bw = CMD_CBW_20MHZ; > + rlm_req.rlm.ht_op_info = 0; > + break; > + } > + > + if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan) > + rlm_req.rlm.sco = 1; /* SCA */ > + else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan) > + rlm_req.rlm.sco = 3; /* SCB */ > + > + return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req, > + sizeof(rlm_req), true); > +} > +EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_set_chctx); > + > int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy, > struct ieee80211_vif *vif, > struct mt76_wcid *wcid, > diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h > index f1d7c05bd794..bf60b00d6020 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h > +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h > @@ -1727,6 +1727,9 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, > int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif, > struct ieee80211_ampdu_params *params, > int cmd, bool enable, bool tx); > +int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, > + struct mt76_vif *vif, > + struct ieee80211_chanctx_conf *ctx); > int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy, > struct ieee80211_vif *vif, > struct mt76_wcid *wcid, > -- > 2.25.1 >
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c index 0afcadce87fc..3d5c70765d4f 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c @@ -1311,6 +1311,89 @@ mt76_connac_mcu_uni_bss_he_tlv(struct mt76_phy *phy, struct ieee80211_vif *vif, he->max_nss_mcs[CMD_HE_MCS_BW8080] = cap->he_mcs_nss_supp.tx_mcs_80p80; } +int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif, + struct ieee80211_chanctx_conf *ctx) +{ + struct cfg80211_chan_def *chandef = ctx ? &ctx->def : &phy->chandef; + int freq1 = chandef->center_freq1, freq2 = chandef->center_freq2; + enum nl80211_band band = chandef->chan->band; + struct mt76_dev *mdev = phy->dev; + + struct { + struct { + u8 bss_idx; + u8 pad[3]; + } __packed hdr; + struct rlm_tlv { + __le16 tag; + __le16 len; + u8 control_channel; + u8 center_chan; + u8 center_chan2; + u8 bw; + u8 tx_streams; + u8 rx_streams; + u8 short_st; + u8 ht_op_info; + u8 sco; + u8 band; + u8 pad[2]; + } __packed rlm; + } __packed rlm_req = { + .hdr = { + .bss_idx = mvif->idx, + }, + .rlm = { + .tag = cpu_to_le16(UNI_BSS_INFO_RLM), + .len = cpu_to_le16(sizeof(struct rlm_tlv)), + .control_channel = chandef->chan->hw_value, + .center_chan = ieee80211_frequency_to_channel(freq1), + .center_chan2 = ieee80211_frequency_to_channel(freq2), + .tx_streams = hweight8(phy->antenna_mask), + .ht_op_info = 4, /* set HT 40M allowed */ + .rx_streams = phy->chainmask, + .short_st = true, + .band = band, + }, + }; + + switch (chandef->width) { + case NL80211_CHAN_WIDTH_40: + rlm_req.rlm.bw = CMD_CBW_40MHZ; + break; + case NL80211_CHAN_WIDTH_80: + rlm_req.rlm.bw = CMD_CBW_80MHZ; + break; + case NL80211_CHAN_WIDTH_80P80: + rlm_req.rlm.bw = CMD_CBW_8080MHZ; + break; + case NL80211_CHAN_WIDTH_160: + rlm_req.rlm.bw = CMD_CBW_160MHZ; + break; + case NL80211_CHAN_WIDTH_5: + rlm_req.rlm.bw = CMD_CBW_5MHZ; + break; + case NL80211_CHAN_WIDTH_10: + rlm_req.rlm.bw = CMD_CBW_10MHZ; + break; + case NL80211_CHAN_WIDTH_20_NOHT: + case NL80211_CHAN_WIDTH_20: + default: + rlm_req.rlm.bw = CMD_CBW_20MHZ; + rlm_req.rlm.ht_op_info = 0; + break; + } + + if (rlm_req.rlm.control_channel < rlm_req.rlm.center_chan) + rlm_req.rlm.sco = 1; /* SCA */ + else if (rlm_req.rlm.control_channel > rlm_req.rlm.center_chan) + rlm_req.rlm.sco = 3; /* SCB */ + + return mt76_mcu_send_msg(mdev, MCU_UNI_CMD(BSS_INFO_UPDATE), &rlm_req, + sizeof(rlm_req), true); +} +EXPORT_SYMBOL_GPL(mt76_connac_mcu_uni_set_chctx); + int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy, struct ieee80211_vif *vif, struct mt76_wcid *wcid, diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h index f1d7c05bd794..bf60b00d6020 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h @@ -1727,6 +1727,9 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif, struct ieee80211_ampdu_params *params, int cmd, bool enable, bool tx); +int mt76_connac_mcu_uni_set_chctx(struct mt76_phy *phy, + struct mt76_vif *vif, + struct ieee80211_chanctx_conf *ctx); int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy, struct ieee80211_vif *vif, struct mt76_wcid *wcid,