mt76: mt7921: rely on mt76_connac_mcu common library
Rely on mt76_connac_mcu common library and remove duplicated code Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
ffa1bf9742
commit
67aa27431c
@ -59,6 +59,11 @@ struct mt76_connac_pm {
|
||||
|
||||
extern const struct wiphy_wowlan_support mt76_connac_wowlan_support;
|
||||
|
||||
static inline bool is_mt7921(struct mt76_dev *dev)
|
||||
{
|
||||
return mt76_chip(dev) == 0x7961;
|
||||
}
|
||||
|
||||
int mt76_connac_pm_wake(struct mt76_phy *phy, struct mt76_connac_pm *pm);
|
||||
void mt76_connac_power_save_sched(struct mt76_phy *phy,
|
||||
struct mt76_connac_pm *pm);
|
||||
|
@ -60,9 +60,15 @@ int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
|
||||
.len = cpu_to_le32(len),
|
||||
.mode = cpu_to_le32(mode),
|
||||
};
|
||||
int cmd;
|
||||
|
||||
return mt76_mcu_send_msg(dev, MCU_CMD_TARGET_ADDRESS_LEN_REQ, &req,
|
||||
sizeof(req), true);
|
||||
if (is_mt7921(dev) &&
|
||||
(req.addr == cpu_to_le32(MCU_PATCH_ADDRESS) || addr == 0x900000))
|
||||
cmd = MCU_CMD_PATCH_START_REQ;
|
||||
else
|
||||
cmd = MCU_CMD_TARGET_ADDRESS_LEN_REQ;
|
||||
|
||||
return mt76_mcu_send_msg(dev, cmd, &req, sizeof(req), true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_init_download);
|
||||
|
||||
@ -251,11 +257,12 @@ mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
|
||||
struct sta_req_hdr hdr = {
|
||||
.bss_idx = mvif->idx,
|
||||
.muar_idx = wcid ? mvif->omac_idx : 0,
|
||||
.wlan_idx_lo = wcid ? wcid->idx : 0,
|
||||
.is_tlv_append = 1,
|
||||
};
|
||||
struct sk_buff *skb;
|
||||
|
||||
mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
|
||||
&hdr.wlan_idx_hi);
|
||||
skb = mt76_mcu_msg_alloc(dev, NULL, MT76_CONNAC_STA_UPDATE_MAX_SIZE);
|
||||
if (!skb)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@ -272,11 +279,12 @@ mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid,
|
||||
{
|
||||
struct tlv *sta_hdr = sta_wtbl;
|
||||
struct wtbl_req_hdr hdr = {
|
||||
.wlan_idx_lo = wcid ? wcid->idx : 0,
|
||||
.operation = cmd,
|
||||
};
|
||||
struct sk_buff *nskb = *skb;
|
||||
|
||||
mt76_connac_mcu_get_wlan_idx(dev, wcid, &hdr.wlan_idx_lo,
|
||||
&hdr.wlan_idx_hi);
|
||||
if (!nskb) {
|
||||
nskb = mt76_mcu_msg_alloc(dev, NULL,
|
||||
MT76_CONNAC_WTBL_UPDATE_BA_SIZE);
|
||||
@ -411,7 +419,13 @@ void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
|
||||
generic->muar_idx = mvif->omac_idx;
|
||||
generic->qos = sta->wme;
|
||||
} else {
|
||||
eth_broadcast_addr(generic->peer_addr);
|
||||
if (is_mt7921(dev) &&
|
||||
vif->type == NL80211_IFTYPE_STATION)
|
||||
memcpy(generic->peer_addr, vif->bss_conf.bssid,
|
||||
ETH_ALEN);
|
||||
else
|
||||
eth_broadcast_addr(generic->peer_addr);
|
||||
|
||||
generic->muar_idx = 0xe;
|
||||
}
|
||||
|
||||
@ -423,6 +437,9 @@ void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
|
||||
rx->rca2 = 1;
|
||||
rx->rv = 1;
|
||||
|
||||
if (is_mt7921(dev))
|
||||
return;
|
||||
|
||||
tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_SPE, sizeof(*spe),
|
||||
wtbl_tlv, sta_wtbl);
|
||||
spe = (struct wtbl_spe *)tlv;
|
||||
@ -430,10 +447,222 @@ void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_generic_tlv);
|
||||
|
||||
static void
|
||||
mt76_connac_mcu_sta_amsdu_tlv(struct sk_buff *skb, struct ieee80211_sta *sta,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
|
||||
struct sta_rec_amsdu *amsdu;
|
||||
struct tlv *tlv;
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_AP &&
|
||||
vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
if (!sta->max_amsdu_len)
|
||||
return;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HW_AMSDU, sizeof(*amsdu));
|
||||
amsdu = (struct sta_rec_amsdu *)tlv;
|
||||
amsdu->max_amsdu_num = 8;
|
||||
amsdu->amsdu_en = true;
|
||||
amsdu->max_mpdu_size = sta->max_amsdu_len >=
|
||||
IEEE80211_MAX_MPDU_LEN_VHT_7991;
|
||||
|
||||
wcid->amsdu = true;
|
||||
}
|
||||
|
||||
#define HE_PHY(p, c) u8_get_bits(c, IEEE80211_HE_PHY_##p)
|
||||
#define HE_MAC(m, c) u8_get_bits(c, IEEE80211_HE_MAC_##m)
|
||||
static void
|
||||
mt76_connac_mcu_sta_he_tlv(struct sk_buff *skb, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_he_cap *he_cap = &sta->he_cap;
|
||||
struct ieee80211_he_cap_elem *elem = &he_cap->he_cap_elem;
|
||||
struct sta_rec_he *he;
|
||||
struct tlv *tlv;
|
||||
u32 cap = 0;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_HE, sizeof(*he));
|
||||
|
||||
he = (struct sta_rec_he *)tlv;
|
||||
|
||||
if (elem->mac_cap_info[0] & IEEE80211_HE_MAC_CAP0_HTC_HE)
|
||||
cap |= STA_REC_HE_CAP_HTC;
|
||||
|
||||
if (elem->mac_cap_info[2] & IEEE80211_HE_MAC_CAP2_BSR)
|
||||
cap |= STA_REC_HE_CAP_BSR;
|
||||
|
||||
if (elem->mac_cap_info[3] & IEEE80211_HE_MAC_CAP3_OMI_CONTROL)
|
||||
cap |= STA_REC_HE_CAP_OM;
|
||||
|
||||
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_AMDSU_IN_AMPDU)
|
||||
cap |= STA_REC_HE_CAP_AMSDU_IN_AMPDU;
|
||||
|
||||
if (elem->mac_cap_info[4] & IEEE80211_HE_MAC_CAP4_BQR)
|
||||
cap |= STA_REC_HE_CAP_BQR;
|
||||
|
||||
if (elem->phy_cap_info[0] &
|
||||
(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G))
|
||||
cap |= STA_REC_HE_CAP_BW20_RU242_SUPPORT;
|
||||
|
||||
if (elem->phy_cap_info[1] &
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD)
|
||||
cap |= STA_REC_HE_CAP_LDPC;
|
||||
|
||||
if (elem->phy_cap_info[1] &
|
||||
IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US)
|
||||
cap |= STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI;
|
||||
|
||||
if (elem->phy_cap_info[2] &
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US)
|
||||
cap |= STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI;
|
||||
|
||||
if (elem->phy_cap_info[2] &
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ)
|
||||
cap |= STA_REC_HE_CAP_LE_EQ_80M_TX_STBC;
|
||||
|
||||
if (elem->phy_cap_info[2] &
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ)
|
||||
cap |= STA_REC_HE_CAP_LE_EQ_80M_RX_STBC;
|
||||
|
||||
if (elem->phy_cap_info[6] &
|
||||
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE)
|
||||
cap |= STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE;
|
||||
|
||||
if (elem->phy_cap_info[7] &
|
||||
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI)
|
||||
cap |= STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI;
|
||||
|
||||
if (elem->phy_cap_info[7] &
|
||||
IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ)
|
||||
cap |= STA_REC_HE_CAP_GT_80M_TX_STBC;
|
||||
|
||||
if (elem->phy_cap_info[7] &
|
||||
IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ)
|
||||
cap |= STA_REC_HE_CAP_GT_80M_RX_STBC;
|
||||
|
||||
if (elem->phy_cap_info[8] &
|
||||
IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI)
|
||||
cap |= STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI;
|
||||
|
||||
if (elem->phy_cap_info[8] &
|
||||
IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI)
|
||||
cap |= STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI;
|
||||
|
||||
if (elem->phy_cap_info[9] &
|
||||
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK)
|
||||
cap |= STA_REC_HE_CAP_TRIG_CQI_FK;
|
||||
|
||||
if (elem->phy_cap_info[9] &
|
||||
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU)
|
||||
cap |= STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242;
|
||||
|
||||
if (elem->phy_cap_info[9] &
|
||||
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU)
|
||||
cap |= STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242;
|
||||
|
||||
he->he_cap = cpu_to_le32(cap);
|
||||
|
||||
switch (sta->bandwidth) {
|
||||
case IEEE80211_STA_RX_BW_160:
|
||||
if (elem->phy_cap_info[0] &
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
|
||||
he->max_nss_mcs[CMD_HE_MCS_BW8080] =
|
||||
he_cap->he_mcs_nss_supp.rx_mcs_80p80;
|
||||
|
||||
he->max_nss_mcs[CMD_HE_MCS_BW160] =
|
||||
he_cap->he_mcs_nss_supp.rx_mcs_160;
|
||||
fallthrough;
|
||||
default:
|
||||
he->max_nss_mcs[CMD_HE_MCS_BW80] =
|
||||
he_cap->he_mcs_nss_supp.rx_mcs_80;
|
||||
break;
|
||||
}
|
||||
|
||||
he->t_frame_dur =
|
||||
HE_MAC(CAP1_TF_MAC_PAD_DUR_MASK, elem->mac_cap_info[1]);
|
||||
he->max_ampdu_exp =
|
||||
HE_MAC(CAP3_MAX_AMPDU_LEN_EXP_MASK, elem->mac_cap_info[3]);
|
||||
|
||||
he->bw_set =
|
||||
HE_PHY(CAP0_CHANNEL_WIDTH_SET_MASK, elem->phy_cap_info[0]);
|
||||
he->device_class =
|
||||
HE_PHY(CAP1_DEVICE_CLASS_A, elem->phy_cap_info[1]);
|
||||
he->punc_pream_rx =
|
||||
HE_PHY(CAP1_PREAMBLE_PUNC_RX_MASK, elem->phy_cap_info[1]);
|
||||
|
||||
he->dcm_tx_mode =
|
||||
HE_PHY(CAP3_DCM_MAX_CONST_TX_MASK, elem->phy_cap_info[3]);
|
||||
he->dcm_tx_max_nss =
|
||||
HE_PHY(CAP3_DCM_MAX_TX_NSS_2, elem->phy_cap_info[3]);
|
||||
he->dcm_rx_mode =
|
||||
HE_PHY(CAP3_DCM_MAX_CONST_RX_MASK, elem->phy_cap_info[3]);
|
||||
he->dcm_rx_max_nss =
|
||||
HE_PHY(CAP3_DCM_MAX_RX_NSS_2, elem->phy_cap_info[3]);
|
||||
he->dcm_rx_max_nss =
|
||||
HE_PHY(CAP8_DCM_MAX_RU_MASK, elem->phy_cap_info[8]);
|
||||
|
||||
he->pkt_ext = 2;
|
||||
}
|
||||
|
||||
static u8
|
||||
mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap;
|
||||
const struct ieee80211_sta_he_cap *he_cap;
|
||||
u8 mode = 0;
|
||||
|
||||
if (sta) {
|
||||
ht_cap = &sta->ht_cap;
|
||||
vht_cap = &sta->vht_cap;
|
||||
he_cap = &sta->he_cap;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
sband = mphy->hw->wiphy->bands[band];
|
||||
ht_cap = &sband->ht_cap;
|
||||
vht_cap = &sband->vht_cap;
|
||||
he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
|
||||
}
|
||||
|
||||
if (band == NL80211_BAND_2GHZ) {
|
||||
mode |= PHY_TYPE_BIT_HR_DSSS | PHY_TYPE_BIT_ERP;
|
||||
|
||||
if (ht_cap->ht_supported)
|
||||
mode |= PHY_TYPE_BIT_HT;
|
||||
|
||||
if (he_cap->has_he)
|
||||
mode |= PHY_TYPE_BIT_HE;
|
||||
} else if (band == NL80211_BAND_5GHZ) {
|
||||
mode |= PHY_TYPE_BIT_OFDM;
|
||||
|
||||
if (ht_cap->ht_supported)
|
||||
mode |= PHY_TYPE_BIT_HT;
|
||||
|
||||
if (vht_cap->vht_supported)
|
||||
mode |= PHY_TYPE_BIT_VHT;
|
||||
|
||||
if (he_cap->has_he)
|
||||
mode |= PHY_TYPE_BIT_HE;
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct cfg80211_chan_def *chandef = &mphy->chandef;
|
||||
enum nl80211_band band = chandef->chan->band;
|
||||
struct mt76_dev *dev = mphy->dev;
|
||||
struct sta_rec_ra_info *ra_info;
|
||||
struct sta_rec_state *state;
|
||||
struct sta_rec_phy *phy;
|
||||
struct tlv *tlv;
|
||||
|
||||
/* starec ht */
|
||||
@ -448,9 +677,10 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
/* starec vht */
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
struct sta_rec_vht *vht;
|
||||
int len;
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT,
|
||||
sizeof(*vht) - 4);
|
||||
len = is_mt7921(dev) ? sizeof(*vht) : sizeof(*vht) - 4;
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_VHT, len);
|
||||
vht = (struct sta_rec_vht *)tlv;
|
||||
vht->vht_cap = cpu_to_le32(sta->vht_cap.cap);
|
||||
vht->vht_rx_mcs_map = sta->vht_cap.vht_mcs.rx_mcs_map;
|
||||
@ -459,6 +689,39 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
|
||||
/* starec uapsd */
|
||||
mt76_connac_mcu_sta_uapsd(skb, vif, sta);
|
||||
|
||||
if (!is_mt7921(dev))
|
||||
return;
|
||||
|
||||
if (sta->ht_cap.ht_supported)
|
||||
mt76_connac_mcu_sta_amsdu_tlv(skb, sta, vif);
|
||||
|
||||
/* starec he */
|
||||
if (sta->he_cap.has_he)
|
||||
mt76_connac_mcu_sta_he_tlv(skb, sta);
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
|
||||
phy = (struct sta_rec_phy *)tlv;
|
||||
phy->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band, sta);
|
||||
phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra_info));
|
||||
ra_info = (struct sta_rec_ra_info *)tlv;
|
||||
ra_info->legacy = cpu_to_le16((u16)sta->supp_rates[band]);
|
||||
|
||||
if (sta->ht_cap.ht_supported)
|
||||
memcpy(ra_info->rx_mcs_bitmask, sta->ht_cap.mcs.rx_mask,
|
||||
HT_MCS_MASK_NUM);
|
||||
|
||||
tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_STATE, sizeof(*state));
|
||||
state = (struct sta_rec_state *)tlv;
|
||||
state->state = 2;
|
||||
|
||||
if (sta->vht_cap.vht_supported) {
|
||||
state->vht_opmode = sta->bandwidth;
|
||||
state->vht_opmode |= (sta->rx_nss - 1) <<
|
||||
IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_tlv);
|
||||
|
||||
@ -514,7 +777,7 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
|
||||
mt76_connac_mcu_wtbl_smps_tlv(skb, sta, sta_wtbl, wtbl_tlv);
|
||||
|
||||
if (sta->ht_cap.ht_supported) {
|
||||
if (!is_mt7921(dev) && sta->ht_cap.ht_supported) {
|
||||
/* sgi */
|
||||
u32 msk = MT_WTBL_W5_SHORT_GI_20 | MT_WTBL_W5_SHORT_GI_40 |
|
||||
MT_WTBL_W5_SHORT_GI_80 | MT_WTBL_W5_SHORT_GI_160;
|
||||
@ -609,6 +872,9 @@ void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
ba->rst_ba_sb = 1;
|
||||
}
|
||||
|
||||
if (is_mt7921(dev))
|
||||
return;
|
||||
|
||||
if (enable && tx) {
|
||||
u8 ba_range[] = { 4, 8, 12, 24, 36, 48, 54, 64 };
|
||||
int i;
|
||||
@ -774,6 +1040,57 @@ int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
|
||||
|
||||
static u8
|
||||
mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
const struct ieee80211_sta_he_cap *he_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap;
|
||||
struct ieee80211_sta_ht_cap *ht_cap;
|
||||
u8 mode = 0;
|
||||
|
||||
if (!is_mt7921(dev))
|
||||
return 0x38;
|
||||
|
||||
if (sta) {
|
||||
ht_cap = &sta->ht_cap;
|
||||
vht_cap = &sta->vht_cap;
|
||||
he_cap = &sta->he_cap;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
sband = phy->hw->wiphy->bands[band];
|
||||
ht_cap = &sband->ht_cap;
|
||||
vht_cap = &sband->vht_cap;
|
||||
he_cap = ieee80211_get_he_iftype_cap(sband, vif->type);
|
||||
}
|
||||
|
||||
if (band == NL80211_BAND_2GHZ) {
|
||||
mode |= PHY_MODE_B | PHY_MODE_G;
|
||||
|
||||
if (ht_cap->ht_supported)
|
||||
mode |= PHY_MODE_GN;
|
||||
|
||||
if (he_cap->has_he)
|
||||
mode |= PHY_MODE_AX_24G;
|
||||
} else if (band == NL80211_BAND_5GHZ) {
|
||||
mode |= PHY_MODE_A;
|
||||
|
||||
if (ht_cap->ht_supported)
|
||||
mode |= PHY_MODE_AN;
|
||||
|
||||
if (vht_cap->vht_supported)
|
||||
mode |= PHY_MODE_AC;
|
||||
|
||||
if (he_cap->has_he)
|
||||
mode |= PHY_MODE_AX_5G;
|
||||
}
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static const struct ieee80211_sta_he_cap *
|
||||
mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif)
|
||||
{
|
||||
@ -818,6 +1135,7 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
|
||||
struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
|
||||
struct cfg80211_chan_def *chandef = &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 {
|
||||
@ -839,7 +1157,7 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
|
||||
.band_idx = mvif->band_idx,
|
||||
.wmm_idx = mvif->wmm_idx,
|
||||
.active = true, /* keep bss deactivated */
|
||||
.phymode = 0x38,
|
||||
.phymode = mt76_connac_get_phy_mode(phy, vif, band, NULL),
|
||||
},
|
||||
.qos = {
|
||||
.tag = cpu_to_le16(UNI_BSS_INFO_QBSS),
|
||||
|
@ -561,6 +561,8 @@ enum {
|
||||
MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
|
||||
MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0,
|
||||
MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0,
|
||||
MCU_CMD_FWLOG_2_HOST = MCU_CE_PREFIX | 0xc5,
|
||||
MCU_CMD_GET_WTBL = MCU_CE_PREFIX | 0xcd,
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -575,6 +577,8 @@ enum {
|
||||
UNI_BSS_INFO_BCN_CONTENT = 7,
|
||||
UNI_BSS_INFO_QBSS = 15,
|
||||
UNI_BSS_INFO_UAPSD = 19,
|
||||
UNI_BSS_INFO_PS = 21,
|
||||
UNI_BSS_INFO_BCNFT = 22,
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -871,6 +875,23 @@ struct mt76_connac_suspend_tlv {
|
||||
u8 pad[5];
|
||||
} __packed;
|
||||
|
||||
#define to_wcid_lo(id) FIELD_GET(GENMASK(7, 0), (u16)id)
|
||||
#define to_wcid_hi(id) FIELD_GET(GENMASK(9, 8), (u16)id)
|
||||
|
||||
static inline void
|
||||
mt76_connac_mcu_get_wlan_idx(struct mt76_dev *dev, struct mt76_wcid *wcid,
|
||||
u8 *wlan_idx_lo, u8 *wlan_idx_hi)
|
||||
{
|
||||
*wlan_idx_hi = 0;
|
||||
|
||||
if (is_mt7921(dev)) {
|
||||
*wlan_idx_lo = wcid ? to_wcid_lo(wcid->idx) : 0;
|
||||
*wlan_idx_hi = wcid ? to_wcid_hi(wcid->idx) : 0;
|
||||
} else {
|
||||
*wlan_idx_lo = wcid ? wcid->idx : 0;
|
||||
}
|
||||
}
|
||||
|
||||
struct sk_buff *
|
||||
mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
|
||||
struct mt76_wcid *wcid);
|
||||
|
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: ISC
|
||||
config MT7921E
|
||||
tristate "MediaTek MT7921E (PCIe) support"
|
||||
select MT76_CORE
|
||||
select MT76_CONNAC_LIB
|
||||
depends on MAC80211
|
||||
depends on PCI
|
||||
help
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include "mt7921.h"
|
||||
#include "mac.h"
|
||||
#include "mcu.h"
|
||||
#include "eeprom.h"
|
||||
|
||||
#define CCK_RATE(_idx, _rate) { \
|
||||
@ -139,7 +140,7 @@ static void mt7921_mac_init(struct mt7921_dev *dev)
|
||||
for (i = 0; i < 2; i++)
|
||||
mt7921_mac_init_band(dev, i);
|
||||
|
||||
mt7921_mcu_set_rts_thresh(&dev->phy, 0x92b);
|
||||
mt76_connac_mcu_set_rts_thresh(&dev->mt76, 0x92b, 0);
|
||||
}
|
||||
|
||||
static void mt7921_init_work(struct work_struct *work)
|
||||
|
@ -176,8 +176,9 @@ static int mt7921_start(struct ieee80211_hw *hw)
|
||||
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
|
||||
mt7921_mcu_set_mac(dev, 0, true, false);
|
||||
mt7921_mcu_set_channel_domain(phy);
|
||||
mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, true, false);
|
||||
mt76_connac_mcu_set_channel_domain(phy->mt76);
|
||||
|
||||
mt7921_mcu_set_chan_info(phy, MCU_EXT_CMD_SET_RX_PATH);
|
||||
mt7921_mac_reset_counters(phy);
|
||||
set_bit(MT76_STATE_RUNNING, &phy->mt76->state);
|
||||
@ -199,7 +200,7 @@ static void mt7921_stop(struct ieee80211_hw *hw)
|
||||
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
clear_bit(MT76_STATE_RUNNING, &phy->mt76->state);
|
||||
mt7921_mcu_set_mac(dev, 0, false, false);
|
||||
mt76_connac_mcu_set_mac_enable(&dev->mt76, 0, false, false);
|
||||
mutex_unlock(&dev->mt76.mutex);
|
||||
}
|
||||
|
||||
@ -285,7 +286,8 @@ static int mt7921_add_interface(struct ieee80211_hw *hw,
|
||||
mvif->mt76.band_idx = 0;
|
||||
mvif->mt76.wmm_idx = mvif->mt76.idx % MT7921_MAX_WMM_SETS;
|
||||
|
||||
ret = mt7921_mcu_uni_add_dev(dev, vif, true);
|
||||
ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid,
|
||||
true);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
@ -333,7 +335,7 @@ static void mt7921_remove_interface(struct ieee80211_hw *hw,
|
||||
if (vif == phy->monitor_vif)
|
||||
phy->monitor_vif = NULL;
|
||||
|
||||
mt7921_mcu_uni_add_dev(dev, vif, false);
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, false);
|
||||
|
||||
rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
|
||||
|
||||
@ -589,11 +591,14 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
msta->stats.jiffies = jiffies;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
|
||||
mt7921_mcu_uni_add_bss(&dev->phy, vif, true);
|
||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
|
||||
true);
|
||||
|
||||
mt7921_mac_wtbl_update(dev, idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
|
||||
ret = mt7921_mcu_uni_add_sta(dev, vif, sta, true);
|
||||
ret = mt76_connac_mcu_add_sta_cmd(&dev->mphy, vif, sta, &msta->wcid,
|
||||
true, MCU_UNI_CMD_STA_REC_UPDATE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@ -606,11 +611,17 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
|
||||
struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;
|
||||
|
||||
mt7921_mcu_uni_add_sta(dev, vif, sta, false);
|
||||
mt76_connac_mcu_add_sta_cmd(&dev->mphy, vif, sta, &msta->wcid, false,
|
||||
MCU_UNI_CMD_STA_REC_UPDATE);
|
||||
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
|
||||
mt7921_mcu_uni_add_bss(&dev->phy, vif, false);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
|
||||
struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
|
||||
|
||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
|
||||
false);
|
||||
}
|
||||
|
||||
spin_lock_bh(&dev->sta_poll_lock);
|
||||
if (!list_empty(&msta->poll_list))
|
||||
@ -650,10 +661,9 @@ static void mt7921_tx(struct ieee80211_hw *hw,
|
||||
static int mt7921_set_rts_threshold(struct ieee80211_hw *hw, u32 val)
|
||||
{
|
||||
struct mt7921_dev *dev = mt7921_hw_dev(hw);
|
||||
struct mt7921_phy *phy = mt7921_hw_phy(hw);
|
||||
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
mt7921_mcu_set_rts_thresh(phy, val);
|
||||
mt76_connac_mcu_set_rts_thresh(&dev->mt76, val, 0);
|
||||
mutex_unlock(&dev->mt76.mutex);
|
||||
|
||||
return 0;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -4,6 +4,8 @@
|
||||
#ifndef __MT7921_MCU_H
|
||||
#define __MT7921_MCU_H
|
||||
|
||||
#include "../mt76_connac_mcu.h"
|
||||
|
||||
struct mt7921_mcu_txd {
|
||||
__le32 txd[8];
|
||||
|
||||
@ -134,60 +136,12 @@ enum {
|
||||
MCU_S2D_H2CN
|
||||
};
|
||||
|
||||
#define MCU_FW_PREFIX BIT(31)
|
||||
#define MCU_UNI_PREFIX BIT(30)
|
||||
#define MCU_CE_PREFIX BIT(29)
|
||||
#define MCU_QUERY_PREFIX BIT(28)
|
||||
#define MCU_CMD_MASK ~(MCU_FW_PREFIX | MCU_UNI_PREFIX | \
|
||||
MCU_CE_PREFIX | MCU_QUERY_PREFIX)
|
||||
|
||||
#define MCU_QUERY_MASK BIT(16)
|
||||
|
||||
enum {
|
||||
MCU_CMD_TARGET_ADDRESS_LEN_REQ = MCU_FW_PREFIX | 0x01,
|
||||
MCU_CMD_FW_START_REQ = MCU_FW_PREFIX | 0x02,
|
||||
MCU_CMD_NIC_POWER_CTRL = MCU_FW_PREFIX | 0x4,
|
||||
MCU_CMD_PATCH_START_REQ = MCU_FW_PREFIX | 0x05,
|
||||
MCU_CMD_PATCH_FINISH_REQ = MCU_FW_PREFIX | 0x07,
|
||||
MCU_CMD_PATCH_SEM_CONTROL = MCU_FW_PREFIX | 0x10,
|
||||
MCU_CMD_EXT_CID = 0xED,
|
||||
MCU_CMD_FW_SCATTER = MCU_FW_PREFIX | 0xEE,
|
||||
};
|
||||
|
||||
enum {
|
||||
MCU_EXT_CMD_EFUSE_ACCESS = 0x01,
|
||||
MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
|
||||
MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
|
||||
MCU_EXT_CMD_EDCA_UPDATE = 0x27,
|
||||
MCU_EXT_CMD_THERMAL_CTRL = 0x2c,
|
||||
MCU_EXT_CMD_WTBL_UPDATE = 0x32,
|
||||
MCU_EXT_CMD_PROTECT_CTRL = 0x3e,
|
||||
MCU_EXT_CMD_MAC_INIT_CTRL = 0x46,
|
||||
MCU_EXT_CMD_RX_HDR_TRANS = 0x47,
|
||||
MCU_EXT_CMD_SET_RX_PATH = 0x4e,
|
||||
};
|
||||
|
||||
enum {
|
||||
MCU_UNI_CMD_DEV_INFO_UPDATE = MCU_UNI_PREFIX | 0x01,
|
||||
MCU_UNI_CMD_BSS_INFO_UPDATE = MCU_UNI_PREFIX | 0x02,
|
||||
MCU_UNI_CMD_STA_REC_UPDATE = MCU_UNI_PREFIX | 0x03,
|
||||
MCU_UNI_CMD_SUSPEND = MCU_UNI_PREFIX | 0x05,
|
||||
MCU_UNI_CMD_OFFLOAD = MCU_UNI_PREFIX | 0x06,
|
||||
MCU_UNI_CMD_HIF_CTRL = MCU_UNI_PREFIX | 0x07,
|
||||
};
|
||||
|
||||
struct mt7921_mcu_uni_event {
|
||||
u8 cid;
|
||||
u8 pad[3];
|
||||
__le32 status; /* 0: success, others: fail */
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
WOW_USB = 1,
|
||||
WOW_PCIE = 2,
|
||||
WOW_GPIO = 3,
|
||||
};
|
||||
|
||||
struct mt7921_wow_ctrl_tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
@ -281,58 +235,6 @@ struct mt7921_arpns_tlv {
|
||||
u8 pad[1];
|
||||
} __packed;
|
||||
|
||||
/* offload mcu commands */
|
||||
enum {
|
||||
MCU_CMD_START_HW_SCAN = MCU_CE_PREFIX | 0x03,
|
||||
MCU_CMD_SET_CHAN_DOMAIN = MCU_CE_PREFIX | 0x0f,
|
||||
MCU_CMD_SET_BSS_CONNECTED = MCU_CE_PREFIX | 0x16,
|
||||
MCU_CMD_SET_BSS_ABORT = MCU_CE_PREFIX | 0x17,
|
||||
MCU_CMD_CANCEL_HW_SCAN = MCU_CE_PREFIX | 0x1b,
|
||||
MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61,
|
||||
MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
|
||||
MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0,
|
||||
MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0,
|
||||
MCU_CMD_FWLOG_2_HOST = MCU_CE_PREFIX | 0xc5,
|
||||
MCU_CMD_GET_WTBL = MCU_CE_PREFIX | 0xcd,
|
||||
};
|
||||
|
||||
#define MCU_CMD_ACK BIT(0)
|
||||
#define MCU_CMD_UNI BIT(1)
|
||||
#define MCU_CMD_QUERY BIT(2)
|
||||
|
||||
#define MCU_CMD_UNI_EXT_ACK (MCU_CMD_ACK | MCU_CMD_UNI | MCU_CMD_QUERY)
|
||||
|
||||
enum {
|
||||
UNI_BSS_INFO_BASIC = 0,
|
||||
UNI_BSS_INFO_RLM = 2,
|
||||
UNI_BSS_INFO_HE_BASIC = 5,
|
||||
UNI_BSS_INFO_BCN_CONTENT = 7,
|
||||
UNI_BSS_INFO_QBSS = 15,
|
||||
UNI_BSS_INFO_UAPSD = 19,
|
||||
UNI_BSS_INFO_PS = 21,
|
||||
UNI_BSS_INFO_BCNFT = 22,
|
||||
};
|
||||
|
||||
enum {
|
||||
UNI_SUSPEND_MODE_SETTING,
|
||||
UNI_SUSPEND_WOW_CTRL,
|
||||
UNI_SUSPEND_WOW_GPIO_PARAM,
|
||||
UNI_SUSPEND_WOW_WAKEUP_PORT,
|
||||
UNI_SUSPEND_WOW_PATTERN,
|
||||
};
|
||||
|
||||
enum {
|
||||
UNI_OFFLOAD_OFFLOAD_ARP,
|
||||
UNI_OFFLOAD_OFFLOAD_ND,
|
||||
UNI_OFFLOAD_OFFLOAD_GTK_REKEY,
|
||||
UNI_OFFLOAD_OFFLOAD_BMC_RPY_DETECT,
|
||||
};
|
||||
|
||||
enum {
|
||||
PATCH_SEM_RELEASE,
|
||||
PATCH_SEM_GET
|
||||
};
|
||||
|
||||
enum {
|
||||
PATCH_NOT_DL_SEM_FAIL,
|
||||
PATCH_IS_DL,
|
||||
@ -386,273 +288,6 @@ enum {
|
||||
#define CONNECTION_WDS (STA_TYPE_WDS | NETWORK_WDS)
|
||||
#define CONNECTION_INFRA_BC (STA_TYPE_BC | NETWORK_INFRA)
|
||||
|
||||
#define CONN_STATE_DISCONNECT 0
|
||||
#define CONN_STATE_CONNECT 1
|
||||
#define CONN_STATE_PORT_SECURE 2
|
||||
|
||||
enum {
|
||||
DEV_INFO_ACTIVE,
|
||||
DEV_INFO_MAX_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
CMD_CBW_20MHZ = IEEE80211_STA_RX_BW_20,
|
||||
CMD_CBW_40MHZ = IEEE80211_STA_RX_BW_40,
|
||||
CMD_CBW_80MHZ = IEEE80211_STA_RX_BW_80,
|
||||
CMD_CBW_160MHZ = IEEE80211_STA_RX_BW_160,
|
||||
CMD_CBW_10MHZ,
|
||||
CMD_CBW_5MHZ,
|
||||
CMD_CBW_8080MHZ,
|
||||
|
||||
CMD_HE_MCS_BW80 = 0,
|
||||
CMD_HE_MCS_BW160,
|
||||
CMD_HE_MCS_BW8080,
|
||||
CMD_HE_MCS_BW_NUM
|
||||
};
|
||||
|
||||
struct tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
} __packed;
|
||||
|
||||
struct bss_info_uni_he {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le16 he_rts_thres;
|
||||
u8 he_pe_duration;
|
||||
u8 su_disable;
|
||||
__le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
|
||||
u8 rsv[2];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
WTBL_RESET_AND_SET = 1,
|
||||
WTBL_SET,
|
||||
WTBL_QUERY,
|
||||
WTBL_RESET_ALL
|
||||
};
|
||||
|
||||
struct wtbl_req_hdr {
|
||||
u8 wlan_idx_lo;
|
||||
u8 operation;
|
||||
__le16 tlv_num;
|
||||
u8 wlan_idx_hi;
|
||||
u8 rsv[3];
|
||||
} __packed;
|
||||
|
||||
struct wtbl_generic {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 peer_addr[ETH_ALEN];
|
||||
u8 muar_idx;
|
||||
u8 skip_tx;
|
||||
u8 cf_ack;
|
||||
u8 qos;
|
||||
u8 mesh;
|
||||
u8 adm;
|
||||
__le16 partial_aid;
|
||||
u8 baf_en;
|
||||
u8 aad_om;
|
||||
} __packed;
|
||||
|
||||
struct wtbl_rx {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 rcid;
|
||||
u8 rca1;
|
||||
u8 rca2;
|
||||
u8 rv;
|
||||
u8 rsv[4];
|
||||
} __packed;
|
||||
|
||||
struct wtbl_ht {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 ht;
|
||||
u8 ldpc;
|
||||
u8 af;
|
||||
u8 mm;
|
||||
u8 rsv[4];
|
||||
} __packed;
|
||||
|
||||
struct wtbl_vht {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 ldpc;
|
||||
u8 dyn_bw;
|
||||
u8 vht;
|
||||
u8 txop_ps;
|
||||
u8 rsv[4];
|
||||
} __packed;
|
||||
|
||||
struct wtbl_hdr_trans {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 to_ds;
|
||||
u8 from_ds;
|
||||
u8 no_rx_trans;
|
||||
u8 _rsv;
|
||||
};
|
||||
|
||||
enum {
|
||||
MT_BA_TYPE_INVALID,
|
||||
MT_BA_TYPE_ORIGINATOR,
|
||||
MT_BA_TYPE_RECIPIENT
|
||||
};
|
||||
|
||||
enum {
|
||||
RST_BA_MAC_TID_MATCH,
|
||||
RST_BA_MAC_MATCH,
|
||||
RST_BA_NO_MATCH
|
||||
};
|
||||
|
||||
struct wtbl_ba {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
/* common */
|
||||
u8 tid;
|
||||
u8 ba_type;
|
||||
u8 rsv0[2];
|
||||
/* originator only */
|
||||
__le16 sn;
|
||||
u8 ba_en;
|
||||
u8 ba_winsize_idx;
|
||||
__le16 ba_winsize;
|
||||
/* recipient only */
|
||||
u8 peer_addr[ETH_ALEN];
|
||||
u8 rst_ba_tid;
|
||||
u8 rst_ba_sel;
|
||||
u8 rst_ba_sb;
|
||||
u8 band_idx;
|
||||
u8 rsv1[4];
|
||||
} __packed;
|
||||
|
||||
struct wtbl_smps {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 smps;
|
||||
u8 rsv[3];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
WTBL_GENERIC,
|
||||
WTBL_RX,
|
||||
WTBL_HT,
|
||||
WTBL_VHT,
|
||||
WTBL_PEER_PS, /* not used */
|
||||
WTBL_TX_PS,
|
||||
WTBL_HDR_TRANS,
|
||||
WTBL_SEC_KEY,
|
||||
WTBL_BA,
|
||||
WTBL_RDG, /* obsoleted */
|
||||
WTBL_PROTECT, /* not used */
|
||||
WTBL_CLEAR, /* not used */
|
||||
WTBL_BF,
|
||||
WTBL_SMPS,
|
||||
WTBL_RAW_DATA, /* debug only */
|
||||
WTBL_PN,
|
||||
WTBL_SPE,
|
||||
WTBL_MAX_NUM
|
||||
};
|
||||
|
||||
struct sta_ntlv_hdr {
|
||||
u8 rsv[2];
|
||||
__le16 tlv_num;
|
||||
} __packed;
|
||||
|
||||
struct sta_req_hdr {
|
||||
u8 bss_idx;
|
||||
u8 wlan_idx_lo;
|
||||
__le16 tlv_num;
|
||||
u8 is_tlv_append;
|
||||
u8 muar_idx;
|
||||
u8 wlan_idx_hi;
|
||||
u8 rsv;
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_basic {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le32 conn_type;
|
||||
u8 conn_state;
|
||||
u8 qos;
|
||||
__le16 aid;
|
||||
u8 peer_addr[ETH_ALEN];
|
||||
__le16 extra_info;
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_ht {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le16 ht_cap;
|
||||
u16 rsv;
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_vht {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le32 vht_cap;
|
||||
__le16 vht_rx_mcs_map;
|
||||
__le16 vht_tx_mcs_map;
|
||||
u8 rts_bw_sig;
|
||||
u8 rsv[3];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_uapsd {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 dac_map;
|
||||
u8 tac_map;
|
||||
u8 max_sp;
|
||||
u8 rsv0;
|
||||
__le16 listen_interval;
|
||||
u8 rsv1[2];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_he {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
|
||||
__le32 he_cap;
|
||||
|
||||
u8 t_frame_dur;
|
||||
u8 max_ampdu_exp;
|
||||
u8 bw_set;
|
||||
u8 device_class;
|
||||
u8 dcm_tx_mode;
|
||||
u8 dcm_tx_max_nss;
|
||||
u8 dcm_rx_mode;
|
||||
u8 dcm_rx_max_nss;
|
||||
u8 dcm_max_ru;
|
||||
u8 punc_pream_rx;
|
||||
u8 pkt_ext;
|
||||
u8 rsv1;
|
||||
|
||||
__le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
|
||||
|
||||
u8 rsv2[2];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_ba {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 tid;
|
||||
u8 ba_type;
|
||||
u8 amsdu;
|
||||
u8 ba_en;
|
||||
__le16 ssn;
|
||||
__le16 winsize;
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_amsdu {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 max_amsdu_num;
|
||||
u8 max_mpdu_size;
|
||||
u8 amsdu_en;
|
||||
u8 rsv;
|
||||
} __packed;
|
||||
|
||||
struct sec_key {
|
||||
u8 cipher_id;
|
||||
u8 cipher_len;
|
||||
@ -671,62 +306,6 @@ struct sta_rec_sec {
|
||||
struct sec_key key[2];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_state {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le32 flags;
|
||||
u8 state;
|
||||
u8 vht_opmode;
|
||||
u8 action;
|
||||
u8 rsv[1];
|
||||
} __packed;
|
||||
|
||||
#define HT_MCS_MASK_NUM 10
|
||||
|
||||
struct sta_rec_ra_info {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le16 legacy;
|
||||
u8 rx_mcs_bitmask[HT_MCS_MASK_NUM];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_phy {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
__le16 basic_rate;
|
||||
u8 phy_type;
|
||||
u8 ampdu;
|
||||
u8 rts_policy;
|
||||
u8 rcpi;
|
||||
u8 rsv[2];
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
STA_REC_BASIC,
|
||||
STA_REC_RA,
|
||||
STA_REC_RA_CMM_INFO,
|
||||
STA_REC_RA_UPDATE,
|
||||
STA_REC_BF,
|
||||
STA_REC_AMSDU,
|
||||
STA_REC_BA,
|
||||
STA_REC_STATE,
|
||||
STA_REC_TX_PROC, /* for hdr trans and CSO in CR4 */
|
||||
STA_REC_HT,
|
||||
STA_REC_VHT,
|
||||
STA_REC_APPS,
|
||||
STA_REC_KEY,
|
||||
STA_REC_WTBL,
|
||||
STA_REC_HE,
|
||||
STA_REC_HW_AMSDU,
|
||||
STA_REC_WTBL_AADOM,
|
||||
STA_REC_KEY_V2,
|
||||
STA_REC_MURU,
|
||||
STA_REC_MUEDCA,
|
||||
STA_REC_BFEE,
|
||||
STA_REC_PHY = 0x15,
|
||||
STA_REC_MAX_NUM
|
||||
};
|
||||
|
||||
enum mt7921_cipher_type {
|
||||
MT_CIPHER_NONE,
|
||||
MT_CIPHER_WEP40,
|
||||
@ -787,22 +366,6 @@ enum {
|
||||
#define MT7921_WTBL_UPDATE_BA_SIZE (sizeof(struct wtbl_req_hdr) + \
|
||||
sizeof(struct wtbl_ba))
|
||||
|
||||
#define PHY_MODE_A BIT(0)
|
||||
#define PHY_MODE_B BIT(1)
|
||||
#define PHY_MODE_G BIT(2)
|
||||
#define PHY_MODE_GN BIT(3)
|
||||
#define PHY_MODE_AN BIT(4)
|
||||
#define PHY_MODE_AC BIT(5)
|
||||
#define PHY_MODE_AX_24G BIT(6)
|
||||
#define PHY_MODE_AX_5G BIT(7)
|
||||
#define PHY_MODE_AX_6G BIT(8)
|
||||
|
||||
#define MODE_CCK BIT(0)
|
||||
#define MODE_OFDM BIT(1)
|
||||
#define MODE_HT BIT(2)
|
||||
#define MODE_VHT BIT(3)
|
||||
#define MODE_HE BIT(4)
|
||||
|
||||
#define STA_CAP_WMM BIT(0)
|
||||
#define STA_CAP_SGI_20 BIT(4)
|
||||
#define STA_CAP_SGI_40 BIT(5)
|
||||
@ -818,77 +381,11 @@ enum {
|
||||
#define STA_CAP_VHT BIT(27)
|
||||
#define STA_CAP_HE BIT(28)
|
||||
|
||||
/* HE MAC */
|
||||
#define STA_REC_HE_CAP_HTC BIT(0)
|
||||
#define STA_REC_HE_CAP_BQR BIT(1)
|
||||
#define STA_REC_HE_CAP_BSR BIT(2)
|
||||
#define STA_REC_HE_CAP_OM BIT(3)
|
||||
#define STA_REC_HE_CAP_AMSDU_IN_AMPDU BIT(4)
|
||||
/* HE PHY */
|
||||
#define STA_REC_HE_CAP_DUAL_BAND BIT(5)
|
||||
#define STA_REC_HE_CAP_LDPC BIT(6)
|
||||
#define STA_REC_HE_CAP_TRIG_CQI_FK BIT(7)
|
||||
#define STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE BIT(8)
|
||||
/* STBC */
|
||||
#define STA_REC_HE_CAP_LE_EQ_80M_TX_STBC BIT(9)
|
||||
#define STA_REC_HE_CAP_LE_EQ_80M_RX_STBC BIT(10)
|
||||
#define STA_REC_HE_CAP_GT_80M_TX_STBC BIT(11)
|
||||
#define STA_REC_HE_CAP_GT_80M_RX_STBC BIT(12)
|
||||
/* GI */
|
||||
#define STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI BIT(13)
|
||||
#define STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI BIT(14)
|
||||
#define STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI BIT(15)
|
||||
#define STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI BIT(16)
|
||||
#define STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI BIT(17)
|
||||
/* 242 TONE */
|
||||
#define STA_REC_HE_CAP_BW20_RU242_SUPPORT BIT(18)
|
||||
#define STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242 BIT(19)
|
||||
#define STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242 BIT(20)
|
||||
|
||||
struct mt7921_mcu_reg_event {
|
||||
__le32 reg;
|
||||
__le32 val;
|
||||
} __packed;
|
||||
|
||||
struct mt7921_bss_basic_tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 active;
|
||||
u8 omac_idx;
|
||||
u8 hw_bss_idx;
|
||||
u8 band_idx;
|
||||
__le32 conn_type;
|
||||
u8 conn_state;
|
||||
u8 wmm_idx;
|
||||
u8 bssid[ETH_ALEN];
|
||||
__le16 bmc_tx_wlan_idx;
|
||||
__le16 bcn_interval;
|
||||
u8 dtim_period;
|
||||
u8 phymode; /* bit(0): A
|
||||
* bit(1): B
|
||||
* bit(2): G
|
||||
* bit(3): GN
|
||||
* bit(4): AN
|
||||
* bit(5): AC
|
||||
*/
|
||||
__le16 sta_idx;
|
||||
u8 nonht_basic_phy;
|
||||
u8 pad[3];
|
||||
} __packed;
|
||||
|
||||
struct mt7921_bss_qos_tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 qos;
|
||||
u8 pad[3];
|
||||
} __packed;
|
||||
|
||||
struct mt7921_beacon_loss_event {
|
||||
u8 bss_idx;
|
||||
u8 reason;
|
||||
u8 pad[2];
|
||||
} __packed;
|
||||
|
||||
struct mt7921_mcu_scan_ssid {
|
||||
__le32 ssid_len;
|
||||
u8 ssid[IEEE80211_MAX_SSID_LEN];
|
||||
@ -1005,37 +502,6 @@ struct mt7921_sched_scan_req {
|
||||
u8 pad2[64];
|
||||
} __packed;
|
||||
|
||||
struct mt7921_mcu_bss_event {
|
||||
u8 bss_idx;
|
||||
u8 is_absent;
|
||||
u8 free_quota;
|
||||
u8 pad;
|
||||
} __packed;
|
||||
|
||||
enum {
|
||||
PHY_TYPE_HR_DSSS_INDEX = 0,
|
||||
PHY_TYPE_ERP_INDEX,
|
||||
PHY_TYPE_ERP_P2P_INDEX,
|
||||
PHY_TYPE_OFDM_INDEX,
|
||||
PHY_TYPE_HT_INDEX,
|
||||
PHY_TYPE_VHT_INDEX,
|
||||
PHY_TYPE_HE_INDEX,
|
||||
PHY_TYPE_INDEX_NUM
|
||||
};
|
||||
|
||||
#define PHY_TYPE_BIT_HR_DSSS BIT(PHY_TYPE_HR_DSSS_INDEX)
|
||||
#define PHY_TYPE_BIT_ERP BIT(PHY_TYPE_ERP_INDEX)
|
||||
#define PHY_TYPE_BIT_OFDM BIT(PHY_TYPE_OFDM_INDEX)
|
||||
#define PHY_TYPE_BIT_HT BIT(PHY_TYPE_HT_INDEX)
|
||||
#define PHY_TYPE_BIT_VHT BIT(PHY_TYPE_VHT_INDEX)
|
||||
#define PHY_TYPE_BIT_HE BIT(PHY_TYPE_HE_INDEX)
|
||||
|
||||
#define MT_WTBL_RATE_TX_MODE GENMASK(9, 6)
|
||||
#define MT_WTBL_RATE_MCS GENMASK(5, 0)
|
||||
#define MT_WTBL_RATE_NSS GENMASK(12, 10)
|
||||
#define MT_WTBL_RATE_HE_GI GENMASK(7, 4)
|
||||
#define MT_WTBL_RATE_GI GENMASK(3, 0)
|
||||
|
||||
struct mt7921_mcu_tx_config {
|
||||
u8 peer_addr[ETH_ALEN];
|
||||
u8 sw;
|
||||
|
@ -166,20 +166,6 @@ struct mt7921_dev {
|
||||
u8 fw_debug;
|
||||
};
|
||||
|
||||
enum {
|
||||
HW_BSSID_0 = 0x0,
|
||||
HW_BSSID_1,
|
||||
HW_BSSID_2,
|
||||
HW_BSSID_3,
|
||||
HW_BSSID_MAX = HW_BSSID_3,
|
||||
EXT_BSSID_START = 0x10,
|
||||
EXT_BSSID_1,
|
||||
EXT_BSSID_15 = 0x1f,
|
||||
EXT_BSSID_MAX = EXT_BSSID_15,
|
||||
REPEATER_BSSID_START = 0x20,
|
||||
REPEATER_BSSID_MAX = 0x3f,
|
||||
};
|
||||
|
||||
enum {
|
||||
MT_LMAC_AC00,
|
||||
MT_LMAC_AC01,
|
||||
@ -239,18 +225,12 @@ int mt7921_mcu_set_chan_info(struct mt7921_phy *phy, int cmd);
|
||||
int mt7921_mcu_set_tx(struct mt7921_dev *dev, struct ieee80211_vif *vif);
|
||||
int mt7921_mcu_set_eeprom(struct mt7921_dev *dev);
|
||||
int mt7921_mcu_get_eeprom(struct mt7921_dev *dev, u32 offset);
|
||||
int mt7921_mcu_set_mac(struct mt7921_dev *dev, int band, bool enable,
|
||||
bool hdr_trans);
|
||||
int mt7921_mcu_set_rts_thresh(struct mt7921_phy *phy, u32 val);
|
||||
int mt7921_mcu_get_rx_rate(struct mt7921_phy *phy, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct rate_info *rate);
|
||||
int mt7921_mcu_fw_log_2_host(struct mt7921_dev *dev, u8 ctrl);
|
||||
void mt7921_mcu_rx_event(struct mt7921_dev *dev, struct sk_buff *skb);
|
||||
void mt7921_mcu_exit(struct mt7921_dev *dev);
|
||||
|
||||
static inline bool is_mt7921(struct mt76_dev *dev)
|
||||
{
|
||||
return mt76_chip(dev) == 0x7961;
|
||||
}
|
||||
|
||||
static inline void mt7921_irq_enable(struct mt7921_dev *dev, u32 mask)
|
||||
{
|
||||
mt76_set_irq_mask(&dev->mt76, 0, 0, mask);
|
||||
@ -326,16 +306,7 @@ void mt7921_txp_skb_unmap(struct mt76_dev *dev,
|
||||
void mt7921_set_stream_he_caps(struct mt7921_phy *phy);
|
||||
void mt7921_update_channel(struct mt76_dev *mdev);
|
||||
int mt7921_init_debugfs(struct mt7921_dev *dev);
|
||||
int
|
||||
mt7921_mcu_uni_add_dev(struct mt7921_dev *dev,
|
||||
struct ieee80211_vif *vif, bool enable);
|
||||
int
|
||||
mt7921_mcu_uni_add_bss(struct mt7921_phy *phy, struct ieee80211_vif *vif,
|
||||
bool enable);
|
||||
|
||||
int
|
||||
mt7921_mcu_uni_add_sta(struct mt7921_dev *dev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enable);
|
||||
int mt7921_mcu_uni_tx_ba(struct mt7921_dev *dev,
|
||||
struct ieee80211_ampdu_params *params,
|
||||
bool enable);
|
||||
@ -343,7 +314,6 @@ int mt7921_mcu_uni_rx_ba(struct mt7921_dev *dev,
|
||||
struct ieee80211_ampdu_params *params,
|
||||
bool enable);
|
||||
void mt7921_scan_work(struct work_struct *work);
|
||||
int mt7921_mcu_set_channel_domain(struct mt7921_phy *phy);
|
||||
int mt7921_mcu_hw_scan(struct mt7921_phy *phy, struct ieee80211_vif *vif,
|
||||
struct ieee80211_scan_request *scan_req);
|
||||
int mt7921_mcu_sched_scan_req(struct mt7921_phy *phy,
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "mt7921.h"
|
||||
#include "mac.h"
|
||||
#include "mcu.h"
|
||||
#include "../trace.h"
|
||||
|
||||
static const struct pci_device_id mt7921_pci_device_table[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user