Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
ath.git patches for 5.1. Major changes: ath10k * support WPA3 with WCN3990 * support for mac80211 airtime fairness based on transmit rate estimation, the firmware needs to support WMI_SERVICE_PEER_STATS to enable this * report transmit airtime to mac80211 with firmwares having WMI_SERVICE_REPORT_AIRTIME feature, this to have more accurate airtime fairness based on real transmit time (instead of just estimated from transmit rate) * support Fine Timing Measurement (FTM) responder role * add dynamic VLAN support with firmware having WMI_SERVICE_PER_PACKET_SW_ENCRYPT * switch to use SPDX license identifiers
This commit is contained in:
commit
6c88e0ce5e
@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# SPDX-License-Identifier: ISC
|
||||
obj-$(CONFIG_ATH10K) += ath10k_core.o
|
||||
ath10k_core-y += mac.o \
|
||||
debug.o \
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2016-2017 Qualcomm Atheros, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
@ -661,7 +650,8 @@ static void ath10k_ahb_hif_stop(struct ath10k *ar)
|
||||
ath10k_pci_flush(ar);
|
||||
}
|
||||
|
||||
static int ath10k_ahb_hif_power_up(struct ath10k *ar)
|
||||
static int ath10k_ahb_hif_power_up(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2016 Qualcomm Atheros, Inc. All rights reserved.
|
||||
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _AHB_H_
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2014,2016-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "bmi.h"
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2015,2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _BMI_H_
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "hif.h"
|
||||
@ -545,14 +534,8 @@ static int _ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
|
||||
write_index = CE_RING_IDX_INCR(nentries_mask, write_index);
|
||||
|
||||
/* WORKAROUND */
|
||||
if (!(flags & CE_SEND_FLAG_GATHER)) {
|
||||
if (ar->hw_params.shadow_reg_support)
|
||||
ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state,
|
||||
write_index);
|
||||
else
|
||||
ath10k_ce_src_ring_write_index_set(ar, ctrl_addr,
|
||||
write_index);
|
||||
}
|
||||
if (!(flags & CE_SEND_FLAG_GATHER))
|
||||
ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index);
|
||||
|
||||
src_ring->write_index = write_index;
|
||||
exit:
|
||||
@ -626,8 +609,14 @@ static int _ath10k_ce_send_nolock_64(struct ath10k_ce_pipe *ce_state,
|
||||
/* Update Source Ring Write Index */
|
||||
write_index = CE_RING_IDX_INCR(nentries_mask, write_index);
|
||||
|
||||
if (!(flags & CE_SEND_FLAG_GATHER))
|
||||
ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index);
|
||||
if (!(flags & CE_SEND_FLAG_GATHER)) {
|
||||
if (ar->hw_params.shadow_reg_support)
|
||||
ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state,
|
||||
write_index);
|
||||
else
|
||||
ath10k_ce_src_ring_write_index_set(ar, ctrl_addr,
|
||||
write_index);
|
||||
}
|
||||
|
||||
src_ring->write_index = write_index;
|
||||
exit:
|
||||
@ -1449,12 +1438,12 @@ static int ath10k_ce_alloc_shadow_base(struct ath10k *ar,
|
||||
u32 nentries)
|
||||
{
|
||||
src_ring->shadow_base_unaligned = kcalloc(nentries,
|
||||
sizeof(struct ce_desc),
|
||||
sizeof(struct ce_desc_64),
|
||||
GFP_KERNEL);
|
||||
if (!src_ring->shadow_base_unaligned)
|
||||
return -ENOMEM;
|
||||
|
||||
src_ring->shadow_base = (struct ce_desc *)
|
||||
src_ring->shadow_base = (struct ce_desc_64 *)
|
||||
PTR_ALIGN(src_ring->shadow_base_unaligned,
|
||||
CE_DESC_RING_ALIGN);
|
||||
return 0;
|
||||
@ -1506,7 +1495,7 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id,
|
||||
ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries);
|
||||
if (ret) {
|
||||
dma_free_coherent(ar->dev,
|
||||
(nentries * sizeof(struct ce_desc) +
|
||||
(nentries * sizeof(struct ce_desc_64) +
|
||||
CE_DESC_RING_ALIGN),
|
||||
src_ring->base_addr_owner_space_unaligned,
|
||||
base_addr);
|
||||
@ -1599,7 +1588,8 @@ ath10k_ce_alloc_dest_ring(struct ath10k *ar, unsigned int ce_id,
|
||||
*/
|
||||
dest_ring->base_addr_owner_space_unaligned =
|
||||
dma_alloc_coherent(ar->dev,
|
||||
(nentries * sizeof(struct ce_desc) + CE_DESC_RING_ALIGN),
|
||||
(nentries * sizeof(struct ce_desc) +
|
||||
CE_DESC_RING_ALIGN),
|
||||
&base_addr, GFP_KERNEL);
|
||||
if (!dest_ring->base_addr_owner_space_unaligned) {
|
||||
kfree(dest_ring);
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _CE_H_
|
||||
@ -118,7 +107,7 @@ struct ath10k_ce_ring {
|
||||
dma_addr_t base_addr_ce_space;
|
||||
|
||||
char *shadow_base_unaligned;
|
||||
struct ce_desc *shadow_base;
|
||||
struct ce_desc_64 *shadow_base;
|
||||
|
||||
/* keep last */
|
||||
void *per_transfer_context[0];
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -561,7 +550,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.hw_ops = &wcn3990_ops,
|
||||
.decap_align_bytes = 1,
|
||||
.num_peers = TARGET_HL_10_TLV_NUM_PEERS,
|
||||
.n_cipher_suites = 8,
|
||||
.n_cipher_suites = 11,
|
||||
.ast_skid_limit = TARGET_HL_10_TLV_AST_SKID_LIMIT,
|
||||
.num_wds_entries = TARGET_HL_10_TLV_NUM_WDS_ENTRIES,
|
||||
.target_64bit = true,
|
||||
@ -2631,6 +2620,9 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
|
||||
ar->wmi.svc_map))
|
||||
val |= WMI_10_4_TX_DATA_ACK_RSSI;
|
||||
|
||||
if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
|
||||
val |= WMI_10_4_REPORT_AIRTIME;
|
||||
|
||||
status = ath10k_mac_ext_resource_config(ar, val);
|
||||
if (status) {
|
||||
ath10k_err(ar,
|
||||
@ -2659,6 +2651,13 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
status = ath10k_wmi_pdev_set_base_macaddr(ar, ar->mac_addr);
|
||||
if (status && status != -EOPNOTSUPP) {
|
||||
ath10k_err(ar,
|
||||
"failed to set base mac address: %d\n", status);
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
/* Some firmware revisions do not properly set up hardware rx filter
|
||||
* registers.
|
||||
*
|
||||
@ -2773,7 +2772,7 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
|
||||
struct bmi_target_info target_info;
|
||||
int ret = 0;
|
||||
|
||||
ret = ath10k_hif_power_up(ar);
|
||||
ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "could not power on hif bus (%d)\n", ret);
|
||||
return ret;
|
||||
@ -2987,8 +2986,8 @@ err:
|
||||
int ath10k_core_register(struct ath10k *ar,
|
||||
const struct ath10k_bus_params *bus_params)
|
||||
{
|
||||
ar->chip_id = bus_params->chip_id;
|
||||
ar->dev_type = bus_params->dev_type;
|
||||
ar->bus_param = *bus_params;
|
||||
|
||||
queue_work(ar->workqueue, &ar->register_work);
|
||||
|
||||
return 0;
|
||||
@ -3108,9 +3107,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
|
||||
|
||||
mutex_init(&ar->conf_mutex);
|
||||
spin_lock_init(&ar->data_lock);
|
||||
spin_lock_init(&ar->txqs_lock);
|
||||
|
||||
INIT_LIST_HEAD(&ar->txqs);
|
||||
INIT_LIST_HEAD(&ar->peers);
|
||||
init_waitqueue_head(&ar->peer_mapping_wq);
|
||||
init_waitqueue_head(&ar->htt.empty_tx_wq);
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _CORE_H_
|
||||
@ -90,6 +79,9 @@
|
||||
/* The magic used by QCA spec */
|
||||
#define ATH10K_SMBIOS_BDF_EXT_MAGIC "BDF_"
|
||||
|
||||
/* Default Airtime weight multipler (Tuned for multiclient performance) */
|
||||
#define ATH10K_AIRTIME_WEIGHT_MULTIPLIER 4
|
||||
|
||||
struct ath10k;
|
||||
|
||||
static inline const char *ath10k_bus_str(enum ath10k_bus bus)
|
||||
@ -116,6 +108,7 @@ enum ath10k_skb_flags {
|
||||
ATH10K_SKB_F_DELIVER_CAB = BIT(2),
|
||||
ATH10K_SKB_F_MGMT = BIT(3),
|
||||
ATH10K_SKB_F_QOS = BIT(4),
|
||||
ATH10K_SKB_F_RAW_TX = BIT(5),
|
||||
};
|
||||
|
||||
struct ath10k_skb_cb {
|
||||
@ -123,6 +116,7 @@ struct ath10k_skb_cb {
|
||||
u8 flags;
|
||||
u8 eid;
|
||||
u16 msdu_id;
|
||||
u16 airtime_est;
|
||||
struct ieee80211_vif *vif;
|
||||
struct ieee80211_txq *txq;
|
||||
} __packed;
|
||||
@ -443,14 +437,14 @@ enum ath10k_amsdu_subfrm_num {
|
||||
};
|
||||
|
||||
struct ath10k_sta_tid_stats {
|
||||
unsigned long int rx_pkt_from_fw;
|
||||
unsigned long int rx_pkt_unchained;
|
||||
unsigned long int rx_pkt_drop_chained;
|
||||
unsigned long int rx_pkt_drop_filter;
|
||||
unsigned long int rx_pkt_err[ATH10K_PKT_RX_ERR_MAX];
|
||||
unsigned long int rx_pkt_queued_for_mac;
|
||||
unsigned long int rx_pkt_ampdu[ATH10K_AMPDU_SUBFRM_NUM_MAX];
|
||||
unsigned long int rx_pkt_amsdu[ATH10K_AMSDU_SUBFRM_NUM_MAX];
|
||||
unsigned long rx_pkt_from_fw;
|
||||
unsigned long rx_pkt_unchained;
|
||||
unsigned long rx_pkt_drop_chained;
|
||||
unsigned long rx_pkt_drop_filter;
|
||||
unsigned long rx_pkt_err[ATH10K_PKT_RX_ERR_MAX];
|
||||
unsigned long rx_pkt_queued_for_mac;
|
||||
unsigned long rx_pkt_ampdu[ATH10K_AMPDU_SUBFRM_NUM_MAX];
|
||||
unsigned long rx_pkt_amsdu[ATH10K_AMSDU_SUBFRM_NUM_MAX];
|
||||
};
|
||||
|
||||
enum ath10k_counter_type {
|
||||
@ -495,6 +489,7 @@ struct ath10k_sta {
|
||||
u16 peer_id;
|
||||
struct rate_info txrate;
|
||||
struct ieee80211_tx_info tx_info;
|
||||
u32 last_tx_bitrate;
|
||||
|
||||
struct work_struct update_wk;
|
||||
u64 rx_duration;
|
||||
@ -571,6 +566,7 @@ struct ath10k_vif {
|
||||
bool nohwcrypt;
|
||||
int num_legacy_stations;
|
||||
int txpower;
|
||||
bool ftm_responder;
|
||||
struct wmi_wmm_params_all_arg wmm_params;
|
||||
struct work_struct ap_csa_work;
|
||||
struct delayed_work connection_loss_work;
|
||||
@ -922,6 +918,7 @@ enum ath10k_dev_type {
|
||||
struct ath10k_bus_params {
|
||||
u32 chip_id;
|
||||
enum ath10k_dev_type dev_type;
|
||||
bool link_can_suspend;
|
||||
};
|
||||
|
||||
struct ath10k {
|
||||
@ -1068,10 +1065,7 @@ struct ath10k {
|
||||
|
||||
/* protects shared structure data */
|
||||
spinlock_t data_lock;
|
||||
/* protects: ar->txqs, artxq->list */
|
||||
spinlock_t txqs_lock;
|
||||
|
||||
struct list_head txqs;
|
||||
struct list_head arvifs;
|
||||
struct list_head peers;
|
||||
struct ath10k_peer *peer_map[ATH10K_MAX_NUM_PEER_IDS];
|
||||
@ -1182,6 +1176,7 @@ struct ath10k {
|
||||
|
||||
u32 ampdu_reference;
|
||||
|
||||
const u8 *wmi_key_cipher;
|
||||
void *ce_priv;
|
||||
|
||||
u32 sta_tid_stats_mask;
|
||||
@ -1190,6 +1185,7 @@ struct ath10k {
|
||||
enum ath10k_radar_confirmation_state radar_conf_state;
|
||||
struct ath10k_radar_found_info last_radar_info;
|
||||
struct work_struct radar_confirmation_work;
|
||||
struct ath10k_bus_params bus_param;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[0] __aligned(sizeof(void *));
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "coredump.h"
|
||||
@ -1167,7 +1156,7 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar)
|
||||
dump_data->version = cpu_to_le32(ATH10K_FW_CRASH_DUMP_VERSION);
|
||||
|
||||
guid_copy(&dump_data->guid, &crash_data->guid);
|
||||
dump_data->chip_id = cpu_to_le32(ar->chip_id);
|
||||
dump_data->chip_id = cpu_to_le32(ar->bus_param.chip_id);
|
||||
dump_data->bus_type = cpu_to_le32(0);
|
||||
dump_data->target_version = cpu_to_le32(ar->target_version);
|
||||
dump_data->fw_version_major = cpu_to_le32(ar->fw_version_major);
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _COREDUMP_H_
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -58,7 +47,7 @@ void ath10k_debug_print_hwfw_info(struct ath10k *ar)
|
||||
ath10k_info(ar, "%s target 0x%08x chip_id 0x%08x sub %04x:%04x",
|
||||
ar->hw_params.name,
|
||||
ar->target_version,
|
||||
ar->chip_id,
|
||||
ar->bus_param.chip_id,
|
||||
ar->id.subsystem_vendor, ar->id.subsystem_device);
|
||||
|
||||
ath10k_info(ar, "kconfig debug %d debugfs %d tracing %d dfs %d testmode %d\n",
|
||||
@ -625,7 +614,7 @@ static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf,
|
||||
size_t len;
|
||||
char buf[50];
|
||||
|
||||
len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->chip_id);
|
||||
len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->bus_param.chip_id);
|
||||
|
||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
}
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _DEBUG_H_
|
||||
@ -213,12 +202,12 @@ void ath10k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
void ath10k_sta_update_rx_duration(struct ath10k *ar,
|
||||
struct ath10k_fw_stats *stats);
|
||||
void ath10k_sta_update_rx_tid_stats(struct ath10k *ar, u8 *first_hdr,
|
||||
unsigned long int num_msdus,
|
||||
unsigned long num_msdus,
|
||||
enum ath10k_pkt_rx_err err,
|
||||
unsigned long int unchain_cnt,
|
||||
unsigned long int drop_cnt,
|
||||
unsigned long int drop_cnt_filter,
|
||||
unsigned long int queued_msdus);
|
||||
unsigned long unchain_cnt,
|
||||
unsigned long drop_cnt,
|
||||
unsigned long drop_cnt_filter,
|
||||
unsigned long queued_msdus);
|
||||
void ath10k_sta_update_rx_tid_stats_ampdu(struct ath10k *ar,
|
||||
u16 peer_id, u8 tid,
|
||||
struct htt_rx_indication_mpdu_range *ranges,
|
||||
@ -232,12 +221,12 @@ void ath10k_sta_update_rx_duration(struct ath10k *ar,
|
||||
|
||||
static inline
|
||||
void ath10k_sta_update_rx_tid_stats(struct ath10k *ar, u8 *first_hdr,
|
||||
unsigned long int num_msdus,
|
||||
unsigned long num_msdus,
|
||||
enum ath10k_pkt_rx_err err,
|
||||
unsigned long int unchain_cnt,
|
||||
unsigned long int drop_cnt,
|
||||
unsigned long int drop_cnt_filter,
|
||||
unsigned long int queued_msdus)
|
||||
unsigned long unchain_cnt,
|
||||
unsigned long drop_cnt,
|
||||
unsigned long drop_cnt_filter,
|
||||
unsigned long queued_msdus)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2014-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
@ -87,12 +76,12 @@ out:
|
||||
}
|
||||
|
||||
void ath10k_sta_update_rx_tid_stats(struct ath10k *ar, u8 *first_hdr,
|
||||
unsigned long int num_msdus,
|
||||
unsigned long num_msdus,
|
||||
enum ath10k_pkt_rx_err err,
|
||||
unsigned long int unchain_cnt,
|
||||
unsigned long int drop_cnt,
|
||||
unsigned long int drop_cnt_filter,
|
||||
unsigned long int queued_msdus)
|
||||
unsigned long unchain_cnt,
|
||||
unsigned long drop_cnt,
|
||||
unsigned long drop_cnt_filter,
|
||||
unsigned long queued_msdus)
|
||||
{
|
||||
struct ieee80211_sta *sta;
|
||||
struct ath10k_sta *arsta;
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2015,2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _HIF_H_
|
||||
@ -83,7 +72,7 @@ struct ath10k_hif_ops {
|
||||
void (*write32)(struct ath10k *ar, u32 address, u32 value);
|
||||
|
||||
/* Power up the device and enter BMI transfer mode for FW download */
|
||||
int (*power_up)(struct ath10k *ar);
|
||||
int (*power_up)(struct ath10k *ar, enum ath10k_firmware_mode fw_mode);
|
||||
|
||||
/* Power down the device and free up resources. stop() must be called
|
||||
* before this if start() was called earlier
|
||||
@ -174,9 +163,10 @@ static inline u16 ath10k_hif_get_free_queue_number(struct ath10k *ar,
|
||||
return ar->hif.ops->get_free_queue_number(ar, pipe_id);
|
||||
}
|
||||
|
||||
static inline int ath10k_hif_power_up(struct ath10k *ar)
|
||||
static inline int ath10k_hif_power_up(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
return ar->hif.ops->power_up(ar);
|
||||
return ar->hif.ops->power_up(ar, fw_mode);
|
||||
}
|
||||
|
||||
static inline void ath10k_hif_power_down(struct ath10k *ar)
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
@ -53,7 +42,7 @@ static inline void ath10k_htc_restore_tx_skb(struct ath10k_htc *htc,
|
||||
{
|
||||
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
|
||||
|
||||
if (htc->ar->dev_type != ATH10K_DEV_TYPE_HL)
|
||||
if (htc->ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
|
||||
dma_unmap_single(htc->ar->dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
|
||||
skb_pull(skb, sizeof(struct ath10k_htc_hdr));
|
||||
}
|
||||
@ -88,7 +77,8 @@ static void ath10k_htc_prepare_tx_skb(struct ath10k_htc_ep *ep,
|
||||
hdr->eid = ep->eid;
|
||||
hdr->len = __cpu_to_le16(skb->len - sizeof(*hdr));
|
||||
hdr->flags = 0;
|
||||
hdr->flags |= ATH10K_HTC_FLAG_NEED_CREDIT_UPDATE;
|
||||
if (ep->tx_credit_flow_enabled)
|
||||
hdr->flags |= ATH10K_HTC_FLAG_NEED_CREDIT_UPDATE;
|
||||
|
||||
spin_lock_bh(&ep->htc->tx_lock);
|
||||
hdr->seq_no = ep->seq_no++;
|
||||
@ -138,7 +128,7 @@ int ath10k_htc_send(struct ath10k_htc *htc,
|
||||
ath10k_htc_prepare_tx_skb(ep, skb);
|
||||
|
||||
skb_cb->eid = eid;
|
||||
if (ar->dev_type != ATH10K_DEV_TYPE_HL) {
|
||||
if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL) {
|
||||
skb_cb->paddr = dma_map_single(dev, skb->data, skb->len,
|
||||
DMA_TO_DEVICE);
|
||||
ret = dma_mapping_error(dev, skb_cb->paddr);
|
||||
@ -161,7 +151,7 @@ int ath10k_htc_send(struct ath10k_htc *htc,
|
||||
return 0;
|
||||
|
||||
err_unmap:
|
||||
if (ar->dev_type != ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
|
||||
dma_unmap_single(dev, skb_cb->paddr, skb->len, DMA_TO_DEVICE);
|
||||
err_credits:
|
||||
if (ep->tx_credit_flow_enabled) {
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _HTC_H_
|
||||
@ -51,7 +40,6 @@ struct ath10k;
|
||||
*/
|
||||
|
||||
#define HTC_HOST_MAX_MSG_PER_RX_BUNDLE 8
|
||||
#define HTC_HOST_MAX_MSG_PER_TX_BUNDLE 16
|
||||
|
||||
enum ath10k_htc_tx_flags {
|
||||
ATH10K_HTC_FLAG_NEED_CREDIT_UPDATE = 0x01,
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/slab.h>
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _HTT_H_
|
||||
@ -571,6 +560,7 @@ struct htt_mgmt_tx_completion {
|
||||
#define HTT_RX_INDICATION_INFO0_EXT_TID_LSB (0)
|
||||
#define HTT_RX_INDICATION_INFO0_FLUSH_VALID (1 << 5)
|
||||
#define HTT_RX_INDICATION_INFO0_RELEASE_VALID (1 << 6)
|
||||
#define HTT_RX_INDICATION_INFO0_PPDU_DURATION BIT(7)
|
||||
|
||||
#define HTT_RX_INDICATION_INFO1_FLUSH_START_SEQNO_MASK 0x0000003F
|
||||
#define HTT_RX_INDICATION_INFO1_FLUSH_START_SEQNO_LSB 0
|
||||
@ -583,7 +573,10 @@ struct htt_mgmt_tx_completion {
|
||||
#define HTT_RX_INDICATION_INFO1_NUM_MPDU_RANGES_MASK 0xFF000000
|
||||
#define HTT_RX_INDICATION_INFO1_NUM_MPDU_RANGES_LSB 24
|
||||
|
||||
#define HTT_TX_CMPL_FLAG_DATA_RSSI BIT(0)
|
||||
#define HTT_TX_CMPL_FLAG_DATA_RSSI BIT(0)
|
||||
#define HTT_TX_CMPL_FLAG_PPID_PRESENT BIT(1)
|
||||
#define HTT_TX_CMPL_FLAG_PA_PRESENT BIT(2)
|
||||
#define HTT_TX_CMPL_FLAG_PPDU_DURATION_PRESENT BIT(3)
|
||||
|
||||
struct htt_rx_indication_hdr {
|
||||
u8 info0; /* %HTT_RX_INDICATION_INFO0_ */
|
||||
@ -873,6 +866,21 @@ struct htt_data_tx_completion {
|
||||
__le16 msdus[0]; /* variable length based on %num_msdus */
|
||||
} __packed;
|
||||
|
||||
#define HTT_TX_PPDU_DUR_INFO0_PEER_ID_MASK GENMASK(15, 0)
|
||||
#define HTT_TX_PPDU_DUR_INFO0_TID_MASK GENMASK(20, 16)
|
||||
|
||||
struct htt_data_tx_ppdu_dur {
|
||||
__le32 info0; /* HTT_TX_PPDU_DUR_INFO0_ */
|
||||
__le32 tx_duration; /* in usecs */
|
||||
} __packed;
|
||||
|
||||
#define HTT_TX_COMPL_PPDU_DUR_INFO0_NUM_ENTRIES_MASK GENMASK(7, 0)
|
||||
|
||||
struct htt_data_tx_compl_ppdu_dur {
|
||||
__le32 info0; /* HTT_TX_COMPL_PPDU_DUR_INFO0_ */
|
||||
struct htt_data_tx_ppdu_dur ppdu_dur[0];
|
||||
} __packed;
|
||||
|
||||
struct htt_tx_compl_ind_base {
|
||||
u32 hdr;
|
||||
u16 payload[1/*or more*/];
|
||||
@ -1724,14 +1732,14 @@ struct ath10k_htt_txbuf_32 {
|
||||
struct ath10k_htc_hdr htc_hdr;
|
||||
struct htt_cmd_hdr cmd_hdr;
|
||||
struct htt_data_tx_desc cmd_tx;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
struct ath10k_htt_txbuf_64 {
|
||||
struct htt_data_tx_desc_frag frags[2];
|
||||
struct ath10k_htc_hdr htc_hdr;
|
||||
struct htt_cmd_hdr cmd_hdr;
|
||||
struct htt_data_tx_desc_64 cmd_tx;
|
||||
} __packed;
|
||||
} __packed __aligned(4);
|
||||
|
||||
struct ath10k_htt {
|
||||
struct ath10k *ar;
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
@ -265,7 +254,7 @@ int ath10k_htt_rx_ring_refill(struct ath10k *ar)
|
||||
struct ath10k_htt *htt = &ar->htt;
|
||||
int ret;
|
||||
|
||||
if (ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
return 0;
|
||||
|
||||
spin_lock_bh(&htt->rx_ring.lock);
|
||||
@ -282,7 +271,7 @@ int ath10k_htt_rx_ring_refill(struct ath10k *ar)
|
||||
|
||||
void ath10k_htt_rx_free(struct ath10k_htt *htt)
|
||||
{
|
||||
if (htt->ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (htt->ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
return;
|
||||
|
||||
del_timer_sync(&htt->rx_ring.refill_retry_timer);
|
||||
@ -760,7 +749,7 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
|
||||
size_t size;
|
||||
struct timer_list *timer = &htt->rx_ring.refill_retry_timer;
|
||||
|
||||
if (ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
return 0;
|
||||
|
||||
htt->rx_confused = false;
|
||||
@ -1905,7 +1894,7 @@ static void ath10k_htt_rx_h_enqueue(struct ath10k *ar,
|
||||
}
|
||||
|
||||
static int ath10k_unchain_msdu(struct sk_buff_head *amsdu,
|
||||
unsigned long int *unchain_cnt)
|
||||
unsigned long *unchain_cnt)
|
||||
{
|
||||
struct sk_buff *skb, *first;
|
||||
int space;
|
||||
@ -1954,8 +1943,8 @@ static int ath10k_unchain_msdu(struct sk_buff_head *amsdu,
|
||||
|
||||
static void ath10k_htt_rx_h_unchain(struct ath10k *ar,
|
||||
struct sk_buff_head *amsdu,
|
||||
unsigned long int *drop_cnt,
|
||||
unsigned long int *unchain_cnt)
|
||||
unsigned long *drop_cnt,
|
||||
unsigned long *unchain_cnt)
|
||||
{
|
||||
struct sk_buff *first;
|
||||
struct htt_rx_desc *rxd;
|
||||
@ -2005,7 +1994,7 @@ static bool ath10k_htt_rx_amsdu_allowed(struct ath10k *ar,
|
||||
static void ath10k_htt_rx_h_filter(struct ath10k *ar,
|
||||
struct sk_buff_head *amsdu,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
unsigned long int *drop_cnt)
|
||||
unsigned long *drop_cnt)
|
||||
{
|
||||
if (skb_queue_empty(amsdu))
|
||||
return;
|
||||
@ -2025,10 +2014,10 @@ static int ath10k_htt_rx_handle_amsdu(struct ath10k_htt *htt)
|
||||
struct ieee80211_rx_status *rx_status = &htt->rx_status;
|
||||
struct sk_buff_head amsdu;
|
||||
int ret;
|
||||
unsigned long int drop_cnt = 0;
|
||||
unsigned long int unchain_cnt = 0;
|
||||
unsigned long int drop_cnt_filter = 0;
|
||||
unsigned long int msdus_to_queue, num_msdus;
|
||||
unsigned long drop_cnt = 0;
|
||||
unsigned long unchain_cnt = 0;
|
||||
unsigned long drop_cnt_filter = 0;
|
||||
unsigned long msdus_to_queue, num_msdus;
|
||||
enum ath10k_pkt_rx_err err = ATH10K_PKT_RX_ERR_MAX;
|
||||
u8 first_hdr[RX_HTT_HDR_STATUS_LEN];
|
||||
|
||||
@ -2220,8 +2209,12 @@ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar,
|
||||
int status = MS(resp->data_tx_completion.flags, HTT_DATA_TX_STATUS);
|
||||
__le16 msdu_id, *msdus;
|
||||
bool rssi_enabled = false;
|
||||
u8 msdu_count = 0;
|
||||
u8 msdu_count = 0, num_airtime_records, tid;
|
||||
int i;
|
||||
struct htt_data_tx_compl_ppdu_dur *ppdu_info;
|
||||
struct ath10k_peer *peer;
|
||||
u16 ppdu_info_offset = 0, peer_id;
|
||||
u32 tx_duration;
|
||||
|
||||
switch (status) {
|
||||
case HTT_DATA_TX_STATUS_NO_ACK:
|
||||
@ -2245,12 +2238,12 @@ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar,
|
||||
resp->data_tx_completion.num_msdus);
|
||||
|
||||
msdu_count = resp->data_tx_completion.num_msdus;
|
||||
msdus = resp->data_tx_completion.msdus;
|
||||
|
||||
if (resp->data_tx_completion.flags2 & HTT_TX_CMPL_FLAG_DATA_RSSI)
|
||||
rssi_enabled = true;
|
||||
|
||||
for (i = 0; i < msdu_count; i++) {
|
||||
msdus = resp->data_tx_completion.msdus;
|
||||
msdu_id = msdus[i];
|
||||
tx_done.msdu_id = __le16_to_cpu(msdu_id);
|
||||
|
||||
@ -2282,6 +2275,50 @@ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar,
|
||||
ath10k_txrx_tx_unref(htt, &tx_done);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(resp->data_tx_completion.flags2 & HTT_TX_CMPL_FLAG_PPDU_DURATION_PRESENT))
|
||||
return;
|
||||
|
||||
ppdu_info_offset = (msdu_count & 0x01) ? msdu_count + 1 : msdu_count;
|
||||
|
||||
if (rssi_enabled)
|
||||
ppdu_info_offset += ppdu_info_offset;
|
||||
|
||||
if (resp->data_tx_completion.flags2 &
|
||||
(HTT_TX_CMPL_FLAG_PPID_PRESENT | HTT_TX_CMPL_FLAG_PA_PRESENT))
|
||||
ppdu_info_offset += 2;
|
||||
|
||||
ppdu_info = (struct htt_data_tx_compl_ppdu_dur *)&msdus[ppdu_info_offset];
|
||||
num_airtime_records = FIELD_GET(HTT_TX_COMPL_PPDU_DUR_INFO0_NUM_ENTRIES_MASK,
|
||||
__le32_to_cpu(ppdu_info->info0));
|
||||
|
||||
for (i = 0; i < num_airtime_records; i++) {
|
||||
struct htt_data_tx_ppdu_dur *ppdu_dur;
|
||||
u32 info0;
|
||||
|
||||
ppdu_dur = &ppdu_info->ppdu_dur[i];
|
||||
info0 = __le32_to_cpu(ppdu_dur->info0);
|
||||
|
||||
peer_id = FIELD_GET(HTT_TX_PPDU_DUR_INFO0_PEER_ID_MASK,
|
||||
info0);
|
||||
rcu_read_lock();
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
|
||||
peer = ath10k_peer_find_by_id(ar, peer_id);
|
||||
if (!peer) {
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
rcu_read_unlock();
|
||||
continue;
|
||||
}
|
||||
|
||||
tid = FIELD_GET(HTT_TX_PPDU_DUR_INFO0_TID_MASK, info0);
|
||||
tx_duration = __le32_to_cpu(ppdu_dur->tx_duration);
|
||||
|
||||
ieee80211_sta_register_airtime(peer->sta, tid, tx_duration, 0);
|
||||
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
}
|
||||
|
||||
static void ath10k_htt_rx_addba(struct ath10k *ar, struct htt_resp *resp)
|
||||
@ -2596,6 +2633,7 @@ static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb)
|
||||
u8 tid;
|
||||
int ret;
|
||||
int i;
|
||||
bool may_tx;
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_HTT, "htt rx tx fetch ind\n");
|
||||
|
||||
@ -2668,8 +2706,13 @@ static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb)
|
||||
num_msdus = 0;
|
||||
num_bytes = 0;
|
||||
|
||||
ieee80211_txq_schedule_start(hw, txq->ac);
|
||||
may_tx = ieee80211_txq_may_transmit(hw, txq);
|
||||
while (num_msdus < max_num_msdus &&
|
||||
num_bytes < max_num_bytes) {
|
||||
if (!may_tx)
|
||||
break;
|
||||
|
||||
ret = ath10k_mac_tx_push_txq(hw, txq);
|
||||
if (ret < 0)
|
||||
break;
|
||||
@ -2677,6 +2720,8 @@ static void ath10k_htt_rx_tx_fetch_ind(struct ath10k *ar, struct sk_buff *skb)
|
||||
num_msdus++;
|
||||
num_bytes += ret;
|
||||
}
|
||||
ieee80211_return_txq(hw, txq);
|
||||
ieee80211_txq_schedule_end(hw, txq->ac);
|
||||
|
||||
record->num_msdus = cpu_to_le16(num_msdus);
|
||||
record->num_bytes = cpu_to_le32(num_bytes);
|
||||
@ -3072,6 +3117,7 @@ ath10k_update_per_peer_tx_stats(struct ath10k *ar,
|
||||
|
||||
arsta->txrate.nss = txrate.nss;
|
||||
arsta->txrate.bw = ath10k_bw_to_mac80211_bw(txrate.bw);
|
||||
arsta->last_tx_bitrate = cfg80211_calculate_bitrate(&arsta->txrate);
|
||||
if (sgi)
|
||||
arsta->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
|
||||
@ -3237,7 +3283,7 @@ bool ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
|
||||
break;
|
||||
}
|
||||
case HTT_T2H_MSG_TYPE_RX_IND:
|
||||
if (ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
return ath10k_htt_rx_proc_rx_ind_hl(htt,
|
||||
&resp->rx_ind_hl,
|
||||
skb);
|
||||
@ -3533,7 +3579,7 @@ void ath10k_htt_set_rx_ops(struct ath10k_htt *htt)
|
||||
{
|
||||
struct ath10k *ar = htt->ar;
|
||||
|
||||
if (ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
htt->rx_ops = &htt_rx_ops_hl;
|
||||
else if (ar->hw_params.target_64bit)
|
||||
htt->rx_ops = &htt_rx_ops_64;
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/etherdevice.h>
|
||||
@ -495,7 +484,7 @@ int ath10k_htt_tx_start(struct ath10k_htt *htt)
|
||||
if (htt->tx_mem_allocated)
|
||||
return 0;
|
||||
|
||||
if (ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
return 0;
|
||||
|
||||
ret = ath10k_htt_tx_alloc_buf(htt);
|
||||
@ -1224,7 +1213,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
||||
return 0;
|
||||
|
||||
err_unmap_msdu:
|
||||
if (ar->dev_type != ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
|
||||
dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
|
||||
err_free_txdesc:
|
||||
dev_kfree_skb_any(txdesc);
|
||||
@ -1763,7 +1752,7 @@ void ath10k_htt_set_tx_ops(struct ath10k_htt *htt)
|
||||
{
|
||||
struct ath10k *ar = htt->ar;
|
||||
|
||||
if (ar->dev_type == ATH10K_DEV_TYPE_HL)
|
||||
if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL)
|
||||
htt->tx_ops = &htt_tx_ops_hl;
|
||||
else if (ar->hw_params.target_64bit)
|
||||
htt->tx_ops = &htt_tx_ops_64;
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2014-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _HW_H_
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "mac.h"
|
||||
@ -250,24 +239,24 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
|
||||
switch (key->cipher) {
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
arg.key_cipher = WMI_CIPHER_AES_CCM;
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
|
||||
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
arg.key_cipher = WMI_CIPHER_TKIP;
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_TKIP];
|
||||
arg.key_txmic_len = 8;
|
||||
arg.key_rxmic_len = 8;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_WEP40:
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
arg.key_cipher = WMI_CIPHER_WEP;
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_WEP];
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
arg.key_cipher = WMI_CIPHER_AES_CCM;
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_CCM];
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
arg.key_cipher = WMI_CIPHER_AES_GCM;
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_AES_GCM];
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
@ -284,7 +273,7 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
|
||||
if (cmd == DISABLE_KEY) {
|
||||
arg.key_cipher = WMI_CIPHER_NONE;
|
||||
arg.key_cipher = ar->wmi_key_cipher[WMI_CIPHER_NONE];
|
||||
arg.key_data = NULL;
|
||||
}
|
||||
|
||||
@ -3397,6 +3386,7 @@ ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
const struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
|
||||
__le16 fc = hdr->frame_control;
|
||||
|
||||
if (!vif || vif->type == NL80211_IFTYPE_MONITOR)
|
||||
@ -3438,7 +3428,8 @@ ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
|
||||
if (ieee80211_is_data_present(fc) && sta && sta->tdls)
|
||||
return ATH10K_HW_TXRX_ETHERNET;
|
||||
|
||||
if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags))
|
||||
if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) ||
|
||||
skb_cb->flags & ATH10K_SKB_F_RAW_TX)
|
||||
return ATH10K_HW_TXRX_RAW;
|
||||
|
||||
return ATH10K_HW_TXRX_NATIVE_WIFI;
|
||||
@ -3544,10 +3535,13 @@ static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
|
||||
static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_txq *txq,
|
||||
struct sk_buff *skb)
|
||||
struct sk_buff *skb, u16 airtime)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
|
||||
const struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
bool is_data = ieee80211_is_data(hdr->frame_control) ||
|
||||
ieee80211_is_data_qos(hdr->frame_control);
|
||||
|
||||
cb->flags = 0;
|
||||
if (!ath10k_tx_h_use_hwcrypto(vif, skb))
|
||||
@ -3559,8 +3553,19 @@ static void ath10k_mac_tx_h_fill_cb(struct ath10k *ar,
|
||||
if (ieee80211_is_data_qos(hdr->frame_control))
|
||||
cb->flags |= ATH10K_SKB_F_QOS;
|
||||
|
||||
/* Data frames encrypted in software will be posted to firmware
|
||||
* with tx encap mode set to RAW. Ex: Multicast traffic generated
|
||||
* for a specific VLAN group will always be encrypted in software.
|
||||
*/
|
||||
if (is_data && ieee80211_has_protected(hdr->frame_control) &&
|
||||
!info->control.hw_key) {
|
||||
cb->flags |= ATH10K_SKB_F_NO_HWCRYPT;
|
||||
cb->flags |= ATH10K_SKB_F_RAW_TX;
|
||||
}
|
||||
|
||||
cb->vif = vif;
|
||||
cb->txq = txq;
|
||||
cb->airtime_est = airtime;
|
||||
}
|
||||
|
||||
bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)
|
||||
@ -3667,6 +3672,7 @@ static int ath10k_mac_tx(struct ath10k *ar,
|
||||
{
|
||||
struct ieee80211_hw *hw = ar->hw;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
const struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
|
||||
int ret;
|
||||
|
||||
/* We should disable CCK RATE due to P2P */
|
||||
@ -3684,7 +3690,8 @@ static int ath10k_mac_tx(struct ath10k *ar,
|
||||
ath10k_tx_h_8023(skb);
|
||||
break;
|
||||
case ATH10K_HW_TXRX_RAW:
|
||||
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
|
||||
if (!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags) &&
|
||||
!(skb_cb->flags & ATH10K_SKB_F_RAW_TX)) {
|
||||
WARN_ON_ONCE(1);
|
||||
ieee80211_free_txskb(hw, skb);
|
||||
return -ENOTSUPP;
|
||||
@ -3890,7 +3897,6 @@ static void ath10k_mac_txq_init(struct ieee80211_txq *txq)
|
||||
|
||||
static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
|
||||
{
|
||||
struct ath10k_txq *artxq;
|
||||
struct ath10k_skb_cb *cb;
|
||||
struct sk_buff *msdu;
|
||||
int msdu_id;
|
||||
@ -3898,12 +3904,6 @@ static void ath10k_mac_txq_unref(struct ath10k *ar, struct ieee80211_txq *txq)
|
||||
if (!txq)
|
||||
return;
|
||||
|
||||
artxq = (void *)txq->drv_priv;
|
||||
spin_lock_bh(&ar->txqs_lock);
|
||||
if (!list_empty(&artxq->list))
|
||||
list_del_init(&artxq->list);
|
||||
spin_unlock_bh(&ar->txqs_lock);
|
||||
|
||||
spin_lock_bh(&ar->htt.tx_lock);
|
||||
idr_for_each_entry(&ar->htt.pending_tx, msdu, msdu_id) {
|
||||
cb = ATH10K_SKB_CB(msdu);
|
||||
@ -3943,7 +3943,6 @@ static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
|
||||
struct ath10k_txq *artxq = (void *)txq->drv_priv;
|
||||
|
||||
/* No need to get locks */
|
||||
|
||||
if (ar->htt.tx_q_state.mode == HTT_TX_MODE_SWITCH_PUSH)
|
||||
return true;
|
||||
|
||||
@ -3956,6 +3955,52 @@ static bool ath10k_mac_tx_can_push(struct ieee80211_hw *hw,
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Return estimated airtime in microsecond, which is calculated using last
|
||||
* reported TX rate. This is just a rough estimation because host driver has no
|
||||
* knowledge of the actual transmit rate, retries or aggregation. If actual
|
||||
* airtime can be reported by firmware, then delta between estimated and actual
|
||||
* airtime can be adjusted from deficit.
|
||||
*/
|
||||
#define IEEE80211_ATF_OVERHEAD 100 /* IFS + some slot time */
|
||||
#define IEEE80211_ATF_OVERHEAD_IFS 16 /* IFS only */
|
||||
static u16 ath10k_mac_update_airtime(struct ath10k *ar,
|
||||
struct ieee80211_txq *txq,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ath10k_sta *arsta;
|
||||
u32 pktlen;
|
||||
u16 airtime = 0;
|
||||
|
||||
if (!txq || !txq->sta)
|
||||
return airtime;
|
||||
|
||||
if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
|
||||
return airtime;
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
arsta = (struct ath10k_sta *)txq->sta->drv_priv;
|
||||
|
||||
pktlen = skb->len + 38; /* Assume MAC header 30, SNAP 8 for most case */
|
||||
if (arsta->last_tx_bitrate) {
|
||||
/* airtime in us, last_tx_bitrate in 100kbps */
|
||||
airtime = (pktlen * 8 * (1000 / 100))
|
||||
/ arsta->last_tx_bitrate;
|
||||
/* overhead for media access time and IFS */
|
||||
airtime += IEEE80211_ATF_OVERHEAD_IFS;
|
||||
} else {
|
||||
/* This is mostly for throttle excessive BC/MC frames, and the
|
||||
* airtime/rate doesn't need be exact. Airtime of BC/MC frames
|
||||
* in 2G get some discount, which helps prevent very low rate
|
||||
* frames from being blocked for too long.
|
||||
*/
|
||||
airtime = (pktlen * 8 * (1000 / 100)) / 60; /* 6M */
|
||||
airtime += IEEE80211_ATF_OVERHEAD;
|
||||
}
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
|
||||
return airtime;
|
||||
}
|
||||
|
||||
int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
||||
struct ieee80211_txq *txq)
|
||||
{
|
||||
@ -3971,6 +4016,7 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
||||
size_t skb_len;
|
||||
bool is_mgmt, is_presp;
|
||||
int ret;
|
||||
u16 airtime;
|
||||
|
||||
spin_lock_bh(&ar->htt.tx_lock);
|
||||
ret = ath10k_htt_tx_inc_pending(htt);
|
||||
@ -3988,7 +4034,8 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb);
|
||||
airtime = ath10k_mac_update_airtime(ar, txq, skb);
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb, airtime);
|
||||
|
||||
skb_len = skb->len;
|
||||
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
|
||||
@ -4030,48 +4077,45 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw,
|
||||
return skb_len;
|
||||
}
|
||||
|
||||
void ath10k_mac_tx_push_pending(struct ath10k *ar)
|
||||
static int ath10k_mac_schedule_txq(struct ieee80211_hw *hw, u32 ac)
|
||||
{
|
||||
struct ieee80211_hw *hw = ar->hw;
|
||||
struct ieee80211_txq *txq;
|
||||
struct ath10k_txq *artxq;
|
||||
struct ath10k_txq *last;
|
||||
int ret;
|
||||
int max;
|
||||
int ret = 0;
|
||||
|
||||
if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
|
||||
return;
|
||||
|
||||
spin_lock_bh(&ar->txqs_lock);
|
||||
rcu_read_lock();
|
||||
|
||||
last = list_last_entry(&ar->txqs, struct ath10k_txq, list);
|
||||
while (!list_empty(&ar->txqs)) {
|
||||
artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list);
|
||||
txq = container_of((void *)artxq, struct ieee80211_txq,
|
||||
drv_priv);
|
||||
|
||||
/* Prevent aggressive sta/tid taking over tx queue */
|
||||
max = HTC_HOST_MAX_MSG_PER_TX_BUNDLE;
|
||||
ret = 0;
|
||||
while (ath10k_mac_tx_can_push(hw, txq) && max--) {
|
||||
ieee80211_txq_schedule_start(hw, ac);
|
||||
while ((txq = ieee80211_next_txq(hw, ac))) {
|
||||
while (ath10k_mac_tx_can_push(hw, txq)) {
|
||||
ret = ath10k_mac_tx_push_txq(hw, txq);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
list_del_init(&artxq->list);
|
||||
if (ret != -ENOENT)
|
||||
list_add_tail(&artxq->list, &ar->txqs);
|
||||
|
||||
ieee80211_return_txq(hw, txq);
|
||||
ath10k_htt_tx_txq_update(hw, txq);
|
||||
|
||||
if (artxq == last || (ret < 0 && ret != -ENOENT))
|
||||
if (ret == -EBUSY)
|
||||
break;
|
||||
}
|
||||
ieee80211_txq_schedule_end(hw, ac);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ath10k_mac_tx_push_pending(struct ath10k *ar)
|
||||
{
|
||||
struct ieee80211_hw *hw = ar->hw;
|
||||
u32 ac;
|
||||
|
||||
if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
|
||||
return;
|
||||
|
||||
if (ar->htt.num_pending_tx >= (ar->htt.max_num_pending_tx / 2))
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
|
||||
if (ath10k_mac_schedule_txq(hw, ac) == -EBUSY)
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
spin_unlock_bh(&ar->txqs_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(ath10k_mac_tx_push_pending);
|
||||
|
||||
@ -4258,8 +4302,10 @@ static void ath10k_mac_op_tx(struct ieee80211_hw *hw,
|
||||
bool is_mgmt;
|
||||
bool is_presp;
|
||||
int ret;
|
||||
u16 airtime;
|
||||
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb);
|
||||
airtime = ath10k_mac_update_airtime(ar, txq, skb);
|
||||
ath10k_mac_tx_h_fill_cb(ar, vif, txq, skb, airtime);
|
||||
|
||||
txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb);
|
||||
txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode);
|
||||
@ -4310,31 +4356,28 @@ static void ath10k_mac_op_wake_tx_queue(struct ieee80211_hw *hw,
|
||||
struct ieee80211_txq *txq)
|
||||
{
|
||||
struct ath10k *ar = hw->priv;
|
||||
struct ath10k_txq *artxq = (void *)txq->drv_priv;
|
||||
struct ieee80211_txq *f_txq;
|
||||
struct ath10k_txq *f_artxq;
|
||||
int ret = 0;
|
||||
int max = HTC_HOST_MAX_MSG_PER_TX_BUNDLE;
|
||||
int ret;
|
||||
u8 ac;
|
||||
|
||||
spin_lock_bh(&ar->txqs_lock);
|
||||
if (list_empty(&artxq->list))
|
||||
list_add_tail(&artxq->list, &ar->txqs);
|
||||
ath10k_htt_tx_txq_update(hw, txq);
|
||||
if (ar->htt.tx_q_state.mode != HTT_TX_MODE_SWITCH_PUSH)
|
||||
return;
|
||||
|
||||
f_artxq = list_first_entry(&ar->txqs, struct ath10k_txq, list);
|
||||
f_txq = container_of((void *)f_artxq, struct ieee80211_txq, drv_priv);
|
||||
list_del_init(&f_artxq->list);
|
||||
ac = txq->ac;
|
||||
ieee80211_txq_schedule_start(hw, ac);
|
||||
txq = ieee80211_next_txq(hw, ac);
|
||||
if (!txq)
|
||||
goto out;
|
||||
|
||||
while (ath10k_mac_tx_can_push(hw, f_txq) && max--) {
|
||||
ret = ath10k_mac_tx_push_txq(hw, f_txq);
|
||||
while (ath10k_mac_tx_can_push(hw, txq)) {
|
||||
ret = ath10k_mac_tx_push_txq(hw, txq);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
if (ret != -ENOENT)
|
||||
list_add_tail(&f_artxq->list, &ar->txqs);
|
||||
spin_unlock_bh(&ar->txqs_lock);
|
||||
|
||||
ath10k_htt_tx_txq_update(hw, f_txq);
|
||||
ieee80211_return_txq(hw, txq);
|
||||
ath10k_htt_tx_txq_update(hw, txq);
|
||||
out:
|
||||
ieee80211_txq_schedule_end(hw, ac);
|
||||
}
|
||||
|
||||
/* Must not be called with conf_mutex held as workers can use that also. */
|
||||
@ -4705,7 +4748,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = ath10k_hif_power_up(ar);
|
||||
ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "Could not init hif: %d\n", ret);
|
||||
goto err_off;
|
||||
@ -5342,6 +5385,17 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
|
||||
goto err_peer_delete;
|
||||
}
|
||||
|
||||
if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
|
||||
vdev_param = ar->wmi.vdev_param->rtt_responder_role;
|
||||
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
arvif->ftm_responder);
|
||||
|
||||
/* It is harmless to not set FTM role. Do not warn */
|
||||
if (ret && ret != -EOPNOTSUPP)
|
||||
ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n",
|
||||
arvif->vdev_id, ret);
|
||||
}
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR) {
|
||||
ar->monitor_arvif = arvif;
|
||||
ret = ath10k_monitor_recalc(ar);
|
||||
@ -5616,6 +5670,20 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
|
||||
if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
|
||||
ether_addr_copy(arvif->bssid, info->bssid);
|
||||
|
||||
if (changed & BSS_CHANGED_FTM_RESPONDER &&
|
||||
arvif->ftm_responder != info->ftm_responder &&
|
||||
test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
|
||||
arvif->ftm_responder = info->ftm_responder;
|
||||
|
||||
vdev_param = ar->wmi.vdev_param->rtt_responder_role;
|
||||
ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
|
||||
arvif->ftm_responder);
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC,
|
||||
"mac vdev %d ftm_responder %d:ret %d\n",
|
||||
arvif->vdev_id, arvif->ftm_responder, ret);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_ENABLED)
|
||||
ath10k_control_beaconing(arvif, info);
|
||||
|
||||
@ -8618,6 +8686,15 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
wiphy_ext_feature_set(ar->hw->wiphy,
|
||||
NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
|
||||
|
||||
if (ath10k_peer_stats_enabled(ar) ||
|
||||
test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
|
||||
wiphy_ext_feature_set(ar->hw->wiphy,
|
||||
NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
|
||||
|
||||
if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map))
|
||||
wiphy_ext_feature_set(ar->hw->wiphy,
|
||||
NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
|
||||
|
||||
/*
|
||||
* on LL hardware queues are managed entirely by the FW
|
||||
* so we only advertise to mac we can do the queues thing
|
||||
@ -8727,12 +8804,19 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
|
||||
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
ar->hw->weight_multiplier = ATH10K_AIRTIME_WEIGHT_MULTIPLIER;
|
||||
|
||||
ret = ieee80211_register_hw(ar->hw);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to register ieee80211: %d\n", ret);
|
||||
goto err_dfs_detector_exit;
|
||||
}
|
||||
|
||||
if (test_bit(WMI_SERVICE_PER_PACKET_SW_ENCRYPT, ar->wmi.svc_map)) {
|
||||
ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN);
|
||||
ar->hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_AP_VLAN);
|
||||
}
|
||||
|
||||
if (!ath_is_world_regd(&ar->ath_common.regulatory)) {
|
||||
ret = regulatory_hint(ar->hw->wiphy,
|
||||
ar->ath_common.regulatory.alpha2);
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _MAC_H_
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2015 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2015 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _P2P_H
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
@ -913,7 +902,6 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
|
||||
int nbytes)
|
||||
{
|
||||
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
||||
struct ath10k_ce *ce = ath10k_ce_priv(ar);
|
||||
int ret = 0;
|
||||
u32 *buf;
|
||||
unsigned int completed_nbytes, alloc_nbytes, remaining_bytes;
|
||||
@ -924,8 +912,7 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
|
||||
void *data_buf = NULL;
|
||||
int i;
|
||||
|
||||
spin_lock_bh(&ce->ce_lock);
|
||||
|
||||
mutex_lock(&ar_pci->ce_diag_mutex);
|
||||
ce_diag = ar_pci->ce_diag;
|
||||
|
||||
/*
|
||||
@ -960,19 +947,17 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
|
||||
nbytes = min_t(unsigned int, remaining_bytes,
|
||||
DIAG_TRANSFER_LIMIT);
|
||||
|
||||
ret = ce_diag->ops->ce_rx_post_buf(ce_diag, &ce_data, ce_data);
|
||||
ret = ath10k_ce_rx_post_buf(ce_diag, &ce_data, ce_data);
|
||||
if (ret != 0)
|
||||
goto done;
|
||||
|
||||
/* Request CE to send from Target(!) address to Host buffer */
|
||||
ret = ath10k_ce_send_nolock(ce_diag, NULL, (u32)address, nbytes, 0,
|
||||
0);
|
||||
ret = ath10k_ce_send(ce_diag, NULL, (u32)address, nbytes, 0, 0);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
i = 0;
|
||||
while (ath10k_ce_completed_send_next_nolock(ce_diag,
|
||||
NULL) != 0) {
|
||||
while (ath10k_ce_completed_send_next(ce_diag, NULL) != 0) {
|
||||
udelay(DIAG_ACCESS_CE_WAIT_US);
|
||||
i += DIAG_ACCESS_CE_WAIT_US;
|
||||
|
||||
@ -983,10 +968,8 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while (ath10k_ce_completed_recv_next_nolock(ce_diag,
|
||||
(void **)&buf,
|
||||
&completed_nbytes)
|
||||
!= 0) {
|
||||
while (ath10k_ce_completed_recv_next(ce_diag, (void **)&buf,
|
||||
&completed_nbytes) != 0) {
|
||||
udelay(DIAG_ACCESS_CE_WAIT_US);
|
||||
i += DIAG_ACCESS_CE_WAIT_US;
|
||||
|
||||
@ -1019,7 +1002,7 @@ done:
|
||||
dma_free_coherent(ar->dev, alloc_nbytes, data_buf,
|
||||
ce_data_base);
|
||||
|
||||
spin_unlock_bh(&ce->ce_lock);
|
||||
mutex_unlock(&ar_pci->ce_diag_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1067,7 +1050,6 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
|
||||
const void *data, int nbytes)
|
||||
{
|
||||
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
||||
struct ath10k_ce *ce = ath10k_ce_priv(ar);
|
||||
int ret = 0;
|
||||
u32 *buf;
|
||||
unsigned int completed_nbytes, alloc_nbytes, remaining_bytes;
|
||||
@ -1076,8 +1058,7 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
|
||||
dma_addr_t ce_data_base = 0;
|
||||
int i;
|
||||
|
||||
spin_lock_bh(&ce->ce_lock);
|
||||
|
||||
mutex_lock(&ar_pci->ce_diag_mutex);
|
||||
ce_diag = ar_pci->ce_diag;
|
||||
|
||||
/*
|
||||
@ -1118,7 +1099,7 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
|
||||
memcpy(data_buf, data, nbytes);
|
||||
|
||||
/* Set up to receive directly into Target(!) address */
|
||||
ret = ce_diag->ops->ce_rx_post_buf(ce_diag, &address, address);
|
||||
ret = ath10k_ce_rx_post_buf(ce_diag, &address, address);
|
||||
if (ret != 0)
|
||||
goto done;
|
||||
|
||||
@ -1126,14 +1107,12 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
|
||||
* Request CE to send caller-supplied data that
|
||||
* was copied to bounce buffer to Target(!) address.
|
||||
*/
|
||||
ret = ath10k_ce_send_nolock(ce_diag, NULL, ce_data_base,
|
||||
nbytes, 0, 0);
|
||||
ret = ath10k_ce_send(ce_diag, NULL, ce_data_base, nbytes, 0, 0);
|
||||
if (ret != 0)
|
||||
goto done;
|
||||
|
||||
i = 0;
|
||||
while (ath10k_ce_completed_send_next_nolock(ce_diag,
|
||||
NULL) != 0) {
|
||||
while (ath10k_ce_completed_send_next(ce_diag, NULL) != 0) {
|
||||
udelay(DIAG_ACCESS_CE_WAIT_US);
|
||||
i += DIAG_ACCESS_CE_WAIT_US;
|
||||
|
||||
@ -1144,10 +1123,8 @@ int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while (ath10k_ce_completed_recv_next_nolock(ce_diag,
|
||||
(void **)&buf,
|
||||
&completed_nbytes)
|
||||
!= 0) {
|
||||
while (ath10k_ce_completed_recv_next(ce_diag, (void **)&buf,
|
||||
&completed_nbytes) != 0) {
|
||||
udelay(DIAG_ACCESS_CE_WAIT_US);
|
||||
i += DIAG_ACCESS_CE_WAIT_US;
|
||||
|
||||
@ -1182,7 +1159,7 @@ done:
|
||||
ath10k_warn(ar, "failed to write diag value at 0x%x: %d\n",
|
||||
address, ret);
|
||||
|
||||
spin_unlock_bh(&ce->ce_lock);
|
||||
mutex_unlock(&ar_pci->ce_diag_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -2283,7 +2260,7 @@ static int ath10k_pci_get_num_banks(struct ath10k *ar)
|
||||
return 1;
|
||||
case QCA6164_2_1_DEVICE_ID:
|
||||
case QCA6174_2_1_DEVICE_ID:
|
||||
switch (MS(ar->chip_id, SOC_CHIP_ID_REV)) {
|
||||
switch (MS(ar->bus_param.chip_id, SOC_CHIP_ID_REV)) {
|
||||
case QCA6174_HW_1_0_CHIP_ID_REV:
|
||||
case QCA6174_HW_1_1_CHIP_ID_REV:
|
||||
case QCA6174_HW_2_1_CHIP_ID_REV:
|
||||
@ -2806,7 +2783,8 @@ static int ath10k_pci_chip_reset(struct ath10k *ar)
|
||||
return ar_pci->pci_hard_reset(ar);
|
||||
}
|
||||
|
||||
static int ath10k_pci_hif_power_up(struct ath10k *ar)
|
||||
static int ath10k_pci_hif_power_up(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
||||
int ret;
|
||||
@ -3462,6 +3440,7 @@ int ath10k_pci_setup_resource(struct ath10k *ar)
|
||||
|
||||
spin_lock_init(&ce->ce_lock);
|
||||
spin_lock_init(&ar_pci->ps_lock);
|
||||
mutex_init(&ar_pci->ce_diag_mutex);
|
||||
|
||||
timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0);
|
||||
|
||||
@ -3636,6 +3615,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
||||
}
|
||||
|
||||
bus_params.dev_type = ATH10K_DEV_TYPE_LL;
|
||||
bus_params.link_can_suspend = true;
|
||||
bus_params.chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
|
||||
if (bus_params.chip_id == 0xffffffff) {
|
||||
ath10k_err(ar, "failed to get chip id\n");
|
||||
|
@ -1,24 +1,14 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _PCI_H_
|
||||
#define _PCI_H_
|
||||
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include "hw.h"
|
||||
#include "ce.h"
|
||||
@ -128,6 +118,8 @@ struct ath10k_pci {
|
||||
|
||||
/* Copy Engine used for Diagnostic Accesses */
|
||||
struct ath10k_ce_pipe *ce_diag;
|
||||
/* For protecting ce_diag */
|
||||
struct mutex ce_diag_mutex;
|
||||
|
||||
struct ath10k_ce ce;
|
||||
struct timer_list rx_post_retry;
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/completion.h>
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef _ATH10K_QMI_H_
|
||||
#define _ATH10K_QMI_H_
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/soc/qcom/qmi.h>
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef WCN3990_QMI_SVC_V01_H
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _RX_DESC_H_
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2004-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2012,2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -1381,7 +1370,8 @@ static int ath10k_sdio_hif_disable_intrs(struct ath10k *ar)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ath10k_sdio_hif_power_up(struct ath10k *ar)
|
||||
static int ath10k_sdio_hif_power_up(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar);
|
||||
struct sdio_func *func = ar_sdio->func;
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2004-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _SDIO_H_
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
@ -30,6 +19,7 @@
|
||||
|
||||
#define ATH10K_SNOC_RX_POST_RETRY_MS 50
|
||||
#define CE_POLL_PIPE 4
|
||||
#define ATH10K_SNOC_WAKE_IRQ 2
|
||||
|
||||
static char *const ce_name[] = {
|
||||
"WLAN_CE_0",
|
||||
@ -956,7 +946,8 @@ static int ath10k_snoc_init_pipes(struct ath10k *ar)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_snoc_wlan_enable(struct ath10k *ar)
|
||||
static int ath10k_snoc_wlan_enable(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
struct ath10k_tgt_pipe_cfg tgt_cfg[CE_COUNT_MAX];
|
||||
struct ath10k_qmi_wlan_enable_cfg cfg;
|
||||
@ -990,7 +981,17 @@ static int ath10k_snoc_wlan_enable(struct ath10k *ar)
|
||||
cfg.shadow_reg_cfg = (struct ath10k_shadow_reg_cfg *)
|
||||
&target_shadow_reg_cfg_map;
|
||||
|
||||
mode = QMI_WLFW_MISSION_V01;
|
||||
switch (fw_mode) {
|
||||
case ATH10K_FIRMWARE_MODE_NORMAL:
|
||||
mode = QMI_WLFW_MISSION_V01;
|
||||
break;
|
||||
case ATH10K_FIRMWARE_MODE_UTF:
|
||||
mode = QMI_WLFW_FTM_V01;
|
||||
break;
|
||||
default:
|
||||
ath10k_err(ar, "invalid firmware mode %d\n", fw_mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return ath10k_qmi_wlan_enable(ar, &cfg, mode,
|
||||
NULL);
|
||||
@ -1019,14 +1020,15 @@ static void ath10k_snoc_hif_power_down(struct ath10k *ar)
|
||||
ath10k_ce_free_rri(ar);
|
||||
}
|
||||
|
||||
static int ath10k_snoc_hif_power_up(struct ath10k *ar)
|
||||
static int ath10k_snoc_hif_power_up(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_SNOC, "%s:WCN3990 driver state = %d\n",
|
||||
__func__, ar->state);
|
||||
|
||||
ret = ath10k_snoc_wlan_enable(ar);
|
||||
ret = ath10k_snoc_wlan_enable(ar, fw_mode);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to enable wcn3990: %d\n", ret);
|
||||
return ret;
|
||||
@ -1048,6 +1050,46 @@ err_wlan_enable:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int ath10k_snoc_hif_suspend(struct ath10k *ar)
|
||||
{
|
||||
struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
|
||||
int ret;
|
||||
|
||||
if (!device_may_wakeup(ar->dev))
|
||||
return -EPERM;
|
||||
|
||||
ret = enable_irq_wake(ar_snoc->ce_irqs[ATH10K_SNOC_WAKE_IRQ].irq_line);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to enable wakeup irq :%d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_SNOC, "snoc device suspended\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ath10k_snoc_hif_resume(struct ath10k *ar)
|
||||
{
|
||||
struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
|
||||
int ret;
|
||||
|
||||
if (!device_may_wakeup(ar->dev))
|
||||
return -EPERM;
|
||||
|
||||
ret = disable_irq_wake(ar_snoc->ce_irqs[ATH10K_SNOC_WAKE_IRQ].irq_line);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to disable wakeup irq: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_SNOC, "snoc device resumed\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct ath10k_hif_ops ath10k_snoc_hif_ops = {
|
||||
.read32 = ath10k_snoc_read32,
|
||||
.write32 = ath10k_snoc_write32,
|
||||
@ -1061,6 +1103,10 @@ static const struct ath10k_hif_ops ath10k_snoc_hif_ops = {
|
||||
.send_complete_check = ath10k_snoc_hif_send_complete_check,
|
||||
.get_free_queue_number = ath10k_snoc_hif_get_free_queue_number,
|
||||
.get_target_info = ath10k_snoc_hif_get_target_info,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ath10k_snoc_hif_suspend,
|
||||
.resume = ath10k_snoc_hif_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct ath10k_bus_ops ath10k_snoc_bus_ops = {
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _SNOC_H_
|
||||
@ -90,7 +79,7 @@ struct ath10k_snoc {
|
||||
struct ath10k_vreg_info *vreg;
|
||||
struct ath10k_clk_info *clk;
|
||||
struct ath10k_qmi *qmi;
|
||||
unsigned long int flags;
|
||||
unsigned long flags;
|
||||
};
|
||||
|
||||
static inline struct ath10k_snoc *ath10k_snoc_priv(struct ath10k *ar)
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2013-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/relay.h>
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2013-2015 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef SPECTRAL_H
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2015-2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* This file has implementation for code swap logic. With code swap feature,
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2015-2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _SWAP_H_
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __TARGADDRS_H__
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2014-2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "testmode.h"
|
||||
@ -270,7 +259,7 @@ static int ath10k_tm_cmd_utf_start(struct ath10k *ar, struct nlattr *tb[])
|
||||
ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode wmi version %d\n",
|
||||
ar->testmode.utf_mode_fw.fw_file.wmi_op_version);
|
||||
|
||||
ret = ath10k_hif_power_up(ar);
|
||||
ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_UTF);
|
||||
if (ret) {
|
||||
ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret);
|
||||
ar->state = ATH10K_STATE_OFF;
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2014 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2014,2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* "API" level of the ath10k testmode interface. Bump it after every
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2014-2015 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2014-2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef _THERMAL_
|
||||
#define _THERMAL_
|
||||
|
@ -1,17 +1,6 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2012 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2016 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "core.h"
|
||||
@ -95,7 +84,11 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
|
||||
wake_up(&htt->empty_tx_wq);
|
||||
spin_unlock_bh(&htt->tx_lock);
|
||||
|
||||
if (ar->dev_type != ATH10K_DEV_TYPE_HL)
|
||||
if (txq && txq->sta && skb_cb->airtime_est)
|
||||
ieee80211_sta_register_airtime(txq->sta, txq->tid,
|
||||
skb_cb->airtime_est, 0);
|
||||
|
||||
if (ar->bus_param.dev_type != ATH10K_DEV_TYPE_HL)
|
||||
dma_unmap_single(dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
|
||||
|
||||
ath10k_report_offchan_tx(htt->ar, msdu);
|
||||
|
@ -1,18 +1,7 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2014,2016 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef _TXRX_H_
|
||||
#define _TXRX_H_
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2007-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2012,2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -706,7 +695,8 @@ static void ath10k_usb_hif_send_complete_check(struct ath10k *ar,
|
||||
{
|
||||
}
|
||||
|
||||
static int ath10k_usb_hif_power_up(struct ath10k *ar)
|
||||
static int ath10k_usb_hif_power_up(struct ath10k *ar,
|
||||
enum ath10k_firmware_mode fw_mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2004-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _USB_H_
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _WMI_OPS_H_
|
||||
@ -69,6 +58,8 @@ struct wmi_ops {
|
||||
|
||||
struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt);
|
||||
struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar);
|
||||
struct sk_buff *(*gen_pdev_set_base_macaddr)(struct ath10k *ar,
|
||||
const u8 macaddr[ETH_ALEN]);
|
||||
struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g,
|
||||
u16 rd5g, u16 ctl2g, u16 ctl5g,
|
||||
enum wmi_dfs_region dfs_reg);
|
||||
@ -519,6 +510,22 @@ ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
|
||||
ar->wmi.cmd->pdev_set_regdomain_cmdid);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ath10k_wmi_pdev_set_base_macaddr(struct ath10k *ar, const u8 macaddr[ETH_ALEN])
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (!ar->wmi.ops->gen_pdev_set_base_macaddr)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
skb = ar->wmi.ops->gen_pdev_set_base_macaddr(ar, macaddr);
|
||||
if (IS_ERR(skb))
|
||||
return PTR_ERR(skb);
|
||||
|
||||
return ath10k_wmi_cmd_send(ar, skb,
|
||||
ar->wmi.cmd->pdev_set_base_macaddr_cmdid);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt)
|
||||
{
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#include "core.h"
|
||||
#include "debug.h"
|
||||
@ -2060,9 +2049,11 @@ ath10k_wmi_tlv_op_gen_vdev_install_key(struct ath10k *ar,
|
||||
size_t len;
|
||||
void *ptr;
|
||||
|
||||
if (arg->key_cipher == WMI_CIPHER_NONE && arg->key_data != NULL)
|
||||
if (arg->key_cipher == ar->wmi_key_cipher[WMI_CIPHER_NONE] &&
|
||||
arg->key_data)
|
||||
return ERR_PTR(-EINVAL);
|
||||
if (arg->key_cipher != WMI_CIPHER_NONE && arg->key_data == NULL)
|
||||
if (arg->key_cipher != ar->wmi_key_cipher[WMI_CIPHER_NONE] &&
|
||||
!arg->key_data)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
len = sizeof(*tlv) + sizeof(*cmd) +
|
||||
@ -3321,6 +3312,8 @@ ath10k_wmi_tlv_op_gen_wow_enable(struct ath10k *ar)
|
||||
cmd = (void *)tlv->value;
|
||||
|
||||
cmd->enable = __cpu_to_le32(1);
|
||||
if (!ar->bus_param.link_can_suspend)
|
||||
cmd->pause_iface_config = __cpu_to_le32(WOW_IFACE_PAUSE_DISABLED);
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv wow enable\n");
|
||||
return skb;
|
||||
|
@ -1,19 +1,8 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef _WMI_TLV_H
|
||||
#define _WMI_TLV_H
|
||||
@ -2001,8 +1990,15 @@ struct wmi_tlv_set_quiet_cmd {
|
||||
__le32 enabled;
|
||||
} __packed;
|
||||
|
||||
enum wmi_tlv_wow_interface_cfg {
|
||||
WOW_IFACE_PAUSE_ENABLED,
|
||||
WOW_IFACE_PAUSE_DISABLED
|
||||
};
|
||||
|
||||
struct wmi_tlv_wow_enable_cmd {
|
||||
__le32 enable;
|
||||
__le32 pause_iface_config;
|
||||
__le32 flags;
|
||||
} __packed;
|
||||
|
||||
struct wmi_tlv_wow_host_wakeup_ind {
|
||||
|
@ -1,19 +1,8 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <linux/skbuff.h>
|
||||
@ -827,6 +816,7 @@ static struct wmi_vdev_param_map wmi_vdev_param_map = {
|
||||
.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
};
|
||||
|
||||
/* 10.X WMI VDEV param map */
|
||||
@ -903,6 +893,7 @@ static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
|
||||
.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
};
|
||||
|
||||
static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
|
||||
@ -978,6 +969,7 @@ static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
|
||||
.rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
.rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
|
||||
};
|
||||
|
||||
static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
|
||||
@ -1056,6 +1048,7 @@ static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
|
||||
.inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
|
||||
.dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
|
||||
.disable_4addr_src_lrn = WMI_10_4_VDEV_PARAM_DISABLE_4_ADDR_SRC_LRN,
|
||||
.rtt_responder_role = WMI_10_4_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE,
|
||||
};
|
||||
|
||||
static struct wmi_pdev_param_map wmi_pdev_param_map = {
|
||||
@ -1606,6 +1599,30 @@ static struct wmi_pdev_param_map wmi_10_4_pdev_param_map = {
|
||||
.enable_btcoex = WMI_10_4_PDEV_PARAM_ENABLE_BTCOEX,
|
||||
};
|
||||
|
||||
static const u8 wmi_key_cipher_suites[] = {
|
||||
[WMI_CIPHER_NONE] = WMI_CIPHER_NONE,
|
||||
[WMI_CIPHER_WEP] = WMI_CIPHER_WEP,
|
||||
[WMI_CIPHER_TKIP] = WMI_CIPHER_TKIP,
|
||||
[WMI_CIPHER_AES_OCB] = WMI_CIPHER_AES_OCB,
|
||||
[WMI_CIPHER_AES_CCM] = WMI_CIPHER_AES_CCM,
|
||||
[WMI_CIPHER_WAPI] = WMI_CIPHER_WAPI,
|
||||
[WMI_CIPHER_CKIP] = WMI_CIPHER_CKIP,
|
||||
[WMI_CIPHER_AES_CMAC] = WMI_CIPHER_AES_CMAC,
|
||||
[WMI_CIPHER_AES_GCM] = WMI_CIPHER_AES_GCM,
|
||||
};
|
||||
|
||||
static const u8 wmi_tlv_key_cipher_suites[] = {
|
||||
[WMI_CIPHER_NONE] = WMI_TLV_CIPHER_NONE,
|
||||
[WMI_CIPHER_WEP] = WMI_TLV_CIPHER_WEP,
|
||||
[WMI_CIPHER_TKIP] = WMI_TLV_CIPHER_TKIP,
|
||||
[WMI_CIPHER_AES_OCB] = WMI_TLV_CIPHER_AES_OCB,
|
||||
[WMI_CIPHER_AES_CCM] = WMI_TLV_CIPHER_AES_CCM,
|
||||
[WMI_CIPHER_WAPI] = WMI_TLV_CIPHER_WAPI,
|
||||
[WMI_CIPHER_CKIP] = WMI_TLV_CIPHER_CKIP,
|
||||
[WMI_CIPHER_AES_CMAC] = WMI_TLV_CIPHER_AES_CMAC,
|
||||
[WMI_CIPHER_AES_GCM] = WMI_TLV_CIPHER_AES_GCM,
|
||||
};
|
||||
|
||||
static const struct wmi_peer_flags_map wmi_peer_flags_map = {
|
||||
.auth = WMI_PEER_AUTH,
|
||||
.qos = WMI_PEER_QOS,
|
||||
@ -6262,6 +6279,25 @@ int ath10k_wmi_connect(struct ath10k *ar)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
ath10k_wmi_op_gen_pdev_set_base_macaddr(struct ath10k *ar,
|
||||
const u8 macaddr[ETH_ALEN])
|
||||
{
|
||||
struct wmi_pdev_set_base_macaddr_cmd *cmd;
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
|
||||
if (!skb)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
cmd = (struct wmi_pdev_set_base_macaddr_cmd *)skb->data;
|
||||
ether_addr_copy(cmd->mac_addr.addr, macaddr);
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_WMI,
|
||||
"wmi pdev basemac %pM\n", macaddr);
|
||||
return skb;
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
|
||||
u16 ctl2g, u16 ctl5g,
|
||||
@ -9071,6 +9107,7 @@ static const struct wmi_ops wmi_10_2_ops = {
|
||||
.gen_peer_create = ath10k_wmi_op_gen_peer_create,
|
||||
.gen_peer_delete = ath10k_wmi_op_gen_peer_delete,
|
||||
.gen_peer_flush = ath10k_wmi_op_gen_peer_flush,
|
||||
.gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr,
|
||||
.gen_peer_set_param = ath10k_wmi_op_gen_peer_set_param,
|
||||
.gen_set_psmode = ath10k_wmi_op_gen_set_psmode,
|
||||
.gen_set_sta_ps = ath10k_wmi_op_gen_set_sta_ps,
|
||||
@ -9189,6 +9226,7 @@ static const struct wmi_ops wmi_10_4_ops = {
|
||||
|
||||
.gen_pdev_suspend = ath10k_wmi_op_gen_pdev_suspend,
|
||||
.gen_pdev_resume = ath10k_wmi_op_gen_pdev_resume,
|
||||
.gen_pdev_set_base_macaddr = ath10k_wmi_op_gen_pdev_set_base_macaddr,
|
||||
.gen_pdev_set_rd = ath10k_wmi_10x_op_gen_pdev_set_rd,
|
||||
.gen_pdev_set_param = ath10k_wmi_op_gen_pdev_set_param,
|
||||
.gen_init = ath10k_wmi_10_4_op_gen_init,
|
||||
@ -9252,6 +9290,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
|
||||
ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
|
||||
ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
|
||||
ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
|
||||
ar->wmi_key_cipher = wmi_key_cipher_suites;
|
||||
break;
|
||||
case ATH10K_FW_WMI_OP_VERSION_10_2_4:
|
||||
ar->wmi.cmd = &wmi_10_2_4_cmd_map;
|
||||
@ -9259,6 +9298,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
|
||||
ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
|
||||
ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
|
||||
ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
|
||||
ar->wmi_key_cipher = wmi_key_cipher_suites;
|
||||
break;
|
||||
case ATH10K_FW_WMI_OP_VERSION_10_2:
|
||||
ar->wmi.cmd = &wmi_10_2_cmd_map;
|
||||
@ -9266,6 +9306,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
|
||||
ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
|
||||
ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
|
||||
ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
|
||||
ar->wmi_key_cipher = wmi_key_cipher_suites;
|
||||
break;
|
||||
case ATH10K_FW_WMI_OP_VERSION_10_1:
|
||||
ar->wmi.cmd = &wmi_10x_cmd_map;
|
||||
@ -9273,6 +9314,7 @@ int ath10k_wmi_attach(struct ath10k *ar)
|
||||
ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
|
||||
ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
|
||||
ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
|
||||
ar->wmi_key_cipher = wmi_key_cipher_suites;
|
||||
break;
|
||||
case ATH10K_FW_WMI_OP_VERSION_MAIN:
|
||||
ar->wmi.cmd = &wmi_cmd_map;
|
||||
@ -9280,9 +9322,11 @@ int ath10k_wmi_attach(struct ath10k *ar)
|
||||
ar->wmi.vdev_param = &wmi_vdev_param_map;
|
||||
ar->wmi.pdev_param = &wmi_pdev_param_map;
|
||||
ar->wmi.peer_flags = &wmi_peer_flags_map;
|
||||
ar->wmi_key_cipher = wmi_key_cipher_suites;
|
||||
break;
|
||||
case ATH10K_FW_WMI_OP_VERSION_TLV:
|
||||
ath10k_wmi_tlv_attach(ar);
|
||||
ar->wmi_key_cipher = wmi_tlv_key_cipher_suites;
|
||||
break;
|
||||
case ATH10K_FW_WMI_OP_VERSION_UNSET:
|
||||
case ATH10K_FW_WMI_OP_VERSION_MAX:
|
||||
|
@ -1,26 +1,15 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef _WMI_H_
|
||||
#define _WMI_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <net/mac80211.h>
|
||||
#include <linux/ieee80211.h>
|
||||
|
||||
/*
|
||||
* This file specifies the WMI interface for the Unified Software
|
||||
@ -208,6 +197,11 @@ enum wmi_service {
|
||||
WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
|
||||
WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT,
|
||||
WMI_SERVICE_THERM_THROT,
|
||||
WMI_SERVICE_RTT_RESPONDER_ROLE,
|
||||
WMI_SERVICE_PER_PACKET_SW_ENCRYPT,
|
||||
WMI_SERVICE_REPORT_AIRTIME,
|
||||
|
||||
/* Remember to add the new value to wmi_service_name()! */
|
||||
|
||||
/* keep last */
|
||||
WMI_SERVICE_MAX,
|
||||
@ -368,9 +362,14 @@ enum wmi_10_4_service {
|
||||
WMI_10_4_SERVICE_HTT_ASSERT_TRIGGER_SUPPORT,
|
||||
WMI_10_4_SERVICE_VDEV_FILTER_NEIGHBOR_RX_PACKETS,
|
||||
WMI_10_4_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
|
||||
WMI_10_4_SERVICE_PEER_CHWIDTH_CHANGE,
|
||||
WMI_10_4_SERVICE_RX_FILTER_OUT_COUNT,
|
||||
WMI_10_4_SERVICE_RTT_RESPONDER_ROLE,
|
||||
WMI_10_4_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
|
||||
WMI_10_4_SERVICE_REPORT_AIRTIME,
|
||||
};
|
||||
|
||||
static inline char *wmi_service_name(int service_id)
|
||||
static inline char *wmi_service_name(enum wmi_service service_id)
|
||||
{
|
||||
#define SVCSTR(x) case x: return #x
|
||||
|
||||
@ -467,6 +466,7 @@ static inline char *wmi_service_name(int service_id)
|
||||
SVCSTR(WMI_SERVICE_TX_MODE_PUSH_PULL);
|
||||
SVCSTR(WMI_SERVICE_TX_MODE_DYNAMIC);
|
||||
SVCSTR(WMI_SERVICE_VDEV_RX_FILTER);
|
||||
SVCSTR(WMI_SERVICE_BTCOEX);
|
||||
SVCSTR(WMI_SERVICE_CHECK_CAL_VERSION);
|
||||
SVCSTR(WMI_SERVICE_DBGLOG_WARN2);
|
||||
SVCSTR(WMI_SERVICE_BTCOEX_DUTY_CYCLE);
|
||||
@ -476,18 +476,29 @@ static inline char *wmi_service_name(int service_id)
|
||||
SVCSTR(WMI_SERVICE_SMART_LOGGING_SUPPORT);
|
||||
SVCSTR(WMI_SERVICE_TDLS_CONN_TRACKER_IN_HOST_MODE);
|
||||
SVCSTR(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY);
|
||||
SVCSTR(WMI_SERVICE_MGMT_TX_WMI);
|
||||
SVCSTR(WMI_SERVICE_TDLS_WIDER_BANDWIDTH);
|
||||
SVCSTR(WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS);
|
||||
SVCSTR(WMI_SERVICE_HOST_DFS_CHECK_SUPPORT);
|
||||
SVCSTR(WMI_SERVICE_TPC_STATS_FINAL);
|
||||
SVCSTR(WMI_SERVICE_RESET_CHIP);
|
||||
SVCSTR(WMI_SERVICE_SPOOF_MAC_SUPPORT);
|
||||
SVCSTR(WMI_SERVICE_TX_DATA_ACK_RSSI);
|
||||
SVCSTR(WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT);
|
||||
default:
|
||||
SVCSTR(WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT);
|
||||
SVCSTR(WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT);
|
||||
SVCSTR(WMI_SERVICE_THERM_THROT);
|
||||
SVCSTR(WMI_SERVICE_RTT_RESPONDER_ROLE);
|
||||
SVCSTR(WMI_SERVICE_PER_PACKET_SW_ENCRYPT);
|
||||
SVCSTR(WMI_SERVICE_REPORT_AIRTIME);
|
||||
|
||||
case WMI_SERVICE_MAX:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#undef SVCSTR
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define WMI_SERVICE_IS_ENABLED(wmi_svc_bmap, svc_id, len) \
|
||||
@ -579,6 +590,8 @@ static inline void wmi_10x_svc_map(const __le32 *in, unsigned long *out,
|
||||
WMI_SERVICE_HTT_MGMT_TX_COMP_VALID_FLAGS, len);
|
||||
SVCMAP(WMI_10X_SERVICE_BB_TIMING_CONFIG_SUPPORT,
|
||||
WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT, len);
|
||||
SVCMAP(WMI_10X_SERVICE_PER_PACKET_SW_ENCRYPT,
|
||||
WMI_SERVICE_PER_PACKET_SW_ENCRYPT, len);
|
||||
}
|
||||
|
||||
static inline void wmi_main_svc_map(const __le32 *in, unsigned long *out,
|
||||
@ -799,6 +812,12 @@ static inline void wmi_10_4_svc_map(const __le32 *in, unsigned long *out,
|
||||
WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT, len);
|
||||
SVCMAP(WMI_10_4_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
|
||||
WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT, len);
|
||||
SVCMAP(WMI_10_4_SERVICE_RTT_RESPONDER_ROLE,
|
||||
WMI_SERVICE_RTT_RESPONDER_ROLE, len);
|
||||
SVCMAP(WMI_10_4_SERVICE_PER_PACKET_SW_ENCRYPT,
|
||||
WMI_SERVICE_PER_PACKET_SW_ENCRYPT, len);
|
||||
SVCMAP(WMI_10_4_SERVICE_REPORT_AIRTIME,
|
||||
WMI_SERVICE_REPORT_AIRTIME, len);
|
||||
}
|
||||
|
||||
#undef SVCMAP
|
||||
@ -2974,6 +2993,8 @@ enum wmi_10_4_feature_mask {
|
||||
WMI_10_4_TDLS_CONN_TRACKER_IN_HOST_MODE = BIT(11),
|
||||
WMI_10_4_TDLS_EXPLICIT_MODE_ONLY = BIT(12),
|
||||
WMI_10_4_TX_DATA_ACK_RSSI = BIT(16),
|
||||
WMI_10_4_EXT_PEER_TID_CONFIGS_SUPPORT = BIT(17),
|
||||
WMI_10_4_REPORT_AIRTIME = BIT(18),
|
||||
|
||||
};
|
||||
|
||||
@ -4085,6 +4106,10 @@ struct wmi_pdev_set_param_cmd {
|
||||
__le32 param_value;
|
||||
} __packed;
|
||||
|
||||
struct wmi_pdev_set_base_macaddr_cmd {
|
||||
struct wmi_mac_addr mac_addr;
|
||||
} __packed;
|
||||
|
||||
/* valid period is 1 ~ 60000ms, unit in millisecond */
|
||||
#define WMI_PDEV_PARAM_CAL_PERIOD_MAX 60000
|
||||
|
||||
@ -4931,15 +4956,30 @@ struct wmi_key_seq_counter {
|
||||
__le32 key_seq_counter_h;
|
||||
} __packed;
|
||||
|
||||
#define WMI_CIPHER_NONE 0x0 /* clear key */
|
||||
#define WMI_CIPHER_WEP 0x1
|
||||
#define WMI_CIPHER_TKIP 0x2
|
||||
#define WMI_CIPHER_AES_OCB 0x3
|
||||
#define WMI_CIPHER_AES_CCM 0x4
|
||||
#define WMI_CIPHER_WAPI 0x5
|
||||
#define WMI_CIPHER_CKIP 0x6
|
||||
#define WMI_CIPHER_AES_CMAC 0x7
|
||||
#define WMI_CIPHER_AES_GCM 0x8
|
||||
enum wmi_cipher_suites {
|
||||
WMI_CIPHER_NONE,
|
||||
WMI_CIPHER_WEP,
|
||||
WMI_CIPHER_TKIP,
|
||||
WMI_CIPHER_AES_OCB,
|
||||
WMI_CIPHER_AES_CCM,
|
||||
WMI_CIPHER_WAPI,
|
||||
WMI_CIPHER_CKIP,
|
||||
WMI_CIPHER_AES_CMAC,
|
||||
WMI_CIPHER_AES_GCM,
|
||||
};
|
||||
|
||||
enum wmi_tlv_cipher_suites {
|
||||
WMI_TLV_CIPHER_NONE,
|
||||
WMI_TLV_CIPHER_WEP,
|
||||
WMI_TLV_CIPHER_TKIP,
|
||||
WMI_TLV_CIPHER_AES_OCB,
|
||||
WMI_TLV_CIPHER_AES_CCM,
|
||||
WMI_TLV_CIPHER_WAPI,
|
||||
WMI_TLV_CIPHER_CKIP,
|
||||
WMI_TLV_CIPHER_AES_CMAC,
|
||||
WMI_TLV_CIPHER_ANY,
|
||||
WMI_TLV_CIPHER_AES_GCM,
|
||||
};
|
||||
|
||||
struct wmi_vdev_install_key_cmd {
|
||||
__le32 vdev_id;
|
||||
@ -5085,6 +5125,7 @@ struct wmi_vdev_param_map {
|
||||
u32 inc_tsf;
|
||||
u32 dec_tsf;
|
||||
u32 disable_4addr_src_lrn;
|
||||
u32 rtt_responder_role;
|
||||
};
|
||||
|
||||
#define WMI_VDEV_PARAM_UNSUPPORTED 0
|
||||
|
@ -1,18 +1,7 @@
|
||||
// SPDX-License-Identifier: ISC
|
||||
/*
|
||||
* Copyright (c) 2015-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "mac.h"
|
||||
@ -77,7 +66,7 @@ static int ath10k_wow_cleanup(struct ath10k *ar)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* Convert a 802.3 format to a 802.11 format.
|
||||
* +------------+-----------+--------+----------------+
|
||||
* 802.3: |dest mac(6B)|src mac(6B)|type(2B)| body... |
|
||||
@ -88,9 +77,8 @@ static int ath10k_wow_cleanup(struct ath10k *ar)
|
||||
* 802.11: |4B|dest mac(6B)| 6B |src mac(6B)| 8B |type(2B)| body... |
|
||||
* +--+------------+----+-----------+---------------+-----------+
|
||||
*/
|
||||
static void ath10k_wow_convert_8023_to_80211
|
||||
(struct cfg80211_pkt_pattern *new,
|
||||
const struct cfg80211_pkt_pattern *old)
|
||||
static void ath10k_wow_convert_8023_to_80211(struct cfg80211_pkt_pattern *new,
|
||||
const struct cfg80211_pkt_pattern *old)
|
||||
{
|
||||
u8 hdr_8023_pattern[ETH_HLEN] = {};
|
||||
u8 hdr_8023_bit_mask[ETH_HLEN] = {};
|
||||
|
@ -1,17 +1,6 @@
|
||||
/* SPDX-License-Identifier: ISC */
|
||||
/*
|
||||
* Copyright (c) 2015,2017 Qualcomm Atheros, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
#ifndef _WOW_H_
|
||||
#define _WOW_H_
|
||||
|
@ -112,8 +112,6 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
||||
#define ATH_TXFIFO_DEPTH 8
|
||||
#define ATH_TX_ERROR 0x01
|
||||
|
||||
#define ATH_AIRTIME_QUANTUM 300 /* usec */
|
||||
|
||||
/* Stop tx traffic 1ms before the GO goes away */
|
||||
#define ATH_P2P_PS_STOP_TIME 1000
|
||||
|
||||
@ -246,10 +244,8 @@ struct ath_atx_tid {
|
||||
s8 bar_index;
|
||||
bool active;
|
||||
bool clear_ps_filter;
|
||||
bool has_queued;
|
||||
};
|
||||
|
||||
void __ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid);
|
||||
void ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid);
|
||||
|
||||
struct ath_node {
|
||||
@ -263,12 +259,9 @@ struct ath_node {
|
||||
|
||||
bool sleeping;
|
||||
bool no_ps_filter;
|
||||
s64 airtime_deficit[IEEE80211_NUM_ACS];
|
||||
u32 airtime_rx_start;
|
||||
|
||||
#ifdef CONFIG_ATH9K_STATION_STATISTICS
|
||||
struct ath_rx_rate_stats rx_rate_stats;
|
||||
struct ath_airtime_stats airtime_stats;
|
||||
#endif
|
||||
u8 key_idx[4];
|
||||
|
||||
@ -986,11 +979,6 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs);
|
||||
|
||||
#define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */
|
||||
|
||||
#define AIRTIME_USE_TX BIT(0)
|
||||
#define AIRTIME_USE_RX BIT(1)
|
||||
#define AIRTIME_USE_NEW_QUEUES BIT(2)
|
||||
#define AIRTIME_ACTIVE(flags) (!!(flags & (AIRTIME_USE_TX|AIRTIME_USE_RX)))
|
||||
|
||||
struct ath_softc {
|
||||
struct ieee80211_hw *hw;
|
||||
struct device *dev;
|
||||
@ -1034,8 +1022,6 @@ struct ath_softc {
|
||||
short nbcnvifs;
|
||||
unsigned long ps_usecount;
|
||||
|
||||
u16 airtime_flags; /* AIRTIME_* */
|
||||
|
||||
struct ath_rx rx;
|
||||
struct ath_tx tx;
|
||||
struct ath_beacon beacon;
|
||||
|
@ -1443,9 +1443,6 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
#endif
|
||||
debugfs_create_file("tpc", 0600, sc->debug.debugfs_phy, sc, &fops_tpc);
|
||||
|
||||
debugfs_create_u16("airtime_flags", 0600,
|
||||
sc->debug.debugfs_phy, &sc->airtime_flags);
|
||||
|
||||
debugfs_create_file("nf_override", 0600,
|
||||
sc->debug.debugfs_phy, sc, &fops_nf_override);
|
||||
|
||||
|
@ -319,20 +319,12 @@ ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause)
|
||||
void ath_debug_rate_stats(struct ath_softc *sc,
|
||||
struct ath_rx_status *rs,
|
||||
struct sk_buff *skb);
|
||||
void ath_debug_airtime(struct ath_softc *sc,
|
||||
struct ath_node *an,
|
||||
u32 rx, u32 tx);
|
||||
#else
|
||||
static inline void ath_debug_rate_stats(struct ath_softc *sc,
|
||||
struct ath_rx_status *rs,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
}
|
||||
static inline void ath_debug_airtime(struct ath_softc *sc,
|
||||
struct ath_node *an,
|
||||
u32 rx, u32 tx)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_ATH9K_STATION_STATISTICS */
|
||||
|
||||
#endif /* DEBUG_H */
|
||||
|
@ -242,75 +242,6 @@ static const struct file_operations fops_node_recv = {
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
void ath_debug_airtime(struct ath_softc *sc,
|
||||
struct ath_node *an,
|
||||
u32 rx,
|
||||
u32 tx)
|
||||
{
|
||||
struct ath_airtime_stats *astats = &an->airtime_stats;
|
||||
|
||||
astats->rx_airtime += rx;
|
||||
astats->tx_airtime += tx;
|
||||
}
|
||||
|
||||
static ssize_t read_airtime(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_node *an = file->private_data;
|
||||
struct ath_airtime_stats *astats;
|
||||
static const char *qname[4] = {
|
||||
"VO", "VI", "BE", "BK"
|
||||
};
|
||||
u32 len = 0, size = 256;
|
||||
char *buf;
|
||||
size_t retval;
|
||||
int i;
|
||||
|
||||
buf = kzalloc(size, GFP_KERNEL);
|
||||
if (buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
astats = &an->airtime_stats;
|
||||
|
||||
len += scnprintf(buf + len, size - len, "RX: %u us\n", astats->rx_airtime);
|
||||
len += scnprintf(buf + len, size - len, "TX: %u us\n", astats->tx_airtime);
|
||||
len += scnprintf(buf + len, size - len, "Deficit: ");
|
||||
for (i = 0; i < 4; i++)
|
||||
len += scnprintf(buf+len, size - len, "%s: %lld us ", qname[i], an->airtime_deficit[i]);
|
||||
if (len < size)
|
||||
buf[len++] = '\n';
|
||||
|
||||
retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
kfree(buf);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
write_airtime_reset_stub(struct file *file, const char __user *ubuf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_node *an = file->private_data;
|
||||
struct ath_airtime_stats *astats;
|
||||
int i;
|
||||
|
||||
astats = &an->airtime_stats;
|
||||
astats->rx_airtime = 0;
|
||||
astats->tx_airtime = 0;
|
||||
for (i = 0; i < 4; i++)
|
||||
an->airtime_deficit[i] = ATH_AIRTIME_QUANTUM;
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations fops_airtime = {
|
||||
.read = read_airtime,
|
||||
.write = write_airtime_reset_stub,
|
||||
.open = simple_open,
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
|
||||
void ath9k_sta_add_debugfs(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
@ -320,5 +251,4 @@ void ath9k_sta_add_debugfs(struct ieee80211_hw *hw,
|
||||
|
||||
debugfs_create_file("node_aggr", 0444, dir, an, &fops_node_aggr);
|
||||
debugfs_create_file("node_recv", 0444, dir, an, &fops_node_recv);
|
||||
debugfs_create_file("airtime", 0644, dir, an, &fops_airtime);
|
||||
}
|
||||
|
@ -676,8 +676,6 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||
|
||||
/* Will be cleared in ath9k_start() */
|
||||
set_bit(ATH_OP_INVALID, &common->op_flags);
|
||||
sc->airtime_flags = (AIRTIME_USE_TX | AIRTIME_USE_RX |
|
||||
AIRTIME_USE_NEW_QUEUES);
|
||||
|
||||
sc->sc_ah = ah;
|
||||
sc->dfs_detector = dfs_pattern_detector_init(common, NL80211_DFS_UNSET);
|
||||
@ -1013,6 +1011,7 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||
SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
|
||||
}
|
||||
|
||||
int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||
|
@ -1054,14 +1054,7 @@ static void ath_rx_count_airtime(struct ath_softc *sc,
|
||||
len, rxs->rate_idx, is_sp);
|
||||
}
|
||||
|
||||
if (!!(sc->airtime_flags & AIRTIME_USE_RX)) {
|
||||
spin_lock_bh(&acq->lock);
|
||||
an->airtime_deficit[acno] -= airtime;
|
||||
if (an->airtime_deficit[acno] <= 0)
|
||||
__ath_tx_queue_tid(sc, ATH_AN_2_TID(an, tidno));
|
||||
spin_unlock_bh(&acq->lock);
|
||||
}
|
||||
ath_debug_airtime(sc, an, airtime, 0);
|
||||
ieee80211_sta_register_airtime(sta, tidno, 0, airtime);
|
||||
exit:
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
@ -113,44 +113,14 @@ void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq)
|
||||
ath_tx_status(hw, skb);
|
||||
}
|
||||
|
||||
void __ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
|
||||
{
|
||||
struct ath_vif *avp = (struct ath_vif *) tid->an->vif->drv_priv;
|
||||
struct ath_chanctx *ctx = avp->chanctx;
|
||||
struct ath_acq *acq;
|
||||
struct list_head *tid_list;
|
||||
u8 acno = TID_TO_WME_AC(tid->tidno);
|
||||
|
||||
if (!ctx || !list_empty(&tid->list))
|
||||
return;
|
||||
|
||||
|
||||
acq = &ctx->acq[acno];
|
||||
if ((sc->airtime_flags & AIRTIME_USE_NEW_QUEUES) &&
|
||||
tid->an->airtime_deficit[acno] > 0)
|
||||
tid_list = &acq->acq_new;
|
||||
else
|
||||
tid_list = &acq->acq_old;
|
||||
|
||||
list_add_tail(&tid->list, tid_list);
|
||||
}
|
||||
|
||||
void ath_tx_queue_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
|
||||
{
|
||||
struct ath_vif *avp = (struct ath_vif *) tid->an->vif->drv_priv;
|
||||
struct ath_chanctx *ctx = avp->chanctx;
|
||||
struct ath_acq *acq;
|
||||
struct ieee80211_txq *queue =
|
||||
container_of((void *)tid, struct ieee80211_txq, drv_priv);
|
||||
|
||||
if (!ctx || !list_empty(&tid->list))
|
||||
return;
|
||||
|
||||
acq = &ctx->acq[TID_TO_WME_AC(tid->tidno)];
|
||||
spin_lock_bh(&acq->lock);
|
||||
__ath_tx_queue_tid(sc, tid);
|
||||
spin_unlock_bh(&acq->lock);
|
||||
ieee80211_schedule_txq(sc->hw, queue);
|
||||
}
|
||||
|
||||
|
||||
void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue)
|
||||
{
|
||||
struct ath_softc *sc = hw->priv;
|
||||
@ -163,11 +133,7 @@ void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue)
|
||||
tid->tidno);
|
||||
|
||||
ath_txq_lock(sc, txq);
|
||||
|
||||
tid->has_queued = true;
|
||||
ath_tx_queue_tid(sc, tid);
|
||||
ath_txq_schedule(sc, txq);
|
||||
|
||||
ath_txq_unlock(sc, txq);
|
||||
}
|
||||
|
||||
@ -217,8 +183,8 @@ ath_get_skb_tid(struct ath_softc *sc, struct ath_node *an, struct sk_buff *skb)
|
||||
return ATH_AN_2_TID(an, tidno);
|
||||
}
|
||||
|
||||
static struct sk_buff *
|
||||
ath_tid_pull(struct ath_atx_tid *tid)
|
||||
static int
|
||||
ath_tid_pull(struct ath_atx_tid *tid, struct sk_buff **skbuf)
|
||||
{
|
||||
struct ieee80211_txq *txq = container_of((void*)tid, struct ieee80211_txq, drv_priv);
|
||||
struct ath_softc *sc = tid->an->sc;
|
||||
@ -229,20 +195,16 @@ ath_tid_pull(struct ath_atx_tid *tid)
|
||||
};
|
||||
struct sk_buff *skb;
|
||||
struct ath_frame_info *fi;
|
||||
int q;
|
||||
|
||||
if (!tid->has_queued)
|
||||
return NULL;
|
||||
int q, ret;
|
||||
|
||||
skb = ieee80211_tx_dequeue(hw, txq);
|
||||
if (!skb) {
|
||||
tid->has_queued = false;
|
||||
return NULL;
|
||||
}
|
||||
if (!skb)
|
||||
return -ENOENT;
|
||||
|
||||
if (ath_tx_prepare(hw, skb, &txctl)) {
|
||||
ret = ath_tx_prepare(hw, skb, &txctl);
|
||||
if (ret) {
|
||||
ieee80211_free_txskb(hw, skb);
|
||||
return NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
q = skb_get_queue_mapping(skb);
|
||||
@ -252,24 +214,19 @@ ath_tid_pull(struct ath_atx_tid *tid)
|
||||
++tid->txq->pending_frames;
|
||||
}
|
||||
|
||||
return skb;
|
||||
*skbuf = skb;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static bool ath_tid_has_buffered(struct ath_atx_tid *tid)
|
||||
static int ath_tid_dequeue(struct ath_atx_tid *tid,
|
||||
struct sk_buff **skb)
|
||||
{
|
||||
return !skb_queue_empty(&tid->retry_q) || tid->has_queued;
|
||||
}
|
||||
int ret = 0;
|
||||
*skb = __skb_dequeue(&tid->retry_q);
|
||||
if (!*skb)
|
||||
ret = ath_tid_pull(tid, skb);
|
||||
|
||||
static struct sk_buff *ath_tid_dequeue(struct ath_atx_tid *tid)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = __skb_dequeue(&tid->retry_q);
|
||||
if (!skb)
|
||||
skb = ath_tid_pull(tid);
|
||||
|
||||
return skb;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
|
||||
@ -365,11 +322,12 @@ static void ath_tid_drain(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct list_head bf_head;
|
||||
struct ath_tx_status ts;
|
||||
struct ath_frame_info *fi;
|
||||
int ret;
|
||||
|
||||
memset(&ts, 0, sizeof(ts));
|
||||
INIT_LIST_HEAD(&bf_head);
|
||||
|
||||
while ((skb = ath_tid_dequeue(tid))) {
|
||||
while ((ret = ath_tid_dequeue(tid, &skb)) == 0) {
|
||||
fi = get_frame_info(skb);
|
||||
bf = fi->bf;
|
||||
|
||||
@ -681,7 +639,6 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
skb_queue_splice_tail(&bf_pending, &tid->retry_q);
|
||||
if (!an->sleeping) {
|
||||
ath_tx_queue_tid(sc, tid);
|
||||
|
||||
if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY))
|
||||
tid->clear_ps_filter = true;
|
||||
}
|
||||
@ -708,11 +665,11 @@ static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
|
||||
return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
|
||||
}
|
||||
|
||||
static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_node *an,
|
||||
struct ath_atx_tid *tid, struct ath_buf *bf,
|
||||
static void ath_tx_count_airtime(struct ath_softc *sc,
|
||||
struct ieee80211_sta *sta,
|
||||
struct ath_buf *bf,
|
||||
struct ath_tx_status *ts)
|
||||
{
|
||||
struct ath_txq *txq = tid->txq;
|
||||
u32 airtime = 0;
|
||||
int i;
|
||||
|
||||
@ -722,17 +679,7 @@ static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_node *an,
|
||||
airtime += rate_dur * bf->rates[i].count;
|
||||
}
|
||||
|
||||
if (sc->airtime_flags & AIRTIME_USE_TX) {
|
||||
int q = txq->mac80211_qnum;
|
||||
struct ath_acq *acq = &sc->cur_chan->acq[q];
|
||||
|
||||
spin_lock_bh(&acq->lock);
|
||||
an->airtime_deficit[q] -= airtime;
|
||||
if (an->airtime_deficit[q] <= 0)
|
||||
__ath_tx_queue_tid(sc, tid);
|
||||
spin_unlock_bh(&acq->lock);
|
||||
}
|
||||
ath_debug_airtime(sc, an, 0, airtime);
|
||||
ieee80211_sta_register_airtime(sta, ts->tid, airtime, 0);
|
||||
}
|
||||
|
||||
static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
|
||||
@ -762,7 +709,7 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
|
||||
if (sta) {
|
||||
struct ath_node *an = (struct ath_node *)sta->drv_priv;
|
||||
tid = ath_get_skb_tid(sc, an, bf->bf_mpdu);
|
||||
ath_tx_count_airtime(sc, an, tid, bf, ts);
|
||||
ath_tx_count_airtime(sc, sta, bf, ts);
|
||||
if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY))
|
||||
tid->clear_ps_filter = true;
|
||||
}
|
||||
@ -947,20 +894,21 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
|
||||
return ndelim;
|
||||
}
|
||||
|
||||
static struct ath_buf *
|
||||
static int
|
||||
ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct ath_atx_tid *tid)
|
||||
struct ath_atx_tid *tid, struct ath_buf **buf)
|
||||
{
|
||||
struct ieee80211_tx_info *tx_info;
|
||||
struct ath_frame_info *fi;
|
||||
struct sk_buff *skb, *first_skb = NULL;
|
||||
struct ath_buf *bf;
|
||||
struct sk_buff *skb, *first_skb = NULL;
|
||||
u16 seqno;
|
||||
int ret;
|
||||
|
||||
while (1) {
|
||||
skb = ath_tid_dequeue(tid);
|
||||
if (!skb)
|
||||
break;
|
||||
ret = ath_tid_dequeue(tid, &skb);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
fi = get_frame_info(skb);
|
||||
bf = fi->bf;
|
||||
@ -992,7 +940,7 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
|
||||
|
||||
if (!(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) {
|
||||
bf->bf_state.bf_type = 0;
|
||||
return bf;
|
||||
break;
|
||||
}
|
||||
|
||||
bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR;
|
||||
@ -1011,7 +959,7 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
|
||||
first_skb = skb;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
|
||||
if (tid->bar_index > ATH_BA_INDEX(tid->seq_start, seqno)) {
|
||||
@ -1028,10 +976,11 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
|
||||
if (bf_isampdu(bf))
|
||||
ath_tx_addto_baw(sc, tid, bf);
|
||||
|
||||
return bf;
|
||||
break;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
*buf = bf;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1041,7 +990,7 @@ ath_tx_form_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
{
|
||||
#define PADBYTES(_len) ((4 - ((_len) % 4)) % 4)
|
||||
struct ath_buf *bf = bf_first, *bf_prev = NULL;
|
||||
int nframes = 0, ndelim;
|
||||
int nframes = 0, ndelim, ret;
|
||||
u16 aggr_limit = 0, al = 0, bpad = 0,
|
||||
al_delta, h_baw = tid->baw_size / 2;
|
||||
struct ieee80211_tx_info *tx_info;
|
||||
@ -1093,7 +1042,9 @@ ath_tx_form_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
|
||||
bf_prev = bf;
|
||||
|
||||
bf = ath_tx_get_tid_subframe(sc, txq, tid);
|
||||
ret = ath_tx_get_tid_subframe(sc, txq, tid, &bf);
|
||||
if (ret < 0)
|
||||
break;
|
||||
}
|
||||
goto finish;
|
||||
stop:
|
||||
@ -1490,7 +1441,7 @@ ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct ath_buf *bf_first)
|
||||
{
|
||||
struct ath_buf *bf = bf_first, *bf_prev = NULL;
|
||||
int nframes = 0;
|
||||
int nframes = 0, ret;
|
||||
|
||||
do {
|
||||
struct ieee80211_tx_info *tx_info;
|
||||
@ -1504,8 +1455,8 @@ ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq,
|
||||
if (nframes >= 2)
|
||||
break;
|
||||
|
||||
bf = ath_tx_get_tid_subframe(sc, txq, tid);
|
||||
if (!bf)
|
||||
ret = ath_tx_get_tid_subframe(sc, txq, tid, &bf);
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
tx_info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
||||
@ -1518,30 +1469,27 @@ ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq,
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static bool ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct ath_atx_tid *tid)
|
||||
static int ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
struct ath_atx_tid *tid)
|
||||
{
|
||||
struct ath_buf *bf;
|
||||
struct ath_buf *bf = NULL;
|
||||
struct ieee80211_tx_info *tx_info;
|
||||
struct list_head bf_q;
|
||||
int aggr_len = 0;
|
||||
int aggr_len = 0, ret;
|
||||
bool aggr;
|
||||
|
||||
if (!ath_tid_has_buffered(tid))
|
||||
return false;
|
||||
|
||||
INIT_LIST_HEAD(&bf_q);
|
||||
|
||||
bf = ath_tx_get_tid_subframe(sc, txq, tid);
|
||||
if (!bf)
|
||||
return false;
|
||||
ret = ath_tx_get_tid_subframe(sc, txq, tid, &bf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
tx_info = IEEE80211_SKB_CB(bf->bf_mpdu);
|
||||
aggr = !!(tx_info->flags & IEEE80211_TX_CTL_AMPDU);
|
||||
if ((aggr && txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) ||
|
||||
(!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) {
|
||||
__skb_queue_tail(&tid->retry_q, bf->bf_mpdu);
|
||||
return false;
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ath_set_rates(tid->an->vif, tid->an->sta, bf);
|
||||
@ -1551,7 +1499,7 @@ static bool ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
ath_tx_form_burst(sc, txq, tid, &bf_q, bf);
|
||||
|
||||
if (list_empty(&bf_q))
|
||||
return false;
|
||||
return -EAGAIN;
|
||||
|
||||
if (tid->clear_ps_filter || tid->an->no_ps_filter) {
|
||||
tid->clear_ps_filter = false;
|
||||
@ -1560,7 +1508,7 @@ static bool ath_tx_sched_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
|
||||
ath_tx_fill_desc(sc, bf, txq, aggr_len);
|
||||
ath_tx_txqaddbuf(sc, txq, &bf_q, false);
|
||||
return true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||
@ -1623,28 +1571,16 @@ void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc,
|
||||
{
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ath_atx_tid *tid;
|
||||
struct ath_txq *txq;
|
||||
int tidno;
|
||||
|
||||
ath_dbg(common, XMIT, "%s called\n", __func__);
|
||||
|
||||
for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) {
|
||||
tid = ath_node_to_tid(an, tidno);
|
||||
txq = tid->txq;
|
||||
|
||||
ath_txq_lock(sc, txq);
|
||||
|
||||
if (list_empty(&tid->list)) {
|
||||
ath_txq_unlock(sc, txq);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!skb_queue_empty(&tid->retry_q))
|
||||
ieee80211_sta_set_buffered(sta, tid->tidno, true);
|
||||
|
||||
list_del_init(&tid->list);
|
||||
|
||||
ath_txq_unlock(sc, txq);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1663,11 +1599,12 @@ void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an)
|
||||
|
||||
ath_txq_lock(sc, txq);
|
||||
tid->clear_ps_filter = true;
|
||||
if (ath_tid_has_buffered(tid)) {
|
||||
if (!skb_queue_empty(&tid->retry_q)) {
|
||||
ath_tx_queue_tid(sc, tid);
|
||||
ath_txq_schedule(sc, txq);
|
||||
}
|
||||
ath_txq_unlock_complete(sc, txq);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1698,9 +1635,9 @@ void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
|
||||
struct ath_txq *txq = sc->tx.uapsdq;
|
||||
struct ieee80211_tx_info *info;
|
||||
struct list_head bf_q;
|
||||
struct ath_buf *bf_tail = NULL, *bf;
|
||||
struct ath_buf *bf_tail = NULL, *bf = NULL;
|
||||
int sent = 0;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
INIT_LIST_HEAD(&bf_q);
|
||||
for (i = 0; tids && nframes; i++, tids >>= 1) {
|
||||
@ -1713,8 +1650,9 @@ void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
|
||||
|
||||
ath_txq_lock(sc, tid->txq);
|
||||
while (nframes > 0) {
|
||||
bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid);
|
||||
if (!bf)
|
||||
ret = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq,
|
||||
tid, &bf);
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
ath9k_set_moredata(sc, bf, true);
|
||||
@ -1980,11 +1918,11 @@ void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq)
|
||||
*/
|
||||
void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
|
||||
{
|
||||
struct ieee80211_hw *hw = sc->hw;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ieee80211_txq *queue;
|
||||
struct ath_atx_tid *tid;
|
||||
struct list_head *tid_list;
|
||||
struct ath_acq *acq;
|
||||
bool active = AIRTIME_ACTIVE(sc->airtime_flags);
|
||||
int ret;
|
||||
|
||||
if (txq->mac80211_qnum < 0)
|
||||
return;
|
||||
@ -1992,58 +1930,26 @@ void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
|
||||
if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
|
||||
return;
|
||||
|
||||
ieee80211_txq_schedule_start(hw, txq->mac80211_qnum);
|
||||
spin_lock_bh(&sc->chan_lock);
|
||||
rcu_read_lock();
|
||||
acq = &sc->cur_chan->acq[txq->mac80211_qnum];
|
||||
|
||||
if (sc->cur_chan->stopped)
|
||||
goto out;
|
||||
|
||||
begin:
|
||||
tid_list = &acq->acq_new;
|
||||
if (list_empty(tid_list)) {
|
||||
tid_list = &acq->acq_old;
|
||||
if (list_empty(tid_list))
|
||||
goto out;
|
||||
}
|
||||
tid = list_first_entry(tid_list, struct ath_atx_tid, list);
|
||||
while ((queue = ieee80211_next_txq(hw, txq->mac80211_qnum))) {
|
||||
tid = (struct ath_atx_tid *)queue->drv_priv;
|
||||
|
||||
if (active && tid->an->airtime_deficit[txq->mac80211_qnum] <= 0) {
|
||||
spin_lock_bh(&acq->lock);
|
||||
tid->an->airtime_deficit[txq->mac80211_qnum] += ATH_AIRTIME_QUANTUM;
|
||||
list_move_tail(&tid->list, &acq->acq_old);
|
||||
spin_unlock_bh(&acq->lock);
|
||||
goto begin;
|
||||
}
|
||||
ret = ath_tx_sched_aggr(sc, txq, tid);
|
||||
ath_dbg(common, QUEUE, "ath_tx_sched_aggr returned %d\n", ret);
|
||||
|
||||
if (!ath_tid_has_buffered(tid)) {
|
||||
spin_lock_bh(&acq->lock);
|
||||
if ((tid_list == &acq->acq_new) && !list_empty(&acq->acq_old))
|
||||
list_move_tail(&tid->list, &acq->acq_old);
|
||||
else {
|
||||
list_del_init(&tid->list);
|
||||
}
|
||||
spin_unlock_bh(&acq->lock);
|
||||
goto begin;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If we succeed in scheduling something, immediately restart to make
|
||||
* sure we keep the HW busy.
|
||||
*/
|
||||
if(ath_tx_sched_aggr(sc, txq, tid)) {
|
||||
if (!active) {
|
||||
spin_lock_bh(&acq->lock);
|
||||
list_move_tail(&tid->list, &acq->acq_old);
|
||||
spin_unlock_bh(&acq->lock);
|
||||
}
|
||||
goto begin;
|
||||
ieee80211_return_txq(hw, queue);
|
||||
}
|
||||
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
spin_unlock_bh(&sc->chan_lock);
|
||||
ieee80211_txq_schedule_end(hw, txq->mac80211_qnum);
|
||||
}
|
||||
|
||||
void ath_txq_schedule_all(struct ath_softc *sc)
|
||||
@ -2887,9 +2793,6 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
|
||||
struct ath_atx_tid *tid;
|
||||
int tidno, acno;
|
||||
|
||||
for (acno = 0; acno < IEEE80211_NUM_ACS; acno++)
|
||||
an->airtime_deficit[acno] = ATH_AIRTIME_QUANTUM;
|
||||
|
||||
for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) {
|
||||
tid = ath_node_to_tid(an, tidno);
|
||||
tid->an = an;
|
||||
@ -2899,7 +2802,6 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
|
||||
tid->baw_head = tid->baw_tail = 0;
|
||||
tid->active = false;
|
||||
tid->clear_ps_filter = true;
|
||||
tid->has_queued = false;
|
||||
__skb_queue_head_init(&tid->retry_q);
|
||||
INIT_LIST_HEAD(&tid->list);
|
||||
acno = TID_TO_WME_AC(tidno);
|
||||
|
Loading…
Reference in New Issue
Block a user