mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02:00
wifi: ath12k: add EHT PHY modes
Add support to retrieve and configure the phy modes supported by the hardware. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1 Signed-off-by: Muna Sinada <quic_msinada@quicinc.com> Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://lore.kernel.org/r/20230725224034.14045-6-quic_alokad@quicinc.com
This commit is contained in:
parent
dbe90679bf
commit
38013653a6
|
|
@ -182,32 +182,35 @@ ath12k_phymodes[NUM_NL80211_BANDS][ATH12K_CHAN_WIDTH_NUM] = {
|
|||
[NL80211_BAND_2GHZ] = {
|
||||
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20_2G,
|
||||
[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20_2G,
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40_2G,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80_2G,
|
||||
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20_2G,
|
||||
[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20_2G,
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40_2G,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_80P80] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_320] = MODE_UNKNOWN,
|
||||
},
|
||||
[NL80211_BAND_5GHZ] = {
|
||||
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
|
||||
[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
|
||||
[NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
|
||||
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
|
||||
[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
|
||||
[NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
|
||||
[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
|
||||
},
|
||||
[NL80211_BAND_6GHZ] = {
|
||||
[NL80211_CHAN_WIDTH_5] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_10] = MODE_UNKNOWN,
|
||||
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11AX_HE20,
|
||||
[NL80211_CHAN_WIDTH_20] = MODE_11AX_HE20,
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11AX_HE40,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11AX_HE80,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_11AX_HE160,
|
||||
[NL80211_CHAN_WIDTH_80P80] = MODE_11AX_HE80_80,
|
||||
[NL80211_CHAN_WIDTH_20_NOHT] = MODE_11BE_EHT20,
|
||||
[NL80211_CHAN_WIDTH_20] = MODE_11BE_EHT20,
|
||||
[NL80211_CHAN_WIDTH_40] = MODE_11BE_EHT40,
|
||||
[NL80211_CHAN_WIDTH_80] = MODE_11BE_EHT80,
|
||||
[NL80211_CHAN_WIDTH_160] = MODE_11BE_EHT160,
|
||||
[NL80211_CHAN_WIDTH_80P80] = MODE_11BE_EHT80_80,
|
||||
[NL80211_CHAN_WIDTH_320] = MODE_11BE_EHT320,
|
||||
},
|
||||
|
||||
};
|
||||
|
|
@ -292,6 +295,24 @@ static const char *ath12k_mac_phymode_str(enum wmi_phy_mode mode)
|
|||
return "11ax-he40-2g";
|
||||
case MODE_11AX_HE80_2G:
|
||||
return "11ax-he80-2g";
|
||||
case MODE_11BE_EHT20:
|
||||
return "11be-eht20";
|
||||
case MODE_11BE_EHT40:
|
||||
return "11be-eht40";
|
||||
case MODE_11BE_EHT80:
|
||||
return "11be-eht80";
|
||||
case MODE_11BE_EHT80_80:
|
||||
return "11be-eht80+80";
|
||||
case MODE_11BE_EHT160:
|
||||
return "11be-eht160";
|
||||
case MODE_11BE_EHT160_160:
|
||||
return "11be-eht160+160";
|
||||
case MODE_11BE_EHT320:
|
||||
return "11be-eht320";
|
||||
case MODE_11BE_EHT20_2G:
|
||||
return "11be-eht20-2g";
|
||||
case MODE_11BE_EHT40_2G:
|
||||
return "11be-eht40-2g";
|
||||
case MODE_UNKNOWN:
|
||||
/* skip */
|
||||
break;
|
||||
|
|
@ -1929,6 +1950,41 @@ static enum wmi_phy_mode ath12k_mac_get_phymode_he(struct ath12k *ar,
|
|||
return MODE_UNKNOWN;
|
||||
}
|
||||
|
||||
static enum wmi_phy_mode ath12k_mac_get_phymode_eht(struct ath12k *ar,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_320)
|
||||
if (sta->deflink.eht_cap.eht_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
|
||||
return MODE_11BE_EHT320;
|
||||
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_160) {
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
|
||||
return MODE_11BE_EHT160;
|
||||
|
||||
if (sta->deflink.he_cap.he_cap_elem.phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
return MODE_11BE_EHT80_80;
|
||||
|
||||
ath12k_warn(ar->ab, "invalid EHT PHY capability info for 160 Mhz: %d\n",
|
||||
sta->deflink.he_cap.he_cap_elem.phy_cap_info[0]);
|
||||
|
||||
return MODE_11BE_EHT160;
|
||||
}
|
||||
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
return MODE_11BE_EHT80;
|
||||
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
return MODE_11BE_EHT40;
|
||||
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_20)
|
||||
return MODE_11BE_EHT20;
|
||||
|
||||
return MODE_UNKNOWN;
|
||||
}
|
||||
|
||||
static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
|
|
@ -1950,7 +2006,12 @@ static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
|
|||
|
||||
switch (band) {
|
||||
case NL80211_BAND_2GHZ:
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
if (sta->deflink.eht_cap.has_eht) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
phymode = MODE_11BE_EHT40_2G;
|
||||
else
|
||||
phymode = MODE_11BE_EHT20_2G;
|
||||
} else if (sta->deflink.he_cap.has_he) {
|
||||
if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_80)
|
||||
phymode = MODE_11AX_HE80_2G;
|
||||
else if (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_40)
|
||||
|
|
@ -1977,8 +2038,10 @@ static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
|
|||
break;
|
||||
case NL80211_BAND_5GHZ:
|
||||
case NL80211_BAND_6GHZ:
|
||||
/* Check HE first */
|
||||
if (sta->deflink.he_cap.has_he) {
|
||||
/* Check EHT first */
|
||||
if (sta->deflink.eht_cap.has_eht) {
|
||||
phymode = ath12k_mac_get_phymode_eht(ar, sta);
|
||||
} else if (sta->deflink.he_cap.has_he) {
|
||||
phymode = ath12k_mac_get_phymode_he(ar, sta);
|
||||
} else if (sta->deflink.vht_cap.vht_supported &&
|
||||
!ath12k_peer_assoc_h_vht_masked(vht_mcs_mask)) {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ struct ath12k_generic_iter {
|
|||
#define IEEE80211_VHT_MCS_SUPPORT_0_11_MASK GENMASK(23, 16)
|
||||
#define IEEE80211_DISABLE_VHT_MCS_SUPPORT_0_11 BIT(24)
|
||||
|
||||
#define ATH12K_CHAN_WIDTH_NUM 8
|
||||
#define ATH12K_CHAN_WIDTH_NUM 14
|
||||
|
||||
#define ATH12K_TX_POWER_MAX_VAL 70
|
||||
#define ATH12K_TX_POWER_MIN_VAL 0
|
||||
|
|
|
|||
|
|
@ -2796,8 +2796,17 @@ enum wmi_phy_mode {
|
|||
MODE_11AX_HE20_2G = 21,
|
||||
MODE_11AX_HE40_2G = 22,
|
||||
MODE_11AX_HE80_2G = 23,
|
||||
MODE_UNKNOWN = 24,
|
||||
MODE_MAX = 24
|
||||
MODE_11BE_EHT20 = 24,
|
||||
MODE_11BE_EHT40 = 25,
|
||||
MODE_11BE_EHT80 = 26,
|
||||
MODE_11BE_EHT80_80 = 27,
|
||||
MODE_11BE_EHT160 = 28,
|
||||
MODE_11BE_EHT160_160 = 29,
|
||||
MODE_11BE_EHT320 = 30,
|
||||
MODE_11BE_EHT20_2G = 31,
|
||||
MODE_11BE_EHT40_2G = 32,
|
||||
MODE_UNKNOWN = 33,
|
||||
MODE_MAX = 33,
|
||||
};
|
||||
|
||||
struct wmi_vdev_start_req_arg {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user