ath11k: update Atheros/QCA's ath11k driver
This version is based on git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 7d0a66e4bb9081d75c82ec4957c50034cb0ea449 ( tag: v6.18 ). Sponsored by: The FreeBSD Foundation
This commit is contained in:
@@ -9,8 +9,8 @@
|
||||
#include <linux/property.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/iommu.h>
|
||||
#include "ahb.h"
|
||||
#include "debug.h"
|
||||
@@ -919,16 +919,10 @@ static int ath11k_ahb_setup_msa_resources(struct ath11k_base *ab)
|
||||
{
|
||||
struct ath11k_ahb *ab_ahb = ath11k_ahb_priv(ab);
|
||||
struct device *dev = ab->dev;
|
||||
struct device_node *node;
|
||||
struct resource r;
|
||||
int ret;
|
||||
|
||||
node = of_parse_phandle(dev->of_node, "memory-region", 0);
|
||||
if (!node)
|
||||
return -ENOENT;
|
||||
|
||||
ret = of_address_to_resource(node, 0, &r);
|
||||
of_node_put(node);
|
||||
ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &r);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to resolve msa fixed region\n");
|
||||
return ret;
|
||||
@@ -937,12 +931,7 @@ static int ath11k_ahb_setup_msa_resources(struct ath11k_base *ab)
|
||||
ab_ahb->fw.msa_paddr = r.start;
|
||||
ab_ahb->fw.msa_size = resource_size(&r);
|
||||
|
||||
node = of_parse_phandle(dev->of_node, "memory-region", 1);
|
||||
if (!node)
|
||||
return -ENOENT;
|
||||
|
||||
ret = of_address_to_resource(node, 0, &r);
|
||||
of_node_put(node);
|
||||
ret = of_reserved_mem_region_to_resource(dev->of_node, 1, &r);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to resolve ce fixed region\n");
|
||||
return ret;
|
||||
|
||||
@@ -354,7 +354,8 @@ static int ath11k_ce_rx_post_pipe(struct ath11k_ce_pipe *pipe)
|
||||
ret = ath11k_ce_rx_buf_enqueue_pipe(pipe, skb, paddr);
|
||||
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "failed to enqueue rx buf: %d\n", ret);
|
||||
ath11k_dbg(ab, ATH11K_DBG_CE, "failed to enqueue rx buf: %d\n",
|
||||
ret);
|
||||
dma_unmap_single(ab->dev, paddr,
|
||||
skb->len + skb_tailroom(skb),
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
@@ -912,42 +912,84 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
|
||||
static const struct dmi_system_id ath11k_pm_quirk_table[] = {
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = {
|
||||
.matches = { /* X13 G4 AMD #1 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21J3"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = { /* X13 G4 AMD #2 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21J4"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = {
|
||||
.matches = { /* T14 G4 AMD #1 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K3"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = { /* T14 G4 AMD #2 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K4"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = {
|
||||
.matches = { /* P14s G4 AMD #1 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K5"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = { /* P14s G4 AMD #2 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K6"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = {
|
||||
.matches = { /* T16 G2 AMD #1 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K7"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = { /* T16 G2 AMD #2 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K8"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = {
|
||||
.matches = { /* P16s G2 AMD #1 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21K9"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = { /* P16s G2 AMD #2 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21KA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = {
|
||||
.matches = { /* T14s G4 AMD #1 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21F8"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.driver_data = (void *)ATH11K_PM_WOW,
|
||||
.matches = { /* T14s G4 AMD #2 */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21F9"),
|
||||
},
|
||||
@@ -2215,14 +2257,10 @@ static int ath11k_core_reconfigure_on_crash(struct ath11k_base *ab)
|
||||
mutex_unlock(&ab->core_lock);
|
||||
|
||||
ath11k_dp_free(ab);
|
||||
ath11k_hal_srng_deinit(ab);
|
||||
ath11k_hal_srng_clear(ab);
|
||||
|
||||
ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS(ab))) - 1;
|
||||
|
||||
ret = ath11k_hal_srng_init(ab);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
clear_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
|
||||
|
||||
ret = ath11k_core_qmi_firmware_ready(ab);
|
||||
|
||||
@@ -4615,7 +4615,6 @@ static void ath11k_hal_rx_msdu_list_get(struct ath11k *ar,
|
||||
msdu_details[i].buf_addr_info.info0) == 0) {
|
||||
msdu_desc_info = &msdu_details[i - 1].rx_msdu_info;
|
||||
msdu_desc_info->info0 |= last;
|
||||
;
|
||||
break;
|
||||
}
|
||||
msdu_desc_info = &msdu_details[i].rx_msdu_info;
|
||||
|
||||
@@ -1386,6 +1386,22 @@ void ath11k_hal_srng_deinit(struct ath11k_base *ab)
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_hal_srng_deinit);
|
||||
|
||||
void ath11k_hal_srng_clear(struct ath11k_base *ab)
|
||||
{
|
||||
/* No need to memset rdp and wrp memory since each individual
|
||||
* segment would get cleared in ath11k_hal_srng_src_hw_init()
|
||||
* and ath11k_hal_srng_dst_hw_init().
|
||||
*/
|
||||
memset(ab->hal.srng_list, 0,
|
||||
sizeof(ab->hal.srng_list));
|
||||
memset(ab->hal.shadow_reg_addr, 0,
|
||||
sizeof(ab->hal.shadow_reg_addr));
|
||||
ab->hal.avail_blk_resource = 0;
|
||||
ab->hal.current_blk_index = 0;
|
||||
ab->hal.num_shadow_reg_configured = 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath11k_hal_srng_clear);
|
||||
|
||||
void ath11k_hal_dump_srng_stats(struct ath11k_base *ab)
|
||||
{
|
||||
struct hal_srng *srng;
|
||||
|
||||
@@ -965,6 +965,7 @@ int ath11k_hal_srng_setup(struct ath11k_base *ab, enum hal_ring_type type,
|
||||
struct hal_srng_params *params);
|
||||
int ath11k_hal_srng_init(struct ath11k_base *ath11k);
|
||||
void ath11k_hal_srng_deinit(struct ath11k_base *ath11k);
|
||||
void ath11k_hal_srng_clear(struct ath11k_base *ab);
|
||||
void ath11k_hal_dump_srng_stats(struct ath11k_base *ab);
|
||||
void ath11k_hal_srng_get_shadow_config(struct ath11k_base *ab,
|
||||
u32 **cfg, u32 *len);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause-Clear
|
||||
/*
|
||||
* Copyright (c) 2018-2019 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 <net/mac80211.h>
|
||||
@@ -4417,9 +4417,9 @@ static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
}
|
||||
|
||||
if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE)
|
||||
flags |= WMI_KEY_PAIRWISE;
|
||||
flags = WMI_KEY_PAIRWISE;
|
||||
else
|
||||
flags |= WMI_KEY_GROUP;
|
||||
flags = WMI_KEY_GROUP;
|
||||
|
||||
ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
"%s for peer %pM on vdev %d flags 0x%X, type = %d, num_sta %d\n",
|
||||
@@ -4456,7 +4456,7 @@ static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
|
||||
is_ap_with_no_sta = (vif->type == NL80211_IFTYPE_AP &&
|
||||
!arvif->num_stations);
|
||||
if ((flags & WMI_KEY_PAIRWISE) || cmd == SET_KEY || is_ap_with_no_sta) {
|
||||
if (flags == WMI_KEY_PAIRWISE || cmd == SET_KEY || is_ap_with_no_sta) {
|
||||
ret = ath11k_install_key(arvif, key, cmd, peer_addr, flags);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "ath11k_install_key failed (%d)\n", ret);
|
||||
@@ -4470,7 +4470,7 @@ static int ath11k_mac_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if ((flags & WMI_KEY_GROUP) && cmd == SET_KEY && is_ap_with_no_sta)
|
||||
if (flags == WMI_KEY_GROUP && cmd == SET_KEY && is_ap_with_no_sta)
|
||||
arvif->reinstall_group_keys = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "debug.h"
|
||||
#include "hif.h"
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/of_irq.h>
|
||||
@@ -2040,23 +2040,14 @@ static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab)
|
||||
static int ath11k_qmi_assign_target_mem_chunk(struct ath11k_base *ab)
|
||||
{
|
||||
struct device *dev = ab->dev;
|
||||
struct device_node *hremote_node = NULL;
|
||||
struct resource res;
|
||||
struct resource res = {};
|
||||
u32 host_ddr_sz;
|
||||
int i, idx, ret;
|
||||
|
||||
for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
|
||||
switch (ab->qmi.target_mem[i].type) {
|
||||
case HOST_DDR_REGION_TYPE:
|
||||
hremote_node = of_parse_phandle(dev->of_node, "memory-region", 0);
|
||||
if (!hremote_node) {
|
||||
ath11k_dbg(ab, ATH11K_DBG_QMI,
|
||||
"fail to get hremote_node\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = of_address_to_resource(hremote_node, 0, &res);
|
||||
of_node_put(hremote_node);
|
||||
ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &res);
|
||||
if (ret) {
|
||||
ath11k_dbg(ab, ATH11K_DBG_QMI,
|
||||
"fail to get reg from hremote\n");
|
||||
@@ -2095,7 +2086,7 @@ static int ath11k_qmi_assign_target_mem_chunk(struct ath11k_base *ab)
|
||||
}
|
||||
|
||||
if (ath11k_core_coldboot_cal_support(ab)) {
|
||||
if (hremote_node) {
|
||||
if (resource_size(&res)) {
|
||||
ab->qmi.target_mem[idx].paddr =
|
||||
res.start + host_ddr_sz;
|
||||
ab->qmi.target_mem[idx].iaddr =
|
||||
@@ -2557,7 +2548,7 @@ static int ath11k_qmi_m3_load(struct ath11k_base *ab)
|
||||
GFP_KERNEL);
|
||||
if (!m3_mem->vaddr) {
|
||||
ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
|
||||
fw->size);
|
||||
m3_len);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -5961,6 +5961,9 @@ static int wmi_process_mgmt_tx_comp(struct ath11k *ar,
|
||||
dma_unmap_single(ar->ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
|
||||
|
||||
info = IEEE80211_SKB_CB(msdu);
|
||||
memset(&info->status, 0, sizeof(info->status));
|
||||
info->status.rates[0].idx = -1;
|
||||
|
||||
if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) &&
|
||||
!tx_compl_param->status) {
|
||||
info->flags |= IEEE80211_TX_STAT_ACK;
|
||||
|
||||
Reference in New Issue
Block a user