mt76 patches for 6.11
- mt7925 MLO support - mt7925 fix -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iF0EABECAB0WIQR10Rp9kadxD0kAQu/XfRQdAqdu9QUCZo2lVgAKCRDXfRQdAqdu 9fFCAKDa/Kx25RTesAlmFVmTj4jetRnPNQCg3sg3S87xpNzpPfugoSnN12XPhCk= =W551 -----END PGP SIGNATURE----- Merge tag 'mt76-for-kvalo-2024-07-08' of https://github.com/nbd168/wireless mt76 patches for 6.11 - mt7925 MLO support - mt7925 fix
This commit is contained in:
commit
dabcfd5e11
@ -1125,6 +1125,11 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
memcpy(status->chain_signal, mstat.chain_signal,
|
||||
sizeof(mstat.chain_signal));
|
||||
|
||||
if (mstat.wcid) {
|
||||
status->link_valid = mstat.wcid->link_valid;
|
||||
status->link_id = mstat.wcid->link_id;
|
||||
}
|
||||
|
||||
*sta = wcid_to_sta(mstat.wcid);
|
||||
*hw = mt76_phy_hw(dev, mstat.phy_idx);
|
||||
}
|
||||
|
@ -349,6 +349,8 @@ struct mt76_wcid {
|
||||
u8 sta:1;
|
||||
u8 amsdu:1;
|
||||
u8 phy_idx:2;
|
||||
u8 link_id:4;
|
||||
bool link_valid;
|
||||
|
||||
u8 rx_check_pn;
|
||||
u8 rx_key_pn[IEEE80211_NUM_TIDS + 1][6];
|
||||
@ -366,6 +368,8 @@ struct mt76_wcid {
|
||||
struct mt76_sta_stats stats;
|
||||
|
||||
struct list_head poll_list;
|
||||
|
||||
struct mt76_wcid *def_wcid;
|
||||
};
|
||||
|
||||
struct mt76_txq {
|
||||
@ -1081,6 +1085,7 @@ bool ____mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
|
||||
|
||||
void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs);
|
||||
void mt76_pci_disable_aspm(struct pci_dev *pdev);
|
||||
bool mt76_pci_aspm_supported(struct pci_dev *pdev);
|
||||
|
||||
static inline u16 mt76_chip(struct mt76_dev *dev)
|
||||
{
|
||||
@ -1256,6 +1261,9 @@ wcid_to_sta(struct mt76_wcid *wcid)
|
||||
if (!wcid || !wcid->sta)
|
||||
return NULL;
|
||||
|
||||
if (wcid->def_wcid)
|
||||
ptr = wcid->def_wcid;
|
||||
|
||||
return container_of(ptr, struct ieee80211_sta, drv_priv);
|
||||
}
|
||||
|
||||
|
@ -842,6 +842,7 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
{
|
||||
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
|
||||
struct sk_buff *skb, *sskb, *wskb = NULL;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct mt7615_dev *dev = phy->dev;
|
||||
struct wtbl_req_hdr *wtbl_hdr;
|
||||
struct mt7615_sta *msta;
|
||||
@ -849,6 +850,7 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
int cmd, err;
|
||||
|
||||
msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta;
|
||||
link_sta = sta ? &sta->deflink : NULL;
|
||||
|
||||
sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
|
||||
&msta->wcid);
|
||||
@ -861,8 +863,8 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
else
|
||||
mvif->sta_added = true;
|
||||
}
|
||||
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, sskb, vif, sta, enable,
|
||||
new_entry);
|
||||
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, sskb, vif, link_sta,
|
||||
enable, new_entry);
|
||||
if (enable && sta)
|
||||
mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
|
||||
MT76_STA_INFO_STATE_ASSOC);
|
||||
@ -1109,8 +1111,8 @@ mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif,
|
||||
{
|
||||
struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
|
||||
|
||||
return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid,
|
||||
enable);
|
||||
return mt76_connac_mcu_uni_add_dev(phy->mt76, &vif->bss_conf,
|
||||
&mvif->sta.wcid, enable);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -370,7 +370,7 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv);
|
||||
|
||||
void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_link_sta *link_sta,
|
||||
bool enable, bool newly)
|
||||
{
|
||||
struct sta_rec_basic *basic;
|
||||
@ -390,7 +390,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
basic->conn_state = CONN_STATE_DISCONNECT;
|
||||
}
|
||||
|
||||
if (!sta) {
|
||||
if (!link_sta) {
|
||||
basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION &&
|
||||
@ -411,7 +411,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
else
|
||||
conn_type = CONNECTION_INFRA_STA;
|
||||
basic->conn_type = cpu_to_le32(conn_type);
|
||||
basic->aid = cpu_to_le16(sta->aid);
|
||||
basic->aid = cpu_to_le16(link_sta->sta->aid);
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
if (vif->p2p && !is_mt7921(dev))
|
||||
@ -423,15 +423,15 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
break;
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
basic->conn_type = cpu_to_le32(CONNECTION_IBSS_ADHOC);
|
||||
basic->aid = cpu_to_le16(sta->aid);
|
||||
basic->aid = cpu_to_le16(link_sta->sta->aid);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy(basic->peer_addr, sta->addr, ETH_ALEN);
|
||||
basic->qos = sta->wme;
|
||||
memcpy(basic->peer_addr, link_sta->addr, ETH_ALEN);
|
||||
basic->qos = link_sta->sta->wme;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv);
|
||||
|
||||
@ -793,7 +793,8 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2);
|
||||
|
||||
u8
|
||||
mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band, struct ieee80211_sta *sta)
|
||||
enum nl80211_band band,
|
||||
struct ieee80211_link_sta *link_sta)
|
||||
{
|
||||
struct ieee80211_sta_ht_cap *ht_cap;
|
||||
struct ieee80211_sta_vht_cap *vht_cap;
|
||||
@ -801,11 +802,11 @@ mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
|
||||
const struct ieee80211_sta_eht_cap *eht_cap;
|
||||
u8 mode = 0;
|
||||
|
||||
if (sta) {
|
||||
ht_cap = &sta->deflink.ht_cap;
|
||||
vht_cap = &sta->deflink.vht_cap;
|
||||
he_cap = &sta->deflink.he_cap;
|
||||
eht_cap = &sta->deflink.eht_cap;
|
||||
if (link_sta) {
|
||||
ht_cap = &link_sta->ht_cap;
|
||||
vht_cap = &link_sta->vht_cap;
|
||||
he_cap = &link_sta->he_cap;
|
||||
eht_cap = &link_sta->eht_cap;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
@ -911,7 +912,8 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
|
||||
|
||||
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->phy_type = mt76_connac_get_phy_mode_v2(mphy, vif, band,
|
||||
&sta->deflink);
|
||||
phy->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
|
||||
phy->rcpi = rcpi;
|
||||
phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
|
||||
@ -1044,6 +1046,7 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
|
||||
struct mt76_sta_cmd_info *info)
|
||||
{
|
||||
struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
struct wtbl_req_hdr *wtbl_hdr;
|
||||
struct tlv *sta_wtbl;
|
||||
@ -1053,9 +1056,11 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
|
||||
if (IS_ERR(skb))
|
||||
return PTR_ERR(skb);
|
||||
|
||||
link_sta = info->sta ? &info->sta->deflink : NULL;
|
||||
if (info->sta || !info->offload_fw)
|
||||
mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif, info->sta,
|
||||
info->enable, info->newly);
|
||||
mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif,
|
||||
link_sta, info->enable,
|
||||
info->newly);
|
||||
if (info->sta && info->enable)
|
||||
mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
|
||||
info->vif, info->rcpi,
|
||||
@ -1132,11 +1137,11 @@ void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
|
||||
|
||||
int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
struct mt76_wcid *wcid,
|
||||
bool enable)
|
||||
{
|
||||
struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
|
||||
struct mt76_vif *mvif = (struct mt76_vif *)bss_conf->vif->drv_priv;
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
struct {
|
||||
struct {
|
||||
@ -1148,7 +1153,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 active;
|
||||
u8 pad;
|
||||
u8 link_idx; /* not link_id */
|
||||
u8 omac_addr[ETH_ALEN];
|
||||
} __packed tlv;
|
||||
} dev_req = {
|
||||
@ -1160,6 +1165,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
|
||||
.tag = cpu_to_le16(DEV_INFO_ACTIVE),
|
||||
.len = cpu_to_le16(sizeof(struct req_tlv)),
|
||||
.active = enable,
|
||||
.link_idx = mvif->idx,
|
||||
},
|
||||
};
|
||||
struct {
|
||||
@ -1182,12 +1188,13 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
|
||||
.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
|
||||
.sta_idx = cpu_to_le16(wcid->idx),
|
||||
.conn_state = 1,
|
||||
.link_idx = mvif->idx,
|
||||
},
|
||||
};
|
||||
int err, idx, cmd, len;
|
||||
void *data;
|
||||
|
||||
switch (vif->type) {
|
||||
switch (bss_conf->vif->type) {
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
case NL80211_IFTYPE_AP:
|
||||
@ -1207,7 +1214,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
|
||||
idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
|
||||
basic_req.basic.hw_bss_idx = idx;
|
||||
|
||||
memcpy(dev_req.tlv.omac_addr, vif->addr, ETH_ALEN);
|
||||
memcpy(dev_req.tlv.omac_addr, bss_conf->addr, ETH_ALEN);
|
||||
|
||||
cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE);
|
||||
data = enable ? (void *)&dev_req : (void *)&basic_req;
|
||||
@ -1305,7 +1312,8 @@ int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
|
||||
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
|
||||
|
||||
u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band, struct ieee80211_sta *sta)
|
||||
enum nl80211_band band,
|
||||
struct ieee80211_link_sta *link_sta)
|
||||
{
|
||||
struct mt76_dev *dev = phy->dev;
|
||||
const struct ieee80211_sta_he_cap *he_cap;
|
||||
@ -1316,10 +1324,10 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
|
||||
if (is_connac_v1(dev))
|
||||
return 0x38;
|
||||
|
||||
if (sta) {
|
||||
ht_cap = &sta->deflink.ht_cap;
|
||||
vht_cap = &sta->deflink.vht_cap;
|
||||
he_cap = &sta->deflink.he_cap;
|
||||
if (link_sta) {
|
||||
ht_cap = &link_sta->ht_cap;
|
||||
vht_cap = &link_sta->vht_cap;
|
||||
he_cap = &link_sta->he_cap;
|
||||
} else {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
|
@ -545,6 +545,13 @@ struct sta_rec_muru {
|
||||
} mimo_ul;
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_remove {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 action;
|
||||
u8 pad[3];
|
||||
} __packed;
|
||||
|
||||
struct sta_phy {
|
||||
u8 type;
|
||||
u8 flag;
|
||||
@ -813,7 +820,10 @@ enum {
|
||||
STA_REC_HE_6G = 0x17,
|
||||
STA_REC_HE_V2 = 0x19,
|
||||
STA_REC_MLD = 0x20,
|
||||
STA_REC_EHT_MLD = 0x21,
|
||||
STA_REC_EHT = 0x22,
|
||||
STA_REC_MLD_OFF = 0x23,
|
||||
STA_REC_REMOVE = 0x25,
|
||||
STA_REC_PN_INFO = 0x26,
|
||||
STA_REC_KEY_V3 = 0x27,
|
||||
STA_REC_HDRT = 0x28,
|
||||
@ -1392,6 +1402,7 @@ enum {
|
||||
MT_NIC_CAP_WFDMA_REALLOC,
|
||||
MT_NIC_CAP_6G,
|
||||
MT_NIC_CAP_CHIP_CAP = 0x20,
|
||||
MT_NIC_CAP_EML_CAP = 0x22,
|
||||
};
|
||||
|
||||
#define UNI_WOW_DETECT_TYPE_MAGIC BIT(0)
|
||||
@ -1443,7 +1454,7 @@ struct mt76_connac_bss_basic_tlv {
|
||||
__le16 sta_idx;
|
||||
__le16 nonht_basic_phy;
|
||||
u8 phymode_ext; /* bit(0) AX_6G */
|
||||
u8 pad[1];
|
||||
u8 link_idx;
|
||||
} __packed;
|
||||
|
||||
struct mt76_connac_bss_qos_tlv {
|
||||
@ -1733,7 +1744,10 @@ enum mt76_sta_info_state {
|
||||
};
|
||||
|
||||
struct mt76_sta_cmd_info {
|
||||
struct ieee80211_sta *sta;
|
||||
union {
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
};
|
||||
struct mt76_wcid *wcid;
|
||||
|
||||
struct ieee80211_vif *vif;
|
||||
@ -1883,8 +1897,8 @@ int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy);
|
||||
int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif);
|
||||
void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enable,
|
||||
bool newly);
|
||||
struct ieee80211_link_sta *link_sta,
|
||||
bool enable, bool newly);
|
||||
void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, void *sta_wtbl,
|
||||
@ -1898,7 +1912,8 @@ int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
|
||||
struct mt76_wcid *wcid, int cmd);
|
||||
void mt76_connac_mcu_sta_he_tlv_v2(struct sk_buff *skb, struct ieee80211_sta *sta);
|
||||
u8 mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band, struct ieee80211_sta *sta);
|
||||
enum nl80211_band band,
|
||||
struct ieee80211_link_sta *link_sta);
|
||||
int mt76_connac_mcu_wtbl_update_hdr_trans(struct mt76_dev *dev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
@ -1917,7 +1932,7 @@ void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
|
||||
struct ieee80211_ampdu_params *params,
|
||||
bool enable, bool tx);
|
||||
int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
struct mt76_wcid *wcid,
|
||||
bool enable);
|
||||
int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
|
||||
@ -1992,7 +2007,8 @@ mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif);
|
||||
const struct ieee80211_sta_eht_cap *
|
||||
mt76_connac_get_eht_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif);
|
||||
u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band, struct ieee80211_sta *sta);
|
||||
enum nl80211_band band,
|
||||
struct ieee80211_link_sta *sta);
|
||||
u8 mt76_connac_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_vif *vif,
|
||||
enum nl80211_band band);
|
||||
|
||||
|
@ -1503,7 +1503,7 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
|
||||
|
||||
ra->valid = true;
|
||||
ra->auto_rate = true;
|
||||
ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, sta);
|
||||
ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, &sta->deflink);
|
||||
ra->channel = chandef->chan->hw_value;
|
||||
ra->bw = sta->deflink.bandwidth;
|
||||
ra->phy.bw = sta->deflink.bandwidth;
|
||||
@ -1656,11 +1656,13 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enable)
|
||||
{
|
||||
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct mt7915_sta *msta;
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta;
|
||||
link_sta = sta ? &sta->deflink : NULL;
|
||||
|
||||
skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
|
||||
&msta->wcid);
|
||||
@ -1668,7 +1670,7 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
|
||||
return PTR_ERR(skb);
|
||||
|
||||
/* starec basic */
|
||||
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, vif, sta, enable,
|
||||
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, vif, link_sta, enable,
|
||||
!rcu_access_pointer(dev->mt76.wcid[msta->wcid.idx]));
|
||||
if (!enable)
|
||||
goto out;
|
||||
|
@ -39,6 +39,7 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
|
||||
};
|
||||
struct ieee80211_sta *sta;
|
||||
struct mt792x_sta *msta;
|
||||
struct mt792x_link_sta *mlink;
|
||||
u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
|
||||
LIST_HEAD(sta_poll_list);
|
||||
struct rate_info *rate;
|
||||
@ -60,23 +61,25 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
break;
|
||||
}
|
||||
msta = list_first_entry(&sta_poll_list,
|
||||
struct mt792x_sta, wcid.poll_list);
|
||||
list_del_init(&msta->wcid.poll_list);
|
||||
mlink = list_first_entry(&sta_poll_list,
|
||||
struct mt792x_link_sta,
|
||||
wcid.poll_list);
|
||||
msta = container_of(mlink, struct mt792x_sta, deflink);
|
||||
list_del_init(&mlink->wcid.poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
idx = msta->wcid.idx;
|
||||
idx = mlink->wcid.idx;
|
||||
addr = mt7921_mac_wtbl_lmac_addr(idx, MT_WTBL_AC0_CTT_OFFSET);
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||||
u32 tx_last = msta->airtime_ac[i];
|
||||
u32 rx_last = msta->airtime_ac[i + 4];
|
||||
u32 tx_last = mlink->airtime_ac[i];
|
||||
u32 rx_last = mlink->airtime_ac[i + 4];
|
||||
|
||||
msta->airtime_ac[i] = mt76_rr(dev, addr);
|
||||
msta->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
|
||||
mlink->airtime_ac[i] = mt76_rr(dev, addr);
|
||||
mlink->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
|
||||
|
||||
tx_time[i] = msta->airtime_ac[i] - tx_last;
|
||||
rx_time[i] = msta->airtime_ac[i + 4] - rx_last;
|
||||
tx_time[i] = mlink->airtime_ac[i] - tx_last;
|
||||
rx_time[i] = mlink->airtime_ac[i + 4] - rx_last;
|
||||
|
||||
if ((tx_last | rx_last) & BIT(30))
|
||||
clear = true;
|
||||
@ -87,10 +90,10 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
|
||||
if (clear) {
|
||||
mt7921_mac_wtbl_update(dev, idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
|
||||
memset(mlink->airtime_ac, 0, sizeof(mlink->airtime_ac));
|
||||
}
|
||||
|
||||
if (!msta->wcid.sta)
|
||||
if (!mlink->wcid.sta)
|
||||
continue;
|
||||
|
||||
sta = container_of((void *)msta, struct ieee80211_sta,
|
||||
@ -113,7 +116,7 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
|
||||
* we need to make sure that flags match so polling GI
|
||||
* from per-sta counters directly.
|
||||
*/
|
||||
rate = &msta->wcid.rate;
|
||||
rate = &mlink->wcid.rate;
|
||||
addr = mt7921_mac_wtbl_lmac_addr(idx,
|
||||
MT_WTBL_TXRX_CAP_RATE_OFFSET);
|
||||
val = mt76_rr(dev, addr);
|
||||
@ -154,10 +157,10 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
|
||||
rssi[2] = to_rssi(GENMASK(23, 16), val);
|
||||
rssi[3] = to_rssi(GENMASK(31, 14), val);
|
||||
|
||||
msta->ack_signal =
|
||||
mlink->ack_signal =
|
||||
mt76_rx_signal(msta->vif->phy->mt76->antenna_mask, rssi);
|
||||
|
||||
ewma_avg_signal_add(&msta->avg_ack_signal, -msta->ack_signal);
|
||||
ewma_avg_signal_add(&mlink->avg_ack_signal, -mlink->ack_signal);
|
||||
}
|
||||
}
|
||||
|
||||
@ -180,6 +183,7 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
||||
u32 rxd3 = le32_to_cpu(rxd[3]);
|
||||
u32 rxd4 = le32_to_cpu(rxd[4]);
|
||||
struct mt792x_sta *msta = NULL;
|
||||
struct mt792x_link_sta *mlink;
|
||||
u16 seq_ctrl = 0;
|
||||
__le16 fc = 0;
|
||||
u8 mode = 0;
|
||||
@ -210,10 +214,11 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
||||
status->wcid = mt792x_rx_get_wcid(dev, idx, unicast);
|
||||
|
||||
if (status->wcid) {
|
||||
msta = container_of(status->wcid, struct mt792x_sta, wcid);
|
||||
mlink = container_of(status->wcid, struct mt792x_link_sta, wcid);
|
||||
msta = container_of(mlink, struct mt792x_sta, deflink);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
@ -444,7 +449,7 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
||||
|
||||
void mt7921_mac_add_txs(struct mt792x_dev *dev, void *data)
|
||||
{
|
||||
struct mt792x_sta *msta = NULL;
|
||||
struct mt792x_link_sta *mlink;
|
||||
struct mt76_wcid *wcid;
|
||||
__le32 *txs_data = data;
|
||||
u16 wcidx;
|
||||
@ -468,15 +473,15 @@ void mt7921_mac_add_txs(struct mt792x_dev *dev, void *data)
|
||||
if (!wcid)
|
||||
goto out;
|
||||
|
||||
msta = container_of(wcid, struct mt792x_sta, wcid);
|
||||
mlink = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
|
||||
mt76_connac2_mac_add_txs_skb(&dev->mt76, wcid, pid, txs_data);
|
||||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
out:
|
||||
@ -513,7 +518,7 @@ static void mt7921_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
||||
* 1'b0: msdu_id with the same 'wcid pair' as above.
|
||||
*/
|
||||
if (info & MT_TX_FREE_PAIR) {
|
||||
struct mt792x_sta *msta;
|
||||
struct mt792x_link_sta *mlink;
|
||||
u16 idx;
|
||||
|
||||
count++;
|
||||
@ -523,10 +528,10 @@ static void mt7921_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
||||
if (!sta)
|
||||
continue;
|
||||
|
||||
msta = container_of(wcid, struct mt792x_sta, wcid);
|
||||
mlink = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
continue;
|
||||
@ -641,11 +646,12 @@ mt7921_vif_connect_iter(void *priv, u8 *mac,
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
ieee80211_disconnect(vif, true);
|
||||
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, true);
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
|
||||
&mvif->sta.deflink.wcid, true);
|
||||
mt7921_mcu_set_tx(dev, vif);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
mt76_connac_mcu_uni_add_bss(dev->phy.mt76, vif, &mvif->sta.wcid,
|
||||
mt76_connac_mcu_uni_add_bss(dev->phy.mt76, vif, &mvif->sta.deflink.wcid,
|
||||
true, NULL);
|
||||
mt7921_mcu_sta_update(dev, NULL, vif, true,
|
||||
MT76_STA_INFO_STATE_NONE);
|
||||
@ -786,9 +792,9 @@ int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
||||
if (sta) {
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
|
||||
if (time_after(jiffies, msta->last_txs + HZ / 4)) {
|
||||
if (time_after(jiffies, msta->deflink.last_txs + HZ / 4)) {
|
||||
info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
msta->last_txs = jiffies;
|
||||
msta->deflink.last_txs = jiffies;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -295,40 +295,40 @@ mt7921_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||
|
||||
mt792x_mutex_acquire(dev);
|
||||
|
||||
mvif->mt76.idx = __ffs64(~dev->mt76.vif_mask);
|
||||
if (mvif->mt76.idx >= MT792x_MAX_INTERFACES) {
|
||||
mvif->bss_conf.mt76.idx = __ffs64(~dev->mt76.vif_mask);
|
||||
if (mvif->bss_conf.mt76.idx >= MT792x_MAX_INTERFACES) {
|
||||
ret = -ENOSPC;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mvif->mt76.omac_idx = mvif->mt76.idx;
|
||||
mvif->bss_conf.mt76.omac_idx = mvif->bss_conf.mt76.idx;
|
||||
mvif->phy = phy;
|
||||
mvif->mt76.band_idx = 0;
|
||||
mvif->mt76.wmm_idx = mvif->mt76.idx % MT76_CONNAC_MAX_WMM_SETS;
|
||||
mvif->bss_conf.mt76.band_idx = 0;
|
||||
mvif->bss_conf.mt76.wmm_idx = mvif->bss_conf.mt76.idx % MT76_CONNAC_MAX_WMM_SETS;
|
||||
|
||||
ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid,
|
||||
true);
|
||||
ret = mt76_connac_mcu_uni_add_dev(&dev->mphy, &vif->bss_conf,
|
||||
&mvif->sta.deflink.wcid, true);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
dev->mt76.vif_mask |= BIT_ULL(mvif->mt76.idx);
|
||||
phy->omac_mask |= BIT_ULL(mvif->mt76.omac_idx);
|
||||
dev->mt76.vif_mask |= BIT_ULL(mvif->bss_conf.mt76.idx);
|
||||
phy->omac_mask |= BIT_ULL(mvif->bss_conf.mt76.omac_idx);
|
||||
|
||||
idx = MT792x_WTBL_RESERVED - mvif->mt76.idx;
|
||||
idx = MT792x_WTBL_RESERVED - mvif->bss_conf.mt76.idx;
|
||||
|
||||
INIT_LIST_HEAD(&mvif->sta.wcid.poll_list);
|
||||
mvif->sta.wcid.idx = idx;
|
||||
mvif->sta.wcid.phy_idx = mvif->mt76.band_idx;
|
||||
mvif->sta.wcid.hw_key_idx = -1;
|
||||
mvif->sta.wcid.tx_info |= MT_WCID_TX_INFO_SET;
|
||||
mt76_wcid_init(&mvif->sta.wcid);
|
||||
INIT_LIST_HEAD(&mvif->sta.deflink.wcid.poll_list);
|
||||
mvif->sta.deflink.wcid.idx = idx;
|
||||
mvif->sta.deflink.wcid.phy_idx = mvif->bss_conf.mt76.band_idx;
|
||||
mvif->sta.deflink.wcid.hw_key_idx = -1;
|
||||
mvif->sta.deflink.wcid.tx_info |= MT_WCID_TX_INFO_SET;
|
||||
mt76_wcid_init(&mvif->sta.deflink.wcid);
|
||||
|
||||
mt7921_mac_wtbl_update(dev, idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
|
||||
ewma_rssi_init(&mvif->rssi);
|
||||
ewma_rssi_init(&mvif->bss_conf.rssi);
|
||||
|
||||
rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.wcid);
|
||||
rcu_assign_pointer(dev->mt76.wcid[idx], &mvif->sta.deflink.wcid);
|
||||
if (vif->txq) {
|
||||
mtxq = (struct mt76_txq *)vif->txq->drv_priv;
|
||||
mtxq->wcid = idx;
|
||||
@ -494,7 +494,7 @@ static int mt7921_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt792x_sta *msta = sta ? (struct mt792x_sta *)sta->drv_priv :
|
||||
&mvif->sta;
|
||||
struct mt76_wcid *wcid = &msta->wcid;
|
||||
struct mt76_wcid *wcid = &msta->deflink.wcid;
|
||||
u8 *wcid_keyidx = &wcid->hw_key_idx;
|
||||
int idx = key->keyidx, err = 0;
|
||||
|
||||
@ -541,18 +541,18 @@ static int mt7921_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
}
|
||||
|
||||
mt76_wcid_key_setup(&dev->mt76, wcid, key);
|
||||
err = mt76_connac_mcu_add_key(&dev->mt76, vif, &msta->bip,
|
||||
err = mt76_connac_mcu_add_key(&dev->mt76, vif, &msta->deflink.bip,
|
||||
key, MCU_UNI_CMD(STA_REC_UPDATE),
|
||||
&msta->wcid, cmd);
|
||||
&msta->deflink.wcid, cmd);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_WEP104 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_WEP40)
|
||||
err = mt76_connac_mcu_add_key(&dev->mt76, vif,
|
||||
&mvif->wep_sta->bip,
|
||||
&mvif->wep_sta->deflink.bip,
|
||||
key, MCU_UNI_CMD(STA_REC_UPDATE),
|
||||
&mvif->wep_sta->wcid, cmd);
|
||||
&mvif->wep_sta->deflink.wcid, cmd);
|
||||
out:
|
||||
mt792x_mutex_release(dev);
|
||||
|
||||
@ -718,7 +718,7 @@ static void mt7921_bss_info_changed(struct ieee80211_hw *hw,
|
||||
if (changed & BSS_CHANGED_ARP_FILTER) {
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
|
||||
mt76_connac_mcu_update_arp_filter(&dev->mt76, &mvif->mt76,
|
||||
mt76_connac_mcu_update_arp_filter(&dev->mt76, &mvif->bss_conf.mt76,
|
||||
info);
|
||||
}
|
||||
|
||||
@ -799,13 +799,13 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
if (idx < 0)
|
||||
return -ENOSPC;
|
||||
|
||||
INIT_LIST_HEAD(&msta->wcid.poll_list);
|
||||
INIT_LIST_HEAD(&msta->deflink.wcid.poll_list);
|
||||
msta->vif = mvif;
|
||||
msta->wcid.sta = 1;
|
||||
msta->wcid.idx = idx;
|
||||
msta->wcid.phy_idx = mvif->mt76.band_idx;
|
||||
msta->wcid.tx_info |= MT_WCID_TX_INFO_SET;
|
||||
msta->last_txs = jiffies;
|
||||
msta->deflink.wcid.sta = 1;
|
||||
msta->deflink.wcid.idx = idx;
|
||||
msta->deflink.wcid.phy_idx = mvif->bss_conf.mt76.band_idx;
|
||||
msta->deflink.wcid.tx_info |= MT_WCID_TX_INFO_SET;
|
||||
msta->deflink.last_txs = jiffies;
|
||||
|
||||
ret = mt76_connac_pm_wake(&dev->mphy, &dev->pm);
|
||||
if (ret)
|
||||
@ -840,14 +840,14 @@ void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
mt792x_mutex_acquire(dev);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
|
||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
|
||||
true, mvif->mt76.ctx);
|
||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.deflink.wcid,
|
||||
true, mvif->bss_conf.mt76.ctx);
|
||||
|
||||
ewma_avg_signal_init(&msta->avg_ack_signal);
|
||||
ewma_avg_signal_init(&msta->deflink.avg_ack_signal);
|
||||
|
||||
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
||||
mt7921_mac_wtbl_update(dev, msta->deflink.wcid.idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
|
||||
memset(msta->deflink.airtime_ac, 0, sizeof(msta->deflink.airtime_ac));
|
||||
|
||||
mt7921_mcu_sta_update(dev, sta, vif, true, MT76_STA_INFO_STATE_ASSOC);
|
||||
|
||||
@ -861,27 +861,27 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
|
||||
mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid);
|
||||
mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->deflink.wcid);
|
||||
mt76_connac_pm_wake(&dev->mphy, &dev->pm);
|
||||
|
||||
mt7921_mcu_sta_update(dev, sta, vif, false, MT76_STA_INFO_STATE_NONE);
|
||||
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
||||
mt7921_mac_wtbl_update(dev, msta->deflink.wcid.idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
|
||||
mvif->wep_sta = NULL;
|
||||
ewma_rssi_init(&mvif->rssi);
|
||||
ewma_rssi_init(&mvif->bss_conf.rssi);
|
||||
if (!sta->tdls)
|
||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif,
|
||||
&mvif->sta.wcid, false,
|
||||
mvif->mt76.ctx);
|
||||
&mvif->sta.deflink.wcid, false,
|
||||
mvif->bss_conf.mt76.ctx);
|
||||
}
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (!list_empty(&msta->wcid.poll_list))
|
||||
list_del_init(&msta->wcid.poll_list);
|
||||
if (!list_empty(&msta->deflink.wcid.poll_list))
|
||||
list_del_init(&msta->deflink.wcid.poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
mt7921_regd_set_6ghz_power_type(vif, false);
|
||||
@ -923,12 +923,12 @@ mt7921_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
mt792x_mutex_acquire(dev);
|
||||
switch (action) {
|
||||
case IEEE80211_AMPDU_RX_START:
|
||||
mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn,
|
||||
mt76_rx_aggr_start(&dev->mt76, &msta->deflink.wcid, tid, ssn,
|
||||
params->buf_size);
|
||||
mt7921_mcu_uni_rx_ba(dev, params, true);
|
||||
break;
|
||||
case IEEE80211_AMPDU_RX_STOP:
|
||||
mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid);
|
||||
mt76_rx_aggr_stop(&dev->mt76, &msta->deflink.wcid, tid);
|
||||
mt7921_mcu_uni_rx_ba(dev, params, false);
|
||||
break;
|
||||
case IEEE80211_AMPDU_TX_OPERATIONAL:
|
||||
@ -939,16 +939,16 @@ mt7921_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
case IEEE80211_AMPDU_TX_STOP_FLUSH:
|
||||
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
|
||||
mtxq->aggr = false;
|
||||
clear_bit(tid, &msta->wcid.ampdu_state);
|
||||
clear_bit(tid, &msta->deflink.wcid.ampdu_state);
|
||||
mt7921_mcu_uni_tx_ba(dev, params, false);
|
||||
break;
|
||||
case IEEE80211_AMPDU_TX_START:
|
||||
set_bit(tid, &msta->wcid.ampdu_state);
|
||||
set_bit(tid, &msta->deflink.wcid.ampdu_state);
|
||||
ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
|
||||
break;
|
||||
case IEEE80211_AMPDU_TX_STOP_CONT:
|
||||
mtxq->aggr = false;
|
||||
clear_bit(tid, &msta->wcid.ampdu_state);
|
||||
clear_bit(tid, &msta->deflink.wcid.ampdu_state);
|
||||
mt7921_mcu_uni_tx_ba(dev, params, false);
|
||||
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
|
||||
break;
|
||||
@ -1166,11 +1166,11 @@ static void mt7921_sta_set_decap_offload(struct ieee80211_hw *hw,
|
||||
mt792x_mutex_acquire(dev);
|
||||
|
||||
if (enabled)
|
||||
set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
|
||||
set_bit(MT_WCID_FLAG_HDR_TRANS, &msta->deflink.wcid.flags);
|
||||
else
|
||||
clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->wcid.flags);
|
||||
clear_bit(MT_WCID_FLAG_HDR_TRANS, &msta->deflink.wcid.flags);
|
||||
|
||||
mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76, vif, &msta->wcid,
|
||||
mt76_connac_mcu_sta_update_hdr_trans(&dev->mt76, vif, &msta->deflink.wcid,
|
||||
MCU_UNI_CMD(STA_REC_UPDATE));
|
||||
|
||||
mt792x_mutex_release(dev);
|
||||
@ -1196,7 +1196,7 @@ static void mt7921_ipv6_addr_change(struct ieee80211_hw *hw,
|
||||
struct mt76_connac_arpns_tlv arpns;
|
||||
} req_hdr = {
|
||||
.hdr = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
},
|
||||
.arpns = {
|
||||
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ND),
|
||||
@ -1294,8 +1294,8 @@ mt7921_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
|
||||
mt792x_mutex_acquire(dev);
|
||||
|
||||
err = mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid,
|
||||
true, mvif->mt76.ctx);
|
||||
err = mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.deflink.wcid,
|
||||
true, mvif->bss_conf.mt76.ctx);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
@ -1326,8 +1326,8 @@ mt7921_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.wcid, false,
|
||||
mvif->mt76.ctx);
|
||||
mt76_connac_mcu_uni_add_bss(phy->mt76, vif, &mvif->sta.deflink.wcid, false,
|
||||
mvif->bss_conf.mt76.ctx);
|
||||
|
||||
out:
|
||||
mt792x_mutex_release(dev);
|
||||
@ -1346,32 +1346,27 @@ mt7921_remove_chanctx(struct ieee80211_hw *hw,
|
||||
{
|
||||
}
|
||||
|
||||
static void mt7921_ctx_iter(void *priv, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct ieee80211_chanctx_conf *ctx = priv;
|
||||
|
||||
if (ctx != mvif->mt76.ctx)
|
||||
return;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR)
|
||||
mt7921_mcu_config_sniffer(mvif, ctx);
|
||||
else
|
||||
mt76_connac_mcu_uni_set_chctx(mvif->phy->mt76, &mvif->mt76, ctx);
|
||||
}
|
||||
|
||||
static void
|
||||
mt7921_change_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
u32 changed)
|
||||
{
|
||||
struct mt792x_chanctx *mctx = (struct mt792x_chanctx *)ctx->drv_priv;
|
||||
struct mt792x_phy *phy = mt792x_hw_phy(hw);
|
||||
struct ieee80211_vif *vif;
|
||||
struct mt792x_vif *mvif;
|
||||
|
||||
if (!mctx->bss_conf)
|
||||
return;
|
||||
|
||||
mvif = container_of(mctx->bss_conf, struct mt792x_vif, bss_conf);
|
||||
vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
|
||||
|
||||
mt792x_mutex_acquire(phy->dev);
|
||||
ieee80211_iterate_active_interfaces(phy->mt76->hw,
|
||||
IEEE80211_IFACE_ITER_ACTIVE,
|
||||
mt7921_ctx_iter, ctx);
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR)
|
||||
mt7921_mcu_config_sniffer(mvif, ctx);
|
||||
else
|
||||
mt76_connac_mcu_uni_set_chctx(mvif->phy->mt76, &mvif->bss_conf.mt76, ctx);
|
||||
mt792x_mutex_release(phy->dev);
|
||||
}
|
||||
|
||||
@ -1385,7 +1380,7 @@ static void mt7921_mgd_prepare_tx(struct ieee80211_hw *hw,
|
||||
jiffies_to_msecs(HZ);
|
||||
|
||||
mt792x_mutex_acquire(dev);
|
||||
mt7921_set_roc(mvif->phy, mvif, mvif->mt76.ctx->def.chan, duration,
|
||||
mt7921_set_roc(mvif->phy, mvif, mvif->bss_conf.mt76.ctx->def.chan, duration,
|
||||
MT7921_ROC_REQ_JOIN);
|
||||
mt792x_mutex_release(dev);
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ mt7921_mcu_set_ipv6_ns_filter(struct mt76_dev *dev,
|
||||
struct mt76_connac_arpns_tlv arpns;
|
||||
} req = {
|
||||
.hdr = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
},
|
||||
.arpns = {
|
||||
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ND),
|
||||
@ -260,7 +260,7 @@ mt7921_mcu_rssi_monitor_iter(void *priv, u8 *mac,
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt76_connac_rssi_notify_event *event = priv;
|
||||
enum nl80211_cqm_rssi_threshold_event nl_event;
|
||||
s32 rssi = le32_to_cpu(event->rssi[mvif->mt76.idx]);
|
||||
s32 rssi = le32_to_cpu(event->rssi[mvif->bss_conf.mt76.idx]);
|
||||
|
||||
if (!rssi)
|
||||
return;
|
||||
@ -386,9 +386,9 @@ int mt7921_mcu_uni_tx_ba(struct mt792x_dev *dev,
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
|
||||
|
||||
if (enable && !params->amsdu)
|
||||
msta->wcid.amsdu = false;
|
||||
msta->deflink.wcid.amsdu = false;
|
||||
|
||||
return mt76_connac_mcu_sta_ba(&dev->mt76, &msta->vif->mt76, params,
|
||||
return mt76_connac_mcu_sta_ba(&dev->mt76, &msta->vif->bss_conf.mt76, params,
|
||||
MCU_UNI_CMD(STA_REC_UPDATE),
|
||||
enable, true);
|
||||
}
|
||||
@ -399,7 +399,7 @@ int mt7921_mcu_uni_rx_ba(struct mt792x_dev *dev,
|
||||
{
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
|
||||
|
||||
return mt76_connac_mcu_sta_ba(&dev->mt76, &msta->vif->mt76, params,
|
||||
return mt76_connac_mcu_sta_ba(&dev->mt76, &msta->vif->bss_conf.mt76, params,
|
||||
MCU_UNI_CMD(STA_REC_UPDATE),
|
||||
enable, false);
|
||||
}
|
||||
@ -678,9 +678,9 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
|
||||
u8 wmm_idx;
|
||||
u8 pad;
|
||||
} __packed req = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
.qos = vif->bss_conf.qos,
|
||||
.wmm_idx = mvif->mt76.wmm_idx,
|
||||
.wmm_idx = mvif->bss_conf.mt76.wmm_idx,
|
||||
};
|
||||
struct mu_edca {
|
||||
u8 cw_min;
|
||||
@ -701,15 +701,15 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
|
||||
struct mu_edca edca[IEEE80211_NUM_ACS];
|
||||
u8 pad3[32];
|
||||
} __packed req_mu = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
.qos = vif->bss_conf.qos,
|
||||
.wmm_idx = mvif->mt76.wmm_idx,
|
||||
.wmm_idx = mvif->bss_conf.mt76.wmm_idx,
|
||||
};
|
||||
static const int to_aci[] = { 1, 0, 2, 3 };
|
||||
int ac, ret;
|
||||
|
||||
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
|
||||
struct ieee80211_tx_queue_params *q = &mvif->queue_params[ac];
|
||||
struct ieee80211_tx_queue_params *q = &mvif->bss_conf.queue_params[ac];
|
||||
struct edca *e = &req.edca[to_aci[ac]];
|
||||
|
||||
e->aifs = cpu_to_le16(q->aifs);
|
||||
@ -738,10 +738,10 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
|
||||
struct ieee80211_he_mu_edca_param_ac_rec *q;
|
||||
struct mu_edca *e;
|
||||
|
||||
if (!mvif->queue_params[ac].mu_edca)
|
||||
if (!mvif->bss_conf.queue_params[ac].mu_edca)
|
||||
break;
|
||||
|
||||
q = &mvif->queue_params[ac].mu_edca_param_rec;
|
||||
q = &mvif->bss_conf.queue_params[ac].mu_edca_param_rec;
|
||||
e = &(req_mu.edca[to_aci[ac]]);
|
||||
|
||||
e->cw_min = q->ecw_min_max & 0xf;
|
||||
@ -790,7 +790,7 @@ int mt7921_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
|
||||
.tokenid = token_id,
|
||||
.reqtype = type,
|
||||
.maxinterval = cpu_to_le32(duration),
|
||||
.bss_idx = vif->mt76.idx,
|
||||
.bss_idx = vif->bss_conf.mt76.idx,
|
||||
.control_channel = chan->hw_value,
|
||||
.bw = CMD_CBW_20MHZ,
|
||||
.bw_from_ap = CMD_CBW_20MHZ,
|
||||
@ -842,7 +842,7 @@ int mt7921_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
|
||||
.tag = cpu_to_le16(UNI_ROC_ABORT),
|
||||
.len = cpu_to_le16(sizeof(struct roc_abort_tlv)),
|
||||
.tokenid = token_id,
|
||||
.bss_idx = vif->mt76.idx,
|
||||
.bss_idx = vif->bss_conf.mt76.idx,
|
||||
.dbdcband = 0xff, /* auto*/
|
||||
},
|
||||
};
|
||||
@ -947,7 +947,7 @@ int mt7921_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif)
|
||||
} __packed ps;
|
||||
} __packed ps_req = {
|
||||
.hdr = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
},
|
||||
.ps = {
|
||||
.tag = cpu_to_le16(UNI_BSS_INFO_PS),
|
||||
@ -982,7 +982,7 @@ mt7921_mcu_uni_bss_bcnft(struct mt792x_dev *dev, struct ieee80211_vif *vif,
|
||||
} __packed bcnft;
|
||||
} __packed bcnft_req = {
|
||||
.hdr = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
},
|
||||
.bcnft = {
|
||||
.tag = cpu_to_le16(UNI_BSS_INFO_BCNFT),
|
||||
@ -1015,7 +1015,7 @@ mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
|
||||
u8 bmc_triggered_ac;
|
||||
u8 pad;
|
||||
} req = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
.aid = cpu_to_le16(vif->cfg.aid),
|
||||
.dtim_period = vif->bss_conf.dtim_period,
|
||||
.bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int),
|
||||
@ -1024,7 +1024,7 @@ mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
|
||||
u8 bss_idx;
|
||||
u8 pad[3];
|
||||
} req_hdr = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
};
|
||||
int err;
|
||||
|
||||
@ -1042,7 +1042,7 @@ int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
|
||||
enum mt76_sta_info_state state)
|
||||
{
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
int rssi = -ewma_rssi_read(&mvif->rssi);
|
||||
int rssi = -ewma_rssi_read(&mvif->bss_conf.rssi);
|
||||
struct mt76_sta_cmd_info info = {
|
||||
.sta = sta,
|
||||
.vif = vif,
|
||||
@ -1055,7 +1055,7 @@ int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
|
||||
struct mt792x_sta *msta;
|
||||
|
||||
msta = sta ? (struct mt792x_sta *)sta->drv_priv : NULL;
|
||||
info.wcid = msta ? &msta->wcid : &mvif->sta.wcid;
|
||||
info.wcid = msta ? &msta->deflink.wcid : &mvif->sta.deflink.wcid;
|
||||
info.newly = msta ? state != MT76_STA_INFO_STATE_ASSOC : true;
|
||||
|
||||
return mt76_connac_mcu_sta_cmd(&dev->mphy, &info);
|
||||
@ -1190,7 +1190,7 @@ int mt7921_mcu_config_sniffer(struct mt792x_vif *vif,
|
||||
} __packed tlv;
|
||||
} __packed req = {
|
||||
.hdr = {
|
||||
.band_idx = vif->mt76.band_idx,
|
||||
.band_idx = vif->bss_conf.mt76.band_idx,
|
||||
},
|
||||
.tlv = {
|
||||
.tag = cpu_to_le16(1),
|
||||
@ -1251,7 +1251,7 @@ mt7921_mcu_uni_add_beacon_offload(struct mt792x_dev *dev,
|
||||
} __packed beacon_tlv;
|
||||
} req = {
|
||||
.hdr = {
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
},
|
||||
.beacon_tlv = {
|
||||
.tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT),
|
||||
@ -1460,7 +1460,7 @@ int mt7921_mcu_set_rssimonitor(struct mt792x_dev *dev, struct ieee80211_vif *vif
|
||||
.enable = vif->cfg.assoc,
|
||||
.cqm_rssi_high = vif->bss_conf.cqm_rssi_thold + vif->bss_conf.cqm_rssi_hyst,
|
||||
.cqm_rssi_low = vif->bss_conf.cqm_rssi_thold - vif->bss_conf.cqm_rssi_hyst,
|
||||
.bss_idx = mvif->mt76.idx,
|
||||
.bss_idx = mvif->bss_conf.mt76.idx,
|
||||
};
|
||||
|
||||
return mt76_mcu_send_msg(&dev->mt76, MCU_CE_CMD(RSSI_MONITOR),
|
||||
|
@ -339,6 +339,9 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
|
||||
bus_ops->rmw = mt7921_rmw;
|
||||
dev->mt76.bus = bus_ops;
|
||||
|
||||
if (!mt7921_disable_aspm && mt76_pci_aspm_supported(pdev))
|
||||
dev->aspm_supported = true;
|
||||
|
||||
ret = mt792xe_mcu_fw_pmctrl(dev);
|
||||
if (ret)
|
||||
goto err_free_dev;
|
||||
|
@ -34,9 +34,9 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
||||
if (sta) {
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
|
||||
if (time_after(jiffies, msta->last_txs + HZ / 4)) {
|
||||
if (time_after(jiffies, msta->deflink.last_txs + HZ / 4)) {
|
||||
info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
msta->last_txs = jiffies;
|
||||
msta->deflink.last_txs = jiffies;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -179,6 +179,12 @@ static void mt7925_init_work(struct work_struct *work)
|
||||
mt76_set_stream_caps(&dev->mphy, true);
|
||||
mt7925_set_stream_he_eht_caps(&dev->phy);
|
||||
|
||||
ret = mt7925_init_mlo_caps(&dev->phy);
|
||||
if (ret) {
|
||||
dev_err(dev->mt76.dev, "MLO init failed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = mt76_register_device(&dev->mt76, true, mt76_rates,
|
||||
ARRAY_SIZE(mt76_rates));
|
||||
if (ret) {
|
||||
|
@ -28,6 +28,7 @@ static void mt7925_mac_sta_poll(struct mt792x_dev *dev)
|
||||
};
|
||||
struct ieee80211_sta *sta;
|
||||
struct mt792x_sta *msta;
|
||||
struct mt792x_link_sta *mlink;
|
||||
u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
|
||||
LIST_HEAD(sta_poll_list);
|
||||
struct rate_info *rate;
|
||||
@ -46,24 +47,25 @@ static void mt7925_mac_sta_poll(struct mt792x_dev *dev)
|
||||
|
||||
if (list_empty(&sta_poll_list))
|
||||
break;
|
||||
msta = list_first_entry(&sta_poll_list,
|
||||
struct mt792x_sta, wcid.poll_list);
|
||||
mlink = list_first_entry(&sta_poll_list,
|
||||
struct mt792x_link_sta, wcid.poll_list);
|
||||
msta = container_of(mlink, struct mt792x_sta, deflink);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
list_del_init(&msta->wcid.poll_list);
|
||||
list_del_init(&mlink->wcid.poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
idx = msta->wcid.idx;
|
||||
idx = mlink->wcid.idx;
|
||||
addr = mt7925_mac_wtbl_lmac_addr(dev, idx, MT_WTBL_AC0_CTT_OFFSET);
|
||||
|
||||
for (i = 0; i < IEEE80211_NUM_ACS; i++) {
|
||||
u32 tx_last = msta->airtime_ac[i];
|
||||
u32 rx_last = msta->airtime_ac[i + 4];
|
||||
u32 tx_last = mlink->airtime_ac[i];
|
||||
u32 rx_last = mlink->airtime_ac[i + 4];
|
||||
|
||||
msta->airtime_ac[i] = mt76_rr(dev, addr);
|
||||
msta->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
|
||||
mlink->airtime_ac[i] = mt76_rr(dev, addr);
|
||||
mlink->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
|
||||
|
||||
tx_time[i] = msta->airtime_ac[i] - tx_last;
|
||||
rx_time[i] = msta->airtime_ac[i + 4] - rx_last;
|
||||
tx_time[i] = mlink->airtime_ac[i] - tx_last;
|
||||
rx_time[i] = mlink->airtime_ac[i + 4] - rx_last;
|
||||
|
||||
if ((tx_last | rx_last) & BIT(30))
|
||||
clear = true;
|
||||
@ -74,10 +76,10 @@ static void mt7925_mac_sta_poll(struct mt792x_dev *dev)
|
||||
if (clear) {
|
||||
mt7925_mac_wtbl_update(dev, idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
|
||||
memset(mlink->airtime_ac, 0, sizeof(mlink->airtime_ac));
|
||||
}
|
||||
|
||||
if (!msta->wcid.sta)
|
||||
if (!mlink->wcid.sta)
|
||||
continue;
|
||||
|
||||
sta = container_of((void *)msta, struct ieee80211_sta,
|
||||
@ -100,7 +102,7 @@ static void mt7925_mac_sta_poll(struct mt792x_dev *dev)
|
||||
* we need to make sure that flags match so polling GI
|
||||
* from per-sta counters directly.
|
||||
*/
|
||||
rate = &msta->wcid.rate;
|
||||
rate = &mlink->wcid.rate;
|
||||
|
||||
switch (rate->bw) {
|
||||
case RATE_INFO_BW_160:
|
||||
@ -144,10 +146,10 @@ static void mt7925_mac_sta_poll(struct mt792x_dev *dev)
|
||||
rssi[2] = to_rssi(GENMASK(23, 16), val);
|
||||
rssi[3] = to_rssi(GENMASK(31, 14), val);
|
||||
|
||||
msta->ack_signal =
|
||||
mlink->ack_signal =
|
||||
mt76_rx_signal(msta->vif->phy->mt76->antenna_mask, rssi);
|
||||
|
||||
ewma_avg_signal_add(&msta->avg_ack_signal, -msta->ack_signal);
|
||||
ewma_avg_signal_add(&mlink->avg_ack_signal, -mlink->ack_signal);
|
||||
}
|
||||
}
|
||||
|
||||
@ -365,7 +367,7 @@ mt7925_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
||||
u32 rxd2 = le32_to_cpu(rxd[2]);
|
||||
u32 rxd3 = le32_to_cpu(rxd[3]);
|
||||
u32 rxd4 = le32_to_cpu(rxd[4]);
|
||||
struct mt792x_sta *msta = NULL;
|
||||
struct mt792x_link_sta *mlink;
|
||||
u8 mode = 0; /* , band_idx; */
|
||||
u16 seq_ctrl = 0;
|
||||
__le16 fc = 0;
|
||||
@ -393,10 +395,10 @@ mt7925_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
|
||||
status->wcid = mt792x_rx_get_wcid(dev, idx, unicast);
|
||||
|
||||
if (status->wcid) {
|
||||
msta = container_of(status->wcid, struct mt792x_sta, wcid);
|
||||
mlink = container_of(status->wcid, struct mt792x_link_sta, wcid);
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
}
|
||||
@ -738,8 +740,12 @@ mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
|
||||
BSS_CHANGED_BEACON_ENABLED));
|
||||
bool inband_disc = !!(changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
|
||||
BSS_CHANGED_FILS_DISCOVERY));
|
||||
struct mt792x_bss_conf *mconf;
|
||||
|
||||
mconf = vif ? mt792x_vif_to_link((struct mt792x_vif *)vif->drv_priv,
|
||||
wcid->link_id) : NULL;
|
||||
mvif = mconf ? (struct mt76_vif *)&mconf->mt76 : NULL;
|
||||
|
||||
mvif = vif ? (struct mt76_vif *)vif->drv_priv : NULL;
|
||||
if (mvif) {
|
||||
omac_idx = mvif->omac_idx;
|
||||
wmm_idx = mvif->wmm_idx;
|
||||
@ -800,8 +806,10 @@ mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
|
||||
|
||||
txwi[5] = cpu_to_le32(val);
|
||||
|
||||
val = MT_TXD6_DIS_MAT | MT_TXD6_DAS |
|
||||
FIELD_PREP(MT_TXD6_MSDU_CNT, 1);
|
||||
val = MT_TXD6_DAS | FIELD_PREP(MT_TXD6_MSDU_CNT, 1);
|
||||
if (!ieee80211_vif_is_mld(vif) ||
|
||||
(q_idx >= MT_LMAC_ALTX0 && q_idx <= MT_LMAC_BCN0))
|
||||
val |= MT_TXD6_DIS_MAT;
|
||||
txwi[6] = cpu_to_le32(val);
|
||||
txwi[7] = 0;
|
||||
|
||||
@ -831,27 +839,53 @@ mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt7925_mac_write_txwi);
|
||||
|
||||
static void mt7925_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
|
||||
static void mt7925_tx_check_aggr(struct ieee80211_sta *sta, struct sk_buff *skb,
|
||||
struct mt76_wcid *wcid)
|
||||
{
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct mt792x_link_sta *mlink;
|
||||
struct mt792x_sta *msta;
|
||||
bool is_8023;
|
||||
u16 fc, tid;
|
||||
u32 val;
|
||||
|
||||
if (!sta || !(sta->deflink.ht_cap.ht_supported || sta->deflink.he_cap.has_he))
|
||||
link_sta = rcu_dereference(sta->link[wcid->link_id]);
|
||||
if (!link_sta)
|
||||
return;
|
||||
|
||||
tid = le32_get_bits(txwi[1], MT_TXD1_TID);
|
||||
if (tid >= 6) /* skip VO queue */
|
||||
if (!sta || !(link_sta->ht_cap.ht_supported || link_sta->he_cap.has_he))
|
||||
return;
|
||||
|
||||
val = le32_to_cpu(txwi[2]);
|
||||
fc = FIELD_GET(MT_TXD2_FRAME_TYPE, val) << 2 |
|
||||
FIELD_GET(MT_TXD2_SUB_TYPE, val) << 4;
|
||||
tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
|
||||
is_8023 = info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP;
|
||||
|
||||
if (is_8023) {
|
||||
fc = IEEE80211_FTYPE_DATA |
|
||||
(sta->wme ? IEEE80211_STYPE_QOS_DATA :
|
||||
IEEE80211_STYPE_DATA);
|
||||
} else {
|
||||
/* No need to get precise TID for Action/Management Frame,
|
||||
* since it will not meet the following Frame Control
|
||||
* condition anyway.
|
||||
*/
|
||||
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
fc = le16_to_cpu(hdr->frame_control) &
|
||||
(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
|
||||
}
|
||||
|
||||
if (unlikely(fc != (IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA)))
|
||||
return;
|
||||
|
||||
msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
if (!test_and_set_bit(tid, &msta->wcid.ampdu_state))
|
||||
|
||||
if (sta->mlo && msta->deflink_id != IEEE80211_LINK_UNSPECIFIED)
|
||||
mlink = rcu_dereference(msta->link[msta->deflink_id]);
|
||||
else
|
||||
mlink = &msta->deflink;
|
||||
|
||||
if (!test_and_set_bit(tid, &mlink->wcid.ampdu_state))
|
||||
ieee80211_start_tx_ba_session(sta, tid, 0);
|
||||
}
|
||||
|
||||
@ -991,7 +1025,7 @@ out_no_skb:
|
||||
|
||||
void mt7925_mac_add_txs(struct mt792x_dev *dev, void *data)
|
||||
{
|
||||
struct mt792x_sta *msta = NULL;
|
||||
struct mt792x_link_sta *mlink = NULL;
|
||||
struct mt76_wcid *wcid;
|
||||
__le32 *txs_data = data;
|
||||
u16 wcidx;
|
||||
@ -1015,15 +1049,15 @@ void mt7925_mac_add_txs(struct mt792x_dev *dev, void *data)
|
||||
if (!wcid)
|
||||
goto out;
|
||||
|
||||
msta = container_of(wcid, struct mt792x_sta, wcid);
|
||||
mlink = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
|
||||
mt7925_mac_add_txs_skb(dev, wcid, pid, txs_data);
|
||||
if (!wcid->sta)
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
out:
|
||||
@ -1031,7 +1065,7 @@ out:
|
||||
}
|
||||
|
||||
void mt7925_txwi_free(struct mt792x_dev *dev, struct mt76_txwi_cache *t,
|
||||
struct ieee80211_sta *sta, bool clear_status,
|
||||
struct ieee80211_sta *sta, struct mt76_wcid *wcid,
|
||||
struct list_head *free_list)
|
||||
{
|
||||
struct mt76_dev *mdev = &dev->mt76;
|
||||
@ -1044,10 +1078,8 @@ void mt7925_txwi_free(struct mt792x_dev *dev, struct mt76_txwi_cache *t,
|
||||
|
||||
txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t);
|
||||
if (sta) {
|
||||
struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
|
||||
|
||||
if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
|
||||
mt7925_tx_check_aggr(sta, txwi);
|
||||
mt7925_tx_check_aggr(sta, t->skb, wcid);
|
||||
|
||||
wcid_idx = wcid->idx;
|
||||
} else {
|
||||
@ -1094,7 +1126,7 @@ mt7925_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
||||
*/
|
||||
info = le32_to_cpu(*cur_info);
|
||||
if (info & MT_TXFREE_INFO_PAIR) {
|
||||
struct mt792x_sta *msta;
|
||||
struct mt792x_link_sta *mlink;
|
||||
u16 idx;
|
||||
|
||||
idx = FIELD_GET(MT_TXFREE_INFO_WLAN_ID, info);
|
||||
@ -1103,10 +1135,10 @@ mt7925_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
||||
if (!sta)
|
||||
continue;
|
||||
|
||||
msta = container_of(wcid, struct mt792x_sta, wcid);
|
||||
mlink = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
spin_lock_bh(&mdev->sta_poll_lock);
|
||||
if (list_empty(&msta->wcid.poll_list))
|
||||
list_add_tail(&msta->wcid.poll_list,
|
||||
if (list_empty(&mlink->wcid.poll_list))
|
||||
list_add_tail(&mlink->wcid.poll_list,
|
||||
&mdev->sta_poll_list);
|
||||
spin_unlock_bh(&mdev->sta_poll_lock);
|
||||
continue;
|
||||
@ -1132,7 +1164,7 @@ mt7925_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
|
||||
if (!txwi)
|
||||
continue;
|
||||
|
||||
mt7925_txwi_free(dev, txwi, sta, 0, &free_list);
|
||||
mt7925_txwi_free(dev, txwi, sta, wcid, &free_list);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1235,17 +1267,26 @@ mt7925_vif_connect_iter(void *priv, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
unsigned long valid = ieee80211_vif_is_mld(vif) ?
|
||||
mvif->valid_links : BIT(0);
|
||||
struct mt792x_dev *dev = mvif->phy->dev;
|
||||
struct ieee80211_hw *hw = mt76_hw(dev);
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
int i;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
ieee80211_disconnect(vif, true);
|
||||
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, true);
|
||||
mt7925_mcu_set_tx(dev, vif);
|
||||
for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
bss_conf = mt792x_vif_to_bss_conf(vif, i);
|
||||
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, bss_conf,
|
||||
&mvif->sta.deflink.wcid, true);
|
||||
mt7925_mcu_set_tx(dev, bss_conf);
|
||||
}
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_AP) {
|
||||
mt76_connac_mcu_uni_add_bss(dev->phy.mt76, vif, &mvif->sta.wcid,
|
||||
mt76_connac_mcu_uni_add_bss(dev->phy.mt76, vif, &mvif->sta.deflink.wcid,
|
||||
true, NULL);
|
||||
mt7925_mcu_sta_update(dev, NULL, vif, true,
|
||||
MT76_STA_INFO_STATE_NONE);
|
||||
@ -1380,9 +1421,9 @@ int mt7925_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
||||
if (sta) {
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
|
||||
if (time_after(jiffies, msta->last_txs + HZ / 4)) {
|
||||
if (time_after(jiffies, msta->deflink.last_txs + HZ / 4)) {
|
||||
info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
msta->last_txs = jiffies;
|
||||
msta->deflink.last_txs = jiffies;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1417,7 +1458,7 @@ void mt7925_usb_sdio_tx_complete_skb(struct mt76_dev *mdev,
|
||||
sta = wcid_to_sta(wcid);
|
||||
|
||||
if (sta && likely(e->skb->protocol != cpu_to_be16(ETH_P_PAE)))
|
||||
mt7925_tx_check_aggr(sta, txwi);
|
||||
mt76_connac2_tx_check_aggr(sta, txwi);
|
||||
|
||||
skb_pull(e->skb, headroom);
|
||||
mt76_tx_complete_skb(mdev, e->wcid, e->skb);
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -366,7 +366,10 @@ struct bss_mld_tlv {
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
u8 remap_idx;
|
||||
u8 link_id;
|
||||
u8 __rsv[2];
|
||||
u8 eml_enable;
|
||||
u8 max_link_num;
|
||||
u8 hybrid_mode;
|
||||
u8 __rsv[3];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_ba_uni {
|
||||
@ -440,6 +443,17 @@ struct sta_rec_mld {
|
||||
} __packed link[2];
|
||||
} __packed;
|
||||
|
||||
struct sta_rec_eht_mld {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 nsep;
|
||||
u8 mld_type;
|
||||
u8 __rsv1[1];
|
||||
u8 str_cap[3];
|
||||
u8 eml_cap[3];
|
||||
u8 __rsv2[3];
|
||||
} __packed;
|
||||
|
||||
struct bss_ifs_time_tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
@ -456,6 +470,21 @@ struct bss_ifs_time_tlv {
|
||||
__le16 eifs_cck_time;
|
||||
} __packed;
|
||||
|
||||
struct bss_rlm_tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 control_channel;
|
||||
u8 center_chan;
|
||||
u8 center_chan2;
|
||||
u8 bw;
|
||||
u8 tx_streams;
|
||||
u8 rx_streams;
|
||||
u8 ht_op_info;
|
||||
u8 sco;
|
||||
u8 band;
|
||||
u8 pad[3];
|
||||
} __packed;
|
||||
|
||||
#define MT7925_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \
|
||||
sizeof(struct sta_rec_basic) + \
|
||||
sizeof(struct sta_rec_bf) + \
|
||||
@ -474,7 +503,8 @@ struct bss_ifs_time_tlv {
|
||||
sizeof(struct sta_rec_eht) + \
|
||||
sizeof(struct sta_rec_hdr_trans) + \
|
||||
sizeof(struct sta_rec_mld) + \
|
||||
sizeof(struct tlv))
|
||||
sizeof(struct tlv) * 2 + \
|
||||
sizeof(struct sta_rec_remove))
|
||||
|
||||
#define MT7925_BSS_UPDATE_MAX_SIZE (sizeof(struct bss_req_hdr) + \
|
||||
sizeof(struct mt76_connac_bss_basic_tlv) + \
|
||||
@ -484,6 +514,7 @@ struct bss_ifs_time_tlv {
|
||||
sizeof(struct bss_info_uni_he) + \
|
||||
sizeof(struct bss_info_uni_bss_color) + \
|
||||
sizeof(struct bss_ifs_time_tlv) + \
|
||||
sizeof(struct bss_rlm_tlv) + \
|
||||
sizeof(struct tlv))
|
||||
|
||||
#define MT_CONNAC3_SKU_POWER_LIMIT 449
|
||||
@ -538,6 +569,26 @@ struct mt7925_wow_pattern_tlv {
|
||||
u8 rsv[7];
|
||||
} __packed;
|
||||
|
||||
struct roc_acquire_tlv {
|
||||
__le16 tag;
|
||||
__le16 len;
|
||||
u8 bss_idx;
|
||||
u8 tokenid;
|
||||
u8 control_channel;
|
||||
u8 sco;
|
||||
u8 band;
|
||||
u8 bw;
|
||||
u8 center_chan;
|
||||
u8 center_chan2;
|
||||
u8 bw_from_ap;
|
||||
u8 center_chan_from_ap;
|
||||
u8 center_chan2_from_ap;
|
||||
u8 reqtype;
|
||||
__le32 maxinterval;
|
||||
u8 dbdcband;
|
||||
u8 rsv[3];
|
||||
} __packed;
|
||||
|
||||
static inline enum connac3_mcu_cipher_type
|
||||
mt7925_mcu_get_cipher(int cipher)
|
||||
{
|
||||
@ -578,18 +629,18 @@ int mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
|
||||
bool enable);
|
||||
int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_link_sta *link_sta,
|
||||
int enable);
|
||||
int mt7925_mcu_set_timing(struct mt792x_phy *phy,
|
||||
struct ieee80211_vif *vif);
|
||||
struct ieee80211_bss_conf *link_conf);
|
||||
int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable);
|
||||
int mt7925_mcu_set_channel_domain(struct mt76_phy *phy);
|
||||
int mt7925_mcu_set_radio_en(struct mt792x_phy *phy, bool enable);
|
||||
int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy);
|
||||
int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
|
||||
struct mt76_vif *vif,
|
||||
struct ieee80211_bss_conf *info);
|
||||
struct ieee80211_bss_conf *link_conf);
|
||||
#endif
|
||||
|
@ -30,17 +30,22 @@
|
||||
enum {
|
||||
UNI_ROC_ACQUIRE,
|
||||
UNI_ROC_ABORT,
|
||||
UNI_ROC_SUB_LINK = 3,
|
||||
UNI_ROC_NUM
|
||||
};
|
||||
|
||||
enum mt7925_roc_req {
|
||||
MT7925_ROC_REQ_JOIN,
|
||||
MT7925_ROC_REQ_ROC,
|
||||
MT7925_ROC_REQ_SUB_LINK,
|
||||
MT7925_ROC_REQ_MLSR_AG = 10,
|
||||
MT7925_ROC_REQ_MLSR_AA,
|
||||
MT7925_ROC_REQ_NUM
|
||||
};
|
||||
|
||||
enum {
|
||||
UNI_EVENT_ROC_GRANT = 0,
|
||||
UNI_EVENT_ROC_GRANT_SUB_LINK = 4,
|
||||
UNI_EVENT_ROC_TAG_NUM
|
||||
};
|
||||
|
||||
@ -192,13 +197,15 @@ int __mt7925_start(struct mt792x_phy *phy);
|
||||
int mt7925_register_device(struct mt792x_dev *dev);
|
||||
void mt7925_unregister_device(struct mt792x_dev *dev);
|
||||
int mt7925_run_firmware(struct mt792x_dev *dev);
|
||||
int mt7925_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
|
||||
int mt7925_mcu_set_bss_pm(struct mt792x_dev *dev,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
bool enable);
|
||||
int mt7925_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
|
||||
int mt7925_mcu_sta_update(struct mt792x_dev *dev,
|
||||
struct ieee80211_link_sta *link_sta,
|
||||
struct ieee80211_vif *vif, bool enable,
|
||||
enum mt76_sta_info_state state);
|
||||
int mt7925_mcu_set_chan_info(struct mt792x_phy *phy, u16 tag);
|
||||
int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif);
|
||||
int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_bss_conf *bss_conf);
|
||||
int mt7925_mcu_set_eeprom(struct mt792x_dev *dev);
|
||||
int mt7925_mcu_get_rx_rate(struct mt792x_phy *phy, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct rate_info *rate);
|
||||
@ -228,6 +235,7 @@ void mt7925_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
|
||||
struct sk_buff *skb, u32 *info);
|
||||
void mt7925_stats_work(struct work_struct *work);
|
||||
void mt7925_set_stream_he_eht_caps(struct mt792x_phy *phy);
|
||||
int mt7925_init_mlo_caps(struct mt792x_phy *phy);
|
||||
int mt7925_init_debugfs(struct mt792x_dev *dev);
|
||||
|
||||
int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,
|
||||
@ -241,7 +249,8 @@ int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev,
|
||||
bool enable);
|
||||
void mt7925_scan_work(struct work_struct *work);
|
||||
void mt7925_roc_work(struct work_struct *work);
|
||||
int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif);
|
||||
int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev,
|
||||
struct ieee80211_bss_conf *link_conf);
|
||||
void mt7925_coredump_work(struct work_struct *work);
|
||||
int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx,
|
||||
struct mt7925_txpwr *txpwr);
|
||||
@ -252,7 +261,7 @@ void mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
|
||||
struct ieee80211_key_conf *key, int pid,
|
||||
enum mt76_txq_id qid, u32 changed);
|
||||
void mt7925_txwi_free(struct mt792x_dev *dev, struct mt76_txwi_cache *t,
|
||||
struct ieee80211_sta *sta, bool clear_status,
|
||||
struct ieee80211_sta *sta, struct mt76_wcid *wcid,
|
||||
struct list_head *free_list);
|
||||
int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
|
||||
struct sk_buff *skb, int seq);
|
||||
@ -291,20 +300,24 @@ int mt7925_set_tx_sar_pwr(struct ieee80211_hw *hw,
|
||||
int mt7925_mcu_regval(struct mt792x_dev *dev, u32 regidx, u32 *val, bool set);
|
||||
int mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
|
||||
enum environment_cap env_cap);
|
||||
int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
|
||||
int mt7925_mcu_set_mlo_roc(struct mt792x_bss_conf *mconf, u16 sel_links,
|
||||
int duration, u8 token_id);
|
||||
int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
|
||||
struct ieee80211_channel *chan, int duration,
|
||||
enum mt7925_roc_req type, u8 token_id);
|
||||
int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
|
||||
int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf,
|
||||
u8 token_id);
|
||||
int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb,
|
||||
int cmd, int *wait_seq);
|
||||
int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
|
||||
struct mt76_connac_sta_key_conf *sta_key_conf,
|
||||
struct ieee80211_key_conf *key, int mcu_cmd,
|
||||
struct mt76_wcid *wcid, enum set_key_cmd cmd);
|
||||
struct mt76_wcid *wcid, enum set_key_cmd cmd,
|
||||
struct mt792x_sta *msta);
|
||||
int mt7925_mcu_set_rts_thresh(struct mt792x_phy *phy, u32 val);
|
||||
int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
struct ieee80211_sta *sta,
|
||||
int link_id);
|
||||
|
||||
#endif
|
||||
|
@ -373,6 +373,9 @@ static int mt7925_pci_probe(struct pci_dev *pdev,
|
||||
bus_ops->rmw = mt7925_rmw;
|
||||
dev->mt76.bus = bus_ops;
|
||||
|
||||
if (!mt7925_disable_aspm && mt76_pci_aspm_supported(pdev))
|
||||
dev->aspm_supported = true;
|
||||
|
||||
ret = __mt792x_mcu_fw_pmctrl(dev);
|
||||
if (ret)
|
||||
goto err_free_dev;
|
||||
|
@ -34,9 +34,9 @@ int mt7925e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
|
||||
if (sta) {
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
|
||||
if (time_after(jiffies, msta->last_txs + HZ / 4)) {
|
||||
if (time_after(jiffies, msta->deflink.last_txs + HZ / 4)) {
|
||||
info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
|
||||
msta->last_txs = jiffies;
|
||||
msta->deflink.last_txs = jiffies;
|
||||
}
|
||||
}
|
||||
|
||||
@ -60,7 +60,7 @@ void mt7925_tx_token_put(struct mt792x_dev *dev)
|
||||
|
||||
spin_lock_bh(&dev->mt76.token_lock);
|
||||
idr_for_each_entry(&dev->mt76.token, txwi, id) {
|
||||
mt7925_txwi_free(dev, txwi, NULL, false, NULL);
|
||||
mt7925_txwi_free(dev, txwi, NULL, NULL, NULL);
|
||||
dev->mt76.token_count--;
|
||||
}
|
||||
spin_unlock_bh(&dev->mt76.token_lock);
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
#define MT792x_CHIP_CAP_CLC_EVT_EN BIT(0)
|
||||
#define MT792x_CHIP_CAP_RSSI_NOTIFY_EVT_EN BIT(1)
|
||||
#define MT792x_CHIP_CAP_MLO_EVT_EN BIT(2)
|
||||
|
||||
/* NOTE: used to map mt76_rates. idx may change if firmware expands table */
|
||||
#define MT792x_BASIC_RATES_TBL 11
|
||||
@ -81,11 +82,9 @@ enum mt792x_reg_power_type {
|
||||
|
||||
DECLARE_EWMA(avg_signal, 10, 8)
|
||||
|
||||
struct mt792x_sta {
|
||||
struct mt792x_link_sta {
|
||||
struct mt76_wcid wcid; /* must be first */
|
||||
|
||||
struct mt792x_vif *vif;
|
||||
|
||||
u32 airtime_ac[8];
|
||||
|
||||
int ack_signal;
|
||||
@ -94,21 +93,46 @@ struct mt792x_sta {
|
||||
unsigned long last_txs;
|
||||
|
||||
struct mt76_connac_sta_key_conf bip;
|
||||
|
||||
struct mt792x_sta *sta;
|
||||
|
||||
struct ieee80211_link_sta *pri_link;
|
||||
};
|
||||
|
||||
struct mt792x_sta {
|
||||
struct mt792x_link_sta deflink; /* must be first */
|
||||
struct mt792x_link_sta __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS];
|
||||
|
||||
struct mt792x_vif *vif;
|
||||
|
||||
u16 valid_links;
|
||||
u8 deflink_id;
|
||||
};
|
||||
|
||||
DECLARE_EWMA(rssi, 10, 8);
|
||||
|
||||
struct mt792x_vif {
|
||||
struct mt792x_chanctx {
|
||||
struct mt792x_bss_conf *bss_conf;
|
||||
};
|
||||
|
||||
struct mt792x_bss_conf {
|
||||
struct mt76_vif mt76; /* must be first */
|
||||
struct mt792x_vif *vif;
|
||||
struct ewma_rssi rssi;
|
||||
struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
|
||||
unsigned int link_id;
|
||||
};
|
||||
|
||||
struct mt792x_vif {
|
||||
struct mt792x_bss_conf bss_conf; /* must be first */
|
||||
struct mt792x_bss_conf __rcu *link_conf[IEEE80211_MLD_MAX_NUM_LINKS];
|
||||
|
||||
struct mt792x_sta sta;
|
||||
struct mt792x_sta *wep_sta;
|
||||
|
||||
struct mt792x_phy *phy;
|
||||
|
||||
struct ewma_rssi rssi;
|
||||
|
||||
struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
|
||||
u16 valid_links;
|
||||
u8 deflink_id;
|
||||
};
|
||||
|
||||
struct mt792x_phy {
|
||||
@ -140,6 +164,7 @@ struct mt792x_phy {
|
||||
#endif
|
||||
void *clc[MT792x_CLC_MAX_NUM];
|
||||
u64 chip_cap;
|
||||
u16 eml_cap;
|
||||
|
||||
struct work_struct roc_work;
|
||||
struct timer_list roc_timer;
|
||||
@ -190,6 +215,7 @@ struct mt792x_dev {
|
||||
bool fw_assert:1;
|
||||
bool has_eht:1;
|
||||
bool regd_in_progress:1;
|
||||
bool aspm_supported:1;
|
||||
wait_queue_head_t wait;
|
||||
|
||||
struct work_struct init_work;
|
||||
@ -211,6 +237,66 @@ struct mt792x_dev {
|
||||
u32 backup_l2;
|
||||
};
|
||||
|
||||
static inline struct mt792x_bss_conf *
|
||||
mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
|
||||
{
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
|
||||
|
||||
if (!ieee80211_vif_is_mld(vif) ||
|
||||
link_id >= IEEE80211_LINK_UNSPECIFIED)
|
||||
return &mvif->bss_conf;
|
||||
|
||||
return rcu_dereference_protected(mvif->link_conf[link_id],
|
||||
lockdep_is_held(&mvif->phy->dev->mt76.mutex));
|
||||
}
|
||||
|
||||
static inline struct mt792x_link_sta *
|
||||
mt792x_sta_to_link(struct mt792x_sta *msta, u8 link_id)
|
||||
{
|
||||
struct ieee80211_vif *vif;
|
||||
|
||||
vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
|
||||
|
||||
if (!ieee80211_vif_is_mld(vif) ||
|
||||
link_id >= IEEE80211_LINK_UNSPECIFIED)
|
||||
return &msta->deflink;
|
||||
|
||||
return rcu_dereference_protected(msta->link[link_id],
|
||||
lockdep_is_held(&msta->vif->phy->dev->mt76.mutex));
|
||||
}
|
||||
|
||||
static inline struct mt792x_bss_conf *
|
||||
mt792x_link_conf_to_mconf(struct ieee80211_bss_conf *link_conf)
|
||||
{
|
||||
struct ieee80211_vif *vif = link_conf->vif;
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
|
||||
return mt792x_vif_to_link(mvif, link_conf->link_id);
|
||||
}
|
||||
|
||||
static inline struct ieee80211_bss_conf *
|
||||
mt792x_vif_to_bss_conf(struct ieee80211_vif *vif, unsigned int link_id)
|
||||
{
|
||||
if (!ieee80211_vif_is_mld(vif) ||
|
||||
link_id >= IEEE80211_LINK_UNSPECIFIED)
|
||||
return &vif->bss_conf;
|
||||
|
||||
return link_conf_dereference_protected(vif, link_id);
|
||||
}
|
||||
|
||||
static inline struct ieee80211_link_sta *
|
||||
mt792x_sta_to_link_sta(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
unsigned int link_id)
|
||||
{
|
||||
if (!ieee80211_vif_is_mld(vif) ||
|
||||
link_id >= IEEE80211_LINK_UNSPECIFIED)
|
||||
return &sta->deflink;
|
||||
|
||||
return link_sta_dereference_protected(sta, link_id);
|
||||
}
|
||||
|
||||
static inline struct mt792x_dev *
|
||||
mt792x_hw_dev(struct ieee80211_hw *hw)
|
||||
{
|
||||
@ -325,6 +411,9 @@ mt792x_get_mac80211_ops(struct device *dev,
|
||||
int mt792x_init_wcid(struct mt792x_dev *dev);
|
||||
int mt792x_mcu_drv_pmctrl(struct mt792x_dev *dev);
|
||||
int mt792x_mcu_fw_pmctrl(struct mt792x_dev *dev);
|
||||
void mt792x_mac_link_bss_remove(struct mt792x_dev *dev,
|
||||
struct mt792x_bss_conf *mconf,
|
||||
struct mt792x_link_sta *mlink);
|
||||
|
||||
static inline char *mt792x_ram_name(struct mt792x_dev *dev)
|
||||
{
|
||||
|
@ -59,20 +59,42 @@ void mt792x_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_vif *vif = info->control.vif;
|
||||
struct mt76_wcid *wcid = &dev->mt76.global_wcid;
|
||||
u8 link_id;
|
||||
int qid;
|
||||
|
||||
if (control->sta) {
|
||||
struct mt792x_link_sta *mlink;
|
||||
struct mt792x_sta *sta;
|
||||
|
||||
link_id = u32_get_bits(info->control.flags,
|
||||
IEEE80211_TX_CTRL_MLO_LINK);
|
||||
sta = (struct mt792x_sta *)control->sta->drv_priv;
|
||||
wcid = &sta->wcid;
|
||||
mlink = mt792x_sta_to_link(sta, link_id);
|
||||
wcid = &mlink->wcid;
|
||||
}
|
||||
|
||||
if (vif && !control->sta) {
|
||||
struct mt792x_vif *mvif;
|
||||
|
||||
mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
wcid = &mvif->sta.wcid;
|
||||
wcid = &mvif->sta.deflink.wcid;
|
||||
}
|
||||
|
||||
if (vif && control->sta && ieee80211_vif_is_mld(vif)) {
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct ieee80211_bss_conf *conf;
|
||||
|
||||
link_id = wcid->link_id;
|
||||
rcu_read_lock();
|
||||
conf = rcu_dereference(vif->link_conf[link_id]);
|
||||
memcpy(hdr->addr2, conf->addr, ETH_ALEN);
|
||||
|
||||
link_sta = rcu_dereference(control->sta->link[link_id]);
|
||||
memcpy(hdr->addr1, link_sta->addr, ETH_ALEN);
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
memcpy(hdr->addr3, conf->bssid, ETH_ALEN);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
if (mt76_connac_pm_ref(mphy, &dev->pm)) {
|
||||
@ -113,31 +135,47 @@ void mt792x_stop(struct ieee80211_hw *hw, bool suspend)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_stop);
|
||||
|
||||
void mt792x_mac_link_bss_remove(struct mt792x_dev *dev,
|
||||
struct mt792x_bss_conf *mconf,
|
||||
struct mt792x_link_sta *mlink)
|
||||
{
|
||||
struct ieee80211_vif *vif = container_of((void *)mconf->vif,
|
||||
struct ieee80211_vif, drv_priv);
|
||||
struct ieee80211_bss_conf *link_conf;
|
||||
int idx = mlink->wcid.idx;
|
||||
|
||||
link_conf = mt792x_vif_to_bss_conf(vif, mconf->link_id);
|
||||
|
||||
mt76_connac_free_pending_tx_skbs(&dev->pm, &mlink->wcid);
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, link_conf, &mlink->wcid, false);
|
||||
|
||||
rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
|
||||
|
||||
dev->mt76.vif_mask &= ~BIT_ULL(mconf->mt76.idx);
|
||||
mconf->vif->phy->omac_mask &= ~BIT_ULL(mconf->mt76.omac_idx);
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (!list_empty(&mlink->wcid.poll_list))
|
||||
list_del_init(&mlink->wcid.poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
mt76_wcid_cleanup(&dev->mt76, &mlink->wcid);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_mac_link_bss_remove);
|
||||
|
||||
void mt792x_remove_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt792x_sta *msta = &mvif->sta;
|
||||
struct mt792x_dev *dev = mt792x_hw_dev(hw);
|
||||
struct mt792x_phy *phy = mt792x_hw_phy(hw);
|
||||
int idx = msta->wcid.idx;
|
||||
struct mt792x_bss_conf *mconf;
|
||||
|
||||
mt792x_mutex_acquire(dev);
|
||||
mt76_connac_free_pending_tx_skbs(&dev->pm, &msta->wcid);
|
||||
mt76_connac_mcu_uni_add_dev(&dev->mphy, vif, &mvif->sta.wcid, false);
|
||||
|
||||
rcu_assign_pointer(dev->mt76.wcid[idx], NULL);
|
||||
mconf = mt792x_link_conf_to_mconf(&vif->bss_conf);
|
||||
mt792x_mac_link_bss_remove(dev, mconf, &mvif->sta.deflink);
|
||||
|
||||
dev->mt76.vif_mask &= ~BIT_ULL(mvif->mt76.idx);
|
||||
phy->omac_mask &= ~BIT_ULL(mvif->mt76.omac_idx);
|
||||
mt792x_mutex_release(dev);
|
||||
|
||||
spin_lock_bh(&dev->mt76.sta_poll_lock);
|
||||
if (!list_empty(&msta->wcid.poll_list))
|
||||
list_del_init(&msta->wcid.poll_list);
|
||||
spin_unlock_bh(&dev->mt76.sta_poll_lock);
|
||||
|
||||
mt76_wcid_cleanup(&dev->mt76, &msta->wcid);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_remove_interface);
|
||||
|
||||
@ -149,7 +187,7 @@ int mt792x_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
|
||||
/* no need to update right away, we'll get BSS_CHANGED_QOS */
|
||||
queue = mt76_connac_lmac_mapping(queue);
|
||||
mvif->queue_params[queue] = *params;
|
||||
mvif->bss_conf.queue_params[queue] = *params;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -178,7 +216,7 @@ u64 mt792x_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt792x_dev *dev = mt792x_hw_dev(hw);
|
||||
u8 omac_idx = mvif->mt76.omac_idx;
|
||||
u8 omac_idx = mvif->bss_conf.mt76.omac_idx;
|
||||
union {
|
||||
u64 t64;
|
||||
u32 t32[2];
|
||||
@ -204,7 +242,7 @@ void mt792x_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
{
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt792x_dev *dev = mt792x_hw_dev(hw);
|
||||
u8 omac_idx = mvif->mt76.omac_idx;
|
||||
u8 omac_idx = mvif->bss_conf.mt76.omac_idx;
|
||||
union {
|
||||
u64 t64;
|
||||
u32 t32[2];
|
||||
@ -261,11 +299,13 @@ int mt792x_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
struct mt792x_chanctx *mctx = (struct mt792x_chanctx *)ctx->drv_priv;
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt792x_dev *dev = mt792x_hw_dev(hw);
|
||||
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
mvif->mt76.ctx = ctx;
|
||||
mvif->bss_conf.mt76.ctx = ctx;
|
||||
mctx->bss_conf = &mvif->bss_conf;
|
||||
mutex_unlock(&dev->mt76.mutex);
|
||||
|
||||
return 0;
|
||||
@ -277,11 +317,13 @@ void mt792x_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx)
|
||||
{
|
||||
struct mt792x_chanctx *mctx = (struct mt792x_chanctx *)ctx->drv_priv;
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct mt792x_dev *dev = mt792x_hw_dev(hw);
|
||||
|
||||
mutex_lock(&dev->mt76.mutex);
|
||||
mvif->mt76.ctx = NULL;
|
||||
mctx->bss_conf = NULL;
|
||||
mvif->bss_conf.mt76.ctx = NULL;
|
||||
mutex_unlock(&dev->mt76.mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_unassign_vif_chanctx);
|
||||
@ -405,10 +447,10 @@ mt792x_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
struct mt76_ethtool_worker_info *wi = wi_data;
|
||||
|
||||
if (msta->vif->mt76.idx != wi->idx)
|
||||
if (msta->vif->bss_conf.mt76.idx != wi->idx)
|
||||
return;
|
||||
|
||||
mt76_ethtool_worker(wi, &msta->wcid.stats, true);
|
||||
mt76_ethtool_worker(wi, &msta->deflink.wcid.stats, true);
|
||||
}
|
||||
|
||||
void mt792x_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
@ -421,7 +463,7 @@ void mt792x_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct mt76_mib_stats *mib = &phy->mib;
|
||||
struct mt76_ethtool_worker_info wi = {
|
||||
.data = data,
|
||||
.idx = mvif->mt76.idx,
|
||||
.idx = mvif->bss_conf.mt76.idx,
|
||||
};
|
||||
int i, ei = 0;
|
||||
|
||||
@ -487,7 +529,7 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
struct rate_info *txrate = &msta->wcid.rate;
|
||||
struct rate_info *txrate = &msta->deflink.wcid.rate;
|
||||
|
||||
if (!txrate->legacy && !txrate->flags)
|
||||
return;
|
||||
@ -502,19 +544,19 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw,
|
||||
sinfo->txrate.he_dcm = txrate->he_dcm;
|
||||
sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc;
|
||||
}
|
||||
sinfo->tx_failed = msta->wcid.stats.tx_failed;
|
||||
sinfo->tx_failed = msta->deflink.wcid.stats.tx_failed;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
|
||||
|
||||
sinfo->tx_retries = msta->wcid.stats.tx_retries;
|
||||
sinfo->tx_retries = msta->deflink.wcid.stats.tx_retries;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
|
||||
|
||||
sinfo->txrate.flags = txrate->flags;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
|
||||
|
||||
sinfo->ack_signal = (s8)msta->ack_signal;
|
||||
sinfo->ack_signal = (s8)msta->deflink.ack_signal;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
|
||||
|
||||
sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->avg_ack_signal);
|
||||
sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->deflink.avg_ack_signal);
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_sta_statistics);
|
||||
@ -556,6 +598,7 @@ int mt792x_init_wiphy(struct ieee80211_hw *hw)
|
||||
|
||||
hw->sta_data_size = sizeof(struct mt792x_sta);
|
||||
hw->vif_data_size = sizeof(struct mt792x_vif);
|
||||
hw->chanctx_data_size = sizeof(struct mt792x_chanctx);
|
||||
|
||||
if (dev->fw_features & MT792x_FW_CAP_CNM) {
|
||||
wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
|
||||
@ -766,6 +809,10 @@ int __mt792xe_mcu_drv_pmctrl(struct mt792x_dev *dev)
|
||||
|
||||
for (i = 0; i < MT792x_DRV_OWN_RETRY_COUNT; i++) {
|
||||
mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_CLR_OWN);
|
||||
|
||||
if (dev->aspm_supported)
|
||||
usleep_range(2000, 3000);
|
||||
|
||||
if (mt76_poll_msec_tick(dev, MT_CONN_ON_LPCTL,
|
||||
PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1))
|
||||
break;
|
||||
|
@ -138,6 +138,7 @@ EXPORT_SYMBOL_GPL(mt792x_mac_update_mib_stats);
|
||||
struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx,
|
||||
bool unicast)
|
||||
{
|
||||
struct mt792x_link_sta *link;
|
||||
struct mt792x_sta *sta;
|
||||
struct mt76_wcid *wcid;
|
||||
|
||||
@ -151,11 +152,12 @@ struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx,
|
||||
if (!wcid->sta)
|
||||
return NULL;
|
||||
|
||||
sta = container_of(wcid, struct mt792x_sta, wcid);
|
||||
link = container_of(wcid, struct mt792x_link_sta, wcid);
|
||||
sta = container_of(link, struct mt792x_sta, deflink);
|
||||
if (!sta->vif)
|
||||
return NULL;
|
||||
|
||||
return &sta->vif->sta.wcid;
|
||||
return &sta->vif->sta.deflink.wcid;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_rx_get_wcid);
|
||||
|
||||
@ -173,7 +175,7 @@ mt792x_mac_rssi_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
|
||||
if (!ether_addr_equal(vif->addr, hdr->addr1))
|
||||
return;
|
||||
|
||||
ewma_rssi_add(&mvif->rssi, -status->signal);
|
||||
ewma_rssi_add(&mvif->bss_conf.rssi, -status->signal);
|
||||
}
|
||||
|
||||
void mt792x_mac_assoc_rssi(struct mt792x_dev *dev, struct sk_buff *skb)
|
||||
|
@ -2002,7 +2002,7 @@ mt7996_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7996_dev *dev,
|
||||
|
||||
ra->valid = true;
|
||||
ra->auto_rate = true;
|
||||
ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, sta);
|
||||
ra->phy_mode = mt76_connac_get_phy_mode(mphy, vif, band, &sta->deflink);
|
||||
ra->channel = chandef->chan->hw_value;
|
||||
ra->bw = (sta->deflink.bandwidth == IEEE80211_STA_RX_BW_320) ?
|
||||
CMD_CBW_320MHZ : sta->deflink.bandwidth;
|
||||
@ -2157,11 +2157,13 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, bool enable, bool newly)
|
||||
{
|
||||
struct mt7996_vif *mvif = (struct mt7996_vif *)vif->drv_priv;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
struct mt7996_sta *msta;
|
||||
struct sk_buff *skb;
|
||||
int ret;
|
||||
|
||||
msta = sta ? (struct mt7996_sta *)sta->drv_priv : &mvif->sta;
|
||||
link_sta = sta ? &sta->deflink : NULL;
|
||||
|
||||
skb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
|
||||
&msta->wcid,
|
||||
@ -2170,7 +2172,8 @@ int mt7996_mcu_add_sta(struct mt7996_dev *dev, struct ieee80211_vif *vif,
|
||||
return PTR_ERR(skb);
|
||||
|
||||
/* starec basic */
|
||||
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, vif, sta, enable, newly);
|
||||
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, skb, vif, link_sta,
|
||||
enable, newly);
|
||||
|
||||
if (!enable)
|
||||
goto out;
|
||||
|
@ -45,3 +45,26 @@ void mt76_pci_disable_aspm(struct pci_dev *pdev)
|
||||
aspm_conf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_pci_disable_aspm);
|
||||
|
||||
bool mt76_pci_aspm_supported(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *parent = pdev->bus->self;
|
||||
u16 aspm_conf, parent_aspm_conf = 0;
|
||||
bool result = true;
|
||||
|
||||
pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &aspm_conf);
|
||||
aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
|
||||
if (parent) {
|
||||
pcie_capability_read_word(parent, PCI_EXP_LNKCTL,
|
||||
&parent_aspm_conf);
|
||||
parent_aspm_conf &= PCI_EXP_LNKCTL_ASPMC;
|
||||
}
|
||||
|
||||
if (!aspm_conf && (!parent || !parent_aspm_conf)) {
|
||||
/* aspm already disabled */
|
||||
result = false;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76_pci_aspm_supported);
|
||||
|
Loading…
x
Reference in New Issue
Block a user