Commit dabcfd5e authored by Kalle Valo's avatar Kalle Valo

Merge tag 'mt76-for-kvalo-2024-07-08' of https://github.com/nbd168/wireless

mt76 patches for 6.11

- mt7925 MLO support
- mt7925 fix
parents 408ac28c d53ab629
...@@ -1125,6 +1125,11 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb, ...@@ -1125,6 +1125,11 @@ mt76_rx_convert(struct mt76_dev *dev, struct sk_buff *skb,
memcpy(status->chain_signal, mstat.chain_signal, memcpy(status->chain_signal, mstat.chain_signal,
sizeof(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); *sta = wcid_to_sta(mstat.wcid);
*hw = mt76_phy_hw(dev, mstat.phy_idx); *hw = mt76_phy_hw(dev, mstat.phy_idx);
} }
......
...@@ -349,6 +349,8 @@ struct mt76_wcid { ...@@ -349,6 +349,8 @@ struct mt76_wcid {
u8 sta:1; u8 sta:1;
u8 amsdu:1; u8 amsdu:1;
u8 phy_idx:2; u8 phy_idx:2;
u8 link_id:4;
bool link_valid;
u8 rx_check_pn; u8 rx_check_pn;
u8 rx_key_pn[IEEE80211_NUM_TIDS + 1][6]; u8 rx_key_pn[IEEE80211_NUM_TIDS + 1][6];
...@@ -366,6 +368,8 @@ struct mt76_wcid { ...@@ -366,6 +368,8 @@ struct mt76_wcid {
struct mt76_sta_stats stats; struct mt76_sta_stats stats;
struct list_head poll_list; struct list_head poll_list;
struct mt76_wcid *def_wcid;
}; };
struct mt76_txq { struct mt76_txq {
...@@ -1081,6 +1085,7 @@ bool ____mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, ...@@ -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_mmio_init(struct mt76_dev *dev, void __iomem *regs);
void mt76_pci_disable_aspm(struct pci_dev *pdev); 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) static inline u16 mt76_chip(struct mt76_dev *dev)
{ {
...@@ -1256,6 +1261,9 @@ wcid_to_sta(struct mt76_wcid *wcid) ...@@ -1256,6 +1261,9 @@ wcid_to_sta(struct mt76_wcid *wcid)
if (!wcid || !wcid->sta) if (!wcid || !wcid->sta)
return NULL; return NULL;
if (wcid->def_wcid)
ptr = wcid->def_wcid;
return container_of(ptr, struct ieee80211_sta, drv_priv); 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, ...@@ -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 mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
struct sk_buff *skb, *sskb, *wskb = NULL; struct sk_buff *skb, *sskb, *wskb = NULL;
struct ieee80211_link_sta *link_sta;
struct mt7615_dev *dev = phy->dev; struct mt7615_dev *dev = phy->dev;
struct wtbl_req_hdr *wtbl_hdr; struct wtbl_req_hdr *wtbl_hdr;
struct mt7615_sta *msta; struct mt7615_sta *msta;
...@@ -849,6 +850,7 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif, ...@@ -849,6 +850,7 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
int cmd, err; int cmd, err;
msta = sta ? (struct mt7615_sta *)sta->drv_priv : &mvif->sta; 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, sskb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
&msta->wcid); &msta->wcid);
...@@ -861,8 +863,8 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif, ...@@ -861,8 +863,8 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,
else else
mvif->sta_added = true; mvif->sta_added = true;
} }
mt76_connac_mcu_sta_basic_tlv(&dev->mt76, sskb, vif, sta, enable, mt76_connac_mcu_sta_basic_tlv(&dev->mt76, sskb, vif, link_sta,
new_entry); enable, new_entry);
if (enable && sta) if (enable && sta)
mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0, mt76_connac_mcu_sta_tlv(phy->mt76, sskb, sta, vif, 0,
MT76_STA_INFO_STATE_ASSOC); MT76_STA_INFO_STATE_ASSOC);
...@@ -1109,8 +1111,8 @@ mt7615_mcu_uni_add_dev(struct mt7615_phy *phy, struct ieee80211_vif *vif, ...@@ -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; struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;
return mt76_connac_mcu_uni_add_dev(phy->mt76, vif, &mvif->sta.wcid, return mt76_connac_mcu_uni_add_dev(phy->mt76, &vif->bss_conf,
enable); &mvif->sta.wcid, enable);
} }
static int static int
......
...@@ -370,7 +370,7 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_bss_omac_tlv); ...@@ -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, void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, struct ieee80211_link_sta *link_sta,
bool enable, bool newly) bool enable, bool newly)
{ {
struct sta_rec_basic *basic; struct sta_rec_basic *basic;
...@@ -390,7 +390,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb, ...@@ -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; basic->conn_state = CONN_STATE_DISCONNECT;
} }
if (!sta) { if (!link_sta) {
basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC); basic->conn_type = cpu_to_le32(CONNECTION_INFRA_BC);
if (vif->type == NL80211_IFTYPE_STATION && 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, ...@@ -411,7 +411,7 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
else else
conn_type = CONNECTION_INFRA_STA; conn_type = CONNECTION_INFRA_STA;
basic->conn_type = cpu_to_le32(conn_type); 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; break;
case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_STATION:
if (vif->p2p && !is_mt7921(dev)) 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, ...@@ -423,15 +423,15 @@ void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
break; break;
case NL80211_IFTYPE_ADHOC: case NL80211_IFTYPE_ADHOC:
basic->conn_type = cpu_to_le32(CONNECTION_IBSS_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; break;
default: default:
WARN_ON(1); WARN_ON(1);
break; break;
} }
memcpy(basic->peer_addr, sta->addr, ETH_ALEN); memcpy(basic->peer_addr, link_sta->addr, ETH_ALEN);
basic->qos = sta->wme; basic->qos = link_sta->sta->wme;
} }
EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv); EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_basic_tlv);
...@@ -793,7 +793,8 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2); ...@@ -793,7 +793,8 @@ EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_he_tlv_v2);
u8 u8
mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif, 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_ht_cap *ht_cap;
struct ieee80211_sta_vht_cap *vht_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, ...@@ -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; const struct ieee80211_sta_eht_cap *eht_cap;
u8 mode = 0; u8 mode = 0;
if (sta) { if (link_sta) {
ht_cap = &sta->deflink.ht_cap; ht_cap = &link_sta->ht_cap;
vht_cap = &sta->deflink.vht_cap; vht_cap = &link_sta->vht_cap;
he_cap = &sta->deflink.he_cap; he_cap = &link_sta->he_cap;
eht_cap = &sta->deflink.eht_cap; eht_cap = &link_sta->eht_cap;
} else { } else {
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
...@@ -911,7 +912,8 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb, ...@@ -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)); tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_PHY, sizeof(*phy));
phy = (struct sta_rec_phy *)tlv; 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->basic_rate = cpu_to_le16((u16)vif->bss_conf.basic_rates);
phy->rcpi = rcpi; phy->rcpi = rcpi;
phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR, phy->ampdu = FIELD_PREP(IEEE80211_HT_AMPDU_PARM_FACTOR,
...@@ -1044,6 +1046,7 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy, ...@@ -1044,6 +1046,7 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
struct mt76_sta_cmd_info *info) struct mt76_sta_cmd_info *info)
{ {
struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv; struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;
struct ieee80211_link_sta *link_sta;
struct mt76_dev *dev = phy->dev; struct mt76_dev *dev = phy->dev;
struct wtbl_req_hdr *wtbl_hdr; struct wtbl_req_hdr *wtbl_hdr;
struct tlv *sta_wtbl; struct tlv *sta_wtbl;
...@@ -1053,9 +1056,11 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy, ...@@ -1053,9 +1056,11 @@ int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
if (IS_ERR(skb)) if (IS_ERR(skb))
return PTR_ERR(skb); return PTR_ERR(skb);
link_sta = info->sta ? &info->sta->deflink : NULL;
if (info->sta || !info->offload_fw) if (info->sta || !info->offload_fw)
mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif, info->sta, mt76_connac_mcu_sta_basic_tlv(dev, skb, info->vif,
info->enable, info->newly); link_sta, info->enable,
info->newly);
if (info->sta && info->enable) if (info->sta && info->enable)
mt76_connac_mcu_sta_tlv(phy, skb, info->sta, mt76_connac_mcu_sta_tlv(phy, skb, info->sta,
info->vif, info->rcpi, info->vif, info->rcpi,
...@@ -1132,11 +1137,11 @@ void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb, ...@@ -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); EXPORT_SYMBOL_GPL(mt76_connac_mcu_wtbl_ba_tlv);
int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, 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, struct mt76_wcid *wcid,
bool enable) 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 mt76_dev *dev = phy->dev;
struct { struct {
struct { struct {
...@@ -1148,7 +1153,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, ...@@ -1148,7 +1153,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
__le16 tag; __le16 tag;
__le16 len; __le16 len;
u8 active; u8 active;
u8 pad; u8 link_idx; /* not link_id */
u8 omac_addr[ETH_ALEN]; u8 omac_addr[ETH_ALEN];
} __packed tlv; } __packed tlv;
} dev_req = { } dev_req = {
...@@ -1160,6 +1165,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, ...@@ -1160,6 +1165,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
.tag = cpu_to_le16(DEV_INFO_ACTIVE), .tag = cpu_to_le16(DEV_INFO_ACTIVE),
.len = cpu_to_le16(sizeof(struct req_tlv)), .len = cpu_to_le16(sizeof(struct req_tlv)),
.active = enable, .active = enable,
.link_idx = mvif->idx,
}, },
}; };
struct { struct {
...@@ -1182,12 +1188,13 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, ...@@ -1182,12 +1188,13 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
.bmc_tx_wlan_idx = cpu_to_le16(wcid->idx), .bmc_tx_wlan_idx = cpu_to_le16(wcid->idx),
.sta_idx = cpu_to_le16(wcid->idx), .sta_idx = cpu_to_le16(wcid->idx),
.conn_state = 1, .conn_state = 1,
.link_idx = mvif->idx,
}, },
}; };
int err, idx, cmd, len; int err, idx, cmd, len;
void *data; void *data;
switch (vif->type) { switch (bss_conf->vif->type) {
case NL80211_IFTYPE_MESH_POINT: case NL80211_IFTYPE_MESH_POINT:
case NL80211_IFTYPE_MONITOR: case NL80211_IFTYPE_MONITOR:
case NL80211_IFTYPE_AP: case NL80211_IFTYPE_AP:
...@@ -1207,7 +1214,7 @@ int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, ...@@ -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; idx = mvif->omac_idx > EXT_BSSID_START ? HW_BSSID_0 : mvif->omac_idx;
basic_req.basic.hw_bss_idx = 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); cmd = enable ? MCU_UNI_CMD(DEV_INFO_UPDATE) : MCU_UNI_CMD(BSS_INFO_UPDATE);
data = enable ? (void *)&dev_req : (void *)&basic_req; 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, ...@@ -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); EXPORT_SYMBOL_GPL(mt76_connac_mcu_sta_ba);
u8 mt76_connac_get_phy_mode(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 *link_sta)
{ {
struct mt76_dev *dev = phy->dev; struct mt76_dev *dev = phy->dev;
const struct ieee80211_sta_he_cap *he_cap; 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, ...@@ -1316,10 +1324,10 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
if (is_connac_v1(dev)) if (is_connac_v1(dev))
return 0x38; return 0x38;
if (sta) { if (link_sta) {
ht_cap = &sta->deflink.ht_cap; ht_cap = &link_sta->ht_cap;
vht_cap = &sta->deflink.vht_cap; vht_cap = &link_sta->vht_cap;
he_cap = &sta->deflink.he_cap; he_cap = &link_sta->he_cap;
} else { } else {
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
......
...@@ -545,6 +545,13 @@ struct sta_rec_muru { ...@@ -545,6 +545,13 @@ struct sta_rec_muru {
} mimo_ul; } mimo_ul;
} __packed; } __packed;
struct sta_rec_remove {
__le16 tag;
__le16 len;
u8 action;
u8 pad[3];
} __packed;
struct sta_phy { struct sta_phy {
u8 type; u8 type;
u8 flag; u8 flag;
...@@ -813,7 +820,10 @@ enum { ...@@ -813,7 +820,10 @@ enum {
STA_REC_HE_6G = 0x17, STA_REC_HE_6G = 0x17,
STA_REC_HE_V2 = 0x19, STA_REC_HE_V2 = 0x19,
STA_REC_MLD = 0x20, STA_REC_MLD = 0x20,
STA_REC_EHT_MLD = 0x21,
STA_REC_EHT = 0x22, STA_REC_EHT = 0x22,
STA_REC_MLD_OFF = 0x23,
STA_REC_REMOVE = 0x25,
STA_REC_PN_INFO = 0x26, STA_REC_PN_INFO = 0x26,
STA_REC_KEY_V3 = 0x27, STA_REC_KEY_V3 = 0x27,
STA_REC_HDRT = 0x28, STA_REC_HDRT = 0x28,
...@@ -1392,6 +1402,7 @@ enum { ...@@ -1392,6 +1402,7 @@ enum {
MT_NIC_CAP_WFDMA_REALLOC, MT_NIC_CAP_WFDMA_REALLOC,
MT_NIC_CAP_6G, MT_NIC_CAP_6G,
MT_NIC_CAP_CHIP_CAP = 0x20, MT_NIC_CAP_CHIP_CAP = 0x20,
MT_NIC_CAP_EML_CAP = 0x22,
}; };
#define UNI_WOW_DETECT_TYPE_MAGIC BIT(0) #define UNI_WOW_DETECT_TYPE_MAGIC BIT(0)
...@@ -1443,7 +1454,7 @@ struct mt76_connac_bss_basic_tlv { ...@@ -1443,7 +1454,7 @@ struct mt76_connac_bss_basic_tlv {
__le16 sta_idx; __le16 sta_idx;
__le16 nonht_basic_phy; __le16 nonht_basic_phy;
u8 phymode_ext; /* bit(0) AX_6G */ u8 phymode_ext; /* bit(0) AX_6G */
u8 pad[1]; u8 link_idx;
} __packed; } __packed;
struct mt76_connac_bss_qos_tlv { struct mt76_connac_bss_qos_tlv {
...@@ -1733,7 +1744,10 @@ enum mt76_sta_info_state { ...@@ -1733,7 +1744,10 @@ enum mt76_sta_info_state {
}; };
struct mt76_sta_cmd_info { 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 mt76_wcid *wcid;
struct ieee80211_vif *vif; struct ieee80211_vif *vif;
...@@ -1883,8 +1897,8 @@ int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy); ...@@ -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); 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, void mt76_connac_mcu_sta_basic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, bool enable, struct ieee80211_link_sta *link_sta,
bool newly); bool enable, bool newly);
void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb, void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, void *sta_wtbl, struct ieee80211_sta *sta, void *sta_wtbl,
...@@ -1898,7 +1912,8 @@ int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev, ...@@ -1898,7 +1912,8 @@ int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
struct mt76_wcid *wcid, int cmd); struct mt76_wcid *wcid, int cmd);
void mt76_connac_mcu_sta_he_tlv_v2(struct sk_buff *skb, struct ieee80211_sta *sta); 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, 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, int mt76_connac_mcu_wtbl_update_hdr_trans(struct mt76_dev *dev,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta); struct ieee80211_sta *sta);
...@@ -1917,7 +1932,7 @@ void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb, ...@@ -1917,7 +1932,7 @@ void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
struct ieee80211_ampdu_params *params, struct ieee80211_ampdu_params *params,
bool enable, bool tx); bool enable, bool tx);
int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy, 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, struct mt76_wcid *wcid,
bool enable); bool enable);
int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif, 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); ...@@ -1992,7 +2007,8 @@ mt76_connac_get_he_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif);
const struct ieee80211_sta_eht_cap * const struct ieee80211_sta_eht_cap *
mt76_connac_get_eht_phy_cap(struct mt76_phy *phy, struct ieee80211_vif *vif); 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, 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, u8 mt76_connac_get_phy_mode_ext(struct mt76_phy *phy, struct ieee80211_vif *vif,
enum nl80211_band band); enum nl80211_band band);
......
...@@ -1503,7 +1503,7 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev, ...@@ -1503,7 +1503,7 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
ra->valid = true; ra->valid = true;
ra->auto_rate = 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->channel = chandef->chan->hw_value;
ra->bw = sta->deflink.bandwidth; ra->bw = sta->deflink.bandwidth;
ra->phy.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, ...@@ -1656,11 +1656,13 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, bool enable) struct ieee80211_sta *sta, bool enable)
{ {
struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv; struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
struct ieee80211_link_sta *link_sta;
struct mt7915_sta *msta; struct mt7915_sta *msta;
struct sk_buff *skb; struct sk_buff *skb;
int ret; int ret;
msta = sta ? (struct mt7915_sta *)sta->drv_priv : &mvif->sta; 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, skb = mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76,
&msta->wcid); &msta->wcid);
...@@ -1668,7 +1670,7 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif, ...@@ -1668,7 +1670,7 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
return PTR_ERR(skb); return PTR_ERR(skb);
/* starec basic */ /* 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])); !rcu_access_pointer(dev->mt76.wcid[msta->wcid.idx]));
if (!enable) if (!enable)
goto out; goto out;
......
...@@ -39,6 +39,7 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev) ...@@ -39,6 +39,7 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
}; };
struct ieee80211_sta *sta; struct ieee80211_sta *sta;
struct mt792x_sta *msta; struct mt792x_sta *msta;
struct mt792x_link_sta *mlink;
u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS]; u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
LIST_HEAD(sta_poll_list); LIST_HEAD(sta_poll_list);
struct rate_info *rate; struct rate_info *rate;
...@@ -60,23 +61,25 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev) ...@@ -60,23 +61,25 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
spin_unlock_bh(&dev->mt76.sta_poll_lock); spin_unlock_bh(&dev->mt76.sta_poll_lock);
break; break;
} }
msta = list_first_entry(&sta_poll_list, mlink = list_first_entry(&sta_poll_list,
struct mt792x_sta, wcid.poll_list); struct mt792x_link_sta,
list_del_init(&msta->wcid.poll_list); 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); 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); addr = mt7921_mac_wtbl_lmac_addr(idx, MT_WTBL_AC0_CTT_OFFSET);
for (i = 0; i < IEEE80211_NUM_ACS; i++) { for (i = 0; i < IEEE80211_NUM_ACS; i++) {
u32 tx_last = msta->airtime_ac[i]; u32 tx_last = mlink->airtime_ac[i];
u32 rx_last = msta->airtime_ac[i + 4]; u32 rx_last = mlink->airtime_ac[i + 4];
msta->airtime_ac[i] = mt76_rr(dev, addr); mlink->airtime_ac[i] = mt76_rr(dev, addr);
msta->airtime_ac[i + 4] = mt76_rr(dev, addr + 4); mlink->airtime_ac[i + 4] = mt76_rr(dev, addr + 4);
tx_time[i] = msta->airtime_ac[i] - tx_last; tx_time[i] = mlink->airtime_ac[i] - tx_last;
rx_time[i] = msta->airtime_ac[i + 4] - rx_last; rx_time[i] = mlink->airtime_ac[i + 4] - rx_last;
if ((tx_last | rx_last) & BIT(30)) if ((tx_last | rx_last) & BIT(30))
clear = true; clear = true;
...@@ -87,10 +90,10 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev) ...@@ -87,10 +90,10 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
if (clear) { if (clear) {
mt7921_mac_wtbl_update(dev, idx, mt7921_mac_wtbl_update(dev, idx,
MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 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; continue;
sta = container_of((void *)msta, struct ieee80211_sta, sta = container_of((void *)msta, struct ieee80211_sta,
...@@ -113,7 +116,7 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev) ...@@ -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 * we need to make sure that flags match so polling GI
* from per-sta counters directly. * from per-sta counters directly.
*/ */
rate = &msta->wcid.rate; rate = &mlink->wcid.rate;
addr = mt7921_mac_wtbl_lmac_addr(idx, addr = mt7921_mac_wtbl_lmac_addr(idx,
MT_WTBL_TXRX_CAP_RATE_OFFSET); MT_WTBL_TXRX_CAP_RATE_OFFSET);
val = mt76_rr(dev, addr); val = mt76_rr(dev, addr);
...@@ -154,10 +157,10 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev) ...@@ -154,10 +157,10 @@ static void mt7921_mac_sta_poll(struct mt792x_dev *dev)
rssi[2] = to_rssi(GENMASK(23, 16), val); rssi[2] = to_rssi(GENMASK(23, 16), val);
rssi[3] = to_rssi(GENMASK(31, 14), 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); 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) ...@@ -180,6 +183,7 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb)
u32 rxd3 = le32_to_cpu(rxd[3]); u32 rxd3 = le32_to_cpu(rxd[3]);
u32 rxd4 = le32_to_cpu(rxd[4]); u32 rxd4 = le32_to_cpu(rxd[4]);
struct mt792x_sta *msta = NULL; struct mt792x_sta *msta = NULL;
struct mt792x_link_sta *mlink;
u16 seq_ctrl = 0; u16 seq_ctrl = 0;
__le16 fc = 0; __le16 fc = 0;
u8 mode = 0; u8 mode = 0;
...@@ -210,10 +214,11 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb) ...@@ -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); status->wcid = mt792x_rx_get_wcid(dev, idx, unicast);
if (status->wcid) { 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); spin_lock_bh(&dev->mt76.sta_poll_lock);
if (list_empty(&msta->wcid.poll_list)) if (list_empty(&mlink->wcid.poll_list))
list_add_tail(&msta->wcid.poll_list, list_add_tail(&mlink->wcid.poll_list,
&dev->mt76.sta_poll_list); &dev->mt76.sta_poll_list);
spin_unlock_bh(&dev->mt76.sta_poll_lock); spin_unlock_bh(&dev->mt76.sta_poll_lock);
} }
...@@ -444,7 +449,7 @@ mt7921_mac_fill_rx(struct mt792x_dev *dev, struct sk_buff *skb) ...@@ -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) 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; struct mt76_wcid *wcid;
__le32 *txs_data = data; __le32 *txs_data = data;
u16 wcidx; u16 wcidx;
...@@ -468,15 +473,15 @@ void mt7921_mac_add_txs(struct mt792x_dev *dev, void *data) ...@@ -468,15 +473,15 @@ void mt7921_mac_add_txs(struct mt792x_dev *dev, void *data)
if (!wcid) if (!wcid)
goto out; 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); mt76_connac2_mac_add_txs_skb(&dev->mt76, wcid, pid, txs_data);
if (!wcid->sta) if (!wcid->sta)
goto out; goto out;
spin_lock_bh(&dev->mt76.sta_poll_lock); spin_lock_bh(&dev->mt76.sta_poll_lock);
if (list_empty(&msta->wcid.poll_list)) if (list_empty(&mlink->wcid.poll_list))
list_add_tail(&msta->wcid.poll_list, &dev->mt76.sta_poll_list); list_add_tail(&mlink->wcid.poll_list, &dev->mt76.sta_poll_list);
spin_unlock_bh(&dev->mt76.sta_poll_lock); spin_unlock_bh(&dev->mt76.sta_poll_lock);
out: out:
...@@ -513,7 +518,7 @@ static void mt7921_mac_tx_free(struct mt792x_dev *dev, void *data, int len) ...@@ -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. * 1'b0: msdu_id with the same 'wcid pair' as above.
*/ */
if (info & MT_TX_FREE_PAIR) { if (info & MT_TX_FREE_PAIR) {
struct mt792x_sta *msta; struct mt792x_link_sta *mlink;
u16 idx; u16 idx;
count++; count++;
...@@ -523,10 +528,10 @@ static void mt7921_mac_tx_free(struct mt792x_dev *dev, void *data, int len) ...@@ -523,10 +528,10 @@ static void mt7921_mac_tx_free(struct mt792x_dev *dev, void *data, int len)
if (!sta) if (!sta)
continue; 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); spin_lock_bh(&mdev->sta_poll_lock);
if (list_empty(&msta->wcid.poll_list)) if (list_empty(&mlink->wcid.poll_list))
list_add_tail(&msta->wcid.poll_list, list_add_tail(&mlink->wcid.poll_list,
&mdev->sta_poll_list); &mdev->sta_poll_list);
spin_unlock_bh(&mdev->sta_poll_lock); spin_unlock_bh(&mdev->sta_poll_lock);
continue; continue;
...@@ -641,11 +646,12 @@ mt7921_vif_connect_iter(void *priv, u8 *mac, ...@@ -641,11 +646,12 @@ mt7921_vif_connect_iter(void *priv, u8 *mac,
if (vif->type == NL80211_IFTYPE_STATION) if (vif->type == NL80211_IFTYPE_STATION)
ieee80211_disconnect(vif, true); 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); mt7921_mcu_set_tx(dev, vif);
if (vif->type == NL80211_IFTYPE_AP) { 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); true, NULL);
mt7921_mcu_sta_update(dev, NULL, vif, true, mt7921_mcu_sta_update(dev, NULL, vif, true,
MT76_STA_INFO_STATE_NONE); MT76_STA_INFO_STATE_NONE);
...@@ -786,9 +792,9 @@ int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -786,9 +792,9 @@ int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
if (sta) { if (sta) {
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; 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; info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
msta->last_txs = jiffies; msta->deflink.last_txs = jiffies;
} }
} }
......
...@@ -105,7 +105,7 @@ mt7921_mcu_set_ipv6_ns_filter(struct mt76_dev *dev, ...@@ -105,7 +105,7 @@ mt7921_mcu_set_ipv6_ns_filter(struct mt76_dev *dev,
struct mt76_connac_arpns_tlv arpns; struct mt76_connac_arpns_tlv arpns;
} req = { } req = {
.hdr = { .hdr = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
}, },
.arpns = { .arpns = {
.tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ND), .tag = cpu_to_le16(UNI_OFFLOAD_OFFLOAD_ND),
...@@ -260,7 +260,7 @@ mt7921_mcu_rssi_monitor_iter(void *priv, u8 *mac, ...@@ -260,7 +260,7 @@ mt7921_mcu_rssi_monitor_iter(void *priv, u8 *mac,
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv; struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
struct mt76_connac_rssi_notify_event *event = priv; struct mt76_connac_rssi_notify_event *event = priv;
enum nl80211_cqm_rssi_threshold_event nl_event; 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) if (!rssi)
return; return;
...@@ -386,9 +386,9 @@ int mt7921_mcu_uni_tx_ba(struct mt792x_dev *dev, ...@@ -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; struct mt792x_sta *msta = (struct mt792x_sta *)params->sta->drv_priv;
if (enable && !params->amsdu) 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), MCU_UNI_CMD(STA_REC_UPDATE),
enable, true); enable, true);
} }
...@@ -399,7 +399,7 @@ int mt7921_mcu_uni_rx_ba(struct mt792x_dev *dev, ...@@ -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; 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), MCU_UNI_CMD(STA_REC_UPDATE),
enable, false); enable, false);
} }
...@@ -678,9 +678,9 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif) ...@@ -678,9 +678,9 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
u8 wmm_idx; u8 wmm_idx;
u8 pad; u8 pad;
} __packed req = { } __packed req = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
.qos = vif->bss_conf.qos, .qos = vif->bss_conf.qos,
.wmm_idx = mvif->mt76.wmm_idx, .wmm_idx = mvif->bss_conf.mt76.wmm_idx,
}; };
struct mu_edca { struct mu_edca {
u8 cw_min; u8 cw_min;
...@@ -701,15 +701,15 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif) ...@@ -701,15 +701,15 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif)
struct mu_edca edca[IEEE80211_NUM_ACS]; struct mu_edca edca[IEEE80211_NUM_ACS];
u8 pad3[32]; u8 pad3[32];
} __packed req_mu = { } __packed req_mu = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
.qos = vif->bss_conf.qos, .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 }; static const int to_aci[] = { 1, 0, 2, 3 };
int ac, ret; int ac, ret;
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 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]]; struct edca *e = &req.edca[to_aci[ac]];
e->aifs = cpu_to_le16(q->aifs); e->aifs = cpu_to_le16(q->aifs);
...@@ -738,10 +738,10 @@ int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif) ...@@ -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 ieee80211_he_mu_edca_param_ac_rec *q;
struct mu_edca *e; struct mu_edca *e;
if (!mvif->queue_params[ac].mu_edca) if (!mvif->bss_conf.queue_params[ac].mu_edca)
break; 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 = &(req_mu.edca[to_aci[ac]]);
e->cw_min = q->ecw_min_max & 0xf; 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, ...@@ -790,7 +790,7 @@ int mt7921_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
.tokenid = token_id, .tokenid = token_id,
.reqtype = type, .reqtype = type,
.maxinterval = cpu_to_le32(duration), .maxinterval = cpu_to_le32(duration),
.bss_idx = vif->mt76.idx, .bss_idx = vif->bss_conf.mt76.idx,
.control_channel = chan->hw_value, .control_channel = chan->hw_value,
.bw = CMD_CBW_20MHZ, .bw = CMD_CBW_20MHZ,
.bw_from_ap = 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, ...@@ -842,7 +842,7 @@ int mt7921_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,
.tag = cpu_to_le16(UNI_ROC_ABORT), .tag = cpu_to_le16(UNI_ROC_ABORT),
.len = cpu_to_le16(sizeof(struct roc_abort_tlv)), .len = cpu_to_le16(sizeof(struct roc_abort_tlv)),
.tokenid = token_id, .tokenid = token_id,
.bss_idx = vif->mt76.idx, .bss_idx = vif->bss_conf.mt76.idx,
.dbdcband = 0xff, /* auto*/ .dbdcband = 0xff, /* auto*/
}, },
}; };
...@@ -947,7 +947,7 @@ int mt7921_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif) ...@@ -947,7 +947,7 @@ int mt7921_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif)
} __packed ps; } __packed ps;
} __packed ps_req = { } __packed ps_req = {
.hdr = { .hdr = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
}, },
.ps = { .ps = {
.tag = cpu_to_le16(UNI_BSS_INFO_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, ...@@ -982,7 +982,7 @@ mt7921_mcu_uni_bss_bcnft(struct mt792x_dev *dev, struct ieee80211_vif *vif,
} __packed bcnft; } __packed bcnft;
} __packed bcnft_req = { } __packed bcnft_req = {
.hdr = { .hdr = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
}, },
.bcnft = { .bcnft = {
.tag = cpu_to_le16(UNI_BSS_INFO_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, ...@@ -1015,7 +1015,7 @@ mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
u8 bmc_triggered_ac; u8 bmc_triggered_ac;
u8 pad; u8 pad;
} req = { } req = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
.aid = cpu_to_le16(vif->cfg.aid), .aid = cpu_to_le16(vif->cfg.aid),
.dtim_period = vif->bss_conf.dtim_period, .dtim_period = vif->bss_conf.dtim_period,
.bcn_interval = cpu_to_le16(vif->bss_conf.beacon_int), .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, ...@@ -1024,7 +1024,7 @@ mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,
u8 bss_idx; u8 bss_idx;
u8 pad[3]; u8 pad[3];
} req_hdr = { } req_hdr = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
}; };
int err; int err;
...@@ -1042,7 +1042,7 @@ int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta, ...@@ -1042,7 +1042,7 @@ int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
enum mt76_sta_info_state state) enum mt76_sta_info_state state)
{ {
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv; 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 = { struct mt76_sta_cmd_info info = {
.sta = sta, .sta = sta,
.vif = vif, .vif = vif,
...@@ -1055,7 +1055,7 @@ int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta, ...@@ -1055,7 +1055,7 @@ int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,
struct mt792x_sta *msta; struct mt792x_sta *msta;
msta = sta ? (struct mt792x_sta *)sta->drv_priv : NULL; 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; info.newly = msta ? state != MT76_STA_INFO_STATE_ASSOC : true;
return mt76_connac_mcu_sta_cmd(&dev->mphy, &info); return mt76_connac_mcu_sta_cmd(&dev->mphy, &info);
...@@ -1190,7 +1190,7 @@ int mt7921_mcu_config_sniffer(struct mt792x_vif *vif, ...@@ -1190,7 +1190,7 @@ int mt7921_mcu_config_sniffer(struct mt792x_vif *vif,
} __packed tlv; } __packed tlv;
} __packed req = { } __packed req = {
.hdr = { .hdr = {
.band_idx = vif->mt76.band_idx, .band_idx = vif->bss_conf.mt76.band_idx,
}, },
.tlv = { .tlv = {
.tag = cpu_to_le16(1), .tag = cpu_to_le16(1),
...@@ -1251,7 +1251,7 @@ mt7921_mcu_uni_add_beacon_offload(struct mt792x_dev *dev, ...@@ -1251,7 +1251,7 @@ mt7921_mcu_uni_add_beacon_offload(struct mt792x_dev *dev,
} __packed beacon_tlv; } __packed beacon_tlv;
} req = { } req = {
.hdr = { .hdr = {
.bss_idx = mvif->mt76.idx, .bss_idx = mvif->bss_conf.mt76.idx,
}, },
.beacon_tlv = { .beacon_tlv = {
.tag = cpu_to_le16(UNI_BSS_INFO_BCN_CONTENT), .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 ...@@ -1460,7 +1460,7 @@ int mt7921_mcu_set_rssimonitor(struct mt792x_dev *dev, struct ieee80211_vif *vif
.enable = vif->cfg.assoc, .enable = vif->cfg.assoc,
.cqm_rssi_high = vif->bss_conf.cqm_rssi_thold + vif->bss_conf.cqm_rssi_hyst, .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, .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), 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, ...@@ -339,6 +339,9 @@ static int mt7921_pci_probe(struct pci_dev *pdev,
bus_ops->rmw = mt7921_rmw; bus_ops->rmw = mt7921_rmw;
dev->mt76.bus = bus_ops; dev->mt76.bus = bus_ops;
if (!mt7921_disable_aspm && mt76_pci_aspm_supported(pdev))
dev->aspm_supported = true;
ret = mt792xe_mcu_fw_pmctrl(dev); ret = mt792xe_mcu_fw_pmctrl(dev);
if (ret) if (ret)
goto err_free_dev; goto err_free_dev;
......
...@@ -34,9 +34,9 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -34,9 +34,9 @@ int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
if (sta) { if (sta) {
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; 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; 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) ...@@ -179,6 +179,12 @@ static void mt7925_init_work(struct work_struct *work)
mt76_set_stream_caps(&dev->mphy, true); mt76_set_stream_caps(&dev->mphy, true);
mt7925_set_stream_he_eht_caps(&dev->phy); 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, ret = mt76_register_device(&dev->mt76, true, mt76_rates,
ARRAY_SIZE(mt76_rates)); ARRAY_SIZE(mt76_rates));
if (ret) { if (ret) {
......
...@@ -366,7 +366,10 @@ struct bss_mld_tlv { ...@@ -366,7 +366,10 @@ struct bss_mld_tlv {
u8 mac_addr[ETH_ALEN]; u8 mac_addr[ETH_ALEN];
u8 remap_idx; u8 remap_idx;
u8 link_id; u8 link_id;
u8 __rsv[2]; u8 eml_enable;
u8 max_link_num;
u8 hybrid_mode;
u8 __rsv[3];
} __packed; } __packed;
struct sta_rec_ba_uni { struct sta_rec_ba_uni {
...@@ -440,6 +443,17 @@ struct sta_rec_mld { ...@@ -440,6 +443,17 @@ struct sta_rec_mld {
} __packed link[2]; } __packed link[2];
} __packed; } __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 { struct bss_ifs_time_tlv {
__le16 tag; __le16 tag;
__le16 len; __le16 len;
...@@ -456,6 +470,21 @@ struct bss_ifs_time_tlv { ...@@ -456,6 +470,21 @@ struct bss_ifs_time_tlv {
__le16 eifs_cck_time; __le16 eifs_cck_time;
} __packed; } __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) + \ #define MT7925_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \
sizeof(struct sta_rec_basic) + \ sizeof(struct sta_rec_basic) + \
sizeof(struct sta_rec_bf) + \ sizeof(struct sta_rec_bf) + \
...@@ -474,7 +503,8 @@ struct bss_ifs_time_tlv { ...@@ -474,7 +503,8 @@ struct bss_ifs_time_tlv {
sizeof(struct sta_rec_eht) + \ sizeof(struct sta_rec_eht) + \
sizeof(struct sta_rec_hdr_trans) + \ sizeof(struct sta_rec_hdr_trans) + \
sizeof(struct sta_rec_mld) + \ 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) + \ #define MT7925_BSS_UPDATE_MAX_SIZE (sizeof(struct bss_req_hdr) + \
sizeof(struct mt76_connac_bss_basic_tlv) + \ sizeof(struct mt76_connac_bss_basic_tlv) + \
...@@ -484,6 +514,7 @@ struct bss_ifs_time_tlv { ...@@ -484,6 +514,7 @@ struct bss_ifs_time_tlv {
sizeof(struct bss_info_uni_he) + \ sizeof(struct bss_info_uni_he) + \
sizeof(struct bss_info_uni_bss_color) + \ sizeof(struct bss_info_uni_bss_color) + \
sizeof(struct bss_ifs_time_tlv) + \ sizeof(struct bss_ifs_time_tlv) + \
sizeof(struct bss_rlm_tlv) + \
sizeof(struct tlv)) sizeof(struct tlv))
#define MT_CONNAC3_SKU_POWER_LIMIT 449 #define MT_CONNAC3_SKU_POWER_LIMIT 449
...@@ -538,6 +569,26 @@ struct mt7925_wow_pattern_tlv { ...@@ -538,6 +569,26 @@ struct mt7925_wow_pattern_tlv {
u8 rsv[7]; u8 rsv[7];
} __packed; } __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 static inline enum connac3_mcu_cipher_type
mt7925_mcu_get_cipher(int cipher) mt7925_mcu_get_cipher(int cipher)
{ {
...@@ -578,18 +629,18 @@ int mt7925_mcu_sched_scan_enable(struct mt76_phy *phy, ...@@ -578,18 +629,18 @@ int mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
bool enable); bool enable);
int mt7925_mcu_add_bss_info(struct mt792x_phy *phy, int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
struct ieee80211_chanctx_conf *ctx, struct ieee80211_chanctx_conf *ctx,
struct ieee80211_vif *vif, struct ieee80211_bss_conf *link_conf,
struct ieee80211_sta *sta, struct ieee80211_link_sta *link_sta,
int enable); int enable);
int mt7925_mcu_set_timing(struct mt792x_phy *phy, 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_deep_sleep(struct mt792x_dev *dev, bool enable);
int mt7925_mcu_set_channel_domain(struct mt76_phy *phy); 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_radio_en(struct mt792x_phy *phy, bool enable);
int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif, int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx); struct ieee80211_chanctx_conf *ctx);
int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy); int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy);
int mt7925_mcu_update_arp_filter(struct mt76_dev *dev, int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
struct mt76_vif *vif, struct ieee80211_bss_conf *link_conf);
struct ieee80211_bss_conf *info);
#endif #endif
...@@ -30,17 +30,22 @@ ...@@ -30,17 +30,22 @@
enum { enum {
UNI_ROC_ACQUIRE, UNI_ROC_ACQUIRE,
UNI_ROC_ABORT, UNI_ROC_ABORT,
UNI_ROC_SUB_LINK = 3,
UNI_ROC_NUM UNI_ROC_NUM
}; };
enum mt7925_roc_req { enum mt7925_roc_req {
MT7925_ROC_REQ_JOIN, MT7925_ROC_REQ_JOIN,
MT7925_ROC_REQ_ROC, MT7925_ROC_REQ_ROC,
MT7925_ROC_REQ_SUB_LINK,
MT7925_ROC_REQ_MLSR_AG = 10,
MT7925_ROC_REQ_MLSR_AA,
MT7925_ROC_REQ_NUM MT7925_ROC_REQ_NUM
}; };
enum { enum {
UNI_EVENT_ROC_GRANT = 0, UNI_EVENT_ROC_GRANT = 0,
UNI_EVENT_ROC_GRANT_SUB_LINK = 4,
UNI_EVENT_ROC_TAG_NUM UNI_EVENT_ROC_TAG_NUM
}; };
...@@ -192,13 +197,15 @@ int __mt7925_start(struct mt792x_phy *phy); ...@@ -192,13 +197,15 @@ int __mt7925_start(struct mt792x_phy *phy);
int mt7925_register_device(struct mt792x_dev *dev); int mt7925_register_device(struct mt792x_dev *dev);
void mt7925_unregister_device(struct mt792x_dev *dev); void mt7925_unregister_device(struct mt792x_dev *dev);
int mt7925_run_firmware(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); 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, struct ieee80211_vif *vif, bool enable,
enum mt76_sta_info_state state); enum mt76_sta_info_state state);
int mt7925_mcu_set_chan_info(struct mt792x_phy *phy, u16 tag); 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_set_eeprom(struct mt792x_dev *dev);
int mt7925_mcu_get_rx_rate(struct mt792x_phy *phy, struct ieee80211_vif *vif, int mt7925_mcu_get_rx_rate(struct mt792x_phy *phy, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, struct rate_info *rate); 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, ...@@ -228,6 +235,7 @@ void mt7925_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
struct sk_buff *skb, u32 *info); struct sk_buff *skb, u32 *info);
void mt7925_stats_work(struct work_struct *work); void mt7925_stats_work(struct work_struct *work);
void mt7925_set_stream_he_eht_caps(struct mt792x_phy *phy); 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_init_debugfs(struct mt792x_dev *dev);
int mt7925_mcu_set_beacon_filter(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, ...@@ -241,7 +249,8 @@ int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev,
bool enable); bool enable);
void mt7925_scan_work(struct work_struct *work); void mt7925_scan_work(struct work_struct *work);
void mt7925_roc_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); void mt7925_coredump_work(struct work_struct *work);
int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx, int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx,
struct mt7925_txpwr *txpwr); struct mt7925_txpwr *txpwr);
...@@ -252,7 +261,7 @@ void mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi, ...@@ -252,7 +261,7 @@ void mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
struct ieee80211_key_conf *key, int pid, struct ieee80211_key_conf *key, int pid,
enum mt76_txq_id qid, u32 changed); enum mt76_txq_id qid, u32 changed);
void mt7925_txwi_free(struct mt792x_dev *dev, struct mt76_txwi_cache *t, 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 list_head *free_list);
int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd, int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd,
struct sk_buff *skb, int seq); struct sk_buff *skb, int seq);
...@@ -291,20 +300,24 @@ int mt7925_set_tx_sar_pwr(struct ieee80211_hw *hw, ...@@ -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_regval(struct mt792x_dev *dev, u32 regidx, u32 *val, bool set);
int mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2, int mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,
enum environment_cap env_cap); 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, struct ieee80211_channel *chan, int duration,
enum mt7925_roc_req type, u8 token_id); 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); u8 token_id);
int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb, int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb,
int cmd, int *wait_seq); int cmd, int *wait_seq);
int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif, int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif,
struct mt76_connac_sta_key_conf *sta_key_conf, struct mt76_connac_sta_key_conf *sta_key_conf,
struct ieee80211_key_conf *key, int mcu_cmd, 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_set_rts_thresh(struct mt792x_phy *phy, u32 val);
int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev, int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta); struct ieee80211_sta *sta,
int link_id);
#endif #endif
...@@ -373,6 +373,9 @@ static int mt7925_pci_probe(struct pci_dev *pdev, ...@@ -373,6 +373,9 @@ static int mt7925_pci_probe(struct pci_dev *pdev,
bus_ops->rmw = mt7925_rmw; bus_ops->rmw = mt7925_rmw;
dev->mt76.bus = bus_ops; dev->mt76.bus = bus_ops;
if (!mt7925_disable_aspm && mt76_pci_aspm_supported(pdev))
dev->aspm_supported = true;
ret = __mt792x_mcu_fw_pmctrl(dev); ret = __mt792x_mcu_fw_pmctrl(dev);
if (ret) if (ret)
goto err_free_dev; goto err_free_dev;
......
...@@ -34,9 +34,9 @@ int mt7925e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, ...@@ -34,9 +34,9 @@ int mt7925e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
if (sta) { if (sta) {
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; 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; 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) ...@@ -60,7 +60,7 @@ void mt7925_tx_token_put(struct mt792x_dev *dev)
spin_lock_bh(&dev->mt76.token_lock); spin_lock_bh(&dev->mt76.token_lock);
idr_for_each_entry(&dev->mt76.token, txwi, id) { 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--; dev->mt76.token_count--;
} }
spin_unlock_bh(&dev->mt76.token_lock); spin_unlock_bh(&dev->mt76.token_lock);
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#define MT792x_CHIP_CAP_CLC_EVT_EN BIT(0) #define MT792x_CHIP_CAP_CLC_EVT_EN BIT(0)
#define MT792x_CHIP_CAP_RSSI_NOTIFY_EVT_EN BIT(1) #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 */ /* NOTE: used to map mt76_rates. idx may change if firmware expands table */
#define MT792x_BASIC_RATES_TBL 11 #define MT792x_BASIC_RATES_TBL 11
...@@ -81,11 +82,9 @@ enum mt792x_reg_power_type { ...@@ -81,11 +82,9 @@ enum mt792x_reg_power_type {
DECLARE_EWMA(avg_signal, 10, 8) DECLARE_EWMA(avg_signal, 10, 8)
struct mt792x_sta { struct mt792x_link_sta {
struct mt76_wcid wcid; /* must be first */ struct mt76_wcid wcid; /* must be first */
struct mt792x_vif *vif;
u32 airtime_ac[8]; u32 airtime_ac[8];
int ack_signal; int ack_signal;
...@@ -94,21 +93,46 @@ struct mt792x_sta { ...@@ -94,21 +93,46 @@ struct mt792x_sta {
unsigned long last_txs; unsigned long last_txs;
struct mt76_connac_sta_key_conf bip; 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); 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 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 sta;
struct mt792x_sta *wep_sta; struct mt792x_sta *wep_sta;
struct mt792x_phy *phy; struct mt792x_phy *phy;
u16 valid_links;
struct ewma_rssi rssi; u8 deflink_id;
struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
}; };
struct mt792x_phy { struct mt792x_phy {
...@@ -140,6 +164,7 @@ struct mt792x_phy { ...@@ -140,6 +164,7 @@ struct mt792x_phy {
#endif #endif
void *clc[MT792x_CLC_MAX_NUM]; void *clc[MT792x_CLC_MAX_NUM];
u64 chip_cap; u64 chip_cap;
u16 eml_cap;
struct work_struct roc_work; struct work_struct roc_work;
struct timer_list roc_timer; struct timer_list roc_timer;
...@@ -190,6 +215,7 @@ struct mt792x_dev { ...@@ -190,6 +215,7 @@ struct mt792x_dev {
bool fw_assert:1; bool fw_assert:1;
bool has_eht:1; bool has_eht:1;
bool regd_in_progress:1; bool regd_in_progress:1;
bool aspm_supported:1;
wait_queue_head_t wait; wait_queue_head_t wait;
struct work_struct init_work; struct work_struct init_work;
...@@ -211,6 +237,66 @@ struct mt792x_dev { ...@@ -211,6 +237,66 @@ struct mt792x_dev {
u32 backup_l2; 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 * static inline struct mt792x_dev *
mt792x_hw_dev(struct ieee80211_hw *hw) mt792x_hw_dev(struct ieee80211_hw *hw)
{ {
...@@ -325,6 +411,9 @@ mt792x_get_mac80211_ops(struct device *dev, ...@@ -325,6 +411,9 @@ mt792x_get_mac80211_ops(struct device *dev,
int mt792x_init_wcid(struct mt792x_dev *dev); int mt792x_init_wcid(struct mt792x_dev *dev);
int mt792x_mcu_drv_pmctrl(struct mt792x_dev *dev); int mt792x_mcu_drv_pmctrl(struct mt792x_dev *dev);
int mt792x_mcu_fw_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) 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, ...@@ -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_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_vif *vif = info->control.vif; struct ieee80211_vif *vif = info->control.vif;
struct mt76_wcid *wcid = &dev->mt76.global_wcid; struct mt76_wcid *wcid = &dev->mt76.global_wcid;
u8 link_id;
int qid; int qid;
if (control->sta) { if (control->sta) {
struct mt792x_link_sta *mlink;
struct mt792x_sta *sta; 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; 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) { if (vif && !control->sta) {
struct mt792x_vif *mvif; struct mt792x_vif *mvif;
mvif = (struct mt792x_vif *)vif->drv_priv; 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)) { if (mt76_connac_pm_ref(mphy, &dev->pm)) {
...@@ -113,31 +135,47 @@ void mt792x_stop(struct ieee80211_hw *hw, bool suspend) ...@@ -113,31 +135,47 @@ void mt792x_stop(struct ieee80211_hw *hw, bool suspend)
} }
EXPORT_SYMBOL_GPL(mt792x_stop); 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, void mt792x_remove_interface(struct ieee80211_hw *hw,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv; 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_dev *dev = mt792x_hw_dev(hw);
struct mt792x_phy *phy = mt792x_hw_phy(hw); struct mt792x_bss_conf *mconf;
int idx = msta->wcid.idx;
mt792x_mutex_acquire(dev); 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); 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); EXPORT_SYMBOL_GPL(mt792x_remove_interface);
...@@ -149,7 +187,7 @@ int mt792x_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -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 */ /* no need to update right away, we'll get BSS_CHANGED_QOS */
queue = mt76_connac_lmac_mapping(queue); queue = mt76_connac_lmac_mapping(queue);
mvif->queue_params[queue] = *params; mvif->bss_conf.queue_params[queue] = *params;
return 0; return 0;
} }
...@@ -178,7 +216,7 @@ u64 mt792x_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) ...@@ -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_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
struct mt792x_dev *dev = mt792x_hw_dev(hw); 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 { union {
u64 t64; u64 t64;
u32 t32[2]; u32 t32[2];
...@@ -204,7 +242,7 @@ void mt792x_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -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_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
struct mt792x_dev *dev = mt792x_hw_dev(hw); 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 { union {
u64 t64; u64 t64;
u32 t32[2]; u32 t32[2];
...@@ -261,11 +299,13 @@ int mt792x_assign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -261,11 +299,13 @@ int mt792x_assign_vif_chanctx(struct ieee80211_hw *hw,
struct ieee80211_bss_conf *link_conf, struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx) 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_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
struct mt792x_dev *dev = mt792x_hw_dev(hw); struct mt792x_dev *dev = mt792x_hw_dev(hw);
mutex_lock(&dev->mt76.mutex); 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); mutex_unlock(&dev->mt76.mutex);
return 0; return 0;
...@@ -277,11 +317,13 @@ void mt792x_unassign_vif_chanctx(struct ieee80211_hw *hw, ...@@ -277,11 +317,13 @@ void mt792x_unassign_vif_chanctx(struct ieee80211_hw *hw,
struct ieee80211_bss_conf *link_conf, struct ieee80211_bss_conf *link_conf,
struct ieee80211_chanctx_conf *ctx) 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_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
struct mt792x_dev *dev = mt792x_hw_dev(hw); struct mt792x_dev *dev = mt792x_hw_dev(hw);
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
mvif->mt76.ctx = NULL; mctx->bss_conf = NULL;
mvif->bss_conf.mt76.ctx = NULL;
mutex_unlock(&dev->mt76.mutex); mutex_unlock(&dev->mt76.mutex);
} }
EXPORT_SYMBOL_GPL(mt792x_unassign_vif_chanctx); EXPORT_SYMBOL_GPL(mt792x_unassign_vif_chanctx);
...@@ -405,10 +447,10 @@ mt792x_ethtool_worker(void *wi_data, struct ieee80211_sta *sta) ...@@ -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 mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
struct mt76_ethtool_worker_info *wi = wi_data; 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; 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, 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, ...@@ -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_mib_stats *mib = &phy->mib;
struct mt76_ethtool_worker_info wi = { struct mt76_ethtool_worker_info wi = {
.data = data, .data = data,
.idx = mvif->mt76.idx, .idx = mvif->bss_conf.mt76.idx,
}; };
int i, ei = 0; int i, ei = 0;
...@@ -487,7 +529,7 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw, ...@@ -487,7 +529,7 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw,
struct station_info *sinfo) struct station_info *sinfo)
{ {
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; 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) if (!txrate->legacy && !txrate->flags)
return; return;
...@@ -502,19 +544,19 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw, ...@@ -502,19 +544,19 @@ void mt792x_sta_statistics(struct ieee80211_hw *hw,
sinfo->txrate.he_dcm = txrate->he_dcm; sinfo->txrate.he_dcm = txrate->he_dcm;
sinfo->txrate.he_ru_alloc = txrate->he_ru_alloc; 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->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->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
sinfo->txrate.flags = txrate->flags; sinfo->txrate.flags = txrate->flags;
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE); 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->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); sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
} }
EXPORT_SYMBOL_GPL(mt792x_sta_statistics); EXPORT_SYMBOL_GPL(mt792x_sta_statistics);
...@@ -556,6 +598,7 @@ int mt792x_init_wiphy(struct ieee80211_hw *hw) ...@@ -556,6 +598,7 @@ int mt792x_init_wiphy(struct ieee80211_hw *hw)
hw->sta_data_size = sizeof(struct mt792x_sta); hw->sta_data_size = sizeof(struct mt792x_sta);
hw->vif_data_size = sizeof(struct mt792x_vif); hw->vif_data_size = sizeof(struct mt792x_vif);
hw->chanctx_data_size = sizeof(struct mt792x_chanctx);
if (dev->fw_features & MT792x_FW_CAP_CNM) { if (dev->fw_features & MT792x_FW_CAP_CNM) {
wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
...@@ -766,6 +809,10 @@ int __mt792xe_mcu_drv_pmctrl(struct mt792x_dev *dev) ...@@ -766,6 +809,10 @@ int __mt792xe_mcu_drv_pmctrl(struct mt792x_dev *dev)
for (i = 0; i < MT792x_DRV_OWN_RETRY_COUNT; i++) { for (i = 0; i < MT792x_DRV_OWN_RETRY_COUNT; i++) {
mt76_wr(dev, MT_CONN_ON_LPCTL, PCIE_LPCR_HOST_CLR_OWN); 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, if (mt76_poll_msec_tick(dev, MT_CONN_ON_LPCTL,
PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1)) PCIE_LPCR_HOST_OWN_SYNC, 0, 50, 1))
break; break;
......
...@@ -138,6 +138,7 @@ EXPORT_SYMBOL_GPL(mt792x_mac_update_mib_stats); ...@@ -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, struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx,
bool unicast) bool unicast)
{ {
struct mt792x_link_sta *link;
struct mt792x_sta *sta; struct mt792x_sta *sta;
struct mt76_wcid *wcid; struct mt76_wcid *wcid;
...@@ -151,11 +152,12 @@ struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx, ...@@ -151,11 +152,12 @@ struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx,
if (!wcid->sta) if (!wcid->sta)
return NULL; 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) if (!sta->vif)
return NULL; return NULL;
return &sta->vif->sta.wcid; return &sta->vif->sta.deflink.wcid;
} }
EXPORT_SYMBOL_GPL(mt792x_rx_get_wcid); EXPORT_SYMBOL_GPL(mt792x_rx_get_wcid);
...@@ -173,7 +175,7 @@ mt792x_mac_rssi_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) ...@@ -173,7 +175,7 @@ mt792x_mac_rssi_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)
if (!ether_addr_equal(vif->addr, hdr->addr1)) if (!ether_addr_equal(vif->addr, hdr->addr1))
return; 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) void mt792x_mac_assoc_rssi(struct mt792x_dev *dev, struct sk_buff *skb)
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment