mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-07 09:55:19 +02:00
wifi: mt76: mt7996: add EHT capability init
Add EHT mac and phy capability init for mt7996 chipsets. Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com> Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com> Co-developed-by: MeiChia Chiu <meichia.chiu@mediatek.com> Signed-off-by: MeiChia Chiu <meichia.chiu@mediatek.com> Co-developed-by: Bo Jiao <Bo.Jiao@mediatek.com> Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
827a6867dd
commit
348533eb96
|
@ -152,10 +152,12 @@ mt7996_init_wiphy(struct ieee80211_hw *hw)
|
||||||
struct mt7996_phy *phy = mt7996_hw_phy(hw);
|
struct mt7996_phy *phy = mt7996_hw_phy(hw);
|
||||||
struct mt76_dev *mdev = &phy->dev->mt76;
|
struct mt76_dev *mdev = &phy->dev->mt76;
|
||||||
struct wiphy *wiphy = hw->wiphy;
|
struct wiphy *wiphy = hw->wiphy;
|
||||||
|
u16 max_subframes = phy->dev->has_eht ? IEEE80211_MAX_AMPDU_BUF_EHT :
|
||||||
|
IEEE80211_MAX_AMPDU_BUF_HE;
|
||||||
|
|
||||||
hw->queues = 4;
|
hw->queues = 4;
|
||||||
hw->max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
|
hw->max_rx_aggregation_subframes = max_subframes;
|
||||||
hw->max_tx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF_HE;
|
hw->max_tx_aggregation_subframes = max_subframes;
|
||||||
hw->netdev_features = NETIF_F_RXCSUM;
|
hw->netdev_features = NETIF_F_RXCSUM;
|
||||||
|
|
||||||
hw->radiotap_timestamp.units_pos =
|
hw->radiotap_timestamp.units_pos =
|
||||||
|
@ -213,7 +215,7 @@ mt7996_init_wiphy(struct ieee80211_hw *hw)
|
||||||
|
|
||||||
mt76_set_stream_caps(phy->mt76, true);
|
mt76_set_stream_caps(phy->mt76, true);
|
||||||
mt7996_set_stream_vht_txbf_caps(phy);
|
mt7996_set_stream_vht_txbf_caps(phy);
|
||||||
mt7996_set_stream_he_caps(phy);
|
mt7996_set_stream_he_eht_caps(phy);
|
||||||
|
|
||||||
wiphy->available_antennas_rx = phy->mt76->antenna_mask;
|
wiphy->available_antennas_rx = phy->mt76->antenna_mask;
|
||||||
wiphy->available_antennas_tx = phy->mt76->antenna_mask;
|
wiphy->available_antennas_tx = phy->mt76->antenna_mask;
|
||||||
|
@ -699,9 +701,104 @@ mt7996_init_he_caps(struct mt7996_phy *phy, enum nl80211_band band,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__mt7996_set_stream_he_caps(struct mt7996_phy *phy,
|
mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
|
||||||
struct ieee80211_supported_band *sband,
|
struct ieee80211_sband_iftype_data *data,
|
||||||
enum nl80211_band band)
|
enum nl80211_iftype iftype)
|
||||||
|
{
|
||||||
|
struct ieee80211_sta_eht_cap *eht_cap = &data->eht_cap;
|
||||||
|
struct ieee80211_eht_cap_elem_fixed *eht_cap_elem = &eht_cap->eht_cap_elem;
|
||||||
|
struct ieee80211_eht_mcs_nss_supp *eht_nss = &eht_cap->eht_mcs_nss_supp;
|
||||||
|
enum nl80211_chan_width width = phy->mt76->chandef.width;
|
||||||
|
int nss = hweight8(phy->mt76->antenna_mask);
|
||||||
|
int sts = hweight16(phy->mt76->chainmask);
|
||||||
|
u8 val;
|
||||||
|
|
||||||
|
if (!phy->dev->has_eht)
|
||||||
|
return;
|
||||||
|
|
||||||
|
eht_cap->has_eht = true;
|
||||||
|
|
||||||
|
eht_cap_elem->mac_cap_info[0] =
|
||||||
|
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||||
|
IEEE80211_EHT_MAC_CAP0_OM_CONTROL;
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[0] =
|
||||||
|
IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ |
|
||||||
|
IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
|
||||||
|
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
|
||||||
|
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE;
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[0] |=
|
||||||
|
u8_encode_bits(u8_get_bits(sts - 1, BIT(0)),
|
||||||
|
IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK);
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[1] =
|
||||||
|
u8_encode_bits(u8_get_bits(sts - 1, GENMASK(2, 1)),
|
||||||
|
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK) |
|
||||||
|
u8_encode_bits(sts - 1,
|
||||||
|
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK) |
|
||||||
|
u8_encode_bits(sts - 1,
|
||||||
|
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK);
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[2] =
|
||||||
|
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK) |
|
||||||
|
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK) |
|
||||||
|
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK);
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[3] =
|
||||||
|
IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
|
||||||
|
IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
|
||||||
|
IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
|
||||||
|
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
|
||||||
|
IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
|
||||||
|
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
|
||||||
|
IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[4] =
|
||||||
|
u8_encode_bits(min_t(int, sts - 1, 2),
|
||||||
|
IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK);
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[5] =
|
||||||
|
IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
|
||||||
|
u8_encode_bits(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US,
|
||||||
|
IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK) |
|
||||||
|
u8_encode_bits(u8_get_bits(0x11, GENMASK(1, 0)),
|
||||||
|
IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK);
|
||||||
|
|
||||||
|
val = width == NL80211_CHAN_WIDTH_320 ? 0xf :
|
||||||
|
width == NL80211_CHAN_WIDTH_160 ? 0x7 :
|
||||||
|
width == NL80211_CHAN_WIDTH_80 ? 0x3 : 0x1;
|
||||||
|
eht_cap_elem->phy_cap_info[6] =
|
||||||
|
u8_encode_bits(u8_get_bits(0x11, GENMASK(4, 2)),
|
||||||
|
IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK) |
|
||||||
|
u8_encode_bits(val, IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK);
|
||||||
|
|
||||||
|
eht_cap_elem->phy_cap_info[7] =
|
||||||
|
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
|
||||||
|
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
|
||||||
|
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
|
||||||
|
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
|
||||||
|
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
|
||||||
|
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
|
||||||
|
|
||||||
|
val = u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_RX) |
|
||||||
|
u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_TX);
|
||||||
|
#define SET_EHT_MAX_NSS(_bw, _val) do { \
|
||||||
|
eht_nss->bw._##_bw.rx_tx_mcs9_max_nss = _val; \
|
||||||
|
eht_nss->bw._##_bw.rx_tx_mcs11_max_nss = _val; \
|
||||||
|
eht_nss->bw._##_bw.rx_tx_mcs13_max_nss = _val; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
SET_EHT_MAX_NSS(80, val);
|
||||||
|
SET_EHT_MAX_NSS(160, val);
|
||||||
|
SET_EHT_MAX_NSS(320, val);
|
||||||
|
#undef SET_EHT_MAX_NSS
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
__mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy,
|
||||||
|
struct ieee80211_supported_band *sband,
|
||||||
|
enum nl80211_band band)
|
||||||
{
|
{
|
||||||
struct ieee80211_sband_iftype_data *data = phy->iftype[band];
|
struct ieee80211_sband_iftype_data *data = phy->iftype[band];
|
||||||
int i, n = 0;
|
int i, n = 0;
|
||||||
|
@ -720,6 +817,7 @@ __mt7996_set_stream_he_caps(struct mt7996_phy *phy,
|
||||||
|
|
||||||
data[n].types_mask = BIT(i);
|
data[n].types_mask = BIT(i);
|
||||||
mt7996_init_he_caps(phy, band, &data[n], i);
|
mt7996_init_he_caps(phy, band, &data[n], i);
|
||||||
|
mt7996_init_eht_caps(phy, band, &data[n], i);
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
@ -728,19 +826,19 @@ __mt7996_set_stream_he_caps(struct mt7996_phy *phy,
|
||||||
sband->n_iftype_data = n;
|
sband->n_iftype_data = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mt7996_set_stream_he_caps(struct mt7996_phy *phy)
|
void mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy)
|
||||||
{
|
{
|
||||||
if (phy->mt76->cap.has_2ghz)
|
if (phy->mt76->cap.has_2ghz)
|
||||||
__mt7996_set_stream_he_caps(phy, &phy->mt76->sband_2g.sband,
|
__mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_2g.sband,
|
||||||
NL80211_BAND_2GHZ);
|
NL80211_BAND_2GHZ);
|
||||||
|
|
||||||
if (phy->mt76->cap.has_5ghz)
|
if (phy->mt76->cap.has_5ghz)
|
||||||
__mt7996_set_stream_he_caps(phy, &phy->mt76->sband_5g.sband,
|
__mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_5g.sband,
|
||||||
NL80211_BAND_5GHZ);
|
NL80211_BAND_5GHZ);
|
||||||
|
|
||||||
if (phy->mt76->cap.has_6ghz)
|
if (phy->mt76->cap.has_6ghz)
|
||||||
__mt7996_set_stream_he_caps(phy, &phy->mt76->sband_6g.sband,
|
__mt7996_set_stream_he_eht_caps(phy, &phy->mt76->sband_6g.sband,
|
||||||
NL80211_BAND_6GHZ);
|
NL80211_BAND_6GHZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
int mt7996_register_device(struct mt7996_dev *dev)
|
int mt7996_register_device(struct mt7996_dev *dev)
|
||||||
|
|
|
@ -890,7 +890,7 @@ mt7996_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
|
||||||
|
|
||||||
mt76_set_stream_caps(phy->mt76, true);
|
mt76_set_stream_caps(phy->mt76, true);
|
||||||
mt7996_set_stream_vht_txbf_caps(phy);
|
mt7996_set_stream_vht_txbf_caps(phy);
|
||||||
mt7996_set_stream_he_caps(phy);
|
mt7996_set_stream_he_eht_caps(phy);
|
||||||
|
|
||||||
mutex_unlock(&dev->mt76.mutex);
|
mutex_unlock(&dev->mt76.mutex);
|
||||||
|
|
||||||
|
|
|
@ -514,7 +514,7 @@ void mt7996_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps);
|
||||||
void mt7996_stats_work(struct work_struct *work);
|
void mt7996_stats_work(struct work_struct *work);
|
||||||
int mt76_dfs_start_rdd(struct mt7996_dev *dev, bool force);
|
int mt76_dfs_start_rdd(struct mt7996_dev *dev, bool force);
|
||||||
int mt7996_dfs_init_radar_detector(struct mt7996_phy *phy);
|
int mt7996_dfs_init_radar_detector(struct mt7996_phy *phy);
|
||||||
void mt7996_set_stream_he_caps(struct mt7996_phy *phy);
|
void mt7996_set_stream_he_eht_caps(struct mt7996_phy *phy);
|
||||||
void mt7996_set_stream_vht_txbf_caps(struct mt7996_phy *phy);
|
void mt7996_set_stream_vht_txbf_caps(struct mt7996_phy *phy);
|
||||||
void mt7996_update_channel(struct mt76_phy *mphy);
|
void mt7996_update_channel(struct mt76_phy *mphy);
|
||||||
int mt7996_init_debugfs(struct mt7996_phy *phy);
|
int mt7996_init_debugfs(struct mt7996_phy *phy);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user