Merge tag 'wireless-drivers-next-2020-05-07' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next
Kalle Valo says: ==================== wireless-drivers-next patches for v5.8 First set of patches for v5.8. Changes all over, ath10k apparently seeing most new features this time. rtw88 also had lots of changes due to preparation for new hardware support. In this pull request there's also a new macro to include/linux/iopoll: read_poll_timeout_atomic(). This is needed by rtw88 for atomic polling. Major changes: ath11k * add debugfs file for testing ADDBA and DELBA * add 802.11 encapsulation offload on hardware support * add htt_peer_stats_reset debugfs file ath10k * enable VHT160 and VHT80+80 modes * enable radar detection in secondary segment * sdio: disable TX complete indication to improve throughput * sdio: decrease power consumption * sdio: add HTT TX bundle support to increase throughput * sdio: add rx bitrate reporting ath9k * improvements to AR9002 calibration logic carl9170 * remove buggy P2P_GO support p54usb * add support for AirVasT USB stick rtw88 * add support for antenna configuration ti wlcore * add support for AES_CMAC cipher iwlwifi * support for a few new FW API versions * new hw configs ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
* Copyright(c) 2018 - 2020 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@@ -18,7 +18,7 @@
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2018 - 2019 Intel Corporation
|
||||
* Copyright(c) 2018 - 2020 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -84,32 +84,35 @@ iwl_pcie_ctxt_info_dbg_enable(struct iwl_trans *trans,
|
||||
|
||||
fw_mon_cfg = &trans->dbg.fw_mon_cfg[alloc_id];
|
||||
|
||||
if (le32_to_cpu(fw_mon_cfg->buf_location) ==
|
||||
IWL_FW_INI_LOCATION_SRAM_PATH) {
|
||||
switch (le32_to_cpu(fw_mon_cfg->buf_location)) {
|
||||
case IWL_FW_INI_LOCATION_SRAM_PATH:
|
||||
dbg_flags |= IWL_PRPH_SCRATCH_EDBG_DEST_INTERNAL;
|
||||
|
||||
IWL_DEBUG_FW(trans,
|
||||
"WRT: Applying SMEM buffer destination\n");
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (le32_to_cpu(fw_mon_cfg->buf_location) ==
|
||||
IWL_FW_INI_LOCATION_DRAM_PATH &&
|
||||
trans->dbg.fw_mon_ini[alloc_id].num_frags) {
|
||||
struct iwl_dram_data *frag =
|
||||
&trans->dbg.fw_mon_ini[alloc_id].frags[0];
|
||||
|
||||
dbg_flags |= IWL_PRPH_SCRATCH_EDBG_DEST_DRAM;
|
||||
"WRT: Applying SMEM buffer destination\n");
|
||||
break;
|
||||
|
||||
case IWL_FW_INI_LOCATION_NPK_PATH:
|
||||
dbg_flags |= IWL_PRPH_SCRATCH_EDBG_DEST_TB22DTF;
|
||||
IWL_DEBUG_FW(trans,
|
||||
"WRT: Applying DRAM destination (alloc_id=%u)\n",
|
||||
alloc_id);
|
||||
"WRT: Applying NPK buffer destination\n");
|
||||
break;
|
||||
|
||||
dbg_cfg->hwm_base_addr = cpu_to_le64(frag->physical);
|
||||
dbg_cfg->hwm_size = cpu_to_le32(frag->size);
|
||||
case IWL_FW_INI_LOCATION_DRAM_PATH:
|
||||
if (trans->dbg.fw_mon_ini[alloc_id].num_frags) {
|
||||
struct iwl_dram_data *frag =
|
||||
&trans->dbg.fw_mon_ini[alloc_id].frags[0];
|
||||
dbg_flags |= IWL_PRPH_SCRATCH_EDBG_DEST_DRAM;
|
||||
dbg_cfg->hwm_base_addr = cpu_to_le64(frag->physical);
|
||||
dbg_cfg->hwm_size = cpu_to_le32(frag->size);
|
||||
IWL_DEBUG_FW(trans,
|
||||
"WRT: Applying DRAM destination (alloc_id=%u, num_frags=%u)\n",
|
||||
alloc_id,
|
||||
trans->dbg.fw_mon_ini[alloc_id].num_frags);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(trans, "WRT: Invalid buffer destination\n");
|
||||
}
|
||||
|
||||
out:
|
||||
if (dbg_flags)
|
||||
*control_flags |= IWL_PRPH_SCRATCH_EARLY_DEBUG_EN | dbg_flags;
|
||||
|
@@ -93,6 +93,21 @@ static void *iwl_pcie_ctxt_info_dma_alloc_coherent(struct iwl_trans *trans,
|
||||
return _iwl_pcie_ctxt_info_dma_alloc_coherent(trans, size, phys, 0);
|
||||
}
|
||||
|
||||
static int iwl_pcie_ctxt_info_alloc_dma(struct iwl_trans *trans,
|
||||
const struct fw_desc *sec,
|
||||
struct iwl_dram_data *dram)
|
||||
{
|
||||
dram->block = iwl_pcie_ctxt_info_dma_alloc_coherent(trans, sec->len,
|
||||
&dram->physical);
|
||||
if (!dram->block)
|
||||
return -ENOMEM;
|
||||
|
||||
dram->size = sec->len;
|
||||
memcpy(dram->block, sec->data, sec->len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void iwl_pcie_ctxt_info_free_paging(struct iwl_trans *trans)
|
||||
{
|
||||
struct iwl_self_init_dram *dram = &trans->init_dram;
|
||||
|
@@ -524,8 +524,10 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
/* Qu devices */
|
||||
{IWL_PCI_DEVICE(0x02F0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x06F0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x34F0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, PCI_ANY_ID, iwl_qu_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x34F0, PCI_ANY_ID, iwl_qu_medium_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x3DF0, PCI_ANY_ID, iwl_qu_medium_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0x4DF0, PCI_ANY_ID, iwl_qu_medium_latency_trans_cfg)},
|
||||
|
||||
{IWL_PCI_DEVICE(0x43F0, PCI_ANY_ID, iwl_qu_long_latency_trans_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA0F0, PCI_ANY_ID, iwl_qu_long_latency_trans_cfg)},
|
||||
@@ -539,12 +541,17 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0x2725, 0x0310, iwlax210_2ax_cfg_ty_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2725, 0x0510, iwlax210_2ax_cfg_ty_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2725, 0x0A10, iwlax210_2ax_cfg_ty_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2725, 0x00B0, iwlax411_2ax_cfg_so_gf4_a0)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0510, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2725, 0x00B0, iwlax411_2ax_cfg_sosnj_gf4_a0)},
|
||||
{IWL_PCI_DEVICE(0x2726, 0x0090, iwlax211_cfg_snj_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x2726, 0x00B0, iwlax411_2ax_cfg_sosnj_gf4_a0)},
|
||||
{IWL_PCI_DEVICE(0x2726, 0x0510, iwlax211_cfg_snj_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0090, iwlax211_2ax_cfg_so_gf_a0_long)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x00B0, iwlax411_2ax_cfg_so_gf4_a0_long)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0310, iwlax211_2ax_cfg_so_gf_a0_long)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0510, iwlax211_2ax_cfg_so_gf_a0_long)},
|
||||
{IWL_PCI_DEVICE(0x7A70, 0x0A10, iwlax211_2ax_cfg_so_gf_a0_long)},
|
||||
{IWL_PCI_DEVICE(0x7AF0, 0x0090, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7AF0, 0x00B0, iwlax411_2ax_cfg_so_gf4_a0)},
|
||||
{IWL_PCI_DEVICE(0x7AF0, 0x0310, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7AF0, 0x0510, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
{IWL_PCI_DEVICE(0x7AF0, 0x0A10, iwlax211_2ax_cfg_so_gf_a0)},
|
||||
@@ -657,6 +664,19 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
IWL_DEV_INFO(0x3DF0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x3DF0, 0x4244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
|
||||
IWL_DEV_INFO(0x4DF0, 0x0044, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x0070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x0074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x0078, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x007C, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x0244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x0310, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x4DF0, 0x4244, iwl_ax101_cfg_qu_hr, NULL),
|
||||
|
||||
IWL_DEV_INFO(0x2720, 0x0000, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0040, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
IWL_DEV_INFO(0x2720, 0x0044, iwl22000_2ax_cfg_qnj_hr_b0, NULL),
|
||||
|
@@ -792,22 +792,6 @@ static inline int iwl_pcie_get_num_sections(const struct fw_img *fw,
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline int iwl_pcie_ctxt_info_alloc_dma(struct iwl_trans *trans,
|
||||
const struct fw_desc *sec,
|
||||
struct iwl_dram_data *dram)
|
||||
{
|
||||
dram->block = dma_alloc_coherent(trans->dev, sec->len,
|
||||
&dram->physical,
|
||||
GFP_KERNEL);
|
||||
if (!dram->block)
|
||||
return -ENOMEM;
|
||||
|
||||
dram->size = sec->len;
|
||||
memcpy(dram->block, sec->data, sec->len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iwl_pcie_ctxt_info_free_fw_img(struct iwl_trans *trans)
|
||||
{
|
||||
struct iwl_self_init_dram *dram = &trans->init_dram;
|
||||
|
@@ -70,6 +70,7 @@
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include "iwl-drv.h"
|
||||
#include "iwl-trans.h"
|
||||
@@ -1018,21 +1019,8 @@ static int iwl_pcie_load_given_ucode(struct iwl_trans *trans,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* supported for 7000 only for the moment */
|
||||
if (iwlwifi_mod_params.fw_monitor &&
|
||||
trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_7000) {
|
||||
struct iwl_dram_data *fw_mon = &trans->dbg.fw_mon;
|
||||
|
||||
iwl_pcie_alloc_fw_monitor(trans, 0);
|
||||
if (fw_mon->size) {
|
||||
iwl_write_prph(trans, MON_BUFF_BASE_ADDR,
|
||||
fw_mon->physical >> 4);
|
||||
iwl_write_prph(trans, MON_BUFF_END_ADDR,
|
||||
(fw_mon->physical + fw_mon->size) >> 4);
|
||||
}
|
||||
} else if (iwl_pcie_dbg_on(trans)) {
|
||||
if (iwl_pcie_dbg_on(trans))
|
||||
iwl_pcie_apply_destination(trans);
|
||||
}
|
||||
|
||||
iwl_enable_interrupts(trans);
|
||||
|
||||
@@ -2544,44 +2532,95 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \
|
||||
.llseek = generic_file_llseek, \
|
||||
};
|
||||
|
||||
static ssize_t iwl_dbgfs_tx_queue_read(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
struct iwl_dbgfs_tx_queue_priv {
|
||||
struct iwl_trans *trans;
|
||||
};
|
||||
|
||||
struct iwl_dbgfs_tx_queue_state {
|
||||
loff_t pos;
|
||||
};
|
||||
|
||||
static void *iwl_dbgfs_tx_queue_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
{
|
||||
struct iwl_trans *trans = file->private_data;
|
||||
struct iwl_dbgfs_tx_queue_priv *priv = seq->private;
|
||||
struct iwl_dbgfs_tx_queue_state *state;
|
||||
|
||||
if (*pos >= priv->trans->trans_cfg->base_params->num_of_queues)
|
||||
return NULL;
|
||||
|
||||
state = kmalloc(sizeof(*state), GFP_KERNEL);
|
||||
if (!state)
|
||||
return NULL;
|
||||
state->pos = *pos;
|
||||
return state;
|
||||
}
|
||||
|
||||
static void *iwl_dbgfs_tx_queue_seq_next(struct seq_file *seq,
|
||||
void *v, loff_t *pos)
|
||||
{
|
||||
struct iwl_dbgfs_tx_queue_priv *priv = seq->private;
|
||||
struct iwl_dbgfs_tx_queue_state *state = v;
|
||||
|
||||
*pos = ++state->pos;
|
||||
|
||||
if (*pos >= priv->trans->trans_cfg->base_params->num_of_queues)
|
||||
return NULL;
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
static void iwl_dbgfs_tx_queue_seq_stop(struct seq_file *seq, void *v)
|
||||
{
|
||||
kfree(v);
|
||||
}
|
||||
|
||||
static int iwl_dbgfs_tx_queue_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct iwl_dbgfs_tx_queue_priv *priv = seq->private;
|
||||
struct iwl_dbgfs_tx_queue_state *state = v;
|
||||
struct iwl_trans *trans = priv->trans;
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_txq *txq;
|
||||
char *buf;
|
||||
int pos = 0;
|
||||
int cnt;
|
||||
int ret;
|
||||
size_t bufsz;
|
||||
struct iwl_txq *txq = trans_pcie->txq[state->pos];
|
||||
|
||||
bufsz = sizeof(char) * 75 *
|
||||
trans->trans_cfg->base_params->num_of_queues;
|
||||
seq_printf(seq, "hwq %.3u: used=%d stopped=%d ",
|
||||
(unsigned int)state->pos,
|
||||
!!test_bit(state->pos, trans_pcie->queue_used),
|
||||
!!test_bit(state->pos, trans_pcie->queue_stopped));
|
||||
if (txq)
|
||||
seq_printf(seq,
|
||||
"read=%u write=%u need_update=%d frozen=%d n_window=%d ampdu=%d",
|
||||
txq->read_ptr, txq->write_ptr,
|
||||
txq->need_update, txq->frozen,
|
||||
txq->n_window, txq->ampdu);
|
||||
else
|
||||
seq_puts(seq, "(unallocated)");
|
||||
|
||||
if (!trans_pcie->txq_memory)
|
||||
return -EAGAIN;
|
||||
if (state->pos == trans_pcie->cmd_queue)
|
||||
seq_puts(seq, " (HCMD)");
|
||||
seq_puts(seq, "\n");
|
||||
|
||||
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct seq_operations iwl_dbgfs_tx_queue_seq_ops = {
|
||||
.start = iwl_dbgfs_tx_queue_seq_start,
|
||||
.next = iwl_dbgfs_tx_queue_seq_next,
|
||||
.stop = iwl_dbgfs_tx_queue_seq_stop,
|
||||
.show = iwl_dbgfs_tx_queue_seq_show,
|
||||
};
|
||||
|
||||
static int iwl_dbgfs_tx_queue_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
struct iwl_dbgfs_tx_queue_priv *priv;
|
||||
|
||||
priv = __seq_open_private(filp, &iwl_dbgfs_tx_queue_seq_ops,
|
||||
sizeof(*priv));
|
||||
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
for (cnt = 0;
|
||||
cnt < trans->trans_cfg->base_params->num_of_queues;
|
||||
cnt++) {
|
||||
txq = trans_pcie->txq[cnt];
|
||||
pos += scnprintf(buf + pos, bufsz - pos,
|
||||
"hwq %.2d: read=%u write=%u use=%d stop=%d need_update=%d frozen=%d%s\n",
|
||||
cnt, txq->read_ptr, txq->write_ptr,
|
||||
!!test_bit(cnt, trans_pcie->queue_used),
|
||||
!!test_bit(cnt, trans_pcie->queue_stopped),
|
||||
txq->need_update, txq->frozen,
|
||||
(cnt == trans_pcie->cmd_queue ? " HCMD" : ""));
|
||||
}
|
||||
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||
kfree(buf);
|
||||
return ret;
|
||||
priv->trans = inode->i_private;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t iwl_dbgfs_rx_queue_read(struct file *file,
|
||||
@@ -2914,9 +2953,15 @@ static ssize_t iwl_dbgfs_monitor_data_read(struct file *file,
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(interrupt);
|
||||
DEBUGFS_READ_FILE_OPS(fh_reg);
|
||||
DEBUGFS_READ_FILE_OPS(rx_queue);
|
||||
DEBUGFS_READ_FILE_OPS(tx_queue);
|
||||
DEBUGFS_WRITE_FILE_OPS(csr);
|
||||
DEBUGFS_READ_WRITE_FILE_OPS(rfkill);
|
||||
static const struct file_operations iwl_dbgfs_tx_queue_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = iwl_dbgfs_tx_queue_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release_private,
|
||||
};
|
||||
|
||||
static const struct file_operations iwl_dbgfs_monitor_data_ops = {
|
||||
.read = iwl_dbgfs_monitor_data_read,
|
||||
|
@@ -90,9 +90,7 @@ static void iwl_pcie_gen2_update_byte_tbl(struct iwl_trans_pcie *trans_pcie,
|
||||
struct iwl_txq *txq, u16 byte_cnt,
|
||||
int num_tbs)
|
||||
{
|
||||
struct iwlagn_scd_bc_tbl *scd_bc_tbl = txq->bc_tbl.addr;
|
||||
struct iwl_trans *trans = iwl_trans_pcie_get_trans(trans_pcie);
|
||||
struct iwl_gen3_bc_tbl *scd_bc_tbl_gen3 = txq->bc_tbl.addr;
|
||||
int idx = iwl_pcie_get_cmd_index(txq, txq->write_ptr);
|
||||
u8 filled_tfd_size, num_fetch_chunks;
|
||||
u16 len = byte_cnt;
|
||||
@@ -102,7 +100,7 @@ static void iwl_pcie_gen2_update_byte_tbl(struct iwl_trans_pcie *trans_pcie,
|
||||
return;
|
||||
|
||||
filled_tfd_size = offsetof(struct iwl_tfh_tfd, tbs) +
|
||||
num_tbs * sizeof(struct iwl_tfh_tb);
|
||||
num_tbs * sizeof(struct iwl_tfh_tb);
|
||||
/*
|
||||
* filled_tfd_size contains the number of filled bytes in the TFD.
|
||||
* Dividing it by 64 will give the number of chunks to fetch
|
||||
@@ -114,12 +112,16 @@ static void iwl_pcie_gen2_update_byte_tbl(struct iwl_trans_pcie *trans_pcie,
|
||||
num_fetch_chunks = DIV_ROUND_UP(filled_tfd_size, 64) - 1;
|
||||
|
||||
if (trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210) {
|
||||
struct iwl_gen3_bc_tbl *scd_bc_tbl_gen3 = txq->bc_tbl.addr;
|
||||
|
||||
/* Starting from AX210, the HW expects bytes */
|
||||
WARN_ON(trans_pcie->bc_table_dword);
|
||||
WARN_ON(len > 0x3FFF);
|
||||
bc_ent = cpu_to_le16(len | (num_fetch_chunks << 14));
|
||||
scd_bc_tbl_gen3->tfd_offset[idx] = bc_ent;
|
||||
} else {
|
||||
struct iwlagn_scd_bc_tbl *scd_bc_tbl = txq->bc_tbl.addr;
|
||||
|
||||
/* Before AX210, the HW expects DW */
|
||||
WARN_ON(!trans_pcie->bc_table_dword);
|
||||
len = DIV_ROUND_UP(len, 4);
|
||||
|
Reference in New Issue
Block a user