mirror of https://gitee.com/openkylin/linux.git
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 * change QMI interface to support the new (and backwards incompatible) interface from HL3.1 and used in recent HL2.0 branch firmware releases ath * add new country codes for US
This commit is contained in:
commit
287d08a23c
|
@ -228,11 +228,31 @@ ath10k_ce_shadow_dest_ring_write_index_set(struct ath10k *ar,
|
|||
}
|
||||
|
||||
static inline void ath10k_ce_src_ring_base_addr_set(struct ath10k *ar,
|
||||
u32 ce_ctrl_addr,
|
||||
unsigned int addr)
|
||||
u32 ce_id,
|
||||
u64 addr)
|
||||
{
|
||||
struct ath10k_ce *ce = ath10k_ce_priv(ar);
|
||||
struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
|
||||
u32 ce_ctrl_addr = ath10k_ce_base_address(ar, ce_id);
|
||||
u32 addr_lo = lower_32_bits(addr);
|
||||
|
||||
ath10k_ce_write32(ar, ce_ctrl_addr +
|
||||
ar->hw_ce_regs->sr_base_addr, addr);
|
||||
ar->hw_ce_regs->sr_base_addr_lo, addr_lo);
|
||||
|
||||
if (ce_state->ops->ce_set_src_ring_base_addr_hi) {
|
||||
ce_state->ops->ce_set_src_ring_base_addr_hi(ar, ce_ctrl_addr,
|
||||
addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void ath10k_ce_set_src_ring_base_addr_hi(struct ath10k *ar,
|
||||
u32 ce_ctrl_addr,
|
||||
u64 addr)
|
||||
{
|
||||
u32 addr_hi = upper_32_bits(addr) & CE_DESC_ADDR_HI_MASK;
|
||||
|
||||
ath10k_ce_write32(ar, ce_ctrl_addr +
|
||||
ar->hw_ce_regs->sr_base_addr_hi, addr_hi);
|
||||
}
|
||||
|
||||
static inline void ath10k_ce_src_ring_size_set(struct ath10k *ar,
|
||||
|
@ -313,11 +333,36 @@ static inline u32 ath10k_ce_dest_ring_read_index_get(struct ath10k *ar,
|
|||
}
|
||||
|
||||
static inline void ath10k_ce_dest_ring_base_addr_set(struct ath10k *ar,
|
||||
u32 ce_ctrl_addr,
|
||||
u32 addr)
|
||||
u32 ce_id,
|
||||
u64 addr)
|
||||
{
|
||||
struct ath10k_ce *ce = ath10k_ce_priv(ar);
|
||||
struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
|
||||
u32 ce_ctrl_addr = ath10k_ce_base_address(ar, ce_id);
|
||||
u32 addr_lo = lower_32_bits(addr);
|
||||
|
||||
ath10k_ce_write32(ar, ce_ctrl_addr +
|
||||
ar->hw_ce_regs->dr_base_addr, addr);
|
||||
ar->hw_ce_regs->dr_base_addr_lo, addr_lo);
|
||||
|
||||
if (ce_state->ops->ce_set_dest_ring_base_addr_hi) {
|
||||
ce_state->ops->ce_set_dest_ring_base_addr_hi(ar, ce_ctrl_addr,
|
||||
addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void ath10k_ce_set_dest_ring_base_addr_hi(struct ath10k *ar,
|
||||
u32 ce_ctrl_addr,
|
||||
u64 addr)
|
||||
{
|
||||
u32 addr_hi = upper_32_bits(addr) & CE_DESC_ADDR_HI_MASK;
|
||||
u32 reg_value;
|
||||
|
||||
reg_value = ath10k_ce_read32(ar, ce_ctrl_addr +
|
||||
ar->hw_ce_regs->dr_base_addr_hi);
|
||||
reg_value &= ~CE_DESC_ADDR_HI_MASK;
|
||||
reg_value |= addr_hi;
|
||||
ath10k_ce_write32(ar, ce_ctrl_addr +
|
||||
ar->hw_ce_regs->dr_base_addr_hi, reg_value);
|
||||
}
|
||||
|
||||
static inline void ath10k_ce_dest_ring_size_set(struct ath10k *ar,
|
||||
|
@ -563,7 +608,7 @@ static int _ath10k_ce_send_nolock_64(struct ath10k_ce_pipe *ce_state,
|
|||
|
||||
addr = (__le32 *)&sdesc.addr;
|
||||
|
||||
flags |= upper_32_bits(buffer) & CE_DESC_FLAGS_GET_MASK;
|
||||
flags |= upper_32_bits(buffer) & CE_DESC_ADDR_HI_MASK;
|
||||
addr[0] = __cpu_to_le32(buffer);
|
||||
addr[1] = __cpu_to_le32(flags);
|
||||
if (flags & CE_SEND_FLAG_GATHER)
|
||||
|
@ -731,7 +776,7 @@ static int __ath10k_ce_rx_post_buf_64(struct ath10k_ce_pipe *pipe,
|
|||
return -ENOSPC;
|
||||
|
||||
desc->addr = __cpu_to_le64(paddr);
|
||||
desc->addr &= __cpu_to_le64(CE_DESC_37BIT_ADDR_MASK);
|
||||
desc->addr &= __cpu_to_le64(CE_DESC_ADDR_MASK);
|
||||
|
||||
desc->nbytes = 0;
|
||||
|
||||
|
@ -1346,7 +1391,7 @@ static int ath10k_ce_init_src_ring(struct ath10k *ar,
|
|||
ath10k_ce_src_ring_write_index_get(ar, ctrl_addr);
|
||||
src_ring->write_index &= src_ring->nentries_mask;
|
||||
|
||||
ath10k_ce_src_ring_base_addr_set(ar, ctrl_addr,
|
||||
ath10k_ce_src_ring_base_addr_set(ar, ce_id,
|
||||
src_ring->base_addr_ce_space);
|
||||
ath10k_ce_src_ring_size_set(ar, ctrl_addr, nentries);
|
||||
ath10k_ce_src_ring_dmax_set(ar, ctrl_addr, attr->src_sz_max);
|
||||
|
@ -1385,7 +1430,7 @@ static int ath10k_ce_init_dest_ring(struct ath10k *ar,
|
|||
ath10k_ce_dest_ring_write_index_get(ar, ctrl_addr);
|
||||
dest_ring->write_index &= dest_ring->nentries_mask;
|
||||
|
||||
ath10k_ce_dest_ring_base_addr_set(ar, ctrl_addr,
|
||||
ath10k_ce_dest_ring_base_addr_set(ar, ce_id,
|
||||
dest_ring->base_addr_ce_space);
|
||||
ath10k_ce_dest_ring_size_set(ar, ctrl_addr, nentries);
|
||||
ath10k_ce_dest_ring_byte_swap_set(ar, ctrl_addr, 0);
|
||||
|
@ -1660,7 +1705,7 @@ static void ath10k_ce_deinit_src_ring(struct ath10k *ar, unsigned int ce_id)
|
|||
{
|
||||
u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id);
|
||||
|
||||
ath10k_ce_src_ring_base_addr_set(ar, ctrl_addr, 0);
|
||||
ath10k_ce_src_ring_base_addr_set(ar, ce_id, 0);
|
||||
ath10k_ce_src_ring_size_set(ar, ctrl_addr, 0);
|
||||
ath10k_ce_src_ring_dmax_set(ar, ctrl_addr, 0);
|
||||
ath10k_ce_src_ring_highmark_set(ar, ctrl_addr, 0);
|
||||
|
@ -1670,7 +1715,7 @@ static void ath10k_ce_deinit_dest_ring(struct ath10k *ar, unsigned int ce_id)
|
|||
{
|
||||
u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id);
|
||||
|
||||
ath10k_ce_dest_ring_base_addr_set(ar, ctrl_addr, 0);
|
||||
ath10k_ce_dest_ring_base_addr_set(ar, ce_id, 0);
|
||||
ath10k_ce_dest_ring_size_set(ar, ctrl_addr, 0);
|
||||
ath10k_ce_dest_ring_highmark_set(ar, ctrl_addr, 0);
|
||||
}
|
||||
|
@ -1802,6 +1847,8 @@ static const struct ath10k_ce_ops ce_ops = {
|
|||
.ce_extract_desc_data = ath10k_ce_extract_desc_data,
|
||||
.ce_free_pipe = _ath10k_ce_free_pipe,
|
||||
.ce_send_nolock = _ath10k_ce_send_nolock,
|
||||
.ce_set_src_ring_base_addr_hi = NULL,
|
||||
.ce_set_dest_ring_base_addr_hi = NULL,
|
||||
};
|
||||
|
||||
static const struct ath10k_ce_ops ce_64_ops = {
|
||||
|
@ -1814,6 +1861,8 @@ static const struct ath10k_ce_ops ce_64_ops = {
|
|||
.ce_extract_desc_data = ath10k_ce_extract_desc_data_64,
|
||||
.ce_free_pipe = _ath10k_ce_free_pipe_64,
|
||||
.ce_send_nolock = _ath10k_ce_send_nolock_64,
|
||||
.ce_set_src_ring_base_addr_hi = ath10k_ce_set_src_ring_base_addr_hi,
|
||||
.ce_set_dest_ring_base_addr_hi = ath10k_ce_set_dest_ring_base_addr_hi,
|
||||
};
|
||||
|
||||
static void ath10k_ce_set_ops(struct ath10k *ar,
|
||||
|
@ -1909,7 +1958,7 @@ void ath10k_ce_alloc_rri(struct ath10k *ar)
|
|||
lower_32_bits(ce->paddr_rri));
|
||||
ath10k_ce_write32(ar, ar->hw_ce_regs->ce_rri_high,
|
||||
(upper_32_bits(ce->paddr_rri) &
|
||||
CE_DESC_FLAGS_GET_MASK));
|
||||
CE_DESC_ADDR_HI_MASK));
|
||||
|
||||
for (i = 0; i < CE_COUNT; i++) {
|
||||
ctrl1_regs = ar->hw_ce_regs->ctrl1_regs->addr;
|
||||
|
|
|
@ -39,8 +39,8 @@ struct ath10k_ce_pipe;
|
|||
#define CE_DESC_FLAGS_BYTE_SWAP (1 << 1)
|
||||
#define CE_WCN3990_DESC_FLAGS_GATHER BIT(31)
|
||||
|
||||
#define CE_DESC_FLAGS_GET_MASK GENMASK(4, 0)
|
||||
#define CE_DESC_37BIT_ADDR_MASK GENMASK_ULL(37, 0)
|
||||
#define CE_DESC_ADDR_MASK GENMASK_ULL(34, 0)
|
||||
#define CE_DESC_ADDR_HI_MASK GENMASK(4, 0)
|
||||
|
||||
/* Following desc flags are used in QCA99X0 */
|
||||
#define CE_DESC_FLAGS_HOST_INT_DIS (1 << 2)
|
||||
|
@ -104,7 +104,7 @@ struct ath10k_ce_ring {
|
|||
/* Host address space */
|
||||
void *base_addr_owner_space_unaligned;
|
||||
/* CE address space */
|
||||
u32 base_addr_ce_space_unaligned;
|
||||
dma_addr_t base_addr_ce_space_unaligned;
|
||||
|
||||
/*
|
||||
* Actual start of descriptors.
|
||||
|
@ -115,7 +115,7 @@ struct ath10k_ce_ring {
|
|||
void *base_addr_owner_space;
|
||||
|
||||
/* CE address space */
|
||||
u32 base_addr_ce_space;
|
||||
dma_addr_t base_addr_ce_space;
|
||||
|
||||
char *shadow_base_unaligned;
|
||||
struct ce_desc *shadow_base;
|
||||
|
@ -334,6 +334,12 @@ struct ath10k_ce_ops {
|
|||
void *per_transfer_context,
|
||||
dma_addr_t buffer, u32 nbytes,
|
||||
u32 transfer_id, u32 flags);
|
||||
void (*ce_set_src_ring_base_addr_hi)(struct ath10k *ar,
|
||||
u32 ce_ctrl_addr,
|
||||
u64 addr);
|
||||
void (*ce_set_dest_ring_base_addr_hi)(struct ath10k *ar,
|
||||
u32 ce_ctrl_addr,
|
||||
u64 addr);
|
||||
};
|
||||
|
||||
static inline u32 ath10k_ce_base_address(struct ath10k *ar, unsigned int ce_id)
|
||||
|
|
|
@ -2309,7 +2309,11 @@ static int ath10k_core_init_firmware_features(struct ath10k *ar)
|
|||
ar->max_num_stations = TARGET_TLV_NUM_STATIONS;
|
||||
ar->max_num_vdevs = TARGET_TLV_NUM_VDEVS;
|
||||
ar->max_num_tdls_vdevs = TARGET_TLV_NUM_TDLS_VDEVS;
|
||||
ar->htt.max_num_pending_tx = TARGET_TLV_NUM_MSDU_DESC;
|
||||
if (ar->hif.bus == ATH10K_BUS_SDIO)
|
||||
ar->htt.max_num_pending_tx =
|
||||
TARGET_TLV_NUM_MSDU_DESC_HL;
|
||||
else
|
||||
ar->htt.max_num_pending_tx = TARGET_TLV_NUM_MSDU_DESC;
|
||||
ar->wow.max_num_patterns = TARGET_TLV_NUM_WOW_PATTERNS;
|
||||
ar->fw_stats_req_mask = WMI_STAT_PDEV | WMI_STAT_VDEV |
|
||||
WMI_STAT_PEER;
|
||||
|
@ -2556,6 +2560,12 @@ int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
|
|||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
status = ath10k_hif_swap_mailbox(ar);
|
||||
if (status) {
|
||||
ath10k_err(ar, "failed to swap mailbox: %d\n", status);
|
||||
goto err_hif_stop;
|
||||
}
|
||||
|
||||
if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
|
||||
status = ath10k_htt_connect(&ar->htt);
|
||||
if (status) {
|
||||
|
|
|
@ -59,6 +59,8 @@ struct ath10k_hif_ops {
|
|||
*/
|
||||
void (*stop)(struct ath10k *ar);
|
||||
|
||||
int (*swap_mailbox)(struct ath10k *ar);
|
||||
|
||||
int (*map_service_to_pipe)(struct ath10k *ar, u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe);
|
||||
|
||||
|
@ -139,6 +141,13 @@ static inline void ath10k_hif_stop(struct ath10k *ar)
|
|||
return ar->hif.ops->stop(ar);
|
||||
}
|
||||
|
||||
static inline int ath10k_hif_swap_mailbox(struct ath10k *ar)
|
||||
{
|
||||
if (ar->hif.ops->swap_mailbox)
|
||||
return ar->hif.ops->swap_mailbox(ar);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ath10k_hif_map_service_to_pipe(struct ath10k *ar,
|
||||
u16 service_id,
|
||||
u8 *ul_pipe, u8 *dl_pipe)
|
||||
|
|
|
@ -268,7 +268,7 @@ int ath10k_htt_setup(struct ath10k_htt *htt)
|
|||
return status;
|
||||
}
|
||||
|
||||
status = ath10k_htt_h2t_aggr_cfg_msg(htt,
|
||||
status = htt->tx_ops->htt_h2t_aggr_cfg_msg(htt,
|
||||
htt->max_num_ampdu,
|
||||
htt->max_num_amsdu);
|
||||
if (status) {
|
||||
|
|
|
@ -357,6 +357,13 @@ struct htt_aggr_conf {
|
|||
u8 max_num_amsdu_subframes;
|
||||
} __packed;
|
||||
|
||||
struct htt_aggr_conf_v2 {
|
||||
u8 max_num_ampdu_subframes;
|
||||
/* amsdu_subframes is limited by 0x1F mask */
|
||||
u8 max_num_amsdu_subframes;
|
||||
u8 reserved;
|
||||
} __packed;
|
||||
|
||||
#define HTT_MGMT_FRM_HDR_DOWNLOAD_LEN 32
|
||||
struct htt_mgmt_tx_desc_qca99x0 {
|
||||
__le32 rate;
|
||||
|
@ -1650,6 +1657,7 @@ struct htt_cmd {
|
|||
struct htt_stats_req stats_req;
|
||||
struct htt_oob_sync_req oob_sync_req;
|
||||
struct htt_aggr_conf aggr_conf;
|
||||
struct htt_aggr_conf_v2 aggr_conf_v2;
|
||||
struct htt_frag_desc_bank_cfg32 frag_desc_bank_cfg32;
|
||||
struct htt_frag_desc_bank_cfg64 frag_desc_bank_cfg64;
|
||||
struct htt_tx_fetch_resp tx_fetch_resp;
|
||||
|
@ -1890,6 +1898,9 @@ struct ath10k_htt_tx_ops {
|
|||
struct sk_buff *msdu);
|
||||
int (*htt_alloc_txbuff)(struct ath10k_htt *htt);
|
||||
void (*htt_free_txbuff)(struct ath10k_htt *htt);
|
||||
int (*htt_h2t_aggr_cfg_msg)(struct ath10k_htt *htt,
|
||||
u8 max_subfrms_ampdu,
|
||||
u8 max_subfrms_amsdu);
|
||||
};
|
||||
|
||||
static inline int ath10k_htt_send_rx_ring_cfg(struct ath10k_htt *htt)
|
||||
|
|
|
@ -2975,6 +2975,8 @@ ath10k_accumulate_per_peer_tx_stats(struct ath10k *ar,
|
|||
STATS_OP_FMT(RETRY).rate_table[0][idx] += pstats->retry_bytes;
|
||||
STATS_OP_FMT(RETRY).rate_table[1][idx] += pstats->retry_pkts;
|
||||
}
|
||||
|
||||
tx_stats->tx_duration += pstats->duration;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -3141,6 +3143,7 @@ static void ath10k_htt_fetch_peer_stats(struct ath10k *ar,
|
|||
p_tx_stats->succ_pkts = __le16_to_cpu(tx_stats->succ_pkts);
|
||||
p_tx_stats->retry_pkts = __le16_to_cpu(tx_stats->retry_pkts);
|
||||
p_tx_stats->failed_pkts = __le16_to_cpu(tx_stats->failed_pkts);
|
||||
p_tx_stats->duration = __le16_to_cpu(tx_stats->tx_duration);
|
||||
|
||||
ath10k_update_per_peer_tx_stats(ar, sta, p_tx_stats);
|
||||
}
|
||||
|
|
|
@ -1035,6 +1035,53 @@ int ath10k_htt_h2t_aggr_cfg_msg(struct ath10k_htt *htt,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_htt_h2t_aggr_cfg_msg_v2(struct ath10k_htt *htt,
|
||||
u8 max_subfrms_ampdu,
|
||||
u8 max_subfrms_amsdu)
|
||||
{
|
||||
struct ath10k *ar = htt->ar;
|
||||
struct htt_aggr_conf_v2 *aggr_conf;
|
||||
struct sk_buff *skb;
|
||||
struct htt_cmd *cmd;
|
||||
int len;
|
||||
int ret;
|
||||
|
||||
/* Firmware defaults are: amsdu = 3 and ampdu = 64 */
|
||||
|
||||
if (max_subfrms_ampdu == 0 || max_subfrms_ampdu > 64)
|
||||
return -EINVAL;
|
||||
|
||||
if (max_subfrms_amsdu == 0 || max_subfrms_amsdu > 31)
|
||||
return -EINVAL;
|
||||
|
||||
len = sizeof(cmd->hdr);
|
||||
len += sizeof(cmd->aggr_conf_v2);
|
||||
|
||||
skb = ath10k_htc_alloc_skb(ar, len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
skb_put(skb, len);
|
||||
cmd = (struct htt_cmd *)skb->data;
|
||||
cmd->hdr.msg_type = HTT_H2T_MSG_TYPE_AGGR_CFG;
|
||||
|
||||
aggr_conf = &cmd->aggr_conf_v2;
|
||||
aggr_conf->max_num_ampdu_subframes = max_subfrms_ampdu;
|
||||
aggr_conf->max_num_amsdu_subframes = max_subfrms_amsdu;
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_HTT, "htt h2t aggr cfg msg amsdu %d ampdu %d",
|
||||
aggr_conf->max_num_amsdu_subframes,
|
||||
aggr_conf->max_num_ampdu_subframes);
|
||||
|
||||
ret = ath10k_htc_send(&htt->ar->htc, htt->eid, skb);
|
||||
if (ret) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ath10k_htt_tx_fetch_resp(struct ath10k *ar,
|
||||
__le32 token,
|
||||
__le16 fetch_seq_num,
|
||||
|
@ -1498,7 +1545,7 @@ static int ath10k_htt_tx_64(struct ath10k_htt *htt,
|
|||
u16 msdu_id, flags1 = 0;
|
||||
u16 freq = 0;
|
||||
dma_addr_t frags_paddr = 0;
|
||||
u32 txbuf_paddr;
|
||||
dma_addr_t txbuf_paddr;
|
||||
struct htt_msdu_ext_desc_64 *ext_desc = NULL;
|
||||
struct htt_msdu_ext_desc_64 *ext_desc_t = NULL;
|
||||
|
||||
|
@ -1692,6 +1739,7 @@ static const struct ath10k_htt_tx_ops htt_tx_ops_32 = {
|
|||
.htt_tx = ath10k_htt_tx_32,
|
||||
.htt_alloc_txbuff = ath10k_htt_tx_alloc_cont_txbuf_32,
|
||||
.htt_free_txbuff = ath10k_htt_tx_free_cont_txbuf_32,
|
||||
.htt_h2t_aggr_cfg_msg = ath10k_htt_h2t_aggr_cfg_msg,
|
||||
};
|
||||
|
||||
static const struct ath10k_htt_tx_ops htt_tx_ops_64 = {
|
||||
|
@ -1702,6 +1750,7 @@ static const struct ath10k_htt_tx_ops htt_tx_ops_64 = {
|
|||
.htt_tx = ath10k_htt_tx_64,
|
||||
.htt_alloc_txbuff = ath10k_htt_tx_alloc_cont_txbuf_64,
|
||||
.htt_free_txbuff = ath10k_htt_tx_free_cont_txbuf_64,
|
||||
.htt_h2t_aggr_cfg_msg = ath10k_htt_h2t_aggr_cfg_msg_v2,
|
||||
};
|
||||
|
||||
static const struct ath10k_htt_tx_ops htt_tx_ops_hl = {
|
||||
|
|
|
@ -318,9 +318,11 @@ static struct ath10k_hw_ce_ctrl1_upd wcn3990_ctrl1_upd = {
|
|||
};
|
||||
|
||||
const struct ath10k_hw_ce_regs wcn3990_ce_regs = {
|
||||
.sr_base_addr = 0x00000000,
|
||||
.sr_base_addr_lo = 0x00000000,
|
||||
.sr_base_addr_hi = 0x00000004,
|
||||
.sr_size_addr = 0x00000008,
|
||||
.dr_base_addr = 0x0000000c,
|
||||
.dr_base_addr_lo = 0x0000000c,
|
||||
.dr_base_addr_hi = 0x00000010,
|
||||
.dr_size_addr = 0x00000014,
|
||||
.misc_ie_addr = 0x00000034,
|
||||
.sr_wr_index_addr = 0x0000003c,
|
||||
|
@ -464,9 +466,9 @@ static struct ath10k_hw_ce_dst_src_wm_regs qcax_wm_dst_ring = {
|
|||
};
|
||||
|
||||
const struct ath10k_hw_ce_regs qcax_ce_regs = {
|
||||
.sr_base_addr = 0x00000000,
|
||||
.sr_base_addr_lo = 0x00000000,
|
||||
.sr_size_addr = 0x00000004,
|
||||
.dr_base_addr = 0x00000008,
|
||||
.dr_base_addr_lo = 0x00000008,
|
||||
.dr_size_addr = 0x0000000c,
|
||||
.ce_cmd_addr = 0x00000018,
|
||||
.misc_ie_addr = 0x00000034,
|
||||
|
|
|
@ -353,9 +353,11 @@ struct ath10k_hw_ce_ctrl1_upd {
|
|||
};
|
||||
|
||||
struct ath10k_hw_ce_regs {
|
||||
u32 sr_base_addr;
|
||||
u32 sr_base_addr_lo;
|
||||
u32 sr_base_addr_hi;
|
||||
u32 sr_size_addr;
|
||||
u32 dr_base_addr;
|
||||
u32 dr_base_addr_lo;
|
||||
u32 dr_base_addr_hi;
|
||||
u32 dr_size_addr;
|
||||
u32 ce_cmd_addr;
|
||||
u32 misc_ie_addr;
|
||||
|
@ -734,6 +736,7 @@ ath10k_rx_desc_msdu_limit_error(struct ath10k_hw_params *hw,
|
|||
#define TARGET_TLV_NUM_TDLS_VDEVS 1
|
||||
#define TARGET_TLV_NUM_TIDS ((TARGET_TLV_NUM_PEERS) * 2)
|
||||
#define TARGET_TLV_NUM_MSDU_DESC (1024 + 32)
|
||||
#define TARGET_TLV_NUM_MSDU_DESC_HL 64
|
||||
#define TARGET_TLV_NUM_WOW_PATTERNS 22
|
||||
#define TARGET_TLV_MGMT_NUM_MSDU_DESC (50)
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
* 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
|
||||
|
@ -3863,7 +3863,7 @@ void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work)
|
|||
ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n",
|
||||
ret);
|
||||
dma_unmap_single(ar->dev, paddr, skb->len,
|
||||
DMA_FROM_DEVICE);
|
||||
DMA_TO_DEVICE);
|
||||
ieee80211_free_txskb(ar->hw, skb);
|
||||
}
|
||||
} else {
|
||||
|
@ -4549,7 +4549,8 @@ static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
|
|||
ht_cap.cap |= stbc;
|
||||
}
|
||||
|
||||
if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
|
||||
if (ar->ht_cap_info & WMI_HT_CAP_LDPC || (ar->ht_cap_info &
|
||||
WMI_HT_CAP_RX_LDPC && (ar->ht_cap_info & WMI_HT_CAP_TX_LDPC)))
|
||||
ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
|
||||
|
||||
if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
|
||||
|
|
|
@ -3553,7 +3553,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|||
case QCA9377_1_0_DEVICE_ID:
|
||||
hw_rev = ATH10K_HW_QCA9377;
|
||||
pci_ps = true;
|
||||
pci_soft_reset = NULL;
|
||||
pci_soft_reset = ath10k_pci_warm_reset;
|
||||
pci_hard_reset = ath10k_pci_qca6174_chip_reset;
|
||||
targ_cpu_to_ce_addr = ath10k_pci_qca6174_targ_cpu_to_ce_addr;
|
||||
break;
|
||||
|
|
|
@ -1763,14 +1763,239 @@ struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[] = {
|
|||
daemon_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.data_type = QMI_UNSIGNED_4_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.elem_size = sizeof(u32),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x10,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
daemon_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x11,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
wake_msi_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_4_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u32),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x11,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
wake_msi),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x12,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
gpios_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_DATA_LEN,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u32),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x12,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
gpios_len),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_4_BYTE,
|
||||
.elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,
|
||||
.elem_size = sizeof(u32),
|
||||
.array_type = VAR_LEN_ARRAY,
|
||||
.tlv_type = 0x12,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
gpios),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x13,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
nm_modem_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x13,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
nm_modem),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x14,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
bdf_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x14,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
bdf_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x15,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
bdf_cache_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x15,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
bdf_cache_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x16,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
m3_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x16,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
m3_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x17,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
m3_cache_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x17,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
m3_cache_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x18,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
cal_filesys_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x18,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
cal_filesys_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x19,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
cal_cache_support_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x19,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
cal_cache_support),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x1A,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
cal_done_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x1A,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
cal_done),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x1B,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
mem_bucket_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_4_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u32),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x1B,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
mem_bucket),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_OPT_FLAG,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x1C,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
mem_cfg_mode_valid),
|
||||
},
|
||||
{
|
||||
.data_type = QMI_UNSIGNED_1_BYTE,
|
||||
.elem_len = 1,
|
||||
.elem_size = sizeof(u8),
|
||||
.array_type = NO_ARRAY,
|
||||
.tlv_type = 0x1C,
|
||||
.offset = offsetof(struct wlfw_host_cap_req_msg_v01,
|
||||
mem_cfg_mode),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -553,12 +553,38 @@ struct wlfw_mac_addr_resp_msg_v01 {
|
|||
#define WLFW_MAC_ADDR_RESP_MSG_V01_MAX_MSG_LEN 7
|
||||
extern struct qmi_elem_info wlfw_mac_addr_resp_msg_v01_ei[];
|
||||
|
||||
#define QMI_WLFW_MAX_NUM_GPIO_V01 32
|
||||
struct wlfw_host_cap_req_msg_v01 {
|
||||
u8 daemon_support_valid;
|
||||
u8 daemon_support;
|
||||
u32 daemon_support;
|
||||
u8 wake_msi_valid;
|
||||
u32 wake_msi;
|
||||
u8 gpios_valid;
|
||||
u32 gpios_len;
|
||||
u32 gpios[QMI_WLFW_MAX_NUM_GPIO_V01];
|
||||
u8 nm_modem_valid;
|
||||
u8 nm_modem;
|
||||
u8 bdf_support_valid;
|
||||
u8 bdf_support;
|
||||
u8 bdf_cache_support_valid;
|
||||
u8 bdf_cache_support;
|
||||
u8 m3_support_valid;
|
||||
u8 m3_support;
|
||||
u8 m3_cache_support_valid;
|
||||
u8 m3_cache_support;
|
||||
u8 cal_filesys_support_valid;
|
||||
u8 cal_filesys_support;
|
||||
u8 cal_cache_support_valid;
|
||||
u8 cal_cache_support;
|
||||
u8 cal_done_valid;
|
||||
u8 cal_done;
|
||||
u8 mem_bucket_valid;
|
||||
u32 mem_bucket;
|
||||
u8 mem_cfg_mode_valid;
|
||||
u8 mem_cfg_mode;
|
||||
};
|
||||
|
||||
#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 4
|
||||
#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 189
|
||||
extern struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[];
|
||||
|
||||
struct wlfw_host_cap_resp_msg_v01 {
|
||||
|
|
|
@ -1615,12 +1615,33 @@ static int ath10k_sdio_hif_diag_write_mem(struct ath10k *ar, u32 address,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_sdio_hif_swap_mailbox(struct ath10k *ar)
|
||||
{
|
||||
struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar);
|
||||
u32 addr, val;
|
||||
int ret = 0;
|
||||
|
||||
addr = host_interest_item_address(HI_ITEM(hi_acs_flags));
|
||||
|
||||
ret = ath10k_sdio_hif_diag_read32(ar, addr, &val);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "unable to read hi_acs_flags : %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val & HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_FW_ACK) {
|
||||
ath10k_dbg(ar, ATH10K_DBG_SDIO,
|
||||
"sdio mailbox swap service enabled\n");
|
||||
ar_sdio->swap_mbox = true;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* HIF start/stop */
|
||||
|
||||
static int ath10k_sdio_hif_start(struct ath10k *ar)
|
||||
{
|
||||
struct ath10k_sdio *ar_sdio = ath10k_sdio_priv(ar);
|
||||
u32 addr, val;
|
||||
int ret;
|
||||
|
||||
/* Sleep 20 ms before HIF interrupts are disabled.
|
||||
|
@ -1654,20 +1675,6 @@ static int ath10k_sdio_hif_start(struct ath10k *ar)
|
|||
if (ret)
|
||||
ath10k_warn(ar, "failed to enable sdio interrupts: %d\n", ret);
|
||||
|
||||
addr = host_interest_item_address(HI_ITEM(hi_acs_flags));
|
||||
|
||||
ret = ath10k_sdio_hif_diag_read32(ar, addr, &val);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "unable to read hi_acs_flags address: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val & HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_FW_ACK) {
|
||||
ath10k_dbg(ar, ATH10K_DBG_SDIO,
|
||||
"sdio mailbox swap service enabled\n");
|
||||
ar_sdio->swap_mbox = true;
|
||||
}
|
||||
|
||||
/* Enable sleep and then disable it again */
|
||||
ret = ath10k_sdio_hif_set_mbox_sleep(ar, true);
|
||||
if (ret)
|
||||
|
@ -1898,6 +1905,7 @@ static const struct ath10k_hif_ops ath10k_sdio_hif_ops = {
|
|||
.exchange_bmi_msg = ath10k_sdio_bmi_exchange_msg,
|
||||
.start = ath10k_sdio_hif_start,
|
||||
.stop = ath10k_sdio_hif_stop,
|
||||
.swap_mailbox = ath10k_sdio_hif_swap_mailbox,
|
||||
.map_service_to_pipe = ath10k_sdio_hif_map_service_to_pipe,
|
||||
.get_default_pipe = ath10k_sdio_hif_get_default_pipe,
|
||||
.send_complete_check = ath10k_sdio_hif_send_complete_check,
|
||||
|
@ -2088,7 +2096,10 @@ static struct sdio_driver ath10k_sdio_driver = {
|
|||
.id_table = ath10k_sdio_devices,
|
||||
.probe = ath10k_sdio_probe,
|
||||
.remove = ath10k_sdio_remove,
|
||||
.drv.pm = ATH10K_SDIO_PM_OPS,
|
||||
.drv = {
|
||||
.owner = THIS_MODULE,
|
||||
.pm = ATH10K_SDIO_PM_OPS,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init ath10k_sdio_init(void)
|
||||
|
|
|
@ -66,7 +66,7 @@ static void ath10k_snoc_pktlog_rx_cb(struct ath10k_ce_pipe *ce_state);
|
|||
|
||||
static const struct ath10k_snoc_drv_priv drv_priv = {
|
||||
.hw_rev = ATH10K_HW_WCN3990,
|
||||
.dma_mask = DMA_BIT_MASK(37),
|
||||
.dma_mask = DMA_BIT_MASK(35),
|
||||
.msa_size = 0x100000,
|
||||
};
|
||||
|
||||
|
@ -875,13 +875,11 @@ static void ath10k_snoc_tx_pipe_cleanup(struct ath10k_snoc_pipe *snoc_pipe)
|
|||
{
|
||||
struct ath10k_ce_pipe *ce_pipe;
|
||||
struct ath10k_ce_ring *ce_ring;
|
||||
struct ath10k_snoc *ar_snoc;
|
||||
struct sk_buff *skb;
|
||||
struct ath10k *ar;
|
||||
int i;
|
||||
|
||||
ar = snoc_pipe->hif_ce_state;
|
||||
ar_snoc = ath10k_snoc_priv(ar);
|
||||
ce_pipe = snoc_pipe->ce_hdl;
|
||||
ce_ring = ce_pipe->src_ring;
|
||||
|
||||
|
@ -1000,7 +998,16 @@ static int ath10k_snoc_wlan_enable(struct ath10k *ar)
|
|||
|
||||
static void ath10k_snoc_wlan_disable(struct ath10k *ar)
|
||||
{
|
||||
if (!test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
|
||||
struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
|
||||
|
||||
/* If both ATH10K_FLAG_CRASH_FLUSH and ATH10K_SNOC_FLAG_RECOVERY
|
||||
* flags are not set, it means that the driver has restarted
|
||||
* due to a crash inject via debugfs. In this case, the driver
|
||||
* needs to restart the firmware and hence send qmi wlan disable,
|
||||
* during the driver restart sequence.
|
||||
*/
|
||||
if (!test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags) ||
|
||||
!test_bit(ATH10K_SNOC_FLAG_RECOVERY, &ar_snoc->flags))
|
||||
ath10k_qmi_wlan_disable(ar);
|
||||
}
|
||||
|
||||
|
|
|
@ -494,6 +494,9 @@ static struct dentry *create_buf_file_handler(const char *filename,
|
|||
|
||||
buf_file = debugfs_create_file(filename, mode, parent, buf,
|
||||
&relay_file_operations);
|
||||
if (IS_ERR(buf_file))
|
||||
return NULL;
|
||||
|
||||
*is_global = 1;
|
||||
return buf_file;
|
||||
}
|
||||
|
|
|
@ -33,6 +33,9 @@ struct wmi_ops {
|
|||
struct wmi_mgmt_rx_ev_arg *arg);
|
||||
int (*pull_mgmt_tx_compl)(struct ath10k *ar, struct sk_buff *skb,
|
||||
struct wmi_tlv_mgmt_tx_compl_ev_arg *arg);
|
||||
int (*pull_mgmt_tx_bundle_compl)(
|
||||
struct ath10k *ar, struct sk_buff *skb,
|
||||
struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg *arg);
|
||||
int (*pull_ch_info)(struct ath10k *ar, struct sk_buff *skb,
|
||||
struct wmi_ch_info_ev_arg *arg);
|
||||
int (*pull_vdev_start)(struct ath10k *ar, struct sk_buff *skb,
|
||||
|
@ -279,6 +282,16 @@ ath10k_wmi_pull_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb,
|
|||
return ar->wmi.ops->pull_mgmt_tx_compl(ar, skb, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ath10k_wmi_pull_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb,
|
||||
struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg *arg)
|
||||
{
|
||||
if (!ar->wmi.ops->pull_mgmt_tx_bundle_compl)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return ar->wmi.ops->pull_mgmt_tx_bundle_compl(ar, skb, arg);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb,
|
||||
struct wmi_mgmt_rx_ev_arg *arg)
|
||||
|
|
|
@ -620,6 +620,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb)
|
|||
case WMI_TLV_MGMT_TX_COMPLETION_EVENTID:
|
||||
ath10k_wmi_event_mgmt_tx_compl(ar, skb);
|
||||
break;
|
||||
case WMI_TLV_MGMT_TX_BUNDLE_COMPLETION_EVENTID:
|
||||
ath10k_wmi_event_mgmt_tx_bundle_compl(ar, skb);
|
||||
break;
|
||||
default:
|
||||
ath10k_dbg(ar, ATH10K_DBG_WMI, "Unknown eventid: %d\n", id);
|
||||
break;
|
||||
|
@ -686,6 +689,65 @@ ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev(struct ath10k *ar, struct sk_buff *skb,
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct wmi_tlv_tx_bundle_compl_parse {
|
||||
const __le32 *num_reports;
|
||||
const __le32 *desc_ids;
|
||||
const __le32 *status;
|
||||
bool desc_ids_done;
|
||||
bool status_done;
|
||||
};
|
||||
|
||||
static int
|
||||
ath10k_wmi_tlv_mgmt_tx_bundle_compl_parse(struct ath10k *ar, u16 tag, u16 len,
|
||||
const void *ptr, void *data)
|
||||
{
|
||||
struct wmi_tlv_tx_bundle_compl_parse *bundle_tx_compl = data;
|
||||
|
||||
switch (tag) {
|
||||
case WMI_TLV_TAG_STRUCT_MGMT_TX_COMPL_BUNDLE_EVENT:
|
||||
bundle_tx_compl->num_reports = ptr;
|
||||
break;
|
||||
case WMI_TLV_TAG_ARRAY_UINT32:
|
||||
if (!bundle_tx_compl->desc_ids_done) {
|
||||
bundle_tx_compl->desc_ids_done = true;
|
||||
bundle_tx_compl->desc_ids = ptr;
|
||||
} else if (!bundle_tx_compl->status_done) {
|
||||
bundle_tx_compl->status_done = true;
|
||||
bundle_tx_compl->status = ptr;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_wmi_tlv_op_pull_mgmt_tx_bundle_compl_ev(
|
||||
struct ath10k *ar, struct sk_buff *skb,
|
||||
struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg *arg)
|
||||
{
|
||||
struct wmi_tlv_tx_bundle_compl_parse bundle_tx_compl = { };
|
||||
int ret;
|
||||
|
||||
ret = ath10k_wmi_tlv_iter(ar, skb->data, skb->len,
|
||||
ath10k_wmi_tlv_mgmt_tx_bundle_compl_parse,
|
||||
&bundle_tx_compl);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to parse tlv: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!bundle_tx_compl.num_reports || !bundle_tx_compl.desc_ids ||
|
||||
!bundle_tx_compl.status)
|
||||
return -EPROTO;
|
||||
|
||||
arg->num_reports = *bundle_tx_compl.num_reports;
|
||||
arg->desc_ids = bundle_tx_compl.desc_ids;
|
||||
arg->status = bundle_tx_compl.status;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_wmi_tlv_op_pull_mgmt_rx_ev(struct ath10k *ar,
|
||||
struct sk_buff *skb,
|
||||
struct wmi_mgmt_rx_ev_arg *arg)
|
||||
|
@ -1611,7 +1673,7 @@ static struct sk_buff *ath10k_wmi_tlv_op_gen_init(struct ath10k *ar)
|
|||
cfg->rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(0);
|
||||
cfg->vow_config = __cpu_to_le32(0);
|
||||
cfg->gtk_offload_max_vdev = __cpu_to_le32(2);
|
||||
cfg->num_msdu_desc = __cpu_to_le32(TARGET_TLV_NUM_MSDU_DESC);
|
||||
cfg->num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx);
|
||||
cfg->max_frag_entries = __cpu_to_le32(2);
|
||||
cfg->num_tdls_vdevs = __cpu_to_le32(TARGET_TLV_NUM_TDLS_VDEVS);
|
||||
cfg->num_tdls_conn_table_entries = __cpu_to_le32(0x20);
|
||||
|
@ -1626,7 +1688,7 @@ static struct sk_buff *ath10k_wmi_tlv_op_gen_init(struct ath10k *ar)
|
|||
cfg->num_ocb_vdevs = __cpu_to_le32(0);
|
||||
cfg->num_ocb_channels = __cpu_to_le32(0);
|
||||
cfg->num_ocb_schedules = __cpu_to_le32(0);
|
||||
cfg->host_capab = __cpu_to_le32(0);
|
||||
cfg->host_capab = __cpu_to_le32(WMI_TLV_FLAG_MGMT_BUNDLE_TX_COMPL);
|
||||
|
||||
ath10k_wmi_put_host_mem_chunks(ar, chunks);
|
||||
|
||||
|
@ -4093,6 +4155,7 @@ static const struct wmi_ops wmi_tlv_ops = {
|
|||
.pull_scan = ath10k_wmi_tlv_op_pull_scan_ev,
|
||||
.pull_mgmt_rx = ath10k_wmi_tlv_op_pull_mgmt_rx_ev,
|
||||
.pull_mgmt_tx_compl = ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev,
|
||||
.pull_mgmt_tx_bundle_compl = ath10k_wmi_tlv_op_pull_mgmt_tx_bundle_compl_ev,
|
||||
.pull_ch_info = ath10k_wmi_tlv_op_pull_ch_info_ev,
|
||||
.pull_vdev_start = ath10k_wmi_tlv_op_pull_vdev_start_ev,
|
||||
.pull_peer_kick = ath10k_wmi_tlv_op_pull_peer_kick_ev,
|
||||
|
|
|
@ -321,6 +321,7 @@ enum wmi_tlv_event_id {
|
|||
WMI_TLV_OFFLOAD_BCN_TX_STATUS_EVENTID,
|
||||
WMI_TLV_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID,
|
||||
WMI_TLV_MGMT_TX_COMPLETION_EVENTID,
|
||||
WMI_TLV_MGMT_TX_BUNDLE_COMPLETION_EVENTID,
|
||||
WMI_TLV_TX_DELBA_COMPLETE_EVENTID = WMI_TLV_EV(WMI_TLV_GRP_BA_NEG),
|
||||
WMI_TLV_TX_ADDBA_COMPLETE_EVENTID,
|
||||
WMI_TLV_BA_RSP_SSN_EVENTID,
|
||||
|
@ -1592,6 +1593,8 @@ struct chan_info_params {
|
|||
u32 mac_clk_mhz;
|
||||
};
|
||||
|
||||
#define WMI_TLV_FLAG_MGMT_BUNDLE_TX_COMPL BIT(9)
|
||||
|
||||
struct wmi_tlv_mgmt_tx_compl_ev {
|
||||
__le32 desc_id;
|
||||
__le32 status;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2005-2011 Atheros Communications Inc.
|
||||
* Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
|
||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
* 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
|
||||
|
@ -2346,7 +2346,7 @@ static int wmi_process_mgmt_tx_comp(struct ath10k *ar, u32 desc_id,
|
|||
|
||||
msdu = pkt_addr->vaddr;
|
||||
dma_unmap_single(ar->dev, pkt_addr->paddr,
|
||||
msdu->len, DMA_FROM_DEVICE);
|
||||
msdu->len, DMA_TO_DEVICE);
|
||||
info = IEEE80211_SKB_CB(msdu);
|
||||
|
||||
if (status)
|
||||
|
@ -2383,6 +2383,29 @@ int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int ath10k_wmi_event_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb)
|
||||
{
|
||||
struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg arg;
|
||||
u32 num_reports;
|
||||
int i, ret;
|
||||
|
||||
ret = ath10k_wmi_pull_mgmt_tx_bundle_compl(ar, skb, &arg);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to parse bundle mgmt compl event: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
num_reports = __le32_to_cpu(arg.num_reports);
|
||||
|
||||
for (i = 0; i < num_reports; i++)
|
||||
wmi_process_mgmt_tx_comp(ar, __le32_to_cpu(arg.desc_ids[i]),
|
||||
__le32_to_cpu(arg.status[i]));
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv event bundle mgmt tx completion\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
|
||||
{
|
||||
struct wmi_mgmt_rx_ev_arg arg = {};
|
||||
|
|
|
@ -2075,6 +2075,8 @@ enum wmi_channel_change_cause {
|
|||
#define WMI_HT_CAP_MPDU_DENSITY 0x0700 /* MPDU Density */
|
||||
#define WMI_HT_CAP_MPDU_DENSITY_MASK_SHIFT 8
|
||||
#define WMI_HT_CAP_HT40_SGI 0x0800
|
||||
#define WMI_HT_CAP_RX_LDPC 0x1000 /* LDPC RX support */
|
||||
#define WMI_HT_CAP_TX_LDPC 0x2000 /* LDPC TX support */
|
||||
|
||||
#define WMI_HT_CAP_DEFAULT_ALL (WMI_HT_CAP_ENABLED | \
|
||||
WMI_HT_CAP_HT20_SGI | \
|
||||
|
@ -6688,6 +6690,12 @@ struct wmi_tlv_mgmt_tx_compl_ev_arg {
|
|||
__le32 pdev_id;
|
||||
};
|
||||
|
||||
struct wmi_tlv_mgmt_tx_bundle_compl_ev_arg {
|
||||
__le32 num_reports;
|
||||
const __le32 *desc_ids;
|
||||
const __le32 *status;
|
||||
};
|
||||
|
||||
struct wmi_mgmt_rx_ev_arg {
|
||||
__le32 channel;
|
||||
__le32 snr;
|
||||
|
@ -7244,6 +7252,7 @@ int ath10k_wmi_start_scan_verify(const struct wmi_start_scan_arg *arg);
|
|||
int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb);
|
||||
int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb);
|
||||
int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb);
|
||||
int ath10k_wmi_event_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb);
|
||||
void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb);
|
||||
void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb);
|
||||
int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb);
|
||||
|
|
|
@ -776,10 +776,8 @@ int ath6kl_wmi_set_roam_lrssi_cmd(struct wmi *wmi, u8 lrssi)
|
|||
cmd->info.params.roam_rssi_floor = DEF_LRSSI_ROAM_FLOOR;
|
||||
cmd->roam_ctrl = WMI_SET_LRSSI_SCAN_PARAMS;
|
||||
|
||||
ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_ROAM_CTRL_CMDID,
|
||||
return ath6kl_wmi_cmd_send(wmi, 0, skb, WMI_SET_ROAM_CTRL_CMDID,
|
||||
NO_SYNC_WMIFLAG);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ath6kl_wmi_force_roam_cmd(struct wmi *wmi, const u8 *bssid)
|
||||
|
|
|
@ -3457,9 +3457,9 @@ static u32 ar9003_dump_cal_data(struct ath_hw *ah, char *buf, u32 len, u32 size,
|
|||
if (!((pBase->txrxMask >> i) & 1))
|
||||
continue;
|
||||
|
||||
len += snprintf(buf + len, size - len, "Chain %d\n", i);
|
||||
len += scnprintf(buf + len, size - len, "Chain %d\n", i);
|
||||
|
||||
len += snprintf(buf + len, size - len,
|
||||
len += scnprintf(buf + len, size - len,
|
||||
"Freq\t ref\tvolt\ttemp\tnf_cal\tnf_pow\trx_temp\n");
|
||||
|
||||
for (j = 0; j < cal_pier_nr; j++) {
|
||||
|
@ -3471,10 +3471,10 @@ static u32 ar9003_dump_cal_data(struct ath_hw *ah, char *buf, u32 len, u32 size,
|
|||
freq = 4800 + eep->calFreqPier5G[j] * 5;
|
||||
}
|
||||
|
||||
len += snprintf(buf + len, size - len,
|
||||
len += scnprintf(buf + len, size - len,
|
||||
"%d\t", freq);
|
||||
|
||||
len += snprintf(buf + len, size - len,
|
||||
len += scnprintf(buf + len, size - len,
|
||||
"%d\t%d\t%d\t%d\t%d\t%d\n",
|
||||
cal_pier->refPower,
|
||||
cal_pier->voltMeas,
|
||||
|
@ -3505,12 +3505,12 @@ static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
|
|||
len += scnprintf(buf + len, size - len, "Calibration data\n");
|
||||
len = ar9003_dump_cal_data(ah, buf, len, size, true);
|
||||
|
||||
len += snprintf(buf + len, size - len,
|
||||
len += scnprintf(buf + len, size - len,
|
||||
"%20s :\n", "5GHz modal Header");
|
||||
len = ar9003_dump_modal_eeprom(buf, len, size,
|
||||
&eep->modalHeader5G);
|
||||
|
||||
len += snprintf(buf + len, size - len, "Calibration data\n");
|
||||
len += scnprintf(buf + len, size - len, "Calibration data\n");
|
||||
len = ar9003_dump_cal_data(ah, buf, len, size, false);
|
||||
|
||||
goto out;
|
||||
|
|
|
@ -1039,6 +1039,9 @@ static struct dentry *create_buf_file_handler(const char *filename,
|
|||
|
||||
buf_file = debugfs_create_file(filename, mode, parent, buf,
|
||||
&relay_file_operations);
|
||||
if (IS_ERR(buf_file))
|
||||
return NULL;
|
||||
|
||||
*is_global = 1;
|
||||
return buf_file;
|
||||
}
|
||||
|
|
|
@ -574,12 +574,12 @@ void ath9k_tx_failed_tasklet(unsigned long data)
|
|||
{
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
|
||||
|
||||
spin_lock_bh(&priv->tx.tx_lock);
|
||||
spin_lock(&priv->tx.tx_lock);
|
||||
if (priv->tx.flags & ATH9K_HTC_OP_TX_DRAIN) {
|
||||
spin_unlock_bh(&priv->tx.tx_lock);
|
||||
spin_unlock(&priv->tx.tx_lock);
|
||||
return;
|
||||
}
|
||||
spin_unlock_bh(&priv->tx.tx_lock);
|
||||
spin_unlock(&priv->tx.tx_lock);
|
||||
|
||||
ath9k_htc_tx_drainq(priv, &priv->tx.tx_failed);
|
||||
}
|
||||
|
|
|
@ -636,15 +636,15 @@ static int ath9k_of_init(struct ath_softc *sc)
|
|||
ret = ath9k_eeprom_request(sc, eeprom_name);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ah->ah_flags &= ~AH_USE_EEPROM;
|
||||
ah->ah_flags |= AH_NO_EEP_SWAP;
|
||||
}
|
||||
|
||||
mac = of_get_mac_address(np);
|
||||
if (mac)
|
||||
ether_addr_copy(common->macaddr, mac);
|
||||
|
||||
ah->ah_flags &= ~AH_USE_EEPROM;
|
||||
ah->ah_flags |= AH_NO_EEP_SWAP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -185,7 +185,9 @@ enum CountryCode {
|
|||
CTRY_UKRAINE = 804,
|
||||
CTRY_UNITED_KINGDOM = 826,
|
||||
CTRY_UNITED_STATES = 840,
|
||||
CTRY_UNITED_STATES2 = 841,
|
||||
CTRY_UNITED_STATES_FCC49 = 842,
|
||||
CTRY_UNITED_STATES3 = 843,
|
||||
CTRY_URUGUAY = 858,
|
||||
CTRY_UZBEKISTAN = 860,
|
||||
CTRY_VENEZUELA = 862,
|
||||
|
|
|
@ -483,6 +483,8 @@ static struct country_code_to_enum_rd allCountries[] = {
|
|||
{CTRY_UAE, NULL1_WORLD, "AE"},
|
||||
{CTRY_UNITED_KINGDOM, ETSI1_WORLD, "GB"},
|
||||
{CTRY_UNITED_STATES, FCC3_FCCA, "US"},
|
||||
{CTRY_UNITED_STATES2, FCC3_FCCA, "US"},
|
||||
{CTRY_UNITED_STATES3, FCC3_FCCA, "US"},
|
||||
/* This "PS" is for US public safety actually... to support this we
|
||||
* would need to assign new special alpha2 to CRDA db as with the world
|
||||
* regdomain and use another alpha2 */
|
||||
|
|
Loading…
Reference in New Issue