mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
wifi: ath12k: Add framework for hardware specific ieee80211_ops registration
Introduce a framework to register the ieee80211_ops table based on the underlying hardware architecture. This is necessary to support architecture-specific implementations of ieee80211_ops such as .tx, which will be introduced in upcoming patches. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Ripan Deuri <quic_rdeuri@quicinc.com> Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com> Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com> Link: https://patch.msgid.link/20250930131005.2884253-5-quic_rdeuri@quicinc.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
committed by
Jeff Johnson
parent
8042e30acd
commit
914c890d3b
@@ -1242,6 +1242,11 @@ struct ath12k_base {
|
||||
const struct ath12k_mem_profile_based_param *profile_param;
|
||||
enum ath12k_qmi_mem_mode target_mem_mode;
|
||||
|
||||
/* FIXME: Define this field in a ag equivalent object available
|
||||
* during the initial phase of probe later.
|
||||
*/
|
||||
const struct ieee80211_ops *ath12k_ops;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
@@ -1020,6 +1020,7 @@ void ath12k_debugfs_op_vif_add(struct ieee80211_hw *hw,
|
||||
debugfs_create_file("link_stats", 0400, vif->debugfs_dir, ahvif,
|
||||
&ath12k_fops_link_stats);
|
||||
}
|
||||
EXPORT_SYMBOL(ath12k_debugfs_op_vif_add);
|
||||
|
||||
static ssize_t ath12k_debugfs_dump_device_dp_stats(struct file *file,
|
||||
char __user *user_buf,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2024-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
@@ -335,3 +335,4 @@ void ath12k_debugfs_link_sta_op_add(struct ieee80211_hw *hw,
|
||||
&fops_reset_rx_stats);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ath12k_debugfs_link_sta_op_add);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||
/*
|
||||
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#ifndef ATH12K_MAC_H
|
||||
@@ -193,4 +193,130 @@ void ath12k_mac_update_freq_range(struct ath12k *ar,
|
||||
void ath12k_mac_fill_reg_tpc_info(struct ath12k *ar,
|
||||
struct ath12k_link_vif *arvif,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void ath12k_mac_op_tx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_tx_control *control,
|
||||
struct sk_buff *skb);
|
||||
int ath12k_mac_op_start(struct ieee80211_hw *hw);
|
||||
void ath12k_mac_op_stop(struct ieee80211_hw *hw, bool suspend);
|
||||
void
|
||||
ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw,
|
||||
enum ieee80211_reconfig_type reconfig_type);
|
||||
int ath12k_mac_op_add_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
void ath12k_mac_op_remove_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
void ath12k_mac_op_update_vif_offload(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
int ath12k_mac_op_config(struct ieee80211_hw *hw, int radio_idx, u32 changed);
|
||||
void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *info,
|
||||
u64 changed);
|
||||
void ath12k_mac_op_vif_cfg_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
u64 changed);
|
||||
int
|
||||
ath12k_mac_op_change_vif_links
|
||||
(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
u16 old_links, u16 new_links,
|
||||
struct ieee80211_bss_conf *ol[IEEE80211_MLD_MAX_NUM_LINKS]);
|
||||
void ath12k_mac_op_configure_filter(struct ieee80211_hw *hw,
|
||||
unsigned int changed_flags,
|
||||
unsigned int *total_flags,
|
||||
u64 multicast);
|
||||
int ath12k_mac_op_hw_scan(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_scan_request *hw_req);
|
||||
void ath12k_mac_op_cancel_hw_scan(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
||||
struct ieee80211_key_conf *key);
|
||||
void ath12k_mac_op_set_rekey_data(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct cfg80211_gtk_rekey_data *data);
|
||||
int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
enum ieee80211_sta_state old_state,
|
||||
enum ieee80211_sta_state new_state);
|
||||
int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta);
|
||||
void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_link_sta *link_sta,
|
||||
u32 changed);
|
||||
int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int link_id, u16 ac,
|
||||
const struct ieee80211_tx_queue_params *params);
|
||||
int ath12k_mac_op_set_antenna(struct ieee80211_hw *hw, int radio_idx,
|
||||
u32 tx_ant, u32 rx_ant);
|
||||
int ath12k_mac_op_get_antenna(struct ieee80211_hw *hw, int radio_idx,
|
||||
u32 *tx_ant, u32 *rx_ant);
|
||||
int ath12k_mac_op_ampdu_action(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_ampdu_params *params);
|
||||
int ath12k_mac_op_add_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void ath12k_mac_op_remove_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void ath12k_mac_op_change_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_chanctx_conf *ctx,
|
||||
u32 changed);
|
||||
int
|
||||
ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
void
|
||||
ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
struct ieee80211_chanctx_conf *ctx);
|
||||
int
|
||||
ath12k_mac_op_switch_vif_chanctx(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif_chanctx_switch *vifs,
|
||||
int n_vifs,
|
||||
enum ieee80211_chanctx_switch_mode mode);
|
||||
int ath12k_mac_op_set_rts_threshold(struct ieee80211_hw *hw,
|
||||
int radio_idx, u32 value);
|
||||
int ath12k_mac_op_set_frag_threshold(struct ieee80211_hw *hw,
|
||||
int radio_idx, u32 value);
|
||||
int
|
||||
ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
const struct cfg80211_bitrate_mask *mask);
|
||||
int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
struct survey_info *survey);
|
||||
void ath12k_mac_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
u32 queues, bool drop);
|
||||
void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
struct station_info *sinfo);
|
||||
void ath12k_mac_op_link_sta_statistics(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_link_sta *link_sta,
|
||||
struct link_station_info *link_sinfo);
|
||||
int ath12k_mac_op_remain_on_channel(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_channel *chan,
|
||||
int duration,
|
||||
enum ieee80211_roc_type type);
|
||||
int ath12k_mac_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif);
|
||||
int ath12k_mac_op_change_sta_links(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
u16 old_links, u16 new_links);
|
||||
bool ath12k_mac_op_can_activate_links(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
u16 active_links);
|
||||
int ath12k_mac_op_get_txpower(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
unsigned int link_id,
|
||||
int *dbm);
|
||||
#endif
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include "testmode.h"
|
||||
@@ -393,3 +393,4 @@ int ath12k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(ath12k_tm_cmd);
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
#include "dp_rx.h"
|
||||
#include "../peer.h"
|
||||
#include "wmi.h"
|
||||
#include "../wow.h"
|
||||
#include "../debugfs.h"
|
||||
#include "../debugfs_sta.h"
|
||||
#include "../testmode.h"
|
||||
|
||||
static const guid_t wcn7850_uuid = GUID_INIT(0xf634f534, 0x6147, 0x11ec,
|
||||
0x90, 0xd6, 0x02, 0x42,
|
||||
@@ -1042,6 +1046,63 @@ static const struct ath12k_hw_params ath12k_wifi7_hw_params[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct ieee80211_ops ath12k_ops_wifi7 = {
|
||||
.tx = ath12k_mac_op_tx,
|
||||
.wake_tx_queue = ieee80211_handle_wake_tx_queue,
|
||||
.start = ath12k_mac_op_start,
|
||||
.stop = ath12k_mac_op_stop,
|
||||
.reconfig_complete = ath12k_mac_op_reconfig_complete,
|
||||
.add_interface = ath12k_mac_op_add_interface,
|
||||
.remove_interface = ath12k_mac_op_remove_interface,
|
||||
.update_vif_offload = ath12k_mac_op_update_vif_offload,
|
||||
.config = ath12k_mac_op_config,
|
||||
.link_info_changed = ath12k_mac_op_link_info_changed,
|
||||
.vif_cfg_changed = ath12k_mac_op_vif_cfg_changed,
|
||||
.change_vif_links = ath12k_mac_op_change_vif_links,
|
||||
.configure_filter = ath12k_mac_op_configure_filter,
|
||||
.hw_scan = ath12k_mac_op_hw_scan,
|
||||
.cancel_hw_scan = ath12k_mac_op_cancel_hw_scan,
|
||||
.set_key = ath12k_mac_op_set_key,
|
||||
.set_rekey_data = ath12k_mac_op_set_rekey_data,
|
||||
.sta_state = ath12k_mac_op_sta_state,
|
||||
.sta_set_txpwr = ath12k_mac_op_sta_set_txpwr,
|
||||
.link_sta_rc_update = ath12k_mac_op_link_sta_rc_update,
|
||||
.conf_tx = ath12k_mac_op_conf_tx,
|
||||
.set_antenna = ath12k_mac_op_set_antenna,
|
||||
.get_antenna = ath12k_mac_op_get_antenna,
|
||||
.ampdu_action = ath12k_mac_op_ampdu_action,
|
||||
.add_chanctx = ath12k_mac_op_add_chanctx,
|
||||
.remove_chanctx = ath12k_mac_op_remove_chanctx,
|
||||
.change_chanctx = ath12k_mac_op_change_chanctx,
|
||||
.assign_vif_chanctx = ath12k_mac_op_assign_vif_chanctx,
|
||||
.unassign_vif_chanctx = ath12k_mac_op_unassign_vif_chanctx,
|
||||
.switch_vif_chanctx = ath12k_mac_op_switch_vif_chanctx,
|
||||
.get_txpower = ath12k_mac_op_get_txpower,
|
||||
.set_rts_threshold = ath12k_mac_op_set_rts_threshold,
|
||||
.set_frag_threshold = ath12k_mac_op_set_frag_threshold,
|
||||
.set_bitrate_mask = ath12k_mac_op_set_bitrate_mask,
|
||||
.get_survey = ath12k_mac_op_get_survey,
|
||||
.flush = ath12k_mac_op_flush,
|
||||
.sta_statistics = ath12k_mac_op_sta_statistics,
|
||||
.link_sta_statistics = ath12k_mac_op_link_sta_statistics,
|
||||
.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,
|
||||
.set_wakeup = ath12k_wow_op_set_wakeup,
|
||||
#endif
|
||||
#ifdef CONFIG_ATH12K_DEBUGFS
|
||||
.vif_add_debugfs = ath12k_debugfs_op_vif_add,
|
||||
#endif
|
||||
CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
|
||||
#ifdef CONFIG_ATH12K_DEBUGFS
|
||||
.link_sta_add_debugfs = ath12k_debugfs_link_sta_op_add,
|
||||
#endif
|
||||
};
|
||||
|
||||
int ath12k_wifi7_hw_init(struct ath12k_base *ab)
|
||||
{
|
||||
const struct ath12k_hw_params *hw_params = NULL;
|
||||
@@ -1061,6 +1122,7 @@ int ath12k_wifi7_hw_init(struct ath12k_base *ab)
|
||||
}
|
||||
|
||||
ab->hw_params = hw_params;
|
||||
ab->ath12k_ops = &ath12k_ops_wifi7;
|
||||
|
||||
ath12k_info(ab, "Wi-Fi 7 Hardware name: %s\n", ab->hw_params->name);
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2025 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
@@ -918,6 +918,7 @@ cleanup:
|
||||
exit:
|
||||
return ret ? 1 : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath12k_wow_op_suspend);
|
||||
|
||||
void ath12k_wow_op_set_wakeup(struct ieee80211_hw *hw, bool enabled)
|
||||
{
|
||||
@@ -928,6 +929,7 @@ void ath12k_wow_op_set_wakeup(struct ieee80211_hw *hw, bool enabled)
|
||||
|
||||
device_set_wakeup_enable(ar->ab->dev, enabled);
|
||||
}
|
||||
EXPORT_SYMBOL(ath12k_wow_op_set_wakeup);
|
||||
|
||||
int ath12k_wow_op_resume(struct ieee80211_hw *hw)
|
||||
{
|
||||
@@ -1000,6 +1002,7 @@ exit:
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(ath12k_wow_op_resume);
|
||||
|
||||
int ath12k_wow_init(struct ath12k *ar)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user