mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
ath.git patches for v6.7. Major changes: ath12k * QCN9274: mesh support ath11k * firmware-2.bin support
This commit is contained in:
commit
b6144dcdd4
|
|
@ -17,7 +17,8 @@ ath11k-y += core.o \
|
|||
peer.o \
|
||||
dbring.o \
|
||||
hw.o \
|
||||
pcic.o
|
||||
pcic.o \
|
||||
fw.o
|
||||
|
||||
ath11k-$(CONFIG_ATH11K_DEBUGFS) += debugfs.o debugfs_htt_stats.o debugfs_sta.o
|
||||
ath11k-$(CONFIG_NL80211_TESTMODE) += testmode.o
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
|
@ -1084,19 +1085,12 @@ static int ath11k_ahb_fw_resource_deinit(struct ath11k_base *ab)
|
|||
static int ath11k_ahb_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ath11k_base *ab;
|
||||
const struct of_device_id *of_id;
|
||||
const struct ath11k_hif_ops *hif_ops;
|
||||
const struct ath11k_pci_ops *pci_ops;
|
||||
enum ath11k_hw_rev hw_rev;
|
||||
int ret;
|
||||
|
||||
of_id = of_match_device(ath11k_ahb_of_match, &pdev->dev);
|
||||
if (!of_id) {
|
||||
dev_err(&pdev->dev, "failed to find matching device tree id\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
hw_rev = (uintptr_t)of_id->data;
|
||||
hw_rev = (uintptr_t)device_get_match_data(&pdev->dev);
|
||||
|
||||
switch (hw_rev) {
|
||||
case ATH11K_HW_IPQ8074:
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include "debug.h"
|
||||
#include "hif.h"
|
||||
#include "wow.h"
|
||||
#include "fw.h"
|
||||
|
||||
unsigned int ath11k_debug_mask;
|
||||
EXPORT_SYMBOL(ath11k_debug_mask);
|
||||
|
|
@ -1317,6 +1318,7 @@ int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
|
|||
{
|
||||
char *boardname = NULL, *fallback_boardname = NULL, *chip_id_boardname = NULL;
|
||||
char *filename, filepath[100];
|
||||
int bd_api;
|
||||
int ret = 0;
|
||||
|
||||
filename = ATH11K_BOARD_API2_FILE;
|
||||
|
|
@ -1332,7 +1334,7 @@ int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
ab->bd_api = 2;
|
||||
bd_api = 2;
|
||||
ret = ath11k_core_fetch_board_data_api_n(ab, bd, boardname,
|
||||
ATH11K_BD_IE_BOARD,
|
||||
ATH11K_BD_IE_BOARD_NAME,
|
||||
|
|
@ -1381,7 +1383,7 @@ int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
|
|||
if (!ret)
|
||||
goto exit;
|
||||
|
||||
ab->bd_api = 1;
|
||||
bd_api = 1;
|
||||
ret = ath11k_core_fetch_board_data_api_1(ab, bd, ATH11K_DEFAULT_BOARD_FILE);
|
||||
if (ret) {
|
||||
ath11k_core_create_firmware_path(ab, filename,
|
||||
|
|
@ -1405,7 +1407,7 @@ int ath11k_core_fetch_bdf(struct ath11k_base *ab, struct ath11k_board_data *bd)
|
|||
kfree(chip_id_boardname);
|
||||
|
||||
if (!ret)
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT, "using board api %d\n", ab->bd_api);
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT, "using board api %d\n", bd_api);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2071,6 +2073,12 @@ int ath11k_core_pre_init(struct ath11k_base *ab)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = ath11k_fw_pre_init(ab);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to pre init firmware: %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_core_pre_init);
|
||||
|
|
@ -2101,6 +2109,7 @@ void ath11k_core_deinit(struct ath11k_base *ab)
|
|||
ath11k_hif_power_down(ab);
|
||||
ath11k_mac_destroy(ab);
|
||||
ath11k_core_soc_destroy(ab);
|
||||
ath11k_fw_destroy(ab);
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_core_deinit);
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@
|
|||
#include <linux/ctype.h>
|
||||
#include <linux/rhashtable.h>
|
||||
#include <linux/average.h>
|
||||
#include <linux/firmware.h>
|
||||
|
||||
#include "qmi.h"
|
||||
#include "htc.h"
|
||||
#include "wmi.h"
|
||||
|
|
@ -29,6 +31,7 @@
|
|||
#include "dbring.h"
|
||||
#include "spectral.h"
|
||||
#include "wow.h"
|
||||
#include "fw.h"
|
||||
|
||||
#define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
|
||||
|
||||
|
|
@ -906,7 +909,6 @@ struct ath11k_base {
|
|||
struct ath11k_targ_cap target_caps;
|
||||
u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE];
|
||||
bool pdevs_macaddr_valid;
|
||||
int bd_api;
|
||||
|
||||
struct ath11k_hw_params hw_params;
|
||||
|
||||
|
|
@ -982,6 +984,18 @@ struct ath11k_base {
|
|||
const struct ath11k_pci_ops *ops;
|
||||
} pci;
|
||||
|
||||
struct {
|
||||
u32 api_version;
|
||||
|
||||
const struct firmware *fw;
|
||||
const u8 *amss_data;
|
||||
size_t amss_len;
|
||||
const u8 *m3_data;
|
||||
size_t m3_len;
|
||||
|
||||
DECLARE_BITMAP(fw_features, ATH11K_FW_FEATURE_COUNT);
|
||||
} fw;
|
||||
|
||||
#ifdef CONFIG_NL80211_TESTMODE
|
||||
struct {
|
||||
u32 data_pos;
|
||||
|
|
@ -1223,6 +1237,11 @@ static inline struct ath11k_vif *ath11k_vif_to_arvif(struct ieee80211_vif *vif)
|
|||
return (struct ath11k_vif *)vif->drv_priv;
|
||||
}
|
||||
|
||||
static inline struct ath11k_sta *ath11k_sta_to_arsta(struct ieee80211_sta *sta)
|
||||
{
|
||||
return (struct ath11k_sta *)sta->drv_priv;
|
||||
}
|
||||
|
||||
static inline struct ath11k *ath11k_ab_to_ar(struct ath11k_base *ab,
|
||||
int mac_id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1459,7 +1459,7 @@ static void ath11k_reset_peer_ps_duration(void *data,
|
|||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k *ar = data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
arsta->ps_total_duration = 0;
|
||||
|
|
@ -1510,7 +1510,7 @@ static void ath11k_peer_ps_state_disable(void *data,
|
|||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k *ar = data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
arsta->peer_ps_state = WMI_PEER_PS_STATE_DISABLED;
|
||||
|
|
@ -1591,10 +1591,10 @@ static const struct file_operations fops_ps_state_enable = {
|
|||
int ath11k_debugfs_register(struct ath11k *ar)
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
char pdev_name[5];
|
||||
char pdev_name[10];
|
||||
char buf[100] = {0};
|
||||
|
||||
snprintf(pdev_name, sizeof(pdev_name), "%s%d", "mac", ar->pdev_idx);
|
||||
snprintf(pdev_name, sizeof(pdev_name), "%s%u", "mac", ar->pdev_idx);
|
||||
|
||||
ar->debug.debugfs_pdev = debugfs_create_dir(pdev_name, ab->debugfs_soc);
|
||||
if (IS_ERR(ar->debug.debugfs_pdev))
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ static ssize_t ath11k_dbg_sta_dump_tx_stats(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct ath11k_htt_data_stats *stats;
|
||||
static const char *str_name[ATH11K_STATS_TYPE_MAX] = {"succ", "fail",
|
||||
|
|
@ -243,7 +243,7 @@ static ssize_t ath11k_dbg_sta_dump_rx_stats(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct ath11k_rx_peer_stats *rx_stats = arsta->rx_stats;
|
||||
int len = 0, i, retval = 0;
|
||||
|
|
@ -340,7 +340,7 @@ static int
|
|||
ath11k_dbg_sta_open_htt_peer_stats(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ieee80211_sta *sta = inode->i_private;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct debug_htt_stats_req *stats_req;
|
||||
int type = ar->debug.htt_stats.type;
|
||||
|
|
@ -376,7 +376,7 @@ static int
|
|||
ath11k_dbg_sta_release_htt_peer_stats(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct ieee80211_sta *sta = inode->i_private;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
|
@ -413,7 +413,7 @@ static ssize_t ath11k_dbg_sta_write_peer_pktlog(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
int ret, enable;
|
||||
|
||||
|
|
@ -453,7 +453,7 @@ static ssize_t ath11k_dbg_sta_read_peer_pktlog(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[32] = {0};
|
||||
int len;
|
||||
|
|
@ -480,7 +480,7 @@ static ssize_t ath11k_dbg_sta_write_delba(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 tid, initiator, reason;
|
||||
int ret;
|
||||
|
|
@ -531,7 +531,7 @@ static ssize_t ath11k_dbg_sta_write_addba_resp(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 tid, status;
|
||||
int ret;
|
||||
|
|
@ -581,7 +581,7 @@ static ssize_t ath11k_dbg_sta_write_addba(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 tid, buf_size;
|
||||
int ret;
|
||||
|
|
@ -632,7 +632,7 @@ static ssize_t ath11k_dbg_sta_read_aggr_mode(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[64];
|
||||
int len = 0;
|
||||
|
|
@ -652,7 +652,7 @@ static ssize_t ath11k_dbg_sta_write_aggr_mode(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u32 aggr_mode;
|
||||
int ret;
|
||||
|
|
@ -697,7 +697,7 @@ ath11k_write_htt_peer_stats_reset(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
struct htt_ext_stats_cfg_params cfg_params = { 0 };
|
||||
int ret;
|
||||
|
|
@ -756,7 +756,7 @@ static ssize_t ath11k_dbg_sta_read_peer_ps_state(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[20];
|
||||
int len;
|
||||
|
|
@ -783,7 +783,7 @@ static ssize_t ath11k_dbg_sta_read_current_ps_duration(struct file *file,
|
|||
loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
u64 time_since_station_in_power_save;
|
||||
char buf[20];
|
||||
|
|
@ -817,7 +817,7 @@ static ssize_t ath11k_dbg_sta_read_total_ps_duration(struct file *file,
|
|||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ieee80211_sta *sta = file->private_data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
char buf[20];
|
||||
u64 power_save_duration;
|
||||
|
|
|
|||
|
|
@ -1099,7 +1099,7 @@ int ath11k_dp_rx_ampdu_start(struct ath11k *ar,
|
|||
struct ieee80211_ampdu_params *params)
|
||||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_sta *arsta = (void *)params->sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta);
|
||||
int vdev_id = arsta->arvif->vdev_id;
|
||||
int ret;
|
||||
|
||||
|
|
@ -1117,7 +1117,7 @@ int ath11k_dp_rx_ampdu_stop(struct ath11k *ar,
|
|||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_peer *peer;
|
||||
struct ath11k_sta *arsta = (void *)params->sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(params->sta);
|
||||
int vdev_id = arsta->arvif->vdev_id;
|
||||
dma_addr_t paddr;
|
||||
bool active;
|
||||
|
|
@ -1456,7 +1456,7 @@ ath11k_update_per_peer_tx_stats(struct ath11k *ar,
|
|||
}
|
||||
|
||||
sta = peer->sta;
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
memset(&arsta->txrate, 0, sizeof(arsta->txrate));
|
||||
|
||||
|
|
@ -1618,14 +1618,20 @@ static void ath11k_htt_pktlog(struct ath11k_base *ab, struct sk_buff *skb)
|
|||
u8 pdev_id;
|
||||
|
||||
pdev_id = FIELD_GET(HTT_T2H_PPDU_STATS_INFO_PDEV_ID, data->hdr);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ar = ath11k_mac_get_ar_by_pdev_id(ab, pdev_id);
|
||||
if (!ar) {
|
||||
ath11k_warn(ab, "invalid pdev id %d on htt pktlog\n", pdev_id);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
trace_ath11k_htt_pktlog(ar, data->payload, hdr->size,
|
||||
ar->ab->pktlog_defs_checksum);
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void ath11k_htt_backpressure_event_handler(struct ath11k_base *ab,
|
||||
|
|
@ -5242,7 +5248,7 @@ int ath11k_dp_rx_process_mon_status(struct ath11k_base *ab, int mac_id,
|
|||
goto next_skb;
|
||||
}
|
||||
|
||||
arsta = (struct ath11k_sta *)peer->sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(peer->sta);
|
||||
ath11k_dp_rx_update_peer_stats(arsta, ppdu_info);
|
||||
|
||||
if (ath11k_debugfs_is_pktlog_peer_valid(ar, peer->addr))
|
||||
|
|
|
|||
|
|
@ -467,7 +467,7 @@ void ath11k_dp_tx_update_txcompl(struct ath11k *ar, struct hal_tx_status *ts)
|
|||
}
|
||||
|
||||
sta = peer->sta;
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
memset(&arsta->txrate, 0, sizeof(arsta->txrate));
|
||||
pkt_type = FIELD_GET(HAL_TX_RATE_STATS_INFO0_PKT_TYPE,
|
||||
|
|
@ -627,7 +627,7 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar,
|
|||
ieee80211_free_txskb(ar->hw, msdu);
|
||||
return;
|
||||
}
|
||||
arsta = (struct ath11k_sta *)peer->sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(peer->sta);
|
||||
status.sta = peer->sta;
|
||||
status.skb = msdu;
|
||||
status.info = info;
|
||||
|
|
|
|||
168
drivers/net/wireless/ath/ath11k/fw.c
Normal file
168
drivers/net/wireless/ath/ath11k/fw.c
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
static int ath11k_fw_request_firmware_api_n(struct ath11k_base *ab,
|
||||
const char *name)
|
||||
{
|
||||
size_t magic_len, len, ie_len;
|
||||
int ie_id, i, index, bit, ret;
|
||||
struct ath11k_fw_ie *hdr;
|
||||
const u8 *data;
|
||||
__le32 *timestamp;
|
||||
|
||||
ab->fw.fw = ath11k_core_firmware_request(ab, name);
|
||||
if (IS_ERR(ab->fw.fw)) {
|
||||
ret = PTR_ERR(ab->fw.fw);
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT, "failed to load %s: %d\n", name, ret);
|
||||
ab->fw.fw = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
data = ab->fw.fw->data;
|
||||
len = ab->fw.fw->size;
|
||||
|
||||
/* magic also includes the null byte, check that as well */
|
||||
magic_len = strlen(ATH11K_FIRMWARE_MAGIC) + 1;
|
||||
|
||||
if (len < magic_len) {
|
||||
ath11k_err(ab, "firmware image too small to contain magic: %zu\n",
|
||||
len);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (memcmp(data, ATH11K_FIRMWARE_MAGIC, magic_len) != 0) {
|
||||
ath11k_err(ab, "Invalid firmware magic\n");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* jump over the padding */
|
||||
magic_len = ALIGN(magic_len, 4);
|
||||
|
||||
/* make sure there's space for padding */
|
||||
if (magic_len > len) {
|
||||
ath11k_err(ab, "No space for padding after magic\n");
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
len -= magic_len;
|
||||
data += magic_len;
|
||||
|
||||
/* loop elements */
|
||||
while (len > sizeof(struct ath11k_fw_ie)) {
|
||||
hdr = (struct ath11k_fw_ie *)data;
|
||||
|
||||
ie_id = le32_to_cpu(hdr->id);
|
||||
ie_len = le32_to_cpu(hdr->len);
|
||||
|
||||
len -= sizeof(*hdr);
|
||||
data += sizeof(*hdr);
|
||||
|
||||
if (len < ie_len) {
|
||||
ath11k_err(ab, "Invalid length for FW IE %d (%zu < %zu)\n",
|
||||
ie_id, len, ie_len);
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch (ie_id) {
|
||||
case ATH11K_FW_IE_TIMESTAMP:
|
||||
if (ie_len != sizeof(u32))
|
||||
break;
|
||||
|
||||
timestamp = (__le32 *)data;
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT, "found fw timestamp %d\n",
|
||||
le32_to_cpup(timestamp));
|
||||
break;
|
||||
case ATH11K_FW_IE_FEATURES:
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT,
|
||||
"found firmware features ie (%zd B)\n",
|
||||
ie_len);
|
||||
|
||||
for (i = 0; i < ATH11K_FW_FEATURE_COUNT; i++) {
|
||||
index = i / 8;
|
||||
bit = i % 8;
|
||||
|
||||
if (index == ie_len)
|
||||
break;
|
||||
|
||||
if (data[index] & (1 << bit))
|
||||
__set_bit(i, ab->fw.fw_features);
|
||||
}
|
||||
|
||||
ath11k_dbg_dump(ab, ATH11K_DBG_BOOT, "features", "",
|
||||
ab->fw.fw_features,
|
||||
sizeof(ab->fw.fw_features));
|
||||
break;
|
||||
case ATH11K_FW_IE_AMSS_IMAGE:
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT,
|
||||
"found fw image ie (%zd B)\n",
|
||||
ie_len);
|
||||
|
||||
ab->fw.amss_data = data;
|
||||
ab->fw.amss_len = ie_len;
|
||||
break;
|
||||
case ATH11K_FW_IE_M3_IMAGE:
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT,
|
||||
"found m3 image ie (%zd B)\n",
|
||||
ie_len);
|
||||
|
||||
ab->fw.m3_data = data;
|
||||
ab->fw.m3_len = ie_len;
|
||||
break;
|
||||
default:
|
||||
ath11k_warn(ab, "Unknown FW IE: %u\n", ie_id);
|
||||
break;
|
||||
}
|
||||
|
||||
/* jump over the padding */
|
||||
ie_len = ALIGN(ie_len, 4);
|
||||
|
||||
/* make sure there's space for padding */
|
||||
if (ie_len > len)
|
||||
break;
|
||||
|
||||
len -= ie_len;
|
||||
data += ie_len;
|
||||
};
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
release_firmware(ab->fw.fw);
|
||||
ab->fw.fw = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ath11k_fw_pre_init(struct ath11k_base *ab)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ath11k_fw_request_firmware_api_n(ab, ATH11K_FW_API2_FILE);
|
||||
if (ret == 0) {
|
||||
ab->fw.api_version = 2;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ab->fw.api_version = 1;
|
||||
|
||||
out:
|
||||
ath11k_dbg(ab, ATH11K_DBG_BOOT, "using fw api %d\n",
|
||||
ab->fw.api_version);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ath11k_fw_destroy(struct ath11k_base *ab)
|
||||
{
|
||||
release_firmware(ab->fw.fw);
|
||||
}
|
||||
27
drivers/net/wireless/ath/ath11k/fw.h
Normal file
27
drivers/net/wireless/ath/ath11k/fw.h
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
||||
/*
|
||||
* Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef ATH11K_FW_H
|
||||
#define ATH11K_FW_H
|
||||
|
||||
#define ATH11K_FW_API2_FILE "firmware-2.bin"
|
||||
#define ATH11K_FIRMWARE_MAGIC "QCOM-ATH11K-FW"
|
||||
|
||||
enum ath11k_fw_ie_type {
|
||||
ATH11K_FW_IE_TIMESTAMP = 0,
|
||||
ATH11K_FW_IE_FEATURES = 1,
|
||||
ATH11K_FW_IE_AMSS_IMAGE = 2,
|
||||
ATH11K_FW_IE_M3_IMAGE = 3,
|
||||
};
|
||||
|
||||
enum ath11k_fw_features {
|
||||
/* keep last */
|
||||
ATH11K_FW_FEATURE_COUNT,
|
||||
};
|
||||
|
||||
int ath11k_fw_pre_init(struct ath11k_base *ab);
|
||||
void ath11k_fw_destroy(struct ath11k_base *ab);
|
||||
|
||||
#endif /* ATH11K_FW_H */
|
||||
|
|
@ -9,18 +9,18 @@
|
|||
#include "core.h"
|
||||
|
||||
struct ath11k_hif_ops {
|
||||
u32 (*read32)(struct ath11k_base *sc, u32 address);
|
||||
void (*write32)(struct ath11k_base *sc, u32 address, u32 data);
|
||||
u32 (*read32)(struct ath11k_base *ab, u32 address);
|
||||
void (*write32)(struct ath11k_base *ab, u32 address, u32 data);
|
||||
int (*read)(struct ath11k_base *ab, void *buf, u32 start, u32 end);
|
||||
void (*irq_enable)(struct ath11k_base *sc);
|
||||
void (*irq_disable)(struct ath11k_base *sc);
|
||||
int (*start)(struct ath11k_base *sc);
|
||||
void (*stop)(struct ath11k_base *sc);
|
||||
int (*power_up)(struct ath11k_base *sc);
|
||||
void (*power_down)(struct ath11k_base *sc);
|
||||
void (*irq_enable)(struct ath11k_base *ab);
|
||||
void (*irq_disable)(struct ath11k_base *ab);
|
||||
int (*start)(struct ath11k_base *ab);
|
||||
void (*stop)(struct ath11k_base *ab);
|
||||
int (*power_up)(struct ath11k_base *ab);
|
||||
void (*power_down)(struct ath11k_base *ab);
|
||||
int (*suspend)(struct ath11k_base *ab);
|
||||
int (*resume)(struct ath11k_base *ab);
|
||||
int (*map_service_to_pipe)(struct ath11k_base *sc, u16 service_id,
|
||||
int (*map_service_to_pipe)(struct ath11k_base *ab, u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe);
|
||||
int (*get_user_msi_vector)(struct ath11k_base *ab, char *user_name,
|
||||
int *num_vectors, u32 *user_base_data,
|
||||
|
|
@ -44,34 +44,34 @@ static inline void ath11k_hif_ce_irq_disable(struct ath11k_base *ab)
|
|||
ab->hif.ops->ce_irq_disable(ab);
|
||||
}
|
||||
|
||||
static inline int ath11k_hif_start(struct ath11k_base *sc)
|
||||
static inline int ath11k_hif_start(struct ath11k_base *ab)
|
||||
{
|
||||
return sc->hif.ops->start(sc);
|
||||
return ab->hif.ops->start(ab);
|
||||
}
|
||||
|
||||
static inline void ath11k_hif_stop(struct ath11k_base *sc)
|
||||
static inline void ath11k_hif_stop(struct ath11k_base *ab)
|
||||
{
|
||||
sc->hif.ops->stop(sc);
|
||||
ab->hif.ops->stop(ab);
|
||||
}
|
||||
|
||||
static inline void ath11k_hif_irq_enable(struct ath11k_base *sc)
|
||||
static inline void ath11k_hif_irq_enable(struct ath11k_base *ab)
|
||||
{
|
||||
sc->hif.ops->irq_enable(sc);
|
||||
ab->hif.ops->irq_enable(ab);
|
||||
}
|
||||
|
||||
static inline void ath11k_hif_irq_disable(struct ath11k_base *sc)
|
||||
static inline void ath11k_hif_irq_disable(struct ath11k_base *ab)
|
||||
{
|
||||
sc->hif.ops->irq_disable(sc);
|
||||
ab->hif.ops->irq_disable(ab);
|
||||
}
|
||||
|
||||
static inline int ath11k_hif_power_up(struct ath11k_base *sc)
|
||||
static inline int ath11k_hif_power_up(struct ath11k_base *ab)
|
||||
{
|
||||
return sc->hif.ops->power_up(sc);
|
||||
return ab->hif.ops->power_up(ab);
|
||||
}
|
||||
|
||||
static inline void ath11k_hif_power_down(struct ath11k_base *sc)
|
||||
static inline void ath11k_hif_power_down(struct ath11k_base *ab)
|
||||
{
|
||||
sc->hif.ops->power_down(sc);
|
||||
ab->hif.ops->power_down(ab);
|
||||
}
|
||||
|
||||
static inline int ath11k_hif_suspend(struct ath11k_base *ab)
|
||||
|
|
@ -90,14 +90,14 @@ static inline int ath11k_hif_resume(struct ath11k_base *ab)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 ath11k_hif_read32(struct ath11k_base *sc, u32 address)
|
||||
static inline u32 ath11k_hif_read32(struct ath11k_base *ab, u32 address)
|
||||
{
|
||||
return sc->hif.ops->read32(sc, address);
|
||||
return ab->hif.ops->read32(ab, address);
|
||||
}
|
||||
|
||||
static inline void ath11k_hif_write32(struct ath11k_base *sc, u32 address, u32 data)
|
||||
static inline void ath11k_hif_write32(struct ath11k_base *ab, u32 address, u32 data)
|
||||
{
|
||||
sc->hif.ops->write32(sc, address, data);
|
||||
ab->hif.ops->write32(ab, address, data);
|
||||
}
|
||||
|
||||
static inline int ath11k_hif_read(struct ath11k_base *ab, void *buf,
|
||||
|
|
@ -109,10 +109,10 @@ static inline int ath11k_hif_read(struct ath11k_base *ab, void *buf,
|
|||
return ab->hif.ops->read(ab, buf, start, end);
|
||||
}
|
||||
|
||||
static inline int ath11k_hif_map_service_to_pipe(struct ath11k_base *sc, u16 service_id,
|
||||
static inline int ath11k_hif_map_service_to_pipe(struct ath11k_base *ab, u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe)
|
||||
{
|
||||
return sc->hif.ops->map_service_to_pipe(sc, service_id, ul_pipe, dl_pipe);
|
||||
return ab->hif.ops->map_service_to_pipe(ab, service_id, ul_pipe, dl_pipe);
|
||||
}
|
||||
|
||||
static inline int ath11k_get_user_msi_vector(struct ath11k_base *ab, char *user_name,
|
||||
|
|
|
|||
|
|
@ -156,18 +156,6 @@ struct ath11k_htc_record {
|
|||
};
|
||||
} __packed __aligned(4);
|
||||
|
||||
/* note: the trailer offset is dynamic depending
|
||||
* on payload length. this is only a struct layout draft
|
||||
*/
|
||||
struct ath11k_htc_frame {
|
||||
struct ath11k_htc_hdr hdr;
|
||||
union {
|
||||
struct ath11k_htc_msg msg;
|
||||
u8 payload[0];
|
||||
};
|
||||
struct ath11k_htc_record trailer[0];
|
||||
} __packed __aligned(4);
|
||||
|
||||
enum ath11k_htc_svc_gid {
|
||||
ATH11K_HTC_SVC_GRP_RSVD = 0,
|
||||
ATH11K_HTC_SVC_GRP_WMI = 1,
|
||||
|
|
|
|||
|
|
@ -2832,7 +2832,7 @@ static void ath11k_peer_assoc_prepare(struct ath11k *ar,
|
|||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
memset(arg, 0, sizeof(*arg));
|
||||
|
||||
|
|
@ -4315,7 +4315,7 @@ static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
ath11k_warn(ab, "peer %pM disappeared!\n", peer_addr);
|
||||
|
||||
if (sta) {
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
|
|
@ -4906,7 +4906,7 @@ static int ath11k_mac_station_add(struct ath11k *ar,
|
|||
{
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct peer_create_params peer_param;
|
||||
int ret;
|
||||
|
||||
|
|
@ -5030,7 +5030,7 @@ static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,
|
|||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k_peer *peer;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -5196,7 +5196,7 @@ static void ath11k_mac_op_sta_set_4addr(struct ieee80211_hw *hw,
|
|||
struct ieee80211_sta *sta, bool enabled)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
if (enabled && !arsta->use_4addr_set) {
|
||||
ieee80211_queue_work(ar->hw, &arsta->set_4addr_wk);
|
||||
|
|
@ -5210,7 +5210,7 @@ static void ath11k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
|||
u32 changed)
|
||||
{
|
||||
struct ath11k *ar = hw->priv;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
|
||||
struct ath11k_peer *peer;
|
||||
u32 bw, smps;
|
||||
|
|
@ -6203,7 +6203,7 @@ static void ath11k_mac_op_tx(struct ieee80211_hw *hw,
|
|||
}
|
||||
|
||||
if (control->sta)
|
||||
arsta = (struct ath11k_sta *)control->sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(control->sta);
|
||||
|
||||
ret = ath11k_dp_tx(ar, arvif, arsta, skb);
|
||||
if (unlikely(ret)) {
|
||||
|
|
@ -8235,7 +8235,7 @@ static void ath11k_mac_set_bitrate_mask_iter(void *data,
|
|||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath11k_vif *arvif = data;
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arvif->ar;
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
|
|
@ -8639,7 +8639,7 @@ static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
|
|||
struct ieee80211_sta *sta,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
struct ath11k_sta *arsta = ath11k_sta_to_arsta(sta);
|
||||
struct ath11k *ar = arsta->arvif->ar;
|
||||
s8 signal;
|
||||
bool db2dbm = test_bit(WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT,
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include <linux/msi.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/ioport.h>
|
||||
|
|
@ -390,16 +391,23 @@ int ath11k_mhi_register(struct ath11k_pci *ab_pci)
|
|||
if (!mhi_ctrl)
|
||||
return -ENOMEM;
|
||||
|
||||
ath11k_core_create_firmware_path(ab, ATH11K_AMSS_FILE,
|
||||
ab_pci->amss_path,
|
||||
sizeof(ab_pci->amss_path));
|
||||
|
||||
ab_pci->mhi_ctrl = mhi_ctrl;
|
||||
mhi_ctrl->cntrl_dev = ab->dev;
|
||||
mhi_ctrl->fw_image = ab_pci->amss_path;
|
||||
mhi_ctrl->regs = ab->mem;
|
||||
mhi_ctrl->reg_len = ab->mem_len;
|
||||
|
||||
if (ab->fw.amss_data && ab->fw.amss_len > 0) {
|
||||
/* use MHI firmware file from firmware-N.bin */
|
||||
mhi_ctrl->fw_data = ab->fw.amss_data;
|
||||
mhi_ctrl->fw_sz = ab->fw.amss_len;
|
||||
} else {
|
||||
/* use the old separate mhi.bin MHI firmware file */
|
||||
ath11k_core_create_firmware_path(ab, ATH11K_AMSS_FILE,
|
||||
ab_pci->amss_path,
|
||||
sizeof(ab_pci->amss_path));
|
||||
mhi_ctrl->fw_image = ab_pci->amss_path;
|
||||
}
|
||||
|
||||
ret = ath11k_mhi_get_msi(ab_pci);
|
||||
if (ret) {
|
||||
ath11k_err(ab, "failed to get msi for mhi\n");
|
||||
|
|
|
|||
|
|
@ -422,14 +422,14 @@ static void ath11k_pcic_ext_grp_disable(struct ath11k_ext_irq_grp *irq_grp)
|
|||
disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
|
||||
}
|
||||
|
||||
static void __ath11k_pcic_ext_irq_disable(struct ath11k_base *sc)
|
||||
static void __ath11k_pcic_ext_irq_disable(struct ath11k_base *ab)
|
||||
{
|
||||
int i;
|
||||
|
||||
clear_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &sc->dev_flags);
|
||||
clear_bit(ATH11K_FLAG_EXT_IRQ_ENABLED, &ab->dev_flags);
|
||||
|
||||
for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
|
||||
struct ath11k_ext_irq_grp *irq_grp = &sc->ext_irq_grp[i];
|
||||
struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
|
||||
|
||||
ath11k_pcic_ext_grp_disable(irq_grp);
|
||||
|
||||
|
|
|
|||
|
|
@ -446,7 +446,7 @@ int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
|
|||
peer->sec_type_grp = HAL_ENCRYPT_TYPE_OPEN;
|
||||
|
||||
if (sta) {
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
arsta->tcl_metadata |= FIELD_PREP(HTT_TCL_META_DATA_TYPE, 0) |
|
||||
FIELD_PREP(HTT_TCL_META_DATA_PEER_ID,
|
||||
peer->peer_id);
|
||||
|
|
|
|||
|
|
@ -2502,38 +2502,56 @@ static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab,
|
|||
static int ath11k_qmi_m3_load(struct ath11k_base *ab)
|
||||
{
|
||||
struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
|
||||
const struct firmware *fw;
|
||||
const struct firmware *fw = NULL;
|
||||
const void *m3_data;
|
||||
char path[100];
|
||||
size_t m3_len;
|
||||
int ret;
|
||||
|
||||
fw = ath11k_core_firmware_request(ab, ATH11K_M3_FILE);
|
||||
if (IS_ERR(fw)) {
|
||||
ret = PTR_ERR(fw);
|
||||
ath11k_core_create_firmware_path(ab, ATH11K_M3_FILE,
|
||||
path, sizeof(path));
|
||||
ath11k_err(ab, "failed to load %s: %d\n", path, ret);
|
||||
return ret;
|
||||
if (m3_mem->vaddr)
|
||||
/* m3 firmware buffer is already available in the DMA buffer */
|
||||
return 0;
|
||||
|
||||
if (ab->fw.m3_data && ab->fw.m3_len > 0) {
|
||||
/* firmware-N.bin had a m3 firmware file so use that */
|
||||
m3_data = ab->fw.m3_data;
|
||||
m3_len = ab->fw.m3_len;
|
||||
} else {
|
||||
/* No m3 file in firmware-N.bin so try to request old
|
||||
* separate m3.bin.
|
||||
*/
|
||||
fw = ath11k_core_firmware_request(ab, ATH11K_M3_FILE);
|
||||
if (IS_ERR(fw)) {
|
||||
ret = PTR_ERR(fw);
|
||||
ath11k_core_create_firmware_path(ab, ATH11K_M3_FILE,
|
||||
path, sizeof(path));
|
||||
ath11k_err(ab, "failed to load %s: %d\n", path, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
m3_data = fw->data;
|
||||
m3_len = fw->size;
|
||||
}
|
||||
|
||||
if (m3_mem->vaddr || m3_mem->size)
|
||||
goto skip_m3_alloc;
|
||||
|
||||
m3_mem->vaddr = dma_alloc_coherent(ab->dev,
|
||||
fw->size, &m3_mem->paddr,
|
||||
m3_len, &m3_mem->paddr,
|
||||
GFP_KERNEL);
|
||||
if (!m3_mem->vaddr) {
|
||||
ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
|
||||
fw->size);
|
||||
release_firmware(fw);
|
||||
return -ENOMEM;
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
skip_m3_alloc:
|
||||
memcpy(m3_mem->vaddr, fw->data, fw->size);
|
||||
m3_mem->size = fw->size;
|
||||
memcpy(m3_mem->vaddr, m3_data, m3_len);
|
||||
m3_mem->size = m3_len;
|
||||
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
release_firmware(fw);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ath11k_qmi_m3_free(struct ath11k_base *ab)
|
||||
|
|
|
|||
|
|
@ -352,6 +352,16 @@ static u32 ath11k_map_fw_reg_flags(u16 reg_flags)
|
|||
return flags;
|
||||
}
|
||||
|
||||
static u32 ath11k_map_fw_phy_flags(u32 phy_flags)
|
||||
{
|
||||
u32 flags = 0;
|
||||
|
||||
if (phy_flags & ATH11K_REG_PHY_BITMAP_NO11AX)
|
||||
flags |= NL80211_RRF_NO_HE;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
static bool
|
||||
ath11k_reg_can_intersect(struct ieee80211_reg_rule *rule1,
|
||||
struct ieee80211_reg_rule *rule2)
|
||||
|
|
@ -685,6 +695,7 @@ ath11k_reg_build_regd(struct ath11k_base *ab,
|
|||
}
|
||||
|
||||
flags |= ath11k_map_fw_reg_flags(reg_rule->flags);
|
||||
flags |= ath11k_map_fw_phy_flags(reg_info->phybitmap);
|
||||
|
||||
ath11k_reg_update_rule(tmp_regd->reg_rules + i,
|
||||
reg_rule->start_freq,
|
||||
|
|
|
|||
|
|
@ -24,6 +24,9 @@ enum ath11k_dfs_region {
|
|||
ATH11K_DFS_REG_UNDEF,
|
||||
};
|
||||
|
||||
/* Phy bitmaps */
|
||||
#define ATH11K_REG_PHY_BITMAP_NO11AX BIT(5)
|
||||
|
||||
/* ATH11K Regulatory API's */
|
||||
void ath11k_reg_init(struct ath11k *ar);
|
||||
void ath11k_reg_free(struct ath11k_base *ab);
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ ATTRIBUTE_GROUPS(ath11k_hwmon);
|
|||
|
||||
int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state)
|
||||
{
|
||||
struct ath11k_base *sc = ar->ab;
|
||||
struct ath11k_base *ab = ar->ab;
|
||||
struct thermal_mitigation_params param;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -147,14 +147,14 @@ int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state)
|
|||
|
||||
ret = ath11k_wmi_send_thermal_mitigation_param_cmd(ar, ¶m);
|
||||
if (ret) {
|
||||
ath11k_warn(sc, "failed to send thermal mitigation duty cycle %u ret %d\n",
|
||||
ath11k_warn(ab, "failed to send thermal mitigation duty cycle %u ret %d\n",
|
||||
throttle_state, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ath11k_thermal_register(struct ath11k_base *sc)
|
||||
int ath11k_thermal_register(struct ath11k_base *ab)
|
||||
{
|
||||
struct thermal_cooling_device *cdev;
|
||||
struct device *hwmon_dev;
|
||||
|
|
@ -162,8 +162,8 @@ int ath11k_thermal_register(struct ath11k_base *sc)
|
|||
struct ath11k_pdev *pdev;
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; i < sc->num_radios; i++) {
|
||||
pdev = &sc->pdevs[i];
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
pdev = &ab->pdevs[i];
|
||||
ar = pdev->ar;
|
||||
if (!ar)
|
||||
continue;
|
||||
|
|
@ -172,7 +172,7 @@ int ath11k_thermal_register(struct ath11k_base *sc)
|
|||
&ath11k_thermal_ops);
|
||||
|
||||
if (IS_ERR(cdev)) {
|
||||
ath11k_err(sc, "failed to setup thermal device result: %ld\n",
|
||||
ath11k_err(ab, "failed to setup thermal device result: %ld\n",
|
||||
PTR_ERR(cdev));
|
||||
ret = -EINVAL;
|
||||
goto err_thermal_destroy;
|
||||
|
|
@ -183,7 +183,7 @@ int ath11k_thermal_register(struct ath11k_base *sc)
|
|||
ret = sysfs_create_link(&ar->hw->wiphy->dev.kobj, &cdev->device.kobj,
|
||||
"cooling_device");
|
||||
if (ret) {
|
||||
ath11k_err(sc, "failed to create cooling device symlink\n");
|
||||
ath11k_err(ab, "failed to create cooling device symlink\n");
|
||||
goto err_thermal_destroy;
|
||||
}
|
||||
|
||||
|
|
@ -204,18 +204,18 @@ int ath11k_thermal_register(struct ath11k_base *sc)
|
|||
return 0;
|
||||
|
||||
err_thermal_destroy:
|
||||
ath11k_thermal_unregister(sc);
|
||||
ath11k_thermal_unregister(ab);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ath11k_thermal_unregister(struct ath11k_base *sc)
|
||||
void ath11k_thermal_unregister(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k *ar;
|
||||
struct ath11k_pdev *pdev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sc->num_radios; i++) {
|
||||
pdev = &sc->pdevs[i];
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
pdev = &ab->pdevs[i];
|
||||
ar = pdev->ar;
|
||||
if (!ar)
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -26,17 +26,17 @@ struct ath11k_thermal {
|
|||
};
|
||||
|
||||
#if IS_REACHABLE(CONFIG_THERMAL)
|
||||
int ath11k_thermal_register(struct ath11k_base *sc);
|
||||
void ath11k_thermal_unregister(struct ath11k_base *sc);
|
||||
int ath11k_thermal_register(struct ath11k_base *ab);
|
||||
void ath11k_thermal_unregister(struct ath11k_base *ab);
|
||||
int ath11k_thermal_set_throttling(struct ath11k *ar, u32 throttle_state);
|
||||
void ath11k_thermal_event_temperature(struct ath11k *ar, int temperature);
|
||||
#else
|
||||
static inline int ath11k_thermal_register(struct ath11k_base *sc)
|
||||
static inline int ath11k_thermal_register(struct ath11k_base *ab)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void ath11k_thermal_unregister(struct ath11k_base *sc)
|
||||
static inline void ath11k_thermal_unregister(struct ath11k_base *ab)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -292,18 +292,18 @@ static int ath11k_wmi_cmd_send_nowait(struct ath11k_pdev_wmi *wmi, struct sk_buf
|
|||
int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb,
|
||||
u32 cmd_id)
|
||||
{
|
||||
struct ath11k_wmi_base *wmi_sc = wmi->wmi_ab;
|
||||
struct ath11k_wmi_base *wmi_ab = wmi->wmi_ab;
|
||||
int ret = -EOPNOTSUPP;
|
||||
struct ath11k_base *ab = wmi_sc->ab;
|
||||
struct ath11k_base *ab = wmi_ab->ab;
|
||||
|
||||
might_sleep();
|
||||
|
||||
if (ab->hw_params.credit_flow) {
|
||||
wait_event_timeout(wmi_sc->tx_credits_wq, ({
|
||||
wait_event_timeout(wmi_ab->tx_credits_wq, ({
|
||||
ret = ath11k_wmi_cmd_send_nowait(wmi, skb, cmd_id);
|
||||
|
||||
if (ret && test_bit(ATH11K_FLAG_CRASH_FLUSH,
|
||||
&wmi_sc->ab->dev_flags))
|
||||
&wmi_ab->ab->dev_flags))
|
||||
ret = -ESHUTDOWN;
|
||||
|
||||
(ret != -EAGAIN);
|
||||
|
|
@ -313,7 +313,7 @@ int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb,
|
|||
ret = ath11k_wmi_cmd_send_nowait(wmi, skb, cmd_id);
|
||||
|
||||
if (ret && test_bit(ATH11K_FLAG_CRASH_FLUSH,
|
||||
&wmi_sc->ab->dev_flags))
|
||||
&wmi_ab->ab->dev_flags))
|
||||
ret = -ESHUTDOWN;
|
||||
|
||||
(ret != -ENOBUFS);
|
||||
|
|
@ -321,10 +321,10 @@ int ath11k_wmi_cmd_send(struct ath11k_pdev_wmi *wmi, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
if (ret == -EAGAIN)
|
||||
ath11k_warn(wmi_sc->ab, "wmi command %d timeout\n", cmd_id);
|
||||
ath11k_warn(wmi_ab->ab, "wmi command %d timeout\n", cmd_id);
|
||||
|
||||
if (ret == -ENOBUFS)
|
||||
ath11k_warn(wmi_sc->ab, "ce desc not available for wmi command %d\n",
|
||||
ath11k_warn(wmi_ab->ab, "ce desc not available for wmi command %d\n",
|
||||
cmd_id);
|
||||
|
||||
return ret;
|
||||
|
|
@ -611,10 +611,10 @@ static int ath11k_service_ready_event(struct ath11k_base *ab, struct sk_buff *sk
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct sk_buff *ath11k_wmi_alloc_skb(struct ath11k_wmi_base *wmi_sc, u32 len)
|
||||
struct sk_buff *ath11k_wmi_alloc_skb(struct ath11k_wmi_base *wmi_ab, u32 len)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct ath11k_base *ab = wmi_sc->ab;
|
||||
struct ath11k_base *ab = wmi_ab->ab;
|
||||
u32 round_len = roundup(len, 4);
|
||||
|
||||
skb = ath11k_htc_alloc_skb(ab, WMI_SKB_HEADROOM + round_len);
|
||||
|
|
@ -4291,7 +4291,7 @@ int ath11k_wmi_set_hw_mode(struct ath11k_base *ab,
|
|||
|
||||
int ath11k_wmi_cmd_init(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_wmi_base *wmi_sc = &ab->wmi_ab;
|
||||
struct ath11k_wmi_base *wmi_ab = &ab->wmi_ab;
|
||||
struct wmi_init_cmd_param init_param;
|
||||
struct target_resource_config config;
|
||||
|
||||
|
|
@ -4304,12 +4304,12 @@ int ath11k_wmi_cmd_init(struct ath11k_base *ab)
|
|||
ab->wmi_ab.svc_map))
|
||||
config.is_reg_cc_ext_event_supported = 1;
|
||||
|
||||
memcpy(&wmi_sc->wlan_resource_config, &config, sizeof(config));
|
||||
memcpy(&wmi_ab->wlan_resource_config, &config, sizeof(config));
|
||||
|
||||
init_param.res_cfg = &wmi_sc->wlan_resource_config;
|
||||
init_param.num_mem_chunks = wmi_sc->num_mem_chunks;
|
||||
init_param.hw_mode_id = wmi_sc->preferred_hw_mode;
|
||||
init_param.mem_chunks = wmi_sc->mem_chunks;
|
||||
init_param.res_cfg = &wmi_ab->wlan_resource_config;
|
||||
init_param.num_mem_chunks = wmi_ab->num_mem_chunks;
|
||||
init_param.hw_mode_id = wmi_ab->preferred_hw_mode;
|
||||
init_param.mem_chunks = wmi_ab->mem_chunks;
|
||||
|
||||
if (ab->hw_params.single_pdev_only)
|
||||
init_param.hw_mode_id = WMI_HOST_HW_MODE_MAX;
|
||||
|
|
@ -4317,7 +4317,7 @@ int ath11k_wmi_cmd_init(struct ath11k_base *ab)
|
|||
init_param.num_band_to_mac = ab->num_radios;
|
||||
ath11k_fill_band_to_mac_param(ab, init_param.band_to_mac);
|
||||
|
||||
return ath11k_init_cmd_send(&wmi_sc->wmi[0], &init_param);
|
||||
return ath11k_init_cmd_send(&wmi_ab->wmi[0], &init_param);
|
||||
}
|
||||
|
||||
int ath11k_wmi_vdev_spectral_conf(struct ath11k *ar,
|
||||
|
|
@ -5440,10 +5440,11 @@ static int ath11k_pull_reg_chan_list_ext_update_ev(struct ath11k_base *ab,
|
|||
}
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
"cc_ext %s dsf %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d",
|
||||
"cc_ext %s dfs %d BW: min_2ghz %d max_2ghz %d min_5ghz %d max_5ghz %d phy_bitmap 0x%x",
|
||||
reg_info->alpha2, reg_info->dfs_region,
|
||||
reg_info->min_bw_2ghz, reg_info->max_bw_2ghz,
|
||||
reg_info->min_bw_5ghz, reg_info->max_bw_5ghz);
|
||||
reg_info->min_bw_5ghz, reg_info->max_bw_5ghz,
|
||||
reg_info->phybitmap);
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
"num_2ghz_reg_rules %d num_5ghz_reg_rules %d",
|
||||
|
|
@ -6452,7 +6453,7 @@ static int ath11k_wmi_tlv_rssi_chain_parse(struct ath11k_base *ab,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(arsta->chain_signal) >
|
||||
ARRAY_SIZE(stats_rssi->rssi_avg_beacon));
|
||||
|
|
@ -6540,7 +6541,7 @@ static int ath11k_wmi_tlv_fw_stats_data_parse(struct ath11k_base *ab,
|
|||
arvif->bssid,
|
||||
NULL);
|
||||
if (sta) {
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
arsta->rssi_beacon = src->beacon_snr;
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI,
|
||||
"stats vdev id %d snr %d\n",
|
||||
|
|
@ -7467,7 +7468,7 @@ static void ath11k_wmi_event_peer_sta_ps_state_chg(struct ath11k_base *ab,
|
|||
goto exit;
|
||||
}
|
||||
|
||||
arsta = (struct ath11k_sta *)sta->drv_priv;
|
||||
arsta = ath11k_sta_to_arsta(sta);
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
|
||||
|
|
@ -8335,6 +8336,8 @@ ath11k_wmi_pdev_dfs_radar_detected_event(struct ath11k_base *ab, struct sk_buff
|
|||
ev->detector_id, ev->segment_id, ev->timestamp, ev->is_chirp,
|
||||
ev->freq_offset, ev->sidx);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ar = ath11k_mac_get_ar_by_pdev_id(ab, ev->pdev_id);
|
||||
|
||||
if (!ar) {
|
||||
|
|
@ -8352,6 +8355,8 @@ ath11k_wmi_pdev_dfs_radar_detected_event(struct ath11k_base *ab, struct sk_buff
|
|||
ieee80211_radar_detected(ar->hw);
|
||||
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
|
||||
kfree(tb);
|
||||
}
|
||||
|
||||
|
|
@ -8381,15 +8386,19 @@ ath11k_wmi_pdev_temperature_event(struct ath11k_base *ab,
|
|||
ath11k_dbg(ab, ATH11K_DBG_WMI, "event pdev temperature ev temp %d pdev_id %d\n",
|
||||
ev->temp, ev->pdev_id);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ar = ath11k_mac_get_ar_by_pdev_id(ab, ev->pdev_id);
|
||||
if (!ar) {
|
||||
ath11k_warn(ab, "invalid pdev id in pdev temperature ev %d", ev->pdev_id);
|
||||
kfree(tb);
|
||||
return;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ath11k_thermal_event_temperature(ar, ev->temp);
|
||||
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
|
||||
kfree(tb);
|
||||
}
|
||||
|
||||
|
|
@ -8609,12 +8618,13 @@ static void ath11k_wmi_gtk_offload_status_event(struct ath11k_base *ab,
|
|||
return;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
arvif = ath11k_mac_get_arvif_by_vdev_id(ab, ev->vdev_id);
|
||||
if (!arvif) {
|
||||
ath11k_warn(ab, "failed to get arvif for vdev_id:%d\n",
|
||||
ev->vdev_id);
|
||||
kfree(tb);
|
||||
return;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ath11k_dbg(ab, ATH11K_DBG_WMI, "event gtk offload refresh_cnt %d\n",
|
||||
|
|
@ -8631,6 +8641,8 @@ static void ath11k_wmi_gtk_offload_status_event(struct ath11k_base *ab,
|
|||
|
||||
ieee80211_gtk_rekey_notify(arvif->vif, arvif->bssid,
|
||||
(void *)&replay_ctr_be, GFP_ATOMIC);
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
|
||||
kfree(tb);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -360,6 +360,7 @@ int ath12k_core_fetch_board_data_api_1(struct ath12k_base *ab,
|
|||
int ath12k_core_fetch_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd)
|
||||
{
|
||||
char boardname[BOARD_NAME_SIZE];
|
||||
int bd_api;
|
||||
int ret;
|
||||
|
||||
ret = ath12k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE);
|
||||
|
|
@ -368,12 +369,12 @@ int ath12k_core_fetch_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ab->bd_api = 2;
|
||||
bd_api = 2;
|
||||
ret = ath12k_core_fetch_board_data_api_n(ab, bd, boardname);
|
||||
if (!ret)
|
||||
goto success;
|
||||
|
||||
ab->bd_api = 1;
|
||||
bd_api = 1;
|
||||
ret = ath12k_core_fetch_board_data_api_1(ab, bd, ATH12K_DEFAULT_BOARD_FILE);
|
||||
if (ret) {
|
||||
ath12k_err(ab, "failed to fetch board-2.bin or board.bin from %s\n",
|
||||
|
|
@ -382,7 +383,7 @@ int ath12k_core_fetch_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd)
|
|||
}
|
||||
|
||||
success:
|
||||
ath12k_dbg(ab, ATH12K_DBG_BOOT, "using board api %d\n", ab->bd_api);
|
||||
ath12k_dbg(ab, ATH12K_DBG_BOOT, "using board api %d\n", bd_api);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -960,6 +961,7 @@ static void ath12k_core_reset(struct work_struct *work)
|
|||
ATH12K_RECOVER_START_TIMEOUT_HZ);
|
||||
|
||||
ath12k_hif_power_down(ab);
|
||||
ath12k_qmi_free_resource(ab);
|
||||
ath12k_hif_power_up(ab);
|
||||
|
||||
ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset started\n");
|
||||
|
|
|
|||
|
|
@ -737,7 +737,6 @@ struct ath12k_base {
|
|||
struct ath12k_wmi_target_cap_arg target_caps;
|
||||
u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE];
|
||||
bool pdevs_macaddr_valid;
|
||||
int bd_api;
|
||||
|
||||
const struct ath12k_hw_params *hw_params;
|
||||
|
||||
|
|
@ -853,6 +852,11 @@ static inline struct ath12k_vif *ath12k_vif_to_arvif(struct ieee80211_vif *vif)
|
|||
return (struct ath12k_vif *)vif->drv_priv;
|
||||
}
|
||||
|
||||
static inline struct ath12k_sta *ath12k_sta_to_arsta(struct ieee80211_sta *sta)
|
||||
{
|
||||
return (struct ath12k_sta *)sta->drv_priv;
|
||||
}
|
||||
|
||||
static inline struct ath12k *ath12k_ab_to_ar(struct ath12k_base *ab,
|
||||
int mac_id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2374,7 +2374,7 @@ ath12k_dp_mon_rx_update_user_stats(struct ath12k *ar,
|
|||
return;
|
||||
}
|
||||
|
||||
arsta = (struct ath12k_sta *)peer->sta->drv_priv;
|
||||
arsta = ath12k_sta_to_arsta(peer->sta);
|
||||
rx_stats = arsta->rx_stats;
|
||||
|
||||
if (!rx_stats)
|
||||
|
|
@ -2550,7 +2550,7 @@ int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
|
|||
}
|
||||
|
||||
if (ppdu_info->reception_type == HAL_RX_RECEPTION_TYPE_SU) {
|
||||
arsta = (struct ath12k_sta *)peer->sta->drv_priv;
|
||||
arsta = ath12k_sta_to_arsta(peer->sta);
|
||||
ath12k_dp_mon_rx_update_peer_su_stats(ar, arsta,
|
||||
ppdu_info);
|
||||
} else if ((ppdu_info->fc_valid) &&
|
||||
|
|
|
|||
|
|
@ -1054,7 +1054,7 @@ int ath12k_dp_rx_ampdu_start(struct ath12k *ar,
|
|||
struct ieee80211_ampdu_params *params)
|
||||
{
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_sta *arsta = (void *)params->sta->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(params->sta);
|
||||
int vdev_id = arsta->arvif->vdev_id;
|
||||
int ret;
|
||||
|
||||
|
|
@ -1072,7 +1072,7 @@ int ath12k_dp_rx_ampdu_stop(struct ath12k *ar,
|
|||
{
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_peer *peer;
|
||||
struct ath12k_sta *arsta = (void *)params->sta->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(params->sta);
|
||||
int vdev_id = arsta->arvif->vdev_id;
|
||||
bool active;
|
||||
int ret;
|
||||
|
|
@ -1410,7 +1410,7 @@ ath12k_update_per_peer_tx_stats(struct ath12k *ar,
|
|||
}
|
||||
|
||||
sta = peer->sta;
|
||||
arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
arsta = ath12k_sta_to_arsta(sta);
|
||||
|
||||
memset(&arsta->txrate, 0, sizeof(arsta->txrate));
|
||||
|
||||
|
|
@ -1658,11 +1658,12 @@ static void ath12k_htt_mlo_offset_event_handler(struct ath12k_base *ab,
|
|||
msg = (struct ath12k_htt_mlo_offset_msg *)skb->data;
|
||||
pdev_id = u32_get_bits(__le32_to_cpu(msg->info),
|
||||
HTT_T2H_MLO_OFFSET_INFO_PDEV_ID);
|
||||
ar = ath12k_mac_get_ar_by_pdev_id(ab, pdev_id);
|
||||
|
||||
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);
|
||||
return;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
|
|
@ -1678,6 +1679,8 @@ static void ath12k_htt_mlo_offset_event_handler(struct ath12k_base *ab,
|
|||
pdev->timestamp.mlo_comp_timer = __le32_to_cpu(msg->mlo_comp_timer);
|
||||
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
void ath12k_dp_htt_htc_t2h_msg_handler(struct ath12k_base *ab,
|
||||
|
|
|
|||
|
|
@ -713,8 +713,6 @@ void ath12k_hal_reo_qdesc_setup(struct hal_rx_reo_queue *qdesc,
|
|||
{
|
||||
struct hal_rx_reo_queue_ext *ext_desc;
|
||||
|
||||
memset(qdesc, 0, sizeof(*qdesc));
|
||||
|
||||
ath12k_hal_reo_set_desc_hdr(&qdesc->desc_hdr, HAL_DESC_REO_OWNED,
|
||||
HAL_DESC_REO_QUEUE_DESC,
|
||||
REO_QUEUE_DESC_MAGIC_DEBUG_PATTERN_0);
|
||||
|
|
|
|||
|
|
@ -10,17 +10,17 @@
|
|||
#include "core.h"
|
||||
|
||||
struct ath12k_hif_ops {
|
||||
u32 (*read32)(struct ath12k_base *sc, u32 address);
|
||||
void (*write32)(struct ath12k_base *sc, u32 address, u32 data);
|
||||
void (*irq_enable)(struct ath12k_base *sc);
|
||||
void (*irq_disable)(struct ath12k_base *sc);
|
||||
int (*start)(struct ath12k_base *sc);
|
||||
void (*stop)(struct ath12k_base *sc);
|
||||
int (*power_up)(struct ath12k_base *sc);
|
||||
void (*power_down)(struct ath12k_base *sc);
|
||||
u32 (*read32)(struct ath12k_base *ab, u32 address);
|
||||
void (*write32)(struct ath12k_base *ab, u32 address, u32 data);
|
||||
void (*irq_enable)(struct ath12k_base *ab);
|
||||
void (*irq_disable)(struct ath12k_base *ab);
|
||||
int (*start)(struct ath12k_base *ab);
|
||||
void (*stop)(struct ath12k_base *ab);
|
||||
int (*power_up)(struct ath12k_base *ab);
|
||||
void (*power_down)(struct ath12k_base *ab);
|
||||
int (*suspend)(struct ath12k_base *ab);
|
||||
int (*resume)(struct ath12k_base *ab);
|
||||
int (*map_service_to_pipe)(struct ath12k_base *sc, u16 service_id,
|
||||
int (*map_service_to_pipe)(struct ath12k_base *ab, u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe);
|
||||
int (*get_user_msi_vector)(struct ath12k_base *ab, char *user_name,
|
||||
int *num_vectors, u32 *user_base_data,
|
||||
|
|
|
|||
|
|
@ -886,7 +886,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
|
|||
.vdev_start_delay = false,
|
||||
|
||||
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT),
|
||||
.supports_monitor = false,
|
||||
|
||||
.idle_ps = false,
|
||||
|
|
@ -911,6 +912,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
|
|||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
|
||||
.rddm_size = 0,
|
||||
},
|
||||
{
|
||||
.name = "wcn7850 hw2.0",
|
||||
|
|
@ -972,6 +975,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
|
|||
.rfkill_pin = 48,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 1,
|
||||
|
||||
.rddm_size = 0x780000,
|
||||
},
|
||||
{
|
||||
.name = "qcn9274 hw2.0",
|
||||
|
|
@ -1006,7 +1011,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
|
|||
.vdev_start_delay = false,
|
||||
|
||||
.interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT),
|
||||
.supports_monitor = false,
|
||||
|
||||
.idle_ps = false,
|
||||
|
|
@ -1031,6 +1037,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
|
|||
.rfkill_pin = 0,
|
||||
.rfkill_cfg = 0,
|
||||
.rfkill_on_level = 0,
|
||||
|
||||
.rddm_size = 0,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -190,6 +190,8 @@ struct ath12k_hw_params {
|
|||
u32 rfkill_pin;
|
||||
u32 rfkill_cfg;
|
||||
u32 rfkill_on_level;
|
||||
|
||||
u32 rddm_size;
|
||||
};
|
||||
|
||||
struct ath12k_hw_ops {
|
||||
|
|
|
|||
|
|
@ -523,7 +523,7 @@ static void ath12k_get_arvif_iter(void *data, u8 *mac,
|
|||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath12k_vif_iter *arvif_iter = data;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
|
||||
if (arvif->vdev_id == arvif_iter->vdev_id)
|
||||
arvif_iter->arvif = arvif;
|
||||
|
|
@ -1208,7 +1208,7 @@ static void ath12k_peer_assoc_h_basic(struct ath12k *ar,
|
|||
struct ieee80211_sta *sta,
|
||||
struct ath12k_wmi_peer_assoc_arg *arg)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
u32 aid;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
|
@ -1236,7 +1236,7 @@ static void ath12k_peer_assoc_h_crypto(struct ath12k *ar,
|
|||
struct ieee80211_bss_conf *info = &vif->bss_conf;
|
||||
struct cfg80211_chan_def def;
|
||||
struct cfg80211_bss *bss;
|
||||
struct ath12k_vif *arvif = (struct ath12k_vif *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
const u8 *rsnie = NULL;
|
||||
const u8 *wpaie = NULL;
|
||||
|
||||
|
|
@ -1294,7 +1294,7 @@ static void ath12k_peer_assoc_h_rates(struct ath12k *ar,
|
|||
struct ieee80211_sta *sta,
|
||||
struct ath12k_wmi_peer_assoc_arg *arg)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
|
||||
struct cfg80211_chan_def def;
|
||||
const struct ieee80211_supported_band *sband;
|
||||
|
|
@ -1357,7 +1357,7 @@ static void ath12k_peer_assoc_h_ht(struct ath12k *ar,
|
|||
struct ath12k_wmi_peer_assoc_arg *arg)
|
||||
{
|
||||
const struct ieee80211_sta_ht_cap *ht_cap = &sta->deflink.ht_cap;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
const u8 *ht_mcs_mask;
|
||||
|
|
@ -1518,7 +1518,7 @@ static void ath12k_peer_assoc_h_vht(struct ath12k *ar,
|
|||
struct ath12k_wmi_peer_assoc_arg *arg)
|
||||
{
|
||||
const struct ieee80211_sta_vht_cap *vht_cap = &sta->deflink.vht_cap;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
const u16 *vht_mcs_mask;
|
||||
|
|
@ -1793,7 +1793,7 @@ static void ath12k_peer_assoc_h_qos(struct ath12k *ar,
|
|||
struct ieee80211_sta *sta,
|
||||
struct ath12k_wmi_peer_assoc_arg *arg)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
|
||||
switch (arvif->vdev_type) {
|
||||
case WMI_VDEV_TYPE_AP:
|
||||
|
|
@ -1991,7 +1991,7 @@ static void ath12k_peer_assoc_h_phymode(struct ath12k *ar,
|
|||
struct ieee80211_sta *sta,
|
||||
struct ath12k_wmi_peer_assoc_arg *arg)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
enum nl80211_band band;
|
||||
const u8 *ht_mcs_mask;
|
||||
|
|
@ -2140,7 +2140,7 @@ static void ath12k_peer_assoc_h_eht(struct ath12k *ar,
|
|||
const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
|
||||
const struct ieee80211_eht_mcs_nss_supp_20mhz_only *bw_20;
|
||||
const struct ieee80211_eht_mcs_nss_supp_bw *bw;
|
||||
struct ath12k_vif *arvif = (struct ath12k_vif *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
u32 *rx_mcs, *tx_mcs;
|
||||
|
||||
if (!sta->deflink.he_cap.has_he || !eht_cap->has_eht)
|
||||
|
|
@ -2266,7 +2266,7 @@ static void ath12k_bss_assoc(struct ieee80211_hw *hw,
|
|||
struct ieee80211_bss_conf *bss_conf)
|
||||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct ath12k_wmi_peer_assoc_arg peer_arg;
|
||||
struct ieee80211_sta *ap_sta;
|
||||
struct ath12k_peer *peer;
|
||||
|
|
@ -2360,7 +2360,7 @@ static void ath12k_bss_disassoc(struct ieee80211_hw *hw,
|
|||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
|
@ -2407,7 +2407,7 @@ static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
|
|||
struct ieee80211_vif *vif,
|
||||
struct cfg80211_chan_def *def)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
const struct ieee80211_supported_band *sband;
|
||||
u8 basic_rate_idx;
|
||||
int hw_rate_code;
|
||||
|
|
@ -3247,7 +3247,7 @@ static int ath12k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
ath12k_warn(ab, "peer %pM disappeared!\n", peer_addr);
|
||||
|
||||
if (sta) {
|
||||
arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
arsta = ath12k_sta_to_arsta(sta);
|
||||
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
|
|
@ -3420,7 +3420,7 @@ static int ath12k_station_disassoc(struct ath12k *ar,
|
|||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
|
@ -3637,7 +3637,7 @@ static int ath12k_mac_station_add(struct ath12k *ar,
|
|||
{
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
|
||||
struct ath12k_wmi_peer_create_arg peer_param;
|
||||
int ret;
|
||||
|
||||
|
|
@ -3744,7 +3744,7 @@ static int ath12k_mac_op_sta_state(struct ieee80211_hw *hw,
|
|||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
|
||||
struct ath12k_peer *peer;
|
||||
int ret = 0;
|
||||
|
||||
|
|
@ -3856,7 +3856,7 @@ static int ath12k_mac_op_sta_set_txpwr(struct ieee80211_hw *hw,
|
|||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
s16 txpwr;
|
||||
|
||||
|
|
@ -3892,8 +3892,8 @@ static void ath12k_mac_op_sta_rc_update(struct ieee80211_hw *hw,
|
|||
u32 changed)
|
||||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct ath12k_peer *peer;
|
||||
u32 bw, smps;
|
||||
|
||||
|
|
@ -4019,7 +4019,7 @@ static int ath12k_mac_op_conf_tx(struct ieee80211_hw *hw,
|
|||
const struct ieee80211_tx_queue_params *params)
|
||||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct wmi_wmm_params_arg *p = NULL;
|
||||
int ret;
|
||||
|
||||
|
|
@ -4554,6 +4554,48 @@ static void ath12k_mac_copy_eht_ppe_thresh(struct ath12k_wmi_ppe_threshold_arg *
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ath12k_mac_filter_eht_cap_mesh(struct ieee80211_eht_cap_elem_fixed
|
||||
*eht_cap_elem)
|
||||
{
|
||||
u8 m;
|
||||
|
||||
m = IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS;
|
||||
eht_cap_elem->mac_cap_info[0] &= ~m;
|
||||
|
||||
m = IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO;
|
||||
eht_cap_elem->phy_cap_info[0] &= ~m;
|
||||
|
||||
m = IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
|
||||
eht_cap_elem->phy_cap_info[3] &= ~m;
|
||||
|
||||
m = IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI;
|
||||
eht_cap_elem->phy_cap_info[4] &= ~m;
|
||||
|
||||
m = IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK;
|
||||
eht_cap_elem->phy_cap_info[5] &= ~m;
|
||||
|
||||
m = IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK;
|
||||
eht_cap_elem->phy_cap_info[6] &= ~m;
|
||||
|
||||
m = IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
|
||||
eht_cap_elem->phy_cap_info[7] &= ~m;
|
||||
}
|
||||
|
||||
static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
|
||||
struct ath12k_band_cap *band_cap,
|
||||
struct ieee80211_he_cap_elem *he_cap_elem,
|
||||
|
|
@ -4592,6 +4634,9 @@ static void ath12k_mac_copy_eht_cap(struct ath12k *ar,
|
|||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ);
|
||||
break;
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
ath12k_mac_filter_eht_cap_mesh(eht_cap_elem);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -6123,7 +6168,7 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,
|
|||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
for (i = 0; i < n_vifs; i++) {
|
||||
arvif = (void *)vifs[i].vif->drv_priv;
|
||||
arvif = ath12k_vif_to_arvif(vifs[i].vif);
|
||||
|
||||
if (vifs[i].vif->type == NL80211_IFTYPE_MONITOR)
|
||||
monitor_vif = true;
|
||||
|
|
@ -6157,7 +6202,7 @@ ath12k_mac_update_vif_chan(struct ath12k *ar,
|
|||
/* TODO: Update ar->rx_channel */
|
||||
|
||||
for (i = 0; i < n_vifs; i++) {
|
||||
arvif = (void *)vifs[i].vif->drv_priv;
|
||||
arvif = ath12k_vif_to_arvif(vifs[i].vif);
|
||||
|
||||
if (WARN_ON(!arvif->is_started))
|
||||
continue;
|
||||
|
|
@ -6271,7 +6316,7 @@ static int ath12k_start_vdev_delay(struct ieee80211_hw *hw,
|
|||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(arvif->is_started))
|
||||
|
|
@ -6307,7 +6352,7 @@ ath12k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
|
|||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
struct ath12k_wmi_peer_create_arg param;
|
||||
|
||||
|
|
@ -6386,7 +6431,7 @@ ath12k_mac_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
|
|||
{
|
||||
struct ath12k *ar = hw->priv;
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
|
@ -6717,7 +6762,7 @@ static void ath12k_mac_set_bitrate_mask_iter(void *data,
|
|||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath12k_vif *arvif = data;
|
||||
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
|
||||
struct ath12k *ar = arvif->ar;
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
|
|
@ -6749,7 +6794,7 @@ ath12k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
|
|||
struct ieee80211_vif *vif,
|
||||
const struct cfg80211_bitrate_mask *mask)
|
||||
{
|
||||
struct ath12k_vif *arvif = (void *)vif->drv_priv;
|
||||
struct ath12k_vif *arvif = ath12k_vif_to_arvif(vif);
|
||||
struct cfg80211_chan_def def;
|
||||
struct ath12k *ar = arvif->ar;
|
||||
enum nl80211_band band;
|
||||
|
|
@ -7006,7 +7051,7 @@ static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,
|
|||
struct ieee80211_sta *sta,
|
||||
struct station_info *sinfo)
|
||||
{
|
||||
struct ath12k_sta *arsta = (struct ath12k_sta *)sta->drv_priv;
|
||||
struct ath12k_sta *arsta = ath12k_sta_to_arsta(sta);
|
||||
|
||||
sinfo->rx_duration = arsta->rx_duration;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
|
||||
|
|
|
|||
|
|
@ -366,6 +366,7 @@ int ath12k_mhi_register(struct ath12k_pci *ab_pci)
|
|||
mhi_ctrl->fw_image = ab_pci->amss_path;
|
||||
mhi_ctrl->regs = ab->mem;
|
||||
mhi_ctrl->reg_len = ab->mem_len;
|
||||
mhi_ctrl->rddm_size = ab->hw_params->rddm_size;
|
||||
|
||||
ret = ath12k_mhi_get_msi(ab_pci);
|
||||
if (ret) {
|
||||
|
|
|
|||
|
|
@ -424,12 +424,12 @@ static void ath12k_pci_ext_grp_disable(struct ath12k_ext_irq_grp *irq_grp)
|
|||
disable_irq_nosync(irq_grp->ab->irq_num[irq_grp->irqs[i]]);
|
||||
}
|
||||
|
||||
static void __ath12k_pci_ext_irq_disable(struct ath12k_base *sc)
|
||||
static void __ath12k_pci_ext_irq_disable(struct ath12k_base *ab)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
|
||||
struct ath12k_ext_irq_grp *irq_grp = &sc->ext_irq_grp[i];
|
||||
struct ath12k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];
|
||||
|
||||
ath12k_pci_ext_grp_disable(irq_grp);
|
||||
|
||||
|
|
|
|||
|
|
@ -2540,6 +2540,7 @@ static void ath12k_qmi_m3_free(struct ath12k_base *ab)
|
|||
dma_free_coherent(ab->dev, m3_mem->size,
|
||||
m3_mem->vaddr, m3_mem->paddr);
|
||||
m3_mem->vaddr = NULL;
|
||||
m3_mem->size = 0;
|
||||
}
|
||||
|
||||
static int ath12k_qmi_wlanfw_m3_info_send(struct ath12k_base *ab)
|
||||
|
|
@ -3093,3 +3094,9 @@ void ath12k_qmi_deinit_service(struct ath12k_base *ab)
|
|||
ath12k_qmi_m3_free(ab);
|
||||
ath12k_qmi_free_target_mem_chunk(ab);
|
||||
}
|
||||
|
||||
void ath12k_qmi_free_resource(struct ath12k_base *ab)
|
||||
{
|
||||
ath12k_qmi_free_target_mem_chunk(ab);
|
||||
ath12k_qmi_m3_free(ab);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -564,5 +564,6 @@ int ath12k_qmi_firmware_start(struct ath12k_base *ab,
|
|||
void ath12k_qmi_firmware_stop(struct ath12k_base *ab);
|
||||
void ath12k_qmi_deinit_service(struct ath12k_base *ab);
|
||||
int ath12k_qmi_init_service(struct ath12k_base *ab);
|
||||
void ath12k_qmi_free_resource(struct ath12k_base *ab);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -314,6 +314,19 @@ static u32 ath12k_map_fw_reg_flags(u16 reg_flags)
|
|||
return flags;
|
||||
}
|
||||
|
||||
static u32 ath12k_map_fw_phy_flags(u32 phy_flags)
|
||||
{
|
||||
u32 flags = 0;
|
||||
|
||||
if (phy_flags & ATH12K_REG_PHY_BITMAP_NO11AX)
|
||||
flags |= NL80211_RRF_NO_HE;
|
||||
|
||||
if (phy_flags & ATH12K_REG_PHY_BITMAP_NO11BE)
|
||||
flags |= NL80211_RRF_NO_EHT;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
static bool
|
||||
ath12k_reg_can_intersect(struct ieee80211_reg_rule *rule1,
|
||||
struct ieee80211_reg_rule *rule2)
|
||||
|
|
@ -638,6 +651,7 @@ ath12k_reg_build_regd(struct ath12k_base *ab,
|
|||
}
|
||||
|
||||
flags |= ath12k_map_fw_reg_flags(reg_rule->flags);
|
||||
flags |= ath12k_map_fw_phy_flags(reg_info->phybitmap);
|
||||
|
||||
ath12k_reg_update_rule(tmp_regd->reg_rules + i,
|
||||
reg_rule->start_freq,
|
||||
|
|
|
|||
|
|
@ -83,6 +83,12 @@ struct ath12k_reg_info {
|
|||
[WMI_REG_CURRENT_MAX_AP_TYPE][WMI_REG_MAX_CLIENT_TYPE];
|
||||
};
|
||||
|
||||
/* Phy bitmaps */
|
||||
enum ath12k_reg_phy_bitmap {
|
||||
ATH12K_REG_PHY_BITMAP_NO11AX = BIT(5),
|
||||
ATH12K_REG_PHY_BITMAP_NO11BE = BIT(6),
|
||||
};
|
||||
|
||||
void ath12k_reg_init(struct ath12k *ar);
|
||||
void ath12k_reg_free(struct ath12k_base *ab);
|
||||
void ath12k_regd_update_work(struct work_struct *work);
|
||||
|
|
|
|||
|
|
@ -408,22 +408,22 @@ static int ath12k_wmi_cmd_send_nowait(struct ath12k_wmi_pdev *wmi, struct sk_buf
|
|||
int ath12k_wmi_cmd_send(struct ath12k_wmi_pdev *wmi, struct sk_buff *skb,
|
||||
u32 cmd_id)
|
||||
{
|
||||
struct ath12k_wmi_base *wmi_sc = wmi->wmi_ab;
|
||||
struct ath12k_wmi_base *wmi_ab = wmi->wmi_ab;
|
||||
int ret = -EOPNOTSUPP;
|
||||
|
||||
might_sleep();
|
||||
|
||||
wait_event_timeout(wmi_sc->tx_credits_wq, ({
|
||||
wait_event_timeout(wmi_ab->tx_credits_wq, ({
|
||||
ret = ath12k_wmi_cmd_send_nowait(wmi, skb, cmd_id);
|
||||
|
||||
if (ret && test_bit(ATH12K_FLAG_CRASH_FLUSH, &wmi_sc->ab->dev_flags))
|
||||
if (ret && test_bit(ATH12K_FLAG_CRASH_FLUSH, &wmi_ab->ab->dev_flags))
|
||||
ret = -ESHUTDOWN;
|
||||
|
||||
(ret != -EAGAIN);
|
||||
}), WMI_SEND_TIMEOUT_HZ);
|
||||
|
||||
if (ret == -EAGAIN)
|
||||
ath12k_warn(wmi_sc->ab, "wmi command %d timeout\n", cmd_id);
|
||||
ath12k_warn(wmi_ab->ab, "wmi command %d timeout\n", cmd_id);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -727,10 +727,10 @@ static int ath12k_service_ready_event(struct ath12k_base *ab, struct sk_buff *sk
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct sk_buff *ath12k_wmi_alloc_skb(struct ath12k_wmi_base *wmi_sc, u32 len)
|
||||
struct sk_buff *ath12k_wmi_alloc_skb(struct ath12k_wmi_base *wmi_ab, u32 len)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct ath12k_base *ab = wmi_sc->ab;
|
||||
struct ath12k_base *ab = wmi_ab->ab;
|
||||
u32 round_len = roundup(len, 4);
|
||||
|
||||
skb = ath12k_htc_alloc_skb(ab, WMI_SKB_HEADROOM + round_len);
|
||||
|
|
@ -3471,7 +3471,7 @@ int ath12k_wmi_set_hw_mode(struct ath12k_base *ab,
|
|||
|
||||
int ath12k_wmi_cmd_init(struct ath12k_base *ab)
|
||||
{
|
||||
struct ath12k_wmi_base *wmi_sc = &ab->wmi_ab;
|
||||
struct ath12k_wmi_base *wmi_ab = &ab->wmi_ab;
|
||||
struct ath12k_wmi_init_cmd_arg arg = {};
|
||||
|
||||
if (test_bit(WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT,
|
||||
|
|
@ -3480,9 +3480,9 @@ int ath12k_wmi_cmd_init(struct ath12k_base *ab)
|
|||
|
||||
ab->hw_params->wmi_init(ab, &arg.res_cfg);
|
||||
|
||||
arg.num_mem_chunks = wmi_sc->num_mem_chunks;
|
||||
arg.hw_mode_id = wmi_sc->preferred_hw_mode;
|
||||
arg.mem_chunks = wmi_sc->mem_chunks;
|
||||
arg.num_mem_chunks = wmi_ab->num_mem_chunks;
|
||||
arg.hw_mode_id = wmi_ab->preferred_hw_mode;
|
||||
arg.mem_chunks = wmi_ab->mem_chunks;
|
||||
|
||||
if (ab->hw_params->single_pdev_only)
|
||||
arg.hw_mode_id = WMI_HOST_HW_MODE_MAX;
|
||||
|
|
@ -3490,7 +3490,7 @@ int ath12k_wmi_cmd_init(struct ath12k_base *ab)
|
|||
arg.num_band_to_mac = ab->num_radios;
|
||||
ath12k_fill_band_to_mac_param(ab, arg.band_to_mac);
|
||||
|
||||
return ath12k_init_cmd_send(&wmi_sc->wmi[0], &arg);
|
||||
return ath12k_init_cmd_send(&wmi_ab->wmi[0], &arg);
|
||||
}
|
||||
|
||||
int ath12k_wmi_vdev_spectral_conf(struct ath12k *ar,
|
||||
|
|
@ -4611,10 +4611,11 @@ static int ath12k_pull_reg_chan_list_ext_update_ev(struct ath12k_base *ab,
|
|||
}
|
||||
|
||||
ath12k_dbg(ab, ATH12K_DBG_WMI,
|
||||
"%s:cc_ext %s dsf %d BW: min_2g %d max_2g %d min_5g %d max_5g %d",
|
||||
"%s:cc_ext %s dfs %d BW: min_2g %d max_2g %d min_5g %d max_5g %d phy_bitmap 0x%x",
|
||||
__func__, reg_info->alpha2, reg_info->dfs_region,
|
||||
reg_info->min_bw_2g, reg_info->max_bw_2g,
|
||||
reg_info->min_bw_5g, reg_info->max_bw_5g);
|
||||
reg_info->min_bw_5g, reg_info->max_bw_5g,
|
||||
reg_info->phybitmap);
|
||||
|
||||
ath12k_dbg(ab, ATH12K_DBG_WMI,
|
||||
"num_2g_reg_rules %d num_5g_reg_rules %d",
|
||||
|
|
@ -6514,6 +6515,8 @@ ath12k_wmi_pdev_dfs_radar_detected_event(struct ath12k_base *ab, struct sk_buff
|
|||
ev->detector_id, ev->segment_id, ev->timestamp, ev->is_chirp,
|
||||
ev->freq_offset, ev->sidx);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ar = ath12k_mac_get_ar_by_pdev_id(ab, le32_to_cpu(ev->pdev_id));
|
||||
|
||||
if (!ar) {
|
||||
|
|
@ -6531,6 +6534,8 @@ ath12k_wmi_pdev_dfs_radar_detected_event(struct ath12k_base *ab, struct sk_buff
|
|||
ieee80211_radar_detected(ar->hw);
|
||||
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
|
||||
kfree(tb);
|
||||
}
|
||||
|
||||
|
|
@ -6549,11 +6554,16 @@ ath12k_wmi_pdev_temperature_event(struct ath12k_base *ab,
|
|||
ath12k_dbg(ab, ATH12K_DBG_WMI,
|
||||
"pdev temperature ev temp %d pdev_id %d\n", ev.temp, ev.pdev_id);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
ar = ath12k_mac_get_ar_by_pdev_id(ab, le32_to_cpu(ev.pdev_id));
|
||||
if (!ar) {
|
||||
ath12k_warn(ab, "invalid pdev id in pdev temperature ev %d", ev.pdev_id);
|
||||
return;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static void ath12k_fils_discovery_event(struct ath12k_base *ab,
|
||||
|
|
|
|||
|
|
@ -131,8 +131,7 @@ ath5k_register_led(struct ath5k_hw *ah, struct ath5k_led *led,
|
|||
int err;
|
||||
|
||||
led->ah = ah;
|
||||
strncpy(led->name, name, sizeof(led->name));
|
||||
led->name[sizeof(led->name)-1] = 0;
|
||||
strscpy(led->name, name, sizeof(led->name));
|
||||
led->led_dev.name = led->name;
|
||||
led->led_dev.default_trigger = trigger;
|
||||
led->led_dev.brightness_set = ath5k_led_brightness_set;
|
||||
|
|
|
|||
|
|
@ -1677,7 +1677,7 @@ static void ath6kl_init_get_fwcaps(struct ath6kl *ar, char *buf, size_t buf_len)
|
|||
|
||||
/* add "..." to the end of string */
|
||||
trunc_len = strlen(trunc) + 1;
|
||||
strncpy(buf + buf_len - trunc_len, trunc, trunc_len);
|
||||
memcpy(buf + buf_len - trunc_len, trunc, trunc_len);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user