wifi: ath12k: MLO support part 9/9
cover wifi: ath12k: MLO support part 9/9
From: Kalle Valo <[email protected]>
The last patchset enabling MLO support in ath12k (only for QCN9274, for now). All are small patches adding the last minor features before we can enable MLO.
Please review.
Kalle
Depends-on:
wifi: ath12k: MLO support part 8
https://patchwork.kernel.org/project/linux-wireless/cover/[email protected]/
Aditya Kumar Singh (6):
wifi: ath12k: symmetrize scan vdev creation and deletion during HW
scan
wifi: ath12k: add can_activate_links mac operation
wifi: ath12k: add no-op without debug print in WMI Rx event
wifi: ath12k: remove warning print in htt mlo offset event message
wifi: ath12k: add ATH12K_FW_FEATURE_MLO capability firmware feature
wifi: ath12k: assign unique hardware link IDs during QMI host cap
Rameshkumar Sundaram (1):
wifi: ath12k: advertise MLO support and capabilities
drivers/net/wireless/ath/ath12k/core.c | 34 +++++- drivers/net/wireless/ath/ath12k/core.h | 7 +- drivers/net/wireless/ath/ath12k/dp_rx.c | 6 +- drivers/net/wireless/ath/ath12k/fw.h | 3 + drivers/net/wireless/ath/ath12k/mac.c | 156 ++++++++++++++++++++---- drivers/net/wireless/ath/ath12k/qmi.c | 35 +++++- drivers/net/wireless/ath/ath12k/wmi.c | 26 ++-- drivers/net/wireless/ath/ath12k/wmi.h | 7 ++ 8 files changed, 234 insertions(+), 40 deletions(-)
base-commit: 400568fb3b022247c1603fdbdd6444b3ef14ffce
prerequisite-patch-id: 4f0c25ed9cb858bbe89fb5eb0edd226596e2234e
prerequisite-patch-id: 99576487c570edbaf46b35e8ba6b9e20ad9bf85c
prerequisite-patch-id: f0a242859176e986640595256e7f488561683309
prerequisite-patch-id: 532325a3a8da40d6b43ef643f38dca5389750820
prerequisite-patch-id: 1a0adfd0f7ad52c7d0ddd6466659e7a8a229013b
prerequisite-patch-id: e1a1418434e24374ef1ad04a49249436de602dd8
prerequisite-patch-id: 8847add439503b799079f8cfa043b15b57691d7f
prerequisite-patch-id: 017994ce11ee18d218464d1bb5ffb50ac8d941a5
prerequisite-patch-id: 8160e50b27670d195fb48f365e48e9914aed35f5
prerequisite-patch-id: 2a828218167edcca737a6400145c48e99be1dab0
prerequisite-patch-id: 960a34375824886cfadeff20afe1152290d285bd
prerequisite-patch-id: 6ed64d739660c590f3a891b675ada69ff71db858
prerequisite-patch-id: b71fe3eca5e431636785abf669d55eb600e3a212
prerequisite-patch-id: 066f114094ed84600304fbb2dd113a153b48b253
prerequisite-patch-id: b14fd74db0c7979aaf7b22c70b53f3b27730ce8e
prerequisite-patch-id: 3b8dae9159662edaaf64d144f0c0796737c3b77c
prerequisite-patch-id: d26a06c418d308111a55f1a1b8f03250c17ba6c5
Signature · 1 line
2.39.5
PATCH 1/7 wifi: ath12k: symmetrize scan vdev creation and deletion during HW scan
From: Aditya Kumar Singh <[email protected]>
Currently, the hardware scan is initiated in the driver on scan link (15). After mapping to the appropriate radio based on the scan frequency, the vdev is created and the scan begins. However, the vdev is only deleted when channel assignment is about to occur after the scan. Additionally, it is also deleted if a new scan is requested on the same interface but the underlying radio differs in the new request.
This imbalance leads to various hardware scan issues, especially when a non-MLO and MLO combination exists. In such cases, the latter tries to skip the scan and proceed with channel assignment while the former is still scanning, causing a firmware assert.
To address this issue, symmetrize the scan vdev creation and deletion during hardware scan operations. This means creating a vdev when the scan starts and deleting it once the scan is completed or aborted.
While at this, add a few debug prints in scan handling and a few empty lines for better code read.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/core.h | 3 +- drivers/net/wireless/ath/ath12k/mac.c | 120 +++++++++++++++++++------ drivers/net/wireless/ath/ath12k/wmi.c | 3 +- 3 files changed, 99 insertions(+), 27 deletions(-)
drivers/net/wireless/ath/ath12k/core.h +2 -1
@@ -603,9 +603,10 @@ struct ath12k {struct delayed_work timeout;enum ath12k_scan_state state;bool is_roc; -int vdev_id;int roc_freq;bool roc_notify; +struct wiphy_work vdev_clean_wk; +struct ath12k_link_vif *arvif; } scan;struct {
drivers/net/wireless/ath/ath12k/mac.c +95 -25
220 lines not on this page · raw message
drivers/net/wireless/ath/ath12k/wmi.c +2 -1
@@ -6338,7 +6338,8 @@ static struct ath12k *ath12k_get_ar_on_scan_state(struct ath12k_base *ab,spin_lock_bh (&ar->data_lock);if (ar->scan.state == state && - ar->scan.vdev_id == vdev_id) { + ar->scan.arvif && + ar->scan.arvif->vdev_id == vdev_id) {spin_unlock_bh (&ar->data_lock);return ar; }
Signature · 1 line
2.39.5
PATCH 2/7 wifi: ath12k: add can_activate_links mac operation
In reply to Kalle ValoFrom: Aditya Kumar Singh <[email protected]>
When operating as an ML station, mac80211 initially activates only one link in the driver until the peer is authorized. Once the state changes to authorized, the driver should call mac80211 API to activate all other partner links.
Before doing so, mac80211 checks if the driver supports activating links via the can_activate_links mac80211_ops. Therefore, add support for this mac80211_ops and call the API to activate the links once the state changes to authorized.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/mac.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
drivers/net/wireless/ath/ath12k/mac.c +23 -0
@@ -5645,6 +5645,19 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw, } } +/* In the ML station scenario, activate all partner links once the +* client is transitioning to the associated state. +* +* FIXME: Ideally, this activation should occur when the client +* transitions to the authorized state. However, there are some +* issues with handling this in the firmware. Until the firmware +* can manage it properly, activate the links when the client is +* about to move to the associated state. +*/ +if (ieee80211_vif_is_mld (vif) && vif->type ==NL80211_IFTYPE_STATION && + old_state ==IEEE80211_STA_AUTH && new_state ==IEEE80211_STA_ASSOC ) +ieee80211_set_active_links (vif,ieee80211_vif_usable_links (vif)); +/* Handle all the other state transitions in generic way */ valid_links = ahsta->links_map;for_each_set_bit (link_id, &valid_links,IEEE80211_MLD_MAX_NUM_LINKS ) {
@@ -5939,6 +5952,15 @@ static int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,return 0 ; } +static bool ath12k_mac_op_can_activate_links (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +u16 active_links) +{ +/* TODO: Handle recovery case */ + +return true; +} +static int ath12k_conf_tx_uapsd (struct ath12k_link_vif *arvif,u16 ac,bool enable) {
@@ -10249,6 +10271,7 @@ static const struct ieee80211_ops ath12k_ops = { .remain_on_channel = ath12k_mac_op_remain_on_channel, .cancel_remain_on_channel = ath12k_mac_op_cancel_remain_on_channel, .change_sta_links = ath12k_mac_op_change_sta_links, + .can_activate_links = ath12k_mac_op_can_activate_links, #ifdef CONFIG_PM .suspend = ath12k_wow_op_suspend, .resume = ath12k_wow_op_resume,
Signature · 1 line
2.39.5
PATCH 3/7 wifi: ath12k: add no-op without debug print in WMI Rx event
In reply to Kalle ValoFrom: Aditya Kumar Singh <[email protected]>
Currently, certain WMI events are frequently received by the host. Since the host lacks the logic to process these events, the console is flooded with ‘Unknown eventid:’ debug messages.
To address this, handle these events gracefully without printing debug messages. There is already a block of event IDs that are ignored with a debug print. However, this new type of event occurs more frequently, so no debug print is necessary, and handling it should be a no-op.
While at it, re-arrange the code so that all Unknown event IDs are towards the end of the switch block.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/wmi.c | 20 +++++++++++++------- drivers/net/wireless/ath/ath12k/wmi.h | 5 +++++ 2 files changed, 18 insertions(+), 7 deletions(-)
drivers/net/wireless/ath/ath12k/wmi.c +13 -7
@@ -7505,13 +7505,6 @@ static void ath12k_wmi_op_rx(struct ath12k_base *ab, struct sk_buff *skb)case WMI_P2P_NOA_EVENTID :ath12k_wmi_p2p_noa_event (ab, skb);break ; -/* add Unsupported events here */ -case WMI_TBTTOFFSET_EXT_UPDATE_EVENTID : -case WMI_PEER_OPER_MODE_CHANGE_EVENTID : -case WMI_PDEV_DMA_RING_CFG_RSP_EVENTID : -ath12k_dbg (ab,ATH12K_DBG_WMI , -"ignoring unsupported event 0x%x\n" , id); -break ;case WMI_PDEV_DFS_RADAR_DETECTION_EVENTID :ath12k_wmi_pdev_dfs_radar_detected_event (ab, skb);break ;
@@ -7533,6 +7526,19 @@ static void ath12k_wmi_op_rx(struct ath12k_base *ab, struct sk_buff *skb)case WMI_MLO_TEARDOWN_COMPLETE_EVENTID :ath12k_wmi_event_teardown_complete (ab, skb);break ; +/* add Unsupported events (rare) here */ +case WMI_TBTTOFFSET_EXT_UPDATE_EVENTID : +case WMI_PEER_OPER_MODE_CHANGE_EVENTID : +case WMI_PDEV_DMA_RING_CFG_RSP_EVENTID : +ath12k_dbg (ab,ATH12K_DBG_WMI , +"ignoring unsupported event 0x%x\n" , id); +break ; +/* add Unsupported events (frequent) here */ +case WMI_PDEV_GET_HALPHY_CAL_STATUS_EVENTID : +case WMI_MGMT_RX_FW_CONSUMED_EVENTID : +case WMI_OBSS_COLOR_COLLISION_DETECTION_EVENTID : +/* debug might flood hence silently ignore (no-op) */ +break ;/* TODO: Add remaining events */ default :ath12k_dbg (ab,ATH12K_DBG_WMI ,"Unknown eventid: 0x%x\n" , id);
drivers/net/wireless/ath/ath12k/wmi.h +5 -0
@@ -711,6 +711,8 @@ enum wmi_tlv_event_id {WMI_PDEV_RAP_INFO_EVENTID ,WMI_CHAN_RF_CHARACTERIZATION_INFO_EVENTID ,WMI_SERVICE_READY_EXT2_EVENTID , +WMI_PDEV_GET_HALPHY_CAL_STATUS_EVENTID = +WMI_SERVICE_READY_EXT2_EVENTID +4 ,WMI_VDEV_START_RESP_EVENTID =WMI_TLV_CMD (WMI_GRP_VDEV ),WMI_VDEV_STOPPED_EVENTID , WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID,
@@ -752,6 +754,7 @@ enum wmi_tlv_event_id {WMI_TBTTOFFSET_EXT_UPDATE_EVENTID ,WMI_OFFCHAN_DATA_TX_COMPLETION_EVENTID ,WMI_HOST_FILS_DISCOVERY_EVENTID , +WMI_MGMT_RX_FW_CONSUMED_EVENTID =WMI_HOST_FILS_DISCOVERY_EVENTID +3 ,WMI_TX_DELBA_COMPLETE_EVENTID =WMI_TLV_CMD (WMI_GRP_BA_NEG ),WMI_TX_ADDBA_COMPLETE_EVENTID , WMI_BA_RSP_SSN_EVENTID,
@@ -850,6 +853,8 @@ enum wmi_tlv_event_id {WMI_MDNS_STATS_EVENTID =WMI_TLV_CMD (WMI_GRP_MDNS_OFL ),WMI_SAP_OFL_ADD_STA_EVENTID =WMI_TLV_CMD (WMI_GRP_SAP_OFL ),WMI_SAP_OFL_DEL_STA_EVENTID , +WMI_OBSS_COLOR_COLLISION_DETECTION_EVENTID = +WMI_EVT_GRP_START_ID (WMI_GRP_OBSS_OFL ),WMI_OCB_SET_CONFIG_RESP_EVENTID =WMI_TLV_CMD (WMI_GRP_OCB ),WMI_OCB_GET_TSF_TIMER_RESP_EVENTID , WMI_DCC_GET_STATS_RESP_EVENTID,
Signature · 1 line
2.39.5
PATCH 4/7 wifi: ath12k: remove warning print in htt mlo offset event message
In reply to Kalle ValoFrom: Aditya Kumar Singh <[email protected]>
In the function ath12k_htt_mlo_offset_event_handler(), it is possible that the ar is not yet active (started). The function ath12k_mac_get_ar_by_pdev_id() only searches for active pdev, so a NULL return is possible. Therefore, there is no need to print a warning, instead, just silently discard the message.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/dp_rx.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/dp_rx.c +5 -1
@@ -1697,7 +1697,11 @@ static void ath12k_htt_mlo_offset_event_handler(struct ath12k_base *ab,rcu_read_lock (); ar =ath12k_mac_get_ar_by_pdev_id (ab, pdev_id);if (!ar) { -ath12k_warn (ab,"invalid pdev id %d on htt mlo offset\n" , pdev_id); +/* It is possible that the ar is not yet active (started). +* The above function will only look for the active pdev +* and hence %NULL return is possible. Just silently +* discard this message +*/ goto exit; }
Signature · 1 line
2.39.5
PATCH 5/7 wifi: ath12k: add ATH12K_FW_FEATURE_MLO capability firmware feature
In reply to Kalle ValoFrom: Aditya Kumar Singh <[email protected]>
To maintain backward compatibility with older firmware versions, introduce a new feature bit, ATH12K_FW_FEATURE_MLO, to identify whether the firmware supports MLO. If the firmware-X.bin does not have this bit advertised in the feature, then MLO capability in the host will be disabled.
This applies only for QCN9274 chipsets.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/core.c | 34 +++++++++++++++++++++++--- drivers/net/wireless/ath/ath12k/fw.h | 3 +++ 2 files changed, 34 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath12k/core.c +31 -3
@@ -1782,6 +1782,9 @@ static int ath12k_core_hw_group_create(struct ath12k_hw_group *ag)void ath12k_core_hw_group_set_mlo_capable (struct ath12k_hw_group *ag) { +struct ath12k_base *ab; +int i; +lockdep_assert_held (&ag->mutex);/* If more than one devices are grouped, then inter MLO
@@ -1790,10 +1793,35 @@ void ath12k_core_hw_group_set_mlo_capable(struct ath12k_hw_group *ag)* Only when there is one device, then it depends whether the * device can support intra chip MLO or not */ -if (ag->num_devices >1 ) +if (ag->num_devices >1 ) { ag->mlo_capable = true; -else - ag->mlo_capable = ag->ab[0 ]->single_chip_mlo_supp; + }else { + ab = ag->ab[0 ]; + ag->mlo_capable = ab->single_chip_mlo_supp; + +/* WCN chipsets does not advertise in firmware features +* hence skip checking +*/ +if (ab->hw_params->def_num_link) +return ; + } + +if (!ag->mlo_capable) +return ; + +for (i =0 ; i < ag->num_devices; i++) { + ab = ag->ab[i]; +if (!ab) +continue ; + +/* even if 1 device's firmware feature indicates MLO +* unsupported, make MLO unsupported for the whole group +*/ +if (!test_bit (ATH12K_FW_FEATURE_MLO , ab->fw.fw_features)) { + ag->mlo_capable = false; +return ; + } + } }int ath12k_core_init (struct ath12k_base *ab)
drivers/net/wireless/ath/ath12k/fw.h +3 -0
@@ -23,6 +23,9 @@ enum ath12k_fw_features {*/ ATH12K_FW_FEATURE_MULTI_QRTR_ID =0 , +/* The firmware supports MLO capability */ +ATH12K_FW_FEATURE_MLO , +/* keep last */ ATH12K_FW_FEATURE_COUNT, };
Signature · 1 line
2.39.5
PATCH 6/7 wifi: ath12k: assign unique hardware link IDs during QMI host cap
In reply to Kalle ValoFrom: Aditya Kumar Singh <[email protected]>
Currently, in the QMI host capability, the device index, the number of local links, and the corresponding hardware link IDs are sent. The hardware link ID assignment is based on the local variable hw_link_id, which starts from 0 and ranges up to num_local_links in the device. Starting from 0 is not ideal because it can result in the same link ID being assigned to different devices in certain scenarios (e.g., split MAC). Additionally, for multi link operations the firmware expects the hardware link IDs in the same order as the Wireless Serial Interface (WSI) connection.
Hence, for MLO to function seamlessly, the hardware link IDs across devices need to be unique and should follow the order of the WSI connection. To address this, a previous change read the WSI index from the Device Tree (DT) and stored it. Use this WSI index to determine the starting hardware link IDs for each device, ensuring uniqueness and correct order across all devices.
While at it, add debug prints to clearly show the MLO capability advertisement sent during QMI host capability exchange.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/core.h | 2 ++ drivers/net/wireless/ath/ath12k/qmi.c | 35 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/core.h +2 -0
@@ -863,11 +863,13 @@ struct ath12k_hw_group {struct device_node *wsi_node[ATH12K_MAX_SOCS ];struct ath12k_mlo_memory mlo_mem;struct ath12k_hw_link hw_links[ATH12K_GROUP_MAX_RADIO ]; +bool hw_link_id_init_done; };/* Holds WSI info specific to each device, excluding WSI group info */ struct ath12k_wsi_info {u32 index; +u32 hw_link_id_base; };/* Master structure to hold the hw data which may be used in core module */
drivers/net/wireless/ath/ath12k/qmi.c +34 -1
@@ -2016,6 +2016,30 @@ static const struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = { }, }; +static void ath12k_host_cap_hw_link_id_init (struct ath12k_hw_group *ag) +{ +struct ath12k_base *ab, *partner_ab; +int i, j, hw_id_base; + +for (i =0 ; i < ag->num_devices; i++) { + hw_id_base =0 ; + ab = ag->ab[i]; + +for (j =0 ; j < ag->num_devices; j++) { + partner_ab = ag->ab[j]; + +if (partner_ab->wsi_info.index >= ab->wsi_info.index) +continue ; + + hw_id_base += partner_ab->qmi.num_radios; + } + + ab->wsi_info.hw_link_id_base = hw_id_base; + } + + ag->hw_link_id_init_done = true; +} +static int ath12k_host_cap_parse_mlo (struct ath12k_base *ab,struct qmi_wlanfw_host_cap_req_msg_v01 *req) {
@@ -2059,8 +2083,14 @@ static int ath12k_host_cap_parse_mlo(struct ath12k_base *ab, req->mlo_num_chips_valid =1 ; req->mlo_num_chips = ag->num_devices; +ath12k_dbg (ab,ATH12K_DBG_QMI ,"mlo capability advertisement device_id %d group_id %d num_devices %d" , + req->mlo_chip_id, req->mlo_group_id, req->mlo_num_chips); +mutex_lock (&ag->mutex); +if (!ag->hw_link_id_init_done) +ath12k_host_cap_hw_link_id_init (ag); +for (i =0 ; i < ag->num_devices; i++) { info = &req->mlo_chip_info[i]; partner_ab = ag->ab[i];
@@ -2078,9 +2108,12 @@ static int ath12k_host_cap_parse_mlo(struct ath12k_base *ab, info->chip_id, info->num_local_links);for (j =0 ; j < info->num_local_links; j++) { - info->hw_link_id[j] = hw_link_id; + info->hw_link_id[j] = partner_ab->wsi_info.hw_link_id_base + j; info->valid_mlo_link_id[j] =1 ; +ath12k_dbg (ab,ATH12K_DBG_QMI ,"mlo hw_link_id %d\n" , + info->hw_link_id[j]); + hw_link_id++; } }
Signature · 1 line
2.39.5
PATCH 7/7 wifi: ath12k: advertise MLO support and capabilities
In reply to Kalle ValoFrom: Rameshkumar Sundaram <[email protected]>
Now everything in ath12k is in place and we can enable Multi-Link Operation (MLO) in the driver. For now it's only enabled for QCN9274 with firmware having ATH12K_FW_FEATURE_MLO feature bit set.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
--- drivers/net/wireless/ath/ath12k/core.h | 2 ++ drivers/net/wireless/ath/ath12k/mac.c | 13 ++++++++++++- drivers/net/wireless/ath/ath12k/wmi.c | 3 +++ drivers/net/wireless/ath/ath12k/wmi.h | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/core.h +2 -0
@@ -773,6 +773,8 @@ struct ath12k_pdev_cap {u32 tx_chain_mask_shift;u32 rx_chain_mask_shift;struct ath12k_band_cap band[NUM_NL80211_BANDS ]; +u32 eml_cap; +u32 mld_cap; };struct mlo_timestamp {
drivers/net/wireless/ath/ath12k/mac.c +12 -1
@@ -10693,7 +10693,7 @@ static const u8 ath12k_if_types_ext_capa_ap[] = { [10] = WLAN_EXT_CAPA11_EMA_SUPPORT, }; -static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { +static struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { { .extended_capabilities = ath12k_if_types_ext_capa, .extended_capabilities_mask = ath12k_if_types_ext_capa,
@@ -10710,6 +10710,8 @@ static const struct wiphy_iftype_ext_capab ath12k_iftypes_ext_capa[] = { .extended_capabilities_mask = ath12k_if_types_ext_capa_ap, .extended_capabilities_len = sizeof(ath12k_if_types_ext_capa_ap), + .eml_capabilities = 0, + .mld_capa_and_ops = 0, }, };
@@ -10919,6 +10921,15 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah)*/ wiphy->flags |=WIPHY_FLAG_DISABLE_WEXT ; +/* Copy over MLO related capabilities received from +* WMI_SERVICE_READY_EXT2_EVENT if single_chip_mlo_supp is set. +*/ +if (ab->ag->mlo_capable) { + ath12k_iftypes_ext_capa[2 ].eml_capabilities = cap->eml_cap; + ath12k_iftypes_ext_capa[2 ].mld_capa_and_ops = cap->mld_cap; + wiphy->flags |=WIPHY_FLAG_SUPPORTS_MLO ; + } + hw->queues =ATH12K_HW_MAX_QUEUES ; wiphy->tx_queue_len =ATH12K_QUEUE_LEN ; hw->offchannel_tx_hw_queue =ATH12K_HW_MAX_QUEUES -1 ;
drivers/net/wireless/ath/ath12k/wmi.c +3 -0
@@ -4662,6 +4662,9 @@ ath12k_wmi_tlv_mac_phy_caps_ext_parse(struct ath12k_base *ab, caps->eht_cap_info_internal); } + pdev->cap.eml_cap =le32_to_cpu (caps->eml_capability); + pdev->cap.mld_cap =le32_to_cpu (caps->mld_capability); +return 0 ; }
drivers/net/wireless/ath/ath12k/wmi.h +2 -0
@@ -2716,6 +2716,8 @@ struct ath12k_wmi_caps_ext_params {__le32 eht_cap_info_internal;__le32 eht_supp_mcs_ext_2ghz[WMI_MAX_EHT_SUPP_MCS_2G_SIZE ];__le32 eht_supp_mcs_ext_5ghz[WMI_MAX_EHT_SUPP_MCS_5G_SIZE ]; +__le32 eml_capability; +__le32 mld_capability; } __packed;/* 2 word representation of MAC addr */
Signature · 1 line
2.39.5
Jeff Johnson
AppliedQuoted 8 lines · Kalle Valo
The last patchset enabling MLO support in ath12k (only for QCN9274, for now). All are small patches adding the last minor features before we can enable MLO.
Please review.
Kalle
[...]
Applied, thanks!
[1/7] wifi: ath12k: symmetrize scan vdev creation and deletion during HW scan
commit: 70f04d72fddfb86678b9786cb8427c1ceda351fb
[2/7] wifi: ath12k: add can_activate_links mac operation
commit: 0f0a74bd44cb9e3507e357f0291a1acaa9c7fc68
[3/7] wifi: ath12k: add no-op without debug print in WMI Rx event
commit: 08bcaa2ed6ba007a2ae6d1a1a2ca9d7e84e2f3ee
[4/7] wifi: ath12k: remove warning print in htt mlo offset event message
commit: 288deb2f062409dc0586e693a378666a4812c7d7
[5/7] wifi: ath12k: add ATH12K_FW_FEATURE_MLO capability firmware feature
commit: 13199dc5bc9da3dad796a215bdb2bb081de5b647
[6/7] wifi: ath12k: assign unique hardware link IDs during QMI host cap
commit: 1c9877c9ff8c508fb80e49e63a5675e0b86d74da
[7/7] wifi: ath12k: advertise MLO support and capabilities
commit: 37db0f45530292d5982368678241eb83f1a9bb83Best regards,
Signature · 1 line
Jeff Johnson <[email protected]>